{"_id":"openclaw-nostr","_rev":"47-394092078f77f08792757dd1a8cb5502","name":"openclaw-nostr","dist-tags":{"latest":"2026.9.56"},"versions":{"2026.7.30":{"name":"openclaw-nostr","version":"2026.7.30","_id":"openclaw-nostr@2026.7.30","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"d7faa446e8c7063d5aecd70cb1efbebd712a12f1","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.30.tgz","fileCount":72,"integrity":"sha512-5Dx901fyuX2PQ6BP1ViLyoNirKaWZeiuemFH78iRHWR/Tngd61UuF7cYoSfwmsllquycOkD5k6TFOBOC5pS4dg==","signatures":[{"sig":"MEUCIQCntmu3+f3fqQaD7aBF/WM8L6m/MvNmM25xoputv46XPAIgIjD6iaj/6mt4ShFcSYoLfdArp28PbqxBRTh0npVh5Kc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1237744},"type":"module","gitHead":"d0cafef9ec545ab4d16f7321e8e526bf32d7ec1f","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.30_1784053204231_0.09617526815414568","host":"s3://npm-registry-packages-npm-production"}},"2026.7.31":{"name":"openclaw-nostr","version":"2026.7.31","_id":"openclaw-nostr@2026.7.31","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"0147750df8699ae2f770004251871a6962da34c5","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.31.tgz","fileCount":72,"integrity":"sha512-a1G4EKuw+RmQdwWFuVZo+JzHXScZyNCM68mhA5grhOeN3hmGi5J/kWZPSbN0CCzkhkxjIh/IMGPSLySub/zw0w==","signatures":[{"sig":"MEUCIHtWayr8IFsPhPScVcuhePqfgDTxo/bwILTyIeDWcC7kAiEA6p35JdQs0l84JJ8lRFSBJE4eCV+M+kJflTuUD2b2Ixs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1239213},"type":"module","gitHead":"c85702fa99a4b6445f726eba865425603a14fecc","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.31_1784058304255_0.9822105251531752","host":"s3://npm-registry-packages-npm-production"}},"2026.7.32":{"name":"openclaw-nostr","version":"2026.7.32","_id":"openclaw-nostr@2026.7.32","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"e27c8da3fef888657dbee4158e0684d0e67c0630","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.32.tgz","fileCount":72,"integrity":"sha512-nqCkgH0cMoASFzgJBAKirklyHLihVicPVK9TNrBWwK9H4f0zQv/t+3DIiTeiFLvbnfNecSC+qMxl5glrka1kgA==","signatures":[{"sig":"MEUCIQDvvwZcm/jlGizoflhDiwPnLj2ZqYkolb64fi0NRm5Q3AIgSRs7UjNrUjN8EogNJ+h+lGjw9ShPvHPppbqLWXz+6q0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1249849},"type":"module","gitHead":"d45d1bc6afc49b1446522a9d08e5edad3f91a66d","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.32_1784063829137_0.5429504618888856","host":"s3://npm-registry-packages-npm-production"}},"2026.7.33":{"name":"openclaw-nostr","version":"2026.7.33","_id":"openclaw-nostr@2026.7.33","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"ffde7c62a7d8d33b4f1efa827aba5ad2c7e84824","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.33.tgz","fileCount":72,"integrity":"sha512-hJHq4/1YzkCCxJWRIwDPeBvoXj//ZMnqXhfX3NnCerGIfADQHknc06tnZLLW5sTjw4tcfCESCP8PnHw4uQCDMA==","signatures":[{"sig":"MEUCIQCGp9nUHwX82Y13+rMqSSvW1cMDgd63fAWVTCP9541DHAIgKcMML5exf7bzffrxbNGxuLbbMqPsIrwu+YeILp49wI0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1255179},"type":"module","gitHead":"41b3061c5a3fc61c4b0fa503f5130caaecbdfca8","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.33_1784074145088_0.7575827736435956","host":"s3://npm-registry-packages-npm-production"}},"2026.7.34":{"name":"openclaw-nostr","version":"2026.7.34","_id":"openclaw-nostr@2026.7.34","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"64dfa4a87dc972eb7dde804ec3bb2472d191e3aa","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.34.tgz","fileCount":72,"integrity":"sha512-qfNVitLq5FRTgfe4IxIyVe1AzVHC8LBhFc2aocXz7QlVKtVLDS8xEZykJuYJr2ZKvTIKsr+r2BzMEApTk55Viw==","signatures":[{"sig":"MEUCIEm82FP9nlLRWmA7AUN5mCBx1VLn93CZcT1D+EC1vEFfAiEA33S6FPpRftA3Eyjo2mag4V/EczXamSbh/0f3B2E/cJM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1256820},"type":"module","gitHead":"19bb0731c23c1dc6aa59ba663a7111865cd38fe0","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.34_1784076640895_0.4493129503027753","host":"s3://npm-registry-packages-npm-production"}},"2026.7.35":{"name":"openclaw-nostr","version":"2026.7.35","_id":"openclaw-nostr@2026.7.35","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"d3528892d9215ab2e178c98f0b045b64e7490811","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.35.tgz","fileCount":72,"integrity":"sha512-QxLCEsCwfgBfm8kA0BSHmPx2ym5Sw9s/Kp3CkgM5u72qrbZyCTgg3o39Euk7fl85KpHqJKC74GGLUWEqAiRJWg==","signatures":[{"sig":"MEUCIAZ6uOZ5tnDDchgXbee89QLe10FZ49Mh1iwm+5lJ8Kd9AiEAz5DyuNY1jhXAfGnK+TVsxT2N6xVIYb/wCVHoMC5UWiQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1270475},"type":"module","gitHead":"883309fd9cd83a414ef688af6f9b5f742464c913","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.35_1784080994718_0.2904600322298905","host":"s3://npm-registry-packages-npm-production"}},"2026.7.36":{"name":"openclaw-nostr","version":"2026.7.36","_id":"openclaw-nostr@2026.7.36","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"4f24459b6d283755bb63b67738b724071bbc273b","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.36.tgz","fileCount":72,"integrity":"sha512-YtOe2IE2iSamcgU4UlELheLs54bl3Bj1RvHwKc+qEYyVJ6naantHKYVgEd85YKQvDNIWo/OVxMaXwVcM4eRomQ==","signatures":[{"sig":"MEUCIQCGl4gW1tPBn0RHEWIMiae/ggm8vIKYestNSZnD87mHWgIgPTROdE75x+dDpo/UzoJSofXcx+GSZBbk+8z1LQjhfM0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1271748},"type":"module","gitHead":"141176e1cc876fc2082de8b72ff2c19a11ff1b30","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.36_1784092225323_0.48313976055529473","host":"s3://npm-registry-packages-npm-production"}},"2026.7.37":{"name":"openclaw-nostr","version":"2026.7.37","_id":"openclaw-nostr@2026.7.37","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"c69af70fceaa2e32b8482cb5def96b0a4e1aea4d","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.37.tgz","fileCount":72,"integrity":"sha512-2hjogAMCNkuSv8zpdzUtGywf+aFlzRp+PzOc28yms95jByXWe5jiCL8/Cw0/9KpISTVV5WY+nEjAIs/mpRYsDQ==","signatures":[{"sig":"MEUCIQDuHzD+OYXsM2i8H8MkG3P/7LdiHteudbnqjanQlhqi5QIgArOTmg4oFj1ziXzcN2eb3zRgN1Tl86vDDTuKibIPUbA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1276821},"type":"module","gitHead":"ce7d5a639cf138bdd15f8e3be6a92b66989222ad","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.37_1784101130234_0.9159688739686773","host":"s3://npm-registry-packages-npm-production"}},"2026.7.38":{"name":"openclaw-nostr","version":"2026.7.38","_id":"openclaw-nostr@2026.7.38","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"c93ef33ded2d590f1446a05b3530b40840f9e89d","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.38.tgz","fileCount":72,"integrity":"sha512-Iao/4/HSuX0fOz2VRYt4XS3BOPE5Lk3GMUa1Ab9lVL56qTsEybZsQy3QnB9hmVXVfOXFHF+MLSh39HiuvVh1Lw==","signatures":[{"sig":"MEUCIBZMc0ukT8tV+hwy//GhLs2n0Esm2aD2njg+GM1U8lvsAiEA+q9F1SNFE6pcA3y5q5le2p4wqvQ7scrTGSk2+iswzAE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1279517},"type":"module","gitHead":"55f44946323b9f7f3ab655b6237496052f0dfa31","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.38_1784141759898_0.15451984698864973","host":"s3://npm-registry-packages-npm-production"}},"2026.7.39":{"name":"openclaw-nostr","version":"2026.7.39","_id":"openclaw-nostr@2026.7.39","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"134742bc908b86fccec2e128a9de7e9643e6086c","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.39.tgz","fileCount":72,"integrity":"sha512-k/3q0124+58JG7ARjtzyMyhtmPY05dnCTapP1n29iApwW+AZtYhltziCPkcrUx2vDdq99490gqeiyNNfXLyU/Q==","signatures":[{"sig":"MEQCIHgIgFjKwdjKNSRei2fLBpvBdEhZcw4/QwVcC61EvXUGAiAEK0lk3I9NMLjbKtnp6Q3DV3q9cIzOeFyH+oQcpetvNg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1280468},"type":"module","gitHead":"745fed1614ae36ecd363f578bcbed2d65c48a8d7","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.39_1784439143793_0.05985866104540083","host":"s3://npm-registry-packages-npm-production"}},"2026.7.40":{"name":"openclaw-nostr","version":"2026.7.40","_id":"openclaw-nostr@2026.7.40","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"2a3bf573cbf3dec4e81590d1feeda19054c9eebc","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.40.tgz","fileCount":72,"integrity":"sha512-14tlm53YAdt2bFlcy8qjJpKHg6f6xuezF+E2ekl8VBOURRozSg3rGz+yYaWrxPWzc3wwxEf32QZgro4xKMp+bQ==","signatures":[{"sig":"MEYCIQCiTkYw3/880imduyccFpkslyKBK/CkyaxFAJvEywEJRQIhAIFxedl7Ilw2Qfg9tKCA2NibJcN12JPrq7JbXUUW8GRY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1282255},"type":"module","gitHead":"7211e4ae10b5174e01312b0a3467a84360a23eeb","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.40_1784440250355_0.8572676953424532","host":"s3://npm-registry-packages-npm-production"}},"2026.7.41":{"name":"openclaw-nostr","version":"2026.7.41","_id":"openclaw-nostr@2026.7.41","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"411ca0d1ece7e54bb5c1e61c37e4526b5cd7081d","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.41.tgz","fileCount":72,"integrity":"sha512-oqgdxryiUMaDjqYBNLHfqwlRgYtUqgWU1ZbYoNOMTxfTOswzpyGcX94MDBO09DyHsRgdBwVeDUTznUzrP2Unrw==","signatures":[{"sig":"MEUCIQDQAv6ekJHAttKOr+dmYjbarG5dhhUNnnUcTytU+ntkGwIgMsvWC0nal8AwGRoH0xfOio4vUANpngoYYfQHoAHuBz4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1315916},"type":"module","gitHead":"536c09f2086a504281e4a2d12136592dd51e0254","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.41_1784493656111_0.5587785795237561","host":"s3://npm-registry-packages-npm-production"}},"2026.7.42":{"name":"openclaw-nostr","version":"2026.7.42","_id":"openclaw-nostr@2026.7.42","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"243045e1dc471f1d78cfb632ab3e04ac06305acb","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.42.tgz","fileCount":74,"integrity":"sha512-EBK7GgxrxZcVjNmbMbHbR1/ItmpFkVdzinJ17OmgrpbSgdjd+hd7VR++/tCfKWftEhDBNvVfTN9iCVk8TnpKYQ==","signatures":[{"sig":"MEUCIQDYAt5HC+hfs/oppibqtIGQ/kKRt1k9HuKNxlxyUHQV3wIgaNJPTPGi1yhXIey1l4F8ubSjeH8tQXANheW+m7hUHVs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1356343},"type":"module","gitHead":"9ca35d4c0f86f4fe84071d6f9bd5ce1ef32592ee","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.42_1784516149520_0.6402120346055349","host":"s3://npm-registry-packages-npm-production"}},"2026.7.43":{"name":"openclaw-nostr","version":"2026.7.43","_id":"openclaw-nostr@2026.7.43","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"835ed8594901d00c149a24c414cff18f30fd916e","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.43.tgz","fileCount":74,"integrity":"sha512-OcbDNo+AL8Yrbjj6Yek5INtZbPSM+Ca4LW9dn4JWeuAOYWFTpfFG2pHfa1zjAsMJI4RXKFRs7w6rQwFJHHcE0A==","signatures":[{"sig":"MEUCIQDrNFJ08sKdlGlyAfd1gyZhgLx1a92Izucoml6rXlx3RAIgFvxyaS8K4D6z1Jk/yyK0ISndmiTSHsLjCb2CbleS3+0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1357097},"type":"module","gitHead":"6e84e0733cd6501d32c920e98767e809d6882555","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.43_1784524187572_0.6755322634629262","host":"s3://npm-registry-packages-npm-production"}},"2026.7.44":{"name":"openclaw-nostr","version":"2026.7.44","_id":"openclaw-nostr@2026.7.44","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"0b85881a15b9952767518b61e0c4f1d3bc983375","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.44.tgz","fileCount":76,"integrity":"sha512-INbeFo8cLTEK3BqXrgLZgNYjG71TlKWI7PJeUy60A+mpGhgVKJijAtoppqtAcBM15VBQIkE66XTDYPgkw6xaUw==","signatures":[{"sig":"MEUCIQCk795qbOhVcX798GNme7Uyh5C9fteAa6RdV8f1cX5OngIgOu+Mbpo6DPDuACzT7re355O5Ln+DMwN1L60qJUBt1Ak=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1376486},"type":"module","gitHead":"7c6b228a166f2d5ed034a9303e40c496d86a27a6","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.44_1784560332655_0.12535206039849056","host":"s3://npm-registry-packages-npm-production"}},"2026.7.45":{"name":"openclaw-nostr","version":"2026.7.45","_id":"openclaw-nostr@2026.7.45","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"2277b911757ff75dd94cb9be9c2683d1b1e7ad81","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.45.tgz","fileCount":76,"integrity":"sha512-rnqRerJM0bebBhreeiCUKbiDi4FBhcRf/fPCSSfGQYJ8V2FVtfKxST1PvIWEWGQ9fQcqYKCjjuHpk0e1KEB+gw==","signatures":[{"sig":"MEUCIAbvAEdZ1VujifgzKk5Hajne7oUjQsNyNC6SC0J8tMjAAiEA7NRNZMVg8q6aUYiiVO0lBBWlYbEs1/VsWjDMRoUzpTs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1382196},"type":"module","gitHead":"51604d78de82c1ce64c3950f8f1dd3056bc8dece","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.45_1784588447428_0.06792407950239121","host":"s3://npm-registry-packages-npm-production"}},"2026.7.46":{"name":"openclaw-nostr","version":"2026.7.46","_id":"openclaw-nostr@2026.7.46","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"3ebf0da66fb84508fa5765304f377ef3b1cfb226","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.46.tgz","fileCount":77,"integrity":"sha512-3joyvINja/7saCY9wRpAlj81lpjwDcQLTq7lQB4AecrvJjyyDsfpfo/dAyu9SUvwC0nziHeN96OlEvUlbEZMfg==","signatures":[{"sig":"MEQCIC5vxqM606Bqbmb2eCPB0vXNlCdkikFpQhk5R8jrCjxyAiBl2CxbRVZcicEaBoatRd7afrF98YjGaiV/sVpQHtQXlA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1386196},"type":"module","gitHead":"ba366fe29f2e18974433e828c5ca32cf7331fe67","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.46_1784589445297_0.5082983528394427","host":"s3://npm-registry-packages-npm-production"}},"2026.7.47":{"name":"openclaw-nostr","version":"2026.7.47","_id":"openclaw-nostr@2026.7.47","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"98981850cf2c8b28318233459848f6c51cf8f689","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.47.tgz","fileCount":79,"integrity":"sha512-eEY/SSzHMAdq+fFvQfcvH+yg6tP7XBFt5xXZHP/b48tHUaNFm+6hRlsoc9R/QuqbdRG2bvnd22MomDnSZ+vKHg==","signatures":[{"sig":"MEYCIQD/C7GTw0L2BG8L0U/F/78dahiRRbJPUPz14/OUNhd1PQIhAKs6apW3Tqg2tcOT3F9vtUjTWcMQ8i+PgnWrCI9r4Hpe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1392223},"type":"module","gitHead":"10095273478adbd4cfc75ee63754c6c40421f350","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.47_1784619772024_0.1661939736678375","host":"s3://npm-registry-packages-npm-production"}},"2026.7.48":{"name":"openclaw-nostr","version":"2026.7.48","_id":"openclaw-nostr@2026.7.48","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"5fb8f20460619617b58d9c7cccf24e4196c845ab","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.48.tgz","fileCount":79,"integrity":"sha512-im+hxjX0OEHSSs3H/yOmCFYLXzW3XwoahoU891Y0XOX5xF2U4y12Ld9JZQwYp6/+d/gRF005z2Ok+yUo9XbWHQ==","signatures":[{"sig":"MEUCIAt8O+GN+NeBH7k7ASOb+nzG1pbBSdMn2oYYt2rAYwVwAiEAyo0KEvGm5PnYn5veArDjbNXpVe8vAPIe/gJD917Vafc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1393073},"type":"module","gitHead":"449fedcb07e96672d3f25f60b6b74e94c174ef36","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.48_1784658309753_0.9172953280517855","host":"s3://npm-registry-packages-npm-production"}},"2026.7.49":{"name":"openclaw-nostr","version":"2026.7.49","_id":"openclaw-nostr@2026.7.49","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"305a636e4fbc2da8bb4b2b06d94da49ead98323b","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.49.tgz","fileCount":79,"integrity":"sha512-jaU+33oI6KOAJgRiZZ6DrmPGzozIACPu4KK1xmueU67S6X+GoSED+yTE9X+nvVtTJTA4CK68bopcIo++yEngPQ==","signatures":[{"sig":"MEQCIEw4fUDcChSZy65CuZB+0CK8oDeyqw2CeF7PwPal5X9+AiBRvsEr5KkADlGTP3nh+NQ9+K8rGxjzZw1/8l+Ybl6YsA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1394565},"type":"module","gitHead":"993a0df41aaf15b8689fdab054ebac43036f3d7c","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.49_1784692594164_0.08972956327468751","host":"s3://npm-registry-packages-npm-production"}},"2026.7.50":{"name":"openclaw-nostr","version":"2026.7.50","_id":"openclaw-nostr@2026.7.50","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"3090ac5613d5b805a11cdbc3fbbcbc65203aa5c1","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.50.tgz","fileCount":79,"integrity":"sha512-CiYK4GiMwVWg1KpiaWWOX8Gk6ilQJxJdYyEkhnLSk6BkGxrvPUidUzlozUS8A2+1eFuv+07xnMmmoT+rSpn0FQ==","signatures":[{"sig":"MEUCIQDRl8Op8cdTEWFUOwlDHo/YVNx9iELhsU529dZvpCcWIAIgaMDAkIOjqfU5n+0yb8pfazpBERPIgsK+fRDx1TWkNho=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1398746},"type":"module","gitHead":"689a9d2f2ba5d669dd1a3427c8ad7cc5534cdd2d","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.50_1784698457436_0.729519560727006","host":"s3://npm-registry-packages-npm-production"}},"2026.7.51":{"name":"openclaw-nostr","version":"2026.7.51","_id":"openclaw-nostr@2026.7.51","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"02ff4976089f690d318ca722f03854b925a47eed","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.51.tgz","fileCount":79,"integrity":"sha512-9IMWcBcudvYdsjPlVaLck/yhbE6oLStzly4fvAGvvUh7sQgO5aMpc0ghwEkYCVZFdOMLRM6okkPUyj70YEHhLA==","signatures":[{"sig":"MEYCIQDRas+eCrRl5ZtTxLj92FVQeA4qd9WmFIKDvvPKrzlk/QIhAKNP2ROZZcNX/2BXVceg+S4+EwFucO34CwAZjD3IdmLo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1411884},"type":"module","gitHead":"749e587c98304b01d7d8f96a00192087a1c28bac","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":">=2026.4.15","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.51_1785026203924_0.359920652984536","host":"s3://npm-registry-packages-npm-production"}},"2026.7.52":{"name":"openclaw-nostr","version":"2026.7.52","_id":"openclaw-nostr@2026.7.52","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"951a75f3c510a5495b7d035d5296f4b5a89a4e9f","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.52.tgz","fileCount":87,"integrity":"sha512-q8MCNTyDiQN6PWNoFaam3XIZ/pgG6lsA7ykgn7CiTbdFAQlEwtSlIbFogHHnBWaMDJGnIGQeEsBj2s9mV6Hnuw==","signatures":[{"sig":"MEYCIQCWJkcuj5BEUnG+u7D/mz7jM9T48Ywueo3BZV/DL++gFQIhAOi6ssopmY4Ed4SeynMNHIajHaIeh/2ePRtyvN1DTo5K","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1493915},"type":"module","gitHead":"f57a9f9fb488830179ced0009ac7a151af3cf812","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.52_1785101736042_0.7301170574918896","host":"s3://npm-registry-packages-npm-production"}},"2026.7.53":{"name":"openclaw-nostr","version":"2026.7.53","_id":"openclaw-nostr@2026.7.53","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"43f7bf10e4828d0b8281e0478ba56923462a536e","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.53.tgz","fileCount":91,"integrity":"sha512-jW2OLWl68X7534w0wVbWJDYjzK0ihxgorxXVv6/PnxmWo3AhRPK6v712GgloHl2UqCwnRcWrJPb5PnggLbtFsw==","signatures":[{"sig":"MEYCIQCt/hxOsArfCiZfa172SRiF/BbvbHO0cGJGXU/IR8fmwQIhAKXCcY7Dbgm7mF6pltQSnrQXRwhzQe9iKsgCVwo36EhM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1591531},"type":"module","gitHead":"526f1dada3b68c5f41688d2240bbd7f02436ae5c","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.53_1785203636805_0.8220304028450147","host":"s3://npm-registry-packages-npm-production"}},"2026.7.54":{"name":"openclaw-nostr","version":"2026.7.54","_id":"openclaw-nostr@2026.7.54","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"f68c0ce2608945153b470c4ee25dd31386a85610","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.54.tgz","fileCount":93,"integrity":"sha512-4kDV6Cmoh5bHL9j1nfgcA52PrOj/V0Ll4reX/lipDZoKPNWy2A2uiSc7jos5dOw0wmhrjtS27h5r3eHMu3ejfg==","signatures":[{"sig":"MEYCIQDX2WSWO7CChRux+YgMBSwDeLSwxKmMhWMtKBtDea7mCgIhANZ7h4ybOdrx1W1S3Mngw7RL+w027WRj18UPMgNb3O1I","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1608807},"type":"module","gitHead":"753dc51f0d46e29140c614753e8591db5a7d38aa","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.54_1785207672669_0.14609453214257195","host":"s3://npm-registry-packages-npm-production"}},"2026.7.55":{"name":"openclaw-nostr","version":"2026.7.55","_id":"openclaw-nostr@2026.7.55","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"f4246eadca11429fe5fedb72ff211c22a0295ed3","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.55.tgz","fileCount":95,"integrity":"sha512-AD6HvEtJ74eugnKtVIxB/IDZkXn7eHimnq4wQGeWWr/EU961ZSH6A9K+qDyd89RHV7xs76xCo1YAWEdLsBr9gg==","signatures":[{"sig":"MEQCID/bn5VGzulw4KuzWekFi7cV8FHzPjabn4vHlR2HREXgAiAduwvkqZahsZ9IEi0ZiClzs1yGk2fsnv5IPRj+njfGkQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1626733},"type":"module","gitHead":"9fc799b3ffd451278091be1861dd4a290cd64374","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.55_1785214782200_0.6589887982160738","host":"s3://npm-registry-packages-npm-production"}},"2026.7.56":{"name":"openclaw-nostr","version":"2026.7.56","_id":"openclaw-nostr@2026.7.56","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"6fb0f45f3e1d171f3c6693e3fe1a469689bed318","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.7.56.tgz","fileCount":97,"integrity":"sha512-+j1woV+LQz7iExF67wzsK4EY42tOMeId4iq1v7ejlM/8PK/jtUh+XPWzB4ccv0MLf2MmLZODehCs1eQmwManvA==","signatures":[{"sig":"MEUCIEK8j35SiEiNexinhW/+98AqqkiPzX3fq22nYsohsMpVAiEA4SabLnbqkuz9kLCmkaCCEn867XjoU7DUKkFFCbcXsIk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1660351},"type":"module","gitHead":"ca8ef36a2aaa04534fa6756d36967d8aa1c5ce1f","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.7.56_1785219344538_0.22887718829637604","host":"s3://npm-registry-packages-npm-production"}},"2026.8.13":{"name":"openclaw-nostr","version":"2026.8.13","_id":"openclaw-nostr@2026.8.13","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"ab8a7fc77258add4df9a6c105465f9f09d20102f","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.8.13.tgz","fileCount":114,"integrity":"sha512-HsdvTuhkXr1dXkuMLmdpa03vQQGa1zsy/duCAGXDGLLSUBGIDiHz7oMA/1gTv+grJE0KsLJJFaHAlBaKCRQy6Q==","signatures":[{"sig":"MEYCIQDL4oguzzWDmIjNJw5YH8KPwSJWIIrUCESCL1peRAlP3wIhAMDAyU06UP4V4YYPWky35Um7sYCemzJZ+/3RIMHoWL/5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2492699},"type":"module","gitHead":"b7b07c6537a6e4e4be0ae57e284ae71d8a8e5d0f","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.8.13_1786589914244_0.03692403739341943","host":"s3://npm-registry-packages-npm-production"}},"2026.8.20":{"name":"openclaw-nostr","version":"2026.8.20","_id":"openclaw-nostr@2026.8.20","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"1a786efa015dac466f90ec42f00c3a03702ebdcc","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.8.20.tgz","fileCount":117,"integrity":"sha512-nvu34i3AYxyyffharGezeUQvl5wc39M+LKyfHBV2epxhZ07Cm9urKkOxCjEvbnLzzjETfkvxR/S57tlVrV/lyQ==","signatures":[{"sig":"MEYCIQDqzhxDOPhlpiQdzK5LUKMlTFO4GmGAbpCGS6xGOpUycAIhANltVm1V5tNadN8SiK0EhzJJs5VRAlr68dkNnm8fzvkP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2519578},"type":"module","gitHead":"e1086c28d69c2124d745becda6bcfde2b6517a4d","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.8.20_1787239799124_0.4849897237135026","host":"s3://npm-registry-packages-npm-production"}},"2026.8.22":{"name":"openclaw-nostr","version":"2026.8.22","_id":"openclaw-nostr@2026.8.22","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"b46d60fcb3108d9ff4a8cc7c94604e5849f63771","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.8.22.tgz","fileCount":120,"integrity":"sha512-o1d0P65zKL4dkdpHKc3rV+vr4B6D2x0BMUatfqtAdpxLeu7jAo31N15rg2al9fTapVpgb4duJO3sBctW4yeobg==","signatures":[{"sig":"MEUCIQDHyYIncXZItZNwuuHByZcHJQNqLlas802/2eI5YwzSbAIgIYmVCOwKj/cCO/MjPioLM0er+fFpb9A5KsrI2Hwr6Ic=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2558859},"type":"module","gitHead":"42519a7995204a19b184f1c2f3381b577d7a0669","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.8.22_1787370696860_0.6432671659050209","host":"s3://npm-registry-packages-npm-production"}},"2026.8.25":{"name":"openclaw-nostr","version":"2026.8.25","_id":"openclaw-nostr@2026.8.25","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"48a7743f34eb6bef55b483681adb96edd0e72ce3","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.8.25.tgz","fileCount":120,"integrity":"sha512-HVjBz5Nui0IaifyzY9vwzVRPAUK5MlZ56S+EbL2sYSHoRbKpHHpNlF04IzZiYaYxDMc0aFsCt3fd+rTgAWk2Ag==","signatures":[{"sig":"MEUCIQCpAWYKhOETJuLE1MnrNxyOZpErnl5A/GwMgSu83MSE9AIgXujxgG9kOugflv7gE1bmpPlbrfBR08bsmDwI4pFjhyY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2644571},"type":"module","gitHead":"47933a39b9c401e953f91c9fd45c32c9611dcd1f","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.8.25_1787705960444_0.9472834365189837","host":"s3://npm-registry-packages-npm-production"}},"2026.8.26":{"name":"openclaw-nostr","version":"2026.8.26","_id":"openclaw-nostr@2026.8.26","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"a6f3b7d74e7e6f4df894f450b503732568fddd52","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.8.26.tgz","fileCount":120,"integrity":"sha512-jjuzflgxzl0JCmmvGKzuLsMK3yiA/B4vsjVegIrTRWQppAtvrozie9Th/UaNLpJq6QYm+7R8vDwG1Ibt/Ovxvw==","signatures":[{"sig":"MEQCIG/gvfPHqzJ3CLi8IC98J4sdp/7paj6nOTSGQGUvlxDDAiBbWIU5guU6GbOsxbiJ0pndTxmEprWlCtThyi1Ggh7y/g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2656618},"type":"module","gitHead":"c386454e921f8f9b673c363ff22d579533b51e5b","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.8.26_1787728643395_0.24309248385770044","host":"s3://npm-registry-packages-npm-production"}},"2026.8.27":{"name":"openclaw-nostr","version":"2026.8.27","_id":"openclaw-nostr@2026.8.27","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"da3d02b72c035d12c9f37589f7e057dd4f80dc24","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.8.27.tgz","fileCount":120,"integrity":"sha512-KjF8nIxchaI1mQ1+jzFQbTGsqgMMh8pBoZ4+3bFGnDEQqEMVIkI9dg7m+X2mUwSGvbBpcz3qe3A7uSnwUE+dqw==","signatures":[{"sig":"MEYCIQDwhTY+Ofo2I122E5PoUfz4gcucr7U1v2mZj1B+UVrRTQIhAMkdQaaK0i7Pir99zkdSRXDJau0rOA55NE5EaU3R1RcA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2680139},"type":"module","gitHead":"da15b29226a7491bf154d997f86f76a39f796e15","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.8.27_1787810827134_0.6143550147809969","host":"s3://npm-registry-packages-npm-production"}},"2026.8.30":{"name":"openclaw-nostr","version":"2026.8.30","_id":"openclaw-nostr@2026.8.30","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"45288e77aab99b67c5cff9368d6d2a8c0e950170","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.8.30.tgz","fileCount":124,"integrity":"sha512-qOUJ5I6z6XEe2JBSf6KFHH8BraGANunSTSQffbMDm8+iXPyI/BGhCbJ7PK059mev1oDTc5Kdj1XRliTwfR9cbA==","signatures":[{"sig":"MEUCIBmNFmGUSEo0jVxZ2XeLLVnxD3gPe//Ia3NcLM9pUWpnAiEAgPIVp1iZ0pkY6Yn+YhFipDgA437mgEhzXKp7hPMBr8Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2755001},"type":"module","gitHead":"6044f252275c9deafa020938bf7ea41c4c384712","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"25.9.0","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.8.30_1788062654728_0.18494417375777084","host":"s3://npm-registry-packages-npm-production"}},"2026.8.31":{"name":"openclaw-nostr","version":"2026.8.31","_id":"openclaw-nostr@2026.8.31","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"1981fa1618e58d7e7a9d265ffc50a0fafc3cc7df","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.8.31.tgz","fileCount":127,"integrity":"sha512-sZfej2QbYOhcs6VkgWPpeLOrFC51YVNj1qwJhPYGqRzQYUDe9lD4dtxGCXtHTi6zBqPCW8Fhuc6Bp5LiDxNCzw==","signatures":[{"sig":"MEQCIG6NdTJ2WCp1HAil/JHLjTlEQBkvfqvcjYOGRMwPTZjZAiAa3N8Jxt/PziWIpjzK7/9TpxUpCfvBsLRGSQ7KE1TQ7g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2788666},"type":"module","gitHead":"ae4f555363563910e82799a0750c7ef9b629002d","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"26.8.1","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.8.31_1788248211593_0.4001107689152421","host":"s3://npm-registry-packages-npm-production"}},"2026.9.2":{"name":"openclaw-nostr","version":"2026.9.2","_id":"openclaw-nostr@2026.9.2","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"4eea1bebb2f7d4c7c1f20d87f896b29698f96a2a","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.9.2.tgz","fileCount":128,"integrity":"sha512-a3p/rqTIJy86BqGwN244hskYzSmhvnQl47lNeC/+8IY7qIIuy8nZsk+xcoiw/9Pam8xPYHfCQSBRXsHGSW88+w==","signatures":[{"sig":"MEUCID4feQcuJp6Mjpu/CMDWnGb4OqQioRwDXb84yFi96d9zAiEAykmevPaE5ceka/TvW2ZTA2fnzTDsRUFzXEkLZ4H/YeI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2805431},"type":"module","gitHead":"10bab030942fb31dcceb4e3c6edc239a275bd6d9","scripts":{"build":"tsc --noEmit --noCheck --module NodeNext --moduleResolution NodeNext --target ES2023 index.ts api.ts runtime-api.ts setup-api.ts setup-entry.ts src/*.ts test/setup.ts vitest.config.ts","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"26.8.1","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.9.2_1788335279110_0.12297438963846208","host":"s3://npm-registry-packages-npm-production"}},"2026.9.3":{"name":"openclaw-nostr","version":"2026.9.3","_id":"openclaw-nostr@2026.9.3","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"275aca1878b2ab3101aa16dbb1f780e7ad279d94","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.9.3.tgz","fileCount":128,"integrity":"sha512-p4MuZt5uuITki060LWtWovCeXk5HGE4ieSNjFiUy+aIQG2oPvHUX1kmL5VdM8WCBambQU8VdukeXGUuaLyhJsw==","signatures":[{"sig":"MEQCIBkW3dUe4M4uutoZfq3PMwrCWLCuOjwwP/dJJDNCtqXfAiBYXpEsAjfSnEsoMdtpN8iJiIxsNpnLqNUxH3iOoabGlw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2816204},"type":"module","gitHead":"dec89bd758dd34814135e70104f77d154e2bfab5","scripts":{"build":"tsc -p tsconfig.json --noCheck","typecheck":"tsc -p tsconfig.json","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"26.8.1","dependencies":{"ws":"^8.18.0","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.9.3_1788384232887_0.07658060948684686","host":"s3://npm-registry-packages-npm-production"}},"2026.9.4":{"name":"openclaw-nostr","version":"2026.9.4","_id":"openclaw-nostr@2026.9.4","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"57a4c1e8afd53ea9df5eabd6f529ddd58f96c9f5","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.9.4.tgz","fileCount":128,"integrity":"sha512-Y7aHKnzxYrO1O9UyPfK3fUgAuUYQUbVyruhear5Hpss1oJ5idqkyYwwJuksxWubfWBEhQHtU8pO/9uOvLRMcGg==","signatures":[{"sig":"MEUCIQCqKivu9moN4EJykwdklsLvIrKVaazBEiC2IfacGJ3aZgIgTbOfJzoVbQa6mQ1oyIiRq60ZGGYFTfh/ixdJmoC8KBI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2839112},"type":"module","gitHead":"650c848b7ebdbdd9b7fb5e7f258198683da504f1","scripts":{"build":"tsc -p tsconfig.json --noCheck","typecheck":"tsc -p tsconfig.json","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.4.15"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.4.15"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.4.15"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"26.8.1","dependencies":{"ws":"^8.18.0","zod":"4.4.3","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.4.15"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.9.4_1788420312418_0.3471532611127901","host":"s3://npm-registry-packages-npm-production"}},"2026.9.5":{"name":"openclaw-nostr","version":"2026.9.5","_id":"openclaw-nostr@2026.9.5","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"99e4fda62f297250644d33e603ff34ff4dea92ea","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.9.5.tgz","fileCount":129,"integrity":"sha512-p3LSIUcXakgQ3yNW9gGSQ4xm/tWL6WcAffJEYQCwfYhsSTpc1kaCCxmDMGFVn/sDDh8bdLadIqi4YWlibllaHg==","signatures":[{"sig":"MEYCIQDHGeEAO8+sCBYxQMEDDvr4l25eLlsD5LtW8TmS+3eWFQIhAOBkvQ/7mJjV39lTPk2HypdKoeGBqhGUNtJhRsGE2KXV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2845903},"type":"module","gitHead":"f90618e842178417e62253e3820ee505ca895063","scripts":{"build":"tsc -p tsconfig.json --noCheck","typecheck":"tsc -p tsconfig.json","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs","check:sdk-subpaths":"node scripts/check-sdk-subpaths.mjs latest beta extended-stable"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.6.1"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.6.1"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.6.1"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"26.8.1","dependencies":{"ws":"^8.18.0","zod":"4.4.3","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.6.1"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.9.5_1788423272325_0.3206759963643777","host":"s3://npm-registry-packages-npm-production"}},"2026.9.6":{"name":"openclaw-nostr","version":"2026.9.6","_id":"openclaw-nostr@2026.9.6","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"72cded5acd5f8211372bc4d4eafebbef84d9a8e7","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.9.6.tgz","fileCount":130,"integrity":"sha512-5zxYgCSmEEj5lvbN+efiC+apTHtUKGS5xqISFCizwFwIsiFDJeOJA8NyUG4hXZOwMuszyKXyJ1HqhcP4ilim5w==","signatures":[{"sig":"MEYCIQD+eHUTLwSdYL6J9X+yI1oz/FFSx1dEqs9pY+6c5L7QigIhAOZkhtHXfIDMSgKcjoyGvl03RSFNi8wD9FUeZW9TlSZu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2855713},"type":"module","gitHead":"9a604635f94a03cf7aac885a292777074585bfe0","scripts":{"build":"tsc -p tsconfig.json --noCheck","typecheck":"tsc -p tsconfig.json","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs","check:sdk-subpaths":"node scripts/check-sdk-subpaths.mjs latest beta extended-stable"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.6.1"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.6.1"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.6.1"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"26.8.1","dependencies":{"ws":"^8.18.0","zod":"4.4.3","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.6.1"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.9.6_1788426977868_0.25500734801096203","host":"s3://npm-registry-packages-npm-production"}},"2026.9.7":{"name":"openclaw-nostr","version":"2026.9.7","_id":"openclaw-nostr@2026.9.7","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"b81aca076076e6dffb544297754f1ba0fb3cd857","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.9.7.tgz","fileCount":74,"integrity":"sha512-cCqeS+XoBweYGPt1esNF/RfXaeJCU4gBee6IUO2TidwkoiLuFn8LVoSvCcykRE9Ccs8aUIkwOYRemcULqUhB0g==","signatures":[{"sig":"MEUCIQDPSkbslcHfzVcudsrWz9rGuxZqouJnZitBMhveeqhlrwIgOsZUNTUL1pJ51ylEPx82OJi5/vYNqI6AQG3MdtuoPc0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1737092},"main":"./index.ts","type":"module","exports":{".":"./index.ts","./api":"./api.ts","./setup-api":"./setup-api.ts","./runtime-api":"./runtime-api.ts","./setup-entry":"./setup-entry.ts"},"gitHead":"5a0c6a282cddc87ab5c2af0c4d92e8e219633e17","scripts":{"build":"tsc -p tsconfig.json --noCheck","typecheck":"tsc -p tsconfig.json","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs","check:sdk-subpaths":"node scripts/check-sdk-subpaths.mjs latest beta extended-stable","check:hermetic-pack":"bash scripts/hermetic-pack-check.sh"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.6.1"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.6.1"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.6.1"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"26.8.1","dependencies":{"ws":"^8.18.0","zod":"4.4.3","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"^2026.7.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.6.1"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.9.7_1788476462364_0.4756994849345586","host":"s3://npm-registry-packages-npm-production"}},"2026.9.12":{"name":"openclaw-nostr","version":"2026.9.12","_id":"openclaw-nostr@2026.9.12","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"68545360321d4e3c8667b5cb2151601affbdc1b3","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.9.12.tgz","fileCount":74,"integrity":"sha512-hA+BUMEZB1DfN7DDVZ1GMmeQwsSMrrl+WXAgya98Z9W2m7D89uRhqCq58bdW2IhCDrKAfNTqKx55VbrBDYykFg==","signatures":[{"sig":"MEQCIA8og156I34DIxwFoDUpkHhTiG9+ImHaQoFfhjRcwmJ9AiAt+qPMs628oVUXaF3KVkrhP+srPAs2ss6azXY7jCTMAw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1752631},"main":"./index.ts","type":"module","exports":{".":"./index.ts","./api":"./api.ts","./setup-api":"./setup-api.ts","./runtime-api":"./runtime-api.ts","./setup-entry":"./setup-entry.ts"},"gitHead":"01620888c4e0e1a8d148d9ddb37bb8859722d44c","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs","check:host-members":"node scripts/check-host-members.mjs latest beta extended-stable","check:sdk-subpaths":"node scripts/check-sdk-subpaths.mjs latest beta extended-stable","check:hermetic-pack":"bash scripts/hermetic-pack-check.sh"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.6.1"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.6.1"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.6.1"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"11.12.1","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"26.8.1","dependencies":{"ws":"^8.18.0","zod":"4.4.3","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"2026.8.2","@types/ws":"^8.18.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.6.1"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.9.12_1788486764700_0.4199776573659071","host":"s3://npm-registry-packages-npm-production"}},"2026.9.14":{"name":"openclaw-nostr","version":"2026.9.14","_id":"openclaw-nostr@2026.9.14","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"efa6343d0d894dfc70128d07cdf58405847aa726","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.9.14.tgz","fileCount":74,"integrity":"sha512-cF9YzL2MzqngeqEKmneq6xQbffFo9O8R3b8xBS5qIJzqeM8RZXnwUe+CIguH0oHdowTt8RhG9FLvdaiqqZ7mNw==","signatures":[{"sig":"MEQCICo/nJgT4gDBLVaJLbKIic0Kb+lYaOJJEWHItCa6JHD5AiBbE4Ml0xYqeCDMbw/2iCq7yVDahvTGUQ0eDVPS4SbcPg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1765454},"main":"./index.ts","type":"module","exports":{".":"./index.ts","./api":"./api.ts","./setup-api":"./setup-api.ts","./runtime-api":"./runtime-api.ts","./setup-entry":"./setup-entry.ts"},"gitHead":"3caa4bb7951097e46fd584df3832a8e7678310a4","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs","check:host-members":"node scripts/check-host-members.mjs latest beta extended-stable","check:sdk-subpaths":"node scripts/check-sdk-subpaths.mjs latest beta extended-stable","check:hermetic-pack":"bash scripts/hermetic-pack-check.sh"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.6.1"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.6.1"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.6.1"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"12.0.2","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"26.8.1","dependencies":{"ws":"^8.18.0","zod":"4.4.3","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.23.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"2026.9.1","@types/ws":"^8.18.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.6.1"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.9.14_1788643065433_0.8755453335637098","host":"s3://npm-registry-packages-npm-production"}},"2026.9.15":{"name":"openclaw-nostr","version":"2026.9.15","_id":"openclaw-nostr@2026.9.15","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"f1366391f0e16cd979a5d500574653dcead857f1","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.9.15.tgz","fileCount":74,"integrity":"sha512-fYo/Jt4CYTaL8xkfhcrAUqRJWZUSBynpEPUWtKK++e76POF+jkYuT+4GYFVy8lGhIoyfwmKlafTKIpuK03Pw7w==","signatures":[{"sig":"MEYCIQCbAONf7rY1fDKDQSpLr18JGLB2VOFiyKjoZdwq6MBq2wIhAOJa1fkZtDYtjAH+y9uTXuxdlXZeU/G4isHx+AF9qnnh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1773221},"main":"./index.ts","type":"module","exports":{".":"./index.ts","./api":"./api.ts","./setup-api":"./setup-api.ts","./runtime-api":"./runtime-api.ts","./setup-entry":"./setup-entry.ts"},"gitHead":"327a9a3882c87fd550588782e75fe5de52127e44","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs","check:host-members":"node scripts/check-host-members.mjs latest beta extended-stable","check:sdk-subpaths":"node scripts/check-sdk-subpaths.mjs latest beta extended-stable","check:hermetic-pack":"bash scripts/hermetic-pack-check.sh"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.6.1"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.6.1"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.6.1"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"12.0.2","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"26.8.1","dependencies":{"ws":"^8.18.0","zod":"4.4.3","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.25.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"2026.9.1","@types/ws":"^8.18.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.6.1"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.9.15_1788650529635_0.3346057775789899","host":"s3://npm-registry-packages-npm-production"}},"2026.9.16":{"name":"openclaw-nostr","version":"2026.9.16","_id":"openclaw-nostr@2026.9.16","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"53659b1621f5a714cf71928613d597b0c5eb6ed9","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.9.16.tgz","fileCount":74,"integrity":"sha512-o8bqF3hLgPf4xGRe3gAhwKue1QOvKZNJu/de2CIaU9iuMGqKd/b74sri4VzXuNGJepHBc5+XHr8PkGlffrbneA==","signatures":[{"sig":"MEUCIGgkSX/LTqRqAjh8wwOkdjp2+GdkpPtrDhERpDQ6R9pWAiEAjZOWjDxS44Tjxz4qRU5DtkGwydQ/ijZGGsazum/s9No=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1775307},"main":"./index.ts","type":"module","exports":{".":"./index.ts","./api":"./api.ts","./setup-api":"./setup-api.ts","./runtime-api":"./runtime-api.ts","./setup-entry":"./setup-entry.ts"},"gitHead":"1de39b880b82ebe92b4e203808cb2eb713a320a5","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs","check:host-members":"node scripts/check-host-members.mjs latest beta extended-stable","check:sdk-subpaths":"node scripts/check-sdk-subpaths.mjs latest beta extended-stable","check:hermetic-pack":"bash scripts/hermetic-pack-check.sh"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.6.1"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.6.1"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.6.1"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"12.0.2","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"26.8.1","dependencies":{"ws":"^8.18.0","zod":"4.4.3","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.25.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"2026.9.1","@types/ws":"^8.18.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.6.1"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.9.16_1788671183726_0.988546604082577","host":"s3://npm-registry-packages-npm-production"}},"2026.9.45":{"name":"openclaw-nostr","version":"2026.9.45","_id":"openclaw-nostr@2026.9.45","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"dist":{"shasum":"2c96de9abfaa93836421b5d175f5df535bb86464","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.9.45.tgz","fileCount":79,"integrity":"sha512-Qqxgi+hwro/+qw9FTfOQFE+i9rtMUuG1+s09Xm+OEqHl+JhSOH4DsUs5q+tHUVJoihwX8/3EoKD+bdyeN0Ni2w==","signatures":[{"sig":"MEUCIEj7aCLD0MXTUemFCb3fCGUdN3bHQVHbDAIXo7UBbQ7QAiEAkzIG+N40HokyVAqLavi992UCIJOD57U3bq/bwf+JfPY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2122329},"main":"./index.ts","type":"module","exports":{".":"./index.ts","./api":"./api.ts","./setup-api":"./setup-api.ts","./runtime-api":"./runtime-api.ts","./setup-entry":"./setup-entry.ts"},"gitHead":"faf74325cd342edf3bc2a0265847270e97d2315c","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs","check:host-members":"node scripts/check-host-members.mjs latest beta extended-stable","check:sdk-subpaths":"node scripts/check-sdk-subpaths.mjs latest beta extended-stable","check:hermetic-pack":"bash scripts/hermetic-pack-check.sh"},"_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.6.1"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.6.1"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.6.1"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"12.0.2","description":"Nostr channel plugin for OpenClaw","directories":{},"_nodeVersion":"26.8.1","dependencies":{"ws":"^8.18.0","zod":"4.4.3","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.25.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"2026.9.1","@types/ws":"^8.18.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.6.1"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openclaw-nostr_2026.9.45_1788831510358_0.5959903198227019","host":"s3://npm-registry-packages-npm-production"}},"2026.9.56":{"_id":"openclaw-nostr@2026.9.56","dist":{"shasum":"79932b1e32baffe013535df7f2ee546ef62c0065","tarball":"https://registry.npmjs.org/openclaw-nostr/-/openclaw-nostr-2026.9.56.tgz","fileCount":86,"integrity":"sha512-GQ8ezdmuZOkyh7m07mYVSTQBG2J2RkNszUr/brHgDsFCq0fsMJWmCG9Lpj48h1wQcaiGpNFVgCLvnVNUL33wuA==","signatures":[{"sig":"MEUCIQDjlfr7BRSAEmjNO32Zcw2VSfzHH6/R1looV2nWRQ9oYwIgWIrqft2hPxIw/5QscxhF/7vzRYOvIU7GkfwneaSNCro=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIC4cFXhpV3kJVkF14uaYZW7NuBQYPdYhvYhUJ/dHpz4aAiBKzwT446dfd9BBLKJBGmX1bUSAh4eldn96LzJvtkcnlA=="}],"unpackedSize":2275006},"main":"./index.ts","name":"openclaw-nostr","type":"module","exports":{".":"./index.ts","./api":"./api.ts","./setup-api":"./setup-api.ts","./runtime-api":"./runtime-api.ts","./setup-entry":"./setup-entry.ts"},"gitHead":"31e5e7b28a22769276e8e5ff5bcde296c789f7c9","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json","test:scanner":"vitest run test/runtime-security-scanner.test.ts","test:bootstrap":"node --test test/nostr-claw-bootstrap.test.mjs","check:host-members":"node scripts/check-host-members.mjs latest beta extended-stable","check:sdk-subpaths":"node scripts/check-sdk-subpaths.mjs latest beta extended-stable","check:hermetic-pack":"bash scripts/hermetic-pack-check.sh","check:manifest-schema":"node scripts/generate-manifest-config-schema.mjs --check"},"version":"2026.9.56","_npmUser":{"name":"chebizarro","email":"chebizarro@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.6.1"},"bundle":{"stageRuntimeDependencies":true},"compat":{"pluginApi":">=2026.6.1"},"channel":{"id":"nostr","blurb":"Decentralized protocol; encrypted DMs via NIP-04 and NIP-17.","label":"Nostr","order":55,"docsPath":"/channels/nostr","docsLabel":"nostr","selectionLabel":"Nostr (NIP-04 + NIP-17 DMs)","quickstartAllowFrom":true},"install":{"npmSpec":"openclaw-nostr","localPath":"extensions/nostr","defaultChoice":"npm","minHostVersion":">=2026.6.1"},"release":{"publishToNpm":true},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./index.ts"],"runtimeSetupEntry":"./setup-entry.ts"},"_npmVersion":"12.0.2","description":"Nostr channel plugin for OpenClaw","directories":{},"maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"_nodeVersion":"26.8.1","dependencies":{"ws":"^8.18.0","zod":"4.4.3","cascadia-ts":"file:../cascadia-nips/generated/typescript","nostr-tools":"2.25.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","openclaw":"2026.9.1","@types/ws":"^8.18.1","typescript":"^5.5.0"},"peerDependencies":{"openclaw":">=2026.6.1"},"bundleDependencies":["cascadia-ts"],"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/openclaw-nostr_2026.9.56_1790464532676_0.4815603834767188"}}},"time":{"created":"2026-07-14T18:20:04.179Z","modified":"2026-09-26T23:15:32.923Z","2026.7.30":"2026-07-14T18:20:04.420Z","2026.7.31":"2026-07-14T19:45:04.448Z","2026.7.32":"2026-07-14T21:17:09.281Z","2026.7.33":"2026-07-15T00:09:05.266Z","2026.7.34":"2026-07-15T00:50:41.039Z","2026.7.35":"2026-07-15T02:03:14.914Z","2026.7.36":"2026-07-15T05:10:25.535Z","2026.7.37":"2026-07-15T07:38:50.416Z","2026.7.38":"2026-07-15T18:56:00.124Z","2026.7.39":"2026-07-19T05:32:23.944Z","2026.7.40":"2026-07-19T05:50:50.515Z","2026.7.41":"2026-07-19T20:40:56.343Z","2026.7.42":"2026-07-20T02:55:49.702Z","2026.7.43":"2026-07-20T05:09:47.778Z","2026.7.44":"2026-07-20T15:12:12.919Z","2026.7.45":"2026-07-20T23:00:47.593Z","2026.7.46":"2026-07-20T23:17:25.441Z","2026.7.47":"2026-07-21T07:42:52.182Z","2026.7.48":"2026-07-21T18:25:09.928Z","2026.7.49":"2026-07-22T03:56:34.290Z","2026.7.50":"2026-07-22T05:34:17.610Z","2026.7.51":"2026-07-26T00:36:44.082Z","2026.7.52":"2026-07-26T21:35:36.211Z","2026.7.53":"2026-07-28T01:53:57.044Z","2026.7.54":"2026-07-28T03:01:12.922Z","2026.7.55":"2026-07-28T04:59:42.357Z","2026.7.56":"2026-07-28T06:15:44.702Z","2026.8.13":"2026-08-13T02:58:34.461Z","2026.8.20":"2026-08-20T15:29:59.309Z","2026.8.22":"2026-08-22T03:51:37.025Z","2026.8.25":"2026-08-26T00:59:20.675Z","2026.8.26":"2026-08-26T07:17:23.571Z","2026.8.27":"2026-08-27T06:07:07.339Z","2026.8.30":"2026-08-30T04:04:14.914Z","2026.8.31":"2026-09-01T07:36:51.753Z","2026.9.2":"2026-09-02T07:47:59.301Z","2026.9.3":"2026-09-02T21:23:53.176Z","2026.9.4":"2026-09-03T07:25:12.582Z","2026.9.5":"2026-09-03T08:14:32.511Z","2026.9.6":"2026-09-03T09:16:18.026Z","2026.9.7":"2026-09-03T23:01:02.556Z","2026.9.12":"2026-09-04T01:52:44.841Z","2026.9.14":"2026-09-05T21:17:45.605Z","2026.9.15":"2026-09-05T23:22:09.783Z","2026.9.16":"2026-09-06T05:06:23.993Z","2026.9.45":"2026-09-08T01:38:30.515Z","2026.9.56":"2026-09-26T23:15:32.779Z"},"description":"Nostr channel plugin for OpenClaw","maintainers":[{"name":"chebizarro","email":"chebizarro@gmail.com"}],"readme":"# openclaw-nostr\n\nNostr channel plugin for OpenClaw — encrypted DMs, public notes, identity resolution, relay discovery, public channels, and 20+ NIP implementations.\n\n## Overview\n\nThis extension adds Nostr as a full-featured messaging and social channel to OpenClaw. It enables your agent to:\n\n- Receive and send encrypted DMs via NIP-04 and NIP-17 (gift-wrapped)\n- Publish and react to public notes (kind:1)\n- Resolve NIP-05 identities and discover relay capabilities\n- Create and moderate public channels (NIP-28)\n- Repost content, publish file metadata, and generate zap requests\n- Encrypt messages with NIP-44 versioned encryption\n- Authenticate to relays (NIP-42) and HTTP services (NIP-98)\n- Delegate signing to a remote NIP-46 bunker (no local private key needed)\n- Access 20+ additional NIP implementations from `nostr-tools`\n\n## Requirements\n\n- **OpenClaw ≥ 2026.7.1 is required for the full NIP-29 workroom loop control.**\n  The pair-scoped bot-loop guard (core `bot-loop-protection`) and the\n  `SenderIsBot` fact only exist on ≥ 2026.7.1. On older hosts the plugin still\n  loads and degrades gracefully — the in-plugin `allowBots` gate and the opt-in\n  room-wide backstop still run — but the pair-scoped guard is unavailable.\n- **Fleet operators: upgrade every agent to ≥ 2026.7.1.** In a shared NIP-29\n  room, one un-upgraded agent still can't loop *you* (the gate is per-agent), but\n  it won't get the pair-scoped protection itself. Bump the whole fleet so the\n  loop control is uniform. See [`docs/UPGRADE-WORKFLOW.md`](docs/UPGRADE-WORKFLOW.md)\n  and [`docs/COMPATIBILITY.md`](docs/COMPATIBILITY.md).\n\n### NIP-29 workroom loop control\n\nAgents sharing a room used to echo each other and loop indefinitely. Two layers\nnow prevent that, mirroring how Slack/Discord/Feishu handle bot-to-bot traffic:\n\n1. **`allowBots` gate (default `\"mentions\"`)** — a known peer agent (a member\n   whose NIP-24 kind:0 sets `bot: true`) only earns a turn when it explicitly\n   @mentions this agent. `\"off\"` ignores all bot messages; `\"all\"` answers freely.\n   Humans and unknown senders are never affected. Set per room under\n   `channels.nostr.nostr_channels.<room>.config.allowBots`.\n2. **Core bot-loop pair guard (≥ 2026.7.1)** — for an admitted bot turn, the core\n   guard suppresses only the specific looping bot *pair* (sliding-window budget +\n   cooldown), so unrelated room work continues. Tunable per room via\n   `config.botLoopProtection` (`maxEventsPerWindow` / `windowSeconds` /\n   `cooldownSeconds`).\n3. **ACK reactions (default on)** — in NIP-29 rooms, a pure acknowledgement such\n   as “got it”, “on it”, “thanks”, or 👍 becomes a NIP-25 ✅ reaction when the\n   outbound reply target is known. No chat event is posted, so the ACK does not\n   trigger more agent turns. Set per-room `config.ackAsReaction: false` to keep\n   ACKs as chat messages. DMs, untargeted sends, substantive messages, and\n   Communikeys rooms are unchanged.\n\nPublish `profile.bot: true` on every fleet agent so peers can identify each other.\n\n### DM loop control (agent-to-agent NIP-17 / NIP-04)\n\nTwo agents DMing each other used to trade “Done”, “Finished”, “Thanks!” and 👍\nuntil one ran out of credit: every content-free closer cost the receiver a full\nmodel turn, and a polite model always answers. Four layers now stop that. **On\nby default**, and they apply **only** to senders whose kind:0 sets `bot: true` —\nhumans and unknown senders are never affected (a human's “ok” may be an\napproval), and none of it gates authorization.\n\n1. **Pair guard** — known-bot DM turns are budgeted per (sender, this agent)\n   pair: **3 turns / 60 s, then a 90 s cooldown**. Uses the core pair guard\n   (≥ 2026.7.1), falling back to a windowed breaker on older hosts.\n2. **No turn for a bot's closer** — a message that is nothing but\n   acknowledgements, completion one-liners, sign-offs and emoji (“Done ✅”,\n   “Thanks! All set.”, “🎉”) is recorded but never dispatched. Anything with\n   content (“Done — PR #12 is up”) gets a turn as usual.\n3. **No turn for a bot's DM reaction** — same treatment for kind:7 reactions.\n4. **No social closer sent to a bot** — a generated reply that is *purely\n   social* (“Thanks!”, “You're welcome 👍”) is not sent when every recipient is\n   a known bot. Completion and commitment one-liners (“Done.”, “Will do”, “ok”)\n   **are** still sent: a delegating peer may be waiting on exactly that.\n\nNothing is lost: traffic shed by layers 1–3 stays in the DM continuity tail and\nis surfaced to the agent on its next real turn as a `suppressed_peer_traffic`\nstructured-context entry. One side being upgraded is enough to break a loop.\n\n```json5\n{\n  channels: {\n    nostr: {\n      // All optional; shown with defaults. `false` disables every layer.\n      dmBotLoopProtection: {\n        enabled: true,\n        maxEventsPerWindow: 3,\n        windowSeconds: 60,\n        cooldownSeconds: 90,\n        suppressAcks: true, // layers 2–4; false keeps only the pair guard\n      },\n    },\n  },\n}\n```\n\nA fleet-wide `channels.defaults.botLoopProtection.enabled: false` also turns the\npair guard off; its room-sized *budgets* are deliberately not inherited by DMs.\nBot detection reads the cached kind:0, so the first DM from a never-seen peer\nmay pass unguarded while its profile is fetched.\n\nAlongside the enforcement layers, the plugin ships a **`nostr-workroom` skill**\n(`skills/nostr-workroom/SKILL.md`) that teaches agents the positive protocol the\ngates can't encode: reply discipline, the @mention handoff contract,\ncommitment→tracked-task rules, and where coordination belongs. Keep per-room\n`config.systemPrompt` to room-specific facts — the doctrine is versioned here.\n\n## Installation\n\n### Normal install\n\n```bash\nopenclaw plugins install npm:openclaw-nostr\n```\n\n`openclaw-nostr` is a runtime-only plugin artifact. It contains no bootstrap\nscripts or process-spawning code, so OpenClaw's install-time security scanner can\nscan and install it normally. The OpenClaw plugin id remains `nostr`.\n\n### Optional legacy migration\n\nIf you previously installed the broken `@openclaw/nostr`, the old combined\n`nostr-claw-bootstrap` package, or a direct-copy override, run:\n\n```bash\nnpx openclaw-nostr-bootstrap\n```\n\nThe migration CLI:\n\n1. detects the host OpenClaw version\n2. removes recognized stale direct-copy/activation installs and broken managed\n   npm entries left by prior packages\n3. runs `openclaw plugins install npm:openclaw-nostr --force`\n4. enables the plugin in `openclaw.json`\n5. refreshes the persisted plugin registry (via the install)\n6. runs a best-effort plugin-graph smoke test\n\nFor an offline migration, install from a local plugin checkout with\n`--plugin-source`:\n\n```bash\nnpx openclaw-nostr-bootstrap --plugin-source /path/to/openclaw-nostr\n```\n\nWith an explicit OpenClaw checkout / CLI path:\n\n```bash\nnpx openclaw-nostr-bootstrap --openclaw /path/to/openclaw.mjs\n```\n\nFor machine-readable output:\n\n```bash\nnpx openclaw-nostr-bootstrap --json\n```\n\n### From this repo (Cascadia fork)\n\n```bash\ngit clone https://git.sharegap.net/cascadia/openclaw-nostr.git\n```\n\nSee [Docker Deployment](#docker-deployment) for containerized setups.\n\n## Cascadia Fleet Role\n\nThis repo is the **durable maintenance layer** for Cascadia's Nostr fixes when upstream OpenClaw upgrades clobber local agent installs.\n\nThe repository now publishes two deliberately separate packages:\n\n- `openclaw-nostr`: the runtime-only OpenClaw plugin and normal install artifact\n- `openclaw-nostr-bootstrap`: an optional migration CLI for legacy installs\n\nUpstream OpenClaw remains the base runtime, while this repo is the source of\ntruth for Nostr-specific durability patches and extended features.\n\nSee:\n- `docs/UPGRADE-WORKFLOW.md`\n- `docs/COMPATIBILITY.md`\n- `scripts/apply-to-agent.sh`\n- `scripts/check-agent.sh`\n\n## Publishing (maintainers)\n\nTwo independent npm packages are published from this repo. They share a version\nbut are released separately.\n\n**1. The plugin — `openclaw-nostr`** (runtime-only artifact users install):\n\n```bash\n# from the repo root\nnpm login                       # once, if not already authenticated\nnpm publish --dry-run           # inspect the tarball: no scripts/, cascadia-ts bundled, 0 child_process\nnpm publish --access public     # publish openclaw-nostr@<version>\n```\n\nThe published tarball is runtime-only (`files[]` excludes `scripts/`) and bundles\n`cascadia-ts` via `bundledDependencies`, so it installs and passes OpenClaw's\ninstall-time security scanner cleanly. Verify before publishing:\n\n```bash\nnpm run check:hermetic-pack  # pack, inspect, install, and load every exported entry\nnpm run test:scanner         # asserts 0 critical scanner findings\n```\n\n`check:hermetic-pack` uses a temporary directory outside the repository and installs\nthe published OpenClaw version range from `devDependencies`, so it requires network\naccess. It verifies the runtime import closure, bundled `cascadia-ts`, absence of\ntests/docs/beads files, copied (not symlinked) installation, and host-loader imports.\n\n`npm run check:host-members` also requires network access. It installs the published\nOpenClaw release channels in temporary directories and typechecks against their\nhost types, failing only when a runtime property or named export used here has\nbeen removed or renamed.\n\n**2. The migration CLI — `openclaw-nostr-bootstrap`** (optional, `npx`-run):\n\n```bash\ncd packages/openclaw-nostr-bootstrap\nnpm publish --dry-run\nnpm publish --access public     # publish openclaw-nostr-bootstrap@<version>\n```\n\nThis package intentionally ships `scripts/` (which spawn `child_process`). That is\nfine — it is an `npx` CLI, never installed as an OpenClaw plugin, so the plugin\nscanner never runs against it.\n\n> Publishing to a private/self-hosted registry instead of public npm: add\n> `--registry https://<registry>` to each `npm publish`, or set\n> `publishConfig.registry` in the respective `package.json`.\n\nBump the version in **both** `package.json` files before a coordinated release\n(the plugin at the repo root and `packages/openclaw-nostr-bootstrap/package.json`).\n\n## Quick Setup\n\n1. Generate a Nostr keypair (if you don't have one):\n\n   ```bash\n   # Using nak CLI\n   nak key generate\n\n   # Or use any Nostr key generator\n   ```\n\n2. Add to your config (`~/.openclaw/openclaw.json`):\n\n   ```json\n   {\n     \"channels\": {\n       \"nostr\": {\n         \"privateKey\": \"${NOSTR_PRIVATE_KEY}\",\n         \"relays\": [\"wss://relay.sharegap.net\", \"wss://nos.lol\"]\n       }\n     }\n   }\n   ```\n\n3. Set the environment variable:\n\n   ```bash\n   export NOSTR_PRIVATE_KEY=\"nsec1...\"  # or 64-char hex format\n   ```\n\n4. Restart the gateway\n\n## Configuration\n\n| Key          | Type     | Default                                     | Description                                                |\n| ------------ | -------- | ------------------------------------------- | ---------------------------------------------------------- |\n| `privateKey` | string   | required*                                   | Bot's private key (nsec or hex). *Not required when using NIP-46. |\n| `relays`     | string[] | `[\"wss://relay.sharegap.net\", \"wss://nos.lol\"]` | WebSocket relay URLs                                       |\n| `dmPolicy`   | string   | `\"pairing\"`                                 | Access control: `pairing`, `allowlist`, `open`, `disabled` |\n| `allowFrom`  | string[] | `[]`                                        | Allowed sender pubkeys (npub or hex)                       |\n| `enabled`    | boolean  | `true`                                      | Enable/disable the channel                                 |\n| `name`       | string   | -                                           | Display name for the account                               |\n| `progressLanes` | object | `{ \"reasoning\": false, \"commentary\": false }` | Default reasoning/commentary payload delivery for all agents |\n| `agents.<agentId>.progressLanes` | object | inherits `progressLanes` | Per-agent reasoning/commentary overrides |\n\n### Reasoning and commentary progress lanes\n\nReasoning (`🧠`) and commentary (`💬`) payloads are not sent over Nostr by default. Enable either lane globally, then override individual booleans per routed agent as needed:\n\n```json\n{\n  \"channels\": {\n    \"nostr\": {\n      \"progressLanes\": { \"reasoning\": false, \"commentary\": false },\n      \"agents\": {\n        \"ops\": {\n          \"progressLanes\": { \"commentary\": true }\n        }\n      }\n    }\n  }\n}\n```\n\nAn agent override wins for each configured lane; omitted override values inherit the global setting. Unknown agent IDs use the global setting. Enabled payloads follow the existing reply shape: normal DMs stream each payload immediately, while group messages, membership events, group reactions, and DM reactions buffer payloads into their existing combined reply.\n\nWatchdog heartbeats are independent of these display settings: host agent events for the routed session keep an active turn alive even when reasoning/commentary lanes are disabled and no progress message is sent over Nostr.\n\n### NIP-46 Remote Signing\n\nWhen NIP-46 is enabled, event signing and encryption/decryption are delegated to a remote signer (bunker). No private key is stored locally — only a client secret used for the encrypted communication channel.\n\n| Key                      | Type     | Default   | Description                                                        |\n| ------------------------ | -------- | --------- | ------------------------------------------------------------------ |\n| `nip46`                  | boolean  | `false`   | Enable NIP-46 remote signing                                       |\n| `nip46BunkerUrl`         | string   | -         | `bunker://` URL or `user@domain` NIP-05 identifier                 |\n| `nip46SignerRelays`      | string[] | -         | Relay URLs for signer communication (defaults to bunker URL relays) |\n| `nip46Secret`            | string   | -         | Client secret key (hex) — use env var, not raw config               |\n| `nip46ConnectionTimeoutMs` | number | `60000`   | Connection timeout for the NIP-46 session                          |\n\n#### NIP-46 Setup\n\n1. Set up a bunker signer (e.g. [nsecBunker](https://nsecbunker.com), [Amber](https://github.com/nickkurt/amber), or any NIP-46 compatible signer)\n\n2. Generate a client secret (a random 32-byte hex key for the encrypted channel):\n\n   ```bash\n   # Generate a random client secret\n   openssl rand -hex 32\n   ```\n\n3. Store the client secret securely as an environment variable:\n\n   ```bash\n   export NOSTR_NIP46_SECRET=\"your-64-char-hex-client-secret\"\n   ```\n\n4. Configure in `openclaw.json`:\n\n   ```json\n   {\n     \"channels\": {\n       \"nostr\": {\n         \"nip46\": true,\n         \"nip46BunkerUrl\": \"bunker://abcdef...?relay=wss://relay.nsecbunker.com\",\n         \"relays\": [\"wss://relay.sharegap.net\", \"wss://nos.lol\"]\n       }\n     }\n   }\n   ```\n\n   Or with a NIP-05 bunker identifier:\n\n   ```json\n   {\n     \"channels\": {\n       \"nostr\": {\n         \"nip46\": true,\n         \"nip46BunkerUrl\": \"user@nsecbunker.com\"\n       }\n     }\n   }\n   ```\n\n5. Alternatively, use a `SecretRef` to point to the env var explicitly:\n\n   ```json\n   {\n     \"channels\": {\n       \"nostr\": {\n         \"nip46\": true,\n         \"nip46BunkerUrl\": \"bunker://abcdef...?relay=wss://relay.nsecbunker.com\",\n         \"nip46Secret\": { \"source\": \"env\", \"provider\": \"default\", \"id\": \"NOSTR_NIP46_SECRET\" }\n       }\n     }\n   }\n   ```\n\n#### Secret Sources\n\nThe `nip46Secret` field supports three `SecretRef` source types for production deployments:\n\n| Source | Example | Description |\n| ------ | ------- | ----------- |\n| `env`  | `{ \"source\": \"env\", \"name\": \"NOSTR_NIP46_SECRET\" }` | Read from environment variable (`id` or `name` field) |\n| `file` | `{ \"source\": \"file\", \"path\": \"/run/secrets/nip46\" }` | Read from a file (Docker secrets, tmpfs, etc.) |\n| `exec` | `{ \"source\": \"exec\", \"command\": \"vault kv get -field=secret nostr/nip46\" }` | Run a command, use stdout (10s timeout) |\n\nAll sources fall back to the `NOSTR_NIP46_SECRET` environment variable if the primary source fails.\n\n#### Enrollment Flow\n\nThe plugin provides a programmatic enrollment flow (`enrollNip46Signer()`) that automates the full NIP-46 setup ceremony:\n\n1. Generates a client secret (or reuses an existing one)\n2. Validates and parses the bunker URL\n3. Connects to the remote signer\n4. Verifies the remote pubkey matches expectations\n5. Runs a self-test on all delegated crypto operations\n6. Produces a config patch and env var instructions\n\n#### Cutover Migration\n\nTo migrate from local key to NIP-46 remote signing, use `performCutover()` which executes a transactional migration:\n\n1. Validates a local private key exists\n2. Snapshots the current config as backup\n3. Runs the enrollment flow (connect, verify, self-test)\n4. Applies the new config (enables NIP-46, removes `privateKey`)\n5. Runs post-cutover verification\n6. **Automatically rolls back** to the original config if any step fails\n\n#### Preflight Doctor\n\nThe `runNip46Doctor()` function performs 7 diagnostic checks:\n\n| Check | What it verifies |\n| ----- | ---------------- |\n| `config_valid` | Bunker URL and client secret are provided |\n| `bunker_url_parsed` | URL yields a pubkey (or is valid NIP-05) |\n| `client_secret_decodable` | Hex secret decodes to 32 bytes |\n| `signer_connect` | BunkerSigner connects within timeout |\n| `pubkey_match` | `get_public_key` matches expected identity |\n| `crypto_self_test` | sign, nip44, nip04 all work end-to-end |\n| `secret_recoverable` | Client secret re-decodes consistently (restart safety) |\n\n#### What Gets Delegated\n\nWhen NIP-46 is active, **all** identity-level cryptographic operations go through the remote signer:\n\n- Event signing (DMs, notes, reactions, deletions, reposts, channel messages, group messages)\n- NIP-04 encryption and decryption\n- NIP-44 encryption and decryption (used in NIP-17 gift wraps)\n- NIP-42 relay authentication\n- NIP-98 HTTP authentication\n\nThe client secret (`nip46Secret`) is only used to establish the NIP-44 encrypted channel with the bunker — it is **not** the identity private key.\n\n#### Startup Self-Test & Health Logging\n\nOn startup with NIP-46 enabled, the plugin:\n\n1. Logs a **signer health block** showing signing mode, identity pubkey, bunker URL, relay list, and session status\n2. Runs an automatic **self-test** exercising all delegated crypto operations:\n   - `get_public_key` — returns valid 64-char hex pubkey matching expected identity\n   - `sign_event` — signs a test kind:1 event\n   - `nip44_encrypt_decrypt` — round-trips NIP-44 encryption\n   - `nip04_encrypt_decrypt` — round-trips NIP-04 encryption\n3. Tracks **runtime health** (success/failure counts, last sign/decrypt/encrypt timestamps)\n\nFailures are logged as warnings — the bus still starts, but you'll know which operations aren't working.\n\n#### Custody Status\n\nThe `resolveCustodyStatus()` function reports the current signing posture:\n\n- **Signing mode**: `local-key`, `nip46-remote`, or `unconfigured`\n- **Key residency**: whether a local private key still exists in config\n- **NIP-46 readiness**: bunker URL + secret configured\n- **Runtime health**: signer success/failure counts and last operation timestamps\n- **Restart safety**: whether the secret source will survive a restart\n- **Warnings**: actionable alerts (e.g. \"local key still present after NIP-46 migration\")\n\n#### Rate-Limit Protection\n\nNIP-46 operations go through a **request queue** with:\n- Concurrency limit (default: 2 concurrent requests)\n- Stagger interval (default: 150ms between dispatches)\n- Exponential backoff retry on rate-limit errors (1s → 2s → 4s, up to 3 retries)\n\nThis prevents bursts of inbound messages from overwhelming the bunker relay with rapid-fire publishes.\n\n#### Outbound DM Safety Assertions\n\nThe NIP-17 outbound path includes runtime assertions that prevent routing bugs:\n- Recipient pubkey must not equal own pubkey (no self-DM)\n- Recipient pubkey must be valid 64-char hex\n- Post-wrap `p` tags must match the intended recipient for each wrap\n- Self-echo wraps are logged and ignored on the inbound path\n\n#### Security Considerations\n\n- **Never commit the client secret** to config files or version control\n- The `NOSTR_NIP46_SECRET` env var is the recommended storage method\n- The `SecretRef` mechanism supports `env`, `file`, and `exec` backends for production deployments\n- The bunker must be online for the agent to sign events — plan for connectivity\n\n### Room Channel Kinds\n\n`channels.nostr.nostr_channels.<room>.kind` selects the community plane:\n\n| Kind | Plane | Addressed by | Use when |\n| ---- | ----- | ------------ | -------- |\n| `nip29` | Relay-enforced group | `group_address` | The relay operator is trusted to enforce membership |\n| `communikey` | Public community (NIP-CAS-0007 / Communikeys V2) | `address` — a kind-32222 community-definition naddr or `32222:<owner-pubkey>:<community-id>` (a bare pubkey does not identify a branch) | **Default.** Coordination that can be public |\n| `concord` | Encrypted backup (NIP-CAS-0008) | `community_id` | The coordination itself must be private |\n\n#### Concord — encrypted backup rooms (NIP-CAS-0008)\n\nConcord is an **optional** end-to-end encrypted community plane adopted from the\n[Concord protocol](https://github.com/concord-protocol/concord) (CORD-01/02/03/05).\nRelays see only NIP-59-shaped kind-1059 wraps: membership, authority, channel\nstructure, and message content are all sealed. Communikeys remains the primary\nplane — reach for Concord when the membership set or the discussion itself is\nsensitive (incident response, pre-disclosure security work), not by default.\n\n```jsonc\n{\n  \"channels\": {\n    \"nostr\": {\n      \"nostr_channels\": {\n        \"incident\": {\n          \"kind\": \"concord\",\n          // CORD-02 §1 owner commitment, 64-char lowercase hex. Not secret\n          // (it travels in invites) but never appears on the wire.\n          \"community_id\": \"<64-hex>\",\n          // CORD-05 join material, via the standard SecretRef mechanism.\n          // Raw key material is NEVER accepted inline in config.\n          \"keys\": { \"source\": \"env\", \"name\": \"CONCORD_INCIDENT_KEYS\" },\n          \"channel\": \"general\",\n          \"relays\": [\"wss://relay.example\"]\n        }\n      }\n    }\n  }\n}\n```\n\nThe `keys` SecretRef resolves to the CORD-05 bundle JSON (`community_id`,\n`owner`, `owner_salt`, `community_root`, `root_epoch`, `control_pk`,\n`channels[]`). It is **optional**: omit it and the agent will onboard its keys\nfrom a CORD-05 Direct Invite (kind 3313) gift-wrapped to its own npub, then\npublish a Guestbook Join.\n\n**Currently supported:** CORD-01 stream wraps, CORD-02 Control-Plane editions\nfolded into an owner-rooted CORD-04 roster, the Guestbook (3306/3309 and 3312\nsnapshots), CORD-03 public and private channels with strict channel/epoch\nreplay binding, the full CORD-03 §3 Chat plane (kind-9 messages, kind-1111\nthreaded replies, kind-7 reactions, kind-5 deletes, kind-3302 edits), CORD-02\n§9 dissolution, CORD-05 §6 Direct Invites, and CORD-06 rekeys and refoundings.\n\nConcord separates the two ways one message cites another, and so does this\nplugin: an *inline quote* stays a kind 9 with a `q` tag and surfaces as\n`meta.quote`, while a *threaded reply* is a kind 1111 whose lowercase `e`/`k`/`p`\npin the immediate parent and uppercase `E`/`K`/`P` the immutable root. Replying\nto a message the agent has seen mints a real 1111 that inherits its parent's\nroot verbatim, so threads stay stable at any depth; replying to something it\nnever saw degrades to an inline quote rather than fabricating a root. Deletes\nand edits apply to their target by rumor id and are honored only from the\ntarget's own author (or, for a delete, a `MANAGE_MESSAGES` holder) — including\nwhen they arrive before the message they modify. Concord rooms therefore also\nsupport the ack-as-reaction and status-reaction seams.\n\nThe agent holds **every epoch it has ever been given**, so a membership removal\nor a base Refounding no longer strands it: it watches the precomputed\nnext-epoch rekey addresses, folds kind-3303 blobs after checking the rotator's\nauthority and the A.5 epoch-key commitment, and keeps the prior epochs\nsubscribed so history spanning a rotation stays readable. A rotation whose\nchunk set completes without a blob for this account is a removal, and the\nchannel then refuses to send rather than publishing into a dead epoch.\n\nA Refounding starts the new epoch's Guestbook empty, so the refounder seeds it\nwith a chunked kind-3312 snapshot of the survivors. That snapshot is honored\nonly from the npub whose Refounding minted the epoch, and it is *secondhand* —\nit merely seeds a member's state, and any newer (or same-instant) self-signed\nJoin/Leave or authorized Kick supersedes it. Absence from a snapshot is never a\nnegative state, so a partial one seeds whoever it carries and the rest heal by\nobservation.\n\n**NIP-46 remote signers** are supported: outbound seals already route through\nthe signer, and both giftwrap layers of a Direct Invite are decrypted with the\nbunker's `nip44_decrypt`, so a bunker-backed agent onboards its keys normally.\nThe one exception is CORD-06 rekey blobs — their plaintext is raw binary and\nNIP-46 returns decryption results as strings, so the bytes cannot survive the\nround trip. A bunker-backed agent logs that at channel start, reports any\nrotation it had to skip, and needs fresh `keys` material after a Refounding.\n\n**CORD-08 disappearing messages** are supported. The timer is Community state,\nnot a per-message choice: `message_expiration` (seconds) folds from the\n`MANAGE_METADATA`-gated Community metadata, and absent, `0`, or malformed all\nmean off — never a guessed default. While it is set, outbound Chat rumors carry\na NIP-40 `expiration` computed from their own `created_at`, and the outer wrap\nrepeats it so honoring relays delete the ciphertext itself. Deletes (kind 5) are\nexempt, since an expiring tombstone would let the message it erased come back.\nInbound rumors past their signed expiry are refused at ingest. A timer change is\nnever retroactive: the tag rides inside the signed rumor, so a message keeps the\nexpiry it was sent under. Kind-1740 timer notices fold as informational only,\nand only from a `MANAGE_METADATA` holder — the metadata fold stays the authority.\n\n**CORD-04 authority** folds as a real delegation chain rather than owner-only:\nRoles and Grants are honored from any actor holding `MANAGE_ROLES` who strictly\noutranks both the Roles involved and the member acted on, traced back to the\nowner (position 0, proven by the `community_id` itself). Equal never acts on\nequal, and no edition may claim a position at or above its own signer. Editions\nchain by CORD-04 §1 edition hash, so a successor citing a `prev` this client\ndoes not hold is a gap that suspends the entity rather than a head to seat —\nwhile a fresh joiner still accepts a compaction's dangling head as its baseline.\nThe `vac` citation is enforced as a *sync floor*: an action (including a Kick)\ncites the exact Grant it acts under, pinned by coordinate, version **and**\ncontent hash, and parks until that Grant is synced — then resolves against the\n*current* roster, so a just-demoted actor is never grandfathered and a forged\ncitation simply never resolves. Anything parked is re-judged whenever the roster\nmoves, so a delegated chain converges however the relay ordered it.\n\n**The CORD-04 §4 Banlist is retroactive**, not merely a refusal going forward.\nEvery event from a banned npub is dropped — chat, Guestbook entries, CORD-06\nrotations, and **Control editions**, which is the half that takes real\nmachinery: an edition the banned actor already seated is not authority either,\nso the fold *reverts* to the newest edition from a non-banned actor (§7),\nunpinning innocent authors' messages as collateral where the entity is a Pin\nList, and unseating the entity entirely where no such edition remains. That\ntakes a bounded per-entity backlog of superseded editions rather than a filter.\nA ban therefore severs a delegation chain at whatever link the banned actor\nsigned — the Role they minted, or the Grant that handed it out — so their\ndelegates lose the authority that traced to the owner only through them.\nSurvivors are republished by any authorized holder, the §4 re-heal; the fold\nnever re-derives a list nobody signed.\n\n**Which Banlist entries a client honors is derived, never stored.** An entry is\nan action on the npub it names, so §5's one hard rule reaches it: the signer\nmust hold `BAN` **and** *strictly* outrank the target — \"an admin cannot ban a\npeer admin\" — judged against the *current* roster and re-judged every time that\nroster moves. The **owner's** entry is never honored at all: they are supreme\nand unremovable (§2), and honoring it would let a single `BAN` holder silence\nthe root of all authority. An entry whose target the signer does not outrank is\n*inert*, not refused — the edition still folds and chains, because refusing a\nwhole replace-entire list over one entry would fork the version chain between\nimplementations — and the entry lies dormant in the head on the wire, gating\nnothing and reverting nothing, until the target's rank drops below its author's.\nThat is the normal case rather than the exception: §6 composes a Ban as the\nBanlist edition *first, the Grant strip alongside*, and once the strip lands the\nentry arms itself for every client, so a §4 re-heal by a lower-ranked admin\ncarries a higher-ranked admin's entry through instead of silently stripping it.\nBecause both sides are read live, the reverse holds too — a demoted admin's list\ngoes dormant with them (§5: a just-demoted member's stale action is dropped),\nand the cure is the same re-heal: any current staffer republishes the list under\ntheir own signature.\n\n**CORD-04 §7 Pins** lift a message onto the Control Plane, where compaction\nre-wraps it across every rotation — so a pin reaches members who never held the\nChat plane's keys. A pin therefore does not *quote* a message, it **proves**\none: the entry carries the author's own kind-20013 seal plus that single\nmessage's 76-byte NIP-44 key expansion, which is one-way, so disclosing it\nexposes exactly that message and nothing else about the conversation. Every\nentry is verified end to end — seal signature, MAC under the disclosed\n`hmac_key`, decrypt/unpad, `rumor.pubkey == seal.pubkey`, kind 9/1111, and a\n**strict `channel` binding whose absence fails** (without it a private Channel's\nkeyholder could pin its messages into a public list, disclosing them\nCommunity-wide with proof) — and the entry's identity is the rumor id\n*recomputed* from the decrypted bytes. An invalid entry is dropped while its\nedition folds normally.\n\nBoth content forms are supported and self-describing: plaintext for a public\nChannel, sealed under the Channel key at a named epoch for a private one, with\na writer always using the form the Channel's folded type demands. The two caps —\n25 entries, 32,768 bytes of `content` — are **content-level**: a violating\nedition still folds, chains and compacts, and every reader treats it as an empty\nlist, so no two implementations fork the version chain. A writer enforces both\nbefore publishing, because publishing one would cost it the whole list. A\ncorrection rides the entry as its own proof bundle (kind 3302, same author, same\nChannel, naming the original), never as the curator's words; a client holding a\nnewer Edit marks the pin edited rather than rendering superseded words as\ncurrent. Replace-entire cuts both ways, so a client that cannot *read* the\ncurrent list — sealed under an epoch it never held, or Control not yet synced —\n**withholds the write**, rendering the pins as unavailable instead. Self-erasure\noutranks curation: an author's own kind-5 hides the entry immediately by\nrecomputed id (a moderator's `MANAGE_MESSAGES` delete does not), and a\n`PIN_MESSAGES` holder publishes the omitting edition — at once if it pinned it,\nafter a short random re-check otherwise, so simultaneous curators collapse to one\npublisher.\n\n**CORD-05 §5 invite-link Registry** folds as the member-facing shadow of a\ncreator's private Invite List. Each creator publishes a `vsk 8` entity at a\ncoordinate bound to `(community_id, creator)`, so a `CREATE_INVITE` holder can\nwrite only their *own* list and nobody can forge links into anyone else's. Its\ncontent is the live links' **coordinates** only — the kind-33301 link-signer\npubkeys, never tokens, URLs, or signing secrets — so members can see that links\nexist without being able to use one. Every creator's list folds into one\naggregate active set, honored only *while* its author still holds\n`CREATE_INVITE` (a banned creator needs no check here — the fold unseats their\nRegistry outright, §4 above), and that set is the Public/Private source of\ntruth: non-empty means a live link exists and the Community is Public, empty\nmeans Private. A retired link simply stops being listed by the next edition,\nand emptying the last one is what flips the Community back to Private.\n\n**CORD-05 §1–§3 link invites** can be followed as well as Direct Invites. A\nshareable link is a public locator plus a secret: a bare naddr naming\n`(kind 33301, link_signer, d=\"\")` in the path, and a `#fragment` — never sent\nto any server — carrying the 16-byte unlock token and up to three bootstrap\nrelays in the §3 dictionary encoding, so the common invite spends zero bytes on\nrelays and an unknown dictionary generation is refused rather than decoded\nagainst the wrong table. `manager.acceptInviteLink(channel, url)` fetches the\nbundle at that exact coordinate, opens it with `hkdf(token,\n\"concord/invite-key\")`, and adopts it. The whole coordinate is checked, which\nmakes the guard airtight in both directions: a squatter's event at a different\nauthor is a different coordinate, and a link-holder cannot replace or tombstone\nthe bundle either. A retired link's `vsk 9` tombstone is read as a refusal, and\nis exactly as durable as the bundle it replaced; a bundle that fails to\nreproduce its `community_id`, names another Community, or has passed\n`expires_at` refuses the join. Nothing subscribes or announces presence until\nthe link is followed explicitly — a bundle is passive.\n\n**CORD-05 §2/§4 minting** is the creator's side of the same machinery, and it\nmoves three documents in one deliberate order: the **Invite List** (kind 13303,\nNIP-44 to self) first, because it is the only place a link signer's secret\nexists and a bundle whose secret was never recorded is a live link nobody can\never refresh or retire; the **bundle** second; the **Registry** edit last,\nbecause that is what tells the Community a live link exists. An entry whose\nbundle failed to post is repaired by minting again — one of those failures is\nrecoverable and the other is not. `manager.mintInviteLink(channel, opts)` mints\na signer used for nothing else and a fresh 16-byte token, and returns the URL;\n`refreshInviteLink` re-posts the bundle at the same coordinate with the keys\nheld *now*, so a link shared once survives every rotation, reading what the link\ngrants back off the live bundle rather than guessing; `retireInviteLink` posts\nthe `vsk 9` tombstone, buries the token in the Invite List, and republishes the\nRegistry without it. **A link grants no private Channel key unless one is named\nby id** (`opts.channelIds`): a link is a public artifact reaching whoever it\nreaches, so the default hands over the base access key alone — every public\nChannel and nothing more. `CREATE_INVITE` is checked *before* anything is\npublished, since without the Registry edit a link is invisible to the Community.\nThe Invite List merges across a creator's devices by token, tombstones union,\nand a tombstone beats an entry **terminally** — no timestamp tiebreak, unlike a\nre-joinable membership — so a stale device can never resurrect a link that is\nalready a grave on the wire. `syncInviteList` merges *every* copy the relays\nhold rather than taking the newest, because two devices publishing concurrently\nleave two different newest copies and either one alone drops the other's signer\nsecrets. Retiring the last live link empties the aggregate Registry and reports\n`nowPrivate`; the severance itself is a Refounding (CORD-06) and a separate\nstep, since a retired link stops being usable and the keys it handed out do not.\n\n**CORD-02 §8 Community List** (`manager.syncCommunityList()`) merges this bus's\nmemberships into the kind-13302 replaceable, NIP-44 encrypted to self. It\nmerges rather than overwrites, because two clients can serve one npub and a\ndevice that knows about fewer Communities must never erase the others': `seed`\nkeeps the lower epoch (the full-history backfill anchor, which only moves\nbackward), `current` the higher, an epoch tie breaks on the lexicographically\nlowest canonical bytes so two devices never flap, tombstones union permanently\nand a tombstoned entry stays *in* the document, and the newest of `added_at`\nand `removed_at` decides whether a membership is live. Snapshots carry the\nmembership subset plus the `control_root` a staffer holds — never the icon,\nnever the link's expiry or attribution — and unknown fields survive the round\ntrip. Both the 50-membership ceiling and the NIP-44 plaintext cap are checked\nbefore publishing. Under a NIP-46 remote signer this refuses loudly: the List\nis encrypted *to self* and there is no remote `nip44_encrypt` path, so\nencrypting to the throwaway local key would publish a List the account could\nnever read back.\n\n**Deferred:** A/V (CORD-07) and the 3310 WebXDC peer signal.\n\n> **Key custody:** a Concord `community_root` is a membership credential. Store\n> it with the same care as a signing key, and found fleet communities from a key\n> the fleet can afford to lose — a Concord owner key has no succession path.\n\n## Access Control\n\n### DM Policies\n\n- **pairing** (default): Unknown senders receive a pairing code to request access\n- **allowlist**: Only pubkeys in `allowFrom` can message the bot\n- **open**: Anyone can message the bot (use with caution)\n- **disabled**: DMs are disabled\n\n### Example: Allowlist Mode\n\n```json\n{\n  \"channels\": {\n    \"nostr\": {\n      \"privateKey\": \"${NOSTR_PRIVATE_KEY}\",\n      \"dmPolicy\": \"allowlist\",\n      \"allowFrom\": [\"npub1abc...\", \"0123456789abcdef...\"]\n    }\n  }\n}\n```\n\n## Protocol Support\n\n### Core Messaging (Tier 0)\n\n| NIP    | Kind(s)      | Status      | Description                           |\n| ------ | ------------ | ----------- | ------------------------------------- |\n| NIP-01 | 1            | ✅ Full     | Basic event structure & public notes  |\n| NIP-04 | 4            | ✅ Full     | Encrypted DMs (legacy)                |\n| NIP-09 | 5            | ✅ Full     | Event deletion                        |\n| NIP-10 | —            | ✅ Full     | Thread references (root/reply/mention)|\n| NIP-17 | 1059         | ✅ Full     | Gift-wrapped DMs (modern)             |\n| NIP-25 | 7            | ✅ Full     | Reactions                             |\n| NIP-40 | —            | ✅ Full     | Event expiration                      |\n| NIP-65 | 10002        | ✅ Full     | Relay list metadata                   |\n\n### Tier 1 — Agent-Essential Features\n\n| NIP    | Kind(s)      | Status      | Description                           |\n| ------ | ------------ | ----------- | ------------------------------------- |\n| NIP-05 | —            | ✅ Full     | Identity resolution + domain search   |\n| NIP-11 | —            | ✅ Full     | Relay information + capability checks |\n| NIP-42 | 22242        | ✅ Full     | Relay authentication                  |\n| NIP-46 | 24133        | ✅ Full     | Remote signing (Nostr Connect/Bunker) |\n| NIP-57 | 9734, 9735   | ✅ Re-export| Zaps (Lightning payments)             |\n| NIP-94 | 1063         | ✅ Full     | File metadata                         |\n| NIP-98 | 27235        | ✅ Full     | HTTP authentication                   |\n| NIP-B7 | —            | ✅ Re-export| Blossom media server                  |\n\n### Tier 2 — Social & Channel Features\n\n| NIP    | Kind(s)            | Status      | Description                     |\n| ------ | ------------------ | ----------- | ------------------------------- |\n| NIP-13 | —                  | ✅ Re-export| Proof of Work                   |\n| NIP-18 | 6, 16              | ✅ Full     | Reposts (short text + generic)  |\n| NIP-27 | —                  | ✅ Full     | Content parsing (text/URLs/refs)|\n| NIP-28 | 40, 42, 43, 44     | ✅ Full     | Public channels (CRUD + mod)    |\n| NIP-44 | —                  | ✅ Full     | Versioned encryption            |\n\n### Tier 3 — Niche / Advanced (Namespace Re-exports)\n\n| NIP    | Module             | Description                           |\n| ------ | ------------------ | ------------------------------------- |\n| NIP-29 | `nostr-extras`     | Relay-based groups                    |\n| NIP-30 | `nostr-extras`     | Custom emoji                          |\n| NIP-39 | `nostr-extras`     | External identity verification        |\n| NIP-47 | `nostr-extras`     | Nostr Wallet Connect (NWC)            |\n| NIP-49 | `nostr-extras`     | Private key encryption (ncryptsec)    |\n| NIP-58 | `nostr-extras`     | Badges                                |\n| NIP-75 | `nostr-extras`     | Zap goals (fundraising)               |\n| NIP-77 | `nostr-extras`     | Negentropy sync                       |\n\n## Architecture\n\nThe plugin follows a three-layer architecture:\n\n```\nnostr-capabilities.ts   ← Event builders (pure functions, no I/O)\nnostr-discovery.ts      ← NIP-05/NIP-11/NIP-27 (network I/O with caching)\nnostr-extras.ts         ← Tier 3 namespace re-exports\nnip46-signer.ts         ← NIP-46 signer abstraction (NostrSigner interface)\nnip46-doctor.ts         ← NIP-46 preflight diagnostics (7-check health report)\nnip46-enroll.ts         ← NIP-46 enrollment flow (generate secret, connect, verify)\nnip46-cutover.ts        ← NIP-46 migration (local key → remote signer, auto-rollback)\nnip46-status.ts         ← Custody status reporting (signing mode, health, warnings)\n        │\nnostr-bus.ts            ← Runtime wiring (signing, publishing, subscriptions)\n        │\nchannel.ts              ← Public API (OpenClaw plugin interface)\n        │\nnostr-profile-http.ts   ← HTTP endpoints (/api/channels/nostr/...)\n```\n\n### Key Design Decisions\n\n- **Unsigned templates**: All event builders return `EventTemplate` objects. The bus layer handles signing via `finalizeEvent` (local) or `NostrSigner.signEvent` (NIP-46) and publishing via the pool. This keeps builders pure and testable.\n- **NIP-46 signer abstraction**: The `NostrSigner` interface (`nip46-signer.ts`) provides a unified API for signing, encryption, and decryption. When NIP-46 is enabled, all bus operations delegate to the remote `BunkerSigner` through a request queue (rate-limit protection) with retry logic; otherwise they use the local secret key. The abstraction is transparent to upstream consumers.\n- **NIP-46 lifecycle modules**: Enrollment (`nip46-enroll.ts`), cutover migration (`nip46-cutover.ts`), preflight diagnostics (`nip46-doctor.ts`), and custody status (`nip46-status.ts`) are standalone modules that can be called programmatically or wired into CLI commands.\n- **NIP-28 custom builders**: The upstream `nostr-tools/nip28` functions call `finalizeEvent` internally. We provide our own builders that return unsigned templates to fit the fork's `signAndPublish` pattern.\n- **Caching**: NIP-05 uses a 5-minute TTL with 500-entry LRU. NIP-11 uses a 10-minute TTL with 100-entry LRU. Network errors are not cached (retry on next call).\n- **Per-sender serialization**: Inbound messages from the same pubkey are processed serially to prevent race conditions during relay EOSE bursts (see `PATCHES.md`).\n- **Bounded startup catch-up**: DM subscriptions first query a capped historical window through startup time, then promote to live subscriptions after EOSE/timeout so relay backlog and live traffic have distinct lifecycles.\n- **Real outbound IDs**: Outbound channel `messageId` values are real Nostr identifiers. NIP-04 returns the signed kind:4 event ID; NIP-17 returns the recipient rumor ID after at least one recipient wrap is accepted while the bus also tracks accepted gift-wrap IDs.\n\n## HTTP API\n\nAll endpoints are under `/api/channels/nostr/:accountId/`. Authentication is handled by the OpenClaw gateway.\n\n### Agent profile tools\n\nWhen a configured Nostr account is available to the invoking session, the plugin exposes:\n\n- `nostr_profile` — reads that account's configured kind-0 profile, identity pubkey, general relays, and last publish state.\n- `nostr_profile_set` — merges profile fields, supports explicit field removal through `clear`, publishes kind-0 metadata, and persists the configuration after at least one relay accepts it.\n\nProfile mutation changes the agent's externally visible Nostr identity. Operators should use OpenClaw tool allow/deny policy to deny or narrowly allow `nostr_profile_set`; the read-only `nostr_profile` tool does not expose signing or NIP-46 secrets.\n\nAt every Nostr bus start or reload, profile synchronization compares kind-0 content on the configured general `relays` (never `dmRelays`). Configuration wins on semantic content divergence and is republished once; when configuration has no `profile`, an existing remote kind-0 is imported into config without publishing. Matching content is a no-op, and individual missing relay copies are not repaired. Relay failures are non-fatal. Set `channels.nostr.profileSync: false` to disable startup synchronization (default: `true`).\n\n### Profile Management\n\n| Method | Endpoint                        | Description                 |\n| ------ | ------------------------------- | --------------------------- |\n| GET    | `/profile`                      | Get current profile state   |\n| PUT    | `/profile`                      | Update and publish profile  |\n| POST   | `/profile/import`               | Import profile from relays  |\n\n### Identity & Discovery\n\n| Method | Endpoint                        | Description                            |\n| ------ | ------------------------------- | -------------------------------------- |\n| GET    | `/identity/:nip05`              | Resolve NIP-05 address to pubkey       |\n| GET    | `/identity/search/:domain?q=`   | Search NIP-05 domain for users         |\n| GET    | `/relay-info?url=wss://...`     | Get relay NIP-11 capability summary    |\n\n### Events\n\n| Method | Endpoint                        | Description                 |\n| ------ | ------------------------------- | --------------------------- |\n| POST   | `/note`                         | Publish a public note       |\n| POST   | `/reaction`                     | React to an event           |\n| DELETE | `/events`                       | Delete events               |\n\n### Example: Resolve a NIP-05 Identity\n\n```bash\ncurl http://localhost:18789/api/channels/nostr/default/identity/alice%40example.com\n```\n\n```json\n{\n  \"ok\": true,\n  \"nip05\": \"alice@example.com\",\n  \"pubkey\": \"aabbccdd...\",\n  \"relays\": [\"wss://relay1.example\", \"wss://relay2.example\"]\n}\n```\n\n### Example: Check Relay Capabilities\n\n```bash\ncurl \"http://localhost:18789/api/channels/nostr/default/relay-info?url=wss://relay.sharegap.net\"\n```\n\n```json\n{\n  \"ok\": true,\n  \"url\": \"wss://relay.sharegap.net\",\n  \"name\": \"Damus Relay\",\n  \"supportedNips\": [1, 4, 9, 11, 12, 16, 20, 22, 28, 33, 40],\n  \"authRequired\": false,\n  \"paymentRequired\": false,\n  \"restrictedWrites\": false\n}\n```\n\n## Docker Deployment\n\nThere are four ways to deploy this fork to an existing OpenClaw Docker setup, listed from simplest to most involved.\n\n### Option 1: Volume Mount (Recommended)\n\nMount the fork's source directory into the container and point OpenClaw's plugin loader at it. No image rebuild required.\n\n**1. Clone the fork on the Docker host:**\n\n```bash\ngit clone https://git.sharegap.net/cascadia/openclaw-nostr.git /opt/openclaw-nostr\n```\n\n**2. Add to your `docker-compose.yml`:**\n\n```yaml\nservices:\n  openclaw-gateway:\n    volumes:\n      - ${OPENCLAW_CONFIG_DIR}:/home/node/.openclaw\n      - ${OPENCLAW_WORKSPACE_DIR}:/home/node/.openclaw/workspace\n      # Mount the fork's source\n      - /opt/openclaw-nostr:/opt/openclaw-nostr:ro\n```\n\n**3. Tell OpenClaw to load the plugin via `openclaw.json`:**\n\n```json\n{\n  \"plugins\": {\n    \"load\": {\n      \"paths\": [\"/opt/openclaw-nostr\"]\n    }\n  },\n  \"channels\": {\n    \"nostr\": {\n      \"privateKey\": \"${NOSTR_PRIVATE_KEY}\",\n      \"relays\": [\"wss://relay.sharegap.net\", \"wss://nos.lol\"]\n    }\n  }\n}\n```\n\n**4. Restart:**\n\n```bash\ndocker compose restart openclaw-gateway\n```\n\n### Option 2: Config Extensions Directory\n\nCopy the fork into OpenClaw's user-level extensions directory, which is auto-scanned on startup.\n\n```bash\n# Copy into the config dir that's already mounted\ncp -r /opt/openclaw-nostr \"${OPENCLAW_CONFIG_DIR}/extensions/nostr\"\n\n# Restart\ndocker compose restart openclaw-gateway\n```\n\nOpenClaw discovers plugins from `~/.openclaw/extensions/` automatically — no `plugins.load.paths` config needed.\n\n### Option 3: Custom Dockerfile Layer\n\nBuild a derived image with the fork baked in. Best for CI/CD pipelines and reproducible deployments.\n\n```dockerfile\nFROM openclaw:latest\n\n# Copy in the fork\nCOPY openclaw-nostr /app/extensions/nostr\n\n# The fork overrides the bundled nostr extension at the same path\n```\n\nBuild and run:\n\n```bash\ndocker build -t openclaw-nostr:custom .\nOPENCLAW_IMAGE=openclaw-nostr:custom docker compose up -d\n```\n\n### Option 4: Build-Arg with Full Source\n\nIf you're building OpenClaw from source, include the nostr extension via the `OPENCLAW_EXTENSIONS` build arg:\n\n```bash\n# From the openclaw source root\ndocker build \\\n  --build-arg OPENCLAW_EXTENSIONS=\"nostr\" \\\n  -t openclaw:with-nostr .\n```\n\nThis uses the `extensions/nostr` directory within the OpenClaw source tree. To use the fork instead, replace `extensions/nostr` with the fork's source before building.\n\n### Plugin Discovery Precedence\n\nOpenClaw discovers plugins in this order (first match wins):\n\n1. **`plugins.load.paths`** — Explicit paths from config (Option 1)\n2. **Workspace extensions** — `<workspace>/.openclaw/extensions/`\n3. **User extensions** — `~/.openclaw/extensions/` (Option 2)\n4. **Bundled extensions** — `/app/extensions/` inside the image (Options 3 & 4)\n\nThe fork at a higher-precedence path will shadow the bundled upstream version.\n\n### Docker + Durability Patches\n\nIf you also need the runtime durability patches (reconnect fix, subscription handling, etc.), apply them after image build or container start:\n\n```bash\n# For volume-mount setups, run against the container\ndocker exec -it openclaw-gateway bash -c '...'\n\n# Or use the apply script against a Docker host\nscripts/apply-to-agent.sh user@docker-host\n```\n\nSee `PATCHES.md` for the full list of runtime patches.\n\n## Programmatic Usage\n\n### Channel-Level Functions\n\nThese are available from `channel.ts` and operate on named accounts:\n\n```typescript\nimport {\n  // Messaging\n  publishNostrNote,\n  publishNostrReaction,\n  deleteNostrEvents,\n  // Identity\n  resolveNostrIdentity,\n  searchNostrDomain,\n  validateNostrIdentity,\n  // Discovery\n  getNostrRelayInfo,\n  getNostrRelayCapabilities,\n  // Auth\n  getNostrHttpAuthToken,\n  getNostrBlossomAuthToken,\n  // Media\n  publishNostrFileMetadata,\n  // Social\n  repostNostrEvent,\n  // Parsing\n  parseNostrContent,\n} from \"./src/channel.js\";\n\n// Resolve a NIP-05 identity\nconst alice = await resolveNostrIdentity(\"alice@example.com\");\n// { nip05: \"alice@example.com\", pubkey: \"aabb...\", relays: [\"wss://...\"] }\n\n// Check relay capabilities\nconst caps = await getNostrRelayCapabilities(\"wss://relay.sharegap.net\");\n// { supportedNips: [1, 4, ...], authRequired: false, ... }\n\n// Parse content into structured blocks\nconst blocks = parseNostrContent(\"Hello https://example.com #nostr\");\n// [{ type: \"text\", ... }, { type: \"url\", ... }, { type: \"hashtag\", ... }]\n```\n\n### Bus Handle (Direct Access)\n\nFor advanced use, get the bus handle from `getActiveNostrBuses()`:\n\n```typescript\nimport { getActiveNostrBuses } from \"./src/channel.js\";\n\nconst bus = getActiveNostrBuses().get(\"default\");\n\n// Send a DM and keep the real Nostr ID for logging/threading\nconst sent = await bus.sendDm(recipientPubkey, \"hello from OpenClaw\");\n// sent.eventId is the kind:4 ID for NIP-04, or the recipient rumor ID for NIP-17\n// sent.publishedEventIds contains the signed event IDs accepted by relays\n\n// NIP-44 encrypt a message\nconst key = bus.getNip44ConversationKey(recipientPubkey);\nconst encrypted = bus.nip44Encrypt(\"secret message\", key);\n\n// Create a public channel\nconst channelId = await bus.createChannel({\n  name: \"My Channel\",\n  about: \"A public channel for discussion\",\n});\n\n// Send a channel message\nawait bus.sendChannelMessage({\n  channelId,\n  content: \"Hello channel!\",\n  relayUrl: \"wss://relay.example\",\n});\n\n// Generate BUD-11 auth token for a Blossom upload\nconst token = await bus.getBlossomAuthToken({\n  verb: \"upload\",\n  hashes: [\"<sha256>\"],\n  server: \"https://media.example.com\",\n});\n```\n\n### Tier 3 Extras (Namespace Imports)\n\n```typescript\nimport { nip49, nip58, nip29, nip47, nip30, BlossomClient } from \"./src/nostr-extras.js\";\n\n// NIP-49: Encrypt a private key for storage\nconst ncryptsec = nip49.encrypt(secretKey, \"password\");\nconst recovered = nip49.decrypt(ncryptsec, \"password\");\n\n// NIP-47: Parse a Nostr Wallet Connect string\nconst connection = nip47.parseConnectionString(\"nostr+walletconnect://...\");\n\n// NIP-30: Find custom emoji in content\nfor (const match of nip30.matchAll(\":custom_emoji: hello\")) {\n  console.log(match.shortcode, match.url);\n}\n```\n\n## Testing\n\n### Local Relay (Recommended)\n\n```bash\n# Using strfry\ndocker run -p 7777:7777 ghcr.io/hoytech/strfry\n\n# Configure openclaw to use local relay\n\"relays\": [\"ws://localhost:7777\"]\n```\n\n### Running Tests\n\nTests run via vitest from the parent OpenClaw workspace:\n\n```bash\n# From the openclaw workspace root\npnpm vitest run --config vitest.extensions.config.ts extensions/nostr/\n\n# Run a specific test file\npnpm vitest run --config vitest.extensions.config.ts extensions/nostr/src/nostr-discovery.test.ts\n```\n\n### Test Coverage\n\n| Test File                              | Covers                                                    |\n| -------------------------------------- | --------------------------------------------------------- |\n| `nostr-bus.protocol.test.ts`           | NIP-04/NIP-17 DM pipeline, reply routing, serialization   |\n| `nostr-capabilities-extended.test.ts`  | NIP-18 reposts, NIP-28 channels, NIP-13/44/57/94/42/98    |\n| `nostr-discovery.test.ts`              | NIP-05 identity, NIP-11 relay info, NIP-27 content parsing|\n| `nostr-extras.test.ts`                 | Tier 3 re-export surface verification                     |\n| `nostr-profile-http.test.ts`           | HTTP API endpoints including identity/relay-info routes    |\n| `nip46-signer.test.ts`                 | NIP-46 client secret encode/decode, bunker URL parsing, request queue |\n| `nip46-doctor.test.ts`                 | NIP-46 preflight diagnostics (config validation, report formatting) |\n| `nip46-enroll.test.ts`                 | NIP-46 enrollment flow (secret gen, URL parsing, progress) |\n| `nip46-cutover.test.ts`                | NIP-46 cutover migration (preconditions, rollback)         |\n| `nip46-status.test.ts`                 | Custody status resolution and formatting                   |\n| `config-schema.test.ts`                | Config validation including NIP-46 fields                  |\n| `types.test.ts`                        | Account resolution including NIP-46 config, env/file/exec secret sources |\n\n### Manual Test\n\n1. Start the gateway with Nostr configured\n2. Open Damus, Amethyst, or another Nostr client\n3. Send a DM to your bot's npub\n4. Verify the bot responds\n\n## Security Notes\n\n- Private keys are never logged\n- Event signatures are verified before processing\n- Use environment variables for keys, never commit to config files\n- Consider using `allowlist` mode in production\n- NIP-98 and BUD-11 Blossom tokens are signed with the bus's key — scope them to specific URLs/servers and hashes\n- NIP-44 conversation keys are derived from the bus's secret key\n- HTTP mutation endpoints (PUT, POST, DELETE) are restricted to loopback addresses\n- **NIP-46**: The client secret (`nip46Secret`) is distinct from the identity key — store it via `NOSTR_NIP46_SECRET` env var or a `SecretRef` (`env`, `file`, `exec`), never in raw config\n- **NIP-46 cutover**: Use `performCutover()` for safe migration — it auto-rolls back if verification fails\n\n## Troubleshooting\n\n### Bot not receiving messages\n\n1. Verify private key (or NIP-46 bunker URL + secret) is correctly configured\n2. Check relay connectivity\n3. Ensure `enabled` is not set to `false`\n4. Check the bot's public key matches what you're sending to\n\n### NIP-46 connection failing\n\n1. Verify the bunker is online and reachable\n2. Check `nip46BunkerUrl` is a valid `bunker://` URL or `user@domain`\n3. Verify `NOSTR_NIP46_SECRET` env var is set (64-char hex)\n4. Check relay connectivity to the signer relays\n5. Increase `nip46ConnectionTimeoutMs` if the bunker is slow to respond\n6. Check logs for `NIP-46 auth URL` — the bunker may require user approval\n\n### Messages not being delivered\n\n1. Check relay URLs are correct (must use `wss://`)\n2. Verify relays are online and accepting connections\n3. Check for rate limiting (reduce message frequency)\n\n### Docker: Plugin not loading\n\n1. Verify the volume mount path is correct and readable\n2. Check `plugins.load.paths` points to the right directory\n3. Run `openclaw plugins list` to see discovered plugins\n4. Check container logs: `docker compose logs openclaw-gateway`\n\n### NIP-05 resolution failing\n\n1. The target domain must serve `/.well-known/nostr.json`\n2. Check for CORS issues if resolving from a browser context\n3. Results are cached for 5 minutes — wait or restart to retry\n\n## License\n\nMIT\n","readmeFilename":"README.md"}