too-many-cooks-core 0.7.0

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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +39 -0
  3. package/build/admin_routes.d.ts +15 -0
  4. package/build/admin_routes.d.ts.map +1 -0
  5. package/build/admin_routes.js +183 -0
  6. package/build/admin_routes.js.map +1 -0
  7. package/build/config.d.ts +35 -0
  8. package/build/config.d.ts.map +1 -0
  9. package/build/config.js +44 -0
  10. package/build/config.js.map +1 -0
  11. package/build/db-contract-tests.d.ts +16 -0
  12. package/build/db-contract-tests.d.ts.map +1 -0
  13. package/build/db-contract-tests.js +498 -0
  14. package/build/db-contract-tests.js.map +1 -0
  15. package/build/db-interface.d.ts +34 -0
  16. package/build/db-interface.d.ts.map +1 -0
  17. package/build/db-interface.js +6 -0
  18. package/build/db-interface.js.map +1 -0
  19. package/build/index.d.ts +18 -0
  20. package/build/index.d.ts.map +1 -0
  21. package/build/index.js +20 -0
  22. package/build/index.js.map +1 -0
  23. package/build/logger.d.ts +45 -0
  24. package/build/logger.d.ts.map +1 -0
  25. package/build/logger.js +59 -0
  26. package/build/logger.js.map +1 -0
  27. package/build/mcp-types.d.ts +24 -0
  28. package/build/mcp-types.d.ts.map +1 -0
  29. package/build/mcp-types.js +9 -0
  30. package/build/mcp-types.js.map +1 -0
  31. package/build/notifications.d.ts +46 -0
  32. package/build/notifications.d.ts.map +1 -0
  33. package/build/notifications.js +125 -0
  34. package/build/notifications.js.map +1 -0
  35. package/build/result.d.ts +26 -0
  36. package/build/result.d.ts.map +1 -0
  37. package/build/result.js +37 -0
  38. package/build/result.js.map +1 -0
  39. package/build/server.d.ts +21 -0
  40. package/build/server.d.ts.map +1 -0
  41. package/build/server.js +120 -0
  42. package/build/server.js.map +1 -0
  43. package/build/tools/lock_tool.d.ts +22 -0
  44. package/build/tools/lock_tool.d.ts.map +1 -0
  45. package/build/tools/lock_tool.js +184 -0
  46. package/build/tools/lock_tool.js.map +1 -0
  47. package/build/tools/message_tool.d.ts +21 -0
  48. package/build/tools/message_tool.d.ts.map +1 -0
  49. package/build/tools/message_tool.js +141 -0
  50. package/build/tools/message_tool.js.map +1 -0
  51. package/build/tools/plan_tool.d.ts +21 -0
  52. package/build/tools/plan_tool.d.ts.map +1 -0
  53. package/build/tools/plan_tool.js +132 -0
  54. package/build/tools/plan_tool.js.map +1 -0
  55. package/build/tools/register_tool.d.ts +29 -0
  56. package/build/tools/register_tool.d.ts.map +1 -0
  57. package/build/tools/register_tool.js +137 -0
  58. package/build/tools/register_tool.js.map +1 -0
  59. package/build/tools/status_tool.d.ts +19 -0
  60. package/build/tools/status_tool.d.ts.map +1 -0
  61. package/build/tools/status_tool.js +51 -0
  62. package/build/tools/status_tool.js.map +1 -0
  63. package/build/tools/tool_utils.d.ts +18 -0
  64. package/build/tools/tool_utils.d.ts.map +1 -0
  65. package/build/tools/tool_utils.js +45 -0
  66. package/build/tools/tool_utils.js.map +1 -0
  67. package/build/types.d.ts +14 -0
  68. package/build/types.d.ts.map +1 -0
  69. package/build/types.gen.d.ts +76 -0
  70. package/build/types.gen.d.ts.map +1 -0
  71. package/build/types.gen.js +133 -0
  72. package/build/types.gen.js.map +1 -0
  73. package/build/types.js +16 -0
  74. package/build/types.js.map +1 -0
  75. package/package.json +39 -0
