@bastani/atomic 0.9.19-alpha.2 → 0.9.19-alpha.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 (89) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/builtin/intercom/CHANGELOG.md +7 -0
  3. package/dist/builtin/intercom/broker/broker.ts +8 -0
  4. package/dist/builtin/intercom/broker/client.ts +18 -0
  5. package/dist/builtin/intercom/broker/send-handler.ts +9 -0
  6. package/dist/builtin/intercom/index.bundle.mjs +44 -4
  7. package/dist/builtin/intercom/package.json +1 -1
  8. package/dist/builtin/intercom/types.ts +2 -1
  9. package/dist/builtin/mcp/package.json +1 -1
  10. package/dist/builtin/subagents/CHANGELOG.md +6 -0
  11. package/dist/builtin/subagents/README.md +2 -2
  12. package/dist/builtin/subagents/package.json +1 -1
  13. package/dist/builtin/subagents/src/extension/index.bundle.mjs +2 -2
  14. package/dist/builtin/web-access/package.json +1 -1
  15. package/dist/builtin/workflows/CHANGELOG.md +13 -0
  16. package/dist/builtin/workflows/package.json +1 -1
  17. package/dist/builtin/workflows/src/extension/index.bundle.mjs +56 -33
  18. package/dist/builtin/workflows/src/index.js +14 -4
  19. package/dist/core/agent-session-message-queue.d.ts.map +1 -1
  20. package/dist/core/agent-session-message-queue.js +2 -2
  21. package/dist/core/agent-session-message-queue.js.map +1 -1
  22. package/dist/core/agent-session-methods.d.ts +3 -0
  23. package/dist/core/agent-session-methods.d.ts.map +1 -1
  24. package/dist/core/agent-session-methods.js.map +1 -1
  25. package/dist/core/agent-session-tasks.d.ts +5 -0
  26. package/dist/core/agent-session-tasks.d.ts.map +1 -1
  27. package/dist/core/agent-session-tasks.js +8 -1
  28. package/dist/core/agent-session-tasks.js.map +1 -1
  29. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  30. package/dist/core/extensions/loader-api.js +3 -0
  31. package/dist/core/extensions/loader-api.js.map +1 -1
  32. package/dist/core/extensions/loader-host-modules.d.ts +1 -1
  33. package/dist/core/extensions/loader-host-modules.d.ts.map +1 -1
  34. package/dist/core/extensions/loader-host-modules.js +2 -1
  35. package/dist/core/extensions/loader-host-modules.js.map +1 -1
  36. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  37. package/dist/core/extensions/loader-virtual-modules.js +4 -1
  38. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  39. package/dist/core/retry-policy.d.ts +1 -0
  40. package/dist/core/retry-policy.d.ts.map +1 -1
  41. package/dist/core/retry-policy.js +2 -1
  42. package/dist/core/retry-policy.js.map +1 -1
  43. package/dist/core/settings-manager-basic-accessors.d.ts +1 -0
  44. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  45. package/dist/core/settings-manager-basic-accessors.js +2 -0
  46. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  47. package/dist/core/settings-types.d.ts +1 -0
  48. package/dist/core/settings-types.d.ts.map +1 -1
  49. package/dist/core/settings-types.js.map +1 -1
  50. package/dist/core/tasks/agent-adapter.d.ts +9 -0
  51. package/dist/core/tasks/agent-adapter.d.ts.map +1 -1
  52. package/dist/core/tasks/agent-adapter.js +36 -2
  53. package/dist/core/tasks/agent-adapter.js.map +1 -1
  54. package/dist/core/tasks/pause.d.ts +4 -0
  55. package/dist/core/tasks/pause.d.ts.map +1 -0
  56. package/dist/core/tasks/pause.js +49 -0
  57. package/dist/core/tasks/pause.js.map +1 -0
  58. package/dist/core/tasks/supervisor.d.ts +3 -1
  59. package/dist/core/tasks/supervisor.d.ts.map +1 -1
  60. package/dist/core/tasks/supervisor.js +48 -22
  61. package/dist/core/tasks/supervisor.js.map +1 -1
  62. package/dist/core/tools/bash.d.ts +2 -0
  63. package/dist/core/tools/bash.d.ts.map +1 -1
  64. package/dist/core/tools/bash.js +1 -1
  65. package/dist/core/tools/bash.js.map +1 -1
  66. package/dist/core/tools/powershell.d.ts.map +1 -1
  67. package/dist/core/tools/powershell.js +1 -0
  68. package/dist/core/tools/powershell.js.map +1 -1
  69. package/dist/core/tools/resource-selectors.d.ts +1 -1
  70. package/dist/core/tools/resource-selectors.d.ts.map +1 -1
  71. package/dist/core/tools/resource-selectors.js +7 -4
  72. package/dist/core/tools/resource-selectors.js.map +1 -1
  73. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  74. package/dist/modes/interactive/components/chat-session-host.js +3 -2
  75. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  76. package/docs/background-tasks.md +7 -1
  77. package/docs/development.md +23 -74
  78. package/docs/extensions.md +4 -0
  79. package/docs/herdr.md +25 -78
  80. package/docs/intercom.md +4 -0
  81. package/docs/models/evals.md +2 -0
  82. package/docs/models/model-selection.md +10 -7
  83. package/docs/settings.md +4 -0
  84. package/docs/subagents.md +3 -1
  85. package/docs/tools.md +4 -0
  86. package/docs/workflows/api-reference.md +1 -1
  87. package/docs/workflows/operations.md +8 -3
  88. package/npm-shrinkwrap.json +59 -59
  89. package/package.json +3 -3
