@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,277 @@
1
+ import crypto = require('crypto');
2
+ import fs = require('fs');
3
+ import os = require('os');
4
+ import path = require('path');
5
+
6
+ interface SettingsRecord extends Record<string, unknown> {
7
+ autoCheckUpdates?: unknown;
8
+ lastUpdateCheckClaim?: unknown;
9
+ updatePolicy?: unknown;
10
+ }
11
+
12
+ interface DefaultsFacade {
13
+ resolvedDefaultSettings(): SettingsRecord;
14
+ mergeLoadedSettings(parsed: SettingsRecord): SettingsRecord;
15
+ }
16
+
17
+ interface LockOptions {
18
+ lockfilePath: string;
19
+ realpath: boolean;
20
+ stale: number;
21
+ }
22
+
23
+ interface LockfileFacade {
24
+ lockSync(settingsFile: string, options: LockOptions): ReleaseLock;
25
+ }
26
+
27
+ interface LoadOptions {
28
+ silent?: unknown;
29
+ }
30
+
31
+ interface MutationOptions {
32
+ lockTimeoutMs?: number;
33
+ }
34
+
35
+ interface MutationState {
36
+ settings: SettingsRecord;
37
+ requiresClaimInvalidation: boolean;
38
+ requiresRecovery: boolean;
39
+ }
40
+
41
+ type SettingsMutator = (settings: SettingsRecord) => unknown;
42
+ type ReleaseLock = () => void;
43
+
44
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
45
+ const lockfile: LockfileFacade = require('proper-lockfile');
46
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
47
+ const defaults: DefaultsFacade = require('./settings-defaults');
48
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
49
+ const { SettingsValidationError }: { SettingsValidationError: typeof Error } =
50
+ require('./settings-error');
51
+
52
+ const { resolvedDefaultSettings, mergeLoadedSettings } = defaults;
53
+ const SETTINGS_LOCK_STALE_MS = 5000;
54
+ const SETTINGS_LOCK_TIMEOUT_MS = 500;
55
+ const SETTINGS_LOCK_RETRY_MS = 20;
56
+ const SETTINGS_LOCK_SLEEP = new Int32Array(new SharedArrayBuffer(4));
57
+
58
+ function isSettingsRecord(value: unknown): value is SettingsRecord {
59
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
60
+ }
61
+
62
+ function errorCode(error: unknown): unknown {
63
+ return error !== null && typeof error === 'object' && 'code' in error ? error.code : undefined;
64
+ }
65
+
66
+ function errorMessage(error: unknown): string {
67
+ return error instanceof Error ? error.message : String(error);
68
+ }
69
+
70
+ function isPromiseLike(value: unknown): value is PromiseLike<unknown> {
71
+ return (
72
+ value !== null &&
73
+ typeof value === 'object' &&
74
+ 'then' in value &&
75
+ typeof value.then === 'function'
76
+ );
77
+ }
78
+
79
+ function getSettingsFile(): string {
80
+ return (
81
+ process.env.ZEROSHOT_SETTINGS_FILE || path.join(os.homedir(), '.zeroshot', 'settings.json')
82
+ );
83
+ }
84
+
85
+ function settingsFileExists(): boolean {
86
+ return fs.existsSync(getSettingsFile());
87
+ }
88
+
89
+ function loadSettings(options: LoadOptions = {}): SettingsRecord {
90
+ const settingsFile = getSettingsFile();
91
+ if (!fs.existsSync(settingsFile)) {
92
+ return resolvedDefaultSettings();
93
+ }
94
+ try {
95
+ const parsed: unknown = JSON.parse(fs.readFileSync(settingsFile, 'utf8'));
96
+ if (!isSettingsRecord(parsed)) {
97
+ throw new TypeError('settings file must contain an object');
98
+ }
99
+ return mergeLoadedSettings(parsed);
100
+ } catch {
101
+ if (!options.silent) console.error('Warning: Could not load settings, using defaults');
102
+ return resolvedDefaultSettings();
103
+ }
104
+ }
105
+
106
+ function readSettingsForMutation(settingsFile: string): MutationState {
107
+ if (!fs.existsSync(settingsFile)) {
108
+ return {
109
+ settings: resolvedDefaultSettings(),
110
+ requiresClaimInvalidation: false,
111
+ requiresRecovery: false,
112
+ };
113
+ }
114
+ let parsed: unknown;
115
+ try {
116
+ parsed = JSON.parse(fs.readFileSync(settingsFile, 'utf8'));
117
+ } catch (error: unknown) {
118
+ if (!(error instanceof SyntaxError)) throw error;
119
+ return {
120
+ settings: resolvedDefaultSettings(),
121
+ requiresClaimInvalidation: false,
122
+ requiresRecovery: true,
123
+ };
124
+ }
125
+ if (!isSettingsRecord(parsed)) {
126
+ return {
127
+ settings: resolvedDefaultSettings(),
128
+ requiresClaimInvalidation: false,
129
+ requiresRecovery: true,
130
+ };
131
+ }
132
+
133
+ const updatesDisabled = parsed.autoCheckUpdates === false || parsed.updatePolicy === 'off';
134
+ return {
135
+ settings: mergeLoadedSettings(parsed),
136
+ requiresClaimInvalidation: updatesDisabled && parsed.lastUpdateCheckClaim !== null,
137
+ requiresRecovery: false,
138
+ };
139
+ }
140
+
141
+ function getAtomicSettingsMode(settingsFile: string): number {
142
+ try {
143
+ return fs.statSync(settingsFile).mode & 0o600;
144
+ } catch (error: unknown) {
145
+ if (errorCode(error) === 'ENOENT') return 0o600;
146
+ throw error;
147
+ }
148
+ }
149
+
150
+ function atomicWriteSettings(settingsFile: string, settings: SettingsRecord): void {
151
+ const dir = path.dirname(settingsFile);
152
+ const temporaryFile = path.join(
153
+ dir,
154
+ `.${path.basename(settingsFile)}.${process.pid}.${crypto.randomUUID()}.tmp`
155
+ );
156
+
157
+ let operationError: unknown;
158
+ try {
159
+ fs.writeFileSync(temporaryFile, JSON.stringify(settings, null, 2), {
160
+ encoding: 'utf8',
161
+ flag: 'wx',
162
+ mode: getAtomicSettingsMode(settingsFile),
163
+ });
164
+ fs.renameSync(temporaryFile, settingsFile);
165
+ } catch (error: unknown) {
166
+ operationError = error;
167
+ }
168
+
169
+ try {
170
+ fs.unlinkSync(temporaryFile);
171
+ } catch (error: unknown) {
172
+ if (errorCode(error) !== 'ENOENT' && !operationError) operationError = error;
173
+ }
174
+ if (operationError) throw operationError;
175
+ }
176
+
177
+ function acquireSettingsLock(
178
+ settingsFile: string,
179
+ lockfilePath: string,
180
+ timeoutMs: number
181
+ ): ReleaseLock {
182
+ const deadline = Date.now() + timeoutMs;
183
+ return tryAcquireSettingsLock(settingsFile, lockfilePath, deadline);
184
+ }
185
+
186
+ function shouldRetrySettingsLock(error: unknown, deadline: number): boolean {
187
+ return errorCode(error) === 'ELOCKED' && Date.now() < deadline;
188
+ }
189
+
190
+ function tryAcquireSettingsLock(
191
+ settingsFile: string,
192
+ lockfilePath: string,
193
+ deadline: number
194
+ ): ReleaseLock {
195
+ try {
196
+ return lockfile.lockSync(settingsFile, {
197
+ lockfilePath,
198
+ realpath: false,
199
+ stale: SETTINGS_LOCK_STALE_MS,
200
+ });
201
+ } catch (error: unknown) {
202
+ if (!shouldRetrySettingsLock(error, deadline)) throw error;
203
+ Atomics.wait(SETTINGS_LOCK_SLEEP, 0, 0, SETTINGS_LOCK_RETRY_MS);
204
+ return tryAcquireSettingsLock(settingsFile, lockfilePath, deadline);
205
+ }
206
+ }
207
+
208
+ function applySettingsMutation(settingsFile: string, mutator: SettingsMutator): unknown {
209
+ const { settings, requiresClaimInvalidation, requiresRecovery } =
210
+ readSettingsForMutation(settingsFile);
211
+ const before = JSON.stringify(settings);
212
+ const result = mutator(settings);
213
+ if (isPromiseLike(result)) {
214
+ throw new TypeError('Global settings mutations must be synchronous');
215
+ }
216
+ if (settings.autoCheckUpdates === false || settings.updatePolicy === 'off') {
217
+ settings.lastUpdateCheckClaim = null;
218
+ }
219
+ if (requiresRecovery || requiresClaimInvalidation || JSON.stringify(settings) !== before) {
220
+ atomicWriteSettings(settingsFile, settings);
221
+ }
222
+ return result;
223
+ }
224
+
225
+ function asMutationError(error: unknown): Error {
226
+ return error instanceof SettingsValidationError
227
+ ? error
228
+ : new Error(`Unable to persist global settings: ${errorMessage(error)}`, { cause: error });
229
+ }
230
+
231
+ function releaseSettingsLock(
232
+ release: ReleaseLock | undefined,
233
+ mutationError: Error | undefined
234
+ ): Error | undefined {
235
+ if (!release) return mutationError;
236
+ try {
237
+ release();
238
+ return mutationError;
239
+ } catch (error: unknown) {
240
+ return (
241
+ mutationError ||
242
+ new Error(`Unable to release global settings lock: ${errorMessage(error)}`, { cause: error })
243
+ );
244
+ }
245
+ }
246
+
247
+ function mutateSettings(mutator: SettingsMutator, options: MutationOptions = {}): unknown {
248
+ if (typeof mutator !== 'function') {
249
+ throw new TypeError('Global settings mutation requires a callback');
250
+ }
251
+
252
+ const settingsFile = getSettingsFile();
253
+ const dir = path.dirname(settingsFile);
254
+ const lockfilePath = `${settingsFile}.lock`;
255
+ let release: ReleaseLock | undefined;
256
+ let result: unknown;
257
+ let mutationError: Error | undefined;
258
+
259
+ try {
260
+ fs.mkdirSync(dir, { recursive: true });
261
+ release = acquireSettingsLock(
262
+ settingsFile,
263
+ lockfilePath,
264
+ options.lockTimeoutMs ?? SETTINGS_LOCK_TIMEOUT_MS
265
+ );
266
+
267
+ result = applySettingsMutation(settingsFile, mutator);
268
+ } catch (error: unknown) {
269
+ mutationError = asMutationError(error);
270
+ } finally {
271
+ mutationError = releaseSettingsLock(release, mutationError);
272
+ }
273
+ if (mutationError) throw mutationError;
274
+ return result;
275
+ }
276
+
277
+ export = { loadSettings, mutateSettings, getSettingsFile, settingsFileExists };
@@ -0,0 +1,220 @@
1
+ interface SettingsRecord extends Record<string, unknown> {}
2
+
3
+ interface DockerConfigFacade {
4
+ validateMountConfig(value: unknown): string | null;
5
+ validateEnvPassthrough(value: unknown): string | null;
6
+ }
7
+
8
+ interface ProviderNamesFacade {
9
+ VALID_PROVIDERS: readonly string[];
10
+ normalizeProviderName<T>(name: T): T | string;
11
+ normalizeProviderSettings<T>(settings: T): T | Record<string, unknown>;
12
+ }
13
+
14
+ interface DefaultsFacade {
15
+ DEFAULT_SETTINGS: SettingsRecord;
16
+ }
17
+
18
+ interface ModelsFacade {
19
+ VALID_MODELS: readonly string[];
20
+ }
21
+
22
+ interface ProviderFacade {
23
+ validateSettings(settings: unknown): string | null;
24
+ }
25
+
26
+ interface ProvidersFacade {
27
+ getProvider(providerId: string): ProviderFacade;
28
+ }
29
+
30
+ interface IssueProviderLoaderFacade {
31
+ getIssueProviderFns(): {
32
+ listProviders(): readonly string[];
33
+ validateIssueProviderSetting(key: string, value: unknown): string | null | undefined;
34
+ };
35
+ }
36
+
37
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
38
+ const dockerConfig: DockerConfigFacade = require('./docker-config');
39
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
40
+ const providerNames: ProviderNamesFacade = require('./provider-names');
41
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
42
+ const defaults: DefaultsFacade = require('./settings-defaults');
43
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
44
+ const models: ModelsFacade = require('./settings-models');
45
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
46
+ const issueProviders: IssueProviderLoaderFacade = require('./settings-issue-providers');
47
+
48
+ const { validateMountConfig, validateEnvPassthrough } = dockerConfig;
49
+ const { VALID_PROVIDERS, normalizeProviderName, normalizeProviderSettings } = providerNames;
50
+ const { DEFAULT_SETTINGS } = defaults;
51
+ const { VALID_MODELS } = models;
52
+ const { getIssueProviderFns } = issueProviders;
53
+
54
+ function isUnknownRecord(value: unknown): value is Record<string, unknown> {
55
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
56
+ }
57
+
58
+ function includesUnknown(values: readonly unknown[], value: unknown): boolean {
59
+ return values.includes(value);
60
+ }
61
+
62
+ function validateClaudeCommand(value: unknown): string | null {
63
+ if (typeof value !== 'string') {
64
+ return 'claudeCommand must be a string';
65
+ }
66
+ if (value.trim().length === 0) {
67
+ return 'claudeCommand cannot be empty';
68
+ }
69
+ return null;
70
+ }
71
+
72
+ function validateProviderSettings(value: unknown): string | null {
73
+ const normalizedSettings = normalizeProviderSettings(value);
74
+ if (!isUnknownRecord(value)) {
75
+ return 'providerSettings must be an object';
76
+ }
77
+
78
+ if (!isUnknownRecord(normalizedSettings)) {
79
+ return 'providerSettings must be an object';
80
+ }
81
+
82
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
83
+ const providers: ProvidersFacade = require('../src/providers');
84
+ for (const [providerName, settings] of Object.entries(normalizedSettings)) {
85
+ if (!VALID_PROVIDERS.includes(providerName)) {
86
+ return `Unknown provider in providerSettings: ${providerName}. Valid providers: ${VALID_PROVIDERS.join(', ')}`;
87
+ }
88
+
89
+ try {
90
+ const provider = providers.getProvider(providerName);
91
+ const error = provider.validateSettings(settings);
92
+ if (error) return error;
93
+ } catch (error: unknown) {
94
+ const message = error instanceof Error ? error.message : String(error);
95
+ return `Failed to validate ${providerName} settings: ${message}`;
96
+ }
97
+ }
98
+ return null;
99
+ }
100
+
101
+ function validateIssueSourceSetting(key: string, value: unknown): string | null | undefined {
102
+ if (key === 'defaultIssueSource') {
103
+ const validSources = getIssueProviderFns().listProviders();
104
+ if (!includesUnknown(validSources, value)) {
105
+ return `Invalid issue source: ${String(value)}. Valid: ${validSources.join(', ')}`;
106
+ }
107
+ return null;
108
+ }
109
+ return getIssueProviderFns().validateIssueProviderSetting(key, value);
110
+ }
111
+
112
+ const POSITIVE_INTEGER_SETTINGS = [
113
+ 'maxRetries',
114
+ 'maxRestartAttempts',
115
+ 'maxTotalRestarts',
116
+ 'staleWarningsBeforeKill',
117
+ 'backoffBaseMs',
118
+ 'backoffMaxMs',
119
+ ];
120
+
121
+ function validateNumberSetting(key: string, value: unknown): string | null {
122
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
123
+ return `${key} must be a number`;
124
+ }
125
+ if (!Number.isInteger(value)) {
126
+ return `${key} must be an integer`;
127
+ }
128
+ const min = ['backoffBaseMs', 'backoffMaxMs'].includes(key) ? 0 : 1;
129
+ return value < min ? `${key} must be >= ${min}` : null;
130
+ }
131
+
132
+ function validateSetting(key: string, value: unknown): string | null {
133
+ if (!(key in DEFAULT_SETTINGS)) {
134
+ return `Unknown setting: ${key}`;
135
+ }
136
+
137
+ if (POSITIVE_INTEGER_SETTINGS.includes(key)) {
138
+ const error = validateNumberSetting(key, value);
139
+ if (error) return error;
140
+ }
141
+ if (key === 'jitterFactor') {
142
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
143
+ return 'jitterFactor must be a number';
144
+ }
145
+ if (value < 0 || value > 1) {
146
+ return 'jitterFactor must be between 0 and 1';
147
+ }
148
+ }
149
+ if (key === 'maxModel' && !includesUnknown(VALID_MODELS, value)) {
150
+ return `Invalid model: ${String(value)}. Valid models: ${VALID_MODELS.join(', ')}`;
151
+ }
152
+ if (key === 'minModel' && value !== null && !includesUnknown(VALID_MODELS, value)) {
153
+ return `Invalid model: ${String(value)}. Valid models: ${VALID_MODELS.join(', ')}, null`;
154
+ }
155
+ if (key === 'logLevel' && !includesUnknown(['quiet', 'normal', 'verbose'], value)) {
156
+ return `Invalid log level: ${String(value)}. Valid levels: quiet, normal, verbose`;
157
+ }
158
+ if (key === 'defaultDelivery' && !includesUnknown(['none', 'pr', 'ship'], value)) {
159
+ return `Invalid defaultDelivery: ${String(value)}. Valid: none, pr, ship`;
160
+ }
161
+ if (key === 'defaultIsolation' && !includesUnknown(['none', 'worktree', 'docker'], value)) {
162
+ return `Invalid defaultIsolation: ${String(value)}. Valid: none, worktree, docker`;
163
+ }
164
+ if (key === 'claudeCommand') return validateClaudeCommand(value);
165
+ if (key === 'defaultProvider') {
166
+ const normalized = normalizeProviderName(value);
167
+ if (typeof normalized !== 'string' || !VALID_PROVIDERS.includes(normalized)) {
168
+ return `Invalid provider: ${String(value)}. Valid providers: ${VALID_PROVIDERS.join(', ')}`;
169
+ }
170
+ }
171
+ if (key === 'providerSettings') return validateProviderSettings(value);
172
+ if (key === 'dockerMounts') return validateMountConfig(value);
173
+ if (key === 'dockerEnvPassthrough') return validateEnvPassthrough(value);
174
+
175
+ const issueSourceError = validateIssueSourceSetting(key, value);
176
+ return issueSourceError === undefined ? null : issueSourceError;
177
+ }
178
+
179
+ function coerceValue(key: string, value: unknown): unknown {
180
+ const defaultValue = DEFAULT_SETTINGS[key];
181
+ if (key === 'minModel' && (value === 'null' || value === null)) return null;
182
+ if (typeof defaultValue === 'boolean') {
183
+ return value === 'true' || value === '1' || value === 'yes' || value === true;
184
+ }
185
+ if (typeof defaultValue === 'number') {
186
+ const parsed = parseFloat(String(value));
187
+ if (isNaN(parsed)) throw new Error(`Invalid number: ${String(value)}`);
188
+ return parsed;
189
+ }
190
+ if (Array.isArray(defaultValue)) {
191
+ if (typeof value === 'string') {
192
+ try {
193
+ const parsed: unknown = JSON.parse(value);
194
+ if (!Array.isArray(parsed)) throw new Error(`${key} must be an array`);
195
+ return parsed;
196
+ } catch (error: unknown) {
197
+ if (error instanceof SyntaxError) {
198
+ throw new Error(`Invalid JSON for ${key}: ${value}`);
199
+ }
200
+ throw error;
201
+ }
202
+ }
203
+ return value;
204
+ }
205
+ if (key === 'providerSettings') {
206
+ if (typeof value === 'string') {
207
+ try {
208
+ const parsed: unknown = JSON.parse(value);
209
+ return normalizeProviderSettings(parsed);
210
+ } catch {
211
+ throw new Error(`Invalid JSON for providerSettings: ${value}`);
212
+ }
213
+ }
214
+ return normalizeProviderSettings(value);
215
+ }
216
+ if (key === 'defaultProvider') return normalizeProviderName(value);
217
+ return value;
218
+ }
219
+
220
+ export = { validateSetting, coerceValue };
@@ -0,0 +1,87 @@
1
+ interface SettingsRecord extends Record<string, unknown> {
2
+ claudeCommand?: string;
3
+ }
4
+
5
+ interface StorageFacade {
6
+ loadSettings(options?: { silent?: unknown }): SettingsRecord;
7
+ mutateSettings(
8
+ mutator: (settings: SettingsRecord) => unknown,
9
+ options?: { lockTimeoutMs?: number }
10
+ ): unknown;
11
+ getSettingsFile(): string;
12
+ settingsFileExists(): boolean;
13
+ }
14
+
15
+ interface ValidationFacade {
16
+ validateSetting(key: string, value: unknown): string | null;
17
+ coerceValue(key: string, value: unknown): unknown;
18
+ }
19
+
20
+ interface ModelsFacade {
21
+ MODEL_HIERARCHY: Readonly<Record<string, number>>;
22
+ VALID_MODELS: readonly string[];
23
+ validateModelAgainstMax(
24
+ requestedModel: string | null | undefined,
25
+ maxModel: string,
26
+ minModel?: string | null
27
+ ): string;
28
+ mapLegacyModelToLevel(model: unknown): 'level1' | 'level2' | 'level3' | null;
29
+ }
30
+
31
+ interface DefaultsFacade {
32
+ DEFAULT_SETTINGS: SettingsRecord;
33
+ }
34
+
35
+ interface ProviderDefaultsFacade {
36
+ clearProviderDefaultsCache(): void;
37
+ }
38
+
39
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
40
+ const storage: StorageFacade = require('./settings-storage');
41
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
42
+ const validation: ValidationFacade = require('./settings-validation');
43
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
44
+ const models: ModelsFacade = require('./settings-models');
45
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
46
+ const defaults: DefaultsFacade = require('./settings-defaults');
47
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
48
+ const providerDefaults: ProviderDefaultsFacade = require('./provider-defaults');
49
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
50
+ const { SettingsValidationError }: { SettingsValidationError: typeof Error } =
51
+ require('./settings-error');
52
+
53
+ const { loadSettings, mutateSettings, getSettingsFile, settingsFileExists } = storage;
54
+ const { validateSetting, coerceValue } = validation;
55
+ const { MODEL_HIERARCHY, VALID_MODELS, validateModelAgainstMax, mapLegacyModelToLevel } = models;
56
+ const { DEFAULT_SETTINGS } = defaults;
57
+ const { clearProviderDefaultsCache } = providerDefaults;
58
+
59
+ function getClaudeCommand(): { command: string | undefined; args: string[] } {
60
+ const settings = loadSettings();
61
+ const raw = process.env.ZEROSHOT_CLAUDE_COMMAND || settings.claudeCommand || 'claude';
62
+ const parts = raw.trim().split(/\s+/);
63
+ return {
64
+ command: parts[0],
65
+ args: parts.slice(1),
66
+ };
67
+ }
68
+
69
+ export = {
70
+ loadSettings,
71
+ mutateSettings,
72
+ validateSetting,
73
+ coerceValue,
74
+ SettingsValidationError,
75
+ DEFAULT_SETTINGS,
76
+ getSettingsFile,
77
+ settingsFileExists,
78
+ getClaudeCommand,
79
+ MODEL_HIERARCHY,
80
+ VALID_MODELS,
81
+ validateModelAgainstMax,
82
+ clearProviderDefaultsCache,
83
+ mapLegacyModelToLevel,
84
+ get SETTINGS_FILE(): string {
85
+ return getSettingsFile();
86
+ },
87
+ };
@@ -0,0 +1,70 @@
1
+ export type SettingsMap = Record<string, unknown>;
2
+ export type DecisionScope = 'global' | 'repo';
3
+
4
+ export interface DecisionTarget {
5
+ path: string;
6
+ scope: DecisionScope;
7
+ }
8
+
9
+ export interface JournalEntry {
10
+ appliedAt: string;
11
+ appliedValue: unknown;
12
+ path: string;
13
+ priorValue: unknown;
14
+ repoRoot: string | null;
15
+ scope: string;
16
+ }
17
+
18
+ export interface SetupJournal {
19
+ entries: JournalEntry[];
20
+ version: number;
21
+ }
22
+
23
+ export interface ApplyDependencies {
24
+ VALID_PROVIDERS: readonly string[];
25
+ checkGhAuth(): { authenticated?: unknown } | null;
26
+ listIssueProviders(): string[];
27
+ loadSettings(): SettingsMap;
28
+ mutateSettings<T>(mutator: (settings: SettingsMap) => T): T;
29
+ now(): string;
30
+ readFile(filePath: string): string;
31
+ readRepoSettings(cwd: string): { repoRoot: string | null; settings: SettingsMap | null };
32
+ writeRepoSettings(repoRoot: string | null, settings: SettingsMap): unknown;
33
+ }
34
+
35
+ export interface ResolvedDecision {
36
+ decisionId: string;
37
+ inputValue: unknown;
38
+ target: DecisionTarget;
39
+ writeValue: unknown;
40
+ }
41
+
42
+ export interface DecisionResult {
43
+ applied: boolean;
44
+ decisionId: string;
45
+ from: unknown;
46
+ skippedReason?: string;
47
+ to: unknown;
48
+ }
49
+
50
+ export interface PendingWrite {
51
+ path: string;
52
+ priorValue: unknown;
53
+ scope: DecisionScope;
54
+ settingsObj: SettingsMap;
55
+ writeValue: unknown;
56
+ }
57
+
58
+ interface SharedApplyParams {
59
+ allowRiskyDefaults?: boolean;
60
+ cwd: string;
61
+ deps?: Partial<ApplyDependencies>;
62
+ }
63
+
64
+ export interface ApplyDecisionValuesParams extends SharedApplyParams {
65
+ decisions: unknown;
66
+ }
67
+
68
+ export interface ApplyDecisionsParams extends SharedApplyParams {
69
+ decisionsPath: string;
70
+ }