@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,11 +1,10 @@
1
- // @ts-nocheck
2
-
3
- const { parseProviderEvent, providerFailureFields } = require('./provider-control-plane');
4
-
1
+ "use strict";
2
+ const providerControlPlane = require("./provider-control-plane");
3
+ const { parseProviderEvent, providerFailureFields } = providerControlPlane;
5
4
  const ZEROSHOT_PI_METADATA_PREFIXES = [
6
- '[ZEROSHOT] Earlier provider output omitted',
7
- '[ZEROSHOT][PROVIDER_STDERR] ',
8
- '[ZEROSHOT][FATAL] ',
5
+ '[ZEROSHOT] Earlier provider output omitted',
6
+ '[ZEROSHOT][PROVIDER_STDERR] ',
7
+ '[ZEROSHOT][FATAL] ',
9
8
  ];
10
9
  const ZEROSHOT_RETAINED_RECORD_PREFIX = '[ZEROSHOT] Provider output record retained';
11
10
  const PI_STOP_REASONS = new Set(['stop', 'length', 'toolUse', 'error', 'aborted', 'deferred']);
@@ -14,229 +13,210 @@ const PI_OPTIONAL_TOKEN_FIELDS = ['cacheWrite1h', 'reasoning'];
14
13
  const PI_TOKEN_FIELDS = [...PI_REQUIRED_TOKEN_FIELDS, ...PI_OPTIONAL_TOKEN_FIELDS];
15
14
  const PI_COST_FIELDS = ['input', 'output', 'cacheRead', 'cacheWrite', 'total'];
16
15
  const PI_PENDING_EVENT_TYPES = new Set([
17
- 'turn_end',
18
- 'agent_end',
19
- 'auto_retry_start',
20
- 'auto_retry_end',
16
+ 'turn_end',
17
+ 'agent_end',
18
+ 'auto_retry_start',
19
+ 'auto_retry_end',
21
20
  ]);
22
-
21
+ function isRecord(value) {
22
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
23
+ }
23
24
  function pendingFailureMetadata(failure) {
24
- return {
25
- zeroshot_pending_failure: {
26
- provider: failure.provider,
27
- category: failure.category,
28
- kind: failure.classification.kind,
29
- retryable: failure.classification.retryable,
30
- diagnostic: failure.diagnostic,
31
- },
32
- };
33
- }
34
-
25
+ return {
26
+ zeroshot_pending_failure: {
27
+ provider: failure.provider,
28
+ category: failure.category,
29
+ kind: failure.classification.kind,
30
+ retryable: failure.classification.retryable,
31
+ diagnostic: failure.diagnostic,
32
+ },
33
+ };
34
+ }
35
35
  function numericFields(fields, source) {
36
- return Object.fromEntries(
37
- fields.map((field) => [field, typeof source[field] === 'number' ? source[field] : 0])
38
- );
36
+ return Object.fromEntries(fields.map((field) => [field, typeof source[field] === 'number' ? source[field] : 0]));
39
37
  }
40
-
41
38
  function redactedUsage(usage) {
42
- const value = usage && typeof usage === 'object' && !Array.isArray(usage) ? usage : {};
43
- return {
44
- ...numericFields(PI_REQUIRED_TOKEN_FIELDS, value),
45
- ...(typeof value.cacheWrite1h === 'number' ? { cacheWrite1h: value.cacheWrite1h } : {}),
46
- ...(typeof value.reasoning === 'number' ? { reasoning: value.reasoning } : {}),
47
- cost: numericFields(PI_COST_FIELDS, isRecord(value.cost) ? value.cost : {}),
48
- };
49
- }
50
-
51
- function isRecord(value) {
52
- return value !== null && typeof value === 'object' && !Array.isArray(value);
39
+ const value = isRecord(usage) ? usage : {};
40
+ return {
41
+ ...numericFields(PI_REQUIRED_TOKEN_FIELDS, value),
42
+ ...(typeof value.cacheWrite1h === 'number' ? { cacheWrite1h: value.cacheWrite1h } : {}),
43
+ ...(typeof value.reasoning === 'number' ? { reasoning: value.reasoning } : {}),
44
+ cost: numericFields(PI_COST_FIELDS, isRecord(value.cost) ? value.cost : {}),
45
+ };
53
46
  }
