echo-cli-agent 0.1.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 (82) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -0
  3. package/dist/src/config.d.ts +33 -0
  4. package/dist/src/config.js +154 -0
  5. package/dist/src/config.js.map +1 -0
  6. package/dist/src/dispatch/dispatcher.d.ts +34 -0
  7. package/dist/src/dispatch/dispatcher.js +216 -0
  8. package/dist/src/dispatch/dispatcher.js.map +1 -0
  9. package/dist/src/health/server.d.ts +25 -0
  10. package/dist/src/health/server.js +122 -0
  11. package/dist/src/health/server.js.map +1 -0
  12. package/dist/src/index.d.ts +2 -0
  13. package/dist/src/index.js +82 -0
  14. package/dist/src/index.js.map +1 -0
  15. package/dist/src/logging/diagnostic-log.d.ts +15 -0
  16. package/dist/src/logging/diagnostic-log.js +92 -0
  17. package/dist/src/logging/diagnostic-log.js.map +1 -0
  18. package/dist/src/providers/claude.d.ts +2 -0
  19. package/dist/src/providers/claude.js +20 -0
  20. package/dist/src/providers/claude.js.map +1 -0
  21. package/dist/src/providers/codex.d.ts +2 -0
  22. package/dist/src/providers/codex.js +39 -0
  23. package/dist/src/providers/codex.js.map +1 -0
  24. package/dist/src/providers/kiro.d.ts +2 -0
  25. package/dist/src/providers/kiro.js +33 -0
  26. package/dist/src/providers/kiro.js.map +1 -0
  27. package/dist/src/providers/model-catalog.d.ts +16 -0
  28. package/dist/src/providers/model-catalog.js +156 -0
  29. package/dist/src/providers/model-catalog.js.map +1 -0
  30. package/dist/src/providers/provider.d.ts +32 -0
  31. package/dist/src/providers/provider.js +57 -0
  32. package/dist/src/providers/provider.js.map +1 -0
  33. package/dist/src/providers/registry.d.ts +9 -0
  34. package/dist/src/providers/registry.js +44 -0
  35. package/dist/src/providers/registry.js.map +1 -0
  36. package/dist/src/runtime/agent-runtime.d.ts +13 -0
  37. package/dist/src/runtime/agent-runtime.js +55 -0
  38. package/dist/src/runtime/agent-runtime.js.map +1 -0
  39. package/dist/src/runtime/cli/hydrate-shell-path.d.ts +33 -0
  40. package/dist/src/runtime/cli/hydrate-shell-path.js +173 -0
  41. package/dist/src/runtime/cli/hydrate-shell-path.js.map +1 -0
  42. package/dist/src/session/final-output.d.ts +1 -0
  43. package/dist/src/session/final-output.js +16 -0
  44. package/dist/src/session/final-output.js.map +1 -0
  45. package/dist/src/session/session-manager.d.ts +42 -0
  46. package/dist/src/session/session-manager.js +339 -0
  47. package/dist/src/session/session-manager.js.map +1 -0
  48. package/dist/src/shared/node-cli-command-resolution.d.ts +11 -0
  49. package/dist/src/shared/node-cli-command-resolution.js +163 -0
  50. package/dist/src/shared/node-cli-command-resolution.js.map +1 -0
  51. package/dist/src/state/state-store.d.ts +48 -0
  52. package/dist/src/state/state-store.js +125 -0
  53. package/dist/src/state/state-store.js.map +1 -0
  54. package/dist/src/transport/taskmcp-client.d.ts +29 -0
  55. package/dist/src/transport/taskmcp-client.js +115 -0
  56. package/dist/src/transport/taskmcp-client.js.map +1 -0
  57. package/dist/src/types/protocol.d.ts +98 -0
  58. package/dist/src/types/protocol.js +38 -0
  59. package/dist/src/types/protocol.js.map +1 -0
  60. package/dist/tests/dispatch-integration.test.d.ts +1 -0
  61. package/dist/tests/dispatch-integration.test.js +209 -0
  62. package/dist/tests/dispatch-integration.test.js.map +1 -0
  63. package/dist/tests/final-output.test.d.ts +1 -0
  64. package/dist/tests/final-output.test.js +9 -0
  65. package/dist/tests/final-output.test.js.map +1 -0
  66. package/dist/tests/health-server.test.d.ts +1 -0
  67. package/dist/tests/health-server.test.js +38 -0
  68. package/dist/tests/health-server.test.js.map +1 -0
  69. package/dist/tests/model-catalog.test.d.ts +1 -0
  70. package/dist/tests/model-catalog.test.js +59 -0
  71. package/dist/tests/model-catalog.test.js.map +1 -0
  72. package/dist/tests/providers.test.d.ts +1 -0
  73. package/dist/tests/providers.test.js +95 -0
  74. package/dist/tests/providers.test.js.map +1 -0
  75. package/dist/tests/state-store.test.d.ts +1 -0
  76. package/dist/tests/state-store.test.js +22 -0
  77. package/dist/tests/state-store.test.js.map +1 -0
  78. package/dist/vitest.config.d.ts +2 -0
  79. package/dist/vitest.config.js +11 -0
  80. package/dist/vitest.config.js.map +1 -0
  81. package/package.json +42 -0
  82. package/scripts/service.mjs +158 -0
