@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
@@ -10,6 +10,7 @@ import { loadCodexPersistedTimeline } from "./codex-rollout-timeline.js";
10
10
  import { mapCodexRolloutToolCall, mapCodexToolCallFromThreadItem, } from "./codex/tool-call-mapper.js";
11
11
  import { applyProviderEnv, resolveProviderCommandPrefix, } from "../provider-launch-config.js";
12
12
  import { findExecutable } from "../../../utils/executable.js";
13
+ import { getSeaworkModels } from "./seawork-models.js";
13
14
  import { spawnProcess } from "../../../utils/spawn.js";
14
15
  import { extractCodexTerminalSessionId, nonEmptyString } from "./tool-call-mapper-utils.js";
15
16
  import { buildCodexFeatures, codexModelSupportsFastMode } from "./codex-feature-definitions.js";
@@ -81,9 +82,6 @@ function normalizeCodexModelId(modelId) {
81
82
  }
82
83
  return normalized;
83
84
  }
84
- function normalizeCodexModelLabel(displayName) {
85
- return displayName.replace(/\bgpt\b/gi, "GPT");
86
- }
87
85
  function isSchemaRecord(value) {
88
86
  return typeof value === "object" && value !== null && !Array.isArray(value);
89
87
  }
@@ -864,6 +862,8 @@ function normalizeCodexThreadItemType(rawType) {
864
862
  return "mcpToolCall";
865
863
  case "WebSearch":
866
864
  return "webSearch";
865
+ case "ImageGeneration":
866
+ return "imageGeneration";
867
867
  default:
868
868
  return rawType;
869
869
  }
@@ -1123,6 +1123,46 @@ function mapCodexTerminalInteractionToToolCall(params) {
1123
1123
  ...(processId ? { metadata: { processId } } : {}),
1124
1124
  };
1125
1125
  }
1126
+ function normalizeCodexGeneratedImageSource(item) {
1127
+ const savedPath = nonEmptyString(item.savedPath) ??
1128
+ nonEmptyString(item.saved_path) ??
1129
+ nonEmptyString(item.path) ??
1130
+ null;
1131
+ if (savedPath) {
1132
+ return savedPath;
1133
+ }
1134
+ const result = nonEmptyString(item.result);
1135
+ if (!result) {
1136
+ return null;
1137
+ }
1138
+ return result.startsWith("data:") ? result : `data:image/png;base64,${result}`;
1139
+ }
1140
+ function markdownImageSource(source) {
1141
+ if (/^(https?:|data:|blob:)/i.test(source)) {
1142
+ return source;
1143
+ }
1144
+ return `<${source.replace(/>/g, "%3E")}>`;
1145
+ }
1146
+ function mapCodexImageGenerationToTimeline(item) {
1147
+ const source = normalizeCodexGeneratedImageSource(item);
1148
+ if (!source) {
1149
+ return null;
1150
+ }
1151
+ return {
1152
+ type: "assistant_message",
1153
+ text: `![Generated image](${markdownImageSource(source)})`,
1154
+ };
1155
+ }
1156
+ function rawResponseItemToThreadItem(item) {
1157
+ if (item.type !== "image_generation_call") {
1158
+ return null;
1159
+ }
1160
+ return {
1161
+ ...item,
1162
+ type: "imageGeneration",
1163
+ revisedPrompt: item.revised_prompt ?? item.revisedPrompt ?? null,
1164
+ };
1165
+ }
1126
1166
  function threadItemToTimeline(item, options) {
1127
1167
  if (!item || typeof item !== "object")
1128
1168
  return null;
@@ -1165,6 +1205,8 @@ function threadItemToTimeline(item, options) {
1165
1205
  case "mcpToolCall":
1166
1206
  case "webSearch":
1167
1207
  return mapCodexToolCallFromThreadItem(normalizedItem, { cwd });
1208
+ case "imageGeneration":
1209
+ return mapCodexImageGenerationToTimeline(normalizedItem);
1168
1210
  default:
1169
1211
  return null;
1170
1212
  }
@@ -1270,6 +1312,16 @@ const ItemLifecycleNotificationSchema = z
1270
1312
  .passthrough(),
1271
1313
  })
