@mmnto/cli 0.18.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/LICENSE +190 -21
  2. package/dist/commands/compile.d.ts.map +1 -1
  3. package/dist/commands/compile.js +15 -0
  4. package/dist/commands/compile.js.map +1 -1
  5. package/dist/commands/docs.d.ts +6 -1
  6. package/dist/commands/docs.d.ts.map +1 -1
  7. package/dist/commands/docs.js +58 -5
  8. package/dist/commands/docs.js.map +1 -1
  9. package/dist/commands/docs.test.js +141 -89
  10. package/dist/commands/docs.test.js.map +1 -1
  11. package/dist/commands/extract.d.ts +1 -0
  12. package/dist/commands/extract.d.ts.map +1 -1
  13. package/dist/commands/extract.js +15 -5
  14. package/dist/commands/extract.js.map +1 -1
  15. package/dist/commands/extract.test.js +54 -1
  16. package/dist/commands/extract.test.js.map +1 -1
  17. package/dist/commands/shield.d.ts.map +1 -1
  18. package/dist/commands/shield.js +3 -1
  19. package/dist/commands/shield.js.map +1 -1
  20. package/dist/commands/wrap.js +1 -1
  21. package/dist/commands/wrap.js.map +1 -1
  22. package/dist/commands/wrap.test.js +2 -2
  23. package/dist/commands/wrap.test.js.map +1 -1
  24. package/dist/git.d.ts.map +1 -1
  25. package/dist/git.js +35 -24
  26. package/dist/git.js.map +1 -1
  27. package/dist/index.js +3 -3
  28. package/dist/index.js.map +1 -1
  29. package/dist/orchestrators/anthropic-orchestrator.d.ts +9 -0
  30. package/dist/orchestrators/anthropic-orchestrator.d.ts.map +1 -0
  31. package/dist/orchestrators/anthropic-orchestrator.js +62 -0
  32. package/dist/orchestrators/anthropic-orchestrator.js.map +1 -0
  33. package/dist/orchestrators/anthropic-orchestrator.test.d.ts +2 -0
  34. package/dist/orchestrators/anthropic-orchestrator.test.d.ts.map +1 -0
  35. package/dist/orchestrators/anthropic-orchestrator.test.js +109 -0
  36. package/dist/orchestrators/anthropic-orchestrator.test.js.map +1 -0
  37. package/dist/orchestrators/gemini-orchestrator.d.ts +9 -0
  38. package/dist/orchestrators/gemini-orchestrator.d.ts.map +1 -0
  39. package/dist/orchestrators/gemini-orchestrator.js +58 -0
  40. package/dist/orchestrators/gemini-orchestrator.js.map +1 -0
  41. package/dist/orchestrators/gemini-orchestrator.test.d.ts +2 -0
  42. package/dist/orchestrators/gemini-orchestrator.test.d.ts.map +1 -0
  43. package/dist/orchestrators/gemini-orchestrator.test.js +120 -0
  44. package/dist/orchestrators/gemini-orchestrator.test.js.map +1 -0
  45. package/dist/orchestrators/orchestrator.d.ts +56 -0
  46. package/dist/orchestrators/orchestrator.d.ts.map +1 -0
  47. package/dist/orchestrators/orchestrator.js +96 -0
  48. package/dist/orchestrators/orchestrator.js.map +1 -0
  49. package/dist/orchestrators/orchestrator.test.d.ts.map +1 -0
  50. package/dist/orchestrators/orchestrator.test.js +222 -0
  51. package/dist/orchestrators/orchestrator.test.js.map +1 -0
  52. package/dist/orchestrators/shell-orchestrator.d.ts +16 -0
  53. package/dist/orchestrators/shell-orchestrator.d.ts.map +1 -0
  54. package/dist/orchestrators/shell-orchestrator.js +131 -0
  55. package/dist/orchestrators/shell-orchestrator.js.map +1 -0
  56. package/dist/orchestrators/shell-orchestrator.test.d.ts +2 -0
  57. package/dist/orchestrators/shell-orchestrator.test.d.ts.map +1 -0
  58. package/dist/orchestrators/shell-orchestrator.test.js +267 -0
  59. package/dist/orchestrators/shell-orchestrator.test.js.map +1 -0
  60. package/dist/utils.d.ts +1 -18
  61. package/dist/utils.d.ts.map +1 -1
  62. package/dist/utils.js +31 -146
  63. package/dist/utils.js.map +1 -1
  64. package/dist/utils.test.js +183 -82
  65. package/dist/utils.test.js.map +1 -1
  66. package/package.json +17 -3
  67. package/dist/orchestrator.test.d.ts.map +0 -1
  68. package/dist/orchestrator.test.js +0 -130
  69. package/dist/orchestrator.test.js.map +0 -1
  70. /package/dist/{orchestrator.test.d.ts → orchestrators/orchestrator.test.d.ts} +0 -0