@@ -0,0 +1,339 @@
1
+ import { chmod, realpath } from 'node:fs/promises';
2
+ import { createRequire } from 'node:module';
3
+ import { dirname, isAbsolute, join, relative, resolve } from 'node:path';
4
+ import { randomUUID } from 'node:crypto';
5
+ import * as pty from 'node-pty';
6
+ import { resolveProvider } from '../providers/registry.js';
7
+ const require = createRequire(import.meta.url);
8
+ export class SessionManager {
9
+ config;
10
+ state;
11
+ logger;
12
+ sessions = new Map();
13
+ constructor(config, state, logger) {
14
+ this.config = config;
15
+ this.state = state;
16
+ this.logger = logger;
17
+ }
18
+ get activeCount() {
19
+ return this.sessions.size;
20
+ }
21
+ /**
22
+ * Register a named local window before its first prompt. The server task id is
23
+ * the only routing key; a provider-native session id remains optional.
24
+ */
25
+ async createWindow(request) {
26
+ const provider = resolveProvider(request.agent_type);
27
+ if (this.config.capabilities.length > 0 && !this.config.capabilities.includes(provider.id)) {
28
+ throw new Error(`CLI 不可用:api_user 未检测到 ${provider.id} CLI`);
29
+ }
30
+ const workdir = await this.validateWorkdir(request.workdir ?? this.config.allowedRoots[0]);
31
+ const existing = this.state.getCliWindow(request.task_id, provider.id);
32
+ const window = {
33
+ taskId: request.task_id,
34
+ agentType: provider.id,
35
+ name: request.window_name?.trim() || existing?.name || `${provider.id} window`,
36
+ sessionId: existing?.sessionId ?? randomUUID(),
37
+ workdir,
38
+ updatedAt: new Date().toISOString()
39
+ };
40
+ await this.state.upsertCliWindow(window);
41
+ this.logger.info('cli-window-created', {
42
+ taskId: window.taskId,
43
+ agentType: window.agentType,
44
+ sessionId: window.sessionId
45
+ });
46
+ return window;
47
+ }
48
+ listWindows(agentType) {
49
+ return this.state.listCliWindows(agentType);
50
+ }
51
+ async deliver(request, hooks) {
52
+ const sessionKey = `${request.task_id}:${request.agent_type.toLowerCase()}`;
53
+ const provider = resolveProvider(request.agent_type);
54
+ if (this.config.capabilities.length > 0 && !this.config.capabilities.includes(provider.id)) {
55
+ throw new Error(`CLI 不可用:api_user 未检测到 ${provider.id} CLI`);
56
+ }
57
+ const providerSessionId = request.session_id?.trim();
58
+ if (!providerSessionId) {
59
+ throw new Error('派发缺少原生会话标识,已拒绝发送以避免新建会话');
60
+ }
61
+ const existing = this.sessions.get(sessionKey);
62
+ if (existing && provider.reuseSession !== false) {
63
+ if (existing.sessionId !== providerSessionId) {
64
+ throw new Error('本地活动会话与指定原生会话不一致,已拒绝发送');
65
+ }
66
+ await hooks.onSessionInitialized(existing.sessionId, false);
67
+ await this.writePrompt(existing, request.prompt ?? '');
68
+ return {
69
+ runId: request.run_id,
70
+ sessionId: existing.sessionId,
71
+ sessionKey,
72
+ created: false,
73
+ duplicate: false
74
+ };
75
+ }
76
+ const savedWindow = this.state.getCliWindow(request.task_id, provider.id);
77
+ const workdir = await this.validateWorkdir(request.workdir ?? savedWindow?.workdir ?? this.config.allowedRoots[0]);
78
+ // Only the control-plane session id is authoritative. Local state may be
79
+ // stale after an app restart and must never silently create another chat.
80
+ const plan = provider.buildLaunchPlan(request, {
81
+ allowExecutableOverride: this.config.allowExecutableOverride
82
+ });
83
+ const sessionId = providerSessionId;
84
+ let terminal;
85
+ try {
86
+ await this.ensurePtyHelperExecutable();
87
+ terminal = pty.spawn(plan.executable, plan.args, {
88
+ name: 'xterm-256color',
89
+ cols: 120,
90
+ rows: 36,
91
+ cwd: workdir,
92
+ env: plan.env
93
+ });
94
+ }
95
+ catch (error) {
96
+ throw new Error(`unable to start ${provider.id}: ${this.errorMessage(error)}`);
97
+ }
98
+ // Kiro may show its trust confirmation after the first terminal output. Keep
99
+ // the first user prompt queued until that confirmation has been handled;
100
+ // otherwise the TUI consumes the prompt as confirmation-screen input.
101
+ const trustApproval = plan.autoApproveTrustPrompt
102
+ ? this.autoApproveTrustPrompt(terminal, request.run_id)
103
+ : Promise.resolve();
104
+ const ready = this.waitForStartupOutput(terminal);
105
+ const managed = {
106
+ sessionKey,
107
+ sessionId,
108
+ runId: request.run_id,
109
+ process: terminal,
110
+ ready,
111
+ output: '',
112
+ startedAt: Date.now(),
113
+ cancelRequested: false
114
+ };
115
+ this.sessions.set(sessionKey, managed);
116
+ let discoveredProviderSessionId = providerSessionId;
117
+ terminal.onData((output) => {
118
+ managed.output = `${managed.output}${output}`.slice(-128 * 1024);
119
+ const discovered = provider.extractSessionId(output);
120
+ if (discovered && discovered !== discoveredProviderSessionId) {
121
+ discoveredProviderSessionId = discovered;
122
+ void this.state.upsertSession({
123
+ sessionKey,
124
+ sessionId,
125
+ agentType: provider.id,
126
+ workdir,
127
+ providerSessionId: discovered,
128
+ updatedAt: new Date().toISOString()
129
+ }).catch(() => undefined);
130
+ const namedWindow = this.state.getCliWindow(request.task_id, provider.id);
131
+ if (namedWindow) {
132
+ void this.state.upsertCliWindow({
133
+ ...namedWindow,
134
+ providerSessionId: discovered,
135
+ updatedAt: new Date().toISOString()
136
+ }).catch(() => undefined);
137
+ }
138
+ }
139
+ const markers = this.outputMarkers(output);
140
+ if (markers.length > 0) {
141
+ this.logger.info('cli-output-marker', {
142
+ runId: request.run_id,
143
+ sessionId,
144
+ markers,
145
+ bytes: output.length
146
+ });
147
+ }
148
+ });
149
+ terminal.onExit(({ exitCode, signal }) => {
150
+ if (this.sessions.get(sessionKey)?.process === terminal)
151
+ this.sessions.delete(sessionKey);
152
+ const finalText = exitCode !== 0 ? failureSummary(managed.output) : undefined;
153
+ // Keep the provider session metadata after the PTY exits. Orca-style
154
+ // windows are durable logical sessions; Codex/Claude can resume from the
155
+ // provider-native id on the next prompt instead of starting over.
156
+ this.logger.info('cli-session-exited', {
157
+ runId: request.run_id,
158
+ agentType: provider.id,
159
+ sessionKey,
160
+ sessionId,
161
+ exitCode,
162
+ signal
163
+ });
164
+ void hooks.onProcessExited(discoveredProviderSessionId ?? sessionId, {
165
+ exitCode,
166
+ ...(signal ? { signal } : {}),
167
+ cancelled: managed.cancelRequested,
168
+ ...(finalText ? { finalText } : {}),
169
+ durationMs: Date.now() - managed.startedAt
170
+ }).catch((error) => {
171
+ this.logger.warn('cli-process-exit-report-failed', {
172
+ runId: request.run_id,
173
+ error: this.errorMessage(error)
174
+ });
175
+ });
176
+ });
177
+ await this.state.upsertSession({
178
+ sessionKey,
179
+ sessionId,
180
+ agentType: provider.id,
181
+ workdir,
182
+ ...(providerSessionId ? { providerSessionId } : {}),
183
+ updatedAt: new Date().toISOString()
184
+ });
185
+ await hooks.onProcessStarted(sessionId, terminal.pid);
186
+ await hooks.onSessionInitialized(sessionId, true);
187
+ await trustApproval;
188
+ if (plan.promptDelivery !== 'startup') {
189
+ await this.writePrompt(managed, request.prompt ?? '');
190
+ }
191
+ this.logger.info('prompt-delivered', { sessionKey, sessionId, runId: request.run_id });
192
+ return {
193
+ runId: request.run_id,
194
+ sessionId,
195
+ sessionKey,
196
+ created: true,
197
+ duplicate: false
198
+ };
199
+ }
200
+ dispose() {
201
+ for (const session of this.sessions.values()) {
202
+ try {
203
+ session.process.kill();
204
+ }
205
+ catch {
206
+ // The child may already have exited.
207
+ }
208
+ }
209
+ this.sessions.clear();
210
+ }
211
+ /** Stop the PTY that owns the requested remote run. */
212
+ cancelRun(runId) {
213
+ const session = [...this.sessions.values()].find((item) => item.runId === runId);
214
+ if (!session)
215
+ return false;
216
+ session.cancelRequested = true;
217
+ try {
218
+ session.process.kill();
219
+ this.logger.info('cli-run-cancel-requested', { runId, sessionId: session.sessionId });
220
+ return true;
221
+ }
222
+ catch (error) {
223
+ this.logger.warn('cli-run-cancel-failed', { runId, error: this.errorMessage(error) });
224
+ return false;
225
+ }
226
+ }
227
+ async writePrompt(session, prompt) {
228
+ await session.ready;
229
+ const safePrompt = prompt.replaceAll('\u0000', '').replaceAll('\u001b', '');
230
+ session.process.write(`\u001b[200~${safePrompt}\u001b[201~\r`);
231
+ }
232
+ waitForStartupOutput(terminal) {
233
+ return new Promise((resolveReady) => {
234
+ let settled = false;
235
+ const finish = () => {
236
+ if (settled)
237
+ return;
238
+ settled = true;
239
+ clearTimeout(timer);
240
+ disposable.dispose();
241
+ resolveReady();
242
+ };
243
+ const disposable = terminal.onData(() => finish());
244
+ const timer = setTimeout(finish, 2_000);
245
+ });
246
+ }
247
+ autoApproveTrustPrompt(terminal, runId) {
248
+ let buffer = '';
249
+ let disposable;
250
+ let exitDisposable;
251
+ let timer;
252
+ let settled = false;
253
+ return new Promise((resolveApproval) => {
254
+ const finish = () => {
255
+ if (settled)
256
+ return;
257
+ settled = true;
258
+ if (timer)
259
+ clearTimeout(timer);
260
+ disposable?.dispose();
261
+ exitDisposable?.dispose();
262
+ resolveApproval();
263
+ };
264
+ disposable = terminal.onData((output) => {
265
+ buffer = `${buffer}${output}`.replace(/\u001b\[[0-?]*[ -/]*[@-~]/g, '').slice(-512);
266
+ if (!buffer.includes('Warning: Kiro is running in trust all tools mode'))
267
+ return;
268
+ // Kiro's TUI processes navigation on a render cycle. Writing the down
269
+ // key and Enter together can select its default "No, exit" action.
270
+ terminal.write('\u001b[B');
271
+ setTimeout(() => {
272
+ if (settled)
273
+ return;
274
+ terminal.write('\r');
275
+ this.logger.info('cli-trust-prompt-approved', { runId });
276
+ finish();
277
+ }, 150);
278
+ });
279
+ exitDisposable = terminal.onExit(finish);
280
+ // Older Kiro versions do not show the warning when permissions.yaml has
281
+ // already granted trust. Do not block those sessions indefinitely.
282
+ timer = setTimeout(() => {
283
+ this.logger.debug('cli-trust-prompt-not-seen', { runId });
284
+ finish();
285
+ }, 5_000);
286
+ });
287
+ }
288
+ outputMarkers(output) {
289
+ const plain = output.replace(/\u001b\[[0-?]*[ -/]*[@-~]/g, '').toLowerCase();
290
+ const markers = [];
291
+ if (plain.includes('requires approval') || plain.includes('permission'))
292
+ markers.push('approval');
293
+ if (plain.includes('echo_report_task_progress'))
294
+ markers.push('echo-report');
295
+ if (plain.includes('error') || plain.includes('failed'))
296
+ markers.push('error');
297
+ return markers;
298
+ }
299
+ async validateWorkdir(input) {
300
+ if (!input)
301
+ throw new Error('no allowed work directory configured');
302
+ const candidate = await realpath(isAbsolute(input) ? input : resolve(input));
303
+ for (const root of this.config.allowedRoots) {
304
+ const allowed = await realpath(root).catch(() => resolve(root));
305
+ const segment = relative(allowed, candidate);
306
+ if (segment === '' || (!segment.startsWith('..') && !isAbsolute(segment)))
307
+ return candidate;
308
+ }
309
+ throw new Error('requested work directory is outside TASKMCP_ALLOWED_ROOTS');
310
+ }
311
+ async ensurePtyHelperExecutable() {
312
+ if (process.platform !== 'darwin')
313
+ return;
314
+ const packageRoot = dirname(require.resolve('node-pty/package.json'));
315
+ const helperPath = join(packageRoot, 'prebuilds', `darwin-${process.arch}`, 'spawn-helper');
316
+ await chmod(helperPath, 0o755);
317
+ }
318
+ errorMessage(error) {
319
+ return error instanceof Error ? error.message : String(error);
320
+ }
321
+ }
322
+ const ANSI_ESCAPE = /\u001b\[[0-?]*[ -/]*[@-~]/g;
323
+ const SENSITIVE_VALUE = /\b(?:sk|rk|pk|ghp|github_pat)_[A-Za-z0-9._-]+\b|\bBearer\s+[^\s]+|\b(?:api[_-]?key|token|authorization|x-mcp-token)\s*[:=]\s*[^\s]+/gi;
324
+ const FAILURE_LINE = /\b(?:error|failed|failure|fatal|forbidden|unauthorized|denied|invalid|unable|not found)\b|失败|错误|额度|拒绝|无权限|未授权/i;
325
+ const MAX_FAILURE_SUMMARY_LENGTH = 500;
326
+ function failureSummary(output) {
327
+ const cleaned = output
328
+ .replace(ANSI_ESCAPE, '')
329
+ .replace(/\r/g, '\n')
330
+ .replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g, '')
331
+ .replace(SENSITIVE_VALUE, '[redacted]');
332
+ const matchingLines = cleaned
333
+ .split('\n')
334
+ .map((line) => line.trim().replace(/\s+/g, ' '))
335
+ .filter((line) => line.length > 0 && FAILURE_LINE.test(line));
336
+ const detail = matchingLines.at(-1);
337
+ return detail ? detail.slice(-MAX_FAILURE_SUMMARY_LENGTH) : undefined;
338
+ }
339
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ type ResolveCommandOptions = {
2
+ pathEnv?: string | null;
3
+ platform?: NodeJS.Platform;
4
+ homePath?: string;
5
+ };
6
+ export declare function resolveCliCommand(commandName: string, options?: ResolveCommandOptions): string;
7
+ export declare function resolveCliCommands(commandNames: readonly string[], options?: ResolveCommandOptions): Map<string, string>;
8
+ export declare function resolveCodexCommand(options?: ResolveCommandOptions): string;
9
+ export declare function resolveClaudeCommand(options?: ResolveCommandOptions): string;
10
+ export declare function getVersionManagerBinPaths(options?: ResolveCommandOptions): string[];
11
+ export {};
@@ -0,0 +1,163 @@
1
+ import { accessSync, constants, existsSync, readdirSync, statSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { delimiter, dirname, join } from 'node:path';
4
+ function getExecutableNames(platform, commandName) {
5
+ if (platform === 'win32') {
6
+ return [`${commandName}.cmd`, `${commandName}.exe`, `${commandName}.bat`, commandName];
7
+ }
8
+ return [commandName];
9
+ }
10
+ function splitPath(pathEnv) {
11
+ if (!pathEnv) {
12
+ return [];
13
+ }
14
+ return pathEnv
15
+ .split(delimiter)
16
+ .map((entry) => entry.trim())
17
+ .filter(Boolean);
18
+ }
19
+ function parseVersionSegment(raw) {
20
+ return raw
21
+ .replace(/^v/i, '')
22
+ .split('.')
23
+ .map((segment) => Number.parseInt(segment, 10))
24
+ .map((segment) => (Number.isFinite(segment) ? segment : 0));
25
+ }
26
+ function compareVersionDesc(left, right) {
27
+ const leftParts = parseVersionSegment(left);
28
+ const rightParts = parseVersionSegment(right);
29
+ const length = Math.max(leftParts.length, rightParts.length);
30
+ for (let index = 0; index < length; index += 1) {
31
+ const delta = (rightParts[index] ?? 0) - (leftParts[index] ?? 0);
32
+ if (delta !== 0) {
33
+ return delta;
34
+ }
35
+ }
36
+ return right.localeCompare(left);
37
+ }
38
+ function findFirstExecutable(platform, directories, executableNames) {
39
+ for (const directory of directories) {
40
+ for (const executableName of executableNames) {
41
+ const candidate = join(directory, executableName);
42
+ if (isRunnableCommand(platform, candidate)) {
43
+ return candidate;
44
+ }
45
+ }
46
+ }
47
+ return null;
48
+ }
49
+ function isRunnableCommand(platform, candidate) {
50
+ try {
51
+ const stats = statSync(candidate);
52
+ if (!stats.isFile()) {
53
+ return false;
54
+ }
55
+ if (platform === 'win32') {
56
+ return true;
57
+ }
58
+ // Why: GUI fallback probing should skip placeholders/directories so spawn
59
+ // can continue to a runnable CLI instead of failing later with EACCES/EISDIR.
60
+ accessSync(candidate, constants.X_OK);
61
+ return true;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ function getBaseVersionManagerDirectories(platform, homePath) {
68
+ const directories = [
69
+ join(homePath, '.volta', 'bin'),
70
+ join(homePath, '.asdf', 'shims'),
71
+ join(homePath, '.fnm', 'aliases', 'default', 'bin'),
72
+ // Why: mise (formerly rtx) exposes managed tool binaries via a shims
73
+ // directory, similar to asdf.
74
+ join(homePath, '.local', 'share', 'mise', 'shims')
75
+ ];
76
+ if (platform === 'win32') {
77
+ // Why: Anthropic's native Windows installer places claude.exe here, and
78
+ // GUI-launched Orca may not inherit the user's PATH entry for it.
79
+ directories.push(join(homePath, '.local', 'bin'));
80
+ directories.push(join(homePath, 'AppData', 'Roaming', 'npm'));
81
+ directories.push(join(homePath, 'AppData', 'Local', 'pnpm'));
82
+ directories.push(join(homePath, 'AppData', 'Local', 'Yarn', 'bin'));
83
+ }
84
+ else {
85
+ directories.push(join(homePath, '.local', 'bin'));
86
+ // Why: pnpm uses platform-specific global bin directories that differ from
87
+ // npm's ~/.local/bin.
88
+ if (platform === 'darwin') {
89
+ directories.push(join(homePath, 'Library', 'pnpm'));
90
+ }
91
+ else {
92
+ directories.push(join(homePath, '.local', 'share', 'pnpm'));
93
+ }
94
+ directories.push(join(homePath, '.yarn', 'bin'));
95
+ }
96
+ directories.push(join(homePath, '.bun', 'bin'));
97
+ return directories;
98
+ }
99
+ function getNvmVersionDirectories(homePath) {
100
+ const nvmVersionsDir = join(homePath, '.nvm', 'versions', 'node');
101
+ if (!existsSync(nvmVersionsDir)) {
102
+ return [];
103
+ }
104
+ return readdirSync(nvmVersionsDir, { withFileTypes: true })
105
+ .filter((entry) => entry.isDirectory())
106
+ .map((entry) => entry.name)
107
+ .sort(compareVersionDesc)
108
+ .map((entry) => join(nvmVersionsDir, entry, 'bin'));
109
+ }
110
+ function getVersionManagerDirectories(platform, homePath, executableNames) {
111
+ const directories = getBaseVersionManagerDirectories(platform, homePath);
112
+ const firstNvmMatch = findFirstExecutable(platform, getNvmVersionDirectories(homePath), executableNames);
113
+ if (firstNvmMatch) {
114
+ directories.unshift(dirname(firstNvmMatch));
115
+ }
116
+ return directories;
117
+ }
118
+ export function resolveCliCommand(commandName, options = {}) {
119
+ const platform = options.platform ?? process.platform;
120
+ const executableNames = getExecutableNames(platform, commandName);
121
+ const pathEnv = options.pathEnv ?? process.env.PATH ?? process.env.Path ?? null;
122
+ const pathCandidate = findFirstExecutable(platform, splitPath(pathEnv), executableNames);
123
+ if (pathCandidate) {
124
+ return pathCandidate;
125
+ }
126
+ const homePath = options.homePath ?? homedir();
127
+ const nvmCandidate = findFirstExecutable(platform, getNvmVersionDirectories(homePath), executableNames);
128
+ const versionManagerCandidate = nvmCandidate ??
129
+ findFirstExecutable(platform, getBaseVersionManagerDirectories(platform, homePath), executableNames);
130
+ return versionManagerCandidate ?? commandName;
131
+ }
132
+ export function resolveCliCommands(commandNames, options = {}) {
133
+ const platform = options.platform ?? process.platform;
134
+ const pathEnv = options.pathEnv ?? process.env.PATH ?? process.env.Path ?? null;
135
+ const pathDirectories = splitPath(pathEnv);
136
+ const homePath = options.homePath ?? homedir();
137
+ const installDirectories = [
138
+ ...getNvmVersionDirectories(homePath),
139
+ ...getBaseVersionManagerDirectories(platform, homePath)
140
+ ];
141
+ const resolved = new Map();
142
+ for (const commandName of new Set(commandNames)) {
143
+ const executableNames = getExecutableNames(platform, commandName);
144
+ const pathCandidate = findFirstExecutable(platform, pathDirectories, executableNames);
145
+ const installCandidate = pathCandidate ?? findFirstExecutable(platform, installDirectories, executableNames);
146
+ resolved.set(commandName, installCandidate ?? commandName);
147
+ }
148
+ return resolved;
149
+ }
150
+ export function resolveCodexCommand(options = {}) {
151
+ return resolveCliCommand('codex', options);
152
+ }
153
+ export function resolveClaudeCommand(options = {}) {
154
+ return resolveCliCommand('claude', options);
155
+ }
156
+ // Why: Node-script CLIs need their version-manager sibling `node` on PATH.
157
+ export function getVersionManagerBinPaths(options = {}) {
158
+ const platform = options.platform ?? process.platform;
159
+ const homePath = options.homePath ?? homedir();
160
+ const nodeNames = getExecutableNames(platform, 'node');
161
+ return getVersionManagerDirectories(platform, homePath, nodeNames);
162
+ }
163
+ //# sourceMappingURL=node-cli-command-resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-cli-command-resolution.js","sourceRoot":"","sources":["../../../src/shared/node-cli-command-resolution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export type RunStatus = 'received' | 'delivered' | 'completed' | 'failed';
2
+ export type RunRecord = {
3
+ runId: string;
4
+ status: RunStatus;
5
+ sessionId?: string;
6
+ updatedAt: string;
7
+ };
8
+ export type SessionRecord = {
9
+ sessionKey: string;
10
+ sessionId: string;
11
+ agentType: string;
12
+ workdir: string;
13
+ providerSessionId?: string;
14
+ updatedAt: string;
15
+ };
16
+ /** A named remote window. taskId is the cross-device routing identity. */
17
+ export type CliWindowRecord = {
18
+ taskId: string;
19
+ agentType: string;
20
+ name: string;
21
+ sessionId: string;
22
+ providerSessionId?: string;
23
+ workdir: string;
24
+ updatedAt: string;
25
+ };
26
+ export declare class StateStore {
27
+ private readonly filePath;
28
+ private state?;
29
+ private writeChain;
30
+ constructor(filePath: string);
31
+ initialize(): Promise<void>;
32
+ getRun(runId: string): RunRecord | undefined;
33
+ markRun(runId: string, status: RunStatus, sessionId?: string): Promise<void>;
34
+ getSession(sessionKey: string): SessionRecord | undefined;
35
+ upsertSession(record: SessionRecord): Promise<void>;
36
+ removeSession(sessionKey: string): Promise<void>;
37
+ getCliWindow(taskId: string, agentType: string): CliWindowRecord | undefined;
38
+ upsertCliWindow(record: CliWindowRecord): Promise<void>;
39
+ listCliWindows(agentType?: string): CliWindowRecord[];
40
+ snapshot(): {
41
+ runs: number;
42
+ sessions: number;
43
+ };
44
+ recentRuns(limit?: number): RunRecord[];
45
+ private requireState;
46
+ private cliWindowKey;
47
+ private persist;
48
+ }