@tvps/agw-client-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +31 -0
- package/README.md +126 -0
- package/dist/bin/agw-client-cli.d.ts +2 -0
- package/dist/bin/agw-client-cli.js +5 -0
- package/dist/bin/agw-client-cli.js.map +1 -0
- package/dist/binaries.d.ts +4 -0
- package/dist/binaries.js +27 -0
- package/dist/binaries.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.js +295 -0
- package/dist/cli.js.map +1 -0
- package/dist/fs.d.ts +18 -0
- package/dist/fs.js +123 -0
- package/dist/fs.js.map +1 -0
- package/dist/gateway.d.ts +30 -0
- package/dist/gateway.js +257 -0
- package/dist/gateway.js.map +1 -0
- package/dist/models.d.ts +14 -0
- package/dist/models.js +113 -0
- package/dist/models.js.map +1 -0
- package/dist/paths.d.ts +7 -0
- package/dist/paths.js +36 -0
- package/dist/paths.js.map +1 -0
- package/dist/prompts.d.ts +22 -0
- package/dist/prompts.js +178 -0
- package/dist/prompts.js.map +1 -0
- package/dist/state.d.ts +4 -0
- package/dist/state.js +19 -0
- package/dist/state.js.map +1 -0
- package/dist/types.d.ts +95 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/dist/writers/claude.d.ts +22 -0
- package/dist/writers/claude.js +31 -0
- package/dist/writers/claude.js.map +1 -0
- package/dist/writers/codex.d.ts +26 -0
- package/dist/writers/codex.js +96 -0
- package/dist/writers/codex.js.map +1 -0
- package/package.json +55 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# AGW Client CLI
|
|
2
|
+
|
|
3
|
+
Standalone npm package for configuring Claude Code CLI and Codex CLI against Agent Gateway with pasted virtual keys.
|
|
4
|
+
|
|
5
|
+
Published as `@tvps/agw-client-cli` (scoped public package on npmjs.com).
|
|
6
|
+
|
|
7
|
+
## Distribution
|
|
8
|
+
|
|
9
|
+
- **Package name:** `@tvps/agw-client-cli` (scoped under `@tvps` organization)
|
|
10
|
+
- **publishConfig.access:** `public` — ensures scoped package is publicly installable
|
|
11
|
+
- **Prepack flow:** `npm run build` runs before publish, so the `dist/` directory is always fresh
|
|
12
|
+
- **Version codegen:** The build includes a `prebuild` step that runs `scripts/gen-version.cjs`, which reads `package.json.version` and generates `src/version.ts` with the matching version constant. This eliminates version drift between the package manifest and CLI `--version` output. The generated file is committed to git and will be overwritten on every build.
|
|
13
|
+
|
|
14
|
+
## Commands
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm run typecheck
|
|
18
|
+
npm run lint
|
|
19
|
+
npm run test
|
|
20
|
+
npm run build
|
|
21
|
+
npm pack --dry-run
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Conventions
|
|
25
|
+
|
|
26
|
+
- Keep the package publishable outside the monorepo.
|
|
27
|
+
- Do not import from `agw-client/`; copy small config-writer behavior when needed.
|
|
28
|
+
- Do not write shell rc snippets, OTel config, MDM baggage headers, or Google SSO flows.
|
|
29
|
+
- Config writes are full replacements with one-time sibling `.egw-backup` restore behavior.
|
|
30
|
+
- Tests must mock gateway traffic and must not require a real gateway.
|
|
31
|
+
- The `--version` flag is **required** — Homebrew Formula `test do` block depends on it.
|
package/README.md
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# agw-client-cli
|
|
2
|
+
|
|
3
|
+
Interactive npm/npx setup for Claude Code CLI and Codex CLI using an existing
|
|
4
|
+
Agent Gateway virtual key.
|
|
5
|
+
|
|
6
|
+
This package is intentionally smaller than the Electron `agw-client` app:
|
|
7
|
+
|
|
8
|
+
- virtual-key only; it does not sign in with Google SSO
|
|
9
|
+
- Claude Code CLI and Codex CLI only; no Claude Cowork support
|
|
10
|
+
- no shell rc snippets, OTel config, MDM baggage headers, or helper session
|
|
11
|
+
- full replacement writes with one-time `.egw-backup` sibling backups
|
|
12
|
+
|
|
13
|
+
## Install
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install -g @tvps/agw-client-cli
|
|
17
|
+
agw-client-cli setup
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Or run without installing:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npx @tvps/agw-client-cli setup
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
`setup`, `switch`, and `uninstall` require an interactive terminal.
|
|
27
|
+
|
|
28
|
+
### Package Details
|
|
29
|
+
|
|
30
|
+
This package is published as `@tvps/agw-client-cli` (scoped under the `@tvps` organization). The scoped name is required when installing globally or running via npx.
|
|
31
|
+
|
|
32
|
+
## Setup
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
agw-client-cli setup
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The wizard asks for:
|
|
39
|
+
|
|
40
|
+
- gateway URL, for example `https://gateway.example.com`
|
|
41
|
+
- virtual key copied from the AGW Admin virtual-key screen
|
|
42
|
+
- targets to enable: Claude Code CLI, Codex CLI, or both
|
|
43
|
+
- provider/model choices fetched live from the gateway
|
|
44
|
+
|
|
45
|
+
Setup blocks if the selected target binary is missing from `PATH`. It then
|
|
46
|
+
fetches Kiro and Codex model lists and sends tiny generation probes with the
|
|
47
|
+
prompt `Reply with OK.` through all four paths:
|
|
48
|
+
|
|
49
|
+
- `/kiro/anthropic/v1/messages`
|
|
50
|
+
- `/kiro/openai/v1/responses`
|
|
51
|
+
- `/codex/anthropic/v1/messages`
|
|
52
|
+
- `/codex/openai/v1/responses`
|
|
53
|
+
|
|
54
|
+
Those probes verify that the key works through the gateway. They are real model
|
|
55
|
+
requests, so they can consume upstream quota and create gateway audit rows.
|
|
56
|
+
|
|
57
|
+
## Commands
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
agw-client-cli switch
|
|
61
|
+
agw-client-cli status
|
|
62
|
+
agw-client-cli models
|
|
63
|
+
agw-client-cli uninstall
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
`switch` interactively changes one target to Kiro, Codex, or official/direct
|
|
67
|
+
mode. Official/direct mode restores the `.egw-backup` file if it exists; if no
|
|
68
|
+
backup exists, it deletes the gateway-managed config so the upstream client can
|
|
69
|
+
fall back to its normal official configuration. The stored virtual key is kept
|
|
70
|
+
so you can switch back later.
|
|
71
|
+
|
|
72
|
+
`status` prints local config paths, binary status, and always runs the model
|
|
73
|
+
list plus tiny generation probes. This is useful for diagnosis but can consume
|
|
74
|
+
upstream quota.
|
|
75
|
+
|
|
76
|
+
`models` fetches both Kiro and Codex every time and prints grouped model lists
|
|
77
|
+
for verbose, OpenAI, and Anthropic formats.
|
|
78
|
+
|
|
79
|
+
`uninstall` restores or deletes Claude and Codex configs, then deletes the CLI
|
|
80
|
+
state file and stored virtual key.
|
|
81
|
+
|
|
82
|
+
## Files
|
|
83
|
+
|
|
84
|
+
State is stored as plaintext JSON:
|
|
85
|
+
|
|
86
|
+
- macOS: `~/Library/Application Support/agw-client-cli/state.json`
|
|
87
|
+
- Linux: `${XDG_CONFIG_HOME:-~/.config}/agw-client-cli/state.json`
|
|
88
|
+
- Windows: `%LOCALAPPDATA%\agw-client-cli\state.json`
|
|
89
|
+
|
|
90
|
+
Config files are full replacements:
|
|
91
|
+
|
|
92
|
+
- Claude Code CLI: `~/.claude/settings.json`
|
|
93
|
+
- Codex CLI: `~/.codex/config.toml`
|
|
94
|
+
|
|
95
|
+
On first write, an existing config is moved to a sibling backup:
|
|
96
|
+
|
|
97
|
+
- `~/.claude/settings.json.egw-backup`
|
|
98
|
+
- `~/.codex/config.toml.egw-backup`
|
|
99
|
+
|
|
100
|
+
Files containing secrets are written with `0600` permissions where the platform
|
|
101
|
+
supports POSIX modes.
|
|
102
|
+
|
|
103
|
+
## Codex Config Contract
|
|
104
|
+
|
|
105
|
+
Codex CLI uses the OpenAI Responses-compatible gateway routes. Provider blocks
|
|
106
|
+
use:
|
|
107
|
+
|
|
108
|
+
```toml
|
|
109
|
+
base_url = "https://gateway.example.com/kiro/openai/v1"
|
|
110
|
+
experimental_bearer_token = "<virtual-key>"
|
|
111
|
+
wire_api = "responses"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
The Codex provider uses `/codex/openai/v1`. The CLI does not use `env_key`,
|
|
115
|
+
shell exports, OTel sections, or custom baggage headers.
|
|
116
|
+
|
|
117
|
+
## Development
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
npm install
|
|
121
|
+
npm run typecheck
|
|
122
|
+
npm run lint
|
|
123
|
+
npm run test
|
|
124
|
+
npm run build
|
|
125
|
+
npm pack --dry-run
|
|
126
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agw-client-cli.js","sourceRoot":"","sources":["../../src/bin/agw-client-cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,CAAC;AAC1B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC"}
|
package/dist/binaries.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
const BINARIES = {
|
|
5
|
+
claude: "claude",
|
|
6
|
+
codex: "codex",
|
|
7
|
+
};
|
|
8
|
+
export async function commandExists(command) {
|
|
9
|
+
const lookup = process.platform === "win32" ? "where" : "which";
|
|
10
|
+
try {
|
|
11
|
+
await execFileAsync(lookup, [command]);
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function assertTargetBinary(target) {
|
|
19
|
+
const binary = BINARIES[target];
|
|
20
|
+
if (!(await commandExists(binary))) {
|
|
21
|
+
throw new Error(`Missing ${binary} on PATH. Install ${binary} before enabling the ${target} target.`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function binaryName(target) {
|
|
25
|
+
return BINARIES[target];
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=binaries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binaries.js","sourceRoot":"","sources":["../src/binaries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,QAAQ,GAA2B;IACvC,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAc;IACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,CAAC,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,qBAAqB,MAAM,wBAAwB,MAAM,UAAU,CAAC,CAAC;IACxG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CommandIO } from "./types.js";
|
|
2
|
+
export declare function main(argv?: string[], io?: CommandIO): Promise<number>;
|
|
3
|
+
export declare function setupCommand(io: CommandIO): Promise<void>;
|
|
4
|
+
export declare function switchCommand(io: CommandIO): Promise<void>;
|
|
5
|
+
export declare function statusCommand(io: CommandIO): Promise<void>;
|
|
6
|
+
export declare function modelsCommand(io: CommandIO): Promise<void>;
|
|
7
|
+
export declare function uninstallCommand(io: CommandIO): Promise<void>;
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { assertTargetBinary, binaryName } from "./binaries.js";
|
|
2
|
+
import { formatCatalog } from "./models.js";
|
|
3
|
+
import { resolveRuntimePaths } from "./paths.js";
|
|
4
|
+
import { assertInteractive, confirm, confirmSetupSummary, promptClaudeSelection, promptCodexSelection, promptGatewayUrl, promptProvider, promptTargetForSwitch, promptTargets, promptVirtualKey, targetsFromStateOrDefault, } from "./prompts.js";
|
|
5
|
+
import { deleteState, loadState, saveState } from "./state.js";
|
|
6
|
+
import { CLIENT_VERSION, TARGETS } from "./types.js";
|
|
7
|
+
import { GatewayClient, normalizeGatewayUrl, runFullProbeMatrix } from "./gateway.js";
|
|
8
|
+
import { restoreClaudeConfig, writeClaudeConfig } from "./writers/claude.js";
|
|
9
|
+
import { restoreCodexConfig, writeCodexConfig, writeCodexModelCatalog } from "./writers/codex.js";
|
|
10
|
+
const HELP = `agw-client-cli
|
|
11
|
+
|
|
12
|
+
Usage:
|
|
13
|
+
agw-client-cli setup
|
|
14
|
+
agw-client-cli switch
|
|
15
|
+
agw-client-cli status
|
|
16
|
+
agw-client-cli models
|
|
17
|
+
agw-client-cli uninstall
|
|
18
|
+
|
|
19
|
+
setup and switch are interactive-only in v1.`;
|
|
20
|
+
export async function main(argv = process.argv.slice(2), io = {
|
|
21
|
+
stdin: process.stdin,
|
|
22
|
+
stdout: process.stdout,
|
|
23
|
+
stderr: process.stderr,
|
|
24
|
+
}) {
|
|
25
|
+
const command = argv[0] ?? "help";
|
|
26
|
+
try {
|
|
27
|
+
switch (command) {
|
|
28
|
+
case "setup":
|
|
29
|
+
assertInteractive(io.stdin, io.stdout, "setup");
|
|
30
|
+
await setupCommand(io);
|
|
31
|
+
return 0;
|
|
32
|
+
case "switch":
|
|
33
|
+
assertInteractive(io.stdin, io.stdout, "switch");
|
|
34
|
+
await switchCommand(io);
|
|
35
|
+
return 0;
|
|
36
|
+
case "status":
|
|
37
|
+
await statusCommand(io);
|
|
38
|
+
return 0;
|
|
39
|
+
case "models":
|
|
40
|
+
await modelsCommand(io);
|
|
41
|
+
return 0;
|
|
42
|
+
case "uninstall":
|
|
43
|
+
assertInteractive(io.stdin, io.stdout, "uninstall");
|
|
44
|
+
await uninstallCommand(io);
|
|
45
|
+
return 0;
|
|
46
|
+
case "-v":
|
|
47
|
+
case "--version":
|
|
48
|
+
io.stdout.write(`${CLIENT_VERSION}\n`);
|
|
49
|
+
return 0;
|
|
50
|
+
case "-h":
|
|
51
|
+
case "--help":
|
|
52
|
+
case "help":
|
|
53
|
+
io.stdout.write(`${HELP}\n`);
|
|
54
|
+
return 0;
|
|
55
|
+
default:
|
|
56
|
+
throw new Error(`Unknown command: ${command}\n\n${HELP}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
io.stderr.write(`Error: ${err.message}\n`);
|
|
61
|
+
return 1;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export async function setupCommand(io) {
|
|
65
|
+
const paths = resolveRuntimePaths();
|
|
66
|
+
const gatewayUrl = await promptGatewayUrl();
|
|
67
|
+
const virtualKey = await promptVirtualKey();
|
|
68
|
+
const enabledTargets = await promptTargets();
|
|
69
|
+
io.stdout.write("Fetching gateway models and running virtual-key probes. This sends tiny generation requests.\n");
|
|
70
|
+
const client = new GatewayClient(gatewayUrl, virtualKey);
|
|
71
|
+
const { catalog, summary } = await runFullProbeMatrix(client);
|
|
72
|
+
if (!summary.ok) {
|
|
73
|
+
throw new Error(`Gateway probe failed:\n${formatProbeSummary(summary)}`);
|
|
74
|
+
}
|
|
75
|
+
const existing = await loadState(paths).catch(() => null);
|
|
76
|
+
const selections = {
|
|
77
|
+
claude: enabledTargets.includes("claude")
|
|
78
|
+
? await promptClaudeSelection(catalog, existing?.selections.claude, { allowOfficial: true })
|
|
79
|
+
: existing?.selections.claude,
|
|
80
|
+
codex: enabledTargets.includes("codex")
|
|
81
|
+
? await promptCodexSelection(catalog, existing?.selections.codex, { allowOfficial: true })
|
|
82
|
+
: existing?.selections.codex,
|
|
83
|
+
};
|
|
84
|
+
const ok = await confirmSetupSummary(buildSetupSummary(gatewayUrl, enabledTargets, selections));
|
|
85
|
+
if (!ok)
|
|
86
|
+
throw new Error("Setup cancelled.");
|
|
87
|
+
const state = {
|
|
88
|
+
version: CLIENT_VERSION,
|
|
89
|
+
gatewayUrl,
|
|
90
|
+
virtualKey,
|
|
91
|
+
enabledTargets,
|
|
92
|
+
selections,
|
|
93
|
+
configPaths: {
|
|
94
|
+
claudeConfig: paths.claudeConfig,
|
|
95
|
+
codexConfig: paths.codexConfig,
|
|
96
|
+
codexModelCatalog: paths.codexModelCatalog,
|
|
97
|
+
},
|
|
98
|
+
lastWritten: existing?.lastWritten ?? {},
|
|
99
|
+
lastProbe: summary,
|
|
100
|
+
};
|
|
101
|
+
await applySelectedTargets(paths, state, catalog, enabledTargets);
|
|
102
|
+
const postWrite = await runFullProbeMatrix(client);
|
|
103
|
+
state.lastProbe = postWrite.summary;
|
|
104
|
+
await saveState(paths, state);
|
|
105
|
+
if (!postWrite.summary.ok) {
|
|
106
|
+
throw new Error(`Setup wrote configs, but the post-write gateway probe failed:\n${formatProbeSummary(postWrite.summary)}`);
|
|
107
|
+
}
|
|
108
|
+
io.stdout.write(`Setup complete.\n${formatProbeSummary(postWrite.summary)}\n`);
|
|
109
|
+
}
|
|
110
|
+
export async function switchCommand(io) {
|
|
111
|
+
const paths = resolveRuntimePaths();
|
|
112
|
+
const state = await requireState(paths);
|
|
113
|
+
const target = await promptTargetForSwitch();
|
|
114
|
+
const provider = await promptProvider(target);
|
|
115
|
+
if (provider === "official") {
|
|
116
|
+
await restoreTarget(paths, state, target);
|
|
117
|
+
if (target === "claude") {
|
|
118
|
+
state.selections.claude = { provider };
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
state.selections.codex = { provider };
|
|
122
|
+
}
|
|
123
|
+
state.enabledTargets = [...new Set([...state.enabledTargets, target])];
|
|
124
|
+
await saveState(paths, state);
|
|
125
|
+
io.stdout.write(`${target} restored to official/direct behavior.\n`);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const gatewayUrl = normalizeGatewayUrl(state.gatewayUrl);
|
|
129
|
+
io.stdout.write("Fetching gateway models for switch.\n");
|
|
130
|
+
const client = new GatewayClient(gatewayUrl, state.virtualKey);
|
|
131
|
+
const catalog = await client.fetchModelCatalog();
|
|
132
|
+
if (target === "claude") {
|
|
133
|
+
state.selections.claude = await promptClaudeSelection(catalog, {
|
|
134
|
+
...state.selections.claude,
|
|
135
|
+
provider,
|
|
136
|
+
}, { provider });
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
state.selections.codex = await promptCodexSelection(catalog, {
|
|
140
|
+
...state.selections.codex,
|
|
141
|
+
provider,
|
|
142
|
+
}, { provider });
|
|
143
|
+
}
|
|
144
|
+
state.enabledTargets = [...new Set([...state.enabledTargets, target])];
|
|
145
|
+
await applySelectedTargets(paths, state, catalog, [target]);
|
|
146
|
+
const { summary } = await runFullProbeMatrix(client);
|
|
147
|
+
state.lastProbe = summary;
|
|
148
|
+
await saveState(paths, state);
|
|
149
|
+
if (!summary.ok) {
|
|
150
|
+
throw new Error(`${target} was written, but the post-write gateway probe failed:\n${formatProbeSummary(summary)}`);
|
|
151
|
+
}
|
|
152
|
+
io.stdout.write(`${target} switched.\n${formatProbeSummary(summary)}\n`);
|
|
153
|
+
}
|
|
154
|
+
export async function statusCommand(io) {
|
|
155
|
+
const paths = resolveRuntimePaths();
|
|
156
|
+
const state = await loadState(paths);
|
|
157
|
+
io.stdout.write("AGW Client CLI status\n");
|
|
158
|
+
io.stdout.write(`State: ${state ? paths.stateFile : "not configured"}\n`);
|
|
159
|
+
io.stdout.write(`Claude config: ${paths.claudeConfig}\n`);
|
|
160
|
+
io.stdout.write(`Codex config: ${paths.codexConfig}\n`);
|
|
161
|
+
for (const target of TARGETS) {
|
|
162
|
+
const exists = await binaryStatus(target);
|
|
163
|
+
io.stdout.write(`${target} binary (${binaryName(target)}): ${exists ? "found" : "missing"}\n`);
|
|
164
|
+
}
|
|
165
|
+
if (!state)
|
|
166
|
+
return;
|
|
167
|
+
io.stdout.write(`Gateway: ${state.gatewayUrl}\n`);
|
|
168
|
+
io.stdout.write(`Enabled targets: ${targetsFromStateOrDefault(state.enabledTargets).join(", ")}\n`);
|
|
169
|
+
io.stdout.write("Gateway status runs model-list and tiny generation probes, which may consume upstream quota.\n");
|
|
170
|
+
const client = new GatewayClient(state.gatewayUrl, state.virtualKey);
|
|
171
|
+
const { summary } = await runFullProbeMatrix(client);
|
|
172
|
+
state.lastProbe = summary;
|
|
173
|
+
await saveState(paths, state);
|
|
174
|
+
io.stdout.write(`${formatProbeSummary(summary)}\n`);
|
|
175
|
+
}
|
|
176
|
+
export async function modelsCommand(io) {
|
|
177
|
+
const paths = resolveRuntimePaths();
|
|
178
|
+
const state = await requireState(paths);
|
|
179
|
+
const client = new GatewayClient(state.gatewayUrl, state.virtualKey);
|
|
180
|
+
const catalog = await client.fetchModelCatalog();
|
|
181
|
+
io.stdout.write(`${formatCatalog(catalog)}\n`);
|
|
182
|
+
}
|
|
183
|
+
export async function uninstallCommand(io) {
|
|
184
|
+
const paths = resolveRuntimePaths();
|
|
185
|
+
const state = await loadState(paths);
|
|
186
|
+
if (!state) {
|
|
187
|
+
io.stdout.write("agw-client-cli is not configured.\n");
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const ok = await confirm("Restore/delete Claude and Codex configs, then delete CLI state and stored virtual key?", false);
|
|
191
|
+
if (!ok)
|
|
192
|
+
throw new Error("Uninstall cancelled.");
|
|
193
|
+
await restoreTarget(paths, state, "claude");
|
|
194
|
+
await restoreTarget(paths, state, "codex");
|
|
195
|
+
await deleteState(paths);
|
|
196
|
+
io.stdout.write("Uninstalled agw-client-cli state and restored/deleted managed configs.\n");
|
|
197
|
+
}
|
|
198
|
+
async function applySelectedTargets(paths, state, catalog, targets) {
|
|
199
|
+
for (const target of targets) {
|
|
200
|
+
await assertTargetBinary(target);
|
|
201
|
+
}
|
|
202
|
+
if (targets.includes("claude") && state.selections.claude?.provider === "official") {
|
|
203
|
+
await restoreTarget(paths, state, "claude");
|
|
204
|
+
await saveState(paths, state);
|
|
205
|
+
}
|
|
206
|
+
else if (targets.includes("claude")) {
|
|
207
|
+
const selection = state.selections.claude;
|
|
208
|
+
if (!selection?.provider || !selection.opusModel || !selection.sonnetModel || !selection.haikuModel) {
|
|
209
|
+
throw new Error("Claude selection is incomplete.");
|
|
210
|
+
}
|
|
211
|
+
const result = await writeClaudeConfig(paths, {
|
|
212
|
+
gatewayUrl: state.gatewayUrl,
|
|
213
|
+
virtualKey: state.virtualKey,
|
|
214
|
+
selection: selection,
|
|
215
|
+
previousSha256: state.lastWritten.claudeConfigSha256,
|
|
216
|
+
confirmDrift: (message) => confirm(message, false),
|
|
217
|
+
});
|
|
218
|
+
state.lastWritten.claudeConfigSha256 = result.sha256;
|
|
219
|
+
await saveState(paths, state);
|
|
220
|
+
}
|
|
221
|
+
if (targets.includes("codex") && state.selections.codex?.provider === "official") {
|
|
222
|
+
await restoreTarget(paths, state, "codex");
|
|
223
|
+
await saveState(paths, state);
|
|
224
|
+
}
|
|
225
|
+
else if (targets.includes("codex")) {
|
|
226
|
+
const selection = state.selections.codex;
|
|
227
|
+
if (!selection?.provider || !selection.model) {
|
|
228
|
+
throw new Error("Codex selection is incomplete.");
|
|
229
|
+
}
|
|
230
|
+
const catalogResult = await writeCodexModelCatalog(paths, catalog);
|
|
231
|
+
const result = await writeCodexConfig(paths, {
|
|
232
|
+
gatewayUrl: state.gatewayUrl,
|
|
233
|
+
virtualKey: state.virtualKey,
|
|
234
|
+
selection: selection,
|
|
235
|
+
previousSha256: state.lastWritten.codexConfigSha256,
|
|
236
|
+
confirmDrift: (message) => confirm(message, false),
|
|
237
|
+
});
|
|
238
|
+
state.lastWritten.codexModelCatalogSha256 = catalogResult.sha256;
|
|
239
|
+
state.lastWritten.codexConfigSha256 = result.sha256;
|
|
240
|
+
await saveState(paths, state);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
async function restoreTarget(paths, state, target) {
|
|
244
|
+
if (target === "claude") {
|
|
245
|
+
await restoreClaudeConfig(paths, {
|
|
246
|
+
previousSha256: state.lastWritten.claudeConfigSha256,
|
|
247
|
+
confirmDrift: (message) => confirm(message, false),
|
|
248
|
+
});
|
|
249
|
+
state.lastWritten.claudeConfigSha256 = undefined;
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
await restoreCodexConfig(paths, {
|
|
253
|
+
previousSha256: state.lastWritten.codexConfigSha256,
|
|
254
|
+
confirmDrift: (message) => confirm(message, false),
|
|
255
|
+
});
|
|
256
|
+
state.lastWritten.codexConfigSha256 = undefined;
|
|
257
|
+
state.lastWritten.codexModelCatalogSha256 = undefined;
|
|
258
|
+
}
|
|
259
|
+
async function requireState(paths) {
|
|
260
|
+
const state = await loadState(paths);
|
|
261
|
+
if (!state) {
|
|
262
|
+
throw new Error("agw-client-cli is not set up yet. Run `agw-client-cli setup` first.");
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
...state,
|
|
266
|
+
gatewayUrl: normalizeGatewayUrl(state.gatewayUrl),
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
async function binaryStatus(target) {
|
|
270
|
+
try {
|
|
271
|
+
await assertTargetBinary(target);
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
function buildSetupSummary(gatewayUrl, targets, selections) {
|
|
279
|
+
const lines = [`Gateway: ${gatewayUrl}`, `Targets: ${targets.join(", ")}`];
|
|
280
|
+
if (selections.claude && targets.includes("claude")) {
|
|
281
|
+
lines.push(`Claude: ${selections.claude.provider} opus=${selections.claude.opusModel} sonnet=${selections.claude.sonnetModel} haiku=${selections.claude.haikuModel}`);
|
|
282
|
+
}
|
|
283
|
+
if (selections.codex && targets.includes("codex")) {
|
|
284
|
+
lines.push(`Codex: ${selections.codex.provider} model=${selections.codex.model}`);
|
|
285
|
+
}
|
|
286
|
+
return lines.join("\n");
|
|
287
|
+
}
|
|
288
|
+
function formatProbeSummary(summary) {
|
|
289
|
+
const lines = [`Probe: ${summary.ok ? "ok" : "failed"}`];
|
|
290
|
+
for (const step of summary.steps) {
|
|
291
|
+
lines.push(`- ${step.ok ? "ok" : "fail"} ${step.name}${step.status ? ` HTTP ${step.status}` : ""}${step.error ? `: ${step.error}` : ""}`);
|
|
292
|
+
}
|
|
293
|
+
return lines.join("\n");
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/fs.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { RestoreResult, WriteResult } from "./types.js";
|
|
2
|
+
export declare function pathExists(target: string): Promise<boolean>;
|
|
3
|
+
export declare function readIfExists(target: string): Promise<string | null>;
|
|
4
|
+
export declare function removeIfExists(target: string): Promise<boolean>;
|
|
5
|
+
export declare function sha256Text(text: string): string;
|
|
6
|
+
export declare function sha256File(target: string): Promise<string | undefined>;
|
|
7
|
+
export declare function chmod600(target: string): Promise<void>;
|
|
8
|
+
export declare function atomicWriteFile(target: string, data: string): Promise<string>;
|
|
9
|
+
export declare function backupIfFirstApply(target: string): Promise<boolean>;
|
|
10
|
+
export declare function writeManagedFile(target: string, body: string, opts?: {
|
|
11
|
+
previousSha256?: string;
|
|
12
|
+
confirmDrift?: (message: string) => Promise<boolean>;
|
|
13
|
+
}): Promise<WriteResult>;
|
|
14
|
+
export declare function restoreOrDeleteManagedFile(target: string, opts?: {
|
|
15
|
+
previousSha256?: string;
|
|
16
|
+
confirmDrift?: (message: string) => Promise<boolean>;
|
|
17
|
+
isManagedContent?: (body: string) => boolean;
|
|
18
|
+
}): Promise<RestoreResult>;
|