{"_id":"@slopus/murmur","_rev":"20-ec1408daac8d168a781ee9fba5769306","name":"@slopus/murmur","dist-tags":{"latest":"0.8.2"},"versions":{"0.1.0":{"name":"@slopus/murmur","version":"0.1.0","keywords":["encrypted-messaging","end-to-end-encryption","messaging","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.1.0","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur-core#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"19181ce10a68b17b99c89f4f5623dc01f9f0a56f","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.1.0.tgz","fileCount":275,"integrity":"sha512-jNki/JN63IXXF0gYd9gkDQuGwjnglxoRFNbAVzFfcx1VTFa7Lp9Wh5JzfPLsmzf66W26ooDj/qUQ+V+rXhYC3w==","signatures":[{"sig":"MEUCICPec+61i9il5LPgjjbk929VAGZa+zC8kcGp4AmoZh0DAiEAtIehYCFTHg+PwQEbx7GPN49KpWXk1I/Bi0P8JzX589w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":884715},"main":"./dist/index.js","type":"module","_from":"file:slopus-murmur-0.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./mls":{"types":"./dist/mls/index.d.ts","import":"./dist/mls/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./client":{"types":"./dist/client/index.d.ts","import":"./dist/client/index.js"},"./crypto":{"types":"./dist/crypto/index.d.ts","import":"./dist/crypto/index.js"},"./storage":{"types":"./dist/storage/index.d.ts","import":"./dist/storage/index.js"},"./document":{"types":"./dist/document/index.d.ts","import":"./dist/document/index.js"},"./identity":{"types":"./dist/identity/index.d.ts","import":"./dist/identity/index.js"},"./messaging":{"types":"./dist/messaging/index.d.ts","import":"./dist/messaging/index.js"},"./transport":{"types":"./dist/transport/index.d.ts","import":"./dist/transport/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"pnpm run clean && tsc -p tsconfig.build.json && pnpm --dir ../murmur-mls build && node --input-type=module -e \"import { cpSync } from 'node:fs'; cpSync('../murmur-mls/dist', 'dist/mls', { recursive: true });\"","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","test:watch":"vitest"},"_npmUser":{"name":"steve.kite","email":"steve@korshakov.com"},"_resolved":"/private/var/folders/39/zqvnt_z11n9b3wfz_gl56sfw0000gn/T/92a3c1506483dca30888b9d9c6a47b72/slopus-murmur-0.1.0.tgz","_integrity":"sha512-jNki/JN63IXXF0gYd9gkDQuGwjnglxoRFNbAVzFfcx1VTFa7Lp9Wh5JzfPLsmzf66W26ooDj/qUQ+V+rXhYC3w==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur-core"},"_npmVersion":"11.11.0","description":"Transport-agnostic encrypted messaging and MLS for Murmur","directories":{},"sideEffects":false,"_nodeVersion":"25.8.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.1.0_1785457291009_0.22172177707927654","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@slopus/murmur","version":"0.1.9","keywords":["encrypted-messaging","end-to-end-encryption","messaging","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.1.9","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur-core#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"a4f46794e85df5961761411a1d427daa63fc7804","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.1.9.tgz","fileCount":275,"integrity":"sha512-L3N0fSuROBKcujFPNy149kwSS9xuX9zIiZOXspWoeBjzLKAsj5Rej45fea/nQfzBBYfFdsNjfGIFi6eSj8j1eA==","signatures":[{"sig":"MEQCIGGHlFWUnk963kctNhCaWmpO7Cas/Vwm9p7hD/J+HGxaAiAHKMFQBO2VPa6DEd7DGfLweb/GIJbv/9hs6bOAopi/Ew==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.1.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":906812},"main":"./dist/index.js","type":"module","_from":"file:slopus-murmur-0.1.9.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./mls":{"types":"./dist/mls/index.d.ts","import":"./dist/mls/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./client":{"types":"./dist/client/index.d.ts","import":"./dist/client/index.js"},"./crypto":{"types":"./dist/crypto/index.d.ts","import":"./dist/crypto/index.js"},"./storage":{"types":"./dist/storage/index.d.ts","import":"./dist/storage/index.js"},"./document":{"types":"./dist/document/index.d.ts","import":"./dist/document/index.js"},"./identity":{"types":"./dist/identity/index.d.ts","import":"./dist/identity/index.js"},"./messaging":{"types":"./dist/messaging/index.d.ts","import":"./dist/messaging/index.js"},"./transport":{"types":"./dist/transport/index.d.ts","import":"./dist/transport/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"pnpm run clean && tsc -p tsconfig.build.json && pnpm --dir ../murmur-mls build && node --input-type=module -e \"import { cpSync } from 'node:fs'; cpSync('../murmur-mls/dist', 'dist/mls', { recursive: true });\"","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/tmp/005622c44b73962094401b0728be42b4/slopus-murmur-0.1.9.tgz","_integrity":"sha512-L3N0fSuROBKcujFPNy149kwSS9xuX9zIiZOXspWoeBjzLKAsj5Rej45fea/nQfzBBYfFdsNjfGIFi6eSj8j1eA==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur-core"},"_npmVersion":"11.16.0","description":"End-to-end encrypted messaging and MLS over dumb Murmur relays","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.1.9_1785719053378_0.8549010842530784","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@slopus/murmur","version":"0.1.11","keywords":["encrypted-messaging","end-to-end-encryption","messaging","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.1.11","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur-core#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"1ae5494f4aafedbf8417ad50d889c0633c516f73","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.1.11.tgz","fileCount":311,"integrity":"sha512-zysl+CdYjzde6WzOZmpu7JX5TKebT4C6FwLvrp0YmoT2Mnwtz4cX2G58NPljdHp8cxV72pMK4SWPr53S3PJqdg==","signatures":[{"sig":"MEQCICmCOhFTGlXOoSQW74FPjnO6mrHM3De28A+BRGilTsrQAiBWdW1sy47Lmr/aWmsCNydma8+ZHCvtPAhXR0SqE9jtOg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.1.11","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1340482},"main":"./dist/index.js","type":"module","_from":"file:slopus-murmur-0.1.11.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./mls":{"types":"./dist/mls/index.d.ts","import":"./dist/mls/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./client":{"types":"./dist/client/index.d.ts","import":"./dist/client/index.js"},"./crypto":{"types":"./dist/crypto/index.d.ts","import":"./dist/crypto/index.js"},"./storage":{"types":"./dist/storage/index.d.ts","import":"./dist/storage/index.js"},"./document":{"types":"./dist/document/index.d.ts","import":"./dist/document/index.js"},"./identity":{"types":"./dist/identity/index.d.ts","import":"./dist/identity/index.js"},"./messaging":{"types":"./dist/messaging/index.d.ts","import":"./dist/messaging/index.js"},"./transport":{"types":"./dist/transport/index.d.ts","import":"./dist/transport/index.js"},"./directChat":{"types":"./dist/directChat/index.d.ts","import":"./dist/directChat/index.js"},"./package.json":"./package.json","./sharedSession":{"types":"./dist/mls/sharedSession/index.d.ts","import":"./dist/mls/sharedSession/index.js"}},"scripts":{"test":"vitest run","build":"pnpm run clean && tsc -p tsconfig.build.json && pnpm --dir ../murmur-mls build && node --input-type=module -e \"import { cpSync } from 'node:fs'; cpSync('../murmur-mls/dist', 'dist/mls', { recursive: true });\"","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/tmp/49dcbec638f7047a0c609fc25aa35713/slopus-murmur-0.1.11.tgz","_integrity":"sha512-zysl+CdYjzde6WzOZmpu7JX5TKebT4C6FwLvrp0YmoT2Mnwtz4cX2G58NPljdHp8cxV72pMK4SWPr53S3PJqdg==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur-core"},"_npmVersion":"11.16.0","description":"End-to-end encrypted messaging and MLS over dumb Murmur relays","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.1.11_1785777240734_0.5176033099581447","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"@slopus/murmur","version":"0.1.12","keywords":["encrypted-messaging","end-to-end-encryption","messaging","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.1.12","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur-core#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"21df59723d23e0fe66345f2f94e4e95922a4079e","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.1.12.tgz","fileCount":331,"integrity":"sha512-jkuA/IXVKSvjFFO6E1/EKWy7d4OFOPysFJSJGLKCINFQ3ZVIUP9FYa/QDXxSvncAxYycVOUfB5a8kpbKjH4lmg==","signatures":[{"sig":"MEUCIBdAGkKu2nCrAsTx6fOVNPw7Fau71RyaecuPXR/iN+rhAiEAjeg8f/LxI9kRHAr99kdjqXkOV+iJbQYfiXqTyyi3F+w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.1.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1478189},"main":"./dist/index.js","type":"module","_from":"file:slopus-murmur-0.1.12.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./mls":{"types":"./dist/mls/index.d.ts","import":"./dist/mls/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./client":{"types":"./dist/client/index.d.ts","import":"./dist/client/index.js"},"./crypto":{"types":"./dist/crypto/index.d.ts","import":"./dist/crypto/index.js"},"./storage":{"types":"./dist/storage/index.d.ts","import":"./dist/storage/index.js"},"./document":{"types":"./dist/document/index.d.ts","import":"./dist/document/index.js"},"./identity":{"types":"./dist/identity/index.d.ts","import":"./dist/identity/index.js"},"./messaging":{"types":"./dist/messaging/index.d.ts","import":"./dist/messaging/index.js"},"./transport":{"types":"./dist/transport/index.d.ts","import":"./dist/transport/index.js"},"./directChat":{"types":"./dist/directChat/index.d.ts","import":"./dist/directChat/index.js"},"./package.json":"./package.json","./sharedSession":{"types":"./dist/mls/sharedSession/index.d.ts","import":"./dist/mls/sharedSession/index.js"}},"scripts":{"test":"vitest run","build":"pnpm run clean && tsc -p tsconfig.build.json && pnpm --dir ../murmur-mls build && node --input-type=module -e \"import { cpSync } from 'node:fs'; cpSync('../murmur-mls/dist', 'dist/mls', { recursive: true });\"","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/tmp/d192fbb111f4af749d1aeb677cb7acb6/slopus-murmur-0.1.12.tgz","_integrity":"sha512-jkuA/IXVKSvjFFO6E1/EKWy7d4OFOPysFJSJGLKCINFQ3ZVIUP9FYa/QDXxSvncAxYycVOUfB5a8kpbKjH4lmg==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur-core"},"_npmVersion":"11.16.0","description":"End-to-end encrypted messaging and MLS over dumb Murmur relays","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.1.12_1785798587066_0.6120087261609246","host":"s3://npm-registry-packages-npm-production"}},"0.1.13":{"name":"@slopus/murmur","version":"0.1.13","keywords":["encrypted-messaging","end-to-end-encryption","messaging","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.1.13","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur-core#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"9cc3d3716c2d3d80cfc7058c3988ae10d318c717","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.1.13.tgz","fileCount":331,"integrity":"sha512-lDiw2K9yePIwGPF97lDJSNDHCmnlcYOZDChCmtpTcVyVVzKq/y3ySBZ5SpLtoTPSmrt9vj+elG3F2QW7pzUCrA==","signatures":[{"sig":"MEUCIQDFgMNzHJv0KSz3IGLgV/EsUetb1RdrVwvuH9FpLqoSDwIgPs4ER9ProCj+3OiHAdjI/4KvxTKWhgxihLViShucYrE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.1.13","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1479369},"main":"./dist/index.js","type":"module","_from":"file:slopus-murmur-0.1.13.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./mls":{"types":"./dist/mls/index.d.ts","import":"./dist/mls/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./client":{"types":"./dist/client/index.d.ts","import":"./dist/client/index.js"},"./crypto":{"types":"./dist/crypto/index.d.ts","import":"./dist/crypto/index.js"},"./storage":{"types":"./dist/storage/index.d.ts","import":"./dist/storage/index.js"},"./document":{"types":"./dist/document/index.d.ts","import":"./dist/document/index.js"},"./identity":{"types":"./dist/identity/index.d.ts","import":"./dist/identity/index.js"},"./messaging":{"types":"./dist/messaging/index.d.ts","import":"./dist/messaging/index.js"},"./transport":{"types":"./dist/transport/index.d.ts","import":"./dist/transport/index.js"},"./directChat":{"types":"./dist/directChat/index.d.ts","import":"./dist/directChat/index.js"},"./package.json":"./package.json","./sharedSession":{"types":"./dist/mls/sharedSession/index.d.ts","import":"./dist/mls/sharedSession/index.js"}},"scripts":{"test":"vitest run","build":"pnpm run clean && tsc -p tsconfig.build.json && pnpm --dir ../murmur-mls build && node --input-type=module -e \"import { cpSync } from 'node:fs'; cpSync('../murmur-mls/dist', 'dist/mls', { recursive: true });\"","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/tmp/b011da28597b874b5b8e84e218de2efb/slopus-murmur-0.1.13.tgz","_integrity":"sha512-lDiw2K9yePIwGPF97lDJSNDHCmnlcYOZDChCmtpTcVyVVzKq/y3ySBZ5SpLtoTPSmrt9vj+elG3F2QW7pzUCrA==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur-core"},"_npmVersion":"11.16.0","description":"End-to-end encrypted messaging and MLS over dumb Murmur relays","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.1.13_1785812993058_0.5175068148144839","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@slopus/murmur","version":"0.3.1","keywords":["encrypted-events","end-to-end-encryption","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.3.1","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"759d8f4d9b09725a1dd4b6c16a1d1ea24831d090","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.3.1.tgz","fileCount":259,"integrity":"sha512-43IZJus1c2sBY2JKBGNs2bYAyaIxw5LcnvSXHnR2ZRqsVwfM9GYqXGuASFNZMRvsXyLjQGneIiuRPEsss8POlw==","signatures":[{"sig":"MEQCIBKi5r8e1xxwQEPvhijEg2Y8Vct1fCsrcQnE/7IAf6F4AiANoCbi2KndjSfBjZY5Vu0a+TNJc2t6g8HcskAT/ud9zQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1023852},"main":"./dist/index.js","type":"module","_from":"file:slopus-murmur-0.3.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run --maxWorkers=4 --testTimeout=60000","build":"pnpm run clean && tsc -p tsconfig.build.json","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","test:watch":"vitest","sync-readme":"node --input-type=module -e \"import { copyFileSync } from 'node:fs'; copyFileSync('../../README.md', 'README.md');\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/tmp/57ef76115b592353085d3cc816b0695c/slopus-murmur-0.3.1.tgz","_integrity":"sha512-43IZJus1c2sBY2JKBGNs2bYAyaIxw5LcnvSXHnR2ZRqsVwfM9GYqXGuASFNZMRvsXyLjQGneIiuRPEsss8POlw==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur"},"_npmVersion":"11.16.0","description":"Stateful MLS sessions over authenticated encrypted delivery queues","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3","@slopus/murmur-relay":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.3.1_1786213350299_0.7461365223635363","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@slopus/murmur","version":"0.3.2","keywords":["encrypted-events","end-to-end-encryption","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.3.2","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"7423d8061136ea8d2394d156f727272f86fb878e","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.3.2.tgz","fileCount":267,"integrity":"sha512-xGFn7Ho+y6JxzuJfGP22/+luMT5GnSGW5wG1/eq/YQ3E9RL0pRyP6C0a/FcVzYj3vOuMkYQ8spCEi0smeBbF8Q==","signatures":[{"sig":"MEUCICNwnNjiMbTwMtoJKmIZ7P8jSNhXfq7foXqVY+HaCg+ZAiEAimj8ejcbmha4UYC/IJyvQ2xz5lwwe9v2TFbNwImxPP0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1106201},"main":"./dist/index.js","type":"module","_from":"file:slopus-murmur-0.3.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run --maxWorkers=4 --testTimeout=60000","build":"pnpm run clean && tsc -p tsconfig.build.json","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","test:watch":"vitest","sync-readme":"node --input-type=module -e \"import { copyFileSync } from 'node:fs'; copyFileSync('../../README.md', 'README.md');\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/tmp/9b5b771e0bd154d9587b020668b20b9e/slopus-murmur-0.3.2.tgz","_integrity":"sha512-xGFn7Ho+y6JxzuJfGP22/+luMT5GnSGW5wG1/eq/YQ3E9RL0pRyP6C0a/FcVzYj3vOuMkYQ8spCEi0smeBbF8Q==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur"},"_npmVersion":"11.16.0","description":"Stateful MLS sessions over authenticated encrypted delivery queues","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3","@slopus/murmur-relay":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.3.2_1786221358584_0.7903253317963401","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@slopus/murmur","version":"0.3.3","keywords":["encrypted-events","end-to-end-encryption","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.3.3","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"2f9f7d128dfb1dbc6c4fac901444338829039855","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.3.3.tgz","fileCount":267,"integrity":"sha512-8qP0x9EFTX0cWDgpwS5r9Ej1P2+t+1Y9e1nJqmIYyHhLE9AjnaUQRNUAiUpP2yaN2NIja7mVsYtgB59p9tPHRw==","signatures":[{"sig":"MEQCIApizgxuhEw+XlsnXj8T00j93bFODU/7hKJvvubD/emhAiAM5eW3lFbPSKus5suJsg6Q8tYXaNtMm0qhY47kuULfhQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1106201},"main":"./dist/index.js","type":"module","_from":"file:slopus-murmur-0.3.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run --maxWorkers=4 --testTimeout=60000","build":"pnpm run clean && tsc -p tsconfig.build.json","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","test:watch":"vitest","sync-readme":"node --input-type=module -e \"import { copyFileSync } from 'node:fs'; copyFileSync('../../README.md', 'README.md');\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/tmp/ea3107838d533f6eacb93f4a58a696ad/slopus-murmur-0.3.3.tgz","_integrity":"sha512-8qP0x9EFTX0cWDgpwS5r9Ej1P2+t+1Y9e1nJqmIYyHhLE9AjnaUQRNUAiUpP2yaN2NIja7mVsYtgB59p9tPHRw==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur"},"_npmVersion":"11.16.0","description":"Stateful MLS sessions over authenticated encrypted delivery queues","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3","@slopus/murmur-relay":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.3.3_1786223710228_0.25324504164834516","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@slopus/murmur","version":"0.4.0","keywords":["encrypted-events","end-to-end-encryption","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.4.0","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"a7eaad2954389a3ff9b0f16afde3c42677b9d549","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.4.0.tgz","fileCount":303,"integrity":"sha512-pDrGzXfx0YEKdDH9rA9gtqUdcehHKZgOP+WSM4ESph4Pu8/A9DrZh1e1FavK/c5Oac5LMLdo3k7C2UFJ5XczuQ==","signatures":[{"sig":"MEUCIQCwzML4G6XBrwxXANYmiG+S9OYjPyChaPnvyCU70HETdgIgDiBfPQug/iGhbgz0xgB8t1UgiCxp9vS4ZLKo09HcSg0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1359382},"main":"./dist/index.js","type":"module","_from":"file:slopus-murmur-0.4.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"pnpm run test:unit && pnpm run test:integration","build":"pnpm run clean && tsc -p tsconfig.build.json","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","test:e2e":"vitest run --config vitest.e2e.config.ts --testTimeout=60000","test:unit":"vitest run --maxWorkers=1 --no-file-parallelism --testTimeout=120000 --exclude sources/contacts/tests/contactIntegration.test.ts","test:watch":"vitest","sync-readme":"node --input-type=module -e \"import { copyFileSync } from 'node:fs'; copyFileSync('../../README.md', 'README.md');\"","test:integration":"pnpm run test:contact-group && pnpm run test:contact-offline && pnpm run test:contact-removal && pnpm run test:contact-retry","test:contact-group":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'creates an N-person service group from contacts and exchanges messages' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-retry":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'retries a requested callback and explicitly rejects the pending session' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-offline":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'creates groups while a contact is offline, reuses fallback, and refills' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-removal":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'establishes mutual proof, restores offline, and removes the contact' --maxWorkers=1 --no-file-parallelism --testTimeout=120000"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/tmp/1719340482005e24c1f2db2ccffea6d7/slopus-murmur-0.4.0.tgz","_integrity":"sha512-pDrGzXfx0YEKdDH9rA9gtqUdcehHKZgOP+WSM4ESph4Pu8/A9DrZh1e1FavK/c5Oac5LMLdo3k7C2UFJ5XczuQ==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur"},"_npmVersion":"11.16.0","description":"Stateful MLS sessions over authenticated encrypted delivery queues","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3","@slopus/murmur-relay":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.4.0_1786245292392_0.9370150521142357","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@slopus/murmur","version":"0.4.1","keywords":["encrypted-events","end-to-end-encryption","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.4.1","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"aede192319d40b9dc4c100fb0df62960269e519b","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.4.1.tgz","fileCount":303,"integrity":"sha512-hBVbAcBN4baaUH8smxQ88QxIP9N0Ph75Aw2Fs5Um4sulFhF9Z6oOA2V9Nf6NpeYXIkF97CByQdwMeybKTwPBBw==","signatures":[{"sig":"MEYCIQD4Mb0VpZUnW4NHG7/UFFRDRnhv7bJH3ciqLykIznY2uwIhAIbzEJp2FgUzbgqGaEK/APdhscve1wqRVzeRS+hQvDpc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1366229},"main":"./dist/index.js","type":"module","_from":"file:slopus-murmur-0.4.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"pnpm run test:unit && pnpm run test:integration","build":"pnpm run clean && tsc -p tsconfig.build.json","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","test:e2e":"vitest run --config vitest.e2e.config.ts --testTimeout=60000","test:unit":"vitest run --maxWorkers=1 --no-file-parallelism --testTimeout=120000 --exclude sources/contacts/tests/contactIntegration.test.ts","test:watch":"vitest","sync-readme":"node --input-type=module -e \"import { copyFileSync } from 'node:fs'; copyFileSync('../../README.md', 'README.md');\"","test:integration":"pnpm run test:contact-outgoing && pnpm run test:contact-group && pnpm run test:contact-offline && pnpm run test:contact-removal && pnpm run test:contact-retry","test:contact-group":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'creates an N-person service group from contacts and exchanges messages' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-retry":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'retries a requested callback and explicitly rejects the pending session' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-offline":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'creates groups while a contact is offline, reuses fallback, and refills' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-removal":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'establishes mutual proof, restores offline, and removes the contact' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-outgoing":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'persists one outgoing request when the same invitation is submitted twice' --maxWorkers=1 --no-file-parallelism --testTimeout=120000"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/tmp/b2a5f44c930fe71a9fd810996151ebd5/slopus-murmur-0.4.1.tgz","_integrity":"sha512-hBVbAcBN4baaUH8smxQ88QxIP9N0Ph75Aw2Fs5Um4sulFhF9Z6oOA2V9Nf6NpeYXIkF97CByQdwMeybKTwPBBw==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur"},"_npmVersion":"11.16.0","description":"Stateful MLS sessions over authenticated encrypted delivery queues","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3","@slopus/murmur-relay":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.4.1_1786267544449_0.7682563536585503","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@slopus/murmur","version":"0.4.2","keywords":["encrypted-events","end-to-end-encryption","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.4.2","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"c7c865fe12b0543d4846a3dc70a80e62736dd69e","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.4.2.tgz","fileCount":303,"integrity":"sha512-5ipSC6gS4CGZajgJK1eGOyCxDl1aE8FmabNdGEnWWMdkC0YJUbg82umqlH8eSnuPaqv1T5qyVHjJCdBzYAEISg==","signatures":[{"sig":"MEUCIQDyEGOyU+WIX3+OwUIg5eYUc/O10OqL5UtkWb9HTJ/2UgIgUenKXQjK+Cgyvz21J9rBDL1EIdZQQH7gWBg/1kTEQa8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1387012},"main":"./dist/index.js","type":"module","_from":"file:slopus-murmur-0.4.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"pnpm run test:unit && pnpm run test:integration","build":"pnpm run clean && tsc -p tsconfig.build.json","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","test:e2e":"vitest run --config vitest.e2e.config.ts --testTimeout=60000","test:unit":"vitest run --maxWorkers=1 --no-file-parallelism --testTimeout=120000 --exclude sources/contacts/tests/contactIntegration.test.ts","test:watch":"vitest","sync-readme":"node --input-type=module -e \"import { copyFileSync } from 'node:fs'; copyFileSync('../../README.md', 'README.md');\"","test:integration":"pnpm run test:contact-outgoing && pnpm run test:contact-handshake-offline && pnpm run test:contact-group && pnpm run test:contact-offline && pnpm run test:contact-removal && pnpm run test:contact-retry","test:contact-group":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'creates an N-person service group from contacts and exchanges messages' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-retry":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'retries a requested callback and explicitly rejects the pending session' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-offline":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'creates groups while a contact is offline, reuses fallback, and refills' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-removal":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'establishes mutual proof, restores offline, and removes the contact' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-outgoing":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'persists one outgoing request when the same invitation is submitted twice' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-handshake-offline":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'queues the contact hello offline and relays the full handshake after restart' --maxWorkers=1 --no-file-parallelism --testTimeout=120000"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/tmp/8ef2da1af6dcde847160e730b8742178/slopus-murmur-0.4.2.tgz","_integrity":"sha512-5ipSC6gS4CGZajgJK1eGOyCxDl1aE8FmabNdGEnWWMdkC0YJUbg82umqlH8eSnuPaqv1T5qyVHjJCdBzYAEISg==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur"},"_npmVersion":"11.16.0","description":"Stateful MLS sessions over authenticated encrypted delivery queues","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3","@slopus/murmur-relay":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.4.2_1786302197500_0.40107800785116243","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"@slopus/murmur","version":"0.4.4","keywords":["encrypted-events","end-to-end-encryption","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.4.4","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"ff22e1240ca22fc372ecfe7c3833ff0f98690adf","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.4.4.tgz","fileCount":303,"integrity":"sha512-/sx4LzNW3C49CFsJk3ljbiUw6KRy8xDZN+3Q7xOBh0vaOlcALy22ua3CYMMcvUpW6qzx4skDZOYAQEJD/fdx1Q==","signatures":[{"sig":"MEUCIATSavAqdTR7IDyraeAY5IodGnxmo0payUai7ClakEvmAiEA5GuGoWaISX9i/v+5w/vYkNw9/3oRjWdaDEDrYCDoBZE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.4.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1387011},"main":"./dist/index.js","type":"module","_from":"file:slopus-murmur-0.4.4.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"pnpm run test:unit && pnpm run test:integration","build":"pnpm run clean && tsc -p tsconfig.build.json","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","test:e2e":"vitest run --config vitest.e2e.config.ts --testTimeout=60000","test:unit":"vitest run --maxWorkers=1 --no-file-parallelism --testTimeout=120000 --exclude sources/contacts/tests/contactIntegration.test.ts","test:watch":"vitest","sync-readme":"node --input-type=module -e \"import { copyFileSync } from 'node:fs'; copyFileSync('../../README.md', 'README.md');\"","test:integration":"pnpm run test:contact-outgoing && pnpm run test:contact-handshake-offline && pnpm run test:contact-group && pnpm run test:contact-offline && pnpm run test:contact-removal && pnpm run test:contact-retry","test:contact-group":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'creates an N-person service group from contacts and exchanges messages' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-retry":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'retries a requested callback and explicitly rejects the pending session' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-offline":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'creates groups while a contact is offline, reuses fallback, and refills' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-removal":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'establishes mutual proof, restores offline, and removes the contact' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-outgoing":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'persists one outgoing request when the same invitation is submitted twice' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-handshake-offline":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'queues the contact hello offline and relays the full handshake after restart' --maxWorkers=1 --no-file-parallelism --testTimeout=120000"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/tmp/1bdc19f53becaa0665b1ddc30da3d168/slopus-murmur-0.4.4.tgz","_integrity":"sha512-/sx4LzNW3C49CFsJk3ljbiUw6KRy8xDZN+3Q7xOBh0vaOlcALy22ua3CYMMcvUpW6qzx4skDZOYAQEJD/fdx1Q==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur"},"_npmVersion":"11.16.0","description":"Stateful MLS sessions over authenticated encrypted delivery queues","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3","@slopus/murmur-relay":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.4.4_1786423177944_0.6377061032698039","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@slopus/murmur","version":"0.4.5","keywords":["encrypted-events","end-to-end-encryption","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.4.5","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"17ff3b04625e4bcc2984fddf5a627e15f2e747b3","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.4.5.tgz","fileCount":319,"integrity":"sha512-ZJhGS6gKRbSbBoAKzLgKDVji8oswtYALMBCOwk2g1INASALVHjmQTak4KylsVREeO86M3F+WxLZrEZKd3d0pMg==","signatures":[{"sig":"MEYCIQCglVHxd3ihg5mRfRPy17ZmJ1mDGhCzPV23aMEZl3i2nwIhAItqHoGUJzH5qCpi8y+f9wJaVpYTwR7bTkOYAm9PSf/m","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.4.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1531693},"main":"./dist/index.js","type":"module","_from":"file:slopus-murmur-0.4.5.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"pnpm run test:unit && pnpm run test:integration","build":"pnpm run clean && tsc -p tsconfig.build.json","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","test:e2e":"vitest run --config vitest.e2e.config.ts --testTimeout=60000","test:unit":"vitest run --maxWorkers=1 --no-file-parallelism --testTimeout=120000 --exclude sources/contacts/tests/contactIntegration.test.ts","test:watch":"vitest","sync-readme":"node --input-type=module -e \"import { copyFileSync } from 'node:fs'; copyFileSync('../../README.md', 'README.md');\"","test:integration":"pnpm run test:contact-outgoing && pnpm run test:contact-handshake-offline && pnpm run test:contact-profile && pnpm run test:contact-group && pnpm run test:contact-offline && pnpm run test:contact-removal && pnpm run test:contact-retry","test:contact-group":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'creates an N-person service group from contacts and exchanges messages' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-retry":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'retries a requested callback and explicitly rejects the pending session' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-offline":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'creates groups while a contact is offline, reuses fallback, and refills' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-profile":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'refreshes contact profiles online and after restart without targeting removal' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-removal":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'establishes mutual proof, restores offline, and removes the contact' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-outgoing":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'persists one outgoing request when the same invitation is submitted twice' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-handshake-offline":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'queues the contact hello offline and relays the full handshake after restart' --maxWorkers=1 --no-file-parallelism --testTimeout=120000"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/tmp/7f31ab54da3d7908d5b9f5618b46fc54/slopus-murmur-0.4.5.tgz","_integrity":"sha512-ZJhGS6gKRbSbBoAKzLgKDVji8oswtYALMBCOwk2g1INASALVHjmQTak4KylsVREeO86M3F+WxLZrEZKd3d0pMg==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur"},"_npmVersion":"11.17.0","description":"Stateful MLS sessions over authenticated encrypted delivery queues","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3","@slopus/murmur-relay":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.4.5_1787559674473_0.04856755375617827","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@slopus/murmur","version":"0.5.0","keywords":["encrypted-events","end-to-end-encryption","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.5.0","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"55784a4acd026351b2ab7076d91b0f86cfe608cc","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.5.0.tgz","fileCount":463,"integrity":"sha512-u6PCs2m7i2JLNKnf8R9Wx4uONiCT2ADj5Br26FUXIO7YH5Q/IhoBhR7PT3dqgz3v0T+i9tF6ucGMB3t3AnU3gg==","signatures":[{"sig":"MEUCIQDh10zsMZSIrkRrMyzcQNhIur8SS+6zrfWd8laOv03VrQIgay5onPXlS7IuQ6fjYMTQawdwAL+yNjVvW0RzXZPbnTE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2382718},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/_temp/slopus-murmur-0.5.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"pnpm run test:unit","build":"pnpm run clean && tsc -p tsconfig.build.json","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","prepack":"pnpm run sync-readme && pnpm run check && pnpm run build","test:e2e":"vitest run --config vitest.e2e.config.ts --testTimeout=60000","test:unit":"vitest run --maxWorkers=1 --no-file-parallelism --testTimeout=120000 --exclude sources/contacts/tests/contactIntegration.test.ts --exclude sources/accounts/tests/multideviceIntegration.test.ts","test:chaos":"vitest run --config vitest.chaos.config.ts --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:watch":"vitest","sync-readme":"node --input-type=module -e \"import { copyFileSync } from 'node:fs'; copyFileSync('../../README.md', 'README.md');\"","test:e2e:staging":"vitest run --config vitest.e2e.config.ts tests/stagingRelay.e2e.ts --testTimeout=60000","test:integration":"pnpm run test:contact-outgoing && pnpm run test:contact-handshake-offline && pnpm run test:contact-profile && pnpm run test:contact-group && pnpm run test:contact-offline && pnpm run test:contact-removal && pnpm run test:contact-retry && pnpm run test:multidevice","test:multidevice":"vitest run sources/accounts/tests/multideviceIntegration.test.ts --maxWorkers=1 --no-file-parallelism --testTimeout=180000","test:contact-group":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'creates an N-person service group from contacts and exchanges messages' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-retry":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'retries a requested callback and explicitly rejects the pending session' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-offline":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'creates groups while a contact is offline, reuses fallback, and refills' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-profile":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'refreshes contact profiles online and after restart without targeting removal' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-removal":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'establishes mutual proof, restores offline, and removes the contact' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-outgoing":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'persists one outgoing request when the same invitation is submitted twice' --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:contact-handshake-offline":"vitest run sources/contacts/tests/contactIntegration.test.ts -t 'queues the contact hello offline and relays the full handshake after restart' --maxWorkers=1 --no-file-parallelism --testTimeout=120000"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/home/runner/work/_temp/slopus-murmur-0.5.0.tgz","_integrity":"sha512-u6PCs2m7i2JLNKnf8R9Wx4uONiCT2ADj5Br26FUXIO7YH5Q/IhoBhR7PT3dqgz3v0T+i9tF6ucGMB3t3AnU3gg==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur"},"_npmVersion":"11.19.0","description":"Stateful MLS sessions over authenticated encrypted delivery queues","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3","@slopus/murmur-relay":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.5.0_1787729311363_0.16838446205974766","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@slopus/murmur","version":"0.6.0","keywords":["encrypted-events","end-to-end-encryption","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.6.0","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"7a174d45397a2d8b3446213679a3867481ad82d9","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.6.0.tgz","fileCount":343,"integrity":"sha512-AS/gu3MO8UAejpIiGIJNhuwl9czLXo064OeVh63aQPGP517TzsgI62EXBpGqBGv7dCldQB+dPi48ZYQH8OCK7g==","signatures":[{"sig":"MEUCIQDt5HBrlwWhbx5mZg8xUQU+wBzm+W/A8Yi/57np7JRmVwIgGBS2XHy/W7O2fk6QF2IiGD+A8E8d3lAOg+/fygXEi1c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1804443},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/_temp/slopus-murmur-0.6.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"pnpm run test:unit","build":"pnpm run clean && tsc -p tsconfig.build.json","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","prepack":"pnpm run sync-readme && pnpm run check && pnpm run build","test:e2e":"vitest run --config vitest.e2e.config.ts --testTimeout=60000","test:unit":"vitest run --maxWorkers=1 --no-file-parallelism --testTimeout=120000 --exclude sources/accounts/tests/multideviceIntegration.test.ts","test:chaos":"vitest run --config vitest.chaos.config.ts --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:watch":"vitest","sync-readme":"node --input-type=module -e \"import { copyFileSync } from 'node:fs'; copyFileSync('../../README.md', 'README.md');\"","test:e2e:staging":"vitest run --config vitest.e2e.config.ts tests/stagingRelay.e2e.ts --testTimeout=60000","test:integration":"pnpm run test:multidevice","test:multidevice":"vitest run sources/accounts/tests/multideviceIntegration.test.ts --maxWorkers=1 --no-file-parallelism --testTimeout=180000"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/home/runner/work/_temp/slopus-murmur-0.6.0.tgz","_integrity":"sha512-AS/gu3MO8UAejpIiGIJNhuwl9czLXo064OeVh63aQPGP517TzsgI62EXBpGqBGv7dCldQB+dPi48ZYQH8OCK7g==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur"},"_npmVersion":"11.19.0","description":"Stateful MLS sessions over authenticated encrypted delivery queues","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3","@slopus/murmur-relay":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.6.0_1787778763389_0.7779578538322882","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@slopus/murmur","version":"0.7.0","keywords":["encrypted-events","end-to-end-encryption","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.7.0","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"6569d0cc0ca2f7ec10d6cc6f274c8758a00e5f8e","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.7.0.tgz","fileCount":343,"integrity":"sha512-PUGi96ly8zvpRMEoeBNjmLMi9GYwOTjnsTzfC/QkVApMFOfyz0L/17LPcgkfW7BbVx11ebDCfFYjGdI3PF4aKg==","signatures":[{"sig":"MEYCIQC5i/788fUDbgnbRMwWuylww7OR/pABga1DwfseDPkjrAIhAOJVdepWA/hJfXChqfegFfpVeEtCwnFZR4vI7v9QotZA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1812510},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/_temp/slopus-murmur-0.7.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"pnpm run test:unit","build":"pnpm run clean && tsc -p tsconfig.build.json","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","prepack":"pnpm run sync-readme && pnpm run check && pnpm run build","test:e2e":"vitest run --config vitest.e2e.config.ts --testTimeout=60000","test:unit":"vitest run --maxWorkers=1 --no-file-parallelism --testTimeout=120000 --exclude sources/accounts/tests/multideviceIntegration.test.ts","test:chaos":"vitest run --config vitest.chaos.config.ts --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:watch":"vitest","sync-readme":"node --input-type=module -e \"import { copyFileSync } from 'node:fs'; copyFileSync('../../README.md', 'README.md');\"","test:e2e:staging":"vitest run --config vitest.e2e.config.ts tests/stagingRelay.e2e.ts --testTimeout=60000","test:integration":"pnpm run test:multidevice","test:multidevice":"vitest run sources/accounts/tests/multideviceIntegration.test.ts --maxWorkers=1 --no-file-parallelism --testTimeout=180000"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/home/runner/work/_temp/slopus-murmur-0.7.0.tgz","_integrity":"sha512-PUGi96ly8zvpRMEoeBNjmLMi9GYwOTjnsTzfC/QkVApMFOfyz0L/17LPcgkfW7BbVx11ebDCfFYjGdI3PF4aKg==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur"},"_npmVersion":"11.19.1","description":"Stateful MLS sessions over authenticated encrypted delivery queues","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3","@slopus/murmur-relay":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.7.0_1787782589088_0.019681231471156524","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@slopus/murmur","version":"0.7.1","keywords":["encrypted-events","end-to-end-encryption","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.7.1","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"9ef53fa15139b31b14855b6494cae20f3fc607ec","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.7.1.tgz","fileCount":343,"integrity":"sha512-b6hspqYFVGXdfAJ7R5lvKKFzmL3kwciIinp3HVVNrYc6KacZI0RKkPGSK9Qos7pszuWCCJSDgJmADOEXxNFjKw==","signatures":[{"sig":"MEYCIQDcWnyeRk8QyiJmuiSfq4KUmKGa3VwnrjwoW5SbU/hk2QIhAKQp6UJR9k+LlzwFlUKORV4W/uhKyfDx9HfDd5LOEcbj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1812677},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/_temp/slopus-murmur-0.7.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"pnpm run test:unit","build":"pnpm run clean && tsc -p tsconfig.build.json","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","prepack":"pnpm run sync-readme && pnpm run check && pnpm run build","test:e2e":"vitest run --config vitest.e2e.config.ts --testTimeout=60000","test:unit":"vitest run --maxWorkers=1 --no-file-parallelism --testTimeout=120000 --exclude sources/accounts/tests/multideviceIntegration.test.ts","test:chaos":"vitest run --config vitest.chaos.config.ts --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:watch":"vitest","sync-readme":"node --input-type=module -e \"import { copyFileSync } from 'node:fs'; copyFileSync('../../README.md', 'README.md');\"","test:e2e:staging":"vitest run --config vitest.e2e.config.ts tests/stagingRelay.e2e.ts --testTimeout=60000","test:integration":"pnpm run test:multidevice","test:multidevice":"vitest run sources/accounts/tests/multideviceIntegration.test.ts --maxWorkers=1 --no-file-parallelism --testTimeout=180000","test:e2e:workos-staging":"vitest run --config vitest.e2e.config.ts tests/stagingWorkOS.e2e.ts --testTimeout=180000"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/home/runner/work/_temp/slopus-murmur-0.7.1.tgz","_integrity":"sha512-b6hspqYFVGXdfAJ7R5lvKKFzmL3kwciIinp3HVVNrYc6KacZI0RKkPGSK9Qos7pszuWCCJSDgJmADOEXxNFjKw==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur"},"_npmVersion":"11.19.1","description":"Stateful MLS sessions over authenticated encrypted delivery queues","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3","@workos-inc/node":"^10.10.0","@slopus/murmur-relay":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.7.1_1787853680868_0.904642264461456","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"@slopus/murmur","version":"0.7.2","keywords":["encrypted-events","end-to-end-encryption","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.7.2","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"71bab04c2687e128ade7d46c657153d507854bef","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.7.2.tgz","fileCount":343,"integrity":"sha512-7NU01t+Nlp5XZn4wcMDQXafgfUCTTq5xwilWCHNhl4bfERqonDG9fgvp1xGAVl8J7PdYB3WhInBlL4xjznPIPw==","signatures":[{"sig":"MEUCIQCEO1QMPs/euovhUq9EXV2fiuwe2aGdLCs+em1LD1C7zAIgJ7865xoATrU8bxqG8O0IkyV7tW9DIdt46cs1Mzv8cf4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.7.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1833718},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/_temp/slopus-murmur-0.7.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"pnpm run test:unit","build":"pnpm run clean && tsc -p tsconfig.build.json","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","prepack":"pnpm run sync-readme && pnpm run check && pnpm run build","test:e2e":"vitest run --config vitest.e2e.config.ts --testTimeout=60000","test:unit":"vitest run --maxWorkers=1 --no-file-parallelism --testTimeout=120000 --exclude sources/accounts/tests/multideviceIntegration.test.ts","test:chaos":"vitest run --config vitest.chaos.config.ts --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:watch":"vitest","sync-readme":"node --input-type=module -e \"import { copyFileSync } from 'node:fs'; copyFileSync('../../README.md', 'README.md');\"","test:e2e:staging":"vitest run --config vitest.e2e.config.ts tests/stagingRelay.e2e.ts --testTimeout=60000","test:integration":"pnpm run test:multidevice","test:multidevice":"vitest run sources/accounts/tests/multideviceIntegration.test.ts --maxWorkers=1 --no-file-parallelism --testTimeout=180000","test:e2e:workos-staging":"vitest run --config vitest.e2e.config.ts tests/stagingWorkOS.e2e.ts --testTimeout=180000"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/home/runner/work/_temp/slopus-murmur-0.7.2.tgz","_integrity":"sha512-7NU01t+Nlp5XZn4wcMDQXafgfUCTTq5xwilWCHNhl4bfERqonDG9fgvp1xGAVl8J7PdYB3WhInBlL4xjznPIPw==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur"},"_npmVersion":"11.19.1","description":"Stateful MLS sessions over authenticated encrypted delivery queues","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3","@workos-inc/node":"^10.10.0","@slopus/murmur-relay":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.7.2_1787864588322_0.49611533667314855","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@slopus/murmur","version":"0.8.1","keywords":["encrypted-events","end-to-end-encryption","mls","relay","typescript"],"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","_id":"@slopus/murmur@0.8.1","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"dist":{"shasum":"a9d067acf4d5f7c5869f789f467d6848c800ab02","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.8.1.tgz","fileCount":343,"integrity":"sha512-I0CNaFipk05/0ITu4OVYkj7s3TtovRGDGB8SxTw1wX0QhfHpO/kbXhiiR4OhI0cxnQiTkLJdGjd+ZvJYG+lYTw==","signatures":[{"sig":"MEUCIDjfwVh0Lrmd/LAliM+rtPLgVca/dWlrToq/s5/VexAuAiEAxGQyGyAJrCTXsj+GY8cN9mpXGKvkHrWx3k5XwxkSCkk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1863614},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/_temp/slopus-murmur-0.8.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"pnpm run test:unit","build":"pnpm run clean && tsc -p tsconfig.build.json","check":"tsc --noEmit -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","prepack":"pnpm run sync-readme && pnpm run check && pnpm run build","test:e2e":"vitest run --config vitest.e2e.config.ts --testTimeout=60000","test:unit":"vitest run --maxWorkers=1 --no-file-parallelism --testTimeout=120000 --exclude sources/accounts/tests/multideviceIntegration.test.ts","test:chaos":"vitest run --config vitest.chaos.config.ts --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:watch":"vitest","sync-readme":"node --input-type=module -e \"import { copyFileSync } from 'node:fs'; copyFileSync('../../README.md', 'README.md');\"","test:e2e:staging":"vitest run --config vitest.e2e.config.ts tests/stagingRelay.e2e.ts --testTimeout=60000","test:integration":"pnpm run test:multidevice","test:multidevice":"vitest run sources/accounts/tests/multideviceIntegration.test.ts --maxWorkers=1 --no-file-parallelism --testTimeout=180000","test:e2e:workos-staging":"vitest run --config vitest.e2e.config.ts tests/stagingWorkOS.e2e.ts --testTimeout=180000"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"_resolved":"/home/runner/work/_temp/slopus-murmur-0.8.1.tgz","_integrity":"sha512-I0CNaFipk05/0ITu4OVYkj7s3TtovRGDGB8SxTw1wX0QhfHpO/kbXhiiR4OhI0cxnQiTkLJdGjd+ZvJYG+lYTw==","repository":{"url":"git+https://github.com/slopus/murmur.git","type":"git","directory":"packages/murmur"},"_npmVersion":"11.19.1","description":"Stateful MLS sessions over authenticated encrypted delivery queues","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1","@steve.kite/stdlib":"0.0.12"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.7","esbuild":"^0.28.1","typescript":"^5.9.3","@workos-inc/node":"^10.10.0","@slopus/murmur-relay":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/murmur_0.8.1_1787878550024_0.016558683633455917","host":"s3://npm-registry-packages-npm-production"}},"0.8.2":{"name":"@slopus/murmur","version":"0.8.2","description":"Stateful MLS sessions over authenticated encrypted delivery queues","keywords":["encrypted-events","end-to-end-encryption","mls","relay","typescript"],"homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur#readme","bugs":{"url":"https://github.com/slopus/murmur/issues"},"license":"MIT","author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"repository":{"type":"git","url":"git+https://github.com/slopus/murmur.git","directory":"packages/murmur"},"type":"module","sideEffects":false,"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"scripts":{"clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"","build":"pnpm run clean && tsc -p tsconfig.build.json","check":"tsc --noEmit -p tsconfig.json","test":"pnpm run test:unit","test:chaos":"vitest run --config vitest.chaos.config.ts --maxWorkers=1 --no-file-parallelism --testTimeout=120000","test:e2e":"vitest run --config vitest.e2e.config.ts --testTimeout=60000","test:e2e:staging":"vitest run --config vitest.e2e.config.ts tests/stagingRelay.e2e.ts --testTimeout=60000","test:e2e:workos-staging":"vitest run --config vitest.e2e.config.ts tests/stagingWorkOS.e2e.ts --testTimeout=180000","test:integration":"pnpm run test:multidevice","test:multidevice":"vitest run sources/accounts/tests/multideviceIntegration.test.ts --maxWorkers=1 --no-file-parallelism --testTimeout=180000","test:unit":"vitest run --maxWorkers=1 --no-file-parallelism --testTimeout=120000 --exclude sources/accounts/tests/multideviceIntegration.test.ts","test:watch":"vitest","sync-readme":"node --input-type=module -e \"import { copyFileSync } from 'node:fs'; copyFileSync('../../README.md', 'README.md');\"","prepack":"pnpm run sync-readme && pnpm run check && pnpm run build"},"dependencies":{"@noble/ciphers":"^1.2.1","@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@steve.kite/stdlib":"0.0.12"},"devDependencies":{"@slopus/murmur-relay":"workspace:*","@workos-inc/node":"^10.10.0","esbuild":"^0.28.1","typescript":"^5.9.3","vitest":"^3.2.7"},"engines":{"node":">=20"},"_id":"@slopus/murmur@0.8.2","_integrity":"sha512-g+hEuVoNuj0ymZVmAwheHYCeWz5Ci6rcL9aOjsK0XCnzZkc3vKTZDQERn8AqaKwgqZmOLimmrslPbvgjVP0Xxw==","_resolved":"/home/runner/work/_temp/slopus-murmur-0.8.2.tgz","_from":"file:/home/runner/work/_temp/slopus-murmur-0.8.2.tgz","_nodeVersion":"24.19.0","_npmVersion":"11.19.1","dist":{"integrity":"sha512-g+hEuVoNuj0ymZVmAwheHYCeWz5Ci6rcL9aOjsK0XCnzZkc3vKTZDQERn8AqaKwgqZmOLimmrslPbvgjVP0Xxw==","shasum":"3741a3296d72e5bf2b2815f6b2ea6ad6d9e76eee","tarball":"https://registry.npmjs.org/@slopus/murmur/-/murmur-0.8.2.tgz","fileCount":343,"unpackedSize":1935066,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@slopus%2fmurmur@0.8.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAs4pqAkEXoCOqiZsKX3jSAPORNS6cewHdxyiOAZuoaoAiEA2tsStmY4FYbPeHtwLp7Z2eTNjc11oiG+bxCXQpyFMiI="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a204d85-c404-466c-bd4c-f872a3ad4eb1"}},"directories":{},"maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/murmur_0.8.2_1787904809741_0.14006119201305167"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-31T00:21:30.791Z","modified":"2026-08-28T08:13:30.293Z","0.1.0":"2026-07-31T00:21:31.171Z","0.1.9":"2026-08-03T01:04:13.537Z","0.1.11":"2026-08-03T17:14:00.915Z","0.1.12":"2026-08-03T23:09:47.268Z","0.1.13":"2026-08-04T03:09:53.240Z","0.3.1":"2026-08-08T18:22:30.456Z","0.3.2":"2026-08-08T20:35:58.735Z","0.3.3":"2026-08-08T21:15:10.383Z","0.4.0":"2026-08-09T03:14:52.619Z","0.4.1":"2026-08-09T09:25:44.605Z","0.4.2":"2026-08-09T19:03:17.703Z","0.4.4":"2026-08-11T04:39:38.134Z","0.4.5":"2026-08-24T08:21:14.621Z","0.5.0":"2026-08-26T07:28:31.526Z","0.6.0":"2026-08-26T21:12:43.602Z","0.7.0":"2026-08-26T22:16:29.266Z","0.7.1":"2026-08-27T18:01:21.017Z","0.7.2":"2026-08-27T21:03:08.481Z","0.8.1":"2026-08-28T00:55:50.182Z","0.8.2":"2026-08-28T08:13:29.935Z"},"bugs":{"url":"https://github.com/slopus/murmur/issues"},"author":{"name":"Steve Korshakov","email":"steve@korshakov.com"},"license":"MIT","homepage":"https://github.com/slopus/murmur/tree/main/packages/murmur#readme","keywords":["encrypted-events","end-to-end-encryption","mls","relay","typescript"],"repository":{"type":"git","url":"git+https://github.com/slopus/murmur.git","directory":"packages/murmur"},"description":"Stateful MLS sessions over authenticated encrypted delivery queues","maintainers":[{"name":"steve.kite","email":"steve@korshakov.com"}],"readme":"# Murmur\n\nMurmur is a browser-safe TypeScript library for stateful, forward-secret MLS\nsessions over authenticated encrypted identity queues. The application owns\nstorage and effects. The relay stores opaque pending deliveries and can be\ndiscarded without becoming session state or history.\n\n`@slopus/murmur` is the only published package. `@slopus/murmur-relay` is\nprivate deployment infrastructure.\n\n## Model\n\n- One stable Ed25519 account identity is restored across devices. Each local\n  store independently owns a device key used for its relay inbox and MLS leaf.\n- Two-person and many-person conversations use the same RFC 9420-style MLS\n  session machinery.\n- Every membership or role change is an authenticated Commit.\n- Application sends persist the post-ratchet epoch and exact outbox before\n  publication.\n- Incoming bootstraps remain pending until the application activates or ignores\n  them. Protocol traffic continues and application updates remain buffered\n  while pending.\n- The relay exposes one ordered encrypted inbox per device, addressed by its\n  canonical public key. Session sends name only the session; the relay derives\n  the complete device fanout from its own membership and roster state.\n  Delivery acknowledgement is signed and separate from processing.\n\n## Install\n\n```bash\npnpm add @slopus/murmur @steve.kite/stdlib\n```\n\nMurmur is ESM-only and requires a `MurmurStore`. `MemoryMurmurStore` is useful\nfor tests; production applications should provide durable secure storage.\n\n## Account secret\n\nApplications can protect one identity root with a 256-bit generated string and\na user password. Murmur returns one opaque blob for application-owned storage;\nit stores no password, generated secret, or recovery copy itself:\n\n```ts\nimport {\n    createAccountSecret,\n    destroyIdentity,\n    generateIdentityKeyPair,\n    rewrapAccountSecret,\n    unlockAccountSecret,\n} from \"@slopus/murmur\";\n\nconst identity = generateIdentityKeyPair();\nconst accountSecret = await createAccountSecret(identity, password);\n\nsaveBlob(accountSecret.blob);\nshowGeneratedSecretOnce(accountSecret.generatedSecret);\n\nconst restored = await unlockAccountSecret(\n    accountSecret.blob,\n    accountSecret.generatedSecret,\n    password,\n);\n\nconst changedBlob = await rewrapAccountSecret(\n    accountSecret.blob,\n    accountSecret.generatedSecret,\n    password,\n    newPassword,\n);\n\ndestroyIdentity(restored);\n```\n\nUnlocking requires both inputs. Password changes authenticate and preserve the\ncomplete encrypted root payload while rotating its salt and nonce. There is no\nserver involvement or reset path; losing either input is final.\n\n## Directory session example\n\nThe application obtains a claim ticket from its authentication server and\nnames the exact account identity it already knows. The resulting account claim\nis accepted directly by both session creation and member addition:\n\n```ts\nimport { createRootContext } from \"@steve.kite/stdlib\";\nimport { MemoryMurmurStore, MurmurClient } from \"@slopus/murmur\";\n\nconst ctx = createRootContext().named(\"chat\");\nconst encode = (value: string): Uint8Array => new TextEncoder().encode(value);\n\nconst alice = await MurmurClient.open(ctx, {\n    relay: \"https://relay.example\",\n    store: new MemoryMurmurStore(),\n});\nconst bob = await MurmurClient.open(ctx, {\n    relay: \"https://relay.example\",\n    store: new MemoryMurmurStore(),\n});\n\nconst bobAdmission = await alice.claimAccount(ctx, bob.identity, ticket);\nconst session = await alice.createSession(ctx, {\n    descriptor: encode('{\"protocol\":\"chat\",\"version\":1}'),\n    members: [bobAdmission],\n    sendPolicy: \"admins\",\n});\n\nawait alice.synchronize(ctx, { waitMilliseconds: 0 });\nawait bob.synchronize(ctx, { waitMilliseconds: 0 });\nawait bob.activateSession(ctx, session.id);\n\nawait alice.send(ctx, session.id, encode(\"hello\"));\nawait alice.synchronize(ctx, { waitMilliseconds: 0 });\nawait bob.synchronize(\n    ctx,\n    { waitMilliseconds: 0 },\n    {\n        onUpdates: async (_ctx, updates) => {\n            for (const update of updates) {\n                console.log(update.id, update.bytes);\n            }\n        },\n    },\n);\n\nconst carolAdmission = await alice.claimAccount(ctx, carolIdentity, anotherTicket);\nawait alice.addMember(ctx, session.id, carolAdmission);\n```\n\nOpening an HTTP-backed client automatically publishes a small one-use\nKeyPackage pool and one multi-use last-resort package per device. Claims prefer\none-use packages. Their ordinary inbox spent notices trigger automatic\nreplenishment. `rotate()` replaces every unclaimed one-use package and the\nlast-resort package:\n\n```ts\nawait bob.rotate(ctx);\n```\n\nFor application-routed admission, `createKeyPackage()` remains available and\nreturns bare `{ identity, keyPackage }` material. `createSession()` and\n`addMember()` accept that form too; each bare KeyPackage is one-use.\n\n## Durable synchronization\n\n`synchronize()` performs one bounded cycle. `sync()` keeps a persistent\nreconnecting loop active:\n\n```ts\nconst controller = new AbortController();\n\nawait murmur.sync(ctx, {\n    abort: controller.signal,\n    onConnected: (_ctx) => console.log(\"connected\"),\n    onDisconnected: (_ctx, error) => console.log(\"disconnected\", error),\n    onUpdates: async (_ctx, updates) => applyAtomically(updates),\n    onSessionsChanged: async (_ctx, sessions) => applySessionSnapshotsAtomically(sessions),\n    onIssues: async (_ctx, issues) => recordSessionIssues(issues),\n    onDeviceAdded: async (_ctx, events) => recordAddedDevices(events),\n    onDeviceRevoked: async (_ctx, events) => recordRevokedDevices(events),\n    onDeviceDormant: async (_ctx, events) => reviewDormantDevices(events),\n    onReset: async (_ctx, reset) => preserveApplicationMetadata(reset),\n});\n```\n\nMurmur drains an application-update batch only after `onUpdates` resolves.\nThrowing leaves the same durable batch available for retry. Stable relay event\nIDs support application-level idempotency.\n\n`onSessionsChanged` receives complete confirmed snapshots of service-owned\nsessions after activation and every adopted membership, device, role, or policy\nCommit. Each snapshot includes the stable relay event ID, registered service ID,\nstatus, descriptor, members, owner, admins, and policies. A device removed from a\nsession receives one final `removed` snapshot before Murmur destroys that local\nsession. Throwing retries the same event across restarts. Omitting the optional\nhook drains these snapshots without retaining unused lifecycle history.\n\nMurmur durably indexes every route decision, application update, and confirmed\nservice lifecycle snapshot by its authenticated relay event ID. The identity-wide\nqueue is drained strictly from its global head: one route decision, one lifecycle\nsnapshot, or one contiguous application-update segment at a time. A failed\ncallback or unresolved route blocks every later relay-derived effect, including\neffects for other sessions. Pending updates and every pending-session snapshot\nare indexed immediately; after a route claim commits, the bootstrap-time\nsnapshot is delivered before later pending updates and Commit snapshots.\n\nSnapshots never coalesce. Active records reuse the ordinary session descriptor\ninstead of copying it into every Commit record, and each callback retry receives\nthe same immutable relay ID and content. The identity-wide effect queue has a\nhard 1,000-record limit. An effect-producing inbox delivery that would exceed it\nis transactionally deferred without advancing replay, cursor, continuity, or\nacknowledgement state; synchronization drains durable effects and retries that\nexact relay event. Corruption recovery removes and reports only malformed effect\nrecords or indexes without reordering healthy effects. When a Commit removes the\nlocal account, earlier updates and lifecycle snapshots retain the descriptor and\nservice owner, drain before the final `removed` snapshot, and only then release\ntheir retained delivery state. Local owner deletion remains terminal and purges\nthat session's pending callbacks.\n`onIssues` exposes Murmur's existing bounded durable issue set when it changes;\nmalformed issue records are dropped rather than wedging synchronization.\nApplications use stable operation IDs on valid issues for idempotent\nterminal-failure handling.\n\n## Sessions\n\nThe application owns opaque descriptors and update bytes. Murmur exposes:\n\n- `createSession`, `session`, and bounded `sessions` listing;\n- `claimAccount` and explicit directory `rotate`;\n- `activateSession`, `ignoreSession`, and `abandonSession`;\n- `send`, `addMember`, `removeMember`, `leaveSession`, and owner-only\n  `deleteSession`;\n- terminal `deleteAccount`;\n- `grantAdmin`, `revokeAdmin`, and `setPolicies`;\n- optional typed services registered under stable IDs.\n\nService IDs are lowercase identifiers of up to 64 characters. Dots and hyphens\nmay separate non-empty alphanumeric segments, for example `notes.v1` or\n`crdt.loro`.\n\nThe immutable session owner is always an admin. Policy controls whether admins\nmay assign admins, whether every member may add another member, and whether\neveryone or only admins may send application events. Only the owner may change\npolicy or terminally delete the session. A committer adopts its own Commit only\nafter the authenticated queue echo arrives.\n\n## Multiple devices\n\nRestoring the same account identity on another store creates a fresh device key\nand self-registers it with the relay-owned current roster:\n\n```ts\nconst secondDevice = await MurmurClient.open(ctx, {\n    identity: restoredAccount,\n    relay,\n    store: secondStore,\n    encryptDeviceMetadata: (_ctx, deviceKey) => encryptLocalDeviceMetadata(deviceKey),\n});\nawait secondDevice.synchronize(ctx, { waitMilliseconds: 0 });\n```\n\nRegistration and removal are account-identity-signed relay mutations. Their\nordinary inbox notifications drive MLS convergence. Any restored device may\nremove itself or another device with `removeDevice(ctx, deviceKey)`. Dormancy\nreporting is advisory; removal remains an explicit application decision.\n\nAn application may attach up to 16 KiB of owner-encrypted metadata to each\nroster entry. Murmur supplies the stable device key to `encryptDeviceMetadata`\nso the ciphertext can be bound to that exact account/device pair, but neither\nMurmur nor the relay decrypts it. `devices(ctx)` returns defensive copies of the\nopaque bytes and refreshes the roster from the relay. Each entry also carries\n`lastAccessedAt`, the relay-owned time when that device most recently received\na session token. Token issuance updates this timestamp monotonically without\nadvancing the cryptographic roster revision. Reopening with changed ciphertext\nupdates only metadata: the device key, reset generation, access time, directory\nmaterial, and MLS membership remain unchanged. Omitting the callback preserves\nan existing value.\n\nWhile `sync()` is connected, the relay sends an owner-only roster invalidation\nto every current account device stream after registration, removal, metadata\nchange, or access-time change. Murmur reads the authoritative roster, updates\nits local observation, and invokes `onDevicesChanged` with defensive copies.\nThe notification carries no metadata and is deliberately ephemeral; durable\ndevice additions and removals still arrive through the ordered inbox.\n\n`deleteAccount(ctx)` is terminal. It persists and retries one signed relay request,\nthen clears every local store key and destroys both identity roots only after\nrelay confirmation. It does not erase authenticated MLS events already held by\nother members; those members converge later through silence or explicit\nremoval.\n\n## Storage and recovery\n\nThe store contains identity roots, MLS epochs, pending bootstraps, replay state,\noutboxes, account state, and queue progress. Treat it as secret application\nstate and back it up atomically. Losing it loses cryptographic session state.\n\nIf relay continuity is lost, Murmur records a final reset snapshot and calls\n`onReset`. Resolving that callback authorizes the one-time technical-state\npurge; application data remains application-owned.\n\n## Relay\n\nThe standalone relay and Cloudflare Worker transport opaque signed deliveries.\nThey do not parse MLS or retain conversation history. Production ingress must\nprovide non-Sybil admission because public identities are inexpensive to\ncreate.\n\nSee [relay deployment](docs/DEPLOYMENT.md), [relay API](docs/RELAY_API.md), and\nthe [protocol reference](docs/PROTOCOL.md).\n\n## Security properties\n\n- Noble libraries provide cryptographic primitives.\n- Secret keys remain `Uint8Array` values and are zeroed when their lifetime\n  ends.\n- Base64url appears only at storage and wire boundaries.\n- Inputs are validated before cryptographic operations.\n- Relay authentication comparisons are constant-time.\n- `@slopus/murmur` has no `node:*` imports or runtime side effects.\n\nReview [SECURITY.md](docs/SECURITY.md) before production use.\n\n## Development\n\n```bash\npnpm install\npnpm test\npnpm typecheck\npnpm lint\npnpm format:check\npnpm build\n```\n\nNode 22.5 or later is required for the SQLite relay. The published library\nsupports Node 20 or later and browser runtimes with the required Web APIs.\n","readmeFilename":"README.md"}