@getpaseo/server 0.1.63 → 0.1.66

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 (265) hide show
  1. package/dist/server/client/daemon-client-transport-types.d.ts +2 -0
  2. package/dist/server/client/daemon-client-transport-types.d.ts.map +1 -1
  3. package/dist/server/client/daemon-client-websocket-transport.d.ts +2 -1
  4. package/dist/server/client/daemon-client-websocket-transport.d.ts.map +1 -1
  5. package/dist/server/client/daemon-client-websocket-transport.js +4 -4
  6. package/dist/server/client/daemon-client-websocket-transport.js.map +1 -1
  7. package/dist/server/client/daemon-client.d.ts +30 -20
  8. package/dist/server/client/daemon-client.d.ts.map +1 -1
  9. package/dist/server/client/daemon-client.js +206 -98
  10. package/dist/server/client/daemon-client.js.map +1 -1
  11. package/dist/server/client/terminal-stream-router.d.ts +24 -0
  12. package/dist/server/client/terminal-stream-router.d.ts.map +1 -0
  13. package/dist/server/client/terminal-stream-router.js +100 -0
  14. package/dist/server/client/terminal-stream-router.js.map +1 -0
  15. package/dist/server/server/agent/activity-curator.d.ts +6 -3
  16. package/dist/server/server/agent/activity-curator.d.ts.map +1 -1
  17. package/dist/server/server/agent/activity-curator.js +45 -138
  18. package/dist/server/server/agent/activity-curator.js.map +1 -1
  19. package/dist/server/server/agent/agent-manager.d.ts +3 -14
  20. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  21. package/dist/server/server/agent/agent-manager.js +75 -140
  22. package/dist/server/server/agent/agent-manager.js.map +1 -1
  23. package/dist/server/server/agent/agent-metadata-generator.d.ts +0 -5
  24. package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -1
  25. package/dist/server/server/agent/agent-metadata-generator.js +3 -93
  26. package/dist/server/server/agent/agent-metadata-generator.js.map +1 -1
  27. package/dist/server/server/agent/agent-sdk-types.d.ts +15 -1
  28. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  29. package/dist/server/server/agent/agent-stream-coalescer.d.ts +1 -1
  30. package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -1
  31. package/dist/server/server/agent/agent-stream-coalescer.js +1 -1
  32. package/dist/server/server/agent/agent-stream-coalescer.js.map +1 -1
  33. package/dist/server/server/agent/agent-timeline-store.d.ts.map +1 -1
  34. package/dist/server/server/agent/agent-timeline-store.js +29 -32
  35. package/dist/server/server/agent/agent-timeline-store.js.map +1 -1
  36. package/dist/server/server/agent/foreground-run-state.d.ts +50 -0
  37. package/dist/server/server/agent/foreground-run-state.d.ts.map +1 -0
  38. package/dist/server/server/agent/foreground-run-state.js +162 -0
  39. package/dist/server/server/agent/foreground-run-state.js.map +1 -0
  40. package/dist/server/server/agent/mcp-server.d.ts +5 -3
  41. package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
  42. package/dist/server/server/agent/mcp-server.js +110 -99
  43. package/dist/server/server/agent/mcp-server.js.map +1 -1
  44. package/dist/server/server/agent/mcp-shared.d.ts.map +1 -1
  45. package/dist/server/server/agent/mcp-shared.js +7 -1
  46. package/dist/server/server/agent/mcp-shared.js.map +1 -1
  47. package/dist/server/server/agent/prompt-attachments.d.ts +4 -3
  48. package/dist/server/server/agent/prompt-attachments.d.ts.map +1 -1
  49. package/dist/server/server/agent/prompt-attachments.js +43 -4
  50. package/dist/server/server/agent/prompt-attachments.js.map +1 -1
  51. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
  52. package/dist/server/server/agent/provider-manifest.js +7 -0
  53. package/dist/server/server/agent/provider-manifest.js.map +1 -1
  54. package/dist/server/server/agent/providers/acp-agent.d.ts +38 -1
  55. package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
  56. package/dist/server/server/agent/providers/acp-agent.js +257 -140
  57. package/dist/server/server/agent/providers/acp-agent.js.map +1 -1
  58. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts.map +1 -1
  59. package/dist/server/server/agent/providers/claude/sidechain-tracker.js +1 -1
  60. package/dist/server/server/agent/providers/claude/sidechain-tracker.js.map +1 -1
  61. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -1
  62. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +68 -198
  63. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
  64. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  65. package/dist/server/server/agent/providers/claude-agent.js +52 -102
  66. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  67. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -1
  68. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +125 -141
  69. package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -1
  70. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +36 -6
  71. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  72. package/dist/server/server/agent/providers/codex-app-server-agent.js +374 -219
  73. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  74. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +6 -2
  75. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -1
  76. package/dist/server/server/agent/providers/mock-load-test-agent.js +294 -113
  77. package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -1
  78. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +1 -1
  79. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts.map +1 -1
  80. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +94 -2
  81. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js.map +1 -1
  82. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +1 -1
  83. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +24 -115
  84. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js.map +1 -1
  85. package/dist/server/server/agent/providers/opencode-agent.d.ts +102 -1
  86. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  87. package/dist/server/server/agent/providers/opencode-agent.js +416 -158
  88. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  89. package/dist/server/server/agent/providers/provider-runner.d.ts +27 -0
  90. package/dist/server/server/agent/providers/provider-runner.d.ts.map +1 -0
  91. package/dist/server/server/agent/providers/provider-runner.js +80 -0
  92. package/dist/server/server/agent/providers/provider-runner.js.map +1 -0
  93. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +6 -3
  94. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
  95. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +2 -0
  96. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -1
  97. package/dist/server/server/agent/providers/tool-call-mapper-utils.js +31 -0
  98. package/dist/server/server/agent/providers/tool-call-mapper-utils.js.map +1 -1
  99. package/dist/server/server/agent/timeline-projection.d.ts +21 -5
  100. package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
  101. package/dist/server/server/agent/timeline-projection.js +59 -9
  102. package/dist/server/server/agent/timeline-projection.js.map +1 -1
  103. package/dist/server/server/auth.d.ts +25 -0
  104. package/dist/server/server/auth.d.ts.map +1 -0
  105. package/dist/server/server/auth.js +93 -0
  106. package/dist/server/server/auth.js.map +1 -0
  107. package/dist/server/server/bootstrap.d.ts +3 -1
  108. package/dist/server/server/bootstrap.d.ts.map +1 -1
  109. package/dist/server/server/bootstrap.js +87 -30
  110. package/dist/server/server/bootstrap.js.map +1 -1
  111. package/dist/server/server/config.d.ts.map +1 -1
  112. package/dist/server/server/config.js +11 -0
  113. package/dist/server/server/config.js.map +1 -1
  114. package/dist/server/server/exports.d.ts +7 -1
  115. package/dist/server/server/exports.d.ts.map +1 -1
  116. package/dist/server/server/exports.js +6 -1
  117. package/dist/server/server/exports.js.map +1 -1
  118. package/dist/server/server/file-explorer/service.d.ts +10 -0
  119. package/dist/server/server/file-explorer/service.d.ts.map +1 -1
  120. package/dist/server/server/file-explorer/service.js +38 -4
  121. package/dist/server/server/file-explorer/service.js.map +1 -1
  122. package/dist/server/server/index.js +9 -6
  123. package/dist/server/server/index.js.map +1 -1
  124. package/dist/server/server/logger.d.ts.map +1 -1
  125. package/dist/server/server/logger.js +15 -1
  126. package/dist/server/server/logger.js.map +1 -1
  127. package/dist/server/server/pagination/cursor.d.ts +16 -0
  128. package/dist/server/server/pagination/cursor.d.ts.map +1 -0
  129. package/dist/server/server/pagination/cursor.js +62 -0
  130. package/dist/server/server/pagination/cursor.js.map +1 -0
  131. package/dist/server/server/pagination/sortable-pager.d.ts +24 -0
  132. package/dist/server/server/pagination/sortable-pager.d.ts.map +1 -0
  133. package/dist/server/server/pagination/sortable-pager.js +68 -0
  134. package/dist/server/server/pagination/sortable-pager.js.map +1 -0
  135. package/dist/server/server/paseo-worktree-archive-service.d.ts +3 -1
  136. package/dist/server/server/paseo-worktree-archive-service.d.ts.map +1 -1
  137. package/dist/server/server/paseo-worktree-archive-service.js +61 -53
  138. package/dist/server/server/paseo-worktree-archive-service.js.map +1 -1
  139. package/dist/server/server/paseo-worktree-service.d.ts +13 -0
  140. package/dist/server/server/paseo-worktree-service.d.ts.map +1 -1
  141. package/dist/server/server/paseo-worktree-service.js +72 -3
  142. package/dist/server/server/paseo-worktree-service.js.map +1 -1
  143. package/dist/server/server/persisted-config.d.ts +25 -0
  144. package/dist/server/server/persisted-config.d.ts.map +1 -1
  145. package/dist/server/server/persisted-config.js +9 -0
  146. package/dist/server/server/persisted-config.js.map +1 -1
  147. package/dist/server/server/relay-transport.d.ts.map +1 -1
  148. package/dist/server/server/relay-transport.js +16 -4
  149. package/dist/server/server/relay-transport.js.map +1 -1
  150. package/dist/server/server/resolve-worktree-creation-intent.d.ts +0 -10
  151. package/dist/server/server/resolve-worktree-creation-intent.d.ts.map +1 -1
  152. package/dist/server/server/resolve-worktree-creation-intent.js +1 -45
  153. package/dist/server/server/resolve-worktree-creation-intent.js.map +1 -1
  154. package/dist/server/server/script-status-projection.d.ts +6 -1
  155. package/dist/server/server/script-status-projection.d.ts.map +1 -1
  156. package/dist/server/server/script-status-projection.js +12 -3
  157. package/dist/server/server/script-status-projection.js.map +1 -1
  158. package/dist/server/server/session.d.ts +19 -51
  159. package/dist/server/server/session.d.ts.map +1 -1
  160. package/dist/server/server/session.js +354 -1069
  161. package/dist/server/server/session.js.map +1 -1
  162. package/dist/server/server/websocket-server.d.ts +4 -2
  163. package/dist/server/server/websocket-server.d.ts.map +1 -1
  164. package/dist/server/server/websocket-server.js +65 -12
  165. package/dist/server/server/websocket-server.js.map +1 -1
  166. package/dist/server/server/workspace-directory.d.ts +69 -0
  167. package/dist/server/server/workspace-directory.d.ts.map +1 -0
  168. package/dist/server/server/workspace-directory.js +229 -0
  169. package/dist/server/server/workspace-directory.js.map +1 -0
  170. package/dist/server/server/worktree-bootstrap.d.ts.map +1 -1
  171. package/dist/server/server/worktree-bootstrap.js +6 -2
  172. package/dist/server/server/worktree-bootstrap.js.map +1 -1
  173. package/dist/server/server/worktree-core.d.ts +2 -0
  174. package/dist/server/server/worktree-core.d.ts.map +1 -1
  175. package/dist/server/server/worktree-core.js.map +1 -1
  176. package/dist/server/server/worktree-errors.d.ts +1 -1
  177. package/dist/server/server/worktree-errors.d.ts.map +1 -1
  178. package/dist/server/server/worktree-errors.js +1 -4
  179. package/dist/server/server/worktree-errors.js.map +1 -1
  180. package/dist/server/server/worktree-session.d.ts +47 -20
  181. package/dist/server/server/worktree-session.d.ts.map +1 -1
  182. package/dist/server/server/worktree-session.js +68 -25
  183. package/dist/server/server/worktree-session.js.map +1 -1
  184. package/dist/server/shared/binary-frames/file-transfer.d.ts +56 -0
  185. package/dist/server/shared/binary-frames/file-transfer.d.ts.map +1 -0
  186. package/dist/server/shared/binary-frames/file-transfer.js +108 -0
  187. package/dist/server/shared/binary-frames/file-transfer.js.map +1 -0
  188. package/dist/server/shared/binary-frames/index.d.ts +3 -0
  189. package/dist/server/shared/binary-frames/index.d.ts.map +1 -0
  190. package/dist/server/shared/binary-frames/index.js +3 -0
  191. package/dist/server/shared/binary-frames/index.js.map +1 -0
  192. package/dist/server/shared/{terminal-stream-protocol.d.ts → binary-frames/terminal.d.ts} +2 -2
  193. package/dist/server/shared/binary-frames/terminal.d.ts.map +1 -0
  194. package/dist/server/shared/{terminal-stream-protocol.js → binary-frames/terminal.js} +2 -2
  195. package/dist/server/shared/binary-frames/terminal.js.map +1 -0
  196. package/dist/server/shared/client-capabilities.d.ts +5 -0
  197. package/dist/server/shared/client-capabilities.d.ts.map +1 -0
  198. package/dist/server/shared/client-capabilities.js +4 -0
  199. package/dist/server/shared/client-capabilities.js.map +1 -0
  200. package/dist/server/shared/connection-offer.d.ts +8 -0
  201. package/dist/server/shared/connection-offer.d.ts.map +1 -1
  202. package/dist/server/shared/connection-offer.js +35 -0
  203. package/dist/server/shared/connection-offer.js.map +1 -1
  204. package/dist/server/shared/daemon-endpoints.d.ts +16 -1
  205. package/dist/server/shared/daemon-endpoints.d.ts.map +1 -1
  206. package/dist/server/shared/daemon-endpoints.js +65 -6
  207. package/dist/server/shared/daemon-endpoints.js.map +1 -1
  208. package/dist/server/shared/host-connection-schema.d.ts +23 -0
  209. package/dist/server/shared/host-connection-schema.d.ts.map +1 -0
  210. package/dist/server/shared/host-connection-schema.js +9 -0
  211. package/dist/server/shared/host-connection-schema.js.map +1 -0
  212. package/dist/server/shared/messages.d.ts +3242 -535
  213. package/dist/server/shared/messages.d.ts.map +1 -1
  214. package/dist/server/shared/messages.js +73 -34
  215. package/dist/server/shared/messages.js.map +1 -1
  216. package/dist/server/terminal/terminal-manager-factory.d.ts +7 -0
  217. package/dist/server/terminal/terminal-manager-factory.d.ts.map +1 -0
  218. package/dist/server/terminal/terminal-manager-factory.js +13 -0
  219. package/dist/server/terminal/terminal-manager-factory.js.map +1 -0
  220. package/dist/server/terminal/terminal-manager.d.ts +7 -1
  221. package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
  222. package/dist/server/terminal/terminal-manager.js +14 -1
  223. package/dist/server/terminal/terminal-manager.js.map +1 -1
  224. package/dist/server/terminal/terminal-session-controller.d.ts +63 -0
  225. package/dist/server/terminal/terminal-session-controller.d.ts.map +1 -0
  226. package/dist/server/terminal/terminal-session-controller.js +615 -0
  227. package/dist/server/terminal/terminal-session-controller.js.map +1 -0
  228. package/dist/server/terminal/terminal-ts-loader.mjs +20 -0
  229. package/dist/server/terminal/terminal-worker-process.d.ts +2 -0
  230. package/dist/server/terminal/terminal-worker-process.d.ts.map +1 -0
  231. package/dist/server/terminal/terminal-worker-process.js +221 -0
  232. package/dist/server/terminal/terminal-worker-process.js.map +1 -0
  233. package/dist/server/terminal/terminal-worker-protocol.d.ts +113 -0
  234. package/dist/server/terminal/terminal-worker-protocol.d.ts.map +1 -0
  235. package/dist/server/terminal/terminal-worker-protocol.js +2 -0
  236. package/dist/server/terminal/terminal-worker-protocol.js.map +1 -0
  237. package/dist/server/terminal/terminal.d.ts +7 -0
  238. package/dist/server/terminal/terminal.d.ts.map +1 -1
  239. package/dist/server/terminal/terminal.js +45 -9
  240. package/dist/server/terminal/terminal.js.map +1 -1
  241. package/dist/server/terminal/worker-terminal-manager.d.ts +19 -0
  242. package/dist/server/terminal/worker-terminal-manager.d.ts.map +1 -0
  243. package/dist/server/terminal/worker-terminal-manager.js +466 -0
  244. package/dist/server/terminal/worker-terminal-manager.js.map +1 -0
  245. package/dist/server/utils/directory-suggestions.d.ts.map +1 -1
  246. package/dist/server/utils/directory-suggestions.js +10 -1
  247. package/dist/server/utils/directory-suggestions.js.map +1 -1
  248. package/dist/server/utils/process-tree.d.ts +25 -0
  249. package/dist/server/utils/process-tree.d.ts.map +1 -0
  250. package/dist/server/utils/process-tree.js +96 -0
  251. package/dist/server/utils/process-tree.js.map +1 -0
  252. package/dist/server/utils/windows-command.d.ts.map +1 -1
  253. package/dist/server/utils/windows-command.js +5 -1
  254. package/dist/server/utils/windows-command.js.map +1 -1
  255. package/dist/server/utils/worktree-metadata.d.ts +44 -0
  256. package/dist/server/utils/worktree-metadata.d.ts.map +1 -1
  257. package/dist/server/utils/worktree-metadata.js +58 -0
  258. package/dist/server/utils/worktree-metadata.js.map +1 -1
  259. package/dist/server/utils/worktree.d.ts +14 -2
  260. package/dist/server/utils/worktree.d.ts.map +1 -1
  261. package/dist/server/utils/worktree.js +22 -13
  262. package/dist/server/utils/worktree.js.map +1 -1
  263. package/package.json +5 -4
  264. package/dist/server/shared/terminal-stream-protocol.d.ts.map +0 -1
  265. package/dist/server/shared/terminal-stream-protocol.js.map +0 -1