@@ -1,5 +1,6 @@
1
1
  import { AsyncLocalStorage } from "node:async_hooks";
2
2
  import { trackAdmittedAgentTask } from "./execution-scope.js";
3
+ import { cancelPausedOwnerTasks } from "./pause.js";
3
4
  import { TaskSupervisor, } from "./supervisor.js";
4
5
  // S1 converges repeated live-scope bindings on one owner, so dispatch context is shared too.
5
6
  const runners = new AsyncLocalStorage();
@@ -15,10 +16,19 @@ export class AgentTaskHost {
15
16
  }
16
17
  constructor(binding) {
17
18
  this.supervisor = new TaskSupervisor();
19
+ this.messageWaits = new Set();
20
+ this.tasksPaused = false;
18
21
  this.binding = binding;
19
22
  const host = this.supervisor.bindHostSession({
20
23
  ...binding,
21
- authorizeLaunch: (intent) => this.binding.authorizeLaunch(intent),
24
+ authorizeLaunch: (intent) => {
25
+ this.authorizeTaskLaunch();
26
+ this.binding.authorizeLaunch(intent);
27
+ },
28
+ authorizeCommandLaunch: (intent) => {
29
+ this.authorizeTaskLaunch();
30
+ this.binding.authorizeCommandLaunch?.(intent);
31
+ },
22
32
  onTaskSettled: (ref, receipt) => this.binding.onTaskSettled?.(ref, receipt),
23
33
  createRunner: (context, intent) => {
24
34
  const runner = runners.getStore();
@@ -50,12 +60,24 @@ export class AgentTaskHost {
50
60
  const task = this.resolveTask(taskId);
51
61
  return task.ok
52
62
  ? this.supervisor.initialObservation(task.value, policy, (wait) => {
63
+ if (policy?.kind === "foreground")
64
+ this.trackMessageWait(wait);
53
65
  onRegistered?.((reason) => this.supervisor.yieldTaskWait(wait, reason));
54
66
  })
55
67
  : Promise.resolve(task);
56
68
  }
57
69
  waitForTask(taskId, budgetMs) {
58
- return this.supervisor.waitForTaskId(this.owner, taskId, budgetMs);
70
+ return this.supervisor.waitForTaskId(this.owner, taskId, budgetMs, (wait) => this.trackMessageWait(wait));
71
+ }
72
+ /** Incoming owner messages release observation only, never the child execution. */
73
+ yieldTaskWaits(reason) {
74
+ for (const wait of this.messageWaits)
75
+ this.supervisor.yieldTaskWait(wait, reason);
76
+ }
77
+ trackMessageWait(wait) {
78
+ this.messageWaits.add(wait);
79
+ const remove = () => this.messageWaits.delete(wait);
80
+ void this.supervisor.observeTaskWait(wait).then(remove, remove);
59
81
  }
60
82
  cancelTask(taskId, cause) {
61
83
  const task = this.resolveTask(taskId);
@@ -67,5 +89,17 @@ export class AgentTaskHost {
67
89
  close(cause) {
68
90
  return this.supervisor.closeTaskOwner(this.owner, cause);
69
91
  }
92
+ /** Reversible execution hold; message admission and owner identity remain open. */
93
+ pauseTasks() {
94
+ this.tasksPaused = true;
95
+ return cancelPausedOwnerTasks(this);
96
+ }
97
+ resumeTasks() {
98
+ this.tasksPaused = false;
99
+ }
100
+ authorizeTaskLaunch() {
101
+ if (this.tasksPaused)
102
+ throw new Error("Workflow stage tasks are paused");
103
+ }
70
104
  }
71
105
  //# sourceMappingURL=agent-adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-adapter.js","sourceRoot":"","sources":["../../../src/core/tasks/agent-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type * as C from \"./contracts.js\";\nimport { trackAdmittedAgentTask } from \"./execution-scope.js\";\nimport {\n\ttype FakeExecution,\n\ttype FakeRunnerContext,\n\ttype OwnerLease,\n\ttype TaskLease,\n\tTaskSupervisor,\n\ttype TrustedTaskHost,\n} from \"./supervisor.js\";\n\nexport type AgentTaskRunnerFactory = (context: FakeRunnerContext, intent: C.AgentIntent) => FakeExecution;\nexport type AgentTaskHostBinding = Omit<TrustedTaskHost, \"createRunner\">;\n\n// S1 converges repeated live-scope bindings on one owner, so dispatch context is shared too.\nconst runners = new AsyncLocalStorage<AgentTaskRunnerFactory>();\n\n/** Internal trusted-host seam. Bind actual host identity, never model-supplied scope. */\nexport class AgentTaskHost {\n\tprivate readonly supervisor = new TaskSupervisor();\n\tprivate readonly owner;\n\tprivate binding: AgentTaskHostBinding;\n\t/** Stage replacement updates callbacks, never native identity or ownership. */\n\tupdateBinding(binding: Omit<AgentTaskHostBinding, \"scope\">): void {\n\t\tthis.binding = { ...this.binding, ...binding };\n\t}\n\t/** Internal projection binding; never serialize these native-backed capabilities. */\n\tget ownerBinding(): { supervisor: TaskSupervisor; owner: OwnerLease } {\n\t\treturn { supervisor: this.supervisor, owner: this.owner };\n\t}\n\n\tconstructor(binding: AgentTaskHostBinding) {\n\t\tthis.binding = binding;\n\t\tconst host = this.supervisor.bindHostSession({\n\t\t\t...binding,\n\t\t\tauthorizeLaunch: (intent) => this.binding.authorizeLaunch(intent),\n\t\t\tonTaskSettled: (ref, receipt) => this.binding.onTaskSettled?.(ref, receipt),\n\t\t\tcreateRunner: (context, intent) => {\n\t\t\t\tconst runner = runners.getStore();\n\t\t\t\tif (!runner) throw new Error(\"Agent runner factory missing from launch context\");\n\t\t\t\treturn runner(context, intent);\n\t\t\t},\n\t\t});\n\t\tconst opened = this.supervisor.openTaskOwner(host, binding.scope);\n\t\tif (!opened.ok) throw new Error(`${opened.error.code}: ${opened.error.message}`);\n\t\tthis.owner = opened.value;\n\t}\n\n\tasync startAgentTask(\n\t\tintent: C.AgentIntent,\n\t\toperation: C.OperationId,\n\t\trunner: AgentTaskRunnerFactory,\n\t\tschedule?: (dispatch: () => Promise<void>) => void,\n\t): Promise<C.Result<{ taskId: C.TaskId; lease: TaskLease }, C.StartFailure>> {\n\t\tconst started = await runners.run(runner, () =>\n\t\t\tthis.supervisor.startAgentTask(this.owner, intent, operation, schedule),\n\t\t);\n\t\tif (started.ok)\n\t\t\ttrackAdmittedAgentTask({ host: this, taskId: this.supervisor.taskReference(started.value).taskId });\n\t\treturn started.ok\n\t\t\t? {\n\t\t\t\t\tok: true as const,\n\t\t\t\t\tvalue: { taskId: this.supervisor.taskReference(started.value).taskId, lease: started.value },\n\t\t\t\t}\n\t\t\t: started;\n\t}\n\tresolveTask(taskId: C.TaskId): C.Result<TaskLease, C.WaitError> {\n\t\treturn this.supervisor.lookupTask(this.owner, taskId);\n\t}\n\n\tobserveAgentLaunch(\n\t\ttaskId: C.TaskId,\n\t\tpolicy?: C.WaitPolicy,\n\t\tonRegistered?: (yieldWait: (reason: C.YieldReason) => C.Result<C.WaitOutcome, C.YieldError>) => void,\n\t) {\n\t\tconst task = this.resolveTask(taskId);\n\t\treturn task.ok\n\t\t\t? this.supervisor.initialObservation(task.value, policy, (wait) => {\n\t\t\t\t\tonRegistered?.((reason) => this.supervisor.yieldTaskWait(wait, reason));\n\t\t\t\t})\n\t\t\t: Promise.resolve(task);\n\t}\n\n\twaitForTask(taskId: C.TaskId, budgetMs?: number) {\n\t\treturn this.supervisor.waitForTaskId(this.owner, taskId, budgetMs);\n\t}\n\n\tcancelTask(taskId: C.TaskId, cause: C.CancelCause) {\n\t\tconst task = this.resolveTask(taskId);\n\t\treturn task.ok ? this.supervisor.cancelTask(task.value, cause) : Promise.resolve(task);\n\t}\n\n\twatchOwnerTasks(cursor?: C.Cursor) {\n\t\treturn this.supervisor.watchOwnerTasks(this.owner, cursor);\n\t}\n\n\tclose(cause: C.OwnerCloseCause) {\n\t\treturn this.supervisor.closeTaskOwner(this.owner, cause);\n\t}\n}\n"]}
1
+ {"version":3,"file":"agent-adapter.js","sourceRoot":"","sources":["../../../src/core/tasks/agent-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAKN,cAAc,GAGd,MAAM,iBAAiB,CAAC;AAKzB,6FAA6F;AAC7F,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAA0B,CAAC;AAEhE,yFAAyF;AACzF,MAAM,OAAO,aAAa;IAKzB,+EAA+E;IAC/E,aAAa,CAAC,OAA4C;QACzD,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IAChD,CAAC;IACD,qFAAqF;IACrF,IAAI,YAAY;QACf,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3D,CAAC;IAED,YAAY,OAA6B;QAbxB,eAAU,GAAG,IAAI,cAAc,EAAE,CAAC;QAGlC,iBAAY,GAAG,IAAI,GAAG,EAAa,CAAC;QAkG7C,gBAAW,GAAG,KAAK,CAAC;QAvF3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;YAC5C,GAAG,OAAO;YACV,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE;gBAC3B,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YACtC,CAAC;YACD,sBAAsB,EAAE,CAAC,MAAM,EAAE,EAAE;gBAClC,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,MAAM,CAAC,CAAC;YAC/C,CAAC;YACD,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC;YAC3E,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACjC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAClC,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;gBACjF,OAAO,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAChC,CAAC;SACD,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,cAAc,CACnB,MAAqB,EACrB,SAAwB,EACxB,MAA8B,EAC9B,QAAkD;QAElD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,CAC9C,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CACvE,CAAC;QACF,IAAI,OAAO,CAAC,EAAE;YACb,sBAAsB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACrG,OAAO,OAAO,CAAC,EAAE;YAChB,CAAC,CAAC;gBACA,EAAE,EAAE,IAAa;gBACjB,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;aAC5F;YACF,CAAC,CAAC,OAAO,CAAC;IACZ,CAAC;IACD,WAAW,CAAC,MAAgB;QAC3B,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,kBAAkB,CACjB,MAAgB,EAChB,MAAqB,EACrB,YAAoG;QAEpG,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,EAAE;YACb,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChE,IAAI,MAAM,EAAE,IAAI,KAAK,YAAY;oBAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBAC/D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YACzE,CAAC,CAAC;YACH,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,MAAgB,EAAE,QAAiB;QAC9C,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3G,CAAC;IAED,mFAAmF;IACnF,cAAc,CAAC,MAAqB;QACnC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY;YAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnF,CAAC;IAEO,gBAAgB,CAAC,IAAe;QACvC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpD,KAAK,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,UAAU,CAAC,MAAgB,EAAE,KAAoB;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,CAAC;IAED,eAAe,CAAC,MAAiB;QAChC,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,KAAwB;QAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1D,CAAC;IAGD,mFAAmF;IACnF,UAAU;QACT,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,WAAW;QACV,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC1B,CAAC;IACO,mBAAmB;QAC1B,IAAI,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC1E,CAAC;CACD","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type * as C from \"./contracts.js\";\nimport { trackAdmittedAgentTask } from \"./execution-scope.js\";\nimport { cancelPausedOwnerTasks } from \"./pause.js\";\nimport {\n\ttype FakeExecution,\n\ttype FakeRunnerContext,\n\ttype OwnerLease,\n\ttype TaskLease,\n\tTaskSupervisor,\n\ttype TrustedTaskHost,\n\ttype WaitLease,\n} from \"./supervisor.js\";\n\nexport type AgentTaskRunnerFactory = (context: FakeRunnerContext, intent: C.AgentIntent) => FakeExecution;\nexport type AgentTaskHostBinding = Omit<TrustedTaskHost, \"createRunner\">;\n\n// S1 converges repeated live-scope bindings on one owner, so dispatch context is shared too.\nconst runners = new AsyncLocalStorage<AgentTaskRunnerFactory>();\n\n/** Internal trusted-host seam. Bind actual host identity, never model-supplied scope. */\nexport class AgentTaskHost {\n\tprivate readonly supervisor = new TaskSupervisor();\n\tprivate readonly owner;\n\tprivate binding: AgentTaskHostBinding;\n\tprivate readonly messageWaits = new Set<WaitLease>();\n\t/** Stage replacement updates callbacks, never native identity or ownership. */\n\tupdateBinding(binding: Omit<AgentTaskHostBinding, \"scope\">): void {\n\t\tthis.binding = { ...this.binding, ...binding };\n\t}\n\t/** Internal projection binding; never serialize these native-backed capabilities. */\n\tget ownerBinding(): { supervisor: TaskSupervisor; owner: OwnerLease } {\n\t\treturn { supervisor: this.supervisor, owner: this.owner };\n\t}\n\n\tconstructor(binding: AgentTaskHostBinding) {\n\t\tthis.binding = binding;\n\t\tconst host = this.supervisor.bindHostSession({\n\t\t\t...binding,\n\t\t\tauthorizeLaunch: (intent) => {\n\t\t\t\tthis.authorizeTaskLaunch();\n\t\t\t\tthis.binding.authorizeLaunch(intent);\n\t\t\t},\n\t\t\tauthorizeCommandLaunch: (intent) => {\n\t\t\t\tthis.authorizeTaskLaunch();\n\t\t\t\tthis.binding.authorizeCommandLaunch?.(intent);\n\t\t\t},\n\t\t\tonTaskSettled: (ref, receipt) => this.binding.onTaskSettled?.(ref, receipt),\n\t\t\tcreateRunner: (context, intent) => {\n\t\t\t\tconst runner = runners.getStore();\n\t\t\t\tif (!runner) throw new Error(\"Agent runner factory missing from launch context\");\n\t\t\t\treturn runner(context, intent);\n\t\t\t},\n\t\t});\n\t\tconst opened = this.supervisor.openTaskOwner(host, binding.scope);\n\t\tif (!opened.ok) throw new Error(`${opened.error.code}: ${opened.error.message}`);\n\t\tthis.owner = opened.value;\n\t}\n\n\tasync startAgentTask(\n\t\tintent: C.AgentIntent,\n\t\toperation: C.OperationId,\n\t\trunner: AgentTaskRunnerFactory,\n\t\tschedule?: (dispatch: () => Promise<void>) => void,\n\t): Promise<C.Result<{ taskId: C.TaskId; lease: TaskLease }, C.StartFailure>> {\n\t\tconst started = await runners.run(runner, () =>\n\t\t\tthis.supervisor.startAgentTask(this.owner, intent, operation, schedule),\n\t\t);\n\t\tif (started.ok)\n\t\t\ttrackAdmittedAgentTask({ host: this, taskId: this.supervisor.taskReference(started.value).taskId });\n\t\treturn started.ok\n\t\t\t? {\n\t\t\t\t\tok: true as const,\n\t\t\t\t\tvalue: { taskId: this.supervisor.taskReference(started.value).taskId, lease: started.value },\n\t\t\t\t}\n\t\t\t: started;\n\t}\n\tresolveTask(taskId: C.TaskId): C.Result<TaskLease, C.WaitError> {\n\t\treturn this.supervisor.lookupTask(this.owner, taskId);\n\t}\n\n\tobserveAgentLaunch(\n\t\ttaskId: C.TaskId,\n\t\tpolicy?: C.WaitPolicy,\n\t\tonRegistered?: (yieldWait: (reason: C.YieldReason) => C.Result<C.WaitOutcome, C.YieldError>) => void,\n\t) {\n\t\tconst task = this.resolveTask(taskId);\n\t\treturn task.ok\n\t\t\t? this.supervisor.initialObservation(task.value, policy, (wait) => {\n\t\t\t\t\tif (policy?.kind === \"foreground\") this.trackMessageWait(wait);\n\t\t\t\t\tonRegistered?.((reason) => this.supervisor.yieldTaskWait(wait, reason));\n\t\t\t\t})\n\t\t\t: Promise.resolve(task);\n\t}\n\n\twaitForTask(taskId: C.TaskId, budgetMs?: number) {\n\t\treturn this.supervisor.waitForTaskId(this.owner, taskId, budgetMs, (wait) => this.trackMessageWait(wait));\n\t}\n\n\t/** Incoming owner messages release observation only, never the child execution. */\n\tyieldTaskWaits(reason: C.YieldReason): void {\n\t\tfor (const wait of this.messageWaits) this.supervisor.yieldTaskWait(wait, reason);\n\t}\n\n\tprivate trackMessageWait(wait: WaitLease): void {\n\t\tthis.messageWaits.add(wait);\n\t\tconst remove = () => this.messageWaits.delete(wait);\n\t\tvoid this.supervisor.observeTaskWait(wait).then(remove, remove);\n\t}\n\n\tcancelTask(taskId: C.TaskId, cause: C.CancelCause) {\n\t\tconst task = this.resolveTask(taskId);\n\t\treturn task.ok ? this.supervisor.cancelTask(task.value, cause) : Promise.resolve(task);\n\t}\n\n\twatchOwnerTasks(cursor?: C.Cursor) {\n\t\treturn this.supervisor.watchOwnerTasks(this.owner, cursor);\n\t}\n\n\tclose(cause: C.OwnerCloseCause) {\n\t\treturn this.supervisor.closeTaskOwner(this.owner, cause);\n\t}\n\n\tprivate tasksPaused = false;\n\t/** Reversible execution hold; message admission and owner identity remain open. */\n\tpauseTasks(): Promise<void> {\n\t\tthis.tasksPaused = true;\n\t\treturn cancelPausedOwnerTasks(this);\n\t}\n\tresumeTasks(): void {\n\t\tthis.tasksPaused = false;\n\t}\n\tprivate authorizeTaskLaunch(): void {\n\t\tif (this.tasksPaused) throw new Error(\"Workflow stage tasks are paused\");\n\t}\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { AgentTaskHost } from "./agent-adapter.js";
2
+ /** The caller synchronously blocks new launches; this never closes the owner or its messages. */
3
+ export declare function cancelPausedOwnerTasks(host: AgentTaskHost): Promise<void>;
4
+ //# sourceMappingURL=pause.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pause.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/pause.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,iGAAiG;AACjG,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAqD/E"}
@@ -0,0 +1,49 @@
1
+ /** The caller synchronously blocks new launches; this never closes the owner or its messages. */
2
+ export async function cancelPausedOwnerTasks(host) {
3
+ const errors = [];
4
+ const cancel = async (tasks) => {
5
+ // Cancel every queued agent before an active cancellation can free a dispatch slot.
6
+ const ordered = tasks.sort((a, b) => Number(b.execution.kind === "queued") - Number(a.execution.kind === "queued"));
7
+ const results = await Promise.allSettled(ordered.map((task) => host.cancelTask(task.ref.taskId, "user")));
8
+ for (const result of results) {
9
+ if (result.status === "rejected")
10
+ errors.push(new Error(String(result.reason)));
11
+ else if (!result.value.ok)
12
+ errors.push(new Error(`${result.value.error.code}: ${result.value.error.message}`));
13
+ }
14
+ };
15
+ const watched = host.watchOwnerTasks();
16
+ if (!watched.ok)
17
+ throw new Error(`${watched.error.code}: ${watched.error.message}`);
18
+ const watch = watched.value;
19
+ try {
20
+ await cancel(watch.snapshot.tasks.filter((task) => task.kind === "agent" && task.execution.kind !== "settled"));
21
+ const { supervisor, owner } = host.ownerBinding;
22
+ // Already-started native setup may briefly launch during the transition. Wait for
23
+ // every admitted lease before cancelling shells and certifying the final snapshot.
24
+ await supervisor.drainCommandAdmissions(owner);
25
+ watch.drain();
26
+ await cancel(watch.snapshot.tasks.filter((task) => task.kind === "command" && task.execution.kind !== "settled"));
27
+ if (errors.length)
28
+ throw new AggregateError(errors, "Workflow stage task cancellation failed");
29
+ await new Promise((resolve, reject) => {
30
+ watch.onReconcile = (snapshot) => {
31
+ if (snapshot.tasks.some((task) => task.cleanup.kind === "active" ||
32
+ task.cleanup.kind === "draining" ||
33
+ (task.execution.kind !== "settled" && task.cleanup.kind !== "failed")))
34
+ return;
35
+ const failures = snapshot.tasks.flatMap((task) => task.cleanup.kind === "failed" ? task.cleanup.resources : []);
36
+ if (failures.length)
37
+ reject(new Error(`Workflow stage task cleanup failed: ${failures.map((failure) => `${failure.resource}: ${failure.message}`).join("; ")}`));
38
+ else
39
+ resolve();
40
+ };
41
+ watch.drain();
42
+ watch.onReconcile(watch.snapshot);
43
+ });
44
+ }
45
+ finally {
46
+ watch.dispose();
47
+ }
48
+ }
49
+ //# sourceMappingURL=pause.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pause.js","sourceRoot":"","sources":["../../../src/core/tasks/pause.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTaskHost } from \"./agent-adapter.js\";\nimport type { OwnerSnapshot, TaskRecord } from \"./contracts.js\";\n\n/** The caller synchronously blocks new launches; this never closes the owner or its messages. */\nexport async function cancelPausedOwnerTasks(host: AgentTaskHost): Promise<void> {\n\tconst errors: Error[] = [];\n\tconst cancel = async (tasks: TaskRecord[]): Promise<void> => {\n\t\t// Cancel every queued agent before an active cancellation can free a dispatch slot.\n\t\tconst ordered = tasks.sort(\n\t\t\t(a, b) => Number(b.execution.kind === \"queued\") - Number(a.execution.kind === \"queued\"),\n\t\t);\n\t\tconst results = await Promise.allSettled(ordered.map((task) => host.cancelTask(task.ref.taskId, \"user\")));\n\t\tfor (const result of results) {\n\t\t\tif (result.status === \"rejected\") errors.push(new Error(String(result.reason)));\n\t\t\telse if (!result.value.ok) errors.push(new Error(`${result.value.error.code}: ${result.value.error.message}`));\n\t\t}\n\t};\n\tconst watched = host.watchOwnerTasks();\n\tif (!watched.ok) throw new Error(`${watched.error.code}: ${watched.error.message}`);\n\tconst watch = watched.value;\n\ttry {\n\t\tawait cancel(watch.snapshot.tasks.filter((task) => task.kind === \"agent\" && task.execution.kind !== \"settled\"));\n\t\tconst { supervisor, owner } = host.ownerBinding;\n\t\t// Already-started native setup may briefly launch during the transition. Wait for\n\t\t// every admitted lease before cancelling shells and certifying the final snapshot.\n\t\tawait supervisor.drainCommandAdmissions(owner);\n\t\twatch.drain();\n\t\tawait cancel(watch.snapshot.tasks.filter((task) => task.kind === \"command\" && task.execution.kind !== \"settled\"));\n\t\tif (errors.length) throw new AggregateError(errors, \"Workflow stage task cancellation failed\");\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\twatch.onReconcile = (snapshot: OwnerSnapshot) => {\n\t\t\t\tif (\n\t\t\t\t\tsnapshot.tasks.some(\n\t\t\t\t\t\t(task) =>\n\t\t\t\t\t\t\ttask.cleanup.kind === \"active\" ||\n\t\t\t\t\t\t\ttask.cleanup.kind === \"draining\" ||\n\t\t\t\t\t\t\t(task.execution.kind !== \"settled\" && task.cleanup.kind !== \"failed\"),\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tconst failures = snapshot.tasks.flatMap((task) =>\n\t\t\t\t\ttask.cleanup.kind === \"failed\" ? task.cleanup.resources : [],\n\t\t\t\t);\n\t\t\t\tif (failures.length)\n\t\t\t\t\treject(\n\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t`Workflow stage task cleanup failed: ${failures.map((failure) => `${failure.resource}: ${failure.message}`).join(\"; \")}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\telse resolve();\n\t\t\t};\n\t\t\twatch.drain();\n\t\t\twatch.onReconcile(watch.snapshot);\n\t\t});\n\t} finally {\n\t\twatch.dispose();\n\t}\n}\n"]}
@@ -90,6 +90,8 @@ export declare class TaskSupervisor {
90
90
  bindHostSession(binding: TrustedTaskHost): HostSession;
91
91
  openTaskOwner(host: HostSession, scope: C.OwnerScope): C.Result<OwnerLease, C.OwnerError>;
92
92
  startCommandTask(owner: OwnerLease, intent: C.CommandIntent, operation: C.OperationId): Promise<C.Result<TaskLease, C.StartFailure>>;
93
+ /** Caller must hold launch authorization closed while this snapshot drains. */
94
+ drainCommandAdmissions(owner: OwnerLease): Promise<void>;
93
95
  taskStdin(task: TaskLease): C.Result<StdinLease, C.InputError>;
94
96
  writeTaskInput(input: StdinLease, operation: C.OperationId, data: C.InputData): Promise<C.Result<C.InputReceipt, C.InputError>>;
95
97
  readTaskOutput(task: TaskLease, range: C.OutputRange): Promise<C.Result<C.OutputPage, C.OutputError>>;
@@ -98,7 +100,7 @@ export declare class TaskSupervisor {
98
100
  waitForTask(task: TaskLease, budgetMs?: number, designation?: HostSession): Promise<C.Result<C.WaitOutcome, C.WaitError>>;
99
101
  /** Resolve only a task admitted under this live owner; IDs alone confer no authority. */
100
102
  lookupTask(owner: OwnerLease, taskId: C.TaskId): C.Result<TaskLease, C.WaitError>;
101
- waitForTaskId(owner: OwnerLease, taskId: C.TaskId, budgetMs?: number): Promise<C.Result<C.WaitOutcome, C.WaitError>>;
103
+ waitForTaskId(owner: OwnerLease, taskId: C.TaskId, budgetMs?: number, onRegistered?: (wait: WaitLease) => void): Promise<C.Result<C.WaitOutcome, C.WaitError>>;
102
104
  foregroundTask(task: TaskLease, budgetMs?: number): Promise<C.Result<C.WaitOutcome, C.ForegroundError>>;
103
105
  waitId(wait: WaitLease): C.WaitId;
104
106
  findWait(id: C.WaitId): WaitLease | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/supervisor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAEzC,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,cAAc,EAAE,cAAc,GAAG,YAAY,CAAC,GAAG;IACxF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACjD,6EAA6E;IAC7E,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACrE,mBAAmB,CAAC,IAAI,YAAY,GAAG,SAAS,CAAC;CACjD,CAAC;AAEF,eAAO,MAAM,4BAA4B,QAAQ,CAAC;AAClD,qFAAqF;AACrF,cAAM,UAAU;;IAEf,MAAM,IAAI,KAAK,CAEd;CACD;AACD,cAAM,cAAe,SAAQ,UAAU;IACtC,QAAQ,CAAC,IAAI,UAAU;CACvB;AACD,cAAM,eAAgB,SAAQ,UAAU;IACvC,QAAQ,CAAC,IAAI,WAAW;CACxB;AACD,cAAM,cAAe,SAAQ,UAAU;IACtC,QAAQ,CAAC,IAAI,UAAU;CACvB;AACD,cAAM,cAAe,SAAQ,UAAU;IACtC,QAAQ,CAAC,IAAI,UAAU;CACvB;AACD,cAAM,sBAAuB,SAAQ,UAAU;IAC9C,QAAQ,CAAC,IAAI,kBAAkB;CAC/B;AACD,cAAM,eAAgB,SAAQ,UAAU;IACvC,QAAQ,CAAC,IAAI,WAAW;CACxB;AACD,MAAM,MAAM,UAAU,GAAG,eAAe,CAAC;AACzC,MAAM,MAAM,WAAW,GAAG,cAAc,CAAC;AACzC,MAAM,MAAM,UAAU,GAAG,eAAe,CAAC;AACzC,MAAM,MAAM,SAAS,GAAG,cAAc,CAAC;AACvC,MAAM,MAAM,SAAS,GAAG,cAAc,CAAC;AACvC,MAAM,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AAEvD,MAAM,MAAM,iBAAiB,GAAG;IAC/B,GAAG,EAAE,CAAC,CAAC,aAAa,CAAC;IACrB,MAAM,EAAE,WAAW,CAAC;IACpB,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;IACnF,+EAA+E;IAC/E,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACpD,CAAC;AACF,oFAAoF;AACpF,MAAM,MAAM,aAAa,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC;AAC3F,MAAM,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,CAAC,CAAC,UAAU,CAAC;IACpB,oEAAoE;IACpE,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAA;KAAE,CAAC;IAC3C,2EAA2E;IAC3E,sBAAsB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC;IACvD,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC;IAC7C,aAAa,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC,iBAAiB,GAAG,IAAI,CAAC;IACzE,YAAY,CAAC,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,CAAC,WAAW,GAAG,aAAa,CAAC;CAC/E,CAAC;AA+BF,wFAAwF;AACxF,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,SAAS,GACb,CAAC,CAAC,MAAM,CAAC;IAAE,OAAO,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAA;CAAE,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,GAAG,uBAAuB,CAAC,CAAC,CAMnH;AA+SD,qBAAa,gBAAgB;;IAW5B,4EAA4E;IAC5E,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,aAAa,KAAK,IAAI,CAAY;IAG5D,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAgC;IAEjE,YAAY,KAAK,EAAE,MAAM,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,sBAAsB,EAAE,SAAS,EAAE,MAAM,IAAI,EA6BtG;IACD,IAAI,QAAQ,IAAI,CAAC,CAAC,aAAa,CAE9B;IACD,IAAI,MAAM,IAAI,CAAC,CAAC,MAAM,CAErB;IACD,4FAA4F;IAC5F,IAAI,OAAO,IAAI,KAAK,GAAG,SAAS,CAE/B;IACD,yFAAyF;IACzF,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,GAAG,IAAI,CAEpC;IAUD,KAAK,IAAI,IAAI,CA0CZ;IACD,OAAO,CAAC,KAAK,UAAO,GAAG,IAAI,CAW1B;CACD;AAED,qBAAa,cAAc;;IAQ1B,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,WAAW,CAKrD;IACD,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAgExF;IAaK,gBAAgB,CACrB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,CAAC,CAAC,aAAa,EACvB,SAAS,EAAE,CAAC,CAAC,WAAW,GACtB,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAwB9C;IACD,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAU7D;IACK,cAAc,CACnB,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,CAAC,CAAC,WAAW,EACxB,IAAI,EAAE,CAAC,CAAC,SAAS,GACf,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAgBjD;IACK,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAW1G;IACK,cAAc,CACnB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,CAAC,CAAC,WAAW,EACrB,SAAS,EAAE,CAAC,CAAC,WAAW,EACxB,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,GAChD,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAgG9C;IACD,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,CAAC,CAAC,aAAa,CAE9C;IACK,WAAW,CAChB,IAAI,EAAE,SAAS,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,WAAW,GACvB,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAW/C;IACD,yFAAyF;IACzF,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,CAMhF;IAEK,aAAa,CAClB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,CAAC,CAAC,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAiB/C;IACK,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAe5G;IACD,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,CAAC,CAAC,MAAM,CAEhC;IACD,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,SAAS,GAAG,SAAS,CAE5C;IACD,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAE9E;IACD,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,UAAU,CAAC,CAM3F;IACD,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,CAE5D;IACK,kBAAkB,CACvB,IAAI,EAAE,SAAS,EACf,MAAM,CAAC,EAAE,CAAC,CAAC,UAAU,EACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,GACtC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAmB/C;IACK,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAQzG;IACK,cAAc,CACnB,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,CAAC,CAAC,eAAe,GACtB,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAyBtD;IACD;;;;;;OAMG;IACH,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,UAAU,CAAC,CAc5F;CA2CD"}
1
+ {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/supervisor.ts"],"names":[],"mappings":"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"}
@@ -514,8 +514,14 @@ export class TaskSubscription {
514
514
  this.#onDispose();
515
515
  }
516
516
  }
517
+ function createNativeSupervisor() {
518
+ // Keep loading separate from `new`: type-assertion erasure in the build
519
+ // must not move construction onto createModuleRequire instead of the class.
520
+ const binding = createModuleRequire(import.meta.url)("@bastani/atomic-natives");
521
+ return new binding.TaskSupervisor();
522
+ }
517
523
  export class TaskSupervisor {
518
- #native = new createModuleRequire(import.meta.url)("@bastani/atomic-natives").TaskSupervisor();
524
+ #native = createNativeSupervisor();
519
525
  #hosts = environment.hosts;
520
526
  #owners = environment.owners;
521
527
  #tasks = environment.tasks;
@@ -547,6 +553,7 @@ export class TaskSupervisor {
547
553
  tasks: new Map(),
548
554
  watches: new Set(),
549
555
  settledTasks: new Set(),
556
+ commandAdmissions: new Set(),
550
557
  };
551
558
  this.#owners.set(owner, ownerState);
552
559
  this.#ownerIds.set(id, owner);
@@ -612,26 +619,42 @@ export class TaskSupervisor {
612
619
  async startCommandTask(owner, intent, operation) {
613
620
  const state = this.#owner(owner);
614
621
  state.host.binding.authorizeCommandLaunch?.(intent);
615
- const admitted = mapped(await this.#native.startCommandTask(state.native, intent, operation), (lease) => lease, startErrors);
616
- if (!admitted.ok)
617
- return admitted;
618
- const ref = this.#native.taskReference(admitted.value);
619
- if (!ref.ok)
620
- throw new Error(ref.error.message);
621
- const id = ref.value.taskId;
622
- const existing = state.tasks.get(id);
623
- if (existing)
624
- return { ok: true, value: existing };
625
- const task = new TaskCapability();
626
- this.#tasks.set(task, {
627
- native: admitted.value,
628
- owner: state,
629
- ref: reference(ref.value),
630
- controller: new AbortController(),
631
- kind: "command",
622
+ // Native command setup can be admitted before its task lease is visible in JS.
623
+ let finishAdmission;
624
+ const admission = new Promise((resolve) => {
625
+ finishAdmission = resolve;
632
626
  });
633
- state.tasks.set(id, task);
634
- return { ok: true, value: task };
627
+ state.commandAdmissions.add(admission);
628
+ try {
629
+ const admitted = mapped(await this.#native.startCommandTask(state.native, intent, operation), (lease) => lease, startErrors);
630
+ if (!admitted.ok)
631
+ return admitted;
632
+ const ref = this.#native.taskReference(admitted.value);
633
+ if (!ref.ok)
634
+ throw new Error(ref.error.message);
635
+ const id = ref.value.taskId;
636
+ const existing = state.tasks.get(id);
637
+ if (existing)
638
+ return { ok: true, value: existing };
639
+ const task = new TaskCapability();
640
+ this.#tasks.set(task, {
641
+ native: admitted.value,
642
+ owner: state,
643
+ ref: reference(ref.value),
644
+ controller: new AbortController(),
645
+ kind: "command",
646
+ });
647
+ state.tasks.set(id, task);
648
+ return { ok: true, value: task };
649
+ }
650
+ finally {
651
+ state.commandAdmissions.delete(admission);
652
+ finishAdmission();
653
+ }
654
+ }
655
+ /** Caller must hold launch authorization closed while this snapshot drains. */
656
+ async drainCommandAdmissions(owner) {
657
+ await Promise.all([...this.#owner(owner).commandAdmissions]);
635
658
  }
636
659
  taskStdin(task) {
637
660
  return mapped(this.#native.taskStdin(this.#task(task).native), (input) => {
@@ -764,13 +787,16 @@ export class TaskSupervisor {
764
787
  return { ok: false, error: { code: "UnknownTask", message: "No agent runner bound to task" } };
765
788
  return { ok: true, value: found.value };
766
789
  }
767
- async waitForTaskId(owner, taskId, budgetMs) {
790
+ async waitForTaskId(owner, taskId, budgetMs, onRegistered) {
768
791
  const found = mapped(this.#native.lookupTask(this.#owner(owner).native, taskId), (lease) => lease, waitErrors);
769
792
  if (!found.ok)
770
793
  return found;
771
794
  const known = this.#owner(owner).tasks.get(taskId);
772
795
  const registered = mapped(this.#native.waitForTask(found.value, this.#agentBudget(this.#owner(owner), budgetMs, known !== undefined && this.#task(known).kind === "command")), (lease) => this.#register(lease), waitErrors);
773
- return registered.ok ? this.observeTaskWait(registered.value) : registered;
796
+ if (!registered.ok)
797
+ return registered;
798
+ onRegistered?.(registered.value);
799
+ return this.observeTaskWait(registered.value);
774
800
  }
775
801
  async foregroundTask(task, budgetMs) {
776
802
  const state = this.#task(task);