@moonmath-ai/zro 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/README.md +87 -0
- package/dist/args.d.ts +8 -0
- package/dist/args.js +110 -0
- package/dist/args.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +10 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants.d.ts +21 -0
- package/dist/constants.js +20 -0
- package/dist/constants.js.map +1 -0
- package/dist/files.d.ts +2 -0
- package/dist/files.js +17 -0
- package/dist/files.js.map +1 -0
- package/dist/key.d.ts +25 -0
- package/dist/key.js +146 -0
- package/dist/key.js.map +1 -0
- package/dist/models.d.ts +6 -0
- package/dist/models.js +128 -0
- package/dist/models.js.map +1 -0
- package/dist/run.d.ts +13 -0
- package/dist/run.js +235 -0
- package/dist/run.js.map +1 -0
- package/dist/serializers.d.ts +7 -0
- package/dist/serializers.js +35 -0
- package/dist/serializers.js.map +1 -0
- package/dist/tools/claude.d.ts +2 -0
- package/dist/tools/claude.js +24 -0
- package/dist/tools/claude.js.map +1 -0
- package/dist/tools/codex.d.ts +2 -0
- package/dist/tools/codex.js +82 -0
- package/dist/tools/codex.js.map +1 -0
- package/dist/tools/helpers.d.ts +2 -0
- package/dist/tools/helpers.js +17 -0
- package/dist/tools/helpers.js.map +1 -0
- package/dist/tools/hermes.d.ts +2 -0
- package/dist/tools/hermes.js +64 -0
- package/dist/tools/hermes.js.map +1 -0
- package/dist/tools/openclaw.d.ts +2 -0
- package/dist/tools/openclaw.js +84 -0
- package/dist/tools/openclaw.js.map +1 -0
- package/dist/tools/opencode.d.ts +2 -0
- package/dist/tools/opencode.js +65 -0
- package/dist/tools/opencode.js.map +1 -0
- package/dist/types.d.ts +58 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# zro
|
|
2
|
+
|
|
3
|
+
`zro` launches coding tools with the Zro OpenAI-compatible endpoint for that session only.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npx @moonmath-ai/zro login
|
|
7
|
+
npx @moonmath-ai/zro launch <tool>
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
It does not edit your normal tool configs. It injects the Zro endpoint, API key, model catalog, or temporary config needed by the launched child process, then cleans up.
|
|
11
|
+
|
|
12
|
+
Defaults:
|
|
13
|
+
|
|
14
|
+
- Base URL: `https://inference.moonmath.ai/v1`
|
|
15
|
+
- Model: `minimax-m3`
|
|
16
|
+
- Packaged model list: `minimax-m3`, `glm-5.2`
|
|
17
|
+
|
|
18
|
+
Supported platforms: macOS and Linux. On Windows, run `zro` from WSL.
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
Store your Zro key once:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
zro login
|
|
26
|
+
zro launch claude
|
|
27
|
+
zro launch codex --model glm-5.2 -- --sandbox workspace-write
|
|
28
|
+
zro launch opencode --print
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
For CI, servers, or one-off runs, use `ZRO_API_KEY`:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
export ZRO_API_KEY=sk-...
|
|
35
|
+
zro launch claude
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Full command:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
zro login [--api-key <key>]
|
|
42
|
+
zro logout
|
|
43
|
+
zro auth status
|
|
44
|
+
zro launch <tool> [--api-key <key>] [--model <id>] [--print] [-- <tool args...>]
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
API key resolution order:
|
|
48
|
+
|
|
49
|
+
1. `--api-key <key>`
|
|
50
|
+
2. `ZRO_API_KEY` environment variable
|
|
51
|
+
3. Stored key from `zro login`
|
|
52
|
+
|
|
53
|
+
If none is present, `zro` exits with a clear error. `zro login` stores the key in `~/.config/zro/credentials.json` with `0600` permissions. It only stores Zro credentials; it does not edit Claude Code, Codex CLI, OpenCode, Hermes, or OpenClaw config.
|
|
54
|
+
|
|
55
|
+
Model selection:
|
|
56
|
+
|
|
57
|
+
- Pass `--model <id>` for a specific model.
|
|
58
|
+
- In an interactive terminal, `zro` opens a model selector. Use Up/Down and Enter, or type the number/model id.
|
|
59
|
+
- In non-interactive runs, `zro` defaults to `minimax-m3`.
|
|
60
|
+
|
|
61
|
+
`--print` shows the launch plan with secrets redacted and does not start the tool.
|
|
62
|
+
|
|
63
|
+
## Tools
|
|
64
|
+
|
|
65
|
+
| Command | Product | What `zro launch` does |
|
|
66
|
+
| --- | --- | --- |
|
|
67
|
+
| `claude` | Claude Code | Starts `claude` with Anthropic-compatible Zro env vars and a custom model picker entry. Type `/model` and select the Zro model if needed. |
|
|
68
|
+
| `codex` | Codex CLI | Starts `codex` with runtime `-c` provider overrides, `ZRO_API_KEY`, and a temporary model catalog so Zro models can appear in Codex CLI model selection. |
|
|
69
|
+
| `opencode` | OpenCode | Starts `opencode` with a temporary `XDG_CONFIG_HOME` containing a merged Zro provider config. |
|
|
70
|
+
| `hermes` | Hermes | Starts `hermes` with a temporary home config that registers the Zro provider and selected model. |
|
|
71
|
+
| `openclaw` | OpenClaw | Starts `openclaw` with a temporary home config that registers the Zro provider and selected model. |
|
|
72
|
+
|
|
73
|
+
## Safety
|
|
74
|
+
|
|
75
|
+
- User config files are read when needed, but not modified.
|
|
76
|
+
- `zro login` stores only the Zro API key, not tool-specific settings.
|
|
77
|
+
- Temporary launch files are written with `0600` permissions.
|
|
78
|
+
- Temporary launch files are removed after the launched process exits.
|
|
79
|
+
- API keys are never printed unmasked. `--print` redacts secret environment values.
|
|
80
|
+
|
|
81
|
+
## Development
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
npm install
|
|
85
|
+
npm test
|
|
86
|
+
npm run build
|
|
87
|
+
```
|
package/dist/args.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CliArgs } from "./types.js";
|
|
2
|
+
export declare class UsageError extends Error {
|
|
3
|
+
readonly exitCode: number;
|
|
4
|
+
constructor(message: string, exitCode?: number);
|
|
5
|
+
}
|
|
6
|
+
export declare const SUPPORTED_TOOLS_LIST: string;
|
|
7
|
+
export declare function usage(): string;
|
|
8
|
+
export declare function parseArgs(argv: string[]): CliArgs;
|
package/dist/args.js
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { DEFAULT_MODEL, SUPPORTED_TOOLS } from "./constants.js";
|
|
2
|
+
export class UsageError extends Error {
|
|
3
|
+
exitCode;
|
|
4
|
+
constructor(message, exitCode = 1) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.exitCode = exitCode;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export const SUPPORTED_TOOLS_LIST = SUPPORTED_TOOLS.join(" | ");
|
|
10
|
+
export function usage() {
|
|
11
|
+
return `Usage:
|
|
12
|
+
zro login [--api-key <key>]
|
|
13
|
+
zro logout
|
|
14
|
+
zro auth status
|
|
15
|
+
zro launch <tool> [--api-key <key>] [--model <id>] [--print] [-- <tool args...>]
|
|
16
|
+
|
|
17
|
+
Supported tools:
|
|
18
|
+
${SUPPORTED_TOOLS_LIST}
|
|
19
|
+
|
|
20
|
+
Options:
|
|
21
|
+
--api-key <key> Use this Zro API key for login or the launched session.
|
|
22
|
+
--model <id> Model to launch. Defaults to ${DEFAULT_MODEL}, or prompts in a TTY.
|
|
23
|
+
--print Show the launch plan without starting the tool.
|
|
24
|
+
-- Pass the remaining arguments to the launched tool.`;
|
|
25
|
+
}
|
|
26
|
+
export function parseArgs(argv) {
|
|
27
|
+
if (argv.length === 0 || argv.includes("--help") || argv.includes("-h")) {
|
|
28
|
+
throw new UsageError(usage(), 0);
|
|
29
|
+
}
|
|
30
|
+
if (argv[0] === "login")
|
|
31
|
+
return parseLoginArgs(argv);
|
|
32
|
+
if (argv[0] === "logout")
|
|
33
|
+
return parseNoArgCommand(argv, "logout");
|
|
34
|
+
if (argv[0] === "auth")
|
|
35
|
+
return parseAuthArgs(argv);
|
|
36
|
+
if (argv[0] !== "launch")
|
|
37
|
+
throw new UsageError(`Unknown command: ${argv[0]}\n\n${usage()}`);
|
|
38
|
+
const tool = argv[1];
|
|
39
|
+
if (!tool || tool.startsWith("-")) {
|
|
40
|
+
throw new UsageError(`Missing <tool>.\n\n${usage()}`);
|
|
41
|
+
}
|
|
42
|
+
const parsed = {
|
|
43
|
+
command: "launch",
|
|
44
|
+
tool,
|
|
45
|
+
print: false,
|
|
46
|
+
extraArgs: []
|
|
47
|
+
};
|
|
48
|
+
for (let i = 2; i < argv.length; i += 1) {
|
|
49
|
+
const arg = argv[i];
|
|
50
|
+
if (arg === "--") {
|
|
51
|
+
parsed.extraArgs = argv.slice(i + 1);
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
switch (arg) {
|
|
55
|
+
case "--api-key": {
|
|
56
|
+
const value = argv[i + 1];
|
|
57
|
+
if (!value || value.startsWith("-")) {
|
|
58
|
+
throw new UsageError("--api-key requires a value.");
|
|
59
|
+
}
|
|
60
|
+
parsed.apiKey = value;
|
|
61
|
+
i += 1;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
case "--model": {
|
|
65
|
+
const value = argv[i + 1];
|
|
66
|
+
if (!value || value.startsWith("-")) {
|
|
67
|
+
throw new UsageError("--model requires a value.");
|
|
68
|
+
}
|
|
69
|
+
parsed.model = value;
|
|
70
|
+
i += 1;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
case "--print":
|
|
74
|
+
parsed.print = true;
|
|
75
|
+
break;
|
|
76
|
+
default:
|
|
77
|
+
throw new UsageError(`Unknown option: ${arg}\n\n${usage()}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return parsed;
|
|
81
|
+
}
|
|
82
|
+
function parseLoginArgs(argv) {
|
|
83
|
+
const parsed = { command: "login" };
|
|
84
|
+
for (let i = 1; i < argv.length; i += 1) {
|
|
85
|
+
const arg = argv[i];
|
|
86
|
+
if (arg !== "--api-key") {
|
|
87
|
+
throw new UsageError(`Unknown option: ${arg}\n\n${usage()}`);
|
|
88
|
+
}
|
|
89
|
+
const value = argv[i + 1];
|
|
90
|
+
if (!value || value.startsWith("-")) {
|
|
91
|
+
throw new UsageError("--api-key requires a value.");
|
|
92
|
+
}
|
|
93
|
+
parsed.apiKey = value;
|
|
94
|
+
i += 1;
|
|
95
|
+
}
|
|
96
|
+
return parsed;
|
|
97
|
+
}
|
|
98
|
+
function parseNoArgCommand(argv, command) {
|
|
99
|
+
if (argv.length > 1) {
|
|
100
|
+
throw new UsageError(`Unknown option: ${argv[1]}\n\n${usage()}`);
|
|
101
|
+
}
|
|
102
|
+
return { command };
|
|
103
|
+
}
|
|
104
|
+
function parseAuthArgs(argv) {
|
|
105
|
+
if (argv[1] === "status" && argv.length === 2) {
|
|
106
|
+
return { command: "auth-status" };
|
|
107
|
+
}
|
|
108
|
+
throw new UsageError(`Unknown auth command. Try: zro auth status\n\n${usage()}`);
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=args.js.map
|
package/dist/args.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { run } from "./run.js";
|
|
3
|
+
run(process.argv.slice(2)).then((code) => {
|
|
4
|
+
process.exitCode = code;
|
|
5
|
+
}).catch((error) => {
|
|
6
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
7
|
+
process.stderr.write(`${message}\n`);
|
|
8
|
+
process.exitCode = 1;
|
|
9
|
+
});
|
|
10
|
+
//# 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":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;IACvC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC1B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC1B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const ENDPOINT_ROOT = "https://inference.moonmath.ai";
|
|
2
|
+
export declare const BASE_URL = "https://inference.moonmath.ai/v1";
|
|
3
|
+
export declare const ZRO_ENV_KEY = "ZRO_API_KEY";
|
|
4
|
+
export declare const PROVIDER_ID = "zro";
|
|
5
|
+
export declare const PROVIDER_NAME = "Zro";
|
|
6
|
+
export interface ZroModel {
|
|
7
|
+
id: string;
|
|
8
|
+
contextWindow: number;
|
|
9
|
+
maxOutputTokens: number;
|
|
10
|
+
}
|
|
11
|
+
export declare const ZRO_MODELS: readonly [{
|
|
12
|
+
readonly id: "minimax-m3";
|
|
13
|
+
readonly contextWindow: 1048576;
|
|
14
|
+
readonly maxOutputTokens: 64000;
|
|
15
|
+
}, {
|
|
16
|
+
readonly id: "glm-5.2";
|
|
17
|
+
readonly contextWindow: 350000;
|
|
18
|
+
readonly maxOutputTokens: 64000;
|
|
19
|
+
}];
|
|
20
|
+
export declare const DEFAULT_MODEL: "minimax-m3";
|
|
21
|
+
export declare const SUPPORTED_TOOLS: readonly ["claude", "codex", "opencode", "hermes", "openclaw"];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const ENDPOINT_ROOT = "https://inference.moonmath.ai";
|
|
2
|
+
export const BASE_URL = `${ENDPOINT_ROOT}/v1`;
|
|
3
|
+
export const ZRO_ENV_KEY = "ZRO_API_KEY";
|
|
4
|
+
export const PROVIDER_ID = "zro";
|
|
5
|
+
export const PROVIDER_NAME = "Zro";
|
|
6
|
+
export const ZRO_MODELS = [
|
|
7
|
+
{
|
|
8
|
+
id: "minimax-m3",
|
|
9
|
+
contextWindow: 1048576,
|
|
10
|
+
maxOutputTokens: 64000
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
id: "glm-5.2",
|
|
14
|
+
contextWindow: 350000,
|
|
15
|
+
maxOutputTokens: 64000
|
|
16
|
+
}
|
|
17
|
+
];
|
|
18
|
+
export const DEFAULT_MODEL = ZRO_MODELS[0].id;
|
|
19
|
+
export const SUPPORTED_TOOLS = ["claude", "codex", "opencode", "hermes", "openclaw"];
|
|
20
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,+BAA+B,CAAC;AAC7D,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,aAAa,KAAK,CAAC;AAC9C,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;AACzC,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AACjC,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC;AAQnC,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB;QACE,EAAE,EAAE,YAAY;QAChB,aAAa,EAAE,OAAO;QACtB,eAAe,EAAE,KAAK;KACvB;IACD;QACE,EAAE,EAAE,SAAS;QACb,aAAa,EAAE,MAAM;QACrB,eAAe,EAAE,KAAK;KACvB;CACqC,CAAC;AAEzC,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAE9C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAC"}
|
package/dist/files.d.ts
ADDED
package/dist/files.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
async function fileExists(filePath) {
|
|
3
|
+
try {
|
|
4
|
+
await fs.access(filePath);
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export async function readConfig(filePath, serializer) {
|
|
12
|
+
if (!(await fileExists(filePath)))
|
|
13
|
+
return {};
|
|
14
|
+
const text = await fs.readFile(filePath, "utf8");
|
|
15
|
+
return serializer.parse(text);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGlC,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,UAAsB;IACvE,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;AAC3D,CAAC"}
|
package/dist/key.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Readable, Writable } from "node:stream";
|
|
2
|
+
import type { ApiKeySource } from "./types.js";
|
|
3
|
+
export interface KeyResolution {
|
|
4
|
+
apiKey: string;
|
|
5
|
+
source: ApiKeySource;
|
|
6
|
+
}
|
|
7
|
+
interface CredentialOptions {
|
|
8
|
+
homeDir: string;
|
|
9
|
+
env?: NodeJS.ProcessEnv;
|
|
10
|
+
}
|
|
11
|
+
export declare function maskKey(apiKey: string): string;
|
|
12
|
+
export declare function redactSecrets(text: string, secrets: string[]): string;
|
|
13
|
+
export declare function resolveApiKey(options: {
|
|
14
|
+
flagValue?: string;
|
|
15
|
+
env?: NodeJS.ProcessEnv;
|
|
16
|
+
homeDir: string;
|
|
17
|
+
}): Promise<KeyResolution>;
|
|
18
|
+
export declare function credentialFilePath(options: CredentialOptions): string;
|
|
19
|
+
export declare function readStoredApiKey(options: CredentialOptions): Promise<string | null>;
|
|
20
|
+
export declare function writeStoredApiKey(options: CredentialOptions & {
|
|
21
|
+
apiKey: string;
|
|
22
|
+
}): Promise<string>;
|
|
23
|
+
export declare function deleteStoredApiKey(options: CredentialOptions): Promise<boolean>;
|
|
24
|
+
export declare function promptHidden(prompt: string, stdin: Readable, stdout: Writable): Promise<string>;
|
|
25
|
+
export {};
|
package/dist/key.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { ZRO_ENV_KEY } from "./constants.js";
|
|
4
|
+
export function maskKey(apiKey) {
|
|
5
|
+
if (!apiKey)
|
|
6
|
+
return "****";
|
|
7
|
+
const prefix = apiKey.startsWith("sk-") ? "sk-" : apiKey.slice(0, Math.min(3, apiKey.length));
|
|
8
|
+
const suffix = apiKey.length > 8 ? apiKey.slice(-4) : "";
|
|
9
|
+
return suffix ? `${prefix}****...${suffix}` : `${prefix}****`;
|
|
10
|
+
}
|
|
11
|
+
export function redactSecrets(text, secrets) {
|
|
12
|
+
return secrets.reduce((current, secret) => {
|
|
13
|
+
if (!secret)
|
|
14
|
+
return current;
|
|
15
|
+
return current.split(secret).join(maskKey(secret));
|
|
16
|
+
}, text);
|
|
17
|
+
}
|
|
18
|
+
export async function resolveApiKey(options) {
|
|
19
|
+
if (options.flagValue) {
|
|
20
|
+
return { apiKey: options.flagValue, source: "flag" };
|
|
21
|
+
}
|
|
22
|
+
const env = options.env ?? process.env;
|
|
23
|
+
const envValue = env[ZRO_ENV_KEY];
|
|
24
|
+
if (envValue) {
|
|
25
|
+
return { apiKey: envValue, source: "env" };
|
|
26
|
+
}
|
|
27
|
+
const stored = await readStoredApiKey({ homeDir: options.homeDir, env });
|
|
28
|
+
if (stored) {
|
|
29
|
+
return { apiKey: stored, source: "stored" };
|
|
30
|
+
}
|
|
31
|
+
throw new Error(`No API key found. Run zro login, set ${ZRO_ENV_KEY}, or pass --api-key.`);
|
|
32
|
+
}
|
|
33
|
+
export function credentialFilePath(options) {
|
|
34
|
+
const env = options.env ?? process.env;
|
|
35
|
+
const configRoot = env.XDG_CONFIG_HOME || path.join(options.homeDir, ".config");
|
|
36
|
+
return path.join(configRoot, "zro", "credentials.json");
|
|
37
|
+
}
|
|
38
|
+
export async function readStoredApiKey(options) {
|
|
39
|
+
const filePath = credentialFilePath(options);
|
|
40
|
+
try {
|
|
41
|
+
const text = await fs.readFile(filePath, "utf8");
|
|
42
|
+
const parsed = JSON.parse(text);
|
|
43
|
+
return typeof parsed.apiKey === "string" && parsed.apiKey.trim() ? parsed.apiKey : null;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
if (isNodeError(error) && error.code === "ENOENT")
|
|
47
|
+
return null;
|
|
48
|
+
if (error instanceof SyntaxError) {
|
|
49
|
+
throw new Error(`Stored Zro credentials are not valid JSON at ${filePath}. Run zro login again.`);
|
|
50
|
+
}
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export async function writeStoredApiKey(options) {
|
|
55
|
+
const filePath = credentialFilePath(options);
|
|
56
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true, mode: 0o700 });
|
|
57
|
+
await fs.writeFile(filePath, `${JSON.stringify({ apiKey: options.apiKey, updatedAt: new Date().toISOString() }, null, 2)}\n`, { mode: 0o600 });
|
|
58
|
+
await fs.chmod(path.dirname(filePath), 0o700);
|
|
59
|
+
await fs.chmod(filePath, 0o600);
|
|
60
|
+
return filePath;
|
|
61
|
+
}
|
|
62
|
+
export async function deleteStoredApiKey(options) {
|
|
63
|
+
const filePath = credentialFilePath(options);
|
|
64
|
+
try {
|
|
65
|
+
await fs.rm(filePath);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (isNodeError(error) && error.code === "ENOENT")
|
|
70
|
+
return false;
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export async function promptHidden(prompt, stdin, stdout) {
|
|
75
|
+
if (!isTty(stdin) || !isTty(stdout)) {
|
|
76
|
+
throw new Error(`No API key provided. Pass --api-key, set ${ZRO_ENV_KEY}, or run zro login in a terminal.`);
|
|
77
|
+
}
|
|
78
|
+
const input = stdin;
|
|
79
|
+
const previousRawMode = input.isRaw;
|
|
80
|
+
let value = "";
|
|
81
|
+
let settled = false;
|
|
82
|
+
input.setRawMode?.(true);
|
|
83
|
+
input.resume();
|
|
84
|
+
stdout.write(prompt);
|
|
85
|
+
return new Promise((resolve, reject) => {
|
|
86
|
+
const cleanup = () => {
|
|
87
|
+
input.off("data", onData);
|
|
88
|
+
input.off("error", onError);
|
|
89
|
+
input.off("end", onEnd);
|
|
90
|
+
if (typeof previousRawMode === "boolean")
|
|
91
|
+
input.setRawMode?.(previousRawMode);
|
|
92
|
+
input.pause();
|
|
93
|
+
};
|
|
94
|
+
const finish = () => {
|
|
95
|
+
if (settled)
|
|
96
|
+
return;
|
|
97
|
+
settled = true;
|
|
98
|
+
stdout.write("\n");
|
|
99
|
+
cleanup();
|
|
100
|
+
resolve(value.trim());
|
|
101
|
+
};
|
|
102
|
+
const fail = (error) => {
|
|
103
|
+
if (settled)
|
|
104
|
+
return;
|
|
105
|
+
settled = true;
|
|
106
|
+
cleanup();
|
|
107
|
+
reject(error);
|
|
108
|
+
};
|
|
109
|
+
function onData(chunk) {
|
|
110
|
+
const text = Buffer.isBuffer(chunk) ? chunk.toString("utf8") : chunk;
|
|
111
|
+
for (const char of text) {
|
|
112
|
+
if (char === "\u0003") {
|
|
113
|
+
stdout.write("\n");
|
|
114
|
+
fail(new Error("Interrupted while reading API key."));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (char === "\r" || char === "\n") {
|
|
118
|
+
finish();
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (char === "\u007f" || char === "\b") {
|
|
122
|
+
value = value.slice(0, -1);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
value += char;
|
|
126
|
+
stdout.write("*");
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function onError(error) {
|
|
130
|
+
fail(error);
|
|
131
|
+
}
|
|
132
|
+
function onEnd() {
|
|
133
|
+
fail(new Error("No API key entered."));
|
|
134
|
+
}
|
|
135
|
+
input.on("data", onData);
|
|
136
|
+
input.once("error", onError);
|
|
137
|
+
input.once("end", onEnd);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
function isTty(stream) {
|
|
141
|
+
return Boolean(stream.isTTY);
|
|
142
|
+
}
|
|
143
|
+
function isNodeError(error) {
|
|
144
|
+
return error instanceof Error && "code" in error;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=key.js.map
|
package/dist/key.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key.js","sourceRoot":"","sources":["../src/key.ts"],"names":[],"mappings":"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"}
|
package/dist/models.d.ts
ADDED
package/dist/models.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { clearScreenDown, emitKeypressEvents, moveCursor } from "node:readline";
|
|
2
|
+
import { DEFAULT_MODEL, ZRO_MODELS } from "./constants.js";
|
|
3
|
+
const MODEL_IDS = ZRO_MODELS.map((model) => model.id);
|
|
4
|
+
const MODELS_LIST = MODEL_IDS.join(" | ");
|
|
5
|
+
export async function resolveModel(options) {
|
|
6
|
+
if (options.flagValue) {
|
|
7
|
+
if (MODEL_IDS.includes(options.flagValue))
|
|
8
|
+
return options.flagValue;
|
|
9
|
+
throw new Error(`Unsupported Zro model: ${options.flagValue}\nSupported models: ${MODELS_LIST}`);
|
|
10
|
+
}
|
|
11
|
+
if (!isTty(options.stdin) || !isTty(options.stdout))
|
|
12
|
+
return DEFAULT_MODEL;
|
|
13
|
+
return promptModel(options.stdin, options.stdout);
|
|
14
|
+
}
|
|
15
|
+
async function promptModel(stdin, stdout) {
|
|
16
|
+
const input = stdin;
|
|
17
|
+
const previousRawMode = input.isRaw;
|
|
18
|
+
let selectedIndex = Math.max(0, MODEL_IDS.indexOf(DEFAULT_MODEL));
|
|
19
|
+
let typed = "";
|
|
20
|
+
let renderedLines = 0;
|
|
21
|
+
let message = "";
|
|
22
|
+
input.setRawMode?.(true);
|
|
23
|
+
input.resume();
|
|
24
|
+
emitKeypressEvents(input);
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
let settled = false;
|
|
27
|
+
const cleanup = () => {
|
|
28
|
+
input.off("keypress", onKeypress);
|
|
29
|
+
if (typeof previousRawMode === "boolean")
|
|
30
|
+
input.setRawMode?.(previousRawMode);
|
|
31
|
+
input.pause();
|
|
32
|
+
};
|
|
33
|
+
const finish = (model) => {
|
|
34
|
+
if (settled)
|
|
35
|
+
return;
|
|
36
|
+
settled = true;
|
|
37
|
+
stdout.write("\n");
|
|
38
|
+
cleanup();
|
|
39
|
+
resolve(model);
|
|
40
|
+
};
|
|
41
|
+
const fail = (error) => {
|
|
42
|
+
if (settled)
|
|
43
|
+
return;
|
|
44
|
+
settled = true;
|
|
45
|
+
stdout.write("\n");
|
|
46
|
+
cleanup();
|
|
47
|
+
reject(error);
|
|
48
|
+
};
|
|
49
|
+
const render = () => {
|
|
50
|
+
if (renderedLines > 0) {
|
|
51
|
+
moveCursor(stdout, 0, -renderedLines);
|
|
52
|
+
clearScreenDown(stdout);
|
|
53
|
+
}
|
|
54
|
+
stdout.write("Select Zro model to launch:\n");
|
|
55
|
+
for (let index = 0; index < MODEL_IDS.length; index += 1) {
|
|
56
|
+
const marker = index === selectedIndex ? ">" : " ";
|
|
57
|
+
const suffix = MODEL_IDS[index] === DEFAULT_MODEL ? " (default)" : "";
|
|
58
|
+
stdout.write(`${marker} ${index + 1}. ${MODEL_IDS[index]}${suffix}\n`);
|
|
59
|
+
}
|
|
60
|
+
const typedText = typed ? ` Typed: ${typed}` : "";
|
|
61
|
+
stdout.write(`Use Up/Down, Enter to launch. Type 1-${MODEL_IDS.length} or model id.${typedText}\n`);
|
|
62
|
+
if (message)
|
|
63
|
+
stdout.write(`${message}\n`);
|
|
64
|
+
renderedLines = MODEL_IDS.length + 2 + (message ? 1 : 0);
|
|
65
|
+
};
|
|
66
|
+
const chooseTyped = () => {
|
|
67
|
+
const answer = typed.trim();
|
|
68
|
+
if (!answer) {
|
|
69
|
+
finish(MODEL_IDS[selectedIndex]);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const index = Number(answer);
|
|
73
|
+
if (Number.isInteger(index) && index >= 1 && index <= MODEL_IDS.length) {
|
|
74
|
+
finish(MODEL_IDS[index - 1]);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (MODEL_IDS.includes(answer)) {
|
|
78
|
+
finish(answer);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
typed = "";
|
|
82
|
+
message = `Choose 1-${MODEL_IDS.length} or one of: ${MODELS_LIST}.`;
|
|
83
|
+
render();
|
|
84
|
+
};
|
|
85
|
+
function onKeypress(text, key) {
|
|
86
|
+
message = "";
|
|
87
|
+
if (key.ctrl && key.name === "c") {
|
|
88
|
+
fail(new Error("Interrupted while selecting model."));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (key.name === "return" || key.name === "enter") {
|
|
92
|
+
chooseTyped();
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (key.name === "up") {
|
|
96
|
+
typed = "";
|
|
97
|
+
selectedIndex = (selectedIndex - 1 + MODEL_IDS.length) % MODEL_IDS.length;
|
|
98
|
+
render();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (key.name === "down") {
|
|
102
|
+
typed = "";
|
|
103
|
+
selectedIndex = (selectedIndex + 1) % MODEL_IDS.length;
|
|
104
|
+
render();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (key.name === "backspace") {
|
|
108
|
+
typed = typed.slice(0, -1);
|
|
109
|
+
render();
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (/^[A-Za-z0-9._-]$/.test(text)) {
|
|
113
|
+
typed += text;
|
|
114
|
+
const numericIndex = Number(typed);
|
|
115
|
+
if (Number.isInteger(numericIndex) && numericIndex >= 1 && numericIndex <= MODEL_IDS.length) {
|
|
116
|
+
selectedIndex = numericIndex - 1;
|
|
117
|
+
}
|
|
118
|
+
render();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
input.on("keypress", onKeypress);
|
|
122
|
+
render();
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
function isTty(stream) {
|
|
126
|
+
return Boolean(stream.isTTY);
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"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"}
|
package/dist/run.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Readable, Writable } from "node:stream";
|
|
2
|
+
import type { SpawnProcess } from "./types.js";
|
|
3
|
+
interface RunIo {
|
|
4
|
+
stdin: Readable;
|
|
5
|
+
stdout: Writable;
|
|
6
|
+
stderr: Writable;
|
|
7
|
+
homeDir: string;
|
|
8
|
+
cwd: string;
|
|
9
|
+
env?: NodeJS.ProcessEnv;
|
|
10
|
+
spawn?: SpawnProcess;
|
|
11
|
+
}
|
|
12
|
+
export declare function run(argv: string[], io?: RunIo): Promise<number>;
|
|
13
|
+
export {};
|