54
-
55
47
  function hasNumericFields(value, fields) {
56
- return isRecord(value) && fields.every((field) => typeof value[field] === 'number');
48
+ return isRecord(value) && fields.every((field) => typeof value[field] === 'number');
57
49
  }
58
-
59
50
  function addNumericFields(target, source, fields) {
60
- for (const field of fields) {
61
- if (typeof source[field] === 'number') target[field] = (target[field] || 0) + source[field];
62
- }
51
+ for (const field of fields) {
52
+ if (typeof source[field] === 'number')
53
+ target[field] = (target[field] || 0) + source[field];
54
+ }
63
55
  }
64
-
65
56
  function rememberTokenUsage(state, usage) {
66
- if (!hasNumericFields(usage, PI_REQUIRED_TOKEN_FIELDS)) return false;
67
- if (!hasNumericFields(usage.cost, PI_COST_FIELDS)) return false;
68
- if (
69
- !PI_OPTIONAL_TOKEN_FIELDS.every(
70
- (field) => usage[field] === undefined || typeof usage[field] === 'number'
71
- )
72
- ) {
73
- return false;
74
- }
75
- state.piUsage = state.piUsage || { tokens: {}, cost: {} };
76
- addNumericFields(state.piUsage.tokens, usage, PI_TOKEN_FIELDS);
77
- addNumericFields(state.piUsage.cost, usage.cost, PI_COST_FIELDS);
78
- return true;
79
- }
80
-
57
+ if (!hasNumericFields(usage, PI_REQUIRED_TOKEN_FIELDS))
58
+ return false;
59
+ if (!hasNumericFields(usage.cost, PI_COST_FIELDS))
60
+ return false;
61
+ if (!PI_OPTIONAL_TOKEN_FIELDS.every((field) => usage[field] === undefined || typeof usage[field] === 'number')) {
62
+ return false;
63
+ }
64
+ state.piUsage = state.piUsage || { tokens: {}, cost: {} };
65
+ addNumericFields(state.piUsage.tokens, usage, PI_TOKEN_FIELDS);
66
+ addNumericFields(state.piUsage.cost, usage.cost, PI_COST_FIELDS);
67
+ return true;
68
+ }
81
69
  function getPiTokenUsage(state) {
82
- if (!state?.piUsage) return null;
83
- const { tokens, cost } = state.piUsage;
84
- return {
85
- inputTokens: tokens.input || 0,
86
- outputTokens: tokens.output || 0,
87
- cacheReadInputTokens: tokens.cacheRead || 0,
88
- cacheCreationInputTokens: tokens.cacheWrite || 0,
89
- totalCostUsd: cost.total || 0,
90
- durationMs: null,
91
- modelUsage: { ...tokens, cost: { ...cost } },
92
- };
93
- }
94
-
70
+ if (!state?.piUsage)
71
+ return null;
72
+ const { tokens, cost } = state.piUsage;
73
+ return {
74
+ inputTokens: tokens.input || 0,
75
+ outputTokens: tokens.output || 0,
76
+ cacheReadInputTokens: tokens.cacheRead || 0,
77
+ cacheCreationInputTokens: tokens.cacheWrite || 0,
78
+ totalCostUsd: cost.total || 0,
79
+ durationMs: null,
80
+ modelUsage: { ...tokens, cost: { ...cost } },
81
+ };
82
+ }
83
+ function hasValidMessageUsage(state, role, message) {
84
+ const hasCountedUsage = role === 'assistant' || message.usage !== undefined;
85
+ return (!(['assistant', 'toolResult'].includes(role) && hasCountedUsage) ||
86
+ rememberTokenUsage(state, message.usage));
87
+ }
95
88
  function isValidAssistantMessage(message) {
96
- return Array.isArray(message?.content) && PI_STOP_REASONS.has(message.stopReason);
89
+ return (isRecord(message) &&
90
+ Array.isArray(message.content) &&
91
+ typeof message.stopReason === 'string' &&
92
+ PI_STOP_REASONS.has(message.stopReason));
97
93
  }
