@probelabs/visor 0.1.171-ee → 0.1.172-ee

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 (42) hide show
  1. package/dist/agent-protocol/task-store.d.ts +8 -0
  2. package/dist/agent-protocol/task-store.d.ts.map +1 -1
  3. package/dist/agent-protocol/tasks-cli-handler.d.ts.map +1 -1
  4. package/dist/cli-main.d.ts.map +1 -1
  5. package/dist/index.js +194 -77
  6. package/dist/sdk/{a2a-frontend-GUEGI5SX.mjs → a2a-frontend-N4VU3PHW.mjs} +36 -1
  7. package/dist/sdk/a2a-frontend-N4VU3PHW.mjs.map +1 -0
  8. package/dist/sdk/{check-provider-registry-ZUU7KSKR.mjs → check-provider-registry-4KW2YPZW.mjs} +3 -3
  9. package/dist/sdk/{check-provider-registry-7P2QIKJR.mjs → check-provider-registry-H5GQGT2X.mjs} +3 -3
  10. package/dist/sdk/{chunk-CXA3WUOB.mjs → chunk-CNZ7XHLN.mjs} +9 -9
  11. package/dist/sdk/{chunk-YCPJBOJB.mjs → chunk-ONN7TBQM.mjs} +9 -9
  12. package/dist/sdk/{chunk-AVMMKGLQ.mjs → chunk-PDQTEBOJ.mjs} +18 -18
  13. package/dist/sdk/chunk-PDQTEBOJ.mjs.map +1 -0
  14. package/dist/sdk/{host-A7UNRBQU.mjs → host-DOJQVREK.mjs} +3 -3
  15. package/dist/sdk/{host-ECXTIDWG.mjs → host-YATAT2B4.mjs} +3 -3
  16. package/dist/sdk/{schedule-tool-DGVJDHJM.mjs → schedule-tool-HCJUIF4H.mjs} +3 -3
  17. package/dist/sdk/{schedule-tool-I6VG3ZVA.mjs → schedule-tool-KUGCECKZ.mjs} +3 -3
  18. package/dist/sdk/{schedule-tool-handler-DFUC5S55.mjs → schedule-tool-handler-DCMMLWLB.mjs} +3 -3
  19. package/dist/sdk/{schedule-tool-handler-XLCSBU3E.mjs → schedule-tool-handler-IZU43FC2.mjs} +3 -3
  20. package/dist/sdk/sdk.js +52 -17
  21. package/dist/sdk/sdk.js.map +1 -1
  22. package/dist/sdk/sdk.mjs +2 -2
  23. package/dist/sdk/{slack-frontend-QO7LW5BH.mjs → slack-frontend-7T5UISCX.mjs} +2 -2
  24. package/dist/sdk/{workflow-check-provider-AKXDIL2Y.mjs → workflow-check-provider-LO2X6XOJ.mjs} +3 -3
  25. package/dist/sdk/{workflow-check-provider-KQNLEQEY.mjs → workflow-check-provider-O2SIH3PC.mjs} +3 -3
  26. package/dist/slack/markdown.d.ts.map +1 -1
  27. package/package.json +1 -1
  28. package/dist/sdk/a2a-frontend-GUEGI5SX.mjs.map +0 -1
  29. package/dist/sdk/chunk-AVMMKGLQ.mjs.map +0 -1
  30. /package/dist/sdk/{check-provider-registry-7P2QIKJR.mjs.map → check-provider-registry-4KW2YPZW.mjs.map} +0 -0
  31. /package/dist/sdk/{check-provider-registry-ZUU7KSKR.mjs.map → check-provider-registry-H5GQGT2X.mjs.map} +0 -0
  32. /package/dist/sdk/{chunk-CXA3WUOB.mjs.map → chunk-CNZ7XHLN.mjs.map} +0 -0
  33. /package/dist/sdk/{chunk-YCPJBOJB.mjs.map → chunk-ONN7TBQM.mjs.map} +0 -0
  34. /package/dist/sdk/{host-A7UNRBQU.mjs.map → host-DOJQVREK.mjs.map} +0 -0
  35. /package/dist/sdk/{host-ECXTIDWG.mjs.map → host-YATAT2B4.mjs.map} +0 -0
  36. /package/dist/sdk/{schedule-tool-DGVJDHJM.mjs.map → schedule-tool-HCJUIF4H.mjs.map} +0 -0
  37. /package/dist/sdk/{schedule-tool-I6VG3ZVA.mjs.map → schedule-tool-KUGCECKZ.mjs.map} +0 -0
  38. /package/dist/sdk/{schedule-tool-handler-DFUC5S55.mjs.map → schedule-tool-handler-DCMMLWLB.mjs.map} +0 -0
  39. /package/dist/sdk/{schedule-tool-handler-XLCSBU3E.mjs.map → schedule-tool-handler-IZU43FC2.mjs.map} +0 -0
  40. /package/dist/sdk/{slack-frontend-QO7LW5BH.mjs.map → slack-frontend-7T5UISCX.mjs.map} +0 -0
  41. /package/dist/sdk/{workflow-check-provider-AKXDIL2Y.mjs.map → workflow-check-provider-LO2X6XOJ.mjs.map} +0 -0
  42. /package/dist/sdk/{workflow-check-provider-KQNLEQEY.mjs.map → workflow-check-provider-O2SIH3PC.mjs.map} +0 -0
