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.
- package/README.ja.md +1 -0
- package/README.md +2 -0
- package/dist/a2a/agent-card.d.ts +2 -0
- package/dist/a2a/agent-card.d.ts.map +1 -1
- package/dist/a2a/agent-card.js +2 -2
- package/dist/a2a/agent-card.js.map +1 -1
- package/dist/a2a/client.d.ts +74 -12
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +228 -29
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/normalizer.d.ts +4 -0
- package/dist/a2a/normalizer.d.ts.map +1 -1
- package/dist/a2a/normalizer.js +7 -4
- package/dist/a2a/normalizer.js.map +1 -1
- package/dist/a2a/session-manager.d.ts +81 -0
- package/dist/a2a/session-manager.d.ts.map +1 -0
- package/dist/a2a/session-manager.js +176 -0
- package/dist/a2a/session-manager.js.map +1 -0
- package/dist/a2a/types.d.ts +60 -0
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/cli.d.ts +2 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +6 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +35 -10
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +12 -10
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/connectors.js +2 -2
- package/dist/commands/connectors.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/plans.js +1 -1
- package/dist/commands/plans.js.map +1 -1
- package/dist/commands/record.js +5 -4
- package/dist/commands/record.js.map +1 -1
- package/dist/commands/rpc.d.ts.map +1 -1
- package/dist/commands/rpc.js +90 -28
- package/dist/commands/rpc.js.map +1 -1
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +8 -10
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/secrets.d.ts.map +1 -1
- package/dist/commands/secrets.js +11 -10
- package/dist/commands/secrets.js.map +1 -1
- package/dist/commands/sessions.js +2 -2
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/summary.d.ts.map +1 -1
- package/dist/commands/summary.js +4 -2
- package/dist/commands/summary.js.map +1 -1
- package/dist/commands/task.d.ts +14 -0
- package/dist/commands/task.d.ts.map +1 -0
- package/dist/commands/task.js +520 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +56 -1
- package/dist/db/connection.js.map +1 -1
- package/dist/db/events-store.d.ts +307 -8
- package/dist/db/events-store.d.ts.map +1 -1
- package/dist/db/events-store.js +620 -26
- package/dist/db/events-store.js.map +1 -1
- package/dist/db/proofs-store.d.ts +8 -1
- package/dist/db/proofs-store.d.ts.map +1 -1
- package/dist/db/proofs-store.js +18 -8
- package/dist/db/proofs-store.js.map +1 -1
- package/dist/db/schema.d.ts +15 -3
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +150 -5
- package/dist/db/schema.js.map +1 -1
- package/dist/db/tool-analysis.d.ts +15 -3
- package/dist/db/tool-analysis.d.ts.map +1 -1
- package/dist/db/tool-analysis.js +35 -17
- package/dist/db/tool-analysis.js.map +1 -1
- package/dist/db/types.d.ts +64 -1
- package/dist/db/types.d.ts.map +1 -1
- package/dist/filter/fields.d.ts.map +1 -1
- package/dist/filter/fields.js +22 -0
- package/dist/filter/fields.js.map +1 -1
- package/dist/filter/parser.js +2 -2
- package/dist/filter/parser.js.map +1 -1
- package/dist/filter/types.d.ts +1 -1
- package/dist/filter/types.d.ts.map +1 -1
- package/dist/html/analytics.test.ts +682 -0
- package/dist/html/analytics.ts +499 -0
- package/dist/html/browser.ts +39 -0
- package/dist/html/index.ts +97 -0
- package/dist/html/rpc-inspector.test.ts +529 -0
- package/dist/html/rpc-inspector.ts +1700 -0
- package/dist/html/templates.js +4 -4
- package/dist/html/templates.js.map +1 -1
- package/dist/html/templates.test.ts +861 -0
- package/dist/html/templates.ts +3163 -0
- package/dist/html/trace-viewer.html +624 -0
- package/dist/html/types.d.ts +3 -3
- package/dist/html/types.d.ts.map +1 -1
- package/dist/html/types.ts +491 -0
- package/dist/html/utils.ts +107 -0
- package/dist/monitor/data/connectors.d.ts.map +1 -1
- package/dist/monitor/data/connectors.js +113 -8
- package/dist/monitor/data/connectors.js.map +1 -1
- package/dist/monitor/data/popl.js +2 -2
- package/dist/monitor/data/popl.js.map +1 -1
- package/dist/monitor/routes/api.js +2 -2
- package/dist/monitor/routes/api.js.map +1 -1
- package/dist/monitor/routes/connectors.js +15 -15
- package/dist/monitor/routes/connectors.js.map +1 -1
- package/dist/monitor/routes/popl.js +5 -5
- package/dist/monitor/routes/popl.js.map +1 -1
- package/dist/monitor/templates/components.js +2 -2
- package/dist/monitor/templates/components.js.map +1 -1
- package/dist/monitor/templates/popl.js +4 -4
- package/dist/monitor/templates/popl.js.map +1 -1
- package/dist/monitor/types.d.ts +2 -2
- package/dist/monitor/types.d.ts.map +1 -1
- package/dist/proxy/bridge-utils.d.ts +41 -0
- package/dist/proxy/bridge-utils.d.ts.map +1 -0
- package/dist/proxy/bridge-utils.js +60 -0
- package/dist/proxy/bridge-utils.js.map +1 -0
- package/dist/proxy/ipc-client.d.ts.map +1 -1
- package/dist/proxy/ipc-client.js +1 -2
- package/dist/proxy/ipc-client.js.map +1 -1
- package/dist/proxy/ipc-server.d.ts.map +1 -1
- package/dist/proxy/ipc-server.js +4 -2
- package/dist/proxy/ipc-server.js.map +1 -1
- package/dist/proxy/mcp-server.d.ts +31 -0
- package/dist/proxy/mcp-server.d.ts.map +1 -1
- package/dist/proxy/mcp-server.js +393 -4
- package/dist/proxy/mcp-server.js.map +1 -1
- package/dist/proxy/types.d.ts +95 -0
- package/dist/proxy/types.d.ts.map +1 -1
- package/dist/secrets/management.d.ts +2 -2
- package/dist/secrets/management.d.ts.map +1 -1
- package/dist/secrets/management.js +7 -7
- package/dist/secrets/management.js.map +1 -1
- package/dist/shell/completer.d.ts.map +1 -1
- package/dist/shell/completer.js +16 -0
- package/dist/shell/completer.js.map +1 -1
- package/dist/shell/context-applicator.d.ts.map +1 -1
- package/dist/shell/context-applicator.js +32 -0
- package/dist/shell/context-applicator.js.map +1 -1
- package/dist/shell/filter-mappers.d.ts +5 -1
- package/dist/shell/filter-mappers.d.ts.map +1 -1
- package/dist/shell/filter-mappers.js +12 -0
- package/dist/shell/filter-mappers.js.map +1 -1
- package/dist/shell/find-command.js +13 -13
- package/dist/shell/find-command.js.map +1 -1
- package/dist/shell/inscribe-commands.js +5 -5
- package/dist/shell/inscribe-commands.js.map +1 -1
- package/dist/shell/pager/less-pager.d.ts +1 -1
- package/dist/shell/pager/less-pager.d.ts.map +1 -1
- package/dist/shell/pager/less-pager.js +5 -2
- package/dist/shell/pager/less-pager.js.map +1 -1
- package/dist/shell/pager/more-pager.d.ts +1 -1
- package/dist/shell/pager/more-pager.d.ts.map +1 -1
- package/dist/shell/pager/more-pager.js +3 -2
- package/dist/shell/pager/more-pager.js.map +1 -1
- package/dist/shell/pager/renderer.d.ts.map +1 -1
- package/dist/shell/pager/renderer.js +66 -15
- package/dist/shell/pager/renderer.js.map +1 -1
- package/dist/shell/pager/types.d.ts +5 -2
- package/dist/shell/pager/types.d.ts.map +1 -1
- package/dist/shell/pager/utils.d.ts +5 -2
- package/dist/shell/pager/utils.d.ts.map +1 -1
- package/dist/shell/pager/utils.js +14 -17
- package/dist/shell/pager/utils.js.map +1 -1
- package/dist/shell/pipeline-types.d.ts +12 -4
- package/dist/shell/pipeline-types.d.ts.map +1 -1
- package/dist/shell/ref-commands.js +7 -7
- package/dist/shell/ref-commands.js.map +1 -1
- package/dist/shell/ref-resolver.d.ts +15 -15
- package/dist/shell/ref-resolver.d.ts.map +1 -1
- package/dist/shell/ref-resolver.js +34 -20
- package/dist/shell/ref-resolver.js.map +1 -1
- package/dist/shell/repl.d.ts +25 -0
- package/dist/shell/repl.d.ts.map +1 -1
- package/dist/shell/repl.js +285 -51
- package/dist/shell/repl.js.map +1 -1
- package/dist/shell/router-commands.d.ts +30 -0
- package/dist/shell/router-commands.d.ts.map +1 -1
- package/dist/shell/router-commands.js +1011 -62
- package/dist/shell/router-commands.js.map +1 -1
- package/dist/shell/selector.d.ts +1 -1
- package/dist/shell/selector.d.ts.map +1 -1
- package/dist/shell/selector.js +1 -1
- package/dist/shell/selector.js.map +1 -1
- package/dist/shell/types.d.ts.map +1 -1
- package/dist/shell/types.js +3 -1
- package/dist/shell/types.js.map +1 -1
- package/dist/shell/where-command.d.ts.map +1 -1
- package/dist/shell/where-command.js +19 -3
- package/dist/shell/where-command.js.map +1 -1
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +7 -1
- package/dist/utils/output.js.map +1 -1
- 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;
|
|
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"}
|
package/dist/db/connection.js
CHANGED
|
@@ -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
|