@getpaseo/server 0.1.74 → 0.1.76

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 (233) hide show
  1. package/dist/scripts/supervisor-entrypoint.js +2 -21
  2. package/dist/scripts/supervisor-entrypoint.js.map +1 -1
  3. package/dist/scripts/supervisor-log-config.js +31 -0
  4. package/dist/scripts/supervisor-log-config.js.map +1 -0
  5. package/dist/server/client/daemon-client.d.ts +13 -2
  6. package/dist/server/client/daemon-client.d.ts.map +1 -1
  7. package/dist/server/client/daemon-client.js +36 -0
  8. package/dist/server/client/daemon-client.js.map +1 -1
  9. package/dist/server/server/agent/agent-manager.d.ts +5 -1
  10. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  11. package/dist/server/server/agent/agent-manager.js +152 -22
  12. package/dist/server/server/agent/agent-manager.js.map +1 -1
  13. package/dist/server/server/agent/agent-prompt.d.ts.map +1 -1
  14. package/dist/server/server/agent/agent-prompt.js +27 -0
  15. package/dist/server/server/agent/agent-prompt.js.map +1 -1
  16. package/dist/server/server/agent/agent-sdk-types.d.ts +5 -0
  17. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  18. package/dist/server/server/agent/agent-sdk-types.js +10 -0
  19. package/dist/server/server/agent/agent-sdk-types.js.map +1 -1
  20. package/dist/server/server/agent/foreground-run-state.d.ts +1 -1
  21. package/dist/server/server/agent/foreground-run-state.d.ts.map +1 -1
  22. package/dist/server/server/agent/foreground-run-state.js +2 -4
  23. package/dist/server/server/agent/foreground-run-state.js.map +1 -1
  24. package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
  25. package/dist/server/server/agent/mcp-server.js +74 -3
  26. package/dist/server/server/agent/mcp-server.js.map +1 -1
  27. package/dist/server/server/agent/provider-history-timestamps.d.ts +2 -0
  28. package/dist/server/server/agent/provider-history-timestamps.d.ts.map +1 -0
  29. package/dist/server/server/agent/provider-history-timestamps.js +16 -0
  30. package/dist/server/server/agent/provider-history-timestamps.js.map +1 -0
  31. package/dist/server/server/agent/provider-manifest.d.ts +1 -1
  32. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
  33. package/dist/server/server/agent/provider-manifest.js +17 -3
  34. package/dist/server/server/agent/provider-manifest.js.map +1 -1
  35. package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
  36. package/dist/server/server/agent/provider-registry.js +66 -32
  37. package/dist/server/server/agent/provider-registry.js.map +1 -1
  38. package/dist/server/server/agent/provider-snapshot-manager.d.ts +2 -6
  39. package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -1
  40. package/dist/server/server/agent/provider-snapshot-manager.js +43 -32
  41. package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
  42. package/dist/server/server/agent/providers/acp-agent.d.ts +42 -2
  43. package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
  44. package/dist/server/server/agent/providers/acp-agent.js +182 -28
  45. package/dist/server/server/agent/providers/acp-agent.js.map +1 -1
  46. package/dist/server/server/agent/providers/claude/agent.d.ts +1 -1
  47. package/dist/server/server/agent/providers/claude/agent.d.ts.map +1 -1
  48. package/dist/server/server/agent/providers/claude/agent.js +191 -62
  49. package/dist/server/server/agent/providers/claude/agent.js.map +1 -1
  50. package/dist/server/server/agent/providers/claude/models.d.ts +2 -0
  51. package/dist/server/server/agent/providers/claude/models.d.ts.map +1 -1
  52. package/dist/server/server/agent/providers/claude/models.js +78 -0
  53. package/dist/server/server/agent/providers/claude/models.js.map +1 -1
  54. package/dist/server/server/agent/providers/codex/app-server-transport.d.ts +8 -1
  55. package/dist/server/server/agent/providers/codex/app-server-transport.d.ts.map +1 -1
  56. package/dist/server/server/agent/providers/codex/app-server-transport.js +32 -1
  57. package/dist/server/server/agent/providers/codex/app-server-transport.js.map +1 -1
  58. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -1
  59. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +36 -7
  60. package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -1
  61. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +28 -4
  62. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  63. package/dist/server/server/agent/providers/codex-app-server-agent.js +487 -80
  64. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  65. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +10 -1
  66. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +1 -1
  67. package/dist/server/server/agent/providers/copilot-acp-agent.js +114 -7
  68. package/dist/server/server/agent/providers/copilot-acp-agent.js.map +1 -1
  69. package/dist/server/server/agent/providers/cursor-acp-agent.d.ts +21 -0
  70. package/dist/server/server/agent/providers/cursor-acp-agent.d.ts.map +1 -0
  71. package/dist/server/server/agent/providers/cursor-acp-agent.js +85 -0
  72. package/dist/server/server/agent/providers/cursor-acp-agent.js.map +1 -0
  73. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +13 -0
  74. package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -1
  75. package/dist/server/server/agent/providers/generic-acp-agent.js +209 -2
  76. package/dist/server/server/agent/providers/generic-acp-agent.js.map +1 -1
  77. package/dist/server/server/agent/providers/opencode-agent.d.ts +7 -7
  78. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  79. package/dist/server/server/agent/providers/opencode-agent.js +121 -109
  80. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  81. package/dist/server/server/agent/providers/pi-direct-agent.d.ts +2 -2
  82. package/dist/server/server/agent/providers/pi-direct-agent.d.ts.map +1 -1
  83. package/dist/server/server/agent/providers/pi-direct-agent.js +16 -15
  84. package/dist/server/server/agent/providers/pi-direct-agent.js.map +1 -1
  85. package/dist/server/server/agent/providers/pi-session-recovery-policy.d.ts +22 -0
  86. package/dist/server/server/agent/providers/pi-session-recovery-policy.d.ts.map +1 -0
  87. package/dist/server/server/agent/providers/pi-session-recovery-policy.js +51 -0
  88. package/dist/server/server/agent/providers/pi-session-recovery-policy.js.map +1 -0
  89. package/dist/server/server/agent/providers/provider-runner.d.ts +1 -1
  90. package/dist/server/server/agent/providers/provider-runner.d.ts.map +1 -1
  91. package/dist/server/server/agent/providers/provider-runner.js +2 -1
  92. package/dist/server/server/agent/providers/provider-runner.js.map +1 -1
  93. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts +1 -1
  94. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts.map +1 -1
  95. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +2 -1
  96. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -1
  97. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
  98. package/dist/server/server/agent/stt-manager.d.ts +5 -1
  99. package/dist/server/server/agent/stt-manager.d.ts.map +1 -1
  100. package/dist/server/server/agent/stt-manager.js +3 -2
  101. package/dist/server/server/agent/stt-manager.js.map +1 -1
  102. package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
  103. package/dist/server/server/agent/timeline-projection.js +9 -0
  104. package/dist/server/server/agent/timeline-projection.js.map +1 -1
  105. package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts +40 -0
  106. package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts.map +1 -0
  107. package/dist/server/server/auto-archive-on-merge/archive-if-safe.js +80 -0
  108. package/dist/server/server/auto-archive-on-merge/archive-if-safe.js.map +1 -0
  109. package/dist/server/server/auto-archive-on-merge/index.d.ts +8 -0
  110. package/dist/server/server/auto-archive-on-merge/index.d.ts.map +1 -0
  111. package/dist/server/server/auto-archive-on-merge/index.js +15 -0
  112. package/dist/server/server/auto-archive-on-merge/index.js.map +1 -0
  113. package/dist/server/server/bootstrap.d.ts +6 -0
  114. package/dist/server/server/bootstrap.d.ts.map +1 -1
  115. package/dist/server/server/bootstrap.js +74 -38
  116. package/dist/server/server/bootstrap.js.map +1 -1
  117. package/dist/server/server/checkout/status-projection.d.ts.map +1 -1
  118. package/dist/server/server/checkout/status-projection.js +5 -1
  119. package/dist/server/server/checkout/status-projection.js.map +1 -1
  120. package/dist/server/server/config.d.ts.map +1 -1
  121. package/dist/server/server/config.js +3 -1
  122. package/dist/server/server/config.js.map +1 -1
  123. package/dist/server/server/daemon-config-store.js +1 -0
  124. package/dist/server/server/daemon-config-store.js.map +1 -1
  125. package/dist/server/server/dictation/dictation-stream-manager.d.ts +2 -0
  126. package/dist/server/server/dictation/dictation-stream-manager.d.ts.map +1 -1
  127. package/dist/server/server/dictation/dictation-stream-manager.js +2 -1
  128. package/dist/server/server/dictation/dictation-stream-manager.js.map +1 -1
  129. package/dist/server/server/logger.js +1 -1
  130. package/dist/server/server/logger.js.map +1 -1
  131. package/dist/server/server/loop/rpc-schemas.d.ts +96 -96
  132. package/dist/server/server/loop-service.d.ts +18 -18
  133. package/dist/server/server/paseo-worktree-service.d.ts +3 -1
  134. package/dist/server/server/paseo-worktree-service.d.ts.map +1 -1
  135. package/dist/server/server/paseo-worktree-service.js +55 -18
  136. package/dist/server/server/paseo-worktree-service.js.map +1 -1
  137. package/dist/server/server/persisted-config.d.ts +25 -0
  138. package/dist/server/server/persisted-config.d.ts.map +1 -1
  139. package/dist/server/server/persisted-config.js +3 -0
  140. package/dist/server/server/persisted-config.js.map +1 -1
  141. package/dist/server/server/relay-transport.d.ts +2 -1
  142. package/dist/server/server/relay-transport.d.ts.map +1 -1
  143. package/dist/server/server/relay-transport.js +26 -4
  144. package/dist/server/server/relay-transport.js.map +1 -1
  145. package/dist/server/server/schedule/service.d.ts.map +1 -1
  146. package/dist/server/server/schedule/service.js +14 -1
  147. package/dist/server/server/schedule/service.js.map +1 -1
  148. package/dist/server/server/session.d.ts +9 -0
  149. package/dist/server/server/session.d.ts.map +1 -1
  150. package/dist/server/server/session.js +281 -50
  151. package/dist/server/server/session.js.map +1 -1
  152. package/dist/server/server/speech/providers/local/config.d.ts +5 -0
  153. package/dist/server/server/speech/providers/local/config.d.ts.map +1 -1
  154. package/dist/server/server/speech/providers/local/config.js +35 -0
  155. package/dist/server/server/speech/providers/local/config.js.map +1 -1
  156. package/dist/server/server/speech/speech-config-resolver.d.ts.map +1 -1
  157. package/dist/server/server/speech/speech-config-resolver.js +1 -0
  158. package/dist/server/server/speech/speech-config-resolver.js.map +1 -1
  159. package/dist/server/server/speech/speech-runtime.d.ts +2 -0
  160. package/dist/server/server/speech/speech-runtime.d.ts.map +1 -1
  161. package/dist/server/server/speech/speech-runtime.js +2 -0
  162. package/dist/server/server/speech/speech-runtime.js.map +1 -1
  163. package/dist/server/server/voice/voice-turn-controller.d.ts +1 -0
  164. package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -1
  165. package/dist/server/server/voice/voice-turn-controller.js +1 -1
  166. package/dist/server/server/voice/voice-turn-controller.js.map +1 -1
  167. package/dist/server/server/websocket-server.d.ts.map +1 -1
  168. package/dist/server/server/websocket-server.js +7 -0
  169. package/dist/server/server/websocket-server.js.map +1 -1
  170. package/dist/server/server/workspace-git-service.d.ts +6 -1
  171. package/dist/server/server/workspace-git-service.d.ts.map +1 -1
  172. package/dist/server/server/workspace-git-service.js +27 -4
  173. package/dist/server/server/workspace-git-service.js.map +1 -1
  174. package/dist/server/server/workspace-reconciliation-service.d.ts +4 -2
  175. package/dist/server/server/workspace-reconciliation-service.d.ts.map +1 -1
  176. package/dist/server/server/workspace-reconciliation-service.js +112 -14
  177. package/dist/server/server/workspace-reconciliation-service.js.map +1 -1
  178. package/dist/server/server/workspace-registry.d.ts +6 -1
  179. package/dist/server/server/workspace-registry.d.ts.map +1 -1
  180. package/dist/server/server/workspace-registry.js +11 -0
  181. package/dist/server/server/workspace-registry.js.map +1 -1
  182. package/dist/server/server/worktree-session.d.ts.map +1 -1
  183. package/dist/server/server/worktree-session.js +1 -0
  184. package/dist/server/server/worktree-session.js.map +1 -1
  185. package/dist/server/services/github-service.d.ts +46 -0
  186. package/dist/server/services/github-service.d.ts.map +1 -1
  187. package/dist/server/services/github-service.js +274 -5
  188. package/dist/server/services/github-service.js.map +1 -1
  189. package/dist/server/shared/messages.d.ts +3427 -290
  190. package/dist/server/shared/messages.d.ts.map +1 -1
  191. package/dist/server/shared/messages.js +93 -3
  192. package/dist/server/shared/messages.js.map +1 -1
  193. package/dist/server/shared/terminal-input-mode.d.ts +26 -0
  194. package/dist/server/shared/terminal-input-mode.d.ts.map +1 -0
  195. package/dist/server/shared/terminal-input-mode.js +151 -0
  196. package/dist/server/shared/terminal-input-mode.js.map +1 -0
  197. package/dist/server/terminal/terminal-session-controller.d.ts.map +1 -1
  198. package/dist/server/terminal/terminal-session-controller.js +12 -2
  199. package/dist/server/terminal/terminal-session-controller.js.map +1 -1
  200. package/dist/server/terminal/terminal.d.ts +1 -0
  201. package/dist/server/terminal/terminal.d.ts.map +1 -1
  202. package/dist/server/terminal/terminal.js +16 -3
  203. package/dist/server/terminal/terminal.js.map +1 -1
  204. package/dist/server/terminal/worker-terminal-manager.d.ts.map +1 -1
  205. package/dist/server/terminal/worker-terminal-manager.js +8 -0
  206. package/dist/server/terminal/worker-terminal-manager.js.map +1 -1
  207. package/dist/server/utils/checkout-git.d.ts +4 -1
  208. package/dist/server/utils/checkout-git.d.ts.map +1 -1
  209. package/dist/server/utils/checkout-git.js +85 -29
  210. package/dist/server/utils/checkout-git.js.map +1 -1
  211. package/dist/server/utils/directory-suggestions.d.ts.map +1 -1
  212. package/dist/server/utils/directory-suggestions.js +51 -14
  213. package/dist/server/utils/directory-suggestions.js.map +1 -1
  214. package/dist/server/utils/executable.d.ts.map +1 -1
  215. package/dist/server/utils/executable.js +6 -3
  216. package/dist/server/utils/executable.js.map +1 -1
  217. package/dist/server/utils/run-git-command.d.ts +2 -0
  218. package/dist/server/utils/run-git-command.d.ts.map +1 -1
  219. package/dist/server/utils/run-git-command.js +41 -1
  220. package/dist/server/utils/run-git-command.js.map +1 -1
  221. package/dist/server/utils/worktree.js +1 -1
  222. package/dist/server/utils/worktree.js.map +1 -1
  223. package/dist/src/server/agent/agent-sdk-types.js +10 -0
  224. package/dist/src/server/agent/agent-sdk-types.js.map +1 -1
  225. package/dist/src/server/agent/provider-manifest.js +17 -3
  226. package/dist/src/server/agent/provider-manifest.js.map +1 -1
  227. package/dist/src/server/persisted-config.js +3 -0
  228. package/dist/src/server/persisted-config.js.map +1 -1
  229. package/dist/src/shared/messages.js +93 -3
  230. package/dist/src/shared/messages.js.map +1 -1
  231. package/dist/src/utils/executable.js +6 -3
  232. package/dist/src/utils/executable.js.map +1 -1
  233. package/package.json +3 -3