package/dist/utils.js CHANGED
@@ -1,15 +1,10 @@
1
- import { spawn } from 'node:child_process';
2
1
  import * as crypto from 'node:crypto';
3
2
  import * as fs from 'node:fs';
4
3
  import * as path from 'node:path';
5
- import { z } from 'zod';
6
4
  import { TotemConfigSchema } from '@mmnto/totem';
5
+ import { createOrchestrator, resolveOrchestrator } from './orchestrators/orchestrator.js';
7
6
  import { bold, log } from './ui.js';
8
7
  // ─── Shared constants ────────────────────────────────────
9
- const LLM_TIMEOUT_MS = 180_000;
10
- const LLM_MAX_OUTPUT = 50 * 1024 * 1024; // 50 MB — safety cap on streamed output
11
- const TEMP_ID_BYTES = 4;
12
- const MODEL_NAME_RE = /^[\w./:_-]+$/;
13
8
  const TELEMETRY_FILE = 'telemetry.jsonl';
14
9
  /** execFileSync on Windows can't resolve executables without `shell: true`. */
15
10
  export const IS_WIN = process.platform === 'win32';
@@ -70,126 +65,6 @@ function appendTelemetry(entry, cwd, totemDir) {
70
65
  log.warn('Totem', `Failed to write telemetry: ${msg}`);
71
66
  }
72
67
  }
