@the-open-engine/zeroshot 6.38.1 → 6.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/cli/event-copy.js +8 -7
  2. package/cli/event-copy.ts +12 -0
  3. package/cli/index.js +7 -31
  4. package/cli/json-export.js +61 -64
  5. package/cli/json-export.ts +112 -0
  6. package/cli/message-formatter-utils.js +68 -56
  7. package/cli/message-formatter-utils.ts +121 -0
  8. package/cli/message-formatters-normal.js +124 -259
  9. package/cli/message-formatters-normal.ts +250 -0
  10. package/cli/message-formatters-watch.js +81 -84
  11. package/cli/message-formatters-watch.ts +189 -0
  12. package/lib/cluster/generated/protocol-schema.cjs +1 -1
  13. package/lib/cluster/generated/protocol-schema.mjs +1 -1
  14. package/lib/cluster/generated/protocol.d.cts +8 -0
  15. package/lib/cluster/generated/protocol.d.mts +8 -0
  16. package/lib/cluster/generated/protocol.d.ts +8 -0
  17. package/lib/clusters-registry.d.ts +23 -0
  18. package/lib/clusters-registry.js +17 -29
  19. package/lib/completion.d.ts +12 -0
  20. package/lib/completion.js +84 -94
  21. package/lib/compose-utils.d.ts +32 -0
  22. package/lib/compose-utils.js +57 -72
  23. package/lib/detached-startup.d.ts +83 -0
  24. package/lib/detached-startup.js +231 -302
  25. package/lib/docker-config.d.ts +43 -0
  26. package/lib/docker-config.js +150 -325
  27. package/lib/docker-env-auth.d.ts +17 -0
  28. package/lib/docker-env-auth.js +75 -0
  29. package/lib/git-remote-utils.d.ts +48 -0
  30. package/lib/git-remote-utils.js +147 -213
  31. package/lib/id-detector.d.ts +15 -0
  32. package/lib/id-detector.js +37 -41
  33. package/lib/path-check.d.ts +30 -0
  34. package/lib/path-check.js +42 -45
  35. package/lib/process-liveness.d.ts +16 -0
  36. package/lib/process-liveness.js +19 -12
  37. package/lib/provider-credential-path.d.ts +16 -0
  38. package/lib/provider-credential-path.js +31 -29
  39. package/lib/provider-defaults.d.ts +30 -0
  40. package/lib/provider-defaults.js +47 -42
  41. package/lib/provider-detection.d.ts +11 -0
  42. package/lib/provider-detection.js +91 -54
  43. package/lib/provider-names.d.ts +38 -0
  44. package/lib/provider-names.js +56 -64
  45. package/lib/repo-settings.d.ts +28 -0
  46. package/lib/repo-settings.js +83 -59
  47. package/lib/run-mode.d.ts +21 -0
  48. package/lib/run-mode.js +21 -20
  49. package/lib/run-plan.d.ts +28 -0
  50. package/lib/run-plan.js +17 -16
  51. package/lib/settings/claude-auth.d.ts +35 -0
  52. package/lib/settings/claude-auth.js +30 -47
  53. package/lib/settings-defaults.d.ts +20 -0
  54. package/lib/settings-defaults.js +149 -0
  55. package/lib/settings-error.d.ts +7 -0
  56. package/lib/settings-error.js +8 -0
  57. package/lib/settings-issue-providers.d.ts +10 -0
  58. package/lib/settings-issue-providers.js +12 -0
  59. package/lib/settings-models.d.ts +22 -0
  60. package/lib/settings-models.js +93 -0
  61. package/lib/settings-storage.d.ts +23 -0
  62. package/lib/settings-storage.js +205 -0
  63. package/lib/settings-validation.d.ts +7 -0
  64. package/lib/settings-validation.js +182 -0
  65. package/lib/settings.d.ts +29 -0
  66. package/lib/settings.js +41 -736
  67. package/lib/setup-apply-types.d.ts +66 -0
  68. package/lib/setup-apply-types.js +2 -0
  69. package/lib/setup-apply.d.ts +39 -0
  70. package/lib/setup-apply.js +267 -264
  71. package/lib/setup-journal.d.ts +41 -0
  72. package/lib/setup-journal.js +119 -76
  73. package/lib/setup-plan-types.d.ts +102 -0
  74. package/lib/setup-plan-types.js +2 -0
  75. package/lib/setup-plan.d.ts +30 -0
  76. package/lib/setup-plan.js +300 -324
  77. package/lib/setup-undo.d.ts +44 -0
  78. package/lib/setup-undo.js +61 -74
  79. package/lib/start-cluster-config.d.ts +26 -0
  80. package/lib/start-cluster-config.js +56 -0
  81. package/lib/start-cluster-environment.d.ts +40 -0
  82. package/lib/start-cluster-environment.js +134 -0
  83. package/lib/start-cluster-run-options.d.ts +53 -0
  84. package/lib/start-cluster-run-options.js +147 -0
  85. package/lib/start-cluster.d.ts +64 -0
  86. package/lib/start-cluster.js +98 -454
  87. package/lib/stream-json-parser.d.ts +17 -0
  88. package/lib/stream-json-parser.js +51 -52
  89. package/npm-shrinkwrap.json +2 -2
  90. package/package.json +12 -6
  91. package/scripts/postinstall.js +27 -0
  92. package/scripts/rust-distribution.js +23 -14
  93. package/src/agent/agent-command-proofs-context.js +35 -45
  94. package/src/agent/agent-command-proofs-context.ts +87 -0
  95. package/src/agent/agent-config-settings.js +19 -0
  96. package/src/agent/agent-config-settings.ts +41 -0
  97. package/src/agent/agent-config.js +122 -231
  98. package/src/agent/agent-config.ts +285 -0
  99. package/src/agent/agent-context-builder.js +38 -273
  100. package/src/agent/agent-context-builder.ts +51 -0
  101. package/src/agent/agent-context-environment-sections.js +105 -0
  102. package/src/agent/agent-context-environment-sections.ts +134 -0
  103. package/src/agent/agent-context-packs.js +165 -0
  104. package/src/agent/agent-context-packs.ts +296 -0
  105. package/src/agent/agent-context-prompt-sections.js +100 -0
  106. package/src/agent/agent-context-prompt-sections.ts +148 -0
  107. package/src/agent/agent-context-sections.js +25 -334
  108. package/src/agent/agent-context-sections.ts +36 -0
  109. package/src/agent/agent-context-sources.js +96 -149
  110. package/src/agent/agent-context-sources.ts +253 -0
  111. package/src/agent/agent-context-types.js +2 -0
  112. package/src/agent/agent-context-types.ts +132 -0
  113. package/src/agent/agent-context-validation-sections.js +73 -0
  114. package/src/agent/agent-context-validation-sections.ts +129 -0
  115. package/src/agent/agent-input-injector.js +99 -118
  116. package/src/agent/agent-input-injector.ts +195 -0
  117. package/src/agent/agent-liveness-poll.js +74 -78
  118. package/src/agent/agent-liveness-poll.ts +163 -0
  119. package/src/agent/agent-quality-gate-schema.js +77 -86
  120. package/src/agent/agent-quality-gate-schema.ts +135 -0
  121. package/src/agent/agent-quality-gates-context.js +44 -50
  122. package/src/agent/agent-quality-gates-context.ts +91 -0
  123. package/src/agent/agent-stuck-detector.js +171 -239
  124. package/src/agent/agent-stuck-detector.ts +288 -0
  125. package/src/agent/agent-trigger-evaluator.js +29 -46
  126. package/src/agent/agent-trigger-evaluator.ts +98 -0
  127. package/src/agent/context-metrics.js +110 -141
  128. package/src/agent/context-metrics.ts +261 -0
  129. package/src/agent/context-pack-builder.js +72 -358
  130. package/src/agent/context-pack-builder.ts +105 -0
  131. package/src/agent/context-pack-core.js +70 -0
  132. package/src/agent/context-pack-core.ts +96 -0
  133. package/src/agent/context-pack-selection.js +119 -0
  134. package/src/agent/context-pack-selection.ts +187 -0
  135. package/src/agent/context-pack-truncation.js +139 -0
  136. package/src/agent/context-pack-truncation.ts +208 -0
  137. package/src/agent/context-pack-types.js +2 -0
  138. package/src/agent/context-pack-types.ts +98 -0
  139. package/src/agent/context-replay-policy.js +30 -39
  140. package/src/agent/context-replay-policy.ts +71 -0
  141. package/src/agent/critical-agent-policy.js +6 -10
  142. package/src/agent/critical-agent-policy.ts +20 -0
  143. package/src/agent/guidance-queue.js +74 -87
  144. package/src/agent/guidance-queue.ts +166 -0
  145. package/src/agent/output-extraction-error-detail.js +45 -0
  146. package/src/agent/output-extraction-error-detail.ts +49 -0
  147. package/src/agent/output-extraction-failures.js +125 -0
  148. package/src/agent/output-extraction-failures.ts +149 -0
  149. package/src/agent/output-extraction-json.js +234 -0
  150. package/src/agent/output-extraction-json.ts +235 -0
  151. package/src/agent/output-extraction-pi.js +124 -0
  152. package/src/agent/output-extraction-pi.ts +137 -0
  153. package/src/agent/output-extraction-types.js +2 -0
  154. package/src/agent/output-extraction-types.ts +49 -0
  155. package/src/agent/output-extraction.js +17 -617
  156. package/src/agent/output-extraction.ts +30 -0
  157. package/src/agent/output-reformatter-errors.js +83 -0
  158. package/src/agent/output-reformatter-errors.ts +106 -0
  159. package/src/agent/output-reformatter-types.js +2 -0
  160. package/src/agent/output-reformatter-types.ts +86 -0
  161. package/src/agent/output-reformatter.js +140 -185
  162. package/src/agent/output-reformatter.ts +238 -0
  163. package/src/agent/pi-terminal-lifecycle-types.js +2 -0
  164. package/src/agent/pi-terminal-lifecycle-types.ts +41 -0
  165. package/src/agent/pi-terminal-lifecycle.js +186 -206
  166. package/src/agent/pi-terminal-lifecycle.ts +297 -0
  167. package/src/agent/provider-control-plane.js +22 -21
  168. package/src/agent/provider-control-plane.ts +52 -0
  169. package/src/agent/provider-terminal-failure-types.js +2 -0
  170. package/src/agent/provider-terminal-failure-types.ts +60 -0
  171. package/src/agent/provider-terminal-failure.js +194 -191
  172. package/src/agent/provider-terminal-failure.ts +262 -0
  173. package/src/agent/rate-limit-backoff.js +31 -74
  174. package/src/agent/rate-limit-backoff.ts +71 -0
  175. package/src/agent/schema-utils.js +85 -125
  176. package/src/agent/schema-utils.ts +148 -0
  177. package/src/agent/structured-output-error.js +34 -33
  178. package/src/agent/structured-output-error.ts +105 -0
  179. package/src/agent/validation-platform.js +27 -27
  180. package/src/agent/validation-platform.ts +49 -0
  181. package/src/attach/attach-client.js +232 -405
  182. package/src/attach/attach-client.ts +300 -0
  183. package/src/attach/attach-server-cleanup.js +43 -0
  184. package/src/attach/attach-server-cleanup.ts +39 -0
  185. package/src/attach/attach-server-clients.js +117 -0
  186. package/src/attach/attach-server-clients.ts +122 -0
  187. package/src/attach/attach-server-events.js +38 -0
  188. package/src/attach/attach-server-events.ts +36 -0
  189. package/src/attach/attach-server-pty.js +45 -0
  190. package/src/attach/attach-server-pty.ts +64 -0
  191. package/src/attach/attach-server-runtime.js +73 -0
  192. package/src/attach/attach-server-runtime.ts +62 -0
  193. package/src/attach/attach-server-socket.js +28 -0
  194. package/src/attach/attach-server-socket.ts +23 -0
  195. package/src/attach/attach-server-types.js +2 -0
  196. package/src/attach/attach-server-types.ts +82 -0
  197. package/src/attach/attach-server.js +106 -523
  198. package/src/attach/attach-server.ts +158 -0
  199. package/src/attach/index.js +18 -35
  200. package/src/attach/index.ts +18 -0
  201. package/src/attach/protocol.js +95 -184
  202. package/src/attach/protocol.ts +181 -0
  203. package/src/attach/ring-buffer.js +76 -102
  204. package/src/attach/ring-buffer.ts +109 -0
  205. package/src/attach/send-input.js +64 -75
  206. package/src/attach/send-input.ts +94 -0
  207. package/src/attach/socket-discovery.js +164 -218
  208. package/src/attach/socket-discovery.ts +230 -0
  209. package/src/attach/socket-paths.js +42 -61
  210. package/src/attach/socket-paths.ts +81 -0
  211. package/src/claude-credentials.js +51 -54
  212. package/src/claude-credentials.ts +89 -0
  213. package/src/cluster/generated/protocol-schema.ts +1 -1
  214. package/src/cluster/generated/protocol.ts +2 -1
  215. package/src/command-proofs.js +110 -141
  216. package/src/command-proofs.ts +216 -0
  217. package/src/config-router.js +81 -73
  218. package/src/config-router.ts +131 -0
  219. package/src/copy-worker.js +53 -29
  220. package/src/copy-worker.ts +75 -0
  221. package/src/darwin-keychain-boundary.js +80 -111
  222. package/src/darwin-keychain-boundary.ts +148 -0
  223. package/src/guidance-topics.js +4 -5
  224. package/src/guidance-topics.ts +10 -0
  225. package/src/input-helpers.js +33 -54
  226. package/src/input-helpers.ts +58 -0
  227. package/src/ledger-sequence.js +45 -48
  228. package/src/ledger-sequence.ts +63 -0
  229. package/src/legacy-lib/clusters-registry.ts +40 -0
  230. package/src/legacy-lib/completion.ts +148 -0
  231. package/src/legacy-lib/compose-utils.ts +102 -0
  232. package/src/legacy-lib/detached-startup.ts +449 -0
  233. package/src/legacy-lib/docker-config.ts +282 -0
  234. package/src/legacy-lib/docker-env-auth.ts +116 -0
  235. package/src/legacy-lib/git-remote-utils.ts +244 -0
  236. package/src/legacy-lib/id-detector.ts +57 -0
  237. package/src/legacy-lib/js-yaml.d.ts +3 -0
  238. package/src/legacy-lib/omelette.d.ts +15 -0
  239. package/src/legacy-lib/path-check.ts +89 -0
  240. package/src/legacy-lib/process-liveness.ts +36 -0
  241. package/src/legacy-lib/provider-credential-path.ts +57 -0
  242. package/src/legacy-lib/provider-defaults.ts +114 -0
  243. package/src/legacy-lib/provider-detection.ts +67 -0
  244. package/src/legacy-lib/provider-names.ts +126 -0
  245. package/src/legacy-lib/repo-settings.ts +88 -0
  246. package/src/legacy-lib/run-mode.ts +58 -0
  247. package/src/legacy-lib/run-plan.ts +49 -0
  248. package/src/legacy-lib/settings/claude-auth.ts +80 -0
  249. package/src/legacy-lib/settings-defaults.ts +212 -0
  250. package/src/legacy-lib/settings-error.ts +8 -0
  251. package/src/legacy-lib/settings-issue-providers.ts +18 -0
  252. package/src/legacy-lib/settings-models.ts +124 -0
  253. package/src/legacy-lib/settings-storage.ts +277 -0
  254. package/src/legacy-lib/settings-validation.ts +220 -0
  255. package/src/legacy-lib/settings.ts +87 -0
  256. package/src/legacy-lib/setup-apply-types.ts +70 -0
  257. package/src/legacy-lib/setup-apply.ts +456 -0
  258. package/src/legacy-lib/setup-journal.ts +185 -0
  259. package/src/legacy-lib/setup-plan-types.ts +96 -0
  260. package/src/legacy-lib/setup-plan.ts +500 -0
  261. package/src/legacy-lib/setup-undo.ts +142 -0
  262. package/src/legacy-lib/start-cluster-config.ts +124 -0
  263. package/src/legacy-lib/start-cluster-environment.ts +165 -0
  264. package/src/legacy-lib/start-cluster-run-options.ts +279 -0
  265. package/src/legacy-lib/start-cluster.ts +237 -0
  266. package/src/legacy-lib/stream-json-parser.ts +88 -0
  267. package/src/message-buffer.js +55 -71
  268. package/src/message-buffer.ts +107 -0
  269. package/src/message-bus-bridge.js +92 -133
  270. package/src/message-bus-bridge.ts +149 -0
  271. package/src/name-generator-shared.js +220 -0
  272. package/src/name-generator-shared.ts +231 -0
  273. package/src/name-generator.js +8 -217
  274. package/src/name-generator.ts +27 -0
  275. package/src/omp-blob-root.js +83 -64
  276. package/src/omp-blob-root.ts +116 -0
  277. package/src/omp-config-overlay.js +65 -38
  278. package/src/omp-config-overlay.ts +110 -0
  279. package/src/omp-execution-fingerprint.js +38 -43
  280. package/src/omp-execution-fingerprint.ts +92 -0
  281. package/src/omp-session-limits.js +10 -15
  282. package/src/omp-session-limits.ts +53 -0
  283. package/src/omp-session-partition.js +2 -2
  284. package/src/omp-session-verifier.js +1 -1
  285. package/src/orchestrator.js +19 -4
  286. package/src/providers/anthropic/index.js +3 -1
  287. package/src/providers/anthropic/index.ts +13 -0
  288. package/src/providers/capabilities.js +19 -27
  289. package/src/providers/capabilities.ts +44 -0
  290. package/src/providers/google/index.js +3 -1
  291. package/src/providers/google/index.ts +13 -0
  292. package/src/providers/openai/index.js +3 -1
  293. package/src/providers/openai/index.ts +13 -0
  294. package/src/providers/opencode/index.js +3 -1
  295. package/src/providers/opencode/index.ts +13 -0
  296. package/src/quality-gates.js +67 -127
  297. package/src/quality-gates.ts +149 -0
  298. package/src/repo-settings-access.js +40 -0
  299. package/src/repo-settings-access.ts +64 -0
  300. package/src/schemas/sub-cluster.js +127 -183
  301. package/src/schemas/sub-cluster.ts +238 -0
  302. package/src/state-snapshot-normalization.js +224 -0
  303. package/src/state-snapshot-normalization.ts +222 -0
  304. package/src/state-snapshot.js +192 -359
  305. package/src/state-snapshot.ts +291 -0
  306. package/src/state-snapshotter.js +118 -130
  307. package/src/state-snapshotter.ts +167 -0
  308. package/src/sub-cluster-wrapper.js +4 -13
  309. package/src/task-run-model-args.js +87 -124
  310. package/src/task-run-model-args.ts +204 -0
  311. package/src/task-runner.js +5 -25
  312. package/src/task-runner.ts +28 -0
  313. package/src/task-startup-error.js +73 -58
  314. package/src/task-startup-error.ts +126 -0
  315. package/src/template-validation/consensus-gate-contracts.js +2 -0
  316. package/src/template-validation/consensus-gate-contracts.ts +70 -0
  317. package/src/template-validation/consensus-gate-scenarios.js +76 -0
  318. package/src/template-validation/consensus-gate-scenarios.ts +130 -0
  319. package/src/template-validation/consensus-gate-stage.js +34 -0
  320. package/src/template-validation/consensus-gate-stage.ts +56 -0
  321. package/src/template-validation/random-topology-contracts.js +2 -0
  322. package/src/template-validation/random-topology-contracts.ts +54 -0
  323. package/src/template-validation/random-topology-dispatch.js +25 -0
  324. package/src/template-validation/random-topology-dispatch.ts +33 -0
  325. package/src/template-validation/random-topology-message-loop.js +53 -0
  326. package/src/template-validation/random-topology-message-loop.ts +73 -0
  327. package/src/template-validation/random-topology-operations.js +79 -0
  328. package/src/template-validation/random-topology-operations.ts +101 -0
  329. package/src/template-validation/random-topology-runtime.js +25 -0
  330. package/src/template-validation/random-topology-runtime.ts +43 -0
  331. package/src/template-validation/random-topology-scenario.js +52 -0
  332. package/src/template-validation/random-topology-scenario.ts +57 -0
  333. package/src/template-validation/random-topology-schema.js +159 -0
  334. package/src/template-validation/random-topology-schema.ts +190 -0
  335. package/src/template-validation/random-topology-state.js +28 -0
  336. package/src/template-validation/random-topology-state.ts +30 -0
  337. package/src/template-validation/random-topology-trigger-evaluation.js +45 -0
  338. package/src/template-validation/random-topology-trigger-evaluation.ts +65 -0
  339. package/src/template-validation/random-topology-trigger.js +75 -0
  340. package/src/template-validation/random-topology-trigger.ts +88 -0
  341. package/src/template-validation/report-formatter.js +40 -46
  342. package/src/template-validation/report-formatter.ts +101 -0
  343. package/src/template-validation/simulate-consensus-gates.js +111 -302
  344. package/src/template-validation/simulate-consensus-gates.ts +196 -0
  345. package/src/template-validation/simulate-random-topology.js +26 -519
  346. package/src/template-validation/simulate-random-topology.ts +57 -0
  347. package/src/template-validation/simulate-two-stage-validation.js +41 -265
  348. package/src/template-validation/simulate-two-stage-validation.ts +55 -0
  349. package/src/template-validation/simulation-agent-runtime.js +25 -0
  350. package/src/template-validation/simulation-agent-runtime.ts +40 -0
  351. package/src/template-validation/simulation-agent.js +29 -0
  352. package/src/template-validation/simulation-agent.ts +73 -0
  353. package/src/template-validation/simulation-runtime.js +34 -0
  354. package/src/template-validation/simulation-runtime.ts +72 -0
  355. package/src/template-validation/two-stage-contracts.js +2 -0
  356. package/src/template-validation/two-stage-contracts.ts +41 -0
  357. package/src/template-validation/two-stage-inputs.js +21 -0
  358. package/src/template-validation/two-stage-inputs.ts +29 -0
  359. package/src/template-validation/two-stage-results.js +30 -0
  360. package/src/template-validation/two-stage-results.ts +40 -0
  361. package/src/template-validation/two-stage-scenario.js +86 -0
  362. package/src/template-validation/two-stage-scenario.ts +120 -0
  363. package/src/worktree-claude-config.js +182 -220
  364. package/src/worktree-claude-config.ts +272 -0
  365. package/src/worktree-tooling-env.js +103 -125
  366. package/src/worktree-tooling-env.ts +142 -0
  367. package/task-lib/completion.js +2 -3
  368. package/task-lib/completion.ts +9 -0
  369. package/task-lib/config.js +1 -4
  370. package/task-lib/config.ts +11 -0
  371. package/task-lib/name-generator.js +4 -226
  372. package/task-lib/name-generator.ts +11 -0
  373. package/task-lib/omp-session-cleanup.js +1 -1
  374. package/task-lib/omp-storage-root.js +8 -12
  375. package/task-lib/omp-storage-root.ts +62 -0
  376. package/task-lib/process-termination.js +143 -166
  377. package/task-lib/process-termination.ts +268 -0
