@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/detached-startup.js
CHANGED
|
@@ -1,351 +1,280 @@
|
|
|
1
|
-
|
|
2
|
-
const
|
|
3
|
-
const
|
|
1
|
+
"use strict";
|
|
2
|
+
const fs = require("fs");
|
|
3
|
+
const os = require("os");
|
|
4
|
+
const path = require("path");
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
4
6
|
const lockfile = require('proper-lockfile');
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
8
|
+
const runPlan = require('./run-plan');
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
10
|
+
const processLiveness = require('./process-liveness');
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
7
12
|
const IsolationManager = require('../src/isolation-manager');
|
|
8
|
-
|
|
13
|
+
const { resolveRunPlan } = runPlan;
|
|
14
|
+
const { isProcessRunning } = processLiveness;
|
|
9
15
|
const DEFAULT_WAIT_TIMEOUT_SECONDS = 180;
|
|
10
16
|
const DEFAULT_WAIT_POLL_MS = 1000;
|
|
11
17
|
const CLUSTERS_LOCK_STALE_MS = 5000;
|
|
12
18
|
const DEFAULT_OWNERSHIP_TIMEOUT_MS = 10000;
|
|
13
|
-
|
|
19
|
+
function isClusterRegistry(value) {
|
|
20
|
+
return value !== null && typeof value === 'object';
|
|
21
|
+
}
|
|
22
|
+
function hasErrorCode(error, code) {
|
|
23
|
+
return error !== null && typeof error === 'object' && 'code' in error && error.code === code;
|
|
24
|
+
}
|
|
14
25
|
function getStorageDir(storageDir) {
|
|
15
|
-
|
|
26
|
+
return storageDir || path.join(os.homedir(), '.zeroshot');
|
|
16
27
|
}
|
|
17
|
-
|
|
18
28
|
function getClustersFilePath(storageDir) {
|
|
19
|
-
|
|
29
|
+
return path.join(getStorageDir(storageDir), 'clusters.json');
|
|
20
30
|
}
|
|
21
|
-
|
|
22
31
|
function resolveWaitTimeoutMs(waitTimeoutSeconds) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
32
|
+
const parsed = Number(waitTimeoutSeconds);
|
|
33
|
+
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
34
|
+
return DEFAULT_WAIT_TIMEOUT_SECONDS * 1000;
|
|
35
|
+
}
|
|
36
|
+
return Math.floor(parsed * 1000);
|
|
28
37
|
}
|
|
29
|
-
|
|
30
38
|
// Kept as an alias: this module used to carry its own copy of this check.
|
|
31
39
|
const isProcessAlive = isProcessRunning;
|
|
32
|
-
|
|
33
40
|
function isClusterRegistered(clusterId, storageDir) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
return parsed !== null && typeof parsed === 'object' && Boolean(parsed[clusterId]);
|
|
41
|
+
const clustersFile = getClustersFilePath(storageDir);
|
|
42
|
+
if (!fs.existsSync(clustersFile)) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const raw = fs.readFileSync(clustersFile, 'utf8');
|
|
47
|
+
const parsed = JSON.parse(raw);
|
|
48
|
+
return isClusterRegistry(parsed) && Boolean(parsed[clusterId]);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
48
53
|
}
|
|
49
|
-
|
|
50
54
|
function ensureStorageDir(storageDir) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
55
|
+
const resolvedStorageDir = getStorageDir(storageDir);
|
|
56
|
+
fs.mkdirSync(resolvedStorageDir, { recursive: true });
|
|
57
|
+
return resolvedStorageDir;
|
|
54
58
|
}
|
|
55
|
-
|
|
56
59
|
function ensureClustersFile(storageDir) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
} catch (error) {
|
|
62
|
-
if (!error || error.code !== 'EEXIST') {
|
|
63
|
-
throw error;
|
|
60
|
+
const resolvedStorageDir = ensureStorageDir(storageDir);
|
|
61
|
+
const clustersFile = getClustersFilePath(resolvedStorageDir);
|
|
62
|
+
try {
|
|
63
|
+
fs.writeFileSync(clustersFile, '{}', { flag: 'wx', mode: 0o600 });
|
|
64
64
|
}
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (!hasErrorCode(error, 'EEXIST')) {
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return clustersFile;
|
|
67
71
|
}
|
|
68
|
-
|
|
69
72
|
function readClustersFile(clustersFile) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
try {
|
|
74
|
+
const parsed = JSON.parse(fs.readFileSync(clustersFile, 'utf8'));
|
|
75
|
+
return isClusterRegistry(parsed) ? parsed : {};
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return {};
|
|
79
|
+
}
|
|
75
80
|
}
|
|
76
|
-
|
|
77
81
|
async function updateClustersFile(storageDir, updater) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
82
|
+
const clustersFile = ensureClustersFile(storageDir);
|
|
83
|
+
const lockfilePath = path.join(path.dirname(clustersFile), 'clusters.json.lock');
|
|
84
|
+
let release;
|
|
85
|
+
try {
|
|
86
|
+
release = await lockfile.lock(clustersFile, {
|
|
87
|
+
lockfilePath,
|
|
88
|
+
stale: CLUSTERS_LOCK_STALE_MS,
|
|
89
|
+
retries: {
|
|
90
|
+
retries: 20,
|
|
91
|
+
minTimeout: 100,
|
|
92
|
+
maxTimeout: 250,
|
|
93
|
+
randomize: true,
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
const clusters = readClustersFile(clustersFile);
|
|
97
|
+
const updated = updater(clusters) || clusters;
|
|
98
|
+
fs.writeFileSync(clustersFile, JSON.stringify(updated, null, 2));
|
|
99
|
+
return updated;
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
if (release) {
|
|
103
|
+
await release();
|
|
104
|
+
}
|
|
101
105
|
}
|
|
102
|
-
}
|
|
103
106
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
config: null,
|
|
138
|
-
issue: null,
|
|
139
|
-
isolation: null,
|
|
140
|
-
agentStates: [],
|
|
141
|
-
failureInfo: null,
|
|
142
|
-
setupResources,
|
|
143
|
-
provisional: true,
|
|
144
|
-
};
|
|
145
|
-
return clusters;
|
|
146
|
-
});
|
|
107
|
+
async function registerDetachedSetupCluster({ clusterId, pid, storageDir, logPath, worktree, runOptions = {}, cwd, }) {
|
|
108
|
+
const plan = resolveRunPlan(runOptions);
|
|
109
|
+
const setupResources = plan.isolation === 'docker' ? IsolationManager.getDetachedSetupResources(clusterId) : null;
|
|
110
|
+
await updateClustersFile(storageDir, (clusters) => {
|
|
111
|
+
clusters[clusterId] = {
|
|
112
|
+
id: clusterId,
|
|
113
|
+
state: 'setup',
|
|
114
|
+
createdAt: Date.now(),
|
|
115
|
+
pid: typeof pid === 'number' && Number.isInteger(pid) ? pid : null,
|
|
116
|
+
setupLogPath: logPath || null,
|
|
117
|
+
setupStartedAt: Date.now(),
|
|
118
|
+
setupStage: 'starting',
|
|
119
|
+
autoPr: plan.delivery !== 'none',
|
|
120
|
+
prOptions: runOptions.prBase
|
|
121
|
+
? {
|
|
122
|
+
prBase: runOptions.prBase,
|
|
123
|
+
mergeQueue: runOptions.mergeQueue || false,
|
|
124
|
+
closeIssue: runOptions.closeIssue || null,
|
|
125
|
+
autoMerge: plan.autoMerge,
|
|
126
|
+
cwd: cwd || null,
|
|
127
|
+
}
|
|
128
|
+
: null,
|
|
129
|
+
worktree: worktree || null,
|
|
130
|
+
config: null,
|
|
131
|
+
issue: null,
|
|
132
|
+
isolation: null,
|
|
133
|
+
agentStates: [],
|
|
134
|
+
failureInfo: null,
|
|
135
|
+
setupResources,
|
|
136
|
+
provisional: true,
|
|
137
|
+
};
|
|
138
|
+
return clusters;
|
|
139
|
+
});
|
|
147
140
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
});
|
|
141
|
+
async function removeDetachedSetupCluster({ clusterId, storageDir, }) {
|
|
142
|
+
await updateClustersFile(storageDir, (clusters) => {
|
|
143
|
+
delete clusters[clusterId];
|
|
144
|
+
return clusters;
|
|
145
|
+
});
|
|
154
146
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
});
|
|
147
|
+
async function markDetachedSetupFailed({ clusterId, storageDir, error, logPath, }) {
|
|
148
|
+
await updateClustersFile(storageDir, (clusters) => {
|
|
149
|
+
const existing = clusters[clusterId] || { id: clusterId, createdAt: Date.now() };
|
|
150
|
+
clusters[clusterId] = {
|
|
151
|
+
...existing,
|
|
152
|
+
state: 'failed',
|
|
153
|
+
pid: null,
|
|
154
|
+
setupLogPath: existing.setupLogPath || logPath || null,
|
|
155
|
+
setupFinishedAt: Date.now(),
|
|
156
|
+
failureInfo: {
|
|
157
|
+
type: 'setup',
|
|
158
|
+
error: error instanceof Error ? error.message : String(error),
|
|
159
|
+
timestamp: Date.now(),
|
|
160
|
+
},
|
|
161
|
+
provisional: true,
|
|
162
|
+
};
|
|
163
|
+
return clusters;
|
|
164
|
+
});
|
|
174
165
|
}
|
|
175
|
-
|
|
176
166
|
function sleep(ms) {
|
|
177
|
-
|
|
167
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
178
168
|
}
|
|
179
|
-
|
|
180
169
|
function formatLogHint(logPath) {
|
|
181
|
-
|
|
170
|
+
return logPath ? ` Check log: ${logPath}` : '';
|
|
182
171
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
while (Date.now() < deadline) {
|
|
199
|
-
if (isClusterRegistered(clusterId, storageDir)) {
|
|
200
|
-
return { ready: true, elapsedMs: Date.now() - startedAt };
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
if (daemonPid && !isProcessAlive(daemonPid)) {
|
|
204
|
-
throw new Error(
|
|
205
|
-
`Detached daemon exited before cluster "${clusterId}" registered in storage.${logHint}`
|
|
206
|
-
);
|
|
172
|
+
async function waitForClusterRegistration({ clusterId, timeoutMs, pollMs = DEFAULT_WAIT_POLL_MS, storageDir, daemonPid, logPath, }) {
|
|
173
|
+
const effectiveTimeoutMs = typeof timeoutMs === 'number' && Number.isFinite(timeoutMs) && timeoutMs > 0
|
|
174
|
+
? timeoutMs
|
|
175
|
+
: DEFAULT_WAIT_TIMEOUT_SECONDS * 1000;
|
|
176
|
+
const startedAt = Date.now();
|
|
177
|
+
const deadline = startedAt + effectiveTimeoutMs;
|
|
178
|
+
const logHint = formatLogHint(logPath);
|
|
179
|
+
while (Date.now() < deadline) {
|
|
180
|
+
if (isClusterRegistered(clusterId, storageDir)) {
|
|
181
|
+
return { ready: true, elapsedMs: Date.now() - startedAt };
|
|
182
|
+
}
|
|
183
|
+
if (daemonPid && !isProcessAlive(daemonPid)) {
|
|
184
|
+
throw new Error(`Detached daemon exited before cluster "${clusterId}" registered in storage.${logHint}`);
|
|
185
|
+
}
|
|
186
|
+
await sleep(pollMs);
|
|
207
187
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
const timeoutSeconds = Math.ceil(effectiveTimeoutMs / 1000);
|
|
213
|
-
throw new Error(
|
|
214
|
-
`Timed out after ${timeoutSeconds}s waiting for cluster "${clusterId}" to appear in status/list.${logHint}`
|
|
215
|
-
);
|
|
188
|
+
const timeoutSeconds = Math.ceil(effectiveTimeoutMs / 1000);
|
|
189
|
+
throw new Error(`Timed out after ${timeoutSeconds}s waiting for cluster "${clusterId}" to appear in status/list.${logHint}`);
|
|
216
190
|
}
|
|
217
|
-
|
|
218
191
|
/**
|
|
219
|
-
* Atomically claim the right to resume-daemon an
|
|
220
|
-
*
|
|
221
|
-
*
|
|
222
|
-
* orchestrator.resume()'s own eligibility guard inspects to decide "is
|
|
223
|
-
* someone else already running this?". If this function stamped its PID onto
|
|
224
|
-
* `cluster.pid` up front, the daemon's own subsequent resume() call would see
|
|
225
|
-
* state:'running' with a PID that (trivially) belongs to itself and is
|
|
226
|
-
* therefore alive, and reject itself as "still running" - which is exactly
|
|
227
|
-
* what happened in early revisions of this fix. Ownership for the handoff is
|
|
228
|
-
* tracked in a separate `resumeDaemonPid` field instead; orchestrator.resume()
|
|
229
|
-
* never looks at it, and _restartClusterAgents sets the real cluster.pid once
|
|
230
|
-
* resume() actually decides to proceed.
|
|
231
|
-
*
|
|
232
|
-
* Unlike registerDetachedSetupCluster (which writes a brand-new placeholder
|
|
233
|
-
* record for a cluster ID that doesn't exist yet), this only adds
|
|
234
|
-
* resumeDaemonPid to the existing record - config/agents/worktree/isolation
|
|
235
|
-
* survive untouched, or the daemon's orchestrator.resume() would reload a
|
|
236
|
-
* blank record and reject it as an unfinished setup cluster.
|
|
237
|
-
*
|
|
238
|
-
* The liveness re-check happens inside the same updateClustersFile lock that
|
|
239
|
-
* performs the write, so two concurrent resume --detach invocations can't both
|
|
240
|
-
* observe no live claimant and both win: whichever's write lands second sees
|
|
241
|
-
* either the first daemon's (still-live) resumeDaemonPid, or - once that gets
|
|
242
|
-
* overwritten by the first daemon's own early _saveClusters() call - its real
|
|
243
|
-
* state:'running' + live pid, and aborts instead of clobbering it.
|
|
192
|
+
* Atomically claim the right to resume-daemon an existing cluster record.
|
|
193
|
+
* Ownership for the handoff is tracked separately from cluster.pid/state so
|
|
194
|
+
* orchestrator.resume() can still perform its own eligibility check.
|
|
244
195
|
*/
|
|
245
|
-
async function patchDetachedResumeCluster({ clusterId, daemonPid, storageDir }) {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
// Falling back to state+pid here closes that second window: a first
|
|
262
|
-
// daemon that has already progressed to actually running is just as much
|
|
263
|
-
// a live claimant as one still mid-handoff.
|
|
264
|
-
if (existing.state === 'running' && existing.pid && isProcessRunning(existing.pid)) {
|
|
265
|
-
throw new Error(
|
|
266
|
-
`Cluster "${clusterId}" is already running (PID ${existing.pid}); refusing to start a second resume daemon`
|
|
267
|
-
);
|
|
268
|
-
}
|
|
269
|
-
clusters[clusterId] = { ...existing, resumeDaemonPid: daemonPid };
|
|
270
|
-
return clusters;
|
|
271
|
-
});
|
|
196
|
+
async function patchDetachedResumeCluster({ clusterId, daemonPid, storageDir, }) {
|
|
197
|
+
await updateClustersFile(storageDir, (clusters) => {
|
|
198
|
+
const existing = clusters[clusterId];
|
|
199
|
+
if (!existing) {
|
|
200
|
+
throw new Error(`Cannot start resume daemon: cluster "${clusterId}" not found in registry`);
|
|
201
|
+
}
|
|
202
|
+
if (existing.resumeDaemonPid && isProcessRunning(existing.resumeDaemonPid)) {
|
|
203
|
+
const ownership = `Cluster "${clusterId}" already has a live resume daemon`;
|
|
204
|
+
throw new Error(`${ownership} (PID ${existing.resumeDaemonPid}); refusing to start a second one`);
|
|
205
|
+
}
|
|
206
|
+
if (existing.state === 'running' && existing.pid && isProcessRunning(existing.pid)) {
|
|
207
|
+
throw new Error(`Cluster "${clusterId}" is already running (PID ${existing.pid}); refusing to start a second resume daemon`);
|
|
208
|
+
}
|
|
209
|
+
clusters[clusterId] = { ...existing, resumeDaemonPid: daemonPid };
|
|
210
|
+
return clusters;
|
|
211
|
+
});
|
|
272
212
|
}
|
|
273
|
-
|
|
274
213
|
/**
|
|
275
|
-
* Undo a resume handoff that
|
|
276
|
-
*
|
|
277
|
-
* doesn't end up stuck at state:'running' with a dead PID - the exact zombie
|
|
278
|
-
* this whole mechanism exists to prevent.
|
|
214
|
+
* Undo a resume handoff that did not complete so a dead daemon cannot leave
|
|
215
|
+
* the cluster stuck in a running state.
|
|
279
216
|
*/
|
|
280
|
-
async function revertDetachedResumeCluster({ clusterId, storageDir, error }) {
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
217
|
+
async function revertDetachedResumeCluster({ clusterId, storageDir, error, }) {
|
|
218
|
+
await updateClustersFile(storageDir, (clusters) => {
|
|
219
|
+
const existing = clusters[clusterId];
|
|
220
|
+
if (!existing)
|
|
221
|
+
return clusters;
|
|
222
|
+
clusters[clusterId] = {
|
|
223
|
+
...existing,
|
|
224
|
+
state: 'failed',
|
|
225
|
+
pid: null,
|
|
226
|
+
resumeDaemonPid: null,
|
|
227
|
+
failureInfo: {
|
|
228
|
+
type: 'resume-daemon',
|
|
229
|
+
error: error instanceof Error ? error.message : String(error),
|
|
230
|
+
timestamp: Date.now(),
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
return clusters;
|
|
234
|
+
});
|
|
297
235
|
}
|
|
298
|
-
|
|
299
236
|
function getRegisteredResumeDaemonPid(clusterId, storageDir) {
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
237
|
+
const clustersFile = getClustersFilePath(storageDir);
|
|
238
|
+
if (!fs.existsSync(clustersFile)) {
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
try {
|
|
242
|
+
const parsed = JSON.parse(fs.readFileSync(clustersFile, 'utf8'));
|
|
243
|
+
if (!isClusterRegistry(parsed)) {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
return parsed[clusterId]?.resumeDaemonPid ?? null;
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
310
251
|
}
|
|
311
|
-
|
|
312
252
|
/**
|
|
313
|
-
* Daemon-side half of the resume handoff:
|
|
314
|
-
*
|
|
315
|
-
* Closes the window between spawn() returning a PID and the parent's
|
|
316
|
-
* patchDetachedResumeCluster() write landing - without it, a losing daemon
|
|
317
|
-
* from a concurrent resume --detach could start running orchestrator.resume()
|
|
318
|
-
* before its parent's CAS check ever gets a chance to reject it.
|
|
253
|
+
* Daemon-side half of the resume handoff: wait until the registry shows this
|
|
254
|
+
* process's PID as resumeDaemonPid before touching the cluster.
|
|
319
255
|
*/
|
|
320
|
-
async function waitForResumeOwnership({
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
const deadline = Date.now() + timeoutMs;
|
|
328
|
-
while (Date.now() < deadline) {
|
|
329
|
-
if (getRegisteredResumeDaemonPid(clusterId, storageDir) === daemonPid) {
|
|
330
|
-
return true;
|
|
256
|
+
async function waitForResumeOwnership({ clusterId, daemonPid, storageDir, timeoutMs = DEFAULT_OWNERSHIP_TIMEOUT_MS, pollMs = DEFAULT_WAIT_POLL_MS, }) {
|
|
257
|
+
const deadline = Date.now() + timeoutMs;
|
|
258
|
+
while (Date.now() < deadline) {
|
|
259
|
+
if (getRegisteredResumeDaemonPid(clusterId, storageDir) === daemonPid) {
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
await sleep(pollMs);
|
|
331
263
|
}
|
|
332
|
-
|
|
333
|
-
}
|
|
334
|
-
return getRegisteredResumeDaemonPid(clusterId, storageDir) === daemonPid;
|
|
264
|
+
return getRegisteredResumeDaemonPid(clusterId, storageDir) === daemonPid;
|
|
335
265
|
}
|
|
336
|
-
|
|
337
266
|
module.exports = {
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
267
|
+
DEFAULT_WAIT_TIMEOUT_SECONDS,
|
|
268
|
+
getClustersFilePath,
|
|
269
|
+
getRegisteredResumeDaemonPid,
|
|
270
|
+
isClusterRegistered,
|
|
271
|
+
isProcessAlive,
|
|
272
|
+
markDetachedSetupFailed,
|
|
273
|
+
patchDetachedResumeCluster,
|
|
274
|
+
registerDetachedSetupCluster,
|
|
275
|
+
removeDetachedSetupCluster,
|
|
276
|
+
resolveWaitTimeoutMs,
|
|
277
|
+
revertDetachedResumeCluster,
|
|
278
|
+
waitForClusterRegistration,
|
|
279
|
+
waitForResumeOwnership,
|
|
351
280
|
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
interface MountPreset {
|
|
2
|
+
host: string;
|
|
3
|
+
container: string;
|
|
4
|
+
readonly: boolean;
|
|
5
|
+
hostEnv?: string;
|
|
6
|
+
}
|
|
7
|
+
interface ProviderEnvAuthResult {
|
|
8
|
+
ok: boolean;
|
|
9
|
+
satisfiedOneOf: boolean;
|
|
10
|
+
malformed: string[];
|
|
11
|
+
message: string;
|
|
12
|
+
}
|
|
13
|
+
interface ResolvedMount {
|
|
14
|
+
host: string;
|
|
15
|
+
container: string;
|
|
16
|
+
readonly: boolean;
|
|
17
|
+
}
|
|
18
|
+
interface ResolveMountOptions {
|
|
19
|
+
containerHome?: string;
|
|
20
|
+
}
|
|
21
|
+
interface ExpandedEnv {
|
|
22
|
+
name: string;
|
|
23
|
+
value: string | null;
|
|
24
|
+
forced: boolean;
|
|
25
|
+
}
|
|
26
|
+
declare function resolveMounts(config: unknown, options?: ResolveMountOptions): ResolvedMount[];
|
|
27
|
+
declare function resolveEnvs(mountConfig: readonly unknown[], extraEnvs?: readonly string[]): string[];
|
|
28
|
+
declare function expandEnvPatterns(envVars: readonly string[], env?: Readonly<Record<string, string | undefined>>): ExpandedEnv[];
|
|
29
|
+
declare function validateMountConfig(value: unknown): string | null;
|
|
30
|
+
declare const _default: {
|
|
31
|
+
MOUNT_PRESETS: Readonly<Record<string, MountPreset>>;
|
|
32
|
+
ENV_PRESETS: Readonly<Record<string, readonly string[]>>;
|
|
33
|
+
PROVIDER_ENV_ONLY_PRESETS: ReadonlySet<string>;
|
|
34
|
+
resolveMounts: typeof resolveMounts;
|
|
35
|
+
resolveEnvs: typeof resolveEnvs;
|
|
36
|
+
expandEnvPatterns: typeof expandEnvPatterns;
|
|
37
|
+
isUsableEnvValue: (value: unknown) => value is string;
|
|
38
|
+
isUsableHttpUrl: (value: unknown) => boolean;
|
|
39
|
+
validateMountConfig: typeof validateMountConfig;
|
|
40
|
+
validateEnvPassthrough: (value: unknown) => string | null;
|
|
41
|
+
validateProviderEnvAuth: (providerId: string, forwardedEnv: Readonly<Record<string, string | undefined>> | null | undefined) => ProviderEnvAuthResult;
|
|
42
|
+
};
|
|
43
|
+
export = _default;
|