@agent-native/core 0.49.2 → 0.49.3

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 (88) hide show
  1. package/dist/agent/engine/builder-engine.d.ts +1 -1
  2. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  3. package/dist/agent/engine/index.d.ts +1 -1
  4. package/dist/agent/engine/index.d.ts.map +1 -1
  5. package/dist/agent/engine/index.js +1 -1
  6. package/dist/agent/engine/index.js.map +1 -1
  7. package/dist/agent/engine/registry.d.ts +1 -0
  8. package/dist/agent/engine/registry.d.ts.map +1 -1
  9. package/dist/agent/engine/registry.js +11 -0
  10. package/dist/agent/engine/registry.js.map +1 -1
  11. package/dist/agent/model-config.d.ts +2 -2
  12. package/dist/agent/model-config.d.ts.map +1 -1
  13. package/dist/agent/model-config.js +2 -6
  14. package/dist/agent/model-config.js.map +1 -1
  15. package/dist/agent/production-agent.d.ts.map +1 -1
  16. package/dist/agent/production-agent.js +3 -2
  17. package/dist/agent/production-agent.js.map +1 -1
  18. package/dist/cli/code-agent-executor.d.ts.map +1 -1
  19. package/dist/cli/code-agent-executor.js +3 -2
  20. package/dist/cli/code-agent-executor.js.map +1 -1
  21. package/dist/cli/connect.d.ts.map +1 -1
  22. package/dist/cli/connect.js +117 -33
  23. package/dist/cli/connect.js.map +1 -1
  24. package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
  25. package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
  26. package/dist/cli/pr-visual-recap-workflow.js +1 -1
  27. package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
  28. package/dist/cli/recap.d.ts +20 -0
  29. package/dist/cli/recap.d.ts.map +1 -1
  30. package/dist/cli/recap.js +256 -40
  31. package/dist/cli/recap.js.map +1 -1
  32. package/dist/cli/skills.d.ts +2 -2
  33. package/dist/cli/skills.d.ts.map +1 -1
  34. package/dist/cli/skills.js +5 -5
  35. package/dist/cli/skills.js.map +1 -1
  36. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  37. package/dist/client/MultiTabAssistantChat.js +0 -7
  38. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  39. package/dist/client/blocks/library/annotation-rail.d.ts +14 -0
  40. package/dist/client/blocks/library/annotation-rail.d.ts.map +1 -1
  41. package/dist/client/blocks/library/annotation-rail.js +64 -2
  42. package/dist/client/blocks/library/annotation-rail.js.map +1 -1
  43. package/dist/client/use-chat-models.d.ts.map +1 -1
  44. package/dist/client/use-chat-models.js +0 -5
  45. package/dist/client/use-chat-models.js.map +1 -1
  46. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  47. package/dist/integrations/webhook-handler.js +3 -2
  48. package/dist/integrations/webhook-handler.js.map +1 -1
  49. package/dist/jobs/scheduler.d.ts.map +1 -1
  50. package/dist/jobs/scheduler.js +3 -2
  51. package/dist/jobs/scheduler.js.map +1 -1
  52. package/dist/mcp/connect-route.d.ts +2 -0
  53. package/dist/mcp/connect-route.d.ts.map +1 -1
  54. package/dist/mcp/connect-route.js +3 -0
  55. package/dist/mcp/connect-route.js.map +1 -1
  56. package/dist/mcp/server.js +1 -1
  57. package/dist/mcp/server.js.map +1 -1
  58. package/dist/observability/evals.d.ts.map +1 -1
  59. package/dist/observability/evals.js +5 -3
  60. package/dist/observability/evals.js.map +1 -1
  61. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  62. package/dist/scripts/agent-engines/list-agent-engines.js +6 -3
  63. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  64. package/dist/scripts/agent-engines/manage-agent-engine.d.ts.map +1 -1
  65. package/dist/scripts/agent-engines/manage-agent-engine.js +5 -1
  66. package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
  67. package/dist/scripts/agent-engines/set-agent-engine.d.ts.map +1 -1
  68. package/dist/scripts/agent-engines/set-agent-engine.js +7 -2
  69. package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
  70. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  71. package/dist/server/agent-chat-plugin.js +14 -4
  72. package/dist/server/agent-chat-plugin.js.map +1 -1
  73. package/dist/server/complete-text.d.ts.map +1 -1
  74. package/dist/server/complete-text.js +3 -2
  75. package/dist/server/complete-text.js.map +1 -1
  76. package/dist/server/core-routes-plugin.d.ts +2 -0
  77. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  78. package/dist/server/core-routes-plugin.js +1 -0
  79. package/dist/server/core-routes-plugin.js.map +1 -1
  80. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +7 -6
  81. package/dist/triggers/dispatcher.d.ts.map +1 -1
  82. package/dist/triggers/dispatcher.js +3 -2
  83. package/dist/triggers/dispatcher.js.map +1 -1
  84. package/docs/content/external-agents.md +1 -1
  85. package/docs/content/plan-plugin.md +2 -2
  86. package/docs/content/pr-visual-recap.md +12 -4
  87. package/package.json +1 -1
  88. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +7 -6
@@ -1,6 +1,6 @@
1
1
  import { getTraceSummary, insertEvalResult, getEvalDataset } from "./store.js";
2
2
  import { getRunById, getRunEventsSince } from "../agent/run-store.js";
3
- import { resolveEngine, getStoredModelForEngine, } from "../agent/engine/index.js";
3
+ import { resolveEngine, getStoredModelForEngine, normalizeModelForEngine, } from "../agent/engine/index.js";
4
4
  const LATENCY_BASELINE_PER_TOOL_MS = 10_000;
5
5
  const COST_BASELINE_PER_TOOL_CX100 = 50;
6
6
  const LLM_JUDGE_TIMEOUT_MS = 30_000;
