@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.
- package/cli/event-copy.js +8 -7
- package/cli/event-copy.ts +12 -0
- package/cli/index.js +7 -31
- package/cli/json-export.js +61 -64
- package/cli/json-export.ts +112 -0
- package/cli/message-formatter-utils.js +68 -56
- package/cli/message-formatter-utils.ts +121 -0
- package/cli/message-formatters-normal.js +124 -259
- package/cli/message-formatters-normal.ts +250 -0
- package/cli/message-formatters-watch.js +81 -84
- package/cli/message-formatters-watch.ts +189 -0
- package/lib/agent-cli-provider/adapters/codex.d.ts.map +1 -1
- package/lib/agent-cli-provider/adapters/codex.js +3 -1
- package/lib/agent-cli-provider/adapters/codex.js.map +1 -1
- package/lib/cluster/generated/protocol-schema.cjs +1 -1
- package/lib/cluster/generated/protocol-schema.mjs +1 -1
- package/lib/cluster/generated/protocol.d.cts +8 -0
- package/lib/cluster/generated/protocol.d.mts +8 -0
- package/lib/cluster/generated/protocol.d.ts +8 -0
- package/lib/clusters-registry.d.ts +23 -0
- package/lib/clusters-registry.js +17 -29
- package/lib/completion.d.ts +12 -0
- package/lib/completion.js +84 -94
- package/lib/compose-utils.d.ts +32 -0
- package/lib/compose-utils.js +57 -72
- package/lib/detached-startup.d.ts +83 -0
- package/lib/detached-startup.js +231 -302
- package/lib/docker-config.d.ts +43 -0
- package/lib/docker-config.js +150 -325
- package/lib/docker-env-auth.d.ts +17 -0
- package/lib/docker-env-auth.js +75 -0
- package/lib/git-remote-utils.d.ts +48 -0
- package/lib/git-remote-utils.js +147 -213
- package/lib/id-detector.d.ts +15 -0
- package/lib/id-detector.js +37 -41
- package/lib/path-check.d.ts +30 -0
- package/lib/path-check.js +42 -45
- package/lib/process-liveness.d.ts +16 -0
- package/lib/process-liveness.js +19 -12
- package/lib/provider-credential-path.d.ts +16 -0
- package/lib/provider-credential-path.js +31 -29
- package/lib/provider-defaults.d.ts +30 -0
- package/lib/provider-defaults.js +47 -42
- package/lib/provider-detection.d.ts +11 -0
- package/lib/provider-detection.js +91 -54
- package/lib/provider-names.d.ts +38 -0
- package/lib/provider-names.js +56 -64
- package/lib/repo-settings.d.ts +28 -0
- package/lib/repo-settings.js +83 -59
- package/lib/run-mode.d.ts +21 -0
- package/lib/run-mode.js +21 -20
- package/lib/run-plan.d.ts +28 -0
- package/lib/run-plan.js +17 -16
- package/lib/settings/claude-auth.d.ts +35 -0
- package/lib/settings/claude-auth.js +30 -47
- package/lib/settings-defaults.d.ts +20 -0
- package/lib/settings-defaults.js +149 -0
- package/lib/settings-error.d.ts +7 -0
- package/lib/settings-error.js +8 -0
- package/lib/settings-issue-providers.d.ts +10 -0
- package/lib/settings-issue-providers.js +12 -0
- package/lib/settings-models.d.ts +22 -0
- package/lib/settings-models.js +93 -0
- package/lib/settings-storage.d.ts +23 -0
- package/lib/settings-storage.js +205 -0
- package/lib/settings-validation.d.ts +7 -0
- package/lib/settings-validation.js +182 -0
- package/lib/settings.d.ts +29 -0
- package/lib/settings.js +41 -736
- package/lib/setup-apply-types.d.ts +66 -0
- package/lib/setup-apply-types.js +2 -0
- package/lib/setup-apply.d.ts +39 -0
- package/lib/setup-apply.js +267 -264
- package/lib/setup-journal.d.ts +41 -0
- package/lib/setup-journal.js +119 -76
- package/lib/setup-plan-types.d.ts +102 -0
- package/lib/setup-plan-types.js +2 -0
- package/lib/setup-plan.d.ts +30 -0
- package/lib/setup-plan.js +300 -324
- package/lib/setup-undo.d.ts +44 -0
- package/lib/setup-undo.js +61 -74
- package/lib/start-cluster-config.d.ts +26 -0
- package/lib/start-cluster-config.js +56 -0
- package/lib/start-cluster-environment.d.ts +40 -0
- package/lib/start-cluster-environment.js +134 -0
- package/lib/start-cluster-run-options.d.ts +53 -0
- package/lib/start-cluster-run-options.js +147 -0
- package/lib/start-cluster.d.ts +64 -0
- package/lib/start-cluster.js +98 -454
- package/lib/stream-json-parser.d.ts +17 -0
- package/lib/stream-json-parser.js +51 -52
- package/npm-shrinkwrap.json +2 -2
- package/package.json +12 -6
- package/scripts/postinstall.js +27 -0
- package/scripts/rust-distribution.js +23 -14
- package/src/agent/agent-command-proofs-context.js +35 -45
- package/src/agent/agent-command-proofs-context.ts +87 -0
- package/src/agent/agent-config-settings.js +19 -0
- package/src/agent/agent-config-settings.ts +41 -0
- package/src/agent/agent-config.js +122 -231
- package/src/agent/agent-config.ts +285 -0
- package/src/agent/agent-context-builder.js +38 -273
- package/src/agent/agent-context-builder.ts +51 -0
- package/src/agent/agent-context-environment-sections.js +105 -0
- package/src/agent/agent-context-environment-sections.ts +134 -0
- package/src/agent/agent-context-packs.js +165 -0
- package/src/agent/agent-context-packs.ts +296 -0
- package/src/agent/agent-context-prompt-sections.js +100 -0
- package/src/agent/agent-context-prompt-sections.ts +148 -0
- package/src/agent/agent-context-sections.js +25 -334
- package/src/agent/agent-context-sections.ts +36 -0
- package/src/agent/agent-context-sources.js +96 -149
- package/src/agent/agent-context-sources.ts +253 -0
- package/src/agent/agent-context-types.js +2 -0
- package/src/agent/agent-context-types.ts +132 -0
- package/src/agent/agent-context-validation-sections.js +73 -0
- package/src/agent/agent-context-validation-sections.ts +129 -0
- package/src/agent/agent-input-injector.js +99 -118
- package/src/agent/agent-input-injector.ts +195 -0
- package/src/agent/agent-liveness-poll.js +74 -78
- package/src/agent/agent-liveness-poll.ts +163 -0
- package/src/agent/agent-quality-gate-schema.js +77 -86
- package/src/agent/agent-quality-gate-schema.ts +135 -0
- package/src/agent/agent-quality-gates-context.js +44 -50
- package/src/agent/agent-quality-gates-context.ts +91 -0
- package/src/agent/agent-stuck-detector.js +171 -239
- package/src/agent/agent-stuck-detector.ts +288 -0
- package/src/agent/agent-trigger-evaluator.js +29 -46
- package/src/agent/agent-trigger-evaluator.ts +98 -0
- package/src/agent/context-metrics.js +110 -141
- package/src/agent/context-metrics.ts +261 -0
- package/src/agent/context-pack-builder.js +72 -358
- package/src/agent/context-pack-builder.ts +105 -0
- package/src/agent/context-pack-core.js +70 -0
- package/src/agent/context-pack-core.ts +96 -0
- package/src/agent/context-pack-selection.js +119 -0
- package/src/agent/context-pack-selection.ts +187 -0
- package/src/agent/context-pack-truncation.js +139 -0
- package/src/agent/context-pack-truncation.ts +208 -0
- package/src/agent/context-pack-types.js +2 -0
- package/src/agent/context-pack-types.ts +98 -0
- package/src/agent/context-replay-policy.js +30 -39
- package/src/agent/context-replay-policy.ts +71 -0
- package/src/agent/critical-agent-policy.js +6 -10
- package/src/agent/critical-agent-policy.ts +20 -0
- package/src/agent/guidance-queue.js +74 -87
- package/src/agent/guidance-queue.ts +166 -0
- package/src/agent/output-extraction-error-detail.js +45 -0
- package/src/agent/output-extraction-error-detail.ts +49 -0
- package/src/agent/output-extraction-failures.js +125 -0
- package/src/agent/output-extraction-failures.ts +149 -0
- package/src/agent/output-extraction-json.js +234 -0
- package/src/agent/output-extraction-json.ts +235 -0
- package/src/agent/output-extraction-pi.js +124 -0
- package/src/agent/output-extraction-pi.ts +137 -0
- package/src/agent/output-extraction-types.js +2 -0
- package/src/agent/output-extraction-types.ts +49 -0
- package/src/agent/output-extraction.js +17 -617
- package/src/agent/output-extraction.ts +30 -0
- package/src/agent/output-reformatter-errors.js +83 -0
- package/src/agent/output-reformatter-errors.ts +106 -0
- package/src/agent/output-reformatter-types.js +2 -0
- package/src/agent/output-reformatter-types.ts +86 -0
- package/src/agent/output-reformatter.js +140 -185
- package/src/agent/output-reformatter.ts +238 -0
- package/src/agent/pi-terminal-lifecycle-types.js +2 -0
- package/src/agent/pi-terminal-lifecycle-types.ts +41 -0
- package/src/agent/pi-terminal-lifecycle.js +186 -206
- package/src/agent/pi-terminal-lifecycle.ts +297 -0
- package/src/agent/provider-control-plane.js +22 -21
- package/src/agent/provider-control-plane.ts +52 -0
- package/src/agent/provider-terminal-failure-types.js +2 -0
- package/src/agent/provider-terminal-failure-types.ts +60 -0
- package/src/agent/provider-terminal-failure.js +194 -191
- package/src/agent/provider-terminal-failure.ts +262 -0
- package/src/agent/rate-limit-backoff.js +31 -74
- package/src/agent/rate-limit-backoff.ts +71 -0
- package/src/agent/schema-utils.js +85 -125
- package/src/agent/schema-utils.ts +148 -0
- package/src/agent/structured-output-error.js +34 -33
- package/src/agent/structured-output-error.ts +105 -0
- package/src/agent/validation-platform.js +27 -27
- package/src/agent/validation-platform.ts +49 -0
- package/src/agent-cli-provider/adapters/codex.ts +3 -1
- package/src/attach/attach-client.js +232 -405
- package/src/attach/attach-client.ts +300 -0
- package/src/attach/attach-server-cleanup.js +43 -0
- package/src/attach/attach-server-cleanup.ts +39 -0
- package/src/attach/attach-server-clients.js +117 -0
- package/src/attach/attach-server-clients.ts +122 -0
- package/src/attach/attach-server-events.js +38 -0
- package/src/attach/attach-server-events.ts +36 -0
- package/src/attach/attach-server-pty.js +45 -0
- package/src/attach/attach-server-pty.ts +64 -0
- package/src/attach/attach-server-runtime.js +73 -0
- package/src/attach/attach-server-runtime.ts +62 -0
- package/src/attach/attach-server-socket.js +28 -0
- package/src/attach/attach-server-socket.ts +23 -0
- package/src/attach/attach-server-types.js +2 -0
- package/src/attach/attach-server-types.ts +82 -0
- package/src/attach/attach-server.js +106 -523
- package/src/attach/attach-server.ts +158 -0
- package/src/attach/index.js +18 -35
- package/src/attach/index.ts +18 -0
- package/src/attach/protocol.js +95 -184
- package/src/attach/protocol.ts +181 -0
- package/src/attach/ring-buffer.js +76 -102
- package/src/attach/ring-buffer.ts +109 -0
- package/src/attach/send-input.js +64 -75
- package/src/attach/send-input.ts +94 -0
- package/src/attach/socket-discovery.js +164 -218
- package/src/attach/socket-discovery.ts +230 -0
- package/src/attach/socket-paths.js +42 -61
- package/src/attach/socket-paths.ts +81 -0
- package/src/claude-credentials.js +51 -54
- package/src/claude-credentials.ts +89 -0
- package/src/cluster/generated/protocol-schema.ts +1 -1
- package/src/cluster/generated/protocol.ts +2 -1
- package/src/command-proofs.js +110 -141
- package/src/command-proofs.ts +216 -0
- package/src/config-router.js +81 -73
- package/src/config-router.ts +131 -0
- package/src/copy-worker.js +53 -29
- package/src/copy-worker.ts +75 -0
- package/src/darwin-keychain-boundary.js +80 -111
- package/src/darwin-keychain-boundary.ts +148 -0
- package/src/guidance-topics.js +4 -5
- package/src/guidance-topics.ts +10 -0
- package/src/input-helpers.js +33 -54
- package/src/input-helpers.ts +58 -0
- package/src/ledger-sequence.js +45 -48
- package/src/ledger-sequence.ts +63 -0
- package/src/legacy-lib/clusters-registry.ts +40 -0
- package/src/legacy-lib/completion.ts +148 -0
- package/src/legacy-lib/compose-utils.ts +102 -0
- package/src/legacy-lib/detached-startup.ts +449 -0
- package/src/legacy-lib/docker-config.ts +282 -0
- package/src/legacy-lib/docker-env-auth.ts +116 -0
- package/src/legacy-lib/git-remote-utils.ts +244 -0
- package/src/legacy-lib/id-detector.ts +57 -0
- package/src/legacy-lib/js-yaml.d.ts +3 -0
- package/src/legacy-lib/omelette.d.ts +15 -0
- package/src/legacy-lib/path-check.ts +89 -0
- package/src/legacy-lib/process-liveness.ts +36 -0
- package/src/legacy-lib/provider-credential-path.ts +57 -0
- package/src/legacy-lib/provider-defaults.ts +114 -0
- package/src/legacy-lib/provider-detection.ts +67 -0
- package/src/legacy-lib/provider-names.ts +126 -0
- package/src/legacy-lib/repo-settings.ts +88 -0
- package/src/legacy-lib/run-mode.ts +58 -0
- package/src/legacy-lib/run-plan.ts +49 -0
- package/src/legacy-lib/settings/claude-auth.ts +80 -0
- package/src/legacy-lib/settings-defaults.ts +212 -0
- package/src/legacy-lib/settings-error.ts +8 -0
- package/src/legacy-lib/settings-issue-providers.ts +18 -0
- package/src/legacy-lib/settings-models.ts +124 -0
- package/src/legacy-lib/settings-storage.ts +277 -0
- package/src/legacy-lib/settings-validation.ts +220 -0
- package/src/legacy-lib/settings.ts +87 -0
- package/src/legacy-lib/setup-apply-types.ts +70 -0
- package/src/legacy-lib/setup-apply.ts +456 -0
- package/src/legacy-lib/setup-journal.ts +185 -0
- package/src/legacy-lib/setup-plan-types.ts +96 -0
- package/src/legacy-lib/setup-plan.ts +500 -0
- package/src/legacy-lib/setup-undo.ts +142 -0
- package/src/legacy-lib/start-cluster-config.ts +124 -0
- package/src/legacy-lib/start-cluster-environment.ts +165 -0
- package/src/legacy-lib/start-cluster-run-options.ts +279 -0
- package/src/legacy-lib/start-cluster.ts +237 -0
- package/src/legacy-lib/stream-json-parser.ts +88 -0
- package/src/message-buffer.js +55 -71
- package/src/message-buffer.ts +107 -0
- package/src/message-bus-bridge.js +92 -133
- package/src/message-bus-bridge.ts +149 -0
- package/src/name-generator-shared.js +220 -0
- package/src/name-generator-shared.ts +231 -0
- package/src/name-generator.js +8 -217
- package/src/name-generator.ts +27 -0
- package/src/omp-blob-root.js +83 -64
- package/src/omp-blob-root.ts +116 -0
- package/src/omp-config-overlay.js +65 -38
- package/src/omp-config-overlay.ts +110 -0
- package/src/omp-execution-fingerprint.js +38 -43
- package/src/omp-execution-fingerprint.ts +92 -0
- package/src/omp-session-limits.js +10 -15
- package/src/omp-session-limits.ts +53 -0
- package/src/omp-session-partition.js +2 -2
- package/src/omp-session-verifier.js +1 -1
- package/src/orchestrator.js +19 -4
- package/src/providers/anthropic/index.js +3 -1
- package/src/providers/anthropic/index.ts +13 -0
- package/src/providers/capabilities.js +19 -27
- package/src/providers/capabilities.ts +44 -0
- package/src/providers/google/index.js +3 -1
- package/src/providers/google/index.ts +13 -0
- package/src/providers/openai/index.js +3 -1
- package/src/providers/openai/index.ts +13 -0
- package/src/providers/opencode/index.js +3 -1
- package/src/providers/opencode/index.ts +13 -0
- package/src/quality-gates.js +67 -127
- package/src/quality-gates.ts +149 -0
- package/src/repo-settings-access.js +40 -0
- package/src/repo-settings-access.ts +64 -0
- package/src/schemas/sub-cluster.js +127 -183
- package/src/schemas/sub-cluster.ts +238 -0
- package/src/state-snapshot-normalization.js +224 -0
- package/src/state-snapshot-normalization.ts +222 -0
- package/src/state-snapshot.js +192 -359
- package/src/state-snapshot.ts +291 -0
- package/src/state-snapshotter.js +118 -130
- package/src/state-snapshotter.ts +167 -0
- package/src/sub-cluster-wrapper.js +4 -13
- package/src/task-run-model-args.js +87 -124
- package/src/task-run-model-args.ts +204 -0
- package/src/task-runner.js +5 -25
- package/src/task-runner.ts +28 -0
- package/src/task-startup-error.js +73 -58
- package/src/task-startup-error.ts +126 -0
- package/src/template-validation/consensus-gate-contracts.js +2 -0
- package/src/template-validation/consensus-gate-contracts.ts +70 -0
- package/src/template-validation/consensus-gate-scenarios.js +76 -0
- package/src/template-validation/consensus-gate-scenarios.ts +130 -0
- package/src/template-validation/consensus-gate-stage.js +34 -0
- package/src/template-validation/consensus-gate-stage.ts +56 -0
- package/src/template-validation/random-topology-contracts.js +2 -0
- package/src/template-validation/random-topology-contracts.ts +54 -0
- package/src/template-validation/random-topology-dispatch.js +25 -0
- package/src/template-validation/random-topology-dispatch.ts +33 -0
- package/src/template-validation/random-topology-message-loop.js +53 -0
- package/src/template-validation/random-topology-message-loop.ts +73 -0
- package/src/template-validation/random-topology-operations.js +79 -0
- package/src/template-validation/random-topology-operations.ts +101 -0
- package/src/template-validation/random-topology-runtime.js +25 -0
- package/src/template-validation/random-topology-runtime.ts +43 -0
- package/src/template-validation/random-topology-scenario.js +52 -0
- package/src/template-validation/random-topology-scenario.ts +57 -0
- package/src/template-validation/random-topology-schema.js +159 -0
- package/src/template-validation/random-topology-schema.ts +190 -0
- package/src/template-validation/random-topology-state.js +28 -0
- package/src/template-validation/random-topology-state.ts +30 -0
- package/src/template-validation/random-topology-trigger-evaluation.js +45 -0
- package/src/template-validation/random-topology-trigger-evaluation.ts +65 -0
- package/src/template-validation/random-topology-trigger.js +75 -0
- package/src/template-validation/random-topology-trigger.ts +88 -0
- package/src/template-validation/report-formatter.js +40 -46
- package/src/template-validation/report-formatter.ts +101 -0
- package/src/template-validation/simulate-consensus-gates.js +111 -302
- package/src/template-validation/simulate-consensus-gates.ts +196 -0
- package/src/template-validation/simulate-random-topology.js +26 -519
- package/src/template-validation/simulate-random-topology.ts +57 -0
- package/src/template-validation/simulate-two-stage-validation.js +41 -265
- package/src/template-validation/simulate-two-stage-validation.ts +55 -0
- package/src/template-validation/simulation-agent-runtime.js +25 -0
- package/src/template-validation/simulation-agent-runtime.ts +40 -0
- package/src/template-validation/simulation-agent.js +29 -0
- package/src/template-validation/simulation-agent.ts +73 -0
- package/src/template-validation/simulation-runtime.js +34 -0
- package/src/template-validation/simulation-runtime.ts +72 -0
- package/src/template-validation/two-stage-contracts.js +2 -0
- package/src/template-validation/two-stage-contracts.ts +41 -0
- package/src/template-validation/two-stage-inputs.js +21 -0
- package/src/template-validation/two-stage-inputs.ts +29 -0
- package/src/template-validation/two-stage-results.js +30 -0
- package/src/template-validation/two-stage-results.ts +40 -0
- package/src/template-validation/two-stage-scenario.js +86 -0
- package/src/template-validation/two-stage-scenario.ts +120 -0
- package/src/worktree-claude-config.js +182 -220
- package/src/worktree-claude-config.ts +272 -0
- package/src/worktree-tooling-env.js +103 -125
- package/src/worktree-tooling-env.ts +142 -0
- package/task-lib/completion.js +2 -3
- package/task-lib/completion.ts +9 -0
- package/task-lib/config.js +1 -4
- package/task-lib/config.ts +11 -0
- package/task-lib/name-generator.js +4 -226
- package/task-lib/name-generator.ts +11 -0
- package/task-lib/omp-session-cleanup.js +1 -1
- package/task-lib/omp-storage-root.js +8 -12
- package/task-lib/omp-storage-root.ts +62 -0
- package/task-lib/process-termination.js +143 -166
- package/task-lib/process-termination.ts +268 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `zeroshot setup undo` — reverts writes made by `zeroshot setup apply` using
|
|
3
|
+
* the journal recorded at apply time (lib/setup-journal.js).
|
|
4
|
+
*
|
|
5
|
+
* Three-way conflict rule per journaled write, comparing `current` against
|
|
6
|
+
* `appliedValue`:
|
|
7
|
+
* - current === appliedValue -> restore priorValue (delete if null)
|
|
8
|
+
* - current === priorValue -> already-restored (no-op)
|
|
9
|
+
* - otherwise (changed elsewhere) -> skipped-modified, never clobbered
|
|
10
|
+
*/
|
|
11
|
+
type SettingsRecord = Record<string, unknown>;
|
|
12
|
+
type UndoStatus = 'already-restored' | 'skipped-modified' | 'deleted' | 'restored';
|
|
13
|
+
interface JournalEntry {
|
|
14
|
+
readonly appliedAt: string;
|
|
15
|
+
readonly appliedValue: unknown;
|
|
16
|
+
readonly path: string;
|
|
17
|
+
readonly priorValue: unknown;
|
|
18
|
+
readonly repoRoot: string | null;
|
|
19
|
+
readonly scope: string;
|
|
20
|
+
readonly [key: string]: unknown;
|
|
21
|
+
}
|
|
22
|
+
interface UndoResult extends JournalEntry {
|
|
23
|
+
current?: unknown;
|
|
24
|
+
status: UndoStatus;
|
|
25
|
+
wouldRestore?: unknown;
|
|
26
|
+
}
|
|
27
|
+
interface UndoDependencies {
|
|
28
|
+
mutateSettings<T>(mutator: (settings: SettingsRecord) => T): T;
|
|
29
|
+
readRepoSettings(repoRoot: string | null): {
|
|
30
|
+
settings: SettingsRecord | null;
|
|
31
|
+
};
|
|
32
|
+
writeRepoSettings(repoRoot: string | null, settings: SettingsRecord): unknown;
|
|
33
|
+
}
|
|
34
|
+
interface UndoParams {
|
|
35
|
+
deps?: Partial<UndoDependencies>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Undo every journaled write, per the three-way conflict rule.
|
|
39
|
+
*/
|
|
40
|
+
declare function undo({ deps }?: UndoParams): Array<UndoResult | undefined>;
|
|
41
|
+
declare const _default: {
|
|
42
|
+
undo: typeof undo;
|
|
43
|
+
};
|
|
44
|
+
export = _default;
|
package/lib/setup-undo.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* `zeroshot setup undo` — reverts writes made by `zeroshot setup apply` using
|
|
3
4
|
* the journal recorded at apply time (lib/setup-journal.js).
|
|
@@ -8,90 +9,76 @@
|
|
|
8
9
|
* - current === priorValue -> already-restored (no-op)
|
|
9
10
|
* - otherwise (changed elsewhere) -> skipped-modified, never clobbered
|
|
10
11
|
*/
|
|
11
|
-
|
|
12
|
-
const {
|
|
13
|
-
loadJournal,
|
|
14
|
-
getNestedValue,
|
|
15
|
-
setNestedValue,
|
|
16
|
-
deleteNestedKey,
|
|
17
|
-
deepEqual,
|
|
18
|
-
} = require('./setup-journal');
|
|
19
|
-
|
|
12
|
+
const setupJournal = require("./setup-journal");
|
|
13
|
+
const { loadJournal, getNestedValue, setNestedValue, deleteNestedKey, deepEqual, } = setupJournal;
|
|
20
14
|
function defaultUndoDeps() {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
15
|
+
// These CommonJS paths intentionally resolve beside the emitted module in lib/.
|
|
16
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
17
|
+
const { mutateSettings } = require('./settings');
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
19
|
+
const { readRepoSettings, writeRepoSettings, } = require('./repo-settings');
|
|
20
|
+
return { mutateSettings, readRepoSettings, writeRepoSettings };
|
|
25
21
|
}
|
|
26
|
-
|
|
27
22
|
/**
|
|
28
23
|
* Undo every journaled write, per the three-way conflict rule.
|
|
29
|
-
*
|
|
30
|
-
* @param {Object} [params]
|
|
31
|
-
* @param {Object} [params.deps] - Injected dependencies (for testing).
|
|
32
|
-
* @returns {Array<{scope: string, path: string, repoRoot: string|null, status: string, current?: *, wouldRestore?: *}>}
|
|
33
24
|
*/
|
|
34
25
|
function undo({ deps = {} } = {}) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
function restoreEntry(entry, settingsObj) {
|
|
50
|
-
const current = getNestedValue(settingsObj, entry.path) ?? null;
|
|
51
|
-
if (deepEqual(current, entry.priorValue)) {
|
|
52
|
-
return { ...entry, status: 'already-restored' };
|
|
26
|
+
const resolvedDeps = { ...defaultUndoDeps(), ...deps };
|
|
27
|
+
const journal = loadJournal();
|
|
28
|
+
const repoSettingsCache = new Map();
|
|
29
|
+
const dirtyRepoRoots = new Set();
|
|
30
|
+
function repoSettingsFor(repoRoot) {
|
|
31
|
+
const cachedSettings = repoSettingsCache.get(repoRoot);
|
|
32
|
+
if (cachedSettings) {
|
|
33
|
+
return cachedSettings;
|
|
34
|
+
}
|
|
35
|
+
const { settings } = resolvedDeps.readRepoSettings(repoRoot);
|
|
36
|
+
const resolvedSettings = settings || {};
|
|
37
|
+
repoSettingsCache.set(repoRoot, resolvedSettings);
|
|
38
|
+
return resolvedSettings;
|
|
53
39
|
}
|
|
54
|
-
|
|
55
|
-
|
|
40
|
+
function restoreEntry(entry, settingsObj) {
|
|
41
|
+
const current = getNestedValue(settingsObj, entry.path) ?? null;
|
|
42
|
+
if (deepEqual(current, entry.priorValue)) {
|
|
43
|
+
return { ...entry, status: 'already-restored' };
|
|
44
|
+
}
|
|
45
|
+
if (!deepEqual(current, entry.appliedValue)) {
|
|
46
|
+
return { ...entry, status: 'skipped-modified', current, wouldRestore: entry.priorValue };
|
|
47
|
+
}
|
|
48
|
+
if (entry.priorValue === null) {
|
|
49
|
+
deleteNestedKey(settingsObj, entry.path);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
setNestedValue(settingsObj, entry.path, entry.priorValue);
|
|
53
|
+
}
|
|
54
|
+
return { ...entry, status: entry.priorValue === null ? 'deleted' : 'restored' };
|
|
56
55
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
56
|
+
const resultsByIndex = new Map();
|
|
57
|
+
const globalEntries = journal.entries
|
|
58
|
+
.map((entry, index) => ({ entry, index }))
|
|
59
|
+
.filter(({ entry }) => entry.scope === 'global');
|
|
60
|
+
if (globalEntries.length > 0) {
|
|
61
|
+
const globalResults = resolvedDeps.mutateSettings((freshGlobalSettings) => {
|
|
62
|
+
return globalEntries.map(({ entry }) => restoreEntry(entry, freshGlobalSettings));
|
|
63
|
+
});
|
|
64
|
+
globalEntries.forEach(({ index }, resultIndex) => {
|
|
65
|
+
resultsByIndex.set(index, globalResults[resultIndex]);
|
|
66
|
+
});
|
|
61
67
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
if (globalEntries.length > 0) {
|
|
71
|
-
const globalResults = resolvedDeps.mutateSettings((freshGlobalSettings) =>
|
|
72
|
-
globalEntries.map(({ entry }) => restoreEntry(entry, freshGlobalSettings))
|
|
73
|
-
);
|
|
74
|
-
globalEntries.forEach(({ index }, resultIndex) => {
|
|
75
|
-
resultsByIndex.set(index, globalResults[resultIndex]);
|
|
68
|
+
journal.entries.forEach((entry, index) => {
|
|
69
|
+
if (entry.scope !== 'repo')
|
|
70
|
+
return;
|
|
71
|
+
const result = restoreEntry(entry, repoSettingsFor(entry.repoRoot));
|
|
72
|
+
resultsByIndex.set(index, result);
|
|
73
|
+
if (result.status === 'restored' || result.status === 'deleted') {
|
|
74
|
+
dirtyRepoRoots.add(entry.repoRoot);
|
|
75
|
+
}
|
|
76
76
|
});
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
journal.entries.forEach((entry, index) => {
|
|
80
|
-
if (entry.scope !== 'repo') return;
|
|
81
|
-
const result = restoreEntry(entry, repoSettingsFor(entry.repoRoot));
|
|
82
|
-
resultsByIndex.set(index, result);
|
|
83
|
-
if (result.status === 'restored' || result.status === 'deleted') {
|
|
84
|
-
dirtyRepoRoots.add(entry.repoRoot);
|
|
77
|
+
for (const repoRoot of dirtyRepoRoots) {
|
|
78
|
+
resolvedDeps.writeRepoSettings(repoRoot, repoSettingsFor(repoRoot));
|
|
85
79
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
resolvedDeps.writeRepoSettings(repoRoot, repoSettingsFor(repoRoot));
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Journal entries are left in place (not cleared) so a re-run reports
|
|
93
|
-
// 'already-restored' instead of finding nothing to undo.
|
|
94
|
-
return journal.entries.map((_, index) => resultsByIndex.get(index));
|
|
80
|
+
// Journal entries are left in place (not cleared) so a re-run reports
|
|
81
|
+
// 'already-restored' instead of finding nothing to undo.
|
|
82
|
+
return journal.entries.map((_, index) => resultsByIndex.get(index));
|
|
95
83
|
}
|
|
96
|
-
|
|
97
84
|
module.exports = { undo };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
interface ClusterConfig extends Record<string, unknown> {
|
|
2
|
+
defaultLevel?: unknown;
|
|
3
|
+
defaultProvider?: string;
|
|
4
|
+
forceLevel?: unknown;
|
|
5
|
+
forceProvider?: string;
|
|
6
|
+
params?: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
interface ProviderSettings {
|
|
9
|
+
defaultLevel?: unknown;
|
|
10
|
+
}
|
|
11
|
+
interface Settings {
|
|
12
|
+
defaultProvider?: string;
|
|
13
|
+
providerSettings?: Record<string, ProviderSettings>;
|
|
14
|
+
}
|
|
15
|
+
interface OrchestratorFacade {
|
|
16
|
+
loadConfig(configPath: string): ClusterConfig;
|
|
17
|
+
}
|
|
18
|
+
declare function resolveConfigPath(configName: string): string;
|
|
19
|
+
declare function prepareClusterConfig(config: ClusterConfig, settings?: Settings, providerOverride?: string | null): ClusterConfig;
|
|
20
|
+
declare function loadClusterConfig(orchestrator: OrchestratorFacade, configPath: string, settings?: Settings, providerOverride?: string | null): ClusterConfig;
|
|
21
|
+
declare const _default: {
|
|
22
|
+
resolveConfigPath: typeof resolveConfigPath;
|
|
23
|
+
prepareClusterConfig: typeof prepareClusterConfig;
|
|
24
|
+
loadClusterConfig: typeof loadClusterConfig;
|
|
25
|
+
};
|
|
26
|
+
export = _default;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const path = require("path");
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
4
|
+
const chalk = require('chalk');
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
6
|
+
const providerNames = require('./provider-names');
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
8
|
+
const providers = require('../src/providers');
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
10
|
+
const TemplateResolver = require('../src/template-resolver');
|
|
11
|
+
const { normalizeProviderName, getDefaultProviderId } = providerNames;
|
|
12
|
+
const { getProvider } = providers;
|
|
13
|
+
const PACKAGE_ROOT = path.resolve(__dirname, '..');
|
|
14
|
+
function resolveConfigPath(configName) {
|
|
15
|
+
if (path.isAbsolute(configName) || configName.startsWith('./') || configName.startsWith('../')) {
|
|
16
|
+
return path.resolve(process.cwd(), configName);
|
|
17
|
+
}
|
|
18
|
+
if (configName.endsWith('.json')) {
|
|
19
|
+
return path.join(PACKAGE_ROOT, 'cluster-templates', configName);
|
|
20
|
+
}
|
|
21
|
+
return path.join(PACKAGE_ROOT, 'cluster-templates', `${configName}.json`);
|
|
22
|
+
}
|
|
23
|
+
function ensureConfigProviderDefaults(config, settings) {
|
|
24
|
+
if (!config.defaultProvider) {
|
|
25
|
+
config.defaultProvider = settings.defaultProvider || getDefaultProviderId();
|
|
26
|
+
}
|
|
27
|
+
config.defaultProvider = normalizeProviderName(config.defaultProvider) || getDefaultProviderId();
|
|
28
|
+
}
|
|
29
|
+
function applyProviderOverrideToConfig(config, providerOverride, settings) {
|
|
30
|
+
const provider = getProvider(providerOverride);
|
|
31
|
+
const providerSettings = settings.providerSettings?.[providerOverride] || {};
|
|
32
|
+
config.forceProvider = providerOverride;
|
|
33
|
+
config.defaultProvider = providerOverride;
|
|
34
|
+
config.forceLevel = providerSettings.defaultLevel || provider.getDefaultLevel();
|
|
35
|
+
config.defaultLevel = config.forceLevel;
|
|
36
|
+
console.log(chalk.dim(`Provider override: ${providerOverride} (all agents)`));
|
|
37
|
+
}
|
|
38
|
+
function resolveParameterizedConfigFile(config) {
|
|
39
|
+
if (!config?.params || Object.keys(config.params).length === 0) {
|
|
40
|
+
return config;
|
|
41
|
+
}
|
|
42
|
+
const resolver = new TemplateResolver(path.join(PACKAGE_ROOT, 'cluster-templates'));
|
|
43
|
+
return resolver.resolveTemplate(config, {});
|
|
44
|
+
}
|
|
45
|
+
function prepareClusterConfig(config, settings = {}, providerOverride) {
|
|
46
|
+
const prepared = resolveParameterizedConfigFile(config);
|
|
47
|
+
ensureConfigProviderDefaults(prepared, settings);
|
|
48
|
+
if (providerOverride) {
|
|
49
|
+
applyProviderOverrideToConfig(prepared, providerOverride, settings);
|
|
50
|
+
}
|
|
51
|
+
return prepared;
|
|
52
|
+
}
|
|
53
|
+
function loadClusterConfig(orchestrator, configPath, settings = {}, providerOverride) {
|
|
54
|
+
return prepareClusterConfig(orchestrator.loadConfig(configPath), settings, providerOverride);
|
|
55
|
+
}
|
|
56
|
+
module.exports = { resolveConfigPath, prepareClusterConfig, loadClusterConfig };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
type CloseIssueMode = 'auto' | 'always' | 'never';
|
|
2
|
+
interface RunOptions extends Record<string, unknown> {
|
|
3
|
+
closeIssue?: unknown;
|
|
4
|
+
dockerImage?: unknown;
|
|
5
|
+
isolation?: unknown;
|
|
6
|
+
mergeQueue?: unknown;
|
|
7
|
+
mount?: readonly string[] | null;
|
|
8
|
+
noIsolation?: unknown;
|
|
9
|
+
prBase?: unknown;
|
|
10
|
+
}
|
|
11
|
+
interface MountSpec {
|
|
12
|
+
host: string;
|
|
13
|
+
container: string;
|
|
14
|
+
readonly: boolean;
|
|
15
|
+
}
|
|
16
|
+
declare function firstTruthy<T>(...values: T[]): T | undefined;
|
|
17
|
+
declare function anyTruthy(...values: unknown[]): boolean;
|
|
18
|
+
declare function optionalValue<T>(value: T): T | undefined;
|
|
19
|
+
declare function detectGitRepoRoot(): string;
|
|
20
|
+
declare function resolveTargetCwd(): string | undefined;
|
|
21
|
+
declare function resolveEnvBool(value: unknown): boolean | undefined;
|
|
22
|
+
declare function mergeRunOptions(options: RunOptions): RunOptions;
|
|
23
|
+
declare function resolveMergeQueue(options: RunOptions): boolean | undefined;
|
|
24
|
+
declare function resolvePrBase(options: RunOptions): string | undefined;
|
|
25
|
+
declare function resolveCloseIssue(options: RunOptions): CloseIssueMode | undefined;
|
|
26
|
+
declare function resolveMounts(options: RunOptions): MountSpec[] | undefined;
|
|
27
|
+
declare const _default: {
|
|
28
|
+
firstTruthy: typeof firstTruthy;
|
|
29
|
+
anyTruthy: typeof anyTruthy;
|
|
30
|
+
optionalValue: typeof optionalValue;
|
|
31
|
+
detectGitRepoRoot: typeof detectGitRepoRoot;
|
|
32
|
+
resolveTargetCwd: typeof resolveTargetCwd;
|
|
33
|
+
resolveEnvBool: typeof resolveEnvBool;
|
|
34
|
+
mergeRunOptions: typeof mergeRunOptions;
|
|
35
|
+
resolveMergeQueue: typeof resolveMergeQueue;
|
|
36
|
+
resolvePrBase: typeof resolvePrBase;
|
|
37
|
+
resolveCloseIssue: typeof resolveCloseIssue;
|
|
38
|
+
resolveMounts: typeof resolveMounts;
|
|
39
|
+
};
|
|
40
|
+
export = _default;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const child_process_1 = require("child_process");
|
|
3
|
+
function firstTruthy(...values) {
|
|
4
|
+
return values.find(Boolean);
|
|
5
|
+
}
|
|
6
|
+
function anyTruthy(...values) {
|
|
7
|
+
return values.some(Boolean);
|
|
8
|
+
}
|
|
9
|
+
function optionalValue(value) {
|
|
10
|
+
return value || undefined;
|
|
11
|
+
}
|
|
12
|
+
function detectGitRepoRoot() {
|
|
13
|
+
try {
|
|
14
|
+
const result = (0, child_process_1.spawnSync)('git', ['rev-parse', '--show-toplevel'], {
|
|
15
|
+
encoding: 'utf8',
|
|
16
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
17
|
+
});
|
|
18
|
+
if (result.status !== 0) {
|
|
19
|
+
return process.cwd();
|
|
20
|
+
}
|
|
21
|
+
return result.stdout.trim();
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return process.cwd();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function resolveTargetCwd() {
|
|
28
|
+
return firstTruthy(process.env.ZEROSHOT_CWD, detectGitRepoRoot());
|
|
29
|
+
}
|
|
30
|
+
function resolveOptionalString(value) {
|
|
31
|
+
if (typeof value !== 'string')
|
|
32
|
+
return undefined;
|
|
33
|
+
const trimmed = value.trim();
|
|
34
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
35
|
+
}
|
|
36
|
+
function resolveEnvBool(value) {
|
|
37
|
+
if (typeof value !== 'string')
|
|
38
|
+
return undefined;
|
|
39
|
+
const trimmed = value.trim().toLowerCase();
|
|
40
|
+
if (trimmed === '1' || trimmed === 'true' || trimmed === 'yes')
|
|
41
|
+
return true;
|
|
42
|
+
if (trimmed === '0' || trimmed === 'false' || trimmed === 'no')
|
|
43
|
+
return false;
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
function resolveCloseIssueMode(value) {
|
|
47
|
+
const trimmed = resolveOptionalString(value);
|
|
48
|
+
if (!trimmed)
|
|
49
|
+
return undefined;
|
|
50
|
+
const normalized = trimmed.toLowerCase();
|
|
51
|
+
if (normalized === 'auto' || normalized === 'always' || normalized === 'never') {
|
|
52
|
+
return normalized;
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
function isRunOptions(value) {
|
|
57
|
+
return Boolean(value) && typeof value === 'object';
|
|
58
|
+
}
|
|
59
|
+
function parseRunOptionsEnv() {
|
|
60
|
+
const raw = resolveOptionalString(process.env.ZEROSHOT_RUN_OPTIONS);
|
|
61
|
+
if (!raw)
|
|
62
|
+
return null;
|
|
63
|
+
try {
|
|
64
|
+
const parsed = JSON.parse(raw);
|
|
65
|
+
if (!isRunOptions(parsed)) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
return parsed;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function parseMountSpecs(specs) {
|
|
75
|
+
return specs.map((spec) => {
|
|
76
|
+
const parts = spec.split(':');
|
|
77
|
+
if (parts.length < 2) {
|
|
78
|
+
throw new Error(`Invalid mount spec: "${spec}". Format: host:container[:ro]`);
|
|
79
|
+
}
|
|
80
|
+
const [host, container] = parts;
|
|
81
|
+
if (host === undefined || container === undefined) {
|
|
82
|
+
throw new Error(`Invalid mount spec: "${spec}". Format: host:container[:ro]`);
|
|
83
|
+
}
|
|
84
|
+
const readonly = parts[2] === 'ro';
|
|
85
|
+
return { host, container, readonly };
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const RUN_MODE_KEYS = ['docker', 'worktree', 'pr', 'ship', 'noIsolation', 'isolation'];
|
|
89
|
+
function hasExplicitRunMode(options) {
|
|
90
|
+
return RUN_MODE_KEYS.some((key) => options[key] === true || (key === 'isolation' && options[key] === false));
|
|
91
|
+
}
|
|
92
|
+
function mergeRunOptions(options) {
|
|
93
|
+
const envRunOptions = parseRunOptionsEnv();
|
|
94
|
+
if (!envRunOptions)
|
|
95
|
+
return options;
|
|
96
|
+
if (!hasExplicitRunMode(options))
|
|
97
|
+
return { ...envRunOptions, ...options };
|
|
98
|
+
const withoutEnvMode = { ...envRunOptions };
|
|
99
|
+
for (const key of RUN_MODE_KEYS)
|
|
100
|
+
delete withoutEnvMode[key];
|
|
101
|
+
return { ...withoutEnvMode, ...options };
|
|
102
|
+
}
|
|
103
|
+
function resolveMergeQueue(options) {
|
|
104
|
+
if (typeof options.mergeQueue === 'boolean') {
|
|
105
|
+
return options.mergeQueue;
|
|
106
|
+
}
|
|
107
|
+
return resolveEnvBool(process.env.ZEROSHOT_MERGE_QUEUE);
|
|
108
|
+
}
|
|
109
|
+
function resolvePrBase(options) {
|
|
110
|
+
return (resolveOptionalString(options.prBase) ||
|
|
111
|
+
resolveOptionalString(process.env.ZEROSHOT_PR_BASE) ||
|
|
112
|
+
undefined);
|
|
113
|
+
}
|
|
114
|
+
function resolveCloseIssue(options) {
|
|
115
|
+
return (resolveCloseIssueMode(options.closeIssue) ||
|
|
116
|
+
resolveCloseIssueMode(process.env.ZEROSHOT_CLOSE_ISSUE) ||
|
|
117
|
+
undefined);
|
|
118
|
+
}
|
|
119
|
+
function resolveMounts(options) {
|
|
120
|
+
return options.mount ? parseMountSpecs(options.mount) : undefined;
|
|
121
|
+
}
|
|
122
|
+
module.exports = {
|
|
123
|
+
firstTruthy,
|
|
124
|
+
anyTruthy,
|
|
125
|
+
optionalValue,
|
|
126
|
+
detectGitRepoRoot,
|
|
127
|
+
resolveTargetCwd,
|
|
128
|
+
resolveEnvBool,
|
|
129
|
+
mergeRunOptions,
|
|
130
|
+
resolveMergeQueue,
|
|
131
|
+
resolvePrBase,
|
|
132
|
+
resolveCloseIssue,
|
|
133
|
+
resolveMounts,
|
|
134
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
type RunIsolation = 'none' | 'worktree' | 'docker';
|
|
2
|
+
type RunDelivery = 'none' | 'pr' | 'ship';
|
|
3
|
+
interface RunPlan {
|
|
4
|
+
isolation: RunIsolation;
|
|
5
|
+
delivery: RunDelivery;
|
|
6
|
+
autoMerge: boolean;
|
|
7
|
+
}
|
|
8
|
+
interface Settings extends Record<string, unknown> {
|
|
9
|
+
defaultIsolation?: string;
|
|
10
|
+
defaultDelivery?: string;
|
|
11
|
+
}
|
|
12
|
+
interface RunOptions extends Record<string, unknown> {
|
|
13
|
+
autoMerge?: unknown;
|
|
14
|
+
autoPush?: unknown;
|
|
15
|
+
closeIssue?: unknown;
|
|
16
|
+
containerHome?: unknown;
|
|
17
|
+
cwd?: unknown;
|
|
18
|
+
docker?: unknown;
|
|
19
|
+
dockerImage?: unknown;
|
|
20
|
+
isolation?: unknown;
|
|
21
|
+
mergeQueue?: unknown;
|
|
22
|
+
mount?: readonly string[] | null;
|
|
23
|
+
mounts?: unknown;
|
|
24
|
+
noIsolation?: unknown;
|
|
25
|
+
noMounts?: unknown;
|
|
26
|
+
pr?: unknown;
|
|
27
|
+
prBase?: unknown;
|
|
28
|
+
preparedWorktree?: unknown;
|
|
29
|
+
requiredQualityGates?: unknown;
|
|
30
|
+
ship?: unknown;
|
|
31
|
+
worktree?: unknown;
|
|
32
|
+
}
|
|
33
|
+
interface BuildStartOptionsArgs {
|
|
34
|
+
clusterId?: unknown;
|
|
35
|
+
options?: RunOptions;
|
|
36
|
+
settings?: Settings;
|
|
37
|
+
providerOverride?: unknown;
|
|
38
|
+
modelOverride?: unknown;
|
|
39
|
+
forceProvider?: unknown;
|
|
40
|
+
}
|
|
41
|
+
interface BuildTrustedStartOptionsArgs extends BuildStartOptionsArgs {
|
|
42
|
+
plan?: RunPlan | null;
|
|
43
|
+
}
|
|
44
|
+
declare function resolveEffectiveRunPlan(options?: RunOptions, settings?: Settings): Readonly<RunPlan>;
|
|
45
|
+
declare function buildStartOptions({ clusterId, options, settings, providerOverride, modelOverride, forceProvider, }: BuildStartOptionsArgs): Readonly<Record<string, unknown>>;
|
|
46
|
+
declare function buildTrustedStartOptions({ clusterId, plan, options, settings, providerOverride, modelOverride, forceProvider, }: BuildTrustedStartOptionsArgs): Readonly<Record<string, unknown>>;
|
|
47
|
+
declare const _default: {
|
|
48
|
+
buildStartOptions: typeof buildStartOptions;
|
|
49
|
+
buildTrustedStartOptions: typeof buildTrustedStartOptions;
|
|
50
|
+
resolveEffectiveRunPlan: typeof resolveEffectiveRunPlan;
|
|
51
|
+
detectGitRepoRoot: () => string;
|
|
52
|
+
};
|
|
53
|
+
export = _default;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
3
|
+
const runPlan = require('./run-plan');
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
5
|
+
const runMode = require('./run-mode');
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
7
|
+
const environmentHelpers = require('./start-cluster-environment');
|
|
8
|
+
const { resolveRunPlan } = runPlan;
|
|
9
|
+
const { runModeFromPlan } = runMode;
|
|
10
|
+
const { firstTruthy, anyTruthy, optionalValue, detectGitRepoRoot, resolveTargetCwd, resolveEnvBool, mergeRunOptions, resolveMergeQueue, resolvePrBase, resolveCloseIssue, resolveMounts, } = environmentHelpers;
|
|
11
|
+
function isRunIsolation(value) {
|
|
12
|
+
return value === 'none' || value === 'worktree' || value === 'docker';
|
|
13
|
+
}
|
|
14
|
+
function isRunDelivery(value) {
|
|
15
|
+
return value === 'none' || value === 'pr' || value === 'ship';
|
|
16
|
+
}
|
|
17
|
+
function validateSavedRunModes(settings) {
|
|
18
|
+
const isolation = settings.defaultIsolation || 'none';
|
|
19
|
+
const delivery = settings.defaultDelivery || 'none';
|
|
20
|
+
if (!isRunIsolation(isolation)) {
|
|
21
|
+
throw new Error(`Invalid saved isolation mode: ${isolation}`);
|
|
22
|
+
}
|
|
23
|
+
if (!isRunDelivery(delivery)) {
|
|
24
|
+
throw new Error(`Invalid saved delivery mode: ${delivery}`);
|
|
25
|
+
}
|
|
26
|
+
return { isolation, delivery };
|
|
27
|
+
}
|
|
28
|
+
function resolveEffectiveIsolation(options, savedIsolation) {
|
|
29
|
+
if (options.noIsolation === true || options.isolation === false)
|
|
30
|
+
return 'none';
|
|
31
|
+
if (options.docker === true)
|
|
32
|
+
return 'docker';
|
|
33
|
+
if (options.worktree === true || options.pr === true || options.ship === true)
|
|
34
|
+
return 'worktree';
|
|
35
|
+
if (resolveEnvBool(process.env.ZEROSHOT_DOCKER) === true)
|
|
36
|
+
return 'docker';
|
|
37
|
+
if (resolveEnvBool(process.env.ZEROSHOT_WORKTREE) === true)
|
|
38
|
+
return 'worktree';
|
|
39
|
+
return savedIsolation;
|
|
40
|
+
}
|
|
41
|
+
function resolveEffectiveDelivery(options, savedDelivery) {
|
|
42
|
+
if (options.ship === true || options.autoMerge === true)
|
|
43
|
+
return 'ship';
|
|
44
|
+
if (options.pr === true || resolveEnvBool(process.env.ZEROSHOT_PR) === true)
|
|
45
|
+
return 'pr';
|
|
46
|
+
return savedDelivery;
|
|
47
|
+
}
|
|
48
|
+
function resolveEffectiveRunPlan(options = {}, settings = {}) {
|
|
49
|
+
const mergedOptions = mergeRunOptions(options);
|
|
50
|
+
const noIsolation = mergedOptions.noIsolation === true || mergedOptions.isolation === false;
|
|
51
|
+
const conflicts = ['docker', 'worktree', 'pr', 'ship'].filter((key) => mergedOptions[key] === true);
|
|
52
|
+
if (noIsolation && conflicts.length > 0) {
|
|
53
|
+
throw new Error(`--no-isolation conflicts with --${conflicts.join(', --')}`);
|
|
54
|
+
}
|
|
55
|
+
const saved = validateSavedRunModes(settings);
|
|
56
|
+
let isolation = resolveEffectiveIsolation(mergedOptions, saved.isolation);
|
|
57
|
+
const delivery = resolveEffectiveDelivery(mergedOptions, saved.delivery);
|
|
58
|
+
if (delivery !== 'none' && isolation === 'none') {
|
|
59
|
+
if (noIsolation) {
|
|
60
|
+
throw new Error(`--no-isolation conflicts with saved delivery mode "${delivery}"`);
|
|
61
|
+
}
|
|
62
|
+
isolation = 'worktree';
|
|
63
|
+
}
|
|
64
|
+
return resolveRunPlan({
|
|
65
|
+
docker: isolation === 'docker',
|
|
66
|
+
worktree: isolation === 'worktree',
|
|
67
|
+
pr: delivery === 'pr',
|
|
68
|
+
ship: delivery === 'ship',
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function buildStartOptionsFromPlan({ clusterId, plan, options, settings, providerOverride, modelOverride, forceProvider, preparedWorktree, environment, }) {
|
|
72
|
+
const targetCwd = environment ? resolveTargetCwd() : options.cwd;
|
|
73
|
+
return Object.freeze({
|
|
74
|
+
clusterId,
|
|
75
|
+
cwd: targetCwd,
|
|
76
|
+
isolation: plan.isolation === 'docker',
|
|
77
|
+
isolationImage: environment
|
|
78
|
+
? firstTruthy(options.dockerImage, process.env.ZEROSHOT_DOCKER_IMAGE)
|
|
79
|
+
: optionalValue(options.dockerImage),
|
|
80
|
+
worktree: plan.isolation === 'worktree',
|
|
81
|
+
preparedWorktree: preparedWorktree || undefined,
|
|
82
|
+
autoPr: plan.delivery !== 'none',
|
|
83
|
+
autoMerge: plan.autoMerge,
|
|
84
|
+
autoPush: environment ? process.env.ZEROSHOT_PUSH === '1' : options.autoPush === true,
|
|
85
|
+
modelOverride: optionalValue(modelOverride),
|
|
86
|
+
providerOverride: optionalValue(providerOverride),
|
|
87
|
+
noMounts: anyTruthy(options.mounts === false, options.noMounts === true),
|
|
88
|
+
mounts: resolveMounts(options),
|
|
89
|
+
containerHome: optionalValue(options.containerHome),
|
|
90
|
+
forceProvider: optionalValue(forceProvider),
|
|
91
|
+
prBase: environment ? resolvePrBase(options) : optionalValue(options.prBase),
|
|
92
|
+
mergeQueue: environment ? resolveMergeQueue(options) : optionalValue(options.mergeQueue),
|
|
93
|
+
closeIssue: environment ? resolveCloseIssue(options) : optionalValue(options.closeIssue),
|
|
94
|
+
ship: plan.delivery === 'ship',
|
|
95
|
+
runMode: runModeFromPlan(plan),
|
|
96
|
+
requiredQualityGates: options.requiredQualityGates,
|
|
97
|
+
settings,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
function buildStartOptions({ clusterId, options = {}, settings = {}, providerOverride, modelOverride, forceProvider, }) {
|
|
101
|
+
const mergedOptions = mergeRunOptions(options);
|
|
102
|
+
const plan = resolveEffectiveRunPlan(options, settings);
|
|
103
|
+
return buildStartOptionsFromPlan({
|
|
104
|
+
clusterId,
|
|
105
|
+
plan,
|
|
106
|
+
options: mergedOptions,
|
|
107
|
+
settings,
|
|
108
|
+
providerOverride,
|
|
109
|
+
modelOverride,
|
|
110
|
+
forceProvider,
|
|
111
|
+
environment: true,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function buildTrustedStartOptions({ clusterId, plan, options = {}, settings = {}, providerOverride, modelOverride, forceProvider, }) {
|
|
115
|
+
if (!plan || !Object.isFrozen(plan)) {
|
|
116
|
+
throw new Error('Trusted start requires a frozen canonical run plan');
|
|
117
|
+
}
|
|
118
|
+
const canonical = resolveRunPlan({
|
|
119
|
+
docker: plan.isolation === 'docker',
|
|
120
|
+
worktree: plan.isolation === 'worktree',
|
|
121
|
+
pr: plan.delivery === 'pr',
|
|
122
|
+
ship: plan.delivery === 'ship',
|
|
123
|
+
});
|
|
124
|
+
if (canonical.isolation !== plan.isolation ||
|
|
125
|
+
canonical.delivery !== plan.delivery ||
|
|
126
|
+
canonical.autoMerge !== plan.autoMerge) {
|
|
127
|
+
throw new Error('Trusted start plan is not canonical');
|
|
128
|
+
}
|
|
129
|
+
if (canonical.isolation === 'none') {
|
|
130
|
+
throw new Error('Trusted worker start requires worktree or docker isolation');
|
|
131
|
+
}
|
|
132
|
+
if (options.preparedWorktree && canonical.isolation !== 'worktree') {
|
|
133
|
+
throw new Error('Prepared worktree requires canonical worktree isolation');
|
|
134
|
+
}
|
|
135
|
+
return buildStartOptionsFromPlan({
|
|
136
|
+
clusterId,
|
|
137
|
+
plan: canonical,
|
|
138
|
+
options,
|
|
139
|
+
settings,
|
|
140
|
+
providerOverride,
|
|
141
|
+
modelOverride,
|
|
142
|
+
forceProvider,
|
|
143
|
+
preparedWorktree: options.preparedWorktree,
|
|
144
|
+
environment: false,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
module.exports = { buildStartOptions, buildTrustedStartOptions, resolveEffectiveRunPlan, detectGitRepoRoot };
|