@caupulican/pi-adaptative 0.86.3 → 0.86.5

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 (226) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/core/agent-paths.d.ts +13 -0
  3. package/dist/core/agent-paths.d.ts.map +1 -1
  4. package/dist/core/agent-paths.js +23 -0
  5. package/dist/core/agent-paths.js.map +1 -1
  6. package/dist/core/autonomy/bounded-completion.d.ts +7 -0
  7. package/dist/core/autonomy/bounded-completion.d.ts.map +1 -1
  8. package/dist/core/autonomy/bounded-completion.js +12 -4
  9. package/dist/core/autonomy/bounded-completion.js.map +1 -1
  10. package/dist/core/autonomy/lane-tool-surface.d.ts +2 -0
  11. package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
  12. package/dist/core/autonomy/lane-tool-surface.js +6 -3
  13. package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
  14. package/dist/core/autonomy/subagent-prompt.js +1 -1
  15. package/dist/core/autonomy/subagent-prompt.js.map +1 -1
  16. package/dist/core/background-lane-controller.d.ts +25 -2
  17. package/dist/core/background-lane-controller.d.ts.map +1 -1
  18. package/dist/core/background-lane-controller.js +67 -0
  19. package/dist/core/background-lane-controller.js.map +1 -1
  20. package/dist/core/delegation/replay-safe-mailbox-bounds.d.ts +4 -0
  21. package/dist/core/delegation/replay-safe-mailbox-bounds.d.ts.map +1 -0
  22. package/dist/core/delegation/replay-safe-mailbox-bounds.js +20 -0
  23. package/dist/core/delegation/replay-safe-mailbox-bounds.js.map +1 -0
  24. package/dist/core/delegation/sanitized-context-fork.d.ts +25 -0
  25. package/dist/core/delegation/sanitized-context-fork.d.ts.map +1 -0
  26. package/dist/core/delegation/sanitized-context-fork.js +299 -0
  27. package/dist/core/delegation/sanitized-context-fork.js.map +1 -0
  28. package/dist/core/delegation/session-root-mailbox.d.ts +75 -0
  29. package/dist/core/delegation/session-root-mailbox.d.ts.map +1 -0
  30. package/dist/core/delegation/session-root-mailbox.js +627 -0
  31. package/dist/core/delegation/session-root-mailbox.js.map +1 -0
  32. package/dist/core/delegation/worker-agent-control-coordinator.d.ts +102 -9
  33. package/dist/core/delegation/worker-agent-control-coordinator.d.ts.map +1 -1
  34. package/dist/core/delegation/worker-agent-control-coordinator.js +1307 -125
  35. package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -1
  36. package/dist/core/delegation/worker-agent-control.d.ts +183 -8
  37. package/dist/core/delegation/worker-agent-control.d.ts.map +1 -1
  38. package/dist/core/delegation/worker-agent-control.js +778 -48
  39. package/dist/core/delegation/worker-agent-control.js.map +1 -1
  40. package/dist/core/delegation/worker-attempt-executor.d.ts +9 -0
  41. package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
  42. package/dist/core/delegation/worker-attempt-executor.js +479 -214
  43. package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
  44. package/dist/core/delegation/worker-authority-resolver.d.ts +9 -0
  45. package/dist/core/delegation/worker-authority-resolver.d.ts.map +1 -1
  46. package/dist/core/delegation/worker-authority-resolver.js +21 -2
  47. package/dist/core/delegation/worker-authority-resolver.js.map +1 -1
  48. package/dist/core/delegation/worker-context-fork-store.d.ts +71 -0
  49. package/dist/core/delegation/worker-context-fork-store.d.ts.map +1 -0
  50. package/dist/core/delegation/worker-context-fork-store.js +437 -0
  51. package/dist/core/delegation/worker-context-fork-store.js.map +1 -0
  52. package/dist/core/delegation/worker-context-inheritance-policy.d.ts +18 -0
  53. package/dist/core/delegation/worker-context-inheritance-policy.d.ts.map +1 -0
  54. package/dist/core/delegation/worker-context-inheritance-policy.js +28 -0
  55. package/dist/core/delegation/worker-context-inheritance-policy.js.map +1 -0
  56. package/dist/core/delegation/worker-conversation-revision.d.ts +31 -0
  57. package/dist/core/delegation/worker-conversation-revision.d.ts.map +1 -0
  58. package/dist/core/delegation/worker-conversation-revision.js +203 -0
  59. package/dist/core/delegation/worker-conversation-revision.js.map +1 -0
  60. package/dist/core/delegation/worker-conversation-store.d.ts +130 -18
  61. package/dist/core/delegation/worker-conversation-store.d.ts.map +1 -1
  62. package/dist/core/delegation/worker-conversation-store.js +1263 -79
  63. package/dist/core/delegation/worker-conversation-store.js.map +1 -1
  64. package/dist/core/delegation/worker-delegation-controller.d.ts +29 -2
  65. package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
  66. package/dist/core/delegation/worker-delegation-controller.js +625 -111
  67. package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
  68. package/dist/core/delegation/worker-delegation-request.d.ts +2 -0
  69. package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -1
  70. package/dist/core/delegation/worker-delegation-request.js.map +1 -1
  71. package/dist/core/delegation/worker-dispatch-scheduler.d.ts +20 -1
  72. package/dist/core/delegation/worker-dispatch-scheduler.d.ts.map +1 -1
  73. package/dist/core/delegation/worker-dispatch-scheduler.js +210 -37
  74. package/dist/core/delegation/worker-dispatch-scheduler.js.map +1 -1
  75. package/dist/core/delegation/worker-fleet-limits.d.ts +38 -0
  76. package/dist/core/delegation/worker-fleet-limits.d.ts.map +1 -0
  77. package/dist/core/delegation/worker-fleet-limits.js +113 -0
  78. package/dist/core/delegation/worker-fleet-limits.js.map +1 -0
  79. package/dist/core/delegation/worker-lane-projection.d.ts +1 -0
  80. package/dist/core/delegation/worker-lane-projection.d.ts.map +1 -1
  81. package/dist/core/delegation/worker-lane-projection.js +6 -2
  82. package/dist/core/delegation/worker-lane-projection.js.map +1 -1
  83. package/dist/core/delegation/worker-lifecycle.d.ts +20 -3
  84. package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -1
  85. package/dist/core/delegation/worker-lifecycle.js +42 -18
  86. package/dist/core/delegation/worker-lifecycle.js.map +1 -1
  87. package/dist/core/delegation/worker-notification-coordinator.d.ts +4 -0
  88. package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -1
  89. package/dist/core/delegation/worker-notification-coordinator.js +45 -4
  90. package/dist/core/delegation/worker-notification-coordinator.js.map +1 -1
  91. package/dist/core/delegation/worker-provider-turn-protocol.d.ts +50 -0
  92. package/dist/core/delegation/worker-provider-turn-protocol.d.ts.map +1 -0
  93. package/dist/core/delegation/worker-provider-turn-protocol.js +185 -0
  94. package/dist/core/delegation/worker-provider-turn-protocol.js.map +1 -0
  95. package/dist/core/delegation/worker-recovery-coordinator.d.ts +45 -4
  96. package/dist/core/delegation/worker-recovery-coordinator.d.ts.map +1 -1
  97. package/dist/core/delegation/worker-recovery-coordinator.js +223 -17
  98. package/dist/core/delegation/worker-recovery-coordinator.js.map +1 -1
  99. package/dist/core/delegation/worker-retry-policy.d.ts +36 -0
  100. package/dist/core/delegation/worker-retry-policy.d.ts.map +1 -0
  101. package/dist/core/delegation/worker-retry-policy.js +41 -0
  102. package/dist/core/delegation/worker-retry-policy.js.map +1 -0
  103. package/dist/core/delegation/worker-runner.d.ts +3 -1
  104. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  105. package/dist/core/delegation/worker-runner.js +4 -2
  106. package/dist/core/delegation/worker-runner.js.map +1 -1
  107. package/dist/core/delegation/worker-task-view.d.ts +43 -0
  108. package/dist/core/delegation/worker-task-view.d.ts.map +1 -0
  109. package/dist/core/delegation/worker-task-view.js +194 -0
  110. package/dist/core/delegation/worker-task-view.js.map +1 -0
  111. package/dist/core/delegation/worker-terminal-handoff-coordinator.d.ts +55 -0
  112. package/dist/core/delegation/worker-terminal-handoff-coordinator.d.ts.map +1 -0
  113. package/dist/core/delegation/worker-terminal-handoff-coordinator.js +179 -0
  114. package/dist/core/delegation/worker-terminal-handoff-coordinator.js.map +1 -0
  115. package/dist/core/delegation/worker-tree-budget-coordinator.d.ts +2 -2
  116. package/dist/core/delegation/worker-tree-budget-coordinator.d.ts.map +1 -1
  117. package/dist/core/delegation/worker-tree-budget-coordinator.js +12 -46
  118. package/dist/core/delegation/worker-tree-budget-coordinator.js.map +1 -1
  119. package/dist/core/keybindings.d.ts +10 -0
  120. package/dist/core/keybindings.d.ts.map +1 -1
  121. package/dist/core/keybindings.js +2 -0
  122. package/dist/core/keybindings.js.map +1 -1
  123. package/dist/core/orchestration/attempt-ordering.d.ts +9 -0
  124. package/dist/core/orchestration/attempt-ordering.d.ts.map +1 -0
  125. package/dist/core/orchestration/attempt-ordering.js +29 -0
  126. package/dist/core/orchestration/attempt-ordering.js.map +1 -0
  127. package/dist/core/orchestration/capability-gateway.d.ts +19 -0
  128. package/dist/core/orchestration/capability-gateway.d.ts.map +1 -1
  129. package/dist/core/orchestration/capability-gateway.js +19 -2
  130. package/dist/core/orchestration/capability-gateway.js.map +1 -1
  131. package/dist/core/orchestration/contracts.d.ts +43 -3
  132. package/dist/core/orchestration/contracts.d.ts.map +1 -1
  133. package/dist/core/orchestration/contracts.js +24 -0
  134. package/dist/core/orchestration/contracts.js.map +1 -1
  135. package/dist/core/orchestration/delegation-ledger.d.ts +8 -3
  136. package/dist/core/orchestration/delegation-ledger.d.ts.map +1 -1
  137. package/dist/core/orchestration/delegation-ledger.js +148 -55
  138. package/dist/core/orchestration/delegation-ledger.js.map +1 -1
  139. package/dist/core/orchestration/event-store.d.ts +6 -3
  140. package/dist/core/orchestration/event-store.d.ts.map +1 -1
  141. package/dist/core/orchestration/event-store.js +228 -30
  142. package/dist/core/orchestration/event-store.js.map +1 -1
  143. package/dist/core/orchestration/task-runtime-codecs.d.ts +31 -0
  144. package/dist/core/orchestration/task-runtime-codecs.d.ts.map +1 -0
  145. package/dist/core/orchestration/task-runtime-codecs.js +1471 -0
  146. package/dist/core/orchestration/task-runtime-codecs.js.map +1 -0
  147. package/dist/core/orchestration/task-runtime-projection.d.ts +30 -0
  148. package/dist/core/orchestration/task-runtime-projection.d.ts.map +1 -0
  149. package/dist/core/orchestration/task-runtime-projection.js +340 -0
  150. package/dist/core/orchestration/task-runtime-projection.js.map +1 -0
  151. package/dist/core/orchestration/task-runtime-reducer.d.ts +38 -0
  152. package/dist/core/orchestration/task-runtime-reducer.d.ts.map +1 -0
  153. package/dist/core/orchestration/task-runtime-reducer.js +1270 -0
  154. package/dist/core/orchestration/task-runtime-reducer.js.map +1 -0
  155. package/dist/core/orchestration/task-runtime-state.d.ts +142 -0
  156. package/dist/core/orchestration/task-runtime-state.d.ts.map +1 -0
  157. package/dist/core/orchestration/task-runtime-state.js +14 -0
  158. package/dist/core/orchestration/task-runtime-state.js.map +1 -0
  159. package/dist/core/orchestration/task-runtime.d.ts +44 -98
  160. package/dist/core/orchestration/task-runtime.d.ts.map +1 -1
  161. package/dist/core/orchestration/task-runtime.js +357 -1113
  162. package/dist/core/orchestration/task-runtime.js.map +1 -1
  163. package/dist/core/orchestration/worker-context-fork-reference.d.ts +20 -0
  164. package/dist/core/orchestration/worker-context-fork-reference.d.ts.map +1 -0
  165. package/dist/core/orchestration/worker-context-fork-reference.js +53 -0
  166. package/dist/core/orchestration/worker-context-fork-reference.js.map +1 -0
  167. package/dist/core/research/research-runner.d.ts +2 -0
  168. package/dist/core/research/research-runner.d.ts.map +1 -1
  169. package/dist/core/research/research-runner.js +1 -0
  170. package/dist/core/research/research-runner.js.map +1 -1
  171. package/dist/core/runtime-builder.d.ts.map +1 -1
  172. package/dist/core/runtime-builder.js +8 -0
  173. package/dist/core/runtime-builder.js.map +1 -1
  174. package/dist/core/secrets/credential-project.d.ts.map +1 -1
  175. package/dist/core/secrets/credential-project.js +24 -2
  176. package/dist/core/secrets/credential-project.js.map +1 -1
  177. package/dist/core/security/secret-text.d.ts +3 -0
  178. package/dist/core/security/secret-text.d.ts.map +1 -1
  179. package/dist/core/security/secret-text.js +15 -0
  180. package/dist/core/security/secret-text.js.map +1 -1
  181. package/dist/core/settings-manager.d.ts +3 -0
  182. package/dist/core/settings-manager.d.ts.map +1 -1
  183. package/dist/core/settings-manager.js +160 -8
  184. package/dist/core/settings-manager.js.map +1 -1
  185. package/dist/core/tools/delegate.d.ts +31 -4
  186. package/dist/core/tools/delegate.d.ts.map +1 -1
  187. package/dist/core/tools/delegate.js +749 -103
  188. package/dist/core/tools/delegate.js.map +1 -1
  189. package/dist/main.d.ts.map +1 -1
  190. package/dist/main.js +1 -0
  191. package/dist/main.js.map +1 -1
  192. package/dist/modes/interactive/components/activity-lane.d.ts +5 -0
  193. package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -1
  194. package/dist/modes/interactive/components/activity-lane.js +133 -49
  195. package/dist/modes/interactive/components/activity-lane.js.map +1 -1
  196. package/dist/modes/interactive/components/agents-overlay.d.ts +40 -0
  197. package/dist/modes/interactive/components/agents-overlay.d.ts.map +1 -0
  198. package/dist/modes/interactive/components/agents-overlay.js +153 -0
  199. package/dist/modes/interactive/components/agents-overlay.js.map +1 -0
  200. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  201. package/dist/modes/interactive/components/settings-selector.js +18 -13
  202. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  203. package/dist/modes/interactive/interactive-event-controller.d.ts +1 -1
  204. package/dist/modes/interactive/interactive-event-controller.d.ts.map +1 -1
  205. package/dist/modes/interactive/interactive-event-controller.js +6 -3
  206. package/dist/modes/interactive/interactive-event-controller.js.map +1 -1
  207. package/dist/modes/interactive/interactive-mode.d.ts +5 -0
  208. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  209. package/dist/modes/interactive/interactive-mode.js +51 -0
  210. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  211. package/dist/modes/interactive/key-handlers.d.ts +1 -0
  212. package/dist/modes/interactive/key-handlers.d.ts.map +1 -1
  213. package/dist/modes/interactive/key-handlers.js +1 -0
  214. package/dist/modes/interactive/key-handlers.js.map +1 -1
  215. package/docs/harness-architecture.md +61 -17
  216. package/docs/settings.md +17 -9
  217. package/docs/worker-profiles.md +6 -2
  218. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  219. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  220. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  221. package/examples/extensions/sandbox/package-lock.json +2 -2
  222. package/examples/extensions/sandbox/package.json +1 -1
  223. package/examples/extensions/with-deps/package-lock.json +2 -2
  224. package/examples/extensions/with-deps/package.json +1 -1
  225. package/npm-shrinkwrap.json +12 -12
  226. package/package.json +4 -4