@@ -0,0 +1,498 @@
1
+ /* eslint-disable max-lines -- Contract test suite necessarily covers full interface */
2
+ /* eslint-disable max-lines-per-function -- test suite functions necessarily exceed 50 lines */
3
+ /* eslint-disable @typescript-eslint/no-floating-promises -- node:test describe/it/beforeEach/afterEach return promises managed by the test runner */
4
+ /// Contract test suite for TooManyCooksDb interface.
5
+ ///
6
+ /// Tests the behavioral contract independent of any specific backend.
7
+ /// Any implementation of TooManyCooksDb that passes these tests is
8
+ /// guaranteed interchangeable with the SQLite implementation.
9
+ ///
10
+ /// Usage:
11
+ /// import { runDbContractTests } from "too-many-cooks-core";
12
+ /// runDbContractTests(async () => ({
13
+ /// db: yourDbInstance,
14
+ /// cleanup: async () => { /* tear down */ },
15
+ /// }));
16
+ import { afterEach, beforeEach, describe, it } from "node:test";
17
+ import assert from "node:assert/strict";
18
+ /** Expected key length in hex chars (32 bytes = 64 hex). */
19
+ const EXPECTED_KEY_LENGTH = 64;
20
+ /** Expected message ID length. */
21
+ const EXPECTED_MESSAGE_ID_LENGTH = 16;
22
+ /** Default lock timeout in ms. */
23
+ const DEFAULT_LOCK_TIMEOUT_MS = 600_000;
24
+ /** Immediately-expired lock timeout. */
25
+ const EXPIRED_LOCK_TIMEOUT_MS = 0;
26
+ /** Short lock timeout for renewal tests. */
27
+ const SHORT_LOCK_TIMEOUT_MS = 1_000;
28
+ /** Long lock timeout for renewal tests. */
29
+ const LONG_LOCK_TIMEOUT_MS = 60_000;
30
+ /** Max agent name length. */
31
+ const MAX_AGENT_NAME_LENGTH = 50;
32
+ /** Over max agent name length. */
33
+ const OVER_MAX_AGENT_NAME_LENGTH = 51;
34
+ /** Broadcast recipient. */
35
+ const BROADCAST_RECIPIENT = "*";
36
+ /** Type guard: value is an OkResult. */
37
+ const isOkResult = (result) => result.ok;
38
+ /** Unwrap a successful Result or throw. */
39
+ const unwrap = (result) => {
40
+ if (!isOkResult(result)) {
41
+ throw new Error(`Expected ok result, got error: ${JSON.stringify(result.error)}`);
42
+ }
43
+ return result.value;
44
+ };
45
+ /** Assert a Result is an error with the expected code. */
46
+ const assertError = (result, expectedCode) => {
47
+ assert.strictEqual(result.ok, false, `Expected error with code ${expectedCode}, got ok`);
48
+ assert.strictEqual(result.error?.code, expectedCode);
49
+ };
50
+ /** Run registration contract tests. */
51
+ const runRegistrationTests = (createTestDb) => {
52
+ describe("TooManyCooksDb contract: registration", () => {
53
+ let inst;
54
+ beforeEach(async () => {
55
+ inst = await createTestDb();
56
+ });
57
+ afterEach(async () => {
58
+ await inst.cleanup();
59
+ });
60
+ it("register creates agent with unique hex key", async () => {
61
+ const reg = unwrap(await inst.db.register("agent1"));
62
+ assert.strictEqual(reg.agentName, "agent1");
63
+ assert.strictEqual(reg.agentKey.length, EXPECTED_KEY_LENGTH);
64
+ });
65
+ it("register fails for duplicate active name", async () => {
66
+ unwrap(await inst.db.register("agent1"));
67
+ const result = await inst.db.register("agent1");
68
+ assert.strictEqual(result.ok, false);
69
+ });
70
+ it("register fails for empty name", async () => {
71
+ const result = await inst.db.register("");
72
+ assertError(result, "VALIDATION");
73
+ });
74
+ it("register fails for name over 50 chars", async () => {
75
+ const result = await inst.db.register("a".repeat(OVER_MAX_AGENT_NAME_LENGTH));
76
+ assertError(result, "VALIDATION");
77
+ });
78
+ it("register accepts name of exactly 50 chars", async () => {
79
+ const result = await inst.db.register("a".repeat(MAX_AGENT_NAME_LENGTH));
80
+ assert.strictEqual(result.ok, true);
81
+ });
82
+ it("two registrations produce different keys", async () => {
83
+ const reg1 = unwrap(await inst.db.register("agent1"));
84
+ const reg2 = unwrap(await inst.db.register("agent2"));
85
+ assert.notStrictEqual(reg1.agentKey, reg2.agentKey);
86
+ });
87
+ it("listAgents returns registered agents", async () => {
88
+ unwrap(await inst.db.register("agent1"));
89
+ unwrap(await inst.db.register("agent2"));
90
+ const agents = unwrap(await inst.db.listAgents());
91
+ const names = new Set(agents.map((agent) => { return agent.agentName; }));
92
+ assert.ok(names.has("agent1"));
93
+ assert.ok(names.has("agent2"));
94
+ });
95
+ });
96
+ };
97
+ /** Run authentication contract tests. */
98
+ const runAuthenticationTests = (createTestDb) => {
99
+ describe("TooManyCooksDb contract: authentication", () => {
100
+ let inst;
101
+ beforeEach(async () => {
102
+ inst = await createTestDb();
103
+ });
104
+ afterEach(async () => {
105
+ await inst.cleanup();
106
+ });
107
+ it("authenticate succeeds with correct key", async () => {
108
+ const reg = unwrap(await inst.db.register("agent1"));
109
+ const auth = unwrap(await inst.db.authenticate("agent1", reg.agentKey));
110
+ assert.strictEqual(auth.agentName, "agent1");
111
+ });
112
+ it("authenticate fails with wrong key", async () => {
113
+ unwrap(await inst.db.register("agent1"));
114
+ assertError(await inst.db.authenticate("agent1", "wrong-key"), "UNAUTHORIZED");
115
+ });
116
+ it("authenticate fails for nonexistent agent", async () => {
117
+ assertError(await inst.db.authenticate("ghost", "any-key"), "UNAUTHORIZED");
118
+ });
119
+ it("authenticate updates last_active timestamp", async () => {
120
+ const reg = unwrap(await inst.db.register("agent1"));
121
+ const first = unwrap(await inst.db.authenticate("agent1", reg.agentKey));
122
+ const second = unwrap(await inst.db.authenticate("agent1", reg.agentKey));
123
+ assert.ok(second.lastActive >= first.lastActive);
124
+ });
125
+ it("lookupByKey returns agent name", async () => {
126
+ const reg = unwrap(await inst.db.register("agent1"));
127
+ const name = unwrap(await inst.db.lookupByKey(reg.agentKey));
128
+ assert.strictEqual(name, "agent1");
129
+ });
130
+ it("lookupByKey fails for invalid key", async () => {
131
+ assertError(await inst.db.lookupByKey("invalid-key"), "UNAUTHORIZED");
132
+ });
133
+ });
134
+ };
135
+ /** Run lock contract tests. */
136
+ const runLockTests = (createTestDb) => {
137
+ describe("TooManyCooksDb contract: locks", () => {
138
+ let state;
139
+ beforeEach(async () => {
140
+ const inst = await createTestDb();
141
+ const reg = unwrap(await inst.db.register("lock-agent"));
142
+ state = { inst, agentName: reg.agentName, agentKey: reg.agentKey };
143
+ });
144
+ afterEach(async () => {
145
+ await state.inst.cleanup();
146
+ });
147
+ it("acquire and release lock", async () => {
148
+ const lockResult = unwrap(await state.inst.db.acquireLock("file.ts", state.agentName, state.agentKey, "editing", DEFAULT_LOCK_TIMEOUT_MS));
149
+ assert.strictEqual(lockResult.acquired, true);
150
+ const release = await state.inst.db.releaseLock("file.ts", state.agentName, state.agentKey);
151
+ assert.strictEqual(release.ok, true);
152
+ const query = unwrap(await state.inst.db.queryLock("file.ts"));
153
+ assert.strictEqual(query, null);
154
+ });
155
+ it("lock conflict between agents (acquired=false, not error)", async () => {
156
+ const reg2 = unwrap(await state.inst.db.register("agent2"));
157
+ unwrap(await state.inst.db.acquireLock("file.ts", state.agentName, state.agentKey, null, DEFAULT_LOCK_TIMEOUT_MS));
158
+ const conflict = unwrap(await state.inst.db.acquireLock("file.ts", reg2.agentName, reg2.agentKey, null, DEFAULT_LOCK_TIMEOUT_MS));
159
+ assert.strictEqual(conflict.acquired, false);
160
+ });
161
+ it("acquire fails with invalid credentials", async () => {
162
+ assertError(await state.inst.db.acquireLock("file.ts", state.agentName, "wrong", null, DEFAULT_LOCK_TIMEOUT_MS), "UNAUTHORIZED");
163
+ });
164
+ it("release fails when not owned", async () => {
165
+ assertError(await state.inst.db.releaseLock("file.ts", state.agentName, state.agentKey), "NOT_FOUND");
166
+ });
167
+ it("queryLock returns null for unlocked file", async () => {
168
+ const query = unwrap(await state.inst.db.queryLock("unlocked.ts"));
169
+ assert.strictEqual(query, null);
170
+ });
171
+ it("queryLock returns lock info", async () => {
172
+ unwrap(await state.inst.db.acquireLock("file.ts", state.agentName, state.agentKey, "testing", DEFAULT_LOCK_TIMEOUT_MS));
173
+ const lock = unwrap(await state.inst.db.queryLock("file.ts"));
174
+ assert.notStrictEqual(lock, null);
175
+ if (lock) {
176
+ assert.strictEqual(lock.filePath, "file.ts");
177
+ assert.strictEqual(lock.agentName, state.agentName);
178
+ assert.strictEqual(lock.reason, "testing");
179
+ }
180
+ });
181
+ it("listLocks returns all active locks", async () => {
182
+ unwrap(await state.inst.db.acquireLock("file1.ts", state.agentName, state.agentKey, null, DEFAULT_LOCK_TIMEOUT_MS));
183
+ unwrap(await state.inst.db.acquireLock("file2.ts", state.agentName, state.agentKey, null, DEFAULT_LOCK_TIMEOUT_MS));
184
+ const locks = unwrap(await state.inst.db.listLocks());
185
+ assert.strictEqual(locks.length, 2);
186
+ });
187
+ it("renew extends lock expiration and increments version", async () => {
188
+ unwrap(await state.inst.db.acquireLock("file.ts", state.agentName, state.agentKey, null, SHORT_LOCK_TIMEOUT_MS));
189
+ const before = unwrap(await state.inst.db.queryLock("file.ts"));
190
+ const renew = await state.inst.db.renewLock("file.ts", state.agentName, state.agentKey, LONG_LOCK_TIMEOUT_MS);
191
+ assert.strictEqual(renew.ok, true);
192
+ const after = unwrap(await state.inst.db.queryLock("file.ts"));
193
+ if (before && after) {
194
+ assert.ok(after.expiresAt > before.expiresAt);
195
+ assert.ok(after.version > before.version);
196
+ }
197
+ });
198
+ it("renew fails when not owned", async () => {
199
+ assertError(await state.inst.db.renewLock("file.ts", state.agentName, state.agentKey, DEFAULT_LOCK_TIMEOUT_MS), "NOT_FOUND");
200
+ });
201
+ it("expired lock can be taken over by another agent", async () => {
202
+ unwrap(await state.inst.db.acquireLock("file.ts", state.agentName, state.agentKey, null, EXPIRED_LOCK_TIMEOUT_MS));
203
+ const reg2 = unwrap(await state.inst.db.register("agent2"));
204
+ const takeover = unwrap(await state.inst.db.acquireLock("file.ts", reg2.agentName, reg2.agentKey, null, DEFAULT_LOCK_TIMEOUT_MS));
205
+ assert.strictEqual(takeover.acquired, true);
206
+ });
207
+ it("forceReleaseLock fails on non-expired lock", async () => {
208
+ const reg2 = unwrap(await state.inst.db.register("agent2"));
209
+ unwrap(await state.inst.db.acquireLock("file.ts", state.agentName, state.agentKey, null, DEFAULT_LOCK_TIMEOUT_MS));
210
+ assertError(await state.inst.db.forceReleaseLock("file.ts", reg2.agentName, reg2.agentKey), "LOCK_HELD");
211
+ });
212
+ it("forceReleaseLock fails when no lock exists", async () => {
213
+ assertError(await state.inst.db.forceReleaseLock("file.ts", state.agentName, state.agentKey), "NOT_FOUND");
214
+ });
215
+ });
216
+ };
217
+ /** Run message contract tests. */
218
+ const runMessageTests = (createTestDb) => {
219
+ describe("TooManyCooksDb contract: messages", () => {
220
+ let state;
221
+ beforeEach(async () => {
222
+ const inst = await createTestDb();
223
+ const sender = unwrap(await inst.db.register("sender"));
224
+ const receiver = unwrap(await inst.db.register("receiver"));
225
+ state = {
226
+ inst,
227
+ senderName: sender.agentName,
228
+ senderKey: sender.agentKey,
229
+ receiverName: receiver.agentName,
230
+ receiverKey: receiver.agentKey,
231
+ };
232
+ });
233
+ afterEach(async () => {
234
+ await state.inst.cleanup();
235
+ });
236
+ it("send and receive message", async () => {
237
+ const msgId = unwrap(await state.inst.db.sendMessage(state.senderName, state.senderKey, state.receiverName, "hello"));
238
+ assert.strictEqual(msgId.length, EXPECTED_MESSAGE_ID_LENGTH);
239
+ const msgs = unwrap(await state.inst.db.getMessages(state.receiverName, state.receiverKey, { unreadOnly: true }));
240
+ assert.strictEqual(msgs.length, 1);
241
+ const [firstMsg] = msgs;
242
+ if (firstMsg === undefined) {
243
+ throw new Error("Expected first message");
244
+ }
245
+ assert.strictEqual(firstMsg.content, "hello");
246
+ assert.strictEqual(firstMsg.fromAgent, state.senderName);
247
+ });
248
+ it("send fails with invalid credentials", async () => {
249
+ assertError(await state.inst.db.sendMessage(state.senderName, "wrong", state.receiverName, "hi"), "UNAUTHORIZED");
250
+ });
251
+ it("getMessages auto-marks as read", async () => {
252
+ unwrap(await state.inst.db.sendMessage(state.senderName, state.senderKey, state.receiverName, "test"));
253
+ // First fetch auto-marks as read
254
+ unwrap(await state.inst.db.getMessages(state.receiverName, state.receiverKey));
255
+ // Second fetch with unreadOnly returns empty
256
+ const unread = unwrap(await state.inst.db.getMessages(state.receiverName, state.receiverKey, { unreadOnly: true }));
257
+ assert.strictEqual(unread.length, 0);
258
+ });
259
+ it("getMessages unreadOnly=false returns all messages", async () => {
260
+ unwrap(await state.inst.db.sendMessage(state.senderName, state.senderKey, state.receiverName, "test"));
261
+ unwrap(await state.inst.db.getMessages(state.receiverName, state.receiverKey)); // Marks read
262
+ const all = unwrap(await state.inst.db.getMessages(state.receiverName, state.receiverKey, { unreadOnly: false }));
263
+ assert.strictEqual(all.length, 1);
264
+ });
265
+ it("broadcast message reaches other agents", async () => {
266
+ const reg3 = unwrap(await state.inst.db.register("agent3"));
267
+ unwrap(await state.inst.db.sendMessage(state.senderName, state.senderKey, BROADCAST_RECIPIENT, "announcement"));
268
+ const msgs2 = unwrap(await state.inst.db.getMessages(state.receiverName, state.receiverKey));
269
+ const msgs3 = unwrap(await state.inst.db.getMessages(reg3.agentName, reg3.agentKey));
270
+ assert.ok(msgs2.some((msg) => { return msg.content === "announcement"; }));
271
+ assert.ok(msgs3.some((msg) => { return msg.content === "announcement"; }));
272
+ });
273
+ it("mark message as read", async () => {
274
+ const msgId = unwrap(await state.inst.db.sendMessage(state.senderName, state.senderKey, state.receiverName, "hi"));
275
+ const markResult = await state.inst.db.markRead(msgId, state.receiverName, state.receiverKey);
276
+ assert.strictEqual(markResult.ok, true);
277
+ const unread = unwrap(await state.inst.db.getMessages(state.receiverName, state.receiverKey, { unreadOnly: true }));
278
+ assert.strictEqual(unread.length, 0);
279
+ });
280
+ it("markRead fails for nonexistent message", async () => {
281
+ assertError(await state.inst.db.markRead("nonexistent-id", state.receiverName, state.receiverKey), "NOT_FOUND");
282
+ });
283
+ it("listAllMessages returns all messages", async () => {
284
+ unwrap(await state.inst.db.sendMessage(state.senderName, state.senderKey, state.receiverName, "direct"));
285
+ unwrap(await state.inst.db.sendMessage(state.senderName, state.senderKey, BROADCAST_RECIPIENT, "broadcast"));
286
+ const all = unwrap(await state.inst.db.listAllMessages());
287
+ assert.strictEqual(all.length, 2);
288
+ });
289
+ it("message contains correct metadata", async () => {
290
+ unwrap(await state.inst.db.sendMessage(state.senderName, state.senderKey, state.receiverName, "test"));
291
+ const msgs = unwrap(await state.inst.db.getMessages(state.receiverName, state.receiverKey));
292
+ const [msg] = msgs;
293
+ if (!msg) {
294
+ throw new Error("Expected message");
295
+ }
296
+ assert.strictEqual(msg.fromAgent, state.senderName);
297
+ assert.strictEqual(msg.toAgent, state.receiverName);
298
+ assert.strictEqual(msg.content, "test");
299
+ assert.ok(msg.createdAt > 0);
300
+ assert.strictEqual(msg.id.length, EXPECTED_MESSAGE_ID_LENGTH);
301
+ });
302
+ });
303
+ };
304
+ /** Run plan contract tests. */
305
+ const runPlanTests = (createTestDb) => {
306
+ describe("TooManyCooksDb contract: plans", () => {
307
+ let state;
308
+ beforeEach(async () => {
309
+ const inst = await createTestDb();
310
+ const reg = unwrap(await inst.db.register("plan-agent"));
311
+ state = { inst, agentName: reg.agentName, agentKey: reg.agentKey };
312
+ });
313
+ afterEach(async () => {
314
+ await state.inst.cleanup();
315
+ });
316
+ it("update and get plan", async () => {
317
+ unwrap(await state.inst.db.updatePlan(state.agentName, state.agentKey, "build feature", "writing tests"));
318
+ const plan = unwrap(await state.inst.db.getPlan(state.agentName));
319
+ if (!plan) {
320
+ throw new Error("Expected plan");
321
+ }
322
+ assert.strictEqual(plan.goal, "build feature");
323
+ assert.strictEqual(plan.currentTask, "writing tests");
324
+ assert.strictEqual(plan.agentName, state.agentName);
325
+ assert.ok(plan.updatedAt > 0);
326
+ });
327
+ it("one plan per agent - update replaces", async () => {
328
+ unwrap(await state.inst.db.updatePlan(state.agentName, state.agentKey, "goal1", "task1"));
329
+ unwrap(await state.inst.db.updatePlan(state.agentName, state.agentKey, "goal2", "task2"));
330
+ const plans = unwrap(await state.inst.db.listPlans());
331
+ const agentPlans = plans.filter((plan) => { return plan.agentName === state.agentName; });
332
+ assert.strictEqual(agentPlans.length, 1);
333
+ assert.strictEqual(agentPlans[0]?.goal, "goal2");
334
+ });
335
+ it("getPlan returns null for agent without plan", async () => {
336
+ const reg2 = unwrap(await state.inst.db.register("no-plan"));
337
+ const plan = unwrap(await state.inst.db.getPlan(reg2.agentName));
338
+ assert.strictEqual(plan, null);
339
+ });
340
+ it("updatePlan fails with invalid credentials", async () => {
341
+ assertError(await state.inst.db.updatePlan(state.agentName, "wrong", "goal", "task"), "UNAUTHORIZED");
342
+ });
343
+ it("listPlans returns all plans", async () => {
344
+ const reg2 = unwrap(await state.inst.db.register("agent2"));
345
+ unwrap(await state.inst.db.updatePlan(state.agentName, state.agentKey, "goal1", "task1"));
346
+ unwrap(await state.inst.db.updatePlan(reg2.agentName, reg2.agentKey, "goal2", "task2"));
347
+ const plans = unwrap(await state.inst.db.listPlans());
348
+ assert.strictEqual(plans.length, 2);
349
+ const goals = new Set(plans.map((plan) => { return plan.goal; }));
350
+ assert.ok(goals.has("goal1"));
351
+ assert.ok(goals.has("goal2"));
352
+ });
353
+ it("plan updatedAt changes on update", async () => {
354
+ unwrap(await state.inst.db.updatePlan(state.agentName, state.agentKey, "goal", "task1"));
355
+ const plan1 = unwrap(await state.inst.db.getPlan(state.agentName));
356
+ unwrap(await state.inst.db.updatePlan(state.agentName, state.agentKey, "goal", "task2"));
357
+ const plan2 = unwrap(await state.inst.db.getPlan(state.agentName));
358
+ if (plan1 && plan2) {
359
+ assert.ok(plan2.updatedAt >= plan1.updatedAt);
360
+ }
361
+ });
362
+ });
363
+ };
364
+ /** Run activation contract tests. */
365
+ const runActivationTests = (createTestDb) => {
366
+ describe("TooManyCooksDb contract: activation", () => {
367
+ let inst;
368
+ beforeEach(async () => {
369
+ inst = await createTestDb();
370
+ });
371
+ afterEach(async () => {
372
+ await inst.cleanup();
373
+ });
374
+ it("activate and deactivate agent", async () => {
375
+ unwrap(await inst.db.register("agent1"));
376
+ const activateResult = await inst.db.activate("agent1");
377
+ assert.strictEqual(activateResult.ok, true);
378
+ const deactivateResult = await inst.db.deactivate("agent1");
379
+ assert.strictEqual(deactivateResult.ok, true);
380
+ });
381
+ it("activate fails for nonexistent agent", async () => {
382
+ assertError(await inst.db.activate("ghost"), "NOT_FOUND");
383
+ });
384
+ it("deactivate fails for nonexistent agent", async () => {
385
+ assertError(await inst.db.deactivate("ghost"), "NOT_FOUND");
386
+ });
387
+ it("deactivateAll succeeds", async () => {
388
+ unwrap(await inst.db.register("agent1"));
389
+ unwrap(await inst.db.register("agent2"));
390
+ await inst.db.activate("agent1");
391
+ await inst.db.activate("agent2");
392
+ const result = await inst.db.deactivateAll();
393
+ assert.strictEqual(result.ok, true);
394
+ });
395
+ it("deactivateAll succeeds with no agents", async () => {
396
+ const result = await inst.db.deactivateAll();
397
+ assert.strictEqual(result.ok, true);
398
+ });
399
+ });
400
+ };
401
+ /** Run admin operation contract tests. */
402
+ const runAdminTests = (createTestDb) => {
403
+ describe("TooManyCooksDb contract: admin operations", () => {
404
+ let inst;
405
+ beforeEach(async () => {
406
+ inst = await createTestDb();
407
+ });
408
+ afterEach(async () => {
409
+ await inst.cleanup();
410
+ });
411
+ it("adminDeleteLock removes lock", async () => {
412
+ const reg = unwrap(await inst.db.register("agent1"));
413
+ unwrap(await inst.db.acquireLock("file.ts", reg.agentName, reg.agentKey, null, DEFAULT_LOCK_TIMEOUT_MS));
414
+ const del = await inst.db.adminDeleteLock("file.ts");
415
+ assert.strictEqual(del.ok, true);
416
+ const query = unwrap(await inst.db.queryLock("file.ts"));
417
+ assert.strictEqual(query, null);
418
+ });
419
+ it("adminDeleteLock fails for nonexistent lock", async () => {
420
+ assertError(await inst.db.adminDeleteLock("nope.ts"), "NOT_FOUND");
421
+ });
422
+ it("adminDeleteAgent cascades (removes locks, plans, messages)", async () => {
423
+ const reg = unwrap(await inst.db.register("doomed"));
424
+ const reg2 = unwrap(await inst.db.register("other"));
425
+ unwrap(await inst.db.acquireLock("file.ts", reg.agentName, reg.agentKey, null, DEFAULT_LOCK_TIMEOUT_MS));
426
+ unwrap(await inst.db.updatePlan(reg.agentName, reg.agentKey, "goal", "task"));
427
+ unwrap(await inst.db.sendMessage(reg.agentName, reg.agentKey, reg2.agentName, "hello"));
428
+ const del = await inst.db.adminDeleteAgent("doomed");
429
+ assert.strictEqual(del.ok, true);
430
+ const agents = unwrap(await inst.db.listAgents());
431
+ assert.strictEqual(agents.filter((agent) => { return agent.agentName === "doomed"; }).length, 0);
432
+ const locks = unwrap(await inst.db.listLocks());
433
+ assert.strictEqual(locks.filter((lock) => { return lock.agentName === "doomed"; }).length, 0);
434
+ const plan = unwrap(await inst.db.getPlan("doomed"));
435
+ assert.strictEqual(plan, null);
436
+ });
437
+ it("adminDeleteAgent fails for nonexistent agent", async () => {
438
+ assertError(await inst.db.adminDeleteAgent("ghost"), "NOT_FOUND");
439
+ });
440
+ it("adminResetKey generates new key, invalidates old", async () => {
441
+ const reg = unwrap(await inst.db.register("agent1"));
442
+ const oldKey = reg.agentKey;
443
+ const newReg = unwrap(await inst.db.adminResetKey("agent1"));
444
+ assert.strictEqual(newReg.agentName, "agent1");
445
+ assert.notStrictEqual(newReg.agentKey, oldKey);
446
+ assert.strictEqual(newReg.agentKey.length, EXPECTED_KEY_LENGTH);
447
+ // Old key fails
448
+ assertError(await inst.db.authenticate("agent1", oldKey), "UNAUTHORIZED");
449
+ // New key works
450
+ const auth = await inst.db.authenticate("agent1", newReg.agentKey);
451
+ assert.strictEqual(auth.ok, true);
452
+ });
453
+ it("adminResetKey releases locks held by agent", async () => {
454
+ const reg = unwrap(await inst.db.register("agent1"));
455
+ unwrap(await inst.db.acquireLock("file.ts", reg.agentName, reg.agentKey, null, DEFAULT_LOCK_TIMEOUT_MS));
456
+ unwrap(await inst.db.adminResetKey("agent1"));
457
+ const lock = unwrap(await inst.db.queryLock("file.ts"));
458
+ assert.strictEqual(lock, null);
459
+ });
460
+ it("adminResetKey fails for nonexistent agent", async () => {
461
+ assertError(await inst.db.adminResetKey("ghost"), "NOT_FOUND");
462
+ });
463
+ it("adminReset clears transient data but preserves identity", async () => {
464
+ const reg = unwrap(await inst.db.register("agent1"));
465
+ unwrap(await inst.db.acquireLock("file.ts", reg.agentName, reg.agentKey, null, DEFAULT_LOCK_TIMEOUT_MS));
466
+ unwrap(await inst.db.updatePlan(reg.agentName, reg.agentKey, "goal", "task"));
467
+ unwrap(await inst.db.adminReset());
468
+ // Transient data cleared
469
+ const locks = unwrap(await inst.db.listLocks());
470
+ assert.strictEqual(locks.length, 0);
471
+ const plans = unwrap(await inst.db.listPlans());
472
+ assert.strictEqual(plans.length, 0);
473
+ // Identity preserved - agent can reconnect with saved key
474
+ const lookup = unwrap(await inst.db.lookupByKey(reg.agentKey));
475
+ assert.strictEqual(lookup, "agent1");
476
+ });
477
+ it("adminSendMessage sends without auth", async () => {
478
+ unwrap(await inst.db.register("recipient"));
479
+ const msgId = unwrap(await inst.db.adminSendMessage("system", "recipient", "hello from admin"));
480
+ assert.strictEqual(msgId.length, EXPECTED_MESSAGE_ID_LENGTH);
481
+ });
482
+ });
483
+ };
484
+ /**
485
+ * Run the full TooManyCooksDb contract test suite.
486
+ *
487
+ * @param createTestDb - Factory that creates a fresh db instance per test
488
+ */
489
+ export const runDbContractTests = (createTestDb) => {
490
+ runRegistrationTests(createTestDb);
491
+ runAuthenticationTests(createTestDb);
492
+ runLockTests(createTestDb);
493
+ runMessageTests(createTestDb);
494
+ runPlanTests(createTestDb);
495
+ runActivationTests(createTestDb);
496
+ runAdminTests(createTestDb);
497
+ };
498
+ //# sourceMappingURL=db-contract-tests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-contract-tests.js","sourceRoot":"","sources":["../src/db-contract-tests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { Result } from "./result.js";
2
+ import type { AgentIdentity, AgentPlan, AgentRegistration, DbError, FileLock, LockResult, Message } from "./types.js";
3
+ /** Data access layer type. */
4
+ export type TooManyCooksDb = {
5
+ readonly register: (agentName: string) => Promise<Result<AgentRegistration, DbError>>;
6
+ readonly authenticate: (agentName: string, agentKey: string) => Promise<Result<AgentIdentity, DbError>>;
7
+ readonly lookupByKey: (agentKey: string) => Promise<Result<string, DbError>>;
8
+ readonly listAgents: () => Promise<Result<readonly AgentIdentity[], DbError>>;
9
+ readonly acquireLock: (filePath: string, agentName: string, agentKey: string, reason: string | null | undefined, timeoutMs: number) => Promise<Result<LockResult, DbError>>;
10
+ readonly releaseLock: (filePath: string, agentName: string, agentKey: string) => Promise<Result<void, DbError>>;
11
+ readonly forceReleaseLock: (filePath: string, agentName: string, agentKey: string) => Promise<Result<void, DbError>>;
12
+ readonly queryLock: (filePath: string) => Promise<Result<FileLock | null, DbError>>;
13
+ readonly listLocks: () => Promise<Result<readonly FileLock[], DbError>>;
14
+ readonly renewLock: (filePath: string, agentName: string, agentKey: string, timeoutMs: number) => Promise<Result<void, DbError>>;
15
+ readonly sendMessage: (fromAgent: string, fromKey: string, toAgent: string, content: string) => Promise<Result<string, DbError>>;
16
+ readonly getMessages: (agentName: string, agentKey: string, options?: {
17
+ readonly unreadOnly?: boolean;
18
+ }) => Promise<Result<readonly Message[], DbError>>;
19
+ readonly markRead: (messageId: string, agentName: string, agentKey: string) => Promise<Result<void, DbError>>;
20
+ readonly updatePlan: (agentName: string, agentKey: string, goal: string, currentTask: string) => Promise<Result<void, DbError>>;
21
+ readonly getPlan: (agentName: string) => Promise<Result<AgentPlan | null, DbError>>;
22
+ readonly listPlans: () => Promise<Result<readonly AgentPlan[], DbError>>;
23
+ readonly listAllMessages: () => Promise<Result<readonly Message[], DbError>>;
24
+ readonly activate: (agentName: string) => Promise<Result<void, DbError>>;
25
+ readonly deactivate: (agentName: string) => Promise<Result<void, DbError>>;
26
+ readonly deactivateAll: () => Promise<Result<void, DbError>>;
27
+ readonly close: () => Promise<Result<void, DbError>>;
28
+ readonly adminDeleteLock: (filePath: string) => Promise<Result<void, DbError>>;
29
+ readonly adminDeleteAgent: (agentName: string) => Promise<Result<void, DbError>>;
30
+ readonly adminResetKey: (agentName: string) => Promise<Result<AgentRegistration, DbError>>;
31
+ readonly adminSendMessage: (fromAgent: string, toAgent: string, content: string) => Promise<Result<string, DbError>>;
32
+ readonly adminReset: () => Promise<Result<void, DbError>>;
33
+ };
34
+ //# sourceMappingURL=db-interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-interface.d.ts","sourceRoot":"","sources":["../src/db-interface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /// Database interface for Too Many Cooks.
2
+ ///
3
+ /// Backend-agnostic contract. Implementations live in @too-many-cooks/local
4
+ /// (SQLite for local mode, encrypted cloud client for cloud mode).
5
+ export {};
6
+ //# sourceMappingURL=db-interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-interface.js","sourceRoot":"","sources":["../src/db-interface.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,GAAG;AACH,4EAA4E;AAC5E,mEAAmE"}
@@ -0,0 +1,18 @@
1
+ export * from "./result.js";
2
+ export * from "./logger.js";
3
+ export * from "./types.gen.js";
4
+ export * from "./types.js";
5
+ export * from "./config.js";
6
+ export * from "./mcp-types.js";
7
+ export * from "./notifications.js";
8
+ export type * from "./db-interface.js";
9
+ export * from "./tools/register_tool.js";
10
+ export * from "./tools/lock_tool.js";
11
+ export * from "./tools/message_tool.js";
12
+ export * from "./tools/plan_tool.js";
13
+ export * from "./tools/status_tool.js";
14
+ export * from "./tools/tool_utils.js";
15
+ export * from "./admin_routes.js";
16
+ export { createMcpServerForDb, createConsoleLogger, type ServerBundle } from "./server.js";
17
+ export * from "./db-contract-tests.js";
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,mBAAmB,mBAAmB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3F,cAAc,wBAAwB,CAAC"}