@the-open-engine/zeroshot 6.38.0 → 6.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/cli/event-copy.js +8 -7
  2. package/cli/event-copy.ts +12 -0
  3. package/cli/index.js +7 -31
  4. package/cli/json-export.js +61 -64
  5. package/cli/json-export.ts +112 -0
  6. package/cli/message-formatter-utils.js +68 -56
  7. package/cli/message-formatter-utils.ts +121 -0
  8. package/cli/message-formatters-normal.js +124 -259
  9. package/cli/message-formatters-normal.ts +250 -0
  10. package/cli/message-formatters-watch.js +81 -84
  11. package/cli/message-formatters-watch.ts +189 -0
  12. package/lib/agent-cli-provider/adapters/codex.d.ts.map +1 -1
  13. package/lib/agent-cli-provider/adapters/codex.js +3 -1
  14. package/lib/agent-cli-provider/adapters/codex.js.map +1 -1
  15. package/lib/cluster/generated/protocol-schema.cjs +1 -1
  16. package/lib/cluster/generated/protocol-schema.mjs +1 -1
  17. package/lib/cluster/generated/protocol.d.cts +8 -0
  18. package/lib/cluster/generated/protocol.d.mts +8 -0
  19. package/lib/cluster/generated/protocol.d.ts +8 -0
  20. package/lib/clusters-registry.d.ts +23 -0
  21. package/lib/clusters-registry.js +17 -29
  22. package/lib/completion.d.ts +12 -0
  23. package/lib/completion.js +84 -94
  24. package/lib/compose-utils.d.ts +32 -0
  25. package/lib/compose-utils.js +57 -72
  26. package/lib/detached-startup.d.ts +83 -0
  27. package/lib/detached-startup.js +231 -302
  28. package/lib/docker-config.d.ts +43 -0
  29. package/lib/docker-config.js +150 -325
  30. package/lib/docker-env-auth.d.ts +17 -0
  31. package/lib/docker-env-auth.js +75 -0
  32. package/lib/git-remote-utils.d.ts +48 -0
  33. package/lib/git-remote-utils.js +147 -213
  34. package/lib/id-detector.d.ts +15 -0
  35. package/lib/id-detector.js +37 -41
  36. package/lib/path-check.d.ts +30 -0
  37. package/lib/path-check.js +42 -45
  38. package/lib/process-liveness.d.ts +16 -0
  39. package/lib/process-liveness.js +19 -12
  40. package/lib/provider-credential-path.d.ts +16 -0
  41. package/lib/provider-credential-path.js +31 -29
  42. package/lib/provider-defaults.d.ts +30 -0
  43. package/lib/provider-defaults.js +47 -42
  44. package/lib/provider-detection.d.ts +11 -0
  45. package/lib/provider-detection.js +91 -54
  46. package/lib/provider-names.d.ts +38 -0
  47. package/lib/provider-names.js +56 -64
  48. package/lib/repo-settings.d.ts +28 -0
  49. package/lib/repo-settings.js +83 -59
  50. package/lib/run-mode.d.ts +21 -0
  51. package/lib/run-mode.js +21 -20
  52. package/lib/run-plan.d.ts +28 -0
  53. package/lib/run-plan.js +17 -16
  54. package/lib/settings/claude-auth.d.ts +35 -0
  55. package/lib/settings/claude-auth.js +30 -47
  56. package/lib/settings-defaults.d.ts +20 -0
  57. package/lib/settings-defaults.js +149 -0
  58. package/lib/settings-error.d.ts +7 -0
  59. package/lib/settings-error.js +8 -0
  60. package/lib/settings-issue-providers.d.ts +10 -0
  61. package/lib/settings-issue-providers.js +12 -0
  62. package/lib/settings-models.d.ts +22 -0
  63. package/lib/settings-models.js +93 -0
  64. package/lib/settings-storage.d.ts +23 -0
  65. package/lib/settings-storage.js +205 -0
  66. package/lib/settings-validation.d.ts +7 -0
  67. package/lib/settings-validation.js +182 -0
  68. package/lib/settings.d.ts +29 -0
  69. package/lib/settings.js +41 -736
  70. package/lib/setup-apply-types.d.ts +66 -0
  71. package/lib/setup-apply-types.js +2 -0
  72. package/lib/setup-apply.d.ts +39 -0
  73. package/lib/setup-apply.js +267 -264
  74. package/lib/setup-journal.d.ts +41 -0
  75. package/lib/setup-journal.js +119 -76
  76. package/lib/setup-plan-types.d.ts +102 -0
  77. package/lib/setup-plan-types.js +2 -0
  78. package/lib/setup-plan.d.ts +30 -0
  79. package/lib/setup-plan.js +300 -324
  80. package/lib/setup-undo.d.ts +44 -0
  81. package/lib/setup-undo.js +61 -74
  82. package/lib/start-cluster-config.d.ts +26 -0
  83. package/lib/start-cluster-config.js +56 -0
  84. package/lib/start-cluster-environment.d.ts +40 -0
  85. package/lib/start-cluster-environment.js +134 -0
  86. package/lib/start-cluster-run-options.d.ts +53 -0
  87. package/lib/start-cluster-run-options.js +147 -0
  88. package/lib/start-cluster.d.ts +64 -0
  89. package/lib/start-cluster.js +98 -454
  90. package/lib/stream-json-parser.d.ts +17 -0
  91. package/lib/stream-json-parser.js +51 -52
  92. package/npm-shrinkwrap.json +2 -2
  93. package/package.json +12 -6
  94. package/scripts/postinstall.js +27 -0
  95. package/scripts/rust-distribution.js +23 -14
  96. package/src/agent/agent-command-proofs-context.js +35 -45
  97. package/src/agent/agent-command-proofs-context.ts +87 -0
  98. package/src/agent/agent-config-settings.js +19 -0
  99. package/src/agent/agent-config-settings.ts +41 -0
  100. package/src/agent/agent-config.js +122 -231
  101. package/src/agent/agent-config.ts +285 -0
  102. package/src/agent/agent-context-builder.js +38 -273
  103. package/src/agent/agent-context-builder.ts +51 -0
  104. package/src/agent/agent-context-environment-sections.js +105 -0
  105. package/src/agent/agent-context-environment-sections.ts +134 -0
  106. package/src/agent/agent-context-packs.js +165 -0
  107. package/src/agent/agent-context-packs.ts +296 -0
  108. package/src/agent/agent-context-prompt-sections.js +100 -0
  109. package/src/agent/agent-context-prompt-sections.ts +148 -0
  110. package/src/agent/agent-context-sections.js +25 -334
  111. package/src/agent/agent-context-sections.ts +36 -0
  112. package/src/agent/agent-context-sources.js +96 -149
  113. package/src/agent/agent-context-sources.ts +253 -0
  114. package/src/agent/agent-context-types.js +2 -0
  115. package/src/agent/agent-context-types.ts +132 -0
  116. package/src/agent/agent-context-validation-sections.js +73 -0
  117. package/src/agent/agent-context-validation-sections.ts +129 -0
  118. package/src/agent/agent-input-injector.js +99 -118
  119. package/src/agent/agent-input-injector.ts +195 -0
  120. package/src/agent/agent-liveness-poll.js +74 -78
  121. package/src/agent/agent-liveness-poll.ts +163 -0
  122. package/src/agent/agent-quality-gate-schema.js +77 -86
  123. package/src/agent/agent-quality-gate-schema.ts +135 -0
  124. package/src/agent/agent-quality-gates-context.js +44 -50
  125. package/src/agent/agent-quality-gates-context.ts +91 -0
  126. package/src/agent/agent-stuck-detector.js +171 -239
  127. package/src/agent/agent-stuck-detector.ts +288 -0
  128. package/src/agent/agent-trigger-evaluator.js +29 -46
  129. package/src/agent/agent-trigger-evaluator.ts +98 -0
  130. package/src/agent/context-metrics.js +110 -141
  131. package/src/agent/context-metrics.ts +261 -0
  132. package/src/agent/context-pack-builder.js +72 -358
  133. package/src/agent/context-pack-builder.ts +105 -0
  134. package/src/agent/context-pack-core.js +70 -0
  135. package/src/agent/context-pack-core.ts +96 -0
  136. package/src/agent/context-pack-selection.js +119 -0
  137. package/src/agent/context-pack-selection.ts +187 -0
  138. package/src/agent/context-pack-truncation.js +139 -0
  139. package/src/agent/context-pack-truncation.ts +208 -0
  140. package/src/agent/context-pack-types.js +2 -0
  141. package/src/agent/context-pack-types.ts +98 -0
  142. package/src/agent/context-replay-policy.js +30 -39
  143. package/src/agent/context-replay-policy.ts +71 -0
  144. package/src/agent/critical-agent-policy.js +6 -10
  145. package/src/agent/critical-agent-policy.ts +20 -0
  146. package/src/agent/guidance-queue.js +74 -87
  147. package/src/agent/guidance-queue.ts +166 -0
  148. package/src/agent/output-extraction-error-detail.js +45 -0
  149. package/src/agent/output-extraction-error-detail.ts +49 -0
  150. package/src/agent/output-extraction-failures.js +125 -0
  151. package/src/agent/output-extraction-failures.ts +149 -0
  152. package/src/agent/output-extraction-json.js +234 -0
  153. package/src/agent/output-extraction-json.ts +235 -0
  154. package/src/agent/output-extraction-pi.js +124 -0
  155. package/src/agent/output-extraction-pi.ts +137 -0
  156. package/src/agent/output-extraction-types.js +2 -0
  157. package/src/agent/output-extraction-types.ts +49 -0
  158. package/src/agent/output-extraction.js +17 -617
  159. package/src/agent/output-extraction.ts +30 -0
  160. package/src/agent/output-reformatter-errors.js +83 -0
  161. package/src/agent/output-reformatter-errors.ts +106 -0
  162. package/src/agent/output-reformatter-types.js +2 -0
  163. package/src/agent/output-reformatter-types.ts +86 -0
  164. package/src/agent/output-reformatter.js +140 -185
  165. package/src/agent/output-reformatter.ts +238 -0
  166. package/src/agent/pi-terminal-lifecycle-types.js +2 -0
  167. package/src/agent/pi-terminal-lifecycle-types.ts +41 -0
  168. package/src/agent/pi-terminal-lifecycle.js +186 -206
  169. package/src/agent/pi-terminal-lifecycle.ts +297 -0
  170. package/src/agent/provider-control-plane.js +22 -21
  171. package/src/agent/provider-control-plane.ts +52 -0
  172. package/src/agent/provider-terminal-failure-types.js +2 -0
  173. package/src/agent/provider-terminal-failure-types.ts +60 -0
  174. package/src/agent/provider-terminal-failure.js +194 -191
  175. package/src/agent/provider-terminal-failure.ts +262 -0
  176. package/src/agent/rate-limit-backoff.js +31 -74
  177. package/src/agent/rate-limit-backoff.ts +71 -0
  178. package/src/agent/schema-utils.js +85 -125
  179. package/src/agent/schema-utils.ts +148 -0
  180. package/src/agent/structured-output-error.js +34 -33
  181. package/src/agent/structured-output-error.ts +105 -0
  182. package/src/agent/validation-platform.js +27 -27
  183. package/src/agent/validation-platform.ts +49 -0
  184. package/src/agent-cli-provider/adapters/codex.ts +3 -1
  185. package/src/attach/attach-client.js +232 -405
  186. package/src/attach/attach-client.ts +300 -0
  187. package/src/attach/attach-server-cleanup.js +43 -0
  188. package/src/attach/attach-server-cleanup.ts +39 -0
  189. package/src/attach/attach-server-clients.js +117 -0
  190. package/src/attach/attach-server-clients.ts +122 -0
  191. package/src/attach/attach-server-events.js +38 -0
  192. package/src/attach/attach-server-events.ts +36 -0
  193. package/src/attach/attach-server-pty.js +45 -0
  194. package/src/attach/attach-server-pty.ts +64 -0
  195. package/src/attach/attach-server-runtime.js +73 -0
  196. package/src/attach/attach-server-runtime.ts +62 -0
  197. package/src/attach/attach-server-socket.js +28 -0
  198. package/src/attach/attach-server-socket.ts +23 -0
  199. package/src/attach/attach-server-types.js +2 -0
  200. package/src/attach/attach-server-types.ts +82 -0
  201. package/src/attach/attach-server.js +106 -523
  202. package/src/attach/attach-server.ts +158 -0
  203. package/src/attach/index.js +18 -35
  204. package/src/attach/index.ts +18 -0
  205. package/src/attach/protocol.js +95 -184
  206. package/src/attach/protocol.ts +181 -0
  207. package/src/attach/ring-buffer.js +76 -102
  208. package/src/attach/ring-buffer.ts +109 -0
  209. package/src/attach/send-input.js +64 -75
  210. package/src/attach/send-input.ts +94 -0
  211. package/src/attach/socket-discovery.js +164 -218
  212. package/src/attach/socket-discovery.ts +230 -0
  213. package/src/attach/socket-paths.js +42 -61
  214. package/src/attach/socket-paths.ts +81 -0
  215. package/src/claude-credentials.js +51 -54
  216. package/src/claude-credentials.ts +89 -0
  217. package/src/cluster/generated/protocol-schema.ts +1 -1
  218. package/src/cluster/generated/protocol.ts +2 -1
  219. package/src/command-proofs.js +110 -141
  220. package/src/command-proofs.ts +216 -0
  221. package/src/config-router.js +81 -73
  222. package/src/config-router.ts +131 -0
  223. package/src/copy-worker.js +53 -29
  224. package/src/copy-worker.ts +75 -0
  225. package/src/darwin-keychain-boundary.js +80 -111
  226. package/src/darwin-keychain-boundary.ts +148 -0
  227. package/src/guidance-topics.js +4 -5
  228. package/src/guidance-topics.ts +10 -0
  229. package/src/input-helpers.js +33 -54
  230. package/src/input-helpers.ts +58 -0
  231. package/src/ledger-sequence.js +45 -48
  232. package/src/ledger-sequence.ts +63 -0
  233. package/src/legacy-lib/clusters-registry.ts +40 -0
  234. package/src/legacy-lib/completion.ts +148 -0
  235. package/src/legacy-lib/compose-utils.ts +102 -0
  236. package/src/legacy-lib/detached-startup.ts +449 -0
  237. package/src/legacy-lib/docker-config.ts +282 -0
  238. package/src/legacy-lib/docker-env-auth.ts +116 -0
  239. package/src/legacy-lib/git-remote-utils.ts +244 -0
  240. package/src/legacy-lib/id-detector.ts +57 -0
  241. package/src/legacy-lib/js-yaml.d.ts +3 -0
  242. package/src/legacy-lib/omelette.d.ts +15 -0
  243. package/src/legacy-lib/path-check.ts +89 -0
  244. package/src/legacy-lib/process-liveness.ts +36 -0
  245. package/src/legacy-lib/provider-credential-path.ts +57 -0
  246. package/src/legacy-lib/provider-defaults.ts +114 -0
  247. package/src/legacy-lib/provider-detection.ts +67 -0
  248. package/src/legacy-lib/provider-names.ts +126 -0
  249. package/src/legacy-lib/repo-settings.ts +88 -0
  250. package/src/legacy-lib/run-mode.ts +58 -0
  251. package/src/legacy-lib/run-plan.ts +49 -0
  252. package/src/legacy-lib/settings/claude-auth.ts +80 -0
  253. package/src/legacy-lib/settings-defaults.ts +212 -0
  254. package/src/legacy-lib/settings-error.ts +8 -0
  255. package/src/legacy-lib/settings-issue-providers.ts +18 -0
  256. package/src/legacy-lib/settings-models.ts +124 -0
  257. package/src/legacy-lib/settings-storage.ts +277 -0
  258. package/src/legacy-lib/settings-validation.ts +220 -0
  259. package/src/legacy-lib/settings.ts +87 -0
  260. package/src/legacy-lib/setup-apply-types.ts +70 -0
  261. package/src/legacy-lib/setup-apply.ts +456 -0
  262. package/src/legacy-lib/setup-journal.ts +185 -0
  263. package/src/legacy-lib/setup-plan-types.ts +96 -0
  264. package/src/legacy-lib/setup-plan.ts +500 -0
  265. package/src/legacy-lib/setup-undo.ts +142 -0
  266. package/src/legacy-lib/start-cluster-config.ts +124 -0
  267. package/src/legacy-lib/start-cluster-environment.ts +165 -0
  268. package/src/legacy-lib/start-cluster-run-options.ts +279 -0
  269. package/src/legacy-lib/start-cluster.ts +237 -0
  270. package/src/legacy-lib/stream-json-parser.ts +88 -0
  271. package/src/message-buffer.js +55 -71
  272. package/src/message-buffer.ts +107 -0
  273. package/src/message-bus-bridge.js +92 -133
  274. package/src/message-bus-bridge.ts +149 -0
  275. package/src/name-generator-shared.js +220 -0
  276. package/src/name-generator-shared.ts +231 -0
  277. package/src/name-generator.js +8 -217
  278. package/src/name-generator.ts +27 -0
  279. package/src/omp-blob-root.js +83 -64
  280. package/src/omp-blob-root.ts +116 -0
  281. package/src/omp-config-overlay.js +65 -38
  282. package/src/omp-config-overlay.ts +110 -0
  283. package/src/omp-execution-fingerprint.js +38 -43
  284. package/src/omp-execution-fingerprint.ts +92 -0
  285. package/src/omp-session-limits.js +10 -15
  286. package/src/omp-session-limits.ts +53 -0
  287. package/src/omp-session-partition.js +2 -2
  288. package/src/omp-session-verifier.js +1 -1
  289. package/src/orchestrator.js +19 -4
  290. package/src/providers/anthropic/index.js +3 -1
  291. package/src/providers/anthropic/index.ts +13 -0
  292. package/src/providers/capabilities.js +19 -27
  293. package/src/providers/capabilities.ts +44 -0
  294. package/src/providers/google/index.js +3 -1
  295. package/src/providers/google/index.ts +13 -0
  296. package/src/providers/openai/index.js +3 -1
  297. package/src/providers/openai/index.ts +13 -0
  298. package/src/providers/opencode/index.js +3 -1
  299. package/src/providers/opencode/index.ts +13 -0
  300. package/src/quality-gates.js +67 -127
  301. package/src/quality-gates.ts +149 -0
  302. package/src/repo-settings-access.js +40 -0
  303. package/src/repo-settings-access.ts +64 -0
  304. package/src/schemas/sub-cluster.js +127 -183
  305. package/src/schemas/sub-cluster.ts +238 -0
  306. package/src/state-snapshot-normalization.js +224 -0
  307. package/src/state-snapshot-normalization.ts +222 -0
  308. package/src/state-snapshot.js +192 -359
  309. package/src/state-snapshot.ts +291 -0
  310. package/src/state-snapshotter.js +118 -130
  311. package/src/state-snapshotter.ts +167 -0
  312. package/src/sub-cluster-wrapper.js +4 -13
  313. package/src/task-run-model-args.js +87 -124
  314. package/src/task-run-model-args.ts +204 -0
  315. package/src/task-runner.js +5 -25
  316. package/src/task-runner.ts +28 -0
  317. package/src/task-startup-error.js +73 -58
  318. package/src/task-startup-error.ts +126 -0
  319. package/src/template-validation/consensus-gate-contracts.js +2 -0
  320. package/src/template-validation/consensus-gate-contracts.ts +70 -0
  321. package/src/template-validation/consensus-gate-scenarios.js +76 -0
  322. package/src/template-validation/consensus-gate-scenarios.ts +130 -0
  323. package/src/template-validation/consensus-gate-stage.js +34 -0
  324. package/src/template-validation/consensus-gate-stage.ts +56 -0
  325. package/src/template-validation/random-topology-contracts.js +2 -0
  326. package/src/template-validation/random-topology-contracts.ts +54 -0
  327. package/src/template-validation/random-topology-dispatch.js +25 -0
  328. package/src/template-validation/random-topology-dispatch.ts +33 -0
  329. package/src/template-validation/random-topology-message-loop.js +53 -0
  330. package/src/template-validation/random-topology-message-loop.ts +73 -0
  331. package/src/template-validation/random-topology-operations.js +79 -0
  332. package/src/template-validation/random-topology-operations.ts +101 -0
  333. package/src/template-validation/random-topology-runtime.js +25 -0
  334. package/src/template-validation/random-topology-runtime.ts +43 -0
  335. package/src/template-validation/random-topology-scenario.js +52 -0
  336. package/src/template-validation/random-topology-scenario.ts +57 -0
  337. package/src/template-validation/random-topology-schema.js +159 -0
  338. package/src/template-validation/random-topology-schema.ts +190 -0
  339. package/src/template-validation/random-topology-state.js +28 -0
  340. package/src/template-validation/random-topology-state.ts +30 -0
  341. package/src/template-validation/random-topology-trigger-evaluation.js +45 -0
  342. package/src/template-validation/random-topology-trigger-evaluation.ts +65 -0
  343. package/src/template-validation/random-topology-trigger.js +75 -0
  344. package/src/template-validation/random-topology-trigger.ts +88 -0
  345. package/src/template-validation/report-formatter.js +40 -46
  346. package/src/template-validation/report-formatter.ts +101 -0
  347. package/src/template-validation/simulate-consensus-gates.js +111 -302
  348. package/src/template-validation/simulate-consensus-gates.ts +196 -0
  349. package/src/template-validation/simulate-random-topology.js +26 -519
  350. package/src/template-validation/simulate-random-topology.ts +57 -0
  351. package/src/template-validation/simulate-two-stage-validation.js +41 -265
  352. package/src/template-validation/simulate-two-stage-validation.ts +55 -0
  353. package/src/template-validation/simulation-agent-runtime.js +25 -0
  354. package/src/template-validation/simulation-agent-runtime.ts +40 -0
  355. package/src/template-validation/simulation-agent.js +29 -0
  356. package/src/template-validation/simulation-agent.ts +73 -0
  357. package/src/template-validation/simulation-runtime.js +34 -0
  358. package/src/template-validation/simulation-runtime.ts +72 -0
  359. package/src/template-validation/two-stage-contracts.js +2 -0
  360. package/src/template-validation/two-stage-contracts.ts +41 -0
  361. package/src/template-validation/two-stage-inputs.js +21 -0
  362. package/src/template-validation/two-stage-inputs.ts +29 -0
  363. package/src/template-validation/two-stage-results.js +30 -0
  364. package/src/template-validation/two-stage-results.ts +40 -0
  365. package/src/template-validation/two-stage-scenario.js +86 -0
  366. package/src/template-validation/two-stage-scenario.ts +120 -0
  367. package/src/worktree-claude-config.js +182 -220
  368. package/src/worktree-claude-config.ts +272 -0
  369. package/src/worktree-tooling-env.js +103 -125
  370. package/src/worktree-tooling-env.ts +142 -0
  371. package/task-lib/completion.js +2 -3
  372. package/task-lib/completion.ts +9 -0
  373. package/task-lib/config.js +1 -4
  374. package/task-lib/config.ts +11 -0
  375. package/task-lib/name-generator.js +4 -226
  376. package/task-lib/name-generator.ts +11 -0
  377. package/task-lib/omp-session-cleanup.js +1 -1
  378. package/task-lib/omp-storage-root.js +8 -12
  379. package/task-lib/omp-storage-root.ts +62 -0
  380. package/task-lib/process-termination.js +143 -166
  381. package/task-lib/process-termination.ts +268 -0
