@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,429 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import { parse as parseYAML } from 'yaml';
5
+ import { InsightTemplate, OptimizationTemplate } from './types.js';
6
+ // =============================================================================
7
+ // CONSTANTS
8
+ // =============================================================================
9
+ const TEMPLATES_REPO = 'https://raw.githubusercontent.com/Kalmantic/peakinfer_templates/main';
10
+ const MANIFEST_URL = `${TEMPLATES_REPO}/insights/manifest.json`;
11
+ const CACHE_DIR = '.peakinfer/cache/templates';
12
+ const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
13
+ // Get bundled templates directory (relative to this file)
14
+ const __filename = fileURLToPath(import.meta.url);
15
+ const __dirname = dirname(__filename);
16
+ const BUNDLED_DIR = join(__dirname, '..', 'templates');
17
+ const OPTIMIZATIONS_DIR = join(__dirname, '..', 'templates', 'optimizations');
18
+ const PROMPTS_DIR = join(__dirname, '..', 'prompts');
19
+ // =============================================================================
20
+ // HELPERS
21
+ // =============================================================================
22
+ function getCacheDir() {
23
+ return join(process.cwd(), CACHE_DIR);
24
+ }
25
+ function getCacheMetaPath() {
26
+ return join(getCacheDir(), 'meta.json');
27
+ }
28
+ function isCacheValid() {
29
+ const metaPath = getCacheMetaPath();
30
+ if (!existsSync(metaPath))
31
+ return false;
32
+ try {
33
+ const meta = JSON.parse(readFileSync(metaPath, 'utf-8'));
34
+ return Date.now() - meta.fetchedAt < CACHE_TTL_MS;
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ }
40
+ function findYamlFiles(dir) {
41
+ if (!existsSync(dir))
42
+ return [];
43
+ const results = [];
44
+ const entries = readdirSync(dir, { withFileTypes: true });
45
+ for (const entry of entries) {
46
+ const fullPath = join(dir, entry.name);
47
+ if (entry.isDirectory()) {
48
+ results.push(...findYamlFiles(fullPath));
49
+ }
50
+ else if (entry.name.endsWith('.yaml')) {
51
+ results.push(fullPath);
52
+ }
53
+ }
54
+ return results;
55
+ }
56
+ function loadCachedTemplates() {
57
+ const cacheDir = getCacheDir();
58
+ if (!existsSync(cacheDir))
59
+ return [];
60
+ const templates = [];
61
+ const files = findYamlFiles(cacheDir);
62
+ for (const file of files) {
63
+ try {
64
+ const content = readFileSync(file, 'utf-8');
65
+ const parsed = parseYAML(content);
66
+ const validated = InsightTemplate.parse(parsed);
67
+ templates.push(validated);
68
+ }
69
+ catch {
70
+ // Skip invalid templates
71
+ }
72
+ }
73
+ return templates;
74
+ }
75
+ function loadBundledTemplates() {
76
+ if (!existsSync(BUNDLED_DIR))
77
+ return [];
78
+ const templates = [];
79
+ const files = readdirSync(BUNDLED_DIR).filter(f => f.endsWith('.yaml'));
80
+ for (const file of files) {
81
+ try {
82
+ const content = readFileSync(join(BUNDLED_DIR, file), 'utf-8');
83
+ const parsed = parseYAML(content);
84
+ const validated = InsightTemplate.parse(parsed);
85
+ templates.push(validated);
86
+ }
87
+ catch {
88
+ // Skip invalid templates
89
+ }
90
+ }
91
+ return templates;
92
+ }
93
+ async function fetchManifest() {
94
+ try {
95
+ const response = await fetch(MANIFEST_URL);
96
+ if (!response.ok)
97
+ return null;
98
+ return await response.json();
99
+ }
100
+ catch {
101
+ return null;
102
+ }
103
+ }
104
+ async function fetchTemplate(templatePath) {
105
+ try {
106
+ // Templates are now in insights/{category}/{name}.yaml
107
+ const url = `${TEMPLATES_REPO}/insights/${templatePath}`;
108
+ const response = await fetch(url);
109
+ if (!response.ok)
110
+ return null;
111
+ return await response.text();
112
+ }
113
+ catch {
114
+ return null;
115
+ }
116
+ }
117
+ function saveToCache(templates, version) {
118
+ const cacheDir = getCacheDir();
119
+ mkdirSync(cacheDir, { recursive: true });
120
+ // Save each template (handle nested paths like cost/prompt-bloat.yaml)
121
+ for (const [name, content] of templates) {
122
+ const filePath = join(cacheDir, name);
123
+ mkdirSync(dirname(filePath), { recursive: true });
124
+ writeFileSync(filePath, content);
125
+ }
126
+ // Save meta
127
+ const meta = {
128
+ fetchedAt: Date.now(),
129
+ version,
130
+ };
131
+ writeFileSync(getCacheMetaPath(), JSON.stringify(meta, null, 2));
132
+ }
133
+ export async function loadTemplates(opts = {}) {
134
+ // If offline mode, skip remote fetch
135
+ if (opts.offline) {
136
+ const cached = loadCachedTemplates();
137
+ if (cached.length > 0)
138
+ return cached;
139
+ return loadBundledTemplates();
140
+ }
141
+ // Check cache validity
142
+ if (isCacheValid()) {
143
+ const cached = loadCachedTemplates();
144
+ if (cached.length > 0)
145
+ return cached;
146
+ }
147
+ // Try to fetch from remote
148
+ const manifest = await fetchManifest();
149
+ if (manifest) {
150
+ const templateContents = new Map();
151
+ const templates = [];
152
+ for (const templatePath of manifest.templates) {
153
+ const content = await fetchTemplate(templatePath);
154
+ if (content) {
155
+ templateContents.set(templatePath, content);
156
+ try {
157
+ const parsed = parseYAML(content);
158
+ const validated = InsightTemplate.parse(parsed);
159
+ templates.push(validated);
160
+ }
161
+ catch {
162
+ // Skip invalid templates
163
+ }
164
+ }
165
+ }
166
+ if (templates.length > 0) {
167
+ saveToCache(templateContents, manifest.version);
168
+ return templates;
169
+ }
170
+ }
171
+ // Fall back to stale cache
172
+ const cached = loadCachedTemplates();
173
+ if (cached.length > 0) {
174
+ console.warn('[templates] Using stale cache');
175
+ return cached;
176
+ }
177
+ // Fall back to bundled templates
178
+ console.warn('[templates] Using bundled templates');
179
+ return loadBundledTemplates();
180
+ }
181
+ /**
182
+ * Get a single template by ID
183
+ */
184
+ export async function getTemplate(id, opts = {}) {
185
+ const templates = await loadTemplates(opts);
186
+ return templates.find(t => t.id === id) || null;
187
+ }
188
+ /**
189
+ * Clear template cache
190
+ */
191
+ export function clearCache() {
192
+ const cacheDir = getCacheDir();
193
+ if (existsSync(cacheDir)) {
194
+ const files = readdirSync(cacheDir);
195
+ for (const file of files) {
196
+ const filePath = join(cacheDir, file);
197
+ try {
198
+ readFileSync(filePath); // Check if readable
199
+ writeFileSync(filePath, ''); // Clear content
200
+ }
201
+ catch {
202
+ // Skip
203
+ }
204
+ }
205
+ }
206
+ }
207
+ // =============================================================================
208
+ // OPTIMIZATION TEMPLATES API (v1.8 - Inference Squeeze Guide)
209
+ // =============================================================================
210
+ /**
211
+ * Load bundled optimization templates from templates/optimizations/
212
+ * These are community optimization runbooks with implementation steps
213
+ */
214
+ export function loadOptimizationTemplates() {
215
+ if (!existsSync(OPTIMIZATIONS_DIR))
216
+ return [];
217
+ const templates = [];
218
+ const files = readdirSync(OPTIMIZATIONS_DIR).filter(f => f.endsWith('.yaml'));
219
+ for (const file of files) {
220
+ try {
221
+ const content = readFileSync(join(OPTIMIZATIONS_DIR, file), 'utf-8');
222
+ const parsed = parseYAML(content);
223
+ const validated = OptimizationTemplate.parse(parsed);
224
+ templates.push(validated);
225
+ }
226
+ catch (err) {
227
+ // Skip invalid templates but log for debugging
228
+ console.warn(`[templates] Failed to load optimization template ${file}:`, err);
229
+ }
230
+ }
231
+ return templates;
232
+ }
233
+ /**
234
+ * Get a single optimization template by ID
235
+ */
236
+ export function getOptimizationTemplate(id) {
237
+ const templates = loadOptimizationTemplates();
238
+ return templates.find(t => t.id === id) || null;
239
+ }
240
+ // =============================================================================
241
+ // ANALYSIS PROMPTS API
242
+ // =============================================================================
243
+ /**
244
+ * Load an analysis prompt by ID from the prompts directory
245
+ * @param id - Prompt ID (e.g., 'peak-performance')
246
+ * @returns AnalysisPrompt or null if not found
247
+ */
248
+ export function loadPrompt(id) {
249
+ const promptPath = join(PROMPTS_DIR, `${id}.yaml`);
250
+ if (!existsSync(promptPath)) {
251
+ return null;
252
+ }
253
+ try {
254
+ const content = readFileSync(promptPath, 'utf-8');
255
+ const parsed = parseYAML(content);
256
+ // Validate required fields
257
+ if (!parsed.id || !parsed.prompt) {
258
+ console.warn(`[prompts] Invalid prompt file: ${promptPath} (missing id or prompt)`);
259
+ return null;
260
+ }
261
+ return parsed;
262
+ }
263
+ catch (err) {
264
+ console.warn(`[prompts] Failed to load prompt ${id}:`, err);
265
+ return null;
266
+ }
267
+ }
268
+ /**
269
+ * List all available analysis prompts
270
+ * @returns Array of prompt IDs
271
+ */
272
+ export function listPrompts() {
273
+ if (!existsSync(PROMPTS_DIR)) {
274
+ return [];
275
+ }
276
+ try {
277
+ const files = readdirSync(PROMPTS_DIR).filter(f => f.endsWith('.yaml'));
278
+ return files.map(f => f.replace('.yaml', ''));
279
+ }
280
+ catch {
281
+ return [];
282
+ }
283
+ }
284
+ /**
285
+ * Get the default analysis prompt (peak-performance)
286
+ * @returns AnalysisPrompt
287
+ * @throws Error if default prompt not found
288
+ */
289
+ export function getDefaultPrompt() {
290
+ const prompt = loadPrompt('peak-performance');
291
+ if (!prompt) {
292
+ throw new Error('[prompts] Default prompt "peak-performance" not found. Ensure prompts/peak-performance.yaml exists.');
293
+ }
294
+ return prompt;
295
+ }
296
+ // =============================================================================
297
+ // CONFIGURATION API
298
+ // =============================================================================
299
+ const CONFIG_DIR = join(__dirname, '..', 'config');
300
+ // Default configuration (used as fallback)
301
+ const DEFAULT_CONFIG = {
302
+ id: 'peakinfer',
303
+ version: '1.0',
304
+ description: 'Default PeakInfer configuration',
305
+ analysis: {
306
+ mode: 'agent',
307
+ cascade: true,
308
+ },
309
+ models: {
310
+ agent: {
311
+ primary: 'claude-opus-4-5-20251101',
312
+ fallback: 'claude-sonnet-4-20250514',
313
+ },
314
+ llm: {
315
+ primary: 'claude-sonnet-4-20250514',
316
+ fallback: 'claude-sonnet-4-20250514',
317
+ },
318
+ },
319
+ agent: {
320
+ max_iterations: 15,
321
+ verbose: false,
322
+ },
323
+ scanner: {
324
+ extensions: ['.py', '.ts', '.tsx', '.js', '.jsx'],
325
+ max_file_size: 1048576,
326
+ ignore: ['node_modules', '.git', '__pycache__', '.venv', 'venv', 'dist', 'build'],
327
+ },
328
+ output: {
329
+ format: 'json',
330
+ include_confidence: true,
331
+ min_confidence: 0.5,
332
+ },
333
+ };
334
+ // Cached config
335
+ let cachedConfig = null;
336
+ /**
337
+ * Load PeakInfer configuration from config/peakinfer.yaml
338
+ * Environment variables override file settings:
339
+ * - PEAKINFER_MODE: analysis mode (agent, llm, regex)
340
+ * - PEAKINFER_MODEL: primary model override
341
+ * - PEAKINFER_VERBOSE: enable verbose output
342
+ * @returns PeakInferConfig
343
+ */
344
+ export function loadConfig() {
345
+ // Return cached config if available
346
+ if (cachedConfig) {
347
+ return cachedConfig;
348
+ }
349
+ let config = { ...DEFAULT_CONFIG };
350
+ // Try to load from config file
351
+ const configPath = join(CONFIG_DIR, 'peakinfer.yaml');
352
+ if (existsSync(configPath)) {
353
+ try {
354
+ const content = readFileSync(configPath, 'utf-8');
355
+ const parsed = parseYAML(content);
356
+ // Deep merge with defaults
357
+ config = deepMerge(DEFAULT_CONFIG, parsed);
358
+ }
359
+ catch (err) {
360
+ console.warn('[config] Failed to load config file, using defaults:', err);
361
+ }
362
+ }
363
+ // Apply environment variable overrides
364
+ if (process.env.PEAKINFER_MODE) {
365
+ const mode = process.env.PEAKINFER_MODE.toLowerCase();
366
+ if (['agent', 'llm', 'regex'].includes(mode)) {
367
+ config.analysis.mode = mode;
368
+ }
369
+ }
370
+ if (process.env.PEAKINFER_MODEL) {
371
+ config.models.agent.primary = process.env.PEAKINFER_MODEL;
372
+ config.models.llm.primary = process.env.PEAKINFER_MODEL;
373
+ }
374
+ if (process.env.PEAKINFER_VERBOSE === '1' || process.env.PEAKINFER_VERBOSE === 'true') {
375
+ config.agent.verbose = true;
376
+ }
377
+ // Cache the config
378
+ cachedConfig = config;
379
+ return config;
380
+ }
381
+ /**
382
+ * Get the configured model for a given analysis type
383
+ * @param type - 'agent' or 'llm'
384
+ * @param fallback - whether to return fallback model
385
+ * @returns model name
386
+ */
387
+ export function getConfiguredModel(type, fallback = false) {
388
+ const config = loadConfig();
389
+ const models = config.models[type];
390
+ return fallback ? models.fallback : models.primary;
391
+ }
392
+ /**
393
+ * Get the configured analysis mode
394
+ * @returns analysis mode
395
+ */
396
+ export function getConfiguredMode() {
397
+ const config = loadConfig();
398
+ return config.analysis.mode;
399
+ }
400
+ /**
401
+ * Check if cascade fallback is enabled
402
+ * @returns true if cascade is enabled
403
+ */
404
+ export function isCascadeEnabled() {
405
+ const config = loadConfig();
406
+ return config.analysis.cascade;
407
+ }
408
+ /**
409
+ * Deep merge two objects
410
+ */
411
+ function deepMerge(target, source) {
412
+ const result = { ...target };
413
+ for (const key of Object.keys(source)) {
414
+ if (source[key] !== undefined) {
415
+ if (typeof source[key] === 'object' &&
416
+ source[key] !== null &&
417
+ !Array.isArray(source[key]) &&
418
+ typeof target[key] === 'object' &&
419
+ target[key] !== null) {
420
+ result[key] = deepMerge(target[key], source[key]);
421
+ }
422
+ else {
423
+ result[key] = source[key];
424
+ }
425
+ }
426
+ }
427
+ return result;
428
+ }
429
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEnE,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,MAAM,cAAc,GAAG,sEAAsE,CAAC;AAC9F,MAAM,YAAY,GAAG,GAAG,cAAc,yBAAyB,CAAC;AAChE,MAAM,SAAS,GAAG,4BAA4B,CAAC;AAC/C,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;AAErD,0DAA0D;AAC1D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AACvD,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;AAC9E,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;AAoCrD,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF,SAAS,WAAW;IAClB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,IAAI,GAAc,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAChD,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,oBAAoB;IAC3B,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAExE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAChD,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAc,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,YAAoB;IAC/C,IAAI,CAAC;QACH,uDAAuD;QACvD,MAAM,GAAG,GAAG,GAAG,cAAc,aAAa,YAAY,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,SAA8B,EAAE,OAAe;IAClE,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzC,uEAAuE;IACvE,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,SAAS,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,YAAY;IACZ,MAAM,IAAI,GAAc;QACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,OAAO;KACR,CAAC;IACF,aAAa,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAoB,EAAE;IACxD,qCAAqC;IACrC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACrC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC;QACrC,OAAO,oBAAoB,EAAE,CAAC;IAChC,CAAC;IAED,uBAAuB;IACvB,IAAI,YAAY,EAAE,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACrC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC;IACvC,CAAC;IAED,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC;IACvC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAC;QACnD,MAAM,SAAS,GAAsB,EAAE,CAAC;QAExC,KAAK,MAAM,YAAY,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;YAClD,IAAI,OAAO,EAAE,CAAC;gBACZ,gBAAgB,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBAC5C,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;oBAClC,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAChD,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC5B,CAAC;gBAAC,MAAM,CAAC;oBACP,yBAAyB;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,WAAW,CAAC,gBAAgB,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAChD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,iCAAiC;IACjC,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACpD,OAAO,oBAAoB,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAU,EAAE,OAAoB,EAAE;IAClE,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IAC5C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC;gBACH,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,oBAAoB;gBAC5C,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,8DAA8D;AAC9D,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,yBAAyB;IACvC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAAE,OAAO,EAAE,CAAC;IAE9C,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAE9E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACrD,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,+CAA+C;YAC/C,OAAO,CAAC,IAAI,CAAC,oDAAoD,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,EAAU;IAChD,MAAM,SAAS,GAAG,yBAAyB,EAAE,CAAC;IAC9C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;AAClD,CAAC;AAED,gFAAgF;AAChF,uBAAuB;AACvB,gFAAgF;AAEhF;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAEnD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAmB,CAAC;QAEpD,2BAA2B;QAC3B,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,kCAAkC,UAAU,yBAAyB,CAAC,CAAC;YACpF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACxE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qGAAqG,CAAC,CAAC;IACzH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAuCnD,2CAA2C;AAC3C,MAAM,cAAc,GAAoB;IACtC,EAAE,EAAE,WAAW;IACf,OAAO,EAAE,KAAK;IACd,WAAW,EAAE,iCAAiC;IAC9C,QAAQ,EAAE;QACR,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,IAAI;KACd;IACD,MAAM,EAAE;QACN,KAAK,EAAE;YACL,OAAO,EAAE,0BAA0B;YACnC,QAAQ,EAAE,0BAA0B;SACrC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,0BAA0B;YACnC,QAAQ,EAAE,0BAA0B;SACrC;KACF;IACD,KAAK,EAAE;QACL,cAAc,EAAE,EAAE;QAClB,OAAO,EAAE,KAAK;KACf;IACD,OAAO,EAAE;QACP,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;QACjD,aAAa,EAAE,OAAO;QACtB,MAAM,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;KAClF;IACD,MAAM,EAAE;QACN,MAAM,EAAE,MAAM;QACd,kBAAkB,EAAE,IAAI;QACxB,cAAc,EAAE,GAAG;KACpB;CACF,CAAC;AAEF,gBAAgB;AAChB,IAAI,YAAY,GAA2B,IAAI,CAAC;AAEhD;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU;IACxB,oCAAoC;IACpC,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,MAAM,GAAoB,EAAE,GAAG,cAAc,EAAE,CAAC;IAEpD,+BAA+B;IAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAA6B,CAAC;YAE9D,2BAA2B;YAC3B,MAAM,GAAG,SAAS,CAChB,cAAoD,EACpD,MAA4C,CACf,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,sDAAsD,EAAE,GAAG,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;QACtD,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAiC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC1D,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,EAAE,CAAC;QACtF,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED,mBAAmB;IACnB,YAAY,GAAG,MAAM,CAAC;IAEtB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAqB,EAAE,WAAoB,KAAK;IACjF,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,MAA+B,EAAE,MAA+B;IACjF,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAE7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC9B,IACE,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ;gBAC/B,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI;gBACpB,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC3B,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ;gBAC/B,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EACpB,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CACrB,MAAM,CAAC,GAAG,CAA4B,EACtC,MAAM,CAAC,GAAG,CAA4B,CACvC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Tool definitions for agent-driven analysis
3
+ *
4
+ * From Autonomous Agent Architecture Patterns v0.1:
5
+ * - Schema-first design using Zod
6
+ * - Tool registry pattern for LLM tool resolution
7
+ *
8
+ * From DESIGN.md v2.0 Section 2.4:
9
+ * - Agent analysis constrained to: Glob -> Grep -> Read
10
+ * - Returns structured JSON (validated)
11
+ * - No unbounded tool access
12
+ */
13
+ import { z } from 'zod';
14
+ export interface Tool<TInput, TOutput> {
15
+ name: string;
16
+ description: string;
17
+ inputSchema: z.ZodSchema<TInput>;
18
+ outputSchema: z.ZodSchema<TOutput>;
19
+ execute: (input: TInput) => Promise<TOutput>;
20
+ }
21
+ declare const GlobInputSchema: z.ZodObject<{
22
+ pattern: z.ZodString;
23
+ cwd: z.ZodOptional<z.ZodString>;
24
+ ignore: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
25
+ }, "strip", z.ZodTypeAny, {
26
+ pattern: string;
27
+ cwd?: string | undefined;
28
+ ignore?: string[] | undefined;
29
+ }, {
30
+ pattern: string;
31
+ cwd?: string | undefined;
32
+ ignore?: string[] | undefined;
33
+ }>;
34
+ declare const GlobOutputSchema: z.ZodObject<{
35
+ files: z.ZodArray<z.ZodString, "many">;
36
+ count: z.ZodNumber;
37
+ }, "strip", z.ZodTypeAny, {
38
+ files: string[];
39
+ count: number;
40
+ }, {
41
+ files: string[];
42
+ count: number;
43
+ }>;
44
+ export declare const GlobTool: Tool<z.infer<typeof GlobInputSchema>, z.infer<typeof GlobOutputSchema>>;
45
+ declare const GrepInputSchema: z.ZodObject<{
46
+ pattern: z.ZodString;
47
+ files: z.ZodArray<z.ZodString, "many">;
48
+ maxMatches: z.ZodOptional<z.ZodNumber>;
49
+ }, "strip", z.ZodTypeAny, {
50
+ files: string[];
51
+ pattern: string;
52
+ maxMatches?: number | undefined;
53
+ }, {
54
+ files: string[];
55
+ pattern: string;
56
+ maxMatches?: number | undefined;
57
+ }>;
58
+ declare const GrepOutputSchema: z.ZodObject<{
59
+ matches: z.ZodArray<z.ZodObject<{
60
+ file: z.ZodString;
61
+ line: z.ZodNumber;
62
+ content: z.ZodString;
63
+ }, "strip", z.ZodTypeAny, {
64
+ file: string;
65
+ line: number;
66
+ content: string;
67
+ }, {
68
+ file: string;
69
+ line: number;
70
+ content: string;
71
+ }>, "many">;
72
+ totalMatches: z.ZodNumber;
73
+ }, "strip", z.ZodTypeAny, {
74
+ matches: {
75
+ file: string;
76
+ line: number;
77
+ content: string;
78
+ }[];
79
+ totalMatches: number;
80
+ }, {
81
+ matches: {
82
+ file: string;
83
+ line: number;
84
+ content: string;
85
+ }[];
86
+ totalMatches: number;
87
+ }>;
88
+ export declare const GrepTool: Tool<z.infer<typeof GrepInputSchema>, z.infer<typeof GrepOutputSchema>>;
89
+ declare const ReadInputSchema: z.ZodObject<{
90
+ file: z.ZodString;
91
+ maxLines: z.ZodOptional<z.ZodNumber>;
92
+ startLine: z.ZodOptional<z.ZodNumber>;
93
+ }, "strip", z.ZodTypeAny, {
94
+ file: string;
95
+ maxLines?: number | undefined;
96
+ startLine?: number | undefined;
97
+ }, {
98
+ file: string;
99
+ maxLines?: number | undefined;
100
+ startLine?: number | undefined;
101
+ }>;
102
+ declare const ReadOutputSchema: z.ZodObject<{
103
+ content: z.ZodString;
104
+ lines: z.ZodNumber;
105
+ truncated: z.ZodBoolean;
106
+ }, "strip", z.ZodTypeAny, {
107
+ content: string;
108
+ lines: number;
109
+ truncated: boolean;
110
+ }, {
111
+ content: string;
112
+ lines: number;
113
+ truncated: boolean;
114
+ }>;
115
+ export declare const ReadTool: Tool<z.infer<typeof ReadInputSchema>, z.infer<typeof ReadOutputSchema>>;
116
+ export declare class ToolRegistry {
117
+ private tools;
118
+ register<TInput, TOutput>(tool: Tool<TInput, TOutput>): void;
119
+ get(name: string): Tool<unknown, unknown> | undefined;
120
+ execute(name: string, args: unknown): Promise<unknown>;
121
+ getSchemaPrompt(): string;
122
+ list(): string[];
123
+ }
124
+ export declare function createConstrainedRegistry(): ToolRegistry;
125
+ export declare const AGENT_TOOLS: (Tool<{
126
+ pattern: string;
127
+ cwd?: string | undefined;
128
+ ignore?: string[] | undefined;
129
+ }, {
130
+ files: string[];
131
+ count: number;
132
+ }> | Tool<{
133
+ files: string[];
134
+ pattern: string;
135
+ maxMatches?: number | undefined;
136
+ }, {
137
+ matches: {
138
+ file: string;
139
+ line: number;
140
+ content: string;
141
+ }[];
142
+ totalMatches: number;
143
+ }> | Tool<{
144
+ file: string;
145
+ maxLines?: number | undefined;
146
+ startLine?: number | undefined;
147
+ }, {
148
+ content: string;
149
+ lines: number;
150
+ truncated: boolean;
151
+ }>)[];
152
+ export {};
153
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,MAAM,WAAW,IAAI,CAAC,MAAM,EAAE,OAAO;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACjC,YAAY,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C;AAMD,QAAA,MAAM,eAAe;;;;;;;;;;;;EAInB,CAAC;AAEH,QAAA,MAAM,gBAAgB;;;;;;;;;EAGpB,CAAC;AAEH,eAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAa5F,CAAC;AAMF,QAAA,MAAM,eAAe;;;;;;;;;;;;EAInB,CAAC;AAQH,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGpB,CAAC;AAEH,eAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CA2B5F,CAAC;AAMF,QAAA,MAAM,eAAe;;;;;;;;;;;;EAInB,CAAC;AAEH,QAAA,MAAM,gBAAgB;;;;;;;;;;;;EAIpB,CAAC;AAEH,eAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAqC5F,CAAC;AAMF,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA6C;IAE1D,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI5D,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS;IAI/C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ5D,eAAe,IAAI,MAAM;IAQzB,IAAI,IAAI,MAAM,EAAE;CAGjB;AAMD,wBAAgB,yBAAyB,IAAI,YAAY,CAMxD;AAGD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;KAAiC,CAAC"}