@mcoda/codali 0.1.66

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 (241) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/LICENSE +21 -0
  3. package/README.md +111 -0
  4. package/dist/agents/AgentProtocol.d.ts +287 -0
  5. package/dist/agents/AgentProtocol.d.ts.map +1 -0
  6. package/dist/agents/AgentProtocol.js +365 -0
  7. package/dist/agents/AgentResolver.d.ts +23 -0
  8. package/dist/agents/AgentResolver.d.ts.map +1 -0
  9. package/dist/agents/AgentResolver.js +77 -0
  10. package/dist/agents/PhaseAgentSelector.d.ts +23 -0
  11. package/dist/agents/PhaseAgentSelector.d.ts.map +1 -0
  12. package/dist/agents/PhaseAgentSelector.js +287 -0
  13. package/dist/cli/EvalCommand.d.ts +37 -0
  14. package/dist/cli/EvalCommand.d.ts.map +1 -0
  15. package/dist/cli/EvalCommand.js +333 -0
  16. package/dist/cli/FeedbackCommand.d.ts +22 -0
  17. package/dist/cli/FeedbackCommand.d.ts.map +1 -0
  18. package/dist/cli/FeedbackCommand.js +163 -0
  19. package/dist/cli/RunCommand.d.ts +78 -0
  20. package/dist/cli/RunCommand.d.ts.map +1 -0
  21. package/dist/cli/RunCommand.js +2261 -0
  22. package/dist/cli.d.ts +3 -0
  23. package/dist/cli.d.ts.map +1 -0
  24. package/dist/cli.js +109 -0
  25. package/dist/cognitive/ArchitectPlanner.d.ts +107 -0
  26. package/dist/cognitive/ArchitectPlanner.d.ts.map +1 -0
  27. package/dist/cognitive/ArchitectPlanner.js +1726 -0
  28. package/dist/cognitive/BuilderOutputParser.d.ts +25 -0
  29. package/dist/cognitive/BuilderOutputParser.d.ts.map +1 -0
  30. package/dist/cognitive/BuilderOutputParser.js +164 -0
  31. package/dist/cognitive/BuilderRunner.d.ts +76 -0
  32. package/dist/cognitive/BuilderRunner.d.ts.map +1 -0
  33. package/dist/cognitive/BuilderRunner.js +1159 -0
  34. package/dist/cognitive/ContextAssembler.d.ts +91 -0
  35. package/dist/cognitive/ContextAssembler.d.ts.map +1 -0
  36. package/dist/cognitive/ContextAssembler.js +4547 -0
  37. package/dist/cognitive/ContextBudget.d.ts +19 -0
  38. package/dist/cognitive/ContextBudget.d.ts.map +1 -0
  39. package/dist/cognitive/ContextBudget.js +35 -0
  40. package/dist/cognitive/ContextFileLoader.d.ts +30 -0
  41. package/dist/cognitive/ContextFileLoader.d.ts.map +1 -0
  42. package/dist/cognitive/ContextFileLoader.js +307 -0
  43. package/dist/cognitive/ContextManager.d.ts +47 -0
  44. package/dist/cognitive/ContextManager.d.ts.map +1 -0
  45. package/dist/cognitive/ContextManager.js +272 -0
  46. package/dist/cognitive/ContextRedactor.d.ts +18 -0
  47. package/dist/cognitive/ContextRedactor.d.ts.map +1 -0
  48. package/dist/cognitive/ContextRedactor.js +53 -0
  49. package/dist/cognitive/ContextSelector.d.ts +22 -0
  50. package/dist/cognitive/ContextSelector.d.ts.map +1 -0
  51. package/dist/cognitive/ContextSelector.js +431 -0
  52. package/dist/cognitive/ContextSerializer.d.ts +8 -0
  53. package/dist/cognitive/ContextSerializer.d.ts.map +1 -0
  54. package/dist/cognitive/ContextSerializer.js +882 -0
  55. package/dist/cognitive/ContextStore.d.ts +27 -0
  56. package/dist/cognitive/ContextStore.d.ts.map +1 -0
  57. package/dist/cognitive/ContextStore.js +79 -0
  58. package/dist/cognitive/ContextSummarizer.d.ts +16 -0
  59. package/dist/cognitive/ContextSummarizer.d.ts.map +1 -0
  60. package/dist/cognitive/ContextSummarizer.js +45 -0
  61. package/dist/cognitive/CostEstimator.d.ts +31 -0
  62. package/dist/cognitive/CostEstimator.d.ts.map +1 -0
  63. package/dist/cognitive/CostEstimator.js +66 -0
  64. package/dist/cognitive/CriticEvaluator.d.ts +32 -0
  65. package/dist/cognitive/CriticEvaluator.d.ts.map +1 -0
  66. package/dist/cognitive/CriticEvaluator.js +297 -0
  67. package/dist/cognitive/EvidenceGate.d.ts +9 -0
  68. package/dist/cognitive/EvidenceGate.d.ts.map +1 -0
  69. package/dist/cognitive/EvidenceGate.js +75 -0
  70. package/dist/cognitive/GoldenExampleIndexer.d.ts +12 -0
  71. package/dist/cognitive/GoldenExampleIndexer.d.ts.map +1 -0
  72. package/dist/cognitive/GoldenExampleIndexer.js +34 -0
  73. package/dist/cognitive/GoldenSetStore.d.ts +33 -0
  74. package/dist/cognitive/GoldenSetStore.d.ts.map +1 -0
  75. package/dist/cognitive/GoldenSetStore.js +159 -0
  76. package/dist/cognitive/IntentSignals.d.ts +7 -0
  77. package/dist/cognitive/IntentSignals.d.ts.map +1 -0
  78. package/dist/cognitive/IntentSignals.js +285 -0
  79. package/dist/cognitive/LearningGovernance.d.ts +100 -0
  80. package/dist/cognitive/LearningGovernance.d.ts.map +1 -0
  81. package/dist/cognitive/LearningGovernance.js +276 -0
  82. package/dist/cognitive/MemoryWriteback.d.ts +64 -0
  83. package/dist/cognitive/MemoryWriteback.d.ts.map +1 -0
  84. package/dist/cognitive/MemoryWriteback.js +287 -0
  85. package/dist/cognitive/PatchApplier.d.ts +49 -0
  86. package/dist/cognitive/PatchApplier.d.ts.map +1 -0
  87. package/dist/cognitive/PatchApplier.js +199 -0
  88. package/dist/cognitive/PatchInterpreter.d.ts +35 -0
  89. package/dist/cognitive/PatchInterpreter.d.ts.map +1 -0
  90. package/dist/cognitive/PatchInterpreter.js +100 -0
  91. package/dist/cognitive/PatchOutputNormalizer.d.ts +7 -0
  92. package/dist/cognitive/PatchOutputNormalizer.d.ts.map +1 -0
  93. package/dist/cognitive/PatchOutputNormalizer.js +59 -0
  94. package/dist/cognitive/PostMortemAnalyzer.d.ts +17 -0
  95. package/dist/cognitive/PostMortemAnalyzer.d.ts.map +1 -0
  96. package/dist/cognitive/PostMortemAnalyzer.js +131 -0
  97. package/dist/cognitive/PreferenceExtraction.d.ts +3 -0
  98. package/dist/cognitive/PreferenceExtraction.d.ts.map +1 -0
  99. package/dist/cognitive/PreferenceExtraction.js +85 -0
  100. package/dist/cognitive/Prompts.d.ts +15 -0
  101. package/dist/cognitive/Prompts.d.ts.map +1 -0
  102. package/dist/cognitive/Prompts.js +326 -0
  103. package/dist/cognitive/ProviderRouting.d.ts +16 -0
  104. package/dist/cognitive/ProviderRouting.d.ts.map +1 -0
  105. package/dist/cognitive/ProviderRouting.js +24 -0
  106. package/dist/cognitive/QueryExtraction.d.ts +12 -0
  107. package/dist/cognitive/QueryExtraction.d.ts.map +1 -0
  108. package/dist/cognitive/QueryExtraction.js +262 -0
  109. package/dist/cognitive/RunHistoryIndexer.d.ts +13 -0
  110. package/dist/cognitive/RunHistoryIndexer.d.ts.map +1 -0
  111. package/dist/cognitive/RunHistoryIndexer.js +125 -0
  112. package/dist/cognitive/SmartPipeline.d.ts +92 -0
  113. package/dist/cognitive/SmartPipeline.d.ts.map +1 -0
  114. package/dist/cognitive/SmartPipeline.js +4804 -0
  115. package/dist/cognitive/Types.d.ts +474 -0
  116. package/dist/cognitive/Types.d.ts.map +1 -0
  117. package/dist/cognitive/Types.js +7 -0
  118. package/dist/cognitive/ValidationRunner.d.ts +57 -0
  119. package/dist/cognitive/ValidationRunner.d.ts.map +1 -0
  120. package/dist/cognitive/ValidationRunner.js +515 -0
  121. package/dist/config/Config.d.ts +249 -0
  122. package/dist/config/Config.d.ts.map +1 -0
  123. package/dist/config/Config.js +200 -0
  124. package/dist/config/ConfigLoader.d.ts +56 -0
  125. package/dist/config/ConfigLoader.d.ts.map +1 -0
  126. package/dist/config/ConfigLoader.js +1246 -0
  127. package/dist/docdex/DocdexClient.d.ts +159 -0
  128. package/dist/docdex/DocdexClient.d.ts.map +1 -0
  129. package/dist/docdex/DocdexClient.js +838 -0
  130. package/dist/eval/EvalRunner.d.ts +35 -0
  131. package/dist/eval/EvalRunner.d.ts.map +1 -0
  132. package/dist/eval/EvalRunner.js +38 -0
  133. package/dist/eval/EvalTaskExecutor.d.ts +81 -0
  134. package/dist/eval/EvalTaskExecutor.d.ts.map +1 -0
  135. package/dist/eval/EvalTaskExecutor.js +371 -0
  136. package/dist/eval/GateEvaluator.d.ts +31 -0
  137. package/dist/eval/GateEvaluator.d.ts.map +1 -0
  138. package/dist/eval/GateEvaluator.js +134 -0
  139. package/dist/eval/MetricTypes.d.ts +28 -0
  140. package/dist/eval/MetricTypes.d.ts.map +1 -0
  141. package/dist/eval/MetricTypes.js +1 -0
  142. package/dist/eval/MetricsAggregator.d.ts +4 -0
  143. package/dist/eval/MetricsAggregator.d.ts.map +1 -0
  144. package/dist/eval/MetricsAggregator.js +97 -0
  145. package/dist/eval/RegressionComparator.d.ts +29 -0
  146. package/dist/eval/RegressionComparator.d.ts.map +1 -0
  147. package/dist/eval/RegressionComparator.js +155 -0
  148. package/dist/eval/ReportInputAdapter.d.ts +52 -0
  149. package/dist/eval/ReportInputAdapter.d.ts.map +1 -0
  150. package/dist/eval/ReportInputAdapter.js +229 -0
  151. package/dist/eval/ReportSerializer.d.ts +32 -0
  152. package/dist/eval/ReportSerializer.d.ts.map +1 -0
  153. package/dist/eval/ReportSerializer.js +33 -0
  154. package/dist/eval/ReportStore.d.ts +18 -0
  155. package/dist/eval/ReportStore.d.ts.map +1 -0
  156. package/dist/eval/ReportStore.js +96 -0
  157. package/dist/eval/SuiteLoader.d.ts +12 -0
  158. package/dist/eval/SuiteLoader.d.ts.map +1 -0
  159. package/dist/eval/SuiteLoader.js +51 -0
  160. package/dist/eval/SuiteSchema.d.ts +56 -0
  161. package/dist/eval/SuiteSchema.d.ts.map +1 -0
  162. package/dist/eval/SuiteSchema.js +357 -0
  163. package/dist/index.d.ts +11 -0
  164. package/dist/index.d.ts.map +1 -0
  165. package/dist/index.js +5 -0
  166. package/dist/providers/CodexCliProvider.d.ts +8 -0
  167. package/dist/providers/CodexCliProvider.d.ts.map +1 -0
  168. package/dist/providers/CodexCliProvider.js +282 -0
  169. package/dist/providers/OllamaRemoteProvider.d.ts +8 -0
  170. package/dist/providers/OllamaRemoteProvider.d.ts.map +1 -0
  171. package/dist/providers/OllamaRemoteProvider.js +300 -0
  172. package/dist/providers/OpenAiCompatibleProvider.d.ts +8 -0
  173. package/dist/providers/OpenAiCompatibleProvider.d.ts.map +1 -0
  174. package/dist/providers/OpenAiCompatibleProvider.js +192 -0
  175. package/dist/providers/ProviderRegistry.d.ts +12 -0
  176. package/dist/providers/ProviderRegistry.d.ts.map +1 -0
  177. package/dist/providers/ProviderRegistry.js +28 -0
  178. package/dist/providers/ProviderTypes.d.ts +81 -0
  179. package/dist/providers/ProviderTypes.d.ts.map +1 -0
  180. package/dist/providers/ProviderTypes.js +1 -0
  181. package/dist/runtime/CodaliRuntime.d.ts +189 -0
  182. package/dist/runtime/CodaliRuntime.d.ts.map +1 -0
  183. package/dist/runtime/CodaliRuntime.js +1435 -0
  184. package/dist/runtime/DeepInvestigationErrors.d.ts +39 -0
  185. package/dist/runtime/DeepInvestigationErrors.d.ts.map +1 -0
  186. package/dist/runtime/DeepInvestigationErrors.js +57 -0
  187. package/dist/runtime/RunContext.d.ts +27 -0
  188. package/dist/runtime/RunContext.d.ts.map +1 -0
  189. package/dist/runtime/RunContext.js +51 -0
  190. package/dist/runtime/RunLogQuery.d.ts +48 -0
  191. package/dist/runtime/RunLogQuery.d.ts.map +1 -0
  192. package/dist/runtime/RunLogQuery.js +36 -0
  193. package/dist/runtime/RunLogReader.d.ts +19 -0
  194. package/dist/runtime/RunLogReader.d.ts.map +1 -0
  195. package/dist/runtime/RunLogReader.js +361 -0
  196. package/dist/runtime/RunLogger.d.ts +71 -0
  197. package/dist/runtime/RunLogger.d.ts.map +1 -0
  198. package/dist/runtime/RunLogger.js +100 -0
  199. package/dist/runtime/RunTelemetryTypes.d.ts +117 -0
  200. package/dist/runtime/RunTelemetryTypes.d.ts.map +1 -0
  201. package/dist/runtime/RunTelemetryTypes.js +299 -0
  202. package/dist/runtime/Runner.d.ts +66 -0
  203. package/dist/runtime/Runner.d.ts.map +1 -0
  204. package/dist/runtime/Runner.js +215 -0
  205. package/dist/runtime/StoragePaths.d.ts +3 -0
  206. package/dist/runtime/StoragePaths.d.ts.map +1 -0
  207. package/dist/runtime/StoragePaths.js +19 -0
  208. package/dist/runtime/WorkspaceLock.d.ts +30 -0
  209. package/dist/runtime/WorkspaceLock.d.ts.map +1 -0
  210. package/dist/runtime/WorkspaceLock.js +141 -0
  211. package/dist/session/InstructionLoader.d.ts +14 -0
  212. package/dist/session/InstructionLoader.d.ts.map +1 -0
  213. package/dist/session/InstructionLoader.js +107 -0
  214. package/dist/session/SessionStore.d.ts +81 -0
  215. package/dist/session/SessionStore.d.ts.map +1 -0
  216. package/dist/session/SessionStore.js +244 -0
  217. package/dist/subagents/SubagentOrchestrator.d.ts +68 -0
  218. package/dist/subagents/SubagentOrchestrator.d.ts.map +1 -0
  219. package/dist/subagents/SubagentOrchestrator.js +150 -0
  220. package/dist/tools/ToolRegistry.d.ts +9 -0
  221. package/dist/tools/ToolRegistry.d.ts.map +1 -0
  222. package/dist/tools/ToolRegistry.js +293 -0
  223. package/dist/tools/ToolTypes.d.ts +66 -0
  224. package/dist/tools/ToolTypes.d.ts.map +1 -0
  225. package/dist/tools/ToolTypes.js +40 -0
  226. package/dist/tools/diff/DiffTool.d.ts +3 -0
  227. package/dist/tools/diff/DiffTool.d.ts.map +1 -0
  228. package/dist/tools/diff/DiffTool.js +34 -0
  229. package/dist/tools/docdex/DocdexTools.d.ts +4 -0
  230. package/dist/tools/docdex/DocdexTools.d.ts.map +1 -0
  231. package/dist/tools/docdex/DocdexTools.js +490 -0
  232. package/dist/tools/filesystem/FileTools.d.ts +3 -0
  233. package/dist/tools/filesystem/FileTools.d.ts.map +1 -0
  234. package/dist/tools/filesystem/FileTools.js +141 -0
  235. package/dist/tools/search/SearchTool.d.ts +3 -0
  236. package/dist/tools/search/SearchTool.d.ts.map +1 -0
  237. package/dist/tools/search/SearchTool.js +46 -0
  238. package/dist/tools/shell/ShellTool.d.ts +3 -0
  239. package/dist/tools/shell/ShellTool.d.ts.map +1 -0
  240. package/dist/tools/shell/ShellTool.js +104 -0
  241. package/package.json +44 -0
