@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/completion.js
CHANGED
|
@@ -1,123 +1,113 @@
|
|
|
1
|
-
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
const os = require("os");
|
|
3
|
+
const path = require("path");
|
|
4
|
+
const omelette = require("omelette");
|
|
5
|
+
const clustersRegistry = require("./clusters-registry");
|
|
6
|
+
const { readClustersFileSync } = clustersRegistry;
|
|
6
7
|
const CLUSTER_ID_COMMANDS = new Set([
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
8
|
+
'attach',
|
|
9
|
+
'export',
|
|
10
|
+
'finish',
|
|
11
|
+
'kill',
|
|
12
|
+
'logs',
|
|
13
|
+
'resume',
|
|
14
|
+
'status',
|
|
15
|
+
'stop',
|
|
15
16
|
]);
|
|
16
|
-
|
|
17
17
|
function commandNames(command) {
|
|
18
|
-
|
|
18
|
+
return [command.name(), ...command.aliases()];
|
|
19
19
|
}
|
|
20
|
-
|
|
21
20
|
function visibleCommands(command) {
|
|
22
|
-
|
|
21
|
+
return command.createHelp().visibleCommands(command);
|
|
23
22
|
}
|
|
24
|
-
|
|
25
23
|
function visibleOptions(command) {
|
|
26
|
-
|
|
24
|
+
return command.createHelp().visibleOptions(command);
|
|
27
25
|
}
|
|
28
|
-
|
|
29
26
|
function optionNames(option) {
|
|
30
|
-
|
|
27
|
+
return [option.short, option.long].filter((name) => Boolean(name));
|
|
31
28
|
}
|
|
32
|
-
|
|
33
29
|
function findSubcommand(command, token) {
|
|
34
|
-
|
|
30
|
+
return visibleCommands(command).find((candidate) => commandNames(candidate).includes(token));
|
|
35
31
|
}
|
|
36
|
-
|
|
37
32
|
function findOption(command, token) {
|
|
38
|
-
|
|
39
|
-
|
|
33
|
+
const optionToken = token.split('=', 1)[0] ?? '';
|
|
34
|
+
return visibleOptions(command).find((option) => optionNames(option).includes(optionToken));
|
|
40
35
|
}
|
|
41
|
-
|
|
42
36
|
function parseCompletionLine(line) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
37
|
+
const trailingSpace = /\s$/.test(line);
|
|
38
|
+
const tokens = line.trim().split(/\s+/).filter(Boolean);
|
|
39
|
+
tokens.shift();
|
|
40
|
+
const current = trailingSpace ? '' : (tokens.pop() ?? '');
|
|
41
|
+
return { completed: tokens, current };
|
|
48
42
|
}
|
|
49
|
-
|
|
50
43
|
function resolveCommandContext(program, tokens) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
44
|
+
let command = program;
|
|
45
|
+
const pathParts = [];
|
|
46
|
+
let expectsOptionValue = false;
|
|
47
|
+
let sawPositional = false;
|
|
48
|
+
for (const token of tokens) {
|
|
49
|
+
if (expectsOptionValue) {
|
|
50
|
+
expectsOptionValue = false;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const option = findOption(command, token);
|
|
54
|
+
if (option) {
|
|
55
|
+
expectsOptionValue = !token.includes('=') && (option.required || option.optional);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (token.startsWith('-'))
|
|
59
|
+
continue;
|
|
60
|
+
const subcommand = sawPositional ? undefined : findSubcommand(command, token);
|
|
61
|
+
if (subcommand) {
|
|
62
|
+
command = subcommand;
|
|
63
|
+
pathParts.push(subcommand.name());
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
sawPositional = true;
|
|
60
67
|
}
|
|
61
|
-
|
|
62
|
-
const option = findOption(command, token);
|
|
63
|
-
if (option) {
|
|
64
|
-
expectsOptionValue = !token.includes('=') && (option.required || option.optional);
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
if (token.startsWith('-')) continue;
|
|
68
|
-
|
|
69
|
-
const subcommand = sawPositional ? null : findSubcommand(command, token);
|
|
70
|
-
if (subcommand) {
|
|
71
|
-
command = subcommand;
|
|
72
|
-
pathParts.push(subcommand.name());
|
|
73
|
-
continue;
|
|
74
|
-
}
|
|
75
|
-
sawPositional = true;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
return { command, commandPath: pathParts.join(' ') };
|
|
68
|
+
return { command, commandPath: pathParts.join(' ') };
|
|
79
69
|
}
|
|
80
|
-
|
|
81
70
|
function defaultListClusterIds() {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
71
|
+
const homeDir = process.env.ZEROSHOT_HOME || process.env.HOME || process.env.USERPROFILE || os.homedir();
|
|
72
|
+
const registry = readClustersFileSync(path.join(homeDir, '.zeroshot'));
|
|
73
|
+
// Preserve the legacy failure behavior if a corrupt registry is not an object.
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
75
|
+
return Object.keys(registry);
|
|
86
76
|
}
|
|
87
|
-
|
|
88
77
|
function safeDynamicIds(commandPath, listClusterIds) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
78
|
+
if (!CLUSTER_ID_COMMANDS.has(commandPath))
|
|
79
|
+
return [];
|
|
80
|
+
try {
|
|
81
|
+
const ids = listClusterIds();
|
|
82
|
+
if (!Array.isArray(ids))
|
|
83
|
+
return [];
|
|
84
|
+
const unknownIds = ids;
|
|
85
|
+
return unknownIds.filter((id) => typeof id === 'string' && id.length > 0);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
96
90
|
}
|
|
97
|
-
|
|
98
91
|
function getCompletionCandidates(program, line, deps = {}) {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
return [...new Set(candidates)].filter((candidate) => candidate.startsWith(current));
|
|
92
|
+
const { completed, current } = parseCompletionLine(line);
|
|
93
|
+
const { command, commandPath } = resolveCommandContext(program, completed);
|
|
94
|
+
const listClusterIds = deps.listClusterIds || defaultListClusterIds;
|
|
95
|
+
const candidates = [
|
|
96
|
+
...visibleCommands(command).flatMap(commandNames),
|
|
97
|
+
...visibleOptions(command).flatMap(optionNames),
|
|
98
|
+
...safeDynamicIds(commandPath, listClusterIds),
|
|
99
|
+
];
|
|
100
|
+
return [...new Set(candidates)].filter((candidate) => candidate.startsWith(current));
|
|
109
101
|
}
|
|
110
|
-
|
|
111
102
|
function setupCompletion(program, deps = {}) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
103
|
+
const complete = omelette('zeroshot');
|
|
104
|
+
complete.on('complete', (_fragment, data) => {
|
|
105
|
+
data.reply(getCompletionCandidates(program, data.line, deps));
|
|
106
|
+
});
|
|
107
|
+
complete.init();
|
|
108
|
+
return complete;
|
|
118
109
|
}
|
|
119
|
-
|
|
120
110
|
module.exports = {
|
|
121
|
-
|
|
122
|
-
|
|
111
|
+
getCompletionCandidates,
|
|
112
|
+
setupCompletion,
|
|
123
113
|
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker Compose teardown resolution for worktree cleanup.
|
|
3
|
+
*
|
|
4
|
+
* Zeroshot never runs `docker compose up` — any compose file found in a worktree
|
|
5
|
+
* belongs to the target repo, not to zeroshot. Tearing it down is only safe when
|
|
6
|
+
* the resolved Compose project name is scoped to the worktree directory itself
|
|
7
|
+
* (i.e. nothing pins it to the host's real, possibly-already-running project).
|
|
8
|
+
*/
|
|
9
|
+
interface ComposeTeardownResolution {
|
|
10
|
+
readonly args?: string[];
|
|
11
|
+
readonly composePath?: string;
|
|
12
|
+
readonly reason?: string;
|
|
13
|
+
readonly shouldTeardown: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Reproduce Docker Compose's default project-name normalization
|
|
17
|
+
* (compose-go NormalizeProjectName: lowercase -> keep [a-z0-9_-] -> trim leading '_'/'-').
|
|
18
|
+
*/
|
|
19
|
+
declare function normalizeComposeProjectName(name: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Decide whether it's safe to run `docker compose down` in a worktree, and with what args.
|
|
22
|
+
* Never includes `--volumes` — automatic cleanup must not delete named volumes.
|
|
23
|
+
* Skips teardown entirely when the Compose project name is pinned (top-level `name:`
|
|
24
|
+
* in the compose file, or `COMPOSE_PROJECT_NAME` env var), since that resolves to a
|
|
25
|
+
* shared/host project zeroshot did not create.
|
|
26
|
+
*/
|
|
27
|
+
declare function resolveWorktreeComposeTeardown(worktreePath: string): ComposeTeardownResolution;
|
|
28
|
+
declare const _default: {
|
|
29
|
+
resolveWorktreeComposeTeardown: typeof resolveWorktreeComposeTeardown;
|
|
30
|
+
normalizeComposeProjectName: typeof normalizeComposeProjectName;
|
|
31
|
+
};
|
|
32
|
+
export = _default;
|
package/lib/compose-utils.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* Docker Compose teardown resolution for worktree cleanup.
|
|
3
4
|
*
|
|
@@ -6,96 +7,80 @@
|
|
|
6
7
|
* the resolved Compose project name is scoped to the worktree directory itself
|
|
7
8
|
* (i.e. nothing pins it to the host's real, possibly-already-running project).
|
|
8
9
|
*/
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
10
|
+
const fs = require("fs");
|
|
11
|
+
const path = require("path");
|
|
12
|
+
const yaml = require("js-yaml");
|
|
13
13
|
const COMPOSE_FILENAMES = [
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
'docker-compose.yml',
|
|
15
|
+
'docker-compose.yaml',
|
|
16
|
+
'compose.yml',
|
|
17
|
+
'compose.yaml',
|
|
18
18
|
];
|
|
19
|
-
|
|
20
19
|
/**
|
|
21
20
|
* Reproduce Docker Compose's default project-name normalization
|
|
22
21
|
* (compose-go NormalizeProjectName: lowercase -> keep [a-z0-9_-] -> trim leading '_'/'-').
|
|
23
|
-
*
|
|
24
|
-
* @param {string} name
|
|
25
|
-
* @returns {string}
|
|
26
22
|
*/
|
|
27
23
|
function normalizeComposeProjectName(name) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
24
|
+
return name
|
|
25
|
+
.toLowerCase()
|
|
26
|
+
.replace(/[^a-z0-9_-]/g, '')
|
|
27
|
+
.replace(/^[-_]+/, '');
|
|
32
28
|
}
|
|
33
|
-
|
|
34
29
|
/**
|
|
35
30
|
* Decide whether it's safe to run `docker compose down` in a worktree, and with what args.
|
|
36
31
|
* Never includes `--volumes` — automatic cleanup must not delete named volumes.
|
|
37
32
|
* Skips teardown entirely when the Compose project name is pinned (top-level `name:`
|
|
38
33
|
* in the compose file, or `COMPOSE_PROJECT_NAME` env var), since that resolves to a
|
|
39
34
|
* shared/host project zeroshot did not create.
|
|
40
|
-
*
|
|
41
|
-
* @param {string} worktreePath - Path to the worktree directory
|
|
42
|
-
* @returns {{ shouldTeardown: boolean, reason?: string, composePath?: string, args?: string[] }}
|
|
43
35
|
*/
|
|
44
36
|
function resolveWorktreeComposeTeardown(worktreePath) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
37
|
+
let composePath = null;
|
|
38
|
+
for (const filename of COMPOSE_FILENAMES) {
|
|
39
|
+
const candidate = path.join(worktreePath, filename);
|
|
40
|
+
if (fs.existsSync(candidate)) {
|
|
41
|
+
composePath = candidate;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (!composePath) {
|
|
46
|
+
return { shouldTeardown: false, reason: 'no compose file' };
|
|
47
|
+
}
|
|
48
|
+
if (typeof process.env.COMPOSE_PROJECT_NAME === 'string' &&
|
|
49
|
+
process.env.COMPOSE_PROJECT_NAME.trim() !== '') {
|
|
50
|
+
return {
|
|
51
|
+
shouldTeardown: false,
|
|
52
|
+
reason: 'pinned compose project name (shared host project)',
|
|
53
|
+
composePath,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const contents = fs.readFileSync(composePath, 'utf8');
|
|
58
|
+
const parsed = yaml.load(contents);
|
|
59
|
+
if (parsed && typeof parsed === 'object' && Reflect.get(parsed, 'name')) {
|
|
60
|
+
return {
|
|
61
|
+
shouldTeardown: false,
|
|
62
|
+
reason: 'pinned compose project name (shared host project)',
|
|
63
|
+
composePath,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Fail safe: if the compose file can't be read/parsed, we cannot confirm project
|
|
69
|
+
// identity is worktree-scoped, so never tear down.
|
|
70
|
+
return { shouldTeardown: false, reason: 'compose file unreadable or unparsable', composePath };
|
|
51
71
|
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
if (!composePath) {
|
|
55
|
-
return { shouldTeardown: false, reason: 'no compose file' };
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
if (
|
|
59
|
-
typeof process.env.COMPOSE_PROJECT_NAME === 'string' &&
|
|
60
|
-
process.env.COMPOSE_PROJECT_NAME.trim() !== ''
|
|
61
|
-
) {
|
|
62
72
|
return {
|
|
63
|
-
|
|
64
|
-
reason: 'pinned compose project name (shared host project)',
|
|
65
|
-
composePath,
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
try {
|
|
70
|
-
const yaml = require('js-yaml');
|
|
71
|
-
const contents = fs.readFileSync(composePath, 'utf8');
|
|
72
|
-
const parsed = yaml.load(contents);
|
|
73
|
-
if (parsed && typeof parsed === 'object' && parsed.name) {
|
|
74
|
-
return {
|
|
75
|
-
shouldTeardown: false,
|
|
76
|
-
reason: 'pinned compose project name (shared host project)',
|
|
73
|
+
shouldTeardown: true,
|
|
77
74
|
composePath,
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
composePath,
|
|
89
|
-
args: [
|
|
90
|
-
'compose',
|
|
91
|
-
'-p',
|
|
92
|
-
normalizeComposeProjectName(path.basename(worktreePath)),
|
|
93
|
-
'down',
|
|
94
|
-
'--remove-orphans',
|
|
95
|
-
'--timeout',
|
|
96
|
-
'10',
|
|
97
|
-
],
|
|
98
|
-
};
|
|
75
|
+
args: [
|
|
76
|
+
'compose',
|
|
77
|
+
'-p',
|
|
78
|
+
normalizeComposeProjectName(path.basename(worktreePath)),
|
|
79
|
+
'down',
|
|
80
|
+
'--remove-orphans',
|
|
81
|
+
'--timeout',
|
|
82
|
+
'10',
|
|
83
|
+
],
|
|
84
|
+
};
|
|
99
85
|
}
|
|
100
|
-
|
|
101
86
|
module.exports = { resolveWorktreeComposeTeardown, normalizeComposeProjectName };
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
interface RunOptions extends Record<string, unknown> {
|
|
2
|
+
autoMerge?: unknown;
|
|
3
|
+
closeIssue?: unknown;
|
|
4
|
+
docker?: unknown;
|
|
5
|
+
mergeQueue?: unknown;
|
|
6
|
+
pr?: unknown;
|
|
7
|
+
prBase?: unknown;
|
|
8
|
+
ship?: unknown;
|
|
9
|
+
worktree?: unknown;
|
|
10
|
+
}
|
|
11
|
+
interface DetachedSetupParams {
|
|
12
|
+
clusterId: string;
|
|
13
|
+
pid?: number;
|
|
14
|
+
storageDir?: string;
|
|
15
|
+
logPath?: string | null;
|
|
16
|
+
worktree?: unknown;
|
|
17
|
+
runOptions?: RunOptions;
|
|
18
|
+
cwd?: string;
|
|
19
|
+
}
|
|
20
|
+
interface ClusterIdentityParams {
|
|
21
|
+
clusterId: string;
|
|
22
|
+
storageDir?: string;
|
|
23
|
+
}
|
|
24
|
+
interface SetupFailureParams extends ClusterIdentityParams {
|
|
25
|
+
error: unknown;
|
|
26
|
+
logPath?: string | null;
|
|
27
|
+
}
|
|
28
|
+
interface ResumePatchParams extends ClusterIdentityParams {
|
|
29
|
+
daemonPid: number;
|
|
30
|
+
}
|
|
31
|
+
interface RegistrationWaitParams extends ClusterIdentityParams {
|
|
32
|
+
timeoutMs?: number;
|
|
33
|
+
pollMs?: number;
|
|
34
|
+
daemonPid?: number;
|
|
35
|
+
logPath?: string | null;
|
|
36
|
+
}
|
|
37
|
+
interface OwnershipWaitParams extends ResumePatchParams {
|
|
38
|
+
timeoutMs?: number;
|
|
39
|
+
pollMs?: number;
|
|
40
|
+
}
|
|
41
|
+
declare function getClustersFilePath(storageDir?: string | null): string;
|
|
42
|
+
declare function resolveWaitTimeoutMs(waitTimeoutSeconds: unknown): number;
|
|
43
|
+
declare function isClusterRegistered(clusterId: string, storageDir?: string): boolean;
|
|
44
|
+
declare function registerDetachedSetupCluster({ clusterId, pid, storageDir, logPath, worktree, runOptions, cwd, }: DetachedSetupParams): Promise<void>;
|
|
45
|
+
declare function removeDetachedSetupCluster({ clusterId, storageDir, }: ClusterIdentityParams): Promise<void>;
|
|
46
|
+
declare function markDetachedSetupFailed({ clusterId, storageDir, error, logPath, }: SetupFailureParams): Promise<void>;
|
|
47
|
+
declare function waitForClusterRegistration({ clusterId, timeoutMs, pollMs, storageDir, daemonPid, logPath, }: RegistrationWaitParams): Promise<{
|
|
48
|
+
ready: true;
|
|
49
|
+
elapsedMs: number;
|
|
50
|
+
}>;
|
|
51
|
+
/**
|
|
52
|
+
* Atomically claim the right to resume-daemon an existing cluster record.
|
|
53
|
+
* Ownership for the handoff is tracked separately from cluster.pid/state so
|
|
54
|
+
* orchestrator.resume() can still perform its own eligibility check.
|
|
55
|
+
*/
|
|
56
|
+
declare function patchDetachedResumeCluster({ clusterId, daemonPid, storageDir, }: ResumePatchParams): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Undo a resume handoff that did not complete so a dead daemon cannot leave
|
|
59
|
+
* the cluster stuck in a running state.
|
|
60
|
+
*/
|
|
61
|
+
declare function revertDetachedResumeCluster({ clusterId, storageDir, error, }: SetupFailureParams): Promise<void>;
|
|
62
|
+
declare function getRegisteredResumeDaemonPid(clusterId: string, storageDir?: string): number | null;
|
|
63
|
+
/**
|
|
64
|
+
* Daemon-side half of the resume handoff: wait until the registry shows this
|
|
65
|
+
* process's PID as resumeDaemonPid before touching the cluster.
|
|
66
|
+
*/
|
|
67
|
+
declare function waitForResumeOwnership({ clusterId, daemonPid, storageDir, timeoutMs, pollMs, }: OwnershipWaitParams): Promise<boolean>;
|
|
68
|
+
declare const _default: {
|
|
69
|
+
DEFAULT_WAIT_TIMEOUT_SECONDS: number;
|
|
70
|
+
getClustersFilePath: typeof getClustersFilePath;
|
|
71
|
+
getRegisteredResumeDaemonPid: typeof getRegisteredResumeDaemonPid;
|
|
72
|
+
isClusterRegistered: typeof isClusterRegistered;
|
|
73
|
+
isProcessAlive: (pid: unknown) => boolean;
|
|
74
|
+
markDetachedSetupFailed: typeof markDetachedSetupFailed;
|
|
75
|
+
patchDetachedResumeCluster: typeof patchDetachedResumeCluster;
|
|
76
|
+
registerDetachedSetupCluster: typeof registerDetachedSetupCluster;
|
|
77
|
+
removeDetachedSetupCluster: typeof removeDetachedSetupCluster;
|
|
78
|
+
resolveWaitTimeoutMs: typeof resolveWaitTimeoutMs;
|
|
79
|
+
revertDetachedResumeCluster: typeof revertDetachedResumeCluster;
|
|
80
|
+
waitForClusterRegistration: typeof waitForClusterRegistration;
|
|
81
|
+
waitForResumeOwnership: typeof waitForResumeOwnership;
|
|
82
|
+
};
|
|
83
|
+
export = _default;
|