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
@@ -0,0 +1,444 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { log } from '../core/logger.js';
3
+ import { findSessionJsonl } from '../services/sessionService.js';
4
+ import { readAuthStatus } from './settingsCommands.js';
5
+ import { CONTROL_WHITELIST, LIVE_ONLY_CONTROLS, OWN_PROCESS_CONTROLS, SESSION_SCOPED_CONTROLS, controlPayload, controlTimeoutMs, sanitizeControlResponse, withoutProviderConfig } from './claudeConfig.js';
6
+ import { ClaudeLogin } from './claudeLogin.js';
7
+ import { ProbePool } from './probePool.js';
8
+ import { NOT_LOGGED_IN_MESSAGE, StreamSession } from './streamSession.js';
9
+ export const MAX_LIVE_SESSIONS = 6;
10
+ // provider identity of a model selection (its context window too, as both are set at spawn);
11
+ // undefined (device default) is unknown until spawn
12
+ const providerKey = (model) => model === undefined ? null : `${model?.baseURL ?? ''}|${model?.apiKey ?? ''}|${model?.contextWindow ?? ''}`;
13
+ // owns every claude session of this cli: lazy spawn and the live-process cap
14
+ export class SessionManager {
15
+ options;
16
+ entries = new Map();
17
+ recentId = null;
18
+ config = null;
19
+ // claude's oauth in a throwaway process while the user signs in
20
+ login;
21
+ probing = null;
22
+ probes = new ProbePool(() => this.startProbe());
23
+ maxLive;
24
+ defaultPermissionMode;
25
+ allowBypass;
26
+ sessionExists;
27
+ constructor(options) {
28
+ this.options = options;
29
+ this.login = new ClaudeLogin({
30
+ spawnSpec: options.spawnSpec,
31
+ closeGraceMs: options.closeGraceMs,
32
+ onFinish: (error) => this.finishLogin(error),
33
+ });
34
+ this.maxLive = options.maxLive ?? MAX_LIVE_SESSIONS;
35
+ this.defaultPermissionMode = options.defaultPermissionMode ?? 'default';
36
+ this.allowBypass = options.allowBypass ?? false;
37
+ this.sessionExists = options.sessionExists ?? ((sessionId) => findSessionJsonl(sessionId) !== null);
38
+ }
39
+ get recentSessionId() { return this.recentId; }
40
+ // bypass runs every tool unasked; only the local --dangerously-skip-permissions opt-in allows it
41
+ permits(mode) {
42
+ return mode !== 'bypassPermissions' || this.allowBypass;
43
+ }
44
+ // register (or update) a session without spawning; returns true when its model changed
45
+ open(sessionId, opts = {}) {
46
+ this.recentId = sessionId;
47
+ const mode = opts.permissionMode && this.permits(opts.permissionMode) ? opts.permissionMode : undefined;
48
+ let entry = this.entries.get(sessionId);
49
+ if (!entry) {
50
+ entry = {
51
+ sessionId,
52
+ model: opts.model,
53
+ permissionMode: mode ?? this.defaultPermissionMode,
54
+ session: null,
55
+ starting: null,
56
+ restartWhenIdle: false,
57
+ };
58
+ this.entries.set(sessionId, entry);
59
+ return false;
60
+ }
61
+ if (mode)
62
+ entry.permissionMode = mode;
63
+ if (!('model' in opts) || JSON.stringify(opts.model) === JSON.stringify(entry.model))
64
+ return false;
65
+ entry.model = opts.model;
66
+ return true;
67
+ }
68
+ has(sessionId) { return this.entries.has(sessionId); }
69
+ isRunning(sessionId) {
70
+ return this.entries.get(sessionId)?.session?.alive === true;
71
+ }
72
+ liveSessionIds() {
73
+ return this.liveEntries().map((e) => e.sessionId);
74
+ }
75
+ // spawn the session process when it is not live yet
76
+ async ensureRunning(sessionId) {
77
+ const entry = this.entryFor(sessionId);
78
+ // a session on its way out (a restart, an eviction) takes no more input: wait, then respawn
79
+ if (entry.session?.closing)
80
+ await entry.session.waitForExit();
81
+ if (entry.session?.alive)
82
+ return entry.session;
83
+ if (!entry.starting)
84
+ entry.starting = this.spawn(entry).finally(() => { entry.starting = null; });
85
+ return entry.starting;
86
+ }
87
+ async sendPrompt(sessionId, text, images = [], uuid) {
88
+ const entry = this.entryFor(sessionId);
89
+ this.recentId = sessionId;
90
+ entry.title ??= text.trim().slice(0, 80) || undefined;
91
+ const session = await this.ensureRunning(sessionId);
92
+ if (!session.sendPrompt(text, images, uuid))
93
+ throw new Error('claude process exited before the prompt was sent');
94
+ }
95
+ async interrupt(sessionId) {
96
+ const session = this.entries.get(sessionId)?.session;
97
+ if (session?.alive)
98
+ await session.interrupt();
99
+ }
100
+ // route a permission answer; a missing session id falls back to searching every live session
101
+ respondPermission(sessionId, requestId, decision) {
102
+ const candidates = sessionId ? [this.entries.get(sessionId)] : [...this.entries.values()];
103
+ return candidates.some((entry) => entry?.session?.respondPermission(requestId, decision) === true);
104
+ }
105
+ async setMode(sessionId, mode) {
106
+ const entry = this.entryFor(sessionId);
107
+ // a live session reports the new mode itself and syncs it back to the entry on exit
108
+ const session = entry.session;
109
+ if (session?.alive) {
110
+ try {
111
+ await session.setPermissionMode(mode);
112
+ }
113
+ catch (error) {
114
+ // e.g. auto mode gated off for this account: put the app back on the real mode
115
+ this.options.emit({ type: 'claude_status', sessionId, permissionMode: session.permissionMode });
116
+ throw error;
117
+ }
118
+ return;
119
+ }
120
+ if (!this.permits(mode)) {
121
+ this.options.emit({ type: 'claude_status', sessionId, permissionMode: entry.permissionMode });
122
+ throw new Error('bypass permissions is not enabled on this machine (start kumo with --dangerously-skip-permissions)');
123
+ }
124
+ entry.permissionMode = mode;
125
+ this.options.emit({ type: 'claude_status', sessionId, permissionMode: mode });
126
+ }
127
+ // restart a live session with --resume so new spawn settings apply; deferred while a turn runs
128
+ async restart(sessionId) {
129
+ const entry = this.entries.get(sessionId);
130
+ if (!entry?.session?.alive)
131
+ return;
132
+ if (entry.session.state !== 'idle') {
133
+ entry.restartWhenIdle = true;
134
+ return;
135
+ }
136
+ entry.restartWhenIdle = false;
137
+ await entry.session.close('restart');
138
+ // deleted while it closed: spawning it again would leave a process nobody owns
139
+ if (this.entries.get(sessionId) !== entry)
140
+ return;
141
+ await this.ensureRunning(sessionId);
142
+ }
143
+ // apply a changed model to a live session: in place when the provider is unchanged, else resume in a new process
144
+ async applyModel(sessionId) {
145
+ const entry = this.entries.get(sessionId);
146
+ const session = entry?.session;
147
+ if (!entry || !session?.alive)
148
+ return;
149
+ const key = providerKey(entry.model);
150
+ if (key !== null && key === providerKey(entry.spawnedModel)) {
151
+ try {
152
+ await session.setModel(entry.model?.model || null);
153
+ entry.spawnedModel = entry.model;
154
+ return;
155
+ }
156
+ catch (error) {
157
+ log(`[engine] set_model failed, restarting: ${error.message}`);
158
+ }
159
+ }
160
+ await this.restart(sessionId);
161
+ }
162
+ // effort is device-wide: live sessions switch in place, new spawns get --effort
163
+ async applyEffort(effort) {
164
+ await Promise.all(this.liveEntries().map(async (entry) => {
165
+ try {
166
+ await entry.session.controlRequest({ subtype: 'apply_flag_settings', settings: { effortLevel: effort } });
167
+ }
168
+ catch (error) {
169
+ log(`[engine] effort switch failed, restarting: ${error.message}`);
170
+ await this.restart(entry.sessionId);
171
+ }
172
+ }));
173
+ }
174
+ async setFast(sessionId, enabled) {
175
+ const entry = this.entryFor(sessionId);
176
+ entry.fast = enabled;
177
+ if (entry.session?.alive)
178
+ await entry.session.setFast(enabled);
179
+ this.options.emit({ type: 'claude_status', sessionId, fast: enabled });
180
+ }
181
+ async setThinking(sessionId, enabled) {
182
+ const entry = this.entryFor(sessionId);
183
+ entry.thinking = enabled;
184
+ if (entry.session?.alive)
185
+ await entry.session.setThinking(enabled);
186
+ this.options.emit({ type: 'claude_status', sessionId, thinking: enabled });
187
+ }
188
+ // run a whitelisted read-only control request; account-wide ones fall back to any live process or a probe
189
+ async control(sessionId, subtype, payload) {
190
+ if (!CONTROL_WHITELIST.has(subtype))
191
+ throw new Error(`control request ${subtype} is not allowed`);
192
+ const request = { subtype, ...controlPayload(subtype, payload) };
193
+ const timeoutMs = controlTimeoutMs(subtype);
194
+ const entry = sessionId ? this.entries.get(sessionId) : undefined;
195
+ let session = entry?.session?.alive ? entry.session : undefined;
196
+ const liveOnly = LIVE_ONLY_CONTROLS.get(subtype);
197
+ if (!session && liveOnly)
198
+ throw new Error(liveOnly);
199
+ if (!session && sessionId && OWN_PROCESS_CONTROLS.has(subtype))
200
+ session = await this.ensureRunning(sessionId);
201
+ if (!session && SESSION_SCOPED_CONTROLS.has(subtype)) {
202
+ // a saved session is resumed (no message is sent); an unsaved one has nothing to read yet
203
+ if (!sessionId || !this.sessionExists(sessionId))
204
+ throw new Error('Session is not running');
205
+ session = await this.ensureRunning(sessionId);
206
+ }
207
+ // the session's claude already on its way (a read just before resumed it) answers too,
208
+ // rather than a probe started next to it
209
+ if (!session && entry?.starting)
210
+ session = await entry.starting.catch(() => undefined);
211
+ // account-wide: a session on its own provider would answer for that provider's account
212
+ session ??= this.liveEntries().find((e) => !e.model?.baseURL)?.session ?? undefined;
213
+ const response = session
214
+ ? await session.controlRequest(request, timeoutMs)
215
+ : await this.withProbe((probe) => probe.controlRequest(request, timeoutMs));
216
+ return sanitizeControlResponse(subtype, response);
217
+ }
218
+ // ask claude whether it is signed in and tell the app (claude_auth) and the backend (cli_status)
219
+ async refreshAuth() {
220
+ const read = this.options.authStatus ?? (() => readAuthStatus(process.cwd()));
221
+ const status = await read().catch(() => null);
222
+ if (!status)
223
+ return null;
224
+ this.options.emit({ type: 'cli_status', loggedIn: status.loggedIn });
225
+ this.options.emit({ type: 'claude_auth', ...status });
226
+ return status;
227
+ }
228
+ // sign claude in with its own oauth (see ClaudeLogin); once claude says it is done the
229
+ // account and models refresh
230
+ startLogin(useConsole = false) {
231
+ return this.login.start(useConsole);
232
+ }
233
+ submitLoginCode(code) {
234
+ return this.login.submitCode(code);
235
+ }
236
+ cancelLogin() {
237
+ return this.login.cancel();
238
+ }
239
+ async finishLogin(error) {
240
+ this.options.emit({ type: 'claude_login_result', ok: !error, ...(error ? { error: error.message } : {}) });
241
+ await this.refreshAuth();
242
+ if (error)
243
+ return;
244
+ // the new account may see other models
245
+ this.config = null;
246
+ this.sendConfig();
247
+ }
248
+ // a request failed authentication: only a signed-out claude means "not logged in", a custom
249
+ // provider rejecting its key does not
250
+ async handleAuthFailure(sessionId) {
251
+ const status = await this.refreshAuth();
252
+ if (status?.loggedIn !== false)
253
+ return;
254
+ this.options.emit({ type: 'notification', sessionId, level: 'error', message: NOT_LOGGED_IN_MESSAGE });
255
+ }
256
+ // emit the cached claude_config, probing a throwaway process when no session has initialized yet
257
+ sendConfig() {
258
+ if (this.config) {
259
+ this.options.emit({ type: 'claude_config', ...this.config });
260
+ return;
261
+ }
262
+ this.probing ??= this.withProbe(async () => undefined)
263
+ .catch((error) => log(`[engine] config probe failed: ${error.message}`))
264
+ .finally(() => { this.probing = null; });
265
+ }
266
+ // stop the process; forget drops the session registration entirely
267
+ async close(sessionId, opts = {}) {
268
+ const entry = this.entries.get(sessionId);
269
+ if (!entry)
270
+ return;
271
+ // forget first, so a restart running meanwhile does not bring it back
272
+ if (opts.forget) {
273
+ this.entries.delete(sessionId);
274
+ if (this.recentId === sessionId)
275
+ this.recentId = null;
276
+ }
277
+ if (entry.starting)
278
+ await entry.starting.catch(() => undefined);
279
+ await entry.session?.close(opts.reason ?? 'closed');
280
+ }
281
+ async closeAll() {
282
+ await Promise.all([...this.entries.keys()].map((sessionId) => this.close(sessionId)));
283
+ await Promise.all([this.probes.close(), this.login.cancel()]);
284
+ }
285
+ // emit the current turn state and pending permissions of a live session (re-attach)
286
+ replay(sessionId) {
287
+ const session = this.entries.get(sessionId)?.session;
288
+ if (!session?.alive)
289
+ return;
290
+ this.options.emit({ type: 'claude_turn', sessionId, state: session.state, ...(session.label ? { label: session.label } : {}) });
291
+ for (const request of session.pendingRequests)
292
+ this.options.emit({ ...request });
293
+ }
294
+ snapshot() {
295
+ const sessions = [];
296
+ for (const entry of this.entries.values()) {
297
+ const session = entry.session;
298
+ if (!session?.alive)
299
+ continue;
300
+ sessions.push({
301
+ sessionId: entry.sessionId,
302
+ state: session.state,
303
+ label: session.label,
304
+ permissionMode: session.permissionMode,
305
+ model: session.model || entry.model?.model || undefined,
306
+ thinking: entry.thinking,
307
+ fast: entry.fast,
308
+ fastMode: session.fastMode,
309
+ title: entry.title,
310
+ pending: session.pendingRequests,
311
+ queued: session.queuedPrompts,
312
+ tasks: session.taskList,
313
+ });
314
+ }
315
+ return { sessions };
316
+ }
317
+ // the session's entry, registering it first when it is unknown
318
+ entryFor(sessionId) {
319
+ if (!this.entries.has(sessionId))
320
+ this.open(sessionId);
321
+ return this.entries.get(sessionId);
322
+ }
323
+ liveEntries() {
324
+ return [...this.entries.values()].filter((e) => e.session?.alive);
325
+ }
326
+ // the first config goes out whole, later ones only as the keys that changed: every spawn
327
+ // initializes again, usually with the very same config
328
+ updateConfig(patch) {
329
+ const previous = this.config;
330
+ this.config = { ...previous, ...patch };
331
+ if (!previous) {
332
+ this.options.emit({ type: 'claude_config', ...this.config });
333
+ return;
334
+ }
335
+ const changed = Object.fromEntries(Object.entries(patch).filter(([key, value]) => JSON.stringify(value) !== JSON.stringify(previous[key])));
336
+ if (Object.keys(changed).length > 0)
337
+ this.options.emit({ type: 'claude_config', patch: true, ...changed });
338
+ }
339
+ // spawn a silent session (no transcript, no app events) just to run initialize-time requests.
340
+ // it runs claude on its own login (null, not the device default): what it reads is claude's,
341
+ // its models and account above all, never those of a provider the Kumo default points at
342
+ withProbe(fn) {
343
+ return this.probes.use(fn);
344
+ }
345
+ async startProbe() {
346
+ const sessionId = randomUUID();
347
+ const spec = await this.options.spawnSpec({
348
+ sessionId,
349
+ resume: false,
350
+ permissionMode: this.defaultPermissionMode,
351
+ allowBypass: this.allowBypass,
352
+ model: null,
353
+ });
354
+ const probe = new StreamSession({
355
+ sessionId,
356
+ permissionMode: this.defaultPermissionMode,
357
+ emit: () => { },
358
+ onConfig: (patch) => this.updateConfig(patch),
359
+ // a probe never sends a prompt; stay quiet instead of flagging the login
360
+ onAuthFailure: () => undefined,
361
+ closeGraceMs: this.options.closeGraceMs,
362
+ });
363
+ probe.start(spec);
364
+ try {
365
+ await probe.ready;
366
+ }
367
+ catch (error) {
368
+ await probe.close('probe');
369
+ throw error;
370
+ }
371
+ return probe;
372
+ }
373
+ liveCount(exceptId) {
374
+ return [...this.entries.values()].filter((e) => e.sessionId !== exceptId && (e.session?.alive || e.starting)).length;
375
+ }
376
+ // close the idle live session with the oldest activity until there is room for one more
377
+ async evictIfNeeded(sessionId) {
378
+ while (this.liveCount(sessionId) >= this.maxLive) {
379
+ const victim = [...this.entries.values()]
380
+ .filter((e) => e.sessionId !== sessionId && e.session?.alive && !e.starting && e.session.state === 'idle' && e.session.pendingRequests.length === 0)
381
+ .sort((a, b) => a.session.lastActivity - b.session.lastActivity)[0];
382
+ if (!victim) {
383
+ log(`[engine] live session cap ${this.maxLive} reached with no idle session to evict`);
384
+ return;
385
+ }
386
+ log(`[engine] evicting idle session ${victim.sessionId}`);
387
+ await this.close(victim.sessionId, { reason: 'evicted' });
388
+ }
389
+ }
390
+ async spawn(entry) {
391
+ await this.evictIfNeeded(entry.sessionId);
392
+ const resume = this.sessionExists(entry.sessionId);
393
+ // what this process starts with: a model or mode picked while the spec was being built
394
+ // (a provider lookup, the adapter proxy) builds it again, so the process starts on it
395
+ let model;
396
+ let permissionMode;
397
+ let spec;
398
+ do {
399
+ ({ model, permissionMode } = entry);
400
+ spec = await this.options.spawnSpec({
401
+ sessionId: entry.sessionId,
402
+ resume,
403
+ permissionMode,
404
+ allowBypass: this.allowBypass,
405
+ model,
406
+ });
407
+ } while (entry.model !== model || entry.permissionMode !== permissionMode);
408
+ const ownProvider = Boolean(model?.baseURL);
409
+ const session = new StreamSession({
410
+ sessionId: entry.sessionId,
411
+ permissionMode,
412
+ allowBypass: this.allowBypass,
413
+ emit: this.options.emit,
414
+ console: this.options.console,
415
+ closeGraceMs: this.options.closeGraceMs,
416
+ onStateChange: (state) => {
417
+ if (state !== 'idle' || !entry.restartWhenIdle || entry.session !== session)
418
+ return;
419
+ this.restart(entry.sessionId).catch((error) => log(`[engine] restart failed: ${error}`));
420
+ },
421
+ onConfig: (patch) => this.updateConfig(ownProvider ? withoutProviderConfig(patch) : patch),
422
+ onAuthFailure: () => { void this.handleAuthFailure(entry.sessionId); },
423
+ startupControls: () => [
424
+ ...(entry.thinking === false ? [{ subtype: 'set_max_thinking_tokens', max_thinking_tokens: 0 }] : []),
425
+ ...(entry.fast ? [{ subtype: 'apply_flag_settings', settings: { fastMode: true } }] : []),
426
+ ],
427
+ onExit: () => this.handleExit(entry, session),
428
+ });
429
+ entry.session = session;
430
+ entry.spawnedModel = model;
431
+ this.options.console?.(`[${entry.sessionId.slice(0, 4)}] ● ${resume ? 'resume' : 'new'} session ${entry.sessionId}`);
432
+ session.start(spec);
433
+ return session;
434
+ }
435
+ handleExit(entry, session) {
436
+ if (entry.session !== session)
437
+ return;
438
+ entry.permissionMode = session.permissionMode;
439
+ entry.session = null;
440
+ // a restart deferred for this process is moot: the next spawn already has the new settings
441
+ entry.restartWhenIdle = false;
442
+ }
443
+ }
444
+ //# sourceMappingURL=sessionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionManager.js","sourceRoot":"","sources":["../../src/engine/sessionManager.ts"],"names":[],"mappings":"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"}