{"_id":"@brand-map/extension-sdk","_rev":"16-ae9beb2edec44aedb1338fde5fe5473a","name":"@brand-map/extension-sdk","dist-tags":{"next":"0.0.10-alpha.25","latest":"0.0.10-alpha.34"},"versions":{"0.0.7-alpha.1":{"name":"@brand-map/extension-sdk","version":"0.0.7-alpha.1","_id":"@brand-map/extension-sdk@0.0.7-alpha.1","maintainers":[{"name":"alexvyber","email":"alexvyber@gmail.com"}],"dist":{"shasum":"7979b8917efd2683149e052fac0ad18efda63455","tarball":"https://registry.npmjs.org/@brand-map/extension-sdk/-/extension-sdk-0.0.7-alpha.1.tgz","fileCount":30,"integrity":"sha512-AVq2y+ETSQ+QeHVLkPFxcwEO1VYsgYglX9zN6F2SC0bGpr0AEEYVHvxJLrPmernVb8YD4/jMFKlEeuIpPFUeFw==","signatures":[{"sig":"MEUCIChloj+5MQvhEBcTTbFANTkmASVf/sc76O7dbE6WhrSxAiEAycb8YrAQkvthrzZcPEU8syA7zbxYSGs796fFi2VEzE0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":139535},"main":"./cjs/index.cjs","type":"module","types":"./types/exports.d.ts","module":"./esm/index.js","exports":{".":{"types":"./types/exports.d.ts","import":"./esm/index.js","default":"./esm/index.js","require":"./cjs/index.cjs"},"./types":{"types":"./types/types/exports.d.ts","import":"./esm/types.js","default":"./esm/types.js","require":"./cjs/types.cjs"},"./validation":{"types":"./types/validation/exports.d.ts","import":"./esm/validation.js","default":"./esm/validation.js","require":"./cjs/validation.cjs"}},"gitHead":"721b5eeb94d1d285d8af502768f666402ab6aa8b","_npmUser":{"name":"alexvyber","email":"alexvyber@gmail.com"},"_npmVersion":"11.11.0","description":"Authoring helpers for Brand Map extensions. Use this package for `extension`, `callback`, `eventHandler`, `scheduledJob`, lifecycle hooks, and workflows.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"valibot":"1.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/extension-sdk_0.0.7-alpha.1_1778526928005_0.9639754296984644","host":"s3://npm-registry-packages-npm-production"}},"0.0.10-alpha.1":{"name":"@brand-map/extension-sdk","version":"0.0.10-alpha.1","_id":"@brand-map/extension-sdk@0.0.10-alpha.1","maintainers":[{"name":"alexvyber","email":"alexvyber@gmail.com"}],"dist":{"shasum":"d185e087a1d11487b1f9b75077b20680187540f5","tarball":"https://registry.npmjs.org/@brand-map/extension-sdk/-/extension-sdk-0.0.10-alpha.1.tgz","fileCount":30,"integrity":"sha512-UUnnXFWbOF/b6eUo54JRfDU5nS7F0txnRs9of1LDH1EBUccih/hsH2QCNcb/1vhlsJOeHJ5wpr+913BdRlwTUw==","signatures":[{"sig":"MEUCIQC1evbIKCvllfakV2gbJEbMK7d+JbyISveNsFCKQSH0PwIgQzXH8T0TbZpvK4gQ6eDjTuW2CNR2xjEbLBXMskfod2w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":139536},"main":"./cjs/index.cjs","type":"module","types":"./types/exports.d.ts","module":"./esm/index.js","exports":{".":{"types":"./types/exports.d.ts","import":"./esm/index.js","default":"./esm/index.js","require":"./cjs/index.cjs"},"./types":{"types":"./types/types/exports.d.ts","import":"./esm/types.js","default":"./esm/types.js","require":"./cjs/types.cjs"},"./validation":{"types":"./types/validation/exports.d.ts","import":"./esm/validation.js","default":"./esm/validation.js","require":"./cjs/validation.cjs"}},"gitHead":"721b5eeb94d1d285d8af502768f666402ab6aa8b","_npmUser":{"name":"alexvyber","email":"alexvyber@gmail.com"},"_npmVersion":"11.11.0","description":"Authoring helpers for Brand Map extensions. Use this package for `extension`, `callback`, `eventHandler`, `scheduledJob`, lifecycle hooks, and workflows.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"valibot":"1.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/extension-sdk_0.0.10-alpha.1_1778527627891_0.8730239246303666","host":"s3://npm-registry-packages-npm-production"}},"0.0.10-alpha.2":{"name":"@brand-map/extension-sdk","version":"0.0.10-alpha.2","_id":"@brand-map/extension-sdk@0.0.10-alpha.2","maintainers":[{"name":"alexvyber","email":"alexvyber@gmail.com"}],"dist":{"shasum":"a889dbc77bec0a5fd5073f184b96fb1582394656","tarball":"https://registry.npmjs.org/@brand-map/extension-sdk/-/extension-sdk-0.0.10-alpha.2.tgz","fileCount":30,"integrity":"sha512-LjLezA8raVT01gvjvO0+uYiyVB3fwKXDsSNa6FOQJ30zPQwjzBlHHCKvfSIEiYZP0xK4bV2ofM4wSKzdek7Jgw==","signatures":[{"sig":"MEQCIE7ymbF4uAtBhGUgHcAP6RMAKrcuvLd0bY2NiZYgpUhIAiBIAjNVsUgLChpRKqLzBO/4atyMYQFBRhRmoXsNS/DwWw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":139536},"main":"./cjs/index.cjs","type":"module","types":"./types/exports.d.ts","module":"./esm/index.js","exports":{".":{"types":"./types/exports.d.ts","import":"./esm/index.js","default":"./esm/index.js","require":"./cjs/index.cjs"},"./types":{"types":"./types/types/exports.d.ts","import":"./esm/types.js","default":"./esm/types.js","require":"./cjs/types.cjs"},"./validation":{"types":"./types/validation/exports.d.ts","import":"./esm/validation.js","default":"./esm/validation.js","require":"./cjs/validation.cjs"}},"gitHead":"721b5eeb94d1d285d8af502768f666402ab6aa8b","_npmUser":{"name":"alexvyber","email":"alexvyber@gmail.com"},"_npmVersion":"11.11.0","description":"Authoring helpers for Brand Map extensions. Use this package for `extension`, `callback`, `eventHandler`, `scheduledJob`, lifecycle hooks, and workflows.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"valibot":"1.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/extension-sdk_0.0.10-alpha.2_1778528576364_0.18711012964636886","host":"s3://npm-registry-packages-npm-production"}},"0.0.10-alpha.4":{"name":"@brand-map/extension-sdk","version":"0.0.10-alpha.4","_id":"@brand-map/extension-sdk@0.0.10-alpha.4","maintainers":[{"name":"alexvyber","email":"alexvyber@gmail.com"}],"dist":{"shasum":"c8d55f31f3127bb975de61008e18c86f92c73f12","tarball":"https://registry.npmjs.org/@brand-map/extension-sdk/-/extension-sdk-0.0.10-alpha.4.tgz","fileCount":30,"integrity":"sha512-1YumlTXSNyEkp1xqTW/xc0vQ1Bu/3Lps9Xwgg13qtVspjmW5Zh0Y0OkJ+zoxnFWxJwZy+5xbwQwRsW5tsSOLfA==","signatures":[{"sig":"MEUCIQD5QwIlXpkbMxLoTD49cdpT+3rQB/O8mY+pK/Qi1aTYpwIgIjSvf2Ke9czcUESf9igOZp+yXyQFfTLFdCurjgGi1Xc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":139536},"main":"./cjs/index.cjs","type":"module","types":"./types/exports.d.ts","module":"./esm/index.js","exports":{".":{"types":"./types/exports.d.ts","import":"./esm/index.js","default":"./esm/index.js","require":"./cjs/index.cjs"},"./types":{"types":"./types/types/exports.d.ts","import":"./esm/types.js","default":"./esm/types.js","require":"./cjs/types.cjs"},"./validation":{"types":"./types/validation/exports.d.ts","import":"./esm/validation.js","default":"./esm/validation.js","require":"./cjs/validation.cjs"}},"gitHead":"721b5eeb94d1d285d8af502768f666402ab6aa8b","_npmUser":{"name":"alexvyber","email":"alexvyber@gmail.com"},"_npmVersion":"11.11.0","description":"Authoring helpers for Brand Map extensions. Use this package for `extension`, `callback`, `eventHandler`, `scheduledJob`, lifecycle hooks, and workflows.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"valibot":"1.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/extension-sdk_0.0.10-alpha.4_1778529070801_0.6107373473148872","host":"s3://npm-registry-packages-npm-production"}},"0.0.10-alpha.5":{"name":"@brand-map/extension-sdk","version":"0.0.10-alpha.5","_id":"@brand-map/extension-sdk@0.0.10-alpha.5","maintainers":[{"name":"alexvyber","email":"alexvyber@gmail.com"}],"dist":{"shasum":"a82eb8bf6c5be04951776a40778cce6b5d3dffc4","tarball":"https://registry.npmjs.org/@brand-map/extension-sdk/-/extension-sdk-0.0.10-alpha.5.tgz","fileCount":30,"integrity":"sha512-nzkz1SjrwuQybeFUG1CnmofWkYryM0q/svOLQ8MyJsJkOhWx3BAEbY/BDr1voqGEdm2HXRXkLd6OpRVRoK3Tew==","signatures":[{"sig":"MEUCIQC4uo/QlUji4j+QjxVTcVeZdWz8TYiXD5LZmjcyTDRkPAIgJL0T/Z/eJ8BvMBb5lXjgridiT6H/NpkpssjC33SwC0k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":139536},"main":"./cjs/index.cjs","type":"module","types":"./types/exports.d.ts","module":"./esm/index.js","exports":{".":{"types":"./types/exports.d.ts","import":"./esm/index.js","default":"./esm/index.js","require":"./cjs/index.cjs"},"./types":{"types":"./types/types/exports.d.ts","import":"./esm/types.js","default":"./esm/types.js","require":"./cjs/types.cjs"},"./validation":{"types":"./types/validation/exports.d.ts","import":"./esm/validation.js","default":"./esm/validation.js","require":"./cjs/validation.cjs"}},"gitHead":"716e239fbb23e39232d6a08002120c0f6550a7fd","_npmUser":{"name":"alexvyber","email":"alexvyber@gmail.com"},"_npmVersion":"11.11.0","description":"Authoring helpers for Brand Map extensions. Use this package for `extension`, `callback`, `eventHandler`, `scheduledJob`, lifecycle hooks, and workflows.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"valibot":"1.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/extension-sdk_0.0.10-alpha.5_1778529958853_0.8676776289143777","host":"s3://npm-registry-packages-npm-production"}},"0.0.10-alpha.7":{"name":"@brand-map/extension-sdk","version":"0.0.10-alpha.7","_id":"@brand-map/extension-sdk@0.0.10-alpha.7","maintainers":[{"name":"alexvyber","email":"alexvyber@gmail.com"}],"dist":{"shasum":"2800185d8551cdcfcb0bd684cce63d85d37761a1","tarball":"https://registry.npmjs.org/@brand-map/extension-sdk/-/extension-sdk-0.0.10-alpha.7.tgz","fileCount":30,"integrity":"sha512-mQtuu47p8SkxUV/UwJOR8IpXIVZVCPjDbp2GH/UDME9ApX0QuTQSCV3MacBMSw5u0rAYBos3yyrpSwPhHN/qoQ==","signatures":[{"sig":"MEUCIHc97QqV5ZA3/vmC8Xo7DKda5HDL4J5QjyA9/xwr5E49AiEAq1Viip8oxRkmScsmPlRkaIaY7PqDdP4uNzWXDLZZnWo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":162200},"main":"./cjs/index.cjs","type":"module","types":"./types/exports.d.ts","module":"./esm/index.js","exports":{".":{"types":"./types/exports.d.ts","import":"./esm/index.js","default":"./esm/index.js","require":"./cjs/index.cjs"},"./types":{"types":"./types/types/exports.d.ts","import":"./esm/types.js","default":"./esm/types.js","require":"./cjs/types.cjs"},"./validation":{"types":"./types/validation/exports.d.ts","import":"./esm/validation.js","default":"./esm/validation.js","require":"./cjs/validation.cjs"}},"gitHead":"2f8c60af8db1a986f13a93d6a9cff8c58db2b05f","_npmUser":{"name":"alexvyber","email":"alexvyber@gmail.com"},"_npmVersion":"11.11.0","description":"`@brand-map/extension-sdk` is the public authoring package for Brand Map extensions. It gives extension authors a small set of helpers for declaring handlers, a generated TypeScript contract for the operations an extension can call, and Valibot schemas fo","directories":{},"_nodeVersion":"24.14.1","dependencies":{"valibot":"1.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/extension-sdk_0.0.10-alpha.7_1778580104602_0.3841002682058321","host":"s3://npm-registry-packages-npm-production"}},"0.0.10-alpha.8":{"name":"@brand-map/extension-sdk","version":"0.0.10-alpha.8","_id":"@brand-map/extension-sdk@0.0.10-alpha.8","maintainers":[{"name":"alexvyber","email":"alexvyber@gmail.com"}],"dist":{"shasum":"3e6aaf23d0ba34859c49ebed91eaa512aeccfbeb","tarball":"https://registry.npmjs.org/@brand-map/extension-sdk/-/extension-sdk-0.0.10-alpha.8.tgz","fileCount":30,"integrity":"sha512-+MzPnZZPmbLcdhLQ1me0lJXUfL+s0shry0wbKwuTvjrWG+QNOd+waVEZEeGBAEVRf7bTcgTKkl1Me5wYLTL2Zg==","signatures":[{"sig":"MEQCIAqQLusYf1WDcs0C34oZluyhlgMmY3a/N/1cunD4uz8IAiBCipECAE1BWUskMyDzbSdxB+1lBtOYP72OJpYpSYQj1A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":162179},"main":"./cjs/index.cjs","type":"module","types":"./types/exports.d.ts","module":"./esm/index.js","exports":{".":{"types":"./types/exports.d.ts","import":"./esm/index.js","default":"./esm/index.js","require":"./cjs/index.cjs"},"./types":{"types":"./types/types/exports.d.ts","import":"./esm/types.js","default":"./esm/types.js","require":"./cjs/types.cjs"},"./validation":{"types":"./types/validation/exports.d.ts","import":"./esm/validation.js","default":"./esm/validation.js","require":"./cjs/validation.cjs"}},"gitHead":"78f39895dabb8c214418a52950ee7955c361e215","_npmUser":{"name":"alexvyber","email":"alexvyber@gmail.com"},"_npmVersion":"11.11.0","description":"`@brand-map/extension-sdk` is the public authoring package for Brand Map extensions. It gives extension authors a small set of helpers for declaring handlers, a generated TypeScript contract for the operations an extension can call, and Valibot schemas fo","directories":{},"_nodeVersion":"24.14.1","dependencies":{"valibot":"1.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/extension-sdk_0.0.10-alpha.8_1778588798621_0.9245209040440594","host":"s3://npm-registry-packages-npm-production"}},"0.0.10-alpha.25":{"name":"@brand-map/extension-sdk","version":"0.0.10-alpha.25","_id":"@brand-map/extension-sdk@0.0.10-alpha.25","maintainers":[{"name":"alexvyber","email":"alexvyber@gmail.com"}],"dist":{"shasum":"e1d583951db6f6c61441d38e1d85ae42c1dfbbb3","tarball":"https://registry.npmjs.org/@brand-map/extension-sdk/-/extension-sdk-0.0.10-alpha.25.tgz","fileCount":36,"integrity":"sha512-kJDDqnTxwdmEYVyeGZmVC6ZeJXXehjGOnWIleIhS0gQ/kiiuJQaTi8/0uZo0doL9F6WBBcqCws65Rw0YOTz1zg==","signatures":[{"sig":"MEYCIQDzsHd5X7KCKZDAFagUjU/IpJL+gTMyft6VvaLQ2rK1/gIhAMvElZcxmQ7dY3SpIZ21PZ1NbNJAtlW7yt3CnVpT6Yvo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257367},"main":"./cjs/index.cjs","type":"module","types":"./types/exports.d.ts","module":"./esm/index.js","exports":{".":{"types":"./types/exports.d.ts","import":"./esm/index.js","default":"./esm/index.js","require":"./cjs/index.cjs"},"./types":{"types":"./types/types/exports.d.ts","import":"./esm/types.js","default":"./esm/types.js","require":"./cjs/types.cjs"},"./validation":{"types":"./types/validation/exports.d.ts","import":"./esm/validation.js","default":"./esm/validation.js","require":"./cjs/validation.cjs"}},"gitHead":"c3248f57aa31e6780ac18dea3604224f727336d8","_npmUser":{"name":"alexvyber","email":"alexvyber@gmail.com"},"_npmVersion":"11.11.0","description":"`@brand-map/extension-sdk` is the public authoring package for Brand Map extensions. It gives extension authors a small set of helpers for declaring handlers, a generated TypeScript contract for the operations an extension can call, and Valibot schemas fo","directories":{},"_nodeVersion":"24.14.1","dependencies":{"valibot":"1.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/extension-sdk_0.0.10-alpha.25_1779962019319_0.5337826406400716","host":"s3://npm-registry-packages-npm-production"}},"0.0.10-alpha.26":{"name":"@brand-map/extension-sdk","version":"0.0.10-alpha.26","_id":"@brand-map/extension-sdk@0.0.10-alpha.26","maintainers":[{"name":"alexvyber","email":"alexvyber@gmail.com"}],"dist":{"shasum":"ebee27f52866541fb18818536aab47733b1d7c89","tarball":"https://registry.npmjs.org/@brand-map/extension-sdk/-/extension-sdk-0.0.10-alpha.26.tgz","fileCount":36,"integrity":"sha512-mmKbOTGVms2LqXlHLxZucxmJAuxFPqvZtG6Vd+hh8NsYtkJdNWoFVCQZqyeXBmREr7Bsf4WcsYdCC1bBbpkKpA==","signatures":[{"sig":"MEUCIB+x5kS7RkghETLDKwh5qct8zsgPZXBdmWb8ooiSHnfVAiEAibmlQZrcWjhVsE6iQpyR3GsZFCuBIlw2d/rht3eWzhQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257367},"main":"./cjs/index.cjs","type":"module","types":"./types/exports.d.ts","module":"./esm/index.js","exports":{".":{"types":"./types/exports.d.ts","import":"./esm/index.js","default":"./esm/index.js","require":"./cjs/index.cjs"},"./types":{"types":"./types/types/exports.d.ts","import":"./esm/types.js","default":"./esm/types.js","require":"./cjs/types.cjs"},"./validation":{"types":"./types/validation/exports.d.ts","import":"./esm/validation.js","default":"./esm/validation.js","require":"./cjs/validation.cjs"}},"gitHead":"c3248f57aa31e6780ac18dea3604224f727336d8","_npmUser":{"name":"alexvyber","email":"alexvyber@gmail.com"},"_npmVersion":"11.11.0","description":"`@brand-map/extension-sdk` is the public authoring package for Brand Map extensions. It gives extension authors a small set of helpers for declaring handlers, a generated TypeScript contract for the operations an extension can call, and Valibot schemas fo","directories":{},"_nodeVersion":"24.14.1","dependencies":{"valibot":"1.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/extension-sdk_0.0.10-alpha.26_1779962207034_0.30041949663771406","host":"s3://npm-registry-packages-npm-production"}},"0.0.10-alpha.27":{"name":"@brand-map/extension-sdk","version":"0.0.10-alpha.27","_id":"@brand-map/extension-sdk@0.0.10-alpha.27","maintainers":[{"name":"alexvyber","email":"alexvyber@gmail.com"}],"dist":{"shasum":"91b4c893e0bb8f74fa9f244a80926df4c1ae4653","tarball":"https://registry.npmjs.org/@brand-map/extension-sdk/-/extension-sdk-0.0.10-alpha.27.tgz","fileCount":36,"integrity":"sha512-qDGrI4Ne6eXD2vNvvDAobB2+NLbj8YrQPXgAbTBW8cIxzWA+qGg1mixtmzWEGJWfEkyB99XQELsuuAfFdhc3aw==","signatures":[{"sig":"MEQCICNYKoxitbNrXXqZC2WcXWf5zV4y+WimBIkeCH9aK8r5AiArdUIzazDkE1ikySlJR6qwiZM5rSy54M3+E1o9C2/O3w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257367},"main":"./cjs/index.cjs","type":"module","types":"./types/exports.d.ts","module":"./esm/index.js","exports":{".":{"types":"./types/exports.d.ts","import":"./esm/index.js","default":"./esm/index.js","require":"./cjs/index.cjs"},"./types":{"types":"./types/types/exports.d.ts","import":"./esm/types.js","default":"./esm/types.js","require":"./cjs/types.cjs"},"./validation":{"types":"./types/validation/exports.d.ts","import":"./esm/validation.js","default":"./esm/validation.js","require":"./cjs/validation.cjs"}},"gitHead":"c3248f57aa31e6780ac18dea3604224f727336d8","_npmUser":{"name":"alexvyber","email":"alexvyber@gmail.com"},"_npmVersion":"11.11.0","description":"`@brand-map/extension-sdk` is the public authoring package for Brand Map extensions. It gives extension authors a small set of helpers for declaring handlers, a generated TypeScript contract for the operations an extension can call, and Valibot schemas fo","directories":{},"_nodeVersion":"24.14.1","dependencies":{"valibot":"1.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/extension-sdk_0.0.10-alpha.27_1779963985238_0.3279357433304697","host":"s3://npm-registry-packages-npm-production"}},"0.0.10-alpha.28":{"name":"@brand-map/extension-sdk","version":"0.0.10-alpha.28","_id":"@brand-map/extension-sdk@0.0.10-alpha.28","maintainers":[{"name":"alexvyber","email":"alexvyber@gmail.com"}],"dist":{"shasum":"b08b410cdab9ae5c703bd3c7ba58c92abfb3c03a","tarball":"https://registry.npmjs.org/@brand-map/extension-sdk/-/extension-sdk-0.0.10-alpha.28.tgz","fileCount":36,"integrity":"sha512-UaXfZlyKj4+parf3IZOd9sv/m4Js9hr2vVubgGEcuCK/UMfcQdTI4Cusg0I+lQ2aDAfi8NjRbI170g2zWBcNGw==","signatures":[{"sig":"MEYCIQCMI/mw1Jl3CRSnf1SPjZj7Ug4RtTpLCkxL7Sz9Ldp35AIhAM8rptlsgIi6zee2ENTEEOi86t3dnyZ1R18mlCR2wKF+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257367},"main":"./cjs/index.cjs","type":"module","types":"./types/exports.d.ts","module":"./esm/index.js","exports":{".":{"types":"./types/exports.d.ts","import":"./esm/index.js","default":"./esm/index.js","require":"./cjs/index.cjs"},"./types":{"types":"./types/types/exports.d.ts","import":"./esm/types.js","default":"./esm/types.js","require":"./cjs/types.cjs"},"./validation":{"types":"./types/validation/exports.d.ts","import":"./esm/validation.js","default":"./esm/validation.js","require":"./cjs/validation.cjs"}},"gitHead":"c3248f57aa31e6780ac18dea3604224f727336d8","_npmUser":{"name":"alexvyber","email":"alexvyber@gmail.com"},"_npmVersion":"11.11.0","description":"`@brand-map/extension-sdk` is the public authoring package for Brand Map extensions. It gives extension authors a small set of helpers for declaring handlers, a generated TypeScript contract for the operations an extension can call, and Valibot schemas fo","directories":{},"_nodeVersion":"24.14.1","dependencies":{"valibot":"1.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/extension-sdk_0.0.10-alpha.28_1779967253939_0.9115415167905376","host":"s3://npm-registry-packages-npm-production"}},"0.0.10-alpha.29":{"name":"@brand-map/extension-sdk","version":"0.0.10-alpha.29","_id":"@brand-map/extension-sdk@0.0.10-alpha.29","maintainers":[{"name":"alexvyber","email":"alexvyber@gmail.com"}],"dist":{"shasum":"424a7882fc7c276fc890f57e1c01118c914d8d53","tarball":"https://registry.npmjs.org/@brand-map/extension-sdk/-/extension-sdk-0.0.10-alpha.29.tgz","fileCount":36,"integrity":"sha512-ztYow6w2HfPJ/RejUbaHQrGaqRQPpe4LrUYC4TVFJQqQmCsziok2PI+6Poycxne0lXLBCunzw60+NrSMnTW6Tw==","signatures":[{"sig":"MEQCIGRnBoEjXBI0ak9EkkPGFE25Ca1lRjXWyWW5aiCPBeiPAiAyMwNo8mcq26WgzG6nEiNstc/1g6quCGCo8Yu0F4h15A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":274423},"main":"./cjs/index.cjs","type":"module","types":"./types/exports.d.ts","module":"./esm/index.js","exports":{".":{"types":"./types/exports.d.ts","import":"./esm/index.js","default":"./esm/index.js","require":"./cjs/index.cjs"},"./types":{"types":"./types/types/exports.d.ts","import":"./esm/types.js","default":"./esm/types.js","require":"./cjs/types.cjs"},"./validation":{"types":"./types/validation/exports.d.ts","import":"./esm/validation.js","default":"./esm/validation.js","require":"./cjs/validation.cjs"}},"gitHead":"ed8440c05314e9f9095c9dadd49896c197537fc7","_npmUser":{"name":"alexvyber","email":"alexvyber@gmail.com"},"_npmVersion":"11.11.0","description":"`@brand-map/extension-sdk` - публичный пакет для разработки расширений Brand Map. Он дает авторам расширений компактный набор вспомогательных функций для объявления обработчиков, сгенерированный TypeScript-контракт операций, которые может вызывать расшире","directories":{},"_nodeVersion":"24.14.1","dependencies":{"valibot":"1.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/extension-sdk_0.0.10-alpha.29_1779971208661_0.4518917001031586","host":"s3://npm-registry-packages-npm-production"}},"0.0.10-alpha.30":{"name":"@brand-map/extension-sdk","version":"0.0.10-alpha.30","_id":"@brand-map/extension-sdk@0.0.10-alpha.30","maintainers":[{"name":"alexvyber","email":"alexvyber@gmail.com"}],"dist":{"shasum":"40936d569e4c4302f3bb4038467a48ef75c6963e","tarball":"https://registry.npmjs.org/@brand-map/extension-sdk/-/extension-sdk-0.0.10-alpha.30.tgz","fileCount":36,"integrity":"sha512-fB5DVe6Hk8O6jn3I7QqP0eLvSy9lsLFXkeriBgpHdfQUQ851AJbDpzuoO2U1IfDPAxPl3c5ljzwJbiZkuLR58g==","signatures":[{"sig":"MEYCIQCaJd0fulbxYqUXPzmOoHWSzBoU23e8OKZCsvgoJfRLjwIhAK1xejS5W1UTLGTb91fXBfD0SALsHoeZmWCEhQySZq6J","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":274423},"main":"./cjs/index.cjs","type":"module","types":"./types/exports.d.ts","module":"./esm/index.js","exports":{".":{"types":"./types/exports.d.ts","import":"./esm/index.js","default":"./esm/index.js","require":"./cjs/index.cjs"},"./types":{"types":"./types/types/exports.d.ts","import":"./esm/types.js","default":"./esm/types.js","require":"./cjs/types.cjs"},"./validation":{"types":"./types/validation/exports.d.ts","import":"./esm/validation.js","default":"./esm/validation.js","require":"./cjs/validation.cjs"}},"gitHead":"ed8440c05314e9f9095c9dadd49896c197537fc7","_npmUser":{"name":"alexvyber","email":"alexvyber@gmail.com"},"_npmVersion":"11.11.0","description":"`@brand-map/extension-sdk` - публичный пакет для разработки расширений Brand Map. Он дает авторам расширений компактный набор вспомогательных функций для объявления обработчиков, сгенерированный TypeScript-контракт операций, которые может вызывать расшире","directories":{},"_nodeVersion":"24.14.1","dependencies":{"valibot":"1.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/extension-sdk_0.0.10-alpha.30_1779971658345_0.049276334058518056","host":"s3://npm-registry-packages-npm-production"}},"0.0.10-alpha.31":{"name":"@brand-map/extension-sdk","version":"0.0.10-alpha.31","_id":"@brand-map/extension-sdk@0.0.10-alpha.31","maintainers":[{"name":"alexvyber","email":"alexvyber@gmail.com"}],"dist":{"shasum":"28c1e69c8fb5da71cf6a12c2825b2f8b76ed9d27","tarball":"https://registry.npmjs.org/@brand-map/extension-sdk/-/extension-sdk-0.0.10-alpha.31.tgz","fileCount":36,"integrity":"sha512-6JpRBMXaPD5n7ZbjB3BQw5T9iQKB+/vbT5JNwDofIPPeAUYTrZA6I6P6utQwCuEMMfLp1bBhuJfVaR6CCOosZA==","signatures":[{"sig":"MEYCIQChVcdrZdNLHA0+BzpN68EJc23T5Bqw9NhDckZGZnGvOgIhAOAO3Fzxbt52Qm5+0QQfK/WqMBukPpluKpzpf/e8Wann","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":274423},"main":"./cjs/index.cjs","type":"module","types":"./types/exports.d.ts","module":"./esm/index.js","exports":{".":{"types":"./types/exports.d.ts","import":"./esm/index.js","default":"./esm/index.js","require":"./cjs/index.cjs"},"./types":{"types":"./types/types/exports.d.ts","import":"./esm/types.js","default":"./esm/types.js","require":"./cjs/types.cjs"},"./validation":{"types":"./types/validation/exports.d.ts","import":"./esm/validation.js","default":"./esm/validation.js","require":"./cjs/validation.cjs"}},"gitHead":"b2bb1d268f8b48490157ef74d5fda8777cceebe7","_npmUser":{"name":"alexvyber","email":"alexvyber@gmail.com"},"_npmVersion":"11.11.0","description":"`@brand-map/extension-sdk` - публичный пакет для разработки расширений Brand Map. Он дает авторам расширений компактный набор вспомогательных функций для объявления обработчиков, сгенерированный TypeScript-контракт операций, которые может вызывать расшире","directories":{},"_nodeVersion":"24.14.1","dependencies":{"valibot":"1.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/extension-sdk_0.0.10-alpha.31_1779976729337_0.8622624350729069","host":"s3://npm-registry-packages-npm-production"}},"0.0.10-alpha.33":{"name":"@brand-map/extension-sdk","version":"0.0.10-alpha.33","_id":"@brand-map/extension-sdk@0.0.10-alpha.33","maintainers":[{"name":"alexvyber","email":"alexvyber@gmail.com"}],"dist":{"shasum":"84fba01cdd4dced4b7b5112ad68630b45b39a854","tarball":"https://registry.npmjs.org/@brand-map/extension-sdk/-/extension-sdk-0.0.10-alpha.33.tgz","fileCount":36,"integrity":"sha512-98SUqFtryMZJKxsLtdUK6euJU8EyCOWx56iS4PTyxcOyz2LwDZmo9SrZ3vgD4Xvr20O6SFXOc6xA55cUc2cK/Q==","signatures":[{"sig":"MEYCIQCahQ5YS0E/6OkNyp9K49w0zg5z4cxWdzAas9UjEjhIfwIhAKPEfxKGgTByr87haAwqlhbc6fykHn/WPsAByeG1W2Ep","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":274423},"main":"./cjs/index.cjs","type":"module","types":"./types/exports.d.ts","module":"./esm/index.js","exports":{".":{"types":"./types/exports.d.ts","import":"./esm/index.js","default":"./esm/index.js","require":"./cjs/index.cjs"},"./types":{"types":"./types/types/exports.d.ts","import":"./esm/types.js","default":"./esm/types.js","require":"./cjs/types.cjs"},"./validation":{"types":"./types/validation/exports.d.ts","import":"./esm/validation.js","default":"./esm/validation.js","require":"./cjs/validation.cjs"}},"gitHead":"b8803b2b06dcf9e2ffa8f63f9bea330dff3bbb06","_npmUser":{"name":"alexvyber","email":"alexvyber@gmail.com"},"_npmVersion":"11.11.0","description":"`@brand-map/extension-sdk` - публичный пакет для разработки расширений Brand Map. Он дает авторам расширений компактный набор вспомогательных функций для объявления обработчиков, сгенерированный TypeScript-контракт операций, которые может вызывать расшире","directories":{},"_nodeVersion":"24.14.1","dependencies":{"valibot":"1.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/extension-sdk_0.0.10-alpha.33_1779987105982_0.34271258894162693","host":"s3://npm-registry-packages-npm-production"}},"0.0.10-alpha.34":{"name":"@brand-map/extension-sdk","version":"0.0.10-alpha.34","type":"module","main":"./cjs/index.cjs","module":"./esm/index.js","types":"./types/exports.d.ts","exports":{".":{"types":"./types/exports.d.ts","import":"./esm/index.js","require":"./cjs/index.cjs","default":"./esm/index.js"},"./types":{"types":"./types/types/exports.d.ts","import":"./esm/types.js","require":"./cjs/types.cjs","default":"./esm/types.js"},"./validation":{"types":"./types/validation/exports.d.ts","import":"./esm/validation.js","require":"./cjs/validation.cjs","default":"./esm/validation.js"}},"publishConfig":{"access":"public"},"dependencies":{"valibot":"1.4.0"},"gitHead":"ab3c0d6064aadae39abae4055eafe29c2f6a2d26","_id":"@brand-map/extension-sdk@0.0.10-alpha.34","description":"`@brand-map/extension-sdk` - публичный пакет для разработки расширений Brand Map. Он дает авторам расширений компактный набор вспомогательных функций для объявления обработчиков, сгенерированный TypeScript-контракт операций, которые может вызывать расшире","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-Nj+taGt6VaSNf6dsxYUyrjil3josUOUJLVqOeoHaEXbq3aY1WmYyq6zE7C3BeW4N/WWSpcu5SlgNEJVoYnLm/Q==","shasum":"a69738baab211aa4b04bfa1c56870aa8187d4393","tarball":"https://registry.npmjs.org/@brand-map/extension-sdk/-/extension-sdk-0.0.10-alpha.34.tgz","fileCount":36,"unpackedSize":274423,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC2KAMaEUZlwWb7iWnw4ulB4tgCLWAi8vfDQyfWHIZzMAIgYUlyURM0zbuN5HD05esLwCyrOb2prSDzcyPsqcW1o24="}]},"_npmUser":{"name":"alexvyber","email":"alexvyber@gmail.com"},"directories":{},"maintainers":[{"name":"alexvyber","email":"alexvyber@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/extension-sdk_0.0.10-alpha.34_1780073103975_0.8861113701449521"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-11T19:15:27.934Z","modified":"2026-05-29T16:45:04.237Z","0.0.7-alpha.1":"2026-05-11T19:15:28.149Z","0.0.10-alpha.1":"2026-05-11T19:27:08.080Z","0.0.10-alpha.2":"2026-05-11T19:42:56.508Z","0.0.10-alpha.4":"2026-05-11T19:51:10.940Z","0.0.10-alpha.5":"2026-05-11T20:05:59.059Z","0.0.10-alpha.7":"2026-05-12T10:01:44.742Z","0.0.10-alpha.8":"2026-05-12T12:26:38.798Z","0.0.10-alpha.25":"2026-05-28T09:53:39.453Z","0.0.10-alpha.26":"2026-05-28T09:56:47.177Z","0.0.10-alpha.27":"2026-05-28T10:26:25.379Z","0.0.10-alpha.28":"2026-05-28T11:20:54.089Z","0.0.10-alpha.29":"2026-05-28T12:26:48.794Z","0.0.10-alpha.30":"2026-05-28T12:34:18.483Z","0.0.10-alpha.31":"2026-05-28T13:58:49.466Z","0.0.10-alpha.33":"2026-05-28T16:51:46.135Z","0.0.10-alpha.34":"2026-05-29T16:45:04.146Z"},"description":"`@brand-map/extension-sdk` - публичный пакет для разработки расширений Brand Map. Он дает авторам расширений компактный набор вспомогательных функций для объявления обработчиков, сгенерированный TypeScript-контракт операций, которые может вызывать расшире","maintainers":[{"name":"alexvyber","email":"alexvyber@gmail.com"}],"readme":"# @brand-map/extension-sdk\n\n`@brand-map/extension-sdk` - публичный пакет для разработки расширений Brand Map. Он дает авторам расширений компактный набор вспомогательных функций для объявления обработчиков, сгенерированный TypeScript-контракт операций, которые может вызывать расширение, и Valibot-схемы публичного манифеста и DTO wire-форматов.\n\nSDK намеренно узкий. Он не раскрывает внутренности хоста, строки хранилища установок, сообщения runner или валидацию sandbox-протокола. Эти контракты живут в runtime- и platform-пакетах. Авторы расширений должны воспринимать этот пакет как стабильную публичную поверхность.\n\n## Точки Входа Пакета\n\nОпубликованный пакет открывает три точки входа:\n\n```ts\nimport {\n  extension,\n  callback,\n  eventHandler,\n  scheduledJob,\n  lifecycleHook,\n  temporalWorkflow,\n} from \"@brand-map/extension-sdk\";\nimport type { ExtensionRuntimeContext, ExtensionManifest } from \"@brand-map/extension-sdk/types\";\nimport {\n  ExtensionManifestSchema,\n  parseExtensionManifest,\n} from \"@brand-map/extension-sdk/validation\";\n```\n\n- `@brand-map/extension-sdk` содержит вспомогательные функции, используемые в исходном коде расширений.\n- `@brand-map/extension-sdk/types` содержит сгенерированные публичные TypeScript-типы для манифестов, runtime context, DTO операций и контрактов сервисов операций.\n- `@brand-map/extension-sdk/validation` содержит публичные Valibot-схемы для манифестов расширений и DTO операций. Их использует сборщик, а также инструменты, которым нужно валидировать публичные контракты пакетов расширений.\n\n## Минимальное Расширение\n\nРасширение экспортирует либо объект `BrandMapExtension`, либо фабричную функцию, которая возвращает такой объект. Обычный способ создать объект - `extension(...)`.\n\n```ts\nimport { callback, extension } from \"@brand-map/extension-sdk\";\n\nexport default extension({\n  name: \"catalog-tools\",\n  version: \"0.1.0\",\n  permissions: [\"operation:product.list\"],\n  callbacks: [\n    callback(\"list-products\", async ({ brandMap }) => {\n      const products = await brandMap.product.list({ limit: 20 });\n      return { count: products.data.length };\n    }),\n  ],\n});\n```\n\nХелпер `extension(...)` одновременно строит:\n\n- массивы runtime-обработчиков: `callbacks`, `eventHandlers`, `jobs`, `hooks` и `workflows`;\n- сериализуемый объект `manifest`, полученный из обработчиков и metadata-полей входных данных.\n\nСборщик импортирует собранный бандл, читает `extension.manifest`, валидирует его и записывает `dist/extension.manifest.json`.\n\n## Структура Файлов\n\nТипичный пакет расширения:\n\n```text\nmy-extension/\n  package.json\n  tsconfig.json\n  src/\n    extension.ts\n    exports.ts\n  docs/\n    README.md\n    SUMMARY.md\n    images/\n      setup.png\n  dist/\n    extension.js\n    extension.manifest.json\n    brand-map-my-extension-0.1.0.tgz\n```\n\n`src/exports.ts` - точка входа бандла, которую использует `brand-map-extension build`.\n\n```ts\nexport { catalogToolsExtension as default } from \"./extension.js\";\n```\n\nПакеты расширений должны быть ESM-пакетами:\n\n```json\n{\n  \"type\": \"module\"\n}\n```\n\nСборщик требует, чтобы `dist/extension.js` открывал ESM exports.\n\n## Метаданные\n\nВходные данные `extension(...)` включают публичные метаданные пакета, объявления обработчиков, поля конфигурации и разрешения. Markdown-документация лежит в корне пакета `docs/`, а не в манифесте.\n\n```ts\nimport { callback, extension } from \"@brand-map/extension-sdk\";\n\nexport default extension({\n  name: \"stock-sync\",\n  displayName: \"Синхронизация остатков\",\n  description: \"Синхронизирует остатки из внешней системы.\",\n  publisher: \"Brand Map\",\n  developerUrl: \"https://brandmap.ru\",\n  version: \"0.1.0\",\n  logo: {\n    src: \"https://example.com/logo.png\",\n    alt: \"Синхронизация остатков\",\n  },\n  config: [\n    {\n      key: \"apiBaseUrl\",\n      label: \"Базовый URL API\",\n      required: true,\n      type: \"url\",\n    },\n    {\n      key: \"apiToken\",\n      label: \"API-токен\",\n      required: true,\n      secret: true,\n      type: \"string\",\n    },\n  ],\n  permissions: [\n    \"operation:inventory.syncStockLevel\",\n    \"extension-storage:read\",\n    \"extension-storage:write\",\n  ],\n  callbacks: [\n    callback(\"health\", async () => {\n      return { ok: true };\n    }),\n  ],\n});\n```\n\nДокументация обнаруживается из `docs/` при упаковке или публикации:\n\n```text\ndocs/\n  README.md\n  SUMMARY.md\n  setup.md\n  images/\n    setup.png\n```\n\nИспользуйте обычные относительные Markdown-ссылки между страницами документации и соседними файлами ресурсов:\n\n```md\n[Настройка](./setup.md)\n![Скриншот настройки](./images/setup.png)\n```\n\nПоддерживаемые типы конфигурационных полей:\n\n- `boolean`\n- `multi-select`\n- `number`\n- `select`\n- `string`\n- `url`\n\nДля секретов используйте `secret: true`. Платформа хранит секретную конфигурацию отдельно от обычной конфигурации установки и подставляет ее в runtime-снимок там, где это нужно.\n\n## Разрешения\n\nРазрешения расширений явные и управляются манифестом. Поддерживаемые формы:\n\n```ts\ntype ExtensionPermission =\n  | \"extension-storage:read\"\n  | \"extension-storage:write\"\n  | `network:${string}`\n  | ExtensionOperationPermission;\n```\n\nРазрешения операций используют сгенерированную форму:\n\n```text\noperation:<service>.<operation>\n```\n\nПример:\n\n```ts\npermissions: [\"operation:product.list\", \"operation:product.create\"];\n```\n\nRuntime проверяет объявленные разрешения перед выполнением операций хоста. Сборщик также сканирует прямые вызовы `brandMap.<service>.<operation>(...)` в бандле и отклоняет пакет, если нет соответствующего разрешения.\n\nПроверить текущий каталог операций можно через сборщик:\n\n```sh\nbrand-map-extension operations\n```\n\nСгенерированный справочник также хранится в [`../OPERATIONS.md`](../OPERATIONS.md).\n\n## Контекст Runtime\n\nКаждый обработчик получает `ExtensionRuntimeContext` и специфичное для обработчика значение `invocation`.\n\n```ts\ntype ExtensionRuntimeContext = {\n  brandMap: ExtensionBrandMapOperations;\n  log: ExtensionLogger;\n  manifest: ExtensionManifest;\n  storage: ExtensionStorage;\n};\n```\n\n### `brandMap`\n\n`brandMap` - типизированный RPC-прокси для публичных операций хоста. Он повторяет сгенерированные контракты сервисов:\n\n```ts\nconst products = await brandMap.product.list({ limit: 20 });\nawait brandMap.inventory.syncStockLevel({\n  inventoryItemId: \"inv_item_1\",\n  stockLocationId: \"stock_location_1\",\n  quantity: 12,\n});\n```\n\nТолько операции из `@brand-map/extension-sdk/types` входят в публичный контракт расширений. Внутренние сервисы, destructive-операции, функции с зависимостями от колбэков, streams и приватные типы строк БД намеренно исключены.\n\n### `log`\n\nИспользуйте `context.log` для структурированных runtime-логов:\n\n```ts\ncontext.log.info(\"Синхронизация началась\", { cursor });\ncontext.log.warn(\"Удаленный товар пропущен\", { sku, reason: \"не указан склад\" });\n```\n\n`console.*` перенаправляется runner, но `context.log` предпочтительнее, потому что сохраняет уровень лога и структурированные данные.\n\n### `manifest`\n\n`context.manifest` - валидированный манифест, который хост загрузил для этой установки. Используйте его для проверок метаданных только на чтение, а не как изменяемое состояние.\n\n### `storage`\n\n`context.storage` изолирован по установке. Одно и то же расширение, установленное для двух магазинов, получает разные хранилища.\n\n```ts\ntype ExtensionStorage = {\n  cache: ExtensionStorageCache;\n  dataRoot: string;\n  db: ExtensionStorageDb;\n  files: ExtensionStorageFiles;\n  path: (...segments: string[]) => string;\n};\n```\n\nМетоды хранилища требуют явных разрешений:\n\n- `extension-storage:read` для чтения.\n- `extension-storage:write` для записи и удаления.\n\n## Колбэк-Обработчики\n\nКолбэки - HTTP-style действия расширения. Они вызываются через маршруты действий расширений и получают метаданные запроса, контекст авторизации, заголовки, query-параметры, полезную нагрузку и сырое тело.\n\n```ts\nimport { callback, extension } from \"@brand-map/extension-sdk\";\n\nexport default extension({\n  name: \"webhook-tools\",\n  version: \"0.1.0\",\n  permissions: [\"extension-storage:read\", \"extension-storage:write\"],\n  callbacks: [\n    callback(\"receive\", { action: \"external-webhook\" }, async ({ invocation, storage, log }) => {\n      log.info(\"Вебхук получен\", {\n        path: invocation.request.path,\n        source: invocation.request.source,\n      });\n\n      await storage.db.set({\n        key: `webhooks.${invocation.invocationId}`,\n        value: invocation.payload ?? null,\n      });\n\n      return {\n        status: 202,\n        body: { accepted: true },\n      };\n    }),\n  ],\n});\n```\n\n`callback(name, handler)` использует одно значение для `name` и публичного `action`. `callback(name, { action }, handler)` позволяет сохранить стабильное внутреннее имя обработчика и открыть другое имя действия наружу.\n\n## Обработчики Событий\n\nОбработчики событий подписываются на события платформы по имени события.\n\n```ts\nimport { eventHandler, extension } from \"@brand-map/extension-sdk\";\n\nexport default extension({\n  name: \"order-events\",\n  version: \"0.1.0\",\n  eventHandlers: [\n    eventHandler(\"order-created\", { event: \"order.created\" }, async ({ invocation, log }) => {\n      log.info(\"Событие заказа получено\", {\n        event: invocation.event.name,\n        entityId: invocation.event.entityId,\n      });\n    }),\n  ],\n});\n```\n\n## Запланированные Задачи\n\nЗапланированные задачи объявляют расписание в манифесте. Runtime регистрирует расписания через планировщик хоста, когда поддержка расписаний включена.\n\n```ts\nimport { extension, scheduledJob } from \"@brand-map/extension-sdk\";\n\nexport default extension({\n  name: \"nightly-sync\",\n  version: \"0.1.0\",\n  jobs: [\n    scheduledJob(\n      \"sync\",\n      {\n        schedule: \"0 2 * * *\",\n        timezone: \"Europe/Moscow\",\n        overlap: \"SKIP\",\n      },\n      async ({ invocation, log }) => {\n        log.info(\"Запланированная синхронизация началась\", {\n          scheduledAt: invocation.scheduledAt,\n          trigger: invocation.trigger,\n        });\n      },\n    ),\n  ],\n});\n```\n\nПолитики пересечения:\n\n- `ALLOW_ALL`\n- `BUFFER_ALL`\n- `BUFFER_ONE`\n- `CANCEL_OTHER`\n- `SKIP`\n- `TERMINATE_OTHER`\n\n## Хуки Жизненного Цикла\n\nХуки жизненного цикла реагируют на события жизненного цикла расширения, которые отправляет платформа, например установку и изменение конфигурации.\n\n```ts\nimport { extension, lifecycleHook } from \"@brand-map/extension-sdk\";\n\nexport default extension({\n  name: \"lifecycle-audit\",\n  version: \"0.1.0\",\n  hooks: [\n    lifecycleHook(\"installed\", { event: \"extension.installed\" }, async ({ invocation, log }) => {\n      log.info(\"Расширение установлено\", {\n        payload: invocation.event.payload,\n      });\n    }),\n  ],\n});\n```\n\n## Temporal Workflow\n\nTemporal-процессы объявляют workflow-обработчики по имени. Они используют ту же обертку вызова и результата, что и другие обработчики, но предназначены для долгих workflow, оркестрируемых хостом.\n\n```ts\nimport { extension, temporalWorkflow } from \"@brand-map/extension-sdk\";\n\nexport default extension({\n  name: \"workflow-demo\",\n  version: \"0.1.0\",\n  workflows: [\n    temporalWorkflow(\"rebuild-index\", async ({ invocation, log }) => {\n      log.info(\"Workflow начался\", { input: invocation.input });\n      return { done: true };\n    }),\n  ],\n});\n```\n\n## Хуки Запуска И Остановки\n\n`extension(...)` также принимает `start` и `stop`. Эти функции не являются обработчиками манифеста. Runner вызывает их при старте и остановке процесса расширения.\n\n```ts\nimport { extension } from \"@brand-map/extension-sdk\";\n\nexport default extension({\n  name: \"with-lifecycle\",\n  version: \"0.1.0\",\n  async start({ log }) {\n    log.info(\"Runner расширения запущен\");\n  },\n  async stop({ log }) {\n    log.info(\"Runner расширения останавливается\");\n  },\n});\n```\n\nИспользуйте `start` только для легкой подготовки. Тяжелая работа должна жить в колбэках, событиях, задачах, хуках или workflow, чтобы хост мог применять обычные таймауты вызовов и наблюдаемость.\n\n## Возвращаемые Значения\n\nОбработчики могут возвращать:\n\n- `undefined`\n- JSON-совместимые значения\n- строки\n- явные HTTP-like response objects\n\n```ts\nreturn { ok: true };\n```\n\n```ts\nreturn \"обычный текст\";\n```\n\n```ts\nreturn {\n  status: 201,\n  headers: {\n    \"content-type\": \"application/json\",\n  },\n  body: {\n    created: true,\n  },\n};\n```\n\n`undefined` нормализуется runner в:\n\n```ts\n{\n  status: 204,\n  body: { kind: \"empty\" }\n}\n```\n\nДля явного `body` поддерживаются JSON-совместимые значения, строки и структурированные extension bodies:\n\n```ts\nreturn {\n  body: {\n    kind: \"text\",\n    text: \"ok\",\n  },\n};\n```\n\n```ts\nreturn {\n  body: {\n    kind: \"bytes\",\n    base64: \"aGVsbG8=\",\n    mimeType: \"text/plain\",\n  },\n};\n```\n\n## Постоянное Хранилище\n\nИспользуйте `storage.db` для надежных JSON-записей:\n\n```ts\nawait storage.db.set({\n  key: \"sync.cursor\",\n  value: {\n    page: 3,\n    remoteCursor: \"abc\",\n  },\n  metadata: {\n    source: \"remote-api\",\n  },\n});\n\nconst cursor = await storage.db.get(\"sync.cursor\");\nconst allSyncRecords = await storage.db.list({ prefix: \"sync.\", limit: 100 });\nawait storage.db.delete(\"sync.cursor\");\n```\n\nКлючи ограничены областью установки. Выбирайте стабильные ключи с пространством имен: `sync.cursor`, `orders.lastProcessedAt` или `remote.product.<id>`.\n\n## Временный Кеш\n\nИспользуйте `storage.cache` для временных JSON-значений:\n\n```ts\nawait storage.cache.set({\n  key: \"remote-token\",\n  value: {\n    token: \"redacted\",\n  },\n  ttl: 60 * 15,\n});\n\nconst token = await storage.cache.get(\"remote-token\");\nawait storage.cache.delete(\"remote-token\");\n```\n\n`ttl` задается в секундах. Значения кеша могут быть вытеснены провайдером хоста, поэтому не используйте кеш как надежное состояние.\n\n## Файлы\n\nИспользуйте `storage.files` для blob-данных или больших полезных нагрузок, которые должен обрабатывать файловый сервис хоста:\n\n```ts\nconst file = await storage.files.create({\n  filename: \"report.json\",\n  mimeType: \"application/json\",\n  content: JSON.stringify({ ok: true }),\n});\n\nconst bytes = await storage.files.getAsBuffer(file.id);\nconst retrieved = await storage.files.retrieve(file.id);\nawait storage.files.delete(file.id);\n```\n\nФайлы привязаны к текущей установке, чтобы очистка при удалении расширения могла удалить принадлежащие ей файловые ссылки.\n\n## Корневая Директория Данных\n\n`storage.dataRoot` - директория данных установки, предоставленная хостом. `storage.path(...segments)` склеивает пути внутри этого корня.\n\n```ts\nconst localPath = storage.path(\"tmp\", \"export.json\");\n```\n\nДля обычного состояния расширения предпочитайте `storage.db`, `storage.cache` и `storage.files`. Прямые записи в файловую систему подходят только для временных файлов, локальных инструментов или workflow, которым явно нужны пути.\n\n## Фабрика Расширений\n\nБандл расширения может экспортировать фабричную функцию. Runtime вызывает фабрику с параметрами установки из дескриптора хоста.\n\n```ts\nimport { callback, extension } from \"@brand-map/extension-sdk\";\n\ntype Options = {\n  apiBaseUrl?: string;\n};\n\nexport default function createExtension(options: Options) {\n  return extension({\n    name: \"factory-extension\",\n    version: \"0.1.0\",\n    callbacks: [\n      callback(\"config\", () => {\n        return {\n          apiBaseUrl: options.apiBaseUrl ?? null,\n        };\n      }),\n    ],\n  });\n}\n```\n\nФабрики полезны для встроенных расширений, где хост подставляет рабочие параметры. Пользовательские поля установки все равно нужно объявлять через `config`.\n\n## Рабочий Процесс Сборщика\n\nSDK обычно используется вместе с `@brand-map/extension-builder`.\n\n```sh\nbun add @brand-map/extension-sdk\nbun add -d @brand-map/extension-builder\n```\n\nСоздать пакет:\n\n```sh\nbrand-map-extension scaffold my-extension\n```\n\nПосмотреть операции:\n\n```sh\nbrand-map-extension operations\n```\n\nTypecheck:\n\n```sh\nbrand-map-extension typecheck\n```\n\nСобрать для локальной разработки:\n\n```sh\nbrand-map-extension build\n```\n\nСобрать для публикации:\n\n```sh\nbrand-map-extension build --publish\n```\n\nУпаковать:\n\n```sh\nbrand-map-extension pack\n```\n\n`pack` запускает publish build перед архивированием. `pack --publish` поддерживается как явная форма.\n\nАрхив содержит только:\n\n```text\npackage.json\ndist/extension.js\ndist/extension.manifest.json\n```\n\nИсходники, тесты, sourcemap-файлы и локальные артефакты репозитория не включаются.\n\n## Локальная Сборка И Сборка Для Публикации\n\nЛокальные сборки оптимизированы для разработки:\n\n- `src/exports.ts` собирается в `dist/extension.js`.\n- Бандл является современным ESM.\n- Включена минификация пробелов Bun.\n- Манифест пишется в `dist/extension.manifest.json`.\n- Выходной файл остается достаточно читаемым для отладки.\n\nСборки для публикации оптимизированы для распространения:\n\n- Включена полная минификация Bun.\n- `javascript-obfuscator` применяет умеренную обфускацию.\n- Sourcemap-файлы отключены.\n- Валидация запускается после обфускации.\n- Шаг `pack` валидирует финальный артефакт перед записью `.tgz`.\n\nНастройки обфускатора намеренно избегают агрессивных функций: выравнивания потока управления, вставки мертвого кода, глобального переименования, защиты от отладки и самозащиты кода. Они повышают runtime-риск и стоимость старта. Текущий режим публикации дает умеренное укрепление исходников, сохраняя стабильное поведение runtime расширения.\n\n## Валидация Бандла\n\nСборщик отклоняет бандлы, нарушающие публичные ограничения расширений:\n\n- Пакет должен объявлять `\"type\": \"module\"`.\n- `dist/extension.js` должен быть современным ESM.\n- Неподдерживаемые разрешения отклоняются.\n- Дублирующиеся колбэки, события, задачи, хуки или workflow отклоняются.\n- Удаленные legacy-вызовы операций отклоняются.\n- Прямые вызовы `brandMap.<service>.<operation>(...)` должны иметь соответствующие разрешения в манифесте.\n- Приватные импорты Brand Map отклоняются.\n- Утечки путей host-репозитория отклоняются.\n- Запрещенные host imports, например `node:child_process`, `node:cluster`, `node:worker_threads` и `bun:ffi`, отклоняются.\n\nВ бандле расширения разрешены только эти корни пакетов `@brand-map/*`:\n\n```ts\nnew Set([\n  \"@brand-map/extension-sdk\",\n  \"@brand-map/types\",\n  \"@brand-map/ui\",\n  \"@brand-map/admin-extension-sdk\",\n]);\n```\n\nAllowlist сопоставляется по корню пакета. Например, `@brand-map/ui/components/button` разрешен, потому что его корень пакета - `@brand-map/ui`; приватные runtime-пакеты Brand Map отклоняются.\n\n## Ответственность За Валидацию\n\nВалидация намеренно разделена по границам контрактов:\n\n- `extension-sdk/validation` отвечает за публичные контракты пакетов расширений, контракт манифеста, wire-контракты DTO операций и схемы, нужные публичным инструментам сборщика.\n- `extension-runtime` отвечает за валидацию протокола вызова runner/host, проверку сообщений sandbox и runtime-only safety checks.\n- `platform/extensions` отвечает за валидацию storage/readback установок и persistence shapes manager-сервиса.\n\nТакое разделение делает публичную валидацию SDK полезной, не раскрывая внутреннее хранилище хоста или детали sandbox-протокола.\n\n## Генерация Типов\n\nБольшинство публичных типов в `@brand-map/extension-sdk/types` генерируется из Valibot-схем и каталога операций. Не редактируйте сгенерированные файлы вручную.\n\nСемейства сгенерированных типов:\n\n- Общие JSON и query DTO.\n- Manifest DTO.\n- DTO товаров, цен, inventory, stock location, notifications и files.\n- Контракты операций, сгруппированные по сервисам.\n- Каталог операций и типы строк разрешений.\n- Runtime context и типы вызовов обработчиков.\n\nПроверить контракты пакетов расширений из корня workspace:\n\n```sh\nbun run check:contracts\n```\n\nСобрать публичные пакеты расширений:\n\n```sh\nbun run build:public\n```\n\nПробный запуск публичной публикации:\n\n```sh\nbun run publish:public --dry-run\n```\n\n## Лучшие Практики\n\nОбъявляйте самые узкие разрешения. Если колбэк только читает товары, объявляйте `operation:product.list`, а не все разрешения product.\n\nПо возможности делайте обработчики идемпотентными. Обработчики событий и задачи могут повторяться хостом.\n\nИспользуйте `storage.db` для курсоров и надежного состояния синхронизации. Используйте `storage.cache` для токенов и короткоживущих ответов удаленных API. Используйте `storage.files` для больших артефактов.\n\nДержите работу при старте небольшой. Используйте `start` для легкой подготовки и проверок здоровья, а не для импортов, синхронизаций или workflow с тяжелой сетевой нагрузкой.\n\nВозвращайте структурированные объекты ответа из публичных колбэков, которым нужны статус-коды или заголовки.\n\nИспользуйте `context.log` вместо `console.*`.\n\nИмпортируйте только публичные пакеты. Не импортируйте platform, runtime, kernel, database или пакеты только для хоста.\n\nЗапускайте `brand-map-extension pack` перед отправкой. Он строже обычной сборки и валидирует финальный артефакт публикации.\n\n## Диагностика\n\n### `Extension package must declare \"type\": \"module\"`\n\nДобавьте `\"type\": \"module\"` в `package.json` пакета расширения.\n\n### `dist/extension.js must be modern ESM`\n\nБандл не содержит ESM exports. Убедитесь, что расширение экспортируется из `src/exports.ts`, и соберите через `brand-map-extension build`.\n\n### `calls Brand Map operation ... but does not declare permission`\n\nДобавьте нужное разрешение `operation:<service>.<operation>` в `extension({ permissions: [...] })` или удалите вызов операции.\n\n### `contains unallowed Brand Map import`\n\nРасширение импортировало приватный пакет Brand Map. Замените импорт на `@brand-map/extension-sdk`, `@brand-map/extension-sdk/types`, публичный пакет UI/admin SDK или обычную стороннюю зависимость.\n\n### `declares duplicate callback handler`\n\nИмена обработчиков должны быть уникальны внутри каждого типа обработчиков. Переименуйте один из дублирующихся колбэков, обработчиков событий, задач, хуков или workflow.\n\n### `extension manifest is missing`\n\nЗапустите:\n\n```sh\nbrand-map-extension build\n```\n\nСборка создаст `dist/extension.manifest.json`.\n\n## Полный Пример\n\n```ts\nimport { callback, eventHandler, extension, scheduledJob } from \"@brand-map/extension-sdk\";\nimport { DateTime } from \"luxon\";\n\nexport default extension({\n  name: \"catalog-sync\",\n  displayName: \"Синхронизация каталога\",\n  description: \"Синхронизирует данные каталога с удаленной системой.\",\n  version: \"0.1.0\",\n  config: [\n    {\n      key: \"apiBaseUrl\",\n      label: \"Базовый URL API\",\n      required: true,\n      type: \"url\",\n    },\n    {\n      key: \"apiToken\",\n      label: \"API-токен\",\n      required: true,\n      secret: true,\n      type: \"string\",\n    },\n  ],\n  permissions: [\n    \"operation:product.list\",\n    \"extension-storage:read\",\n    \"extension-storage:write\",\n    \"network:https://api.example.com\",\n  ],\n  callbacks: [\n    callback(\"sync-now\", async ({ brandMap, invocation, log, storage }) => {\n      log.info(\"Запрошена ручная синхронизация\", {\n        invocationId: invocation.invocationId,\n      });\n\n      const products = await brandMap.product.list({ limit: 50 });\n      await storage.db.set({\n        key: \"sync.lastManualRun\",\n        value: {\n          at: DateTime.utc().toISO()!,\n          count: products.data.length,\n        },\n      });\n\n      return {\n        status: 200,\n        body: {\n          synced: products.data.length,\n        },\n      };\n    }),\n  ],\n  eventHandlers: [\n    eventHandler(\"product-updated\", { event: \"product.updated\" }, async ({ invocation, log }) => {\n      log.info(\"Товар изменен\", {\n        entityId: invocation.event.entityId,\n      });\n    }),\n  ],\n  jobs: [\n    scheduledJob(\n      \"nightly-sync\",\n      { overlap: \"SKIP\", schedule: \"0 3 * * *\", timezone: \"Europe/Moscow\" },\n      async ({ log, storage }) => {\n        const lastRun = await storage.db.get(\"sync.lastManualRun\");\n        log.info(\"Ночная синхронизация началась\", {\n          lastRun: lastRun?.value,\n        });\n      },\n    ),\n  ],\n});\n```\n","readmeFilename":"README.md"}