kumo-cli 1.1.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +140 -131
- package/dist/auth/credentialsStore.js +19 -6
- 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 +98 -93
- 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 +0 -5
- package/dist/core/config.js.map +1 -1
- package/dist/core/logger.js +47 -6
- 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 +4 -0
- package/dist/engine/claudeArgs.js.map +1 -1
- package/dist/engine/claudeBinary.js +14 -5
- package/dist/engine/claudeBinary.js.map +1 -1
- package/dist/engine/claudeConfig.js +20 -6
- package/dist/engine/claudeConfig.js.map +1 -1
- package/dist/engine/claudeLogin.js +76 -0
- package/dist/engine/claudeLogin.js.map +1 -0
- package/dist/engine/controlChannel.js +13 -1
- package/dist/engine/controlChannel.js.map +1 -1
- package/dist/engine/liveTranscript.js +70 -21
- package/dist/engine/liveTranscript.js.map +1 -1
- package/dist/engine/ndjson.js +15 -10
- package/dist/engine/ndjson.js.map +1 -1
- package/dist/engine/permissions.js +5 -2
- package/dist/engine/permissions.js.map +1 -1
- 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 +99 -84
- package/dist/engine/sessionManager.js.map +1 -1
- package/dist/engine/settingsCommands.js +56 -0
- package/dist/engine/settingsCommands.js.map +1 -1
- package/dist/engine/streamSession.js +59 -66
- package/dist/engine/streamSession.js.map +1 -1
- package/dist/engine/taskTracker.js +1 -1
- package/dist/engine/taskTracker.js.map +1 -1
- 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 +0 -55
- package/dist/handlers/promptImages.js.map +1 -1
- package/dist/handlers/runtimeHandlers.js +51 -151
- package/dist/handlers/runtimeHandlers.js.map +1 -1
- package/dist/handlers/sessionHandlers.js +48 -14
- 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 +58 -16
- 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 +5 -5
- package/dist/services/cliRuntime.js.map +1 -1
- package/dist/services/fileService.js +50 -24
- package/dist/services/fileService.js.map +1 -1
- package/dist/services/forkService.js +1 -1
- package/dist/services/forkService.js.map +1 -1
- package/dist/services/modelService.js +62 -18
- 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/sessionService.js +204 -85
- 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 +17 -0
- package/dist/services/tunnelService.js.map +1 -1
- package/dist/transport/wsClient.js +60 -38
- package/dist/transport/wsClient.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 +62 -62
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { buildClaudeArgs, buildClaudeEnv, filterPassthroughArgs } from '../engine/claudeArgs.js';
|
|
2
2
|
import { resolveClaudeCommand } from '../engine/claudeBinary.js';
|
|
3
3
|
import { isPermissionMode } from '../engine/permissions.js';
|
|
4
|
+
import { ALLOW_REMOTE_CONFIG_FLAG } from '../engine/remoteConfig.js';
|
|
4
5
|
import { loadSessionList } from './sessionListService.js';
|
|
5
6
|
// derive session launch settings from `kumo claude <args>`; KUMO_PERMISSION_MODE overrides the default mode
|
|
6
7
|
export function resolveLaunchConfig(args, env = process.env) {
|
|
7
|
-
const parsed = filterPassthroughArgs(args);
|
|
8
|
+
const parsed = filterPassthroughArgs(args.filter((arg) => arg !== ALLOW_REMOTE_CONFIG_FLAG));
|
|
8
9
|
const fromEnv = env['KUMO_PERMISSION_MODE'];
|
|
9
10
|
const permissionMode = isPermissionMode(fromEnv) ? fromEnv : parsed.permissionMode ?? 'default';
|
|
10
11
|
return {
|
|
11
12
|
passthrough: parsed.passthrough,
|
|
12
13
|
permissionMode,
|
|
13
14
|
allowBypass: parsed.allowBypass || permissionMode === 'bypassPermissions',
|
|
15
|
+
allowRemoteConfig: args.includes(ALLOW_REMOTE_CONFIG_FLAG),
|
|
14
16
|
};
|
|
15
17
|
}
|
|
16
18
|
// build the spawn spec of a session: per-session model (or device default), effort, binary and env
|
|
@@ -35,7 +37,7 @@ export function createSpawnSpecFactory(params) {
|
|
|
35
37
|
};
|
|
36
38
|
};
|
|
37
39
|
}
|
|
38
|
-
// create the ws onOpen hook that registers the cli, reports status
|
|
40
|
+
// create the ws onOpen hook that registers the cli, reports status and refreshes sessions
|
|
39
41
|
export function createWsOpenHandler(params) {
|
|
40
42
|
return async () => {
|
|
41
43
|
const credentials = params.credentials();
|
|
@@ -43,12 +45,10 @@ export function createWsOpenHandler(params) {
|
|
|
43
45
|
type: 'register',
|
|
44
46
|
clientType: 'cli',
|
|
45
47
|
deviceToken: credentials?.deviceToken,
|
|
46
|
-
deviceUuid: credentials?.deviceUuid,
|
|
47
48
|
cwd: process.cwd(),
|
|
48
49
|
});
|
|
49
|
-
params.send({ type: 'cli_status', effort: params.effort()
|
|
50
|
+
params.send({ type: 'cli_status', effort: params.effort() });
|
|
50
51
|
void params.refreshAuth();
|
|
51
|
-
params.restartWatcher();
|
|
52
52
|
const sessions = await loadSessionList(undefined, params.liveSessionIds());
|
|
53
53
|
params.send({ type: 'session_list', sessions });
|
|
54
54
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cliRuntime.js","sourceRoot":"","sources":["../../src/services/cliRuntime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAsB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAuB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"cliRuntime.js","sourceRoot":"","sources":["../../src/services/cliRuntime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import { safePath, copyRecursive } from '../utils/safePath.js';
|
|
3
|
+
import { safePath, copyRecursive, projectRootOf, mutablePath } from '../utils/safePath.js';
|
|
4
4
|
import { loadIgnoredNames } from '../utils/ignorePaths.js';
|
|
5
|
+
// the largest file sent to the app in one read
|
|
6
|
+
export const MAX_READ_BYTES = 5 * 1024 * 1024;
|
|
7
|
+
// how many folder entries one search may look at before giving up
|
|
8
|
+
export const MAX_SEARCH_VISITS = 50_000;
|
|
5
9
|
// translate any thrown error into a string message
|
|
6
10
|
function errMsg(e) {
|
|
7
11
|
return e instanceof Error ? e.message : String(e);
|
|
@@ -15,10 +19,19 @@ function guard(fn) {
|
|
|
15
19
|
return { ok: false, error: errMsg(e) };
|
|
16
20
|
}
|
|
17
21
|
}
|
|
22
|
+
// size of a file, 0 when it cannot be read (a broken link, no permission)
|
|
23
|
+
function sizeOf(file) {
|
|
24
|
+
try {
|
|
25
|
+
return fs.statSync(file).size;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return 0;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
18
31
|
// list directory entries (non-hidden) sorted dirs first
|
|
19
32
|
export function list(requestedPath, cwd) {
|
|
20
33
|
return guard(() => {
|
|
21
|
-
const projectRoot =
|
|
34
|
+
const projectRoot = projectRootOf(cwd);
|
|
22
35
|
const resolved = requestedPath
|
|
23
36
|
? safePath(requestedPath, projectRoot)
|
|
24
37
|
: projectRoot;
|
|
@@ -28,24 +41,33 @@ export function list(requestedPath, cwd) {
|
|
|
28
41
|
name: e.name,
|
|
29
42
|
path: path.relative(projectRoot, path.resolve(resolved, e.name)).replace(/\\/g, '/'),
|
|
30
43
|
isDirectory: e.isDirectory(),
|
|
31
|
-
size: e.isDirectory() ? 0 :
|
|
44
|
+
size: e.isDirectory() ? 0 : sizeOf(path.resolve(resolved, e.name)),
|
|
32
45
|
}))
|
|
33
46
|
.sort((a, b) => a.isDirectory !== b.isDirectory ? (a.isDirectory ? -1 : 1) : a.name.localeCompare(b.name));
|
|
34
47
|
return { entries, projectName: path.basename(projectRoot) };
|
|
35
48
|
});
|
|
36
49
|
}
|
|
37
50
|
export function read(filePath, cwd) {
|
|
38
|
-
return guard(() =>
|
|
51
|
+
return guard(() => {
|
|
52
|
+
const resolved = safePath(filePath, projectRootOf(cwd));
|
|
53
|
+
const stat = fs.statSync(resolved);
|
|
54
|
+
if (!stat.isFile())
|
|
55
|
+
throw new Error('not a file');
|
|
56
|
+
if (stat.size > MAX_READ_BYTES)
|
|
57
|
+
throw new Error(`file too large (${stat.size} bytes, max ${MAX_READ_BYTES})`);
|
|
58
|
+
return fs.readFileSync(resolved, 'utf-8');
|
|
59
|
+
});
|
|
39
60
|
}
|
|
40
61
|
export function write(filePath, content, cwd) {
|
|
41
62
|
return guard(() => {
|
|
42
|
-
|
|
43
|
-
|
|
63
|
+
if (typeof content !== 'string')
|
|
64
|
+
throw new Error('content is required');
|
|
65
|
+
fs.writeFileSync(mutablePath(filePath, projectRootOf(cwd)), content, 'utf-8');
|
|
44
66
|
});
|
|
45
67
|
}
|
|
46
68
|
export function create(targetPath, isDir, cwd) {
|
|
47
69
|
return guard(() => {
|
|
48
|
-
const resolved =
|
|
70
|
+
const resolved = mutablePath(targetPath, projectRootOf(cwd));
|
|
49
71
|
if (isDir)
|
|
50
72
|
fs.mkdirSync(resolved, { recursive: true });
|
|
51
73
|
else {
|
|
@@ -55,25 +77,33 @@ export function create(targetPath, isDir, cwd) {
|
|
|
55
77
|
});
|
|
56
78
|
}
|
|
57
79
|
export function remove(targetPath, cwd) {
|
|
58
|
-
return guard(() => fs.rmSync(
|
|
80
|
+
return guard(() => fs.rmSync(mutablePath(targetPath, projectRootOf(cwd)), { recursive: true, force: false }));
|
|
59
81
|
}
|
|
60
82
|
export function rename(oldPath, newName, cwd) {
|
|
61
83
|
return guard(() => {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
84
|
+
if (typeof newName !== 'string' || !newName || newName === '.' || newName === '..' || /[\\/]/.test(newName)) {
|
|
85
|
+
throw new Error('invalid name');
|
|
86
|
+
}
|
|
87
|
+
const projectRoot = projectRootOf(cwd);
|
|
88
|
+
const resolvedOld = mutablePath(oldPath, projectRoot);
|
|
89
|
+
const resolvedNew = safePath(path.join(path.dirname(resolvedOld), newName), projectRoot);
|
|
66
90
|
fs.renameSync(resolvedOld, resolvedNew);
|
|
67
91
|
return { newPath: path.relative(projectRoot, resolvedNew).replace(/\\/g, '/') };
|
|
68
92
|
});
|
|
69
93
|
}
|
|
70
94
|
export function copy(src, dest, cwd) {
|
|
71
|
-
return guard(() =>
|
|
95
|
+
return guard(() => {
|
|
96
|
+
const projectRoot = projectRootOf(cwd);
|
|
97
|
+
copyRecursive(mutablePath(src, projectRoot), mutablePath(dest, projectRoot));
|
|
98
|
+
});
|
|
72
99
|
}
|
|
73
100
|
export function move(src, dest, cwd) {
|
|
74
|
-
return guard(() =>
|
|
101
|
+
return guard(() => {
|
|
102
|
+
const projectRoot = projectRootOf(cwd);
|
|
103
|
+
fs.renameSync(mutablePath(src, projectRoot), mutablePath(dest, projectRoot));
|
|
104
|
+
});
|
|
75
105
|
}
|
|
76
|
-
// recursive case-insensitive name search, bounded by limit
|
|
106
|
+
// recursive case-insensitive name search, bounded by limit and by how many entries it looks at
|
|
77
107
|
export function search(query, basePath, limit) {
|
|
78
108
|
return guard(() => {
|
|
79
109
|
const q = query.trim().toLowerCase();
|
|
@@ -84,7 +114,8 @@ export function search(query, basePath, limit) {
|
|
|
84
114
|
const ignored = loadIgnoredNames(projectRoot);
|
|
85
115
|
const results = [];
|
|
86
116
|
const stack = [baseResolved];
|
|
87
|
-
|
|
117
|
+
let visits = 0;
|
|
118
|
+
while (stack.length > 0 && results.length < limit && visits < MAX_SEARCH_VISITS) {
|
|
88
119
|
const dir = stack.pop();
|
|
89
120
|
let dirEntries;
|
|
90
121
|
try {
|
|
@@ -94,22 +125,17 @@ export function search(query, basePath, limit) {
|
|
|
94
125
|
continue;
|
|
95
126
|
}
|
|
96
127
|
for (const e of dirEntries) {
|
|
128
|
+
if (++visits >= MAX_SEARCH_VISITS)
|
|
129
|
+
break;
|
|
97
130
|
if (e.name.startsWith('.') || ignored.has(e.name))
|
|
98
131
|
continue;
|
|
99
132
|
const full = path.resolve(dir, e.name);
|
|
100
133
|
if (e.name.toLowerCase().includes(q)) {
|
|
101
|
-
let size = 0;
|
|
102
|
-
if (!e.isDirectory()) {
|
|
103
|
-
try {
|
|
104
|
-
size = fs.statSync(full).size;
|
|
105
|
-
}
|
|
106
|
-
catch { }
|
|
107
|
-
}
|
|
108
134
|
results.push({
|
|
109
135
|
name: e.name,
|
|
110
136
|
path: path.relative(projectRoot, full).replace(/\\/g, '/'),
|
|
111
137
|
isDirectory: e.isDirectory(),
|
|
112
|
-
size,
|
|
138
|
+
size: e.isDirectory() ? 0 : sizeOf(full),
|
|
113
139
|
});
|
|
114
140
|
if (results.length >= limit)
|
|
115
141
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileService.js","sourceRoot":"","sources":["../../src/services/fileService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"fileService.js","sourceRoot":"","sources":["../../src/services/fileService.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import fs from 'node:fs';
|
|
|
3
3
|
import os from 'node:os';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { findSessionJsonl } from './sessionService.js';
|
|
6
|
-
|
|
6
|
+
import { str } from '../utils/json.js';
|
|
7
7
|
function promptText(entry) {
|
|
8
8
|
const content = entry['message']?.['content'];
|
|
9
9
|
if (typeof content === 'string')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forkService.js","sourceRoot":"","sources":["../../src/services/forkService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"forkService.js","sourceRoot":"","sources":["../../src/services/forkService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { httpRequest } from '../http/httpClient.js';
|
|
2
2
|
import { SERVER_HTTP } from '../core/config.js';
|
|
3
3
|
import { ClaudeAdapterProxy } from './claudeAdapterProxy.js';
|
|
4
|
+
import { isLocalHost } from '../utils/localHost.js';
|
|
5
|
+
// distinct provider configs kept running; above the live-session cap so live sessions keep theirs
|
|
6
|
+
const MAX_ADAPTER_PROXIES = 8;
|
|
4
7
|
// parse a backend model payload: object = explicit model, null = claude's own default, otherwise device default
|
|
5
8
|
export function parseModelPayload(payload) {
|
|
6
9
|
if (payload === null)
|
|
@@ -13,8 +16,26 @@ export function parseModelPayload(payload) {
|
|
|
13
16
|
baseURL: typeof p['baseURL'] === 'string' && p['baseURL'] ? p['baseURL'] : undefined,
|
|
14
17
|
apiKey: typeof p['apiKey'] === 'string' && p['apiKey'] ? p['apiKey'] : undefined,
|
|
15
18
|
};
|
|
19
|
+
const contextWindow = p['contextWindow'];
|
|
20
|
+
if (typeof contextWindow === 'number' && Number.isInteger(contextWindow) && contextWindow > 0)
|
|
21
|
+
model.contextWindow = contextWindow;
|
|
16
22
|
return model.model || model.baseURL || model.apiKey ? model : undefined;
|
|
17
23
|
}
|
|
24
|
+
// a provider url must be https, or http on a local host
|
|
25
|
+
export function assertProviderURL(baseURL) {
|
|
26
|
+
let url;
|
|
27
|
+
try {
|
|
28
|
+
url = new URL(baseURL);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
throw new Error(`invalid provider url: ${baseURL}`);
|
|
32
|
+
}
|
|
33
|
+
if (url.protocol === 'https:')
|
|
34
|
+
return;
|
|
35
|
+
if (url.protocol === 'http:' && isLocalHost(url.hostname))
|
|
36
|
+
return;
|
|
37
|
+
throw new Error(`provider url must use https: ${url.origin}`);
|
|
38
|
+
}
|
|
18
39
|
// provider connection for claude processes: env overrides, adapter proxies and the device default model
|
|
19
40
|
export class ModelService {
|
|
20
41
|
adapterProxies = new Map();
|
|
@@ -25,34 +46,57 @@ export class ModelService {
|
|
|
25
46
|
ANTHROPIC_API_KEY: undefined,
|
|
26
47
|
ANTHROPIC_AUTH_TOKEN: undefined,
|
|
27
48
|
};
|
|
49
|
+
let proxyToken;
|
|
28
50
|
if (model?.baseURL) {
|
|
29
|
-
|
|
30
|
-
|
|
51
|
+
assertProviderURL(model.baseURL.trim());
|
|
52
|
+
const endpoint = await this.resolveEndpoint(model);
|
|
53
|
+
env.ANTHROPIC_BASE_URL = endpoint.url;
|
|
54
|
+
proxyToken = endpoint.token;
|
|
55
|
+
// the local adapter holds the provider key and takes its own token; without a key of its
|
|
56
|
+
// own claude would send its claude.ai login to that host
|
|
57
|
+
if (proxyToken)
|
|
58
|
+
env.ANTHROPIC_AUTH_TOKEN = proxyToken;
|
|
59
|
+
else if (!model.apiKey)
|
|
60
|
+
env.ANTHROPIC_AUTH_TOKEN = 'none';
|
|
61
|
+
// claude turns tool search off for hosts that are not anthropic's, then sends every mcp
|
|
62
|
+
// tool's schema each turn and can outgrow a provider's input limit; on unless the user
|
|
63
|
+
// set it themselves
|
|
64
|
+
if (process.env['ENABLE_TOOL_SEARCH'] === undefined)
|
|
65
|
+
env.ENABLE_TOOL_SEARCH = 'true';
|
|
31
66
|
}
|
|
32
|
-
if (model?.apiKey)
|
|
67
|
+
if (model?.apiKey && !proxyToken)
|
|
33
68
|
env.ANTHROPIC_API_KEY = model.apiKey;
|
|
34
|
-
if (
|
|
35
|
-
env.
|
|
69
|
+
if (model?.contextWindow)
|
|
70
|
+
env.CLAUDE_CODE_AUTO_COMPACT_WINDOW = String(model.contextWindow);
|
|
36
71
|
return env;
|
|
37
72
|
}
|
|
38
|
-
// normalize provider endpoints into Claude-compatible base urls
|
|
73
|
+
// normalize provider endpoints into Claude-compatible base urls
|
|
39
74
|
async resolveClaudeBaseURL(model) {
|
|
75
|
+
return (await this.resolveEndpoint(model)).url;
|
|
76
|
+
}
|
|
77
|
+
// the claude-compatible url of a provider, with the token of the adapter proxy started for it;
|
|
78
|
+
// one proxy per provider config, the least recently used closed past MAX_ADAPTER_PROXIES
|
|
79
|
+
async resolveEndpoint(model) {
|
|
40
80
|
const baseURL = (model.baseURL ?? '').trim().replace(/\/+$/, '');
|
|
41
81
|
if (!baseURL)
|
|
42
|
-
return baseURL;
|
|
82
|
+
return { url: baseURL };
|
|
43
83
|
if (/\/v1\/messages$/i.test(baseURL))
|
|
44
|
-
return baseURL.replace(/\/v1\/messages$/i, '');
|
|
45
|
-
if (
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
84
|
+
return { url: baseURL.replace(/\/v1\/messages$/i, '') };
|
|
85
|
+
if (!/\/v1\/chat\/completions$/i.test(baseURL))
|
|
86
|
+
return { url: baseURL };
|
|
87
|
+
const config = { baseURL, apiKey: model.apiKey ?? '', model: model.model };
|
|
88
|
+
const key = JSON.stringify(config);
|
|
89
|
+
const proxy = this.adapterProxies.get(key) ?? new ClaudeAdapterProxy();
|
|
90
|
+
this.adapterProxies.delete(key);
|
|
91
|
+
this.adapterProxies.set(key, proxy);
|
|
92
|
+
for (const [oldKey, old] of this.adapterProxies) {
|
|
93
|
+
if (this.adapterProxies.size <= MAX_ADAPTER_PROXIES)
|
|
94
|
+
break;
|
|
95
|
+
this.adapterProxies.delete(oldKey);
|
|
96
|
+
void old.stop();
|
|
54
97
|
}
|
|
55
|
-
|
|
98
|
+
const url = await proxy.start(config);
|
|
99
|
+
return { url, token: proxy.token ?? undefined };
|
|
56
100
|
}
|
|
57
101
|
// fetch the user's current default model from backend using deviceToken
|
|
58
102
|
async fetchDefault(deviceToken) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelService.js","sourceRoot":"","sources":["../../src/services/modelService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"modelService.js","sourceRoot":"","sources":["../../src/services/modelService.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"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"}
|