@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.
- package/dist/server/client/daemon-client.d.ts +4 -20
- package/dist/server/client/daemon-client.d.ts.map +1 -1
- package/dist/server/client/daemon-client.js +25 -71
- package/dist/server/client/daemon-client.js.map +1 -1
- package/dist/server/server/agent/provider-launch-config.d.ts +12 -0
- package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
- package/dist/server/server/agent/provider-launch-config.js +79 -10
- package/dist/server/server/agent/provider-launch-config.js.map +1 -1
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +2 -0
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
- package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/tool-call-mapper.js +2 -0
- package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.d.ts +0 -1
- package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.js +27 -58
- package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.js +125 -13
- package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
- package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex-rollout-timeline.js +77 -9
- package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.js +12 -12
- package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
- package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +1 -0
- package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -1
- package/dist/server/server/agent/providers/tool-call-mapper-utils.js +8 -0
- package/dist/server/server/agent/providers/tool-call-mapper-utils.js.map +1 -1
- package/dist/server/server/bootstrap.d.ts.map +1 -1
- package/dist/server/server/bootstrap.js +10 -3
- package/dist/server/server/bootstrap.js.map +1 -1
- package/dist/server/server/exports.d.ts +1 -0
- package/dist/server/server/exports.d.ts.map +1 -1
- package/dist/server/server/exports.js +1 -0
- package/dist/server/server/exports.js.map +1 -1
- package/dist/server/server/logger.d.ts.map +1 -1
- package/dist/server/server/logger.js +31 -1
- package/dist/server/server/logger.js.map +1 -1
- package/dist/server/server/pid-lock.d.ts +2 -2
- package/dist/server/server/pid-lock.d.ts.map +1 -1
- package/dist/server/server/pid-lock.js +2 -2
- package/dist/server/server/pid-lock.js.map +1 -1
- package/dist/server/server/session.d.ts +6 -0
- package/dist/server/server/session.d.ts.map +1 -1
- package/dist/server/server/session.js +134 -57
- package/dist/server/server/session.js.map +1 -1
- package/dist/server/server/websocket-server.d.ts +1 -1
- package/dist/server/server/websocket-server.d.ts.map +1 -1
- package/dist/server/server/websocket-server.js +12 -16
- package/dist/server/server/websocket-server.js.map +1 -1
- package/dist/server/shared/messages.d.ts +0 -454
- package/dist/server/shared/messages.d.ts.map +1 -1
- package/dist/server/shared/messages.js +0 -9
- package/dist/server/shared/messages.js.map +1 -1
- package/dist/server/shared/tool-call-display.d.ts.map +1 -1
- package/dist/server/shared/tool-call-display.js +7 -0
- package/dist/server/shared/tool-call-display.js.map +1 -1
- package/dist/src/server/agent/provider-launch-config.js +79 -10
- package/dist/src/server/agent/provider-launch-config.js.map +1 -1
- package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js +2 -0
- package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
- package/dist/src/server/agent/providers/claude/tool-call-mapper.js +2 -0
- package/dist/src/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
- package/dist/src/server/agent/providers/claude-agent.js +27 -58
- package/dist/src/server/agent/providers/claude-agent.js.map +1 -1
- package/dist/src/server/agent/providers/codex-app-server-agent.js +125 -13
- package/dist/src/server/agent/providers/codex-app-server-agent.js.map +1 -1
- package/dist/src/server/agent/providers/codex-rollout-timeline.js +77 -9
- package/dist/src/server/agent/providers/codex-rollout-timeline.js.map +1 -1
- package/dist/src/server/agent/providers/opencode-agent.js +12 -12
- package/dist/src/server/agent/providers/opencode-agent.js.map +1 -1
- package/dist/src/server/agent/providers/tool-call-mapper-utils.js +8 -0
- package/dist/src/server/agent/providers/tool-call-mapper-utils.js.map +1 -1
- package/dist/src/server/bootstrap.js +10 -3
- package/dist/src/server/bootstrap.js.map +1 -1
- package/dist/src/server/pid-lock.js +2 -2
- package/dist/src/server/pid-lock.js.map +1 -1
- package/dist/src/server/session.js +134 -57
- package/dist/src/server/session.js.map +1 -1
- package/dist/src/server/websocket-server.js +12 -16
- package/dist/src/server/websocket-server.js.map +1 -1
- package/dist/src/shared/messages.js +0 -9
- package/dist/src/shared/messages.js.map +1 -1
- package/dist/src/shared/tool-call-display.js +7 -0
- package/dist/src/shared/tool-call-display.js.map +1 -1
- 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,
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
|
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:
|
|
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
|
-
|
|
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
|