@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.
- package/dist/ai-chat-provider.d.ts +12 -0
- package/dist/ai-chat-provider.d.ts.map +1 -1
- package/dist/ai-chat-provider.js +351 -335
- package/dist/ai-chat-provider.js.map +1 -1
- package/dist/bot/agent-loop.d.ts +20 -0
- package/dist/bot/agent-loop.d.ts.map +1 -0
- package/dist/bot/agent-loop.js +331 -0
- package/dist/bot/agent-loop.js.map +1 -0
- package/dist/bot/ai-router.d.ts +19 -0
- package/dist/bot/ai-router.d.ts.map +1 -0
- package/dist/bot/ai-router.js +104 -0
- package/dist/bot/ai-router.js.map +1 -0
- package/dist/bot/assistant-tools.d.ts.map +1 -1
- package/dist/bot/assistant-tools.js +49 -33
- package/dist/bot/assistant-tools.js.map +1 -1
- package/dist/bot/async-mutex.d.ts +13 -0
- package/dist/bot/async-mutex.d.ts.map +1 -0
- package/dist/bot/async-mutex.js +37 -0
- package/dist/bot/async-mutex.js.map +1 -0
- package/dist/bot/bot-manager.d.ts +2 -2
- package/dist/bot/bot-manager.d.ts.map +1 -1
- package/dist/bot/bot-manager.js +3 -3
- package/dist/bot/bot-manager.js.map +1 -1
- package/dist/bot/bot-registry.js +2 -2
- package/dist/bot/bot-registry.js.map +1 -1
- package/dist/bot/conversation-store.d.ts +1 -0
- package/dist/bot/conversation-store.d.ts.map +1 -1
- package/dist/bot/conversation-store.js.map +1 -1
- package/dist/bot/dashboard.d.ts.map +1 -1
- package/dist/bot/dashboard.js +17 -8
- package/dist/bot/dashboard.js.map +1 -1
- package/dist/bot/improve-loop.js.map +1 -1
- package/dist/bot/index.d.ts +2 -4
- package/dist/bot/index.d.ts.map +1 -1
- package/dist/bot/index.js +1 -2
- package/dist/bot/index.js.map +1 -1
- package/dist/bot/instance-manager.d.ts +31 -0
- package/dist/bot/instance-manager.d.ts.map +1 -0
- package/dist/bot/instance-manager.js +115 -0
- package/dist/bot/instance-manager.js.map +1 -0
- package/dist/bot/orchestrator.d.ts +36 -0
- package/dist/bot/orchestrator.d.ts.map +1 -0
- package/dist/bot/orchestrator.js +176 -0
- package/dist/bot/orchestrator.js.map +1 -0
- package/dist/bot/profile-store.d.ts +36 -0
- package/dist/bot/profile-store.d.ts.map +1 -0
- package/dist/bot/profile-store.js +208 -0
- package/dist/bot/profile-store.js.map +1 -0
- package/dist/bot/profile-types.d.ts +126 -0
- package/dist/bot/profile-types.d.ts.map +1 -0
- package/dist/bot/profile-types.js +7 -0
- package/dist/bot/profile-types.js.map +1 -0
- package/dist/bot/run-store.d.ts.map +1 -1
- package/dist/bot/run-store.js +8 -0
- package/dist/bot/run-store.js.map +1 -1
- package/dist/bot/runner.d.ts +4 -0
- package/dist/bot/runner.d.ts.map +1 -1
- package/dist/bot/runner.js +5 -1
- package/dist/bot/runner.js.map +1 -1
- package/dist/bot/swarm-controller.d.ts +109 -0
- package/dist/bot/swarm-controller.d.ts.map +1 -0
- package/dist/bot/swarm-controller.js +640 -0
- package/dist/bot/swarm-controller.js.map +1 -0
- package/dist/bot/swarm-event-log.d.ts +28 -0
- package/dist/bot/swarm-event-log.d.ts.map +1 -0
- package/dist/bot/swarm-event-log.js +54 -0
- package/dist/bot/swarm-event-log.js.map +1 -0
- package/dist/bot/task-prompt-builder.d.ts +22 -0
- package/dist/bot/task-prompt-builder.d.ts.map +1 -0
- package/dist/bot/task-prompt-builder.js +240 -0
- package/dist/bot/task-prompt-builder.js.map +1 -0
- package/dist/bot/task-store.d.ts +21 -0
- package/dist/bot/task-store.d.ts.map +1 -0
- package/dist/bot/task-store.js +364 -0
- package/dist/bot/task-store.js.map +1 -0
- package/dist/bot/task-types.d.ts +79 -0
- package/dist/bot/task-types.d.ts.map +1 -0
- package/dist/bot/task-types.js +6 -0
- package/dist/bot/task-types.js.map +1 -0
- package/dist/bot/types.d.ts +8 -0
- package/dist/bot/types.d.ts.map +1 -1
- package/dist/cli-handlers.d.ts.map +1 -1
- package/dist/cli-handlers.js +79 -54
- package/dist/cli-handlers.js.map +1 -1
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +749 -0
- package/dist/cli.js.map +1 -0
- package/dist/docs/docs/weaver-bot-usage.md +35 -18
- package/dist/docs/docs/weaver-config.md +20 -0
- package/dist/docs/docs/weaver-task-queue.md +31 -19
- package/dist/docs/weaver-config.md +15 -9
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-tools.d.ts +17 -0
- package/dist/mcp-tools.d.ts.map +1 -1
- package/dist/mcp-tools.js +98 -279
- package/dist/mcp-tools.js.map +1 -1
- package/dist/node-types/bot-report.d.ts.map +1 -1
- package/dist/node-types/bot-report.js +6 -24
- package/dist/node-types/bot-report.js.map +1 -1
- package/dist/node-types/orchestrator-dispatch.d.ts +17 -0
- package/dist/node-types/orchestrator-dispatch.d.ts.map +1 -0
- package/dist/node-types/orchestrator-dispatch.js +63 -0
- package/dist/node-types/orchestrator-dispatch.js.map +1 -0
- package/dist/node-types/orchestrator-load-state.d.ts +16 -0
- package/dist/node-types/orchestrator-load-state.d.ts.map +1 -0
- package/dist/node-types/orchestrator-load-state.js +60 -0
- package/dist/node-types/orchestrator-load-state.js.map +1 -0
- package/dist/node-types/orchestrator-route.d.ts +16 -0
- package/dist/node-types/orchestrator-route.d.ts.map +1 -0
- package/dist/node-types/orchestrator-route.js +28 -0
- package/dist/node-types/orchestrator-route.js.map +1 -0
- package/dist/node-types/receive-task.d.ts +2 -3
- package/dist/node-types/receive-task.d.ts.map +1 -1
- package/dist/node-types/receive-task.js +3 -48
- package/dist/node-types/receive-task.js.map +1 -1
- package/dist/templates/weaver-template.d.ts +11 -0
- package/dist/templates/weaver-template.d.ts.map +1 -0
- package/dist/templates/weaver-template.js +53 -0
- package/dist/templates/weaver-template.js.map +1 -0
- package/dist/ui/bot-activity.js +2 -2
- package/dist/ui/bot-constants.d.ts +14 -0
- package/dist/ui/bot-constants.d.ts.map +1 -0
- package/dist/ui/bot-constants.js +189 -0
- package/dist/ui/bot-constants.js.map +1 -0
- package/dist/ui/bot-panel.js +207 -245
- package/dist/ui/bot-slot-card.js +141 -0
- package/dist/ui/budget-bar.js +59 -0
- package/dist/ui/chat-task-result.js +178 -0
- package/dist/ui/decision-log.js +136 -0
- package/dist/ui/profile-card.js +158 -0
- package/dist/ui/profile-editor.js +597 -0
- package/dist/ui/swarm-controls.js +245 -0
- package/dist/ui/swarm-dashboard.js +3012 -0
- package/dist/ui/task-create-form.js +98 -0
- package/dist/ui/task-detail-view.js +1044 -0
- package/dist/ui/task-pool-list.js +156 -0
- package/dist/workflows/orchestrator.d.ts +21 -0
- package/dist/workflows/orchestrator.d.ts.map +1 -0
- package/dist/workflows/orchestrator.js +281 -0
- package/dist/workflows/orchestrator.js.map +1 -0
- package/dist/workflows/weaver-bot-session.d.ts +65 -0
- package/dist/workflows/weaver-bot-session.d.ts.map +1 -0
- package/dist/workflows/weaver-bot-session.js +68 -0
- package/dist/workflows/weaver-bot-session.js.map +1 -0
- package/dist/workflows/weaver.d.ts +24 -0
- package/dist/workflows/weaver.d.ts.map +1 -0
- package/dist/workflows/weaver.js +28 -0
- package/dist/workflows/weaver.js.map +1 -0
- package/flowweaver.manifest.json +547 -133
- package/package.json +1 -1
- package/src/ai-chat-provider.ts +378 -371
- package/src/bot/ai-router.ts +132 -0
- package/src/bot/assistant-tools.ts +47 -29
- package/src/bot/async-mutex.ts +37 -0
- package/src/bot/bot-manager.ts +3 -3
- package/src/bot/bot-registry.ts +2 -2
- package/src/bot/conversation-store.ts +2 -1
- package/src/bot/dashboard.ts +17 -8
- package/src/bot/improve-loop.ts +6 -6
- package/src/bot/index.ts +2 -4
- package/src/bot/instance-manager.ts +128 -0
- package/src/bot/orchestrator.ts +244 -0
- package/src/bot/profile-store.ts +225 -0
- package/src/bot/profile-types.ts +141 -0
- package/src/bot/run-store.ts +8 -0
- package/src/bot/runner.ts +9 -1
- package/src/bot/swarm-controller.ts +780 -0
- package/src/bot/swarm-event-log.ts +57 -0
- package/src/bot/task-prompt-builder.ts +309 -0
- package/src/bot/task-store.ts +407 -0
- package/src/bot/task-types.ts +100 -0
- package/src/bot/types.ts +8 -0
- package/src/cli-handlers.ts +78 -53
- package/src/docs/weaver-bot-usage.md +35 -18
- package/src/docs/weaver-config.md +20 -0
- package/src/docs/weaver-task-queue.md +31 -19
- package/src/index.ts +5 -4
- package/src/mcp-tools.ts +129 -372
- package/src/node-types/bot-report.ts +6 -24
- package/src/node-types/orchestrator-dispatch.ts +71 -0
- package/src/node-types/orchestrator-load-state.ts +66 -0
- package/src/node-types/orchestrator-route.ts +33 -0
- package/src/node-types/receive-task.ts +3 -57
- package/src/ui/bot-activity.tsx +2 -2
- package/src/ui/bot-constants.ts +192 -0
- package/src/ui/bot-panel.tsx +213 -247
- package/src/ui/bot-slot-card.tsx +139 -0
- package/src/ui/budget-bar.tsx +30 -0
- package/src/ui/chat-task-result.tsx +236 -0
- package/src/ui/decision-log.tsx +148 -0
- package/src/ui/profile-card.tsx +157 -0
- package/src/ui/profile-editor.tsx +384 -0
- package/src/ui/swarm-controls.tsx +260 -0
- package/src/ui/swarm-dashboard.tsx +647 -0
- package/src/ui/task-create-form.tsx +87 -0
- package/src/ui/task-detail-view.tsx +841 -0
- package/src/ui/task-pool-list.tsx +187 -0
- package/src/workflows/orchestrator.ts +302 -0
- package/dist/docs/weaver-bot-usage.md +0 -34
- package/dist/docs/weaver-genesis.md +0 -32
- package/dist/docs/weaver-task-queue.md +0 -34
- package/dist/ui/bot-workspace.js +0 -1015
- package/dist/ui/chat-bot-result.js +0 -71
- package/dist/ui/queue-input.js +0 -82
- package/dist/ui/session-bar.js +0 -174
- package/src/bot/error-guide.ts +0 -4
- package/src/bot/retry-utils.ts +0 -4
- package/src/bot/session-state.ts +0 -116
- package/src/bot/task-queue.ts +0 -262
- package/src/ui/bot-workspace.tsx +0 -442
- package/src/ui/chat-bot-result.tsx +0 -81
- package/src/ui/queue-input.tsx +0 -56
- package/src/ui/session-bar.tsx +0 -157
package/dist/cli-handlers.js
CHANGED
|
@@ -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 {
|
|
1293
|
-
const
|
|
1294
|
-
|
|
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 {
|
|
1347
|
+
const { TaskStore } = await import('./bot/task-store.js');
|
|
1342
1348
|
const { isTransientError, getErrorGuidance } = await import('./bot/error-classifier.js');
|
|
1343
|
-
const
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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 {
|
|
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
|
|
1451
|
-
let decomposedCount = 0;
|
|
1459
|
+
await taskStore.update(task.id, { status: 'done' });
|
|
1452
1460
|
for (const st of subtasks) {
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
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.
|
|
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.
|
|
1471
|
-
await
|
|
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 {
|
|
1682
|
-
const
|
|
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
|
|
1696
|
-
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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
|
-
|
|
1732
|
-
|
|
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
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
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
|
-
|
|
1744
|
-
|
|
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 {
|
|
1754
|
-
const
|
|
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
|
|
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 === '
|
|
1760
|
-
const completed = tasks.filter(t => t.status === '
|
|
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 {
|
|
2237
|
-
|
|
2238
|
-
const
|
|
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
|
|
2242
|
-
checks.push({ label: 'Queue', status: 'ok', detail: `${pending} pending, ${
|
|
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
|
|
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');
|