@@ -1,8 +1,10 @@
1
+ import { CLIENT_CAPS } from "../shared/client-capabilities.js";
1
2
  import { AgentCreateFailedStatusPayloadSchema, AgentCreatedStatusPayloadSchema, AgentRefreshedStatusPayloadSchema, AgentResumedStatusPayloadSchema, parseServerInfoStatusPayload, RestartRequestedStatusPayloadSchema, ShutdownRequestedStatusPayloadSchema, SessionInboundMessageSchema, WSOutboundMessageSchema, } from "../shared/messages.js";
2
3
  import { isRelayClientWebSocketUrl } from "../shared/daemon-endpoints.js";
3
- import { asUint8Array, decodeTerminalSnapshotPayload, decodeTerminalStreamFrame, encodeTerminalResizePayload, encodeTerminalStreamFrame, TerminalStreamOpcode, } from "../shared/terminal-stream-protocol.js";
4
- import { createRelayE2eeTransportFactory, createWebSocketTransportFactory, decodeMessageData, defaultWebSocketFactory, describeTransportClose, describeTransportError, encodeUtf8String, } from "./daemon-client-transport.js";
4
+ import { asUint8Array, decodeFileTransferFrame, decodeTerminalStreamFrame, FileTransferOpcode, TerminalStreamOpcode, } from "../shared/binary-frames/index.js";
5
+ import { createRelayE2eeTransportFactory, createWebSocketTransportFactory, decodeMessageData, defaultWebSocketFactory, describeTransportClose, describeTransportError, } from "./daemon-client-transport.js";
5
6
  import { DaemonClientRuntimeMetrics } from "./daemon-client-runtime-metrics.js";
