@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.
Files changed (47) hide show
  1. package/README.md +87 -0
  2. package/dist/args.d.ts +8 -0
  3. package/dist/args.js +110 -0
  4. package/dist/args.js.map +1 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +10 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/constants.d.ts +21 -0
  9. package/dist/constants.js +20 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/files.d.ts +2 -0
  12. package/dist/files.js +17 -0
  13. package/dist/files.js.map +1 -0
  14. package/dist/key.d.ts +25 -0
  15. package/dist/key.js +146 -0
  16. package/dist/key.js.map +1 -0
  17. package/dist/models.d.ts +6 -0
  18. package/dist/models.js +128 -0
  19. package/dist/models.js.map +1 -0
  20. package/dist/run.d.ts +13 -0
  21. package/dist/run.js +235 -0
  22. package/dist/run.js.map +1 -0
  23. package/dist/serializers.d.ts +7 -0
  24. package/dist/serializers.js +35 -0
  25. package/dist/serializers.js.map +1 -0
  26. package/dist/tools/claude.d.ts +2 -0
  27. package/dist/tools/claude.js +24 -0
  28. package/dist/tools/claude.js.map +1 -0
  29. package/dist/tools/codex.d.ts +2 -0
  30. package/dist/tools/codex.js +82 -0
  31. package/dist/tools/codex.js.map +1 -0
  32. package/dist/tools/helpers.d.ts +2 -0
  33. package/dist/tools/helpers.js +17 -0
  34. package/dist/tools/helpers.js.map +1 -0
  35. package/dist/tools/hermes.d.ts +2 -0
  36. package/dist/tools/hermes.js +64 -0
  37. package/dist/tools/hermes.js.map +1 -0
  38. package/dist/tools/openclaw.d.ts +2 -0
  39. package/dist/tools/openclaw.js +84 -0
  40. package/dist/tools/openclaw.js.map +1 -0
  41. package/dist/tools/opencode.d.ts +2 -0
  42. package/dist/tools/opencode.js +65 -0
  43. package/dist/tools/opencode.js.map +1 -0
  44. package/dist/types.d.ts +58 -0
  45. package/dist/types.js +2 -0
  46. package/dist/types.js.map +1 -0
  47. package/package.json +43 -0
