@synergenius/flow-weaver-pack-weaver 0.9.59 → 0.9.77

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 (217) hide show
  1. package/dist/ai-chat-provider.d.ts +12 -0
  2. package/dist/ai-chat-provider.d.ts.map +1 -1
  3. package/dist/ai-chat-provider.js +351 -335
  4. package/dist/ai-chat-provider.js.map +1 -1
  5. package/dist/bot/agent-loop.d.ts +20 -0
  6. package/dist/bot/agent-loop.d.ts.map +1 -0
  7. package/dist/bot/agent-loop.js +331 -0
  8. package/dist/bot/agent-loop.js.map +1 -0
  9. package/dist/bot/ai-router.d.ts +19 -0
  10. package/dist/bot/ai-router.d.ts.map +1 -0
  11. package/dist/bot/ai-router.js +104 -0
  12. package/dist/bot/ai-router.js.map +1 -0
  13. package/dist/bot/assistant-tools.d.ts.map +1 -1
  14. package/dist/bot/assistant-tools.js +49 -33
  15. package/dist/bot/assistant-tools.js.map +1 -1
  16. package/dist/bot/async-mutex.d.ts +13 -0
  17. package/dist/bot/async-mutex.d.ts.map +1 -0
  18. package/dist/bot/async-mutex.js +37 -0
  19. package/dist/bot/async-mutex.js.map +1 -0
  20. package/dist/bot/bot-manager.d.ts +2 -2
  21. package/dist/bot/bot-manager.d.ts.map +1 -1
  22. package/dist/bot/bot-manager.js +3 -3
  23. package/dist/bot/bot-manager.js.map +1 -1
  24. package/dist/bot/bot-registry.js +2 -2
  25. package/dist/bot/bot-registry.js.map +1 -1
  26. package/dist/bot/conversation-store.d.ts +1 -0
  27. package/dist/bot/conversation-store.d.ts.map +1 -1
  28. package/dist/bot/conversation-store.js.map +1 -1
  29. package/dist/bot/dashboard.d.ts.map +1 -1
  30. package/dist/bot/dashboard.js +17 -8
  31. package/dist/bot/dashboard.js.map +1 -1
  32. package/dist/bot/improve-loop.js.map +1 -1
  33. package/dist/bot/index.d.ts +2 -4
  34. package/dist/bot/index.d.ts.map +1 -1
  35. package/dist/bot/index.js +1 -2
  36. package/dist/bot/index.js.map +1 -1
  37. package/dist/bot/instance-manager.d.ts +31 -0
  38. package/dist/bot/instance-manager.d.ts.map +1 -0
  39. package/dist/bot/instance-manager.js +115 -0
  40. package/dist/bot/instance-manager.js.map +1 -0
  41. package/dist/bot/orchestrator.d.ts +36 -0
  42. package/dist/bot/orchestrator.d.ts.map +1 -0
  43. package/dist/bot/orchestrator.js +176 -0
  44. package/dist/bot/orchestrator.js.map +1 -0
  45. package/dist/bot/profile-store.d.ts +36 -0
  46. package/dist/bot/profile-store.d.ts.map +1 -0
  47. package/dist/bot/profile-store.js +208 -0
  48. package/dist/bot/profile-store.js.map +1 -0
  49. package/dist/bot/profile-types.d.ts +126 -0
  50. package/dist/bot/profile-types.d.ts.map +1 -0
  51. package/dist/bot/profile-types.js +7 -0
  52. package/dist/bot/profile-types.js.map +1 -0
  53. package/dist/bot/run-store.d.ts.map +1 -1
  54. package/dist/bot/run-store.js +8 -0
  55. package/dist/bot/run-store.js.map +1 -1
  56. package/dist/bot/runner.d.ts +4 -0
  57. package/dist/bot/runner.d.ts.map +1 -1
  58. package/dist/bot/runner.js +5 -1
  59. package/dist/bot/runner.js.map +1 -1
  60. package/dist/bot/swarm-controller.d.ts +109 -0
  61. package/dist/bot/swarm-controller.d.ts.map +1 -0
  62. package/dist/bot/swarm-controller.js +640 -0
  63. package/dist/bot/swarm-controller.js.map +1 -0
  64. package/dist/bot/swarm-event-log.d.ts +28 -0
  65. package/dist/bot/swarm-event-log.d.ts.map +1 -0
  66. package/dist/bot/swarm-event-log.js +54 -0
  67. package/dist/bot/swarm-event-log.js.map +1 -0
  68. package/dist/bot/task-prompt-builder.d.ts +22 -0
  69. package/dist/bot/task-prompt-builder.d.ts.map +1 -0
  70. package/dist/bot/task-prompt-builder.js +240 -0
  71. package/dist/bot/task-prompt-builder.js.map +1 -0
  72. package/dist/bot/task-store.d.ts +21 -0
  73. package/dist/bot/task-store.d.ts.map +1 -0
  74. package/dist/bot/task-store.js +364 -0
  75. package/dist/bot/task-store.js.map +1 -0
  76. package/dist/bot/task-types.d.ts +79 -0
  77. package/dist/bot/task-types.d.ts.map +1 -0
  78. package/dist/bot/task-types.js +6 -0
  79. package/dist/bot/task-types.js.map +1 -0
  80. package/dist/bot/types.d.ts +8 -0
  81. package/dist/bot/types.d.ts.map +1 -1
  82. package/dist/cli-handlers.d.ts.map +1 -1
  83. package/dist/cli-handlers.js +79 -54
  84. package/dist/cli-handlers.js.map +1 -1
  85. package/dist/cli.d.ts +3 -0
  86. package/dist/cli.d.ts.map +1 -0
  87. package/dist/cli.js +749 -0
  88. package/dist/cli.js.map +1 -0
  89. package/dist/docs/docs/weaver-bot-usage.md +35 -18
  90. package/dist/docs/docs/weaver-config.md +20 -0
  91. package/dist/docs/docs/weaver-task-queue.md +31 -19
  92. package/dist/docs/weaver-config.md +15 -9
  93. package/dist/index.d.ts +2 -2
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +1 -1
  96. package/dist/index.js.map +1 -1
  97. package/dist/mcp-tools.d.ts +17 -0
  98. package/dist/mcp-tools.d.ts.map +1 -1
  99. package/dist/mcp-tools.js +98 -279
  100. package/dist/mcp-tools.js.map +1 -1
  101. package/dist/node-types/bot-report.d.ts.map +1 -1
  102. package/dist/node-types/bot-report.js +6 -24
  103. package/dist/node-types/bot-report.js.map +1 -1
  104. package/dist/node-types/orchestrator-dispatch.d.ts +17 -0
  105. package/dist/node-types/orchestrator-dispatch.d.ts.map +1 -0
  106. package/dist/node-types/orchestrator-dispatch.js +63 -0
  107. package/dist/node-types/orchestrator-dispatch.js.map +1 -0
  108. package/dist/node-types/orchestrator-load-state.d.ts +16 -0
  109. package/dist/node-types/orchestrator-load-state.d.ts.map +1 -0
  110. package/dist/node-types/orchestrator-load-state.js +60 -0
  111. package/dist/node-types/orchestrator-load-state.js.map +1 -0
  112. package/dist/node-types/orchestrator-route.d.ts +16 -0
  113. package/dist/node-types/orchestrator-route.d.ts.map +1 -0
  114. package/dist/node-types/orchestrator-route.js +28 -0
  115. package/dist/node-types/orchestrator-route.js.map +1 -0
  116. package/dist/node-types/receive-task.d.ts +2 -3
  117. package/dist/node-types/receive-task.d.ts.map +1 -1
  118. package/dist/node-types/receive-task.js +3 -48
  119. package/dist/node-types/receive-task.js.map +1 -1
  120. package/dist/templates/weaver-template.d.ts +11 -0
  121. package/dist/templates/weaver-template.d.ts.map +1 -0
  122. package/dist/templates/weaver-template.js +53 -0
  123. package/dist/templates/weaver-template.js.map +1 -0
  124. package/dist/ui/bot-activity.js +2 -2
  125. package/dist/ui/bot-constants.d.ts +14 -0
  126. package/dist/ui/bot-constants.d.ts.map +1 -0
  127. package/dist/ui/bot-constants.js +189 -0
  128. package/dist/ui/bot-constants.js.map +1 -0
  129. package/dist/ui/bot-panel.js +207 -245
  130. package/dist/ui/bot-slot-card.js +141 -0
  131. package/dist/ui/budget-bar.js +59 -0
  132. package/dist/ui/chat-task-result.js +178 -0
  133. package/dist/ui/decision-log.js +136 -0
  134. package/dist/ui/profile-card.js +158 -0
  135. package/dist/ui/profile-editor.js +597 -0
  136. package/dist/ui/swarm-controls.js +245 -0
  137. package/dist/ui/swarm-dashboard.js +3012 -0
  138. package/dist/ui/task-create-form.js +98 -0
  139. package/dist/ui/task-detail-view.js +1044 -0
  140. package/dist/ui/task-pool-list.js +156 -0
  141. package/dist/workflows/orchestrator.d.ts +21 -0
  142. package/dist/workflows/orchestrator.d.ts.map +1 -0
  143. package/dist/workflows/orchestrator.js +281 -0
  144. package/dist/workflows/orchestrator.js.map +1 -0
  145. package/dist/workflows/weaver-bot-session.d.ts +65 -0
  146. package/dist/workflows/weaver-bot-session.d.ts.map +1 -0
  147. package/dist/workflows/weaver-bot-session.js +68 -0
  148. package/dist/workflows/weaver-bot-session.js.map +1 -0
  149. package/dist/workflows/weaver.d.ts +24 -0
  150. package/dist/workflows/weaver.d.ts.map +1 -0
  151. package/dist/workflows/weaver.js +28 -0
  152. package/dist/workflows/weaver.js.map +1 -0
  153. package/flowweaver.manifest.json +547 -133
  154. package/package.json +1 -1
  155. package/src/ai-chat-provider.ts +378 -371
  156. package/src/bot/ai-router.ts +132 -0
  157. package/src/bot/assistant-tools.ts +47 -29
  158. package/src/bot/async-mutex.ts +37 -0
  159. package/src/bot/bot-manager.ts +3 -3
  160. package/src/bot/bot-registry.ts +2 -2
  161. package/src/bot/conversation-store.ts +2 -1
  162. package/src/bot/dashboard.ts +17 -8
  163. package/src/bot/improve-loop.ts +6 -6
  164. package/src/bot/index.ts +2 -4
  165. package/src/bot/instance-manager.ts +128 -0
  166. package/src/bot/orchestrator.ts +244 -0
  167. package/src/bot/profile-store.ts +225 -0
  168. package/src/bot/profile-types.ts +141 -0
  169. package/src/bot/run-store.ts +8 -0
  170. package/src/bot/runner.ts +9 -1
  171. package/src/bot/swarm-controller.ts +780 -0
  172. package/src/bot/swarm-event-log.ts +57 -0
  173. package/src/bot/task-prompt-builder.ts +309 -0
  174. package/src/bot/task-store.ts +407 -0
  175. package/src/bot/task-types.ts +100 -0
  176. package/src/bot/types.ts +8 -0
  177. package/src/cli-handlers.ts +78 -53
  178. package/src/docs/weaver-bot-usage.md +35 -18
  179. package/src/docs/weaver-config.md +20 -0
  180. package/src/docs/weaver-task-queue.md +31 -19
  181. package/src/index.ts +5 -4
  182. package/src/mcp-tools.ts +129 -372
  183. package/src/node-types/bot-report.ts +6 -24
  184. package/src/node-types/orchestrator-dispatch.ts +71 -0
  185. package/src/node-types/orchestrator-load-state.ts +66 -0
  186. package/src/node-types/orchestrator-route.ts +33 -0
  187. package/src/node-types/receive-task.ts +3 -57
  188. package/src/ui/bot-activity.tsx +2 -2
  189. package/src/ui/bot-constants.ts +192 -0
  190. package/src/ui/bot-panel.tsx +213 -247
  191. package/src/ui/bot-slot-card.tsx +139 -0
  192. package/src/ui/budget-bar.tsx +30 -0
  193. package/src/ui/chat-task-result.tsx +236 -0
  194. package/src/ui/decision-log.tsx +148 -0
  195. package/src/ui/profile-card.tsx +157 -0
  196. package/src/ui/profile-editor.tsx +384 -0
  197. package/src/ui/swarm-controls.tsx +260 -0
  198. package/src/ui/swarm-dashboard.tsx +647 -0
  199. package/src/ui/task-create-form.tsx +87 -0
  200. package/src/ui/task-detail-view.tsx +841 -0
  201. package/src/ui/task-pool-list.tsx +187 -0
  202. package/src/workflows/orchestrator.ts +302 -0
  203. package/dist/docs/weaver-bot-usage.md +0 -34
  204. package/dist/docs/weaver-genesis.md +0 -32
  205. package/dist/docs/weaver-task-queue.md +0 -34
  206. package/dist/ui/bot-workspace.js +0 -1015
  207. package/dist/ui/chat-bot-result.js +0 -71
  208. package/dist/ui/queue-input.js +0 -82
  209. package/dist/ui/session-bar.js +0 -174
  210. package/src/bot/error-guide.ts +0 -4
  211. package/src/bot/retry-utils.ts +0 -4
  212. package/src/bot/session-state.ts +0 -116
  213. package/src/bot/task-queue.ts +0 -262
  214. package/src/ui/bot-workspace.tsx +0 -442
  215. package/src/ui/chat-bot-result.tsx +0 -81
  216. package/src/ui/queue-input.tsx +0 -56
  217. package/src/ui/session-bar.tsx +0 -157
