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.
- package/LICENSE +21 -0
- package/README.md +38 -0
- package/dist/src/config.d.ts +33 -0
- package/dist/src/config.js +154 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/dispatch/dispatcher.d.ts +34 -0
- package/dist/src/dispatch/dispatcher.js +216 -0
- package/dist/src/dispatch/dispatcher.js.map +1 -0
- package/dist/src/health/server.d.ts +25 -0
- package/dist/src/health/server.js +122 -0
- package/dist/src/health/server.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +82 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/logging/diagnostic-log.d.ts +15 -0
- package/dist/src/logging/diagnostic-log.js +92 -0
- package/dist/src/logging/diagnostic-log.js.map +1 -0
- package/dist/src/providers/claude.d.ts +2 -0
- package/dist/src/providers/claude.js +20 -0
- package/dist/src/providers/claude.js.map +1 -0
- package/dist/src/providers/codex.d.ts +2 -0
- package/dist/src/providers/codex.js +39 -0
- package/dist/src/providers/codex.js.map +1 -0
- package/dist/src/providers/kiro.d.ts +2 -0
- package/dist/src/providers/kiro.js +33 -0
- package/dist/src/providers/kiro.js.map +1 -0
- package/dist/src/providers/model-catalog.d.ts +16 -0
- package/dist/src/providers/model-catalog.js +156 -0
- package/dist/src/providers/model-catalog.js.map +1 -0
- package/dist/src/providers/provider.d.ts +32 -0
- package/dist/src/providers/provider.js +57 -0
- package/dist/src/providers/provider.js.map +1 -0
- package/dist/src/providers/registry.d.ts +9 -0
- package/dist/src/providers/registry.js +44 -0
- package/dist/src/providers/registry.js.map +1 -0
- package/dist/src/runtime/agent-runtime.d.ts +13 -0
- package/dist/src/runtime/agent-runtime.js +55 -0
- package/dist/src/runtime/agent-runtime.js.map +1 -0
- package/dist/src/runtime/cli/hydrate-shell-path.d.ts +33 -0
- package/dist/src/runtime/cli/hydrate-shell-path.js +173 -0
- package/dist/src/runtime/cli/hydrate-shell-path.js.map +1 -0
- package/dist/src/session/final-output.d.ts +1 -0
- package/dist/src/session/final-output.js +16 -0
- package/dist/src/session/final-output.js.map +1 -0
- package/dist/src/session/session-manager.d.ts +42 -0
- package/dist/src/session/session-manager.js +339 -0
- package/dist/src/session/session-manager.js.map +1 -0
- package/dist/src/shared/node-cli-command-resolution.d.ts +11 -0
- package/dist/src/shared/node-cli-command-resolution.js +163 -0
- package/dist/src/shared/node-cli-command-resolution.js.map +1 -0
- package/dist/src/state/state-store.d.ts +48 -0
- package/dist/src/state/state-store.js +125 -0
- package/dist/src/state/state-store.js.map +1 -0
- package/dist/src/transport/taskmcp-client.d.ts +29 -0
- package/dist/src/transport/taskmcp-client.js +115 -0
- package/dist/src/transport/taskmcp-client.js.map +1 -0
- package/dist/src/types/protocol.d.ts +98 -0
- package/dist/src/types/protocol.js +38 -0
- package/dist/src/types/protocol.js.map +1 -0
- package/dist/tests/dispatch-integration.test.d.ts +1 -0
- package/dist/tests/dispatch-integration.test.js +209 -0
- package/dist/tests/dispatch-integration.test.js.map +1 -0
- package/dist/tests/final-output.test.d.ts +1 -0
- package/dist/tests/final-output.test.js +9 -0
- package/dist/tests/final-output.test.js.map +1 -0
- package/dist/tests/health-server.test.d.ts +1 -0
- package/dist/tests/health-server.test.js +38 -0
- package/dist/tests/health-server.test.js.map +1 -0
- package/dist/tests/model-catalog.test.d.ts +1 -0
- package/dist/tests/model-catalog.test.js +59 -0
- package/dist/tests/model-catalog.test.js.map +1 -0
- package/dist/tests/providers.test.d.ts +1 -0
- package/dist/tests/providers.test.js +95 -0
- package/dist/tests/providers.test.js.map +1 -0
- package/dist/tests/state-store.test.d.ts +1 -0
- package/dist/tests/state-store.test.js +22 -0
- package/dist/tests/state-store.test.js.map +1 -0
- package/dist/vitest.config.d.ts +2 -0
- package/dist/vitest.config.js +11 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +42 -0
- package/scripts/service.mjs +158 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-catalog.js","sourceRoot":"","sources":["../../../src/providers/model-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AgentCliRequest } from '../types/protocol.js';
|
|
2
|
+
export type LaunchPlan = {
|
|
3
|
+
executable: string;
|
|
4
|
+
args: string[];
|
|
5
|
+
env: NodeJS.ProcessEnv;
|
|
6
|
+
promptDelivery?: 'pty' | 'startup';
|
|
7
|
+
reuseSession?: boolean;
|
|
8
|
+
autoApproveTrustPrompt?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export type ProviderContext = {
|
|
11
|
+
allowExecutableOverride: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type ResolvedExecutable = {
|
|
14
|
+
executable: string;
|
|
15
|
+
args: string[];
|
|
16
|
+
};
|
|
17
|
+
export interface AgentProvider {
|
|
18
|
+
readonly id: string;
|
|
19
|
+
buildLaunchPlan(request: AgentCliRequest, context: ProviderContext): LaunchPlan;
|
|
20
|
+
versionArguments(): string[];
|
|
21
|
+
extractSessionId(output: string): string | undefined;
|
|
22
|
+
reuseSession?: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Provider CLIs can emit ANSI-decorated status lines. The value is consumed only
|
|
26
|
+
* in memory to resume a later process; terminal text is never persisted.
|
|
27
|
+
*/
|
|
28
|
+
export declare function extractNamedSessionId(output: string): string | undefined;
|
|
29
|
+
export declare function normalizeArguments(value: string | string[] | undefined): string[];
|
|
30
|
+
export declare function selectExecutable(fallback: string, requested: string | undefined, allowOverride: boolean): string;
|
|
31
|
+
export declare function providerEnvironment(request: AgentCliRequest): NodeJS.ProcessEnv;
|
|
32
|
+
export declare function resolveCodexExecutable(args: string[], environment: NodeJS.ProcessEnv): ResolvedExecutable;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { realpathSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { delimiter, dirname, join } from 'node:path';
|
|
4
|
+
import { getVersionManagerBinPaths, resolveCliCommand } from '../shared/node-cli-command-resolution.js';
|
|
5
|
+
/**
|
|
6
|
+
* Provider CLIs can emit ANSI-decorated status lines. The value is consumed only
|
|
7
|
+
* in memory to resume a later process; terminal text is never persisted.
|
|
8
|
+
*/
|
|
9
|
+
export function extractNamedSessionId(output) {
|
|
10
|
+
const plain = output.replace(/\u001b\[[0-?]*[ -/]*[@-~]/g, '');
|
|
11
|
+
const match = plain.match(/(?:session(?:[ _-]?id)?|conversation(?:[ _-]?id)?)\s*[:=]\s*([A-Za-z0-9][A-Za-z0-9._:-]{7,511})/i);
|
|
12
|
+
return match?.[1];
|
|
13
|
+
}
|
|
14
|
+
export function normalizeArguments(value) {
|
|
15
|
+
if (!value)
|
|
16
|
+
return [];
|
|
17
|
+
if (Array.isArray(value))
|
|
18
|
+
return value.filter(Boolean);
|
|
19
|
+
const matches = value.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g) ?? [];
|
|
20
|
+
return matches.map((item) => item.replace(/^(?:"(.*)"|'(.*)')$/, '$1$2'));
|
|
21
|
+
}
|
|
22
|
+
export function selectExecutable(fallback, requested, allowOverride) {
|
|
23
|
+
return allowOverride && requested?.trim() ? requested.trim() : fallback;
|
|
24
|
+
}
|
|
25
|
+
export function providerEnvironment(request) {
|
|
26
|
+
const env = { ...process.env };
|
|
27
|
+
const commandPaths = [
|
|
28
|
+
dirname(process.execPath),
|
|
29
|
+
...getVersionManagerBinPaths(env.PATH === undefined ? {} : { pathEnv: env.PATH }),
|
|
30
|
+
env.PATH,
|
|
31
|
+
'/opt/homebrew/bin',
|
|
32
|
+
'/usr/local/bin',
|
|
33
|
+
join(homedir(), '.local', 'bin')
|
|
34
|
+
].filter((value) => Boolean(value));
|
|
35
|
+
env.PATH = [...new Set(commandPaths)].join(delimiter);
|
|
36
|
+
if (request.config.base_url) {
|
|
37
|
+
env.ANTHROPIC_BASE_URL = request.config.base_url;
|
|
38
|
+
env.OPENAI_BASE_URL = request.config.base_url;
|
|
39
|
+
}
|
|
40
|
+
return env;
|
|
41
|
+
}
|
|
42
|
+
export function resolveCodexExecutable(args, environment) {
|
|
43
|
+
const configured = process.env.ECHO_AGENT_CODEX_PATH?.trim();
|
|
44
|
+
const candidate = configured || resolveCliCommand('codex', environment.PATH === undefined ? {} : { pathEnv: environment.PATH });
|
|
45
|
+
if (!candidate)
|
|
46
|
+
return { executable: 'codex', args };
|
|
47
|
+
try {
|
|
48
|
+
const resolved = realpathSync(candidate);
|
|
49
|
+
if (resolved.endsWith('.js'))
|
|
50
|
+
return { executable: process.env.ECHO_AGENT_NODE_PATH || process.execPath, args: [resolved, ...args] };
|
|
51
|
+
return { executable: resolved, args };
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return { executable: candidate, args };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AgentProvider } from './provider.js';
|
|
2
|
+
export declare function resolveProvider(agentType: string): AgentProvider;
|
|
3
|
+
export declare function probeProviders(): Array<{
|
|
4
|
+
id: string;
|
|
5
|
+
available: boolean;
|
|
6
|
+
path?: string;
|
|
7
|
+
version?: string;
|
|
8
|
+
detail: string;
|
|
9
|
+
}>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { claudeProvider } from './claude.js';
|
|
3
|
+
import { codexProvider } from './codex.js';
|
|
4
|
+
import { kiroProvider } from './kiro.js';
|
|
5
|
+
import { resolveCliCommand } from '../shared/node-cli-command-resolution.js';
|
|
6
|
+
const providers = new Map([
|
|
7
|
+
['claude', claudeProvider],
|
|
8
|
+
['claude-code', claudeProvider],
|
|
9
|
+
['codex', codexProvider],
|
|
10
|
+
['kiro', kiroProvider]
|
|
11
|
+
]);
|
|
12
|
+
export function resolveProvider(agentType) {
|
|
13
|
+
const provider = providers.get(agentType.toLowerCase());
|
|
14
|
+
if (!provider)
|
|
15
|
+
throw new Error(`unsupported agent type: ${agentType}`);
|
|
16
|
+
return provider;
|
|
17
|
+
}
|
|
18
|
+
export function probeProviders() {
|
|
19
|
+
return [claudeProvider, codexProvider, kiroProvider].map((provider) => {
|
|
20
|
+
const executableName = provider.id === 'claude'
|
|
21
|
+
? 'claude'
|
|
22
|
+
: provider.id === 'codex'
|
|
23
|
+
? 'codex'
|
|
24
|
+
: 'kiro-cli';
|
|
25
|
+
const executable = resolveCliCommand(executableName);
|
|
26
|
+
const result = spawnSync(executable, provider.versionArguments(), {
|
|
27
|
+
encoding: 'utf8',
|
|
28
|
+
timeout: 5_000,
|
|
29
|
+
shell: false
|
|
30
|
+
});
|
|
31
|
+
const detail = result.error
|
|
32
|
+
? result.error.message
|
|
33
|
+
: (result.stdout || result.stderr || `exit ${result.status ?? 'unknown'}`).trim().slice(0, 200);
|
|
34
|
+
const version = (result.stdout || '').split(/\r?\n/).map((line) => line.trim()).find(Boolean);
|
|
35
|
+
return {
|
|
36
|
+
id: provider.id,
|
|
37
|
+
available: result.status === 0,
|
|
38
|
+
...(result.status === 0 && executable !== executableName ? { path: executable } : {}),
|
|
39
|
+
...(version ? { version } : {}),
|
|
40
|
+
detail
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAA;AAE5E,MAAM,SAAS,GAAG,IAAI,GAAG,CAAwB;IAC/C,CAAC,QAAQ,EAAE,cAAc,CAAC;IAC1B,CAAC,aAAa,EAAE,cAAc,CAAC;IAC/B,CAAC,OAAO,EAAE,aAAa,CAAC;IACxB,CAAC,MAAM,EAAE,YAAY,CAAC;CACvB,CAAC,CAAA;AAEF,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;IACvD,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAA;IACtE,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,cAAc,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACpE,MAAM,cAAc,GAAG,QAAQ,CAAC,EAAE,KAAK,QAAQ;YAC7C,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,OAAO;gBACvB,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,UAAU,CAAA;QAChB,MAAM,UAAU,GAAG,iBAAiB,CAAC,cAAc,CAAC,CAAA;QACpD,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,gBAAgB,EAAE,EAAE;YAChE,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK;SACb,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK;YACzB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;YACtB,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,QAAQ,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QACjG,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC7F,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,SAAS,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC9B,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,MAAM;SACP,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AgentConfig } from '../config.js';
|
|
2
|
+
export declare class AgentRuntime {
|
|
3
|
+
private readonly config;
|
|
4
|
+
private readonly logger;
|
|
5
|
+
private readonly state;
|
|
6
|
+
private sessions?;
|
|
7
|
+
private client?;
|
|
8
|
+
private health?;
|
|
9
|
+
private readonly startedAt;
|
|
10
|
+
constructor(config: AgentConfig);
|
|
11
|
+
start(): Promise<void>;
|
|
12
|
+
stop(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Dispatcher } from '../dispatch/dispatcher.js';
|
|
2
|
+
import { HealthServer } from '../health/server.js';
|
|
3
|
+
import { createDiagnosticLogger } from '../logging/diagnostic-log.js';
|
|
4
|
+
import { SessionManager } from '../session/session-manager.js';
|
|
5
|
+
import { StateStore } from '../state/state-store.js';
|
|
6
|
+
import { TaskMcpClient } from '../transport/taskmcp-client.js';
|
|
7
|
+
import { hydrateShellPath, mergePathSegments } from './cli/hydrate-shell-path.js';
|
|
8
|
+
export class AgentRuntime {
|
|
9
|
+
config;
|
|
10
|
+
logger;
|
|
11
|
+
state;
|
|
12
|
+
sessions;
|
|
13
|
+
client;
|
|
14
|
+
health;
|
|
15
|
+
startedAt = new Date().toISOString();
|
|
16
|
+
constructor(config) {
|
|
17
|
+
this.config = config;
|
|
18
|
+
this.logger = createDiagnosticLogger(config.logFile, { level: config.logLevel });
|
|
19
|
+
this.state = new StateStore(config.stateFile);
|
|
20
|
+
}
|
|
21
|
+
async start() {
|
|
22
|
+
const hydration = await hydrateShellPath();
|
|
23
|
+
if (hydration.ok)
|
|
24
|
+
mergePathSegments(hydration.segments);
|
|
25
|
+
await this.state.initialize();
|
|
26
|
+
const deviceId = this.config.deviceId;
|
|
27
|
+
this.sessions = new SessionManager(this.config, this.state, this.logger);
|
|
28
|
+
this.client = new TaskMcpClient(this.config, deviceId, this.logger);
|
|
29
|
+
const dispatcher = new Dispatcher(this.sessions, this.state, this.client, this.logger);
|
|
30
|
+
this.client.on('message', (message) => dispatcher.accept(message));
|
|
31
|
+
this.health = new HealthServer(this.config.healthHost, this.config.healthPort, () => ({
|
|
32
|
+
deviceId,
|
|
33
|
+
connected: this.client?.connected ?? false,
|
|
34
|
+
activeSessions: this.sessions?.activeCount ?? 0,
|
|
35
|
+
storedRuns: this.state.snapshot().runs,
|
|
36
|
+
startedAt: this.startedAt,
|
|
37
|
+
runs: this.state.recentRuns()
|
|
38
|
+
}), this.config.logFile, this.logger);
|
|
39
|
+
await this.health.start();
|
|
40
|
+
this.client.start();
|
|
41
|
+
this.logger.info('agent-started', {
|
|
42
|
+
deviceId,
|
|
43
|
+
deviceName: this.config.deviceName,
|
|
44
|
+
capabilities: this.config.capabilities
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async stop() {
|
|
48
|
+
this.client?.stop();
|
|
49
|
+
this.sessions?.dispose();
|
|
50
|
+
await this.health?.stop();
|
|
51
|
+
this.logger.info('agent-stopped');
|
|
52
|
+
this.logger.close();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=agent-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-runtime.js","sourceRoot":"","sources":["../../../src/runtime/agent-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type ShellHydrationFailureReason = 'none' | 'no_shell' | 'timeout' | 'spawn_error' | 'empty_path';
|
|
2
|
+
export type HydrationResult = {
|
|
3
|
+
ok: true;
|
|
4
|
+
segments: string[];
|
|
5
|
+
failureReason: 'none';
|
|
6
|
+
} | {
|
|
7
|
+
ok: false;
|
|
8
|
+
segments: [];
|
|
9
|
+
failureReason: Exclude<ShellHydrationFailureReason, 'none'>;
|
|
10
|
+
};
|
|
11
|
+
/** @internal - tests need a clean hydration cache between cases. */
|
|
12
|
+
export declare function _resetHydrateShellPathCache(): void;
|
|
13
|
+
type HydrateOptions = {
|
|
14
|
+
force?: boolean;
|
|
15
|
+
/** Override for tests — defaults to running `spawn` against the real shell. */
|
|
16
|
+
spawner?: (shell: string) => Promise<HydrationResult>;
|
|
17
|
+
/** Override for tests — defaults to `pickShell()`. */
|
|
18
|
+
shellOverride?: string | null;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Spawn the user's login shell once and return the PATH it would export.
|
|
22
|
+
* Caches the promise for the lifetime of the process — call
|
|
23
|
+
* `_resetHydrateShellPathCache()` in tests or `hydrateShellPath({ force: true })`
|
|
24
|
+
* when the user asks to re-probe (e.g. after installing a new CLI).
|
|
25
|
+
*/
|
|
26
|
+
export declare function hydrateShellPath(options?: HydrateOptions): Promise<HydrationResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Promote shell-discovered PATH segments to the front of process.env.PATH,
|
|
29
|
+
* preserving shell ordering and avoiding duplicates. Returns the segments that
|
|
30
|
+
* were newly added so callers can log/telemetry on nontrivial hydrations.
|
|
31
|
+
*/
|
|
32
|
+
export declare function mergePathSegments(segments: string[]): string[];
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { delimiter } from 'node:path';
|
|
3
|
+
// Why: GUI-launched Electron on macOS/Linux inherits a minimal PATH from launchd
|
|
4
|
+
// that does not include dirs appended by the user's shell rc files (~/.zshrc,
|
|
5
|
+
// ~/.bashrc). Tools installed into ~/.opencode/bin, ~/.cargo/bin, pyenv/volta
|
|
6
|
+
// shims, and countless other user-local locations end up invisible to our
|
|
7
|
+
// `which` probe even though they work fine from Terminal (see stablyai/orca#829).
|
|
8
|
+
//
|
|
9
|
+
// Rather than play whack-a-mole adding every agent's install dir to a hardcoded
|
|
10
|
+
// list, we spawn the user's login shell once per app session and read the PATH
|
|
11
|
+
// it would export. This matches the behavior of every popular Electron app that
|
|
12
|
+
// handles this problem (Hyper, VS Code, Cursor, etc. via shell-env/fix-path) —
|
|
13
|
+
// we implement it inline to avoid adding a dependency.
|
|
14
|
+
const DELIMITER = '__ORCA_SHELL_PATH__';
|
|
15
|
+
const SPAWN_TIMEOUT_MS = 5000;
|
|
16
|
+
// ANSI escape sequences can leak into the captured output when the user's rc
|
|
17
|
+
// files print banners or set colored prompts. Strip them before parsing.
|
|
18
|
+
const ANSI_RE = /\x1b\[[0-9;?]*[A-Za-z]/g; // eslint-disable-line no-control-regex
|
|
19
|
+
let cached = null;
|
|
20
|
+
/** @internal - tests need a clean hydration cache between cases. */
|
|
21
|
+
export function _resetHydrateShellPathCache() {
|
|
22
|
+
cached = null;
|
|
23
|
+
}
|
|
24
|
+
function pickShell() {
|
|
25
|
+
if (process.platform === 'win32') {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
const shell = process.env.SHELL;
|
|
29
|
+
if (shell && shell.length > 0) {
|
|
30
|
+
return shell;
|
|
31
|
+
}
|
|
32
|
+
return process.platform === 'darwin' ? '/bin/zsh' : '/bin/bash';
|
|
33
|
+
}
|
|
34
|
+
function parseCapturedPath(stdout) {
|
|
35
|
+
const cleaned = stdout.replace(ANSI_RE, '');
|
|
36
|
+
const first = cleaned.indexOf(DELIMITER);
|
|
37
|
+
if (first < 0) {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
const second = cleaned.indexOf(DELIMITER, first + DELIMITER.length);
|
|
41
|
+
if (second < 0) {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
const value = cleaned.slice(first + DELIMITER.length, second).trim();
|
|
45
|
+
if (!value) {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
// Why: Set preserves insertion order, and PATH resolution is first-match-wins,
|
|
49
|
+
// so de-duping this way keeps the user's rc-file ordering intact.
|
|
50
|
+
return [
|
|
51
|
+
...new Set(value
|
|
52
|
+
.split(delimiter)
|
|
53
|
+
.map((s) => s.trim())
|
|
54
|
+
.filter(Boolean))
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
function spawnShellAndReadPath(shell) {
|
|
58
|
+
return new Promise((resolve) => {
|
|
59
|
+
// Why: printing $PATH between delimiters is resilient to rc-file banners,
|
|
60
|
+
// MOTDs, and `echo` invocations that shells like fish print unprompted.
|
|
61
|
+
// `-ilc` runs the shell as a login+interactive so both .profile/.zprofile
|
|
62
|
+
// and .bashrc/.zshrc are sourced — matches what `which` in Terminal sees.
|
|
63
|
+
const command = `printf '%s' '${DELIMITER}'; printf '%s' "$PATH"; printf '%s' '${DELIMITER}'`;
|
|
64
|
+
let finished = false;
|
|
65
|
+
let stdout = '';
|
|
66
|
+
let timer = null;
|
|
67
|
+
const child = spawn(shell, ['-ilc', command], {
|
|
68
|
+
// Why: inherit current env so the shell sees the same baseline, then let
|
|
69
|
+
// it layer its own rc files on top. Do NOT forward stdio — some shells
|
|
70
|
+
// (oh-my-zsh setups, powerlevel10k) print a lot to stderr on startup,
|
|
71
|
+
// and we don't want that in Orca's console.
|
|
72
|
+
env: process.env,
|
|
73
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
74
|
+
detached: false
|
|
75
|
+
});
|
|
76
|
+
const cleanup = () => {
|
|
77
|
+
if (timer) {
|
|
78
|
+
clearTimeout(timer);
|
|
79
|
+
timer = null;
|
|
80
|
+
}
|
|
81
|
+
child.stdout.off('data', onStdoutData);
|
|
82
|
+
child.off('error', onError);
|
|
83
|
+
child.off('close', onClose);
|
|
84
|
+
};
|
|
85
|
+
const finish = (result) => {
|
|
86
|
+
if (finished) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
finished = true;
|
|
90
|
+
cleanup();
|
|
91
|
+
resolve(result);
|
|
92
|
+
};
|
|
93
|
+
timer = setTimeout(() => {
|
|
94
|
+
// Why: slow rc files (corporate env setup, nvm eager init) can exceed
|
|
95
|
+
// our budget. Kill the shell and fall back to process.env rather than
|
|
96
|
+
// blocking the Agents pane indefinitely.
|
|
97
|
+
try {
|
|
98
|
+
child.kill('SIGKILL');
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// ignore
|
|
102
|
+
}
|
|
103
|
+
finish({ segments: [], ok: false, failureReason: 'timeout' });
|
|
104
|
+
}, SPAWN_TIMEOUT_MS);
|
|
105
|
+
const onStdoutData = (chunk) => {
|
|
106
|
+
stdout += chunk.toString('utf8');
|
|
107
|
+
};
|
|
108
|
+
const onError = () => {
|
|
109
|
+
finish({ segments: [], ok: false, failureReason: 'spawn_error' });
|
|
110
|
+
};
|
|
111
|
+
const onClose = () => {
|
|
112
|
+
const segments = parseCapturedPath(stdout);
|
|
113
|
+
if (segments.length === 0) {
|
|
114
|
+
finish({ segments: [], ok: false, failureReason: 'empty_path' });
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
finish({ segments, ok: true, failureReason: 'none' });
|
|
118
|
+
};
|
|
119
|
+
child.stdout.on('data', onStdoutData);
|
|
120
|
+
child.on('error', onError);
|
|
121
|
+
child.on('close', onClose);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Spawn the user's login shell once and return the PATH it would export.
|
|
126
|
+
* Caches the promise for the lifetime of the process — call
|
|
127
|
+
* `_resetHydrateShellPathCache()` in tests or `hydrateShellPath({ force: true })`
|
|
128
|
+
* when the user asks to re-probe (e.g. after installing a new CLI).
|
|
129
|
+
*/
|
|
130
|
+
export function hydrateShellPath(options = {}) {
|
|
131
|
+
if (cached && !options.force) {
|
|
132
|
+
return cached;
|
|
133
|
+
}
|
|
134
|
+
const shell = options.shellOverride !== undefined ? options.shellOverride : pickShell();
|
|
135
|
+
if (!shell) {
|
|
136
|
+
// Windows uses cmd/PowerShell rather than a POSIX login shell — the
|
|
137
|
+
// `patchPackagedProcessPath` static list is sufficient there.
|
|
138
|
+
cached = Promise.resolve({ segments: [], ok: false, failureReason: 'no_shell' });
|
|
139
|
+
return cached;
|
|
140
|
+
}
|
|
141
|
+
cached = (options.spawner ?? spawnShellAndReadPath)(shell);
|
|
142
|
+
return cached;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Promote shell-discovered PATH segments to the front of process.env.PATH,
|
|
146
|
+
* preserving shell ordering and avoiding duplicates. Returns the segments that
|
|
147
|
+
* were newly added so callers can log/telemetry on nontrivial hydrations.
|
|
148
|
+
*/
|
|
149
|
+
export function mergePathSegments(segments) {
|
|
150
|
+
if (segments.length === 0) {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
const current = process.env.PATH ?? '';
|
|
154
|
+
const currentSegments = current.split(delimiter).filter(Boolean);
|
|
155
|
+
const shellSegments = [...new Set(segments)];
|
|
156
|
+
const shellSegmentSet = new Set(shellSegments);
|
|
157
|
+
const existing = new Set(currentSegments);
|
|
158
|
+
const added = shellSegments.filter((segment) => !existing.has(segment));
|
|
159
|
+
const merged = [
|
|
160
|
+
...shellSegments,
|
|
161
|
+
...currentSegments.filter((segment) => !shellSegmentSet.has(segment))
|
|
162
|
+
];
|
|
163
|
+
const next = merged.join(delimiter);
|
|
164
|
+
if (next === current) {
|
|
165
|
+
return [];
|
|
166
|
+
}
|
|
167
|
+
// Why: shell-provided entries must win over hardcoded packaged-app fallbacks.
|
|
168
|
+
// A seeded fallback can point at a stale CLI while the user's shell resolves
|
|
169
|
+
// a healthy one from the same directory list in a different order.
|
|
170
|
+
process.env.PATH = next;
|
|
171
|
+
return added;
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=hydrate-shell-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hydrate-shell-path.js","sourceRoot":"","sources":["../../../../src/runtime/cli/hydrate-shell-path.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function extractFinalOutput(output: string): string;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const MAX_OUTPUT_LENGTH = 24_000;
|
|
2
|
+
export function extractFinalOutput(output) {
|
|
3
|
+
const plain = output
|
|
4
|
+
.replace(/\u001B(?:\][^\u0007]*(?:\u0007|\u001B\\)|\[[0-?]*[ -/]*[@-~])/g, '')
|
|
5
|
+
.replace(/\r/g, '')
|
|
6
|
+
.trim();
|
|
7
|
+
if (!plain)
|
|
8
|
+
return '';
|
|
9
|
+
const promptMarkers = [...plain.matchAll(/(?:^|\n)\s*>\s?/g)];
|
|
10
|
+
const candidate = promptMarkers.length > 0
|
|
11
|
+
? plain.slice((promptMarkers.at(-1)?.index ?? 0) + (promptMarkers.at(-1)?.[0].length ?? 0))
|
|
12
|
+
: plain;
|
|
13
|
+
const withoutFooter = candidate.replace(/\n\s*(?:▸\s*)?Credits:[\s\S]*$/i, '').trim();
|
|
14
|
+
return withoutFooter.slice(-MAX_OUTPUT_LENGTH).trim();
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=final-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"final-output.js","sourceRoot":"","sources":["../../../src/session/final-output.ts"],"names":[],"mappings":"AAAA,MAAM,iBAAiB,GAAG,MAAM,CAAA;AAEhC,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,KAAK,GAAG,MAAM;SACjB,OAAO,CAAC,gEAAgE,EAAE,EAAE,CAAC;SAC7E,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,IAAI,EAAE,CAAA;IACT,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAA;IAErB,MAAM,aAAa,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAC7D,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC;QACxC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QAC3F,CAAC,CAAC,KAAK,CAAA;IACT,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACrF,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAA;AACvD,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { AgentConfig } from '../config.js';
|
|
2
|
+
import type { DiagnosticLogger } from '../logging/diagnostic-log.js';
|
|
3
|
+
import type { CliWindowRecord, StateStore } from '../state/state-store.js';
|
|
4
|
+
import type { AgentCliRequest, DeliveryResult } from '../types/protocol.js';
|
|
5
|
+
export type CliProcessExit = {
|
|
6
|
+
exitCode: number;
|
|
7
|
+
signal?: number;
|
|
8
|
+
cancelled?: boolean;
|
|
9
|
+
/** Compact, sanitized terminal failure detail for the remote run record. */
|
|
10
|
+
finalText?: string;
|
|
11
|
+
durationMs: number;
|
|
12
|
+
};
|
|
13
|
+
export type DeliveryHooks = {
|
|
14
|
+
onProcessStarted(sessionId: string, pid: number): Promise<void>;
|
|
15
|
+
onSessionInitialized(sessionId: string, created: boolean): Promise<void>;
|
|
16
|
+
onProcessExited(sessionId: string, result: CliProcessExit): Promise<void>;
|
|
17
|
+
};
|
|
18
|
+
export declare class SessionManager {
|
|
19
|
+
private readonly config;
|
|
20
|
+
private readonly state;
|
|
21
|
+
private readonly logger;
|
|
22
|
+
private readonly sessions;
|
|
23
|
+
constructor(config: AgentConfig, state: StateStore, logger: DiagnosticLogger);
|
|
24
|
+
get activeCount(): number;
|
|
25
|
+
/**
|
|
26
|
+
* Register a named local window before its first prompt. The server task id is
|
|
27
|
+
* the only routing key; a provider-native session id remains optional.
|
|
28
|
+
*/
|
|
29
|
+
createWindow(request: AgentCliRequest): Promise<CliWindowRecord>;
|
|
30
|
+
listWindows(agentType?: string): CliWindowRecord[];
|
|
31
|
+
deliver(request: AgentCliRequest, hooks: DeliveryHooks): Promise<DeliveryResult>;
|
|
32
|
+
dispose(): void;
|
|
33
|
+
/** Stop the PTY that owns the requested remote run. */
|
|
34
|
+
cancelRun(runId: string): boolean;
|
|
35
|
+
private writePrompt;
|
|
36
|
+
private waitForStartupOutput;
|
|
37
|
+
private autoApproveTrustPrompt;
|
|
38
|
+
private outputMarkers;
|
|
39
|
+
private validateWorkdir;
|
|
40
|
+
private ensurePtyHelperExecutable;
|
|
41
|
+
private errorMessage;
|
|
42
|
+
}
|