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
@@ -1,118 +1,123 @@
1
+ import { randomUUID } from 'node:crypto';
1
2
  import { log } from '../core/logger.js';
3
+ import { isPermissionMode } from '../engine/permissions.js';
2
4
  import * as sessionService from '../services/sessionService.js';
3
- import * as sessionRollbackService from '../services/sessionRollbackService.js';
4
5
  import { loadSessionList } from '../services/sessionListService.js';
6
+ import { parseModelPayload } from '../services/modelService.js';
7
+ import { controlRequest } from './controlRequest.js';
8
+ const SESSION_ID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
9
+ // session ids end up in claude argv and file paths, so only uuids are accepted
10
+ export function sessionIdOf(msg) {
11
+ const value = msg['sessionId'];
12
+ return typeof value === 'string' && SESSION_ID_RE.test(value) ? value : null;
13
+ }
14
+ // register a brand new session (no spawn yet) and announce it to the app
15
+ export function openNewSession(ctx, sessionId = randomUUID(), opts = {}) {
16
+ ctx.sessions.open(sessionId, opts);
17
+ ctx.send({ type: 'session_start', sessionId });
18
+ return sessionId;
19
+ }
20
+ function modelOption(msg) {
21
+ return 'model' in msg ? { model: parseModelPayload(msg['model']) } : {};
22
+ }
23
+ const cwdOf = (msg) => (typeof msg['cwd'] === 'string' ? msg['cwd'] : undefined);
24
+ function sendHistoryPage(ctx, sessionId, before) {
25
+ try {
26
+ const page = sessionService.readSessionPage(sessionId, before);
27
+ ctx.send({ type: 'session_history', sessionId, ...page, ...(before ? { before } : {}) });
28
+ }
29
+ catch (error) {
30
+ log(`[session_history] error: ${error}`);
31
+ ctx.send({ type: 'session_history', sessionId, messages: [], hasMore: false, ...(before ? { before } : {}) });
32
+ }
33
+ }
34
+ // the list names the folder it was asked for, so an app only applies its own project's list
35
+ async function sendSessionList(ctx, cwdArg) {
36
+ const sessions = await loadSessionList(cwdArg, ctx.sessions.liveSessionIds());
37
+ ctx.send({ type: 'session_list', sessions, ...(cwdArg ? { cwd: cwdArg } : {}) });
38
+ }
5
39
  // create handlers for session history, session list, and effort updates
