kumo-cli 1.1.0 → 1.2.1

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 (96) hide show
  1. package/README.md +140 -131
  2. package/dist/auth/credentialsStore.js +19 -6
  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 +98 -93
  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 +0 -5
  11. package/dist/core/config.js.map +1 -1
  12. package/dist/core/logger.js +47 -6
  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 +4 -0
  17. package/dist/engine/claudeArgs.js.map +1 -1
  18. package/dist/engine/claudeBinary.js +14 -5
  19. package/dist/engine/claudeBinary.js.map +1 -1
  20. package/dist/engine/claudeConfig.js +20 -6
  21. package/dist/engine/claudeConfig.js.map +1 -1
  22. package/dist/engine/claudeLogin.js +76 -0
  23. package/dist/engine/claudeLogin.js.map +1 -0
  24. package/dist/engine/controlChannel.js +13 -1
  25. package/dist/engine/controlChannel.js.map +1 -1
  26. package/dist/engine/liveTranscript.js +70 -21
  27. package/dist/engine/liveTranscript.js.map +1 -1
  28. package/dist/engine/ndjson.js +15 -10
  29. package/dist/engine/ndjson.js.map +1 -1
  30. package/dist/engine/permissions.js +5 -2
  31. package/dist/engine/permissions.js.map +1 -1
  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 +99 -84
  39. package/dist/engine/sessionManager.js.map +1 -1
  40. package/dist/engine/settingsCommands.js +56 -0
  41. package/dist/engine/settingsCommands.js.map +1 -1
  42. package/dist/engine/streamSession.js +59 -66
  43. package/dist/engine/streamSession.js.map +1 -1
  44. package/dist/engine/taskTracker.js +1 -1
  45. package/dist/engine/taskTracker.js.map +1 -1
  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 +0 -55
  55. package/dist/handlers/promptImages.js.map +1 -1
  56. package/dist/handlers/runtimeHandlers.js +51 -151
  57. package/dist/handlers/runtimeHandlers.js.map +1 -1
  58. package/dist/handlers/sessionHandlers.js +48 -14
  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 +58 -16
  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 +5 -5
  73. package/dist/services/cliRuntime.js.map +1 -1
  74. package/dist/services/fileService.js +50 -24
  75. package/dist/services/fileService.js.map +1 -1
  76. package/dist/services/forkService.js +1 -1
  77. package/dist/services/forkService.js.map +1 -1
  78. package/dist/services/modelService.js +62 -18
  79. package/dist/services/modelService.js.map +1 -1
  80. package/dist/services/pairingService.js +21 -15
  81. package/dist/services/pairingService.js.map +1 -1
  82. package/dist/services/sessionService.js +204 -85
  83. package/dist/services/sessionService.js.map +1 -1
  84. package/dist/services/tunnelHelpers.js +9 -5
  85. package/dist/services/tunnelHelpers.js.map +1 -1
  86. package/dist/services/tunnelService.js +17 -0
  87. package/dist/services/tunnelService.js.map +1 -1
  88. package/dist/transport/wsClient.js +60 -38
  89. package/dist/transport/wsClient.js.map +1 -1
  90. package/dist/utils/json.js +7 -0
  91. package/dist/utils/json.js.map +1 -0
  92. package/dist/utils/localHost.js +17 -0
  93. package/dist/utils/localHost.js.map +1 -0
  94. package/dist/utils/safePath.js +51 -20
  95. package/dist/utils/safePath.js.map +1 -1
  96. package/package.json +62 -62
