@the-open-engine/zeroshot 6.38.0 → 6.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/event-copy.js +8 -7
- package/cli/event-copy.ts +12 -0
- package/cli/index.js +7 -31
- package/cli/json-export.js +61 -64
- package/cli/json-export.ts +112 -0
- package/cli/message-formatter-utils.js +68 -56
- package/cli/message-formatter-utils.ts +121 -0
- package/cli/message-formatters-normal.js +124 -259
- package/cli/message-formatters-normal.ts +250 -0
- package/cli/message-formatters-watch.js +81 -84
- package/cli/message-formatters-watch.ts +189 -0
- package/lib/agent-cli-provider/adapters/codex.d.ts.map +1 -1
- package/lib/agent-cli-provider/adapters/codex.js +3 -1
- package/lib/agent-cli-provider/adapters/codex.js.map +1 -1
- package/lib/cluster/generated/protocol-schema.cjs +1 -1
- package/lib/cluster/generated/protocol-schema.mjs +1 -1
- package/lib/cluster/generated/protocol.d.cts +8 -0
- package/lib/cluster/generated/protocol.d.mts +8 -0
- package/lib/cluster/generated/protocol.d.ts +8 -0
- package/lib/clusters-registry.d.ts +23 -0
- package/lib/clusters-registry.js +17 -29
- package/lib/completion.d.ts +12 -0
- package/lib/completion.js +84 -94
- package/lib/compose-utils.d.ts +32 -0
- package/lib/compose-utils.js +57 -72
- package/lib/detached-startup.d.ts +83 -0
- package/lib/detached-startup.js +231 -302
- package/lib/docker-config.d.ts +43 -0
- package/lib/docker-config.js +150 -325
- package/lib/docker-env-auth.d.ts +17 -0
- package/lib/docker-env-auth.js +75 -0
- package/lib/git-remote-utils.d.ts +48 -0
- package/lib/git-remote-utils.js +147 -213
- package/lib/id-detector.d.ts +15 -0
- package/lib/id-detector.js +37 -41
- package/lib/path-check.d.ts +30 -0
- package/lib/path-check.js +42 -45
- package/lib/process-liveness.d.ts +16 -0
- package/lib/process-liveness.js +19 -12
- package/lib/provider-credential-path.d.ts +16 -0
- package/lib/provider-credential-path.js +31 -29
- package/lib/provider-defaults.d.ts +30 -0
- package/lib/provider-defaults.js +47 -42
- package/lib/provider-detection.d.ts +11 -0
- package/lib/provider-detection.js +91 -54
- package/lib/provider-names.d.ts +38 -0
- package/lib/provider-names.js +56 -64
- package/lib/repo-settings.d.ts +28 -0
- package/lib/repo-settings.js +83 -59
- package/lib/run-mode.d.ts +21 -0
- package/lib/run-mode.js +21 -20
- package/lib/run-plan.d.ts +28 -0
- package/lib/run-plan.js +17 -16
- package/lib/settings/claude-auth.d.ts +35 -0
- package/lib/settings/claude-auth.js +30 -47
- package/lib/settings-defaults.d.ts +20 -0
- package/lib/settings-defaults.js +149 -0
- package/lib/settings-error.d.ts +7 -0
- package/lib/settings-error.js +8 -0
- package/lib/settings-issue-providers.d.ts +10 -0
- package/lib/settings-issue-providers.js +12 -0
- package/lib/settings-models.d.ts +22 -0
- package/lib/settings-models.js +93 -0
- package/lib/settings-storage.d.ts +23 -0
- package/lib/settings-storage.js +205 -0
- package/lib/settings-validation.d.ts +7 -0
- package/lib/settings-validation.js +182 -0
- package/lib/settings.d.ts +29 -0
- package/lib/settings.js +41 -736
- package/lib/setup-apply-types.d.ts +66 -0
- package/lib/setup-apply-types.js +2 -0
- package/lib/setup-apply.d.ts +39 -0
- package/lib/setup-apply.js +267 -264
- package/lib/setup-journal.d.ts +41 -0
- package/lib/setup-journal.js +119 -76
- package/lib/setup-plan-types.d.ts +102 -0
- package/lib/setup-plan-types.js +2 -0
- package/lib/setup-plan.d.ts +30 -0
- package/lib/setup-plan.js +300 -324
- package/lib/setup-undo.d.ts +44 -0
- package/lib/setup-undo.js +61 -74
- package/lib/start-cluster-config.d.ts +26 -0
- package/lib/start-cluster-config.js +56 -0
- package/lib/start-cluster-environment.d.ts +40 -0
- package/lib/start-cluster-environment.js +134 -0
- package/lib/start-cluster-run-options.d.ts +53 -0
- package/lib/start-cluster-run-options.js +147 -0
- package/lib/start-cluster.d.ts +64 -0
- package/lib/start-cluster.js +98 -454
- package/lib/stream-json-parser.d.ts +17 -0
- package/lib/stream-json-parser.js +51 -52
- package/npm-shrinkwrap.json +2 -2
- package/package.json +12 -6
- package/scripts/postinstall.js +27 -0
- package/scripts/rust-distribution.js +23 -14
- package/src/agent/agent-command-proofs-context.js +35 -45
- package/src/agent/agent-command-proofs-context.ts +87 -0
- package/src/agent/agent-config-settings.js +19 -0
- package/src/agent/agent-config-settings.ts +41 -0
- package/src/agent/agent-config.js +122 -231
- package/src/agent/agent-config.ts +285 -0
- package/src/agent/agent-context-builder.js +38 -273
- package/src/agent/agent-context-builder.ts +51 -0
- package/src/agent/agent-context-environment-sections.js +105 -0
- package/src/agent/agent-context-environment-sections.ts +134 -0
- package/src/agent/agent-context-packs.js +165 -0
- package/src/agent/agent-context-packs.ts +296 -0
- package/src/agent/agent-context-prompt-sections.js +100 -0
- package/src/agent/agent-context-prompt-sections.ts +148 -0
- package/src/agent/agent-context-sections.js +25 -334
- package/src/agent/agent-context-sections.ts +36 -0
- package/src/agent/agent-context-sources.js +96 -149
- package/src/agent/agent-context-sources.ts +253 -0
- package/src/agent/agent-context-types.js +2 -0
- package/src/agent/agent-context-types.ts +132 -0
- package/src/agent/agent-context-validation-sections.js +73 -0
- package/src/agent/agent-context-validation-sections.ts +129 -0
- package/src/agent/agent-input-injector.js +99 -118
- package/src/agent/agent-input-injector.ts +195 -0
- package/src/agent/agent-liveness-poll.js +74 -78
- package/src/agent/agent-liveness-poll.ts +163 -0
- package/src/agent/agent-quality-gate-schema.js +77 -86
- package/src/agent/agent-quality-gate-schema.ts +135 -0
- package/src/agent/agent-quality-gates-context.js +44 -50
- package/src/agent/agent-quality-gates-context.ts +91 -0
- package/src/agent/agent-stuck-detector.js +171 -239
- package/src/agent/agent-stuck-detector.ts +288 -0
- package/src/agent/agent-trigger-evaluator.js +29 -46
- package/src/agent/agent-trigger-evaluator.ts +98 -0
- package/src/agent/context-metrics.js +110 -141
- package/src/agent/context-metrics.ts +261 -0
- package/src/agent/context-pack-builder.js +72 -358
- package/src/agent/context-pack-builder.ts +105 -0
- package/src/agent/context-pack-core.js +70 -0
- package/src/agent/context-pack-core.ts +96 -0
- package/src/agent/context-pack-selection.js +119 -0
- package/src/agent/context-pack-selection.ts +187 -0
- package/src/agent/context-pack-truncation.js +139 -0
- package/src/agent/context-pack-truncation.ts +208 -0
- package/src/agent/context-pack-types.js +2 -0
- package/src/agent/context-pack-types.ts +98 -0
- package/src/agent/context-replay-policy.js +30 -39
- package/src/agent/context-replay-policy.ts +71 -0
- package/src/agent/critical-agent-policy.js +6 -10
- package/src/agent/critical-agent-policy.ts +20 -0
- package/src/agent/guidance-queue.js +74 -87
- package/src/agent/guidance-queue.ts +166 -0
- package/src/agent/output-extraction-error-detail.js +45 -0
- package/src/agent/output-extraction-error-detail.ts +49 -0
- package/src/agent/output-extraction-failures.js +125 -0
- package/src/agent/output-extraction-failures.ts +149 -0
- package/src/agent/output-extraction-json.js +234 -0
- package/src/agent/output-extraction-json.ts +235 -0
- package/src/agent/output-extraction-pi.js +124 -0
- package/src/agent/output-extraction-pi.ts +137 -0
- package/src/agent/output-extraction-types.js +2 -0
- package/src/agent/output-extraction-types.ts +49 -0
- package/src/agent/output-extraction.js +17 -617
- package/src/agent/output-extraction.ts +30 -0
- package/src/agent/output-reformatter-errors.js +83 -0
- package/src/agent/output-reformatter-errors.ts +106 -0
- package/src/agent/output-reformatter-types.js +2 -0
- package/src/agent/output-reformatter-types.ts +86 -0
- package/src/agent/output-reformatter.js +140 -185
- package/src/agent/output-reformatter.ts +238 -0
- package/src/agent/pi-terminal-lifecycle-types.js +2 -0
- package/src/agent/pi-terminal-lifecycle-types.ts +41 -0
- package/src/agent/pi-terminal-lifecycle.js +186 -206
- package/src/agent/pi-terminal-lifecycle.ts +297 -0
- package/src/agent/provider-control-plane.js +22 -21
- package/src/agent/provider-control-plane.ts +52 -0
- package/src/agent/provider-terminal-failure-types.js +2 -0
- package/src/agent/provider-terminal-failure-types.ts +60 -0
- package/src/agent/provider-terminal-failure.js +194 -191
- package/src/agent/provider-terminal-failure.ts +262 -0
- package/src/agent/rate-limit-backoff.js +31 -74
- package/src/agent/rate-limit-backoff.ts +71 -0
- package/src/agent/schema-utils.js +85 -125
- package/src/agent/schema-utils.ts +148 -0
- package/src/agent/structured-output-error.js +34 -33
- package/src/agent/structured-output-error.ts +105 -0
- package/src/agent/validation-platform.js +27 -27
- package/src/agent/validation-platform.ts +49 -0
- package/src/agent-cli-provider/adapters/codex.ts +3 -1
- package/src/attach/attach-client.js +232 -405
- package/src/attach/attach-client.ts +300 -0
- package/src/attach/attach-server-cleanup.js +43 -0
- package/src/attach/attach-server-cleanup.ts +39 -0
- package/src/attach/attach-server-clients.js +117 -0
- package/src/attach/attach-server-clients.ts +122 -0
- package/src/attach/attach-server-events.js +38 -0
- package/src/attach/attach-server-events.ts +36 -0
- package/src/attach/attach-server-pty.js +45 -0
- package/src/attach/attach-server-pty.ts +64 -0
- package/src/attach/attach-server-runtime.js +73 -0
- package/src/attach/attach-server-runtime.ts +62 -0
- package/src/attach/attach-server-socket.js +28 -0
- package/src/attach/attach-server-socket.ts +23 -0
- package/src/attach/attach-server-types.js +2 -0
- package/src/attach/attach-server-types.ts +82 -0
- package/src/attach/attach-server.js +106 -523
- package/src/attach/attach-server.ts +158 -0
- package/src/attach/index.js +18 -35
- package/src/attach/index.ts +18 -0
- package/src/attach/protocol.js +95 -184
- package/src/attach/protocol.ts +181 -0
- package/src/attach/ring-buffer.js +76 -102
- package/src/attach/ring-buffer.ts +109 -0
- package/src/attach/send-input.js +64 -75
- package/src/attach/send-input.ts +94 -0
- package/src/attach/socket-discovery.js +164 -218
- package/src/attach/socket-discovery.ts +230 -0
- package/src/attach/socket-paths.js +42 -61
- package/src/attach/socket-paths.ts +81 -0
- package/src/claude-credentials.js +51 -54
- package/src/claude-credentials.ts +89 -0
- package/src/cluster/generated/protocol-schema.ts +1 -1
- package/src/cluster/generated/protocol.ts +2 -1
- package/src/command-proofs.js +110 -141
- package/src/command-proofs.ts +216 -0
- package/src/config-router.js +81 -73
- package/src/config-router.ts +131 -0
- package/src/copy-worker.js +53 -29
- package/src/copy-worker.ts +75 -0
- package/src/darwin-keychain-boundary.js +80 -111
- package/src/darwin-keychain-boundary.ts +148 -0
- package/src/guidance-topics.js +4 -5
- package/src/guidance-topics.ts +10 -0
- package/src/input-helpers.js +33 -54
- package/src/input-helpers.ts +58 -0
- package/src/ledger-sequence.js +45 -48
- package/src/ledger-sequence.ts +63 -0
- package/src/legacy-lib/clusters-registry.ts +40 -0
- package/src/legacy-lib/completion.ts +148 -0
- package/src/legacy-lib/compose-utils.ts +102 -0
- package/src/legacy-lib/detached-startup.ts +449 -0
- package/src/legacy-lib/docker-config.ts +282 -0
- package/src/legacy-lib/docker-env-auth.ts +116 -0
- package/src/legacy-lib/git-remote-utils.ts +244 -0
- package/src/legacy-lib/id-detector.ts +57 -0
- package/src/legacy-lib/js-yaml.d.ts +3 -0
- package/src/legacy-lib/omelette.d.ts +15 -0
- package/src/legacy-lib/path-check.ts +89 -0
- package/src/legacy-lib/process-liveness.ts +36 -0
- package/src/legacy-lib/provider-credential-path.ts +57 -0
- package/src/legacy-lib/provider-defaults.ts +114 -0
- package/src/legacy-lib/provider-detection.ts +67 -0
- package/src/legacy-lib/provider-names.ts +126 -0
- package/src/legacy-lib/repo-settings.ts +88 -0
- package/src/legacy-lib/run-mode.ts +58 -0
- package/src/legacy-lib/run-plan.ts +49 -0
- package/src/legacy-lib/settings/claude-auth.ts +80 -0
- package/src/legacy-lib/settings-defaults.ts +212 -0
- package/src/legacy-lib/settings-error.ts +8 -0
- package/src/legacy-lib/settings-issue-providers.ts +18 -0
- package/src/legacy-lib/settings-models.ts +124 -0
- package/src/legacy-lib/settings-storage.ts +277 -0
- package/src/legacy-lib/settings-validation.ts +220 -0
- package/src/legacy-lib/settings.ts +87 -0
- package/src/legacy-lib/setup-apply-types.ts +70 -0
- package/src/legacy-lib/setup-apply.ts +456 -0
- package/src/legacy-lib/setup-journal.ts +185 -0
- package/src/legacy-lib/setup-plan-types.ts +96 -0
- package/src/legacy-lib/setup-plan.ts +500 -0
- package/src/legacy-lib/setup-undo.ts +142 -0
- package/src/legacy-lib/start-cluster-config.ts +124 -0
- package/src/legacy-lib/start-cluster-environment.ts +165 -0
- package/src/legacy-lib/start-cluster-run-options.ts +279 -0
- package/src/legacy-lib/start-cluster.ts +237 -0
- package/src/legacy-lib/stream-json-parser.ts +88 -0
- package/src/message-buffer.js +55 -71
- package/src/message-buffer.ts +107 -0
- package/src/message-bus-bridge.js +92 -133
- package/src/message-bus-bridge.ts +149 -0
- package/src/name-generator-shared.js +220 -0
- package/src/name-generator-shared.ts +231 -0
- package/src/name-generator.js +8 -217
- package/src/name-generator.ts +27 -0
- package/src/omp-blob-root.js +83 -64
- package/src/omp-blob-root.ts +116 -0
- package/src/omp-config-overlay.js +65 -38
- package/src/omp-config-overlay.ts +110 -0
- package/src/omp-execution-fingerprint.js +38 -43
- package/src/omp-execution-fingerprint.ts +92 -0
- package/src/omp-session-limits.js +10 -15
- package/src/omp-session-limits.ts +53 -0
- package/src/omp-session-partition.js +2 -2
- package/src/omp-session-verifier.js +1 -1
- package/src/orchestrator.js +19 -4
- package/src/providers/anthropic/index.js +3 -1
- package/src/providers/anthropic/index.ts +13 -0
- package/src/providers/capabilities.js +19 -27
- package/src/providers/capabilities.ts +44 -0
- package/src/providers/google/index.js +3 -1
- package/src/providers/google/index.ts +13 -0
- package/src/providers/openai/index.js +3 -1
- package/src/providers/openai/index.ts +13 -0
- package/src/providers/opencode/index.js +3 -1
- package/src/providers/opencode/index.ts +13 -0
- package/src/quality-gates.js +67 -127
- package/src/quality-gates.ts +149 -0
- package/src/repo-settings-access.js +40 -0
- package/src/repo-settings-access.ts +64 -0
- package/src/schemas/sub-cluster.js +127 -183
- package/src/schemas/sub-cluster.ts +238 -0
- package/src/state-snapshot-normalization.js +224 -0
- package/src/state-snapshot-normalization.ts +222 -0
- package/src/state-snapshot.js +192 -359
- package/src/state-snapshot.ts +291 -0
- package/src/state-snapshotter.js +118 -130
- package/src/state-snapshotter.ts +167 -0
- package/src/sub-cluster-wrapper.js +4 -13
- package/src/task-run-model-args.js +87 -124
- package/src/task-run-model-args.ts +204 -0
- package/src/task-runner.js +5 -25
- package/src/task-runner.ts +28 -0
- package/src/task-startup-error.js +73 -58
- package/src/task-startup-error.ts +126 -0
- package/src/template-validation/consensus-gate-contracts.js +2 -0
- package/src/template-validation/consensus-gate-contracts.ts +70 -0
- package/src/template-validation/consensus-gate-scenarios.js +76 -0
- package/src/template-validation/consensus-gate-scenarios.ts +130 -0
- package/src/template-validation/consensus-gate-stage.js +34 -0
- package/src/template-validation/consensus-gate-stage.ts +56 -0
- package/src/template-validation/random-topology-contracts.js +2 -0
- package/src/template-validation/random-topology-contracts.ts +54 -0
- package/src/template-validation/random-topology-dispatch.js +25 -0
- package/src/template-validation/random-topology-dispatch.ts +33 -0
- package/src/template-validation/random-topology-message-loop.js +53 -0
- package/src/template-validation/random-topology-message-loop.ts +73 -0
- package/src/template-validation/random-topology-operations.js +79 -0
- package/src/template-validation/random-topology-operations.ts +101 -0
- package/src/template-validation/random-topology-runtime.js +25 -0
- package/src/template-validation/random-topology-runtime.ts +43 -0
- package/src/template-validation/random-topology-scenario.js +52 -0
- package/src/template-validation/random-topology-scenario.ts +57 -0
- package/src/template-validation/random-topology-schema.js +159 -0
- package/src/template-validation/random-topology-schema.ts +190 -0
- package/src/template-validation/random-topology-state.js +28 -0
- package/src/template-validation/random-topology-state.ts +30 -0
- package/src/template-validation/random-topology-trigger-evaluation.js +45 -0
- package/src/template-validation/random-topology-trigger-evaluation.ts +65 -0
- package/src/template-validation/random-topology-trigger.js +75 -0
- package/src/template-validation/random-topology-trigger.ts +88 -0
- package/src/template-validation/report-formatter.js +40 -46
- package/src/template-validation/report-formatter.ts +101 -0
- package/src/template-validation/simulate-consensus-gates.js +111 -302
- package/src/template-validation/simulate-consensus-gates.ts +196 -0
- package/src/template-validation/simulate-random-topology.js +26 -519
- package/src/template-validation/simulate-random-topology.ts +57 -0
- package/src/template-validation/simulate-two-stage-validation.js +41 -265
- package/src/template-validation/simulate-two-stage-validation.ts +55 -0
- package/src/template-validation/simulation-agent-runtime.js +25 -0
- package/src/template-validation/simulation-agent-runtime.ts +40 -0
- package/src/template-validation/simulation-agent.js +29 -0
- package/src/template-validation/simulation-agent.ts +73 -0
- package/src/template-validation/simulation-runtime.js +34 -0
- package/src/template-validation/simulation-runtime.ts +72 -0
- package/src/template-validation/two-stage-contracts.js +2 -0
- package/src/template-validation/two-stage-contracts.ts +41 -0
- package/src/template-validation/two-stage-inputs.js +21 -0
- package/src/template-validation/two-stage-inputs.ts +29 -0
- package/src/template-validation/two-stage-results.js +30 -0
- package/src/template-validation/two-stage-results.ts +40 -0
- package/src/template-validation/two-stage-scenario.js +86 -0
- package/src/template-validation/two-stage-scenario.ts +120 -0
- package/src/worktree-claude-config.js +182 -220
- package/src/worktree-claude-config.ts +272 -0
- package/src/worktree-tooling-env.js +103 -125
- package/src/worktree-tooling-env.ts +142 -0
- package/task-lib/completion.js +2 -3
- package/task-lib/completion.ts +9 -0
- package/task-lib/config.js +1 -4
- package/task-lib/config.ts +11 -0
- package/task-lib/name-generator.js +4 -226
- package/task-lib/name-generator.ts +11 -0
- package/task-lib/omp-session-cleanup.js +1 -1
- package/task-lib/omp-storage-root.js +8 -12
- package/task-lib/omp-storage-root.ts +62 -0
- package/task-lib/process-termination.js +143 -166
- package/task-lib/process-termination.ts +268 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sendInput - write stdin data to a live attach socket
|
|
3
|
+
*
|
|
4
|
+
* Uses the attach protocol's STDIN message to forward input to the PTY.
|
|
5
|
+
* Returns { ok, error } instead of throwing on transport failures.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import fs from 'node:fs';
|
|
9
|
+
import net from 'node:net';
|
|
10
|
+
|
|
11
|
+
import protocol from './protocol';
|
|
12
|
+
|
|
13
|
+
const DEFAULT_TIMEOUT_MS = 1500;
|
|
14
|
+
|
|
15
|
+
interface SendInputOptions {
|
|
16
|
+
socketPath?: string;
|
|
17
|
+
data?: Buffer | string | null;
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface SendInputResult {
|
|
22
|
+
ok: boolean;
|
|
23
|
+
error: string | null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Send input to an attach socket via STDIN message. */
|
|
27
|
+
function sendInput(options: SendInputOptions = {}): Promise<SendInputResult> | SendInputResult {
|
|
28
|
+
const { socketPath, data, timeoutMs = DEFAULT_TIMEOUT_MS } = options;
|
|
29
|
+
|
|
30
|
+
if (!socketPath) {
|
|
31
|
+
throw new Error('sendInput: socketPath is required');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (data === undefined || data === null) {
|
|
35
|
+
throw new Error('sendInput: data is required');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
39
|
+
throw new Error(`sendInput: timeoutMs must be positive (got ${timeoutMs})`);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (!fs.existsSync(socketPath)) {
|
|
43
|
+
return { ok: false, error: `Socket not found: ${socketPath}` };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return new Promise((resolve) => {
|
|
47
|
+
let settled = false;
|
|
48
|
+
let timeout: NodeJS.Timeout | undefined;
|
|
49
|
+
const socket = net.createConnection(socketPath);
|
|
50
|
+
|
|
51
|
+
const finish = (result: SendInputResult): void => {
|
|
52
|
+
if (settled) return;
|
|
53
|
+
settled = true;
|
|
54
|
+
if (timeout) {
|
|
55
|
+
clearTimeout(timeout);
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
socket.end();
|
|
59
|
+
socket.destroy();
|
|
60
|
+
} catch (cleanupError: unknown) {
|
|
61
|
+
console.warn('[sendInput] socket cleanup failed:', cleanupError);
|
|
62
|
+
}
|
|
63
|
+
resolve(result);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
timeout = setTimeout(() => {
|
|
67
|
+
finish({ ok: false, error: 'Timeout waiting for socket connection' });
|
|
68
|
+
}, timeoutMs);
|
|
69
|
+
|
|
70
|
+
socket.on('connect', () => {
|
|
71
|
+
try {
|
|
72
|
+
const encoded = protocol.encode(protocol.createStdinMessage(data));
|
|
73
|
+
socket.write(encoded, (error?: Error | null) => {
|
|
74
|
+
if (error) {
|
|
75
|
+
finish({ ok: false, error: error.message });
|
|
76
|
+
} else {
|
|
77
|
+
finish({ ok: true, error: null });
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
} catch (error: unknown) {
|
|
81
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
82
|
+
finish({ ok: false, error: reason });
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
socket.on('error', (error: Error) => {
|
|
87
|
+
finish({ ok: false, error: error.message });
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export = {
|
|
93
|
+
sendInput,
|
|
94
|
+
};
|
|
@@ -1,256 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* Socket Discovery - Utilities for socket path management
|
|
3
4
|
*
|
|
4
5
|
* Socket locations are allocated by socket-paths.js under a short, per-user
|
|
5
6
|
* runtime directory so long HOME paths cannot exceed Unix socket limits.
|
|
6
7
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
12
|
+
const node_net_1 = __importDefault(require("node:net"));
|
|
13
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
14
|
+
const socket_paths_1 = __importDefault(require("./socket-paths"));
|
|
15
|
+
function isClustersRegistryModule(value) {
|
|
16
|
+
return (typeof value === 'object' &&
|
|
17
|
+
value !== null &&
|
|
18
|
+
'readClustersFileSync' in value &&
|
|
19
|
+
typeof value.readClustersFileSync === 'function');
|
|
20
|
+
}
|
|
21
|
+
const clustersRegistryModule = require('../../lib/clusters-registry');
|
|
22
|
+
if (!isClustersRegistryModule(clustersRegistryModule)) {
|
|
23
|
+
throw new TypeError('clusters registry must export readClustersFileSync');
|
|
24
|
+
}
|
|
25
|
+
const { readClustersFileSync } = clustersRegistryModule;
|
|
26
|
+
const ZEROSHOT_DIR = node_path_1.default.join(socket_paths_1.default.resolveHomeDir(), '.zeroshot');
|
|
27
|
+
const SOCKET_DIR = socket_paths_1.default.getSocketDir();
|
|
28
|
+
/** Check if an ID is a known cluster by looking up clusters.json. */
|
|
23
29
|
function isKnownCluster(id) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
+
try {
|
|
31
|
+
const clusters = readClustersFileSync(ZEROSHOT_DIR);
|
|
32
|
+
return typeof clusters === 'object' && clusters !== null && id in clusters;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
30
37
|
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Ensure socket directory exists
|
|
34
|
-
*/
|
|
38
|
+
/** Ensure socket directory exists. */
|
|
35
39
|
function ensureSocketDir() {
|
|
36
|
-
|
|
40
|
+
socket_paths_1.default.ensureSocketDir();
|
|
37
41
|
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Get socket path for a task
|
|
41
|
-
* @param {string} taskId - Task ID (e.g., 'task-swift-falcon')
|
|
42
|
-
* @returns {string} - Socket path
|
|
43
|
-
*/
|
|
42
|
+
/** Get socket path for a task. */
|
|
44
43
|
function getTaskSocketPath(taskId) {
|
|
45
|
-
|
|
44
|
+
return socket_paths_1.default.getTaskSocketPath(taskId);
|
|
46
45
|
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Get socket path for a cluster agent
|
|
50
|
-
* @param {string} clusterId - Cluster ID (e.g., 'cluster-bold-eagle')
|
|
51
|
-
* @param {string} agentId - Agent ID (e.g., 'worker')
|
|
52
|
-
* @returns {string} - Socket path
|
|
53
|
-
*/
|
|
46
|
+
/** Get socket path for a cluster agent. */
|
|
54
47
|
function getAgentSocketPath(clusterId, agentId) {
|
|
55
|
-
|
|
48
|
+
return socket_paths_1.default.getAgentSocketPath(clusterId, agentId);
|
|
56
49
|
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Get socket path for any ID (auto-detects task vs cluster)
|
|
60
|
-
* @param {string} id - Task or cluster ID
|
|
61
|
-
* @param {string} [agentId] - Optional agent ID for clusters
|
|
62
|
-
* @returns {string} - Socket path
|
|
63
|
-
*/
|
|
50
|
+
/** Get socket path for any ID, auto-detecting task versus cluster. */
|
|
64
51
|
function getSocketPath(id, agentId = null) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
52
|
+
if (id.startsWith('task-')) {
|
|
53
|
+
return getTaskSocketPath(id);
|
|
54
|
+
}
|
|
55
|
+
// Check for explicit 'cluster-' prefix OR known cluster in registry
|
|
56
|
+
// Cluster IDs are generated without prefix (e.g., 'steady-pulse-42')
|
|
57
|
+
if (id.startsWith('cluster-') || isKnownCluster(id)) {
|
|
58
|
+
if (agentId) {
|
|
59
|
+
return getAgentSocketPath(id, agentId);
|
|
60
|
+
}
|
|
61
|
+
// Cluster-level socket (future use)
|
|
62
|
+
return socket_paths_1.default.getClusterSocketPath(id);
|
|
73
63
|
}
|
|
74
|
-
//
|
|
75
|
-
return
|
|
76
|
-
}
|
|
77
|
-
// Unknown format, treat as task
|
|
78
|
-
return getTaskSocketPath(id);
|
|
64
|
+
// Unknown format, treat as task
|
|
65
|
+
return getTaskSocketPath(id);
|
|
79
66
|
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Check if a socket exists and is connectable
|
|
83
|
-
* @param {string} socketPath - Path to socket file
|
|
84
|
-
* @returns {Promise<boolean>} - True if socket is live
|
|
85
|
-
*/
|
|
67
|
+
/** Check if a socket exists and is connectable. */
|
|
86
68
|
function isSocketAlive(socketPath) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
clearTimeout(timeout);
|
|
106
|
-
resolve(false);
|
|
69
|
+
if (!node_fs_1.default.existsSync(socketPath)) {
|
|
70
|
+
return Promise.resolve(false);
|
|
71
|
+
}
|
|
72
|
+
return new Promise((resolve) => {
|
|
73
|
+
const socket = node_net_1.default.createConnection(socketPath);
|
|
74
|
+
const timeout = setTimeout(() => {
|
|
75
|
+
socket.destroy();
|
|
76
|
+
resolve(false);
|
|
77
|
+
}, 1000);
|
|
78
|
+
socket.on('connect', () => {
|
|
79
|
+
clearTimeout(timeout);
|
|
80
|
+
socket.end();
|
|
81
|
+
resolve(true);
|
|
82
|
+
});
|
|
83
|
+
socket.on('error', () => {
|
|
84
|
+
clearTimeout(timeout);
|
|
85
|
+
resolve(false);
|
|
86
|
+
});
|
|
107
87
|
});
|
|
108
|
-
});
|
|
109
88
|
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Remove stale socket file if not connectable
|
|
113
|
-
* @param {string} socketPath - Path to socket file
|
|
114
|
-
* @returns {Promise<boolean>} - True if socket was removed (stale)
|
|
115
|
-
*/
|
|
89
|
+
/** Remove a stale socket file if it is not connectable. */
|
|
116
90
|
async function cleanupStaleSocket(socketPath) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
const alive = await isSocketAlive(socketPath);
|
|
122
|
-
if (!alive) {
|
|
123
|
-
try {
|
|
124
|
-
fs.unlinkSync(socketPath);
|
|
125
|
-
return true;
|
|
126
|
-
} catch {
|
|
127
|
-
// Ignore errors (file may have been removed already)
|
|
91
|
+
if (!node_fs_1.default.existsSync(socketPath)) {
|
|
92
|
+
return false;
|
|
128
93
|
}
|
|
129
|
-
|
|
130
|
-
|
|
94
|
+
const alive = await isSocketAlive(socketPath);
|
|
95
|
+
if (!alive) {
|
|
96
|
+
try {
|
|
97
|
+
node_fs_1.default.unlinkSync(socketPath);
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Ignore errors (file may have been removed already)
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return false;
|
|
131
105
|
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* List all attachable tasks
|
|
135
|
-
* Task sockets are .sock files directly in SOCKET_DIR (not in subdirectories)
|
|
136
|
-
* Excludes cluster-level sockets (cluster-xxx.sock) since those aren't tasks
|
|
137
|
-
* @returns {Promise<string[]>} - Array of task IDs with live sockets
|
|
138
|
-
*/
|
|
106
|
+
/** List task IDs with live sockets. */
|
|
139
107
|
async function listAttachableTasks() {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
tasks.push(id);
|
|
159
|
-
}
|
|
108
|
+
ensureSocketDir();
|
|
109
|
+
const entries = node_fs_1.default.readdirSync(SOCKET_DIR, { withFileTypes: true });
|
|
110
|
+
const tasks = [];
|
|
111
|
+
for (const entry of entries) {
|
|
112
|
+
// Check socket files (Unix sockets report isSocket(), not isFile())
|
|
113
|
+
// Also accept regular files for compatibility
|
|
114
|
+
const isSocketFile = (entry.isSocket() || entry.isFile()) && entry.name.endsWith('.sock');
|
|
115
|
+
if (isSocketFile && !entry.isDirectory()) {
|
|
116
|
+
const id = entry.name.slice(0, -5); // Remove .sock
|
|
117
|
+
// Skip cluster-level sockets (cluster-xxx.sock)
|
|
118
|
+
if (id.startsWith('cluster-')) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const socketPath = node_path_1.default.join(SOCKET_DIR, entry.name);
|
|
122
|
+
if (await isSocketAlive(socketPath)) {
|
|
123
|
+
tasks.push(id);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
160
126
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
return tasks;
|
|
127
|
+
return tasks;
|
|
164
128
|
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* List all attachable agents for a cluster
|
|
168
|
-
* @param {string} clusterId - Cluster ID
|
|
169
|
-
* @returns {Promise<string[]>} - Array of agent IDs with live sockets
|
|
170
|
-
*/
|
|
129
|
+
/** List agent IDs with live sockets for a cluster. */
|
|
171
130
|
async function listAttachableAgents(clusterId) {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
const files = fs.readdirSync(clusterDir);
|
|
178
|
-
const agents = [];
|
|
179
|
-
|
|
180
|
-
for (const file of files) {
|
|
181
|
-
if (file.endsWith('.sock')) {
|
|
182
|
-
const agentId = file.slice(0, -5); // Remove .sock
|
|
183
|
-
const socketPath = path.join(clusterDir, file);
|
|
184
|
-
if (await isSocketAlive(socketPath)) {
|
|
185
|
-
agents.push(agentId);
|
|
186
|
-
}
|
|
131
|
+
const clusterDir = node_path_1.default.join(SOCKET_DIR, clusterId);
|
|
132
|
+
if (!node_fs_1.default.existsSync(clusterDir)) {
|
|
133
|
+
return [];
|
|
187
134
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
135
|
+
const files = node_fs_1.default.readdirSync(clusterDir);
|
|
136
|
+
const agents = [];
|
|
137
|
+
for (const file of files) {
|
|
138
|
+
if (file.endsWith('.sock')) {
|
|
139
|
+
const agentId = file.slice(0, -5); // Remove .sock
|
|
140
|
+
const socketPath = node_path_1.default.join(clusterDir, file);
|
|
141
|
+
if (await isSocketAlive(socketPath)) {
|
|
142
|
+
agents.push(agentId);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return agents;
|
|
191
147
|
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* List all attachable clusters
|
|
195
|
-
* Checks both socket directories AND clusters.json for known clusters
|
|
196
|
-
* @returns {Promise<string[]>} - Array of cluster IDs with at least one live agent socket
|
|
197
|
-
*/
|
|
148
|
+
/** List cluster IDs with at least one live agent socket. */
|
|
198
149
|
async function listAttachableClusters() {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
150
|
+
ensureSocketDir();
|
|
151
|
+
const entries = node_fs_1.default.readdirSync(SOCKET_DIR, { withFileTypes: true });
|
|
152
|
+
const clusters = [];
|
|
153
|
+
// Check socket directories (both 'cluster-' prefix and plain cluster IDs)
|
|
154
|
+
for (const entry of entries) {
|
|
155
|
+
if (entry.isDirectory()) {
|
|
156
|
+
// Accept directories with 'cluster-' prefix OR that are known clusters
|
|
157
|
+
if (entry.name.startsWith('cluster-') || isKnownCluster(entry.name)) {
|
|
158
|
+
const agents = await listAttachableAgents(entry.name);
|
|
159
|
+
if (agents.length > 0) {
|
|
160
|
+
clusters.push(entry.name);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
211
163
|
}
|
|
212
|
-
}
|
|
213
164
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
return clusters;
|
|
165
|
+
return clusters;
|
|
217
166
|
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Cleanup all sockets for a cluster (on cluster stop)
|
|
221
|
-
* @param {string} clusterId - Cluster ID
|
|
222
|
-
*/
|
|
167
|
+
/** Cleanup all sockets for a cluster when it stops. */
|
|
223
168
|
function cleanupClusterSockets(clusterId) {
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
169
|
+
const clusterDir = node_path_1.default.join(SOCKET_DIR, clusterId);
|
|
170
|
+
if (node_fs_1.default.existsSync(clusterDir)) {
|
|
171
|
+
const files = node_fs_1.default.readdirSync(clusterDir);
|
|
172
|
+
for (const file of files) {
|
|
173
|
+
try {
|
|
174
|
+
node_fs_1.default.unlinkSync(node_path_1.default.join(clusterDir, file));
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// Ignore
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
node_fs_1.default.rmdirSync(clusterDir);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// Ignore
|
|
185
|
+
}
|
|
238
186
|
}
|
|
239
|
-
}
|
|
240
187
|
}
|
|
241
|
-
|
|
242
188
|
module.exports = {
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
189
|
+
ZEROSHOT_DIR,
|
|
190
|
+
SOCKET_DIR,
|
|
191
|
+
ensureSocketDir,
|
|
192
|
+
getTaskSocketPath,
|
|
193
|
+
getAgentSocketPath,
|
|
194
|
+
getSocketPath,
|
|
195
|
+
isSocketAlive,
|
|
196
|
+
cleanupStaleSocket,
|
|
197
|
+
listAttachableTasks,
|
|
198
|
+
listAttachableAgents,
|
|
199
|
+
listAttachableClusters,
|
|
200
|
+
cleanupClusterSockets,
|
|
201
|
+
isKnownCluster,
|
|
256
202
|
};
|