6
40
  export function createSessionHandlers() {
7
41
  return {
8
42
  request_session_list: async (msg, ctx) => {
9
- const cwdArg = typeof msg['cwd'] === 'string' ? msg['cwd'] : undefined;
43
+ const cwdArg = cwdOf(msg);
10
44
  try {
11
- const sessions = await loadSessionList(cwdArg, ctx.getCurrentSessionId());
12
- ctx.send({ type: 'session_list', sessions });
13
- log(`[session_list] sent ${sessions.length} sessions`);
45
+ await sendSessionList(ctx, cwdArg);
14
46
  }
15
47
  catch (error) {
16
48
  log(`[session_list] error: ${error}`);
17
- ctx.send({ type: 'session_list', sessions: [] });
49
+ ctx.send({ type: 'session_list', sessions: [], ...(cwdArg ? { cwd: cwdArg } : {}) });
18
50
  }
19
51
  },
20
52
  delete_session: async (msg, ctx) => {
21
- const sessionId = typeof msg['sessionId'] === 'string' ? msg['sessionId'] : undefined;
22
- const cwdArg = typeof msg['cwd'] === 'string' ? msg['cwd'] : undefined;
53
+ const sessionId = sessionIdOf(msg);
54
+ const cwdArg = cwdOf(msg);
23
55
  if (!sessionId)
24
56
  return;
25
57
  try {
58
+ await ctx.sessions.close(sessionId, { forget: true });
26
59
  await sessionService.deleteSessionFile(sessionId, cwdArg);
27
- const sessions = await loadSessionList(cwdArg, ctx.getCurrentSessionId());
28
- ctx.send({ type: 'session_list', sessions });
60
+ await sendSessionList(ctx, cwdArg);
29
61
  }
30
62
  catch (error) {
31
63
  log(`[delete_session] error: ${error}`);
32
64
  }
33
65
  },
66
+ // open a session: its newest history page, then the live state of a running process
34
67
  request_session_history: async (msg, ctx) => {
35
- const sessionId = msg['sessionId'];
68
+ const sessionId = sessionIdOf(msg);
36
69
  if (!sessionId)
37
70
  return;
38
- log(`[ws recv] request_session_history: ${sessionId}`);
39
- ctx.claude.args = ctx.model.apply(msg['model'], ctx.claude.args);
40
- try {
41
- const messages = sessionService.readSessionHistory(sessionId);
42
- ctx.send({ type: 'session_history', sessionId, messages });
43
- log(`[session_history] sent ${messages.length} messages for ${sessionId}`);
44
- ctx.scheduleScannerAtEnd();
45
- ctx.claude.args = [...sessionService.removeResumeArgs(ctx.claude.args), '--resume', sessionId];
46
- await ctx.claude.spawn();
47
- }
48
- catch (error) {
49
- log(`[request_session_history] error: ${error}`);
50
- ctx.send({ type: 'session_history', sessionId, messages: [] });
51
- }
71
+ const modelChanged = ctx.sessions.open(sessionId, modelOption(msg));
72
+ sendHistoryPage(ctx, sessionId);
73
+ ctx.send({ type: 'session_start', sessionId });
74
+ ctx.sessions.replay(sessionId);
75
+ if (modelChanged)
76
+ await ctx.sessions.applyModel(sessionId);
52
77
  },
53
- request_new_session: async (msg, ctx) => {
54
- log('[ws recv] request_new_session');
55
- ctx.claude.args = ctx.model.apply(msg['model'], ctx.claude.args);
56
- ctx.claude.args = sessionService.removeResumeArgs(ctx.claude.args);
57
- await ctx.claude.spawn();
78
+ // the page before the oldest message the app holds
79
+ claude_history: (msg, ctx) => {
80
+ const sessionId = sessionIdOf(msg);
81
+ if (sessionId && typeof msg['before'] === 'string')
82
+ sendHistoryPage(ctx, sessionId, msg['before']);
58
83
  },
59
- request_rollback_preview: async (msg, ctx) => {
60
- const sessionId = typeof msg['sessionId'] === 'string' ? msg['sessionId'] : undefined;
61
- const turnId = typeof msg['turnId'] === 'string' ? msg['turnId'] : undefined;
62
- const messageIndex = typeof msg['messageIndex'] === 'number' ? msg['messageIndex'] : undefined;
63
- const cwdArg = typeof msg['cwd'] === 'string' ? msg['cwd'] : undefined;
64
- if (!sessionId || !turnId)
65
- return;
66
- try {
67
- const preview = sessionRollbackService.buildRollbackPreview(sessionId, turnId, cwdArg, messageIndex);
68
- if (!preview) {
69
- ctx.send({ type: 'rollback_error', sessionId, turnId, message: 'rollback preview not found' });
70
- return;
71
- }
72
- ctx.send({ type: 'rollback_preview', ...preview });
73
- }
74
- catch (error) {
75
- log(`[rollback_preview] error: ${error}`);
76
- ctx.send({ type: 'rollback_error', sessionId, turnId, message: String(error) });
77
- }
84
+ claude_image: controlRequest('image', (msg) => {
85
+ const { messageId, index } = msg;
86
+ const sessionId = sessionIdOf(msg);
87
+ const image = sessionId && typeof messageId === 'string' && typeof index === 'number'
88
+ ? sessionService.findPromptImage(sessionId, messageId, index)
89
+ : null;
90
+ if (!image)
91
+ throw new Error('image not found');
92
+ return { mimeType: image.mimeType, dataBase64: image.data };
93
+ }),
94
+ // a tool's output, fetched when the app opens that tool; pending while it still runs
95
+ claude_tool_result: controlRequest('tool_result', (msg) => {
96
+ const sessionId = sessionIdOf(msg);
97
+ const toolUseId = msg['toolUseId'];
98
+ if (!sessionId || typeof toolUseId !== 'string')
99
+ throw new Error('invalid tool result request');
100
+ return sessionService.findToolResult(sessionId, toolUseId) ?? { pending: true };
101
+ }),
102
+ claude_set_model: async (msg, ctx) => {
103
+ const sessionId = sessionIdOf(msg);
104
+ if (sessionId && ctx.sessions.open(sessionId, modelOption(msg)))
105
+ await ctx.sessions.applyModel(sessionId);
78
106
  },
79
- confirm_rollback: async (msg, ctx) => {
80
- const sessionId = typeof msg['sessionId'] === 'string' ? msg['sessionId'] : undefined;
81
- const turnId = typeof msg['turnId'] === 'string' ? msg['turnId'] : undefined;
82
- const messageIndex = typeof msg['messageIndex'] === 'number' ? msg['messageIndex'] : undefined;
83
- const cwdArg = typeof msg['cwd'] === 'string' ? msg['cwd'] : undefined;
84
- if (!sessionId || !turnId)
85
- return;
86
- try {
87
- const applied = sessionRollbackService.applyRollback(sessionId, turnId, cwdArg, messageIndex);
88
- if (!applied) {
89
- ctx.send({ type: 'rollback_error', sessionId, turnId, message: 'rollback target not found' });
90
- return;
91
- }
92
- const messages = sessionRollbackService.loadRolledBackHistory(sessionId, cwdArg);
93
- ctx.send({ type: 'session_history', sessionId, messages });
94
- ctx.send({ type: 'rollback_applied', ...applied });
95
- ctx.send({ type: 'composer_prefill', sessionId, turnId, prompt: applied.prompt });
96
- ctx.scheduleScannerAtEnd();
97
- if (applied.startsNewSession)
98
- ctx.setCurrentSessionId(null);
99
- ctx.claude.args = applied.startsNewSession
100
- ? sessionService.removeResumeArgs(ctx.claude.args)
101
- : [...sessionService.removeResumeArgs(ctx.claude.args), '--resume', sessionId];
102
- await ctx.claude.spawn();
103
- }
104
- catch (error) {
105
- log(`[confirm_rollback] error: ${error}`);
106
- ctx.send({ type: 'rollback_error', sessionId, turnId, message: String(error) });
107
- }
107
+ request_new_session: (msg, ctx) => {
108
+ log('[ws recv] request_new_session');
109
+ const permissionMode = isPermissionMode(msg['permissionMode']) ? msg['permissionMode'] : undefined;
110
+ openNewSession(ctx, sessionIdOf(msg) ?? randomUUID(), { ...modelOption(msg), permissionMode });
108
111
  },
109
112
  set_effort: async (msg, ctx) => {
110
113
  const effort = msg['effort'];
111
114
  if (typeof effort !== 'string')
112
115
  return;
113
116
  ctx.effort.save(effort);
114
- ctx.claude.args = ctx.effort.apply(ctx.claude.args);
115
- await ctx.claude.spawn();
117
+ if (ctx.effort.getCurrent() !== effort)
118
+ return;
119
+ ctx.send({ type: 'cli_status', effort: ctx.effort.getEffective() });
120
+ await ctx.sessions.applyEffort(effort);
116
121
  },
117
122
  };
118
123
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sessionHandlers.js","sourceRoot":"","sources":["../../src/handlers/sessionHandlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sessionHandlers.js","sourceRoot":"","sources":["../../src/handlers/sessionHandlers.ts"],"names":[],"mappings":"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"}
@@ -32,8 +32,15 @@ export function createTerminalHandlers() {
32
32
  log(`[terminal] closed: ${terminalId}`);
33
33
  }
34
34
  },
35
- terminal_list: (_msg, ctx) => {
36
- ctx.send({ type: 'terminal_list', terminals: ctx.terminals.list() });
35
+ // replay: an app back on screen redraws each terminal from its recent output
36
+ terminal_list: (msg, ctx) => {
37
+ const terminals = ctx.terminals.list();
38
+ ctx.send({ type: 'terminal_list', terminals });
39
+ if (msg['replay'] !== true)
40
+ return;
41
+ for (const terminalId of terminals) {
42
+ ctx.send({ type: 'terminal_output', terminalId, data: ctx.terminals.recentOutput(terminalId), replace: true });
43
+ }
37
44
  },
38
45
  };
39
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"terminalHandlers.js","sourceRoot":"","sources":["../../src/handlers/terminalHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAGxC,uEAAuE;AACvE,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,eAAe,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5B,MAAM,IAAI,GAAI,GAAG,CAAC,MAAM,CAAY,IAAI,GAAG,CAAC;YAC5C,MAAM,IAAI,GAAI,GAAG,CAAC,MAAM,CAAY,IAAI,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAuB,CAAC;YAC7C,MAAM,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YACzD,GAAG,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;YACzC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,UAAU,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,cAAc,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAW,CAAC;YAC/C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAW,CAAC;YACnC,IAAI,UAAU,IAAI,IAAI;gBAAE,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAChE,CAAC;QACD,eAAe,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5B,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAW,CAAC;YAC/C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAW,CAAC;YACnC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAW,CAAC;YACnC,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gBAC/B,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC7C,GAAG,CAAC,qBAAqB,UAAU,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QACD,cAAc,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAW,CAAC;YAC/C,IAAI,UAAU,EAAE,CAAC;gBACf,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAChC,GAAG,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,aAAa,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YAC3B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvE,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"terminalHandlers.js","sourceRoot":"","sources":["../../src/handlers/terminalHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAGxC,uEAAuE;AACvE,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,eAAe,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5B,MAAM,IAAI,GAAI,GAAG,CAAC,MAAM,CAAY,IAAI,GAAG,CAAC;YAC5C,MAAM,IAAI,GAAI,GAAG,CAAC,MAAM,CAAY,IAAI,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAuB,CAAC;YAC7C,MAAM,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YACzD,GAAG,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;YACzC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,UAAU,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,cAAc,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAW,CAAC;YAC/C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAW,CAAC;YACnC,IAAI,UAAU,IAAI,IAAI;gBAAE,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAChE,CAAC;QACD,eAAe,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5B,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAW,CAAC;YAC/C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAW,CAAC;YACnC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAW,CAAC;YACnC,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gBAC/B,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC7C,GAAG,CAAC,qBAAqB,UAAU,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QACD,cAAc,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAW,CAAC;YAC/C,IAAI,UAAU,EAAE,CAAC;gBACf,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAChC,GAAG,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,6EAA6E;QAC7E,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC1B,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,CAAC;YAC/C,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI;gBAAE,OAAO;YACnC,KAAK,MAAM,UAAU,IAAI,SAAS,EAAE,CAAC;gBACnC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACjH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,5 +1,8 @@
1
1
  import http from 'node:http';
2
2
  import https from 'node:https';
3
+ // a server that stops answering (a half-open connection) fails the request instead of
4
+ // hanging the spawn or startup waiting on it
5
+ const REQUEST_TIMEOUT_MS = 10_000;
3
6
  // unified http request with optional bearer auth and json body. parses json when possible.
4
7
  export function httpRequest(method, url, opts = {}) {
5
8
  return new Promise((resolve, reject) => {
@@ -21,6 +24,8 @@ export function httpRequest(method, url, opts = {}) {
21
24
  method,
22
25
  headers,
23
26
  }, (res) => {
27
+ // decode as a stream, so a character split across chunks stays whole
28
+ res.setEncoding('utf8');
24
29
  let raw = '';
25
30
  res.on('data', (chunk) => { raw += chunk; });
26
31
  res.on('end', () => {
@@ -32,6 +37,7 @@ export function httpRequest(method, url, opts = {}) {
32
37
  }
33
38
  });
34
39
  });
40
+ req.setTimeout(opts.timeoutMs ?? REQUEST_TIMEOUT_MS, () => req.destroy(new Error(`request timed out: ${method} ${urlObj.pathname}`)));
35
41
  req.on('error', reject);
36
42
  if (payload)
37
43
  req.write(payload);
@@ -1 +1 @@
1
- {"version":3,"file":"httpClient.js","sourceRoot":"","sources":["../../src/http/httpClient.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,YAAY,CAAC;AAa/B,2FAA2F;AAC3F,MAAM,UAAU,WAAW,CACzB,MAAyC,EACzC,GAAW,EACX,OAA2B,EAAE;IAE7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC;QAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,MAAM,OAAO,GAA2B,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QACpE,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;YAC7C,OAAO,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC;QAClE,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC;YAC5B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,IAAI,EAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM;YACrC,MAAM;YACN,OAAO;SACR,EAAE,CAAC,GAAG,EAAE,EAAE;YACT,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC;oBAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAAC,CAAC;gBACxE,MAAM,CAAC;oBAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;gBAAC,CAAC;YAChE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxB,IAAI,OAAO;YAAE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"httpClient.js","sourceRoot":"","sources":["../../src/http/httpClient.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,YAAY,CAAC;AAc/B,sFAAsF;AACtF,6CAA6C;AAC7C,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,2FAA2F;AAC3F,MAAM,UAAU,WAAW,CACzB,MAAyC,EACzC,GAAW,EACX,OAA2B,EAAE;IAE7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC;QAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,MAAM,OAAO,GAA2B,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QACpE,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;YAC7C,OAAO,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC;QAClE,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC;YAC5B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,IAAI,EAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM;YACrC,MAAM;YACN,OAAO;SACR,EAAE,CAAC,GAAG,EAAE,EAAE;YACT,qEAAqE;YACrE,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACxB,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC;oBAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAAC,CAAC;gBACxE,MAAM,CAAC;oBAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;gBAAC,CAAC;YAChE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,IAAI,kBAAkB,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,sBAAsB,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QACtI,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxB,IAAI,OAAO;YAAE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC"}
package/dist/index.js CHANGED
@@ -1,31 +1,39 @@
1
1
  #!/usr/bin/env node
2
- import { startHookServer } from './claude/hookServer.js';
3
- import { generateHookSettingsFile } from './claude/generateHookSettings.js';
4
2
  import { TerminalManager } from './pty/terminalManager.js';
5
3
  import { clearCredentials, ensureDeviceUuid, } from './auth/credentialsStore.js';
6
4
  import { loadDotEnv } from './core/loadDotEnv.js';
7
5
  import { log } from './core/logger.js';
8
6
  import { ProjectFileWatcher } from './core/projectFileWatcher.js';
7
+ import { SessionManager } from './engine/sessionManager.js';
8
+ import { allowRemoteUserConfig } from './engine/remoteConfig.js';
9
+ import { SERVER_HTTP, SERVER_WS } from './core/config.js';
10
+ import { isCleartextRemote } from './utils/localHost.js';
9
11
  import { ModelService } from './services/modelService.js';
10
12
  import { EffortService } from './services/effortService.js';
11
- import { ClaudeService } from './services/claudeService.js';
12
13
  import { printBanner } from './services/pairingService.js';
13
14
  import { resolveActiveCredentials } from './services/bootstrapService.js';
14
- import { createSessionStartHandler, createWsOpenHandler, ensureClaudeArgs } from './services/cliRuntime.js';
15
+ import { createSpawnSpecFactory, createWsOpenHandler, resolveLaunchConfig } from './services/cliRuntime.js';
15
16
  import { WsClient } from './transport/wsClient.js';
17
+ import { resolveClaudeCommand } from './engine/claudeBinary.js';
16
18
  import { createMessageRouter } from './handlers/messageRouter.js';
17
19
  import { chooseAgent } from './commands/agentPrompt.js';
18
20
  import { extractEnvFileArg, parseCommand, printHelp } from './commands/cliArgs.js';
21
+ // sessions get this long to close on ctrl+c before the cli exits anyway
22
+ const SHUTDOWN_DEADLINE_MS = 5000;
19
23
  const { envFilePath, cliArgs: bootArgs } = extractEnvFileArg(process.argv.slice(2));
20
24
  if (envFilePath) {
21
25
  loadDotEnv(envFilePath);
22
26
  }
23
27
  let activeCredentials = null;
24
- let currentSessionId = null;
25
- let pendingPrompt = null;
26
- let startScannerAtEnd = false;
27
- let scanner = null;
28
- let pairedResolved = false;
28
+ // last resort: one bad callback (a watcher, a socket) must not take every claude session and
29
+ // terminal down with it
30
+ process.on('uncaughtException', (error) => {
31
+ log(`[fatal] uncaught exception: ${error.stack ?? error}`);
32
+ console.error(`[kumo-cli] unexpected error: ${error.message}`);
33
+ });
34
+ process.on('unhandledRejection', (reason) => {
35
+ log(`[fatal] unhandled rejection: ${reason instanceof Error ? reason.stack : String(reason)}`);
36
+ });
29
37
  async function main() {
30
38
  const command = parseCommand(bootArgs);
31
39
  if (command.action === 'help') {
@@ -45,10 +53,17 @@ async function main() {
45
53
  console.log('[kumo-cli] codex support is under development');
46
54
  return;
47
55
  }
48
- const claudeArgs = ensureClaudeArgs(command.args);
56
+ const launch = resolveLaunchConfig(command.args);
57
+ allowRemoteUserConfig(launch.allowRemoteConfig);
49
58
  printBanner();
59
+ if (isCleartextRemote(SERVER_HTTP()) || isCleartextRemote(SERVER_WS())) {
60
+ console.warn('\x1b[33m[kumo-cli] warning: the backend url is not https/wss, so the device token and everything relayed travel in the clear\x1b[0m');
61
+ }
50
62
  let ws;
51
63
  const send = (data) => ws.send(data);
64
+ // whether an app shows this cli's output; while none does, the live transcript is held back
65
+ // (the app reloads the history page when it comes back)
66
+ let watched = true;
52
67
  const fileWatcher = new ProjectFileWatcher(send);
53
68
  const model = new ModelService();
54
69
  const effort = new EffortService();
@@ -57,65 +72,87 @@ async function main() {
57
72
  log(`[terminal] ${terminalId} exited with code ${exitCode}`);
58
73
  send({ type: 'terminal_closed', terminalId, exitCode });
59
74
  });
60
- const claude = new ClaudeService(send, model, effort, () => activeCredentials?.deviceToken);
61
- claude.args = claudeArgs;
62
- claude.onExit = (code) => { ws.close(); process.exit(code); };
63
- const hookServer = await startHookServer(createSessionStartHandler({
64
- state: {
65
- get currentSessionId() { return currentSessionId; },
66
- set currentSessionId(value) { currentSessionId = value; },
67
- get pendingPrompt() { return pendingPrompt; },
68
- set pendingPrompt(value) { pendingPrompt = value; },
69
- get startScannerAtEnd() { return startScannerAtEnd; },
70
- set startScannerAtEnd(value) { startScannerAtEnd = value; },
71
- get scanner() { return scanner; },
72
- set scanner(value) { scanner = value; },
75
+ const sessions = new SessionManager({
76
+ emit: (msg) => {
77
+ if (!watched && msg['type'] === 'transcript')
78
+ return;
79
+ // cli_status from a session carries no effort; fill it so the backend keeps it
80
+ send(msg['type'] === 'cli_status' ? { effort: effort.getEffective(), ...msg } : msg);
73
81
  },
74
- send,
75
- resetSnapshot: () => claude.resetSnapshot(),
76
- dispatchPrompt: (text) => claude.dispatchPrompt(text),
77
- }));
78
- process.stdout.on('resize', () => claude.resizeSnapshot());
79
- claude.settingsPath = generateHookSettingsFile(hookServer.port);
82
+ spawnSpec: createSpawnSpecFactory({
83
+ model,
84
+ effort,
85
+ passthrough: launch.passthrough,
86
+ deviceToken: () => activeCredentials?.deviceToken,
87
+ }),
88
+ defaultPermissionMode: launch.permissionMode,
89
+ allowBypass: launch.allowBypass,
90
+ console: (line) => console.log(line),
91
+ });
92
+ let shuttingDown = false;
93
+ const shutdown = (code) => {
94
+ // a second ctrl+c means now, whatever is still closing
95
+ if (shuttingDown)
96
+ process.exit(code);
97
+ shuttingDown = true;
98
+ console.log('\n[kumo-cli] closing claude sessions... (ctrl+c again to quit now)');
99
+ // a session stuck starting must not keep the cli from exiting
100
+ setTimeout(() => process.exit(code), SHUTDOWN_DEADLINE_MS).unref();
101
+ void Promise.allSettled([sessions.closeAll(), model.dispose()]).finally(() => {
102
+ ws?.close();
103
+ process.exit(code);
104
+ });
105
+ };
106
+ process.on('SIGINT', () => shutdown(0));
107
+ process.on('SIGTERM', () => shutdown(0));
80
108
  try {
81
109
  activeCredentials = await resolveActiveCredentials();
82
110
  }
83
111
  catch (error) {
84
112
  console.error(error.message);
85
- hookServer.close();
86
113
  process.exit(1);
87
114
  }
88
115
  if (!activeCredentials) {
89
116
  console.error('[kumo-cli] pairing aborted');
90
- hookServer.close();
91
117
  process.exit(1);
92
118
  }
93
- console.log(`\x1b[32m✓ Connected as ${activeCredentials.user?.email ?? activeCredentials.user?.id ?? 'device'}\x1b[0m\n`);
119
+ console.log(`\x1b[32m✓ Connected as ${activeCredentials.user?.email ?? activeCredentials.user?.id ?? 'device'}\x1b[0m`);
120
+ if (launch.allowRemoteConfig)
121
+ console.log('[kumo-cli] the app may change user-wide hooks, permission rules and mcp servers');
122
+ console.log(`[kumo-cli] claude sessions run on demand (permission mode: ${launch.permissionMode}). press ctrl+c to quit.\n`);
94
123
  const router = createMessageRouter({
95
124
  send,
96
- claude, model, effort, terminals,
97
- onPaired: () => {
98
- if (pairedResolved)
99
- return;
100
- pairedResolved = true;
101
- fileWatcher.restart();
125
+ sessions, effort, terminals,
126
+ files: fileWatcher,
127
+ onAppPresence: (watching) => {
128
+ log(`[presence] app ${watching ? 'on screen' : 'away'}`);
129
+ watched = watching;
130
+ terminals.setLive(watching);
131
+ if (!watching)
132
+ fileWatcher.stop();
133
+ },
134
+ onAuthError: () => {
135
+ ws.close();
136
+ shutdown(1);
102
137
  },
103
- onAuthError: () => { ws.close(); },
104
- scheduleScannerAtEnd: () => { startScannerAtEnd = true; },
105
- getCurrentSessionId: () => currentSessionId,
106
- setCurrentSessionId: (sessionId) => { currentSessionId = sessionId; },
107
- setPendingPrompt: (text) => { pendingPrompt = text; },
108
138
  });
109
139
  ws = new WsClient(createWsOpenHandler({
110
140
  send,
111
141
  credentials: () => activeCredentials,
112
- currentSessionId: () => currentSessionId,
113
- resetMenu: () => claude.resetMenu(),
114
- restartWatcher: () => fileWatcher.restart(),
115
- }), router, () => {
116
- fileWatcher.stop();
117
- });
118
- ws.onSent(() => claude.notifySent());
142
+ liveSessionIds: () => sessions.liveSessionIds(),
143
+ effort: () => effort.getEffective(),
144
+ refreshAuth: () => sessions.refreshAuth(),
145
+ }), router,
146
+ // the app subscribes again after a reconnect
147
+ () => fileWatcher.stop());
148
+ // find (or install) claude now: a first-run npm install, run synchronously, would otherwise
149
+ // freeze the open socket's heartbeats for its whole length
150
+ try {
151
+ resolveClaudeCommand();
152
+ }
153
+ catch (error) {
154
+ console.warn(`[kumo-cli] ${error.message}`);
155
+ }
119
156
  ws.connect();
120
157
  }
121
158
  main().catch((err) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}