@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.
Files changed (221) 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 +8 -69
  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 +1 -1
  24. package/dist/server/server/agent/providers/claude/claude-models.d.ts.map +1 -1
  25. package/dist/server/server/agent/providers/claude/claude-models.js +4 -39
  26. package/dist/server/server/agent/providers/claude/claude-models.js.map +1 -1
  27. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +2 -2
  28. package/dist/server/server/agent/providers/claude-agent.d.ts +2 -1
  29. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  30. package/dist/server/server/agent/providers/claude-agent.js +175 -46
  31. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  32. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  33. package/dist/server/server/agent/providers/codex-app-server-agent.js +128 -72
  34. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  35. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -1
  36. package/dist/server/server/agent/providers/codex-rollout-timeline.js +76 -0
  37. package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -1
  38. package/dist/server/server/agent/providers/seawork-models.d.ts +4 -0
  39. package/dist/server/server/agent/providers/seawork-models.d.ts.map +1 -0
  40. package/dist/server/server/agent/providers/seawork-models.js +128 -0
  41. package/dist/server/server/agent/providers/seawork-models.js.map +1 -0
  42. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +16 -16
  43. package/dist/server/server/bootstrap.d.ts.map +1 -1
  44. package/dist/server/server/bootstrap.js +35 -1
  45. package/dist/server/server/bootstrap.js.map +1 -1
  46. package/dist/server/server/bug-report-handler.d.ts +9 -0
  47. package/dist/server/server/bug-report-handler.d.ts.map +1 -0
  48. package/dist/server/server/bug-report-handler.js +111 -0
  49. package/dist/server/server/bug-report-handler.js.map +1 -0
  50. package/dist/server/server/bug-report-redact.d.ts +12 -0
  51. package/dist/server/server/bug-report-redact.d.ts.map +1 -0
  52. package/dist/server/server/bug-report-redact.js +63 -0
  53. package/dist/server/server/bug-report-redact.js.map +1 -0
  54. package/dist/server/server/chat/chat-rpc-schemas.d.ts +26 -26
  55. package/dist/server/server/chat/chat-types.d.ts +2 -2
  56. package/dist/server/server/config.d.ts.map +1 -1
  57. package/dist/server/server/config.js +6 -1
  58. package/dist/server/server/config.js.map +1 -1
  59. package/dist/server/server/exports.d.ts +4 -2
  60. package/dist/server/server/exports.d.ts.map +1 -1
  61. package/dist/server/server/exports.js +3 -0
  62. package/dist/server/server/exports.js.map +1 -1
  63. package/dist/server/server/index.js +54 -0
  64. package/dist/server/server/index.js.map +1 -1
  65. package/dist/server/server/loop/rpc-schemas.d.ts +775 -775
  66. package/dist/server/server/loop-service.d.ts +108 -108
  67. package/dist/server/server/persisted-config.d.ts +121 -121
  68. package/dist/server/server/pid-lock.d.ts.map +1 -1
  69. package/dist/server/server/pid-lock.js +35 -2
  70. package/dist/server/server/pid-lock.js.map +1 -1
  71. package/dist/server/server/sac/auth.d.ts +41 -0
  72. package/dist/server/server/sac/auth.d.ts.map +1 -0
  73. package/dist/server/server/sac/auth.js +103 -0
  74. package/dist/server/server/sac/auth.js.map +1 -0
  75. package/dist/server/server/sac/client.d.ts +15 -0
  76. package/dist/server/server/sac/client.d.ts.map +1 -0
  77. package/dist/server/server/sac/client.js +70 -0
  78. package/dist/server/server/sac/client.js.map +1 -0
  79. package/dist/server/server/sac/download.d.ts +10 -0
  80. package/dist/server/server/sac/download.d.ts.map +1 -0
  81. package/dist/server/server/sac/download.js +67 -0
  82. package/dist/server/server/sac/download.js.map +1 -0
  83. package/dist/server/server/sac/endpoints.d.ts +13 -0
  84. package/dist/server/server/sac/endpoints.d.ts.map +1 -0
  85. package/dist/server/server/sac/endpoints.js +16 -0
  86. package/dist/server/server/sac/endpoints.js.map +1 -0
  87. package/dist/server/server/sac/errors.d.ts +40 -0
  88. package/dist/server/server/sac/errors.d.ts.map +1 -0
  89. package/dist/server/server/sac/errors.js +47 -0
  90. package/dist/server/server/sac/errors.js.map +1 -0
  91. package/dist/server/server/sac/generate.d.ts +43 -0
  92. package/dist/server/server/sac/generate.d.ts.map +1 -0
  93. package/dist/server/server/sac/generate.js +206 -0
  94. package/dist/server/server/sac/generate.js.map +1 -0
  95. package/dist/server/server/sac/index.d.ts +22 -0
  96. package/dist/server/server/sac/index.d.ts.map +1 -0
  97. package/dist/server/server/sac/index.js +14 -0
  98. package/dist/server/server/sac/index.js.map +1 -0
  99. package/dist/server/server/sac/output.d.ts +22 -0
  100. package/dist/server/server/sac/output.d.ts.map +1 -0
  101. package/dist/server/server/sac/output.js +142 -0
  102. package/dist/server/server/sac/output.js.map +1 -0
  103. package/dist/server/server/sac/poll.d.ts +12 -0
  104. package/dist/server/server/sac/poll.d.ts.map +1 -0
  105. package/dist/server/server/sac/poll.js +67 -0
  106. package/dist/server/server/sac/poll.js.map +1 -0
  107. package/dist/server/server/sac/providers/alibaba.d.ts +2 -0
  108. package/dist/server/server/sac/providers/alibaba.d.ts.map +1 -0
  109. package/dist/server/server/sac/providers/alibaba.js +506 -0
  110. package/dist/server/server/sac/providers/alibaba.js.map +1 -0
  111. package/dist/server/server/sac/providers/audio.d.ts +2 -0
  112. package/dist/server/server/sac/providers/audio.d.ts.map +1 -0
  113. package/dist/server/server/sac/providers/audio.js +57 -0
  114. package/dist/server/server/sac/providers/audio.js.map +1 -0
  115. package/dist/server/server/sac/providers/index.d.ts +19 -0
  116. package/dist/server/server/sac/providers/index.d.ts.map +1 -0
  117. package/dist/server/server/sac/providers/index.js +32 -0
  118. package/dist/server/server/sac/providers/index.js.map +1 -0
  119. package/dist/server/server/sac/providers/kling.d.ts +2 -0
  120. package/dist/server/server/sac/providers/kling.d.ts.map +1 -0
  121. package/dist/server/server/sac/providers/kling.js +589 -0
  122. package/dist/server/server/sac/providers/kling.js.map +1 -0
  123. package/dist/server/server/sac/providers/nano.d.ts +2 -0
  124. package/dist/server/server/sac/providers/nano.d.ts.map +1 -0
  125. package/dist/server/server/sac/providers/nano.js +37 -0
  126. package/dist/server/server/sac/providers/nano.js.map +1 -0
  127. package/dist/server/server/sac/providers/pixverse.d.ts +2 -0
  128. package/dist/server/server/sac/providers/pixverse.d.ts.map +1 -0
  129. package/dist/server/server/sac/providers/pixverse.js +1017 -0
  130. package/dist/server/server/sac/providers/pixverse.js.map +1 -0
  131. package/dist/server/server/sac/providers/registry.d.ts +34 -0
  132. package/dist/server/server/sac/providers/registry.d.ts.map +1 -0
  133. package/dist/server/server/sac/providers/registry.js +57 -0
  134. package/dist/server/server/sac/providers/registry.js.map +1 -0
  135. package/dist/server/server/sac/providers/seaart.d.ts +4 -0
  136. package/dist/server/server/sac/providers/seaart.d.ts.map +1 -0
  137. package/dist/server/server/sac/providers/seaart.js +57 -0
  138. package/dist/server/server/sac/providers/seaart.js.map +1 -0
  139. package/dist/server/server/sac/providers/store.d.ts +12 -0
  140. package/dist/server/server/sac/providers/store.d.ts.map +1 -0
  141. package/dist/server/server/sac/providers/store.js +7 -0
  142. package/dist/server/server/sac/providers/store.js.map +1 -0
  143. package/dist/server/server/sac/providers/tencent-3d.d.ts +2 -0
  144. package/dist/server/server/sac/providers/tencent-3d.d.ts.map +1 -0
  145. package/dist/server/server/sac/providers/tencent-3d.js +210 -0
  146. package/dist/server/server/sac/providers/tencent-3d.js.map +1 -0
  147. package/dist/server/server/sac/providers/tencent-image.d.ts +2 -0
  148. package/dist/server/server/sac/providers/tencent-image.d.ts.map +1 -0
  149. package/dist/server/server/sac/providers/tencent-image.js +90 -0
  150. package/dist/server/server/sac/providers/tencent-image.js.map +1 -0
  151. package/dist/server/server/sac/providers/tencent-video.d.ts +2 -0
  152. package/dist/server/server/sac/providers/tencent-video.d.ts.map +1 -0
  153. package/dist/server/server/sac/providers/tencent-video.js +103 -0
  154. package/dist/server/server/sac/providers/tencent-video.js.map +1 -0
  155. package/dist/server/server/sac/providers/tripo3d.d.ts +2 -0
  156. package/dist/server/server/sac/providers/tripo3d.d.ts.map +1 -0
  157. package/dist/server/server/sac/providers/tripo3d.js +302 -0
  158. package/dist/server/server/sac/providers/tripo3d.js.map +1 -0
  159. package/dist/server/server/sac/providers/vidu.d.ts +2 -0
  160. package/dist/server/server/sac/providers/vidu.d.ts.map +1 -0
  161. package/dist/server/server/sac/providers/vidu.js +965 -0
  162. package/dist/server/server/sac/providers/vidu.js.map +1 -0
  163. package/dist/server/server/sac/providers/volces-3d.d.ts +2 -0
  164. package/dist/server/server/sac/providers/volces-3d.d.ts.map +1 -0
  165. package/dist/server/server/sac/providers/volces-3d.js +77 -0
  166. package/dist/server/server/sac/providers/volces-3d.js.map +1 -0
  167. package/dist/server/server/sac/providers/volces-video.d.ts +2 -0
  168. package/dist/server/server/sac/providers/volces-video.d.ts.map +1 -0
  169. package/dist/server/server/sac/providers/volces-video.js +392 -0
  170. package/dist/server/server/sac/providers/volces-video.js.map +1 -0
  171. package/dist/server/server/sac/providers/volces.d.ts +2 -0
  172. package/dist/server/server/sac/providers/volces.d.ts.map +1 -0
  173. package/dist/server/server/sac/providers/volces.js +301 -0
  174. package/dist/server/server/sac/providers/volces.js.map +1 -0
  175. package/dist/server/server/sac/types.d.ts +59 -0
  176. package/dist/server/server/sac/types.d.ts.map +1 -0
  177. package/dist/server/server/sac/types.js +5 -0
  178. package/dist/server/server/sac/types.js.map +1 -0
  179. package/dist/server/server/schedule/rpc-schemas.d.ts +493 -493
  180. package/dist/server/server/schedule/types.d.ts +140 -140
  181. package/dist/server/server/session.d.ts +9 -2
  182. package/dist/server/server/session.d.ts.map +1 -1
  183. package/dist/server/server/session.js +137 -19
  184. package/dist/server/server/session.js.map +1 -1
  185. package/dist/server/server/speech/speech-types.d.ts +2 -2
  186. package/dist/server/server/workspace-registry.d.ts +4 -4
  187. package/dist/server/shared/messages.d.ts +17455 -15917
  188. package/dist/server/shared/messages.d.ts.map +1 -1
  189. package/dist/server/shared/messages.js +83 -0
  190. package/dist/server/shared/messages.js.map +1 -1
  191. package/dist/server/utils/spawn.d.ts.map +1 -1
  192. package/dist/server/utils/spawn.js +8 -3
  193. package/dist/server/utils/spawn.js.map +1 -1
  194. package/dist/server/utils/worktree-metadata.d.ts +4 -4
  195. package/dist/src/server/pid-lock.js +35 -2
  196. package/dist/src/server/pid-lock.js.map +1 -1
  197. package/package.json +14 -9
  198. package/dist/server/server/agent/providers/acp-agent.d.ts +0 -202
  199. package/dist/server/server/agent/providers/acp-agent.d.ts.map +0 -1
  200. package/dist/server/server/agent/providers/acp-agent.js +0 -1650
  201. package/dist/server/server/agent/providers/acp-agent.js.map +0 -1
  202. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +0 -16
  203. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +0 -1
  204. package/dist/server/server/agent/providers/copilot-acp-agent.js +0 -95
  205. package/dist/server/server/agent/providers/copilot-acp-agent.js.map +0 -1
  206. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +0 -3
  207. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts.map +0 -1
  208. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +0 -39
  209. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js.map +0 -1
  210. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +0 -13
  211. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +0 -1
  212. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +0 -144
  213. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js.map +0 -1
  214. package/dist/server/server/agent/providers/opencode-agent.d.ts +0 -121
  215. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +0 -1
  216. package/dist/server/server/agent/providers/opencode-agent.js +0 -1649
  217. package/dist/server/server/agent/providers/opencode-agent.js.map +0 -1
  218. package/dist/server/server/agent/providers/pi-acp-agent.d.ts +0 -28
  219. package/dist/server/server/agent/providers/pi-acp-agent.d.ts.map +0 -1
  220. package/dist/server/server/agent/providers/pi-acp-agent.js +0 -302
  221. 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 { 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 { 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
- 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
+ }
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: resolvedBinary },
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
- const executable = await findExecutable("claude");
873
- if (!executable) {
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
- const claudeBinary = await findExecutable("claude");
1698
- this.logger.debug({
1699
- claudeBinary,
1700
- pathEnvKey: process.env["Path"] !== undefined
1701
- ? "Path"
1702
- : process.env["PATH"] !== undefined
1703
- ? "PATH"
1704
- : null,
1705
- pathIncludesClaudeLocalBin: (process.env["Path"] ?? process.env["PATH"] ?? "")
1706
- .toLowerCase()
1707
- .includes("\\.local\\bin"),
1708
- }, "Resolved Claude executable");
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 = {};