offrouter-cli 0.0.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/dist/catalog-cache.d.ts +60 -0
- package/dist/catalog-cache.d.ts.map +1 -0
- package/dist/catalog-cache.js +113 -0
- package/dist/catalog-cache.js.map +1 -0
- package/dist/commands/config-error.d.ts +8 -0
- package/dist/commands/config-error.d.ts.map +1 -0
- package/dist/commands/config-error.js +22 -0
- package/dist/commands/config-error.js.map +1 -0
- package/dist/commands/detection.d.ts +55 -0
- package/dist/commands/detection.d.ts.map +1 -0
- package/dist/commands/detection.js +131 -0
- package/dist/commands/detection.js.map +1 -0
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +369 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/hooks.d.ts +4 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +86 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/init.d.ts +12 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +38 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +8 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +267 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/login.d.ts +4 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +25 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/mcp.d.ts +4 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +27 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/models.d.ts +15 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js +124 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/commands/output.d.ts +6 -0
- package/dist/commands/output.d.ts.map +1 -0
- package/dist/commands/output.js +7 -0
- package/dist/commands/output.js.map +1 -0
- package/dist/commands/profiles.d.ts +4 -0
- package/dist/commands/profiles.d.ts.map +1 -0
- package/dist/commands/profiles.js +46 -0
- package/dist/commands/profiles.js.map +1 -0
- package/dist/commands/proxy.d.ts +10 -0
- package/dist/commands/proxy.d.ts.map +1 -0
- package/dist/commands/proxy.js +53 -0
- package/dist/commands/proxy.js.map +1 -0
- package/dist/commands/route.d.ts +4 -0
- package/dist/commands/route.d.ts.map +1 -0
- package/dist/commands/route.js +123 -0
- package/dist/commands/route.js.map +1 -0
- package/dist/commands/status.d.ts +4 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +86 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +9 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +44 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +137 -0
- package/dist/index.js.map +1 -0
- package/package.json +24 -0
- package/src/catalog-cache.test.ts +258 -0
- package/src/catalog-cache.ts +169 -0
- package/src/catalog-sample.json +30 -0
- package/src/cli.test.ts +1577 -0
- package/src/commands/config-error.ts +31 -0
- package/src/commands/detection.ts +209 -0
- package/src/commands/doctor.ts +503 -0
- package/src/commands/hooks.ts +125 -0
- package/src/commands/init.ts +59 -0
- package/src/commands/install.ts +438 -0
- package/src/commands/login.ts +33 -0
- package/src/commands/mcp.ts +35 -0
- package/src/commands/models.ts +168 -0
- package/src/commands/output.ts +11 -0
- package/src/commands/profiles.ts +58 -0
- package/src/commands/proxy.ts +87 -0
- package/src/commands/route.ts +160 -0
- package/src/commands/status.ts +111 -0
- package/src/commands/update.ts +62 -0
- package/src/index.ts +174 -0
- package/tsconfig.json +17 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/** Default remote catalog URL — static public file on GitHub. */
|
|
2
|
+
export declare const CATALOG_URL: "https://raw.githubusercontent.com/pooriaarab/offrouter/main/packages/core/src/providers/catalog-data.json";
|
|
3
|
+
/** Cache directory name inside OFFROUTER_HOME. */
|
|
4
|
+
export declare const CACHE_DIR_NAME: "cache";
|
|
5
|
+
/** Cache file name. */
|
|
6
|
+
export declare const CACHE_FILE_NAME: "catalog.json";
|
|
7
|
+
/**
|
|
8
|
+
* A single model family entry as stored in the cache.
|
|
9
|
+
* Includes providerId so the merge knows which provider the model belongs to.
|
|
10
|
+
*/
|
|
11
|
+
export interface CachedModelFamily {
|
|
12
|
+
providerId: string;
|
|
13
|
+
modelId: string;
|
|
14
|
+
displayName?: string;
|
|
15
|
+
family: string;
|
|
16
|
+
contextWindowTokens?: number;
|
|
17
|
+
maxOutputTokens?: number;
|
|
18
|
+
supportsTools?: boolean;
|
|
19
|
+
supportsStreaming?: boolean;
|
|
20
|
+
supportsJson?: boolean;
|
|
21
|
+
supportsImages?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/** Schema for the cached catalog file. */
|
|
24
|
+
export interface CatalogCacheData {
|
|
25
|
+
version: number;
|
|
26
|
+
generatedAt: string;
|
|
27
|
+
families: CachedModelFamily[];
|
|
28
|
+
}
|
|
29
|
+
/** Resolve the cache directory from env or default. */
|
|
30
|
+
export declare function resolveCacheDir(env?: NodeJS.ProcessEnv): string;
|
|
31
|
+
/**
|
|
32
|
+
* Read the cached catalog file synchronously.
|
|
33
|
+
* Returns null if the file does not exist or fails validation.
|
|
34
|
+
*/
|
|
35
|
+
export declare function readCatalogCache(cacheDir: string): CatalogCacheData | null;
|
|
36
|
+
/**
|
|
37
|
+
* Fetch the latest catalog from the remote URL, falling back to the cached
|
|
38
|
+
* file, then builtin (null data).
|
|
39
|
+
*
|
|
40
|
+
* The fetch function is injectable for tests. Never makes a real network call
|
|
41
|
+
* in tests unless OFFROUTER_LIVE_TESTS=1 (callers must provide a mock fetch).
|
|
42
|
+
*
|
|
43
|
+
* Returns:
|
|
44
|
+
* - source: 'network' — fetched and cached successfully
|
|
45
|
+
* - source: 'cache' — network failed, used cached file
|
|
46
|
+
* - source: 'builtin' — both failed, no cached data
|
|
47
|
+
*/
|
|
48
|
+
export declare function fetchCatalogCache(options?: {
|
|
49
|
+
fetch?: typeof globalThis.fetch;
|
|
50
|
+
url?: string;
|
|
51
|
+
cacheDir?: string;
|
|
52
|
+
env?: NodeJS.ProcessEnv;
|
|
53
|
+
/** If true, fetch but do not write to the cache file. */
|
|
54
|
+
dryRun?: boolean;
|
|
55
|
+
}): Promise<{
|
|
56
|
+
data: CatalogCacheData | null;
|
|
57
|
+
fetchedAt: string;
|
|
58
|
+
source: "cache" | "network" | "builtin";
|
|
59
|
+
}>;
|
|
60
|
+
//# sourceMappingURL=catalog-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-cache.d.ts","sourceRoot":"","sources":["../src/catalog-cache.ts"],"names":[],"mappings":"AASA,iEAAiE;AACjE,eAAO,MAAM,WAAW,EACtB,2GAAoH,CAAC;AAEvH,kDAAkD;AAClD,eAAO,MAAM,cAAc,EAAG,OAAgB,CAAC;AAE/C,uBAAuB;AACvB,eAAO,MAAM,eAAe,EAAG,cAAuB,CAAC;AAMvD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,0CAA0C;AAC1C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AA+BD,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAM/D;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAY1E;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,yDAAyD;IACzD,MAAM,CAAC,EAAE,OAAO,CAAC;CACb,GACL,OAAO,CAAC;IACT,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;CACzC,CAAC,CAoCD"}
|
|
@@ -0,0 +1,113 @@
|
|
|
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
|
+
// Constants
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
/** Default remote catalog URL — static public file on GitHub. */
|
|
9
|
+
export const CATALOG_URL = "https://raw.githubusercontent.com/pooriaarab/offrouter/main/packages/core/src/providers/catalog-data.json";
|
|
10
|
+
/** Cache directory name inside OFFROUTER_HOME. */
|
|
11
|
+
export const CACHE_DIR_NAME = "cache";
|
|
12
|
+
/** Cache file name. */
|
|
13
|
+
export const CACHE_FILE_NAME = "catalog.json";
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Zod schemas
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
const CachedModelFamilySchema = z.object({
|
|
18
|
+
providerId: z.string().min(1),
|
|
19
|
+
modelId: z.string().min(1),
|
|
20
|
+
displayName: z.string().optional(),
|
|
21
|
+
family: z.string().min(1),
|
|
22
|
+
contextWindowTokens: z.number().int().positive().optional(),
|
|
23
|
+
maxOutputTokens: z.number().int().positive().optional(),
|
|
24
|
+
supportsTools: z.boolean().optional(),
|
|
25
|
+
supportsStreaming: z.boolean().optional(),
|
|
26
|
+
supportsJson: z.boolean().optional(),
|
|
27
|
+
supportsImages: z.boolean().optional(),
|
|
28
|
+
});
|
|
29
|
+
const CatalogCacheDataSchema = z
|
|
30
|
+
.object({
|
|
31
|
+
version: z.number().int().nonnegative(),
|
|
32
|
+
generatedAt: z.string(),
|
|
33
|
+
families: z.array(CachedModelFamilySchema),
|
|
34
|
+
})
|
|
35
|
+
.strict();
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Helpers
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
/** Resolve the cache directory from env or default. */
|
|
40
|
+
export function resolveCacheDir(env) {
|
|
41
|
+
const home = env?.OFFROUTER_HOME;
|
|
42
|
+
if (home && home.length > 0) {
|
|
43
|
+
return join(home, CACHE_DIR_NAME);
|
|
44
|
+
}
|
|
45
|
+
return join(homedir(), ".offrouter", CACHE_DIR_NAME);
|
|
46
|
+
}
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// Public API
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
/**
|
|
51
|
+
* Read the cached catalog file synchronously.
|
|
52
|
+
* Returns null if the file does not exist or fails validation.
|
|
53
|
+
*/
|
|
54
|
+
export function readCatalogCache(cacheDir) {
|
|
55
|
+
const cacheFile = join(cacheDir, CACHE_FILE_NAME);
|
|
56
|
+
try {
|
|
57
|
+
if (!existsSync(cacheFile)) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const raw = readFileSync(cacheFile, "utf-8");
|
|
61
|
+
const parsed = JSON.parse(raw);
|
|
62
|
+
return CatalogCacheDataSchema.parse(parsed);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Fetch the latest catalog from the remote URL, falling back to the cached
|
|
70
|
+
* file, then builtin (null data).
|
|
71
|
+
*
|
|
72
|
+
* The fetch function is injectable for tests. Never makes a real network call
|
|
73
|
+
* in tests unless OFFROUTER_LIVE_TESTS=1 (callers must provide a mock fetch).
|
|
74
|
+
*
|
|
75
|
+
* Returns:
|
|
76
|
+
* - source: 'network' — fetched and cached successfully
|
|
77
|
+
* - source: 'cache' — network failed, used cached file
|
|
78
|
+
* - source: 'builtin' — both failed, no cached data
|
|
79
|
+
*/
|
|
80
|
+
export async function fetchCatalogCache(options = {}) {
|
|
81
|
+
const fetcher = options.fetch ?? globalThis.fetch;
|
|
82
|
+
const url = options.url ?? CATALOG_URL;
|
|
83
|
+
const cacheDir = options.cacheDir ?? resolveCacheDir(options.env);
|
|
84
|
+
const fetchedAt = new Date().toISOString();
|
|
85
|
+
// Try network fetch
|
|
86
|
+
try {
|
|
87
|
+
const response = await fetcher(url);
|
|
88
|
+
if (response.ok) {
|
|
89
|
+
const json = (await response.json());
|
|
90
|
+
const parsed = CatalogCacheDataSchema.parse(json);
|
|
91
|
+
// Write to cache unless dry-run (mode 0o600 on POSIX)
|
|
92
|
+
if (!options.dryRun) {
|
|
93
|
+
const cacheFile = join(cacheDir, CACHE_FILE_NAME);
|
|
94
|
+
mkdirSync(cacheDir, { recursive: true });
|
|
95
|
+
writeFileSync(cacheFile, JSON.stringify(parsed, null, 2), {
|
|
96
|
+
mode: 0o600,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return { data: parsed, fetchedAt, source: "network" };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Network failure — fall through to cache
|
|
104
|
+
}
|
|
105
|
+
// Try local cache
|
|
106
|
+
const cached = readCatalogCache(cacheDir);
|
|
107
|
+
if (cached) {
|
|
108
|
+
return { data: cached, fetchedAt, source: "cache" };
|
|
109
|
+
}
|
|
110
|
+
// No data available
|
|
111
|
+
return { data: null, fetchedAt, source: "builtin" };
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=catalog-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-cache.js","sourceRoot":"","sources":["../src/catalog-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-error.d.ts","sourceRoot":"","sources":["../../src/commands/config-error.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAqBhE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ConfigError } from "offrouter-core";
|
|
2
|
+
export function formatConfigError(error) {
|
|
3
|
+
if (error instanceof ConfigError) {
|
|
4
|
+
return {
|
|
5
|
+
name: error.name,
|
|
6
|
+
message: error.message,
|
|
7
|
+
filePath: error.filePath,
|
|
8
|
+
issues: error.issues,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
if (error instanceof Error) {
|
|
12
|
+
return {
|
|
13
|
+
name: error.name,
|
|
14
|
+
message: error.message,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
name: "Error",
|
|
19
|
+
message: String(error),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=config-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-error.js","sourceRoot":"","sources":["../../src/commands/config-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAS7C,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QACjC,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;KACvB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export declare const V1_HONESTY_LINE: "Claude Code's primary model is unchanged in V1. OffRouter routes delegated work.";
|
|
2
|
+
export declare const V1_CODEX_HONESTY_LINE: "Codex's primary model is unchanged in V1. OffRouter routes delegated work.";
|
|
3
|
+
export declare const V1_GEMINI_HONESTY_LINE: "Gemini CLI's primary model is unchanged in V1. OffRouter routes delegated work.";
|
|
4
|
+
export declare const V1_GROK_HONESTY_LINE: "Grok Build's primary model is unchanged in V1. OffRouter routes delegated work.";
|
|
5
|
+
export declare function honestyForHarness(kind: "claude" | "codex" | "gemini" | "grok"): string;
|
|
6
|
+
export interface HarnessProfileDetection {
|
|
7
|
+
kind: string;
|
|
8
|
+
profileHint: string;
|
|
9
|
+
detected: boolean;
|
|
10
|
+
pathChecked?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface AuthTierReadiness {
|
|
13
|
+
subscription: boolean;
|
|
14
|
+
local: boolean;
|
|
15
|
+
"api-key": boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface SubscriptionDetection {
|
|
18
|
+
status: "unconfigured" | "unknown" | "active";
|
|
19
|
+
/** Which first-party subscription surfaces appear installed (no credentials). */
|
|
20
|
+
surfaces: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface ApiKeyReadiness {
|
|
23
|
+
anyReady: boolean;
|
|
24
|
+
/** Env var names that are set (values never included). */
|
|
25
|
+
envPresent: string[];
|
|
26
|
+
}
|
|
27
|
+
export interface LocalRuntimeHealth {
|
|
28
|
+
health: "unconfigured" | "unknown" | "healthy";
|
|
29
|
+
ollamaHostConfigured: boolean;
|
|
30
|
+
/** True only if a common local binary path exists on disk (no spawn). */
|
|
31
|
+
localBinaryPresent: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface OpaqueLimitStatus {
|
|
34
|
+
/** Opaque summary only - no quota remaining figures from live APIs. */
|
|
35
|
+
status: "unavailable" | "unknown";
|
|
36
|
+
detail: string;
|
|
37
|
+
}
|
|
38
|
+
export interface DetectionSnapshot {
|
|
39
|
+
harnessProfiles: HarnessProfileDetection[];
|
|
40
|
+
authTiers: AuthTierReadiness;
|
|
41
|
+
subscription: SubscriptionDetection;
|
|
42
|
+
apiKeyReadiness: ApiKeyReadiness;
|
|
43
|
+
localRuntime: LocalRuntimeHealth;
|
|
44
|
+
limits: OpaqueLimitStatus;
|
|
45
|
+
/** Last provider error summary; null when none known. Never includes secrets. */
|
|
46
|
+
lastProviderError: string | null;
|
|
47
|
+
honesty: typeof V1_HONESTY_LINE;
|
|
48
|
+
}
|
|
49
|
+
export interface DetectionOptions {
|
|
50
|
+
env?: NodeJS.ProcessEnv;
|
|
51
|
+
homedir?: () => string;
|
|
52
|
+
cwd?: string;
|
|
53
|
+
}
|
|
54
|
+
export declare function detectEnvironment(options?: DetectionOptions): Promise<DetectionSnapshot>;
|
|
55
|
+
//# sourceMappingURL=detection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detection.d.ts","sourceRoot":"","sources":["../../src/commands/detection.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,eAAe,EAC1B,kFAA2F,CAAC;AAE9F,eAAO,MAAM,qBAAqB,EAChC,4EAAqF,CAAC;AAExF,eAAO,MAAM,sBAAsB,EACjC,iFAA0F,CAAC;AAE7F,eAAO,MAAM,oBAAoB,EAC/B,iFAA0F,CAAC;AAE7F,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAC3C,MAAM,CAKR;AAaD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC9C,iFAAiF;IACjF,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,SAAS,CAAC;IAC/C,oBAAoB,EAAE,OAAO,CAAC;IAC9B,yEAAyE;IACzE,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,uBAAuB,EAAE,CAAC;IAC3C,SAAS,EAAE,iBAAiB,CAAC;IAC7B,YAAY,EAAE,qBAAqB,CAAC;IACpC,eAAe,EAAE,eAAe,CAAC;IACjC,YAAY,EAAE,kBAAkB,CAAC;IACjC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,iFAAiF;IACjF,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,OAAO,eAAe,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAgBD,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CAgG5B"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Readiness detection for CLI doctor/init/status.
|
|
3
|
+
* Never reads secret values - only boolean presence / opaque health signals.
|
|
4
|
+
*/
|
|
5
|
+
import { access, constants } from "node:fs/promises";
|
|
6
|
+
import { homedir as osHomedir } from "node:os";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
export const V1_HONESTY_LINE = "Claude Code's primary model is unchanged in V1. OffRouter routes delegated work.";
|
|
9
|
+
export const V1_CODEX_HONESTY_LINE = "Codex's primary model is unchanged in V1. OffRouter routes delegated work.";
|
|
10
|
+
export const V1_GEMINI_HONESTY_LINE = "Gemini CLI's primary model is unchanged in V1. OffRouter routes delegated work.";
|
|
11
|
+
export const V1_GROK_HONESTY_LINE = "Grok Build's primary model is unchanged in V1. OffRouter routes delegated work.";
|
|
12
|
+
export function honestyForHarness(kind) {
|
|
13
|
+
if (kind === "codex")
|
|
14
|
+
return V1_CODEX_HONESTY_LINE;
|
|
15
|
+
if (kind === "gemini")
|
|
16
|
+
return V1_GEMINI_HONESTY_LINE;
|
|
17
|
+
if (kind === "grok")
|
|
18
|
+
return V1_GROK_HONESTY_LINE;
|
|
19
|
+
return V1_HONESTY_LINE;
|
|
20
|
+
}
|
|
21
|
+
/** Env keys that indicate API-key readiness (presence only). */
|
|
22
|
+
const API_KEY_ENV_FLAGS = [
|
|
23
|
+
"ANTHROPIC_API_KEY",
|
|
24
|
+
"OPENAI_API_KEY",
|
|
25
|
+
"OPENROUTER_API_KEY",
|
|
26
|
+
"XAI_API_KEY",
|
|
27
|
+
"GOOGLE_API_KEY",
|
|
28
|
+
"GEMINI_API_KEY",
|
|
29
|
+
"OFFROUTER_API_KEY",
|
|
30
|
+
];
|
|
31
|
+
async function pathExists(path) {
|
|
32
|
+
try {
|
|
33
|
+
await access(path, constants.F_OK);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function envPresent(env, key) {
|
|
41
|
+
const v = env[key];
|
|
42
|
+
return typeof v === "string" && v.trim().length > 0;
|
|
43
|
+
}
|
|
44
|
+
export async function detectEnvironment(options = {}) {
|
|
45
|
+
const env = options.env ?? process.env;
|
|
46
|
+
const home = (options.homedir ?? osHomedir)();
|
|
47
|
+
const claudePath = join(home, ".claude");
|
|
48
|
+
const codexPath = join(home, ".codex");
|
|
49
|
+
const geminiPath = join(home, ".gemini");
|
|
50
|
+
const piPath = join(home, ".pi");
|
|
51
|
+
const [claude, codex, gemini, pi] = await Promise.all([
|
|
52
|
+
pathExists(claudePath),
|
|
53
|
+
pathExists(codexPath),
|
|
54
|
+
pathExists(geminiPath),
|
|
55
|
+
pathExists(piPath),
|
|
56
|
+
]);
|
|
57
|
+
const harnessProfiles = [
|
|
58
|
+
{
|
|
59
|
+
kind: "claude",
|
|
60
|
+
profileHint: "claude-personal",
|
|
61
|
+
detected: claude,
|
|
62
|
+
pathChecked: claudePath,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
kind: "codex",
|
|
66
|
+
profileHint: "codex-personal",
|
|
67
|
+
detected: codex,
|
|
68
|
+
pathChecked: codexPath,
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
kind: "gemini",
|
|
72
|
+
profileHint: "gemini-personal",
|
|
73
|
+
detected: gemini,
|
|
74
|
+
pathChecked: geminiPath,
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
kind: "pi",
|
|
78
|
+
profileHint: "pi-personal",
|
|
79
|
+
detected: pi,
|
|
80
|
+
pathChecked: piPath,
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
const surfaces = [];
|
|
84
|
+
if (claude)
|
|
85
|
+
surfaces.push("claude");
|
|
86
|
+
if (codex)
|
|
87
|
+
surfaces.push("codex");
|
|
88
|
+
if (gemini)
|
|
89
|
+
surfaces.push("gemini");
|
|
90
|
+
if (pi)
|
|
91
|
+
surfaces.push("pi");
|
|
92
|
+
// Subscription readiness: directory presence only - never parse creds.
|
|
93
|
+
const subscription = {
|
|
94
|
+
status: surfaces.length > 0 ? "unknown" : "unconfigured",
|
|
95
|
+
surfaces,
|
|
96
|
+
};
|
|
97
|
+
const envPresentKeys = API_KEY_ENV_FLAGS.filter((k) => envPresent(env, k));
|
|
98
|
+
const apiKeyReadiness = {
|
|
99
|
+
anyReady: envPresentKeys.length > 0,
|
|
100
|
+
envPresent: [...envPresentKeys],
|
|
101
|
+
};
|
|
102
|
+
const ollamaHostConfigured = envPresent(env, "OLLAMA_HOST");
|
|
103
|
+
const localBinaryPresent = (await pathExists("/usr/local/bin/ollama")) ||
|
|
104
|
+
(await pathExists("/opt/homebrew/bin/ollama")) ||
|
|
105
|
+
(await pathExists(join(home, ".ollama")));
|
|
106
|
+
const localRuntime = {
|
|
107
|
+
health: ollamaHostConfigured || localBinaryPresent ? "unknown" : "unconfigured",
|
|
108
|
+
ollamaHostConfigured,
|
|
109
|
+
localBinaryPresent,
|
|
110
|
+
};
|
|
111
|
+
const authTiers = {
|
|
112
|
+
subscription: subscription.status !== "unconfigured",
|
|
113
|
+
local: localRuntime.health !== "unconfigured",
|
|
114
|
+
"api-key": apiKeyReadiness.anyReady,
|
|
115
|
+
};
|
|
116
|
+
const limits = {
|
|
117
|
+
status: "unavailable",
|
|
118
|
+
detail: "Live limit queries are not run by the CLI shell; configure providers and re-run doctor after adapters are available.",
|
|
119
|
+
};
|
|
120
|
+
return {
|
|
121
|
+
harnessProfiles,
|
|
122
|
+
authTiers,
|
|
123
|
+
subscription,
|
|
124
|
+
apiKeyReadiness,
|
|
125
|
+
localRuntime,
|
|
126
|
+
limits,
|
|
127
|
+
lastProviderError: null,
|
|
128
|
+
honesty: V1_HONESTY_LINE,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detection.js","sourceRoot":"","sources":["../../src/commands/detection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,eAAe,GAC1B,kFAA2F,CAAC;AAE9F,MAAM,CAAC,MAAM,qBAAqB,GAChC,4EAAqF,CAAC;AAExF,MAAM,CAAC,MAAM,sBAAsB,GACjC,iFAA0F,CAAC;AAE7F,MAAM,CAAC,MAAM,oBAAoB,GAC/B,iFAA0F,CAAC;AAE7F,MAAM,UAAU,iBAAiB,CAC/B,IAA4C;IAE5C,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,qBAAqB,CAAC;IACnD,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,sBAAsB,CAAC;IACrD,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,oBAAoB,CAAC;IACjD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,gEAAgE;AAChE,MAAM,iBAAiB,GAAG;IACxB,mBAAmB;IACnB,gBAAgB;IAChB,oBAAoB;IACpB,aAAa;IACb,gBAAgB;IAChB,gBAAgB;IAChB,mBAAmB;CACX,CAAC;AA0DX,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAsB,EAAE,GAAW;IACrD,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAA4B,EAAE;IAE9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC,EAAE,CAAC;IAE9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEjC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACpD,UAAU,CAAC,UAAU,CAAC;QACtB,UAAU,CAAC,SAAS,CAAC;QACrB,UAAU,CAAC,UAAU,CAAC;QACtB,UAAU,CAAC,MAAM,CAAC;KACnB,CAAC,CAAC;IAEH,MAAM,eAAe,GAA8B;QACjD;YACE,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,iBAAiB;YAC9B,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,UAAU;SACxB;QACD;YACE,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,gBAAgB;YAC7B,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,SAAS;SACvB;QACD;YACE,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,iBAAiB;YAC9B,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,UAAU;SACxB;QACD;YACE,IAAI,EAAE,IAAI;YACV,WAAW,EAAE,aAAa;YAC1B,QAAQ,EAAE,EAAE;YACZ,WAAW,EAAE,MAAM;SACpB;KACF,CAAC;IAEF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,MAAM;QAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,KAAK;QAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,MAAM;QAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5B,uEAAuE;IACvE,MAAM,YAAY,GAA0B;QAC1C,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc;QACxD,QAAQ;KACT,CAAC;IAEF,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,eAAe,GAAoB;QACvC,QAAQ,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC;QACnC,UAAU,EAAE,CAAC,GAAG,cAAc,CAAC;KAChC,CAAC;IAEF,MAAM,oBAAoB,GAAG,UAAU,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAC5D,MAAM,kBAAkB,GACtB,CAAC,MAAM,UAAU,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC,MAAM,UAAU,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAE5C,MAAM,YAAY,GAAuB;QACvC,MAAM,EACJ,oBAAoB,IAAI,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc;QACzE,oBAAoB;QACpB,kBAAkB;KACnB,CAAC;IAEF,MAAM,SAAS,GAAsB;QACnC,YAAY,EAAE,YAAY,CAAC,MAAM,KAAK,cAAc;QACpD,KAAK,EAAE,YAAY,CAAC,MAAM,KAAK,cAAc;QAC7C,SAAS,EAAE,eAAe,CAAC,QAAQ;KACpC,CAAC;IAEF,MAAM,MAAM,GAAsB;QAChC,MAAM,EAAE,aAAa;QACrB,MAAM,EACJ,sHAAsH;KACzH,CAAC;IAEF,OAAO;QACL,eAAe;QACf,SAAS;QACT,YAAY;QACZ,eAAe;QACf,YAAY;QACZ,MAAM;QACN,iBAAiB,EAAE,IAAI;QACvB,OAAO,EAAE,eAAe;KACzB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { type IoStreams } from "./output.js";
|
|
3
|
+
import type { CommandContext } from "./init.js";
|
|
4
|
+
export declare function registerDoctorCommand(program: Command, ctx: () => CommandContext): void;
|
|
5
|
+
export type { IoStreams };
|
|
6
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AA8QhD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,cAAc,GACxB,IAAI,CAiNN;AAGD,YAAY,EAAE,SAAS,EAAE,CAAC"}
|