@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,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 };