@@ -0,0 +1,41 @@
1
+ import { classifyFailure, computeRetryDelayMs } from "@caupulican/pi-agent-core/reliability";
2
+ /**
3
+ * Restart-durable, host-owned attempt ladder policy for delegated workers.
4
+ *
5
+ * The budget model has always carried `maxAttempts`, but nothing drove a second attempt: a
6
+ * failed worker terminalized immediately and "retry" meant the orchestrator model burning a
7
+ * turn to re-delegate blind, losing the worker's transcript. The ladder makes retry a host
8
+ * mechanism instead: a retryable bounded failure suspends the attempt (durable, fenced) and
9
+ * re-enqueues it through the owner scheduler after backoff, resuming from the persisted
10
+ * conversation exactly like restart recovery does.
11
+ *
12
+ * Retries are deliberately evidence-gated: only failures whose recorded detail classifies as
13
+ * transient (network, 5xx, rate limits) are retried. A missing detail or an unknown
14
+ * classification never retries — an undiagnosed failure repeated is spend without evidence.
15
+ */
16
+ export const DEFAULT_WORKER_TASK_ATTEMPTS = 2;
17
+ export const WORKER_TASK_RETRY_POLICY = {
18
+ maxAttempts: DEFAULT_WORKER_TASK_ATTEMPTS,
19
+ baseDelayMs: 5_000,
20
+ maxDelayMs: 60_000,
21
+ jitterRatio: 0.2,
22
+ };
23
+ export function evaluateWorkerRetry(args) {
24
+ if (args.laneStatus !== "failed")
25
+ return { retry: false, reason: `lane_status_${args.laneStatus}` };
26
+ if (args.reasonCode !== "completion_error")
27
+ return { retry: false, reason: `reason_code_${args.reasonCode}` };
28
+ if (!args.reasonDetail)
29
+ return { retry: false, reason: "no_failure_detail" };
30
+ const attemptsAllowed = args.maxAttempts ?? DEFAULT_WORKER_TASK_ATTEMPTS;
31
+ if (args.retriesUsed + 1 >= attemptsAllowed)
32
+ return { retry: false, reason: "attempts_exhausted" };
33
+ const classified = classifyFailure({ message: args.reasonDetail, provider: args.provider });
34
+ if (!classified.retryable)
35
+ return { retry: false, reason: `not_retryable_${classified.reason}` };
36
+ const delayMs = computeRetryDelayMs(WORKER_TASK_RETRY_POLICY, args.retriesUsed + 1, {
37
+ ...(classified.retryAfterMs !== undefined ? { retryAfterMs: classified.retryAfterMs } : {}),
38
+ });
39
+ return { retry: true, reason: classified.reason, delayMs };
40
+ }
41
+ //# sourceMappingURL=worker-retry-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-retry-policy.js","sourceRoot":"","sources":["../../../src/core/delegation/worker-retry-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAoB,MAAM,uCAAuC,CAAC;AAE/G;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAE9C,MAAM,CAAC,MAAM,wBAAwB,GAAgB;IACpD,WAAW,EAAE,4BAA4B;IACzC,WAAW,EAAE,KAAK;IAClB,UAAU,EAAE,MAAM;IAClB,WAAW,EAAE,GAAG;CAChB,CAAC;AAIF,MAAM,UAAU,mBAAmB,CAAC,IASnC;IACA,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;IACpG,IAAI,IAAI,CAAC,UAAU,KAAK,kBAAkB;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;IAC9G,IAAI,CAAC,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC7E,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,IAAI,4BAA4B,CAAC;IACzE,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,eAAe;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IACnG,MAAM,UAAU,GAAG,eAAe,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5F,IAAI,CAAC,UAAU,CAAC,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;IACjG,MAAM,OAAO,GAAG,mBAAmB,CAAC,wBAAwB,EAAE,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE;QACnF,GAAG,CAAC,UAAU,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3F,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AAC5D,CAAC","sourcesContent":["import { classifyFailure, computeRetryDelayMs, type RetryPolicy } from \"@caupulican/pi-agent-core/reliability\";\n\n/**\n * Restart-durable, host-owned attempt ladder policy for delegated workers.\n *\n * The budget model has always carried `maxAttempts`, but nothing drove a second attempt: a\n * failed worker terminalized immediately and \"retry\" meant the orchestrator model burning a\n * turn to re-delegate blind, losing the worker's transcript. The ladder makes retry a host\n * mechanism instead: a retryable bounded failure suspends the attempt (durable, fenced) and\n * re-enqueues it through the owner scheduler after backoff, resuming from the persisted\n * conversation exactly like restart recovery does.\n *\n * Retries are deliberately evidence-gated: only failures whose recorded detail classifies as\n * transient (network, 5xx, rate limits) are retried. A missing detail or an unknown\n * classification never retries — an undiagnosed failure repeated is spend without evidence.\n */\nexport const DEFAULT_WORKER_TASK_ATTEMPTS = 2;\n\nexport const WORKER_TASK_RETRY_POLICY: RetryPolicy = {\n\tmaxAttempts: DEFAULT_WORKER_TASK_ATTEMPTS,\n\tbaseDelayMs: 5_000,\n\tmaxDelayMs: 60_000,\n\tjitterRatio: 0.2,\n};\n\nexport type WorkerRetryDecision = { retry: true; reason: string; delayMs: number } | { retry: false; reason: string };\n\nexport function evaluateWorkerRetry(args: {\n\tlaneStatus: string;\n\treasonCode: string;\n\treasonDetail?: string;\n\tprovider: string;\n\t/** Restart-durable ladder retries already consumed for this attempt. */\n\tretriesUsed: number;\n\t/** Grant budget ceiling for total attempts; defaults to {@link DEFAULT_WORKER_TASK_ATTEMPTS}. */\n\tmaxAttempts?: number;\n}): WorkerRetryDecision {\n\tif (args.laneStatus !== \"failed\") return { retry: false, reason: `lane_status_${args.laneStatus}` };\n\tif (args.reasonCode !== \"completion_error\") return { retry: false, reason: `reason_code_${args.reasonCode}` };\n\tif (!args.reasonDetail) return { retry: false, reason: \"no_failure_detail\" };\n\tconst attemptsAllowed = args.maxAttempts ?? DEFAULT_WORKER_TASK_ATTEMPTS;\n\tif (args.retriesUsed + 1 >= attemptsAllowed) return { retry: false, reason: \"attempts_exhausted\" };\n\tconst classified = classifyFailure({ message: args.reasonDetail, provider: args.provider });\n\tif (!classified.retryable) return { retry: false, reason: `not_retryable_${classified.reason}` };\n\tconst delayMs = computeRetryDelayMs(WORKER_TASK_RETRY_POLICY, args.retriesUsed + 1, {\n\t\t...(classified.retryAfterMs !== undefined ? { retryAfterMs: classified.retryAfterMs } : {}),\n\t});\n\treturn { retry: true, reason: classified.reason, delayMs };\n}\n"]}
@@ -46,7 +46,7 @@ export interface WorkerRunnerOptions {
46
46
  complete: (args: {
47
47
  systemPrompt: string;
48
48
  userPrompt: string;
49
- signal?: AbortSignal;
49
+ signal: AbortSignal;
50
50
  }) => Promise<WorkerCompletion>;
51
51
  /** Live successful child-tool mutations, including writes completed before timeout/cancellation. */
52
52
  getChangedFiles?: () => readonly string[];
@@ -73,6 +73,8 @@ export interface WorkerRunOutcome {
73
73
  accepted: boolean;
74
74
  laneStatus: LaneTerminalStatus;
75
75
  reasonCode: string;
76
+ /** Underlying executor error for bounded failures; drives the in-process retry decision. */
77
+ reasonDetail?: string;
76
78
  costUsd: number;
77
79
  }
78
80
  export declare function buildWorkerUserPrompt(request: WorkerRequest): string;
@@ -1 +1 @@
1
- {"version":3,"file":"worker-runner.d.ts","sourceRoot":"","sources":["../../../src/core/delegation/worker-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker-runner.d.ts","sourceRoot":"","sources":["../../../src/core/delegation/worker-runner.ts"],"names":[],"mappings":"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"}
@@ -21,7 +21,7 @@ export function buildWorkerSystemPrompt(capabilities) {
21
21
  "Use every provided tool when it improves the result; the host enforces the exact inherited grant at execution time.",
22
22
  ...(capabilities.delegate
23
23
  ? [
24
- "You may create agents recursively without a depth or fan-out cap. Use list/transcript/threaded messages to coordinate the tree; the scheduler owns concurrency, budgets, leases, cycle rejection, and cancellation.",
24
+ "You may create agents recursively within host-enforced depth, direct-child, session-agent, and queue bounds. Use list/transcript/threaded messages to coordinate the tree; the scheduler owns concurrency, budgets, leases, exact-cycle rejection, and cancellation.",
25
25
  ]
26
26
  : []),
27
27
  ...(capabilities.write
@@ -242,6 +242,7 @@ function finishOutcome(args) {
242
242
  accepted: acceptance.outcome === "allow",
243
243
  laneStatus: args.laneStatus,
244
244
  reasonCode: args.reasonCode,
245
+ ...(args.reasonDetail ? { reasonDetail: args.reasonDetail } : {}),
245
246
  costUsd: args.costUsd,
246
247
  };
247
248
  }
@@ -287,11 +288,12 @@ export async function runWorker(options) {
287
288
  ...baseClaim,
288
289
  changedFiles: liveChangedFiles,
289
290
  status: cancelled ? "cancelled" : "failed",
290
- summary: `Worker did not complete: ${bounded.failure.reasonCode}`,
291
+ summary: `Worker did not complete: ${bounded.failure.reasonCode}${bounded.failure.detail ? ` — ${bounded.failure.detail}` : ""}`,
291
292
  ...(blockers ? { blockers } : {}),
292
293
  },
293
294
  laneStatus: bounded.failure.status,
294
295
  reasonCode: bounded.failure.reasonCode,
296
+ ...(bounded.failure.detail ? { reasonDetail: bounded.failure.detail } : {}),
295
297
  costUsd,
296
298
  });
297
299
  }
