@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
package/lib/repo-settings.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* Repo-local settings for zeroshot
|
|
3
4
|
*
|
|
@@ -7,77 +8,100 @@
|
|
|
7
8
|
* This complements the global user settings at:
|
|
8
9
|
* ~/.zeroshot/settings.json
|
|
9
10
|
*/
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
const childProcess = __importStar(require("child_process"));
|
|
45
|
+
const fs = __importStar(require("fs"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const { execSync } = childProcess;
|
|
48
|
+
function safeJsonParse(text) {
|
|
49
|
+
try {
|
|
50
|
+
const parsed = JSON.parse(text);
|
|
51
|
+
return parsed;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
21
56
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
57
|
+
function getGitRoot(dir) {
|
|
58
|
+
try {
|
|
59
|
+
return execSync('git rev-parse --show-toplevel', {
|
|
60
|
+
cwd: dir,
|
|
61
|
+
encoding: 'utf8',
|
|
62
|
+
stdio: 'pipe',
|
|
63
|
+
}).trim();
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
33
68
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
69
|
+
function readSettingsFile(filePath) {
|
|
70
|
+
try {
|
|
71
|
+
const raw = fs.readFileSync(filePath, 'utf8');
|
|
72
|
+
const parsed = safeJsonParse(raw);
|
|
73
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
return parsed;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return null;
|
|
41
80
|
}
|
|
42
|
-
return parsed;
|
|
43
|
-
} catch {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
81
|
}
|
|
47
|
-
|
|
48
82
|
/**
|
|
49
83
|
* Read repo-local settings if present.
|
|
50
|
-
*
|
|
51
|
-
* @param {string} startDir - Directory inside the repo (usually process.cwd()).
|
|
52
|
-
* @returns {{repoRoot: string|null, settings: object|null, settingsPath: string|null}}
|
|
53
84
|
*/
|
|
54
85
|
function readRepoSettings(startDir) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const settings = _readSettingsFile(settingsPath);
|
|
66
|
-
return { repoRoot, settings, settingsPath };
|
|
86
|
+
const repoRoot = getGitRoot(startDir);
|
|
87
|
+
if (!repoRoot) {
|
|
88
|
+
return { repoRoot: null, settings: null, settingsPath: null };
|
|
89
|
+
}
|
|
90
|
+
const settingsPath = path.join(repoRoot, '.zeroshot', 'settings.json');
|
|
91
|
+
if (!fs.existsSync(settingsPath)) {
|
|
92
|
+
return { repoRoot, settings: null, settingsPath };
|
|
93
|
+
}
|
|
94
|
+
const settings = readSettingsFile(settingsPath);
|
|
95
|
+
return { repoRoot, settings, settingsPath };
|
|
67
96
|
}
|
|
68
|
-
|
|
69
97
|
/**
|
|
70
98
|
* Write repo-local settings.
|
|
71
|
-
*
|
|
72
|
-
* @param {string} repoRoot - Repo root directory (as returned by readRepoSettings).
|
|
73
|
-
* @param {object} settings - Settings object to persist.
|
|
74
|
-
* @returns {string} The path written to.
|
|
75
99
|
*/
|
|
76
100
|
function writeRepoSettings(repoRoot, settings) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
101
|
+
const settingsPath = path.join(repoRoot, '.zeroshot', 'settings.json');
|
|
102
|
+
fs.mkdirSync(path.dirname(settingsPath), { recursive: true });
|
|
103
|
+
const serialized = JSON.stringify(settings, null, 2);
|
|
104
|
+
fs.writeFileSync(settingsPath, serialized, 'utf8');
|
|
105
|
+
return settingsPath;
|
|
81
106
|
}
|
|
82
|
-
|
|
83
107
|
module.exports = { readRepoSettings, writeRepoSettings };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
type RunMode = 'ship' | 'ship+docker' | 'pr' | 'pr+docker' | 'docker' | 'worktree' | null;
|
|
2
|
+
interface RunModePlan {
|
|
3
|
+
isolation: 'none' | 'worktree' | 'docker';
|
|
4
|
+
delivery: 'none' | 'pr' | 'ship';
|
|
5
|
+
}
|
|
6
|
+
interface RunModeOptions {
|
|
7
|
+
worktree?: unknown;
|
|
8
|
+
docker?: unknown;
|
|
9
|
+
pr?: unknown;
|
|
10
|
+
ship?: unknown;
|
|
11
|
+
autoMerge?: unknown;
|
|
12
|
+
}
|
|
13
|
+
declare function runModeFromPlan({ isolation, delivery }: RunModePlan): RunMode;
|
|
14
|
+
declare function resolveRunMode(options?: RunModeOptions): RunMode;
|
|
15
|
+
declare function describeRunMode(mode: PropertyKey | null | undefined): string;
|
|
16
|
+
declare const _default: {
|
|
17
|
+
resolveRunMode: typeof resolveRunMode;
|
|
18
|
+
runModeFromPlan: typeof runModeFromPlan;
|
|
19
|
+
describeRunMode: typeof describeRunMode;
|
|
20
|
+
};
|
|
21
|
+
export = _default;
|
package/lib/run-mode.js
CHANGED
|
@@ -1,34 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
const runPlan = require("./run-plan");
|
|
3
|
+
const { resolveRunPlan } = runPlan;
|
|
3
4
|
// The run-mode label is a VIEW of the canonical plan, never an independent
|
|
4
5
|
// cascade. Deriving it from the plan is what keeps the user-facing label and the
|
|
5
6
|
// actual isolation/delivery/autoMerge behavior from drifting apart. Callers that
|
|
6
7
|
// already hold a plan (e.g. the effective plan with env/settings folded in) use
|
|
7
8
|
// runModeFromPlan directly so the label reflects the SAME plan as behavior.
|
|
8
9
|
function runModeFromPlan({ isolation, delivery }) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
const dockerSuffix = isolation === 'docker' ? '+docker' : '';
|
|
11
|
+
if (delivery === 'ship')
|
|
12
|
+
return `ship${dockerSuffix}`;
|
|
13
|
+
if (delivery === 'pr')
|
|
14
|
+
return `pr${dockerSuffix}`;
|
|
15
|
+
if (isolation === 'docker')
|
|
16
|
+
return 'docker';
|
|
17
|
+
if (isolation === 'worktree')
|
|
18
|
+
return 'worktree';
|
|
19
|
+
return null;
|
|
15
20
|
}
|
|
16
|
-
|
|
17
21
|
function resolveRunMode(options) {
|
|
18
|
-
|
|
22
|
+
return runModeFromPlan(resolveRunPlan(options));
|
|
19
23
|
}
|
|
20
|
-
|
|
21
24
|
const RUN_MODE_LABELS = {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
ship: 'ship (worktree + PR + auto-merge)',
|
|
26
|
+
'ship+docker': 'ship (docker + PR + auto-merge)',
|
|
27
|
+
pr: 'pr (worktree + PR)',
|
|
28
|
+
'pr+docker': 'pr (docker + PR)',
|
|
29
|
+
docker: 'docker (isolated container)',
|
|
30
|
+
worktree: 'worktree (isolated branch)',
|
|
28
31
|
};
|
|
29
|
-
|
|
30
32
|
function describeRunMode(mode) {
|
|
31
|
-
|
|
33
|
+
return RUN_MODE_LABELS[mode ?? ''] || 'local (no isolation)';
|
|
32
34
|
}
|
|
33
|
-
|
|
34
35
|
module.exports = { resolveRunMode, runModeFromPlan, describeRunMode };
|
|
@@ -0,0 +1,28 @@
|
|
|
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
|
+
type RunIsolation = 'none' | 'worktree' | 'docker';
|
|
11
|
+
type RunDelivery = 'none' | 'pr' | 'ship';
|
|
12
|
+
interface RunOptions {
|
|
13
|
+
worktree?: unknown;
|
|
14
|
+
docker?: unknown;
|
|
15
|
+
pr?: unknown;
|
|
16
|
+
ship?: unknown;
|
|
17
|
+
autoMerge?: unknown;
|
|
18
|
+
}
|
|
19
|
+
interface RunPlan {
|
|
20
|
+
isolation: RunIsolation;
|
|
21
|
+
delivery: RunDelivery;
|
|
22
|
+
autoMerge: boolean;
|
|
23
|
+
}
|
|
24
|
+
declare function resolveRunPlan(options?: RunOptions): Readonly<RunPlan>;
|
|
25
|
+
declare const _default: {
|
|
26
|
+
resolveRunPlan: typeof resolveRunPlan;
|
|
27
|
+
};
|
|
28
|
+
export = _default;
|
package/lib/run-plan.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* The single canonical run-mode resolver.
|
|
3
4
|
*
|
|
@@ -7,26 +8,26 @@
|
|
|
7
8
|
* one truth. Deriving autoMerge separately (the old `Boolean(ship)` scatter) is
|
|
8
9
|
* what let `--pr` merge and let the run-mode label drift from behavior.
|
|
9
10
|
*/
|
|
10
|
-
|
|
11
11
|
function resolveIsolation(options) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
if (options.docker)
|
|
13
|
+
return 'docker';
|
|
14
|
+
if (options.worktree || options.pr || options.ship)
|
|
15
|
+
return 'worktree';
|
|
16
|
+
return 'none';
|
|
15
17
|
}
|
|
16
|
-
|
|
17
18
|
function resolveDelivery(options) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
// Explicit autoMerge (e.g. a future `--auto-merge` flag) is ship-equivalent:
|
|
20
|
+
// "merge it" implies the ship delivery. This is the ONLY place that intent is
|
|
21
|
+
// interpreted, so it can never be silently overwritten downstream.
|
|
22
|
+
if (options.ship || options.autoMerge === true)
|
|
23
|
+
return 'ship';
|
|
24
|
+
if (options.pr)
|
|
25
|
+
return 'pr';
|
|
26
|
+
return 'none';
|
|
24
27
|
}
|
|
25
|
-
|
|
26
28
|
function resolveRunPlan(options = {}) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
const isolation = resolveIsolation(options);
|
|
30
|
+
const delivery = resolveDelivery(options);
|
|
31
|
+
return Object.freeze({ isolation, delivery, autoMerge: delivery === 'ship' });
|
|
30
32
|
}
|
|
31
|
-
|
|
32
33
|
module.exports = { resolveRunPlan };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude authentication settings and helpers
|
|
3
|
+
* Extracted from settings.js for provider-specific isolation
|
|
4
|
+
*/
|
|
5
|
+
interface ClaudeProviderSettings {
|
|
6
|
+
readonly anthropicApiKey?: string;
|
|
7
|
+
readonly bedrockApiKey?: string;
|
|
8
|
+
readonly bedrockRegion?: string;
|
|
9
|
+
}
|
|
10
|
+
interface Settings {
|
|
11
|
+
readonly providerSettings?: {
|
|
12
|
+
readonly claude?: ClaudeProviderSettings;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Validate an Anthropic API key format
|
|
17
|
+
*/
|
|
18
|
+
declare function isValidAnthropicKey(key: string | null | undefined): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Check if Bedrock mode is active based on env and overrides
|
|
21
|
+
*/
|
|
22
|
+
declare function isBedrockMode(envOverrides?: NodeJS.ProcessEnv): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Resolve Claude authentication environment variables from settings.
|
|
25
|
+
* Bedrock takes priority over direct Anthropic API key and OAuth sessions.
|
|
26
|
+
*/
|
|
27
|
+
declare function resolveClaudeAuth(settings: Settings): NodeJS.ProcessEnv;
|
|
28
|
+
declare const _default: {
|
|
29
|
+
ANTHROPIC_KEY_PREFIX: string;
|
|
30
|
+
CLAUDE_AUTH_ENV_VARS: string[];
|
|
31
|
+
isValidAnthropicKey: typeof isValidAnthropicKey;
|
|
32
|
+
isBedrockMode: typeof isBedrockMode;
|
|
33
|
+
resolveClaudeAuth: typeof resolveClaudeAuth;
|
|
34
|
+
};
|
|
35
|
+
export = _default;
|
|
@@ -1,75 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* Claude authentication settings and helpers
|
|
3
4
|
* Extracted from settings.js for provider-specific isolation
|
|
4
5
|
*/
|
|
5
|
-
|
|
6
|
-
const { getProviderMetadata } = require('../provider-names');
|
|
7
|
-
|
|
6
|
+
const providerNames = require("../provider-names");
|
|
8
7
|
/**
|
|
9
8
|
* Anthropic API key prefix for validation
|
|
10
9
|
*/
|
|
11
10
|
const ANTHROPIC_KEY_PREFIX = 'sk-ant-';
|
|
12
|
-
|
|
13
11
|
/**
|
|
14
12
|
* Environment variables used for Claude authentication
|
|
15
13
|
*/
|
|
16
|
-
const CLAUDE_AUTH_ENV_VARS = [
|
|
17
|
-
|
|
14
|
+
const CLAUDE_AUTH_ENV_VARS = [
|
|
15
|
+
...providerNames.getProviderMetadata('claude').docker.envPassthrough,
|
|
16
|
+
];
|
|
18
17
|
/**
|
|
19
18
|
* Validate an Anthropic API key format
|
|
20
|
-
* @param {string|null|undefined} key - API key to validate
|
|
21
|
-
* @returns {boolean} True if key is falsy OR starts with valid prefix
|
|
22
19
|
*/
|
|
23
20
|
function isValidAnthropicKey(key) {
|
|
24
|
-
|
|
21
|
+
return !key || key.startsWith(ANTHROPIC_KEY_PREFIX);
|
|
25
22
|
}
|
|
26
|
-
|
|
27
23
|
/**
|
|
28
24
|
* Check if Bedrock mode is active based on env and overrides
|
|
29
|
-
* @param {Object} [envOverrides={}] - Environment variable overrides to check
|
|
30
|
-
* @returns {boolean} True if Bedrock mode is active
|
|
31
25
|
*/
|
|
32
26
|
function isBedrockMode(envOverrides = {}) {
|
|
33
|
-
|
|
34
|
-
envOverrides.CLAUDE_CODE_USE_BEDROCK === '1' || process.env.CLAUDE_CODE_USE_BEDROCK === '1'
|
|
35
|
-
);
|
|
27
|
+
return (envOverrides.CLAUDE_CODE_USE_BEDROCK === '1' || process.env.CLAUDE_CODE_USE_BEDROCK === '1');
|
|
36
28
|
}
|
|
37
|
-
|
|
38
29
|
/**
|
|
39
|
-
* Resolve Claude authentication environment variables from settings
|
|
40
|
-
* Bedrock takes priority over direct Anthropic API key
|
|
41
|
-
* @param {Object} settings - Settings object from loadSettings()
|
|
42
|
-
* @returns {Object} Environment variables to set for Claude auth
|
|
30
|
+
* Resolve Claude authentication environment variables from settings.
|
|
31
|
+
* Bedrock takes priority over direct Anthropic API key and OAuth sessions.
|
|
43
32
|
*/
|
|
44
33
|
function resolveClaudeAuth(settings) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
env.AWS_REGION = claudeSettings.bedrockRegion;
|
|
34
|
+
const claudeSettings = settings.providerSettings?.claude || {};
|
|
35
|
+
const env = {};
|
|
36
|
+
if (!process.env.AWS_BEARER_TOKEN_BEDROCK && claudeSettings.bedrockApiKey) {
|
|
37
|
+
env.AWS_BEARER_TOKEN_BEDROCK = claudeSettings.bedrockApiKey;
|
|
38
|
+
env.CLAUDE_CODE_USE_BEDROCK = '1';
|
|
39
|
+
if (claudeSettings.bedrockRegion && !process.env.AWS_REGION) {
|
|
40
|
+
env.AWS_REGION = claudeSettings.bedrockRegion;
|
|
41
|
+
}
|
|
54
42
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
env.ANTHROPIC_API_KEY = claudeSettings.anthropicApiKey;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
return env;
|
|
43
|
+
else if (process.env.AWS_BEARER_TOKEN_BEDROCK && !process.env.CLAUDE_CODE_USE_BEDROCK) {
|
|
44
|
+
env.CLAUDE_CODE_USE_BEDROCK = '1';
|
|
45
|
+
}
|
|
46
|
+
const hasBedrock = env.AWS_BEARER_TOKEN_BEDROCK || process.env.AWS_BEARER_TOKEN_BEDROCK;
|
|
47
|
+
if (!process.env.ANTHROPIC_API_KEY && !hasBedrock && claudeSettings.anthropicApiKey) {
|
|
48
|
+
env.ANTHROPIC_API_KEY = claudeSettings.anthropicApiKey;
|
|
49
|
+
}
|
|
50
|
+
return env;
|
|
67
51
|
}
|
|
68
|
-
|
|
69
52
|
module.exports = {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
53
|
+
ANTHROPIC_KEY_PREFIX,
|
|
54
|
+
CLAUDE_AUTH_ENV_VARS,
|
|
55
|
+
isValidAnthropicKey,
|
|
56
|
+
isBedrockMode,
|
|
57
|
+
resolveClaudeAuth,
|
|
75
58
|
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface ProviderLevelSettings extends Record<string, unknown> {
|
|
2
|
+
levelOverrides?: Record<string, unknown>;
|
|
3
|
+
}
|
|
4
|
+
type ProviderSettingsRecord = Record<string, ProviderLevelSettings>;
|
|
5
|
+
interface SettingsRecord extends Record<string, unknown> {
|
|
6
|
+
autoCheckUpdates?: unknown;
|
|
7
|
+
defaultDocker?: unknown;
|
|
8
|
+
defaultIsolation?: unknown;
|
|
9
|
+
defaultProvider?: unknown;
|
|
10
|
+
lastUpdateCheckClaim?: unknown;
|
|
11
|
+
providerSettings?: ProviderSettingsRecord;
|
|
12
|
+
}
|
|
13
|
+
declare function resolvedDefaultSettings(): SettingsRecord;
|
|
14
|
+
declare function mergeLoadedSettings(parsed: SettingsRecord): SettingsRecord;
|
|
15
|
+
declare const _default: {
|
|
16
|
+
DEFAULT_SETTINGS: SettingsRecord;
|
|
17
|
+
resolvedDefaultSettings: typeof resolvedDefaultSettings;
|
|
18
|
+
mergeLoadedSettings: typeof mergeLoadedSettings;
|
|
19
|
+
};
|
|
20
|
+
export = _default;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
3
|
+
const providerDefaults = require('./provider-defaults');
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
5
|
+
const providerNames = require('./provider-names');
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
7
|
+
const settingsModels = require('./settings-models');
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
9
|
+
const issueProviders = require('./settings-issue-providers');
|
|
10
|
+
const { getProviderDefaults } = providerDefaults;
|
|
11
|
+
const { VALID_PROVIDERS, getDefaultProviderId, normalizeProviderName, normalizeProviderSettings, } = providerNames;
|
|
12
|
+
const { applyLegacyModelBounds } = settingsModels;
|
|
13
|
+
const { getIssueProviderFns } = issueProviders;
|
|
14
|
+
const DEFAULT_SETTINGS_BASE = {
|
|
15
|
+
maxModel: 'opus',
|
|
16
|
+
minModel: null,
|
|
17
|
+
defaultProvider: getDefaultProviderId(),
|
|
18
|
+
get providerSettings() {
|
|
19
|
+
return getProviderDefaults();
|
|
20
|
+
},
|
|
21
|
+
defaultConfig: 'conductor-bootstrap',
|
|
22
|
+
defaultIsolation: 'none',
|
|
23
|
+
defaultDelivery: 'none',
|
|
24
|
+
setupVersion: null,
|
|
25
|
+
strictSchema: true,
|
|
26
|
+
logLevel: 'normal',
|
|
27
|
+
autoCheckUpdates: true,
|
|
28
|
+
lastUpdateCheckAt: null,
|
|
29
|
+
lastSeenVersion: null,
|
|
30
|
+
lastUpdateCheckClaim: null,
|
|
31
|
+
claudeCommand: 'claude',
|
|
32
|
+
dockerMounts: ['gh', 'git', 'ssh'],
|
|
33
|
+
dockerEnvPassthrough: [],
|
|
34
|
+
dockerContainerHome: '/home/node',
|
|
35
|
+
maxRetries: 3,
|
|
36
|
+
maxRestartAttempts: 3,
|
|
37
|
+
maxTotalRestarts: 10,
|
|
38
|
+
staleWarningsBeforeKill: 2,
|
|
39
|
+
backoffBaseMs: 2000,
|
|
40
|
+
backoffMaxMs: 30000,
|
|
41
|
+
jitterFactor: 0.2,
|
|
42
|
+
defaultIssueSource: 'github',
|
|
43
|
+
};
|
|
44
|
+
let defaultSettingsCache = null;
|
|
45
|
+
function getDefaultSettings() {
|
|
46
|
+
if (!defaultSettingsCache) {
|
|
47
|
+
const issueProviderSettings = getIssueProviderFns().getIssueProviderSettingsDefaults();
|
|
48
|
+
defaultSettingsCache = {
|
|
49
|
+
...DEFAULT_SETTINGS_BASE,
|
|
50
|
+
...issueProviderSettings,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return defaultSettingsCache;
|
|
54
|
+
}
|
|
55
|
+
function propertyValue(settings, property) {
|
|
56
|
+
return typeof property === 'string' ? settings[property] : undefined;
|
|
57
|
+
}
|
|
58
|
+
const DEFAULT_SETTINGS = new Proxy(DEFAULT_SETTINGS_BASE, {
|
|
59
|
+
get(target, property) {
|
|
60
|
+
if (property in target) {
|
|
61
|
+
return propertyValue(target, property);
|
|
62
|
+
}
|
|
63
|
+
return propertyValue(getDefaultSettings(), property);
|
|
64
|
+
},
|
|
65
|
+
has(target, property) {
|
|
66
|
+
if (property in target)
|
|
67
|
+
return true;
|
|
68
|
+
return property in getDefaultSettings();
|
|
69
|
+
},
|
|
70
|
+
ownKeys() {
|
|
71
|
+
return Object.keys(getDefaultSettings());
|
|
72
|
+
},
|
|
73
|
+
getOwnPropertyDescriptor(_target, property) {
|
|
74
|
+
const merged = getDefaultSettings();
|
|
75
|
+
if (property in merged) {
|
|
76
|
+
return { enumerable: true, configurable: true, value: propertyValue(merged, property) };
|
|
77
|
+
}
|
|
78
|
+
return undefined;
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
function isUnknownRecord(value) {
|
|
82
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
83
|
+
}
|
|
84
|
+
function providerOverride(value, provider) {
|
|
85
|
+
if (!isUnknownRecord(value))
|
|
86
|
+
return {};
|
|
87
|
+
const selected = value[provider];
|
|
88
|
+
return isUnknownRecord(selected) ? selected : {};
|
|
89
|
+
}
|
|
90
|
+
function mergeProviderSettings(current, overrides) {
|
|
91
|
+
const providerDefaultsValue = getProviderDefaults();
|
|
92
|
+
const merged = {};
|
|
93
|
+
for (const provider of VALID_PROVIDERS) {
|
|
94
|
+
merged[provider] = {
|
|
95
|
+
...(providerDefaultsValue[provider] || {}),
|
|
96
|
+
...(current[provider] || {}),
|
|
97
|
+
...providerOverride(overrides, provider),
|
|
98
|
+
};
|
|
99
|
+
if (!merged[provider].levelOverrides) {
|
|
100
|
+
merged[provider].levelOverrides = {};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return merged;
|
|
104
|
+
}
|
|
105
|
+
function normalizeLoadedSettings(parsed) {
|
|
106
|
+
const normalized = { ...parsed };
|
|
107
|
+
if (!Object.hasOwn(parsed, 'defaultIsolation') && typeof parsed.defaultDocker === 'boolean') {
|
|
108
|
+
normalized.defaultIsolation = parsed.defaultDocker ? 'docker' : 'none';
|
|
109
|
+
}
|
|
110
|
+
delete normalized.defaultDocker;
|
|
111
|
+
if (parsed.defaultProvider) {
|
|
112
|
+
normalized.defaultProvider = normalizeProviderName(parsed.defaultProvider);
|
|
113
|
+
}
|
|
114
|
+
if (parsed.providerSettings) {
|
|
115
|
+
const normalizedProviders = normalizeProviderSettings(parsed.providerSettings);
|
|
116
|
+
if (isProviderSettingsRecord(normalizedProviders)) {
|
|
117
|
+
normalized.providerSettings = normalizedProviders;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (normalized.autoCheckUpdates === false ||
|
|
121
|
+
typeof normalized.lastUpdateCheckClaim !== 'string' ||
|
|
122
|
+
normalized.lastUpdateCheckClaim.trim().length === 0) {
|
|
123
|
+
normalized.lastUpdateCheckClaim = null;
|
|
124
|
+
}
|
|
125
|
+
return normalized;
|
|
126
|
+
}
|
|
127
|
+
function isProviderSettingsRecord(value) {
|
|
128
|
+
return isUnknownRecord(value);
|
|
129
|
+
}
|
|
130
|
+
function resolvedDefaultSettings() {
|
|
131
|
+
return {
|
|
132
|
+
...DEFAULT_SETTINGS,
|
|
133
|
+
providerSettings: mergeProviderSettings(getProviderDefaults()),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function mergeLoadedSettings(parsed) {
|
|
137
|
+
const normalized = normalizeLoadedSettings(parsed);
|
|
138
|
+
const merged = { ...resolvedDefaultSettings(), ...normalized };
|
|
139
|
+
merged.defaultProvider =
|
|
140
|
+
normalizeProviderName(merged.defaultProvider) || DEFAULT_SETTINGS.defaultProvider;
|
|
141
|
+
merged.providerSettings = mergeProviderSettings(getProviderDefaults(), normalized.providerSettings);
|
|
142
|
+
if (merged.autoCheckUpdates === false ||
|
|
143
|
+
typeof merged.lastUpdateCheckClaim !== 'string' ||
|
|
144
|
+
merged.lastUpdateCheckClaim.trim().length === 0) {
|
|
145
|
+
merged.lastUpdateCheckClaim = null;
|
|
146
|
+
}
|
|
147
|
+
return applyLegacyModelBounds(merged);
|
|
148
|
+
}
|
|
149
|
+
module.exports = { DEFAULT_SETTINGS, resolvedDefaultSettings, mergeLoadedSettings };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface IssueProviderFacade {
|
|
2
|
+
getIssueProviderSettingsDefaults(): Record<string, unknown>;
|
|
3
|
+
listProviders(): readonly string[];
|
|
4
|
+
validateIssueProviderSetting(key: string, value: unknown): string | null | undefined;
|
|
5
|
+
}
|
|
6
|
+
declare function getIssueProviderFns(): IssueProviderFacade;
|
|
7
|
+
declare const _default: {
|
|
8
|
+
getIssueProviderFns: typeof getIssueProviderFns;
|
|
9
|
+
};
|
|
10
|
+
export = _default;
|