73
- const GeminiModelStatsSchema = z.object({
74
- tokens: z.object({ input: z.number(), candidates: z.number() }).optional(),
75
- api: z.object({ totalLatencyMs: z.number() }).optional(),
76
- });
77
- const GeminiOutputSchema = z.object({
78
- response: z.string(),
79
- stats: z.object({ models: z.record(GeminiModelStatsSchema) }),
80
- });
81
- /**
82
- * Try to parse Gemini CLI JSON output. Returns extracted data or null if
83
- * the output is not valid Gemini JSON (e.g. raw text from a non-Gemini orchestrator).
84
- */
85
- export function tryParseGeminiJson(raw) {
86
- let data;
87
- try {
88
- data = JSON.parse(raw);
89
- }
90
- catch {
91
- return null;
92
- }
93
- const result = GeminiOutputSchema.safeParse(data);
94
- if (!result.success)
95
- return null;
96
- const allModelStats = Object.values(result.data.stats.models);
97
- if (allModelStats.length === 0)
98
- return null;
99
- const inputTokens = allModelStats.reduce((sum, s) => sum + (s.tokens?.input ?? 0), 0);
100
- const outputTokens = allModelStats.reduce((sum, s) => sum + (s.tokens?.candidates ?? 0), 0);
101
- const latencyMs = allModelStats.reduce((sum, s) => sum + (s.api?.totalLatencyMs ?? 0), 0) || null;
102
- return {
103
- content: result.data.response,
104
- inputTokens,
105
- outputTokens,
106
- latencyMs,
107
- };
108
- }
109
- // ─── Shell orchestrator ─────────────────────────────────
110
- export async function invokeShellOrchestrator(prompt, command, model, cwd, tag, totemDir) {
111
- const tmpName = `totem-${tag.toLowerCase()}-${crypto.randomBytes(TEMP_ID_BYTES).toString('hex')}.md`;
112
- const tempDir = path.join(cwd, totemDir, 'temp');
113
- fs.mkdirSync(tempDir, { recursive: true });
114
- const tempPath = path.join(tempDir, tmpName);
115
- fs.writeFileSync(tempPath, prompt, { encoding: 'utf-8', mode: 0o600 });
116
- const quotedPath = IS_WIN
117
- ? `"${tempPath.replace(/"/g, '""')}"`
118
- : `'${tempPath.replace(/'/g, "'\\''")}'`;
119
- const resolvedCmd = command.replace(/\{file\}/g, quotedPath).replace(/\{model\}/g, model);
120
- log.info(tag, 'Invoking orchestrator (this may take 15-60 seconds)...');
121
- const startMs = Date.now();
122
- try {
123
- const raw = await new Promise((resolve, reject) => {
124
- const child = spawn(resolvedCmd, {
125
- cwd,
126
- shell: true,
127
- stdio: ['ignore', 'pipe', 'pipe'],
128
- });
129
- let stdout = '';
130
- let stderr = '';
131
- let timedOut = false;
132
- child.stdout.on('data', (chunk) => {
133
- if (stdout.length < LLM_MAX_OUTPUT)
134
- stdout += chunk.toString();
135
- });
136
- child.stderr.on('data', (chunk) => {
137
- if (stderr.length < LLM_MAX_OUTPUT)
138
- stderr += chunk.toString();
139
- });
140
- const timer = setTimeout(() => {
141
- timedOut = true;
142
- child.kill();
143
- }, LLM_TIMEOUT_MS);
144
- child.on('error', (err) => {
145
- clearTimeout(timer);
146
- reject(new Error(`[Totem Error] Shell orchestrator command failed: ${err.message}\n${stderr}`));
147
- });
148
- child.on('close', (code) => {
149
- clearTimeout(timer);
150
- if (timedOut) {
151
- reject(Object.assign(new Error(`[Totem Error] Orchestrator timed out after ${LLM_TIMEOUT_MS / 1000}s.\n${stderr}`), { code: 'ETIMEDOUT' }));
152
- return;
153
- }
154
- if (code !== 0) {
155
- const fullError = `Process exited with code ${code}\n${stderr}`;
156
- const lowerMsg = fullError.toLowerCase();
157
- if (lowerMsg.includes('quota') ||
158
- lowerMsg.includes('429') ||
159
- lowerMsg.includes('too many requests')) {
160
- const quotaErr = new Error(fullError);
161
- quotaErr.name = 'QuotaError';
162
- reject(quotaErr);
163
- }
164
- else {
165
- reject(new Error(`[Totem Error] Shell orchestrator command failed: ${fullError}`));
166
- }
167
- return;
168
- }
169
- resolve(stdout);
170
- });
171
- });
172
- const wallMs = Date.now() - startMs;
173
- const gemini = tryParseGeminiJson(raw);
174
- if (gemini) {
175
- return {
176
- content: gemini.content,
177
- inputTokens: gemini.inputTokens,
178
- outputTokens: gemini.outputTokens,
179
- durationMs: gemini.latencyMs ?? wallMs,
180
- };
181
- }
182
- return { content: raw.trim(), inputTokens: null, outputTokens: null, durationMs: wallMs };
183
- }
184
- finally {
185
- try {
186
- fs.unlinkSync(tempPath);
187
- }
188
- catch {
189
- // Temp cleanup is best-effort
190
- }
191
- }
192
- }
193
68
  // ─── Orphaned temp file cleanup ──────────────────────────
194
69
  const TEMP_FILE_RE = /^totem-.*\.md$/;
195
70
  const TEMP_MAX_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours
@@ -300,7 +175,7 @@ const DEFAULT_TTLS = {
300
175
  };
