proofscan 0.10.62 → 0.11.0

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 (199) hide show
  1. package/README.ja.md +1 -0
  2. package/README.md +2 -0
  3. package/dist/a2a/agent-card.d.ts +2 -0
  4. package/dist/a2a/agent-card.d.ts.map +1 -1
  5. package/dist/a2a/agent-card.js +2 -2
  6. package/dist/a2a/agent-card.js.map +1 -1
  7. package/dist/a2a/client.d.ts +74 -12
  8. package/dist/a2a/client.d.ts.map +1 -1
  9. package/dist/a2a/client.js +228 -29
  10. package/dist/a2a/client.js.map +1 -1
  11. package/dist/a2a/normalizer.d.ts +4 -0
  12. package/dist/a2a/normalizer.d.ts.map +1 -1
  13. package/dist/a2a/normalizer.js +7 -4
  14. package/dist/a2a/normalizer.js.map +1 -1
  15. package/dist/a2a/session-manager.d.ts +81 -0
  16. package/dist/a2a/session-manager.d.ts.map +1 -0
  17. package/dist/a2a/session-manager.js +176 -0
  18. package/dist/a2a/session-manager.js.map +1 -0
  19. package/dist/a2a/types.d.ts +60 -0
  20. package/dist/a2a/types.d.ts.map +1 -1
  21. package/dist/cli.d.ts +2 -1
  22. package/dist/cli.d.ts.map +1 -1
  23. package/dist/cli.js +6 -3
  24. package/dist/cli.js.map +1 -1
  25. package/dist/commands/agent.d.ts.map +1 -1
  26. package/dist/commands/agent.js +35 -10
  27. package/dist/commands/agent.js.map +1 -1
  28. package/dist/commands/analyze.d.ts.map +1 -1
  29. package/dist/commands/analyze.js +12 -10
  30. package/dist/commands/analyze.js.map +1 -1
  31. package/dist/commands/connectors.js +2 -2
  32. package/dist/commands/connectors.js.map +1 -1
  33. package/dist/commands/index.d.ts +1 -0
  34. package/dist/commands/index.d.ts.map +1 -1
  35. package/dist/commands/index.js +1 -0
  36. package/dist/commands/index.js.map +1 -1
  37. package/dist/commands/plans.js +1 -1
  38. package/dist/commands/plans.js.map +1 -1
  39. package/dist/commands/record.js +5 -4
  40. package/dist/commands/record.js.map +1 -1
  41. package/dist/commands/rpc.d.ts.map +1 -1
  42. package/dist/commands/rpc.js +90 -28
  43. package/dist/commands/rpc.js.map +1 -1
  44. package/dist/commands/scan.d.ts.map +1 -1
  45. package/dist/commands/scan.js +8 -10
  46. package/dist/commands/scan.js.map +1 -1
  47. package/dist/commands/secrets.d.ts.map +1 -1
  48. package/dist/commands/secrets.js +11 -10
  49. package/dist/commands/secrets.js.map +1 -1
  50. package/dist/commands/sessions.js +2 -2
  51. package/dist/commands/sessions.js.map +1 -1
  52. package/dist/commands/summary.d.ts.map +1 -1
  53. package/dist/commands/summary.js +4 -2
  54. package/dist/commands/summary.js.map +1 -1
  55. package/dist/commands/task.d.ts +14 -0
  56. package/dist/commands/task.d.ts.map +1 -0
  57. package/dist/commands/task.js +520 -0
  58. package/dist/commands/task.js.map +1 -0
  59. package/dist/db/connection.d.ts.map +1 -1
  60. package/dist/db/connection.js +56 -1
  61. package/dist/db/connection.js.map +1 -1
  62. package/dist/db/events-store.d.ts +307 -8
  63. package/dist/db/events-store.d.ts.map +1 -1
  64. package/dist/db/events-store.js +620 -26
  65. package/dist/db/events-store.js.map +1 -1
  66. package/dist/db/proofs-store.d.ts +8 -1
  67. package/dist/db/proofs-store.d.ts.map +1 -1
  68. package/dist/db/proofs-store.js +18 -8
  69. package/dist/db/proofs-store.js.map +1 -1
  70. package/dist/db/schema.d.ts +15 -3
  71. package/dist/db/schema.d.ts.map +1 -1
  72. package/dist/db/schema.js +150 -5
  73. package/dist/db/schema.js.map +1 -1
  74. package/dist/db/tool-analysis.d.ts +15 -3
  75. package/dist/db/tool-analysis.d.ts.map +1 -1
  76. package/dist/db/tool-analysis.js +35 -17
  77. package/dist/db/tool-analysis.js.map +1 -1
  78. package/dist/db/types.d.ts +64 -1
  79. package/dist/db/types.d.ts.map +1 -1
  80. package/dist/filter/fields.d.ts.map +1 -1
  81. package/dist/filter/fields.js +22 -0
  82. package/dist/filter/fields.js.map +1 -1
  83. package/dist/filter/parser.js +2 -2
  84. package/dist/filter/parser.js.map +1 -1
  85. package/dist/filter/types.d.ts +1 -1
  86. package/dist/filter/types.d.ts.map +1 -1
  87. package/dist/html/analytics.test.ts +682 -0
  88. package/dist/html/analytics.ts +499 -0
  89. package/dist/html/browser.ts +39 -0
  90. package/dist/html/index.ts +97 -0
  91. package/dist/html/rpc-inspector.test.ts +529 -0
  92. package/dist/html/rpc-inspector.ts +1700 -0
  93. package/dist/html/templates.js +4 -4
  94. package/dist/html/templates.js.map +1 -1
  95. package/dist/html/templates.test.ts +861 -0
  96. package/dist/html/templates.ts +3163 -0
  97. package/dist/html/trace-viewer.html +624 -0
  98. package/dist/html/types.d.ts +3 -3
  99. package/dist/html/types.d.ts.map +1 -1
  100. package/dist/html/types.ts +491 -0
  101. package/dist/html/utils.ts +107 -0
  102. package/dist/monitor/data/connectors.d.ts.map +1 -1
  103. package/dist/monitor/data/connectors.js +113 -8
  104. package/dist/monitor/data/connectors.js.map +1 -1
  105. package/dist/monitor/data/popl.js +2 -2
  106. package/dist/monitor/data/popl.js.map +1 -1
  107. package/dist/monitor/routes/api.js +2 -2
  108. package/dist/monitor/routes/api.js.map +1 -1
  109. package/dist/monitor/routes/connectors.js +15 -15
  110. package/dist/monitor/routes/connectors.js.map +1 -1
  111. package/dist/monitor/routes/popl.js +5 -5
  112. package/dist/monitor/routes/popl.js.map +1 -1
  113. package/dist/monitor/templates/components.js +2 -2
  114. package/dist/monitor/templates/components.js.map +1 -1
  115. package/dist/monitor/templates/popl.js +4 -4
  116. package/dist/monitor/templates/popl.js.map +1 -1
  117. package/dist/monitor/types.d.ts +2 -2
  118. package/dist/monitor/types.d.ts.map +1 -1
  119. package/dist/proxy/bridge-utils.d.ts +41 -0
  120. package/dist/proxy/bridge-utils.d.ts.map +1 -0
  121. package/dist/proxy/bridge-utils.js +60 -0
  122. package/dist/proxy/bridge-utils.js.map +1 -0
  123. package/dist/proxy/ipc-client.d.ts.map +1 -1
  124. package/dist/proxy/ipc-client.js +1 -2
  125. package/dist/proxy/ipc-client.js.map +1 -1
  126. package/dist/proxy/ipc-server.d.ts.map +1 -1
  127. package/dist/proxy/ipc-server.js +4 -2
  128. package/dist/proxy/ipc-server.js.map +1 -1
  129. package/dist/proxy/mcp-server.d.ts +31 -0
  130. package/dist/proxy/mcp-server.d.ts.map +1 -1
  131. package/dist/proxy/mcp-server.js +393 -4
  132. package/dist/proxy/mcp-server.js.map +1 -1
  133. package/dist/proxy/types.d.ts +95 -0
  134. package/dist/proxy/types.d.ts.map +1 -1
  135. package/dist/secrets/management.d.ts +2 -2
  136. package/dist/secrets/management.d.ts.map +1 -1
  137. package/dist/secrets/management.js +7 -7
  138. package/dist/secrets/management.js.map +1 -1
  139. package/dist/shell/completer.d.ts.map +1 -1
  140. package/dist/shell/completer.js +16 -0
  141. package/dist/shell/completer.js.map +1 -1
  142. package/dist/shell/context-applicator.d.ts.map +1 -1
  143. package/dist/shell/context-applicator.js +32 -0
  144. package/dist/shell/context-applicator.js.map +1 -1
  145. package/dist/shell/filter-mappers.d.ts +5 -1
  146. package/dist/shell/filter-mappers.d.ts.map +1 -1
  147. package/dist/shell/filter-mappers.js +12 -0
  148. package/dist/shell/filter-mappers.js.map +1 -1
  149. package/dist/shell/find-command.js +13 -13
  150. package/dist/shell/find-command.js.map +1 -1
  151. package/dist/shell/inscribe-commands.js +5 -5
  152. package/dist/shell/inscribe-commands.js.map +1 -1
  153. package/dist/shell/pager/less-pager.d.ts +1 -1
  154. package/dist/shell/pager/less-pager.d.ts.map +1 -1
  155. package/dist/shell/pager/less-pager.js +5 -2
  156. package/dist/shell/pager/less-pager.js.map +1 -1
  157. package/dist/shell/pager/more-pager.d.ts +1 -1
  158. package/dist/shell/pager/more-pager.d.ts.map +1 -1
  159. package/dist/shell/pager/more-pager.js +3 -2
  160. package/dist/shell/pager/more-pager.js.map +1 -1
  161. package/dist/shell/pager/renderer.d.ts.map +1 -1
  162. package/dist/shell/pager/renderer.js +66 -15
  163. package/dist/shell/pager/renderer.js.map +1 -1
  164. package/dist/shell/pager/types.d.ts +5 -2
  165. package/dist/shell/pager/types.d.ts.map +1 -1
  166. package/dist/shell/pager/utils.d.ts +5 -2
  167. package/dist/shell/pager/utils.d.ts.map +1 -1
  168. package/dist/shell/pager/utils.js +14 -17
  169. package/dist/shell/pager/utils.js.map +1 -1
  170. package/dist/shell/pipeline-types.d.ts +12 -4
  171. package/dist/shell/pipeline-types.d.ts.map +1 -1
  172. package/dist/shell/ref-commands.js +7 -7
  173. package/dist/shell/ref-commands.js.map +1 -1
  174. package/dist/shell/ref-resolver.d.ts +15 -15
  175. package/dist/shell/ref-resolver.d.ts.map +1 -1
  176. package/dist/shell/ref-resolver.js +34 -20
  177. package/dist/shell/ref-resolver.js.map +1 -1
  178. package/dist/shell/repl.d.ts +25 -0
  179. package/dist/shell/repl.d.ts.map +1 -1
  180. package/dist/shell/repl.js +285 -51
  181. package/dist/shell/repl.js.map +1 -1
  182. package/dist/shell/router-commands.d.ts +30 -0
  183. package/dist/shell/router-commands.d.ts.map +1 -1
  184. package/dist/shell/router-commands.js +1011 -62
  185. package/dist/shell/router-commands.js.map +1 -1
  186. package/dist/shell/selector.d.ts +1 -1
  187. package/dist/shell/selector.d.ts.map +1 -1
  188. package/dist/shell/selector.js +1 -1
  189. package/dist/shell/selector.js.map +1 -1
  190. package/dist/shell/types.d.ts.map +1 -1
  191. package/dist/shell/types.js +3 -1
  192. package/dist/shell/types.js.map +1 -1
  193. package/dist/shell/where-command.d.ts.map +1 -1
  194. package/dist/shell/where-command.js +19 -3
  195. package/dist/shell/where-command.js.map +1 -1
  196. package/dist/utils/output.d.ts.map +1 -1
  197. package/dist/utils/output.js +7 -1
  198. package/dist/utils/output.js.map +1 -1
  199. package/package.json +2 -2
