@framers/agentos-ext-deep-research 0.1.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/LICENSE +98 -0
- package/dist/ResearchService.d.ts +106 -0
- package/dist/ResearchService.d.ts.map +1 -0
- package/dist/ResearchService.js +450 -0
- package/dist/ResearchService.js.map +1 -0
- package/dist/engine/DeepResearchEngine.d.ts +40 -0
- package/dist/engine/DeepResearchEngine.d.ts.map +1 -0
- package/dist/engine/DeepResearchEngine.js +557 -0
- package/dist/engine/DeepResearchEngine.js.map +1 -0
- package/dist/engine/DeepResearchTool.d.ts +27 -0
- package/dist/engine/DeepResearchTool.d.ts.map +1 -0
- package/dist/engine/DeepResearchTool.js +118 -0
- package/dist/engine/DeepResearchTool.js.map +1 -0
- package/dist/engine/FirecrawlClient.d.ts +49 -0
- package/dist/engine/FirecrawlClient.d.ts.map +1 -0
- package/dist/engine/FirecrawlClient.js +101 -0
- package/dist/engine/FirecrawlClient.js.map +1 -0
- package/dist/engine/ResearchBudgetTracker.d.ts +36 -0
- package/dist/engine/ResearchBudgetTracker.d.ts.map +1 -0
- package/dist/engine/ResearchBudgetTracker.js +68 -0
- package/dist/engine/ResearchBudgetTracker.js.map +1 -0
- package/dist/engine/index.d.ts +9 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +34 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/prompts.d.ts +14 -0
- package/dist/engine/prompts.d.ts.map +1 -0
- package/dist/engine/prompts.js +67 -0
- package/dist/engine/prompts.js.map +1 -0
- package/dist/engine/types.d.ts +133 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +18 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +161 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/academic.d.ts +41 -0
- package/dist/tools/academic.d.ts.map +1 -0
- package/dist/tools/academic.js +42 -0
- package/dist/tools/academic.js.map +1 -0
- package/dist/tools/aggregate.d.ts +44 -0
- package/dist/tools/aggregate.d.ts.map +1 -0
- package/dist/tools/aggregate.js +39 -0
- package/dist/tools/aggregate.js.map +1 -0
- package/dist/tools/investigate.d.ts +44 -0
- package/dist/tools/investigate.d.ts.map +1 -0
- package/dist/tools/investigate.js +39 -0
- package/dist/tools/investigate.js.map +1 -0
- package/dist/tools/scrape.d.ts +36 -0
- package/dist/tools/scrape.d.ts.map +1 -0
- package/dist/tools/scrape.js +38 -0
- package/dist/tools/scrape.js.map +1 -0
- package/dist/tools/trending.d.ts +35 -0
- package/dist/tools/trending.d.ts.map +1 -0
- package/dist/tools/trending.js +37 -0
- package/dist/tools/trending.js.map +1 -0
- package/manifest.json +25 -0
- package/package.json +35 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResearchService.js","sourceRoot":"","sources":["../src/ResearchService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Core orchestrator for the Deep Research Engine.
|
|
3
|
+
*
|
|
4
|
+
* Three-phase algorithm:
|
|
5
|
+
* 1. **Decompose** — break query into sub-questions (cheap LLM)
|
|
6
|
+
* 2. **Iterate** — search → extract → gap-analysis loop
|
|
7
|
+
* 3. **Synthesize** — produce a structured report (mid-tier LLM)
|
|
8
|
+
*
|
|
9
|
+
* Budget tracking enforces cost/time limits at every step.
|
|
10
|
+
*/
|
|
11
|
+
import type { DeepResearchEngineConfig, DeepResearchInput, DeepResearchOutput, ResearchProgressEvent } from './types.js';
|
|
12
|
+
export declare class DeepResearchEngine {
|
|
13
|
+
private readonly config;
|
|
14
|
+
/** Per-call progress override set by {@link research}. */
|
|
15
|
+
private activeProgressOverride;
|
|
16
|
+
/** Optional Firecrawl client for enhanced content extraction. */
|
|
17
|
+
private readonly firecrawlClient?;
|
|
18
|
+
constructor(config: DeepResearchEngineConfig);
|
|
19
|
+
/**
|
|
20
|
+
* Run the research pipeline.
|
|
21
|
+
* @param input Research query and options.
|
|
22
|
+
* @param onProgressOverride Optional per-call progress callback that takes
|
|
23
|
+
* priority over the one provided at construction time. This allows callers
|
|
24
|
+
* (like DeepResearchTool) to forward runtime progress to the tool-calling
|
|
25
|
+
* layer without rebuilding the engine.
|
|
26
|
+
*/
|
|
27
|
+
research(input: DeepResearchInput, onProgressOverride?: (event: ResearchProgressEvent) => void): Promise<DeepResearchOutput>;
|
|
28
|
+
private createNode;
|
|
29
|
+
private getPendingLeaves;
|
|
30
|
+
private searchNode;
|
|
31
|
+
private extractUrl;
|
|
32
|
+
private buildFindings;
|
|
33
|
+
private collectAllFindings;
|
|
34
|
+
private collectAllContent;
|
|
35
|
+
private fallbackSynthesis;
|
|
36
|
+
private parseReport;
|
|
37
|
+
private buildSourceCitations;
|
|
38
|
+
private emitProgress;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=DeepResearchEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeepResearchEngine.d.ts","sourceRoot":"","sources":["../../src/engine/DeepResearchEngine.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,EAQlB,qBAAqB,EAEtB,MAAM,YAAY,CAAC;AAmDpB,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,0DAA0D;IAC1D,OAAO,CAAC,sBAAsB,CAAyD;IACvF,iEAAiE;IACjE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAiD;gBAEtE,MAAM,EAAE,wBAAwB;IAc5C;;;;;;;OAOG;IACG,QAAQ,CACZ,KAAK,EAAE,iBAAiB,EACxB,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GAC1D,OAAO,CAAC,kBAAkB,CAAC;IAoR9B,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,gBAAgB;YAQV,UAAU;YAgDV,UAAU;IAmCxB,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,oBAAoB;IAoC5B,OAAO,CAAC,YAAY;CA8BrB"}
|
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Core orchestrator for the Deep Research Engine.
|
|
5
|
+
*
|
|
6
|
+
* Three-phase algorithm:
|
|
7
|
+
* 1. **Decompose** — break query into sub-questions (cheap LLM)
|
|
8
|
+
* 2. **Iterate** — search → extract → gap-analysis loop
|
|
9
|
+
* 3. **Synthesize** — produce a structured report (mid-tier LLM)
|
|
10
|
+
*
|
|
11
|
+
* Budget tracking enforces cost/time limits at every step.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.DeepResearchEngine = void 0;
|
|
15
|
+
const node_crypto_1 = require("node:crypto");
|
|
16
|
+
const types_js_1 = require("./types.js");
|
|
17
|
+
const prompts_js_1 = require("./prompts.js");
|
|
18
|
+
const ResearchBudgetTracker_js_1 = require("./ResearchBudgetTracker.js");
|
|
19
|
+
// ── Helpers ──
|
|
20
|
+
/** Limit concurrency for an array of async tasks. */
|
|
21
|
+
async function parallelLimit(tasks, limit) {
|
|
22
|
+
const results = [];
|
|
23
|
+
let idx = 0;
|
|
24
|
+
async function next() {
|
|
25
|
+
while (idx < tasks.length) {
|
|
26
|
+
const i = idx++;
|
|
27
|
+
results[i] = await tasks[i]();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const workers = Array.from({ length: Math.min(limit, tasks.length) }, () => next());
|
|
31
|
+
await Promise.allSettled(workers);
|
|
32
|
+
return results;
|
|
33
|
+
}
|
|
34
|
+
function normalizeUrl(url) {
|
|
35
|
+
try {
|
|
36
|
+
const u = new URL(url);
|
|
37
|
+
u.hash = '';
|
|
38
|
+
u.searchParams.delete('utm_source');
|
|
39
|
+
u.searchParams.delete('utm_medium');
|
|
40
|
+
u.searchParams.delete('utm_campaign');
|
|
41
|
+
return u.toString();
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return url;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function detectUrlType(url) {
|
|
48
|
+
if (/youtube\.com|youtu\.be/i.test(url))
|
|
49
|
+
return 'youtube';
|
|
50
|
+
if (/wikipedia\.org/i.test(url))
|
|
51
|
+
return 'wikipedia';
|
|
52
|
+
if (/arxiv\.org|scholar\.google|semanticscholar\.org/i.test(url))
|
|
53
|
+
return 'academic';
|
|
54
|
+
if (/\.pdf(\?|$)/i.test(url))
|
|
55
|
+
return 'pdf';
|
|
56
|
+
return 'web';
|
|
57
|
+
}
|
|
58
|
+
function truncate(text, maxChars) {
|
|
59
|
+
return text.length <= maxChars ? text : text.slice(0, maxChars) + '...';
|
|
60
|
+
}
|
|
61
|
+
// ── Engine ──
|
|
62
|
+
class DeepResearchEngine {
|
|
63
|
+
constructor(config) {
|
|
64
|
+
/** Per-call progress override set by {@link research}. */
|
|
65
|
+
this.activeProgressOverride = null;
|
|
66
|
+
this.config = config;
|
|
67
|
+
if (config.firecrawlApiKey) {
|
|
68
|
+
// Lazy import to avoid hard dependency
|
|
69
|
+
try {
|
|
70
|
+
const { FirecrawlClient } = require('./FirecrawlClient.js');
|
|
71
|
+
this.firecrawlClient = new FirecrawlClient({
|
|
72
|
+
apiKey: config.firecrawlApiKey,
|
|
73
|
+
maxCrawlPages: config.firecrawl?.maxCrawlPages ?? 10,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
catch { /* FirecrawlClient not available */ }
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Run the research pipeline.
|
|
81
|
+
* @param input Research query and options.
|
|
82
|
+
* @param onProgressOverride Optional per-call progress callback that takes
|
|
83
|
+
* priority over the one provided at construction time. This allows callers
|
|
84
|
+
* (like DeepResearchTool) to forward runtime progress to the tool-calling
|
|
85
|
+
* layer without rebuilding the engine.
|
|
86
|
+
*/
|
|
87
|
+
async research(input, onProgressOverride) {
|
|
88
|
+
this.activeProgressOverride = onProgressOverride ?? null;
|
|
89
|
+
try {
|
|
90
|
+
const depth = input.depth ?? 'moderate';
|
|
91
|
+
const maxIterations = input.maxIterations ?? types_js_1.ITERATION_DEFAULTS[depth];
|
|
92
|
+
const budgetConfig = { ...types_js_1.BUDGET_DEFAULTS[depth], ...input.budget };
|
|
93
|
+
const budget = new ResearchBudgetTracker_js_1.ResearchBudgetTracker(budgetConfig);
|
|
94
|
+
const seenUrls = new Set();
|
|
95
|
+
// ── Build tree ──
|
|
96
|
+
const rootId = (0, node_crypto_1.randomUUID)();
|
|
97
|
+
const tree = {
|
|
98
|
+
rootQuery: input.query,
|
|
99
|
+
rootId,
|
|
100
|
+
nodes: {
|
|
101
|
+
[rootId]: this.createNode(rootId, input.query, null, 0),
|
|
102
|
+
},
|
|
103
|
+
maxDepth: depth === 'quick' ? 1 : depth === 'moderate' ? 2 : 3,
|
|
104
|
+
iterations: 0,
|
|
105
|
+
};
|
|
106
|
+
// ── Phase 1: Decompose ──
|
|
107
|
+
this.emitProgress('decomposing', 0, maxIterations, budget, tree, input.query);
|
|
108
|
+
let subQueries;
|
|
109
|
+
if (budget.canCallLLM()) {
|
|
110
|
+
const focusSection = input.focusAreas?.length
|
|
111
|
+
? `\nFocus especially on: ${input.focusAreas.join(', ')}`
|
|
112
|
+
: '';
|
|
113
|
+
const prompt = prompts_js_1.DECOMPOSITION_PROMPT
|
|
114
|
+
.replace('{query}', input.query)
|
|
115
|
+
.replace('{focusAreas}', focusSection);
|
|
116
|
+
try {
|
|
117
|
+
const raw = await this.config.smallInvoker(prompt);
|
|
118
|
+
budget.recordLLMCall();
|
|
119
|
+
subQueries = (0, prompts_js_1.parseJsonArray)(raw);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
subQueries = [input.query];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
subQueries = [input.query];
|
|
127
|
+
}
|
|
128
|
+
// Add sub-queries as children of root
|
|
129
|
+
const rootNode = tree.nodes[rootId];
|
|
130
|
+
rootNode.subQueries = subQueries;
|
|
131
|
+
for (const sq of subQueries) {
|
|
132
|
+
const childId = (0, node_crypto_1.randomUUID)();
|
|
133
|
+
tree.nodes[childId] = this.createNode(childId, sq, rootId, 1);
|
|
134
|
+
rootNode.children.push(childId);
|
|
135
|
+
}
|
|
136
|
+
// ── Phase 2: Iterative Search/Extract/Gap loop ──
|
|
137
|
+
for (let iteration = 0; iteration < maxIterations; iteration++) {
|
|
138
|
+
if (budget.isExhausted())
|
|
139
|
+
break;
|
|
140
|
+
tree.iterations = iteration + 1;
|
|
141
|
+
// 2a — Search pending leaf nodes
|
|
142
|
+
const pendingNodes = this.getPendingLeaves(tree);
|
|
143
|
+
if (pendingNodes.length === 0)
|
|
144
|
+
break;
|
|
145
|
+
this.emitProgress('searching', iteration, maxIterations, budget, tree);
|
|
146
|
+
const searchTasks = pendingNodes
|
|
147
|
+
.filter(() => budget.canSearch())
|
|
148
|
+
.map((node) => async () => {
|
|
149
|
+
node.status = 'searching';
|
|
150
|
+
try {
|
|
151
|
+
const results = await this.searchNode(node, input.sources);
|
|
152
|
+
budget.recordSearch();
|
|
153
|
+
node.searchResults = results;
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
node.status = 'failed';
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
await parallelLimit(searchTasks, 5);
|
|
160
|
+
// 2b — Extract content from top URLs
|
|
161
|
+
this.emitProgress('extracting', iteration, maxIterations, budget, tree);
|
|
162
|
+
const extractableNodes = pendingNodes.filter((n) => n.searchResults.length > 0 && n.status !== 'failed');
|
|
163
|
+
for (const node of extractableNodes) {
|
|
164
|
+
if (!budget.canExtract())
|
|
165
|
+
break;
|
|
166
|
+
node.status = 'extracting';
|
|
167
|
+
// Take top 3 URLs per node that we haven't seen
|
|
168
|
+
const urls = node.searchResults
|
|
169
|
+
.map((r) => r.url)
|
|
170
|
+
.filter((url) => {
|
|
171
|
+
const norm = normalizeUrl(url);
|
|
172
|
+
if (seenUrls.has(norm))
|
|
173
|
+
return false;
|
|
174
|
+
seenUrls.add(norm);
|
|
175
|
+
return true;
|
|
176
|
+
})
|
|
177
|
+
.slice(0, 3);
|
|
178
|
+
for (const url of urls) {
|
|
179
|
+
if (!budget.canExtract())
|
|
180
|
+
break;
|
|
181
|
+
try {
|
|
182
|
+
const extracted = await this.extractUrl(url);
|
|
183
|
+
budget.recordExtraction();
|
|
184
|
+
node.extractedContent.push({
|
|
185
|
+
url,
|
|
186
|
+
title: extracted.title,
|
|
187
|
+
content: truncate(extracted.content, 2000),
|
|
188
|
+
wordCount: extracted.wordCount,
|
|
189
|
+
type: detectUrlType(url),
|
|
190
|
+
extractedAt: new Date().toISOString(),
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Skip failed extractions
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// Build findings from extracted content
|
|
198
|
+
node.findings = this.buildFindings(node);
|
|
199
|
+
node.status = 'complete';
|
|
200
|
+
node.confidenceScore = node.findings.length > 0 ? Math.min(node.findings.length / 3, 1) : 0;
|
|
201
|
+
}
|
|
202
|
+
// 2c — Gap analysis (skip on last iteration)
|
|
203
|
+
if (iteration < maxIterations - 1 && budget.canCallLLM()) {
|
|
204
|
+
this.emitProgress('analyzing_gaps', iteration, maxIterations, budget, tree);
|
|
205
|
+
const allFindings = this.collectAllFindings(tree);
|
|
206
|
+
if (allFindings.length > 0) {
|
|
207
|
+
const findingsSummary = allFindings
|
|
208
|
+
.map((f) => `- ${f.claim} (sources: ${f.sources.join(', ')})`)
|
|
209
|
+
.join('\n');
|
|
210
|
+
const gapPrompt = prompts_js_1.GAP_ANALYSIS_PROMPT
|
|
211
|
+
.replace('{query}', input.query)
|
|
212
|
+
.replace('{findings}', truncate(findingsSummary, 3000));
|
|
213
|
+
try {
|
|
214
|
+
const raw = await this.config.smallInvoker(gapPrompt);
|
|
215
|
+
budget.recordLLMCall();
|
|
216
|
+
const gapQueries = (0, prompts_js_1.parseJsonArray)(raw);
|
|
217
|
+
// Add new leaf nodes for gaps
|
|
218
|
+
for (const gq of gapQueries.slice(0, 3)) {
|
|
219
|
+
if (!budget.canSearch())
|
|
220
|
+
break;
|
|
221
|
+
const gapId = (0, node_crypto_1.randomUUID)();
|
|
222
|
+
const parentId = rootId;
|
|
223
|
+
tree.nodes[gapId] = this.createNode(gapId, gq, parentId, 2);
|
|
224
|
+
tree.nodes[parentId].children.push(gapId);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// Skip gap analysis if LLM fails
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// ── Phase 2b: Firecrawl deep crawl (deep depth only) ──
|
|
234
|
+
if (input.depth === 'deep' &&
|
|
235
|
+
this.firecrawlClient &&
|
|
236
|
+
this.config.firecrawl?.enableCrawl) {
|
|
237
|
+
this.emitProgress('extracting', tree.iterations, maxIterations, budget, tree);
|
|
238
|
+
const domainCounts = new Map();
|
|
239
|
+
for (const node of Object.values(tree.nodes)) {
|
|
240
|
+
for (const result of node.searchResults) {
|
|
241
|
+
try {
|
|
242
|
+
const domain = new URL(result.url).hostname;
|
|
243
|
+
domainCounts.set(domain, (domainCounts.get(domain) ?? 0) + 1);
|
|
244
|
+
}
|
|
245
|
+
catch { /* skip invalid URLs */ }
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
const topDomains = [...domainCounts.entries()]
|
|
249
|
+
.sort((a, b) => b[1] - a[1])
|
|
250
|
+
.slice(0, 3)
|
|
251
|
+
.map(([domain]) => domain);
|
|
252
|
+
for (const domain of topDomains) {
|
|
253
|
+
if (budget.isExhausted())
|
|
254
|
+
break;
|
|
255
|
+
try {
|
|
256
|
+
const crawlResult = await this.firecrawlClient.crawl(`https://${domain}`);
|
|
257
|
+
const rootNode = tree.nodes[tree.rootId];
|
|
258
|
+
for (const page of crawlResult.pages) {
|
|
259
|
+
if (budget.isExhausted())
|
|
260
|
+
break;
|
|
261
|
+
rootNode.extractedContent.push({
|
|
262
|
+
url: page.url,
|
|
263
|
+
title: page.title,
|
|
264
|
+
content: page.content.slice(0, 5000),
|
|
265
|
+
wordCount: page.wordCount,
|
|
266
|
+
type: 'web',
|
|
267
|
+
extractedAt: new Date().toISOString(),
|
|
268
|
+
});
|
|
269
|
+
budget.recordExtraction();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
catch { /* crawl failed for this domain — continue */ }
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// ── Phase 2c: Rerank findings before synthesis ──
|
|
276
|
+
if (this.config.rerankFindingsFn) {
|
|
277
|
+
const preRankFindings = this.collectAllFindings(tree);
|
|
278
|
+
if (preRankFindings.length > 0) {
|
|
279
|
+
try {
|
|
280
|
+
const reranked = await this.config.rerankFindingsFn(input.query, preRankFindings);
|
|
281
|
+
tree.nodes[tree.rootId].findings = reranked;
|
|
282
|
+
}
|
|
283
|
+
catch { /* reranking failed — proceed with unranked */ }
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// ── Phase 3: Synthesize ──
|
|
287
|
+
this.emitProgress('synthesizing', maxIterations, maxIterations, budget, tree);
|
|
288
|
+
const allFindings = this.collectAllFindings(tree);
|
|
289
|
+
const allContent = this.collectAllContent(tree);
|
|
290
|
+
// Build evidence string for synthesis
|
|
291
|
+
const evidenceLines = allContent
|
|
292
|
+
.map((c) => `[Source: ${c.url}] ${c.title}\n${truncate(c.content, 1500)}`)
|
|
293
|
+
.join('\n\n');
|
|
294
|
+
const maxEvidenceChars = budgetConfig.maxOutputTokens * 2;
|
|
295
|
+
const evidenceTruncated = truncate(evidenceLines, maxEvidenceChars);
|
|
296
|
+
let report = '';
|
|
297
|
+
if (budget.canCallLLM() && allContent.length > 0) {
|
|
298
|
+
const synthPrompt = prompts_js_1.SYNTHESIS_PROMPT
|
|
299
|
+
.replace('{query}', input.query)
|
|
300
|
+
.replace('{evidence}', evidenceTruncated);
|
|
301
|
+
try {
|
|
302
|
+
report = await this.config.synthesisInvoker(synthPrompt);
|
|
303
|
+
budget.recordLLMCall();
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
report = this.fallbackSynthesis(input.query, allFindings);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
report = this.fallbackSynthesis(input.query, allFindings);
|
|
311
|
+
}
|
|
312
|
+
// Parse report sections
|
|
313
|
+
const { executiveSummary, knowledgeGaps } = this.parseReport(report);
|
|
314
|
+
// Build source citations
|
|
315
|
+
const sources = this.buildSourceCitations(tree, allFindings);
|
|
316
|
+
this.emitProgress('complete', maxIterations, maxIterations, budget, tree);
|
|
317
|
+
const used = budget.getUsed();
|
|
318
|
+
return {
|
|
319
|
+
executiveSummary,
|
|
320
|
+
detailedFindings: allFindings,
|
|
321
|
+
sources,
|
|
322
|
+
knowledgeGaps,
|
|
323
|
+
researchTree: tree,
|
|
324
|
+
metadata: {
|
|
325
|
+
query: input.query,
|
|
326
|
+
depth,
|
|
327
|
+
totalSearches: used.searchesUsed,
|
|
328
|
+
totalExtractions: used.extractionsUsed,
|
|
329
|
+
totalLLMCalls: used.llmCallsUsed,
|
|
330
|
+
totalTimeMs: budget.getElapsedMs(),
|
|
331
|
+
iterations: tree.iterations,
|
|
332
|
+
},
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
finally {
|
|
336
|
+
this.activeProgressOverride = null;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
// ── Private: Node helpers ──
|
|
340
|
+
createNode(id, query, parentId, depth) {
|
|
341
|
+
return {
|
|
342
|
+
id,
|
|
343
|
+
query,
|
|
344
|
+
parentId,
|
|
345
|
+
depth,
|
|
346
|
+
status: 'pending',
|
|
347
|
+
searchResults: [],
|
|
348
|
+
extractedContent: [],
|
|
349
|
+
findings: [],
|
|
350
|
+
subQueries: [],
|
|
351
|
+
children: [],
|
|
352
|
+
confidenceScore: 0,
|
|
353
|
+
gapAnalysis: [],
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
getPendingLeaves(tree) {
|
|
357
|
+
return Object.values(tree.nodes).filter((n) => n.status === 'pending' && n.children.length === 0);
|
|
358
|
+
}
|
|
359
|
+
// ── Private: Search ──
|
|
360
|
+
async searchNode(node, sources) {
|
|
361
|
+
const searchFn = this.config.searchFn;
|
|
362
|
+
if (searchFn) {
|
|
363
|
+
return searchFn(node.query, 10);
|
|
364
|
+
}
|
|
365
|
+
// Fallback: use DuckDuckGo HTML scraping
|
|
366
|
+
const results = [];
|
|
367
|
+
try {
|
|
368
|
+
const resp = await fetch('https://html.duckduckgo.com/html/', {
|
|
369
|
+
method: 'POST',
|
|
370
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'AgentOS-DeepResearch/1.0' },
|
|
371
|
+
body: `q=${encodeURIComponent(node.query)}`,
|
|
372
|
+
});
|
|
373
|
+
const html = await resp.text();
|
|
374
|
+
const linkRegex = /<a[^>]*class="result__a"[^>]*href="([^"]*)"[^>]*>([\s\S]*?)<\/a>/gi;
|
|
375
|
+
const snippetRegex = /<a[^>]*class="result__snippet"[^>]*>([\s\S]*?)<\/a>/gi;
|
|
376
|
+
const links = [];
|
|
377
|
+
let match;
|
|
378
|
+
while ((match = linkRegex.exec(html)) !== null) {
|
|
379
|
+
let url = match[1];
|
|
380
|
+
const uddgMatch = url.match(/[?&]uddg=([^&]+)/);
|
|
381
|
+
if (uddgMatch)
|
|
382
|
+
url = decodeURIComponent(uddgMatch[1]);
|
|
383
|
+
const title = match[2].replace(/<[^>]+>/g, '').trim();
|
|
384
|
+
links.push({ url, title });
|
|
385
|
+
}
|
|
386
|
+
const snippets = [];
|
|
387
|
+
while ((match = snippetRegex.exec(html)) !== null) {
|
|
388
|
+
snippets.push(match[1].replace(/<[^>]+>/g, '').trim());
|
|
389
|
+
}
|
|
390
|
+
for (let i = 0; i < links.length && i < 10; i++) {
|
|
391
|
+
results.push({
|
|
392
|
+
title: links[i].title,
|
|
393
|
+
url: links[i].url,
|
|
394
|
+
snippet: snippets[i] ?? '',
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
catch {
|
|
399
|
+
// Return empty results on failure
|
|
400
|
+
}
|
|
401
|
+
return results;
|
|
402
|
+
}
|
|
403
|
+
// ── Private: Extraction ──
|
|
404
|
+
async extractUrl(url) {
|
|
405
|
+
// Priority 1: Firecrawl scrape (JS-rendered, anti-bot, clean markdown)
|
|
406
|
+
if (this.firecrawlClient && this.config.firecrawl?.scrapeForIterate !== false) {
|
|
407
|
+
try {
|
|
408
|
+
const scraped = await this.firecrawlClient.scrape(url);
|
|
409
|
+
return { title: scraped.title, content: scraped.content, wordCount: scraped.wordCount };
|
|
410
|
+
}
|
|
411
|
+
catch { /* fall through to other methods */ }
|
|
412
|
+
}
|
|
413
|
+
// Priority 2: Custom extraction function
|
|
414
|
+
if (this.config.extractFn) {
|
|
415
|
+
return this.config.extractFn(url);
|
|
416
|
+
}
|
|
417
|
+
// Priority 3: Basic fetch + HTML strip
|
|
418
|
+
const resp = await fetch(url, {
|
|
419
|
+
headers: { 'User-Agent': 'AgentOS-DeepResearch/1.0', 'Accept': 'text/html' },
|
|
420
|
+
signal: AbortSignal.timeout(15000),
|
|
421
|
+
});
|
|
422
|
+
const html = await resp.text();
|
|
423
|
+
const title = html.match(/<title[^>]*>([\s\S]*?)<\/title>/i)?.[1]?.trim() ?? '';
|
|
424
|
+
const bodyMatch = html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
|
|
425
|
+
const bodyHtml = bodyMatch?.[1] ?? html;
|
|
426
|
+
const content = bodyHtml
|
|
427
|
+
.replace(/<script[\s\S]*?<\/script>/gi, '')
|
|
428
|
+
.replace(/<style[\s\S]*?<\/style>/gi, '')
|
|
429
|
+
.replace(/<[^>]+>/g, ' ')
|
|
430
|
+
.replace(/\s+/g, ' ')
|
|
431
|
+
.trim();
|
|
432
|
+
const wordCount = content.split(/\s+/).length;
|
|
433
|
+
return { title, content, wordCount };
|
|
434
|
+
}
|
|
435
|
+
// ── Private: Findings ──
|
|
436
|
+
buildFindings(node) {
|
|
437
|
+
const findings = [];
|
|
438
|
+
// From search results
|
|
439
|
+
for (const sr of node.searchResults) {
|
|
440
|
+
if (sr.snippet && sr.snippet.length > 20) {
|
|
441
|
+
findings.push({
|
|
442
|
+
claim: sr.snippet,
|
|
443
|
+
evidence: sr.snippet,
|
|
444
|
+
sources: [sr.url],
|
|
445
|
+
confidence: 0.5,
|
|
446
|
+
category: 'search',
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
// From extracted content — higher confidence
|
|
451
|
+
for (const ec of node.extractedContent) {
|
|
452
|
+
if (ec.content.length > 50) {
|
|
453
|
+
findings.push({
|
|
454
|
+
claim: ec.title || ec.content.slice(0, 100),
|
|
455
|
+
evidence: ec.content.slice(0, 500),
|
|
456
|
+
sources: [ec.url],
|
|
457
|
+
confidence: 0.8,
|
|
458
|
+
category: 'extracted',
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
return findings;
|
|
463
|
+
}
|
|
464
|
+
collectAllFindings(tree) {
|
|
465
|
+
const all = [];
|
|
466
|
+
for (const node of Object.values(tree.nodes)) {
|
|
467
|
+
all.push(...node.findings);
|
|
468
|
+
}
|
|
469
|
+
return all;
|
|
470
|
+
}
|
|
471
|
+
collectAllContent(tree) {
|
|
472
|
+
const all = [];
|
|
473
|
+
for (const node of Object.values(tree.nodes)) {
|
|
474
|
+
all.push(...node.extractedContent);
|
|
475
|
+
}
|
|
476
|
+
return all;
|
|
477
|
+
}
|
|
478
|
+
// ── Private: Synthesis helpers ──
|
|
479
|
+
fallbackSynthesis(query, findings) {
|
|
480
|
+
if (findings.length === 0) {
|
|
481
|
+
return `## Executive Summary\nNo substantial findings could be gathered for: "${query}"\n\n## Knowledge Gaps\n- Unable to find relevant sources`;
|
|
482
|
+
}
|
|
483
|
+
const body = findings
|
|
484
|
+
.slice(0, 10)
|
|
485
|
+
.map((f) => `- ${f.claim} [Source: ${f.sources[0]}]`)
|
|
486
|
+
.join('\n');
|
|
487
|
+
return `## Executive Summary\nResearch on "${query}" yielded ${findings.length} findings across multiple sources.\n\n## Detailed Findings\n${body}\n\n## Knowledge Gaps\n- Synthesis limited — no LLM budget remaining`;
|
|
488
|
+
}
|
|
489
|
+
parseReport(report) {
|
|
490
|
+
// Extract executive summary
|
|
491
|
+
const summaryMatch = report.match(/(?:\*\*)?Executive Summary(?:\*\*)?[:\s]*([\s\S]*?)(?=\n##|\n\*\*Detailed|\n\*\*Knowledge|$)/i);
|
|
492
|
+
const executiveSummary = summaryMatch?.[1]?.trim() || report.slice(0, 500);
|
|
493
|
+
// Extract knowledge gaps
|
|
494
|
+
const gapsMatch = report.match(/(?:\*\*)?Knowledge Gaps(?:\*\*)?[:\s]*([\s\S]*?)$/i);
|
|
495
|
+
const gapsText = gapsMatch?.[1]?.trim() || '';
|
|
496
|
+
const knowledgeGaps = gapsText
|
|
497
|
+
.split('\n')
|
|
498
|
+
.map((line) => line.replace(/^[\s\-*]+/, '').trim())
|
|
499
|
+
.filter((line) => line.length > 5);
|
|
500
|
+
return { executiveSummary, knowledgeGaps };
|
|
501
|
+
}
|
|
502
|
+
buildSourceCitations(tree, findings) {
|
|
503
|
+
const urlMap = new Map();
|
|
504
|
+
// From extracted content
|
|
505
|
+
for (const node of Object.values(tree.nodes)) {
|
|
506
|
+
for (const ec of node.extractedContent) {
|
|
507
|
+
const norm = normalizeUrl(ec.url);
|
|
508
|
+
if (!urlMap.has(norm)) {
|
|
509
|
+
urlMap.set(norm, {
|
|
510
|
+
url: ec.url,
|
|
511
|
+
title: ec.title,
|
|
512
|
+
relevance: 0.8,
|
|
513
|
+
confidence: 0.8,
|
|
514
|
+
citedInFindings: [],
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
// Link findings to sources
|
|
520
|
+
for (const f of findings) {
|
|
521
|
+
for (const src of f.sources) {
|
|
522
|
+
const norm = normalizeUrl(src);
|
|
523
|
+
const citation = urlMap.get(norm);
|
|
524
|
+
if (citation) {
|
|
525
|
+
citation.citedInFindings.push(f.claim.slice(0, 80));
|
|
526
|
+
citation.confidence = Math.min(1, citation.confidence + 0.1);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
return Array.from(urlMap.values()).sort((a, b) => b.confidence - a.confidence);
|
|
531
|
+
}
|
|
532
|
+
// ── Private: Progress ──
|
|
533
|
+
emitProgress(phase, iteration, totalIterations, budget, tree, currentQuery) {
|
|
534
|
+
const cb = this.activeProgressOverride ?? this.config.onProgress;
|
|
535
|
+
if (!cb)
|
|
536
|
+
return;
|
|
537
|
+
const findings = this.collectAllFindings(tree);
|
|
538
|
+
const sources = new Set();
|
|
539
|
+
for (const node of Object.values(tree.nodes)) {
|
|
540
|
+
for (const ec of node.extractedContent)
|
|
541
|
+
sources.add(ec.url);
|
|
542
|
+
}
|
|
543
|
+
const event = {
|
|
544
|
+
phase,
|
|
545
|
+
iteration,
|
|
546
|
+
totalIterations,
|
|
547
|
+
currentQuery,
|
|
548
|
+
findingsCount: findings.length,
|
|
549
|
+
sourcesCount: sources.size,
|
|
550
|
+
elapsedMs: budget.getElapsedMs(),
|
|
551
|
+
budget: budget.getUsed(),
|
|
552
|
+
};
|
|
553
|
+
cb(event);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
exports.DeepResearchEngine = DeepResearchEngine;
|
|
557
|
+
//# sourceMappingURL=DeepResearchEngine.js.map
|