@@ -17,6 +17,8 @@ export interface ListTasksFilter {
17
17
  contextId?: string;
18
18
  state?: TaskState[];
19
19
  workflowId?: string;
20
+ search?: string;
21
+ claimedBy?: string;
20
22
  limit?: number;
21
23
  offset?: number;
22
24
  }
@@ -58,6 +60,10 @@ export interface TaskStore {
58
60
  rows: TaskQueueRow[];
59
61
  total: number;
60
62
  };
63
+ /** Mark all 'working' tasks as 'failed' (crash recovery on startup). */
64
+ failStaleTasks(reason?: string): number;
65
+ /** Delete completed/failed/canceled tasks older than the given age. */
66
+ purgeOldTasks(olderThanMs: number): number;
61
67
  deleteExpiredTasks(): string[];
62
68
  deleteTask(taskId: string): void;
63
69
  }
@@ -87,6 +93,8 @@ export declare class SqliteTaskStore implements TaskStore {
87
93
  claimNextSubmitted(workerId: string): AgentTask | null;
88
94
  reclaimStaleTasks(_workerId: string, staleTimeoutMs?: number): AgentTask[];
89
95
  releaseClaim(taskId: string): void;
96
+ failStaleTasks(reason?: string): number;
97
+ purgeOldTasks(olderThanMs: number): number;
90
98
  deleteExpiredTasks(): string[];
91
99
  deleteTask(taskId: string): void;
92
100
  private resolveContextId;
@@ -1 +1 @@
1
- {"version":3,"file":"task-store.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/agent-protocol/task-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task-store.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/agent-protocol/task-store.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tasks-cli-handler.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/agent-protocol/tasks-cli-handler.ts"],"names":[],"mappings":"AA6aA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCtE"}
1
+ {"version":3,"file":"tasks-cli-handler.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/agent-protocol/tasks-cli-handler.ts"],"names":[],"mappings":"AA+gBA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CtE"}
@@ -1 +1 @@
1
- {"version":3,"file":"","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/cli-main.ts"],"names":[],"mappings":"AA6zBA;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAulD1C"}
1
+ {"version":3,"file":"","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/cli-main.ts"],"names":[],"mappings":"AA6zBA;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA4lD1C"}
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- process.env.VISOR_VERSION = '0.1.171';
2
+ process.env.VISOR_VERSION = '0.1.172';
3
3
  process.env.PROBE_VERSION = '0.6.0-rc290';