@@ -0,0 +1,520 @@
1
+ /**
2
+ * Task Commands (A2A Phase 2.2)
3
+ *
4
+ * CLI commands for managing A2A tasks.
5
+ * Implements: ls, show, cancel, wait
6
+ *
7
+ * Phase 2.4: Task event recording
8
+ */
9
+ import { Command } from 'commander';
10
+ import { dirname } from 'node:path';
11
+ import { createA2AClient } from '../a2a/client.js';
12
+ import { output, outputError, outputSuccess, outputTable } from '../utils/output.js';
13
+ import { EventsStore } from '../db/events-store.js';
14
+ /**
15
+ * Handle task list logic (shared by ls and list commands)
16
+ */
17
+ async function handleTaskList(agent, options, getConfigPath) {
18
+ // Validate status if provided
19
+ const validStatuses = ['pending', 'working', 'input_required', 'completed', 'failed', 'canceled', 'rejected'];
20
+ if (options.status && !validStatuses.includes(options.status)) {
21
+ outputError(`Invalid status: ${options.status}. Valid values: ${validStatuses.join(', ')}`);
22
+ process.exit(1);
23
+ }
24
+ // Build list params
25
+ const params = {};
26
+ if (options.context) {
27
+ params.contextId = options.context;
28
+ }
29
+ if (options.status) {
30
+ params.status = options.status;
31
+ }
32
+ // Create client
33
+ const configDir = dirname(getConfigPath());
34
+ const clientResult = await createA2AClient(configDir, agent);
35
+ if (!clientResult.ok) {
36
+ if (clientResult.error?.includes('ECONNREFUSED') || clientResult.error?.includes('fetch failed')) {
37
+ outputError(`Cannot connect to agent. Is it running? (${clientResult.error})`);
38
+ }
39
+ else {
40
+ outputError(clientResult.error || 'Failed to create client');
41
+ }
42
+ process.exit(1);
43
+ }
44
+ // List tasks
45
+ const result = await clientResult.client.listTasks(params);
46
+ if (!result.ok) {
47
+ // Provide more specific error messages
48
+ if (result.error?.includes('ECONNREFUSED') || result.error?.includes('fetch failed')) {
49
+ outputError(`Cannot connect to agent. Is it running? (${result.error})`);
50
+ }
51
+ else if (result.error?.includes('404') || result.error?.includes('not found')) {
52
+ outputError(`Agent does not support tasks/list endpoint. (${result.error})`);
53
+ }
54
+ else {
55
+ outputError(result.error || 'Failed to list tasks');
56
+ }
57
+ process.exit(1);
58
+ }
59
+ if (!result.response) {
60
+ outputError('Failed to list tasks: no response from agent');
61
+ process.exit(1);
62
+ }
63
+ const { tasks, totalSize } = result.response;
64
+ if (tasks.length === 0) {
65
+ output({ tasks: [], totalSize }, 'No tasks found.');
66
+ return;
67
+ }
68
+ // Output as table
69
+ const headers = ['ID', 'Status', 'Context', 'Messages', 'Created'];
70
+ const rows = tasks.map(t => [
71
+ t.id.slice(0, 8),
72
+ t.status,
73
+ t.contextId || '-',
74
+ t.messages ? String(t.messages.length) : '0',
75
+ t.createdAt ? new Date(t.createdAt).toLocaleDateString() : '-',
76
+ ]);
77
+ outputTable(headers, rows);
78
+ // Show total size if available
79
+ if (totalSize !== undefined && totalSize > tasks.length) {
80
+ console.log(`\nShowing ${tasks.length} of ${totalSize} tasks (first page)`);
81
+ }
82
+ }
83
+ /**
84
+ * Get or create session for task event recording (Phase 2.4)
85
+ *
86
+ * Session resolution strategy:
87
+ * 1. First, check for existing task events and reuse their session_id
88
+ * 2. If no existing events, create a new session for the agent
89
+ *
90
+ * @param configDir - Configuration directory
91
+ * @param agentId - Agent ID (connector/target ID)
92
+ * @param taskId - Task ID (for finding existing events)
93
+ * @returns Session ID for event recording
94
+ */
95
+ function getOrCreateSessionForTask(configDir, agentId, taskId) {
96
+ const eventsStore = new EventsStore(configDir);
97
+ // 1. Check for existing task events with this taskId
98
+ const existingEvents = eventsStore.getTaskEventsByTaskId(taskId);
99
+ if (existingEvents.length > 0) {
100
+ return existingEvents[0].session_id;
101
+ }
102
+ // 2. No existing events - try to find a recent session for this agent
103
+ const latestSession = eventsStore.getLatestSession(agentId);
104
+ if (latestSession) {
105
+ return latestSession.session_id;
106
+ }
107
+ // 3. Create a new session for this agent
108
+ const session = eventsStore.createSession(agentId, {
109
+ actorKind: 'system',
110
+ actorLabel: 'cli-task',
111
+ });
112
+ return session.session_id;
113
+ }
114
+ /**
115
+ * Record task status update event (Phase 2.4)
116
+ *
117
+ * @param configDir - Configuration directory
118
+ * @param agentId - Agent ID
119
+ * @param taskId - Task ID
120
+ * @param status - Current task status
121
+ * @returns True if event was recorded, false if status unchanged
122
+ */
123
+ function recordTaskUpdate(configDir, agentId, taskId, status) {
124
+ try {
125
+ const sessionId = getOrCreateSessionForTask(configDir, agentId, taskId);
126
+ const eventsStore = new EventsStore(configDir);
127
+ return eventsStore.recordTaskUpdated(sessionId, taskId, status);
128
+ }
129
+ catch {
130
+ // Silently fail to avoid blocking CLI operations
131
+ return false;
132
+ }
133
+ }
134
+ /**
135
+ * Record task completion event (Phase 2.4)
136
+ *
137
+ * @param configDir - Configuration directory
138
+ * @param agentId - Agent ID
139
+ * @param taskId - Task ID
140
+ * @param status - Final task status (completed/failed/canceled/rejected)
141
+ * @param messages - Task messages (optional)
142
+ * @param error - Error message (for failed status)
143
+ */
144
+ function recordTaskCompletion(configDir, agentId, taskId, status, messages, error) {
145
+ try {
146
+ const sessionId = getOrCreateSessionForTask(configDir, agentId, taskId);
147
+ const eventsStore = new EventsStore(configDir);
148
+ if (status === 'completed') {
149
+ eventsStore.recordTaskCompleted(sessionId, taskId, status, messages);
150
+ }
151
+ else if (status === 'failed') {
152
+ eventsStore.recordTaskFailed(sessionId, taskId, status, error);
153
+ }
154
+ else if (status === 'canceled') {
155
+ eventsStore.recordTaskCanceled(sessionId, taskId, status);
156
+ }
157
+ else if (status === 'rejected') {
158
+ eventsStore.recordTaskFailed(sessionId, taskId, status, 'Task rejected');
159
+ }
160
+ }
161
+ catch {
162
+ // Silently fail to avoid blocking CLI operations
163
+ }
164
+ }
165
+ /**
166
+ * Record task wait timeout event (Phase 2.4)
167
+ *
168
+ * @param configDir - Configuration directory
169
+ * @param agentId - Agent ID
170
+ * @param taskId - Task ID
171
+ * @param error - Error message
172
+ */
173
+ function recordTaskTimeout(configDir, agentId, taskId, error) {
174
+ try {
175
+ const sessionId = getOrCreateSessionForTask(configDir, agentId, taskId);
176
+ const eventsStore = new EventsStore(configDir);
177
+ eventsStore.recordTaskWaitTimeout(sessionId, taskId, error);
178
+ }
179
+ catch {
180
+ // Silently fail to avoid blocking CLI operations
181
+ }
182
+ }
183
+ /**
184
+ * Record task poll error event (Phase 2.4)
185
+ * Distinct from timeout - this is for actual poll failures (network, etc.)
186
+ */
187
+ function recordTaskPollError(configDir, agentId, taskId, error) {
188
+ try {
189
+ const sessionId = getOrCreateSessionForTask(configDir, agentId, taskId);
190
+ const eventsStore = new EventsStore(configDir);
191
+ eventsStore.recordTaskPollError(sessionId, taskId, error);
192
+ }
193
+ catch {
194
+ // Silently fail to avoid blocking CLI operations
195
+ }
196
+ }
197
+ /**
198
+ * Create the task command group
199
+ */
200
+ export function createTaskCommand(getConfigPath) {
201
+ const cmd = new Command('task')
202
+ .description('Manage A2A tasks');
203
+ // ===== task ls =====
204
+ cmd
205
+ .command('ls <agent>')
206
+ .description('List tasks for an agent')
207
+ .option('--context <id>', 'Filter by context ID')
208
+ .option('--status <state>', 'Filter by status (pending|working|input_required|completed|failed|canceled|rejected)')
209
+ .action(async (agent, options) => {
210
+ try {
211
+ await handleTaskList(agent, options, getConfigPath);
212
+ }
213
+ catch (error) {
214
+ outputError('Failed to list tasks', error instanceof Error ? error : undefined);
215
+ process.exit(1);
216
+ }
217
+ });
218
+ // ===== task list =====
219
+ cmd
220
+ .command('list <agent>')
221
+ .description('Alias for ls')
222
+ .option('--context <id>', 'Filter by context ID')
223
+ .option('--status <state>', 'Filter by status')
224
+ .action(async (agent, options) => {
225
+ try {
226
+ await handleTaskList(agent, options, getConfigPath);
227
+ }
228
+ catch (error) {
229
+ outputError('Failed to list tasks', error instanceof Error ? error : undefined);
230
+ process.exit(1);
231
+ }
232
+ });
233
+ /**
234
+ * Handler for task show with prefix matching
235
+ */
236
+ async function handleTaskShow(agent, taskIdPrefix, options) {
237
+ // Parse history length
238
+ const historyLength = parseInt(options.history || '10', 10);
239
+ if (isNaN(historyLength) || historyLength < 0) {
240
+ outputError('History length must be a non-negative integer');
241
+ process.exit(1);
242
+ }
243
+ // Create client
244
+ const configDir = dirname(getConfigPath());
245
+ const clientResult = await createA2AClient(configDir, agent);
246
+ if (!clientResult.ok) {
247
+ if (clientResult.error?.includes('ECONNREFUSED') || clientResult.error?.includes('fetch failed')) {
248
+ outputError(`Cannot connect to agent. Is it running? (${clientResult.error})`);
249
+ }
250
+ else {
251
+ outputError(clientResult.error || 'Failed to create client');
252
+ }
253
+ process.exit(1);
254
+ }
255
+ // First try exact match
256
+ let result = await clientResult.client.getTask(taskIdPrefix, { historyLength });
257
+ // If not found, try prefix matching via list
258
+ if (!result.ok && (result.error?.includes('not found') || result.error?.includes('-32001'))) {
259
+ const listResult = await clientResult.client.listTasks({});
260
+ if (listResult.ok && listResult.response) {
261
+ const matches = listResult.response.tasks.filter(t => t.id.startsWith(taskIdPrefix));
262
+ if (matches.length === 1) {
263
+ // Exactly one match - use full ID
264
+ result = await clientResult.client.getTask(matches[0].id, { historyLength });
265
+ }
266
+ else if (matches.length > 1) {
267
+ outputError(`Ambiguous task ID prefix '${taskIdPrefix}'. Matches: ${matches.map(t => t.id).join(', ')}`);
268
+ process.exit(1);
269
+ }
270
+ // If no matches, fall through to original error
271
+ }
272
+ }
273
+ if (!result.ok) {
274
+ if (result.error?.includes('404') || result.error?.includes('not found') || result.error?.includes('-32001')) {
275
+ outputError(`Task not found: ${taskIdPrefix} (${result.error})`);
276
+ }
277
+ else {
278
+ outputError(result.error || `Failed to get task: ${taskIdPrefix}`);
279
+ }
280
+ process.exit(1);
281
+ }
282
+ if (!result.task) {
283
+ outputError(`Task not found: ${taskIdPrefix}`);
284
+ process.exit(1);
285
+ }
286
+ const task = result.task;
287
+ // Build output
288
+ const outputData = {
289
+ id: task.id,
290
+ status: task.status,
291
+ contextId: task.contextId,
292
+ messageCount: task.messages?.length ?? 0,
293
+ artifactCount: task.artifacts?.length ?? 0,
294
+ createdAt: task.createdAt,
295
+ updatedAt: task.updatedAt,
296
+ messages: historyLength > 0 ? task.messages?.slice(-historyLength) : [],
297
+ artifacts: task.artifacts,
298
+ };
299
+ output(outputData);
300
+ }
301
+ // ===== task show =====
302
+ cmd
303
+ .command('show <agent> <taskId>')
304
+ .description('Show task details')
305
+ .option('--history <n>', 'Message history length', '10')
306
+ .action(async (agent, taskId, options) => {
307
+ try {
308
+ await handleTaskShow(agent, taskId, options);
309
+ }
310
+ catch (error) {
311
+ outputError('Failed to get task', error instanceof Error ? error : undefined);
312
+ process.exit(1);
313
+ }
314
+ });
315
+ /**
316
+ * Resolve task ID prefix to full ID
317
+ */
318
+ async function resolveTaskId(client, taskIdPrefix) {
319
+ // First try to list tasks and find matches
320
+ const listResult = await client.listTasks({});
321
+ if (!listResult.ok || !listResult.response) {
322
+ return taskIdPrefix; // Fall back to original
323
+ }
324
+ const matches = listResult.response.tasks.filter((t) => t.id.startsWith(taskIdPrefix));
325
+ if (matches.length === 1) {
326
+ return matches[0].id;
327
+ }
328
+ else if (matches.length > 1) {
329
+ outputError(`Ambiguous task ID prefix '${taskIdPrefix}'. Matches: ${matches.map((t) => t.id).join(', ')}`);
330
+ process.exit(1);
331
+ }
332
+ return taskIdPrefix; // No matches, return as-is
333
+ }
334
+ // ===== task cancel =====
335
+ cmd
336
+ .command('cancel <agent> <taskId>')
337
+ .description('Cancel a task')
338
+ .action(async (agent, taskIdPrefix) => {
339
+ try {
340
+ // Create client
341
+ const configDir = dirname(getConfigPath());
342
+ const clientResult = await createA2AClient(configDir, agent);
343
+ if (!clientResult.ok) {
344
+ if (clientResult.error?.includes('ECONNREFUSED') || clientResult.error?.includes('fetch failed')) {
345
+ outputError(`Cannot connect to agent. Is it running? (${clientResult.error})`);
346
+ }
347
+ else {
348
+ outputError(clientResult.error || 'Failed to create client');
349
+ }
350
+ process.exit(1);
351
+ }
352
+ // Resolve task ID prefix
353
+ const taskId = await resolveTaskId(clientResult.client, taskIdPrefix);
354
+ if (!taskId) {
355
+ outputError(`Task not found: ${taskIdPrefix}`);
356
+ process.exit(1);
357
+ }
358
+ // Cancel task
359
+ const result = await clientResult.client.cancelTask(taskId);
360
+ if (!result.ok) {
361
+ if (result.error?.includes('404') || result.error?.includes('not found')) {
362
+ outputError(`Task not found: ${taskId} (${result.error})`);
363
+ }
364
+ else if (result.error?.includes('already')) {
365
+ outputError(`Task already canceled or in final state: ${taskId} (${result.error})`);
366
+ }
367
+ else {
368
+ outputError(result.error || `Failed to cancel task: ${taskId}`);
369
+ }
370
+ process.exit(1);
371
+ }
372
+ // Record task cancellation event
373
+ if (result.task) {
374
+ recordTaskCompletion(configDir, agent, taskId, result.task.status);
375
+ const canceledTask = {
376
+ id: result.task.id,
377
+ status: result.task.status,
378
+ updatedAt: result.task.updatedAt,
379
+ };
380
+ outputSuccess(`Task '${taskId}' canceled`, canceledTask);
381
+ }
382
+ else {
383
+ // No task returned but cancel succeeded
384
+ recordTaskCompletion(configDir, agent, taskId, 'canceled');
385
+ outputSuccess(`Task '${taskId}' canceled`);
386
+ }
387
+ }
388
+ catch (error) {
389
+ outputError('Failed to cancel task', error instanceof Error ? error : undefined);
390
+ process.exit(1);
391
+ }
392
+ });
393
+ // ===== task wait =====
394
+ cmd
395
+ .command('wait <agent> <taskId>')
396
+ .description('Wait for task completion (poll until completed/failed/canceled/rejected)')
397
+ .option('--timeout <sec>', 'Timeout in seconds (default: 60)', '60')
398
+ .option('--interval <sec>', 'Poll interval in seconds (default: 2)', '2')
399
+ .option('--follow', 'Show new messages in real-time while waiting')
400
+ .action(async (agent, taskIdPrefix, options) => {
401
+ try {
402
+ // Parse options
403
+ const timeoutSec = parseInt(options.timeout, 10);
404
+ const intervalSec = parseInt(options.interval, 10);
405
+ const follow = options.follow === true;
406
+ if (isNaN(timeoutSec) || timeoutSec <= 0) {
407
+ outputError('Timeout must be a positive integer');
408
+ process.exit(1);
409
+ }
410
+ if (isNaN(intervalSec) || intervalSec <= 0) {
411
+ outputError('Interval must be a positive integer');
412
+ process.exit(1);
413
+ }
414
+ const startTime = Date.now();
415
+ const timeoutMs = timeoutSec * 1000;
416
+ const intervalMs = intervalSec * 1000;
417
+ // Create client
418
+ const configDir = dirname(getConfigPath());
419
+ const clientResult = await createA2AClient(configDir, agent);
420
+ if (!clientResult.ok) {
421
+ if (clientResult.error?.includes('ECONNREFUSED') || clientResult.error?.includes('fetch failed')) {
422
+ outputError(`Cannot connect to agent. Is it running? (${clientResult.error})`);
423
+ }
424
+ else {
425
+ outputError(clientResult.error || 'Failed to create client');
426
+ }
427
+ process.exit(1);
428
+ }
429
+ const client = clientResult.client;
430
+ const finalStatuses = ['completed', 'failed', 'canceled', 'rejected'];
431
+ // Resolve task ID prefix
432
+ const taskId = await resolveTaskId(client, taskIdPrefix);
433
+ if (!taskId) {
434
+ outputError(`Task not found: ${taskIdPrefix}`);
435
+ process.exit(1);
436
+ }
437
+ // Track last seen message count for --follow
438
+ let lastMessageCount = 0;
439
+ // Initial fetch to get baseline
440
+ const initialResult = await client.getTask(taskId);
441
+ if (initialResult.ok && initialResult.task) {
442
+ lastMessageCount = initialResult.task.messages?.length ?? 0;
443
+ // Record initial status (recordTaskUpdate handles deduplication internally)
444
+ recordTaskUpdate(configDir, agent, taskId, initialResult.task.status);
445
+ }
446
+ // Poll loop
447
+ while (true) {
448
+ // Check timeout
449
+ const elapsed = Date.now() - startTime;
450
+ if (elapsed > timeoutMs) {
451
+ // Record timeout event
452
+ recordTaskTimeout(configDir, agent, taskId, `Timeout after ${timeoutSec}s`);
453
+ outputError(`Timeout after ${timeoutSec}s`);
454
+ process.exit(1);
455
+ }
456
+ // Get task status
457
+ const result = await client.getTask(taskId);
458
+ if (!result.ok) {
459
+ // Record poll error (distinct from timeout)
460
+ recordTaskPollError(configDir, agent, taskId, result.error);
461
+ if (result.error?.includes('404') || result.error?.includes('not found')) {
462
+ outputError(`Task not found: ${taskId} (${result.error})`);
463
+ }
464
+ else {
465
+ outputError(result.error || `Failed to get task status: ${taskId}`);
466
+ }
467
+ process.exit(1);
468
+ }
469
+ if (!result.task) {
470
+ outputError(`Task not found: ${taskId}`);
471
+ process.exit(1);
472
+ }
473
+ const task = result.task;
474
+ // Record status update (recordTaskUpdate handles deduplication internally)
475
+ recordTaskUpdate(configDir, agent, taskId, task.status);
476
+ // --follow: Show new messages since last check
477
+ if (follow && task.messages && task.messages.length > lastMessageCount) {
478
+ const newMessages = task.messages.slice(lastMessageCount);
479
+ for (const msg of newMessages) {
480
+ const timestamp = new Date().toLocaleTimeString(undefined, { hour12: false });
481
+ // Extract text from parts
482
+ const text = msg.parts
483
+ ?.map(p => {
484
+ if ('text' in p && p.text)
485
+ return p.text;
486
+ if ('data' in p)
487
+ return `[${p.mimeType || 'data'}]`;
488
+ return '';
489
+ })
490
+ .filter(Boolean)
491
+ .join('') || '(no content)';
492
+ console.log(`[${timestamp}] ${text}`);
493
+ }
494
+ lastMessageCount = task.messages.length;
495
+ }
496
+ // Check if final status
497
+ if (finalStatuses.includes(task.status)) {
498
+ // Record completion event
499
+ recordTaskCompletion(configDir, agent, taskId, task.status, task.messages);
500
+ output({
501
+ id: task.id,
502
+ status: task.status,
503
+ messageCount: task.messages?.length ?? 0,
504
+ createdAt: task.createdAt,
505
+ updatedAt: task.updatedAt,
506
+ });
507
+ break;
508
+ }
509
+ // Wait before next poll
510
+ await new Promise(resolve => setTimeout(resolve, intervalMs));
511
+ }
512
+ }
513
+ catch (error) {
514
+ outputError('Failed to wait for task', error instanceof Error ? error : undefined);
515
+ process.exit(1);
516
+ }
517
+ });
518
+ return cmd;
519
+ }
520
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAUtC;;GAEG;AACH,wBAAgB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD;AAmWD;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAkBjE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAkBjE;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAUlC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAqBjF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAMjF;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,CAuEjE;AAUD;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAgDvE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA0CrG;AAED,wBAAgB,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAuHrG"}
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAUtC;;GAEG;AACH,wBAAgB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD;AA6ZD;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAkBjE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAkBjE;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAUlC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAqBjF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAMjF;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,CAuEjE;AAWD;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAgDvE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA0CrG;AAED,wBAAgB,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAuHrG"}
@@ -4,7 +4,7 @@
4
4
  import Database from 'better-sqlite3';
