@getpaseo/server 0.1.25 → 0.1.27

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 (89) hide show
  1. package/dist/server/client/daemon-client.d.ts +4 -20
  2. package/dist/server/client/daemon-client.d.ts.map +1 -1
  3. package/dist/server/client/daemon-client.js +25 -71
  4. package/dist/server/client/daemon-client.js.map +1 -1
  5. package/dist/server/server/agent/provider-launch-config.d.ts +12 -0
  6. package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
  7. package/dist/server/server/agent/provider-launch-config.js +79 -10
  8. package/dist/server/server/agent/provider-launch-config.js.map +1 -1
  9. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -1
  10. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +2 -0
  11. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
  12. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -1
  13. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +2 -0
  14. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
  15. package/dist/server/server/agent/providers/claude-agent.d.ts +0 -1
  16. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  17. package/dist/server/server/agent/providers/claude-agent.js +27 -58
  18. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  19. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  20. package/dist/server/server/agent/providers/codex-app-server-agent.js +125 -13
  21. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  22. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -1
  23. package/dist/server/server/agent/providers/codex-rollout-timeline.js +77 -9
  24. package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -1
  25. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  26. package/dist/server/server/agent/providers/opencode-agent.js +12 -12
  27. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  28. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +1 -0
  29. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -1
  30. package/dist/server/server/agent/providers/tool-call-mapper-utils.js +8 -0
  31. package/dist/server/server/agent/providers/tool-call-mapper-utils.js.map +1 -1
  32. package/dist/server/server/bootstrap.d.ts.map +1 -1
  33. package/dist/server/server/bootstrap.js +10 -3
  34. package/dist/server/server/bootstrap.js.map +1 -1
  35. package/dist/server/server/exports.d.ts +1 -0
  36. package/dist/server/server/exports.d.ts.map +1 -1
  37. package/dist/server/server/exports.js +1 -0
  38. package/dist/server/server/exports.js.map +1 -1
  39. package/dist/server/server/logger.d.ts.map +1 -1
  40. package/dist/server/server/logger.js +31 -1
  41. package/dist/server/server/logger.js.map +1 -1
  42. package/dist/server/server/pid-lock.d.ts +2 -2
  43. package/dist/server/server/pid-lock.d.ts.map +1 -1
  44. package/dist/server/server/pid-lock.js +2 -2
  45. package/dist/server/server/pid-lock.js.map +1 -1
  46. package/dist/server/server/session.d.ts +6 -0
  47. package/dist/server/server/session.d.ts.map +1 -1
  48. package/dist/server/server/session.js +134 -57
  49. package/dist/server/server/session.js.map +1 -1
  50. package/dist/server/server/websocket-server.d.ts +1 -1
  51. package/dist/server/server/websocket-server.d.ts.map +1 -1
  52. package/dist/server/server/websocket-server.js +12 -16
  53. package/dist/server/server/websocket-server.js.map +1 -1
  54. package/dist/server/shared/messages.d.ts +0 -454
  55. package/dist/server/shared/messages.d.ts.map +1 -1
  56. package/dist/server/shared/messages.js +0 -9
  57. package/dist/server/shared/messages.js.map +1 -1
  58. package/dist/server/shared/tool-call-display.d.ts.map +1 -1
  59. package/dist/server/shared/tool-call-display.js +7 -0
  60. package/dist/server/shared/tool-call-display.js.map +1 -1
  61. package/dist/src/server/agent/provider-launch-config.js +79 -10
  62. package/dist/src/server/agent/provider-launch-config.js.map +1 -1
  63. package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js +2 -0
  64. package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
  65. package/dist/src/server/agent/providers/claude/tool-call-mapper.js +2 -0
  66. package/dist/src/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
  67. package/dist/src/server/agent/providers/claude-agent.js +27 -58
  68. package/dist/src/server/agent/providers/claude-agent.js.map +1 -1
  69. package/dist/src/server/agent/providers/codex-app-server-agent.js +125 -13
  70. package/dist/src/server/agent/providers/codex-app-server-agent.js.map +1 -1
  71. package/dist/src/server/agent/providers/codex-rollout-timeline.js +77 -9
  72. package/dist/src/server/agent/providers/codex-rollout-timeline.js.map +1 -1
  73. package/dist/src/server/agent/providers/opencode-agent.js +12 -12
  74. package/dist/src/server/agent/providers/opencode-agent.js.map +1 -1
  75. package/dist/src/server/agent/providers/tool-call-mapper-utils.js +8 -0
  76. package/dist/src/server/agent/providers/tool-call-mapper-utils.js.map +1 -1
  77. package/dist/src/server/bootstrap.js +10 -3
  78. package/dist/src/server/bootstrap.js.map +1 -1
  79. package/dist/src/server/pid-lock.js +2 -2
  80. package/dist/src/server/pid-lock.js.map +1 -1
  81. package/dist/src/server/session.js +134 -57
  82. package/dist/src/server/session.js.map +1 -1
  83. package/dist/src/server/websocket-server.js +12 -16
  84. package/dist/src/server/websocket-server.js.map +1 -1
  85. package/dist/src/shared/messages.js +0 -9
  86. package/dist/src/shared/messages.js.map +1 -1
  87. package/dist/src/shared/tool-call-display.js +7 -0
  88. package/dist/src/shared/tool-call-display.js.map +1 -1
  89. package/package.json +5 -4
