@peakinfer/cli 1.0.133

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 (367) hide show
  1. package/.claude/settings.local.json +8 -0
  2. package/.env.example +6 -0
  3. package/.github/workflows/peakinfer.yml +64 -0
  4. package/CHANGELOG.md +31 -0
  5. package/LICENSE +190 -0
  6. package/README.md +335 -0
  7. package/data/inferencemax.json +274 -0
  8. package/dist/agent-analyzer.d.ts +45 -0
  9. package/dist/agent-analyzer.d.ts.map +1 -0
  10. package/dist/agent-analyzer.js +374 -0
  11. package/dist/agent-analyzer.js.map +1 -0
  12. package/dist/agent.d.ts +76 -0
  13. package/dist/agent.d.ts.map +1 -0
  14. package/dist/agent.js +965 -0
  15. package/dist/agent.js.map +1 -0
  16. package/dist/agents/correlation-analyzer.d.ts +34 -0
  17. package/dist/agents/correlation-analyzer.d.ts.map +1 -0
  18. package/dist/agents/correlation-analyzer.js +261 -0
  19. package/dist/agents/correlation-analyzer.js.map +1 -0
  20. package/dist/agents/index.d.ts +91 -0
  21. package/dist/agents/index.d.ts.map +1 -0
  22. package/dist/agents/index.js +111 -0
  23. package/dist/agents/index.js.map +1 -0
  24. package/dist/agents/runtime-analyzer.d.ts +38 -0
  25. package/dist/agents/runtime-analyzer.d.ts.map +1 -0
  26. package/dist/agents/runtime-analyzer.js +244 -0
  27. package/dist/agents/runtime-analyzer.js.map +1 -0
  28. package/dist/analysis-types.d.ts +500 -0
  29. package/dist/analysis-types.d.ts.map +1 -0
  30. package/dist/analysis-types.js +11 -0
  31. package/dist/analysis-types.js.map +1 -0
  32. package/dist/analytics.d.ts +25 -0
  33. package/dist/analytics.d.ts.map +1 -0
  34. package/dist/analytics.js +94 -0
  35. package/dist/analytics.js.map +1 -0
  36. package/dist/analyzer.d.ts +48 -0
  37. package/dist/analyzer.d.ts.map +1 -0
  38. package/dist/analyzer.js +547 -0
  39. package/dist/analyzer.js.map +1 -0
  40. package/dist/artifacts.d.ts +44 -0
  41. package/dist/artifacts.d.ts.map +1 -0
  42. package/dist/artifacts.js +165 -0
  43. package/dist/artifacts.js.map +1 -0
  44. package/dist/benchmarks/index.d.ts +88 -0
  45. package/dist/benchmarks/index.d.ts.map +1 -0
  46. package/dist/benchmarks/index.js +205 -0
  47. package/dist/benchmarks/index.js.map +1 -0
  48. package/dist/cli.d.ts +3 -0
  49. package/dist/cli.d.ts.map +1 -0
  50. package/dist/cli.js +427 -0
  51. package/dist/cli.js.map +1 -0
  52. package/dist/commands/ci.d.ts +19 -0
  53. package/dist/commands/ci.d.ts.map +1 -0
  54. package/dist/commands/ci.js +253 -0
  55. package/dist/commands/ci.js.map +1 -0
  56. package/dist/commands/config.d.ts +16 -0
  57. package/dist/commands/config.d.ts.map +1 -0
  58. package/dist/commands/config.js +249 -0
  59. package/dist/commands/config.js.map +1 -0
  60. package/dist/commands/demo.d.ts +15 -0
  61. package/dist/commands/demo.d.ts.map +1 -0
  62. package/dist/commands/demo.js +106 -0
  63. package/dist/commands/demo.js.map +1 -0
  64. package/dist/commands/export.d.ts +14 -0
  65. package/dist/commands/export.d.ts.map +1 -0
  66. package/dist/commands/export.js +209 -0
  67. package/dist/commands/export.js.map +1 -0
  68. package/dist/commands/history.d.ts +15 -0
  69. package/dist/commands/history.d.ts.map +1 -0
  70. package/dist/commands/history.js +389 -0
  71. package/dist/commands/history.js.map +1 -0
  72. package/dist/commands/template.d.ts +14 -0
  73. package/dist/commands/template.d.ts.map +1 -0
  74. package/dist/commands/template.js +341 -0
  75. package/dist/commands/template.js.map +1 -0
  76. package/dist/commands/validate-map.d.ts +12 -0
  77. package/dist/commands/validate-map.d.ts.map +1 -0
  78. package/dist/commands/validate-map.js +274 -0
  79. package/dist/commands/validate-map.js.map +1 -0
  80. package/dist/commands/whatif.d.ts +17 -0
  81. package/dist/commands/whatif.d.ts.map +1 -0
  82. package/dist/commands/whatif.js +206 -0
  83. package/dist/commands/whatif.js.map +1 -0
  84. package/dist/comparison.d.ts +38 -0
  85. package/dist/comparison.d.ts.map +1 -0
  86. package/dist/comparison.js +223 -0
  87. package/dist/comparison.js.map +1 -0
  88. package/dist/config.d.ts +42 -0
  89. package/dist/config.d.ts.map +1 -0
  90. package/dist/config.js +158 -0
  91. package/dist/config.js.map +1 -0
  92. package/dist/connectors/helicone.d.ts +9 -0
  93. package/dist/connectors/helicone.d.ts.map +1 -0
  94. package/dist/connectors/helicone.js +106 -0
  95. package/dist/connectors/helicone.js.map +1 -0
  96. package/dist/connectors/index.d.ts +37 -0
  97. package/dist/connectors/index.d.ts.map +1 -0
  98. package/dist/connectors/index.js +65 -0
  99. package/dist/connectors/index.js.map +1 -0
  100. package/dist/connectors/langsmith.d.ts +9 -0
  101. package/dist/connectors/langsmith.d.ts.map +1 -0
  102. package/dist/connectors/langsmith.js +122 -0
  103. package/dist/connectors/langsmith.js.map +1 -0
  104. package/dist/connectors/types.d.ts +83 -0
  105. package/dist/connectors/types.d.ts.map +1 -0
  106. package/dist/connectors/types.js +98 -0
  107. package/dist/connectors/types.js.map +1 -0
  108. package/dist/cost-estimator.d.ts +46 -0
  109. package/dist/cost-estimator.d.ts.map +1 -0
  110. package/dist/cost-estimator.js +104 -0
  111. package/dist/cost-estimator.js.map +1 -0
  112. package/dist/costs.d.ts +57 -0
  113. package/dist/costs.d.ts.map +1 -0
  114. package/dist/costs.js +251 -0
  115. package/dist/costs.js.map +1 -0
  116. package/dist/counterfactuals.d.ts +29 -0
  117. package/dist/counterfactuals.d.ts.map +1 -0
  118. package/dist/counterfactuals.js +448 -0
  119. package/dist/counterfactuals.js.map +1 -0
  120. package/dist/enhancement-prompts.d.ts +41 -0
  121. package/dist/enhancement-prompts.d.ts.map +1 -0
  122. package/dist/enhancement-prompts.js +88 -0
  123. package/dist/enhancement-prompts.js.map +1 -0
  124. package/dist/envelopes.d.ts +20 -0
  125. package/dist/envelopes.d.ts.map +1 -0
  126. package/dist/envelopes.js +790 -0
  127. package/dist/envelopes.js.map +1 -0
  128. package/dist/format-normalizer.d.ts +71 -0
  129. package/dist/format-normalizer.d.ts.map +1 -0
  130. package/dist/format-normalizer.js +1331 -0
  131. package/dist/format-normalizer.js.map +1 -0
  132. package/dist/history.d.ts +79 -0
  133. package/dist/history.d.ts.map +1 -0
  134. package/dist/history.js +313 -0
  135. package/dist/history.js.map +1 -0
  136. package/dist/html.d.ts +11 -0
  137. package/dist/html.d.ts.map +1 -0
  138. package/dist/html.js +463 -0
  139. package/dist/html.js.map +1 -0
  140. package/dist/impact.d.ts +42 -0
  141. package/dist/impact.d.ts.map +1 -0
  142. package/dist/impact.js +443 -0
  143. package/dist/impact.js.map +1 -0
  144. package/dist/index.d.ts +26 -0
  145. package/dist/index.d.ts.map +1 -0
  146. package/dist/index.js +34 -0
  147. package/dist/index.js.map +1 -0
  148. package/dist/insights.d.ts +5 -0
  149. package/dist/insights.d.ts.map +1 -0
  150. package/dist/insights.js +271 -0
  151. package/dist/insights.js.map +1 -0
  152. package/dist/joiner.d.ts +9 -0
  153. package/dist/joiner.d.ts.map +1 -0
  154. package/dist/joiner.js +247 -0
  155. package/dist/joiner.js.map +1 -0
  156. package/dist/orchestrator.d.ts +34 -0
  157. package/dist/orchestrator.d.ts.map +1 -0
  158. package/dist/orchestrator.js +827 -0
  159. package/dist/orchestrator.js.map +1 -0
  160. package/dist/pdf.d.ts +26 -0
  161. package/dist/pdf.d.ts.map +1 -0
  162. package/dist/pdf.js +84 -0
  163. package/dist/pdf.js.map +1 -0
  164. package/dist/prediction.d.ts +33 -0
  165. package/dist/prediction.d.ts.map +1 -0
  166. package/dist/prediction.js +316 -0
  167. package/dist/prediction.js.map +1 -0
  168. package/dist/prompts/loader.d.ts +38 -0
  169. package/dist/prompts/loader.d.ts.map +1 -0
  170. package/dist/prompts/loader.js +60 -0
  171. package/dist/prompts/loader.js.map +1 -0
  172. package/dist/renderer.d.ts +64 -0
  173. package/dist/renderer.d.ts.map +1 -0
  174. package/dist/renderer.js +923 -0
  175. package/dist/renderer.js.map +1 -0
  176. package/dist/runid.d.ts +57 -0
  177. package/dist/runid.d.ts.map +1 -0
  178. package/dist/runid.js +199 -0
  179. package/dist/runid.js.map +1 -0
  180. package/dist/runtime.d.ts +29 -0
  181. package/dist/runtime.d.ts.map +1 -0
  182. package/dist/runtime.js +366 -0
  183. package/dist/runtime.js.map +1 -0
  184. package/dist/scanner.d.ts +11 -0
  185. package/dist/scanner.d.ts.map +1 -0
  186. package/dist/scanner.js +426 -0
  187. package/dist/scanner.js.map +1 -0
  188. package/dist/templates.d.ts +120 -0
  189. package/dist/templates.d.ts.map +1 -0
  190. package/dist/templates.js +429 -0
  191. package/dist/templates.js.map +1 -0
  192. package/dist/tools/index.d.ts +153 -0
  193. package/dist/tools/index.d.ts.map +1 -0
  194. package/dist/tools/index.js +177 -0
  195. package/dist/tools/index.js.map +1 -0
  196. package/dist/types.d.ts +3647 -0
  197. package/dist/types.d.ts.map +1 -0
  198. package/dist/types.js +703 -0
  199. package/dist/types.js.map +1 -0
  200. package/dist/version.d.ts +7 -0
  201. package/dist/version.d.ts.map +1 -0
  202. package/dist/version.js +23 -0
  203. package/dist/version.js.map +1 -0
  204. package/docs/demo-guide.md +423 -0
  205. package/docs/events-format.md +295 -0
  206. package/docs/inferencemap-spec.md +344 -0
  207. package/docs/migration-v2.md +293 -0
  208. package/fixtures/demo/precomputed.json +142 -0
  209. package/fixtures/demo-project/README.md +52 -0
  210. package/fixtures/demo-project/ai-service.ts +65 -0
  211. package/fixtures/demo-project/sample-events.jsonl +15 -0
  212. package/fixtures/demo-project/src/ai-service.ts +128 -0
  213. package/fixtures/demo-project/src/llm-client.ts +155 -0
  214. package/package.json +65 -0
  215. package/prompts/agent-analyzer.yaml +47 -0
  216. package/prompts/ci-gate.yaml +98 -0
  217. package/prompts/correlation-analyzer.yaml +178 -0
  218. package/prompts/format-normalizer.yaml +46 -0
  219. package/prompts/peak-performance.yaml +180 -0
  220. package/prompts/pr-comment.yaml +111 -0
  221. package/prompts/runtime-analyzer.yaml +189 -0
  222. package/prompts/unified-analyzer.yaml +241 -0
  223. package/schemas/inference-map.v0.1.json +215 -0
  224. package/scripts/benchmark.ts +394 -0
  225. package/scripts/demo-v1.5.sh +158 -0
  226. package/scripts/sync-from-site.sh +197 -0
  227. package/scripts/validate-sync.sh +178 -0
  228. package/src/agent-analyzer.ts +481 -0
  229. package/src/agent.ts +1232 -0
  230. package/src/agents/correlation-analyzer.ts +353 -0
  231. package/src/agents/index.ts +235 -0
  232. package/src/agents/runtime-analyzer.ts +343 -0
  233. package/src/analysis-types.ts +558 -0
  234. package/src/analytics.ts +100 -0
  235. package/src/analyzer.ts +692 -0
  236. package/src/artifacts.ts +218 -0
  237. package/src/benchmarks/index.ts +309 -0
  238. package/src/cli.ts +503 -0
  239. package/src/commands/ci.ts +336 -0
  240. package/src/commands/config.ts +288 -0
  241. package/src/commands/demo.ts +175 -0
  242. package/src/commands/export.ts +297 -0
  243. package/src/commands/history.ts +425 -0
  244. package/src/commands/template.ts +385 -0
  245. package/src/commands/validate-map.ts +324 -0
  246. package/src/commands/whatif.ts +272 -0
  247. package/src/comparison.ts +283 -0
  248. package/src/config.ts +188 -0
  249. package/src/connectors/helicone.ts +164 -0
  250. package/src/connectors/index.ts +93 -0
  251. package/src/connectors/langsmith.ts +179 -0
  252. package/src/connectors/types.ts +180 -0
  253. package/src/cost-estimator.ts +146 -0
  254. package/src/costs.ts +347 -0
  255. package/src/counterfactuals.ts +516 -0
  256. package/src/enhancement-prompts.ts +118 -0
  257. package/src/envelopes.ts +814 -0
  258. package/src/format-normalizer.ts +1486 -0
  259. package/src/history.ts +400 -0
  260. package/src/html.ts +512 -0
  261. package/src/impact.ts +522 -0
  262. package/src/index.ts +83 -0
  263. package/src/insights.ts +341 -0
  264. package/src/joiner.ts +289 -0
  265. package/src/orchestrator.ts +1015 -0
  266. package/src/pdf.ts +110 -0
  267. package/src/prediction.ts +392 -0
  268. package/src/prompts/loader.ts +88 -0
  269. package/src/renderer.ts +1045 -0
  270. package/src/runid.ts +261 -0
  271. package/src/runtime.ts +450 -0
  272. package/src/scanner.ts +508 -0
  273. package/src/templates.ts +561 -0
  274. package/src/tools/index.ts +214 -0
  275. package/src/types.ts +873 -0
  276. package/src/version.ts +24 -0
  277. package/templates/context-accumulation.yaml +23 -0
  278. package/templates/cost-concentration.yaml +20 -0
  279. package/templates/dead-code.yaml +20 -0
  280. package/templates/latency-explainer.yaml +23 -0
  281. package/templates/optimizations/ab-testing-framework.yaml +74 -0
  282. package/templates/optimizations/api-gateway-optimization.yaml +81 -0
  283. package/templates/optimizations/api-model-routing-strategy.yaml +126 -0
  284. package/templates/optimizations/auto-scaling-optimization.yaml +85 -0
  285. package/templates/optimizations/batch-utilization-diagnostic.yaml +142 -0
  286. package/templates/optimizations/comprehensive-apm.yaml +76 -0
  287. package/templates/optimizations/context-window-optimization.yaml +91 -0
  288. package/templates/optimizations/cost-sensitive-batch-processing.yaml +77 -0
  289. package/templates/optimizations/distributed-training-optimization.yaml +77 -0
  290. package/templates/optimizations/document-analysis-edge.yaml +77 -0
  291. package/templates/optimizations/document-pipeline-optimization.yaml +78 -0
  292. package/templates/optimizations/domain-specific-distillation.yaml +78 -0
  293. package/templates/optimizations/error-handling-optimization.yaml +76 -0
  294. package/templates/optimizations/gptq-4bit-quantization.yaml +96 -0
  295. package/templates/optimizations/long-context-memory-management.yaml +78 -0
  296. package/templates/optimizations/max-tokens-optimization.yaml +76 -0
  297. package/templates/optimizations/memory-bandwidth-optimization.yaml +73 -0
  298. package/templates/optimizations/multi-framework-resilience.yaml +75 -0
  299. package/templates/optimizations/multi-tenant-optimization.yaml +75 -0
  300. package/templates/optimizations/prompt-caching-optimization.yaml +143 -0
  301. package/templates/optimizations/pytorch-to-onnx-migration.yaml +109 -0
  302. package/templates/optimizations/quality-monitoring.yaml +74 -0
  303. package/templates/optimizations/realtime-budget-controls.yaml +74 -0
  304. package/templates/optimizations/realtime-latency-optimization.yaml +74 -0
  305. package/templates/optimizations/sglang-concurrency-optimization.yaml +78 -0
  306. package/templates/optimizations/smart-model-routing.yaml +96 -0
  307. package/templates/optimizations/streaming-batch-selection.yaml +167 -0
  308. package/templates/optimizations/system-prompt-optimization.yaml +75 -0
  309. package/templates/optimizations/tensorrt-llm-performance.yaml +77 -0
  310. package/templates/optimizations/vllm-high-throughput-optimization.yaml +93 -0
  311. package/templates/optimizations/vllm-migration-memory-bound.yaml +78 -0
  312. package/templates/overpowered-extraction.yaml +32 -0
  313. package/templates/overpowered-model.yaml +31 -0
  314. package/templates/prompt-bloat.yaml +24 -0
  315. package/templates/retry-explosion.yaml +28 -0
  316. package/templates/schema/insight.schema.json +113 -0
  317. package/templates/schema/optimization.schema.json +180 -0
  318. package/templates/streaming-drift.yaml +30 -0
  319. package/templates/throughput-gap.yaml +21 -0
  320. package/templates/token-underutilization.yaml +28 -0
  321. package/templates/untested-fallback.yaml +21 -0
  322. package/tests/accuracy/drift-detection.test.ts +184 -0
  323. package/tests/accuracy/false-positives.test.ts +166 -0
  324. package/tests/accuracy/templates.test.ts +205 -0
  325. package/tests/action/commands.test.ts +125 -0
  326. package/tests/action/comments.test.ts +347 -0
  327. package/tests/cli.test.ts +203 -0
  328. package/tests/comparison.test.ts +309 -0
  329. package/tests/correlation-analyzer.test.ts +534 -0
  330. package/tests/counterfactuals.test.ts +347 -0
  331. package/tests/fixtures/events/missing-id.jsonl +1 -0
  332. package/tests/fixtures/events/missing-input.jsonl +1 -0
  333. package/tests/fixtures/events/missing-latency.jsonl +1 -0
  334. package/tests/fixtures/events/missing-model.jsonl +1 -0
  335. package/tests/fixtures/events/missing-output.jsonl +1 -0
  336. package/tests/fixtures/events/missing-provider.jsonl +1 -0
  337. package/tests/fixtures/events/missing-ts.jsonl +1 -0
  338. package/tests/fixtures/events/valid.csv +3 -0
  339. package/tests/fixtures/events/valid.json +1 -0
  340. package/tests/fixtures/events/valid.jsonl +2 -0
  341. package/tests/fixtures/events/with-callsite.jsonl +1 -0
  342. package/tests/fixtures/events/with-intent.jsonl +1 -0
  343. package/tests/fixtures/events/wrong-type.jsonl +1 -0
  344. package/tests/fixtures/repos/empty/.gitkeep +0 -0
  345. package/tests/fixtures/repos/hybrid-router/router.py +35 -0
  346. package/tests/fixtures/repos/saas-anthropic/agent.ts +27 -0
  347. package/tests/fixtures/repos/saas-openai/assistant.js +33 -0
  348. package/tests/fixtures/repos/saas-openai/client.py +26 -0
  349. package/tests/fixtures/repos/self-hosted-vllm/inference.py +22 -0
  350. package/tests/github-action.test.ts +292 -0
  351. package/tests/insights.test.ts +878 -0
  352. package/tests/joiner.test.ts +168 -0
  353. package/tests/performance/action-latency.test.ts +132 -0
  354. package/tests/performance/benchmark.test.ts +189 -0
  355. package/tests/performance/cli-latency.test.ts +102 -0
  356. package/tests/pr-comment.test.ts +313 -0
  357. package/tests/prediction.test.ts +296 -0
  358. package/tests/runtime-analyzer.test.ts +375 -0
  359. package/tests/runtime.test.ts +205 -0
  360. package/tests/scanner.test.ts +122 -0
  361. package/tests/template-conformance.test.ts +526 -0
  362. package/tests/unit/cost-calculator.test.ts +303 -0
  363. package/tests/unit/credits.test.ts +180 -0
  364. package/tests/unit/inference-map.test.ts +276 -0
  365. package/tests/unit/schema.test.ts +300 -0
  366. package/tsconfig.json +20 -0
  367. package/vitest.config.ts +14 -0
