@getpaseo/server 0.1.69 → 0.1.70

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 (283) hide show
  1. package/dist/server/client/daemon-client-runtime-metrics.js.map +1 -1
  2. package/dist/server/client/daemon-client-websocket-transport.js.map +1 -1
  3. package/dist/server/client/daemon-client.d.ts +33 -0
  4. package/dist/server/client/daemon-client.d.ts.map +1 -1
  5. package/dist/server/client/daemon-client.js +37 -1
  6. package/dist/server/client/daemon-client.js.map +1 -1
  7. package/dist/server/server/agent/agent-manager.d.ts +8 -0
  8. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  9. package/dist/server/server/agent/agent-manager.js +54 -5
  10. package/dist/server/server/agent/agent-manager.js.map +1 -1
  11. package/dist/server/server/agent/agent-response-loop.js.map +1 -1
  12. package/dist/server/server/agent/agent-sdk-types.d.ts +15 -2
  13. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  14. package/dist/server/server/agent/agent-stream-coalescer.d.ts +1 -1
  15. package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -1
  16. package/dist/server/server/agent/agent-timeline-store.js +1 -1
  17. package/dist/server/server/agent/agent-timeline-store.js.map +1 -1
  18. package/dist/server/server/agent/create-agent-mode.d.ts +14 -0
  19. package/dist/server/server/agent/create-agent-mode.d.ts.map +1 -0
  20. package/dist/server/server/agent/create-agent-mode.js +23 -0
  21. package/dist/server/server/agent/create-agent-mode.js.map +1 -0
  22. package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
  23. package/dist/server/server/agent/mcp-server.js +36 -12
  24. package/dist/server/server/agent/mcp-server.js.map +1 -1
  25. package/dist/server/server/agent/mcp-shared.d.ts +6 -2
  26. package/dist/server/server/agent/mcp-shared.d.ts.map +1 -1
  27. package/dist/server/server/agent/mcp-shared.js +12 -5
  28. package/dist/server/server/agent/mcp-shared.js.map +1 -1
  29. package/dist/server/server/agent/pcm16-resampler.js.map +1 -1
  30. package/dist/server/server/agent/prompt-attachments.d.ts.map +1 -1
  31. package/dist/server/server/agent/prompt-attachments.js +2 -0
  32. package/dist/server/server/agent/prompt-attachments.js.map +1 -1
  33. package/dist/server/server/agent/provider-launch-config.js.map +1 -1
  34. package/dist/server/server/agent/provider-manifest.d.ts +4 -1
  35. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
  36. package/dist/server/server/agent/provider-manifest.js +11 -0
  37. package/dist/server/server/agent/provider-manifest.js.map +1 -1
  38. package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
  39. package/dist/server/server/agent/provider-registry.js +8 -3
  40. package/dist/server/server/agent/provider-registry.js.map +1 -1
  41. package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
  42. package/dist/server/server/agent/providers/acp-agent.d.ts +2 -1
  43. package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
  44. package/dist/server/server/agent/providers/acp-agent.js +35 -17
  45. package/dist/server/server/agent/providers/acp-agent.js.map +1 -1
  46. package/dist/server/server/agent/providers/{claude-agent.d.ts → claude/agent.d.ts} +9 -6
  47. package/dist/server/server/agent/providers/claude/agent.d.ts.map +1 -0
  48. package/dist/server/server/agent/providers/{claude-agent.js → claude/agent.js} +170 -152
  49. package/dist/server/server/agent/providers/claude/agent.js.map +1 -0
  50. package/dist/server/server/agent/providers/claude/{claude-models.d.ts → models.d.ts} +1 -1
  51. package/dist/server/server/agent/providers/claude/models.d.ts.map +1 -0
  52. package/dist/server/server/agent/providers/claude/{claude-models.js → models.js} +8 -1
  53. package/dist/server/server/agent/providers/claude/models.js.map +1 -0
  54. package/dist/server/server/agent/providers/claude/query.d.ts +14 -0
  55. package/dist/server/server/agent/providers/claude/query.d.ts.map +1 -0
  56. package/dist/server/server/agent/providers/claude/query.js +84 -0
  57. package/dist/server/server/agent/providers/claude/query.js.map +1 -0
  58. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
  59. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +11 -2
  60. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  61. package/dist/server/server/agent/providers/codex-app-server-agent.js +408 -91
  62. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  63. package/dist/server/server/agent/providers/diagnostic-utils.d.ts.map +1 -1
  64. package/dist/server/server/agent/providers/diagnostic-utils.js +4 -0
  65. package/dist/server/server/agent/providers/diagnostic-utils.js.map +1 -1
  66. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +1 -1
  67. package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -1
  68. package/dist/server/server/agent/providers/generic-acp-agent.js +0 -3
  69. package/dist/server/server/agent/providers/generic-acp-agent.js.map +1 -1
  70. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -1
  71. package/dist/server/server/agent/providers/mock-load-test-agent.js +6 -2
  72. package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -1
  73. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  74. package/dist/server/server/agent/providers/opencode-agent.js +32 -27
  75. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  76. package/dist/server/server/agent/providers/provider-image-output.d.ts +20 -0
  77. package/dist/server/server/agent/providers/provider-image-output.d.ts.map +1 -0
  78. package/dist/server/server/agent/providers/provider-image-output.js +51 -0
  79. package/dist/server/server/agent/providers/provider-image-output.js.map +1 -0
  80. package/dist/server/server/agent/providers/provider-runner.d.ts +3 -3
  81. package/dist/server/server/agent/providers/provider-runner.d.ts.map +1 -1
  82. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -1
  83. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +7 -7
  84. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
  85. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +12 -18
  86. package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -1
  87. package/dist/server/server/agent/stt-manager.d.ts +1 -0
  88. package/dist/server/server/agent/stt-manager.d.ts.map +1 -1
  89. package/dist/server/server/agent/stt-manager.js +3 -0
  90. package/dist/server/server/agent/stt-manager.js.map +1 -1
  91. package/dist/server/server/agent/tool-name-normalization.js.map +1 -1
  92. package/dist/server/server/agent/tts-manager.js.map +1 -1
  93. package/dist/server/server/bootstrap.d.ts +1 -0
  94. package/dist/server/server/bootstrap.d.ts.map +1 -1
  95. package/dist/server/server/bootstrap.js +3 -1
  96. package/dist/server/server/bootstrap.js.map +1 -1
  97. package/dist/server/server/config.d.ts +1 -0
  98. package/dist/server/server/config.d.ts.map +1 -1
  99. package/dist/server/server/config.js +7 -1
  100. package/dist/server/server/config.js.map +1 -1
  101. package/dist/server/server/connection-offer.d.ts +1 -0
  102. package/dist/server/server/connection-offer.d.ts.map +1 -1
  103. package/dist/server/server/daemon-config-store.d.ts.map +1 -1
  104. package/dist/server/server/daemon-config-store.js +2 -6
  105. package/dist/server/server/daemon-config-store.js.map +1 -1
  106. package/dist/server/server/daemon-keypair.js.map +1 -1
  107. package/dist/server/server/daemon-worker.js +3 -0
  108. package/dist/server/server/daemon-worker.js.map +1 -1
  109. package/dist/server/server/editor-targets.js.map +1 -1
  110. package/dist/server/server/json-utils.js.map +1 -1
  111. package/dist/server/server/logger.js.map +1 -1
  112. package/dist/server/server/loop/rpc-schemas.d.ts +68 -0
  113. package/dist/server/server/loop/rpc-schemas.d.ts.map +1 -1
  114. package/dist/server/server/loop/rpc-schemas.js +4 -0
  115. package/dist/server/server/loop/rpc-schemas.js.map +1 -1
  116. package/dist/server/server/loop-service.d.ts +8 -0
  117. package/dist/server/server/loop-service.d.ts.map +1 -1
  118. package/dist/server/server/loop-service.js +11 -2
  119. package/dist/server/server/loop-service.js.map +1 -1
  120. package/dist/server/server/package-version.d.ts +12 -0
  121. package/dist/server/server/package-version.d.ts.map +1 -1
  122. package/dist/server/server/package-version.js +13 -1
  123. package/dist/server/server/package-version.js.map +1 -1
  124. package/dist/server/server/pairing-offer.d.ts +1 -0
  125. package/dist/server/server/pairing-offer.d.ts.map +1 -1
  126. package/dist/server/server/pairing-offer.js +2 -1
  127. package/dist/server/server/pairing-offer.js.map +1 -1
  128. package/dist/server/server/pairing-qr.js +1 -1
  129. package/dist/server/server/pairing-qr.js.map +1 -1
  130. package/dist/server/server/paseo-env.d.ts +7 -3
  131. package/dist/server/server/paseo-env.d.ts.map +1 -1
  132. package/dist/server/server/paseo-env.js +16 -33
  133. package/dist/server/server/paseo-env.js.map +1 -1
  134. package/dist/server/server/persisted-config.d.ts +9 -0
  135. package/dist/server/server/persisted-config.d.ts.map +1 -1
  136. package/dist/server/server/persisted-config.js +1 -0
  137. package/dist/server/server/persisted-config.js.map +1 -1
  138. package/dist/server/server/persistence-hooks.js.map +1 -1
  139. package/dist/server/server/pid-lock.d.ts +21 -4
  140. package/dist/server/server/pid-lock.d.ts.map +1 -1
  141. package/dist/server/server/pid-lock.js +30 -8
  142. package/dist/server/server/pid-lock.js.map +1 -1
  143. package/dist/server/server/relay-transport.d.ts +2 -1
  144. package/dist/server/server/relay-transport.d.ts.map +1 -1
  145. package/dist/server/server/relay-transport.js +8 -5
  146. package/dist/server/server/relay-transport.js.map +1 -1
  147. package/dist/server/server/schedule/rpc-schemas.d.ts +1136 -0
  148. package/dist/server/server/schedule/rpc-schemas.d.ts.map +1 -1
  149. package/dist/server/server/schedule/rpc-schemas.js +39 -0
  150. package/dist/server/server/schedule/rpc-schemas.js.map +1 -1
  151. package/dist/server/server/schedule/service.d.ts +3 -1
  152. package/dist/server/server/schedule/service.d.ts.map +1 -1
  153. package/dist/server/server/schedule/service.js +92 -5
  154. package/dist/server/server/schedule/service.js.map +1 -1
  155. package/dist/server/server/schedule/types.d.ts +16 -0
  156. package/dist/server/server/schedule/types.d.ts.map +1 -1
  157. package/dist/server/server/script-health-monitor.js.map +1 -1
  158. package/dist/server/server/session.d.ts +3 -4
  159. package/dist/server/server/session.d.ts.map +1 -1
  160. package/dist/server/server/session.js +160 -120
  161. package/dist/server/server/session.js.map +1 -1
  162. package/dist/server/server/speech/audio.js.map +1 -1
  163. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +1 -1
  164. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +52 -52
  165. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -1
  166. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +1 -1
  167. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +9 -3
  168. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +1 -1
  169. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -1
  170. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +12 -10
  171. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -1
  172. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +2 -2
  173. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -1
  174. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +1 -1
  175. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -1
  176. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -1
  177. package/dist/server/server/voice/voice-turn-controller.d.ts +16 -13
  178. package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -1
  179. package/dist/server/server/voice/voice-turn-controller.js +303 -71
  180. package/dist/server/server/voice/voice-turn-controller.js.map +1 -1
  181. package/dist/server/server/voice-config.js +1 -1
  182. package/dist/server/server/voice-config.js.map +1 -1
  183. package/dist/server/server/websocket-server.js.map +1 -1
  184. package/dist/server/server/workspace-directory.d.ts.map +1 -1
  185. package/dist/server/server/workspace-directory.js +4 -2
  186. package/dist/server/server/workspace-directory.js.map +1 -1
  187. package/dist/server/server/workspace-git-metadata.d.ts.map +1 -1
  188. package/dist/server/server/workspace-git-metadata.js +12 -5
  189. package/dist/server/server/workspace-git-metadata.js.map +1 -1
  190. package/dist/server/server/workspace-git-service.d.ts +2 -0
  191. package/dist/server/server/workspace-git-service.d.ts.map +1 -1
  192. package/dist/server/server/workspace-git-service.js +49 -1
  193. package/dist/server/server/workspace-git-service.js.map +1 -1
  194. package/dist/server/server/workspace-registry-model.d.ts.map +1 -1
  195. package/dist/server/server/workspace-registry-model.js +10 -3
  196. package/dist/server/server/workspace-registry-model.js.map +1 -1
  197. package/dist/server/server/worktree-session.js +1 -1
  198. package/dist/server/server/worktree-session.js.map +1 -1
  199. package/dist/server/services/github-service.d.ts.map +1 -1
  200. package/dist/server/services/github-service.js +9 -2
  201. package/dist/server/services/github-service.js.map +1 -1
  202. package/dist/server/shared/connection-offer.d.ts +10 -0
  203. package/dist/server/shared/connection-offer.d.ts.map +1 -1
  204. package/dist/server/shared/connection-offer.js +1 -0
  205. package/dist/server/shared/connection-offer.js.map +1 -1
  206. package/dist/server/shared/daemon-endpoints.d.ts +4 -0
  207. package/dist/server/shared/daemon-endpoints.d.ts.map +1 -1
  208. package/dist/server/shared/daemon-endpoints.js +6 -1
  209. package/dist/server/shared/daemon-endpoints.js.map +1 -1
  210. package/dist/server/shared/error-utils.d.ts +11 -0
  211. package/dist/server/shared/error-utils.d.ts.map +1 -0
  212. package/dist/server/shared/error-utils.js +27 -0
  213. package/dist/server/shared/error-utils.js.map +1 -0
  214. package/dist/server/shared/messages.d.ts +6475 -2265
  215. package/dist/server/shared/messages.d.ts.map +1 -1
  216. package/dist/server/shared/messages.js +5 -1
  217. package/dist/server/shared/messages.js.map +1 -1
  218. package/dist/server/shared/tool-call-display.d.ts.map +1 -1
  219. package/dist/server/shared/tool-call-display.js +2 -0
  220. package/dist/server/shared/tool-call-display.js.map +1 -1
  221. package/dist/server/terminal/terminal-manager.d.ts +2 -1
  222. package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
  223. package/dist/server/terminal/terminal-manager.js +2 -1
  224. package/dist/server/terminal/terminal-manager.js.map +1 -1
  225. package/dist/server/terminal/terminal-output-coalescer.js.map +1 -1
  226. package/dist/server/terminal/terminal-session-controller.d.ts.map +1 -1
  227. package/dist/server/terminal/terminal-session-controller.js +2 -0
  228. package/dist/server/terminal/terminal-session-controller.js.map +1 -1
  229. package/dist/server/terminal/terminal.d.ts +1 -1
  230. package/dist/server/terminal/terminal.d.ts.map +1 -1
  231. package/dist/server/terminal/terminal.js +53 -8
  232. package/dist/server/terminal/terminal.js.map +1 -1
  233. package/dist/server/terminal/worker-terminal-manager.js.map +1 -1
  234. package/dist/server/utils/checkout-git.d.ts.map +1 -1
  235. package/dist/server/utils/checkout-git.js +67 -11
  236. package/dist/server/utils/checkout-git.js.map +1 -1
  237. package/dist/server/utils/directory-suggestions.js.map +1 -1
  238. package/dist/server/utils/executable.d.ts +2 -1
  239. package/dist/server/utils/executable.d.ts.map +1 -1
  240. package/dist/server/utils/executable.js +50 -51
  241. package/dist/server/utils/executable.js.map +1 -1
  242. package/dist/server/utils/paseo-config-file.d.ts +1 -1
  243. package/dist/server/utils/paseo-config-file.d.ts.map +1 -1
  244. package/dist/server/utils/spawn.d.ts +2 -0
  245. package/dist/server/utils/spawn.d.ts.map +1 -1
  246. package/dist/server/utils/spawn.js +2 -1
  247. package/dist/server/utils/spawn.js.map +1 -1
  248. package/dist/server/utils/tree-kill.d.ts +18 -0
  249. package/dist/server/utils/tree-kill.d.ts.map +1 -0
  250. package/dist/server/utils/{process-tree.js → tree-kill.js} +14 -33
  251. package/dist/server/utils/tree-kill.js.map +1 -0
  252. package/dist/server/utils/worktree.js.map +1 -1
  253. package/dist/src/server/agent/provider-launch-config.js.map +1 -1
  254. package/dist/src/server/agent/provider-manifest.js +11 -0
  255. package/dist/src/server/agent/provider-manifest.js.map +1 -1
  256. package/dist/src/server/loop/rpc-schemas.js +4 -0
  257. package/dist/src/server/loop/rpc-schemas.js.map +1 -1
  258. package/dist/src/server/paseo-env.js +16 -33
  259. package/dist/src/server/paseo-env.js.map +1 -1
  260. package/dist/src/server/persisted-config.js +1 -0
  261. package/dist/src/server/persisted-config.js.map +1 -1
  262. package/dist/src/server/pid-lock.js +30 -8
  263. package/dist/src/server/pid-lock.js.map +1 -1
  264. package/dist/src/server/schedule/rpc-schemas.js +39 -0
  265. package/dist/src/server/schedule/rpc-schemas.js.map +1 -1
  266. package/dist/src/shared/messages.js +5 -1
  267. package/dist/src/shared/messages.js.map +1 -1
  268. package/dist/src/utils/executable.js +50 -51
  269. package/dist/src/utils/executable.js.map +1 -1
  270. package/dist/src/utils/spawn.js +2 -1
  271. package/dist/src/utils/spawn.js.map +1 -1
  272. package/package.json +5 -4
  273. package/dist/server/server/agent/providers/claude/claude-models.d.ts.map +0 -1
  274. package/dist/server/server/agent/providers/claude/claude-models.js.map +0 -1
  275. package/dist/server/server/agent/providers/claude-agent.d.ts.map +0 -1
  276. package/dist/server/server/agent/providers/claude-agent.js.map +0 -1
  277. package/dist/server/server/voice/fixed-duration-pcm-ring-buffer.d.ts +0 -16
  278. package/dist/server/server/voice/fixed-duration-pcm-ring-buffer.d.ts.map +0 -1
  279. package/dist/server/server/voice/fixed-duration-pcm-ring-buffer.js +0 -35
  280. package/dist/server/server/voice/fixed-duration-pcm-ring-buffer.js.map +0 -1
  281. package/dist/server/utils/process-tree.d.ts +0 -25
  282. package/dist/server/utils/process-tree.d.ts.map +0 -1
  283. package/dist/server/utils/process-tree.js.map +0 -1