@@ -38,9 +38,10 @@ import { buildStoredAgentPayload, resolveEffectiveThinkingOptionId, resolveStore
38
38
  import { appendTimelineItemIfAgentKnown, emitLiveTimelineItemIfAgentKnown, } from "./agent/timeline-append.js";
39
39
  import { projectTimelineRows, selectTimelineWindowByProjectedLimit, } from "./agent/timeline-projection.js";
40
40
  import { DEFAULT_STRUCTURED_GENERATION_PROVIDERS, StructuredAgentFallbackError, StructuredAgentResponseError, generateStructuredAgentResponseWithFallback, } from "./agent/agent-response-loop.js";
41
+ import { getAgentStreamEventTurnId, } from "./agent/agent-sdk-types.js";
41
42
  import { ImportSessionsRequestError, importProviderSession, listImportableProviderSessions, normalizeImportAgentRequest, } from "./agent/import-sessions.js";
42
43
  import { checkoutLiteFromGitSnapshot, normalizeWorkspaceId as normalizePersistedWorkspaceId, deriveProjectGroupingName, classifyDirectoryForProjectMembership, deriveWorkspaceDisplayName, } from "./workspace-registry-model.js";
43
- import { createPersistedProjectRecord, createPersistedWorkspaceRecord, } from "./workspace-registry.js";
44
+ import { createPersistedProjectRecord, createPersistedWorkspaceRecord, resolveProjectDisplayName, } from "./workspace-registry.js";
44
45
  import { buildVoiceModeSystemPrompt, stripVoiceModeSystemPrompt, wrapSpokenInput, } from "./voice-config.js";
45
46
  import { isVoicePermissionAllowed } from "./voice-permission-policy.js";
46
47
  import { listDirectoryEntries, readExplorerFile, readExplorerFileBytes, getDownloadableFileInfo, } from "./file-explorer/service.js";
@@ -59,7 +60,7 @@ import { resolveClientMessageId } from "./client-message-id.js";
59
60
  import { ChatServiceError, parseMentionAgentIds, } from "./chat/chat-service.js";
60
61
  import { notifyChatMentions, prepareChatMentionFanout } from "./chat/chat-mentions.js";
61
62
  import { execCommand } from "../utils/spawn.js";
62
- import { createGitHubService, } from "../services/github-service.js";
63
+ import { assertPullRequestAutoMergeDisableReady, assertPullRequestAutoMergeEnableReady, createGitHubService, } from "../services/github-service.js";
63
64
  import { summarizeFetchWorkspacesEntries, WorkspaceDirectory, } from "./workspace-directory.js";
64
65
  import { attemptFirstAgentBranchAutoName, createPaseoWorktree, } from "./paseo-worktree-service.js";
65
66
  import { generateBranchNameFromFirstAgentContext } from "./worktree-branch-name-generator.js";
@@ -322,7 +323,7 @@ export class Session {
322
323
  }
323
324
  },
