kumo-cli 1.1.0 → 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 (96) hide show
  1. package/README.md +140 -131
  2. package/dist/auth/credentialsStore.js +19 -6
  3. package/dist/auth/credentialsStore.js.map +1 -1
  4. package/dist/claude/conversation.js +272 -0
  5. package/dist/claude/conversation.js.map +1 -0
  6. package/dist/claude/transcriptParser.js +98 -93
  7. package/dist/claude/transcriptParser.js.map +1 -1
  8. package/dist/commands/cliArgs.js +1 -0
  9. package/dist/commands/cliArgs.js.map +1 -1
  10. package/dist/core/config.js +0 -5
  11. package/dist/core/config.js.map +1 -1
  12. package/dist/core/logger.js +47 -6
  13. package/dist/core/logger.js.map +1 -1
  14. package/dist/core/projectFileWatcher.js +100 -36
  15. package/dist/core/projectFileWatcher.js.map +1 -1
  16. package/dist/engine/claudeArgs.js +4 -0
  17. package/dist/engine/claudeArgs.js.map +1 -1
  18. package/dist/engine/claudeBinary.js +14 -5
  19. package/dist/engine/claudeBinary.js.map +1 -1
  20. package/dist/engine/claudeConfig.js +20 -6
  21. package/dist/engine/claudeConfig.js.map +1 -1
  22. package/dist/engine/claudeLogin.js +76 -0
  23. package/dist/engine/claudeLogin.js.map +1 -0
  24. package/dist/engine/controlChannel.js +13 -1
  25. package/dist/engine/controlChannel.js.map +1 -1
  26. package/dist/engine/liveTranscript.js +70 -21
  27. package/dist/engine/liveTranscript.js.map +1 -1
  28. package/dist/engine/ndjson.js +15 -10
  29. package/dist/engine/ndjson.js.map +1 -1
  30. package/dist/engine/permissions.js +5 -2
  31. package/dist/engine/permissions.js.map +1 -1
  32. package/dist/engine/probePool.js +51 -0
  33. package/dist/engine/probePool.js.map +1 -0
  34. package/dist/engine/processTree.js +45 -0
  35. package/dist/engine/processTree.js.map +1 -0
  36. package/dist/engine/remoteConfig.js +17 -0
  37. package/dist/engine/remoteConfig.js.map +1 -0
  38. package/dist/engine/sessionManager.js +99 -84
  39. package/dist/engine/sessionManager.js.map +1 -1
  40. package/dist/engine/settingsCommands.js +56 -0
  41. package/dist/engine/settingsCommands.js.map +1 -1
  42. package/dist/engine/streamSession.js +59 -66
  43. package/dist/engine/streamSession.js.map +1 -1
  44. package/dist/engine/taskTracker.js +1 -1
  45. package/dist/engine/taskTracker.js.map +1 -1
  46. package/dist/engine/toolLabels.js +32 -0
  47. package/dist/engine/toolLabels.js.map +1 -0
  48. package/dist/handlers/controlRequest.js +17 -0
  49. package/dist/handlers/controlRequest.js.map +1 -0
  50. package/dist/handlers/fileHandlers.js +12 -0
  51. package/dist/handlers/fileHandlers.js.map +1 -1
  52. package/dist/handlers/messageRouter.js +8 -1
  53. package/dist/handlers/messageRouter.js.map +1 -1
  54. package/dist/handlers/promptImages.js +0 -55
  55. package/dist/handlers/promptImages.js.map +1 -1
  56. package/dist/handlers/runtimeHandlers.js +51 -151
  57. package/dist/handlers/runtimeHandlers.js.map +1 -1
  58. package/dist/handlers/sessionHandlers.js +48 -14
  59. package/dist/handlers/sessionHandlers.js.map +1 -1
  60. package/dist/handlers/terminalHandlers.js +9 -2
  61. package/dist/handlers/terminalHandlers.js.map +1 -1
  62. package/dist/http/httpClient.js +6 -0
  63. package/dist/http/httpClient.js.map +1 -1
  64. package/dist/index.js +58 -16
  65. package/dist/index.js.map +1 -1
  66. package/dist/pty/terminalManager.js +58 -11
  67. package/dist/pty/terminalManager.js.map +1 -1
  68. package/dist/services/bootstrapService.js +17 -1
  69. package/dist/services/bootstrapService.js.map +1 -1
  70. package/dist/services/claudeAdapterProxy.js +68 -21
  71. package/dist/services/claudeAdapterProxy.js.map +1 -1
  72. package/dist/services/cliRuntime.js +5 -5
  73. package/dist/services/cliRuntime.js.map +1 -1
  74. package/dist/services/fileService.js +50 -24
  75. package/dist/services/fileService.js.map +1 -1
  76. package/dist/services/forkService.js +1 -1
  77. package/dist/services/forkService.js.map +1 -1
  78. package/dist/services/modelService.js +62 -18
  79. package/dist/services/modelService.js.map +1 -1
  80. package/dist/services/pairingService.js +21 -15
  81. package/dist/services/pairingService.js.map +1 -1
  82. package/dist/services/sessionService.js +204 -85
  83. package/dist/services/sessionService.js.map +1 -1
  84. package/dist/services/tunnelHelpers.js +9 -5
  85. package/dist/services/tunnelHelpers.js.map +1 -1
  86. package/dist/services/tunnelService.js +17 -0
  87. package/dist/services/tunnelService.js.map +1 -1
  88. package/dist/transport/wsClient.js +60 -38
  89. package/dist/transport/wsClient.js.map +1 -1
  90. package/dist/utils/json.js +7 -0
  91. package/dist/utils/json.js.map +1 -0
  92. package/dist/utils/localHost.js +17 -0
  93. package/dist/utils/localHost.js.map +1 -0
  94. package/dist/utils/safePath.js +51 -20
  95. package/dist/utils/safePath.js.map +1 -1
  96. package/package.json +62 -62
