offrouter-cli 0.2.1 → 0.3.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.
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AA2IhD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,cAAc,GACxB,IAAI,CA2DN"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AA2IhD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,cAAc,GACxB,IAAI,CA2DN"}
@@ -1,6 +1,6 @@
1
1
  import { execSync } from "node:child_process";
2
2
  import { join } from "node:path";
3
- import { FileSecretStore, PKCE_CONFIGS, getOAuthTokens, isOAuthProvider, isOAuthTokenExpired, refreshTokens, resolveClientId, resolveOffRouterHome, runOAuthLogin, } from "offrouter-core";
3
+ import { FileSecretStore, PKCE_CONFIGS, getOAuthTokens, isOAuthProvider, isOAuthTokenExpired, refreshTokens, resolveClientId, resolveOffRouterHome, runOAuthLogin, startDeviceCodeFlow, } from "offrouter-core";
4
4
  import { writeJson, writeText } from "./output.js";
5
5
  // ---------------------------------------------------------------------------
6
6
  // Browser open (macOS, best-effort)
@@ -105,8 +105,8 @@ async function statusForProvider(providerId, env) {
105
105
  export function registerLoginCommand(program, ctx) {
106
106
  const cmd = program
107
107
  .command("login")
108
- .description("Authenticate with an OAuth provider (Anthropic or OpenAI). Tokens stored in the OffRouter secret store.")
109
- .argument("[provider]", "Provider id (anthropic, openai)")
108
+ .description("Authenticate with an OAuth provider. Tokens stored in the OffRouter secret store.")
109
+ .argument("[provider]", "Provider id (anthropic, openai, xai, github-copilot)")
110
110
  .option("--list", "List providers with stored tokens")
111
111
  .option("--status <provider>", "Check token status for a provider")
112
112
  .option("--json", "Emit JSON", false)
@@ -237,6 +237,62 @@ async function handleLogin(stdout, env, provider, opts) {
237
237
  }
238
238
  const store = createStore(env);
239
239
  const timeoutMs = opts.timeout ? parseInt(opts.timeout, 10) : 5 * 60 * 1000;
240
+ // Device code providers (xAI, GitHub Copilot): use device code flow
241
+ if (config.deviceCodeUrl) {
242
+ try {
243
+ const result = await startDeviceCodeFlow(provider, {
244
+ store,
245
+ clientId,
246
+ fetch: undefined,
247
+ onDeviceCode(data) {
248
+ writeText(stdout, "");
249
+ writeText(stdout, `To authorize OffRouter for ${provider}:`);
250
+ writeText(stdout, "");
251
+ writeText(stdout, ` Visit: ${data.verification_uri}`);
252
+ writeText(stdout, ` Enter code: ${data.user_code}`);
253
+ writeText(stdout, "");
254
+ const url = data.verification_uri_complete ?? data.verification_uri;
255
+ const opened = openBrowser(url);
256
+ if (!opened) {
257
+ writeText(stdout, "(Could not open browser automatically. Copy and paste the URL above.)");
258
+ }
259
+ writeText(stdout, "Waiting for authorization...");
260
+ },
261
+ openBrowser,
262
+ });
263
+ if (opts.json) {
264
+ writeJson(stdout, {
265
+ provider: result.provider,
266
+ ok: true,
267
+ expiresAt: result.expiresAt,
268
+ scope: result.scope,
269
+ });
270
+ }
271
+ else {
272
+ writeText(stdout, "");
273
+ writeText(stdout, `✓ Login successful for ${provider}.`);
274
+ writeText(stdout, ` Tokens stored in OffRouter secret store.`);
275
+ if (result.expiresAt) {
276
+ const expiresIn = Math.round((result.expiresAt - Date.now()) / 1000 / 60);
277
+ writeText(stdout, ` Token expires in ${expiresIn} minutes.`);
278
+ }
279
+ writeText(stdout, "");
280
+ }
281
+ }
282
+ catch (err) {
283
+ const msg = err instanceof Error ? err.message : String(err);
284
+ if (opts.json) {
285
+ writeJson(stdout, { error: msg, provider, ok: false });
286
+ }
287
+ else {
288
+ writeText(stdout, "");
289
+ writeText(stdout, `✗ Login failed for ${provider}: ${msg}`);
290
+ writeText(stdout, "");
291
+ }
292
+ }
293
+ return;
294
+ }
295
+ // PKCE browser callback providers (Anthropic, OpenAI)
240
296
  try {
241
297
  const result = await runOAuthLogin({
242
298
  provider,
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "offrouter-cli",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "offrouter": "dist/index.js"
@@ -12,13 +12,18 @@
12
12
  "test": "vitest run"
13
13
  },
14
14
  "dependencies": {
15
- "offrouter-adapter-claude": "0.2.1",
16
- "offrouter-adapter-codex": "0.2.1",
17
- "offrouter-adapter-gemini": "0.2.1",
18
- "offrouter-adapter-grok": "0.2.1",
19
- "offrouter-core": "0.2.1",
20
- "offrouter-mcp": "0.2.1",
15
+ "offrouter-adapter-claude": "0.3.0",
16
+ "offrouter-adapter-codex": "0.3.0",
17
+ "offrouter-adapter-gemini": "0.3.0",
18
+ "offrouter-adapter-grok": "0.3.0",
19
+ "offrouter-core": "0.3.0",
20
+ "offrouter-mcp": "0.3.0",
21
21
  "commander": "^12.0.0",
22
22
  "zod": "^3.23.0"
23
- }
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "README.md",
27
+ "LICENSE"
28
+ ]
24
29
  }
@@ -1,258 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { mkdtemp, rm, writeFile } from "node:fs/promises";
3
- import { mkdirSync, writeFileSync } from "node:fs";
4
- import { tmpdir } from "node:os";
5
- import { join } from "node:path";
6
- import { fetchCatalogCache, readCatalogCache } from "./catalog-cache.js";
7
- import type { CatalogCacheData } from "./catalog-cache.js";
8
- import sampleData from "./catalog-sample.json" with { type: "json" };
9
-
10
- describe("readCatalogCache", () => {
11
- it("returns null when no cache file exists", async () => {
12
- const dir = await mkdtemp(join(tmpdir(), "offrouter-cache-test-"));
13
- try {
14
- const result = readCatalogCache(dir);
15
- expect(result).toBeNull();
16
- } finally {
17
- await rm(dir, { recursive: true, force: true });
18
- }
19
- });
20
-
21
- it("returns parsed data when valid cache file exists", async () => {
22
- const dir = await mkdtemp(join(tmpdir(), "offrouter-cache-test-"));
23
- try {
24
- const cacheFile = join(dir, "catalog.json");
25
- await writeFile(cacheFile, JSON.stringify(sampleData), "utf-8");
26
- const result = readCatalogCache(dir);
27
- expect(result).not.toBeNull();
28
- expect(result!.version).toBe(1);
29
- expect(result!.families).toHaveLength(2);
30
- expect(result!.families[0]!.providerId).toBe("openai");
31
- expect(result!.families[0]!.modelId).toBe("gpt-4.1");
32
- } finally {
33
- await rm(dir, { recursive: true, force: true });
34
- }
35
- });
36
-
37
- it("returns null for invalid JSON", async () => {
38
- const dir = await mkdtemp(join(tmpdir(), "offrouter-cache-test-"));
39
- try {
40
- const cacheFile = join(dir, "catalog.json");
41
- await writeFile(cacheFile, "not valid json", "utf-8");
42
- const result = readCatalogCache(dir);
43
- expect(result).toBeNull();
44
- } finally {
45
- await rm(dir, { recursive: true, force: true });
46
- }
47
- });
48
-
49
- it("returns null for schema-mismatched data", async () => {
50
- const dir = await mkdtemp(join(tmpdir(), "offrouter-cache-test-"));
51
- try {
52
- const cacheFile = join(dir, "catalog.json");
53
- await writeFile(
54
- cacheFile,
55
- JSON.stringify({ version: "not-a-number", generatedAt: "", families: [] }),
56
- "utf-8",
57
- );
58
- const result = readCatalogCache(dir);
59
- expect(result).toBeNull();
60
- } finally {
61
- await rm(dir, { recursive: true, force: true });
62
- }
63
- });
64
- });
65
-
66
- describe("fetchCatalogCache", () => {
67
- it("fetches from network and caches the result", async () => {
68
- const dir = await mkdtemp(join(tmpdir(), "offrouter-cache-test-"));
69
- try {
70
- const mockFetch = vi.fn().mockResolvedValue({
71
- ok: true,
72
- json: () => Promise.resolve(sampleData),
73
- });
74
-
75
- const result = await fetchCatalogCache({
76
- fetch: mockFetch as unknown as typeof globalThis.fetch,
77
- cacheDir: dir,
78
- });
79
-
80
- expect(result.source).toBe("network");
81
- expect(result.data).not.toBeNull();
82
- expect(result.data!.version).toBe(1);
83
- expect(mockFetch).toHaveBeenCalledOnce();
84
-
85
- // Verify cache file was written
86
- const cached = readCatalogCache(dir);
87
- expect(cached).not.toBeNull();
88
- expect(cached!.families).toHaveLength(2);
89
- } finally {
90
- await rm(dir, { recursive: true, force: true });
91
- }
92
- });
93
-
94
- it("falls back to cached file on network failure", async () => {
95
- const dir = await mkdtemp(join(tmpdir(), "offrouter-cache-test-"));
96
- try {
97
- // Pre-populate cache
98
- const cacheFile = join(dir, "catalog.json");
99
- mkdirSync(dir, { recursive: true });
100
- writeFileSync(cacheFile, JSON.stringify(sampleData), { mode: 0o600 });
101
-
102
- const mockFetch = vi
103
- .fn()
104
- .mockRejectedValue(new Error("Network failure"));
105
-
106
- const result = await fetchCatalogCache({
107
- fetch: mockFetch as unknown as typeof globalThis.fetch,
108
- cacheDir: dir,
109
- });
110
-
111
- expect(result.source).toBe("cache");
112
- expect(result.data).not.toBeNull();
113
- expect(result.data!.families[0]!.modelId).toBe("gpt-4.1");
114
- } finally {
115
- await rm(dir, { recursive: true, force: true });
116
- }
117
- });
118
-
119
- it("returns source=builtin when both network and cache fail", async () => {
120
- const dir = await mkdtemp(join(tmpdir(), "offrouter-cache-test-"));
121
- try {
122
- const mockFetch = vi
123
- .fn()
124
- .mockRejectedValue(new Error("Network failure"));
125
-
126
- const result = await fetchCatalogCache({
127
- fetch: mockFetch as unknown as typeof globalThis.fetch,
128
- cacheDir: dir,
129
- });
130
-
131
- expect(result.source).toBe("builtin");
132
- expect(result.data).toBeNull();
133
- } finally {
134
- await rm(dir, { recursive: true, force: true });
135
- }
136
- });
137
-
138
- it("falls back to cache on non-ok HTTP response", async () => {
139
- const dir = await mkdtemp(join(tmpdir(), "offrouter-cache-test-"));
140
- try {
141
- // Pre-populate cache
142
- const cacheFile = join(dir, "catalog.json");
143
- mkdirSync(dir, { recursive: true });
144
- writeFileSync(cacheFile, JSON.stringify(sampleData), { mode: 0o600 });
145
-
146
- const mockFetch = vi.fn().mockResolvedValue({
147
- ok: false,
148
- status: 404,
149
- json: () => Promise.resolve({ error: "not found" }),
150
- });
151
-
152
- const result = await fetchCatalogCache({
153
- fetch: mockFetch as unknown as typeof globalThis.fetch,
154
- cacheDir: dir,
155
- });
156
-
157
- expect(result.source).toBe("cache");
158
- expect(result.data).not.toBeNull();
159
- } finally {
160
- await rm(dir, { recursive: true, force: true });
161
- }
162
- });
163
-
164
- it("rejects malformed JSON from network and falls back", async () => {
165
- const dir = await mkdtemp(join(tmpdir(), "offrouter-cache-test-"));
166
- try {
167
- // Pre-populate cache
168
- const cacheFile = join(dir, "catalog.json");
169
- mkdirSync(dir, { recursive: true });
170
- writeFileSync(cacheFile, JSON.stringify(sampleData), { mode: 0o600 });
171
-
172
- const mockFetch = vi.fn().mockResolvedValue({
173
- ok: true,
174
- json: () => Promise.resolve({ version: "oops", generatedAt: 123, families: null }),
175
- });
176
-
177
- const result = await fetchCatalogCache({
178
- fetch: mockFetch as unknown as typeof globalThis.fetch,
179
- cacheDir: dir,
180
- });
181
-
182
- expect(result.source).toBe("cache");
183
- expect(result.data).not.toBeNull();
184
- } finally {
185
- await rm(dir, { recursive: true, force: true });
186
- }
187
- });
188
-
189
- it("uses injected url", async () => {
190
- const dir = await mkdtemp(join(tmpdir(), "offrouter-cache-test-"));
191
- try {
192
- const mockFetch = vi.fn().mockResolvedValue({
193
- ok: true,
194
- json: () => Promise.resolve(sampleData),
195
- });
196
-
197
- await fetchCatalogCache({
198
- fetch: mockFetch as unknown as typeof globalThis.fetch,
199
- url: "https://example.com/custom-catalog.json",
200
- cacheDir: dir,
201
- });
202
-
203
- expect(mockFetch).toHaveBeenCalledWith(
204
- "https://example.com/custom-catalog.json",
205
- );
206
- } finally {
207
- await rm(dir, { recursive: true, force: true });
208
- }
209
- });
210
-
211
- it("writes cache file with mode 0o600 on POSIX", async () => {
212
- const dir = await mkdtemp(join(tmpdir(), "offrouter-cache-test-"));
213
- try {
214
- const mockFetch = vi.fn().mockResolvedValue({
215
- ok: true,
216
- json: () => Promise.resolve(sampleData),
217
- });
218
-
219
- await fetchCatalogCache({
220
- fetch: mockFetch as unknown as typeof globalThis.fetch,
221
- cacheDir: dir,
222
- });
223
-
224
- const cacheFile = join(dir, "catalog.json");
225
- const { readFileSync } = await import("node:fs");
226
- const content = readFileSync(cacheFile, "utf-8");
227
- const parsed = JSON.parse(content) as CatalogCacheData;
228
- expect(parsed.version).toBe(1);
229
- } finally {
230
- await rm(dir, { recursive: true, force: true });
231
- }
232
- });
233
-
234
- it("dryRun=true does not write to cache", async () => {
235
- const dir = await mkdtemp(join(tmpdir(), "offrouter-cache-test-"));
236
- try {
237
- const mockFetch = vi.fn().mockResolvedValue({
238
- ok: true,
239
- json: () => Promise.resolve(sampleData),
240
- });
241
-
242
- const result = await fetchCatalogCache({
243
- fetch: mockFetch as unknown as typeof globalThis.fetch,
244
- cacheDir: dir,
245
- dryRun: true,
246
- });
247
-
248
- expect(result.source).toBe("network");
249
- expect(result.data).not.toBeNull();
250
-
251
- // Verify no cache file was written
252
- const cached = readCatalogCache(dir);
253
- expect(cached).toBeNull();
254
- } finally {
255
- await rm(dir, { recursive: true, force: true });
256
- }
257
- });
258
- });
@@ -1,169 +0,0 @@
1
- import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { homedir } from "node:os";
4
- import { z } from "zod";
5
-
6
- // ---------------------------------------------------------------------------
7
- // Constants
8
- // ---------------------------------------------------------------------------
9
-
10
- /** Default remote catalog URL — static public file on GitHub. */
11
- export const CATALOG_URL =
12
- "https://raw.githubusercontent.com/pooriaarab/offrouter/main/packages/core/src/providers/catalog-data.json" as const;
13
-
14
- /** Cache directory name inside OFFROUTER_HOME. */
15
- export const CACHE_DIR_NAME = "cache" as const;
16
-
17
- /** Cache file name. */
18
- export const CACHE_FILE_NAME = "catalog.json" as const;
19
-
20
- // ---------------------------------------------------------------------------
21
- // Types
22
- // ---------------------------------------------------------------------------
23
-
24
- /**
25
- * A single model family entry as stored in the cache.
26
- * Includes providerId so the merge knows which provider the model belongs to.
27
- */
28
- export interface CachedModelFamily {
29
- providerId: string;
30
- modelId: string;
31
- displayName?: string;
32
- family: string;
33
- contextWindowTokens?: number;
34
- maxOutputTokens?: number;
35
- supportsTools?: boolean;
36
- supportsStreaming?: boolean;
37
- supportsJson?: boolean;
38
- supportsImages?: boolean;
39
- }
40
-
41
- /** Schema for the cached catalog file. */
42
- export interface CatalogCacheData {
43
- version: number;
44
- generatedAt: string;
45
- families: CachedModelFamily[];
46
- }
47
-
48
- // ---------------------------------------------------------------------------
49
- // Zod schemas
50
- // ---------------------------------------------------------------------------
51
-
52
- const CachedModelFamilySchema = z.object({
53
- providerId: z.string().min(1),
54
- modelId: z.string().min(1),
55
- displayName: z.string().optional(),
56
- family: z.string().min(1),
57
- contextWindowTokens: z.number().int().positive().optional(),
58
- maxOutputTokens: z.number().int().positive().optional(),
59
- supportsTools: z.boolean().optional(),
60
- supportsStreaming: z.boolean().optional(),
61
- supportsJson: z.boolean().optional(),
62
- supportsImages: z.boolean().optional(),
63
- });
64
-
65
- const CatalogCacheDataSchema = z
66
- .object({
67
- version: z.number().int().nonnegative(),
68
- generatedAt: z.string(),
69
- families: z.array(CachedModelFamilySchema),
70
- })
71
- .strict();
72
-
73
- // ---------------------------------------------------------------------------
74
- // Helpers
75
- // ---------------------------------------------------------------------------
76
-
77
- /** Resolve the cache directory from env or default. */
78
- export function resolveCacheDir(env?: NodeJS.ProcessEnv): string {
79
- const home = env?.OFFROUTER_HOME;
80
- if (home && home.length > 0) {
81
- return join(home, CACHE_DIR_NAME);
82
- }
83
- return join(homedir(), ".offrouter", CACHE_DIR_NAME);
84
- }
85
-
86
- // ---------------------------------------------------------------------------
87
- // Public API
88
- // ---------------------------------------------------------------------------
89
-
90
- /**
91
- * Read the cached catalog file synchronously.
92
- * Returns null if the file does not exist or fails validation.
93
- */
94
- export function readCatalogCache(cacheDir: string): CatalogCacheData | null {
95
- const cacheFile = join(cacheDir, CACHE_FILE_NAME);
96
- try {
97
- if (!existsSync(cacheFile)) {
98
- return null;
99
- }
100
- const raw = readFileSync(cacheFile, "utf-8");
101
- const parsed = JSON.parse(raw) as unknown;
102
- return CatalogCacheDataSchema.parse(parsed);
103
- } catch {
104
- return null;
105
- }
106
- }
107
-
108
- /**
109
- * Fetch the latest catalog from the remote URL, falling back to the cached
110
- * file, then builtin (null data).
111
- *
112
- * The fetch function is injectable for tests. Never makes a real network call
113
- * in tests unless OFFROUTER_LIVE_TESTS=1 (callers must provide a mock fetch).
114
- *
115
- * Returns:
116
- * - source: 'network' — fetched and cached successfully
117
- * - source: 'cache' — network failed, used cached file
118
- * - source: 'builtin' — both failed, no cached data
119
- */
120
- export async function fetchCatalogCache(
121
- options: {
122
- fetch?: typeof globalThis.fetch;
123
- url?: string;
124
- cacheDir?: string;
125
- env?: NodeJS.ProcessEnv;
126
- /** If true, fetch but do not write to the cache file. */
127
- dryRun?: boolean;
128
- } = {},
129
- ): Promise<{
130
- data: CatalogCacheData | null;
131
- fetchedAt: string;
132
- source: "cache" | "network" | "builtin";
133
- }> {
134
- const fetcher = options.fetch ?? globalThis.fetch;
135
- const url = options.url ?? CATALOG_URL;
136
- const cacheDir = options.cacheDir ?? resolveCacheDir(options.env);
137
- const fetchedAt = new Date().toISOString();
138
-
139
- // Try network fetch
140
- try {
141
- const response = await fetcher(url);
142
- if (response.ok) {
143
- const json = (await response.json()) as unknown;
144
- const parsed = CatalogCacheDataSchema.parse(json);
145
-
146
- // Write to cache unless dry-run (mode 0o600 on POSIX)
147
- if (!options.dryRun) {
148
- const cacheFile = join(cacheDir, CACHE_FILE_NAME);
149
- mkdirSync(cacheDir, { recursive: true });
150
- writeFileSync(cacheFile, JSON.stringify(parsed, null, 2), {
151
- mode: 0o600,
152
- });
153
- }
154
-
155
- return { data: parsed, fetchedAt, source: "network" };
156
- }
157
- } catch {
158
- // Network failure — fall through to cache
159
- }
160
-
161
- // Try local cache
162
- const cached = readCatalogCache(cacheDir);
163
- if (cached) {
164
- return { data: cached, fetchedAt, source: "cache" };
165
- }
166
-
167
- // No data available
168
- return { data: null, fetchedAt, source: "builtin" };
169
- }
@@ -1,30 +0,0 @@
1
- {
2
- "version": 1,
3
- "generatedAt": "2025-06-01T00:00:00.000Z",
4
- "families": [
5
- {
6
- "providerId": "openai",
7
- "modelId": "gpt-4.1",
8
- "displayName": "GPT-4.1",
9
- "family": "frontier-coder",
10
- "contextWindowTokens": 1047576,
11
- "maxOutputTokens": 32768,
12
- "supportsTools": true,
13
- "supportsStreaming": true,
14
- "supportsJson": true,
15
- "supportsImages": true
16
- },
17
- {
18
- "providerId": "anthropic",
19
- "modelId": "claude-sonnet-4",
20
- "displayName": "Claude Sonnet 4",
21
- "family": "frontier-coder",
22
- "contextWindowTokens": 200000,
23
- "maxOutputTokens": 32000,
24
- "supportsTools": true,
25
- "supportsStreaming": true,
26
- "supportsJson": true,
27
- "supportsImages": true
28
- }
29
- ]
30
- }