@zhixuan92/multi-model-agent-core 3.9.1 → 3.10.1

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 (36) hide show
  1. package/README.md +1 -1
  2. package/dist/model-profiles.json +201 -12
  3. package/dist/observability/events.d.ts +3 -3
  4. package/dist/review/quality-reviewer.d.ts +9 -0
  5. package/dist/review/quality-reviewer.d.ts.map +1 -1
  6. package/dist/review/quality-reviewer.js +31 -5
  7. package/dist/review/quality-reviewer.js.map +1 -1
  8. package/dist/review/spec-reviewer.d.ts +9 -0
  9. package/dist/review/spec-reviewer.d.ts.map +1 -1
  10. package/dist/review/spec-reviewer.js +25 -3
  11. package/dist/review/spec-reviewer.js.map +1 -1
  12. package/dist/routing/model-profiles.d.ts +73 -0
  13. package/dist/routing/model-profiles.d.ts.map +1 -1
  14. package/dist/routing/model-profiles.js +200 -26
  15. package/dist/routing/model-profiles.js.map +1 -1
  16. package/dist/run-tasks/reviewed-lifecycle.d.ts +22 -2
  17. package/dist/run-tasks/reviewed-lifecycle.d.ts.map +1 -1
  18. package/dist/run-tasks/reviewed-lifecycle.js +54 -26
  19. package/dist/run-tasks/reviewed-lifecycle.js.map +1 -1
  20. package/dist/telemetry/event-builder.d.ts +5 -25
  21. package/dist/telemetry/event-builder.d.ts.map +1 -1
  22. package/dist/telemetry/event-builder.js +174 -294
  23. package/dist/telemetry/event-builder.js.map +1 -1
  24. package/dist/telemetry/normalize.d.ts +18 -0
  25. package/dist/telemetry/normalize.d.ts.map +1 -0
  26. package/dist/telemetry/normalize.js +18 -0
  27. package/dist/telemetry/normalize.js.map +1 -0
  28. package/dist/telemetry/types.d.ts +969 -1816
  29. package/dist/telemetry/types.d.ts.map +1 -1
  30. package/dist/telemetry/types.js +204 -345
  31. package/dist/telemetry/types.js.map +1 -1
  32. package/dist/types.d.ts +48 -2
  33. package/dist/types.d.ts.map +1 -1
  34. package/dist/types.js +61 -16
  35. package/dist/types.js.map +1 -1
  36. package/package.json +1 -1
package/README.md CHANGED
@@ -104,7 +104,7 @@ As of 3.4.0 every task-execution event the worker emits to the verbose stderr st
104
104
 
105
105
  ## What's new
106
106
 
