@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,341 @@
1
+ /**
2
+ * Template Commands (v1.6)
3
+ *
4
+ * CLI commands for managing insight templates:
5
+ * - list: List available templates with optional category filter
6
+ * - info: Show detailed template information
7
+ * - roi: Calculate ROI for a template
8
+ */
9
+ import { loadTemplates, getTemplate, loadOptimizationTemplates, getOptimizationTemplate } from '../templates.js';
10
+ // =============================================================================
11
+ // HELPERS
12
+ // =============================================================================
13
+ /**
14
+ * Format category with color indicator
15
+ */
16
+ function formatCategory(category) {
17
+ return `[${category}]`;
18
+ }
19
+ /**
20
+ * Format severity with indicator
21
+ */
22
+ function formatSeverity(severity) {
23
+ const indicators = {
24
+ critical: '[!]',
25
+ warning: '[*]',
26
+ info: '[-]',
27
+ };
28
+ return `${indicators[severity] || '[ ]'} ${severity}`;
29
+ }
30
+ /**
31
+ * Display templates in a formatted list
32
+ */
33
+ function displayTemplateList(templates) {
34
+ if (templates.length === 0) {
35
+ console.log('No templates found.');
36
+ return;
37
+ }
38
+ console.log(`\n${templates.length} template${templates.length !== 1 ? 's' : ''} available:\n`);
39
+ // Group by category
40
+ const byCategory = new Map();
41
+ for (const t of templates) {
42
+ if (!byCategory.has(t.category)) {
43
+ byCategory.set(t.category, []);
44
+ }
45
+ byCategory.get(t.category).push(t);
46
+ }
47
+ for (const [category, categoryTemplates] of byCategory) {
48
+ console.log(`${formatCategory(category)}`);
49
+ for (const t of categoryTemplates) {
50
+ console.log(` ${formatSeverity(t.severity)} ${t.id}`);
51
+ console.log(` ${t.name}`);
52
+ }
53
+ console.log('');
54
+ }
55
+ }
56
+ /**
57
+ * Display detailed template information
58
+ */
59
+ function displayTemplateInfo(template) {
60
+ console.log(`\n${template.name} (${template.id})`);
61
+ console.log('═'.repeat(60));
62
+ console.log(`Version: ${template.version}`);
63
+ console.log(`Category: ${formatCategory(template.category)}`);
64
+ if (template.layer) {
65
+ console.log(`Layer: [${template.layer}]`);
66
+ }
67
+ console.log(`Severity: ${formatSeverity(template.severity)}`);
68
+ console.log('');
69
+ console.log('Match Scope:', template.match.scope);
70
+ console.log('Conditions:');
71
+ for (const cond of template.match.conditions) {
72
+ console.log(` - ${cond.field} ${cond.op} ${cond.value ?? cond.pattern ?? ''}`);
73
+ }
74
+ console.log('');
75
+ console.log('Output:');
76
+ console.log(` Headline: ${template.output.headline}`);
77
+ console.log(` Evidence: ${template.output.evidence}`);
78
+ if (template.defaults && Object.keys(template.defaults).length > 0) {
79
+ console.log('');
80
+ console.log('Defaults:');
81
+ for (const [key, value] of Object.entries(template.defaults)) {
82
+ console.log(` ${key}: ${value}`);
83
+ }
84
+ }
85
+ }
86
+ // =============================================================================
87
+ // OPTIMIZATION TEMPLATE DISPLAY HELPERS (v1.8 - Inference Squeeze Guide)
88
+ // =============================================================================
89
+ /**
90
+ * Display optimization templates in a formatted list
91
+ */
92
+ function displayOptimizationList(templates) {
93
+ if (templates.length === 0) {
94
+ console.log('No optimization templates found.');
95
+ return;
96
+ }
97
+ console.log(`\n${templates.length} optimization template${templates.length !== 1 ? 's' : ''} available:\n`);
98
+ // Group by category
99
+ const byCategory = new Map();
100
+ for (const t of templates) {
101
+ if (!byCategory.has(t.category)) {
102
+ byCategory.set(t.category, []);
103
+ }
104
+ byCategory.get(t.category).push(t);
105
+ }
106
+ for (const [category, categoryTemplates] of byCategory) {
107
+ console.log(`[${category}]`);
108
+ for (const t of categoryTemplates) {
109
+ const risk = t.optimization.risk_level === 'high' ? '[!]' : t.optimization.risk_level === 'medium' ? '[*]' : '[-]';
110
+ console.log(` ${risk} ${t.id}`);
111
+ console.log(` ${t.name}`);
112
+ if (t.optimization.expected_cost_reduction) {
113
+ console.log(` Cost: ${t.optimization.expected_cost_reduction} | Effort: ${t.optimization.effort_estimate}`);
114
+ }
115
+ }
116
+ console.log('');
117
+ }
118
+ }
119
+ /**
120
+ * Display detailed optimization template information
121
+ */
122
+ function displayOptimizationInfo(template) {
123
+ console.log(`\n${template.name} (${template.id})`);
124
+ console.log('═'.repeat(70));
125
+ console.log(`Category: [${template.category}]`);
126
+ console.log(`Confidence: ${(template.confidence * 100).toFixed(0)}%`);
127
+ if (template.success_count) {
128
+ console.log(`Success: ${template.success_count} implementations`);
129
+ }
130
+ console.log('');
131
+ console.log('Optimization:');
132
+ console.log(` Technique: ${template.optimization.technique}`);
133
+ if (template.optimization.expected_cost_reduction) {
134
+ console.log(` Cost Reduction: ${template.optimization.expected_cost_reduction}`);
135
+ }
136
+ if (template.optimization.expected_latency_improvement) {
137
+ console.log(` Latency Improvement: ${template.optimization.expected_latency_improvement}`);
138
+ }
139
+ if (template.optimization.expected_throughput_improvement) {
140
+ console.log(` Throughput Improvement: ${template.optimization.expected_throughput_improvement}`);
141
+ }
142
+ console.log(` Effort: ${template.optimization.effort_estimate}`);
143
+ console.log(` Risk: ${template.optimization.risk_level}`);
144
+ console.log('');
145
+ if (template.implementation?.prerequisites) {
146
+ console.log('Prerequisites:');
147
+ for (const prereq of template.implementation.prerequisites) {
148
+ console.log(` - ${prereq.requirement}`);
149
+ }
150
+ console.log('');
151
+ }
152
+ if (template.implementation?.automated_steps) {
153
+ console.log('Implementation Steps:');
154
+ for (const step of template.implementation.automated_steps) {
155
+ console.log(` ${step.step_id}: ${step.name}`);
156
+ }
157
+ console.log('');
158
+ }
159
+ if (template.monitoring?.key_metrics) {
160
+ console.log('Key Metrics:');
161
+ for (const metric of template.monitoring.key_metrics) {
162
+ console.log(` - ${metric.metric}: target ${metric.target}`);
163
+ }
164
+ console.log('');
165
+ }
166
+ if (template.economics?.implementation_cost) {
167
+ console.log('Implementation Cost:');
168
+ if (template.economics.implementation_cost.engineering_hours) {
169
+ console.log(` Engineering Hours: ${template.economics.implementation_cost.engineering_hours}`);
170
+ }
171
+ console.log(` Total Cost: $${template.economics.implementation_cost.total_cost.toLocaleString()}`);
172
+ console.log('');
173
+ }
174
+ console.log('Note: ROI estimates are indicative. Actual results depend on your environment.');
175
+ }
176
+ /**
177
+ * Calculate and display ROI for a template
178
+ */
179
+ function displayTemplateROI(template, monthlyCost) {
180
+ console.log(`\nROI Analysis: ${template.name}`);
181
+ console.log('═'.repeat(60));
182
+ // Use defaults or provided values
183
+ const defaults = template.defaults || {};
184
+ const baseCost = monthlyCost || defaults.monthly_cost || 10000;
185
+ // Estimate savings based on category
186
+ let savingsPercent = 0;
187
+ let savingsDescription = '';
188
+ switch (template.category) {
189
+ case 'cost':
190
+ savingsPercent = defaults.estimated_savings_percent || 20;
191
+ savingsDescription = 'Direct cost reduction';
192
+ break;
193
+ case 'latency':
194
+ savingsPercent = defaults.latency_improvement_percent || 30;
195
+ savingsDescription = 'User time saved (latency reduction)';
196
+ break;
197
+ case 'reliability':
198
+ savingsPercent = defaults.failure_reduction_percent || 15;
199
+ savingsDescription = 'Avoided failures and retries';
200
+ break;
201
+ case 'throughput':
202
+ savingsPercent = defaults.throughput_improvement_percent || 25;
203
+ savingsDescription = 'Capacity improvement';
204
+ break;
205
+ default:
206
+ savingsPercent = 10;
207
+ savingsDescription = 'General optimization';
208
+ }
209
+ const monthlySavings = Math.round(baseCost * (savingsPercent / 100));
210
+ const annualSavings = monthlySavings * 12;
211
+ console.log(`Base Monthly Cost: $${baseCost.toLocaleString()}`);
212
+ console.log(`Category: ${template.category}`);
213
+ console.log('');
214
+ console.log(`Estimated Impact: ${savingsPercent}% ${savingsDescription}`);
215
+ console.log(`Monthly Savings: $${monthlySavings.toLocaleString()}`);
216
+ console.log(`Annual Savings: $${annualSavings.toLocaleString()}`);
217
+ console.log('');
218
+ console.log('Note: Estimates based on typical scenarios. Actual results may vary.');
219
+ }
220
+ // =============================================================================
221
+ // COMMANDS
222
+ // =============================================================================
223
+ /**
224
+ * Register template commands
225
+ */
226
+ export function registerTemplateCommands(program) {
227
+ const templateCmd = program
228
+ .command('template')
229
+ .description('manage insight templates');
230
+ // List templates
231
+ templateCmd
232
+ .command('list')
233
+ .description('list available templates')
234
+ .option('--category <cat>', 'filter by category (cost, latency, reliability, throughput, drift)')
235
+ .option('--layer <layer>', 'filter by stack layer (application, api, gateway, runtime, model, hardware)')
236
+ .option('--offline', 'use cached templates only')
237
+ .action(async (options) => {
238
+ try {
239
+ const templates = await loadTemplates({ offline: options.offline });
240
+ let filtered = templates;
241
+ // Filter by category if specified
242
+ if (options.category) {
243
+ filtered = filtered.filter(t => t.category === options.category);
244
+ }
245
+ // v1.8: Filter by layer if specified
246
+ if (options.layer) {
247
+ filtered = filtered.filter(t => t.layer === options.layer);
248
+ }
249
+ displayTemplateList(filtered);
250
+ }
251
+ catch (error) {
252
+ console.error('Error:', error instanceof Error ? error.message : 'Failed to load templates');
253
+ process.exit(1);
254
+ }
255
+ });
256
+ // Template info
257
+ templateCmd
258
+ .command('info')
259
+ .description('show template details')
260
+ .argument('<id>', 'template ID')
261
+ .option('--offline', 'use cached templates only')
262
+ .action(async (id, options) => {
263
+ try {
264
+ const template = await getTemplate(id, { offline: options.offline });
265
+ if (!template) {
266
+ console.error(`Template not found: ${id}`);
267
+ console.log('\nRun "peakinfer template list" to see available templates.');
268
+ process.exit(1);
269
+ }
270
+ displayTemplateInfo(template);
271
+ }
272
+ catch (error) {
273
+ console.error('Error:', error instanceof Error ? error.message : 'Failed to load template');
274
+ process.exit(1);
275
+ }
276
+ });
277
+ // Template ROI
278
+ templateCmd
279
+ .command('roi')
280
+ .description('calculate ROI for a template')
281
+ .argument('<id>', 'template ID')
282
+ .option('--monthly-cost <amount>', 'your monthly inference cost in USD', parseFloat)
283
+ .option('--offline', 'use cached templates only')
284
+ .action(async (id, options) => {
285
+ try {
286
+ const template = await getTemplate(id, { offline: options.offline });
287
+ if (!template) {
288
+ console.error(`Template not found: ${id}`);
289
+ process.exit(1);
290
+ }
291
+ displayTemplateROI(template, options.monthlyCost);
292
+ }
293
+ catch (error) {
294
+ console.error('Error:', error instanceof Error ? error.message : 'Failed to calculate ROI');
295
+ process.exit(1);
296
+ }
297
+ });
298
+ // ==========================================================================
299
+ // OPTIMIZATION TEMPLATES (v1.8 - Inference Squeeze Guide)
300
+ // ==========================================================================
301
+ // List optimization templates
302
+ templateCmd
303
+ .command('optimizations')
304
+ .description('list community optimization templates (Inference Squeeze Guide)')
305
+ .option('--category <cat>', 'filter by category (runtime_optimization, batching_optimization, memory_optimization, application_optimization, cost_optimization, monitoring, scaling)')
306
+ .action((options) => {
307
+ try {
308
+ let templates = loadOptimizationTemplates();
309
+ // Filter by category if specified
310
+ if (options.category) {
311
+ templates = templates.filter(t => t.category === options.category);
312
+ }
313
+ displayOptimizationList(templates);
314
+ }
315
+ catch (error) {
316
+ console.error('Error:', error instanceof Error ? error.message : 'Failed to load optimization templates');
317
+ process.exit(1);
318
+ }
319
+ });
320
+ // Optimization template info
321
+ templateCmd
322
+ .command('optimization')
323
+ .description('show optimization template details')
324
+ .argument('<id>', 'optimization template ID')
325
+ .action((id) => {
326
+ try {
327
+ const template = getOptimizationTemplate(id);
328
+ if (!template) {
329
+ console.error(`Optimization template not found: ${id}`);
330
+ console.log('\nRun "peakinfer template optimizations" to see available templates.');
331
+ process.exit(1);
332
+ }
333
+ displayOptimizationInfo(template);
334
+ }
335
+ catch (error) {
336
+ console.error('Error:', error instanceof Error ? error.message : 'Failed to load optimization template');
337
+ process.exit(1);
338
+ }
339
+ });
340
+ }
341
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/commands/template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Validate-Map Command (v1.9.3)
3
+ *
4
+ * CLI command for validating InferenceMap JSON files against the v0.1 schema.
5
+ * Per PRD v1.9.3: `peakinfer validate-map ./analysis.json`
6
+ */
7
+ import { Command } from 'commander';
8
+ /**
9
+ * Register the validate-map command
10
+ */
11
+ export declare function registerValidateMapCommand(program: Command): void;
12
+ //# sourceMappingURL=validate-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-map.d.ts","sourceRoot":"","sources":["../../src/commands/validate-map.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+PpC;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0DjE"}
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Validate-Map Command (v1.9.3)
3
+ *
4
+ * CLI command for validating InferenceMap JSON files against the v0.1 schema.
5
+ * Per PRD v1.9.3: `peakinfer validate-map ./analysis.json`
6
+ */
7
+ import { existsSync, readFileSync } from 'fs';
8
+ import { resolve, dirname } from 'path';
9
+ import { fileURLToPath } from 'url';
10
+ // =============================================================================
11
+ // SCHEMA VALIDATION
12
+ // =============================================================================
13
+ /**
14
+ * Load the InferenceMap v0.1 JSON Schema
15
+ */
16
+ function loadSchema() {
17
+ const __filename = fileURLToPath(import.meta.url);
18
+ const __dirname = dirname(__filename);
19
+ const schemaPath = resolve(__dirname, '../../schemas/inference-map.v0.1.json');
20
+ if (!existsSync(schemaPath)) {
21
+ throw new Error(`Schema not found at ${schemaPath}`);
22
+ }
23
+ return JSON.parse(readFileSync(schemaPath, 'utf-8'));
24
+ }
25
+ /**
26
+ * Validate an InferenceMap against the v0.1 schema.
27
+ * Performs structural validation without external dependencies.
28
+ */
29
+ function validateInferenceMap(data) {
30
+ const errors = [];
31
+ const warnings = [];
32
+ // Type guard
33
+ if (typeof data !== 'object' || data === null) {
34
+ errors.push({ path: '$', message: 'InferenceMap must be an object' });
35
+ return { valid: false, errors, warnings };
36
+ }
37
+ const map = data;
38
+ // Required fields
39
+ const requiredFields = ['version', 'root', 'generatedAt', 'summary', 'callsites'];
40
+ for (const field of requiredFields) {
41
+ if (!(field in map)) {
42
+ errors.push({ path: `$.${field}`, message: `Missing required field: ${field}` });
43
+ }
44
+ }
45
+ // Version check
46
+ if ('version' in map && map.version !== '0.1') {
47
+ errors.push({
48
+ path: '$.version',
49
+ message: 'Invalid version',
50
+ expected: '0.1',
51
+ actual: String(map.version),
52
+ });
53
+ }
54
+ // Root validation
55
+ if ('root' in map && typeof map.root !== 'string') {
56
+ errors.push({ path: '$.root', message: 'root must be a string' });
57
+ }
58
+ // generatedAt validation (ISO 8601)
59
+ if ('generatedAt' in map) {
60
+ if (typeof map.generatedAt !== 'string') {
61
+ errors.push({ path: '$.generatedAt', message: 'generatedAt must be a string' });
62
+ }
63
+ else {
64
+ const date = new Date(map.generatedAt);
65
+ if (isNaN(date.getTime())) {
66
+ errors.push({ path: '$.generatedAt', message: 'generatedAt must be a valid ISO 8601 date-time' });
67
+ }
68
+ }
69
+ }
70
+ // Summary validation
71
+ if ('summary' in map) {
72
+ if (typeof map.summary !== 'object' || map.summary === null) {
73
+ errors.push({ path: '$.summary', message: 'summary must be an object' });
74
+ }
75
+ else {
76
+ const summary = map.summary;
77
+ // Required summary fields
78
+ const summaryRequired = ['totalCallsites', 'providers', 'models', 'patterns'];
79
+ for (const field of summaryRequired) {
80
+ if (!(field in summary)) {
81
+ errors.push({ path: `$.summary.${field}`, message: `Missing required field: ${field}` });
82
+ }
83
+ }
84
+ // Type checks
85
+ if ('totalCallsites' in summary && typeof summary.totalCallsites !== 'number') {
86
+ errors.push({ path: '$.summary.totalCallsites', message: 'totalCallsites must be a number' });
87
+ }
88
+ if ('providers' in summary && !Array.isArray(summary.providers)) {
89
+ errors.push({ path: '$.summary.providers', message: 'providers must be an array' });
90
+ }
91
+ if ('models' in summary && !Array.isArray(summary.models)) {
92
+ errors.push({ path: '$.summary.models', message: 'models must be an array' });
93
+ }
94
+ if ('patterns' in summary && (typeof summary.patterns !== 'object' || summary.patterns === null)) {
95
+ errors.push({ path: '$.summary.patterns', message: 'patterns must be an object' });
96
+ }
97
+ }
98
+ }
99
+ // Callsites validation
100
+ if ('callsites' in map) {
101
+ if (!Array.isArray(map.callsites)) {
102
+ errors.push({ path: '$.callsites', message: 'callsites must be an array' });
103
+ }
104
+ else {
105
+ const callsites = map.callsites;
106
+ for (let i = 0; i < callsites.length; i++) {
107
+ const callsite = callsites[i];
108
+ if (typeof callsite !== 'object' || callsite === null) {
109
+ errors.push({ path: `$.callsites[${i}]`, message: 'callsite must be an object' });
110
+ continue;
111
+ }
112
+ const cs = callsite;
113
+ // Required callsite fields
114
+ const callsiteRequired = ['id', 'file', 'line', 'patterns', 'confidence'];
115
+ for (const field of callsiteRequired) {
116
+ if (!(field in cs)) {
117
+ errors.push({ path: `$.callsites[${i}].${field}`, message: `Missing required field: ${field}` });
118
+ }
119
+ }
120
+ // Type checks
121
+ if ('id' in cs && typeof cs.id !== 'string') {
122
+ errors.push({ path: `$.callsites[${i}].id`, message: 'id must be a string' });
123
+ }
124
+ if ('file' in cs && typeof cs.file !== 'string') {
125
+ errors.push({ path: `$.callsites[${i}].file`, message: 'file must be a string' });
126
+ }
127
+ if ('line' in cs) {
128
+ if (typeof cs.line !== 'number' || !Number.isInteger(cs.line) || cs.line < 1) {
129
+ errors.push({ path: `$.callsites[${i}].line`, message: 'line must be a positive integer' });
130
+ }
131
+ }
132
+ if ('confidence' in cs) {
133
+ if (typeof cs.confidence !== 'number' || cs.confidence < 0 || cs.confidence > 1) {
134
+ errors.push({ path: `$.callsites[${i}].confidence`, message: 'confidence must be a number between 0 and 1' });
135
+ }
136
+ }
137
+ if ('patterns' in cs && (typeof cs.patterns !== 'object' || cs.patterns === null)) {
138
+ errors.push({ path: `$.callsites[${i}].patterns`, message: 'patterns must be an object' });
139
+ }
140
+ // Provider validation (known providers)
141
+ const validProviders = [
142
+ 'openai', 'anthropic', 'google', 'cohere', 'mistral',
143
+ 'bedrock', 'azure_openai', 'together', 'fireworks',
144
+ 'groq', 'replicate', 'perplexity',
145
+ 'vllm', 'sglang', 'tgi', 'ollama', 'llamacpp',
146
+ 'unknown',
147
+ ];
148
+ if ('provider' in cs && cs.provider !== null && typeof cs.provider === 'string') {
149
+ if (!validProviders.includes(cs.provider)) {
150
+ warnings.push({
151
+ path: `$.callsites[${i}].provider`,
152
+ message: `Unknown provider: ${cs.provider}. Known providers: ${validProviders.join(', ')}`,
153
+ });
154
+ }
155
+ }
156
+ }
157
+ }
158
+ }
159
+ // Metadata validation (optional)
160
+ if ('metadata' in map && map.metadata !== null) {
161
+ if (typeof map.metadata !== 'object') {
162
+ warnings.push({ path: '$.metadata', message: 'metadata should be an object' });
163
+ }
164
+ }
165
+ return {
166
+ valid: errors.length === 0,
167
+ errors,
168
+ warnings,
169
+ };
170
+ }
171
+ // =============================================================================
172
+ // OUTPUT FORMATTING
173
+ // =============================================================================
174
+ /**
175
+ * Format validation results for terminal output
176
+ */
177
+ function formatResults(result, filePath) {
178
+ console.log('');
179
+ console.log(`InferenceMap Validation: ${filePath}`);
180
+ console.log('─'.repeat(60));
181
+ if (result.valid) {
182
+ console.log('✓ Valid InferenceMap v0.1');
183
+ }
184
+ else {
185
+ console.log('✗ Invalid InferenceMap');
186
+ }
187
+ console.log('');
188
+ if (result.errors.length > 0) {
189
+ console.log(`Errors (${result.errors.length}):`);
190
+ for (const error of result.errors) {
191
+ console.log(` ✗ ${error.path}: ${error.message}`);
192
+ if (error.expected !== undefined) {
193
+ console.log(` Expected: ${error.expected}`);
194
+ console.log(` Actual: ${error.actual}`);
195
+ }
196
+ }
197
+ console.log('');
198
+ }
199
+ if (result.warnings.length > 0) {
200
+ console.log(`Warnings (${result.warnings.length}):`);
201
+ for (const warning of result.warnings) {
202
+ console.log(` ⚠ ${warning.path}: ${warning.message}`);
203
+ }
204
+ console.log('');
205
+ }
206
+ if (result.valid && result.warnings.length === 0) {
207
+ console.log('No issues found.');
208
+ console.log('');
209
+ }
210
+ }
211
+ // =============================================================================
212
+ // COMMAND REGISTRATION
213
+ // =============================================================================
214
+ /**
215
+ * Register the validate-map command
216
+ */
217
+ export function registerValidateMapCommand(program) {
218
+ program
219
+ .command('validate-map')
220
+ .description('validate an InferenceMap JSON file against the v0.1 schema')
221
+ .argument('<file>', 'path to InferenceMap JSON file')
222
+ .option('--json', 'output validation results as JSON')
223
+ .option('--quiet', 'only output errors (exit code indicates validity)')
224
+ .action((file, options) => {
225
+ try {
226
+ // Resolve file path
227
+ const filePath = resolve(file);
228
+ // Check file exists
229
+ if (!existsSync(filePath)) {
230
+ console.error(`Error: File not found: ${filePath}`);
231
+ process.exit(1);
232
+ }
233
+ // Read and parse file
234
+ let data;
235
+ try {
236
+ const content = readFileSync(filePath, 'utf-8');
237
+ data = JSON.parse(content);
238
+ }
239
+ catch (parseError) {
240
+ if (options.json) {
241
+ console.log(JSON.stringify({
242
+ valid: false,
243
+ errors: [{
244
+ path: '$',
245
+ message: `Invalid JSON: ${parseError instanceof Error ? parseError.message : 'Parse error'}`,
246
+ }],
247
+ warnings: [],
248
+ }, null, 2));
249
+ }
250
+ else if (!options.quiet) {
251
+ console.error(`Error: Invalid JSON in ${file}`);
252
+ console.error(parseError instanceof Error ? parseError.message : 'Parse error');
253
+ }
254
+ process.exit(1);
255
+ }
256
+ // Validate
257
+ const result = validateInferenceMap(data);
258
+ // Output results
259
+ if (options.json) {
260
+ console.log(JSON.stringify(result, null, 2));
261
+ }
262
+ else if (!options.quiet) {
263
+ formatResults(result, file);
264
+ }
265
+ // Exit with appropriate code
266
+ process.exit(result.valid ? 0 : 1);
267
+ }
268
+ catch (error) {
269
+ console.error('Error:', error instanceof Error ? error.message : 'Validation failed');
270
+ process.exit(1);
271
+ }
272
+ });
273
+ }
274
+ //# sourceMappingURL=validate-map.js.map