@@ -1,209 +1,212 @@
1
- // @ts-nocheck
2
-
3
- const { getProvider } = require('../providers');
4
- const { isCriticalAgent } = require('./critical-agent-policy');
5
- const { extractCliFailure } = require('./output-extraction');
6
- const { getPiTokenUsage, redactPiFailureForControlPlane } = require('./pi-terminal-lifecycle');
7
- const { parseProviderEvent, providerFailureFields } = require('./provider-control-plane');
8
-
1
+ "use strict";
2
+ const criticalAgentPolicy = require("./critical-agent-policy");
3
+ const piTerminalLifecycle = require("./pi-terminal-lifecycle");
4
+ const providerControlPlane = require("./provider-control-plane");
5
+ const { isCriticalAgent } = criticalAgentPolicy;
6
+ const { getPiTokenUsage, redactPiFailureForControlPlane } = piTerminalLifecycle;
7
+ const { parseProviderEvent, providerFailureFields } = providerControlPlane;
8
+ function isRecord(value) {
9
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
10
+ }
11
+ function isProvidersBoundary(value) {
12
+ return isRecord(value) && typeof value.getProvider === 'function';
13
+ }
14
+ function isOutputExtractionBoundary(value) {
15
+ return isRecord(value) && typeof value.extractCliFailure === 'function';
16
+ }
17
+ const rawProviders = require('../providers');
18
+ if (!isProvidersBoundary(rawProviders)) {
19
+ throw new TypeError('providers module must expose getProvider');
20
+ }
21
+ const { getProvider } = rawProviders;
22
+ const rawOutputExtraction = require('./output-extraction');
23
+ if (!isOutputExtractionBoundary(rawOutputExtraction)) {
24
+ throw new TypeError('output-extraction module must expose extractCliFailure');
25
+ }
26
+ const { extractCliFailure } = rawOutputExtraction;
9
27
  const AUTHENTICATION_FAILURE_PATTERNS = [
10
- /invalid[_ -]?api[_ -]?key/i,
11
- /api[_ -]?key.*invalid/i,
12
- /(?:missing|no) api key/i,
13
- /run\s*\/login/i,
14
- /unauthori[sz]ed/i,
15
- /forbidden|authentication|permission denied/i,
28
+ /invalid[_ -]?api[_ -]?key/i,
29
+ /api[_ -]?key.*invalid/i,
30
+ /(?:missing|no) api key/i,
31
+ /run\s*\/login/i,
32
+ /unauthori[sz]ed/i,
33
+ /forbidden|authentication|permission denied/i,
16
34
  ];
