opencode-swarm-plugin 0.43.0 → 0.44.1

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 (208) hide show
  1. package/bin/cass.characterization.test.ts +422 -0
  2. package/bin/swarm.serve.test.ts +6 -4
  3. package/bin/swarm.test.ts +68 -0
  4. package/bin/swarm.ts +81 -8
  5. package/dist/compaction-prompt-scoring.js +139 -0
  6. package/dist/contributor-tools.d.ts +42 -0
  7. package/dist/contributor-tools.d.ts.map +1 -0
  8. package/dist/eval-capture.js +12811 -0
  9. package/dist/hive.d.ts.map +1 -1
  10. package/dist/index.d.ts +12 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +7728 -62590
  13. package/dist/plugin.js +23833 -78695
  14. package/dist/sessions/agent-discovery.d.ts +59 -0
  15. package/dist/sessions/agent-discovery.d.ts.map +1 -0
  16. package/dist/sessions/index.d.ts +10 -0
  17. package/dist/sessions/index.d.ts.map +1 -0
  18. package/dist/swarm-orchestrate.d.ts.map +1 -1
  19. package/dist/swarm-prompts.d.ts.map +1 -1
  20. package/dist/swarm-review.d.ts.map +1 -1
  21. package/package.json +17 -5
  22. package/.changeset/swarm-insights-data-layer.md +0 -63
  23. package/.hive/analysis/eval-failure-analysis-2025-12-25.md +0 -331
  24. package/.hive/analysis/session-data-quality-audit.md +0 -320
  25. package/.hive/eval-results.json +0 -483
  26. package/.hive/issues.jsonl +0 -138
  27. package/.hive/memories.jsonl +0 -729
  28. package/.opencode/eval-history.jsonl +0 -327
  29. package/.turbo/turbo-build.log +0 -9
  30. package/CHANGELOG.md +0 -2255
  31. package/SCORER-ANALYSIS.md +0 -598
  32. package/docs/analysis/subagent-coordination-patterns.md +0 -902
  33. package/docs/analysis-socratic-planner-pattern.md +0 -504
  34. package/docs/planning/ADR-001-monorepo-structure.md +0 -171
  35. package/docs/planning/ADR-002-package-extraction.md +0 -393
  36. package/docs/planning/ADR-003-performance-improvements.md +0 -451
  37. package/docs/planning/ADR-004-message-queue-features.md +0 -187
  38. package/docs/planning/ADR-005-devtools-observability.md +0 -202
  39. package/docs/planning/ADR-007-swarm-enhancements-worktree-review.md +0 -168
  40. package/docs/planning/ADR-008-worker-handoff-protocol.md +0 -293
  41. package/docs/planning/ADR-009-oh-my-opencode-patterns.md +0 -353
  42. package/docs/planning/ROADMAP.md +0 -368
  43. package/docs/semantic-memory-cli-syntax.md +0 -123
  44. package/docs/swarm-mail-architecture.md +0 -1147
  45. package/docs/testing/context-recovery-test.md +0 -470
  46. package/evals/ARCHITECTURE.md +0 -1189
  47. package/evals/README.md +0 -768
  48. package/evals/compaction-prompt.eval.ts +0 -149
  49. package/evals/compaction-resumption.eval.ts +0 -289
  50. package/evals/coordinator-behavior.eval.ts +0 -307
  51. package/evals/coordinator-session.eval.ts +0 -154
  52. package/evals/evalite.config.ts.bak +0 -15
  53. package/evals/example.eval.ts +0 -31
  54. package/evals/fixtures/compaction-cases.ts +0 -350
  55. package/evals/fixtures/compaction-prompt-cases.ts +0 -311
  56. package/evals/fixtures/coordinator-sessions.ts +0 -328
  57. package/evals/fixtures/decomposition-cases.ts +0 -105
  58. package/evals/lib/compaction-loader.test.ts +0 -248
  59. package/evals/lib/compaction-loader.ts +0 -320
  60. package/evals/lib/data-loader.evalite-test.ts +0 -289
  61. package/evals/lib/data-loader.test.ts +0 -345
  62. package/evals/lib/data-loader.ts +0 -281
  63. package/evals/lib/llm.ts +0 -115
  64. package/evals/scorers/compaction-prompt-scorers.ts +0 -145
  65. package/evals/scorers/compaction-scorers.ts +0 -305
  66. package/evals/scorers/coordinator-discipline.evalite-test.ts +0 -539
  67. package/evals/scorers/coordinator-discipline.ts +0 -325
  68. package/evals/scorers/index.test.ts +0 -146
  69. package/evals/scorers/index.ts +0 -328
  70. package/evals/scorers/outcome-scorers.evalite-test.ts +0 -27
  71. package/evals/scorers/outcome-scorers.ts +0 -349
  72. package/evals/swarm-decomposition.eval.ts +0 -121
  73. package/examples/commands/swarm.md +0 -745
  74. package/examples/plugin-wrapper-template.ts +0 -2426
  75. package/examples/skills/hive-workflow/SKILL.md +0 -212
  76. package/examples/skills/skill-creator/SKILL.md +0 -223
  77. package/examples/skills/swarm-coordination/SKILL.md +0 -292
  78. package/global-skills/cli-builder/SKILL.md +0 -344
  79. package/global-skills/cli-builder/references/advanced-patterns.md +0 -244
  80. package/global-skills/learning-systems/SKILL.md +0 -644
  81. package/global-skills/skill-creator/LICENSE.txt +0 -202
  82. package/global-skills/skill-creator/SKILL.md +0 -352
  83. package/global-skills/skill-creator/references/output-patterns.md +0 -82
  84. package/global-skills/skill-creator/references/workflows.md +0 -28
  85. package/global-skills/swarm-coordination/SKILL.md +0 -995
  86. package/global-skills/swarm-coordination/references/coordinator-patterns.md +0 -235
  87. package/global-skills/swarm-coordination/references/strategies.md +0 -138
  88. package/global-skills/system-design/SKILL.md +0 -213
  89. package/global-skills/testing-patterns/SKILL.md +0 -430
  90. package/global-skills/testing-patterns/references/dependency-breaking-catalog.md +0 -586
  91. package/opencode-swarm-plugin-0.30.7.tgz +0 -0
  92. package/opencode-swarm-plugin-0.31.0.tgz +0 -0
  93. package/scripts/cleanup-test-memories.ts +0 -346
  94. package/scripts/init-skill.ts +0 -222
  95. package/scripts/migrate-unknown-sessions.ts +0 -349
  96. package/scripts/validate-skill.ts +0 -204
  97. package/src/agent-mail.ts +0 -1724
  98. package/src/anti-patterns.test.ts +0 -1167
  99. package/src/anti-patterns.ts +0 -448
  100. package/src/compaction-capture.integration.test.ts +0 -257
  101. package/src/compaction-hook.test.ts +0 -838
  102. package/src/compaction-hook.ts +0 -1204
  103. package/src/compaction-observability.integration.test.ts +0 -139
  104. package/src/compaction-observability.test.ts +0 -187
  105. package/src/compaction-observability.ts +0 -324
  106. package/src/compaction-prompt-scorers.test.ts +0 -475
  107. package/src/compaction-prompt-scoring.ts +0 -300
  108. package/src/dashboard.test.ts +0 -611
  109. package/src/dashboard.ts +0 -462
  110. package/src/error-enrichment.test.ts +0 -403
  111. package/src/error-enrichment.ts +0 -219
  112. package/src/eval-capture.test.ts +0 -1015
  113. package/src/eval-capture.ts +0 -929
  114. package/src/eval-gates.test.ts +0 -306
  115. package/src/eval-gates.ts +0 -218
  116. package/src/eval-history.test.ts +0 -508
  117. package/src/eval-history.ts +0 -214
  118. package/src/eval-learning.test.ts +0 -378
  119. package/src/eval-learning.ts +0 -360
  120. package/src/eval-runner.test.ts +0 -223
  121. package/src/eval-runner.ts +0 -402
  122. package/src/export-tools.test.ts +0 -476
  123. package/src/export-tools.ts +0 -257
  124. package/src/hive.integration.test.ts +0 -2241
  125. package/src/hive.ts +0 -1628
  126. package/src/index.ts +0 -935
  127. package/src/learning.integration.test.ts +0 -1815
  128. package/src/learning.ts +0 -1079
  129. package/src/logger.test.ts +0 -189
  130. package/src/logger.ts +0 -135
  131. package/src/mandate-promotion.test.ts +0 -473
  132. package/src/mandate-promotion.ts +0 -239
  133. package/src/mandate-storage.integration.test.ts +0 -601
  134. package/src/mandate-storage.test.ts +0 -578
  135. package/src/mandate-storage.ts +0 -794
  136. package/src/mandates.ts +0 -540
  137. package/src/memory-tools.test.ts +0 -195
  138. package/src/memory-tools.ts +0 -344
  139. package/src/memory.integration.test.ts +0 -334
  140. package/src/memory.test.ts +0 -158
  141. package/src/memory.ts +0 -527
  142. package/src/model-selection.test.ts +0 -188
  143. package/src/model-selection.ts +0 -68
  144. package/src/observability-tools.test.ts +0 -359
  145. package/src/observability-tools.ts +0 -871
  146. package/src/output-guardrails.test.ts +0 -438
  147. package/src/output-guardrails.ts +0 -381
  148. package/src/pattern-maturity.test.ts +0 -1160
  149. package/src/pattern-maturity.ts +0 -525
  150. package/src/planning-guardrails.test.ts +0 -491
  151. package/src/planning-guardrails.ts +0 -438
  152. package/src/plugin.ts +0 -23
  153. package/src/post-compaction-tracker.test.ts +0 -251
  154. package/src/post-compaction-tracker.ts +0 -237
  155. package/src/query-tools.test.ts +0 -636
  156. package/src/query-tools.ts +0 -324
  157. package/src/rate-limiter.integration.test.ts +0 -466
  158. package/src/rate-limiter.ts +0 -774
  159. package/src/replay-tools.test.ts +0 -496
  160. package/src/replay-tools.ts +0 -240
  161. package/src/repo-crawl.integration.test.ts +0 -441
  162. package/src/repo-crawl.ts +0 -610
  163. package/src/schemas/cell-events.test.ts +0 -347
  164. package/src/schemas/cell-events.ts +0 -807
  165. package/src/schemas/cell.ts +0 -257
  166. package/src/schemas/evaluation.ts +0 -166
  167. package/src/schemas/index.test.ts +0 -199
  168. package/src/schemas/index.ts +0 -286
  169. package/src/schemas/mandate.ts +0 -232
  170. package/src/schemas/swarm-context.ts +0 -115
  171. package/src/schemas/task.ts +0 -161
  172. package/src/schemas/worker-handoff.test.ts +0 -302
  173. package/src/schemas/worker-handoff.ts +0 -131
  174. package/src/skills.integration.test.ts +0 -1192
  175. package/src/skills.test.ts +0 -643
  176. package/src/skills.ts +0 -1549
  177. package/src/storage.integration.test.ts +0 -341
  178. package/src/storage.ts +0 -884
  179. package/src/structured.integration.test.ts +0 -817
  180. package/src/structured.test.ts +0 -1046
  181. package/src/structured.ts +0 -762
  182. package/src/swarm-decompose.test.ts +0 -188
  183. package/src/swarm-decompose.ts +0 -1302
  184. package/src/swarm-deferred.integration.test.ts +0 -157
  185. package/src/swarm-deferred.test.ts +0 -38
  186. package/src/swarm-insights.test.ts +0 -214
  187. package/src/swarm-insights.ts +0 -459
  188. package/src/swarm-mail.integration.test.ts +0 -970
  189. package/src/swarm-mail.ts +0 -739
  190. package/src/swarm-orchestrate.integration.test.ts +0 -282
  191. package/src/swarm-orchestrate.test.ts +0 -548
  192. package/src/swarm-orchestrate.ts +0 -3084
  193. package/src/swarm-prompts.test.ts +0 -1270
  194. package/src/swarm-prompts.ts +0 -2077
  195. package/src/swarm-research.integration.test.ts +0 -701
  196. package/src/swarm-research.test.ts +0 -698
  197. package/src/swarm-research.ts +0 -472
  198. package/src/swarm-review.integration.test.ts +0 -285
  199. package/src/swarm-review.test.ts +0 -879
  200. package/src/swarm-review.ts +0 -709
  201. package/src/swarm-strategies.ts +0 -407
  202. package/src/swarm-worktree.test.ts +0 -501
  203. package/src/swarm-worktree.ts +0 -575
  204. package/src/swarm.integration.test.ts +0 -2377
  205. package/src/swarm.ts +0 -38
  206. package/src/tool-adapter.integration.test.ts +0 -1221
  207. package/src/tool-availability.ts +0 -461
  208. package/tsconfig.json +0 -28
