agim-cli 1.1.1 → 1.1.3

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 (76) hide show
  1. package/CHANGELOG.md +147 -0
  2. package/README.md +8 -1
  3. package/README.zh-CN.md +8 -1
  4. package/dist/cli.js +265 -30
  5. package/dist/cli.js.map +1 -1
  6. package/dist/core/a2a.d.ts +55 -0
  7. package/dist/core/a2a.d.ts.map +1 -0
  8. package/dist/core/a2a.js +254 -0
  9. package/dist/core/a2a.js.map +1 -0
  10. package/dist/core/approval-bus.d.ts +40 -0
  11. package/dist/core/approval-bus.d.ts.map +1 -1
  12. package/dist/core/approval-bus.js +125 -0
  13. package/dist/core/approval-bus.js.map +1 -1
  14. package/dist/core/approval-router.d.ts.map +1 -1
  15. package/dist/core/approval-router.js +31 -2
  16. package/dist/core/approval-router.js.map +1 -1
  17. package/dist/core/artifacts.d.ts +86 -0
  18. package/dist/core/artifacts.d.ts.map +1 -0
  19. package/dist/core/artifacts.js +306 -0
  20. package/dist/core/artifacts.js.map +1 -0
  21. package/dist/core/commands/a2a.d.ts +3 -0
  22. package/dist/core/commands/a2a.d.ts.map +1 -0
  23. package/dist/core/commands/a2a.js +162 -0
  24. package/dist/core/commands/a2a.js.map +1 -0
  25. package/dist/core/commands/job.d.ts.map +1 -1
  26. package/dist/core/commands/job.js +11 -2
  27. package/dist/core/commands/job.js.map +1 -1
  28. package/dist/core/commands/outbox.d.ts +3 -0
  29. package/dist/core/commands/outbox.d.ts.map +1 -0
  30. package/dist/core/commands/outbox.js +92 -0
  31. package/dist/core/commands/outbox.js.map +1 -0
  32. package/dist/core/job-board.d.ts +122 -1
  33. package/dist/core/job-board.d.ts.map +1 -1
  34. package/dist/core/job-board.js +432 -21
  35. package/dist/core/job-board.js.map +1 -1
  36. package/dist/core/job-recovery.d.ts +48 -0
  37. package/dist/core/job-recovery.d.ts.map +1 -0
  38. package/dist/core/job-recovery.js +185 -0
  39. package/dist/core/job-recovery.js.map +1 -0
  40. package/dist/core/message-sink.d.ts +63 -0
  41. package/dist/core/message-sink.d.ts.map +1 -0
  42. package/dist/core/message-sink.js +296 -0
  43. package/dist/core/message-sink.js.map +1 -0
  44. package/dist/core/outbox.d.ts +71 -0
  45. package/dist/core/outbox.d.ts.map +1 -0
  46. package/dist/core/outbox.js +301 -0
  47. package/dist/core/outbox.js.map +1 -0
  48. package/dist/core/reminders.d.ts.map +1 -1
  49. package/dist/core/reminders.js +12 -1
  50. package/dist/core/reminders.js.map +1 -1
  51. package/dist/core/restart-completion.d.ts.map +1 -1
  52. package/dist/core/restart-completion.js +18 -1
  53. package/dist/core/restart-completion.js.map +1 -1
  54. package/dist/core/router.d.ts +8 -0
  55. package/dist/core/router.d.ts.map +1 -1
  56. package/dist/core/router.js +16 -0
  57. package/dist/core/router.js.map +1 -1
  58. package/dist/core/types.d.ts +22 -0
  59. package/dist/core/types.d.ts.map +1 -1
  60. package/dist/plugins/agents/claude-code/index.d.ts.map +1 -1
  61. package/dist/plugins/agents/claude-code/index.js +5 -0
  62. package/dist/plugins/agents/claude-code/index.js.map +1 -1
  63. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts +46 -0
  64. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -1
  65. package/dist/plugins/agents/claude-code/mcp-approval-server.js +158 -0
  66. package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
  67. package/dist/plugins/agents/codex/index.d.ts.map +1 -1
  68. package/dist/plugins/agents/codex/index.js +5 -0
  69. package/dist/plugins/agents/codex/index.js.map +1 -1
  70. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -1
  71. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +5 -0
  72. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -1
  73. package/dist/web/server.d.ts.map +1 -1
  74. package/dist/web/server.js +28 -16
  75. package/dist/web/server.js.map +1 -1
  76. package/package.json +1 -1
@@ -75,23 +75,84 @@ function reapStaleRunning(d) {
75
75
  }