17
-
18
35
  function categoryForProviderFailure(error, classification) {
19
- const isPermanent = classification.retryable === false;
20
- if (isPermanent && AUTHENTICATION_FAILURE_PATTERNS.some((pattern) => pattern.test(error))) {
21
- return 'authentication';
22
- }
23
-
24
- const quotaPattern = /(?:insufficient[_ -]?quota|quota exceeded|resource_exhausted)/i;
25
- if (isPermanent && quotaPattern.test(error)) return 'quota';
26
- if (isPermanent) return 'permanent';
27
- return classification.kind === 'unknown-retryable' ? 'unknown' : 'transient';
28
- }
29
-
36
+ const isPermanent = classification.retryable === false;
37
+ if (isPermanent && AUTHENTICATION_FAILURE_PATTERNS.some((pattern) => pattern.test(error))) {
38
+ return 'authentication';
39
+ }
40
+ const quotaPattern = /(?:insufficient[_ -]?quota|quota exceeded|resource_exhausted)/i;
41
+ if (isPermanent && quotaPattern.test(error))
42
+ return 'quota';
43
+ if (isPermanent)
44
+ return 'permanent';
45
+ return classification.kind === 'unknown-retryable' ? 'unknown' : 'transient';
46
+ }
47
+ function normalizeClassification(value) {
48
+ if (!isRecord(value))
49
+ return { retryable: true, kind: 'unknown-retryable' };
50
+ return {
51
+ retryable: value.retryable !== false,
52
+ kind: typeof value.kind === 'string' ? value.kind : 'unknown-retryable',
53
+ };
54
+ }
30
55
  function classifyProviderFailure(providerName, error) {
31
- let rawClassification = { retryable: true, kind: 'unknown-retryable' };
32
- try {
33
- rawClassification = getProvider(providerName).adapter.classifyError(new Error(error));
34
- } catch {
35
- // Extraction remains available if a provider adapter cannot be loaded.
36
- }
37
- return {
38
- retryable: rawClassification?.retryable !== false,
39
- kind:
40
- typeof rawClassification?.kind === 'string' ? rawClassification.kind : 'unknown-retryable',
41
- };
42
- }
43
-
56
+ let rawClassification = { retryable: true, kind: 'unknown-retryable' };
57
+ try {
58
+ rawClassification = getProvider(providerName).adapter.classifyError(new Error(error));
59
+ }
60
+ catch {
61
+ // Extraction remains available if a provider adapter cannot be loaded.
62
+ }
63
+ return normalizeClassification(rawClassification);
64
+ }
44
65
  function providerFailureEvent(providerName) {
45
- if (providerName === 'codex') return 'turn.failed';
46
- if (providerName === 'pi') return 'agent_settled';
47
- return 'terminal_error';
66
+ if (providerName === 'codex')
67
+ return 'turn.failed';
68
+ if (providerName === 'pi')
69
+ return 'agent_settled';
70
+ return 'terminal_error';
48
71
  }
