@seawork/server 1.0.4 → 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 +8 -69
- 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 +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 +4 -39
- 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 +175 -46
- 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 +128 -72
- 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 +4 -0
- package/dist/server/server/agent/providers/seawork-models.d.ts.map +1 -0
- package/dist/server/server/agent/providers/seawork-models.js +128 -0
- package/dist/server/server/agent/providers/seawork-models.js.map +1 -0
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +16 -16
- package/dist/server/server/bootstrap.d.ts.map +1 -1
- package/dist/server/server/bootstrap.js +35 -1
- package/dist/server/server/bootstrap.js.map +1 -1
- 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/config.d.ts.map +1 -1
- package/dist/server/server/config.js +6 -1
- package/dist/server/server/config.js.map +1 -1
- 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 +54 -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/pid-lock.d.ts.map +1 -1
- package/dist/server/server/pid-lock.js +35 -2
- package/dist/server/server/pid-lock.js.map +1 -1
- package/dist/server/server/sac/auth.d.ts +41 -0
- package/dist/server/server/sac/auth.d.ts.map +1 -0
- package/dist/server/server/sac/auth.js +103 -0
- package/dist/server/server/sac/auth.js.map +1 -0
- package/dist/server/server/sac/client.d.ts +15 -0
- package/dist/server/server/sac/client.d.ts.map +1 -0
- package/dist/server/server/sac/client.js +70 -0
- package/dist/server/server/sac/client.js.map +1 -0
- package/dist/server/server/sac/download.d.ts +10 -0
- package/dist/server/server/sac/download.d.ts.map +1 -0
- package/dist/server/server/sac/download.js +67 -0
- package/dist/server/server/sac/download.js.map +1 -0
- package/dist/server/server/sac/endpoints.d.ts +13 -0
- package/dist/server/server/sac/endpoints.d.ts.map +1 -0
- package/dist/server/server/sac/endpoints.js +16 -0
- package/dist/server/server/sac/endpoints.js.map +1 -0
- package/dist/server/server/sac/errors.d.ts +40 -0
- package/dist/server/server/sac/errors.d.ts.map +1 -0
- package/dist/server/server/sac/errors.js +47 -0
- package/dist/server/server/sac/errors.js.map +1 -0
- package/dist/server/server/sac/generate.d.ts +43 -0
- package/dist/server/server/sac/generate.d.ts.map +1 -0
- package/dist/server/server/sac/generate.js +206 -0
- package/dist/server/server/sac/generate.js.map +1 -0
- package/dist/server/server/sac/index.d.ts +22 -0
- package/dist/server/server/sac/index.d.ts.map +1 -0
- package/dist/server/server/sac/index.js +14 -0
- package/dist/server/server/sac/index.js.map +1 -0
- package/dist/server/server/sac/output.d.ts +22 -0
- package/dist/server/server/sac/output.d.ts.map +1 -0
- package/dist/server/server/sac/output.js +142 -0
- package/dist/server/server/sac/output.js.map +1 -0
- package/dist/server/server/sac/poll.d.ts +12 -0
- package/dist/server/server/sac/poll.d.ts.map +1 -0
- package/dist/server/server/sac/poll.js +67 -0
- package/dist/server/server/sac/poll.js.map +1 -0
- 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/index.d.ts +19 -0
- package/dist/server/server/sac/providers/index.d.ts.map +1 -0
- package/dist/server/server/sac/providers/index.js +32 -0
- package/dist/server/server/sac/providers/index.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 +4 -0
- package/dist/server/server/sac/providers/seaart.d.ts.map +1 -0
- package/dist/server/server/sac/providers/seaart.js +57 -0
- package/dist/server/server/sac/providers/seaart.js.map +1 -0
- package/dist/server/server/sac/providers/store.d.ts +12 -0
- package/dist/server/server/sac/providers/store.d.ts.map +1 -0
- package/dist/server/server/sac/providers/store.js +7 -0
- package/dist/server/server/sac/providers/store.js.map +1 -0
- 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 +2 -0
- package/dist/server/server/sac/providers/volces.d.ts.map +1 -0
- package/dist/server/server/sac/providers/volces.js +301 -0
- package/dist/server/server/sac/providers/volces.js.map +1 -0
- package/dist/server/server/sac/types.d.ts +59 -0
- package/dist/server/server/sac/types.d.ts.map +1 -0
- package/dist/server/server/sac/types.js +5 -0
- package/dist/server/server/sac/types.js.map +1 -0
- 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/dist/src/server/pid-lock.js +35 -2
- package/dist/src/server/pid-lock.js.map +1 -1
- package/package.json +14 -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,21 +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 { findExecutable } from "../../../utils/executable.js";
|
|
17
|
-
import { spawnProcess } from "../../../utils/spawn.js";
|
|
18
|
-
import { getOrchestratorModeInstructions } from "../orchestrator-instructions.js";
|
|
19
18
|
const fsPromises = promises;
|
|
20
19
|
const execFileAsync = promisify(execFile);
|
|
21
20
|
const CLAUDE_SETTING_SOURCES = ["user", "project"];
|
|
@@ -60,6 +59,53 @@ const INTERRUPT_TOOL_USE_PLACEHOLDER = "[Request interrupted by user for tool us
|
|
|
60
59
|
const INTERRUPT_PLACEHOLDER_PATTERN = /^\[Request interrupted by user(?:[^\]]*)\]$/;
|
|
61
60
|
const NO_RESPONSE_REQUESTED_PLACEHOLDER = "No response requested.";
|
|
62
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
|
+
}
|
|
63
109
|
function resolveClaudeSpawnCommand(spawnOptions, runtimeSettings) {
|
|
64
110
|
const commandConfig = runtimeSettings?.command;
|
|
65
111
|
if (!commandConfig || commandConfig.mode === "default") {
|
|
@@ -79,24 +125,94 @@ function resolveClaudeSpawnCommand(spawnOptions, runtimeSettings) {
|
|
|
79
125
|
args: [...commandConfig.argv.slice(1), ...spawnOptions.args],
|
|
80
126
|
};
|
|
81
127
|
}
|
|
82
|
-
function applyRuntimeSettingsToClaudeOptions(options, runtimeSettings, launchEnv) {
|
|
128
|
+
function applyRuntimeSettingsToClaudeOptions(options, runtimeSettings, launchEnv, logger) {
|
|
83
129
|
return {
|
|
84
130
|
...options,
|
|
85
131
|
spawnClaudeCodeProcess: (spawnOptions) => {
|
|
86
132
|
const resolved = resolveClaudeSpawnCommand(spawnOptions, runtimeSettings);
|
|
87
|
-
// When the SDK passes a default JS runtime ("node"/"bun"), replace it with
|
|
88
|
-
// process.execPath — the actual node binary running the daemon. This avoids
|
|
89
|
-
// PATH lookup failures in the managed runtime bundle.
|
|
90
|
-
// When the SDK passes a native binary path (from pathToClaudeCodeExecutable)
|
|
91
|
-
// or the user overrides the command via runtime settings, use that directly.
|
|
92
133
|
const isDefaultRuntime = resolved.command === "node" || resolved.command === "bun";
|
|
93
|
-
|
|
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
|
+
}
|
|
94
213
|
const child = spawnProcess(command, resolved.args, {
|
|
95
214
|
cwd: spawnOptions.cwd,
|
|
96
|
-
env:
|
|
97
|
-
...applyProviderEnv(spawnOptions.env, runtimeSettings),
|
|
98
|
-
...(launchEnv ?? {}),
|
|
99
|
-
},
|
|
215
|
+
env: spawnEnv,
|
|
100
216
|
signal: spawnOptions.signal,
|
|
101
217
|
stdio: ["pipe", "pipe", "pipe"],
|
|
102
218
|
// Bypass cmd.exe on Windows: the SDK passes --mcp-config with inline JSON
|
|
@@ -109,6 +225,18 @@ function applyRuntimeSettingsToClaudeOptions(options, runtimeSettings, launchEnv
|
|
|
109
225
|
options.stderr?.(chunk.toString());
|
|
110
226
|
});
|
|
111
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
|
+
});
|
|
112
240
|
return child;
|
|
113
241
|
},
|
|
114
242
|
};
|
|
@@ -818,7 +946,6 @@ export class ClaudeAgentClient {
|
|
|
818
946
|
}
|
|
819
947
|
async getDiagnostic() {
|
|
820
948
|
try {
|
|
821
|
-
const resolvedBinary = (await findExecutable("claude")) ?? "not found";
|
|
822
949
|
const available = await this.isAvailable();
|
|
823
950
|
const version = await resolveClaudeVersion(this.runtimeSettings);
|
|
824
951
|
let modelsValue = "Not checked";
|
|
@@ -838,7 +965,7 @@ export class ClaudeAgentClient {
|
|
|
838
965
|
}
|
|
839
966
|
return {
|
|
840
967
|
diagnostic: formatProviderDiagnostic("Claude Code", [
|
|
841
|
-
{ label: "Binary", value:
|
|
968
|
+
{ label: "Binary", value: "Built-in (SDK)" },
|
|
842
969
|
...(version ? [{ label: "Version", value: version }] : []),
|
|
843
970
|
{ label: "Models", value: modelsValue },
|
|
844
971
|
{ label: "Status", value: status },
|
|
@@ -869,16 +996,8 @@ async function resolveClaudeVersion(runtimeSettings) {
|
|
|
869
996
|
});
|
|
870
997
|
return stdout.trim() || null;
|
|
871
998
|
}
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
return null;
|
|
875
|
-
}
|
|
876
|
-
const { stdout } = await execFileAsync(executable, ["--version"], {
|
|
877
|
-
encoding: "utf8",
|
|
878
|
-
timeout: 5000,
|
|
879
|
-
windowsHide: true,
|
|
880
|
-
});
|
|
881
|
-
return stdout.trim() || null;
|
|
999
|
+
// Using SDK built-in CLI — version not directly queryable without running it
|
|
1000
|
+
return null;
|
|
882
1001
|
}
|
|
883
1002
|
catch {
|
|
884
1003
|
return null;
|
|
@@ -1694,20 +1813,25 @@ class ClaudeAgentSession {
|
|
|
1694
1813
|
]
|
|
1695
1814
|
.filter((entry) => typeof entry === "string" && entry.length > 0)
|
|
1696
1815
|
.join("\n\n");
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
}
|
|
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();
|
|
1709
1832
|
const base = {
|
|
1710
1833
|
cwd: this.config.cwd,
|
|
1834
|
+
...(cliExecutable ? { pathToClaudeCodeExecutable: cliExecutable } : {}),
|
|
1711
1835
|
includePartialMessages: true,
|
|
1712
1836
|
permissionMode: this.currentMode,
|
|
1713
1837
|
// Dynamic mode switching can recreate the underlying Claude query. Keep the
|
|
@@ -1716,7 +1840,6 @@ class ClaudeAgentSession {
|
|
|
1716
1840
|
allowDangerouslySkipPermissions: true,
|
|
1717
1841
|
agents: this.defaults?.agents,
|
|
1718
1842
|
canUseTool: this.handlePermissionRequest,
|
|
1719
|
-
...(claudeBinary ? { pathToClaudeCodeExecutable: claudeBinary } : {}),
|
|
1720
1843
|
// Use Claude Code preset system prompt and load CLAUDE.md files
|
|
1721
1844
|
// Append provider-agnostic system prompt and orchestrator instructions for agents.
|
|
1722
1845
|
systemPrompt: {
|
|
@@ -1725,12 +1848,18 @@ class ClaudeAgentSession {
|
|
|
1725
1848
|
append: appendedSystemPrompt,
|
|
1726
1849
|
},
|
|
1727
1850
|
settingSources: CLAUDE_SETTING_SOURCES,
|
|
1851
|
+
...(hasSeaworkSettings ? { settings: seaworkSettingsPath } : {}),
|
|
1728
1852
|
stderr: (data) => {
|
|
1729
1853
|
this.captureStderr(data);
|
|
1730
1854
|
this.logger.error({ stderr: data.trim() }, "Claude Agent SDK stderr");
|
|
1731
1855
|
},
|
|
1732
1856
|
env: {
|
|
1733
1857
|
...process.env,
|
|
1858
|
+
// Clear proxy env vars to prevent interference with gateway requests.
|
|
1859
|
+
http_proxy: "",
|
|
1860
|
+
https_proxy: "",
|
|
1861
|
+
HTTP_PROXY: "",
|
|
1862
|
+
HTTPS_PROXY: "",
|
|
1734
1863
|
// Increase MCP timeouts for long-running tool calls (10 minutes)
|
|
1735
1864
|
MCP_TIMEOUT: "600000",
|
|
1736
1865
|
MCP_TOOL_TIMEOUT: "600000",
|
|
@@ -1758,7 +1887,7 @@ class ClaudeAgentSession {
|
|
|
1758
1887
|
return this.applyRuntimeSettings(base);
|
|
1759
1888
|
}
|
|
1760
1889
|
applyRuntimeSettings(options) {
|
|
1761
|
-
return applyRuntimeSettingsToClaudeOptions(options, this.runtimeSettings, this.launchEnv);
|
|
1890
|
+
return applyRuntimeSettingsToClaudeOptions(options, this.runtimeSettings, this.launchEnv, this.logger);
|
|
1762
1891
|
}
|
|
1763
1892
|
normalizeMcpServers(servers) {
|
|
1764
1893
|
const result = {};
|