@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
@@ -5,20 +5,26 @@ import os from "node:os";
5
5
  import path from "node:path";
6
6
  import { mapClaudeCanceledToolCall, mapClaudeCompletedToolCall, mapClaudeFailedToolCall, mapClaudeRunningToolCall, } from "./tool-call-mapper.js";
7
7
  import { mapTaskNotificationSystemRecordToToolCall, mapTaskNotificationUserContentToToolCall, } from "./task-notification-tool-call.js";
8
- import { getClaudeModels, normalizeClaudeRuntimeModelId } from "./models.js";
8
+ import { getClaudeModelsWithSettings, normalizeClaudeRuntimeModelId } from "./models.js";
9
9
  import { parsePartialJsonObject } from "./partial-json.js";
10
10
  import { ClaudeSidechainTracker } from "./sidechain-tracker.js";
11
11
  import { formatDiagnosticStatus, formatProviderDiagnostic, formatProviderDiagnosticError, toDiagnosticErrorMessage, } from "../diagnostic-utils.js";
12
12
  import { appendOrReplaceGrowingAssistantMessage, runProviderTurn } from "../provider-runner.js";
13
13
  import { renderPromptAttachmentAsText } from "../../prompt-attachments.js";
14
14
  import { claudeQuery } from "./query.js";
15
+ import { normalizeProviderReplayTimestamp } from "../../provider-history-timestamps.js";
16
+ import { getAgentStreamEventTurnId, } from "../../agent-sdk-types.js";
15
17
  import { createProviderEnv, createProviderEnvSpec, } from "../../provider-launch-config.js";
16
18
  import { findExecutable, isCommandAvailable } from "../../../../utils/executable.js";
17
19
  import { withTimeout } from "../../../../utils/promise-timeout.js";
18
20
  import { execCommand } from "../../../../utils/spawn.js";
19
21
  import { getOrchestratorModeInstructions } from "../../orchestrator-instructions.js";
20
22
  const fsPromises = promises;
21
- const CLAUDE_SETTING_SOURCES = ["user", "project"];
23
+ const CLAUDE_SETTING_SOURCES = [
24
+ "user",
25
+ "project",
26
+ "local",
27
+ ];
22
28
  function readNonEmptyString(value) {
23
29
  return typeof value === "string" && value.trim().length > 0 ? value : null;
24
30
  }
@@ -90,6 +96,11 @@ const DEFAULT_MODES = [
90
96
  label: "Always Ask",
91
97
  description: "Prompts for permission the first time a tool is used",
92
98
  },