@@ -1,1221 +0,0 @@
1
- /**
2
- * Tool Adapter Wiring Integration Tests
3
- *
4
- * **THE BUG WE'RE PREVENTING:**
5
- * ```
6
- * Error: [streams/store] dbOverride parameter is required for this function.
7
- * PGlite getDatabase() has been removed.
8
- * ```
9
- *
10
- * This happened because:
11
- * 1. Store functions required explicit `dbOverride` parameter
12
- * 2. Plugin tools called store functions without passing the adapter
13
- * 3. No integration test exercised the full tool → store → DB path
14
- *
15
- * **THESE TESTS VERIFY:**
16
- * - Tools call store functions correctly (with adapter passed through)
17
- * - No "dbOverride required" errors occur
18
- * - Full end-to-end path works: tool.execute() → store → DB
19
- * - Tests would have FAILED before the fix
20
- *
21
- * Run with: bun test src/tool-adapter.integration.test.ts
22
- */
23
-
24
- import { describe, it, expect, beforeEach, afterEach } from "vitest";
25
- import { mkdir, rm } from "node:fs/promises";
26
- import { join } from "node:path";
27
- import { tmpdir } from "node:os";
28
- import {
29
- clearAdapterCache,
30
- createInMemorySwarmMailLibSQL,
31
- type SwarmMailAdapter,
32
- } from "swarm-mail";
33
-
34
- // Import tools to test
35
- import {
36
- clearSessionState,
37
- swarmmail_inbox,
38
- swarmmail_init,
39
- swarmmail_read_message,
40
- swarmmail_release,
41
- swarmmail_reserve,
42
- swarmmail_send,
43
- } from "./swarm-mail";
44
-
45
- import {
46
- getHiveWorkingDirectory,
47
- hive_close,
48
- hive_create,
49
- hive_create_epic,
50
- hive_query,
51
- hive_ready,
52
- hive_start,
53
- hive_update,
54
- setHiveWorkingDirectory,
55
- } from "./hive";
56
-
57
- import {
58
- swarm_broadcast,
59
- swarm_checkpoint,
60
- swarm_progress,
61
- swarm_status,
62
- } from "./swarm-orchestrate";
63
-
64
- import {
65
- semantic_memory_store,
66
- semantic_memory_find,
67
- } from "./memory-tools";
68
-
69
- import type { Bead, EpicCreateResult } from "./schemas";
70
-
71
- // ============================================================================
72
- // Test Configuration
73
- // ============================================================================
74
-
75
- /** Generate unique test database path per test run */
76
- function testDbPath(prefix = "tool-adapter"): string {
77
- return join(tmpdir(), `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
78
- }
79
-
80
- /** Track paths created during test for cleanup */
81
- let testPaths: string[] = [];
82
-
83
- function trackPath(path: string): string {
84
- testPaths.push(path);
85
- return path;
86
- }
87
-
88
- let TEST_DB_PATH: string;
89
- let swarmMail: SwarmMailAdapter;
90
-
91
- /**
92
- * Mock tool context
93
- */
94
- interface MockToolContext {
95
- sessionID: string;
96
- }
97
-
98
- /**
99
- * Generate a unique test context to avoid state collisions between tests
100
- */
101
- function createTestContext(): MockToolContext {
102
- const id = `test-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
103
- return { sessionID: id };
104
- }
105
-
106
- /**
107
- * Helper to execute tool and parse JSON response
108
- */
109
- async function executeTool<T>(
110
- tool: { execute: (args: unknown, ctx: unknown) => Promise<string> },
111
- args: unknown,
112
- ctx: MockToolContext,
113
- ): Promise<T> {
114
- const result = await tool.execute(args, ctx);
115
- return JSON.parse(result) as T;
116
- }
117
-
118
- /**
119
- * Helper to execute tool and return raw string
120
- */
121
- async function executeToolRaw(
122
- tool: { execute: (args: unknown, ctx: unknown) => Promise<string> },
123
- args: unknown,
124
- ctx: MockToolContext,
125
- ): Promise<string> {
126
- return await tool.execute(args, ctx);
127
- }
128
-
129
- // ============================================================================
130
- // Test Lifecycle Hooks
131
- // ============================================================================
132
-
133
- beforeEach(async () => {
134
- testPaths = [];
135
- TEST_DB_PATH = trackPath(testDbPath());
136
-
137
- // Create directory for test database (tools will create DB here)
138
- await mkdir(TEST_DB_PATH, { recursive: true });
139
-
140
- // Clear adapter cache to ensure clean state
141
- clearAdapterCache();
142
-
143
- // Don't create SwarmMail here - let tools create it
144
- // This ensures tests use the SAME DB adapter as tools
145
- swarmMail = null!;
146
- });
147
-
148
- afterEach(async () => {
149
- // Close SwarmMail adapter if created
150
- if (swarmMail) {
151
- await swarmMail.close();
152
- }
153
-
154
- // Clear all cached adapters
155
- clearAdapterCache();
156
-
157
- // Clean up all test database directories
158
- for (const path of testPaths) {
159
- try {
160
- await rm(path, { recursive: true, force: true });
161
- } catch {
162
- // Ignore errors during cleanup
163
- }
164
- }
165
- testPaths = [];
166
- });
167
-
168
- // ============================================================================
169
- // SWARM MAIL TOOLS - Adapter Wiring Tests
170
- // ============================================================================
171
-
172
- describe("swarmmail tools adapter wiring", () => {
173
- /**
174
- * TEST: swarmmail_init creates adapter and registers agent
175
- *
176
- * This was the FIRST thing that broke when DB adapter wiring was wrong.
177
- * The error manifested as:
178
- * "Error: [streams/store] dbOverride parameter is required"
179
- *
180
- * KEY: We're NOT testing DB state - we're testing NO ERRORS.
181
- * If adapter wiring is broken, this throws before returning.
182
- */
183
- it("swarmmail_init works without explicit dbOverride", async () => {
184
- const ctx = createTestContext();
185
-
186
- const result = await executeTool<{
187
- agent_name: string;
188
- project_key: string;
189
- message: string;
190
- }>(swarmmail_init, { project_path: TEST_DB_PATH }, ctx);
191
-
192
- // Should succeed (no "dbOverride required" error)
193
- expect(result.agent_name).toBeTruthy();
194
- expect(result.project_key).toBe(TEST_DB_PATH);
195
- expect(result.message).toContain(result.agent_name);
196
-
197
- // If we got here, adapter wiring works!
198
- // (The bug would have thrown "dbOverride required" before returning)
199
-
200
- clearSessionState(ctx.sessionID);
201
- });
202
-
203
- /**
204
- * TEST: swarmmail_send works after init
205
- *
206
- * Full flow: init → send → verify no errors
207
- * KEY: We're testing adapter wiring, not DB state.
208
- * The bug manifested as "dbOverride required" error during send.
209
- */
210
- it("swarmmail_send works without explicit dbOverride", async () => {
211
- const senderCtx = createTestContext();
212
- const recipientCtx = createTestContext();
213
-
214
- // Initialize both agents
215
- await executeTool<{ agent_name: string }>(
216
- swarmmail_init,
217
- { project_path: TEST_DB_PATH, agent_name: "Sender" },
218
- senderCtx,
219
- );
220
-
221
- const recipient = await executeTool<{ agent_name: string }>(
222
- swarmmail_init,
223
- { project_path: TEST_DB_PATH, agent_name: "Recipient" },
224
- recipientCtx,
225
- );
226
-
227
- // Send message (this calls store functions)
228
- const result = await executeTool<{
229
- success: boolean;
230
- message_id: number;
231
- thread_id?: string;
232
- recipient_count: number;
233
- }>(
234
- swarmmail_send,
235
- {
236
- to: [recipient.agent_name],
237
- subject: "Test message",
238
- body: "This is a test message body",
239
- thread_id: "bd-test-123",
240
- importance: "normal",
241
- },
242
- senderCtx,
243
- );
244
-
245
- // Should succeed (no "dbOverride required" error)
246
- expect(result.success).toBe(true);
247
- expect(result.message_id).toBeGreaterThan(0);
248
- expect(result.thread_id).toBe("bd-test-123");
249
-
250
- // If we got here, adapter wiring works!
251
-
252
- clearSessionState(senderCtx.sessionID);
253
- clearSessionState(recipientCtx.sessionID);
254
- });
255
-
256
- /**
257
- * TEST: swarmmail_inbox returns messages
258
- *
259
- * Full flow: init → send → inbox → verify
260
- * Tests that message queries go through DB adapter correctly
261
- */
262
- it("swarmmail_inbox works without explicit dbOverride", async () => {
263
- const senderCtx = createTestContext();
264
- const recipientCtx = createTestContext();
265
-
266
- await executeTool<{ agent_name: string }>(
267
- swarmmail_init,
268
- { project_path: TEST_DB_PATH, agent_name: "InboxSender" },
269
- senderCtx,
270
- );
271
-
272
- const recipient = await executeTool<{ agent_name: string }>(
273
- swarmmail_init,
274
- { project_path: TEST_DB_PATH, agent_name: "InboxRecipient" },
275
- recipientCtx,
276
- );
277
-
278
- // Send a message
279
- await executeTool(
280
- swarmmail_send,
281
- {
282
- to: [recipient.agent_name],
283
- subject: "Inbox test message",
284
- body: "This body should NOT be included by default",
285
- },
286
- senderCtx,
287
- );
288
-
289
- // Fetch inbox (this calls store functions to query messages)
290
- const result = await executeTool<{
291
- messages: Array<{
292
- id: number;
293
- from: string;
294
- subject: string;
295
- body?: string;
296
- }>;
297
- total: number;
298
- note: string;
299
- }>(swarmmail_inbox, {}, recipientCtx);
300
-
301
- // Should succeed
302
- expect(result.messages.length).toBeGreaterThan(0);
303
- const testMsg = result.messages.find(
304
- (m) => m.subject === "Inbox test message",
305
- );
306
- expect(testMsg).toBeDefined();
307
- expect(testMsg?.from).toBe("InboxSender");
308
- // Body should NOT be included (context-safe)
309
- expect(testMsg?.body).toBeUndefined();
310
-
311
- clearSessionState(senderCtx.sessionID);
312
- clearSessionState(recipientCtx.sessionID);
313
- });
314
-
315
- /**
316
- * TEST: swarmmail_read_message returns full message
317
- *
318
- * Tests that fetching individual message bodies works through DB adapter
319
- */
320
- it("swarmmail_read_message works without explicit dbOverride", async () => {
321
- const senderCtx = createTestContext();
322
- const recipientCtx = createTestContext();
323
-
324
- await executeTool<{ agent_name: string }>(
325
- swarmmail_init,
326
- { project_path: TEST_DB_PATH, agent_name: "ReadSender" },
327
- senderCtx,
328
- );
329
-
330
- const recipient = await executeTool<{ agent_name: string }>(
331
- swarmmail_init,
332
- { project_path: TEST_DB_PATH, agent_name: "ReadRecipient" },
333
- recipientCtx,
334
- );
335
-
336
- // Send a message
337
- const sent = await executeTool<{ message_id: number }>(
338
- swarmmail_send,
339
- {
340
- to: [recipient.agent_name],
341
- subject: "Read test message",
342
- body: "This message body should be returned",
343
- },
344
- senderCtx,
345
- );
346
-
347
- // Read the message (this calls store functions)
348
- const result = await executeTool<{
349
- id: number;
350
- from: string;
351
- subject: string;
352
- body: string;
353
- }>(swarmmail_read_message, { message_id: sent.message_id }, recipientCtx);
354
-
355
- // Should succeed
356
- expect(result.id).toBe(sent.message_id);
357
- expect(result.from).toBe("ReadSender");
358
- expect(result.subject).toBe("Read test message");
359
- expect(result.body).toBe("This message body should be returned");
360
-
361
- clearSessionState(senderCtx.sessionID);
362
- clearSessionState(recipientCtx.sessionID);
363
- });
364
-
365
- /**
366
- * TEST: swarmmail_reserve creates reservations
367
- *
368
- * Full flow: init → reserve → verify no errors
369
- * KEY: We're testing adapter wiring, not DB state.
370
- */
371
- it("swarmmail_reserve works without explicit dbOverride", async () => {
372
- const ctx = createTestContext();
373
-
374
- await executeTool(
375
- swarmmail_init,
376
- { project_path: TEST_DB_PATH, agent_name: "ReserveAgent" },
377
- ctx,
378
- );
379
-
380
- // Reserve files (this calls store functions)
381
- const result = await executeTool<{
382
- granted: Array<{
383
- id: number;
384
- path_pattern: string;
385
- exclusive: boolean;
386
- }>;
387
- conflicts?: Array<{ path: string; holders: string[] }>;
388
- }>(
389
- swarmmail_reserve,
390
- {
391
- paths: ["src/auth/**", "src/config.ts"],
392
- reason: "bd-test-123: Working on auth",
393
- exclusive: true,
394
- ttl_seconds: 3600,
395
- },
396
- ctx,
397
- );
398
-
399
- // Should succeed (no "dbOverride required" error)
400
- expect(result.granted.length).toBe(2);
401
- expect(result.conflicts).toBeUndefined();
402
- expect(result.granted[0].exclusive).toBe(true);
403
-
404
- // If we got here, adapter wiring works!
405
-
406
- clearSessionState(ctx.sessionID);
407
- });
408
-
409
- /**
410
- * TEST: swarmmail_release releases reservations
411
- *
412
- * Tests that releasing file reservations works through DB adapter
413
- */
414
- it("swarmmail_release works without explicit dbOverride", async () => {
415
- const ctx = createTestContext();
416
-
417
- await executeTool(
418
- swarmmail_init,
419
- { project_path: TEST_DB_PATH, agent_name: "ReleaseAgent" },
420
- ctx,
421
- );
422
-
423
- // Create reservations
424
- await executeTool(
425
- swarmmail_reserve,
426
- {
427
- paths: ["src/release-test-1.ts", "src/release-test-2.ts"],
428
- exclusive: true,
429
- },
430
- ctx,
431
- );
432
-
433
- // Release all (this calls store functions)
434
- const result = await executeTool<{
435
- released: number;
436
- released_at: string;
437
- }>(swarmmail_release, {}, ctx);
438
-
439
- // Should succeed
440
- expect(result.released).toBe(2);
441
- expect(result.released_at).toBeTruthy();
442
-
443
- clearSessionState(ctx.sessionID);
444
- });
445
- });
446
-
447
- // ============================================================================
448
- // HIVE TOOLS - Adapter Wiring Tests
449
- // ============================================================================
450
-
451
- describe("hive tools adapter wiring", () => {
452
- const createdCellIds: string[] = [];
453
-
454
- afterEach(async () => {
455
- // Close all created cells
456
- const originalDir = getHiveWorkingDirectory();
457
- setHiveWorkingDirectory(TEST_DB_PATH);
458
-
459
- for (const id of createdCellIds) {
460
- try {
461
- await hive_close.execute({ id, reason: "Test cleanup" }, createTestContext());
462
- } catch {
463
- // Ignore cleanup errors
464
- }
465
- }
466
- createdCellIds.length = 0;
467
-
468
- setHiveWorkingDirectory(originalDir);
469
- });
470
-
471
- /**
472
- * TEST: hive_create works end-to-end
473
- *
474
- * Create cell, verify in DB
475
- * Tests that cell creation goes through DB adapter correctly
476
- */
477
- it("hive_create works without explicit dbOverride", async () => {
478
- const ctx = createTestContext();
479
- const originalDir = getHiveWorkingDirectory();
480
- setHiveWorkingDirectory(TEST_DB_PATH);
481
-
482
- try {
483
- const result = await executeTool<Bead>(
484
- hive_create,
485
- { title: "Test cell minimal" },
486
- ctx,
487
- );
488
-
489
- createdCellIds.push(result.id);
490
-
491
- // Should succeed
492
- expect(result.title).toBe("Test cell minimal");
493
- expect(result.status).toBe("open");
494
- expect(result.issue_type).toBe("task");
495
- expect(result.id).toMatch(/^[a-z0-9-]+-[a-z0-9]+$/);
496
-
497
- // Get the Hive adapter that tools are using
498
- const { getHiveAdapter } = await import("./hive");
499
- const hiveAdapter = await getHiveAdapter(TEST_DB_PATH);
500
-
501
- // Verify cell was created via adapter
502
- const cell = await hiveAdapter.getCell(TEST_DB_PATH, result.id);
503
- expect(cell).toBeDefined();
504
- expect(cell!.title).toBe("Test cell minimal");
505
- } finally {
506
- setHiveWorkingDirectory(originalDir);
507
- }
508
- });
509
-
510
- /**
511
- * TEST: hive_query returns cells
512
- *
513
- * Create cells, query, verify results
514
- * Tests that cell queries go through DB adapter correctly
515
- */
516
- it("hive_query works without explicit dbOverride", async () => {
517
- const ctx = createTestContext();
518
- const originalDir = getHiveWorkingDirectory();
519
- setHiveWorkingDirectory(TEST_DB_PATH);
520
-
521
- try {
522
- // Create a test cell
523
- const created = await executeTool<Bead>(
524
- hive_create,
525
- { title: "Query test cell", type: "task" },
526
- ctx,
527
- );
528
- createdCellIds.push(created.id);
529
-
530
- // Query cells (this calls store functions)
531
- const result = await executeTool<Bead[]>(
532
- hive_query,
533
- { status: "open" },
534
- ctx,
535
- );
536
-
537
- // Should succeed
538
- expect(Array.isArray(result)).toBe(true);
539
- expect(result.length).toBeGreaterThan(0);
540
- expect(result.every((b) => b.status === "open")).toBe(true);
541
-
542
- // Find our test cell
543
- const found = result.find((b) => b.id === created.id);
544
- expect(found).toBeDefined();
545
- expect(found?.title).toBe("Query test cell");
546
- } finally {
547
- setHiveWorkingDirectory(originalDir);
548
- }
549
- });
550
-
551
- /**
552
- * TEST: hive_update updates cell
553
- *
554
- * Tests that cell updates go through DB adapter correctly
555
- */
556
- it("hive_update works without explicit dbOverride", async () => {
557
- const ctx = createTestContext();
558
- const originalDir = getHiveWorkingDirectory();
559
- setHiveWorkingDirectory(TEST_DB_PATH);
560
-
561
- try {
562
- // Create a test cell
563
- const created = await executeTool<Bead>(
564
- hive_create,
565
- { title: "Update test cell", description: "Original description" },
566
- ctx,
567
- );
568
- createdCellIds.push(created.id);
569
-
570
- // Update cell (this calls store functions)
571
- const result = await executeTool<Bead>(
572
- hive_update,
573
- { id: created.id, description: "Updated description" },
574
- ctx,
575
- );
576
-
577
- // Should succeed
578
- expect(result.description).toContain("Updated description");
579
-
580
- // Verify update via adapter
581
- const { getHiveAdapter } = await import("./hive");
582
- const hiveAdapter = await getHiveAdapter(TEST_DB_PATH);
583
- const cell = await hiveAdapter.getCell(TEST_DB_PATH, created.id);
584
- expect(cell!.description).toContain("Updated description");
585
- } finally {
586
- setHiveWorkingDirectory(originalDir);
587
- }
588
- });
589
-
590
- /**
591
- * TEST: hive_close closes cell
592
- *
593
- * Tests that closing cells goes through DB adapter correctly
594
- */
595
- it("hive_close works without explicit dbOverride", async () => {
596
- const ctx = createTestContext();
597
- const originalDir = getHiveWorkingDirectory();
598
- setHiveWorkingDirectory(TEST_DB_PATH);
599
-
600
- try {
601
- // Create a test cell
602
- const created = await executeTool<Bead>(
603
- hive_create,
604
- { title: "Close test cell" },
605
- ctx,
606
- );
607
-
608
- // Close cell (this calls store functions)
609
- const result = await executeToolRaw(
610
- hive_close,
611
- { id: created.id, reason: "Task completed" },
612
- ctx,
613
- );
614
-
615
- // Should succeed
616
- expect(result).toContain("Closed");
617
- expect(result).toContain(created.id);
618
-
619
- // Verify cell is closed via adapter
620
- const { getHiveAdapter } = await import("./hive");
621
- const hiveAdapter = await getHiveAdapter(TEST_DB_PATH);
622
- const cell = await hiveAdapter.getCell(TEST_DB_PATH, created.id);
623
- expect(cell!.status).toBe("closed");
624
- } finally {
625
- setHiveWorkingDirectory(originalDir);
626
- }
627
- });
628
-
629
- /**
630
- * TEST: hive_start marks cell as in_progress
631
- *
632
- * Tests that starting cells goes through DB adapter correctly
633
- */
634
- it("hive_start works without explicit dbOverride", async () => {
635
- const ctx = createTestContext();
636
- const originalDir = getHiveWorkingDirectory();
637
- setHiveWorkingDirectory(TEST_DB_PATH);
638
-
639
- try {
640
- // Create a test cell
641
- const created = await executeTool<Bead>(
642
- hive_create,
643
- { title: "Start test cell" },
644
- ctx,
645
- );
646
- createdCellIds.push(created.id);
647
-
648
- expect(created.status).toBe("open");
649
-
650
- // Start cell (this calls store functions)
651
- const result = await executeToolRaw(
652
- hive_start,
653
- { id: created.id },
654
- ctx,
655
- );
656
-
657
- // Should succeed
658
- expect(result).toContain("Started");
659
- expect(result).toContain(created.id);
660
-
661
- // Verify status changed via adapter
662
- const { getHiveAdapter } = await import("./hive");
663
- const hiveAdapter = await getHiveAdapter(TEST_DB_PATH);
664
- const cell = await hiveAdapter.getCell(TEST_DB_PATH, created.id);
665
- expect(cell!.status).toBe("in_progress");
666
- } finally {
667
- setHiveWorkingDirectory(originalDir);
668
- }
669
- });
670
-
671
- /**
672
- * TEST: hive_ready returns next unblocked cell
673
- *
674
- * Tests that querying ready cells goes through DB adapter correctly
675
- */
676
- it("hive_ready works without explicit dbOverride", async () => {
677
- const ctx = createTestContext();
678
- const originalDir = getHiveWorkingDirectory();
679
- setHiveWorkingDirectory(TEST_DB_PATH);
680
-
681
- try {
682
- // Create a high priority cell
683
- const created = await executeTool<Bead>(
684
- hive_create,
685
- { title: "Ready test cell", priority: 0 },
686
- ctx,
687
- );
688
- createdCellIds.push(created.id);
689
-
690
- // Get ready cell (this calls store functions)
691
- const result = await executeToolRaw(hive_ready, {}, ctx);
692
-
693
- // Should succeed (either returns a cell or "No ready beads")
694
- if (result !== "No ready beads") {
695
- const cell = JSON.parse(result) as Bead;
696
- expect(cell.id).toBeDefined();
697
- expect(cell.status).not.toBe("closed");
698
- expect(cell.status).not.toBe("blocked");
699
- } else {
700
- expect(result).toBe("No ready beads");
701
- }
702
- } finally {
703
- setHiveWorkingDirectory(originalDir);
704
- }
705
- });
706
-
707
- /**
708
- * TEST: hive_create_epic creates epic + subtasks atomically
709
- *
710
- * Tests that epic creation goes through DB adapter correctly
711
- */
712
- it("hive_create_epic works without explicit dbOverride", async () => {
713
- const ctx = createTestContext();
714
- const originalDir = getHiveWorkingDirectory();
715
- setHiveWorkingDirectory(TEST_DB_PATH);
716
-
717
- try {
718
- // Create epic (this calls store functions)
719
- const result = await executeTool<EpicCreateResult>(
720
- hive_create_epic,
721
- {
722
- epic_title: "Integration test epic",
723
- epic_description: "Testing epic creation",
724
- subtasks: [
725
- { title: "Subtask 1", priority: 2 },
726
- { title: "Subtask 2", priority: 3 },
727
- ],
728
- },
729
- ctx,
730
- );
731
-
732
- createdCellIds.push(result.epic.id);
733
- for (const subtask of result.subtasks) {
734
- createdCellIds.push(subtask.id);
735
- }
736
-
737
- // Should succeed
738
- expect(result.success).toBe(true);
739
- expect(result.epic.title).toBe("Integration test epic");
740
- expect(result.epic.issue_type).toBe("epic");
741
- expect(result.subtasks).toHaveLength(2);
742
-
743
- // Verify epic and subtasks via adapter
744
- const { getHiveAdapter } = await import("./hive");
745
- const hiveAdapter = await getHiveAdapter(TEST_DB_PATH);
746
-
747
- const epic = await hiveAdapter.getCell(TEST_DB_PATH, result.epic.id);
748
- expect(epic).toBeDefined();
749
- expect(epic!.title).toBe("Integration test epic");
750
-
751
- for (const subtask of result.subtasks) {
752
- const sub = await hiveAdapter.getCell(TEST_DB_PATH, subtask.id);
753
- expect(sub).toBeDefined();
754
- expect(sub!.parent_id).toBe(result.epic.id);
755
- }
756
- } finally {
757
- setHiveWorkingDirectory(originalDir);
758
- }
759
- });
760
- });
761
-
762
- // ============================================================================
763
- // SWARM ORCHESTRATE TOOLS - Adapter Wiring Tests
764
- // ============================================================================
765
-
766
- describe("swarm tools adapter wiring", () => {
767
- /**
768
- * TEST: swarm_progress works without explicit dbOverride
769
- *
770
- * Tests that progress reporting goes through DB adapter correctly
771
- */
772
- it("swarm_progress works without explicit dbOverride", async () => {
773
- const ctx = createTestContext();
774
- const originalDir = getHiveWorkingDirectory();
775
- setHiveWorkingDirectory(TEST_DB_PATH);
776
-
777
- try {
778
- // Create a test cell first
779
- const created = await executeTool<Bead>(
780
- hive_create,
781
- { title: "Progress test cell" },
782
- ctx,
783
- );
784
-
785
- // Initialize swarm mail
786
- await executeTool(
787
- swarmmail_init,
788
- { project_path: TEST_DB_PATH, agent_name: "ProgressAgent" },
789
- ctx,
790
- );
791
-
792
- // Report progress (this calls store functions)
793
- const result = await executeToolRaw(
794
- swarm_progress,
795
- {
796
- project_key: TEST_DB_PATH,
797
- agent_name: "ProgressAgent",
798
- bead_id: created.id,
799
- status: "in_progress",
800
- message: "50% complete",
801
- progress_percent: 50,
802
- },
803
- ctx,
804
- );
805
-
806
- // Should succeed (no "dbOverride required" error)
807
- expect(result).toContain("Progress");
808
- expect(result).toContain("50%");
809
-
810
- // Just verify no error thrown (progress is logged, not necessarily stored in events table)
811
- // The key test is that swarm_progress didn't throw "dbOverride required"
812
-
813
- clearSessionState(ctx.sessionID);
814
- } finally {
815
- setHiveWorkingDirectory(originalDir);
816
- }
817
- });
818
-
819
- /**
820
- * TEST: swarm_status queries work without explicit dbOverride
821
- *
822
- * Tests that status queries go through DB adapter correctly
823
- */
824
- it("swarm_status works without explicit dbOverride", async () => {
825
- const ctx = createTestContext();
826
- const originalDir = getHiveWorkingDirectory();
827
- setHiveWorkingDirectory(TEST_DB_PATH);
828
-
829
- try {
830
- // Create an epic with subtasks
831
- const epic = await executeTool<EpicCreateResult>(
832
- hive_create_epic,
833
- {
834
- epic_title: "Status test epic",
835
- subtasks: [
836
- { title: "Status subtask 1", priority: 2 },
837
- { title: "Status subtask 2", priority: 2 },
838
- ],
839
- },
840
- ctx,
841
- );
842
-
843
- // Get status (this calls store functions)
844
- const result = await executeTool<{
845
- epic_id: string;
846
- total_agents: number;
847
- agents: Array<{ bead_id: string; status: string }>;
848
- progress_percent: number;
849
- }>(
850
- swarm_status,
851
- {
852
- project_key: TEST_DB_PATH,
853
- epic_id: epic.epic.id,
854
- },
855
- ctx,
856
- );
857
-
858
- // Should succeed (no "dbOverride required" error)
859
- expect(result.epic_id).toBe(epic.epic.id);
860
- expect(result.total_agents).toBe(2);
861
- expect(result.agents).toHaveLength(2);
862
- expect(result.progress_percent).toBeGreaterThanOrEqual(0);
863
-
864
- // If we got here, adapter wiring works!
865
- } finally {
866
- setHiveWorkingDirectory(originalDir);
867
- }
868
- });
869
-
870
- /**
871
- * TEST: swarm_broadcast works without explicit dbOverride
872
- *
873
- * Tests that broadcasting messages goes through DB adapter correctly
874
- */
875
- it("swarm_broadcast works without explicit dbOverride", async () => {
876
- const ctx = createTestContext();
877
- const originalDir = getHiveWorkingDirectory();
878
- setHiveWorkingDirectory(TEST_DB_PATH);
879
-
880
- try {
881
- // Create an epic with subtasks
882
- const epic = await executeTool<EpicCreateResult>(
883
- hive_create_epic,
884
- {
885
- epic_title: "Broadcast test epic",
886
- subtasks: [
887
- { title: "Broadcast subtask 1", priority: 2 },
888
- ],
889
- },
890
- ctx,
891
- );
892
-
893
- // Initialize swarm mail
894
- await executeTool(
895
- swarmmail_init,
896
- { project_path: TEST_DB_PATH, agent_name: "BroadcastAgent" },
897
- ctx,
898
- );
899
-
900
- // Broadcast message (this calls store functions)
901
- const result = await executeToolRaw(
902
- swarm_broadcast,
903
- {
904
- project_path: TEST_DB_PATH,
905
- agent_name: "BroadcastAgent",
906
- epic_id: epic.epic.id,
907
- message: "Testing broadcast functionality",
908
- importance: "info",
909
- files_affected: ["src/test.ts"],
910
- },
911
- ctx,
912
- );
913
-
914
- // Should succeed (no "dbOverride required" error)
915
- expect(result).toContain("Broadcast");
916
-
917
- // If we got here, adapter wiring works!
918
- clearSessionState(ctx.sessionID);
919
- } finally {
920
- setHiveWorkingDirectory(originalDir);
921
- }
922
- });
923
-
924
- /**
925
- * TEST: swarm_checkpoint works without explicit dbOverride
926
- *
927
- * Tests that checkpoint creation goes through DB adapter correctly
928
- * NOTE: May fail with "no such table: swarm_contexts" (expected - test DB doesn't have that table)
929
- * but should NOT fail with "dbOverride required" (that's the bug we're preventing)
930
- */
931
- it("swarm_checkpoint works without explicit dbOverride", async () => {
932
- const ctx = createTestContext();
933
- const originalDir = getHiveWorkingDirectory();
934
- setHiveWorkingDirectory(TEST_DB_PATH);
935
-
936
- try {
937
- // Create an epic with subtask
938
- const epic = await executeTool<EpicCreateResult>(
939
- hive_create_epic,
940
- {
941
- epic_title: "Checkpoint test epic",
942
- subtasks: [
943
- { title: "Checkpoint subtask", priority: 2 },
944
- ],
945
- },
946
- ctx,
947
- );
948
-
949
- // Initialize swarm mail
950
- await executeTool(
951
- swarmmail_init,
952
- { project_path: TEST_DB_PATH, agent_name: "CheckpointAgent" },
953
- ctx,
954
- );
955
-
956
- // Create checkpoint (this calls store functions)
957
- const result = await executeToolRaw(
958
- swarm_checkpoint,
959
- {
960
- project_key: TEST_DB_PATH,
961
- agent_name: "CheckpointAgent",
962
- bead_id: epic.subtasks[0].id,
963
- epic_id: epic.epic.id,
964
- files_modified: ["src/test.ts"],
965
- progress_percent: 50,
966
- directives: {
967
- shared_context: "Testing checkpoint",
968
- },
969
- },
970
- ctx,
971
- );
972
-
973
- // Key test: did NOT throw "dbOverride required" error
974
- // Result may contain error message about missing table (that's OK - test DB doesn't have swarm_contexts)
975
- // But it should NOT contain "dbOverride parameter is required"
976
- expect(result).not.toContain("dbOverride parameter is required");
977
- expect(result).not.toContain("dbOverride required");
978
-
979
- // If we got here, adapter wiring works!
980
- // (Even if checkpoint failed for OTHER reasons like missing table)
981
- clearSessionState(ctx.sessionID);
982
- } finally {
983
- setHiveWorkingDirectory(originalDir);
984
- }
985
- });
986
- });
987
-
988
- // ============================================================================
989
- // MEMORY TOOLS - Adapter Wiring Tests
990
- // ============================================================================
991
-
992
- describe("memory tools adapter wiring", () => {
993
- /**
994
- * TEST: semantic_memory_store works without explicit dbOverride
995
- *
996
- * Tests that storing memories goes through DB adapter correctly
997
- */
998
- it("semantic_memory_store works without explicit dbOverride", async () => {
999
- const ctx = createTestContext();
1000
-
1001
- // Store a memory (this calls store functions)
1002
- const result = await executeTool<{ id: string }>(
1003
- semantic_memory_store,
1004
- {
1005
- information: "Test memory for adapter wiring verification",
1006
- tags: "test,memory",
1007
- },
1008
- ctx,
1009
- );
1010
-
1011
- // Should succeed (no "dbOverride required" error)
1012
- expect(result.id).toBeTruthy();
1013
- expect(result.id).toMatch(/^mem_/);
1014
-
1015
- // If we got here, adapter wiring works!
1016
- });
1017
-
1018
- /**
1019
- * TEST: semantic_memory_find works without explicit dbOverride
1020
- *
1021
- * Tests that finding memories goes through DB adapter correctly
1022
- */
1023
- it("semantic_memory_find works without explicit dbOverride", async () => {
1024
- const ctx = createTestContext();
1025
-
1026
- // Store a memory first
1027
- const stored = await executeTool<{ id: string }>(
1028
- semantic_memory_store,
1029
- {
1030
- information: "OAuth refresh tokens need 5min buffer before expiry",
1031
- metadata: "auth,tokens,oauth",
1032
- tags: "auth,integration-test",
1033
- },
1034
- ctx,
1035
- );
1036
-
1037
- expect(stored.id).toBeTruthy();
1038
-
1039
- // Find the memory (this calls store functions)
1040
- const result = await executeToolRaw(
1041
- semantic_memory_find,
1042
- {
1043
- query: "OAuth tokens buffer",
1044
- limit: 5,
1045
- },
1046
- ctx,
1047
- );
1048
-
1049
- // Should succeed (no "dbOverride required" error)
1050
- expect(result).toContain("OAuth");
1051
- expect(result).toContain("buffer");
1052
-
1053
- // If we got here, adapter wiring works!
1054
- });
1055
- });
1056
-
1057
- // ============================================================================
1058
- // SMOKE TEST - Full Workflow Integration
1059
- // ============================================================================
1060
-
1061
- describe("smoke test - all tools in sequence", () => {
1062
- /**
1063
- * CRITICAL INTEGRATION TEST
1064
- *
1065
- * This test runs a COMPLETE workflow using multiple tools in sequence.
1066
- * If ANY tool has broken adapter wiring, this test fails.
1067
- *
1068
- * This catches interaction bugs that unit tests miss:
1069
- * - Adapter lifecycle issues
1070
- * - State corruption between tool calls
1071
- * - Context loss across layers
1072
- * - Resource cleanup problems
1073
- *
1074
- * The workflow simulates a real swarm agent task:
1075
- * 1. Initialize agent
1076
- * 2. Create work item
1077
- * 3. Reserve files
1078
- * 4. Report progress
1079
- * 5. Store learning
1080
- * 6. Query learnings
1081
- * 7. Complete and communicate
1082
- * 8. Close work item
1083
- * 9. Release resources
1084
- */
1085
- it("runs full workflow without adapter errors", async () => {
1086
- const ctx = createTestContext();
1087
- const originalDir = getHiveWorkingDirectory();
1088
- setHiveWorkingDirectory(TEST_DB_PATH);
1089
-
1090
- try {
1091
- // 1. Initialize swarm mail
1092
- const init = await executeTool<{ agent_name: string; project_key: string }>(
1093
- swarmmail_init,
1094
- { project_path: TEST_DB_PATH, agent_name: "SmokeTestAgent" },
1095
- ctx,
1096
- );
1097
- expect(init.agent_name).toBe("SmokeTestAgent");
1098
-
1099
- // 2. Create a cell
1100
- const cell = await executeTool<Bead>(
1101
- hive_create,
1102
- { title: "Smoke test workflow cell", description: "Full integration test" },
1103
- ctx,
1104
- );
1105
- expect(cell.id).toBeTruthy();
1106
-
1107
- // 3. Reserve files
1108
- const reserve = await executeTool<{ granted: Array<{ id: number }> }>(
1109
- swarmmail_reserve,
1110
- {
1111
- paths: ["src/smoke-test-1.ts", "src/smoke-test-2.ts"],
1112
- reason: `${cell.id}: Smoke test workflow`,
1113
- exclusive: true,
1114
- },
1115
- ctx,
1116
- );
1117
- expect(reserve.granted.length).toBe(2);
1118
-
1119
- // 4. Report progress
1120
- const progress = await executeToolRaw(
1121
- swarm_progress,
1122
- {
1123
- project_key: TEST_DB_PATH,
1124
- agent_name: "SmokeTestAgent",
1125
- bead_id: cell.id,
1126
- status: "in_progress",
1127
- message: "Testing workflow integration",
1128
- progress_percent: 50,
1129
- },
1130
- ctx,
1131
- );
1132
- expect(progress).toContain("Progress");
1133
-
1134
- // 5. Store a learning
1135
- const memory = await executeTool<{ id: string }>(
1136
- semantic_memory_store,
1137
- {
1138
- information: "Smoke test verified full tool adapter wiring works end-to-end",
1139
- tags: "test,verification",
1140
- },
1141
- ctx,
1142
- );
1143
- expect(memory.id).toBeTruthy();
1144
-
1145
- // 6. Find the learning
1146
- const findResult = await executeToolRaw(
1147
- semantic_memory_find,
1148
- { query: "smoke test adapter wiring", limit: 3 },
1149
- ctx,
1150
- );
1151
- expect(findResult).toContain("Smoke test");
1152
-
1153
- // 7. Send completion message
1154
- const send = await executeTool<{ success: boolean; message_id: number }>(
1155
- swarmmail_send,
1156
- {
1157
- to: ["coordinator"],
1158
- subject: `Completed: ${cell.id}`,
1159
- body: "Smoke test workflow completed successfully",
1160
- thread_id: cell.id,
1161
- },
1162
- ctx,
1163
- );
1164
- expect(send.success).toBe(true);
1165
-
1166
- // 8. Close the cell
1167
- const close = await executeToolRaw(
1168
- hive_close,
1169
- { id: cell.id, reason: "Smoke test workflow completed" },
1170
- ctx,
1171
- );
1172
- expect(close).toContain("Closed");
1173
-
1174
- // 9. Release files
1175
- const release = await executeTool<{ released: number }>(
1176
- swarmmail_release,
1177
- {},
1178
- ctx,
1179
- );
1180
- expect(release.released).toBe(2);
1181
-
1182
- // ✅ If we got here, ALL tools work correctly through the adapter!
1183
- // No "dbOverride required" errors occurred.
1184
- // This proves the full tool → store → DB path is intact.
1185
-
1186
- clearSessionState(ctx.sessionID);
1187
- } finally {
1188
- setHiveWorkingDirectory(originalDir);
1189
- }
1190
- });
1191
- });
1192
-
1193
- /**
1194
- * SUMMARY OF BUGS THESE TESTS PREVENT:
1195
- *
1196
- * 1. **DB Adapter Not Passed Through**
1197
- * - Tools call store functions without dbOverride
1198
- * - Store functions require explicit adapter
1199
- * - Error: "dbOverride parameter is required"
1200
- *
1201
- * 2. **Store Function Signature Changes**
1202
- * - Store functions change to require adapter
1203
- * - Tools not updated to pass adapter
1204
- * - Silent breakage until runtime
1205
- *
1206
- * 3. **Initialization Order Issues**
1207
- * - Adapter not created before tools use it
1208
- * - Tools assume adapter exists globally
1209
- * - Error: "Cannot read property of undefined"
1210
- *
1211
- * 4. **Context Loss Across Layers**
1212
- * - Tool → store → DB path breaks
1213
- * - Each layer assumes next has context
1214
- * - Integration gap not caught by unit tests
1215
- *
1216
- * **HOW THESE TESTS CATCH THEM:**
1217
- * - Exercise FULL path: tool.execute() → store → DB
1218
- * - No mocking of store functions
1219
- * - Verify actual DB operations succeed
1220
- * - Would have FAILED before the fix
1221
- */