kumo-cli 1.0.6 → 1.2.0

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 (241) hide show
  1. package/README.md +26 -13
  2. package/dist/auth/credentialsStore.js +20 -7
  3. package/dist/auth/credentialsStore.js.map +1 -1
  4. package/dist/claude/conversation.js +272 -0
  5. package/dist/claude/conversation.js.map +1 -0
  6. package/dist/claude/transcriptParser.js +140 -36
  7. package/dist/claude/transcriptParser.js.map +1 -1
  8. package/dist/commands/cliArgs.js +1 -0
  9. package/dist/commands/cliArgs.js.map +1 -1
  10. package/dist/core/config.js +1 -9
  11. package/dist/core/config.js.map +1 -1
  12. package/dist/core/logger.js +50 -21
  13. package/dist/core/logger.js.map +1 -1
  14. package/dist/core/projectFileWatcher.js +100 -36
  15. package/dist/core/projectFileWatcher.js.map +1 -1
  16. package/dist/engine/claudeArgs.js +106 -0
  17. package/dist/engine/claudeArgs.js.map +1 -0
  18. package/dist/engine/claudeBinary.js +94 -0
  19. package/dist/engine/claudeBinary.js.map +1 -0
  20. package/dist/engine/claudeConfig.js +127 -0
  21. package/dist/engine/claudeConfig.js.map +1 -0
  22. package/dist/engine/claudeLogin.js +76 -0
  23. package/dist/engine/claudeLogin.js.map +1 -0
  24. package/dist/engine/controlChannel.js +75 -0
  25. package/dist/engine/controlChannel.js.map +1 -0
  26. package/dist/engine/liveTranscript.js +150 -0
  27. package/dist/engine/liveTranscript.js.map +1 -0
  28. package/dist/engine/ndjson.js +48 -0
  29. package/dist/engine/ndjson.js.map +1 -0
  30. package/dist/engine/permissions.js +101 -0
  31. package/dist/engine/permissions.js.map +1 -0
  32. package/dist/engine/probePool.js +51 -0
  33. package/dist/engine/probePool.js.map +1 -0
  34. package/dist/engine/processTree.js +45 -0
  35. package/dist/engine/processTree.js.map +1 -0
  36. package/dist/engine/remoteConfig.js +17 -0
  37. package/dist/engine/remoteConfig.js.map +1 -0
  38. package/dist/engine/sessionManager.js +444 -0
  39. package/dist/engine/sessionManager.js.map +1 -0
  40. package/dist/engine/settingsCommands.js +260 -0
  41. package/dist/engine/settingsCommands.js.map +1 -0
  42. package/dist/engine/streamSession.js +502 -0
  43. package/dist/engine/streamSession.js.map +1 -0
  44. package/dist/engine/taskTracker.js +110 -0
  45. package/dist/engine/taskTracker.js.map +1 -0
  46. package/dist/engine/toolLabels.js +32 -0
  47. package/dist/engine/toolLabels.js.map +1 -0
  48. package/dist/handlers/controlRequest.js +17 -0
  49. package/dist/handlers/controlRequest.js.map +1 -0
  50. package/dist/handlers/fileHandlers.js +12 -0
  51. package/dist/handlers/fileHandlers.js.map +1 -1
  52. package/dist/handlers/messageRouter.js +8 -1
  53. package/dist/handlers/messageRouter.js.map +1 -1
  54. package/dist/handlers/promptImages.js +5 -91
  55. package/dist/handlers/promptImages.js.map +1 -1
  56. package/dist/handlers/runtimeHandlers.js +100 -32
  57. package/dist/handlers/runtimeHandlers.js.map +1 -1
  58. package/dist/handlers/sessionHandlers.js +85 -80
  59. package/dist/handlers/sessionHandlers.js.map +1 -1
  60. package/dist/handlers/terminalHandlers.js +9 -2
  61. package/dist/handlers/terminalHandlers.js.map +1 -1
  62. package/dist/http/httpClient.js +6 -0
  63. package/dist/http/httpClient.js.map +1 -1
  64. package/dist/index.js +87 -50
  65. package/dist/index.js.map +1 -1
  66. package/dist/pty/terminalManager.js +58 -11
  67. package/dist/pty/terminalManager.js.map +1 -1
  68. package/dist/services/bootstrapService.js +17 -1
  69. package/dist/services/bootstrapService.js.map +1 -1
  70. package/dist/services/claudeAdapterProxy.js +68 -21
  71. package/dist/services/claudeAdapterProxy.js.map +1 -1
  72. package/dist/services/cliRuntime.js +39 -32
  73. package/dist/services/cliRuntime.js.map +1 -1
  74. package/dist/services/effortService.js +13 -60
  75. package/dist/services/effortService.js.map +1 -1
  76. package/dist/services/fileService.js +50 -24
  77. package/dist/services/fileService.js.map +1 -1
  78. package/dist/services/forkService.js +120 -0
  79. package/dist/services/forkService.js.map +1 -0
  80. package/dist/services/modelService.js +86 -89
  81. package/dist/services/modelService.js.map +1 -1
  82. package/dist/services/pairingService.js +21 -15
  83. package/dist/services/pairingService.js.map +1 -1
  84. package/dist/services/sessionListService.js +7 -9
  85. package/dist/services/sessionListService.js.map +1 -1
  86. package/dist/services/sessionService.js +245 -106
  87. package/dist/services/sessionService.js.map +1 -1
  88. package/dist/services/tunnelHelpers.js +9 -5
  89. package/dist/services/tunnelHelpers.js.map +1 -1
  90. package/dist/services/tunnelService.js +21 -5
  91. package/dist/services/tunnelService.js.map +1 -1
  92. package/dist/transport/wsClient.js +60 -42
  93. package/dist/transport/wsClient.js.map +1 -1
  94. package/dist/utils/ignorePaths.js +3 -3
  95. package/dist/utils/ignorePaths.js.map +1 -1
  96. package/dist/utils/json.js +7 -0
  97. package/dist/utils/json.js.map +1 -0
  98. package/dist/utils/localHost.js +17 -0
  99. package/dist/utils/localHost.js.map +1 -0
  100. package/dist/utils/safePath.js +51 -20
  101. package/dist/utils/safePath.js.map +1 -1
  102. package/package.json +5 -12
  103. package/dist/ansiCodes.js +0 -107
  104. package/dist/ansiCodes.js.map +0 -1
  105. package/dist/auth/credentialsStore.test.js +0 -60
  106. package/dist/auth/credentialsStore.test.js.map +0 -1
  107. package/dist/claude/fileHistory.js +0 -79
  108. package/dist/claude/fileHistory.js.map +0 -1
  109. package/dist/claude/generateHookSettings.js +0 -23
  110. package/dist/claude/generateHookSettings.js.map +0 -1
  111. package/dist/claude/hookServer.js +0 -33
  112. package/dist/claude/hookServer.js.map +0 -1
  113. package/dist/claude/sessionScanner.js +0 -162
  114. package/dist/claude/sessionScanner.js.map +0 -1
  115. package/dist/claude/sessionScanner.test.js +0 -24
  116. package/dist/claude/sessionScanner.test.js.map +0 -1
  117. package/dist/claude/transcriptParser.test.js +0 -78
  118. package/dist/claude/transcriptParser.test.js.map +0 -1
  119. package/dist/commands/cliArgs.test.js +0 -25
  120. package/dist/commands/cliArgs.test.js.map +0 -1
  121. package/dist/config.js +0 -40
  122. package/dist/config.js.map +0 -1
  123. package/dist/credentialsStore.js +0 -57
  124. package/dist/credentialsStore.js.map +0 -1
  125. package/dist/generateHookSettings.js +0 -30
  126. package/dist/generateHookSettings.js.map +0 -1
  127. package/dist/handlers/fileHandlerPayloads.test.js +0 -55
  128. package/dist/handlers/fileHandlerPayloads.test.js.map +0 -1
  129. package/dist/handlers/promptImages.test.js +0 -52
  130. package/dist/handlers/promptImages.test.js.map +0 -1
  131. package/dist/hookServer.js +0 -32
  132. package/dist/hookServer.js.map +0 -1
  133. package/dist/ignorePaths.js +0 -68
  134. package/dist/ignorePaths.js.map +0 -1
  135. package/dist/loadDotEnv.js +0 -79
  136. package/dist/loadDotEnv.js.map +0 -1
  137. package/dist/logger.js +0 -29
  138. package/dist/logger.js.map +0 -1
  139. package/dist/portForwardManager.js +0 -97
  140. package/dist/portForwardManager.js.map +0 -1
  141. package/dist/projectHistoryReader.js +0 -85
  142. package/dist/projectHistoryReader.js.map +0 -1
  143. package/dist/pty/ansiCodes.js +0 -14
  144. package/dist/pty/ansiCodes.js.map +0 -1
  145. package/dist/pty/notificationDetector.js +0 -29
  146. package/dist/pty/notificationDetector.js.map +0 -1
  147. package/dist/pty/notificationDetector.test.js +0 -24
  148. package/dist/pty/notificationDetector.test.js.map +0 -1
  149. package/dist/pty/ptyMenuParser.js +0 -91
  150. package/dist/pty/ptyMenuParser.js.map +0 -1
  151. package/dist/pty/ptyMenuParser.test.js +0 -26
  152. package/dist/pty/ptyMenuParser.test.js.map +0 -1
  153. package/dist/pty/ptySnapshotRenderer.js +0 -71
  154. package/dist/pty/ptySnapshotRenderer.js.map +0 -1
  155. package/dist/pty/selectionMenuDetector.js +0 -49
  156. package/dist/pty/selectionMenuDetector.js.map +0 -1
  157. package/dist/pty/selectionMenuDetector.test.js +0 -62
  158. package/dist/pty/selectionMenuDetector.test.js.map +0 -1
  159. package/dist/pty/selectionMenuMeta.js +0 -54
  160. package/dist/pty/selectionMenuMeta.js.map +0 -1
  161. package/dist/pty/selectionMenuMeta.test.js +0 -26
  162. package/dist/pty/selectionMenuMeta.test.js.map +0 -1
  163. package/dist/pty/selectionMenuParser.js +0 -83
  164. package/dist/pty/selectionMenuParser.js.map +0 -1
  165. package/dist/pty/selectionMenuParser.test.js +0 -30
  166. package/dist/pty/selectionMenuParser.test.js.map +0 -1
  167. package/dist/pty/spawn.js +0 -104
  168. package/dist/pty/spawn.js.map +0 -1
  169. package/dist/pty/spawn.test.js +0 -17
  170. package/dist/pty/spawn.test.js.map +0 -1
  171. package/dist/pty/statusSessionDetector.js +0 -28
  172. package/dist/pty/statusSessionDetector.js.map +0 -1
  173. package/dist/pty/statusSessionDetector.test.js +0 -23
  174. package/dist/pty/statusSessionDetector.test.js.map +0 -1
  175. package/dist/pty/textInputDetector.js +0 -60
  176. package/dist/pty/textInputDetector.js.map +0 -1
  177. package/dist/pty/textInputDetector.test.js +0 -32
  178. package/dist/pty/textInputDetector.test.js.map +0 -1
  179. package/dist/ptyMenuParser.js +0 -470
  180. package/dist/ptyMenuParser.js.map +0 -1
  181. package/dist/ptySnapshotRenderer.js +0 -78
  182. package/dist/ptySnapshotRenderer.js.map +0 -1
  183. package/dist/services/checkpointService.js +0 -113
  184. package/dist/services/checkpointService.js.map +0 -1
  185. package/dist/services/checkpointService.test.js +0 -61
  186. package/dist/services/checkpointService.test.js.map +0 -1
  187. package/dist/services/claudeMenuBridge.js +0 -116
  188. package/dist/services/claudeMenuBridge.js.map +0 -1
  189. package/dist/services/claudeMenuBridge.test.js +0 -90
  190. package/dist/services/claudeMenuBridge.test.js.map +0 -1
  191. package/dist/services/claudeService.js +0 -146
  192. package/dist/services/claudeService.js.map +0 -1
  193. package/dist/services/claudeService.test.js +0 -39
  194. package/dist/services/claudeService.test.js.map +0 -1
  195. package/dist/services/cliRuntime.test.js +0 -55
  196. package/dist/services/cliRuntime.test.js.map +0 -1
  197. package/dist/services/modelAdapter.test.js +0 -47
  198. package/dist/services/modelAdapter.test.js.map +0 -1
  199. package/dist/services/modelArgs.test.js +0 -64
  200. package/dist/services/modelArgs.test.js.map +0 -1
  201. package/dist/services/modelBaseUrl.test.js +0 -32
  202. package/dist/services/modelBaseUrl.test.js.map +0 -1
  203. package/dist/services/modelService.test.js +0 -136
  204. package/dist/services/modelService.test.js.map +0 -1
  205. package/dist/services/notificationDedupe.js +0 -23
  206. package/dist/services/notificationDedupe.js.map +0 -1
  207. package/dist/services/notificationDedupe.test.js +0 -20
  208. package/dist/services/notificationDedupe.test.js.map +0 -1
  209. package/dist/services/sessionListService.test.js +0 -22
  210. package/dist/services/sessionListService.test.js.map +0 -1
  211. package/dist/services/sessionRollbackService.js +0 -195
  212. package/dist/services/sessionRollbackService.js.map +0 -1
  213. package/dist/services/sessionRollbackService.test.js +0 -142
  214. package/dist/services/sessionRollbackService.test.js.map +0 -1
  215. package/dist/services/tunnelHelpers.test.js +0 -42
  216. package/dist/services/tunnelHelpers.test.js.map +0 -1
  217. package/dist/services/tunnelService.test.js +0 -91
  218. package/dist/services/tunnelService.test.js.map +0 -1
  219. package/dist/sessionScanner.js +0 -271
  220. package/dist/sessionScanner.js.map +0 -1
  221. package/dist/snapshotScanner.js +0 -154
  222. package/dist/snapshotScanner.js.map +0 -1
  223. package/dist/spawn.js +0 -79
  224. package/dist/spawn.js.map +0 -1
  225. package/dist/terminalManager.js +0 -73
  226. package/dist/terminalManager.js.map +0 -1
  227. package/dist/transport/directWsServer.js +0 -135
  228. package/dist/transport/directWsServer.js.map +0 -1
  229. package/dist/transport/webrtcTransport.js +0 -145
  230. package/dist/transport/webrtcTransport.js.map +0 -1
  231. package/dist/transport/webrtcTransport.test.js +0 -104
  232. package/dist/transport/webrtcTransport.test.js.map +0 -1
  233. package/dist/transport/webrtcTypes.js +0 -29
  234. package/dist/transport/webrtcTypes.js.map +0 -1
  235. package/dist/transport/webrtcTypes.test.js +0 -20
  236. package/dist/transport/webrtcTypes.test.js.map +0 -1
  237. package/dist/utils/ptyBuffer.js +0 -46
  238. package/dist/utils/ptyBuffer.js.map +0 -1
  239. package/scripts/claude_launcher.cjs +0 -71
  240. package/scripts/run-tests.mjs +0 -46
  241. package/scripts/session_hook_forwarder.cjs +0 -44