@@ -1,169 +1,138 @@
1
- const { readRepoSettings } = require('../lib/repo-settings');
2
-
1
+ "use strict";
2
+ const repoSettingsAccess = require("./repo-settings-access");
3
+ const { propertyValue, readRepoSettingsValue, selectOwnProperty } = repoSettingsAccess;
3
4
  const PROOF_BLOCK_PATTERN = /^```zeroshot-command-proofs\s*\n([\s\S]*?)^```/m;
4
-
5
- function hasOwn(value, key) {
6
- return Object.prototype.hasOwnProperty.call(value || {}, key);
7
- }
8
-
9
5
  function trimString(value) {
10
- return typeof value === 'string' && value.trim() ? value.trim() : null;
6
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
11
7
  }
12
-
13
8
  function setOptionalString(target, source, key) {
14
- const value = trimString(source[key]);
15
- if (value) {
16
- target[key] = value;
17
- }
9
+ const value = trimString(propertyValue(source, key));
10
+ if (value) {
11
+ target[key] = value;
12
+ }
18
13
  }
19
-
20
14
  function normalizeCommandProof(proof) {
21
- if (!proof || typeof proof !== 'object') {
22
- return null;
23
- }
24
-
25
- const id = trimString(proof.id || proof.name);
26
- const profile = trimString(proof.profile || proof.proofProfile);
27
- const command = trimString(proof.command);
28
- if (!id || !profile || !command) {
29
- return null;
30
- }
31
-
32
- const normalized = { id, profile, command };
33
- setOptionalString(normalized, proof, 'scope');
34
- setOptionalString(normalized, proof, 'description');
35
- return normalized;
15
+ if (!proof || typeof proof !== 'object') {
16
+ return null;
17
+ }
18
+ const id = trimString(propertyValue(proof, 'id') || propertyValue(proof, 'name'));
19
+ const profile = trimString(propertyValue(proof, 'profile') || propertyValue(proof, 'proofProfile'));
20
+ const command = trimString(propertyValue(proof, 'command'));
21
+ if (!id || !profile || !command) {
22
+ return null;
23
+ }
24
+ const normalized = { id, profile, command };
25
+ setOptionalString(normalized, proof, 'scope');
26
+ setOptionalString(normalized, proof, 'description');
27
+ return normalized;
28
+ }
29
+ function isCommandProof(proof) {
30
+ return proof !== null;
36
31
  }
