@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
@@ -0,0 +1,65 @@
1
+ import path from "node:path";
2
+ import { BASE_URL, PROVIDER_ID, PROVIDER_NAME, ZRO_ENV_KEY, ZRO_MODELS } from "../constants.js";
3
+ import { readConfig } from "../files.js";
4
+ import { jsonSerializer } from "../serializers.js";
5
+ import { asPlainObject, objectAt } from "./helpers.js";
6
+ export const opencodeTool = {
7
+ id: "opencode",
8
+ label: "opencode",
9
+ async launch(ctx) {
10
+ const configRoot = path.join(ctx.tempDir, "xdg");
11
+ const filePath = path.join(configRoot, "opencode", "opencode.json");
12
+ const userConfigRoot = process.env.XDG_CONFIG_HOME ?? path.join(ctx.homeDir, ".config");
13
+ const existing = await readConfig(path.join(userConfigRoot, "opencode", "opencode.json"), jsonSerializer);
14
+ const nextConfig = buildOpenCodeConfig(existing, ctx.apiKey, true);
15
+ nextConfig.model = `${PROVIDER_ID}/${ctx.model}`;
16
+ return {
17
+ tool: "opencode",
18
+ label: "opencode",
19
+ model: ctx.model,
20
+ command: "opencode",
21
+ args: ctx.extraArgs,
22
+ env: {
23
+ XDG_CONFIG_HOME: configRoot,
24
+ [ZRO_ENV_KEY]: ctx.apiKey
25
+ },
26
+ files: [{
27
+ path: filePath,
28
+ contents: jsonSerializer.stringify(nextConfig)
29
+ }],
30
+ message: "Launch opencode with Zro"
31
+ };
32
+ }
33
+ };
34
+ function buildOpenCodeConfig(existing, apiKey, useEnvReference = false) {
35
+ const next = { ...existing };
36
+ if (typeof next.$schema !== "string") {
37
+ next.$schema = "https://opencode.ai/config.json";
38
+ }
39
+ const provider = objectAt(next, "provider");
40
+ provider[PROVIDER_ID] = openAiCompatibleProvider(provider[PROVIDER_ID], apiKey, ZRO_MODELS.map((model) => model.id), useEnvReference);
41
+ return next;
42
+ }
43
+ function openAiCompatibleProvider(existing, apiKey, modelIds, useEnvReference = false) {
44
+ const existingProvider = asPlainObject(existing) ?? {};
45
+ const existingOptions = asPlainObject(existingProvider.options) ?? {};
46
+ const models = { ...(asPlainObject(existingProvider.models) ?? {}) };
47
+ for (const model of modelIds) {
48
+ models[model] = {
49
+ ...(asPlainObject(models[model]) ?? {}),
50
+ name: model
51
+ };
52
+ }
53
+ return {
54
+ ...existingProvider,
55
+ npm: "@ai-sdk/openai-compatible",
56
+ name: PROVIDER_NAME,
57
+ options: {
58
+ ...existingOptions,
59
+ baseURL: BASE_URL,
60
+ apiKey: useEnvReference ? `{env:${ZRO_ENV_KEY}}` : apiKey
61
+ },
62
+ models
63
+ };
64
+ }
65
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/tools/opencode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { Readable, Writable } from "node:stream";
2
+ import type { ChildProcess } from "node:child_process";
3
+ import type { SUPPORTED_TOOLS } from "./constants.js";
4
+ export type ToolId = (typeof SUPPORTED_TOOLS)[number];
5
+ export type ApiKeySource = "flag" | "env" | "stored";
6
+ export type CliArgs = {
7
+ command: "launch";
8
+ tool: string;
9
+ apiKey?: string;
10
+ model?: string;
11
+ print: boolean;
12
+ extraArgs: string[];
13
+ } | {
14
+ command: "login";
15
+ apiKey?: string;
16
+ } | {
17
+ command: "logout";
18
+ } | {
19
+ command: "auth-status";
20
+ };
21
+ export interface LaunchContext {
22
+ apiKey: string;
23
+ apiKeySource: ApiKeySource;
24
+ model: string;
25
+ print: boolean;
26
+ extraArgs: string[];
27
+ homeDir: string;
28
+ cwd: string;
29
+ tempDir: string;
30
+ stdin: Readable;
31
+ stdout: Writable;
32
+ stderr: Writable;
33
+ }
34
+ export interface LaunchFile {
35
+ path: string;
36
+ contents: string;
37
+ }
38
+ export interface LaunchPlan {
39
+ tool: ToolId;
40
+ label: string;
41
+ model: string;
42
+ command: string;
43
+ args: string[];
44
+ env?: Record<string, string>;
45
+ files?: LaunchFile[];
46
+ message?: string;
47
+ }
48
+ export interface ToolModule {
49
+ id: ToolId;
50
+ label: string;
51
+ launch(ctx: LaunchContext): Promise<LaunchPlan>;
52
+ }
53
+ export interface SpawnOptions {
54
+ cwd: string;
55
+ env: NodeJS.ProcessEnv;
56
+ stdio: "inherit";
57
+ }
58
+ export type SpawnProcess = (command: string, args: string[], options: SpawnOptions) => ChildProcess;
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@moonmath-ai/zro",
3
+ "version": "0.1.0",
4
+ "description": "Launch coding tools with the Zro OpenAI-compatible endpoint.",
5
+ "type": "module",
6
+ "bin": {
7
+ "zro": "./dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "os": [
14
+ "!win32"
15
+ ],
16
+ "engines": {
17
+ "node": ">=18"
18
+ },
19
+ "scripts": {
20
+ "build": "rm -rf dist && tsc -p tsconfig.json && chmod +x dist/cli.js",
21
+ "prepack": "npm run build",
22
+ "test": "vitest run"
23
+ },
24
+ "dependencies": {
25
+ "json5": "^2.2.3",
26
+ "yaml": "^2.8.1"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "^20.19.0",
30
+ "typescript": "^5.9.3",
31
+ "vitest": "^4.0.15"
32
+ },
33
+ "keywords": [
34
+ "zro",
35
+ "cli",
36
+ "claude",
37
+ "codex",
38
+ "hermes",
39
+ "openclaw",
40
+ "opencode"
41
+ ],
42
+ "license": "MIT"
43
+ }