antri_cli 1.26.0

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 (171) hide show
  1. package/README.md +92 -0
  2. package/bin/antri.js +2 -0
  3. package/dist/cli/banner.d.ts +22 -0
  4. package/dist/cli/banner.d.ts.map +1 -0
  5. package/dist/cli/banner.js +133 -0
  6. package/dist/cli/banner.js.map +1 -0
  7. package/dist/cli/dialogs/filePicker.d.ts +23 -0
  8. package/dist/cli/dialogs/filePicker.d.ts.map +1 -0
  9. package/dist/cli/dialogs/filePicker.js +106 -0
  10. package/dist/cli/dialogs/filePicker.js.map +1 -0
  11. package/dist/cli/dialogs/modelPicker.d.ts +10 -0
  12. package/dist/cli/dialogs/modelPicker.d.ts.map +1 -0
  13. package/dist/cli/dialogs/modelPicker.js +205 -0
  14. package/dist/cli/dialogs/modelPicker.js.map +1 -0
  15. package/dist/cli/dialogs/profilePicker.d.ts +11 -0
  16. package/dist/cli/dialogs/profilePicker.d.ts.map +1 -0
  17. package/dist/cli/dialogs/profilePicker.js +185 -0
  18. package/dist/cli/dialogs/profilePicker.js.map +1 -0
  19. package/dist/cli/dialogs/providerPicker.d.ts +19 -0
  20. package/dist/cli/dialogs/providerPicker.d.ts.map +1 -0
  21. package/dist/cli/dialogs/providerPicker.js +205 -0
  22. package/dist/cli/dialogs/providerPicker.js.map +1 -0
  23. package/dist/cli/prompt.d.ts +3 -0
  24. package/dist/cli/prompt.d.ts.map +1 -0
  25. package/dist/cli/prompt.js +50 -0
  26. package/dist/cli/prompt.js.map +1 -0
  27. package/dist/cli/promptToolkit.d.ts +14 -0
  28. package/dist/cli/promptToolkit.d.ts.map +1 -0
  29. package/dist/cli/promptToolkit.js +389 -0
  30. package/dist/cli/promptToolkit.js.map +1 -0
  31. package/dist/cli/renderer.d.ts +21 -0
  32. package/dist/cli/renderer.d.ts.map +1 -0
  33. package/dist/cli/renderer.js +97 -0
  34. package/dist/cli/renderer.js.map +1 -0
  35. package/dist/cli/shortcuts.d.ts +13 -0
  36. package/dist/cli/shortcuts.d.ts.map +1 -0
  37. package/dist/cli/shortcuts.js +414 -0
  38. package/dist/cli/shortcuts.js.map +1 -0
  39. package/dist/core/agent.d.ts +15 -0
  40. package/dist/core/agent.d.ts.map +1 -0
  41. package/dist/core/agent.js +232 -0
  42. package/dist/core/agent.js.map +1 -0
  43. package/dist/core/citations.d.ts +19 -0
  44. package/dist/core/citations.d.ts.map +1 -0
  45. package/dist/core/citations.js +40 -0
  46. package/dist/core/citations.js.map +1 -0
  47. package/dist/core/config.d.ts +16 -0
  48. package/dist/core/config.d.ts.map +1 -0
  49. package/dist/core/config.js +172 -0
  50. package/dist/core/config.js.map +1 -0
  51. package/dist/core/crawler.d.ts +18 -0
  52. package/dist/core/crawler.d.ts.map +1 -0
  53. package/dist/core/crawler.js +83 -0
  54. package/dist/core/crawler.js.map +1 -0
  55. package/dist/core/debugger.d.ts +20 -0
  56. package/dist/core/debugger.d.ts.map +1 -0
  57. package/dist/core/debugger.js +105 -0
  58. package/dist/core/debugger.js.map +1 -0
  59. package/dist/core/dialectic.d.ts +23 -0
  60. package/dist/core/dialectic.d.ts.map +1 -0
  61. package/dist/core/dialectic.js +300 -0
  62. package/dist/core/dialectic.js.map +1 -0
  63. package/dist/core/goalLoop.d.ts +14 -0
  64. package/dist/core/goalLoop.d.ts.map +1 -0
  65. package/dist/core/goalLoop.js +104 -0
  66. package/dist/core/goalLoop.js.map +1 -0
  67. package/dist/core/history.d.ts +13 -0
  68. package/dist/core/history.d.ts.map +1 -0
  69. package/dist/core/history.js +53 -0
  70. package/dist/core/history.js.map +1 -0
  71. package/dist/core/metaOptimizer.d.ts +27 -0
  72. package/dist/core/metaOptimizer.d.ts.map +1 -0
  73. package/dist/core/metaOptimizer.js +98 -0
  74. package/dist/core/metaOptimizer.js.map +1 -0
  75. package/dist/core/sandbox.d.ts +29 -0
  76. package/dist/core/sandbox.d.ts.map +1 -0
  77. package/dist/core/sandbox.js +141 -0
  78. package/dist/core/sandbox.js.map +1 -0
  79. package/dist/core/scraper.d.ts +22 -0
  80. package/dist/core/scraper.d.ts.map +1 -0
  81. package/dist/core/scraper.js +180 -0
  82. package/dist/core/scraper.js.map +1 -0
  83. package/dist/core/search.d.ts +27 -0
  84. package/dist/core/search.d.ts.map +1 -0
  85. package/dist/core/search.js +222 -0
  86. package/dist/core/search.js.map +1 -0
  87. package/dist/core/skillSynthesizer.d.ts +43 -0
  88. package/dist/core/skillSynthesizer.d.ts.map +1 -0
  89. package/dist/core/skillSynthesizer.js +147 -0
  90. package/dist/core/skillSynthesizer.js.map +1 -0
  91. package/dist/core/tools.d.ts +12 -0
  92. package/dist/core/tools.d.ts.map +1 -0
  93. package/dist/core/tools.js +467 -0
  94. package/dist/core/tools.js.map +1 -0
  95. package/dist/core/updater.d.ts +9 -0
  96. package/dist/core/updater.d.ts.map +1 -0
  97. package/dist/core/updater.js +63 -0
  98. package/dist/core/updater.js.map +1 -0
  99. package/dist/index.d.ts +3 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +92 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/memory/consolidation.d.ts +17 -0
  104. package/dist/memory/consolidation.d.ts.map +1 -0
  105. package/dist/memory/consolidation.js +42 -0
  106. package/dist/memory/consolidation.js.map +1 -0
  107. package/dist/memory/episodic.d.ts +15 -0
  108. package/dist/memory/episodic.d.ts.map +1 -0
  109. package/dist/memory/episodic.js +97 -0
  110. package/dist/memory/episodic.js.map +1 -0
  111. package/dist/memory/manager.d.ts +24 -0
  112. package/dist/memory/manager.d.ts.map +1 -0
  113. package/dist/memory/manager.js +97 -0
  114. package/dist/memory/manager.js.map +1 -0
  115. package/dist/memory/profile.d.ts +21 -0
  116. package/dist/memory/profile.d.ts.map +1 -0
  117. package/dist/memory/profile.js +111 -0
  118. package/dist/memory/profile.js.map +1 -0
  119. package/dist/memory/semantic.d.ts +24 -0
  120. package/dist/memory/semantic.d.ts.map +1 -0
  121. package/dist/memory/semantic.js +102 -0
  122. package/dist/memory/semantic.js.map +1 -0
  123. package/dist/memory/types.d.ts +45 -0
  124. package/dist/memory/types.d.ts.map +1 -0
  125. package/dist/memory/types.js +2 -0
  126. package/dist/memory/types.js.map +1 -0
  127. package/dist/memory/vectorStore.d.ts +18 -0
  128. package/dist/memory/vectorStore.d.ts.map +1 -0
  129. package/dist/memory/vectorStore.js +103 -0
  130. package/dist/memory/vectorStore.js.map +1 -0
  131. package/dist/profiles/profileManager.d.ts +25 -0
  132. package/dist/profiles/profileManager.d.ts.map +1 -0
  133. package/dist/profiles/profileManager.js +205 -0
  134. package/dist/profiles/profileManager.js.map +1 -0
  135. package/dist/providers/anthropic.d.ts +14 -0
  136. package/dist/providers/anthropic.d.ts.map +1 -0
  137. package/dist/providers/anthropic.js +80 -0
  138. package/dist/providers/anthropic.js.map +1 -0
  139. package/dist/providers/base.d.ts +7 -0
  140. package/dist/providers/base.d.ts.map +1 -0
  141. package/dist/providers/base.js +2 -0
  142. package/dist/providers/base.js.map +1 -0
  143. package/dist/providers/gemini.d.ts +14 -0
  144. package/dist/providers/gemini.d.ts.map +1 -0
  145. package/dist/providers/gemini.js +77 -0
  146. package/dist/providers/gemini.js.map +1 -0
  147. package/dist/providers/index.d.ts +4 -0
  148. package/dist/providers/index.d.ts.map +1 -0
  149. package/dist/providers/index.js +65 -0
  150. package/dist/providers/index.js.map +1 -0
  151. package/dist/providers/mock.d.ts +8 -0
  152. package/dist/providers/mock.d.ts.map +1 -0
  153. package/dist/providers/mock.js +62 -0
  154. package/dist/providers/mock.js.map +1 -0
  155. package/dist/providers/models.d.ts +8 -0
  156. package/dist/providers/models.d.ts.map +1 -0
  157. package/dist/providers/models.js +403 -0
  158. package/dist/providers/models.js.map +1 -0
  159. package/dist/providers/openai.d.ts +18 -0
  160. package/dist/providers/openai.d.ts.map +1 -0
  161. package/dist/providers/openai.js +162 -0
  162. package/dist/providers/openai.js.map +1 -0
  163. package/dist/types.d.ts +116 -0
  164. package/dist/types.d.ts.map +1 -0
  165. package/dist/types.js +2 -0
  166. package/dist/types.js.map +1 -0
  167. package/dist/utils/logger.d.ts +23 -0
  168. package/dist/utils/logger.d.ts.map +1 -0
  169. package/dist/utils/logger.js +26 -0
  170. package/dist/utils/logger.js.map +1 -0
  171. package/package.json +57 -0
