@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
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ function isObjectRecord(value) {
3
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
4
+ }
5
+ function isProvidersParserBoundary(value) {
6
+ return (value !== null &&
7
+ typeof value === 'object' &&
8
+ !Array.isArray(value) &&
9
+ 'parseProviderChunk' in value &&
10
+ typeof value.parseProviderChunk === 'function');
11
+ }
12
+ const rawProviders = require('../providers');
13
+ if (!isProvidersParserBoundary(rawProviders)) {
14
+ throw new TypeError('providers module must expose parseProviderChunk');
15
+ }
16
+ const { parseProviderChunk } = rawProviders;
17
+ function timestampBody(text) {
18
+ const match = /^\[(\d{13})\](.*)$/.exec(text);
19
+ return match ? (match[2] || '').trimStart() : null;
20
+ }
21
+ function prefixedJsonBody(text) {
22
+ if (text.startsWith('{') || text.startsWith('['))
23
+ return null;
24
+ const separatorIndex = text.indexOf('|');
25
+ if (separatorIndex < 1 || separatorIndex > 40)
26
+ return null;
27
+ const body = text.slice(separatorIndex + 1).trimStart();
28
+ return body.startsWith('{') || body.startsWith('[') ? body : null;
29
+ }
30
+ function stripTimestamp(line) {
31
+ if (!line || typeof line !== 'string')
32
+ return '';
33
+ const normalized = line.trim().replace(/\r$/, '');
34
+ if (!normalized)
35
+ return '';
36
+ const withoutTimestamp = timestampBody(normalized) ?? normalized;
37
+ return prefixedJsonBody(withoutTimestamp) ?? withoutTimestamp;
38
+ }
39
+ function parseJsonRecordLine(line) {
40
+ const content = stripTimestamp(line);
41
+ if (!content.startsWith('{'))
42
+ return null;
43
+ try {
44
+ const parsed = JSON.parse(content);
45
+ return isObjectRecord(parsed) ? parsed : null;
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ function extractFromResultWrapper(output) {
52
+ for (const line of output.split('\n')) {
53
+ const parsed = parseJsonRecordLine(line);
54
+ if (parsed === null)
55
+ continue;
56
+ const extracted = extractResultContent(parsed);
57
+ if (extracted)
58
+ return extracted;
59
+ }
60
+ return null;
61
+ }
62
+ function extractResultContent(value) {
63
+ if (!isObjectRecord(value) || value.type !== 'result')
64
+ return null;
65
+ const structuredOutput = value.structured_output;
66
+ if (structuredOutput && typeof structuredOutput === 'object')
67
+ return structuredOutput;
68
+ const result = value.result;
69
+ if (!result)
70
+ return null;
71
+ if (typeof result === 'object')
72
+ return result;
73
+ if (typeof result !== 'string')
74
+ return null;
75
+ return extractFromMarkdown(result) || extractDirectJson(result);
76
+ }
77
+ function normalizedProviderOutput(output) {
78
+ const normalized = [];
79
+ for (const line of output.split('\n')) {
80
+ const content = stripTimestamp(line);
81
+ if (content)
82
+ normalized.push(content);
83
+ }
84
+ return normalized.join('\n');
85
+ }
86
+ function providerEventText(event) {
87
+ if (!isObjectRecord(event) || event.type !== 'text' || typeof event.text !== 'string') {
88
+ return null;
89
+ }
90
+ return event.text;
91
+ }
92
+ function extractTextCandidate(text) {
93
+ return extractDirectJson(text) || extractFromMarkdown(text);
94
+ }
95
+ function collectProviderText(events) {
96
+ const textEvents = [];
97
+ for (const event of events) {
98
+ const text = providerEventText(event);
99
+ if (text !== null)
100
+ textEvents.push(text);
101
+ }
102
+ return textEvents;
103
+ }
104
+ function latestTextCandidate(textEvents) {
105
+ for (let index = textEvents.length - 1; index >= 0; index--) {
106
+ const text = textEvents[index];
107
+ if (text === undefined)
108
+ continue;
109
+ const extracted = extractTextCandidate(text);
110
+ if (extracted)
111
+ return extracted;
112
+ }
113
+ return null;
114
+ }
115
+ function extractFromTextEvents(output, providerName) {
116
+ const events = parseProviderChunk(providerName, normalizedProviderOutput(output));
117
+ const textEvents = collectProviderText(events);
118
+ const latest = latestTextCandidate(textEvents);
119
+ if (latest)
120
+ return latest;
121
+ const textContent = textEvents.join('');
122
+ if (!textContent.trim())
123
+ return null;
124
+ return extractTextCandidate(textContent) || latestTextCandidate(textEvents);
125
+ }
126
+ function extractModelTextFromOutput(output, providerName) {
127
+ if (!output || typeof output !== 'string')
128
+ return null;
129
+ const textEvents = [];
130
+ const events = parseProviderChunk(providerName, normalizedProviderOutput(output));
131
+ for (const event of events) {
132
+ const text = providerEventText(event);
133
+ if (text !== null)
134
+ textEvents.push(text);
135
+ }
136
+ const text = textEvents.join('');
137
+ return text.trim() ? text : null;
138
+ }
139
+ function extractFromMarkdown(text) {
140
+ if (!text || typeof text !== 'string')
141
+ return null;
142
+ const match = /```json\s*([\s\S]*?)```/.exec(text);
143
+ const encoded = match?.[1];
144
+ if (encoded === undefined)
145
+ return null;
146
+ try {
147
+ const parsed = JSON.parse(encoded.trim());
148
+ return parsed !== null && typeof parsed === 'object' ? parsed : null;
149
+ }
150
+ catch {
151
+ return null;
152
+ }
153
+ }
154
+ const CLI_METADATA_FIELDS = new Set([
155
+ 'duration_ms',
156
+ 'duration_api_ms',
157
+ 'total_cost_usd',
158
+ 'session_id',
159
+ 'num_turns',
160
+ 'permission_denials',
161
+ 'modelUsage',
162
+ ]);
163
+ function isCliMetadata(value) {
164
+ if (value.type === 'result')
165
+ return true;
166
+ let metadataFieldCount = 0;
167
+ for (const key of Object.keys(value)) {
168
+ if (CLI_METADATA_FIELDS.has(key))
169
+ metadataFieldCount++;
170
+ }
171
+ return metadataFieldCount >= 2;
172
+ }
173
+ function extractDirectJson(text) {
174
+ if (!text || typeof text !== 'string')
175
+ return null;
176
+ const trimmed = text.trim();
177
+ if (!trimmed)
178
+ return null;
179
+ try {
180
+ const parsed = JSON.parse(trimmed);
181
+ if (!isObjectRecord(parsed) || isCliMetadata(parsed))
182
+ return null;
183
+ return parsed;
184
+ }
185
+ catch {
186
+ return null;
187
+ }
188
+ }
189
+ function hasFatalStandaloneOutput(output) {
190
+ if (!output || typeof output !== 'string')
191
+ return false;
192
+ for (const line of output.split('\n')) {
193
+ const stripped = stripTimestamp(line).trim();
194
+ if (!stripped)
195
+ continue;
196
+ if (/^(task not found|process terminated)\b/i.test(stripped))
197
+ return true;
198
+ }
199
+ return false;
200
+ }
201
+ function extractJsonFromOutput(output, providerName = 'claude') {
202
+ if (!output || typeof output !== 'string')
203
+ return null;
204
+ const trimmedOutput = output.trim();
205
+ if (!trimmedOutput)
206
+ return null;
207
+ const fromWrapper = extractFromResultWrapper(trimmedOutput);
208
+ if (fromWrapper)
209
+ return fromWrapper;
210
+ const fromText = extractFromTextEvents(trimmedOutput, providerName);
211
+ if (fromText)
212
+ return fromText;
213
+ const fromMarkdown = extractFromMarkdown(trimmedOutput);
214
+ if (fromMarkdown)
215
+ return fromMarkdown;
216
+ const fromDirect = extractDirectJson(trimmedOutput);
217
+ if (fromDirect)
218
+ return fromDirect;
219
+ if (hasFatalStandaloneOutput(trimmedOutput))
220
+ return null;
221
+ return null;
222
+ }
223
+ module.exports = {
224
+ extractDirectJson,
225
+ extractFromMarkdown,
226
+ extractFromResultWrapper,
227
+ extractFromTextEvents,
228
+ extractJsonFromOutput,
229
+ extractModelTextFromOutput,
230
+ hasFatalStandaloneOutput,
231
+ isObjectRecord,
232
+ parseJsonRecordLine,
233
+ stripTimestamp,
234
+ };
@@ -0,0 +1,235 @@
1
+ import type { JsonRecord, ProvidersParserBoundary } from './output-extraction-types';
2
+
3
+ function isObjectRecord(value: unknown): value is JsonRecord {
4
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
5
+ }
6
+
7
+ function isProvidersParserBoundary(value: unknown): value is ProvidersParserBoundary {
8
+ return (
9
+ value !== null &&
10
+ typeof value === 'object' &&
11
+ !Array.isArray(value) &&
12
+ 'parseProviderChunk' in value &&
13
+ typeof value.parseProviderChunk === 'function'
14
+ );
15
+ }
16
+
17
+ const rawProviders: unknown = require('../providers');
18
+ if (!isProvidersParserBoundary(rawProviders)) {
19
+ throw new TypeError('providers module must expose parseProviderChunk');
20
+ }
21
+ const { parseProviderChunk } = rawProviders;
22
+
23
+ function timestampBody(text: string): string | null {
24
+ const match = /^\[(\d{13})\](.*)$/.exec(text);
25
+ return match ? (match[2] || '').trimStart() : null;
26
+ }
27
+
28
+ function prefixedJsonBody(text: string): string | null {
29
+ if (text.startsWith('{') || text.startsWith('[')) return null;
30
+ const separatorIndex = text.indexOf('|');
31
+ if (separatorIndex < 1 || separatorIndex > 40) return null;
32
+ const body = text.slice(separatorIndex + 1).trimStart();
33
+ return body.startsWith('{') || body.startsWith('[') ? body : null;
34
+ }
35
+
36
+ function stripTimestamp(line: unknown): string {
37
+ if (!line || typeof line !== 'string') return '';
38
+ const normalized = line.trim().replace(/\r$/, '');
39
+ if (!normalized) return '';
40
+
41
+ const withoutTimestamp = timestampBody(normalized) ?? normalized;
42
+ return prefixedJsonBody(withoutTimestamp) ?? withoutTimestamp;
43
+ }
44
+
45
+ function parseJsonRecordLine(line: string): JsonRecord | null {
46
+ const content = stripTimestamp(line);
47
+ if (!content.startsWith('{')) return null;
48
+ try {
49
+ const parsed: unknown = JSON.parse(content);
50
+ return isObjectRecord(parsed) ? parsed : null;
51
+ } catch {
52
+ return null;
53
+ }
54
+ }
55
+
56
+ function extractFromResultWrapper(output: string): object | null {
57
+ for (const line of output.split('\n')) {
58
+ const parsed = parseJsonRecordLine(line);
59
+ if (parsed === null) continue;
60
+ const extracted = extractResultContent(parsed);
61
+ if (extracted) return extracted;
62
+ }
63
+ return null;
64
+ }
65
+
66
+ function extractResultContent(value: unknown): object | null {
67
+ if (!isObjectRecord(value) || value.type !== 'result') return null;
68
+
69
+ const structuredOutput = value.structured_output;
70
+ if (structuredOutput && typeof structuredOutput === 'object') return structuredOutput;
71
+
72
+ const result = value.result;
73
+ if (!result) return null;
74
+ if (typeof result === 'object') return result;
75
+ if (typeof result !== 'string') return null;
76
+ return extractFromMarkdown(result) || extractDirectJson(result);
77
+ }
78
+
79
+ function normalizedProviderOutput(output: string): string {
80
+ const normalized: string[] = [];
81
+ for (const line of output.split('\n')) {
82
+ const content = stripTimestamp(line);
83
+ if (content) normalized.push(content);
84
+ }
85
+ return normalized.join('\n');
86
+ }
87
+
88
+ function providerEventText(event: unknown): string | null {
89
+ if (!isObjectRecord(event) || event.type !== 'text' || typeof event.text !== 'string') {
90
+ return null;
91
+ }
92
+ return event.text;
93
+ }
94
+
95
+ function extractTextCandidate(text: string): object | null {
96
+ return extractDirectJson(text) || extractFromMarkdown(text);
97
+ }
98
+
99
+ function collectProviderText(events: readonly unknown[]): string[] {
100
+ const textEvents: string[] = [];
101
+ for (const event of events) {
102
+ const text = providerEventText(event);
103
+ if (text !== null) textEvents.push(text);
104
+ }
105
+ return textEvents;
106
+ }
107
+
108
+ function latestTextCandidate(textEvents: readonly string[]): object | null {
109
+ for (let index = textEvents.length - 1; index >= 0; index--) {
110
+ const text = textEvents[index];
111
+ if (text === undefined) continue;
112
+ const extracted = extractTextCandidate(text);
113
+ if (extracted) return extracted;
114
+ }
115
+ return null;
116
+ }
117
+
118
+ function extractFromTextEvents(output: string, providerName: string): object | null {
119
+ const events = parseProviderChunk(providerName, normalizedProviderOutput(output));
120
+ const textEvents = collectProviderText(events);
121
+ const latest = latestTextCandidate(textEvents);
122
+ if (latest) return latest;
123
+
124
+ const textContent = textEvents.join('');
125
+ if (!textContent.trim()) return null;
126
+
127
+ return extractTextCandidate(textContent) || latestTextCandidate(textEvents);
128
+ }
129
+
130
+ function extractModelTextFromOutput(output: unknown, providerName: string): string | null {
131
+ if (!output || typeof output !== 'string') return null;
132
+ const textEvents: string[] = [];
133
+ const events = parseProviderChunk(providerName, normalizedProviderOutput(output));
134
+ for (const event of events) {
135
+ const text = providerEventText(event);
136
+ if (text !== null) textEvents.push(text);
137
+ }
138
+ const text = textEvents.join('');
139
+ return text.trim() ? text : null;
140
+ }
141
+
142
+ function extractFromMarkdown(text: unknown): object | null {
143
+ if (!text || typeof text !== 'string') return null;
144
+
145
+ const match = /```json\s*([\s\S]*?)```/.exec(text);
146
+ const encoded = match?.[1];
147
+ if (encoded === undefined) return null;
148
+
149
+ try {
150
+ const parsed: unknown = JSON.parse(encoded.trim());
151
+ return parsed !== null && typeof parsed === 'object' ? parsed : null;
152
+ } catch {
153
+ return null;
154
+ }
155
+ }
156
+
157
+ const CLI_METADATA_FIELDS: ReadonlySet<string> = new Set([
158
+ 'duration_ms',
159
+ 'duration_api_ms',
160
+ 'total_cost_usd',
161
+ 'session_id',
162
+ 'num_turns',
163
+ 'permission_denials',
164
+ 'modelUsage',
165
+ ]);
166
+
167
+ function isCliMetadata(value: JsonRecord): boolean {
168
+ if (value.type === 'result') return true;
169
+
170
+ let metadataFieldCount = 0;
171
+ for (const key of Object.keys(value)) {
172
+ if (CLI_METADATA_FIELDS.has(key)) metadataFieldCount++;
173
+ }
174
+ return metadataFieldCount >= 2;
175
+ }
176
+
177
+ function extractDirectJson(text: unknown): JsonRecord | null {
178
+ if (!text || typeof text !== 'string') return null;
179
+
180
+ const trimmed = text.trim();
181
+ if (!trimmed) return null;
182
+
183
+ try {
184
+ const parsed: unknown = JSON.parse(trimmed);
185
+ if (!isObjectRecord(parsed) || isCliMetadata(parsed)) return null;
186
+ return parsed;
187
+ } catch {
188
+ return null;
189
+ }
190
+ }
191
+
192
+ function hasFatalStandaloneOutput(output: unknown): boolean {
193
+ if (!output || typeof output !== 'string') return false;
194
+ for (const line of output.split('\n')) {
195
+ const stripped = stripTimestamp(line).trim();
196
+ if (!stripped) continue;
197
+ if (/^(task not found|process terminated)\b/i.test(stripped)) return true;
198
+ }
199
+ return false;
200
+ }
201
+
202
+ function extractJsonFromOutput(output: unknown, providerName = 'claude'): object | null {
203
+ if (!output || typeof output !== 'string') return null;
204
+
205
+ const trimmedOutput = output.trim();
206
+ if (!trimmedOutput) return null;
207
+
208
+ const fromWrapper = extractFromResultWrapper(trimmedOutput);
209
+ if (fromWrapper) return fromWrapper;
210
+
211
+ const fromText = extractFromTextEvents(trimmedOutput, providerName);
212
+ if (fromText) return fromText;
213
+
214
+ const fromMarkdown = extractFromMarkdown(trimmedOutput);
215
+ if (fromMarkdown) return fromMarkdown;
216
+
217
+ const fromDirect = extractDirectJson(trimmedOutput);
218
+ if (fromDirect) return fromDirect;
219
+
220
+ if (hasFatalStandaloneOutput(trimmedOutput)) return null;
221
+ return null;
222
+ }
223
+
224
+ export = {
225
+ extractDirectJson,
226
+ extractFromMarkdown,
227
+ extractFromResultWrapper,
228
+ extractFromTextEvents,
229
+ extractJsonFromOutput,
230
+ extractModelTextFromOutput,
231
+ hasFatalStandaloneOutput,
232
+ isObjectRecord,
233
+ parseJsonRecordLine,
234
+ stripTimestamp,
235
+ };
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ const errorDetail = require("./output-extraction-error-detail");
3
+ const jsonExtraction = require("./output-extraction-json");
4
+ const { cliErrorDetail } = errorDetail;
5
+ const { isObjectRecord, stripTimestamp } = jsonExtraction;
6
+ const PI_STOP_REASONS = new Set([
7
+ 'stop',
8
+ 'length',
9
+ 'toolUse',
10
+ 'error',
11
+ 'aborted',
12
+ 'deferred',
13
+ ]);
14
+ const PI_USAGE_FIELDS = ['input', 'output', 'cacheRead', 'cacheWrite', 'totalTokens'];
15
+ const PI_COST_FIELDS = ['input', 'output', 'cacheRead', 'cacheWrite', 'total'];
16
+ function piProtocolFailure(message) {
17
+ return { ...cliErrorDetail(message, message), provider: 'pi' };
18
+ }
19
+ function parsePiProtocolObject(content) {
20
+ if (!content.startsWith('{'))
21
+ return null;
22
+ try {
23
+ const parsed = JSON.parse(content);
24
+ return isObjectRecord(parsed) ? parsed : null;
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ function hasPiNumericFields(value, fields) {
31
+ return isObjectRecord(value) && fields.every((field) => typeof value[field] === 'number');
32
+ }
33
+ function isValidPiUsage(usage) {
34
+ if (!hasPiNumericFields(usage, PI_USAGE_FIELDS))
35
+ return false;
36
+ if (!hasPiNumericFields(usage.cost, PI_COST_FIELDS))
37
+ return false;
38
+ return ((usage.cacheWrite1h === undefined || typeof usage.cacheWrite1h === 'number') &&
39
+ (usage.reasoning === undefined || typeof usage.reasoning === 'number'));
40
+ }
41
+ function isValidPiAssistantMessage(message) {
42
+ return (isObjectRecord(message) &&
43
+ message.role === 'assistant' &&
44
+ Array.isArray(message.content) &&
45
+ isValidPiUsage(message.usage) &&
46
+ typeof message.stopReason === 'string' &&
47
+ PI_STOP_REASONS.has(message.stopReason));
48
+ }
49
+ function piMessageRole(message) {
50
+ if (!isObjectRecord(message))
51
+ return null;
52
+ return typeof message.role === 'string' ? message.role : null;
53
+ }
54
+ function piFailureFromMessage(message) {
55
+ const stopReason = message.stopReason;
56
+ const errorMessage = message.errorMessage;
57
+ if (stopReason === 'deferred') {
58
+ return {
59
+ ...cliErrorDetail('Pi turn deferred without completing.', 'Pi turn deferred'),
60
+ provider: 'pi',
61
+ };
62
+ }
63
+ if (stopReason !== 'error' && stopReason !== 'aborted' && !errorMessage)
64
+ return null;
65
+ return {
66
+ ...cliErrorDetail(errorMessage || stopReason, 'Pi turn failed'),
67
+ provider: 'pi',
68
+ };
69
+ }
70
+ function isIgnoredPiLine(content) {
71
+ return (content.startsWith('[ZEROSHOT] Earlier provider output omitted') ||
72
+ content.startsWith('[ZEROSHOT] Provider output record retained') ||
73
+ content.startsWith('[ZEROSHOT][PROVIDER_STDERR] '));
74
+ }
75
+ function applyPiMessageEnd(message, state) {
76
+ const role = piMessageRole(message);
77
+ if (role === null)
78
+ return piProtocolFailure('Pi message_end did not contain a valid message.');
79
+ if (role !== 'assistant')
80
+ return null;
81
+ if (!isValidPiAssistantMessage(message)) {
82
+ return piProtocolFailure('Pi message_end did not contain a valid assistant message.');
83
+ }
84
+ state.latestAssistant = message;
85
+ return null;
86
+ }
87
+ function applyPiEvent(parsed, state) {
88
+ if (typeof parsed.type !== 'string') {
89
+ return piProtocolFailure('Pi JSON stream contained an event without a valid type.');
90
+ }
91
+ if (parsed.type === 'message_end')
92
+ return applyPiMessageEnd(parsed.message, state);
93
+ if (parsed.type === 'agent_settled')
94
+ state.settled = true;
95
+ return null;
96
+ }
97
+ function applyPiProtocolLine(content, state) {
98
+ if (!content || isIgnoredPiLine(content))
99
+ return null;
100
+ if (state.settled)
101
+ return piProtocolFailure('Pi emitted output after agent_settled.');
102
+ const parsed = parsePiProtocolObject(content);
103
+ if (parsed === null)
104
+ return piProtocolFailure('Pi JSON stream contained malformed output.');
105
+ return applyPiEvent(parsed, state);
106
+ }
107
+ function extractSettledPiFailure(lines) {
108
+ const state = { latestAssistant: null, settled: false };
109
+ for (const line of lines) {
110
+ const content = stripTimestamp(line);
111
+ const failure = applyPiProtocolLine(content, state);
112
+ if (failure)
113
+ return failure;
114
+ }
115
+ if (!state.settled)
116
+ return piProtocolFailure('Pi JSON stream ended before agent_settled.');
117
+ if (state.latestAssistant === null) {
118
+ return piProtocolFailure('Pi settled without a valid assistant message_end.');
119
+ }
120
+ return piFailureFromMessage(state.latestAssistant);
121
+ }
122
+ module.exports = {
123
+ extractSettledPiFailure,
124
+ };