@sema-agent/core 1.363.0 → 1.365.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 (35) hide show
  1. package/dist/agents/roster-store.d.ts +2 -2
  2. package/dist/agents/roster-store.d.ts.map +1 -1
  3. package/dist/agents/roster-store.js +0 -0
  4. package/dist/agents/roster-store.js.map +1 -1
  5. package/dist/agents/subagent.d.ts +4 -2
  6. package/dist/agents/subagent.d.ts.map +1 -1
  7. package/dist/agents/subagent.js +79 -24
  8. package/dist/agents/subagent.js.map +1 -1
  9. package/dist/core/background-agent-store.d.ts +110 -0
  10. package/dist/core/background-agent-store.d.ts.map +1 -0
  11. package/dist/core/background-agent-store.js +0 -0
  12. package/dist/core/background-agent-store.js.map +1 -0
  13. package/dist/core/runner/prepare-task.d.ts.map +1 -1
  14. package/dist/core/runner/prepare-task.js +2 -1
  15. package/dist/core/runner/prepare-task.js.map +1 -1
  16. package/dist/core/task-registry.d.ts +44 -0
  17. package/dist/core/task-registry.d.ts.map +1 -1
  18. package/dist/core/task-registry.js +354 -8
  19. package/dist/core/task-registry.js.map +1 -1
  20. package/dist/core/types.d.ts +1 -0
  21. package/dist/core/types.d.ts.map +1 -1
  22. package/dist/core/workflow-journal-store.d.ts.map +1 -1
  23. package/dist/core/workflow-journal-store.js.map +1 -1
  24. package/dist/index.d.ts +2 -0
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +2 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/stores/file/background-agent-store.d.ts +49 -0
  29. package/dist/stores/file/background-agent-store.d.ts.map +1 -0
  30. package/dist/stores/file/background-agent-store.js +227 -0
  31. package/dist/stores/file/background-agent-store.js.map +1 -0
  32. package/dist/stores/file/fs-atomic.d.ts.map +1 -1
  33. package/dist/stores/file/fs-atomic.js +17 -1
  34. package/dist/stores/file/fs-atomic.js.map +1 -1
  35. package/package.json +1 -1
@@ -2,6 +2,7 @@ import type { AgentTool, ExecutionEnv } from "../internal/harness.js";
2
2
  import type { ToolEffect } from "./types.js";
3
3
  import { type BackgroundShellCapability, type BackgroundShellId } from "./background-shell.js";
4
4
  import { type WorkflowRunStore } from "./workflow-run-store.js";
5
+ import { type BackgroundAgentRecord, type BackgroundAgentStore } from "./background-agent-store.js";
5
6
  import type { WorkflowHandle } from "../orchestration/workflow.js";
6
7
  import type { TaskNotificationPayload } from "./task-notification.js";
7
8
  export type SemaTaskType = "background_bash" | "workflow" | "background_agent" | "monitor";
@@ -41,9 +42,20 @@ export interface TaskAccess {
41
42
  scope?: string;
42
43
  sessionId?: string;
43
44
  }