package/README.md CHANGED
@@ -1,131 +1,140 @@
1
- # Kumo CLI
2
-
3
- A lightweight companion CLI for Kumo that connects your local terminal sessions to the Kumo app.
4
-
5
- ---
6
-
7
- ## ✨ Features
8
-
9
- - Pair once with a short code from the app
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
-
15
- ---
16
-
17
- ## 📦 Installation
18
-
19
- ### Global install
20
-
21
- ```bash
22
- npm install -g kumo-cli
23
- ```
24
-
25
- ### One-off via npx
26
-
27
- ```bash
28
- npx kumo-cli@latest
29
- ```
30
-
31
- ---
32
-
33
- ## ✅ Requirements
34
-
35
- - Node.js **18+**
36
- - Internet access to reach your Kumo backend
37
- - Native build prerequisites for `node-pty` (used by the in-app terminal):
38
- - **Windows:** Visual Studio Build Tools + Python 3
39
- - **macOS:** Xcode Command Line Tools (`xcode-select --install`)
40
- - **Linux:** `build-essential`, `python3`, `make`, `gcc`
41
- - [Claude Code CLI](https://docs.anthropic.com/claude/docs/claude-code) installed and on `PATH` (only if you plan to use the Claude session features)
42
-
43
- ---
44
-
45
- ## 🛠️ Configuration
46
-
47
- Kumo CLI is configured via environment variables. Export them in your shell or load them explicitly with `--env-file path/to/.env`.
48
-
49
- | Variable | Default | Description |
50
- | --- | --- | --- |
51
- | `KUMO_SERVER_URL` | `https://kumocli.com/` | Base URL of the Kumo backend. Auto-derives HTTP & WS endpoints. |
52
- | `KUMO_SERVER_HTTP_URL` | derived | Override the HTTP endpoint explicitly. |
53
- | `KUMO_SERVER_WS_URL` | derived | Override the WebSocket endpoint explicitly. |
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
-
58
- Credentials are persisted to `~/.kumo/credentials.json`.
59
-
60
- The CLI also keeps a stable device identity in `~/.kumo/device.json` so pairing the same machine again after `kumo reset` reuses the existing machine entry instead of creating a duplicate.
61
-
62
- ---
63
-
64
- ## 🧭 Usage
65
-
66
- ```bash
67
- kumo claude --env-file .env
68
- kumo claude --env-file .env.local
69
- kumo codex
70
- kumo --help
71
- ```
72
-
73
- Run `kumo` without `claude` or `codex` to choose an agent from the menu. Codex support is currently under development.
74
-
75
- To clear one agent's current token and pair again on the same machine, run:
76
-
77
- ```bash
78
- kumo reset claude
79
- kumo reset codex
80
- ```
81
-
82
- 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.
83
-
84
- ---
85
-
86
- ## 🧱 How it works
87
-
88
- ```
89
- ┌─────────────┐ WebSocket ┌──────────────┐ stream-json ┌─────────────┐
90
- │ Kumo app │ ◄────────────► │ Kumo CLI │ ◄─────────► │ Claude Code │
91
- └─────────────┘ └──────────────┘ (1 per └─────────────┘
92
- session)
93
- ▲ │
94
- │ HTTP (pairing) │
95
- └────────────────────────────────┘
96
- Kumo backend
97
- ```
98
-
99
- 1. The CLI pairs with the backend using the 9-digit code → receives a long-lived `deviceToken`.
100
- 2. It opens a WebSocket to the backend and announces itself.
101
- 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.
102
- 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.
103
-
104
- ---
105
-
106
- ## 🐞 Troubleshooting
107
-
108
- - **`node-pty` build fails** — make sure your toolchain (above) is installed, then re-run `npm install -g kumo-cli`.
109
- - **Pairing code rejected** — codes are single-use and expire quickly. Generate a fresh one in the app.
110
- - **Cannot connect** — verify `KUMO_SERVER_URL` matches the backend the app is talking to.
111
- - **"Claude is not logged in"** — run `claude` once on the machine and sign in, then send the prompt again.
112
- - **Wrong Claude binary** — set `KUMO_CLAUDE_BIN` to the `claude` executable you want the CLI to use.
113
-
114
- ---
115
-
116
- ## 🤝 Contributing
117
-
118
- Issues and PRs are welcome at [github.com/kumo-app/kumo](https://github.com/kumo-app/kumo).
119
-
120
- ```bash
121
- git clone https://github.com/kumo-app/kumo.git
122
- cd kumo/cli
123
- npm install
124
- npm run dev
125
- ```
126
-
127
- ---
128
-
129
- ## 📄 License
130
-
131
- [MIT](./LICENSE) © Kumo
1
+ # Kumo CLI
2
+
3
+ A lightweight companion CLI for Kumo that connects your local terminal sessions to the Kumo app.
4
+
5
+ ---
6
+
7
+ ## ✨ Features
8
+
9
+ - Pair once with a short code from the app
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
+
15
+ ---
16
+
17
+ ## 📦 Installation
18
+
19
+ ### Global install
20
+
21
+ ```bash
22
+ npm install -g kumo-cli
23
+ ```
24
+
25
+ ### One-off via npx
26
+
27
+ ```bash
28
+ npx kumo-cli@latest
29
+ ```
30
+
31
+ ---
32
+
33
+ ## ✅ Requirements
34
+
35
+ - Node.js **20+**
36
+ - Internet access to reach your Kumo backend
37
+ - Native build prerequisites for `node-pty` (used by the in-app terminal):
38
+ - **Windows:** Visual Studio Build Tools + Python 3
39
+ - **macOS:** Xcode Command Line Tools (`xcode-select --install`)
40
+ - **Linux:** `build-essential`, `python3`, `make`, `gcc`
41
+ - [Claude Code CLI](https://docs.anthropic.com/claude/docs/claude-code) installed and on `PATH` (only if you plan to use the Claude session features)
42
+
43
+ ---
44
+
45
+ ## 🛠️ Configuration
46
+
47
+ Kumo CLI is configured via environment variables. Export them in your shell or load them explicitly with `--env-file path/to/.env`.
48
+
49
+ | Variable | Default | Description |
50
+ | --- | --- | --- |
51
+ | `KUMO_SERVER_URL` | `https://kumocli.com/` | Base URL of the Kumo backend. Auto-derives HTTP & WS endpoints. |
52
+ | `KUMO_SERVER_HTTP_URL` | derived | Override the HTTP endpoint explicitly. |
53
+ | `KUMO_SERVER_WS_URL` | derived | Override the WebSocket endpoint explicitly. |
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`. |
58
+
59
+ Credentials are persisted to `~/.kumo/credentials.json`.
60
+
61
+ The CLI also keeps a stable device identity in `~/.kumo/device.json` so pairing the same machine again after `kumo reset` reuses the existing machine entry instead of creating a duplicate.
62
+
63
+ ---
64
+
65
+ ## 🧭 Usage
66
+
67
+ ```bash
68
+ kumo claude --env-file .env
69
+ kumo claude --env-file .env.local
70
+ kumo codex
71
+ kumo --help
72
+ ```
73
+
74
+ Run `kumo` without `claude` or `codex` to choose an agent from the menu. Codex support is currently under development.
75
+
76
+ To clear one agent's current token and pair again on the same machine, run:
77
+
78
+ ```bash
79
+ kumo reset claude
80
+ kumo reset codex
81
+ ```
82
+
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.
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
+
93
+ ---
94
+
95
+ ## 🧱 How it works
96
+
97
+ ```
98
+ ┌─────────────┐ WebSocket ┌──────────────┐ stream-json ┌─────────────┐
99
+ │ Kumo app │ ◄────────────► │ Kumo CLI │ ◄─────────► │ Claude Code │
100
+ └─────────────┘ └──────────────┘ (1 per └─────────────┘
101
+ session)
102
+ ▲ │
103
+ │ HTTP (pairing) │
104
+ └────────────────────────────────┘
105
+ Kumo backend
106
+ ```
107
+
108
+ 1. The CLI pairs with the backend using the 9-digit code → receives a long-lived `deviceToken`.
109
+ 2. It opens a WebSocket to the backend and announces itself.
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.
112
+
113
+ ---
114
+
115
+ ## 🐞 Troubleshooting
116
+
117
+ - **`node-pty` build fails** — make sure your toolchain (above) is installed, then re-run `npm install -g kumo-cli`.
118
+ - **Pairing code rejected** — codes are single-use and expire quickly. Generate a fresh one in the app.
119
+ - **Cannot connect** — verify `KUMO_SERVER_URL` matches the backend the app is talking to.
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.
122
+
123
+ ---
124
+
125
+ ## 🤝 Contributing
126
+
127
+ Issues and PRs are welcome at [github.com/kumo-app/kumo](https://github.com/kumo-app/kumo).
128
+
129
+ ```bash
130
+ git clone https://github.com/kumo-app/kumo.git
131
+ cd kumo/cli
132
+ npm install
133
+ npm run dev
134
+ ```
135
+
136
+ ---
137
+
138
+ ## 📄 License
139
+
140
+ [MIT](./LICENSE) © Kumo
@@ -12,11 +12,26 @@ function credentialsFileName(agent = 'claude') {
12
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":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAezC,MAAM,YAAY,GAAG,eAAe,CAAC;AACrC,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAC1C,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAEvC,SAAS,mBAAmB,CAAC,QAAmB,QAAQ;IACtD,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,KAAK,mBAAmB,CAAC;AAC3E,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,OAAO;IACrB,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC;AAED,gGAAgG;AAChG,SAAS,aAAa;IACpB,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,gFAAgF;AAChF,SAAS,QAAQ,CAAC,MAAc,EAAE,IAAY;IAC5C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO;IACzC,IAAI,CAAC;QAAC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AAC9C,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,IAAa;IAC/C,aAAa,EAAE,CAAC;IAChB,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1F,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,eAAe,CAAC,QAAmB,QAAQ;IACzD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAoB,CAAC;QAC7E,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QAC3D,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,eAAe,CAAC,KAAsB,EAAE,QAAmB,QAAQ;IACjF,YAAY,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;QAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAuB,CAAC;QAChF,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,YAAY,CAAC,kBAAkB,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IACnD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,gBAAgB,CAAC,cAAuB;IACtD,MAAM,QAAQ,GAAG,kBAAkB,EAAE,EAAE,UAAU,CAAC;IAClD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,kBAAkB,CAAC,cAAc,IAAI,UAAU,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,gBAAgB,CAAC,QAAmB,QAAQ;IAC1D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACvC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAmB,QAAQ;IACzD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAChD,CAAC"}
@@ -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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"}