@seawork/server 1.0.7 → 1.0.10-rc.5

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.
Files changed (178) hide show
  1. package/dist/server/client/daemon-client.d.ts +32 -1
  2. package/dist/server/client/daemon-client.d.ts.map +1 -1
  3. package/dist/server/client/daemon-client.js +69 -0
  4. package/dist/server/client/daemon-client.js.map +1 -1
  5. package/dist/server/server/agent/agent-management-mcp.d.ts.map +1 -1
  6. package/dist/server/server/agent/agent-management-mcp.js +6 -5
  7. package/dist/server/server/agent/agent-management-mcp.js.map +1 -1
  8. package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -1
  9. package/dist/server/server/agent/agent-response-loop.js +0 -1
  10. package/dist/server/server/agent/agent-response-loop.js.map +1 -1
  11. package/dist/server/server/agent/agent-storage.d.ts +68 -68
  12. package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
  13. package/dist/server/server/agent/mcp-server.js +6 -5
  14. package/dist/server/server/agent/mcp-server.js.map +1 -1
  15. package/dist/server/server/agent/mcp-shared.d.ts +30 -30
  16. package/dist/server/server/agent/provider-manifest.d.ts +2 -1
  17. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
  18. package/dist/server/server/agent/provider-manifest.js +3 -64
  19. package/dist/server/server/agent/provider-manifest.js.map +1 -1
  20. package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
  21. package/dist/server/server/agent/provider-registry.js +2 -10
  22. package/dist/server/server/agent/provider-registry.js.map +1 -1
  23. package/dist/server/server/agent/providers/claude/claude-models.d.ts.map +1 -1
  24. package/dist/server/server/agent/providers/claude/claude-models.js +3 -0
  25. package/dist/server/server/agent/providers/claude/claude-models.js.map +1 -1
  26. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +2 -2
  27. package/dist/server/server/agent/providers/claude-agent.d.ts +2 -1
  28. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  29. package/dist/server/server/agent/providers/claude-agent.js +167 -22
  30. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  31. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  32. package/dist/server/server/agent/providers/codex-app-server-agent.js +106 -3
  33. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  34. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -1
  35. package/dist/server/server/agent/providers/codex-rollout-timeline.js +76 -0
  36. package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -1
  37. package/dist/server/server/agent/providers/seawork-models.d.ts.map +1 -1
  38. package/dist/server/server/agent/providers/seawork-models.js +9 -0
  39. package/dist/server/server/agent/providers/seawork-models.js.map +1 -1
  40. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +16 -16
  41. package/dist/server/server/bug-report-handler.d.ts +9 -0
  42. package/dist/server/server/bug-report-handler.d.ts.map +1 -0
  43. package/dist/server/server/bug-report-handler.js +111 -0
  44. package/dist/server/server/bug-report-handler.js.map +1 -0
  45. package/dist/server/server/bug-report-redact.d.ts +12 -0
  46. package/dist/server/server/bug-report-redact.d.ts.map +1 -0
  47. package/dist/server/server/bug-report-redact.js +63 -0
  48. package/dist/server/server/bug-report-redact.js.map +1 -0
  49. package/dist/server/server/chat/chat-rpc-schemas.d.ts +26 -26
  50. package/dist/server/server/chat/chat-types.d.ts +2 -2
  51. package/dist/server/server/exports.d.ts +4 -2
  52. package/dist/server/server/exports.d.ts.map +1 -1
  53. package/dist/server/server/exports.js +3 -0
  54. package/dist/server/server/exports.js.map +1 -1
  55. package/dist/server/server/index.js +47 -0
  56. package/dist/server/server/index.js.map +1 -1
  57. package/dist/server/server/loop/rpc-schemas.d.ts +775 -775
  58. package/dist/server/server/loop-service.d.ts +108 -108
  59. package/dist/server/server/persisted-config.d.ts +121 -121
  60. package/dist/server/server/sac/errors.d.ts +1 -0
  61. package/dist/server/server/sac/errors.d.ts.map +1 -1
  62. package/dist/server/server/sac/errors.js +2 -1
  63. package/dist/server/server/sac/errors.js.map +1 -1
  64. package/dist/server/server/sac/generate.d.ts +19 -11
  65. package/dist/server/server/sac/generate.d.ts.map +1 -1
  66. package/dist/server/server/sac/generate.js +131 -36
  67. package/dist/server/server/sac/generate.js.map +1 -1
  68. package/dist/server/server/sac/index.d.ts +8 -10
  69. package/dist/server/server/sac/index.d.ts.map +1 -1
  70. package/dist/server/server/sac/index.js +5 -17
  71. package/dist/server/server/sac/index.js.map +1 -1
  72. package/dist/server/server/sac/providers/alibaba.d.ts +2 -0
  73. package/dist/server/server/sac/providers/alibaba.d.ts.map +1 -0
  74. package/dist/server/server/sac/providers/alibaba.js +506 -0
  75. package/dist/server/server/sac/providers/alibaba.js.map +1 -0
  76. package/dist/server/server/sac/providers/audio.d.ts +2 -0
  77. package/dist/server/server/sac/providers/audio.d.ts.map +1 -0
  78. package/dist/server/server/sac/providers/audio.js +57 -0
  79. package/dist/server/server/sac/providers/audio.js.map +1 -0
  80. package/dist/server/server/sac/providers/kling.d.ts +2 -0
  81. package/dist/server/server/sac/providers/kling.d.ts.map +1 -0
  82. package/dist/server/server/sac/providers/kling.js +589 -0
  83. package/dist/server/server/sac/providers/kling.js.map +1 -0
  84. package/dist/server/server/sac/providers/nano.d.ts +2 -0
  85. package/dist/server/server/sac/providers/nano.d.ts.map +1 -0
  86. package/dist/server/server/sac/providers/nano.js +37 -0
  87. package/dist/server/server/sac/providers/nano.js.map +1 -0
  88. package/dist/server/server/sac/providers/pixverse.d.ts +2 -0
  89. package/dist/server/server/sac/providers/pixverse.d.ts.map +1 -0
  90. package/dist/server/server/sac/providers/pixverse.js +1017 -0
  91. package/dist/server/server/sac/providers/pixverse.js.map +1 -0
  92. package/dist/server/server/sac/providers/registry.d.ts +34 -0
  93. package/dist/server/server/sac/providers/registry.d.ts.map +1 -0
  94. package/dist/server/server/sac/providers/registry.js +57 -0
  95. package/dist/server/server/sac/providers/registry.js.map +1 -0
  96. package/dist/server/server/sac/providers/seaart.d.ts +1 -4
  97. package/dist/server/server/sac/providers/seaart.d.ts.map +1 -1
  98. package/dist/server/server/sac/providers/seaart.js +8 -18
  99. package/dist/server/server/sac/providers/seaart.js.map +1 -1
  100. package/dist/server/server/sac/providers/store.d.ts +9 -5
  101. package/dist/server/server/sac/providers/store.d.ts.map +1 -1
  102. package/dist/server/server/sac/providers/store.js +0 -3
  103. package/dist/server/server/sac/providers/store.js.map +1 -1
  104. package/dist/server/server/sac/providers/tencent-3d.d.ts +2 -0
  105. package/dist/server/server/sac/providers/tencent-3d.d.ts.map +1 -0
  106. package/dist/server/server/sac/providers/tencent-3d.js +210 -0
  107. package/dist/server/server/sac/providers/tencent-3d.js.map +1 -0
  108. package/dist/server/server/sac/providers/tencent-image.d.ts +2 -0
  109. package/dist/server/server/sac/providers/tencent-image.d.ts.map +1 -0
  110. package/dist/server/server/sac/providers/tencent-image.js +90 -0
  111. package/dist/server/server/sac/providers/tencent-image.js.map +1 -0
  112. package/dist/server/server/sac/providers/tencent-video.d.ts +2 -0
  113. package/dist/server/server/sac/providers/tencent-video.d.ts.map +1 -0
  114. package/dist/server/server/sac/providers/tencent-video.js +103 -0
  115. package/dist/server/server/sac/providers/tencent-video.js.map +1 -0
  116. package/dist/server/server/sac/providers/tripo3d.d.ts +2 -0
  117. package/dist/server/server/sac/providers/tripo3d.d.ts.map +1 -0
  118. package/dist/server/server/sac/providers/tripo3d.js +302 -0
  119. package/dist/server/server/sac/providers/tripo3d.js.map +1 -0
  120. package/dist/server/server/sac/providers/vidu.d.ts +2 -0
  121. package/dist/server/server/sac/providers/vidu.d.ts.map +1 -0
  122. package/dist/server/server/sac/providers/vidu.js +965 -0
  123. package/dist/server/server/sac/providers/vidu.js.map +1 -0
  124. package/dist/server/server/sac/providers/volces-3d.d.ts +2 -0
  125. package/dist/server/server/sac/providers/volces-3d.d.ts.map +1 -0
  126. package/dist/server/server/sac/providers/volces-3d.js +77 -0
  127. package/dist/server/server/sac/providers/volces-3d.js.map +1 -0
  128. package/dist/server/server/sac/providers/volces-video.d.ts +2 -0
  129. package/dist/server/server/sac/providers/volces-video.d.ts.map +1 -0
  130. package/dist/server/server/sac/providers/volces-video.js +392 -0
  131. package/dist/server/server/sac/providers/volces-video.js.map +1 -0
  132. package/dist/server/server/sac/providers/volces.d.ts +1 -4
  133. package/dist/server/server/sac/providers/volces.d.ts.map +1 -1
  134. package/dist/server/server/sac/providers/volces.js +279 -66
  135. package/dist/server/server/sac/providers/volces.js.map +1 -1
  136. package/dist/server/server/sac/types.d.ts +13 -30
  137. package/dist/server/server/sac/types.d.ts.map +1 -1
  138. package/dist/server/server/schedule/rpc-schemas.d.ts +493 -493
  139. package/dist/server/server/schedule/types.d.ts +140 -140
  140. package/dist/server/server/session.d.ts +9 -2
  141. package/dist/server/server/session.d.ts.map +1 -1
  142. package/dist/server/server/session.js +137 -19
  143. package/dist/server/server/session.js.map +1 -1
  144. package/dist/server/server/speech/speech-types.d.ts +2 -2
  145. package/dist/server/server/workspace-registry.d.ts +4 -4
  146. package/dist/server/shared/messages.d.ts +17455 -15917
  147. package/dist/server/shared/messages.d.ts.map +1 -1
  148. package/dist/server/shared/messages.js +83 -0
  149. package/dist/server/shared/messages.js.map +1 -1
  150. package/dist/server/utils/spawn.d.ts.map +1 -1
  151. package/dist/server/utils/spawn.js +8 -3
  152. package/dist/server/utils/spawn.js.map +1 -1
  153. package/dist/server/utils/worktree-metadata.d.ts +4 -4
  154. package/package.json +7 -9
  155. package/dist/server/server/agent/providers/acp-agent.d.ts +0 -202
  156. package/dist/server/server/agent/providers/acp-agent.d.ts.map +0 -1
  157. package/dist/server/server/agent/providers/acp-agent.js +0 -1650
  158. package/dist/server/server/agent/providers/acp-agent.js.map +0 -1
  159. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +0 -16
  160. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +0 -1
  161. package/dist/server/server/agent/providers/copilot-acp-agent.js +0 -95
  162. package/dist/server/server/agent/providers/copilot-acp-agent.js.map +0 -1
  163. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +0 -3
  164. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts.map +0 -1
  165. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +0 -39
  166. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js.map +0 -1
  167. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +0 -13
  168. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +0 -1
  169. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +0 -144
  170. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js.map +0 -1
  171. package/dist/server/server/agent/providers/opencode-agent.d.ts +0 -121
  172. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +0 -1
  173. package/dist/server/server/agent/providers/opencode-agent.js +0 -1649
  174. package/dist/server/server/agent/providers/opencode-agent.js.map +0 -1
  175. package/dist/server/server/agent/providers/pi-acp-agent.d.ts +0 -28
  176. package/dist/server/server/agent/providers/pi-acp-agent.d.ts.map +0 -1
  177. package/dist/server/server/agent/providers/pi-acp-agent.js +0 -302
  178. 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 { promises } from "node:fs";
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 { mapClaudeCanceledToolCall, mapClaudeCompletedToolCall, mapClaudeFailedToolCall, mapClaudeRunningToolCall, } from "./claude/tool-call-mapper.js";
10
- import { mapTaskNotificationSystemRecordToToolCall, mapTaskNotificationUserContentToToolCall, } from "./claude/task-notification-tool-call.js";
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
- const command = isDefaultRuntime ? process.execPath : resolved.command;
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 = {};