98
-
99
94
  function redactPendingFailure(failure, parsed) {
100
- const pending = pendingFailureMetadata(failure);
101
- if (parsed.type === 'agent_end') {
102
- return JSON.stringify({
103
- type: parsed.type,
104
- messages: [],
105
- willRetry: parsed.willRetry === true,
106
- ...pending,
107
- });
108
- }
109
- if (parsed.type === 'auto_retry_end') {
110
- return JSON.stringify({ type: parsed.type, success: false, ...pending });
111
- }
112
- if (parsed.type === 'auto_retry_start') {
95
+ const pending = pendingFailureMetadata(failure);
96
+ if (parsed.type === 'agent_end') {
97
+ return JSON.stringify({
98
+ type: parsed.type,
99
+ messages: [],
100
+ willRetry: parsed.willRetry === true,
101
+ ...pending,
102
+ });
103
+ }
104
+ if (parsed.type === 'auto_retry_end') {
105
+ return JSON.stringify({ type: parsed.type, success: false, ...pending });
106
+ }
107
+ if (parsed.type === 'auto_retry_start') {
108
+ return JSON.stringify({
109
+ type: parsed.type,
110
+ ...numericFields(['attempt', 'maxAttempts', 'delayMs'].filter((field) => typeof parsed[field] === 'number'), parsed),
111
+ ...pending,
112
+ });
113
+ }
114
+ const message = isRecord(parsed.message) ? parsed.message : {};
113
115
  return JSON.stringify({
114
- type: parsed.type,
115
- ...numericFields(
116
- ['attempt', 'maxAttempts', 'delayMs'].filter((field) => typeof parsed[field] === 'number'),
117
- parsed
118
- ),
119
- ...pending,
116
+ type: parsed.type,
117
+ message: {
118
+ role: 'assistant',
119
+ content: [],
120
+ usage: redactedUsage(message.usage),
121
+ stopReason: 'error',
122
+ errorMessage: 'Pi provider turn failed; awaiting agent settlement.',
123
+ },
124
+ ...(parsed.type === 'turn_end' ? { toolResults: [] } : {}),
125
+ ...pending,
120
126
  });
121
- }
122
- return JSON.stringify({
123
- type: parsed.type,
124
- message: {
125
- role: 'assistant',
126
- content: [],
127
- usage: redactedUsage(parsed.message?.usage),
128
- stopReason: 'error',
129
- errorMessage: 'Pi provider turn failed; awaiting agent settlement.',
130
- },
131
- ...(parsed.type === 'turn_end' ? { toolResults: [] } : {}),
132
- ...pending,
133
- });
134
- }
135
-
127
+ }
136
128
  function finalFailureEnvelope(failure) {
137
- return JSON.stringify({
138
- type: 'agent_settled',
139
- ...providerFailureFields(failure),
140
- });
129
+ return JSON.stringify({ type: 'agent_settled', ...providerFailureFields(failure) });
141
130
  }
142
-
143
131
  function rememberProtocolFailure(state, content, extractProviderFailure) {
144
- const failure = extractProviderFailure(content, 'pi');
145
- if (failure) {
146
- state.piProtocolFailure = failure;
147
- state.providerFailure = failure;
148
- }
149
- return failure;
150
- }
151
-
132
+ const failure = extractProviderFailure(content, 'pi');
133
+ if (failure) {
134
+ state.piProtocolFailure = failure;
135
+ state.providerFailure = failure;
136
+ }
137
+ return failure;
138
+ }
152
139
  function failProtocolLine(state, content, extractProviderFailure) {
153
- const failure = rememberProtocolFailure(state, content, extractProviderFailure);
154
- return failure ? finalFailureEnvelope(failure) : content;
140
+ const failure = rememberProtocolFailure(state, content, extractProviderFailure);
141
+ return failure ? finalFailureEnvelope(failure) : content;
155
142
  }