@@ -0,0 +1,287 @@
1
+ import { GlobalRepository } from "@mcoda/db";
2
+ import { resolveAgentConfigFromRecord, } from "./AgentResolver.js";
3
+ const PHASE_CAPABILITIES = {
4
+ librarian: ["docdex_query", "summarization", "keyword_extraction", "log_analysis"],
5
+ architect: ["plan", "system_architecture", "architectural_design", "deep_reasoning"],
6
+ builder: ["code_write", "complex_refactoring", "migration_assist", "debugging"],
7
+ critic: ["code_review", "pull_request_review", "final_code_review", "standard_compliance"],
8
+ interpreter: ["code_review", "pull_request_review", "final_code_review", "standard_compliance"],
9
+ };
10
+ const PHASE_REQUIRED_CAPS = {
11
+ librarian: ["docdex_query", "summarization", "keyword_extraction", "log_analysis"],
12
+ architect: ["plan", "system_architecture", "architectural_design", "deep_reasoning"],
13
+ builder: ["code_write", "simple_refactor", "iterative_coding", "migration_assist"],
14
+ critic: ["code_review", "pull_request_review", "final_code_review", "standard_compliance"],
15
+ interpreter: ["code_review", "pull_request_review", "final_code_review", "standard_compliance"],
16
+ };
17
+ const PHASE_BEST_USAGE = {
18
+ librarian: ["lightweight_tasks", "log_analysis", "summarization", "doc_generation"],
19
+ architect: ["system_architecture", "architectural_design", "deep_reasoning", "plan"],
20
+ builder: ["code_write", "coding_light", "iterative_coding", "rapid_prototyping"],
21
+ critic: ["code_review", "code_review_secondary", "production_verification"],
22
+ interpreter: ["code_review", "code_review_secondary", "production_verification"],
23
+ };
24
+ const STRUCTURED_OUTPUT_CAPABILITIES = [
25
+ "strict_instruction_following",
26
+ "json_formatting",
27
+ "schema_adherence",
28
+ "structured_output",
29
+ ];
30
+ const PATCH_JSON_EXECUTION_CAPABILITIES = [
31
+ "iterative_coding",
32
+ "simple_refactor",
33
+ ];
34
+ const PATCH_JSON_RELIABILITY_CAPABILITIES = [
35
+ "iterative_coding",
36
+ "strict_instruction_following",
37
+ "json_formatting",
38
+ "schema_adherence",
39
+ "structured_output",
40
+ "test_fixing",
41
+ ];
42
+ const ADAPTERS_REQUIRING_AUTH = new Set([
43
+ "openai-api",
44
+ "zhipu-api",
45
+ "gemini-cli",
46
+ "codex-cli",
47
+ ]);
48
+ const countMatches = (capabilities, required) => required.filter((cap) => capabilities.includes(cap)).length;
49
+ const isManagedMswarmCloudAgent = (agent) => {
50
+ const config = agent.config;
51
+ if (!config || typeof config !== "object" || Array.isArray(config)) {
52
+ return false;
53
+ }
54
+ const managed = config.mswarmCloud;
55
+ return Boolean(managed &&
56
+ typeof managed === "object" &&
57
+ !Array.isArray(managed) &&
58
+ managed.managed === true);
59
+ };
60
+ const isCloudModel = (agent) => {
61
+ if (isManagedMswarmCloudAgent(agent)) {
62
+ return true;
63
+ }
64
+ return Boolean(agent.defaultModel?.toLowerCase().includes(":cloud"));
65
+ };
66
+ const normalizeAdapter = (adapter) => (adapter ?? "").trim().toLowerCase();
67
+ const requiresConfiguredAuth = (agent) => ADAPTERS_REQUIRING_AUTH.has(normalizeAdapter(agent.adapter));
68
+ const adjustScoreForReadiness = (score, agent, readiness) => {
69
+ let adjusted = score;
70
+ if (readiness.healthStatus === "degraded")
71
+ adjusted -= 25;
72
+ if (requiresConfiguredAuth(agent) && readiness.authConfigured === false)
73
+ adjusted -= 80;
74
+ return adjusted;
75
+ };
76
+ const scoreAgent = (phase, agent, capabilities, builderMode) => {
77
+ if (builderMode === "tool_calls" && phase === "builder" && agent.supportsTools === false) {
78
+ return Number.NEGATIVE_INFINITY;
79
+ }
80
+ const rating = agent.rating ?? 0;
81
+ const reasoning = agent.reasoningRating ?? rating;
82
+ const cost = agent.costPerMillion ?? 0;
83
+ const maxComplexity = agent.maxComplexity ?? 0;
84
+ const capHits = countMatches(capabilities, PHASE_CAPABILITIES[phase]);
85
+ const requiredHits = countMatches(capabilities, PHASE_REQUIRED_CAPS[phase]);
86
+ const structuredHits = countMatches(capabilities, STRUCTURED_OUTPUT_CAPABILITIES);
87
+ const patchExecutionHits = countMatches(capabilities, PATCH_JSON_EXECUTION_CAPABILITIES);
88
+ const patchReliabilityHits = countMatches(capabilities, PATCH_JSON_RELIABILITY_CAPABILITIES);
89
+ const hasIterativeCoding = capabilities.includes("iterative_coding");
90
+ const hasToolRunner = capabilities.includes("tool_runner");
91
+ const usageBoost = agent.bestUsage && PHASE_BEST_USAGE[phase].includes(agent.bestUsage) ? 2 : 0;
92
+ const patchJsonBuilder = phase === "builder" && builderMode === "patch_json";
93
+ let score = 0;
94
+ if (phase === "architect" || phase === "critic" || phase === "interpreter") {
95
+ score += reasoning * 3 + rating * 2;
96
+ }
97
+ else if (phase === "builder") {
98
+ score += rating * 2 + reasoning;
99
+ }
100
+ else {
101
+ score += rating + reasoning * 0.5;
102
+ }
103
+ score += capHits * 4;
104
+ if (capHits === 0)
105
+ score -= 3;
106
+ score += requiredHits * 2;
107
+ if (patchJsonBuilder)
108
+ score += requiredHits * 3;
109
+ score += usageBoost;
110
+ if (patchJsonBuilder) {
111
+ score += structuredHits * 14;
112
+ score += patchExecutionHits * 4;
113
+ score += patchReliabilityHits * 3;
114
+ if (structuredHits === 0)
115
+ score -= 24;
116
+ if (patchExecutionHits === 0)
117
+ score -= 8;
118
+ if (!hasIterativeCoding)
119
+ score -= 8;
120
+ else
121
+ score += 8;
122
+ if (requiredHits === 0)
123
+ score -= 12;
124
+ if (agent.supportsTools === false)
125
+ score -= 14;
126
+ else
127
+ score += 3;
128
+ if (hasToolRunner)
129
+ score += 2;
130
+ }
131
+ const prefersStructuredBuilder = patchJsonBuilder && structuredHits > 0;
132
+ const costPenalty = phase === "builder"
133
+ ? prefersStructuredBuilder ? 1.5 : patchJsonBuilder ? 2 : 5
134
+ : phase === "librarian" ? 4 : phase === "architect" ? 1.5 : 1;
135
+ if (phase === "builder") {
136
+ score -= cost * costPenalty;
137
+ score -= maxComplexity * 0.5;
138
+ }
139
+ else if (phase === "librarian") {
140
+ score -= cost * costPenalty;
141
+ score -= maxComplexity;
142
+ }
143
+ else {
144
+ score -= cost * costPenalty;
145
+ }
146
+ return score;
147
+ };
148
+ const resolveOverrideAgent = async (repo, agentRef) => {
149
+ const agent = (await repo.getAgentById(agentRef)) ?? (await repo.getAgentBySlug(agentRef));
150
+ if (!agent) {
151
+ throw new Error(`Agent ${agentRef} not found`);
152
+ }
153
+ const capabilities = await repo.getAgentCapabilities(agent.id);
154
+ const resolved = await resolveAgentConfigFromRecord(agent, repo);
155
+ return { agent, capabilities, resolved };
156
+ };
157
+ export const selectPhaseAgents = async (options) => {
158
+ const repo = await GlobalRepository.create();
159
+ try {
160
+ const agents = await repo.listAgents();
161
+ const capCache = new Map();
162
+ const readinessCache = new Map();
163
+ const getCaps = async (agent) => {
164
+ const cached = capCache.get(agent.id);
165
+ if (cached)
166
+ return cached;
167
+ const caps = await repo.getAgentCapabilities(agent.id);
168
+ capCache.set(agent.id, caps);
169
+ return caps;
170
+ };
171
+ const getReadiness = async (agent) => {
172
+ const cached = readinessCache.get(agent.id);
173
+ if (cached)
174
+ return cached;
175
+ const [auth, health] = await Promise.all([
176
+ repo.getAgentAuthMetadata(agent.id),
177
+ repo.getAgentHealth(agent.id),
178
+ ]);
179
+ const readiness = {
180
+ authConfigured: auth.configured,
181
+ healthStatus: health?.status,
182
+ };
183
+ readinessCache.set(agent.id, readiness);
184
+ return readiness;
185
+ };
186
+ const buildSelection = async (phase) => {
187
+ const excludedIds = new Set(options.excludeAgentIds?.[phase] ?? []);
188
+ const overrideRef = options.overrides[phase];
189
+ if (overrideRef) {
190
+ const resolvedOverride = await resolveOverrideAgent(repo, overrideRef);
191
+ return {
192
+ phase,
193
+ agent: resolvedOverride.agent,
194
+ capabilities: resolvedOverride.capabilities,
195
+ resolved: resolvedOverride.resolved,
196
+ source: "override",
197
+ reason: "routing.agent override",
198
+ };
199
+ }
200
+ const scored = [];
201
+ const patchJsonBuilder = phase === "builder" && options.builderMode === "patch_json";
202
+ for (const agent of agents) {
203
+ if (excludedIds.has(agent.id))
204
+ continue;
205
+ if (!agent.defaultModel)
206
+ continue;
207
+ if (!options.allowCloudModels && isCloudModel(agent))
208
+ continue;
209
+ const readiness = await getReadiness(agent);
210
+ if (readiness.healthStatus === "unreachable")
211
+ continue;
212
+ const caps = await getCaps(agent);
213
+ const requiredHits = countMatches(caps, PHASE_REQUIRED_CAPS[phase]);
214
+ const structuredHits = countMatches(caps, STRUCTURED_OUTPUT_CAPABILITIES);
215
+ const patchExecutionHits = countMatches(caps, PATCH_JSON_EXECUTION_CAPABILITIES);
216
+ const score = adjustScoreForReadiness(scoreAgent(phase, agent, caps, options.builderMode), agent, readiness);
217
+ if (!Number.isFinite(score))
218
+ continue;
219
+ scored.push({
220
+ agent,
221
+ caps,
222
+ score,
223
+ requiredHits,
224
+ structuredHits,
225
+ patchExecutionHits,
226
+ });
227
+ }
228
+ const hasRequired = scored.some((candidate) => candidate.requiredHits > 0);
229
+ let candidates = hasRequired
230
+ ? scored.filter((candidate) => candidate.requiredHits > 0)
231
+ : scored;
232
+ if (patchJsonBuilder) {
233
+ const structuredCandidates = candidates.filter((candidate) => candidate.structuredHits > 0);
234
+ if (structuredCandidates.length > 0) {
235
+ candidates = structuredCandidates;
236
+ }
237
+ else {
238
+ const patchExecutionCandidates = candidates.filter((candidate) => candidate.patchExecutionHits > 0);
239
+ if (patchExecutionCandidates.length > 0) {
240
+ candidates = patchExecutionCandidates;
241
+ }
242
+ }
243
+ }
244
+ candidates.sort((a, b) => b.score - a.score);
245
+ for (const candidate of candidates) {
246
+ try {
247
+ const resolved = await resolveAgentConfigFromRecord(candidate.agent, repo);
248
+ return {
249
+ phase,
250
+ agent: candidate.agent,
251
+ capabilities: candidate.caps,
252
+ resolved,
253
+ source: "auto",
254
+ score: candidate.score,
255
+ reason: "scored capability match",
256
+ };
257
+ }
258
+ catch {
259
+ continue;
260
+ }
261
+ }
262
+ if (options.fallbackAgent) {
263
+ const fallbackCaps = await getCaps(options.fallbackAgent.agent);
264
+ return {
265
+ phase,
266
+ agent: options.fallbackAgent.agent,
267
+ capabilities: fallbackCaps,
268
+ resolved: options.fallbackAgent,
269
+ source: "fallback",
270
+ reason: "auto selection failed",
271
+ };
272
+ }
273
+ return { phase, capabilities: [], source: "none", reason: "no eligible agents" };
274
+ };
275
+ const result = {
276
+ librarian: await buildSelection("librarian"),
277
+ architect: await buildSelection("architect"),
278
+ builder: await buildSelection("builder"),
279
+ critic: await buildSelection("critic"),
280
+ interpreter: await buildSelection("interpreter"),
281
+ };
282
+ return result;
283
+ }
284
+ finally {
285
+ await repo.close();
286
+ }
287
+ };
@@ -0,0 +1,37 @@
1
+ export declare const EVAL_EXIT_CODES: {
2
+ readonly usage_error: 2;
3
+ readonly suite_validation_error: 3;
4
+ readonly run_failure: 4;
5
+ readonly gate_failure: 5;
6
+ };
7
+ type EvalExitCode = (typeof EVAL_EXIT_CODES)[keyof typeof EVAL_EXIT_CODES];
8
+ export declare class EvalCommandError extends Error {
9
+ readonly exitCode: EvalExitCode;
10
+ constructor(message: string, exitCode: EvalExitCode);
11
+ }
12
+ export interface ParsedEvalArgs {
13
+ suite_path?: string;
14
+ output: "text" | "json";
15
+ baseline_path?: string;
16
+ report_dir?: string;
17
+ workspace_root?: string;
18
+ config_path?: string;
19
+ provider?: string;
20
+ model?: string;
21
+ api_key?: string;
22
+ base_url?: string;
23
+ agent?: string;
24
+ agent_id?: string;
25
+ agent_slug?: string;
26
+ workflow_profile?: string;
27
+ smart?: boolean;
28
+ no_deep_investigation?: boolean;
29
+ help?: boolean;
30
+ }
31
+ export declare const parseEvalArgs: (argv: string[]) => ParsedEvalArgs;
32
+ export declare class EvalCommand {
33
+ static helpText(): string;
34
+ static run(argv: string[]): Promise<void>;
35
+ }
36
+ export {};
37
+ //# sourceMappingURL=EvalCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvalCommand.d.ts","sourceRoot":"","sources":["../../src/cli/EvalCommand.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,eAAe;;;;;CAKlB,CAAC;AAEX,KAAK,YAAY,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AAE3E,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;gBAEpB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY;CAKpD;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA+BD,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,KAAG,cAkG9C,CAAC;AA2DF,qBAAa,WAAW;IACtB,MAAM,CAAC,QAAQ,IAAI,MAAM;WAIZ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAqJhD"}
@@ -0,0 +1,333 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import path from "node:path";
3
+ import process from "node:process";
4
+ import { loadConfig } from "../config/ConfigLoader.js";
5
+ import { EvalTaskExecutor } from "../eval/EvalTaskExecutor.js";
6
+ import { EvalRunner } from "../eval/EvalRunner.js";
7
+ import { evaluateGates, resolveGateThresholds } from "../eval/GateEvaluator.js";
8
+ import { aggregateMetrics } from "../eval/MetricsAggregator.js";
9
+ import { compareAgainstBaseline } from "../eval/RegressionComparator.js";
10
+ import { serializeEvalReport } from "../eval/ReportSerializer.js";
11
+ import { ReportStore } from "../eval/ReportStore.js";
12
+ import { loadSuiteFromFile } from "../eval/SuiteLoader.js";
13
+ import { SuiteValidationError } from "../eval/SuiteSchema.js";
14
+ import { resolveWorkspaceRoot } from "./RunCommand.js";
15
+ export const EVAL_EXIT_CODES = {
16
+ usage_error: 2,
17
+ suite_validation_error: 3,
18
+ run_failure: 4,
19
+ gate_failure: 5,
20
+ };
21
+ export class EvalCommandError extends Error {
22
+ constructor(message, exitCode) {
23
+ super(message);
24
+ this.name = "EvalCommandError";
25
+ this.exitCode = exitCode;
26
+ }
27
+ }
28
+ const HELP_TEXT = "Usage: codali eval --suite <path> [options]\n\n"
29
+ + "Options:\n"
30
+ + " --suite <path> Path to eval suite JSON (required)\n"
31
+ + " --output <text|json> Output mode (default: text)\n"
32
+ + " --baseline <path> Optional baseline report for regression diff\n"
33
+ + " --report-dir <path> Override eval report output directory\n"
34
+ + " --workspace-root <path> Workspace root for task execution\n"
35
+ + " --provider <name> Provider override passed to task runs\n"
36
+ + " --model <name> Model override passed to task runs\n"
37
+ + " --api-key <token> API key override passed to task runs\n"
38
+ + " --base-url <url> Base URL override passed to task runs\n"
39
+ + " --agent <slug> Agent override passed to task runs\n"
40
+ + " --agent-id <id> Agent id override passed to task runs\n"
41
+ + " --agent-slug <slug> Agent slug override passed to task runs\n"
42
+ + " --profile <name> Workflow profile override for task runs\n"
43
+ + " --smart Force smart mode for task runs\n"
44
+ + " --no-deep-investigation Disable deep investigation for task runs\n"
45
+ + " --config <path> Config file path\n"
46
+ + " --help Show help\n";
47
+ const expectValue = (argv, index, flag) => {
48
+ const value = argv[index + 1];
49
+ if (!value || value.startsWith("--")) {
50
+ throw new EvalCommandError(`Missing value for ${flag}.`, EVAL_EXIT_CODES.usage_error);
51
+ }
52
+ return value;
53
+ };
54
+ export const parseEvalArgs = (argv) => {
55
+ const parsed = {
56
+ output: "text",
57
+ };
58
+ for (let index = 0; index < argv.length; index += 1) {
59
+ const arg = argv[index];
60
+ if (arg === "--help" || arg === "-h") {
61
+ parsed.help = true;
62
+ continue;
63
+ }
64
+ if (arg === "--suite") {
65
+ parsed.suite_path = expectValue(argv, index, "--suite");
66
+ index += 1;
67
+ continue;
68
+ }
69
+ if (arg === "--output") {
70
+ const value = expectValue(argv, index, "--output").trim().toLowerCase();
71
+ if (value !== "text" && value !== "json") {
72
+ throw new EvalCommandError("Invalid --output value. Expected text|json.", EVAL_EXIT_CODES.usage_error);
73
+ }
74
+ parsed.output = value;
75
+ index += 1;
76
+ continue;
77
+ }
78
+ if (arg === "--baseline") {
79
+ parsed.baseline_path = expectValue(argv, index, "--baseline");
80
+ index += 1;
81
+ continue;
82
+ }
83
+ if (arg === "--report-dir") {
84
+ parsed.report_dir = expectValue(argv, index, "--report-dir");
85
+ index += 1;
86
+ continue;
87
+ }
88
+ if (arg === "--workspace-root") {
89
+ parsed.workspace_root = expectValue(argv, index, "--workspace-root");
90
+ index += 1;
91
+ continue;
92
+ }
93
+ if (arg === "--config") {
94
+ parsed.config_path = expectValue(argv, index, "--config");
95
+ index += 1;
96
+ continue;
97
+ }
98
+ if (arg === "--provider") {
99
+ parsed.provider = expectValue(argv, index, "--provider");
100
+ index += 1;
101
+ continue;
102
+ }
103
+ if (arg === "--model") {
104
+ parsed.model = expectValue(argv, index, "--model");
105
+ index += 1;
106
+ continue;
107
+ }
108
+ if (arg === "--api-key") {
109
+ parsed.api_key = expectValue(argv, index, "--api-key");
110
+ index += 1;
111
+ continue;
112
+ }
113
+ if (arg === "--base-url") {
114
+ parsed.base_url = expectValue(argv, index, "--base-url");
115
+ index += 1;
116
+ continue;
117
+ }
118
+ if (arg === "--agent") {
119
+ parsed.agent = expectValue(argv, index, "--agent");
120
+ index += 1;
121
+ continue;
122
+ }
123
+ if (arg === "--agent-id") {
124
+ parsed.agent_id = expectValue(argv, index, "--agent-id");
125
+ index += 1;
126
+ continue;
127
+ }
128
+ if (arg === "--agent-slug") {
129
+ parsed.agent_slug = expectValue(argv, index, "--agent-slug");
130
+ index += 1;
131
+ continue;
132
+ }
133
+ if (arg === "--profile" || arg === "--workflow-profile") {
134
+ parsed.workflow_profile = expectValue(argv, index, arg);
135
+ index += 1;
136
+ continue;
137
+ }
138
+ if (arg === "--smart") {
139
+ parsed.smart = true;
140
+ continue;
141
+ }
142
+ if (arg === "--no-deep-investigation") {
143
+ parsed.no_deep_investigation = true;
144
+ continue;
145
+ }
146
+ throw new EvalCommandError(`Unknown eval flag: ${arg}`, EVAL_EXIT_CODES.usage_error);
147
+ }
148
+ return parsed;
149
+ };
150
+ const formatRate = (value) => value === null ? "n/a" : `${(value * 100).toFixed(2)}%`;
151
+ const formatNullable = (value, unit = "") => value === null ? "n/a" : `${value.toFixed(2)}${unit}`;
152
+ const printTextReport = (report, reportPath) => {
153
+ const metrics = report.metrics;
154
+ const gateSummary = report.gates.passed
155
+ ? "passed"
156
+ : `failed (${report.gates.failures.map((failure) => failure.code).join(", ")})`;
157
+ const lines = [
158
+ `Eval suite: ${report.suite.suite_name} (${report.suite.suite_id})`,
159
+ `Tasks: ${report.summary.task_passed}/${report.summary.task_total} passed`,
160
+ `Execution errors: ${report.summary.execution_errors}`,
161
+ `M-001 task success: ${formatRate(metrics.m001_task_success_rate.value)}`,
162
+ `M-002 first-pass success: ${formatRate(metrics.m002_first_pass_success_rate.value)}`,
163
+ `M-003 patch apply success: ${formatRate(metrics.m003_patch_apply_success_rate.value)}`,
164
+ `M-004 verification pass: ${formatRate(metrics.m004_verification_pass_rate.value)}`,
165
+ `M-005 hallucination rate: ${formatRate(metrics.m005_hallucination_rate.value)}`,
166
+ `M-006 scope violation rate: ${formatRate(metrics.m006_scope_violation_rate.value)}`,
167
+ `M-007 latency median/p95: ${formatNullable(metrics.m007_latency_ms.median, "ms")}/${formatNullable(metrics.m007_latency_ms.p95, "ms")}`,
168
+ `M-008 success tokens median/p95: ${formatNullable(metrics.m008_success_tokens.median)}/${formatNullable(metrics.m008_success_tokens.p95)}`,
169
+ `M-008 success cost median/p95: ${formatNullable(metrics.m008_success_cost_usd.median, " USD")}/${formatNullable(metrics.m008_success_cost_usd.p95, " USD")}`,
170
+ `Regression gates: ${gateSummary}`,
171
+ `Report: ${reportPath}`,
172
+ ];
173
+ // eslint-disable-next-line no-console
174
+ console.log(lines.join("\n"));
175
+ };
176
+ const loadBaselineReport = async (params) => {
177
+ const { parsed, suitePath, suiteBaselinePath, store } = params;
178
+ const suiteDir = path.dirname(suitePath);
179
+ if (parsed.baseline_path) {
180
+ const baselinePath = await store.resolvePath(parsed.baseline_path, process.cwd());
181
+ return { path: baselinePath, report: await store.read(baselinePath) };
182
+ }
183
+ if (suiteBaselinePath) {
184
+ const baselinePath = await store.resolvePath(suiteBaselinePath, suiteDir);
185
+ return { path: baselinePath, report: await store.read(baselinePath) };
186
+ }
187
+ const latest = await store.findLatestForSuite({
188
+ suite_fingerprint: params.suiteFingerprint,
189
+ exclude_report_id: params.reportId,
190
+ });
191
+ if (!latest)
192
+ return {};
193
+ return { path: latest.path, report: latest.report };
194
+ };
195
+ export class EvalCommand {
196
+ static helpText() {
197
+ return HELP_TEXT;
198
+ }
199
+ static async run(argv) {
200
+ const parsed = parseEvalArgs(argv);
201
+ if (parsed.help) {
202
+ // eslint-disable-next-line no-console
203
+ console.log(HELP_TEXT);
204
+ return;
205
+ }
206
+ if (!parsed.suite_path) {
207
+ throw new EvalCommandError("Missing required --suite <path>.", EVAL_EXIT_CODES.usage_error);
208
+ }
209
+ const resolvedWorkspaceRoot = resolveWorkspaceRoot(process.cwd(), parsed.workspace_root);
210
+ const cliConfig = {};
211
+ if (parsed.workspace_root)
212
+ cliConfig.workspaceRoot = parsed.workspace_root;
213
+ if (parsed.provider)
214
+ cliConfig.provider = parsed.provider;
215
+ if (parsed.model)
216
+ cliConfig.model = parsed.model;
217
+ if (parsed.api_key)
218
+ cliConfig.apiKey = parsed.api_key;
219
+ if (parsed.base_url)
220
+ cliConfig.baseUrl = parsed.base_url;
221
+ if (parsed.workflow_profile)
222
+ cliConfig.workflow = { profile: parsed.workflow_profile };
223
+ if (parsed.smart !== undefined)
224
+ cliConfig.smart = parsed.smart;
225
+ if (parsed.no_deep_investigation !== undefined) {
226
+ cliConfig.deepInvestigation = { enabled: !parsed.no_deep_investigation };
227
+ }
228
+ const config = await loadConfig({
229
+ cli: cliConfig,
230
+ cwd: resolvedWorkspaceRoot,
231
+ configPath: parsed.config_path,
232
+ });
233
+ let loadedSuite;
234
+ try {
235
+ loadedSuite = await loadSuiteFromFile(parsed.suite_path, process.cwd());
236
+ }
237
+ catch (error) {
238
+ if (error instanceof SuiteValidationError) {
239
+ const issueSummary = error.issues
240
+ .map((issue) => `${issue.path}:${issue.code}`)
241
+ .join(", ");
242
+ throw new EvalCommandError(`Suite validation failed: ${issueSummary}`, EVAL_EXIT_CODES.suite_validation_error);
243
+ }
244
+ throw error;
245
+ }
246
+ const executor = new EvalTaskExecutor({
247
+ workspace_root: config.workspaceRoot,
248
+ suite_dir: loadedSuite.suite_dir,
249
+ provider: parsed.provider ?? (config.provider || undefined),
250
+ model: parsed.model ?? (config.model || undefined),
251
+ api_key: parsed.api_key ?? config.apiKey,
252
+ base_url: parsed.base_url ?? config.baseUrl,
253
+ agent: parsed.agent,
254
+ agent_id: parsed.agent_id,
255
+ agent_slug: parsed.agent_slug,
256
+ workflow_profile: parsed.workflow_profile,
257
+ smart: parsed.smart,
258
+ no_deep_investigation: parsed.no_deep_investigation,
259
+ });
260
+ const runner = new EvalRunner({
261
+ suite_id: loadedSuite.suite.suite_id,
262
+ suite_fingerprint: loadedSuite.suite_fingerprint,
263
+ tasks: loadedSuite.suite.tasks,
264
+ executor,
265
+ });
266
+ const runResult = await runner.run();
267
+ const metrics = aggregateMetrics(runResult);
268
+ const reportId = randomUUID();
269
+ const reportStore = new ReportStore(config.workspaceRoot, parsed.report_dir ?? config.eval?.report_dir);
270
+ const suiteBaselinePath = loadedSuite.suite.baseline?.mode === "none"
271
+ ? undefined
272
+ : loadedSuite.suite.baseline?.report_path;
273
+ const baseline = await loadBaselineReport({
274
+ parsed,
275
+ suitePath: loadedSuite.suite_path,
276
+ suiteBaselinePath,
277
+ store: reportStore,
278
+ suiteFingerprint: loadedSuite.suite_fingerprint,
279
+ reportId,
280
+ });
281
+ const regression = compareAgainstBaseline({
282
+ current: metrics,
283
+ baseline: baseline.report?.metrics,
284
+ baseline_report_id: baseline.report?.report_id,
285
+ baseline_created_at: baseline.report?.created_at,
286
+ });
287
+ const thresholds = resolveGateThresholds(config.eval?.gates, loadedSuite.suite.thresholds);
288
+ const gates = evaluateGates({ metrics, thresholds, comparison: regression });
289
+ const hasRunFailures = runResult.summary.failed > 0 || runResult.summary.execution_errors > 0;
290
+ const exitCode = hasRunFailures
291
+ ? EVAL_EXIT_CODES.run_failure
292
+ : (!gates.passed ? EVAL_EXIT_CODES.gate_failure : 0);
293
+ const report = {
294
+ schema_version: 1,
295
+ report_id: reportId,
296
+ created_at: new Date().toISOString(),
297
+ suite: {
298
+ suite_id: loadedSuite.suite.suite_id,
299
+ suite_name: loadedSuite.suite.name,
300
+ suite_path: loadedSuite.suite_path,
301
+ suite_fingerprint: loadedSuite.suite_fingerprint,
302
+ task_count: loadedSuite.suite.tasks.length,
303
+ },
304
+ summary: {
305
+ exit_code: exitCode,
306
+ passed: exitCode === 0,
307
+ gate_passed: gates.passed,
308
+ task_total: runResult.summary.total,
309
+ task_passed: runResult.summary.passed,
310
+ task_failed: runResult.summary.failed,
311
+ execution_errors: runResult.summary.execution_errors,
312
+ },
313
+ run: runResult,
314
+ metrics,
315
+ regression,
316
+ gates,
317
+ };
318
+ const reportPath = await reportStore.save(report);
319
+ if (parsed.output === "json") {
320
+ // eslint-disable-next-line no-console
321
+ console.log(serializeEvalReport(report, true));
322
+ }
323
+ else {
324
+ printTextReport(report, reportPath);
325
+ }
326
+ if (exitCode === EVAL_EXIT_CODES.run_failure) {
327
+ throw new EvalCommandError("Eval run completed with failed tasks or execution errors.", EVAL_EXIT_CODES.run_failure);
328
+ }
329
+ if (exitCode === EVAL_EXIT_CODES.gate_failure) {
330
+ throw new EvalCommandError("Eval regression gates failed.", EVAL_EXIT_CODES.gate_failure);
331
+ }
332
+ }
333
+ }
@@ -0,0 +1,22 @@
1
+ import { MemoryWriteback } from "../cognitive/MemoryWriteback.js";
2
+ import { PostMortemAnalyzer } from "../cognitive/PostMortemAnalyzer.js";
3
+ import type { CodaliConfig } from "../config/Config.js";
4
+ import { DocdexClient } from "../docdex/DocdexClient.js";
5
+ import { createProvider } from "../providers/ProviderRegistry.js";
6
+ import type { Provider } from "../providers/ProviderTypes.js";
7
+ interface FeedbackCommandDependencies {
8
+ cwd?: () => string;
9
+ loadConfig?: (options: {
10
+ cwd: string;
11
+ }) => Promise<CodaliConfig>;
12
+ createDocdexClient?: (config: CodaliConfig) => DocdexClient;
13
+ createProvider?: typeof createProvider;
14
+ createMemoryWriteback?: (client: DocdexClient, options: ConstructorParameters<typeof MemoryWriteback>[1]) => Pick<MemoryWriteback, "persist">;
15
+ createAnalyzer?: (provider: Provider, workspaceRoot: string) => Pick<PostMortemAnalyzer, "analyze">;
16
+ log?: (line: string) => void;
17
+ }
18
+ export declare class FeedbackCommand {
19
+ static run(argv: string[], deps?: FeedbackCommandDependencies): Promise<void>;
20
+ }
21
+ export {};
22
+ //# sourceMappingURL=FeedbackCommand.d.ts.map