5
5
  import { join } from 'path';
6
6
  import { mkdirSync, statSync } from 'fs';
7
- import { EVENTS_DB_SCHEMA, PROOFS_DB_SCHEMA, EVENTS_DB_VERSION, PROOFS_DB_VERSION, EVENTS_DB_MIGRATION_1_TO_2, EVENTS_DB_MIGRATION_2_TO_3, EVENTS_DB_MIGRATION_3_TO_4, EVENTS_DB_MIGRATION_4_TO_5, EVENTS_DB_MIGRATION_5_TO_6, EVENTS_DB_MIGRATION_5_TO_6_DATA, PROOFS_DB_MIGRATION_1_TO_2 } from './schema.js';
7
+ import { EVENTS_DB_SCHEMA, PROOFS_DB_SCHEMA, EVENTS_DB_VERSION, PROOFS_DB_VERSION, EVENTS_DB_MIGRATION_1_TO_2, EVENTS_DB_MIGRATION_2_TO_3, EVENTS_DB_MIGRATION_3_TO_4, EVENTS_DB_MIGRATION_4_TO_5, EVENTS_DB_MIGRATION_5_TO_6, EVENTS_DB_MIGRATION_5_TO_6_DATA, EVENTS_DB_MIGRATION_6_TO_7, EVENTS_DB_MIGRATION_7_TO_8, PROOFS_DB_MIGRATION_1_TO_2 } from './schema.js';
8
8
  import { getDefaultConfigDir } from '../utils/config-path.js';