@@ -3,20 +3,20 @@ import fs from "node:fs";
3
3
  import { promises } from "node:fs";
4
4
  import os from "node:os";
5
5
  import path from "node:path";
6
- import { query, } from "@anthropic-ai/claude-agent-sdk";
7
- import { mapClaudeCanceledToolCall, mapClaudeCompletedToolCall, mapClaudeFailedToolCall, mapClaudeRunningToolCall, } from "./claude/tool-call-mapper.js";
8
- import { mapTaskNotificationSystemRecordToToolCall, mapTaskNotificationUserContentToToolCall, } from "./claude/task-notification-tool-call.js";
9
- import { getClaudeModels, normalizeClaudeRuntimeModelId } from "./claude/claude-models.js";
10
- import { parsePartialJsonObject } from "./claude/partial-json.js";
11
- import { ClaudeSidechainTracker } from "./claude/sidechain-tracker.js";
12
- import { formatDiagnosticStatus, formatProviderDiagnostic, formatProviderDiagnosticError, toDiagnosticErrorMessage, } from "./diagnostic-utils.js";
13
- import { appendOrReplaceGrowingAssistantMessage, runProviderTurn } from "./provider-runner.js";
14
- import { renderPromptAttachmentAsText } from "../prompt-attachments.js";
15
- import { createProviderEnv, createProviderEnvSpec, } from "../provider-launch-config.js";
16
- import { findExecutable, isCommandAvailable } from "../../../utils/executable.js";
17
- import { withTimeout } from "../../../utils/promise-timeout.js";
18
- import { execCommand, spawnProcess } from "../../../utils/spawn.js";
19
- import { getOrchestratorModeInstructions } from "../orchestrator-instructions.js";
6
+ import { mapClaudeCanceledToolCall, mapClaudeCompletedToolCall, mapClaudeFailedToolCall, mapClaudeRunningToolCall, } from "./tool-call-mapper.js";
7
+ import { mapTaskNotificationSystemRecordToToolCall, mapTaskNotificationUserContentToToolCall, } from "./task-notification-tool-call.js";
8
+ import { getClaudeModels, normalizeClaudeRuntimeModelId } from "./models.js";
9
+ import { parsePartialJsonObject } from "./partial-json.js";
10
+ import { ClaudeSidechainTracker } from "./sidechain-tracker.js";
11
+ import { formatDiagnosticStatus, formatProviderDiagnostic, formatProviderDiagnosticError, toDiagnosticErrorMessage, } from "../diagnostic-utils.js";
12
+ import { appendOrReplaceGrowingAssistantMessage, runProviderTurn } from "../provider-runner.js";
13
+ import { renderPromptAttachmentAsText } from "../../prompt-attachments.js";
14
+ import { claudeQuery } from "./query.js";
15
+ import { createProviderEnv, createProviderEnvSpec, } from "../../provider-launch-config.js";
16
+ import { findExecutable, isCommandAvailable } from "../../../../utils/executable.js";
17
+ import { withTimeout } from "../../../../utils/promise-timeout.js";
18
+ import { execCommand } from "../../../../utils/spawn.js";
19
+ import { getOrchestratorModeInstructions } from "../../orchestrator-instructions.js";
20
20
  const fsPromises = promises;