@@ -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, refreshes sessions, and restarts file watching
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(), workingDir: process.cwd() });
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;AAIjF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAQ1D,4GAA4G;AAC5G,MAAM,UAAU,mBAAmB,CAAC,IAAc,EAAE,MAAyB,OAAO,CAAC,GAAG;IACtF,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,IAAI,SAAS,CAAC;IAChG,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,cAAc;QACd,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,cAAc,KAAK,mBAAmB;KAC1E,CAAC;AACJ,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,sBAAsB,CAAC,MAMtC;IACC,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QAClH,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,cAAc,IAAI,oBAAoB,CAAC,EAAE,CAAC;QAClE,OAAO;YACL,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,GAAG,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACpE,IAAI,EAAE,eAAe,CAAC;gBACpB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,SAAS;gBAChC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,SAAS;gBAC/C,WAAW,EAAE,MAAM,CAAC,WAAW;aAChC,CAAC;SACH,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,mHAAmH;AACnH,MAAM,UAAU,mBAAmB,CAAC,MAQnC;IACC,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,KAAK;YACjB,WAAW,EAAE,WAAW,EAAE,WAAW;YACrC,UAAU,EAAE,WAAW,EAAE,UAAU;YACnC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxF,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAC3E,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC;AACJ,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 = cwd && path.isAbsolute(cwd) ? safePath(cwd) : process.cwd();
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 : fs.statSync(path.resolve(resolved, e.name)).size,
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(() => fs.readFileSync(safePath(filePath, cwd), 'utf-8'));
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
- const resolved = safePath(filePath, cwd);
43
- fs.writeFileSync(resolved, content, 'utf-8');
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 = safePath(targetPath, cwd);
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(safePath(targetPath, cwd), { recursive: true, force: false }));
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
- const projectRoot = cwd ? path.resolve(cwd) : process.cwd();
63
- const resolvedOld = safePath(oldPath, projectRoot);
64
- const resolvedNew = path.join(path.dirname(resolvedOld), newName);
65
- safePath(path.relative(projectRoot, resolvedNew), projectRoot);
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(() => copyRecursive(safePath(src, cwd), safePath(dest, cwd)));
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(() => fs.renameSync(safePath(src, cwd), safePath(dest, cwd)));
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
- while (stack.length > 0 && results.length < limit) {
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":"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"}
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
- const str = (value) => (typeof value === 'string' ? value : '');
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":"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"}
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
- env.ANTHROPIC_BASE_URL = await this.resolveClaudeBaseURL(model);
30
- env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
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 (env.ANTHROPIC_BASE_URL?.startsWith('http://127.0.0.1:'))
35
- env.ANTHROPIC_AUTH_TOKEN = 'default';
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; one adapter proxy per provider config
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 (/\/v1\/chat\/completions$/i.test(baseURL)) {
46
- const config = { baseURL, apiKey: model.apiKey ?? '', model: model.model };
47
- const key = JSON.stringify(config);
48
- let proxy = this.adapterProxies.get(key);
49
- if (!proxy) {
50
- proxy = new ClaudeAdapterProxy();
51
- this.adapterProxies.set(key, proxy);
52
- }
53
- return proxy.start(config);
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
- return baseURL;
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":"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"}
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; returns refreshed creds or null when revoked/deleted
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
- try {
45
- const res = await httpRequest('POST', `${SERVER_HTTP()}/api/cli/connect`, { body: { deviceToken: creds.deviceToken } });
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":"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"}
1
+ {"version":3,"file":"pairingService.js","sourceRoot":"","sources":["../../src/services/pairingService.ts"],"names":[],"mappings":"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"}