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