45
+ interface DurableAgentLane {
46
+ store: BackgroundAgentStore;
47
+ record: BackgroundAgentRecord;
48
+ chain: Promise<void>;
49
+ written: boolean;
50
+ poisoned: boolean;
51
+ flushFailed: boolean;
52
+ redrives?: number;
53
+ }
44
54
  interface BackgroundAgentTaskHandle extends SemaTaskHandle {
45
55
  type: "background_agent";
46
56
  abort: AbortController;
57
+ sessionId?: string;
58
+ durable?: DurableAgentLane;
47
59
  notify?: (notification: import("./task-notification.js").TaskNotificationPayload, opts?: {
48
60
  priority?: import("./task-notification.js").SystemInjectionPriority;
49
61
  }) => void | "queued" | "parked" | "dropped_duplicate" | Promise<"queued" | "parked" | "dropped_duplicate">;
@@ -120,6 +132,8 @@ export interface RegisterBackgroundAgentInput extends TaskAccess {
120
132
  abort: AbortController;
121
133
  now?: number;
122
134
  sessionScoped?: true;
135
+ id?: string;
136
+ store?: BackgroundAgentStore;
123
137
  }
124
138
  export interface RegisterWorkflowInput extends TaskAccess {
125
139
  runId: string;
@@ -132,6 +146,7 @@ export interface RegisterWorkflowInput extends TaskAccess {
132
146
  }
133
147
  export interface TaskPollOptions {
134
148
  workflowStore?: WorkflowRunStore;
149
+ agentStore?: BackgroundAgentStore;
135
150
  filter?: string;
136
151
  block?: boolean;
137
152
  timeoutMs?: number;
@@ -139,12 +154,15 @@ export interface TaskPollOptions {
139
154
  }
140
155
  export interface TaskStopOptions {
141
156
  workflowStore?: WorkflowRunStore;
157
+ agentStore?: BackgroundAgentStore;
142
158
  }
143
159
  export interface TaskToolOptions extends TaskAccess {
144
160
  registry: TaskRegistry;
145
161
  workflowStore?: WorkflowRunStore;
162
+ agentStore?: BackgroundAgentStore;
146
163
  deadlineMs?: () => number | undefined;
147
164
  }
165
+ export declare const DURABLE_AGENT_HEARTBEAT_MS = 60000;
148
166
  export declare const BG_AGENT_REAP_STOP_ERROR = "stopped (parent task ended or TaskStop)";
149
167
  export declare const MONITOR_BATCH_WINDOW_MS = 200;
150
168
  export declare const MONITOR_DEFAULT_TIMEOUT_MS = 300000;
@@ -157,6 +175,31 @@ export declare class TaskRegistry {
157
175
  private sessionReapHooks;
158
176
  private bgQuiescenceWatchers;
159
177
  private legacyToTaskId;
178
+ readonly writerId: string;
179
+ private reapingHandles;
180
+ private durableHeartbeatTimer;
181
+ private ensureDurableHeartbeat;
182
+ private durableAgentWrite;
183
+ durableAgentArmed(id: string): boolean;
184
+ durableAgentRowProbe(id: string): (() => Promise<boolean>) | undefined;
185
+ reapDurableAgents(scope: string, deps: {
186
+ store: BackgroundAgentStore;
187
+ sessions?: {
188
+ unpin?(sessionId: string): unknown;
189
+ release(sessionId: string): Promise<void> | void;
190
+ };
191
+ }, policy: {
192
+ now?: number;
193
+ maxAgeMs?: number;
194
+ keep?: number;
195
+ staleRunningMaxAgeMs?: number;
196
+ }): Promise<{
197
+ rowsReaped: number;
198
+ sessionsReleased: number;
199
+ skippedNoSessions: number;
200
+ }>;
201
+ releaseDurableTranscriptAnchor(id: string): void;
202
+ bindBackgroundAgentSession(id: string, sessionId: string): void;
160
203
  mintTaskId(type: SemaTaskType): string;
161
204
  registerBackgroundBash(input: RegisterBackgroundBashInput): string;
162
205
  isBackgroundOutputFile(canonicalPath: string, access: TaskAccess, env: unknown): boolean;
@@ -217,6 +260,7 @@ export declare class TaskRegistry {
217
260
  content: string;
218
261
  details: UnifiedTaskOutput;
219
262
  }>;
263
+ private serveDurableAgentRow;
220
264
  stopTask(id: string, access: TaskAccess, opts?: TaskStopOptions): Promise<{
221
265
  content: string;
222
266
  details: UnifiedTaskOutput;
@@ -1 +1 @@
1
- {"version":3,"file":"task-registry.d.ts","sourceRoot":"","sources":["../../src/core/task-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task-registry.d.ts","sourceRoot":"","sources":["../../src/core/task-registry.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { defineTool } from "./tools.js";
4
4
  import { hasBackgroundShell } from "./background-shell.js";
5
5
  import { shutdownDebug } from "./shutdown-debug.js";
6
6
  import { summarizeWorkflowRun } from "./workflow-run-store.js";
7
+ import { canAccessAgentRecord, BackgroundAgentStoreError, } from "./background-agent-store.js";
7
8
  import { delimitUntrusted } from "./untrusted-text.js";
8
9
  import { boundedRedactedSummary } from "./untrusted-egress.js";
9
10
  const defaultMonitorTimers = {
@@ -33,6 +34,8 @@ const sleepMs = (ms, signal) => new Promise((resolve) => {
33
34
  signal?.addEventListener("abort", done, { once: true });
34
35
  });
35
36
  const BLOCK_WAIT_WRITEOUT_RESERVE_MS = 5_000;
37
+ export const DURABLE_AGENT_HEARTBEAT_MS = 60_000;
38
+ const DURABLE_AGENT_HANDLE_RE = /^a[0-9a-f]{6,32}$/;
36
39
  const TASK_PREFIX = {
37
40
  background_bash: "b",
38
41
  workflow: "w",
@@ -169,10 +172,10 @@ function monitorInTimeoutWindow(handle) {
169
172
  return handle.status === "running" && handle.deadlineAt !== undefined && handle.timers.now() < handle.deadlineAt;
170
173
  }
171
174
  function canAccess(handle, access) {
172
- if (handle.scope !== undefined && access.scope !== handle.scope)
175
+ if (handle.scope === undefined || access.scope === undefined || access.scope !== handle.scope)
173
176
  return false;
174
177
  if (handle.owner === undefined)
175
- return true;
178
+ return false;
176
179
  if (access.owner === handle.owner)
177
180
  return true;
178
181
  if (handle.sessionScoped && access.sessionId !== undefined && access.sessionId === handle.owner)
@@ -180,8 +183,8 @@ function canAccess(handle, access) {
180
183
  return false;
181
184
  }
182
185
  function assertOwnership(input, site) {
183
- if (input.owner === undefined && input.scope === undefined) {
184
- throw new Error(`TaskRegistry.${site}: refusing to register a task with neither owner nor scope (would be accessible to every caller)`);
186
+ if (input.owner === undefined || input.scope === undefined) {
187
+ throw new Error(`TaskRegistry.${site}: owner AND scope are both required (access is default-deny on both axes; use scope "default" for a single-tenant deployment)`);
185
188
  }
186
189
  }
187
190
  function canAccessWorkflowRun(run, access) {
@@ -275,6 +278,221 @@ export class TaskRegistry {
275
278
  sessionReapHooks = new Set();
276
279
  bgQuiescenceWatchers = new Map();
277
280
  legacyToTaskId = new Map();
281
+ writerId = randomBytes(8).toString("hex");
282
+ reapingHandles = new Set();
283
+ durableHeartbeatTimer;
284
+ ensureDurableHeartbeat() {
285
+ if (this.durableHeartbeatTimer !== undefined)
286
+ return;
287
+ const t = setInterval(() => {
288
+ let liveLanes = 0;
289
+ for (const h of this.handles.values()) {
290
+ if (h.type !== "background_agent")
291
+ continue;
292
+ const bh = h;
293
+ if (!bh.durable || bh.durable.poisoned)
294
+ continue;
295
+ if (bh.status === "running") {
296
+ liveLanes++;
297
+ this.durableAgentWrite(bh, {});
298
+ }
299
+ else if (bh.durable.flushFailed) {
300
+ if ((bh.durable.redrives = (bh.durable.redrives ?? 0) + 1) > 60) {
301
+ bh.durable.poisoned = true;
302
+ process.emitWarning(`sema durable-agents: terminal flush for ${bh.durable.record.handle} unrecoverable after 60 heartbeat re-drives — durable writes for this row stop here`);
303
+ continue;
304
+ }
305
+ liveLanes++;
306
+ this.durableAgentWrite(bh, {});
307
+ }
308
+ }
309
+ if (liveLanes === 0) {
310
+ clearInterval(t);
311
+ this.durableHeartbeatTimer = undefined;
312
+ }
313
+ }, DURABLE_AGENT_HEARTBEAT_MS);
314
+ t.unref?.();
315
+ this.durableHeartbeatTimer = t;
316
+ }
317
+ durableAgentWrite(handle, patch, clear) {
318
+ const lane = handle.durable;
319
+ if (!lane || lane.poisoned)
320
+ return;
321
+ lane.chain = lane.chain.then(async () => {
322
+ if (lane.poisoned)
323
+ return;
324
+ Object.assign(lane.record, patch);
325
+ if (clear !== undefined)
326
+ for (const k of clear)
327
+ delete lane.record[k];
328
+ lane.record.updatedAt = Date.now();
329
+ const poison = (why) => {
330
+ lane.poisoned = true;
331
+ process.emitWarning(`sema durable-agents: ${why} for ${lane.record.handle} — durable writes for this row stop here`);
332
+ };
333
+ const adoptOwnRow = async () => {
334
+ try {
335
+ const live = await lane.store.get(lane.record.handle, lane.record.scope);
336
+ if (!live)
337
+ return "gone";
338
+ if (live.writerId !== lane.record.writerId)
339
+ return "foreign";
340
+ lane.record.rev = live.rev;
341
+ lane.written = true;
342
+ return "adopted";
343
+ }
344
+ catch {
345
+ return "unreadable";
346
+ }
347
+ };
348
+ for (let attempt = 0; attempt < 3; attempt++) {
349
+ if (attempt > 0) {
350
+ await new Promise((r) => {
351
+ const t = setTimeout(r, 50 * attempt);
352
+ t.unref?.();
353
+ });
354
+ }
355
+ try {
356
+ if (!lane.written) {
357
+ await lane.store.put(structuredClone(lane.record));
358
+ lane.written = true;
359
+ lane.flushFailed = false;
360
+ lane.redrives = 0;
361
+ return;
362
+ }
363
+ const ok = await lane.store.update(lane.record.handle, lane.record.scope, structuredClone(lane.record), {
364
+ rev: lane.record.rev,
365
+ });
366
+ if (ok) {
367
+ lane.record.rev += 1;
368
+ lane.flushFailed = false;
369
+ lane.redrives = 0;
370
+ return;
371
+ }
372
+ const verdict = await adoptOwnRow();
373
+ if (verdict === "adopted")
374
+ continue;
375
+ if (verdict === "unreadable")
376
+ continue;
377
+ poison(verdict === "gone" ? "row reaped mid-write" : "CAS lost to a foreign writer");
378
+ return;
379
+ }
380
+ catch (e) {
381
+ if (e instanceof BackgroundAgentStoreError && e.code === "agent_record.already_exists") {
382
+ const verdict = await adoptOwnRow();
383
+ if (verdict === "adopted")
384
+ continue;
385
+ if (verdict === "unreadable")
386
+ continue;
387
+ if (verdict === "gone")
388
+ continue;
389
+ poison("handle collision (foreign durable row left untouched)");
390
+ return;
391
+ }
392
+ shutdownDebug(`durable-agents write failed for ${lane.record.handle} (attempt ${attempt + 1}/3)`, { error: String(e) });
393
+ }
394
+ }
395
+ lane.flushFailed = true;
396
+ });
397
+ }
398
+ durableAgentArmed(id) {
399
+ const h = this.handles.get(id);
400
+ if (!h || h.type !== "background_agent")
401
+ return false;
402
+ const lane = h.durable;
403
+ return lane !== undefined && !lane.poisoned;
404
+ }
405
+ durableAgentRowProbe(id) {
406
+ const h = this.handles.get(id);
407
+ if (!h || h.type !== "background_agent")
408
+ return undefined;
409
+ const lane = h.durable;
410
+ if (!lane)
411
+ return undefined;
412
+ return async () => {
413
+ await lane.chain.catch(() => undefined);
414
+ return lane.written && !lane.poisoned && !lane.flushFailed;
415
+ };
416
+ }
417
+ async reapDurableAgents(scope, deps, policy) {
418
+ const now = policy.now ?? Date.now();
419
+ if (policy.staleRunningMaxAgeMs !== undefined) {
420
+ await deps.store.reap(scope, now, { staleRunningMaxAgeMs: policy.staleRunningMaxAgeMs });
421
+ }
422
+ if (policy.maxAgeMs === undefined && policy.keep === undefined)
423
+ return { rowsReaped: 0, sessionsReleased: 0, skippedNoSessions: 0 };
424
+ const terminal = (await deps.store.listByScope(scope)).filter((r) => r.status !== "running");
425
+ terminal.sort((a, b) => b.spawnedAt - a.spawnedAt);
426
+ const doomed = new Map();
427
+ if (policy.maxAgeMs !== undefined) {
428
+ for (const r of terminal) {
429
+ if ((r.settledAt ?? r.spawnedAt) < now - policy.maxAgeMs)
430
+ doomed.set(r.handle, r);
431
+ }
432
+ }
433
+ if (policy.keep !== undefined) {
434
+ for (const r of terminal.slice(Math.max(0, policy.keep)))
435
+ doomed.set(r.handle, r);
436
+ }
437
+ let rowsReaped = 0;
438
+ let sessionsReleased = 0;
439
+ let skippedNoSessions = 0;
440
+ for (const r of doomed.values()) {
441
+ this.reapingHandles.add(r.handle);
442
+ try {
443
+ let live;
444
+ try {
445
+ live = await deps.store.get(r.handle, scope);
446
+ }
447
+ catch {
448
+ continue;
449
+ }
450
+ if (!live || live.status === "running")
451
+ continue;
452
+ const inProc = this.handles.get(r.handle);
453
+ if (inProc !== undefined && (inProc.status === "running" || inProc.status === "pending"))
454
+ continue;
455
+ if (live.sessionId !== undefined && deps.sessions === undefined) {
456
+ skippedNoSessions++;
457
+ continue;
458
+ }
459
+ try {
460
+ if (!(await deps.store.delete(r.handle, scope, { rev: live.rev })))
461
+ continue;
462
+ }
463
+ catch {
464
+ continue;
465
+ }
466
+ rowsReaped++;
467
+ if (live.sessionId !== undefined && deps.sessions !== undefined) {
468
+ try {
469
+ await deps.sessions.unpin?.(live.sessionId);
470
+ await deps.sessions.release(live.sessionId);
471
+ sessionsReleased++;
472
+ }
473
+ catch {
474
+ }
475
+ }
476
+ }
477
+ finally {
478
+ this.reapingHandles.delete(r.handle);
479
+ }
480
+ }
481
+ return { rowsReaped, sessionsReleased, skippedNoSessions };
482
+ }
483
+ releaseDurableTranscriptAnchor(id) {
484
+ const handle = this.handles.get(id);
485
+ if (!handle || handle.type !== "background_agent")
486
+ return;
487
+ this.durableAgentWrite(handle, {}, ["sessionId"]);
488
+ }
489
+ bindBackgroundAgentSession(id, sessionId) {
490
+ const handle = this.handles.get(id);
491
+ if (!handle || handle.type !== "background_agent")
492
+ return;
493
+ handle.sessionId = sessionId;
494
+ this.durableAgentWrite(handle, { sessionId });
495
+ }
278
496
  mintTaskId(type) {
279
497
  const prefix = TASK_PREFIX[type];
280
498
  for (let i = 0; i < 32; i++) {
@@ -326,7 +544,12 @@ export class TaskRegistry {
326
544
  }
327
545
  registerBackgroundAgent(input) {
328
546
  assertOwnership(input, "registerBackgroundAgent");
329
- const id = this.mintTaskId("background_agent");
547
+ if (input.id !== undefined && !DURABLE_AGENT_HANDLE_RE.test(input.id)) {
548
+ throw new Error(`TaskRegistry: background-agent id ${JSON.stringify(input.id)} does not match the a<hex> handle form`);
549
+ }
550
+ const id = input.id ?? this.mintTaskId("background_agent");
551
+ if (this.handles.has(id))
552
+ throw new Error(`TaskRegistry: task id already registered: ${id}`);
330
553
  const now = input.now ?? Date.now();
331
554
  this.handles.set(id, {
332
555
  id,
@@ -347,6 +570,34 @@ export class TaskRegistry {
347
570
  updatedAt: now,
348
571
  abort: input.abort,
349
572
  });
573
+ if (input.store) {
574
+ const handle = this.handles.get(id);
575
+ handle.durable = {
576
+ store: input.store,
577
+ record: {
578
+ handle: id,
579
+ scope: input.scope,
580
+ owner: input.owner,
581
+ sessionScoped: input.sessionScoped === true,
582
+ ...(input.parentSessionId !== undefined ? { parentSessionId: input.parentSessionId } : {}),
583
+ ...(input.parentTaskId !== undefined ? { parentTaskId: input.parentTaskId } : {}),
584
+ ...(input.name !== undefined ? { name: input.name } : {}),
585
+ ...(input.agentType !== undefined ? { agentType: input.agentType } : {}),
586
+ ...(input.description !== undefined ? { description: input.description } : {}),
587
+ writerId: this.writerId,
588
+ spawnedAt: now,
589
+ updatedAt: now,
590
+ status: "running",
591
+ rev: 0,
592
+ },
593
+ chain: Promise.resolve(),
594
+ written: false,
595
+ poisoned: false,
596
+ flushFailed: false,
597
+ };
598
+ this.durableAgentWrite(handle, {});
599
+ this.ensureDurableHeartbeat();
600
+ }
350
601
  return id;
351
602
  }
352
603
  getAccessibleTask(taskId, access) {
@@ -445,8 +696,14 @@ export class TaskRegistry {
445
696
  handle.error = outcome.error;
446
697
  backfilled = true;
447
698
  }
448
- if (backfilled)
699
+ if (backfilled) {
449
700
  handle.updatedAt = Date.now();
701
+ this.durableAgentWrite(handle, {
702
+ ...(handle.result !== undefined ? { finalOutput: handle.result } : {}),
703
+ ...(handle.resultIsPartial ? { resultIsPartial: true } : {}),
704
+ ...(handle.error !== undefined ? { error: handle.error } : {}),
705
+ });
706
+ }
450
707
  }
451
708
  return handle.status === "completed" || handle.status === "failed" || handle.status === "killed" ? handle.status : undefined;
452
709
  }
@@ -471,6 +728,14 @@ export class TaskRegistry {
471
728
  }
472
729
  handle.updatedAt = Date.now();
473
730
  this.pokeBgQuiescence(handle.owner);
731
+ this.durableAgentWrite(handle, {
732
+ status: outcome.status,
733
+ settledAt: Date.now(),
734
+ ...(handle.stoppedBy !== undefined ? { stoppedBy: handle.stoppedBy } : {}),
735
+ ...(handle.result !== undefined ? { finalOutput: handle.result } : {}),
736
+ ...(handle.resultIsPartial ? { resultIsPartial: true } : {}),
737
+ ...(handle.error !== undefined ? { error: handle.error } : {}),
738
+ });
474
739
  return outcome.status;
475
740
  }
476
741
  abortBackgroundAgentsForOwner(access, opts) {
@@ -1137,8 +1402,57 @@ export class TaskRegistry {
1137
1402
  await sleepPollStep(deadline, opts.signal);
1138
1403
  }
1139
1404
  }
1405
+ if (opts.agentStore && access.scope !== undefined && DURABLE_AGENT_HANDLE_RE.test(taskId)) {
1406
+ for (;;) {
1407
+ let row;
1408
+ try {
1409
+ row = await opts.agentStore.get(taskId, access.scope);
1410
+ }
1411
+ catch {
1412
+ break;
1413
+ }
1414
+ if (!row || !canAccessAgentRecord(row, access))
1415
+ break;
1416
+ if (row.status === "running" && row.writerId === this.writerId)
1417
+ break;
1418
+ if (row.status !== "running")
1419
+ return this.serveDurableAgentRow(row);
1420
+ if (deadline === undefined || Date.now() >= deadline || opts.signal?.aborted) {
1421
+ const body = `status: unknown (not running on this engine instance)
1422
+ The durable record is still marked running (last update ${new Date(row.updatedAt).toISOString()}), but this engine instance is not executing it — the outcome is unknown here. If its host process is gone, a retention sweep (staleRunningMaxAgeMs) settles the record as interrupted.`;
1423
+ return {
1424
+ content: delimitUntrusted(`TaskOutput ${row.handle}`, body),
1425
+ details: {
1426
+ task_id: row.handle,
1427
+ type: "background_agent",
1428
+ status: "running",
1429
+ retrieval_status: "not_ready",
1430
+ error: "not_local",
1431
+ },
1432
+ };
1433
+ }
1434
+ await sleepPollStep(deadline, opts.signal);
1435
+ }
1436
+ }
1140
1437
  return noTask(taskId);
1141
1438
  }
1439
+ serveDurableAgentRow(row) {
1440
+ const body = `status: ${row.status}
1441
+ ${row.error ? `error: ${row.error}
1442
+ ` : ""}${row.finalOutput ? `--- result${row.resultIsPartial ? " (partial — produced before the task was stopped)" : ""} ---
1443
+ ${clipTaskOutput(row.finalOutput)}` : "(no result text)"}`;
1444
+ return {
1445
+ content: delimitUntrusted(`TaskOutput ${row.handle}`, body),
1446
+ details: {
1447
+ task_id: row.handle,
1448
+ type: "background_agent",
1449
+ status: row.status,
1450
+ retrieval_status: "success",
1451
+ ...(row.status === "killed" && row.stoppedBy !== undefined ? { stoppedBy: row.stoppedBy } : {}),
1452
+ ...(row.resultIsPartial ? { partial_result: true } : {}),
1453
+ },
1454
+ };
1455
+ }
1142
1456
  async stopTask(id, access, opts = {}) {
1143
1457
  const taskId = id.trim();
1144
1458
  const handle = this.resolveInternal(taskId, access);
@@ -1172,6 +1486,29 @@ export class TaskRegistry {
1172
1486
  };
1173
1487
  }
1174
1488
  }
1489
+ if (opts.agentStore && access.scope !== undefined && DURABLE_AGENT_HANDLE_RE.test(taskId)) {
1490
+ let row = null;
1491
+ try {
1492
+ row = await opts.agentStore.get(taskId, access.scope);
1493
+ }
1494
+ catch {
1495
+ row = null;
1496
+ }
1497
+ if (row && canAccessAgentRecord(row, access) && !(row.status === "running" && row.writerId === this.writerId)) {
1498
+ return {
1499
+ content: row.status === "running"
1500
+ ? `${row.handle} is not attached to this engine instance; cannot stop it here. If its host process is gone, a retention sweep (staleRunningMaxAgeMs) settles it as interrupted.`
1501
+ : `${row.handle} already ${row.status} — nothing to stop; poll TaskOutput for its final state.`,
1502
+ details: {
1503
+ task_id: row.handle,
1504
+ type: "background_agent",
1505
+ status: row.status,
1506
+ retrieval_status: "success",
1507
+ ...(row.status === "running" ? { error: "not_local" } : {}),
1508
+ },
1509
+ };
1510
+ }
1511
+ }
1175
1512
  const byName = this.resolveBackgroundAgentByName(taskId, access);
1176
1513
  if (byName.status === "found")
1177
1514
  return this.stopBackgroundAgent(byName.handle);
@@ -1262,6 +1599,8 @@ export class TaskRegistry {
1262
1599
  handle.retainedContinuation = true;
1263
1600
  }
1264
1601
  reviveBackgroundAgent(id, access, abort) {
1602
+ if (this.reapingHandles.has(id))
1603
+ return { ok: false, reason: "not_found" };
1265
1604
  const handle = this.handles.get(id);
1266
1605
  if (!handle || handle.type !== "background_agent" || !canAccess(handle, access))
1267
1606
  return { ok: false, reason: "not_found" };
@@ -1278,6 +1617,7 @@ export class TaskRegistry {
1278
1617
  handle.stopSource = undefined;
1279
1618
  handle.reviveCycle = (handle.reviveCycle ?? 0) + 1;
1280
1619
  handle.updatedAt = Date.now();
1620
+ this.durableAgentWrite(handle, { status: "running" }, ["settledAt", "stoppedBy", "finalOutput", "error", "resultIsPartial"]);
1281
1621
  return { ok: true, cycle: handle.reviveCycle };
1282
1622
  }
1283
1623
  settleRevivedAgent(id, cycle, outcome) {
@@ -1846,6 +2186,11 @@ ${clipTaskOutput(handle.result, handle.outputFile)}` : "(no result text)"}`;
1846
2186
  r({ ok: false, reason: "not_running" });
1847
2187
  handle.inFlightDirect = undefined;
1848
2188
  this.pokeBgQuiescence(handle.owner);
2189
+ this.durableAgentWrite(handle, {
2190
+ status: "killed",
2191
+ settledAt: Date.now(),
2192
+ ...(handle.stoppedBy !== undefined ? { stoppedBy: handle.stoppedBy } : {}),
2193
+ });
1849
2194
  }
1850
2195
  return {
1851
2196
  content: `Terminated ${handle.id}.`,
@@ -1928,8 +2273,9 @@ export function createTaskOutputTool(opts) {
1928
2273
  waitClampNote = `\n\nNOTE: wait clamped to ${Math.round(remainMs / 1000)}s (requested ${Math.round(wantMs / 1000)}s) — the task's wall-clock deadline is near. If the task is still running after this wait, do NOT re-wait: proceed with other work or write out your results now.`;
1929
2274
  }
1930
2275
  }
1931
- const r = await opts.registry.pollTask(id, { owner: ctx.taskId ?? opts.owner, scope: ctx.principal ?? opts.scope, ...(opts.sessionId !== undefined ? { sessionId: opts.sessionId } : {}) }, {
2276
+ const r = await opts.registry.pollTask(id, { owner: ctx.taskId ?? opts.owner, scope: ctx.principal ?? opts.scope, ...((ctx.sessionId ?? opts.sessionId) !== undefined ? { sessionId: ctx.sessionId ?? opts.sessionId } : {}) }, {
1932
2277
  workflowStore: opts.workflowStore,
2278
+ agentStore: opts.agentStore,
1933
2279
  filter: typeof args.filter === "string" ? args.filter : undefined,
1934
2280
  block: args.block !== false,
1935
2281
  timeoutMs: effectiveTimeoutMs,
@@ -1960,7 +2306,7 @@ export function createTaskStopTool(opts) {
1960
2306
  const id = firstString(args.task_id, args.shell_id, args.runId);
1961
2307
  if (!id)
1962
2308
  return "Missing required parameter: task_id";
1963
- const r = await opts.registry.stopTask(id, { owner: ctx.taskId ?? opts.owner, scope: ctx.principal ?? opts.scope, ...(opts.sessionId !== undefined ? { sessionId: opts.sessionId } : {}) }, { workflowStore: opts.workflowStore });
2309
+ const r = await opts.registry.stopTask(id, { owner: ctx.taskId ?? opts.owner, scope: ctx.principal ?? opts.scope, ...((ctx.sessionId ?? opts.sessionId) !== undefined ? { sessionId: ctx.sessionId ?? opts.sessionId } : {}) }, { workflowStore: opts.workflowStore, agentStore: opts.agentStore });
1964
2310
  const { type: taskType, ...rest } = r.details;
1965
2311
  return {
1966
2312
  content: r.content,