package/README.md CHANGED
@@ -7,10 +7,10 @@ A lightweight companion CLI for Kumo that connects your local terminal sessions
7
7
  ## ✨ Features
8
8
 
9
9
  - Pair once with a short code from the app
10
- - Resume and manage Claude Code sessions remotely
11
- - Stream PTY output over WebSocket
12
- - Auto-sync Claude session state and transcript events
13
- - Optional local hook server integration for Claude session discovery
10
+ - Run several Claude Code sessions at once and drive them from your phone
11
+ - Approve tool use, answer Claude's questions and review plans from the app
12
+ - Switch model, effort, thinking and permission mode without restarting
13
+ - Browse files, open terminals and tunnel local ports to the app
14
14
 
15
15
  ---
16
16
 
@@ -32,9 +32,9 @@ npx kumo-cli@latest
32
32
 
33
33
  ## ✅ Requirements
34
34
 
35
- - Node.js **18+**
35
+ - Node.js **20+**
36
36
  - Internet access to reach your Kumo backend
37
- - Native build prerequisites for `node-pty`:
37
+ - Native build prerequisites for `node-pty` (used by the in-app terminal):
38
38
  - **Windows:** Visual Studio Build Tools + Python 3
39
39
  - **macOS:** Xcode Command Line Tools (`xcode-select --install`)
