@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.
Files changed (113) hide show
  1. package/dist/server/server/agent/activity-curator.d.ts.map +1 -1
  2. package/dist/server/server/agent/activity-curator.js +15 -1
  3. package/dist/server/server/agent/activity-curator.js.map +1 -1
  4. package/dist/server/server/agent/agent-management-mcp.d.ts.map +1 -1
  5. package/dist/server/server/agent/agent-management-mcp.js +2 -4
  6. package/dist/server/server/agent/agent-management-mcp.js.map +1 -1
  7. package/dist/server/server/agent/agent-manager.d.ts +25 -14
  8. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  9. package/dist/server/server/agent/agent-manager.js +383 -337
  10. package/dist/server/server/agent/agent-manager.js.map +1 -1
  11. package/dist/server/server/agent/agent-sdk-types.d.ts +16 -14
  12. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  13. package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
  14. package/dist/server/server/agent/mcp-server.js +2 -4
  15. package/dist/server/server/agent/mcp-server.js.map +1 -1
  16. package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
  17. package/dist/server/server/agent/provider-launch-config.js +15 -1
  18. package/dist/server/server/agent/provider-launch-config.js.map +1 -1
  19. package/dist/server/server/agent/provider-manifest.d.ts +1 -1
  20. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
  21. package/dist/server/server/agent/provider-manifest.js +4 -4
  22. package/dist/server/server/agent/provider-manifest.js.map +1 -1
  23. package/dist/server/server/agent/providers/claude/partial-json.js +3 -3
  24. package/dist/server/server/agent/providers/claude/partial-json.js.map +1 -1
  25. package/dist/server/server/agent/providers/claude/sdk-model-resolver.d.ts +11 -0
  26. package/dist/server/server/agent/providers/claude/sdk-model-resolver.d.ts.map +1 -0
  27. package/dist/server/server/agent/providers/claude/sdk-model-resolver.js +104 -0
  28. package/dist/server/server/agent/providers/claude/sdk-model-resolver.js.map +1 -0
  29. package/dist/server/server/agent/providers/claude-agent.d.ts +4 -13
  30. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  31. package/dist/server/server/agent/providers/claude-agent.js +382 -451
  32. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  33. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +5 -3
  34. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  35. package/dist/server/server/agent/providers/codex-app-server-agent.js +174 -151
  36. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  37. package/dist/server/server/agent/providers/opencode-agent.d.ts +3 -3
  38. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  39. package/dist/server/server/agent/providers/opencode-agent.js +106 -25
  40. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  41. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts +3 -0
  42. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts.map +1 -0
  43. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +57 -0
  44. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -0
  45. package/dist/server/server/config.d.ts.map +1 -1
  46. package/dist/server/server/config.js +1 -5
  47. package/dist/server/server/config.js.map +1 -1
  48. package/dist/server/server/persisted-config.d.ts +10 -10
  49. package/dist/server/server/session.d.ts.map +1 -1
  50. package/dist/server/server/session.js +20 -12
  51. package/dist/server/server/session.js.map +1 -1
  52. package/dist/server/shared/tool-call-display.js +1 -1
  53. package/dist/server/shared/tool-call-display.js.map +1 -1
  54. package/dist/server/terminal/terminal.d.ts +4 -0
  55. package/dist/server/terminal/terminal.d.ts.map +1 -1
  56. package/dist/server/terminal/terminal.js +7 -30
  57. package/dist/server/terminal/terminal.js.map +1 -1
  58. package/dist/src/server/agent/activity-curator.js +15 -1
  59. package/dist/src/server/agent/activity-curator.js.map +1 -1
  60. package/dist/src/server/agent/agent-manager.js +383 -337
  61. package/dist/src/server/agent/agent-manager.js.map +1 -1
  62. package/dist/src/server/agent/mcp-server.js +2 -4
  63. package/dist/src/server/agent/mcp-server.js.map +1 -1
  64. package/dist/src/server/agent/provider-launch-config.js +15 -1
  65. package/dist/src/server/agent/provider-launch-config.js.map +1 -1
  66. package/dist/src/server/agent/provider-manifest.js +4 -4
  67. package/dist/src/server/agent/provider-manifest.js.map +1 -1
  68. package/dist/src/server/agent/providers/claude/partial-json.js +3 -3
  69. package/dist/src/server/agent/providers/claude/partial-json.js.map +1 -1
  70. package/dist/src/server/agent/providers/claude/sdk-model-resolver.js +104 -0
  71. package/dist/src/server/agent/providers/claude/sdk-model-resolver.js.map +1 -0
  72. package/dist/src/server/agent/providers/claude-agent.js +382 -451
  73. package/dist/src/server/agent/providers/claude-agent.js.map +1 -1
  74. package/dist/src/server/agent/providers/codex-app-server-agent.js +174 -151
  75. package/dist/src/server/agent/providers/codex-app-server-agent.js.map +1 -1
  76. package/dist/src/server/agent/providers/opencode-agent.js +106 -25
  77. package/dist/src/server/agent/providers/opencode-agent.js.map +1 -1
  78. package/dist/src/server/config.js +1 -5
  79. package/dist/src/server/config.js.map +1 -1
  80. package/dist/src/server/session.js +20 -12
  81. package/dist/src/server/session.js.map +1 -1
  82. package/dist/src/shared/tool-call-display.js +1 -1
  83. package/dist/src/shared/tool-call-display.js.map +1 -1
  84. package/dist/src/terminal/terminal.js +7 -30
  85. package/dist/src/terminal/terminal.js.map +1 -1
  86. package/package.json +4 -5
  87. package/agent-prompt.md +0 -339
  88. package/dist/server/server/agent/providers/claude/model-catalog.d.ts +0 -29
  89. package/dist/server/server/agent/providers/claude/model-catalog.d.ts.map +0 -1
  90. package/dist/server/server/agent/providers/claude/model-catalog.js +0 -70
  91. package/dist/server/server/agent/providers/claude/model-catalog.js.map +0 -1
  92. package/dist/server/server/agent/system-prompt.d.ts +0 -3
  93. package/dist/server/server/agent/system-prompt.d.ts.map +0 -1
  94. package/dist/server/server/agent/system-prompt.js +0 -19
  95. package/dist/server/server/agent/system-prompt.js.map +0 -1
  96. package/dist/server/server/terminal-mcp/index.d.ts +0 -4
  97. package/dist/server/server/terminal-mcp/index.d.ts.map +0 -1
  98. package/dist/server/server/terminal-mcp/index.js +0 -3
  99. package/dist/server/server/terminal-mcp/index.js.map +0 -1
  100. package/dist/server/server/terminal-mcp/server.d.ts +0 -10
  101. package/dist/server/server/terminal-mcp/server.d.ts.map +0 -1
  102. package/dist/server/server/terminal-mcp/server.js +0 -209
  103. package/dist/server/server/terminal-mcp/server.js.map +0 -1
  104. package/dist/server/server/terminal-mcp/terminal-manager.d.ts +0 -123
  105. package/dist/server/server/terminal-mcp/terminal-manager.d.ts.map +0 -1
  106. package/dist/server/server/terminal-mcp/terminal-manager.js +0 -339
  107. package/dist/server/server/terminal-mcp/terminal-manager.js.map +0 -1
  108. package/dist/server/server/terminal-mcp/tmux.d.ts +0 -207
  109. package/dist/server/server/terminal-mcp/tmux.d.ts.map +0 -1
  110. package/dist/server/server/terminal-mcp/tmux.js +0 -821
  111. package/dist/server/server/terminal-mcp/tmux.js.map +0 -1
  112. package/dist/src/server/agent/providers/claude/model-catalog.js +0 -70
  113. 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.eventQueue = null;
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
- for await (const event of events) {
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
- else if (event.type === "turn_completed") {
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
- else if (event.type === "turn_failed") {
1906
- throw new Error(event.error);
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 *stream(prompt, options) {
1918
- const slashCommand = await this.resolveSlashCommandInvocation(prompt);
1919
- if (slashCommand) {
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
- return;
1930
- const queue = new Pushable();
1931
- this.eventQueue = queue;
1932
- try {
1933
- if (this.currentThreadId) {
1934
- await this.ensureThreadLoaded();
1935
- }
1936
- else {
1937
- await this.ensureThread();
1938
- }
1939
- const input = await this.buildUserInput(prompt);
1940
- const preset = MODE_PRESETS[this.currentMode] ?? MODE_PRESETS[DEFAULT_CODEX_MODE_ID];
1941
- const approvalPolicy = this.config.approvalPolicy ?? preset.approvalPolicy;
1942
- const sandboxPolicyType = this.config.sandboxMode ?? preset.sandbox;
1943
- const params = {
1944
- threadId: this.currentThreadId,
1945
- input,
1946
- approvalPolicy,
1947
- sandboxPolicy: toSandboxPolicy(sandboxPolicyType, typeof this.config.networkAccess === "boolean"
1948
- ? this.config.networkAccess
1949
- : preset.networkAccess),
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
- if (this.config.model) {
1952
- params.model = this.config.model;
1953
- }
1954
- const thinkingOptionId = normalizeCodexThinkingOptionId(this.config.thinkingOptionId);
1955
- if (thinkingOptionId) {
1956
- params.effort = thinkingOptionId;
1957
- }
1958
- if (this.resolvedCollaborationMode) {
1959
- params.collaborationMode = {
1960
- mode: this.resolvedCollaborationMode.mode,
1961
- settings: this.resolvedCollaborationMode.settings,
1962
- };
1963
- }
1964
- if (this.config.cwd) {
1965
- params.cwd = this.config.cwd;
1966
- }
1967
- if (options?.outputSchema) {
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
- finally {
2003
- if (this.eventQueue === queue) {
2004
- this.eventQueue = null;
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.eventQueue?.end();
2181
- this.eventQueue = null;
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.eventQueue?.push(event);
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: (parsed.processId ? this.terminalCommandByProcessId.get(parsed.processId) : undefined) ??
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: applyProviderEnv(process.env, this.runtimeSettings),
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
  }