324
325
  });
325
- const { clientId, appVersion, clientCapabilities, onMessage, onBinaryMessage, onLifecycleIntent, logger, downloadTokenStore, pushTokenStore, paseoHome, agentManager, agentStorage, projectRegistry, workspaceRegistry, chatService, scheduleService, loopService, checkoutDiffManager, github, workspaceGitService, daemonConfigStore, mcpBaseUrl, stt, tts, terminalManager, providerSnapshotManager, scriptRouteStore, scriptRuntimeStore, workspaceSetupSnapshots, onBranchChanged, getDaemonTcpPort, getDaemonTcpHost, resolveScriptHealth, voice, voiceBridge, dictation, agentProviderRuntimeSettings, providerOverrides, isDev, } = options;
326
+ const { clientId, appVersion, clientCapabilities, onMessage, onBinaryMessage, onLifecycleIntent, logger, downloadTokenStore, pushTokenStore, paseoHome, agentManager, agentStorage, projectRegistry, workspaceRegistry, chatService, scheduleService, loopService, checkoutDiffManager, github, workspaceGitService, daemonConfigStore, mcpBaseUrl, stt, sttLanguage, tts, terminalManager, providerSnapshotManager, scriptRouteStore, scriptRuntimeStore, workspaceSetupSnapshots, onBranchChanged, getDaemonTcpPort, getDaemonTcpHost, resolveScriptHealth, voice, voiceBridge, dictation, agentProviderRuntimeSettings, providerOverrides, isDev, } = options;
326
327
  this.clientId = clientId;
