@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,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The single canonical run-mode resolver.
|
|
3
|
+
*
|
|
4
|
+
* Every consumer (orchestrator, daemon startup, CLI label) derives isolation,
|
|
5
|
+
* delivery, and autoMerge from THIS function and nowhere else. The raw
|
|
6
|
+
* worktree/docker/pr/ship/autoMerge booleans are inputs; the frozen plan is the
|
|
7
|
+
* one truth. Deriving autoMerge separately (the old `Boolean(ship)` scatter) is
|
|
8
|
+
* what let `--pr` merge and let the run-mode label drift from behavior.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
type RunIsolation = 'none' | 'worktree' | 'docker';
|
|
12
|
+
type RunDelivery = 'none' | 'pr' | 'ship';
|
|
13
|
+
|
|
14
|
+
interface RunOptions {
|
|
15
|
+
worktree?: unknown;
|
|
16
|
+
docker?: unknown;
|
|
17
|
+
pr?: unknown;
|
|
18
|
+
ship?: unknown;
|
|
19
|
+
autoMerge?: unknown;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
interface RunPlan {
|
|
23
|
+
isolation: RunIsolation;
|
|
24
|
+
delivery: RunDelivery;
|
|
25
|
+
autoMerge: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function resolveIsolation(options: RunOptions): RunIsolation {
|
|
29
|
+
if (options.docker) return 'docker';
|
|
30
|
+
if (options.worktree || options.pr || options.ship) return 'worktree';
|
|
31
|
+
return 'none';
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function resolveDelivery(options: RunOptions): RunDelivery {
|
|
35
|
+
// Explicit autoMerge (e.g. a future `--auto-merge` flag) is ship-equivalent:
|
|
36
|
+
// "merge it" implies the ship delivery. This is the ONLY place that intent is
|
|
37
|
+
// interpreted, so it can never be silently overwritten downstream.
|
|
38
|
+
if (options.ship || options.autoMerge === true) return 'ship';
|
|
39
|
+
if (options.pr) return 'pr';
|
|
40
|
+
return 'none';
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function resolveRunPlan(options: RunOptions = {}): Readonly<RunPlan> {
|
|
44
|
+
const isolation = resolveIsolation(options);
|
|
45
|
+
const delivery = resolveDelivery(options);
|
|
46
|
+
return Object.freeze({ isolation, delivery, autoMerge: delivery === 'ship' });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export = { resolveRunPlan };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude authentication settings and helpers
|
|
3
|
+
* Extracted from settings.js for provider-specific isolation
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import providerNames = require('../provider-names');
|
|
7
|
+
|
|
8
|
+
interface ClaudeProviderSettings {
|
|
9
|
+
readonly anthropicApiKey?: string;
|
|
10
|
+
readonly bedrockApiKey?: string;
|
|
11
|
+
readonly bedrockRegion?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
interface Settings {
|
|
15
|
+
readonly providerSettings?: {
|
|
16
|
+
readonly claude?: ClaudeProviderSettings;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Anthropic API key prefix for validation
|
|
22
|
+
*/
|
|
23
|
+
const ANTHROPIC_KEY_PREFIX = 'sk-ant-';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Environment variables used for Claude authentication
|
|
27
|
+
*/
|
|
28
|
+
const CLAUDE_AUTH_ENV_VARS = [
|
|
29
|
+
...providerNames.getProviderMetadata('claude').docker.envPassthrough,
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Validate an Anthropic API key format
|
|
34
|
+
*/
|
|
35
|
+
function isValidAnthropicKey(key: string | null | undefined): boolean {
|
|
36
|
+
return !key || key.startsWith(ANTHROPIC_KEY_PREFIX);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Check if Bedrock mode is active based on env and overrides
|
|
41
|
+
*/
|
|
42
|
+
function isBedrockMode(envOverrides: NodeJS.ProcessEnv = {}): boolean {
|
|
43
|
+
return (
|
|
44
|
+
envOverrides.CLAUDE_CODE_USE_BEDROCK === '1' || process.env.CLAUDE_CODE_USE_BEDROCK === '1'
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Resolve Claude authentication environment variables from settings.
|
|
50
|
+
* Bedrock takes priority over direct Anthropic API key and OAuth sessions.
|
|
51
|
+
*/
|
|
52
|
+
function resolveClaudeAuth(settings: Settings): NodeJS.ProcessEnv {
|
|
53
|
+
const claudeSettings = settings.providerSettings?.claude || {};
|
|
54
|
+
const env: NodeJS.ProcessEnv = {};
|
|
55
|
+
|
|
56
|
+
if (!process.env.AWS_BEARER_TOKEN_BEDROCK && claudeSettings.bedrockApiKey) {
|
|
57
|
+
env.AWS_BEARER_TOKEN_BEDROCK = claudeSettings.bedrockApiKey;
|
|
58
|
+
env.CLAUDE_CODE_USE_BEDROCK = '1';
|
|
59
|
+
if (claudeSettings.bedrockRegion && !process.env.AWS_REGION) {
|
|
60
|
+
env.AWS_REGION = claudeSettings.bedrockRegion;
|
|
61
|
+
}
|
|
62
|
+
} else if (process.env.AWS_BEARER_TOKEN_BEDROCK && !process.env.CLAUDE_CODE_USE_BEDROCK) {
|
|
63
|
+
env.CLAUDE_CODE_USE_BEDROCK = '1';
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const hasBedrock = env.AWS_BEARER_TOKEN_BEDROCK || process.env.AWS_BEARER_TOKEN_BEDROCK;
|
|
67
|
+
if (!process.env.ANTHROPIC_API_KEY && !hasBedrock && claudeSettings.anthropicApiKey) {
|
|
68
|
+
env.ANTHROPIC_API_KEY = claudeSettings.anthropicApiKey;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return env;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export = {
|
|
75
|
+
ANTHROPIC_KEY_PREFIX,
|
|
76
|
+
CLAUDE_AUTH_ENV_VARS,
|
|
77
|
+
isValidAnthropicKey,
|
|
78
|
+
isBedrockMode,
|
|
79
|
+
resolveClaudeAuth,
|
|
80
|
+
};
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
interface ProviderLevelSettings extends Record<string, unknown> {
|
|
2
|
+
levelOverrides?: Record<string, unknown>;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
type ProviderSettingsRecord = Record<string, ProviderLevelSettings>;
|
|
6
|
+
|
|
7
|
+
interface SettingsRecord extends Record<string, unknown> {
|
|
8
|
+
autoCheckUpdates?: unknown;
|
|
9
|
+
defaultDocker?: unknown;
|
|
10
|
+
defaultIsolation?: unknown;
|
|
11
|
+
defaultProvider?: unknown;
|
|
12
|
+
lastUpdateCheckClaim?: unknown;
|
|
13
|
+
providerSettings?: ProviderSettingsRecord;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface ProviderDefaultsFacade {
|
|
17
|
+
getProviderDefaults(): ProviderSettingsRecord;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
interface ProviderNamesFacade {
|
|
21
|
+
VALID_PROVIDERS: readonly string[];
|
|
22
|
+
getDefaultProviderId(): string;
|
|
23
|
+
normalizeProviderName<T>(name: T): T | string;
|
|
24
|
+
normalizeProviderSettings<T>(settings: T): T | Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface SettingsModelsFacade {
|
|
28
|
+
applyLegacyModelBounds(settings: SettingsRecord): SettingsRecord;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface IssueProviderLoaderFacade {
|
|
32
|
+
getIssueProviderFns(): {
|
|
33
|
+
getIssueProviderSettingsDefaults(): SettingsRecord;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
38
|
+
const providerDefaults: ProviderDefaultsFacade = require('./provider-defaults');
|
|
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 settingsModels: SettingsModelsFacade = require('./settings-models');
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
44
|
+
const issueProviders: IssueProviderLoaderFacade = require('./settings-issue-providers');
|
|
45
|
+
|
|
46
|
+
const { getProviderDefaults } = providerDefaults;
|
|
47
|
+
const {
|
|
48
|
+
VALID_PROVIDERS,
|
|
49
|
+
getDefaultProviderId,
|
|
50
|
+
normalizeProviderName,
|
|
51
|
+
normalizeProviderSettings,
|
|
52
|
+
} = providerNames;
|
|
53
|
+
const { applyLegacyModelBounds } = settingsModels;
|
|
54
|
+
const { getIssueProviderFns } = issueProviders;
|
|
55
|
+
|
|
56
|
+
const DEFAULT_SETTINGS_BASE: SettingsRecord = {
|
|
57
|
+
maxModel: 'opus',
|
|
58
|
+
minModel: null,
|
|
59
|
+
defaultProvider: getDefaultProviderId(),
|
|
60
|
+
get providerSettings(): ProviderSettingsRecord {
|
|
61
|
+
return getProviderDefaults();
|
|
62
|
+
},
|
|
63
|
+
defaultConfig: 'conductor-bootstrap',
|
|
64
|
+
defaultIsolation: 'none',
|
|
65
|
+
defaultDelivery: 'none',
|
|
66
|
+
setupVersion: null,
|
|
67
|
+
strictSchema: true,
|
|
68
|
+
logLevel: 'normal',
|
|
69
|
+
autoCheckUpdates: true,
|
|
70
|
+
lastUpdateCheckAt: null,
|
|
71
|
+
lastSeenVersion: null,
|
|
72
|
+
lastUpdateCheckClaim: null,
|
|
73
|
+
claudeCommand: 'claude',
|
|
74
|
+
dockerMounts: ['gh', 'git', 'ssh'],
|
|
75
|
+
dockerEnvPassthrough: [],
|
|
76
|
+
dockerContainerHome: '/home/node',
|
|
77
|
+
maxRetries: 3,
|
|
78
|
+
maxRestartAttempts: 3,
|
|
79
|
+
maxTotalRestarts: 10,
|
|
80
|
+
staleWarningsBeforeKill: 2,
|
|
81
|
+
backoffBaseMs: 2000,
|
|
82
|
+
backoffMaxMs: 30000,
|
|
83
|
+
jitterFactor: 0.2,
|
|
84
|
+
defaultIssueSource: 'github',
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
let defaultSettingsCache: SettingsRecord | null = null;
|
|
88
|
+
|
|
89
|
+
function getDefaultSettings(): SettingsRecord {
|
|
90
|
+
if (!defaultSettingsCache) {
|
|
91
|
+
const issueProviderSettings = getIssueProviderFns().getIssueProviderSettingsDefaults();
|
|
92
|
+
defaultSettingsCache = {
|
|
93
|
+
...DEFAULT_SETTINGS_BASE,
|
|
94
|
+
...issueProviderSettings,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return defaultSettingsCache;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function propertyValue(settings: SettingsRecord, property: PropertyKey): unknown {
|
|
101
|
+
return typeof property === 'string' ? settings[property] : undefined;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const DEFAULT_SETTINGS: SettingsRecord = new Proxy(DEFAULT_SETTINGS_BASE, {
|
|
105
|
+
get(target, property): unknown {
|
|
106
|
+
if (property in target) {
|
|
107
|
+
return propertyValue(target, property);
|
|
108
|
+
}
|
|
109
|
+
return propertyValue(getDefaultSettings(), property);
|
|
110
|
+
},
|
|
111
|
+
has(target, property): boolean {
|
|
112
|
+
if (property in target) return true;
|
|
113
|
+
return property in getDefaultSettings();
|
|
114
|
+
},
|
|
115
|
+
ownKeys(): string[] {
|
|
116
|
+
return Object.keys(getDefaultSettings());
|
|
117
|
+
},
|
|
118
|
+
getOwnPropertyDescriptor(_target, property): PropertyDescriptor | undefined {
|
|
119
|
+
const merged = getDefaultSettings();
|
|
120
|
+
if (property in merged) {
|
|
121
|
+
return { enumerable: true, configurable: true, value: propertyValue(merged, property) };
|
|
122
|
+
}
|
|
123
|
+
return undefined;
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
function isUnknownRecord(value: unknown): value is Record<string, unknown> {
|
|
128
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function providerOverride(value: unknown, provider: string): Record<string, unknown> {
|
|
132
|
+
if (!isUnknownRecord(value)) return {};
|
|
133
|
+
const selected = value[provider];
|
|
134
|
+
return isUnknownRecord(selected) ? selected : {};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function mergeProviderSettings(
|
|
138
|
+
current: ProviderSettingsRecord,
|
|
139
|
+
overrides?: unknown
|
|
140
|
+
): ProviderSettingsRecord {
|
|
141
|
+
const providerDefaultsValue = getProviderDefaults();
|
|
142
|
+
const merged: ProviderSettingsRecord = {};
|
|
143
|
+
|
|
144
|
+
for (const provider of VALID_PROVIDERS) {
|
|
145
|
+
merged[provider] = {
|
|
146
|
+
...(providerDefaultsValue[provider] || {}),
|
|
147
|
+
...(current[provider] || {}),
|
|
148
|
+
...providerOverride(overrides, provider),
|
|
149
|
+
};
|
|
150
|
+
if (!merged[provider].levelOverrides) {
|
|
151
|
+
merged[provider].levelOverrides = {};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return merged;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function normalizeLoadedSettings(parsed: SettingsRecord): SettingsRecord {
|
|
158
|
+
const normalized = { ...parsed };
|
|
159
|
+
if (!Object.hasOwn(parsed, 'defaultIsolation') && typeof parsed.defaultDocker === 'boolean') {
|
|
160
|
+
normalized.defaultIsolation = parsed.defaultDocker ? 'docker' : 'none';
|
|
161
|
+
}
|
|
162
|
+
delete normalized.defaultDocker;
|
|
163
|
+
if (parsed.defaultProvider) {
|
|
164
|
+
normalized.defaultProvider = normalizeProviderName(parsed.defaultProvider);
|
|
165
|
+
}
|
|
166
|
+
if (parsed.providerSettings) {
|
|
167
|
+
const normalizedProviders = normalizeProviderSettings(parsed.providerSettings);
|
|
168
|
+
if (isProviderSettingsRecord(normalizedProviders)) {
|
|
169
|
+
normalized.providerSettings = normalizedProviders;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (
|
|
173
|
+
normalized.autoCheckUpdates === false ||
|
|
174
|
+
typeof normalized.lastUpdateCheckClaim !== 'string' ||
|
|
175
|
+
normalized.lastUpdateCheckClaim.trim().length === 0
|
|
176
|
+
) {
|
|
177
|
+
normalized.lastUpdateCheckClaim = null;
|
|
178
|
+
}
|
|
179
|
+
return normalized;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function isProviderSettingsRecord(value: unknown): value is ProviderSettingsRecord {
|
|
183
|
+
return isUnknownRecord(value);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function resolvedDefaultSettings(): SettingsRecord {
|
|
187
|
+
return {
|
|
188
|
+
...DEFAULT_SETTINGS,
|
|
189
|
+
providerSettings: mergeProviderSettings(getProviderDefaults()),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function mergeLoadedSettings(parsed: SettingsRecord): SettingsRecord {
|
|
194
|
+
const normalized = normalizeLoadedSettings(parsed);
|
|
195
|
+
const merged = { ...resolvedDefaultSettings(), ...normalized };
|
|
196
|
+
merged.defaultProvider =
|
|
197
|
+
normalizeProviderName(merged.defaultProvider) || DEFAULT_SETTINGS.defaultProvider;
|
|
198
|
+
merged.providerSettings = mergeProviderSettings(
|
|
199
|
+
getProviderDefaults(),
|
|
200
|
+
normalized.providerSettings
|
|
201
|
+
);
|
|
202
|
+
if (
|
|
203
|
+
merged.autoCheckUpdates === false ||
|
|
204
|
+
typeof merged.lastUpdateCheckClaim !== 'string' ||
|
|
205
|
+
merged.lastUpdateCheckClaim.trim().length === 0
|
|
206
|
+
) {
|
|
207
|
+
merged.lastUpdateCheckClaim = null;
|
|
208
|
+
}
|
|
209
|
+
return applyLegacyModelBounds(merged);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export = { DEFAULT_SETTINGS, resolvedDefaultSettings, mergeLoadedSettings };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface IssueProviderFacade {
|
|
2
|
+
getIssueProviderSettingsDefaults(): Record<string, unknown>;
|
|
3
|
+
listProviders(): readonly string[];
|
|
4
|
+
validateIssueProviderSetting(key: string, value: unknown): string | null | undefined;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
let issueProviderFns: IssueProviderFacade | null = null;
|
|
8
|
+
|
|
9
|
+
function getIssueProviderFns(): IssueProviderFacade {
|
|
10
|
+
if (issueProviderFns) return issueProviderFns;
|
|
11
|
+
// Lazy load preserves the issue-providers -> settings -> issue-providers boundary.
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
13
|
+
const loaded: IssueProviderFacade = require('../src/issue-providers');
|
|
14
|
+
issueProviderFns = loaded;
|
|
15
|
+
return loaded;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export = { getIssueProviderFns };
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
type ModelLevel = 'level1' | 'level2' | 'level3';
|
|
2
|
+
|
|
3
|
+
interface ProviderLevelSettings extends Record<string, unknown> {
|
|
4
|
+
defaultLevel?: ModelLevel;
|
|
5
|
+
maxLevel?: ModelLevel;
|
|
6
|
+
minLevel?: ModelLevel;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
interface SettingsRecord extends Record<string, unknown> {
|
|
10
|
+
maxModel?: string | null;
|
|
11
|
+
minModel?: string | null;
|
|
12
|
+
providerSettings?: Record<string, ProviderLevelSettings>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const MODEL_HIERARCHY: Readonly<Record<string, number>> = Object.freeze({
|
|
16
|
+
opus: 3,
|
|
17
|
+
fable: 3,
|
|
18
|
+
sonnet: 2,
|
|
19
|
+
haiku: 1,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const VALID_MODELS = Object.keys(MODEL_HIERARCHY);
|
|
23
|
+
const LEVEL_RANKS: Readonly<Record<ModelLevel, number>> = Object.freeze({
|
|
24
|
+
level1: 1,
|
|
25
|
+
level2: 2,
|
|
26
|
+
level3: 3,
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
function validateModelAgainstMax(
|
|
30
|
+
requestedModel: string | null | undefined,
|
|
31
|
+
maxModel: string,
|
|
32
|
+
minModel: string | null = null
|
|
33
|
+
): string {
|
|
34
|
+
if (!requestedModel) return maxModel;
|
|
35
|
+
|
|
36
|
+
if (!VALID_MODELS.includes(requestedModel)) {
|
|
37
|
+
throw new Error(`Invalid model "${requestedModel}". Valid: ${VALID_MODELS.join(', ')}`);
|
|
38
|
+
}
|
|
39
|
+
if (!VALID_MODELS.includes(maxModel)) {
|
|
40
|
+
throw new Error(`Invalid maxModel "${maxModel}". Valid: ${VALID_MODELS.join(', ')}`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const requestedRank = MODEL_HIERARCHY[requestedModel] ?? 0;
|
|
44
|
+
const maximumRank = MODEL_HIERARCHY[maxModel] ?? 0;
|
|
45
|
+
if (requestedRank > maximumRank) {
|
|
46
|
+
throw new Error(
|
|
47
|
+
`Agent requests "${requestedModel}" but maxModel is "${maxModel}". ` +
|
|
48
|
+
`Either lower agent's model or raise maxModel.`
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (minModel) {
|
|
53
|
+
if (!VALID_MODELS.includes(minModel)) {
|
|
54
|
+
throw new Error(`Invalid minModel "${minModel}". Valid: ${VALID_MODELS.join(', ')}`);
|
|
55
|
+
}
|
|
56
|
+
const minimumRank = MODEL_HIERARCHY[minModel] ?? 0;
|
|
57
|
+
if (minimumRank > maximumRank) {
|
|
58
|
+
throw new Error(`minModel "${minModel}" cannot be higher than maxModel "${maxModel}".`);
|
|
59
|
+
}
|
|
60
|
+
if (requestedRank < minimumRank) {
|
|
61
|
+
throw new Error(
|
|
62
|
+
`Agent requests "${requestedModel}" but minModel is "${minModel}". ` +
|
|
63
|
+
`Either raise agent's model or lower minModel.`
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return requestedModel;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function mapLegacyModelToLevel(model: unknown): ModelLevel | null {
|
|
72
|
+
switch (model) {
|
|
73
|
+
case 'haiku':
|
|
74
|
+
return 'level1';
|
|
75
|
+
case 'sonnet':
|
|
76
|
+
return 'level2';
|
|
77
|
+
case 'opus':
|
|
78
|
+
return 'level3';
|
|
79
|
+
default:
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function levelRank(level: ModelLevel | undefined, fallback: ModelLevel): number {
|
|
85
|
+
return LEVEL_RANKS[level ?? fallback];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function applyLegacyModelBounds(settings: SettingsRecord): SettingsRecord {
|
|
89
|
+
if (!settings.providerSettings) return settings;
|
|
90
|
+
const claude = settings.providerSettings.claude || {};
|
|
91
|
+
const legacyMaxLevel = mapLegacyModelToLevel(settings.maxModel);
|
|
92
|
+
const legacyMinLevel = mapLegacyModelToLevel(settings.minModel);
|
|
93
|
+
|
|
94
|
+
if (legacyMaxLevel) {
|
|
95
|
+
claude.maxLevel = legacyMaxLevel;
|
|
96
|
+
}
|
|
97
|
+
if (legacyMinLevel) {
|
|
98
|
+
claude.minLevel = legacyMinLevel;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const minRank = levelRank(claude.minLevel, 'level1');
|
|
102
|
+
const maxRank = levelRank(claude.maxLevel, 'level3');
|
|
103
|
+
const defaultRank = levelRank(claude.defaultLevel, 'level2');
|
|
104
|
+
|
|
105
|
+
if (minRank > maxRank) {
|
|
106
|
+
claude.minLevel = 'level1';
|
|
107
|
+
claude.maxLevel = 'level3';
|
|
108
|
+
} else if (defaultRank < minRank && claude.minLevel !== undefined) {
|
|
109
|
+
claude.defaultLevel = claude.minLevel;
|
|
110
|
+
} else if (defaultRank > maxRank && claude.maxLevel !== undefined) {
|
|
111
|
+
claude.defaultLevel = claude.maxLevel;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
settings.providerSettings.claude = claude;
|
|
115
|
+
return settings;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export = {
|
|
119
|
+
MODEL_HIERARCHY,
|
|
120
|
+
VALID_MODELS,
|
|
121
|
+
validateModelAgainstMax,
|
|
122
|
+
mapLegacyModelToLevel,
|
|
123
|
+
applyLegacyModelBounds,
|
|
124
|
+
};
|