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.
- package/README.md +92 -0
- package/bin/antri.js +2 -0
- package/dist/cli/banner.d.ts +22 -0
- package/dist/cli/banner.d.ts.map +1 -0
- package/dist/cli/banner.js +133 -0
- package/dist/cli/banner.js.map +1 -0
- package/dist/cli/dialogs/filePicker.d.ts +23 -0
- package/dist/cli/dialogs/filePicker.d.ts.map +1 -0
- package/dist/cli/dialogs/filePicker.js +106 -0
- package/dist/cli/dialogs/filePicker.js.map +1 -0
- package/dist/cli/dialogs/modelPicker.d.ts +10 -0
- package/dist/cli/dialogs/modelPicker.d.ts.map +1 -0
- package/dist/cli/dialogs/modelPicker.js +205 -0
- package/dist/cli/dialogs/modelPicker.js.map +1 -0
- package/dist/cli/dialogs/profilePicker.d.ts +11 -0
- package/dist/cli/dialogs/profilePicker.d.ts.map +1 -0
- package/dist/cli/dialogs/profilePicker.js +185 -0
- package/dist/cli/dialogs/profilePicker.js.map +1 -0
- package/dist/cli/dialogs/providerPicker.d.ts +19 -0
- package/dist/cli/dialogs/providerPicker.d.ts.map +1 -0
- package/dist/cli/dialogs/providerPicker.js +205 -0
- package/dist/cli/dialogs/providerPicker.js.map +1 -0
- package/dist/cli/prompt.d.ts +3 -0
- package/dist/cli/prompt.d.ts.map +1 -0
- package/dist/cli/prompt.js +50 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/cli/promptToolkit.d.ts +14 -0
- package/dist/cli/promptToolkit.d.ts.map +1 -0
- package/dist/cli/promptToolkit.js +389 -0
- package/dist/cli/promptToolkit.js.map +1 -0
- package/dist/cli/renderer.d.ts +21 -0
- package/dist/cli/renderer.d.ts.map +1 -0
- package/dist/cli/renderer.js +97 -0
- package/dist/cli/renderer.js.map +1 -0
- package/dist/cli/shortcuts.d.ts +13 -0
- package/dist/cli/shortcuts.d.ts.map +1 -0
- package/dist/cli/shortcuts.js +414 -0
- package/dist/cli/shortcuts.js.map +1 -0
- package/dist/core/agent.d.ts +15 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +232 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/citations.d.ts +19 -0
- package/dist/core/citations.d.ts.map +1 -0
- package/dist/core/citations.js +40 -0
- package/dist/core/citations.js.map +1 -0
- package/dist/core/config.d.ts +16 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +172 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/crawler.d.ts +18 -0
- package/dist/core/crawler.d.ts.map +1 -0
- package/dist/core/crawler.js +83 -0
- package/dist/core/crawler.js.map +1 -0
- package/dist/core/debugger.d.ts +20 -0
- package/dist/core/debugger.d.ts.map +1 -0
- package/dist/core/debugger.js +105 -0
- package/dist/core/debugger.js.map +1 -0
- package/dist/core/dialectic.d.ts +23 -0
- package/dist/core/dialectic.d.ts.map +1 -0
- package/dist/core/dialectic.js +300 -0
- package/dist/core/dialectic.js.map +1 -0
- package/dist/core/goalLoop.d.ts +14 -0
- package/dist/core/goalLoop.d.ts.map +1 -0
- package/dist/core/goalLoop.js +104 -0
- package/dist/core/goalLoop.js.map +1 -0
- package/dist/core/history.d.ts +13 -0
- package/dist/core/history.d.ts.map +1 -0
- package/dist/core/history.js +53 -0
- package/dist/core/history.js.map +1 -0
- package/dist/core/metaOptimizer.d.ts +27 -0
- package/dist/core/metaOptimizer.d.ts.map +1 -0
- package/dist/core/metaOptimizer.js +98 -0
- package/dist/core/metaOptimizer.js.map +1 -0
- package/dist/core/sandbox.d.ts +29 -0
- package/dist/core/sandbox.d.ts.map +1 -0
- package/dist/core/sandbox.js +141 -0
- package/dist/core/sandbox.js.map +1 -0
- package/dist/core/scraper.d.ts +22 -0
- package/dist/core/scraper.d.ts.map +1 -0
- package/dist/core/scraper.js +180 -0
- package/dist/core/scraper.js.map +1 -0
- package/dist/core/search.d.ts +27 -0
- package/dist/core/search.d.ts.map +1 -0
- package/dist/core/search.js +222 -0
- package/dist/core/search.js.map +1 -0
- package/dist/core/skillSynthesizer.d.ts +43 -0
- package/dist/core/skillSynthesizer.d.ts.map +1 -0
- package/dist/core/skillSynthesizer.js +147 -0
- package/dist/core/skillSynthesizer.js.map +1 -0
- package/dist/core/tools.d.ts +12 -0
- package/dist/core/tools.d.ts.map +1 -0
- package/dist/core/tools.js +467 -0
- package/dist/core/tools.js.map +1 -0
- package/dist/core/updater.d.ts +9 -0
- package/dist/core/updater.d.ts.map +1 -0
- package/dist/core/updater.js +63 -0
- package/dist/core/updater.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/consolidation.d.ts +17 -0
- package/dist/memory/consolidation.d.ts.map +1 -0
- package/dist/memory/consolidation.js +42 -0
- package/dist/memory/consolidation.js.map +1 -0
- package/dist/memory/episodic.d.ts +15 -0
- package/dist/memory/episodic.d.ts.map +1 -0
- package/dist/memory/episodic.js +97 -0
- package/dist/memory/episodic.js.map +1 -0
- package/dist/memory/manager.d.ts +24 -0
- package/dist/memory/manager.d.ts.map +1 -0
- package/dist/memory/manager.js +97 -0
- package/dist/memory/manager.js.map +1 -0
- package/dist/memory/profile.d.ts +21 -0
- package/dist/memory/profile.d.ts.map +1 -0
- package/dist/memory/profile.js +111 -0
- package/dist/memory/profile.js.map +1 -0
- package/dist/memory/semantic.d.ts +24 -0
- package/dist/memory/semantic.d.ts.map +1 -0
- package/dist/memory/semantic.js +102 -0
- package/dist/memory/semantic.js.map +1 -0
- package/dist/memory/types.d.ts +45 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +2 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/memory/vectorStore.d.ts +18 -0
- package/dist/memory/vectorStore.d.ts.map +1 -0
- package/dist/memory/vectorStore.js +103 -0
- package/dist/memory/vectorStore.js.map +1 -0
- package/dist/profiles/profileManager.d.ts +25 -0
- package/dist/profiles/profileManager.d.ts.map +1 -0
- package/dist/profiles/profileManager.js +205 -0
- package/dist/profiles/profileManager.js.map +1 -0
- package/dist/providers/anthropic.d.ts +14 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +80 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +7 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +2 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/gemini.d.ts +14 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +77 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +4 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +65 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/mock.d.ts +8 -0
- package/dist/providers/mock.d.ts.map +1 -0
- package/dist/providers/mock.js +62 -0
- package/dist/providers/mock.js.map +1 -0
- package/dist/providers/models.d.ts +8 -0
- package/dist/providers/models.d.ts.map +1 -0
- package/dist/providers/models.js +403 -0
- package/dist/providers/models.js.map +1 -0
- package/dist/providers/openai.d.ts +18 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +162 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/types.d.ts +116 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/logger.d.ts +23 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +26 -0
- package/dist/utils/logger.js.map +1 -0
- 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":"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"}
|