@@ -1,5 +1,6 @@
1
1
  import { execSync, spawn } from "node:child_process";
2
2
  import { randomUUID } from "node:crypto";
3
+ import { existsSync } from "node:fs";
3
4
  import fs from "node:fs/promises";
4
5
  import os from "node:os";
5
6
  import path from "node:path";
@@ -7,7 +8,8 @@ import readline from "node:readline";
7
8
  import { z } from "zod";
8
9
  import { loadCodexPersistedTimeline } from "./codex-rollout-timeline.js";
9
10
  import { mapCodexRolloutToolCall, mapCodexToolCallFromThreadItem, } from "./codex/tool-call-mapper.js";
10
- import { applyProviderEnv, isProviderCommandAvailable, resolveProviderCommandPrefix, } from "../provider-launch-config.js";
11
+ import { applyProviderEnv, findExecutable, resolveProviderCommandPrefix, } from "../provider-launch-config.js";
12
+ import { extractCodexTerminalSessionId, nonEmptyString } from "./tool-call-mapper-utils.js";
11
13
  const DEFAULT_TIMEOUT_MS = 14 * 24 * 60 * 60 * 1000;
12
14
  const TURN_START_TIMEOUT_MS = 90 * 1000;
13
15
  const CODEX_PROVIDER = "codex";
@@ -86,16 +88,11 @@ function mergeCodexConfiguredDefaults(primary, fallback) {
86
88
  };
87
89
  }
88
90
  function resolveCodexBinary() {
89
- try {
90
- const codexPath = execSync("which codex", { encoding: "utf8" }).trim();
91
- if (codexPath) {
92
- return codexPath;
93
- }
94
- }
95
- catch {
96
- // Fall through to error
91
+ const found = findExecutable("codex");
92
+ if (found) {
93
+ return found;
97
94
  }
98
- throw new Error("Codex CLI not found. Please install codex globally: npm install -g @openai/codex");
95
+ throw new Error("Codex binary not found. Install the Codex CLI (https://github.com/openai/codex) and ensure it is available in your shell PATH.");
99
96
  }
100
97
  function resolveCodexLaunchPrefix(runtimeSettings) {
101
98
  return resolveProviderCommandPrefix(runtimeSettings?.command, resolveCodexBinary);
@@ -835,6 +832,26 @@ function mapCodexPatchNotificationToToolCall(params) {
835
832
  }
836
833
  return params.running ? toRunningToolCall(mapped) : mapped;
837
834
  }
835
+ function mapCodexTerminalInteractionToToolCall(params) {
836
+ const processId = nonEmptyString(params.processId ?? undefined);
837
+ const callId = processId
838
+ ? `terminal-session-${processId}`
839
+ : nonEmptyString(params.fallbackCallId ?? undefined) ?? "terminal-interaction";
840
+ const label = nonEmptyString(params.command ?? undefined);
841
+ return {
842
+ type: "tool_call",
843
+ callId,
844
+ name: "terminal",
845
+ status: "completed",
846
+ error: null,
847
+ detail: {
848
+ type: "plain_text",
849
+ ...(label ? { label } : {}),
850
+ icon: "square_terminal",
851
+ },
852
+ ...(processId ? { metadata: { processId } } : {}),
853
+ };
854
+ }
838
855
  function threadItemToTimeline(item, options) {
839
856
  if (!item || typeof item !== "object")
840
857
  return null;
@@ -1031,6 +1048,21 @@ const CodexEventExecCommandOutputDeltaNotificationSchema = z.object({
1031
1048
  })
1032
1049
  .passthrough(),
1033
1050
  }).passthrough();