327
328
  this.appVersion = appVersion ?? null;
328
329
  this.clientCapabilities = parseClientCapabilities(clientCapabilities);
@@ -367,6 +368,7 @@ export class Session {
367
368
  this.getDaemonTcpPort = getDaemonTcpPort ?? null;
368
369
  this.getDaemonTcpHost = getDaemonTcpHost ?? null;
369
370
  this.resolveScriptHealth = resolveScriptHealth ?? null;
371
+ this.sttLanguage = sttLanguage ?? "en";
370
372
  this.subscribeToOptionalManagers();
371
373
  this.bindVoiceBridges({ voice, voiceBridge, dictation });
372
374
  this.agentProviderRuntimeSettings = agentProviderRuntimeSettings;
@@ -381,11 +383,11 @@ export class Session {
381
383
  isProviderVisibleToClient: (provider) => this.isProviderVisibleToClient(provider),
382
384
  buildWorkspaceDescriptor: (input) => this.buildWorkspaceDescriptor(input),
383
385
  });
384
- this.initializePerSessionManagers({ tts, stt, dictation });
386
+ this.initializePerSessionManagers({ tts, stt, sttLanguage, dictation });
385
387
  // Initialize agent MCP client asynchronously
386
388
  void this.initializeAgentMcp();
387
389
  this.subscribeToAgentEvents();
388
- this.sessionLogger.trace("Session created");
390
+ this.sessionLogger.trace({}, "agent.session.lifecycle.created");
389
391
  }
390
392
  updateAppVersion(appVersion) {
391
393
  if (appVersion && appVersion !== this.appVersion) {
@@ -477,12 +479,17 @@ export class Session {
477
479
  async interruptAgentIfRunning(agentId) {
478
480
  const snapshot = this.agentManager.getAgent(agentId);
479
481
  if (!snapshot) {
480
- this.sessionLogger.trace({ agentId }, "interruptAgentIfRunning: agent not found");
482
+ this.sessionLogger.trace({ agentId }, "agent.session.interrupt.not_found");
481
483
  throw new Error(`Agent ${agentId} not found`);
482
484
  }
483
485
  const hasInFlightRun = this.agentManager.hasInFlightRun(agentId);
484
486
  if (!hasInFlightRun) {
485
- this.sessionLogger.trace({ agentId, lifecycle: snapshot.lifecycle, hasInFlightRun }, "interruptAgentIfRunning: skipping because agent is not running");
487
+ this.sessionLogger.trace({
488
+ agentId,
489
+ provider: snapshot.provider,
490
+ lifecycle: snapshot.lifecycle,
491
+ hasInFlightRun,
492
+ }, "agent.session.interrupt.skip_not_running");
486
493
  return;
487
494
  }
488
495
  this.sessionLogger.debug({ agentId, lifecycle: snapshot.lifecycle, hasInFlightRun }, "interruptAgentIfRunning: interrupting");
@@ -507,14 +514,14 @@ export class Session {
507
514
  agentId,
508
515
  promptType: typeof prompt === "string" ? "string" : "structured",
509
516
  hasRunOptions: Boolean(runOptions),
510
- }, "startAgentStream: requested");
517
+ }, "agent.session.start_stream.request");
511
518
  let iterator;
512
519
  try {
513
520
  const shouldReplace = this.agentManager.hasInFlightRun(agentId);
514
521
  iterator = shouldReplace
515
522
  ? this.agentManager.replaceAgentRun(agentId, prompt, runOptions)
516
523
  : this.agentManager.streamAgent(agentId, prompt, runOptions);
517
- this.sessionLogger.trace({ agentId, shouldReplace }, "startAgentStream: agent iterator returned");
524
+ this.sessionLogger.trace({ agentId, shouldReplace }, "agent.session.start_stream.iterator_returned");
518
525
  }
519
526
  catch (error) {
520
527
  this.handleAgentRunError(agentId, error, "Failed to start agent run");
@@ -525,10 +532,10 @@ export class Session {
525
532
  for await (const _ of iterator) {
526
533
  // Events are forwarded via the session's AgentManager subscription.
527
534
  }
528
- this.sessionLogger.trace({ agentId }, "startAgentStream: iterator drained");
535
+ this.sessionLogger.trace({ agentId }, "agent.session.iterator.drained");
529
536
  }
530
537
  catch (error) {
531
- this.sessionLogger.trace({ agentId, err: error }, "startAgentStream: iterator threw");
538
+ this.sessionLogger.trace({ agentId, err: error }, "agent.session.iterator.error");
532
539
  this.handleAgentRunError(agentId, error, "Agent stream failed");
533
540
  }
534
541
  })();