99
+ {
100
+ id: "auto",
101
+ label: "Auto mode",
102
+ description: "Uses a model classifier to review permission prompts automatically",
103
+ },
93
104
  {
94
105
  id: "acceptEdits",
95
106
  label: "Accept File Edits",
@@ -433,6 +444,34 @@ function isMcpServersRecord(value) {
433
444
  function isPermissionMode(value) {
434
445
  return typeof value === "string" && VALID_CLAUDE_MODES.has(value);
435
446
  }
447
+ function isTruthyEnvValue(value) {
448
+ const normalized = value?.trim().toLowerCase();
449
+ return (normalized !== undefined &&
450
+ normalized.length > 0 &&
451
+ normalized !== "0" &&
452
+ normalized !== "false" &&
453
+ normalized !== "no" &&
454
+ normalized !== "off");
455
+ }
456
+ function detectIneligibleAutoModeTransport(env) {
457
+ if (isTruthyEnvValue(env.CLAUDE_CODE_USE_BEDROCK)) {
458
+ return "Bedrock";
459
+ }
460
+ if (isTruthyEnvValue(env.CLAUDE_CODE_USE_VERTEX)) {
461
+ return "Vertex";
462
+ }
463
+ return null;
464
+ }
465
+ function assertClaudeAutoModeEligible(mode, env) {
466
+ if (mode !== "auto") {
467
+ return;
468
+ }
469
+ const transport = detectIneligibleAutoModeTransport(env);
470
+ if (transport === null) {
471
+ return;
472
+ }
473
+ throw new Error(`Claude Auto mode requires the Anthropic API and is not supported when Claude Code uses ${transport}. Select another permission mode or unset the ${transport === "Bedrock" ? "CLAUDE_CODE_USE_BEDROCK" : "CLAUDE_CODE_USE_VERTEX"} environment variable.`);
474
+ }
436
475
  function coerceSessionMetadata(metadata) {
437
476
  if (!isMetadata(metadata)) {
438
477
  return {};
@@ -837,7 +876,6 @@ export function readEventIdentifiers(message) {
837
876
  ]),
838
877
  };
839
878
  }
840
- const claudeDebug = process.env.PASEO_CLAUDE_DEBUG === "1";
841
879
  export class ClaudeAgentClient {
842
880
  constructor(options) {
843
881
  this.provider = "claude";
@@ -853,6 +891,7 @@ export class ClaudeAgentClient {
853
891
  return new ClaudeAgentSession(claudeConfig, {
854
892
  defaults: this.defaults,
855
893
  runtimeSettings: this.runtimeSettings,
894
+ agentId: launchContext?.agentId,
856
895
  launchEnv: launchContext?.env,
857
896
  persistSession: options?.persistSession,
858
897
  logger: this.logger,
@@ -876,6 +915,7 @@ export class ClaudeAgentClient {
876
915
  defaults: this.defaults,
877
916
  runtimeSettings: this.runtimeSettings,
878
917
  handle,
918
+ agentId: launchContext?.agentId,
879
919
  launchEnv: launchContext?.env,
880
920
  logger: this.logger,
881
921
  queryFactory: this.queryFactory,
@@ -883,8 +923,8 @@ export class ClaudeAgentClient {
883
923
  });
884
924
  }
885
925
  async listModels(_options) {
886
- // Claude exposes a static catalog here; cwd/force are intentionally irrelevant.
887
- return getClaudeModels();
926
+ // Claude exposes a global catalog here; cwd/force are intentionally irrelevant.
927
+ return await getClaudeModelsWithSettings(this.logger);
888
928
  }
889
929
  async listPersistedAgents(options) {
890
930
  const configDir = process.env.CLAUDE_CONFIG_DIR ?? path.join(os.homedir(), ".claude");
@@ -1202,10 +1242,11 @@ class ClaudeAgentSession {
1202
1242
  };
1203
1243
  this.config = config;
1204
1244
  this.launchEnv = options.launchEnv;
1245
+ this.agentId = options.agentId;
1205
1246
  this.defaults = options.defaults;
1206
1247
  this.runtimeSettings = options.runtimeSettings;
1207
1248
  this.persistSession = options.persistSession;
1208
- this.logger = options.logger;
1249
+ this.logger = options.logger.child({ agentId: this.agentId });
1209
1250
  this.queryFactory = options.queryFactory;
1210
1251
  this.resolveBinary = options.resolveBinary;
1211
1252
  const handle = options.handle;
@@ -1357,8 +1398,13 @@ class ClaudeAgentSession {
1357
1398
  const history = this.persistedHistory;
1358
1399
  this.persistedHistory = [];
1359
1400
  this.historyPending = false;
1360
- for (const item of history) {
1361
- yield { type: "timeline", item, provider: "claude" };
1401
+ for (const entry of history) {
1402
+ yield {
1403
+ type: "timeline",
1404
+ item: entry.item,
1405
+ provider: "claude",
1406
+ timestamp: entry.timestamp,
1407
+ };
1362
1408
  }
1363
1409
  }
1364
1410
  async getAvailableModes() {
@@ -1374,6 +1420,7 @@ class ClaudeAgentSession {
1374
1420
  throw new Error(`Invalid mode '${modeId}' for Claude provider. Valid modes: ${validModesList}`);
1375
1421
  }
1376
1422
  const normalized = isPermissionMode(modeId) ? modeId : "default";
1423
+ assertClaudeAutoModeEligible(normalized, this.buildSdkEnv(this.config.extra?.claude));
1377
1424
  const previousMode = this.currentMode;
1378
1425
  const activeQuery = await this.ensureQuery();
1379
1426
  await activeQuery.setPermissionMode(normalized);
@@ -1494,12 +1541,15 @@ class ClaudeAgentSession {
1494
1541
  }
1495
1542
  async close() {
1496
1543
  this.logger.trace({
1497
- claudeSessionId: this.claudeSessionId,
1544
+ agentId: this.agentId,
1545
+ provider: "claude",
1546
+ sessionId: this.claudeSessionId,
1547
+ turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
1498
1548
  turnState: this.turnState,
1499
1549
  hasQuery: Boolean(this.query),
1500
1550
  hasInput: Boolean(this.input),
1501
1551
  hasActiveForegroundTurnId: Boolean(this.activeForegroundTurnId),
1502
- }, "Claude session close: start");
1552
+ }, "provider.claude.session_close.start");
1503
1553
  this.closed = true;
1504
1554
  this.rejectAllPendingPermissions(new Error("Claude session closed"));
1505
1555
  this.cancelCurrentTurn?.();
@@ -1530,7 +1580,12 @@ class ClaudeAgentSession {
1530
1580
  }
1531
1581
  }
1532
1582
  }
1533
- this.logger.trace({ claudeSessionId: this.claudeSessionId, turnState: this.turnState }, "Claude session close: completed");
1583
+ this.logger.trace({
1584
+ agentId: this.agentId,
1585
+ provider: "claude",
1586
+ sessionId: this.claudeSessionId,
1587
+ turnState: this.turnState,
1588
+ }, "provider.claude.session_close.complete");
1534
1589
  }
1535
1590
  async listCommands() {
1536
1591
  const q = await this.ensureQuery();
@@ -1670,9 +1725,9 @@ class ClaudeAgentSession {
1670
1725
  pushUnique(historyIds[idx]);
1671
1726
  }
1672
1727
  for (let idx = this.persistedHistory.length - 1; idx >= 0; idx -= 1) {
1673
- const item = this.persistedHistory[idx];
1674
- if (item?.type === "user_message") {
1675
- pushUnique(item.messageId);
1728
+ const entry = this.persistedHistory[idx];
1729
+ if (entry?.item.type === "user_message") {
1730
+ pushUnique(entry.item.messageId);
1676
1731
  }
1677
1732
  }
1678
1733
  for (let idx = this.userMessageIds.length - 1; idx >= 0; idx -= 1) {
@@ -1763,14 +1818,33 @@ class ClaudeAgentSession {
1763
1818
  }
1764
1819
  async awaitWithTimeout(promise, label) {
1765
1820
  if (!promise) {
1766
- this.logger.trace({ label }, "Claude query operation skipped (no promise)");
1821
+ this.logger.trace({
1822
+ agentId: this.agentId,
1823
+ provider: "claude",
1824
+ sessionId: this.claudeSessionId,
1825
+ turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
1826
+ label,
1827
+ }, "provider.claude.query_operation.skip");
1767
1828
  return;
1768
1829
  }
1769
1830
  const startedAt = Date.now();
1770
- this.logger.trace({ label }, "Claude query operation wait start");
1831
+ this.logger.trace({
1832
+ agentId: this.agentId,
1833
+ provider: "claude",
1834
+ sessionId: this.claudeSessionId,
1835
+ turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
1836
+ label,
1837
+ }, "provider.claude.query_operation.start");
1771
1838
  try {
1772
1839
  await withTimeout(promise, 3000, "timeout");
1773
- this.logger.trace({ label, durationMs: Date.now() - startedAt }, "Claude query operation settled");
1840
+ this.logger.trace({
1841
+ agentId: this.agentId,
1842
+ provider: "claude",
1843
+ sessionId: this.claudeSessionId,
1844
+ turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
1845
+ label,
1846
+ durationMs: Date.now() - startedAt,
1847
+ }, "provider.claude.query_operation.settled");
1774
1848
  }
1775
1849
  catch (error) {
1776
1850
  this.logger.warn({ err: error, label }, "Claude query operation did not settle cleanly");
@@ -1790,11 +1864,8 @@ class ClaudeAgentSession {
1790
1864
  .filter((entry) => typeof entry === "string" && entry.length > 0)
1791
1865
  .join("\n\n");
1792
1866
  }
1793
- async buildOptions() {
1794
- const { thinking, effort } = this.resolveThinkingConfig();
1795
- const appendedSystemPrompt = this.buildAppendedSystemPrompt();
1796
- const extraClaudeOptions = this.config.extra?.claude;
1797
- const sdkEnv = createProviderEnv({
1867
+ buildSdkEnv(extraClaudeOptions) {
1868
+ return createProviderEnv({
1798
1869
  baseEnv: process.env,
1799
1870
  runtimeSettings: this.runtimeSettings,
1800
1871
  overlays: [
@@ -1807,6 +1878,13 @@ class ClaudeAgentSession {
1807
1878
  this.launchEnv,
1808
1879
  ],
1809
1880
  });
1881
+ }
1882
+ async buildOptions() {
1883
+ const { thinking, effort } = this.resolveThinkingConfig();
1884
+ const appendedSystemPrompt = this.buildAppendedSystemPrompt();
1885
+ const extraClaudeOptions = this.config.extra?.claude;
1886
+ const sdkEnv = this.buildSdkEnv(extraClaudeOptions);
1887
+ assertClaudeAutoModeEligible(this.currentMode, sdkEnv);
1810
1888
  const claudeBinary = await this.resolveBinary();
1811
1889
  this.logger.debug({
1812
1890
  claudeBinary,
@@ -2107,7 +2185,13 @@ class ClaudeAgentSession {
2107
2185
  return;
2108
2186
  }
2109
2187
  const pump = this.runQueryPump().catch((error) => {
2110
- this.logger.trace({ err: error }, "Claude query pump exited unexpectedly");
2188
+ this.logger.trace({
2189
+ agentId: this.agentId,
2190
+ provider: "claude",
2191
+ sessionId: this.claudeSessionId,
2192
+ turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
2193
+ err: error,
2194
+ }, "provider.claude.query_pump.exit_unexpected");
2111
2195
  });
2112
2196
  this.queryPumpPromise = pump;
2113
2197
  void pump.finally(() => {
@@ -2122,21 +2206,28 @@ class ClaudeAgentSession {
2122
2206
  activeQuery = await this.ensureQuery();
2123
2207
  }
2124
2208
  catch (error) {
2125
- this.logger.trace({ err: error }, "Failed to initialize Claude query pump");
2209
+ this.logger.trace({
2210
+ agentId: this.agentId,
2211
+ provider: "claude",
2212
+ sessionId: this.claudeSessionId,
2213
+ turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
2214
+ err: error,
2215
+ }, "provider.claude.query_pump.init_failed");
2126
2216
  this.failActiveTurns(error instanceof Error ? error.message : "Claude stream failed");
2127
2217
  return;
2128
2218
  }
2129
2219
  let consecutiveInterruptAbortRecoveries = 0;
2130
2220
  const logRawMessage = (message) => {
2131
- if (!claudeDebug) {
2132
- return;
2133
- }
2134
2221
  this.logger.trace({
2135
- claudeSessionId: this.claudeSessionId,
2222
+ agentId: this.agentId,
2223
+ provider: "claude",
2224
+ sessionId: this.claudeSessionId,
2225
+ turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
2136
2226
  messageType: message.type,
2137
2227
  messageSubtype: "subtype" in message ? message.subtype : undefined,
2138
2228
  messageUuid: "uuid" in message ? message.uuid : undefined,
2139
- }, "Claude query pump: raw SDK message");
2229
+ rawEvent: message,
2230
+ }, "provider.claude.raw_event");
2140
2231
  };
2141
2232
  const handlePumpedMessage = async (message) => {
2142
2233
  logRawMessage(message);
@@ -2234,13 +2325,15 @@ class ClaudeAgentSession {
2234
2325
  }
2235
2326
  const turnId = this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? null;
2236
2327
  const identifiers = readEventIdentifiers(message);
2237
- if (claudeDebug) {
2238
- this.logger.trace({
2239
- claudeSessionId: this.claudeSessionId,
2240
- messageType: message.type,
2241
- turnId,
2242
- }, "Claude query pump: SDK message");
2243
- }
2328
+ this.logger.trace({
2329
+ agentId: this.agentId,
2330
+ provider: "claude",
2331
+ sessionId: this.claudeSessionId,
2332
+ turnId: turnId ?? undefined,
2333
+ messageType: message.type,
2334
+ identifiers,
2335
+ rawEvent: message,
2336
+ }, "provider.claude.parsed_event");
2244
2337
  const messageEvents = this.translateMessageToEvents(message, {
2245
2338
  suppressAssistantText: true,
2246
2339
  suppressReasoning: true,
@@ -2284,7 +2377,6 @@ class ClaudeAgentSession {
2284
2377
  return false;
2285
2378
  }
2286
2379
  this.logger.warn({
2287
- claudeSessionId: this.claudeSessionId,
2288
2380
  error: staleResumeError,
2289
2381
  }, "Claude resumed session no longer exists; invalidating persisted session");
2290
2382
  this.failActiveTurns(staleResumeError);
@@ -2307,7 +2399,12 @@ class ClaudeAgentSession {
2307
2399
  async interruptActiveTurn() {
2308
2400
  const queryToInterrupt = this.query;
2309
2401
  if (!queryToInterrupt || typeof queryToInterrupt.interrupt !== "function") {
2310
- this.logger.trace("interruptActiveTurn: no query to interrupt");
2402
+ this.logger.trace({
2403
+ agentId: this.agentId,
2404
+ provider: "claude",
2405
+ sessionId: this.claudeSessionId,
2406
+ turnId: this.activeForegroundTurnId ?? this.autonomousTurn?.id ?? undefined,
2407
+ }, "provider.claude.interrupt.no_query");
2311
2408
  return;
2312
2409
  }
2313
2410
  this.pendingInterruptAbort = true;
@@ -2415,29 +2512,7 @@ class ClaudeAgentSession {
2415
2512
  return;
2416
2513
  }
2417
2514
  if (message.subtype === "task_notification") {
2418
- // TODO: subagent timelines are best-effort. Subagent task_notifications
2419
- // arrive without parent_tool_use_id but with tool_use_id pointing at the
2420
- // parent's Task call, so they slip past the sidechain router and pollute
2421
- // the parent timeline. Drop them here; eventually thread them into the
2422
- // parent Task tool call's sub_agent log instead.
2423
- const taskUseId = message.tool_use_id;
2424
- const cachedTool = taskUseId ? this.toolUseCache.get(taskUseId) : undefined;
2425
- if (cachedTool?.name === "Task") {
2426
- return;
2427
- }
2428
- const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(message);
2429
- if (taskNotificationItem) {
2430
- events.push({
2431
- type: "timeline",
2432
- item: taskNotificationItem,
2433
- provider: "claude",
2434
- });
2435
- }
2436
- const usage = readUsageFromTaskNotification(message);
2437
- if (typeof usage === "number") {
2438
- this.lastContextWindowUsedTokens = usage;
2439
- events.push(this.createUsageUpdatedEvent(usage));
2440
- }
2515
+ this.appendTaskNotificationEvents(message, events);
2441
2516
  return;
2442
2517
  }
2443
2518
  if (message.subtype === "task_progress") {
@@ -2448,6 +2523,31 @@ class ClaudeAgentSession {
2448
2523
  }
2449
2524
  }
2450
2525
  }
2526
+ appendTaskNotificationEvents(message, events) {
2527
+ // TODO: subagent timelines are best-effort. Subagent task_notifications
2528
+ // arrive without parent_tool_use_id but with tool_use_id pointing at the
2529
+ // parent's Task call, so they slip past the sidechain router and pollute
2530
+ // the parent timeline. Drop them here; eventually thread them into the
2531
+ // parent Task tool call's sub_agent log instead.
2532
+ const taskUseId = message.tool_use_id;
2533
+ const cachedTool = taskUseId ? this.toolUseCache.get(taskUseId) : undefined;
2534
+ if (cachedTool?.name === "Task") {
2535
+ return;
2536
+ }
2537
+ const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(message);
2538
+ if (taskNotificationItem) {
2539
+ events.push({
2540
+ type: "timeline",
2541
+ item: taskNotificationItem,
2542
+ provider: "claude",
2543
+ });
2544
+ }
2545
+ const usage = readUsageFromTaskNotification(message);
2546
+ if (typeof usage === "number") {
2547
+ this.lastContextWindowUsedTokens = usage;
2548
+ events.push(this.createUsageUpdatedEvent(usage));
2549
+ }
2550
+ }
2451
2551
  appendUserMessageEvents(message, events) {
2452
2552
  if (isSyntheticUserEntry(message)) {
2453
2553
  return;
@@ -2521,6 +2621,24 @@ class ClaudeAgentSession {
2521
2621
  appendResultEvents(message, events) {
2522
2622
  const usage = this.convertUsage(message, message.modelUsage);
2523
2623
  if (message.subtype === "success") {
2624
+ // Built-in slash commands (e.g. /voice, /usage, "Unknown command: …")
2625
+ // run client-side in the Claude CLI with no model turn — output_tokens
2626
+ // is 0 and the user-visible text is carried in `result`. Surface it as
2627
+ // an assistant message so the turn doesn't end silently. Normal turns
2628
+ // have output_tokens > 0 and their text is already in the stream.
2629
+ const resultText = typeof message.result === "string" ? message.result.trim() : "";
2630
+ const outputTokens = message.usage?.output_tokens;
2631
+ if (resultText.length > 0 && outputTokens === 0) {
2632
+ events.push({
2633
+ type: "timeline",
2634
+ provider: "claude",
2635
+ item: {
2636
+ type: "assistant_message",
2637
+ text: resultText,
2638
+ messageId: message.uuid,
2639
+ },
2640
+ });
2641
+ }
2524
2642
  events.push({ type: "turn_completed", provider: "claude", usage });
2525
2643
  return;
2526
2644
  }
@@ -2759,6 +2877,13 @@ class ClaudeAgentSession {
2759
2877
  notifySubscribers(event) {
2760
2878
  const turnId = this.activeForegroundTurnId ?? this.autonomousTurn?.id;
2761
2879
  const tagged = turnId ? { ...event, turnId } : event;
2880
+ this.logger.trace({
2881
+ agentId: this.agentId,
2882
+ provider: "claude",
2883
+ sessionId: this.claudeSessionId,
2884
+ turnId: getAgentStreamEventTurnId(tagged),
2885
+ event: tagged,
2886
+ }, "provider.claude.event_emit");
2762
2887
  for (const callback of this.subscribers) {
2763
2888
  try {
2764
2889
  callback(tagged);
@@ -2830,9 +2955,13 @@ class ClaudeAgentSession {
2830
2955
  if (entry.type === "user" && typeof entry.uuid === "string") {
2831
2956
  this.rememberUserMessageId(entry.uuid);
2832
2957
  }
2958
+ const historyTimestamp = normalizeProviderReplayTimestamp(entry.timestamp);
2833
2959
  const items = this.convertHistoryEntry(entry);
2834
2960
  if (items.length > 0) {
2835
- timeline.push(...items);
2961
+ timeline.push(...items.map((item) => ({
2962
+ item,
2963
+ timestamp: historyTimestamp ?? undefined,
2964
+ })));
2836
2965
  }
2837
2966
  }
2838
2967
  resolveHistoryPath(sessionId) {