1272
1314
  .passthrough();
1315
+ const RawResponseItemCompletedNotificationSchema = z
1316
+ .object({
1317
+ item: z
1318
+ .object({
1319
+ id: z.string().optional(),
1320
+ type: z.string().optional(),
1321
+ })
1322
+ .passthrough(),
1323
+ })
1324
+ .passthrough();
1273
1325
  const CodexEventTurnAbortedNotificationSchema = z
1274
1326
  .object({
1275
1327
  msg: z
@@ -1521,6 +1573,20 @@ const CodexNotificationSchema = z.union([
1521
1573
  method,
1522
1574
  params,
1523
1575
  })),
1576
+ z
1577
+ .object({
1578
+ method: z.literal("rawResponseItem/completed"),
1579
+ params: RawResponseItemCompletedNotificationSchema,
1580
+ })
1581
+ .transform(({ params }) => ({
1582
+ kind: "raw_response_item_completed",
1583
+ item: params.item,
1584
+ })),
1585
+ z.object({ method: z.literal("rawResponseItem/completed"), params: z.unknown() }).transform(({ method, params }) => ({
1586
+ kind: "invalid_payload",
1587
+ method,
1588
+ params,
1589
+ })),
1524
1590
  z
1525
1591
  .object({ method: z.literal("item/started"), params: ItemLifecycleNotificationSchema })
1526
1592
  .transform(({ params }) => ({
@@ -1838,6 +1904,11 @@ export async function codexAppServerTurnInputFromPrompt(prompt, logger) {
1838
1904
  }
1839
1905
  function buildCodexAppServerEnv(runtimeSettings, launchEnv) {
1840
1906
  const env = applyProviderEnv(process.env, runtimeSettings);
1907
+ // Clear proxy env vars to prevent interference with gateway requests
1908
+ env.http_proxy = "";
1909
+ env.https_proxy = "";
1910
+ env.HTTP_PROXY = "";
1911
+ env.HTTPS_PROXY = "";
1841
1912
  if (!launchEnv) {
1842
1913
  return env;
1843
1914
  }
@@ -2370,13 +2441,17 @@ class CodexAppServerAgentSession {
2370
2441
  }
2371
2442
  const turnId = this.createTurnId();
2372
2443
  this.activeForegroundTurnId = turnId;
2444
+ const turnStartT0 = Date.now();
2445
+ this.logger.info({ turnId }, "[timing] codex turn/start request sending");
2373
2446
  try {
2374
2447
  await this.client.request("turn/start", params, TURN_START_TIMEOUT_MS);
2375
2448
  }
2376
2449
  catch (error) {
2450
+ this.logger.info({ turnId, elapsedMs: Date.now() - turnStartT0 }, "[timing] codex turn/start FAILED");
2377
2451
  this.activeForegroundTurnId = null;
2378
2452
  throw error;
2379
2453
  }
2454
+ this.logger.info({ turnId, elapsedMs: Date.now() - turnStartT0 }, "[timing] codex turn/start acknowledged");
2380
2455
  return { turnId };
2381
2456
  }
2382
2457
  subscribe(callback) {
@@ -2944,6 +3019,27 @@ class CodexAppServerAgentSession {
2944
3019
  }
2945
3020
  return;
2946
3021
  }
3022
+ if (parsed.kind === "raw_response_item_completed") {
3023
+ const threadItem = rawResponseItemToThreadItem(parsed.item);
3024
+ if (!threadItem) {
3025
+ return;
3026
+ }
3027
+ const itemId = threadItem.id;
3028
+ if (itemId && this.emittedItemCompletedIds.has(itemId)) {
3029
+ return;
3030
+ }
3031
+ const timelineItem = threadItemToTimeline(threadItem, {
3032
+ includeUserMessage: false,
3033
+ cwd: this.config.cwd ?? null,
3034
+ });
3035
+ if (timelineItem) {
3036
+ this.emitEvent({ type: "timeline", provider: CODEX_PROVIDER, item: timelineItem });
3037
+ if (itemId) {
3038
+ this.emittedItemCompletedIds.add(itemId);
3039
+ }
3040
+ }
3041
+ return;
3042
+ }
2947
3043
  if (parsed.kind === "item_completed") {
2948
3044
  // Codex emits mirrored lifecycle notifications via both `codex/event/item_*`
2949
3045
  // and canonical `item/*`. We render only the canonical channel to avoid
@@ -3251,10 +3347,34 @@ export class CodexAppServerAgentClient {
3251
3347
  this.logger.trace({
3252
3348
  launchPrefix,
3253
3349
  }, "Spawning Codex app server");
3254
- return spawnProcess(launchPrefix.command, [...launchPrefix.args, "app-server"], {
3350
+ const codexEnv = buildCodexAppServerEnv(this.runtimeSettings, launchEnv);
3351
+ this.logger.info({
3352
+ hasOpenaiKey: !!codexEnv.OPENAI_API_KEY,
3353
+ openaiKeyPrefix: codexEnv.OPENAI_API_KEY?.slice(0, 10) ?? null,
3354
+ openaiBaseUrl: codexEnv.OPENAI_BASE_URL ?? null,
3355
+ }, "Codex app-server env check");
3356
+ // If a Seawork-managed base URL is available, inject a "seawork" provider
3357
+ // via -c flags to override any user config.
3358
+ const extraArgs = [];
3359
+ const seaworkBaseUrl = codexEnv.OPENAI_BASE_URL;
3360
+ if (seaworkBaseUrl) {
3361
+ extraArgs.push("-c", `model_provider="seawork"`, "-c", `model_providers.seawork.name="Seawork"`, "-c", `model_providers.seawork.base_url="${seaworkBaseUrl}/v1"`, "-c", `model_providers.seawork.env_key="SEAWORK_API_KEY"`, "--disable", "js_repl");
3362
+ codexEnv.SEAWORK_API_KEY = codexEnv.OPENAI_API_KEY ?? "";
3363
+ }
3364
+ const fullArgs = [...launchPrefix.args, "app-server", ...extraArgs];
3365
+ this.logger.debug({
3366
+ command: launchPrefix.command,
3367
+ args: fullArgs,
3368
+ hasOpenaiKey: !!codexEnv.OPENAI_API_KEY,
3369
+ openaiKeyPrefix: codexEnv.OPENAI_API_KEY?.slice(0, 10) ?? null,
3370
+ openaiBaseUrl: codexEnv.OPENAI_BASE_URL ?? null,
3371
+ hasSeaworkKey: !!codexEnv.SEAWORK_API_KEY,
3372
+ launchEnvKeys: Object.keys(launchEnv ?? {}),
3373
+ }, "codex_spawn");
3374
+ return spawnProcess(launchPrefix.command, fullArgs, {
3255
3375
  detached: process.platform !== "win32",
3256
3376
  stdio: ["pipe", "pipe", "pipe"],
3257
- env: buildCodexAppServerEnv(this.runtimeSettings, launchEnv),
3377
+ env: codexEnv,
3258
3378
  });
3259
3379
  }
3260
3380
  async createSession(config, launchContext) {
@@ -3270,6 +3390,7 @@ export class CodexAppServerAgentClient {
3270
3390
  ...overrides,
3271
3391
  provider: CODEX_PROVIDER,
3272
3392
  cwd: overrides?.cwd ?? storedConfig.cwd ?? process.cwd(),
3393
+ modeId: overrides?.modeId ?? storedConfig.modeId ?? "auto",
3273
3394
  };
3274
3395
  const session = new CodexAppServerAgentSession(merged, handle, this.logger, () => this.spawnAppServer(launchContext?.env));
3275
3396
  await session.connect();
@@ -3337,79 +3458,14 @@ export class CodexAppServerAgentClient {
3337
3458
  }
3338
3459
  }
3339
3460
  async listModels(_options) {
3340
- const child = await this.spawnAppServer();
3341
- const client = new CodexAppServerClient(child, this.logger);
3342
- try {
3343
- await client.request("initialize", buildCodexAppServerInitializeParams());
3344
- client.notify("initialized", {});
3345
- const response = (await client.request("model/list", {}));
3346
- const models = Array.isArray(response?.data) ? response.data : [];
3347
- const configuredDefaults = await readCodexConfiguredDefaults(client, this.logger);
3348
- const configuredDefaultModelId = configuredDefaults.model;
3349
- const configuredDefaultThinkingOptionId = configuredDefaults.thinkingOptionId;
3350
- const hasConfiguredDefaultModel = typeof configuredDefaultModelId === "string"
3351
- ? models.some((model) => model?.id === configuredDefaultModelId)
3352
- : false;
3353
- return models.map((model) => {
3354
- const defaultReasoningEffort = normalizeCodexThinkingOptionId(typeof model.defaultReasoningEffort === "string" ? model.defaultReasoningEffort : null);
3355
- const resolvedDefaultReasoningEffort = configuredDefaultThinkingOptionId ?? defaultReasoningEffort;
3356
- const thinkingById = new Map();
3357
- if (Array.isArray(model.supportedReasoningEfforts)) {
3358
- for (const entry of model.supportedReasoningEfforts) {
3359
- const id = normalizeCodexThinkingOptionId(typeof entry?.reasoningEffort === "string" ? entry.reasoningEffort : null);
3360
- if (!id)
3361
- continue;
3362
- const description = typeof entry?.description === "string" && entry.description.trim().length > 0
3363
- ? entry.description
3364
- : undefined;
3365
- thinkingById.set(id, { id, label: id, description });
3366
- }
3367
- }
3368
- if (resolvedDefaultReasoningEffort && !thinkingById.has(resolvedDefaultReasoningEffort)) {
3369
- thinkingById.set(resolvedDefaultReasoningEffort, {
3370
- id: resolvedDefaultReasoningEffort,
3371
- label: resolvedDefaultReasoningEffort,
3372
- description: configuredDefaultThinkingOptionId === resolvedDefaultReasoningEffort
3373
- ? "Configured default reasoning effort"
3374
- : "Model default reasoning effort",
3375
- });
3376
- }
3377
- const thinkingOptions = Array.from(thinkingById.values()).map((option) => ({
3378
- ...option,
3379
- isDefault: option.id === resolvedDefaultReasoningEffort,
3380
- }));
3381
- const defaultThinkingOptionId = resolvedDefaultReasoningEffort ??
3382
- thinkingOptions.find((option) => option.isDefault)?.id ??
3383
- thinkingOptions[0]?.id;
3384
- const isDefaultModel = hasConfiguredDefaultModel
3385
- ? model.id === configuredDefaultModelId
3386
- : model.isDefault;
3387
- return {
3388
- provider: CODEX_PROVIDER,
3389
- id: model.id,
3390
- label: normalizeCodexModelLabel(model.displayName),
3391
- description: model.description,
3392
- isDefault: isDefaultModel,
3393
- thinkingOptions: thinkingOptions.length > 0 ? thinkingOptions : undefined,
3394
- defaultThinkingOptionId,
3395
- metadata: {
3396
- model: model.model,
3397
- defaultReasoningEffort: model.defaultReasoningEffort,
3398
- supportedReasoningEfforts: model.supportedReasoningEfforts,
3399
- },
3400
- };
3401
- });
3402
- }
3403
- finally {
3404
- await client.dispose();
3405
- }
3461
+ return getSeaworkModels("codex");
3406
3462
  }
3407
3463
  async isAvailable() {
3408
3464
  const command = this.runtimeSettings?.command;
3409
3465
  if (command?.mode === "replace") {
3410
3466
  return existsSync(command.argv[0]);
3411
3467
  }
3412
- return true;
3468
+ return (await findExecutable("codex")) !== null;
3413
3469
  }
3414
3470
  async getDiagnostic() {
3415
3471
  try {