@@ -562,7 +569,7 @@ export class Session {
562
569
  });
563
570
  this.agentTools = (await this.agentMcpClient.tools());
564
571
  const agentToolCount = Object.keys(this.agentTools ?? {}).length;
565
- this.sessionLogger.trace({ agentToolCount }, `Agent MCP initialized with ${agentToolCount} tools`);
572
+ this.sessionLogger.trace({ agentToolCount }, "agent.session.mcp_init");
566
573
  }
567
574
  catch (error) {
568
575
  this.sessionLogger.error({ err: error }, "Failed to initialize Agent MCP");
@@ -602,14 +609,17 @@ export class Session {
602
609
  this.getSpeechReadiness = dictation?.getSpeechReadiness;
603
610
  }
604
611
  initializePerSessionManagers(params) {
605
- const { tts, stt, dictation } = params;
612
+ const { tts, stt, sttLanguage, dictation } = params;
606
613
  this.ttsManager = new TTSManager(this.sessionId, this.sessionLogger, tts);
607
- this.sttManager = new STTManager(this.sessionId, this.sessionLogger, stt);
614
+ this.sttManager = new STTManager(this.sessionId, this.sessionLogger, stt, {
615
+ language: sttLanguage,
616
+ });
608
617
  this.dictationStreamManager = new DictationStreamManager({
609
618
  logger: this.sessionLogger,
610
619
  sessionId: this.sessionId,
611
620
  emit: (msg) => this.handleDictationManagerMessage(msg),
612
621
  stt: dictation?.stt ?? null,
622
+ language: dictation?.sttLanguage,
613
623
  finalTimeoutMs: dictation?.finalTimeoutMs,
614
624
  });
615
625
  }
@@ -619,6 +629,13 @@ export class Session {
619
629
  }
620
630
  this.unsubscribeAgentEvents = this.agentManager.subscribe((event) => {
621
631
  if (event.type === "agent_state") {
632
+ this.sessionLogger.trace({
633
+ agentId: event.agent.id,
634
+ provider: event.agent.provider,
635
+ providerSessionId: event.agent.persistence?.sessionId ?? undefined,
636
+ turnId: event.agent.activeForegroundTurnId ?? undefined,
637
+ lifecycle: event.agent.lifecycle,
638
+ }, "agent.session.forward_update");
622
639
  void this.forwardAgentUpdate(event.agent);
623
640
  return;
624
641
  }
@@ -642,35 +659,24 @@ export class Session {
642
659
  // Reduce bandwidth/CPU on mobile: only forward high-frequency agent stream events
643
660
  // for the focused agent, with a short grace window while backgrounded.
644
661
  // History catch-up is handled via pull-based `fetch_agent_timeline_request`.
645
- const activity = this.clientActivity;
646
- if (activity?.deviceType === "mobile") {
647
- if (!activity.focusedAgentId) {
648
- return;
649
- }
650
- if (activity.focusedAgentId !== event.agentId) {
651
- return;
652
- }
653
- if (!activity.appVisible) {
654
- const hiddenForMs = Date.now() - activity.appVisibilityChangedAt.getTime();
655
- if (hiddenForMs >= this.MOBILE_BACKGROUND_STREAM_GRACE_MS) {
656
- return;
657
- }
658
- }
662
+ if (this.shouldSkipAgentStreamForward(event.agentId)) {
663
+ return;
659
664
  }
660
665
  const serializedEvent = serializeAgentStreamEvent(event.event);
661
666
  if (!serializedEvent) {
662
667
  return;
663
668
  }
664
- const payload = {
669
+ this.sessionLogger.trace({
665
670
  agentId: event.agentId,
666
- event: serializedEvent,
667
- timestamp: new Date().toISOString(),
668
- ...(typeof event.seq === "number" ? { seq: event.seq } : {}),
669
- ...(typeof event.epoch === "string" ? { epoch: event.epoch } : {}),
670
- };
671
+ provider: event.event.provider,
672
+ turnId: getAgentStreamEventTurnId(event.event),
673
+ seq: event.seq,
674
+ epoch: event.epoch,
675
+ event: event.event,
676
+ }, "agent.session.forward_stream");
671
677
  this.emit({
672
678
  type: "agent_stream",
673
- payload,
679
+ payload: this.buildAgentStreamPayload(event, serializedEvent),
674
680
  });
675
681
  if (event.event.type === "permission_requested") {
676
682
  this.emit({
@@ -694,6 +700,29 @@ export class Session {
694
700
  // Title updates may be applied asynchronously after agent creation.
695
701
  }, { replayState: false });
696
702
  }
703
+ shouldSkipAgentStreamForward(agentId) {
704
+ const activity = this.clientActivity;
705
+ if (activity?.deviceType !== "mobile") {
706
+ return false;
707
+ }
708
+ if (!activity.focusedAgentId || activity.focusedAgentId !== agentId) {
709
+ return true;
710
+ }
711
+ if (activity.appVisible) {
712
+ return false;
713
+ }
714
+ const hiddenForMs = Date.now() - activity.appVisibilityChangedAt.getTime();
715
+ return hiddenForMs >= this.MOBILE_BACKGROUND_STREAM_GRACE_MS;
716
+ }
717
+ buildAgentStreamPayload(event, serializedEvent) {
718
+ return {
719
+ agentId: event.agentId,
720
+ event: serializedEvent,
721
+ timestamp: event.timestamp ?? new Date().toISOString(),
722
+ ...(typeof event.seq === "number" ? { seq: event.seq } : {}),
723
+ ...(typeof event.epoch === "string" ? { epoch: event.epoch } : {}),
724
+ };
725
+ }
697
726
  async buildAgentPayload(agent) {
698
727
  const storedRecord = await this.agentStorage.get(agent.id);
699
728
  const title = storedRecord?.title ?? storedRecord?.config?.title ?? null;
@@ -858,7 +887,7 @@ export class Session {
858
887
  const checkout = buildWorkspaceCheckout(workspace, project);
859
888
  return {
860
889
  projectKey: project.projectId,
861
- projectName: project.displayName,
890
+ projectName: resolveProjectDisplayName(project),
862
891
  checkout,
863
892
  };
864
893
  }
@@ -933,7 +962,10 @@ export class Session {
933
962
  this.peakInflightRequests = this.inflightRequests;
934
963
  }
935
964
  try {
936
- this.sessionLogger.trace({ messageType: msg.type, payloadBytes: JSON.stringify(msg).length }, "inbound message");
965
+ this.sessionLogger.trace({
966
+ messageType: msg.type,
967
+ payloadBytes: JSON.stringify(msg).length,
968
+ }, "agent.session.inbound");
937
969
  try {
938
970
  await this.dispatchInboundMessage(msg);
939
971
  }
@@ -1069,6 +1101,8 @@ export class Session {
1069
1101
  return this.handleCloseItemsRequest(msg);
1070
1102
  case "update_agent_request":
1071
1103
  return this.handleUpdateAgentRequest(msg.agentId, msg.name, msg.labels, msg.requestId);
1104
+ case "project.rename.request":
1105
+ return this.handleProjectRenameRequest(msg.projectId, msg.customName, msg.requestId);
1072
1106
  case "send_agent_message_request":
1073
1107
  return this.handleSendAgentMessageRequest(msg);
1074
1108
  case "wait_for_finish_request":
@@ -1247,6 +1281,8 @@ export class Session {
1247
1281
  return this.handleCheckoutPrCreateRequest(msg);
1248
1282
  case "checkout_pr_merge_request":
1249
1283
  return this.handleCheckoutPrMergeRequest(msg);
1284
+ case "checkout.github.set_auto_merge.request":
1285
+ return this.handleCheckoutGithubSetAutoMergeRequest(msg);
1250
1286
  case "checkout_pr_status_request":
1251
1287
  return this.handleCheckoutPrStatusRequest(msg);
1252
1288
  case "pull_request_timeline_request":
@@ -1641,6 +1677,75 @@ export class Session {
1641
1677
  });
1642
1678
  }
1643
1679
  }
1680
+ async handleProjectRenameRequest(projectId, customName, requestId) {
1681
+ this.sessionLogger.info({ projectId, requestId, hasCustomName: typeof customName === "string" }, "session: project.rename.request");
1682
+ try {
1683
+ const existing = await this.projectRegistry.get(projectId);
1684
+ if (!existing) {
1685
+ this.emit({
1686
+ type: "project.rename.response",
1687
+ payload: {
1688
+ requestId,
1689
+ projectId,
1690
+ accepted: false,
1691
+ customName: null,
1692
+ error: "Project not found",
1693
+ },
1694
+ });
1695
+ return;
1696
+ }
1697
+ const trimmed = customName?.trim() ?? "";
1698
+ const nextCustomName = trimmed.length === 0 ? null : trimmed;
1699
+ await this.projectRegistry.upsert({
1700
+ ...existing,
1701
+ customName: nextCustomName,
1702
+ updatedAt: new Date().toISOString(),
1703
+ });
1704
+ this.emit({
1705
+ type: "project.rename.response",
1706
+ payload: {
1707
+ requestId,
1708
+ projectId,
1709
+ accepted: true,
1710
+ customName: nextCustomName,
1711
+ error: null,
1712
+ },
1713
+ });
1714
+ // Re-emit descriptors for every workspace under this project so the new
1715
+ // resolved name lands in the UI immediately.
1716
+ const workspaces = await this.workspaceRegistry.list();
1717
+ const affectedWorkspaceIds = workspaces
1718
+ .filter((workspace) => workspace.projectId === projectId)
1719
+ .map((workspace) => workspace.workspaceId);
1720
+ if (affectedWorkspaceIds.length > 0) {
1721
+ await this.emitWorkspaceUpdatesForWorkspaceIds(affectedWorkspaceIds, {
1722
+ skipReconcile: true,
1723
+ });
1724
+ }
1725
+ }
1726
+ catch (error) {
1727
+ this.sessionLogger.error({ err: error, projectId, requestId }, "session: project.rename.request error");
1728
+ this.emit({
1729
+ type: "activity_log",
1730
+ payload: {
1731
+ id: uuidv4(),
1732
+ timestamp: new Date(),
1733
+ type: "error",
1734
+ content: `Failed to rename project: ${getErrorMessage(error)}`,
1735
+ },
1736
+ });
1737
+ this.emit({
1738
+ type: "project.rename.response",
1739
+ payload: {
1740
+ requestId,
1741
+ projectId,
1742
+ accepted: false,
1743
+ customName: null,
1744
+ error: getErrorMessageOr(error, "Failed to rename project"),
1745
+ },
1746
+ });
1747
+ }
1748
+ }
1644
1749
  toVoiceFeatureUnavailableContext(state) {
1645
1750
  return {
1646
1751
  reasonCode: state.reasonCode,
@@ -1857,6 +1962,7 @@ export class Session {
1857
1962
  logger: this.sessionLogger.child({ component: "voice-turn-controller" }),
1858
1963
  turnDetection,
1859
1964
  stt,
1965
+ sttLanguage: this.sttLanguage,
1860
1966
  callbacks: {
1861
1967
  onSpeechStarted: async () => {
1862
1968
  this.sessionLogger.debug("Voice VAD speech_started");
@@ -2079,6 +2185,17 @@ export class Session {
2079
2185
  const { handle, overrides, requestId } = msg;
2080
2186
  if (!handle) {
2081
2187
  this.sessionLogger.warn("Resume request missing persistence handle");
2188
+ if (requestId) {
2189
+ this.emit({
2190
+ type: "rpc_error",
2191
+ payload: {
2192
+ requestId,
2193
+ requestType: msg.type,
2194
+ error: "Unable to resume agent: missing persistence handle",
2195
+ code: "agent_resume_failed",
2196
+ },
2197
+ });
2198
+ }
2082
2199
  this.emit({
2083
2200
  type: "activity_log",
2084
2201
  payload: {
@@ -2113,14 +2230,26 @@ export class Session {
2113
2230
  }
2114
2231
  }
2115
2232
  catch (error) {
2233
+ const message = getErrorMessage(error);
2116
2234
  this.sessionLogger.error({ err: error }, "Failed to resume agent");
2235
+ if (requestId) {
2236
+ this.emit({
2237
+ type: "rpc_error",
2238
+ payload: {
2239
+ requestId,
2240
+ requestType: msg.type,
2241
+ error: message,
2242
+ code: "agent_resume_failed",
2243
+ },
2244
+ });
2245
+ }
2117
2246
  this.emit({
2118
2247
  type: "activity_log",
2119
2248
  payload: {
2120
2249
  id: uuidv4(),
2121
2250
  timestamp: new Date(),
2122
2251
  type: "error",
2123
- content: `Failed to resume agent: ${getErrorMessage(error)}`,
2252
+ content: `Failed to resume agent: ${message}`,
2124
2253
  },
2125
2254
  });
2126
2255
  }
@@ -2228,14 +2357,26 @@ export class Session {
2228
2357
  }
2229
2358
  }
2230
2359
  catch (error) {
2360
+ const message = getErrorMessage(error);
2231
2361
  this.sessionLogger.error({ err: error, agentId }, `Failed to refresh agent ${agentId}`);
2362
+ if (requestId) {
2363
+ this.emit({
2364
+ type: "rpc_error",
2365
+ payload: {
2366
+ requestId,
2367
+ requestType: msg.type,
2368
+ error: message,
2369
+ code: "agent_refresh_failed",
2370
+ },
2371
+ });
2372
+ }
2232
2373
  this.emit({
2233
2374
  type: "activity_log",
2234
2375
  payload: {
2235
2376
  id: uuidv4(),
2236
2377
  timestamp: new Date(),
2237
2378
  type: "error",
2238
- content: `Failed to refresh agent: ${getErrorMessage(error)}`,
2379
+ content: `Failed to refresh agent: ${message}`,
2239
2380
  },
2240
2381
  });
2241
2382
  }
@@ -3791,15 +3932,17 @@ export class Session {
3791
3932
  async handleCheckoutPrMergeRequest(msg) {
3792
3933
  const { cwd, requestId } = msg;
3793
3934
  try {
3794
- const snapshot = await this.workspaceGitService.getSnapshot(cwd);
3795
- const prNumber = snapshot.github.pullRequest?.number;
3796
- if (typeof prNumber !== "number") {
3797
- throw new Error("Unable to determine GitHub pull request number for merge");
3798
- }
3935
+ const pullRequest = await this.resolveCurrentPullRequest(cwd, "merge", {
3936
+ force: true,
3937
+ includeGitHub: true,
3938
+ reason: "merge-pr-validation",
3939
+ });
3940
+ this.assertCurrentPullRequestHasGithubMergeFacts(pullRequest);
3799
3941
  await this.github.mergePullRequest({
3800
3942
  cwd,
3801
- prNumber,
3943
+ prNumber: pullRequest.number,
3802
3944
  mergeMethod: msg.mergeMethod,
3945
+ status: pullRequest,
3803
3946
  });
3804
3947
  await this.notifyGitMutation(cwd, "merge-pr", { invalidateGithub: true });
3805
3948
  this.emit({
@@ -3824,6 +3967,81 @@ export class Session {
3824
3967
  });
3825
3968
  }
3826
3969
  }
3970
+ assertCurrentPullRequestHasGithubMergeFacts(pullRequest) {
3971
+ if (!pullRequest.github) {
3972
+ throw new Error("GitHub merge facts are unavailable for this pull request");
3973
+ }
3974
+ }
3975
+ async handleCheckoutGithubSetAutoMergeRequest(msg) {
3976
+ const { cwd, requestId } = msg;
3977
+ try {
3978
+ const pullRequest = await this.resolveCurrentPullRequest(cwd, "auto-merge", {
3979
+ force: true,
3980
+ includeGitHub: true,
3981
+ reason: "auto-merge-validation",
3982
+ });
3983
+ if (msg.enabled) {
3984
+ const mergeMethod = msg.mergeMethod;
3985
+ if (!mergeMethod) {
3986
+ throw new Error("mergeMethod is required when enabling auto-merge");
3987
+ }
3988
+ assertPullRequestAutoMergeEnableReady({
3989
+ mergeMethod,
3990
+ status: pullRequest,
3991
+ });
3992
+ await this.github.enablePullRequestAutoMerge({
3993
+ cwd,
3994
+ prNumber: pullRequest.number,
3995
+ mergeMethod,
3996
+ status: pullRequest,
3997
+ });
3998
+ }
3999
+ else {
4000
+ if (msg.mergeMethod) {
4001
+ throw new Error("mergeMethod is not allowed when disabling auto-merge");
4002
+ }
4003
+ assertPullRequestAutoMergeDisableReady({ status: pullRequest });
4004
+ await this.github.disablePullRequestAutoMerge({
4005
+ cwd,
4006
+ prNumber: pullRequest.number,
4007
+ status: pullRequest,
4008
+ });
4009
+ }
4010
+ await this.notifyGitMutation(cwd, msg.enabled ? "enable-pr-auto-merge" : "disable-pr-auto-merge", {
4011
+ invalidateGithub: true,
4012
+ });
4013
+ this.emit({
4014
+ type: "checkout.github.set_auto_merge.response",
4015
+ payload: {
4016
+ cwd,
4017
+ enabled: msg.enabled,
4018
+ success: true,
4019
+ error: null,
4020
+ requestId,
4021
+ },
4022
+ });
4023
+ }
4024
+ catch (error) {
4025
+ this.emit({
4026
+ type: "checkout.github.set_auto_merge.response",
4027
+ payload: {
4028
+ cwd,
4029
+ enabled: msg.enabled,
4030
+ success: false,
4031
+ error: toCheckoutError(error),
4032
+ requestId,
4033
+ },
4034
+ });
4035
+ }
4036
+ }
4037
+ async resolveCurrentPullRequest(cwd, operation, options) {
4038
+ const snapshot = await this.workspaceGitService.getSnapshot(cwd, options);
4039
+ const pullRequest = snapshot.github.pullRequest;
4040
+ if (!pullRequest || typeof pullRequest.number !== "number") {
4041
+ throw new Error(`Unable to determine GitHub pull request number for ${operation}`);
4042
+ }
4043
+ return { ...pullRequest, number: pullRequest.number };
4044
+ }
3827
4045
  async handleCheckoutPrStatusRequest(msg) {
3828
4046
  const { cwd, requestId } = msg;
3829
4047
  try {
@@ -4361,7 +4579,10 @@ export class Session {
4361
4579
  return {
4362
4580
  id: workspace.workspaceId,
4363
4581
  projectId: workspace.projectId,
4364
- projectDisplayName: resolvedProjectRecord?.displayName ?? workspace.projectId,
4582
+ projectDisplayName: resolvedProjectRecord
4583
+ ? resolveProjectDisplayName(resolvedProjectRecord)
4584
+ : workspace.projectId,
4585
+ projectCustomName: resolvedProjectRecord?.customName ?? null,
4365
4586
  projectRootPath: resolvedProjectRecord?.rootPath ?? workspace.cwd,
4366
4587
  workspaceDirectory: workspace.cwd,
4367
4588
  projectKind: (resolvedProjectRecord?.kind ?? "directory") === "git" ? "git" : "non_git",
@@ -4432,7 +4653,10 @@ export class Session {
4432
4653
  return {
4433
4654
  id: result.workspace.workspaceId,
4434
4655
  projectId: result.workspace.projectId,
4435
- projectDisplayName: projectRecord?.displayName ?? result.workspace.projectId,
4656
+ projectDisplayName: projectRecord
4657
+ ? resolveProjectDisplayName(projectRecord)
4658
+ : result.workspace.projectId,
4659
+ projectCustomName: projectRecord?.customName ?? null,
4436
4660
  projectRootPath: projectRecord?.rootPath ?? result.repoRoot,
4437
4661
  workspaceDirectory: result.workspace.cwd,
4438
4662
  projectKind: "git",
@@ -5459,7 +5683,11 @@ export class Session {
5459
5683
  try {
5460
5684
  const agentId = resolved.agentId;
5461
5685
  const prompt = this.buildAgentPrompt(msg.text, msg.images, msg.attachments);
5462
- this.sessionLogger.trace({ agentId, messageId: msg.messageId, textPrefix: msg.text.slice(0, 80) }, "send_agent_message_request: dispatching shared sendPromptToAgent");
5686
+ this.sessionLogger.trace({
5687
+ agentId,
5688
+ messageId: msg.messageId,
5689
+ textPrefix: msg.text.slice(0, 80),
5690
+ }, "agent.session.send_agent_message");
5463
5691
  let dispatchResult;
5464
5692
  try {
5465
5693
  dispatchResult = await sendPromptToAgent({
@@ -6082,7 +6310,10 @@ export class Session {
6082
6310
  * Emit a message to the client
6083
6311
  */
6084
6312
  emit(msg) {
6085
- this.sessionLogger.trace({ messageType: msg.type, payloadBytes: JSON.stringify(msg).length }, "outbound message");
6313
+ this.sessionLogger.trace({
6314
+ messageType: msg.type,
6315
+ payloadBytes: JSON.stringify(msg).length,
6316
+ }, "agent.session.outbound");
6086
6317
  if (msg.type === "audio_output" &&
6087
6318
  (process.env.TTS_DEBUG_AUDIO_DIR || isPaseoDictationDebugEnabled()) &&
6088
6319
  msg.payload.groupId &&
@@ -6137,7 +6368,7 @@ export class Session {
6137
6368
  * Clean up session resources
6138
6369
  */
6139
6370
  async cleanup() {
6140
- this.sessionLogger.trace("Cleaning up");
6371
+ this.sessionLogger.trace({}, "agent.session.lifecycle.cleanup");
6141
6372
  if (this.unsubscribeAgentEvents) {
6142
6373
  this.unsubscribeAgentEvents();
6143
6374
  this.unsubscribeAgentEvents = null;