49
-
50
72
  function extractProviderFailure(output, providerName) {
51
- const cliError = extractCliFailure(output, providerName);
52
- if (!cliError) return null;
53
-
54
- const classification = classifyProviderFailure(providerName, cliError.error);
55
- const category = categoryForProviderFailure(cliError.error, classification);
56
- return {
57
- error: `Provider ${cliError.provider} failed (${category}; ${classification.kind})`,
58
- provider: cliError.provider,
59
- event: providerFailureEvent(cliError.provider),
60
- category,
61
- classification,
62
- diagnostic: cliError.diagnostic,
63
- };
64
- }
65
-
73
+ const cliError = extractCliFailure(output, providerName);
74
+ if (!cliError)
75
+ return null;
76
+ const classification = classifyProviderFailure(providerName, cliError.error);
77
+ const category = categoryForProviderFailure(cliError.error, classification);
78
+ return {
79
+ error: `Provider ${cliError.provider} failed (${category}; ${classification.kind})`,
80
+ provider: cliError.provider,
81
+ event: providerFailureEvent(cliError.provider),
82
+ category,
83
+ classification,
84
+ diagnostic: cliError.diagnostic,
85
+ };
86
+ }
66
87
  function extractProviderCompletionFailure(output, providerName, state = {}) {
67
- if (providerName !== 'pi') return extractProviderFailure(output, providerName);
68
- if (state.providerFailure) return state.providerFailure;
69
- if (state.piProtocolPrefixOmitted) return extractProviderFailure('', 'pi');
70
- if (!state.piProtocolObserved) return extractProviderFailure(output, 'pi');
71
- if (!state.piProtocolSettled || !state.piLatestAssistantObserved) {
72
- return extractProviderFailure('', 'pi');
73
- }
74
- return null;
75
- }
76
-
88
+ if (providerName !== 'pi')
89
+ return extractProviderFailure(output, providerName);
90
+ if (state.providerFailure)
91
+ return state.providerFailure;
92
+ if (state.piProtocolPrefixOmitted)
93
+ return extractProviderFailure('', 'pi');
94
+ if (!state.piProtocolObserved)
95
+ return extractProviderFailure(output, 'pi');
96
+ if (!state.piProtocolSettled || !state.piLatestAssistantObserved) {
97
+ return extractProviderFailure('', 'pi');
98
+ }
99
+ return null;
100
+ }
77
101
  function redactedFailureEnvelope(failure, providerName, eventType) {
78
- return JSON.stringify({
79
- type: eventType,
80
- ...(providerName === 'claude' ? { is_error: true } : {}),
81
- ...(providerName === 'gemini' ? { status: 'error', severity: 'error' } : {}),
82
- ...providerFailureFields(failure),
83
- });
84
- }
85
-
102
+ return JSON.stringify({
103
+ type: eventType,
104
+ ...(providerName === 'claude' ? { is_error: true } : {}),
105
+ ...(providerName === 'gemini' ? { status: 'error', severity: 'error' } : {}),
106
+ ...providerFailureFields(failure),
107
+ });
108
+ }
86
109
  function redactTerminalFailureForControlPlane(state, providerName, content) {
87
- if (providerName === 'pi') {
88
- return redactPiFailureForControlPlane(state, content, extractProviderFailure);
89
- }
90
-
91
- const failure = extractProviderFailure(content, providerName);
92
- if (!failure) return content;
93
-
94
- state.providerFailure = failure;
95
- const parsed = parseProviderEvent(content);
96
- const eventType = typeof parsed?.type === 'string' ? parsed.type : 'provider.failure';
97
- return redactedFailureEnvelope(failure, providerName, eventType);
98
- }
99
-
110
+ if (providerName === 'pi') {
111
+ return redactPiFailureForControlPlane(state, content, extractProviderFailure);
112
+ }
113
+ const failure = extractProviderFailure(content, providerName);
114
+ if (!failure)
115
+ return content;
116
+ state.providerFailure = failure;
117
+ const parsed = parseProviderEvent(content);
118
+ const eventType = typeof parsed?.type === 'string' ? parsed.type : 'provider.failure';
119
+ return redactedFailureEnvelope(failure, providerName, eventType);
120
+ }
100
121
  function decorateError(error, failure) {
101
- if (!failure) return error;
102
- error.provider = failure.provider || null;
103
- error.providerEvent = failure.event || null;
104
- error.providerCategory = failure.category || null;
105
- error.classification = failure.classification || null;
106
- error.providerDiagnostic = failure.diagnostic || null;
107
- if (failure.classification?.retryable === false) error.permanent = true;
108
- return error;
109
- }
110
-
122
+ if (!failure)
123
+ return error;
124
+ error.provider = failure.provider || null;
125
+ error.providerEvent = failure.event || null;
126
+ error.providerCategory = failure.category || null;
127
+ error.classification = failure.classification || null;
128
+ error.providerDiagnostic = failure.diagnostic || null;
129
+ if (failure.classification?.retryable === false)
130
+ error.permanent = true;
131
+ return error;
132
+ }
111
133
  function receiptFields(error) {
112
- if (!error?.provider) return {};
113
- return {
114
- provider: error.provider,
115
- event: error.providerEvent,
116
- category: error.providerCategory,
117
- kind: error.classification?.kind,
118
- retryable: error.classification?.retryable,
119
- diagnostic: error.providerDiagnostic,
120
- };
121
- }
122
-
134
+ if (!error?.provider)
135
+ return {};
136
+ return {
137
+ provider: error.provider,
138
+ event: error.providerEvent,
139
+ category: error.providerCategory,
140
+ kind: error.classification?.kind,
141
+ retryable: error.classification?.retryable,
142
+ diagnostic: error.providerDiagnostic,
143
+ };
144
+ }
123
145
  function workerFailure(error) {
124
- const authenticationFailure =
125
- error?.provider &&
126
- error?.classification?.retryable === false &&
127
- error?.providerCategory === 'authentication';
128
- return authenticationFailure
129
- ? { code: 'refusal', reason: 'authentication_required' }
130
- : { code: 'crash', reason: 'declared_failure' };
131
- }
132
-
133
- function publishCriticalFailure({
134
- agent,
135
- error,
136
- attempts,
137
- worker,
138
- unsupportedCapability,
139
- structuredOutputInvalid,
140
- }) {
141
- const specific =
142
- error?.hookFailure ||
143
- structuredOutputInvalid ||
144
- unsupportedCapability ||
145
- error?.vertexModelError ||
146
- error?.terminationExhausted;
147
- const critical = isCriticalAgent(agent);
148
- if (!critical || specific) return worker;
149
-
150
- agent._publish({
151
- topic: 'CLUSTER_FAILED',
152
- receiver: 'broadcast',
153
- content: {
154
- text: `Critical agent ${agent.id} exhausted its retry budget`,
155
- data: {
156
- reason: error?.provider ? 'provider_execution_failed' : 'critical_agent_exhausted',
146
+ const authenticationFailure = error?.provider &&
147
+ error.classification?.retryable === false &&
148
+ error.providerCategory === 'authentication';
149
+ return authenticationFailure
150
+ ? { code: 'refusal', reason: 'authentication_required' }
151
+ : { code: 'crash', reason: 'declared_failure' };
152
+ }
153
+ function publishCriticalFailure({ agent, error, attempts, worker, unsupportedCapability, structuredOutputInvalid, }) {
154
+ const specific = error.hookFailure ||
155
+ structuredOutputInvalid ||
156
+ unsupportedCapability ||
157
+ error.vertexModelError ||
158
+ error.terminationExhausted;
159
+ const critical = isCriticalAgent(agent);
160
+ if (!critical || specific)
161
+ return worker;
162
+ agent._publish({
163
+ topic: 'CLUSTER_FAILED',
164
+ receiver: 'broadcast',
165
+ content: {
166
+ text: `Critical agent ${agent.id} exhausted its retry budget`,
167
+ data: {
168
+ reason: error.provider ? 'provider_execution_failed' : 'critical_agent_exhausted',
169
+ agentId: agent.id,
170
+ role: agent.role,
171
+ attempts,
172
+ code: worker.code,
173
+ workerReason: worker.reason,
174
+ ...receiptFields(error),
175
+ },
176
+ },
177
+ });
178
+ return worker;
179
+ }
180
+ function buildFinalFailureInfo({ agent, error, attempts, worker, unsupportedCapability, structuredOutputInvalid, }) {
181
+ return {
182
+ ...(error.terminationExhausted ? agent.cluster.failureInfo : {}),
157
183
  agentId: agent.id,
158
- role: agent.role,
184
+ taskId: error.taskId || agent.currentTaskId,
185
+ iteration: agent.iteration,
186
+ error: error.message,
159
187
  attempts,
160
- code: worker.code,
161
- workerReason: worker.reason,
162
188
  ...receiptFields(error),
163
- },
164
- },
165
- });
166
- return worker;
167
- }
168
-
169
- function buildFinalFailureInfo({
170
- agent,
171
- error,
172
- attempts,
173
- worker,
174
- unsupportedCapability,
175
- structuredOutputInvalid,
176
- }) {
177
- return {
178
- ...(error?.terminationExhausted ? agent.cluster.failureInfo : {}),
179
- agentId: agent.id,
180
- taskId: error?.taskId || agent.currentTaskId,
181
- iteration: agent.iteration,
182
- error: error.message,
183
- attempts,
184
- ...receiptFields(error),
185
- ...(error?.provider ? { code: worker.code, workerReason: worker.reason } : {}),
186
- ...(unsupportedCapability
187
- ? {
188
- code: error.code,
189
- permanent: true,
190
- provider: error.provider,
191
- capability: error.capability,
192
- }
193
- : {}),
194
- ...(structuredOutputInvalid ? { code: error.code, details: error.details ?? null } : {}),
195
- timestamp: Date.now(),
196
- };
197
- }
198
-
189
+ ...(error.provider ? { code: worker.code, workerReason: worker.reason } : {}),
190
+ ...(unsupportedCapability
191
+ ? {
192
+ code: error.code,
193
+ permanent: true,
194
+ provider: error.provider,
195
+ capability: error.capability,
196
+ }
197
+ : {}),
198
+ ...(structuredOutputInvalid ? { code: error.code, details: error.details ?? null } : {}),
199
+ timestamp: Date.now(),
200
+ };
201
+ }
199
202
  module.exports = {
200
- buildFinalFailureInfo,
201
- decorateError,
202
- extractProviderCompletionFailure,
203
- extractProviderFailure,
204
- getPiTokenUsage,
205
- publishCriticalFailure,
206
- receiptFields,
207
- redactTerminalFailureForControlPlane,
208
- workerFailure,
203
+ buildFinalFailureInfo,
204
+ decorateError,
205
+ extractProviderCompletionFailure,
206
+ extractProviderFailure,
207
+ getPiTokenUsage,
208
+ publishCriticalFailure,
209
+ receiptFields,
210
+ redactTerminalFailureForControlPlane,
211
+ workerFailure,
209
212
  };