76
76
  }
77
77
  /**
78
- * Idempotent column-add for ownership tracking. Run on every helper init —
79
- * SQLite's ALTER TABLE ADD COLUMN throws "duplicate column name" if the
80
- * column already exists, which we silently swallow. Cheaper than the full
81
- * pragma table_info() inspection round-trip.
78
+ * Idempotent column-adds. Run on every helper init — SQLite's ALTER TABLE
79
+ * ADD COLUMN throws "duplicate column name" if the column already exists,
80
+ * which we silently swallow. Cheaper than the full pragma table_info()
81
+ * inspection round-trip.
82
+ *
83
+ * Columns added over time:
84
+ * - creator_id / workspace_id : ownership (v1.0.x)
85
+ * - thread_key : `${platform}:${channelId}:${threadId}` — needed
86
+ * so Phase 3 can recover an interrupted inline
87
+ * job back to the right IM thread.
88
+ * - kind : 'job' (explicit /job, retention 30d) vs
89
+ * 'inline' (auto-tracked inbound, retention 24h).
90
+ * - started_at / delivered_at : finer-grained lifecycle stamps.
91
+ * - replaced_by : when user retries an interrupted job, the
92
+ * old row points at the new one.
93
+ * - last_outbox_id : link to the outbox row that delivered (or is
94
+ * trying to deliver) this job's result.
95
+ * - parent_id : Phase A2A-L1 — when one agent calls another via
96
+ * mcp__imhub__call_agent, the callee's row points
97
+ * back at the caller's row. NULL on user-originated
98
+ * rows.
99
+ * - call_depth : Phase A2A-L1 — 0 for user-originated rows; +1 per
100
+ * nesting level. Lets us reject runaway chains
101
+ * (IMHUB_A2A_MAX_DEPTH, default 3).
82
102
  */