@@ -0,0 +1,271 @@
1
+ import { getEnvelope, getThroughputPercent } from './envelopes.js';
2
+ import { calculateCost } from './costs.js';
3
+ // =============================================================================
4
+ // HELPERS
5
+ // =============================================================================
6
+ function getNestedValue(obj, path) {
7
+ const parts = path.split('.');
8
+ let current = obj;
9
+ for (const part of parts) {
10
+ if (current === null || current === undefined)
11
+ return undefined;
12
+ if (typeof current !== 'object')
13
+ return undefined;
14
+ current = current[part];
15
+ }
16
+ return current;
17
+ }
18
+ function evaluateCondition(condition, context) {
19
+ const fieldValue = getNestedValue(context, condition.field);
20
+ switch (condition.op) {
21
+ case 'eq':
22
+ return fieldValue === condition.value;
23
+ case 'neq':
24
+ return fieldValue !== condition.value;
25
+ case 'gt':
26
+ return typeof fieldValue === 'number' && typeof condition.value === 'number' && fieldValue > condition.value;
27
+ case 'lt':
28
+ return typeof fieldValue === 'number' && typeof condition.value === 'number' && fieldValue < condition.value;
29
+ case 'gte':
30
+ return typeof fieldValue === 'number' && typeof condition.value === 'number' && fieldValue >= condition.value;
31
+ case 'lte':
32
+ return typeof fieldValue === 'number' && typeof condition.value === 'number' && fieldValue <= condition.value;
33
+ case 'exists':
34
+ return fieldValue !== null && fieldValue !== undefined;
35
+ case 'in':
36
+ return Array.isArray(condition.value) && condition.value.includes(fieldValue);
37
+ case 'ratio_gt': {
38
+ if (!condition.compare_to || typeof condition.value !== 'number')
39
+ return false;
40
+ const compareValue = getNestedValue(context, condition.compare_to);
41
+ if (typeof fieldValue !== 'number' || typeof compareValue !== 'number' || compareValue === 0)
42
+ return false;
43
+ return (fieldValue / compareValue) > condition.value;
44
+ }
45
+ case 'ratio_lt': {
46
+ if (!condition.compare_to || typeof condition.value !== 'number')
47
+ return false;
48
+ const compareValue = getNestedValue(context, condition.compare_to);
49
+ if (typeof fieldValue !== 'number' || typeof compareValue !== 'number' || compareValue === 0)
50
+ return false;
51
+ return (fieldValue / compareValue) < condition.value;
52
+ }
53
+ case 'has_pattern': {
54
+ if (!condition.pattern || !Array.isArray(fieldValue))
55
+ return false;
56
+ const pattern = condition.pattern.toLowerCase();
57
+ const matchCount = fieldValue.filter(c => c.patterns.fallback === true ||
58
+ c.file.toLowerCase().includes(pattern)).length;
59
+ return condition.count_gt !== undefined ? matchCount > condition.count_gt : matchCount > 0;
60
+ }
61
+ default:
62
+ return false;
63
+ }
64
+ }
65
+ function interpolate(template, vars) {
66
+ return template.replace(/\{\{(\w+)\}\}/g, (_, key) => {
67
+ const value = vars[key];
68
+ if (value === undefined || value === null)
69
+ return `{{${key}}}`;
70
+ if (typeof value === 'number') {
71
+ return Number.isInteger(value) ? value.toString() : value.toFixed(1);
72
+ }
73
+ return String(value);
74
+ });
75
+ }
76
+ function computeGlobalStats(callsites) {
77
+ const costByCallsite = new Map();
78
+ let totalCost = 0;
79
+ for (const cs of callsites) {
80
+ if (cs.usage) {
81
+ const cost = calculateCost(cs.model || 'unknown', cs.usage.tokens_in, cs.usage.tokens_out);
82
+ costByCallsite.set(cs.id, cost);
83
+ totalCost += cost;
84
+ }
85
+ }
86
+ let topId = '';
87
+ let topCost = 0;
88
+ for (const [id, cost] of costByCallsite) {
89
+ if (cost > topCost) {
90
+ topCost = cost;
91
+ topId = id;
92
+ }
93
+ }
94
+ const topCallsite = callsites.find(c => c.id === topId);
95
+ return {
96
+ totalCost,
97
+ costByCallsite,
98
+ top_callsite_cost_percent: totalCost > 0 ? Math.round((topCost / totalCost) * 100) : 0,
99
+ top_callsite_id: topId,
100
+ top_callsite_model: topCallsite?.model || 'unknown',
101
+ top_callsite_location: topCallsite ? `${topCallsite.file}:${topCallsite.line}` : '',
102
+ };
103
+ }
104
+ // =============================================================================
105
+ // PUBLIC API
106
+ // =============================================================================
107
+ export function evaluate(data, templates, envelopes = {}) {
108
+ const insights = [];
109
+ const callsites = 'callsites' in data ? data.callsites : [];
110
+ const joined = 'codeOnly' in data ? data : null;
111
+ const globalStats = computeGlobalStats(callsites);
112
+ for (const template of templates) {
113
+ const { match, output, severity, category, id } = template;
114
+ switch (match.scope) {
115
+ case 'callsite': {
116
+ // Evaluate against each callsite
117
+ for (const callsite of callsites) {
118
+ const enriched = callsite;
119
+ const usage = enriched.usage;
120
+ // Build context with computed fields for condition evaluation
121
+ const context = {
122
+ ...callsite,
123
+ globalStats,
124
+ // Computed fields needed by templates
125
+ avg_tokens: usage ? Math.round(usage.tokens_out / usage.calls) : 0,
126
+ avg_tokens_in: usage ? Math.round(usage.tokens_in / usage.calls) : 0,
127
+ input_output_ratio: usage && usage.tokens_out > 0
128
+ ? Math.round(usage.tokens_in / usage.tokens_out)
129
+ : 0,
130
+ };
131
+ const allMatch = match.conditions.every(c => evaluateCondition(c, context));
132
+ if (allMatch) {
133
+ const vars = {
134
+ ...callsite,
135
+ location: `${callsite.file}:${callsite.line}`,
136
+ // Latency metrics
137
+ ratio: usage
138
+ ? (usage.latency_p99 / usage.latency_p50).toFixed(1)
139
+ : 'N/A',
140
+ p50: usage?.latency_p50,
141
+ p95: usage?.latency_p95,
142
+ p99: usage?.latency_p99,
143
+ // Token metrics
144
+ tokens_in: usage?.tokens_in || 0,
145
+ tokens_out: usage?.tokens_out || 0,
146
+ calls: usage?.calls || 0,
147
+ avg_tokens: usage
148
+ ? Math.round(usage.tokens_out / usage.calls)
149
+ : 0,
150
+ avg_tokens_in: usage
151
+ ? Math.round(usage.tokens_in / usage.calls)
152
+ : 0,
153
+ // Input/output ratio for prompt bloat detection
154
+ input_output_ratio: usage && usage.tokens_out > 0
155
+ ? Math.round(usage.tokens_in / usage.tokens_out)
156
+ : 0,
157
+ };
158
+ insights.push({
159
+ severity,
160
+ category,
161
+ templateId: id,
162
+ headline: interpolate(output.headline, vars),
163
+ evidence: interpolate(output.evidence, vars),
164
+ location: `${callsite.file}:${callsite.line}`,
165
+ source: 'template',
166
+ });
167
+ }
168
+ }
169
+ break;
170
+ }
171
+ case 'joined': {
172
+ if (!joined)
173
+ continue;
174
+ const context = {
175
+ codeOnly: joined.codeOnly,
176
+ runtimeOnly: joined.runtimeOnly,
177
+ drift: joined.drift,
178
+ 'codeOnly.length': joined.codeOnly.length,
179
+ 'runtimeOnly.length': joined.runtimeOnly.length,
180
+ };
181
+ const allMatch = match.conditions.every(c => evaluateCondition(c, context));
182
+ if (allMatch) {
183
+ const vars = {
184
+ count: joined.codeOnly.length,
185
+ locations: joined.codeOnly
186
+ .slice(0, 3)
187
+ .map(c => `${c.file}:${c.line}`)
188
+ .join(', ') + (joined.codeOnly.length > 3 ? '...' : ''),
189
+ };
190
+ insights.push({
191
+ severity,
192
+ category,
193
+ templateId: id,
194
+ headline: interpolate(output.headline, vars),
195
+ evidence: interpolate(output.evidence, vars),
196
+ source: 'template',
197
+ });
198
+ }
199
+ break;
200
+ }
201
+ case 'global': {
202
+ const context = globalStats;
203
+ const allMatch = match.conditions.every(c => evaluateCondition(c, context));
204
+ if (allMatch) {
205
+ const vars = {
206
+ percent: globalStats.top_callsite_cost_percent,
207
+ model: globalStats.top_callsite_model,
208
+ location: globalStats.top_callsite_location,
209
+ };
210
+ insights.push({
211
+ severity,
212
+ category,
213
+ templateId: id,
214
+ headline: interpolate(output.headline, vars),
215
+ evidence: interpolate(output.evidence, vars),
216
+ location: globalStats.top_callsite_location,
217
+ source: 'template',
218
+ });
219
+ }
220
+ break;
221
+ }
222
+ case 'envelope': {
223
+ // Evaluate against each callsite with envelope comparison
224
+ for (const callsite of callsites) {
225
+ const enriched = callsite;
226
+ if (!enriched.usage || !callsite.model)
227
+ continue;
228
+ const envelope = getEnvelope(callsite.model);
229
+ if (!envelope)
230
+ continue;
231
+ // Calculate actual TPS (tokens per second)
232
+ const avgLatencySec = enriched.usage.latency_p50 / 1000;
233
+ const avgOutputTokens = enriched.usage.tokens_out / enriched.usage.calls;
234
+ const actualTps = avgLatencySec > 0 ? avgOutputTokens / avgLatencySec : 0;
235
+ const context = {
236
+ actual_tps: actualTps,
237
+ envelope,
238
+ 'envelope.tps_median': envelope.tps_median,
239
+ 'envelope.tps_peak': envelope.tps_peak,
240
+ };
241
+ const allMatch = match.conditions.every(c => evaluateCondition(c, context));
242
+ if (allMatch) {
243
+ const percent = getThroughputPercent(callsite.model, actualTps) || 0;
244
+ const vars = {
245
+ percent,
246
+ model: callsite.model,
247
+ actual: actualTps.toFixed(0),
248
+ reference: envelope.tps_median,
249
+ location: `${callsite.file}:${callsite.line}`,
250
+ };
251
+ insights.push({
252
+ severity,
253
+ category,
254
+ templateId: id,
255
+ headline: interpolate(output.headline, vars),
256
+ evidence: interpolate(output.evidence, vars),
257
+ location: `${callsite.file}:${callsite.line}`,
258
+ source: 'template',
259
+ });
260
+ }
261
+ }
262
+ break;
263
+ }
264
+ }
265
+ }
266
+ // Sort by severity: critical > warning > info
267
+ const severityOrder = { critical: 0, warning: 1, info: 2 };
268
+ insights.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);
269
+ return insights;
270
+ }
271
+ //# sourceMappingURL=insights.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insights.js","sourceRoot":"","sources":["../src/insights.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAgB,aAAa,EAAE,MAAM,YAAY,CAAC;AAqBzD,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF,SAAS,cAAc,CAAC,GAAY,EAAE,IAAY;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,OAAO,GAAY,GAAG,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAChE,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAClD,OAAO,GAAI,OAAmC,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,SAA4B,EAAE,OAAgC;IACvF,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IAE5D,QAAQ,SAAS,CAAC,EAAE,EAAE,CAAC;QACrB,KAAK,IAAI;YACP,OAAO,UAAU,KAAK,SAAS,CAAC,KAAK,CAAC;QAExC,KAAK,KAAK;YACR,OAAO,UAAU,KAAK,SAAS,CAAC,KAAK,CAAC;QAExC,KAAK,IAAI;YACP,OAAO,OAAO,UAAU,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ,IAAI,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC;QAE/G,KAAK,IAAI;YACP,OAAO,OAAO,UAAU,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ,IAAI,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC;QAE/G,KAAK,KAAK;YACR,OAAO,OAAO,UAAU,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,SAAS,CAAC,KAAK,CAAC;QAEhH,KAAK,KAAK;YACR,OAAO,OAAO,UAAU,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,SAAS,CAAC,KAAK,CAAC;QAEhH,KAAK,QAAQ;YACX,OAAO,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS,CAAC;QAEzD,KAAK,IAAI;YACP,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAoB,CAAC,CAAC;QAE1F,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC/E,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;YACnE,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC3G,OAAO,CAAC,UAAU,GAAG,YAAY,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC;QACvD,CAAC;QAED,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC/E,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;YACnE,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC3G,OAAO,CAAC,UAAU,GAAG,YAAY,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC;QACvD,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;gBAAE,OAAO,KAAK,CAAC;YACnE,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAChD,MAAM,UAAU,GAAI,UAAyB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACvD,CAAC,CAAC,QAAQ,CAAC,QAAQ,KAAK,IAAI;gBAC5B,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CACvC,CAAC,MAAM,CAAC;YACT,OAAO,SAAS,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;QAC7F,CAAC;QAED;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,IAA6B;IAClE,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,KAAK,GAAG,IAAI,CAAC;QAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,SAA6B;IACvD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjD,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,KAAK,IAAI,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC3F,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAChC,SAAS,IAAI,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,cAAc,EAAE,CAAC;QACxC,IAAI,IAAI,GAAG,OAAO,EAAE,CAAC;YACnB,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,GAAG,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;IAExD,OAAO;QACL,SAAS;QACT,cAAc;QACd,yBAAyB,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,eAAe,EAAE,KAAK;QACtB,kBAAkB,EAAE,WAAW,EAAE,KAAK,IAAI,SAAS;QACnD,qBAAqB,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;KACpF,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF,MAAM,UAAU,QAAQ,CACtB,IAAmE,EACnE,SAA4B,EAC5B,YAAiD,EAAE;IAEnD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,MAAM,SAAS,GAAG,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,MAAM,MAAM,GAAG,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,IAAoB,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAA+B,CAAC,CAAC;IAExE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC;QAE3D,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;YACpB,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,iCAAiC;gBACjC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,MAAM,QAAQ,GAAG,QAA4B,CAAC;oBAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;oBAE7B,8DAA8D;oBAC9D,MAAM,OAAO,GAAG;wBACd,GAAG,QAAQ;wBACX,WAAW;wBACX,sCAAsC;wBACtC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;wBAClE,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;wBACpE,kBAAkB,EAAE,KAAK,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC;4BAC/C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;4BAChD,CAAC,CAAC,CAAC;qBACN,CAAC;oBACF,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;oBAE5E,IAAI,QAAQ,EAAE,CAAC;wBACb,MAAM,IAAI,GAA4B;4BACpC,GAAG,QAAQ;4BACX,QAAQ,EAAE,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE;4BAC7C,kBAAkB;4BAClB,KAAK,EAAE,KAAK;gCACV,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;gCACpD,CAAC,CAAC,KAAK;4BACT,GAAG,EAAE,KAAK,EAAE,WAAW;4BACvB,GAAG,EAAE,KAAK,EAAE,WAAW;4BACvB,GAAG,EAAE,KAAK,EAAE,WAAW;4BACvB,gBAAgB;4BAChB,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,CAAC;4BAChC,UAAU,EAAE,KAAK,EAAE,UAAU,IAAI,CAAC;4BAClC,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;4BACxB,UAAU,EAAE,KAAK;gCACf,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;gCAC5C,CAAC,CAAC,CAAC;4BACL,aAAa,EAAE,KAAK;gCAClB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;gCAC3C,CAAC,CAAC,CAAC;4BACL,gDAAgD;4BAChD,kBAAkB,EAAE,KAAK,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC;gCAC/C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;gCAChD,CAAC,CAAC,CAAC;yBACN,CAAC;wBAEF,QAAQ,CAAC,IAAI,CAAC;4BACZ,QAAQ;4BACR,QAAQ;4BACR,UAAU,EAAE,EAAE;4BACd,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;4BAC5C,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;4BAC5C,QAAQ,EAAE,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE;4BAC7C,MAAM,EAAE,UAAU;yBACnB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,CAAC,MAAM;oBAAE,SAAS;gBAEtB,MAAM,OAAO,GAAG;oBACd,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,iBAAiB,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;oBACzC,oBAAoB,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM;iBAChD,CAAC;gBAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;gBAE5E,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,IAAI,GAA4B;wBACpC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;wBAC7B,SAAS,EAAE,MAAM,CAAC,QAAQ;6BACvB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;6BACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;6BAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC1D,CAAC;oBAEF,QAAQ,CAAC,IAAI,CAAC;wBACZ,QAAQ;wBACR,QAAQ;wBACR,UAAU,EAAE,EAAE;wBACd,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;wBAC5C,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;wBAC5C,MAAM,EAAE,UAAU;qBACnB,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,OAAO,GAAG,WAAiD,CAAC;gBAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;gBAE5E,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,IAAI,GAA4B;wBACpC,OAAO,EAAE,WAAW,CAAC,yBAAyB;wBAC9C,KAAK,EAAE,WAAW,CAAC,kBAAkB;wBACrC,QAAQ,EAAE,WAAW,CAAC,qBAAqB;qBAC5C,CAAC;oBAEF,QAAQ,CAAC,IAAI,CAAC;wBACZ,QAAQ;wBACR,QAAQ;wBACR,UAAU,EAAE,EAAE;wBACd,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;wBAC5C,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;wBAC5C,QAAQ,EAAE,WAAW,CAAC,qBAAqB;wBAC3C,MAAM,EAAE,UAAU;qBACnB,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,0DAA0D;gBAC1D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,MAAM,QAAQ,GAAG,QAA4B,CAAC;oBAC9C,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK;wBAAE,SAAS;oBAEjD,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;oBAC7C,IAAI,CAAC,QAAQ;wBAAE,SAAS;oBAExB,2CAA2C;oBAC3C,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;oBACxD,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;oBACzE,MAAM,SAAS,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;oBAE1E,MAAM,OAAO,GAAG;wBACd,UAAU,EAAE,SAAS;wBACrB,QAAQ;wBACR,qBAAqB,EAAE,QAAQ,CAAC,UAAU;wBAC1C,mBAAmB,EAAE,QAAQ,CAAC,QAAQ;qBACvC,CAAC;oBAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;oBAE5E,IAAI,QAAQ,EAAE,CAAC;wBACb,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;wBACrE,MAAM,IAAI,GAA4B;4BACpC,OAAO;4BACP,KAAK,EAAE,QAAQ,CAAC,KAAK;4BACrB,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;4BAC5B,SAAS,EAAE,QAAQ,CAAC,UAAU;4BAC9B,QAAQ,EAAE,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE;yBAC9C,CAAC;wBAEF,QAAQ,CAAC,IAAI,CAAC;4BACZ,QAAQ;4BACR,QAAQ;4BACR,UAAU,EAAE,EAAE;4BACd,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;4BAC5C,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;4BAC5C,QAAQ,EAAE,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE;4BAC7C,MAAM,EAAE,UAAU;yBACnB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,MAAM,aAAa,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC3D,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE/E,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Callsite, InferenceEvent, JoinedOutput } from './types.js';
2
+ export interface DriftThresholds {
3
+ /** Percentage threshold for streaming drift (0-100). Default: 50 */
4
+ streamingDriftPercent: number;
5
+ /** Minimum events before flagging retry/fallback drift. Default: 10 */
6
+ minEventsForPatternDrift: number;
7
+ }
8
+ export declare function join(callsites: Callsite[], events: InferenceEvent[]): JoinedOutput;
9
+ //# sourceMappingURL=joiner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joiner.d.ts","sourceRoot":"","sources":["../src/joiner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAA6C,MAAM,YAAY,CAAC;AAMpH,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,qBAAqB,EAAE,MAAM,CAAC;IAC9B,uEAAuE;IACvE,wBAAwB,EAAE,MAAM,CAAC;CAClC;AA2JD,wBAAgB,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,YAAY,CAyHlF"}
package/dist/joiner.js ADDED
@@ -0,0 +1,247 @@
1
+ import { percentile } from './runtime.js';
2
+ const DEFAULT_THRESHOLDS = {
3
+ streamingDriftPercent: 50,
4
+ minEventsForPatternDrift: 10,
5
+ };
6
+ const currentThresholds = { ...DEFAULT_THRESHOLDS };
7
+ // =============================================================================
8
+ // HELPERS
9
+ // =============================================================================
10
+ function computeUsageStats(events) {
11
+ const latencies = events.map(e => e.latency_ms);
12
+ return {
13
+ calls: events.length,
14
+ tokens_in: events.reduce((sum, e) => sum + e.input_tokens, 0),
15
+ tokens_out: events.reduce((sum, e) => sum + e.output_tokens, 0),
16
+ latency_p50: percentile(latencies, 50),
17
+ latency_p95: percentile(latencies, 95),
18
+ latency_p99: percentile(latencies, 99),
19
+ };
20
+ }
21
+ function makeKey(provider, model) {
22
+ return `${provider || 'unknown'}:${model || 'unknown'}`;
23
+ }
24
+ /**
25
+ * Detect pattern drift between code-declared patterns and runtime behavior.
26
+ *
27
+ * Pattern types:
28
+ * - streaming: Code says stream=true but runtime shows non-streaming (or vice versa)
29
+ * - batching: Code declares batching but runtime shows no batch_id/batch_size
30
+ * - fallback: Code declares fallback but no fallback_used events seen
31
+ * - caching: Code declares caching but no cached events seen
32
+ * - retries: Code declares retries but no retry_count > 0 events seen
33
+ */
34
+ function detectPatternDrift(callsite, events) {
35
+ const driftSignals = [];
36
+ const patterns = callsite.patterns;
37
+ if (events.length === 0) {
38
+ return driftSignals;
39
+ }
40
+ // Count events with each pattern
41
+ const streamingEvents = events.filter(e => e.streaming === true).length;
42
+ const nonStreamingEvents = events.filter(e => e.streaming === false).length;
43
+ const batchedEvents = events.filter(e => e.batch_id || (e.batch_size && e.batch_size > 1)).length;
44
+ const cachedEvents = events.filter(e => e.cached === true).length;
45
+ const retriedEvents = events.filter(e => e.retry_count && e.retry_count > 0).length;
46
+ const fallbackEvents = events.filter(e => e.fallback_used === true).length;
47
+ // Calculate percentages
48
+ const streamingPercent = (streamingEvents / events.length) * 100;
49
+ const nonStreamingPercent = (nonStreamingEvents / events.length) * 100;
50
+ // 1. Streaming drift detection
51
+ if (patterns.streaming === true) {
52
+ // Code declares streaming, check if runtime confirms
53
+ if (nonStreamingPercent > currentThresholds.streamingDriftPercent) {
54
+ driftSignals.push({
55
+ type: 'patternDrift',
56
+ callsiteId: callsite.id,
57
+ provider: callsite.provider || undefined,
58
+ model: callsite.model || undefined,
59
+ message: `Streaming declared in code but ${nonStreamingPercent.toFixed(0)}% of runtime calls are non-streaming`,
60
+ });
61
+ }
62
+ else if (streamingEvents === 0 && nonStreamingEvents === 0) {
63
+ // No streaming info available - soft warning
64
+ driftSignals.push({
65
+ type: 'patternDrift',
66
+ callsiteId: callsite.id,
67
+ provider: callsite.provider || undefined,
68
+ model: callsite.model || undefined,
69
+ message: `Streaming declared in code but cannot verify from runtime data (no TTFT metrics)`,
70
+ });
71
+ }
72
+ }
73
+ else if (patterns.streaming === false) {
74
+ // Code explicitly non-streaming, but runtime shows streaming
75
+ if (streamingPercent > currentThresholds.streamingDriftPercent) {
76
+ driftSignals.push({
77
+ type: 'patternDrift',
78
+ callsiteId: callsite.id,
79
+ provider: callsite.provider || undefined,
80
+ model: callsite.model || undefined,
81
+ message: `Non-streaming declared in code but ${streamingPercent.toFixed(0)}% of runtime calls appear to stream`,
82
+ });
83
+ }
84
+ }
85
+ // 2. Batching drift detection
86
+ if (patterns.batching === true && batchedEvents === 0) {
87
+ driftSignals.push({
88
+ type: 'patternDrift',
89
+ callsiteId: callsite.id,
90
+ provider: callsite.provider || undefined,
91
+ model: callsite.model || undefined,
92
+ message: `Batching declared in code but no batched requests observed at runtime`,
93
+ });
94
+ }
95
+ // 3. Caching drift detection
96
+ if (patterns.caching === true && cachedEvents === 0) {
97
+ driftSignals.push({
98
+ type: 'patternDrift',
99
+ callsiteId: callsite.id,
100
+ provider: callsite.provider || undefined,
101
+ model: callsite.model || undefined,
102
+ message: `Caching declared in code but no cache hits observed at runtime`,
103
+ });
104
+ }
105
+ // 4. Retry drift detection
106
+ if (patterns.retries === true && retriedEvents === 0) {
107
+ // This could be good (no failures) or indicate retries aren't working
108
+ // Only flag if there are a significant number of events
109
+ if (events.length >= currentThresholds.minEventsForPatternDrift) {
110
+ driftSignals.push({
111
+ type: 'patternDrift',
112
+ callsiteId: callsite.id,
113
+ provider: callsite.provider || undefined,
114
+ model: callsite.model || undefined,
115
+ message: `Retries declared in code but no retry events observed (${events.length} calls, 0 retries)`,
116
+ });
117
+ }
118
+ }
119
+ // 5. Fallback drift detection
120
+ if (patterns.fallback === true && fallbackEvents === 0) {
121
+ // This could be good (primary always works) or indicate fallback isn't working
122
+ // Only flag if there are a significant number of events
123
+ if (events.length >= currentThresholds.minEventsForPatternDrift) {
124
+ driftSignals.push({
125
+ type: 'patternDrift',
126
+ callsiteId: callsite.id,
127
+ provider: callsite.provider || undefined,
128
+ model: callsite.model || undefined,
129
+ message: `Fallback declared in code but never triggered at runtime (${events.length} calls)`,
130
+ });
131
+ }
132
+ }
133
+ return driftSignals;
134
+ }
135
+ // =============================================================================
136
+ // PUBLIC API
137
+ // =============================================================================
138
+ export function join(callsites, events) {
139
+ const codeOnly = [];
140
+ const runtimeOnly = [];
141
+ const drift = [];
142
+ const enrichedCallsites = [];
143
+ // Separate events: those with callsite_id vs those without
144
+ const eventsByCallsiteId = new Map();
145
+ const eventsWithoutCallsiteId = [];
146
+ for (const event of events) {
147
+ if (event.callsite_id) {
148
+ // Events with callsite_id ONLY match by callsite_id, not by provider+model
149
+ if (!eventsByCallsiteId.has(event.callsite_id)) {
150
+ eventsByCallsiteId.set(event.callsite_id, []);
151
+ }
152
+ eventsByCallsiteId.get(event.callsite_id).push(event);
153
+ }
154
+ else {
155
+ // Events without callsite_id will be matched by provider+model
156
+ eventsWithoutCallsiteId.push(event);
157
+ }
158
+ }
159
+ // Group events without callsite_id by provider+model
160
+ const eventsByKey = new Map();
161
+ for (const event of eventsWithoutCallsiteId) {
162
+ const key = makeKey(event.provider, event.model);
163
+ if (!eventsByKey.has(key)) {
164
+ eventsByKey.set(key, []);
165
+ }
166
+ eventsByKey.get(key).push(event);
167
+ }
168
+ // Track which keys have been matched
169
+ const matchedKeys = new Set();
170
+ const matchedCallsiteIds = new Set();
171
+ // Match callsites to events
172
+ for (const callsite of callsites) {
173
+ let matchedEvents = [];
174
+ // Priority 1: Match by callsite_id (events that explicitly reference this callsite)
175
+ if (eventsByCallsiteId.has(callsite.id)) {
176
+ matchedEvents = eventsByCallsiteId.get(callsite.id);
177
+ matchedCallsiteIds.add(callsite.id);
178
+ }
179
+ // Priority 2: Match by provider+model (only for events without callsite_id)
180
+ if (matchedEvents.length === 0) {
181
+ const key = makeKey(callsite.provider, callsite.model);
182
+ const keyEvents = eventsByKey.get(key);
183
+ if (keyEvents && keyEvents.length > 0) {
184
+ matchedEvents = keyEvents;
185
+ matchedKeys.add(key);
186
+ }
187
+ }
188
+ // Build enriched callsite
189
+ if (matchedEvents.length > 0) {
190
+ const usage = computeUsageStats(matchedEvents);
191
+ enrichedCallsites.push({ ...callsite, usage });
192
+ // Detect pattern drift for matched callsites
193
+ const patternDrift = detectPatternDrift(callsite, matchedEvents);
194
+ drift.push(...patternDrift);
195
+ }
196
+ else {
197
+ // No matching events - this is code-only
198
+ enrichedCallsites.push(callsite);
199
+ codeOnly.push(callsite);
200
+ drift.push({
201
+ type: 'codeOnly',
202
+ provider: callsite.provider || undefined,
203
+ model: callsite.model || undefined,
204
+ callsiteId: callsite.id,
205
+ message: `Callsite ${callsite.file}:${callsite.line} has no runtime events`,
206
+ });
207
+ }
208
+ }
209
+ // Find runtime-only events
210
+ // 1. Events with callsite_id that don't match any callsite
211
+ for (const [callsiteId, evts] of eventsByCallsiteId) {
212
+ if (!matchedCallsiteIds.has(callsiteId)) {
213
+ runtimeOnly.push(...evts);
214
+ }
215
+ }
216
+ // 2. Events without callsite_id whose key wasn't matched
217
+ for (const [key, evts] of eventsByKey) {
218
+ if (!matchedKeys.has(key)) {
219
+ runtimeOnly.push(...evts);
220
+ }
221
+ }
222
+ // Generate drift signals for runtime-only events (grouped by provider+model)
223
+ const runtimeOnlyByKey = new Map();
224
+ for (const event of runtimeOnly) {
225
+ const key = makeKey(event.provider, event.model);
226
+ if (!runtimeOnlyByKey.has(key)) {
227
+ runtimeOnlyByKey.set(key, []);
228
+ }
229
+ runtimeOnlyByKey.get(key).push(event);
230
+ }
231
+ for (const [key, evts] of runtimeOnlyByKey) {
232
+ const [provider, model] = key.split(':');
233
+ drift.push({
234
+ type: 'runtimeOnly',
235
+ provider: provider || undefined,
236
+ model: model || undefined,
237
+ message: `${evts.length} events for ${key} with no matching code`,
238
+ });
239
+ }
240
+ return {
241
+ callsites: enrichedCallsites,
242
+ codeOnly,
243
+ runtimeOnly,
244
+ drift,
245
+ };
246
+ }
247
+ //# sourceMappingURL=joiner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joiner.js","sourceRoot":"","sources":["../src/joiner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Static Analysis Orchestrator
3
+ * Runs unified multi-dimensional analysis for comprehensive static code analysis
4
+ *
5
+ * Uses Claude Agent SDK (per TDD v1.9.3) with optimized single-call approach:
6
+ * one agent query per file analyzing all 4 dimensions (cost, latency, throughput, reliability)
7
+ *
8
+ * Architecture: Claude Agent SDK = Engine, TypeScript = Glue (per TDD §1)
9
+ *
10
+ * Prompts are loaded from YAML config files (prompts/*.yaml) for consistency
11
+ * between CLI and API surfaces.
12
+ *
13
+ * SYNC NOTE: This file is SYNCED FROM peakinfer-site (private repo).
14
+ * Source: peakinfer-site/lib/agents/static-orchestrator.ts
15
+ * DO NOT modify directly - changes must be made in peakinfer-site first.
16
+ */
17
+ import type { StaticAnalysisInput, StaticAnalysisOutput, PerformanceProfile } from './analysis-types.js';
18
+ export type { StaticAnalysisInput, StaticAnalysisOutput, PerformanceProfile };
19
+ export interface AnalysisProgressCallback {
20
+ (data: {
21
+ phase: 'analyzing';
22
+ completed: number;
23
+ total: number;
24
+ currentFile?: string;
25
+ percent: number;
26
+ }): void;
27
+ }
28
+ export declare class StaticAnalysisOrchestrator {
29
+ private anthropicKey;
30
+ constructor(anthropicKey?: string);
31
+ analyze(input: StaticAnalysisInput, onProgress?: AnalysisProgressCallback): Promise<StaticAnalysisOutput>;
32
+ }
33
+ export declare function runStaticAnalysis(input: StaticAnalysisInput, anthropicKey?: string): Promise<StaticAnalysisOutput>;
34
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAaH,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAUnB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,CAAC;AAgpB9E,MAAM,WAAW,wBAAwB;IACvC,CAAC,IAAI,EAAE;QACL,KAAK,EAAE,WAAW,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;KACjB,GAAG,IAAI,CAAC;CACV;AAED,qBAAa,0BAA0B;IACrC,OAAO,CAAC,YAAY,CAAS;gBAEjB,YAAY,CAAC,EAAE,MAAM;IAQ3B,OAAO,CACX,KAAK,EAAE,mBAAmB,EAC1B,UAAU,CAAC,EAAE,wBAAwB,GACpC,OAAO,CAAC,oBAAoB,CAAC;CAsRjC;AAMD,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,mBAAmB,EAC1B,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,oBAAoB,CAAC,CAG/B"}