{"_id":"@agentplat/collective-membership","_rev":"10-0b7340c7b00e21c4996928a9e95f5699","name":"@agentplat/collective-membership","dist-tags":{"agentplat-stage-ffca668731c9":"0.3.0-beta.4","agentplat-stage-dbd047c3c9a9":"0.3.0-beta.4","agentplat-stage-dc16b2267584":"0.3.0-beta.5","next":"0.3.0-beta.8","latest":"1.2.0"},"versions":{"0.3.0-beta.4":{"name":"@agentplat/collective-membership","version":"0.3.0-beta.4","license":"Apache-2.0","_id":"@agentplat/collective-membership@0.3.0-beta.4","maintainers":[{"name":"douglas-grishen","email":"douglas@grishen.com"}],"homepage":"https://github.com/Agentplat/agentplat#readme","bugs":{"url":"https://github.com/Agentplat/agentplat/issues"},"dist":{"shasum":"a6aedfdd04c805ab0b41cd6237163c0aa1dea83c","tarball":"https://registry.npmjs.org/@agentplat/collective-membership/-/collective-membership-0.3.0-beta.4.tgz","fileCount":71,"integrity":"sha512-rMJkud6Cnffb8CqGaUo8iXwFoE+cOz0b5yvPxU8JrevzQwdh4AHebvL8N74wFX+xm3QwFsyK+QOV/8jWTC0ttw==","signatures":[{"sig":"MEYCIQDkMqCoamnjf+eBKpcbTEZAdKRq37xiulf9mpxqQTtI6QIhAO5+NuAHcLXKl3gFvkw2YQ4imROG/gFboWH41Qa4tuKN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":543518},"main":"./dist/index.js","type":"module","_from":"file:/tmp/agentplat-publish-jABHQZ/tarballs/agentplat-collective-membership-0.3.0-beta.4.tgz","types":"./dist/index.d.ts","engines":{"node":">=20.19.3"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent-factory":{"types":"./dist/reference-agent-factory.d.ts","import":"./dist/reference-agent-factory.js"},"./agent-lineage":{"types":"./dist/agent-lineage.d.ts","import":"./dist/agent-lineage.js"},"./coordinator-election":{"types":"./dist/coordinator-election.d.ts","import":"./dist/coordinator-election.js"},"./governed-agent-lifecycle":{"types":"./dist/governed-agent-lifecycle.d.ts","import":"./dist/governed-agent-lifecycle.js"}},"scripts":{"test":"pnpm run build && node --test tests/*.test.mjs","build":"tsc -p tsconfig.json","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","type-check":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"douglas-grishen","email":"douglas@grishen.com"},"_resolved":"/tmp/agentplat-publish-jABHQZ/tarballs/agentplat-collective-membership-0.3.0-beta.4.tgz","_integrity":"sha512-rMJkud6Cnffb8CqGaUo8iXwFoE+cOz0b5yvPxU8JrevzQwdh4AHebvL8N74wFX+xm3QwFsyK+QOV/8jWTC0ttw==","repository":{"url":"git+https://github.com/Agentplat/agentplat.git","type":"git","directory":"packages/collective-membership"},"_npmVersion":"10.8.2","description":"Certified dynamic peer membership and overlapping key rotation for Agentplat collectives.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@agentplat/mesh-crypto":"^0.3.0-beta.4","@agentplat/mesh-protocol":"^0.3.0-beta.4","@agentplat/collective-quorum":"^0.3.0-beta.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/collective-membership_0.3.0-beta.4_1786996619083_0.8665351952820852","host":"s3://npm-registry-packages-npm-production"}},"0.3.0-beta.5":{"name":"@agentplat/collective-membership","version":"0.3.0-beta.5","license":"Apache-2.0","_id":"@agentplat/collective-membership@0.3.0-beta.5","maintainers":[{"name":"douglas-grishen","email":"douglas@grishen.com"}],"homepage":"https://github.com/Agentplat/agentplat#readme","bugs":{"url":"https://github.com/Agentplat/agentplat/issues"},"dist":{"shasum":"70769eda2c12b19fe3a336b9eddbc39dae5233f8","tarball":"https://registry.npmjs.org/@agentplat/collective-membership/-/collective-membership-0.3.0-beta.5.tgz","fileCount":71,"integrity":"sha512-osQJoSeye2hH0arK2eFnweQknpz5x8fPtiu/Y+pgvZ3iqUWAWWZSiMkGdeLPJ0ozJ0BVfp3fiKKPIvD+oNYm2w==","signatures":[{"sig":"MEUCIHhSTyNXXCFE7C0cOPTSJ8iAt82eKdmEwGHVE5fDZxhmAiEAtIBLXoKgUi3D127geRxQwlWNZq12Gt0ji+aogeSXwOg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agentplat%2fcollective-membership@0.3.0-beta.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":543518},"main":"./dist/index.js","type":"module","_from":"file:/tmp/agentplat-publish-QbF2qw/tarballs/agentplat-collective-membership-0.3.0-beta.5.tgz","types":"./dist/index.d.ts","engines":{"node":">=20.19.3"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent-factory":{"types":"./dist/reference-agent-factory.d.ts","import":"./dist/reference-agent-factory.js"},"./agent-lineage":{"types":"./dist/agent-lineage.d.ts","import":"./dist/agent-lineage.js"},"./coordinator-election":{"types":"./dist/coordinator-election.d.ts","import":"./dist/coordinator-election.js"},"./governed-agent-lifecycle":{"types":"./dist/governed-agent-lifecycle.d.ts","import":"./dist/governed-agent-lifecycle.js"}},"scripts":{"test":"pnpm run build && node --test tests/*.test.mjs","build":"tsc -p tsconfig.json","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","type-check":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:37d9dccd-584b-4eac-bff8-3d9cc2a7009f"}},"_resolved":"/tmp/agentplat-publish-QbF2qw/tarballs/agentplat-collective-membership-0.3.0-beta.5.tgz","_integrity":"sha512-osQJoSeye2hH0arK2eFnweQknpz5x8fPtiu/Y+pgvZ3iqUWAWWZSiMkGdeLPJ0ozJ0BVfp3fiKKPIvD+oNYm2w==","repository":{"url":"git+https://github.com/Agentplat/agentplat.git","type":"git","directory":"packages/collective-membership"},"_npmVersion":"11.17.0","description":"Certified dynamic peer membership and overlapping key rotation for Agentplat collectives.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@agentplat/mesh-crypto":"^0.3.0-beta.5","@agentplat/mesh-protocol":"^0.3.0-beta.5","@agentplat/collective-quorum":"^0.3.0-beta.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/collective-membership_0.3.0-beta.5_1787371866115_0.9095991226250357","host":"s3://npm-registry-packages-npm-production"}},"0.3.0-beta.7":{"name":"@agentplat/collective-membership","version":"0.3.0-beta.7","license":"Apache-2.0","_id":"@agentplat/collective-membership@0.3.0-beta.7","maintainers":[{"name":"douglas-grishen","email":"douglas@grishen.com"}],"homepage":"https://github.com/Agentplat/agentplat#readme","bugs":{"url":"https://github.com/Agentplat/agentplat/issues"},"dist":{"shasum":"dd30da6f1934aed3c76cbf555788b49d4b36d36c","tarball":"https://registry.npmjs.org/@agentplat/collective-membership/-/collective-membership-0.3.0-beta.7.tgz","fileCount":71,"integrity":"sha512-FxSWKMrMwnuEOVsbD+337uKSyxSCi0F+nENlJtxe17DVVkW44kIfmBUMoalMeUkG13AumRRV2svBV/rZGbBdCQ==","signatures":[{"sig":"MEYCIQDIWFimgqkBCP+mLWurhGn5z6Zv/8DgLm5h2bKcqn7TzwIhAL2fGEjb0Rhr1H7z4Mg77Nkmev8qYCoXsxLKQS7hFM9w","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agentplat%2fcollective-membership@0.3.0-beta.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":568287},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/agentplat/agentplat/release-artifacts/agentplat-collective-membership-0.3.0-beta.7.tgz","types":"./dist/index.d.ts","engines":{"node":">=20.19.3"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent-factory":{"types":"./dist/reference-agent-factory.d.ts","import":"./dist/reference-agent-factory.js"},"./agent-lineage":{"types":"./dist/agent-lineage.d.ts","import":"./dist/agent-lineage.js"},"./coordinator-election":{"types":"./dist/coordinator-election.d.ts","import":"./dist/coordinator-election.js"},"./governed-agent-lifecycle":{"types":"./dist/governed-agent-lifecycle.d.ts","import":"./dist/governed-agent-lifecycle.js"}},"scripts":{"test":"pnpm run build && node --test tests/*.test.mjs","build":"tsc -p tsconfig.json","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","type-check":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"douglas-grishen","email":"douglas@grishen.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:4211d111-d673-4509-8845-a3ebceacc876"}},"_resolved":"/home/runner/work/agentplat/agentplat/release-artifacts/agentplat-collective-membership-0.3.0-beta.7.tgz","_integrity":"sha512-FxSWKMrMwnuEOVsbD+337uKSyxSCi0F+nENlJtxe17DVVkW44kIfmBUMoalMeUkG13AumRRV2svBV/rZGbBdCQ==","repository":{"url":"git+https://github.com/Agentplat/agentplat.git","type":"git","directory":"packages/collective-membership"},"_npmVersion":"11.19.0","description":"Certified dynamic peer membership and overlapping key rotation for Agentplat collectives.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@agentplat/mesh-crypto":"^0.3.0-beta.7","@agentplat/mesh-protocol":"^0.3.0-beta.7","@agentplat/collective-quorum":"^0.3.0-beta.7"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/collective-membership_0.3.0-beta.7_1788979428545_0.991539686959092","host":"s3://npm-registry-packages-npm-production"}},"0.3.0-beta.8":{"name":"@agentplat/collective-membership","version":"0.3.0-beta.8","license":"Apache-2.0","_id":"@agentplat/collective-membership@0.3.0-beta.8","maintainers":[{"name":"douglas-grishen","email":"douglas@grishen.com"}],"homepage":"https://github.com/Agentplat/agentplat#readme","bugs":{"url":"https://github.com/Agentplat/agentplat/issues"},"dist":{"shasum":"c1e2cc46f5a86be37cac227f4dd186a02cb371b9","tarball":"https://registry.npmjs.org/@agentplat/collective-membership/-/collective-membership-0.3.0-beta.8.tgz","fileCount":71,"integrity":"sha512-++cXj4TGafTfIW2h7tZ+cuH/p9BlC8J3E8rk0x1+oq5zduk3dF0/pDU+TlPHg136WpG70tTKxlilM0LdhNfYPQ==","signatures":[{"sig":"MEQCIHYw278pMaRAH4N0tIGGaI5tRVROtquLwD77ENi95eeNAiAiOuKhmLcX1+0hfIHrpJj1G/Tr4mTXWJkl1Sp071WnBA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agentplat%2fcollective-membership@0.3.0-beta.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":568578},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/agentplat/agentplat/release-artifacts/agentplat-collective-membership-0.3.0-beta.8.tgz","types":"./dist/index.d.ts","engines":{"node":">=20.19.3"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent-factory":{"types":"./dist/reference-agent-factory.d.ts","import":"./dist/reference-agent-factory.js"},"./agent-lineage":{"types":"./dist/agent-lineage.d.ts","import":"./dist/agent-lineage.js"},"./coordinator-election":{"types":"./dist/coordinator-election.d.ts","import":"./dist/coordinator-election.js"},"./governed-agent-lifecycle":{"types":"./dist/governed-agent-lifecycle.d.ts","import":"./dist/governed-agent-lifecycle.js"}},"scripts":{"test":"pnpm run build && node --test tests/*.test.mjs","build":"tsc -p tsconfig.json","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","type-check":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"douglas-grishen","email":"douglas@grishen.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:4211d111-d673-4509-8845-a3ebceacc876"}},"_resolved":"/home/runner/work/agentplat/agentplat/release-artifacts/agentplat-collective-membership-0.3.0-beta.8.tgz","_integrity":"sha512-++cXj4TGafTfIW2h7tZ+cuH/p9BlC8J3E8rk0x1+oq5zduk3dF0/pDU+TlPHg136WpG70tTKxlilM0LdhNfYPQ==","repository":{"url":"git+https://github.com/Agentplat/agentplat.git","type":"git","directory":"packages/collective-membership"},"_npmVersion":"11.19.0","description":"Certified dynamic peer membership and overlapping key rotation for Agentplat collectives.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@agentplat/mesh-crypto":"^0.3.0-beta.8","@agentplat/mesh-protocol":"^0.3.0-beta.8","@agentplat/collective-quorum":"^0.3.0-beta.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/collective-membership_0.3.0-beta.8_1789349031166_0.4127279501424552","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@agentplat/collective-membership","version":"1.0.0","license":"Apache-2.0","_id":"@agentplat/collective-membership@1.0.0","maintainers":[{"name":"douglas-grishen","email":"douglas@grishen.com"}],"homepage":"https://github.com/Agentplat/agentplat#readme","bugs":{"url":"https://github.com/Agentplat/agentplat/issues"},"dist":{"shasum":"425606b11c0a1cd8f137ae5136220e30cc67849d","tarball":"https://registry.npmjs.org/@agentplat/collective-membership/-/collective-membership-1.0.0.tgz","fileCount":71,"integrity":"sha512-q4MaFIYwNfGT348uY29HI9w7nxkvVH0mMqU1ixLRy6ZxZwgz9Gu74wPFvJAJR2e5y62+whI/H/d76NQ2BAwpKA==","signatures":[{"sig":"MEQCIHMTbZ+bvYHGHeGsXWvRld/b8mcgr2vgqmfEGtRlYedkAiBdGlH2wp2lea0bbk6pfAyANpHyunLj7HEhLqTPmKwG8w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFBFEqDccXauGWprvEKzoZjC3IB4Y5Druu5xYO34vR0FAiAeYE5k0LzNnawvI9cxTTUeJHoKWMONqJujzZQaoVGLIA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agentplat%2fcollective-membership@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":568550},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/agentplat/agentplat/release-artifacts/agentplat-collective-membership-1.0.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20.19.3"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent-factory":{"types":"./dist/reference-agent-factory.d.ts","import":"./dist/reference-agent-factory.js"},"./agent-lineage":{"types":"./dist/agent-lineage.d.ts","import":"./dist/agent-lineage.js"},"./coordinator-election":{"types":"./dist/coordinator-election.d.ts","import":"./dist/coordinator-election.js"},"./governed-agent-lifecycle":{"types":"./dist/governed-agent-lifecycle.d.ts","import":"./dist/governed-agent-lifecycle.js"}},"scripts":{"test":"pnpm run build && node --test tests/*.test.mjs","build":"tsc -p tsconfig.json","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","type-check":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:05608706-71fa-49c0-aed0-85867af8e98c"}},"_resolved":"/home/runner/work/agentplat/agentplat/release-artifacts/agentplat-collective-membership-1.0.0.tgz","_integrity":"sha512-q4MaFIYwNfGT348uY29HI9w7nxkvVH0mMqU1ixLRy6ZxZwgz9Gu74wPFvJAJR2e5y62+whI/H/d76NQ2BAwpKA==","repository":{"url":"git+https://github.com/Agentplat/agentplat.git","type":"git","directory":"packages/collective-membership"},"_npmVersion":"11.19.0","description":"Certified dynamic peer membership and overlapping key rotation for Agentplat collectives.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@agentplat/mesh-crypto":"^1.0.0","@agentplat/mesh-protocol":"^1.0.0","@agentplat/collective-quorum":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/collective-membership_1.0.0_1790116493876_0.17908122973689156","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@agentplat/collective-membership","version":"1.1.0","license":"Apache-2.0","_id":"@agentplat/collective-membership@1.1.0","maintainers":[{"name":"douglas-grishen","email":"douglas@grishen.com"}],"homepage":"https://github.com/Agentplat/agentplat#readme","bugs":{"url":"https://github.com/Agentplat/agentplat/issues"},"dist":{"shasum":"af0716af60790c922d7d463b443a2c138182fe2f","tarball":"https://registry.npmjs.org/@agentplat/collective-membership/-/collective-membership-1.1.0.tgz","fileCount":71,"integrity":"sha512-4E357iP8xpfKz63iJLnsAWOqtCP72L8cmQ8kfk+NKUAwM+puBRBmrsDRoKbn5K5eRDLqXXDEHXQqA1/lRsj62A==","signatures":[{"sig":"MEQCIEWYcQa3FspvvMIPF4KeBYgTVXP7ylekONwIAGEdUlLTAiBoOb0IwJ7IjmJjYHJNNJJZ0yllhdOv5zqtcbGBleNNhw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFBgghmvq4jVfZQMOTIauzIKE8VwxhSJkIay261nvPExAiEAtkB9REXkXrNRrAeAHiwE4jgS/kfH11EB6z94djjdNGo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agentplat%2fcollective-membership@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":568550},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/agentplat/agentplat/release-artifacts/agentplat-collective-membership-1.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20.19.3"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent-factory":{"types":"./dist/reference-agent-factory.d.ts","import":"./dist/reference-agent-factory.js"},"./agent-lineage":{"types":"./dist/agent-lineage.d.ts","import":"./dist/agent-lineage.js"},"./coordinator-election":{"types":"./dist/coordinator-election.d.ts","import":"./dist/coordinator-election.js"},"./governed-agent-lifecycle":{"types":"./dist/governed-agent-lifecycle.d.ts","import":"./dist/governed-agent-lifecycle.js"}},"scripts":{"test":"pnpm run build && node --test tests/*.test.mjs","build":"tsc -p tsconfig.json","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","type-check":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"05608706-71fa-49c0-aed0-85867af8e98c"}},"_resolved":"/home/runner/work/agentplat/agentplat/release-artifacts/agentplat-collective-membership-1.1.0.tgz","_integrity":"sha512-4E357iP8xpfKz63iJLnsAWOqtCP72L8cmQ8kfk+NKUAwM+puBRBmrsDRoKbn5K5eRDLqXXDEHXQqA1/lRsj62A==","repository":{"url":"git+https://github.com/Agentplat/agentplat.git","type":"git","directory":"packages/collective-membership"},"_npmVersion":"11.19.0","description":"Certified dynamic peer membership and overlapping key rotation for Agentplat collectives.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@agentplat/mesh-crypto":"^1.1.0","@agentplat/mesh-protocol":"^1.1.0","@agentplat/collective-quorum":"^1.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/collective-membership_1.1.0_1790699821654_0.5550668874196092","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"_id":"@agentplat/collective-membership@1.2.0","bugs":{"url":"https://github.com/Agentplat/agentplat/issues"},"dist":{"shasum":"23480381a09f4bc11d3acd6d739568e87067b3eb","tarball":"https://registry.npmjs.org/@agentplat/collective-membership/-/collective-membership-1.2.0.tgz","fileCount":71,"integrity":"sha512-8+45oWl3PhA1r61VgUoaGRs0+763ni1I4ZSgH2buIDVVM2usNVZnKBzMejYWZzzgrbDAIzSXxTyY1IZVmhkAQw==","signatures":[{"sig":"MEUCIDw32UGrWisRUHKwrMQo6GfVgyJ3sMJi24OLLYioz9+JAiEAoiqfCtC9TgIzZhpIbsHX4pS9fVoORwEFKWpwiaacn8Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCnZBWGEv3PAmujz72pWK0MvGg4+U56Gi0tR5OS2sg5IAIgVre65pS4WaciI6/ToCHTdMfAMMIuqZNhXnm8OJL5ruk="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agentplat%2fcollective-membership@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":568550},"main":"./dist/index.js","name":"@agentplat/collective-membership","type":"module","_from":"file:/home/runner/work/agentplat/agentplat/release-artifacts/agentplat-collective-membership-1.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20.19.3"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent-factory":{"types":"./dist/reference-agent-factory.d.ts","import":"./dist/reference-agent-factory.js"},"./agent-lineage":{"types":"./dist/agent-lineage.d.ts","import":"./dist/agent-lineage.js"},"./coordinator-election":{"types":"./dist/coordinator-election.d.ts","import":"./dist/coordinator-election.js"},"./governed-agent-lifecycle":{"types":"./dist/governed-agent-lifecycle.d.ts","import":"./dist/governed-agent-lifecycle.js"}},"license":"Apache-2.0","scripts":{"test":"pnpm run build && node --test tests/*.test.mjs","build":"tsc -p tsconfig.json","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","type-check":"tsc -p tsconfig.json --noEmit"},"version":"1.2.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"05608706-71fa-49c0-aed0-85867af8e98c"}},"homepage":"https://github.com/Agentplat/agentplat#readme","_resolved":"/home/runner/work/agentplat/agentplat/release-artifacts/agentplat-collective-membership-1.2.0.tgz","_integrity":"sha512-8+45oWl3PhA1r61VgUoaGRs0+763ni1I4ZSgH2buIDVVM2usNVZnKBzMejYWZzzgrbDAIzSXxTyY1IZVmhkAQw==","repository":{"url":"git+https://github.com/Agentplat/agentplat.git","type":"git","directory":"packages/collective-membership"},"_npmVersion":"11.19.0","description":"Certified dynamic peer membership and overlapping key rotation for Agentplat collectives.","directories":{},"maintainers":[{"name":"douglas-grishen","email":"douglas@grishen.com"}],"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@agentplat/mesh-crypto":"^1.2.0","@agentplat/mesh-protocol":"^1.2.0","@agentplat/collective-quorum":"^1.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/collective-membership_1.2.0_1790812410429_0.1346888786862266"}}},"time":{"created":"2026-08-17T19:56:58.894Z","modified":"2026-09-30T23:53:30.904Z","0.3.0-beta.4":"2026-08-17T19:56:59.236Z","0.3.0-beta.5":"2026-08-22T04:11:06.276Z","0.3.0-beta.7":"2026-09-09T18:43:48.631Z","0.3.0-beta.8":"2026-09-14T01:23:51.276Z","1.0.0":"2026-09-22T22:34:53.978Z","1.1.0":"2026-09-29T16:37:01.800Z","1.2.0":"2026-09-30T23:53:30.538Z"},"bugs":{"url":"https://github.com/Agentplat/agentplat/issues"},"license":"Apache-2.0","homepage":"https://github.com/Agentplat/agentplat#readme","repository":{"url":"git+https://github.com/Agentplat/agentplat.git","type":"git","directory":"packages/collective-membership"},"description":"Certified dynamic peer membership and overlapping key rotation for Agentplat collectives.","maintainers":[{"name":"douglas-grishen","email":"douglas@grishen.com"}],"readme":"# `@agentplat/collective-membership`\n\nCertified dynamic membership and overlapping Ed25519 key rotation for\nAgentplat collectives.\n\n## Installation (developer preview)\n\nInstall the coordinated preview explicitly:\n\n```sh\nnpm install @agentplat/collective-membership@next\n```\n\nKeep all `@agentplat/*` packages on the same release version. npm's default\n`latest` tag can point to an older preview. See the\n[release channels](https://github.com/Agentplat/agentplat/blob/main/docs/release-channels.md)\nfor distribution status and version selection.\n\nThe package maintains an ordered chain of immutable configuration epochs. A\ntransition is accepted only when signed votes contain both:\n\n- a strict majority of the previous configuration; and\n- a strict majority of the next configuration.\n\nThis joint-quorum rule applies to joins, leaves, and key rotation. It prevents\ntwo disjoint peer sets from independently replacing the same epoch.\n\n## Configuration lifecycle\n\nEvery configuration binds tenant, mesh, policy domain, members, stable process\ninstances, public verification keys, activation time, previous digest, and the\nderived majority threshold. Members and keys use canonical ordering, and every\nconfiguration, proposal, envelope, and certificate has a deterministic SHA-256\ndigest.\n\nJoins require proof that the joining peer controls its advertised private key.\nRotation requires proofs from both the retiring and replacement keys. The\nretiring key is shortened to the declared `overlapUntil`; the replacement key\nmust remain valid beyond that instant. Private key material never enters\nconfiguration state.\n\n```ts\nimport {\n  CollectiveMembershipHostV1,\n  InMemoryCollectiveMembershipRegistryV1,\n  InMemoryCollectiveMembershipRepositoryV1,\n} from \"@agentplat/collective-membership\";\n\nconst registry = await InMemoryCollectiveMembershipRegistryV1.create({\n  configurations: [initialConfiguration],\n});\nconst repository = new InMemoryCollectiveMembershipRepositoryV1();\nawait repository.initialize(initialConfiguration);\n\nconst host = new CollectiveMembershipHostV1({\n  client: { scope, signing, registry, repository, transport, clock },\n  peer: { scope, signing, registry, repository, clock },\n});\n```\n\nExpose `host.peer` through `handleCollectiveMembershipHttpRequestV1`, or supply\nanother `CollectiveMembershipTransportV1`. Use\n`@agentplat/collective-membership-postgres` when votes and configuration heads\nmust survive process restarts.\n\n## Quorum continuity\n\nThe registry implements the optional membership port in\n`@agentplat/collective-quorum`. When supplied as both `resolver` and\n`membership`, every assignment or recovery operation is pinned to the\nconfiguration effective at its starting logical time:\n\n```ts\nconst quorumOptions = {\n  scope,\n  signing,\n  resolver: registry,\n  membership: registry,\n  repository: quorumRepository,\n  clock,\n};\n```\n\nLater membership commits do not rewrite an active operation's peer set.\nHistorical configurations remain available, while removed and retiring keys\nremain verifiable only through their bounded validity interval.\n\n## Fault model\n\nThe protocol fails closed on invalid signatures, expired envelopes, stale or\nforked configuration digests, insufficient old or new majorities, conflicting\nvotes, wrong audiences, and unrecognized peer instances. It tolerates crashes,\nrestarts, message loss, reordering, and minority partitions under an\nauthenticated non-Byzantine voter model. It does not discover endpoints,\nprotect private keys, or claim Byzantine consensus.\n\nSee [Dynamic Membership and Key Rotation V1](../../docs/agent-mesh/dynamic-membership-key-rotation-v1.md)\nfor the state machines and operational rules.\n\n## Governed agent creation\n\n`./agent-lineage` defines certified parent/child lineage, attenuated authority,\ncapability and budget inheritance, bounded generations, enrollment, and\ncascading termination. `./agent-factory` supplies a reference material factory\nthat revalidates those bindings against current lineage before provisioning.\n\nThe factory writes a content-digested CAS reservation before crossing external\nboundaries. Portable identity and Ed25519 custody ports receive the stable\nrequest digest as their idempotency operation ID; private key material never\nenters factory or lineage state. A completed ledger record binds the runtime\nattestation, public key, creation certificate, parent lineage and factory\nimplementation into the standard `AgentFactoryReceiptV1`.\n\nThe reservation also retains the original authorized logical time and exact\nwall-clock key interval. An exact retry may finish with that plan only while\nboth the authorization and resulting key material remain valid; it never\nre-certifies at a later time or extends the interval. Once either boundary has\nexpired, the factory CAS-fences the reservation, reconciles identity and key\ncustody by the original operation ID, and records a terminal cancellation in\nboth the factory ledger and lineage creation saga. Cleanup ports must therefore\nfence an operation even when no material handle was journaled: a concurrent or\npreviously unobserved provision cannot materialize after cancellation wins.\n\nProduction embeddings must provide a durable `GovernedAgentFactoryStoreV1`, a\ndurable `AgentLineageStoreV1`, an authenticated certification verifier, and\nidempotent identity/key-custody implementations. The in-memory store is only a\nsingle-process reference; `@agentplat/collective-membership-postgres` provides\nboth durable stores. `expireReservations()` fences expired work before asking\nthe idempotent ports to clean up partial material. Termination revokes key\ncustody before terminating the runtime identity. Key rotation remains on the\ncertified membership transition path; the factory deliberately does not mutate\nlineage or membership keys independently.\n\n`./governed-agent-lifecycle` provides the reference composition for that\nboundary. `ReferenceAgentMembershipEnrollmentPortV1` converts lineage joins and\nremovals into quorum-certified membership transitions, while\n`GovernedAgentLifecycleRuntimeV1` exposes create-and-enroll, idempotent\nretirement, and an eligibility decision that requires both active lineage and\ncurrent membership. The membership configuration in an agent-creation\ncertificate is the quorum configuration that authorized creation; the joined\nagent becomes active in its certified successor epoch.\n\nThe same composition owns governed suspension and resumption. `suspendPeer()`\nfirst obtains the certified membership successor that excludes the peer and\nthen advances its lineage record from `active` to `suspended` with CAS.\n`resumePeer()` requires a fresh active-key proof, certifies re-admission of the\nsame peer, instance and public-key material, and advances the record back to\n`active`. Retries reconcile membership history or the already-current member,\nso a crash between the external transition and lineage commit does not repeat\nthe physical effect or invent a membership epoch.\n\nBoth lineage and lifecycle runtimes use capability authenticity rather than\nstructural typing at the closed composition boundary. A module-private nominal\nbrand identifies instances constructed by the package, and module-owned\ninvokers address their retained implementations directly. Store, factory,\ncertification, enrollment, registry and telemetry method capabilities are\ncaptured with their exact receiver at construction. Subsequent monkey-patching,\nsubclass dispatch, object substitution or property rebinding therefore cannot\nalter lineage/lifecycle authority or create a time-of-check/time-of-use gap.\nLifecycle construction rejects a structurally similar lineage object and all\nnominal accessors fail closed for clones and prototype-only instances.\n\nTermination persists the exact configuration digest and epoch of the certified\nsuccessor that first excluded each active peer in its lineage record. Later\nretries return that stable binding even if unrelated membership transitions\nadvance the collective. Before crossing the membership or factory boundary,\nthe lineage runtime persists a CAS-fenced `retiring` reservation. Concurrent\nretirement attempts therefore cannot repeat those effects or replace the\nreceipt written by the reservation owner. A suspended or revoked agent whose\nruntime material was already disabled uses `completeRetirement()` to finish its\ncertified membership exclusion without invoking factory cleanup again.\n\nIf a process stops after reserving retirement, or after membership removal but\nbefore lineage finalization, later attempts fail closed and require\nreconciliation with the original transition evidence. The runtime never\nguesses whether an external effect ran and never substitutes a newer epoch as\nthe retirement receipt.\n","readmeFilename":"README.md"}