opencode-swarm-plugin 0.12.14 → 0.12.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.beads/issues.jsonl +17 -17
- package/dist/index.js +55 -9
- package/dist/plugin.js +45 -8
- package/package.json +4 -1
- package/src/agent-mail.ts +30 -6
- package/src/beads.ts +68 -16
- package/src/index.ts +3 -2
- package/src/storage.ts +14 -2
package/.beads/issues.jsonl
CHANGED
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
{"id":"opencode-swarm-plugin-0lo41","title":"Limit test bead 1","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-10T09:06:06.208543-08:00","updated_at":"2025-12-10T09:06:09.912935-08:00","closed_at":"2025-12-10T09:06:09.912935-08:00"}
|
|
35
35
|
{"id":"opencode-swarm-plugin-0oku","title":"Thread link test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T08:11:40.956973-08:00","updated_at":"2025-12-08T08:11:42.61703-08:00","closed_at":"2025-12-08T08:11:42.61703-08:00"}
|
|
36
36
|
{"id":"opencode-swarm-plugin-0pd7","title":"Query test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:12:25.598833-08:00","updated_at":"2025-12-08T11:12:28.0058-08:00","closed_at":"2025-12-08T11:12:28.0058-08:00"}
|
|
37
|
-
{"id":"opencode-swarm-plugin-0phkm","title":"swarm.ts:920-956 - queryCassHistory returns null with no distinction on failure types","description":"swarm.ts:920-956 - queryCassHistory returns null for \"unavailable\", \"failed\", and \"no results\" cases without distinction. Callers can't tell if they should retry or if CASS is disabled. Suggested fix: Return structured result with status enum.","status":"
|
|
37
|
+
{"id":"opencode-swarm-plugin-0phkm","title":"swarm.ts:920-956 - queryCassHistory returns null with no distinction on failure types","description":"swarm.ts:920-956 - queryCassHistory returns null for \"unavailable\", \"failed\", and \"no results\" cases without distinction. Callers can't tell if they should retry or if CASS is disabled. Suggested fix: Return structured result with status enum.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:06:31.086042-08:00","updated_at":"2025-12-10T11:56:18.166564-08:00","closed_at":"2025-12-10T11:56:18.166564-08:00"}
|
|
38
38
|
{"id":"opencode-swarm-plugin-0rkr","title":"Limit test bead 3","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T09:09:30.903394-08:00","updated_at":"2025-12-08T09:09:33.255022-08:00","closed_at":"2025-12-08T09:09:33.255022-08:00"}
|
|
39
39
|
{"id":"opencode-swarm-plugin-0t77w","title":"Ordered subtasks epic","description":"","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-08T11:12:42.359962-08:00","updated_at":"2025-12-08T11:12:44.197427-08:00","closed_at":"2025-12-08T11:12:44.197427-08:00"}
|
|
40
40
|
{"id":"opencode-swarm-plugin-0t77w.1","title":"First","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:12:42.399212-08:00","updated_at":"2025-12-08T11:12:44.221242-08:00","closed_at":"2025-12-08T11:12:44.221242-08:00","dependencies":[{"issue_id":"opencode-swarm-plugin-0t77w.1","depends_on_id":"opencode-swarm-plugin-0t77w","type":"parent-child","created_at":"2025-12-08T11:12:42.399555-08:00","created_by":"daemon"}]}
|
|
@@ -68,13 +68,13 @@
|
|
|
68
68
|
{"id":"opencode-swarm-plugin-1i8","title":"Test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T19:23:49.873224-08:00","updated_at":"2025-12-07T19:24:13.408304-08:00","closed_at":"2025-12-07T19:24:13.408304-08:00"}
|
|
69
69
|
{"id":"opencode-swarm-plugin-1j0t","title":"Bead to close","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T07:46:49.618076-08:00","updated_at":"2025-12-08T07:46:49.644609-08:00","closed_at":"2025-12-08T07:46:49.644609-08:00"}
|
|
70
70
|
{"id":"opencode-swarm-plugin-1j7ou","title":"Query test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-10T09:06:06.042472-08:00","updated_at":"2025-12-10T09:06:09.814596-08:00","closed_at":"2025-12-10T09:06:09.814596-08:00"}
|
|
71
|
-
{"id":"opencode-swarm-plugin-1jhr8","title":"storage.ts:248-273 - Silent JSON parse failures in find()","description":"src/storage.ts:248-273 - The find() method catches JSON parse errors and returns empty arrays with no logging. If semantic-memory returns malformed data, callers have no visibility. Suggested fix: Log parse errors to console.warn before returning empty array.","status":"
|
|
71
|
+
{"id":"opencode-swarm-plugin-1jhr8","title":"storage.ts:248-273 - Silent JSON parse failures in find()","description":"src/storage.ts:248-273 - The find() method catches JSON parse errors and returns empty arrays with no logging. If semantic-memory returns malformed data, callers have no visibility. Suggested fix: Log parse errors to console.warn before returning empty array.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:05:49.694433-08:00","updated_at":"2025-12-10T11:57:14.947397-08:00","closed_at":"2025-12-10T11:57:14.947397-08:00"}
|
|
72
72
|
{"id":"opencode-swarm-plugin-1jo8","title":"Single subtask epic","description":"","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-08T11:11:08.880228-08:00","updated_at":"2025-12-08T11:11:10.749334-08:00","closed_at":"2025-12-08T11:11:10.749334-08:00"}
|
|
73
73
|
{"id":"opencode-swarm-plugin-1kz31","title":"Bead to start","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-10T09:08:32.909764-08:00","updated_at":"2025-12-10T09:08:35.942266-08:00","closed_at":"2025-12-10T09:08:35.942266-08:00"}
|
|
74
74
|
{"id":"opencode-swarm-plugin-1li","title":"Test parent","description":"","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-07T19:35:34.909384-08:00","updated_at":"2025-12-08T08:35:24.648164-08:00","closed_at":"2025-12-08T08:35:24.648164-08:00"}
|
|
75
75
|
{"id":"opencode-swarm-plugin-1li.1","title":"Test child","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T19:35:39.491063-08:00","updated_at":"2025-12-08T08:36:24.892828-08:00","closed_at":"2025-12-08T08:36:24.892828-08:00","dependencies":[{"issue_id":"opencode-swarm-plugin-1li.1","depends_on_id":"opencode-swarm-plugin-1li","type":"parent-child","created_at":"2025-12-07T19:35:39.491364-08:00","created_by":"daemon"}]}
|
|
76
76
|
{"id":"opencode-swarm-plugin-1lkv","title":"Query test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T08:11:39.223436-08:00","updated_at":"2025-12-08T08:11:41.799207-08:00","closed_at":"2025-12-08T08:11:41.799207-08:00"}
|
|
77
|
-
{"id":"opencode-swarm-plugin-1m18k","title":"storage.ts:225 - Missing error handling in store() method","description":"src/storage.ts:225 - The store() method in SemanticMemoryStorage silently swallows errors. If execSemanticMemory fails, no error is thrown or logged. Suggested fix: Check result.exitCode and throw if non-zero, or at minimum log the error.","status":"
|
|
77
|
+
{"id":"opencode-swarm-plugin-1m18k","title":"storage.ts:225 - Missing error handling in store() method","description":"src/storage.ts:225 - The store() method in SemanticMemoryStorage silently swallows errors. If execSemanticMemory fails, no error is thrown or logged. Suggested fix: Check result.exitCode and throw if non-zero, or at minimum log the error.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:05:47.181965-08:00","updated_at":"2025-12-10T11:56:07.964661-08:00","closed_at":"2025-12-10T11:56:07.964661-08:00"}
|
|
78
78
|
{"id":"opencode-swarm-plugin-1mre","title":"Test bead minimal","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T07:49:09.126035-08:00","updated_at":"2025-12-08T07:49:11.799933-08:00","closed_at":"2025-12-08T07:49:11.799933-08:00"}
|
|
79
79
|
{"id":"opencode-swarm-plugin-1no","title":"Update test bead","description":"Original description","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-07T19:39:18.620094-08:00","updated_at":"2025-12-07T19:39:20.597336-08:00","closed_at":"2025-12-07T19:39:20.597336-08:00"}
|
|
80
80
|
{"id":"opencode-swarm-plugin-1o0m","title":"Limit test bead 3","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:10:25.048321-08:00","updated_at":"2025-12-08T11:10:27.497308-08:00","closed_at":"2025-12-08T11:10:27.497308-08:00"}
|
|
@@ -348,7 +348,7 @@
|
|
|
348
348
|
{"id":"opencode-swarm-plugin-6qjn","title":"Limit test bead 4","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:12:25.810469-08:00","updated_at":"2025-12-08T11:12:28.179291-08:00","closed_at":"2025-12-08T11:12:28.179291-08:00"}
|
|
349
349
|
{"id":"opencode-swarm-plugin-6rs3","title":"Update test bead","description":"Original description","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T19:41:11.205193-08:00","updated_at":"2025-12-07T19:41:13.573642-08:00","closed_at":"2025-12-07T19:41:13.573642-08:00"}
|
|
350
350
|
{"id":"opencode-swarm-plugin-6rtj","title":"Test bug with priority","description":"This is a critical bug","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-12-08T07:46:48.614431-08:00","updated_at":"2025-12-08T07:46:51.457319-08:00","closed_at":"2025-12-08T07:46:51.457319-08:00"}
|
|
351
|
-
{"id":"opencode-swarm-plugin-6tb8u","title":"beads.ts:163-172 - No validation of bd create output before parsing","description":"beads.ts:163-172 - beads_create assumes bd create --json always returns valid JSON. If bd crashes or returns non-JSON error, parseBead throws generic error. Suggested fix: Check if stdout is empty or contains \"error\" before parsing.","status":"
|
|
351
|
+
{"id":"opencode-swarm-plugin-6tb8u","title":"beads.ts:163-172 - No validation of bd create output before parsing","description":"beads.ts:163-172 - beads_create assumes bd create --json always returns valid JSON. If bd crashes or returns non-JSON error, parseBead throws generic error. Suggested fix: Check if stdout is empty or contains \"error\" before parsing.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:06:11.381852-08:00","updated_at":"2025-12-10T11:59:34.843893-08:00","closed_at":"2025-12-10T11:59:34.843893-08:00"}
|
|
352
352
|
{"id":"opencode-swarm-plugin-6um3","title":"Thread link test bead","description":"Important context here\n\n[thread:test-thread-789]","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:11:24.518628-08:00","updated_at":"2025-12-08T11:11:26.121955-08:00","closed_at":"2025-12-08T11:11:26.121955-08:00"}
|
|
353
353
|
{"id":"opencode-swarm-plugin-6wkm","title":"Bead to start","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:11:09.055636-08:00","updated_at":"2025-12-08T11:11:11.145613-08:00","closed_at":"2025-12-08T11:11:11.145613-08:00"}
|
|
354
354
|
{"id":"opencode-swarm-plugin-6wkv","title":"Single subtask epic","description":"","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-08T08:14:29.792336-08:00","updated_at":"2025-12-08T08:14:31.557975-08:00","closed_at":"2025-12-08T08:14:31.557975-08:00"}
|
|
@@ -391,8 +391,8 @@
|
|
|
391
391
|
{"id":"opencode-swarm-plugin-7r6u.1","title":"Subtask 1","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:10:25.868274-08:00","updated_at":"2025-12-08T11:10:27.786772-08:00","closed_at":"2025-12-08T11:10:27.786772-08:00","dependencies":[{"issue_id":"opencode-swarm-plugin-7r6u.1","depends_on_id":"opencode-swarm-plugin-7r6u","type":"parent-child","created_at":"2025-12-08T11:10:25.868645-08:00","created_by":"daemon"}]}
|
|
392
392
|
{"id":"opencode-swarm-plugin-7r6u.2","title":"Subtask 2","description":"","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-08T11:10:25.907749-08:00","updated_at":"2025-12-08T11:10:27.814573-08:00","closed_at":"2025-12-08T11:10:27.814573-08:00","dependencies":[{"issue_id":"opencode-swarm-plugin-7r6u.2","depends_on_id":"opencode-swarm-plugin-7r6u","type":"parent-child","created_at":"2025-12-08T11:10:25.908202-08:00","created_by":"daemon"}]}
|
|
393
393
|
{"id":"opencode-swarm-plugin-7rc5","title":"Thread link test bead","description":"[thread:test-thread-123]","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:11:39.770284-08:00","updated_at":"2025-12-08T11:11:41.676216-08:00","closed_at":"2025-12-08T11:11:41.676216-08:00"}
|
|
394
|
-
{"id":"opencode-swarm-plugin-7swlo","title":"rate-limiter.ts:607 - Redis connection error swallowed, no retry","description":"rate-limiter.ts:607 - createRateLimiter catches Redis errors and falls back to SQLite immediately. No retry logic or connection validation beyond initial ping. Transient failures cause permanent fallback. Suggested fix: Retry connection with backoff before fallback.","status":"
|
|
395
|
-
{"id":"opencode-swarm-plugin-7uogs","title":"beads.ts:509-532 - beads_sync timeout implementation is buggy","description":"beads.ts:509-532 - withTimeout creates timeout promise but never clears the setTimeout if operation succeeds first. Causes lingering timers that reject after function returns. Suggested fix: Clear timeout in finally block of Promise.race.","status":"
|
|
394
|
+
{"id":"opencode-swarm-plugin-7swlo","title":"rate-limiter.ts:607 - Redis connection error swallowed, no retry","description":"rate-limiter.ts:607 - createRateLimiter catches Redis errors and falls back to SQLite immediately. No retry logic or connection validation beyond initial ping. Transient failures cause permanent fallback. Suggested fix: Retry connection with backoff before fallback.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:06:23.76291-08:00","updated_at":"2025-12-10T11:56:20.337157-08:00","closed_at":"2025-12-10T11:56:20.337157-08:00"}
|
|
395
|
+
{"id":"opencode-swarm-plugin-7uogs","title":"beads.ts:509-532 - beads_sync timeout implementation is buggy","description":"beads.ts:509-532 - withTimeout creates timeout promise but never clears the setTimeout if operation succeeds first. Causes lingering timers that reject after function returns. Suggested fix: Clear timeout in finally block of Promise.race.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:06:15.841975-08:00","updated_at":"2025-12-10T11:58:58.025223-08:00","closed_at":"2025-12-10T11:58:58.025223-08:00"}
|
|
396
396
|
{"id":"opencode-swarm-plugin-7vk","title":"Docker integration test infrastructure","description":"Create Docker-based integration test environment with real beads CLI and Agent Mail server for testing all plugin modules without mocks","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-07T19:24:33.121213-08:00","updated_at":"2025-12-07T19:33:04.935529-08:00","closed_at":"2025-12-07T19:33:04.935529-08:00"}
|
|
397
397
|
{"id":"opencode-swarm-plugin-7vk.1","title":"Create Docker infrastructure (Dockerfile + compose)","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-07T19:24:38.792005-08:00","updated_at":"2025-12-07T19:28:00.040282-08:00","closed_at":"2025-12-07T19:28:00.040282-08:00","dependencies":[{"issue_id":"opencode-swarm-plugin-7vk.1","depends_on_id":"opencode-swarm-plugin-7vk","type":"parent-child","created_at":"2025-12-07T19:24:38.79237-08:00","created_by":"daemon"}]}
|
|
398
398
|
{"id":"opencode-swarm-plugin-7vk.2","title":"Create Agent Mail service container","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-07T19:24:38.826876-08:00","updated_at":"2025-12-07T19:28:00.067327-08:00","closed_at":"2025-12-07T19:28:00.067327-08:00","dependencies":[{"issue_id":"opencode-swarm-plugin-7vk.2","depends_on_id":"opencode-swarm-plugin-7vk","type":"parent-child","created_at":"2025-12-07T19:24:38.827195-08:00","created_by":"daemon"}]}
|
|
@@ -424,7 +424,7 @@
|
|
|
424
424
|
{"id":"opencode-swarm-plugin-8b8h.2","title":"Edit src/b.ts","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T08:14:29.754332-08:00","updated_at":"2025-12-08T08:14:31.532422-08:00","closed_at":"2025-12-08T08:14:31.532422-08:00","dependencies":[{"issue_id":"opencode-swarm-plugin-8b8h.2","depends_on_id":"opencode-swarm-plugin-8b8h","type":"parent-child","created_at":"2025-12-08T08:14:29.754634-08:00","created_by":"daemon"}]}
|
|
425
425
|
{"id":"opencode-swarm-plugin-8cyxu","title":"Limit test bead 4","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-10T09:08:32.090144-08:00","updated_at":"2025-12-10T09:08:35.527905-08:00","closed_at":"2025-12-10T09:08:35.527905-08:00"}
|
|
426
426
|
{"id":"opencode-swarm-plugin-8e8r","title":"Lifecycle test bead","description":"50% complete","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:11:09.585623-08:00","updated_at":"2025-12-08T11:11:09.662961-08:00","closed_at":"2025-12-08T11:11:09.662961-08:00"}
|
|
427
|
-
{"id":"opencode-swarm-plugin-8evxm","title":"storage.ts:276-305 - Silent failures in list() method","description":"src/storage.ts:276-305 - Similar to find(), list() silently returns empty array on failures (non-zero exitCode or parse errors). No logging. Suggested fix: Log warnings for exitCode failures and JSON parse errors.","status":"
|
|
427
|
+
{"id":"opencode-swarm-plugin-8evxm","title":"storage.ts:276-305 - Silent failures in list() method","description":"src/storage.ts:276-305 - Similar to find(), list() silently returns empty array on failures (non-zero exitCode or parse errors). No logging. Suggested fix: Log warnings for exitCode failures and JSON parse errors.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:05:51.902453-08:00","updated_at":"2025-12-10T11:58:00.473526-08:00","closed_at":"2025-12-10T11:58:00.473526-08:00"}
|
|
428
428
|
{"id":"opencode-swarm-plugin-8ffqs","title":"Update test bead","description":"Blocked on dependency","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-10T09:08:32.568361-08:00","updated_at":"2025-12-10T09:08:35.810044-08:00","closed_at":"2025-12-10T09:08:35.810044-08:00"}
|
|
429
429
|
{"id":"opencode-swarm-plugin-8fid","title":"Update test bead","description":"Original description","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:12:26.205827-08:00","updated_at":"2025-12-08T11:12:28.333927-08:00","closed_at":"2025-12-08T11:12:28.333927-08:00"}
|
|
430
430
|
{"id":"opencode-swarm-plugin-8fmv","title":"Test bug with priority","description":"This is a critical bug","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-12-08T08:21:26.883019-08:00","updated_at":"2025-12-08T08:21:29.715804-08:00","closed_at":"2025-12-08T08:21:29.715804-08:00"}
|
|
@@ -518,7 +518,7 @@
|
|
|
518
518
|
{"id":"opencode-swarm-plugin-9swi","title":"High priority ready bead","description":"","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-08T11:10:54.049301-08:00","updated_at":"2025-12-08T11:10:56.034072-08:00","closed_at":"2025-12-08T11:10:56.034072-08:00"}
|
|
519
519
|
{"id":"opencode-swarm-plugin-9tvl","title":"Limit test bead 4","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T08:23:17.634714-08:00","updated_at":"2025-12-08T08:23:20.015026-08:00","closed_at":"2025-12-08T08:23:20.015026-08:00"}
|
|
520
520
|
{"id":"opencode-swarm-plugin-9ucw","title":"Thread link test bead","description":"Important context here\n\n[thread:test-thread-789]","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T08:22:18.376401-08:00","updated_at":"2025-12-08T08:22:19.984318-08:00","closed_at":"2025-12-08T08:22:19.984318-08:00"}
|
|
521
|
-
{"id":"opencode-swarm-plugin-9v33b","title":"beads.ts:260-278 - Epic rollback may fail silently","description":"beads.ts:260-278 - beads_create_epic catches rollback errors and logs them but continues. If multiple rollbacks fail, final error message may be misleading. Suggested fix: Collect rollback errors and include them in thrown error.","status":"
|
|
521
|
+
{"id":"opencode-swarm-plugin-9v33b","title":"beads.ts:260-278 - Epic rollback may fail silently","description":"beads.ts:260-278 - beads_create_epic catches rollback errors and logs them but continues. If multiple rollbacks fail, final error message may be misleading. Suggested fix: Collect rollback errors and include them in thrown error.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:06:13.501819-08:00","updated_at":"2025-12-10T12:00:15.295654-08:00","closed_at":"2025-12-10T12:00:15.295654-08:00"}
|
|
522
522
|
{"id":"opencode-swarm-plugin-9v3z","title":"Query test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T19:39:29.122675-08:00","updated_at":"2025-12-07T19:39:31.226339-08:00","closed_at":"2025-12-07T19:39:31.226339-08:00"}
|
|
523
523
|
{"id":"opencode-swarm-plugin-9wo","title":"Limit test bead 1","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T19:39:18.299301-08:00","updated_at":"2025-12-07T19:39:20.43669-08:00","closed_at":"2025-12-07T19:39:20.43669-08:00"}
|
|
524
524
|
{"id":"opencode-swarm-plugin-9wofd","title":"Update test bead","description":"Original description","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-10T09:08:32.646896-08:00","updated_at":"2025-12-10T09:08:35.879026-08:00","closed_at":"2025-12-10T09:08:35.879026-08:00"}
|
|
@@ -558,7 +558,7 @@
|
|
|
558
558
|
{"id":"opencode-swarm-plugin-aw1tc","title":"Thread link test bead","description":"[thread:test-thread-456]","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-10T09:06:08.228561-08:00","updated_at":"2025-12-10T09:06:10.878323-08:00","closed_at":"2025-12-10T09:06:10.878323-08:00"}
|
|
559
559
|
{"id":"opencode-swarm-plugin-ay6d","title":"Query test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T08:14:28.622853-08:00","updated_at":"2025-12-08T08:14:31.015202-08:00","closed_at":"2025-12-08T08:14:31.015202-08:00"}
|
|
560
560
|
{"id":"opencode-swarm-plugin-b1hf","title":"Thread link test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:11:40.14326-08:00","updated_at":"2025-12-08T11:11:41.771573-08:00","closed_at":"2025-12-08T11:11:41.771573-08:00"}
|
|
561
|
-
{"id":"opencode-swarm-plugin-b1wpc","title":"swarm.ts:1620-1670 - runUbsScan doesn't validate JSON structure","description":"swarm.ts:1620-1670 - runUbsScan parses JSON but doesn't validate with schema. If UBS changes output format, could return malformed data or throw cryptic errors. Suggested fix: Define Zod schema for UBS output and validate.","status":"
|
|
561
|
+
{"id":"opencode-swarm-plugin-b1wpc","title":"swarm.ts:1620-1670 - runUbsScan doesn't validate JSON structure","description":"swarm.ts:1620-1670 - runUbsScan parses JSON but doesn't validate with schema. If UBS changes output format, could return malformed data or throw cryptic errors. Suggested fix: Define Zod schema for UBS output and validate.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:06:33.466723-08:00","updated_at":"2025-12-10T11:56:17.052815-08:00","closed_at":"2025-12-10T11:56:17.052815-08:00"}
|
|
562
562
|
{"id":"opencode-swarm-plugin-b39i","title":"Cleanup task","description":"","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-12-08T11:11:38.123705-08:00","updated_at":"2025-12-08T11:11:40.7258-08:00","closed_at":"2025-12-08T11:11:40.7258-08:00"}
|
|
563
563
|
{"id":"opencode-swarm-plugin-b3pr","title":"Update test bead","description":"Original description","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T08:23:17.77563-08:00","updated_at":"2025-12-08T08:23:20.062473-08:00","closed_at":"2025-12-08T08:23:20.062473-08:00"}
|
|
564
564
|
{"id":"opencode-swarm-plugin-b40","title":"Query test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T19:34:52.696949-08:00","updated_at":"2025-12-07T19:34:54.75136-08:00","closed_at":"2025-12-07T19:34:54.75136-08:00"}
|
|
@@ -615,7 +615,7 @@
|
|
|
615
615
|
{"id":"opencode-swarm-plugin-c40t","title":"Update test bead","description":"Blocked on dependency","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-08T11:11:23.290111-08:00","updated_at":"2025-12-08T11:11:25.615728-08:00","closed_at":"2025-12-08T11:11:25.615728-08:00"}
|
|
616
616
|
{"id":"opencode-swarm-plugin-c4zjn","title":"Make Agent Mail auto-restart more aggressive","description":"Agent Mail server frequently gets into bad state with \"Server encountered an unexpected error\" but auto-restart is too conservative.\n\nCurrent config:\n- failureThreshold: 2 (needs 2 failures before restart)\n- restartCooldownMs: 30000 (30 second cooldown)\n\nProblems:\n1. First failure doesn't trigger restart, just retries\n2. 30s cooldown is too long when server is truly broken\n3. After restart, availability cache isn't cleared aggressively enough\n\nProposed fix:\n1. Reduce failureThreshold to 1 (restart on first \"unexpected error\")\n2. Reduce restartCooldownMs to 10000 (10 seconds)\n3. Add proactive health check on agentmail_init that triggers restart if server is unhealthy\n4. Clear availability cache after any restart attempt\n5. Add `agentmail_restart` tool for manual restart\n\nFiles: src/agent-mail.ts","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-10T10:14:48.242736-08:00","updated_at":"2025-12-10T10:16:17.53306-08:00","closed_at":"2025-12-10T10:16:17.53306-08:00"}
|
|
617
617
|
{"id":"opencode-swarm-plugin-c540","title":"Limit test bead 2","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T08:22:16.856145-08:00","updated_at":"2025-12-08T08:22:19.29045-08:00","closed_at":"2025-12-08T08:22:19.29045-08:00"}
|
|
618
|
-
{"id":"opencode-swarm-plugin-c591c","title":"swarm.ts:1774-1777 - File reservation release without verification","description":"swarm.ts:1774-1777 - swarm_complete calls release_file_reservations but doesn't check if it succeeds. If release fails, reservations leak and block other agents. Suggested fix: Check mcpCall result and log/retry on failure.","status":"
|
|
618
|
+
{"id":"opencode-swarm-plugin-c591c","title":"swarm.ts:1774-1777 - File reservation release without verification","description":"swarm.ts:1774-1777 - swarm_complete calls release_file_reservations but doesn't check if it succeeds. If release fails, reservations leak and block other agents. Suggested fix: Check mcpCall result and log/retry on failure.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:06:38.089086-08:00","updated_at":"2025-12-10T11:56:11.855492-08:00","closed_at":"2025-12-10T11:56:11.855492-08:00"}
|
|
619
619
|
{"id":"opencode-swarm-plugin-c5l","title":"Bead to close","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T19:37:34.574305-08:00","updated_at":"2025-12-07T19:37:34.598352-08:00","closed_at":"2025-12-07T19:37:34.598352-08:00"}
|
|
620
620
|
{"id":"opencode-swarm-plugin-c5q7","title":"Update test bead","description":"Updated description","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T19:56:42.935629-08:00","updated_at":"2025-12-07T19:56:44.964596-08:00","closed_at":"2025-12-07T19:56:44.964596-08:00"}
|
|
621
621
|
{"id":"opencode-swarm-plugin-c5vtl","title":"Integration tests, audit beads, and release 0.12.5","description":"Run integration tests to verify fixes, create beads for remaining medium/low audit issues with context, then cut release with OTP","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-10T09:04:59.552742-08:00","updated_at":"2025-12-10T11:06:05.248492-08:00","closed_at":"2025-12-10T11:06:05.248492-08:00"}
|
|
@@ -693,7 +693,7 @@
|
|
|
693
693
|
{"id":"opencode-swarm-plugin-derc7","title":"Query test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:12:55.914846-08:00","updated_at":"2025-12-08T11:12:58.272157-08:00","closed_at":"2025-12-08T11:12:58.272157-08:00"}
|
|
694
694
|
{"id":"opencode-swarm-plugin-dg1","title":"Thread link test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T19:39:11.246967-08:00","updated_at":"2025-12-07T19:39:12.510407-08:00","closed_at":"2025-12-07T19:39:12.510407-08:00"}
|
|
695
695
|
{"id":"opencode-swarm-plugin-dgc7","title":"Thread link test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:10:54.98135-08:00","updated_at":"2025-12-08T11:10:56.48954-08:00","closed_at":"2025-12-08T11:10:56.48954-08:00"}
|
|
696
|
-
{"id":"opencode-swarm-plugin-dhwmm","title":"swarm.ts:850-870 - querySwarmMessages silently returns 0 on error","description":"swarm.ts:850-870 - querySwarmMessages catches all errors and returns 0. Callers can't distinguish between \"no messages\" and \"query failed\". Affects swarm_status accuracy. Suggested fix: Log error before returning 0.","status":"
|
|
696
|
+
{"id":"opencode-swarm-plugin-dhwmm","title":"swarm.ts:850-870 - querySwarmMessages silently returns 0 on error","description":"swarm.ts:850-870 - querySwarmMessages catches all errors and returns 0. Callers can't distinguish between \"no messages\" and \"query failed\". Affects swarm_status accuracy. Suggested fix: Log error before returning 0.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:06:28.375271-08:00","updated_at":"2025-12-10T11:56:18.544136-08:00","closed_at":"2025-12-10T11:56:18.544136-08:00"}
|
|
697
697
|
{"id":"opencode-swarm-plugin-dia","title":"Test bug with priority","description":"This is a critical bug","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-12-07T19:39:17.972947-08:00","updated_at":"2025-12-07T19:39:20.25944-08:00","closed_at":"2025-12-07T19:39:20.25944-08:00"}
|
|
698
698
|
{"id":"opencode-swarm-plugin-dl17","title":"Test bead minimal","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T08:56:55.165899-08:00","updated_at":"2025-12-08T08:56:57.785281-08:00","closed_at":"2025-12-08T08:56:57.785281-08:00"}
|
|
699
699
|
{"id":"opencode-swarm-plugin-dmt","title":"Bead to close","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T19:39:18.777024-08:00","updated_at":"2025-12-07T19:39:18.800362-08:00","closed_at":"2025-12-07T19:39:18.800362-08:00"}
|
|
@@ -762,7 +762,7 @@
|
|
|
762
762
|
{"id":"opencode-swarm-plugin-f4sy","title":"Limit test bead 2","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T19:56:42.711394-08:00","updated_at":"2025-12-07T19:56:44.848087-08:00","closed_at":"2025-12-07T19:56:44.848087-08:00"}
|
|
763
763
|
{"id":"opencode-swarm-plugin-f6q5","title":"Limit test bead 4","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T19:39:29.264603-08:00","updated_at":"2025-12-07T19:39:31.337282-08:00","closed_at":"2025-12-07T19:39:31.337282-08:00"}
|
|
764
764
|
{"id":"opencode-swarm-plugin-f7kn","title":"Bead to close","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:10:25.519878-08:00","updated_at":"2025-12-08T11:10:25.546915-08:00","closed_at":"2025-12-08T11:10:25.546915-08:00"}
|
|
765
|
-
{"id":"opencode-swarm-plugin-f8553","title":"rate-limiter.ts:383-410 - Missing bound checks in checkWindow SQL queries","description":"rate-limiter.ts:383-410 - checkWindow SQL queries don't validate query result before accessing .count or .timestamp properties. If query fails or returns unexpected shape, undefined access occurs. Suggested fix: Add null checks and validation.","status":"
|
|
765
|
+
{"id":"opencode-swarm-plugin-f8553","title":"rate-limiter.ts:383-410 - Missing bound checks in checkWindow SQL queries","description":"rate-limiter.ts:383-410 - checkWindow SQL queries don't validate query result before accessing .count or .timestamp properties. If query fails or returns unexpected shape, undefined access occurs. Suggested fix: Add null checks and validation.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:06:22.687466-08:00","updated_at":"2025-12-10T11:58:24.449815-08:00","closed_at":"2025-12-10T11:58:24.449815-08:00"}
|
|
766
766
|
{"id":"opencode-swarm-plugin-f8em","title":"Limit test bead 1","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T08:56:55.57952-08:00","updated_at":"2025-12-08T08:56:58.050301-08:00","closed_at":"2025-12-08T08:56:58.050301-08:00"}
|
|
767
767
|
{"id":"opencode-swarm-plugin-f8u","title":"Update test bead","description":"Blocked on dependency","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-07T19:37:34.46912-08:00","updated_at":"2025-12-07T19:37:36.362352-08:00","closed_at":"2025-12-07T19:37:36.362352-08:00"}
|
|
768
768
|
{"id":"opencode-swarm-plugin-faza","title":"Thread link test bead","description":"Important context here\n\n[thread:test-thread-789]","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:12:27.215365-08:00","updated_at":"2025-12-08T11:12:28.812764-08:00","closed_at":"2025-12-08T11:12:28.812764-08:00"}
|
|
@@ -996,7 +996,7 @@
|
|
|
996
996
|
{"id":"opencode-swarm-plugin-kkt0","title":"Update test bead","description":"Blocked on dependency","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-08T07:46:49.490988-08:00","updated_at":"2025-12-08T07:46:51.908928-08:00","closed_at":"2025-12-08T07:46:51.908928-08:00"}
|
|
997
997
|
{"id":"opencode-swarm-plugin-kl36","title":"Lifecycle test bead","description":"50% complete","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:11:24.960304-08:00","updated_at":"2025-12-08T11:11:25.037091-08:00","closed_at":"2025-12-08T11:11:25.037091-08:00"}
|
|
998
998
|
{"id":"opencode-swarm-plugin-klc","title":"Query test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T19:39:09.589152-08:00","updated_at":"2025-12-07T19:39:11.765447-08:00","closed_at":"2025-12-07T19:39:11.765447-08:00"}
|
|
999
|
-
{"id":"opencode-swarm-plugin-kmlbm","title":"swarm.ts:820-840 - queryEpicSubtasks returns empty on error with only warning","description":"swarm.ts:820-840 - queryEpicSubtasks logs warning on failure but returns empty array. Callers can't distinguish between \"no subtasks\" and \"query failed\". Could cause incorrect status reporting. Suggested fix: Throw error or return Result type.","status":"
|
|
999
|
+
{"id":"opencode-swarm-plugin-kmlbm","title":"swarm.ts:820-840 - queryEpicSubtasks returns empty on error with only warning","description":"swarm.ts:820-840 - queryEpicSubtasks logs warning on failure but returns empty array. Callers can't distinguish between \"no subtasks\" and \"query failed\". Could cause incorrect status reporting. Suggested fix: Throw error or return Result type.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:06:26.391059-08:00","updated_at":"2025-12-10T11:56:19.38476-08:00","closed_at":"2025-12-10T11:56:19.38476-08:00"}
|
|
1000
1000
|
{"id":"opencode-swarm-plugin-kptb","title":"Test bug with priority","description":"This is a critical bug","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-12-07T19:41:10.637373-08:00","updated_at":"2025-12-07T19:41:13.253191-08:00","closed_at":"2025-12-07T19:41:13.253191-08:00"}
|
|
1001
1001
|
{"id":"opencode-swarm-plugin-kr0ue","title":"Document shared_context usage pattern","description":"src/schemas/task.ts:62 - `shared_context` field comment \"Context to pass to all agents\" is vague. Add example: \"/** Shared context for all agents (e.g., API contracts, shared types, project conventions) */\"","status":"open","priority":3,"issue_type":"chore","created_at":"2025-12-10T09:06:27.641899-08:00","updated_at":"2025-12-10T09:06:27.641899-08:00"}
|
|
1002
1002
|
{"id":"opencode-swarm-plugin-ksf8","title":"Query test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:11:22.941287-08:00","updated_at":"2025-12-08T11:11:25.542086-08:00","closed_at":"2025-12-08T11:11:25.542086-08:00"}
|
|
@@ -1235,9 +1235,9 @@
|
|
|
1235
1235
|
{"id":"opencode-swarm-plugin-ppyaf","title":"Clarify dependencies default value behavior","description":"src/schemas/bead.ts:55 - `dependencies` uses `.optional().default([])` which is redundant - optional with default is always present. Change to just `.default([])` for clarity.","status":"open","priority":3,"issue_type":"chore","created_at":"2025-12-10T09:06:09.341547-08:00","updated_at":"2025-12-10T09:06:09.341547-08:00"}
|
|
1236
1236
|
{"id":"opencode-swarm-plugin-pqe1f","title":"agent-mail.ts:122-131 - Non-atomic session state save","description":"agent-mail.ts:122-131 - saveSessionState() writes directly to target file without atomic write-then-rename pattern. Could corrupt state if process crashes mid-write. Suggested fix: Write to temp file, then rename atomically.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:06:01.116799-08:00","updated_at":"2025-12-10T09:06:01.116799-08:00"}
|
|
1237
1237
|
{"id":"opencode-swarm-plugin-prx0","title":"Test bead minimal","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T11:11:22.332649-08:00","updated_at":"2025-12-08T11:11:25.183868-08:00","closed_at":"2025-12-08T11:11:25.183868-08:00"}
|
|
1238
|
-
{"id":"opencode-swarm-plugin-ps1jm","title":"learning.ts:197-234 - calculateCriterionWeight doesn't handle empty events","description":"learning.ts:197-234 - calculateCriterionWeight accesses events[0]?.criterion when events array is empty, returning \"unknown\". Callers may not expect this. Suggested fix: Require non-empty events array or return error result.","status":"
|
|
1238
|
+
{"id":"opencode-swarm-plugin-ps1jm","title":"learning.ts:197-234 - calculateCriterionWeight doesn't handle empty events","description":"learning.ts:197-234 - calculateCriterionWeight accesses events[0]?.criterion when events array is empty, returning \"unknown\". Callers may not expect this. Suggested fix: Require non-empty events array or return error result.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:06:40.768084-08:00","updated_at":"2025-12-10T11:56:10.918368-08:00","closed_at":"2025-12-10T11:56:10.918368-08:00"}
|
|
1239
1239
|
{"id":"opencode-swarm-plugin-ps5u4","title":"Update test bead","description":"Original description","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-09T10:00:22.870132-08:00","updated_at":"2025-12-09T10:00:25.95012-08:00","closed_at":"2025-12-09T10:00:25.95012-08:00"}
|
|
1240
|
-
{"id":"opencode-swarm-plugin-psfm3","title":"swarm.ts:1710-1725 - Critical bug blocking silently continues on parse error","description":"swarm.ts:1710-1725 - swarm_complete catches Zod parse errors on evaluation but doesn't block completion for critical issues beyond evaluation. If UBS returns parse errors, they're ignored. Suggested fix: Block completion on UBS parse errors too.","status":"
|
|
1240
|
+
{"id":"opencode-swarm-plugin-psfm3","title":"swarm.ts:1710-1725 - Critical bug blocking silently continues on parse error","description":"swarm.ts:1710-1725 - swarm_complete catches Zod parse errors on evaluation but doesn't block completion for critical issues beyond evaluation. If UBS returns parse errors, they're ignored. Suggested fix: Block completion on UBS parse errors too.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:06:35.874785-08:00","updated_at":"2025-12-10T11:56:12.284646-08:00","closed_at":"2025-12-10T11:56:12.284646-08:00"}
|
|
1241
1241
|
{"id":"opencode-swarm-plugin-psm","title":"Single subtask epic","description":"","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-07T19:39:19.273159-08:00","updated_at":"2025-12-07T19:39:20.860341-08:00","closed_at":"2025-12-07T19:39:20.860341-08:00"}
|
|
1242
1242
|
{"id":"opencode-swarm-plugin-pvw","title":"Query test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T19:39:18.123613-08:00","updated_at":"2025-12-07T19:39:20.346988-08:00","closed_at":"2025-12-07T19:39:20.346988-08:00"}
|
|
1243
1243
|
{"id":"opencode-swarm-plugin-px38","title":"Thread link test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T09:09:32.475528-08:00","updated_at":"2025-12-08T09:09:33.937467-08:00","closed_at":"2025-12-08T09:09:33.937467-08:00"}
|
|
@@ -1296,7 +1296,7 @@
|
|
|
1296
1296
|
{"id":"opencode-swarm-plugin-rlgfi","title":"agent-mail.ts:1115-1120 - Unexpected response structure not validated","description":"agent-mail.ts:1115-1120 - agentmail_reserve checks for null result but doesn't validate the shape of result.granted. If API changes and returns non-array, error message is generic. Suggested fix: Validate result shape with Zod or detailed error message.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:06:09.12539-08:00","updated_at":"2025-12-10T09:06:09.12539-08:00"}
|
|
1297
1297
|
{"id":"opencode-swarm-plugin-rncxj","title":"Update test bead","description":"Blocked on dependency","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-10T09:07:22.827715-08:00","updated_at":"2025-12-10T09:07:25.968534-08:00","closed_at":"2025-12-10T09:07:25.968534-08:00"}
|
|
1298
1298
|
{"id":"opencode-swarm-plugin-rnvw","title":"Thread link test bead","description":"[thread:test-thread-123]","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T09:09:32.128747-08:00","updated_at":"2025-12-08T09:09:33.864055-08:00","closed_at":"2025-12-08T09:09:33.864055-08:00"}
|
|
1299
|
-
{"id":"opencode-swarm-plugin-rpe7q","title":"learning.ts:423-437 - InMemoryFeedbackStorage has unbounded memory growth","description":"learning.ts:423-437 - InMemoryFeedbackStorage stores all events in array with no cleanup or size limit. Long-running sessions could OOM. Suggested fix: Add max size with LRU eviction or periodic cleanup.","status":"
|
|
1299
|
+
{"id":"opencode-swarm-plugin-rpe7q","title":"learning.ts:423-437 - InMemoryFeedbackStorage has unbounded memory growth","description":"learning.ts:423-437 - InMemoryFeedbackStorage stores all events in array with no cleanup or size limit. Long-running sessions could OOM. Suggested fix: Add max size with LRU eviction or periodic cleanup.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:06:45.008479-08:00","updated_at":"2025-12-10T11:56:09.251539-08:00","closed_at":"2025-12-10T11:56:09.251539-08:00"}
|
|
1300
1300
|
{"id":"opencode-swarm-plugin-rr3d","title":"High priority ready bead","description":"","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-08T08:23:18.274457-08:00","updated_at":"2025-12-08T08:23:20.208121-08:00","closed_at":"2025-12-08T08:23:20.208121-08:00"}
|
|
1301
1301
|
{"id":"opencode-swarm-plugin-rrih","title":"Epic with file references","description":"","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-07T19:41:11.977841-08:00","updated_at":"2025-12-07T19:41:13.848868-08:00","closed_at":"2025-12-07T19:41:13.848868-08:00"}
|
|
1302
1302
|
{"id":"opencode-swarm-plugin-rrih.2","title":"Edit src/b.ts","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T19:41:12.048952-08:00","updated_at":"2025-12-07T19:41:13.898152-08:00","closed_at":"2025-12-07T19:41:13.898152-08:00","dependencies":[{"issue_id":"opencode-swarm-plugin-rrih.2","depends_on_id":"opencode-swarm-plugin-rrih","type":"parent-child","created_at":"2025-12-07T19:41:12.049256-08:00","created_by":"daemon"}]}
|
|
@@ -1475,7 +1475,7 @@
|
|
|
1475
1475
|
{"id":"opencode-swarm-plugin-v4wk","title":"Query test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T07:49:09.273976-08:00","updated_at":"2025-12-08T07:49:11.911446-08:00","closed_at":"2025-12-08T07:49:11.911446-08:00"}
|
|
1476
1476
|
{"id":"opencode-swarm-plugin-v6v9","title":"Query test bead","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T09:09:30.764976-08:00","updated_at":"2025-12-08T09:09:33.160752-08:00","closed_at":"2025-12-08T09:09:33.160752-08:00"}
|
|
1477
1477
|
{"id":"opencode-swarm-plugin-v72","title":"Limit test bead 3","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T19:39:09.816102-08:00","updated_at":"2025-12-07T19:39:11.902421-08:00","closed_at":"2025-12-07T19:39:11.902421-08:00"}
|
|
1478
|
-
{"id":"opencode-swarm-plugin-v74fo","title":"learning.ts:254-259 - Potential division by zero in decay calculation","description":"learning.ts:254-259 - scoreImplicitFeedback calls calculateDecayedValue but doesn't validate halfLifeDays isn't zero. If config is malformed, division by zero occurs. Suggested fix: Validate config or add bounds check.","status":"
|
|
1478
|
+
{"id":"opencode-swarm-plugin-v74fo","title":"learning.ts:254-259 - Potential division by zero in decay calculation","description":"learning.ts:254-259 - scoreImplicitFeedback calls calculateDecayedValue but doesn't validate halfLifeDays isn't zero. If config is malformed, division by zero occurs. Suggested fix: Validate config or add bounds check.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-10T09:06:42.722198-08:00","updated_at":"2025-12-10T11:56:10.091823-08:00","closed_at":"2025-12-10T11:56:10.091823-08:00"}
|
|
1479
1479
|
{"id":"opencode-swarm-plugin-v8oa","title":"Lifecycle test bead","description":"50% complete","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T07:46:50.951289-08:00","updated_at":"2025-12-08T07:46:51.033444-08:00","closed_at":"2025-12-08T07:46:51.033444-08:00"}
|
|
1480
1480
|
{"id":"opencode-swarm-plugin-v8rf","title":"Test bug with priority","description":"This is a critical bug","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-12-07T19:39:28.865894-08:00","updated_at":"2025-12-07T19:39:31.084269-08:00","closed_at":"2025-12-07T19:39:31.084269-08:00"}
|
|
1481
1481
|
{"id":"opencode-swarm-plugin-v8wf","title":"Test bug with priority","description":"This is a critical bug","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-12-08T11:11:22.658761-08:00","updated_at":"2025-12-08T11:11:25.414717-08:00","closed_at":"2025-12-08T11:11:25.414717-08:00"}
|
package/dist/index.js
CHANGED
|
@@ -21848,7 +21848,14 @@ var beads_create = tool({
|
|
|
21848
21848
|
if (result.exitCode !== 0) {
|
|
21849
21849
|
throw new BeadError(`Failed to create bead: ${result.stderr.toString()}`, cmdParts.join(" "), result.exitCode, result.stderr.toString());
|
|
21850
21850
|
}
|
|
21851
|
-
const
|
|
21851
|
+
const stdout = result.stdout.toString().trim();
|
|
21852
|
+
if (!stdout) {
|
|
21853
|
+
throw new BeadError("bd create returned empty output", cmdParts.join(" "), 0, "Empty stdout");
|
|
21854
|
+
}
|
|
21855
|
+
if (stdout.startsWith("error:") || stdout.startsWith("Error:")) {
|
|
21856
|
+
throw new BeadError(`bd create failed: ${stdout}`, cmdParts.join(" "), 0, stdout);
|
|
21857
|
+
}
|
|
21858
|
+
const bead = parseBead(stdout);
|
|
21852
21859
|
return JSON.stringify(bead, null, 2);
|
|
21853
21860
|
}
|
|
21854
21861
|
});
|
|
@@ -21901,6 +21908,7 @@ var beads_create_epic = tool({
|
|
|
21901
21908
|
return JSON.stringify(result, null, 2);
|
|
21902
21909
|
} catch (error45) {
|
|
21903
21910
|
const rollbackCommands = [];
|
|
21911
|
+
const rollbackErrors = [];
|
|
21904
21912
|
for (const bead of created) {
|
|
21905
21913
|
try {
|
|
21906
21914
|
const closeCmd = [
|
|
@@ -21911,20 +21919,39 @@ var beads_create_epic = tool({
|
|
|
21911
21919
|
"Rollback partial epic",
|
|
21912
21920
|
"--json"
|
|
21913
21921
|
];
|
|
21914
|
-
await Bun.$`${closeCmd}`.quiet().nothrow();
|
|
21915
|
-
|
|
21922
|
+
const rollbackResult = await Bun.$`${closeCmd}`.quiet().nothrow();
|
|
21923
|
+
if (rollbackResult.exitCode === 0) {
|
|
21924
|
+
rollbackCommands.push(`bd close ${bead.id} --reason "Rollback partial epic"`);
|
|
21925
|
+
} else {
|
|
21926
|
+
rollbackErrors.push(`${bead.id}: exit ${rollbackResult.exitCode} - ${rollbackResult.stderr.toString().trim()}`);
|
|
21927
|
+
}
|
|
21916
21928
|
} catch (rollbackError) {
|
|
21929
|
+
const errMsg = rollbackError instanceof Error ? rollbackError.message : String(rollbackError);
|
|
21917
21930
|
console.error(`Failed to rollback bead ${bead.id}:`, rollbackError);
|
|
21931
|
+
rollbackErrors.push(`${bead.id}: ${errMsg}`);
|
|
21918
21932
|
}
|
|
21919
21933
|
}
|
|
21920
21934
|
const errorMsg = error45 instanceof Error ? error45.message : String(error45);
|
|
21921
|
-
|
|
21935
|
+
let rollbackInfo = "";
|
|
21936
|
+
if (rollbackCommands.length > 0) {
|
|
21937
|
+
rollbackInfo += `
|
|
21922
21938
|
|
|
21923
21939
|
Rolled back ${rollbackCommands.length} bead(s):
|
|
21924
21940
|
${rollbackCommands.join(`
|
|
21925
|
-
`)}
|
|
21941
|
+
`)}`;
|
|
21942
|
+
}
|
|
21943
|
+
if (rollbackErrors.length > 0) {
|
|
21944
|
+
rollbackInfo += `
|
|
21945
|
+
|
|
21946
|
+
Rollback failures (${rollbackErrors.length}):
|
|
21947
|
+
${rollbackErrors.join(`
|
|
21948
|
+
`)}`;
|
|
21949
|
+
}
|
|
21950
|
+
if (!rollbackInfo) {
|
|
21951
|
+
rollbackInfo = `
|
|
21926
21952
|
|
|
21927
21953
|
No beads to rollback.`;
|
|
21954
|
+
}
|
|
21928
21955
|
throw new BeadError(`Epic creation failed: ${errorMsg}${rollbackInfo}`, "beads_create_epic", 1);
|
|
21929
21956
|
}
|
|
21930
21957
|
}
|
|
@@ -22054,8 +22081,17 @@ var beads_sync = tool({
|
|
|
22054
22081
|
const autoPull = args.auto_pull ?? true;
|
|
22055
22082
|
const TIMEOUT_MS = 30000;
|
|
22056
22083
|
const withTimeout = async (promise2, timeoutMs, operation) => {
|
|
22057
|
-
|
|
22058
|
-
|
|
22084
|
+
let timeoutId;
|
|
22085
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
22086
|
+
timeoutId = setTimeout(() => reject(new BeadError(`Operation timed out after ${timeoutMs}ms`, operation)), timeoutMs);
|
|
22087
|
+
});
|
|
22088
|
+
try {
|
|
22089
|
+
return await Promise.race([promise2, timeoutPromise]);
|
|
22090
|
+
} finally {
|
|
22091
|
+
if (timeoutId !== undefined) {
|
|
22092
|
+
clearTimeout(timeoutId);
|
|
22093
|
+
}
|
|
22094
|
+
}
|
|
22059
22095
|
};
|
|
22060
22096
|
if (autoPull) {
|
|
22061
22097
|
const pullResult = await withTimeout(Bun.$`git pull --rebase`.quiet().nothrow(), TIMEOUT_MS, "git pull --rebase");
|
|
@@ -22729,13 +22765,18 @@ class AgentMailError extends Error {
|
|
|
22729
22765
|
this.code = code;
|
|
22730
22766
|
this.data = data;
|
|
22731
22767
|
this.name = "AgentMailError";
|
|
22768
|
+
Object.setPrototypeOf(this, AgentMailError.prototype);
|
|
22732
22769
|
}
|
|
22733
22770
|
}
|
|
22771
|
+
function createAgentMailError(message, tool3, code, data) {
|
|
22772
|
+
return new AgentMailError(message, tool3, code, data);
|
|
22773
|
+
}
|
|
22734
22774
|
|
|
22735
22775
|
class AgentMailNotInitializedError extends Error {
|
|
22736
22776
|
constructor() {
|
|
22737
22777
|
super("Agent Mail not initialized. Call agent-mail:init first.");
|
|
22738
22778
|
this.name = "AgentMailNotInitializedError";
|
|
22779
|
+
Object.setPrototypeOf(this, AgentMailNotInitializedError.prototype);
|
|
22739
22780
|
}
|
|
22740
22781
|
}
|
|
22741
22782
|
|
|
@@ -26205,6 +26246,7 @@ class SemanticMemoryStorage {
|
|
|
26205
26246
|
}
|
|
26206
26247
|
const result = await execSemanticMemory(args);
|
|
26207
26248
|
if (result.exitCode !== 0) {
|
|
26249
|
+
console.warn(`[storage] semantic-memory find() failed with exit code ${result.exitCode}: ${result.stderr.toString().trim()}`);
|
|
26208
26250
|
return [];
|
|
26209
26251
|
}
|
|
26210
26252
|
try {
|
|
@@ -26221,7 +26263,8 @@ class SemanticMemoryStorage {
|
|
|
26221
26263
|
return content;
|
|
26222
26264
|
}
|
|
26223
26265
|
});
|
|
26224
|
-
} catch {
|
|
26266
|
+
} catch (error45) {
|
|
26267
|
+
console.warn(`[storage] Failed to parse semantic-memory find() output: ${error45 instanceof Error ? error45.message : String(error45)}`);
|
|
26225
26268
|
return [];
|
|
26226
26269
|
}
|
|
26227
26270
|
}
|
|
@@ -26233,6 +26276,7 @@ class SemanticMemoryStorage {
|
|
|
26233
26276
|
"--json"
|
|
26234
26277
|
]);
|
|
26235
26278
|
if (result.exitCode !== 0) {
|
|
26279
|
+
console.warn(`[storage] semantic-memory list() failed with exit code ${result.exitCode}: ${result.stderr.toString().trim()}`);
|
|
26236
26280
|
return [];
|
|
26237
26281
|
}
|
|
26238
26282
|
try {
|
|
@@ -26249,7 +26293,8 @@ class SemanticMemoryStorage {
|
|
|
26249
26293
|
return content;
|
|
26250
26294
|
}
|
|
26251
26295
|
});
|
|
26252
|
-
} catch {
|
|
26296
|
+
} catch (error45) {
|
|
26297
|
+
console.warn(`[storage] Failed to parse semantic-memory list() output: ${error45 instanceof Error ? error45.message : String(error45)}`);
|
|
26253
26298
|
return [];
|
|
26254
26299
|
}
|
|
26255
26300
|
}
|
|
@@ -26563,6 +26608,7 @@ export {
|
|
|
26563
26608
|
src_default as default,
|
|
26564
26609
|
createStorageWithFallback,
|
|
26565
26610
|
createStorage,
|
|
26611
|
+
createAgentMailError,
|
|
26566
26612
|
checkTool,
|
|
26567
26613
|
checkAllTools,
|
|
26568
26614
|
beads_update,
|
package/dist/plugin.js
CHANGED
|
@@ -21848,7 +21848,14 @@ var beads_create = tool({
|
|
|
21848
21848
|
if (result.exitCode !== 0) {
|
|
21849
21849
|
throw new BeadError(`Failed to create bead: ${result.stderr.toString()}`, cmdParts.join(" "), result.exitCode, result.stderr.toString());
|
|
21850
21850
|
}
|
|
21851
|
-
const
|
|
21851
|
+
const stdout = result.stdout.toString().trim();
|
|
21852
|
+
if (!stdout) {
|
|
21853
|
+
throw new BeadError("bd create returned empty output", cmdParts.join(" "), 0, "Empty stdout");
|
|
21854
|
+
}
|
|
21855
|
+
if (stdout.startsWith("error:") || stdout.startsWith("Error:")) {
|
|
21856
|
+
throw new BeadError(`bd create failed: ${stdout}`, cmdParts.join(" "), 0, stdout);
|
|
21857
|
+
}
|
|
21858
|
+
const bead = parseBead(stdout);
|
|
21852
21859
|
return JSON.stringify(bead, null, 2);
|
|
21853
21860
|
}
|
|
21854
21861
|
});
|
|
@@ -21901,6 +21908,7 @@ var beads_create_epic = tool({
|
|
|
21901
21908
|
return JSON.stringify(result, null, 2);
|
|
21902
21909
|
} catch (error45) {
|
|
21903
21910
|
const rollbackCommands = [];
|
|
21911
|
+
const rollbackErrors = [];
|
|
21904
21912
|
for (const bead of created) {
|
|
21905
21913
|
try {
|
|
21906
21914
|
const closeCmd = [
|
|
@@ -21911,20 +21919,39 @@ var beads_create_epic = tool({
|
|
|
21911
21919
|
"Rollback partial epic",
|
|
21912
21920
|
"--json"
|
|
21913
21921
|
];
|
|
21914
|
-
await Bun.$`${closeCmd}`.quiet().nothrow();
|
|
21915
|
-
|
|
21922
|
+
const rollbackResult = await Bun.$`${closeCmd}`.quiet().nothrow();
|
|
21923
|
+
if (rollbackResult.exitCode === 0) {
|
|
21924
|
+
rollbackCommands.push(`bd close ${bead.id} --reason "Rollback partial epic"`);
|
|
21925
|
+
} else {
|
|
21926
|
+
rollbackErrors.push(`${bead.id}: exit ${rollbackResult.exitCode} - ${rollbackResult.stderr.toString().trim()}`);
|
|
21927
|
+
}
|
|
21916
21928
|
} catch (rollbackError) {
|
|
21929
|
+
const errMsg = rollbackError instanceof Error ? rollbackError.message : String(rollbackError);
|
|
21917
21930
|
console.error(`Failed to rollback bead ${bead.id}:`, rollbackError);
|
|
21931
|
+
rollbackErrors.push(`${bead.id}: ${errMsg}`);
|
|
21918
21932
|
}
|
|
21919
21933
|
}
|
|
21920
21934
|
const errorMsg = error45 instanceof Error ? error45.message : String(error45);
|
|
21921
|
-
|
|
21935
|
+
let rollbackInfo = "";
|
|
21936
|
+
if (rollbackCommands.length > 0) {
|
|
21937
|
+
rollbackInfo += `
|
|
21922
21938
|
|
|
21923
21939
|
Rolled back ${rollbackCommands.length} bead(s):
|
|
21924
21940
|
${rollbackCommands.join(`
|
|
21925
|
-
`)}
|
|
21941
|
+
`)}`;
|
|
21942
|
+
}
|
|
21943
|
+
if (rollbackErrors.length > 0) {
|
|
21944
|
+
rollbackInfo += `
|
|
21945
|
+
|
|
21946
|
+
Rollback failures (${rollbackErrors.length}):
|
|
21947
|
+
${rollbackErrors.join(`
|
|
21948
|
+
`)}`;
|
|
21949
|
+
}
|
|
21950
|
+
if (!rollbackInfo) {
|
|
21951
|
+
rollbackInfo = `
|
|
21926
21952
|
|
|
21927
21953
|
No beads to rollback.`;
|
|
21954
|
+
}
|
|
21928
21955
|
throw new BeadError(`Epic creation failed: ${errorMsg}${rollbackInfo}`, "beads_create_epic", 1);
|
|
21929
21956
|
}
|
|
21930
21957
|
}
|
|
@@ -22054,8 +22081,17 @@ var beads_sync = tool({
|
|
|
22054
22081
|
const autoPull = args.auto_pull ?? true;
|
|
22055
22082
|
const TIMEOUT_MS = 30000;
|
|
22056
22083
|
const withTimeout = async (promise2, timeoutMs, operation) => {
|
|
22057
|
-
|
|
22058
|
-
|
|
22084
|
+
let timeoutId;
|
|
22085
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
22086
|
+
timeoutId = setTimeout(() => reject(new BeadError(`Operation timed out after ${timeoutMs}ms`, operation)), timeoutMs);
|
|
22087
|
+
});
|
|
22088
|
+
try {
|
|
22089
|
+
return await Promise.race([promise2, timeoutPromise]);
|
|
22090
|
+
} finally {
|
|
22091
|
+
if (timeoutId !== undefined) {
|
|
22092
|
+
clearTimeout(timeoutId);
|
|
22093
|
+
}
|
|
22094
|
+
}
|
|
22059
22095
|
};
|
|
22060
22096
|
if (autoPull) {
|
|
22061
22097
|
const pullResult = await withTimeout(Bun.$`git pull --rebase`.quiet().nothrow(), TIMEOUT_MS, "git pull --rebase");
|
|
@@ -22703,13 +22739,14 @@ class AgentMailError extends Error {
|
|
|
22703
22739
|
this.code = code;
|
|
22704
22740
|
this.data = data;
|
|
22705
22741
|
this.name = "AgentMailError";
|
|
22742
|
+
Object.setPrototypeOf(this, AgentMailError.prototype);
|
|
22706
22743
|
}
|
|
22707
22744
|
}
|
|
22708
|
-
|
|
22709
22745
|
class AgentMailNotInitializedError extends Error {
|
|
22710
22746
|
constructor() {
|
|
22711
22747
|
super("Agent Mail not initialized. Call agent-mail:init first.");
|
|
22712
22748
|
this.name = "AgentMailNotInitializedError";
|
|
22749
|
+
Object.setPrototypeOf(this, AgentMailNotInitializedError.prototype);
|
|
22713
22750
|
}
|
|
22714
22751
|
}
|
|
22715
22752
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-swarm-plugin",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.16",
|
|
4
4
|
"description": "Multi-agent swarm coordination for OpenCode with learning capabilities, beads integration, and Agent Mail",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -12,6 +12,9 @@
|
|
|
12
12
|
".": {
|
|
13
13
|
"import": "./dist/index.js",
|
|
14
14
|
"types": "./dist/index.d.ts"
|
|
15
|
+
},
|
|
16
|
+
"./plugin": {
|
|
17
|
+
"import": "./dist/plugin.js"
|
|
15
18
|
}
|
|
16
19
|
},
|
|
17
20
|
"scripts": {
|
package/src/agent-mail.ts
CHANGED
|
@@ -231,22 +231,46 @@ interface ThreadSummary {
|
|
|
231
231
|
// Errors
|
|
232
232
|
// ============================================================================
|
|
233
233
|
|
|
234
|
+
/**
|
|
235
|
+
* AgentMailError - Custom error for Agent Mail operations
|
|
236
|
+
*
|
|
237
|
+
* Note: Using a factory pattern to avoid "Cannot call a class constructor without |new|"
|
|
238
|
+
* errors in some bundled environments (OpenCode's plugin runtime).
|
|
239
|
+
*/
|
|
234
240
|
export class AgentMailError extends Error {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
) {
|
|
241
|
+
public readonly tool: string;
|
|
242
|
+
public readonly code?: number;
|
|
243
|
+
public readonly data?: unknown;
|
|
244
|
+
|
|
245
|
+
constructor(message: string, tool: string, code?: number, data?: unknown) {
|
|
241
246
|
super(message);
|
|
247
|
+
this.tool = tool;
|
|
248
|
+
this.code = code;
|
|
249
|
+
this.data = data;
|
|
242
250
|
this.name = "AgentMailError";
|
|
251
|
+
// Fix prototype chain for instanceof checks
|
|
252
|
+
Object.setPrototypeOf(this, AgentMailError.prototype);
|
|
243
253
|
}
|
|
244
254
|
}
|
|
245
255
|
|
|
256
|
+
/**
|
|
257
|
+
* Factory function to create AgentMailError
|
|
258
|
+
* Use this instead of `new AgentMailError()` for compatibility
|
|
259
|
+
*/
|
|
260
|
+
export function createAgentMailError(
|
|
261
|
+
message: string,
|
|
262
|
+
tool: string,
|
|
263
|
+
code?: number,
|
|
264
|
+
data?: unknown,
|
|
265
|
+
): AgentMailError {
|
|
266
|
+
return new AgentMailError(message, tool, code, data);
|
|
267
|
+
}
|
|
268
|
+
|
|
246
269
|
export class AgentMailNotInitializedError extends Error {
|
|
247
270
|
constructor() {
|
|
248
271
|
super("Agent Mail not initialized. Call agent-mail:init first.");
|
|
249
272
|
this.name = "AgentMailNotInitializedError";
|
|
273
|
+
Object.setPrototypeOf(this, AgentMailNotInitializedError.prototype);
|
|
250
274
|
}
|
|
251
275
|
}
|
|
252
276
|
|
package/src/beads.ts
CHANGED
|
@@ -171,7 +171,28 @@ export const beads_create = tool({
|
|
|
171
171
|
);
|
|
172
172
|
}
|
|
173
173
|
|
|
174
|
-
|
|
174
|
+
// Validate output before parsing
|
|
175
|
+
const stdout = result.stdout.toString().trim();
|
|
176
|
+
if (!stdout) {
|
|
177
|
+
throw new BeadError(
|
|
178
|
+
"bd create returned empty output",
|
|
179
|
+
cmdParts.join(" "),
|
|
180
|
+
0,
|
|
181
|
+
"Empty stdout",
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Check for error messages in stdout (bd sometimes outputs errors to stdout)
|
|
186
|
+
if (stdout.startsWith("error:") || stdout.startsWith("Error:")) {
|
|
187
|
+
throw new BeadError(
|
|
188
|
+
`bd create failed: ${stdout}`,
|
|
189
|
+
cmdParts.join(" "),
|
|
190
|
+
0,
|
|
191
|
+
stdout,
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const bead = parseBead(stdout);
|
|
175
196
|
return JSON.stringify(bead, null, 2);
|
|
176
197
|
},
|
|
177
198
|
});
|
|
@@ -256,6 +277,7 @@ export const beads_create_epic = tool({
|
|
|
256
277
|
} catch (error) {
|
|
257
278
|
// Partial failure - execute rollback automatically
|
|
258
279
|
const rollbackCommands: string[] = [];
|
|
280
|
+
const rollbackErrors: string[] = [];
|
|
259
281
|
|
|
260
282
|
for (const bead of created) {
|
|
261
283
|
try {
|
|
@@ -267,22 +289,42 @@ export const beads_create_epic = tool({
|
|
|
267
289
|
"Rollback partial epic",
|
|
268
290
|
"--json",
|
|
269
291
|
];
|
|
270
|
-
await Bun.$`${closeCmd}`.quiet().nothrow();
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
292
|
+
const rollbackResult = await Bun.$`${closeCmd}`.quiet().nothrow();
|
|
293
|
+
if (rollbackResult.exitCode === 0) {
|
|
294
|
+
rollbackCommands.push(
|
|
295
|
+
`bd close ${bead.id} --reason "Rollback partial epic"`,
|
|
296
|
+
);
|
|
297
|
+
} else {
|
|
298
|
+
rollbackErrors.push(
|
|
299
|
+
`${bead.id}: exit ${rollbackResult.exitCode} - ${rollbackResult.stderr.toString().trim()}`,
|
|
300
|
+
);
|
|
301
|
+
}
|
|
274
302
|
} catch (rollbackError) {
|
|
275
|
-
// Log rollback failure
|
|
303
|
+
// Log rollback failure and collect error
|
|
304
|
+
const errMsg =
|
|
305
|
+
rollbackError instanceof Error
|
|
306
|
+
? rollbackError.message
|
|
307
|
+
: String(rollbackError);
|
|
276
308
|
console.error(`Failed to rollback bead ${bead.id}:`, rollbackError);
|
|
309
|
+
rollbackErrors.push(`${bead.id}: ${errMsg}`);
|
|
277
310
|
}
|
|
278
311
|
}
|
|
279
312
|
|
|
280
|
-
// Throw error with rollback info
|
|
313
|
+
// Throw error with rollback info including any failures
|
|
281
314
|
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
315
|
+
let rollbackInfo = "";
|
|
316
|
+
|
|
317
|
+
if (rollbackCommands.length > 0) {
|
|
318
|
+
rollbackInfo += `\n\nRolled back ${rollbackCommands.length} bead(s):\n${rollbackCommands.join("\n")}`;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
if (rollbackErrors.length > 0) {
|
|
322
|
+
rollbackInfo += `\n\nRollback failures (${rollbackErrors.length}):\n${rollbackErrors.join("\n")}`;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
if (!rollbackInfo) {
|
|
326
|
+
rollbackInfo = "\n\nNo beads to rollback.";
|
|
327
|
+
}
|
|
286
328
|
|
|
287
329
|
throw new BeadError(
|
|
288
330
|
`Epic creation failed: ${errorMsg}${rollbackInfo}`,
|
|
@@ -510,14 +552,17 @@ export const beads_sync = tool({
|
|
|
510
552
|
|
|
511
553
|
/**
|
|
512
554
|
* Helper to run a command with timeout
|
|
555
|
+
* Properly clears the timeout to avoid lingering timers
|
|
513
556
|
*/
|
|
514
557
|
const withTimeout = async <T>(
|
|
515
558
|
promise: Promise<T>,
|
|
516
559
|
timeoutMs: number,
|
|
517
560
|
operation: string,
|
|
518
561
|
): Promise<T> => {
|
|
519
|
-
|
|
520
|
-
|
|
562
|
+
let timeoutId: ReturnType<typeof setTimeout> | undefined;
|
|
563
|
+
|
|
564
|
+
const timeoutPromise = new Promise<never>((_, reject) => {
|
|
565
|
+
timeoutId = setTimeout(
|
|
521
566
|
() =>
|
|
522
567
|
reject(
|
|
523
568
|
new BeadError(
|
|
@@ -526,9 +571,16 @@ export const beads_sync = tool({
|
|
|
526
571
|
),
|
|
527
572
|
),
|
|
528
573
|
timeoutMs,
|
|
529
|
-
)
|
|
530
|
-
);
|
|
531
|
-
|
|
574
|
+
);
|
|
575
|
+
});
|
|
576
|
+
|
|
577
|
+
try {
|
|
578
|
+
return await Promise.race([promise, timeoutPromise]);
|
|
579
|
+
} finally {
|
|
580
|
+
if (timeoutId !== undefined) {
|
|
581
|
+
clearTimeout(timeoutId);
|
|
582
|
+
}
|
|
583
|
+
}
|
|
532
584
|
};
|
|
533
585
|
|
|
534
586
|
// 1. Pull if requested
|
package/src/index.ts
CHANGED
|
@@ -226,14 +226,15 @@ export * from "./beads";
|
|
|
226
226
|
* - AgentMailError, FileReservationConflictError - Error classes
|
|
227
227
|
* - AgentMailState - Session state type
|
|
228
228
|
*
|
|
229
|
-
* NOTE:
|
|
230
|
-
*
|
|
229
|
+
* NOTE: For OpenCode plugin usage, import from "opencode-swarm-plugin/plugin" instead
|
|
230
|
+
* to avoid the plugin loader trying to call these classes as functions.
|
|
231
231
|
*/
|
|
232
232
|
export {
|
|
233
233
|
agentMailTools,
|
|
234
234
|
AgentMailError,
|
|
235
235
|
AgentMailNotInitializedError,
|
|
236
236
|
FileReservationConflictError,
|
|
237
|
+
createAgentMailError,
|
|
237
238
|
type AgentMailState,
|
|
238
239
|
} from "./agent-mail";
|
|
239
240
|
|
package/src/storage.ts
CHANGED
|
@@ -248,6 +248,9 @@ export class SemanticMemoryStorage implements LearningStorage {
|
|
|
248
248
|
const result = await execSemanticMemory(args);
|
|
249
249
|
|
|
250
250
|
if (result.exitCode !== 0) {
|
|
251
|
+
console.warn(
|
|
252
|
+
`[storage] semantic-memory find() failed with exit code ${result.exitCode}: ${result.stderr.toString().trim()}`,
|
|
253
|
+
);
|
|
251
254
|
return [];
|
|
252
255
|
}
|
|
253
256
|
|
|
@@ -268,7 +271,10 @@ export class SemanticMemoryStorage implements LearningStorage {
|
|
|
268
271
|
return content;
|
|
269
272
|
}
|
|
270
273
|
});
|
|
271
|
-
} catch {
|
|
274
|
+
} catch (error) {
|
|
275
|
+
console.warn(
|
|
276
|
+
`[storage] Failed to parse semantic-memory find() output: ${error instanceof Error ? error.message : String(error)}`,
|
|
277
|
+
);
|
|
272
278
|
return [];
|
|
273
279
|
}
|
|
274
280
|
}
|
|
@@ -282,6 +288,9 @@ export class SemanticMemoryStorage implements LearningStorage {
|
|
|
282
288
|
]);
|
|
283
289
|
|
|
284
290
|
if (result.exitCode !== 0) {
|
|
291
|
+
console.warn(
|
|
292
|
+
`[storage] semantic-memory list() failed with exit code ${result.exitCode}: ${result.stderr.toString().trim()}`,
|
|
293
|
+
);
|
|
285
294
|
return [];
|
|
286
295
|
}
|
|
287
296
|
|
|
@@ -300,7 +309,10 @@ export class SemanticMemoryStorage implements LearningStorage {
|
|
|
300
309
|
return content;
|
|
301
310
|
}
|
|
302
311
|
});
|
|
303
|
-
} catch {
|
|
312
|
+
} catch (error) {
|
|
313
|
+
console.warn(
|
|
314
|
+
`[storage] Failed to parse semantic-memory list() output: ${error instanceof Error ? error.message : String(error)}`,
|
|
315
|
+
);
|
|
304
316
|
return [];
|
|
305
317
|
}
|
|
306
318
|
}
|