agent-comms 2.18.2 → 2.18.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/dist/bridges/user/web/dist/bundle.js +1 -1
- package/dist/bridges/user/web/frontend/project-tree.js +3 -3
- package/dist/bridges/user/web/frontend/project-tree.js.map +1 -1
- package/dist/bridges/user/web/test/port-discovery.unit.test.js +10 -11
- package/dist/bridges/user/web/test/port-discovery.unit.test.js.map +1 -1
- package/dist/bridges/user/web/test/web-server.integration.test.js +12 -13
- package/dist/bridges/user/web/test/web-server.integration.test.js.map +1 -1
- package/dist/core/identity-store.d.ts.map +1 -1
- package/dist/core/identity-store.js +16 -5
- package/dist/core/identity-store.js.map +1 -1
- package/dist/core/identity.d.ts +6 -5
- package/dist/core/identity.d.ts.map +1 -1
- package/dist/core/identity.js +13 -11
- package/dist/core/identity.js.map +1 -1
- package/dist/core/test/bridge.unit.test.js +11 -12
- package/dist/core/test/bridge.unit.test.js.map +1 -1
- package/dist/core/test/identity.unit.test.js +21 -22
- package/dist/core/test/identity.unit.test.js.map +1 -1
- package/dist/test/approval.integration.test.js +52 -45
- package/dist/test/approval.integration.test.js.map +1 -1
- package/dist/test/become-coordinator-actual-port.integration.test.d.ts +0 -2
- package/dist/test/become-coordinator-actual-port.integration.test.d.ts.map +1 -1
- package/dist/test/become-coordinator-actual-port.integration.test.js +14 -39
- package/dist/test/become-coordinator-actual-port.integration.test.js.map +1 -1
- package/dist/test/bridge-mesh.test.js +9 -10
- package/dist/test/bridge-mesh.test.js.map +1 -1
- package/dist/test/broadcast-window.integration.test.js +4 -7
- package/dist/test/broadcast-window.integration.test.js.map +1 -1
- package/dist/test/coordinator-socket-error.integration.test.js +3 -4
- package/dist/test/coordinator-socket-error.integration.test.js.map +1 -1
- package/dist/test/create-room-mints-owner-grant.test.js +9 -8
- package/dist/test/create-room-mints-owner-grant.test.js.map +1 -1
- package/dist/test/create-room-name-sanitisation.test.js +6 -7
- package/dist/test/create-room-name-sanitisation.test.js.map +1 -1
- package/dist/test/dm-admission.integration.test.js +10 -11
- package/dist/test/dm-admission.integration.test.js.map +1 -1
- package/dist/test/federation.integration.test.js +21 -20
- package/dist/test/federation.integration.test.js.map +1 -1
- package/dist/test/filestore.test.js +16 -17
- package/dist/test/filestore.test.js.map +1 -1
- package/dist/test/handshake.test.js +26 -27
- package/dist/test/handshake.test.js.map +1 -1
- package/dist/test/identity-cert.test.js +3 -4
- package/dist/test/identity-cert.test.js.map +1 -1
- package/dist/test/identity-device-id.test.js +6 -7
- package/dist/test/identity-device-id.test.js.map +1 -1
- package/dist/test/identity-restart.integration.test.js +9 -10
- package/dist/test/identity-restart.integration.test.js.map +1 -1
- package/dist/test/identity-store.test.js +36 -21
- package/dist/test/identity-store.test.js.map +1 -1
- package/dist/test/listener-policy.integration.test.js +63 -56
- package/dist/test/listener-policy.integration.test.js.map +1 -1
- package/dist/test/mcp-registry-retry.test.js +10 -11
- package/dist/test/mcp-registry-retry.test.js.map +1 -1
- package/dist/test/mesh-e2e.integration.test.js +26 -19
- package/dist/test/mesh-e2e.integration.test.js.map +1 -1
- package/dist/test/presence-readvertise.integration.test.js +5 -6
- package/dist/test/presence-readvertise.integration.test.js.map +1 -1
- package/dist/test/random-id.test.js +3 -4
- package/dist/test/random-id.test.js.map +1 -1
- package/dist/test/room-admission-tool-actions.test.js +20 -15
- package/dist/test/room-admission-tool-actions.test.js.map +1 -1
- package/dist/test/room-destroy-revocation.integration.test.js +3 -4
- package/dist/test/room-destroy-revocation.integration.test.js.map +1 -1
- package/dist/test/room-invite-directed.integration.test.js +13 -12
- package/dist/test/room-invite-directed.integration.test.js.map +1 -1
- package/dist/test/room-join-admission.test.js +31 -24
- package/dist/test/room-join-admission.test.js.map +1 -1
- package/dist/test/room-kick-revocation.integration.test.js +5 -6
- package/dist/test/room-kick-revocation.integration.test.js.map +1 -1
- package/dist/test/room-leave-revocation.integration.test.js +10 -9
- package/dist/test/room-leave-revocation.integration.test.js.map +1 -1
- package/dist/test/room-path.test.js +16 -17
- package/dist/test/room-path.test.js.map +1 -1
- package/dist/test/room-read-directed.integration.test.js +14 -11
- package/dist/test/room-read-directed.integration.test.js.map +1 -1
- package/dist/test/room-router.test.js +27 -29
- package/dist/test/room-router.test.js.map +1 -1
- package/dist/test/room-send-directed.integration.test.js +11 -12
- package/dist/test/room-send-directed.integration.test.js.map +1 -1
- package/dist/test/room-send-retry-queue.test.js +10 -11
- package/dist/test/room-send-retry-queue.test.js.map +1 -1
- package/dist/test/room-send-retry.integration.test.js +5 -8
- package/dist/test/room-send-retry.integration.test.js.map +1 -1
- package/dist/test/room-state-sync.integration.test.js +18 -15
- package/dist/test/room-state-sync.integration.test.js.map +1 -1
- package/dist/test/room-token-store.test.js +21 -22
- package/dist/test/room-token-store.test.js.map +1 -1
- package/dist/test/room-token-verification.test.js +19 -20
- package/dist/test/room-token-verification.test.js.map +1 -1
- package/dist/test/state-sync-convergence.test.js +25 -26
- package/dist/test/state-sync-convergence.test.js.map +1 -1
- package/dist/test/visibility.integration.test.js +48 -49
- package/dist/test/visibility.integration.test.js.map +1 -1
- package/dist/test/wire-mesh-identity.test.js +7 -8
- package/dist/test/wire-mesh-identity.test.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/core/identity.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/core/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,UAAU,EACV,eAAe,EACf,UAAU,EACV,mBAAmB,EACnB,WAAW,GACZ,MAAM,aAAa,CAAC;AAErB,sIAAsI;AACtI,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAEpC,+EAA+E;AAE/E,wGAAwG;AACxG,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAejE,8EAA8E;AAE9E,iCAAiC;AACjC,SAAS,SAAS,CAAC,MAAc;IAC/B,IAAI,MAAM,GAAG,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAChD,IAAI,MAAM,GAAG,KAAK;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,uCAAuC;AACvC,SAAS,OAAO,CAAC,GAAW,EAAE,OAAe;IAC3C,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAClB,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;QACzB,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED,oBAAoB;AACpB,SAAS,WAAW,CAAC,GAAG,KAAe;IACrC,OAAO,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,eAAe;AACf,SAAS,MAAM,CAAC,GAAG,KAAe;IAChC,OAAO,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,wDAAwD;AACxD,SAAS,MAAM,CAAC,GAAW;IACzB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,KAAK,GAAa,CAAC,EAAE,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;QAC3B,KAAK,KAAK,CAAC,CAAC;QACZ,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;YACpC,KAAK,KAAK,CAAC,CAAC;QACd,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,sBAAsB;AACtB,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,8EAA8E;AAC9E,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,GAAG,IAAI,EAAE,CAAC;QAChD,OAAO,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,qDAAqD;AACrD,SAAS,YAAY,CAAC,OAAe;IACnC,OAAO,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,wBAAwB;AACxB,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,mBAAmB;AACnB,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,qDAAqD;AACrD,SAAS,UAAU,CAAC,IAAU;IAC5B,MAAM,GAAG,GAAG;QACV,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC7C,GAAG;KACJ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,OAAO,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,+EAA+E;AAE/E,8CAA8C;AAC9C,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AACpD,6BAA6B;AAC7B,MAAM,MAAM,GAAG,SAAS,CAAC;AACzB,wCAAwC;AACxC,MAAM,OAAO,GAAG,WAAW,CAAC;AAC5B,0CAA0C;AAC1C,MAAM,OAAO,GAAG,WAAW,CAAC;AAC5B,mCAAmC;AACnC,MAAM,qBAAqB,GAAG,WAAW,CAAC;AAE1C,+EAA+E;AAE/E;;;;;GAKG;AACH,SAAS,mBAAmB,CAC1B,cAAsB,EACtB,kBAA0B,EAC1B,SAAiB;IAEjB,OAAO,WAAW,CAChB,cAAc,EACd,kBAAkB,EAClB,YAAY,CAAC,SAAS,CAAC,CACxB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,mBAAmB,CAC1B,MAAc,EACd,kBAA0B,EAC1B,aAAqB,EACrB,QAAgB,EAChB,uBAA+B,EAC/B,UAAkB;IAElB,uDAAuD;IACvD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjE,OAAO,WAAW,CAChB,OAAO,EACP,eAAe,CAAC,MAAM,CAAC,EACvB,kBAAkB,EAClB,aAAa,EAAE,SAAS;IACxB,QAAQ,EACR,aAAa,EAAE,2CAA2C;IAC1D,uBAAuB,EACvB,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,CACvC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,YAAoB;IAC3C,yBAAyB;IACzB,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7D,MAAM,YAAY,GAAG,WAAW,CAC9B,MAAM,CAAC,OAAO,CAAC,EACf,cAAc,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CACpC,CAAC;IAEF,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,WAAW,CAC1B,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU;IAC5D,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAC3C,CAAC;IACF,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE5E,yCAAyC;IACzC,MAAM,WAAW,GAAG,WAAW,CAC7B,MAAM,CAAC,qBAAqB,CAAC,EAC7B,UAAU,CAAC,IAAI,CAAC,EAAE,WAAW;IAC7B,cAAc,CAAC,WAAW,EAAE,CAAC,CAC9B,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,4HAA4H;IAC5H,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,EAAE;QACxC,UAAU,EAAE,OAAO;QACnB,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;QAClD,kBAAkB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;KACrD,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,aAAqB;IAClD,MAAM,YAAY,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;QACzD,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IAEH,0EAA0E;IAC1E,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC;SACrC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;SACvB,MAAM,EAAE;SACR,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,eAAe,KAAK,SAAS;QAAE,MAAM,CAAC,CAAC,CAAC,GAAG,eAAe,GAAG,IAAI,CAAC;IACtE,kUAAkU;IAClU,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAEnC,gEAAgE;IAChE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,uBAAuB,CAAC,CAAC;IAElE,oEAAoE;IACpE,MAAM,OAAO,GAAG,WAAW,CACzB,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAClE,CAAC;IAEF,yCAAyC;IACzC,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAE7D,WAAW;IACX,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAEnE,aAAa;IACb,MAAM,UAAU,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAEjD,iBAAiB;IACjB,MAAM,OAAO,GAAG,mBAAmB,CACjC,MAAM,EACN,SAAS,EACT,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,UAAU,CACX,CAAC;IAEF,0BAA0B;IAC1B,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAE7C,gCAAgC;IAChC,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAEnE,aAAa;IACb,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAEjD,OAAO;QACL,UAAU,EAAE,aAAa;QACzB,WAAW;QACX,WAAW,EAAE,yBAAyB,CAAC,WAAW,CAAC;QACnD,QAAQ,EAAE,cAAc,CAAC,aAAa,CAAC;KACxC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,WAAmB;IAC3D,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAClC,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACzE,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,+EAA+E;AAE/E,yDAAyD;AACzD,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,GAAG,GAAG,GAAG;SACZ,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC;SAC1C,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC;SACxC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtB,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,6NAA6N;AAC7N,MAAM,UAAU,0BAA0B,CAAC,aAAqB;IAC9D,MAAM,SAAS,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,IAAI,GAAG,CAAC,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,CAAC,sBAAsB,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC;KAChC,CAAC,CAAC;AACL,CAAC;AAED,oIAAoI;AACpI,MAAM,UAAU,cAAc,CAAC,aAAqB;IAClD,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,0BAA0B,CAAC,aAAa,CAAC,CAAC;SACjD,MAAM,EAAE,CAAC;AACd,CAAC;AAED,oDAAoD;AACpD,SAAS,mBAAmB,CAAC,GAAW;IACtC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,GAAG,IAAI,EAAE,CAAC;IACxB,OAAO;QACL,6BAA6B;QAC7B,GAAG,KAAK;QACR,2BAA2B;QAC3B,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Unit tests for bridge.ts — formatDeliveryEvent.
|
|
3
3
|
*/
|
|
4
|
-
import { describe, it } from "
|
|
5
|
-
import assert from "node:assert/strict";
|
|
4
|
+
import { describe, it, expect } from "vitest";
|
|
6
5
|
import { formatDeliveryEvent, isActionableEvent } from "../bridge.js";
|
|
7
6
|
describe("formatDeliveryEvent", () => {
|
|
8
7
|
it("formats name_changed event", () => {
|
|
@@ -13,7 +12,7 @@ describe("formatDeliveryEvent", () => {
|
|
|
13
12
|
newName: "Bob",
|
|
14
13
|
};
|
|
15
14
|
const result = formatDeliveryEvent(event);
|
|
16
|
-
|
|
15
|
+
expect(result).toBe("Alice is now known as Bob");
|
|
17
16
|
});
|
|
18
17
|
it("formats room_message", () => {
|
|
19
18
|
const event = {
|
|
@@ -28,7 +27,7 @@ describe("formatDeliveryEvent", () => {
|
|
|
28
27
|
},
|
|
29
28
|
};
|
|
30
29
|
const result = formatDeliveryEvent(event);
|
|
31
|
-
|
|
30
|
+
expect(result).toBe("[r1] a1: hello");
|
|
32
31
|
});
|
|
33
32
|
it("formats member_status", () => {
|
|
34
33
|
const event = {
|
|
@@ -38,7 +37,7 @@ describe("formatDeliveryEvent", () => {
|
|
|
38
37
|
status: "busy",
|
|
39
38
|
};
|
|
40
39
|
const result = formatDeliveryEvent(event);
|
|
41
|
-
|
|
40
|
+
expect(result).toBe("a1 is now busy in r1");
|
|
42
41
|
});
|
|
43
42
|
});
|
|
44
43
|
describe("isActionableEvent", () => {
|
|
@@ -54,7 +53,7 @@ describe("isActionableEvent", () => {
|
|
|
54
53
|
readBy: [],
|
|
55
54
|
},
|
|
56
55
|
};
|
|
57
|
-
|
|
56
|
+
expect(isActionableEvent(event)).toBe(true);
|
|
58
57
|
});
|
|
59
58
|
it("classifies dm as actionable", () => {
|
|
60
59
|
const event = {
|
|
@@ -68,7 +67,7 @@ describe("isActionableEvent", () => {
|
|
|
68
67
|
readBy: [],
|
|
69
68
|
},
|
|
70
69
|
};
|
|
71
|
-
|
|
70
|
+
expect(isActionableEvent(event)).toBe(true);
|
|
72
71
|
});
|
|
73
72
|
it("classifies room_invite as actionable", () => {
|
|
74
73
|
const event = {
|
|
@@ -79,7 +78,7 @@ describe("isActionableEvent", () => {
|
|
|
79
78
|
fromName: "Alice",
|
|
80
79
|
fromCwd: "/home",
|
|
81
80
|
};
|
|
82
|
-
|
|
81
|
+
expect(isActionableEvent(event)).toBe(true);
|
|
83
82
|
});
|
|
84
83
|
it("classifies member_joined as informational", () => {
|
|
85
84
|
const event = {
|
|
@@ -87,7 +86,7 @@ describe("isActionableEvent", () => {
|
|
|
87
86
|
room: "r1",
|
|
88
87
|
agent: "a1",
|
|
89
88
|
};
|
|
90
|
-
|
|
89
|
+
expect(isActionableEvent(event)).toBe(false);
|
|
91
90
|
});
|
|
92
91
|
it("classifies member_status as informational", () => {
|
|
93
92
|
const event = {
|
|
@@ -96,7 +95,7 @@ describe("isActionableEvent", () => {
|
|
|
96
95
|
agent: "a1",
|
|
97
96
|
status: "offline",
|
|
98
97
|
};
|
|
99
|
-
|
|
98
|
+
expect(isActionableEvent(event)).toBe(false);
|
|
100
99
|
});
|
|
101
100
|
it("classifies name_changed as informational", () => {
|
|
102
101
|
const event = {
|
|
@@ -105,7 +104,7 @@ describe("isActionableEvent", () => {
|
|
|
105
104
|
oldName: "Alice",
|
|
106
105
|
newName: "Bob",
|
|
107
106
|
};
|
|
108
|
-
|
|
107
|
+
expect(isActionableEvent(event)).toBe(false);
|
|
109
108
|
});
|
|
110
109
|
it("classifies delivery_status as informational", () => {
|
|
111
110
|
const event = {
|
|
@@ -114,7 +113,7 @@ describe("isActionableEvent", () => {
|
|
|
114
113
|
agent: "a1",
|
|
115
114
|
status: "delivered",
|
|
116
115
|
};
|
|
117
|
-
|
|
116
|
+
expect(isActionableEvent(event)).toBe(false);
|
|
118
117
|
});
|
|
119
118
|
});
|
|
120
119
|
//# sourceMappingURL=bridge.unit.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.unit.test.js","sourceRoot":"","sources":["../../../src/core/test/bridge.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"bridge.unit.test.js","sourceRoot":"","sources":["../../../src/core/test/bridge.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,70 +1,69 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Unit tests for identity.ts — cryptographic identity generation.
|
|
3
3
|
*/
|
|
4
|
-
import { describe, it } from "
|
|
5
|
-
import assert from "node:assert/strict";
|
|
4
|
+
import { describe, it, expect } from "vitest";
|
|
6
5
|
import { X509Certificate } from "node:crypto";
|
|
7
6
|
import { generateIdentity, getCertificateFingerprint } from "../identity.js";
|
|
8
7
|
describe("generateIdentity", () => {
|
|
9
8
|
it("returns a valid PeerIdentity with all required fields", () => {
|
|
10
9
|
const identity = generateIdentity();
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
expect(identity.privateKey, "private key should be present").toBeTruthy();
|
|
11
|
+
expect(identity.certificate, "certificate should be present").toBeTruthy();
|
|
12
|
+
expect(identity.fingerprint, "fingerprint should be present").toBeTruthy();
|
|
14
13
|
});
|
|
15
14
|
it("produces a valid PEM-encoded private key", () => {
|
|
16
15
|
const { privateKey } = generateIdentity();
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
expect(privateKey, "private key should start with PEM header").toMatch(/^-----BEGIN PRIVATE KEY-----/);
|
|
17
|
+
expect(privateKey, "private key should end with PEM footer").toMatch(/-----END PRIVATE KEY-----\n?$/);
|
|
19
18
|
});
|
|
20
19
|
it("produces a valid PEM-encoded certificate", () => {
|
|
21
20
|
const { certificate } = generateIdentity();
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
expect(certificate, "certificate should start with PEM header").toMatch(/^-----BEGIN CERTIFICATE-----/);
|
|
22
|
+
expect(certificate, "certificate should end with PEM footer").toMatch(/-----END CERTIFICATE-----\n?$/);
|
|
24
23
|
});
|
|
25
24
|
it("produces a fingerprint that is a 95-character SHA-256 hex string with colons", () => {
|
|
26
25
|
const { fingerprint } = generateIdentity();
|
|
27
26
|
// SHA-256 = 32 bytes = 64 hex chars + 31 colons = 95 chars
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
expect(fingerprint.length).toBe(95);
|
|
28
|
+
expect(fingerprint, "fingerprint should be hex pairs separated by colons").toMatch(/^[0-9A-F]{2}(:[0-9A-F]{2}){31}$/);
|
|
30
29
|
});
|
|
31
30
|
it("produces a fingerprint that matches Node's own X509Certificate.fingerprint256", () => {
|
|
32
31
|
const { certificate, fingerprint } = generateIdentity();
|
|
33
32
|
const x509 = new X509Certificate(certificate);
|
|
34
|
-
|
|
33
|
+
expect(fingerprint).toBe(x509.fingerprint256);
|
|
35
34
|
});
|
|
36
35
|
it("produces a certificate that is valid and self-signed", () => {
|
|
37
36
|
const { certificate } = generateIdentity();
|
|
38
37
|
const x509 = new X509Certificate(certificate);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
expect(x509.subject).toBe("CN=agent-comms");
|
|
39
|
+
expect(x509.issuer).toBe("CN=agent-comms");
|
|
40
|
+
expect(x509.verify(x509.publicKey), "certificate should verify against its own public key").toBeTruthy();
|
|
42
41
|
});
|
|
43
42
|
it("includes localhost and 127.0.0.1 in Subject Alternative Names", () => {
|
|
44
43
|
const { certificate } = generateIdentity();
|
|
45
44
|
const x509 = new X509Certificate(certificate);
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
expect(x509.checkHost("localhost"), "should match DNS:localhost").toBeTruthy();
|
|
46
|
+
expect(x509.checkIP("127.0.0.1"), "should match IP:127.0.0.1").toBeTruthy();
|
|
48
47
|
});
|
|
49
48
|
it("produces different fingerprints on successive calls (different keypairs)", () => {
|
|
50
49
|
const a = generateIdentity();
|
|
51
50
|
const b = generateIdentity();
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
expect(a.fingerprint).not.toBe(b.fingerprint);
|
|
52
|
+
expect(a.privateKey).not.toBe(b.privateKey);
|
|
53
|
+
expect(a.certificate).not.toBe(b.certificate);
|
|
55
54
|
});
|
|
56
55
|
});
|
|
57
56
|
describe("getCertificateFingerprint", () => {
|
|
58
57
|
it("is deterministic — same cert always produces same fingerprint", () => {
|
|
59
58
|
const { certificate, fingerprint } = generateIdentity();
|
|
60
59
|
const recomputed = getCertificateFingerprint(certificate);
|
|
61
|
-
|
|
60
|
+
expect(recomputed).toBe(fingerprint);
|
|
62
61
|
});
|
|
63
62
|
it("produces the same result when called multiple times", () => {
|
|
64
63
|
const { certificate } = generateIdentity();
|
|
65
64
|
const first = getCertificateFingerprint(certificate);
|
|
66
65
|
const second = getCertificateFingerprint(certificate);
|
|
67
|
-
|
|
66
|
+
expect(first).toBe(second);
|
|
68
67
|
});
|
|
69
68
|
});
|
|
70
69
|
//# sourceMappingURL=identity.unit.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.unit.test.js","sourceRoot":"","sources":["../../../src/core/test/identity.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"identity.unit.test.js","sourceRoot":"","sources":["../../../src/core/test/identity.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,7 @@
|
|
|
6
6
|
* established or torn down accordingly.
|
|
7
7
|
*/
|
|
8
8
|
import * as net from "node:net";
|
|
9
|
-
import
|
|
10
|
-
import { test, describe } from "node:test";
|
|
9
|
+
import { test, describe, expect } from "vitest";
|
|
11
10
|
import { createTlsTransport } from "wire-mesh-core/adapters/tls-transport";
|
|
12
11
|
import { acceptMeshSession } from "wire-mesh-core/domain/mesh-session";
|
|
13
12
|
import { MeshStore } from "../core/mesh-store.js";
|
|
@@ -37,7 +36,7 @@ function sleep(ms) {
|
|
|
37
36
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
38
37
|
}
|
|
39
38
|
describe("connection approval", () => {
|
|
40
|
-
|
|
39
|
+
test("coordinator receives connection_request from connecting peer", async () => {
|
|
41
40
|
const portA = await uniquePort();
|
|
42
41
|
const portB = await uniquePort();
|
|
43
42
|
// Set up coordinator (store A)
|
|
@@ -77,19 +76,19 @@ describe("connection approval", () => {
|
|
|
77
76
|
// Wait for the coordinator to receive the request
|
|
78
77
|
await waitFor(() => receivedRequests.length === 1, "coordinator receives the connection request");
|
|
79
78
|
// Coordinator should have received a connection_request event
|
|
80
|
-
|
|
79
|
+
expect(receivedRequests.length, "Coordinator should receive exactly one connection request").toBe(1);
|
|
81
80
|
const request = receivedRequests[0];
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
81
|
+
expect(request?.type).toBe("connection_request");
|
|
82
|
+
expect(request?.connectionId, "Request should have a connectionId").toBeTruthy();
|
|
83
|
+
expect(request?.peerId, "Request should contain connector's peer ID").toBe(storeB.peerId);
|
|
84
|
+
expect(request?.name, "Request should contain connector's name").toBe("connector");
|
|
86
85
|
}
|
|
87
86
|
finally {
|
|
88
87
|
await storeB.shutdown();
|
|
89
88
|
await storeA.shutdown();
|
|
90
89
|
}
|
|
91
90
|
});
|
|
92
|
-
|
|
91
|
+
test("accept establishes the peer connection", async () => {
|
|
93
92
|
const portA = await uniquePort();
|
|
94
93
|
const portB = await uniquePort();
|
|
95
94
|
const storeA = new MeshStore(portA);
|
|
@@ -125,7 +124,9 @@ describe("connection approval", () => {
|
|
|
125
124
|
storeB.connectToRemote("127.0.0.1", portA);
|
|
126
125
|
await waitFor(() => receivedRequests.length === 1, "coordinator receives the connection request");
|
|
127
126
|
const request = receivedRequests[0];
|
|
128
|
-
|
|
127
|
+
expect(request?.connectionId).toBeTruthy();
|
|
128
|
+
if (request === undefined)
|
|
129
|
+
throw new Error("expected a pending connection request");
|
|
129
130
|
// Accept the connection
|
|
130
131
|
await storeA.acceptConnection(request.connectionId);
|
|
131
132
|
// State sync (peer_list -> connectToPeer -> state_sync -> handlePeerConnected) is a real TLS round trip, not instantaneous -- poll rather than assume any fixed delay is enough under a loaded CI runner.
|
|
@@ -133,15 +134,15 @@ describe("connection approval", () => {
|
|
|
133
134
|
await waitFor(() => storeB.serialise().agents[storeA.peerId] !== undefined, "connector sees the coordinator agent");
|
|
134
135
|
const agentsA = await storeA.listAgents(storeA.peerId);
|
|
135
136
|
const agentsB = await storeB.listAgents(storeB.peerId);
|
|
136
|
-
|
|
137
|
-
|
|
137
|
+
expect(agentsA.some((a) => a.id === storeB.peerId), "Coordinator should see the connector agent").toBeTruthy();
|
|
138
|
+
expect(agentsB.some((a) => a.id === storeA.peerId), "Connector should see the coordinator agent").toBeTruthy();
|
|
138
139
|
}
|
|
139
140
|
finally {
|
|
140
141
|
await storeB.shutdown();
|
|
141
142
|
await storeA.shutdown();
|
|
142
143
|
}
|
|
143
144
|
});
|
|
144
|
-
|
|
145
|
+
test("reject closes with reason", async () => {
|
|
145
146
|
const portA = await uniquePort();
|
|
146
147
|
const portB = await uniquePort();
|
|
147
148
|
const storeA = new MeshStore(portA);
|
|
@@ -176,23 +177,25 @@ describe("connection approval", () => {
|
|
|
176
177
|
});
|
|
177
178
|
storeB.connectToRemote("127.0.0.1", portA);
|
|
178
179
|
await waitFor(() => receivedRequests.length === 1, "coordinator receives the connection request");
|
|
179
|
-
|
|
180
|
+
expect(receivedRequests.length, "Coordinator should receive a connection request").toBe(1);
|
|
180
181
|
const request = receivedRequests[0];
|
|
181
|
-
|
|
182
|
+
expect(request?.connectionId).toBeTruthy();
|
|
183
|
+
if (request === undefined)
|
|
184
|
+
throw new Error("expected a pending connection request");
|
|
182
185
|
// Reject the connection
|
|
183
186
|
await storeA.rejectConnection(request.connectionId, "unauthorised");
|
|
184
187
|
// Give the rejection time to propagate -- there is no positive event to poll for here (the assertion below proves an absence), so a fixed wait is the right shape, unlike the accept-flow tests above.
|
|
185
188
|
await sleep(200);
|
|
186
189
|
// Verify the coordinator no longer sees the connector agent
|
|
187
190
|
const agentsA = await storeA.listAgents(storeA.peerId);
|
|
188
|
-
|
|
191
|
+
expect(!agentsA.some((a) => a.id === storeB.peerId), "Rejected peer should not appear in agent list").toBeTruthy();
|
|
189
192
|
}
|
|
190
193
|
finally {
|
|
191
194
|
await storeB.shutdown();
|
|
192
195
|
await storeA.shutdown();
|
|
193
196
|
}
|
|
194
197
|
});
|
|
195
|
-
|
|
198
|
+
test("connect_request expires and is auto-rejected if left unanswered past the configured timeout", async () => {
|
|
196
199
|
const portA = await uniquePort();
|
|
197
200
|
const portB = await uniquePort();
|
|
198
201
|
const SHORT_PENDING_CONNECTION_TIMEOUT_MS = 300;
|
|
@@ -229,20 +232,22 @@ describe("connection approval", () => {
|
|
|
229
232
|
storeB.connectToRemote("127.0.0.1", portA);
|
|
230
233
|
await waitFor(() => receivedRequests.length === 1, "coordinator receives the connection request");
|
|
231
234
|
const request = receivedRequests[0];
|
|
232
|
-
|
|
235
|
+
expect(request?.connectionId).toBeTruthy();
|
|
236
|
+
if (request === undefined)
|
|
237
|
+
throw new Error("expected a pending connection request");
|
|
233
238
|
// No accept/reject call at all -- wait past the configured timeout with the request left untouched.
|
|
234
239
|
await sleep(SHORT_PENDING_CONNECTION_TIMEOUT_MS + 500);
|
|
235
240
|
// The strongest available proof the entry actually expired (not merely "still pending, not yet an agent," which would be equally true before any decision): acceptConnection on an expired request must fail exactly the way it fails for any other unknown handle, since expirePendingConnection has already deleted it.
|
|
236
|
-
await
|
|
241
|
+
await expect(storeA.acceptConnection(request.connectionId), "An expired connect_request should no longer be acceptable").rejects.toThrow(/No pending connection/);
|
|
237
242
|
const agentsA = await storeA.listAgents(storeA.peerId);
|
|
238
|
-
|
|
243
|
+
expect(!agentsA.some((a) => a.id === storeB.peerId), "An expired, auto-rejected peer should not appear in agent list").toBeTruthy();
|
|
239
244
|
}
|
|
240
245
|
finally {
|
|
241
246
|
await storeB.shutdown();
|
|
242
247
|
await storeA.shutdown();
|
|
243
248
|
}
|
|
244
249
|
});
|
|
245
|
-
|
|
250
|
+
test("mesh_pending lists pending connections", async () => {
|
|
246
251
|
const portA = await uniquePort();
|
|
247
252
|
const portB = await uniquePort();
|
|
248
253
|
const storeA = new MeshStore(portA);
|
|
@@ -272,18 +277,20 @@ describe("connection approval", () => {
|
|
|
272
277
|
});
|
|
273
278
|
// No pending connections initially
|
|
274
279
|
let pending = storeA.listPendingConnections();
|
|
275
|
-
|
|
280
|
+
expect(pending.length, "Should have no pending connections initially").toBe(0);
|
|
276
281
|
// Initiate connection request
|
|
277
282
|
storeB.connectToRemote("127.0.0.1", portA);
|
|
278
283
|
await waitFor(() => storeA.listPendingConnections().length === 1, "coordinator sees the pending connection");
|
|
279
284
|
// Should now have one pending connection
|
|
280
285
|
pending = storeA.listPendingConnections();
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
286
|
+
expect(pending.length, "Should have one pending connection").toBe(1);
|
|
287
|
+
expect(pending[0]?.name, "Pending connection should show connector name").toBe("connector");
|
|
288
|
+
expect(pending[0]?.peerId, "Pending connection should show connector peer ID").toBe(storeB.peerId);
|
|
284
289
|
// Accept to clean up
|
|
285
290
|
const connectionId = pending[0]?.connectionId;
|
|
286
|
-
|
|
291
|
+
expect(connectionId).toBeTruthy();
|
|
292
|
+
if (connectionId === undefined)
|
|
293
|
+
throw new Error("expected a connection id");
|
|
287
294
|
await storeA.acceptConnection(connectionId);
|
|
288
295
|
// No more pending connections after acceptance
|
|
289
296
|
await waitFor(() => storeA.listPendingConnections().length === 0, "pending connection is cleared after accept");
|
|
@@ -295,7 +302,7 @@ describe("connection approval", () => {
|
|
|
295
302
|
await storeA.shutdown();
|
|
296
303
|
}
|
|
297
304
|
});
|
|
298
|
-
|
|
305
|
+
test("tool handles mesh_connect/mesh_accept/mesh_reject/mesh_pending actions", async () => {
|
|
299
306
|
const portA = await uniquePort();
|
|
300
307
|
const portB = await uniquePort();
|
|
301
308
|
const storeA = new MeshStore(portA);
|
|
@@ -335,8 +342,8 @@ describe("connection approval", () => {
|
|
|
335
342
|
await sleep(200);
|
|
336
343
|
// Verify coordinator is listening
|
|
337
344
|
const listeners = storeA.listListeners();
|
|
338
|
-
|
|
339
|
-
|
|
345
|
+
expect(listeners.length > 0, `Coordinator should have listeners, got ${listeners.length}`).toBeTruthy();
|
|
346
|
+
expect(listeners[0]?.port, `Coordinator should be on port ${portA}`).toBe(portA);
|
|
340
347
|
// B initiates the connection via the tool
|
|
341
348
|
const connectResult = await toolB.handle({
|
|
342
349
|
agentId: storeB.peerId,
|
|
@@ -344,7 +351,7 @@ describe("connection approval", () => {
|
|
|
344
351
|
cwd: "/test/b",
|
|
345
352
|
pid: process.pid,
|
|
346
353
|
}, connectAction);
|
|
347
|
-
|
|
354
|
+
expect(!connectResult.isError, `mesh_connect should succeed: ${connectResult.content}`).toBeTruthy();
|
|
348
355
|
await waitFor(() => storeA.listPendingConnections().length === 1, "coordinator sees the pending connection");
|
|
349
356
|
// A checks pending connections via the tool
|
|
350
357
|
const pendingAction = buildAction({ action: "mesh_pending" });
|
|
@@ -354,13 +361,13 @@ describe("connection approval", () => {
|
|
|
354
361
|
cwd: "/test/a",
|
|
355
362
|
pid: process.pid,
|
|
356
363
|
}, pendingAction);
|
|
357
|
-
|
|
358
|
-
|
|
364
|
+
expect(!pendingResult.isError, `mesh_pending should succeed: ${pendingResult.content}`).toBeTruthy();
|
|
365
|
+
expect(pendingResult.content.includes("connector"), "Pending list should show connector name").toBeTruthy();
|
|
359
366
|
// Extract connectionId from the pending connections list
|
|
360
367
|
const pendingConns = storeA.listPendingConnections();
|
|
361
|
-
|
|
368
|
+
expect(pendingConns.length, "Should have one pending connection").toBe(1);
|
|
362
369
|
const connectionId = pendingConns[0]?.connectionId;
|
|
363
|
-
|
|
370
|
+
expect(connectionId).toBeTruthy();
|
|
364
371
|
// A accepts the connection via the tool
|
|
365
372
|
const acceptAction = buildAction({
|
|
366
373
|
action: "mesh_accept",
|
|
@@ -372,22 +379,22 @@ describe("connection approval", () => {
|
|
|
372
379
|
cwd: "/test/a",
|
|
373
380
|
pid: process.pid,
|
|
374
381
|
}, acceptAction);
|
|
375
|
-
|
|
382
|
+
expect(!acceptResult.isError, `mesh_accept should succeed: ${acceptResult.content}`).toBeTruthy();
|
|
376
383
|
// State sync is a real TLS round trip, not instantaneous -- poll rather than assume any fixed delay is enough under a loaded CI runner.
|
|
377
384
|
await waitFor(() => storeA.serialise().agents[storeB.peerId] !== undefined, "A sees B after accept");
|
|
378
385
|
await waitFor(() => storeB.serialise().agents[storeA.peerId] !== undefined, "B sees A after accept");
|
|
379
386
|
// Verify both see each other
|
|
380
387
|
const agentsA = await storeA.listAgents(storeA.peerId);
|
|
381
388
|
const agentsB = await storeB.listAgents(storeB.peerId);
|
|
382
|
-
|
|
383
|
-
|
|
389
|
+
expect(agentsA.some((a) => a.id === storeB.peerId), "A should see B after accept").toBeTruthy();
|
|
390
|
+
expect(agentsB.some((a) => a.id === storeA.peerId), "B should see A after accept").toBeTruthy();
|
|
384
391
|
}
|
|
385
392
|
finally {
|
|
386
393
|
await storeB.shutdown();
|
|
387
394
|
await storeA.shutdown();
|
|
388
395
|
}
|
|
389
396
|
});
|
|
390
|
-
|
|
397
|
+
test("tool mesh_reject returns error message", async () => {
|
|
391
398
|
const portA = await uniquePort();
|
|
392
399
|
const portB = await uniquePort();
|
|
393
400
|
const storeA = new MeshStore(portA);
|
|
@@ -421,7 +428,7 @@ describe("connection approval", () => {
|
|
|
421
428
|
await waitFor(() => storeA.listPendingConnections().length === 1, "coordinator sees the pending connection");
|
|
422
429
|
const pendingConns = storeA.listPendingConnections();
|
|
423
430
|
const connectionId = pendingConns[0]?.connectionId;
|
|
424
|
-
|
|
431
|
+
expect(connectionId).toBeTruthy();
|
|
425
432
|
// A rejects via the tool
|
|
426
433
|
const rejectAction = buildAction({
|
|
427
434
|
action: "mesh_reject",
|
|
@@ -434,18 +441,18 @@ describe("connection approval", () => {
|
|
|
434
441
|
cwd: "/test/a",
|
|
435
442
|
pid: process.pid,
|
|
436
443
|
}, rejectAction);
|
|
437
|
-
|
|
438
|
-
|
|
444
|
+
expect(!rejectResult.isError, `mesh_reject should succeed: ${rejectResult.content}`).toBeTruthy();
|
|
445
|
+
expect(rejectResult.content.includes("not allowed"), "Result should include the reason").toBeTruthy();
|
|
439
446
|
// Verify rejection took effect
|
|
440
447
|
const pending = storeA.listPendingConnections();
|
|
441
|
-
|
|
448
|
+
expect(pending.length, "No pending connections after reject").toBe(0);
|
|
442
449
|
}
|
|
443
450
|
finally {
|
|
444
451
|
await storeB.shutdown();
|
|
445
452
|
await storeA.shutdown();
|
|
446
453
|
}
|
|
447
454
|
});
|
|
448
|
-
|
|
455
|
+
test("a message other than introduce/connect_request from an unapproved connection is refused, not routed", async () => {
|
|
449
456
|
const portA = await uniquePort();
|
|
450
457
|
const storeA = new MeshStore(portA);
|
|
451
458
|
await wireTestTransport(storeA);
|
|
@@ -485,8 +492,8 @@ describe("connection approval", () => {
|
|
|
485
492
|
method: "state_update",
|
|
486
493
|
patch: { type: "agent_upsert", agent: forgedAgent },
|
|
487
494
|
}), FRAME_SCOPE);
|
|
488
|
-
|
|
489
|
-
|
|
495
|
+
expect(outcome.result, "an unapproved connection's message must be refused, not routed").toBe("error");
|
|
496
|
+
expect(storeA.serialise().agents[forgedAgent.id], "a forged state_update from an unapproved connection must never reach mesh-store's own state").toBe(undefined);
|
|
490
497
|
}
|
|
491
498
|
finally {
|
|
492
499
|
await storeA.shutdown();
|