1051
+ const CodexEventTerminalInteractionNotificationSchema = z.object({
1052
+ msg: z
1053
+ .object({
1054
+ type: z.literal("terminal_interaction"),
1055
+ call_id: z.string().optional(),
1056
+ process_id: z.union([z.string(), z.number()]).optional(),
1057
+ stdin: z.string().optional(),
1058
+ })
1059
+ .passthrough(),
1060
+ }).passthrough();
1061
+ const ItemCommandExecutionTerminalInteractionNotificationSchema = z.object({
1062
+ itemId: z.string().optional(),
1063
+ processId: z.union([z.string(), z.number()]).optional(),
1064
+ stdin: z.string().optional(),
1065
+ }).passthrough();
1034
1066
  const CodexEventPatchApplyBeginNotificationSchema = z.object({
1035
1067
  msg: z
1036
1068
  .object({
@@ -1170,6 +1202,35 @@ const CodexNotificationSchema = z.union([
1170
1202
  method: z.literal("codex/event/exec_command_output_delta"),
1171
1203
  params: z.unknown(),
1172
1204
  }).transform(({ method, params }) => ({ kind: "invalid_payload", method, params })),
1205
+ z.object({
1206
+ method: z.literal("codex/event/terminal_interaction"),
1207
+ params: CodexEventTerminalInteractionNotificationSchema,
1208
+ }).transform(({ params }) => ({
1209
+ kind: "terminal_interaction",
1210
+ source: "codex_event",
1211
+ callId: params.msg.call_id ?? null,
1212
+ processId: typeof params.msg.process_id === "number"
1213
+ ? String(params.msg.process_id)
1214
+ : params.msg.process_id ?? null,
1215
+ stdin: params.msg.stdin ?? null,
1216
+ })),
1217
+ z.object({ method: z.literal("codex/event/terminal_interaction"), params: z.unknown() }).transform(({ method, params }) => ({ kind: "invalid_payload", method, params })),
1218
+ z.object({
1219
+ method: z.literal("item/commandExecution/terminalInteraction"),
1220
+ params: ItemCommandExecutionTerminalInteractionNotificationSchema,
1221
+ }).transform(({ params }) => ({
1222
+ kind: "terminal_interaction",
1223
+ source: "item",
1224
+ callId: params.itemId ?? null,
1225
+ processId: typeof params.processId === "number"
1226
+ ? String(params.processId)
1227
+ : params.processId ?? null,
1228
+ stdin: params.stdin ?? null,
1229
+ })),
1230
+ z.object({
1231
+ method: z.literal("item/commandExecution/terminalInteraction"),
1232
+ params: z.unknown(),
1233
+ }).transform(({ method, params }) => ({ kind: "invalid_payload", method, params })),
1173
1234
  z.object({
1174
1235
  method: z.literal("codex/event/patch_apply_begin"),
1175
1236
  params: CodexEventPatchApplyBeginNotificationSchema,
@@ -1322,6 +1383,8 @@ class CodexAppServerAgentSession {
1322
1383
  this.pendingReasoning = new Map();
1323
1384
  this.pendingCommandOutputDeltas = new Map();
1324
1385
  this.pendingFileChangeOutputDeltas = new Map();
1386
+ this.terminalCommandByProcessId = new Map();
1387
+ this.emittedTerminalInteractionKeys = new Set();
1325
1388
  this.emittedExecCommandStartedCallIds = new Set();
1326
1389
  this.emittedExecCommandCompletedCallIds = new Set();
1327
1390
  this.emittedItemStartedIds = new Set();
@@ -2053,7 +2116,6 @@ class CodexAppServerAgentSession {
2053
2116
  this.pendingCommandOutputDeltas.clear();
2054
2117
  this.pendingFileChangeOutputDeltas.clear();
2055
2118
  this.warnedIncompleteEditToolCallIds.clear();
2056
- this.eventQueue?.end();
2057
2119
  return;
2058
2120
  }
2059
2121
  if (parsed.kind === "plan_updated") {
@@ -2116,11 +2178,13 @@ class CodexAppServerAgentSession {
2116
2178
  }
2117
2179
  if (parsed.kind === "exec_command_completed") {
2118
2180
  const bufferedOutput = this.consumeOutputDelta(this.pendingCommandOutputDeltas, parsed.callId);
2181
+ const resolvedOutput = parsed.output ?? bufferedOutput;
2182
+ this.rememberTerminalProcessForCommand(parsed.command, resolvedOutput);
2119
2183
  const timelineItem = mapCodexExecNotificationToToolCall({
2120
2184
  callId: parsed.callId,
2121
2185
  command: parsed.command,
2122
2186
  cwd: parsed.cwd ?? this.config.cwd ?? null,
2123
- output: parsed.output ?? bufferedOutput,
2187
+ output: resolvedOutput,
2124
2188
  exitCode: parsed.exitCode,
2125
2189
  success: parsed.success,
2126
2190
  stderr: parsed.stderr,
@@ -2132,6 +2196,23 @@ class CodexAppServerAgentSession {
2132
2196
  }
2133
2197
  return;
2134
2198
  }
2199
+ if (parsed.kind === "terminal_interaction") {
2200
+ const interactionKey = [
2201
+ parsed.processId ?? "",
2202
+ parsed.stdin ?? "",
2203
+ ].join("\u0000");
2204
+ if (!this.shouldEmitTerminalInteractionKey(interactionKey)) {
2205
+ return;
2206
+ }
2207
+ const timelineItem = mapCodexTerminalInteractionToToolCall({
2208
+ processId: parsed.processId,
2209
+ fallbackCallId: parsed.callId,
2210
+ command: (parsed.processId ? this.terminalCommandByProcessId.get(parsed.processId) : undefined) ??
2211
+ null,
2212
+ });
2213
+ this.emitEvent({ type: "timeline", provider: CODEX_PROVIDER, item: timelineItem });
2214
+ return;
2215
+ }
2135
2216
  if (parsed.kind === "patch_apply_started") {
2136
2217
  if (parsed.callId) {
2137
2218
  this.pendingFileChangeOutputDeltas.delete(parsed.callId);
@@ -2297,6 +2378,30 @@ class CodexAppServerAgentSession {
2297
2378
  store.delete(id);
2298
2379
  return buffered.join("");
2299
2380
  }
2381
+ rememberTerminalProcessForCommand(command, output) {
2382
+ const normalizedCommand = normalizeCodexCommandValue(command);
2383
+ if (!normalizedCommand) {
2384
+ return;
2385
+ }
2386
+ const displayCommand = typeof normalizedCommand === "string"
2387
+ ? normalizedCommand
2388
+ : normalizedCommand.join(" ").trim();
2389
+ if (!displayCommand) {
2390
+ return;
2391
+ }
2392
+ const processId = extractCodexTerminalSessionId(output ?? undefined);
2393
+ if (!processId) {
2394
+ return;
2395
+ }
2396
+ this.terminalCommandByProcessId.set(processId, displayCommand);
2397
+ }
2398
+ shouldEmitTerminalInteractionKey(key) {
2399
+ if (this.emittedTerminalInteractionKeys.has(key)) {
2400
+ return false;
2401
+ }
2402
+ this.emittedTerminalInteractionKeys.add(key);
2403
+ return true;
2404
+ }
2300
2405
  warnOnIncompleteEditToolCall(item, source, payload) {
2301
2406
  if (!isEditToolCallWithoutContent(item)) {
2302
2407
  return;
@@ -2429,6 +2534,9 @@ export class CodexAppServerAgentClient {
2429
2534
  }
2430
2535
  spawnAppServer() {
2431
2536
  const launchPrefix = resolveCodexLaunchPrefix(this.runtimeSettings);
2537
+ this.logger.trace({
2538
+ launchPrefix
2539
+ }, "Spawning Codex app server");
2432
2540
  return spawn(launchPrefix.command, [...launchPrefix.args, "app-server"], {
2433
2541
  stdio: ["pipe", "pipe", "pipe"],
2434
2542
  env: applyProviderEnv(process.env, this.runtimeSettings),
@@ -2595,7 +2703,11 @@ export class CodexAppServerAgentClient {
2595
2703
  }
2596
2704
  }
2597
2705
  async isAvailable() {
2598
- return isProviderCommandAvailable(this.runtimeSettings?.command, resolveCodexBinary);
2706
+ const command = this.runtimeSettings?.command;
2707
+ if (command?.mode === "replace") {
2708
+ return existsSync(command.argv[0]);
2709
+ }
2710
+ return true;
2599
2711
  }
2600
2712
  }
2601
2713
  //# sourceMappingURL=codex-app-server-agent.js.map