@@ -1 +1 @@
1
- {"version":3,"file":"worker-runner.js","sourceRoot":"","sources":["../../../src/core/delegation/worker-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { runBoundedCompletion } from \"../autonomy/bounded-completion.ts\";\nimport type { EvidenceRef, GateOutcome, WorkerClaim, WorkerRequest } from \"../autonomy/contracts.ts\";\nimport {\n\ttype EvidenceFindingDraft,\n\tnormalizeEvidenceFinding,\n\tprojectEvidenceFindings,\n} from \"../autonomy/evidence-finding-projection.ts\";\nimport type { LaneTerminalStatus } from \"../autonomy/lane-tracker.ts\";\nimport { createEvidenceBundle } from \"../research/evidence-bundle.ts\";\nimport {\n\ttype AppliedActionsReport,\n\tparseWorkerActions,\n\ttype RejectedWorkerActions,\n\ttype WorkerAction,\n} from \"./worker-actions.ts\";\nimport {\n\tcollectBoundedWorkerClaimBlockers,\n\tcollectBoundedWorkerClaimChangedFiles,\n\tMAX_WORKER_CLAIM_BLOCKER_CHARS,\n\tMAX_WORKER_CLAIM_BLOCKERS,\n\tMAX_WORKER_CLAIM_SUMMARY_CHARS,\n\tnormalizeWorkerClaimForHost,\n\tvalidateWorkerClaim,\n} from \"./worker-claim.ts\";\n\n/**\n * Pure execution for one bounded specialist delegation: bounded isolated completion ->\n * parse -> untrusted `WorkerClaim` -> parent validation via {@link validateWorkerClaim}.\n *\n * The injected completion may be a bounded child tool loop. Its tool surface is built and gated by\n * the host; this module keeps the structured-output contract and treats every claim as untrusted\n * until parent validation succeeds.\n */\n\n/** Builds one capability-exact prompt; no role text may deny a tool already granted by policy. */\nexport function buildWorkerSystemPrompt(capabilities: {\n\twrite: boolean;\n\tprocess: boolean;\n\tdelegate?: boolean;\n}): string {\n\tconst resultShape = capabilities.write\n\t\t? '{\"summary\":\"<what you did>\",\"status\":\"completed\"|\"blocked\",\"blockers\":[],\"findings\":[{\"summary\":\"<finding>\",\"confidence\":<0..1>}],\"actions\":[{\"op\":\"write\",\"path\":\"<relative path>\",\"content\":\"<full file content>\"},{\"op\":\"edit\",\"path\":\"<relative path>\",\"old\":\"<exact text>\",\"new\":\"<replacement>\"}]}'\n\t\t: '{\"summary\":\"<what you concluded>\",\"status\":\"completed\"|\"blocked\",\"blockers\":[\"<failure or missing authority>\"],\"findings\":[{\"summary\":\"<one concrete finding>\",\"confidence\":<0..1>}]}';\n\treturn [\n\t\t\"You are an autonomous agent in a durable orchestration tree.\",\n\t\t\"Use every provided tool when it improves the result; the host enforces the exact inherited grant at execution time.\",\n\t\t...(capabilities.delegate\n\t\t\t? [\n\t\t\t\t\t\"You may create agents recursively without a depth or fan-out cap. Use list/transcript/threaded messages to coordinate the tree; the scheduler owns concurrency, budgets, leases, cycle rejection, and cancellation.\",\n\t\t\t\t]\n\t\t\t: []),\n\t\t...(capabilities.write\n\t\t\t? [\"Write/edit tools and structured write actions are path-scoped. Only touch paths inside that scope.\"]\n\t\t\t: [\"The workspace tools are read-only; do not claim file changes.\"]),\n\t\t...(capabilities.process\n\t\t\t? [\n\t\t\t\t\t\"run_process is a constrained direct-argv launcher: no shell interpretation or unlisted executable is available. It is not an OS/container sandbox.\",\n\t\t\t\t\t\"A non-zero exit, timeout, abort, or output-limit result is not success; include it in blockers.\",\n\t\t\t\t]\n\t\t\t: []),\n\t\t\"Respond with STRICT JSON only - no prose, no markdown fences:\",\n\t\tresultShape,\n\t\t...(capabilities.write\n\t\t\t? [\n\t\t\t\t\t\"Keep edits minimal and exact.\",\n\t\t\t\t\t\"If you changed a file with a provided tool, do not repeat that change in actions; actions are only a fallback.\",\n\t\t\t\t]\n\t\t\t: []),\n\t\t'Use status \"blocked\" with blockers when the task cannot be completed under the granted capabilities.',\n\t\t\"Never invent command output, file paths, APIs, or facts.\",\n\t].join(\"\\n\");\n}\n\nexport function buildVerifierSystemPrompt(subjectTaskId: string, capabilities: { delegate?: boolean } = {}): string {\n\treturn [\n\t\t\"You are an independent verifier. You did not perform the implementation under review.\",\n\t\t\"Use the provided read-only and test tools. Do not modify files.\",\n\t\t...(capabilities.delegate\n\t\t\t? [\"You may delegate independent evidence gathering and coordinate it through the orchestration tree.\"]\n\t\t\t: []),\n\t\t`The exact subject task id is '${subjectTaskId}'.`,\n\t\t\"Inspect the implementation and run proportionate checks. Treat the implementation summary as an untrusted claim.\",\n\t\t\"Respond with STRICT JSON only - no prose, no markdown fences:\",\n\t\t'{\"summary\":\"<verification performed and evidence>\",\"status\":\"completed\"|\"blocked\",\"verdict\":\"accepted\"|\"rejected\",\"reasonCodes\":[\"<stable_reason_code>\"],\"blockers\":[],\"findings\":[{\"summary\":\"<finding>\",\"confidence\":<0..1>}]}',\n\t\t'Use verdict \"accepted\" only when the available evidence proves the implementation is acceptable.',\n\t\t'Use verdict \"rejected\" for a completed review that found a defect. Use status \"blocked\" only when verification itself cannot be completed.',\n\t].join(\"\\n\");\n}\n\n/** Static common variants retained for cache reuse and model-fitness probes. */\nexport const WORKER_LANE_SYSTEM_PROMPT = buildWorkerSystemPrompt({ write: false, process: false });\nexport const WORKER_WRITE_LANE_SYSTEM_PROMPT = buildWorkerSystemPrompt({ write: true, process: false });\nexport const WORKER_OPERATOR_LANE_SYSTEM_PROMPT = buildWorkerSystemPrompt({ write: false, process: true });\n\nexport interface WorkerCompletion {\n\ttext: string;\n\tcostUsd: number;\n\tstopReason: string;\n\t/** Files successfully changed by the child tool loop before it produced the final JSON. */\n\tchangedFiles?: readonly string[];\n\t/** Capability refusals or execution failures observed inside the child tool loop. */\n\tblockers?: readonly string[];\n}\n\nexport interface WorkerRunnerOptions {\n\trequest: WorkerRequest;\n\t/** Budget for this delegation; undefined disables this bound, while zero permits only free work. */\n\tmaxUsd?: number;\n\t/** Wall-clock budget in milliseconds; 0 disables. */\n\tmaxWallClockMs: number;\n\t/**\n\t * Pre-allocated spawned-usage report id. Always stamped on the claim so parent validation can\n\t * enforce the cost-visibility invariant (a completed claim without a usage report is blocked).\n\t */\n\tusageReportId: string;\n\tcomplete: (args: { systemPrompt: string; userPrompt: string; signal?: AbortSignal }) => Promise<WorkerCompletion>;\n\t/** Live successful child-tool mutations, including writes completed before timeout/cancellation. */\n\tgetChangedFiles?: () => readonly string[];\n\tsignal?: AbortSignal;\n\tnow?: () => string;\n\t/** Enables the WRITE lane: only honored when the request envelope grants \"filesystem.write\". The\n\t * runner applies the worker's structured actions through the envelope path scope; refusals\n\t * and failures become blockers, never silent drops. */\n\tapplyActions?: (actions: readonly WorkerAction[]) => AppliedActionsReport;\n\t/** Enables the constrained direct-argv operator role prompt. */\n\tprocessCapable?: boolean;\n\t/** Enables recursive delegation and orchestration-tree coordination guidance. */\n\tdelegationCapable?: boolean;\n\t/** Session cwd — the baseline for relative changed-file and envelope paths in parent\n\t * validation. Defaults to process.cwd(). */\n\tcwd?: string;\n\t/** Turns the child into a read-only semantic verifier for this exact durable task. */\n\tverificationSubjectTaskId?: string;\n}\n\nexport interface WorkerRunOutcome {\n\tclaim: WorkerClaim;\n\t/** Parent-review verdict from {@link validateWorkerClaim}; worker output stays untrusted. */\n\tacceptance: GateOutcome;\n\taccepted: boolean;\n\tlaneStatus: LaneTerminalStatus;\n\treasonCode: string;\n\tcostUsd: number;\n}\n\nexport function buildWorkerUserPrompt(request: WorkerRequest): string {\n\treturn [\n\t\t\"Delegated task:\",\n\t\t\"<task>\",\n\t\trequest.instructions,\n\t\t\"</task>\",\n\t\t\"\",\n\t\t\"The task may request a custom output format. Do not replace the worker claim envelope.\",\n\t\t'Always return the JSON object required by the system prompt; put requested details inside \"summary\" and \"findings\".',\n\t].join(\"\\n\");\n}\n\nexport interface ParsedWorkerOutput {\n\tsummary: string;\n\tstatus: \"completed\" | \"blocked\";\n\tblockers: string[];\n\tfindings: EvidenceFindingDraft[];\n\tactions: WorkerAction[];\n\t/** Present when the model emitted an action list that cannot safely reach execution. */\n\tactionRejection?: RejectedWorkerActions;\n\tverdict?: \"accepted\" | \"rejected\";\n\treasonCodes: string[];\n}\n\nconst MAX_WORKER_OUTPUT_CHARS = 512 * 1024;\nconst MAX_WORKER_JSON_CANDIDATES = 64;\nconst MAX_WORKER_JSON_DEPTH = 256;\nconst MAX_WORKER_FINDINGS = 64;\nconst MAX_WORKER_FINDING_CHARS = 2_000;\nconst MAX_WORKER_REASON_CODES = 32;\nconst MAX_WORKER_REASON_CODE_CHARS = 128;\n\nfunction balancedObjectCandidates(text: string): string[] {\n\tconst ranges: Array<{ start: number; end: number }> = [];\n\tconst starts: number[] = [];\n\tlet inString = false;\n\tlet escaped = false;\n\tfor (let index = 0; index < text.length; index++) {\n\t\tconst character = text[index];\n\t\tif (inString) {\n\t\t\tif (escaped) escaped = false;\n\t\t\telse if (character === \"\\\\\") escaped = true;\n\t\t\telse if (character === '\"') inString = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (character === '\"') {\n\t\t\tinString = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (character === \"{\") {\n\t\t\tif (starts.length >= MAX_WORKER_JSON_DEPTH) return ranges.map(({ start, end }) => text.slice(start, end));\n\t\t\tstarts.push(index);\n\t\t\tcontinue;\n\t\t}\n\t\tif (character !== \"}\") continue;\n\t\tconst start = starts.pop();\n\t\tif (start === undefined || ranges.length >= MAX_WORKER_JSON_CANDIDATES) continue;\n\t\tconst end = index + 1;\n\t\tif (end - start <= MAX_WORKER_OUTPUT_CHARS) ranges.push({ start, end });\n\t}\n\treturn ranges.map(({ start, end }) => text.slice(start, end));\n}\n\nfunction workerOutputRecords(text: string): Record<string, unknown>[] {\n\tconst trimmed = text.trim();\n\tif (trimmed.length === 0 || trimmed.length > MAX_WORKER_OUTPUT_CHARS) return [];\n\tconst candidates: string[] = [trimmed];\n\tconst fenced = /```(?:json)?\\s*([\\s\\S]*?)```/.exec(trimmed);\n\tif (fenced?.[1]) candidates.push(fenced[1].trim());\n\tcandidates.push(...balancedObjectCandidates(trimmed));\n\tconst records: Record<string, unknown>[] = [];\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(candidate);\n\t\t\tif (parsed && typeof parsed === \"object\" && !Array.isArray(parsed))\n\t\t\t\trecords.push(parsed as Record<string, unknown>);\n\t\t} catch {\n\t\t\t// Candidate extraction is deliberately best-effort; a later balanced candidate may still be valid.\n\t\t}\n\t}\n\treturn records;\n}\n\nfunction isWorkerStatus(value: unknown): value is ParsedWorkerOutput[\"status\"] {\n\treturn value === \"completed\" || value === \"blocked\";\n}\n\n/**\n * Plain-text fallback is for output that never attempted the worker claim envelope. A JSON object\n * with a claim summary but malformed typed fields is a contract failure, never an implicit success.\n */\nfunction hasMalformedWorkerClaimEnvelope(text: string): boolean {\n\treturn workerOutputRecords(text).some((record) => {\n\t\tif (typeof record.summary !== \"string\" || record.summary.trim().length === 0) return false;\n\t\tif (!isWorkerStatus(record.status)) return true;\n\t\tif (record.verdict !== undefined && record.verdict !== \"accepted\" && record.verdict !== \"rejected\") return true;\n\t\treturn (\n\t\t\trecord.reasonCodes !== undefined &&\n\t\t\t(!Array.isArray(record.reasonCodes) ||\n\t\t\t\trecord.reasonCodes.some((reasonCode) => typeof reasonCode !== \"string\" || reasonCode.trim().length === 0))\n\t\t);\n\t});\n}\n\nexport function parseWorkerOutput(text: string): ParsedWorkerOutput | undefined {\n\tfor (const record of workerOutputRecords(text)) {\n\t\tconst summary = record.summary;\n\t\tif (typeof summary !== \"string\" || summary.trim().length === 0) continue;\n\t\tif (!isWorkerStatus(record.status)) continue;\n\t\tif (record.verdict !== undefined && record.verdict !== \"accepted\" && record.verdict !== \"rejected\") continue;\n\t\tif (\n\t\t\trecord.reasonCodes !== undefined &&\n\t\t\t(!Array.isArray(record.reasonCodes) ||\n\t\t\t\trecord.reasonCodes.some((reasonCode) => typeof reasonCode !== \"string\" || reasonCode.trim().length === 0))\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst status = record.status;\n\t\tconst blockers = Array.isArray(record.blockers)\n\t\t\t? record.blockers\n\t\t\t\t\t.filter((blocker): blocker is string => typeof blocker === \"string\" && blocker.trim().length > 0)\n\t\t\t\t\t.slice(0, MAX_WORKER_CLAIM_BLOCKERS)\n\t\t\t\t\t.map((blocker) => blocker.trim().slice(0, MAX_WORKER_CLAIM_BLOCKER_CHARS))\n\t\t\t: [];\n\t\tconst findings: EvidenceFindingDraft[] = [];\n\t\tif (Array.isArray(record.findings)) {\n\t\t\tfor (let index = 0; index < record.findings.length && index < MAX_WORKER_FINDINGS; index++) {\n\t\t\t\tconst finding = normalizeEvidenceFinding(record.findings[index], MAX_WORKER_FINDING_CHARS);\n\t\t\t\tif (finding) findings.push(finding);\n\t\t\t}\n\t\t}\n\t\tconst verdict = record.verdict === \"accepted\" || record.verdict === \"rejected\" ? record.verdict : undefined;\n\t\tconst reasonCodes = Array.isArray(record.reasonCodes)\n\t\t\t? record.reasonCodes\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(reasonCode): reasonCode is string => typeof reasonCode === \"string\" && reasonCode.trim().length > 0,\n\t\t\t\t\t)\n\t\t\t\t\t.slice(0, MAX_WORKER_REASON_CODES)\n\t\t\t\t\t.map((reasonCode) => reasonCode.trim().slice(0, MAX_WORKER_REASON_CODE_CHARS))\n\t\t\t: [];\n\t\tconst actionOutcome = parseWorkerActions(record.actions);\n\t\treturn {\n\t\t\tsummary: summary.trim().slice(0, MAX_WORKER_CLAIM_SUMMARY_CHARS),\n\t\t\tstatus,\n\t\t\tblockers,\n\t\t\tfindings,\n\t\t\tactions: actionOutcome.kind === \"accepted\" ? actionOutcome.actions : [],\n\t\t\t...(actionOutcome.kind === \"rejected\" ? { actionRejection: actionOutcome } : {}),\n\t\t\t...(verdict ? { verdict } : {}),\n\t\t\treasonCodes,\n\t\t};\n\t}\n\treturn undefined;\n}\n\nfunction buildWorkerEvidence(request: WorkerRequest, findings: ParsedWorkerOutput[\"findings\"]) {\n\tif (findings.length === 0) return undefined;\n\tconst instructionsRef: EvidenceRef = {\n\t\tid: \"src-instructions\",\n\t\tkind: \"user\",\n\t\ttitle: \"Delegated task instructions\",\n\t\ttrusted: true,\n\t\texcerpt: request.instructions.slice(0, 2000),\n\t};\n\tconst synthesisRef: EvidenceRef = {\n\t\tid: \"src-worker\",\n\t\tkind: \"tool\",\n\t\ttitle: \"Delegated worker synthesis\",\n\t\ttrusted: false,\n\t};\n\treturn createEvidenceBundle({\n\t\tquery: `worker:${request.id}`,\n\t\tsources: [instructionsRef, synthesisRef],\n\t\tfindings: projectEvidenceFindings(findings, synthesisRef.id),\n\t});\n}\n\nfunction finishOutcome(args: {\n\trequest: WorkerRequest;\n\tclaim: WorkerClaim;\n\tlaneStatus: LaneTerminalStatus;\n\treasonCode: string;\n\tcostUsd: number;\n\tcwd?: string;\n}): WorkerRunOutcome {\n\tconst claim = normalizeWorkerClaimForHost(args.claim);\n\tconst acceptance = validateWorkerClaim({ request: args.request, claim, cwd: args.cwd });\n\treturn {\n\t\tclaim,\n\t\tacceptance,\n\t\taccepted: acceptance.outcome === \"allow\",\n\t\tlaneStatus: args.laneStatus,\n\t\treasonCode: args.reasonCode,\n\t\tcostUsd: args.costUsd,\n\t};\n}\n\nexport async function runWorker(options: WorkerRunnerOptions): Promise<WorkerRunOutcome> {\n\tconst now = options.now ?? (() => new Date().toISOString());\n\tconst baseClaim = {\n\t\trequestId: options.request.id,\n\t\tchangedFiles: [] as string[],\n\t\tusageReportId: options.usageReportId,\n\t\tcreatedAt: now(),\n\t};\n\n\t// The write prompt requires BOTH the envelope grant and a caller-supplied applier.\n\tconst writeCapable =\n\t\toptions.request.envelope.capabilities.includes(\"filesystem.write\") && options.applyActions !== undefined;\n\n\tconst bounded = await runBoundedCompletion({\n\t\tmaxWallClockMs: options.maxWallClockMs,\n\t\tsignal: options.signal,\n\t\texecute: (signal) =>\n\t\t\toptions.complete({\n\t\t\t\tsystemPrompt: options.verificationSubjectTaskId\n\t\t\t\t\t? buildVerifierSystemPrompt(options.verificationSubjectTaskId, {\n\t\t\t\t\t\t\tdelegate: options.delegationCapable === true,\n\t\t\t\t\t\t})\n\t\t\t\t\t: buildWorkerSystemPrompt({\n\t\t\t\t\t\t\twrite: writeCapable,\n\t\t\t\t\t\t\tprocess: options.processCapable === true,\n\t\t\t\t\t\t\tdelegate: options.delegationCapable === true,\n\t\t\t\t\t\t}),\n\t\t\t\tuserPrompt: buildWorkerUserPrompt(options.request),\n\t\t\t\tsignal,\n\t\t\t}),\n\t});\n\tconst costUsd = bounded.completion?.costUsd ?? 0;\n\tconst liveChangedFilesReport = collectBoundedWorkerClaimChangedFiles(options.getChangedFiles?.() ?? []);\n\tconst liveChangedFiles = liveChangedFilesReport.values;\n\n\tif (bounded.failure) {\n\t\tconst cancelled = bounded.failure.status === \"canceled\" || bounded.failure.status === \"timeout\";\n\t\tconst blockers = liveChangedFilesReport.overflowed\n\t\t\t? [\"worker changed-file report exceeded the durable claim bound; parent review is required\"]\n\t\t\t: undefined;\n\t\treturn finishOutcome({\n\t\t\trequest: options.request,\n\t\t\tcwd: options.cwd,\n\t\t\tclaim: {\n\t\t\t\t...baseClaim,\n\t\t\t\tchangedFiles: liveChangedFiles,\n\t\t\t\tstatus: cancelled ? \"cancelled\" : \"failed\",\n\t\t\t\tsummary: `Worker did not complete: ${bounded.failure.reasonCode}`,\n\t\t\t\t...(blockers ? { blockers } : {}),\n\t\t\t},\n\t\t\tlaneStatus: bounded.failure.status,\n\t\t\treasonCode: bounded.failure.reasonCode,\n\t\t\tcostUsd,\n\t\t});\n\t}\n\n\tconst completion = bounded.completion as WorkerCompletion | undefined;\n\tconst completionChangedFilesReport = collectBoundedWorkerClaimChangedFiles(completion?.changedFiles ?? []);\n\tconst mergedChangedFilesReport = collectBoundedWorkerClaimChangedFiles([\n\t\t...liveChangedFiles,\n\t\t...completionChangedFilesReport.values,\n\t]);\n\tconst changedFilesOverflowed =\n\t\tliveChangedFilesReport.overflowed ||\n\t\tcompletionChangedFilesReport.overflowed ||\n\t\tmergedChangedFilesReport.overflowed;\n\tconst completionChangedFiles = mergedChangedFilesReport.values;\n\tconst completionBaseClaim = { ...baseClaim, changedFiles: completionChangedFiles };\n\tif (!completion || completion.stopReason === \"error\" || completion.stopReason === \"aborted\") {\n\t\treturn finishOutcome({\n\t\t\trequest: options.request,\n\t\t\tcwd: options.cwd,\n\t\t\tclaim: { ...completionBaseClaim, status: \"failed\", summary: \"Worker model call failed.\" },\n\t\t\tlaneStatus: \"failed\",\n\t\t\treasonCode: \"model_error\",\n\t\t\tcostUsd,\n\t\t});\n\t}\n\n\tconst parsed = parseWorkerOutput(completion.text);\n\tif (!parsed) {\n\t\tif (hasMalformedWorkerClaimEnvelope(completion.text)) {\n\t\t\treturn finishOutcome({\n\t\t\t\trequest: options.request,\n\t\t\t\tcwd: options.cwd,\n\t\t\t\tclaim: {\n\t\t\t\t\t...completionBaseClaim,\n\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\tsummary: \"Worker output used a malformed structured claim envelope.\",\n\t\t\t\t},\n\t\t\t\tlaneStatus: \"failed\",\n\t\t\t\treasonCode: \"unparseable_output\",\n\t\t\t\tcostUsd,\n\t\t\t});\n\t\t}\n\t\tconst readOnlyPlainText =\n\t\t\t!options.verificationSubjectTaskId &&\n\t\t\t!writeCapable &&\n\t\t\tcompletion.text.trim().length > 0 &&\n\t\t\tcompletionChangedFiles.length === 0 &&\n\t\t\t!changedFilesOverflowed;\n\t\tif (readOnlyPlainText) {\n\t\t\tconst completionBlockersReport = collectBoundedWorkerClaimBlockers(completion.blockers ?? []);\n\t\t\tconst completionBlockers = completionBlockersReport.overflowed\n\t\t\t\t? [\n\t\t\t\t\t\t...completionBlockersReport.values.slice(0, Math.max(0, MAX_WORKER_CLAIM_BLOCKERS - 1)),\n\t\t\t\t\t\t\"worker blocker report exceeded the durable claim bound; parent review is required\",\n\t\t\t\t\t]\n\t\t\t\t: completionBlockersReport.values;\n\t\t\tconst incompleteNote =\n\t\t\t\tcompletion.stopReason === \"stop\"\n\t\t\t\t\t? \"\"\n\t\t\t\t\t: `\\n\\n[Worker output ended with stop reason '${completion.stopReason}'; verify completeness.]`;\n\t\t\tconst summary = `${completion.text.trim().slice(0, Math.max(0, MAX_WORKER_CLAIM_SUMMARY_CHARS - incompleteNote.length))}${incompleteNote}`;\n\t\t\tconst blocked = completionBlockers.length > 0;\n\t\t\treturn finishOutcome({\n\t\t\t\trequest: options.request,\n\t\t\t\tcwd: options.cwd,\n\t\t\t\tclaim: {\n\t\t\t\t\t...completionBaseClaim,\n\t\t\t\t\tstatus: blocked ? \"blocked\" : \"completed\",\n\t\t\t\t\toutputFormat: \"plain_text\",\n\t\t\t\t\tsummary,\n\t\t\t\t\t...(blocked ? { blockers: completionBlockers } : {}),\n\t\t\t\t},\n\t\t\t\tlaneStatus: blocked ? \"failed\" : \"succeeded\",\n\t\t\t\treasonCode: blocked\n\t\t\t\t\t? \"worker_blocked\"\n\t\t\t\t\t: completion.stopReason === \"stop\"\n\t\t\t\t\t\t? \"worker_completed_plain_text\"\n\t\t\t\t\t\t: \"worker_completed_plain_text_incomplete\",\n\t\t\t\tcostUsd,\n\t\t\t});\n\t\t}\n\t\treturn finishOutcome({\n\t\t\trequest: options.request,\n\t\t\tcwd: options.cwd,\n\t\t\tclaim: {\n\t\t\t\t...completionBaseClaim,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tsummary: \"Worker output was not valid structured JSON.\",\n\t\t\t\t...(changedFilesOverflowed\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tblockers: [\n\t\t\t\t\t\t\t\t\"worker changed-file report exceeded the durable claim bound; parent review is required\",\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t\tlaneStatus: \"failed\",\n\t\t\treasonCode: \"unparseable_output\",\n\t\t\tcostUsd,\n\t\t});\n\t}\n\n\tconst evidence = buildWorkerEvidence(options.request, parsed.findings);\n\tif (parsed.actionRejection) {\n\t\treturn finishOutcome({\n\t\t\trequest: options.request,\n\t\t\tcwd: options.cwd,\n\t\t\tclaim: {\n\t\t\t\t...completionBaseClaim,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tsummary: \"Worker output contained invalid structured actions.\",\n\t\t\t\tblockers: [parsed.actionRejection.reasonCode],\n\t\t\t},\n\t\t\tlaneStatus: \"failed\",\n\t\t\treasonCode: \"unparseable_output\",\n\t\t\tcostUsd,\n\t\t});\n\t}\n\tif (options.verificationSubjectTaskId && (!parsed.verdict || parsed.reasonCodes.length === 0)) {\n\t\treturn finishOutcome({\n\t\t\trequest: options.request,\n\t\t\tcwd: options.cwd,\n\t\t\tclaim: {\n\t\t\t\t...completionBaseClaim,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tsummary: \"Verifier output omitted its typed verdict or reasonCodes.\",\n\t\t\t},\n\t\t\tlaneStatus: \"failed\",\n\t\t\treasonCode: \"invalid_verifier_result\",\n\t\t\tcostUsd,\n\t\t});\n\t}\n\tlet changedFiles: string[] = [...completionChangedFiles];\n\tconst completionBlockersReport = collectBoundedWorkerClaimBlockers(completion.blockers ?? []);\n\tconst actionBlockers: string[] = [...completionBlockersReport.values];\n\tif (changedFilesOverflowed) {\n\t\tactionBlockers.push(\"worker changed-file report exceeded the durable claim bound; parent review is required\");\n\t}\n\tif (completionBlockersReport.overflowed) {\n\t\tactionBlockers.push(\"worker blocker report exceeded the durable claim bound; parent review is required\");\n\t}\n\tif (!writeCapable && completionChangedFiles.length > 0) {\n\t\tactionBlockers.push(\"worker reported file changes without a filesystem.write envelope grant\");\n\t}\n\tif (writeCapable && parsed.status !== \"blocked\" && parsed.actions.length > 0 && options.applyActions) {\n\t\t// Runner-side application through the envelope path scope: refusals and failures are\n\t\t// surfaced as blockers so a partially-applied change can never look like clean success.\n\t\tconst applied = options.applyActions(parsed.actions);\n\t\tconst appliedChangedFilesReport = collectBoundedWorkerClaimChangedFiles(applied.changedFiles);\n\t\tconst mergedAppliedChangedFilesReport = collectBoundedWorkerClaimChangedFiles([\n\t\t\t...changedFiles,\n\t\t\t...appliedChangedFilesReport.values,\n\t\t]);\n\t\tchangedFiles = mergedAppliedChangedFilesReport.values;\n\t\tif (appliedChangedFilesReport.overflowed || mergedAppliedChangedFilesReport.overflowed) {\n\t\t\tactionBlockers.push(\"applied changed-file report exceeded the durable claim bound; parent review is required\");\n\t\t}\n\t\tfor (const refusal of applied.refused) {\n\t\t\tactionBlockers.push(`action refused (${refusal.path}): ${refusal.reason}`);\n\t\t}\n\t\tfor (const failure of applied.failed) {\n\t\t\tactionBlockers.push(`action failed (${failure.path}): ${failure.reason}`);\n\t\t}\n\t\tfor (const inspection of applied.inspectionRequired) {\n\t\t\tactionBlockers.push(\n\t\t\t\t`action requires workspace/evidence inspection (${inspection.path}, ${inspection.state}): ${inspection.reasonCode}`,\n\t\t\t);\n\t\t}\n\t} else if (!writeCapable && parsed.actions.length > 0) {\n\t\tactionBlockers.push(\"worker emitted file actions without a filesystem.write envelope grant; nothing was applied\");\n\t}\n\tconst allBlockersReport = collectBoundedWorkerClaimBlockers([...parsed.blockers, ...actionBlockers]);\n\tconst allBlockers = allBlockersReport.overflowed\n\t\t? [\n\t\t\t\t...allBlockersReport.values.slice(0, Math.max(0, MAX_WORKER_CLAIM_BLOCKERS - 1)),\n\t\t\t\t\"worker blocker report exceeded the durable claim bound; parent review is required\",\n\t\t\t]\n\t\t: allBlockersReport.values;\n\tconst claim: WorkerClaim = {\n\t\t...baseClaim,\n\t\tchangedFiles,\n\t\tstatus: parsed.status === \"blocked\" || allBlockers.length > 0 ? \"blocked\" : \"completed\",\n\t\tsummary: parsed.summary,\n\t\t...(allBlockers.length > 0 ? { blockers: allBlockers } : {}),\n\t\t...(evidence ? { evidence } : {}),\n\t\t...(options.verificationSubjectTaskId && parsed.verdict\n\t\t\t? {\n\t\t\t\t\tverification: {\n\t\t\t\t\t\tsubjectTaskId: options.verificationSubjectTaskId,\n\t\t\t\t\t\tverdict: parsed.verdict,\n\t\t\t\t\t\treasonCodes: parsed.reasonCodes,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n\n\tif (claim.status === \"blocked\") {\n\t\treturn finishOutcome({\n\t\t\trequest: options.request,\n\t\t\tcwd: options.cwd,\n\t\t\tclaim,\n\t\t\tlaneStatus: \"failed\",\n\t\t\treasonCode: \"worker_blocked\",\n\t\t\tcostUsd,\n\t\t});\n\t}\n\n\tconst overBudget = options.maxUsd !== undefined && costUsd > options.maxUsd;\n\treturn finishOutcome({\n\t\trequest: options.request,\n\t\tcwd: options.cwd,\n\t\tclaim,\n\t\tlaneStatus: overBudget ? \"budget_exhausted\" : \"succeeded\",\n\t\treasonCode: overBudget\n\t\t\t? \"cost_budget_exceeded\"\n\t\t\t: claim.verification\n\t\t\t\t? claim.verification.verdict === \"accepted\"\n\t\t\t\t\t? \"verification_accepted\"\n\t\t\t\t\t: \"verification_rejected\"\n\t\t\t\t: \"worker_completed\",\n\t\tcostUsd,\n\t});\n}\n"]}
1
+ {"version":3,"file":"worker-runner.js","sourceRoot":"","sources":["../../../src/core/delegation/worker-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { runBoundedCompletion } from \"../autonomy/bounded-completion.ts\";\nimport type { EvidenceRef, GateOutcome, WorkerClaim, WorkerRequest } from \"../autonomy/contracts.ts\";\nimport {\n\ttype EvidenceFindingDraft,\n\tnormalizeEvidenceFinding,\n\tprojectEvidenceFindings,\n} from \"../autonomy/evidence-finding-projection.ts\";\nimport type { LaneTerminalStatus } from \"../autonomy/lane-tracker.ts\";\nimport { createEvidenceBundle } from \"../research/evidence-bundle.ts\";\nimport {\n\ttype AppliedActionsReport,\n\tparseWorkerActions,\n\ttype RejectedWorkerActions,\n\ttype WorkerAction,\n} from \"./worker-actions.ts\";\nimport {\n\tcollectBoundedWorkerClaimBlockers,\n\tcollectBoundedWorkerClaimChangedFiles,\n\tMAX_WORKER_CLAIM_BLOCKER_CHARS,\n\tMAX_WORKER_CLAIM_BLOCKERS,\n\tMAX_WORKER_CLAIM_SUMMARY_CHARS,\n\tnormalizeWorkerClaimForHost,\n\tvalidateWorkerClaim,\n} from \"./worker-claim.ts\";\n\n/**\n * Pure execution for one bounded specialist delegation: bounded isolated completion ->\n * parse -> untrusted `WorkerClaim` -> parent validation via {@link validateWorkerClaim}.\n *\n * The injected completion may be a bounded child tool loop. Its tool surface is built and gated by\n * the host; this module keeps the structured-output contract and treats every claim as untrusted\n * until parent validation succeeds.\n */\n\n/** Builds one capability-exact prompt; no role text may deny a tool already granted by policy. */\nexport function buildWorkerSystemPrompt(capabilities: {\n\twrite: boolean;\n\tprocess: boolean;\n\tdelegate?: boolean;\n}): string {\n\tconst resultShape = capabilities.write\n\t\t? '{\"summary\":\"<what you did>\",\"status\":\"completed\"|\"blocked\",\"blockers\":[],\"findings\":[{\"summary\":\"<finding>\",\"confidence\":<0..1>}],\"actions\":[{\"op\":\"write\",\"path\":\"<relative path>\",\"content\":\"<full file content>\"},{\"op\":\"edit\",\"path\":\"<relative path>\",\"old\":\"<exact text>\",\"new\":\"<replacement>\"}]}'\n\t\t: '{\"summary\":\"<what you concluded>\",\"status\":\"completed\"|\"blocked\",\"blockers\":[\"<failure or missing authority>\"],\"findings\":[{\"summary\":\"<one concrete finding>\",\"confidence\":<0..1>}]}';\n\treturn [\n\t\t\"You are an autonomous agent in a durable orchestration tree.\",\n\t\t\"Use every provided tool when it improves the result; the host enforces the exact inherited grant at execution time.\",\n\t\t...(capabilities.delegate\n\t\t\t? [\n\t\t\t\t\t\"You may create agents recursively within host-enforced depth, direct-child, session-agent, and queue bounds. Use list/transcript/threaded messages to coordinate the tree; the scheduler owns concurrency, budgets, leases, exact-cycle rejection, and cancellation.\",\n\t\t\t\t]\n\t\t\t: []),\n\t\t...(capabilities.write\n\t\t\t? [\"Write/edit tools and structured write actions are path-scoped. Only touch paths inside that scope.\"]\n\t\t\t: [\"The workspace tools are read-only; do not claim file changes.\"]),\n\t\t...(capabilities.process\n\t\t\t? [\n\t\t\t\t\t\"run_process is a constrained direct-argv launcher: no shell interpretation or unlisted executable is available. It is not an OS/container sandbox.\",\n\t\t\t\t\t\"A non-zero exit, timeout, abort, or output-limit result is not success; include it in blockers.\",\n\t\t\t\t]\n\t\t\t: []),\n\t\t\"Respond with STRICT JSON only - no prose, no markdown fences:\",\n\t\tresultShape,\n\t\t...(capabilities.write\n\t\t\t? [\n\t\t\t\t\t\"Keep edits minimal and exact.\",\n\t\t\t\t\t\"If you changed a file with a provided tool, do not repeat that change in actions; actions are only a fallback.\",\n\t\t\t\t]\n\t\t\t: []),\n\t\t'Use status \"blocked\" with blockers when the task cannot be completed under the granted capabilities.',\n\t\t\"Never invent command output, file paths, APIs, or facts.\",\n\t].join(\"\\n\");\n}\n\nexport function buildVerifierSystemPrompt(subjectTaskId: string, capabilities: { delegate?: boolean } = {}): string {\n\treturn [\n\t\t\"You are an independent verifier. You did not perform the implementation under review.\",\n\t\t\"Use the provided read-only and test tools. Do not modify files.\",\n\t\t...(capabilities.delegate\n\t\t\t? [\"You may delegate independent evidence gathering and coordinate it through the orchestration tree.\"]\n\t\t\t: []),\n\t\t`The exact subject task id is '${subjectTaskId}'.`,\n\t\t\"Inspect the implementation and run proportionate checks. Treat the implementation summary as an untrusted claim.\",\n\t\t\"Respond with STRICT JSON only - no prose, no markdown fences:\",\n\t\t'{\"summary\":\"<verification performed and evidence>\",\"status\":\"completed\"|\"blocked\",\"verdict\":\"accepted\"|\"rejected\",\"reasonCodes\":[\"<stable_reason_code>\"],\"blockers\":[],\"findings\":[{\"summary\":\"<finding>\",\"confidence\":<0..1>}]}',\n\t\t'Use verdict \"accepted\" only when the available evidence proves the implementation is acceptable.',\n\t\t'Use verdict \"rejected\" for a completed review that found a defect. Use status \"blocked\" only when verification itself cannot be completed.',\n\t].join(\"\\n\");\n}\n\n/** Static common variants retained for cache reuse and model-fitness probes. */\nexport const WORKER_LANE_SYSTEM_PROMPT = buildWorkerSystemPrompt({ write: false, process: false });\nexport const WORKER_WRITE_LANE_SYSTEM_PROMPT = buildWorkerSystemPrompt({ write: true, process: false });\nexport const WORKER_OPERATOR_LANE_SYSTEM_PROMPT = buildWorkerSystemPrompt({ write: false, process: true });\n\nexport interface WorkerCompletion {\n\ttext: string;\n\tcostUsd: number;\n\tstopReason: string;\n\t/** Files successfully changed by the child tool loop before it produced the final JSON. */\n\tchangedFiles?: readonly string[];\n\t/** Capability refusals or execution failures observed inside the child tool loop. */\n\tblockers?: readonly string[];\n}\n\nexport interface WorkerRunnerOptions {\n\trequest: WorkerRequest;\n\t/** Budget for this delegation; undefined disables this bound, while zero permits only free work. */\n\tmaxUsd?: number;\n\t/** Wall-clock budget in milliseconds; 0 disables. */\n\tmaxWallClockMs: number;\n\t/**\n\t * Pre-allocated spawned-usage report id. Always stamped on the claim so parent validation can\n\t * enforce the cost-visibility invariant (a completed claim without a usage report is blocked).\n\t */\n\tusageReportId: string;\n\tcomplete: (args: { systemPrompt: string; userPrompt: string; signal: AbortSignal }) => Promise<WorkerCompletion>;\n\t/** Live successful child-tool mutations, including writes completed before timeout/cancellation. */\n\tgetChangedFiles?: () => readonly string[];\n\tsignal?: AbortSignal;\n\tnow?: () => string;\n\t/** Enables the WRITE lane: only honored when the request envelope grants \"filesystem.write\". The\n\t * runner applies the worker's structured actions through the envelope path scope; refusals\n\t * and failures become blockers, never silent drops. */\n\tapplyActions?: (actions: readonly WorkerAction[]) => AppliedActionsReport;\n\t/** Enables the constrained direct-argv operator role prompt. */\n\tprocessCapable?: boolean;\n\t/** Enables recursive delegation and orchestration-tree coordination guidance. */\n\tdelegationCapable?: boolean;\n\t/** Session cwd — the baseline for relative changed-file and envelope paths in parent\n\t * validation. Defaults to process.cwd(). */\n\tcwd?: string;\n\t/** Turns the child into a read-only semantic verifier for this exact durable task. */\n\tverificationSubjectTaskId?: string;\n}\n\nexport interface WorkerRunOutcome {\n\tclaim: WorkerClaim;\n\t/** Parent-review verdict from {@link validateWorkerClaim}; worker output stays untrusted. */\n\tacceptance: GateOutcome;\n\taccepted: boolean;\n\tlaneStatus: LaneTerminalStatus;\n\treasonCode: string;\n\t/** Underlying executor error for bounded failures; drives the in-process retry decision. */\n\treasonDetail?: string;\n\tcostUsd: number;\n}\n\nexport function buildWorkerUserPrompt(request: WorkerRequest): string {\n\treturn [\n\t\t\"Delegated task:\",\n\t\t\"<task>\",\n\t\trequest.instructions,\n\t\t\"</task>\",\n\t\t\"\",\n\t\t\"The task may request a custom output format. Do not replace the worker claim envelope.\",\n\t\t'Always return the JSON object required by the system prompt; put requested details inside \"summary\" and \"findings\".',\n\t].join(\"\\n\");\n}\n\nexport interface ParsedWorkerOutput {\n\tsummary: string;\n\tstatus: \"completed\" | \"blocked\";\n\tblockers: string[];\n\tfindings: EvidenceFindingDraft[];\n\tactions: WorkerAction[];\n\t/** Present when the model emitted an action list that cannot safely reach execution. */\n\tactionRejection?: RejectedWorkerActions;\n\tverdict?: \"accepted\" | \"rejected\";\n\treasonCodes: string[];\n}\n\nconst MAX_WORKER_OUTPUT_CHARS = 512 * 1024;\nconst MAX_WORKER_JSON_CANDIDATES = 64;\nconst MAX_WORKER_JSON_DEPTH = 256;\nconst MAX_WORKER_FINDINGS = 64;\nconst MAX_WORKER_FINDING_CHARS = 2_000;\nconst MAX_WORKER_REASON_CODES = 32;\nconst MAX_WORKER_REASON_CODE_CHARS = 128;\n\nfunction balancedObjectCandidates(text: string): string[] {\n\tconst ranges: Array<{ start: number; end: number }> = [];\n\tconst starts: number[] = [];\n\tlet inString = false;\n\tlet escaped = false;\n\tfor (let index = 0; index < text.length; index++) {\n\t\tconst character = text[index];\n\t\tif (inString) {\n\t\t\tif (escaped) escaped = false;\n\t\t\telse if (character === \"\\\\\") escaped = true;\n\t\t\telse if (character === '\"') inString = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (character === '\"') {\n\t\t\tinString = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (character === \"{\") {\n\t\t\tif (starts.length >= MAX_WORKER_JSON_DEPTH) return ranges.map(({ start, end }) => text.slice(start, end));\n\t\t\tstarts.push(index);\n\t\t\tcontinue;\n\t\t}\n\t\tif (character !== \"}\") continue;\n\t\tconst start = starts.pop();\n\t\tif (start === undefined || ranges.length >= MAX_WORKER_JSON_CANDIDATES) continue;\n\t\tconst end = index + 1;\n\t\tif (end - start <= MAX_WORKER_OUTPUT_CHARS) ranges.push({ start, end });\n\t}\n\treturn ranges.map(({ start, end }) => text.slice(start, end));\n}\n\nfunction workerOutputRecords(text: string): Record<string, unknown>[] {\n\tconst trimmed = text.trim();\n\tif (trimmed.length === 0 || trimmed.length > MAX_WORKER_OUTPUT_CHARS) return [];\n\tconst candidates: string[] = [trimmed];\n\tconst fenced = /```(?:json)?\\s*([\\s\\S]*?)```/.exec(trimmed);\n\tif (fenced?.[1]) candidates.push(fenced[1].trim());\n\tcandidates.push(...balancedObjectCandidates(trimmed));\n\tconst records: Record<string, unknown>[] = [];\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(candidate);\n\t\t\tif (parsed && typeof parsed === \"object\" && !Array.isArray(parsed))\n\t\t\t\trecords.push(parsed as Record<string, unknown>);\n\t\t} catch {\n\t\t\t// Candidate extraction is deliberately best-effort; a later balanced candidate may still be valid.\n\t\t}\n\t}\n\treturn records;\n}\n\nfunction isWorkerStatus(value: unknown): value is ParsedWorkerOutput[\"status\"] {\n\treturn value === \"completed\" || value === \"blocked\";\n}\n\n/**\n * Plain-text fallback is for output that never attempted the worker claim envelope. A JSON object\n * with a claim summary but malformed typed fields is a contract failure, never an implicit success.\n */\nfunction hasMalformedWorkerClaimEnvelope(text: string): boolean {\n\treturn workerOutputRecords(text).some((record) => {\n\t\tif (typeof record.summary !== \"string\" || record.summary.trim().length === 0) return false;\n\t\tif (!isWorkerStatus(record.status)) return true;\n\t\tif (record.verdict !== undefined && record.verdict !== \"accepted\" && record.verdict !== \"rejected\") return true;\n\t\treturn (\n\t\t\trecord.reasonCodes !== undefined &&\n\t\t\t(!Array.isArray(record.reasonCodes) ||\n\t\t\t\trecord.reasonCodes.some((reasonCode) => typeof reasonCode !== \"string\" || reasonCode.trim().length === 0))\n\t\t);\n\t});\n}\n\nexport function parseWorkerOutput(text: string): ParsedWorkerOutput | undefined {\n\tfor (const record of workerOutputRecords(text)) {\n\t\tconst summary = record.summary;\n\t\tif (typeof summary !== \"string\" || summary.trim().length === 0) continue;\n\t\tif (!isWorkerStatus(record.status)) continue;\n\t\tif (record.verdict !== undefined && record.verdict !== \"accepted\" && record.verdict !== \"rejected\") continue;\n\t\tif (\n\t\t\trecord.reasonCodes !== undefined &&\n\t\t\t(!Array.isArray(record.reasonCodes) ||\n\t\t\t\trecord.reasonCodes.some((reasonCode) => typeof reasonCode !== \"string\" || reasonCode.trim().length === 0))\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst status = record.status;\n\t\tconst blockers = Array.isArray(record.blockers)\n\t\t\t? record.blockers\n\t\t\t\t\t.filter((blocker): blocker is string => typeof blocker === \"string\" && blocker.trim().length > 0)\n\t\t\t\t\t.slice(0, MAX_WORKER_CLAIM_BLOCKERS)\n\t\t\t\t\t.map((blocker) => blocker.trim().slice(0, MAX_WORKER_CLAIM_BLOCKER_CHARS))\n\t\t\t: [];\n\t\tconst findings: EvidenceFindingDraft[] = [];\n\t\tif (Array.isArray(record.findings)) {\n\t\t\tfor (let index = 0; index < record.findings.length && index < MAX_WORKER_FINDINGS; index++) {\n\t\t\t\tconst finding = normalizeEvidenceFinding(record.findings[index], MAX_WORKER_FINDING_CHARS);\n\t\t\t\tif (finding) findings.push(finding);\n\t\t\t}\n\t\t}\n\t\tconst verdict = record.verdict === \"accepted\" || record.verdict === \"rejected\" ? record.verdict : undefined;\n\t\tconst reasonCodes = Array.isArray(record.reasonCodes)\n\t\t\t? record.reasonCodes\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(reasonCode): reasonCode is string => typeof reasonCode === \"string\" && reasonCode.trim().length > 0,\n\t\t\t\t\t)\n\t\t\t\t\t.slice(0, MAX_WORKER_REASON_CODES)\n\t\t\t\t\t.map((reasonCode) => reasonCode.trim().slice(0, MAX_WORKER_REASON_CODE_CHARS))\n\t\t\t: [];\n\t\tconst actionOutcome = parseWorkerActions(record.actions);\n\t\treturn {\n\t\t\tsummary: summary.trim().slice(0, MAX_WORKER_CLAIM_SUMMARY_CHARS),\n\t\t\tstatus,\n\t\t\tblockers,\n\t\t\tfindings,\n\t\t\tactions: actionOutcome.kind === \"accepted\" ? actionOutcome.actions : [],\n\t\t\t...(actionOutcome.kind === \"rejected\" ? { actionRejection: actionOutcome } : {}),\n\t\t\t...(verdict ? { verdict } : {}),\n\t\t\treasonCodes,\n\t\t};\n\t}\n\treturn undefined;\n}\n\nfunction buildWorkerEvidence(request: WorkerRequest, findings: ParsedWorkerOutput[\"findings\"]) {\n\tif (findings.length === 0) return undefined;\n\tconst instructionsRef: EvidenceRef = {\n\t\tid: \"src-instructions\",\n\t\tkind: \"user\",\n\t\ttitle: \"Delegated task instructions\",\n\t\ttrusted: true,\n\t\texcerpt: request.instructions.slice(0, 2000),\n\t};\n\tconst synthesisRef: EvidenceRef = {\n\t\tid: \"src-worker\",\n\t\tkind: \"tool\",\n\t\ttitle: \"Delegated worker synthesis\",\n\t\ttrusted: false,\n\t};\n\treturn createEvidenceBundle({\n\t\tquery: `worker:${request.id}`,\n\t\tsources: [instructionsRef, synthesisRef],\n\t\tfindings: projectEvidenceFindings(findings, synthesisRef.id),\n\t});\n}\n\nfunction finishOutcome(args: {\n\trequest: WorkerRequest;\n\tclaim: WorkerClaim;\n\tlaneStatus: LaneTerminalStatus;\n\treasonCode: string;\n\treasonDetail?: string;\n\tcostUsd: number;\n\tcwd?: string;\n}): WorkerRunOutcome {\n\tconst claim = normalizeWorkerClaimForHost(args.claim);\n\tconst acceptance = validateWorkerClaim({ request: args.request, claim, cwd: args.cwd });\n\treturn {\n\t\tclaim,\n\t\tacceptance,\n\t\taccepted: acceptance.outcome === \"allow\",\n\t\tlaneStatus: args.laneStatus,\n\t\treasonCode: args.reasonCode,\n\t\t...(args.reasonDetail ? { reasonDetail: args.reasonDetail } : {}),\n\t\tcostUsd: args.costUsd,\n\t};\n}\n\nexport async function runWorker(options: WorkerRunnerOptions): Promise<WorkerRunOutcome> {\n\tconst now = options.now ?? (() => new Date().toISOString());\n\tconst baseClaim = {\n\t\trequestId: options.request.id,\n\t\tchangedFiles: [] as string[],\n\t\tusageReportId: options.usageReportId,\n\t\tcreatedAt: now(),\n\t};\n\n\t// The write prompt requires BOTH the envelope grant and a caller-supplied applier.\n\tconst writeCapable =\n\t\toptions.request.envelope.capabilities.includes(\"filesystem.write\") && options.applyActions !== undefined;\n\n\tconst bounded = await runBoundedCompletion({\n\t\tmaxWallClockMs: options.maxWallClockMs,\n\t\tsignal: options.signal,\n\t\texecute: (signal) =>\n\t\t\toptions.complete({\n\t\t\t\tsystemPrompt: options.verificationSubjectTaskId\n\t\t\t\t\t? buildVerifierSystemPrompt(options.verificationSubjectTaskId, {\n\t\t\t\t\t\t\tdelegate: options.delegationCapable === true,\n\t\t\t\t\t\t})\n\t\t\t\t\t: buildWorkerSystemPrompt({\n\t\t\t\t\t\t\twrite: writeCapable,\n\t\t\t\t\t\t\tprocess: options.processCapable === true,\n\t\t\t\t\t\t\tdelegate: options.delegationCapable === true,\n\t\t\t\t\t\t}),\n\t\t\t\tuserPrompt: buildWorkerUserPrompt(options.request),\n\t\t\t\tsignal,\n\t\t\t}),\n\t});\n\tconst costUsd = bounded.completion?.costUsd ?? 0;\n\tconst liveChangedFilesReport = collectBoundedWorkerClaimChangedFiles(options.getChangedFiles?.() ?? []);\n\tconst liveChangedFiles = liveChangedFilesReport.values;\n\n\tif (bounded.failure) {\n\t\tconst cancelled = bounded.failure.status === \"canceled\" || bounded.failure.status === \"timeout\";\n\t\tconst blockers = liveChangedFilesReport.overflowed\n\t\t\t? [\"worker changed-file report exceeded the durable claim bound; parent review is required\"]\n\t\t\t: undefined;\n\t\treturn finishOutcome({\n\t\t\trequest: options.request,\n\t\t\tcwd: options.cwd,\n\t\t\tclaim: {\n\t\t\t\t...baseClaim,\n\t\t\t\tchangedFiles: liveChangedFiles,\n\t\t\t\tstatus: cancelled ? \"cancelled\" : \"failed\",\n\t\t\t\tsummary: `Worker did not complete: ${bounded.failure.reasonCode}${\n\t\t\t\t\tbounded.failure.detail ? ` — ${bounded.failure.detail}` : \"\"\n\t\t\t\t}`,\n\t\t\t\t...(blockers ? { blockers } : {}),\n\t\t\t},\n\t\t\tlaneStatus: bounded.failure.status,\n\t\t\treasonCode: bounded.failure.reasonCode,\n\t\t\t...(bounded.failure.detail ? { reasonDetail: bounded.failure.detail } : {}),\n\t\t\tcostUsd,\n\t\t});\n\t}\n\n\tconst completion = bounded.completion as WorkerCompletion | undefined;\n\tconst completionChangedFilesReport = collectBoundedWorkerClaimChangedFiles(completion?.changedFiles ?? []);\n\tconst mergedChangedFilesReport = collectBoundedWorkerClaimChangedFiles([\n\t\t...liveChangedFiles,\n\t\t...completionChangedFilesReport.values,\n\t]);\n\tconst changedFilesOverflowed =\n\t\tliveChangedFilesReport.overflowed ||\n\t\tcompletionChangedFilesReport.overflowed ||\n\t\tmergedChangedFilesReport.overflowed;\n\tconst completionChangedFiles = mergedChangedFilesReport.values;\n\tconst completionBaseClaim = { ...baseClaim, changedFiles: completionChangedFiles };\n\tif (!completion || completion.stopReason === \"error\" || completion.stopReason === \"aborted\") {\n\t\treturn finishOutcome({\n\t\t\trequest: options.request,\n\t\t\tcwd: options.cwd,\n\t\t\tclaim: { ...completionBaseClaim, status: \"failed\", summary: \"Worker model call failed.\" },\n\t\t\tlaneStatus: \"failed\",\n\t\t\treasonCode: \"model_error\",\n\t\t\tcostUsd,\n\t\t});\n\t}\n\n\tconst parsed = parseWorkerOutput(completion.text);\n\tif (!parsed) {\n\t\tif (hasMalformedWorkerClaimEnvelope(completion.text)) {\n\t\t\treturn finishOutcome({\n\t\t\t\trequest: options.request,\n\t\t\t\tcwd: options.cwd,\n\t\t\t\tclaim: {\n\t\t\t\t\t...completionBaseClaim,\n\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\tsummary: \"Worker output used a malformed structured claim envelope.\",\n\t\t\t\t},\n\t\t\t\tlaneStatus: \"failed\",\n\t\t\t\treasonCode: \"unparseable_output\",\n\t\t\t\tcostUsd,\n\t\t\t});\n\t\t}\n\t\tconst readOnlyPlainText =\n\t\t\t!options.verificationSubjectTaskId &&\n\t\t\t!writeCapable &&\n\t\t\tcompletion.text.trim().length > 0 &&\n\t\t\tcompletionChangedFiles.length === 0 &&\n\t\t\t!changedFilesOverflowed;\n\t\tif (readOnlyPlainText) {\n\t\t\tconst completionBlockersReport = collectBoundedWorkerClaimBlockers(completion.blockers ?? []);\n\t\t\tconst completionBlockers = completionBlockersReport.overflowed\n\t\t\t\t? [\n\t\t\t\t\t\t...completionBlockersReport.values.slice(0, Math.max(0, MAX_WORKER_CLAIM_BLOCKERS - 1)),\n\t\t\t\t\t\t\"worker blocker report exceeded the durable claim bound; parent review is required\",\n\t\t\t\t\t]\n\t\t\t\t: completionBlockersReport.values;\n\t\t\tconst incompleteNote =\n\t\t\t\tcompletion.stopReason === \"stop\"\n\t\t\t\t\t? \"\"\n\t\t\t\t\t: `\\n\\n[Worker output ended with stop reason '${completion.stopReason}'; verify completeness.]`;\n\t\t\tconst summary = `${completion.text.trim().slice(0, Math.max(0, MAX_WORKER_CLAIM_SUMMARY_CHARS - incompleteNote.length))}${incompleteNote}`;\n\t\t\tconst blocked = completionBlockers.length > 0;\n\t\t\treturn finishOutcome({\n\t\t\t\trequest: options.request,\n\t\t\t\tcwd: options.cwd,\n\t\t\t\tclaim: {\n\t\t\t\t\t...completionBaseClaim,\n\t\t\t\t\tstatus: blocked ? \"blocked\" : \"completed\",\n\t\t\t\t\toutputFormat: \"plain_text\",\n\t\t\t\t\tsummary,\n\t\t\t\t\t...(blocked ? { blockers: completionBlockers } : {}),\n\t\t\t\t},\n\t\t\t\tlaneStatus: blocked ? \"failed\" : \"succeeded\",\n\t\t\t\treasonCode: blocked\n\t\t\t\t\t? \"worker_blocked\"\n\t\t\t\t\t: completion.stopReason === \"stop\"\n\t\t\t\t\t\t? \"worker_completed_plain_text\"\n\t\t\t\t\t\t: \"worker_completed_plain_text_incomplete\",\n\t\t\t\tcostUsd,\n\t\t\t});\n\t\t}\n\t\treturn finishOutcome({\n\t\t\trequest: options.request,\n\t\t\tcwd: options.cwd,\n\t\t\tclaim: {\n\t\t\t\t...completionBaseClaim,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tsummary: \"Worker output was not valid structured JSON.\",\n\t\t\t\t...(changedFilesOverflowed\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tblockers: [\n\t\t\t\t\t\t\t\t\"worker changed-file report exceeded the durable claim bound; parent review is required\",\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t\tlaneStatus: \"failed\",\n\t\t\treasonCode: \"unparseable_output\",\n\t\t\tcostUsd,\n\t\t});\n\t}\n\n\tconst evidence = buildWorkerEvidence(options.request, parsed.findings);\n\tif (parsed.actionRejection) {\n\t\treturn finishOutcome({\n\t\t\trequest: options.request,\n\t\t\tcwd: options.cwd,\n\t\t\tclaim: {\n\t\t\t\t...completionBaseClaim,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tsummary: \"Worker output contained invalid structured actions.\",\n\t\t\t\tblockers: [parsed.actionRejection.reasonCode],\n\t\t\t},\n\t\t\tlaneStatus: \"failed\",\n\t\t\treasonCode: \"unparseable_output\",\n\t\t\tcostUsd,\n\t\t});\n\t}\n\tif (options.verificationSubjectTaskId && (!parsed.verdict || parsed.reasonCodes.length === 0)) {\n\t\treturn finishOutcome({\n\t\t\trequest: options.request,\n\t\t\tcwd: options.cwd,\n\t\t\tclaim: {\n\t\t\t\t...completionBaseClaim,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tsummary: \"Verifier output omitted its typed verdict or reasonCodes.\",\n\t\t\t},\n\t\t\tlaneStatus: \"failed\",\n\t\t\treasonCode: \"invalid_verifier_result\",\n\t\t\tcostUsd,\n\t\t});\n\t}\n\tlet changedFiles: string[] = [...completionChangedFiles];\n\tconst completionBlockersReport = collectBoundedWorkerClaimBlockers(completion.blockers ?? []);\n\tconst actionBlockers: string[] = [...completionBlockersReport.values];\n\tif (changedFilesOverflowed) {\n\t\tactionBlockers.push(\"worker changed-file report exceeded the durable claim bound; parent review is required\");\n\t}\n\tif (completionBlockersReport.overflowed) {\n\t\tactionBlockers.push(\"worker blocker report exceeded the durable claim bound; parent review is required\");\n\t}\n\tif (!writeCapable && completionChangedFiles.length > 0) {\n\t\tactionBlockers.push(\"worker reported file changes without a filesystem.write envelope grant\");\n\t}\n\tif (writeCapable && parsed.status !== \"blocked\" && parsed.actions.length > 0 && options.applyActions) {\n\t\t// Runner-side application through the envelope path scope: refusals and failures are\n\t\t// surfaced as blockers so a partially-applied change can never look like clean success.\n\t\tconst applied = options.applyActions(parsed.actions);\n\t\tconst appliedChangedFilesReport = collectBoundedWorkerClaimChangedFiles(applied.changedFiles);\n\t\tconst mergedAppliedChangedFilesReport = collectBoundedWorkerClaimChangedFiles([\n\t\t\t...changedFiles,\n\t\t\t...appliedChangedFilesReport.values,\n\t\t]);\n\t\tchangedFiles = mergedAppliedChangedFilesReport.values;\n\t\tif (appliedChangedFilesReport.overflowed || mergedAppliedChangedFilesReport.overflowed) {\n\t\t\tactionBlockers.push(\"applied changed-file report exceeded the durable claim bound; parent review is required\");\n\t\t}\n\t\tfor (const refusal of applied.refused) {\n\t\t\tactionBlockers.push(`action refused (${refusal.path}): ${refusal.reason}`);\n\t\t}\n\t\tfor (const failure of applied.failed) {\n\t\t\tactionBlockers.push(`action failed (${failure.path}): ${failure.reason}`);\n\t\t}\n\t\tfor (const inspection of applied.inspectionRequired) {\n\t\t\tactionBlockers.push(\n\t\t\t\t`action requires workspace/evidence inspection (${inspection.path}, ${inspection.state}): ${inspection.reasonCode}`,\n\t\t\t);\n\t\t}\n\t} else if (!writeCapable && parsed.actions.length > 0) {\n\t\tactionBlockers.push(\"worker emitted file actions without a filesystem.write envelope grant; nothing was applied\");\n\t}\n\tconst allBlockersReport = collectBoundedWorkerClaimBlockers([...parsed.blockers, ...actionBlockers]);\n\tconst allBlockers = allBlockersReport.overflowed\n\t\t? [\n\t\t\t\t...allBlockersReport.values.slice(0, Math.max(0, MAX_WORKER_CLAIM_BLOCKERS - 1)),\n\t\t\t\t\"worker blocker report exceeded the durable claim bound; parent review is required\",\n\t\t\t]\n\t\t: allBlockersReport.values;\n\tconst claim: WorkerClaim = {\n\t\t...baseClaim,\n\t\tchangedFiles,\n\t\tstatus: parsed.status === \"blocked\" || allBlockers.length > 0 ? \"blocked\" : \"completed\",\n\t\tsummary: parsed.summary,\n\t\t...(allBlockers.length > 0 ? { blockers: allBlockers } : {}),\n\t\t...(evidence ? { evidence } : {}),\n\t\t...(options.verificationSubjectTaskId && parsed.verdict\n\t\t\t? {\n\t\t\t\t\tverification: {\n\t\t\t\t\t\tsubjectTaskId: options.verificationSubjectTaskId,\n\t\t\t\t\t\tverdict: parsed.verdict,\n\t\t\t\t\t\treasonCodes: parsed.reasonCodes,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n\n\tif (claim.status === \"blocked\") {\n\t\treturn finishOutcome({\n\t\t\trequest: options.request,\n\t\t\tcwd: options.cwd,\n\t\t\tclaim,\n\t\t\tlaneStatus: \"failed\",\n\t\t\treasonCode: \"worker_blocked\",\n\t\t\tcostUsd,\n\t\t});\n\t}\n\n\tconst overBudget = options.maxUsd !== undefined && costUsd > options.maxUsd;\n\treturn finishOutcome({\n\t\trequest: options.request,\n\t\tcwd: options.cwd,\n\t\tclaim,\n\t\tlaneStatus: overBudget ? \"budget_exhausted\" : \"succeeded\",\n\t\treasonCode: overBudget\n\t\t\t? \"cost_budget_exceeded\"\n\t\t\t: claim.verification\n\t\t\t\t? claim.verification.verdict === \"accepted\"\n\t\t\t\t\t? \"verification_accepted\"\n\t\t\t\t\t: \"verification_rejected\"\n\t\t\t\t: \"worker_completed\",\n\t\tcostUsd,\n\t});\n}\n"]}
@@ -0,0 +1,43 @@
1
+ import type { AttemptStatus, OrchestrationTaskStatus, WorkerRole } from "../orchestration/contracts.ts";
2
+ import type { TaskRuntimeProjection } from "../orchestration/task-runtime.ts";
3
+ /** Keep task views within the same durable session fan-out ceiling as the worker fleet. */
4
+ export declare const MAX_WORKER_TASK_VIEW_ENTRIES: number;
5
+ /** Bound model-facing serialization independently of task-count and field-count limits. */
6
+ export declare const MAX_WORKER_TASK_VIEW_BYTES: number;
7
+ export interface WorkerTaskAttemptView {
8
+ agentId?: string;
9
+ status: AttemptStatus;
10
+ reasonCode?: string;
11
+ retry?: {
12
+ retriesUsed: number;
13
+ notBefore: string;
14
+ };
15
+ }
16
+ export interface WorkerTaskView {
17
+ taskId: string;
18
+ title: string;
19
+ role: WorkerRole;
20
+ status: OrchestrationTaskStatus;
21
+ dependsOn: readonly string[];
22
+ verificationOfTaskId?: string;
23
+ verificationOutcome?: {
24
+ verifierTaskId: string;
25
+ verdict: VerificationVerdict;
26
+ reasonCode: string;
27
+ };
28
+ latestAttempt?: WorkerTaskAttemptView;
29
+ }
30
+ type VerificationVerdict = "accepted" | "rejected" | "inconclusive";
31
+ export interface WorkerTaskSessionView {
32
+ totalTasks: number;
33
+ omittedTaskCount: number;
34
+ tasks: readonly WorkerTaskView[];
35
+ }
36
+ /**
37
+ * Derive a provider-neutral, bounded team-task read model from the durable runtime projection.
38
+ * Every returned field is selected explicitly so execution authority and provider diagnostics
39
+ * cannot cross this read boundary through object spread.
40
+ */
41
+ export declare function projectWorkerTaskSessionView(snapshot: TaskRuntimeProjection): WorkerTaskSessionView;
42
+ export {};
43
+ //# sourceMappingURL=worker-task-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-task-view.d.ts","sourceRoot":"","sources":["../../../src/core/delegation/worker-task-view.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AASxG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAI9E,2FAA2F;AAC3F,eAAO,MAAM,4BAA4B,QAGxC,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,0BAA0B,QAAY,CAAC;AAEpD,MAAM,WAAW,qBAAqB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KAClB,CAAC;CACF;AAED,MAAM,WAAW,cAAc;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,uBAAuB,CAAC;IAChC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,mBAAmB,CAAC;QAC7B,UAAU,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,aAAa,CAAC,EAAE,qBAAqB,CAAC;CACtC;AAED,KAAK,mBAAmB,GAAG,UAAU,GAAG,UAAU,GAAG,cAAc,CAAC;AAoBpE,MAAM,WAAW,qBAAqB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;CACjC;AA+KD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,qBAAqB,GAAG,qBAAqB,CA8BnG"}
@@ -0,0 +1,194 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { ATTEMPT_STATUSES, MAX_ORCHESTRATION_COLLECTION_LENGTH, MAX_ORCHESTRATION_DESCRIPTION_LENGTH, MAX_ORCHESTRATION_IDENTIFIER_LENGTH, TASK_STATUSES, WORKER_ROLES, } from "../orchestration/contracts.js";
3
+ import { isPlainRecord } from "../util/value-guards.js";
4
+ import { DEFAULT_WORKER_FLEET_LIMITS } from "./worker-fleet-limits.js";
5
+ /** Keep task views within the same durable session fan-out ceiling as the worker fleet. */
6
+ export const MAX_WORKER_TASK_VIEW_ENTRIES = Math.min(DEFAULT_WORKER_FLEET_LIMITS.maxAgentsPerSession, DEFAULT_WORKER_FLEET_LIMITS.maxQueuedDispatches);
7
+ /** Bound model-facing serialization independently of task-count and field-count limits. */
8
+ export const MAX_WORKER_TASK_VIEW_BYTES = 64 * 1024;
9
+ function boundedString(value, maxLength) {
10
+ return typeof value === "string" && value.length > 0 ? value.slice(0, maxLength) : undefined;
11
+ }
12
+ function isListedValue(value, allowed) {
13
+ return typeof value === "string" && allowed.some((candidate) => candidate === value);
14
+ }
15
+ function boundedIdentifierArray(value) {
16
+ if (!Array.isArray(value))
17
+ return [];
18
+ const identifiers = [];
19
+ for (let index = 0; index < Math.min(value.length, MAX_ORCHESTRATION_COLLECTION_LENGTH); index += 1) {
20
+ const identifier = boundedString(value[index], MAX_ORCHESTRATION_IDENTIFIER_LENGTH);
21
+ if (identifier)
22
+ identifiers.push(identifier);
23
+ }
24
+ return identifiers;
25
+ }
26
+ function taskViewCandidate(recordTaskId, value) {
27
+ if (!isPlainRecord(value) || !isPlainRecord(value.task))
28
+ return undefined;
29
+ if (value.task.taskId !== recordTaskId)
30
+ return undefined;
31
+ const taskId = boundedString(value.task.taskId, MAX_ORCHESTRATION_IDENTIFIER_LENGTH);
32
+ const title = boundedString(value.task.title, MAX_ORCHESTRATION_DESCRIPTION_LENGTH);
33
+ const createdAt = boundedString(value.task.createdAt, MAX_ORCHESTRATION_IDENTIFIER_LENGTH);
34
+ if (!taskId ||
35
+ !title ||
36
+ !createdAt ||
37
+ !isListedValue(value.task.role, WORKER_ROLES) ||
38
+ !isListedValue(value.task.status, TASK_STATUSES)) {
39
+ return undefined;
40
+ }
41
+ const verificationOfTaskId = boundedString(value.task.verificationOfTaskId, MAX_ORCHESTRATION_IDENTIFIER_LENGTH);
42
+ return {
43
+ attemptIds: value.attemptIds,
44
+ verification: value.verification,
45
+ taskId,
46
+ title,
47
+ role: value.task.role,
48
+ status: value.task.status,
49
+ dependsOn: boundedIdentifierArray(value.task.dependsOn),
50
+ createdAt,
51
+ ...(verificationOfTaskId ? { verificationOfTaskId } : {}),
52
+ };
53
+ }
54
+ function latestExistingAttempt(snapshot, attemptIds) {
55
+ if (!Array.isArray(attemptIds))
56
+ return undefined;
57
+ const firstInspectedIndex = Math.max(0, attemptIds.length - MAX_ORCHESTRATION_COLLECTION_LENGTH);
58
+ for (let index = attemptIds.length - 1; index >= firstInspectedIndex; index -= 1) {
59
+ const attemptId = attemptIds[index];
60
+ if (typeof attemptId !== "string" || !Object.hasOwn(snapshot.attempts, attemptId))
61
+ continue;
62
+ return snapshot.attempts[attemptId];
63
+ }
64
+ return undefined;
65
+ }
66
+ function projectAttempt(value) {
67
+ if (!isPlainRecord(value) || !isListedValue(value.status, ATTEMPT_STATUSES))
68
+ return undefined;
69
+ const dispatch = isPlainRecord(value.dispatch) ? value.dispatch : undefined;
70
+ const agentId = boundedString(value.agentId, MAX_ORCHESTRATION_IDENTIFIER_LENGTH) ??
71
+ boundedString(dispatch?.logicalLaneId, MAX_ORCHESTRATION_IDENTIFIER_LENGTH);
72
+ const reasonCode = boundedString(value.reasonCode, MAX_ORCHESTRATION_IDENTIFIER_LENGTH);
73
+ const retry = isPlainRecord(value.retry) ? value.retry : undefined;
74
+ const retriesUsed = retry?.retriesUsed;
75
+ const notBefore = boundedString(retry?.notBefore, MAX_ORCHESTRATION_IDENTIFIER_LENGTH);
76
+ const validRetry = Number.isSafeInteger(retriesUsed) && Number(retriesUsed) > 0 && notBefore;
77
+ return {
78
+ ...(agentId ? { agentId } : {}),
79
+ status: value.status,
80
+ ...(reasonCode ? { reasonCode } : {}),
81
+ ...(validRetry ? { retry: { retriesUsed: Number(retriesUsed), notBefore } } : {}),
82
+ };
83
+ }
84
+ function projectVerification(value) {
85
+ if (!isPlainRecord(value) || !isListedValue(value.verdict, ["accepted", "rejected", "inconclusive"])) {
86
+ return undefined;
87
+ }
88
+ const verifierTaskId = boundedString(value.verifierTaskId, MAX_ORCHESTRATION_IDENTIFIER_LENGTH);
89
+ const reasonCode = boundedString(value.reasonCode, MAX_ORCHESTRATION_IDENTIFIER_LENGTH);
90
+ return verifierTaskId && reasonCode ? { verifierTaskId, verdict: value.verdict, reasonCode } : undefined;
91
+ }
92
+ function projectTask(snapshot, candidate) {
93
+ const attempt = projectAttempt(latestExistingAttempt(snapshot, candidate.attemptIds));
94
+ const verificationOutcome = projectVerification(candidate.verification);
95
+ return {
96
+ taskId: candidate.taskId,
97
+ title: candidate.title,
98
+ role: candidate.role,
99
+ status: candidate.status,
100
+ dependsOn: candidate.dependsOn,
101
+ ...(candidate.verificationOfTaskId ? { verificationOfTaskId: candidate.verificationOfTaskId } : {}),
102
+ ...(verificationOutcome ? { verificationOutcome } : {}),
103
+ ...(attempt ? { latestAttempt: attempt } : {}),
104
+ };
105
+ }
106
+ function compareTasksNewestFirst(left, right) {
107
+ return right.createdAt.localeCompare(left.createdAt) || left.taskId.localeCompare(right.taskId);
108
+ }
109
+ /** Maintain the worst retained task at index zero, without allocating for the full task history. */
110
+ function admitToNewestWindow(window, selection) {
111
+ if (window.length < MAX_WORKER_TASK_VIEW_ENTRIES) {
112
+ window.push(selection);
113
+ let childIndex = window.length - 1;
114
+ while (childIndex > 0) {
115
+ const parentIndex = Math.floor((childIndex - 1) / 2);
116
+ if (compareTasksNewestFirst(window[childIndex].candidate, window[parentIndex].candidate) <= 0) {
117
+ break;
118
+ }
119
+ [window[parentIndex], window[childIndex]] = [
120
+ window[childIndex],
121
+ window[parentIndex],
122
+ ];
123
+ childIndex = parentIndex;
124
+ }
125
+ return;
126
+ }
127
+ if (compareTasksNewestFirst(selection.candidate, window[0].candidate) >= 0)
128
+ return;
129
+ window[0] = selection;
130
+ let parentIndex = 0;
131
+ while (true) {
132
+ const leftIndex = parentIndex * 2 + 1;
133
+ if (leftIndex >= window.length)
134
+ return;
135
+ const rightIndex = leftIndex + 1;
136
+ const worseChildIndex = rightIndex < window.length &&
137
+ compareTasksNewestFirst(window[rightIndex].candidate, window[leftIndex].candidate) > 0
138
+ ? rightIndex
139
+ : leftIndex;
140
+ if (compareTasksNewestFirst(window[worseChildIndex].candidate, window[parentIndex].candidate) <= 0) {
141
+ return;
142
+ }
143
+ [window[parentIndex], window[worseChildIndex]] = [
144
+ window[worseChildIndex],
145
+ window[parentIndex],
146
+ ];
147
+ parentIndex = worseChildIndex;
148
+ }
149
+ }
150
+ const MIN_WORKER_TASK_VIEW_ENVELOPE_BYTES = Buffer.byteLength(JSON.stringify({ totalTasks: 0, omittedTaskCount: 0, tasks: [] }), "utf8");
151
+ function serializedSessionViewByteLength(totalTasks, taskCount, taskBytes) {
152
+ const envelopeBytes = Buffer.byteLength(JSON.stringify({ totalTasks, omittedTaskCount: totalTasks - taskCount, tasks: [] }), "utf8");
153
+ return envelopeBytes + taskBytes + Math.max(0, taskCount - 1);
154
+ }
155
+ /**
156
+ * Derive a provider-neutral, bounded team-task read model from the durable runtime projection.
157
+ * Every returned field is selected explicitly so execution authority and provider diagnostics
158
+ * cannot cross this read boundary through object spread.
159
+ */
160
+ export function projectWorkerTaskSessionView(snapshot) {
161
+ let totalTasks = 0;
162
+ const selected = [];
163
+ for (const taskId in snapshot.tasks) {
164
+ if (!Object.hasOwn(snapshot.tasks, taskId))
165
+ continue;
166
+ totalTasks += 1;
167
+ const candidate = taskViewCandidate(taskId, snapshot.tasks[taskId]);
168
+ if (!candidate)
169
+ continue;
170
+ const view = projectTask(snapshot, candidate);
171
+ const serializedByteLength = Buffer.byteLength(JSON.stringify(view), "utf8");
172
+ if (serializedByteLength + MIN_WORKER_TASK_VIEW_ENVELOPE_BYTES > MAX_WORKER_TASK_VIEW_BYTES)
173
+ continue;
174
+ admitToNewestWindow(selected, { candidate, view, serializedByteLength });
175
+ }
176
+ selected.sort((left, right) => compareTasksNewestFirst(left.candidate, right.candidate));
177
+ const tasks = [];
178
+ let taskBytes = 0;
179
+ for (const selection of selected) {
180
+ const nextTaskCount = tasks.length + 1;
181
+ const nextTaskBytes = taskBytes + selection.serializedByteLength;
182
+ if (serializedSessionViewByteLength(totalTasks, nextTaskCount, nextTaskBytes) > MAX_WORKER_TASK_VIEW_BYTES) {
183
+ continue;
184
+ }
185
+ tasks.push(selection.view);
186
+ taskBytes = nextTaskBytes;
187
+ }
188
+ return {
189
+ totalTasks,
190
+ omittedTaskCount: totalTasks - tasks.length,
191
+ tasks,
192
+ };
193
+ }
194
+ //# sourceMappingURL=worker-task-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-task-view.js","sourceRoot":"","sources":["../../../src/core/delegation/worker-task-view.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport type { AttemptStatus, OrchestrationTaskStatus, WorkerRole } from \"../orchestration/contracts.ts\";\nimport {\n\tATTEMPT_STATUSES,\n\tMAX_ORCHESTRATION_COLLECTION_LENGTH,\n\tMAX_ORCHESTRATION_DESCRIPTION_LENGTH,\n\tMAX_ORCHESTRATION_IDENTIFIER_LENGTH,\n\tTASK_STATUSES,\n\tWORKER_ROLES,\n} from \"../orchestration/contracts.ts\";\nimport type { TaskRuntimeProjection } from \"../orchestration/task-runtime.ts\";\nimport { isPlainRecord } from \"../util/value-guards.ts\";\nimport { DEFAULT_WORKER_FLEET_LIMITS } from \"./worker-fleet-limits.ts\";\n\n/** Keep task views within the same durable session fan-out ceiling as the worker fleet. */\nexport const MAX_WORKER_TASK_VIEW_ENTRIES = Math.min(\n\tDEFAULT_WORKER_FLEET_LIMITS.maxAgentsPerSession,\n\tDEFAULT_WORKER_FLEET_LIMITS.maxQueuedDispatches,\n);\n\n/** Bound model-facing serialization independently of task-count and field-count limits. */\nexport const MAX_WORKER_TASK_VIEW_BYTES = 64 * 1024;\n\nexport interface WorkerTaskAttemptView {\n\tagentId?: string;\n\tstatus: AttemptStatus;\n\treasonCode?: string;\n\tretry?: {\n\t\tretriesUsed: number;\n\t\tnotBefore: string;\n\t};\n}\n\nexport interface WorkerTaskView {\n\ttaskId: string;\n\ttitle: string;\n\trole: WorkerRole;\n\tstatus: OrchestrationTaskStatus;\n\tdependsOn: readonly string[];\n\tverificationOfTaskId?: string;\n\tverificationOutcome?: {\n\t\tverifierTaskId: string;\n\t\tverdict: VerificationVerdict;\n\t\treasonCode: string;\n\t};\n\tlatestAttempt?: WorkerTaskAttemptView;\n}\n\ntype VerificationVerdict = \"accepted\" | \"rejected\" | \"inconclusive\";\n\ninterface TaskViewCandidate {\n\tattemptIds: unknown;\n\tverification: unknown;\n\ttaskId: string;\n\ttitle: string;\n\trole: WorkerRole;\n\tstatus: OrchestrationTaskStatus;\n\tdependsOn: readonly string[];\n\tcreatedAt: string;\n\tverificationOfTaskId?: string;\n}\n\ninterface TaskViewSelection {\n\tcandidate: TaskViewCandidate;\n\tview: WorkerTaskView;\n\tserializedByteLength: number;\n}\n\nexport interface WorkerTaskSessionView {\n\ttotalTasks: number;\n\tomittedTaskCount: number;\n\ttasks: readonly WorkerTaskView[];\n}\n\nfunction boundedString(value: unknown, maxLength: number): string | undefined {\n\treturn typeof value === \"string\" && value.length > 0 ? value.slice(0, maxLength) : undefined;\n}\n\nfunction isListedValue<const Value extends string>(value: unknown, allowed: readonly Value[]): value is Value {\n\treturn typeof value === \"string\" && allowed.some((candidate) => candidate === value);\n}\n\nfunction boundedIdentifierArray(value: unknown): readonly string[] {\n\tif (!Array.isArray(value)) return [];\n\tconst identifiers: string[] = [];\n\tfor (let index = 0; index < Math.min(value.length, MAX_ORCHESTRATION_COLLECTION_LENGTH); index += 1) {\n\t\tconst identifier = boundedString(value[index], MAX_ORCHESTRATION_IDENTIFIER_LENGTH);\n\t\tif (identifier) identifiers.push(identifier);\n\t}\n\treturn identifiers;\n}\n\nfunction taskViewCandidate(recordTaskId: string, value: unknown): TaskViewCandidate | undefined {\n\tif (!isPlainRecord(value) || !isPlainRecord(value.task)) return undefined;\n\tif (value.task.taskId !== recordTaskId) return undefined;\n\tconst taskId = boundedString(value.task.taskId, MAX_ORCHESTRATION_IDENTIFIER_LENGTH);\n\tconst title = boundedString(value.task.title, MAX_ORCHESTRATION_DESCRIPTION_LENGTH);\n\tconst createdAt = boundedString(value.task.createdAt, MAX_ORCHESTRATION_IDENTIFIER_LENGTH);\n\tif (\n\t\t!taskId ||\n\t\t!title ||\n\t\t!createdAt ||\n\t\t!isListedValue(value.task.role, WORKER_ROLES) ||\n\t\t!isListedValue(value.task.status, TASK_STATUSES)\n\t) {\n\t\treturn undefined;\n\t}\n\tconst verificationOfTaskId = boundedString(value.task.verificationOfTaskId, MAX_ORCHESTRATION_IDENTIFIER_LENGTH);\n\treturn {\n\t\tattemptIds: value.attemptIds,\n\t\tverification: value.verification,\n\t\ttaskId,\n\t\ttitle,\n\t\trole: value.task.role,\n\t\tstatus: value.task.status,\n\t\tdependsOn: boundedIdentifierArray(value.task.dependsOn),\n\t\tcreatedAt,\n\t\t...(verificationOfTaskId ? { verificationOfTaskId } : {}),\n\t};\n}\n\nfunction latestExistingAttempt(snapshot: TaskRuntimeProjection, attemptIds: unknown): unknown {\n\tif (!Array.isArray(attemptIds)) return undefined;\n\tconst firstInspectedIndex = Math.max(0, attemptIds.length - MAX_ORCHESTRATION_COLLECTION_LENGTH);\n\tfor (let index = attemptIds.length - 1; index >= firstInspectedIndex; index -= 1) {\n\t\tconst attemptId = attemptIds[index];\n\t\tif (typeof attemptId !== \"string\" || !Object.hasOwn(snapshot.attempts, attemptId)) continue;\n\t\treturn snapshot.attempts[attemptId];\n\t}\n\treturn undefined;\n}\n\nfunction projectAttempt(value: unknown): WorkerTaskAttemptView | undefined {\n\tif (!isPlainRecord(value) || !isListedValue(value.status, ATTEMPT_STATUSES)) return undefined;\n\tconst dispatch = isPlainRecord(value.dispatch) ? value.dispatch : undefined;\n\tconst agentId =\n\t\tboundedString(value.agentId, MAX_ORCHESTRATION_IDENTIFIER_LENGTH) ??\n\t\tboundedString(dispatch?.logicalLaneId, MAX_ORCHESTRATION_IDENTIFIER_LENGTH);\n\tconst reasonCode = boundedString(value.reasonCode, MAX_ORCHESTRATION_IDENTIFIER_LENGTH);\n\tconst retry = isPlainRecord(value.retry) ? value.retry : undefined;\n\tconst retriesUsed = retry?.retriesUsed;\n\tconst notBefore = boundedString(retry?.notBefore, MAX_ORCHESTRATION_IDENTIFIER_LENGTH);\n\tconst validRetry = Number.isSafeInteger(retriesUsed) && Number(retriesUsed) > 0 && notBefore;\n\treturn {\n\t\t...(agentId ? { agentId } : {}),\n\t\tstatus: value.status,\n\t\t...(reasonCode ? { reasonCode } : {}),\n\t\t...(validRetry ? { retry: { retriesUsed: Number(retriesUsed), notBefore } } : {}),\n\t};\n}\n\nfunction projectVerification(value: unknown): WorkerTaskView[\"verificationOutcome\"] {\n\tif (!isPlainRecord(value) || !isListedValue(value.verdict, [\"accepted\", \"rejected\", \"inconclusive\"] as const)) {\n\t\treturn undefined;\n\t}\n\tconst verifierTaskId = boundedString(value.verifierTaskId, MAX_ORCHESTRATION_IDENTIFIER_LENGTH);\n\tconst reasonCode = boundedString(value.reasonCode, MAX_ORCHESTRATION_IDENTIFIER_LENGTH);\n\treturn verifierTaskId && reasonCode ? { verifierTaskId, verdict: value.verdict, reasonCode } : undefined;\n}\n\nfunction projectTask(snapshot: TaskRuntimeProjection, candidate: TaskViewCandidate): WorkerTaskView {\n\tconst attempt = projectAttempt(latestExistingAttempt(snapshot, candidate.attemptIds));\n\tconst verificationOutcome = projectVerification(candidate.verification);\n\treturn {\n\t\ttaskId: candidate.taskId,\n\t\ttitle: candidate.title,\n\t\trole: candidate.role,\n\t\tstatus: candidate.status,\n\t\tdependsOn: candidate.dependsOn,\n\t\t...(candidate.verificationOfTaskId ? { verificationOfTaskId: candidate.verificationOfTaskId } : {}),\n\t\t...(verificationOutcome ? { verificationOutcome } : {}),\n\t\t...(attempt ? { latestAttempt: attempt } : {}),\n\t};\n}\n\nfunction compareTasksNewestFirst(left: TaskViewCandidate, right: TaskViewCandidate): number {\n\treturn right.createdAt.localeCompare(left.createdAt) || left.taskId.localeCompare(right.taskId);\n}\n\n/** Maintain the worst retained task at index zero, without allocating for the full task history. */\nfunction admitToNewestWindow(window: TaskViewSelection[], selection: TaskViewSelection): void {\n\tif (window.length < MAX_WORKER_TASK_VIEW_ENTRIES) {\n\t\twindow.push(selection);\n\t\tlet childIndex = window.length - 1;\n\t\twhile (childIndex > 0) {\n\t\t\tconst parentIndex = Math.floor((childIndex - 1) / 2);\n\t\t\tif (\n\t\t\t\tcompareTasksNewestFirst(\n\t\t\t\t\t(window[childIndex] as TaskViewSelection).candidate,\n\t\t\t\t\t(window[parentIndex] as TaskViewSelection).candidate,\n\t\t\t\t) <= 0\n\t\t\t) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t[window[parentIndex], window[childIndex]] = [\n\t\t\t\twindow[childIndex] as TaskViewSelection,\n\t\t\t\twindow[parentIndex] as TaskViewSelection,\n\t\t\t];\n\t\t\tchildIndex = parentIndex;\n\t\t}\n\t\treturn;\n\t}\n\tif (compareTasksNewestFirst(selection.candidate, (window[0] as TaskViewSelection).candidate) >= 0) return;\n\n\twindow[0] = selection;\n\tlet parentIndex = 0;\n\twhile (true) {\n\t\tconst leftIndex = parentIndex * 2 + 1;\n\t\tif (leftIndex >= window.length) return;\n\t\tconst rightIndex = leftIndex + 1;\n\t\tconst worseChildIndex =\n\t\t\trightIndex < window.length &&\n\t\t\tcompareTasksNewestFirst(\n\t\t\t\t(window[rightIndex] as TaskViewSelection).candidate,\n\t\t\t\t(window[leftIndex] as TaskViewSelection).candidate,\n\t\t\t) > 0\n\t\t\t\t? rightIndex\n\t\t\t\t: leftIndex;\n\t\tif (\n\t\t\tcompareTasksNewestFirst(\n\t\t\t\t(window[worseChildIndex] as TaskViewSelection).candidate,\n\t\t\t\t(window[parentIndex] as TaskViewSelection).candidate,\n\t\t\t) <= 0\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\t[window[parentIndex], window[worseChildIndex]] = [\n\t\t\twindow[worseChildIndex] as TaskViewSelection,\n\t\t\twindow[parentIndex] as TaskViewSelection,\n\t\t];\n\t\tparentIndex = worseChildIndex;\n\t}\n}\n\nconst MIN_WORKER_TASK_VIEW_ENVELOPE_BYTES = Buffer.byteLength(\n\tJSON.stringify({ totalTasks: 0, omittedTaskCount: 0, tasks: [] }),\n\t\"utf8\",\n);\n\nfunction serializedSessionViewByteLength(totalTasks: number, taskCount: number, taskBytes: number): number {\n\tconst envelopeBytes = Buffer.byteLength(\n\t\tJSON.stringify({ totalTasks, omittedTaskCount: totalTasks - taskCount, tasks: [] }),\n\t\t\"utf8\",\n\t);\n\treturn envelopeBytes + taskBytes + Math.max(0, taskCount - 1);\n}\n\n/**\n * Derive a provider-neutral, bounded team-task read model from the durable runtime projection.\n * Every returned field is selected explicitly so execution authority and provider diagnostics\n * cannot cross this read boundary through object spread.\n */\nexport function projectWorkerTaskSessionView(snapshot: TaskRuntimeProjection): WorkerTaskSessionView {\n\tlet totalTasks = 0;\n\tconst selected: TaskViewSelection[] = [];\n\tfor (const taskId in snapshot.tasks) {\n\t\tif (!Object.hasOwn(snapshot.tasks, taskId)) continue;\n\t\ttotalTasks += 1;\n\t\tconst candidate = taskViewCandidate(taskId, snapshot.tasks[taskId]);\n\t\tif (!candidate) continue;\n\t\tconst view = projectTask(snapshot, candidate);\n\t\tconst serializedByteLength = Buffer.byteLength(JSON.stringify(view), \"utf8\");\n\t\tif (serializedByteLength + MIN_WORKER_TASK_VIEW_ENVELOPE_BYTES > MAX_WORKER_TASK_VIEW_BYTES) continue;\n\t\tadmitToNewestWindow(selected, { candidate, view, serializedByteLength });\n\t}\n\tselected.sort((left, right) => compareTasksNewestFirst(left.candidate, right.candidate));\n\tconst tasks: WorkerTaskView[] = [];\n\tlet taskBytes = 0;\n\tfor (const selection of selected) {\n\t\tconst nextTaskCount = tasks.length + 1;\n\t\tconst nextTaskBytes = taskBytes + selection.serializedByteLength;\n\t\tif (serializedSessionViewByteLength(totalTasks, nextTaskCount, nextTaskBytes) > MAX_WORKER_TASK_VIEW_BYTES) {\n\t\t\tcontinue;\n\t\t}\n\t\ttasks.push(selection.view);\n\t\ttaskBytes = nextTaskBytes;\n\t}\n\treturn {\n\t\ttotalTasks,\n\t\tomittedTaskCount: totalTasks - tasks.length,\n\t\ttasks,\n\t};\n}\n"]}