autodev-cli 1.4.163 → 1.4.164

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.
@@ -8,6 +8,13 @@ export interface ModelCatalogEntry {
8
8
  contextLimit: number;
9
9
  }>;
10
10
  }
11
- /** Build the catalog array (reused by the app IPC via `--json`). */
12
- export declare function buildModelCatalog(): ModelCatalogEntry[];
11
+ /**
12
+ * Build the catalog array (reused by the app IPC via `--json`).
13
+ *
14
+ * Uses each family's `listLive()`, which pulls REAL models from the provider
15
+ * when possible (grok: GET https://api.x.ai/v1/models) and falls back to the
16
+ * static ProviderModels list on any failure — so the emitted shape is always
17
+ * the same { family, default, models:[{id,label,contextLimit}] }.
18
+ */
19
+ export declare function buildModelCatalog(): Promise<ModelCatalogEntry[]>;
13
20
  export declare function modelsCommand(program: Command): void;
@@ -26,16 +26,23 @@ const FAMILIES = [
26
26
  new ProviderModels_4.CopilotProviderModels(),
27
27
  new ProviderModels_5.DummyProviderModels(),
28
28
  ];
29
- /** Build the catalog array (reused by the app IPC via `--json`). */
30
- function buildModelCatalog() {
31
- return FAMILIES.map((m) => {
32
- const models = m.list();
29
+ /**
30
+ * Build the catalog array (reused by the app IPC via `--json`).
31
+ *
32
+ * Uses each family's `listLive()`, which pulls REAL models from the provider
33
+ * when possible (grok: GET https://api.x.ai/v1/models) and falls back to the
34
+ * static ProviderModels list on any failure — so the emitted shape is always
35
+ * the same { family, default, models:[{id,label,contextLimit}] }.
36
+ */
37
+ async function buildModelCatalog() {
38
+ return Promise.all(FAMILIES.map(async (m) => {
39
+ const models = await m.listLive();
33
40
  return {
34
41
  family: m.family,
35
42
  default: models[0]?.id ?? '',
36
43
  models,
37
44
  };
38
- });
45
+ }));
39
46
  }
40
47
  const fmtCtx = (n) => n >= 1_000_000 ? `${(n / 1_000_000).toFixed(n % 1_000_000 ? 1 : 0)}M` : `${Math.round(n / 1000)}k`;
41
48
  function modelsCommand(program) {
@@ -43,8 +50,8 @@ function modelsCommand(program) {
43
50
  .command('models')
44
51
  .description('List the model catalog every provider family supports (id, label, context)')
45
52
  .option('--json', 'Output JSON (the shape the app consumes)')
46
- .action((opts) => {
47
- const catalog = buildModelCatalog();
53
+ .action(async (opts) => {
54
+ const catalog = await buildModelCatalog();
48
55
  if (opts.json) {
49
56
  process.stdout.write(JSON.stringify(catalog, null, 2) + '\n');
50
57
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":";;AAoCA,8CASC;AAKD,sCAmBC;AApED,sCAAgC;AAEhC,uEAA0E;AAC1E,qEAAsE;AACtE,yEAA8E;AAC9E,wEAA4E;AAC5E,sEAAwE;AAExE;;;;;;;;;GASG;AAEH,mEAAmE;AACnE,MAAM,QAAQ,GAAqB;IACjC,IAAI,qCAAoB,EAAE;IAC1B,IAAI,mCAAkB,EAAE;IACxB,IAAI,uCAAsB,EAAE;IAC5B,IAAI,sCAAqB,EAAE;IAC3B,IAAI,oCAAmB,EAAE;CAC1B,CAAC;AAQF,oEAAoE;AACpE,SAAgB,iBAAiB;IAC/B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACxB,OAAO;YACL,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE;YAC5B,MAAM;SACP,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,CAAS,EAAU,EAAE,CACnC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;AAErG,SAAgB,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4EAA4E,CAAC;SACzF,MAAM,CAAC,QAAQ,EAAE,0CAA0C,CAAC;SAC5D,MAAM,CAAC,CAAC,IAAwB,EAAE,EAAE;QACnC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QACD,YAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,YAAG,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtF,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC9B,YAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":";;AA2CA,8CAWC;AAKD,sCAmBC;AA7ED,sCAAgC;AAEhC,uEAA0E;AAC1E,qEAAsE;AACtE,yEAA8E;AAC9E,wEAA4E;AAC5E,sEAAwE;AAExE;;;;;;;;;GASG;AAEH,mEAAmE;AACnE,MAAM,QAAQ,GAAqB;IACjC,IAAI,qCAAoB,EAAE;IAC1B,IAAI,mCAAkB,EAAE;IACxB,IAAI,uCAAsB,EAAE;IAC5B,IAAI,sCAAqB,EAAE;IAC3B,IAAI,oCAAmB,EAAE;CAC1B,CAAC;AAQF;;;;;;;GAOG;AACI,KAAK,UAAU,iBAAiB;IACrC,OAAO,OAAO,CAAC,GAAG,CAChB,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAClC,OAAO;YACL,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE;YAC5B,MAAM;SACP,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,CAAS,EAAU,EAAE,CACnC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;AAErG,SAAgB,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4EAA4E,CAAC;SACzF,MAAM,CAAC,QAAQ,EAAE,0CAA0C,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QACD,YAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,YAAG,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtF,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC9B,YAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -21,6 +21,13 @@ export declare function resolveConfiguredModel(s: ModelResolvableSettings): stri
21
21
  export declare abstract class ProviderModels {
22
22
  abstract readonly family: string;
23
23
  abstract list(): ModelInfo[];
24
+ /**
25
+ * Live catalog for this family. Default = the static `list()`; providers that
26
+ * can pull their REAL models from an API override this (see GrokProviderModels).
27
+ * Must always resolve to a non-empty list — implementations fall back to
28
+ * `list()` on any failure so the picker never goes empty.
29
+ */
30
+ listLive(): Promise<ModelInfo[]>;
24
31
  resolve(id?: string): ModelInfo | undefined;
25
32
  contextLimit(id?: string): number;
26
33
  defaultContextLimit(): number;
@@ -68,6 +68,13 @@ function resolveConfiguredModel(s) {
68
68
  return friendlyModelName(raw);
69
69
  }
70
70
  class ProviderModels {
71
+ /**
72
+ * Live catalog for this family. Default = the static `list()`; providers that
73
+ * can pull their REAL models from an API override this (see GrokProviderModels).
74
+ * Must always resolve to a non-empty list — implementations fall back to
75
+ * `list()` on any failure so the picker never goes empty.
76
+ */
77
+ async listLive() { return this.list(); }
71
78
  resolve(id) {
72
79
  if (!id) {
73
80
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"ProviderModels.js","sourceRoot":"","sources":["../../../src/providers/base/ProviderModels.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProviderModels.js","sourceRoot":"","sources":["../../../src/providers/base/ProviderModels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { ModelInfo } from './types';
2
+ /** Minimal fetch shape — avoids depending on DOM/undici types and is injectable in tests. */
3
+ type FetchLike = (url: string, init?: {
4
+ headers?: Record<string, string>;
5
+ signal?: unknown;
6
+ }) => Promise<{
7
+ ok: boolean;
8
+ status: number;
9
+ json: () => Promise<unknown>;
10
+ }>;
11
+ export interface LiveModelOptions {
12
+ /** Cache key + family label (e.g. 'grok'). */
13
+ family: string;
14
+ /** The static catalog — returned verbatim whenever the live call can't deliver. */
15
+ staticModels: ModelInfo[];
16
+ /** OpenAI-compatible models endpoint, e.g. https://api.x.ai/v1/models */
17
+ url: string;
18
+ /** Bearer / api-key token. When absent, we never hit the network — static is returned. */
19
+ token?: string | null;
20
+ /** Context limit for live ids that neither match a static entry nor report one. */
21
+ defaultContextLimit: number;
22
+ /** Extra request headers (e.g. { 'anthropic-version': '2023-06-01' }). */
23
+ headers?: Record<string, string>;
24
+ /** Auth header style. 'bearer' → Authorization: Bearer; 'x-api-key' → x-api-key. Default bearer. */
25
+ authHeader?: 'bearer' | 'x-api-key';
26
+ timeoutMs?: number;
27
+ ttlMs?: number;
28
+ now?: () => number;
29
+ fetchImpl?: FetchLike;
30
+ }
31
+ /** "grok-4.6" → "Grok 4.6"; "grok-4.20-0309-non-reasoning" → "Grok 4.20 0309 Non Reasoning". */
32
+ export declare function deriveModelLabel(id: string): string;
33
+ /**
34
+ * Map raw `/v1/models` `data[]` entries into catalog entries.
35
+ * • A returned id that matches a static entry KEEPS that entry's label + contextLimit.
36
+ * • Otherwise: friendly label derived from the id; contextLimit from the entry's
37
+ * context_length / context_window when present, else `defaultContextLimit`.
38
+ * Order and de-dup follow the provider's response.
39
+ */
40
+ export declare function mapLiveEntries(data: unknown[], staticModels: ModelInfo[], defaultContextLimit: number): ModelInfo[];
41
+ /**
42
+ * Fetch a provider's live model catalog, with static fallback + short-lived cache.
43
+ * Only SUCCESSFUL live results are cached; a fallback never poisons the cache.
44
+ */
45
+ export declare function fetchLiveModels(opts: LiveModelOptions): Promise<ModelInfo[]>;
46
+ /** Test-only: reset the per-process cache between cases. */
47
+ export declare function __clearLiveModelCache(): void;
48
+ export {};
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // liveModels — generic seam for pulling a provider's REAL model list live from
4
+ // its OpenAI-compatible `/v1/models` endpoint, mapped into the same ModelInfo
5
+ // catalog shape the static lists use.
6
+ //
7
+ // Design goals (see `autodev models`):
8
+ // • The picker must NEVER go empty. Any failure (no token, offline, non-200,
9
+ // bad JSON, timeout) falls back to the provider's static ProviderModels list.
10
+ // • A ~4s AbortController timeout bounds the live call.
11
+ // • Successful live results are cached per-family for a short TTL so repeated
12
+ // `models --json` invocations in one process don't refetch.
13
+ // • The returned shape is byte-for-byte the same { id, label, contextLimit }.
14
+ // ---------------------------------------------------------------------------
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.deriveModelLabel = deriveModelLabel;
17
+ exports.mapLiveEntries = mapLiveEntries;
18
+ exports.fetchLiveModels = fetchLiveModels;
19
+ exports.__clearLiveModelCache = __clearLiveModelCache;
20
+ const CACHE = new Map();
21
+ const DEFAULT_TTL_MS = 60_000;
22
+ const DEFAULT_TIMEOUT_MS = 4_000;
23
+ /** "grok-4.6" → "Grok 4.6"; "grok-4.20-0309-non-reasoning" → "Grok 4.20 0309 Non Reasoning". */
24
+ function deriveModelLabel(id) {
25
+ const cleaned = String(id ?? '').trim();
26
+ if (!cleaned)
27
+ return cleaned;
28
+ return cleaned
29
+ .split(/[-_/]/)
30
+ .filter(Boolean)
31
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
32
+ .join(' ');
33
+ }
34
+ /**
35
+ * Map raw `/v1/models` `data[]` entries into catalog entries.
36
+ * • A returned id that matches a static entry KEEPS that entry's label + contextLimit.
37
+ * • Otherwise: friendly label derived from the id; contextLimit from the entry's
38
+ * context_length / context_window when present, else `defaultContextLimit`.
39
+ * Order and de-dup follow the provider's response.
40
+ */
41
+ function mapLiveEntries(data, staticModels, defaultContextLimit) {
42
+ const byId = new Map(staticModels.map((m) => [m.id.toLowerCase(), m]));
43
+ const out = [];
44
+ const seen = new Set();
45
+ for (const raw of data) {
46
+ let id = '';
47
+ let ctxRaw = 0;
48
+ if (raw && typeof raw === 'object') {
49
+ const o = raw;
50
+ id = String(o['id'] ?? '').trim();
51
+ ctxRaw = Number(o['context_length'] ?? o['context_window'] ?? o['contextLimit'] ?? 0);
52
+ }
53
+ else if (typeof raw === 'string') {
54
+ id = raw.trim();
55
+ }
56
+ if (!id)
57
+ continue;
58
+ const key = id.toLowerCase();
59
+ if (seen.has(key))
60
+ continue;
61
+ seen.add(key);
62
+ const match = byId.get(key);
63
+ const contextLimit = match
64
+ ? match.contextLimit
65
+ : (Number.isFinite(ctxRaw) && ctxRaw > 0 ? Math.round(ctxRaw) : defaultContextLimit);
66
+ const label = match ? match.label : deriveModelLabel(id);
67
+ out.push({ id, label, contextLimit });
68
+ }
69
+ return out;
70
+ }
71
+ async function doFetch(opts, token) {
72
+ const fetchImpl = opts.fetchImpl ?? globalThis.fetch;
73
+ if (typeof fetchImpl !== 'function')
74
+ return null;
75
+ const controller = new AbortController();
76
+ const timer = setTimeout(() => controller.abort(), opts.timeoutMs ?? DEFAULT_TIMEOUT_MS);
77
+ try {
78
+ const headers = { Accept: 'application/json', ...(opts.headers ?? {}) };
79
+ if ((opts.authHeader ?? 'bearer') === 'x-api-key')
80
+ headers['x-api-key'] = token;
81
+ else
82
+ headers['Authorization'] = `Bearer ${token}`;
83
+ const res = await fetchImpl(opts.url, { headers, signal: controller.signal });
84
+ if (!res || !res.ok)
85
+ return null;
86
+ const json = (await res.json().catch(() => null));
87
+ let data = null;
88
+ if (json && typeof json === 'object' && Array.isArray(json.data)) {
89
+ data = json.data;
90
+ }
91
+ else if (Array.isArray(json)) {
92
+ data = json;
93
+ }
94
+ if (!data || data.length === 0)
95
+ return null;
96
+ const mapped = mapLiveEntries(data, opts.staticModels, opts.defaultContextLimit);
97
+ return mapped.length ? mapped : null;
98
+ }
99
+ catch {
100
+ // Timeout / network / parse — the caller falls back to static.
101
+ return null;
102
+ }
103
+ finally {
104
+ clearTimeout(timer);
105
+ }
106
+ }
107
+ /**
108
+ * Fetch a provider's live model catalog, with static fallback + short-lived cache.
109
+ * Only SUCCESSFUL live results are cached; a fallback never poisons the cache.
110
+ */
111
+ async function fetchLiveModels(opts) {
112
+ if (!opts.token || !String(opts.token).trim())
113
+ return opts.staticModels.slice();
114
+ const now = opts.now ?? (() => Date.now());
115
+ const ttl = opts.ttlMs ?? DEFAULT_TTL_MS;
116
+ const cached = CACHE.get(opts.family);
117
+ if (cached && now() - cached.ts < ttl)
118
+ return cached.models.slice();
119
+ const live = await doFetch(opts, String(opts.token));
120
+ if (live) {
121
+ CACHE.set(opts.family, { ts: now(), models: live });
122
+ return live.slice();
123
+ }
124
+ return opts.staticModels.slice();
125
+ }
126
+ /** Test-only: reset the per-process cache between cases. */
127
+ function __clearLiveModelCache() {
128
+ CACHE.clear();
129
+ }
130
+ //# sourceMappingURL=liveModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liveModels.js","sourceRoot":"","sources":["../../../src/providers/base/liveModels.ts"],"names":[],"mappings":"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"}
@@ -4,4 +4,12 @@ export declare class GrokProviderModels extends ProviderModels {
4
4
  readonly family = "grok";
5
5
  list(): ModelInfo[];
6
6
  defaultContextLimit(): number;
7
+ /**
8
+ * Pull grok's REAL models live from xAI's OpenAI-compatible endpoint
9
+ * (GET https://api.x.ai/v1/models, Bearer <grok token>). Ids that match a
10
+ * static entry keep its label/contextLimit; others derive a friendly label
11
+ * and use the entry's reported context_length. Falls back to the static list
12
+ * on any failure; cached briefly per-process. Never logs the token.
13
+ */
14
+ listLive(): Promise<ModelInfo[]>;
7
15
  }
@@ -2,6 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.GrokProviderModels = void 0;
4
4
  const ProviderModels_1 = require("../base/ProviderModels");
5
+ const liveModels_1 = require("../base/liveModels");
6
+ const token_1 = require("./token");
7
+ // Static fallback — used whenever the live xAI call can't deliver (no token,
8
+ // offline, non-200, timeout). Kept in sync with the friendly labels the app shows.
5
9
  const GROK_MODELS = [
6
10
  { id: 'grok-4', label: 'Grok 4', contextLimit: 256_000 },
7
11
  { id: 'grok-code', label: 'Grok Code', contextLimit: 256_000 },
@@ -11,6 +15,22 @@ class GrokProviderModels extends ProviderModels_1.ProviderModels {
11
15
  family = 'grok';
12
16
  list() { return GROK_MODELS.slice(); }
13
17
  defaultContextLimit() { return 256_000; }
18
+ /**
19
+ * Pull grok's REAL models live from xAI's OpenAI-compatible endpoint
20
+ * (GET https://api.x.ai/v1/models, Bearer <grok token>). Ids that match a
21
+ * static entry keep its label/contextLimit; others derive a friendly label
22
+ * and use the entry's reported context_length. Falls back to the static list
23
+ * on any failure; cached briefly per-process. Never logs the token.
24
+ */
25
+ async listLive() {
26
+ return (0, liveModels_1.fetchLiveModels)({
27
+ family: this.family,
28
+ staticModels: this.list(),
29
+ url: 'https://api.x.ai/v1/models',
30
+ token: (0, token_1.readGrokToken)(),
31
+ defaultContextLimit: this.defaultContextLimit(),
32
+ });
33
+ }
14
34
  }
15
35
  exports.GrokProviderModels = GrokProviderModels;
16
36
  //# sourceMappingURL=ProviderModels.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProviderModels.js","sourceRoot":"","sources":["../../../src/providers/grok/ProviderModels.ts"],"names":[],"mappings":";;;AAAA,2DAAwD;AAGxD,MAAM,WAAW,GAAgB;IAC/B,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE;IACxD,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE;IAC9D,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE;CACzD,CAAC;AAEF,MAAa,kBAAmB,SAAQ,+BAAc;IAC3C,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,KAAkB,OAAO,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC1C,mBAAmB,KAAa,OAAO,OAAO,CAAC,CAAC,CAAC;CAC3D;AAJD,gDAIC"}
1
+ {"version":3,"file":"ProviderModels.js","sourceRoot":"","sources":["../../../src/providers/grok/ProviderModels.ts"],"names":[],"mappings":";;;AAAA,2DAAwD;AACxD,mDAAqD;AACrD,mCAAwC;AAGxC,6EAA6E;AAC7E,mFAAmF;AACnF,MAAM,WAAW,GAAgB;IAC/B,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE;IACxD,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE;IAC9D,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE;CACzD,CAAC;AAEF,MAAa,kBAAmB,SAAQ,+BAAc;IAC3C,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,KAAkB,OAAO,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC1C,mBAAmB,KAAa,OAAO,OAAO,CAAC,CAAC,CAAC;IAE1D;;;;;;OAMG;IACM,KAAK,CAAC,QAAQ;QACrB,OAAO,IAAA,4BAAe,EAAC;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE;YACzB,GAAG,EAAE,4BAA4B;YACjC,KAAK,EAAE,IAAA,qBAAa,GAAE;YACtB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,EAAE;SAChD,CAAC,CAAC;IACL,CAAC;CACF;AArBD,gDAqBC"}
@@ -0,0 +1 @@
1
+ export declare function readGrokToken(): string | null;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // readGrokToken — resolve the grok bearer token the SAME way the grok provider
4
+ // authenticates for its normal API calls: from the OAuth session the grok CLI
5
+ // writes to ~/.grok/auth.json (GROK_HOME override honored, matching sessions.ts).
6
+ //
7
+ // auth.json maps "<oidc-issuer>::<id>" → { key, refresh_token, create_time, … }
8
+ // where `key` is the access token. We pick the freshest entry that carries a key.
9
+ // Env XAI_API_KEY / GROK_API_KEY take precedence (CI / office-supplied tokens).
10
+ //
11
+ // The token is NEVER logged. Returns null when none is available, so callers
12
+ // fall back to the static model list.
13
+ // ---------------------------------------------------------------------------
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.readGrokToken = readGrokToken;
19
+ const node_fs_1 = __importDefault(require("node:fs"));
20
+ const node_os_1 = __importDefault(require("node:os"));
21
+ const node_path_1 = __importDefault(require("node:path"));
22
+ function grokHome() {
23
+ return process.env['GROK_HOME'] || node_path_1.default.join(node_os_1.default.homedir(), '.grok');
24
+ }
25
+ function readGrokToken() {
26
+ const env = (process.env['XAI_API_KEY'] || process.env['GROK_API_KEY'] || '').trim();
27
+ if (env)
28
+ return env;
29
+ try {
30
+ const raw = node_fs_1.default.readFileSync(node_path_1.default.join(grokHome(), 'auth.json'), 'utf8');
31
+ const json = JSON.parse(raw);
32
+ if (json && typeof json === 'object') {
33
+ let best = null;
34
+ for (const v of Object.values(json)) {
35
+ if (v && typeof v === 'object') {
36
+ const o = v;
37
+ const key = typeof o.key === 'string' ? o.key.trim() : '';
38
+ if (key) {
39
+ const t = Date.parse(String(o.create_time ?? '')) || 0;
40
+ if (!best || t > best.t)
41
+ best = { key, t };
42
+ }
43
+ }
44
+ }
45
+ if (best)
46
+ return best.key;
47
+ }
48
+ }
49
+ catch {
50
+ // No auth.json / unreadable / malformed → no token.
51
+ }
52
+ return null;
53
+ }
54
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/providers/grok/token.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,kFAAkF;AAClF,EAAE;AACF,gFAAgF;AAChF,kFAAkF;AAClF,gFAAgF;AAChF,EAAE;AACF,6EAA6E;AAC7E,sCAAsC;AACtC,8EAA8E;;;;;AAU9E,sCAyBC;AAjCD,sDAAyB;AACzB,sDAAyB;AACzB,0DAA6B;AAE7B,SAAS,QAAQ;IACf,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC;AAED,SAAgB,aAAa;IAC3B,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrF,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,iBAAE,CAAC,YAAY,CAAC,mBAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;QACxE,MAAM,IAAI,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrC,IAAI,IAAI,GAAsC,IAAI,CAAC;YACnD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAA+B,CAAC,EAAE,CAAC;gBAC/D,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC/B,MAAM,CAAC,GAAG,CAA6C,CAAC;oBACxD,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1D,IAAI,GAAG,EAAE,CAAC;wBACR,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;wBACvD,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;4BAAE,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;oBAC7C,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC,GAAG,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autodev-cli",
3
- "version": "1.4.163",
3
+ "version": "1.4.164",
4
4
  "description": "AutoAIDev CLI — autonomous AI task loop with VS Code / Cursor launcher",
5
5
  "author": "Peter Ivanov <peter@microweber.com>",
6
6
  "license": "MIT",
@@ -36,7 +36,7 @@
36
36
  "start": "node bin/autodev.js",
37
37
  "test:coverage": "c8 npm test",
38
38
  "coverage:html": "c8 --reporter=html npm test",
39
- "test": "node test/smoke.mjs && node test/liveNarration.smoke.mjs && node test/liveNarration.edge.smoke.mjs && node test/normalizer.parity.smoke.mjs && node test/providerConfig.smoke.mjs && node test/providers.services.smoke.mjs && node test/providers.dummy.smoke.mjs && node test/mcpOnlyOperator.smoke.mjs && node test/opencodeEventFilter.smoke.mjs && node test/copilotMcpIsolation.smoke.mjs && node test/grokSpawnError.smoke.mjs && node test/initTemplate.smoke.mjs && node test/settingsAliases.smoke.mjs && node test/setupWritesOfficeMcp.smoke.mjs && node test/provisionNoGlobalMcp.smoke.mjs && node test/deprovisionCleans.smoke.mjs && node test/hooksElectronSafe.smoke.mjs && node test/claudePermissions.smoke.mjs && node test/claudeMcpAllowList.smoke.mjs && node test/presenceGuard.smoke.mjs && node test/cliExitHardFail.smoke.mjs && node test/redactSecrets.smoke.mjs && node test/claudeUsage.smoke.mjs && node test/graphStore.smoke.mjs && node test/programReminder.smoke.mjs && node test/agentBackup.smoke.mjs && node test/persona.smoke.mjs && node test/soulUpdate.smoke.mjs && node test/sessionsGlobal.smoke.mjs && node test/resumeSessionLoopDefault.smoke.mjs && node test/secureFilePerms.smoke.mjs && node test/providers.dummy.office.smoke.mjs && node test/mcpDetect.smoke.mjs && node test/gimpPluginInstall.smoke.mjs && node test/mcpCatalog.smoke.mjs && node test/mcpCatalogMigrate.smoke.mjs && node test/mcpStartupTimeout.smoke.mjs && node test/autodevSkill.smoke.mjs"
39
+ "test": "node test/smoke.mjs && node test/liveNarration.smoke.mjs && node test/liveNarration.edge.smoke.mjs && node test/normalizer.parity.smoke.mjs && node test/providerConfig.smoke.mjs && node test/providers.services.smoke.mjs && node test/providers.dummy.smoke.mjs && node test/mcpOnlyOperator.smoke.mjs && node test/opencodeEventFilter.smoke.mjs && node test/copilotMcpIsolation.smoke.mjs && node test/grokSpawnError.smoke.mjs && node test/initTemplate.smoke.mjs && node test/settingsAliases.smoke.mjs && node test/setupWritesOfficeMcp.smoke.mjs && node test/provisionNoGlobalMcp.smoke.mjs && node test/deprovisionCleans.smoke.mjs && node test/hooksElectronSafe.smoke.mjs && node test/claudePermissions.smoke.mjs && node test/claudeMcpAllowList.smoke.mjs && node test/presenceGuard.smoke.mjs && node test/cliExitHardFail.smoke.mjs && node test/redactSecrets.smoke.mjs && node test/claudeUsage.smoke.mjs && node test/graphStore.smoke.mjs && node test/programReminder.smoke.mjs && node test/agentBackup.smoke.mjs && node test/persona.smoke.mjs && node test/soulUpdate.smoke.mjs && node test/sessionsGlobal.smoke.mjs && node test/resumeSessionLoopDefault.smoke.mjs && node test/secureFilePerms.smoke.mjs && node test/providers.dummy.office.smoke.mjs && node test/mcpDetect.smoke.mjs && node test/gimpPluginInstall.smoke.mjs && node test/mcpCatalog.smoke.mjs && node test/mcpCatalogMigrate.smoke.mjs && node test/mcpStartupTimeout.smoke.mjs && node test/autodevSkill.smoke.mjs && node test/liveModels.smoke.mjs"
40
40
  },
41
41
  "dependencies": {
42
42
  "@opencode-ai/sdk": "^1.14.41",