9
9
  let eventsDb = null;
10
10
  let proofsDb = null;
@@ -277,6 +277,60 @@ function runEventsMigrations(db, fromVersion) {
277
277
  throw err;
278
278
  }
279
279
  }
280
+ // Migration 6 → 7: Add task_events table (Phase 2.4)
281
+ if (fromVersion < 7) {
282
+ try {
283
+ db.exec('BEGIN TRANSACTION');
284
+ const statements = EVENTS_DB_MIGRATION_6_TO_7
285
+ .split(';')
286
+ .map(s => s.trim())
287
+ .filter(s => s.length > 0 && !s.startsWith('--'));
288
+ for (const stmt of statements) {
289
+ try {
290
+ db.exec(stmt + ';');
291
+ }
292
+ catch (err) {
293
+ // Ignore "table already exists" and "index already exists" errors
294
+ if (err instanceof Error &&
295
+ !err.message.includes('already exists')) {
296
+ throw err;
297
+ }
298
+ }
299
+ }
300
+ db.exec('COMMIT');
301
+ }
302
+ catch (err) {
303
+ db.exec('ROLLBACK');
304
+ throw err;
305
+ }
306
+ }
307
+ // Migration 7 → 8: Add ui_events table (Phase 6.2)
308
+ if (fromVersion < 8) {
309
+ try {
310
+ db.exec('BEGIN TRANSACTION');
311
+ const statements = EVENTS_DB_MIGRATION_7_TO_8
312
+ .split(';')
313
+ .map(s => s.trim())
314
+ .filter(s => s.length > 0 && !s.startsWith('--'));
315
+ for (const stmt of statements) {
316
+ try {
317
+ db.exec(stmt + ';');
318
+ }
319
+ catch (err) {
320
+ // Ignore "table already exists" and "index already exists" errors
321
+ if (err instanceof Error &&
322
+ !err.message.includes('already exists')) {
323
+ throw err;
324
+ }
325
+ }
326
+ }
327
+ db.exec('COMMIT');
328
+ }
329
+ catch (err) {
330
+ db.exec('ROLLBACK');
331
+ throw err;
332
+ }
333
+ }
280
334
  }
281
335
  /**
282
336
  * Initialize proofs.db with migrations
@@ -499,6 +553,7 @@ const VALID_SESSION_COLUMNS = new Map([
499
553
  ['actor_kind', 'TEXT'],
500
554
  ['actor_label', 'TEXT'],
501
555
  ['secret_ref_count', 'INTEGER NOT NULL DEFAULT 0'],
556
+ ['target_id', 'TEXT'],
502
557
  ]);
503
558
  /**
504
559
  * Run diagnostics on proofs.db without modifying it