@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.
Files changed (207) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/advisory/context.test.d.ts +16 -0
  3. package/dist/advisory/context.test.d.ts.map +1 -0
  4. package/dist/advisory/context.test.js +92 -0
  5. package/dist/advisory/context.test.js.map +1 -0
  6. package/dist/advisory/evaluator.test.d.ts +34 -0
  7. package/dist/advisory/evaluator.test.d.ts.map +1 -0
  8. package/dist/advisory/evaluator.test.js +172 -0
  9. package/dist/advisory/evaluator.test.js.map +1 -0
  10. package/dist/advisory/executor.test.d.ts +35 -0
  11. package/dist/advisory/executor.test.d.ts.map +1 -0
  12. package/dist/advisory/executor.test.js +233 -0
  13. package/dist/advisory/executor.test.js.map +1 -0
  14. package/dist/advisory/registry.test.d.ts +16 -0
  15. package/dist/advisory/registry.test.d.ts.map +1 -0
  16. package/dist/advisory/registry.test.js +62 -0
  17. package/dist/advisory/registry.test.js.map +1 -0
  18. package/dist/bridge/a2a/agent-card.test.d.ts +24 -0
  19. package/dist/bridge/a2a/agent-card.test.d.ts.map +1 -0
  20. package/dist/bridge/a2a/agent-card.test.js +118 -0
  21. package/dist/bridge/a2a/agent-card.test.js.map +1 -0
  22. package/dist/bridge/a2a/mapper.test.d.ts +29 -0
  23. package/dist/bridge/a2a/mapper.test.d.ts.map +1 -0
  24. package/dist/bridge/a2a/mapper.test.js +265 -0
  25. package/dist/bridge/a2a/mapper.test.js.map +1 -0
  26. package/dist/bridge/a2a/message.test.d.ts +20 -0
  27. package/dist/bridge/a2a/message.test.d.ts.map +1 -0
  28. package/dist/bridge/a2a/message.test.js +116 -0
  29. package/dist/bridge/a2a/message.test.js.map +1 -0
  30. package/dist/bridge/a2a/task.test.d.ts +29 -0
  31. package/dist/bridge/a2a/task.test.d.ts.map +1 -0
  32. package/dist/bridge/a2a/task.test.js +198 -0
  33. package/dist/bridge/a2a/task.test.js.map +1 -0
  34. package/dist/bridge/mcp/connector/adapter.test.d.ts +27 -0
  35. package/dist/bridge/mcp/connector/adapter.test.d.ts.map +1 -0
  36. package/dist/bridge/mcp/connector/adapter.test.js +203 -0
  37. package/dist/bridge/mcp/connector/adapter.test.js.map +1 -0
  38. package/dist/bridge/sse/mapper.test.d.ts +27 -0
  39. package/dist/bridge/sse/mapper.test.d.ts.map +1 -0
  40. package/dist/bridge/sse/mapper.test.js +271 -0
  41. package/dist/bridge/sse/mapper.test.js.map +1 -0
  42. package/dist/bridge/tools/connector/adapter.test.d.ts +28 -0
  43. package/dist/bridge/tools/connector/adapter.test.d.ts.map +1 -0
  44. package/dist/bridge/tools/connector/adapter.test.js +182 -0
  45. package/dist/bridge/tools/connector/adapter.test.js.map +1 -0
  46. package/dist/bridge/tools/connector/definitions.test.d.ts +23 -0
  47. package/dist/bridge/tools/connector/definitions.test.d.ts.map +1 -0
  48. package/dist/bridge/tools/connector/definitions.test.js +158 -0
  49. package/dist/bridge/tools/connector/definitions.test.js.map +1 -0
  50. package/dist/bridge/tools/connector/router.test.d.ts +21 -0
  51. package/dist/bridge/tools/connector/router.test.d.ts.map +1 -0
  52. package/dist/bridge/tools/connector/router.test.js +139 -0
  53. package/dist/bridge/tools/connector/router.test.js.map +1 -0
  54. package/dist/bus/breaker.test.d.ts +41 -0
  55. package/dist/bus/breaker.test.d.ts.map +1 -0
  56. package/dist/bus/breaker.test.js +242 -0
  57. package/dist/bus/breaker.test.js.map +1 -0
  58. package/dist/bus/index.test.d.ts +25 -0
  59. package/dist/bus/index.test.d.ts.map +1 -0
  60. package/dist/bus/index.test.js +151 -0
  61. package/dist/bus/index.test.js.map +1 -0
  62. package/dist/bus/lock.test.d.ts +44 -0
  63. package/dist/bus/lock.test.d.ts.map +1 -0
  64. package/dist/bus/lock.test.js +226 -0
  65. package/dist/bus/lock.test.js.map +1 -0
  66. package/dist/bus/ownership.test.d.ts +26 -0
  67. package/dist/bus/ownership.test.d.ts.map +1 -0
  68. package/dist/bus/ownership.test.js +205 -0
  69. package/dist/bus/ownership.test.js.map +1 -0
  70. package/dist/connector/BaseConnector.test.d.ts +21 -0
  71. package/dist/connector/BaseConnector.test.d.ts.map +1 -0
  72. package/dist/connector/BaseConnector.test.js +108 -0
  73. package/dist/connector/BaseConnector.test.js.map +1 -0
  74. package/dist/connector/builtins/http.test.d.ts +30 -0
  75. package/dist/connector/builtins/http.test.d.ts.map +1 -0
  76. package/dist/connector/builtins/http.test.js +232 -0
  77. package/dist/connector/builtins/http.test.js.map +1 -0
  78. package/dist/connector/builtins/webhook.test.d.ts +20 -0
  79. package/dist/connector/builtins/webhook.test.d.ts.map +1 -0
  80. package/dist/connector/builtins/webhook.test.js +113 -0
  81. package/dist/connector/builtins/webhook.test.js.map +1 -0
  82. package/dist/connector/execution/factory.test.d.ts +16 -0
  83. package/dist/connector/execution/factory.test.d.ts.map +1 -0
  84. package/dist/connector/execution/factory.test.js +64 -0
  85. package/dist/connector/execution/factory.test.js.map +1 -0
  86. package/dist/connector/execution/remote.test.d.ts +16 -0
  87. package/dist/connector/execution/remote.test.d.ts.map +1 -0
  88. package/dist/connector/execution/remote.test.js +53 -0
  89. package/dist/connector/execution/remote.test.js.map +1 -0
  90. package/dist/connector/mcp/adapter.test.d.ts +34 -0
  91. package/dist/connector/mcp/adapter.test.d.ts.map +1 -0
  92. package/dist/connector/mcp/adapter.test.js +199 -0
  93. package/dist/connector/mcp/adapter.test.js.map +1 -0
  94. package/dist/rag/chunking.test.d.ts +20 -0
  95. package/dist/rag/chunking.test.d.ts.map +1 -0
  96. package/dist/rag/chunking.test.js +92 -0
  97. package/dist/rag/chunking.test.js.map +1 -0
  98. package/dist/rag/context-assembler.test.d.ts +19 -0
  99. package/dist/rag/context-assembler.test.d.ts.map +1 -0
  100. package/dist/rag/context-assembler.test.js +98 -0
  101. package/dist/rag/context-assembler.test.js.map +1 -0
  102. package/dist/rag/embedding.test.d.ts +19 -0
  103. package/dist/rag/embedding.test.d.ts.map +1 -0
  104. package/dist/rag/embedding.test.js +115 -0
  105. package/dist/rag/embedding.test.js.map +1 -0
  106. package/dist/rag/ingestion.test.d.ts +22 -0
  107. package/dist/rag/ingestion.test.d.ts.map +1 -0
  108. package/dist/rag/ingestion.test.js +99 -0
  109. package/dist/rag/ingestion.test.js.map +1 -0
  110. package/dist/rag/knowledge-base.test.d.ts +17 -0
  111. package/dist/rag/knowledge-base.test.d.ts.map +1 -0
  112. package/dist/rag/knowledge-base.test.js +77 -0
  113. package/dist/rag/knowledge-base.test.js.map +1 -0
  114. package/dist/rag/rag-tool.test.d.ts +21 -0
  115. package/dist/rag/rag-tool.test.d.ts.map +1 -0
  116. package/dist/rag/rag-tool.test.js +149 -0
  117. package/dist/rag/rag-tool.test.js.map +1 -0
  118. package/dist/rag/retriever.test.d.ts +26 -0
  119. package/dist/rag/retriever.test.d.ts.map +1 -0
  120. package/dist/rag/retriever.test.js +180 -0
  121. package/dist/rag/retriever.test.js.map +1 -0
  122. package/dist/rag/vector-store.test.d.ts +38 -0
  123. package/dist/rag/vector-store.test.d.ts.map +1 -0
  124. package/dist/rag/vector-store.test.js +175 -0
  125. package/dist/rag/vector-store.test.js.map +1 -0
  126. package/dist/registry/ManagedRegistry.test.d.ts +21 -0
  127. package/dist/registry/ManagedRegistry.test.d.ts.map +1 -0
  128. package/dist/registry/ManagedRegistry.test.js +98 -0
  129. package/dist/registry/ManagedRegistry.test.js.map +1 -0
  130. package/dist/registry/Registry.test.d.ts +18 -0
  131. package/dist/registry/Registry.test.d.ts.map +1 -0
  132. package/dist/registry/Registry.test.js +79 -0
  133. package/dist/registry/Registry.test.js.map +1 -0
  134. package/dist/registry/agent/definitions.test.d.ts +15 -0
  135. package/dist/registry/agent/definitions.test.d.ts.map +1 -0
  136. package/dist/registry/agent/definitions.test.js +84 -0
  137. package/dist/registry/agent/definitions.test.js.map +1 -0
  138. package/dist/registry/connector/definitions.test.d.ts +13 -0
  139. package/dist/registry/connector/definitions.test.d.ts.map +1 -0
  140. package/dist/registry/connector/definitions.test.js +41 -0
  141. package/dist/registry/connector/definitions.test.js.map +1 -0
  142. package/dist/registry/connector/scoped.test.d.ts +21 -0
  143. package/dist/registry/connector/scoped.test.d.ts.map +1 -0
  144. package/dist/registry/connector/scoped.test.js +115 -0
  145. package/dist/registry/connector/scoped.test.js.map +1 -0
  146. package/dist/registry/plugin/index.test.d.ts +12 -0
  147. package/dist/registry/plugin/index.test.d.ts.map +1 -0
  148. package/dist/registry/plugin/index.test.js +69 -0
  149. package/dist/registry/plugin/index.test.js.map +1 -0
  150. package/dist/registry/tool/execute.test.d.ts +42 -0
  151. package/dist/registry/tool/execute.test.d.ts.map +1 -0
  152. package/dist/registry/tool/execute.test.js +281 -0
  153. package/dist/registry/tool/execute.test.js.map +1 -0
  154. package/dist/runtime/query/iteration/phases/advisory.test.d.ts +42 -0
  155. package/dist/runtime/query/iteration/phases/advisory.test.d.ts.map +1 -0
  156. package/dist/runtime/query/iteration/phases/advisory.test.js +334 -0
  157. package/dist/runtime/query/iteration/phases/advisory.test.js.map +1 -0
  158. package/dist/test-setup.d.ts +22 -0
  159. package/dist/test-setup.d.ts.map +1 -0
  160. package/dist/test-setup.js +23 -0
  161. package/dist/test-setup.js.map +1 -0
  162. package/dist/utils/logger.d.ts +1 -1
  163. package/dist/utils/logger.d.ts.map +1 -1
  164. package/dist/utils/logger.js +5 -0
  165. package/dist/utils/logger.js.map +1 -1
  166. package/package.json +4 -1
  167. package/src/advisory/context.test.ts +109 -0
  168. package/src/advisory/evaluator.test.ts +192 -0
  169. package/src/advisory/executor.test.ts +272 -0
  170. package/src/advisory/registry.test.ts +75 -0
  171. package/src/bridge/a2a/agent-card.test.ts +140 -0
  172. package/src/bridge/a2a/mapper.test.ts +293 -0
  173. package/src/bridge/a2a/message.test.ts +138 -0
  174. package/src/bridge/a2a/task.test.ts +235 -0
  175. package/src/bridge/mcp/connector/adapter.test.ts +230 -0
  176. package/src/bridge/sse/mapper.test.ts +422 -0
  177. package/src/bridge/tools/connector/adapter.test.ts +224 -0
  178. package/src/bridge/tools/connector/definitions.test.ts +183 -0
  179. package/src/bridge/tools/connector/router.test.ts +159 -0
  180. package/src/bus/breaker.test.ts +274 -0
  181. package/src/bus/index.test.ts +183 -0
  182. package/src/bus/lock.test.ts +265 -0
  183. package/src/bus/ownership.test.ts +243 -0
  184. package/src/connector/BaseConnector.test.ts +130 -0
  185. package/src/connector/builtins/http.test.ts +290 -0
  186. package/src/connector/builtins/webhook.test.ts +138 -0
  187. package/src/connector/execution/factory.test.ts +75 -0
  188. package/src/connector/execution/remote.test.ts +63 -0
  189. package/src/connector/mcp/adapter.test.ts +249 -0
  190. package/src/rag/chunking.test.ts +107 -0
  191. package/src/rag/context-assembler.test.ts +114 -0
  192. package/src/rag/embedding.test.ts +130 -0
  193. package/src/rag/ingestion.test.ts +114 -0
  194. package/src/rag/knowledge-base.test.ts +106 -0
  195. package/src/rag/rag-tool.test.ts +167 -0
  196. package/src/rag/retriever.test.ts +210 -0
  197. package/src/rag/vector-store.test.ts +196 -0
  198. package/src/registry/ManagedRegistry.test.ts +118 -0
  199. package/src/registry/Registry.test.ts +91 -0
  200. package/src/registry/agent/definitions.test.ts +100 -0
  201. package/src/registry/connector/definitions.test.ts +51 -0
  202. package/src/registry/connector/scoped.test.ts +129 -0
  203. package/src/registry/plugin/index.test.ts +85 -0
  204. package/src/registry/tool/execute.test.ts +330 -0
  205. package/src/runtime/query/iteration/phases/advisory.test.ts +412 -0
  206. package/src/test-setup.ts +24 -0
  207. 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":"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"}
@@ -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"}