@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
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ let issueProviderFns = null;
3
+ function getIssueProviderFns() {
4
+ if (issueProviderFns)
5
+ return issueProviderFns;
6
+ // Lazy load preserves the issue-providers -> settings -> issue-providers boundary.
7
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
8
+ const loaded = require('../src/issue-providers');
9
+ issueProviderFns = loaded;
10
+ return loaded;
11
+ }
12
+ module.exports = { getIssueProviderFns };
@@ -0,0 +1,22 @@
1
+ type ModelLevel = 'level1' | 'level2' | 'level3';
2
+ interface ProviderLevelSettings extends Record<string, unknown> {
3
+ defaultLevel?: ModelLevel;
4
+ maxLevel?: ModelLevel;
5
+ minLevel?: ModelLevel;
6
+ }
7
+ interface SettingsRecord extends Record<string, unknown> {
8
+ maxModel?: string | null;
9
+ minModel?: string | null;
10
+ providerSettings?: Record<string, ProviderLevelSettings>;
11
+ }
12
+ declare function validateModelAgainstMax(requestedModel: string | null | undefined, maxModel: string, minModel?: string | null): string;
13
+ declare function mapLegacyModelToLevel(model: unknown): ModelLevel | null;
14
+ declare function applyLegacyModelBounds(settings: SettingsRecord): SettingsRecord;
15
+ declare const _default: {
16
+ MODEL_HIERARCHY: Readonly<Record<string, number>>;
17
+ VALID_MODELS: string[];
18
+ validateModelAgainstMax: typeof validateModelAgainstMax;
19
+ mapLegacyModelToLevel: typeof mapLegacyModelToLevel;
20
+ applyLegacyModelBounds: typeof applyLegacyModelBounds;
21
+ };
22
+ export = _default;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ const MODEL_HIERARCHY = Object.freeze({
3
+ opus: 3,
4
+ fable: 3,
5
+ sonnet: 2,
6
+ haiku: 1,
7
+ });
8
+ const VALID_MODELS = Object.keys(MODEL_HIERARCHY);
9
+ const LEVEL_RANKS = Object.freeze({
10
+ level1: 1,
11
+ level2: 2,
12
+ level3: 3,
13
+ });
14
+ function validateModelAgainstMax(requestedModel, maxModel, minModel = null) {
15
+ if (!requestedModel)
16
+ return maxModel;
17
+ if (!VALID_MODELS.includes(requestedModel)) {
18
+ throw new Error(`Invalid model "${requestedModel}". Valid: ${VALID_MODELS.join(', ')}`);
19
+ }
20
+ if (!VALID_MODELS.includes(maxModel)) {
21
+ throw new Error(`Invalid maxModel "${maxModel}". Valid: ${VALID_MODELS.join(', ')}`);
22
+ }
23
+ const requestedRank = MODEL_HIERARCHY[requestedModel] ?? 0;
24
+ const maximumRank = MODEL_HIERARCHY[maxModel] ?? 0;
25
+ if (requestedRank > maximumRank) {
26
+ throw new Error(`Agent requests "${requestedModel}" but maxModel is "${maxModel}". ` +
27
+ `Either lower agent's model or raise maxModel.`);
28
+ }
29
+ if (minModel) {
30
+ if (!VALID_MODELS.includes(minModel)) {
31
+ throw new Error(`Invalid minModel "${minModel}". Valid: ${VALID_MODELS.join(', ')}`);
32
+ }
33
+ const minimumRank = MODEL_HIERARCHY[minModel] ?? 0;
34
+ if (minimumRank > maximumRank) {
35
+ throw new Error(`minModel "${minModel}" cannot be higher than maxModel "${maxModel}".`);
36
+ }
37
+ if (requestedRank < minimumRank) {
38
+ throw new Error(`Agent requests "${requestedModel}" but minModel is "${minModel}". ` +
39
+ `Either raise agent's model or lower minModel.`);
40
+ }
41
+ }
42
+ return requestedModel;
43
+ }
44
+ function mapLegacyModelToLevel(model) {
45
+ switch (model) {
46
+ case 'haiku':
47
+ return 'level1';
48
+ case 'sonnet':
49
+ return 'level2';
50
+ case 'opus':
51
+ return 'level3';
52
+ default:
53
+ return null;
54
+ }
55
+ }
56
+ function levelRank(level, fallback) {
57
+ return LEVEL_RANKS[level ?? fallback];
58
+ }
59
+ function applyLegacyModelBounds(settings) {
60
+ if (!settings.providerSettings)
61
+ return settings;
62
+ const claude = settings.providerSettings.claude || {};
63
+ const legacyMaxLevel = mapLegacyModelToLevel(settings.maxModel);
64
+ const legacyMinLevel = mapLegacyModelToLevel(settings.minModel);
65
+ if (legacyMaxLevel) {
66
+ claude.maxLevel = legacyMaxLevel;
67
+ }
68
+ if (legacyMinLevel) {
69
+ claude.minLevel = legacyMinLevel;
70
+ }
71
+ const minRank = levelRank(claude.minLevel, 'level1');
72
+ const maxRank = levelRank(claude.maxLevel, 'level3');
73
+ const defaultRank = levelRank(claude.defaultLevel, 'level2');
74
+ if (minRank > maxRank) {
75
+ claude.minLevel = 'level1';
76
+ claude.maxLevel = 'level3';
77
+ }
78
+ else if (defaultRank < minRank && claude.minLevel !== undefined) {
79
+ claude.defaultLevel = claude.minLevel;
80
+ }
81
+ else if (defaultRank > maxRank && claude.maxLevel !== undefined) {
82
+ claude.defaultLevel = claude.maxLevel;
83
+ }
84
+ settings.providerSettings.claude = claude;
85
+ return settings;
86
+ }
87
+ module.exports = {
88
+ MODEL_HIERARCHY,
89
+ VALID_MODELS,
90
+ validateModelAgainstMax,
91
+ mapLegacyModelToLevel,
92
+ applyLegacyModelBounds,
93
+ };
@@ -0,0 +1,23 @@
1
+ interface SettingsRecord extends Record<string, unknown> {
2
+ autoCheckUpdates?: unknown;
3
+ lastUpdateCheckClaim?: unknown;
4
+ updatePolicy?: unknown;
5
+ }
6
+ interface LoadOptions {
7
+ silent?: unknown;
8
+ }
9
+ interface MutationOptions {
10
+ lockTimeoutMs?: number;
11
+ }
12
+ type SettingsMutator = (settings: SettingsRecord) => unknown;
13
+ declare function getSettingsFile(): string;
14
+ declare function settingsFileExists(): boolean;
15
+ declare function loadSettings(options?: LoadOptions): SettingsRecord;
16
+ declare function mutateSettings(mutator: SettingsMutator, options?: MutationOptions): unknown;
17
+ declare const _default: {
18
+ loadSettings: typeof loadSettings;
19
+ mutateSettings: typeof mutateSettings;
20
+ getSettingsFile: typeof getSettingsFile;
21
+ settingsFileExists: typeof settingsFileExists;
22
+ };
23
+ export = _default;
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ const crypto = require("crypto");
3
+ const fs = require("fs");
4
+ const os = require("os");
5
+ const path = require("path");
6
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
7
+ const lockfile = require('proper-lockfile');
8
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
9
+ const defaults = require('./settings-defaults');
10
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
11
+ const { SettingsValidationError } = require('./settings-error');
12
+ const { resolvedDefaultSettings, mergeLoadedSettings } = defaults;
13
+ const SETTINGS_LOCK_STALE_MS = 5000;
14
+ const SETTINGS_LOCK_TIMEOUT_MS = 500;
15
+ const SETTINGS_LOCK_RETRY_MS = 20;
16
+ const SETTINGS_LOCK_SLEEP = new Int32Array(new SharedArrayBuffer(4));
17
+ function isSettingsRecord(value) {
18
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
19
+ }
20
+ function errorCode(error) {
21
+ return error !== null && typeof error === 'object' && 'code' in error ? error.code : undefined;
22
+ }
23
+ function errorMessage(error) {
24
+ return error instanceof Error ? error.message : String(error);
25
+ }
26
+ function isPromiseLike(value) {
27
+ return (value !== null &&
28
+ typeof value === 'object' &&
29
+ 'then' in value &&
30
+ typeof value.then === 'function');
31
+ }
32
+ function getSettingsFile() {
33
+ return (process.env.ZEROSHOT_SETTINGS_FILE || path.join(os.homedir(), '.zeroshot', 'settings.json'));
34
+ }
35
+ function settingsFileExists() {
36
+ return fs.existsSync(getSettingsFile());
37
+ }
38
+ function loadSettings(options = {}) {
39
+ const settingsFile = getSettingsFile();
40
+ if (!fs.existsSync(settingsFile)) {
41
+ return resolvedDefaultSettings();
42
+ }
43
+ try {
44
+ const parsed = JSON.parse(fs.readFileSync(settingsFile, 'utf8'));
45
+ if (!isSettingsRecord(parsed)) {
46
+ throw new TypeError('settings file must contain an object');
47
+ }
48
+ return mergeLoadedSettings(parsed);
49
+ }
50
+ catch {
51
+ if (!options.silent)
52
+ console.error('Warning: Could not load settings, using defaults');
53
+ return resolvedDefaultSettings();
54
+ }
55
+ }
56
+ function readSettingsForMutation(settingsFile) {
57
+ if (!fs.existsSync(settingsFile)) {
58
+ return {
59
+ settings: resolvedDefaultSettings(),
60
+ requiresClaimInvalidation: false,
61
+ requiresRecovery: false,
62
+ };
63
+ }
64
+ let parsed;
65
+ try {
66
+ parsed = JSON.parse(fs.readFileSync(settingsFile, 'utf8'));
67
+ }
68
+ catch (error) {
69
+ if (!(error instanceof SyntaxError))
70
+ throw error;
71
+ return {
72
+ settings: resolvedDefaultSettings(),
73
+ requiresClaimInvalidation: false,
74
+ requiresRecovery: true,
75
+ };
76
+ }
77
+ if (!isSettingsRecord(parsed)) {
78
+ return {
79
+ settings: resolvedDefaultSettings(),
80
+ requiresClaimInvalidation: false,
81
+ requiresRecovery: true,
82
+ };
83
+ }
84
+ const updatesDisabled = parsed.autoCheckUpdates === false || parsed.updatePolicy === 'off';
85
+ return {
86
+ settings: mergeLoadedSettings(parsed),
87
+ requiresClaimInvalidation: updatesDisabled && parsed.lastUpdateCheckClaim !== null,
88
+ requiresRecovery: false,
89
+ };
90
+ }
91
+ function getAtomicSettingsMode(settingsFile) {
92
+ try {
93
+ return fs.statSync(settingsFile).mode & 0o600;
94
+ }
95
+ catch (error) {
96
+ if (errorCode(error) === 'ENOENT')
97
+ return 0o600;
98
+ throw error;
99
+ }
100
+ }
101
+ function atomicWriteSettings(settingsFile, settings) {
102
+ const dir = path.dirname(settingsFile);
103
+ const temporaryFile = path.join(dir, `.${path.basename(settingsFile)}.${process.pid}.${crypto.randomUUID()}.tmp`);
104
+ let operationError;
105
+ try {
106
+ fs.writeFileSync(temporaryFile, JSON.stringify(settings, null, 2), {
107
+ encoding: 'utf8',
108
+ flag: 'wx',
109
+ mode: getAtomicSettingsMode(settingsFile),
110
+ });
111
+ fs.renameSync(temporaryFile, settingsFile);
112
+ }
113
+ catch (error) {
114
+ operationError = error;
115
+ }
116
+ try {
117
+ fs.unlinkSync(temporaryFile);
118
+ }
119
+ catch (error) {
120
+ if (errorCode(error) !== 'ENOENT' && !operationError)
121
+ operationError = error;
122
+ }
123
+ if (operationError)
124
+ throw operationError;
125
+ }
126
+ function acquireSettingsLock(settingsFile, lockfilePath, timeoutMs) {
127
+ const deadline = Date.now() + timeoutMs;
128
+ return tryAcquireSettingsLock(settingsFile, lockfilePath, deadline);
129
+ }
130
+ function shouldRetrySettingsLock(error, deadline) {
131
+ return errorCode(error) === 'ELOCKED' && Date.now() < deadline;
132
+ }
133
+ function tryAcquireSettingsLock(settingsFile, lockfilePath, deadline) {
134
+ try {
135
+ return lockfile.lockSync(settingsFile, {
136
+ lockfilePath,
137
+ realpath: false,
138
+ stale: SETTINGS_LOCK_STALE_MS,
139
+ });
140
+ }
141
+ catch (error) {
142
+ if (!shouldRetrySettingsLock(error, deadline))
143
+ throw error;
144
+ Atomics.wait(SETTINGS_LOCK_SLEEP, 0, 0, SETTINGS_LOCK_RETRY_MS);
145
+ return tryAcquireSettingsLock(settingsFile, lockfilePath, deadline);
146
+ }
147
+ }
148
+ function applySettingsMutation(settingsFile, mutator) {
149
+ const { settings, requiresClaimInvalidation, requiresRecovery } = readSettingsForMutation(settingsFile);
150
+ const before = JSON.stringify(settings);
151
+ const result = mutator(settings);
152
+ if (isPromiseLike(result)) {
153
+ throw new TypeError('Global settings mutations must be synchronous');
154
+ }
155
+ if (settings.autoCheckUpdates === false || settings.updatePolicy === 'off') {
156
+ settings.lastUpdateCheckClaim = null;
157
+ }
158
+ if (requiresRecovery || requiresClaimInvalidation || JSON.stringify(settings) !== before) {
159
+ atomicWriteSettings(settingsFile, settings);
160
+ }
161
+ return result;
162
+ }
163
+ function asMutationError(error) {
164
+ return error instanceof SettingsValidationError
165
+ ? error
166
+ : new Error(`Unable to persist global settings: ${errorMessage(error)}`, { cause: error });
167
+ }
168
+ function releaseSettingsLock(release, mutationError) {
169
+ if (!release)
170
+ return mutationError;
171
+ try {
172
+ release();
173
+ return mutationError;
174
+ }
175
+ catch (error) {
176
+ return (mutationError ||
177
+ new Error(`Unable to release global settings lock: ${errorMessage(error)}`, { cause: error }));
178
+ }
179
+ }
180
+ function mutateSettings(mutator, options = {}) {
181
+ if (typeof mutator !== 'function') {
182
+ throw new TypeError('Global settings mutation requires a callback');
183
+ }
184
+ const settingsFile = getSettingsFile();
185
+ const dir = path.dirname(settingsFile);
186
+ const lockfilePath = `${settingsFile}.lock`;
187
+ let release;
188
+ let result;
189
+ let mutationError;
190
+ try {
191
+ fs.mkdirSync(dir, { recursive: true });
192
+ release = acquireSettingsLock(settingsFile, lockfilePath, options.lockTimeoutMs ?? SETTINGS_LOCK_TIMEOUT_MS);
193
+ result = applySettingsMutation(settingsFile, mutator);
194
+ }
195
+ catch (error) {
196
+ mutationError = asMutationError(error);
197
+ }
198
+ finally {
199
+ mutationError = releaseSettingsLock(release, mutationError);
200
+ }
201
+ if (mutationError)
202
+ throw mutationError;
203
+ return result;
204
+ }
205
+ module.exports = { loadSettings, mutateSettings, getSettingsFile, settingsFileExists };
@@ -0,0 +1,7 @@
1
+ declare function validateSetting(key: string, value: unknown): string | null;
2
+ declare function coerceValue(key: string, value: unknown): unknown;
3
+ declare const _default: {
4
+ validateSetting: typeof validateSetting;
5
+ coerceValue: typeof coerceValue;
6
+ };
7
+ export = _default;
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
3
+ const dockerConfig = require('./docker-config');
4
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
5
+ const providerNames = require('./provider-names');
6
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
7
+ const defaults = require('./settings-defaults');
8
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
9
+ const models = require('./settings-models');
10
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
11
+ const issueProviders = require('./settings-issue-providers');
12
+ const { validateMountConfig, validateEnvPassthrough } = dockerConfig;
13
+ const { VALID_PROVIDERS, normalizeProviderName, normalizeProviderSettings } = providerNames;
14
+ const { DEFAULT_SETTINGS } = defaults;
15
+ const { VALID_MODELS } = models;
16
+ const { getIssueProviderFns } = issueProviders;
17
+ function isUnknownRecord(value) {
18
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
19
+ }
20
+ function includesUnknown(values, value) {
21
+ return values.includes(value);
22
+ }
23
+ function validateClaudeCommand(value) {
24
+ if (typeof value !== 'string') {
25
+ return 'claudeCommand must be a string';
26
+ }
27
+ if (value.trim().length === 0) {
28
+ return 'claudeCommand cannot be empty';
29
+ }
30
+ return null;
31
+ }
32
+ function validateProviderSettings(value) {
33
+ const normalizedSettings = normalizeProviderSettings(value);
34
+ if (!isUnknownRecord(value)) {
35
+ return 'providerSettings must be an object';
36
+ }
37
+ if (!isUnknownRecord(normalizedSettings)) {
38
+ return 'providerSettings must be an object';
39
+ }
40
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
41
+ const providers = require('../src/providers');
42
+ for (const [providerName, settings] of Object.entries(normalizedSettings)) {
43
+ if (!VALID_PROVIDERS.includes(providerName)) {
44
+ return `Unknown provider in providerSettings: ${providerName}. Valid providers: ${VALID_PROVIDERS.join(', ')}`;
45
+ }
46
+ try {
47
+ const provider = providers.getProvider(providerName);
48
+ const error = provider.validateSettings(settings);
49
+ if (error)
50
+ return error;
51
+ }
52
+ catch (error) {
53
+ const message = error instanceof Error ? error.message : String(error);
54
+ return `Failed to validate ${providerName} settings: ${message}`;
55
+ }
56
+ }
57
+ return null;
58
+ }
59
+ function validateIssueSourceSetting(key, value) {
60
+ if (key === 'defaultIssueSource') {
61
+ const validSources = getIssueProviderFns().listProviders();
62
+ if (!includesUnknown(validSources, value)) {
63
+ return `Invalid issue source: ${String(value)}. Valid: ${validSources.join(', ')}`;
64
+ }
65
+ return null;
66
+ }
67
+ return getIssueProviderFns().validateIssueProviderSetting(key, value);
68
+ }
69
+ const POSITIVE_INTEGER_SETTINGS = [
70
+ 'maxRetries',
71
+ 'maxRestartAttempts',
72
+ 'maxTotalRestarts',
73
+ 'staleWarningsBeforeKill',
74
+ 'backoffBaseMs',
75
+ 'backoffMaxMs',
76
+ ];
77
+ function validateNumberSetting(key, value) {
78
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
79
+ return `${key} must be a number`;
80
+ }
81
+ if (!Number.isInteger(value)) {
82
+ return `${key} must be an integer`;
83
+ }
84
+ const min = ['backoffBaseMs', 'backoffMaxMs'].includes(key) ? 0 : 1;
85
+ return value < min ? `${key} must be >= ${min}` : null;
86
+ }
87
+ function validateSetting(key, value) {
88
+ if (!(key in DEFAULT_SETTINGS)) {
89
+ return `Unknown setting: ${key}`;
90
+ }
91
+ if (POSITIVE_INTEGER_SETTINGS.includes(key)) {
92
+ const error = validateNumberSetting(key, value);
93
+ if (error)
94
+ return error;
95
+ }
96
+ if (key === 'jitterFactor') {
97
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
98
+ return 'jitterFactor must be a number';
99
+ }
100
+ if (value < 0 || value > 1) {
101
+ return 'jitterFactor must be between 0 and 1';
102
+ }
103
+ }
104
+ if (key === 'maxModel' && !includesUnknown(VALID_MODELS, value)) {
105
+ return `Invalid model: ${String(value)}. Valid models: ${VALID_MODELS.join(', ')}`;
106
+ }
107
+ if (key === 'minModel' && value !== null && !includesUnknown(VALID_MODELS, value)) {
108
+ return `Invalid model: ${String(value)}. Valid models: ${VALID_MODELS.join(', ')}, null`;
109
+ }
110
+ if (key === 'logLevel' && !includesUnknown(['quiet', 'normal', 'verbose'], value)) {
111
+ return `Invalid log level: ${String(value)}. Valid levels: quiet, normal, verbose`;
112
+ }
113
+ if (key === 'defaultDelivery' && !includesUnknown(['none', 'pr', 'ship'], value)) {
114
+ return `Invalid defaultDelivery: ${String(value)}. Valid: none, pr, ship`;
115
+ }
116
+ if (key === 'defaultIsolation' && !includesUnknown(['none', 'worktree', 'docker'], value)) {
117
+ return `Invalid defaultIsolation: ${String(value)}. Valid: none, worktree, docker`;
118
+ }
119
+ if (key === 'claudeCommand')
120
+ return validateClaudeCommand(value);
121
+ if (key === 'defaultProvider') {
122
+ const normalized = normalizeProviderName(value);
123
+ if (typeof normalized !== 'string' || !VALID_PROVIDERS.includes(normalized)) {
124
+ return `Invalid provider: ${String(value)}. Valid providers: ${VALID_PROVIDERS.join(', ')}`;
125
+ }
126
+ }
127
+ if (key === 'providerSettings')
128
+ return validateProviderSettings(value);
129
+ if (key === 'dockerMounts')
130
+ return validateMountConfig(value);
131
+ if (key === 'dockerEnvPassthrough')
132
+ return validateEnvPassthrough(value);
133
+ const issueSourceError = validateIssueSourceSetting(key, value);
134
+ return issueSourceError === undefined ? null : issueSourceError;
135
+ }
136
+ function coerceValue(key, value) {
137
+ const defaultValue = DEFAULT_SETTINGS[key];
138
+ if (key === 'minModel' && (value === 'null' || value === null))
139
+ return null;
140
+ if (typeof defaultValue === 'boolean') {
141
+ return value === 'true' || value === '1' || value === 'yes' || value === true;
142
+ }
143
+ if (typeof defaultValue === 'number') {
144
+ const parsed = parseFloat(String(value));
145
+ if (isNaN(parsed))
146
+ throw new Error(`Invalid number: ${String(value)}`);
147
+ return parsed;
148
+ }
149
+ if (Array.isArray(defaultValue)) {
150
+ if (typeof value === 'string') {
151
+ try {
152
+ const parsed = JSON.parse(value);
153
+ if (!Array.isArray(parsed))
154
+ throw new Error(`${key} must be an array`);
155
+ return parsed;
156
+ }
157
+ catch (error) {
158
+ if (error instanceof SyntaxError) {
159
+ throw new Error(`Invalid JSON for ${key}: ${value}`);
160
+ }
161
+ throw error;
162
+ }
163
+ }
164
+ return value;
165
+ }
166
+ if (key === 'providerSettings') {
167
+ if (typeof value === 'string') {
168
+ try {
169
+ const parsed = JSON.parse(value);
170
+ return normalizeProviderSettings(parsed);
171
+ }
172
+ catch {
173
+ throw new Error(`Invalid JSON for providerSettings: ${value}`);
174
+ }
175
+ }
176
+ return normalizeProviderSettings(value);
177
+ }
178
+ if (key === 'defaultProvider')
179
+ return normalizeProviderName(value);
180
+ return value;
181
+ }
182
+ module.exports = { validateSetting, coerceValue };
@@ -0,0 +1,29 @@
1
+ interface SettingsRecord extends Record<string, unknown> {
2
+ claudeCommand?: string;
3
+ }
4
+ declare function getClaudeCommand(): {
5
+ command: string | undefined;
6
+ args: string[];
7
+ };
8
+ declare const _default: {
9
+ loadSettings: (options?: {
10
+ silent?: unknown;
11
+ }) => SettingsRecord;
12
+ mutateSettings: (mutator: (settings: SettingsRecord) => unknown, options?: {
13
+ lockTimeoutMs?: number;
14
+ }) => unknown;
15
+ validateSetting: (key: string, value: unknown) => string | null;
16
+ coerceValue: (key: string, value: unknown) => unknown;
17
+ SettingsValidationError: ErrorConstructor;
18
+ DEFAULT_SETTINGS: SettingsRecord;
19
+ getSettingsFile: () => string;
20
+ settingsFileExists: () => boolean;
21
+ getClaudeCommand: typeof getClaudeCommand;
22
+ MODEL_HIERARCHY: Readonly<Record<string, number>>;
23
+ VALID_MODELS: readonly string[];
24
+ validateModelAgainstMax: (requestedModel: string | null | undefined, maxModel: string, minModel?: string | null) => string;
25
+ clearProviderDefaultsCache: () => void;
26
+ mapLegacyModelToLevel: (model: unknown) => "level1" | "level2" | "level3" | null;
27
+ readonly SETTINGS_FILE: string;
28
+ };
29
+ export = _default;