{"_id":"@kehto/services","_rev":"28-bbcc5e18f9fd949539179614e70ce456","name":"@kehto/services","dist-tags":{"latest":"0.21.2"},"versions":{"0.2.0":{"name":"@kehto/services","version":"0.2.0","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.2.0","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/runtime#readme","bugs":{"url":"https://github.com/kehto/runtime/issues"},"dist":{"shasum":"3d32c6aed64952333343beb34ee2f896b6cc7af0","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.2.0.tgz","fileCount":5,"integrity":"sha512-N7QGYfGaGhdp0MybEFlVj9sKIBanLtfLpcsFldWVZv5vstZcwrTsHzz3wmI5lmh2UJPwXDnl3L7KK/tthRcJ3Q==","signatures":[{"sig":"MEQCIGSlW5HOirCzmA2LPDpIakuw03MfPSRMV0CTSd8c8pO1AiAxHhooTg5a1TIb2YDlTOOUNiju46zz2izLgmfDBTldCA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143410},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"sandwiches","email":"sandwich.farm@protonmail.com"},"_resolved":"/tmp/4c51f27b08c76d107cc16e3b78a844b7/kehto-services-0.2.0.tgz","_integrity":"sha512-N7QGYfGaGhdp0MybEFlVj9sKIBanLtfLpcsFldWVZv5vstZcwrTsHzz3wmI5lmh2UJPwXDnl3L7KK/tthRcJ3Q==","repository":{"url":"git+https://github.com/kehto/runtime.git","type":"git","directory":"packages/services"},"_npmVersion":"11.11.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","dependencies":{"@kehto/runtime":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","@napplet/core":"^0.2.1","@napplet/nub-ifc":"^0.2.1","@napplet/nub-keys":"^0.2.1","@napplet/nub-media":"^0.2.1","@napplet/nub-relay":"^0.2.1","@napplet/nub-theme":"^0.2.1","@napplet/nub-notify":"^0.2.1","@napplet/nub-storage":"^0.2.1","@napplet/nub-identity":"^0.2.1"},"peerDependencies":{"@napplet/core":"^0.2.1","@napplet/nub-ifc":"^0.2.1","@napplet/nub-keys":"^0.2.1","@napplet/nub-media":"^0.2.1","@napplet/nub-relay":"^0.2.1","@napplet/nub-theme":"^0.2.1","@napplet/nub-notify":"^0.2.1","@napplet/nub-storage":"^0.2.1","@napplet/nub-identity":"^0.2.1"},"_npmOperationalInternal":{"tmp":"tmp/services_0.2.0_1776603072701_0.4429097065725287","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@kehto/services","version":"0.5.0","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.5.0","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"d1980b7cfafa8aaeb656c37c0c7ea754d259be62","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.5.0.tgz","fileCount":9,"integrity":"sha512-KZRvJM18RlXCIc5EsEPX3Ml+acF1KyxiNjYYOZcnejo2N7EH+CAIbicXJ6miRYZnxA6OEohbcvYgG3isHjSJ2g==","signatures":[{"sig":"MEYCIQDJMFJ8vfBrN7Jzey/caQrBMq2vG7GJU9M5y+i0JUr9EgIhAMI7JidvV9Jk8iKsEWa5ZMzpHkMk2WZnBjdxD9ebtI7M","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":396431},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.5.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/1c54afff8ebc50013240a299fb8db10e/kehto-services-0.5.0.tgz","_integrity":"sha512-KZRvJM18RlXCIc5EsEPX3Ml+acF1KyxiNjYYOZcnejo2N7EH+CAIbicXJ6miRYZnxA6OEohbcvYgG3isHjSJ2g==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"@kehto/runtime":"0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nub":"^0.5.0","@napplet/core":"^0.5.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <3.0.0","@napplet/nub":"^0.5.0","@napplet/core":"^0.5.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.5.0_1781405656163_0.768614617321774","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@kehto/services","version":"0.6.0","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.6.0","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"5228f40106375d3e0a62520d64f64c7b87ebf036","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.6.0.tgz","fileCount":9,"integrity":"sha512-zW6oWV703DDhNL1f2LGTW1XgThop23crTgUUFR200Y6WdIdKz87iM+2q6MMoRysncg6vDmYR8xq9MzfXnVyFXA==","signatures":[{"sig":"MEYCIQCWG6ABtYplZwBQ4DSvSPkhPGryO4cx+bEvb/RherbRYQIhALPOFto0PdieIARqN+FM1TOosB/2lqu/8r6hXTFKYKW7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":469648},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.6.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/267c696d73a8c2374600da028fd63324/kehto-services-0.6.0.tgz","_integrity":"sha512-zW6oWV703DDhNL1f2LGTW1XgThop23crTgUUFR200Y6WdIdKz87iM+2q6MMoRysncg6vDmYR8xq9MzfXnVyFXA==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"@kehto/runtime":"0.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nub":"^0.5.0","@napplet/core":"^0.5.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <3.0.0","@napplet/nub":"^0.5.0","@napplet/core":"^0.5.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.6.0_1781439407806_0.08002680630124015","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@kehto/services","version":"0.7.0","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.7.0","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"83c47c349a3d709bf49e2c4d9866e9c81f111b0b","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.7.0.tgz","fileCount":9,"integrity":"sha512-JPRfUgcYzUfbpXmpk5HRhkpe1j3Cgu3uly8vkr/9xyTgH/KU0SC1mwlDBhge6i+am3vz91m7De11pFCBN1be9g==","signatures":[{"sig":"MEQCIGPT4LCzuxGZayi/NIAWxjTyhv2f2CcpUpdCQj9PUwATAiB0Nbhs/5tB1NsqWLHH2r9NNTcVNmHZMpy89RDjyVJ3xA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":519155},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.7.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/73ecfecf9377f4d489dc90c0c48e5234/kehto-services-0.7.0.tgz","_integrity":"sha512-JPRfUgcYzUfbpXmpk5HRhkpe1j3Cgu3uly8vkr/9xyTgH/KU0SC1mwlDBhge6i+am3vz91m7De11pFCBN1be9g==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"@kehto/runtime":"0.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nub":"^0.5.0","@napplet/core":"^0.5.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <3.0.0","@napplet/nub":"^0.5.0","@napplet/core":"^0.5.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.7.0_1781445139146_0.1835059129816361","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@kehto/services","version":"0.8.0","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.8.0","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"66b43fa50dd32411e3a1f23b1f590831d8c836ba","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.8.0.tgz","fileCount":9,"integrity":"sha512-Cd/3FOoyTUM3m9GKWQs/T7XITeMCBQ2JZzT317qBt+zinKW2SuAzsjDLGreEwEv1F/5n0oStaLpX4J8MbawMEg==","signatures":[{"sig":"MEUCIQCzgB9n/WggqSD1DF1gyc3o/VO8wMPDRoOAw9qHG8fpsQIgc5Os/T0TKud6CiK0tIOP4RALxCsMhKiirVZPE5NZj/c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":500930},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.8.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/59090c5f8ef09972862385ec2c0706f9/kehto-services-0.8.0.tgz","_integrity":"sha512-Cd/3FOoyTUM3m9GKWQs/T7XITeMCBQ2JZzT317qBt+zinKW2SuAzsjDLGreEwEv1F/5n0oStaLpX4J8MbawMEg==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"@kehto/runtime":"0.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nub":"^0.5.0","@napplet/core":"^0.5.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <3.0.0","@napplet/nub":"^0.5.0","@napplet/core":"^0.5.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.8.0_1781451552440_0.8152853098937503","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"@kehto/services","version":"0.9.1","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.9.1","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"0ceb237d19042a9c48be1f57911cd741798ee36e","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.9.1.tgz","fileCount":9,"integrity":"sha512-W11lCgWEGL1/HCoUZa2eubU5NFgW5H9MNdmxVeV4hZY3OzDmlYO5u20oNhMsaoLocjEFHk2UhYJjDqFWi/baow==","signatures":[{"sig":"MEUCIQCLLmHcJajZzQlkRbqYbgCnhwrndmyR/8oahg8FB0e9UgIgGMX36fw1y6UjjQaRD+zVgjHJYvelT8FNDyquotxSSY4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.9.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":546958},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.9.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/2444782138d8ddd8e39c50cd65244c0d/kehto-services-0.9.1.tgz","_integrity":"sha512-W11lCgWEGL1/HCoUZa2eubU5NFgW5H9MNdmxVeV4hZY3OzDmlYO5u20oNhMsaoLocjEFHk2UhYJjDqFWi/baow==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"@kehto/runtime":"0.10.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nub":"^0.5.0","@napplet/core":"^0.5.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <3.0.0","@napplet/nub":"^0.5.0","@napplet/core":"^0.5.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.9.1_1781567092227_0.9318390402732304","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@kehto/services","version":"0.10.0","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.10.0","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"168e36882a8be909e6081a8c1878bf754c2c1160","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.10.0.tgz","fileCount":9,"integrity":"sha512-VJcPvcCmKyVicZSKYPQC3ZOmRfqpKbqLf+KwBnUGckpnEEcqoqRZjWv7bwJyGTz6+gfUBaDfndGC0pXLBQ6QwA==","signatures":[{"sig":"MEUCIQCm9JO1/RmEVisoKYB3mFo13caONU94KvKtI43VeaGjZwIgIHcUAHAa962CMxde0iP5JaboKdzaAKmuxWxfeW3AANI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":553333},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.10.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/502cbce9e511c3b1dc668037e7d0cff4/kehto-services-0.10.0.tgz","_integrity":"sha512-VJcPvcCmKyVicZSKYPQC3ZOmRfqpKbqLf+KwBnUGckpnEEcqoqRZjWv7bwJyGTz6+gfUBaDfndGC0pXLBQ6QwA==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"@kehto/runtime":"0.11.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":"^0.12.0","@napplet/core":"^0.12.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <3.0.0","@napplet/nap":"^0.12.0","@napplet/core":"^0.12.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.10.0_1781704138226_0.4142832281770592","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"@kehto/services","version":"0.10.1","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.10.1","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"72d666284f0b484c45ddd054cc04701c806d3f09","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.10.1.tgz","fileCount":9,"integrity":"sha512-CrOWXa6RLzxY5IDBJqRskZjEAyiGmbxSVNwOnIG0KJ50oUxZGs2upS5cvxTmJhrOisd0Dg5vQ22YUKt7rRo+3g==","signatures":[{"sig":"MEYCIQCQailGTU1VoqygPd0qu6ECebrC/gm3bK1FbEYIxudKMgIhANNxZibg/du54lKzgM3dFp0QH/MVWyAb+s5nhgGICY3E","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.10.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":553333},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.10.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/2b4d2b0b82bb73d4c7f8f3118983feb6/kehto-services-0.10.1.tgz","_integrity":"sha512-CrOWXa6RLzxY5IDBJqRskZjEAyiGmbxSVNwOnIG0KJ50oUxZGs2upS5cvxTmJhrOisd0Dg5vQ22YUKt7rRo+3g==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"@kehto/runtime":"0.12.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":"^0.12.0","@napplet/core":"^0.12.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <3.0.0","@napplet/nap":"^0.12.0","@napplet/core":"^0.12.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.10.1_1781713200099_0.9141684059243798","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@kehto/services","version":"0.11.0","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.11.0","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"75e78eb5e74ed3428dc4329ed5f8b0e44432fff6","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.11.0.tgz","fileCount":9,"integrity":"sha512-pqvAQ0k2dd8HookhYxAa2qrNs7za02/cgn0zhVD88D7hREnKfZVHm9Zb7sRAQU6PXzPDQSYl1dTjzZy/ElGbYA==","signatures":[{"sig":"MEQCIBf6L2zmhkepWWVEkLsDYCliNzv0LmO39wmYTnq71EmOAiANpMlE0KEQqYd2nP2ulYJqQluy2mpctvrm4LhBF1TcKQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":553507},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.11.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/4387fb4129f32c412c80105f7116b46c/kehto-services-0.11.0.tgz","_integrity":"sha512-pqvAQ0k2dd8HookhYxAa2qrNs7za02/cgn0zhVD88D7hREnKfZVHm9Zb7sRAQU6PXzPDQSYl1dTjzZy/ElGbYA==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"@kehto/runtime":"0.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":"^0.13.0","@napplet/core":"^0.13.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <3.0.0","@napplet/nap":">=0.12.0 <0.14.0","@napplet/core":">=0.12.0 <0.14.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.11.0_1781789145066_0.9572162935368904","host":"s3://npm-registry-packages-npm-production"}},"0.11.1":{"name":"@kehto/services","version":"0.11.1","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.11.1","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"6c03996cb2a6bbeb6e5005d8fa0aba9ddb56f702","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.11.1.tgz","fileCount":9,"integrity":"sha512-AqFrzn56Am6pfEFqaoWy9HFy9VH9FgH5wTd8zSkDkBd5QvsVn1TTdLhM5Cn4E7feGAV9T66qEzMGzRS4CiEMQA==","signatures":[{"sig":"MEUCIQCnO0BEuP+FtQzdpcwLWPFPVuVJgXlYmeIvVgAH2FbTDwIgZvqz50HbgCE/JuQa+tMLmzsaqEj9PVed8CqvVvd/3K8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.11.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":570008},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.11.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/5c1c1e4b729c48a26b9815b66da33a97/kehto-services-0.11.1.tgz","_integrity":"sha512-AqFrzn56Am6pfEFqaoWy9HFy9VH9FgH5wTd8zSkDkBd5QvsVn1TTdLhM5Cn4E7feGAV9T66qEzMGzRS4CiEMQA==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"@kehto/runtime":"0.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":"^0.13.0","@napplet/core":"^0.13.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <3.0.0","@napplet/nap":">=0.12.0 <0.14.0","@napplet/core":">=0.12.0 <0.14.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.11.1_1782099057074_0.8578473036052321","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@kehto/services","version":"0.12.0","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.12.0","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"00391ef1e61e9b3c5187824074045ca0a299dc30","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.12.0.tgz","fileCount":9,"integrity":"sha512-Fs4KQuXkVREy7Gg5QoUbJtrjzrr4HVtgeJW9IVBd9jkpww9fj19zcgF+LzZ8VVN27WEV3sCBDZpcOWGUcrXdhA==","signatures":[{"sig":"MEUCIGLPURKGi17IyLpZy+4Y/8s2BF1o1kIKzL1r1JNaN4XQAiEA6QvH1BzfjJAvzKgGNbg/KlM/z9SwhMce72Y76oDVnbs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":674470},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.12.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/148e8235470674558da60d533128a0ad/kehto-services-0.12.0.tgz","_integrity":"sha512-Fs4KQuXkVREy7Gg5QoUbJtrjzrr4HVtgeJW9IVBd9jkpww9fj19zcgF+LzZ8VVN27WEV3sCBDZpcOWGUcrXdhA==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"@kehto/runtime":"^0.14.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":"^0.20.0","@napplet/core":"^0.20.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <3.0.0","@napplet/nap":">=0.20.0 <0.21.0","@napplet/core":">=0.20.0 <0.21.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.12.0_1782200270458_0.3550181824647709","host":"s3://npm-registry-packages-npm-production"}},"0.12.1":{"name":"@kehto/services","version":"0.12.1","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.12.1","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"bc2b88f857ff004d89080bbd2a1420506101b89a","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.12.1.tgz","fileCount":9,"integrity":"sha512-Ko+nM9lyFDBddyAZCJehDgJpQPYb1bthtxQhTkc4/JSm86h5Wh2r8pC80raJbT8llaJ53b+ktyf1NUA+QrXakA==","signatures":[{"sig":"MEYCIQDCTY2lUOfjbDXlAZvRNh+rBlrDXdK0I52+YKzjncsBzwIhAI02SvEdLGb4X8bkUPSmjOCuxS0Mykj3i+6u0n5Gz/Fh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.12.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":674488},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.12.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/77560b333067d75cbbf7ec1a35423c67/kehto-services-0.12.1.tgz","_integrity":"sha512-Ko+nM9lyFDBddyAZCJehDgJpQPYb1bthtxQhTkc4/JSm86h5Wh2r8pC80raJbT8llaJ53b+ktyf1NUA+QrXakA==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"@kehto/runtime":"^0.14.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":">=0.21.0 <0.22.0","@napplet/core":">=0.21.0 <0.22.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <3.0.0","@napplet/nap":">=0.21.0 <0.22.0","@napplet/core":">=0.21.0 <0.22.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.12.1_1782245166670_0.045945169259421714","host":"s3://npm-registry-packages-npm-production"}},"0.12.3":{"name":"@kehto/services","version":"0.12.3","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.12.3","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"0b9e1df22b5049e4915092739f0e39adf59b4722","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.12.3.tgz","fileCount":9,"integrity":"sha512-hdu8NbwRWtU7lsx+psxkC4jMGXbxKJ6tUHGWu6BbH0jrJrAHZ3KfHtmK0DWQhVto8EdpOlLUKqK1wgss1PvVLA==","signatures":[{"sig":"MEUCIQDB+kRxCXZTgm1CevJqxrl+HpBp/j2traE+/A68XJ92cgIgcldDr5QKby60oK8vc3U5ZGdflY+RrOcoUzQGcWAroLc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.12.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":675757},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.12.3.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/27605a1b76a1a93573d5aef7a5584582/kehto-services-0.12.3.tgz","_integrity":"sha512-hdu8NbwRWtU7lsx+psxkC4jMGXbxKJ6tUHGWu6BbH0jrJrAHZ3KfHtmK0DWQhVto8EdpOlLUKqK1wgss1PvVLA==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"@kehto/runtime":"^0.15.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":">=0.21.0 <0.22.0","@napplet/core":">=0.21.0 <0.22.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <3.0.0","@napplet/nap":">=0.21.0 <0.22.0","@napplet/core":">=0.21.0 <0.22.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.12.3_1782337094107_0.715153449769347","host":"s3://npm-registry-packages-npm-production"}},"0.13.1":{"name":"@kehto/services","version":"0.13.1","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.13.1","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"660ee55d123c75e00aaf9c4850180b954d24eacb","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.13.1.tgz","fileCount":9,"integrity":"sha512-5NI/ZebwymB61tWZ6b/0FaMdKj1HKoabwkigI7p1gFwpchVNUBm4fq8c2UfzeyOuuyV96NStA9IqPaYXnx6pWA==","signatures":[{"sig":"MEQCIFGPPAhYTZysn1LPOsxHOG+BjFSDdULzM/unkUTdGy3UAiAw90HHeb1qvwmWoi/SKtH6PufXbvm3Mf96A3iPWFcPlQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.13.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":792793},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.13.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/7ab248dee4a70740f4744f89dd6a5626/kehto-services-0.13.1.tgz","_integrity":"sha512-5NI/ZebwymB61tWZ6b/0FaMdKj1HKoabwkigI7p1gFwpchVNUBm4fq8c2UfzeyOuuyV96NStA9IqPaYXnx6pWA==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.23.0","dependencies":{"@kehto/runtime":"^0.16.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":">=0.23.0 <0.24.0","@napplet/core":">=0.23.0 <0.24.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <3.0.0","@napplet/nap":">=0.23.0 <0.24.0","@napplet/core":">=0.23.0 <0.24.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.13.1_1782731861458_0.000941580374609785","host":"s3://npm-registry-packages-npm-production"}},"0.13.2":{"name":"@kehto/services","version":"0.13.2","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.13.2","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"133b6fa66f8b4dccea08020ca19afa2793eaf345","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.13.2.tgz","fileCount":9,"integrity":"sha512-tADv3x380jRFZXTrUGI6o3bkYBZS4OjS/wkMgSs2tDjIHLM7AMrff7+DGtBkB01Al8wTb4Fm+4JBlPbqKM/xIw==","signatures":[{"sig":"MEQCIGr69MGzSFXyjz6M3Ks0GyZmoUBihKG8JE1bJBU+uguTAiAqXTwoK3wq0KpnCE/HClGvqtt4sA3Ocy+2h4jxATkq3Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.13.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":792793},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.13.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/7c45f2ac108ca148a572cbd79a116561/kehto-services-0.13.2.tgz","_integrity":"sha512-tADv3x380jRFZXTrUGI6o3bkYBZS4OjS/wkMgSs2tDjIHLM7AMrff7+DGtBkB01Al8wTb4Fm+4JBlPbqKM/xIw==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.23.0","dependencies":{"@kehto/runtime":"^0.16.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":">=0.23.0 <0.25.0","@napplet/core":">=0.23.0 <0.25.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <3.0.0","@napplet/nap":">=0.23.0 <0.25.0","@napplet/core":">=0.23.0 <0.25.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.13.2_1782733810818_0.6711597876513384","host":"s3://npm-registry-packages-npm-production"}},"0.14.1":{"name":"@kehto/services","version":"0.14.1","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.14.1","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"0b79e4e9e81b5fff24de53f0c17f6713094106c9","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.14.1.tgz","fileCount":9,"integrity":"sha512-YxoIruchg5R15CV0kDD0nRlI5WDE7fbB/+qalXMZlyhkNgLr5pTjq/iCBq6DrqyMlV3qezz7+KH3uVeie4sdYA==","signatures":[{"sig":"MEQCIB53w8mdWJKH4jhGw+Ox9FfNCasdfoRwgcgVdNEXKiJ2AiBh33rHXUjSAw953hlvmasJN7fC8Hxz8tYaHiAfklv90A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.14.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":806845},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.14.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/e25668f1d66b3650170d7b61680bd56c/kehto-services-0.14.1.tgz","_integrity":"sha512-YxoIruchg5R15CV0kDD0nRlI5WDE7fbB/+qalXMZlyhkNgLr5pTjq/iCBq6DrqyMlV3qezz7+KH3uVeie4sdYA==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.18.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.23.0","dependencies":{"@kehto/runtime":"^0.17.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":">=0.23.0 <0.26.0","@napplet/core":">=0.23.0 <0.26.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <3.0.0","@napplet/nap":">=0.23.0 <0.26.0","@napplet/core":">=0.23.0 <0.26.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.14.1_1782967576558_0.6775931761904626","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"@kehto/services","version":"0.15.0","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.15.0","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"b8dbe2bc707d51ced1832d71c6eb7daa823d3734","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.15.0.tgz","fileCount":9,"integrity":"sha512-H5+Bz+5epuVqsCYvVpFf3eRO4ajvV+wWoCF1WytuFKaNn7YSVH0i0LRvbZSpSv60xoILe86Jo6SHxHj9jwqoMQ==","signatures":[{"sig":"MEUCIQCLTd24i25O6B+oEdWqLx94D9VGhctRcUpOkl75XfeSKwIgLWtHO+Ipl9Myd+tndnVU0DN7MHDdj/1q4F7sUMOHVYU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.15.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":806716},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.15.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/8503bfeb6450277669efb49c6c5a0a74/kehto-services-0.15.0.tgz","_integrity":"sha512-H5+Bz+5epuVqsCYvVpFf3eRO4ajvV+wWoCF1WytuFKaNn7YSVH0i0LRvbZSpSv60xoILe86Jo6SHxHj9jwqoMQ==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.18.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"@kehto/runtime":"^0.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":">=0.23.0 <0.26.0","@napplet/core":">=0.23.0 <0.26.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <3.0.0","@napplet/nap":">=0.23.0 <0.26.0","@napplet/core":">=0.23.0 <0.26.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.15.0_1783075564900_0.1991752291427482","host":"s3://npm-registry-packages-npm-production"}},"0.16.1":{"name":"@kehto/services","version":"0.16.1","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.16.1","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"119000d2b3611a1320344d700faf35a0d7c864f5","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.16.1.tgz","fileCount":9,"integrity":"sha512-lvJYJWaqq1/AXVny6LrBle4bTbmGz1/XfOykIdGNJrCHCGsnPB0t3YMccV6R32Vq1FQyyhaZ5fbLy4dNTBH56A==","signatures":[{"sig":"MEYCIQCky2RI1uT0LNyur8WrOhCaUVs6gFB24sSF3JZyd8k7VgIhAN5a2APc2yC8fnKLwL3YFahvYO392pXB9hDfN0ldzvkN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.16.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":808182},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.16.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/6d9518900c5c4b6695a409d2945789b5/kehto-services-0.16.1.tgz","_integrity":"sha512-lvJYJWaqq1/AXVny6LrBle4bTbmGz1/XfOykIdGNJrCHCGsnPB0t3YMccV6R32Vq1FQyyhaZ5fbLy4dNTBH56A==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.18.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"@kehto/runtime":"^0.18.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":">=0.23.0 <=0.27.x","@napplet/core":">=0.23.0 <=0.27.x"},"peerDependencies":{"nostr-tools":">=2.23.3 <=2.x","@napplet/nap":">=0.23.0 <=0.27.x","@napplet/core":">=0.23.0 <=0.27.x"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.16.1_1783119414547_0.13328723009774146","host":"s3://npm-registry-packages-npm-production"}},"0.16.5":{"name":"@kehto/services","version":"0.16.5","keywords":["nostr","napplet","kehto","services","audio","notifications"],"license":"MIT","_id":"@kehto/services@0.16.5","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"5b44fcd00bce7c1bb89d83f97acb1cbd6763ef0b","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.16.5.tgz","fileCount":9,"integrity":"sha512-yyJyDg+b81cTqOWhim9VcUgWgNuv7kxJIfXP2BAkZRDDLKlFpW9kTCHzkY9I3uXGNi2yUWWq41QpLaW22w2MNw==","signatures":[{"sig":"MEYCIQCEokW6oVSIAahH1tTIcqHa6NSse25ZOUpxgcOoUmveTwIhALFhE5wQeyzX3D5Pz5s1ntoyte2ZNbMA6IFBqfkh2XgN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.16.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":842870},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.16.5.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/fafe90eb7286503c19aad62cd973be2c/kehto-services-0.16.5.tgz","_integrity":"sha512-yyJyDg+b81cTqOWhim9VcUgWgNuv7kxJIfXP2BAkZRDDLKlFpW9kTCHzkY9I3uXGNi2yUWWq41QpLaW22w2MNw==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — audio, notifications, and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"@kehto/runtime":"^0.18.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":">=0.23.0 <=0.28.x","@napplet/core":">=0.23.0 <=0.28.x"},"peerDependencies":{"nostr-tools":">=2.23.3 <=2.x","@napplet/nap":">=0.23.0 <=0.28.x","@napplet/core":">=0.23.0 <=0.28.x"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.16.5_1783811185923_0.8519630346645808","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"@kehto/services","version":"0.17.0","keywords":["nostr","napplet","kehto","services","notifications"],"license":"MIT","_id":"@kehto/services@0.17.0","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"a2bff00285b547b9b2edef56a03f3def6d8c0de7","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.17.0.tgz","fileCount":9,"integrity":"sha512-TBTtdffXYZplNjgXG5Ks7QM/wVTSeiwVNqk12cHWIypQJk05RAPq7ToSKapOWl1TigMd6Pxb10g6SBqd/By42w==","signatures":[{"sig":"MEQCIHyKZawlnDn6IS3Z4AolAYZKXj+F5U0IY/R8bvf3VE2AAiBw0hQ30FTP3NiNXySlGll68MmHrup0bv7GM4Jgpt4GeQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.17.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":851720},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.17.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/0e52699bca536cb89323a58562c15928/kehto-services-0.17.0.tgz","_integrity":"sha512-TBTtdffXYZplNjgXG5Ks7QM/wVTSeiwVNqk12cHWIypQJk05RAPq7ToSKapOWl1TigMd6Pxb10g6SBqd/By42w==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — notifications and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"@kehto/runtime":"^0.19.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":">=0.29.0 <0.30.0","@napplet/core":">=0.29.0 <0.30.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <=2.x","@napplet/nap":">=0.29.0 <0.30.0","@napplet/core":">=0.29.0 <0.30.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.17.0_1785234061519_0.8943307212989293","host":"s3://npm-registry-packages-npm-production"}},"0.18.0":{"name":"@kehto/services","version":"0.18.0","keywords":["nostr","napplet","kehto","services","notifications"],"license":"MIT","_id":"@kehto/services@0.18.0","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"d42b13e3a0bc4aa41ab30d875efb8b0fb641a98f","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.18.0.tgz","fileCount":9,"integrity":"sha512-1j0cf6XtwLF+GZ6yIPWU4mP8ngT/p2EIdXqRtC2Tns9YkUAxuxeNfjFLK5fTuJA3N6IW6y0DWFF6OE9m8a8OEA==","signatures":[{"sig":"MEUCIHeOeJGmKX1sUHOQROH3ZeJW0LMleomTpkEaDaVhqeJ0AiEA6BAr/zKssXhAScpyFnvMKKiN24uw8qmKysFjNhH/otQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.18.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":849854},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.18.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/47830ae8519263447606e6aa4c4e77aa/kehto-services-0.18.0.tgz","_integrity":"sha512-1j0cf6XtwLF+GZ6yIPWU4mP8ngT/p2EIdXqRtC2Tns9YkUAxuxeNfjFLK5fTuJA3N6IW6y0DWFF6OE9m8a8OEA==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — notifications and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"@kehto/runtime":"^0.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":">=0.31.0 <0.32.0","@napplet/core":">=0.31.0 <0.32.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <=2.x","@napplet/nap":">=0.31.0 <0.32.0","@napplet/core":">=0.31.0 <0.32.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.18.0_1785264724869_0.18952895971293482","host":"s3://npm-registry-packages-npm-production"}},"0.18.1":{"name":"@kehto/services","version":"0.18.1","keywords":["nostr","napplet","kehto","services","notifications"],"license":"MIT","_id":"@kehto/services@0.18.1","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"794054659ccb3a424e199b4df788173c51218ab5","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.18.1.tgz","fileCount":9,"integrity":"sha512-l1MLQFAYsMze0sbdI0W83DyMFAoupMlIbmUK3XmZMj4Xukbkx275qmVZDOEZQAVW9Wr8eRHCTfXdhiEObN2vTg==","signatures":[{"sig":"MEUCIQDBNSI5raffreBJEHeO47mQMVmvL/XhcfVAqrUOpDJlbgIgeVx4UGysoCGYuEmlktUZCUcwDgQZcOWcE1P6nNHjvaE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.18.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":849894},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.18.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/e86778daa20d0990e8be59d7ccfe10bf/kehto-services-0.18.1.tgz","_integrity":"sha512-l1MLQFAYsMze0sbdI0W83DyMFAoupMlIbmUK3XmZMj4Xukbkx275qmVZDOEZQAVW9Wr8eRHCTfXdhiEObN2vTg==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — notifications and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"@kehto/runtime":"^0.20.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":">=0.31.0 <0.32.0","@napplet/core":">=0.31.0 <0.32.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <=2.x","@napplet/nap":">=0.31.0 <0.32.0","@napplet/core":">=0.31.0 <0.32.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.18.1_1785341463375_0.6571738838547758","host":"s3://npm-registry-packages-npm-production"}},"0.19.0":{"name":"@kehto/services","version":"0.19.0","keywords":["nostr","napplet","kehto","services","notifications"],"license":"MIT","_id":"@kehto/services@0.19.0","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"b773bb0f925f694836a2ea74d04a437ccf617364","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.19.0.tgz","fileCount":9,"integrity":"sha512-CvXxAnfNSSx/dcBfA8biYf3qfiOJdAY0grh4zEd3zmL6OOTpu9g73djhkOZUMkgKVxPZVDGGjiKpkwtx2Ypv/Q==","signatures":[{"sig":"MEQCIBlgcnE7dkCUnuAPfbS75wNROBuZueePF0VsKOTAsaE4AiBfoWn/JSAXWweTvbOyBWW0NPHfd+ULR6ehLXPxZmCKmQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.19.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":851561},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.19.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/e0f1f44a3ce09f210b369cd5cf3dce43/kehto-services-0.19.0.tgz","_integrity":"sha512-CvXxAnfNSSx/dcBfA8biYf3qfiOJdAY0grh4zEd3zmL6OOTpu9g73djhkOZUMkgKVxPZVDGGjiKpkwtx2Ypv/Q==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — notifications and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"@kehto/runtime":"^0.21.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":">=0.31.0 <0.32.0","@napplet/core":">=0.31.0 <0.32.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <=2.x","@napplet/nap":">=0.31.0 <0.32.0","@napplet/core":">=0.31.0 <0.32.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.19.0_1785459567447_0.7201823800517615","host":"s3://npm-registry-packages-npm-production"}},"0.20.0":{"name":"@kehto/services","version":"0.20.0","keywords":["nostr","napplet","kehto","services","notifications"],"license":"MIT","_id":"@kehto/services@0.20.0","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"f7fa1723e3206af8720a304b8854d1c10d50d631","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.20.0.tgz","fileCount":9,"integrity":"sha512-KkKiakbm8Lwzfy9gxH1VhBayTI56oy9UmVxazCKlY0fSvTrpeHASO2j1cAH86af/L7HYeQg3G0cgRoTEypsP6Q==","signatures":[{"sig":"MEYCIQC1zC5QznXfX5BZuhDZYKEVwQHiJkdyXUXa6hIN8RUMIQIhAIKRONd58IpZS7f7Nsuh1AfP/VLyXKYNycTUoggckBRx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.20.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":964994},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.20.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/7ea1bb0a789b5110bb6356523c3c6282/kehto-services-0.20.0.tgz","_integrity":"sha512-KkKiakbm8Lwzfy9gxH1VhBayTI56oy9UmVxazCKlY0fSvTrpeHASO2j1cAH86af/L7HYeQg3G0cgRoTEypsP6Q==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — notifications and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"@kehto/runtime":"^0.22.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":">=0.31.0 <0.32.0","@napplet/core":">=0.31.0 <0.32.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <=2.x","@napplet/nap":">=0.31.0 <0.32.0","@napplet/core":">=0.31.0 <0.32.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.20.0_1786284903799_0.3693186352557727","host":"s3://npm-registry-packages-npm-production"}},"0.20.1":{"name":"@kehto/services","version":"0.20.1","keywords":["nostr","napplet","kehto","services","notifications"],"license":"MIT","_id":"@kehto/services@0.20.1","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"be9a0c138a0685f28c24b8cbc08bdb6c14622dc8","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.20.1.tgz","fileCount":9,"integrity":"sha512-tTyn3DFGwuGyuirISzHEBInlEreTQYRMpKEdM8fDoxm50/8Bol3jxebben1y3LtogbfBfdepaaj7QVXoiSSV9g==","signatures":[{"sig":"MEUCIQD21nNJ3W2wKuPbYHBLnGlspHw9RU66enb0PXgxqDKd4gIgV/Y1WXzfnlvhbFlspcvuQhh0fjtVqTH5kyUFbocm9FQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.20.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":965463},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.20.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/54519afa200a91502badeb178391c748/kehto-services-0.20.1.tgz","_integrity":"sha512-tTyn3DFGwuGyuirISzHEBInlEreTQYRMpKEdM8fDoxm50/8Bol3jxebben1y3LtogbfBfdepaaj7QVXoiSSV9g==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — notifications and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@kehto/runtime":"^0.22.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":">=0.31.0 <0.32.0","@napplet/core":">=0.31.0 <0.32.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <=2.x","@napplet/nap":">=0.31.0 <0.32.0","@napplet/core":">=0.31.0 <0.32.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.20.1_1787406793205_0.3061153844731983","host":"s3://npm-registry-packages-npm-production"}},"0.21.0":{"name":"@kehto/services","version":"0.21.0","keywords":["nostr","napplet","kehto","services","notifications"],"license":"MIT","_id":"@kehto/services@0.21.0","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"2809d8f280f97167a37acd4c4024966479851261","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.21.0.tgz","fileCount":9,"integrity":"sha512-FAqQbQ4ycDyJudt/akBblUYkjErBrMqKsgP8xjlcwEOljMxXVp0ZmXxVLVF8vHN/UALPcvXW515M75j9a1OVqA==","signatures":[{"sig":"MEUCIQDNgIFfL45VySUMd7UodUr5JTubcwQplyPl9i5KLpNZvAIgYm1TyAux+UIvxbJ3Knmy5s4PPLnvo0djA+ai4lmf3QI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.21.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":968707},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.21.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/6a24c53094cbcc617bcc9264451d107f/kehto-services-0.21.0.tgz","_integrity":"sha512-FAqQbQ4ycDyJudt/akBblUYkjErBrMqKsgP8xjlcwEOljMxXVp0ZmXxVLVF8vHN/UALPcvXW515M75j9a1OVqA==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — notifications and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@kehto/runtime":"^0.23.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":">=0.32.0 <0.33.0","@napplet/core":">=0.32.0 <0.33.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <=2.x","@napplet/nap":">=0.32.0 <0.33.0","@napplet/core":">=0.32.0 <0.33.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.21.0_1787856766516_0.1960155638376999","host":"s3://npm-registry-packages-npm-production"}},"0.21.1":{"name":"@kehto/services","version":"0.21.1","keywords":["nostr","napplet","kehto","services","notifications"],"license":"MIT","_id":"@kehto/services@0.21.1","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"homepage":"https://github.com/kehto/web#readme","bugs":{"url":"https://github.com/kehto/web/issues"},"dist":{"shasum":"6236e19c6111686c9fcc01d88e7ef65c61c4381b","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.21.1.tgz","fileCount":9,"integrity":"sha512-KaqAyv/dO0EEaRAxIbxQ7Ewt/kpOqYEFIfOv5tdar2K1oPnlKVLKceVT8quYZt5L7xPKhm6UzX9n1Rq+5NH6Ug==","signatures":[{"sig":"MEYCIQC8xQc2wPe0KORsVdiWRrpBtSdcMYQlFDkZ3vDOP6DGWAIhAIKkx3Q/G7Rn07W+xPJVvZkj7w6JsDRvP8iaJfrH6dHP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.21.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":970848},"main":"./dist/index.js","type":"module","_from":"file:kehto-services-0.21.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"scripts":{"build":"tsup","test:unit":"echo 'no unit tests yet'","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"_resolved":"/tmp/983f4c051e32fc00bf363417dc825804/kehto-services-0.21.1.tgz","_integrity":"sha512-KaqAyv/dO0EEaRAxIbxQ7Ewt/kpOqYEFIfOv5tdar2K1oPnlKVLKceVT8quYZt5L7xPKhm6UzX9n1Rq+5NH6Ug==","repository":{"url":"git+https://github.com/kehto/web.git","type":"git","directory":"packages/services"},"_npmVersion":"11.17.0","description":"Reference service implementations for the napplet protocol — notifications and extensible service handlers","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@kehto/runtime":"^0.23.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.1.2","typescript":"^5.9.3","nostr-tools":"^2.23.3","@napplet/nap":">=0.32.0 <0.33.0","@napplet/core":">=0.32.0 <0.33.0"},"peerDependencies":{"nostr-tools":">=2.23.3 <=2.x","@napplet/nap":">=0.32.0 <0.33.0","@napplet/core":">=0.32.0 <0.33.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/services_0.21.1_1787858142040_0.46535049407835216","host":"s3://npm-registry-packages-npm-production"}},"0.21.2":{"name":"@kehto/services","version":"0.21.2","description":"Reference service implementations for the napplet protocol — notifications and extensible service handlers","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cvm-nostr-transport":{"types":"./dist/cvm-nostr-transport.d.ts","import":"./dist/cvm-nostr-transport.js"}},"sideEffects":false,"publishConfig":{"access":"public"},"dependencies":{"@kehto/runtime":"^0.24.0"},"peerDependenciesMeta":{"nostr-tools":{"optional":true}},"peerDependencies":{"@napplet/core":">=0.32.0 <0.33.0","@napplet/nap":">=0.32.0 <0.33.0","nostr-tools":">=2.23.3 <=2.x"},"devDependencies":{"@napplet/core":">=0.32.0 <0.33.0","@napplet/nap":">=0.32.0 <0.33.0","nostr-tools":"^2.23.3","tsup":"^8.5.0","typescript":"^5.9.3","vitest":"^4.1.2"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/kehto/web.git","directory":"packages/services"},"keywords":["nostr","napplet","kehto","services","notifications"],"scripts":{"build":"tsup","type-check":"tsc --noEmit","test:unit":"echo 'no unit tests yet'"},"_id":"@kehto/services@0.21.2","bugs":{"url":"https://github.com/kehto/web/issues"},"homepage":"https://github.com/kehto/web#readme","_integrity":"sha512-DCscgGhFMR4MeqvVzewI0vLFO5yfRditpe83yzCKchBKD8CpM80knxNNDYNAq3H90yAodO9rsz/GLTSqDniVEw==","_resolved":"/tmp/7c80f7d831c9f8f1d87058129aefeeea/kehto-services-0.21.2.tgz","_from":"file:kehto-services-0.21.2.tgz","_nodeVersion":"22.23.2","_npmVersion":"11.17.0","dist":{"integrity":"sha512-DCscgGhFMR4MeqvVzewI0vLFO5yfRditpe83yzCKchBKD8CpM80knxNNDYNAq3H90yAodO9rsz/GLTSqDniVEw==","shasum":"df0dbf10370eada775c3c0644c45fe8e9ddbb039","tarball":"https://registry.npmjs.org/@kehto/services/-/services-0.21.2.tgz","fileCount":9,"unpackedSize":973674,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kehto%2fservices@0.21.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDiWnYbINr+lz8hK6TV2XdQR8Vo9xh84I3gpo6U/xJViwIgJx/FDa4zyiQzVXTboaiExYaqok+GTmkeYWycPHZl+0I="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a9b1db20-38ec-422f-bba4-83651a652dd5"}},"directories":{},"maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/services_0.21.2_1788814310707_0.04948621851080004"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-19T12:51:12.531Z","modified":"2026-09-07T20:51:51.340Z","0.2.0":"2026-04-19T12:51:12.866Z","0.5.0":"2026-06-14T02:54:16.287Z","0.6.0":"2026-06-14T12:16:47.938Z","0.7.0":"2026-06-14T13:52:19.279Z","0.8.0":"2026-06-14T15:39:12.623Z","0.9.1":"2026-06-15T23:44:52.370Z","0.10.0":"2026-06-17T13:48:58.388Z","0.10.1":"2026-06-17T16:20:00.247Z","0.11.0":"2026-06-18T13:25:45.213Z","0.11.1":"2026-06-22T03:30:57.231Z","0.12.0":"2026-06-23T07:37:50.625Z","0.12.1":"2026-06-23T20:06:06.937Z","0.12.3":"2026-06-24T21:38:14.357Z","0.13.1":"2026-06-29T11:17:41.646Z","0.13.2":"2026-06-29T11:50:10.973Z","0.14.1":"2026-07-02T04:46:16.765Z","0.15.0":"2026-07-03T10:46:05.086Z","0.16.1":"2026-07-03T22:56:54.683Z","0.16.5":"2026-07-11T23:06:26.149Z","0.17.0":"2026-07-28T10:21:01.657Z","0.18.0":"2026-07-28T18:52:05.089Z","0.18.1":"2026-07-29T16:11:03.575Z","0.19.0":"2026-07-31T00:59:27.632Z","0.20.0":"2026-08-09T14:15:04.024Z","0.20.1":"2026-08-22T13:53:13.362Z","0.21.0":"2026-08-27T18:52:46.733Z","0.21.1":"2026-08-27T19:15:42.186Z","0.21.2":"2026-09-07T20:51:50.889Z"},"bugs":{"url":"https://github.com/kehto/web/issues"},"license":"MIT","homepage":"https://github.com/kehto/web#readme","keywords":["nostr","napplet","kehto","services","notifications"],"repository":{"type":"git","url":"git+https://github.com/kehto/web.git","directory":"packages/services"},"description":"Reference service implementations for the napplet protocol — notifications and extensible service handlers","maintainers":[{"name":"sandwiches","email":"sandwich.farm@protonmail.com"}],"readme":"# @kehto/services\n\nReference service handlers for the napplet protocol — identity, relay pool,\ncache, keys, media, notify, theme, link, common, lists, serial, BLE, WebRTC,\nand DM.\n\n> **Alpha status:** Kehto is an early runtime toolkit for a draft NIP-5D\n> protocol. NAP contracts and service envelopes are not final; treat these\n> handlers as reference implementations for the current draft.\n\n## Install\n\n```bash\npnpm add @kehto/services\n```\n\n## Published Napplet Compatibility\n\n`@kehto/services` publishes against `@napplet/core` and `@napplet/nap`\n`>=0.32.0 <0.33.0`. The exact installed contracts are core 0.32.0 / nap 0.32.0\nfrom NAP-INTENT authority `5ac0490461ca6fec2f0d2e45b4835cf9bc08de24`,\nnapplet/web#199 source `3037200c932488f14f7f369b8583c39c9c16510a` / merge\n`b3f0007867eac109fa4917fac9c285d3b7cc6155`, and Version Packages #198 release\nsource `dc1d24153c759152b6ba31a6ec9bea967798f2df`.\n\n## Overview\n\n`@kehto/services` ships the reference implementations of the `ServiceHandler`\ncontract defined by `@kehto/runtime`. Each factory returns an object that the\nruntime routes NIP-5D envelopes to by the exact `message.type` domain (for\nexample, `notify.create` goes to the handler registered under `notify`).\n\nHost apps wire services into the runtime via `runtime.registerService(name, handler)`. The services are browser-agnostic — they have no DOM dependency. Browser-specific behaviors (audio element pool, OS notifications) are delivered through host-supplied callbacks.\n\nServices are selected only by the exact `message.type` domain. INC topics are\nopaque, queryless identities matched only by exact equality, so their text must\nnot select a service handler. The runtime attaches the sender to delivered INC\nevents from the authenticated endpoint; services do not create INC events.\n\nCurrent draft posture:\n\n- The v1.1 signer service is deleted outright. Its responsibilities split into two: read-only identity lookups go through `createIdentityService` (`getPublicKey`, `getRelays`, `getProfile`, `getFollows`, `getList`, `getZaps`, `getMutes`, `getBlocked`, `getBadges`); signing happens inside the shell as part of `relay.publish` / `relay.publishEncrypted` and is never exposed to napplets.\n- `createKeysService` and `createMediaService` ship real reference backends as of v1.4 (see the dedicated sections below). `createKeysService` attaches a document-level `keydown` listener by default and delivers `keys.action` push envelopes to registered napplets; `createMediaService` mirrors session metadata and playback state to `navigator.mediaSession` and emits `media.command` push envelopes on OS transport events. Both accept a host-bridge option (`HostKeysBridge` / `HostMediaBridge`) so Electron / Tauri / native shells can swap in OS-level backends without re-implementing the wire-protocol bookkeeping.\n- `createNotifyService` handles direct `notify.*` envelopes. It is not an INC\n  topic handler.\n- `createOutboxService` supports `outbox.getEvent` from draft NAP-OUTBOX. Single-event lookups run through shell-owned relay routing and only return events whose ID matches the request. Hosts can provide `getReadRouter` to scope all event-returning reads (`getEvent`, query, and subscription) to the authenticated source window, plus `getQueryRouter` when one-shot queries need an additional decorator. The draft wire contract keeps `outbox.query` one-shot and `outbox.subscribe` streaming; Kehto's concrete `createRelayPoolOutboxRouter` additionally exposes host-side `queryStream()` so verified query events can arrive before asynchronous NIP-65 discovery completes.\n- `createResourceService` implements NAP-RESOURCE at exact draft head `9511232f69313aa7953d110e35d32cc28d506f66` without choosing a runtime's network policy. Single requests carry optional advisory Blossom `servers`; bulk requests use canonical per-resource `requests: [{ url, servers? }]` entries. The service forwards hints to the injected resolver only for `blossom:`, preserves order and per-entry failures, and exposes optional `resource.info.maxServers`. By default it delegates every syntactically valid URL to the resolver; `resource.info.schemes` remains advisory. Runtimes that want hierarchical-origin grants can supply `isOriginGranted`, `getConnectGrants`, and `resolveIdentity` together, while scheme resolvers retain responsibility for hint validation, SSRF protection, redirects, and fallback policy. The service enforces supplied size/bulk caps, scopes cancellation to the requesting window, drops cancelled terminal envelopes, never forwards response headers, and preserves explicit `ResourceServiceError` codes.\n- `createUploadService` supports `upload.info` from draft NAP-UPLOAD. Hosts may expose configured rails, return URL forms, maximum bytes, and MIME type policy without requiring napplets to start an upload.\n- `createConfigService` implements draft NAP-CONFIG's shell-writer boundary: recursive bounded-subset schema validation, per-window schema/subscription state, deterministic defaults, invalid/orphan removal, version rollback rejection, scoped host persistence hooks, and settings-UI commits. Reads before schema registration fail closed with `no-schema`.\n- `createDmService` keeps NAP-DM request correlation, per-window subscriptions, and packaged message shapes in runtime-owned code. Adapters cover concrete transports: verified NIP-17 gift wraps and relay history via `nostr-tools`, structural NDR runtimes with relay hooks, and Cordn/ContextVM coordinator clients.\n- `createFsService` keeps NAP-FS result correlation and per-window watch identity in runtime-owned code. An injected `FsBackend` owns real persistence, virtual-path policy, picker mediation, byte validation, revisions, mutations, and watch observation.\n\n## NAP-INTENT manifest resolver\n\nKehto follows merged [NAP-INTENT at\n`5ac0490461ca6fec2f0d2e45b4835cf9bc08de24`](https://github.com/napplet/naps/blob/5ac0490461ca6fec2f0d2e45b4835cf9bc08de24/naps/NAP-INTENT.md).\nCallers invoke a stable, queryless `napplet:<archetype>/<action>` convention.\nInstalled verified manifest tags produce exact `{ slug, convention }`\ndeclarations; numbered protocol names, trailing metadata, and payload inspection\ndo not select a handler.\n\n- `manifestToIntentCatalogEntry()` converts resolved manifest\n  `{ dTag, title?, archetypes: [{ slug, convention }] }` data into exact\n  candidates with `actions` and `conventions`.\n- `createCatalogIntentResolver()` filters by exact convention, applies the\n  user-owned default/chooser/explicit-authorization policy, and asks an\n  `IntentTargetController` to create/focus a target and dispatch the selected\n  convention.\n- `createIntentService()` validates source envelopes, uses the runtime-attested\n  sender, returns one final canonical `IntentResult`, and broadcasts catalog\n  changes through recipient-policy-aware runtime sends.\n\n`ok: true` means the selected target was ready and the convention was dispatched.\nThe result includes `handled`, `handler`, `windowId`, and `convention`. The\ntarget receives the convention and opaque payload through one runtime-attested\n`inc.event`; there is no separate `intent.deliver` lifecycle.\n\nPaja currently exposes only an exact-contract development simulator, and the\nplayground currently exposes only a verified-manifest catalog builder. Phase\n105 completed released `@napplet/*` package adoption plus the persistent live\ncatalog/controller and feed-to-profile flow. Its public `Intent*` types are\ncanonical releases from `@napplet/core` / `@napplet/nap`, not a local mirror;\nsuccessful results report completed target dispatch.\n\n## Quick Start\n\n```ts\nimport {\n  createIdentityService,\n  createListsService,\n  createNotifyService,\n  createBleService,\n  createDmService,\n  createNip17DmAdapter,\n  createSerialService,\n  createWebrtcService,\n} from '@kehto/services';\n\n// Identity service — read-only lookups backed by a signer adapter.\nruntime.registerService(\n  'identity',\n  createIdentityService({\n    getSigner: () => signer,\n    getProfile: (pk) => nostrClient.fetchProfile(pk),\n    getFollows: (pk) => contactListCache.getFollows(pk),\n  }),\n);\n\n// Notification service — direct NIP-5D notify.* envelopes.\nruntime.registerService(\n  'notify',\n  createNotifyService({\n    present: ({ notificationId, message, emit }) => notificationCenter.show({\n      notificationId,\n      title: message.title,\n      body: message.body,\n      onClick: () => emit({ type: 'notify.clicked', notificationId }),\n    }),\n    dismiss: (_windowId, notificationId) => notificationCenter.dismiss(notificationId),\n    requestPermission: (_windowId, channel) => notificationPolicy.request(channel),\n  }),\n);\n\n// Lists service — shell-owned NIP-51 metadata and mutations.\nruntime.registerService(\n  'lists',\n  createListsService({\n    supported: () => [{ kind: 10003, type: 'bookmarks', addressable: false }],\n    add: (_list, items) => ({ ok: true, added: items.length }),\n    remove: (_list, items) => ({ ok: true, removed: items.length }),\n  }),\n);\n\n// Serial service — runtime-owned serial sessions and host-owned device access.\nruntime.registerService(\n  'dm',\n  createDmService({\n    adapter: createNip17DmAdapter({\n      ownerSecretKey: shellOwnedSecretKey,\n      relayPool: shellRelayPool,\n      relays: ['wss://relay.example'],\n    }),\n  }),\n);\n\nruntime.registerService(\n  'serial',\n  createSerialService({\n    open: () => ({ session: { id: 'host-session-1', state: 'open' } }),\n    write: (_sessionId, _data) => {},\n    close: (_sessionId) => {},\n  }),\n);\n\n// BLE service — runtime-owned BLE/GATT sessions and host-owned device access.\nruntime.registerService(\n  'ble',\n  createBleService({\n    open: () => ({\n      session: {\n        id: 'host-ble-1',\n        state: 'open',\n        device: { id: 'host-device-1', name: 'Host BLE' },\n      },\n    }),\n    services: () => [],\n    read: () => [87],\n    write: (_sessionId, _target, _data) => {},\n    subscribe: (sessionId, target, ctx) => {\n      ctx.emit({ type: 'notification', sessionId, target, data: [87] });\n    },\n    unsubscribe: (_sessionId, _target) => {},\n    close: (_sessionId) => {},\n  }),\n);\n\n// WebRTC service — runtime-owned sessions and host-owned signaling/transport.\nruntime.registerService(\n  'webrtc',\n  createWebrtcService({\n    open: (request, ctx) => {\n      const id = 'host-webrtc-1';\n      ctx.emit({ type: 'state', sessionId: id, state: 'open' });\n      return {\n        session: {\n          id,\n          scope: request.scope,\n          channel: request.channel ?? 'default',\n          protocol: request.protocol,\n          state: 'open',\n        },\n      };\n    },\n    send: (sessionId, payload, ctx) => {\n      ctx.emit({ type: 'message', sessionId, from: 'host', payload });\n    },\n    close: (_sessionId) => {},\n  }),\n);\n```\n\n## Outbox Streaming Queries\n\nNAP-OUTBOX is still an open upstream draft ([`napplet/naps` PR #32](https://github.com/napplet/naps/pull/32)). Its wire `outbox.query.result` remains one aggregate response. Hosts using Kehto's concrete router can also consume the same bounded read incrementally without changing the napplet wire protocol:\n\n```ts\nconst stream = router.queryStream(\n  [{ authors: [author], kinds: [1] }],\n  { timeoutMs: 3000 },\n  { event: (result) => render(result.event) },\n);\n\nconst aggregate = await stream.result;\n```\n\nWhen relay-list loading is asynchronous, the router opens validated relay hints or fallback relays immediately, attaches discovered author write relays to the same deduplicating collector, and applies one deadline to discovery and collection. `query()` remains the compatibility aggregate over this stream. `options.limit` applies to that aggregate; the stream receives every verified unique arrival before completion. `subscribe()` uses the same immediate seed fanout before adding discovered relays.\n\n## Keys Service\n\nReference keyboard / chord backend for the `keys.*` NIP-5D NAP. By default attaches a single `document`-level `keydown` listener that matches incoming events against registered chord subscriptions and delivers a `keys.action` push envelope back to the owning napplet. Implement the [`HostKeysBridge`](#hostkeysbridge-interface) interface to swap in OS-level backends (Electron `globalShortcut`, Tauri `GlobalShortcut`).\n\n### Factory\n\n```ts\nimport { createKeysService } from '@kehto/services';\n\nexport function createKeysService(options?: KeysServiceOptions): ServiceHandler & { destroy(): void };\n```\n\n`destroy()` detaches the document listener (or the bridge's unsubscribe handles) and clears all subscription registries. Call on shell teardown.\n\n### KeysServiceOptions\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `onForward` | `(event: { key, code, ctrlKey, altKey, shiftKey, metaKey }) => void` | Called on `keys.forward` envelopes and on document/host-bridge keydowns handled by the reference backend. DOM-shape payload (the service translates from the wire-format `{ ctrl, alt, shift, meta }` before invoking this callback). Forwarded keys do not dispatch `keys.action`; active napplets suppress bound keys locally from `keys.bindings` before forwarding. |\n| `listenerTarget` | `EventTarget` | Defaults to `document`. Pass a fresh `new EventTarget()` in unit tests to isolate the listener. Ignored when `hostBridge` is provided. |\n| `hostBridge` | `HostKeysBridge` | Pluggable OS-bridge. When provided, the service delegates `keys.registerAction` to `bridge.subscribe(chord, cb)` and the default document listener is NOT attached. |\n| `reservedChords` | `ReadonlyArray<string>` | Optional set of shell-reserved chords (wire-format strings like `'Ctrl+Shift+K'`, `'Cmd+P'`). Reserved chords are not assigned as napplet action bindings. Document keydowns that match a reserved chord call `onForward` but do not dispatch `keys.action`. Precedence: **reserved > registered**. Normalized once at construction via the same parser used for `action.defaultKey`. See [Reserved Chords](#reserved-chords). |\n\n### HostKeysBridge interface\n\nCopy the contract verbatim for host-app implementers. OS-level bridges implement `subscribe` at minimum; the two optional fields enable global-hotkey registration (works even when the host window is unfocused).\n\n```ts\nexport interface HostKeysBridge {\n  /**\n   * Subscribe a callback to a chord. Returns an unsubscribe handle.\n   *\n   * Implementations MUST:\n   *   - invoke `callback` exactly once per matching chord event (implementations\n   *     are responsible for any OS-autorepeat filtering)\n   *   - invoke `callback` synchronously during the event delivery\n   *   - remove only this subscription when its unsubscribe handle is called;\n   *     other callbacks for the same chord must remain live\n   *   - accept the string chord format documented by @napplet/nap/keys\n   *     (e.g. `'Ctrl+Shift+K'`, `'Cmd+P'`)\n   */\n  subscribe(chord: string, callback: (event: KeyboardEvent | HostKeyEvent) => void): () => void;\n\n  /**\n   * Optional: register an OS-level global hotkey (works even when the host\n   * window is not focused). Returns true on success, false if the chord\n   * cannot be registered (e.g. already claimed by another app).\n   *\n   * Omitted by the browser reference implementation — browsers cannot\n   * register OS-level global hotkeys without privileged APIs. Electron\n   * (`globalShortcut`) and Tauri (`GlobalShortcut`) provide this.\n   */\n  registerGlobalHotkey?(chord: string): boolean;\n\n  /**\n   * Optional: subscribe to OS-level global hotkey events (regardless of\n   * focus). Returns an unsubscribe handle.\n   *\n   * Omitted by the browser reference implementation. See\n   * {@link HostKeysBridge.registerGlobalHotkey}.\n   */\n  onGlobalHotkey?(callback: (chord: string) => void): () => void;\n}\n```\n\n### Usage\n\nDefault browser path — the reference document-level chord listener:\n\n```ts\nimport { createKeysService } from '@kehto/services';\n\nconst keys = createKeysService({\n  onForward: (event) => {\n    // DOM-shape payload: { key, code, ctrlKey, altKey, shiftKey, metaKey }\n    hotkeyDispatcher.dispatch(event);\n  },\n});\n\nruntime.registerService('keys', keys);\n// On shell teardown:\nkeys.destroy();\n```\n\nCustom bridge path — swap in Electron's `globalShortcut`:\n\n```ts\nimport { createKeysService, type HostKeysBridge, type HostKeyEvent } from '@kehto/services';\nimport { globalShortcut } from 'electron';\n\nconst subscribers = new Map<string, Set<(event: HostKeyEvent) => void>>();\nconst electronBridge: HostKeysBridge = {\n  subscribe(chord, cb) {\n    let callbacks = subscribers.get(chord);\n    if (!callbacks) {\n      const group = new Set<(event: HostKeyEvent) => void>();\n      const registered = globalShortcut.register(chord, () => {\n        for (const callback of group) callback({\n          key: '', code: '',\n          ctrlKey: false, altKey: false, shiftKey: false, metaKey: false,\n        });\n      });\n      if (!registered) throw new Error(`Cannot register ${chord}`);\n      callbacks = group;\n      subscribers.set(chord, callbacks);\n    }\n    callbacks.add(cb);\n    return () => {\n      if (!callbacks.delete(cb)) return;\n      if (callbacks.size === 0) {\n        globalShortcut.unregister(chord);\n        subscribers.delete(chord);\n      }\n    };\n  },\n};\n\nruntime.registerService('keys', createKeysService({ hostBridge: electronBridge }));\n```\n\n### When to plug a custom bridge\n\nPlug a `HostKeysBridge` when the default document listener is insufficient: Electron or Tauri apps that need to register OS-level global hotkeys (chords delivered even when the host window is not focused), native shells that route chords through a platform-specific hotkey manager (macOS Carbon, Linux X11 grab, Windows RegisterHotKey), or test harnesses that inject synthetic events through a controlled `EventTarget`. The bridge owns subscription lifecycle; the service retains per-window bookkeeping (so `onWindowDestroyed` cleanup stays identical across paths).\n\nA napplet drives this end to end via `@napplet/sdk` — `keys.registerAction` to claim a chord and `keys.onAction` to receive dispatches against the real backend. After a successful bound registration, the service pushes a complete `keys.bindings` list for that napplet/window, using entries shaped as `{ actionId, key }`. It pushes the complete list again after `keys.unregisterAction` removes a binding, including an empty list when no bindings remain. Injected shims use that list to suppress locally-bound keydowns before forwarding.\n\nAction IDs are local to the trusted window passed by the runtime. Two windows may\neach register `game.a`, including with the same suggested key, without replacing\none another's bindings. Unregistering or destroying one window removes only its\nactions and bridge subscriptions. Binding lists and `keys.action` messages retain\nthe original app-local action ID; callers do not need to invent window-specific IDs.\nRe-registering an action in the same window retains the existing rebind behavior:\na valid available chord replaces that window's binding, a reserved chord removes\nits previous binding, and a malformed chord or failed bridge subscription leaves\nthe previous binding intact.\n\nThis ownership scope is an explicit Kehto policy for the scope left implicit by\n[NAP-KEYS PR #9 at `cecb642`](https://github.com/napplet/naps/blob/cecb64257e0ac29926bb746832a477c553ab307c/naps/NAP-KEYS.md).\nThe draft describes duplicate-action errors but does not mandate service-global\nIDs or forbid same-owner updates. Window-scoped ownership preserves its per-napplet\nbinding delivery and adds no wire fields. Chord conflicts retain the existing\nbehavior: matching registered actions receive their own `keys.action` push.\n\n### Reserved Chords\n\nShell-reserved chords let a host application (window manager, launcher shell, tiling WM) claim specific chords for its own dispatch regardless of what napplets subscribe to. Declare the reserved set once at service construction via the `reservedChords` option on [`KeysServiceOptions`](#keysserviceoptions):\n\n```ts\nimport { createKeysService } from '@kehto/services';\n\nconst keys = createKeysService({\n  reservedChords: [\n    'Ctrl+Alt+T',        // launcher\n    'Super+Space',       // workspace switch\n    'Ctrl+Shift+Y',      // shell palette\n  ],\n  onForward: (event) => {\n    // The shell's WM dispatcher — fires for reserved chords regardless of\n    // which napplet (if any) tried to register them.\n    wmLauncher.dispatch(event);\n  },\n});\n\nruntime.registerService('keys', keys);\n```\n\n**Precedence contract: reserved > binding.** When a napplet registers an action whose `defaultKey` matches `reservedChords`, the service acknowledges the action with `keys.registerAction.result` but leaves `binding` undefined and does not add the chord to `keys.bindings`. That prevents the active napplet from suppressing a shell-owned chord locally.\n\n- If a document keydown matches a reserved chord: `onForward` fires exactly once and no `keys.action` envelope is dispatched.\n- If a document keydown matches a non-reserved registered binding: `onForward` fires and every napplet whose registered action matches receives a `keys.action` envelope via its captured `send` handle.\n- If a napplet sends `keys.forward`: `onForward` fires and the service does not dispatch `keys.action`. Active napplets are expected to suppress bound keys locally from `keys.bindings` before forwarding.\n\nReserved chords are normalized at service construction via the same parser used for `action.defaultKey`, so `'Ctrl+Shift+K'`, `'Control+shift+k'`, and `'ctrl+Shift+K'` all match the same chord. Modifier aliases (`Cmd` / `Command` / `Win` / `Super` → meta; `Control` → ctrl; `Option` → alt) are recognized case-insensitively.\n\n**WM-launcher integration example:**\n\n```ts\n// Shell-side: declare every WM-absolute chord at boot.\nconst keys = createKeysService({\n  reservedChords: Object.keys(wmChordMap),    // e.g. ['Super+1', 'Super+2', ..., 'Ctrl+Alt+T']\n  onForward: (event) => {\n    const chordStr = chordStringFromEvent(event);\n    const action = wmChordMap[chordStr];\n    if (action) action.execute();\n  },\n});\nruntime.registerService('keys', keys);\n\n// Napplet-side (hotkey-chord napplet, for example): free to request\n// `Ctrl+Shift+K` via keys.registerAction. If Ctrl+Shift+K is NOT in the shell's\n// reservedChords, the napplet receives a binding and can handle it locally while\n// active. If the shell reserves that chord, the registration result is unbound\n// and no suppress-list entry is pushed.\n```\n\n**Dynamic reservation is out of scope for v1.6.** If a downstream shell needs runtime updates to the reserved set (e.g. \"reservation depends on which workspace is active\"), open an issue referencing `HostKeysBridge.reserveAbsolute(chords)` — the deferred extension shape. Until then, `reservedChords` is static at service construction.\n\n**OS-level global hotkeys remain a separate concern.** `reservedChords` operates at the service layer. For OS-level reservation (chord fires even when the host window is unfocused), implement [`HostKeysBridge.registerGlobalHotkey`](#hostkeysbridge-interface) in your bridge — reserved chords and global hotkeys compose orthogonally.\n\n## Media Service\n\nReference media backend for the `media.*` NIP-5D NAP. By default mirrors session metadata + playback state to `navigator.mediaSession` via the DOM `MediaSession` API and installs `setActionHandler` callbacks that emit `media.command` push envelopes on OS transport events (play / pause / next / previous / seek). Implement the [`HostMediaBridge`](#hostmediabridge-interface) interface to swap in native backends (Electron bridge, MPRIS on Linux, MediaRemote on macOS).\n\n### Factory\n\n```ts\nimport { createMediaService } from '@kehto/services';\n\nexport function createMediaService(options?: MediaServiceOptions): ServiceHandler & { destroy(): void };\n```\n\n`destroy()` tears down the active bridge (removes `setActionHandler` listeners, removes the silent-audio prime element in the browser reference implementation) and clears the session registry.\n\n### MediaServiceOptions\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `onSessionCreate` | `(windowId, sessionId, metadata?) => void` | Called when a napplet creates a session. |\n| `onState` | `(windowId, sessionId, state) => void` | Called on `media.state` updates — high-frequency; keep handler work minimal. |\n| `onSessionDestroy` | `(windowId, sessionId) => void` | Called when a napplet destroys a session. |\n| `onSessionUpdate` | `(windowId, sessionId, metadata) => void` | Called when a napplet updates session metadata. |\n| `onCapabilities` | `(windowId, sessionId, actions) => void` | Called when a napplet declares capabilities for a session. |\n| `mediaSessionTarget` | `MediaSessionTarget` | Overrides `navigator.mediaSession` (used by the default bridge only). Pass a `MockMediaSession` in unit tests. Ignored when `hostBridge` is provided. |\n| `documentTarget` | `Document \\| null` | Overrides `document` (used by the default bridge only). Set to `null` to disable the silent-audio prime in unit tests. Ignored when `hostBridge` is provided. |\n| `hostBridge` | `HostMediaBridge` | Pluggable backend. When provided, the service delegates setMetadata / setPlaybackState / onAction to the bridge and skips `navigator.mediaSession` entirely. |\n\n### HostMediaBridge interface\n\nCopy the contract verbatim for host-app implementers. Native bridges implement `setMetadata` + `setPlaybackState` + `onAction` at minimum; the two optional fields cover active-session switching and per-session teardown.\n\n```ts\nexport interface HostMediaBridge {\n  /**\n   * Set the metadata displayed on the OS transport surface for a session.\n   * Called on session.create (with initial metadata) and on session.update\n   * (with merged metadata) whenever the session is the active session.\n   * Implementations MUST be idempotent.\n   */\n  setMetadata(sessionId: string, metadata: MediaMetadata): void;\n\n  /**\n   * Set the playback state for a session. Called on media.state reports\n   * whenever the session is the active session. State strings match\n   * nap-media MediaState.status exactly. Implementations MUST be idempotent.\n   */\n  setPlaybackState(sessionId: string, state: 'playing' | 'paused' | 'stopped' | 'buffering'): void;\n\n  /**\n   * Subscribe to OS-level action events (user clicks play/pause/seek/next/prev\n   * on the transport surface). Returns an unsubscribe handle.\n   *\n   * The callback receives `(sessionId, action, value?)`. `sessionId` is the\n   * bridge's currently-active session (the browser impl tracks this internally\n   * via setActionHandler-at-fire-time; native impls track via setActiveSession).\n   * `value` is populated for `action === 'seek'` (seek target in seconds) and\n   * for `action === 'volume'` (0.0-1.0). The service dispatches the resulting\n   * `media.command` envelope to the owning napplet of that session.\n   */\n  onAction(callback: (sessionId: string, action: MediaAction, value?: number) => void): () => void;\n\n  /**\n   * Optional: notify the bridge that the active session has changed. The\n   * browser reference impl uses this to switch which session's metadata/state\n   * is mirrored to the singleton navigator.mediaSession and to install (or\n   * clear) action handlers for the session's declared capabilities.\n   *\n   * The optional `actions` parameter carries the session's declared capability\n   * set so the bridge can narrow which OS transport buttons are active. When\n   * omitted, the bridge applies its default set. Native OS bridges that track\n   * active-session state internally may omit this field entirely.\n   */\n  setActiveSession?(sessionId: string | null, actions?: readonly MediaAction[]): void;\n\n  /**\n   * Optional: tear down per-session resources. The browser reference impl\n   * uses this to remove the silent-audio prime element when the last session\n   * is destroyed. Bridges that need no per-session teardown may omit this field.\n   */\n  destroySession?(sessionId: string): void;\n}\n```\n\n### Usage\n\nDefault browser path — the reference `navigator.mediaSession` mirror:\n\n```ts\nimport { createMediaService } from '@kehto/services';\n\nconst media = createMediaService({\n  onSessionCreate: (windowId, sessionId, metadata) => {\n    console.log(`[${windowId}] created session ${sessionId}`, metadata);\n  },\n  onState: (windowId, sessionId, state) => {\n    nowPlaying.update(windowId, state);\n  },\n});\n\nruntime.registerService('media', media);\n// On shell teardown:\nmedia.destroy();\n```\n\nCustom bridge path — swap in an Electron host bridge:\n\n```ts\nimport { createMediaService, type HostMediaBridge, type MediaAction } from '@kehto/services';\nimport { mediaBridge } from './electron-media-bridge';\n\nconst electronBridge: HostMediaBridge = {\n  setMetadata(sessionId, md) {\n    mediaBridge.sendMetadata({ sessionId, md });\n  },\n  setPlaybackState(sessionId, state) {\n    mediaBridge.sendPlaybackState({ sessionId, state });\n  },\n  onAction(cb) {\n    const handler = (_: unknown, msg: { sessionId: string; action: MediaAction; value?: number }) =>\n      cb(msg.sessionId, msg.action, msg.value);\n    mediaBridge.onAction(handler);\n    return () => mediaBridge.offAction(handler);\n  },\n};\n\nruntime.registerService('media', createMediaService({ hostBridge: electronBridge }));\n```\n\n### When to plug a custom bridge\n\nPlug a `HostMediaBridge` when `navigator.mediaSession` is insufficient: Electron apps that need to route transport events through the main process (lock-screen integration on Windows, Now Playing integration on macOS), Linux shells that speak MPRIS over D-Bus, native mobile wrappers that forward to AVPlayer / ExoPlayer, or test harnesses that record action events without touching the DOM. The bridge owns metadata/state mirroring and OS action routing; the service retains per-session bookkeeping (sessionRegistry + per-window send handles) so `media.command` dispatch semantics stay identical across paths.\n\nA napplet drives this end to end via `@napplet/nap/media` — `mediaCreateSession({ owner: 'napplet', ... })`, `mediaReportState`, and `mediaOnCommand` against the real backend.\n\n## Public API\n\nEach factory returns a `ServiceHandler` registrable via `runtime.registerService()`. The bullets below note the current NIP-5D domain the handler owns and the ACL capability napplets need in order to reach it.\n\n### Identity NAP\n- `createIdentityService` — `identity.*` reads (`identity:read`). No signing surface; shell mediates signing internally.\n\n`createIdentityService` uses `getSigner()` for `identity.getPublicKey` and `identity.getRelays`. Hosts may also pass optional read-only provider hooks for `getProfile`, `getFollows`, `getList`, `getZaps`, `getMutes`, `getBlocked`, and `getBadges`. These hooks receive the current signer pubkey (or `\"\"` when no signer is connected) and return the payload portion of the corresponding `.result` envelope. Kehto does not query relays itself; the hooks are for hosts that already maintain profile, contact-list, list, zap, moderation, or badge data.\n\n### Notify NAP\n- `createNotifyService` — canonical direct `notify.*` envelopes.\n\n### Relay NAP\n- `createRelayPoolService` — `relay.publish`, `relay.publishEncrypted`,\n  `relay.subscribe` fan-out (`relay:read` / `relay:write`). Publish handlers\n  receive only runtime-signed events and settle with canonical\n  `{ ok, event, eventId }` or `{ ok: false, error }` result envelopes. Subscribe\n  adapters may pass observed relay URLs as the callback's second argument so\n  `RelayEventResult.sidecar.relayHints` records provenance rather than the\n  larger requested relay set.\n- `createCacheService` — offline event cache (`cache:read` / `cache:write`).\n- `createCoordinatedRelay` — composite service that bundles relay-pool + cache\n  with read-through behavior and the same canonical publish result.\n\n### Keys NAP\n- `createKeysService` — `keys.registerAction` / `keys.unregisterAction` / `keys.forward` + `keys.bindings` / `keys.action` push envelopes (`keys:forward`). Document-level chord listener by default; implement the `HostKeysBridge` interface to swap in Electron / Tauri / OS-level backends. See [Keys Service](#keys-service) for the full contract.\n\n### Media NAP\n- `createMediaService` — owner-aware `media.session.create` / `update` / `destroy` / `media.state` / `media.capabilities` + `media.command` push envelopes (`media:control`). Napplet-owned sessions mirror to `navigator.mediaSession` by default; shell-owned creates are rejected until a host playback/fetch bridge is supplied. Implement the `HostMediaBridge` interface to swap in native backends. See [Media Service](#media-service) for the full contract.\n\n### BLE NAP\n- `createBleService` — `ble.open`, `ble.services`, `ble.read`, `ble.write`, `ble.subscribe`, `ble.unsubscribe`, `ble.close` + host-pushed `ble.event` envelopes. Hook contexts include `ctx.emit(event)`, so host Bluetooth notification listeners can forward `notification`, `state`, and `closed` events to the requesting napplet without replacing the reference handler.\n\n### WebRTC NAP\n- `createWebrtcService` — `webrtc.open`, `webrtc.send`, `webrtc.close` + host-pushed `webrtc.event` envelopes. The reference handler owns only the NAP request/result bookkeeping; host bridges own signaling, SDP, ICE, peer connection lifecycle, and policy.\n\n### DM NAP\n- `createDmService` — `dm.status`, `dm.conversations`, `dm.messages`, `dm.send`, `dm.subscribe`, `dm.unsubscribe` + `dm.message` push envelopes (`dm:read` / `dm:write`). Runtime owns correlation, subscriptions, cleanup, and normalized message shape; adapters own protocol transport.\n- `createNip17DmAdapter` — concrete NIP-17 gift-wrap adapter backed by `nostr-tools/nip17` and an injected relay pool. The owner secret key stays shell/runtime-owned.\n- `createNdrDmAdapter` / `createNdrRelayTransport` — structural adapter for Nostr Double Ratchet runtimes plus a relay transport bridge for app-owned `nostrSubscribe` / `nostrFetch` / `nostrPublish` hooks.\n- `createCordnDmAdapter` / `createCordnRelayCoordinatorClient` — structural adapter for Cordn/ContextVM clients plus a relay-backed coordinator bridge for `PostGroupMessage`, `FetchGroupMessages`, and `SubscribeGroupMessages`.\n\n### FS NAP\n- `createFsService` — all `fs.*` request/result envelopes plus scoped `fs.changed` pushes. It guarantees same-id results, error/success-field exclusivity, cross-window watch isolation, and window-destroy cleanup.\n- `FsBackend` — host contract for runtime-owned virtual paths, real picker/storage handles, bounded range I/O, atomic writes, directory mutation, and advisory watches. `FsServiceError` maps failures to the closed NAP-FS error set.\n\n### Theme NAP\n- `createThemeService` — `theme.get` plus automatic `theme.changed` delivery\n  (`theme:read`). Returns a `ThemeService` with `publishTheme()` and\n  `getCurrentTheme()` for host-side updates.\n\n### Intent NAP\n- `createIntentService` — exact `intent.invoke`, `intent.available`, and\n  `intent.handlers` request/result handling plus recipient-gated\n  `intent.changed`.\n- `manifestToIntentCatalogEntry` — verified manifest archetype contracts to\n  catalog entries.\n- `createCatalogIntentResolver` — exact convention selection and retained\n  target-controller seam.\n\n### Identity and theme wire guarantees\n\nAgainst NAP-IDENTITY/NAP-THEME at `napplet/naps` master\n`5ac0490461ca6fec2f0d2e45b4835cf9bc08de24`,\n`createIdentityService` is readonly: `identity.getPublicKey` always sends one\nmatching `.result` with `pubkey: \"\"` when a signer is absent or fails, and the\nother supported reads retain their safe primary result fields. Unknown identity\nactions are silent; identity changed values are host pushes, not request\nretries or INC/intent traffic.\n\n`createThemeService` accepts `theme.get` only and owns the current complete\nthree-color theme. `publishTheme()` normalizes and stores that state before it\ninvokes its one bridge callback, so an immediate `theme.get` observes the same\nvalue as the automatic push. There is no theme subscribe/unsubscribe protocol.\nFor denied or unavailable runtime reads, Kehto uses the fixed non-sensitive\ncomplete normal result without `error`: this explicit policy reconciles the\ndraft error-only example without a mixed theme/error extension.\n\n### Types\n`AudioSource`, `AudioServiceOptions`, `Notification`, `NotificationServiceOptions`, `IdentityServiceOptions`, `RelayPoolServiceOptions`, `CacheServiceOptions`, `CoordinatedRelayOptions`, `KeysServiceOptions`, `MediaServiceOptions`, `NotifyServiceOptions`, `NotifyPresentation`, `NotifyInteractionMessage`, `ThemeServiceOptions`, `ThemeService`, `IntentOpenOptions`, `IntentRequest`, `IntentResult`, `IntentCandidate`, `IntentAvailability`, `IntentResolver`, `IntentTargetController`, `IntentDispatchParams`, `IntentTargetDispatch`, `BleServiceOptions`, `BleServiceContext`, `WebrtcServiceOptions`, `WebrtcServiceContext`, `DmServiceOptions`, `DmAdapter`, `DmRelayPool`, `Nip17DmAdapterOptions`, `NdrDmAdapterOptions`, `CordnDmAdapterOptions`.\n\n## API Reference\n\nFull package docs: [`docs/packages/services.md`](../../docs/packages/services.md).\nGenerated API module: `docs/api/modules/_kehto_services.html` (run `pnpm docs:api`).\n\n## License\n\nMIT\n","readmeFilename":"README.md"}