40
40
  - **Linux:** `build-essential`, `python3`, `make`, `gcc`
@@ -51,7 +51,10 @@ Kumo CLI is configured via environment variables. Export them in your shell or l
51
51
  | `KUMO_SERVER_URL` | `https://kumocli.com/` | Base URL of the Kumo backend. Auto-derives HTTP & WS endpoints. |
52
52
  | `KUMO_SERVER_HTTP_URL` | derived | Override the HTTP endpoint explicitly. |
53
53
  | `KUMO_SERVER_WS_URL` | derived | Override the WebSocket endpoint explicitly. |
54
- | `KUMO_PORT` | `3579` | Local port hint (used by some discovery flows). |
54
+ | `KUMO_PERMISSION_MODE` | `default` | Permission mode for new sessions: `default`, `acceptEdits`, `plan` or `bypassPermissions` (needs `--dangerously-skip-permissions`). |
55
+ | `KUMO_CLAUDE_BIN` | auto | Path to the `claude` executable when auto-discovery picks the wrong one. |
56
+ | `KUMO_HOME_DIR` | `~/.kumo` | Where credentials and the device identity are stored. |
57
+ | `KUMO_ALLOWED_TUNNEL_PORTS` | all | Comma-separated local ports the app may tunnel to, e.g. `3000,5173`. Tunnels always target `127.0.0.1`. |
55
58
 