@@ -182,9 +182,10 @@ export async function runLlmJudgeEval(runId, criteria, opts) {
182
182
  if (!transcript.trim())
183
183
  return null;
184
184
  const engine = opts?.engine ?? (await resolveEngine({ engineOption: undefined }));
185
- const model = opts?.model ??
185
+ const modelCandidate = opts?.model ??
186
186
  (await getStoredModelForEngine(engine)) ??
187
187
  engine.defaultModel;
188
+ const model = normalizeModelForEngine(engine, modelCandidate);
188
189
  const judgePrompt = buildJudgePrompt(transcript, criteria);
189
190
  const controller = new AbortController();
190
191
  const timeout = setTimeout(() => controller.abort(), LLM_JUDGE_TIMEOUT_MS);
@@ -241,9 +242,10 @@ export async function runDatasetEval(datasetId, opts) {
241
242
  return { datasetId, totalCases: 0, avgScore: 0, results: [] };
242
243
  }
243
244
  const engine = opts?.engine ?? (await resolveEngine({ engineOption: undefined }));
244
- const model = opts?.model ??
245
+ const modelCandidate = opts?.model ??
245
246
  (await getStoredModelForEngine(engine)) ??
246
247
  engine.defaultModel;
248
+ const model = normalizeModelForEngine(engine, modelCandidate);
247
249
  const criteria = opts?.criteria ?? [
248
250
  {
249
251
  name: "response_quality",
@@ -1 +1 @@
1
- {"version":3,"file":"evals.js","sourceRoot":"","sources":["../../src/observability/evals.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n EvalResult,\n EvalCriteria,\n TraceSummary,\n EvalTestCase,\n} from \"./types.js\";\nimport { getTraceSummary, insertEvalResult, getEvalDataset } from \"./store.js\";\nimport { getRunById, getRunEventsSince } from \"../agent/run-store.js\";\nimport type { AgentEngine } from \"../agent/engine/types.js\";\nimport {\n resolveEngine,\n getStoredModelForEngine,\n} from \"../agent/engine/index.js\";\n\nconst LATENCY_BASELINE_PER_TOOL_MS = 10_000;\nconst COST_BASELINE_PER_TOOL_CX100 = 50;\nconst LLM_JUDGE_TIMEOUT_MS = 30_000;\n\ninterface MakeEvalResultOpts {\n runId: string;\n threadId: string | null;\n userId: string | null;\n evalType: EvalResult[\"evalType\"];\n criteria: string;\n score: number;\n reasoning?: string | null;\n metadata?: Record<string, unknown> | null;\n}\n\nfunction makeEvalResult(opts: MakeEvalResultOpts): EvalResult {\n return {\n id: crypto.randomUUID(),\n runId: opts.runId,\n threadId: opts.threadId,\n userId: opts.userId,\n evalType: opts.evalType,\n criteria: opts.criteria,\n score: Math.max(0, Math.min(1, opts.score)),\n reasoning: opts.reasoning ?? null,\n metadata: opts.metadata ?? null,\n createdAt: Date.now(),\n };\n}\n\n/** Lift the (runId, threadId, userId) triple off a TraceSummary —\n * every automated scorer pulls these together. */\nfunction fromSummary(summary: TraceSummary): {\n runId: string;\n threadId: string | null;\n userId: string | null;\n} {\n return {\n runId: summary.runId,\n threadId: summary.threadId,\n userId: summary.userId,\n };\n}\n\n// ─── Layer 1: Automated deterministic scorers ────────────────────────\n\nfunction scoreToolSuccessRate(summary: TraceSummary): EvalResult {\n const total = summary.toolCalls;\n const score = total > 0 ? summary.successfulTools / total : 1.0;\n return makeEvalResult({\n ...fromSummary(summary),\n evalType: \"automated\",\n criteria: \"tool_success_rate\",\n score,\n metadata: {\n totalTools: total,\n successfulTools: summary.successfulTools,\n failedTools: summary.failedTools,\n },\n });\n}\n\nfunction scoreStepEfficiency(summary: TraceSummary): EvalResult {\n // No tool calls = simple Q&A, maximally efficient.\n // With tools: penalize excessive LLM iterations relative to tool calls.\n const score =\n summary.toolCalls === 0\n ? 1.0\n : summary.llmCalls > 0\n ? Math.min(1, summary.toolCalls / summary.llmCalls)\n : 1.0;\n return makeEvalResult({\n ...fromSummary(summary),\n evalType: \"automated\",\n criteria: \"step_efficiency\",\n score,\n metadata: { llmCalls: summary.llmCalls, toolCalls: summary.toolCalls },\n });\n}\n\nfunction scoreLatency(summary: TraceSummary): EvalResult {\n const expectedMs = Math.max(\n LATENCY_BASELINE_PER_TOOL_MS,\n summary.toolCalls * LATENCY_BASELINE_PER_TOOL_MS,\n );\n const score = Math.max(0, 1 - summary.totalDurationMs / expectedMs);\n return makeEvalResult({\n ...fromSummary(summary),\n evalType: \"automated\",\n criteria: \"latency_score\",\n score,\n metadata: { actualMs: summary.totalDurationMs, expectedMs },\n });\n}\n\nfunction scoreCostEfficiency(summary: TraceSummary): EvalResult {\n const expectedCx100 = Math.max(\n COST_BASELINE_PER_TOOL_CX100,\n summary.toolCalls * COST_BASELINE_PER_TOOL_CX100,\n );\n const score = Math.max(0, 1 - summary.totalCostCentsX100 / expectedCx100);\n return makeEvalResult({\n ...fromSummary(summary),\n evalType: \"automated\",\n criteria: \"cost_efficiency\",\n score,\n metadata: { actualCx100: summary.totalCostCentsX100, expectedCx100 },\n });\n}\n\nfunction scoreErrorRecovery(\n summary: TraceSummary,\n runStatus: string,\n): EvalResult {\n const hadErrors = summary.failedTools > 0;\n let score: number;\n if (!hadErrors) {\n score = 1.0;\n } else if (runStatus === \"completed\") {\n score = 1.0;\n } else {\n score = 0;\n }\n return makeEvalResult({\n ...fromSummary(summary),\n evalType: \"automated\",\n criteria: \"error_recovery\",\n score,\n metadata: { hadErrors, runStatus },\n });\n}\n\nexport async function runAutomatedEvals(runId: string): Promise<EvalResult[]> {\n const [summary, run] = await Promise.all([\n getTraceSummary(runId),\n getRunById(runId),\n ]);\n\n if (!summary) return [];\n\n const runStatus = run?.status ?? \"unknown\";\n const results = [\n scoreToolSuccessRate(summary),\n scoreStepEfficiency(summary),\n scoreLatency(summary),\n scoreCostEfficiency(summary),\n scoreErrorRecovery(summary, runStatus),\n ];\n\n for (const result of results) {\n insertEvalResult(result).catch(() => {});\n }\n\n return results;\n}\n\n// ─── Layer 2: LLM-as-Judge ───────────────────────────────────────────\n\nfunction buildConversationTranscript(\n events: Array<{ seq: number; eventData: string }>,\n): string {\n const lines: string[] = [];\n for (const { eventData } of events) {\n try {\n const event = JSON.parse(eventData);\n if (event.type === \"user-message\") {\n lines.push(`[User]: ${event.text ?? JSON.stringify(event.content)}`);\n } else if (event.type === \"text-delta\" || event.type === \"text\") {\n lines.push(`[Agent]: ${event.text}`);\n } else if (event.type === \"tool_start\") {\n lines.push(`[Tool Call: ${event.tool}] ${JSON.stringify(event.input)}`);\n } else if (event.type === \"tool_done\") {\n const snippet =\n typeof event.result === \"string\"\n ? event.result.slice(0, 500)\n : JSON.stringify(event.result).slice(0, 500);\n lines.push(`[Tool Result]: ${snippet}`);\n }\n } catch {\n // Skip unparseable events\n }\n }\n return lines.join(\"\\n\");\n}\n\nfunction buildJudgePrompt(transcript: string, criteria: EvalCriteria): string {\n let prompt = `You are an expert evaluator. Assess the following agent conversation against the given criteria.\n\n## Criteria\nName: ${criteria.name}\nDescription: ${criteria.description}`;\n\n if (criteria.rubric) {\n prompt += `\\nRubric: ${criteria.rubric}`;\n }\n\n const min = criteria.scoreRange?.min ?? 0;\n const max = criteria.scoreRange?.max ?? 1;\n\n prompt += `\n\n## Conversation Transcript\n${transcript}\n\n## Instructions\nEvaluate the conversation and respond with ONLY a JSON object (no markdown, no explanation outside the JSON):\n{\"score\": <number between ${min} and ${max}>, \"reasoning\": \"<brief explanation>\"}`;\n\n return prompt;\n}\n\nexport async function runLlmJudgeEval(\n runId: string,\n criteria: EvalCriteria,\n opts?: { engine?: AgentEngine; model?: string; userId?: string | null },\n): Promise<EvalResult | null> {\n try {\n const [events, run] = await Promise.all([\n getRunEventsSince(runId, 0),\n getRunById(runId),\n ]);\n\n if (events.length === 0) return null;\n\n const transcript = buildConversationTranscript(events);\n if (!transcript.trim()) return null;\n\n const engine =\n opts?.engine ?? (await resolveEngine({ engineOption: undefined }));\n const model =\n opts?.model ??\n (await getStoredModelForEngine(engine)) ??\n engine.defaultModel;\n\n const judgePrompt = buildJudgePrompt(transcript, criteria);\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), LLM_JUDGE_TIMEOUT_MS);\n\n let responseText = \"\";\n try {\n const stream = engine.stream({\n model,\n systemPrompt:\n \"You are an evaluation judge. Respond only with valid JSON.\",\n messages: [\n { role: \"user\", content: [{ type: \"text\", text: judgePrompt }] },\n ],\n tools: [],\n abortSignal: controller.signal,\n maxOutputTokens: 512,\n temperature: 0,\n });\n\n for await (const event of stream) {\n if (event.type === \"text-delta\") {\n responseText += event.text;\n }\n }\n } finally {\n clearTimeout(timeout);\n }\n\n const jsonMatch = responseText.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) return null;\n\n const parsed = JSON.parse(jsonMatch[0]) as {\n score: number;\n reasoning: string;\n };\n\n const min = criteria.scoreRange?.min ?? 0;\n const max = criteria.scoreRange?.max ?? 1;\n const normalizedScore =\n max > min ? (parsed.score - min) / (max - min) : parsed.score;\n\n const result = makeEvalResult({\n runId,\n threadId: run?.threadId ?? null,\n userId: opts?.userId ?? null,\n evalType: \"llm_judge\",\n criteria: criteria.name,\n score: normalizedScore,\n reasoning: parsed.reasoning,\n metadata: { model, rawScore: parsed.score, scoreRange: { min, max } },\n });\n\n insertEvalResult(result).catch(() => {});\n return result;\n } catch {\n return null;\n }\n}\n\n// ─── Layer 3: Dataset evaluation ─────────────────────────────────────\n\nexport async function runDatasetEval(\n datasetId: string,\n opts?: { criteria?: EvalCriteria[]; engine?: AgentEngine; model?: string },\n): Promise<{\n datasetId: string;\n totalCases: number;\n avgScore: number;\n results: EvalResult[];\n}> {\n const dataset = await getEvalDataset(datasetId);\n if (!dataset) {\n return { datasetId, totalCases: 0, avgScore: 0, results: [] };\n }\n\n const engine =\n opts?.engine ?? (await resolveEngine({ engineOption: undefined }));\n const model =\n opts?.model ??\n (await getStoredModelForEngine(engine)) ??\n engine.defaultModel;\n\n const criteria = opts?.criteria ?? [\n {\n name: \"response_quality\",\n description:\n \"How well the agent's response addresses the user's input, considering accuracy, completeness, and helpfulness.\",\n },\n ];\n\n const allResults: EvalResult[] = [];\n\n for (const testCase of dataset.entries) {\n const transcript = buildTestCaseTranscript(testCase, engine, model);\n\n for (const c of criteria) {\n const result = await evaluateTestCase(\n datasetId,\n testCase,\n transcript,\n c,\n engine,\n model,\n );\n if (result) allResults.push(result);\n }\n }\n\n const avgScore =\n allResults.length > 0\n ? allResults.reduce((sum, r) => sum + r.score, 0) / allResults.length\n : 0;\n\n return {\n datasetId,\n totalCases: dataset.entries.length,\n avgScore,\n results: allResults,\n };\n}\n\nfunction buildTestCaseTranscript(\n testCase: EvalTestCase,\n _engine: AgentEngine,\n _model: string,\n): string {\n let transcript = `[User]: ${testCase.input}`;\n if (testCase.expectedOutput) {\n transcript += `\\n[Expected Output]: ${testCase.expectedOutput}`;\n }\n if (testCase.context) {\n transcript += `\\n[Context]: ${JSON.stringify(testCase.context)}`;\n }\n return transcript;\n}\n\nasync function evaluateTestCase(\n datasetId: string,\n testCase: EvalTestCase,\n transcript: string,\n criteria: EvalCriteria,\n engine: AgentEngine,\n model: string,\n): Promise<EvalResult | null> {\n try {\n const judgePrompt = buildJudgePrompt(transcript, criteria);\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), LLM_JUDGE_TIMEOUT_MS);\n\n let responseText = \"\";\n try {\n const stream = engine.stream({\n model,\n systemPrompt:\n \"You are an evaluation judge. Respond only with valid JSON.\",\n messages: [\n { role: \"user\", content: [{ type: \"text\", text: judgePrompt }] },\n ],\n tools: [],\n abortSignal: controller.signal,\n maxOutputTokens: 512,\n temperature: 0,\n });\n\n for await (const event of stream) {\n if (event.type === \"text-delta\") {\n responseText += event.text;\n }\n }\n } finally {\n clearTimeout(timeout);\n }\n\n const jsonMatch = responseText.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) return null;\n\n const parsed = JSON.parse(jsonMatch[0]) as {\n score: number;\n reasoning: string;\n };\n\n const min = criteria.scoreRange?.min ?? 0;\n const max = criteria.scoreRange?.max ?? 1;\n const normalizedScore =\n max > min ? (parsed.score - min) / (max - min) : parsed.score;\n\n // Dataset evals use a synthetic runId since there's no real run\n const syntheticRunId = `dataset:${datasetId}:${crypto.randomUUID()}`;\n\n // Dataset evals are administrative — there's no per-user runId, so\n // we leave userId null. Per-user reads filter null rows out, which\n // is the right default; admins can fetch dataset evals via the\n // unfiltered call path.\n const result = makeEvalResult({\n runId: syntheticRunId,\n threadId: null,\n userId: null,\n evalType: \"llm_judge\",\n criteria: criteria.name,\n score: normalizedScore,\n reasoning: parsed.reasoning,\n metadata: {\n datasetId,\n model,\n testCaseInput: testCase.input,\n expectedOutput: testCase.expectedOutput ?? null,\n tags: testCase.tags ?? [],\n rawScore: parsed.score,\n scoreRange: { min, max },\n },\n });\n\n insertEvalResult(result).catch(() => {});\n return result;\n } catch {\n return null;\n }\n}\n\n// ─── Orchestrator ────────────────────────────────────────────────────\n\nexport async function evaluateRun(\n runId: string,\n opts?: { sampleRate?: number },\n): Promise<EvalResult[]> {\n const results = await runAutomatedEvals(runId);\n const userId = results[0]?.userId ?? null;\n\n const sampleRate = opts?.sampleRate ?? 0;\n if (sampleRate > 0 && Math.random() < sampleRate) {\n const defaultCriteria: EvalCriteria[] = [\n {\n name: \"overall_quality\",\n description:\n \"Overall quality of the agent's response, considering helpfulness, accuracy, and appropriate tool usage.\",\n },\n {\n name: \"task_completion\",\n description:\n \"Whether the agent successfully completed the user's requested task.\",\n },\n ];\n\n const judgeResults = await Promise.all(\n defaultCriteria.map((c) => runLlmJudgeEval(runId, c, { userId })),\n );\n\n for (const r of judgeResults) {\n if (r) results.push(r);\n }\n }\n\n return results;\n}\n"]}
1
+ {"version":3,"file":"evals.js","sourceRoot":"","sources":["../../src/observability/evals.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n EvalResult,\n EvalCriteria,\n TraceSummary,\n EvalTestCase,\n} from \"./types.js\";\nimport { getTraceSummary, insertEvalResult, getEvalDataset } from \"./store.js\";\nimport { getRunById, getRunEventsSince } from \"../agent/run-store.js\";\nimport type { AgentEngine } from \"../agent/engine/types.js\";\nimport {\n resolveEngine,\n getStoredModelForEngine,\n normalizeModelForEngine,\n} from \"../agent/engine/index.js\";\n\nconst LATENCY_BASELINE_PER_TOOL_MS = 10_000;\nconst COST_BASELINE_PER_TOOL_CX100 = 50;\nconst LLM_JUDGE_TIMEOUT_MS = 30_000;\n\ninterface MakeEvalResultOpts {\n runId: string;\n threadId: string | null;\n userId: string | null;\n evalType: EvalResult[\"evalType\"];\n criteria: string;\n score: number;\n reasoning?: string | null;\n metadata?: Record<string, unknown> | null;\n}\n\nfunction makeEvalResult(opts: MakeEvalResultOpts): EvalResult {\n return {\n id: crypto.randomUUID(),\n runId: opts.runId,\n threadId: opts.threadId,\n userId: opts.userId,\n evalType: opts.evalType,\n criteria: opts.criteria,\n score: Math.max(0, Math.min(1, opts.score)),\n reasoning: opts.reasoning ?? null,\n metadata: opts.metadata ?? null,\n createdAt: Date.now(),\n };\n}\n\n/** Lift the (runId, threadId, userId) triple off a TraceSummary —\n * every automated scorer pulls these together. */\nfunction fromSummary(summary: TraceSummary): {\n runId: string;\n threadId: string | null;\n userId: string | null;\n} {\n return {\n runId: summary.runId,\n threadId: summary.threadId,\n userId: summary.userId,\n };\n}\n\n// ─── Layer 1: Automated deterministic scorers ────────────────────────\n\nfunction scoreToolSuccessRate(summary: TraceSummary): EvalResult {\n const total = summary.toolCalls;\n const score = total > 0 ? summary.successfulTools / total : 1.0;\n return makeEvalResult({\n ...fromSummary(summary),\n evalType: \"automated\",\n criteria: \"tool_success_rate\",\n score,\n metadata: {\n totalTools: total,\n successfulTools: summary.successfulTools,\n failedTools: summary.failedTools,\n },\n });\n}\n\nfunction scoreStepEfficiency(summary: TraceSummary): EvalResult {\n // No tool calls = simple Q&A, maximally efficient.\n // With tools: penalize excessive LLM iterations relative to tool calls.\n const score =\n summary.toolCalls === 0\n ? 1.0\n : summary.llmCalls > 0\n ? Math.min(1, summary.toolCalls / summary.llmCalls)\n : 1.0;\n return makeEvalResult({\n ...fromSummary(summary),\n evalType: \"automated\",\n criteria: \"step_efficiency\",\n score,\n metadata: { llmCalls: summary.llmCalls, toolCalls: summary.toolCalls },\n });\n}\n\nfunction scoreLatency(summary: TraceSummary): EvalResult {\n const expectedMs = Math.max(\n LATENCY_BASELINE_PER_TOOL_MS,\n summary.toolCalls * LATENCY_BASELINE_PER_TOOL_MS,\n );\n const score = Math.max(0, 1 - summary.totalDurationMs / expectedMs);\n return makeEvalResult({\n ...fromSummary(summary),\n evalType: \"automated\",\n criteria: \"latency_score\",\n score,\n metadata: { actualMs: summary.totalDurationMs, expectedMs },\n });\n}\n\nfunction scoreCostEfficiency(summary: TraceSummary): EvalResult {\n const expectedCx100 = Math.max(\n COST_BASELINE_PER_TOOL_CX100,\n summary.toolCalls * COST_BASELINE_PER_TOOL_CX100,\n );\n const score = Math.max(0, 1 - summary.totalCostCentsX100 / expectedCx100);\n return makeEvalResult({\n ...fromSummary(summary),\n evalType: \"automated\",\n criteria: \"cost_efficiency\",\n score,\n metadata: { actualCx100: summary.totalCostCentsX100, expectedCx100 },\n });\n}\n\nfunction scoreErrorRecovery(\n summary: TraceSummary,\n runStatus: string,\n): EvalResult {\n const hadErrors = summary.failedTools > 0;\n let score: number;\n if (!hadErrors) {\n score = 1.0;\n } else if (runStatus === \"completed\") {\n score = 1.0;\n } else {\n score = 0;\n }\n return makeEvalResult({\n ...fromSummary(summary),\n evalType: \"automated\",\n criteria: \"error_recovery\",\n score,\n metadata: { hadErrors, runStatus },\n });\n}\n\nexport async function runAutomatedEvals(runId: string): Promise<EvalResult[]> {\n const [summary, run] = await Promise.all([\n getTraceSummary(runId),\n getRunById(runId),\n ]);\n\n if (!summary) return [];\n\n const runStatus = run?.status ?? \"unknown\";\n const results = [\n scoreToolSuccessRate(summary),\n scoreStepEfficiency(summary),\n scoreLatency(summary),\n scoreCostEfficiency(summary),\n scoreErrorRecovery(summary, runStatus),\n ];\n\n for (const result of results) {\n insertEvalResult(result).catch(() => {});\n }\n\n return results;\n}\n\n// ─── Layer 2: LLM-as-Judge ───────────────────────────────────────────\n\nfunction buildConversationTranscript(\n events: Array<{ seq: number; eventData: string }>,\n): string {\n const lines: string[] = [];\n for (const { eventData } of events) {\n try {\n const event = JSON.parse(eventData);\n if (event.type === \"user-message\") {\n lines.push(`[User]: ${event.text ?? JSON.stringify(event.content)}`);\n } else if (event.type === \"text-delta\" || event.type === \"text\") {\n lines.push(`[Agent]: ${event.text}`);\n } else if (event.type === \"tool_start\") {\n lines.push(`[Tool Call: ${event.tool}] ${JSON.stringify(event.input)}`);\n } else if (event.type === \"tool_done\") {\n const snippet =\n typeof event.result === \"string\"\n ? event.result.slice(0, 500)\n : JSON.stringify(event.result).slice(0, 500);\n lines.push(`[Tool Result]: ${snippet}`);\n }\n } catch {\n // Skip unparseable events\n }\n }\n return lines.join(\"\\n\");\n}\n\nfunction buildJudgePrompt(transcript: string, criteria: EvalCriteria): string {\n let prompt = `You are an expert evaluator. Assess the following agent conversation against the given criteria.\n\n## Criteria\nName: ${criteria.name}\nDescription: ${criteria.description}`;\n\n if (criteria.rubric) {\n prompt += `\\nRubric: ${criteria.rubric}`;\n }\n\n const min = criteria.scoreRange?.min ?? 0;\n const max = criteria.scoreRange?.max ?? 1;\n\n prompt += `\n\n## Conversation Transcript\n${transcript}\n\n## Instructions\nEvaluate the conversation and respond with ONLY a JSON object (no markdown, no explanation outside the JSON):\n{\"score\": <number between ${min} and ${max}>, \"reasoning\": \"<brief explanation>\"}`;\n\n return prompt;\n}\n\nexport async function runLlmJudgeEval(\n runId: string,\n criteria: EvalCriteria,\n opts?: { engine?: AgentEngine; model?: string; userId?: string | null },\n): Promise<EvalResult | null> {\n try {\n const [events, run] = await Promise.all([\n getRunEventsSince(runId, 0),\n getRunById(runId),\n ]);\n\n if (events.length === 0) return null;\n\n const transcript = buildConversationTranscript(events);\n if (!transcript.trim()) return null;\n\n const engine =\n opts?.engine ?? (await resolveEngine({ engineOption: undefined }));\n const modelCandidate =\n opts?.model ??\n (await getStoredModelForEngine(engine)) ??\n engine.defaultModel;\n const model = normalizeModelForEngine(engine, modelCandidate);\n\n const judgePrompt = buildJudgePrompt(transcript, criteria);\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), LLM_JUDGE_TIMEOUT_MS);\n\n let responseText = \"\";\n try {\n const stream = engine.stream({\n model,\n systemPrompt:\n \"You are an evaluation judge. Respond only with valid JSON.\",\n messages: [\n { role: \"user\", content: [{ type: \"text\", text: judgePrompt }] },\n ],\n tools: [],\n abortSignal: controller.signal,\n maxOutputTokens: 512,\n temperature: 0,\n });\n\n for await (const event of stream) {\n if (event.type === \"text-delta\") {\n responseText += event.text;\n }\n }\n } finally {\n clearTimeout(timeout);\n }\n\n const jsonMatch = responseText.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) return null;\n\n const parsed = JSON.parse(jsonMatch[0]) as {\n score: number;\n reasoning: string;\n };\n\n const min = criteria.scoreRange?.min ?? 0;\n const max = criteria.scoreRange?.max ?? 1;\n const normalizedScore =\n max > min ? (parsed.score - min) / (max - min) : parsed.score;\n\n const result = makeEvalResult({\n runId,\n threadId: run?.threadId ?? null,\n userId: opts?.userId ?? null,\n evalType: \"llm_judge\",\n criteria: criteria.name,\n score: normalizedScore,\n reasoning: parsed.reasoning,\n metadata: { model, rawScore: parsed.score, scoreRange: { min, max } },\n });\n\n insertEvalResult(result).catch(() => {});\n return result;\n } catch {\n return null;\n }\n}\n\n// ─── Layer 3: Dataset evaluation ─────────────────────────────────────\n\nexport async function runDatasetEval(\n datasetId: string,\n opts?: { criteria?: EvalCriteria[]; engine?: AgentEngine; model?: string },\n): Promise<{\n datasetId: string;\n totalCases: number;\n avgScore: number;\n results: EvalResult[];\n}> {\n const dataset = await getEvalDataset(datasetId);\n if (!dataset) {\n return { datasetId, totalCases: 0, avgScore: 0, results: [] };\n }\n\n const engine =\n opts?.engine ?? (await resolveEngine({ engineOption: undefined }));\n const modelCandidate =\n opts?.model ??\n (await getStoredModelForEngine(engine)) ??\n engine.defaultModel;\n const model = normalizeModelForEngine(engine, modelCandidate);\n\n const criteria = opts?.criteria ?? [\n {\n name: \"response_quality\",\n description:\n \"How well the agent's response addresses the user's input, considering accuracy, completeness, and helpfulness.\",\n },\n ];\n\n const allResults: EvalResult[] = [];\n\n for (const testCase of dataset.entries) {\n const transcript = buildTestCaseTranscript(testCase, engine, model);\n\n for (const c of criteria) {\n const result = await evaluateTestCase(\n datasetId,\n testCase,\n transcript,\n c,\n engine,\n model,\n );\n if (result) allResults.push(result);\n }\n }\n\n const avgScore =\n allResults.length > 0\n ? allResults.reduce((sum, r) => sum + r.score, 0) / allResults.length\n : 0;\n\n return {\n datasetId,\n totalCases: dataset.entries.length,\n avgScore,\n results: allResults,\n };\n}\n\nfunction buildTestCaseTranscript(\n testCase: EvalTestCase,\n _engine: AgentEngine,\n _model: string,\n): string {\n let transcript = `[User]: ${testCase.input}`;\n if (testCase.expectedOutput) {\n transcript += `\\n[Expected Output]: ${testCase.expectedOutput}`;\n }\n if (testCase.context) {\n transcript += `\\n[Context]: ${JSON.stringify(testCase.context)}`;\n }\n return transcript;\n}\n\nasync function evaluateTestCase(\n datasetId: string,\n testCase: EvalTestCase,\n transcript: string,\n criteria: EvalCriteria,\n engine: AgentEngine,\n model: string,\n): Promise<EvalResult | null> {\n try {\n const judgePrompt = buildJudgePrompt(transcript, criteria);\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), LLM_JUDGE_TIMEOUT_MS);\n\n let responseText = \"\";\n try {\n const stream = engine.stream({\n model,\n systemPrompt:\n \"You are an evaluation judge. Respond only with valid JSON.\",\n messages: [\n { role: \"user\", content: [{ type: \"text\", text: judgePrompt }] },\n ],\n tools: [],\n abortSignal: controller.signal,\n maxOutputTokens: 512,\n temperature: 0,\n });\n\n for await (const event of stream) {\n if (event.type === \"text-delta\") {\n responseText += event.text;\n }\n }\n } finally {\n clearTimeout(timeout);\n }\n\n const jsonMatch = responseText.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) return null;\n\n const parsed = JSON.parse(jsonMatch[0]) as {\n score: number;\n reasoning: string;\n };\n\n const min = criteria.scoreRange?.min ?? 0;\n const max = criteria.scoreRange?.max ?? 1;\n const normalizedScore =\n max > min ? (parsed.score - min) / (max - min) : parsed.score;\n\n // Dataset evals use a synthetic runId since there's no real run\n const syntheticRunId = `dataset:${datasetId}:${crypto.randomUUID()}`;\n\n // Dataset evals are administrative — there's no per-user runId, so\n // we leave userId null. Per-user reads filter null rows out, which\n // is the right default; admins can fetch dataset evals via the\n // unfiltered call path.\n const result = makeEvalResult({\n runId: syntheticRunId,\n threadId: null,\n userId: null,\n evalType: \"llm_judge\",\n criteria: criteria.name,\n score: normalizedScore,\n reasoning: parsed.reasoning,\n metadata: {\n datasetId,\n model,\n testCaseInput: testCase.input,\n expectedOutput: testCase.expectedOutput ?? null,\n tags: testCase.tags ?? [],\n rawScore: parsed.score,\n scoreRange: { min, max },\n },\n });\n\n insertEvalResult(result).catch(() => {});\n return result;\n } catch {\n return null;\n }\n}\n\n// ─── Orchestrator ────────────────────────────────────────────────────\n\nexport async function evaluateRun(\n runId: string,\n opts?: { sampleRate?: number },\n): Promise<EvalResult[]> {\n const results = await runAutomatedEvals(runId);\n const userId = results[0]?.userId ?? null;\n\n const sampleRate = opts?.sampleRate ?? 0;\n if (sampleRate > 0 && Math.random() < sampleRate) {\n const defaultCriteria: EvalCriteria[] = [\n {\n name: \"overall_quality\",\n description:\n \"Overall quality of the agent's response, considering helpfulness, accuracy, and appropriate tool usage.\",\n },\n {\n name: \"task_completion\",\n description:\n \"Whether the agent successfully completed the user's requested task.\",\n },\n ];\n\n const judgeResults = await Promise.all(\n defaultCriteria.map((c) => runLlmJudgeEval(runId, c, { userId })),\n );\n\n for (const r of judgeResults) {\n if (r) results.push(r);\n }\n }\n\n return results;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"list-agent-engines.d.ts","sourceRoot":"","sources":["../../../src/scripts/agent-engines/list-agent-engines.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAcvD,eAAO,MAAM,IAAI,EAAE,UAQlB,CAAC;AAEF,wBAAsB,GAAG,CAAC,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyE5E"}
1
+ {"version":3,"file":"list-agent-engines.d.ts","sourceRoot":"","sources":["../../../src/scripts/agent-engines/list-agent-engines.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAevD,eAAO,MAAM,IAAI,EAAE,UAQlB,CAAC;AAEF,wBAAsB,GAAG,CAAC,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgF5E"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * list-agent-engines — returns the registered engine registry and current selection.
3
3
  */
4
- import { listAgentEngines, registerBuiltinEngines, detectEngineFromEnv, detectEngineFromUserSecrets, getAgentEngineEntry, isAgentEnginePackageInstalled, isStoredEngineUsableForRequest, } from "../../agent/engine/index.js";
4
+ import { listAgentEngines, registerBuiltinEngines, detectEngineFromEnv, detectEngineFromUserSecrets, getAgentEngineEntry, isAgentEnginePackageInstalled, isStoredEngineUsableForRequest, normalizeModelForEngine, } from "../../agent/engine/index.js";
5
5
  import { DEFAULT_MODEL } from "../../agent/default-model.js";
6
6
  import { getAgentAppModelDefaultForCurrentRequest } from "../../agent/app-model-defaults.js";
7
7
  import { getSetting } from "../../settings/index.js";
@@ -50,12 +50,15 @@ export async function run(args = {}) {
50
50
  detectedFromUser ??
51
51
  detectEngineFromEnv() ??
52
52
  undefined);
53
- const currentModel = appDefaultUsable && currentEntry?.name === appDefault?.engine
53
+ const currentModelCandidate = appDefaultUsable && currentEntry?.name === appDefault?.engine
54
54
  ? appDefault?.model
55
55
  : storedUsable && currentEntry?.name === current?.engine
56
56
  ? current?.model
57
57
  : undefined;
58
58
  const currentEngineName = currentEntry?.name ?? "anthropic";
59
+ const currentModel = currentEntry && !envUnavailable
60
+ ? normalizeModelForEngine(currentEntry, currentModelCandidate ?? currentEntry.defaultModel)
61
+ : (currentModelCandidate ?? DEFAULT_MODEL);
59
62
  const result = {
60
63
  engines: engines.map((e) => ({
61
64
  name: e.name,
@@ -72,7 +75,7 @@ export async function run(args = {}) {
72
75
  ? null
73
76
  : {
74
77
  engine: currentEngineName,
75
- model: currentModel ?? currentEntry?.defaultModel ?? DEFAULT_MODEL,
78
+ model: currentModel,
76
79
  },
77
80
  };
78
81
  return JSON.stringify(result, null, 2);
@@ -1 +1 @@
1
- {"version":3,"file":"list-agent-engines.js","sourceRoot":"","sources":["../../../src/scripts/agent-engines/list-agent-engines.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * list-agent-engines — returns the registered engine registry and current selection.\n */\n\nimport type { ActionTool } from \"../../agent/types.js\";\nimport {\n listAgentEngines,\n registerBuiltinEngines,\n detectEngineFromEnv,\n detectEngineFromUserSecrets,\n getAgentEngineEntry,\n isAgentEnginePackageInstalled,\n isStoredEngineUsableForRequest,\n} from \"../../agent/engine/index.js\";\nimport { DEFAULT_MODEL } from \"../../agent/default-model.js\";\nimport { getAgentAppModelDefaultForCurrentRequest } from \"../../agent/app-model-defaults.js\";\nimport { getSetting } from \"../../settings/index.js\";\n\nexport const tool: ActionTool = {\n description:\n 'List all available AI agent engines (Anthropic, OpenAI, Gemini, Groq, etc.) and the currently selected engine. Use this to check what engines are available before calling manage-agent-engine with action=\"set\".',\n parameters: {\n type: \"object\",\n properties: {},\n required: [],\n },\n};\n\nexport async function run(args: Record<string, string> = {}): Promise<string> {\n registerBuiltinEngines();\n\n const engines = listAgentEngines();\n const currentSetting = await getSetting(\"agent-engine\");\n const current = currentSetting\n ? (currentSetting as { engine?: string; model?: string })\n : null;\n\n // Same priority chain resolveEngine uses after explicit request options:\n // AGENT_ENGINE → app default → Builder app_secrets → stored (if usable)\n // → user BYOK app_secrets → env → anthropic. Gating stored/app defaults\n // on the request-aware helper keeps the picker in step with the runtime.\n const storedEntry =\n typeof current?.engine === \"string\"\n ? getAgentEngineEntry(current.engine)\n : undefined;\n const storedUsable =\n !!storedEntry &&\n (await isStoredEngineUsableForRequest(current, storedEntry));\n const appDefault = await getAgentAppModelDefaultForCurrentRequest(args.appId);\n const appDefaultEntry =\n typeof appDefault?.engine === \"string\"\n ? getAgentEngineEntry(appDefault.engine)\n : undefined;\n const appDefaultUsable =\n !!appDefault &&\n !!appDefaultEntry &&\n (await isStoredEngineUsableForRequest(appDefault, appDefaultEntry));\n const detectedFromUser = await detectEngineFromUserSecrets();\n const envEntry = process.env.AGENT_ENGINE\n ? getAgentEngineEntry(process.env.AGENT_ENGINE)\n : undefined;\n const envUnavailable = !!envEntry && !isAgentEnginePackageInstalled(envEntry);\n\n const currentEntry = envUnavailable\n ? undefined\n : (envEntry ??\n (appDefaultUsable ? appDefaultEntry : undefined) ??\n (detectedFromUser?.name === \"builder\" ? detectedFromUser : undefined) ??\n (storedUsable ? storedEntry : undefined) ??\n detectedFromUser ??\n detectEngineFromEnv() ??\n undefined);\n const currentModel =\n appDefaultUsable && currentEntry?.name === appDefault?.engine\n ? appDefault?.model\n : storedUsable && currentEntry?.name === current?.engine\n ? current?.model\n : undefined;\n const currentEngineName = currentEntry?.name ?? \"anthropic\";\n\n const result = {\n engines: engines.map((e) => ({\n name: e.name,\n label: e.label,\n description: e.description,\n defaultModel: e.defaultModel,\n supportedModels: e.supportedModels,\n capabilities: e.capabilities,\n requiredEnvVars: e.requiredEnvVars,\n installPackage: e.installPackage,\n packageInstalled: isAgentEnginePackageInstalled(e),\n })),\n current: envUnavailable\n ? null\n : {\n engine: currentEngineName,\n model: currentModel ?? currentEntry?.defaultModel ?? DEFAULT_MODEL,\n },\n };\n\n return JSON.stringify(result, null, 2);\n}\n"]}
1
+ {"version":3,"file":"list-agent-engines.js","sourceRoot":"","sources":["../../../src/scripts/agent-engines/list-agent-engines.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * list-agent-engines — returns the registered engine registry and current selection.\n */\n\nimport type { ActionTool } from \"../../agent/types.js\";\nimport {\n listAgentEngines,\n registerBuiltinEngines,\n detectEngineFromEnv,\n detectEngineFromUserSecrets,\n getAgentEngineEntry,\n isAgentEnginePackageInstalled,\n isStoredEngineUsableForRequest,\n normalizeModelForEngine,\n} from \"../../agent/engine/index.js\";\nimport { DEFAULT_MODEL } from \"../../agent/default-model.js\";\nimport { getAgentAppModelDefaultForCurrentRequest } from \"../../agent/app-model-defaults.js\";\nimport { getSetting } from \"../../settings/index.js\";\n\nexport const tool: ActionTool = {\n description:\n 'List all available AI agent engines (Anthropic, OpenAI, Gemini, Groq, etc.) and the currently selected engine. Use this to check what engines are available before calling manage-agent-engine with action=\"set\".',\n parameters: {\n type: \"object\",\n properties: {},\n required: [],\n },\n};\n\nexport async function run(args: Record<string, string> = {}): Promise<string> {\n registerBuiltinEngines();\n\n const engines = listAgentEngines();\n const currentSetting = await getSetting(\"agent-engine\");\n const current = currentSetting\n ? (currentSetting as { engine?: string; model?: string })\n : null;\n\n // Same priority chain resolveEngine uses after explicit request options:\n // AGENT_ENGINE → app default → Builder app_secrets → stored (if usable)\n // → user BYOK app_secrets → env → anthropic. Gating stored/app defaults\n // on the request-aware helper keeps the picker in step with the runtime.\n const storedEntry =\n typeof current?.engine === \"string\"\n ? getAgentEngineEntry(current.engine)\n : undefined;\n const storedUsable =\n !!storedEntry &&\n (await isStoredEngineUsableForRequest(current, storedEntry));\n const appDefault = await getAgentAppModelDefaultForCurrentRequest(args.appId);\n const appDefaultEntry =\n typeof appDefault?.engine === \"string\"\n ? getAgentEngineEntry(appDefault.engine)\n : undefined;\n const appDefaultUsable =\n !!appDefault &&\n !!appDefaultEntry &&\n (await isStoredEngineUsableForRequest(appDefault, appDefaultEntry));\n const detectedFromUser = await detectEngineFromUserSecrets();\n const envEntry = process.env.AGENT_ENGINE\n ? getAgentEngineEntry(process.env.AGENT_ENGINE)\n : undefined;\n const envUnavailable = !!envEntry && !isAgentEnginePackageInstalled(envEntry);\n\n const currentEntry = envUnavailable\n ? undefined\n : (envEntry ??\n (appDefaultUsable ? appDefaultEntry : undefined) ??\n (detectedFromUser?.name === \"builder\" ? detectedFromUser : undefined) ??\n (storedUsable ? storedEntry : undefined) ??\n detectedFromUser ??\n detectEngineFromEnv() ??\n undefined);\n const currentModelCandidate =\n appDefaultUsable && currentEntry?.name === appDefault?.engine\n ? appDefault?.model\n : storedUsable && currentEntry?.name === current?.engine\n ? current?.model\n : undefined;\n const currentEngineName = currentEntry?.name ?? \"anthropic\";\n const currentModel =\n currentEntry && !envUnavailable\n ? normalizeModelForEngine(\n currentEntry,\n currentModelCandidate ?? currentEntry.defaultModel,\n )\n : (currentModelCandidate ?? DEFAULT_MODEL);\n\n const result = {\n engines: engines.map((e) => ({\n name: e.name,\n label: e.label,\n description: e.description,\n defaultModel: e.defaultModel,\n supportedModels: e.supportedModels,\n capabilities: e.capabilities,\n requiredEnvVars: e.requiredEnvVars,\n installPackage: e.installPackage,\n packageInstalled: isAgentEnginePackageInstalled(e),\n })),\n current: envUnavailable\n ? null\n : {\n engine: currentEngineName,\n model: currentModel,\n },\n };\n\n return JSON.stringify(result, null, 2);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"manage-agent-engine.d.ts","sourceRoot":"","sources":["../../../src/scripts/agent-engines/manage-agent-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAqBvD,eAAO,MAAM,IAAI,EAAE,UAqClB,CAAC;AAmGF,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBvE"}
1
+ {"version":3,"file":"manage-agent-engine.d.ts","sourceRoot":"","sources":["../../../src/scripts/agent-engines/manage-agent-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAsBvD,eAAO,MAAM,IAAI,EAAE,UAqClB,CAAC;AAyGF,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBvE"}
@@ -8,7 +8,7 @@ import { run as runList } from "./list-agent-engines.js";
8
8
  import { run as runSet } from "./set-agent-engine.js";
9
9
  import { run as runTest } from "./test-agent-engine.js";
10
10
  import { canUpdateAgentAppModelDefaultSettings, normalizeAgentAppModelDefaultAppId, readAgentAppModelDefaultSettings, resetAgentAppModelDefaultSettings, writeAgentAppModelDefaultSettings, } from "../../agent/app-model-defaults.js";
11
- import { getAgentEngineEntry, isAgentEnginePackageInstalled, registerBuiltinEngines, } from "../../agent/engine/index.js";
11
+ import { getAgentEngineEntry, isAgentEnginePackageInstalled, normalizeModelForEngine, registerBuiltinEngines, } from "../../agent/engine/index.js";
12
12
  import { getRequestOrgId, getRequestUserEmail, } from "../../server/request-context.js";
13
13
  export const tool = {
14
14
  description: 'Manage AI agent engines: list available engines, set the active global engine/model, test an engine, or manage the current app/template default model. Pass action="list" to see options, action="set" to change the global default, action="test" to verify connectivity, action="get-app-default" to inspect this app default, action="set-app-default" to set this app default, or action="reset-app-default" to clear it.',
@@ -83,6 +83,10 @@ async function runSetAppDefault(args) {
83
83
  if (!isAgentEnginePackageInstalled(entry)) {
84
84
  return `Error: Engine "${engine}" requires optional packages that are not installed in this app. Run: pnpm add ${entry.installPackage}`;
85
85
  }
86
+ if (entry.name === "builder" &&
87
+ normalizeModelForEngine(entry, model) !== model) {
88
+ return `Error: Model "${model}" is not supported by Builder. Choose one of: ${entry.supportedModels.join(", ")}`;
89
+ }
86
90
  const ctx = currentContext();
87
91
  const canUpdate = await canUpdateAgentAppModelDefaultSettings(ctx.userEmail, ctx.orgId);
88
92
  if (!canUpdate) {
@@ -1 +1 @@
1
- {"version":3,"file":"manage-agent-engine.js","sourceRoot":"","sources":["../../../src/scripts/agent-engines/manage-agent-engine.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * manage-agent-engine — unified tool for listing, setting, and testing agent engines.\n *\n * Consolidates the former list-agent-engines, set-agent-engine, and test-agent-engine\n * tools into a single tool with an `action` discriminator.\n */\n\nimport type { ActionTool } from \"../../agent/types.js\";\nimport { run as runList } from \"./list-agent-engines.js\";\nimport { run as runSet } from \"./set-agent-engine.js\";\nimport { run as runTest } from \"./test-agent-engine.js\";\nimport {\n canUpdateAgentAppModelDefaultSettings,\n normalizeAgentAppModelDefaultAppId,\n readAgentAppModelDefaultSettings,\n resetAgentAppModelDefaultSettings,\n writeAgentAppModelDefaultSettings,\n} from \"../../agent/app-model-defaults.js\";\nimport {\n getAgentEngineEntry,\n isAgentEnginePackageInstalled,\n registerBuiltinEngines,\n} from \"../../agent/engine/index.js\";\nimport {\n getRequestOrgId,\n getRequestUserEmail,\n} from \"../../server/request-context.js\";\n\nexport const tool: ActionTool = {\n description:\n 'Manage AI agent engines: list available engines, set the active global engine/model, test an engine, or manage the current app/template default model. Pass action=\"list\" to see options, action=\"set\" to change the global default, action=\"test\" to verify connectivity, action=\"get-app-default\" to inspect this app default, action=\"set-app-default\" to set this app default, or action=\"reset-app-default\" to clear it.',\n parameters: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\n \"list\",\n \"set\",\n \"test\",\n \"get-app-default\",\n \"set-app-default\",\n \"reset-app-default\",\n ],\n description:\n '\"list\" — show available engines and current global selection. \"set\" — change the active global engine/model. \"test\" — send a trivial prompt to verify connectivity. \"get-app-default\" — show this app/template default. \"set-app-default\" — set this app/template default. \"reset-app-default\" — clear this app/template default.',\n },\n engine: {\n type: \"string\",\n description:\n 'Engine name (e.g. \"builder\", \"anthropic\", \"ai-sdk:openai\", \"ai-sdk:google\"). Required for \"set\" and \"set-app-default\", optional for \"test\" (defaults to \"anthropic\").',\n },\n model: {\n type: \"string\",\n description:\n \"Model ID (e.g. 'gpt-5.5', 'claude-sonnet-4-6', 'gemini-3-1-pro'). Required for \\\"set-app-default\\\"; optional for \\\"set\\\" and \\\"test\\\" where it defaults to the engine's default model.\",\n },\n appId: {\n type: \"string\",\n description:\n \"App/template id whose default model should be managed. Defaults to the current app.\",\n },\n },\n required: [\"action\"],\n },\n};\n\nfunction currentContext(): { userEmail?: string; orgId?: string | null } {\n try {\n return {\n userEmail: getRequestUserEmail(),\n orgId: getRequestOrgId(),\n };\n } catch {\n return {};\n }\n}\n\nfunction resolveAppId(args: Record<string, string>): string | null {\n return normalizeAgentAppModelDefaultAppId(args.appId);\n}\n\nasync function runGetAppDefault(args: Record<string, string>): Promise<string> {\n const appId = resolveAppId(args);\n if (!appId) return \"Error: appId is required\";\n const ctx = currentContext();\n const settings = await readAgentAppModelDefaultSettings(ctx, appId);\n const canUpdate = await canUpdateAgentAppModelDefaultSettings(\n ctx.userEmail,\n ctx.orgId,\n );\n return JSON.stringify({ ok: true, ...settings, canUpdate }, null, 2);\n}\n\nasync function runSetAppDefault(args: Record<string, string>): Promise<string> {\n registerBuiltinEngines();\n const appId = resolveAppId(args);\n if (!appId) return \"Error: appId is required\";\n\n const engine = args.engine?.trim();\n const model = args.model?.trim();\n if (!engine) return \"Error: engine is required\";\n if (!model) return \"Error: model is required\";\n\n const entry = getAgentEngineEntry(engine);\n if (!entry) return `Error: Unknown engine \"${engine}\"`;\n if (!isAgentEnginePackageInstalled(entry)) {\n return `Error: Engine \"${engine}\" requires optional packages that are not installed in this app. Run: pnpm add ${entry.installPackage}`;\n }\n\n const ctx = currentContext();\n const canUpdate = await canUpdateAgentAppModelDefaultSettings(\n ctx.userEmail,\n ctx.orgId,\n );\n if (!canUpdate) {\n return ctx.orgId\n ? \"Error: Only organization owners and admins can change app model defaults.\"\n : \"Error: Authentication required to change app model defaults.\";\n }\n\n const settings = await writeAgentAppModelDefaultSettings(ctx, appId, {\n engine,\n model,\n updatedBy: ctx.userEmail,\n });\n return JSON.stringify(\n {\n ok: true,\n ...settings,\n message: `Default model for ${appId} set to ${model} via ${entry.label}.`,\n },\n null,\n 2,\n );\n}\n\nasync function runResetAppDefault(\n args: Record<string, string>,\n): Promise<string> {\n const appId = resolveAppId(args);\n if (!appId) return \"Error: appId is required\";\n const ctx = currentContext();\n const canUpdate = await canUpdateAgentAppModelDefaultSettings(\n ctx.userEmail,\n ctx.orgId,\n );\n if (!canUpdate) {\n return ctx.orgId\n ? \"Error: Only organization owners and admins can reset app model defaults.\"\n : \"Error: Authentication required to reset app model defaults.\";\n }\n const settings = await resetAgentAppModelDefaultSettings(ctx, appId);\n return JSON.stringify(\n {\n ok: true,\n ...settings,\n message: `Default model for ${appId} reset to the global LLM default.`,\n },\n null,\n 2,\n );\n}\n\nexport async function run(args: Record<string, string>): Promise<string> {\n const { action } = args;\n\n switch (action) {\n case \"list\":\n return runList(args);\n case \"set\":\n return runSet(args);\n case \"test\":\n return runTest(args);\n case \"get-app-default\":\n return runGetAppDefault(args);\n case \"set-app-default\":\n return runSetAppDefault(args);\n case \"reset-app-default\":\n return runResetAppDefault(args);\n default:\n return JSON.stringify({\n error: `Unknown action \"${action}\". Must be one of: list, set, test, get-app-default, set-app-default, reset-app-default.`,\n });\n }\n}\n"]}
1
+ {"version":3,"file":"manage-agent-engine.js","sourceRoot":"","sources":["../../../src/scripts/agent-engines/manage-agent-engine.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * manage-agent-engine — unified tool for listing, setting, and testing agent engines.\n *\n * Consolidates the former list-agent-engines, set-agent-engine, and test-agent-engine\n * tools into a single tool with an `action` discriminator.\n */\n\nimport type { ActionTool } from \"../../agent/types.js\";\nimport { run as runList } from \"./list-agent-engines.js\";\nimport { run as runSet } from \"./set-agent-engine.js\";\nimport { run as runTest } from \"./test-agent-engine.js\";\nimport {\n canUpdateAgentAppModelDefaultSettings,\n normalizeAgentAppModelDefaultAppId,\n readAgentAppModelDefaultSettings,\n resetAgentAppModelDefaultSettings,\n writeAgentAppModelDefaultSettings,\n} from \"../../agent/app-model-defaults.js\";\nimport {\n getAgentEngineEntry,\n isAgentEnginePackageInstalled,\n normalizeModelForEngine,\n registerBuiltinEngines,\n} from \"../../agent/engine/index.js\";\nimport {\n getRequestOrgId,\n getRequestUserEmail,\n} from \"../../server/request-context.js\";\n\nexport const tool: ActionTool = {\n description:\n 'Manage AI agent engines: list available engines, set the active global engine/model, test an engine, or manage the current app/template default model. Pass action=\"list\" to see options, action=\"set\" to change the global default, action=\"test\" to verify connectivity, action=\"get-app-default\" to inspect this app default, action=\"set-app-default\" to set this app default, or action=\"reset-app-default\" to clear it.',\n parameters: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\n \"list\",\n \"set\",\n \"test\",\n \"get-app-default\",\n \"set-app-default\",\n \"reset-app-default\",\n ],\n description:\n '\"list\" — show available engines and current global selection. \"set\" — change the active global engine/model. \"test\" — send a trivial prompt to verify connectivity. \"get-app-default\" — show this app/template default. \"set-app-default\" — set this app/template default. \"reset-app-default\" — clear this app/template default.',\n },\n engine: {\n type: \"string\",\n description:\n 'Engine name (e.g. \"builder\", \"anthropic\", \"ai-sdk:openai\", \"ai-sdk:google\"). Required for \"set\" and \"set-app-default\", optional for \"test\" (defaults to \"anthropic\").',\n },\n model: {\n type: \"string\",\n description:\n \"Model ID (e.g. 'gpt-5.5', 'claude-sonnet-4-6', 'gemini-3-1-pro'). Required for \\\"set-app-default\\\"; optional for \\\"set\\\" and \\\"test\\\" where it defaults to the engine's default model.\",\n },\n appId: {\n type: \"string\",\n description:\n \"App/template id whose default model should be managed. Defaults to the current app.\",\n },\n },\n required: [\"action\"],\n },\n};\n\nfunction currentContext(): { userEmail?: string; orgId?: string | null } {\n try {\n return {\n userEmail: getRequestUserEmail(),\n orgId: getRequestOrgId(),\n };\n } catch {\n return {};\n }\n}\n\nfunction resolveAppId(args: Record<string, string>): string | null {\n return normalizeAgentAppModelDefaultAppId(args.appId);\n}\n\nasync function runGetAppDefault(args: Record<string, string>): Promise<string> {\n const appId = resolveAppId(args);\n if (!appId) return \"Error: appId is required\";\n const ctx = currentContext();\n const settings = await readAgentAppModelDefaultSettings(ctx, appId);\n const canUpdate = await canUpdateAgentAppModelDefaultSettings(\n ctx.userEmail,\n ctx.orgId,\n );\n return JSON.stringify({ ok: true, ...settings, canUpdate }, null, 2);\n}\n\nasync function runSetAppDefault(args: Record<string, string>): Promise<string> {\n registerBuiltinEngines();\n const appId = resolveAppId(args);\n if (!appId) return \"Error: appId is required\";\n\n const engine = args.engine?.trim();\n const model = args.model?.trim();\n if (!engine) return \"Error: engine is required\";\n if (!model) return \"Error: model is required\";\n\n const entry = getAgentEngineEntry(engine);\n if (!entry) return `Error: Unknown engine \"${engine}\"`;\n if (!isAgentEnginePackageInstalled(entry)) {\n return `Error: Engine \"${engine}\" requires optional packages that are not installed in this app. Run: pnpm add ${entry.installPackage}`;\n }\n if (\n entry.name === \"builder\" &&\n normalizeModelForEngine(entry, model) !== model\n ) {\n return `Error: Model \"${model}\" is not supported by Builder. Choose one of: ${entry.supportedModels.join(\", \")}`;\n }\n\n const ctx = currentContext();\n const canUpdate = await canUpdateAgentAppModelDefaultSettings(\n ctx.userEmail,\n ctx.orgId,\n );\n if (!canUpdate) {\n return ctx.orgId\n ? \"Error: Only organization owners and admins can change app model defaults.\"\n : \"Error: Authentication required to change app model defaults.\";\n }\n\n const settings = await writeAgentAppModelDefaultSettings(ctx, appId, {\n engine,\n model,\n updatedBy: ctx.userEmail,\n });\n return JSON.stringify(\n {\n ok: true,\n ...settings,\n message: `Default model for ${appId} set to ${model} via ${entry.label}.`,\n },\n null,\n 2,\n );\n}\n\nasync function runResetAppDefault(\n args: Record<string, string>,\n): Promise<string> {\n const appId = resolveAppId(args);\n if (!appId) return \"Error: appId is required\";\n const ctx = currentContext();\n const canUpdate = await canUpdateAgentAppModelDefaultSettings(\n ctx.userEmail,\n ctx.orgId,\n );\n if (!canUpdate) {\n return ctx.orgId\n ? \"Error: Only organization owners and admins can reset app model defaults.\"\n : \"Error: Authentication required to reset app model defaults.\";\n }\n const settings = await resetAgentAppModelDefaultSettings(ctx, appId);\n return JSON.stringify(\n {\n ok: true,\n ...settings,\n message: `Default model for ${appId} reset to the global LLM default.`,\n },\n null,\n 2,\n );\n}\n\nexport async function run(args: Record<string, string>): Promise<string> {\n const { action } = args;\n\n switch (action) {\n case \"list\":\n return runList(args);\n case \"set\":\n return runSet(args);\n case \"test\":\n return runTest(args);\n case \"get-app-default\":\n return runGetAppDefault(args);\n case \"set-app-default\":\n return runSetAppDefault(args);\n case \"reset-app-default\":\n return runResetAppDefault(args);\n default:\n return JSON.stringify({\n error: `Unknown action \"${action}\". Must be one of: list, set, test, get-app-default, set-app-default, reset-app-default.`,\n });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"set-agent-engine.d.ts","sourceRoot":"","sources":["../../../src/scripts/agent-engines/set-agent-engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AASvD,eAAO,MAAM,IAAI,EAAE,UAmBlB,CAAC;AAEF,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA+CvE"}
1
+ {"version":3,"file":"set-agent-engine.d.ts","sourceRoot":"","sources":["../../../src/scripts/agent-engines/set-agent-engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAUvD,eAAO,MAAM,IAAI,EAAE,UAmBlB,CAAC;AAEF,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAsDvE"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * set-agent-engine — validates and writes agent engine selection to settings.
3
3
  */
4
- import { listAgentEngines, getAgentEngineEntry, isAgentEnginePackageInstalled, registerBuiltinEngines, } from "../../agent/engine/index.js";
4
+ import { listAgentEngines, getAgentEngineEntry, isAgentEnginePackageInstalled, normalizeModelForEngine, registerBuiltinEngines, } from "../../agent/engine/index.js";
5
5
  import { putSetting } from "../../settings/index.js";
6
6
  export const tool = {
7
7
  description: 'Set the active AI agent engine and model. Changes take effect on the next conversation. Use manage-agent-engine with action="list" first to see available options.',
@@ -36,8 +36,13 @@ export async function run(args) {
36
36
  return `Error: Engine "${engineName}" requires optional packages that are not installed in this app. Run: pnpm add ${entry.installPackage}`;
37
37
  }
38
38
  const resolvedModel = model ?? entry.defaultModel;
39
+ if (entry.name === "builder" &&
40
+ normalizeModelForEngine(entry, resolvedModel) !== resolvedModel) {
41
+ return `Error: Model "${resolvedModel}" is not supported by Builder. Choose one of: ${entry.supportedModels.join(", ")}`;
42
+ }
39
43
  // supportedModels is a suggestion list, not an allowlist — accept any
40
- // string (OpenRouter / Ollama / previews) and flag uncurated saves.
44
+ // string for BYO/custom engines (OpenRouter / Ollama / previews) and flag
45
+ // uncurated saves. Builder is an enumerated gateway and is checked above.
41
46
  const modelIsCurated = entry.supportedModels.length === 0 ||
42
47
  entry.supportedModels.includes(resolvedModel);
43
48
  const missingEnvVars = entry.requiredEnvVars.filter((v) => !process.env[v]);
@@ -1 +1 @@
1
- {"version":3,"file":"set-agent-engine.js","sourceRoot":"","sources":["../../../src/scripts/agent-engines/set-agent-engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,6BAA6B,EAC7B,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,CAAC,MAAM,IAAI,GAAe;IAC9B,WAAW,EACT,oKAAoK;IACtK,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,kIAAkI;aACrI;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,4HAA4H;aAC/H;SACF;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAA4B;IACpD,sBAAsB,EAAE,CAAC;IAEzB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAE3C,IAAI,CAAC,UAAU;QAAE,OAAO,6BAA6B,CAAC;IAEtD,MAAM,KAAK,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,gBAAgB,EAAE;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,kBAAkB,UAAU,mCAAmC,SAAS,EAAE,CAAC;IACpF,CAAC;IAED,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,kBAAkB,UAAU,kFAAkF,KAAK,CAAC,cAAc,EAAE,CAAC;IAC9I,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC;IAElD,sEAAsE;IACtE,oEAAoE;IACpE,MAAM,cAAc,GAClB,KAAK,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;QAClC,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAEhD,MAAM,cAAc,GAAG,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,oBAAoB,UAAU,qEAAqE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,iDAAiD,CAAC;IACvL,CAAC;IAED,MAAM,UAAU,CAAC,cAAc,EAAE;QAC/B,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,aAAa;KACrB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,cAAc;QAC/B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,YAAY,aAAa,mCAAmC,KAAK,CAAC,KAAK,sEAAsE,CAAC;IAElJ,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,uBAAuB,KAAK,CAAC,KAAK,eAAe,aAAa,2CAA2C,UAAU,EAAE;KAC/H,CAAC,CAAC;AACL,CAAC","sourcesContent":["/**\n * set-agent-engine — validates and writes agent engine selection to settings.\n */\n\nimport type { ActionTool } from \"../../agent/types.js\";\nimport {\n listAgentEngines,\n getAgentEngineEntry,\n isAgentEnginePackageInstalled,\n registerBuiltinEngines,\n} from \"../../agent/engine/index.js\";\nimport { putSetting } from \"../../settings/index.js\";\n\nexport const tool: ActionTool = {\n description:\n 'Set the active AI agent engine and model. Changes take effect on the next conversation. Use manage-agent-engine with action=\"list\" first to see available options.',\n parameters: {\n type: \"object\",\n properties: {\n engine: {\n type: \"string\",\n description:\n 'Engine name (e.g. \"anthropic\", \"ai-sdk:openai\", \"ai-sdk:google\"). Use manage-agent-engine with action=\"list\" to see all options.',\n },\n model: {\n type: \"string\",\n description:\n \"Model ID to use with this engine (e.g. 'gpt-5.5', 'claude-sonnet-4-6'). Defaults to the engine's default model if omitted.\",\n },\n },\n required: [\"engine\"],\n },\n};\n\nexport async function run(args: Record<string, string>): Promise<string> {\n registerBuiltinEngines();\n\n const { engine: engineName, model } = args;\n\n if (!engineName) return \"Error: --engine is required\";\n\n const entry = getAgentEngineEntry(engineName);\n if (!entry) {\n const available = listAgentEngines()\n .map((e) => e.name)\n .join(\", \");\n return `Error: Engine \"${engineName}\" not found. Available engines: ${available}`;\n }\n\n if (!isAgentEnginePackageInstalled(entry)) {\n return `Error: Engine \"${engineName}\" requires optional packages that are not installed in this app. Run: pnpm add ${entry.installPackage}`;\n }\n\n const resolvedModel = model ?? entry.defaultModel;\n\n // supportedModels is a suggestion list, not an allowlist — accept any\n // string (OpenRouter / Ollama / previews) and flag uncurated saves.\n const modelIsCurated =\n entry.supportedModels.length === 0 ||\n entry.supportedModels.includes(resolvedModel);\n\n const missingEnvVars = entry.requiredEnvVars.filter((v) => !process.env[v]);\n if (missingEnvVars.length > 0) {\n return `Warning: Engine \"${engineName}\" requires the following environment variables which are not set: ${missingEnvVars.join(\", \")}. The engine will fail at runtime without them.`;\n }\n\n await putSetting(\"agent-engine\", {\n engine: engineName,\n model: resolvedModel,\n });\n\n const customNote = modelIsCurated\n ? \"\"\n : ` (model \"${resolvedModel}\" isn't in the curated list for ${entry.label}; saved as a custom model — verify it's a real ID for this provider)`;\n\n return JSON.stringify({\n ok: true,\n engine: engineName,\n model: resolvedModel,\n message: `Agent engine set to ${entry.label} with model ${resolvedModel}. Takes effect on the next conversation.${customNote}`,\n });\n}\n"]}
1
+ {"version":3,"file":"set-agent-engine.js","sourceRoot":"","sources":["../../../src/scripts/agent-engines/set-agent-engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,6BAA6B,EAC7B,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,CAAC,MAAM,IAAI,GAAe;IAC9B,WAAW,EACT,oKAAoK;IACtK,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,kIAAkI;aACrI;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,4HAA4H;aAC/H;SACF;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAA4B;IACpD,sBAAsB,EAAE,CAAC;IAEzB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAE3C,IAAI,CAAC,UAAU;QAAE,OAAO,6BAA6B,CAAC;IAEtD,MAAM,KAAK,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,gBAAgB,EAAE;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,kBAAkB,UAAU,mCAAmC,SAAS,EAAE,CAAC;IACpF,CAAC;IAED,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,kBAAkB,UAAU,kFAAkF,KAAK,CAAC,cAAc,EAAE,CAAC;IAC9I,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC;IAClD,IACE,KAAK,CAAC,IAAI,KAAK,SAAS;QACxB,uBAAuB,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,aAAa,EAC/D,CAAC;QACD,OAAO,iBAAiB,aAAa,iDAAiD,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC3H,CAAC;IAED,sEAAsE;IACtE,0EAA0E;IAC1E,0EAA0E;IAC1E,MAAM,cAAc,GAClB,KAAK,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;QAClC,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAEhD,MAAM,cAAc,GAAG,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,oBAAoB,UAAU,qEAAqE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,iDAAiD,CAAC;IACvL,CAAC;IAED,MAAM,UAAU,CAAC,cAAc,EAAE;QAC/B,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,aAAa;KACrB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,cAAc;QAC/B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,YAAY,aAAa,mCAAmC,KAAK,CAAC,KAAK,sEAAsE,CAAC;IAElJ,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,uBAAuB,KAAK,CAAC,KAAK,eAAe,aAAa,2CAA2C,UAAU,EAAE;KAC/H,CAAC,CAAC;AACL,CAAC","sourcesContent":["/**\n * set-agent-engine — validates and writes agent engine selection to settings.\n */\n\nimport type { ActionTool } from \"../../agent/types.js\";\nimport {\n listAgentEngines,\n getAgentEngineEntry,\n isAgentEnginePackageInstalled,\n normalizeModelForEngine,\n registerBuiltinEngines,\n} from \"../../agent/engine/index.js\";\nimport { putSetting } from \"../../settings/index.js\";\n\nexport const tool: ActionTool = {\n description:\n 'Set the active AI agent engine and model. Changes take effect on the next conversation. Use manage-agent-engine with action=\"list\" first to see available options.',\n parameters: {\n type: \"object\",\n properties: {\n engine: {\n type: \"string\",\n description:\n 'Engine name (e.g. \"anthropic\", \"ai-sdk:openai\", \"ai-sdk:google\"). Use manage-agent-engine with action=\"list\" to see all options.',\n },\n model: {\n type: \"string\",\n description:\n \"Model ID to use with this engine (e.g. 'gpt-5.5', 'claude-sonnet-4-6'). Defaults to the engine's default model if omitted.\",\n },\n },\n required: [\"engine\"],\n },\n};\n\nexport async function run(args: Record<string, string>): Promise<string> {\n registerBuiltinEngines();\n\n const { engine: engineName, model } = args;\n\n if (!engineName) return \"Error: --engine is required\";\n\n const entry = getAgentEngineEntry(engineName);\n if (!entry) {\n const available = listAgentEngines()\n .map((e) => e.name)\n .join(\", \");\n return `Error: Engine \"${engineName}\" not found. Available engines: ${available}`;\n }\n\n if (!isAgentEnginePackageInstalled(entry)) {\n return `Error: Engine \"${engineName}\" requires optional packages that are not installed in this app. Run: pnpm add ${entry.installPackage}`;\n }\n\n const resolvedModel = model ?? entry.defaultModel;\n if (\n entry.name === \"builder\" &&\n normalizeModelForEngine(entry, resolvedModel) !== resolvedModel\n ) {\n return `Error: Model \"${resolvedModel}\" is not supported by Builder. Choose one of: ${entry.supportedModels.join(\", \")}`;\n }\n\n // supportedModels is a suggestion list, not an allowlist — accept any\n // string for BYO/custom engines (OpenRouter / Ollama / previews) and flag\n // uncurated saves. Builder is an enumerated gateway and is checked above.\n const modelIsCurated =\n entry.supportedModels.length === 0 ||\n entry.supportedModels.includes(resolvedModel);\n\n const missingEnvVars = entry.requiredEnvVars.filter((v) => !process.env[v]);\n if (missingEnvVars.length > 0) {\n return `Warning: Engine \"${engineName}\" requires the following environment variables which are not set: ${missingEnvVars.join(\", \")}. The engine will fail at runtime without them.`;\n }\n\n await putSetting(\"agent-engine\", {\n engine: engineName,\n model: resolvedModel,\n });\n\n const customNote = modelIsCurated\n ? \"\"\n : ` (model \"${resolvedModel}\" isn't in the curated list for ${entry.label}; saved as a custom model — verify it's a real ID for this provider)`;\n\n return JSON.stringify({\n ok: true,\n engine: engineName,\n model: resolvedModel,\n message: `Agent engine set to ${entry.label} with model ${resolvedModel}. Takes effect on the next conversation.${customNote}`,\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-chat-plugin.d.ts","sourceRoot":"","sources":["../../src/server/agent-chat-plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-chat-plugin.d.ts","sourceRoot":"","sources":["../../src/server/agent-chat-plugin.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import { createDbAdminAgentTools } from "../db-admin/agent-tools.js";
4
4
  import { getH3App, markDefaultPluginProvided, trackPluginInit, } from "./framework-request-handler.js";
5
5
  import { createProductionAgentHandler, actionsToEngineTools, getActiveRunForThreadAsync, abortRun, subscribeToRun, } from "../agent/production-agent.js";
6
6
  import { runAgentLoopDirectWithSoftTimeout } from "../agent/run-loop-with-resume.js";
7
- import { resolveEngine, createAnthropicEngine, getStoredModelForEngine, getAgentEngineEntry, isAgentEnginePackageInstalled, isStoredEngineUsableForRequest, listAgentEngines, registerBuiltinEngines, } from "../agent/engine/index.js";
7
+ import { resolveEngine, createAnthropicEngine, getStoredModelForEngine, normalizeModelForEngine, getAgentEngineEntry, isAgentEnginePackageInstalled, isStoredEngineUsableForRequest, listAgentEngines, registerBuiltinEngines, } from "../agent/engine/index.js";
8
8
  import { canUpdateAgentAppModelDefaultSettings, normalizeAgentAppModelDefaultAppId, readAgentAppModelDefaultSettings, resetAgentAppModelDefaultSettings, writeAgentAppModelDefaultSettings, } from "../agent/app-model-defaults.js";
9
9
  import { DEFAULT_ANTHROPIC_MODEL } from "../agent/default-model.js";
10
10
  import { attachToolSearch } from "../agent/tool-search.js";
@@ -2999,11 +2999,12 @@ export function createAgentChatPlugin(options) {
2999
2999
  const systemPrompt = devActive
3000
3000
  ? devPrompt + runtimeContext + resources + schemaBlock + extra
3001
3001
  : basePrompt + runtimeContext + resources + schemaBlock + extra;
3002
- const model = options?.model ??
3002
+ const a2aModelCandidate = options?.model ??
3003
3003
  (await getStoredModelForEngine(a2aEngine, {
3004
3004
  appId: options?.appId,
3005
3005
  })) ??
3006
3006
  a2aEngine.defaultModel;
3007
+ const model = normalizeModelForEngine(a2aEngine, a2aModelCandidate);
3007
3008
  // Build tools — same as interactive handler but WITHOUT call-agent
3008
3009
  // to prevent infinite recursive A2A loops (agent calling itself).
3009
3010
  // In dev mode, template actions are invoked via bash (not native tools),
@@ -3165,11 +3166,12 @@ export function createAgentChatPlugin(options) {
3165
3166
  apiKey: options?.apiKey,
3166
3167
  appId: options?.appId,
3167
3168
  });
3168
- const model = options?.model ??
3169
+ const mcpModelCandidate = options?.model ??
3169
3170
  (await getStoredModelForEngine(mcpEngine, {
3170
3171
  appId: options?.appId,
3171
3172
  })) ??
3172
3173
  mcpEngine.defaultModel;
3174
+ const model = normalizeModelForEngine(mcpEngine, mcpModelCandidate);
3173
3175
  // Same actions as A2A — without call-agent to prevent loops.
3174
3176
  // In dev mode, template actions go through bash, not native tools.
3175
3177
  const devActiveMcp = isDevMode();
@@ -4205,12 +4207,13 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
4205
4207
  apiKey: apiKey ?? options?.apiKey,
4206
4208
  appId: options?.appId,
4207
4209
  });
4208
- const model = payload.model ??
4210
+ const modelCandidate = payload.model ??
4209
4211
  (await getStoredModelForEngine(engine, {
4210
4212
  appId: options?.appId,
4211
4213
  })) ??
4212
4214
  engine.defaultModel ??
4213
4215
  resolvedModel;
4216
+ const model = normalizeModelForEngine(engine, modelCandidate);
4214
4217
  return {
4215
4218
  baseSystemPrompt: basePrompt,
4216
4219
  actions: buildSubAgentActions(),
@@ -4350,6 +4353,13 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
4350
4353
  error: `Engine "${engine}" requires optional packages that are not installed in this app. Run: pnpm add ${entry.installPackage}`,
4351
4354
  };
4352
4355
  }
4356
+ if (entry.name === "builder" &&
4357
+ normalizeModelForEngine(entry, model) !== model) {
4358
+ setResponseStatus(event, 400);
4359
+ return {
4360
+ error: `Model "${model}" is not supported by Builder. Choose one of: ${entry.supportedModels.join(", ")}`,
4361
+ };
4362
+ }
4353
4363
  await writeAgentAppModelDefaultSettings({ userEmail: ctx.userEmail, orgId: ctx.orgId }, targetAppId, { engine, model, updatedBy: ctx.userEmail });
4354
4364
  return buildModelDefaultsPayload(event, targetAppId);
4355
4365
  }));