83
- function migrateOwnership(d) {
84
- for (const col of ['creator_id', 'workspace_id']) {
103
+ function migrateColumns(d) {
104
+ // [column, type] — type must include any NOT NULL / DEFAULT clauses.
105
+ const adds = [
106
+ ['creator_id', `TEXT NOT NULL DEFAULT ''`],
107
+ ['workspace_id', `TEXT NOT NULL DEFAULT ''`],
108
+ ['thread_key', `TEXT NOT NULL DEFAULT ''`],
109
+ ['kind', `TEXT NOT NULL DEFAULT 'job'`],
110
+ ['started_at', `TEXT`],
111
+ ['delivered_at', `TEXT`],
112
+ ['replaced_by', `INTEGER`],
113
+ ['last_outbox_id', `INTEGER`],
114
+ ['parent_id', `INTEGER`],
115
+ ['call_depth', `INTEGER NOT NULL DEFAULT 0`],
116
+ ];
117
+ for (const [col, type] of adds) {
85
118
  try {
86
- d.prepare(`ALTER TABLE jobs ADD COLUMN ${col} TEXT NOT NULL DEFAULT ''`).run();
119
+ d.prepare(`ALTER TABLE jobs ADD COLUMN ${col} ${type}`).run();
87
120
  rootLogger.info({ component: 'job-board', column: col, event: 'job-board.migration' }, `Added ${col} column to jobs table`);
88
121
  }
89
122
  catch {
90
123
  // duplicate column — already migrated
91
124
  }
92
125
  }
126
+ // All indexes that reference columns added by migrateColumns above. Each
127
+ // create is wrapped individually so a single failure (corrupt index, etc.)
128
+ // doesn't kill the rest. IF NOT EXISTS handles idempotency on warm starts.
129
+ const indexes = [
130
+ // v1.0 ownership indexes — moved out of the schema string because the
131
+ // schema runs before migrateColumns, and a pre-v1.0 jobs.db doesn't have
132
+ // creator_id yet at schema-exec time. Putting them here makes them run
133
+ // AFTER the ALTER TABLE that adds the column.
134
+ `CREATE INDEX IF NOT EXISTS idx_jobs_creator ON jobs(creator_id)`,
135
+ `CREATE INDEX IF NOT EXISTS idx_jobs_status_created ON jobs(status, created_at)`,
136
+ // Phase 2 indexes — retention split (kind) + recovery sweep (kind +
137
+ // status + thread_key).
138
+ `CREATE INDEX IF NOT EXISTS idx_jobs_kind_status ON jobs(kind, status)`,
139
+ `CREATE INDEX IF NOT EXISTS idx_jobs_thread_key ON jobs(thread_key)`,
140
+ `CREATE INDEX IF NOT EXISTS idx_jobs_last_outbox ON jobs(last_outbox_id) WHERE last_outbox_id IS NOT NULL`,
141
+ // A2A-L1 — fast "children of parent_id" lookup for /a2a stats + audit
142
+ // join. parent_id is sparse (only rows from mcp__imhub__call_agent) so
143
+ // the partial index keeps it small.
144
+ `CREATE INDEX IF NOT EXISTS idx_jobs_parent ON jobs(parent_id) WHERE parent_id IS NOT NULL`,
145
+ ];
146
+ for (const sql of indexes) {
147
+ try {
148
+ d.prepare(sql).run();
149
+ }
150
+ catch (err) {
151
+ rootLogger.warn({ component: 'job-board', event: 'job-board.index_create_failed', sql, err: err instanceof Error ? err.message : String(err) }, 'index create failed (continuing)');
152
+ }
153
+ }
93
154
  }
94
- /** Default number of days a completed/failed/cancelled job is retained. */
155
+ /** Default retention (days) for terminal explicit /job rows. */
95
156
  function resolveRetentionDays() {
96
157
  const raw = process.env.IM_HUB_JOB_RETENTION_DAYS;
97
158
  if (raw) {
@@ -101,6 +162,20 @@ function resolveRetentionDays() {
101
162
  }
102
163
  return 30;
103
164
  }
165
+ /** Retention (hours) for terminal inline jobs. Inline rows are auto-tracked
166
+ * from every inbound IM message — they accrue 100s of rows/day even on a
167
+ * quiet thread, so the default is much shorter than the explicit /job 30-day
168
+ * retention. Phase 3's recovery sweep needs at least the user's "回 1 重发"
169
+ * window, so don't drop below ~6h in production. */
170
+ function resolveInlineRetentionHours() {
171
+ const raw = process.env.IMHUB_INLINE_JOB_RETENTION_HOURS;
172
+ if (raw) {
173
+ const n = parseInt(raw, 10);
174
+ if (Number.isFinite(n) && n > 0)
175
+ return n;
176
+ }
177
+ return 24;
178
+ }
104
179
  /** How often pruneOldJobs() is fired by the auto-sweep timer. 0 disables. */
105
180
  const RETENTION_SWEEP_INTERVAL_MS = 6 * 60 * 60 * 1000;
106
181
  let retentionSweepTimer = null;
@@ -108,6 +183,16 @@ const helper = createSqliteHelper({
108
183
  file: BOARD_DB,
109
184
  component: 'job-board',
110
185
  logger: rootLogger,
186
+ // Schema only declares columns that have ALWAYS existed (v0.x onward).
187
+ // creator_id / workspace_id / Phase-2 columns are added in migrateColumns
188
+ // via idempotent ALTER TABLE, because legacy production dbs predate the
189
+ // v1.0 ownership migration. Indexes that reference any of those columns
190
+ // also live in migrateColumns — running them here against a pre-v1.0
191
+ // table throws "no such column" and broke the entire helper:
192
+ // sqlite-helper enters the "broken" state on any schema exec error
193
+ // → every subsequent get() returns null → job-board permanently disabled.
194
+ // That bug shipped from v1.0 onward but only surfaced once Phase 2
195
+ // landed and someone ran a fresh agim binary against a legacy jobs.db.
111
196
  schema: `
112
197
  CREATE TABLE IF NOT EXISTS jobs (
113
198
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -117,16 +202,12 @@ const helper = createSqliteHelper({
117
202
  result TEXT,
118
203
  error TEXT,
119
204
  created_at TEXT NOT NULL DEFAULT (datetime('now')),
120
- completed_at TEXT,
121
- creator_id TEXT NOT NULL DEFAULT '',
122
- workspace_id TEXT NOT NULL DEFAULT ''
205
+ completed_at TEXT
123
206
  );
124
207
  CREATE INDEX IF NOT EXISTS idx_jobs_created ON jobs(created_at);
125
- CREATE INDEX IF NOT EXISTS idx_jobs_creator ON jobs(creator_id);
126
- CREATE INDEX IF NOT EXISTS idx_jobs_status_created ON jobs(status, created_at);
127
208
  `,
128
209
  init: (d) => {
129
- migrateOwnership(d);
210
+ migrateColumns(d);
130
211
  // First-time / cold-start cleanup: any 'running' rows are leftover from a
131
212
  // prior process that didn't get to finalize.
132
213
  reapStaleRunning(d);
@@ -145,6 +226,149 @@ const helper = createSqliteHelper({
145
226
  }
146
227
  },
147
228
  });
229
+ /** Phase 3 — shutdown step. Mark every running inline job as 'interrupted'
230
+ * so the next startup can offer the user a retry. Returns the row count for
231
+ * logging. Safe to call on a degraded DB (returns 0). */
232
+ export function markRunningInlineJobsInterrupted(reason = 'agim shutdown') {
233
+ const d = getDb();
234
+ if (!d)
235
+ return 0;
236
+ try {
237
+ const info = d.prepare(`UPDATE jobs
238
+ SET status = 'interrupted',
239
+ completed_at = datetime('now'),
240
+ error = ?
241
+ WHERE kind = 'inline'
242
+ AND status IN ('pending', 'running')`).run(reason.slice(0, 1024));
243
+ if (info.changes > 0) {
244
+ rootLogger.info({ component: 'job-board', event: 'job-board.interrupted', count: info.changes, reason }, `Marked ${info.changes} inline job(s) as interrupted (${reason})`);
245
+ }
246
+ return info.changes;
247
+ }
248
+ catch (err) {
249
+ rootLogger.warn({ component: 'job-board', event: 'job-board.interrupt_failed', err: err instanceof Error ? err.message : String(err) }, 'markRunningInlineJobsInterrupted failed');
250
+ return 0;
251
+ }
252
+ }
253
+ /** Phase 3 — startup scan. Return interrupted inline jobs that finished
254
+ * within the recovery window (default 10 min via IMHUB_RECOVERY_WINDOW_MS).
255
+ * Caller iterates the result, sends a per-thread "retry / cancel" prompt,
256
+ * and tracks the user's reply via the in-memory pending-retry map.
257
+ *
258
+ * Older interrupted rows are NOT returned — they get swept to 'abandoned'
259
+ * by sweepAbandonedInterrupted() so they don't pile up in the table. */
260
+ export function findRecoverableInterrupted(windowMs) {
261
+ const d = getDb();
262
+ if (!d)
263
+ return [];
264
+ const ms = windowMs ?? resolveRecoveryWindowMs();
265
+ const seconds = Math.max(1, Math.floor(ms / 1000));
266
+ try {
267
+ return d.prepare(`SELECT * FROM jobs
268
+ WHERE kind = 'inline'
269
+ AND status = 'interrupted'
270
+ AND completed_at >= datetime('now', '-' || ? || ' seconds')
271
+ AND thread_key <> ''
272
+ ORDER BY completed_at ASC`).all(seconds);
273
+ }
274
+ catch (err) {
275
+ rootLogger.warn({ component: 'job-board', event: 'job-board.recover_query_failed', err: err instanceof Error ? err.message : String(err) }, 'findRecoverableInterrupted failed');
276
+ return [];
277
+ }
278
+ }
279
+ /** Phase 3 — startup sweep. Any 'interrupted' inline row past the recovery
280
+ * window transitions to 'abandoned' (preserved for audit but never
281
+ * notified). Returns the row count. */
282
+ export function sweepAbandonedInterrupted(windowMs) {
283
+ const d = getDb();
284
+ if (!d)
285
+ return 0;
286
+ const ms = windowMs ?? resolveRecoveryWindowMs();
287
+ const seconds = Math.max(1, Math.floor(ms / 1000));
288
+ try {
289
+ const info = d.prepare(`UPDATE jobs
290
+ SET status = 'abandoned'
291
+ WHERE kind = 'inline'
292
+ AND status = 'interrupted'
293
+ AND completed_at < datetime('now', '-' || ? || ' seconds')`).run(seconds);
294
+ if (info.changes > 0) {
295
+ rootLogger.info({ component: 'job-board', event: 'job-board.abandoned', count: info.changes }, `Swept ${info.changes} stale interrupted inline job(s) to 'abandoned'`);
296
+ }
297
+ return info.changes;
298
+ }
299
+ catch (err) {
300
+ rootLogger.warn({ component: 'job-board', event: 'job-board.abandon_failed', err: err instanceof Error ? err.message : String(err) }, 'sweepAbandonedInterrupted failed');
301
+ return 0;
302
+ }
303
+ }
304
+ /** Phase 3 — link an old interrupted row to its replacement once the user
305
+ * picks "1 重发". The new row's id lands in `replaced_by`; the old row
306
+ * transitions interrupted → replaced so it stops showing up in any future
307
+ * recovery scan. */
308
+ export function markJobReplacedBy(oldId, newId) {
309
+ if (oldId <= 0 || newId <= 0)
310
+ return;
311
+ const d = getDb();
312
+ if (!d)
313
+ return;
314
+ try {
315
+ d.prepare(`UPDATE jobs
316
+ SET status = 'replaced',
317
+ replaced_by = ?
318
+ WHERE id = ? AND status = 'interrupted'`).run(newId, oldId);
319
+ }
320
+ catch (err) {
321
+ rootLogger.debug({ component: 'job-board', event: 'markJobReplacedBy_failed', oldId, newId, err: String(err) });
322
+ }
323
+ }
324
+ /** Phase 3 — user picked "2 取消" on the retry prompt. Interrupted → cancelled. */
325
+ export function markInterruptedCancelled(id) {
326
+ if (id <= 0)
327
+ return;
328
+ const d = getDb();
329
+ if (!d)
330
+ return;
331
+ try {
332
+ d.prepare(`UPDATE jobs
333
+ SET status = 'cancelled'
334
+ WHERE id = ? AND status = 'interrupted'`).run(id);
335
+ }
336
+ catch (err) {
337
+ rootLogger.debug({ component: 'job-board', event: 'markInterruptedCancelled_failed', id, err: String(err) });
338
+ }
339
+ }
340
+ /** Recovery window in milliseconds. Default 10 minutes. Env override
341
+ * IMHUB_RECOVERY_WINDOW_MS. */
342
+ function resolveRecoveryWindowMs() {
343
+ const raw = process.env.IMHUB_RECOVERY_WINDOW_MS;
344
+ if (raw) {
345
+ const n = parseInt(raw, 10);
346
+ if (Number.isFinite(n) && n > 0)
347
+ return n;
348
+ }
349
+ return 10 * 60 * 1000;
350
+ }
351
+ /** Exported for the recovery module so it can use the same window for the
352
+ * user-facing "10 min 内有效" copy. */
353
+ export function getRecoveryWindowMs() {
354
+ return resolveRecoveryWindowMs();
355
+ }
356
+ /** Test hook: artificially age a row's completed_at (or created_at) by a
357
+ * SQLite modifier like '-2 hours' or '-40 days'. Production code must NOT
358
+ * call this; it's the only practical way to exercise retention without
359
+ * sleeping in tests. */
360
+ export function _backdateForTests(id, modifier) {
361
+ const d = getDb();
362
+ if (!d)
363
+ return;
364
+ try {
365
+ d.prepare(`UPDATE jobs
366
+ SET completed_at = datetime(COALESCE(completed_at, datetime('now')), ?),
367
+ created_at = datetime(created_at, ?)
368
+ WHERE id = ?`).run(modifier, modifier, id);
369
+ }
370
+ catch { /* tests fail loudly via the next assertion */ }
371
+ }
148
372
  /** Stop the retention sweep (used by tests + graceful shutdown). */
149
373
  export function stopJobRetentionSweep() {
150
374
  if (retentionSweepTimer) {
@@ -164,11 +388,40 @@ export function createJob(agent, prompt, opts = {}) {
164
388
  const d = getDb();
165
389
  if (!d)
166
390
  throw new Error('Job board unavailable (SQLite not initialized)');
167
- const row = d.prepare('INSERT INTO jobs (agent, prompt, status, creator_id, workspace_id) VALUES (?, ?, ?, ?, ?)').run(agent, prompt, 'pending', opts.creatorId || '', opts.workspaceId || '');
391
+ const row = d.prepare(`INSERT INTO jobs
392
+ (agent, prompt, status, creator_id, workspace_id, thread_key, kind, parent_id, call_depth)
393
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(agent, prompt, 'pending', opts.creatorId || '', opts.workspaceId || '', opts.threadKey || '', opts.kind || 'job', opts.parentId ?? null, opts.callDepth ?? 0);
168
394
  const id = Number(row.lastInsertRowid);
169
395
  eventBus.publish({ type: 'job', phase: 'created', jobId: id, agent });
170
396
  return id;
171
397
  }
398
+ /** Inline-job convenience: same as createJob but never throws — returns -1
399
+ * when the board is disabled / locked. Caller is expected to log + carry
400
+ * on with the in-memory fast path. The whole tracking machinery short-
401
+ * circuits when env IMHUB_INLINE_JOB_TRACKING=0.
402
+ *
403
+ * parentId/callDepth are A2A-L1 hand-offs: when an agent tool-calls
404
+ * another agent via mcp__imhub__call_agent, the bus routes through here
405
+ * to record the parent/depth relationship. User-originated rows leave
406
+ * these undefined → NULL parent, depth=0. */
407
+ export function createInlineJob(opts) {
408
+ if (process.env.IMHUB_INLINE_JOB_TRACKING === '0')
409
+ return -1;
410
+ try {
411
+ return createJob(opts.agent, opts.prompt, {
412
+ kind: 'inline',
413
+ threadKey: opts.threadKey,
414
+ creatorId: opts.creatorId,
415
+ workspaceId: opts.workspaceId,
416
+ parentId: opts.parentId ?? null,
417
+ callDepth: opts.callDepth ?? 0,
418
+ });
419
+ }
420
+ catch (err) {
421
+ rootLogger.warn({ component: 'job-board', event: 'job-board.inline_create_failed', err: err instanceof Error ? err.message : String(err) }, 'createInlineJob fell back to in-memory path');
422
+ return -1;
423
+ }
424
+ }
172
425
  export function getJob(id, opts = {}) {
173
426
  const d = getDb();
174
427
  if (!d)
@@ -218,6 +471,119 @@ function updateJob(id, fields) {
218
471
  return;
219
472
  d.prepare(`UPDATE jobs SET ${sets.join(', ')} WHERE id = ?`).run(...vals, id);
220
473
  }
474
+ // ─── Inline-job state-machine helpers ────────────────────────────────
475
+ //
476
+ // All of these are no-op when id<=0 (board disabled / inline tracking off)
477
+ // or when the DB is unavailable. The caller never has to guard.
478
+ /** Replace the agent column. Used by inline jobs: cli.ts creates the row with
479
+ * the default agent name before routing resolves the actual agent, then this
480
+ * fires inside onAgentResolved to correct the record. No-op when status is
481
+ * past 'running' so we don't rewrite history. */
482
+ export function updateJobAgent(id, agent) {
483
+ if (id <= 0 || !agent)
484
+ return;
485
+ const d = getDb();
486
+ if (!d)
487
+ return;
488
+ try {
489
+ d.prepare(`UPDATE jobs SET agent = ? WHERE id = ? AND status IN ('pending', 'running')`).run(agent, id);
490
+ }
491
+ catch (err) {
492
+ rootLogger.debug({ component: 'job-board', event: 'updateJobAgent_failed', id, agent, err: String(err) });
493
+ }
494
+ }
495
+ /** pending → running. Stamps started_at. Idempotent: an already-running row
496
+ * keeps its original started_at. */
497
+ export function markJobRunning(id) {
498
+ if (id <= 0)
499
+ return;
500
+ const d = getDb();
501
+ if (!d)
502
+ return;
503
+ try {
504
+ d.prepare(`UPDATE jobs
505
+ SET status = 'running',
506
+ started_at = COALESCE(started_at, datetime('now'))
507
+ WHERE id = ? AND status IN ('pending', 'running')`).run(id);
508
+ }
509
+ catch (err) {
510
+ rootLogger.debug({ component: 'job-board', event: 'markJobRunning_failed', id, err: String(err) });
511
+ }
512
+ }
513
+ /** running → completed (result captured). For inline kind 'delivered' is the
514
+ * next hop, triggered by the outbox worker once the IM platform confirms.
515
+ * For 'job' kind this is the terminal success state (no delivery channel). */
516
+ export function markJobCompleted(id, result) {
517
+ if (id <= 0)
518
+ return;
519
+ const d = getDb();
520
+ if (!d)
521
+ return;
522
+ try {
523
+ d.prepare(`UPDATE jobs
524
+ SET status = 'completed',
525
+ completed_at = datetime('now'),
526
+ result = ?
527
+ WHERE id = ? AND status IN ('pending', 'running')`).run(result, id);
528
+ }
529
+ catch (err) {
530
+ rootLogger.debug({ component: 'job-board', event: 'markJobCompleted_failed', id, err: String(err) });
531
+ }
532
+ }
533
+ /** Link a job row to the outbox row that will (try to) deliver its result.
534
+ * Worker uses outbox.job_id to find this row; this column is the reverse
535
+ * link for /job inspection ("which outbox row carried this reply"). */
536
+ export function linkJobOutbox(id, outboxId) {
537
+ if (id <= 0 || outboxId <= 0)
538
+ return;
539
+ const d = getDb();
540
+ if (!d)
541
+ return;
542
+ try {
543
+ d.prepare(`UPDATE jobs SET last_outbox_id = ? WHERE id = ?`).run(outboxId, id);
544
+ }
545
+ catch (err) {
546
+ rootLogger.debug({ component: 'job-board', event: 'linkJobOutbox_failed', id, outboxId, err: String(err) });
547
+ }
548
+ }
549
+ /** completed → delivered. Called by the outbox worker after the IM platform
550
+ * ack. No-op if the row isn't in 'completed' (e.g. user cancelled meanwhile). */
551
+ export function markJobDelivered(id) {
552
+ if (id <= 0)
553
+ return;
554
+ const d = getDb();
555
+ if (!d)
556
+ return;
557
+ try {
558
+ d.prepare(`UPDATE jobs
559
+ SET status = 'delivered',
560
+ delivered_at = datetime('now')
561
+ WHERE id = ? AND status = 'completed'`).run(id);
562
+ }
563
+ catch (err) {
564
+ rootLogger.debug({ component: 'job-board', event: 'markJobDelivered_failed', id, err: String(err) });
565
+ }
566
+ }
567
+ /** Terminal failure (agent threw, outbox gave up, etc.). Captures the error
568
+ * on the row. completed_at gets stamped so retention sweeps treat the row
569
+ * the same as a normal terminal state. */
570
+ export function markJobFailed(id, error) {
571
+ if (id <= 0)
572
+ return;
573
+ const d = getDb();
574
+ if (!d)
575
+ return;
576
+ try {
577
+ d.prepare(`UPDATE jobs
578
+ SET status = 'failed',
579
+ completed_at = datetime('now'),
580
+ error = ?
581
+ WHERE id = ? AND status NOT IN ('cancelled', 'replaced', 'abandoned')`).run(error.slice(0, 4096), id);
582
+ }
583
+ catch (err) {
584
+ rootLogger.debug({ component: 'job-board', event: 'markJobFailed_failed', id, err: String(err) });
585
+ }
586
+ }
221
587
  /**
222
588
  * Acquire a job slot. Returns immediately when capacity available, otherwise
223
589
  * queues the caller and returns a promise that resolves when a slot frees.
@@ -331,20 +697,65 @@ export function cancelJob(id, opts = {}) {
331
697
  export function pruneOldJobs(d = getDb(), daysRetention = resolveRetentionDays()) {
332
698
  if (!d)
333
699
  return 0;
700
+ const inlineHours = resolveInlineRetentionHours();
701
+ // Terminal statuses across both kinds. 'delivered' is inline-only.
702
+ // 'interrupted' / 'replaced' / 'abandoned' are Phase 3 statuses — pre-
703
+ // declared here so retention works consistently when Phase 3 lands.
704
+ const TERMINAL = "'completed','delivered','failed','cancelled','replaced','abandoned'";
334
705
  try {
335
- const info = d.prepare(`
706
+ // Two passes — different retention by kind. SQLite can't do this in one
707
+ // statement without a CASE-on-window-or-something gnarly; two prepares
708
+ // keeps it readable and the row counts attributable.
709
+ //
710
+ // L2 — collect ids BEFORE delete so we can hand them to artifacts.ts
711
+ // for matching-dir cleanup. Two-step is unavoidable because SQLite
712
+ // doesn't have DELETE … RETURNING. The window is tiny and the side
713
+ // effect (orphaned dirs) is small, so we don't bother with a Tx.
714
+ const jobIdsToDel = d.prepare(`
715
+ SELECT id FROM jobs
716
+ WHERE kind = 'job'
717
+ AND status IN (${TERMINAL})
718
+ AND completed_at IS NOT NULL
719
+ AND completed_at < datetime('now', ?)
720
+ `).all(`-${daysRetention} days`);
721
+ const inlineIdsToDel = d.prepare(`
722
+ SELECT id FROM jobs
723
+ WHERE kind = 'inline'
724
+ AND status IN (${TERMINAL})
725
+ AND COALESCE(completed_at, created_at) < datetime('now', ?)
726
+ `).all(`-${inlineHours} hours`);
727
+ const jobInfo = d.prepare(`
336
728
  DELETE FROM jobs
337
- WHERE status IN ('completed', 'failed', 'cancelled')
729
+ WHERE kind = 'job'
730
+ AND status IN (${TERMINAL})
338
731
  AND completed_at IS NOT NULL
339
732
  AND completed_at < datetime('now', ?)
340
733
  `).run(`-${daysRetention} days`);
341
- if (info.changes > 0) {
734
+ const inlineInfo = d.prepare(`
735
+ DELETE FROM jobs
736
+ WHERE kind = 'inline'
737
+ AND status IN (${TERMINAL})
738
+ AND COALESCE(completed_at, created_at) < datetime('now', ?)
739
+ `).run(`-${inlineHours} hours`);
740
+ const total = jobInfo.changes + inlineInfo.changes;
741
+ // L2 — drop artifacts dirs for everything we just deleted. inline jobs
742
+ // are where the artifacts live, but kind='job' rows might also have
743
+ // them in the future, so we feed both. Fire-and-forget; failures only
744
+ // leave an orphaned dir, not a broken DB.
745
+ const allIds = [...jobIdsToDel, ...inlineIdsToDel].map((r) => r.id);
746
+ if (allIds.length > 0) {
747
+ void import('./artifacts.js')
748
+ .then(({ pruneArtifactsBatch }) => pruneArtifactsBatch(allIds))
749
+ .catch((err) => rootLogger.warn({ component: 'job-board', event: 'job-board.prune.artifacts_failed', err: err instanceof Error ? err.message : String(err) }, 'pruneArtifactsBatch failed (orphaned dirs may remain)'));
750
+ }
751
+ if (total > 0) {
342
752
  rootLogger.info({
343
753
  component: 'job-board', event: 'job-board.pruned',
344
- deleted: info.changes, days: daysRetention,
345
- }, `Pruned ${info.changes} job row(s) older than ${daysRetention}d`);
754
+ deletedJob: jobInfo.changes, deletedInline: inlineInfo.changes,
755
+ days: daysRetention, inlineHours,
756
+ }, `Pruned ${jobInfo.changes} job + ${inlineInfo.changes} inline row(s)`);
346
757
  }
347
- return info.changes;
758
+ return total;
348
759
  }
349
760
  catch (err) {
350
761
  const msg = err instanceof Error ? err.message : String(err);
@@ -1 +1 @@
1
- {"version":3,"file":"job-board.js","sourceRoot":"","sources":["../../src/core/job-board.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"job-board.js","sourceRoot":"","sources":["../../src/core/job-board.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ interface PendingRetry {
2
+ jobId: number;
3
+ agent: string;
4
+ prompt: string;
5
+ threadKey: string;
6
+ platform: string;
7
+ channelId: string;
8
+ threadId: string;
9
+ creatorId: string;
10
+ /** ms-epoch when the entry expires (interrupted_at + window). */
11
+ expiresAt: number;
12
+ }
13
+ /** Test hook — wipe the in-memory state. */
14
+ export declare function _resetPendingForTests(): void;
15
+ /** Test hook — inspect current state. */
16
+ export declare function _peekPendingForTests(): Map<string, PendingRetry>;
17
+ /** Run once on agim startup, after messengers + sink are up. */
18
+ export declare function scanInterruptedAndNotify(): Promise<{
19
+ notified: number;
20
+ abandoned: number;
21
+ }>;
22
+ /** Periodic in-memory expiry sweep. Removes entries whose `expiresAt` has
23
+ * passed without a user reply. Called from cli.ts on a setInterval. */
24
+ export declare function sweepExpiredPending(now?: number): number;
25
+ /** Result of a recovery-reply attempt. */
26
+ export type RecoveryReplyOutcome = {
27
+ kind: 'not-pending';
28
+ } | {
29
+ kind: 'not-recovery-reply';
30
+ } | {
31
+ kind: 'retried';
32
+ newJobId: number;
33
+ oldJobId: number;
34
+ entry: PendingRetry;
35
+ } | {
36
+ kind: 'cancelled';
37
+ oldJobId: number;
38
+ };
39
+ /** Try to interpret a user's reply as a recovery decision. Returns an
40
+ * outcome the caller can render. Side-effect: on a recognized decision,
41
+ * the pending entry is removed and the DB row transitions. */
42
+ export declare function tryHandleRecoveryReply(threadKey: string, text: string): RecoveryReplyOutcome;
43
+ /** Convenience for cli.ts: was the thread expecting a recovery reply just
44
+ * before we routed this message? Used to skip approval / reminder
45
+ * interceptors when the user is replying to a recovery prompt. */
46
+ export declare function hasPendingRecovery(threadKey: string): boolean;
47
+ export {};
48
+ //# sourceMappingURL=job-recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-recovery.d.ts","sourceRoot":"","sources":["../../src/core/job-recovery.ts"],"names":[],"mappings":"AAyCA,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAA;CAClB;AAOD,4CAA4C;AAC5C,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,yCAAyC;AACzC,wBAAgB,oBAAoB,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAEhE;AA+BD,gEAAgE;AAChE,wBAAsB,wBAAwB,IAAI,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CA8DjG;AAED;wEACwE;AACxE,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAmB,GAAG,MAAM,CAYpE;AAED,0CAA0C;AAC1C,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,oBAAoB,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,GAC5E;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AAE3C;;+DAE+D;AAC/D,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAkC5F;AAED;;mEAEmE;AACnE,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE7D"}