@the-open-engine/zeroshot 6.38.1 → 6.39.1

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 (383) hide show
  1. package/README.md +6 -0
  2. package/cli/event-copy.js +8 -7
  3. package/cli/event-copy.ts +12 -0
  4. package/cli/index.js +67 -48
  5. package/cli/json-export.js +61 -64
  6. package/cli/json-export.ts +112 -0
  7. package/cli/message-formatter-utils.js +68 -56
  8. package/cli/message-formatter-utils.ts +121 -0
  9. package/cli/message-formatters-normal.js +124 -259
  10. package/cli/message-formatters-normal.ts +250 -0
  11. package/cli/message-formatters-watch.js +81 -84
  12. package/cli/message-formatters-watch.ts +189 -0
  13. package/lib/cluster/generated/protocol-schema.cjs +1 -1
  14. package/lib/cluster/generated/protocol-schema.mjs +1 -1
  15. package/lib/cluster/generated/protocol.d.cts +8 -0
  16. package/lib/cluster/generated/protocol.d.mts +8 -0
  17. package/lib/cluster/generated/protocol.d.ts +8 -0
  18. package/lib/clusters-registry.d.ts +23 -0
  19. package/lib/clusters-registry.js +17 -29
  20. package/lib/completion.d.ts +12 -0
  21. package/lib/completion.js +84 -94
  22. package/lib/compose-utils.d.ts +32 -0
  23. package/lib/compose-utils.js +57 -72
  24. package/lib/detached-startup.d.ts +84 -0
  25. package/lib/detached-startup.js +232 -302
  26. package/lib/docker-config.d.ts +43 -0
  27. package/lib/docker-config.js +150 -325
  28. package/lib/docker-env-auth.d.ts +17 -0
  29. package/lib/docker-env-auth.js +75 -0
  30. package/lib/git-remote-utils.d.ts +48 -0
  31. package/lib/git-remote-utils.js +147 -213
  32. package/lib/id-detector.d.ts +15 -0
  33. package/lib/id-detector.js +37 -41
  34. package/lib/path-check.d.ts +30 -0
  35. package/lib/path-check.js +42 -45
  36. package/lib/process-liveness.d.ts +16 -0
  37. package/lib/process-liveness.js +19 -12
  38. package/lib/provider-credential-path.d.ts +16 -0
  39. package/lib/provider-credential-path.js +31 -29
  40. package/lib/provider-defaults.d.ts +30 -0
  41. package/lib/provider-defaults.js +47 -42
  42. package/lib/provider-detection.d.ts +11 -0
  43. package/lib/provider-detection.js +91 -54
  44. package/lib/provider-names.d.ts +38 -0
  45. package/lib/provider-names.js +56 -64
  46. package/lib/repo-settings.d.ts +28 -0
  47. package/lib/repo-settings.js +83 -59
  48. package/lib/run-mode.d.ts +21 -0
  49. package/lib/run-mode.js +21 -20
  50. package/lib/run-plan.d.ts +28 -0
  51. package/lib/run-plan.js +17 -16
  52. package/lib/settings/claude-auth.d.ts +35 -0
  53. package/lib/settings/claude-auth.js +30 -47
  54. package/lib/settings-defaults.d.ts +20 -0
  55. package/lib/settings-defaults.js +149 -0
  56. package/lib/settings-error.d.ts +7 -0
  57. package/lib/settings-error.js +8 -0
  58. package/lib/settings-issue-providers.d.ts +10 -0
  59. package/lib/settings-issue-providers.js +12 -0
  60. package/lib/settings-models.d.ts +22 -0
  61. package/lib/settings-models.js +93 -0
  62. package/lib/settings-storage.d.ts +23 -0
  63. package/lib/settings-storage.js +205 -0
  64. package/lib/settings-validation.d.ts +7 -0
  65. package/lib/settings-validation.js +182 -0
  66. package/lib/settings.d.ts +29 -0
  67. package/lib/settings.js +41 -736
  68. package/lib/setup-apply-types.d.ts +66 -0
  69. package/lib/setup-apply-types.js +2 -0
  70. package/lib/setup-apply.d.ts +39 -0
  71. package/lib/setup-apply.js +267 -264
  72. package/lib/setup-journal.d.ts +41 -0
  73. package/lib/setup-journal.js +119 -76
  74. package/lib/setup-plan-types.d.ts +102 -0
  75. package/lib/setup-plan-types.js +2 -0
  76. package/lib/setup-plan.d.ts +30 -0
  77. package/lib/setup-plan.js +300 -324
  78. package/lib/setup-undo.d.ts +44 -0
  79. package/lib/setup-undo.js +61 -74
  80. package/lib/start-cluster-config.d.ts +26 -0
  81. package/lib/start-cluster-config.js +56 -0
  82. package/lib/start-cluster-environment.d.ts +41 -0
  83. package/lib/start-cluster-environment.js +134 -0
  84. package/lib/start-cluster-run-options.d.ts +54 -0
  85. package/lib/start-cluster-run-options.js +148 -0
  86. package/lib/start-cluster.d.ts +64 -0
  87. package/lib/start-cluster.js +98 -454
  88. package/lib/stream-json-parser.d.ts +17 -0
  89. package/lib/stream-json-parser.js +51 -52
  90. package/npm-shrinkwrap.json +6 -8
  91. package/package.json +14 -8
  92. package/scripts/postinstall.js +27 -0
  93. package/scripts/rust-distribution.js +36 -45
  94. package/src/agent/agent-command-proofs-context.js +35 -45
  95. package/src/agent/agent-command-proofs-context.ts +87 -0
  96. package/src/agent/agent-config-settings.js +19 -0
  97. package/src/agent/agent-config-settings.ts +41 -0
  98. package/src/agent/agent-config.js +122 -231
  99. package/src/agent/agent-config.ts +285 -0
  100. package/src/agent/agent-context-builder.js +38 -273
  101. package/src/agent/agent-context-builder.ts +51 -0
  102. package/src/agent/agent-context-environment-sections.js +105 -0
  103. package/src/agent/agent-context-environment-sections.ts +134 -0
  104. package/src/agent/agent-context-packs.js +165 -0
  105. package/src/agent/agent-context-packs.ts +296 -0
  106. package/src/agent/agent-context-prompt-sections.js +100 -0
  107. package/src/agent/agent-context-prompt-sections.ts +148 -0
  108. package/src/agent/agent-context-sections.js +25 -334
  109. package/src/agent/agent-context-sections.ts +36 -0
  110. package/src/agent/agent-context-sources.js +96 -149
  111. package/src/agent/agent-context-sources.ts +253 -0
  112. package/src/agent/agent-context-types.js +2 -0
  113. package/src/agent/agent-context-types.ts +132 -0
  114. package/src/agent/agent-context-validation-sections.js +73 -0
  115. package/src/agent/agent-context-validation-sections.ts +129 -0
  116. package/src/agent/agent-input-injector.js +99 -118
  117. package/src/agent/agent-input-injector.ts +195 -0
  118. package/src/agent/agent-liveness-poll.js +74 -78
  119. package/src/agent/agent-liveness-poll.ts +163 -0
  120. package/src/agent/agent-quality-gate-schema.js +77 -86
  121. package/src/agent/agent-quality-gate-schema.ts +135 -0
  122. package/src/agent/agent-quality-gates-context.js +44 -50
  123. package/src/agent/agent-quality-gates-context.ts +91 -0
  124. package/src/agent/agent-stuck-detector.js +171 -239
  125. package/src/agent/agent-stuck-detector.ts +288 -0
  126. package/src/agent/agent-trigger-evaluator.js +29 -46
  127. package/src/agent/agent-trigger-evaluator.ts +98 -0
  128. package/src/agent/context-metrics.js +110 -141
  129. package/src/agent/context-metrics.ts +261 -0
  130. package/src/agent/context-pack-builder.js +72 -358
  131. package/src/agent/context-pack-builder.ts +105 -0
  132. package/src/agent/context-pack-core.js +70 -0
  133. package/src/agent/context-pack-core.ts +96 -0
  134. package/src/agent/context-pack-selection.js +119 -0
  135. package/src/agent/context-pack-selection.ts +187 -0
  136. package/src/agent/context-pack-truncation.js +139 -0
  137. package/src/agent/context-pack-truncation.ts +208 -0
  138. package/src/agent/context-pack-types.js +2 -0
  139. package/src/agent/context-pack-types.ts +98 -0
  140. package/src/agent/context-replay-policy.js +30 -39
  141. package/src/agent/context-replay-policy.ts +71 -0
  142. package/src/agent/critical-agent-policy.js +6 -10
  143. package/src/agent/critical-agent-policy.ts +20 -0
  144. package/src/agent/guidance-queue.js +74 -87
  145. package/src/agent/guidance-queue.ts +166 -0
  146. package/src/agent/output-extraction-error-detail.js +45 -0
  147. package/src/agent/output-extraction-error-detail.ts +49 -0
  148. package/src/agent/output-extraction-failures.js +125 -0
  149. package/src/agent/output-extraction-failures.ts +149 -0
  150. package/src/agent/output-extraction-json.js +234 -0
  151. package/src/agent/output-extraction-json.ts +235 -0
  152. package/src/agent/output-extraction-pi.js +124 -0
  153. package/src/agent/output-extraction-pi.ts +137 -0
  154. package/src/agent/output-extraction-types.js +2 -0
  155. package/src/agent/output-extraction-types.ts +49 -0
  156. package/src/agent/output-extraction.js +17 -617
  157. package/src/agent/output-extraction.ts +30 -0
  158. package/src/agent/output-reformatter-errors.js +83 -0
  159. package/src/agent/output-reformatter-errors.ts +106 -0
  160. package/src/agent/output-reformatter-types.js +2 -0
  161. package/src/agent/output-reformatter-types.ts +86 -0
  162. package/src/agent/output-reformatter.js +140 -185
  163. package/src/agent/output-reformatter.ts +238 -0
  164. package/src/agent/pi-terminal-lifecycle-types.js +2 -0
  165. package/src/agent/pi-terminal-lifecycle-types.ts +41 -0
  166. package/src/agent/pi-terminal-lifecycle.js +186 -206
  167. package/src/agent/pi-terminal-lifecycle.ts +297 -0
  168. package/src/agent/provider-control-plane.js +22 -21
  169. package/src/agent/provider-control-plane.ts +52 -0
  170. package/src/agent/provider-terminal-failure-types.js +2 -0
  171. package/src/agent/provider-terminal-failure-types.ts +60 -0
  172. package/src/agent/provider-terminal-failure.js +194 -191
  173. package/src/agent/provider-terminal-failure.ts +262 -0
  174. package/src/agent/rate-limit-backoff.js +31 -74
  175. package/src/agent/rate-limit-backoff.ts +71 -0
  176. package/src/agent/schema-utils.js +85 -125
  177. package/src/agent/schema-utils.ts +148 -0
  178. package/src/agent/structured-output-error.js +34 -33
  179. package/src/agent/structured-output-error.ts +105 -0
  180. package/src/agent/validation-platform.js +27 -27
  181. package/src/agent/validation-platform.ts +49 -0
  182. package/src/agents/git-pusher-template.js +17 -34
  183. package/src/attach/attach-client.js +232 -405
  184. package/src/attach/attach-client.ts +300 -0
  185. package/src/attach/attach-server-cleanup.js +43 -0
  186. package/src/attach/attach-server-cleanup.ts +39 -0
  187. package/src/attach/attach-server-clients.js +117 -0
  188. package/src/attach/attach-server-clients.ts +122 -0
  189. package/src/attach/attach-server-events.js +38 -0
  190. package/src/attach/attach-server-events.ts +36 -0
  191. package/src/attach/attach-server-pty.js +45 -0
  192. package/src/attach/attach-server-pty.ts +64 -0
  193. package/src/attach/attach-server-runtime.js +73 -0
  194. package/src/attach/attach-server-runtime.ts +62 -0
  195. package/src/attach/attach-server-socket.js +28 -0
  196. package/src/attach/attach-server-socket.ts +23 -0
  197. package/src/attach/attach-server-types.js +2 -0
  198. package/src/attach/attach-server-types.ts +82 -0
  199. package/src/attach/attach-server.js +106 -523
  200. package/src/attach/attach-server.ts +158 -0
  201. package/src/attach/index.js +18 -35
  202. package/src/attach/index.ts +18 -0
  203. package/src/attach/protocol.js +95 -184
  204. package/src/attach/protocol.ts +181 -0
  205. package/src/attach/ring-buffer.js +76 -102
  206. package/src/attach/ring-buffer.ts +109 -0
  207. package/src/attach/send-input.js +64 -75
  208. package/src/attach/send-input.ts +94 -0
  209. package/src/attach/socket-discovery.js +164 -218
  210. package/src/attach/socket-discovery.ts +230 -0
  211. package/src/attach/socket-paths.js +42 -61
  212. package/src/attach/socket-paths.ts +81 -0
  213. package/src/claude-credentials.js +51 -54
  214. package/src/claude-credentials.ts +89 -0
  215. package/src/cluster/generated/protocol-schema.ts +1 -1
  216. package/src/cluster/generated/protocol.ts +2 -1
  217. package/src/command-proofs.js +110 -141
  218. package/src/command-proofs.ts +216 -0
  219. package/src/config-router.js +81 -73
  220. package/src/config-router.ts +131 -0
  221. package/src/copy-containment.js +191 -0
  222. package/src/copy-containment.ts +259 -0
  223. package/src/copy-worker.js +53 -30
  224. package/src/copy-worker.ts +88 -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/isolation-manager.js +59 -20
  232. package/src/ledger-sequence.js +45 -48
  233. package/src/ledger-sequence.ts +63 -0
  234. package/src/legacy-lib/clusters-registry.ts +40 -0
  235. package/src/legacy-lib/completion.ts +148 -0
  236. package/src/legacy-lib/compose-utils.ts +102 -0
  237. package/src/legacy-lib/detached-startup.ts +451 -0
  238. package/src/legacy-lib/docker-config.ts +282 -0
  239. package/src/legacy-lib/docker-env-auth.ts +116 -0
  240. package/src/legacy-lib/git-remote-utils.ts +244 -0
  241. package/src/legacy-lib/id-detector.ts +57 -0
  242. package/src/legacy-lib/js-yaml.d.ts +3 -0
  243. package/src/legacy-lib/omelette.d.ts +15 -0
  244. package/src/legacy-lib/path-check.ts +89 -0
  245. package/src/legacy-lib/process-liveness.ts +36 -0
  246. package/src/legacy-lib/provider-credential-path.ts +57 -0
  247. package/src/legacy-lib/provider-defaults.ts +114 -0
  248. package/src/legacy-lib/provider-detection.ts +67 -0
  249. package/src/legacy-lib/provider-names.ts +126 -0
  250. package/src/legacy-lib/repo-settings.ts +88 -0
  251. package/src/legacy-lib/run-mode.ts +58 -0
  252. package/src/legacy-lib/run-plan.ts +49 -0
  253. package/src/legacy-lib/settings/claude-auth.ts +80 -0
  254. package/src/legacy-lib/settings-defaults.ts +212 -0
  255. package/src/legacy-lib/settings-error.ts +8 -0
  256. package/src/legacy-lib/settings-issue-providers.ts +18 -0
  257. package/src/legacy-lib/settings-models.ts +124 -0
  258. package/src/legacy-lib/settings-storage.ts +277 -0
  259. package/src/legacy-lib/settings-validation.ts +220 -0
  260. package/src/legacy-lib/settings.ts +87 -0
  261. package/src/legacy-lib/setup-apply-types.ts +70 -0
  262. package/src/legacy-lib/setup-apply.ts +456 -0
  263. package/src/legacy-lib/setup-journal.ts +185 -0
  264. package/src/legacy-lib/setup-plan-types.ts +96 -0
  265. package/src/legacy-lib/setup-plan.ts +500 -0
  266. package/src/legacy-lib/setup-undo.ts +142 -0
  267. package/src/legacy-lib/start-cluster-config.ts +124 -0
  268. package/src/legacy-lib/start-cluster-environment.ts +166 -0
  269. package/src/legacy-lib/start-cluster-run-options.ts +281 -0
  270. package/src/legacy-lib/start-cluster.ts +237 -0
  271. package/src/legacy-lib/stream-json-parser.ts +88 -0
  272. package/src/message-buffer.js +55 -71
  273. package/src/message-buffer.ts +107 -0
  274. package/src/message-bus-bridge.js +92 -133
  275. package/src/message-bus-bridge.ts +149 -0
  276. package/src/name-generator-shared.js +220 -0
  277. package/src/name-generator-shared.ts +231 -0
  278. package/src/name-generator.js +8 -217
  279. package/src/name-generator.ts +27 -0
  280. package/src/omp-blob-root.js +83 -64
  281. package/src/omp-blob-root.ts +116 -0
  282. package/src/omp-config-overlay.js +65 -38
  283. package/src/omp-config-overlay.ts +110 -0
  284. package/src/omp-execution-fingerprint.js +38 -43
  285. package/src/omp-execution-fingerprint.ts +92 -0
  286. package/src/omp-session-limits.js +10 -15
  287. package/src/omp-session-limits.ts +53 -0
  288. package/src/omp-session-partition.js +2 -2
  289. package/src/omp-session-verifier.js +1 -1
  290. package/src/orchestrator.js +32 -7
  291. package/src/pr-body-template.js +71 -0
  292. package/src/providers/anthropic/index.js +3 -1
  293. package/src/providers/anthropic/index.ts +13 -0
  294. package/src/providers/capabilities.js +19 -27
  295. package/src/providers/capabilities.ts +44 -0
  296. package/src/providers/google/index.js +3 -1
  297. package/src/providers/google/index.ts +13 -0
  298. package/src/providers/openai/index.js +3 -1
  299. package/src/providers/openai/index.ts +13 -0
  300. package/src/providers/opencode/index.js +3 -1
  301. package/src/providers/opencode/index.ts +13 -0
  302. package/src/quality-gates.js +67 -127
  303. package/src/quality-gates.ts +149 -0
  304. package/src/repo-settings-access.js +40 -0
  305. package/src/repo-settings-access.ts +64 -0
  306. package/src/schemas/sub-cluster.js +127 -183
  307. package/src/schemas/sub-cluster.ts +238 -0
  308. package/src/state-snapshot-normalization.js +224 -0
  309. package/src/state-snapshot-normalization.ts +222 -0
  310. package/src/state-snapshot.js +192 -359
  311. package/src/state-snapshot.ts +291 -0
  312. package/src/state-snapshotter.js +118 -130
  313. package/src/state-snapshotter.ts +167 -0
  314. package/src/sub-cluster-wrapper.js +4 -13
  315. package/src/task-run-model-args.js +87 -124
  316. package/src/task-run-model-args.ts +204 -0
  317. package/src/task-runner.js +5 -25
  318. package/src/task-runner.ts +28 -0
  319. package/src/task-startup-error.js +73 -58
  320. package/src/task-startup-error.ts +126 -0
  321. package/src/template-validation/consensus-gate-contracts.js +2 -0
  322. package/src/template-validation/consensus-gate-contracts.ts +70 -0
  323. package/src/template-validation/consensus-gate-scenarios.js +76 -0
  324. package/src/template-validation/consensus-gate-scenarios.ts +130 -0
  325. package/src/template-validation/consensus-gate-stage.js +34 -0
  326. package/src/template-validation/consensus-gate-stage.ts +56 -0
  327. package/src/template-validation/random-topology-contracts.js +2 -0
  328. package/src/template-validation/random-topology-contracts.ts +54 -0
  329. package/src/template-validation/random-topology-dispatch.js +25 -0
  330. package/src/template-validation/random-topology-dispatch.ts +33 -0
  331. package/src/template-validation/random-topology-message-loop.js +53 -0
  332. package/src/template-validation/random-topology-message-loop.ts +73 -0
  333. package/src/template-validation/random-topology-operations.js +79 -0
  334. package/src/template-validation/random-topology-operations.ts +101 -0
  335. package/src/template-validation/random-topology-runtime.js +25 -0
  336. package/src/template-validation/random-topology-runtime.ts +43 -0
  337. package/src/template-validation/random-topology-scenario.js +52 -0
  338. package/src/template-validation/random-topology-scenario.ts +57 -0
  339. package/src/template-validation/random-topology-schema.js +159 -0
  340. package/src/template-validation/random-topology-schema.ts +190 -0
  341. package/src/template-validation/random-topology-state.js +28 -0
  342. package/src/template-validation/random-topology-state.ts +30 -0
  343. package/src/template-validation/random-topology-trigger-evaluation.js +45 -0
  344. package/src/template-validation/random-topology-trigger-evaluation.ts +65 -0
  345. package/src/template-validation/random-topology-trigger.js +75 -0
  346. package/src/template-validation/random-topology-trigger.ts +88 -0
  347. package/src/template-validation/report-formatter.js +40 -46
  348. package/src/template-validation/report-formatter.ts +101 -0
  349. package/src/template-validation/simulate-consensus-gates.js +111 -302
  350. package/src/template-validation/simulate-consensus-gates.ts +196 -0
  351. package/src/template-validation/simulate-random-topology.js +26 -519
  352. package/src/template-validation/simulate-random-topology.ts +57 -0
  353. package/src/template-validation/simulate-two-stage-validation.js +41 -265
  354. package/src/template-validation/simulate-two-stage-validation.ts +55 -0
  355. package/src/template-validation/simulation-agent-runtime.js +25 -0
  356. package/src/template-validation/simulation-agent-runtime.ts +40 -0
  357. package/src/template-validation/simulation-agent.js +29 -0
  358. package/src/template-validation/simulation-agent.ts +73 -0
  359. package/src/template-validation/simulation-runtime.js +34 -0
  360. package/src/template-validation/simulation-runtime.ts +72 -0
  361. package/src/template-validation/two-stage-contracts.js +2 -0
  362. package/src/template-validation/two-stage-contracts.ts +41 -0
  363. package/src/template-validation/two-stage-inputs.js +21 -0
  364. package/src/template-validation/two-stage-inputs.ts +29 -0
  365. package/src/template-validation/two-stage-results.js +30 -0
  366. package/src/template-validation/two-stage-results.ts +40 -0
  367. package/src/template-validation/two-stage-scenario.js +86 -0
  368. package/src/template-validation/two-stage-scenario.ts +120 -0
  369. package/src/worktree-claude-config.js +182 -220
  370. package/src/worktree-claude-config.ts +272 -0
  371. package/src/worktree-tooling-env.js +103 -125
  372. package/src/worktree-tooling-env.ts +142 -0
  373. package/task-lib/completion.js +2 -3
  374. package/task-lib/completion.ts +9 -0
  375. package/task-lib/config.js +1 -4
  376. package/task-lib/config.ts +11 -0
  377. package/task-lib/name-generator.js +4 -226
  378. package/task-lib/name-generator.ts +11 -0
  379. package/task-lib/omp-session-cleanup.js +1 -1
  380. package/task-lib/omp-storage-root.js +8 -12
  381. package/task-lib/omp-storage-root.ts +62 -0
  382. package/task-lib/process-termination.js +143 -166
  383. 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
+ };