@getpaseo/server 0.1.32 → 0.1.34
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/server/agent/activity-curator.d.ts.map +1 -1
- package/dist/server/server/agent/activity-curator.js +15 -1
- package/dist/server/server/agent/activity-curator.js.map +1 -1
- package/dist/server/server/agent/agent-management-mcp.d.ts.map +1 -1
- package/dist/server/server/agent/agent-management-mcp.js +2 -4
- package/dist/server/server/agent/agent-management-mcp.js.map +1 -1
- package/dist/server/server/agent/agent-manager.d.ts +25 -14
- package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
- package/dist/server/server/agent/agent-manager.js +383 -337
- package/dist/server/server/agent/agent-manager.js.map +1 -1
- package/dist/server/server/agent/agent-sdk-types.d.ts +16 -14
- package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
- package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
- package/dist/server/server/agent/mcp-server.js +2 -4
- package/dist/server/server/agent/mcp-server.js.map +1 -1
- package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
- package/dist/server/server/agent/provider-launch-config.js +15 -1
- package/dist/server/server/agent/provider-launch-config.js.map +1 -1
- package/dist/server/server/agent/provider-manifest.d.ts +1 -1
- package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
- package/dist/server/server/agent/provider-manifest.js +4 -4
- package/dist/server/server/agent/provider-manifest.js.map +1 -1
- package/dist/server/server/agent/providers/claude/partial-json.js +3 -3
- package/dist/server/server/agent/providers/claude/partial-json.js.map +1 -1
- package/dist/server/server/agent/providers/claude/sdk-model-resolver.d.ts +11 -0
- package/dist/server/server/agent/providers/claude/sdk-model-resolver.d.ts.map +1 -0
- package/dist/server/server/agent/providers/claude/sdk-model-resolver.js +104 -0
- package/dist/server/server/agent/providers/claude/sdk-model-resolver.js.map +1 -0
- package/dist/server/server/agent/providers/claude-agent.d.ts +4 -13
- package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.js +382 -451
- package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +5 -3
- 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 +174 -151
- package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.d.ts +3 -3
- package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.js +106 -25
- package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts +3 -0
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts.map +1 -0
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +57 -0
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -0
- package/dist/server/server/config.d.ts.map +1 -1
- package/dist/server/server/config.js +1 -5
- package/dist/server/server/config.js.map +1 -1
- package/dist/server/server/persisted-config.d.ts +10 -10
- package/dist/server/server/session.d.ts.map +1 -1
- package/dist/server/server/session.js +20 -12
- package/dist/server/server/session.js.map +1 -1
- package/dist/server/shared/tool-call-display.js +1 -1
- package/dist/server/shared/tool-call-display.js.map +1 -1
- package/dist/server/terminal/terminal.d.ts +4 -0
- package/dist/server/terminal/terminal.d.ts.map +1 -1
- package/dist/server/terminal/terminal.js +7 -30
- package/dist/server/terminal/terminal.js.map +1 -1
- package/dist/src/server/agent/activity-curator.js +15 -1
- package/dist/src/server/agent/activity-curator.js.map +1 -1
- package/dist/src/server/agent/agent-manager.js +383 -337
- package/dist/src/server/agent/agent-manager.js.map +1 -1
- package/dist/src/server/agent/mcp-server.js +2 -4
- package/dist/src/server/agent/mcp-server.js.map +1 -1
- package/dist/src/server/agent/provider-launch-config.js +15 -1
- package/dist/src/server/agent/provider-launch-config.js.map +1 -1
- package/dist/src/server/agent/provider-manifest.js +4 -4
- package/dist/src/server/agent/provider-manifest.js.map +1 -1
- package/dist/src/server/agent/providers/claude/partial-json.js +3 -3
- package/dist/src/server/agent/providers/claude/partial-json.js.map +1 -1
- package/dist/src/server/agent/providers/claude/sdk-model-resolver.js +104 -0
- package/dist/src/server/agent/providers/claude/sdk-model-resolver.js.map +1 -0
- package/dist/src/server/agent/providers/claude-agent.js +382 -451
- package/dist/src/server/agent/providers/claude-agent.js.map +1 -1
- package/dist/src/server/agent/providers/codex-app-server-agent.js +174 -151
- package/dist/src/server/agent/providers/codex-app-server-agent.js.map +1 -1
- package/dist/src/server/agent/providers/opencode-agent.js +106 -25
- package/dist/src/server/agent/providers/opencode-agent.js.map +1 -1
- package/dist/src/server/config.js +1 -5
- package/dist/src/server/config.js.map +1 -1
- package/dist/src/server/session.js +20 -12
- package/dist/src/server/session.js.map +1 -1
- package/dist/src/shared/tool-call-display.js +1 -1
- package/dist/src/shared/tool-call-display.js.map +1 -1
- package/dist/src/terminal/terminal.js +7 -30
- package/dist/src/terminal/terminal.js.map +1 -1
- package/package.json +4 -5
- package/agent-prompt.md +0 -339
- package/dist/server/server/agent/providers/claude/model-catalog.d.ts +0 -29
- package/dist/server/server/agent/providers/claude/model-catalog.d.ts.map +0 -1
- package/dist/server/server/agent/providers/claude/model-catalog.js +0 -70
- package/dist/server/server/agent/providers/claude/model-catalog.js.map +0 -1
- package/dist/server/server/agent/system-prompt.d.ts +0 -3
- package/dist/server/server/agent/system-prompt.d.ts.map +0 -1
- package/dist/server/server/agent/system-prompt.js +0 -19
- package/dist/server/server/agent/system-prompt.js.map +0 -1
- package/dist/server/server/terminal-mcp/index.d.ts +0 -4
- package/dist/server/server/terminal-mcp/index.d.ts.map +0 -1
- package/dist/server/server/terminal-mcp/index.js +0 -3
- package/dist/server/server/terminal-mcp/index.js.map +0 -1
- package/dist/server/server/terminal-mcp/server.d.ts +0 -10
- package/dist/server/server/terminal-mcp/server.d.ts.map +0 -1
- package/dist/server/server/terminal-mcp/server.js +0 -209
- package/dist/server/server/terminal-mcp/server.js.map +0 -1
- package/dist/server/server/terminal-mcp/terminal-manager.d.ts +0 -123
- package/dist/server/server/terminal-mcp/terminal-manager.d.ts.map +0 -1
- package/dist/server/server/terminal-mcp/terminal-manager.js +0 -339
- package/dist/server/server/terminal-mcp/terminal-manager.js.map +0 -1
- package/dist/server/server/terminal-mcp/tmux.d.ts +0 -207
- package/dist/server/server/terminal-mcp/tmux.d.ts.map +0 -1
- package/dist/server/server/terminal-mcp/tmux.js +0 -821
- package/dist/server/server/terminal-mcp/tmux.js.map +0 -1
- package/dist/src/server/agent/providers/claude/model-catalog.js +0 -70
- package/dist/src/server/agent/providers/claude/model-catalog.js.map +0 -1
|
@@ -337,48 +337,6 @@ function toCodexMcpConfig(config) {
|
|
|
337
337
|
};
|
|
338
338
|
}
|
|
339
339
|
}
|
|
340
|
-
class Pushable {
|
|
341
|
-
constructor() {
|
|
342
|
-
this.queue = [];
|
|
343
|
-
this.resolvers = [];
|
|
344
|
-
this.closed = false;
|
|
345
|
-
}
|
|
346
|
-
push(item) {
|
|
347
|
-
if (this.closed) {
|
|
348
|
-
return;
|
|
349
|
-
}
|
|
350
|
-
if (this.resolvers.length > 0) {
|
|
351
|
-
const resolve = this.resolvers.shift();
|
|
352
|
-
resolve({ value: item, done: false });
|
|
353
|
-
}
|
|
354
|
-
else {
|
|
355
|
-
this.queue.push(item);
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
end() {
|
|
359
|
-
this.closed = true;
|
|
360
|
-
while (this.resolvers.length > 0) {
|
|
361
|
-
const resolve = this.resolvers.shift();
|
|
362
|
-
resolve({ value: undefined, done: true });
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
[Symbol.asyncIterator]() {
|
|
366
|
-
return {
|
|
367
|
-
next: () => {
|
|
368
|
-
if (this.queue.length > 0) {
|
|
369
|
-
const value = this.queue.shift();
|
|
370
|
-
return Promise.resolve({ value, done: false });
|
|
371
|
-
}
|
|
372
|
-
if (this.closed) {
|
|
373
|
-
return Promise.resolve({ value: undefined, done: true });
|
|
374
|
-
}
|
|
375
|
-
return new Promise((resolve) => {
|
|
376
|
-
this.resolvers.push(resolve);
|
|
377
|
-
});
|
|
378
|
-
},
|
|
379
|
-
};
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
340
|
class CodexAppServerClient {
|
|
383
341
|
constructor(child, logger) {
|
|
384
342
|
this.child = child;
|
|
@@ -1585,7 +1543,18 @@ export async function codexAppServerTurnInputFromPrompt(prompt, logger) {
|
|
|
1585
1543
|
}
|
|
1586
1544
|
return output;
|
|
1587
1545
|
}
|
|
1546
|
+
function buildCodexAppServerEnv(runtimeSettings, launchEnv) {
|
|
1547
|
+
const env = applyProviderEnv(process.env, runtimeSettings);
|
|
1548
|
+
if (!launchEnv) {
|
|
1549
|
+
return env;
|
|
1550
|
+
}
|
|
1551
|
+
return {
|
|
1552
|
+
...env,
|
|
1553
|
+
...launchEnv,
|
|
1554
|
+
};
|
|
1555
|
+
}
|
|
1588
1556
|
export const __codexAppServerInternals = {
|
|
1557
|
+
buildCodexAppServerEnv,
|
|
1589
1558
|
mapCodexPatchNotificationToToolCall,
|
|
1590
1559
|
};
|
|
1591
1560
|
class CodexAppServerAgentSession {
|
|
@@ -1597,7 +1566,9 @@ class CodexAppServerAgentSession {
|
|
|
1597
1566
|
this.currentThreadId = null;
|
|
1598
1567
|
this.currentTurnId = null;
|
|
1599
1568
|
this.client = null;
|
|
1600
|
-
this.
|
|
1569
|
+
this.subscribers = new Set();
|
|
1570
|
+
this.nextTurnOrdinal = 0;
|
|
1571
|
+
this.activeForegroundTurnId = null;
|
|
1601
1572
|
this.cachedRuntimeInfo = null;
|
|
1602
1573
|
this.historyPending = false;
|
|
1603
1574
|
this.persistedHistory = [];
|
|
@@ -1609,6 +1580,7 @@ class CodexAppServerAgentSession {
|
|
|
1609
1580
|
this.pendingCommandOutputDeltas = new Map();
|
|
1610
1581
|
this.pendingFileChangeOutputDeltas = new Map();
|
|
1611
1582
|
this.terminalCommandByProcessId = new Map();
|
|
1583
|
+
this.pendingUnlabeledTerminalInteractions = new Set();
|
|
1612
1584
|
this.emittedTerminalInteractionKeys = new Set();
|
|
1613
1585
|
this.emittedExecCommandStartedCallIds = new Set();
|
|
1614
1586
|
this.emittedExecCommandCompletedCallIds = new Set();
|
|
@@ -1880,32 +1852,69 @@ class CodexAppServerAgentSession {
|
|
|
1880
1852
|
return args ? `$${commandName} ${args}` : `$${commandName}`;
|
|
1881
1853
|
}
|
|
1882
1854
|
async run(prompt, options) {
|
|
1883
|
-
const slashCommand = await this.resolveSlashCommandInvocation(prompt);
|
|
1884
|
-
if (slashCommand) {
|
|
1885
|
-
const commandInput = await this.buildCommandPromptInput(slashCommand.commandName, slashCommand.args);
|
|
1886
|
-
return this.runInternal(commandInput, options);
|
|
1887
|
-
}
|
|
1888
|
-
return this.runInternal(prompt, options);
|
|
1889
|
-
}
|
|
1890
|
-
async runInternal(prompt, options) {
|
|
1891
|
-
const events = this.streamInternal(prompt, options);
|
|
1892
1855
|
const timeline = [];
|
|
1893
1856
|
let finalText = "";
|
|
1894
1857
|
let usage;
|
|
1895
|
-
|
|
1858
|
+
let turnId = null;
|
|
1859
|
+
const bufferedEvents = [];
|
|
1860
|
+
let settled = false;
|
|
1861
|
+
let resolveCompletion;
|
|
1862
|
+
let rejectCompletion;
|
|
1863
|
+
const processEvent = (event) => {
|
|
1864
|
+
if (settled) {
|
|
1865
|
+
return;
|
|
1866
|
+
}
|
|
1867
|
+
const eventTurnId = event.turnId;
|
|
1868
|
+
if (turnId && eventTurnId && eventTurnId !== turnId) {
|
|
1869
|
+
return;
|
|
1870
|
+
}
|
|
1896
1871
|
if (event.type === "timeline") {
|
|
1897
1872
|
timeline.push(event.item);
|
|
1898
1873
|
if (event.item.type === "assistant_message") {
|
|
1899
1874
|
finalText = event.item.text;
|
|
1900
1875
|
}
|
|
1876
|
+
return;
|
|
1901
1877
|
}
|
|
1902
|
-
|
|
1878
|
+
if (event.type === "turn_completed") {
|
|
1903
1879
|
usage = event.usage;
|
|
1880
|
+
settled = true;
|
|
1881
|
+
resolveCompletion();
|
|
1882
|
+
return;
|
|
1883
|
+
}
|
|
1884
|
+
if (event.type === "turn_failed") {
|
|
1885
|
+
settled = true;
|
|
1886
|
+
rejectCompletion(new Error(event.error));
|
|
1887
|
+
return;
|
|
1888
|
+
}
|
|
1889
|
+
if (event.type === "turn_canceled") {
|
|
1890
|
+
settled = true;
|
|
1891
|
+
resolveCompletion();
|
|
1892
|
+
}
|
|
1893
|
+
};
|
|
1894
|
+
const completion = new Promise((resolve, reject) => {
|
|
1895
|
+
resolveCompletion = resolve;
|
|
1896
|
+
rejectCompletion = reject;
|
|
1897
|
+
});
|
|
1898
|
+
const unsubscribe = this.subscribe((event) => {
|
|
1899
|
+
if (!turnId) {
|
|
1900
|
+
bufferedEvents.push(event);
|
|
1901
|
+
return;
|
|
1902
|
+
}
|
|
1903
|
+
processEvent(event);
|
|
1904
|
+
});
|
|
1905
|
+
try {
|
|
1906
|
+
const result = await this.startTurn(prompt, options);
|
|
1907
|
+
turnId = result.turnId;
|
|
1908
|
+
for (const event of bufferedEvents) {
|
|
1909
|
+
processEvent(event);
|
|
1904
1910
|
}
|
|
1905
|
-
|
|
1906
|
-
|
|
1911
|
+
if (!settled) {
|
|
1912
|
+
await completion;
|
|
1907
1913
|
}
|
|
1908
1914
|
}
|
|
1915
|
+
finally {
|
|
1916
|
+
unsubscribe();
|
|
1917
|
+
}
|
|
1909
1918
|
const info = await this.getRuntimeInfo();
|
|
1910
1919
|
return {
|
|
1911
1920
|
sessionId: info.sessionId ?? "",
|
|
@@ -1914,96 +1923,78 @@ class CodexAppServerAgentSession {
|
|
|
1914
1923
|
timeline,
|
|
1915
1924
|
};
|
|
1916
1925
|
}
|
|
1917
|
-
async
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
const commandInput = await this.buildCommandPromptInput(slashCommand.commandName, slashCommand.args);
|
|
1921
|
-
yield* this.streamInternal(commandInput, options);
|
|
1922
|
-
return;
|
|
1926
|
+
async startTurn(prompt, options) {
|
|
1927
|
+
if (this.activeForegroundTurnId) {
|
|
1928
|
+
throw new Error("A foreground turn is already active");
|
|
1923
1929
|
}
|
|
1924
|
-
yield* this.streamInternal(prompt, options);
|
|
1925
|
-
}
|
|
1926
|
-
async *streamInternal(prompt, options) {
|
|
1927
1930
|
await this.connect();
|
|
1928
|
-
if (!this.client)
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1931
|
+
if (!this.client) {
|
|
1932
|
+
throw new Error("Codex client not initialized");
|
|
1933
|
+
}
|
|
1934
|
+
const slashCommand = await this.resolveSlashCommandInvocation(prompt);
|
|
1935
|
+
const effectivePrompt = slashCommand
|
|
1936
|
+
? await this.buildCommandPromptInput(slashCommand.commandName, slashCommand.args)
|
|
1937
|
+
: prompt;
|
|
1938
|
+
if (this.currentThreadId) {
|
|
1939
|
+
await this.ensureThreadLoaded();
|
|
1940
|
+
}
|
|
1941
|
+
else {
|
|
1942
|
+
await this.ensureThread();
|
|
1943
|
+
}
|
|
1944
|
+
const input = await this.buildUserInput(effectivePrompt);
|
|
1945
|
+
const preset = MODE_PRESETS[this.currentMode] ?? MODE_PRESETS[DEFAULT_CODEX_MODE_ID];
|
|
1946
|
+
const approvalPolicy = this.config.approvalPolicy ?? preset.approvalPolicy;
|
|
1947
|
+
const sandboxPolicyType = this.config.sandboxMode ?? preset.sandbox;
|
|
1948
|
+
const params = {
|
|
1949
|
+
threadId: this.currentThreadId,
|
|
1950
|
+
input,
|
|
1951
|
+
approvalPolicy,
|
|
1952
|
+
sandboxPolicy: toSandboxPolicy(sandboxPolicyType, typeof this.config.networkAccess === "boolean"
|
|
1953
|
+
? this.config.networkAccess
|
|
1954
|
+
: preset.networkAccess),
|
|
1955
|
+
};
|
|
1956
|
+
if (this.config.model) {
|
|
1957
|
+
params.model = this.config.model;
|
|
1958
|
+
}
|
|
1959
|
+
const thinkingOptionId = normalizeCodexThinkingOptionId(this.config.thinkingOptionId);
|
|
1960
|
+
if (thinkingOptionId) {
|
|
1961
|
+
params.effort = thinkingOptionId;
|
|
1962
|
+
}
|
|
1963
|
+
if (this.resolvedCollaborationMode) {
|
|
1964
|
+
params.collaborationMode = {
|
|
1965
|
+
mode: this.resolvedCollaborationMode.mode,
|
|
1966
|
+
settings: this.resolvedCollaborationMode.settings,
|
|
1950
1967
|
};
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
params.outputSchema = options.outputSchema;
|
|
1969
|
-
}
|
|
1970
|
-
if (this.config.systemPrompt?.trim()) {
|
|
1971
|
-
params.developerInstructions = this.config.systemPrompt.trim();
|
|
1972
|
-
}
|
|
1973
|
-
const codexConfig = this.buildCodexInnerConfig();
|
|
1974
|
-
if (codexConfig) {
|
|
1975
|
-
params.config = codexConfig;
|
|
1976
|
-
}
|
|
1968
|
+
}
|
|
1969
|
+
if (this.config.cwd) {
|
|
1970
|
+
params.cwd = this.config.cwd;
|
|
1971
|
+
}
|
|
1972
|
+
if (options?.outputSchema) {
|
|
1973
|
+
params.outputSchema = options.outputSchema;
|
|
1974
|
+
}
|
|
1975
|
+
if (this.config.systemPrompt?.trim()) {
|
|
1976
|
+
params.developerInstructions = this.config.systemPrompt.trim();
|
|
1977
|
+
}
|
|
1978
|
+
const codexConfig = this.buildCodexInnerConfig();
|
|
1979
|
+
if (codexConfig) {
|
|
1980
|
+
params.config = codexConfig;
|
|
1981
|
+
}
|
|
1982
|
+
const turnId = this.createTurnId();
|
|
1983
|
+
this.activeForegroundTurnId = turnId;
|
|
1984
|
+
try {
|
|
1977
1985
|
await this.client.request("turn/start", params, TURN_START_TIMEOUT_MS);
|
|
1978
|
-
let sawTurnStarted = false;
|
|
1979
|
-
for await (const event of queue) {
|
|
1980
|
-
// Drop pre-start timeline noise that can leak from the previous turn.
|
|
1981
|
-
// Keep permission events, which can legitimately arrive before turn_started.
|
|
1982
|
-
if (!sawTurnStarted) {
|
|
1983
|
-
if (event.type === "permission_requested" || event.type === "permission_resolved") {
|
|
1984
|
-
yield event;
|
|
1985
|
-
continue;
|
|
1986
|
-
}
|
|
1987
|
-
if (event.type === "turn_started") {
|
|
1988
|
-
sawTurnStarted = true;
|
|
1989
|
-
}
|
|
1990
|
-
else {
|
|
1991
|
-
continue;
|
|
1992
|
-
}
|
|
1993
|
-
}
|
|
1994
|
-
yield event;
|
|
1995
|
-
if (event.type === "turn_completed" ||
|
|
1996
|
-
event.type === "turn_failed" ||
|
|
1997
|
-
event.type === "turn_canceled") {
|
|
1998
|
-
break;
|
|
1999
|
-
}
|
|
2000
|
-
}
|
|
2001
1986
|
}
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
}
|
|
1987
|
+
catch (error) {
|
|
1988
|
+
this.activeForegroundTurnId = null;
|
|
1989
|
+
throw error;
|
|
2006
1990
|
}
|
|
1991
|
+
return { turnId };
|
|
1992
|
+
}
|
|
1993
|
+
subscribe(callback) {
|
|
1994
|
+
this.subscribers.add(callback);
|
|
1995
|
+
return () => {
|
|
1996
|
+
this.subscribers.delete(callback);
|
|
1997
|
+
};
|
|
2007
1998
|
}
|
|
2008
1999
|
async *streamHistory() {
|
|
2009
2000
|
if (!this.historyPending || this.persistedHistory.length === 0) {
|
|
@@ -2177,8 +2168,8 @@ class CodexAppServerAgentSession {
|
|
|
2177
2168
|
this.pendingPermissionHandlers.clear();
|
|
2178
2169
|
this.pendingPermissions.clear();
|
|
2179
2170
|
this.resolvedPermissionRequests.clear();
|
|
2180
|
-
this.
|
|
2181
|
-
this.
|
|
2171
|
+
this.subscribers.clear();
|
|
2172
|
+
this.activeForegroundTurnId = null;
|
|
2182
2173
|
if (this.client) {
|
|
2183
2174
|
await this.client.dispose();
|
|
2184
2175
|
}
|
|
@@ -2285,7 +2276,22 @@ class CodexAppServerAgentSession {
|
|
|
2285
2276
|
this.pendingAgentMessages.clear();
|
|
2286
2277
|
}
|
|
2287
2278
|
}
|
|
2288
|
-
this.
|
|
2279
|
+
this.notifySubscribers(event);
|
|
2280
|
+
}
|
|
2281
|
+
notifySubscribers(event) {
|
|
2282
|
+
const turnId = this.activeForegroundTurnId;
|
|
2283
|
+
const tagged = turnId ? { ...event, turnId } : event;
|
|
2284
|
+
for (const callback of this.subscribers) {
|
|
2285
|
+
try {
|
|
2286
|
+
callback(tagged);
|
|
2287
|
+
}
|
|
2288
|
+
catch (error) {
|
|
2289
|
+
this.logger.warn({ err: error }, "Subscriber callback threw");
|
|
2290
|
+
}
|
|
2291
|
+
}
|
|
2292
|
+
}
|
|
2293
|
+
createTurnId() {
|
|
2294
|
+
return `codex-turn-${this.nextTurnOrdinal++}`;
|
|
2289
2295
|
}
|
|
2290
2296
|
handleNotification(method, params) {
|
|
2291
2297
|
const parsed = CodexNotificationSchema.parse({ method, params });
|
|
@@ -2328,6 +2334,7 @@ class CodexAppServerAgentSession {
|
|
|
2328
2334
|
usage: this.latestUsage,
|
|
2329
2335
|
});
|
|
2330
2336
|
}
|
|
2337
|
+
this.activeForegroundTurnId = null;
|
|
2331
2338
|
this.emittedItemStartedIds.clear();
|
|
2332
2339
|
this.emittedItemCompletedIds.clear();
|
|
2333
2340
|
this.emittedExecCommandStartedCallIds.clear();
|
|
@@ -2422,11 +2429,15 @@ class CodexAppServerAgentSession {
|
|
|
2422
2429
|
if (!this.shouldEmitTerminalInteractionKey(interactionKey)) {
|
|
2423
2430
|
return;
|
|
2424
2431
|
}
|
|
2432
|
+
const command = (parsed.processId ? this.terminalCommandByProcessId.get(parsed.processId) : undefined) ??
|
|
2433
|
+
null;
|
|
2434
|
+
if (!command && parsed.processId) {
|
|
2435
|
+
this.pendingUnlabeledTerminalInteractions.add(parsed.processId);
|
|
2436
|
+
}
|
|
2425
2437
|
const timelineItem = mapCodexTerminalInteractionToToolCall({
|
|
2426
2438
|
processId: parsed.processId,
|
|
2427
2439
|
fallbackCallId: parsed.callId,
|
|
2428
|
-
command
|
|
2429
|
-
null,
|
|
2440
|
+
command,
|
|
2430
2441
|
});
|
|
2431
2442
|
this.emitEvent({ type: "timeline", provider: CODEX_PROVIDER, item: timelineItem });
|
|
2432
2443
|
return;
|
|
@@ -2611,6 +2622,18 @@ class CodexAppServerAgentSession {
|
|
|
2611
2622
|
return;
|
|
2612
2623
|
}
|
|
2613
2624
|
this.terminalCommandByProcessId.set(processId, displayCommand);
|
|
2625
|
+
if (!this.pendingUnlabeledTerminalInteractions.has(processId)) {
|
|
2626
|
+
return;
|
|
2627
|
+
}
|
|
2628
|
+
this.pendingUnlabeledTerminalInteractions.delete(processId);
|
|
2629
|
+
this.emitEvent({
|
|
2630
|
+
type: "timeline",
|
|
2631
|
+
provider: CODEX_PROVIDER,
|
|
2632
|
+
item: mapCodexTerminalInteractionToToolCall({
|
|
2633
|
+
processId,
|
|
2634
|
+
command: displayCommand,
|
|
2635
|
+
}),
|
|
2636
|
+
});
|
|
2614
2637
|
}
|
|
2615
2638
|
shouldEmitTerminalInteractionKey(key) {
|
|
2616
2639
|
if (this.emittedTerminalInteractionKeys.has(key)) {
|
|
@@ -2749,7 +2772,7 @@ export class CodexAppServerAgentClient {
|
|
|
2749
2772
|
this.provider = CODEX_PROVIDER;
|
|
2750
2773
|
this.capabilities = CODEX_APP_SERVER_CAPABILITIES;
|
|
2751
2774
|
}
|
|
2752
|
-
spawnAppServer() {
|
|
2775
|
+
spawnAppServer(launchEnv) {
|
|
2753
2776
|
const launchPrefix = resolveCodexLaunchPrefix(this.runtimeSettings);
|
|
2754
2777
|
this.logger.trace({
|
|
2755
2778
|
launchPrefix,
|
|
@@ -2757,16 +2780,16 @@ export class CodexAppServerAgentClient {
|
|
|
2757
2780
|
return spawn(launchPrefix.command, [...launchPrefix.args, "app-server"], {
|
|
2758
2781
|
detached: process.platform !== "win32",
|
|
2759
2782
|
stdio: ["pipe", "pipe", "pipe"],
|
|
2760
|
-
env:
|
|
2783
|
+
env: buildCodexAppServerEnv(this.runtimeSettings, launchEnv),
|
|
2761
2784
|
});
|
|
2762
2785
|
}
|
|
2763
|
-
async createSession(config) {
|
|
2786
|
+
async createSession(config, launchContext) {
|
|
2764
2787
|
const sessionConfig = { ...config, provider: CODEX_PROVIDER };
|
|
2765
|
-
const session = new CodexAppServerAgentSession(sessionConfig, null, this.logger, () => this.spawnAppServer());
|
|
2788
|
+
const session = new CodexAppServerAgentSession(sessionConfig, null, this.logger, () => this.spawnAppServer(launchContext?.env));
|
|
2766
2789
|
await session.connect();
|
|
2767
2790
|
return session;
|
|
2768
2791
|
}
|
|
2769
|
-
async resumeSession(handle, overrides) {
|
|
2792
|
+
async resumeSession(handle, overrides, launchContext) {
|
|
2770
2793
|
const storedConfig = (handle.metadata ?? {});
|
|
2771
2794
|
const merged = {
|
|
2772
2795
|
...storedConfig,
|
|
@@ -2774,7 +2797,7 @@ export class CodexAppServerAgentClient {
|
|
|
2774
2797
|
provider: CODEX_PROVIDER,
|
|
2775
2798
|
cwd: overrides?.cwd ?? storedConfig.cwd ?? process.cwd(),
|
|
2776
2799
|
};
|
|
2777
|
-
const session = new CodexAppServerAgentSession(merged, handle, this.logger, () => this.spawnAppServer());
|
|
2800
|
+
const session = new CodexAppServerAgentSession(merged, handle, this.logger, () => this.spawnAppServer(launchContext?.env));
|
|
2778
2801
|
await session.connect();
|
|
2779
2802
|
return session;
|
|
2780
2803
|
}
|