@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
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 a5c-ai
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# @a5c-ai/agent-mux-cli
|
|
2
|
+
|
|
3
|
+
The `amux` command-line interface for [agent-mux](https://github.com/a5c-ai/agent-mux).
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @a5c-ai/agent-mux-cli
|
|
9
|
+
# or
|
|
10
|
+
npx @a5c-ai/agent-mux-cli --help
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Requires Node.js >= 20.9.0.
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
amux --help
|
|
19
|
+
amux run --agent claude-code --prompt "Summarize README.md"
|
|
20
|
+
amux adapters list
|
|
21
|
+
amux sessions list
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
See the [repository README](https://github.com/a5c-ai/agent-mux#readme) for full command documentation.
|
|
25
|
+
|
|
26
|
+
## License
|
|
27
|
+
|
|
28
|
+
MIT © a5c-ai
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bootstrap helper: registers all built-in agent adapters with a client.
|
|
3
|
+
*
|
|
4
|
+
* The core `AdapterRegistry` starts empty — adapters must be explicitly
|
|
5
|
+
* registered. This module centralises that wiring so the CLI (and any
|
|
6
|
+
* consumer) gets all 11 built-in adapters with a single call.
|
|
7
|
+
*/
|
|
8
|
+
import type { AgentMuxClient } from '@a5c-ai/agent-mux-core';
|
|
9
|
+
/**
|
|
10
|
+
* Registers every built-in adapter on the given client's adapter registry.
|
|
11
|
+
* Safe to call multiple times — `register()` replaces existing entries.
|
|
12
|
+
*/
|
|
13
|
+
export declare function registerBuiltInAdapters(client: AgentMuxClient): void;
|
|
14
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAiB7D;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CA+BpE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bootstrap helper: registers all built-in agent adapters with a client.
|
|
3
|
+
*
|
|
4
|
+
* The core `AdapterRegistry` starts empty — adapters must be explicitly
|
|
5
|
+
* registered. This module centralises that wiring so the CLI (and any
|
|
6
|
+
* consumer) gets all 11 built-in adapters with a single call.
|
|
7
|
+
*/
|
|
8
|
+
import { ClaudeAdapter, CodexAdapter, GeminiAdapter, CopilotAdapter, CursorAdapter, OpenCodeAdapter, PiAdapter, OmpAdapter, OpenClawAdapter, HermesAdapter, AgentMuxRemoteAdapter, QwenAdapter, } from '@a5c-ai/agent-mux-adapters';
|
|
9
|
+
/**
|
|
10
|
+
* Registers every built-in adapter on the given client's adapter registry.
|
|
11
|
+
* Safe to call multiple times — `register()` replaces existing entries.
|
|
12
|
+
*/
|
|
13
|
+
export function registerBuiltInAdapters(client) {
|
|
14
|
+
const adapters = [
|
|
15
|
+
new ClaudeAdapter(),
|
|
16
|
+
new CodexAdapter(),
|
|
17
|
+
new GeminiAdapter(),
|
|
18
|
+
new CopilotAdapter(),
|
|
19
|
+
new CursorAdapter(),
|
|
20
|
+
new OpenCodeAdapter(),
|
|
21
|
+
new PiAdapter(),
|
|
22
|
+
new OmpAdapter(),
|
|
23
|
+
new OpenClawAdapter(),
|
|
24
|
+
new HermesAdapter(),
|
|
25
|
+
new AgentMuxRemoteAdapter(),
|
|
26
|
+
new QwenAdapter(),
|
|
27
|
+
];
|
|
28
|
+
// Prefer `registerBuiltIn` on the impl so the `source` shows as 'built-in';
|
|
29
|
+
// fall back to the public `register()` (which marks as 'plugin') for any
|
|
30
|
+
// AdapterRegistry implementation that doesn't expose the built-in helper.
|
|
31
|
+
const registry = client.adapters;
|
|
32
|
+
for (const adapter of adapters) {
|
|
33
|
+
if (typeof registry.registerBuiltIn === 'function') {
|
|
34
|
+
registry.registerBuiltIn(adapter);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
registry.register(adapter);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,aAAa,EACb,YAAY,EACZ,aAAa,EACb,cAAc,EACd,aAAa,EACb,eAAe,EACf,SAAS,EACT,UAAU,EACV,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,WAAW,GACZ,MAAM,4BAA4B,CAAC;AAEpC;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAsB;IAC5D,MAAM,QAAQ,GAAmB;QAC/B,IAAI,aAAa,EAAE;QACnB,IAAI,YAAY,EAAE;QAClB,IAAI,aAAa,EAAE;QACnB,IAAI,cAAc,EAAE;QACpB,IAAI,aAAa,EAAE;QACnB,IAAI,eAAe,EAAE;QACrB,IAAI,SAAS,EAAE;QACf,IAAI,UAAU,EAAE;QAChB,IAAI,eAAe,EAAE;QACrB,IAAI,aAAa,EAAE;QACnB,IAAI,qBAAqB,EAAE;QAC3B,IAAI,WAAW,EAAE;KAClB,CAAC;IAEF,4EAA4E;IAC5E,yEAAyE;IACzE,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,MAAM,CAAC,QAGvB,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,QAAQ,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;YACnD,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `amux adapters` subcommands.
|
|
3
|
+
*
|
|
4
|
+
* @see docs/10-cli-reference.md Section 8
|
|
5
|
+
*/
|
|
6
|
+
import type { AgentMuxClient } from '@a5c-ai/agent-mux-core';
|
|
7
|
+
import type { ParsedArgs } from '../parse-args.js';
|
|
8
|
+
export declare function adaptersCommand(client: AgentMuxClient, args: ParsedArgs): Promise<number>;
|
|
9
|
+
//# sourceMappingURL=adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/commands/adapters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAOnD,wBAAsB,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAwC/F"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `amux adapters` subcommands.
|
|
3
|
+
*
|
|
4
|
+
* @see docs/10-cli-reference.md Section 8
|
|
5
|
+
*/
|
|
6
|
+
import { AgentMuxError } from '@a5c-ai/agent-mux-core';
|
|
7
|
+
import { flagBool, flagStr } from '../parse-args.js';
|
|
8
|
+
import { ExitCode, errorCodeToExitCode } from '../exit-codes.js';
|
|
9
|
+
import { printTable, printKeyValue, printJsonOk, printJsonError, printError, } from '../output.js';
|
|
10
|
+
export async function adaptersCommand(client, args) {
|
|
11
|
+
const sub = args.subcommand;
|
|
12
|
+
const jsonMode = flagBool(args.flags, 'json') === true;
|
|
13
|
+
if (!sub || sub === 'list') {
|
|
14
|
+
return adaptersList(client, jsonMode);
|
|
15
|
+
}
|
|
16
|
+
if (sub === 'detect') {
|
|
17
|
+
const agent = args.positionals[0] ?? flagStr(args.flags, 'agent');
|
|
18
|
+
if (!agent) {
|
|
19
|
+
if (jsonMode) {
|
|
20
|
+
printJsonError('VALIDATION_ERROR', 'Missing required argument: <agent>');
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
printError('Missing required argument: <agent>');
|
|
24
|
+
}
|
|
25
|
+
return ExitCode.USAGE_ERROR;
|
|
26
|
+
}
|
|
27
|
+
return adaptersDetect(client, agent, jsonMode);
|
|
28
|
+
}
|
|
29
|
+
if (sub === 'info') {
|
|
30
|
+
const agent = args.positionals[0] ?? flagStr(args.flags, 'agent');
|
|
31
|
+
if (!agent) {
|
|
32
|
+
if (jsonMode) {
|
|
33
|
+
printJsonError('VALIDATION_ERROR', 'Missing required argument: <agent>');
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
printError('Missing required argument: <agent>');
|
|
37
|
+
}
|
|
38
|
+
return ExitCode.USAGE_ERROR;
|
|
39
|
+
}
|
|
40
|
+
return adaptersInfo(client, agent, jsonMode);
|
|
41
|
+
}
|
|
42
|
+
if (jsonMode) {
|
|
43
|
+
printJsonError('VALIDATION_ERROR', `Unknown subcommand: adapters ${sub}`);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
printError(`Unknown subcommand: adapters ${sub}`);
|
|
47
|
+
}
|
|
48
|
+
return ExitCode.USAGE_ERROR;
|
|
49
|
+
}
|
|
50
|
+
async function adaptersList(client, jsonMode) {
|
|
51
|
+
try {
|
|
52
|
+
const adapters = client.adapters.list();
|
|
53
|
+
if (jsonMode) {
|
|
54
|
+
printJsonOk(adapters);
|
|
55
|
+
return ExitCode.SUCCESS;
|
|
56
|
+
}
|
|
57
|
+
const rows = adapters.map((a) => [
|
|
58
|
+
a.agent,
|
|
59
|
+
a.displayName ?? a.agent,
|
|
60
|
+
a.source ?? 'built-in',
|
|
61
|
+
]);
|
|
62
|
+
printTable(['Agent', 'Display Name', 'Source'], rows);
|
|
63
|
+
return ExitCode.SUCCESS;
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
return handleError(err, jsonMode);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async function adaptersDetect(client, agent, jsonMode) {
|
|
70
|
+
try {
|
|
71
|
+
const info = await client.adapters.detect(agent);
|
|
72
|
+
if (jsonMode) {
|
|
73
|
+
printJsonOk(info);
|
|
74
|
+
return ExitCode.SUCCESS;
|
|
75
|
+
}
|
|
76
|
+
if (!info) {
|
|
77
|
+
printKeyValue([
|
|
78
|
+
['Agent:', agent],
|
|
79
|
+
['Installed:', 'no'],
|
|
80
|
+
]);
|
|
81
|
+
return ExitCode.SUCCESS;
|
|
82
|
+
}
|
|
83
|
+
printKeyValue([
|
|
84
|
+
['Agent:', info.agent],
|
|
85
|
+
['Installed:', info.installed ? 'yes' : 'no'],
|
|
86
|
+
['Path:', info.cliPath ?? '--'],
|
|
87
|
+
['Version:', info.version ?? '--'],
|
|
88
|
+
]);
|
|
89
|
+
return ExitCode.SUCCESS;
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
return handleError(err, jsonMode);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async function adaptersInfo(client, agent, jsonMode) {
|
|
96
|
+
try {
|
|
97
|
+
const caps = client.adapters.capabilities(agent);
|
|
98
|
+
if (jsonMode) {
|
|
99
|
+
printJsonOk(caps);
|
|
100
|
+
return ExitCode.SUCCESS;
|
|
101
|
+
}
|
|
102
|
+
const entries = [];
|
|
103
|
+
for (const [key, value] of Object.entries(caps)) {
|
|
104
|
+
entries.push([`${key}:`, String(value)]);
|
|
105
|
+
}
|
|
106
|
+
printKeyValue(entries);
|
|
107
|
+
return ExitCode.SUCCESS;
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
return handleError(err, jsonMode);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function handleError(err, jsonMode) {
|
|
114
|
+
if (err instanceof AgentMuxError) {
|
|
115
|
+
if (jsonMode) {
|
|
116
|
+
printJsonError(err.code, err.message, err.recoverable);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
printError(err.message);
|
|
120
|
+
}
|
|
121
|
+
return errorCodeToExitCode(err.code);
|
|
122
|
+
}
|
|
123
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
124
|
+
if (jsonMode) {
|
|
125
|
+
printJsonError('INTERNAL', message);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
printError(message);
|
|
129
|
+
}
|
|
130
|
+
return ExitCode.GENERAL_ERROR;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/commands/adapters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `amux auth` subcommands.
|
|
3
|
+
*
|
|
4
|
+
* @see docs/10-cli-reference.md Section 18
|
|
5
|
+
*/
|
|
6
|
+
import type { AgentMuxClient } from '@a5c-ai/agent-mux-core';
|
|
7
|
+
import type { ParsedArgs } from '../parse-args.js';
|
|
8
|
+
export declare function authCommand(client: AgentMuxClient, args: ParsedArgs): Promise<number>;
|
|
9
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAOnD,wBAAsB,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAqC3F"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `amux auth` subcommands.
|
|
3
|
+
*
|
|
4
|
+
* @see docs/10-cli-reference.md Section 18
|
|
5
|
+
*/
|
|
6
|
+
import { AgentMuxError } from '@a5c-ai/agent-mux-core';
|
|
7
|
+
import { flagBool, flagStr } from '../parse-args.js';
|
|
8
|
+
import { ExitCode, errorCodeToExitCode } from '../exit-codes.js';
|
|
9
|
+
import { printTable, printKeyValue, printJsonOk, printJsonError, printError, toPlain, } from '../output.js';
|
|
10
|
+
export async function authCommand(client, args) {
|
|
11
|
+
const sub = args.subcommand;
|
|
12
|
+
const jsonMode = flagBool(args.flags, 'json') === true;
|
|
13
|
+
if (sub === 'check') {
|
|
14
|
+
const agent = args.positionals[0] ?? flagStr(args.flags, 'agent');
|
|
15
|
+
return authCheck(client, agent, jsonMode);
|
|
16
|
+
}
|
|
17
|
+
if (sub === 'setup') {
|
|
18
|
+
const agent = args.positionals[0] ?? flagStr(args.flags, 'agent');
|
|
19
|
+
if (!agent) {
|
|
20
|
+
if (jsonMode) {
|
|
21
|
+
printJsonError('VALIDATION_ERROR', 'Missing required argument: <agent>');
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
printError('Missing required argument: <agent>');
|
|
25
|
+
}
|
|
26
|
+
return ExitCode.USAGE_ERROR;
|
|
27
|
+
}
|
|
28
|
+
return authSetup(client, agent, jsonMode);
|
|
29
|
+
}
|
|
30
|
+
if (!sub) {
|
|
31
|
+
if (jsonMode) {
|
|
32
|
+
printJsonError('VALIDATION_ERROR', 'Missing subcommand. Available: check, setup');
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
printError('Missing subcommand. Available: check, setup');
|
|
36
|
+
}
|
|
37
|
+
return ExitCode.USAGE_ERROR;
|
|
38
|
+
}
|
|
39
|
+
if (jsonMode) {
|
|
40
|
+
printJsonError('VALIDATION_ERROR', `Unknown subcommand: auth ${sub}`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
printError(`Unknown subcommand: auth ${sub}`);
|
|
44
|
+
}
|
|
45
|
+
return ExitCode.USAGE_ERROR;
|
|
46
|
+
}
|
|
47
|
+
async function authCheck(client, agent, jsonMode) {
|
|
48
|
+
try {
|
|
49
|
+
if (agent) {
|
|
50
|
+
const state = await client.auth.check(agent);
|
|
51
|
+
if (jsonMode) {
|
|
52
|
+
printJsonOk(state);
|
|
53
|
+
return ExitCode.SUCCESS;
|
|
54
|
+
}
|
|
55
|
+
const s = toPlain(state);
|
|
56
|
+
printKeyValue([
|
|
57
|
+
['Agent:', agent],
|
|
58
|
+
['Status:', String(s['status'] ?? '--')],
|
|
59
|
+
['Method:', String(s['method'] ?? '--')],
|
|
60
|
+
['Identity:', String(s['identity'] ?? '--')],
|
|
61
|
+
]);
|
|
62
|
+
return ExitCode.SUCCESS;
|
|
63
|
+
}
|
|
64
|
+
// Check all agents
|
|
65
|
+
const allStates = await client.auth.checkAll();
|
|
66
|
+
if (jsonMode) {
|
|
67
|
+
printJsonOk(allStates);
|
|
68
|
+
return ExitCode.SUCCESS;
|
|
69
|
+
}
|
|
70
|
+
const entries = Object.entries(allStates);
|
|
71
|
+
const rows = entries.map(([name, state]) => {
|
|
72
|
+
const s = toPlain(state);
|
|
73
|
+
return [
|
|
74
|
+
name,
|
|
75
|
+
String(s['status'] ?? '--'),
|
|
76
|
+
String(s['method'] ?? '--'),
|
|
77
|
+
String(s['identity'] ?? '--'),
|
|
78
|
+
];
|
|
79
|
+
});
|
|
80
|
+
printTable(['Agent', 'Status', 'Method', 'Identity'], rows);
|
|
81
|
+
return ExitCode.SUCCESS;
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
return handleError(err, jsonMode);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async function authSetup(client, agent, jsonMode) {
|
|
88
|
+
try {
|
|
89
|
+
const guidance = await client.auth.getSetupGuidance(agent);
|
|
90
|
+
if (jsonMode) {
|
|
91
|
+
printJsonOk(guidance);
|
|
92
|
+
return ExitCode.SUCCESS;
|
|
93
|
+
}
|
|
94
|
+
const g = toPlain(guidance);
|
|
95
|
+
process.stdout.write(`Authentication setup for ${agent}\n\n`);
|
|
96
|
+
if (g['steps'] && Array.isArray(g['steps'])) {
|
|
97
|
+
const steps = g['steps'];
|
|
98
|
+
for (let i = 0; i < steps.length; i++) {
|
|
99
|
+
const step = steps[i];
|
|
100
|
+
process.stdout.write(`${i + 1}. ${step['description'] ?? step['instruction'] ?? String(step)}\n`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (g['envVars'] && Array.isArray(g['envVars'])) {
|
|
104
|
+
process.stdout.write('\nEnvironment variables:\n');
|
|
105
|
+
for (const v of g['envVars']) {
|
|
106
|
+
process.stdout.write(` ${v}\n`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (g['docsUrl']) {
|
|
110
|
+
process.stdout.write(`\nDocumentation: ${g['docsUrl']}\n`);
|
|
111
|
+
}
|
|
112
|
+
return ExitCode.SUCCESS;
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
return handleError(err, jsonMode);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function handleError(err, jsonMode) {
|
|
119
|
+
if (err instanceof AgentMuxError) {
|
|
120
|
+
if (jsonMode) {
|
|
121
|
+
printJsonError(err.code, err.message, err.recoverable);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
printError(err.message);
|
|
125
|
+
}
|
|
126
|
+
return errorCodeToExitCode(err.code);
|
|
127
|
+
}
|
|
128
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
129
|
+
if (jsonMode) {
|
|
130
|
+
printJsonError('INTERNAL', message);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
printError(message);
|
|
134
|
+
}
|
|
135
|
+
return ExitCode.GENERAL_ERROR;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `amux config` subcommands.
|
|
3
|
+
*
|
|
4
|
+
* @see docs/10-cli-reference.md Section 16
|
|
5
|
+
*/
|
|
6
|
+
import type { AgentMuxClient } from '@a5c-ai/agent-mux-core';
|
|
7
|
+
import type { ParsedArgs } from '../parse-args.js';
|
|
8
|
+
export declare function configCommand(client: AgentMuxClient, args: ParsedArgs): Promise<number>;
|
|
9
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAOnD,wBAAsB,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA+E7F"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `amux config` subcommands.
|
|
3
|
+
*
|
|
4
|
+
* @see docs/10-cli-reference.md Section 16
|
|
5
|
+
*/
|
|
6
|
+
import { AgentMuxError } from '@a5c-ai/agent-mux-core';
|
|
7
|
+
import { flagBool, flagStr } from '../parse-args.js';
|
|
8
|
+
import { ExitCode, errorCodeToExitCode } from '../exit-codes.js';
|
|
9
|
+
import { printJson, printJsonOk, printJsonError, printError, toPlain, } from '../output.js';
|
|
10
|
+
export async function configCommand(client, args) {
|
|
11
|
+
const sub = args.subcommand;
|
|
12
|
+
const jsonMode = flagBool(args.flags, 'json') === true;
|
|
13
|
+
if (sub === 'get') {
|
|
14
|
+
const agent = args.positionals[0] ?? flagStr(args.flags, 'agent');
|
|
15
|
+
if (!agent) {
|
|
16
|
+
if (jsonMode) {
|
|
17
|
+
printJsonError('VALIDATION_ERROR', 'Missing required argument: <agent>');
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
printError('Missing required argument: <agent>');
|
|
21
|
+
}
|
|
22
|
+
return ExitCode.USAGE_ERROR;
|
|
23
|
+
}
|
|
24
|
+
const field = args.positionals[1];
|
|
25
|
+
return configGet(client, agent, field, jsonMode);
|
|
26
|
+
}
|
|
27
|
+
if (sub === 'set') {
|
|
28
|
+
const agent = args.positionals[0];
|
|
29
|
+
const field = args.positionals[1];
|
|
30
|
+
const value = args.positionals[2];
|
|
31
|
+
if (!agent || !field || value === undefined) {
|
|
32
|
+
if (jsonMode) {
|
|
33
|
+
printJsonError('VALIDATION_ERROR', 'Usage: amux config set <agent> <field> <value>');
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
printError('Usage: amux config set <agent> <field> <value>');
|
|
37
|
+
}
|
|
38
|
+
return ExitCode.USAGE_ERROR;
|
|
39
|
+
}
|
|
40
|
+
return configSet(client, agent, field, value, jsonMode);
|
|
41
|
+
}
|
|
42
|
+
if (sub === 'schema') {
|
|
43
|
+
const agent = args.positionals[0] ?? flagStr(args.flags, 'agent');
|
|
44
|
+
if (!agent) {
|
|
45
|
+
if (jsonMode) {
|
|
46
|
+
printJsonError('VALIDATION_ERROR', 'Missing required argument: <agent>');
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
printError('Missing required argument: <agent>');
|
|
50
|
+
}
|
|
51
|
+
return ExitCode.USAGE_ERROR;
|
|
52
|
+
}
|
|
53
|
+
return configSchema(client, agent, jsonMode);
|
|
54
|
+
}
|
|
55
|
+
if (sub === 'validate') {
|
|
56
|
+
const agent = args.positionals[0] ?? flagStr(args.flags, 'agent');
|
|
57
|
+
if (!agent) {
|
|
58
|
+
if (jsonMode) {
|
|
59
|
+
printJsonError('VALIDATION_ERROR', 'Missing required argument: <agent>');
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
printError('Missing required argument: <agent>');
|
|
63
|
+
}
|
|
64
|
+
return ExitCode.USAGE_ERROR;
|
|
65
|
+
}
|
|
66
|
+
return configValidate(client, agent, jsonMode);
|
|
67
|
+
}
|
|
68
|
+
if (sub === 'reload') {
|
|
69
|
+
const agent = args.positionals[0] ?? flagStr(args.flags, 'agent');
|
|
70
|
+
return configReload(client, agent, jsonMode);
|
|
71
|
+
}
|
|
72
|
+
if (!sub) {
|
|
73
|
+
if (jsonMode) {
|
|
74
|
+
printJsonError('VALIDATION_ERROR', 'Missing subcommand. Available: get, set, schema, validate, reload');
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
printError('Missing subcommand. Available: get, set, schema, validate, reload');
|
|
78
|
+
}
|
|
79
|
+
return ExitCode.USAGE_ERROR;
|
|
80
|
+
}
|
|
81
|
+
if (jsonMode) {
|
|
82
|
+
printJsonError('VALIDATION_ERROR', `Unknown subcommand: config ${sub}`);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
printError(`Unknown subcommand: config ${sub}`);
|
|
86
|
+
}
|
|
87
|
+
return ExitCode.USAGE_ERROR;
|
|
88
|
+
}
|
|
89
|
+
async function configGet(client, agent, field, jsonMode) {
|
|
90
|
+
try {
|
|
91
|
+
let result;
|
|
92
|
+
if (field) {
|
|
93
|
+
result = await client.config.getField(agent, field);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
result = await client.config.get(agent);
|
|
97
|
+
}
|
|
98
|
+
if (jsonMode) {
|
|
99
|
+
// Ensure `data` key is present even when the field is missing, so
|
|
100
|
+
// consumers can rely on a consistent { ok, data } shape.
|
|
101
|
+
printJsonOk(result === undefined ? null : result);
|
|
102
|
+
}
|
|
103
|
+
else if (typeof result === 'object' && result !== null) {
|
|
104
|
+
printJson(result);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
process.stdout.write(String(result) + '\n');
|
|
108
|
+
}
|
|
109
|
+
return ExitCode.SUCCESS;
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
return handleError(err, jsonMode);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async function configSet(client, agent, field, rawValue, jsonMode) {
|
|
116
|
+
try {
|
|
117
|
+
// Parse value: JSON if it starts with {, [, ", or is a number/boolean
|
|
118
|
+
let value = rawValue;
|
|
119
|
+
if (rawValue.startsWith('{') || rawValue.startsWith('[') || rawValue.startsWith('"') ||
|
|
120
|
+
rawValue === 'true' || rawValue === 'false' || rawValue === 'null' ||
|
|
121
|
+
!Number.isNaN(Number(rawValue))) {
|
|
122
|
+
try {
|
|
123
|
+
value = JSON.parse(rawValue);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// Keep as string
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
await client.config.setField(agent, field, value);
|
|
130
|
+
if (jsonMode) {
|
|
131
|
+
printJsonOk({ agent, field, value });
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
process.stdout.write(`Set ${agent}.${field} = ${JSON.stringify(value)}\n`);
|
|
135
|
+
}
|
|
136
|
+
return ExitCode.SUCCESS;
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
return handleError(err, jsonMode);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async function configSchema(client, agent, jsonMode) {
|
|
143
|
+
try {
|
|
144
|
+
const schema = await client.config.schema(agent);
|
|
145
|
+
if (jsonMode) {
|
|
146
|
+
printJsonOk(schema);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
printJson(schema);
|
|
150
|
+
}
|
|
151
|
+
return ExitCode.SUCCESS;
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
return handleError(err, jsonMode);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async function configValidate(client, agent, jsonMode) {
|
|
158
|
+
try {
|
|
159
|
+
const config = await client.config.get(agent);
|
|
160
|
+
const result = await client.config.validate(agent, config);
|
|
161
|
+
if (jsonMode) {
|
|
162
|
+
printJsonOk(result);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
const r = toPlain(result);
|
|
166
|
+
if (r['valid']) {
|
|
167
|
+
process.stdout.write('Configuration is valid.\n');
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
const errors = (r['errors'] ?? []);
|
|
171
|
+
for (const e of errors) {
|
|
172
|
+
process.stderr.write(` ${e['field']}: ${e['message']}\n`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return ExitCode.SUCCESS;
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
return handleError(err, jsonMode);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async function configReload(client, agent, jsonMode) {
|
|
183
|
+
try {
|
|
184
|
+
if (agent) {
|
|
185
|
+
await client.config.reload(agent);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
await client.config.reload();
|
|
189
|
+
}
|
|
190
|
+
if (jsonMode) {
|
|
191
|
+
printJsonOk({ reloaded: agent ?? 'all' });
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
process.stdout.write(`Configuration reloaded${agent ? ` for ${agent}` : ''}.\n`);
|
|
195
|
+
}
|
|
196
|
+
return ExitCode.SUCCESS;
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
return handleError(err, jsonMode);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function handleError(err, jsonMode) {
|
|
203
|
+
if (err instanceof AgentMuxError) {
|
|
204
|
+
if (jsonMode) {
|
|
205
|
+
printJsonError(err.code, err.message, err.recoverable);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
printError(err.message);
|
|
209
|
+
}
|
|
210
|
+
return errorCodeToExitCode(err.code);
|
|
211
|
+
}
|
|
212
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
213
|
+
if (jsonMode) {
|
|
214
|
+
printJsonError('INTERNAL', message);
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
printError(message);
|
|
218
|
+
}
|
|
219
|
+
return ExitCode.GENERAL_ERROR;
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=config.js.map
|