@a5c-ai/agent-mux-adapters 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +26 -0
- package/dist/adapter-install.d.ts +21 -0
- package/dist/adapter-install.d.ts.map +1 -0
- package/dist/adapter-install.js +114 -0
- package/dist/adapter-install.js.map +1 -0
- package/dist/agent-mux-remote-adapter.d.ts +66 -0
- package/dist/agent-mux-remote-adapter.d.ts.map +1 -0
- package/dist/agent-mux-remote-adapter.js +283 -0
- package/dist/agent-mux-remote-adapter.js.map +1 -0
- package/dist/auth-config.d.ts +14 -0
- package/dist/auth-config.d.ts.map +1 -0
- package/dist/auth-config.js +52 -0
- package/dist/auth-config.js.map +1 -0
- package/dist/base-adapter.d.ts +150 -0
- package/dist/base-adapter.d.ts.map +1 -0
- package/dist/base-adapter.js +458 -0
- package/dist/base-adapter.js.map +1 -0
- package/dist/claude-adapter.d.ts +52 -0
- package/dist/claude-adapter.d.ts.map +1 -0
- package/dist/claude-adapter.js +375 -0
- package/dist/claude-adapter.js.map +1 -0
- package/dist/codex-adapter.d.ts +26 -0
- package/dist/codex-adapter.d.ts.map +1 -0
- package/dist/codex-adapter.js +243 -0
- package/dist/codex-adapter.js.map +1 -0
- package/dist/copilot-adapter.d.ts +26 -0
- package/dist/copilot-adapter.d.ts.map +1 -0
- package/dist/copilot-adapter.js +199 -0
- package/dist/copilot-adapter.js.map +1 -0
- package/dist/cursor-adapter.d.ts +39 -0
- package/dist/cursor-adapter.d.ts.map +1 -0
- package/dist/cursor-adapter.js +247 -0
- package/dist/cursor-adapter.js.map +1 -0
- package/dist/gemini-adapter.d.ts +36 -0
- package/dist/gemini-adapter.d.ts.map +1 -0
- package/dist/gemini-adapter.js +287 -0
- package/dist/gemini-adapter.js.map +1 -0
- package/dist/hermes-adapter.d.ts +33 -0
- package/dist/hermes-adapter.d.ts.map +1 -0
- package/dist/hermes-adapter.js +269 -0
- package/dist/hermes-adapter.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-plugins.d.ts +13 -0
- package/dist/mcp-plugins.d.ts.map +1 -0
- package/dist/mcp-plugins.js +63 -0
- package/dist/mcp-plugins.js.map +1 -0
- package/dist/omp-adapter.d.ts +26 -0
- package/dist/omp-adapter.d.ts.map +1 -0
- package/dist/omp-adapter.js +195 -0
- package/dist/omp-adapter.js.map +1 -0
- package/dist/openclaw-adapter.d.ts +30 -0
- package/dist/openclaw-adapter.d.ts.map +1 -0
- package/dist/openclaw-adapter.js +212 -0
- package/dist/openclaw-adapter.js.map +1 -0
- package/dist/opencode-adapter.d.ts +30 -0
- package/dist/opencode-adapter.d.ts.map +1 -0
- package/dist/opencode-adapter.js +231 -0
- package/dist/opencode-adapter.js.map +1 -0
- package/dist/pi-adapter.d.ts +26 -0
- package/dist/pi-adapter.d.ts.map +1 -0
- package/dist/pi-adapter.js +196 -0
- package/dist/pi-adapter.js.map +1 -0
- package/dist/qwen-adapter.d.ts +36 -0
- package/dist/qwen-adapter.d.ts.map +1 -0
- package/dist/qwen-adapter.js +257 -0
- package/dist/qwen-adapter.js.map +1 -0
- package/dist/session-fs.d.ts +83 -0
- package/dist/session-fs.d.ts.map +1 -0
- package/dist/session-fs.js +255 -0
- package/dist/session-fs.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BaseAgentAdapter — abstract base class for agent adapters.
|
|
3
|
+
*
|
|
4
|
+
* Provides shared utilities and hook points with sensible defaults.
|
|
5
|
+
* All built-in adapters extend this class.
|
|
6
|
+
*
|
|
7
|
+
* @see 05-adapter-system.md §4
|
|
8
|
+
*/
|
|
9
|
+
import type { AgentName, CostRecord, RetryPolicy, AgentCapabilities, ModelCapabilities, AgentConfig, AgentConfigSchema, AuthState, AuthSetupGuidance, Session, InstalledPlugin, PluginInstallOptions, PluginSearchOptions, PluginListing, SpawnArgs, ParseContext, AgentAdapter, RunOptions, AgentEvent, DetectInstallationResult, InstallResult, AdapterInstallOptions, AdapterUpdateOptions, Spawner, InstallMethod } from '@a5c-ai/agent-mux-core';
|
|
10
|
+
import { StreamAssembler } from '@a5c-ai/agent-mux-core';
|
|
11
|
+
/**
|
|
12
|
+
* Default Spawner that runs the command via `child_process.spawn`, capturing
|
|
13
|
+
* stdout/stderr. `shell: false`, `windowsHide: true`.
|
|
14
|
+
*/
|
|
15
|
+
export declare const defaultSpawner: Spawner;
|
|
16
|
+
/**
|
|
17
|
+
* Abstract base class for agent adapters. Provides shared utilities
|
|
18
|
+
* and hook points with sensible defaults.
|
|
19
|
+
*/
|
|
20
|
+
export declare abstract class BaseAgentAdapter implements AgentAdapter {
|
|
21
|
+
abstract readonly agent: AgentName;
|
|
22
|
+
abstract readonly displayName: string;
|
|
23
|
+
abstract readonly cliCommand: string;
|
|
24
|
+
abstract readonly minVersion?: string;
|
|
25
|
+
abstract readonly capabilities: AgentCapabilities;
|
|
26
|
+
abstract readonly models: ModelCapabilities[];
|
|
27
|
+
abstract readonly defaultModelId?: string;
|
|
28
|
+
abstract readonly configSchema: AgentConfigSchema;
|
|
29
|
+
abstract buildSpawnArgs(options: RunOptions): SpawnArgs;
|
|
30
|
+
abstract parseEvent(line: string, context: ParseContext): AgentEvent | AgentEvent[] | null;
|
|
31
|
+
abstract detectAuth(): Promise<AuthState>;
|
|
32
|
+
abstract getAuthGuidance(): AuthSetupGuidance;
|
|
33
|
+
abstract sessionDir(cwd?: string): string;
|
|
34
|
+
abstract parseSessionFile(filePath: string): Promise<Session>;
|
|
35
|
+
abstract listSessionFiles(cwd?: string): Promise<string[]>;
|
|
36
|
+
abstract readConfig(cwd?: string): Promise<AgentConfig>;
|
|
37
|
+
abstract writeConfig(config: Partial<AgentConfig>, cwd?: string): Promise<void>;
|
|
38
|
+
listPlugins?(): Promise<InstalledPlugin[]>;
|
|
39
|
+
installPlugin?(pluginId: string, options?: PluginInstallOptions): Promise<InstalledPlugin>;
|
|
40
|
+
uninstallPlugin?(pluginId: string): Promise<void>;
|
|
41
|
+
searchPlugins?(query: string, options?: PluginSearchOptions): Promise<PluginListing[]>;
|
|
42
|
+
protected readonly streamAssembler: StreamAssembler;
|
|
43
|
+
/** Subprocess runner used by install/update/detect. Swap for tests. */
|
|
44
|
+
protected _spawner: Spawner;
|
|
45
|
+
/** Replaces the internal Spawner (used by tests and CLI DI). */
|
|
46
|
+
setSpawner(spawner: Spawner): void;
|
|
47
|
+
/**
|
|
48
|
+
* Locates the harness binary and queries its `--version`. Default
|
|
49
|
+
* implementation uses `which`/`where` + `<cli> --version`.
|
|
50
|
+
*/
|
|
51
|
+
detectInstallation(): Promise<DetectInstallationResult>;
|
|
52
|
+
/**
|
|
53
|
+
* Parses a `--version` output line. Default: first semver-like token.
|
|
54
|
+
* Override to accommodate bespoke version formats.
|
|
55
|
+
*/
|
|
56
|
+
protected parseVersionOutput(raw: string): string | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Picks an install method compatible with the current platform, runs it,
|
|
59
|
+
* then re-detects. Honors `force` and `dryRun`.
|
|
60
|
+
*/
|
|
61
|
+
private _installContext;
|
|
62
|
+
install(opts?: AdapterInstallOptions): Promise<InstallResult>;
|
|
63
|
+
/** Runs the update/upgrade variant of the install command. */
|
|
64
|
+
update(opts?: AdapterUpdateOptions): Promise<InstallResult>;
|
|
65
|
+
/**
|
|
66
|
+
* Picks the first InstallMethod compatible with the current platform,
|
|
67
|
+
* preferring non-manual methods.
|
|
68
|
+
*/
|
|
69
|
+
protected pickInstallMethod(): InstallMethod | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* Replace `<pkg>` tail with `<pkg>@<version>` for npm-typed methods.
|
|
72
|
+
*/
|
|
73
|
+
protected applyVersionToCommand(method: InstallMethod, version?: string): string;
|
|
74
|
+
/**
|
|
75
|
+
* Derives an update command from an install method.
|
|
76
|
+
*/
|
|
77
|
+
protected deriveUpdateCommand(method: InstallMethod): string | null;
|
|
78
|
+
/**
|
|
79
|
+
* Attempts to parse a line as JSON. Returns the parsed value on success,
|
|
80
|
+
* or null if the line is not valid JSON. Does not throw.
|
|
81
|
+
*/
|
|
82
|
+
protected parseJsonLine(line: string): unknown | null;
|
|
83
|
+
/**
|
|
84
|
+
* Normalizes a raw cost/usage object from agent output into the
|
|
85
|
+
* standard CostRecord type.
|
|
86
|
+
*/
|
|
87
|
+
protected assembleCostRecord(raw: unknown): CostRecord | null;
|
|
88
|
+
/**
|
|
89
|
+
* Detects the installed CLI version. Returns null in the base implementation.
|
|
90
|
+
* Subclasses should override to run the agent's CLI with a version flag.
|
|
91
|
+
*/
|
|
92
|
+
protected detectVersionFromCli(): Promise<string | null>;
|
|
93
|
+
/**
|
|
94
|
+
* Builds the environment variable record for the subprocess from RunOptions.
|
|
95
|
+
*/
|
|
96
|
+
protected buildEnvFromOptions(options: RunOptions): Record<string, string>;
|
|
97
|
+
/**
|
|
98
|
+
* Resolves the session ID to use for this run.
|
|
99
|
+
*/
|
|
100
|
+
protected resolveSessionId(options: RunOptions): string | undefined;
|
|
101
|
+
/**
|
|
102
|
+
* Called when the agent subprocess fails to spawn.
|
|
103
|
+
*/
|
|
104
|
+
onSpawnError(error: Error): AgentEvent;
|
|
105
|
+
/**
|
|
106
|
+
* Called when the inactivity timeout fires.
|
|
107
|
+
*/
|
|
108
|
+
onTimeout(): AgentEvent;
|
|
109
|
+
/**
|
|
110
|
+
* Called when the agent subprocess exits.
|
|
111
|
+
*/
|
|
112
|
+
onProcessExit(exitCode: number, signal: string | null): AgentEvent[];
|
|
113
|
+
/**
|
|
114
|
+
* Determines whether a failed run should be retried.
|
|
115
|
+
*/
|
|
116
|
+
shouldRetry(event: AgentEvent, attempt: number, policy: RetryPolicy): boolean;
|
|
117
|
+
/**
|
|
118
|
+
* Default hook installation: registers in .amux/hooks.json only.
|
|
119
|
+
* Override in subclasses to also write native harness config (e.g.
|
|
120
|
+
* ~/.claude/settings.json) so the hook fires without amux present.
|
|
121
|
+
*/
|
|
122
|
+
installHook(hookType: string, command: string, opts?: {
|
|
123
|
+
scope?: 'global' | 'project';
|
|
124
|
+
id?: string;
|
|
125
|
+
}): Promise<void>;
|
|
126
|
+
/** Register a hook in the unified .amux/hooks.json store. */
|
|
127
|
+
protected registerHookInConfig(hookType: string, command: string, opts?: {
|
|
128
|
+
scope?: 'global' | 'project';
|
|
129
|
+
id?: string;
|
|
130
|
+
}): Promise<void>;
|
|
131
|
+
/**
|
|
132
|
+
* Write the hook into the harness's native config. Default: append
|
|
133
|
+
* `{ command }` to `hooks[hookType]` in configFilePaths[0] if it is
|
|
134
|
+
* a .json file. Subclasses override to use harness-specific schema.
|
|
135
|
+
* Best-effort: failures are swallowed so SDK registration still succeeds.
|
|
136
|
+
*/
|
|
137
|
+
protected writeNativeHook(hookType: string, command: string): Promise<void>;
|
|
138
|
+
uninstallHook(id: string, opts?: {
|
|
139
|
+
scope?: 'global' | 'project';
|
|
140
|
+
}): Promise<boolean>;
|
|
141
|
+
/**
|
|
142
|
+
* Append `{ command }` to `hooks[hookType]` in the given JSON file,
|
|
143
|
+
* preserving any existing hooks and creating the parent directory if
|
|
144
|
+
* needed. Used by adapters that expose a simple JSON-based native
|
|
145
|
+
* hook config (codex, gemini, copilot, cursor, opencode, pi, omp,
|
|
146
|
+
* openclaw, hermes).
|
|
147
|
+
*/
|
|
148
|
+
protected appendJsonHook(settingsPath: string, hookType: string, entry: Record<string, unknown>): Promise<void>;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=base-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-adapter.d.ts","sourceRoot":"","sources":["../src/base-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BaseAgentAdapter — abstract base class for agent adapters.
|
|
3
|
+
*
|
|
4
|
+
* Provides shared utilities and hook points with sensible defaults.
|
|
5
|
+
* All built-in adapters extend this class.
|
|
6
|
+
*
|
|
7
|
+
* @see 05-adapter-system.md §4
|
|
8
|
+
*/
|
|
9
|
+
import { spawn } from 'node:child_process';
|
|
10
|
+
import * as os from 'node:os';
|
|
11
|
+
import { StreamAssembler } from '@a5c-ai/agent-mux-core';
|
|
12
|
+
import { runInstall, runUpdate } from './adapter-install.js';
|
|
13
|
+
/**
|
|
14
|
+
* Default Spawner that runs the command via `child_process.spawn`, capturing
|
|
15
|
+
* stdout/stderr. `shell: false`, `windowsHide: true`.
|
|
16
|
+
*/
|
|
17
|
+
export const defaultSpawner = (command, args, options) => new Promise((resolve, reject) => {
|
|
18
|
+
const child = spawn(command, args, {
|
|
19
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
20
|
+
shell: false,
|
|
21
|
+
windowsHide: true,
|
|
22
|
+
env: options?.env ? { ...process.env, ...options.env } : process.env,
|
|
23
|
+
cwd: options?.cwd,
|
|
24
|
+
});
|
|
25
|
+
let stdout = '';
|
|
26
|
+
let stderr = '';
|
|
27
|
+
child.stdout?.setEncoding('utf8');
|
|
28
|
+
child.stderr?.setEncoding('utf8');
|
|
29
|
+
child.stdout?.on('data', (c) => { stdout += c; });
|
|
30
|
+
child.stderr?.on('data', (c) => { stderr += c; });
|
|
31
|
+
child.on('error', (err) => reject(err));
|
|
32
|
+
child.on('exit', (code) => resolve({ code: code ?? 1, stdout, stderr }));
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Abstract base class for agent adapters. Provides shared utilities
|
|
36
|
+
* and hook points with sensible defaults.
|
|
37
|
+
*/
|
|
38
|
+
export class BaseAgentAdapter {
|
|
39
|
+
// ── Protected stream assembler ────────────────────────────────────
|
|
40
|
+
streamAssembler = new StreamAssembler();
|
|
41
|
+
// ── Injectable spawner for install/update/detect ──────────────────
|
|
42
|
+
/** Subprocess runner used by install/update/detect. Swap for tests. */
|
|
43
|
+
_spawner = defaultSpawner;
|
|
44
|
+
/** Replaces the internal Spawner (used by tests and CLI DI). */
|
|
45
|
+
setSpawner(spawner) {
|
|
46
|
+
this._spawner = spawner;
|
|
47
|
+
}
|
|
48
|
+
// ── detectInstallation ────────────────────────────────────────────
|
|
49
|
+
/**
|
|
50
|
+
* Locates the harness binary and queries its `--version`. Default
|
|
51
|
+
* implementation uses `which`/`where` + `<cli> --version`.
|
|
52
|
+
*/
|
|
53
|
+
async detectInstallation() {
|
|
54
|
+
const locator = process.platform === 'win32' ? 'where' : 'which';
|
|
55
|
+
let binPath;
|
|
56
|
+
try {
|
|
57
|
+
const res = await this._spawner(locator, [this.cliCommand]);
|
|
58
|
+
if (res.code === 0) {
|
|
59
|
+
const first = res.stdout.split(/\r?\n/).map((l) => l.trim()).filter(Boolean)[0];
|
|
60
|
+
if (first)
|
|
61
|
+
binPath = first;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// not found
|
|
66
|
+
}
|
|
67
|
+
if (!binPath) {
|
|
68
|
+
return { installed: false };
|
|
69
|
+
}
|
|
70
|
+
let version;
|
|
71
|
+
try {
|
|
72
|
+
const vres = await this._spawner(this.cliCommand, ['--version']);
|
|
73
|
+
if (vres.code === 0) {
|
|
74
|
+
version = this.parseVersionOutput(vres.stdout + '\n' + vres.stderr);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// ignore; still installed
|
|
79
|
+
}
|
|
80
|
+
const out = { installed: true, path: binPath };
|
|
81
|
+
if (version)
|
|
82
|
+
out.version = version;
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Parses a `--version` output line. Default: first semver-like token.
|
|
87
|
+
* Override to accommodate bespoke version formats.
|
|
88
|
+
*/
|
|
89
|
+
parseVersionOutput(raw) {
|
|
90
|
+
const match = raw.match(/\d+\.\d+\.\d+(?:[\w.+-]*)?/);
|
|
91
|
+
return match ? match[0] : undefined;
|
|
92
|
+
}
|
|
93
|
+
// ── install ────────────────────────────────────────────────────────
|
|
94
|
+
/**
|
|
95
|
+
* Picks an install method compatible with the current platform, runs it,
|
|
96
|
+
* then re-detects. Honors `force` and `dryRun`.
|
|
97
|
+
*/
|
|
98
|
+
_installContext() {
|
|
99
|
+
return {
|
|
100
|
+
cliCommand: this.cliCommand,
|
|
101
|
+
displayName: this.displayName,
|
|
102
|
+
spawner: this._spawner,
|
|
103
|
+
detectInstallation: () => this.detectInstallation(),
|
|
104
|
+
pickInstallMethod: () => this.pickInstallMethod(),
|
|
105
|
+
applyVersionToCommand: (m, v) => this.applyVersionToCommand(m, v),
|
|
106
|
+
deriveUpdateCommand: (m) => this.deriveUpdateCommand(m),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
async install(opts = {}) {
|
|
110
|
+
return runInstall(this._installContext(), opts);
|
|
111
|
+
}
|
|
112
|
+
// ── update ────────────────────────────────────────────────────────
|
|
113
|
+
/** Runs the update/upgrade variant of the install command. */
|
|
114
|
+
async update(opts = {}) {
|
|
115
|
+
return runUpdate(this._installContext(), opts);
|
|
116
|
+
}
|
|
117
|
+
// ── Helpers ───────────────────────────────────────────────────────
|
|
118
|
+
/**
|
|
119
|
+
* Picks the first InstallMethod compatible with the current platform,
|
|
120
|
+
* preferring non-manual methods.
|
|
121
|
+
*/
|
|
122
|
+
pickInstallMethod() {
|
|
123
|
+
const plat = os.platform();
|
|
124
|
+
const methods = this.capabilities.installMethods ?? [];
|
|
125
|
+
const compatible = methods.filter((m) => {
|
|
126
|
+
if (m.platform === 'all')
|
|
127
|
+
return true;
|
|
128
|
+
if (m.platform === plat)
|
|
129
|
+
return true;
|
|
130
|
+
// brew is acceptable on darwin/linux; npm on all
|
|
131
|
+
return false;
|
|
132
|
+
});
|
|
133
|
+
if (compatible.length === 0)
|
|
134
|
+
return undefined;
|
|
135
|
+
const rank = (t) => {
|
|
136
|
+
switch (t) {
|
|
137
|
+
case 'npm': return 0;
|
|
138
|
+
case 'brew': return plat === 'darwin' || plat === 'linux' ? 1 : 50;
|
|
139
|
+
case 'gh-extension': return 2;
|
|
140
|
+
case 'pip': return 3;
|
|
141
|
+
case 'winget': return plat === 'win32' ? 2 : 50;
|
|
142
|
+
case 'scoop': return plat === 'win32' ? 3 : 50;
|
|
143
|
+
case 'nix': return 6;
|
|
144
|
+
case 'curl': return 7;
|
|
145
|
+
case 'manual': return 99;
|
|
146
|
+
default: return 50;
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
return [...compatible].sort((a, b) => rank(a.type) - rank(b.type))[0];
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Replace `<pkg>` tail with `<pkg>@<version>` for npm-typed methods.
|
|
153
|
+
*/
|
|
154
|
+
applyVersionToCommand(method, version) {
|
|
155
|
+
if (!version)
|
|
156
|
+
return method.command;
|
|
157
|
+
if (method.type !== 'npm')
|
|
158
|
+
return method.command;
|
|
159
|
+
const parts = method.command.split(/\s+/).filter(Boolean);
|
|
160
|
+
if (parts.length === 0)
|
|
161
|
+
return method.command;
|
|
162
|
+
const last = parts[parts.length - 1];
|
|
163
|
+
// Only apply version if not already version-pinned.
|
|
164
|
+
if (/@\d/.test(last.replace(/^@[^@/]+\//, '')))
|
|
165
|
+
return method.command;
|
|
166
|
+
parts[parts.length - 1] = `${last}@${version}`;
|
|
167
|
+
return parts.join(' ');
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Derives an update command from an install method.
|
|
171
|
+
*/
|
|
172
|
+
deriveUpdateCommand(method) {
|
|
173
|
+
const parts = method.command.split(/\s+/).filter(Boolean);
|
|
174
|
+
const pkg = parts[parts.length - 1];
|
|
175
|
+
if (!pkg)
|
|
176
|
+
return null;
|
|
177
|
+
switch (method.type) {
|
|
178
|
+
case 'npm':
|
|
179
|
+
return `npm update -g ${pkg}`;
|
|
180
|
+
case 'brew':
|
|
181
|
+
return `brew upgrade ${pkg}`;
|
|
182
|
+
case 'pip':
|
|
183
|
+
return `pip install --upgrade ${pkg}`;
|
|
184
|
+
case 'winget':
|
|
185
|
+
return `winget upgrade ${pkg}`;
|
|
186
|
+
case 'scoop':
|
|
187
|
+
return `scoop update ${pkg}`;
|
|
188
|
+
case 'curl':
|
|
189
|
+
// Re-run the installer script.
|
|
190
|
+
return method.command;
|
|
191
|
+
case 'nix':
|
|
192
|
+
return `nix-env -u ${pkg}`;
|
|
193
|
+
case 'gh-extension':
|
|
194
|
+
return `gh extension upgrade ${pkg}`;
|
|
195
|
+
case 'manual':
|
|
196
|
+
return null;
|
|
197
|
+
default:
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// ── Protected utilities ───────────────────────────────────────────
|
|
202
|
+
/**
|
|
203
|
+
* Attempts to parse a line as JSON. Returns the parsed value on success,
|
|
204
|
+
* or null if the line is not valid JSON. Does not throw.
|
|
205
|
+
*/
|
|
206
|
+
parseJsonLine(line) {
|
|
207
|
+
try {
|
|
208
|
+
return JSON.parse(line);
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Normalizes a raw cost/usage object from agent output into the
|
|
216
|
+
* standard CostRecord type.
|
|
217
|
+
*/
|
|
218
|
+
assembleCostRecord(raw) {
|
|
219
|
+
if (raw == null || typeof raw !== 'object')
|
|
220
|
+
return null;
|
|
221
|
+
const obj = raw;
|
|
222
|
+
// Try common field names for total cost
|
|
223
|
+
const totalUsd = extractNumber(obj, ['totalUsd', 'total_usd', 'cost', 'total_cost', 'totalCost']) ?? 0;
|
|
224
|
+
const inputTokens = extractNumber(obj, ['inputTokens', 'input_tokens', 'prompt_tokens']) ?? 0;
|
|
225
|
+
const outputTokens = extractNumber(obj, ['outputTokens', 'output_tokens', 'completion_tokens']) ?? 0;
|
|
226
|
+
const thinkingTokens = extractNumber(obj, ['thinkingTokens', 'thinking_tokens', 'reasoning_tokens']);
|
|
227
|
+
const cachedTokens = extractNumber(obj, ['cachedTokens', 'cached_tokens', 'cache_read_input_tokens']);
|
|
228
|
+
// Must have at least some recognizable data
|
|
229
|
+
if (totalUsd === 0 && inputTokens === 0 && outputTokens === 0)
|
|
230
|
+
return null;
|
|
231
|
+
const record = {
|
|
232
|
+
totalUsd,
|
|
233
|
+
inputTokens,
|
|
234
|
+
outputTokens,
|
|
235
|
+
};
|
|
236
|
+
if (thinkingTokens != null)
|
|
237
|
+
record.thinkingTokens = thinkingTokens;
|
|
238
|
+
if (cachedTokens != null)
|
|
239
|
+
record.cachedTokens = cachedTokens;
|
|
240
|
+
return record;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Detects the installed CLI version. Returns null in the base implementation.
|
|
244
|
+
* Subclasses should override to run the agent's CLI with a version flag.
|
|
245
|
+
*/
|
|
246
|
+
async detectVersionFromCli() {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Builds the environment variable record for the subprocess from RunOptions.
|
|
251
|
+
*/
|
|
252
|
+
buildEnvFromOptions(options) {
|
|
253
|
+
const env = {};
|
|
254
|
+
// Propagate harness-specific env vars that affect config/session location
|
|
255
|
+
// or transport routing. Explicit RunOptions.env overrides.
|
|
256
|
+
const passthrough = [
|
|
257
|
+
'CODEX_HOME', // codex config/session root override
|
|
258
|
+
'GH_HOST', // gh copilot — GitHub Enterprise host
|
|
259
|
+
'GH_TOKEN', // gh copilot auth
|
|
260
|
+
'GOOGLE_APPLICATION_CREDENTIALS', // gemini service account
|
|
261
|
+
'HTTPS_PROXY',
|
|
262
|
+
'HTTP_PROXY',
|
|
263
|
+
'NO_PROXY',
|
|
264
|
+
];
|
|
265
|
+
for (const name of passthrough) {
|
|
266
|
+
const v = process.env[name];
|
|
267
|
+
if (v)
|
|
268
|
+
env[name] = v;
|
|
269
|
+
}
|
|
270
|
+
if (options.env) {
|
|
271
|
+
Object.assign(env, options.env);
|
|
272
|
+
}
|
|
273
|
+
return env;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Resolves the session ID to use for this run.
|
|
277
|
+
*/
|
|
278
|
+
resolveSessionId(options) {
|
|
279
|
+
if (options.sessionId)
|
|
280
|
+
return options.sessionId;
|
|
281
|
+
if (options.forkSessionId)
|
|
282
|
+
return options.forkSessionId;
|
|
283
|
+
if (options.noSession)
|
|
284
|
+
return undefined;
|
|
285
|
+
return undefined;
|
|
286
|
+
}
|
|
287
|
+
// ── Hook points (overridable, with defaults) ──────────────────────
|
|
288
|
+
/**
|
|
289
|
+
* Called when the agent subprocess fails to spawn.
|
|
290
|
+
*/
|
|
291
|
+
onSpawnError(error) {
|
|
292
|
+
return {
|
|
293
|
+
type: 'crash',
|
|
294
|
+
runId: '',
|
|
295
|
+
agent: this.agent,
|
|
296
|
+
timestamp: Date.now(),
|
|
297
|
+
exitCode: -1,
|
|
298
|
+
stderr: error.message,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Called when the inactivity timeout fires.
|
|
303
|
+
*/
|
|
304
|
+
onTimeout() {
|
|
305
|
+
return {
|
|
306
|
+
type: 'error',
|
|
307
|
+
runId: '',
|
|
308
|
+
agent: this.agent,
|
|
309
|
+
timestamp: Date.now(),
|
|
310
|
+
code: 'TIMEOUT',
|
|
311
|
+
message: 'Inactivity timeout',
|
|
312
|
+
recoverable: false,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Called when the agent subprocess exits.
|
|
317
|
+
*/
|
|
318
|
+
onProcessExit(exitCode, signal) {
|
|
319
|
+
if (exitCode === 0)
|
|
320
|
+
return [];
|
|
321
|
+
if (signal) {
|
|
322
|
+
return [
|
|
323
|
+
{
|
|
324
|
+
type: 'error',
|
|
325
|
+
runId: '',
|
|
326
|
+
agent: this.agent,
|
|
327
|
+
timestamp: Date.now(),
|
|
328
|
+
code: 'AGENT_CRASH',
|
|
329
|
+
message: `Process killed by signal: ${signal}`,
|
|
330
|
+
recoverable: false,
|
|
331
|
+
},
|
|
332
|
+
];
|
|
333
|
+
}
|
|
334
|
+
return [
|
|
335
|
+
{
|
|
336
|
+
type: 'crash',
|
|
337
|
+
runId: '',
|
|
338
|
+
agent: this.agent,
|
|
339
|
+
timestamp: Date.now(),
|
|
340
|
+
exitCode,
|
|
341
|
+
stderr: '',
|
|
342
|
+
},
|
|
343
|
+
];
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Determines whether a failed run should be retried.
|
|
347
|
+
*/
|
|
348
|
+
shouldRetry(event, attempt, policy) {
|
|
349
|
+
const maxAttempts = policy.maxAttempts ?? 3;
|
|
350
|
+
if (attempt >= maxAttempts)
|
|
351
|
+
return false;
|
|
352
|
+
const retryOn = policy.retryOn ?? ['RATE_LIMITED', 'AGENT_CRASH', 'TIMEOUT'];
|
|
353
|
+
// Check if the event has an error code
|
|
354
|
+
if ('code' in event && typeof event.code === 'string') {
|
|
355
|
+
return retryOn.includes(event.code);
|
|
356
|
+
}
|
|
357
|
+
// Check if it's a crash event
|
|
358
|
+
if (event.type === 'crash') {
|
|
359
|
+
return retryOn.includes('AGENT_CRASH');
|
|
360
|
+
}
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Default hook installation: registers in .amux/hooks.json only.
|
|
365
|
+
* Override in subclasses to also write native harness config (e.g.
|
|
366
|
+
* ~/.claude/settings.json) so the hook fires without amux present.
|
|
367
|
+
*/
|
|
368
|
+
async installHook(hookType, command, opts = {}) {
|
|
369
|
+
await this.registerHookInConfig(hookType, command, opts);
|
|
370
|
+
await this.writeNativeHook(hookType, command);
|
|
371
|
+
}
|
|
372
|
+
/** Register a hook in the unified .amux/hooks.json store. */
|
|
373
|
+
async registerHookInConfig(hookType, command, opts = {}) {
|
|
374
|
+
const { HookConfigManager } = await import('@a5c-ai/agent-mux-core');
|
|
375
|
+
const mgr = new HookConfigManager();
|
|
376
|
+
const id = opts.id ?? `${this.agent}.${hookType}.${Date.now().toString(36)}`;
|
|
377
|
+
await mgr.add({
|
|
378
|
+
id,
|
|
379
|
+
agent: this.agent,
|
|
380
|
+
hookType,
|
|
381
|
+
handler: 'command',
|
|
382
|
+
target: command,
|
|
383
|
+
enabled: true,
|
|
384
|
+
}, opts.scope ?? 'project');
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Write the hook into the harness's native config. Default: append
|
|
388
|
+
* `{ command }` to `hooks[hookType]` in configFilePaths[0] if it is
|
|
389
|
+
* a .json file. Subclasses override to use harness-specific schema.
|
|
390
|
+
* Best-effort: failures are swallowed so SDK registration still succeeds.
|
|
391
|
+
*/
|
|
392
|
+
async writeNativeHook(hookType, command) {
|
|
393
|
+
const nativePath = this.configSchema.configFilePaths?.[0];
|
|
394
|
+
if (!nativePath || !nativePath.endsWith('.json'))
|
|
395
|
+
return;
|
|
396
|
+
try {
|
|
397
|
+
await this.appendJsonHook(nativePath, hookType, { command });
|
|
398
|
+
}
|
|
399
|
+
catch {
|
|
400
|
+
// swallow
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
async uninstallHook(id, opts = {}) {
|
|
404
|
+
const { HookConfigManager } = await import('@a5c-ai/agent-mux-core');
|
|
405
|
+
const mgr = new HookConfigManager();
|
|
406
|
+
return await mgr.remove(id, opts.scope);
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Append `{ command }` to `hooks[hookType]` in the given JSON file,
|
|
410
|
+
* preserving any existing hooks and creating the parent directory if
|
|
411
|
+
* needed. Used by adapters that expose a simple JSON-based native
|
|
412
|
+
* hook config (codex, gemini, copilot, cursor, opencode, pi, omp,
|
|
413
|
+
* openclaw, hermes).
|
|
414
|
+
*/
|
|
415
|
+
async appendJsonHook(settingsPath, hookType, entry) {
|
|
416
|
+
const fsp = await import('node:fs/promises');
|
|
417
|
+
const pathMod = await import('node:path');
|
|
418
|
+
let doc = {};
|
|
419
|
+
try {
|
|
420
|
+
doc = JSON.parse(await fsp.readFile(settingsPath, 'utf8'));
|
|
421
|
+
}
|
|
422
|
+
catch {
|
|
423
|
+
doc = {};
|
|
424
|
+
}
|
|
425
|
+
const hooks = (doc['hooks'] && typeof doc['hooks'] === 'object'
|
|
426
|
+
? doc['hooks']
|
|
427
|
+
: {});
|
|
428
|
+
const existing = Array.isArray(hooks[hookType])
|
|
429
|
+
? hooks[hookType].slice()
|
|
430
|
+
: [];
|
|
431
|
+
existing.push(entry);
|
|
432
|
+
hooks[hookType] = existing;
|
|
433
|
+
doc['hooks'] = hooks;
|
|
434
|
+
await fsp.mkdir(pathMod.dirname(settingsPath), { recursive: true });
|
|
435
|
+
await fsp.writeFile(settingsPath, JSON.stringify(doc, null, 2) + '\n', 'utf8');
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
// ---------------------------------------------------------------------------
|
|
439
|
+
// Helpers
|
|
440
|
+
// ---------------------------------------------------------------------------
|
|
441
|
+
function extractNumber(obj, keys) {
|
|
442
|
+
for (const key of keys) {
|
|
443
|
+
const val = obj[key];
|
|
444
|
+
if (typeof val === 'number' && Number.isFinite(val))
|
|
445
|
+
return val;
|
|
446
|
+
// Check nested objects
|
|
447
|
+
if (typeof val === 'object' && val !== null) {
|
|
448
|
+
const nested = val;
|
|
449
|
+
for (const nk of Object.keys(nested)) {
|
|
450
|
+
const nv = nested[nk];
|
|
451
|
+
if (typeof nv === 'number' && Number.isFinite(nv))
|
|
452
|
+
return nv;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return undefined;
|
|
457
|
+
}
|
|
458
|
+
//# sourceMappingURL=base-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-adapter.js","sourceRoot":"","sources":["../src/base-adapter.ts"],"names":[],"mappings":"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"}
|