{"_id":"@earendil-works/chord","_rev":"9-31bed72ac548a648497a2a4b02ec11d9","name":"@earendil-works/chord","dist-tags":{"initial":"0.0.0","latest":"0.99.1"},"versions":{"0.0.0":{"name":"@earendil-works/chord","version":"0.0.0","keywords":["application","plugins","rpc","services","state"],"author":{"name":"Earendil Works"},"license":"MIT","_id":"@earendil-works/chord@0.0.0","maintainers":[{"name":"mitsuhiko","email":"armin.ronacher@active-4.com"},{"name":"badlogic","email":"mario@badlogicgames.com"},{"name":"rwachtler","email":"r.wachtler@outlook.com"}],"homepage":"https://github.com/earendil-works/pi#readme","bugs":{"url":"https://github.com/earendil-works/pi/issues"},"dist":{"shasum":"7da72183acb6ce1717699d65159cc9763289fd22","tarball":"https://registry.npmjs.org/@earendil-works/chord/-/chord-0.0.0.tgz","fileCount":98,"integrity":"sha512-4Y1EV57hVTdriChFAoBPbFUsUQTxkYzKVh6CbakjgyqqAMkWvsw27M/simEMN1ya+GEUQhNndL8KHvgWFsG1vg==","signatures":[{"sig":"MEUCIF6Om4zjheX7R1H8pT2q1urwMiWNc3fr3i4bL4CLE5aiAiEApBS4GFT2Qqxia20rPtEw34EcJGk31gQR2JYN+uj0Vq0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":906545},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js","source":"./src/node.ts"},"./delta":{"types":"./dist/delta/index.d.ts","import":"./dist/delta/index.js","source":"./src/delta/index.ts"},"./bundler":{"types":"./dist/bundler.d.ts","import":"./dist/bundler.js","source":"./src/bundler.ts"},"./context":{"types":"./dist/context/index.d.ts","import":"./dist/context/index.js","source":"./src/context/index.ts"},"./package.json":"./package.json"},"scripts":{"test":"vitest --run","build":"tsgo -p tsconfig.build.json","clean":"shx rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"mitsuhiko","email":"armin.ronacher@active-4.com"},"repository":{"url":"git+https://github.com/earendil-works/pi.git","type":"git","directory":"packages/chord"},"_npmVersion":"11.15.0","description":"Application composition runtime for services, replicated state, RPC, and plugins","directories":{},"sideEffects":false,"_nodeVersion":"25.8.1","dependencies":{"esbuild":"0.28.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"0.4.0","vitest":"4.1.9"},"_npmOperationalInternal":{"tmp":"tmp/chord_0.0.0_1788515326980_0.10198611285139991","host":"s3://npm-registry-packages-npm-production"}},"0.85.0":{"name":"@earendil-works/chord","version":"0.85.0","keywords":["application","plugins","rpc","services","state"],"author":{"name":"Earendil Works"},"license":"MIT","_id":"@earendil-works/chord@0.85.0","maintainers":[{"name":"mitsuhiko","email":"armin.ronacher@active-4.com"},{"name":"badlogic","email":"mario@badlogicgames.com"},{"name":"rwachtler","email":"r.wachtler@outlook.com"}],"homepage":"https://github.com/earendil-works/pi#readme","bugs":{"url":"https://github.com/earendil-works/pi/issues"},"dist":{"shasum":"19b99c64bda7b7fae3507d119a0b70199e6dd6dd","tarball":"https://registry.npmjs.org/@earendil-works/chord/-/chord-0.85.0.tgz","fileCount":99,"integrity":"sha512-m/eFMaUg2gFUqEqzffgt/d3xPNKEvD++NZrYDBqpCEc2/dqMoS13Pdx/tofe8t5/DHgnzHxlRQFD5bLPUdPmvw==","signatures":[{"sig":"MEUCIFIvaEvQflLXyZDldi5yvHz5fxz6FqG/+Oa1Ix+3nUyHAiEA5lJqTGyRKNR68nB2+ebqyXcaqizWc8nny08vKCyUYX8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@earendil-works%2fchord@0.85.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":917443},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js","source":"./src/node.ts"},"./delta":{"types":"./dist/delta/index.d.ts","import":"./dist/delta/index.js","source":"./src/delta/index.ts"},"./bundler":{"types":"./dist/bundler.d.ts","import":"./dist/bundler.js","source":"./src/bundler.ts"},"./context":{"types":"./dist/context/index.d.ts","import":"./dist/context/index.js","source":"./src/context/index.ts"},"./package.json":"./package.json"},"gitHead":"107d79f11072bbc8a3a757ed7fd69596bee7d68c","scripts":{"test":"vitest --run","build":"tsgo -p tsconfig.build.json","clean":"shx rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9bb344c7-1b64-4b2b-a054-25c1ef29c6d7"}},"repository":{"url":"git+https://github.com/earendil-works/pi.git","type":"git","directory":"packages/chord"},"_npmVersion":"11.16.0","description":"Application composition runtime for services, replicated state, RPC, and plugins","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"esbuild":"0.28.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"0.4.0","vitest":"4.1.9"},"_npmOperationalInternal":{"tmp":"tmp/chord_0.85.0_1788516581092_0.9413756966254525","host":"s3://npm-registry-packages-npm-production"}},"0.85.1":{"name":"@earendil-works/chord","version":"0.85.1","keywords":["application","plugins","rpc","services","state"],"author":{"name":"Earendil Works"},"license":"MIT","_id":"@earendil-works/chord@0.85.1","maintainers":[{"name":"mitsuhiko","email":"armin.ronacher@active-4.com"},{"name":"badlogic","email":"mario@badlogicgames.com"},{"name":"rwachtler","email":"r.wachtler@outlook.com"}],"homepage":"https://github.com/earendil-works/pi#readme","bugs":{"url":"https://github.com/earendil-works/pi/issues"},"dist":{"shasum":"acc677176bee8b7c1fbed96483317f694398aded","tarball":"https://registry.npmjs.org/@earendil-works/chord/-/chord-0.85.1.tgz","fileCount":99,"integrity":"sha512-VDlkEC3dhCzQ5fcyH1OhG19dq+6jCn+rqc/iXFivwDYGR5anwo2RCiXij9PpHhqNR5GuhhE+Er69Zi1Sn4eY6w==","signatures":[{"sig":"MEQCID8jPFJoqZdnf964hAN0+mrGqrnXFifSjEYKIelJ9w2MAiAunTZ8q1u+b3QUn9ErhXlFjK2cQgMfrz8J3Kiw7el3qA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@earendil-works%2fchord@0.85.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":917443},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js","source":"./src/node.ts"},"./delta":{"types":"./dist/delta/index.d.ts","import":"./dist/delta/index.js","source":"./src/delta/index.ts"},"./bundler":{"types":"./dist/bundler.d.ts","import":"./dist/bundler.js","source":"./src/bundler.ts"},"./context":{"types":"./dist/context/index.d.ts","import":"./dist/context/index.js","source":"./src/context/index.ts"},"./package.json":"./package.json"},"gitHead":"d981de1229ef899957bbe968bc8dcda02a21f477","scripts":{"test":"vitest --run","build":"tsgo -p tsconfig.build.json","clean":"shx rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9bb344c7-1b64-4b2b-a054-25c1ef29c6d7"}},"repository":{"url":"git+https://github.com/earendil-works/pi.git","type":"git","directory":"packages/chord"},"_npmVersion":"11.16.0","description":"Application composition runtime for services, replicated state, RPC, and plugins","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"esbuild":"0.28.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"0.4.0","vitest":"4.1.9"},"_npmOperationalInternal":{"tmp":"tmp/chord_0.85.1_1788609827658_0.5551715156908841","host":"s3://npm-registry-packages-npm-production"}},"0.86.0":{"name":"@earendil-works/chord","version":"0.86.0","keywords":["application","plugins","rpc","services","state"],"author":{"name":"Earendil Works"},"license":"MIT","_id":"@earendil-works/chord@0.86.0","maintainers":[{"name":"mitsuhiko","email":"armin.ronacher@active-4.com"},{"name":"badlogic","email":"mario@badlogicgames.com"},{"name":"rwachtler","email":"r.wachtler@outlook.com"}],"homepage":"https://github.com/earendil-works/pi#readme","bugs":{"url":"https://github.com/earendil-works/pi/issues"},"dist":{"shasum":"8672d44d896cc90ba29130d3d4b44347661e60e4","tarball":"https://registry.npmjs.org/@earendil-works/chord/-/chord-0.86.0.tgz","fileCount":99,"integrity":"sha512-7EQVCDLLw9GcUpenFZp2zqgkUEmqex/g20ujmgtrkKu//mYhdwHLVM68HCSR4kXPTaP+fiPQp2o/Y3uju6vQ1A==","signatures":[{"sig":"MEYCIQDZj3gKnPcsQutkYpdCsWW2RYyOBFfiTSxI66JXbVRN+AIhAJYHq4C0v8Y6LS3Xggg+Q5QiivYnYvGGSqihXXC2rhA1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIB7tpoc6xPDA5U/mWsWMqsE7uRZfCuGx1Ul5GpvyaUE3AiEAjJy/9aQEcvSSOLcMKbqvlc/CmgODD72EmNUQ60um1sg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@earendil-works%2fchord@0.86.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1025447},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js","source":"./src/node.ts"},"./delta":{"types":"./dist/delta/index.d.ts","import":"./dist/delta/index.js","source":"./src/delta/index.ts"},"./bundler":{"types":"./dist/bundler.d.ts","import":"./dist/bundler.js","source":"./src/bundler.ts"},"./context":{"types":"./dist/context/index.d.ts","import":"./dist/context/index.js","source":"./src/context/index.ts"},"./package.json":"./package.json"},"gitHead":"ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc","scripts":{"test":"vitest --run","build":"tsgo -p tsconfig.build.json","clean":"shx rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9bb344c7-1b64-4b2b-a054-25c1ef29c6d7"}},"repository":{"url":"git+https://github.com/earendil-works/pi.git","type":"git","directory":"packages/chord"},"_npmVersion":"11.16.0","description":"Application composition runtime for services, replicated state, RPC, and plugins","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"esbuild":"0.28.2"},"_hasShrinkwrap":false,"devDependencies":{"shx":"0.4.0","vitest":"4.1.9"},"_npmOperationalInternal":{"tmp":"tmp/chord_0.86.0_1789859390705_0.2326052401688674","host":"s3://npm-registry-packages-npm-production"}},"0.86.1":{"name":"@earendil-works/chord","version":"0.86.1","keywords":["application","plugins","rpc","services","state"],"author":{"name":"Earendil Works"},"license":"MIT","_id":"@earendil-works/chord@0.86.1","maintainers":[{"name":"mitsuhiko","email":"armin.ronacher@active-4.com"},{"name":"badlogic","email":"mario@badlogicgames.com"},{"name":"rwachtler","email":"r.wachtler@outlook.com"}],"homepage":"https://github.com/earendil-works/pi#readme","bugs":{"url":"https://github.com/earendil-works/pi/issues"},"dist":{"shasum":"0b232759d83d41ec91adeb9bcac373b93da4cb02","tarball":"https://registry.npmjs.org/@earendil-works/chord/-/chord-0.86.1.tgz","fileCount":99,"integrity":"sha512-GzUr5n4tFBHUYxN9CjcRHK8QWo9tbxNrZu6iWPQ+PFiFrLASvSZOKeAVAgh3gHv/t0X5OvUpFlrMQ/nEFfCYpg==","signatures":[{"sig":"MEYCIQDP6zNiSEZETNAwI2vJjTEUsOtPfzWtfEuOsTU0owl0vgIhAKmJNxn+DNai5kFjde0ZPW2kfbta2omH2tWIlRLmEK6r","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCID/XJTw9NqIjNoCr1ENzuydG89qzs96CCveq/D5zJE/BAiAO8OEEotvgqvVKf5x/rjqVgJ6ipQzQDYc6HTCMDANPvA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@earendil-works%2fchord@0.86.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1025447},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js","source":"./src/node.ts"},"./delta":{"types":"./dist/delta/index.d.ts","import":"./dist/delta/index.js","source":"./src/delta/index.ts"},"./bundler":{"types":"./dist/bundler.d.ts","import":"./dist/bundler.js","source":"./src/bundler.ts"},"./context":{"types":"./dist/context/index.d.ts","import":"./dist/context/index.js","source":"./src/context/index.ts"},"./package.json":"./package.json"},"gitHead":"13cbf77df2396303013a41646bcfa77b4271ae56","scripts":{"test":"vitest --run","build":"tsgo -p tsconfig.build.json","clean":"shx rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9bb344c7-1b64-4b2b-a054-25c1ef29c6d7"}},"repository":{"url":"git+https://github.com/earendil-works/pi.git","type":"git","directory":"packages/chord"},"_npmVersion":"11.16.0","description":"Application composition runtime for services, replicated state, RPC, and plugins","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"esbuild":"0.28.2"},"_hasShrinkwrap":false,"devDependencies":{"shx":"0.4.0","vitest":"4.1.9"},"_npmOperationalInternal":{"tmp":"tmp/chord_0.86.1_1789902835823_0.49312511121626135","host":"s3://npm-registry-packages-npm-production"}},"0.87.0":{"name":"@earendil-works/chord","version":"0.87.0","keywords":["application","plugins","rpc","services","state"],"author":{"name":"Earendil Works"},"license":"MIT","_id":"@earendil-works/chord@0.87.0","maintainers":[{"name":"mitsuhiko","email":"armin.ronacher@active-4.com"},{"name":"badlogic","email":"mario@badlogicgames.com"},{"name":"rwachtler","email":"r.wachtler@outlook.com"}],"homepage":"https://github.com/earendil-works/pi#readme","bugs":{"url":"https://github.com/earendil-works/pi/issues"},"dist":{"shasum":"b033dc0d576114e2b36e95d3cb50f8301ddf7bfd","tarball":"https://registry.npmjs.org/@earendil-works/chord/-/chord-0.87.0.tgz","fileCount":111,"integrity":"sha512-t8QOTf0GTHrsDSfcdtXuA9RCkh6mnR4l25N0SM/sgH7Ih25jH4tGXNbkGs9MWpV5xTu9MRPj4A7Zn1UEwQm9+g==","signatures":[{"sig":"MEQCIEplTnFO+V3KFKRi86lxcxameq8W0aI+qmic570TX0XjAiB7UPtAPo6A5/SXdTzG+3R7BZAOmBYtNlvE2OQRCbT2pw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDjywS2ShbUgFskSM8rGNzql+AK6RDTmApNxlSPv6iKkgIhAIIh72RZ7Iyk5y9ITXBLtwaaxgEDw1/qfXRClPFIYTVN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@earendil-works%2fchord@0.87.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1207259},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js","source":"./src/node.ts"},"./delta":{"types":"./dist/delta/index.d.ts","import":"./dist/delta/index.js","source":"./src/delta/index.ts"},"./bundler":{"types":"./dist/bundler.d.ts","import":"./dist/bundler.js","source":"./src/bundler.ts"},"./context":{"types":"./dist/context/index.d.ts","import":"./dist/context/index.js","source":"./src/context/index.ts"},"./package.json":"./package.json"},"gitHead":"16787ad5b2dc748047f314ca1bfe7708f30f54f3","scripts":{"test":"vitest --run","build":"tsgo -p tsconfig.build.json","clean":"shx rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9bb344c7-1b64-4b2b-a054-25c1ef29c6d7"}},"repository":{"url":"git+https://github.com/earendil-works/pi.git","type":"git","directory":"packages/chord"},"_npmVersion":"11.16.0","description":"Application composition runtime for services, replicated state, RPC, and plugins","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"esbuild":"0.28.2"},"_hasShrinkwrap":false,"devDependencies":{"shx":"0.4.0","vitest":"4.1.9"},"_npmOperationalInternal":{"tmp":"tmp/chord_0.87.0_1790008890630_0.210888089384909","host":"s3://npm-registry-packages-npm-production"}},"0.87.1":{"name":"@earendil-works/chord","version":"0.87.1","keywords":["application","plugins","rpc","services","state"],"author":{"name":"Earendil Works"},"license":"MIT","_id":"@earendil-works/chord@0.87.1","maintainers":[{"name":"mitsuhiko","email":"armin.ronacher@active-4.com"},{"name":"badlogic","email":"mario@badlogicgames.com"},{"name":"rwachtler","email":"r.wachtler@outlook.com"}],"homepage":"https://github.com/earendil-works/pi#readme","bugs":{"url":"https://github.com/earendil-works/pi/issues"},"dist":{"shasum":"f983a4eae3e22c8204c53ea13070bf491330a31a","tarball":"https://registry.npmjs.org/@earendil-works/chord/-/chord-0.87.1.tgz","fileCount":111,"integrity":"sha512-bg7IkJGFcEaMqqYgOGUiq5Ky9RghpRfrlZ8I/v/1b4bBZ02A7t3E+6uhPRbadwWb/kWsnVFbZsqOKRN4a3LLCg==","signatures":[{"sig":"MEYCIQDhV1ud9RwUo+E0+mLSXH6qhvaFWYEzLqfad8ssaGPp4wIhAOiKjXklMZPV2EcZAPUAu2gOS6gcqkE9dMq3fsXF+d8N","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCC8hpUc9RppiRz+Ev+0N+ZGkBVpEgoJPzP8AGXj4/Z4wIgIiPjMjqsadjZuE7vCSKJfUoOsH+PQGxYxrSBH4/aHpE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@earendil-works%2fchord@0.87.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1207259},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js","source":"./src/node.ts"},"./delta":{"types":"./dist/delta/index.d.ts","import":"./dist/delta/index.js","source":"./src/delta/index.ts"},"./bundler":{"types":"./dist/bundler.d.ts","import":"./dist/bundler.js","source":"./src/bundler.ts"},"./context":{"types":"./dist/context/index.d.ts","import":"./dist/context/index.js","source":"./src/context/index.ts"},"./package.json":"./package.json"},"gitHead":"f07218c4d4bbc12bef056a7058c3dd49dfe41abe","scripts":{"test":"vitest --run","build":"tsgo -p tsconfig.build.json","clean":"shx rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9bb344c7-1b64-4b2b-a054-25c1ef29c6d7"}},"repository":{"url":"git+https://github.com/earendil-works/pi.git","type":"git","directory":"packages/chord"},"_npmVersion":"11.16.0","description":"Application composition runtime for services, replicated state, RPC, and plugins","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"esbuild":"0.28.2"},"_hasShrinkwrap":false,"devDependencies":{"shx":"0.4.0","vitest":"4.1.9"},"_npmOperationalInternal":{"tmp":"tmp/chord_0.87.1_1790105880489_0.25952401423634597","host":"s3://npm-registry-packages-npm-production"}},"0.99.0":{"name":"@earendil-works/chord","version":"0.99.0","keywords":["application","plugins","rpc","services","state"],"author":{"name":"Earendil Works"},"license":"MIT","_id":"@earendil-works/chord@0.99.0","maintainers":[{"name":"mitsuhiko","email":"armin.ronacher@active-4.com"},{"name":"badlogic","email":"mario@badlogicgames.com"},{"name":"rwachtler","email":"r.wachtler@outlook.com"}],"homepage":"https://github.com/earendil-works/pi#readme","bugs":{"url":"https://github.com/earendil-works/pi/issues"},"dist":{"shasum":"6e1eb8cf1afb8336f586045441586a16cbd6e1b6","tarball":"https://registry.npmjs.org/@earendil-works/chord/-/chord-0.99.0.tgz","fileCount":119,"integrity":"sha512-xGMjZqlbYOIs9hrKvTaW/rcwbjbrogBK2VU+z+YSR0v7G6WHMy6AivC4Sk0lMJjNaMsELFxG47X3BCkd6EqG4g==","signatures":[{"sig":"MEUCIFJG5IJ15+1EYE4/S2YAjUpSheg4dEx5BgssZ9Q6aTavAiEA+ohYjb+HHJvlCYDQ4jxyldnrS2HgjqNuuLhi9PceX3s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGdNE/JOaXJWAJM9J/NwqheJcsuXL5Te5oqPOGzMqF7hAiEArlLqFyJ3a6QKa9WTDfLsry4837lf7GvxJGL97uZ1hQQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@earendil-works%2fchord@0.99.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1024462},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js","source":"./src/node.ts"},"./delta":{"types":"./dist/delta/index.d.ts","import":"./dist/delta/index.js","source":"./src/delta/index.ts"},"./bundler":{"types":"./dist/bundler.d.ts","import":"./dist/bundler.js","source":"./src/bundler.ts"},"./context":{"types":"./dist/context/index.d.ts","import":"./dist/context/index.js","source":"./src/context/index.ts"},"./package.json":"./package.json"},"gitHead":"4b060d3a98618019adb9985d517516c8e99a2bbe","scripts":{"test":"vitest --run","build":"tsc -p tsconfig.build.json","clean":"shx rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"9bb344c7-1b64-4b2b-a054-25c1ef29c6d7"}},"repository":{"url":"git+https://github.com/earendil-works/pi.git","type":"git","directory":"packages/chord"},"_npmVersion":"11.16.0","description":"Application composition runtime for services, replicated state, RPC, and plugins","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"esbuild":"0.28.2"},"_hasShrinkwrap":false,"devDependencies":{"shx":"0.4.0","vitest":"4.1.11"},"_npmOperationalInternal":{"tmp":"tmp/chord_0.99.0_1790702173639_0.7159204576197395","host":"s3://npm-registry-packages-npm-production"}},"0.99.1":{"_id":"@earendil-works/chord@0.99.1","bugs":{"url":"https://github.com/earendil-works/pi/issues"},"dist":{"shasum":"7f6ba945b705a5ab48d25dbed39b253afcec68df","tarball":"https://registry.npmjs.org/@earendil-works/chord/-/chord-0.99.1.tgz","fileCount":119,"integrity":"sha512-4xyn0IBzJ+Xu/iOGi2hjXJGAR61QEhEWZsIqTDqr+GmItdquYwBO5jYFnqGiBaTqlY12/EpM7QHoEKSHbyvOug==","signatures":[{"sig":"MEUCIQDpmWqak7Mc90NEjz7a2q9UaWl9igdxiUep+CvVCIPQoQIgY/TdQ9NezMmvVHLppOqvgiaia/HamiF0ohxBfRrPPGY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDRqNTC+vE5Nq3w/cdGfj76/7mTV7/oSb8yqNUDFdQcWAIgaoAuADLO0AbvnzbZUPvHRzYhn/1l3g1MLvFltt52Qoo="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@earendil-works%2fchord@0.99.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1024462},"main":"./dist/index.js","name":"@earendil-works/chord","type":"module","types":"./dist/index.d.ts","author":{"name":"Earendil Works"},"engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js","source":"./src/node.ts"},"./delta":{"types":"./dist/delta/index.d.ts","import":"./dist/delta/index.js","source":"./src/delta/index.ts"},"./bundler":{"types":"./dist/bundler.d.ts","import":"./dist/bundler.js","source":"./src/bundler.ts"},"./context":{"types":"./dist/context/index.d.ts","import":"./dist/context/index.js","source":"./src/context/index.ts"},"./package.json":"./package.json"},"gitHead":"d86654abb8862e201933517d6f1fce9f88dd117f","license":"MIT","scripts":{"test":"vitest --run","build":"tsc -p tsconfig.build.json","clean":"shx rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"version":"0.99.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"9bb344c7-1b64-4b2b-a054-25c1ef29c6d7"}},"homepage":"https://github.com/earendil-works/pi#readme","keywords":["application","plugins","rpc","services","state"],"repository":{"url":"git+https://github.com/earendil-works/pi.git","type":"git","directory":"packages/chord"},"_npmVersion":"11.16.0","description":"Application composition runtime for services, replicated state, RPC, and plugins","directories":{},"maintainers":[{"name":"mitsuhiko","email":"armin.ronacher@active-4.com"},{"name":"badlogic","email":"mario@badlogicgames.com"},{"name":"rwachtler","email":"r.wachtler@outlook.com"}],"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"esbuild":"0.28.2"},"_hasShrinkwrap":false,"devDependencies":{"shx":"0.4.0","vitest":"4.1.11"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/chord_0.99.1_1790705893594_0.8249292618885076"}}},"time":{"created":"2026-09-04T09:48:46.870Z","modified":"2026-09-29T18:18:14.070Z","0.0.0":"2026-09-04T09:48:47.140Z","0.85.0":"2026-09-04T10:09:41.259Z","0.85.1":"2026-09-05T12:03:47.835Z","0.86.0":"2026-09-19T23:09:50.793Z","0.86.1":"2026-09-20T11:13:55.905Z","0.87.0":"2026-09-21T16:41:30.718Z","0.87.1":"2026-09-22T19:38:00.606Z","0.99.0":"2026-09-29T17:16:13.811Z","0.99.1":"2026-09-29T18:18:13.715Z"},"bugs":{"url":"https://github.com/earendil-works/pi/issues"},"author":{"name":"Earendil Works"},"license":"MIT","homepage":"https://github.com/earendil-works/pi#readme","keywords":["application","plugins","rpc","services","state"],"repository":{"url":"git+https://github.com/earendil-works/pi.git","type":"git","directory":"packages/chord"},"description":"Application composition runtime for services, replicated state, RPC, and plugins","maintainers":[{"name":"mitsuhiko","email":"armin.ronacher@active-4.com"},{"name":"badlogic","email":"mario@badlogicgames.com"},{"name":"rwachtler","email":"r.wachtler@outlook.com"}],"readme":"# @earendil-works/chord\n\nChord is an application-composition runtime for systems assembled from\nplugins/extensions. It provides facets, services, replicated state, and a\npluggable remote-service boundary. It is developed as a standalone package in\nthe Pi monorepo, but it is not a Pi package: it does not depend on any other Pi\nworkspace package and can be used by unrelated applications.\n\n## What Chord is for\n\nA single application feature may need to run in several environments: for\nexample, an agent worker, a terminal UI, and a remote WebUI.  Chord provides the\ngeneric machinery to write such extensions in a way that is both delightful for\nhumans as well as agents.\n\nThe design has a few connected pieces:\n\n- **Plugins** are synchronous setup units that declare the services they provide\n  and require. After every plugin has declared its shape, a host validates the\n  complete dependency graph, binds services, activates providers before consumers,\n  and disposes resources in reverse dependency order.  These units are called\n  *facets*.\n\n- **Facets** are parts of a plugin.  Each facet is bundled up separately and runs\n  in the process or environment where it's supposed to run.  You can use facets\n  to split a plugin into separate pieces that need to be loaded into different\n  processes and environments (think backend, browser, TUI etc.)\n\n- **Services** are typed, stable tokens with either one provider (**singleton**)\n  or dynamic keyed instances (**keyed**).  A service can be process-local, with\n  an unrestricted JavaScript contract, or remotely exposable. Consumers retain a\n  stable facade while a provider disconnects or is replaced.\n\n- **Replicated state** exposes authoritative state to local and remote\n  connected consumers. Producers publish atomic overlay transactions with\n  `change(context, callback)`; consumers receive complete immutable values. Draft\n  proxies exist only during the callback and become unusable afterward. Preparation\n  materializes a structurally shared immutable candidate and one exact decoded\n  operation batch, while each remote client/state stream owns independent path-codec\n  state. Replicas become unready on disconnect or replacement until rehydrated.\n\n- **Delta tracking** records and coalesces operations over tracked plain JSON.\n  It preserves common string and array operations, supports durable base\n  batches, and validates untrusted operations as they are applied. Batches\n  guarantee convergence but are not canonical or necessarily minimal.\n\n- **Remote service sources** advertise services available outside a facet host\n  and open bindings for the services its facets require. Bindings carry logical\n  calls and subscriptions through an application-supplied adapter. Chord\n  requires strict-JSON arguments, results, snapshots, updates, and catalogues,\n  but does not prescribe framing, routing, transport, or an application wire\n  envelope. `JsonRepresentation<T>` derives a wire-safe type for application data\n  with unknown payloads, while `isJsonValue()` validates received values at an\n  adapter boundary. Symmetric RPC peers are planned as one optional\n  implementation of this boundary.\n\n- **Context** Chord provides a Go-like context system for cancellation and\n  invocation-scoped application values. Applications can carry permissions or\n  telemetry through those values without Chord depending on either.\n\nThe current runtime exports service tokens, singleton and keyed providers,\nremote bindings, replicated state, facet hosts, and facet loaders from\n`@earendil-works/chord`. Import public types and general runtime APIs from the\npackage root. Context constants and functions live in\n`@earendil-works/chord/context` because their generic names should not pollute\nthe root API.\nChord-owned identifiers use the `chord.*` namespace and its reserved service\nprefix is `$chord.*`.\n\n## Remote service adapters\n\nChord owns its transport-independent service wire grammar. Consumer adapters\nuse `createServiceCatalogueCall()`, `createServiceSubscribeCall()`, and\n`createServiceUnsubscribeCall()` for `$chord.service` control calls.\n`createRemoteServiceEndpoint()` handles those calls for one provider consumer,\nincluding subscription activation and cleanup. `parseServiceCall()`,\n`parseServiceCatalogue()`, and the decoded/wire snapshot and update parsers\nvalidate Chord semantics after an adapter has established a strict-JSON\nboundary. `RemoteServiceErrorCode` and `REMOTE_SERVICE_ERROR_CODES` define the\nservice errors that may cross that boundary.\n\nReplicated state operations use one `createServiceStateEncoder()` at the\nprovider side and one `createServiceStateDecoder()` at the consumer side for\neach subscription. Those registries create an independent Delta path dictionary\nfor every instance/member state and reset it on replacement, unavailability,\nclose, or fresh hydration. Applications may place these values inside any\nrouting, request, response, or event envelope; Chord does not prescribe that\nouter protocol.\n\nProvider subscriptions atomically capture a snapshot and buffer subsequent\nupdates until activation. Activation and reentrant publication use the same FIFO.\nThe provider retains at most 100 pending updates per subscription, excluding the\nrunning delivery. Adding update 101 replaces the entire pending queue with\n`{ type: \"reset\", snapshot }`: a current full subscription snapshot whose state\nmembers contain `[[\"r\", value]]` and their new sequence baselines. It also captures\ncurrent instance membership, so discarded spawn/close/replacement events cannot\nleave stale instances behind. Live keyed generations retain their existing handles.\nThe reset carries the context of the publication that triggered overflow.\n\nConsumers and codecs must handle this explicit reset before accepting subsequent\nordinary deltas. A root operation in an ordinary `state` update does **not** permit\na sequence gap. Resets restart the subscription's path dictionaries, and later\ndeltas must be contiguous from each reset baseline. Transport adapters must\npreserve snapshot/reset/update order; they must not drop encoded delta batches or\nassume their own asynchronous queues are bounded by the provider's queue.\n\n## Tracking JSON deltas\n\nImport the standalone transactional tracker from `@earendil-works/chord/delta`:\n\n```ts\nimport { applyImmutable, track } from \"@earendil-works/chord/delta\";\n\nconst tracker = track({ output: \"\", count: 0 });\nconst change = tracker.beginChange();\nchange.state.output += \"done\\n\";\nchange.state.count += 1;\nconst prepared = change.prepare();\n\ntracker.adopt(prepared);\nconst replica = applyImmutable(prepared.base, prepared.ops);\n```\n\n`tracker.value` is always the latest adopted immutable revision. Preparation does\nnot change authority; adoption validates the preparation and swaps the root pointer.\nAssigned containers are copied by value and unchanged subtrees may be shared between\nrevisions.\n\nThe tracker uses trusted immutable ownership rather than defensive copying or\nfreezing. `track(initial)`, `prepareReplace(value)`, `replicatedState(initial)`, and\n`replace(context, value)` take ownership of alias-free strict-JSON roots without\nwalking them. Callers must not mutate transferred or published data. Values placed\nthrough drafts are already copied, so that walk also rejects non-strict JSON before\nthe draft changes. Published values are not frozen. In-process loopback consumers\nmay share their containers with the provider; mutating a consumed value violates\nthe contract and can corrupt authority. Clone or serialize at any mutable trust\nboundary.\n\nReplicated state provides the same model through a callback:\n\n```ts\nconst initial = { output: \"\", count: 0 };\nconst status = env.replicatedState(initial); // transfers ownership of initial\nstatus.change(context, (draft) => {\n\tdraft.output += \"done\\n\";\n\tdraft.count += 1;\n});\n```\n\nA successful `change()` publishes exactly one atomic revision. If its callback\nthrows, the original value and sequence remain unchanged. Draft handles become\nunusable when the callback returns. Chord emits string append and front-truncate\noperations, array splices and permutations, sets, and deletes; large edit sets may\nfold into a complete replacement. Remote connection plumbing encodes each batch\nindependently for every client/state pairing.\n\n### Public state subscriptions\n\n`state.subscribe(async (value, context, delivery) => { ... })` serializes callbacks\nindependently for each subscription. Hydration starts immediately when a value is\navailable, and its returned promise must settle before updates start. Synchronous\ncallbacks still run synchronously. Read the captured `value` inside an asynchronous\ncallback: `state.value` may already refer to a later revision.\n\nEach subscription retains at most 100 pending complete-value deliveries, excluding\nthe running callback. On overflow, only the newest pending value, context, and\ndelivery metadata are retained; a not-yet-started initial hydration is preserved.\nThus public delivery sequences may skip. This is a frame-count policy, not a byte\nlimit. Internal exact-operation subscriptions remain synchronous and receive every\nrevision, independently of slow public callbacks.\n\nThe returned unsubscribe function immediately discards pending work and prevents\nnew callbacks. It neither aborts nor waits for the running callback. Synchronous\nthrows and promise rejections are observed, reported, and do not stop other\nsubscriptions or subsequent callbacks. Attached sources and remote bindings use\ntheir `onError` handler; local mutable states (and attached sources without a\nhandler) report failures by throwing in a microtask. Unsubscribing does not hide a\nlater rejection from the running callback.\n\nThe standalone [Delta guide](src/delta/README.md) defines the complete ownership,\nlifecycle, operation, and replica contracts.\n\n## Bundling and loading facets\n\n`@earendil-works/chord/bundler` uses esbuild to turn ESM or TypeScript application\nentries into independent, content-addressed CommonJS files. The package-level API\nreads plugin identity and build configuration from `package.json`, then applies\nfacet path conventions supplied by the host application:\n\n```json\n{\n  \"name\": \"@example/my-plugin\",\n  \"version\": \"1.0.0\",\n  \"type\": \"module\",\n  \"peerDependencies\": {\n    \"@earendil-works/chord\": \"^0.84.4\"\n  },\n  \"chord\": {\n    \"facets\": {\n      \"worker\": \"./src/custom-worker.ts\",\n      \"presentation\": false\n    }\n  }\n}\n```\n\n```ts\nimport { bundleFacetPackage } from \"@earendil-works/chord/bundler\";\n\nawait bundleFacetPackage({\n\tpackagePath: \"/path/to/my-plugin\",\n\toutdir: \"/application-owned/plugin-builds/my-plugin\",\n\tdefaultFacets: {\n\t\tworker: \"src/worker.ts\",\n\t\tpresentation: \"src/presentation.ts\",\n\t},\n});\n```\n\nExisting conventional files become entries unless `chord.facets` overrides or\ndisables them. Peer dependencies are externalized and resolved against the host\nwhen loading. Chord never installs dependencies or runs package lifecycle\nscripts. `bundleFacets()` remains available as the lower-level API for callers\nthat already have explicit plugin identity and entry mappings.\n\nThe output directory contains one `.cjs` file per entry plus\n`chord-facets.json`. Load one application-selected entry through the Node-only\nloader:\n\n```ts\nimport { createFacetBundleLoader } from \"@earendil-works/chord/node\";\n\nconst loader = createFacetBundleLoader({\n\tmanifestPath: \"/application-owned/plugin-builds/my-plugin/chord-facets.json\",\n\tentry: \"worker\",\n\tresolveExternal: (specifier) => import.meta.resolve(specifier),\n});\nconst loaded = await loader.load();\n```\n\nEach `load()` verifies SHA-256 integrity and compiles the CommonJS body directly\nwith `node:vm` instead of putting the plugin into Node's CommonJS or ESM module\ncache. Externals are resolved by the host and loaded through a restricted\n`require`; esbuild lowers dynamic imports so they use the same path. Disposing a\nretired generation releases the loader's facet references, making its compiled\ncode eligible for garbage collection once plugin-owned resources are also gone.\n\nFor transport to another Node host, `readFacetBundleArtifact()` packages one\nverified manifest entry with its source, and `createFacetBundleArtifactLoader()`\nmaterializes fresh temporary generations while resolving externals against the\nreceiving host.\n\nTo reload, load a candidate, pass its facets to `FacetHost.reload()`, dispose the\ncandidate on failure, and dispose the retired `LoadedFacets` only after a\nsuccessful cutover. The host activates and validates the candidate while the\ncurrently active providers remain routed, then replaces each singleton directly\nwithout an unavailable interval. Stable service handles therefore do not become\ndisconnected during an ordinary reload. Keyed instances\nremain incarnation-specific and replacements receive fresh generations. The\nbundler writes a complete temporary directory before replacing the previous\noutput, so loaders do not observe partially built generations.\n\nSee [PLANNING.md](PLANNING.md) for the broader RPC and generation-loading\narchitecture.\n","readmeFilename":"README.md"}