@@ -0,0 +1,232 @@
1
+ import ora from 'ora';
2
+ import chalk from 'chalk';
3
+ import { createProvider } from '../providers/index.js';
4
+ import { ConversationHistory } from './history.js';
5
+ import { getAllActiveTools, ToolExecutor } from './tools.js';
6
+ import { TerminalRenderer } from '../cli/renderer.js';
7
+ import { FilePickerService } from '../cli/dialogs/filePicker.js';
8
+ import { CitationEngine } from './citations.js';
9
+ import { memoryManager } from '../memory/manager.js';
10
+ import { profileManager } from '../profiles/profileManager.js';
11
+ import { SelfDebugger } from './debugger.js';
12
+ import { metaOptimizer } from './metaOptimizer.js';
13
+ import { log } from '../utils/logger.js';
14
+ export class AntriAgent {
15
+ config;
16
+ history;
17
+ toolExecutor;
18
+ citationEngine;
19
+ constructor(config, history) {
20
+ this.config = config;
21
+ this.history = history || new ConversationHistory();
22
+ this.toolExecutor = new ToolExecutor(config.workingDir);
23
+ this.citationEngine = new CitationEngine();
24
+ }
25
+ getHistory() {
26
+ return this.history;
27
+ }
28
+ updateConfig(newConfig) {
29
+ this.config = newConfig;
30
+ this.toolExecutor = new ToolExecutor(newConfig.workingDir);
31
+ }
32
+ buildSystemPrompt(recalledMemoryContext = '') {
33
+ const activeProfileName = profileManager.getActiveProfileName();
34
+ const activeProfileContent = profileManager.getActiveProfileContent();
35
+ const mode = this.config.mode || 'vibe';
36
+ let modeDirective = '';
37
+ if (mode === 'plan') {
38
+ modeDirective = `
39
+ ⚡ ACTIVE OPERATING MODE: PLAN MODE
40
+ - You are in PLAN MODE. Your primary goal is to collaborate with the user on high-level architecture, design specifications, and step-by-step implementation blueprints BEFORE writing code.
41
+ - Propose structured phased roadmaps (Phase 1, Phase 2, etc.) and list necessary file additions/modifications.
42
+ - Ask sharp clarifying questions regarding trade-offs, tech choices, or edge cases.
43
+ - Do NOT prematurely modify codebase files or execute destructive actions without presenting the plan first and getting user alignment.`;
44
+ }
45
+ else {
46
+ modeDirective = `
47
+ ⚡ ACTIVE OPERATING MODE: VIBE MODE
48
+ - You are in VIBE MODE. You directly chat with the user and immediately implement features, write code, run commands, and execute tools in continuous flow.
49
+ - Deliver working, high-quality, production-ready code with maximum speed and precision.`;
50
+ }
51
+ const basePrompt = `You are ANTRI Code, an intelligent, terminal-first AI coding companion, proactive facilitator, and autonomous meta-agent.
52
+
53
+ Core Behavioral Principles:
54
+ 1. Lead the Way & Guide Step-by-Step: Don't just give passive answers. Proactively lead the way, lay out step-by-step execution roadmaps, and propose the next logical milestones.
55
+ 2. Ask Clarifying Questions: Whenever a requirement is underspecified, has multiple architectural paths, or involves technical trade-offs, ask concise, targeted clarifying questions to ensure perfect alignment with the user's vision.
56
+ 3. Adaptive Note-Taking & Feedback Capture: Pay close attention to user feedback, preferred conventions, and mental models. Continuously adapt your explanations and code to their unique thinking style.
57
+ ${modeDirective}
58
+
59
+ Tooling & Workspace Capabilities:
60
+ 1. Workspace Tools: read_file, write_file, list_dir, search_files, run_command.
61
+ 2. Sandboxed Runtime: execute_python (run safe isolated Python code scripts).
62
+ 3. Skill Synthesis: synthesize_skill (create, test, and register new permanent Python tools to ~/.agent-cli/skills/).
63
+ 4. Web & Research Tools: web_search (multi-provider search without API key), scrape_url (deep readable content extraction into Markdown), and crawl_docs (recursive documentation crawler).
64
+ 5. Persistent Lifelong Memory & Multi-Profile Thinking: Adhere strictly to the active profile markdown context and project conventions.
65
+
66
+ Autonomous Guidelines:
67
+ - If a user asks for complex calculation, data analysis, or scripting, use 'execute_python'.
68
+ - If a user asks to create a reusable tool or skill, use 'synthesize_skill'.
69
+ - If a user asks for external information, documentation, or libraries, autonomously call 'web_search', 'scrape_url', or 'crawl_docs'.
70
+ - If a user attaches a file ([Attached File: ...]), examine the provided content directly.
71
+ - Cite sources clearly when using web research.
72
+ - Write clean, production-grade, typed code.`;
73
+ const profileSection = activeProfileContent
74
+ ? `\n\n--- Active Thinking Profile [${activeProfileName}] ---\n${activeProfileContent}\n---------------------------------------------`
75
+ : '';
76
+ const context = `\n\nWorkspace context:
77
+ - Current Working Directory: ${this.config.workingDir}
78
+ - Active Model: ${this.config.model}
79
+ - Active Mode: ${mode.toUpperCase()}
80
+ - Active Profile: ${activeProfileName}${profileSection}${recalledMemoryContext}`;
81
+ return basePrompt + context;
82
+ }
83
+ async chat(userPrompt) {
84
+ const startTime = Date.now();
85
+ this.citationEngine.clear();
86
+ // 1. Capture feedback / note into active profile
87
+ const activeProfileName = profileManager.getActiveProfileName();
88
+ const notedInsight = profileManager.extractAndRecordNotes(userPrompt);
89
+ if (notedInsight) {
90
+ console.log(chalk.hex('#38bdf8')(`📝 Noted in profile [${activeProfileName}]: "${notedInsight}"`));
91
+ }
92
+ // 2. Autonomous Self-Recall into Persistent Memory Hierarchy
93
+ const geminiKey = this.config.apiKeys.gemini || process.env.GEMINI_API_KEY;
94
+ const { contextText, recalled } = await memoryManager.selfRecall(userPrompt, this.config.workingDir, geminiKey);
95
+ if (recalled.hasMemories && (recalled.semanticInsights.length > 0 || recalled.workspaceConventions.length > 0)) {
96
+ const matchCount = recalled.semanticInsights.length + recalled.workspaceConventions.length;
97
+ console.log(chalk.hex('#818cf8')(`🧠 Recalled ${matchCount} relevant memory item(s) from persistent store`));
98
+ }
99
+ // 3. Resolve any @file attachments in userPrompt
100
+ const { enhancedPrompt, attachedFiles } = FilePickerService.extractAndReadAttachments(userPrompt, this.config.workingDir);
101
+ if (attachedFiles.length > 0) {
102
+ console.log(chalk.hex('#64748b')(`📎 Attached file(s): ${attachedFiles.map((f) => chalk.cyan(f)).join(', ')}`));
103
+ }
104
+ // 4. Add user message to history
105
+ this.history.addMessage({
106
+ role: 'user',
107
+ content: enhancedPrompt,
108
+ });
109
+ const response = await this.runAgentLoop(0, contextText);
110
+ // 5. Record interaction into persistent episodic memory & meta-optimizer
111
+ memoryManager.recordInteraction(userPrompt, response);
112
+ const duration = Date.now() - startTime;
113
+ metaOptimizer.recordQuerySuccess(duration);
114
+ const elapsed = Math.max(0.1, duration / 1000).toFixed(0);
115
+ const modeTag = (this.config.mode || 'vibe').toUpperCase();
116
+ console.log(chalk.hex('#64748b')(`* Worked for ${elapsed}s · Mode: ${modeTag} · Profile: ${activeProfileName}`));
117
+ console.log();
118
+ return response;
119
+ }
120
+ async runAgentLoop(depth = 0, memoryContext = '') {
121
+ if (depth > 6) {
122
+ log.warn('Max agent tool iteration depth reached.');
123
+ return '';
124
+ }
125
+ const provider = createProvider(this.config);
126
+ const systemPrompt = this.buildSystemPrompt(memoryContext);
127
+ const messagesWithSystem = [
128
+ { role: 'system', content: systemPrompt },
129
+ ...this.history.getMessages(),
130
+ ];
131
+ const modeLabel = this.config.mode === 'plan' ? 'Planning & Designing Roadmap...' : 'Thinking & Writing Code...';
132
+ let spinner = ora({
133
+ text: chalk.hex('#a5b4fc')(modeLabel),
134
+ spinner: 'dots',
135
+ color: 'cyan',
136
+ }).start();
137
+ let hasStreamedTokens = false;
138
+ let fullResponse = '';
139
+ const pendingToolCalls = [];
140
+ try {
141
+ const activeTools = this.config.autoExecuteTools ? getAllActiveTools() : [];
142
+ fullResponse = await provider.sendMessageStream(messagesWithSystem, activeTools, {
143
+ onToken: (token) => {
144
+ if (spinner) {
145
+ spinner.stop();
146
+ spinner = null;
147
+ }
148
+ if (!hasStreamedTokens) {
149
+ hasStreamedTokens = true;
150
+ }
151
+ TerminalRenderer.printToken(token);
152
+ },
153
+ onToolCall: (toolCall) => {
154
+ if (spinner) {
155
+ spinner.stop();
156
+ spinner = null;
157
+ }
158
+ pendingToolCalls.push(toolCall);
159
+ },
160
+ });
161
+ if (spinner) {
162
+ spinner.stop();
163
+ spinner = null;
164
+ }
165
+ if (hasStreamedTokens) {
166
+ console.log(); // Newline after stream
167
+ console.log();
168
+ }
169
+ // Record assistant message
170
+ this.history.addMessage({
171
+ role: 'assistant',
172
+ content: fullResponse,
173
+ tool_calls: pendingToolCalls.length > 0 ? pendingToolCalls : undefined,
174
+ });
175
+ // If LLM produced tool calls, execute them and continue loop
176
+ if (pendingToolCalls.length > 0) {
177
+ for (const tc of pendingToolCalls) {
178
+ let parsedArgs = {};
179
+ try {
180
+ parsedArgs = JSON.parse(tc.function.arguments || '{}');
181
+ }
182
+ catch {
183
+ parsedArgs = {};
184
+ }
185
+ const toolStart = Date.now();
186
+ let result = await this.toolExecutor.execute(tc.function.name, parsedArgs, tc.id);
187
+ // Autonomous Self-Debugging Loop on tool failure
188
+ if (result.error) {
189
+ metaOptimizer.recordToolExecution(tc.function.name, Date.now() - toolStart, true);
190
+ const repair = await SelfDebugger.autoDebugAndRepair(tc, result, this.config, (n, a, id) => this.toolExecutor.execute(n, a, id));
191
+ if (repair.repaired && repair.repairedResult) {
192
+ result = repair.repairedResult;
193
+ metaOptimizer.recordSelfHealing();
194
+ }
195
+ }
196
+ else {
197
+ metaOptimizer.recordToolExecution(tc.function.name, Date.now() - toolStart, false);
198
+ }
199
+ // Track citations if web search or scrape
200
+ if (tc.function.name === 'web_search' && parsedArgs.query) {
201
+ this.citationEngine.addSource(`Web Search: ${parsedArgs.query}`, `https://duckduckgo.com/?q=${encodeURIComponent(parsedArgs.query)}`, undefined, 'DuckDuckGo');
202
+ }
203
+ else if (tc.function.name === 'scrape_url' && parsedArgs.url) {
204
+ this.citationEngine.addSource(`Scraped URL`, parsedArgs.url, undefined, 'Web Reader');
205
+ }
206
+ else if (tc.function.name === 'crawl_docs' && parsedArgs.url) {
207
+ this.citationEngine.addSource(`Documentation Root`, parsedArgs.url, undefined, 'Doc Crawler');
208
+ }
209
+ // Output compact single-line tool usage
210
+ TerminalRenderer.printToolCompact(tc, result);
211
+ this.history.addMessage({
212
+ role: 'tool',
213
+ name: tc.function.name,
214
+ tool_call_id: tc.id,
215
+ content: result.output,
216
+ });
217
+ }
218
+ // Loop back to let assistant interpret tool results
219
+ return await this.runAgentLoop(depth + 1, memoryContext);
220
+ }
221
+ return fullResponse;
222
+ }
223
+ catch (err) {
224
+ if (spinner) {
225
+ spinner.stop();
226
+ }
227
+ log.error(`Request failed: ${err.message}`);
228
+ return '';
229
+ }
230
+ }
231
+ }
232
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface CitationSource {
2
+ id: number;
3
+ title: string;
4
+ url: string;
5
+ snippet?: string;
6
+ provider?: string;
7
+ }
8
+ export declare class CitationEngine {
9
+ private sources;
10
+ private nextId;
11
+ addSource(title: string, url: string, snippet?: string, provider?: string): CitationSource;
12
+ getSources(): CitationSource[];
13
+ clear(): void;
14
+ /**
15
+ * Generates a markdown bibliography block
16
+ */
17
+ generateBibliography(): string;
18
+ }
19
+ //# sourceMappingURL=citations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"citations.d.ts","sourceRoot":"","sources":["../../src/core/citations.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA0C;IACzD,OAAO,CAAC,MAAM,CAAK;IAEZ,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc;IAe1F,UAAU,IAAI,cAAc,EAAE;IAI9B,KAAK,IAAI,IAAI;IAKpB;;OAEG;IACI,oBAAoB,IAAI,MAAM;CAWtC"}
@@ -0,0 +1,40 @@
1
+ export class CitationEngine {
2
+ sources = new Map();
3
+ nextId = 1;
4
+ addSource(title, url, snippet, provider) {
5
+ if (this.sources.has(url)) {
6
+ return this.sources.get(url);
7
+ }
8
+ const source = {
9
+ id: this.nextId++,
10
+ title: title || url,
11
+ url,
12
+ snippet,
13
+ provider,
14
+ };
15
+ this.sources.set(url, source);
16
+ return source;
17
+ }
18
+ getSources() {
19
+ return Array.from(this.sources.values());
20
+ }
21
+ clear() {
22
+ this.sources.clear();
23
+ this.nextId = 1;
24
+ }
25
+ /**
26
+ * Generates a markdown bibliography block
27
+ */
28
+ generateBibliography() {
29
+ const list = this.getSources();
30
+ if (list.length === 0)
31
+ return '';
32
+ let md = '\n\n### 📚 Sources & Citations\n';
33
+ for (const s of list) {
34
+ const prov = s.provider ? ` *(${s.provider})*` : '';
35
+ md += `- [^${s.id}] [${s.title}](${s.url})${prov}\n`;
36
+ }
37
+ return md;
38
+ }
39
+ }
40
+ //# sourceMappingURL=citations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"citations.js","sourceRoot":"","sources":["../../src/core/citations.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,cAAc;IACjB,OAAO,GAAgC,IAAI,GAAG,EAAE,CAAC;IACjD,MAAM,GAAG,CAAC,CAAC;IAEZ,SAAS,CAAC,KAAa,EAAE,GAAW,EAAE,OAAgB,EAAE,QAAiB;QAC9E,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QAChC,CAAC;QACD,MAAM,MAAM,GAAmB;YAC7B,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;YACjB,KAAK,EAAE,KAAK,IAAI,GAAG;YACnB,GAAG;YACH,OAAO;YACP,QAAQ;SACT,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,UAAU;QACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,CAAC;IAED;;OAEG;IACI,oBAAoB;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEjC,IAAI,EAAE,GAAG,kCAAkC,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;QACvD,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ import { AntriConfig, ProviderType, AgentMode } from '../types.js';
2
+ export declare class ConfigManager {
3
+ private config;
4
+ constructor();
5
+ private loadConfig;
6
+ get(): AntriConfig;
7
+ set<K extends keyof AntriConfig>(key: K, value: AntriConfig[K]): void;
8
+ setMode(mode: AgentMode): void;
9
+ setAlwaysAllow(allow: boolean): void;
10
+ setApiKey(provider: string, key: string): void;
11
+ setBaseUrl(provider: string, url: string): void;
12
+ setProvider(provider: ProviderType, defaultModel?: string): void;
13
+ saveGlobalConfig(): void;
14
+ }
15
+ export declare const configManager: ConfigManager;
16
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAe,SAAS,EAAE,MAAM,aAAa,CAAC;AAoChF,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAc;;IAM5B,OAAO,CAAC,UAAU;IAkDX,GAAG,IAAI,WAAW;IAIlB,GAAG,CAAC,CAAC,SAAS,MAAM,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAKrE,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAK9B,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAKpC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAM9C,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAS/C,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAsChE,gBAAgB,IAAI,IAAI;CAUhC;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -0,0 +1,172 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ import dotenv from 'dotenv';
5
+ // Load .env if present
6
+ dotenv.config();
7
+ const DEFAULT_CONFIG = {
8
+ provider: 'deepseek',
9
+ model: 'deepseek-v4-flash-(latest)',
10
+ version: '1.26.0',
11
+ mode: 'vibe',
12
+ alwaysAllow: false,
13
+ apiKeys: {
14
+ deepseek: process.env.DEEPSEEK_API_KEY || process.env.ANTRI_API_KEY,
15
+ openai: process.env.OPENAI_API_KEY,
16
+ gemini: process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY,
17
+ anthropic: process.env.ANTHROPIC_API_KEY,
18
+ nvidia_nim: process.env.NVIDIA_API_KEY || process.env.NVIDIA_NIM_API_KEY,
19
+ openrouter: process.env.OPENROUTER_API_KEY,
20
+ custom: process.env.CUSTOM_API_KEY,
21
+ },
22
+ customBaseUrls: {
23
+ deepseek: process.env.DEEPSEEK_BASE_URL || 'https://api.deepseek.com/v1',
24
+ openai: process.env.OPENAI_BASE_URL || 'https://api.openai.com/v1',
25
+ ollama: process.env.OLLAMA_BASE_URL || 'http://localhost:11434',
26
+ nvidia_nim: process.env.NVIDIA_BASE_URL || 'https://integrate.api.nvidia.com/v1',
27
+ custom: process.env.CUSTOM_BASE_URL || 'http://localhost:8000/v1',
28
+ },
29
+ workingDir: process.cwd(),
30
+ autoExecuteTools: true,
31
+ debateDepth: 'deep',
32
+ };
33
+ const GLOBAL_CONFIG_DIR = path.join(os.homedir(), '.antri');
34
+ const GLOBAL_CONFIG_FILE = path.join(GLOBAL_CONFIG_DIR, 'config.json');
35
+ const LOCAL_CONFIG_FILE = path.join(process.cwd(), '.antrirc.json');
36
+ export class ConfigManager {
37
+ config;
38
+ constructor() {
39
+ this.config = this.loadConfig();
40
+ }
41
+ loadConfig() {
42
+ let merged = { ...DEFAULT_CONFIG };
43
+ // 1. Try to load global ~/.antri/config.json
44
+ if (fs.existsSync(GLOBAL_CONFIG_FILE)) {
45
+ try {
46
+ const raw = fs.readFileSync(GLOBAL_CONFIG_FILE, 'utf-8');
47
+ const parsed = JSON.parse(raw);
48
+ merged = { ...merged, ...parsed };
49
+ }
50
+ catch {
51
+ // Ignore read errors
52
+ }
53
+ }
54
+ // 2. Try to load local ./.antrirc.json
55
+ if (fs.existsSync(LOCAL_CONFIG_FILE)) {
56
+ try {
57
+ const raw = fs.readFileSync(LOCAL_CONFIG_FILE, 'utf-8');
58
+ const parsed = JSON.parse(raw);
59
+ merged = { ...merged, ...parsed };
60
+ }
61
+ catch {
62
+ // Ignore read errors
63
+ }
64
+ }
65
+ // Auto-detect provider if default has no key but another does
66
+ if (!merged.apiKeys.deepseek && !process.env.DEEPSEEK_API_KEY) {
67
+ if (merged.apiKeys.openai || process.env.OPENAI_API_KEY) {
68
+ merged.provider = 'openai';
69
+ merged.model = 'gpt-4o';
70
+ }
71
+ else if (merged.apiKeys.gemini || process.env.GEMINI_API_KEY) {
72
+ merged.provider = 'gemini';
73
+ merged.model = 'gemini-2.5-flash';
74
+ }
75
+ else if (merged.apiKeys.anthropic || process.env.ANTHROPIC_API_KEY) {
76
+ merged.provider = 'anthropic';
77
+ merged.model = 'claude-3-7-sonnet-20250219';
78
+ }
79
+ else if (merged.apiKeys.nvidia_nim || process.env.NVIDIA_API_KEY) {
80
+ merged.provider = 'nvidia-nim';
81
+ merged.model = 'meta/llama-3.1-8b-instruct';
82
+ }
83
+ else if (merged.apiKeys.openrouter || process.env.OPENROUTER_API_KEY) {
84
+ merged.provider = 'openrouter';
85
+ merged.model = 'anthropic/claude-3.5-sonnet';
86
+ }
87
+ else {
88
+ merged.provider = 'mock';
89
+ }
90
+ }
91
+ return merged;
92
+ }
93
+ get() {
94
+ return this.config;
95
+ }
96
+ set(key, value) {
97
+ this.config[key] = value;
98
+ this.saveGlobalConfig();
99
+ }
100
+ setMode(mode) {
101
+ this.config.mode = mode;
102
+ this.saveGlobalConfig();
103
+ }
104
+ setAlwaysAllow(allow) {
105
+ this.config.alwaysAllow = allow;
106
+ this.saveGlobalConfig();
107
+ }
108
+ setApiKey(provider, key) {
109
+ const formattedProvider = provider.replace('-', '_');
110
+ this.config.apiKeys[formattedProvider] = key;
111
+ this.saveGlobalConfig();
112
+ }
113
+ setBaseUrl(provider, url) {
114
+ const formattedProvider = provider.replace('-', '_');
115
+ if (!this.config.customBaseUrls) {
116
+ this.config.customBaseUrls = {};
117
+ }
118
+ this.config.customBaseUrls[formattedProvider] = url;
119
+ this.saveGlobalConfig();
120
+ }
121
+ setProvider(provider, defaultModel) {
122
+ this.config.provider = provider;
123
+ if (defaultModel) {
124
+ this.config.model = defaultModel;
125
+ }
126
+ else {
127
+ switch (provider) {
128
+ case 'ollama':
129
+ this.config.model = 'llama3.3:70b';
130
+ break;
131
+ case 'anthropic':
132
+ this.config.model = 'claude-3-7-sonnet-20250219';
133
+ break;
134
+ case 'nvidia-nim':
135
+ this.config.model = 'meta/llama-3.1-8b-instruct';
136
+ break;
137
+ case 'openai':
138
+ this.config.model = 'gpt-4o';
139
+ break;
140
+ case 'gemini':
141
+ this.config.model = 'gemini-2.5-flash';
142
+ break;
143
+ case 'deepseek':
144
+ this.config.model = 'deepseek-v4-flash-(latest)';
145
+ break;
146
+ case 'custom':
147
+ this.config.model = 'custom-model';
148
+ break;
149
+ case 'openrouter':
150
+ this.config.model = 'deepseek/deepseek-r1';
151
+ break;
152
+ case 'mock':
153
+ this.config.model = 'deepseek-v4-flash-(latest)';
154
+ break;
155
+ }
156
+ }
157
+ this.saveGlobalConfig();
158
+ }
159
+ saveGlobalConfig() {
160
+ try {
161
+ if (!fs.existsSync(GLOBAL_CONFIG_DIR)) {
162
+ fs.mkdirSync(GLOBAL_CONFIG_DIR, { recursive: true });
163
+ }
164
+ fs.writeFileSync(GLOBAL_CONFIG_FILE, JSON.stringify(this.config, null, 2), 'utf-8');
165
+ }
166
+ catch {
167
+ // Ignore save failures in restricted environments
168
+ }
169
+ }
170
+ }
171
+ export const configManager = new ConfigManager();
172
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface CrawlResult {
2
+ startUrl: string;
3
+ pagesCrawled: number;
4
+ combinedMarkdown: string;
5
+ sources: {
6
+ title: string;
7
+ url: string;
8
+ charCount: number;
9
+ }[];
10
+ }
11
+ export declare class DocCrawler {
12
+ /**
13
+ * Recursively crawls documentation pages starting from a root URL
14
+ */
15
+ static crawl(startUrl: string, maxPages?: number, maxDepth?: number): Promise<CrawlResult>;
16
+ private static normalizeUrl;
17
+ }
18
+ //# sourceMappingURL=crawler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crawler.d.ts","sourceRoot":"","sources":["../../src/core/crawler.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC9D;AAED,qBAAa,UAAU;IACrB;;OAEG;WACiB,KAAK,CACvB,QAAQ,EAAE,MAAM,EAChB,QAAQ,SAAI,EACZ,QAAQ,SAAI,GACX,OAAO,CAAC,WAAW,CAAC;IAuEvB,OAAO,CAAC,MAAM,CAAC,YAAY;CAY5B"}
@@ -0,0 +1,83 @@
1
+ import { WebScraper } from './scraper.js';
2
+ export class DocCrawler {
3
+ /**
4
+ * Recursively crawls documentation pages starting from a root URL
5
+ */
6
+ static async crawl(startUrl, maxPages = 4, maxDepth = 2) {
7
+ const visited = new Set();
8
+ const queue = [{ url: startUrl, depth: 0 }];
9
+ const scrapedPages = [];
10
+ const root = new URL(startUrl);
11
+ const allowedHost = root.hostname;
12
+ while (queue.length > 0 && scrapedPages.length < maxPages) {
13
+ const current = queue.shift();
14
+ if (!current)
15
+ break;
16
+ const normalizedUrl = this.normalizeUrl(current.url);
17
+ if (visited.has(normalizedUrl))
18
+ continue;
19
+ visited.add(normalizedUrl);
20
+ // Scrape current page
21
+ const page = await WebScraper.scrape(current.url, 6000);
22
+ if (page.charCount > 50) {
23
+ scrapedPages.push(page);
24
+ }
25
+ // If within depth limit, find next doc links
26
+ if (current.depth < maxDepth) {
27
+ for (const link of page.links) {
28
+ try {
29
+ const parsed = new URL(link);
30
+ // Same domain check
31
+ if (parsed.hostname === allowedHost) {
32
+ const normLink = this.normalizeUrl(link);
33
+ if (!visited.has(normLink)) {
34
+ // Prioritize docs, guide, api, tutorial paths
35
+ const isDocLike = parsed.pathname.includes('/doc') ||
36
+ parsed.pathname.includes('/guide') ||
37
+ parsed.pathname.includes('/api') ||
38
+ parsed.pathname.includes('/tutorial') ||
39
+ parsed.pathname.includes('/manual') ||
40
+ parsed.pathname.startsWith(root.pathname);
41
+ if (isDocLike) {
42
+ queue.push({ url: link, depth: current.depth + 1 });
43
+ }
44
+ }
45
+ }
46
+ }
47
+ catch { }
48
+ }
49
+ }
50
+ }
51
+ // Combine markdown documents into a coherent documentation knowledge base
52
+ let combined = `# 📖 Crawled Documentation (${scrapedPages.length} pages from ${startUrl})\n\n`;
53
+ const sources = [];
54
+ for (let i = 0; i < scrapedPages.length; i++) {
55
+ const p = scrapedPages[i];
56
+ sources.push({ title: p.title, url: p.url, charCount: p.charCount });
57
+ combined += `## [Source ${i + 1}] ${p.title}\n`;
58
+ combined += `**URL:** ${p.url}\n\n`;
59
+ combined += `${p.markdown}\n\n`;
60
+ combined += `---\n\n`;
61
+ }
62
+ return {
63
+ startUrl,
64
+ pagesCrawled: scrapedPages.length,
65
+ combinedMarkdown: combined,
66
+ sources,
67
+ };
68
+ }
69
+ static normalizeUrl(url) {
70
+ try {
71
+ const u = new URL(url);
72
+ u.hash = '';
73
+ if (u.pathname.endsWith('/') && u.pathname.length > 1) {
74
+ u.pathname = u.pathname.slice(0, -1);
75
+ }
76
+ return u.toString();
77
+ }
78
+ catch {
79
+ return url;
80
+ }
81
+ }
82
+ }
83
+ //# sourceMappingURL=crawler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crawler.js","sourceRoot":"","sources":["../../src/core/crawler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAe,MAAM,cAAc,CAAC;AASvD,MAAM,OAAO,UAAU;IACrB;;OAEG;IACI,MAAM,CAAC,KAAK,CAAC,KAAK,CACvB,QAAgB,EAChB,QAAQ,GAAG,CAAC,EACZ,QAAQ,GAAG,CAAC;QAEZ,MAAM,OAAO,GAAgB,IAAI,GAAG,EAAE,CAAC;QACvC,MAAM,KAAK,GAAqC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9E,MAAM,YAAY,GAAkB,EAAE,CAAC;QAEvC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC;QAElC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO;gBAAE,MAAM;YAEpB,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACrD,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;gBAAE,SAAS;YACzC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAE3B,sBAAsB;YACtB,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACxD,IAAI,IAAI,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC;gBACxB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;YAED,6CAA6C;YAC7C,IAAI,OAAO,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAC;gBAC7B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC9B,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;wBAC7B,oBAAoB;wBACpB,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;4BACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;4BACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gCAC3B,8CAA8C;gCAC9C,MAAM,SAAS,GACb,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;oCAChC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;oCAClC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;oCAChC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;oCACrC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;oCACnC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gCAE5C,IAAI,SAAS,EAAE,CAAC;oCACd,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;gCACtD,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBACZ,CAAC;YACH,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,IAAI,QAAQ,GAAG,+BAA+B,YAAY,CAAC,MAAM,eAAe,QAAQ,OAAO,CAAC;QAChG,MAAM,OAAO,GAAwD,EAAE,CAAC;QAExE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YACrE,QAAQ,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC;YAChD,QAAQ,IAAI,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC;YACpC,QAAQ,IAAI,GAAG,CAAC,CAAC,QAAQ,MAAM,CAAC;YAChC,QAAQ,IAAI,SAAS,CAAC;QACxB,CAAC;QAED,OAAO;YACL,QAAQ;YACR,YAAY,EAAE,YAAY,CAAC,MAAM;YACjC,gBAAgB,EAAE,QAAQ;YAC1B,OAAO;SACR,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,YAAY,CAAC,GAAW;QACrC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;YACZ,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtD,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;CACF"}