4
- process.env.VISOR_COMMIT_SHA = '12d9273ce614376592cf397b6c874dcbfa220b8b';
5
- process.env.VISOR_COMMIT_SHORT = '12d9273';
4
+ process.env.VISOR_COMMIT_SHA = 'eb6383c71ff3acd3d32816d705c29ca297eadddd';
5
+ process.env.VISOR_COMMIT_SHORT = 'eb6383c';
6
6
  /******/ (() => { // webpackBootstrap
7
7
  /******/ var __webpack_modules__ = ({
8
8
 
@@ -168069,6 +168069,16 @@ class SqliteTaskStore {
168069
168069
  conditions.push('workflow_id = ?');
168070
168070
  params.push(filter.workflowId);
168071
168071
  }
168072
+ if (filter.search) {
168073
+ // Escape SQL LIKE wildcards to prevent wildcard injection
168074
+ const escaped = filter.search.replace(/[%_\\]/g, '\\$&');
168075
+ conditions.push("request_message LIKE ? ESCAPE '\\'");
168076
+ params.push(`%${escaped}%`);
168077
+ }
168078
+ if (filter.claimedBy) {
168079
+ conditions.push('claimed_by = ?');
168080
+ params.push(filter.claimedBy);
168081
+ }
168072
168082
  const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
168073
168083
  return { where, params };
168074
168084
  }
@@ -168227,6 +168237,32 @@ class SqliteTaskStore {
168227
168237
  // -------------------------------------------------------------------------
168228
168238
  // Cleanup
168229
168239
  // -------------------------------------------------------------------------
168240
+ failStaleTasks(reason) {
168241
+ const db = this.getDb();
168242
+ const now = nowISO();
168243
+ const msg = reason || 'Process terminated while task was running';
168244
+ const statusMessage = JSON.stringify({
168245
+ message_id: crypto_1.default.randomUUID(),
168246
+ role: 'agent',
168247
+ parts: [{ text: msg }],
168248
+ });
168249
+ const result = db
168250
+ .prepare(`UPDATE agent_tasks
168251
+ SET state = 'failed', updated_at = ?, status_message = ?
168252
+ WHERE state = 'working'`)
168253
+ .run(now, statusMessage);
168254
+ return result.changes;
168255
+ }
168256
+ purgeOldTasks(olderThanMs) {
168257
+ const db = this.getDb();
168258
+ const cutoff = new Date(Date.now() - olderThanMs).toISOString();
168259
+ const result = db
168260
+ .prepare(`DELETE FROM agent_tasks
168261
+ WHERE state IN ('completed', 'failed', 'canceled', 'rejected')
168262
+ AND updated_at <= ?`)
168263
+ .run(cutoff);
168264
+ return result.changes;
168265
+ }
168230
168266
  deleteExpiredTasks() {
168231
168267
  const db = this.getDb();
168232
168268
  const now = nowISO();
@@ -168393,10 +168429,13 @@ exports.TaskStreamManager = TaskStreamManager;
168393
168429
  /***/ }),
168394
168430
 
168395
168431
  /***/ 5932:
168396
- /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
168432
+ /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
168397
168433
 
168398
168434
  "use strict";
168399
168435
 
168436
+ var __importDefault = (this && this.__importDefault) || function (mod) {
168437
+ return (mod && mod.__esModule) ? mod : { "default": mod };
168438
+ };
168400
168439
  Object.defineProperty(exports, "__esModule", ({ value: true }));
168401
168440
  exports.handleTasksCommand = handleTasksCommand;
168402
168441
  /**
@@ -168409,6 +168448,7 @@ exports.handleTasksCommand = handleTasksCommand;
168409
168448
  * visor tasks cancel <task-id> - Cancel a task
168410
168449
  * visor tasks help - Show usage
168411
168450
  */
168451
+ const cli_table3_1 = __importDefault(__nccwpck_require__(25832));
168412
168452
  const logger_1 = __nccwpck_require__(86999);
168413
168453
  const instance_id_1 = __nccwpck_require__(89942);
168414
168454
  const task_store_1 = __nccwpck_require__(24711);
@@ -168478,9 +168518,19 @@ function buildFilter(flags) {
168478
168518
  if (typeof flags.state === 'string' && (0, state_transitions_1.isValidTaskState)(flags.state)) {
168479
168519
  filter.state = [flags.state];
168480
168520
  }
168521
+ else if (!flags.all) {
168522
+ // Default: show only active tasks (not completed history)
168523
+ filter.state = ['submitted', 'working', 'input_required', 'auth_required'];
168524
+ }
168481
168525
  if (typeof flags.agent === 'string') {
168482
168526
  filter.workflowId = flags.agent;
168483
168527
  }
168528
+ if (typeof flags.search === 'string') {
168529
+ filter.search = flags.search;
168530
+ }
168531
+ if (typeof flags.instance === 'string') {
168532
+ filter.claimedBy = flags.instance;
168533
+ }
168484
168534
  if (typeof flags.limit === 'string') {
168485
168535
  const n = parseInt(flags.limit, 10);
168486
168536
  if (!isNaN(n) && n > 0)
@@ -168504,30 +168554,59 @@ function formatMeta(meta) {
168504
168554
  parts.push(`sched:${meta.schedule_id}`);
168505
168555
  return parts.join(' ') || '-';
168506
168556
  }
168557
+ function stateColor(state) {
168558
+ switch (state) {
168559
+ case 'working':
168560
+ return '\x1b[33m' + state + '\x1b[0m'; // yellow
168561
+ case 'completed':
168562
+ return '\x1b[32m' + state + '\x1b[0m'; // green
168563
+ case 'failed':
168564
+ return '\x1b[31m' + state + '\x1b[0m'; // red
168565
+ case 'canceled':
168566
+ case 'rejected':
168567
+ return '\x1b[90m' + state + '\x1b[0m'; // grey
168568
+ case 'submitted':
168569
+ return '\x1b[36m' + state + '\x1b[0m'; // cyan
168570
+ case 'input_required':
168571
+ case 'auth_required':
168572
+ return '\x1b[35m' + state + '\x1b[0m'; // magenta
168573
+ default:
168574
+ return state;
168575
+ }
168576
+ }
168507
168577
  function formatTable(rows, total) {
168508
168578
  if (rows.length === 0)
168509
168579
  return 'No tasks found.';
168510
- const header = ['ID', 'Source', 'State', 'Workflow', 'Duration', 'Instance', 'Meta', 'Input'];
168511
- const data = rows.map(r => {
168580
+ const table = new cli_table3_1.default({
168581
+ head: ['ID', 'Source', 'State', 'Workflow', 'Duration', 'Instance', 'Meta', 'Input'],
168582
+ style: {
168583
+ head: ['cyan', 'bold'],
168584
+ border: ['grey'],
168585
+ },
168586
+ wordWrap: false,
168587
+ });
168588
+ for (const r of rows) {
168512
168589
  const duration = (0, state_transitions_1.isTerminalState)(r.state)
168513
168590
  ? formatDuration(r.created_at, r.updated_at)
168514
168591
  : formatDuration(r.claimed_at || r.created_at);
168515
- const instance = r.claimed_by || '-';
168516
- const workflow = r.workflow_id || '-';
168517
- const source = r.source || '-';
168518
- const meta = formatMeta(r.metadata);
168519
168592
  const input = r.request_message.length > 60
168520
168593
  ? r.request_message.slice(0, 57) + '...'
168521
168594
  : r.request_message || '-';
168522
- return [r.id.slice(0, 8), source, r.state, workflow, duration, instance, meta, input];
168523
- });
168524
- const widths = header.map((h, i) => Math.max(h.length, ...data.map(row => row[i].length)));
168525
- const sep = widths.map(w => '-'.repeat(w)).join(' ');
168526
- const fmt = (row) => row.map((cell, i) => cell.padEnd(widths[i])).join(' ');
168527
- const lines = [fmt(header), sep, ...data.map(fmt)];
168595
+ table.push([
168596
+ r.id.slice(0, 8),
168597
+ r.source || '-',
168598
+ stateColor(r.state),
168599
+ r.workflow_id || '-',
168600
+ duration,
168601
+ r.claimed_by || '-',
168602
+ formatMeta(r.metadata),
168603
+ input,
168604
+ ]);
168605
+ }
168606
+ let output = table.toString();
168528
168607
  if (total > rows.length)
168529
- lines.push(`\n(${total} total, showing ${rows.length})`);
168530
- return lines.join('\n');
168608
+ output += `\n(${total} total, showing ${rows.length})`;
168609
+ return output;
168531
168610
  }
168532
168611
  function formatMarkdown(rows, total) {
168533
168612
  if (rows.length === 0)
@@ -168565,15 +168644,16 @@ async function handleList(flags) {
168565
168644
  const render = async () => {
168566
168645
  await withTaskStore(async (store) => {
168567
168646
  const { rows, total } = store.listTasksRaw(filter);
168647
+ const activeOnly = !flags.all && !flags.state;
168568
168648
  if (output === 'json') {
168569
- console.log(JSON.stringify({ instance_id: instanceId, tasks: rows, total }, null, 2));
168649
+ console.log(JSON.stringify({ instance_id: instanceId, active_only: activeOnly, tasks: rows, total }, null, 2));
168570
168650
  }
168571
168651
  else if (output === 'markdown') {
168572
- console.log(`Instance: ${instanceId}\n`);
168652
+ console.log(`Instance: ${instanceId}${activeOnly ? ' (active tasks only, use --all for history)' : ''}\n`);
168573
168653
  console.log(formatMarkdown(rows, total));
168574
168654
  }
168575
168655
  else {
168576
- console.log(`Instance: ${instanceId}\n`);
168656
+ console.log(`Instance: ${instanceId}${activeOnly ? ' (active tasks only, use --all for history)' : ''}\n`);
168577
168657
  console.log(formatTable(rows, total));
168578
168658
  }
168579
168659
  });
@@ -168644,25 +168724,40 @@ async function handleStats(flags) {
168644
168724
  }, null, 2));
168645
168725
  return;
168646
168726
  }
168647
- console.log('Task State Summary');
168648
- console.log('------------------');
168727
+ const stateTable = new cli_table3_1.default({
168728
+ head: ['State', 'Count'],
168729
+ style: { head: ['cyan', 'bold'], border: ['grey'] },
168730
+ });
168649
168731
  for (const [state, count] of Object.entries(stateCounts)) {
168650
168732
  if (count > 0)
168651
- console.log(` ${state.padEnd(18)} ${count}`);
168733
+ stateTable.push([stateColor(state), String(count)]);
168652
168734
  }
168735
+ console.log('Task State Summary');
168736
+ console.log(stateTable.toString());
168653
168737
  if (Object.keys(agentCounts).length > 0) {
168654
- console.log('\nActive Tasks by Agent');
168655
- console.log('---------------------');
168738
+ const agentTable = new cli_table3_1.default({
168739
+ head: ['Workflow', 'Active Tasks'],
168740
+ style: { head: ['cyan', 'bold'], border: ['grey'] },
168741
+ });
168656
168742
  for (const [agent, count] of Object.entries(agentCounts)) {
168657
- console.log(` ${agent.padEnd(24)} ${count}`);
168743
+ agentTable.push([agent, String(count)]);
168658
168744
  }
168745
+ console.log('\nActive Tasks by Workflow');
168746
+ console.log(agentTable.toString());
168659
168747
  }
168660
- console.log(`\nActive workers: ${workerSet.size}`);
168748
+ console.log(`\nActive instances: ${workerSet.size}`);
168661
168749
  });
168662
168750
  }
168663
168751
  // ---------------------------------------------------------------------------
168664
168752
  // Subcommand: cancel
168665
168753
  // ---------------------------------------------------------------------------
168754
+ /**
168755
+ * Find a task by full ID or prefix match.
168756
+ */
168757
+ function findTaskByPrefix(store, prefix) {
168758
+ const { rows } = store.listTasksRaw({ limit: 500 });
168759
+ return rows.find(r => r.id === prefix || r.id.startsWith(prefix)) ?? null;
168760
+ }
168666
168761
  async function handleCancel(positional, _flags) {
168667
168762
  const taskId = positional[0];
168668
168763
  if (!taskId) {
@@ -168671,19 +168766,19 @@ async function handleCancel(positional, _flags) {
168671
168766
  return;
168672
168767
  }
168673
168768
  await withTaskStore(async (store) => {
168674
- const task = store.getTask(taskId);
168675
- if (!task) {
168769
+ const match = findTaskByPrefix(store, taskId);
168770
+ if (!match) {
168676
168771
  console.error(`Task not found: ${taskId}`);
168677
168772
  process.exitCode = 1;
168678
168773
  return;
168679
168774
  }
168680
- if ((0, state_transitions_1.isTerminalState)(task.status.state)) {
168681
- console.error(`Cannot cancel task in '${task.status.state}' state (already terminal)`);
168775
+ if ((0, state_transitions_1.isTerminalState)(match.state)) {
168776
+ console.error(`Cannot cancel task in '${match.state}' state (already terminal)`);
168682
168777
  process.exitCode = 1;
168683
168778
  return;
168684
168779
  }
168685
- store.updateTaskState(taskId, 'canceled');
168686
- console.log(`Task ${taskId.slice(0, 8)} canceled (was: ${task.status.state})`);
168780
+ store.updateTaskState(match.id, 'canceled');
168781
+ console.log(`Task ${match.id.slice(0, 8)} canceled (was: ${match.state})`);
168687
168782
  });
168688
168783
  }
168689
168784
  // ---------------------------------------------------------------------------
@@ -168698,9 +168793,7 @@ async function handleShow(positional, flags) {
168698
168793
  }
168699
168794
  const output = typeof flags.output === 'string' ? flags.output : 'table';
168700
168795
  await withTaskStore(async (store) => {
168701
- // Try to find by prefix match
168702
- const { rows } = store.listTasksRaw({ limit: 200 });
168703
- const match = rows.find(r => r.id.startsWith(taskId));
168796
+ const match = findTaskByPrefix(store, taskId);
168704
168797
  if (!match) {
168705
168798
  console.error(`Task not found: ${taskId}`);
168706
168799
  process.exitCode = 1;
@@ -168713,26 +168806,40 @@ async function handleShow(positional, flags) {
168713
168806
  const duration = (0, state_transitions_1.isTerminalState)(match.state)
168714
168807
  ? formatDuration(match.created_at, match.updated_at)
168715
168808
  : formatDuration(match.claimed_at || match.created_at);
168716
- console.log(`Task: ${match.id}`);
168717
- console.log(`State: ${match.state}`);
168718
- console.log(`Source: ${match.source}`);
168719
- console.log(`Workflow: ${match.workflow_id || '-'}`);
168720
- console.log(`Instance: ${match.claimed_by || '-'}`);
168721
- console.log(`Duration: ${duration}`);
168722
- console.log(`Created: ${match.created_at}`);
168723
- console.log(`Updated: ${match.updated_at}`);
168809
+ const detailTable = new cli_table3_1.default({
168810
+ style: { head: ['cyan', 'bold'], border: ['grey'] },
168811
+ wordWrap: false,
168812
+ });
168813
+ detailTable.push({ 'Task ID': match.id }, { State: stateColor(match.state) }, { Source: match.source }, { Workflow: match.workflow_id || '-' }, { Instance: match.claimed_by || '-' }, { Duration: duration }, { Created: match.created_at }, { Updated: match.updated_at });
168724
168814
  if (match.run_id)
168725
- console.log(`Run ID: ${match.run_id}`);
168726
- console.log(`Input: ${match.request_message}`);
168815
+ detailTable.push({ 'Run ID': match.run_id });
168816
+ detailTable.push({ Input: match.request_message });
168727
168817
  // Show metadata
168728
168818
  const meta = match.metadata;
168729
168819
  const metaKeys = Object.keys(meta).filter(k => k !== 'source');
168730
- if (metaKeys.length > 0) {
168731
- console.log(`\nMetadata:`);
168732
- for (const key of metaKeys) {
168733
- console.log(` ${key}: ${JSON.stringify(meta[key])}`);
168734
- }
168820
+ for (const key of metaKeys) {
168821
+ detailTable.push({ [key]: String(meta[key]) });
168735
168822
  }
168823
+ console.log(detailTable.toString());
168824
+ });
168825
+ }
168826
+ // ---------------------------------------------------------------------------
168827
+ // Subcommand: purge
168828
+ // ---------------------------------------------------------------------------
168829
+ async function handlePurge(flags) {
168830
+ const ageStr = typeof flags.age === 'string' ? flags.age : '7d';
168831
+ const match = ageStr.match(/^(\d+)([hdm])$/);
168832
+ if (!match) {
168833
+ console.error('Invalid --age format. Use e.g. 24h, 7d, 30d');
168834
+ process.exitCode = 1;
168835
+ return;
168836
+ }
168837
+ const value = parseInt(match[1], 10);
168838
+ const unit = match[2];
168839
+ const ms = unit === 'h' ? value * 3600_000 : unit === 'd' ? value * 86400_000 : value * 2592000_000;
168840
+ await withTaskStore(async (store) => {
168841
+ const deleted = store.purgeOldTasks(ms);
168842
+ console.log(`Purged ${deleted} terminal task(s) older than ${ageStr}.`);
168736
168843
  });
168737
168844
  }
168738
168845
  // ---------------------------------------------------------------------------
@@ -168746,28 +168853,33 @@ USAGE:
168746
168853
  visor tasks [command] [options]
168747
168854
 
168748
168855
  COMMANDS:
168749
- list List tasks (default)
168856
+ list List active tasks (default)
168750
168857
  show <task-id> Show task details (supports prefix match)
168751
168858
  stats Queue summary statistics
168752
168859
  cancel <task-id> Cancel a task
168860
+ purge [--age 7d] Delete old completed/failed tasks
168753
168861
  help Show this help
168754
168862
 
168755
168863
  OPTIONS:
168756
- --output <format> Output format: table (default), json, markdown
168864
+ --all Show all tasks including completed/failed history
168757
168865
  --state <state> Filter by state: submitted, working, completed, failed, canceled
168866
+ --search <text> Search tasks by input text
168867
+ --instance <id> Filter by visor instance ID
168758
168868
  --agent <workflow-id> Filter by agent/workflow
168759
168869
  --limit <n> Number of tasks to show (default: 20)
168870
+ --output <format> Output format: table (default), json, markdown
168760
168871
  --watch Refresh every 2 seconds
168761
168872
 
168762
168873
  EXAMPLES:
168763
- visor tasks List all tasks
168874
+ visor tasks List active tasks only
168875
+ visor tasks --all List all tasks including history
168876
+ visor tasks --state failed Show failed tasks
168877
+ visor tasks --search "auth" Search tasks by text
168764
168878
  visor tasks show abc123 Show full task details
168765
- visor tasks list --state working Show only working tasks
168766
- visor tasks list --agent security-review Show tasks for a specific agent
168767
- visor tasks list --output json JSON output
168768
168879
  visor tasks list --watch Live monitoring
168769
168880
  visor tasks stats Show queue statistics
168770
168881
  visor tasks cancel abc123 Cancel a task
168882
+ visor tasks purge --age 30d Delete tasks older than 30 days
168771
168883
  `);
168772
168884
  }
168773
168885
  // ---------------------------------------------------------------------------
@@ -168794,6 +168906,9 @@ async function handleTasksCommand(argv) {
168794
168906
  case 'cancel':
168795
168907
  await handleCancel(positional, flags);
168796
168908
  break;
168909
+ case 'purge':
168910
+ await handlePurge(flags);
168911
+ break;
168797
168912
  case 'help':
168798
168913
  printHelp();
168799
168914
  break;
@@ -172806,6 +172921,11 @@ async function main() {
172806
172921
  const { SqliteTaskStore } = await Promise.resolve().then(() => __importStar(__nccwpck_require__(24711)));
172807
172922
  sharedTaskStore = new SqliteTaskStore();
172808
172923
  await sharedTaskStore.initialize();
172924
+ // Recover stale tasks from previous crashed runs
172925
+ const recovered = sharedTaskStore.failStaleTasks('Process terminated unexpectedly');
172926
+ if (recovered > 0) {
172927
+ logger_1.logger.info(`[TaskTracking] Recovered ${recovered} stale working task(s) → failed`);
172928
+ }
172809
172929
  logger_1.logger.info('[TaskTracking] Shared task store initialized');
172810
172930
  }
172811
172931
  catch (err) {
@@ -211099,32 +211219,28 @@ function replaceMermaidBlocks(text, diagrams, replacement = '_(See diagram above
211099
211219
  function markdownToSlack(text) {
211100
211220
  if (!text || typeof text !== 'string')
211101
211221
  return '';
211102
- let out = text;
211103
- // Images: ![alt](url) → <url|alt>
211104
- // We intentionally keep only the URL + alt text; Slack will usually unfurl.
211105
- out = out.replace(/!\[([^\]]*)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g, (_m, alt, url) => `<${url}|${alt || 'image'}>`);
211106
- // Links: [label](url) → <url|label>
211107
- out = out.replace(/\[([^\]]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g, (_m, label, url) => `<${url}|${label}>`);
211108
- // Bold: **text** or __text__ → *text*
211109
- out = out.replace(/\*\*([^*]+)\*\*/g, (_m, inner) => `*${inner}*`);
211110
- out = out.replace(/__([^_]+)__/g, (_m, inner) => `*${inner}*`);
211111
- // Process lines for headers and bullet lists.
211112
- // Slack's mrkdwn handles "•" bullets more naturally than raw "-" Markdown.
211113
- const lines = out.split(/\r?\n/);
211222
+ // Process line-by-line so ALL transformations respect code blocks.
211223
+ const lines = text.split(/\r?\n/);
211114
211224
  let inCodeBlock = false;
211115
211225
  for (let i = 0; i < lines.length; i++) {
211116
- const line = lines[i];
211117
- const trimmed = line.trimStart();
211118
- // Track fenced code blocks and avoid rewriting inside them
211226
+ const trimmed = lines[i].trimStart();
211227
+ // Track fenced code blocks — skip all transformations inside them
211119
211228
  if (/^```/.test(trimmed)) {
211120
211229
  inCodeBlock = !inCodeBlock;
211121
211230
  continue;
211122
211231
  }
211123
211232
  if (inCodeBlock)
211124
211233
  continue;
211234
+ let line = lines[i];
211235
+ // Images: ![alt](url) → <url|alt>
211236
+ line = line.replace(/!\[([^\]]*)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g, (_m, alt, url) => `<${url}|${alt || 'image'}>`);
211237
+ // Links: [label](url) → <url|label>
211238
+ line = line.replace(/\[([^\]]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g, (_m, label, url) => `<${url}|${label}>`);
211239
+ // Bold: **text** or __text__ → *text*
211240
+ line = line.replace(/\*\*([^*]+)\*\*/g, (_m, inner) => `*${inner}*`);
211241
+ line = line.replace(/__([^_]+)__/g, (_m, inner) => `*${inner}*`);
211125
211242
  // Headers: # Header → *Header* (Slack doesn't have native headers)
211126
- // Match 1-6 # at start of line, followed by space and text
211127
- const headerMatch = /^(#{1,6})\s+(.+)$/.exec(trimmed);
211243
+ const headerMatch = /^(#{1,6})\s+(.+)$/.exec(line.trimStart());
211128
211244
  if (headerMatch) {
211129
211245
  const [, hashes, headerText] = headerMatch;
211130
211246
  // For h1/h2, add extra emphasis with newline before (if not first line
@@ -211144,10 +211260,11 @@ function markdownToSlack(text) {
211144
211260
  if (bulletMatch) {
211145
211261
  const [, indent, , rest] = bulletMatch;
211146
211262
  lines[i] = `${indent}• ${rest}`;
211263
+ continue;
211147
211264
  }
211265
+ lines[i] = line;
211148
211266
  }
211149
- out = lines.join('\n');
211150
- return out;
211267
+ return lines.join('\n');
211151
211268
  }
211152
211269
  /**
211153
211270
  * Extract all file sections delimited by --- filename.ext --- from text.
@@ -192,6 +192,15 @@ var init_task_store = __esm({
192
192
  conditions.push("workflow_id = ?");
193
193
  params.push(filter.workflowId);
194
194
  }
195
+ if (filter.search) {
196
+ const escaped = filter.search.replace(/[%_\\]/g, "\\$&");
197
+ conditions.push("request_message LIKE ? ESCAPE '\\'");
198
+ params.push(`%${escaped}%`);
199
+ }
200
+ if (filter.claimedBy) {
201
+ conditions.push("claimed_by = ?");
202
+ params.push(filter.claimedBy);
203
+ }
195
204
  const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
196
205
  return { where, params };
197
206
  }
@@ -345,6 +354,32 @@ var init_task_store = __esm({
345
354
  // -------------------------------------------------------------------------
346
355
  // Cleanup
347
356
  // -------------------------------------------------------------------------
357
+ failStaleTasks(reason) {
358
+ const db = this.getDb();
359
+ const now = nowISO();
360
+ const msg = reason || "Process terminated while task was running";
361
+ const statusMessage = JSON.stringify({
362
+ message_id: crypto.randomUUID(),
363
+ role: "agent",
364
+ parts: [{ text: msg }]
365
+ });
366
+ const result = db.prepare(
367
+ `UPDATE agent_tasks
368
+ SET state = 'failed', updated_at = ?, status_message = ?
369
+ WHERE state = 'working'`
370
+ ).run(now, statusMessage);
371
+ return result.changes;
372
+ }
373
+ purgeOldTasks(olderThanMs) {
374
+ const db = this.getDb();
375
+ const cutoff = new Date(Date.now() - olderThanMs).toISOString();
376
+ const result = db.prepare(
377
+ `DELETE FROM agent_tasks
378
+ WHERE state IN ('completed', 'failed', 'canceled', 'rejected')
379
+ AND updated_at <= ?`
380
+ ).run(cutoff);
381
+ return result.changes;
382
+ }
348
383
  deleteExpiredTasks() {
349
384
  const db = this.getDb();
350
385
  const now = nowISO();
@@ -1619,4 +1654,4 @@ export {
1619
1654
  messageToWorkflowInput,
1620
1655
  resultToArtifacts
1621
1656
  };
1622
- //# sourceMappingURL=a2a-frontend-GUEGI5SX.mjs.map
1657
+ //# sourceMappingURL=a2a-frontend-N4VU3PHW.mjs.map