@the-open-engine/zeroshot 6.38.1 → 6.39.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (383) hide show
  1. package/README.md +6 -0
  2. package/cli/event-copy.js +8 -7
  3. package/cli/event-copy.ts +12 -0
  4. package/cli/index.js +67 -48
  5. package/cli/json-export.js +61 -64
  6. package/cli/json-export.ts +112 -0
  7. package/cli/message-formatter-utils.js +68 -56
  8. package/cli/message-formatter-utils.ts +121 -0
  9. package/cli/message-formatters-normal.js +124 -259
  10. package/cli/message-formatters-normal.ts +250 -0
  11. package/cli/message-formatters-watch.js +81 -84
  12. package/cli/message-formatters-watch.ts +189 -0
  13. package/lib/cluster/generated/protocol-schema.cjs +1 -1
  14. package/lib/cluster/generated/protocol-schema.mjs +1 -1
  15. package/lib/cluster/generated/protocol.d.cts +8 -0
  16. package/lib/cluster/generated/protocol.d.mts +8 -0
  17. package/lib/cluster/generated/protocol.d.ts +8 -0
  18. package/lib/clusters-registry.d.ts +23 -0
  19. package/lib/clusters-registry.js +17 -29
  20. package/lib/completion.d.ts +12 -0
  21. package/lib/completion.js +84 -94
  22. package/lib/compose-utils.d.ts +32 -0
  23. package/lib/compose-utils.js +57 -72
  24. package/lib/detached-startup.d.ts +84 -0
  25. package/lib/detached-startup.js +232 -302
  26. package/lib/docker-config.d.ts +43 -0
  27. package/lib/docker-config.js +150 -325
  28. package/lib/docker-env-auth.d.ts +17 -0
  29. package/lib/docker-env-auth.js +75 -0
  30. package/lib/git-remote-utils.d.ts +48 -0
  31. package/lib/git-remote-utils.js +147 -213
  32. package/lib/id-detector.d.ts +15 -0
  33. package/lib/id-detector.js +37 -41
  34. package/lib/path-check.d.ts +30 -0
  35. package/lib/path-check.js +42 -45
  36. package/lib/process-liveness.d.ts +16 -0
  37. package/lib/process-liveness.js +19 -12
  38. package/lib/provider-credential-path.d.ts +16 -0
  39. package/lib/provider-credential-path.js +31 -29
  40. package/lib/provider-defaults.d.ts +30 -0
  41. package/lib/provider-defaults.js +47 -42
  42. package/lib/provider-detection.d.ts +11 -0
  43. package/lib/provider-detection.js +91 -54
  44. package/lib/provider-names.d.ts +38 -0
  45. package/lib/provider-names.js +56 -64
  46. package/lib/repo-settings.d.ts +28 -0
  47. package/lib/repo-settings.js +83 -59
  48. package/lib/run-mode.d.ts +21 -0
  49. package/lib/run-mode.js +21 -20
  50. package/lib/run-plan.d.ts +28 -0
  51. package/lib/run-plan.js +17 -16
  52. package/lib/settings/claude-auth.d.ts +35 -0
  53. package/lib/settings/claude-auth.js +30 -47
  54. package/lib/settings-defaults.d.ts +20 -0
  55. package/lib/settings-defaults.js +149 -0
  56. package/lib/settings-error.d.ts +7 -0
  57. package/lib/settings-error.js +8 -0
  58. package/lib/settings-issue-providers.d.ts +10 -0
  59. package/lib/settings-issue-providers.js +12 -0
  60. package/lib/settings-models.d.ts +22 -0
  61. package/lib/settings-models.js +93 -0
  62. package/lib/settings-storage.d.ts +23 -0
  63. package/lib/settings-storage.js +205 -0
  64. package/lib/settings-validation.d.ts +7 -0
  65. package/lib/settings-validation.js +182 -0
  66. package/lib/settings.d.ts +29 -0
  67. package/lib/settings.js +41 -736
  68. package/lib/setup-apply-types.d.ts +66 -0
  69. package/lib/setup-apply-types.js +2 -0
  70. package/lib/setup-apply.d.ts +39 -0
  71. package/lib/setup-apply.js +267 -264
  72. package/lib/setup-journal.d.ts +41 -0
  73. package/lib/setup-journal.js +119 -76
  74. package/lib/setup-plan-types.d.ts +102 -0
  75. package/lib/setup-plan-types.js +2 -0
  76. package/lib/setup-plan.d.ts +30 -0
  77. package/lib/setup-plan.js +300 -324
  78. package/lib/setup-undo.d.ts +44 -0
  79. package/lib/setup-undo.js +61 -74
  80. package/lib/start-cluster-config.d.ts +26 -0
  81. package/lib/start-cluster-config.js +56 -0
  82. package/lib/start-cluster-environment.d.ts +41 -0
  83. package/lib/start-cluster-environment.js +134 -0
  84. package/lib/start-cluster-run-options.d.ts +54 -0
  85. package/lib/start-cluster-run-options.js +148 -0
  86. package/lib/start-cluster.d.ts +64 -0
  87. package/lib/start-cluster.js +98 -454
  88. package/lib/stream-json-parser.d.ts +17 -0
  89. package/lib/stream-json-parser.js +51 -52
  90. package/npm-shrinkwrap.json +6 -8
  91. package/package.json +14 -8
  92. package/scripts/postinstall.js +27 -0
  93. package/scripts/rust-distribution.js +36 -45
  94. package/src/agent/agent-command-proofs-context.js +35 -45
  95. package/src/agent/agent-command-proofs-context.ts +87 -0
  96. package/src/agent/agent-config-settings.js +19 -0
  97. package/src/agent/agent-config-settings.ts +41 -0
  98. package/src/agent/agent-config.js +122 -231
  99. package/src/agent/agent-config.ts +285 -0
  100. package/src/agent/agent-context-builder.js +38 -273
  101. package/src/agent/agent-context-builder.ts +51 -0
  102. package/src/agent/agent-context-environment-sections.js +105 -0
  103. package/src/agent/agent-context-environment-sections.ts +134 -0
  104. package/src/agent/agent-context-packs.js +165 -0
  105. package/src/agent/agent-context-packs.ts +296 -0
  106. package/src/agent/agent-context-prompt-sections.js +100 -0
  107. package/src/agent/agent-context-prompt-sections.ts +148 -0
  108. package/src/agent/agent-context-sections.js +25 -334
  109. package/src/agent/agent-context-sections.ts +36 -0
  110. package/src/agent/agent-context-sources.js +96 -149
  111. package/src/agent/agent-context-sources.ts +253 -0
  112. package/src/agent/agent-context-types.js +2 -0
  113. package/src/agent/agent-context-types.ts +132 -0
  114. package/src/agent/agent-context-validation-sections.js +73 -0
  115. package/src/agent/agent-context-validation-sections.ts +129 -0
  116. package/src/agent/agent-input-injector.js +99 -118
  117. package/src/agent/agent-input-injector.ts +195 -0
  118. package/src/agent/agent-liveness-poll.js +74 -78
  119. package/src/agent/agent-liveness-poll.ts +163 -0
  120. package/src/agent/agent-quality-gate-schema.js +77 -86
  121. package/src/agent/agent-quality-gate-schema.ts +135 -0
  122. package/src/agent/agent-quality-gates-context.js +44 -50
  123. package/src/agent/agent-quality-gates-context.ts +91 -0
  124. package/src/agent/agent-stuck-detector.js +171 -239
  125. package/src/agent/agent-stuck-detector.ts +288 -0
  126. package/src/agent/agent-trigger-evaluator.js +29 -46
  127. package/src/agent/agent-trigger-evaluator.ts +98 -0
  128. package/src/agent/context-metrics.js +110 -141
  129. package/src/agent/context-metrics.ts +261 -0
  130. package/src/agent/context-pack-builder.js +72 -358
  131. package/src/agent/context-pack-builder.ts +105 -0
  132. package/src/agent/context-pack-core.js +70 -0
  133. package/src/agent/context-pack-core.ts +96 -0
  134. package/src/agent/context-pack-selection.js +119 -0
  135. package/src/agent/context-pack-selection.ts +187 -0
  136. package/src/agent/context-pack-truncation.js +139 -0
  137. package/src/agent/context-pack-truncation.ts +208 -0
  138. package/src/agent/context-pack-types.js +2 -0
  139. package/src/agent/context-pack-types.ts +98 -0
  140. package/src/agent/context-replay-policy.js +30 -39
  141. package/src/agent/context-replay-policy.ts +71 -0
  142. package/src/agent/critical-agent-policy.js +6 -10
  143. package/src/agent/critical-agent-policy.ts +20 -0
  144. package/src/agent/guidance-queue.js +74 -87
  145. package/src/agent/guidance-queue.ts +166 -0
  146. package/src/agent/output-extraction-error-detail.js +45 -0
  147. package/src/agent/output-extraction-error-detail.ts +49 -0
  148. package/src/agent/output-extraction-failures.js +125 -0
  149. package/src/agent/output-extraction-failures.ts +149 -0
  150. package/src/agent/output-extraction-json.js +234 -0
  151. package/src/agent/output-extraction-json.ts +235 -0
  152. package/src/agent/output-extraction-pi.js +124 -0
  153. package/src/agent/output-extraction-pi.ts +137 -0
  154. package/src/agent/output-extraction-types.js +2 -0
  155. package/src/agent/output-extraction-types.ts +49 -0
  156. package/src/agent/output-extraction.js +17 -617
  157. package/src/agent/output-extraction.ts +30 -0
  158. package/src/agent/output-reformatter-errors.js +83 -0
  159. package/src/agent/output-reformatter-errors.ts +106 -0
  160. package/src/agent/output-reformatter-types.js +2 -0
  161. package/src/agent/output-reformatter-types.ts +86 -0
  162. package/src/agent/output-reformatter.js +140 -185
  163. package/src/agent/output-reformatter.ts +238 -0
  164. package/src/agent/pi-terminal-lifecycle-types.js +2 -0
  165. package/src/agent/pi-terminal-lifecycle-types.ts +41 -0
  166. package/src/agent/pi-terminal-lifecycle.js +186 -206
  167. package/src/agent/pi-terminal-lifecycle.ts +297 -0
  168. package/src/agent/provider-control-plane.js +22 -21
  169. package/src/agent/provider-control-plane.ts +52 -0
  170. package/src/agent/provider-terminal-failure-types.js +2 -0
  171. package/src/agent/provider-terminal-failure-types.ts +60 -0
  172. package/src/agent/provider-terminal-failure.js +194 -191
  173. package/src/agent/provider-terminal-failure.ts +262 -0
  174. package/src/agent/rate-limit-backoff.js +31 -74
  175. package/src/agent/rate-limit-backoff.ts +71 -0
  176. package/src/agent/schema-utils.js +85 -125
  177. package/src/agent/schema-utils.ts +148 -0
  178. package/src/agent/structured-output-error.js +34 -33
  179. package/src/agent/structured-output-error.ts +105 -0
  180. package/src/agent/validation-platform.js +27 -27
  181. package/src/agent/validation-platform.ts +49 -0
  182. package/src/agents/git-pusher-template.js +17 -34
  183. package/src/attach/attach-client.js +232 -405
  184. package/src/attach/attach-client.ts +300 -0
  185. package/src/attach/attach-server-cleanup.js +43 -0
  186. package/src/attach/attach-server-cleanup.ts +39 -0
  187. package/src/attach/attach-server-clients.js +117 -0
  188. package/src/attach/attach-server-clients.ts +122 -0
  189. package/src/attach/attach-server-events.js +38 -0
  190. package/src/attach/attach-server-events.ts +36 -0
  191. package/src/attach/attach-server-pty.js +45 -0
  192. package/src/attach/attach-server-pty.ts +64 -0
  193. package/src/attach/attach-server-runtime.js +73 -0
  194. package/src/attach/attach-server-runtime.ts +62 -0
  195. package/src/attach/attach-server-socket.js +28 -0
  196. package/src/attach/attach-server-socket.ts +23 -0
  197. package/src/attach/attach-server-types.js +2 -0
  198. package/src/attach/attach-server-types.ts +82 -0
  199. package/src/attach/attach-server.js +106 -523
  200. package/src/attach/attach-server.ts +158 -0
  201. package/src/attach/index.js +18 -35
  202. package/src/attach/index.ts +18 -0
  203. package/src/attach/protocol.js +95 -184
  204. package/src/attach/protocol.ts +181 -0
  205. package/src/attach/ring-buffer.js +76 -102
  206. package/src/attach/ring-buffer.ts +109 -0
  207. package/src/attach/send-input.js +64 -75
  208. package/src/attach/send-input.ts +94 -0
  209. package/src/attach/socket-discovery.js +164 -218
  210. package/src/attach/socket-discovery.ts +230 -0
  211. package/src/attach/socket-paths.js +42 -61
  212. package/src/attach/socket-paths.ts +81 -0
  213. package/src/claude-credentials.js +51 -54
  214. package/src/claude-credentials.ts +89 -0
  215. package/src/cluster/generated/protocol-schema.ts +1 -1
  216. package/src/cluster/generated/protocol.ts +2 -1
  217. package/src/command-proofs.js +110 -141
  218. package/src/command-proofs.ts +216 -0
  219. package/src/config-router.js +81 -73
  220. package/src/config-router.ts +131 -0
  221. package/src/copy-containment.js +191 -0
  222. package/src/copy-containment.ts +259 -0
  223. package/src/copy-worker.js +53 -30
  224. package/src/copy-worker.ts +88 -0
  225. package/src/darwin-keychain-boundary.js +80 -111
  226. package/src/darwin-keychain-boundary.ts +148 -0
  227. package/src/guidance-topics.js +4 -5
  228. package/src/guidance-topics.ts +10 -0
  229. package/src/input-helpers.js +33 -54
  230. package/src/input-helpers.ts +58 -0
  231. package/src/isolation-manager.js +59 -20
  232. package/src/ledger-sequence.js +45 -48
  233. package/src/ledger-sequence.ts +63 -0
  234. package/src/legacy-lib/clusters-registry.ts +40 -0
  235. package/src/legacy-lib/completion.ts +148 -0
  236. package/src/legacy-lib/compose-utils.ts +102 -0
  237. package/src/legacy-lib/detached-startup.ts +451 -0
  238. package/src/legacy-lib/docker-config.ts +282 -0
  239. package/src/legacy-lib/docker-env-auth.ts +116 -0
  240. package/src/legacy-lib/git-remote-utils.ts +244 -0
  241. package/src/legacy-lib/id-detector.ts +57 -0
  242. package/src/legacy-lib/js-yaml.d.ts +3 -0
  243. package/src/legacy-lib/omelette.d.ts +15 -0
  244. package/src/legacy-lib/path-check.ts +89 -0
  245. package/src/legacy-lib/process-liveness.ts +36 -0
  246. package/src/legacy-lib/provider-credential-path.ts +57 -0
  247. package/src/legacy-lib/provider-defaults.ts +114 -0
  248. package/src/legacy-lib/provider-detection.ts +67 -0
  249. package/src/legacy-lib/provider-names.ts +126 -0
  250. package/src/legacy-lib/repo-settings.ts +88 -0
  251. package/src/legacy-lib/run-mode.ts +58 -0
  252. package/src/legacy-lib/run-plan.ts +49 -0
  253. package/src/legacy-lib/settings/claude-auth.ts +80 -0
  254. package/src/legacy-lib/settings-defaults.ts +212 -0
  255. package/src/legacy-lib/settings-error.ts +8 -0
  256. package/src/legacy-lib/settings-issue-providers.ts +18 -0
  257. package/src/legacy-lib/settings-models.ts +124 -0
  258. package/src/legacy-lib/settings-storage.ts +277 -0
  259. package/src/legacy-lib/settings-validation.ts +220 -0
  260. package/src/legacy-lib/settings.ts +87 -0
  261. package/src/legacy-lib/setup-apply-types.ts +70 -0
  262. package/src/legacy-lib/setup-apply.ts +456 -0
  263. package/src/legacy-lib/setup-journal.ts +185 -0
  264. package/src/legacy-lib/setup-plan-types.ts +96 -0
  265. package/src/legacy-lib/setup-plan.ts +500 -0
  266. package/src/legacy-lib/setup-undo.ts +142 -0
  267. package/src/legacy-lib/start-cluster-config.ts +124 -0
  268. package/src/legacy-lib/start-cluster-environment.ts +166 -0
  269. package/src/legacy-lib/start-cluster-run-options.ts +281 -0
  270. package/src/legacy-lib/start-cluster.ts +237 -0
  271. package/src/legacy-lib/stream-json-parser.ts +88 -0
  272. package/src/message-buffer.js +55 -71
  273. package/src/message-buffer.ts +107 -0
  274. package/src/message-bus-bridge.js +92 -133
  275. package/src/message-bus-bridge.ts +149 -0
  276. package/src/name-generator-shared.js +220 -0
  277. package/src/name-generator-shared.ts +231 -0
  278. package/src/name-generator.js +8 -217
  279. package/src/name-generator.ts +27 -0
  280. package/src/omp-blob-root.js +83 -64
  281. package/src/omp-blob-root.ts +116 -0
  282. package/src/omp-config-overlay.js +65 -38
  283. package/src/omp-config-overlay.ts +110 -0
  284. package/src/omp-execution-fingerprint.js +38 -43
  285. package/src/omp-execution-fingerprint.ts +92 -0
  286. package/src/omp-session-limits.js +10 -15
  287. package/src/omp-session-limits.ts +53 -0
  288. package/src/omp-session-partition.js +2 -2
  289. package/src/omp-session-verifier.js +1 -1
  290. package/src/orchestrator.js +32 -7
  291. package/src/pr-body-template.js +71 -0
  292. package/src/providers/anthropic/index.js +3 -1
  293. package/src/providers/anthropic/index.ts +13 -0
  294. package/src/providers/capabilities.js +19 -27
  295. package/src/providers/capabilities.ts +44 -0
  296. package/src/providers/google/index.js +3 -1
  297. package/src/providers/google/index.ts +13 -0
  298. package/src/providers/openai/index.js +3 -1
  299. package/src/providers/openai/index.ts +13 -0
  300. package/src/providers/opencode/index.js +3 -1
  301. package/src/providers/opencode/index.ts +13 -0
  302. package/src/quality-gates.js +67 -127
  303. package/src/quality-gates.ts +149 -0
  304. package/src/repo-settings-access.js +40 -0
  305. package/src/repo-settings-access.ts +64 -0
  306. package/src/schemas/sub-cluster.js +127 -183
  307. package/src/schemas/sub-cluster.ts +238 -0
  308. package/src/state-snapshot-normalization.js +224 -0
  309. package/src/state-snapshot-normalization.ts +222 -0
  310. package/src/state-snapshot.js +192 -359
  311. package/src/state-snapshot.ts +291 -0
  312. package/src/state-snapshotter.js +118 -130
  313. package/src/state-snapshotter.ts +167 -0
  314. package/src/sub-cluster-wrapper.js +4 -13
  315. package/src/task-run-model-args.js +87 -124
  316. package/src/task-run-model-args.ts +204 -0
  317. package/src/task-runner.js +5 -25
  318. package/src/task-runner.ts +28 -0
  319. package/src/task-startup-error.js +73 -58
  320. package/src/task-startup-error.ts +126 -0
  321. package/src/template-validation/consensus-gate-contracts.js +2 -0
  322. package/src/template-validation/consensus-gate-contracts.ts +70 -0
  323. package/src/template-validation/consensus-gate-scenarios.js +76 -0
  324. package/src/template-validation/consensus-gate-scenarios.ts +130 -0
  325. package/src/template-validation/consensus-gate-stage.js +34 -0
  326. package/src/template-validation/consensus-gate-stage.ts +56 -0
  327. package/src/template-validation/random-topology-contracts.js +2 -0
  328. package/src/template-validation/random-topology-contracts.ts +54 -0
  329. package/src/template-validation/random-topology-dispatch.js +25 -0
  330. package/src/template-validation/random-topology-dispatch.ts +33 -0
  331. package/src/template-validation/random-topology-message-loop.js +53 -0
  332. package/src/template-validation/random-topology-message-loop.ts +73 -0
  333. package/src/template-validation/random-topology-operations.js +79 -0
  334. package/src/template-validation/random-topology-operations.ts +101 -0
  335. package/src/template-validation/random-topology-runtime.js +25 -0
  336. package/src/template-validation/random-topology-runtime.ts +43 -0
  337. package/src/template-validation/random-topology-scenario.js +52 -0
  338. package/src/template-validation/random-topology-scenario.ts +57 -0
  339. package/src/template-validation/random-topology-schema.js +159 -0
  340. package/src/template-validation/random-topology-schema.ts +190 -0
  341. package/src/template-validation/random-topology-state.js +28 -0
  342. package/src/template-validation/random-topology-state.ts +30 -0
  343. package/src/template-validation/random-topology-trigger-evaluation.js +45 -0
  344. package/src/template-validation/random-topology-trigger-evaluation.ts +65 -0
  345. package/src/template-validation/random-topology-trigger.js +75 -0
  346. package/src/template-validation/random-topology-trigger.ts +88 -0
  347. package/src/template-validation/report-formatter.js +40 -46
  348. package/src/template-validation/report-formatter.ts +101 -0
  349. package/src/template-validation/simulate-consensus-gates.js +111 -302
  350. package/src/template-validation/simulate-consensus-gates.ts +196 -0
  351. package/src/template-validation/simulate-random-topology.js +26 -519
  352. package/src/template-validation/simulate-random-topology.ts +57 -0
  353. package/src/template-validation/simulate-two-stage-validation.js +41 -265
  354. package/src/template-validation/simulate-two-stage-validation.ts +55 -0
  355. package/src/template-validation/simulation-agent-runtime.js +25 -0
  356. package/src/template-validation/simulation-agent-runtime.ts +40 -0
  357. package/src/template-validation/simulation-agent.js +29 -0
  358. package/src/template-validation/simulation-agent.ts +73 -0
  359. package/src/template-validation/simulation-runtime.js +34 -0
  360. package/src/template-validation/simulation-runtime.ts +72 -0
  361. package/src/template-validation/two-stage-contracts.js +2 -0
  362. package/src/template-validation/two-stage-contracts.ts +41 -0
  363. package/src/template-validation/two-stage-inputs.js +21 -0
  364. package/src/template-validation/two-stage-inputs.ts +29 -0
  365. package/src/template-validation/two-stage-results.js +30 -0
  366. package/src/template-validation/two-stage-results.ts +40 -0
  367. package/src/template-validation/two-stage-scenario.js +86 -0
  368. package/src/template-validation/two-stage-scenario.ts +120 -0
  369. package/src/worktree-claude-config.js +182 -220
  370. package/src/worktree-claude-config.ts +272 -0
  371. package/src/worktree-tooling-env.js +103 -125
  372. package/src/worktree-tooling-env.ts +142 -0
  373. package/task-lib/completion.js +2 -3
  374. package/task-lib/completion.ts +9 -0
  375. package/task-lib/config.js +1 -4
  376. package/task-lib/config.ts +11 -0
  377. package/task-lib/name-generator.js +4 -226
  378. package/task-lib/name-generator.ts +11 -0
  379. package/task-lib/omp-session-cleanup.js +1 -1
  380. package/task-lib/omp-storage-root.js +8 -12
  381. package/task-lib/omp-storage-root.ts +62 -0
  382. package/task-lib/process-termination.js +143 -166
  383. package/task-lib/process-termination.ts +268 -0
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  /**
2
3
  * Undo journal for `zeroshot setup apply` / `zeroshot setup undo`.
3
4
  *
@@ -7,103 +8,145 @@
7
8
  * Shared by lib/setup-apply.js (writer) and lib/setup-undo.js (reader) so the
8
9
  * nested-path mutation and equality semantics can't drift between the two.
9
10
  */