37
-
38
32
  function normalizeCommandProofs(value) {
39
- if (!Array.isArray(value)) {
40
- return [];
41
- }
42
- return value.map(normalizeCommandProof).filter(Boolean);
33
+ if (!Array.isArray(value)) {
34
+ return [];
35
+ }
36
+ return value.map(normalizeCommandProof).filter(isCommandProof);
37
+ }
38
+ function errorMessage(error) {
39
+ return error instanceof Error ? error.message : String(error);
43
40
  }
44
-
45
41
  function parseCommandProofsFromText(text) {
46
- if (typeof text !== 'string' || text.trim() === '') {
47
- return [];
48
- }
49
-
50
- const match = text.match(PROOF_BLOCK_PATTERN);
51
- if (!match) {
52
- return [];
53
- }
54
-
55
- let parsed;
56
- try {
57
- parsed = JSON.parse(match[1]);
58
- } catch (error) {
59
- throw new Error(`Invalid zeroshot-command-proofs JSON: ${error.message}`);
60
- }
61
-
62
- return normalizeCommandProofs(parsed);
42
+ if (typeof text !== 'string' || text.trim() === '') {
43
+ return [];
44
+ }
45
+ const match = PROOF_BLOCK_PATTERN.exec(text);
46
+ const payload = match?.[1];
47
+ if (payload === undefined) {
48
+ return [];
49
+ }
50
+ let parsed;
51
+ try {
52
+ parsed = JSON.parse(payload);
53
+ }
54
+ catch (error) {
55
+ throw new Error(`Invalid zeroshot-command-proofs JSON: ${errorMessage(error)}`);
56
+ }
57
+ return normalizeCommandProofs(parsed);
63
58
  }
