@a5c-ai/agent-mux-cli 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 +28 -0
- package/dist/bootstrap.d.ts +14 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +41 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/commands/adapters.d.ts +9 -0
- package/dist/commands/adapters.d.ts.map +1 -0
- package/dist/commands/adapters.js +132 -0
- package/dist/commands/adapters.js.map +1 -0
- package/dist/commands/auth.d.ts +9 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +137 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/config.d.ts +9 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +221 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/detect-host.d.ts +8 -0
- package/dist/commands/detect-host.d.ts.map +1 -0
- package/dist/commands/detect-host.js +33 -0
- package/dist/commands/detect-host.js.map +1 -0
- package/dist/commands/doctor.d.ts +4 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +120 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/help.d.ts +14 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +346 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/hooks.d.ts +17 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +219 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/install-helpers.d.ts +25 -0
- package/dist/commands/install-helpers.d.ts.map +1 -0
- package/dist/commands/install-helpers.js +58 -0
- package/dist/commands/install-helpers.js.map +1 -0
- package/dist/commands/install.d.ts +25 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +406 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/models.d.ts +9 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js +153 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/commands/plugins.d.ts +9 -0
- package/dist/commands/plugins.d.ts.map +1 -0
- package/dist/commands/plugins.js +180 -0
- package/dist/commands/plugins.js.map +1 -0
- package/dist/commands/profiles.d.ts +9 -0
- package/dist/commands/profiles.d.ts.map +1 -0
- package/dist/commands/profiles.js +206 -0
- package/dist/commands/profiles.js.map +1 -0
- package/dist/commands/remote.d.ts +31 -0
- package/dist/commands/remote.d.ts.map +1 -0
- package/dist/commands/remote.js +204 -0
- package/dist/commands/remote.js.map +1 -0
- package/dist/commands/run.d.ts +28 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +293 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/sessions.d.ts +9 -0
- package/dist/commands/sessions.d.ts.map +1 -0
- package/dist/commands/sessions.js +225 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/exit-codes.d.ts +33 -0
- package/dist/exit-codes.d.ts.map +1 -0
- package/dist/exit-codes.js +68 -0
- package/dist/exit-codes.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +188 -0
- package/dist/index.js.map +1 -0
- package/dist/output.d.ts +56 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +129 -0
- package/dist/output.js.map +1 -0
- package/dist/parse-args.d.ts +58 -0
- package/dist/parse-args.d.ts.map +1 -0
- package/dist/parse-args.js +257 -0
- package/dist/parse-args.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `amux hooks <agent> <subcommand> [args]` — manage and dispatch hooks.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* discover List native hook types supported by the harness.
|
|
6
|
+
* list List registered hooks (project + global).
|
|
7
|
+
* add <hookType> [--handler builtin|command|script] [--target <t>] [--id <id>] [--global]
|
|
8
|
+
* remove <id> [--global]
|
|
9
|
+
* set <id> [--priority N] [--enabled true|false] [--target <t>]
|
|
10
|
+
* handle <hookType> Read JSON payload on stdin, dispatch, emit unified result.
|
|
11
|
+
*/
|
|
12
|
+
import { HookConfigManager, HookDispatcher, builtInHooks, getHookCatalog, parseHookPayload, formatHookResult, } from '@a5c-ai/agent-mux-core';
|
|
13
|
+
import { flagBool, flagStr } from '../parse-args.js';
|
|
14
|
+
import { ExitCode } from '../exit-codes.js';
|
|
15
|
+
import { printError, printJsonError, printJsonOk, printTable, } from '../output.js';
|
|
16
|
+
export const HOOKS_FLAGS = {
|
|
17
|
+
handler: { type: 'string' },
|
|
18
|
+
target: { type: 'string' },
|
|
19
|
+
priority: { type: 'string' },
|
|
20
|
+
enabled: { type: 'string' },
|
|
21
|
+
id: { type: 'string' },
|
|
22
|
+
global: { type: 'boolean' },
|
|
23
|
+
project: { type: 'boolean' },
|
|
24
|
+
};
|
|
25
|
+
function jsonMode(args) {
|
|
26
|
+
return flagBool(args.flags, 'json') === true;
|
|
27
|
+
}
|
|
28
|
+
export async function hooksCommand(_client, args) {
|
|
29
|
+
const json = jsonMode(args);
|
|
30
|
+
const agent = args.subcommand;
|
|
31
|
+
const sub = args.positionals[0];
|
|
32
|
+
if (!agent || !sub) {
|
|
33
|
+
const msg = 'Usage: amux hooks <agent> <discover|list|add|remove|set|handle> [...]';
|
|
34
|
+
if (json)
|
|
35
|
+
printJsonError('VALIDATION_ERROR', msg);
|
|
36
|
+
else
|
|
37
|
+
printError(msg);
|
|
38
|
+
return ExitCode.USAGE_ERROR;
|
|
39
|
+
}
|
|
40
|
+
const mgr = new HookConfigManager();
|
|
41
|
+
switch (sub) {
|
|
42
|
+
case 'discover':
|
|
43
|
+
return discover(agent, json);
|
|
44
|
+
case 'list':
|
|
45
|
+
return await list(agent, mgr, json);
|
|
46
|
+
case 'add':
|
|
47
|
+
return await add(agent, mgr, args, json);
|
|
48
|
+
case 'remove':
|
|
49
|
+
return await remove(mgr, args, json);
|
|
50
|
+
case 'set':
|
|
51
|
+
return await set(mgr, args, json);
|
|
52
|
+
case 'handle':
|
|
53
|
+
return await handle(agent, mgr, args);
|
|
54
|
+
default: {
|
|
55
|
+
const msg = `Unknown hooks subcommand: ${sub}`;
|
|
56
|
+
if (json)
|
|
57
|
+
printJsonError('VALIDATION_ERROR', msg);
|
|
58
|
+
else
|
|
59
|
+
printError(msg);
|
|
60
|
+
return ExitCode.USAGE_ERROR;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function discover(agent, json) {
|
|
65
|
+
const entries = getHookCatalog(agent);
|
|
66
|
+
if (json) {
|
|
67
|
+
printJsonOk({ agent, hookTypes: entries });
|
|
68
|
+
return ExitCode.SUCCESS;
|
|
69
|
+
}
|
|
70
|
+
if (entries.length === 0) {
|
|
71
|
+
process.stdout.write(`(no hook catalog entry for ${agent})\n`);
|
|
72
|
+
return ExitCode.SUCCESS;
|
|
73
|
+
}
|
|
74
|
+
printTable(['Hook', 'Direction', 'Description'], entries.map((e) => [e.name, e.direction, e.description]));
|
|
75
|
+
return ExitCode.SUCCESS;
|
|
76
|
+
}
|
|
77
|
+
async function list(agent, mgr, json) {
|
|
78
|
+
const all = await mgr.list();
|
|
79
|
+
const matching = all.filter((h) => h.agent === agent || h.agent === '*');
|
|
80
|
+
if (json) {
|
|
81
|
+
printJsonOk({ hooks: matching });
|
|
82
|
+
return ExitCode.SUCCESS;
|
|
83
|
+
}
|
|
84
|
+
if (matching.length === 0) {
|
|
85
|
+
process.stdout.write('(no hooks registered)\n');
|
|
86
|
+
return ExitCode.SUCCESS;
|
|
87
|
+
}
|
|
88
|
+
printTable(['ID', 'HookType', 'Handler', 'Target', 'Priority', 'Enabled'], matching.map((h) => [
|
|
89
|
+
h.id,
|
|
90
|
+
h.hookType,
|
|
91
|
+
h.handler,
|
|
92
|
+
h.target,
|
|
93
|
+
String(h.priority ?? 100),
|
|
94
|
+
String(h.enabled !== false),
|
|
95
|
+
]));
|
|
96
|
+
return ExitCode.SUCCESS;
|
|
97
|
+
}
|
|
98
|
+
async function add(agent, mgr, args, json) {
|
|
99
|
+
const hookType = args.positionals[1];
|
|
100
|
+
if (!hookType) {
|
|
101
|
+
const msg = 'Usage: amux hooks <agent> add <hookType> [--handler ...] [--target ...]';
|
|
102
|
+
if (json)
|
|
103
|
+
printJsonError('VALIDATION_ERROR', msg);
|
|
104
|
+
else
|
|
105
|
+
printError(msg);
|
|
106
|
+
return ExitCode.USAGE_ERROR;
|
|
107
|
+
}
|
|
108
|
+
const id = flagStr(args.flags, 'id') ?? `${agent}.${hookType}.${Date.now().toString(36)}`;
|
|
109
|
+
const handler = (flagStr(args.flags, 'handler') ?? 'builtin');
|
|
110
|
+
const target = flagStr(args.flags, 'target') ?? 'log';
|
|
111
|
+
const priority = flagStr(args.flags, 'priority');
|
|
112
|
+
const scope = flagBool(args.flags, 'global') === true ? 'global' : 'project';
|
|
113
|
+
const reg = {
|
|
114
|
+
id,
|
|
115
|
+
agent: agent,
|
|
116
|
+
hookType,
|
|
117
|
+
handler,
|
|
118
|
+
target,
|
|
119
|
+
priority: priority ? Number(priority) : undefined,
|
|
120
|
+
enabled: true,
|
|
121
|
+
};
|
|
122
|
+
await mgr.add(reg, scope);
|
|
123
|
+
if (json)
|
|
124
|
+
printJsonOk({ added: reg, scope });
|
|
125
|
+
else
|
|
126
|
+
process.stdout.write(`Added hook ${id} (${scope}).\n`);
|
|
127
|
+
return ExitCode.SUCCESS;
|
|
128
|
+
}
|
|
129
|
+
async function remove(mgr, args, json) {
|
|
130
|
+
const id = args.positionals[1];
|
|
131
|
+
if (!id) {
|
|
132
|
+
const msg = 'Usage: amux hooks <agent> remove <id>';
|
|
133
|
+
if (json)
|
|
134
|
+
printJsonError('VALIDATION_ERROR', msg);
|
|
135
|
+
else
|
|
136
|
+
printError(msg);
|
|
137
|
+
return ExitCode.USAGE_ERROR;
|
|
138
|
+
}
|
|
139
|
+
const scope = flagBool(args.flags, 'global') === true ? 'global'
|
|
140
|
+
: flagBool(args.flags, 'project') === true ? 'project' : undefined;
|
|
141
|
+
const removed = await mgr.remove(id, scope);
|
|
142
|
+
if (json)
|
|
143
|
+
printJsonOk({ removed, id });
|
|
144
|
+
else
|
|
145
|
+
process.stdout.write(removed ? `Removed ${id}.\n` : `No hook with id ${id}.\n`);
|
|
146
|
+
return removed ? ExitCode.SUCCESS : ExitCode.GENERAL_ERROR;
|
|
147
|
+
}
|
|
148
|
+
async function set(mgr, args, json) {
|
|
149
|
+
const id = args.positionals[1];
|
|
150
|
+
if (!id) {
|
|
151
|
+
const msg = 'Usage: amux hooks <agent> set <id> [--priority N] [--enabled true|false] [--target ...]';
|
|
152
|
+
if (json)
|
|
153
|
+
printJsonError('VALIDATION_ERROR', msg);
|
|
154
|
+
else
|
|
155
|
+
printError(msg);
|
|
156
|
+
return ExitCode.USAGE_ERROR;
|
|
157
|
+
}
|
|
158
|
+
const patch = {};
|
|
159
|
+
const priority = flagStr(args.flags, 'priority');
|
|
160
|
+
const enabled = flagStr(args.flags, 'enabled');
|
|
161
|
+
const target = flagStr(args.flags, 'target');
|
|
162
|
+
if (priority !== undefined)
|
|
163
|
+
patch['priority'] = Number(priority);
|
|
164
|
+
if (enabled !== undefined)
|
|
165
|
+
patch['enabled'] = enabled === 'true';
|
|
166
|
+
if (target !== undefined)
|
|
167
|
+
patch['target'] = target;
|
|
168
|
+
const updated = await mgr.set(id, patch);
|
|
169
|
+
if (!updated) {
|
|
170
|
+
if (json)
|
|
171
|
+
printJsonError('VALIDATION_ERROR', `No hook with id ${id}`);
|
|
172
|
+
else
|
|
173
|
+
printError(`No hook with id ${id}`);
|
|
174
|
+
return ExitCode.GENERAL_ERROR;
|
|
175
|
+
}
|
|
176
|
+
if (json)
|
|
177
|
+
printJsonOk({ updated });
|
|
178
|
+
else
|
|
179
|
+
process.stdout.write(`Updated ${id}.\n`);
|
|
180
|
+
return ExitCode.SUCCESS;
|
|
181
|
+
}
|
|
182
|
+
async function handle(agent, mgr, args) {
|
|
183
|
+
const hookType = args.positionals[1];
|
|
184
|
+
if (!hookType) {
|
|
185
|
+
process.stderr.write('Usage: amux hooks <agent> handle <hookType>\n');
|
|
186
|
+
return ExitCode.USAGE_ERROR;
|
|
187
|
+
}
|
|
188
|
+
const raw = await readStdin();
|
|
189
|
+
let parsed = {};
|
|
190
|
+
if (raw.trim()) {
|
|
191
|
+
try {
|
|
192
|
+
parsed = JSON.parse(raw);
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
parsed = { body: raw };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
const payload = parseHookPayload(agent, hookType, parsed);
|
|
199
|
+
const dispatcher = new HookDispatcher(mgr, builtInHooks);
|
|
200
|
+
const result = await dispatcher.dispatch(payload);
|
|
201
|
+
const { stdout, exitCode } = formatHookResult(agent, hookType, result);
|
|
202
|
+
if (stdout)
|
|
203
|
+
process.stdout.write(stdout);
|
|
204
|
+
return exitCode;
|
|
205
|
+
}
|
|
206
|
+
function readStdin() {
|
|
207
|
+
return new Promise((resolve) => {
|
|
208
|
+
if (process.stdin.isTTY) {
|
|
209
|
+
resolve('');
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
let buf = '';
|
|
213
|
+
process.stdin.setEncoding('utf8');
|
|
214
|
+
process.stdin.on('data', (d) => (buf += d));
|
|
215
|
+
process.stdin.on('end', () => resolve(buf));
|
|
216
|
+
process.stdin.on('error', () => resolve(buf));
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal helpers for the install/update/detect/uninstall commands.
|
|
3
|
+
* Split out to keep `install.ts` under the max-file-lines budget.
|
|
4
|
+
*/
|
|
5
|
+
export type SpawnRunner = (command: string, args: string[]) => Promise<{
|
|
6
|
+
code: number;
|
|
7
|
+
stdout: string;
|
|
8
|
+
stderr: string;
|
|
9
|
+
}>;
|
|
10
|
+
/**
|
|
11
|
+
* Create a SpawnRunner. When `echo` is true, child output is mirrored to
|
|
12
|
+
* the CLI's stdout/stderr (useful for long-running install commands in
|
|
13
|
+
* human mode). When false (default for JSON/detect), child output is
|
|
14
|
+
* captured silently so it doesn't contaminate structured output.
|
|
15
|
+
*/
|
|
16
|
+
export declare function makeSpawnRunner(echo: boolean): SpawnRunner;
|
|
17
|
+
export declare const defaultSpawnRunner: SpawnRunner;
|
|
18
|
+
export declare const silentSpawnRunner: SpawnRunner;
|
|
19
|
+
/**
|
|
20
|
+
* Temporarily swallow writes to process.stdout/stderr while `fn` runs.
|
|
21
|
+
* Used to suppress per-agent JSON envelopes when `--all --json` aggregates
|
|
22
|
+
* results into a single response.
|
|
23
|
+
*/
|
|
24
|
+
export declare function runSilently<T>(fn: () => Promise<T>): Promise<T>;
|
|
25
|
+
//# sourceMappingURL=install-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-helpers.d.ts","sourceRoot":"","sources":["../../src/commands/install-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,WAAW,GAAG,CACxB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,KACX,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE/D;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,CAuB1D;AAED,eAAO,MAAM,kBAAkB,EAAE,WAAmC,CAAC;AACrE,eAAO,MAAM,iBAAiB,EAAE,WAAoC,CAAC;AAErE;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAYrE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal helpers for the install/update/detect/uninstall commands.
|
|
3
|
+
* Split out to keep `install.ts` under the max-file-lines budget.
|
|
4
|
+
*/
|
|
5
|
+
import { spawn } from 'node:child_process';
|
|
6
|
+
/**
|
|
7
|
+
* Create a SpawnRunner. When `echo` is true, child output is mirrored to
|
|
8
|
+
* the CLI's stdout/stderr (useful for long-running install commands in
|
|
9
|
+
* human mode). When false (default for JSON/detect), child output is
|
|
10
|
+
* captured silently so it doesn't contaminate structured output.
|
|
11
|
+
*/
|
|
12
|
+
export function makeSpawnRunner(echo) {
|
|
13
|
+
return (command, args) => new Promise((resolve, reject) => {
|
|
14
|
+
const child = spawn(command, args, {
|
|
15
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
16
|
+
shell: false,
|
|
17
|
+
windowsHide: true,
|
|
18
|
+
});
|
|
19
|
+
let stdout = '';
|
|
20
|
+
let stderr = '';
|
|
21
|
+
child.stdout?.setEncoding('utf8');
|
|
22
|
+
child.stderr?.setEncoding('utf8');
|
|
23
|
+
child.stdout?.on('data', (c) => {
|
|
24
|
+
stdout += c;
|
|
25
|
+
if (echo)
|
|
26
|
+
process.stdout.write(c);
|
|
27
|
+
});
|
|
28
|
+
child.stderr?.on('data', (c) => {
|
|
29
|
+
stderr += c;
|
|
30
|
+
if (echo)
|
|
31
|
+
process.stderr.write(c);
|
|
32
|
+
});
|
|
33
|
+
child.on('error', (err) => reject(err));
|
|
34
|
+
child.on('exit', (code) => resolve({ code: code ?? 1, stdout, stderr }));
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export const defaultSpawnRunner = makeSpawnRunner(true);
|
|
38
|
+
export const silentSpawnRunner = makeSpawnRunner(false);
|
|
39
|
+
/**
|
|
40
|
+
* Temporarily swallow writes to process.stdout/stderr while `fn` runs.
|
|
41
|
+
* Used to suppress per-agent JSON envelopes when `--all --json` aggregates
|
|
42
|
+
* results into a single response.
|
|
43
|
+
*/
|
|
44
|
+
export async function runSilently(fn) {
|
|
45
|
+
const origOut = process.stdout.write.bind(process.stdout);
|
|
46
|
+
const origErr = process.stderr.write.bind(process.stderr);
|
|
47
|
+
const noop = ((..._a) => true);
|
|
48
|
+
process.stdout.write = noop;
|
|
49
|
+
process.stderr.write = noop;
|
|
50
|
+
try {
|
|
51
|
+
return await fn();
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
process.stdout.write = origOut;
|
|
55
|
+
process.stderr.write = origErr;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=install-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-helpers.js","sourceRoot":"","sources":["../../src/commands/install-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAO3C;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAa;IAC3C,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CACvB,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;YACrC,MAAM,IAAI,CAAC,CAAC;YACZ,IAAI,IAAI;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;YACrC,MAAM,IAAI,CAAC,CAAC;YACZ,IAAI,IAAI;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAgB,eAAe,CAAC,IAAI,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAgB,eAAe,CAAC,KAAK,CAAC,CAAC;AAErE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAI,EAAoB;IACvD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,EAAa,EAAE,EAAE,CAAC,IAAI,CAAmB,CAAC;IAC3D,OAAO,CAAC,MAA+C,CAAC,KAAK,GAAG,IAAI,CAAC;IACrE,OAAO,CAAC,MAA+C,CAAC,KAAK,GAAG,IAAI,CAAC;IACtE,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACR,OAAO,CAAC,MAA+C,CAAC,KAAK,GAAG,OAAO,CAAC;QACxE,OAAO,CAAC,MAA+C,CAAC,KAAK,GAAG,OAAO,CAAC;IAC3E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `amux install <agent>`, `amux update <agent>`, `amux detect <agent>`,
|
|
3
|
+
* and `amux uninstall <agent>` commands.
|
|
4
|
+
*
|
|
5
|
+
* Dispatches to the adapter's per-agent install/update/detect methods,
|
|
6
|
+
* so each harness may override behavior.
|
|
7
|
+
*
|
|
8
|
+
* @see docs/10-cli-reference.md
|
|
9
|
+
*/
|
|
10
|
+
import type { AgentMuxClient } from '@a5c-ai/agent-mux-core';
|
|
11
|
+
import type { ParsedArgs, FlagDef } from '../parse-args.js';
|
|
12
|
+
import { type SpawnRunner as HelperSpawnRunner } from './install-helpers.js';
|
|
13
|
+
/** Flags recognized by the install/uninstall/update/detect commands. */
|
|
14
|
+
export declare const INSTALL_FLAGS: Record<string, FlagDef>;
|
|
15
|
+
export type SpawnRunner = HelperSpawnRunner;
|
|
16
|
+
export interface InstallCommandDeps {
|
|
17
|
+
/** Back-compat: overrides the adapter's internal Spawner for this run. */
|
|
18
|
+
spawnRunner?: SpawnRunner;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Handle `amux install [<agent>] [--all]`, `amux update [<agent>] [--all]`,
|
|
22
|
+
* `amux detect [<agent>] [--all]`, and `amux uninstall <agent>`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function installCommand(client: AgentMuxClient, args: ParsedArgs, deps?: InstallCommandDeps): Promise<number>;
|
|
25
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,cAAc,EAKf,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAO5D,OAAO,EAEL,KAAK,WAAW,IAAI,iBAAiB,EACtC,MAAM,sBAAsB,CAAC;AAE9B,wEAAwE;AACxE,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAKjD,CAAC;AAOF,MAAM,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAM5C,MAAM,WAAW,kBAAkB;IACjC,0EAA0E;IAC1E,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,UAAU,EAChB,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,MAAM,CAAC,CA+CjB"}
|