301
176
  /**
302
177
  * Validate orchestrator config, then either output raw context (--raw) or
303
- * invoke the shell orchestrator and return the LLM content.
178
+ * invoke the configured orchestrator provider and return the LLM content.
304
179
  *
305
180
  * Returns `undefined` in --raw mode (prompt already written to output).
306
181
  * Returns the LLM response content string otherwise.
@@ -320,18 +195,18 @@ export async function runOrchestrator(opts) {
320
195
  throw new Error(`[Totem Error] No orchestrator configured. Add an 'orchestrator' block to totem.config.ts.\n` +
321
196
  `Example:\n orchestrator: {\n provider: 'shell',\n command: 'gemini --model {model} -e none < {file}',\n defaultModel: 'gemini-2.5-pro',\n }`);
322
197
  }
323
- if (config.orchestrator.provider !== 'shell') {
324
- throw new Error(`[Totem Error] Unsupported orchestrator provider: '${config.orchestrator.provider}'. Only 'shell' is supported.`);
325
- }
198
+ const baseProvider = config.orchestrator.provider;
199
+ const baseInvoke = createOrchestrator(config.orchestrator);
326
200
  const tagKey = tag.toLowerCase();
327
- let model = options.model ?? config.orchestrator.overrides?.[tagKey] ?? config.orchestrator.defaultModel;
328
- if (!model) {
201
+ const rawModel = options.model ?? config.orchestrator.overrides?.[tagKey] ?? config.orchestrator.defaultModel;
202
+ if (!rawModel) {
329
203
  throw new Error(`[Totem Error] No model specified. Provide one with --model, set a command-specific model in 'overrides', or set a 'defaultModel' in your orchestrator config.`);
330
204
  }
331
- if (model.startsWith('-') || !MODEL_NAME_RE.test(model)) {
332
- throw new Error(`[Totem Error] Invalid model name '${model}'. Model names may not start with a hyphen and may only contain word characters, dots, slashes, colons, underscores, and hyphens.`);
333
- }
334
- log.info(tag, `Model: ${bold(model)}`);
205
+ let resolved = resolveOrchestrator(rawModel, baseProvider, baseInvoke);
206
+ let model = resolved.parsed.model;
207
+ let qualifiedModel = resolved.qualifiedModel;
208
+ let invoke = resolved.invoke;
209
+ log.info(tag, `Model: ${bold(rawModel)}`);
335
210
  const ttlSeconds = config.orchestrator.cacheTtls?.[tagKey] ?? DEFAULT_TTLS[tagKey] ?? 0;
336
211
  const useCache = ttlSeconds > 0 && !options.fresh;
337
212
  let cachePath = '';
@@ -339,7 +214,7 @@ export async function runOrchestrator(opts) {
339
214
  const hash = crypto
340
215
  .createHash('sha256')
341
216
  .update(prompt)
342
- .update(model)
217
+ .update(qualifiedModel)
343
218
  .digest('hex')
344
219
  .slice(0, 16);
345
220
  const cacheDir = path.join(cwd, config.totemDir, 'cache');
@@ -360,22 +235,32 @@ export async function runOrchestrator(opts) {
360
235
  }
361
236
  let result;
362
237
  try {
363
- result = await invokeShellOrchestrator(prompt, config.orchestrator.command, model, cwd, tag, config.totemDir);
238
+ result = await invoke({ prompt, model, cwd, tag, totemDir: config.totemDir });
364
239
  }
365
240
  catch (err) {
366
241
  if (err instanceof Error && err.name === 'QuotaError') {
367
- const fallback = config.orchestrator.fallbackModel;
368
- if (fallback && model !== fallback) {
369
- log.warn(tag, `Quota exhausted for ${model}. Retrying with fallback model: ${bold(fallback)}...`);
242
+ const rawFallback = config.orchestrator.fallbackModel;
243
+ if (rawFallback && rawModel !== rawFallback) {
244
+ log.warn(tag, `Quota exhausted for ${rawModel}. Retrying with fallback model: ${bold(rawFallback)}...`);
245
+ const fallbackResolved = resolveOrchestrator(rawFallback, baseProvider, baseInvoke);
370
246
  try {
371
- result = await invokeShellOrchestrator(prompt, config.orchestrator.command, fallback, cwd, tag, config.totemDir);
372
- // Note: we update `model` to the fallback so telemetry logs the correct one
373
- model = fallback;
247
+ result = await fallbackResolved.invoke({
248
+ prompt,
249
+ model: fallbackResolved.parsed.model,
250
+ cwd,
251
+ tag,
252
+ totemDir: config.totemDir,
253
+ });
254
+ // Update model/invoke so telemetry and cache log the correct values
255
+ model = fallbackResolved.parsed.model;
256
+ qualifiedModel = fallbackResolved.qualifiedModel;
257
+ resolved = fallbackResolved;
258
+ invoke = fallbackResolved.invoke;
374
259
  }
375
260
  catch (fallbackErr) {
376
261
  const originalMsg = err.message;
377
262
  const fallbackMsg = fallbackErr instanceof Error ? fallbackErr.message : String(fallbackErr);
378
- throw new Error(`[Totem Error] Primary model '${model}' failed and fallback model '${fallback}' also failed.\n\n` +
263
+ throw new Error(`[Totem Error] Primary model '${rawModel}' failed and fallback model '${rawFallback}' also failed.\n\n` +
379
264
  `Primary error:\n${originalMsg}\n\n` +
380
265
  `Fallback error:\n${fallbackMsg}`);
381
266
  }
@@ -418,7 +303,7 @@ export async function runOrchestrator(opts) {
418
303
  appendTelemetry({
419
304
  timestamp: new Date().toISOString(),
420
305
  tag,
421
- model,
306
+ model: qualifiedModel,
422
307
  promptChars: prompt.length,
423
308
  inputTokens: result.inputTokens,
424
309
  outputTokens: result.outputTokens,
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import * as fs from 'node:fs';
2
2
  import * as os from 'node:os';
3
3
  import * as path from 'node:path';
4
4
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
5
- import { formatResults, getSystemPrompt, loadEnv, reapOrphanedTempFiles, requireEmbedding, resolveConfigPath, sanitize, tryParseGeminiJson, wrapXml, writeOutput, } from './utils.js';
5
+ import { formatResults, getSystemPrompt, loadEnv, reapOrphanedTempFiles, requireEmbedding, resolveConfigPath, runOrchestrator, sanitize, wrapXml, writeOutput, } from './utils.js';
6
6
  /** Helper to build a minimal SearchResult for tests. */