64
-
65
59
  function mergeCommandProofs(...sources) {
66
- const byId = new Map();
67
- const order = [];
68
-
69
- for (const source of sources) {
70
- for (const proof of normalizeCommandProofs(source)) {
71
- if (!byId.has(proof.id)) {
72
- order.push(proof.id);
73
- }
74
- byId.set(proof.id, proof);
60
+ const byId = new Map();
61
+ const order = [];
62
+ for (const source of sources) {
63
+ for (const proof of normalizeCommandProofs(source)) {
64
+ if (!byId.has(proof.id)) {
65
+ order.push(proof.id);
66
+ }
67
+ byId.set(proof.id, proof);
68
+ }
69
+ }
70
+ const merged = [];
71
+ for (const id of order) {
72
+ const proof = byId.get(id);
73
+ if (proof) {
74
+ merged.push(proof);
75
+ }
75
76
  }
76
- }
77
-
78
- return order.map((id) => byId.get(id));
77
+ return merged;
79
78
  }
80
-
81
79
  function commandProofToQualityGate(proof) {
82
- const normalized = normalizeCommandProof(proof);
83
- if (!normalized) {
84
- return null;
85
- }
86
-
87
- const gate = {
88
- id: normalized.id,
89
- profile: normalized.profile,
90
- command: normalized.command,
91
- commandProof: true,
92
- };
93
- setOptionalString(gate, normalized, 'scope');
94
- setOptionalString(gate, normalized, 'description');
95
- return gate;
80
+ const normalized = normalizeCommandProof(proof);
81
+ if (!normalized) {
82
+ return null;
83
+ }
84
+ const gate = {
85
+ id: normalized.id,
86
+ profile: normalized.profile,
87
+ command: normalized.command,
88
+ commandProof: true,
89
+ };
90
+ setOptionalString(gate, normalized, 'scope');
91
+ setOptionalString(gate, normalized, 'description');
92
+ return gate;
96
93
  }
97
-
98
94
  function getCommandProofSource(options, repoSettings) {
99
- if (hasOwn(options, 'commandProofs')) {
100
- return options.commandProofs;
101
- }
102
-
103
- if (options.ship && typeof options.ship === 'object' && hasOwn(options.ship, 'commandProofs')) {
104
- return options.ship.commandProofs;
105
- }
106
-
107
- const settingsShip = repoSettings?.ship;
108
- if (settingsShip && typeof settingsShip === 'object' && hasOwn(settingsShip, 'commandProofs')) {
109
- return settingsShip.commandProofs;
110
- }
111
-
112
- if (hasOwn(repoSettings, 'commandProofs')) {
113
- return repoSettings.commandProofs;
114
- }
115
-
116
- return [];
95
+ const source = selectOwnProperty('commandProofs', [
96
+ options,
97
+ propertyValue(options, 'ship'),
98
+ propertyValue(repoSettings, 'ship'),
99
+ repoSettings,
100
+ ]);
101
+ return source === undefined ? [] : source;
117
102
  }
118
-
119
103
  function getClusterCommandProofSource(config, options) {
120
- if (hasOwn(options, 'commandProofs')) {
121
- return options.commandProofs;
122
- }
123
-
124
- if (options.ship && typeof options.ship === 'object' && hasOwn(options.ship, 'commandProofs')) {
125
- return options.ship.commandProofs;
126
- }
127
-
128
- if (config?.ship && typeof config.ship === 'object' && hasOwn(config.ship, 'commandProofs')) {
129
- return config.ship.commandProofs;
130
- }
131
-
132
- if (hasOwn(config, 'commandProofs')) {
133
- return config.commandProofs;
134
- }
135
-
136
- return undefined;
104
+ return selectOwnProperty('commandProofs', [
105
+ options,
106
+ propertyValue(options, 'ship'),
107
+ propertyValue(config, 'ship'),
108
+ config,
109
+ ]);
137
110
  }
138
-
139
111
  function resolveConfiguredCommandProofs(config = {}, options = {}) {
140
- const configuredSource = getClusterCommandProofSource(config, options);
141
- if (configuredSource !== undefined) {
142
- return normalizeCommandProofs(configuredSource);
143
- }
144
-
145
- const repoSettingsResult = readRepoSettings(options.cwd || process.cwd());
146
- const repoSettings = repoSettingsResult.settings || {};
147
- return normalizeCommandProofs(getCommandProofSource(options, repoSettings));
112
+ const configuredSource = getClusterCommandProofSource(config, options);
113
+ if (configuredSource !== undefined) {
114
+ return normalizeCommandProofs(configuredSource);
115
+ }
116
+ const repoSettings = readRepoSettingsValue(options.cwd || process.cwd());
117
+ return normalizeCommandProofs(getCommandProofSource(options, repoSettings));
148
118
  }
149
-
150
119
  function resolveClusterCommandProofs(config = {}, options = {}, inputText = '') {
151
- return mergeCommandProofs(
152
- resolveConfiguredCommandProofs(config, options),
153
- parseCommandProofsFromText(inputText)
154
- );
120
+ return mergeCommandProofs(resolveConfiguredCommandProofs(config, options), parseCommandProofsFromText(inputText));
121
+ }
122
+ function isCommandProofQualityGate(gate) {
123
+ return gate !== null;
155
124
  }
156
-
157
125
  function commandProofsToQualityGates(commandProofs) {
158
- return normalizeCommandProofs(commandProofs).map(commandProofToQualityGate).filter(Boolean);
126
+ return normalizeCommandProofs(commandProofs)
127
+ .map(commandProofToQualityGate)
128
+ .filter(isCommandProofQualityGate);
159
129
  }
160
-
161
130
  module.exports = {
162
- commandProofToQualityGate,
163
- commandProofsToQualityGates,
164
- mergeCommandProofs,
165
- normalizeCommandProofs,
166
- parseCommandProofsFromText,
167
- resolveClusterCommandProofs,
168
- resolveConfiguredCommandProofs,
131
+ commandProofToQualityGate,
132
+ commandProofsToQualityGates,
133
+ mergeCommandProofs,
134
+ normalizeCommandProofs,
135
+ parseCommandProofsFromText,
136
+ resolveClusterCommandProofs,
137
+ resolveConfiguredCommandProofs,
169
138
  };
@@ -0,0 +1,216 @@
1
+ import repoSettingsAccess = require('./repo-settings-access');
2
+
3
+ type ProofStringField = 'scope' | 'description';
4
+
5
+ interface CommandProof {
6
+ id: string;
7
+ profile: string;
8
+ command: string;
9
+ scope?: string;
10
+ description?: string;
11
+ }
12
+
13
+ interface CommandProofQualityGate {
14
+ id: string;
15
+ profile: string;
16
+ command: string;
17
+ commandProof: true;
18
+ scope?: string;
19
+ description?: string;
20
+ }
21
+
22
+ interface CommandProofOptions {
23
+ cwd?: string;
24
+ commandProofs?: unknown;
25
+ ship?: unknown;
26
+ [key: string]: unknown;
27
+ }
28
+
29
+ interface CommandProofConfig {
30
+ commandProofs?: unknown;
31
+ ship?: unknown;
32
+ [key: string]: unknown;
33
+ }
34
+
35
+ const { propertyValue, readRepoSettingsValue, selectOwnProperty } = repoSettingsAccess;
36
+
37
+ const PROOF_BLOCK_PATTERN = /^```zeroshot-command-proofs\s*\n([\s\S]*?)^```/m;
38
+
39
+ function trimString(value: unknown): string | null {
40
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
41
+ }
42
+
43
+ function setOptionalString(
44
+ target: CommandProof | CommandProofQualityGate,
45
+ source: unknown,
46
+ key: ProofStringField
47
+ ): void {
48
+ const value = trimString(propertyValue(source, key));
49
+ if (value) {
50
+ target[key] = value;
51
+ }
52
+ }
53
+
54
+ function normalizeCommandProof(proof: unknown): CommandProof | null {
55
+ if (!proof || typeof proof !== 'object') {
56
+ return null;
57
+ }
58
+
59
+ const id = trimString(propertyValue(proof, 'id') || propertyValue(proof, 'name'));
60
+ const profile = trimString(
61
+ propertyValue(proof, 'profile') || propertyValue(proof, 'proofProfile')
62
+ );
63
+ const command = trimString(propertyValue(proof, 'command'));
64
+ if (!id || !profile || !command) {
65
+ return null;
66
+ }
67
+
68
+ const normalized: CommandProof = { id, profile, command };
69
+ setOptionalString(normalized, proof, 'scope');
70
+ setOptionalString(normalized, proof, 'description');
71
+ return normalized;
72
+ }
73
+
74
+ function isCommandProof(proof: CommandProof | null): proof is CommandProof {
75
+ return proof !== null;
76
+ }
77
+
78
+ function normalizeCommandProofs(value: unknown): CommandProof[] {
79
+ if (!Array.isArray(value)) {
80
+ return [];
81
+ }
82
+ return value.map(normalizeCommandProof).filter(isCommandProof);
83
+ }
84
+
85
+ function errorMessage(error: unknown): string {
86
+ return error instanceof Error ? error.message : String(error);
87
+ }
88
+
89
+ function parseCommandProofsFromText(text: unknown): CommandProof[] {
90
+ if (typeof text !== 'string' || text.trim() === '') {
91
+ return [];
92
+ }
93
+
94
+ const match = PROOF_BLOCK_PATTERN.exec(text);
95
+ const payload = match?.[1];
96
+ if (payload === undefined) {
97
+ return [];
98
+ }
99
+
100
+ let parsed: unknown;
101
+ try {
102
+ parsed = JSON.parse(payload);
103
+ } catch (error) {
104
+ throw new Error(`Invalid zeroshot-command-proofs JSON: ${errorMessage(error)}`);
105
+ }
106
+
107
+ return normalizeCommandProofs(parsed);
108
+ }
109
+
110
+ function mergeCommandProofs(...sources: unknown[]): CommandProof[] {
111
+ const byId = new Map<string, CommandProof>();
112
+ const order: string[] = [];
113
+
114
+ for (const source of sources) {
115
+ for (const proof of normalizeCommandProofs(source)) {
116
+ if (!byId.has(proof.id)) {
117
+ order.push(proof.id);
118
+ }
119
+ byId.set(proof.id, proof);
120
+ }
121
+ }
122
+
123
+ const merged: CommandProof[] = [];
124
+ for (const id of order) {
125
+ const proof = byId.get(id);
126
+ if (proof) {
127
+ merged.push(proof);
128
+ }
129
+ }
130
+ return merged;
131
+ }
132
+
133
+ function commandProofToQualityGate(proof: unknown): CommandProofQualityGate | null {
134
+ const normalized = normalizeCommandProof(proof);
135
+ if (!normalized) {
136
+ return null;
137
+ }
138
+
139
+ const gate: CommandProofQualityGate = {
140
+ id: normalized.id,
141
+ profile: normalized.profile,
142
+ command: normalized.command,
143
+ commandProof: true,
144
+ };
145
+ setOptionalString(gate, normalized, 'scope');
146
+ setOptionalString(gate, normalized, 'description');
147
+ return gate;
148
+ }
149
+
150
+ function getCommandProofSource(options: CommandProofOptions, repoSettings: unknown): unknown {
151
+ const source = selectOwnProperty('commandProofs', [
152
+ options,
153
+ propertyValue(options, 'ship'),
154
+ propertyValue(repoSettings, 'ship'),
155
+ repoSettings,
156
+ ]);
157
+ return source === undefined ? [] : source;
158
+ }
159
+
160
+ function getClusterCommandProofSource(
161
+ config: CommandProofConfig,
162
+ options: CommandProofOptions
163
+ ): unknown {
164
+ return selectOwnProperty('commandProofs', [
165
+ options,
166
+ propertyValue(options, 'ship'),
167
+ propertyValue(config, 'ship'),
168
+ config,
169
+ ]);
170
+ }
171
+
172
+ function resolveConfiguredCommandProofs(
173
+ config: CommandProofConfig = {},
174
+ options: CommandProofOptions = {}
175
+ ): CommandProof[] {
176
+ const configuredSource = getClusterCommandProofSource(config, options);
177
+ if (configuredSource !== undefined) {
178
+ return normalizeCommandProofs(configuredSource);
179
+ }
180
+
181
+ const repoSettings = readRepoSettingsValue(options.cwd || process.cwd());
182
+ return normalizeCommandProofs(getCommandProofSource(options, repoSettings));
183
+ }
184
+
185
+ function resolveClusterCommandProofs(
186
+ config: CommandProofConfig = {},
187
+ options: CommandProofOptions = {},
188
+ inputText: unknown = ''
189
+ ): CommandProof[] {
190
+ return mergeCommandProofs(
191
+ resolveConfiguredCommandProofs(config, options),
192
+ parseCommandProofsFromText(inputText)
193
+ );
194
+ }
195
+
196
+ function isCommandProofQualityGate(
197
+ gate: CommandProofQualityGate | null
198
+ ): gate is CommandProofQualityGate {
199
+ return gate !== null;
200
+ }
201
+
202
+ function commandProofsToQualityGates(commandProofs: unknown): CommandProofQualityGate[] {
203
+ return normalizeCommandProofs(commandProofs)
204
+ .map(commandProofToQualityGate)
205
+ .filter(isCommandProofQualityGate);
206
+ }
207
+
208
+ export = {
209
+ commandProofToQualityGate,
210
+ commandProofsToQualityGates,
211
+ mergeCommandProofs,
212
+ normalizeCommandProofs,
213
+ parseCommandProofsFromText,
214
+ resolveClusterCommandProofs,
215
+ resolveConfiguredCommandProofs,
216
+ };
@@ -1,89 +1,97 @@
1
+ "use strict";
1
2
  /**
2
3
  * Config Router - Maps 2D classification to parameterized templates
3
4
  *
4
5
  * Single source of truth for: Complexity × TaskType → { base, params }
5
6
  * Used by both logic-engine.js (trigger evaluation) and agent-wrapper.js (transform scripts)
6
7
  */
7
-
8
- const { DEFAULT_MAX_ITERATIONS } = require('./agent/agent-config');
9
-
8
+ function isAgentConfigModule(value) {
9
+ return (typeof value === 'object' &&
10
+ value !== null &&
11
+ 'DEFAULT_MAX_ITERATIONS' in value &&
12
+ typeof value.DEFAULT_MAX_ITERATIONS === 'number');
13
+ }
14
+ const agentConfig = require('./agent/agent-config');
15
+ if (!isAgentConfigModule(agentConfig)) {
16
+ throw new TypeError('agent-config must export a numeric DEFAULT_MAX_ITERATIONS');
17
+ }
18
+ const { DEFAULT_MAX_ITERATIONS } = agentConfig;
10
19
  /**
11
20
  * Get cluster config based on complexity and task type
12
- * @param {string} complexity - TRIVIAL, SIMPLE, STANDARD, CRITICAL
13
- * @param {string} taskType - INQUIRY, TASK, DEBUG
14
- * @param {object} [options]
15
- * @param {boolean} [options.autoPr] - Whether the cluster will inject git-pusher/PR flow
16
- * @returns {{ base: string, params: object }}
17
21
  */
18
22
  function getConfig(complexity, taskType, options = {}) {
19
- const isPrMode = options.autoPr === true || process.env.ZEROSHOT_PR === '1';
20
-
21
- const getBase = () => {
22
- if (taskType === 'DEBUG' && complexity !== 'TRIVIAL') {
23
- return 'debug-workflow';
23
+ const isPrMode = options.autoPr === true || process.env.ZEROSHOT_PR === '1';
24
+ const getBase = () => {
25
+ if (taskType === 'DEBUG' && complexity !== 'TRIVIAL') {
26
+ return 'debug-workflow';
27
+ }
28
+ if (complexity === 'TRIVIAL' && isPrMode && taskType !== 'INQUIRY') {
29
+ return 'worker-validator';
30
+ }
31
+ if (complexity === 'TRIVIAL') {
32
+ return 'single-worker';
33
+ }
34
+ if (complexity === 'SIMPLE') {
35
+ return 'worker-validator';
36
+ }
37
+ return 'full-workflow';
38
+ };
39
+ const getLevel = (role) => {
40
+ if (complexity === 'CRITICAL' && role === 'planner')
41
+ return 'level3';
42
+ if (complexity === 'TRIVIAL')
43
+ return 'level1';
44
+ return 'level2';
45
+ };
46
+ const getValidatorCount = () => {
47
+ if (complexity === 'TRIVIAL')
48
+ return 0;
49
+ if (complexity === 'SIMPLE')
50
+ return 1;
51
+ if (complexity === 'STANDARD')
52
+ return 2;
53
+ // CRITICAL uses two-stage validation pipeline (validators loaded dynamically via meta-coordinator)
54
+ // Setting validator_count=0 signals that inline validators should be skipped
55
+ if (complexity === 'CRITICAL')
56
+ return 0;
57
+ return 1;
58
+ };
59
+ const getMaxTokens = () => {
60
+ if (complexity === 'TRIVIAL')
61
+ return 50000;
62
+ if (complexity === 'SIMPLE')
63
+ return 100000;
64
+ if (complexity === 'STANDARD')
65
+ return 100000;
66
+ if (complexity === 'CRITICAL')
67
+ return 150000;
68
+ return 100000;
69
+ };
70
+ const base = getBase();
71
+ const params = {
72
+ task_type: taskType,
73
+ complexity,
74
+ max_tokens: getMaxTokens(),
75
+ max_iterations: DEFAULT_MAX_ITERATIONS,
76
+ };
77
+ if (base === 'single-worker') {
78
+ params.worker_level = getLevel('worker');
24
79
  }
25
- if (complexity === 'TRIVIAL' && isPrMode && taskType !== 'INQUIRY') {
26
- return 'worker-validator';
80
+ else if (base === 'worker-validator') {
81
+ params.worker_level = getLevel('worker');
82
+ params.validator_level = getLevel('validator');
27
83
  }
28
- if (complexity === 'TRIVIAL') {
29
- return 'single-worker';
84
+ else if (base === 'debug-workflow') {
85
+ params.investigator_level = getLevel('planner');
86
+ params.fixer_level = getLevel('worker');
87
+ params.tester_level = getLevel('validator');
30
88
  }
31
- if (complexity === 'SIMPLE') {
32
- return 'worker-validator';
89
+ else if (base === 'full-workflow') {
90
+ params.planner_level = getLevel('planner');
91
+ params.worker_level = getLevel('worker');
92
+ params.validator_level = getLevel('validator');
93
+ params.validator_count = getValidatorCount();
33
94
  }
34
- return 'full-workflow';
35
- };
36
-
37
- const getLevel = (role) => {
38
- if (complexity === 'CRITICAL' && role === 'planner') return 'level3';
39
- if (complexity === 'TRIVIAL') return 'level1';
40
- return 'level2';
41
- };
42
-
43
- const getValidatorCount = () => {
44
- if (complexity === 'TRIVIAL') return 0;
45
- if (complexity === 'SIMPLE') return 1;
46
- if (complexity === 'STANDARD') return 2;
47
- // CRITICAL uses two-stage validation pipeline (validators loaded dynamically via meta-coordinator)
48
- // Setting validator_count=0 signals that inline validators should be skipped
49
- if (complexity === 'CRITICAL') return 0;
50
- return 1;
51
- };
52
-
53
- const getMaxTokens = () => {
54
- if (complexity === 'TRIVIAL') return 50000;
55
- if (complexity === 'SIMPLE') return 100000;
56
- if (complexity === 'STANDARD') return 100000;
57
- if (complexity === 'CRITICAL') return 150000;
58
- return 100000;
59
- };
60
-
61
- const base = getBase();
62
-
63
- const params = {
64
- task_type: taskType,
65
- complexity,
66
- max_tokens: getMaxTokens(),
67
- max_iterations: DEFAULT_MAX_ITERATIONS,
68
- };
69
-
70
- if (base === 'single-worker') {
71
- params.worker_level = getLevel('worker');
72
- } else if (base === 'worker-validator') {
73
- params.worker_level = getLevel('worker');
74
- params.validator_level = getLevel('validator');
75
- } else if (base === 'debug-workflow') {
76
- params.investigator_level = getLevel('planner');
77
- params.fixer_level = getLevel('worker');
78
- params.tester_level = getLevel('validator');
79
- } else if (base === 'full-workflow') {
80
- params.planner_level = getLevel('planner');
81
- params.worker_level = getLevel('worker');
82
- params.validator_level = getLevel('validator');
83
- params.validator_count = getValidatorCount();
84
- }
85
-
86
- return { base, params };
95
+ return { base, params };
87
96
  }
88
-
89
97
  module.exports = { getConfig };