{"_id":"@42ch/spoke-connect","_rev":"11-50b097c6852302c696ac192f3f1272de","name":"@42ch/spoke-connect","dist-tags":{"latest":"0.11.1"},"versions":{"0.0.0":{"name":"@42ch/spoke-connect","version":"0.0.0","keywords":["spoke","connect","ed25519","jcs"],"license":"Apache-2.0","_id":"@42ch/spoke-connect@0.0.0","maintainers":[{"name":"btspoony","email":"tech@btang.cn"}],"homepage":"https://github.com/42ch-dev/spoke","bugs":{"url":"https://github.com/42ch-dev/spoke/issues"},"dist":{"shasum":"de74a130f5867b0a63c45360b2d779d719fbb6ad","tarball":"https://registry.npmjs.org/@42ch/spoke-connect/-/spoke-connect-0.0.0.tgz","fileCount":21,"integrity":"sha512-A/MvOIy86wgnYzKunV4pVIGmUCMv3QCTWrtYwOqsb4EC35FKUwXg2qw/kdLvQeYl7h+c9nZIwaDvRJ6nfjxVBA==","signatures":[{"sig":"MEQCIFjaAWRIEZo6+kDvWi30iQAUxysjOElc3Vt+j6UiKBltAiAgvcypJpCjTpnA0VI5s0pdm7jdhEvHnPCadxk9SyILMQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88541},"type":"module","engines":{"node":">=20.19.0"},"exports":{".":{"types":"./src/index.ts","import":"./src/index.ts","default":"./src/index.ts"},"./node":{"types":"./src/node/connect-client.ts","import":"./src/node/connect-client.ts","default":"./src/node/connect-client.ts"}},"gitHead":"e1423db9b32ab1f8b920fe86c74e026873229683","scripts":{"test":"vitest run","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"btspoony","email":"tech@btang.cn"},"repository":{"url":"git+https://github.com/42ch-dev/spoke.git","type":"git","directory":"packages/spoke-connect-ts"},"_npmVersion":"11.16.0","description":"SPOKE connect client library — pure-TS identity derivation, Ed25519 hello signing, and RFC 8785 JCS canonicalization","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.1","canonicalize":"3.0.0","@noble/hashes":"^2.2.0","@noble/ed25519":"^3.1.0","@42ch/spoke-schemas":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.0","@types/ws":"^8.18.1","typescript":"^5.3.0","@types/node":"^22.15.0"},"_npmOperationalInternal":{"tmp":"tmp/spoke-connect_0.0.0_1785732305011_0.40860597341295657","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@42ch/spoke-connect","version":"0.7.1","keywords":["spoke","connect","ed25519","jcs"],"license":"Apache-2.0","_id":"@42ch/spoke-connect@0.7.1","maintainers":[{"name":"btspoony","email":"tech@btang.cn"}],"homepage":"https://github.com/42ch-dev/spoke","bugs":{"url":"https://github.com/42ch-dev/spoke/issues"},"dist":{"shasum":"85a5710bb20cb1bfa8a007ea33bd97fe30c78ab3","tarball":"https://registry.npmjs.org/@42ch/spoke-connect/-/spoke-connect-0.7.1.tgz","fileCount":17,"integrity":"sha512-sUdg5vX1n04fm5/hUBwNA5mYSI/JBvweLmh8o20uMJ1Yi9G0yIfF3kKzob5l+C/BWcQcws8beQrOeA8bO7coqA==","signatures":[{"sig":"MEYCIQC4TSLn4gQ/vbmIVTJhgG+W+bDo1mRO62EOoPPntwdoyAIhAL137SHzH0B1hjNsdsOIgKJNEeCozeBEcckva5dHA8ao","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@42ch%2fspoke-connect@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":434801},"type":"module","_from":"file:42ch-spoke-connect-0.7.1.tgz","engines":{"node":">=20.19.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./node":{"import":{"types":"./dist/node/connect-client.d.ts","default":"./dist/node/connect-client.js"},"require":{"types":"./dist/node/connect-client.d.cts","default":"./dist/node/connect-client.cjs"}}},"scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:24cdbc35-9b97-44f8-919f-cd7ff0b9a307"}},"_resolved":"/home/runner/work/spoke/spoke/packages/spoke-connect-ts/42ch-spoke-connect-0.7.1.tgz","_integrity":"sha512-sUdg5vX1n04fm5/hUBwNA5mYSI/JBvweLmh8o20uMJ1Yi9G0yIfF3kKzob5l+C/BWcQcws8beQrOeA8bO7coqA==","repository":{"url":"git+https://github.com/42ch-dev/spoke.git","type":"git","directory":"packages/spoke-connect-ts"},"_npmVersion":"11.16.0","description":"SPOKE connect client library — pure-TS identity derivation, Ed25519 hello signing, and RFC 8785 JCS canonicalization","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.1","canonicalize":"3.0.0","@noble/hashes":"^2.2.0","@noble/ed25519":"^3.1.0","@42ch/spoke-schemas":"0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^3.0.0","@types/ws":"^8.18.1","typescript":"^5.3.0","@types/node":"^22.15.0"},"_npmOperationalInternal":{"tmp":"tmp/spoke-connect_0.7.1_1785735885272_0.9298513252928233","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@42ch/spoke-connect","version":"0.8.0","keywords":["spoke","connect","ed25519","jcs"],"license":"Apache-2.0","_id":"@42ch/spoke-connect@0.8.0","maintainers":[{"name":"btspoony","email":"tech@btang.cn"}],"homepage":"https://github.com/42ch-dev/spoke","bugs":{"url":"https://github.com/42ch-dev/spoke/issues"},"dist":{"shasum":"6b84f6520a40650eac4803aae963aa38fff6463e","tarball":"https://registry.npmjs.org/@42ch/spoke-connect/-/spoke-connect-0.8.0.tgz","fileCount":17,"integrity":"sha512-8joz4vH47EsTQn1nW3+vumcibYn2ju+Aw8wFOGnfH/wvrdxs6t04XOGbBjhvuYBWRrVegLf1/SP3C/LQaiP91w==","signatures":[{"sig":"MEYCIQD2tu5CevGG3xoe3jYsPYRBgzBRCD6Sy6IOv8lJEGV/mwIhAK3Zw0WdyJ6xWYLgs3EExmjBwmxRth7E/RARx/EV5ttI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@42ch%2fspoke-connect@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":434801},"type":"module","_from":"file:42ch-spoke-connect-0.8.0.tgz","engines":{"node":">=20.19.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./node":{"import":{"types":"./dist/node/connect-client.d.ts","default":"./dist/node/connect-client.js"},"require":{"types":"./dist/node/connect-client.d.cts","default":"./dist/node/connect-client.cjs"}}},"scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:24cdbc35-9b97-44f8-919f-cd7ff0b9a307"}},"_resolved":"/home/runner/work/spoke/spoke/packages/spoke-connect-ts/42ch-spoke-connect-0.8.0.tgz","_integrity":"sha512-8joz4vH47EsTQn1nW3+vumcibYn2ju+Aw8wFOGnfH/wvrdxs6t04XOGbBjhvuYBWRrVegLf1/SP3C/LQaiP91w==","repository":{"url":"git+https://github.com/42ch-dev/spoke.git","type":"git","directory":"packages/spoke-connect-ts"},"_npmVersion":"11.16.0","description":"SPOKE connect client library — pure-TS identity derivation, Ed25519 hello signing, and RFC 8785 JCS canonicalization","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.1","canonicalize":"3.0.0","@noble/hashes":"^2.2.0","@noble/ed25519":"^3.1.0","@42ch/spoke-schemas":"0.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^3.0.0","@types/ws":"^8.18.1","typescript":"^5.3.0","@types/node":"^22.15.0"},"_npmOperationalInternal":{"tmp":"tmp/spoke-connect_0.8.0_1785768363770_0.4579404769661286","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@42ch/spoke-connect","version":"0.8.1","keywords":["spoke","connect","ed25519","jcs"],"license":"Apache-2.0","_id":"@42ch/spoke-connect@0.8.1","maintainers":[{"name":"btspoony","email":"tech@btang.cn"}],"homepage":"https://github.com/42ch-dev/spoke","bugs":{"url":"https://github.com/42ch-dev/spoke/issues"},"dist":{"shasum":"0c1e93fb3acf63fe6b77685b356374491e7d583a","tarball":"https://registry.npmjs.org/@42ch/spoke-connect/-/spoke-connect-0.8.1.tgz","fileCount":17,"integrity":"sha512-QlPCVF+JJxwLNSL+77uTtqVtixRro4Dqi3kDr61/Z9jsHqmOlsSH/GUyf+sy06VOtS04AqkK589CgI+XrCNnhw==","signatures":[{"sig":"MEQCICsa4NFcio+Vys5uUdDgjH39DNFlEt0UxEAK2naBRTWMAiAF7g9kSu8gEehWGl5smuUxmMkdNqTHUsHhuXcJ6h62sw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@42ch%2fspoke-connect@0.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":434801},"type":"module","_from":"file:42ch-spoke-connect-0.8.1.tgz","engines":{"node":">=20.19.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./node":{"import":{"types":"./dist/node/connect-client.d.ts","default":"./dist/node/connect-client.js"},"require":{"types":"./dist/node/connect-client.d.cts","default":"./dist/node/connect-client.cjs"}}},"scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:24cdbc35-9b97-44f8-919f-cd7ff0b9a307"}},"_resolved":"/home/runner/work/spoke/spoke/packages/spoke-connect-ts/42ch-spoke-connect-0.8.1.tgz","_integrity":"sha512-QlPCVF+JJxwLNSL+77uTtqVtixRro4Dqi3kDr61/Z9jsHqmOlsSH/GUyf+sy06VOtS04AqkK589CgI+XrCNnhw==","repository":{"url":"git+https://github.com/42ch-dev/spoke.git","type":"git","directory":"packages/spoke-connect-ts"},"_npmVersion":"11.16.0","description":"SPOKE connect client library — pure-TS identity derivation, Ed25519 hello signing, and RFC 8785 JCS canonicalization","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.1","canonicalize":"3.0.0","@noble/hashes":"^2.2.0","@noble/ed25519":"^3.1.0","@42ch/spoke-schemas":"0.8.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^3.0.0","@types/ws":"^8.18.1","typescript":"^5.3.0","@types/node":"^22.15.0"},"_npmOperationalInternal":{"tmp":"tmp/spoke-connect_0.8.1_1785772688946_0.35962255281662436","host":"s3://npm-registry-packages-npm-production"}},"0.8.2":{"name":"@42ch/spoke-connect","version":"0.8.2","keywords":["spoke","connect","ed25519","jcs"],"license":"Apache-2.0","_id":"@42ch/spoke-connect@0.8.2","maintainers":[{"name":"btspoony","email":"tech@btang.cn"}],"homepage":"https://github.com/42ch-dev/spoke","bugs":{"url":"https://github.com/42ch-dev/spoke/issues"},"dist":{"shasum":"2da4d6e6e4809c62fcf4b2efad25389241f9bc83","tarball":"https://registry.npmjs.org/@42ch/spoke-connect/-/spoke-connect-0.8.2.tgz","fileCount":17,"integrity":"sha512-Ua6uub4eY+HkfIuIc9GH8R3M3gtximxjfBJL160UN6d3szUEMjdumEuuRujt6aq44ZJm+5GW0CHos/u2qfIVww==","signatures":[{"sig":"MEQCIESBQ+spuGgTJGS0W6q8xdxqSLUehDEfLLkkujiT6nPXAiBHJHP3CUC2nFSvPzXfn7sA6hHFN3n6j3s4NDBDUl/R9g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@42ch%2fspoke-connect@0.8.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":434975},"type":"module","_from":"file:42ch-spoke-connect-0.8.2.tgz","engines":{"node":">=20.19.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./node":{"import":{"types":"./dist/node/connect-client.d.ts","default":"./dist/node/connect-client.js"},"require":{"types":"./dist/node/connect-client.d.cts","default":"./dist/node/connect-client.cjs"}}},"scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:24cdbc35-9b97-44f8-919f-cd7ff0b9a307"}},"_resolved":"/home/runner/work/spoke/spoke/packages/spoke-connect-ts/42ch-spoke-connect-0.8.2.tgz","_integrity":"sha512-Ua6uub4eY+HkfIuIc9GH8R3M3gtximxjfBJL160UN6d3szUEMjdumEuuRujt6aq44ZJm+5GW0CHos/u2qfIVww==","repository":{"url":"git+https://github.com/42ch-dev/spoke.git","type":"git","directory":"packages/spoke-connect-ts"},"_npmVersion":"11.16.0","description":"SPOKE connect client library — pure-TS identity derivation, Ed25519 hello signing, and RFC 8785 JCS canonicalization","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.1","canonicalize":"3.0.0","@noble/hashes":"^2.2.0","@noble/ed25519":"^3.1.0","@42ch/spoke-schemas":"0.8.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^3.0.0","@types/ws":"^8.18.1","typescript":"^5.3.0","@types/node":"^22.15.0"},"_npmOperationalInternal":{"tmp":"tmp/spoke-connect_0.8.2_1785776808913_0.8362250054756781","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@42ch/spoke-connect","version":"0.9.0","keywords":["spoke","connect","ed25519","jcs"],"license":"Apache-2.0","_id":"@42ch/spoke-connect@0.9.0","maintainers":[{"name":"btspoony","email":"tech@btang.cn"}],"homepage":"https://github.com/42ch-dev/spoke","bugs":{"url":"https://github.com/42ch-dev/spoke/issues"},"dist":{"shasum":"732cad31d2d2dd692aac5ccaec9f6b2f1fb9a522","tarball":"https://registry.npmjs.org/@42ch/spoke-connect/-/spoke-connect-0.9.0.tgz","fileCount":37,"integrity":"sha512-vTxHA/MdSaIzUJeZyk/pQmtYT0nRCqFASiIwYZxw/IxQXXZ/U0+yaIoaxS8UyUw9tKmsOB+TOy33GuuHQdjnXA==","signatures":[{"sig":"MEQCIAmGFme7NPjGEdK8e8stcRnkYVml//5IMcnlN8rhYb1/AiAHdxpYT4qF+yPZMIB1x4CC/4mazGvSQ3XUE4zEG1o/FQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@42ch%2fspoke-connect@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1200066},"type":"module","_from":"file:42ch-spoke-connect-0.9.0.tgz","engines":{"node":">=20.19.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./node":{"import":{"types":"./dist/node/connect-client.d.ts","default":"./dist/node/connect-client.js"},"require":{"types":"./dist/node/connect-client.d.cts","default":"./dist/node/connect-client.cjs"}},"./noise":{"import":{"types":"./dist/noise/index.d.ts","default":"./dist/noise/index.js"},"require":{"types":"./dist/noise/index.d.cts","default":"./dist/noise/index.cjs"}},"./remote":{"import":{"types":"./dist/remote/index.d.ts","default":"./dist/remote/index.js"},"require":{"types":"./dist/remote/index.d.cts","default":"./dist/remote/index.cjs"}}},"scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","test:dist":"node tests/dist-shape.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:24cdbc35-9b97-44f8-919f-cd7ff0b9a307"}},"_resolved":"/home/runner/work/spoke/spoke/packages/spoke-connect-ts/42ch-spoke-connect-0.9.0.tgz","_integrity":"sha512-vTxHA/MdSaIzUJeZyk/pQmtYT0nRCqFASiIwYZxw/IxQXXZ/U0+yaIoaxS8UyUw9tKmsOB+TOy33GuuHQdjnXA==","repository":{"url":"git+https://github.com/42ch-dev/spoke.git","type":"git","directory":"packages/spoke-connect-ts"},"_npmVersion":"11.16.0","description":"SPOKE connect client library — pure-TS identity derivation, Ed25519 hello signing, and RFC 8785 JCS canonicalization","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.1","canonicalize":"3.0.0","@noble/curves":"^2.2.0","@noble/hashes":"^2.2.0","@noble/ciphers":"^2.2.0","@noble/ed25519":"^3.1.0","@42ch/spoke-schemas":"0.9.0","@42ch/spoke-operations":"0.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^3.0.0","esbuild":"^0.28.1","@types/ws":"^8.18.1","typescript":"^5.3.0","@types/node":"^22.15.0","@42ch/spoke-fixture-toy-world":"0.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spoke-connect_0.9.0_1786008970756_0.5094082470289665","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"@42ch/spoke-connect","version":"0.9.1","keywords":["spoke","connect","ed25519","jcs"],"license":"Apache-2.0","_id":"@42ch/spoke-connect@0.9.1","maintainers":[{"name":"btspoony","email":"tech@btang.cn"}],"homepage":"https://github.com/42ch-dev/spoke","bugs":{"url":"https://github.com/42ch-dev/spoke/issues"},"dist":{"shasum":"ffad1935da6c514fa076be61c5ae5acdfe8bf230","tarball":"https://registry.npmjs.org/@42ch/spoke-connect/-/spoke-connect-0.9.1.tgz","fileCount":37,"integrity":"sha512-q9ydXW4sfXp0krsKBZhDZ4SgNNTuPQ/sLN9HOrrpGZlAdTOn+nza37RM2TScam6uOVlxC4VIsqGIZKHnokga+w==","signatures":[{"sig":"MEUCIQC60a8+ifEEqTNJaC7DcWr7AbuThIXPBYlZ3L0kWYyKywIgHQ8iumf1IjYUheM4mpr1AQAClr8AqGXQw2HKNYVA3pE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@42ch%2fspoke-connect@0.9.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1200066},"type":"module","_from":"file:42ch-spoke-connect-0.9.1.tgz","engines":{"node":">=20.19.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./node":{"import":{"types":"./dist/node/connect-client.d.ts","default":"./dist/node/connect-client.js"},"require":{"types":"./dist/node/connect-client.d.cts","default":"./dist/node/connect-client.cjs"}},"./noise":{"import":{"types":"./dist/noise/index.d.ts","default":"./dist/noise/index.js"},"require":{"types":"./dist/noise/index.d.cts","default":"./dist/noise/index.cjs"}},"./remote":{"import":{"types":"./dist/remote/index.d.ts","default":"./dist/remote/index.js"},"require":{"types":"./dist/remote/index.d.cts","default":"./dist/remote/index.cjs"}}},"scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","test:dist":"node tests/dist-shape.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:24cdbc35-9b97-44f8-919f-cd7ff0b9a307"}},"_resolved":"/home/runner/work/spoke/spoke/packages/spoke-connect-ts/42ch-spoke-connect-0.9.1.tgz","_integrity":"sha512-q9ydXW4sfXp0krsKBZhDZ4SgNNTuPQ/sLN9HOrrpGZlAdTOn+nza37RM2TScam6uOVlxC4VIsqGIZKHnokga+w==","repository":{"url":"git+https://github.com/42ch-dev/spoke.git","type":"git","directory":"packages/spoke-connect-ts"},"_npmVersion":"11.16.0","description":"SPOKE connect client library — pure-TS identity derivation, Ed25519 hello signing, and RFC 8785 JCS canonicalization","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.1","canonicalize":"3.0.0","@noble/curves":"^2.2.0","@noble/hashes":"^2.2.0","@noble/ciphers":"^2.2.0","@noble/ed25519":"^3.1.0","@42ch/spoke-schemas":"0.9.1","@42ch/spoke-operations":"0.9.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^3.0.0","esbuild":"^0.28.1","@types/ws":"^8.18.1","typescript":"^5.3.0","@types/node":"^22.15.0","@42ch/spoke-fixture-toy-world":"0.9.1"},"_npmOperationalInternal":{"tmp":"tmp/spoke-connect_0.9.1_1786026027178_0.1138570976961526","host":"s3://npm-registry-packages-npm-production"}},"0.9.2":{"name":"@42ch/spoke-connect","version":"0.9.2","keywords":["spoke","connect","ed25519","jcs"],"license":"Apache-2.0","_id":"@42ch/spoke-connect@0.9.2","maintainers":[{"name":"btspoony","email":"tech@btang.cn"}],"homepage":"https://github.com/42ch-dev/spoke","bugs":{"url":"https://github.com/42ch-dev/spoke/issues"},"dist":{"shasum":"d65e48eb51195bb1f279141f5661c56ccb8f6e50","tarball":"https://registry.npmjs.org/@42ch/spoke-connect/-/spoke-connect-0.9.2.tgz","fileCount":37,"integrity":"sha512-HMhC0FpFsGcD27jvryt1otSsTnuSUielD/rbLml7pTaylYMh7FROTaALEeIDAD5bDWHaCasM1gSGTfqADeWabA==","signatures":[{"sig":"MEYCIQDypBgNEo3923ogm96FbbhdEls4hOvfZyH9muosAWJzSwIhAPCusNrkkrZnOOQqWkSmMHacB3yt4dGLBU3wXUulYohQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@42ch%2fspoke-connect@0.9.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1200066},"type":"module","_from":"file:42ch-spoke-connect-0.9.2.tgz","engines":{"node":">=20.19.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./node":{"import":{"types":"./dist/node/connect-client.d.ts","default":"./dist/node/connect-client.js"},"require":{"types":"./dist/node/connect-client.d.cts","default":"./dist/node/connect-client.cjs"}},"./noise":{"import":{"types":"./dist/noise/index.d.ts","default":"./dist/noise/index.js"},"require":{"types":"./dist/noise/index.d.cts","default":"./dist/noise/index.cjs"}},"./remote":{"import":{"types":"./dist/remote/index.d.ts","default":"./dist/remote/index.js"},"require":{"types":"./dist/remote/index.d.cts","default":"./dist/remote/index.cjs"}}},"scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","test:dist":"node tests/dist-shape.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:24cdbc35-9b97-44f8-919f-cd7ff0b9a307"}},"_resolved":"/home/runner/work/spoke/spoke/packages/spoke-connect-ts/42ch-spoke-connect-0.9.2.tgz","_integrity":"sha512-HMhC0FpFsGcD27jvryt1otSsTnuSUielD/rbLml7pTaylYMh7FROTaALEeIDAD5bDWHaCasM1gSGTfqADeWabA==","repository":{"url":"git+https://github.com/42ch-dev/spoke.git","type":"git","directory":"packages/spoke-connect-ts"},"_npmVersion":"11.16.0","description":"SPOKE connect client library — pure-TS identity derivation, Ed25519 hello signing, and RFC 8785 JCS canonicalization","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.1","canonicalize":"3.0.0","@noble/curves":"^2.2.0","@noble/hashes":"^2.2.0","@noble/ciphers":"^2.2.0","@noble/ed25519":"^3.1.0","@42ch/spoke-schemas":"0.9.2","@42ch/spoke-operations":"0.9.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^3.0.0","esbuild":"^0.28.1","@types/ws":"^8.18.1","typescript":"^5.3.0","@types/node":"^22.15.0","@42ch/spoke-fixture-toy-world":"0.9.2"},"_npmOperationalInternal":{"tmp":"tmp/spoke-connect_0.9.2_1786105156172_0.2589282484824731","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@42ch/spoke-connect","version":"0.10.0","keywords":["spoke","connect","ed25519","jcs"],"license":"Apache-2.0","_id":"@42ch/spoke-connect@0.10.0","maintainers":[{"name":"btspoony","email":"tech@btang.cn"}],"homepage":"https://github.com/42ch-dev/spoke","bugs":{"url":"https://github.com/42ch-dev/spoke/issues"},"dist":{"shasum":"bb18d84c01685077d9cbca3bf01eb66fbd766d6f","tarball":"https://registry.npmjs.org/@42ch/spoke-connect/-/spoke-connect-0.10.0.tgz","fileCount":37,"integrity":"sha512-l9A0XOwuNUHguew7wnbRa4TrOVgptZ5ZcOQm+CBJOJW/9u9YdNiTYtSRNRsiuYlXjz7nscoaGKFyxyFhEAuNKA==","signatures":[{"sig":"MEUCIDeOCKQnlXeoUIoznSqo14QDxVE9w4wbNzPhLOfN38fcAiEA8wDf7BGrRZzVpp+un4FvSCZADgGv0mMTVJzrl1WLNYs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@42ch%2fspoke-connect@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1201930},"type":"module","_from":"file:42ch-spoke-connect-0.10.0.tgz","engines":{"node":">=20.19.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./node":{"import":{"types":"./dist/node/connect-client.d.ts","default":"./dist/node/connect-client.js"},"require":{"types":"./dist/node/connect-client.d.cts","default":"./dist/node/connect-client.cjs"}},"./noise":{"import":{"types":"./dist/noise/index.d.ts","default":"./dist/noise/index.js"},"require":{"types":"./dist/noise/index.d.cts","default":"./dist/noise/index.cjs"}},"./remote":{"import":{"types":"./dist/remote/index.d.ts","default":"./dist/remote/index.js"},"require":{"types":"./dist/remote/index.d.cts","default":"./dist/remote/index.cjs"}}},"scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","test:dist":"node tests/dist-shape.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:24cdbc35-9b97-44f8-919f-cd7ff0b9a307"}},"_resolved":"/home/runner/work/spoke/spoke/packages/spoke-connect-ts/42ch-spoke-connect-0.10.0.tgz","_integrity":"sha512-l9A0XOwuNUHguew7wnbRa4TrOVgptZ5ZcOQm+CBJOJW/9u9YdNiTYtSRNRsiuYlXjz7nscoaGKFyxyFhEAuNKA==","repository":{"url":"git+https://github.com/42ch-dev/spoke.git","type":"git","directory":"packages/spoke-connect-ts"},"_npmVersion":"11.16.0","description":"SPOKE connect client library — pure-TS identity derivation, Ed25519 hello signing, and RFC 8785 JCS canonicalization","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.1","canonicalize":"3.0.0","@noble/curves":"^2.2.0","@noble/hashes":"^2.2.0","@noble/ciphers":"^2.2.0","@noble/ed25519":"^3.1.0","@42ch/spoke-schemas":"0.10.0","@42ch/spoke-operations":"0.10.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^3.0.0","esbuild":"^0.28.1","@types/ws":"^8.18.1","typescript":"^5.3.0","@types/node":"^22.15.0","@42ch/spoke-fixture-toy-world":"0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/spoke-connect_0.10.0_1786684879037_0.03469849457674634","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@42ch/spoke-connect","version":"0.11.0","keywords":["spoke","connect","ed25519","jcs"],"license":"Apache-2.0","_id":"@42ch/spoke-connect@0.11.0","maintainers":[{"name":"btspoony","email":"tech@btang.cn"}],"homepage":"https://github.com/42ch-dev/spoke","bugs":{"url":"https://github.com/42ch-dev/spoke/issues"},"dist":{"shasum":"958ec939c4f9bd7cfb685c0ee7c88ebd639dbe18","tarball":"https://registry.npmjs.org/@42ch/spoke-connect/-/spoke-connect-0.11.0.tgz","fileCount":37,"integrity":"sha512-iji0LWB7L2hRsE1G+0eEW3hEYnAvl7yErWB5x0DFLetgiEsm/b+gMiVAPZ7SecsEQnMpgq9KP4iMbedXfIZmkA==","signatures":[{"sig":"MEUCIGHZIoPP6cckn1DhFCFYztsgxTHJyIROZVCtt1gDHgFeAiEAqHUnt3Xw+XA4JzCjfwkqq4p82i2M9LmbKkT1FpWcaWw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@42ch%2fspoke-connect@0.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1506037},"type":"module","_from":"file:42ch-spoke-connect-0.11.0.tgz","engines":{"node":">=20.19.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./node":{"import":{"types":"./dist/node/connect-client.d.ts","default":"./dist/node/connect-client.js"},"require":{"types":"./dist/node/connect-client.d.cts","default":"./dist/node/connect-client.cjs"}},"./noise":{"import":{"types":"./dist/noise/index.d.ts","default":"./dist/noise/index.js"},"require":{"types":"./dist/noise/index.d.cts","default":"./dist/noise/index.cjs"}},"./remote":{"import":{"types":"./dist/remote/index.d.ts","default":"./dist/remote/index.js"},"require":{"types":"./dist/remote/index.d.cts","default":"./dist/remote/index.cjs"}}},"scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","test:dist":"node tests/dist-shape.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:24cdbc35-9b97-44f8-919f-cd7ff0b9a307"}},"_resolved":"/home/runner/work/spoke/spoke/packages/spoke-connect-ts/42ch-spoke-connect-0.11.0.tgz","_integrity":"sha512-iji0LWB7L2hRsE1G+0eEW3hEYnAvl7yErWB5x0DFLetgiEsm/b+gMiVAPZ7SecsEQnMpgq9KP4iMbedXfIZmkA==","repository":{"url":"git+https://github.com/42ch-dev/spoke.git","type":"git","directory":"packages/spoke-connect-ts"},"_npmVersion":"11.17.0","description":"SPOKE connect client library — pure-TS identity derivation, Ed25519 hello signing, and RFC 8785 JCS canonicalization","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ws":"^8.18.1","canonicalize":"3.0.0","@noble/curves":"^2.2.0","@noble/hashes":"^2.2.0","@noble/ciphers":"^2.2.0","@noble/ed25519":"^3.1.0","@42ch/spoke-schemas":"0.11.0","@42ch/spoke-operations":"0.11.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^3.0.0","esbuild":"^0.28.1","@types/ws":"^8.18.1","typescript":"^5.3.0","@types/node":"^22.15.0","@42ch/spoke-fixture-toy-world":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/spoke-connect_0.11.0_1787044849023_0.1269680804735187","host":"s3://npm-registry-packages-npm-production"}},"0.11.1":{"name":"@42ch/spoke-connect","version":"0.11.1","description":"SPOKE connect client library — pure-TS identity derivation, Ed25519 hello signing, and RFC 8785 JCS canonicalization","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/42ch-dev/spoke.git","directory":"packages/spoke-connect-ts"},"homepage":"https://github.com/42ch-dev/spoke","publishConfig":{"access":"public"},"type":"module","engines":{"node":">=20.19.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./node":{"import":{"types":"./dist/node/connect-client.d.ts","default":"./dist/node/connect-client.js"},"require":{"types":"./dist/node/connect-client.d.cts","default":"./dist/node/connect-client.cjs"}},"./noise":{"import":{"types":"./dist/noise/index.d.ts","default":"./dist/noise/index.js"},"require":{"types":"./dist/noise/index.d.cts","default":"./dist/noise/index.cjs"}},"./remote":{"import":{"types":"./dist/remote/index.d.ts","default":"./dist/remote/index.js"},"require":{"types":"./dist/remote/index.d.cts","default":"./dist/remote/index.cjs"}}},"dependencies":{"@noble/ciphers":"^2.2.0","@noble/curves":"^2.2.0","@noble/ed25519":"^3.1.0","@noble/hashes":"^2.2.0","canonicalize":"3.0.0","ws":"^8.18.1","@42ch/spoke-operations":"0.11.1","@42ch/spoke-schemas":"0.11.1"},"devDependencies":{"@types/node":"^22.15.0","@types/ws":"^8.18.1","esbuild":"^0.28.1","tsup":"^8.0.0","typescript":"^5.3.0","vitest":"^3.0.0","@42ch/spoke-fixture-toy-world":"0.11.1"},"keywords":["spoke","connect","ed25519","jcs"],"scripts":{"typecheck":"tsc --noEmit","test":"vitest run","test:watch":"vitest","test:dist":"node tests/dist-shape.mjs","build":"tsup","clean":"rm -rf dist"},"_id":"@42ch/spoke-connect@0.11.1","bugs":{"url":"https://github.com/42ch-dev/spoke/issues"},"_integrity":"sha512-Kr+VLs4DImPHzePAY/nJSeV/VRVVcLZjVWJ+QYS/uybKiNXnzbgOFuflchqBxpd1qZhfg1PNkFbwxSYb0WvsqQ==","_resolved":"/home/runner/work/spoke/spoke/packages/spoke-connect-ts/42ch-spoke-connect-0.11.1.tgz","_from":"file:42ch-spoke-connect-0.11.1.tgz","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-Kr+VLs4DImPHzePAY/nJSeV/VRVVcLZjVWJ+QYS/uybKiNXnzbgOFuflchqBxpd1qZhfg1PNkFbwxSYb0WvsqQ==","shasum":"4538528155d41e6d5a45a5b947af28e5aeb4eab6","tarball":"https://registry.npmjs.org/@42ch/spoke-connect/-/spoke-connect-0.11.1.tgz","fileCount":37,"unpackedSize":1506037,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@42ch%2fspoke-connect@0.11.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHXFTi0rBPuBJvs2bYIsYpiYd35MqesPy173SmzDeSTDAiAajZcIqh5hg2I4ArW8EymfWKqkveUk7GHD5ZtTbKmzHg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:24cdbc35-9b97-44f8-919f-cd7ff0b9a307"}},"directories":{},"maintainers":[{"name":"btspoony","email":"tech@btang.cn"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/spoke-connect_0.11.1_1787046439506_0.9962641728498636"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-03T04:45:04.889Z","modified":"2026-08-18T09:47:20.111Z","0.0.0":"2026-08-03T04:45:05.148Z","0.7.1":"2026-08-03T05:44:45.425Z","0.8.0":"2026-08-03T14:46:03.934Z","0.8.1":"2026-08-03T15:58:09.151Z","0.8.2":"2026-08-03T17:06:49.052Z","0.9.0":"2026-08-06T09:36:10.886Z","0.9.1":"2026-08-06T14:20:27.351Z","0.9.2":"2026-08-07T12:19:16.300Z","0.10.0":"2026-08-14T05:21:19.221Z","0.11.0":"2026-08-18T09:20:49.304Z","0.11.1":"2026-08-18T09:47:19.681Z"},"bugs":{"url":"https://github.com/42ch-dev/spoke/issues"},"license":"Apache-2.0","homepage":"https://github.com/42ch-dev/spoke","keywords":["spoke","connect","ed25519","jcs"],"repository":{"type":"git","url":"git+https://github.com/42ch-dev/spoke.git","directory":"packages/spoke-connect-ts"},"description":"SPOKE connect client library — pure-TS identity derivation, Ed25519 hello signing, and RFC 8785 JCS canonicalization","maintainers":[{"name":"btspoony","email":"tech@btang.cn"}],"readme":"# @42ch/spoke-connect\n\nSPOKE connect client library (TypeScript) — peer identity derivation, Ed25519 hello signing, RFC 8785 JCS canonicalization, one-JSON-per-message WebSocket framing, and the pure session-core port (sequence, correlation, dispatch gate, nonce store, allowlist).\n\nPublished on npm as `@42ch/spoke-connect`; the version tracks the monorepo lockstep SemVer (asserted by `verify:version`, bumped by `release:bump`). The transport is a direct WebSocket ordered reliable stream using plain JSON + WebSocket framing; transport and crypto are dependency-light by design.\n\n## What it provides\n\n- **Identity** — `derivePeerIdFromEd25519Pubkey`: protobuf PublicKey → identity multihash `0x00` → base58btc. Ported from `tooling/connect-identity-proof/proof.mjs`; the normative formula lives in `.mstar/specs/spoke-connect.md` § Identity binding.\n- **Crypto** — Ed25519 sign/verify over raw 32-byte keys, WebCrypto primary with an `@noble/ed25519` fallback on the same code path; base64url without padding.\n- **JCS** — `canonicalHelloBytes(peerId, nonce, host, peerNonce?)`: RFC 8785 canonicalization of the signed hello object via the pinned `canonicalize` package — `{protocol_version, peer_id, nonce, host}` for the initiator hello (4 fields), plus `peer_nonce` for the responder hello (5 fields, dial binding). Absent optional members are omitted; only present members appear in the canonical object.\n- **Session core** (`src/core/`) — behavior port of `crates/spoke-connect/src/core/`: `OutboundSequence` / `InboundSequence` (start 0, exhaustion instead of wrap past `2^53−1`), response correlation (session_id / sequence / request_id echo), op dispatch gate (capability ⊆ negotiated, unknown op fails closed), per-sender `NonceStore`, fail-closed allowlist, thin `Session` helper, `PROTOCOL_VERSION`.\n- **Node client** (`src/node/`) — `connectClient({ url, identity, manifest, remotePubkey, allowlist })`: dials a WebSocket, performs the signed hello exchange, validates the session snapshot (peer binding, `initial_sequence` 0), then routes correlated invokes by `request_id` with bounded waits. Node-only because it uses `ws`; the isomorphic `src/` modules stay browser-swappable.\n\n**Golden-vector parity:** tests assert peer_id / JCS bytes / signature byte-identical to the Rust golden vectors. The golden hello vector has a single cross-language source of truth at `crates/spoke-connect/tests/fixtures/golden-hello.json`; this package loads its registered byte-identical copy (`tests/fixtures/golden-hello.json`) through the thin test-only loader `src/golden.ts` (not part of the package `exports` or npm `files`).\n\n## Install\n\n```bash\npnpm add @42ch/spoke-connect\n```\n\n## Usage\n\n```ts\nimport { derivePeerIdFromEd25519Pubkey } from \"@42ch/spoke-connect\";\nimport { connectClient } from \"@42ch/spoke-connect/node\";\n\nconst seed = new TextEncoder().encode(\"...\"); // 32-byte Ed25519 seed\nconst remotePubkey = /* the server's 32-byte Ed25519 public key */;\n\nconst client = await connectClient({\n  url: \"ws://127.0.0.1:8080\",\n  identity: { seed },\n  manifest: {\n    capabilities: [\"spoke-baseline\"],\n    extensions: {},\n    host_id: \"host_primary\",\n    namespaces: [\"toy_world\"],\n    roles: [\"data-store\"],\n    schema_version: 1,\n  },\n  remotePubkey,\n  allowlist: [derivePeerIdFromEd25519Pubkey(remotePubkey)],\n});\n\nconst response = await client.invoke(\"check\", { /* op payload */ });\nclient.close();\n```\n\nCore helpers are importable without the client: `signHelloEd25519` / `verifyHelloEd25519`, `OutboundSequence`, `checkResponseCorrelation`, `dispatchAllowed`, `NonceStore`, `isAllowlisted`, `Session` — all from `@42ch/spoke-connect`.\n\n## Test\n\nFrom the repo root:\n\n```bash\npnpm run test:connect-ts\n```\n\nFrom this directory:\n\n```bash\npnpm test\npnpm run typecheck\n```\n\nThe two-node interop test (`tests/two-node.test.ts`) runs an in-process `ws` server and client over `127.0.0.1:<ephemeral>` with bounded waits only. CI runs the suite on Node 20.x — Node ≥ 20.19 takes the WebCrypto Ed25519 path; older patches fall back to `@noble/ed25519`. The package engine floor is Node ≥ 20.19.0 (`@noble/hashes` floor, and the first Node line that accepts WebCrypto Ed25519).\n\n## Scope\n\n- Published on npm (`@42ch/spoke-connect`); ships a built `dist/` via tsup (dual CJS/ESM, two isolated entries — browser-safe `.` and Node `./node`).\n- The package consumes the existing connect schemas as-is (`@42ch/spoke-schemas` runtime dependency; types only from the consumer's perspective); the schema inventory is unchanged.\n- Envelope-level interop over any ordered reliable stream; framing is direct WebSocket per `.mstar/specs/spoke-connect.md` § Transport framing.\n- The client targets the direct ordered-stream transport.\n- `connectClient` lives in the Node `src/node/` subpath (uses `ws`); the isomorphic `src/` modules are browser-swappable with the native WebSocket.\n\n## Publishing\n\nPublished via the monorepo `release.yml` on stable lockstep tags (npm Trusted Publishing OIDC). The build emits `dist/` (tsup, dual CJS/ESM); the tarball is packed with pnpm (rewrites `workspace:*`) and published with the npm CLI.\n\n- **Entry points** — two subpaths: `.` (isomorphic core: identity, crypto, JCS, session core) and `./node` (the Node `connectClient`, which depends on `ws`). Browser consumers import `.` only.\n- **License** — Apache-2.0 via the `license` field; authoritative text at repository root `LICENSE`.\n- **Versioning** — lockstep SemVer with the monorepo (`verify:version`, `release:bump`); `@42ch/spoke-schemas` resolves at the same version from npm.\n- **Installation** — `pnpm add @42ch/spoke-connect` installs from the npm registry at the lockstep version.\n","readmeFilename":"README.md"}