@seawork/server 1.0.7 → 1.0.10-rc.4
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/dist/server/client/daemon-client.d.ts +32 -1
- package/dist/server/client/daemon-client.d.ts.map +1 -1
- package/dist/server/client/daemon-client.js +69 -0
- package/dist/server/client/daemon-client.js.map +1 -1
- package/dist/server/server/agent/agent-management-mcp.d.ts.map +1 -1
- package/dist/server/server/agent/agent-management-mcp.js +6 -5
- package/dist/server/server/agent/agent-management-mcp.js.map +1 -1
- package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -1
- package/dist/server/server/agent/agent-response-loop.js +0 -1
- package/dist/server/server/agent/agent-response-loop.js.map +1 -1
- package/dist/server/server/agent/agent-storage.d.ts +68 -68
- package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
- package/dist/server/server/agent/mcp-server.js +6 -5
- package/dist/server/server/agent/mcp-server.js.map +1 -1
- package/dist/server/server/agent/mcp-shared.d.ts +30 -30
- package/dist/server/server/agent/provider-manifest.d.ts +2 -1
- package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
- package/dist/server/server/agent/provider-manifest.js +3 -64
- package/dist/server/server/agent/provider-manifest.js.map +1 -1
- package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
- package/dist/server/server/agent/provider-registry.js +2 -10
- package/dist/server/server/agent/provider-registry.js.map +1 -1
- package/dist/server/server/agent/providers/claude/claude-models.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/claude-models.js +3 -0
- package/dist/server/server/agent/providers/claude/claude-models.js.map +1 -1
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +2 -2
- package/dist/server/server/agent/providers/claude-agent.d.ts +2 -1
- package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.js +167 -22
- package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.js +106 -3
- package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
- package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex-rollout-timeline.js +76 -0
- package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -1
- package/dist/server/server/agent/providers/seawork-models.d.ts.map +1 -1
- package/dist/server/server/agent/providers/seawork-models.js +9 -0
- package/dist/server/server/agent/providers/seawork-models.js.map +1 -1
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +16 -16
- package/dist/server/server/bug-report-handler.d.ts +9 -0
- package/dist/server/server/bug-report-handler.d.ts.map +1 -0
- package/dist/server/server/bug-report-handler.js +111 -0
- package/dist/server/server/bug-report-handler.js.map +1 -0
- package/dist/server/server/bug-report-redact.d.ts +12 -0
- package/dist/server/server/bug-report-redact.d.ts.map +1 -0
- package/dist/server/server/bug-report-redact.js +63 -0
- package/dist/server/server/bug-report-redact.js.map +1 -0
- package/dist/server/server/chat/chat-rpc-schemas.d.ts +26 -26
- package/dist/server/server/chat/chat-types.d.ts +2 -2
- package/dist/server/server/exports.d.ts +4 -2
- package/dist/server/server/exports.d.ts.map +1 -1
- package/dist/server/server/exports.js +3 -0
- package/dist/server/server/exports.js.map +1 -1
- package/dist/server/server/index.js +47 -0
- package/dist/server/server/index.js.map +1 -1
- package/dist/server/server/loop/rpc-schemas.d.ts +775 -775
- package/dist/server/server/loop-service.d.ts +108 -108
- package/dist/server/server/persisted-config.d.ts +121 -121
- package/dist/server/server/sac/errors.d.ts +1 -0
- package/dist/server/server/sac/errors.d.ts.map +1 -1
- package/dist/server/server/sac/errors.js +2 -1
- package/dist/server/server/sac/errors.js.map +1 -1
- package/dist/server/server/sac/generate.d.ts +19 -11
- package/dist/server/server/sac/generate.d.ts.map +1 -1
- package/dist/server/server/sac/generate.js +131 -36
- package/dist/server/server/sac/generate.js.map +1 -1
- package/dist/server/server/sac/index.d.ts +8 -10
- package/dist/server/server/sac/index.d.ts.map +1 -1
- package/dist/server/server/sac/index.js +5 -17
- package/dist/server/server/sac/index.js.map +1 -1
- package/dist/server/server/sac/providers/alibaba.d.ts +2 -0
- package/dist/server/server/sac/providers/alibaba.d.ts.map +1 -0
- package/dist/server/server/sac/providers/alibaba.js +506 -0
- package/dist/server/server/sac/providers/alibaba.js.map +1 -0
- package/dist/server/server/sac/providers/audio.d.ts +2 -0
- package/dist/server/server/sac/providers/audio.d.ts.map +1 -0
- package/dist/server/server/sac/providers/audio.js +57 -0
- package/dist/server/server/sac/providers/audio.js.map +1 -0
- package/dist/server/server/sac/providers/kling.d.ts +2 -0
- package/dist/server/server/sac/providers/kling.d.ts.map +1 -0
- package/dist/server/server/sac/providers/kling.js +589 -0
- package/dist/server/server/sac/providers/kling.js.map +1 -0
- package/dist/server/server/sac/providers/nano.d.ts +2 -0
- package/dist/server/server/sac/providers/nano.d.ts.map +1 -0
- package/dist/server/server/sac/providers/nano.js +37 -0
- package/dist/server/server/sac/providers/nano.js.map +1 -0
- package/dist/server/server/sac/providers/pixverse.d.ts +2 -0
- package/dist/server/server/sac/providers/pixverse.d.ts.map +1 -0
- package/dist/server/server/sac/providers/pixverse.js +1017 -0
- package/dist/server/server/sac/providers/pixverse.js.map +1 -0
- package/dist/server/server/sac/providers/registry.d.ts +34 -0
- package/dist/server/server/sac/providers/registry.d.ts.map +1 -0
- package/dist/server/server/sac/providers/registry.js +57 -0
- package/dist/server/server/sac/providers/registry.js.map +1 -0
- package/dist/server/server/sac/providers/seaart.d.ts +1 -4
- package/dist/server/server/sac/providers/seaart.d.ts.map +1 -1
- package/dist/server/server/sac/providers/seaart.js +8 -18
- package/dist/server/server/sac/providers/seaart.js.map +1 -1
- package/dist/server/server/sac/providers/store.d.ts +9 -5
- package/dist/server/server/sac/providers/store.d.ts.map +1 -1
- package/dist/server/server/sac/providers/store.js +0 -3
- package/dist/server/server/sac/providers/store.js.map +1 -1
- package/dist/server/server/sac/providers/tencent-3d.d.ts +2 -0
- package/dist/server/server/sac/providers/tencent-3d.d.ts.map +1 -0
- package/dist/server/server/sac/providers/tencent-3d.js +210 -0
- package/dist/server/server/sac/providers/tencent-3d.js.map +1 -0
- package/dist/server/server/sac/providers/tencent-image.d.ts +2 -0
- package/dist/server/server/sac/providers/tencent-image.d.ts.map +1 -0
- package/dist/server/server/sac/providers/tencent-image.js +90 -0
- package/dist/server/server/sac/providers/tencent-image.js.map +1 -0
- package/dist/server/server/sac/providers/tencent-video.d.ts +2 -0
- package/dist/server/server/sac/providers/tencent-video.d.ts.map +1 -0
- package/dist/server/server/sac/providers/tencent-video.js +103 -0
- package/dist/server/server/sac/providers/tencent-video.js.map +1 -0
- package/dist/server/server/sac/providers/tripo3d.d.ts +2 -0
- package/dist/server/server/sac/providers/tripo3d.d.ts.map +1 -0
- package/dist/server/server/sac/providers/tripo3d.js +302 -0
- package/dist/server/server/sac/providers/tripo3d.js.map +1 -0
- package/dist/server/server/sac/providers/vidu.d.ts +2 -0
- package/dist/server/server/sac/providers/vidu.d.ts.map +1 -0
- package/dist/server/server/sac/providers/vidu.js +965 -0
- package/dist/server/server/sac/providers/vidu.js.map +1 -0
- package/dist/server/server/sac/providers/volces-3d.d.ts +2 -0
- package/dist/server/server/sac/providers/volces-3d.d.ts.map +1 -0
- package/dist/server/server/sac/providers/volces-3d.js +77 -0
- package/dist/server/server/sac/providers/volces-3d.js.map +1 -0
- package/dist/server/server/sac/providers/volces-video.d.ts +2 -0
- package/dist/server/server/sac/providers/volces-video.d.ts.map +1 -0
- package/dist/server/server/sac/providers/volces-video.js +392 -0
- package/dist/server/server/sac/providers/volces-video.js.map +1 -0
- package/dist/server/server/sac/providers/volces.d.ts +1 -4
- package/dist/server/server/sac/providers/volces.d.ts.map +1 -1
- package/dist/server/server/sac/providers/volces.js +279 -66
- package/dist/server/server/sac/providers/volces.js.map +1 -1
- package/dist/server/server/sac/types.d.ts +13 -30
- package/dist/server/server/sac/types.d.ts.map +1 -1
- package/dist/server/server/schedule/rpc-schemas.d.ts +493 -493
- package/dist/server/server/schedule/types.d.ts +140 -140
- package/dist/server/server/session.d.ts +9 -2
- package/dist/server/server/session.d.ts.map +1 -1
- package/dist/server/server/session.js +137 -19
- package/dist/server/server/session.js.map +1 -1
- package/dist/server/server/speech/speech-types.d.ts +2 -2
- package/dist/server/server/workspace-registry.d.ts +4 -4
- package/dist/server/shared/messages.d.ts +17455 -15917
- package/dist/server/shared/messages.d.ts.map +1 -1
- package/dist/server/shared/messages.js +83 -0
- package/dist/server/shared/messages.js.map +1 -1
- package/dist/server/utils/spawn.d.ts.map +1 -1
- package/dist/server/utils/spawn.js +8 -3
- package/dist/server/utils/spawn.js.map +1 -1
- package/dist/server/utils/worktree-metadata.d.ts +4 -4
- package/package.json +7 -9
- package/dist/server/server/agent/providers/acp-agent.d.ts +0 -202
- package/dist/server/server/agent/providers/acp-agent.d.ts.map +0 -1
- package/dist/server/server/agent/providers/acp-agent.js +0 -1650
- package/dist/server/server/agent/providers/acp-agent.js.map +0 -1
- package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +0 -16
- package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +0 -1
- package/dist/server/server/agent/providers/copilot-acp-agent.js +0 -95
- package/dist/server/server/agent/providers/copilot-acp-agent.js.map +0 -1
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +0 -3
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts.map +0 -1
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +0 -39
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js.map +0 -1
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +0 -13
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +0 -1
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +0 -144
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.js.map +0 -1
- package/dist/server/server/agent/providers/opencode-agent.d.ts +0 -121
- package/dist/server/server/agent/providers/opencode-agent.d.ts.map +0 -1
- package/dist/server/server/agent/providers/opencode-agent.js +0 -1649
- package/dist/server/server/agent/providers/opencode-agent.js.map +0 -1
- package/dist/server/server/agent/providers/pi-acp-agent.d.ts +0 -28
- package/dist/server/server/agent/providers/pi-acp-agent.d.ts.map +0 -1
- package/dist/server/server/agent/providers/pi-acp-agent.js +0 -302
- package/dist/server/server/agent/providers/pi-acp-agent.js.map +0 -1
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { execFile } from "node:child_process";
|
|
2
|
-
import { promisify } from "node:util";
|
|
3
2
|
import { randomUUID } from "node:crypto";
|
|
4
|
-
import fs from "node:fs";
|
|
5
|
-
import {
|
|
3
|
+
import fs, { promises } from "node:fs";
|
|
4
|
+
import { createRequire } from "node:module";
|
|
6
5
|
import os from "node:os";
|
|
7
6
|
import path from "node:path";
|
|
7
|
+
import { promisify } from "node:util";
|
|
8
8
|
import { query, } from "@anthropic-ai/claude-agent-sdk";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
9
|
+
import { spawnProcess } from "../../../utils/spawn.js";
|
|
10
|
+
import { getOrchestratorModeInstructions } from "../orchestrator-instructions.js";
|
|
11
|
+
import { applyProviderEnv } from "../provider-launch-config.js";
|
|
11
12
|
import { getClaudeModels, normalizeClaudeRuntimeModelId } from "./claude/claude-models.js";
|
|
12
13
|
import { parsePartialJsonObject } from "./claude/partial-json.js";
|
|
13
14
|
import { ClaudeSidechainTracker } from "./claude/sidechain-tracker.js";
|
|
15
|
+
import { mapTaskNotificationSystemRecordToToolCall, mapTaskNotificationUserContentToToolCall, } from "./claude/task-notification-tool-call.js";
|
|
16
|
+
import { mapClaudeCanceledToolCall, mapClaudeCompletedToolCall, mapClaudeFailedToolCall, mapClaudeRunningToolCall, } from "./claude/tool-call-mapper.js";
|
|
14
17
|
import { formatDiagnosticStatus, formatProviderDiagnostic, formatProviderDiagnosticError, toDiagnosticErrorMessage, } from "./diagnostic-utils.js";
|
|
15
|
-
import { applyProviderEnv } from "../provider-launch-config.js";
|
|
16
|
-
import { spawnProcess } from "../../../utils/spawn.js";
|
|
17
|
-
import { getOrchestratorModeInstructions } from "../orchestrator-instructions.js";
|
|
18
18
|
const fsPromises = promises;
|
|
19
19
|
const execFileAsync = promisify(execFile);
|
|
20
20
|
const CLAUDE_SETTING_SOURCES = ["user", "project"];
|
|
@@ -59,6 +59,53 @@ const INTERRUPT_TOOL_USE_PLACEHOLDER = "[Request interrupted by user for tool us
|
|
|
59
59
|
const INTERRUPT_PLACEHOLDER_PATTERN = /^\[Request interrupted by user(?:[^\]]*)\]$/;
|
|
60
60
|
const NO_RESPONSE_REQUESTED_PLACEHOLDER = "No response requested.";
|
|
61
61
|
const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
62
|
+
/**
|
|
63
|
+
* Resolve the Electron Helper binary path. The Helper has LSUIElement=true in
|
|
64
|
+
* its Info.plist, so spawning via it won't create macOS Dock icons.
|
|
65
|
+
*/
|
|
66
|
+
function resolveElectronHelperPath() {
|
|
67
|
+
if (process.platform !== "darwin" || !process.versions["electron"]) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
// process.execPath = .../Electron.app/Contents/MacOS/Electron (or Seawork)
|
|
71
|
+
// Helper lives at .../Electron.app/Contents/Frameworks/Electron Helper.app/Contents/MacOS/Electron Helper
|
|
72
|
+
const contentsDir = path.dirname(path.dirname(process.execPath));
|
|
73
|
+
const appName = path.basename(process.execPath);
|
|
74
|
+
const helperPath = path.join(contentsDir, "Frameworks", `${appName} Helper.app`, "Contents", "MacOS", `${appName} Helper`);
|
|
75
|
+
return fs.existsSync(helperPath) ? helperPath : null;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Resolve the absolute path to the Claude Agent SDK's `cli.js`. The SDK would
|
|
79
|
+
* otherwise derive this from `import.meta.url`, which inside a packaged
|
|
80
|
+
* Electron app resolves to a virtual `app.asar` path that child processes
|
|
81
|
+
* cannot read — `cli.js` physically lives in `app.asar.unpacked`. Passing the
|
|
82
|
+
* rewritten path via `pathToClaudeCodeExecutable` also makes the SDK's
|
|
83
|
+
* ENOENT error messages reference a real on-disk location instead of the
|
|
84
|
+
* misleading asar path.
|
|
85
|
+
*/
|
|
86
|
+
let cachedClaudeCliPath;
|
|
87
|
+
export function resolveClaudeCliExecutable() {
|
|
88
|
+
if (cachedClaudeCliPath !== undefined) {
|
|
89
|
+
return cachedClaudeCliPath;
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
const sdkRequire = createRequire(import.meta.url);
|
|
93
|
+
// The SDK's package.json doesn't expose "./package.json" via exports, so
|
|
94
|
+
// resolve the main entry (sdk.mjs) and derive the package root from it.
|
|
95
|
+
const mainPath = sdkRequire.resolve("@anthropic-ai/claude-agent-sdk");
|
|
96
|
+
let cliPath = path.join(path.dirname(mainPath), "cli.js");
|
|
97
|
+
const asarSeg = `app.asar${path.sep}`;
|
|
98
|
+
const unpackedSeg = `app.asar.unpacked${path.sep}`;
|
|
99
|
+
if (cliPath.includes(asarSeg) && !cliPath.includes(unpackedSeg)) {
|
|
100
|
+
cliPath = cliPath.replace(asarSeg, unpackedSeg);
|
|
101
|
+
}
|
|
102
|
+
cachedClaudeCliPath = fs.existsSync(cliPath) ? cliPath : null;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
cachedClaudeCliPath = null;
|
|
106
|
+
}
|
|
107
|
+
return cachedClaudeCliPath;
|
|
108
|
+
}
|
|
62
109
|
function resolveClaudeSpawnCommand(spawnOptions, runtimeSettings) {
|
|
63
110
|
const commandConfig = runtimeSettings?.command;
|
|
64
111
|
if (!commandConfig || commandConfig.mode === "default") {
|
|
@@ -78,24 +125,94 @@ function resolveClaudeSpawnCommand(spawnOptions, runtimeSettings) {
|
|
|
78
125
|
args: [...commandConfig.argv.slice(1), ...spawnOptions.args],
|
|
79
126
|
};
|
|
80
127
|
}
|
|
81
|
-
function applyRuntimeSettingsToClaudeOptions(options, runtimeSettings, launchEnv) {
|
|
128
|
+
function applyRuntimeSettingsToClaudeOptions(options, runtimeSettings, launchEnv, logger) {
|
|
82
129
|
return {
|
|
83
130
|
...options,
|
|
84
131
|
spawnClaudeCodeProcess: (spawnOptions) => {
|
|
85
132
|
const resolved = resolveClaudeSpawnCommand(spawnOptions, runtimeSettings);
|
|
86
|
-
// When the SDK passes a default JS runtime ("node"/"bun"), replace it with
|
|
87
|
-
// process.execPath — the actual node binary running the daemon. This avoids
|
|
88
|
-
// PATH lookup failures in the managed runtime bundle.
|
|
89
|
-
// When the SDK passes a native binary path (from pathToClaudeCodeExecutable)
|
|
90
|
-
// or the user overrides the command via runtime settings, use that directly.
|
|
91
133
|
const isDefaultRuntime = resolved.command === "node" || resolved.command === "bun";
|
|
92
|
-
|
|
134
|
+
// Prefer system node/bun. In packaged Electron apps where those are
|
|
135
|
+
// unavailable, fall back to the Electron Helper binary (which has
|
|
136
|
+
// LSUIElement=true in its Info.plist, so it won't create Dock icons).
|
|
137
|
+
let command;
|
|
138
|
+
const spawnEnv = {
|
|
139
|
+
...applyProviderEnv(spawnOptions.env, runtimeSettings),
|
|
140
|
+
...(launchEnv ?? {}),
|
|
141
|
+
// Skip OAuth/keychain auth check against api.anthropic.com so
|
|
142
|
+
// claude CLI authenticates purely via ANTHROPIC_API_KEY env var.
|
|
143
|
+
CLAUDE_CODE_SIMPLE: "1",
|
|
144
|
+
// Strip conflicting Anthropic/Bedrock/Vertex auth vars inherited from
|
|
145
|
+
// the user's shell. If these are set, claude CLI picks one of the
|
|
146
|
+
// non-API-key code paths (Bedrock/Vertex/OAuth) and ignores our
|
|
147
|
+
// ANTHROPIC_API_KEY, causing 403 invalid_api_key errors.
|
|
148
|
+
ANTHROPIC_AUTH_TOKEN: undefined,
|
|
149
|
+
ANTHROPIC_MODEL: undefined,
|
|
150
|
+
ANTHROPIC_SMALL_FAST_MODEL: undefined,
|
|
151
|
+
CLAUDE_CODE_USE_BEDROCK: undefined,
|
|
152
|
+
CLAUDE_CODE_USE_VERTEX: undefined,
|
|
153
|
+
AWS_BEARER_TOKEN_BEDROCK: undefined,
|
|
154
|
+
};
|
|
155
|
+
if (!isDefaultRuntime) {
|
|
156
|
+
command = resolved.command;
|
|
157
|
+
}
|
|
158
|
+
else if (process.versions["electron"] != null) {
|
|
159
|
+
// Running inside Electron — use Helper binary (LSUIElement=true, no Dock icon).
|
|
160
|
+
command = resolveElectronHelperPath() ?? process.execPath;
|
|
161
|
+
spawnEnv.ELECTRON_RUN_AS_NODE = "1";
|
|
162
|
+
// ELECTRON_RUN_AS_NODE disables asar support, so rewrite any
|
|
163
|
+
// app.asar paths in args to app.asar.unpacked so Node can find them.
|
|
164
|
+
for (let i = 0; i < resolved.args.length; i++) {
|
|
165
|
+
if (resolved.args[i].includes("app.asar" + path.sep)) {
|
|
166
|
+
resolved.args[i] = resolved.args[i].replace("app.asar" + path.sep, "app.asar.unpacked" + path.sep);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
command = resolved.command;
|
|
172
|
+
}
|
|
173
|
+
const runtimeKind = !isDefaultRuntime
|
|
174
|
+
? "custom"
|
|
175
|
+
: command === resolved.command
|
|
176
|
+
? resolved.command
|
|
177
|
+
: command.includes("Helper")
|
|
178
|
+
? "electron-helper"
|
|
179
|
+
: "electron";
|
|
180
|
+
logger?.debug({
|
|
181
|
+
runtimeKind,
|
|
182
|
+
command,
|
|
183
|
+
sdkCommand: resolved.command,
|
|
184
|
+
args: resolved.args,
|
|
185
|
+
cwd: spawnOptions.cwd,
|
|
186
|
+
isElectron: process.versions["electron"] != null,
|
|
187
|
+
hasAnthropicKey: !!spawnEnv.ANTHROPIC_API_KEY,
|
|
188
|
+
anthropicKeyPrefix: spawnEnv.ANTHROPIC_API_KEY?.slice(0, 10) ?? null,
|
|
189
|
+
anthropicBaseUrl: spawnEnv.ANTHROPIC_BASE_URL ?? null,
|
|
190
|
+
launchEnvKeys: Object.keys(launchEnv ?? {}),
|
|
191
|
+
}, "claude_spawn");
|
|
192
|
+
// Pre-flight diagnostics. The SDK reports every ENOENT from spawn as
|
|
193
|
+
// "Claude Code executable not found", which is misleading when the true
|
|
194
|
+
// cause is the cwd, the Node host, or the cli.js script. Surface the
|
|
195
|
+
// actual culprit in the daemon log before spawn returns.
|
|
196
|
+
const cwdForSpawn = typeof spawnOptions.cwd === "string" ? spawnOptions.cwd : null;
|
|
197
|
+
const scriptArg = resolved.args[0];
|
|
198
|
+
// Bare command names (e.g. "node", "bun") are resolved via PATH at spawn
|
|
199
|
+
// time, not as filesystem paths — fs.existsSync would always return false
|
|
200
|
+
// for them and trigger spurious preflight_failed logs. Only probe the
|
|
201
|
+
// filesystem when the command actually contains a path separator.
|
|
202
|
+
const commandLooksLikePath = command.includes("/") || command.includes("\\");
|
|
203
|
+
const preflight = {
|
|
204
|
+
cwdExists: cwdForSpawn ? fs.existsSync(cwdForSpawn) : null,
|
|
205
|
+
commandExists: commandLooksLikePath ? fs.existsSync(command) : null,
|
|
206
|
+
scriptExists: typeof scriptArg === "string" ? fs.existsSync(scriptArg) : null,
|
|
207
|
+
};
|
|
208
|
+
if (preflight.cwdExists === false ||
|
|
209
|
+
preflight.commandExists === false ||
|
|
210
|
+
preflight.scriptExists === false) {
|
|
211
|
+
logger?.error({ ...preflight, cwd: cwdForSpawn, command, scriptArg }, "claude_spawn_preflight_failed");
|
|
212
|
+
}
|
|
93
213
|
const child = spawnProcess(command, resolved.args, {
|
|
94
214
|
cwd: spawnOptions.cwd,
|
|
95
|
-
env:
|
|
96
|
-
...applyProviderEnv(spawnOptions.env, runtimeSettings),
|
|
97
|
-
...(launchEnv ?? {}),
|
|
98
|
-
},
|
|
215
|
+
env: spawnEnv,
|
|
99
216
|
signal: spawnOptions.signal,
|
|
100
217
|
stdio: ["pipe", "pipe", "pipe"],
|
|
101
218
|
// Bypass cmd.exe on Windows: the SDK passes --mcp-config with inline JSON
|
|
@@ -108,6 +225,18 @@ function applyRuntimeSettingsToClaudeOptions(options, runtimeSettings, launchEnv
|
|
|
108
225
|
options.stderr?.(chunk.toString());
|
|
109
226
|
});
|
|
110
227
|
}
|
|
228
|
+
child.on("error", (err) => {
|
|
229
|
+
logger?.error({
|
|
230
|
+
code: err.code,
|
|
231
|
+
errno: err.errno,
|
|
232
|
+
syscall: err.syscall,
|
|
233
|
+
path: err.path,
|
|
234
|
+
...preflight,
|
|
235
|
+
cwd: cwdForSpawn,
|
|
236
|
+
command,
|
|
237
|
+
scriptArg,
|
|
238
|
+
}, "claude_spawn_child_error");
|
|
239
|
+
});
|
|
111
240
|
return child;
|
|
112
241
|
},
|
|
113
242
|
};
|
|
@@ -1684,8 +1813,25 @@ class ClaudeAgentSession {
|
|
|
1684
1813
|
]
|
|
1685
1814
|
.filter((entry) => typeof entry === "string" && entry.length > 0)
|
|
1686
1815
|
.join("\n\n");
|
|
1816
|
+
// Point to the Seawork-managed settings file (written at daemon startup in
|
|
1817
|
+
// server/index.ts) so the spawned claude CLI uses our gateway auth.
|
|
1818
|
+
// The SDK `settings` option (flag settings layer) has the highest priority.
|
|
1819
|
+
const seaworkHome = process.env.SEAWORK_HOME ?? path.join(os.homedir(), ".seawork");
|
|
1820
|
+
const seaworkSettingsPath = path.join(seaworkHome, "claude-settings.json");
|
|
1821
|
+
const hasSeaworkSettings = fs.existsSync(seaworkSettingsPath);
|
|
1822
|
+
// Windows' CreateProcess returns ENOENT when the spawn cwd does not exist,
|
|
1823
|
+
// and the SDK mislabels that ENOENT as "Claude Code executable not found".
|
|
1824
|
+
// Fail early with a clear message instead.
|
|
1825
|
+
if (this.config.cwd && !fs.existsSync(this.config.cwd)) {
|
|
1826
|
+
throw new Error(`Agent working directory does not exist: ${this.config.cwd}`);
|
|
1827
|
+
}
|
|
1828
|
+
// Pre-resolve cli.js and pin it via pathToClaudeCodeExecutable. The SDK's
|
|
1829
|
+
// default resolution uses `import.meta.url`, which in packaged Electron
|
|
1830
|
+
// apps produces a virtual app.asar path that spawned children can't read.
|
|
1831
|
+
const cliExecutable = resolveClaudeCliExecutable();
|
|
1687
1832
|
const base = {
|
|
1688
1833
|
cwd: this.config.cwd,
|
|
1834
|
+
...(cliExecutable ? { pathToClaudeCodeExecutable: cliExecutable } : {}),
|
|
1689
1835
|
includePartialMessages: true,
|
|
1690
1836
|
permissionMode: this.currentMode,
|
|
1691
1837
|
// Dynamic mode switching can recreate the underlying Claude query. Keep the
|
|
@@ -1702,6 +1848,7 @@ class ClaudeAgentSession {
|
|
|
1702
1848
|
append: appendedSystemPrompt,
|
|
1703
1849
|
},
|
|
1704
1850
|
settingSources: CLAUDE_SETTING_SOURCES,
|
|
1851
|
+
...(hasSeaworkSettings ? { settings: seaworkSettingsPath } : {}),
|
|
1705
1852
|
stderr: (data) => {
|
|
1706
1853
|
this.captureStderr(data);
|
|
1707
1854
|
this.logger.error({ stderr: data.trim() }, "Claude Agent SDK stderr");
|
|
@@ -1709,8 +1856,6 @@ class ClaudeAgentSession {
|
|
|
1709
1856
|
env: {
|
|
1710
1857
|
...process.env,
|
|
1711
1858
|
// Clear proxy env vars to prevent interference with gateway requests.
|
|
1712
|
-
// Claude Code also reads proxy from ~/.claude/settings.json, but
|
|
1713
|
-
// spawn env takes precedence for the process environment.
|
|
1714
1859
|
http_proxy: "",
|
|
1715
1860
|
https_proxy: "",
|
|
1716
1861
|
HTTP_PROXY: "",
|
|
@@ -1742,7 +1887,7 @@ class ClaudeAgentSession {
|
|
|
1742
1887
|
return this.applyRuntimeSettings(base);
|
|
1743
1888
|
}
|
|
1744
1889
|
applyRuntimeSettings(options) {
|
|
1745
|
-
return applyRuntimeSettingsToClaudeOptions(options, this.runtimeSettings, this.launchEnv);
|
|
1890
|
+
return applyRuntimeSettingsToClaudeOptions(options, this.runtimeSettings, this.launchEnv, this.logger);
|
|
1746
1891
|
}
|
|
1747
1892
|
normalizeMcpServers(servers) {
|
|
1748
1893
|
const result = {};
|