@@ -0,0 +1,262 @@
1
+ import criticalAgentPolicy = require('./critical-agent-policy');
2
+ import piTerminalLifecycle = require('./pi-terminal-lifecycle');
3
+ import providerControlPlane = require('./provider-control-plane');
4
+ import type { PiLifecycleState, ProviderFailure } from './pi-terminal-lifecycle-types';
5
+ import type { FailureOutputExtractionBoundary as OutputExtractionBoundary } from './output-extraction-types';
6
+ import type {
7
+ FailureMetadata,
8
+ ProviderClassification,
9
+ ProvidersBoundary,
10
+ TerminalFailureArguments,
11
+ TerminalFailureError,
12
+ WorkerFailure,
13
+ } from './provider-terminal-failure-types';
14
+
15
+ const { isCriticalAgent } = criticalAgentPolicy;
16
+ const { getPiTokenUsage, redactPiFailureForControlPlane } = piTerminalLifecycle;
17
+ const { parseProviderEvent, providerFailureFields } = providerControlPlane;
18
+
19
+ function isRecord(value: unknown): value is Record<string, unknown> {
20
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
21
+ }
22
+
23
+ function isProvidersBoundary(value: unknown): value is ProvidersBoundary {
24
+ return isRecord(value) && typeof value.getProvider === 'function';
25
+ }
26
+
27
+ function isOutputExtractionBoundary(value: unknown): value is OutputExtractionBoundary {
28
+ return isRecord(value) && typeof value.extractCliFailure === 'function';
29
+ }
30
+
31
+ const rawProviders: unknown = require('../providers');
32
+ if (!isProvidersBoundary(rawProviders)) {
33
+ throw new TypeError('providers module must expose getProvider');
34
+ }
35
+ const { getProvider } = rawProviders;
36
+
37
+ const rawOutputExtraction: unknown = require('./output-extraction');
38
+ if (!isOutputExtractionBoundary(rawOutputExtraction)) {
39
+ throw new TypeError('output-extraction module must expose extractCliFailure');
40
+ }
41
+ const { extractCliFailure } = rawOutputExtraction;
42
+
43
+ const AUTHENTICATION_FAILURE_PATTERNS = [
44
+ /invalid[_ -]?api[_ -]?key/i,
45
+ /api[_ -]?key.*invalid/i,
46
+ /(?:missing|no) api key/i,
47
+ /run\s*\/login/i,
48
+ /unauthori[sz]ed/i,
49
+ /forbidden|authentication|permission denied/i,
50
+ ];
51
+
52
+ function categoryForProviderFailure(error: string, classification: ProviderClassification): string {
53
+ const isPermanent = classification.retryable === false;
54
+ if (isPermanent && AUTHENTICATION_FAILURE_PATTERNS.some((pattern) => pattern.test(error))) {
55
+ return 'authentication';
56
+ }
57
+
58
+ const quotaPattern = /(?:insufficient[_ -]?quota|quota exceeded|resource_exhausted)/i;
59
+ if (isPermanent && quotaPattern.test(error)) return 'quota';
60
+ if (isPermanent) return 'permanent';
61
+ return classification.kind === 'unknown-retryable' ? 'unknown' : 'transient';
62
+ }
63
+
64
+ function normalizeClassification(value: unknown): ProviderClassification {
65
+ if (!isRecord(value)) return { retryable: true, kind: 'unknown-retryable' };
66
+ return {
67
+ retryable: value.retryable !== false,
68
+ kind: typeof value.kind === 'string' ? value.kind : 'unknown-retryable',
69
+ };
70
+ }
71
+
72
+ function classifyProviderFailure(providerName: string, error: string): ProviderClassification {
73
+ let rawClassification: unknown = { retryable: true, kind: 'unknown-retryable' };
74
+ try {
75
+ rawClassification = getProvider(providerName).adapter.classifyError(new Error(error));
76
+ } catch {
77
+ // Extraction remains available if a provider adapter cannot be loaded.
78
+ }
79
+ return normalizeClassification(rawClassification);
80
+ }
81
+
82
+ function providerFailureEvent(providerName: string): string {
83
+ if (providerName === 'codex') return 'turn.failed';
84
+ if (providerName === 'pi') return 'agent_settled';
85
+ return 'terminal_error';
86
+ }
87
+
88
+ function extractProviderFailure(output: string, providerName: string): ProviderFailure | null {
89
+ const cliError = extractCliFailure(output, providerName);
90
+ if (!cliError) return null;
91
+
92
+ const classification = classifyProviderFailure(providerName, cliError.error);
93
+ const category = categoryForProviderFailure(cliError.error, classification);
94
+ return {
95
+ error: `Provider ${cliError.provider} failed (${category}; ${classification.kind})`,
96
+ provider: cliError.provider,
97
+ event: providerFailureEvent(cliError.provider),
98
+ category,
99
+ classification,
100
+ diagnostic: cliError.diagnostic,
101
+ };
102
+ }
103
+
104
+ function extractProviderCompletionFailure(
105
+ output: string,
106
+ providerName: string,
107
+ state: PiLifecycleState = {}
108
+ ): ProviderFailure | null {
109
+ if (providerName !== 'pi') return extractProviderFailure(output, providerName);
110
+ if (state.providerFailure) return state.providerFailure;
111
+ if (state.piProtocolPrefixOmitted) return extractProviderFailure('', 'pi');
112
+ if (!state.piProtocolObserved) return extractProviderFailure(output, 'pi');
113
+ if (!state.piProtocolSettled || !state.piLatestAssistantObserved) {
114
+ return extractProviderFailure('', 'pi');
115
+ }
116
+ return null;
117
+ }
118
+
119
+ function redactedFailureEnvelope(
120
+ failure: ProviderFailure,
121
+ providerName: string,
122
+ eventType: string
123
+ ): string {
124
+ return JSON.stringify({
125
+ type: eventType,
126
+ ...(providerName === 'claude' ? { is_error: true } : {}),
127
+ ...(providerName === 'gemini' ? { status: 'error', severity: 'error' } : {}),
128
+ ...providerFailureFields(failure),
129
+ });
130
+ }
131
+
132
+ function redactTerminalFailureForControlPlane(
133
+ state: PiLifecycleState,
134
+ providerName: string,
135
+ content: string
136
+ ): string {
137
+ if (providerName === 'pi') {
138
+ return redactPiFailureForControlPlane(state, content, extractProviderFailure);
139
+ }
140
+
141
+ const failure = extractProviderFailure(content, providerName);
142
+ if (!failure) return content;
143
+
144
+ state.providerFailure = failure;
145
+ const parsed = parseProviderEvent(content);
146
+ const eventType = typeof parsed?.type === 'string' ? parsed.type : 'provider.failure';
147
+ return redactedFailureEnvelope(failure, providerName, eventType);
148
+ }
149
+
150
+ function decorateError<T extends TerminalFailureError>(
151
+ error: T,
152
+ failure: ProviderFailure | null | undefined
153
+ ): T {
154
+ if (!failure) return error;
155
+ error.provider = failure.provider || null;
156
+ error.providerEvent = failure.event || null;
157
+ error.providerCategory = failure.category || null;
158
+ error.classification = failure.classification || null;
159
+ error.providerDiagnostic = failure.diagnostic || null;
160
+ if (failure.classification?.retryable === false) error.permanent = true;
161
+ return error;
162
+ }
163
+
164
+ function receiptFields(error: FailureMetadata | null | undefined): Record<string, unknown> {
165
+ if (!error?.provider) return {};
166
+ return {
167
+ provider: error.provider,
168
+ event: error.providerEvent,
169
+ category: error.providerCategory,
170
+ kind: error.classification?.kind,
171
+ retryable: error.classification?.retryable,
172
+ diagnostic: error.providerDiagnostic,
173
+ };
174
+ }
175
+
176
+ function workerFailure(error: FailureMetadata | null | undefined): WorkerFailure {
177
+ const authenticationFailure =
178
+ error?.provider &&
179
+ error.classification?.retryable === false &&
180
+ error.providerCategory === 'authentication';
181
+ return authenticationFailure
182
+ ? { code: 'refusal', reason: 'authentication_required' }
183
+ : { code: 'crash', reason: 'declared_failure' };
184
+ }
185
+
186
+ function publishCriticalFailure({
187
+ agent,
188
+ error,
189
+ attempts,
190
+ worker,
191
+ unsupportedCapability,
192
+ structuredOutputInvalid,
193
+ }: TerminalFailureArguments): WorkerFailure {
194
+ const specific =
195
+ error.hookFailure ||
196
+ structuredOutputInvalid ||
197
+ unsupportedCapability ||
198
+ error.vertexModelError ||
199
+ error.terminationExhausted;
200
+ const critical = isCriticalAgent(agent);
201
+ if (!critical || specific) return worker;
202
+
203
+ agent._publish({
204
+ topic: 'CLUSTER_FAILED',
205
+ receiver: 'broadcast',
206
+ content: {
207
+ text: `Critical agent ${agent.id} exhausted its retry budget`,
208
+ data: {
209
+ reason: error.provider ? 'provider_execution_failed' : 'critical_agent_exhausted',
210
+ agentId: agent.id,
211
+ role: agent.role,
212
+ attempts,
213
+ code: worker.code,
214
+ workerReason: worker.reason,
215
+ ...receiptFields(error),
216
+ },
217
+ },
218
+ });
219
+ return worker;
220
+ }
221
+
222
+ function buildFinalFailureInfo({
223
+ agent,
224
+ error,
225
+ attempts,
226
+ worker,
227
+ unsupportedCapability,
228
+ structuredOutputInvalid,
229
+ }: TerminalFailureArguments): Record<string, unknown> {
230
+ return {
231
+ ...(error.terminationExhausted ? agent.cluster.failureInfo : {}),
232
+ agentId: agent.id,
233
+ taskId: error.taskId || agent.currentTaskId,
234
+ iteration: agent.iteration,
235
+ error: error.message,
236
+ attempts,
237
+ ...receiptFields(error),
238
+ ...(error.provider ? { code: worker.code, workerReason: worker.reason } : {}),
239
+ ...(unsupportedCapability
240
+ ? {
241
+ code: error.code,
242
+ permanent: true,
243
+ provider: error.provider,
244
+ capability: error.capability,
245
+ }
246
+ : {}),
247
+ ...(structuredOutputInvalid ? { code: error.code, details: error.details ?? null } : {}),
248
+ timestamp: Date.now(),
249
+ };
250
+ }
251
+
252
+ export = {
253
+ buildFinalFailureInfo,
254
+ decorateError,
255
+ extractProviderCompletionFailure,
256
+ extractProviderFailure,
257
+ getPiTokenUsage,
258
+ publishCriticalFailure,
259
+ receiptFields,
260
+ redactTerminalFailureForControlPlane,
261
+ workerFailure,
262
+ };