107
- Latest: **3.9.1** — no core runtime API changes; this patch release ships the server package's Codex native skill-install fix while keeping the 3.9.0 watchdog and per-stage idle telemetry behavior unchanged. Full history: [CHANGELOG](https://github.com/zhixuan312/multi-model-agent/blob/master/CHANGELOG.md).
107
+ Latest: **3.10.1** — V3 telemetry fixes in `event-builder.ts` and `reviewed-lifecycle.ts`: top-level token totals and `totalCostUSD` now read from `runResult.usage` (previously summed across hardcoded-zero stages and always emitted 0); per-stage `BaseStageStats` gains `inputTokens`/`outputTokens`/`cachedTokens`/`reasoningTokens`/`turnCount`/`toolCallCount`/`filesReadCount`/`filesWrittenCount` populated from runner usage and reviewer metrics; per-stage `costUSD` clamped 0. Full history: [CHANGELOG](https://github.com/zhixuan312/multi-model-agent/blob/master/CHANGELOG.md).
108
108
 
109
109
  ## Full documentation
110
110
 
@@ -4,7 +4,7 @@
4
4
  "naming": "claude-{tier}-{major}-{minor} | claude-{major}-{tier}-{date} (3.x legacy)",
5
5
  "rateSource": "https://docs.anthropic.com/en/docs/about-claude/models",
6
6
  "rateLookupDate": "2026-04-17",
7
- "defaults": { "supportsEffort": true, "inputTokenSoftLimit": 150000, "capabilities": ["web_search", "web_fetch"] },
7
+ "defaults": { "family": "claude", "supportsEffort": true, "inputTokenSoftLimit": 150000, "capabilities": ["web_search", "web_fetch"] },
8
8
  "profiles": [
9
9
  { "prefix": "claude", "tier": "standard", "cost": "medium", "input": 3, "output": 15, "bestFor": "general Claude tasks (catch-all, Sonnet rates)" },
10
10
  { "prefix": "claude-opus", "tier": "reasoning", "cost": "high", "input": 5, "output": 25, "bestFor": "high-ambiguity tasks where error cost is high" },
@@ -21,7 +21,7 @@
21
21
  "naming": "gpt-{major}.{minor}[-{size}] — sizes: pro, mini, nano (no suffix = base)",
22
22
  "rateSource": "https://developers.openai.com/api/docs/pricing",
23
23
  "rateLookupDate": "2026-04-25",
24
- "defaults": { "supportsEffort": true, "inputTokenSoftLimit": 128000, "capabilities": [] },
24
+ "defaults": { "family": "openai", "supportsEffort": true, "inputTokenSoftLimit": 128000, "capabilities": [] },
25
25
  "profiles": [
26
26
  { "prefix": "gpt", "tier": "standard", "cost": "medium", "input": 2.5, "output": 15, "bestFor": "general GPT family tasks (catch-all)" },
27
27
  { "prefix": "gpt-5", "tier": "reasoning", "bestFor": "reasoning-tier coding and agentic workflows", "inputTokenSoftLimit": 1000000, "capabilities": ["web_search"] },
@@ -40,7 +40,7 @@
40
40
  "naming": "gemini-{major}[.{minor}]-{tier}-{suffix} — tiers: pro ($2/$12), flash ($0.50/$3)",
41
41
  "rateSource": "https://cloud.google.com/vertex-ai/generative-ai/pricing",
42
42
  "rateLookupDate": "2026-04-17",
43
- "defaults": { "supportsEffort": false, "inputTokenSoftLimit": 200000, "capabilities": ["web_search"] },
43
+ "defaults": { "family": "gemini", "supportsEffort": false, "inputTokenSoftLimit": 200000, "capabilities": ["web_search"] },
44
44
  "profiles": [
45
45
  { "prefix": "gemini", "tier": "standard", "cost": "low", "input": 0.5, "output": 3, "bestFor": "general Gemini tasks (catch-all, Flash rates)" },
46
46
  { "prefix": "gemini-3.1-pro", "tier": "reasoning", "cost": "medium", "input": 2, "output": 12, "bestFor": "long-context reasoning with large documents" },
@@ -53,7 +53,7 @@
53
53
  "naming": "grok-{major}[.{minor}]-{variant} — fast variant is ~15x cheaper than base",
54
54
  "rateSource": "https://docs.x.ai/developers/models",
55
55
  "rateLookupDate": "2026-04-17",
56
- "defaults": { "supportsEffort": false, "inputTokenSoftLimit": 200000, "capabilities": ["web_search"] },
56
+ "defaults": { "family": "grok", "supportsEffort": false, "inputTokenSoftLimit": 200000, "capabilities": ["web_search"] },
57
57
  "profiles": [
58
58
  { "prefix": "grok", "tier": "standard", "cost": "low", "input": 0.2, "output": 0.5, "bestFor": "general Grok tasks (catch-all, fast-tier rates)" },
59
59
  { "prefix": "grok-4", "tier": "reasoning", "cost": "medium", "input": 3, "output": 15, "bestFor": "reasoning and analysis tasks" },
@@ -65,7 +65,7 @@
65
65
  "naming": "mistral-{tier}-{version} — tiers: large ($0.50/$1.50), small ($0.10/$0.30)",
66
66
  "rateSource": "https://mistral.ai/pricing",
67
67
  "rateLookupDate": "2026-04-17",
68
- "defaults": { "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
68
+ "defaults": { "family": "mistral", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
69
69
  "profiles": [
70
70
  { "prefix": "mistral", "tier": "standard", "cost": "low", "input": 0.5, "output": 1.5, "bestFor": "general Mistral tasks (catch-all, Large rates)" },
71
71
  { "prefix": "mistral-large", "bestFor": "cost-effective frontier-class coding" },
@@ -77,7 +77,7 @@
77
77
  "naming": "deepseek-{variant}[-{size}] — V4 sizes: flash, pro; legacy variants are flat-priced",
78
78
  "rateSource": "https://api-docs.deepseek.com/quick_start/pricing",
79
79
  "rateLookupDate": "2026-04-27",
80
- "defaults": { "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
80
+ "defaults": { "family": "deepseek", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
81
81
  "profiles": [
82
82
  { "prefix": "deepseek", "tier": "standard", "cost": "low", "input": 0.3, "output": 0.5, "bestFor": "cost-effective coding and reasoning" },
83
83
  { "prefix": "deepseek-v4-flash", "input": 0.14, "output": 0.28, "bestFor": "cheapest DeepSeek V4 with 1M context", "inputTokenSoftLimit": 1000000 },
@@ -89,7 +89,7 @@
89
89
  "naming": "llama-{major}-{variant} | meta-llama/llama-{major}-{variant} (OpenRouter)",
90
90
  "rateSource": "https://openrouter.ai/models",
91
91
  "rateLookupDate": "2026-04-17",
92
- "defaults": { "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
92
+ "defaults": { "family": "llama", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
93
93
  "profiles": [
94
94
  { "prefix": "llama", "tier": "standard", "cost": "low", "input": 0.15, "output": 0.6, "bestFor": "general open-weight model tasks" },
95
95
  { "prefix": "llama-4", "bestFor": "cost-effective open-weight coding" },
@@ -101,7 +101,7 @@
101
101
  "naming": "qwen{major}[.{minor}]-{tier} — no separator after 'qwen'",
102
102
  "rateSource": "https://openrouter.ai/qwen/qwen3.5-plus-02-15",
103
103
  "rateLookupDate": "2026-04-17",
104
- "defaults": { "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
104
+ "defaults": { "family": "qwen", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
105
105
  "profiles": [
106
106
  { "prefix": "qwen", "tier": "standard", "cost": "low", "input": 0.26, "output": 1.56, "bestFor": "cost-effective coding and multilingual tasks" }
107
107
  ]
@@ -111,7 +111,7 @@
111
111
  "naming": "glm-{major}[.{minor}] — GLM-5 is ~30% more expensive than GLM-4",
112
112
  "rateSource": "https://docs.z.ai/guides/overview/pricing",
113
113
  "rateLookupDate": "2026-04-17",
114
- "defaults": { "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
114
+ "defaults": { "family": "glm", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
115
115
  "profiles": [
116
116
  { "prefix": "glm", "tier": "standard", "cost": "medium", "input": 1, "output": 3.2, "bestFor": "general GLM/Zhipu family tasks" },
117
117
  { "prefix": "glm-5", "bestFor": "bilingual Chinese/English coding" },
@@ -123,7 +123,7 @@
123
123
  "naming": "kimi-k{generation}[.{minor}] | kimi-k{generation}-{variant}",
124
124
  "rateSource": "https://platform.kimi.ai/docs/pricing/chat",
125
125
  "rateLookupDate": "2026-04-17",
126
- "defaults": { "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
126
+ "defaults": { "family": "kimi", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
127
127
  "profiles": [
128
128
  { "prefix": "kimi", "tier": "standard", "cost": "low", "input": 0.6, "output": 3, "bestFor": "long-context tasks and coding" }
129
129
  ]
@@ -133,7 +133,7 @@
133
133
  "naming": "command-r[-plus] — plus variant is flagship",
134
134
  "rateSource": "https://cohere.com/pricing",
135
135
  "rateLookupDate": "2026-04-17",
136
- "defaults": { "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": ["web_search"] },
136
+ "defaults": { "family": "cohere", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": ["web_search"] },
137
137
  "profiles": [
138
138
  { "prefix": "command-r", "tier": "standard", "cost": "medium", "input": 2.5, "output": 10, "bestFor": "RAG workflows and grounded generation" }
139
139
  ]
@@ -143,9 +143,198 @@
143
143
  "naming": "MiniMax-M{major}.{minor}[-highspeed] — case-sensitive prefix",
144
144
  "rateSource": "https://platform.minimax.io/docs/guides/pricing-paygo",
145
145
  "rateLookupDate": "2026-04-17",
146
- "defaults": { "supportsEffort": true, "inputTokenSoftLimit": 200000, "capabilities": [] },
146
+ "defaults": { "family": "minimax", "supportsEffort": true, "inputTokenSoftLimit": 200000, "capabilities": [] },
147
147
  "profiles": [
148
148
  { "prefix": "MiniMax-M2", "tier": "standard", "cost": "low", "input": 0.3, "output": 1.2, "bestFor": "well-scoped coding and agent loops where cost matters", "avoidFor": "highest-stakes ambiguous work that needs top-tier judgment" }
149
149
  ]
150
+ },
151
+ {
152
+ "provider": "microsoft",
153
+ "naming": "phi-{major}[-{variant}]",
154
+ "rateSource": "https://azure.microsoft.com/en-us/pricing/details/cognitive-services/openai-service/",
155
+ "rateLookupDate": "2026-04-29",
156
+ "defaults": { "family": "phi", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
157
+ "profiles": [
158
+ { "prefix": "phi", "tier": "standard", "cost": "low", "bestFor": "efficient open-weight Microsoft models" }
159
+ ]
160
+ },
161
+ {
162
+ "provider": "google-open",
163
+ "naming": "gemma-{major}[.{minor}] — open-weight Gemma family",
164
+ "rateSource": "https://ai.google.dev/gemma",
165
+ "rateLookupDate": "2026-04-29",
166
+ "defaults": { "family": "gemma", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
167
+ "profiles": [
168
+ { "prefix": "gemma", "tier": "standard", "cost": "low", "bestFor": "lightweight open-weight Google models" }
169
+ ]
170
+ },
171
+ {
172
+ "provider": "yi-01",
173
+ "naming": "yi-{tier}[-{version}]",
174
+ "rateLookupDate": "2026-04-29",
175
+ "defaults": { "family": "yi", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
176
+ "profiles": [
177
+ { "prefix": "yi", "tier": "standard", "cost": "low", "bestFor": "bilingual Chinese/English open-weight models" }
178
+ ]
179
+ },
180
+ {
181
+ "provider": "perplexity",
182
+ "naming": "sonar[-{variant}] — Perplexity's online-grounded models",
183
+ "rateSource": "https://docs.perplexity.ai/guides/pricing",
184
+ "rateLookupDate": "2026-04-29",
185
+ "defaults": { "family": "sonar", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": ["web_search"] },
186
+ "profiles": [
187
+ { "prefix": "sonar", "tier": "standard", "cost": "low", "bestFor": "online-grounded search-augmented tasks" }
188
+ ]
189
+ },
190
+ {
191
+ "provider": "amazon",
192
+ "naming": "nova[-{tier}][-{version}] — Amazon Bedrock native models",
193
+ "rateSource": "https://aws.amazon.com/bedrock/nova/pricing/",
194
+ "rateLookupDate": "2026-04-29",
195
+ "defaults": { "family": "nova", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
196
+ "profiles": [
197
+ { "prefix": "nova", "tier": "standard", "cost": "low", "bestFor": "Amazon Bedrock native multimodal models" }
198
+ ]
199
+ },
200
+ {
201
+ "provider": "ai21",
202
+ "naming": "jamba-{major}[.{minor}] — Mamba-transformer hybrid",
203
+ "rateLookupDate": "2026-04-29",
204
+ "defaults": { "family": "jamba", "supportsEffort": false, "inputTokenSoftLimit": 256000, "capabilities": [] },
205
+ "profiles": [
206
+ { "prefix": "jamba", "tier": "standard", "cost": "low", "bestFor": "long-context Mamba-transformer hybrid" }
207
+ ]
208
+ },
209
+ {
210
+ "provider": "ibm",
211
+ "naming": "granite-{major}[.{minor}]-{variant}",
212
+ "rateSource": "https://www.ibm.com/granite",
213
+ "rateLookupDate": "2026-04-29",
214
+ "defaults": { "family": "granite", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
215
+ "profiles": [
216
+ { "prefix": "granite", "tier": "standard", "cost": "low", "bestFor": "enterprise open-weight IBM models" }
217
+ ]
218
+ },
219
+ {
220
+ "provider": "nvidia",
221
+ "naming": "nemotron-{major}[-{variant}]",
222
+ "rateSource": "https://build.nvidia.com/explore/discover",
223
+ "rateLookupDate": "2026-04-29",
224
+ "defaults": { "family": "nemotron", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
225
+ "profiles": [
226
+ { "prefix": "nemotron", "tier": "standard", "cost": "low", "bestFor": "NVIDIA-optimized open-weight models" }
227
+ ]
228
+ },
229
+ {
230
+ "provider": "databricks",
231
+ "naming": "dbrx[-{variant}]",
232
+ "rateSource": "https://www.databricks.com/dbrx",
233
+ "rateLookupDate": "2026-04-29",
234
+ "defaults": { "family": "dbrx", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
235
+ "profiles": [
236
+ { "prefix": "dbrx", "tier": "standard", "cost": "low", "bestFor": "mixture-of-experts enterprise models" }
237
+ ]
238
+ },
239
+ {
240
+ "provider": "snowflake",
241
+ "naming": "arctic[-{variant}]",
242
+ "rateSource": "https://www.snowflake.com/en/blog/snowflake-arctic-open-efficient-foundation-language-models-snowflake/",
243
+ "rateLookupDate": "2026-04-29",
244
+ "defaults": { "family": "arctic", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
245
+ "profiles": [
246
+ { "prefix": "arctic", "tier": "standard", "cost": "low", "bestFor": "Dense-MoE hybrid Snowflake models" }
247
+ ]
248
+ },
249
+ {
250
+ "provider": "reka",
251
+ "naming": "reka-{tier}[-{version}]",
252
+ "rateLookupDate": "2026-04-29",
253
+ "defaults": { "family": "reka", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
254
+ "profiles": [
255
+ { "prefix": "reka", "tier": "standard", "cost": "low", "bestFor": "multimodal frontier models" }
256
+ ]
257
+ },
258
+ {
259
+ "provider": "ai2",
260
+ "naming": "olmo-{major}[.{minor}][-{variant}] — fully open (data + code + weights)",
261
+ "rateLookupDate": "2026-04-29",
262
+ "defaults": { "family": "olmo", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
263
+ "profiles": [
264
+ { "prefix": "olmo", "tier": "standard", "cost": "low", "bestFor": "fully open research models from AI2" }
265
+ ]
266
+ },
267
+ {
268
+ "provider": "nous-research",
269
+ "naming": "hermes-{major}[.{minor}][-{variant}]",
270
+ "rateLookupDate": "2026-04-29",
271
+ "defaults": { "family": "hermes", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
272
+ "profiles": [
273
+ { "prefix": "hermes", "tier": "standard", "cost": "low", "bestFor": "fine-tuned open-weight reasoning models" }
274
+ ]
275
+ },
276
+ {
277
+ "provider": "microsoft-wizardlm",
278
+ "naming": "wizardlm-{major}[.{minor}][-{variant}]",
279
+ "rateLookupDate": "2026-04-29",
280
+ "defaults": { "family": "wizardlm", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
281
+ "profiles": [
282
+ { "prefix": "wizardlm", "tier": "standard", "cost": "low", "bestFor": "instruction-following open-weight models" }
283
+ ]
284
+ },
285
+ {
286
+ "provider": "bigcode",
287
+ "naming": "starcoder{generation}[-{variant}]",
288
+ "rateSource": "https://huggingface.co/bigcode",
289
+ "rateLookupDate": "2026-04-29",
290
+ "defaults": { "family": "starcoder", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
291
+ "profiles": [
292
+ { "prefix": "starcoder", "tier": "standard", "cost": "low", "bestFor": "code-generation open-weight models" }
293
+ ]
294
+ },
295
+ {
296
+ "provider": "cognitive-computations",
297
+ "naming": "dolphin-{major}[.{minor}][-{variant}]",
298
+ "rateLookupDate": "2026-04-29",
299
+ "defaults": { "family": "dolphin", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
300
+ "profiles": [
301
+ { "prefix": "dolphin", "tier": "standard", "cost": "low", "bestFor": "uncensored open-weight models" }
302
+ ]
303
+ },
304
+ {
305
+ "provider": "openchat",
306
+ "naming": "openchat-{major}[.{minor}][-{variant}]",
307
+ "rateLookupDate": "2026-04-29",
308
+ "defaults": { "family": "openchat", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
309
+ "profiles": [
310
+ { "prefix": "openchat", "tier": "standard", "cost": "low", "bestFor": "open-source chat-tuned models" }
311
+ ]
312
+ },
313
+ {
314
+ "provider": "lmsys",
315
+ "naming": "vicuna-{major}[b][-{variant}]",
316
+ "rateLookupDate": "2026-04-29",
317
+ "defaults": { "family": "vicuna", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
318
+ "profiles": [
319
+ { "prefix": "vicuna", "tier": "standard", "cost": "low", "bestFor": "LLaMA-finetuned chat models from LMSYS" }
320
+ ]
321
+ },
322
+ {
323
+ "provider": "shanghai-ai-lab",
324
+ "naming": "internlm{major}[.{minor}][-{variant}]",
325
+ "rateLookupDate": "2026-04-29",
326
+ "defaults": { "family": "internlm", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
327
+ "profiles": [
328
+ { "prefix": "internlm", "tier": "standard", "cost": "low", "bestFor": "multilingual Chinese/English open-weight models" }
329
+ ]
330
+ },
331
+ {
332
+ "provider": "baichuan",
333
+ "naming": "baichuan{generation}[-{variant}]",
334
+ "rateLookupDate": "2026-04-29",
335
+ "defaults": { "family": "baichuan", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
336
+ "profiles": [
337
+ { "prefix": "baichuan", "tier": "standard", "cost": "low", "bestFor": "Chinese-language open-weight models" }
338
+ ]
150
339
  }
151
340
  ]
@@ -214,9 +214,9 @@ export declare const VerifySkippedEvent: z.ZodObject<{
214
214
  event: z.ZodLiteral<"verify_skipped">;
215
215
  reason: z.ZodEnum<{
216
216
  no_command: "no_command";
217
+ other: "other";
217
218
  not_applicable: "not_applicable";
218
219
  dirty_worktree: "dirty_worktree";
219
- other: "other";
220
220
  }>;
221
221
  stage: z.ZodString;
222
222
  }, z.core.$strict>;
@@ -370,9 +370,9 @@ export declare const StageStatsMapSchema: z.ZodObject<{
370
370
  }>>;
371
371
  skipReason: z.ZodNullable<z.ZodEnum<{
372
372
  no_command: "no_command";
373
+ other: "other";
373
374
  not_applicable: "not_applicable";
374
375
  dirty_worktree: "dirty_worktree";
375
- other: "other";
376
376
  }>>;
377
377
  }, z.core.$strip>;
378
378
  spec_review: z.ZodObject<{
@@ -847,9 +847,9 @@ export declare const Event: z.ZodDiscriminatedUnion<[z.ZodObject<{
847
847
  event: z.ZodLiteral<"verify_skipped">;
848
848
  reason: z.ZodEnum<{
849
849
  no_command: "no_command";
850
+ other: "other";
850
851
  not_applicable: "not_applicable";
851
852
  dirty_worktree: "dirty_worktree";
852
- other: "other";
853
853
  }>;
854
854
  stage: z.ZodString;
855
855
  }, z.core.$strict>, z.ZodObject<{
@@ -28,6 +28,15 @@ export interface QualityReviewResult {
28
28
  findings: string[];
29
29
  errorReason?: string;
30
30
  reason?: string;
31
+ /** Per-stage telemetry metrics from the review provider call. */
32
+ metrics?: QualityReviewMetrics;
33
+ }
34
+ export interface QualityReviewMetrics {
35
+ inputTokens: number;
36
+ outputTokens: number;
37
+ turnCount: number;
38
+ toolCallCount: number;
39
+ costUSD: number;
31
40
  }
32
41
  /** Backward-compat alias kept until reviewed-lifecycle is migrated to the new shape (Task 6). */
33
42
  export type LegacyQualityReviewResult = QualityReviewResult;
@@ -1 +1 @@
1
- {"version":3,"file":"quality-reviewer.d.ts","sourceRoot":"","sources":["../../src/review/quality-reviewer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAEhF,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,yCAAyC,CAAC;AAEjD;;;;;;;;GAQG;AACH;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,eAAe,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;IACxI,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,iGAAiG;AACjG,MAAM,MAAM,yBAAyB,GAAG,mBAAmB,CAAC;AAkB5D;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,EAAE,GAAG,IAAI,CAalF;AAED,UAAU,iBAAiB;IACzB,EAAE,EAAE,IAAI,CAAC;IACT,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AACD,UAAU,kBAAkB;IAC1B,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,aAAa,EAAE,GAC9B,iBAAiB,GAAG,kBAAkB,CAiDxC;AAED,wBAAsB,gBAAgB,CACpC,gBAAgB,EAAE,QAAQ,EAC1B,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,EAClE,UAAU,EAAE,sBAAsB,EAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,MAAM,EAAE,EACtB,aAAa,CAAC,EAAE,MAAM,EACtB,0BAA0B,CAAC,EAAE,CAAC,GAAG,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,aAAa,EAAE,CAAA;CAAE,KAAK,MAAM,EACtH,YAAY,CAAC,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,WAAW,EACzB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,qBAAqB,EAAE,mBAAmB,KAAK,IAAI,GAC1E,OAAO,CAAC,mBAAmB,CAAC,CA8D9B"}
1
+ {"version":3,"file":"quality-reviewer.d.ts","sourceRoot":"","sources":["../../src/review/quality-reviewer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAEhF,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,yCAAyC,CAAC;AAEjD;;;;;;;;GAQG;AACH;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,eAAe,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;IACxI,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAsBD,iGAAiG;AACjG,MAAM,MAAM,yBAAyB,GAAG,mBAAmB,CAAC;AAkB5D;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,EAAE,GAAG,IAAI,CAalF;AAED,UAAU,iBAAiB;IACzB,EAAE,EAAE,IAAI,CAAC;IACT,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AACD,UAAU,kBAAkB;IAC1B,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,aAAa,EAAE,GAC9B,iBAAiB,GAAG,kBAAkB,CAiDxC;AAED,wBAAsB,gBAAgB,CACpC,gBAAgB,EAAE,QAAQ,EAC1B,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,EAClE,UAAU,EAAE,sBAAsB,EAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,MAAM,EAAE,EACtB,aAAa,CAAC,EAAE,MAAM,EACtB,0BAA0B,CAAC,EAAE,CAAC,GAAG,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,aAAa,EAAE,CAAA;CAAE,KAAK,MAAM,EACtH,YAAY,CAAC,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,WAAW,EACzB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,qBAAqB,EAAE,mBAAmB,KAAK,IAAI,GAC1E,OAAO,CAAC,mBAAmB,CAAC,CAkE9B"}
@@ -3,6 +3,24 @@ import { delegateWithEscalation } from '../delegate-with-escalation.js';
3
3
  import { buildQualityReviewPrompt } from './reviewer-prompt.js';
4
4
  import { parseStructuredReport } from '../reporting/structured-report.js';
5
5
  import { workerFindingsSchema, } from '../executors/_shared/findings-schema.js';
6
+ function extractMetrics(r) {
7
+ return {
8
+ inputTokens: r.usage?.inputTokens ?? 0,
9
+ outputTokens: r.usage?.outputTokens ?? 0,
10
+ turnCount: r.turns ?? 0,
11
+ toolCallCount: r.toolCalls?.length ?? 0,
12
+ costUSD: r.usage?.costUSD ?? 0,
13
+ };
14
+ }
15
+ function addMetrics(a, b) {
16
+ return {
17
+ inputTokens: a.inputTokens + b.inputTokens,
18
+ outputTokens: a.outputTokens + b.outputTokens,
19
+ turnCount: a.turnCount + b.turnCount,
20
+ toolCallCount: a.toolCallCount + b.toolCallCount,
21
+ costUSD: a.costUSD + b.costUSD,
22
+ };
23
+ }
6
24
  const annotationItemSchema = z.object({
7
25
  id: z.string().min(1),
8
26
  reviewerConfidence: z.number().int().min(0).max(100),
@@ -108,9 +126,11 @@ export async function runQualityReview(reviewerProvider, packet, implReport, fil
108
126
  const corePrompt = buildQualityReviewPrompt(packet, implReport, fileContents, toolCallLog);
109
127
  const prompt = (evidenceBlock ? `${evidenceBlock}\n\n` : '') + corePrompt;
110
128
  const reviewerSlot = reviewerProvider.name === 'standard' ? 'standard' : 'complex';
129
+ let metrics = { inputTokens: 0, outputTokens: 0, turnCount: 0, toolCallCount: 0, costUSD: 0 };
111
130
  let result;
112
131
  try {
113
132
  result = await delegateWithEscalation({ prompt, agentType: reviewerSlot, briefQualityPolicy: 'off', timeoutMs: 120_000 }, [reviewerProvider], { explicitlyPinned: true, taskDeadlineMs, abortSignal, onProgress });
133
+ metrics = extractMetrics(result);
114
134
  }
115
135
  catch (err) {
116
136
  return { status: 'error', findings: [], errorReason: `review agent threw: ${err instanceof Error ? err.message : String(err)}` };
@@ -119,7 +139,7 @@ export async function runQualityReview(reviewerProvider, packet, implReport, fil
119
139
  if (result.status === 'api_error' || result.status === 'network_error' || result.status === 'timeout' || result.status === 'api_aborted') {
120
140
  return { status: result.status, findings: [], errorReason: `review agent returned status: ${result.status}` };
121
141
  }
122
- return { status: 'error', findings: [], errorReason: `review agent returned status: ${result.status}` };
142
+ return { status: 'error', findings: [], errorReason: `review agent returned status: ${result.status}`, metrics };
123
143
  }
124
144
  let report = parseStructuredReport(result.output);
125
145
  if (!report.summary) {
@@ -128,12 +148,13 @@ export async function runQualityReview(reviewerProvider, packet, implReport, fil
128
148
  prompt: prompt + '\n\nIMPORTANT: Your response MUST begin with a "## Summary" section containing either "approved" or "changes_required". Follow this exact format.',
129
149
  agentType: reviewerSlot, briefQualityPolicy: 'off', timeoutMs: 120_000,
130
150
  }, [reviewerProvider], { explicitlyPinned: true, taskDeadlineMs, abortSignal, onProgress });
151
+ metrics = addMetrics(metrics, extractMetrics(retryResult));
131
152
  if (retryResult.status === 'ok')
132
153
  report = parseStructuredReport(retryResult.output);
133
154
  }
134
155
  catch { /* fall through */ }
135
156
  if (!report.summary) {
136
- return { status: 'error', findings: [], errorReason: 'reviewer output missing ## Summary section (after retry)' };
157
+ return { status: 'error', findings: [], errorReason: 'reviewer output missing ## Summary section (after retry)', metrics };
137
158
  }
138
159
  }
139
160
  const summaryLower = report.summary.toLowerCase();
@@ -142,9 +163,10 @@ export async function runQualityReview(reviewerProvider, packet, implReport, fil
142
163
  status: 'changes_required',
143
164
  report,
144
165
  findings: [...(report.deviationsFromBrief ?? []), ...(report.unresolved ?? [])],
166
+ metrics,
145
167
  };
146
168
  }
147
- return { status: 'approved', report, findings: [] };
169
+ return { status: 'approved', report, findings: [], metrics };
148
170
  }
149
171
  async function runAnnotationReview(reviewerProvider, packet, workerOutput, qualityReviewPromptBuilder, taskDeadlineMs, abortSignal, onProgress) {
150
172
  // Step 1: extract worker findings from worker output.
@@ -168,8 +190,10 @@ async function runAnnotationReview(reviewerProvider, packet, workerOutput, quali
168
190
  const prompt = qualityReviewPromptBuilder({ workerOutput, brief: packet.prompt, workerFindings });
169
191
  const reviewerSlot = reviewerProvider.name === 'standard' ? 'standard' : 'complex';
170
192
  let result;
193
+ let metrics = { inputTokens: 0, outputTokens: 0, turnCount: 0, toolCallCount: 0, costUSD: 0 };
171
194
  try {
172
195
  result = await delegateWithEscalation({ prompt, agentType: reviewerSlot, briefQualityPolicy: 'off', timeoutMs: 120_000 }, [reviewerProvider], { explicitlyPinned: true, taskDeadlineMs, abortSignal, onProgress });
196
+ metrics = extractMetrics(result);
173
197
  }
174
198
  catch (err) {
175
199
  return {
@@ -180,23 +204,25 @@ async function runAnnotationReview(reviewerProvider, packet, workerOutput, quali
180
204
  }
181
205
  if (result.status !== 'ok') {
182
206
  if (result.status === 'api_error' || result.status === 'network_error' || result.status === 'timeout' || result.status === 'api_aborted') {
183
- return { status: result.status, findings: [], errorReason: `review agent returned status: ${result.status}` };
207
+ return { status: result.status, findings: [], errorReason: `review agent returned status: ${result.status}`, metrics };
184
208
  }
185
209
  return {
186
210
  status: 'error',
187
211
  findings: [],
188
212
  errorReason: `review agent returned status: ${result.status}`,
213
+ metrics,
189
214
  };
190
215
  }
191
216
  // Step 4: parse + validate + merge annotations.
192
217
  const merged = parseAndMergeAnnotations(result.output, workerFindings);
193
218
  if (!merged.ok) {
194
- return { status: 'error', findings: [], errorReason: merged.reason };
219
+ return { status: 'error', findings: [], errorReason: merged.reason, metrics };
195
220
  }
196
221
  return {
197
222
  status: 'annotated',
198
223
  annotatedFindings: merged.annotated,
199
224
  findings: [],
225
+ metrics,
200
226
  };
201
227
  }
202
228
  //# sourceMappingURL=quality-reviewer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"quality-reviewer.js","sourceRoot":"","sources":["../../src/review/quality-reviewer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"quality-reviewer.js","sourceRoot":"","sources":["../../src/review/quality-reviewer.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,15 @@ export interface SpecReviewResult {
7
7
  findings: string[];
8
8
  errorReason?: string;
9
9
  reason?: string;
10
+ /** Per-stage telemetry metrics from the review provider call. */
11
+ metrics?: SpecReviewMetrics;
12
+ }
13
+ export interface SpecReviewMetrics {
14
+ inputTokens: number;
15
+ outputTokens: number;
16
+ turnCount: number;
17
+ toolCallCount: number;
18
+ costUSD: number;
10
19
  }
11
20
  export type SpecReviewOrSkipped = SpecReviewResult | SkippedReviewResult;
12
21
  export declare function runSpecReview(reviewerProvider: Provider, packet: {
@@ -1 +1 @@
1
- {"version":3,"file":"spec-reviewer.d.ts","sourceRoot":"","sources":["../../src/review/spec-reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAEhF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,OAAO,GAAG,WAAW,GAAG,eAAe,GAAG,SAAS,CAAC;IAC9F,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAEzE,wBAAsB,aAAa,CACjC,gBAAgB,EAAE,QAAQ,EAC1B,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,EAClE,UAAU,EAAE,sBAAsB,EAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,WAAW,EAAE,MAAM,EAAE,EACrB,WAAW,CAAC,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,MAAM,EACtB,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,WAAW,EACzB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,qBAAqB,EAAE,mBAAmB,KAAK,IAAI,GAC1E,OAAO,CAAC,gBAAgB,CAAC,CAqE3B"}
1
+ {"version":3,"file":"spec-reviewer.d.ts","sourceRoot":"","sources":["../../src/review/spec-reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAEhF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,OAAO,GAAG,WAAW,GAAG,eAAe,GAAG,SAAS,CAAC;IAC9F,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAsBzE,wBAAsB,aAAa,CACjC,gBAAgB,EAAE,QAAQ,EAC1B,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,EAClE,UAAU,EAAE,sBAAsB,EAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,WAAW,EAAE,MAAM,EAAE,EACrB,WAAW,CAAC,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,MAAM,EACtB,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,WAAW,EACzB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,qBAAqB,EAAE,mBAAmB,KAAK,IAAI,GAC1E,OAAO,CAAC,gBAAgB,CAAC,CAyE3B"}
@@ -1,11 +1,30 @@
1
1
  import { delegateWithEscalation } from '../delegate-with-escalation.js';
2
2
  import { buildSpecReviewPrompt } from './reviewer-prompt.js';
3
3
  import { parseStructuredReport } from '../reporting/structured-report.js';
4
+ function extractMetrics(r) {
5
+ return {
6
+ inputTokens: r.usage?.inputTokens ?? 0,
7
+ outputTokens: r.usage?.outputTokens ?? 0,
8
+ turnCount: r.turns ?? 0,
9
+ toolCallCount: r.toolCalls?.length ?? 0,
10
+ costUSD: r.usage?.costUSD ?? 0,
11
+ };
12
+ }
13
+ function addMetrics(a, b) {
14
+ return {
15
+ inputTokens: a.inputTokens + b.inputTokens,
16
+ outputTokens: a.outputTokens + b.outputTokens,
17
+ turnCount: a.turnCount + b.turnCount,
18
+ toolCallCount: a.toolCallCount + b.toolCallCount,
19
+ costUSD: a.costUSD + b.costUSD,
20
+ };
21
+ }
4
22
  export async function runSpecReview(reviewerProvider, packet, implReport, fileContents, toolCallLog, planContext, evidenceBlock, taskDeadlineMs, abortSignal, onProgress) {
5
23
  const prompt = (evidenceBlock ? `${evidenceBlock}\n\n` : '') +
6
24
  buildSpecReviewPrompt(packet, implReport, fileContents, toolCallLog, planContext);
7
25
  const reviewerSlot = reviewerProvider.name === 'standard' ? 'standard' : 'complex';
8
26
  const delegateOpts = { explicitlyPinned: true, taskDeadlineMs, abortSignal, onProgress };
27
+ let metrics = { inputTokens: 0, outputTokens: 0, turnCount: 0, toolCallCount: 0, costUSD: 0 };
9
28
  let result;
10
29
  try {
11
30
  result = await delegateWithEscalation({
@@ -14,6 +33,7 @@ export async function runSpecReview(reviewerProvider, packet, implReport, fileCo
14
33
  briefQualityPolicy: 'off',
15
34
  timeoutMs: 120_000,
16
35
  }, [reviewerProvider], delegateOpts);
36
+ metrics = extractMetrics(result);
17
37
  }
18
38
  catch (err) {
19
39
  return { status: 'error', findings: [], errorReason: `review agent threw: ${err instanceof Error ? err.message : String(err)}` };
@@ -22,7 +42,7 @@ export async function runSpecReview(reviewerProvider, packet, implReport, fileCo
22
42
  if (result.status === 'api_error' || result.status === 'network_error' || result.status === 'timeout') {
23
43
  return { status: result.status, findings: [], errorReason: `review agent returned status: ${result.status}` };
24
44
  }
25
- return { status: 'error', findings: [], errorReason: `review agent returned status: ${result.status}` };
45
+ return { status: 'error', findings: [], errorReason: `review agent returned status: ${result.status}`, metrics };
26
46
  }
27
47
  // Design note: we only check summary presence, not full structured format.
28
48
  // After Task 2's lenient parsing, most reviewer outputs will parse successfully — that's the goal.
@@ -38,13 +58,14 @@ export async function runSpecReview(reviewerProvider, packet, implReport, fileCo
38
58
  briefQualityPolicy: 'off',
39
59
  timeoutMs: 120_000,
40
60
  }, [reviewerProvider], delegateOpts);
61
+ metrics = addMetrics(metrics, extractMetrics(retryResult));
41
62
  if (retryResult.status === 'ok') {
42
63
  report = parseStructuredReport(retryResult.output);
43
64
  }
44
65
  }
45
66
  catch { /* fall through to error */ }
46
67
  if (!report.summary) {
47
- return { status: 'error', findings: [], errorReason: 'reviewer output missing ## Summary section (after retry)' };
68
+ return { status: 'error', findings: [], errorReason: 'reviewer output missing ## Summary section (after retry)', metrics };
48
69
  }
49
70
  }
50
71
  const summaryLower = report.summary.toLowerCase();
@@ -53,8 +74,9 @@ export async function runSpecReview(reviewerProvider, packet, implReport, fileCo
53
74
  status: 'changes_required',
54
75
  report,
55
76
  findings: [...(report.deviationsFromBrief ?? []), ...(report.unresolved ?? [])],
77
+ metrics,
56
78
  };
57
79
  }
58
- return { status: 'approved', report, findings: [] };
80
+ return { status: 'approved', report, findings: [], metrics };
59
81
  }
60
82
  //# sourceMappingURL=spec-reviewer.js.map