@@ -1289,9 +1289,15 @@ export async function handleSession(opts) {
1289
1289
  const parallelism = opts.sessionParallel ?? 1;
1290
1290
  // Crash recovery
1291
1291
  if (continuous) {
1292
- const { TaskQueue } = await import('./bot/task-queue.js');
1293
- const recoveryQueue = new TaskQueue();
1294
- const recovered = await recoveryQueue.recoverOrphans();
1292
+ const { TaskStore } = await import('./bot/task-store.js');
1293
+ const recoveryStore = new TaskStore(projectDir);
1294
+ // Recover orphaned in-progress tasks back to pending
1295
+ const inProgressTasks = await recoveryStore.list({ status: 'in-progress' });
1296
+ let recovered = 0;
1297
+ for (const t of inProgressTasks) {
1298
+ await recoveryStore.update(t.id, { status: 'pending' });
1299
+ recovered++;
1300
+ }
1295
1301
  if (recovered > 0)
1296
1302
  renderer.info(`Recovered ${recovered} orphaned task(s)`);
1297
1303
  }
@@ -1338,9 +1344,9 @@ export async function handleSession(opts) {
1338
1344
  return;
1339
1345
  }
1340
1346
  // Continuous mode: loop until deadline/maxTasks/interrupt
1341
- const { TaskQueue } = await import('./bot/task-queue.js');
1347
+ const { TaskStore } = await import('./bot/task-store.js');
1342
1348
  const { isTransientError, getErrorGuidance } = await import('./bot/error-classifier.js');
1343
- const queue = new TaskQueue();
1349
+ const taskStore = new TaskStore(projectDir);
1344
1350
  let taskCount = 0;
1345
1351
  let interrupted = false;
1346
1352
  let consecutiveErrors = 0;
@@ -1356,9 +1362,10 @@ export async function handleSession(opts) {
1356
1362
  const running = new Map();
1357
1363
  const filesInUse = new Set();
1358
1364
  const processTask = async (task) => {
1365
+ const taskPayload = { id: task.id, instruction: task.title, description: task.description, targets: task.context.files };
1359
1366
  try {
1360
1367
  const result = await runWorkflow(workflowPath, {
1361
- params: { projectDir, taskJson: JSON.stringify(task) },
1368
+ params: { projectDir, taskJson: JSON.stringify(taskPayload) },
1362
1369
  verbose: opts.verbose,
1363
1370
  dryRun: opts.dryRun,
1364
1371
  config,
@@ -1371,19 +1378,19 @@ export async function handleSession(opts) {
1371
1378
  result.summary.includes('nothing to') ||
1372
1379
  result.outcome === 'no-op');
1373
1380
  if (isNoOp) {
1374
- await queue.markNoOp(task.id);
1381
+ await taskStore.update(task.id, { status: 'done' });
1375
1382
  sessionNoOp++;
1376
1383
  consecutiveNoOps++;
1377
1384
  consecutiveErrors = 0;
1378
1385
  }
1379
1386
  else if (result.success) {
1380
- await queue.markComplete(task.id);
1387
+ await taskStore.update(task.id, { status: 'done' });
1381
1388
  sessionCompleted++;
1382
1389
  consecutiveErrors = 0;
1383
1390
  consecutiveNoOps = 0;
1384
1391
  }
1385
1392
  else {
1386
- await queue.markFailed(task.id, result.summary || result.outcome || 'unknown error');
1393
+ await taskStore.update(task.id, { status: 'failed' });
1387
1394
  sessionFailed++;
1388
1395
  consecutiveErrors++;
1389
1396
  consecutiveNoOps = 0;
@@ -1399,14 +1406,14 @@ export async function handleSession(opts) {
1399
1406
  const msg = err instanceof Error ? err.message : String(err);
1400
1407
  const guidance = getErrorGuidance(msg);
1401
1408
  renderer.error(`Task ${task.id.slice(0, 8)} error`, guidance ? `${msg}\n Hint: ${guidance}` : msg);
1402
- await queue.markFailed(task.id, msg);
1409
+ await taskStore.update(task.id, { status: 'failed' });
1403
1410
  sessionFailed++;
1404
1411
  if (!isTransientError(err)) {
1405
1412
  consecutiveErrors++;
1406
1413
  }
1407
1414
  }
1408
1415
  finally {
1409
- for (const f of task.targets ?? [])
1416
+ for (const f of task.context.files)
1410
1417
  filesInUse.delete(f);
1411
1418
  running.delete(task.id);
1412
1419
  }
@@ -1431,7 +1438,8 @@ export async function handleSession(opts) {
1431
1438
  await Promise.race(running.values());
1432
1439
  continue;
1433
1440
  }
1434
- const task = await queue.next();
1441
+ const pendingTasks = await taskStore.list({ status: 'pending', limit: 1 });
1442
+ const task = pendingTasks[0] ?? null;
1435
1443
  if (!task) {
1436
1444
  if (running.size > 0) {
1437
1445
  // Tasks still running — wait for one to finish
@@ -1444,22 +1452,25 @@ export async function handleSession(opts) {
1444
1452
  }
1445
1453
  // Auto-decompose broad tasks into per-file tasks
1446
1454
  const { decomposeTask } = await import('./bot/task-decomposer.js');
1447
- const { decomposed, tasks: subtasks } = decomposeTask(task, projectDir);
1455
+ const decomposable = { id: task.id, instruction: task.title, targets: task.context.files, priority: task.priority };
1456
+ const { decomposed, tasks: subtasks } = decomposeTask(decomposable, projectDir);
1448
1457
  if (decomposed && subtasks.length > 1) {
1449
1458
  // Replace the broad task with per-file tasks
1450
- await queue.markComplete(task.id);
1451
- let decomposedCount = 0;
1459
+ await taskStore.update(task.id, { status: 'done' });
1452
1460
  for (const st of subtasks) {
1453
- const { duplicate } = await queue.add({ instruction: st.instruction, mode: st.mode, targets: st.targets, priority: st.priority ?? 0 });
1454
- if (!duplicate)
1455
- decomposedCount++;
1461
+ await taskStore.create({
1462
+ title: st.instruction,
1463
+ description: st.instruction,
1464
+ priority: st.priority ?? 0,
1465
+ createdBy: 'ai',
1466
+ });
1456
1467
  }
1457
1468
  renderer.info(`Decomposed into ${subtasks.length} per-file tasks`);
1458
1469
  continue;
1459
1470
  }
1460
1471
  // File conflict check: if task targets overlap with files in use, wait
1461
- const taskTargets = task.targets ?? [];
1462
- const hasConflict = taskTargets.some(f => filesInUse.has(f));
1472
+ const taskTargets = task.context.files;
1473
+ const hasConflict = taskTargets.some((f) => filesInUse.has(f));
1463
1474
  if (hasConflict && running.size > 0) {
1464
1475
  await Promise.race(running.values());
1465
1476
  continue;
@@ -1467,8 +1478,8 @@ export async function handleSession(opts) {
1467
1478
  taskCount++;
1468
1479
  if (opts.verbose)
1469
1480
  process.env.WEAVER_VERBOSE = '1';
1470
- renderer.taskStart(taskCount, task.instruction ?? task.id);
1471
- await queue.markRunning(task.id);
1481
+ renderer.taskStart(taskCount, task.title ?? task.id);
1482
+ await taskStore.update(task.id, { status: 'in-progress' });
1472
1483
  // Reserve files
1473
1484
  for (const f of taskTargets)
1474
1485
  filesInUse.add(f);
@@ -1678,8 +1689,9 @@ export async function handleSteer(opts) {
1678
1689
  console.log(`[weaver] Steering command sent: ${subcommand}${opts.botFile ? ' "' + opts.botFile + '"' : ''}`);
1679
1690
  }
1680
1691
  export async function handleQueue(opts) {
1681
- const { TaskQueue } = await import('./bot/task-queue.js');
1682
- const queue = new TaskQueue();
1692
+ const { TaskStore } = await import('./bot/task-store.js');
1693
+ const projectDir = process.env.WEAVER_PROJECT_DIR ?? process.cwd();
1694
+ const store = new TaskStore(projectDir);
1683
1695
  const action = opts.botTask;
1684
1696
  if (!action || !['add', 'list', 'clear', 'remove', 'retry'].includes(action)) {
1685
1697
  console.error('[weaver] Usage: flow-weaver weaver queue <add|list|clear|remove|retry> [task|id]');
@@ -1692,17 +1704,12 @@ export async function handleQueue(opts) {
1692
1704
  console.error('[weaver] Usage: flow-weaver weaver queue add "task instruction"');
1693
1705
  process.exit(1);
1694
1706
  }
1695
- const { id, duplicate } = await queue.add({ instruction, priority: 0 });
1696
- if (duplicate) {
1697
- console.log(`[weaver] Task already queued (${id}).`);
1698
- }
1699
- else {
1700
- console.log(`[weaver] Task added: ${id}`);
1701
- }
1707
+ const task = await store.create({ title: instruction, description: instruction, priority: 0, createdBy: 'user' });
1708
+ console.log(`[weaver] Task added: ${task.id}`);
1702
1709
  break;
1703
1710
  }
1704
1711
  case 'list': {
1705
- const tasks = await queue.list();
1712
+ const tasks = await store.list();
1706
1713
  if (opts.historyJson) {
1707
1714
  console.log(JSON.stringify(tasks, null, 2));
1708
1715
  }
@@ -1710,15 +1717,20 @@ export async function handleQueue(opts) {
1710
1717
  console.log('No tasks in queue.');
1711
1718
  }
1712
1719
  else {
1713
- console.log('ID'.padEnd(10) + 'STATUS'.padEnd(12) + 'PRIORITY'.padEnd(10) + 'INSTRUCTION');
1720
+ console.log('ID'.padEnd(10) + 'STATUS'.padEnd(14) + 'PRIORITY'.padEnd(10) + 'TITLE');
1714
1721
  for (const t of tasks) {
1715
- console.log(t.id.padEnd(10) + t.status.padEnd(12) + String(t.priority).padEnd(10) + t.instruction.slice(0, 60));
1722
+ console.log(t.id.padEnd(10) + t.status.padEnd(14) + String(t.priority).padEnd(10) + t.title.slice(0, 60));
1716
1723
  }
1717
1724
  }
1718
1725
  break;
1719
1726
  }
1720
1727
  case 'clear': {
1721
- const count = await queue.clear();
1728
+ const tasks = await store.list();
1729
+ let count = 0;
1730
+ for (const t of tasks) {
1731
+ await store.update(t.id, { status: 'cancelled' });
1732
+ count++;
1733
+ }
1722
1734
  console.log(`Cleared ${count} task(s).`);
1723
1735
  break;
1724
1736
  }
@@ -1728,20 +1740,33 @@ export async function handleQueue(opts) {
1728
1740
  console.error('[weaver] Usage: flow-weaver weaver queue remove <id>');
1729
1741
  process.exit(1);
1730
1742
  }
1731
- const removed = await queue.remove(id);
1732
- console.log(removed ? `Removed task ${id}.` : `No task found with id "${id}".`);
1743
+ try {
1744
+ await store.update(id, { status: 'cancelled' });
1745
+ console.log(`Cancelled task ${id}.`);
1746
+ }
1747
+ catch {
1748
+ console.log(`No task found with id "${id}".`);
1749
+ }
1733
1750
  break;
1734
1751
  }
1735
1752
  case 'retry': {
1736
1753
  const id = opts.botFile;
1737
1754
  if (id) {
1738
- // Retry a specific task
1739
- const retried = await queue.retry(id);
1740
- console.log(retried ? `Task ${id} reset to pending.` : `No failed/running task found with id "${id}".`);
1755
+ try {
1756
+ await store.update(id, { status: 'pending' });
1757
+ console.log(`Task ${id} reset to pending.`);
1758
+ }
1759
+ catch {
1760
+ console.log(`No task found with id "${id}".`);
1761
+ }
1741
1762
  }
1742
1763
  else {
1743
- // Retry all failed tasks
1744
- const count = await queue.retryAll();
1764
+ const failed = await store.list({ status: 'failed' });
1765
+ let count = 0;
1766
+ for (const t of failed) {
1767
+ await store.update(t.id, { status: 'pending' });
1768
+ count++;
1769
+ }
1745
1770
  console.log(`Reset ${count} failed task(s) to pending.`);
1746
1771
  }
1747
1772
  break;
@@ -1750,14 +1775,15 @@ export async function handleQueue(opts) {
1750
1775
  }
1751
1776
  export async function handleStatus(opts) {
1752
1777
  const store = new RunStore();
1753
- const { TaskQueue } = await import('./bot/task-queue.js');
1754
- const queue = new TaskQueue();
1778
+ const { TaskStore } = await import('./bot/task-store.js');
1779
+ const projectDir = process.env.WEAVER_PROJECT_DIR ?? process.cwd();
1780
+ const taskStore = new TaskStore(projectDir);
1755
1781
  const orphans = store.checkOrphans();
1756
1782
  const recentRuns = store.list({ limit: 5 });
1757
- const tasks = await queue.list();
1783
+ const tasks = await taskStore.list();
1758
1784
  const pending = tasks.filter(t => t.status === 'pending').length;
1759
- const running = tasks.filter(t => t.status === 'running').length;
1760
- const completed = tasks.filter(t => t.status === 'completed').length;
1785
+ const running = tasks.filter(t => t.status === 'in-progress').length;
1786
+ const completed = tasks.filter(t => t.status === 'done').length;
1761
1787
  const failed = tasks.filter(t => t.status === 'failed').length;
1762
1788
  if (opts.historyJson) {
1763
1789
  console.log(JSON.stringify({
@@ -2233,16 +2259,15 @@ export async function handleDoctor(opts) {
2233
2259
  }
2234
2260
  // Queue status
2235
2261
  try {
2236
- const { TaskQueue } = await import('./bot/task-queue.js');
2237
- process.env.WEAVER_PROJECT_DIR = dir;
2238
- const queue = new TaskQueue();
2239
- const tasks = await queue.list();
2262
+ const { TaskStore } = await import('./bot/task-store.js');
2263
+ const taskStore = new TaskStore(dir);
2264
+ const tasks = await taskStore.list();
2240
2265
  const pending = tasks.filter(t => t.status === 'pending').length;
2241
- const running = tasks.filter(t => t.status === 'running').length;
2242
- checks.push({ label: 'Queue', status: 'ok', detail: `${pending} pending, ${running} running` });
2266
+ const inProgress = tasks.filter(t => t.status === 'in-progress').length;
2267
+ checks.push({ label: 'Queue', status: 'ok', detail: `${pending} pending, ${inProgress} in-progress` });
2243
2268
  }
2244
2269
  catch {
2245
- checks.push({ label: 'Queue', status: 'ok', detail: 'Empty (no queue file)' });
2270
+ checks.push({ label: 'Queue', status: 'ok', detail: 'Empty (no tasks file)' });
2246
2271
  }
2247
2272
  // Plan file
2248
2273
  const planPath = path.join(dir, '.weaver-plan.md');