7
7
  function makeResult(overrides) {
8
8
  return { contextPrefix: '', type: 'code', metadata: {}, ...overrides };
@@ -157,87 +157,6 @@ describe('writeOutput', () => {
157
157
  spy.mockRestore();
158
158
  });
159
159
  });
160
- // ─── tryParseGeminiJson ──────────────────────────────
161
- describe('tryParseGeminiJson', () => {
162
- it('returns null for non-JSON input', () => {
163
- expect(tryParseGeminiJson('plain text output')).toBeNull();
164
- });
165
- it('returns null for JSON that does not match Gemini schema', () => {
166
- expect(tryParseGeminiJson('{"foo": "bar"}')).toBeNull();
167
- });
168
- it('returns null when stats.models is empty', () => {
169
- const input = JSON.stringify({
170
- response: 'hello',
171
- stats: { models: {} },
172
- });
173
- expect(tryParseGeminiJson(input)).toBeNull();
174
- });
175
- it('parses valid Gemini output with token stats', () => {
176
- const input = JSON.stringify({
177
- response: 'The answer is 42.',
178
- stats: {
179
- models: {
180
- 'gemini-2.5-pro': {
181
- tokens: { input: 500, candidates: 200 },
182
- api: { totalLatencyMs: 3000 },
183
- },
184
- },
185
- },
186
- });
187
- const result = tryParseGeminiJson(input);
188
- expect(result).toEqual({
189
- content: 'The answer is 42.',
190
- inputTokens: 500,
191
- outputTokens: 200,
192
- latencyMs: 3000,
193
- });
194
- });
195
- it('aggregates stats across multiple models', () => {
196
- const input = JSON.stringify({
197
- response: 'multi-model',
198
- stats: {
199
- models: {
200
- 'model-a': { tokens: { input: 100, candidates: 50 }, api: { totalLatencyMs: 1000 } },
201
- 'model-b': { tokens: { input: 200, candidates: 75 }, api: { totalLatencyMs: 2000 } },
202
- },
203
- },
204
- });
205
- const result = tryParseGeminiJson(input);
206
- expect(result).toEqual({
207
- content: 'multi-model',
208
- inputTokens: 300,
209
- outputTokens: 125,
210
- latencyMs: 3000,
211
- });
212
- });
213
- it('returns latencyMs null when api stats are missing', () => {
214
- const input = JSON.stringify({
215
- response: 'no api stats',
216
- stats: {
217
- models: {
218
- 'gemini-flash': { tokens: { input: 10, candidates: 5 } },
219
- },
220
- },
221
- });
222
- const result = tryParseGeminiJson(input);
223
- expect(result).not.toBeNull();
224
- expect(result.latencyMs).toBeNull();
225
- });
226
- it('defaults missing token counts to zero', () => {
227
- const input = JSON.stringify({
228
- response: 'no tokens key',
229
- stats: {
230
- models: {
231
- 'gemini-flash': { api: { totalLatencyMs: 500 } },
232
- },
233
- },
234
- });
235
- const result = tryParseGeminiJson(input);
236
- expect(result).not.toBeNull();
237
- expect(result.inputTokens).toBe(0);
238
- expect(result.outputTokens).toBe(0);
239
- });
240
- });
241
160
  // ─── resolveConfigPath ───────────────────────────────
