{"_id":"@baobox/skill-builder-bff","_rev":"9-da38441e1263f0de9438eb5590e92f13","name":"@baobox/skill-builder-bff","dist-tags":{"latest":"0.8.1"},"versions":{"0.1.0":{"name":"@baobox/skill-builder-bff","version":"0.1.0","keywords":["baobox","skill-studio","bff","hono","backend-for-frontend"],"author":{"name":"Bright Qi","email":"bright@adoptive.co"},"license":"MIT","_id":"@baobox/skill-builder-bff@0.1.0","maintainers":[{"name":"brightqi","email":"brightq@gmail.com"}],"homepage":"https://github.com/baobox-ai/baobox-skill-studio/tree/main/packages/bff#readme","bugs":{"url":"https://github.com/baobox-ai/baobox-skill-studio/issues"},"dist":{"shasum":"4c577e4fef45d284937bb0e8df1948dfb6732c03","tarball":"https://registry.npmjs.org/@baobox/skill-builder-bff/-/skill-builder-bff-0.1.0.tgz","fileCount":12,"integrity":"sha512-r7vzz0qnjAWTZcZmWBsi7ffrgwniccYLXSiv4y/cQ5ETVdQq5Jjf9o/x5iTWTtTbOJt2F41GzvFlE7cBdut2RA==","signatures":[{"sig":"MEYCIQCYuyjbYOb4s5mfAhYszi2j1bVP3hbaDpp44J+zfTHHQAIhAPXyH4eIJiR6mGsi7lgvwzao9DwgvpRHIkV6SDiErGLO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@baobox%2fskill-builder-bff@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":30096},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"42a912e59fb3f7410872d13ed2ff8271f996fe69","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run clean && npm run build && npm test"},"_npmUser":{"name":"brightqi","email":"brightq@gmail.com"},"repository":{"url":"git+https://github.com/baobox-ai/baobox-skill-studio.git","type":"git","directory":"packages/bff"},"_npmVersion":"10.8.2","description":"Mountable Hono BFF router for the BaoBox Skill Studio — wraps @baobox/sdk (adminSecret, tenant-scoped) and serves the @baobox/skill-builder-contract surface.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@baobox/sdk":"^0.14.0","@baobox/skill-builder-contract":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","vitest":"^2.1.4","typescript":"^5.5.4","@types/node":"^20.14.0"},"peerDependencies":{"hono":">=4"},"_npmOperationalInternal":{"tmp":"tmp/skill-builder-bff_0.1.0_1780740282819_0.9206710379117906","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@baobox/skill-builder-bff","version":"0.2.0","keywords":["baobox","skill-studio","bff","hono","backend-for-frontend"],"author":{"name":"Bright Qi","email":"bright@adoptive.co"},"license":"MIT","_id":"@baobox/skill-builder-bff@0.2.0","maintainers":[{"name":"brightqi","email":"brightq@gmail.com"}],"homepage":"https://github.com/baobox-ai/baobox-skill-studio/tree/main/packages/bff#readme","bugs":{"url":"https://github.com/baobox-ai/baobox-skill-studio/issues"},"dist":{"shasum":"c9acef8972266104d9d07e993a06939ea0217d8c","tarball":"https://registry.npmjs.org/@baobox/skill-builder-bff/-/skill-builder-bff-0.2.0.tgz","fileCount":12,"integrity":"sha512-RiwE4Pc08FI8L1wiDgMni2i1JY7E5d5RsAXN4ChzRPundZTF0KkuTb+pdO7bzuxiKDALhmwN19zM71kwEaOVag==","signatures":[{"sig":"MEUCIQDANC3Kvz4G2KA47XKib9N2geBLn9H2MvcKfzA4wbhvzgIgcWcPJcN3PJKk6UiA3ZKWc6SiUiyyrtMRv+pKMrhRS/4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@baobox%2fskill-builder-bff@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":34066},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f94e8d4cda3e0dd49667d94af198dfef3b4c1092","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run clean && npm run build && npm test"},"_npmUser":{"name":"brightqi","email":"brightq@gmail.com"},"repository":{"url":"git+https://github.com/baobox-ai/baobox-skill-studio.git","type":"git","directory":"packages/bff"},"_npmVersion":"10.8.2","description":"Mountable Hono BFF router for the BaoBox Skill Studio — wraps @baobox/sdk (adminSecret, tenant-scoped) and serves the @baobox/skill-builder-contract surface.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@baobox/sdk":"^0.15.0","@baobox/skill-builder-contract":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","vitest":"^2.1.4","typescript":"^5.5.4","@types/node":"^20.14.0"},"peerDependencies":{"hono":">=4"},"_npmOperationalInternal":{"tmp":"tmp/skill-builder-bff_0.2.0_1780750027229_0.9971784868132663","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@baobox/skill-builder-bff","version":"0.3.0","keywords":["baobox","skill-studio","bff","hono","backend-for-frontend"],"author":{"name":"Bright Qi","email":"bright@adoptive.co"},"license":"MIT","_id":"@baobox/skill-builder-bff@0.3.0","maintainers":[{"name":"brightqi","email":"brightq@gmail.com"}],"homepage":"https://github.com/baobox-ai/baobox-skill-studio/tree/main/packages/bff#readme","bugs":{"url":"https://github.com/baobox-ai/baobox-skill-studio/issues"},"dist":{"shasum":"1b637684dccd0e355a401819197058bae34f6557","tarball":"https://registry.npmjs.org/@baobox/skill-builder-bff/-/skill-builder-bff-0.3.0.tgz","fileCount":12,"integrity":"sha512-cTBzIKxOc8aeimenJIMm0G+3GSM5/qM08Mt62IqqDvPc6o0TXkqALof8V6grJ17wLpFnpqkgrhrrmene9ehQaQ==","signatures":[{"sig":"MEQCIFFP5YsBNQ3aoVJYVFdWpV4SvoMw+3WtZWhp3LrJFR25AiBCv6ZEgwsn6JHs0B6xk5H7sQSP5/PxCMnC+r0BO7+FUA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@baobox%2fskill-builder-bff@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":73934},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"ce7f939cf7bf6a15ea782e284f551465ec6e1b5f","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run clean && npm run build && npm test"},"_npmUser":{"name":"brightqi","email":"brightq@gmail.com"},"repository":{"url":"git+https://github.com/baobox-ai/baobox-skill-studio.git","type":"git","directory":"packages/bff"},"_npmVersion":"10.8.2","description":"Mountable Hono BFF router for the BaoBox Skill Studio — wraps @baobox/sdk (per-tenant apiKey, tenant-scoped) and serves the @baobox/skill-builder-contract authoring surface.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@baobox/sdk":"^0.16.0","@baobox/skill-builder-contract":"^0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","vitest":"^2.1.4","typescript":"^5.5.4","@types/node":"^20.14.0"},"peerDependencies":{"hono":">=4"},"_npmOperationalInternal":{"tmp":"tmp/skill-builder-bff_0.3.0_1780820758868_0.8838077576071957","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@baobox/skill-builder-bff","version":"0.4.0","keywords":["baobox","skill-studio","bff","hono","backend-for-frontend"],"author":{"name":"Bright Qi","email":"bright@adoptive.co"},"license":"MIT","_id":"@baobox/skill-builder-bff@0.4.0","maintainers":[{"name":"brightqi","email":"brightq@gmail.com"}],"homepage":"https://github.com/baobox-ai/baobox-skill-studio/tree/main/packages/bff#readme","bugs":{"url":"https://github.com/baobox-ai/baobox-skill-studio/issues"},"dist":{"shasum":"3fdca632a50c2dc2d10802d9f3c2b39a80b0b046","tarball":"https://registry.npmjs.org/@baobox/skill-builder-bff/-/skill-builder-bff-0.4.0.tgz","fileCount":12,"integrity":"sha512-919UtnckWIYXXMuDg0vZdLGRy7dOJag1BhacQRsuNQ9ca8ByQ/C+gOVo7kgqZA1Y0k0tNRWUssox1eZlUafGZg==","signatures":[{"sig":"MEYCIQCBAJOeKECtyGMtke++EQpEQ3Enyh4UAU5homCWqlr99gIhAMOKarYi1gnPveRNxtUQVTJ16FCB7/oHRt09W4yGAFs2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@baobox%2fskill-builder-bff@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":76002},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"5ac399c9a95246691c079b94a81028b0c329f121","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run clean && npm run build && npm test"},"_npmUser":{"name":"brightqi","email":"brightq@gmail.com"},"repository":{"url":"git+https://github.com/baobox-ai/baobox-skill-studio.git","type":"git","directory":"packages/bff"},"_npmVersion":"10.8.2","description":"Mountable Hono BFF router for the BaoBox Skill Studio — wraps @baobox/sdk (per-tenant apiKey, tenant-scoped) and serves the @baobox/skill-builder-contract authoring surface.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@baobox/sdk":"^0.16.0","@baobox/skill-builder-contract":"^0.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","vitest":"^2.1.4","typescript":"^5.5.4","@types/node":"^20.14.0"},"peerDependencies":{"hono":">=4"},"_npmOperationalInternal":{"tmp":"tmp/skill-builder-bff_0.4.0_1781859963453_0.9524567227821303","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@baobox/skill-builder-bff","version":"0.5.0","keywords":["baobox","skill-studio","bff","hono","backend-for-frontend"],"author":{"name":"Bright Qi","email":"bright@adoptive.co"},"license":"MIT","_id":"@baobox/skill-builder-bff@0.5.0","maintainers":[{"name":"brightqi","email":"brightq@gmail.com"}],"homepage":"https://github.com/baobox-ai/baobox-skill-studio/tree/main/packages/bff#readme","bugs":{"url":"https://github.com/baobox-ai/baobox-skill-studio/issues"},"dist":{"shasum":"53768575233b30f4c54c2d4ce4a2085893e1661a","tarball":"https://registry.npmjs.org/@baobox/skill-builder-bff/-/skill-builder-bff-0.5.0.tgz","fileCount":12,"integrity":"sha512-IIB570yjVJnG91fQyUqD8JHpoy1vw6M0RjLyNPy+AK9tv0rr9bZr3MA9MnLJSNjFTUSepL4ovUYQB9rai8spng==","signatures":[{"sig":"MEUCIC0ViQTRjr/yFcJOaGWSwAgBPc0n9X75LBv5JBFTCnhFAiEA6aGtNtVU67eux6ytbYbNr8We4C2mwLAyGOft9mY1LD0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@baobox%2fskill-builder-bff@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":78908},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"48896b179f4c5f3d605edd0c49f697f60a510fde","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run clean && npm run build && npm test"},"_npmUser":{"name":"brightqi","email":"brightq@gmail.com"},"repository":{"url":"git+https://github.com/baobox-ai/baobox-skill-studio.git","type":"git","directory":"packages/bff"},"_npmVersion":"10.8.2","description":"Mountable Hono BFF router for the BaoBox Skill Studio — wraps @baobox/sdk (per-tenant apiKey, tenant-scoped) and serves the @baobox/skill-builder-contract authoring surface.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@baobox/sdk":"^0.18.0","@baobox/skill-builder-contract":"^0.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","vitest":"^2.1.4","typescript":"^5.5.4","@types/node":"^20.14.0"},"peerDependencies":{"hono":">=4"},"_npmOperationalInternal":{"tmp":"tmp/skill-builder-bff_0.5.0_1781879448625_0.7567995033115473","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@baobox/skill-builder-bff","version":"0.6.0","keywords":["baobox","skill-studio","bff","hono","backend-for-frontend"],"author":{"name":"Bright Qi","email":"bright@adoptive.co"},"license":"MIT","_id":"@baobox/skill-builder-bff@0.6.0","maintainers":[{"name":"brightqi","email":"brightq@gmail.com"}],"homepage":"https://github.com/baobox-ai/baobox-skill-studio/tree/main/packages/bff#readme","bugs":{"url":"https://github.com/baobox-ai/baobox-skill-studio/issues"},"dist":{"shasum":"88883a04fe69a30024002da82f1bf750176fe7ba","tarball":"https://registry.npmjs.org/@baobox/skill-builder-bff/-/skill-builder-bff-0.6.0.tgz","fileCount":12,"integrity":"sha512-HjJjRCw8zDtrTA8zcs34H1oGOh6AkzmZkkOtAam89S9N9AY+PTP8Q7OtVNfgtE/PuyLhqenw7BjedBP4TLSUyQ==","signatures":[{"sig":"MEQCIFbO1N5YXqqvsEhsSvkDpicXLmtkpadTkXg735bL/9SrAiAzIlIeLnc9k+/PNjpuDX1afXN5b31YHFV3eml+T2zIsQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@baobox%2fskill-builder-bff@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":82708},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"957dcd68ddffa7ea827741d7fcd32a64227ccf4c","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run clean && npm run build && npm test"},"_npmUser":{"name":"brightqi","email":"brightq@gmail.com"},"repository":{"url":"git+https://github.com/baobox-ai/baobox-skill-studio.git","type":"git","directory":"packages/bff"},"_npmVersion":"10.8.2","description":"Mountable Hono BFF router for the BaoBox Skill Studio — wraps @baobox/sdk (per-tenant apiKey, tenant-scoped) and serves the @baobox/skill-builder-contract authoring surface.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@baobox/sdk":"^0.19.0","@baobox/skill-builder-contract":"^0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","vitest":"^2.1.4","typescript":"^5.5.4","@types/node":"^20.14.0"},"peerDependencies":{"hono":">=4"},"_npmOperationalInternal":{"tmp":"tmp/skill-builder-bff_0.6.0_1781882420148_0.8419720365290899","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@baobox/skill-builder-bff","version":"0.7.0","keywords":["baobox","skill-studio","bff","hono","backend-for-frontend"],"author":{"name":"Bright Qi","email":"bright@adoptive.co"},"license":"MIT","_id":"@baobox/skill-builder-bff@0.7.0","maintainers":[{"name":"brightqi","email":"brightq@gmail.com"}],"homepage":"https://github.com/baobox-ai/baobox-skill-studio/tree/main/packages/bff#readme","bugs":{"url":"https://github.com/baobox-ai/baobox-skill-studio/issues"},"dist":{"shasum":"a72a06c06b6d3373f1da59f7c268f0dc431e8efd","tarball":"https://registry.npmjs.org/@baobox/skill-builder-bff/-/skill-builder-bff-0.7.0.tgz","fileCount":12,"integrity":"sha512-8BCBrTtdSx14Robfs5JJ1Y5Nxde+Gp4bETGey/BTBJd+Jd2bk5gR5IkfBoSynfWI0y1F2fGsmLFC7p8noaVTCQ==","signatures":[{"sig":"MEUCIFYrQuv5NOrI/LdRideZ/vYZd9Ihtn85Q+y4hbK5jkqeAiEA9be8Yjxb3AXb/gt8xLXv9ndfIhKwgNxJdLTbeDqZATs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@baobox%2fskill-builder-bff@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":85518},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"c683231915d7802c2e008f1ff9ceee0876cbac96","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run clean && npm run build && npm test"},"_npmUser":{"name":"brightqi","email":"brightq@gmail.com"},"repository":{"url":"git+https://github.com/baobox-ai/baobox-skill-studio.git","type":"git","directory":"packages/bff"},"_npmVersion":"10.8.2","description":"Mountable Hono BFF router for the BaoBox Skill Studio — wraps @baobox/sdk (per-tenant apiKey, tenant-scoped) and serves the @baobox/skill-builder-contract authoring surface.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@baobox/sdk":"^0.21.0","@baobox/skill-builder-contract":"^0.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","vitest":"^2.1.4","typescript":"^5.5.4","@types/node":"^20.14.0"},"peerDependencies":{"hono":">=4"},"_npmOperationalInternal":{"tmp":"tmp/skill-builder-bff_0.7.0_1781921203404_0.7647963503189832","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@baobox/skill-builder-bff","version":"0.8.0","keywords":["baobox","skill-studio","bff","hono","backend-for-frontend"],"author":{"name":"Bright Qi","email":"bright@adoptive.co"},"license":"MIT","_id":"@baobox/skill-builder-bff@0.8.0","maintainers":[{"name":"brightqi","email":"brightq@gmail.com"}],"homepage":"https://github.com/baobox-ai/baobox-skill-studio/tree/main/packages/bff#readme","bugs":{"url":"https://github.com/baobox-ai/baobox-skill-studio/issues"},"dist":{"shasum":"dcdc92c4bba90fcb8f62a4d890e869f2ff1a9e80","tarball":"https://registry.npmjs.org/@baobox/skill-builder-bff/-/skill-builder-bff-0.8.0.tgz","fileCount":12,"integrity":"sha512-AICGf7HlCwcBBJqsX519nq9R9X/wFGhrbs2EDXNrsjlF4WkOdRQ8eNodVVfQjirOiqSlqd/4Nqtneh8FIHq3qg==","signatures":[{"sig":"MEQCIG1+JecTUnuXojBO1qKnFNGF4CKvfH3OeP/FUm9KYfxPAiBE2qym3Dh7euagaFPjS7cLlFUJS/6K1t50k18FRKbEFw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@baobox%2fskill-builder-bff@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":85902},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"09b2d5f8423ccea638d065d7462d36cd6848a054","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run clean && npm run build && npm test"},"_npmUser":{"name":"brightqi","email":"brightq@gmail.com"},"repository":{"url":"git+https://github.com/baobox-ai/baobox-skill-studio.git","type":"git","directory":"packages/bff"},"_npmVersion":"10.8.2","description":"Mountable Hono BFF router for the BaoBox Skill Studio — wraps @baobox/sdk (per-tenant apiKey, tenant-scoped) and serves the @baobox/skill-builder-contract authoring surface.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@baobox/sdk":"^0.22.0","@baobox/skill-builder-contract":"^0.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","vitest":"^2.1.4","typescript":"^5.5.4","@types/node":"^20.14.0"},"peerDependencies":{"hono":">=4"},"_npmOperationalInternal":{"tmp":"tmp/skill-builder-bff_0.8.0_1781934787479_0.013303744796003603","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@baobox/skill-builder-bff","version":"0.8.1","description":"Mountable Hono BFF router for the BaoBox Skill Studio — wraps @baobox/sdk (per-tenant apiKey, tenant-scoped) and serves the @baobox/skill-builder-contract authoring surface.","license":"MIT","author":{"name":"BaoBox Maintainers","email":"opensource@baobox.ai"},"repository":{"type":"git","url":"git+https://github.com/baobox-ai/baobox-skill-studio.git","directory":"packages/bff"},"homepage":"https://github.com/baobox-ai/baobox-skill-studio/tree/main/packages/bff#readme","bugs":{"url":"https://github.com/baobox-ai/baobox-skill-studio/issues"},"type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"engines":{"node":">=18"},"scripts":{"build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","test":"vitest run","test:watch":"vitest","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build && npm test"},"dependencies":{"@baobox/sdk":"^0.26.0","@baobox/skill-builder-contract":"^0.7.0"},"peerDependencies":{"hono":">=4"},"devDependencies":{"@types/node":"^20.14.0","hono":"^4.6.0","typescript":"^5.5.4","vitest":"^2.1.4"},"keywords":["baobox","skill-studio","bff","hono","backend-for-frontend"],"publishConfig":{"access":"public"},"_id":"@baobox/skill-builder-bff@0.8.1","gitHead":"125a5980c7e9243cc4ee1c0c80d696069823a4f8","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-cxQqo2VdV6x/iW5C82h2fQqOV52wK1P06bwVtVUy4EZqPwioU/zIXEr45tpIJ0cCrSwF4UC8MV0JSYeDFtiCfA==","shasum":"f517abbf70eb212b5dff1d021a9a65e97e7664b4","tarball":"https://registry.npmjs.org/@baobox/skill-builder-bff/-/skill-builder-bff-0.8.1.tgz","fileCount":12,"unpackedSize":92256,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@baobox%2fskill-builder-bff@0.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCi2ecLbbFvgD18w6DGYQg15ILp5Iqnso2sic2b2s8B8gIge2LvIm2nyq9DzgT4abrknCtaJK9ukHyymub3hRSPtAc="}]},"_npmUser":{"name":"brightqi","email":"brightq@gmail.com"},"directories":{},"maintainers":[{"name":"brightqi","email":"brightq@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/skill-builder-bff_0.8.1_1783859675586_0.5863389537181869"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-06T10:04:42.675Z","modified":"2026-07-12T12:34:35.991Z","0.1.0":"2026-06-06T10:04:42.950Z","0.2.0":"2026-06-06T12:47:07.389Z","0.3.0":"2026-06-07T08:25:58.998Z","0.4.0":"2026-06-19T09:06:03.588Z","0.5.0":"2026-06-19T14:30:48.782Z","0.6.0":"2026-06-19T15:20:20.313Z","0.7.0":"2026-06-20T02:06:43.580Z","0.8.0":"2026-06-20T05:53:07.655Z","0.8.1":"2026-07-12T12:34:35.717Z"},"bugs":{"url":"https://github.com/baobox-ai/baobox-skill-studio/issues"},"author":{"name":"BaoBox Maintainers","email":"opensource@baobox.ai"},"license":"MIT","homepage":"https://github.com/baobox-ai/baobox-skill-studio/tree/main/packages/bff#readme","keywords":["baobox","skill-studio","bff","hono","backend-for-frontend"],"repository":{"type":"git","url":"git+https://github.com/baobox-ai/baobox-skill-studio.git","directory":"packages/bff"},"description":"Mountable Hono BFF router for the BaoBox Skill Studio — wraps @baobox/sdk (per-tenant apiKey, tenant-scoped) and serves the @baobox/skill-builder-contract authoring surface.","maintainers":[{"name":"brightqi","email":"brightq@gmail.com"}],"readme":"# @baobox/skill-builder-bff\n\nThe **Backend-for-Frontend** for the BaoBox **Skill Studio**. A mountable\n[Hono](https://hono.dev) router the tenant's own backend mounts; it is the only\nthing that performs real BaoBox operations — **through `@baobox/sdk`**\n(a per-tenant `apiKey`, or a legacy `adminSecret`), server-side, scoped to one\ntenant.\n\nThe embedded `<baobox-skill-builder>` Web Component (`@baobox/skill-builder`,\n#249) calls **this** router (never BaoBox). It implements the\n`@baobox/skill-builder-contract` surface.\n\n> Phase 1 (walking skeleton): **list skills · get one · update one field.**\n> Phase 2 (#259): **create · structural edit · sub-skill graph · tool wiring ·\n> per-tenant parameters**, plus the git-truth `onMutation` control point.\n\n## Install\n\n```sh\nnpm install @baobox/skill-builder-bff @baobox/sdk hono\n# @baobox/skill-builder-contract comes in as a dependency\n```\n\n`@baobox/sdk@^0.16.0` is required (the tenant-scoped `skills.*` reads/writes from\n#247 plus the #257 authoring ops: create / attach-sub-skill / attach-tool).\n`hono` is a peer dependency — the BFF returns a Hono router you mount on your app.\n\n## Mount (Hono / Cloudflare Workers)\n\n```ts\nimport { Hono } from \"hono\";\nimport { createSkillBuilderBff } from \"@baobox/skill-builder-bff\";\n\nconst app = new Hono();\n\nconst skillStudio = createSkillBuilderBff({\n  endpoint: env.BAOBOX_ENDPOINT,     // your BaoBox worker URL\n  apiKey: env.BAOBOX_SKILLS_KEY,     // per-tenant key (recommended) — server-side only\n  tenantId: \"t_acme\",                // every call is scoped to this tenant (#247)\n  hooks: {\n    authz: ({ op, skillId }) => currentUserMayEdit(op, skillId), // false → 403\n    audit: (record) => auditLog.write(record),                   // best-effort\n  },\n});\n\napp.route(\"/api/skill-studio\", skillStudio);\n// → point the element's `api-base` at \"/api/skill-studio\"\n```\n\n## Endpoints (the contract)\n\nRelative to the mount path. Every call is scoped to `tenantId` via `@baobox/sdk`.\n\n**Phase 1 — reads + single-field edit**\n\n| Method & path       | Calls                                         | Returns                    |\n| ------------------- | --------------------------------------------- | -------------------------- |\n| `GET /skills`       | `skills.list({ tenantId })`                   | `{ data: SkillSummary[] }` |\n| `GET /skills/:id`   | `skills.get(id, { tenantId })`                | `{ data: SkillDetail }`    |\n| `PATCH /skills/:id` | `skills.update(id, body, { tenantId })` → get | `{ data: SkillDetail }`    |\n\n**Phase 2 — authoring (#259)**\n\n| Method & path                          | Calls                                  | Returns                       |\n| -------------------------------------- | -------------------------------------- | ----------------------------- |\n| `POST /skills`                         | `skills.create(body)` → get            | `{ data: SkillDetail }` (201) |\n| `PUT /skills/:id`                      | `skills.update(id, body)` → get        | `{ data: SkillDetail }`       |\n| `GET /skills/:id/attached-skills`      | `skills.listAttachedSkills(id)`        | `{ data: SkillSummary[] }`    |\n| `POST /skills/:id/attached-skills`     | `skills.attachSkill(id, childSkillId)` | `{ data: { attached } }`      |\n| `DELETE /skills/:id/attached-skills/:childId` | `skills.detachSkill(id, childId)` | `{ data: { detached } }`      |\n| `GET /skills/:id/tools`                | `skills.listTools(id)` → projected     | `{ data: SkillToolSummary[] }`|\n| `POST /skills/:id/tools`               | `skills.attachTool(id, toolId)`        | `{ data: { attached } }`      |\n| `DELETE /skills/:id/tools/:toolId`     | `skills.detachTool(id, toolId)`        | `{ data: { detached } }`      |\n| `GET /skills/:id/parameters`           | host `parameters.get` (masked)         | `{ data: SkillParameter[] }`  |\n| `PUT /skills/:id/parameters`           | host `parameters.set` → masked echo    | `{ data: SkillParameter[] }`  |\n\nRequest bodies are validated by the matching contract schema (unknown keys like\n`id`/`tenantId` rejected → `400 validation_error`). Non-2xx responses use the\ncontract's stable `{ error: { code, message, requestId? } }` envelope, where\n`code` is one of the contract's `ContractErrorCode`s — e.g. a sub-skill cycle is\n`cycle_detected` (422) and an off-allowlist tool is `tool_not_allowed` (403) — so\nthe Web Component can branch on `code` instead of parsing prose.\n\n## Config & hooks\n\n```ts\ncreateSkillBuilderBff({\n  endpoint: string,\n  // EXACTLY ONE credential (server-side only):\n  apiKey?: string,       // per-tenant key with skills:read/skills:write — RECOMMENDED (#254)\n  adminSecret?: string,  // cross-tenant admin secret — legacy; reaches every tenant\n  tenantId: string,\n  hooks?: {\n    authz?: (ctx: { op, tenantId, skillId?, childSkillId?, toolId? }) => boolean | void | Promise<…>,  // false/throw → 403\n    audit?: (record: { op, tenantId, skillId?, childSkillId?, toolId?, outcome, updatedField?, updatedFields?, error? }) => void | Promise<…>,\n    sourceOfTruth?: {                       // optional READ decorators; default off (BaoBox is source)\n      list?:   (summaries, { tenantId }) => SkillSummary[] | Promise<…>,\n      detail?: (detail, { tenantId, skillId }) => SkillDetail | Promise<…>,\n    },\n    onMutation?: (e: { op, tenantId, skillId, childSkillId?, toolId?, before?, after? }) => void | Promise<…>,  // git-truth (#259); best-effort; default no-op\n    parameters?: {                          // per-tenant parameter store (#259); omit → params disabled\n      get: ({ tenantId, skillId }) => SkillParameter[] | Promise<…>,\n      set: (params, { tenantId, skillId }) => SkillParameter[] | void | Promise<…>,\n    },\n  },\n  allowUnauthenticated?: boolean,  // default false — see \"fail-closed\" below\n  client?: BaoBoxClient,   // inject a pre-built/stubbed client (tests)\n  fetch?: typeof fetch,    // forwarded to the SDK client\n})\n```\n\nPer request: **authz → SDK call → (onMutation, on writes) → audit → contract-shaped response.**\n\n### `onMutation` — the git-truth control point (#259)\n\nEvery structural mutation (create / update / attach-detach sub-skill /\nattach-detach tool / set-parameters) funnels through `authz` **before** the write\nand fires `onMutation` **after** it commits. It is a *notification*, not a gate\n(the gate is `authz`), so the host uses it to record the live edit as **drift**\nand queue a **promote-back** into its canonical git store. `before`/`after` carry\nthe skill image for the field mutations; graph/tool/parameter ops carry the `op`\nplus the target id. Because the BaoBox write has already committed, a throwing\n`onMutation` never fails the request — the failure is recorded via `audit`.\n\n### Per-tenant parameters\n\nPer-tenant parameters have **no BaoBox backing** — they are the host's data — so\npersistence is delegated to `hooks.parameters`. Omit it and `GET …/parameters`\nreturns `[]` while `PUT …/parameters` is refused (403). A parameter marked\n`secret: true` has its value **masked (blanked) in every response**.\n\n## Security\n\n- **Fail-closed authz (default).** With **no `hooks.authz`**, every request is\n  **denied (403)** and the BFF logs a warning at mount. To run without an authz\n  hook you must explicitly set **`allowUnauthenticated: true`** — and only when\n  another layer already authorizes callers (upstream middleware / trusted\n  internal network). A forgotten hook can never silently expose skill read/write.\n- **Per-tenant credential (#254 AC1).** Prefer `apiKey` — a tenant-bound BaoBox\n  key carrying `skills:read` / `skills:write`. The credential itself enforces the\n  tenant boundary, so a breached/buggy BFF can never reach another tenant's\n  skills (the `X-BaoBox-Tenant-Id` scope becomes belt-and-suspenders). The legacy\n  `adminSecret` is cross-tenant — only use it where a single shared credential is\n  acceptable. Exactly one of `apiKey` / `adminSecret` is required.\n- The credential is held server-side and **never appears in any response or\n  error** — error messages are mapped from the SDK's status/code and the value\n  (apiKey or adminSecret) is additionally redacted as a backstop.\n- Every call is **tenant-scoped** (`#247`): a skill owned by another tenant\n  returns **404**, never another tenant's data.\n- `authz` denial short-circuits **before** any BaoBox call and returns **403**.\n- **Tool list is projected** to `{ id, name, description }`. The SDK's full\n  `Tool` carries `handlerConfig` / `inputSchema` (which may hold callback\n  secrets); those are dropped server-side and **never reach the browser**.\n- **Secret parameters never leave the server.** A `secret: true` parameter's\n  value is blanked in every response (`GET` and the `PUT` echo).\n\n> `apiKey` mode requires `@baobox/sdk` >= 0.16.0 and a BaoBox server with #257\n> worker support (a tenant key carrying the `skills:*` grants + `tool:<id>`\n> allowlist for the authoring routes).\n\n## Versioning\n\n`0.3.0`. Published from the `baobox-skill-studio` monorepo via a tag-driven\nrelease (`bff-v*` → GitHub Actions → npm).\n","readmeFilename":"README.md"}