7
+ import { TerminalStreamRouter } from "./terminal-stream-router.js";
6
8
  const consoleLogger = {
7
9
  debug: () => { },
8
10
  info: (obj, msg) => console.log(msg, obj),
@@ -12,6 +14,12 @@ const consoleLogger = {
12
14
  const perfNow = typeof performance !== "undefined" && typeof performance.now === "function"
13
15
  ? () => performance.now()
14
16
  : () => Date.now();
17
+ function normalizePassword(value) {
18
+ if (typeof value !== "string") {
19
+ return null;
20
+ }
21
+ return value.length > 0 ? value : null;
22
+ }
15
23
  class DaemonRpcError extends Error {
16
24
  constructor(params) {
17
25
  const parts = [params.error];
@@ -44,6 +52,52 @@ function normalizeClientId(value) {
44
52
  const trimmed = value.trim();
45
53
  return trimmed.length > 0 ? trimmed : null;
46
54
  }
55
+ function decodeBase64ToBytes(base64) {
56
+ const binary = globalThis.atob(base64);
57
+ const bytes = new Uint8Array(binary.length);
58
+ for (let index = 0; index < binary.length; index += 1) {
59
+ bytes[index] = binary.charCodeAt(index);
60
+ }
61
+ return bytes;
62
+ }
63
+ function legacyExplorerFileToBytes(file) {
64
+ let bytes;
65
+ if (file.encoding === "base64" && file.content) {
66
+ bytes = decodeBase64ToBytes(file.content);
67
+ }
68
+ else if (file.encoding === "utf-8" && file.content) {
69
+ bytes = new TextEncoder().encode(file.content);
70
+ }
71
+ else {
72
+ bytes = new Uint8Array();
73
+ }
74
+ return {
75
+ bytes,
76
+ mime: file.mimeType ?? "application/octet-stream",
77
+ size: file.size,
78
+ path: file.path,
79
+ kind: file.kind,
80
+ modifiedAt: file.modifiedAt,
81
+ };
82
+ }
83
+ function binaryFileKind(mime, encoding) {
84
+ if (mime.startsWith("image/")) {
85
+ return "image";
86
+ }
87
+ if (encoding === "utf-8" || mime.startsWith("text/") || mime === "application/json") {
88
+ return "text";
89
+ }
90
+ return "binary";
91
+ }
92
+ function concatByteChunks(chunks, size) {
93
+ const bytes = new Uint8Array(size);
94
+ let offset = 0;
95
+ for (const chunk of chunks) {
96
+ bytes.set(chunk, offset);
97
+ offset += chunk.byteLength;
98
+ }
99
+ return bytes;
100
+ }
47
101
  function hashForLog(value) {
48
102
  let hash = 0;
49
103
  for (let index = 0; index < value.length; index += 1) {
@@ -96,9 +150,10 @@ export class DaemonClient {
96
150
  this.connectionState = { status: "idle" };
97
151
  this.checkoutDiffSubscriptions = new Map();
98
152
  this.terminalDirectorySubscriptions = new Set();
99
- this.terminalSlots = new Map();
100
- this.slotTerminals = new Map();
101
- this.terminalStreamListeners = new Set();
153
+ this.terminalStreams = new TerminalStreamRouter();
154
+ this.pendingBinaryFileReads = new Map();
155
+ this.activeBinaryFileTransfers = new Map();
156
+ this.completedBinaryFileReads = new Map();
102
157
  this.pendingSendQueue = [];
103
158
  this.lastServerInfoMessage = null;
104
159
  this.runtimeMetricsInterval = null;
@@ -176,9 +231,14 @@ export class DaemonClient {
176
231
  return;
177
232
  }
178
233
  const headers = {};
179
- if (this.config.authHeader) {
180
- headers["Authorization"] = this.config.authHeader;
234
+ const password = normalizePassword(this.config.password);
235
+ if (password) {
236
+ headers.Authorization = `Bearer ${password}`;
181
237
  }
238
+ else if (this.config.authHeader) {
239
+ headers.Authorization = this.config.authHeader;
240
+ }
241
+ const protocols = password ? [`paseo.bearer.${password}`] : undefined;
182
242
  try {
183
243
  // Reconnect can overlap with browser close/error delivery ordering.
184
244
  // Always dispose previous transport before constructing the next one.
@@ -199,7 +259,11 @@ export class DaemonClient {
199
259
  });
200
260
  }
201
261
  const transportUrl = this.resolveTransportUrlForAttempt();
202
- const transport = transportFactory({ url: transportUrl, headers });
262
+ const transport = transportFactory({
263
+ url: transportUrl,
264
+ headers,
265
+ ...(protocols ? { protocols } : {}),
266
+ });
203
267
  this.transport = transport;
204
268
  this.lastServerInfoMessage = null;
205
269
  this.updateConnectionState({
@@ -328,7 +392,7 @@ export class DaemonClient {
328
392
  this.disposeTransport(1000, "Client closed");
329
393
  this.clearWaiters(new Error("Daemon client closed"));
330
394
  this.rejectPendingSendQueue(new Error("Daemon client closed"));
331
- this.clearTerminalSlots();
395
+ this.terminalStreams.clearSlots();
332
396
  this.lastServerInfoMessage = null;
333
397
  if (this.runtimeMetricsInterval) {
334
398
  clearInterval(this.runtimeMetricsInterval);
@@ -1017,6 +1081,41 @@ export class DaemonClient {
1017
1081
  });
1018
1082
  return status.agent;
1019
1083
  }
1084
+ async importAgent(input) {
1085
+ const requestId = this.createRequestId();
1086
+ const message = SessionInboundMessageSchema.parse({
1087
+ type: "import_agent_request",
1088
+ requestId,
1089
+ provider: input.provider,
1090
+ sessionId: input.sessionId,
1091
+ ...(input.cwd ? { cwd: input.cwd } : {}),
1092
+ ...(input.labels && Object.keys(input.labels).length > 0 ? { labels: input.labels } : {}),
1093
+ });
1094
+ const status = await this.sendRequest({
1095
+ requestId,
1096
+ message,
1097
+ timeout: 15000,
1098
+ options: { skipQueue: true },
1099
+ select: (msg) => {
1100
+ if (msg.type !== "status") {
1101
+ return null;
1102
+ }
1103
+ const resumed = AgentResumedStatusPayloadSchema.safeParse(msg.payload);
1104
+ if (resumed.success && resumed.data.requestId === requestId) {
1105
+ return resumed.data;
1106
+ }
1107
+ const failed = AgentCreateFailedStatusPayloadSchema.safeParse(msg.payload);
1108
+ if (failed.success && failed.data.requestId === requestId) {
1109
+ return failed.data;
1110
+ }
1111
+ return null;
1112
+ },
1113
+ });
1114
+ if (status.status === "agent_create_failed") {
1115
+ throw new Error(status.error);
1116
+ }
1117
+ return status.agent;
1118
+ }
1020
1119
  async refreshAgent(agentId, requestId) {
1021
1120
  const resolvedRequestId = this.createRequestId(requestId);
1022
1121
  const message = SessionInboundMessageSchema.parse({
@@ -1797,7 +1896,7 @@ export class DaemonClient {
1797
1896
  branchName: input.branchName,
1798
1897
  },
1799
1898
  responseType: "paseo_worktree_archive_response",
1800
- timeout: 20000,
1899
+ timeout: 60000,
1801
1900
  });
1802
1901
  }
1803
1902
  async createPaseoWorktree(input, requestId) {
@@ -1807,8 +1906,8 @@ export class DaemonClient {
1807
1906
  type: "create_paseo_worktree_request",
1808
1907
  cwd: input.cwd,
1809
1908
  worktreeSlug: input.worktreeSlug,
1810
- ...(input.attachments && input.attachments.length > 0
1811
- ? { attachments: input.attachments }
1909
+ ...(input.firstAgentContext !== undefined
1910
+ ? { firstAgentContext: input.firstAgentContext }
1812
1911
  : {}),
1813
1912
  ...(input.refName !== undefined ? { refName: input.refName } : {}),
1814
1913
  ...(input.action !== undefined ? { action: input.action } : {}),
@@ -1875,7 +1974,7 @@ export class DaemonClient {
1875
1974
  // ============================================================================
1876
1975
  // File Explorer
1877
1976
  // ============================================================================
1878
- async exploreFileSystem(cwd, path, mode = "list", requestId) {
1977
+ async requestFileExplorer(cwd, path, mode, requestId, acceptBinary = false) {
1879
1978
  return this.sendCorrelatedSessionRequest({
1880
1979
  requestId,
1881
1980
  message: {
@@ -1883,11 +1982,45 @@ export class DaemonClient {
1883
1982
  cwd,
1884
1983
  path,
1885
1984
  mode,
1985
+ ...(acceptBinary ? { acceptBinary: true } : {}),
1886
1986
  },
1887
1987
  responseType: "file_explorer_response",
1888
1988
  timeout: 10000,
1889
1989
  });
1890
1990
  }
1991
+ async listDirectory(cwd, path, requestId) {
1992
+ const payload = await this.requestFileExplorer(cwd, path, "list", requestId);
1993
+ if (payload.error) {
1994
+ throw new Error(payload.error);
1995
+ }
1996
+ if (!payload.directory) {
1997
+ throw new Error("Directory listing unavailable.");
1998
+ }
1999
+ return payload.directory;
2000
+ }
2001
+ async readFile(cwd, path, requestId) {
2002
+ const resolvedRequestId = this.createRequestId(requestId);
2003
+ this.pendingBinaryFileReads.set(resolvedRequestId, { cwd, path });
2004
+ try {
2005
+ const payload = await this.requestFileExplorer(cwd, path, "file", resolvedRequestId, true);
2006
+ if (payload.error) {
2007
+ throw new Error(payload.error);
2008
+ }
2009
+ const binaryResult = this.completedBinaryFileReads.get(resolvedRequestId);
2010
+ if (binaryResult) {
2011
+ this.completedBinaryFileReads.delete(resolvedRequestId);
2012
+ return binaryResult;
2013
+ }
2014
+ if (!payload.file) {
2015
+ throw new Error("File unavailable.");
2016
+ }
2017
+ return legacyExplorerFileToBytes(payload.file);
2018
+ }
2019
+ finally {
2020
+ this.pendingBinaryFileReads.delete(resolvedRequestId);
2021
+ this.activeBinaryFileTransfers.delete(resolvedRequestId);
2022
+ }
2023
+ }
1891
2024
  async requestDownloadToken(cwd, path, requestId) {
1892
2025
  return this.sendCorrelatedSessionRequest({
1893
2026
  requestId,
@@ -2272,39 +2405,22 @@ export class DaemonClient {
2272
2405
  options: { skipQueue: true },
2273
2406
  });
2274
2407
  if (payload.error === null) {
2275
- this.setTerminalSlot(terminalId, payload.slot);
2408
+ this.terminalStreams.setSlot(terminalId, payload.slot);
2276
2409
  }
2277
2410
  return payload;
2278
2411
  }
2279
2412
  unsubscribeTerminal(terminalId) {
2280
- this.removeTerminalSlot(terminalId);
2413
+ this.terminalStreams.removeTerminal(terminalId);
2281
2414
  this.sendSessionMessage({
2282
2415
  type: "unsubscribe_terminal_request",
2283
2416
  terminalId,
2284
2417
  });
2285
2418
  }
2286
2419
  sendTerminalInput(terminalId, message) {
2287
- const slot = this.terminalSlots.get(terminalId);
2288
- if (typeof slot === "number") {
2289
- if (message.type === "input") {
2290
- this.sendBinaryFrame(encodeTerminalStreamFrame({
2291
- opcode: TerminalStreamOpcode.Input,
2292
- slot,
2293
- payload: encodeUtf8String(message.data),
2294
- }));
2295
- return;
2296
- }
2297
- if (message.type === "resize") {
2298
- this.sendBinaryFrame(encodeTerminalStreamFrame({
2299
- opcode: TerminalStreamOpcode.Resize,
2300
- slot,
2301
- payload: encodeTerminalResizePayload({
2302
- rows: message.rows,
2303
- cols: message.cols,
2304
- }),
2305
- }));
2306
- return;
2307
- }
2420
+ const frame = this.terminalStreams.encodeInput(terminalId, message);
2421
+ if (frame) {
2422
+ this.sendBinaryFrame(frame);
2423
+ return;
2308
2424
  }
2309
2425
  this.sendSessionMessage({
2310
2426
  type: "terminal_input",
@@ -2601,10 +2717,7 @@ export class DaemonClient {
2601
2717
  });
2602
2718
  }
2603
2719
  onTerminalStreamEvent(handler) {
2604
- this.terminalStreamListeners.add(handler);
2605
- return () => {
2606
- this.terminalStreamListeners.delete(handler);
2607
- };
2720
+ return this.terminalStreams.onEvent(handler);
2608
2721
  }
2609
2722
  async waitForTerminalStreamEvent(predicate, timeout = 5000) {
2610
2723
  return new Promise((resolve, reject) => {
@@ -2628,32 +2741,6 @@ export class DaemonClient {
2628
2741
  createRequestId(requestId) {
2629
2742
  return requestId ?? crypto.randomUUID();
2630
2743
  }
2631
- setTerminalSlot(terminalId, slot) {
2632
- const existingTerminalId = this.slotTerminals.get(slot);
2633
- if (existingTerminalId && existingTerminalId !== terminalId) {
2634
- this.terminalSlots.delete(existingTerminalId);
2635
- }
2636
- const existingSlot = this.terminalSlots.get(terminalId);
2637
- if (typeof existingSlot === "number" && existingSlot !== slot) {
2638
- this.slotTerminals.delete(existingSlot);
2639
- }
2640
- this.terminalSlots.set(terminalId, slot);
2641
- this.slotTerminals.set(slot, terminalId);
2642
- }
2643
- removeTerminalSlot(terminalId) {
2644
- const slot = this.terminalSlots.get(terminalId);
2645
- if (typeof slot !== "number") {
2646
- return;
2647
- }
2648
- this.terminalSlots.delete(terminalId);
2649
- if (this.slotTerminals.get(slot) === terminalId) {
2650
- this.slotTerminals.delete(slot);
2651
- }
2652
- }
2653
- clearTerminalSlots() {
2654
- this.terminalSlots.clear();
2655
- this.slotTerminals.clear();
2656
- }
2657
2744
  getLastServerInfoMessage() {
2658
2745
  return this.lastServerInfoMessage;
2659
2746
  }
@@ -2675,6 +2762,9 @@ export class DaemonClient {
2675
2762
  clientId: this.config.clientId,
2676
2763
  clientType: this.config.clientType ?? "cli",
2677
2764
  protocolVersion: 1,
2765
+ capabilities: {
2766
+ [CLIENT_CAPS.reasoningMergeEnum]: true,
2767
+ },
2678
2768
  ...(this.config.appVersion ? { appVersion: this.config.appVersion } : {}),
2679
2769
  }));
2680
2770
  }
@@ -2777,12 +2867,18 @@ export class DaemonClient {
2777
2867
  }
2778
2868
  }
2779
2869
  tryHandleBinaryFrame(rawBytes) {
2870
+ const fileFrame = decodeFileTransferFrame(rawBytes);
2871
+ if (fileFrame) {
2872
+ this.handleFileTransferFrame(fileFrame);
2873
+ this.runtimeMetrics?.recordBinaryFrame("other", rawBytes.byteLength, 0);
2874
+ return true;
2875
+ }
2780
2876
  const frame = decodeTerminalStreamFrame(rawBytes);
2781
2877
  if (!frame) {
2782
2878
  return false;
2783
2879
  }
2784
2880
  const binaryStartMs = perfNow();
2785
- this.handleBinaryFrame(frame);
2881
+ this.terminalStreams.handleFrame(frame);
2786
2882
  let frameKind = "other";
2787
2883
  if (frame.opcode === TerminalStreamOpcode.Output) {
2788
2884
  frameKind = "output";
@@ -2793,40 +2889,52 @@ export class DaemonClient {
2793
2889
  this.runtimeMetrics?.recordBinaryFrame(frameKind, rawBytes.byteLength, perfNow() - binaryStartMs);
2794
2890
  return true;
2795
2891
  }
2796
- handleBinaryFrame(frame) {
2797
- const terminalId = this.slotTerminals.get(frame.slot);
2798
- if (!terminalId) {
2799
- return;
2800
- }
2801
- if (frame.opcode === TerminalStreamOpcode.Output) {
2802
- this.emitTerminalStreamEvent({
2803
- terminalId,
2804
- type: "output",
2805
- data: frame.payload,
2806
- });
2807
- return;
2808
- }
2809
- if (frame.opcode === TerminalStreamOpcode.Snapshot) {
2810
- const state = decodeTerminalSnapshotPayload(frame.payload);
2811
- if (!state) {
2892
+ handleFileTransferFrame(frame) {
2893
+ if (frame.opcode === FileTransferOpcode.FileBegin) {
2894
+ const pending = this.pendingBinaryFileReads.get(frame.requestId);
2895
+ if (!pending) {
2812
2896
  return;
2813
2897
  }
2814
- this.emitTerminalStreamEvent({
2815
- terminalId,
2816
- type: "snapshot",
2817
- state,
2898
+ this.activeBinaryFileTransfers.set(frame.requestId, {
2899
+ ...pending,
2900
+ mime: frame.metadata.mime,
2901
+ size: frame.metadata.size,
2902
+ encoding: frame.metadata.encoding,
2903
+ modifiedAt: frame.metadata.modifiedAt,
2904
+ chunks: [],
2818
2905
  });
2906
+ return;
2819
2907
  }
2820
- }
2821
- emitTerminalStreamEvent(event) {
2822
- for (const listener of this.terminalStreamListeners) {
2823
- try {
2824
- listener(event);
2825
- }
2826
- catch {
2827
- // no-op
2828
- }
2908
+ const transfer = this.activeBinaryFileTransfers.get(frame.requestId);
2909
+ if (!transfer) {
2910
+ return;
2911
+ }
2912
+ if (frame.opcode === FileTransferOpcode.FileChunk) {
2913
+ transfer.chunks.push(frame.payload);
2914
+ return;
2829
2915
  }
2916
+ const bytes = concatByteChunks(transfer.chunks, transfer.size);
2917
+ this.activeBinaryFileTransfers.delete(frame.requestId);
2918
+ this.completedBinaryFileReads.set(frame.requestId, {
2919
+ bytes,
2920
+ mime: transfer.mime,
2921
+ size: transfer.size,
2922
+ path: transfer.path,
2923
+ kind: binaryFileKind(transfer.mime, transfer.encoding),
2924
+ modifiedAt: transfer.modifiedAt,
2925
+ });
2926
+ this.handleSessionMessage({
2927
+ type: "file_explorer_response",
2928
+ payload: {
2929
+ cwd: transfer.cwd,
2930
+ path: transfer.path,
2931
+ mode: "file",
2932
+ directory: null,
2933
+ file: null,
2934
+ error: null,
2935
+ requestId: frame.requestId,
2936
+ },
2937
+ });
2830
2938
  }
2831
2939
  updateConnectionState(next, metadata) {
2832
2940
  const previous = this.connectionState;
@@ -2871,7 +2979,7 @@ export class DaemonClient {
2871
2979
  // and responses from the previous connection will never arrive.
2872
2980
  this.clearWaiters(new Error(reason ?? "Connection lost"));
2873
2981
  this.rejectPendingSendQueue(new Error(reason ?? "Connection lost"));
2874
- this.clearTerminalSlots();
2982
+ this.terminalStreams.clearSlots();
2875
2983
  this.lastServerInfoMessage = null;
2876
2984
  if (wasDisposed) {
2877
2985
  this.rejectConnect(new Error(reason ?? "Daemon client is disposed"));
@@ -2925,7 +3033,7 @@ export class DaemonClient {
2925
3033
  }
2926
3034
  }
2927
3035
  if (msg.type === "terminal_stream_exit") {
2928
- this.removeTerminalSlot(msg.payload.terminalId);
3036
+ this.terminalStreams.removeTerminal(msg.payload.terminalId);
2929
3037
  }
2930
3038
  if (this.rawMessageListeners.size > 0) {
2931
3039
  for (const handler of this.rawMessageListeners) {