242
161
  describe('resolveConfigPath', () => {
243
162
  let tmpDir;
@@ -427,4 +346,186 @@ describe('reapOrphanedTempFiles', () => {
427
346
  expect(removed).toBe(0);
428
347
  });
429
348
  });
349
+ // ─── runOrchestrator (#243 — cross-provider routing) ──
350
+ vi.mock('./orchestrators/orchestrator.js', async (importOriginal) => {
351
+ const actual = await importOriginal();
352
+ const mockInvoke = vi.fn().mockResolvedValue({
353
+ content: 'mock result',
354
+ inputTokens: 100,
355
+ outputTokens: 50,
356
+ durationMs: 500,
357
+ });
358
+ const mockedCreate = vi.fn().mockReturnValue(mockInvoke);
359
+ return {
360
+ ...actual,
361
+ createOrchestrator: mockedCreate,
362
+ // Re-bind resolveOrchestrator to use the mocked createOrchestrator
363
+ // (the real impl captures a closure over the real factory)
364
+ resolveOrchestrator: (rawModel, baseProvider, baseInvoke) => {
365
+ if (rawModel.startsWith('-') || !/^[\w./:_-]+$/.test(rawModel)) {
366
+ throw new Error(`[Totem Error] Invalid model name '${rawModel}'. Model names may only contain word characters, dots, slashes, colons, underscores, and hyphens.`);
367
+ }
368
+ const parsed = actual.parseModelString(rawModel, baseProvider);
369
+ if (parsed.provider === 'shell' && baseProvider !== 'shell') {
370
+ throw new Error(`[Totem Error] Cannot route to 'shell' provider from a '${baseProvider}' config.\n` +
371
+ `The shell provider requires a 'command' template in the orchestrator config.`);
372
+ }
373
+ if (!parsed.model || parsed.model.startsWith('-')) {
374
+ throw new Error(`[Totem Error] Invalid model name in '${rawModel}'. The model portion must not be empty or start with a hyphen.`);
375
+ }
376
+ const invoke = parsed.provider === baseProvider
377
+ ? baseInvoke
378
+ : mockedCreate({ provider: parsed.provider });
379
+ return { parsed, invoke, qualifiedModel: rawModel };
380
+ },
381
+ };
382
+ });
383
+ import { createOrchestrator } from './orchestrators/orchestrator.js';
384
+ const mockedCreateOrchestrator = vi.mocked(createOrchestrator);
385
+ function baseConfig(overrides) {
386
+ return {
387
+ targets: [{ glob: '**/*.ts', type: 'code', strategy: 'typescript-ast' }],
388
+ orchestrator: {
389
+ provider: 'gemini',
390
+ defaultModel: 'gemini-3-flash-preview',
391
+ },
392
+ totemDir: '.totem',
393
+ lanceDir: '.lancedb',
394
+ ignorePatterns: [],
395
+ contextWarningThreshold: 40_000,
396
+ ...overrides,
397
+ };
398
+ }
399
+ describe('runOrchestrator', () => {
400
+ let tmpDir;
401
+ beforeEach(() => {
402
+ vi.clearAllMocks();
403
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-orch-test-'));
404
+ vi.spyOn(process, 'cwd').mockReturnValue(tmpDir);
405
+ // Re-set the mock return value after clearAllMocks
406
+ const mockInvoke = vi.fn().mockResolvedValue({
407
+ content: 'mock result',
408
+ inputTokens: 100,
409
+ outputTokens: 50,
410
+ durationMs: 500,
411
+ });
412
+ mockedCreateOrchestrator.mockReturnValue(mockInvoke);
413
+ });
414
+ afterEach(() => {
415
+ vi.restoreAllMocks();
416
+ fs.rmSync(tmpDir, { recursive: true, force: true });
417
+ });
418
+ it('uses default provider and model when no overrides', async () => {
419
+ const result = await runOrchestrator({
420
+ prompt: 'test prompt',
421
+ tag: 'Spec',
422
+ options: {},
423
+ config: baseConfig(),
424
+ cwd: tmpDir,
425
+ });
426
+ expect(result).toBe('mock result');
427
+ expect(mockedCreateOrchestrator).toHaveBeenCalledWith(expect.objectContaining({ provider: 'gemini' }));
428
+ });
429
+ it('uses per-command override from config', async () => {
430
+ const config = baseConfig({
431
+ orchestrator: {
432
+ provider: 'gemini',
433
+ defaultModel: 'gemini-3-flash-preview',
434
+ overrides: { spec: 'gemini-3.1-pro-preview' },
435
+ },
436
+ });
437
+ await runOrchestrator({
438
+ prompt: 'test',
439
+ tag: 'Spec',
440
+ options: {},
441
+ config,
442
+ cwd: tmpDir,
443
+ });
444
+ // The invoke should receive the override model
445
+ const invoke = mockedCreateOrchestrator.mock.results[0].value;
446
+ expect(invoke).toHaveBeenCalledWith(expect.objectContaining({ model: 'gemini-3.1-pro-preview' }));
447
+ });
448
+ it('--model flag takes priority over overrides', async () => {
449
+ const config = baseConfig({
450
+ orchestrator: {
451
+ provider: 'gemini',
452
+ defaultModel: 'gemini-3-flash-preview',
453
+ overrides: { spec: 'gemini-3.1-pro-preview' },
454
+ },
455
+ });
456
+ await runOrchestrator({
457
+ prompt: 'test',
458
+ tag: 'Spec',
459
+ options: { model: 'custom-model' },
460
+ config,
461
+ cwd: tmpDir,
462
+ });
463
+ const invoke = mockedCreateOrchestrator.mock.results[0].value;
464
+ expect(invoke).toHaveBeenCalledWith(expect.objectContaining({ model: 'custom-model' }));
465
+ });
466
+ it('creates a new orchestrator for cross-provider override', async () => {
467
+ const config = baseConfig({
468
+ orchestrator: {
469
+ provider: 'gemini',
470
+ defaultModel: 'gemini-3-flash-preview',
471
+ overrides: { shield: 'anthropic:claude-sonnet-4-20250514' },
472
+ },
473
+ });
474
+ await runOrchestrator({
475
+ prompt: 'test',
476
+ tag: 'Shield',
477
+ options: {},
478
+ config,
479
+ cwd: tmpDir,
480
+ });
481
+ // Should create two orchestrators: one for base config, one for cross-provider
482
+ expect(mockedCreateOrchestrator).toHaveBeenCalledTimes(2);
483
+ expect(mockedCreateOrchestrator).toHaveBeenCalledWith(expect.objectContaining({ provider: 'anthropic' }));
484
+ });
485
+ it('throws when cross-routing to shell from an API provider', async () => {
486
+ const config = baseConfig({
487
+ orchestrator: {
488
+ provider: 'gemini',
489
+ defaultModel: 'gemini-3-flash-preview',
490
+ overrides: { spec: 'shell:my-model' },
491
+ },
492
+ });
493
+ await expect(runOrchestrator({ prompt: 'test', tag: 'Spec', options: {}, config, cwd: tmpDir })).rejects.toThrow("Cannot route to 'shell' provider");
494
+ });
495
+ it('throws when model portion is empty (anthropic:)', async () => {
496
+ await expect(runOrchestrator({
497
+ prompt: 'test',
498
+ tag: 'Spec',
499
+ options: { model: 'anthropic:' },
500
+ config: baseConfig(),
501
+ cwd: tmpDir,
502
+ })).rejects.toThrow('must not be empty');
503
+ });
504
+ it('throws when model portion starts with hyphen', async () => {
505
+ await expect(runOrchestrator({
506
+ prompt: 'test',
507
+ tag: 'Spec',
508
+ options: { model: 'anthropic:-bad' },
509
+ config: baseConfig(),
510
+ cwd: tmpDir,
511
+ })).rejects.toThrow('must not be empty or start with a hyphen');
512
+ });
513
+ it('throws when no model is specified anywhere', async () => {
514
+ const config = baseConfig({
515
+ orchestrator: { provider: 'gemini' },
516
+ });
517
+ await expect(runOrchestrator({ prompt: 'test', tag: 'Spec', options: {}, config, cwd: tmpDir })).rejects.toThrow('No model specified');
518
+ });
519
+ it('returns undefined in --raw mode without invoking orchestrator', async () => {
520
+ const result = await runOrchestrator({
521
+ prompt: 'test',
522
+ tag: 'Spec',
523
+ options: { raw: true },
524
+ config: baseConfig(),
525
+ cwd: tmpDir,
526
+ });
527
+ expect(result).toBeUndefined();
528
+ expect(mockedCreateOrchestrator).not.toHaveBeenCalled();
529
+ });
530
+ });
430
531
  //# sourceMappingURL=utils.test.js.map