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.
- package/README.md +26 -13
- package/dist/auth/credentialsStore.js +20 -7
- package/dist/auth/credentialsStore.js.map +1 -1
- package/dist/claude/conversation.js +272 -0
- package/dist/claude/conversation.js.map +1 -0
- package/dist/claude/transcriptParser.js +140 -36
- package/dist/claude/transcriptParser.js.map +1 -1
- package/dist/commands/cliArgs.js +1 -0
- package/dist/commands/cliArgs.js.map +1 -1
- package/dist/core/config.js +1 -9
- package/dist/core/config.js.map +1 -1
- package/dist/core/logger.js +50 -21
- package/dist/core/logger.js.map +1 -1
- package/dist/core/projectFileWatcher.js +100 -36
- package/dist/core/projectFileWatcher.js.map +1 -1
- package/dist/engine/claudeArgs.js +106 -0
- package/dist/engine/claudeArgs.js.map +1 -0
- package/dist/engine/claudeBinary.js +94 -0
- package/dist/engine/claudeBinary.js.map +1 -0
- package/dist/engine/claudeConfig.js +127 -0
- package/dist/engine/claudeConfig.js.map +1 -0
- package/dist/engine/claudeLogin.js +76 -0
- package/dist/engine/claudeLogin.js.map +1 -0
- package/dist/engine/controlChannel.js +75 -0
- package/dist/engine/controlChannel.js.map +1 -0
- package/dist/engine/liveTranscript.js +150 -0
- package/dist/engine/liveTranscript.js.map +1 -0
- package/dist/engine/ndjson.js +48 -0
- package/dist/engine/ndjson.js.map +1 -0
- package/dist/engine/permissions.js +101 -0
- package/dist/engine/permissions.js.map +1 -0
- package/dist/engine/probePool.js +51 -0
- package/dist/engine/probePool.js.map +1 -0
- package/dist/engine/processTree.js +45 -0
- package/dist/engine/processTree.js.map +1 -0
- package/dist/engine/remoteConfig.js +17 -0
- package/dist/engine/remoteConfig.js.map +1 -0
- package/dist/engine/sessionManager.js +444 -0
- package/dist/engine/sessionManager.js.map +1 -0
- package/dist/engine/settingsCommands.js +260 -0
- package/dist/engine/settingsCommands.js.map +1 -0
- package/dist/engine/streamSession.js +502 -0
- package/dist/engine/streamSession.js.map +1 -0
- package/dist/engine/taskTracker.js +110 -0
- package/dist/engine/taskTracker.js.map +1 -0
- package/dist/engine/toolLabels.js +32 -0
- package/dist/engine/toolLabels.js.map +1 -0
- package/dist/handlers/controlRequest.js +17 -0
- package/dist/handlers/controlRequest.js.map +1 -0
- package/dist/handlers/fileHandlers.js +12 -0
- package/dist/handlers/fileHandlers.js.map +1 -1
- package/dist/handlers/messageRouter.js +8 -1
- package/dist/handlers/messageRouter.js.map +1 -1
- package/dist/handlers/promptImages.js +5 -91
- package/dist/handlers/promptImages.js.map +1 -1
- package/dist/handlers/runtimeHandlers.js +100 -32
- package/dist/handlers/runtimeHandlers.js.map +1 -1
- package/dist/handlers/sessionHandlers.js +85 -80
- package/dist/handlers/sessionHandlers.js.map +1 -1
- package/dist/handlers/terminalHandlers.js +9 -2
- package/dist/handlers/terminalHandlers.js.map +1 -1
- package/dist/http/httpClient.js +6 -0
- package/dist/http/httpClient.js.map +1 -1
- package/dist/index.js +87 -50
- package/dist/index.js.map +1 -1
- package/dist/pty/terminalManager.js +58 -11
- package/dist/pty/terminalManager.js.map +1 -1
- package/dist/services/bootstrapService.js +17 -1
- package/dist/services/bootstrapService.js.map +1 -1
- package/dist/services/claudeAdapterProxy.js +68 -21
- package/dist/services/claudeAdapterProxy.js.map +1 -1
- package/dist/services/cliRuntime.js +39 -32
- package/dist/services/cliRuntime.js.map +1 -1
- package/dist/services/effortService.js +13 -60
- package/dist/services/effortService.js.map +1 -1
- package/dist/services/fileService.js +50 -24
- package/dist/services/fileService.js.map +1 -1
- package/dist/services/forkService.js +120 -0
- package/dist/services/forkService.js.map +1 -0
- package/dist/services/modelService.js +86 -89
- package/dist/services/modelService.js.map +1 -1
- package/dist/services/pairingService.js +21 -15
- package/dist/services/pairingService.js.map +1 -1
- package/dist/services/sessionListService.js +7 -9
- package/dist/services/sessionListService.js.map +1 -1
- package/dist/services/sessionService.js +245 -106
- package/dist/services/sessionService.js.map +1 -1
- package/dist/services/tunnelHelpers.js +9 -5
- package/dist/services/tunnelHelpers.js.map +1 -1
- package/dist/services/tunnelService.js +21 -5
- package/dist/services/tunnelService.js.map +1 -1
- package/dist/transport/wsClient.js +60 -42
- package/dist/transport/wsClient.js.map +1 -1
- package/dist/utils/ignorePaths.js +3 -3
- package/dist/utils/ignorePaths.js.map +1 -1
- package/dist/utils/json.js +7 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/localHost.js +17 -0
- package/dist/utils/localHost.js.map +1 -0
- package/dist/utils/safePath.js +51 -20
- package/dist/utils/safePath.js.map +1 -1
- package/package.json +5 -12
- package/dist/ansiCodes.js +0 -107
- package/dist/ansiCodes.js.map +0 -1
- package/dist/auth/credentialsStore.test.js +0 -60
- package/dist/auth/credentialsStore.test.js.map +0 -1
- package/dist/claude/fileHistory.js +0 -79
- package/dist/claude/fileHistory.js.map +0 -1
- package/dist/claude/generateHookSettings.js +0 -23
- package/dist/claude/generateHookSettings.js.map +0 -1
- package/dist/claude/hookServer.js +0 -33
- package/dist/claude/hookServer.js.map +0 -1
- package/dist/claude/sessionScanner.js +0 -162
- package/dist/claude/sessionScanner.js.map +0 -1
- package/dist/claude/sessionScanner.test.js +0 -24
- package/dist/claude/sessionScanner.test.js.map +0 -1
- package/dist/claude/transcriptParser.test.js +0 -78
- package/dist/claude/transcriptParser.test.js.map +0 -1
- package/dist/commands/cliArgs.test.js +0 -25
- package/dist/commands/cliArgs.test.js.map +0 -1
- package/dist/config.js +0 -40
- package/dist/config.js.map +0 -1
- package/dist/credentialsStore.js +0 -57
- package/dist/credentialsStore.js.map +0 -1
- package/dist/generateHookSettings.js +0 -30
- package/dist/generateHookSettings.js.map +0 -1
- package/dist/handlers/fileHandlerPayloads.test.js +0 -55
- package/dist/handlers/fileHandlerPayloads.test.js.map +0 -1
- package/dist/handlers/promptImages.test.js +0 -52
- package/dist/handlers/promptImages.test.js.map +0 -1
- package/dist/hookServer.js +0 -32
- package/dist/hookServer.js.map +0 -1
- package/dist/ignorePaths.js +0 -68
- package/dist/ignorePaths.js.map +0 -1
- package/dist/loadDotEnv.js +0 -79
- package/dist/loadDotEnv.js.map +0 -1
- package/dist/logger.js +0 -29
- package/dist/logger.js.map +0 -1
- package/dist/portForwardManager.js +0 -97
- package/dist/portForwardManager.js.map +0 -1
- package/dist/projectHistoryReader.js +0 -85
- package/dist/projectHistoryReader.js.map +0 -1
- package/dist/pty/ansiCodes.js +0 -14
- package/dist/pty/ansiCodes.js.map +0 -1
- package/dist/pty/notificationDetector.js +0 -29
- package/dist/pty/notificationDetector.js.map +0 -1
- package/dist/pty/notificationDetector.test.js +0 -24
- package/dist/pty/notificationDetector.test.js.map +0 -1
- package/dist/pty/ptyMenuParser.js +0 -91
- package/dist/pty/ptyMenuParser.js.map +0 -1
- package/dist/pty/ptyMenuParser.test.js +0 -26
- package/dist/pty/ptyMenuParser.test.js.map +0 -1
- package/dist/pty/ptySnapshotRenderer.js +0 -71
- package/dist/pty/ptySnapshotRenderer.js.map +0 -1
- package/dist/pty/selectionMenuDetector.js +0 -49
- package/dist/pty/selectionMenuDetector.js.map +0 -1
- package/dist/pty/selectionMenuDetector.test.js +0 -62
- package/dist/pty/selectionMenuDetector.test.js.map +0 -1
- package/dist/pty/selectionMenuMeta.js +0 -54
- package/dist/pty/selectionMenuMeta.js.map +0 -1
- package/dist/pty/selectionMenuMeta.test.js +0 -26
- package/dist/pty/selectionMenuMeta.test.js.map +0 -1
- package/dist/pty/selectionMenuParser.js +0 -83
- package/dist/pty/selectionMenuParser.js.map +0 -1
- package/dist/pty/selectionMenuParser.test.js +0 -30
- package/dist/pty/selectionMenuParser.test.js.map +0 -1
- package/dist/pty/spawn.js +0 -104
- package/dist/pty/spawn.js.map +0 -1
- package/dist/pty/spawn.test.js +0 -17
- package/dist/pty/spawn.test.js.map +0 -1
- package/dist/pty/statusSessionDetector.js +0 -28
- package/dist/pty/statusSessionDetector.js.map +0 -1
- package/dist/pty/statusSessionDetector.test.js +0 -23
- package/dist/pty/statusSessionDetector.test.js.map +0 -1
- package/dist/pty/textInputDetector.js +0 -60
- package/dist/pty/textInputDetector.js.map +0 -1
- package/dist/pty/textInputDetector.test.js +0 -32
- package/dist/pty/textInputDetector.test.js.map +0 -1
- package/dist/ptyMenuParser.js +0 -470
- package/dist/ptyMenuParser.js.map +0 -1
- package/dist/ptySnapshotRenderer.js +0 -78
- package/dist/ptySnapshotRenderer.js.map +0 -1
- package/dist/services/checkpointService.js +0 -113
- package/dist/services/checkpointService.js.map +0 -1
- package/dist/services/checkpointService.test.js +0 -61
- package/dist/services/checkpointService.test.js.map +0 -1
- package/dist/services/claudeMenuBridge.js +0 -116
- package/dist/services/claudeMenuBridge.js.map +0 -1
- package/dist/services/claudeMenuBridge.test.js +0 -90
- package/dist/services/claudeMenuBridge.test.js.map +0 -1
- package/dist/services/claudeService.js +0 -146
- package/dist/services/claudeService.js.map +0 -1
- package/dist/services/claudeService.test.js +0 -39
- package/dist/services/claudeService.test.js.map +0 -1
- package/dist/services/cliRuntime.test.js +0 -55
- package/dist/services/cliRuntime.test.js.map +0 -1
- package/dist/services/modelAdapter.test.js +0 -47
- package/dist/services/modelAdapter.test.js.map +0 -1
- package/dist/services/modelArgs.test.js +0 -64
- package/dist/services/modelArgs.test.js.map +0 -1
- package/dist/services/modelBaseUrl.test.js +0 -32
- package/dist/services/modelBaseUrl.test.js.map +0 -1
- package/dist/services/modelService.test.js +0 -136
- package/dist/services/modelService.test.js.map +0 -1
- package/dist/services/notificationDedupe.js +0 -23
- package/dist/services/notificationDedupe.js.map +0 -1
- package/dist/services/notificationDedupe.test.js +0 -20
- package/dist/services/notificationDedupe.test.js.map +0 -1
- package/dist/services/sessionListService.test.js +0 -22
- package/dist/services/sessionListService.test.js.map +0 -1
- package/dist/services/sessionRollbackService.js +0 -195
- package/dist/services/sessionRollbackService.js.map +0 -1
- package/dist/services/sessionRollbackService.test.js +0 -142
- package/dist/services/sessionRollbackService.test.js.map +0 -1
- package/dist/services/tunnelHelpers.test.js +0 -42
- package/dist/services/tunnelHelpers.test.js.map +0 -1
- package/dist/services/tunnelService.test.js +0 -91
- package/dist/services/tunnelService.test.js.map +0 -1
- package/dist/sessionScanner.js +0 -271
- package/dist/sessionScanner.js.map +0 -1
- package/dist/snapshotScanner.js +0 -154
- package/dist/snapshotScanner.js.map +0 -1
- package/dist/spawn.js +0 -79
- package/dist/spawn.js.map +0 -1
- package/dist/terminalManager.js +0 -73
- package/dist/terminalManager.js.map +0 -1
- package/dist/transport/directWsServer.js +0 -135
- package/dist/transport/directWsServer.js.map +0 -1
- package/dist/transport/webrtcTransport.js +0 -145
- package/dist/transport/webrtcTransport.js.map +0 -1
- package/dist/transport/webrtcTransport.test.js +0 -104
- package/dist/transport/webrtcTransport.test.js.map +0 -1
- package/dist/transport/webrtcTypes.js +0 -29
- package/dist/transport/webrtcTypes.js.map +0 -1
- package/dist/transport/webrtcTypes.test.js +0 -20
- package/dist/transport/webrtcTypes.test.js.map +0 -1
- package/dist/utils/ptyBuffer.js +0 -46
- package/dist/utils/ptyBuffer.js.map +0 -1
- package/scripts/claude_launcher.cjs +0 -71
- package/scripts/run-tests.mjs +0 -46
- package/scripts/session_hook_forwarder.cjs +0 -44
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
1
2
|
import os from 'node:os';
|
|
2
3
|
import readline from 'node:readline';
|
|
3
4
|
import { httpRequest } from '../http/httpClient.js';
|
|
@@ -7,13 +8,13 @@ const BANNER_TIPS = [
|
|
|
7
8
|
'tip: press --help to see the command guide.',
|
|
8
9
|
'tip: run `kumo reset claude` to pair the Claude agent again.',
|
|
9
10
|
];
|
|
10
|
-
// poll pair status until approved/rejected or timeout (5 min)
|
|
11
|
-
async function pollPairStatus(requestId) {
|
|
11
|
+
// poll pair status until approved/rejected or timeout (5 min); the secret proves this cli filed the request
|
|
12
|
+
async function pollPairStatus(requestId, pollSecret) {
|
|
12
13
|
const deadline = Date.now() + 5 * 60 * 1000;
|
|
13
14
|
while (Date.now() < deadline) {
|
|
14
15
|
await new Promise((r) => setTimeout(r, 2000));
|
|
15
16
|
try {
|
|
16
|
-
const res = await httpRequest('GET', `${SERVER_HTTP()}/api/cli/pair/${requestId}
|
|
17
|
+
const res = await httpRequest('GET', `${SERVER_HTTP()}/api/cli/pair/${requestId}`, { headers: { 'x-kumo-pair-secret': pollSecret } });
|
|
17
18
|
if (res.status !== 200)
|
|
18
19
|
continue;
|
|
19
20
|
const data = res.data;
|
|
@@ -23,6 +24,11 @@ async function pollPairStatus(requestId) {
|
|
|
23
24
|
console.warn('[kumo-cli] pairing rejected by app');
|
|
24
25
|
return null;
|
|
25
26
|
}
|
|
27
|
+
// the token went out already and the answer never arrived here
|
|
28
|
+
if (data.status === 'collected') {
|
|
29
|
+
console.warn('[kumo-cli] the approval was already collected');
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
26
32
|
}
|
|
27
33
|
catch { }
|
|
28
34
|
}
|
|
@@ -39,18 +45,17 @@ export async function checkBackendReachable() {
|
|
|
39
45
|
return false;
|
|
40
46
|
}
|
|
41
47
|
}
|
|
42
|
-
// verify cached deviceToken against backend;
|
|
48
|
+
// verify cached deviceToken against backend; refreshed creds, or null only when the backend
|
|
49
|
+
// rejects the token (revoked or deleted). a network error or a 5xx/429 throws, so a deploy or
|
|
50
|
+
// an outage never costs the machine its pairing
|
|
43
51
|
export async function verifyCredentials(creds) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if (res.status !== 200)
|
|
47
|
-
return null;
|
|
48
|
-
const data = res.data;
|
|
49
|
-
return { ...creds, user: data.user ?? creds.user, deviceUuid: data.device?.deviceUuid ?? creds.deviceUuid };
|
|
50
|
-
}
|
|
51
|
-
catch {
|
|
52
|
+
const res = await httpRequest('POST', `${SERVER_HTTP()}/api/cli/connect`, { body: { deviceToken: creds.deviceToken } });
|
|
53
|
+
if (res.status === 401 || res.status === 403)
|
|
52
54
|
return null;
|
|
53
|
-
|
|
55
|
+
if (res.status !== 200)
|
|
56
|
+
throw new Error(`backend answered ${res.status}`);
|
|
57
|
+
const data = res.data;
|
|
58
|
+
return { ...creds, user: data.user ?? creds.user, deviceUuid: data.device?.deviceUuid ?? creds.deviceUuid };
|
|
54
59
|
}
|
|
55
60
|
export function printBanner() {
|
|
56
61
|
const cloud = [
|
|
@@ -94,9 +99,10 @@ export async function pairFlow() {
|
|
|
94
99
|
}
|
|
95
100
|
const deviceUuid = ensureDeviceUuid();
|
|
96
101
|
const deviceName = `${os.userInfo().username}@${os.hostname()}`;
|
|
102
|
+
const pollSecret = randomBytes(32).toString('hex');
|
|
97
103
|
let result;
|
|
98
104
|
try {
|
|
99
|
-
result = await httpRequest('POST', `${SERVER_HTTP()}/api/cli/pair`, { body: { pairingCode: code, deviceUuid, deviceName } });
|
|
105
|
+
result = await httpRequest('POST', `${SERVER_HTTP()}/api/cli/pair`, { body: { pairingCode: code, deviceUuid, deviceName, pollSecret } });
|
|
100
106
|
}
|
|
101
107
|
catch (err) {
|
|
102
108
|
console.warn(`[kumo-cli] pair error: ${err.message}, please try again`);
|
|
@@ -114,7 +120,7 @@ export async function pairFlow() {
|
|
|
114
120
|
continue;
|
|
115
121
|
}
|
|
116
122
|
console.log('[kumo-cli] waiting for approval in the Kumo app...');
|
|
117
|
-
const approved = await pollPairStatus(initial.requestId);
|
|
123
|
+
const approved = await pollPairStatus(initial.requestId, pollSecret);
|
|
118
124
|
if (!approved) {
|
|
119
125
|
console.warn('[kumo-cli] please try again with a fresh code');
|
|
120
126
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairingService.js","sourceRoot":"","sources":["../../src/services/pairingService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAwB,MAAM,6BAA6B,CAAC;AAQ1H,MAAM,WAAW,GAAG;IAClB,6CAA6C;IAC7C,8DAA8D;CAC/D,CAAC;AAEF,
|
|
1
|
+
{"version":3,"file":"pairingService.js","sourceRoot":"","sources":["../../src/services/pairingService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAwB,MAAM,6BAA6B,CAAC;AAQ1H,MAAM,WAAW,GAAG;IAClB,6CAA6C;IAC7C,8DAA8D;CAC/D,CAAC;AAEF,4GAA4G;AAC5G,KAAK,UAAU,cAAc,CAAC,SAAiB,EAAE,UAAkB;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAC5C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,GAAG,WAAW,EAAE,iBAAiB,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YACtI,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;gBAAE,SAAS;YACjC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAkD,CAAC;YACpE,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAoB,CAAC;YAC/F,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;gBACnD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,+DAA+D;YAC/D,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;gBAC9D,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,GAAG,WAAW,EAAE,aAAa,CAAC,CAAC;QACpE,OAAO,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,4FAA4F;AAC5F,8FAA8F;AAC9F,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAsB;IAC5D,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,GAAG,WAAW,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACxH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,GAAG,CAAC,IAA8G,CAAC;IAChI,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;AAC9G,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,KAAK,GAAG;QACZ,gDAAgD;QAChD,kDAAkD;QAClD,kDAAkD;QAClD,mDAAmD;QACnD,oDAAoD;KACrD,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,2EAA2E;AAC3E,SAAS,wBAAwB;IAC/B,OAAO,CAAC,GAAG,CAAC,yGAAyG,CAAC,CAAC;IACvH,OAAO,CAAC,GAAG,CAAC,qHAAqH,CAAC,CAAC;IACnI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,MAAM,GAAG,GAAG,CAAC,CAAS,EAAmB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxG,wBAAwB,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACrE,IAAI,CAAC,GAAG,EAAE,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC9F,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC5H,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;YAChE,MAAM,UAAU,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACnD,IAAI,MAA+C,CAAC;YACpD,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,GAAG,WAAW,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YAC3I,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,0BAA2B,GAAa,CAAC,OAAO,oBAAoB,CAAC,CAAC;gBACnF,SAAS;YACX,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnD,MAAM,IAAI,GAAG,MAAM,CAAC,IAA4C,CAAC;gBACjE,MAAM,GAAG,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,OAAO,IAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;gBACpE,OAAO,CAAC,IAAI,CAAC,2BAA2B,GAAG,oBAAoB,CAAC,CAAC;gBACjE,SAAS;YACX,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAA+C,CAAC;YACvE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YAClH,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;YAClE,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACrE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC3F,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAoB;gBAC7B,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU;gBACtC,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,SAAS,EAAE,WAAW,EAAE;gBACxB,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,SAAS;aACjC,CAAC;YACF,eAAe,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
|
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
import * as sessionService from './sessionService.js';
|
|
2
|
-
// merge persisted sessions with
|
|
3
|
-
export function mergeSessionActivity(sessions, activeIds,
|
|
4
|
-
const resolvedActiveIds = new Set(activeIds);
|
|
5
|
-
if (currentSessionId) {
|
|
6
|
-
resolvedActiveIds.add(currentSessionId);
|
|
7
|
-
}
|
|
2
|
+
// merge persisted sessions with active ids from ~/.claude/sessions and the sessions live in this runtime
|
|
3
|
+
export function mergeSessionActivity(sessions, activeIds, liveSessionIds = [], statuses = new Map()) {
|
|
4
|
+
const resolvedActiveIds = new Set([...activeIds, ...liveSessionIds]);
|
|
8
5
|
return sessions.map((session) => ({
|
|
9
6
|
...session,
|
|
10
7
|
isActive: resolvedActiveIds.has(session.sessionId),
|
|
8
|
+
...statuses.get(session.sessionId),
|
|
11
9
|
}));
|
|
12
10
|
}
|
|
13
11
|
// load the session list payload exactly once so callers do not duplicate the same merge logic
|
|
14
|
-
export async function loadSessionList(cwdArg,
|
|
12
|
+
export async function loadSessionList(cwdArg, liveSessionIds = []) {
|
|
15
13
|
const sessions = await sessionService.getSessionListForCwd(cwdArg);
|
|
16
|
-
const
|
|
17
|
-
return mergeSessionActivity(sessions,
|
|
14
|
+
const active = await sessionService.getActiveSessions();
|
|
15
|
+
return mergeSessionActivity(sessions, new Set(active.keys()), liveSessionIds, active);
|
|
18
16
|
}
|
|
19
17
|
//# sourceMappingURL=sessionListService.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionListService.js","sourceRoot":"","sources":["../../src/services/sessionListService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sessionListService.js","sourceRoot":"","sources":["../../src/services/sessionListService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AAOtD,yGAAyG;AACzG,MAAM,UAAU,oBAAoB,CAClC,QAA4B,EAC5B,SAAsB,EACtB,iBAAmC,EAAE,EACrC,WAAuC,IAAI,GAAG,EAAE;IAEhD,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;IACrE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAChC,GAAG,OAAO;QACV,QAAQ,EAAE,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC;QAClD,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC;KACnC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAe,EAAE,iBAAmC,EAAE;IAC1F,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,iBAAiB,EAAE,CAAC;IACxD,OAAO,oBAAoB,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;AACxF,CAAC"}
|
|
@@ -3,30 +3,37 @@ import os from 'node:os';
|
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { log } from '../core/logger.js';
|
|
5
5
|
import { cwdToProjectFolder } from '../utils/safePath.js';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
6
|
+
import { buildConversation, isCompactBoundary, parseEntries } from '../claude/conversation.js';
|
|
7
|
+
import { compactBoundaryMessage, imageBlocks, isThinkingBlock, parseTranscriptMessage, rememberToolResults, thinkingSeconds, } from '../claude/transcriptParser.js';
|
|
8
|
+
function isPidAlive(pid) {
|
|
9
|
+
if (typeof pid !== 'number')
|
|
10
|
+
return false;
|
|
11
|
+
try {
|
|
12
|
+
process.kill(pid, 0);
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
// EPERM means the process exists but belongs to someone else
|
|
17
|
+
return err.code === 'EPERM';
|
|
16
18
|
}
|
|
17
|
-
return result;
|
|
18
19
|
}
|
|
19
|
-
//
|
|
20
|
-
export async function
|
|
20
|
+
// claude processes still alive, from ~/.claude/sessions, keyed by session id
|
|
21
|
+
export async function getActiveSessions() {
|
|
21
22
|
const sessionsDir = path.join(os.homedir(), '.claude', 'sessions');
|
|
22
|
-
const active = new
|
|
23
|
+
const active = new Map();
|
|
23
24
|
try {
|
|
24
25
|
const files = fs.readdirSync(sessionsDir).filter((f) => f.endsWith('.json'));
|
|
25
26
|
for (const file of files) {
|
|
26
27
|
try {
|
|
27
28
|
const data = JSON.parse(fs.readFileSync(path.join(sessionsDir, file), 'utf-8'));
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
// a hard-killed claude leaves its pid file behind
|
|
30
|
+
if (!data.sessionId || !isPidAlive(data.pid))
|
|
31
|
+
continue;
|
|
32
|
+
const since = typeof data.statusUpdatedAt === 'number' ? new Date(data.statusUpdatedAt).toISOString() : undefined;
|
|
33
|
+
active.set(data.sessionId, {
|
|
34
|
+
...(typeof data.status === 'string' ? { status: data.status } : {}),
|
|
35
|
+
...(since ? { statusSince: since } : {}),
|
|
36
|
+
});
|
|
30
37
|
}
|
|
31
38
|
catch { }
|
|
32
39
|
}
|
|
@@ -34,59 +41,120 @@ export async function getActiveSessionIds() {
|
|
|
34
41
|
catch { }
|
|
35
42
|
return active;
|
|
36
43
|
}
|
|
44
|
+
// locate ~/.claude/projects/<slug>/<sessionId>.jsonl, the cli's own project first
|
|
45
|
+
// where each session's transcript was found; a hit is checked, a miss scans again
|
|
46
|
+
const jsonlPaths = new Map();
|
|
47
|
+
const MAX_JSONL_PATHS = 200;
|
|
48
|
+
export function findSessionJsonl(sessionId) {
|
|
49
|
+
const known = jsonlPaths.get(sessionId);
|
|
50
|
+
if (known && fs.existsSync(known))
|
|
51
|
+
return known;
|
|
52
|
+
jsonlPaths.delete(sessionId);
|
|
53
|
+
const found = scanSessionJsonl(sessionId);
|
|
54
|
+
if (found) {
|
|
55
|
+
if (jsonlPaths.size >= MAX_JSONL_PATHS)
|
|
56
|
+
jsonlPaths.delete(jsonlPaths.keys().next().value);
|
|
57
|
+
jsonlPaths.set(sessionId, found);
|
|
58
|
+
}
|
|
59
|
+
return found;
|
|
60
|
+
}
|
|
61
|
+
function scanSessionJsonl(sessionId) {
|
|
62
|
+
const own = getSessionFileInfo(sessionId).sessionFile;
|
|
63
|
+
if (fs.existsSync(own))
|
|
64
|
+
return own;
|
|
65
|
+
const projectsDir = path.join(os.homedir(), '.claude', 'projects');
|
|
66
|
+
if (!fs.existsSync(projectsDir))
|
|
67
|
+
return null;
|
|
68
|
+
for (const entry of fs.readdirSync(projectsDir, { withFileTypes: true })) {
|
|
69
|
+
if (!entry.isDirectory())
|
|
70
|
+
continue;
|
|
71
|
+
const candidate = path.join(projectsDir, entry.name, `${sessionId}.jsonl`);
|
|
72
|
+
if (fs.existsSync(candidate))
|
|
73
|
+
return candidate;
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
// the transcript text read last, for the taps on its tools that follow; read again once the
|
|
78
|
+
// file grows or changes
|
|
79
|
+
let lastText = null;
|
|
80
|
+
function transcriptText(file) {
|
|
81
|
+
const { size, mtimeMs } = fs.statSync(file);
|
|
82
|
+
if (lastText?.file !== file || lastText.size !== size || lastText.mtimeMs !== mtimeMs) {
|
|
83
|
+
lastText = { file, size, mtimeMs, text: fs.readFileSync(file, 'utf-8') };
|
|
84
|
+
}
|
|
85
|
+
return lastText.text;
|
|
86
|
+
}
|
|
87
|
+
// one session file summed up for the list; null when it holds no messages yet
|
|
88
|
+
function summarizeSessionFile(file) {
|
|
89
|
+
let firstMessage = '';
|
|
90
|
+
let lastTimestamp = '';
|
|
91
|
+
let hasMessages = false;
|
|
92
|
+
let messageCount = 0;
|
|
93
|
+
let customTitle = '';
|
|
94
|
+
let aiTitle = '';
|
|
95
|
+
for (const line of fs.readFileSync(file, 'utf-8').split('\n')) {
|
|
96
|
+
let entry;
|
|
97
|
+
try {
|
|
98
|
+
entry = JSON.parse(line);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
// titles are rewritten as the session goes on; the last one wins
|
|
104
|
+
if (entry['type'] === 'custom-title' && typeof entry['customTitle'] === 'string')
|
|
105
|
+
customTitle = entry['customTitle'];
|
|
106
|
+
if (entry['type'] === 'ai-title' && typeof entry['aiTitle'] === 'string')
|
|
107
|
+
aiTitle = entry['aiTitle'];
|
|
108
|
+
if (entry['type'] !== 'user' && entry['type'] !== 'assistant')
|
|
109
|
+
continue;
|
|
110
|
+
const message = entry['message'];
|
|
111
|
+
if (!message?.['role'] || message['role'] === 'system')
|
|
112
|
+
continue;
|
|
113
|
+
hasMessages = true;
|
|
114
|
+
if (typeof entry['timestamp'] === 'string')
|
|
115
|
+
lastTimestamp = entry['timestamp'];
|
|
116
|
+
const text = parseTranscriptMessage(entry, { includeNoise: true })?.content ?? '';
|
|
117
|
+
const isCommand = /<local-command-/i.test(text);
|
|
118
|
+
// tool results, subagent and meta lines are not chat bubbles
|
|
119
|
+
if (text.trim() && !isCommand && !entry['isMeta'] && !entry['isSidechain'])
|
|
120
|
+
messageCount++;
|
|
121
|
+
if (!firstMessage && message['role'] === 'user' && !isCommand)
|
|
122
|
+
firstMessage = text.slice(0, 200);
|
|
123
|
+
}
|
|
124
|
+
if (!hasMessages)
|
|
125
|
+
return null;
|
|
126
|
+
const title = customTitle || aiTitle;
|
|
127
|
+
return { sessionId: path.basename(file, '.jsonl'), firstMessage, lastTimestamp, messageCount, ...(title ? { title } : {}) };
|
|
128
|
+
}
|
|
129
|
+
// summaries by file, read again only when a file changed: the list is asked for on every reconnect
|
|
130
|
+
const summaries = new Map();
|
|
37
131
|
// list sessions for a given cwd with their first user message and last activity time
|
|
38
132
|
export async function getSessionListForCwd(cwdOverride) {
|
|
39
|
-
const
|
|
40
|
-
const folderName = cwdToProjectFolder(cwd);
|
|
41
|
-
const projectDir = path.join(os.homedir(), '.claude', 'projects', folderName);
|
|
42
|
-
log(`[session_list] cwd=${cwd}, folder=${folderName}, dir=${projectDir}`);
|
|
133
|
+
const { projectDir } = projectDirFor(cwdOverride);
|
|
43
134
|
const sessions = [];
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const msgObj = entry['message'];
|
|
62
|
-
if (!msgObj || !msgObj['role'] || msgObj['role'] === 'system')
|
|
63
|
-
continue;
|
|
64
|
-
hasMessages = true;
|
|
65
|
-
const ts = entry['timestamp'];
|
|
66
|
-
if (ts)
|
|
67
|
-
lastTimestamp = ts;
|
|
68
|
-
if (!firstMessage && msgObj['role'] === 'user') {
|
|
69
|
-
let text = '';
|
|
70
|
-
if (typeof msgObj['content'] === 'string')
|
|
71
|
-
text = msgObj['content'].slice(0, 200);
|
|
72
|
-
else if (Array.isArray(msgObj['content'])) {
|
|
73
|
-
text = msgObj['content']
|
|
74
|
-
.filter((b) => b['type'] === 'text' && b['text'])
|
|
75
|
-
.map((b) => b['text']).join('').slice(0, 200);
|
|
76
|
-
}
|
|
77
|
-
if (!/<local-command-/i.test(text))
|
|
78
|
-
firstMessage = text;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
catch { }
|
|
82
|
-
}
|
|
83
|
-
if (hasMessages)
|
|
84
|
-
sessions.push({ sessionId, firstMessage, lastTimestamp });
|
|
135
|
+
if (!fs.existsSync(projectDir))
|
|
136
|
+
return sessions;
|
|
137
|
+
const names = fs.readdirSync(projectDir).filter((f) => f.endsWith('.jsonl'));
|
|
138
|
+
// a deleted transcript's summary goes too
|
|
139
|
+
const present = new Set(names.map((name) => path.join(projectDir, name)));
|
|
140
|
+
for (const file of summaries.keys()) {
|
|
141
|
+
if (path.dirname(file) === projectDir && !present.has(file))
|
|
142
|
+
summaries.delete(file);
|
|
143
|
+
}
|
|
144
|
+
for (const name of names) {
|
|
145
|
+
const file = path.join(projectDir, name);
|
|
146
|
+
try {
|
|
147
|
+
const { size, mtimeMs } = fs.statSync(file);
|
|
148
|
+
let cached = summaries.get(file);
|
|
149
|
+
if (cached?.size !== size || cached.mtimeMs !== mtimeMs) {
|
|
150
|
+
cached = { size, mtimeMs, summary: summarizeSessionFile(file) };
|
|
151
|
+
summaries.set(file, cached);
|
|
85
152
|
}
|
|
86
|
-
|
|
153
|
+
if (cached.summary)
|
|
154
|
+
sessions.push(cached.summary);
|
|
87
155
|
}
|
|
156
|
+
catch { }
|
|
88
157
|
}
|
|
89
|
-
catch { }
|
|
90
158
|
sessions.sort((a, b) => (b.lastTimestamp || '').localeCompare(a.lastTimestamp || ''));
|
|
91
159
|
return sessions;
|
|
92
160
|
}
|
|
@@ -101,57 +169,128 @@ export async function deleteSessionFile(sessionId, cwdOverride) {
|
|
|
101
169
|
log(`[delete_session] file not found: ${sessionFile}`);
|
|
102
170
|
}
|
|
103
171
|
}
|
|
104
|
-
|
|
172
|
+
// claude's transcript folder for a project cwd (defaults to the cli's cwd)
|
|
173
|
+
function projectDirFor(cwdOverride) {
|
|
105
174
|
const cwd = cwdOverride && cwdOverride.length > 0 ? cwdOverride : process.cwd();
|
|
106
175
|
const folderName = cwdToProjectFolder(cwd);
|
|
107
|
-
|
|
108
|
-
const sessionFile = path.join(projectDir, `${sessionId}.jsonl`);
|
|
109
|
-
return { cwd, folderName, projectDir, sessionFile };
|
|
176
|
+
return { cwd, folderName, projectDir: path.join(os.homedir(), '.claude', 'projects', folderName) };
|
|
110
177
|
}
|
|
111
|
-
export function
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
return [];
|
|
115
|
-
return fs.readFileSync(sessionFile, 'utf-8').split('\n').filter((line) => line.trim().length > 0);
|
|
178
|
+
export function getSessionFileInfo(sessionId, cwdOverride) {
|
|
179
|
+
const info = projectDirFor(cwdOverride);
|
|
180
|
+
return { ...info, sessionFile: path.join(info.projectDir, `${sessionId}.jsonl`) };
|
|
116
181
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
182
|
+
// messages per history page; a page starts on a prompt or a compaction when one is near
|
|
183
|
+
export const HISTORY_PAGE_SIZE = 80;
|
|
184
|
+
const PAGE_STARTS = new Set(['user', 'compact']);
|
|
185
|
+
const CACHED_CONVERSATIONS = 4;
|
|
186
|
+
const conversations = new Map();
|
|
187
|
+
// the conversation of a session as the extension shows it, parsed again only when the jsonl changed
|
|
188
|
+
function loadConversation(sessionId) {
|
|
189
|
+
const file = findSessionJsonl(sessionId);
|
|
190
|
+
const stat = file ? fs.statSync(file, { throwIfNoEntry: false }) : undefined;
|
|
191
|
+
if (!file || !stat)
|
|
192
|
+
return { size: 0, mtimeMs: 0, messages: [], images: new Map() };
|
|
193
|
+
const cached = conversations.get(sessionId);
|
|
194
|
+
if (cached && cached.size === stat.size && cached.mtimeMs === stat.mtimeMs)
|
|
195
|
+
return cached;
|
|
196
|
+
const entries = parseEntries(fs.readFileSync(file, 'utf-8').split('\n'));
|
|
197
|
+
const toolResults = new Map();
|
|
198
|
+
for (const entry of entries)
|
|
199
|
+
rememberToolResults(entry, toolResults);
|
|
200
|
+
const conversation = { size: stat.size, mtimeMs: stat.mtimeMs, messages: [], images: new Map() };
|
|
201
|
+
// thinking time by message id: from the entry before to the thinking line, shown on the
|
|
202
|
+
// message's first visible line
|
|
203
|
+
const thinking = new Map();
|
|
204
|
+
let previousAt = NaN;
|
|
205
|
+
for (const entry of buildConversation(entries)) {
|
|
206
|
+
const at = Date.parse(entry.timestamp ?? '');
|
|
207
|
+
const id = entry.message?.id;
|
|
208
|
+
const content = entry.message?.content;
|
|
209
|
+
if (id && Array.isArray(content) && content.some(isThinkingBlock) && at >= previousAt) {
|
|
210
|
+
thinking.set(id, (thinking.get(id) ?? 0) + at - previousAt);
|
|
211
|
+
}
|
|
212
|
+
if (!Number.isNaN(at))
|
|
213
|
+
previousAt = at;
|
|
214
|
+
const parsed = isCompactBoundary(entry)
|
|
215
|
+
? compactBoundaryMessage(entry)
|
|
216
|
+
: parseTranscriptMessage(entry, { includeNoise: true, toolResults });
|
|
217
|
+
if (!parsed)
|
|
218
|
+
continue;
|
|
219
|
+
const thoughtMs = id ? thinking.get(id) : undefined;
|
|
220
|
+
if (thoughtMs !== undefined) {
|
|
221
|
+
parsed.thinkingSeconds = thinkingSeconds(thoughtMs);
|
|
222
|
+
thinking.delete(id);
|
|
223
|
+
}
|
|
224
|
+
conversation.messages.push(parsed);
|
|
225
|
+
if (parsed.images && parsed.id)
|
|
226
|
+
conversation.images.set(parsed.id, imageBlocks(entry.message?.content));
|
|
227
|
+
}
|
|
228
|
+
conversations.delete(sessionId);
|
|
229
|
+
conversations.set(sessionId, conversation);
|
|
230
|
+
if (conversations.size > CACHED_CONVERSATIONS)
|
|
231
|
+
conversations.delete(conversations.keys().next().value);
|
|
232
|
+
return conversation;
|
|
124
233
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
234
|
+
// the newest page of a session, or the page just before the message `before`
|
|
235
|
+
export function readSessionPage(sessionId, before) {
|
|
236
|
+
const { messages } = loadConversation(sessionId);
|
|
237
|
+
const end = before ? Math.max(0, messages.findIndex((message) => message.id === before)) : messages.length;
|
|
238
|
+
let start = Math.max(0, end - HISTORY_PAGE_SIZE);
|
|
239
|
+
// a long run of claude's own messages is cut anyway, so a page stays small
|
|
240
|
+
const floor = Math.max(0, start - HISTORY_PAGE_SIZE);
|
|
241
|
+
while (start > floor && !PAGE_STARTS.has(messages[start].role))
|
|
242
|
+
start--;
|
|
243
|
+
return { messages: messages.slice(start, end), hasMore: start > 0 };
|
|
132
244
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
245
|
+
export function findPromptImage(sessionId, messageId, index) {
|
|
246
|
+
return loadConversation(sessionId).images.get(messageId)?.[index] ?? null;
|
|
247
|
+
}
|
|
248
|
+
// what one tool printed, cut so a single frame stays small
|
|
249
|
+
export const TOOL_OUTPUT_LIMIT = 64 * 1024;
|
|
250
|
+
// the result of a tool use as claude saw it, read from the session file when the app opens the
|
|
251
|
+
// tool; null while the tool still runs
|
|
252
|
+
export function findToolResult(sessionId, toolUseId) {
|
|
253
|
+
const file = findSessionJsonl(sessionId);
|
|
254
|
+
if (!file)
|
|
255
|
+
return null;
|
|
256
|
+
let text;
|
|
257
|
+
try {
|
|
258
|
+
text = transcriptText(file);
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
// gone meanwhile, or past the longest string node can hold
|
|
262
|
+
log(`[tool_result] cannot read ${file}: ${error}`);
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
const needle = `"tool_use_id":${JSON.stringify(toolUseId)}`;
|
|
266
|
+
for (let at = text.indexOf(needle); at >= 0; at = text.indexOf(needle, at + needle.length)) {
|
|
267
|
+
const end = text.indexOf('\n', at);
|
|
268
|
+
const line = text.slice(text.lastIndexOf('\n', at) + 1, end < 0 ? undefined : end);
|
|
269
|
+
let entry;
|
|
144
270
|
try {
|
|
145
|
-
|
|
146
|
-
sessionId,
|
|
147
|
-
seenUuids,
|
|
148
|
-
includeNoise: true,
|
|
149
|
-
});
|
|
150
|
-
if (parsed)
|
|
151
|
-
messages.push(parsed);
|
|
271
|
+
entry = JSON.parse(line);
|
|
152
272
|
}
|
|
153
|
-
catch {
|
|
273
|
+
catch {
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
const content = entry.message?.content;
|
|
277
|
+
const block = Array.isArray(content) ? content.find((b) => b.type === 'tool_result' && b.tool_use_id === toolUseId) : undefined;
|
|
278
|
+
if (!block)
|
|
279
|
+
continue;
|
|
280
|
+
const output = resultText(block.content);
|
|
281
|
+
return { output: output.slice(0, TOOL_OUTPUT_LIMIT), isError: block.is_error === true, truncated: output.length > TOOL_OUTPUT_LIMIT };
|
|
154
282
|
}
|
|
155
|
-
return
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
// a tool_result content: plain text, or text and image blocks
|
|
286
|
+
function resultText(content) {
|
|
287
|
+
if (typeof content === 'string')
|
|
288
|
+
return content;
|
|
289
|
+
if (!Array.isArray(content))
|
|
290
|
+
return '';
|
|
291
|
+
return content
|
|
292
|
+
.map((block) => (block?.type === 'text' ? block.text ?? '' : block?.type === 'image' ? '[image]' : ''))
|
|
293
|
+
.filter(Boolean)
|
|
294
|
+
.join('\n');
|
|
156
295
|
}
|
|
157
296
|
//# sourceMappingURL=sessionService.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionService.js","sourceRoot":"","sources":["../../src/services/sessionService.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sessionService.js","sourceRoot":"","sources":["../../src/services/sessionService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export const DEFAULT_TUNNEL_HOST = '127.0.0.1';
|
|
2
|
-
//
|
|
2
|
+
// a host name with an optional port, nothing a header could smuggle
|
|
3
|
+
const HOST_HEADER = /^[A-Za-z0-9.-]{1,253}(:\d{1,5})?$/;
|
|
4
|
+
// build a stable host header for the proxied local target; an invalid host falls back to the default
|
|
3
5
|
export function resolveTunnelHostHeader(port, requestedHost) {
|
|
4
6
|
const trimmedHost = typeof requestedHost === 'string' ? requestedHost.trim() : '';
|
|
5
|
-
if (!trimmedHost)
|
|
7
|
+
if (!trimmedHost || !HOST_HEADER.test(trimmedHost))
|
|
6
8
|
return undefined;
|
|
7
9
|
return trimmedHost.includes(':') ? trimmedHost : `${trimmedHost}:${port}`;
|
|
8
10
|
}
|
|
@@ -12,15 +14,17 @@ export function normalizeTunnelPath(pathValue) {
|
|
|
12
14
|
}
|
|
13
15
|
// decode a tunnel request body only for methods that may legally send one
|
|
14
16
|
export function decodeTunnelBody(request) {
|
|
15
|
-
if (!request.body || request.method === 'GET' || request.method === 'HEAD') {
|
|
17
|
+
if (typeof request.body !== 'string' || !request.body || request.method === 'GET' || request.method === 'HEAD') {
|
|
16
18
|
return undefined;
|
|
17
19
|
}
|
|
18
20
|
return Buffer.from(request.body, 'base64');
|
|
19
21
|
}
|
|
20
22
|
// drop hop-by-hop headers and rewrite local origins before proxying the request
|
|
21
23
|
export function filterTunnelRequestHeaders(headers, targetHost, port, hostHeader) {
|
|
22
|
-
const filteredHeaders = Object.fromEntries(Object.entries(headers)
|
|
23
|
-
.filter(([key]) => {
|
|
24
|
+
const filteredHeaders = Object.fromEntries(Object.entries(headers && typeof headers === 'object' ? headers : {})
|
|
25
|
+
.filter(([key, value]) => {
|
|
26
|
+
if (typeof value !== 'string')
|
|
27
|
+
return false;
|
|
24
28
|
const lowerKey = key.toLowerCase();
|
|
25
29
|
return !lowerKey.startsWith('sec-') && !['host', 'connection', 'accept-encoding', 'upgrade-insecure-requests'].includes(lowerKey);
|
|
26
30
|
})
|