package/dist/run.js ADDED
@@ -0,0 +1,235 @@
1
+ import { spawn as nodeSpawn } from "node:child_process";
2
+ import fs from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { ZRO_ENV_KEY } from "./constants.js";
6
+ import { parseArgs, SUPPORTED_TOOLS_LIST, UsageError } from "./args.js";
7
+ import { credentialFilePath, deleteStoredApiKey, maskKey, promptHidden, readStoredApiKey, resolveApiKey, writeStoredApiKey } from "./key.js";
8
+ import { resolveModel } from "./models.js";
9
+ import { claudeTool } from "./tools/claude.js";
10
+ import { codexTool } from "./tools/codex.js";
11
+ import { hermesTool } from "./tools/hermes.js";
12
+ import { openClawTool } from "./tools/openclaw.js";
13
+ import { opencodeTool } from "./tools/opencode.js";
14
+ const tools = {
15
+ claude: claudeTool,
16
+ codex: codexTool,
17
+ hermes: hermesTool,
18
+ openclaw: openClawTool,
19
+ opencode: opencodeTool
20
+ };
21
+ export async function run(argv, io = defaultIo()) {
22
+ if (process.platform === "win32") {
23
+ io.stderr.write("zro supports macOS and Linux. Windows is not supported; use WSL on Windows.\n");
24
+ return 1;
25
+ }
26
+ let args;
27
+ try {
28
+ args = parseArgs(argv);
29
+ }
30
+ catch (error) {
31
+ if (error instanceof UsageError) {
32
+ io.stdout.write(`${error.message}\n`);
33
+ return error.exitCode;
34
+ }
35
+ throw error;
36
+ }
37
+ const env = io.env ?? process.env;
38
+ if (args.command === "login")
39
+ return login(args.apiKey, io, env);
40
+ if (args.command === "logout")
41
+ return logout(io, env);
42
+ if (args.command === "auth-status")
43
+ return authStatus(io, env);
44
+ const tool = tools[args.tool];
45
+ if (!tool) {
46
+ io.stderr.write(`Unsupported tool: ${args.tool}\nSupported tools: ${SUPPORTED_TOOLS_LIST}\n`);
47
+ return 1;
48
+ }
49
+ let key;
50
+ try {
51
+ key = await resolveApiKey({ flagValue: args.apiKey, env, homeDir: io.homeDir });
52
+ }
53
+ catch (error) {
54
+ const message = error instanceof Error ? error.message : String(error);
55
+ io.stderr.write(`${message}\n`);
56
+ return 1;
57
+ }
58
+ if (key.source === "flag") {
59
+ io.stderr.write(`Note: --api-key can land in shell history. Prefer zro login or ${ZRO_ENV_KEY}=... for CI.\n`);
60
+ }
61
+ let model;
62
+ try {
63
+ model = await resolveModel({
64
+ flagValue: args.model,
65
+ stdin: io.stdin,
66
+ stdout: io.stdout
67
+ });
68
+ }
69
+ catch (error) {
70
+ const message = error instanceof Error ? error.message : String(error);
71
+ io.stderr.write(`${message}\n`);
72
+ return 1;
73
+ }
74
+ const tempDir = path.join(os.tmpdir(), `zro-launch-${process.pid}-${Date.now()}`);
75
+ const ctx = {
76
+ apiKey: key.apiKey,
77
+ apiKeySource: key.source,
78
+ model,
79
+ print: args.print,
80
+ extraArgs: args.extraArgs,
81
+ homeDir: io.homeDir,
82
+ cwd: io.cwd,
83
+ tempDir,
84
+ stdin: io.stdin,
85
+ stdout: io.stdout,
86
+ stderr: io.stderr
87
+ };
88
+ const plan = await tool.launch(ctx);
89
+ if (args.print) {
90
+ printPlan(plan, io.stdout);
91
+ return 0;
92
+ }
93
+ await writeLaunchFiles(plan);
94
+ try {
95
+ return await spawnPlan(plan, io);
96
+ }
97
+ catch (error) {
98
+ const message = error instanceof Error ? error.message : String(error);
99
+ io.stderr.write(`Failed to launch ${plan.label}: ${message}\n`);
100
+ return 1;
101
+ }
102
+ finally {
103
+ await fs.rm(tempDir, { recursive: true, force: true });
104
+ }
105
+ }
106
+ function printPlan(plan, stdout) {
107
+ stdout.write(`${plan.message ?? `Launch ${plan.label}`}\n`);
108
+ stdout.write(`Model: ${plan.model}\n`);
109
+ stdout.write(`Command: ${shellPreview([plan.command, ...plan.args])}\n`);
110
+ const env = plan.env ?? {};
111
+ const envKeys = Object.keys(env).sort();
112
+ if (envKeys.length) {
113
+ stdout.write("Environment:\n");
114
+ for (const key of envKeys) {
115
+ stdout.write(` ${key}=${redactEnvValue(key, env[key])}\n`);
116
+ }
117
+ }
118
+ if (plan.files?.length) {
119
+ stdout.write("Temp files:\n");
120
+ for (const file of plan.files) {
121
+ stdout.write(` ${file.path}\n`);
122
+ }
123
+ }
124
+ }
125
+ async function writeLaunchFiles(plan) {
126
+ for (const file of plan.files ?? []) {
127
+ await fs.mkdir(path.dirname(file.path), { recursive: true });
128
+ await fs.writeFile(file.path, file.contents, { mode: 0o600 });
129
+ }
130
+ }
131
+ async function spawnPlan(plan, io) {
132
+ const spawn = io.spawn ?? nodeSpawn;
133
+ const child = spawn(plan.command, plan.args, {
134
+ cwd: io.cwd,
135
+ env: { ...(io.env ?? process.env), ...(plan.env ?? {}) },
136
+ stdio: "inherit"
137
+ });
138
+ return new Promise((resolve, reject) => {
139
+ child.once("error", reject);
140
+ child.once("exit", (code, signal) => {
141
+ if (typeof code === "number") {
142
+ resolve(code);
143
+ return;
144
+ }
145
+ io.stderr.write(`Launched tool exited from signal ${signal ?? "unknown"}.\n`);
146
+ resolve(1);
147
+ });
148
+ });
149
+ }
150
+ function shellPreview(argv) {
151
+ return argv.map((arg) => {
152
+ if (/^[A-Za-z0-9_./:=@+-]+$/.test(arg))
153
+ return arg;
154
+ return `'${arg.replace(/'/g, "'\\''")}'`;
155
+ }).join(" ");
156
+ }
157
+ function redactEnvValue(key, value) {
158
+ if (/KEY|TOKEN|SECRET/i.test(key))
159
+ return maskKey(value);
160
+ return value;
161
+ }
162
+ async function login(apiKeyFlag, io, env) {
163
+ let apiKey = apiKeyFlag ?? env[ZRO_ENV_KEY];
164
+ if (!apiKey) {
165
+ try {
166
+ apiKey = await promptHidden("Zro API key: ", io.stdin, io.stdout);
167
+ }
168
+ catch (error) {
169
+ const message = error instanceof Error ? error.message : String(error);
170
+ io.stderr.write(`${message}\n`);
171
+ return 1;
172
+ }
173
+ }
174
+ const trimmed = apiKey.trim();
175
+ if (!trimmed) {
176
+ io.stderr.write("No API key entered.\n");
177
+ return 1;
178
+ }
179
+ if (apiKeyFlag) {
180
+ io.stderr.write(`Note: --api-key can land in shell history. Prefer interactive zro login or ${ZRO_ENV_KEY}=... zro login.\n`);
181
+ }
182
+ const filePath = await writeStoredApiKey({ apiKey: trimmed, homeDir: io.homeDir, env });
183
+ io.stdout.write(`Stored Zro API key at ${filePath}\n`);
184
+ io.stdout.write("Run: zro launch claude --model minimax-m3\n");
185
+ return 0;
186
+ }
187
+ async function logout(io, env) {
188
+ const filePath = credentialFilePath({ homeDir: io.homeDir, env });
189
+ const removed = await deleteStoredApiKey({ homeDir: io.homeDir, env });
190
+ io.stdout.write(removed ? `Removed stored Zro API key from ${filePath}\n` : "No stored Zro API key found.\n");
191
+ if (env[ZRO_ENV_KEY]) {
192
+ io.stdout.write(`${ZRO_ENV_KEY} is still set in this shell and will override stored credentials.\n`);
193
+ }
194
+ return 0;
195
+ }
196
+ async function authStatus(io, env) {
197
+ const envKey = env[ZRO_ENV_KEY];
198
+ const filePath = credentialFilePath({ homeDir: io.homeDir, env });
199
+ const stored = await readStoredApiKey({ homeDir: io.homeDir, env });
200
+ if (envKey) {
201
+ io.stdout.write(`${ZRO_ENV_KEY}: set (${maskKey(envKey)})\n`);
202
+ }
203
+ else {
204
+ io.stdout.write(`${ZRO_ENV_KEY}: not set\n`);
205
+ }
206
+ if (stored) {
207
+ io.stdout.write(`Stored key: present (${maskKey(stored)})\n`);
208
+ io.stdout.write(`Stored key path: ${filePath}\n`);
209
+ }
210
+ else {
211
+ io.stdout.write(`Stored key: not found at ${filePath}\n`);
212
+ }
213
+ if (envKey) {
214
+ io.stdout.write(`Launch source: ${ZRO_ENV_KEY}\n`);
215
+ return 0;
216
+ }
217
+ if (stored) {
218
+ io.stdout.write("Launch source: stored key\n");
219
+ return 0;
220
+ }
221
+ io.stdout.write("Launch source: none. Run zro login.\n");
222
+ return 1;
223
+ }
224
+ function defaultIo() {
225
+ return {
226
+ stdin: process.stdin,
227
+ stdout: process.stdout,
228
+ stderr: process.stderr,
229
+ homeDir: os.homedir(),
230
+ cwd: process.cwd(),
231
+ env: process.env,
232
+ spawn: nodeSpawn
233
+ };
234
+ }
235
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface Serializer {
2
+ parse(text: string): unknown;
3
+ stringify(value: unknown): string;
4
+ }
5
+ export declare const jsonSerializer: Serializer;
6
+ export declare const json5Serializer: Serializer;
7
+ export declare const yamlSerializer: Serializer;
@@ -0,0 +1,35 @@
1
+ import JSON5 from "json5";
2
+ import YAML from "yaml";
3
+ function asObject(value) {
4
+ if (value === null || value === undefined)
5
+ return {};
6
+ if (typeof value !== "object" || Array.isArray(value)) {
7
+ throw new Error("Config root must be an object.");
8
+ }
9
+ return value;
10
+ }
11
+ export const jsonSerializer = {
12
+ parse(text) {
13
+ return asObject(text.trim() ? JSON.parse(text) : {});
14
+ },
15
+ stringify(value) {
16
+ return `${JSON.stringify(value, null, 2)}\n`;
17
+ }
18
+ };
19
+ export const json5Serializer = {
20
+ parse(text) {
21
+ return asObject(text.trim() ? JSON5.parse(text) : {});
22
+ },
23
+ stringify(value) {
24
+ return `${JSON.stringify(value, null, 2)}\n`;
25
+ }
26
+ };
27
+ export const yamlSerializer = {
28
+ parse(text) {
29
+ return asObject(text.trim() ? YAML.parse(text) : {});
30
+ },
31
+ stringify(value) {
32
+ return YAML.stringify(value, { lineWidth: 0 });
33
+ }
34
+ };
35
+ //# sourceMappingURL=serializers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializers.js","sourceRoot":"","sources":["../src/serializers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAOxB,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAe;IACxC,KAAK,CAAC,IAAI;QACR,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,SAAS,CAAC,KAAK;QACb,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAe;IACzC,KAAK,CAAC,IAAI;QACR,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,SAAS,CAAC,KAAK;QACb,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAe;IACxC,KAAK,CAAC,IAAI;QACR,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,SAAS,CAAC,KAAK;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolModule } from "../types.js";
2
+ export declare const claudeTool: ToolModule;
@@ -0,0 +1,24 @@
1
+ import { ENDPOINT_ROOT, PROVIDER_NAME } from "../constants.js";
2
+ export const claudeTool = {
3
+ id: "claude",
4
+ label: "Claude Code",
5
+ async launch(ctx) {
6
+ return {
7
+ tool: "claude",
8
+ label: "Claude Code",
9
+ model: ctx.model,
10
+ command: "claude",
11
+ args: ["--model", ctx.model, ...ctx.extraArgs],
12
+ env: {
13
+ ANTHROPIC_BASE_URL: ENDPOINT_ROOT,
14
+ ANTHROPIC_AUTH_TOKEN: ctx.apiKey,
15
+ ANTHROPIC_CUSTOM_MODEL_OPTION: ctx.model,
16
+ ANTHROPIC_CUSTOM_MODEL_OPTION_NAME: `${PROVIDER_NAME} ${ctx.model}`,
17
+ ANTHROPIC_CUSTOM_MODEL_OPTION_DESCRIPTION: `${PROVIDER_NAME} model via ${ENDPOINT_ROOT}`,
18
+ CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY: "1"
19
+ },
20
+ message: "Launch Claude Code with Zro"
21
+ };
22
+ }
23
+ };
24
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/tools/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG/D,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC,EAAE,EAAE,QAAQ;IACZ,KAAK,EAAE,aAAa;IACpB,KAAK,CAAC,MAAM,CAAC,GAAG;QACd,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,aAAa;YACpB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC;YAC9C,GAAG,EAAE;gBACH,kBAAkB,EAAE,aAAa;gBACjC,oBAAoB,EAAE,GAAG,CAAC,MAAM;gBAChC,6BAA6B,EAAE,GAAG,CAAC,KAAK;gBACxC,kCAAkC,EAAE,GAAG,aAAa,IAAI,GAAG,CAAC,KAAK,EAAE;gBACnE,yCAAyC,EAAE,GAAG,aAAa,cAAc,aAAa,EAAE;gBACxF,0CAA0C,EAAE,GAAG;aAChD;YACD,OAAO,EAAE,6BAA6B;SACvC,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolModule } from "../types.js";
2
+ export declare const codexTool: ToolModule;
@@ -0,0 +1,82 @@
1
+ import path from "node:path";
2
+ import { BASE_URL, PROVIDER_ID, PROVIDER_NAME, ZRO_ENV_KEY, ZRO_MODELS } from "../constants.js";
3
+ import { jsonSerializer } from "../serializers.js";
4
+ export const codexTool = {
5
+ id: "codex",
6
+ label: "Codex CLI",
7
+ async launch(ctx) {
8
+ const catalogPath = path.join(ctx.tempDir, "codex", "zro-models.json");
9
+ return {
10
+ tool: "codex",
11
+ label: "Codex CLI",
12
+ model: ctx.model,
13
+ command: "codex",
14
+ args: [
15
+ "--model",
16
+ ctx.model,
17
+ "-c",
18
+ `model_provider="${PROVIDER_ID}"`,
19
+ "-c",
20
+ `model_catalog_json="${catalogPath}"`,
21
+ "-c",
22
+ `model_providers.${PROVIDER_ID}.name="${PROVIDER_NAME}"`,
23
+ "-c",
24
+ `model_providers.${PROVIDER_ID}.base_url="${BASE_URL}"`,
25
+ "-c",
26
+ `model_providers.${PROVIDER_ID}.wire_api="responses"`,
27
+ "-c",
28
+ `model_providers.${PROVIDER_ID}.env_key="${ZRO_ENV_KEY}"`,
29
+ ...ctx.extraArgs
30
+ ],
31
+ env: {
32
+ [ZRO_ENV_KEY]: ctx.apiKey
33
+ },
34
+ files: [{
35
+ path: catalogPath,
36
+ contents: jsonSerializer.stringify(buildCodexModelCatalog())
37
+ }],
38
+ message: "Launch Codex CLI with Zro"
39
+ };
40
+ }
41
+ };
42
+ function buildCodexModelCatalog() {
43
+ return {
44
+ models: ZRO_MODELS.map((model, index) => ({
45
+ slug: model.id,
46
+ display_name: `${PROVIDER_NAME} ${model.id}`,
47
+ description: `${PROVIDER_NAME} model via ${BASE_URL}`,
48
+ default_reasoning_level: "none",
49
+ supported_reasoning_levels: [],
50
+ shell_type: "shell_command",
51
+ visibility: "list",
52
+ supported_in_api: true,
53
+ priority: 900 + index,
54
+ additional_speed_tiers: [],
55
+ service_tiers: [],
56
+ availability_nux: null,
57
+ upgrade: null,
58
+ base_instructions: "",
59
+ model_messages: {},
60
+ supports_reasoning_summaries: false,
61
+ default_reasoning_summary: "none",
62
+ support_verbosity: false,
63
+ default_verbosity: "medium",
64
+ apply_patch_tool_type: "freeform",
65
+ web_search_tool_type: "text_and_image",
66
+ truncation_policy: {
67
+ mode: "tokens",
68
+ limit: model.contextWindow
69
+ },
70
+ supports_parallel_tool_calls: true,
71
+ supports_image_detail_original: true,
72
+ context_window: model.contextWindow,
73
+ max_context_window: model.contextWindow,
74
+ effective_context_window_percent: 95,
75
+ experimental_supported_tools: [],
76
+ input_modalities: ["text"],
77
+ supports_search_tool: false,
78
+ use_responses_lite: false
79
+ }))
80
+ };
81
+ }
82
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/tools/codex.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAChG,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,MAAM,CAAC,MAAM,SAAS,GAAe;IACnC,EAAE,EAAE,OAAO;IACX,KAAK,EAAE,WAAW;IAClB,KAAK,CAAC,MAAM,CAAC,GAAG;QACd,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;QACvE,OAAO;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,WAAW;YAClB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE;gBACJ,SAAS;gBACT,GAAG,CAAC,KAAK;gBACT,IAAI;gBACJ,mBAAmB,WAAW,GAAG;gBACjC,IAAI;gBACJ,uBAAuB,WAAW,GAAG;gBACrC,IAAI;gBACJ,mBAAmB,WAAW,UAAU,aAAa,GAAG;gBACxD,IAAI;gBACJ,mBAAmB,WAAW,cAAc,QAAQ,GAAG;gBACvD,IAAI;gBACJ,mBAAmB,WAAW,uBAAuB;gBACrD,IAAI;gBACJ,mBAAmB,WAAW,aAAa,WAAW,GAAG;gBACzD,GAAG,GAAG,CAAC,SAAS;aACjB;YACD,GAAG,EAAE;gBACH,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM;aAC1B;YACD,KAAK,EAAE,CAAC;oBACN,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE,cAAc,CAAC,SAAS,CAAC,sBAAsB,EAAE,CAAC;iBAC7D,CAAC;YACF,OAAO,EAAE,2BAA2B;SACrC,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,SAAS,sBAAsB;IAC7B,OAAO;QACL,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,EAAE,KAAK,CAAC,EAAE;YACd,YAAY,EAAE,GAAG,aAAa,IAAI,KAAK,CAAC,EAAE,EAAE;YAC5C,WAAW,EAAE,GAAG,aAAa,cAAc,QAAQ,EAAE;YACrD,uBAAuB,EAAE,MAAM;YAC/B,0BAA0B,EAAE,EAAE;YAC9B,UAAU,EAAE,eAAe;YAC3B,UAAU,EAAE,MAAM;YAClB,gBAAgB,EAAE,IAAI;YACtB,QAAQ,EAAE,GAAG,GAAG,KAAK;YACrB,sBAAsB,EAAE,EAAE;YAC1B,aAAa,EAAE,EAAE;YACjB,gBAAgB,EAAE,IAAI;YACtB,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,EAAE;YACrB,cAAc,EAAE,EAAE;YAClB,4BAA4B,EAAE,KAAK;YACnC,yBAAyB,EAAE,MAAM;YACjC,iBAAiB,EAAE,KAAK;YACxB,iBAAiB,EAAE,QAAQ;YAC3B,qBAAqB,EAAE,UAAU;YACjC,oBAAoB,EAAE,gBAAgB;YACtC,iBAAiB,EAAE;gBACjB,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,KAAK,CAAC,aAAa;aAC3B;YACD,4BAA4B,EAAE,IAAI;YAClC,8BAA8B,EAAE,IAAI;YACpC,cAAc,EAAE,KAAK,CAAC,aAAa;YACnC,kBAAkB,EAAE,KAAK,CAAC,aAAa;YACvC,gCAAgC,EAAE,EAAE;YACpC,4BAA4B,EAAE,EAAE;YAChC,gBAAgB,EAAE,CAAC,MAAM,CAAC;YAC1B,oBAAoB,EAAE,KAAK;YAC3B,kBAAkB,EAAE,KAAK;SAC1B,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function objectAt(root: Record<string, unknown>, key: string): Record<string, unknown>;
2
+ export declare function asPlainObject(value: unknown): Record<string, unknown> | undefined;
@@ -0,0 +1,17 @@
1
+ export function objectAt(root, key) {
2
+ const existing = root[key];
3
+ const object = asPlainObject(existing);
4
+ if (object) {
5
+ return object;
6
+ }
7
+ const next = {};
8
+ root[key] = next;
9
+ return next;
10
+ }
11
+ export function asPlainObject(value) {
12
+ if (value && typeof value === "object" && !Array.isArray(value)) {
13
+ return value;
14
+ }
15
+ return undefined;
16
+ }
17
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/tools/helpers.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,IAA6B,EAAE,GAAW;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACjB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO,KAAgC,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolModule } from "../types.js";
2
+ export declare const hermesTool: ToolModule;
@@ -0,0 +1,64 @@
1
+ import path from "node:path";
2
+ import { BASE_URL, PROVIDER_ID, ZRO_ENV_KEY, ZRO_MODELS } from "../constants.js";
3
+ import { readConfig } from "../files.js";
4
+ import { yamlSerializer } from "../serializers.js";
5
+ import { asPlainObject } from "./helpers.js";
6
+ export const hermesTool = {
7
+ id: "hermes",
8
+ label: "Hermes",
9
+ async launch(ctx) {
10
+ const tempHome = path.join(ctx.tempDir, "home");
11
+ const filePath = path.join(tempHome, ".hermes", "config.yaml");
12
+ const existing = await readConfig(path.join(ctx.homeDir, ".hermes", "config.yaml"), yamlSerializer);
13
+ const nextConfig = buildHermesConfig(existing, ctx.apiKey, ctx.apiKeySource);
14
+ return {
15
+ tool: "hermes",
16
+ label: "Hermes",
17
+ model: ctx.model,
18
+ command: "hermes",
19
+ args: ["--provider", PROVIDER_ID, "--model", ctx.model, ...ctx.extraArgs],
20
+ env: {
21
+ HOME: tempHome
22
+ },
23
+ files: [{
24
+ path: filePath,
25
+ contents: yamlSerializer.stringify(nextConfig)
26
+ }],
27
+ message: "Launch Hermes with Zro"
28
+ };
29
+ }
30
+ };
31
+ function buildHermesConfig(existing, apiKey, apiKeySource = "flag") {
32
+ const next = { ...existing };
33
+ const providers = Array.isArray(next.custom_providers) ? [...next.custom_providers] : [];
34
+ const providerIndex = providers.findIndex((entry) => asPlainObject(entry)?.name === PROVIDER_ID);
35
+ const existingProvider = providerIndex >= 0 ? asPlainObject(providers[providerIndex]) ?? {} : {};
36
+ const models = { ...(asPlainObject(existingProvider.models) ?? {}) };
37
+ for (const model of ZRO_MODELS) {
38
+ models[model.id] = asPlainObject(models[model.id]) ?? {};
39
+ }
40
+ const provider = {
41
+ ...existingProvider,
42
+ name: PROVIDER_ID,
43
+ base_url: BASE_URL,
44
+ api_mode: typeof existingProvider.api_mode === "string" ? existingProvider.api_mode : "chat_completions",
45
+ models
46
+ };
47
+ if (apiKeySource === "env") {
48
+ delete provider.api_key;
49
+ provider.key_env = ZRO_ENV_KEY;
50
+ }
51
+ else {
52
+ delete provider.key_env;
53
+ provider.api_key = apiKey;
54
+ }
55
+ if (providerIndex >= 0) {
56
+ providers[providerIndex] = provider;
57
+ }
58
+ else {
59
+ providers.push(provider);
60
+ }
61
+ next.custom_providers = providers;
62
+ return next;
63
+ }
64
+ //# sourceMappingURL=hermes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes.js","sourceRoot":"","sources":["../../src/tools/hermes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ToolModule } from "../types.js";
2
+ export declare const openClawTool: ToolModule;
@@ -0,0 +1,84 @@
1
+ import path from "node:path";
2
+ import { BASE_URL, PROVIDER_ID, ZRO_MODELS } from "../constants.js";
3
+ import { readConfig } from "../files.js";
4
+ import { json5Serializer } from "../serializers.js";
5
+ import { asPlainObject, objectAt } from "./helpers.js";
6
+ export const openClawTool = {
7
+ id: "openclaw",
8
+ label: "OpenClaw",
9
+ async launch(ctx) {
10
+ const tempHome = path.join(ctx.tempDir, "home");
11
+ const filePath = path.join(tempHome, ".openclaw", "openclaw.json");
12
+ const existing = await readConfig(path.join(ctx.homeDir, ".openclaw", "openclaw.json"), json5Serializer);
13
+ const nextConfig = buildOpenClawConfig(existing, ctx.apiKey);
14
+ objectAt(objectAt(objectAt(nextConfig, "agents"), "defaults"), "model").primary = `${PROVIDER_ID}/${ctx.model}`;
15
+ return {
16
+ tool: "openclaw",
17
+ label: "OpenClaw",
18
+ model: ctx.model,
19
+ command: "openclaw",
20
+ args: ctx.extraArgs,
21
+ env: {
22
+ HOME: tempHome
23
+ },
24
+ files: [{
25
+ path: filePath,
26
+ contents: json5Serializer.stringify(nextConfig)
27
+ }],
28
+ message: "Launch OpenClaw with Zro"
29
+ };
30
+ }
31
+ };
32
+ function buildOpenClawConfig(existing, apiKey) {
33
+ const next = { ...existing };
34
+ const agents = objectAt(next, "agents");
35
+ const defaults = objectAt(agents, "defaults");
36
+ const allowedModels = objectAt(defaults, "models");
37
+ for (const zroModel of ZRO_MODELS) {
38
+ const modelRef = `${PROVIDER_ID}/${zroModel.id}`;
39
+ const existingAlias = allowedModels[modelRef];
40
+ allowedModels[modelRef] = {
41
+ ...(asPlainObject(existingAlias) ?? {}),
42
+ alias: zroModel.id
43
+ };
44
+ }
45
+ const modelsRoot = objectAt(next, "models");
46
+ if (typeof modelsRoot.mode !== "string") {
47
+ modelsRoot.mode = "merge";
48
+ }
49
+ const providers = objectAt(modelsRoot, "providers");
50
+ const provider = { ...(asPlainObject(providers[PROVIDER_ID]) ?? {}) };
51
+ const providerModels = Array.isArray(provider.models) ? [...provider.models] : [];
52
+ for (const zroModel of ZRO_MODELS) {
53
+ upsertOpenClawModel(providerModels, zroModel);
54
+ }
55
+ providers[PROVIDER_ID] = {
56
+ ...provider,
57
+ baseUrl: BASE_URL,
58
+ apiKey,
59
+ api: "openai-completions",
60
+ timeoutSeconds: typeof provider.timeoutSeconds === "number" ? provider.timeoutSeconds : 300,
61
+ models: providerModels
62
+ };
63
+ return next;
64
+ }
65
+ function upsertOpenClawModel(models, model) {
66
+ const nextModel = {
67
+ id: model.id,
68
+ name: model.id,
69
+ input: ["text"],
70
+ contextWindow: model.contextWindow,
71
+ maxTokens: model.maxOutputTokens
72
+ };
73
+ const index = models.findIndex((entry) => {
74
+ if (!entry || typeof entry !== "object" || Array.isArray(entry))
75
+ return false;
76
+ return entry.id === model.id;
77
+ });
78
+ if (index >= 0) {
79
+ models[index] = { ...models[index], ...nextModel };
80
+ return;
81
+ }
82
+ models.unshift(nextModel);
83
+ }
84
+ //# sourceMappingURL=openclaw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/tools/openclaw.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ToolModule } from "../types.js";
2
+ export declare const opencodeTool: ToolModule;