@namzu/sdk 0.4.2 → 0.4.3
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/CHANGELOG.md +10 -0
- package/dist/advisory/context.test.d.ts +16 -0
- package/dist/advisory/context.test.d.ts.map +1 -0
- package/dist/advisory/context.test.js +92 -0
- package/dist/advisory/context.test.js.map +1 -0
- package/dist/advisory/evaluator.test.d.ts +34 -0
- package/dist/advisory/evaluator.test.d.ts.map +1 -0
- package/dist/advisory/evaluator.test.js +172 -0
- package/dist/advisory/evaluator.test.js.map +1 -0
- package/dist/advisory/executor.test.d.ts +35 -0
- package/dist/advisory/executor.test.d.ts.map +1 -0
- package/dist/advisory/executor.test.js +233 -0
- package/dist/advisory/executor.test.js.map +1 -0
- package/dist/advisory/registry.test.d.ts +16 -0
- package/dist/advisory/registry.test.d.ts.map +1 -0
- package/dist/advisory/registry.test.js +62 -0
- package/dist/advisory/registry.test.js.map +1 -0
- package/dist/bridge/a2a/agent-card.test.d.ts +24 -0
- package/dist/bridge/a2a/agent-card.test.d.ts.map +1 -0
- package/dist/bridge/a2a/agent-card.test.js +118 -0
- package/dist/bridge/a2a/agent-card.test.js.map +1 -0
- package/dist/bridge/a2a/mapper.test.d.ts +29 -0
- package/dist/bridge/a2a/mapper.test.d.ts.map +1 -0
- package/dist/bridge/a2a/mapper.test.js +265 -0
- package/dist/bridge/a2a/mapper.test.js.map +1 -0
- package/dist/bridge/a2a/message.test.d.ts +20 -0
- package/dist/bridge/a2a/message.test.d.ts.map +1 -0
- package/dist/bridge/a2a/message.test.js +116 -0
- package/dist/bridge/a2a/message.test.js.map +1 -0
- package/dist/bridge/a2a/task.test.d.ts +29 -0
- package/dist/bridge/a2a/task.test.d.ts.map +1 -0
- package/dist/bridge/a2a/task.test.js +198 -0
- package/dist/bridge/a2a/task.test.js.map +1 -0
- package/dist/bridge/mcp/connector/adapter.test.d.ts +27 -0
- package/dist/bridge/mcp/connector/adapter.test.d.ts.map +1 -0
- package/dist/bridge/mcp/connector/adapter.test.js +203 -0
- package/dist/bridge/mcp/connector/adapter.test.js.map +1 -0
- package/dist/bridge/sse/mapper.test.d.ts +27 -0
- package/dist/bridge/sse/mapper.test.d.ts.map +1 -0
- package/dist/bridge/sse/mapper.test.js +271 -0
- package/dist/bridge/sse/mapper.test.js.map +1 -0
- package/dist/bridge/tools/connector/adapter.test.d.ts +28 -0
- package/dist/bridge/tools/connector/adapter.test.d.ts.map +1 -0
- package/dist/bridge/tools/connector/adapter.test.js +182 -0
- package/dist/bridge/tools/connector/adapter.test.js.map +1 -0
- package/dist/bridge/tools/connector/definitions.test.d.ts +23 -0
- package/dist/bridge/tools/connector/definitions.test.d.ts.map +1 -0
- package/dist/bridge/tools/connector/definitions.test.js +158 -0
- package/dist/bridge/tools/connector/definitions.test.js.map +1 -0
- package/dist/bridge/tools/connector/router.test.d.ts +21 -0
- package/dist/bridge/tools/connector/router.test.d.ts.map +1 -0
- package/dist/bridge/tools/connector/router.test.js +139 -0
- package/dist/bridge/tools/connector/router.test.js.map +1 -0
- package/dist/bus/breaker.test.d.ts +41 -0
- package/dist/bus/breaker.test.d.ts.map +1 -0
- package/dist/bus/breaker.test.js +242 -0
- package/dist/bus/breaker.test.js.map +1 -0
- package/dist/bus/index.test.d.ts +25 -0
- package/dist/bus/index.test.d.ts.map +1 -0
- package/dist/bus/index.test.js +151 -0
- package/dist/bus/index.test.js.map +1 -0
- package/dist/bus/lock.test.d.ts +44 -0
- package/dist/bus/lock.test.d.ts.map +1 -0
- package/dist/bus/lock.test.js +226 -0
- package/dist/bus/lock.test.js.map +1 -0
- package/dist/bus/ownership.test.d.ts +26 -0
- package/dist/bus/ownership.test.d.ts.map +1 -0
- package/dist/bus/ownership.test.js +205 -0
- package/dist/bus/ownership.test.js.map +1 -0
- package/dist/connector/BaseConnector.test.d.ts +21 -0
- package/dist/connector/BaseConnector.test.d.ts.map +1 -0
- package/dist/connector/BaseConnector.test.js +108 -0
- package/dist/connector/BaseConnector.test.js.map +1 -0
- package/dist/connector/builtins/http.test.d.ts +30 -0
- package/dist/connector/builtins/http.test.d.ts.map +1 -0
- package/dist/connector/builtins/http.test.js +232 -0
- package/dist/connector/builtins/http.test.js.map +1 -0
- package/dist/connector/builtins/webhook.test.d.ts +20 -0
- package/dist/connector/builtins/webhook.test.d.ts.map +1 -0
- package/dist/connector/builtins/webhook.test.js +113 -0
- package/dist/connector/builtins/webhook.test.js.map +1 -0
- package/dist/connector/execution/factory.test.d.ts +16 -0
- package/dist/connector/execution/factory.test.d.ts.map +1 -0
- package/dist/connector/execution/factory.test.js +64 -0
- package/dist/connector/execution/factory.test.js.map +1 -0
- package/dist/connector/execution/remote.test.d.ts +16 -0
- package/dist/connector/execution/remote.test.d.ts.map +1 -0
- package/dist/connector/execution/remote.test.js +53 -0
- package/dist/connector/execution/remote.test.js.map +1 -0
- package/dist/connector/mcp/adapter.test.d.ts +34 -0
- package/dist/connector/mcp/adapter.test.d.ts.map +1 -0
- package/dist/connector/mcp/adapter.test.js +199 -0
- package/dist/connector/mcp/adapter.test.js.map +1 -0
- package/dist/rag/chunking.test.d.ts +20 -0
- package/dist/rag/chunking.test.d.ts.map +1 -0
- package/dist/rag/chunking.test.js +92 -0
- package/dist/rag/chunking.test.js.map +1 -0
- package/dist/rag/context-assembler.test.d.ts +19 -0
- package/dist/rag/context-assembler.test.d.ts.map +1 -0
- package/dist/rag/context-assembler.test.js +98 -0
- package/dist/rag/context-assembler.test.js.map +1 -0
- package/dist/rag/embedding.test.d.ts +19 -0
- package/dist/rag/embedding.test.d.ts.map +1 -0
- package/dist/rag/embedding.test.js +115 -0
- package/dist/rag/embedding.test.js.map +1 -0
- package/dist/rag/ingestion.test.d.ts +22 -0
- package/dist/rag/ingestion.test.d.ts.map +1 -0
- package/dist/rag/ingestion.test.js +99 -0
- package/dist/rag/ingestion.test.js.map +1 -0
- package/dist/rag/knowledge-base.test.d.ts +17 -0
- package/dist/rag/knowledge-base.test.d.ts.map +1 -0
- package/dist/rag/knowledge-base.test.js +77 -0
- package/dist/rag/knowledge-base.test.js.map +1 -0
- package/dist/rag/rag-tool.test.d.ts +21 -0
- package/dist/rag/rag-tool.test.d.ts.map +1 -0
- package/dist/rag/rag-tool.test.js +149 -0
- package/dist/rag/rag-tool.test.js.map +1 -0
- package/dist/rag/retriever.test.d.ts +26 -0
- package/dist/rag/retriever.test.d.ts.map +1 -0
- package/dist/rag/retriever.test.js +180 -0
- package/dist/rag/retriever.test.js.map +1 -0
- package/dist/rag/vector-store.test.d.ts +38 -0
- package/dist/rag/vector-store.test.d.ts.map +1 -0
- package/dist/rag/vector-store.test.js +175 -0
- package/dist/rag/vector-store.test.js.map +1 -0
- package/dist/registry/ManagedRegistry.test.d.ts +21 -0
- package/dist/registry/ManagedRegistry.test.d.ts.map +1 -0
- package/dist/registry/ManagedRegistry.test.js +98 -0
- package/dist/registry/ManagedRegistry.test.js.map +1 -0
- package/dist/registry/Registry.test.d.ts +18 -0
- package/dist/registry/Registry.test.d.ts.map +1 -0
- package/dist/registry/Registry.test.js +79 -0
- package/dist/registry/Registry.test.js.map +1 -0
- package/dist/registry/agent/definitions.test.d.ts +15 -0
- package/dist/registry/agent/definitions.test.d.ts.map +1 -0
- package/dist/registry/agent/definitions.test.js +84 -0
- package/dist/registry/agent/definitions.test.js.map +1 -0
- package/dist/registry/connector/definitions.test.d.ts +13 -0
- package/dist/registry/connector/definitions.test.d.ts.map +1 -0
- package/dist/registry/connector/definitions.test.js +41 -0
- package/dist/registry/connector/definitions.test.js.map +1 -0
- package/dist/registry/connector/scoped.test.d.ts +21 -0
- package/dist/registry/connector/scoped.test.d.ts.map +1 -0
- package/dist/registry/connector/scoped.test.js +115 -0
- package/dist/registry/connector/scoped.test.js.map +1 -0
- package/dist/registry/plugin/index.test.d.ts +12 -0
- package/dist/registry/plugin/index.test.d.ts.map +1 -0
- package/dist/registry/plugin/index.test.js +69 -0
- package/dist/registry/plugin/index.test.js.map +1 -0
- package/dist/registry/tool/execute.test.d.ts +42 -0
- package/dist/registry/tool/execute.test.d.ts.map +1 -0
- package/dist/registry/tool/execute.test.js +281 -0
- package/dist/registry/tool/execute.test.js.map +1 -0
- package/dist/runtime/query/iteration/phases/advisory.test.d.ts +42 -0
- package/dist/runtime/query/iteration/phases/advisory.test.d.ts.map +1 -0
- package/dist/runtime/query/iteration/phases/advisory.test.js +334 -0
- package/dist/runtime/query/iteration/phases/advisory.test.js.map +1 -0
- package/dist/test-setup.d.ts +22 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +23 -0
- package/dist/test-setup.js.map +1 -0
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +5 -0
- package/dist/utils/logger.js.map +1 -1
- package/package.json +4 -1
- package/src/advisory/context.test.ts +109 -0
- package/src/advisory/evaluator.test.ts +192 -0
- package/src/advisory/executor.test.ts +272 -0
- package/src/advisory/registry.test.ts +75 -0
- package/src/bridge/a2a/agent-card.test.ts +140 -0
- package/src/bridge/a2a/mapper.test.ts +293 -0
- package/src/bridge/a2a/message.test.ts +138 -0
- package/src/bridge/a2a/task.test.ts +235 -0
- package/src/bridge/mcp/connector/adapter.test.ts +230 -0
- package/src/bridge/sse/mapper.test.ts +422 -0
- package/src/bridge/tools/connector/adapter.test.ts +224 -0
- package/src/bridge/tools/connector/definitions.test.ts +183 -0
- package/src/bridge/tools/connector/router.test.ts +159 -0
- package/src/bus/breaker.test.ts +274 -0
- package/src/bus/index.test.ts +183 -0
- package/src/bus/lock.test.ts +265 -0
- package/src/bus/ownership.test.ts +243 -0
- package/src/connector/BaseConnector.test.ts +130 -0
- package/src/connector/builtins/http.test.ts +290 -0
- package/src/connector/builtins/webhook.test.ts +138 -0
- package/src/connector/execution/factory.test.ts +75 -0
- package/src/connector/execution/remote.test.ts +63 -0
- package/src/connector/mcp/adapter.test.ts +249 -0
- package/src/rag/chunking.test.ts +107 -0
- package/src/rag/context-assembler.test.ts +114 -0
- package/src/rag/embedding.test.ts +130 -0
- package/src/rag/ingestion.test.ts +114 -0
- package/src/rag/knowledge-base.test.ts +106 -0
- package/src/rag/rag-tool.test.ts +167 -0
- package/src/rag/retriever.test.ts +210 -0
- package/src/rag/vector-store.test.ts +196 -0
- package/src/registry/ManagedRegistry.test.ts +118 -0
- package/src/registry/Registry.test.ts +91 -0
- package/src/registry/agent/definitions.test.ts +100 -0
- package/src/registry/connector/definitions.test.ts +51 -0
- package/src/registry/connector/scoped.test.ts +129 -0
- package/src/registry/plugin/index.test.ts +85 -0
- package/src/registry/tool/execute.test.ts +330 -0
- package/src/runtime/query/iteration/phases/advisory.test.ts +412 -0
- package/src/test-setup.ts +24 -0
- package/src/utils/logger.ts +6 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breaker.test.js","sourceRoot":"","sources":["../../src/bus/breaker.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAMxE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,SAAS,UAAU;IAClB,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAA;IAC7E,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAuB,CAAA;AAC3F,CAAC;AAED,SAAS,KAAK,CAAC,CAAS;IACvB,OAAO,OAAO,CAAC,EAAW,CAAA;AAC3B,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,CAAA;AACnB,MAAM,QAAQ,GAAG,MAAM,CAAA;AAEvB,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC/B,IAAI,MAAuB,CAAA;IAC3B,IAAI,OAAuB,CAAA;IAE3B,UAAU,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,EAAE,CAAA;QACX,OAAO,GAAG,IAAI,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;IACvF,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YACnE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YACnE,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC1C,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClC,MAAM,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAChC,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC3D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAE1E,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACzD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAA;YACxE,MAAM,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YACrC,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBAClD,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC7D,CAAC;QACF,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;YACtF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;gBAAE,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YACnE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;YAEjB,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/B,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC9E,EAAE,CAAC,MAAM,CACR,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;gBACrE,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;gBAC7E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;oBAAE,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;gBAC3D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAC1D,CAAC,CAAC,EACF,EAAE,OAAO,EAAE,EAAE,EAAE,CACf,CAAA;QACF,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC/D,EAAE,CAAC,MAAM,CACR,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;gBAC7D,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;gBAC7E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;oBAAE,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;gBAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;gBAC1C,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAA;gBAC7B,CAAC;qBAAM,CAAC;oBACP,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBACnC,CAAC;YACF,CAAC,CAAC,EACF,EAAE,OAAO,EAAE,EAAE,EAAE,CACf,CAAA;QACF,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;YACpE,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;YAChC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;YACtD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;YACxE,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/B,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/B,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC1C,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClC,MAAM,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACzC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,WAAW,EAAE,CAAA;QAC1C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;YACnF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;gBAAE,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YACnE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;YAEjB,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC5C,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;YACzF,EAAE,CAAC,aAAa,EAAE,CAAA;YAClB,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;YACzF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;gBAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAChE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;YAEjB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAE7C,EAAE,CAAC,mBAAmB,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;YACpC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAE7C,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAA;YACzB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC5C,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC9E,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;YACzF,EAAE,CAAC,aAAa,EAAE,CAAA;YAClB,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;YAC5E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;gBAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAChE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAA;YAChC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,oBAAoB;YAC9C,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC5C,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;QACrD,SAAS,aAAa;YACrB,EAAE,CAAC,aAAa,EAAE,CAAA;YAClB,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;YACtF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;gBAAE,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC7D,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAA;YAChC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,OAAO;YAC9B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;YACjB,OAAO,CAAC,CAAA;QACT,CAAC;QAED,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;YACzF,MAAM,CAAC,GAAG,aAAa,EAAE,CAAA;YACzB,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YACzB,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACrD,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACtB,EAAE,IAAI,EAAE,uBAAuB,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE;gBACvD,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE;aAC/C,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;YACjF,MAAM,CAAC,GAAG,aAAa,EAAE,CAAA;YACzB,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YACzB,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACnD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACtB,EAAE,IAAI,EAAE,uBAAuB,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE;gBACvD;oBACC,IAAI,EAAE,iBAAiB;oBACvB,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;oBACpB,mBAAmB,EAAE,SAAS,GAAG,CAAC;iBAClC;aACD,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;YACxE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;gBAAE,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YACnE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;YAEjB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YACvB,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC1C,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClC,MAAM,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACzC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,aAAa,EAAE,CAAA;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC1E,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACpD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;YACzB,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;gBAAE,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YACnE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACzD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC/C,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;QACtD,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;gBAAE,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YACnE,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAE/B,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;YACrC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC7C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Current-code invariants asserted (2026-04-21, ses_006 Phase 1):
|
|
3
|
+
*
|
|
4
|
+
* - `AgentBus` composes a `FileLockManager`, `EditOwnershipTracker`,
|
|
5
|
+
* and `CircuitBreaker`; every event each of them emits is
|
|
6
|
+
* broadcast to bus-level listeners.
|
|
7
|
+
* - `on(listener)` returns an unsubscribe function; invoking it
|
|
8
|
+
* removes the listener, and subsequent events skip it.
|
|
9
|
+
* - Listeners receive events in the order they are emitted
|
|
10
|
+
* (preserved by `Set` insertion-order iteration). Multi-listener
|
|
11
|
+
* fan-out: every listener sees every event.
|
|
12
|
+
* - A throwing listener does NOT cascade — other listeners still
|
|
13
|
+
* receive the same event, and the bus logs the error via
|
|
14
|
+
* `log.error`.
|
|
15
|
+
* - No per-tenant routing — events are global to the bus instance
|
|
16
|
+
* (design.md §2.1 aspirational per-tenant ordering does not
|
|
17
|
+
* exist; see §2.7).
|
|
18
|
+
* - `cleanupAgent(runId)` releases every lock + every ownership +
|
|
19
|
+
* resets the breaker for that runId. Counts are logged; the
|
|
20
|
+
* method does not return them.
|
|
21
|
+
* - `maintenance()` expires stale locks via `locks.expireStale()`
|
|
22
|
+
* and logs the count when non-zero.
|
|
23
|
+
*/
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=index.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/bus/index.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Current-code invariants asserted (2026-04-21, ses_006 Phase 1):
|
|
3
|
+
*
|
|
4
|
+
* - `AgentBus` composes a `FileLockManager`, `EditOwnershipTracker`,
|
|
5
|
+
* and `CircuitBreaker`; every event each of them emits is
|
|
6
|
+
* broadcast to bus-level listeners.
|
|
7
|
+
* - `on(listener)` returns an unsubscribe function; invoking it
|
|
8
|
+
* removes the listener, and subsequent events skip it.
|
|
9
|
+
* - Listeners receive events in the order they are emitted
|
|
10
|
+
* (preserved by `Set` insertion-order iteration). Multi-listener
|
|
11
|
+
* fan-out: every listener sees every event.
|
|
12
|
+
* - A throwing listener does NOT cascade — other listeners still
|
|
13
|
+
* receive the same event, and the bus logs the error via
|
|
14
|
+
* `log.error`.
|
|
15
|
+
* - No per-tenant routing — events are global to the bus instance
|
|
16
|
+
* (design.md §2.1 aspirational per-tenant ordering does not
|
|
17
|
+
* exist; see §2.7).
|
|
18
|
+
* - `cleanupAgent(runId)` releases every lock + every ownership +
|
|
19
|
+
* resets the breaker for that runId. Counts are logged; the
|
|
20
|
+
* method does not return them.
|
|
21
|
+
* - `maintenance()` expires stale locks via `locks.expireStale()`
|
|
22
|
+
* and logs the count when non-zero.
|
|
23
|
+
*/
|
|
24
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
25
|
+
import { AgentBus } from './index.js';
|
|
26
|
+
function makeLogger() {
|
|
27
|
+
// Recursive self-returning child — AgentBus nests FileLockManager /
|
|
28
|
+
// EditOwnershipTracker / CircuitBreaker, each of which chains a
|
|
29
|
+
// `log.child(...)` call in its constructor.
|
|
30
|
+
const self = {
|
|
31
|
+
info: vi.fn(),
|
|
32
|
+
warn: vi.fn(),
|
|
33
|
+
error: vi.fn(),
|
|
34
|
+
debug: vi.fn(),
|
|
35
|
+
child: vi.fn(),
|
|
36
|
+
};
|
|
37
|
+
self.child = vi.fn(() => self);
|
|
38
|
+
return self;
|
|
39
|
+
}
|
|
40
|
+
function runId(n) {
|
|
41
|
+
return `run_${n}`;
|
|
42
|
+
}
|
|
43
|
+
describe('AgentBus', () => {
|
|
44
|
+
let bus;
|
|
45
|
+
let log;
|
|
46
|
+
beforeEach(() => {
|
|
47
|
+
log = makeLogger();
|
|
48
|
+
bus = new AgentBus(log, { lockTimeoutMs: 60_000, lockAcquireTimeoutMs: 60 });
|
|
49
|
+
});
|
|
50
|
+
afterEach(() => {
|
|
51
|
+
vi.useRealTimers();
|
|
52
|
+
});
|
|
53
|
+
describe('listener lifecycle', () => {
|
|
54
|
+
it('broadcasts events to every registered listener', async () => {
|
|
55
|
+
const a = [];
|
|
56
|
+
const b = [];
|
|
57
|
+
bus.on((e) => a.push(e));
|
|
58
|
+
bus.on((e) => b.push(e));
|
|
59
|
+
await bus.locks.acquire('/tmp/f.txt', runId(1));
|
|
60
|
+
expect(a.length).toBeGreaterThan(0);
|
|
61
|
+
expect(b).toEqual(a);
|
|
62
|
+
});
|
|
63
|
+
it('unsubscribe removes the listener; later events skip it', async () => {
|
|
64
|
+
const seen = [];
|
|
65
|
+
const off = bus.on((e) => seen.push(e));
|
|
66
|
+
await bus.locks.acquire('/tmp/a.txt', runId(1));
|
|
67
|
+
const countAfterFirst = seen.length;
|
|
68
|
+
expect(countAfterFirst).toBeGreaterThan(0);
|
|
69
|
+
off();
|
|
70
|
+
await bus.locks.acquire('/tmp/b.txt', runId(1));
|
|
71
|
+
expect(seen.length).toBe(countAfterFirst);
|
|
72
|
+
});
|
|
73
|
+
it('preserves emission order per listener (Set insertion-order iteration)', async () => {
|
|
74
|
+
const seen = [];
|
|
75
|
+
bus.on((e) => seen.push(e.type));
|
|
76
|
+
await bus.locks.acquire('/tmp/a.txt', runId(1));
|
|
77
|
+
bus.ownership.claim('/tmp/a.txt', runId(1));
|
|
78
|
+
bus.ownership.release('/tmp/a.txt', runId(1));
|
|
79
|
+
bus.locks.release('/tmp/a.txt', runId(1));
|
|
80
|
+
expect(seen).toEqual([
|
|
81
|
+
'lock_acquired',
|
|
82
|
+
'ownership_claimed',
|
|
83
|
+
'ownership_released',
|
|
84
|
+
'lock_released',
|
|
85
|
+
]);
|
|
86
|
+
});
|
|
87
|
+
it('a throwing listener does not cascade — other listeners still fire', async () => {
|
|
88
|
+
const good = [];
|
|
89
|
+
bus.on(() => {
|
|
90
|
+
throw new Error('boom');
|
|
91
|
+
});
|
|
92
|
+
bus.on((e) => good.push(e));
|
|
93
|
+
await bus.locks.acquire('/tmp/a.txt', runId(1));
|
|
94
|
+
expect(good.length).toBeGreaterThan(0);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('composed sub-components', () => {
|
|
98
|
+
it('CircuitBreaker events flow through the bus listener', () => {
|
|
99
|
+
const seen = [];
|
|
100
|
+
bus.on((e) => seen.push(e));
|
|
101
|
+
for (let i = 0; i < 5; i++)
|
|
102
|
+
bus.breaker.recordFailure(runId(1));
|
|
103
|
+
expect(seen.filter((e) => e.type === 'breaker_tripped')).toHaveLength(1);
|
|
104
|
+
});
|
|
105
|
+
it('EditOwnershipTracker events flow through the bus listener', () => {
|
|
106
|
+
const seen = [];
|
|
107
|
+
bus.on((e) => seen.push(e));
|
|
108
|
+
bus.ownership.claim('/tmp/a.txt', runId(1));
|
|
109
|
+
bus.ownership.transfer('/tmp/a.txt', runId(1), runId(2));
|
|
110
|
+
bus.ownership.release('/tmp/a.txt', runId(2));
|
|
111
|
+
expect(seen.map((e) => e.type)).toEqual([
|
|
112
|
+
'ownership_claimed',
|
|
113
|
+
'ownership_transferred',
|
|
114
|
+
'ownership_released',
|
|
115
|
+
]);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('cleanupAgent', () => {
|
|
119
|
+
it('releases locks + ownerships + resets breaker for the runId', async () => {
|
|
120
|
+
await bus.locks.acquire('/tmp/a.txt', runId(1));
|
|
121
|
+
bus.ownership.claim('/tmp/a.txt', runId(1));
|
|
122
|
+
for (let i = 0; i < 5; i++)
|
|
123
|
+
bus.breaker.recordFailure(runId(1));
|
|
124
|
+
expect(bus.breaker.getSnapshot(runId(1))?.state).toBe('open');
|
|
125
|
+
expect(bus.locks.isLocked('/tmp/a.txt')).toBe(true);
|
|
126
|
+
bus.cleanupAgent(runId(1));
|
|
127
|
+
expect(bus.locks.isLocked('/tmp/a.txt')).toBe(false);
|
|
128
|
+
expect(bus.ownership.getOwner('/tmp/a.txt')).toBeUndefined();
|
|
129
|
+
expect(bus.breaker.getSnapshot(runId(1))?.state).toBe('closed');
|
|
130
|
+
});
|
|
131
|
+
it('does not affect other runIds', async () => {
|
|
132
|
+
await bus.locks.acquire('/tmp/a.txt', runId(1));
|
|
133
|
+
await bus.locks.acquire('/tmp/b.txt', runId(2));
|
|
134
|
+
bus.cleanupAgent(runId(1));
|
|
135
|
+
expect(bus.locks.isLocked('/tmp/a.txt')).toBe(false);
|
|
136
|
+
expect(bus.locks.isLocked('/tmp/b.txt')).toBe(true);
|
|
137
|
+
expect(bus.locks.getHolder('/tmp/b.txt')).toBe(runId(2));
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
describe('maintenance', () => {
|
|
141
|
+
it('sweeps expired locks', async () => {
|
|
142
|
+
vi.useFakeTimers();
|
|
143
|
+
const b = new AgentBus(makeLogger(), { lockTimeoutMs: 500, lockAcquireTimeoutMs: 30 });
|
|
144
|
+
await b.locks.acquire('/tmp/a.txt', runId(1));
|
|
145
|
+
vi.advanceTimersByTime(501);
|
|
146
|
+
b.maintenance();
|
|
147
|
+
expect(b.locks.isLocked('/tmp/a.txt')).toBe(false);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/bus/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Current-code invariants asserted (2026-04-21, ses_006 Phase 1):
|
|
3
|
+
*
|
|
4
|
+
* - `acquire(path, owner)` returns immediately when the file is
|
|
5
|
+
* unlocked; creates a lock with `lockId = lock_<uuid>`,
|
|
6
|
+
* `expiresAt = now + lockTimeoutMs`, emits `lock_acquired`.
|
|
7
|
+
* - `acquire` on a file already held by the SAME owner is idempotent
|
|
8
|
+
* — returns `{acquired: true, lock}` (the existing lock) and emits
|
|
9
|
+
* nothing.
|
|
10
|
+
* - `acquire` on a file held by a DIFFERENT owner emits `lock_denied`
|
|
11
|
+
* and then polls at `LOCK_ACQUIRE_POLL_INTERVAL_MS` (100ms) intervals
|
|
12
|
+
* until either the holder releases, the lock expires, or
|
|
13
|
+
* `acquireTimeoutMs` elapses. No FIFO queue; retries race.
|
|
14
|
+
* - When the holder releases before the deadline, the waiting acquire
|
|
15
|
+
* succeeds on its next poll.
|
|
16
|
+
* - When `acquireTimeoutMs` elapses, acquire returns
|
|
17
|
+
* `{acquired: false, holder, filePath}` — holder is the current
|
|
18
|
+
* lock holder's owner if the lock still exists, else empty string.
|
|
19
|
+
* - `maxLocksPerAgent` blocks further acquisitions by the same owner.
|
|
20
|
+
* The internal `tryAcquire` returns `{holder: owner}` (a
|
|
21
|
+
* "yourself" sentinel) but the public `acquire()` swallows that and
|
|
22
|
+
* keeps polling for `acquireTimeoutMs` (there's no short-circuit
|
|
23
|
+
* for cap-exceeded). When the deadline expires and no lock exists
|
|
24
|
+
* on the file, the final `holder` is `''` (empty `RunId`) because
|
|
25
|
+
* the fallback reads `this.locks.get(filePath)?.owner ?? ''`.
|
|
26
|
+
* - `release(path, owner)` deletes the lock + emits `lock_released`
|
|
27
|
+
* when the current lock's owner matches; cleans up the per-owner
|
|
28
|
+
* lock set (and prunes the set entry when it becomes empty).
|
|
29
|
+
* Returns false without emitting when no lock or owner mismatch.
|
|
30
|
+
* - `releaseAll(owner)` drops every lock owned by `owner`, emits
|
|
31
|
+
* `lock_released` per lock, returns the count, and prunes the
|
|
32
|
+
* per-owner set.
|
|
33
|
+
* - `isLocked(path)` + `getHolder(path)` auto-expire any stale lock
|
|
34
|
+
* they observe (and emit `lock_expired`) before returning the
|
|
35
|
+
* current state.
|
|
36
|
+
* - `expireStale()` sweeps every lock; expired ones are deleted and
|
|
37
|
+
* emit `lock_expired`; returns the count.
|
|
38
|
+
* - Re-acquiring a path after its lock expires succeeds and assigns
|
|
39
|
+
* a FRESH `lockId` (the old id is never reused).
|
|
40
|
+
* - Lock state is per-`RunId`; no tenant dimension (design.md §2.1
|
|
41
|
+
* aspirational).
|
|
42
|
+
*/
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=lock.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.test.d.ts","sourceRoot":"","sources":["../../src/bus/lock.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Current-code invariants asserted (2026-04-21, ses_006 Phase 1):
|
|
3
|
+
*
|
|
4
|
+
* - `acquire(path, owner)` returns immediately when the file is
|
|
5
|
+
* unlocked; creates a lock with `lockId = lock_<uuid>`,
|
|
6
|
+
* `expiresAt = now + lockTimeoutMs`, emits `lock_acquired`.
|
|
7
|
+
* - `acquire` on a file already held by the SAME owner is idempotent
|
|
8
|
+
* — returns `{acquired: true, lock}` (the existing lock) and emits
|
|
9
|
+
* nothing.
|
|
10
|
+
* - `acquire` on a file held by a DIFFERENT owner emits `lock_denied`
|
|
11
|
+
* and then polls at `LOCK_ACQUIRE_POLL_INTERVAL_MS` (100ms) intervals
|
|
12
|
+
* until either the holder releases, the lock expires, or
|
|
13
|
+
* `acquireTimeoutMs` elapses. No FIFO queue; retries race.
|
|
14
|
+
* - When the holder releases before the deadline, the waiting acquire
|
|
15
|
+
* succeeds on its next poll.
|
|
16
|
+
* - When `acquireTimeoutMs` elapses, acquire returns
|
|
17
|
+
* `{acquired: false, holder, filePath}` — holder is the current
|
|
18
|
+
* lock holder's owner if the lock still exists, else empty string.
|
|
19
|
+
* - `maxLocksPerAgent` blocks further acquisitions by the same owner.
|
|
20
|
+
* The internal `tryAcquire` returns `{holder: owner}` (a
|
|
21
|
+
* "yourself" sentinel) but the public `acquire()` swallows that and
|
|
22
|
+
* keeps polling for `acquireTimeoutMs` (there's no short-circuit
|
|
23
|
+
* for cap-exceeded). When the deadline expires and no lock exists
|
|
24
|
+
* on the file, the final `holder` is `''` (empty `RunId`) because
|
|
25
|
+
* the fallback reads `this.locks.get(filePath)?.owner ?? ''`.
|
|
26
|
+
* - `release(path, owner)` deletes the lock + emits `lock_released`
|
|
27
|
+
* when the current lock's owner matches; cleans up the per-owner
|
|
28
|
+
* lock set (and prunes the set entry when it becomes empty).
|
|
29
|
+
* Returns false without emitting when no lock or owner mismatch.
|
|
30
|
+
* - `releaseAll(owner)` drops every lock owned by `owner`, emits
|
|
31
|
+
* `lock_released` per lock, returns the count, and prunes the
|
|
32
|
+
* per-owner set.
|
|
33
|
+
* - `isLocked(path)` + `getHolder(path)` auto-expire any stale lock
|
|
34
|
+
* they observe (and emit `lock_expired`) before returning the
|
|
35
|
+
* current state.
|
|
36
|
+
* - `expireStale()` sweeps every lock; expired ones are deleted and
|
|
37
|
+
* emit `lock_expired`; returns the count.
|
|
38
|
+
* - Re-acquiring a path after its lock expires succeeds and assigns
|
|
39
|
+
* a FRESH `lockId` (the old id is never reused).
|
|
40
|
+
* - Lock state is per-`RunId`; no tenant dimension (design.md §2.1
|
|
41
|
+
* aspirational).
|
|
42
|
+
*/
|
|
43
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
44
|
+
import { FileLockManager } from './lock.js';
|
|
45
|
+
function makeLogger() {
|
|
46
|
+
const stub = { info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() };
|
|
47
|
+
return { ...stub, child: vi.fn(() => ({ ...stub, child: vi.fn() })) };
|
|
48
|
+
}
|
|
49
|
+
function runId(n) {
|
|
50
|
+
return `run_${n}`;
|
|
51
|
+
}
|
|
52
|
+
function makeManager(overrides = {}) {
|
|
53
|
+
const events = [];
|
|
54
|
+
const mgr = new FileLockManager(makeLogger(), (e) => events.push(e), {
|
|
55
|
+
// short defaults keep acquire-retry tests under a second total
|
|
56
|
+
lockTimeoutMs: 60_000,
|
|
57
|
+
acquireTimeoutMs: 200,
|
|
58
|
+
maxLocksPerAgent: 10,
|
|
59
|
+
...overrides,
|
|
60
|
+
});
|
|
61
|
+
return { mgr, events };
|
|
62
|
+
}
|
|
63
|
+
describe('FileLockManager', () => {
|
|
64
|
+
afterEach(() => {
|
|
65
|
+
vi.useRealTimers();
|
|
66
|
+
});
|
|
67
|
+
describe('acquire (happy path)', () => {
|
|
68
|
+
it('acquires an unheld lock immediately + emits lock_acquired', async () => {
|
|
69
|
+
const { mgr, events } = makeManager();
|
|
70
|
+
const before = Date.now();
|
|
71
|
+
const result = await mgr.acquire('/tmp/a.txt', runId(1));
|
|
72
|
+
expect(result.acquired).toBe(true);
|
|
73
|
+
if (result.acquired) {
|
|
74
|
+
expect(result.lock.owner).toBe(runId(1));
|
|
75
|
+
expect(result.lock.filePath).toBe('/tmp/a.txt');
|
|
76
|
+
expect(result.lock.lockId).toMatch(/^lock_[0-9a-f-]+$/);
|
|
77
|
+
expect(result.lock.acquiredAt).toBeGreaterThanOrEqual(before);
|
|
78
|
+
expect(result.lock.expiresAt).toBeGreaterThan(result.lock.acquiredAt);
|
|
79
|
+
}
|
|
80
|
+
const acquired = events.filter((e) => e.type === 'lock_acquired');
|
|
81
|
+
expect(acquired).toHaveLength(1);
|
|
82
|
+
});
|
|
83
|
+
it('is idempotent for the same owner — returns the existing lock, emits nothing', async () => {
|
|
84
|
+
const { mgr, events } = makeManager();
|
|
85
|
+
const first = await mgr.acquire('/tmp/a.txt', runId(1));
|
|
86
|
+
events.length = 0;
|
|
87
|
+
const second = await mgr.acquire('/tmp/a.txt', runId(1));
|
|
88
|
+
expect(second.acquired).toBe(true);
|
|
89
|
+
if (first.acquired && second.acquired) {
|
|
90
|
+
expect(second.lock.lockId).toBe(first.lock.lockId);
|
|
91
|
+
}
|
|
92
|
+
expect(events).toEqual([]);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe('acquire (contention)', () => {
|
|
96
|
+
it('emits lock_denied when another owner holds the lock and no release happens', async () => {
|
|
97
|
+
const { mgr, events } = makeManager({ acquireTimeoutMs: 120 });
|
|
98
|
+
await mgr.acquire('/tmp/a.txt', runId(1));
|
|
99
|
+
events.length = 0;
|
|
100
|
+
const result = await mgr.acquire('/tmp/a.txt', runId(2));
|
|
101
|
+
expect(result.acquired).toBe(false);
|
|
102
|
+
if (!result.acquired) {
|
|
103
|
+
expect(result.holder).toBe(runId(1));
|
|
104
|
+
expect(result.filePath).toBe('/tmp/a.txt');
|
|
105
|
+
}
|
|
106
|
+
expect(events.some((e) => e.type === 'lock_denied')).toBe(true);
|
|
107
|
+
});
|
|
108
|
+
it('succeeds on a retry once the holder releases before the deadline', async () => {
|
|
109
|
+
const { mgr } = makeManager({ acquireTimeoutMs: 500 });
|
|
110
|
+
await mgr.acquire('/tmp/a.txt', runId(1));
|
|
111
|
+
const contender = mgr.acquire('/tmp/a.txt', runId(2));
|
|
112
|
+
setTimeout(() => mgr.release('/tmp/a.txt', runId(1)), 120);
|
|
113
|
+
const result = await contender;
|
|
114
|
+
expect(result.acquired).toBe(true);
|
|
115
|
+
if (result.acquired)
|
|
116
|
+
expect(result.lock.owner).toBe(runId(2));
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe('maxLocksPerAgent cap', () => {
|
|
120
|
+
it('denies a new acquisition when the owner is at cap — acquire polls to deadline then returns empty holder', async () => {
|
|
121
|
+
const { mgr } = makeManager({ maxLocksPerAgent: 2, acquireTimeoutMs: 60 });
|
|
122
|
+
await mgr.acquire('/tmp/a.txt', runId(1));
|
|
123
|
+
await mgr.acquire('/tmp/b.txt', runId(1));
|
|
124
|
+
const over = await mgr.acquire('/tmp/c.txt', runId(1));
|
|
125
|
+
expect(over.acquired).toBe(false);
|
|
126
|
+
if (!over.acquired) {
|
|
127
|
+
// No lock exists on /tmp/c.txt, so the fallback holder is ''.
|
|
128
|
+
expect(over.holder).toBe('');
|
|
129
|
+
expect(over.filePath).toBe('/tmp/c.txt');
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe('release', () => {
|
|
134
|
+
it('releases an owned lock + emits lock_released', async () => {
|
|
135
|
+
const { mgr, events } = makeManager();
|
|
136
|
+
await mgr.acquire('/tmp/a.txt', runId(1));
|
|
137
|
+
events.length = 0;
|
|
138
|
+
expect(mgr.release('/tmp/a.txt', runId(1))).toBe(true);
|
|
139
|
+
expect(mgr.isLocked('/tmp/a.txt')).toBe(false);
|
|
140
|
+
expect(events.some((e) => e.type === 'lock_released')).toBe(true);
|
|
141
|
+
});
|
|
142
|
+
it('returns false + emits nothing when the caller is not the holder', async () => {
|
|
143
|
+
const { mgr, events } = makeManager();
|
|
144
|
+
await mgr.acquire('/tmp/a.txt', runId(1));
|
|
145
|
+
events.length = 0;
|
|
146
|
+
expect(mgr.release('/tmp/a.txt', runId(2))).toBe(false);
|
|
147
|
+
expect(mgr.isLocked('/tmp/a.txt')).toBe(true);
|
|
148
|
+
expect(events).toEqual([]);
|
|
149
|
+
});
|
|
150
|
+
it('returns false when no lock exists', () => {
|
|
151
|
+
const { mgr, events } = makeManager();
|
|
152
|
+
expect(mgr.release('/tmp/never.txt', runId(1))).toBe(false);
|
|
153
|
+
expect(events).toEqual([]);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
describe('releaseAll', () => {
|
|
157
|
+
it('drops every lock owned by the runId, emits one event per lock, returns count', async () => {
|
|
158
|
+
const { mgr, events } = makeManager();
|
|
159
|
+
await mgr.acquire('/tmp/a.txt', runId(1));
|
|
160
|
+
await mgr.acquire('/tmp/b.txt', runId(1));
|
|
161
|
+
await mgr.acquire('/tmp/c.txt', runId(2));
|
|
162
|
+
events.length = 0;
|
|
163
|
+
const count = mgr.releaseAll(runId(1));
|
|
164
|
+
expect(count).toBe(2);
|
|
165
|
+
expect(mgr.isLocked('/tmp/a.txt')).toBe(false);
|
|
166
|
+
expect(mgr.isLocked('/tmp/b.txt')).toBe(false);
|
|
167
|
+
expect(mgr.isLocked('/tmp/c.txt')).toBe(true);
|
|
168
|
+
expect(events.filter((e) => e.type === 'lock_released')).toHaveLength(2);
|
|
169
|
+
});
|
|
170
|
+
it('returns 0 when the owner has no locks', () => {
|
|
171
|
+
const { mgr } = makeManager();
|
|
172
|
+
expect(mgr.releaseAll(runId(99))).toBe(0);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
describe('expiry', () => {
|
|
176
|
+
it('expireStale drops expired locks + emits lock_expired per drop', async () => {
|
|
177
|
+
vi.useFakeTimers();
|
|
178
|
+
const { mgr, events } = makeManager({ lockTimeoutMs: 10_000 });
|
|
179
|
+
await mgr.acquire('/tmp/a.txt', runId(1));
|
|
180
|
+
await mgr.acquire('/tmp/b.txt', runId(2));
|
|
181
|
+
events.length = 0;
|
|
182
|
+
vi.advanceTimersByTime(10_001);
|
|
183
|
+
const expired = mgr.expireStale();
|
|
184
|
+
expect(expired).toBe(2);
|
|
185
|
+
expect(events.filter((e) => e.type === 'lock_expired')).toHaveLength(2);
|
|
186
|
+
});
|
|
187
|
+
it('isLocked / getHolder auto-expire a stale lock before answering', async () => {
|
|
188
|
+
vi.useFakeTimers();
|
|
189
|
+
const { mgr, events } = makeManager({ lockTimeoutMs: 5_000 });
|
|
190
|
+
await mgr.acquire('/tmp/a.txt', runId(1));
|
|
191
|
+
vi.advanceTimersByTime(5_001);
|
|
192
|
+
events.length = 0;
|
|
193
|
+
expect(mgr.isLocked('/tmp/a.txt')).toBe(false);
|
|
194
|
+
expect(events.some((e) => e.type === 'lock_expired')).toBe(true);
|
|
195
|
+
events.length = 0;
|
|
196
|
+
expect(mgr.getHolder('/tmp/a.txt')).toBeUndefined();
|
|
197
|
+
// already expired by the previous call; no second emit
|
|
198
|
+
expect(events).toEqual([]);
|
|
199
|
+
});
|
|
200
|
+
it('a fresh acquire after expiry assigns a new lockId', async () => {
|
|
201
|
+
vi.useFakeTimers();
|
|
202
|
+
const { mgr } = makeManager({ lockTimeoutMs: 1_000 });
|
|
203
|
+
const first = await mgr.acquire('/tmp/a.txt', runId(1));
|
|
204
|
+
vi.advanceTimersByTime(1_001);
|
|
205
|
+
mgr.expireStale();
|
|
206
|
+
vi.useRealTimers();
|
|
207
|
+
const second = await mgr.acquire('/tmp/a.txt', runId(2));
|
|
208
|
+
expect(first.acquired && second.acquired).toBe(true);
|
|
209
|
+
if (first.acquired && second.acquired) {
|
|
210
|
+
expect(second.lock.lockId).not.toBe(first.lock.lockId);
|
|
211
|
+
expect(second.lock.owner).toBe(runId(2));
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
describe('per-runId isolation', () => {
|
|
216
|
+
it('different runIds can hold locks on different files concurrently', async () => {
|
|
217
|
+
const { mgr } = makeManager();
|
|
218
|
+
const a = await mgr.acquire('/tmp/a.txt', runId(1));
|
|
219
|
+
const b = await mgr.acquire('/tmp/b.txt', runId(2));
|
|
220
|
+
expect(a.acquired && b.acquired).toBe(true);
|
|
221
|
+
expect(mgr.getHolder('/tmp/a.txt')).toBe(runId(1));
|
|
222
|
+
expect(mgr.getHolder('/tmp/b.txt')).toBe(runId(2));
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
//# sourceMappingURL=lock.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.test.js","sourceRoot":"","sources":["../../src/bus/lock.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Current-code invariants asserted (2026-04-21, ses_006 Phase 1):
|
|
3
|
+
*
|
|
4
|
+
* - `claim(path, owner)` on an unowned file creates ownership, emits
|
|
5
|
+
* `ownership_claimed`, returns `{claimed: true, ownership}`.
|
|
6
|
+
* - `claim(path, owner)` by the same owner is idempotent — returns
|
|
7
|
+
* `{claimed: true, ownership}` WITHOUT re-emitting.
|
|
8
|
+
* - `claim(path, owner)` by a different owner is denied — emits
|
|
9
|
+
* `ownership_denied`, returns `{claimed: false, currentOwner, filePath}`.
|
|
10
|
+
* - `release(path, owner)` on the current owner deletes + emits; returns
|
|
11
|
+
* true. On mismatch or missing entry: returns false; no emit.
|
|
12
|
+
* - `transfer(path, from, to)` requires the current owner to equal
|
|
13
|
+
* `from`. Success replaces the entry with a new `claimedAt`, emits
|
|
14
|
+
* `ownership_transferred`; no intervening `ownership_released` or
|
|
15
|
+
* `ownership_claimed` events. Failure returns false; no emit.
|
|
16
|
+
* - `releaseAll(owner)` sweeps every ownership for `owner`, emits
|
|
17
|
+
* `ownership_released` per entry, returns the count. Other owners'
|
|
18
|
+
* entries are untouched.
|
|
19
|
+
* - File paths are normalised via `path.resolve` before keying —
|
|
20
|
+
* `./foo/bar` and the absolute resolution of the same path collide
|
|
21
|
+
* into one ownership slot.
|
|
22
|
+
* - Ownership is not per-tenant; only per-`RunId`. There is no tenant
|
|
23
|
+
* isolation at this layer (design.md §2.1 aspirational; see §2.7).
|
|
24
|
+
*/
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=ownership.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ownership.test.d.ts","sourceRoot":"","sources":["../../src/bus/ownership.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG"}
|