21
21
  const CLAUDE_SETTING_SOURCES = ["user", "project"];
22
22
  function readNonEmptyString(value) {
@@ -61,6 +61,21 @@ export function normalizeClaudeAskUserQuestionUpdatedInput(updatedInput, fallbac
61
61
  answers: normalizedAnswers,
62
62
  };
63
63
  }
64
+ function isObjectRecord(value) {
65
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
66
+ }
67
+ function toObjectRecord(value) {
68
+ return isObjectRecord(value) ? value : undefined;
69
+ }
70
+ function isUnknownArray(value) {
71
+ return Array.isArray(value);
72
+ }
73
+ function isImageMimeType(value) {
74
+ return (value === "image/jpeg" ||
75
+ value === "image/png" ||
76
+ value === "image/gif" ||
77
+ value === "image/webp");
78
+ }
64
79
  const CLAUDE_CAPABILITIES = {
65
80
  supportsStreaming: true,
66
81
  supportsSessionPersistence: true,
@@ -134,60 +149,6 @@ function extractSessionIdRaw(msg) {
134
149
  return msg.session.id;
135
150
  return "";
136
151
  }
137
- function resolveClaudeSpawnCommand(spawnOptions, runtimeSettings) {
138
- const commandConfig = runtimeSettings?.command;
139
- if (!commandConfig || commandConfig.mode === "default") {
140
- return {
141
- command: spawnOptions.command,
142
- args: [...spawnOptions.args],
143
- };
144
- }
145
- if (commandConfig.mode === "append") {
146
- return {
147
- command: spawnOptions.command,
148
- args: [...spawnOptions.args, ...(commandConfig.args ?? [])],
149
- };
150
- }
151
- return {
152
- command: commandConfig.argv[0],
153
- args: [...commandConfig.argv.slice(1), ...spawnOptions.args],
154
- };
155
- }
156
- function applyRuntimeSettingsToClaudeOptions(options, runtimeSettings, launchEnv) {
157
- return {
158
- ...options,
159
- spawnClaudeCodeProcess: (spawnOptions) => {
160
- const resolved = resolveClaudeSpawnCommand(spawnOptions, runtimeSettings);
161
- // When the SDK passes a default JS runtime ("node"/"bun"), replace it with
162
- // process.execPath — the actual node binary running the daemon. This avoids
163
- // PATH lookup failures in the managed runtime bundle.
164
- // When the SDK passes a native binary path (from pathToClaudeCodeExecutable)
165
- // or the user overrides the command via runtime settings, use that directly.
166
- const isDefaultRuntime = resolved.command === "node" || resolved.command === "bun";
167
- const command = isDefaultRuntime ? process.execPath : resolved.command;
168
- const child = spawnProcess(command, resolved.args, {
169
- cwd: spawnOptions.cwd,
170
- ...createProviderEnvSpec({
171
- baseEnv: spawnOptions.env,
172
- runtimeSettings,
173
- overlays: [launchEnv],
174
- }),
175
- signal: spawnOptions.signal,
176
- stdio: ["pipe", "pipe", "pipe"],
177
- // Bypass cmd.exe on Windows: the SDK passes --mcp-config with inline JSON
178
- // containing double quotes, which cmd.exe mangles (strips quotes, breaks parsing).
179
- // The command is always a resolved binary path, so shell routing is unnecessary.
180
- shell: false,
181
- });
182
- if (typeof options.stderr === "function") {
183
- child.stderr?.on("data", (chunk) => {
184
- options.stderr?.(chunk.toString());
185
- });
186
- }
187
- return child;
188
- },
189
- };
190
- }
191
152
  function isClaudeThinkingEffort(value) {
192
153
  return (value === "low" ||
193
154
  value === "medium" ||
@@ -210,11 +171,11 @@ function summarizeClaudeOptionsForLog(options) {
210
171
  if (typeof systemPromptRaw === "string") {
211
172
  return { mode: "string", preset: null };
212
173
  }
213
- const prompt = systemPromptRaw;
214
- const promptType = typeof prompt.type === "string" ? prompt.type : "custom";
174
+ const prompt = toObjectRecord(systemPromptRaw);
175
+ const promptType = typeof prompt?.type === "string" ? prompt.type : "custom";
215
176
  return {
216
177
  mode: promptType === "preset" ? "preset" : "custom",
217
- preset: typeof prompt.preset === "string" && prompt.preset.length > 0 ? prompt.preset : null,
178
+ preset: typeof prompt?.preset === "string" && prompt.preset.length > 0 ? prompt.preset : null,
218
179
  };
219
180
  })();
220
181
  const mcpServerNames = options.mcpServers ? Object.keys(options.mcpServers).sort() : [];
@@ -276,7 +237,11 @@ function normalizeForDeterministicString(value, seen) {
276
237
  return "[circular]";
277
238
  }
278
239
  seen.add(objectValue);
279
- const record = value;
240
+ const record = toObjectRecord(value);
241
+ if (!record) {
242
+ seen.delete(objectValue);
243
+ return "[invalid]";
244
+ }
280
245
  const normalized = {};
281
246
  for (const key of Object.keys(record).sort()) {
282
247
  normalized[key] = normalizeForDeterministicString(record[key], seen);
@@ -284,7 +249,10 @@ function normalizeForDeterministicString(value, seen) {
284
249
  seen.delete(objectValue);
285
250
  return normalized;
286
251
  }
287
- return String(value);
252
+ if (typeof value === "number" || typeof value === "boolean") {
253
+ return String(value);
254
+ }
255
+ return "[unsupported]";
288
256
  }
289
257
  function deterministicStringify(value) {
290
258
  if (typeof value === "undefined") {
@@ -298,12 +266,13 @@ function deterministicStringify(value) {
298
266
  return JSON.stringify(normalized);
299
267
  }
300
268
  catch {
301
- try {
302
- return String(value);
269
+ if (typeof value === "string") {
270
+ return value;
303
271
  }
304
- catch {
305
- return "[unserializable]";
272
+ if (typeof value === "number" || typeof value === "boolean") {
273
+ return String(value);
306
274
  }
275
+ return "[unserializable]";
307
276
  }
308
277
  }
309
278
  function coerceToolResultContentToString(content) {
@@ -344,20 +313,21 @@ function collectClaudeTextContentParts(content) {
344
313
  const normalized = normalizeClaudeTranscriptText(content);
345
314
  return normalized ? [normalized] : [];
346
315
  }
347
- if (!Array.isArray(content)) {
316
+ if (!isUnknownArray(content)) {
348
317
  return [];
349
318
  }
350
319
  const parts = [];
351
320
  for (const block of content) {
352
- if (!block || typeof block !== "object") {
321
+ const blockRecord = toObjectRecord(block);
322
+ if (!blockRecord) {
353
323
  continue;
354
324
  }
355
- const text = normalizeClaudeTranscriptText(block.text);
325
+ const text = normalizeClaudeTranscriptText(blockRecord.text);
356
326
  if (text) {
357
327
  parts.push(text);
358
328
  continue;
359
329
  }
360
- const input = normalizeClaudeTranscriptText(block.input);
330
+ const input = normalizeClaudeTranscriptText(blockRecord.input);
361
331
  if (input) {
362
332
  parts.push(input);
363
333
  }
@@ -537,6 +507,7 @@ function toClaudeSdkMcpConfig(config) {
537
507
  headers: config.headers,
538
508
  };
539
509
  }
510
+ throw new Error("Unhandled MCP server config type");
540
511
  }
541
512
  function isClaudeContentChunk(value) {
542
513
  return isMetadata(value) && typeof value.type === "string";
@@ -627,7 +598,7 @@ class TimelineAssembler {
627
598
  return this.applyAbsoluteFragments(state, fragments);
628
599
  }
629
600
  consumeStreamEvent(message, runId, messageIdHint) {
630
- const event = message.event;
601
+ const event = toObjectRecord(message.event) ?? {};
631
602
  const eventType = readTrimmedString(event.type);
632
603
  const streamEventMessageId = this.readMessageIdFromStreamEvent(event) ?? messageIdHint;
633
604
  if (eventType === "message_start") {
@@ -810,19 +781,20 @@ class TimelineAssembler {
810
781
  return fragments;
811
782
  }
812
783
  readMessageIdFromAssistantMessage(message) {
813
- const candidate = message;
814
- return (readTrimmedString(candidate.message_id) ?? readTrimmedString(candidate.message?.id) ?? null);
784
+ const candidate = toObjectRecord(message);
785
+ const messageContainer = toObjectRecord(candidate?.message);
786
+ return (readTrimmedString(candidate?.message_id) ?? readTrimmedString(messageContainer?.id) ?? null);
815
787
  }
816
788
  readMessageIdFromStreamEvent(event) {
817
- const message = event.message;
818
- return readTrimmedString(event.message_id) ?? readTrimmedString(message?.id) ?? null;
789
+ const messageContainer = toObjectRecord(event.message);
790
+ return readTrimmedString(event.message_id) ?? readTrimmedString(messageContainer?.id) ?? null;
819
791
  }
820
792
  }
821
793
  function isSyntheticUserEntry(entry) {
822
- if (!entry || typeof entry !== "object") {
794
+ const candidate = toObjectRecord(entry);
795
+ if (!candidate) {
823
796
  return false;
824
797
  }
825
- const candidate = entry;
826
798
  return candidate.isSynthetic === true || candidate.isMeta === true;
827
799
  }
828
800
  function firstTrimmedString(sources) {
@@ -835,11 +807,11 @@ function firstTrimmedString(sources) {
835
807
  return null;
836
808
  }
837
809
  export function readEventIdentifiers(message) {
838
- const root = message;
810
+ const root = toObjectRecord(message) ?? {};
839
811
  const messageType = readTrimmedString(root.type);
840
- const streamEvent = root.event;
841
- const streamEventMessage = streamEvent?.message;
842
- const messageContainer = root.message;
812
+ const streamEvent = toObjectRecord(root.event);
813
+ const streamEventMessage = toObjectRecord(streamEvent?.message);
814
+ const messageContainer = toObjectRecord(root.message);
843
815
  const messageIdFromUuid = messageType === "user" ? root.uuid : undefined;
844
816
  return {
845
817
  taskId: firstTrimmedString([
@@ -873,7 +845,8 @@ export class ClaudeAgentClient {
873
845
  this.defaults = options.defaults;
874
846
  this.logger = options.logger.child({ module: "agent", provider: "claude" });
875
847
  this.runtimeSettings = options.runtimeSettings;
876
- this.queryFactory = options.queryFactory ?? query;
848
+ this.queryFactory = options.queryFactory;
849
+ this.resolveBinary = options.resolveBinary ?? (() => resolveClaudeBinary(this.runtimeSettings));
877
850
  }
878
851
  async createSession(config, launchContext, options) {
879
852
  const claudeConfig = this.assertConfig(config);
@@ -884,6 +857,7 @@ export class ClaudeAgentClient {
884
857
  persistSession: options?.persistSession,
885
858
  logger: this.logger,
886
859
  queryFactory: this.queryFactory,
860
+ resolveBinary: this.resolveBinary,
887
861
  });
888
862
  }
889
863
  async resumeSession(handle, overrides, launchContext) {
@@ -905,6 +879,7 @@ export class ClaudeAgentClient {
905
879
  launchEnv: launchContext?.env,
906
880
  logger: this.logger,
907
881
  queryFactory: this.queryFactory,
882
+ resolveBinary: this.resolveBinary,
908
883
  });
909
884
  }
910
885
  async listModels(_options) {
@@ -929,9 +904,7 @@ export class ClaudeAgentClient {
929
904
  if (command?.mode === "replace") {
930
905
  return await isCommandAvailable(command.argv[0]);
931
906
  }
932
- // Default mode uses @anthropic-ai/claude-agent-sdk's bundled cli.js run
933
- // via process.execPath. No external `claude` binary is required.
934
- return true;
907
+ return await isCommandAvailable("claude");
935
908
  }
936
909
  async getDiagnostic() {
937
910
  try {
@@ -980,6 +953,20 @@ export class ClaudeAgentClient {
980
953
  return { ...config, provider: "claude" };
981
954
  }
982
955
  }
956
+ async function resolveClaudeBinary(runtimeSettings) {
957
+ const command = runtimeSettings?.command;
958
+ if (command?.mode === "replace") {
959
+ const foundOverride = await findExecutable(command.argv[0]);
960
+ if (foundOverride) {
961
+ return foundOverride;
962
+ }
963
+ }
964
+ const found = await findExecutable("claude");
965
+ if (found) {
966
+ return found;
967
+ }
968
+ throw new Error("Claude binary not found. Install Claude Code (https://github.com/anthropics/claude-code) and ensure it is available in your shell PATH.");
969
+ }
983
970
  async function resolveClaudeVersion(runtimeSettings) {
984
971
  const command = runtimeSettings?.command;
985
972
  const envSpec = createProviderEnvSpec({ runtimeSettings });
@@ -1012,11 +999,11 @@ async function resolveClaudeAuth(runtimeSettings) {
1012
999
  });
1013
1000
  }
1014
1001
  catch (error) {
1015
- const err = error;
1016
- return {
1017
- stdout: err.stdout ?? "",
1018
- stderr: err.stderr ?? err.message ?? "",
1019
- };
1002
+ const err = toObjectRecord(error);
1003
+ const stdout = typeof err?.stdout === "string" ? err.stdout : "";
1004
+ const stderr = typeof err?.stderr === "string" ? err.stderr : "";
1005
+ const fallbackMessage = typeof err?.message === "string" ? err.message : "";
1006
+ return { stdout, stderr: stderr || fallbackMessage };
1020
1007
  }
1021
1008
  };
1022
1009
  try {
@@ -1042,15 +1029,17 @@ async function resolveClaudeAuth(runtimeSettings) {
1042
1029
  }
1043
1030
  }
1044
1031
  function extractContextWindowSize(modelUsage) {
1045
- if (!modelUsage || typeof modelUsage !== "object") {
1032
+ const usageRecord = toObjectRecord(modelUsage);
1033
+ if (!usageRecord) {
1046
1034
  return undefined;
1047
1035
  }
1048
1036
  let maxContextWindow;
1049
- for (const value of Object.values(modelUsage)) {
1050
- if (!value || typeof value !== "object") {
1037
+ for (const value of Object.values(usageRecord)) {
1038
+ const valueRecord = toObjectRecord(value);
1039
+ if (!valueRecord) {
1051
1040
  continue;
1052
1041
  }
1053
- const contextWindow = value.contextWindow;
1042
+ const contextWindow = valueRecord.contextWindow;
1054
1043
  if (typeof contextWindow !== "number" ||
1055
1044
  !Number.isFinite(contextWindow) ||
1056
1045
  contextWindow <= 0) {
@@ -1077,8 +1066,8 @@ function readUsageFromTaskNotification(message) {
1077
1066
  return readUsageTotalTokens(message.usage);
1078
1067
  }
1079
1068
  function readStreamRequestInputTokens(event) {
1080
- const messageUsage = event.message?.usage;
1081
- if (!messageUsage || typeof messageUsage !== "object") {
1069
+ const messageUsage = toObjectRecord(toObjectRecord(event.message)?.usage);
1070
+ if (!messageUsage) {
1082
1071
  return undefined;
1083
1072
  }
1084
1073
  const usage = messageUsage;
@@ -1099,7 +1088,7 @@ function readStreamRequestInputTokens(event) {
1099
1088
  return inputTokens + cacheCreationInputTokens + cacheReadInputTokens;
1100
1089
  }
1101
1090
  function readStreamRequestOutputTokens(event) {
1102
- const outputTokens = event.usage?.output_tokens;
1091
+ const outputTokens = toObjectRecord(event.usage)?.output_tokens;
1103
1092
  if (typeof outputTokens !== "number" || !Number.isFinite(outputTokens) || outputTokens < 0) {
1104
1093
  return undefined;
1105
1094
  }
@@ -1217,7 +1206,8 @@ class ClaudeAgentSession {
1217
1206
  this.runtimeSettings = options.runtimeSettings;
1218
1207
  this.persistSession = options.persistSession;
1219
1208
  this.logger = options.logger;
1220
- this.queryFactory = options.queryFactory ?? query;
1209
+ this.queryFactory = options.queryFactory;
1210
+ this.resolveBinary = options.resolveBinary;
1221
1211
  const handle = options.handle;
1222
1212
  if (handle) {
1223
1213
  if (!handle.sessionId) {
@@ -1745,7 +1735,11 @@ class ClaudeAgentSession {
1745
1735
  const options = await this.buildOptions();
1746
1736
  this.logger.debug({ options: summarizeClaudeOptionsForLog(options) }, "claude query");
1747
1737
  this.input = input;
1748
- this.query = this.queryFactory({ prompt: input.iterable, options });
1738
+ this.query = claudeQuery({ prompt: input.iterable, options }, {
1739
+ runtimeSettings: this.runtimeSettings,
1740
+ launchEnv: this.launchEnv,
1741
+ queryFactory: this.queryFactory,
1742
+ });
1749
1743
  // Do not kick off background control-plane queries here. Methods like
1750
1744
  // supportedCommands()/setPermissionMode() may execute immediately after
1751
1745
  // ensureQuery() (for listCommands()/setMode()), and sharing the same query
@@ -1772,12 +1766,7 @@ class ClaudeAgentSession {
1772
1766
  ? this.config.thinkingOptionId
1773
1767
  : undefined;
1774
1768
  if (thinkingOptionId && isClaudeThinkingEffort(thinkingOptionId)) {
1775
- // SDK 0.2.71 types `effort` as 'low' | 'medium' | 'high' | 'max'; Opus 4.7
1776
- // adds 'xhigh' which the binary accepts but the typings don't yet expose.
1777
- return {
1778
- thinking: { type: "adaptive" },
1779
- effort: thinkingOptionId,
1780
- };
1769
+ return { thinking: { type: "adaptive" }, effort: thinkingOptionId };
1781
1770
  }
1782
1771
  return { thinking: undefined, effort: undefined };
1783
1772
  }
@@ -1803,7 +1792,7 @@ class ClaudeAgentSession {
1803
1792
  this.launchEnv,
1804
1793
  ],
1805
1794
  });
1806
- const claudeBinary = await findExecutable("claude");
1795
+ const claudeBinary = await this.resolveBinary();
1807
1796
  this.logger.debug({
1808
1797
  claudeBinary,
1809
1798
  pathEnvKey: resolvePathEnvKey(),
@@ -1821,7 +1810,7 @@ class ClaudeAgentSession {
1821
1810
  allowDangerouslySkipPermissions: true,
1822
1811
  agents: this.defaults?.agents,
1823
1812
  canUseTool: this.handlePermissionRequest,
1824
- ...(claudeBinary ? { pathToClaudeCodeExecutable: claudeBinary } : {}),
1813
+ pathToClaudeCodeExecutable: claudeBinary,
1825
1814
  // Use Claude Code preset system prompt and load CLAUDE.md files
1826
1815
  // Append provider-agnostic system prompt and orchestrator instructions for agents.
1827
1816
  systemPrompt: {
@@ -1861,10 +1850,7 @@ class ClaudeAgentSession {
1861
1850
  ...this.runtimeSettings.disallowedTools,
1862
1851
  ];
1863
1852
  }
1864
- return this.applyRuntimeSettings(base);
1865
- }
1866
- applyRuntimeSettings(options) {
1867
- return applyRuntimeSettingsToClaudeOptions(options, this.runtimeSettings, this.launchEnv);
1853
+ return base;
1868
1854
  }
1869
1855
  normalizeMcpServers(servers) {
1870
1856
  const result = {};
@@ -1881,14 +1867,16 @@ class ClaudeAgentSession {
1881
1867
  content.push({ type: "text", text: chunk.text });
1882
1868
  }
1883
1869
  else if (chunk.type === "image") {
1884
- content.push({
1885
- type: "image",
1886
- source: {
1887
- type: "base64",
1888
- media_type: chunk.mimeType,
1889
- data: chunk.data,
1890
- },
1891
- });
1870
+ if (isImageMimeType(chunk.mimeType)) {
1871
+ content.push({
1872
+ type: "image",
1873
+ source: {
1874
+ type: "base64",
1875
+ media_type: chunk.mimeType,
1876
+ data: chunk.data,
1877
+ },
1878
+ });
1879
+ }
1892
1880
  }
1893
1881
  else {
1894
1882
  content.push({ type: "text", text: renderPromptAttachmentAsText(chunk) });
@@ -2107,7 +2095,7 @@ class ClaudeAgentSession {
2107
2095
  this.logger.trace({ err: error }, "Claude query pump exited unexpectedly");
2108
2096
  });
2109
2097
  this.queryPumpPromise = pump;
2110
- pump.finally(() => {
2098
+ void pump.finally(() => {
2111
2099
  if (this.queryPumpPromise === pump) {
2112
2100
  this.queryPumpPromise = null;
2113
2101
  }
@@ -2386,7 +2374,7 @@ class ClaudeAgentSession {
2386
2374
  return;
2387
2375
  }
2388
2376
  if (message.subtype === "status") {
2389
- const status = message.status;
2377
+ const status = toObjectRecord(message)?.status;
2390
2378
  if (status === "compacting") {
2391
2379
  this.compacting = true;
2392
2380
  events.push({
@@ -2412,6 +2400,16 @@ class ClaudeAgentSession {
2412
2400
  return;
2413
2401
  }
2414
2402
  if (message.subtype === "task_notification") {
2403
+ // TODO: subagent timelines are best-effort. Subagent task_notifications
2404
+ // arrive without parent_tool_use_id but with tool_use_id pointing at the
2405
+ // parent's Task call, so they slip past the sidechain router and pollute
2406
+ // the parent timeline. Drop them here; eventually thread them into the
2407
+ // parent Task tool call's sub_agent log instead.
2408
+ const taskUseId = message.tool_use_id;
2409
+ const cachedTool = taskUseId ? this.toolUseCache.get(taskUseId) : undefined;
2410
+ if (cachedTool?.name === "Task") {
2411
+ return;
2412
+ }
2415
2413
  const taskNotificationItem = mapTaskNotificationSystemRecordToToolCall(message);
2416
2414
  if (taskNotificationItem) {
2417
2415
  events.push({
@@ -2523,8 +2521,12 @@ class ClaudeAgentSession {
2523
2521
  };
2524
2522
  }
2525
2523
  captureSessionIdFromMessage(message) {
2526
- const msg = message;
2527
- const sessionId = extractSessionIdRaw(msg).trim();
2524
+ const msgRecord = toObjectRecord(message) ?? {};
2525
+ const sessionId = extractSessionIdRaw({
2526
+ session_id: msgRecord.session_id,
2527
+ sessionId: msgRecord.sessionId,
2528
+ session: isObjectRecord(msgRecord.session) ? { id: msgRecord.session.id } : null,
2529
+ }).trim();
2528
2530
  if (!sessionId) {
2529
2531
  return { threadStartedSessionId: null, notice: null };
2530
2532
  }
@@ -2552,8 +2554,12 @@ class ClaudeAgentSession {
2552
2554
  if (message.subtype !== "init") {
2553
2555
  return { threadStartedSessionId: null, notice: null };
2554
2556
  }
2555
- const msg = message;
2556
- const newSessionId = extractSessionIdRaw(msg).trim();
2557
+ const msgRecord = toObjectRecord(message) ?? {};
2558
+ const newSessionId = extractSessionIdRaw({
2559
+ session_id: msgRecord.session_id,
2560
+ sessionId: msgRecord.sessionId,
2561
+ session: isObjectRecord(msgRecord.session) ? { id: msgRecord.session.id } : null,
2562
+ }).trim();
2557
2563
  if (!newSessionId) {
2558
2564
  return { threadStartedSessionId: null, notice: null };
2559
2565
  }
@@ -2676,10 +2682,10 @@ class ClaudeAgentSession {
2676
2682
  };
2677
2683
  }
2678
2684
  trackStreamEventUsage(event) {
2679
- if (!event || typeof event !== "object") {
2685
+ const streamEvent = toObjectRecord(event);
2686
+ if (!streamEvent) {
2680
2687
  return null;
2681
2688
  }
2682
- const streamEvent = event;
2683
2689
  const eventType = readTrimmedString(streamEvent.type);
2684
2690
  if (eventType === "message_start") {
2685
2691
  const inputTokens = readStreamRequestInputTokens(streamEvent);
@@ -2793,7 +2799,12 @@ class ClaudeAgentSession {
2793
2799
  }
2794
2800
  let entry;
2795
2801
  try {
2796
- entry = JSON.parse(trimmed);
2802
+ const parsed = JSON.parse(trimmed);
2803
+ const record = toObjectRecord(parsed);
2804
+ if (!record) {
2805
+ return;
2806
+ }
2807
+ entry = record;
2797
2808
  }
2798
2809
  catch {
2799
2810
  return;
@@ -3334,12 +3345,20 @@ function hasToolLikeBlock(block) {
3334
3345
  return type.includes("tool");
3335
3346
  }
3336
3347
  function readCompactionMetadata(source) {
3337
- const candidates = [source.compact_metadata, source.compactMetadata, source.compactionMetadata];
3348
+ const sourceRecord = toObjectRecord(source);
3349
+ if (!sourceRecord) {
3350
+ return null;
3351
+ }
3352
+ const candidates = [
3353
+ sourceRecord.compact_metadata,
3354
+ sourceRecord.compactMetadata,
3355
+ sourceRecord.compactionMetadata,
3356
+ ];
3338
3357
  for (const candidate of candidates) {
3339
- if (!candidate || typeof candidate !== "object") {
3358
+ const metadata = toObjectRecord(candidate);
3359
+ if (!metadata) {
3340
3360
  continue;
3341
3361
  }
3342
- const metadata = candidate;
3343
3362
  const trigger = typeof metadata.trigger === "string" ? metadata.trigger : undefined;
3344
3363
  const preTokensRaw = metadata.preTokens ?? metadata.pre_tokens;
3345
3364
  const preTokens = typeof preTokensRaw === "number" ? preTokensRaw : undefined;
@@ -3529,10 +3548,10 @@ function isFinishedAccumulator(acc) {
3529
3548
  return Boolean(acc.sessionId && acc.cwd && acc.title);
3530
3549
  }
3531
3550
  function applyClaudeSessionEntryToAccumulator(entryRaw, acc) {
3532
- if (!entryRaw || typeof entryRaw !== "object") {
3551
+ const entry = toObjectRecord(entryRaw);
3552
+ if (!entry) {
3533
3553
  return;
3534
3554
  }
3535
- const entry = entryRaw;
3536
3555
  if (entry.isSidechain) {
3537
3556
  return;
3538
3557
  }
@@ -3616,10 +3635,10 @@ async function parseClaudeSessionDescriptor(filePath, mtime) {
3616
3635
  };
3617
3636
  }
3618
3637
  function extractClaudeUserText(messageRaw) {
3619
- if (!messageRaw || typeof messageRaw !== "object") {
3638
+ const message = toObjectRecord(messageRaw);
3639
+ if (!message) {
3620
3640
  return null;
3621
3641
  }
3622
- const message = messageRaw;
3623
3642
  if (typeof message.content === "string") {
3624
3643
  const normalized = message.content.trim();
3625
3644
  return normalized && !isClaudeTranscriptNoiseText(normalized) ? normalized : null;
@@ -3628,12 +3647,11 @@ function extractClaudeUserText(messageRaw) {
3628
3647
  const normalized = message.text.trim();
3629
3648
  return normalized && !isClaudeTranscriptNoiseText(normalized) ? normalized : null;
3630
3649
  }
3631
- if (Array.isArray(message.content)) {
3650
+ if (isUnknownArray(message.content)) {
3632
3651
  for (const block of message.content) {
3633
- if (block &&
3634
- typeof block === "object" &&
3635
- typeof block.text === "string") {
3636
- const normalized = block.text.trim();
3652
+ const blockRecord = toObjectRecord(block);
3653
+ if (blockRecord && typeof blockRecord.text === "string") {
3654
+ const normalized = blockRecord.text.trim();
3637
3655
  if (normalized && !isClaudeTranscriptNoiseText(normalized)) {
3638
3656
  return normalized;
3639
3657
  }
@@ -3642,4 +3660,4 @@ function extractClaudeUserText(messageRaw) {
3642
3660
  }
3643
3661
  return null;
3644
3662
  }
3645
- //# sourceMappingURL=claude-agent.js.map
3663
+ //# sourceMappingURL=agent.js.map