autodev-cli 1.4.163 → 1.4.165

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;
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.ProviderModels = void 0;
8
8
  exports.friendlyModelName = friendlyModelName;
9
9
  exports.resolveConfiguredModel = resolveConfiguredModel;
10
+ const liveModels_1 = require("./liveModels");
10
11
  /** Exact raw-id → friendly-name overrides (fast path for the common Claude ids). */
11
12
  const FRIENDLY_OVERRIDES = {
12
13
  'claude-opus-4-8': 'Opus 4.8',
@@ -68,6 +69,13 @@ function resolveConfiguredModel(s) {
68
69
  return friendlyModelName(raw);
69
70
  }
70
71
  class ProviderModels {
72
+ /**
73
+ * Live catalog for this family. Default = the static `list()`; providers that
74
+ * can pull their REAL models from an API override this (see GrokProviderModels).
75
+ * Must always resolve to a non-empty list — implementations fall back to
76
+ * `list()` on any failure so the picker never goes empty.
77
+ */
78
+ async listLive() { return (0, liveModels_1.filterChatModels)(this.list()); }
71
79
  resolve(id) {
72
80
  if (!id) {
73
81
  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,57 @@
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
+ /**
32
+ * Name-only heuristic: is this model id a TEXT chat/completion model?
33
+ * Used for entries (and static lists) that carry no modality field.
34
+ */
35
+ export declare function isChatModelId(id: string): boolean;
36
+ /** Is this live `/v1/models` entry a chat model? Modality field wins; else name heuristic. */
37
+ export declare function isChatEntry(id: string, o?: Record<string, unknown>): boolean;
38
+ /** Drop non-chat (media/audio/embedding) entries from a catalog list. */
39
+ export declare function filterChatModels(models: ModelInfo[]): ModelInfo[];
40
+ /** "grok-4.6" → "Grok 4.6"; "grok-4.20-0309-non-reasoning" → "Grok 4.20 0309 Non Reasoning". */
41
+ export declare function deriveModelLabel(id: string): string;
42
+ /**
43
+ * Map raw `/v1/models` `data[]` entries into catalog entries.
44
+ * • A returned id that matches a static entry KEEPS that entry's label + contextLimit.
45
+ * • Otherwise: friendly label derived from the id; contextLimit from the entry's
46
+ * context_length / context_window when present, else `defaultContextLimit`.
47
+ * Order and de-dup follow the provider's response.
48
+ */
49
+ export declare function mapLiveEntries(data: unknown[], staticModels: ModelInfo[], defaultContextLimit: number): ModelInfo[];
50
+ /**
51
+ * Fetch a provider's live model catalog, with static fallback + short-lived cache.
52
+ * Only SUCCESSFUL live results are cached; a fallback never poisons the cache.
53
+ */
54
+ export declare function fetchLiveModels(opts: LiveModelOptions): Promise<ModelInfo[]>;
55
+ /** Test-only: reset the per-process cache between cases. */
56
+ export declare function __clearLiveModelCache(): void;
57
+ export {};
@@ -0,0 +1,208 @@
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.isChatModelId = isChatModelId;
17
+ exports.isChatEntry = isChatEntry;
18
+ exports.filterChatModels = filterChatModels;
19
+ exports.deriveModelLabel = deriveModelLabel;
20
+ exports.mapLiveEntries = mapLiveEntries;
21
+ exports.fetchLiveModels = fetchLiveModels;
22
+ exports.__clearLiveModelCache = __clearLiveModelCache;
23
+ const CACHE = new Map();
24
+ const DEFAULT_TTL_MS = 60_000;
25
+ const DEFAULT_TIMEOUT_MS = 4_000;
26
+ // ── chat/completion filter ───────────────────────────────────────────────────
27
+ // The picker should only surface TEXT chat/completion models. A provider's
28
+ // `/v1/models` can also list media-generation (image/video), audio (tts/whisper)
29
+ // and embedding models — those aren't usable as an agent's chat model.
30
+ //
31
+ // Name heuristic: ids matching these are excluded. Vision-INPUT chat models
32
+ // (e.g. grok-vision) do NOT match any token here, so they are kept.
33
+ const NON_CHAT_ID_RE = /(imagine|image|video|whisper|embedding|embed)/i;
34
+ // `tts` only as a whole token (so it can't swallow an unrelated substring).
35
+ const TTS_ID_RE = /(^|[-_/])tts([-_/]|$)/i;
36
+ /**
37
+ * Name-only heuristic: is this model id a TEXT chat/completion model?
38
+ * Used for entries (and static lists) that carry no modality field.
39
+ */
40
+ function isChatModelId(id) {
41
+ const s = String(id ?? '').trim().toLowerCase();
42
+ if (!s)
43
+ return false;
44
+ if (NON_CHAT_ID_RE.test(s))
45
+ return false;
46
+ if (TTS_ID_RE.test(s))
47
+ return false;
48
+ return true;
49
+ }
50
+ /**
51
+ * Prefer the API's own modality/type field when a `/v1/models` entry carries one.
52
+ * Returns true when the entry is definitively NON-chat (image/video/audio/embedding),
53
+ * false when definitively chat/text, and undefined when the entry says nothing —
54
+ * in which case the caller falls back to the name heuristic.
55
+ */
56
+ function nonChatByModality(o) {
57
+ const outs = o['output_modalities'] ?? o['output_modality'] ?? o['modalities'];
58
+ const arr = Array.isArray(outs) ? outs : (typeof outs === 'string' ? [outs] : null);
59
+ if (arr && arr.length) {
60
+ const mods = arr.map((x) => String(x).toLowerCase());
61
+ const hasText = mods.includes('text');
62
+ const hasMedia = mods.some((m) => ['image', 'video', 'audio', 'embedding'].includes(m));
63
+ if (hasText)
64
+ return false; // emits text → it's a chat/completion model
65
+ if (hasMedia)
66
+ return true; // emits only media → not a chat model
67
+ }
68
+ const type = o['type'] ?? o['modality'];
69
+ if (typeof type === 'string') {
70
+ const t = type.toLowerCase();
71
+ if (/(image|video|audio|embed|tts|whisper|speech)/.test(t))
72
+ return true;
73
+ if (/(chat|text|completion|language)/.test(t))
74
+ return false;
75
+ }
76
+ return undefined;
77
+ }
78
+ /** Is this live `/v1/models` entry a chat model? Modality field wins; else name heuristic. */
79
+ function isChatEntry(id, o) {
80
+ if (o) {
81
+ const byModality = nonChatByModality(o);
82
+ if (byModality === true)
83
+ return false;
84
+ if (byModality === false)
85
+ return true;
86
+ }
87
+ return isChatModelId(id);
88
+ }
89
+ /** Drop non-chat (media/audio/embedding) entries from a catalog list. */
90
+ function filterChatModels(models) {
91
+ return models.filter((m) => isChatModelId(m.id));
92
+ }
93
+ /** "grok-4.6" → "Grok 4.6"; "grok-4.20-0309-non-reasoning" → "Grok 4.20 0309 Non Reasoning". */
94
+ function deriveModelLabel(id) {
95
+ const cleaned = String(id ?? '').trim();
96
+ if (!cleaned)
97
+ return cleaned;
98
+ return cleaned
99
+ .split(/[-_/]/)
100
+ .filter(Boolean)
101
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
102
+ .join(' ');
103
+ }
104
+ /**
105
+ * Map raw `/v1/models` `data[]` entries into catalog entries.
106
+ * • A returned id that matches a static entry KEEPS that entry's label + contextLimit.
107
+ * • Otherwise: friendly label derived from the id; contextLimit from the entry's
108
+ * context_length / context_window when present, else `defaultContextLimit`.
109
+ * Order and de-dup follow the provider's response.
110
+ */
111
+ function mapLiveEntries(data, staticModels, defaultContextLimit) {
112
+ const byId = new Map(staticModels.map((m) => [m.id.toLowerCase(), m]));
113
+ const out = [];
114
+ const seen = new Set();
115
+ for (const raw of data) {
116
+ let id = '';
117
+ let ctxRaw = 0;
118
+ let obj;
119
+ if (raw && typeof raw === 'object') {
120
+ obj = raw;
121
+ id = String(obj['id'] ?? '').trim();
122
+ ctxRaw = Number(obj['context_length'] ?? obj['context_window'] ?? obj['contextLimit'] ?? 0);
123
+ }
124
+ else if (typeof raw === 'string') {
125
+ id = raw.trim();
126
+ }
127
+ if (!id)
128
+ continue;
129
+ // Keep only TEXT chat/completion models — drop image/video/audio/embedding.
130
+ // The API's own modality field wins when present; otherwise the name heuristic.
131
+ if (!isChatEntry(id, obj))
132
+ continue;
133
+ const key = id.toLowerCase();
134
+ if (seen.has(key))
135
+ continue;
136
+ seen.add(key);
137
+ const match = byId.get(key);
138
+ const contextLimit = match
139
+ ? match.contextLimit
140
+ : (Number.isFinite(ctxRaw) && ctxRaw > 0 ? Math.round(ctxRaw) : defaultContextLimit);
141
+ const label = match ? match.label : deriveModelLabel(id);
142
+ out.push({ id, label, contextLimit });
143
+ }
144
+ return out;
145
+ }
146
+ async function doFetch(opts, token) {
147
+ const fetchImpl = opts.fetchImpl ?? globalThis.fetch;
148
+ if (typeof fetchImpl !== 'function')
149
+ return null;
150
+ const controller = new AbortController();
151
+ const timer = setTimeout(() => controller.abort(), opts.timeoutMs ?? DEFAULT_TIMEOUT_MS);
152
+ try {
153
+ const headers = { Accept: 'application/json', ...(opts.headers ?? {}) };
154
+ if ((opts.authHeader ?? 'bearer') === 'x-api-key')
155
+ headers['x-api-key'] = token;
156
+ else
157
+ headers['Authorization'] = `Bearer ${token}`;
158
+ const res = await fetchImpl(opts.url, { headers, signal: controller.signal });
159
+ if (!res || !res.ok)
160
+ return null;
161
+ const json = (await res.json().catch(() => null));
162
+ let data = null;
163
+ if (json && typeof json === 'object' && Array.isArray(json.data)) {
164
+ data = json.data;
165
+ }
166
+ else if (Array.isArray(json)) {
167
+ data = json;
168
+ }
169
+ if (!data || data.length === 0)
170
+ return null;
171
+ const mapped = mapLiveEntries(data, opts.staticModels, opts.defaultContextLimit);
172
+ return mapped.length ? mapped : null;
173
+ }
174
+ catch {
175
+ // Timeout / network / parse — the caller falls back to static.
176
+ return null;
177
+ }
178
+ finally {
179
+ clearTimeout(timer);
180
+ }
181
+ }
182
+ /**
183
+ * Fetch a provider's live model catalog, with static fallback + short-lived cache.
184
+ * Only SUCCESSFUL live results are cached; a fallback never poisons the cache.
185
+ */
186
+ async function fetchLiveModels(opts) {
187
+ // The static fallback is filtered the same way as the live list so the picker
188
+ // never surfaces a media/embedding model regardless of which path is taken.
189
+ const staticChat = filterChatModels(opts.staticModels);
190
+ if (!opts.token || !String(opts.token).trim())
191
+ return staticChat;
192
+ const now = opts.now ?? (() => Date.now());
193
+ const ttl = opts.ttlMs ?? DEFAULT_TTL_MS;
194
+ const cached = CACHE.get(opts.family);
195
+ if (cached && now() - cached.ts < ttl)
196
+ return cached.models.slice();
197
+ const live = await doFetch(opts, String(opts.token));
198
+ if (live) {
199
+ CACHE.set(opts.family, { ts: now(), models: live });
200
+ return live.slice();
201
+ }
202
+ return staticChat;
203
+ }
204
+ /** Test-only: reset the per-process cache between cases. */
205
+ function __clearLiveModelCache() {
206
+ CACHE.clear();
207
+ }
208
+ //# 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.165",
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",