56
59
  Credentials are persisted to `~/.kumo/credentials.json`.
57
60
 
@@ -79,14 +82,23 @@ kumo reset codex
79
82
 
80
83
  Run `kumo reset` without an agent to choose which credentials to reset. Reset removes the selected credentials file only. It intentionally keeps `~/.kumo/device.json` so the backend can still recognize the same machine on the next pairing.
81
84
 
85
+ Hooks, permission rules and MCP servers the app adds go to this project's settings. Settings in `~/.claude/settings.json` and user-scope MCP servers apply to every Claude Code session on the machine and outlive Kumo, so the app may only change them when you start Kumo with:
86
+
87
+ ```bash
88
+ kumo claude --allow-remote-config
89
+ ```
90
+
91
+ Likewise, bypass permissions mode is only available from the app when Kumo was started with `--dangerously-skip-permissions`.
92
+
82
93
  ---
83
94
 
84
95
  ## 🧱 How it works
85
96
 
86
97
  ```
87
- ┌─────────────┐ WebSocket ┌──────────────┐ PTY ┌─────────────┐
88
- │ Kumo app │ ◄────────────► │ Kumo CLI │ ◄───────► │ Claude Code │
89
- └─────────────┘ └──────────────┘ └─────────────┘
98
+ ┌─────────────┐ WebSocket ┌──────────────┐ stream-json ┌─────────────┐
99
+ │ Kumo app │ ◄────────────► │ Kumo CLI │ ◄─────────► │ Claude Code │
100
+ └─────────────┘ └──────────────┘ (1 per └─────────────┘
101
+ session)
90
102
  ▲ │
91
103
  │ HTTP (pairing) │
92
104
  └────────────────────────────────┘
@@ -95,8 +107,8 @@ Run `kumo reset` without an agent to choose which credentials to reset. Reset re
95
107
 
96
108
  1. The CLI pairs with the backend using the 9-digit code → receives a long-lived `deviceToken`.
97
109
  2. It opens a WebSocket to the backend and announces itself.
98
- 3. When the app requests a session, the CLI spawns Claude Code under a real PTY.
99
- 4. STDIN/STDOUT are streamed both ways; periodic snapshots and Claude session hooks keep state coherent.
110
+ 3. The first prompt of a session spawns `claude` with `--input-format/--output-format stream-json` and the control protocol (`--permission-prompt-tool stdio`), the same way the VS Code extension talks to it. Up to 6 sessions stay live; the idlest one is closed beyond that.
111
+ 4. Chat content is read from Claude's session transcript; turn state, permission requests, results and settings come from the control channel and are relayed to the app.
100
112
 
101
113
  ---
102
114
 
@@ -105,7 +117,8 @@ Run `kumo reset` without an agent to choose which credentials to reset. Reset re
105
117
  - **`node-pty` build fails** — make sure your toolchain (above) is installed, then re-run `npm install -g kumo-cli`.
106
118
  - **Pairing code rejected** — codes are single-use and expire quickly. Generate a fresh one in the app.
107
119
  - **Cannot connect** — verify `KUMO_SERVER_URL` matches the backend the app is talking to.
108
- - **Hooks not firing** — make sure Claude Code is on `PATH` and you launched a session through the CLI (the hook settings file is auto-generated under the system temp dir).
120
+ - **"Claude is not logged in"** — run `claude` once on the machine and sign in, then send the prompt again.
121
+ - **Wrong Claude binary** — set `KUMO_CLAUDE_BIN` to the `claude` executable you want the CLI to use.
109
122
 
110
123
  ---
111
124
 
@@ -9,14 +9,29 @@ function credentialsFileName(agent = 'claude') {
9
9
  return agent === 'claude' ? CRED_FILE_NAME : `${agent}-credentials.json`;
10
10
  }
11
11
  // resolve the local kumo state directory and allow tests to override it
12
- function kumoDir() {
12
+ export function kumoDir() {
13
13
  return process.env[KUMO_DIR_ENV] || path.join(os.homedir(), '.kumo');
14
14
  }
15
- // ensure the local kumo directory exists before writing state files
15
+ // ensure the local kumo directory exists before writing state files, readable by this user only
16
16
  function ensureKumoDir() {
17
17
  const dir = kumoDir();
18
18
  if (!fs.existsSync(dir))
19
- fs.mkdirSync(dir, { recursive: true });
19
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
20
+ restrict(dir, 0o700);
21
+ }
22
+ // posix permissions; writeFileSync's mode only applies when it creates the file
23
+ function restrict(target, mode) {
24
+ if (process.platform === 'win32')
25
+ return;
26
+ try {
27
+ fs.chmodSync(target, mode);
28
+ }
29
+ catch { }
30
+ }
31
+ function writePrivate(file, data) {
32
+ ensureKumoDir();
33
+ fs.writeFileSync(file, JSON.stringify(data, null, 2), { encoding: 'utf-8', mode: 0o600 });
34
+ restrict(file, 0o600);
20
35
  }
21
36
  // load credentials from ~/.kumo/credentials.json if present
22
37
  export function loadCredentials(agent = 'claude') {
@@ -35,8 +50,7 @@ export function loadCredentials(agent = 'claude') {
35
50
  }
36
51
  // persist credentials with restrictive 0600 mode on posix
37
52
  export function saveCredentials(creds, agent = 'claude') {
38
- ensureKumoDir();
39
- fs.writeFileSync(credentialsPath(agent), JSON.stringify(creds, null, 2), { encoding: 'utf-8', mode: 0o600 });
53
+ writePrivate(credentialsPath(agent), creds);
40
54
  }
41
55
  // load the persisted device identity if present and valid
42
56
  export function loadDeviceIdentity() {
@@ -55,8 +69,7 @@ export function loadDeviceIdentity() {
55
69
  }
56
70
  // persist the stable device identity used across credential resets
57
71
  export function saveDeviceIdentity(deviceUuid) {
58
- ensureKumoDir();
59
- fs.writeFileSync(deviceIdentityPath(), JSON.stringify({ deviceUuid }, null, 2), { encoding: 'utf-8', mode: 0o600 });
72
+ writePrivate(deviceIdentityPath(), { deviceUuid });
60
73
  return deviceUuid;
61
74
  }
62
75
  // return the stable device uuid, seeding from a known uuid or generating one once
@@ -1 +1 @@
1
- {"version":3,"file":"credentialsStore.js","sourceRoot":"","sources":["../../src/auth/credentialsStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credentialsStore.js","sourceRoot":"","sources":["../../src/auth/credentialsStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,272 @@
1
+ // rebuilds the conversation of a session jsonl the way the vs code extension does (agent sdk
2
+ // getSessionMessages): walk the parentUuid chain back from the newest leaf, so rewound branches
3
+ // drop out, then put back the sibling entries of assistant messages split over several lines
4
+ // (parallel tool calls) and turn answered queued prompts into user messages. unlike the
5
+ // extension the conversations before each compaction stay, above its boundary
6
+ const CHAIN_TYPES = new Set(['user', 'assistant', 'progress', 'system', 'attachment']);
7
+ // the jsonl lines that take part in the chain
8
+ export function parseEntries(lines) {
9
+ const entries = [];
10
+ for (const line of lines) {
11
+ try {
12
+ const entry = JSON.parse(line);
13
+ if (CHAIN_TYPES.has(entry.type) && typeof entry.uuid === 'string')
14
+ entries.push(entry);
15
+ }
16
+ catch { }
17
+ }
18
+ return entries;
19
+ }
20
+ const isTurn = (entry) => entry.type === 'user' || entry.type === 'assistant';
21
+ export const isCompactBoundary = (entry) => entry.type === 'system' && entry.subtype === 'compact_boundary';
22
+ const messageIdOf = (entry) => entry.type === 'assistant' && typeof entry.message?.id === 'string' ? entry.message.id : undefined;
23
+ function blockIds(entry, type, key) {
24
+ const content = entry.message?.content;
25
+ if (!Array.isArray(content))
26
+ return [];
27
+ return content.filter((b) => !!b && typeof b === 'object' && b['type'] === type)
28
+ .map((b) => b[key])
29
+ .filter((id) => typeof id === 'string');
30
+ }
31
+ const hasToolResult = (entry) => entry.type === 'user' && !!entry.parentUuid && blockIds(entry, 'tool_result', 'tool_use_id').length > 0;
32
+ // relink messages a compaction preserved behind its boundary
33
+ function applyCompactLinks(byUuid) {
34
+ for (const entry of [...byUuid.values()]) {
35
+ if (entry.type !== 'system' || entry.subtype !== 'compact_boundary')
36
+ continue;
37
+ const preserved = entry.compactMetadata?.preservedMessages;
38
+ const segment = entry.compactMetadata?.preservedSegment;
39
+ if (preserved) {
40
+ if (preserved.uuids.length === 0 || preserved.uuids.some((uuid) => !byUuid.has(uuid)))
41
+ continue;
42
+ let parent = preserved.anchorUuid;
43
+ for (const uuid of preserved.uuids) {
44
+ byUuid.set(uuid, { ...byUuid.get(uuid), parentUuid: parent });
45
+ parent = uuid;
46
+ }
47
+ const [head, tail] = [preserved.uuids[0], preserved.uuids.at(-1)];
48
+ for (const [uuid, other] of byUuid) {
49
+ if (other.parentUuid === preserved.anchorUuid && uuid !== head)
50
+ byUuid.set(uuid, { ...other, parentUuid: tail });
51
+ }
52
+ }
53
+ else if (segment) {
54
+ const head = byUuid.get(segment.headUuid);
55
+ if (head)
56
+ byUuid.set(segment.headUuid, { ...head, parentUuid: segment.anchorUuid });
57
+ for (const [uuid, other] of byUuid) {
58
+ if (other.parentUuid === segment.anchorUuid && uuid !== segment.headUuid)
59
+ byUuid.set(uuid, { ...other, parentUuid: segment.tailUuid });
60
+ }
61
+ }
62
+ }
63
+ }
64
+ // the newest user/assistant entry the main conversation ends on
65
+ function findLeaf(entries, byUuid, order) {
66
+ const main = (e) => !e.isSidechain && !e.teamName && e.type !== 'progress' && !(e.type === 'attachment' && e.attachment?.type === 'fork_briefing');
67
+ const mainParents = new Set();
68
+ for (const e of byUuid.values())
69
+ if (e.parentUuid && main(e))
70
+ mainParents.add(e.parentUuid);
71
+ const leaves = [...byUuid.values()].filter((e) => main(e) && !mainParents.has(e.uuid))
72
+ .sort((a, b) => (order.get(b.uuid) ?? -1) - (order.get(a.uuid) ?? -1));
73
+ const visited = new Set();
74
+ for (const leaf of leaves) {
75
+ const walked = new Set();
76
+ for (let e = leaf; e && !visited.has(e.uuid) && !walked.has(e.uuid); e = e.parentUuid ? byUuid.get(e.parentUuid) : undefined) {
77
+ if (isTurn(e))
78
+ return e;
79
+ walked.add(e.uuid);
80
+ }
81
+ for (const uuid of walked)
82
+ visited.add(uuid);
83
+ }
84
+ // no main leaf reaches a turn: take the newest turn above any leaf
85
+ const parents = new Set();
86
+ for (const e of byUuid.values())
87
+ if (e.parentUuid)
88
+ parents.add(e.parentUuid);
89
+ const candidates = [];
90
+ for (const leaf of entries.filter((e) => !parents.has(e.uuid))) {
91
+ const seen = new Set();
92
+ for (let e = leaf; e && !seen.has(e.uuid); e = e.parentUuid ? byUuid.get(e.parentUuid) : undefined) {
93
+ seen.add(e.uuid);
94
+ if (isTurn(e)) {
95
+ candidates.push(e);
96
+ break;
97
+ }
98
+ }
99
+ }
100
+ if (candidates.length === 0)
101
+ return undefined;
102
+ const newest = (list) => list.reduce((a, b) => ((order.get(b.uuid) ?? -1) > (order.get(a.uuid) ?? -1) ? b : a));
103
+ const plain = candidates.filter((e) => !e.isSidechain && !e.teamName && !e.isMeta);
104
+ return newest(plain.length > 0 ? plain : candidates);
105
+ }
106
+ const push = (map, key, value) => {
107
+ const list = map.get(key);
108
+ if (list)
109
+ list.push(value);
110
+ else
111
+ map.set(key, [value]);
112
+ };
113
+ const resultIds = (entry) => blockIds(entry, 'tool_result', 'tool_use_id');
114
+ const sameThread = (a, b) => (a.isSidechain ?? false) === (b.isSidechain ?? false) && a.agentId === b.agentId;
115
+ const byTime = (a, b) => (a.timestamp ?? '').localeCompare(b.timestamp ?? '');
116
+ function indexLines(byUuid) {
117
+ const linesOf = new Map();
118
+ const toolOwner = new Map();
119
+ const results = [];
120
+ for (const e of byUuid.values()) {
121
+ const id = messageIdOf(e);
122
+ if (!id) {
123
+ if (hasToolResult(e))
124
+ results.push(e);
125
+ continue;
126
+ }
127
+ push(linesOf, id, e);
128
+ for (const toolId of blockIds(e, 'tool_use', 'id')) {
129
+ const owner = toolOwner.get(toolId);
130
+ toolOwner.set(toolId, owner === undefined || (owner !== null && messageIdOf(owner) === id) ? e : null);
131
+ }
132
+ }
133
+ const children = new Map();
134
+ const linked = new Set();
135
+ const link = (parent, child) => {
136
+ const key = `${parent}\n${child.uuid}`;
137
+ if (linked.has(key))
138
+ return;
139
+ linked.add(key);
140
+ push(children, parent, child);
141
+ };
142
+ for (const result of results) {
143
+ link(result.parentUuid, result);
144
+ const source = result.sourceToolAssistantUUID && result.sourceToolAssistantUUID !== result.parentUuid ? byUuid.get(result.sourceToolAssistantUUID) : undefined;
145
+ if (source && sameThread(result, source))
146
+ link(source.uuid, result);
147
+ for (const toolId of resultIds(result)) {
148
+ const owner = toolOwner.get(toolId);
149
+ if (owner && sameThread(result, owner))
150
+ link(owner.uuid, result);
151
+ }
152
+ }
153
+ return { linesOf, toolOwner, children };
154
+ }
155
+ // the off-chain lines of one assistant message and the results answering them, oldest first
156
+ function siblingsOf(lines, index, onChain, answered, fileOrder) {
157
+ const lineIds = new Set(lines.map((e) => e.uuid));
158
+ const direct = [];
159
+ const indirect = [];
160
+ const seen = new Set();
161
+ for (const line of lines) {
162
+ for (const child of index.children.get(line.uuid) ?? []) {
163
+ if (onChain.has(child.uuid) || seen.has(child.uuid))
164
+ continue;
165
+ seen.add(child.uuid);
166
+ (lineIds.has(child.parentUuid ?? '') ? direct : indirect).push(child);
167
+ }
168
+ }
169
+ // a result hanging off another line counts when it answers a tool use of this message nobody
170
+ // answered yet. the chain's answers are looked up in place, not copied for every message
171
+ if (indirect.length > 0) {
172
+ const local = new Set(direct.flatMap(resultIds));
173
+ const covered = (toolId) => answered.has(toolId) || local.has(toolId);
174
+ indirect.sort((a, b) => (fileOrder.get(a.uuid) ?? Infinity) - (fileOrder.get(b.uuid) ?? Infinity));
175
+ for (const e of indirect) {
176
+ const toolIds = resultIds(e);
177
+ if (!toolIds.some((toolId) => !covered(toolId) && lineIds.has(index.toolOwner.get(toolId)?.uuid ?? '')))
178
+ continue;
179
+ for (const toolId of toolIds)
180
+ local.add(toolId);
181
+ direct.push(e);
182
+ }
183
+ }
184
+ return [...lines.filter((e) => !onChain.has(e.uuid)).sort(byTime), ...direct.sort(byTime)];
185
+ }
186
+ // assistant lines of one message that are off the chain, and the tool results answering them
187
+ function withSiblings(byUuid, chain, onChain) {
188
+ const index = indexLines(byUuid);
189
+ const answered = new Set(chain.flatMap(resultIds));
190
+ const fileOrder = new Map([...byUuid.keys()].map((uuid, i) => [uuid, i]));
191
+ // the last chain line of each message carries the siblings after it
192
+ const anchorOf = new Map();
193
+ for (const e of chain) {
194
+ const id = messageIdOf(e);
195
+ if (id)
196
+ anchorOf.set(id, e);
197
+ }
198
+ const extras = new Map();
199
+ for (const [id, anchor] of anchorOf) {
200
+ const added = siblingsOf(index.linesOf.get(id) ?? [anchor], index, onChain, answered, fileOrder);
201
+ if (added.length === 0)
202
+ continue;
203
+ for (const e of added)
204
+ onChain.add(e.uuid);
205
+ extras.set(anchor.uuid, added);
206
+ }
207
+ if (extras.size === 0)
208
+ return chain;
209
+ return chain.flatMap((e) => [e, ...(extras.get(e.uuid) ?? [])]);
210
+ }
211
+ // a queued prompt claude went on to answer becomes the user message it was; background task
212
+ // notifications are no prompts (the extension draws them apart, the app does not show them)
213
+ function queuedPrompts(chain) {
214
+ let answered = false;
215
+ const out = new Array(chain.length);
216
+ for (let i = chain.length - 1; i >= 0; i--) {
217
+ const e = chain[i];
218
+ const prompt = e.attachment?.prompt;
219
+ if (answered && e.type === 'attachment' && e.attachment?.type === 'queued_command' && !e.attachment.isMeta
220
+ && e.attachment.commandMode !== 'task-notification' && (typeof prompt === 'string' || Array.isArray(prompt))) {
221
+ out[i] = { ...e, type: 'user', uuid: e.attachment.source_uuid ?? e.uuid, message: { role: 'user', content: prompt } };
222
+ }
223
+ else {
224
+ out[i] = e;
225
+ }
226
+ if (e.type === 'assistant' || hasToolResult(e))
227
+ answered = true;
228
+ else if (e.type === 'user' && !e.isMeta && !e.isCompactSummary)
229
+ answered = false;
230
+ }
231
+ return out;
232
+ }
233
+ // the conversations before each compaction, on the lines as claude wrote them: there the
234
+ // messages a compaction preserved still sit before its boundary, so they show once, above it
235
+ function withEarlierSegments(chain, written) {
236
+ let earlier = [];
237
+ const visited = new Set();
238
+ for (let first = chain[0]; first && isCompactBoundary(first) && first.logicalParentUuid;) {
239
+ const segment = [];
240
+ for (let e = written.get(first.logicalParentUuid); e && !visited.has(e.uuid); e = e.parentUuid ? written.get(e.parentUuid) : undefined) {
241
+ visited.add(e.uuid);
242
+ segment.push(e);
243
+ }
244
+ earlier = [...segment.reverse(), ...earlier];
245
+ first = segment[0];
246
+ }
247
+ return earlier.length === 0 ? chain : [...earlier, ...chain.filter((e) => !visited.has(e.uuid))];
248
+ }
249
+ // the user and assistant entries of the active conversation and the compactions in it, oldest first
250
+ export function buildConversation(entries) {
251
+ const written = new Map();
252
+ for (const e of entries)
253
+ written.set(e.uuid, e);
254
+ const byUuid = new Map(written);
255
+ applyCompactLinks(byUuid);
256
+ const order = new Map(entries.map((e, i) => [e.uuid, i]));
257
+ const leaf = findLeaf(entries, byUuid, order);
258
+ if (!leaf)
259
+ return [];
260
+ const chain = [];
261
+ const onChain = new Set();
262
+ for (let e = byUuid.get(leaf.uuid); e && !onChain.has(e.uuid); e = e.parentUuid ? byUuid.get(e.parentUuid) : undefined) {
263
+ onChain.add(e.uuid);
264
+ chain.push(e);
265
+ }
266
+ const conversation = withEarlierSegments(chain.reverse(), written);
267
+ for (const e of conversation)
268
+ onChain.add(e.uuid);
269
+ return queuedPrompts(withSiblings(byUuid, conversation, onChain))
270
+ .filter((e) => (isTurn(e) || isCompactBoundary(e)) && !e.isMeta && !e.isSidechain && !e.teamName && !e.isCompactSummary);
271
+ }
272
+ //# sourceMappingURL=conversation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../src/claude/conversation.ts"],"names":[],"mappings":"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"}