{"_id":"@hasna/events","_rev":"19-cc2507861bd0b8d0de9ee2e60ee59676","name":"@hasna/events","dist-tags":{"latest":"0.1.18"},"versions":{"0.1.0":{"name":"@hasna/events","version":"0.1.0","keywords":["events","webhooks","cli","typescript","bun","hasna"],"author":{"name":"Hasna"},"license":"Apache-2.0","_id":"@hasna/events@0.1.0","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"c5c0ccf4b3ee9ce6c419b326b4c031bf398e44b2","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.0.tgz","fileCount":19,"integrity":"sha512-IUrlPCBNOB3ju1Xhcc4b3I6vfAdOPBqRx4rAuLx9OrTgUbk7UsJiXQd+FEEPfqO7K+FsJZa3SMMr0k7VgwYUEg==","signatures":[{"sig":"MEUCIF3I4TU1hw/oe76iVlS3J5Yo/cPjvNI1tUVDT8udJWeKAiEAxKzGhwXJhvZwcRoVSEcIsAHRH+Qor9RRYMn452ctWhA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102855},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"bun":">=1.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./filter":{"types":"./dist/filter.d.ts","import":"./dist/filter.js"},"./signing":{"types":"./dist/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./dist/storage.d.ts","import":"./dist/storage.js"},"./commander":{"types":"./dist/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./dist/transports.d.ts","import":"./dist/transports.js"}},"scripts":{"test":"bun test","build":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/types.ts src/commander.ts --outdir dist --target bun && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run test && bun run build"},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"10.9.7","description":"Shared event envelopes, local subscriptions, and webhook delivery for Hasna open-source apps","directories":{},"_nodeVersion":"22.22.2","dependencies":{"commander":"^13.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.0_1781597608350_0.5956542333697714","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@hasna/events","version":"0.1.1","keywords":["events","webhooks","cli","typescript","bun","hasna"],"author":{"name":"Hasna"},"license":"Apache-2.0","_id":"@hasna/events@0.1.1","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"83803e0b4f61889916dcda614060efe1b142dc61","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.1.tgz","fileCount":19,"integrity":"sha512-b3+Zv5aXoYe2ZJwTnQCGD0Nt9YNW3kUo3yc3SbT7JVMkkwwupFlvbEdfFLfWOH7Ty696ORFLFam+qg2zun02oA==","signatures":[{"sig":"MEQCIGvafCGgGz+G9igPoWr5iUltQjPpW5zrJsgH4vGL7sDyAiB/p6JZLZEu8Z66gOcgtmbzQOcv5F+dgJXzOCyPFuhWig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102851},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"bun":">=1.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./filter":{"types":"./dist/filter.d.ts","import":"./dist/filter.js"},"./signing":{"types":"./dist/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./dist/storage.d.ts","import":"./dist/storage.js"},"./commander":{"types":"./dist/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./dist/transports.d.ts","import":"./dist/transports.js"}},"scripts":{"test":"bun test","build":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/types.ts src/commander.ts --outdir dist --target bun && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run test && bun run build"},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"10.9.7","description":"Shared event envelopes, local subscriptions, and webhook delivery for Hasna open-source apps","directories":{},"_nodeVersion":"22.22.2","dependencies":{"commander":"^13.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.1_1781597636746_0.8935801396782377","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@hasna/events","version":"0.1.2","keywords":["events","webhooks","cli","typescript","bun","hasna"],"author":{"name":"Hasna"},"license":"Apache-2.0","_id":"@hasna/events@0.1.2","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"fce930406a64b59f57c23736090909ce9b3dee9d","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.2.tgz","fileCount":19,"integrity":"sha512-R0Oz8KtRIQc3/D1FhiX/cUCn6N20HBLFUqwmxK27PIQw974/+gJ6oDvYe5ACZoXPq49eG415z0ydYODGztpDIw==","signatures":[{"sig":"MEUCIFbvGkPoE7sU6ffE03RdpgRC0HcLTpNZ3tNbojnCsTDqAiEAiEXmHYTiqUoFY5udKPIhcVFFtaJAZ00j7ps4YlpYEuY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106244},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"bun":">=1.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./filter":{"types":"./dist/filter.d.ts","import":"./dist/filter.js"},"./signing":{"types":"./dist/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./dist/storage.d.ts","import":"./dist/storage.js"},"./commander":{"types":"./dist/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./dist/transports.d.ts","import":"./dist/transports.js"}},"scripts":{"test":"bun test","build":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/types.ts src/commander.ts --outdir dist --target bun && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run test && bun run build"},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"10.9.7","description":"Shared event envelopes, local subscriptions, and webhook delivery for Hasna open-source apps","directories":{},"_nodeVersion":"22.22.2","dependencies":{"commander":"^13.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.2_1781598455271_0.5918874606637112","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@hasna/events","version":"0.1.3","keywords":["events","webhooks","cli","typescript","bun","hasna"],"author":{"name":"Hasna"},"license":"Apache-2.0","_id":"@hasna/events@0.1.3","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"871ce04165b925080049871afd9b2f91d7072a6e","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.3.tgz","fileCount":19,"integrity":"sha512-0PgS0wSfLPg/kqxoDhzr/t00p8/H8LzfJAAlP4hhEByvTkM0UXGEzayFoZ1dOk7uqKtLuD5vrIDRdUoHwuVBkQ==","signatures":[{"sig":"MEYCIQDuuxyxMs0UPxTNoJ2egiKM8jRVlGqJILrAdjEFb/WL1AIhAJFcsz90S6Il01YrVdcwajAOxTDBF+FZOVlJUcEPcGBr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106699},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"bun":">=1.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./filter":{"types":"./dist/filter.d.ts","import":"./dist/filter.js"},"./signing":{"types":"./dist/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./dist/storage.d.ts","import":"./dist/storage.js"},"./commander":{"types":"./dist/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./dist/transports.d.ts","import":"./dist/transports.js"}},"scripts":{"test":"bun test","build":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/types.ts src/commander.ts --outdir dist --target bun && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run test && bun run build"},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"10.9.7","description":"Shared event envelopes, local subscriptions, and webhook delivery for Hasna open-source apps","directories":{},"_nodeVersion":"22.22.2","dependencies":{"commander":"^13.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.3_1781598488306_0.3153719358885798","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@hasna/events","version":"0.1.4","keywords":["events","webhooks","cli","typescript","bun","hasna"],"author":{"name":"Hasna"},"license":"Apache-2.0","_id":"@hasna/events@0.1.4","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"52b67779e16895ba07d111913ec1a152ecac94cb","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.4.tgz","fileCount":19,"integrity":"sha512-/OPflWy2ebN8ksmJYXWS134ezoMKnLFEUP7Tvf7Gk8Jj3HQqLv0D5faUdnddpOkLaXaRsJNX+2WMGDjyz0TCBQ==","signatures":[{"sig":"MEUCIEWG7bPOriqm5IDiPPiUJsgq4B/SbaP/nPn9Vmll2iikAiEA4RHvVkOJaw3lLAvQ9rmTztze9f4fjTRV6+QkNMReoxI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108512},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"bun":">=1.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./filter":{"types":"./dist/filter.d.ts","import":"./dist/filter.js"},"./signing":{"types":"./dist/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./dist/storage.d.ts","import":"./dist/storage.js"},"./commander":{"types":"./dist/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./dist/transports.d.ts","import":"./dist/transports.js"}},"gitHead":"dde9a657f03192eb360351f2ba3b68bb681f1b9d","scripts":{"test":"bun test","build":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/types.ts src/commander.ts --outdir dist --target bun && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run test && bun run build"},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"10.9.7","description":"Shared event envelopes, local subscriptions, and webhook delivery for Hasna open-source apps","directories":{},"_nodeVersion":"22.22.2","dependencies":{"commander":"^13.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.4_1781602441242_0.31908091435475194","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@hasna/events","version":"0.1.5","keywords":["events","webhooks","cli","typescript","bun","hasna"],"author":{"name":"Hasna"},"license":"Apache-2.0","_id":"@hasna/events@0.1.5","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"2f93e524871c19b17119c673275240cdbbbfe15f","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.5.tgz","fileCount":19,"integrity":"sha512-Rhgm/aF9JwR9tGFHoLJJYCdIp29bvsYT57iS8YSfqbJT6Q7XZP1TVbKS+P+9GfeLiETEu94Fnj1+PxLbGj2jPg==","signatures":[{"sig":"MEQCIFbF+ck5rjVbOKMyScZLfAVYzNu4u3BAkPH8CB+X6cc2AiA2aj2/MdMGlgk8QTRxA4FQ3/+2J1xV8hRgwiLgyxOMNg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109336},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"bun":">=1.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cli":{"types":"./dist/cli/index.d.ts","import":"./dist/cli/index.js"},"./filter":{"types":"./dist/filter.d.ts","import":"./dist/filter.js"},"./signing":{"types":"./dist/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./dist/storage.d.ts","import":"./dist/storage.js"},"./commander":{"types":"./dist/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./dist/transports.d.ts","import":"./dist/transports.js"}},"gitHead":"e0cdb8bd98c88738e15c18348b1f5bf772be6e56","scripts":{"test":"bun test","build":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/types.ts src/commander.ts --outdir dist --target bun && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run test && bun run build"},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"10.9.7","description":"Shared event envelopes, local subscriptions, and webhook delivery for Hasna open-source apps","directories":{},"_nodeVersion":"22.22.2","dependencies":{"commander":"^13.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.5_1781605569033_0.31146662171397343","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@hasna/events","version":"0.1.6","keywords":["events","webhooks","cli","typescript","bun","hasna"],"author":{"name":"Hasna"},"license":"Apache-2.0","_id":"@hasna/events@0.1.6","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"e8ca0a878d8633843d75d7c16cda5f85f0a19813","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.6.tgz","fileCount":19,"integrity":"sha512-rKLxjBIat45UxciUwh9hKM63l/mcurJXAhgVkYHvrsGnOK9HwExrwgOlylNzDBDb+huiQw9DWdLb31q5oWDfIw==","signatures":[{"sig":"MEUCICXEeA5lPI9GvYRu0hfdG9O0KfO3aY92btiLuwcl1zS3AiEA5D9c9+UwTxdkZNMGvDWczSMC0fAFjcJwgRa2Q2K9O1E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109782},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"bun":">=1.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cli":{"types":"./dist/cli/index.d.ts","import":"./dist/cli/index.js"},"./filter":{"types":"./dist/filter.d.ts","import":"./dist/filter.js"},"./signing":{"types":"./dist/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./dist/storage.d.ts","import":"./dist/storage.js"},"./commander":{"types":"./dist/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./dist/transports.d.ts","import":"./dist/transports.js"}},"gitHead":"eb69e6f74f6a0f943a1b9b350c199126c1c72249","scripts":{"test":"bun test","build":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/types.ts src/commander.ts --outdir dist --target bun && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run test && bun run build"},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"10.9.7","description":"Shared event envelopes, local subscriptions, and webhook delivery for Hasna open-source apps","directories":{},"_nodeVersion":"22.22.2","dependencies":{"commander":"^13.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.6_1781606453797_0.3315547397731273","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@hasna/events","version":"0.1.7","keywords":["events","webhooks","cli","typescript","bun","hasna"],"author":{"name":"Hasna"},"license":"Apache-2.0","_id":"@hasna/events@0.1.7","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"174ebf55c89febccc017f9ad20d6cfb4793655a8","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.7.tgz","fileCount":19,"integrity":"sha512-o6Qn/HTb5hGDDEd7E71GNVn2XvJ2Uy/dHzsZLQzczy9O9oXyOvm9I5y+zU0x8lA1TJLxcFERqS+QO7oiXsR/vA==","signatures":[{"sig":"MEYCIQD1KfVmt79c5ftXtV4EPaf++jOu7aF2MhJoU5ieAN8VXAIhAPLjju9+75tZRX7Zud6/G8VAi3kgJ6bhXYjFK/6Cqf0e","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110462},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"bun":">=1.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cli":{"types":"./dist/cli/index.d.ts","import":"./dist/cli/index.js"},"./filter":{"types":"./dist/filter.d.ts","import":"./dist/filter.js"},"./signing":{"types":"./dist/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./dist/storage.d.ts","import":"./dist/storage.js"},"./commander":{"types":"./dist/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./dist/transports.d.ts","import":"./dist/transports.js"}},"gitHead":"1556186d9277909ed45af181152b759f114d8c46","scripts":{"test":"bun test","build":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/types.ts src/commander.ts --outdir dist --target bun && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run test && bun run build"},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"10.9.7","description":"Shared event envelopes, local subscriptions, and webhook delivery for Hasna open-source apps","directories":{},"_nodeVersion":"22.22.2","dependencies":{"commander":"^13.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.7_1781608248446_0.8244916401480848","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@hasna/events","version":"0.1.8","keywords":["events","webhooks","cli","typescript","bun","hasna"],"author":{"name":"Hasna"},"license":"Apache-2.0","_id":"@hasna/events@0.1.8","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"711ccdf934804f769d3236598878ee198b3c5ba9","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.8.tgz","fileCount":19,"integrity":"sha512-NftaVpt/Rlc81DVdyIliEqa77SB/jtOFP/5YHTNeH8c7MNM999G8noWHXWMTIeZ59NviqnxFgnHK8t/NQMH9qQ==","signatures":[{"sig":"MEUCIGVLmerBxxN0tkWX072rQIc0OADV0AuIGO6S7sg5Nk0MAiEA4IyU0iAscpcpBHH4JJ9+O1y4fv7YKsditWfgM9fhCPE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":119172},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"bun":">=1.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cli":{"types":"./dist/cli/index.d.ts","import":"./dist/cli/index.js"},"./filter":{"types":"./dist/filter.d.ts","import":"./dist/filter.js"},"./signing":{"types":"./dist/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./dist/storage.d.ts","import":"./dist/storage.js"},"./commander":{"types":"./dist/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./dist/transports.d.ts","import":"./dist/transports.js"}},"gitHead":"9f1f204bdb7c61f4d96283f05677aafcb03537ca","scripts":{"test":"bun test","build":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/types.ts src/commander.ts --outdir dist --target bun && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run test && bun run build"},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"10.9.7","description":"Shared event envelopes, local subscriptions, and webhook delivery for Hasna open-source apps","directories":{},"_nodeVersion":"22.22.2","dependencies":{"commander":"^13.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.8_1781715244618_0.3734433847931802","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@hasna/events","version":"0.1.9","keywords":["events","webhooks","cli","typescript","bun","hasna"],"author":"Hasna","license":"Apache-2.0","_id":"@hasna/events@0.1.9","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"0b1d1825a476375cb5f88585af772726f0e5d5e5","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.9.tgz","fileCount":21,"integrity":"sha512-9QSXLESDmuqF1esec0DmbOrwjMZgB/r+PRUwYLb2drECDElF9xNx8FBAUzKAMUw0hyS20rsndOIKvYtc3XNlpA==","signatures":[{"sig":"MEQCICXTNxJwY+1cNG89eBY1l4iX8cv7pR7NW/vSiLp4vWPrAiBL2X576lbIuUAn6YVIAvcDJdgK40hxYFodOKZft2MW1A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":172325},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","shasum":"0b1d1825a476375cb5f88585af772726f0e5d5e5","engines":{"bun":">=1.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cli":{"types":"./dist/cli/index.d.ts","import":"./dist/cli/index.js"},"./filter":{"types":"./dist/filter.d.ts","import":"./dist/filter.js"},"./signing":{"types":"./dist/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./dist/storage.d.ts","import":"./dist/storage.js"},"./commander":{"types":"./dist/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./dist/transports.d.ts","import":"./dist/transports.js"}},"scripts":{"test":"bun test","build":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/types.ts src/commander.ts --outdir dist --target bun && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run test && bun run build"},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"_integrity":"sha512-9QSXLESDmuqF1esec0DmbOrwjMZgB/r+PRUwYLb2drECDElF9xNx8FBAUzKAMUw0hyS20rsndOIKvYtc3XNlpA==","repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"10.8.3","description":"Shared event envelopes, local subscriptions, and webhook delivery for Hasna open-source apps","directories":{},"_nodeVersion":"24.3.0","dependencies":{"commander":"^13.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.9_1782495088624_0.9651423719738355","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@hasna/events","version":"0.1.10","keywords":["events","webhooks","cli","typescript","bun","hasna"],"author":"Hasna","license":"Apache-2.0","_id":"@hasna/events@0.1.10","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"a653134c3610835275630c29a4cf56bf084330cd","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.10.tgz","fileCount":21,"integrity":"sha512-xY/7jy0eKMEfynNs8JBbMH+a+5PoO0emOg1zJ78V4PpupWDYCY1WbyAtiDR9sb26J2GC4stWCXYqBSaURYm7fg==","signatures":[{"sig":"MEUCIQD25YhL6TS8AGKJqx6BVvdldRm4HG1Ak+nydue/4fK4dAIgYT7P0wisgaLDo3HmizTKsbeciDr1uV8OKhy8r/DjSiQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":184804},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","shasum":"a653134c3610835275630c29a4cf56bf084330cd","engines":{"bun":">=1.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cli":{"types":"./dist/cli/index.d.ts","import":"./dist/cli/index.js"},"./filter":{"types":"./dist/filter.d.ts","import":"./dist/filter.js"},"./signing":{"types":"./dist/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./dist/storage.d.ts","import":"./dist/storage.js"},"./commander":{"types":"./dist/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./dist/transports.d.ts","import":"./dist/transports.js"}},"scripts":{"test":"bun test","build":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/types.ts src/commander.ts --outdir dist --target bun && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run test && bun run build"},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"_integrity":"sha512-xY/7jy0eKMEfynNs8JBbMH+a+5PoO0emOg1zJ78V4PpupWDYCY1WbyAtiDR9sb26J2GC4stWCXYqBSaURYm7fg==","repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"10.8.3","description":"Shared event envelopes, local subscriptions, and webhook delivery for Hasna open-source apps","directories":{},"_nodeVersion":"24.3.0","dependencies":{"commander":"^13.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.10_1782552831605_0.7400780730250087","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@hasna/events","version":"0.1.11","keywords":["events","webhooks","cli","typescript","bun","hasna"],"author":"Hasna","license":"Apache-2.0","_id":"@hasna/events@0.1.11","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"a706e6818244d4f115e31c981a196c57d5eee608","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.11.tgz","fileCount":21,"integrity":"sha512-X36W9TB8mKxtS5UeW1n2IlvW6nPUcoYCQWNMMV+/JM4YNzlnnk1FRm8Aay02tt1LjQOGICCHF3hz/l//EHEe+Q==","signatures":[{"sig":"MEUCIFKA4xnvdtT9ljm6ab9YkUYwHHk1AA8QHF3thxeHLz1rAiEAiDuwWgzGXNvKWHdoI2GBmDHXjo2ZKaFaJCRaG/ZFm8U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187154},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","shasum":"a706e6818244d4f115e31c981a196c57d5eee608","engines":{"bun":">=1.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cli":{"types":"./dist/cli/index.d.ts","import":"./dist/cli/index.js"},"./filter":{"types":"./dist/filter.d.ts","import":"./dist/filter.js"},"./signing":{"types":"./dist/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./dist/storage.d.ts","import":"./dist/storage.js"},"./commander":{"types":"./dist/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./dist/transports.d.ts","import":"./dist/transports.js"}},"scripts":{"test":"bun test","build":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/types.ts src/commander.ts --outdir dist --target bun && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run test && bun run build"},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"_integrity":"sha512-X36W9TB8mKxtS5UeW1n2IlvW6nPUcoYCQWNMMV+/JM4YNzlnnk1FRm8Aay02tt1LjQOGICCHF3hz/l//EHEe+Q==","repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"10.8.3","description":"Shared event envelopes, local subscriptions, and webhook delivery for Hasna open-source apps","directories":{},"_nodeVersion":"24.3.0","dependencies":{"commander":"^13.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.11_1782570794378_0.00599873745845203","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"@hasna/events","version":"0.1.12","keywords":["events","webhooks","cli","typescript","bun","hasna"],"author":"Hasna","license":"Apache-2.0","_id":"@hasna/events@0.1.12","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"ed31dd1dcab15a4f0d3572dff1d4794bf4fca151","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.12.tgz","fileCount":21,"integrity":"sha512-djG+b4XVMedjy6SiQUoyZJ8NjAJKtQaRQaWnsHpoc8mAg51PTYgFLuKCiWE473/nZRhB9tqC3DUq2CDmlVk79Q==","signatures":[{"sig":"MEUCIHBX33jwIvUqozjB/PJGSlza5lkgWlIl9feCpYqwZA3OAiEAkBF4b1cyPPU5HmiJ6Q+xikv61LfIZML92nUYytncs3k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187466},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","shasum":"ed31dd1dcab15a4f0d3572dff1d4794bf4fca151","engines":{"bun":">=1.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cli":{"types":"./dist/cli/index.d.ts","import":"./dist/cli/index.js"},"./filter":{"types":"./dist/filter.d.ts","import":"./dist/filter.js"},"./signing":{"types":"./dist/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./dist/storage.d.ts","import":"./dist/storage.js"},"./commander":{"types":"./dist/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./dist/transports.d.ts","import":"./dist/transports.js"}},"scripts":{"test":"bun test","build":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/types.ts src/commander.ts --outdir dist --target bun && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run test && bun run build"},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"_integrity":"sha512-djG+b4XVMedjy6SiQUoyZJ8NjAJKtQaRQaWnsHpoc8mAg51PTYgFLuKCiWE473/nZRhB9tqC3DUq2CDmlVk79Q==","repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"10.8.3","description":"Shared event envelopes, local subscriptions, and webhook delivery for Hasna open-source apps","directories":{},"_nodeVersion":"24.3.0","dependencies":{"commander":"^13.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.12_1782636101776_0.929000764188195","host":"s3://npm-registry-packages-npm-production"}},"0.1.13":{"name":"@hasna/events","version":"0.1.13","keywords":["events","channels","cli","typescript","bun","hasna"],"author":"Hasna","license":"Apache-2.0","_id":"@hasna/events@0.1.13","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"50690f4629b1bb32e49e3c4c6fd2b2a849cd847a","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.13.tgz","fileCount":21,"integrity":"sha512-DzmEiDrBoibxzCBeZPEmdpWsNh+5SXTSnilqCeHxi0Do3a9mQJ43ZSxq/Ipzw/xNa2rShAx48KzduCZrGDHi9g==","signatures":[{"sig":"MEQCIC9epB9K8JwbBfMA5AA5Oy2lPGq5AmdOytdorA+1gnh2AiAXZz4e/CBEBmd26KOIjJh1NinwQSsYzWUdIm6cOfc73w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":189292},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","shasum":"50690f4629b1bb32e49e3c4c6fd2b2a849cd847a","engines":{"bun":">=1.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cli":{"types":"./dist/cli/index.d.ts","import":"./dist/cli/index.js"},"./filter":{"types":"./dist/filter.d.ts","import":"./dist/filter.js"},"./signing":{"types":"./dist/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./dist/storage.d.ts","import":"./dist/storage.js"},"./commander":{"types":"./dist/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./dist/transports.d.ts","import":"./dist/transports.js"}},"scripts":{"test":"bun test","build":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/types.ts src/commander.ts --outdir dist --target bun && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run test && bun run build"},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"_integrity":"sha512-DzmEiDrBoibxzCBeZPEmdpWsNh+5SXTSnilqCeHxi0Do3a9mQJ43ZSxq/Ipzw/xNa2rShAx48KzduCZrGDHi9g==","repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"10.8.3","description":"Shared event envelopes, local channels, replay, and delivery transports for Hasna open-source apps","directories":{},"_nodeVersion":"24.3.0","dependencies":{"commander":"^13.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.13_1782664968567_0.23079386355344522","host":"s3://npm-registry-packages-npm-production"}},"0.1.14":{"name":"@hasna/events","version":"0.1.14","keywords":["events","channels","cli","typescript","bun","hasna"],"author":{"name":"Hasna"},"license":"Apache-2.0","_id":"@hasna/events@0.1.14","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"2f6dbf6a4bea2132cc04277dc6efb2bd394117cb","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.14.tgz","fileCount":22,"integrity":"sha512-UXzEM6/8XUeysIUHspe7U3lottNZ7Ir6zwEJn5wH3MCtTXHuh+Vva+uPCowf6RAVnhxZic3xrfYk5atVBRFyLA==","signatures":[{"sig":"MEUCIQDE84qqVlADJPl3dgfzKhRF4ZvfFfOi5b+IAbL52mYGgAIgZqajduRiJ538mgC3MXzDm1tpPkfylL9zmODGa7E7hV8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208467},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"bun":">=1.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cli":{"types":"./dist/cli/index.d.ts","import":"./dist/cli/index.js"},"./filter":{"types":"./dist/filter.d.ts","import":"./dist/filter.js"},"./catalog":{"types":"./dist/catalog.d.ts","import":"./dist/catalog.js"},"./signing":{"types":"./dist/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./dist/storage.d.ts","import":"./dist/storage.js"},"./commander":{"types":"./dist/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./dist/transports.d.ts","import":"./dist/transports.js"}},"gitHead":"0a701819aecc8607c95c9e9296fafb73b5034877","scripts":{"test":"bun test","build":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/types.ts src/commander.ts src/catalog.ts --outdir dist --target bun && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run test && bun run build"},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"11.18.0","description":"Shared event envelopes, local channels, replay, and delivery transports for Hasna open-source apps","directories":{},"_nodeVersion":"22.22.3","dependencies":{"commander":"^13.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.14_1784904778970_0.12676565211537527","host":"s3://npm-registry-packages-npm-production"}},"0.1.15":{"name":"@hasna/events","version":"0.1.15","keywords":["events","channels","cli","typescript","bun","hasna"],"author":{"name":"Hasna"},"license":"Apache-2.0","_id":"@hasna/events@0.1.15","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"d4f5a39123ea800265d18e9eda661e78a916ed19","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.15.tgz","fileCount":34,"integrity":"sha512-q4lVzv4n9a9C2zQDZVe/KXy6ZA+y5HRCOL6sG+xc3adHrVKJz0wW8JococwbldfgQhyYmnOloLSoy+B1MNUVZQ==","signatures":[{"sig":"MEYCIQDWHm05vVmnEWuP/gktQRhFE0b/a2oSHQah/TCKLQg/pAIhALfxGAq1BAEHY2YR4DLaKrUl6Av8h1RrajYdvDZsGuwo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":453168},"main":"./dist/index.js","type":"module","types":"./types/index.d.ts","engines":{"bun":">=1.0.0","node":">=20.0.0"},"exports":{".":{"types":"./types/index.d.ts","import":"./dist/index.js"},"./cli":{"types":"./types/cli/index.d.ts","import":"./dist/cli/index.js"},"./filter":{"types":"./types/filter.d.ts","import":"./dist/filter.js"},"./catalog":{"types":"./types/catalog.d.ts","import":"./dist/catalog.js"},"./durable":{"types":"./types/durable.d.ts","import":"./dist/durable.js"},"./signing":{"types":"./types/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./types/storage.d.ts","import":"./dist/storage.js"},"./app-event":{"types":"./types/app-event.d.ts","import":"./dist/app-event.js"},"./commander":{"types":"./types/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./types/transports.d.ts","import":"./dist/transports.js"},"./durable-spool":{"types":"./types/durable-spool.d.ts","import":"./dist/durable-spool.js"},"./durable-worker":{"types":"./types/durable-worker.d.ts","import":"./dist/durable-worker.js"},"./schemas/hasna.app_event.v1.json":"./schemas/hasna.app_event.v1.json","./fixtures/hasna.app_event.v1.json":"./fixtures/hasna.app_event.v1.json"},"scripts":{"test":"bun test","build":"bun run build:runtime && bun run build:types","prepack":"bun run build && bun run artifact-scan","typecheck":"tsc --noEmit","build:types":"rm -rf types && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir types","artifact-scan":"bun scripts/artifact-scan.ts","build:runtime":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/types.ts src/commander.ts src/catalog.ts src/app-event.ts src/durable.ts src/durable-worker.ts --root src --outdir dist --target bun && bun build src/durable-spool.ts --root src --outdir dist --target node","contract:check":"contracts repo-conformance .","prepublishOnly":"bun run test && bun run build","generated-artifacts:check":"bun run build && test -z \"$(git status --porcelain --untracked-files=all -- dist types)\""},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"11.18.0","description":"Shared event envelopes, local channels, replay, and delivery transports for Hasna open-source apps","directories":{},"_nodeVersion":"22.22.3","dependencies":{"commander":"^13.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3","@hasna/contracts":"0.8.5"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.15_1786643689961_0.7692932466160325","host":"s3://npm-registry-packages-npm-production"}},"0.1.16":{"name":"@hasna/events","version":"0.1.16","keywords":["events","channels","cli","typescript","bun","hasna"],"author":{"name":"Hasna"},"license":"Apache-2.0","_id":"@hasna/events@0.1.16","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"0bffbc9be2a29d5e33a4c296c39309c17d4db6fb","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.16.tgz","fileCount":34,"integrity":"sha512-HX66T8JljVOoE/Li8WKLUFVozg0GIdZmgBalScfBFW5Vru4IcVSTNs07TmYH3kIJUe5tylItTqwzc02nvjqbfw==","signatures":[{"sig":"MEUCIG0jl2yUdiThgDbdlwiHxoSDTqjvrXI90smxd6tFWVWfAiEAqjt/PS1KsGiahtA7uegmYAYUIPpvmldx5oWJXLmWIrw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":453138},"main":"./dist/index.js","type":"module","types":"./types/index.d.ts","engines":{"bun":">=1.0.0","node":">=20.0.0"},"exports":{".":{"types":"./types/index.d.ts","import":"./dist/index.js"},"./cli":{"types":"./types/cli/index.d.ts","import":"./dist/cli/index.js"},"./filter":{"types":"./types/filter.d.ts","import":"./dist/filter.js"},"./catalog":{"types":"./types/catalog.d.ts","import":"./dist/catalog.js"},"./durable":{"types":"./types/durable.d.ts","import":"./dist/durable.js"},"./signing":{"types":"./types/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./types/storage.d.ts","import":"./dist/storage.js"},"./app-event":{"types":"./types/app-event.d.ts","import":"./dist/app-event.js"},"./commander":{"types":"./types/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./types/transports.d.ts","import":"./dist/transports.js"},"./durable-spool":{"types":"./types/durable-spool.d.ts","import":"./dist/durable-spool.js"},"./durable-worker":{"types":"./types/durable-worker.d.ts","import":"./dist/durable-worker.js"},"./schemas/hasna.app_event.v1.json":"./schemas/hasna.app_event.v1.json","./fixtures/hasna.app_event.v1.json":"./fixtures/hasna.app_event.v1.json"},"scripts":{"test":"bun test","build":"bun run build:runtime && bun run build:types","prepack":"bun run build && bun run artifact-scan","typecheck":"tsc --noEmit","build:types":"rm -rf types && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir types","artifact-scan":"bun scripts/artifact-scan.ts","build:runtime":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/types.ts src/commander.ts src/catalog.ts src/app-event.ts src/durable.ts src/durable-worker.ts --root src --outdir dist --target bun && bun build src/durable-spool.ts --root src --outdir dist --target node","contract:check":"contracts repo-conformance .","prepublishOnly":"bun run test && bun run build","generated-artifacts:check":"bun run build && test -z \"$(git status --porcelain --untracked-files=all -- dist types)\""},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"11.18.0","description":"Shared event envelopes, local channels, replay, and delivery transports for Hasna open-source apps","directories":{},"_nodeVersion":"22.22.3","dependencies":{"commander":"^13.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3","@hasna/contracts":"0.8.5"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.16_1787268617004_0.7168234246015319","host":"s3://npm-registry-packages-npm-production"}},"0.1.17":{"name":"@hasna/events","version":"0.1.17","keywords":["events","channels","cli","typescript","bun","hasna"],"author":{"name":"Hasna"},"license":"Apache-2.0","_id":"@hasna/events@0.1.17","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"dist":{"shasum":"81819937bb04d7477a5d4fd8b3cc1bbf409e1a32","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.17.tgz","fileCount":37,"integrity":"sha512-iKFB1uGdyCN2ODOhz6JdO4/qLLzJ/JjYUSF6yxbLQUQz/eSHTs9t3tQiOAPLYPr4sZgMNdSgfDbCGE9O9vA9Kg==","signatures":[{"sig":"MEUCIDzI0kTW5eqMR8CoTAAIVe4LLFH6r4K9zUwvixNn8CQAAiEAiNgVSquTiJNyz+vIl1U5nlO710/CBIfkRMyJr13v8DQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":547806},"main":"./dist/index.js","type":"module","types":"./types/index.d.ts","engines":{"bun":">=1.0.0","node":">=20.0.0"},"exports":{".":{"types":"./types/index.d.ts","import":"./dist/index.js"},"./cli":{"types":"./types/cli/index.d.ts","import":"./dist/cli/index.js"},"./sdk":{"types":"./types/index.d.ts","import":"./dist/index.js"},"./filter":{"types":"./types/filter.d.ts","import":"./dist/filter.js"},"./catalog":{"types":"./types/catalog.d.ts","import":"./dist/catalog.js"},"./durable":{"types":"./types/durable.d.ts","import":"./dist/durable.js"},"./signing":{"types":"./types/signing.d.ts","import":"./dist/signing.js"},"./storage":{"types":"./types/storage.d.ts","import":"./dist/storage.js"},"./app-event":{"types":"./types/app-event.d.ts","import":"./dist/app-event.js"},"./commander":{"types":"./types/commander.d.ts","import":"./dist/commander.js"},"./transports":{"types":"./types/transports.d.ts","import":"./dist/transports.js"},"./durable-spool":{"types":"./types/durable-spool.d.ts","import":"./dist/durable-spool.js"},"./durable-worker":{"types":"./types/durable-worker.d.ts","import":"./dist/durable-worker.js"},"./schemas/hasna.app_event.v1.json":"./schemas/hasna.app_event.v1.json","./fixtures/hasna.app_event.v1.json":"./fixtures/hasna.app_event.v1.json"},"scripts":{"test":"bun test","build":"bun run build:runtime && bun run build:types","prepack":"bun run build && bun run artifact-scan","typecheck":"tsc --noEmit","build:types":"rm -rf types && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir types","artifact-scan":"bun scripts/artifact-scan.ts","build:runtime":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/ssrf.ts src/types.ts src/commander.ts src/catalog.ts src/app-event.ts src/durable.ts src/durable-worker.ts --root src --outdir dist --target bun && bun build src/durable-spool.ts --root src --outdir dist --target node","contract:check":"contracts repo-conformance .","prepublishOnly":"bun run test && bun run build","generated-artifacts:check":"bun run build && test -z \"$(git status --porcelain --untracked-files=all -- dist types)\""},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"repository":{"url":"git+https://github.com/hasna/events.git","type":"git"},"_npmVersion":"11.18.0","description":"Shared event envelopes, local channels, replay, and delivery transports for Hasna open-source apps","directories":{},"_nodeVersion":"22.22.3","dependencies":{"commander":"^13.1.0","@hasna/paths":"0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.7.3","@hasna/contracts":"0.8.5"},"_npmOperationalInternal":{"tmp":"tmp/events_0.1.17_1787846773019_0.39432817825531785","host":"s3://npm-registry-packages-npm-production"}},"0.1.18":{"name":"@hasna/events","version":"0.1.18","description":"Shared event envelopes, local channels, replay, and delivery transports for Hasna open-source apps","type":"module","main":"./dist/index.js","types":"./types/index.d.ts","bin":{"events":"dist/cli/index.js","hasna-events":"dist/cli/index.js"},"exports":{".":{"types":"./types/index.d.ts","import":"./dist/index.js"},"./sdk":{"types":"./types/index.d.ts","import":"./dist/index.js"},"./storage":{"types":"./types/storage.d.ts","import":"./dist/storage.js"},"./durable":{"types":"./types/durable.d.ts","import":"./dist/durable.js"},"./durable-spool":{"types":"./types/durable-spool.d.ts","import":"./dist/durable-spool.js"},"./durable-worker":{"types":"./types/durable-worker.d.ts","import":"./dist/durable-worker.js"},"./signing":{"types":"./types/signing.d.ts","import":"./dist/signing.js"},"./filter":{"types":"./types/filter.d.ts","import":"./dist/filter.js"},"./transports":{"types":"./types/transports.d.ts","import":"./dist/transports.js"},"./catalog":{"types":"./types/catalog.d.ts","import":"./dist/catalog.js"},"./app-event":{"types":"./types/app-event.d.ts","import":"./dist/app-event.js"},"./schemas/hasna.app_event.v1.json":"./schemas/hasna.app_event.v1.json","./fixtures/hasna.app_event.v1.json":"./fixtures/hasna.app_event.v1.json","./commander":{"types":"./types/commander.d.ts","import":"./dist/commander.js"},"./cli":{"types":"./types/cli/index.d.ts","import":"./dist/cli/index.js"}},"scripts":{"build":"bun run build:runtime && bun run build:types","build:runtime":"rm -rf dist && bun build src/cli/index.ts --outdir dist/cli --target bun && bun build src/index.ts src/storage.ts src/signing.ts src/filter.ts src/transports.ts src/ssrf.ts src/types.ts src/commander.ts src/catalog.ts src/app-event.ts src/durable.ts src/durable-worker.ts --root src --outdir dist --target bun && bun build src/durable-spool.ts --root src --outdir dist --target node","build:types":"rm -rf types && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir types","generated-artifacts:check":"bun run build && test -z \"$(git status --porcelain --untracked-files=all -- dist types)\"","contract:check":"contracts repo-conformance .","artifact-scan":"bun scripts/artifact-scan.ts","typecheck":"tsc --noEmit","test":"bun test","prepack":"bun run build && bun run artifact-scan","prepublishOnly":"bun run test && bun run build"},"keywords":["events","channels","cli","typescript","bun","hasna"],"publishConfig":{"registry":"https://registry.npmjs.org","access":"public"},"repository":{"type":"git","url":"git+https://github.com/hasna/events.git"},"homepage":"https://github.com/hasna/events","bugs":{"url":"https://github.com/hasna/events/issues"},"engines":{"bun":">=1.0.0","node":">=20.0.0"},"author":{"name":"Hasna"},"license":"Apache-2.0","dependencies":{"commander":"^13.1.0"},"devDependencies":{"@hasna/contracts":"0.8.5","@types/bun":"1.3.14","typescript":"^5.7.3"},"_id":"@hasna/events@0.1.18","_integrity":"sha512-wevblwxPnqje9rq9Zo2TuRCKH6Wvc53cJvp9CuJCIzu9wt2yKXkoYSGPAnCinZ69cRiidmetmqM0EUYYAMsuMA==","_resolved":"/private/tmp/events-018-publisher-tomq2zle/reviewed-events-0.1.18.tgz","_from":"file:/private/tmp/events-018-publisher-tomq2zle/reviewed-events-0.1.18.tgz","_nodeVersion":"24.20.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-wevblwxPnqje9rq9Zo2TuRCKH6Wvc53cJvp9CuJCIzu9wt2yKXkoYSGPAnCinZ69cRiidmetmqM0EUYYAMsuMA==","shasum":"397ec7732df0ccf0289768c500f312dd43f5e61f","tarball":"https://registry.npmjs.org/@hasna/events/-/events-0.1.18.tgz","fileCount":38,"unpackedSize":551145,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCS0iFXNDrUhjqhr4j60Npx0kNg2oXKxEoc1thc4iphJgIhAO2h0GuegU6v197RpgqImPTElNY9BTT6Cbs/MHyIAp5H"}]},"_npmUser":{"name":"andreihasna2","email":"andrei@hasna.com"},"directories":{},"maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/events_0.1.18_1788781819081_0.7119898092361467"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-16T08:13:28.168Z","modified":"2026-09-07T11:50:19.476Z","0.1.0":"2026-06-16T08:13:28.525Z","0.1.1":"2026-06-16T08:13:56.893Z","0.1.2":"2026-06-16T08:27:35.395Z","0.1.3":"2026-06-16T08:28:08.437Z","0.1.4":"2026-06-16T09:34:01.397Z","0.1.5":"2026-06-16T10:26:09.212Z","0.1.6":"2026-06-16T10:40:53.942Z","0.1.7":"2026-06-16T11:10:48.597Z","0.1.8":"2026-06-17T16:54:04.772Z","0.1.9":"2026-06-26T17:31:28.751Z","0.1.10":"2026-06-27T09:33:51.797Z","0.1.11":"2026-06-27T14:33:14.530Z","0.1.12":"2026-06-28T08:41:41.924Z","0.1.13":"2026-06-28T16:42:48.714Z","0.1.14":"2026-07-24T14:52:59.117Z","0.1.15":"2026-08-13T17:54:50.116Z","0.1.16":"2026-08-20T23:30:17.218Z","0.1.17":"2026-08-27T16:06:13.206Z","0.1.18":"2026-09-07T11:50:19.253Z"},"bugs":{"url":"https://github.com/hasna/events/issues"},"author":{"name":"Hasna"},"license":"Apache-2.0","homepage":"https://github.com/hasna/events","keywords":["events","channels","cli","typescript","bun","hasna"],"repository":{"type":"git","url":"git+https://github.com/hasna/events.git"},"description":"Shared event envelopes, local channels, replay, and delivery transports for Hasna open-source apps","maintainers":[{"name":"andreihasna2","email":"andrei@hasna.com"}],"readme":"# @hasna/events\n\nShared event envelopes, local channels, replay, and delivery transports for Hasna open-source apps.\n\nThis package is local-first. By default it stores JSON files under `~/.hasna/events`:\n\n- `channels.json`\n- `events.json`\n- `deliveries.json`\n\nThe data home is resolved through the shared `@hasna/paths` resolver, in this order:\n\n1. The CLI `--dir` flag (highest precedence);\n2. the exact-app `HASNA_EVENTS_DIR` override, then the legacy\n   `HASNA_EVENTS_HOME` fallback;\n3. the `@hasna/paths`-resolved XDG data home (`HASNA_DATA_HOME`/`~/.local/share/hasna/events`),\n   adopted once `HASNA_DATA_HOME` is set or the store has been physically migrated there\n   (`events.json` exists at that home);\n4. the legacy `~/.hasna/events` default.\n\nNothing moves on its own: the package keeps reading and writing whichever home is\neffective, and the legacy `~/.hasna/events` stays effective until an operator opts into\nthe XDG layout or the store is migrated to it.\n\n## Storage Runtime Contract\n\nThe default compatibility runtime is local JSON files. It does not use local\nSQLite, remote Postgres, S3, AWS infrastructure, or live cloud mutation. Apps\nthat require cross-process idempotency and restart-safe webhook delivery should\nuse the opt-in durable spool and SQLite broker described below.\n\n```ts\nimport { getEventsStatus } from \"@hasna/events\";\n\nconst status = await getEventsStatus();\n\nconsole.log(status.storage);\n// {\n//   mode: \"local-files\",\n//   localFiles: true,\n//   localSqlite: false,\n//   remote: false,\n//   postgres: false,\n//   s3: false,\n//   aws: false,\n//   idempotency: \"best-effort-local\",\n//   replayCursors: true\n// }\n```\n\nCloud-backed stores should implement the same `EventsStore` interface and, for\ndurable event-bus use, the optional `appendEventOnce` and `listEventsPage`\nmethods. `appendEventOnce` is the storage-layer hook for atomic idempotency by\n`id` or `dedupeKey`, such as a Postgres unique constraint or equivalent\nprovider guarantee. `listEventsPage` returns an opaque cursor page for bounded\nreplay. The local JSON store implements these hooks for deterministic local\ntests, but its idempotency is best-effort local file behavior, not a\ncross-process database lock.\n\nRemote Postgres/S3/AWS adapters should keep credentials and infrastructure\nprovisioning outside this package configuration, report their storage mode in\n`status.storage`, and avoid emitting live external deliveries during store\ntests. Creating buckets, databases, secrets, migrations, or production data\nchanges is an explicit deployment/approval step, not part of this local runtime.\n\n## Install\n\n```bash\nbun add @hasna/events\n```\n\nThe core CLI and durable SQLite broker require Bun 1.0 or newer. The isolated\n`@hasna/events/durable-spool` producer export supports Node 20 or newer.\n\n## Event Envelope\n\nAll apps should emit the same stable envelope:\n\n```ts\nimport { EventsClient } from \"@hasna/events\";\n\nconst events = new EventsClient();\n\nawait events.emit({\n  id: \"optional-stable-id\",\n  source: \"tickets\",\n  type: \"ticket.created\",\n  time: new Date(),\n  subject: \"ticket:123\",\n  severity: \"notice\",\n  data: { ticketId: 123 },\n  message: \"Ticket created\",\n  dedupeKey: \"tickets:ticket:123:created\",\n  schemaVersion: \"1.0\",\n  metadata: { tenant: \"acme\" },\n});\n```\n\nOnly `source` and `type` are required inputs. `id` defaults to a UUID, `time`\nto the current ISO timestamp, `severity` to `info`, `data` and `metadata` to\nempty objects, and `schemaVersion` to `1.0`. `subject`, `message`, and\n`dedupeKey` are optional.\n\n`source` should be the emitting app or bounded context. `type` should use dot\nnotation such as `ticket.created`, `repo.synced`, or `check.failed`. Emission\ndeduplicates by either an explicit `id` or `dedupeKey` by default; a duplicate\nis neither stored nor delivered again. Library callers can pass\n`{ dedupe: false }` to store a duplicate intentionally.\n\n## Package Entry Points\n\nThe root export includes the client, types, storage, filtering, signing,\ntransports, and catalog APIs. Focused entry points are also available:\n\n- `@hasna/events/storage`\n- `@hasna/events/signing`\n- `@hasna/events/filter`\n- `@hasna/events/transports`\n- `@hasna/events/catalog`\n- `@hasna/events/commander`\n- `@hasna/events/cli`\n\n## Typed Event Catalog (Distribution Events)\n\n`@hasna/events/catalog` binds well-known envelope `type` strings to the\n`@hasna/contracts` schema ids their `data` payloads mirror, and provides an\nOPT-IN emit-time validator hook.\n\nDistribution event types (`DISTRIBUTION_EVENT_TYPES`):\n\n| Event type | Contracts schema (`data` mirror) |\n| --- | --- |\n| `release.published` | `hasna.release.v1` |\n| `release.rollout.started` | `hasna.rollout_record.v1` |\n| `release.rollout.completed` | `hasna.rollout_record.v1` |\n| `release.rollout.failed` | `hasna.rollout_record.v1` |\n| `app.installed` | `hasna.rollout_record.v1` |\n| `announcement.sent` | `hasna.announcement.v1` |\n| `feedback.created` | `hasna.feedback.v1` |\n| `feedback.triaged` | `hasna.feedback.v1` |\n\n```ts\nimport { EventsClient, EventTypeCatalog, registerDistributionEventTypes } from \"@hasna/events\";\n\nconst catalog = registerDistributionEventTypes(new EventTypeCatalog());\nconst client = new EventsClient({ catalog, validateCatalogTypes: true });\n\n// Registered type with an invalid payload throws EventValidationError\n// BEFORE the event is stored or delivered.\nawait client.emit({\n  source: \"publish\",\n  type: \"release.published\",\n  data: { appId: \"todos\" },\n});\n```\n\nValidation is fully backward compatible:\n\n- It is OFF by default (`validateCatalogTypes` defaults to `false`).\n- Unregistered/free-form event types ALWAYS pass, even when validation is on.\n- A per-emit `validate` option overrides the client setting in both directions.\n\nPayload types (`ReleasePublishedData`, `RolloutData`, `AppInstalledData`,\n`AnnouncementSentData`, `FeedbackCreatedData`, `FeedbackTriagedData`) are\ndependency-free structural mirrors of the contracts schemas; this package does\nnot depend on `@hasna/contracts` at runtime.\n\n## OpenAutomations Trigger Ingress\n\n`@hasna/events` is trigger ingress for OpenAutomations. It records and delivers\nevent envelopes, but it does not own durable automation runs, action queues,\napprovals, DLQ state, or replay decisions. `@hasna/automations` consumes the\nsame envelope shape and materializes matching events into durable automation\nruns.\n\nFor automation-triggered events:\n\n- set `source` to the emitting app or bounded context\n- set `type` with dot notation, such as `ticket.created`\n- set `subject` when the event describes one stable domain object\n- set `dedupeKey` when the producer has a stable business identity\n- keep `id` stable for the specific emitted envelope\n- put only serializable trigger data in `data`\n- keep secrets out of `data` and `metadata`; pass secret references instead\n\nOpenAutomations derives idempotency from `dedupeKey` first and falls back to\n`id` when no dedupe key is present. Replaying events through `events events\nreplay` re-delivers envelopes; OpenAutomations is still responsible for deciding\nwhether that delivery creates a new run, returns the existing idempotent run, or\ncreates an explicit replay request.\n\n## OpenLoops Task Notifications\n\n`@hasna/events` is also notification ingress for OpenLoops task-created routes.\nIt delivers `todos` envelopes to configured channels, but it does not import\nOpenLoops, create workflow invocations, own admission queue state, run agents,\nor decide worker retry/backpressure policy. OpenLoops is the consumer that\nhandles an envelope, dedupes/upserts a work item, admits it when capacity is\navailable, and records workflow run manifests under `.hasna/loops/runs`.\n\nReplay remains delivery-only. Replaying a `todos.task.created` or\n`task.created` envelope sends the event to matching channels again; OpenLoops\ndecides whether that replay is ignored as an already-admitted task, resumes\nexisting work, or creates an explicit replay work item.\n\n## Channels And Filters\n\nChannels are reusable notification routes. They can be enabled or disabled,\nfiltered by source/type/subject/severity, and configured with\ntransport-specific settings.\n\n```ts\nawait events.addChannel({\n  id: \"ops-webhook\",\n  enabled: true,\n  transport: \"webhook\",\n  filters: [{ type: \"ticket.*\", severity: [\"warning\", \"error\", \"critical\"] }],\n  webhook: {\n    url: \"https://example.com/channels/hasna\",\n    secret: process.env.HASNA_WEBHOOK_SECRET,\n  },\n  retry: {\n    maxAttempts: 3,\n    backoffMs: 500,\n    multiplier: 2,\n  },\n  redact: {\n    paths: [\"data.token\", \"metadata.authorization\"],\n  },\n});\n```\n\nAll matchers inside one filter are ANDed. Multiple filters on a channel are\nORed. A channel with no filters accepts every event, while a disabled channel\naccepts none. String matchers support `*` and `**`; `data` and `metadata`\nmatchers also support nested or literal dotted keys, primitive array-member\nmatching, typed values, and negative matchers.\n\n## Webhook Transport\n\nWebhook delivery sends a `POST` with the event envelope as JSON.\n\nHeaders:\n\n- `Content-Type: application/json`\n- `User-Agent: @hasna/events`\n- `X-Hasna-Event-Id`\n- `X-Hasna-Event-Type`\n- `X-Hasna-Timestamp`\n- `X-Hasna-Signature` when `webhook.secret` or `webhook.secretRef` resolves\n\n`X-Hasna-Timestamp` is the current delivery-attempt time and is what the HMAC\nsigns. The envelope `time` in the JSON body remains the original event time, so\ndelayed imports and retries receive fresh replay-window signatures without\nrewriting domain history.\nCustom webhook headers whose names begin with `X-Hasna-` are rejected so channel\nconfiguration cannot replace signed delivery metadata.\n\nSignatures use HMAC-SHA256 over:\n\n```text\n<timestamp>.<json-body>\n```\n\nThe signature format is:\n\n```text\nsha256=<hex digest>\n```\n\nConsumers can verify with:\n\n```ts\nimport { verifyWebhookSignature } from \"@hasna/events/signing\";\n\nconst ok = verifyWebhookSignature(secret, timestamp, body, signature);\n```\n\n`verifyWebhookSignature` rejects timestamps outside a five-minute window by default.\nPass an explicit `toleranceMs` when a consumer needs a tighter or wider replay\nwindow.\n\n## Durable Node Producer And Bun Delivery Worker\n\n`@hasna/events/durable-spool` is the producer boundary for Node 20+ apps. It\nhas no Bun runtime import and performs no network access. Each enqueue writes a\nmode-0600 temporary file, fsyncs it, hard-links it without replacement to an\nidentity-keyed final name, removes the temporary file, and fsyncs the inbox\ndirectory. Concurrent producers with the same `dedupeKey` converge on one\nimmutable record.\n\n```ts\nimport { DurableEventSpool } from \"@hasna/events/durable-spool\";\n\nconst spool = new DurableEventSpool({ dataDir: process.env.HASNA_EVENTS_DIR! });\nawait spool.enqueue({\n  id: \"notes:note:123:created\",\n  source: \"notes\",\n  type: \"note.created\",\n  time: \"2026-08-06T12:00:00.000Z\",\n  subject: \"note:123\",\n  dedupeKey: \"notes:note:123:created\",\n  schemaVersion: \"notes.v1\",\n  data: {\n    noteId: \"123\",\n    createdAt: \"2026-08-06T12:00:00.000Z\",\n    originMachine: \"station03\",\n  },\n  metadata: {},\n});\n```\n\n`@hasna/events/durable` is Bun-only because it uses `bun:sqlite`. The broker\nimports committed spool records into an event and matching-channel outbox in a\nSQLite `BEGIN IMMEDIATE` transaction, then removes the spool record. SQLite WAL,\nunique event/dedupe identities, unique event/channel jobs, bounded leases, and\npersisted retry timestamps make separate workers and process restarts safe.\nProducer spool records and broker event rows apply the default sensitive-key\nredaction. Each outbox row additionally applies its channel's `redact.paths`\nbefore the payload is persisted or delivered.\nThe broker initializes schema v1 only from an empty version-0 application\nschema. Existing v1 databases must match the complete columns, constraints,\nforeign keys, and indexes; malformed or newer schemas are rejected unchanged.\n\n```ts\nimport { DurableEventsBroker } from \"@hasna/events/durable\";\n\nconst broker = new DurableEventsBroker({ dataDir: process.env.HASNA_EVENTS_DIR! });\nbroker.addChannel({\n  id: \"notes-created\",\n  enabled: false,\n  transport: \"webhook\",\n  filters: [{ source: \"notes\", type: \"note.created\" }],\n  webhook: {\n    url: \"https://example.com/events/notes\",\n    secretRef: \"env:HASNA_NOTES_WEBHOOK_SECRET\",\n  },\n  retry: { maxAttempts: 5, backoffMs: 1_000, multiplier: 2 },\n});\n\nbroker.importSpool();\nawait broker.drain();\nbroker.close();\n```\n\nDurable SQLite channels reject inline `webhook.secret` values. The default\nresolver supports `env:VARIABLE_NAME`; callers can inject a vault-backed\nresolver. Resolved credential values are used only to sign the in-memory HTTP\nrequest and are never stored in channel configuration, the outbox, delivery\nhistory, or status output.\n\nAny HTTP 2xx response acknowledges delivery. The receiver therefore must return\n2xx only after durably enqueueing the event and must deduplicate by `dedupeKey`\nor `id`. Non-2xx responses, timeouts, and unresolved runtime secrets follow the\npersisted retry schedule. Exhausted jobs remain `dead`; an operator can call\n`retryDead({ eventId, channelId, limit })` or use `events durable retry-dead`\nwithout creating a second event/channel outbox identity.\n\nThe Bun CLI exposes the same operator boundary:\n\n```bash\nevents --dir \"$HASNA_EVENTS_DIR\" durable channel https://example.com/events/notes \\\n  --id notes-created --source notes --type note.created \\\n  --secret-ref env:HASNA_NOTES_WEBHOOK_SECRET --disabled\n\nevents --dir \"$HASNA_EVENTS_DIR\" durable drain --limit 100\nevents --dir \"$HASNA_EVENTS_DIR\" durable work --limit 100\nevents --dir \"$HASNA_EVENTS_DIR\" durable retry-dead --limit 100\nevents --dir \"$HASNA_EVENTS_DIR\" durable status\n```\n\n`durable drain` imports and processes one bounded batch, then exits. Enqueueing\nalone never performs network delivery. `durable work` is the long-running Bun\nworker: it watches only the durable spool inbox, debounces file events, imports\nand drains immediately, wakes at the next persisted retry timestamp, and runs a\nlow-frequency bounded reconciliation in case a filesystem notification was\nmissed. It never watches Apple Notes or note files. SIGTERM and SIGINT stop it\ncleanly. Each worker claims only the job it is about to dispatch, and only the\ncurrent lease owner can settle it. Delivery is still at-least-once: if a request\noutlives its lease, another worker may retry it, so receivers must deduplicate by\n`dedupeKey` or `id`. This package change does not install, start, or enable a\nrunner; a canary deployment must supervise one `durable work` process explicitly.\n\nWebhook requests time out after 15 seconds unless `webhook.timeoutMs` is set.\nNon-2xx responses and network failures are recorded as failed attempts. The\ncompatibility JSON delivery path stores response bodies truncated after 4,096\ncharacters; durable delivery intentionally omits response bodies, stdout, and\nstderr from its outbox and delivery history.\n\n## Command Transport\n\nCommand channels run a local process and pass the event on stdin and environment variables.\nFor production task-created automation, route to tested package commands such as\n`loops events handle todos-task` rather than long-lived local scripts. Scripts\nlike `scripts/handle-event.ts` are useful prototypes; repeated behavior should\nmove into the owning `open-*` package with tests and bounded evidence.\n\n```ts\nawait events.addChannel({\n  id: \"local-handler\",\n  enabled: true,\n  transport: \"command\",\n  filters: [{ type: \"repo.*\" }],\n  command: {\n    command: \"bun\",\n    args: [\"run\", \"scripts/handle-event.ts\"],\n  },\n});\n```\n\nEnvironment variables:\n\n- `HASNA_CHANNEL_ID`\n- `HASNA_EVENT_ID`\n- `HASNA_EVENT_TYPE`\n- `HASNA_EVENT_SOURCE`\n- `HASNA_EVENT_SUBJECT`\n- `HASNA_EVENT_SEVERITY`\n- `HASNA_EVENT_TIME`\n- `HASNA_EVENT_DEDUPE_KEY`\n- `HASNA_EVENT_SCHEMA_VERSION`\n- `HASNA_EVENT_JSON`\n\nCommand processes time out after 15 seconds unless `command.timeoutMs` is set.\nTheir stdout and stderr are stored on the delivery attempt and truncated after\n4,096 characters. A zero exit code succeeds; other exits or signals fail.\n\nBoth implemented transports use one attempt by default. Channel retry policy\ncan increase `maxAttempts`; failed attempts back off from 250 ms by a default\nmultiplier of 2 unless overridden. The transport type union reserves `email`,\n`sse`, and `mcp-relay`, but the CLI refuses to configure them and direct\ndispatch currently records them as skipped.\n\n## Redaction\n\nEvents scrub obvious sensitive keys such as `secret`, `token`, `password`,\n`apiKey`, `api_key`, `api-key`, and `authorization` recursively before local\nstorage and delivery by default.\nCallers that intentionally need raw local payloads can pass:\n\n```ts\nawait events.emit(input, { redactSensitiveData: false });\n```\n\nUse channel-level paths for per-channel delivery redaction:\n\n```ts\nawait events.addChannel({\n  id: \"secure-hook\",\n  enabled: true,\n  transport: \"webhook\",\n  webhook: { url: \"https://example.com\" },\n  redact: { paths: [\"data.secret\", \"metadata.token\"] },\n});\n```\n\nUse runtime hooks for app-specific policies:\n\n```ts\nconst events = new EventsClient({\n  redactors: [\n    async (event) => ({\n      ...event,\n      metadata: { ...event.metadata, internalOnly: undefined },\n    }),\n  ],\n});\n```\n\n## CLI\n\nThe package exposes `events` and `hasna-events`. `hasna-events` is a\n**deprecated alias** of `events` (same entrypoint, kept for npm parity with\n0.1.15); new usage should call `events` directly, and the alias is scheduled\nfor removal in a future major release (hasna/apps#1602).\n\nGlobal options must come before the command group:\n\n```bash\nevents --dir /tmp/events --json status\n```\n\n```bash\nevents channels add https://example.com/channels/hasna \\\n  --id ops \\\n  --type \"ticket.*\" \\\n  --secret \"$HASNA_WEBHOOK_SECRET\" \\\n  --retry-attempts 3 \\\n  --retry-backoff-ms 500\n\nevents channels list\nevents channels test ops\nevents channels match ops\nevents channels remove ops\n```\n\n`channels test` exits with code 1 when delivery fails and code 0 when delivery\nsucceeds or is skipped by `--honor-filters`. Its JSON delivery result and human\nstatus output are preserved in either case.\n\nThe standalone CLI and default embedded Commander commands deny private webhook\ntargets unless the administrator sets `HASNA_EVENTS_ALLOW_PRIVATE_WEBHOOK_TARGETS`\nto a comma-separated list of exact hostnames or IP addresses. For an intentional\nlocal receiver, set `HASNA_EVENTS_ALLOW_PRIVATE_WEBHOOK_TARGETS=127.0.0.1`.\nThis setting does not change SDK defaults or override an embedded host's custom\n`createClient` policy. Redirects and DNS results still undergo target validation.\n\nField filters can match nested `data` or `metadata` values. Plain\n`--data`/`--metadata` values are strings, which keeps ids and slugs such as\n`001` intact. Use `--data-json` or `--metadata-json` for typed JSON predicates.\nDot paths check both nested object keys and literal dotted keys; there is no\nsyntax to distinguish between those two forms yet. A negative predicate also\nmatches when its field is absent.\nWhen the actual event value is an array, string filters match any primitive\narray member, which is useful for tag routing such as `data.tags=auto:route`.\nUse `path!=value` or `path!=json` for negative predicates such as\n`metadata-json 'automation.no_auto!=true'`. Wildcard behavior stays broad for\nlegacy source/type/subject filters. For field paths ending in `_path` or `.path`,\n`*` matches one path segment and `**` matches recursively.\n\n```bash\nevents channels add loops \\\n  --id open-source-task-route \\\n  --transport command \\\n  --source todos \\\n  --type task.created \\\n  --timeout-ms 15000 \\\n  --retry-attempts 3 \\\n  --retry-backoff-ms 500 \\\n  --metadata 'project_path=/home/hasna/workspace/hasna/opensource/*' \\\n  --metadata-json 'route_enabled=true' \\\n  --metadata-json 'automation.no_auto!=true' \\\n  --data 'tags=auto:route' \\\n  --arg events \\\n  --arg handle \\\n  --arg todos-task\n\n# Command args that begin with dashes can be passed either form:\nevents channels add events --id json-route --transport command --arg --json\nevents channels add events --id json-route --transport command --arg=--json\n\n# For nested CLIs, put child positional args and flags after an explicit delimiter.\nevents channels add events --id nested-route --transport command -- handle todos-task --json\n\nevents channels match open-source-task-route \\\n  --source todos \\\n  --type task.created \\\n  --metadata '{\"project_path\":\"/home/hasna/workspace/repos/hasna/events\",\"route_enabled\":true}'\n\nevents channels test open-source-task-route --honor-filters \\\n  --source todos \\\n  --type task.created \\\n  --metadata '{\"project_path\":\"/tmp/outside\",\"route_enabled\":true}'\n```\n\nEmit, list, and replay:\n\n```bash\nevents events emit ticket.created \\\n  --source tickets \\\n  --subject ticket:123 \\\n  --severity notice \\\n  --message \"Ticket created\" \\\n  --data '{\"ticketId\":123}'\n\nevents events list --limit 20\nevents events list --source tickets --type ticket.created\nevents events replay --type ticket.created\nevents events replay --type ticket.created --dry-run --limit 100\nevents events replay --type ticket.created --cursor \"$NEXT_CURSOR\" --limit 100\nevents events replay --dry-run\n```\n\nReplay cursors are opaque and tied to the same filter set (`--id`, `--source`,\nand `--type`) used to produce them. Use the `nextCursor` returned by the\nprevious JSON replay response rather than constructing cursor strings in\ncallers. A replay without `--limit` or `--cursor` processes all matching events;\nuse those flags when callers need bounded page-by-page replay.\n\nMachine-readable status (global flags precede `status`):\n\n```bash\nevents --json status\n```\n\nThe status contract reports storage runtime, event, channel, delivery, file, and\ntransport metadata only. It does not include event payloads, webhook signing\nsecrets, command environment values, or channel targets.\n\nUse `--json` for script-friendly output and `--dir <path>` for isolated data.\nThe standalone `events events list` command has no implicit row cap. Commands\nregistered into another Commander program with `registerEventsCommands` default\nto the 100 most recent rows, accept a host override, and use `--limit 0` to list\nall rows. The embedded emitter also supports `--no-dedupe`; the standalone CLI\ndoes not currently expose that library option.\n\n## App Integration Pattern\n\nApps should keep event emission near durable state changes and avoid hardcoding app-specific channels. The common pattern is:\n\n```ts\nimport { EventsClient } from \"@hasna/events\";\n\nconst events = new EventsClient();\n\nexport async function recordDomainEvent() {\n  await events.emit({\n    source: \"your-app\",\n    type: \"domain.object.changed\",\n    subject: \"object:123\",\n    severity: \"info\",\n    data: { id: 123 },\n  });\n}\n```\n\nLocal users and agents can configure channels once through the CLI, and every app using `@hasna/events` will share the same local channel config.\n\n## Development\n\n```bash\nbun test\nbun run typecheck\nbun run build\n```\n","readmeFilename":"README.md"}