fodda-mcp 1.32.0 → 1.38.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 +4 -9
- package/dist/a2aHandler.d.ts +33 -3
- package/dist/a2aHandler.d.ts.map +1 -1
- package/dist/a2aHandler.js +189 -36
- package/dist/a2aHandler.js.map +1 -1
- package/dist/agentFacts.d.ts +21 -0
- package/dist/agentFacts.d.ts.map +1 -0
- package/dist/agentFacts.js +72 -0
- package/dist/agentFacts.js.map +1 -0
- package/dist/agents/fodda-researcher/index.d.ts +6 -0
- package/dist/agents/fodda-researcher/index.d.ts.map +1 -1
- package/dist/agents/fodda-researcher/index.js +18 -0
- package/dist/agents/fodda-researcher/index.js.map +1 -1
- package/dist/agents/fodda-researcher/skills.d.ts +1 -1
- package/dist/agents/fodda-researcher/skills.d.ts.map +1 -1
- package/dist/agents/fodda-researcher/skills.js +8 -3
- package/dist/agents/fodda-researcher/skills.js.map +1 -1
- package/dist/brandTemplate.d.ts.map +1 -1
- package/dist/brandTemplate.js +65 -4
- package/dist/brandTemplate.js.map +1 -1
- package/dist/catalogCache.d.ts +3 -13
- package/dist/catalogCache.d.ts.map +1 -1
- package/dist/catalogCache.js +238 -59
- package/dist/catalogCache.js.map +1 -1
- package/dist/debug_tools.d.ts +2 -0
- package/dist/debug_tools.d.ts.map +1 -0
- package/dist/debug_tools.js +19 -0
- package/dist/debug_tools.js.map +1 -0
- package/dist/deepResearch.d.ts +43 -0
- package/dist/deepResearch.d.ts.map +1 -0
- package/dist/deepResearch.js +498 -0
- package/dist/deepResearch.js.map +1 -0
- package/dist/errorHandling.d.ts +1 -1
- package/dist/errorHandling.d.ts.map +1 -1
- package/dist/errorHandling.js +24 -4
- package/dist/errorHandling.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +449 -36
- package/dist/index.js.map +1 -1
- package/dist/inspect_list_graphs.d.ts +2 -0
- package/dist/inspect_list_graphs.d.ts.map +1 -0
- package/dist/inspect_list_graphs.js +25 -0
- package/dist/inspect_list_graphs.js.map +1 -0
- package/dist/jobs/jlens_quarterly_sweep.d.ts +62 -0
- package/dist/jobs/jlens_quarterly_sweep.d.ts.map +1 -0
- package/dist/jobs/jlens_quarterly_sweep.js +160 -0
- package/dist/jobs/jlens_quarterly_sweep.js.map +1 -0
- package/dist/linkedinEngine.d.ts +150 -0
- package/dist/linkedinEngine.d.ts.map +1 -0
- package/dist/linkedinEngine.js +696 -0
- package/dist/linkedinEngine.js.map +1 -0
- package/dist/pricingCache.d.ts +6 -8
- package/dist/pricingCache.d.ts.map +1 -1
- package/dist/pricingCache.js +55 -11
- package/dist/pricingCache.js.map +1 -1
- package/dist/queryCache.d.ts +2 -0
- package/dist/queryCache.d.ts.map +1 -1
- package/dist/queryCache.js +11 -2
- package/dist/queryCache.js.map +1 -1
- package/dist/resources.d.ts +27 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +126 -0
- package/dist/resources.js.map +1 -0
- package/dist/scratch_test.d.ts.map +1 -0
- package/dist/services/notifications.d.ts +49 -0
- package/dist/services/notifications.d.ts.map +1 -0
- package/dist/services/notifications.js +206 -0
- package/dist/services/notifications.js.map +1 -0
- package/dist/sessionTracker.js +1 -1
- package/dist/sessionTracker.js.map +1 -1
- package/dist/systemPrompt.d.ts +3 -3
- package/dist/systemPrompt.d.ts.map +1 -1
- package/dist/systemPrompt.js +44 -54
- package/dist/systemPrompt.js.map +1 -1
- package/dist/telemetry.d.ts +43 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +101 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/test_analyst.js +2 -2
- package/dist/test_analyst.js.map +1 -1
- package/dist/test_brand_intelligence_endpoint.d.ts +2 -0
- package/dist/test_brand_intelligence_endpoint.d.ts.map +1 -0
- package/dist/test_brand_intelligence_endpoint.js +20 -0
- package/dist/test_brand_intelligence_endpoint.js.map +1 -0
- package/dist/test_coverage_r2.d.ts +2 -0
- package/dist/test_coverage_r2.d.ts.map +1 -0
- package/dist/test_coverage_scratch.d.ts +2 -0
- package/dist/test_coverage_scratch.d.ts.map +1 -0
- package/dist/test_list_graphs_topics.d.ts +2 -0
- package/dist/test_list_graphs_topics.d.ts.map +1 -0
- package/dist/test_list_graphs_topics.js +26 -0
- package/dist/test_list_graphs_topics.js.map +1 -0
- package/dist/test_live_endpoint_runner.d.ts +2 -0
- package/dist/test_live_endpoint_runner.d.ts.map +1 -0
- package/dist/test_live_endpoint_runner.js +65 -0
- package/dist/test_live_endpoint_runner.js.map +1 -0
- package/dist/test_local_list_graphs.d.ts +2 -0
- package/dist/test_local_list_graphs.d.ts.map +1 -0
- package/dist/test_local_list_graphs.js +53 -0
- package/dist/test_local_list_graphs.js.map +1 -0
- package/dist/test_nike_cmo_alias.d.ts +2 -0
- package/dist/test_nike_cmo_alias.d.ts.map +1 -0
- package/dist/test_nike_cmo_alias.js +76 -0
- package/dist/test_nike_cmo_alias.js.map +1 -0
- package/dist/test_token_resolution.d.ts +2 -0
- package/dist/test_token_resolution.d.ts.map +1 -0
- package/dist/test_token_resolution.js +82 -0
- package/dist/test_token_resolution.js.map +1 -0
- package/dist/toolHandlers.d.ts +7 -3
- package/dist/toolHandlers.d.ts.map +1 -1
- package/dist/toolHandlers.js +963 -310
- package/dist/toolHandlers.js.map +1 -1
- package/dist/tools.d.ts +6 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +7 -2
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +9 -46
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -1
- package/dist/verify_discoverability.d.ts +2 -0
- package/dist/verify_discoverability.d.ts.map +1 -0
- package/dist/verify_discoverability.js +53 -0
- package/dist/verify_discoverability.js.map +1 -0
- package/package.json +5 -2
- package/server.json +17 -4
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep Research Pipeline — extracted core logic.
|
|
3
|
+
*
|
|
4
|
+
* Pure async function: no job tracking, no billing, no MCP logging.
|
|
5
|
+
* Callers (MCP tool, A2A handler) own their own job state, billing
|
|
6
|
+
* gates, and progress reporting.
|
|
7
|
+
*
|
|
8
|
+
* One implementation, two callers — no pipeline duplication.
|
|
9
|
+
*/
|
|
10
|
+
import type { FoddaRequestFn, WaverunnerRequestFn } from './types.js';
|
|
11
|
+
export interface DeepResearchOpts {
|
|
12
|
+
query: string;
|
|
13
|
+
subThemes?: string[] | undefined;
|
|
14
|
+
apiKey: string;
|
|
15
|
+
userId: string;
|
|
16
|
+
depth?: 'light' | 'heavy';
|
|
17
|
+
graphId?: string | undefined;
|
|
18
|
+
foddaRequest: FoddaRequestFn;
|
|
19
|
+
waverunnerRequest: WaverunnerRequestFn;
|
|
20
|
+
/** Optional progress callback — callers use this for MCP logging messages, console logs, etc. */
|
|
21
|
+
onProgress?: (msg: string) => void;
|
|
22
|
+
}
|
|
23
|
+
export interface DeepResearchResult {
|
|
24
|
+
/** Full markdown report with header + sources section */
|
|
25
|
+
report: string;
|
|
26
|
+
/** Source routing plan — every candidate selected and why */
|
|
27
|
+
source_plan: Record<string, any>[];
|
|
28
|
+
/** Graph IDs that were searched */
|
|
29
|
+
graphs_searched: string[];
|
|
30
|
+
/** Sub-themes generated or passed and addressed */
|
|
31
|
+
sub_themes_used: string[];
|
|
32
|
+
/** Whether earnings data was included */
|
|
33
|
+
earnings_included: boolean;
|
|
34
|
+
/** Whether supplemental/macro data was included */
|
|
35
|
+
supplemental_included: boolean;
|
|
36
|
+
/** Duration in seconds (string, 1 decimal) */
|
|
37
|
+
duration_sec: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function extractRoutingTopic(q: string): string;
|
|
40
|
+
export declare function cleanResearchQuery(q: string): string;
|
|
41
|
+
export declare function fallbackSubThemes(topic: string, isHeavy: boolean): string[];
|
|
42
|
+
export declare function runDeepResearch(opts: DeepResearchOpts): Promise<DeepResearchResult>;
|
|
43
|
+
//# sourceMappingURL=deepResearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepResearch.d.ts","sourceRoot":"","sources":["../src/deepResearch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAUtE,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,YAAY,EAAE,cAAc,CAAC;IAC7B,iBAAiB,EAAE,mBAAmB,CAAC;IACvC,iGAAiG;IACjG,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,kBAAkB;IAC/B,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;IACnC,mCAAmC;IACnC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,mDAAmD;IACnD,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,yCAAyC;IACzC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mDAAmD;IACnD,qBAAqB,EAAE,OAAO,CAAC;IAC/B,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;CACxB;AAkBD,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CASrD;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAkB3E;AA4CD,wBAAsB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAydzF"}
|
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep Research Pipeline — extracted core logic.
|
|
3
|
+
*
|
|
4
|
+
* Pure async function: no job tracking, no billing, no MCP logging.
|
|
5
|
+
* Callers (MCP tool, A2A handler) own their own job state, billing
|
|
6
|
+
* gates, and progress reporting.
|
|
7
|
+
*
|
|
8
|
+
* One implementation, two callers — no pipeline duplication.
|
|
9
|
+
*/
|
|
10
|
+
import crypto from 'crypto';
|
|
11
|
+
import { getRelevantSources, getGraphDetails } from './catalogCache.js';
|
|
12
|
+
import { buildResearcherInstruction } from './agents/fodda-researcher/index.js';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Helpers & Sub-Theme Expansion
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
async function withTimeout(promise, ms, label) {
|
|
17
|
+
let timer;
|
|
18
|
+
const timeout = new Promise((_, reject) => {
|
|
19
|
+
timer = setTimeout(() => reject(new Error(`${label} timed out after ${ms / 1000}s`)), ms);
|
|
20
|
+
});
|
|
21
|
+
try {
|
|
22
|
+
return await Promise.race([promise, timeout]);
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
clearTimeout(timer);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function extractRoutingTopic(q) {
|
|
29
|
+
if (!q)
|
|
30
|
+
return q;
|
|
31
|
+
let s = q;
|
|
32
|
+
s = s.replace(/^(run|do|execute|start|launch|create|generate|write|give\s+me|provide|show\s+me|research|explore|synthesize|analyze|what\s+are|tell\s+me|can\s+you)(\s+a|\s+an|\s+the|\s+me|\s+us)?\s+(fodda\s+)?(deep\s+research\s+project|deep\s+research|strategic\s+breakdown|strategic\s+analysis|report|briefing|session|analysis|overview|breakdown|key\s+trends|trends|deep\s+dive)?(\s+about|\s+on|\s+for|\s+regarding|\s+in|\s+of)?/i, '');
|
|
33
|
+
const clauses = s.split(/\n|\?|\.|;|diagnos|troubleshoot|conversation|system message|user request/i)
|
|
34
|
+
.map(c => c.trim())
|
|
35
|
+
.filter(c => c.length > 2);
|
|
36
|
+
const topicClause = clauses[0] || s;
|
|
37
|
+
return topicClause.replace(/^[?\s,.:]+|[?\s,.:]+$/g, '').trim() || q;
|
|
38
|
+
}
|
|
39
|
+
export function cleanResearchQuery(q) {
|
|
40
|
+
return extractRoutingTopic(q);
|
|
41
|
+
}
|
|
42
|
+
export function fallbackSubThemes(topic, isHeavy) {
|
|
43
|
+
let cleanTopic = extractRoutingTopic(topic).trim();
|
|
44
|
+
if (cleanTopic.length > 40) {
|
|
45
|
+
const lastSpace = cleanTopic.lastIndexOf(' ', 40);
|
|
46
|
+
cleanTopic = lastSpace > 0 ? cleanTopic.slice(0, lastSpace) : cleanTopic.slice(0, 40);
|
|
47
|
+
}
|
|
48
|
+
cleanTopic = cleanTopic.replace(/[\s,.:;]+$/, '').trim();
|
|
49
|
+
const themes = [
|
|
50
|
+
`category sizing and growth forecasts for ${cleanTopic}`,
|
|
51
|
+
`key players, brands and challengers in ${cleanTopic}`,
|
|
52
|
+
`consumer behavior shifts and demand drivers for ${cleanTopic}`,
|
|
53
|
+
`channel dynamics: DTC, wholesale and marketplace for ${cleanTopic}`,
|
|
54
|
+
];
|
|
55
|
+
if (isHeavy) {
|
|
56
|
+
themes.push(`moderation, premiumization and lifestyle trends impacting ${cleanTopic}`);
|
|
57
|
+
}
|
|
58
|
+
return themes;
|
|
59
|
+
}
|
|
60
|
+
async function generateSubThemes(routingTopic, isHeavy, waverunnerRequest, apiKey, userId) {
|
|
61
|
+
const count = isHeavy ? 5 : 4;
|
|
62
|
+
try {
|
|
63
|
+
const payload = {
|
|
64
|
+
model: 'gemini-2.0-flash',
|
|
65
|
+
system_instruction: `You are a senior research strategist. Given a topic, generate exactly ${count} specific, distinct research sub-themes. Each sub-theme MUST name a concrete angle relevant to the specific topic (e.g. category sizing with forecasts, key competitive players/brands, channel dynamics like DTC vs wholesale, consumer behavior or moderation shifts, technology and format innovation). Output ONLY a JSON array of ${count} short strings (5-12 words each). Do NOT repeat the full query phrase verbatim in every string.`,
|
|
66
|
+
input: [{ type: 'text', text: routingTopic }],
|
|
67
|
+
response_mime_type: 'application/json',
|
|
68
|
+
};
|
|
69
|
+
const result = await withTimeout(waverunnerRequest('deep_dive', 0, apiKey, userId, payload), 10000, 'Sub-theme expansion');
|
|
70
|
+
const text = result?.outputs?.[0]?.text || '';
|
|
71
|
+
const match = text.match(/\[[\s\S]*\]/);
|
|
72
|
+
if (match) {
|
|
73
|
+
const parsed = JSON.parse(match[0]);
|
|
74
|
+
if (Array.isArray(parsed) && parsed.length >= 3) {
|
|
75
|
+
const cleaned = parsed.slice(0, count).map((s) => String(s).trim()).filter(Boolean);
|
|
76
|
+
if (cleaned.length >= 3) {
|
|
77
|
+
console.error(`[deep_research] LLM sub-theme expansion succeeded (${cleaned.length} themes):`, cleaned);
|
|
78
|
+
return cleaned;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
console.error(`[deep_research] Sub-theme LLM generation failed:`, err?.stack || err?.message || err);
|
|
85
|
+
}
|
|
86
|
+
return fallbackSubThemes(routingTopic, isHeavy);
|
|
87
|
+
}
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
// Main Pipeline
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
export async function runDeepResearch(opts) {
|
|
92
|
+
const { query: rawQuery, subThemes: clientSubThemes, apiKey, userId, foddaRequest, waverunnerRequest, depth = 'light', graphId, onProgress = () => { }, } = opts;
|
|
93
|
+
const routingTopic = extractRoutingTopic(rawQuery);
|
|
94
|
+
const researchBrief = rawQuery.trim();
|
|
95
|
+
const isHeavy = depth === 'heavy';
|
|
96
|
+
const tokenCost = isHeavy ? 3 : 2;
|
|
97
|
+
const maxGraphs = isHeavy ? 15 : 8;
|
|
98
|
+
const startTime = Date.now();
|
|
99
|
+
// ── Phase 1: Planning & Sub-Themes ──
|
|
100
|
+
onProgress(`📋 Phase 1/5: Planning research approach for "${routingTopic.slice(0, 80)}"...`);
|
|
101
|
+
console.error(`[deep_research] Starting ${isHeavy ? 'heavy' : 'light'} research for topic: "${routingTopic}" (brief length: ${researchBrief.length} chars)`);
|
|
102
|
+
const effectiveSubThemes = (clientSubThemes && clientSubThemes.length > 0)
|
|
103
|
+
? clientSubThemes.slice(0, isHeavy ? 5 : 4)
|
|
104
|
+
: await generateSubThemes(routingTopic, isHeavy, waverunnerRequest, apiKey, userId);
|
|
105
|
+
console.error(`[deep_research] Using ${effectiveSubThemes.length} sub-themes:`, effectiveSubThemes);
|
|
106
|
+
const sourceCandidates = graphId ? [] : getRelevantSources(routingTopic, { minGraphs: isHeavy ? 6 : 4, maxGraphs });
|
|
107
|
+
const graphCandidates = sourceCandidates
|
|
108
|
+
.filter((c) => c.kind === 'graph')
|
|
109
|
+
.slice(0, maxGraphs);
|
|
110
|
+
const graphIds = graphId ? [graphId] : graphCandidates.map(c => c.graphId);
|
|
111
|
+
const earningsCandidate = sourceCandidates.find((c) => c.kind === 'earnings');
|
|
112
|
+
const supplementalCandidates = sourceCandidates.filter((c) => c.kind === 'supplemental');
|
|
113
|
+
const supplementalToFetch = supplementalCandidates
|
|
114
|
+
.sort((a, b) => b.score - a.score)
|
|
115
|
+
.slice(0, 2);
|
|
116
|
+
const supplementalHintOnly = supplementalCandidates.slice(supplementalToFetch.length);
|
|
117
|
+
const sourcePlan = [
|
|
118
|
+
...(graphId
|
|
119
|
+
? [{ kind: 'graph', id: graphId, reason: 'explicitly requested via graphId' }]
|
|
120
|
+
: graphCandidates.map(c => ({ kind: 'graph', id: c.graphId, reason: c.reason }))),
|
|
121
|
+
...(earningsCandidate ? [{
|
|
122
|
+
kind: 'earnings',
|
|
123
|
+
...(earningsCandidate.ticker ? { ticker: earningsCandidate.ticker } : {}),
|
|
124
|
+
...(earningsCandidate.brand ? { brand: earningsCandidate.brand } : {}),
|
|
125
|
+
...(earningsCandidate.sector ? { sector: earningsCandidate.sector } : {}),
|
|
126
|
+
reason: earningsCandidate.reason,
|
|
127
|
+
}] : []),
|
|
128
|
+
...supplementalToFetch.map(c => ({
|
|
129
|
+
kind: 'supplemental',
|
|
130
|
+
category: c.category,
|
|
131
|
+
reason: `${c.reason} — auto-fetched and folded into research context`,
|
|
132
|
+
})),
|
|
133
|
+
...supplementalHintOnly.map(c => ({
|
|
134
|
+
kind: 'supplemental',
|
|
135
|
+
category: c.category,
|
|
136
|
+
reason: `${c.reason} — not auto-fetched (beyond top-2 cap); targeted tool available: get_supplemental_context`,
|
|
137
|
+
})),
|
|
138
|
+
];
|
|
139
|
+
// ── Phase 2: Tiered Two-Pass Retrieval ──
|
|
140
|
+
onProgress(`🔍 Phase 2/5: Broad discovery search across ${graphIds.length} knowledge graph${graphIds.length !== 1 ? 's' : ''}...`);
|
|
141
|
+
// Pass 1: Broad discovery — routingTopic against ALL graphs (limit 3, 8s per-call timeout)
|
|
142
|
+
const broadSearchPromises = graphIds.map(async (gid) => {
|
|
143
|
+
try {
|
|
144
|
+
const searchBody = { query: routingTopic, limit: 3, use_semantic: true, include_evidence: true };
|
|
145
|
+
const res = await withTimeout(foddaRequest('POST', `/v1/graphs/${encodeURIComponent(gid)}/search`, apiKey, userId, searchBody), 8000, `Graph search ${gid}`);
|
|
146
|
+
const rows = res?.rows || [];
|
|
147
|
+
return { graphId: gid, rows, evidence: rows.flatMap((r) => r.evidence || []) };
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
console.error(`[deep_research] Pass 1 graph search for ${gid} failed/timed out: ${err?.message}`);
|
|
151
|
+
return { graphId: gid, rows: [], evidence: [] };
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
const earningsPromise = earningsCandidate
|
|
155
|
+
? (async () => {
|
|
156
|
+
try {
|
|
157
|
+
const params = new URLSearchParams();
|
|
158
|
+
if (earningsCandidate.ticker)
|
|
159
|
+
params.set('ticker', earningsCandidate.ticker);
|
|
160
|
+
if (earningsCandidate.brand)
|
|
161
|
+
params.set('brand', earningsCandidate.brand);
|
|
162
|
+
if (earningsCandidate.sector)
|
|
163
|
+
params.set('sector', earningsCandidate.sector);
|
|
164
|
+
if (earningsCandidate.search)
|
|
165
|
+
params.set('search', earningsCandidate.search);
|
|
166
|
+
params.set('limit', '10');
|
|
167
|
+
return await withTimeout(foddaRequest('GET', `/v1/supplemental/earnings/snapshot?${params.toString()}`, apiKey, userId), 15000, 'Earnings snapshot');
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
console.error(`[deep_research] Earnings snapshot failed (non-fatal): ${err?.message}`);
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
})()
|
|
174
|
+
: Promise.resolve(null);
|
|
175
|
+
const supplementalPromise = supplementalToFetch.length > 0
|
|
176
|
+
? (async () => {
|
|
177
|
+
try {
|
|
178
|
+
const body = { query: researchBrief };
|
|
179
|
+
const categoryHint = supplementalToFetch.map(c => c.category).join(', ');
|
|
180
|
+
body.domain = categoryHint;
|
|
181
|
+
return await withTimeout(foddaRequest('POST', '/v1/supplemental/context', apiKey, userId, body), 15000, 'Supplemental context');
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
console.error(`[deep_research] Supplemental context failed (non-fatal): ${err?.message}`);
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
})()
|
|
188
|
+
: Promise.resolve(null);
|
|
189
|
+
const [broadResults, earningsData, supplementalData] = await Promise.all([
|
|
190
|
+
Promise.all(broadSearchPromises),
|
|
191
|
+
earningsPromise,
|
|
192
|
+
supplementalPromise,
|
|
193
|
+
]);
|
|
194
|
+
// Rank Pass 1 results by relevance (max row score + router score tiebreak)
|
|
195
|
+
const getGraphRelevanceScore = (g) => {
|
|
196
|
+
if (!g.rows || g.rows.length === 0)
|
|
197
|
+
return 0;
|
|
198
|
+
const maxRowScore = Math.max(...g.rows.map(r => Number(r.signal_score ?? r.score ?? r.similarity ?? 0.5)));
|
|
199
|
+
const routerCandidate = graphCandidates.find(c => c.graphId === g.graphId);
|
|
200
|
+
const routerScore = routerCandidate?.score ?? 0;
|
|
201
|
+
return maxRowScore * 10 + routerScore;
|
|
202
|
+
};
|
|
203
|
+
const topGraphIds = broadResults
|
|
204
|
+
.filter(g => g.rows.length > 0)
|
|
205
|
+
.sort((a, b) => getGraphRelevanceScore(b) - getGraphRelevanceScore(a))
|
|
206
|
+
.slice(0, isHeavy ? 5 : 4)
|
|
207
|
+
.map(g => g.graphId);
|
|
208
|
+
onProgress(`🎯 Phase 2b: Deep sub-theme search on top ${topGraphIds.length} graph${topGraphIds.length !== 1 ? 's' : ''}...`);
|
|
209
|
+
// Pass 2: Deep search — sub-themes against top-hit graphs only (limit 5, 8s per-call timeout)
|
|
210
|
+
const deepSearchPromises = [];
|
|
211
|
+
for (const gid of topGraphIds) {
|
|
212
|
+
for (const st of effectiveSubThemes) {
|
|
213
|
+
deepSearchPromises.push((async () => {
|
|
214
|
+
try {
|
|
215
|
+
const searchBody = { query: st, limit: isHeavy ? 5 : 3, use_semantic: true, include_evidence: true };
|
|
216
|
+
const res = await withTimeout(foddaRequest('POST', `/v1/graphs/${encodeURIComponent(gid)}/search`, apiKey, userId, searchBody), 8000, `Deep search ${gid}:${st}`);
|
|
217
|
+
const rows = res?.rows || [];
|
|
218
|
+
return { graphId: gid, subTheme: st, rows, evidence: rows.flatMap((r) => r.evidence || []) };
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
console.error(`[deep_research] Pass 2 deep search for ${gid}:${st} failed/timed out: ${err?.message}`);
|
|
222
|
+
return { graphId: gid, subTheme: st, rows: [], evidence: [] };
|
|
223
|
+
}
|
|
224
|
+
})());
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
const deepResults = await Promise.all(deepSearchPromises);
|
|
228
|
+
const trendMap = new Map();
|
|
229
|
+
// Process deepResults FIRST so subTheme attribution takes priority over broad hits
|
|
230
|
+
for (const r of [...deepResults, ...broadResults]) {
|
|
231
|
+
const st = r.subTheme;
|
|
232
|
+
for (const row of r.rows) {
|
|
233
|
+
const trendName = String(row.title || row.trendName || row.name || '').trim();
|
|
234
|
+
if (!trendName)
|
|
235
|
+
continue;
|
|
236
|
+
const key = `${r.graphId}::${trendName.toLowerCase()}`;
|
|
237
|
+
const existing = trendMap.get(key);
|
|
238
|
+
if (existing) {
|
|
239
|
+
if (st)
|
|
240
|
+
existing.subThemes.add(st);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
const subThemes = new Set();
|
|
244
|
+
if (st)
|
|
245
|
+
subThemes.add(st);
|
|
246
|
+
trendMap.set(key, {
|
|
247
|
+
graphId: r.graphId,
|
|
248
|
+
trendName,
|
|
249
|
+
summary: String(row.summary || row.description || '').substring(0, 600),
|
|
250
|
+
signalScore: row.signal_score || row.score || 0.5,
|
|
251
|
+
lifecycle: row.trendLifecycle || row.lifecycle || 'growing',
|
|
252
|
+
evidence: (row.evidence || []).slice(0, 3).map((e) => ({
|
|
253
|
+
title: String(e.title || '').substring(0, 150),
|
|
254
|
+
snippet: String(e.snippet || e.summary || '').substring(0, 400),
|
|
255
|
+
source_url: e.sourceUrl || e.url,
|
|
256
|
+
category: e.category || e.type,
|
|
257
|
+
})),
|
|
258
|
+
subThemes,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Group curated trends by graphId for Gemini context
|
|
264
|
+
const curatedGraphsMap = new Map();
|
|
265
|
+
let totalTrends = 0;
|
|
266
|
+
let totalEvidence = 0;
|
|
267
|
+
for (const trend of trendMap.values()) {
|
|
268
|
+
totalTrends++;
|
|
269
|
+
totalEvidence += trend.evidence.length;
|
|
270
|
+
const list = curatedGraphsMap.get(trend.graphId) || [];
|
|
271
|
+
if (list.length < (isHeavy ? 6 : 4)) {
|
|
272
|
+
list.push({
|
|
273
|
+
name: trend.trendName,
|
|
274
|
+
sub_themes_supported: Array.from(trend.subThemes),
|
|
275
|
+
summary: trend.summary,
|
|
276
|
+
signal_score: trend.signalScore,
|
|
277
|
+
lifecycle: trend.lifecycle,
|
|
278
|
+
evidence: trend.evidence,
|
|
279
|
+
});
|
|
280
|
+
curatedGraphsMap.set(trend.graphId, list);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
const structuredGraphResults = Array.from(curatedGraphsMap.entries()).map(([gid, trends]) => ({
|
|
284
|
+
graph_id: gid,
|
|
285
|
+
trends,
|
|
286
|
+
}));
|
|
287
|
+
const searchedGraphIds = Array.from(new Set([...graphIds, ...topGraphIds]));
|
|
288
|
+
const activeGraphs = structuredGraphResults.filter(g => g.trends.length > 0);
|
|
289
|
+
if (activeGraphs.length === 0) {
|
|
290
|
+
console.error(`[deep_research] All graph searches returned no curated results — proceeding with web-only research`);
|
|
291
|
+
onProgress(`⚠️ Knowledge graph search returned no results — proceeding with web-only research...`);
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
onProgress(`📊 Curated ${totalTrends} trend${totalTrends !== 1 ? 's' : ''} and ${totalEvidence} evidence pieces across ${activeGraphs.length} active graph${activeGraphs.length !== 1 ? 's' : ''}. Launching deep analysis...`);
|
|
295
|
+
}
|
|
296
|
+
// ── Phase 3: Deep Analysis via Gemini ──
|
|
297
|
+
onProgress(`🧠 Phase 3/5: Deep analysis with web research — this takes 1-3 minutes...`);
|
|
298
|
+
const graphContext = {
|
|
299
|
+
graphResults: JSON.stringify(structuredGraphResults, null, 2),
|
|
300
|
+
graphsSearched: searchedGraphIds,
|
|
301
|
+
totalTrends,
|
|
302
|
+
totalEvidence,
|
|
303
|
+
focusGraphId: graphId,
|
|
304
|
+
subThemesUsed: effectiveSubThemes,
|
|
305
|
+
...(earningsData ? { earningsResults: JSON.stringify(earningsData).substring(0, 15000) } : {}),
|
|
306
|
+
...(supplementalData ? { supplementalResults: JSON.stringify(supplementalData).substring(0, 15000) } : {}),
|
|
307
|
+
};
|
|
308
|
+
const systemInstruction = buildResearcherInstruction(researchBrief, graphContext);
|
|
309
|
+
const geminiModel = isHeavy ? 'gemini-2.5-pro' : 'gemini-2.5-flash';
|
|
310
|
+
const subThemesInstruction = effectiveSubThemes
|
|
311
|
+
.map((st, i) => `${i + 1}. ${st}`)
|
|
312
|
+
.join('\n');
|
|
313
|
+
const interactionPayload = {
|
|
314
|
+
model: geminiModel,
|
|
315
|
+
system_instruction: systemInstruction,
|
|
316
|
+
input: [
|
|
317
|
+
{
|
|
318
|
+
type: 'text',
|
|
319
|
+
text: `Full Research Brief:\n${researchBrief}\n\n## Mandatory Research Sub-Themes (you MUST address ALL of these in the report):\n${subThemesInstruction}\n\nProduce a comprehensive research report addressing EVERY requirement in the research brief and EVERY sub-theme above. Write in editorial narrative style — like a senior strategist briefing a CMO.\n\nCRITICAL MANDATE: You MUST actively leverage your web search tool to find and integrate quantitative market sizing data (dollar market values, projected CAGRs, category growth rates, and volume vs value figures), competitive brand players, and channel dynamics for all key categories in the brief. Combine curated knowledge graph trends with live web evidence to deliver a complete, highly specific brief.\n\nIMPORTANT: At the end of the report, you MUST include a "## Sources" section listing all the source URLs you used from the provided context.`,
|
|
320
|
+
},
|
|
321
|
+
],
|
|
322
|
+
tools: [
|
|
323
|
+
{ type: 'google_search' },
|
|
324
|
+
{ type: 'url_context' },
|
|
325
|
+
],
|
|
326
|
+
};
|
|
327
|
+
// Call Gemini with capacity fallback
|
|
328
|
+
let result;
|
|
329
|
+
try {
|
|
330
|
+
result = await waverunnerRequest('deep_dive', tokenCost, apiKey, userId, interactionPayload);
|
|
331
|
+
}
|
|
332
|
+
catch (primaryErr) {
|
|
333
|
+
const errMsg = primaryErr?.response?.data?.error?.message || primaryErr?.message || '';
|
|
334
|
+
const isCapacity = errMsg.includes('high demand') || errMsg.includes('overloaded') || errMsg.includes('503');
|
|
335
|
+
if (isCapacity && geminiModel !== 'gemini-2.5-flash') {
|
|
336
|
+
console.error(`[deep_research] ${geminiModel} capacity error — retrying with gemini-2.5-flash`);
|
|
337
|
+
interactionPayload.model = 'gemini-2.5-flash';
|
|
338
|
+
result = await waverunnerRequest('deep_dive', tokenCost, apiKey, userId, interactionPayload);
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
throw primaryErr;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// ── Extract report text ──
|
|
345
|
+
const outputs = result?.outputs || [];
|
|
346
|
+
const textParts = outputs
|
|
347
|
+
.filter((o) => o.type === 'text')
|
|
348
|
+
.map((o) => o.text);
|
|
349
|
+
let reportText = textParts.join('\n\n');
|
|
350
|
+
// Strip/unwrap grounding API redirect links embedded in markdown text by Gemini
|
|
351
|
+
reportText = reportText.replace(/\[([^\]]+)\]\(https?:\/\/(?:vertexaisearch\.cloud\.google\.com|www\.google\.com\/url)[^\)]+\)/gi, '$1');
|
|
352
|
+
reportText = reportText.replace(/https?:\/\/vertexaisearch\.cloud\.google\.com\/[^\s\)]+/gi, '');
|
|
353
|
+
// Diagnostic logging for citation payloads
|
|
354
|
+
console.error(`[deep_research] Raw annotations payload:`, JSON.stringify(outputs.flatMap((o) => o.annotations || [])));
|
|
355
|
+
console.error(`[deep_research] Raw groundingChunks count:`, (result?.groundingMetadata?.groundingChunks || []).length);
|
|
356
|
+
// ── Extract URLs ──
|
|
357
|
+
const normalizeUrl = (rawUrl) => {
|
|
358
|
+
if (!rawUrl)
|
|
359
|
+
return null;
|
|
360
|
+
let u = rawUrl.trim();
|
|
361
|
+
// Strip inner spaces/newlines in URL (e.g. "funded- startups-in-wine")
|
|
362
|
+
u = u.replace(/\s+/g, '');
|
|
363
|
+
// Fix scheme typos (httpss:// -> https://)
|
|
364
|
+
u = u.replace(/^httpss:\/\//i, 'https://');
|
|
365
|
+
u = u.replace(/^https?:\/\/\//i, 'https://');
|
|
366
|
+
// Extract real destination from google redirect URLs if present
|
|
367
|
+
if (u.includes('google.com/url?') || u.includes('google.com/url&')) {
|
|
368
|
+
const match = u.match(/[?&](?:url|q)=(https?%3A%2F%2F[^&]+|https?:\/\/[^&]+)/i);
|
|
369
|
+
if (match && match[1]) {
|
|
370
|
+
u = decodeURIComponent(match[1]);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
// Fix typos where :// was replaced by dot (e.g., https.www.domain.com -> https://www.domain.com)
|
|
374
|
+
if (/^https?\.[a-z0-9]/i.test(u)) {
|
|
375
|
+
u = u.replace(/^(https?)\./i, '$1://');
|
|
376
|
+
}
|
|
377
|
+
try {
|
|
378
|
+
const parsed = new URL(u);
|
|
379
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:')
|
|
380
|
+
return null;
|
|
381
|
+
if (!parsed.hostname || !parsed.hostname.includes('.'))
|
|
382
|
+
return null;
|
|
383
|
+
// Reject hostname missing real domain (e.g., "https.com")
|
|
384
|
+
if (parsed.hostname === 'https.com' || parsed.hostname === 'http.com')
|
|
385
|
+
return null;
|
|
386
|
+
return parsed.toString();
|
|
387
|
+
}
|
|
388
|
+
catch {
|
|
389
|
+
return null;
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
const isInternalOrSearchUrl = (url) => {
|
|
393
|
+
if (!url)
|
|
394
|
+
return true;
|
|
395
|
+
const u = url.toLowerCase();
|
|
396
|
+
return u.includes('vertexaisearch.cloud.google.com') ||
|
|
397
|
+
u.includes('fodda.ai') ||
|
|
398
|
+
u.includes('localhost') ||
|
|
399
|
+
u.includes('google.com/search') ||
|
|
400
|
+
u.includes('google.com/url') ||
|
|
401
|
+
u.includes('googleusercontent.com');
|
|
402
|
+
};
|
|
403
|
+
const isFabricatedUrl = (url) => {
|
|
404
|
+
if (!url)
|
|
405
|
+
return true;
|
|
406
|
+
if (/YOUR_\w+/i.test(url))
|
|
407
|
+
return true;
|
|
408
|
+
return false;
|
|
409
|
+
};
|
|
410
|
+
const seenUrls = new Set();
|
|
411
|
+
const sourceUrls = [];
|
|
412
|
+
// ── Harvest Graph Provenance Sources (P2) ──
|
|
413
|
+
for (const gId of searchedGraphIds) {
|
|
414
|
+
const g = getGraphDetails(gId);
|
|
415
|
+
const graphTitle = g?.name || gId;
|
|
416
|
+
const curatorAttr = g ? [g.curator, g.company].filter(Boolean).join(' / ') : '';
|
|
417
|
+
const titleText = curatorAttr ? `${graphTitle} (${curatorAttr})` : graphTitle;
|
|
418
|
+
const graphTrends = curatedGraphsMap.get(gId) || [];
|
|
419
|
+
let hasEvidenceUrl = false;
|
|
420
|
+
// 1. Evidence item formatted_citation / sourceUrl (real external links)
|
|
421
|
+
for (const t of graphTrends) {
|
|
422
|
+
for (const ev of (t.evidence || [])) {
|
|
423
|
+
const rawEvUrl = typeof ev === 'string' ? ev : (ev?.sourceUrl || ev?.formatted_citation || '');
|
|
424
|
+
const normEv = normalizeUrl(rawEvUrl);
|
|
425
|
+
if (normEv && !isInternalOrSearchUrl(normEv) && !isFabricatedUrl(normEv) && !seenUrls.has(normEv)) {
|
|
426
|
+
seenUrls.add(normEv);
|
|
427
|
+
sourceUrls.push({ title: titleText, url: normEv });
|
|
428
|
+
hasEvidenceUrl = true;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
// 2. Fallback: Graph webpage_url from catalog ONLY (never construct fodda.ai/graphs/${gId})
|
|
433
|
+
const deepLink = normalizeUrl(g?.webpage_url || '') || normalizeUrl(g?.source_url || '');
|
|
434
|
+
if (deepLink && !seenUrls.has(deepLink)) {
|
|
435
|
+
seenUrls.add(deepLink);
|
|
436
|
+
sourceUrls.push({
|
|
437
|
+
title: curatorAttr ? `${graphTitle} — Curated by ${curatorAttr}` : graphTitle,
|
|
438
|
+
url: deepLink
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
else if (!hasEvidenceUrl && !deepLink) {
|
|
442
|
+
// 3. Fallback when no URL exists: emit clean curator attribution text
|
|
443
|
+
const textEntry = curatorAttr ? `${graphTitle} — Curated by ${curatorAttr}` : graphTitle;
|
|
444
|
+
if (!seenUrls.has(textEntry)) {
|
|
445
|
+
seenUrls.add(textEntry);
|
|
446
|
+
sourceUrls.push({
|
|
447
|
+
title: textEntry,
|
|
448
|
+
url: ''
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
// Harvest Web Grounding URLs
|
|
454
|
+
for (const output of outputs) {
|
|
455
|
+
if (output.type === 'text' && Array.isArray(output.annotations)) {
|
|
456
|
+
for (const ann of output.annotations) {
|
|
457
|
+
const norm = normalizeUrl(ann.url);
|
|
458
|
+
if (ann.type === 'url_citation' && norm && !isInternalOrSearchUrl(norm) && !isFabricatedUrl(norm) && !seenUrls.has(norm)) {
|
|
459
|
+
seenUrls.add(norm);
|
|
460
|
+
sourceUrls.push({ title: ann.title || '', url: norm });
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
const groundingChunks = result?.groundingMetadata?.groundingChunks || [];
|
|
466
|
+
for (const chunk of groundingChunks) {
|
|
467
|
+
const uri = chunk?.web?.uri;
|
|
468
|
+
const norm = normalizeUrl(uri);
|
|
469
|
+
if (norm && !isInternalOrSearchUrl(norm) && !isFabricatedUrl(norm) && !seenUrls.has(norm)) {
|
|
470
|
+
seenUrls.add(norm);
|
|
471
|
+
sourceUrls.push({ title: chunk?.web?.title || '', url: norm });
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
// ALWAYS strip any self-generated Sources / References section from Gemini
|
|
475
|
+
const sourcesRegex = /(#+\s*(?:sources|references)[\s\S]*$)/i;
|
|
476
|
+
reportText = reportText.replace(sourcesRegex, '').trim();
|
|
477
|
+
if (sourceUrls.length > 0) {
|
|
478
|
+
reportText += '\n\n## Sources & References\n' + sourceUrls.map(s => s.url ? `- [${s.title}](${s.url})` : `- ${s.title}`).join('\n');
|
|
479
|
+
}
|
|
480
|
+
if (!reportText) {
|
|
481
|
+
throw new Error('Research agent returned no output.');
|
|
482
|
+
}
|
|
483
|
+
const durationSec = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
484
|
+
const header = [
|
|
485
|
+
`_Research by Fodda Research Agent • ${activeGraphs.length} graph${activeGraphs.length !== 1 ? 's' : ''} searched • ${totalTrends} trends analyzed${earningsData ? ' • earnings intelligence included' : ''}${supplementalData ? ' • supplemental macro data included' : ''} • ${durationSec}s_`,
|
|
486
|
+
'',
|
|
487
|
+
].join('\n');
|
|
488
|
+
return {
|
|
489
|
+
report: header + reportText,
|
|
490
|
+
source_plan: sourcePlan,
|
|
491
|
+
graphs_searched: searchedGraphIds,
|
|
492
|
+
sub_themes_used: effectiveSubThemes,
|
|
493
|
+
earnings_included: !!earningsData,
|
|
494
|
+
supplemental_included: !!supplementalData,
|
|
495
|
+
duration_sec: durationSec,
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
//# sourceMappingURL=deepResearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepResearch.js","sourceRoot":"","sources":["../src/deepResearch.ts"],"names":[],"mappings":"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"}
|
package/dist/errorHandling.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export declare function classifyAccessError(err: any): 'forbidden' | 'disabled'
|
|
|
20
20
|
* GRAPH_DISABLED → mention it so the user knows they opted out
|
|
21
21
|
* CREDITS → trial-aware handling (auto-upgrade or prompt for email)
|
|
22
22
|
*/
|
|
23
|
-
export declare function handleAccessError(err: any, toolName: string): Promise<{
|
|
23
|
+
export declare function handleAccessError(err: any, toolName: string, userId?: string, apiKey?: string): Promise<{
|
|
24
24
|
isError: boolean;
|
|
25
25
|
content: {
|
|
26
26
|
type: 'text';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorHandling.d.ts","sourceRoot":"","sources":["../src/errorHandling.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAwDH;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,gBAAgB,GAAG,IAAI,CAyB5G;AAMD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"errorHandling.d.ts","sourceRoot":"","sources":["../src/errorHandling.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAwDH;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,gBAAgB,GAAG,IAAI,CAyB5G;AAMD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CAgF9K;AAyCD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,2BAA2B,CAC7C,GAAG,EAAE,GAAG,EACR,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CA4IjF"}
|