@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.
Files changed (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -0
  3. package/dist/adapter-install.d.ts +21 -0
  4. package/dist/adapter-install.d.ts.map +1 -0
  5. package/dist/adapter-install.js +114 -0
  6. package/dist/adapter-install.js.map +1 -0
  7. package/dist/agent-mux-remote-adapter.d.ts +66 -0
  8. package/dist/agent-mux-remote-adapter.d.ts.map +1 -0
  9. package/dist/agent-mux-remote-adapter.js +283 -0
  10. package/dist/agent-mux-remote-adapter.js.map +1 -0
  11. package/dist/auth-config.d.ts +14 -0
  12. package/dist/auth-config.d.ts.map +1 -0
  13. package/dist/auth-config.js +52 -0
  14. package/dist/auth-config.js.map +1 -0
  15. package/dist/base-adapter.d.ts +150 -0
  16. package/dist/base-adapter.d.ts.map +1 -0
  17. package/dist/base-adapter.js +458 -0
  18. package/dist/base-adapter.js.map +1 -0
  19. package/dist/claude-adapter.d.ts +52 -0
  20. package/dist/claude-adapter.d.ts.map +1 -0
  21. package/dist/claude-adapter.js +375 -0
  22. package/dist/claude-adapter.js.map +1 -0
  23. package/dist/codex-adapter.d.ts +26 -0
  24. package/dist/codex-adapter.d.ts.map +1 -0
  25. package/dist/codex-adapter.js +243 -0
  26. package/dist/codex-adapter.js.map +1 -0
  27. package/dist/copilot-adapter.d.ts +26 -0
  28. package/dist/copilot-adapter.d.ts.map +1 -0
  29. package/dist/copilot-adapter.js +199 -0
  30. package/dist/copilot-adapter.js.map +1 -0
  31. package/dist/cursor-adapter.d.ts +39 -0
  32. package/dist/cursor-adapter.d.ts.map +1 -0
  33. package/dist/cursor-adapter.js +247 -0
  34. package/dist/cursor-adapter.js.map +1 -0
  35. package/dist/gemini-adapter.d.ts +36 -0
  36. package/dist/gemini-adapter.d.ts.map +1 -0
  37. package/dist/gemini-adapter.js +287 -0
  38. package/dist/gemini-adapter.js.map +1 -0
  39. package/dist/hermes-adapter.d.ts +33 -0
  40. package/dist/hermes-adapter.d.ts.map +1 -0
  41. package/dist/hermes-adapter.js +269 -0
  42. package/dist/hermes-adapter.js.map +1 -0
  43. package/dist/index.d.ts +20 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +21 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/mcp-plugins.d.ts +13 -0
  48. package/dist/mcp-plugins.d.ts.map +1 -0
  49. package/dist/mcp-plugins.js +63 -0
  50. package/dist/mcp-plugins.js.map +1 -0
  51. package/dist/omp-adapter.d.ts +26 -0
  52. package/dist/omp-adapter.d.ts.map +1 -0
  53. package/dist/omp-adapter.js +195 -0
  54. package/dist/omp-adapter.js.map +1 -0
  55. package/dist/openclaw-adapter.d.ts +30 -0
  56. package/dist/openclaw-adapter.d.ts.map +1 -0
  57. package/dist/openclaw-adapter.js +212 -0
  58. package/dist/openclaw-adapter.js.map +1 -0
  59. package/dist/opencode-adapter.d.ts +30 -0
  60. package/dist/opencode-adapter.d.ts.map +1 -0
  61. package/dist/opencode-adapter.js +231 -0
  62. package/dist/opencode-adapter.js.map +1 -0
  63. package/dist/pi-adapter.d.ts +26 -0
  64. package/dist/pi-adapter.d.ts.map +1 -0
  65. package/dist/pi-adapter.js +196 -0
  66. package/dist/pi-adapter.js.map +1 -0
  67. package/dist/qwen-adapter.d.ts +36 -0
  68. package/dist/qwen-adapter.d.ts.map +1 -0
  69. package/dist/qwen-adapter.js +257 -0
  70. package/dist/qwen-adapter.js.map +1 -0
  71. package/dist/session-fs.d.ts +83 -0
  72. package/dist/session-fs.d.ts.map +1 -0
  73. package/dist/session-fs.js +255 -0
  74. package/dist/session-fs.js.map +1 -0
  75. 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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"}