156
-
157
143
  function handleMessageEnd(state, content, parsed, extractProviderFailure) {
158
- const role = parsed.message?.role;
159
- if (typeof role !== 'string') return failProtocolLine(state, content, extractProviderFailure);
160
- const hasCountedUsage = role === 'assistant' || parsed.message?.usage !== undefined;
161
- if (
162
- ['assistant', 'toolResult'].includes(role) &&
163
- hasCountedUsage &&
164
- !rememberTokenUsage(state, parsed.message?.usage)
165
- ) {
166
- return failProtocolLine(state, 'invalid Pi usage', extractProviderFailure);
167
- }
168
- if (role !== 'assistant') return content;
169
- if (!isValidAssistantMessage(parsed.message)) {
170
- return failProtocolLine(state, content, extractProviderFailure);
171
- }
172
- const failure = extractProviderFailure(
173
- `${content}\n${JSON.stringify({ type: 'agent_settled' })}`,
174
- 'pi'
175
- );
176
- state.piLatestAssistantObserved = true;
177
- state.pendingPiFailure = failure;
178
- if (failure) return redactPendingFailure(failure, parsed);
179
- if (!state.piProtocolFailure) state.providerFailure = null;
180
- return content;
181
- }
182
-
144
+ const message = isRecord(parsed.message) ? parsed.message : null;
145
+ const role = message?.role;
146
+ if (typeof role !== 'string')
147
+ return failProtocolLine(state, content, extractProviderFailure);
148
+ if (!hasValidMessageUsage(state, role, message ?? {})) {
149
+ return failProtocolLine(state, 'invalid Pi usage', extractProviderFailure);
150
+ }
151
+ if (role !== 'assistant')
152
+ return content;
153
+ if (!isValidAssistantMessage(message)) {
154
+ return failProtocolLine(state, content, extractProviderFailure);
155
+ }
156
+ const failure = extractProviderFailure(`${content}\n${JSON.stringify({ type: 'agent_settled' })}`, 'pi');
157
+ state.piLatestAssistantObserved = true;
158
+ state.pendingPiFailure = failure;
159
+ if (failure)
160
+ return redactPendingFailure(failure, parsed);
161
+ if (!state.piProtocolFailure)
162
+ state.providerFailure = null;
163
+ return content;
164
+ }
183
165
  function usageForEvent(parsed) {
184
- if (parsed.type === 'compaction_end' && parsed.result?.usage !== undefined) {
185
- return parsed.result.usage;
186
- }
187
- if (
188
- parsed.type === 'entry_appended' &&
189
- parsed.entry?.type === 'branch_summary' &&
190
- parsed.entry.usage !== undefined
191
- ) {
192
- return parsed.entry.usage;
193
- }
194
- return undefined;
195
- }
196
-
166
+ const result = isRecord(parsed.result) ? parsed.result : null;
167
+ if (parsed.type === 'compaction_end' && result?.usage !== undefined)
168
+ return result.usage;
169
+ const entry = isRecord(parsed.entry) ? parsed.entry : null;
170
+ if (parsed.type === 'entry_appended' &&
171
+ entry?.type === 'branch_summary' &&
172
+ entry.usage !== undefined) {
173
+ return entry.usage;
174
+ }
175
+ return undefined;
176
+ }
197
177
  function handleSettlement(state, content, extractProviderFailure) {
198
- state.piProtocolSettled = true;
199
- const missingAssistantFailure = state.piLatestAssistantObserved
200
- ? null
201
- : extractProviderFailure(JSON.stringify({ type: 'agent_settled' }), 'pi');
202
- const failure = state.piProtocolFailure || state.pendingPiFailure || missingAssistantFailure;
203
- state.pendingPiFailure = null;
204
- state.providerFailure = failure || null;
205
- return failure ? finalFailureEnvelope(failure) : content;
206
- }
207
-
178
+ state.piProtocolSettled = true;
179
+ const missingAssistantFailure = state.piLatestAssistantObserved
180
+ ? null
181
+ : extractProviderFailure(JSON.stringify({ type: 'agent_settled' }), 'pi');
182
+ const failure = state.piProtocolFailure || state.pendingPiFailure || missingAssistantFailure;
183
+ state.pendingPiFailure = null;
184
+ state.providerFailure = failure || null;
185
+ return failure ? finalFailureEnvelope(failure) : content;
186
+ }
187
+ function handleProtocolEvent(state, content, parsed, extractProviderFailure) {
188
+ const eventType = parsed.type;
189
+ if (typeof eventType !== 'string')
190
+ return content;
191
+ if (eventType === 'message_end') {
192
+ return handleMessageEnd(state, content, parsed, extractProviderFailure);
193
+ }
194
+ const usage = usageForEvent(parsed);
195
+ if (usage !== undefined && !rememberTokenUsage(state, usage)) {
196
+ return failProtocolLine(state, 'invalid Pi usage', extractProviderFailure);
197
+ }
198
+ if (state.pendingPiFailure && PI_PENDING_EVENT_TYPES.has(eventType)) {
199
+ return redactPendingFailure(state.pendingPiFailure, parsed);
200
+ }
201
+ return eventType === 'agent_settled'
202
+ ? handleSettlement(state, content, extractProviderFailure)
203
+ : content;
204
+ }
208
205
  function redactPiFailureForControlPlane(state, content, extractProviderFailure) {
209
- if (content.startsWith(ZEROSHOT_RETAINED_RECORD_PREFIX)) {
210
- state.piProtocolPrefixOmitted = true;
211
- return content;
212
- }
213
- if (ZEROSHOT_PI_METADATA_PREFIXES.some((prefix) => content.startsWith(prefix))) return content;
214
- const parsed = parseProviderEvent(content);
215
- if (parsed === null || typeof parsed.type !== 'string') {
216
- return failProtocolLine(state, content, extractProviderFailure);
217
- }
218
- if (state.piProtocolSettled) {
219
- return failProtocolLine(
220
- state,
221
- `${JSON.stringify({ type: 'agent_settled' })}\n${content}`,
222
- extractProviderFailure
223
- );
224
- }
225
- state.piProtocolObserved = true;
226
-
227
- if (parsed.type === 'message_end') {
228
- return handleMessageEnd(state, content, parsed, extractProviderFailure);
229
- }
230
- const usage = usageForEvent(parsed);
231
- if (usage !== undefined && !rememberTokenUsage(state, usage)) {
232
- return failProtocolLine(state, 'invalid Pi usage', extractProviderFailure);
233
- }
234
- if (state.pendingPiFailure && PI_PENDING_EVENT_TYPES.has(parsed.type)) {
235
- return redactPendingFailure(state.pendingPiFailure, parsed);
236
- }
237
- return parsed.type === 'agent_settled'
238
- ? handleSettlement(state, content, extractProviderFailure)
239
- : content;
240
- }
241
-
206
+ if (content.startsWith(ZEROSHOT_RETAINED_RECORD_PREFIX)) {
207
+ state.piProtocolPrefixOmitted = true;
208
+ return content;
209
+ }
210
+ if (ZEROSHOT_PI_METADATA_PREFIXES.some((prefix) => content.startsWith(prefix)))
211
+ return content;
212
+ const parsed = parseProviderEvent(content);
213
+ if (parsed === null || typeof parsed.type !== 'string') {
214
+ return failProtocolLine(state, content, extractProviderFailure);
215
+ }
216
+ if (state.piProtocolSettled) {
217
+ return failProtocolLine(state, `${JSON.stringify({ type: 'agent_settled' })}\n${content}`, extractProviderFailure);
218
+ }
219
+ state.piProtocolObserved = true;
220
+ return handleProtocolEvent(state, content, parsed, extractProviderFailure);
221
+ }
242
222
  module.exports = { getPiTokenUsage, redactPiFailureForControlPlane };