10
-
11
- const fs = require('fs');
12
- const path = require('path');
11
+ const fs = require("fs");
12
+ const path = require("path");
13
+ // These CommonJS paths intentionally resolve beside the emitted module in lib/.
14
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
13
15
  const { getSettingsFile } = require('./settings');
16
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
14
17
  const { getNestedValue } = require('./setup-plan');
15
-
16
18
  function getJournalPath() {
17
- return path.join(path.dirname(getSettingsFile()), 'setup-undo-journal.json');
19
+ return path.join(path.dirname(getSettingsFile()), 'setup-undo-journal.json');
18
20
  }
19
-
20
- function loadJournal() {
21
- const journalPath = getJournalPath();
22
- if (!fs.existsSync(journalPath)) {
21
+ function isRecord(value) {
22
+ return typeof value === 'object' && value !== null;
23
+ }
24
+ function isSetupJournal(value) {
25
+ return isRecord(value) && Array.isArray(value.entries);
26
+ }
27
+ function emptyJournal() {
23
28
  return { version: 1, entries: [] };
24
- }
25
- try {
26
- const parsed = JSON.parse(fs.readFileSync(journalPath, 'utf8'));
27
- if (!parsed || !Array.isArray(parsed.entries)) {
28
- return { version: 1, entries: [] };
29
+ }
30
+ function loadJournal() {
31
+ const journalPath = getJournalPath();
32
+ if (!fs.existsSync(journalPath)) {
33
+ return emptyJournal();
34
+ }
35
+ try {
36
+ const parsed = JSON.parse(fs.readFileSync(journalPath, 'utf8'));
37
+ if (!isSetupJournal(parsed)) {
38
+ return emptyJournal();
39
+ }
40
+ return parsed;
41
+ }
42
+ catch {
43
+ return emptyJournal();
29
44
  }
30
- return parsed;
31
- } catch {
32
- return { version: 1, entries: [] };
33
- }
34
45
  }
35
-
36
46
  function saveJournal(journal) {
37
- const journalPath = getJournalPath();
38
- fs.mkdirSync(path.dirname(journalPath), { recursive: true });
39
- fs.writeFileSync(journalPath, JSON.stringify(journal, null, 2), 'utf8');
47
+ const journalPath = getJournalPath();
48
+ fs.mkdirSync(path.dirname(journalPath), { recursive: true });
49
+ fs.writeFileSync(journalPath, JSON.stringify(journal, null, 2), 'utf8');
40
50
  }
41
-
42
51
  function entryKey(entry) {
43
- return `${entry.scope}:${entry.repoRoot || ''}:${entry.path}`;
52
+ return `${entry.scope}:${entry.repoRoot || ''}:${entry.path}`;
44
53
  }
45
-
46
54
  // Re-applying an already-journaled write updates appliedValue/appliedAt but
47
55
  // keeps the original priorValue — that's the true pre-apply state undo must
48
56
  // restore to, and it must not drift across repeated `apply` runs.
49
57
  function upsertJournalEntry(journal, entry) {
50
- const key = entryKey(entry);
51
- const existingIndex = journal.entries.findIndex((e) => entryKey(e) === key);
52
- if (existingIndex === -1) {
53
- journal.entries.push(entry);
54
- return;
55
- }
56
- journal.entries[existingIndex] = {
57
- ...entry,
58
- priorValue: journal.entries[existingIndex].priorValue,
59
- };
58
+ const key = entryKey(entry);
59
+ const existingIndex = journal.entries.findIndex((candidate) => entryKey(candidate) === key);
60
+ if (existingIndex === -1) {
61
+ journal.entries.push(entry);
62
+ return;
63
+ }
64
+ const existing = journal.entries[existingIndex];
65
+ if (!existing) {
66
+ throw new Error('Journal entry disappeared during synchronous update');
67
+ }
68
+ journal.entries[existingIndex] = {
69
+ ...entry,
70
+ priorValue: existing.priorValue,
71
+ };
72
+ }
73
+ function safePathSegments(pathStr) {
74
+ const keys = pathStr.split('.');
75
+ for (const key of keys) {
76
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
77
+ throw new Error(`Unsafe setup journal path: ${pathStr}`);
78
+ }
79
+ }
80
+ return keys;
81
+ }
82
+ function defineOwnValue(target, key, value) {
83
+ Object.defineProperty(target, key, {
84
+ configurable: true,
85
+ enumerable: true,
86
+ value,
87
+ writable: true,
88
+ });
60
89
  }
61
-
62
90
  function setNestedValue(target, pathStr, value) {
63
- const keys = pathStr.split('.');
64
- let node = target;
65
- for (let i = 0; i < keys.length - 1; i++) {
66
- const key = keys[i];
67
- if (typeof node[key] !== 'object' || node[key] === null) {
68
- node[key] = {};
91
+ const keys = safePathSegments(pathStr);
92
+ let node = target;
93
+ for (let index = 0; index < keys.length - 1; index++) {
94
+ const key = keys[index] || '';
95
+ const child = Object.hasOwn(node, key) ? node[key] : undefined;
96
+ if (isRecord(child)) {
97
+ node = child;
98
+ }
99
+ else {
100
+ const replacement = {};
101
+ defineOwnValue(node, key, replacement);
102
+ node = replacement;
103
+ }
69
104
  }
70
- node = node[key];
71
- }
72
- node[keys[keys.length - 1]] = value;
105
+ defineOwnValue(node, keys[keys.length - 1] || '', value);
73
106
  }
74
-
75
107
  function deleteNestedKey(target, pathStr) {
76
- const keys = pathStr.split('.');
77
- let node = target;
78
- for (let i = 0; i < keys.length - 1; i++) {
79
- const key = keys[i];
80
- if (typeof node[key] !== 'object' || node[key] === null) return;
81
- node = node[key];
82
- }
83
- delete node[keys[keys.length - 1]];
108
+ const keys = safePathSegments(pathStr);
109
+ let node = target;
110
+ for (let index = 0; index < keys.length - 1; index++) {
111
+ const key = keys[index] || '';
112
+ if (!Object.hasOwn(node, key))
113
+ return;
114
+ const child = node[key];
115
+ if (!isRecord(child))
116
+ return;
117
+ node = child;
118
+ }
119
+ const finalKey = keys[keys.length - 1] || '';
120
+ if (Object.hasOwn(node, finalKey)) {
121
+ delete node[finalKey];
122
+ }
84
123
  }
85
-
86
- function deepEqual(a, b) {
87
- if (a === b) return true;
88
- if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') return false;
89
- if (Array.isArray(a) !== Array.isArray(b)) return false;
90
- if (Array.isArray(a)) {
91
- if (a.length !== b.length) return false;
92
- return a.every((v, i) => deepEqual(v, b[i]));
93
- }
94
- const aKeys = Object.keys(a);
95
- const bKeys = Object.keys(b);
96
- if (aKeys.length !== bKeys.length) return false;
97
- return aKeys.every((k) => Object.prototype.hasOwnProperty.call(b, k) && deepEqual(a[k], b[k]));
124
+ function deepEqual(left, right) {
125
+ if (left === right)
126
+ return true;
127
+ if (!isRecord(left) || !isRecord(right))
128
+ return false;
129
+ if (Array.isArray(left) !== Array.isArray(right))
130
+ return false;
131
+ if (Array.isArray(left) && Array.isArray(right)) {
132
+ if (left.length !== right.length)
133
+ return false;
134
+ return left.every((value, index) => deepEqual(value, right[index]));
135
+ }
136
+ const leftKeys = Object.keys(left);
137
+ const rightKeys = Object.keys(right);
138
+ if (leftKeys.length !== rightKeys.length)
139
+ return false;
140
+ return leftKeys.every((key) => Object.prototype.hasOwnProperty.call(right, key) &&
141
+ deepEqual(Reflect.get(left, key), Reflect.get(right, key)));
98
142
  }
99
-
100
143
  module.exports = {
101
- getJournalPath,
102
- loadJournal,
103
- saveJournal,
104
- upsertJournalEntry,
105
- getNestedValue,
106
- setNestedValue,
107
- deleteNestedKey,
108
- deepEqual,
144
+ getJournalPath,
145
+ loadJournal,
146
+ saveJournal,
147
+ upsertJournalEntry,
148
+ getNestedValue,
149
+ setNestedValue,
150
+ deleteNestedKey,
151
+ deepEqual,
109
152
  };
@@ -0,0 +1,102 @@
1
+ export type SettingsMap = Record<string, unknown>;
2
+ export type DecisionScope = 'global' | 'repo';
3
+ export interface DecisionTarget {
4
+ path: string;
5
+ scope: DecisionScope;
6
+ }
7
+ export interface SetupEnvironment {
8
+ CI?: string;
9
+ __isTTY?: boolean;
10
+ npm_config_global?: string;
11
+ npm_execpath?: string;
12
+ }
13
+ interface ProviderMetadata {
14
+ binary: string;
15
+ displayName: string;
16
+ installInstructions: string;
17
+ }
18
+ interface ProviderAdapter {
19
+ cliCommand?: string;
20
+ isAvailable(): boolean;
21
+ }
22
+ export interface ProviderLevelDefaults {
23
+ defaultLevel?: unknown;
24
+ maxLevel?: unknown;
25
+ minLevel?: unknown;
26
+ }
27
+ export interface SetupPlanDependencies {
28
+ checkDocker(): {
29
+ available: unknown;
30
+ };
31
+ checkGhAuth(): {
32
+ authenticated: unknown;
33
+ };
34
+ commandExists(command: string): boolean;
35
+ execSync(command: string, options: {
36
+ cwd: string;
37
+ encoding: 'utf8';
38
+ stdio: 'pipe';
39
+ }): string;
40
+ getCommandPath(command: string): string | null;
41
+ getDefaultProviderId(): string;
42
+ getNodeVersion(): string;
43
+ getPackageVersion(): string;
44
+ getProvider(name: string): ProviderAdapter;
45
+ getProviderDefaults(): Record<string, ProviderLevelDefaults | undefined>;
46
+ getProviderMetadata(name: string): ProviderMetadata;
47
+ listProviders(): string[];
48
+ }
49
+ export interface ProviderFact {
50
+ available: boolean;
51
+ displayName: string;
52
+ installInstructions: string;
53
+ path: string | null;
54
+ }
55
+ export interface SetupFacts {
56
+ docker: {
57
+ available: boolean;
58
+ };
59
+ git: {
60
+ branch: string | null;
61
+ ghAuthed: boolean | null;
62
+ ghAvailable: boolean;
63
+ isRepo: boolean;
64
+ remote: string | null;
65
+ };
66
+ node: {
67
+ installSource: string;
68
+ packageVersion: string;
69
+ version: string;
70
+ };
71
+ providers: Record<string, ProviderFact>;
72
+ settings: {
73
+ hasGlobal: boolean;
74
+ hasRepo: boolean;
75
+ };
76
+ }
77
+ export interface SetupDecision {
78
+ currentValue: unknown;
79
+ decisionId: string;
80
+ domain: string;
81
+ }
82
+ export interface ProposedWrite extends DecisionTarget {
83
+ decisionId: string;
84
+ from: unknown;
85
+ to: unknown;
86
+ }
87
+ export interface BuildSetupPlanParams {
88
+ cwd?: string;
89
+ deps?: Partial<SetupPlanDependencies>;
90
+ env?: SetupEnvironment;
91
+ repoSettings?: SettingsMap | null;
92
+ settings?: SettingsMap;
93
+ }
94
+ export interface SetupPlan {
95
+ decisions: SetupDecision[];
96
+ facts: SetupFacts;
97
+ proposedWrites: ProposedWrite[];
98
+ recommended: Record<string, unknown>;
99
+ risk: Record<string, string>;
100
+ schemaVersion: number;
101
+ }
102
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Setup plan — read-only facts collector + the pinned, versioned setup contract.
3
+ *
4
+ * buildSetupPlan() is pure over its injected inputs: no direct process.env/fs
5
+ * reads for config data, no writes, no prompts. Everything downstream (apply,
6
+ * undo, the TTY wizard, agents) consumes the object this returns, so its shape
7
+ * (schemaVersion, facts, decisions, recommended, risk, proposedWrites) and the
8
+ * decisionId registry below are a stable contract — do not rename IDs or add a
9
+ * parallel run-mode field without updating every consumer.
10
+ */
11
+ import type { BuildSetupPlanParams, DecisionTarget, SetupPlan } from './setup-plan-types';
12
+ declare function isConsumedPath(scope: string, targetPath: string): boolean;
13
+ declare function resolveDecisionPath(decisionId: string): DecisionTarget | null;
14
+ declare function getNestedValue(source: unknown, pathStr: string): unknown;
15
+ declare function domainFor(decisionId: string): string;
16
+ /**
17
+ * Build the pinned, versioned setup contract. Pure over injected inputs —
18
+ * performs only cheap, read-only detection (no writes, no prompts).
19
+ */
20
+ declare function buildSetupPlan({ cwd, settings, repoSettings, env, deps, }?: BuildSetupPlanParams): SetupPlan;
21
+ declare const _default: {
22
+ buildSetupPlan: typeof buildSetupPlan;
23
+ resolveDecisionPath: typeof resolveDecisionPath;
24
+ domainFor: typeof domainFor;
25
+ DECISION_PATHS: Record<string, DecisionTarget>;
26
+ getNestedValue: typeof getNestedValue;
27
+ isConsumedPath: typeof isConsumedPath;
28
+ CONSUMED_PATHS: Set<string>;
29
+ };
30
+ export = _default;