fodda-mcp 1.7.0 → 1.30.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 +31 -0
- package/README.md +176 -18
- package/dist/a2aHandler.d.ts +20 -0
- package/dist/a2aHandler.d.ts.map +1 -0
- package/dist/a2aHandler.js +247 -0
- package/dist/a2aHandler.js.map +1 -0
- package/dist/agents/fodda-researcher/index.d.ts +35 -0
- package/dist/agents/fodda-researcher/index.d.ts.map +1 -0
- package/dist/agents/fodda-researcher/index.js +62 -0
- package/dist/agents/fodda-researcher/index.js.map +1 -0
- package/dist/agents/fodda-researcher/skills.d.ts +16 -0
- package/dist/agents/fodda-researcher/skills.d.ts.map +1 -0
- package/dist/agents/fodda-researcher/skills.js +163 -0
- package/dist/agents/fodda-researcher/skills.js.map +1 -0
- package/dist/brandTemplate.d.ts +14 -0
- package/dist/brandTemplate.d.ts.map +1 -0
- package/dist/brandTemplate.js +742 -0
- package/dist/brandTemplate.js.map +1 -0
- package/dist/catalogCache.d.ts +177 -0
- package/dist/catalogCache.d.ts.map +1 -0
- package/dist/catalogCache.js +708 -0
- package/dist/catalogCache.js.map +1 -0
- package/dist/editorialFill.d.ts +44 -0
- package/dist/editorialFill.d.ts.map +1 -0
- package/dist/editorialFill.js +377 -0
- package/dist/editorialFill.js.map +1 -0
- package/dist/enrichment.d.ts +74 -0
- package/dist/enrichment.d.ts.map +1 -0
- package/dist/enrichment.js +211 -0
- package/dist/enrichment.js.map +1 -0
- package/dist/errorHandling.d.ts +52 -0
- package/dist/errorHandling.d.ts.map +1 -0
- package/dist/errorHandling.js +327 -0
- package/dist/errorHandling.js.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.js +595 -581
- package/dist/index.js.map +1 -1
- package/dist/pricingCache.d.ts +99 -0
- package/dist/pricingCache.d.ts.map +1 -0
- package/dist/pricingCache.js +414 -0
- package/dist/pricingCache.js.map +1 -0
- package/dist/queryCache.d.ts +25 -0
- package/dist/queryCache.d.ts.map +1 -0
- package/dist/queryCache.js +194 -0
- package/dist/queryCache.js.map +1 -0
- package/dist/searchTemplate.d.ts +16 -0
- package/dist/searchTemplate.d.ts.map +1 -0
- package/dist/searchTemplate.js +318 -0
- package/dist/searchTemplate.js.map +1 -0
- package/dist/sessionTracker.d.ts +39 -0
- package/dist/sessionTracker.d.ts.map +1 -0
- package/dist/sessionTracker.js +187 -0
- package/dist/sessionTracker.js.map +1 -0
- package/dist/skillClient.d.ts +142 -0
- package/dist/skillClient.d.ts.map +1 -0
- package/dist/skillClient.js +256 -0
- package/dist/skillClient.js.map +1 -0
- package/dist/svgVisuals.d.ts +77 -0
- package/dist/svgVisuals.d.ts.map +1 -0
- package/dist/svgVisuals.js +323 -0
- package/dist/svgVisuals.js.map +1 -0
- package/dist/systemPrompt.d.ts +26 -0
- package/dist/systemPrompt.d.ts.map +1 -0
- package/dist/systemPrompt.js +546 -0
- package/dist/systemPrompt.js.map +1 -0
- package/dist/test-waverunner-response.d.ts +2 -0
- package/dist/test-waverunner-response.d.ts.map +1 -0
- package/dist/test-waverunner-response.js +20 -0
- package/dist/test-waverunner-response.js.map +1 -0
- package/dist/test_analyst.d.ts +2 -0
- package/dist/test_analyst.d.ts.map +1 -0
- package/dist/test_analyst.js +39 -0
- package/dist/test_analyst.js.map +1 -0
- package/dist/test_analyst_local.d.ts +2 -0
- package/dist/test_analyst_local.d.ts.map +1 -0
- package/dist/test_analyst_local.js +51 -0
- package/dist/test_analyst_local.js.map +1 -0
- package/dist/test_live_mcp.js +1 -1
- package/dist/test_skills.d.ts +9 -0
- package/dist/test_skills.d.ts.map +1 -0
- package/dist/test_skills.js +267 -0
- package/dist/test_skills.js.map +1 -0
- package/dist/toolHandlers.d.ts +11 -0
- package/dist/toolHandlers.d.ts.map +1 -0
- package/dist/toolHandlers.js +2829 -0
- package/dist/toolHandlers.js.map +1 -0
- package/dist/tools.d.ts +78 -3
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +85 -292
- package/dist/tools.js.map +1 -1
- package/dist/trialTracker.d.ts +58 -0
- package/dist/trialTracker.d.ts.map +1 -0
- package/dist/trialTracker.js +179 -0
- package/dist/trialTracker.js.map +1 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/verify_hmac.js +1 -1
- package/dist/verify_hmac.js.map +1 -1
- package/dist/verify_tools_endpoint.js +5 -5
- package/dist/verify_tools_endpoint.js.map +1 -1
- package/dist/widgetShell.d.ts +15 -0
- package/dist/widgetShell.d.ts.map +1 -0
- package/dist/widgetShell.js +151 -0
- package/dist/widgetShell.js.map +1 -0
- package/package.json +8 -4
- package/server.json +11 -2
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trend Enrichment — lifecycle, momentum, and evidence formatting helpers.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from index.ts to reduce monolith size.
|
|
5
|
+
* These functions operate on fields already present on Neo4j Trend nodes
|
|
6
|
+
* (firstSeen, lastSeen, evidenceCount) — no API calls needed.
|
|
7
|
+
*/
|
|
8
|
+
import { getDomainGraphIds } from './catalogCache.js';
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Trend lifecycle, momentum, and fast-mover computation
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
export function computeLifecycle(row, now) {
|
|
13
|
+
const ts = now || Date.now();
|
|
14
|
+
const first = row.firstSeen ? new Date(row.firstSeen).getTime() : 0;
|
|
15
|
+
const last = row.lastSeen ? new Date(row.lastSeen).getTime() : 0;
|
|
16
|
+
if (!first || !last) {
|
|
17
|
+
// Fallback: signal-score + evidence-count heuristic when dates are missing
|
|
18
|
+
const signal = row.signal_score || row.signalScore || 0;
|
|
19
|
+
const evCount = row.evidence_count || row.evidenceCount || 0;
|
|
20
|
+
if (signal >= 70 && evCount >= 10)
|
|
21
|
+
return 'mature';
|
|
22
|
+
if (signal >= 45 || evCount >= 6)
|
|
23
|
+
return 'building';
|
|
24
|
+
if (signal < 20 && evCount <= 2)
|
|
25
|
+
return 'fading';
|
|
26
|
+
return 'emerging';
|
|
27
|
+
}
|
|
28
|
+
const ageMonths = (ts - first) / (1000 * 60 * 60 * 24 * 30);
|
|
29
|
+
const staleDays = (ts - last) / (1000 * 60 * 60 * 24);
|
|
30
|
+
const count = row.evidence_count || row.evidenceCount || 0;
|
|
31
|
+
if (staleDays > 180)
|
|
32
|
+
return 'fading';
|
|
33
|
+
if (ageMonths < 6 && count < 5)
|
|
34
|
+
return 'emerging';
|
|
35
|
+
if (ageMonths > 12 && count > 10)
|
|
36
|
+
return 'mature';
|
|
37
|
+
return 'building';
|
|
38
|
+
}
|
|
39
|
+
export function computeMomentum(row, now) {
|
|
40
|
+
const ts = now || Date.now();
|
|
41
|
+
const last = row.lastSeen ? new Date(row.lastSeen).getTime() : 0;
|
|
42
|
+
const freshnessDays = row.freshnessDays || (last ? (ts - last) / (1000 * 60 * 60 * 24) : 999);
|
|
43
|
+
if (freshnessDays < 30)
|
|
44
|
+
return 'accelerating';
|
|
45
|
+
if (freshnessDays < 90)
|
|
46
|
+
return 'steady';
|
|
47
|
+
return 'slowing';
|
|
48
|
+
}
|
|
49
|
+
export function isFastMover(row, now) {
|
|
50
|
+
const ts = now || Date.now();
|
|
51
|
+
const first = row.firstSeen ? new Date(row.firstSeen).getTime() : 0;
|
|
52
|
+
if (!first)
|
|
53
|
+
return false;
|
|
54
|
+
const ageMonths = (ts - first) / (1000 * 60 * 60 * 24 * 30);
|
|
55
|
+
return ageMonths < 6 && (row.evidence_count || row.evidenceCount || 0) >= 8;
|
|
56
|
+
}
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Graph badge icons
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
export const GRAPH_BADGES = {
|
|
61
|
+
'retail': '⬡', 'beauty': '◆', 'fashion': '▲', 'sports': '●',
|
|
62
|
+
'sic': '◇', 'ce-design': '□', 'pew': '◈',
|
|
63
|
+
};
|
|
64
|
+
// Evidence role mapping — assigns editorial purpose to each content type
|
|
65
|
+
const EVIDENCE_ROLES = {
|
|
66
|
+
'interpretation': 'insight', // Proprietary analysis — the moat
|
|
67
|
+
'analysis': 'insight',
|
|
68
|
+
'signal': 'proof', // Case studies — innovation examples
|
|
69
|
+
'case study': 'proof',
|
|
70
|
+
'metric': 'scale', // Statistics — curated numbers
|
|
71
|
+
'statistic': 'scale',
|
|
72
|
+
'quote': 'voice', // Expert attribution
|
|
73
|
+
'interview': 'voice',
|
|
74
|
+
'datapoint': 'background', // Narrative texture — NOT standalone evidence
|
|
75
|
+
'data point': 'background',
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Enrich evidence items with pre-formatted markdown citations and editorial roles.
|
|
79
|
+
* Models are much more likely to pass through a ready-made link than construct one.
|
|
80
|
+
*/
|
|
81
|
+
export function enrichEvidence(items, opts = {}) {
|
|
82
|
+
if (!Array.isArray(items))
|
|
83
|
+
return items;
|
|
84
|
+
// Preserve the API's relevance order by default — evidence items carry no
|
|
85
|
+
// per-item score, so input array order IS the relevance signal. Sorting by
|
|
86
|
+
// recency here discarded it and surfaced newest-but-off-topic items. Opt-in only.
|
|
87
|
+
if (opts.sortByRecency) {
|
|
88
|
+
items.sort((a, b) => {
|
|
89
|
+
const dateA = a.publishedAt ? new Date(a.publishedAt).getTime() : 0;
|
|
90
|
+
const dateB = b.publishedAt ? new Date(b.publishedAt).getTime() : 0;
|
|
91
|
+
return dateB - dateA;
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return items.map(item => {
|
|
95
|
+
// Assign editorial role based on content type — but don't stamp unknown
|
|
96
|
+
// contentTypes as 'proof' (that mislabels everything as standalone evidence).
|
|
97
|
+
const ct = (item.contentType || '').toLowerCase();
|
|
98
|
+
const mappedRole = EVIDENCE_ROLES[ct];
|
|
99
|
+
if (mappedRole)
|
|
100
|
+
item.role = mappedRole;
|
|
101
|
+
if (item.formatted_citation)
|
|
102
|
+
return item; // already enriched
|
|
103
|
+
const title = item.title?.trim();
|
|
104
|
+
const url = item.sourceUrl?.trim();
|
|
105
|
+
// Enhanced citation for quotes with speaker attribution
|
|
106
|
+
if (item.role === 'voice' && item.speakerName) {
|
|
107
|
+
const speaker = item.speakerName;
|
|
108
|
+
const titleSuffix = item.speakerTitle ? `, ${item.speakerTitle}` : '';
|
|
109
|
+
const pub = item.publication || 'Source';
|
|
110
|
+
if (url) {
|
|
111
|
+
item.formatted_citation = `"${title || 'Quote'}" — ${speaker}${titleSuffix} ([${pub}](${url}))`;
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
item.formatted_citation = `"${title || 'Quote'}" — ${speaker}${titleSuffix} (${pub})`;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else if (title && url) {
|
|
118
|
+
item.formatted_citation = `[${title}](${url})`;
|
|
119
|
+
}
|
|
120
|
+
else if (title) {
|
|
121
|
+
item.formatted_citation = `${title} (no link available)`;
|
|
122
|
+
}
|
|
123
|
+
else if (url) {
|
|
124
|
+
item.formatted_citation = `[Source](${url})`;
|
|
125
|
+
}
|
|
126
|
+
return item;
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
// Fodda theme block — visualization branding for graph data
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
const GRAPH_COLOR_OVERRIDES = {
|
|
133
|
+
'sic': '#3672A4',
|
|
134
|
+
'pew': '#3672A4',
|
|
135
|
+
'edelman/tipping-points': '#D4930A',
|
|
136
|
+
'openfda-safety': '#0F9690',
|
|
137
|
+
'wikipedia-pageviews': '#0F9690',
|
|
138
|
+
};
|
|
139
|
+
export function getFoddaTheme(graphId) {
|
|
140
|
+
const PSFK_DOMAIN_GRAPHS = getDomainGraphIds().size > 0
|
|
141
|
+
? getDomainGraphIds()
|
|
142
|
+
: new Set(['retail', 'beauty', 'fashion', 'sports', 'ce-design']); // fallback
|
|
143
|
+
let graphTypeColor;
|
|
144
|
+
if (GRAPH_COLOR_OVERRIDES[graphId]) {
|
|
145
|
+
graphTypeColor = GRAPH_COLOR_OVERRIDES[graphId];
|
|
146
|
+
}
|
|
147
|
+
else if (PSFK_DOMAIN_GRAPHS.has(graphId)) {
|
|
148
|
+
graphTypeColor = '#663399';
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
graphTypeColor = '#1D7A6A'; // expert / community graphs
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
brand: {
|
|
155
|
+
primary: '#663399',
|
|
156
|
+
primaryLight: '#F5F0FF',
|
|
157
|
+
primaryDark: '#4A2470',
|
|
158
|
+
chartAccent: '#7B51B8'
|
|
159
|
+
},
|
|
160
|
+
graphType: graphTypeColor,
|
|
161
|
+
clusters: {
|
|
162
|
+
light: {
|
|
163
|
+
techAI: '#2E6BE5',
|
|
164
|
+
physicalSpaces: '#D97B2B',
|
|
165
|
+
wellnessHealth: '#1D9E75',
|
|
166
|
+
cultureSociety: '#C94F7A',
|
|
167
|
+
sustainability: '#3A8F5C',
|
|
168
|
+
commerceEcon: '#7C6AB5',
|
|
169
|
+
designMaterials: '#D4793C',
|
|
170
|
+
trustGovernance: '#5B7FA4',
|
|
171
|
+
foodIndulgence: '#E06850',
|
|
172
|
+
globalGeo: '#4A90A4'
|
|
173
|
+
},
|
|
174
|
+
dark: {
|
|
175
|
+
techAI: '#5B9AFF',
|
|
176
|
+
physicalSpaces: '#F0A050',
|
|
177
|
+
wellnessHealth: '#3DCFA0',
|
|
178
|
+
cultureSociety: '#F07AA0',
|
|
179
|
+
sustainability: '#5DC080',
|
|
180
|
+
commerceEcon: '#A894E0',
|
|
181
|
+
designMaterials: '#F0A060',
|
|
182
|
+
trustGovernance: '#8CB0D0',
|
|
183
|
+
foodIndulgence: '#FF8B78',
|
|
184
|
+
globalGeo: '#6DBBD0'
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
scales: {
|
|
188
|
+
sequential: ['#F5F0FF', '#DFD1F5', '#C4A7E8', '#A07CD4', '#7B51B8', '#663399', '#4A2470'],
|
|
189
|
+
positive: ['#E8F5EE', '#B3E0C6', '#6DC595', '#3AA76D', '#1D7A4E'],
|
|
190
|
+
negative: ['#FFF0ED', '#FFD1C7', '#F5A08E', '#E06850', '#C23B2B']
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
export function getSupplementalTheme() {
|
|
195
|
+
return {
|
|
196
|
+
brand: {
|
|
197
|
+
primary: '#663399',
|
|
198
|
+
primaryLight: '#F5F0FF',
|
|
199
|
+
primaryDark: '#4A2470',
|
|
200
|
+
chartAccent: '#7B51B8'
|
|
201
|
+
},
|
|
202
|
+
graphType: '#3672A4',
|
|
203
|
+
clusters: {},
|
|
204
|
+
scales: {
|
|
205
|
+
sequential: ['#F5F0FF', '#DFD1F5', '#C4A7E8', '#A07CD4', '#7B51B8', '#663399', '#4A2470'],
|
|
206
|
+
positive: ['#E8F5EE', '#B3E0C6', '#6DC595', '#3AA76D', '#1D7A4E'],
|
|
207
|
+
negative: ['#FFF0ED', '#FFD1C7', '#F5A08E', '#E06850', '#C23B2B']
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=enrichment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrichment.js","sourceRoot":"","sources":["../src/enrichment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Handling — access gating, trial credit exhaustion, and upgrade flows.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from index.ts to reduce monolith size.
|
|
5
|
+
* Contains all 403/402-error classification and trial-to-Base account conversion logic.
|
|
6
|
+
*
|
|
7
|
+
* Supports both legacy shared trial keys (sk_trial_*) and individual trial
|
|
8
|
+
* accounts (planCode 13) which use unique sk_live_ keys but are identified
|
|
9
|
+
* as trials by the backend via response metadata.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Classify API errors for access gating.
|
|
13
|
+
* Now handles both 403 Forbidden (existing) and 402 Payment Required
|
|
14
|
+
* (new individual trial system, planCode 13).
|
|
15
|
+
*/
|
|
16
|
+
export declare function classifyAccessError(err: any): 'forbidden' | 'disabled' | 'credits' | 'legacy_retired' | null;
|
|
17
|
+
/**
|
|
18
|
+
* Build a user-friendly response for 403 errors on supplemental tools.
|
|
19
|
+
* FORBIDDEN → silent skip (return empty data, not an error)
|
|
20
|
+
* GRAPH_DISABLED → mention it so the user knows they opted out
|
|
21
|
+
* CREDITS → trial-aware handling (auto-upgrade or prompt for email)
|
|
22
|
+
*/
|
|
23
|
+
export declare function handleAccessError(err: any, toolName: string): Promise<{
|
|
24
|
+
isError: boolean;
|
|
25
|
+
content: {
|
|
26
|
+
type: 'text';
|
|
27
|
+
text: string;
|
|
28
|
+
}[];
|
|
29
|
+
}>;
|
|
30
|
+
/**
|
|
31
|
+
* Trial-aware credit exhaustion handler for core graph tools.
|
|
32
|
+
*
|
|
33
|
+
* Supports two trial flavours:
|
|
34
|
+
* 1. Legacy shared trial keys — apiKey starts with `sk_trial_`
|
|
35
|
+
* 2. Individual trial accounts — apiKey is `sk_live_` but backend returns
|
|
36
|
+
* planCode 13 / isTrial / TRIAL_EXHAUSTED in the error response.
|
|
37
|
+
*
|
|
38
|
+
* When a trial user hits their limit (25 lifetime queries for individual,
|
|
39
|
+
* 50 per-user for legacy):
|
|
40
|
+
* - If userId (email) is available → attempt auto-upgrade to Base account
|
|
41
|
+
* - If no userId → show upgrade portal link
|
|
42
|
+
* - If not a trial key → standard credit exhaustion message
|
|
43
|
+
* Falls through to generic error handling for non-credit errors.
|
|
44
|
+
*/
|
|
45
|
+
export declare function handleTrialCreditExhaustion(err: any, sessionApiKey: string, sessionUserId: string): Promise<{
|
|
46
|
+
isError: boolean;
|
|
47
|
+
content: {
|
|
48
|
+
type: 'text';
|
|
49
|
+
text: string;
|
|
50
|
+
}[];
|
|
51
|
+
} | null>;
|
|
52
|
+
//# sourceMappingURL=errorHandling.d.ts.map
|
|
@@ -0,0 +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,CAyD5I;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,CAyIjF"}
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Handling — access gating, trial credit exhaustion, and upgrade flows.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from index.ts to reduce monolith size.
|
|
5
|
+
* Contains all 403/402-error classification and trial-to-Base account conversion logic.
|
|
6
|
+
*
|
|
7
|
+
* Supports both legacy shared trial keys (sk_trial_*) and individual trial
|
|
8
|
+
* accounts (planCode 13) which use unique sk_live_ keys but are identified
|
|
9
|
+
* as trials by the backend via response metadata.
|
|
10
|
+
*/
|
|
11
|
+
import axios from 'axios';
|
|
12
|
+
const API_BASE_URL = process.env.FODDA_API_URL || 'https://api.fodda.ai';
|
|
13
|
+
const APP_BASE_URL = process.env.FODDA_APP_URL || 'https://app.fodda.ai';
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Agent Checkout — Stripe session creation for inline credit purchase
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
/**
|
|
18
|
+
* Attempt to create a Stripe Checkout session via the App's agent-session endpoint.
|
|
19
|
+
* Returns the checkout URL on success, or null on failure.
|
|
20
|
+
* Non-blocking: failures fall back to the pricing page URL.
|
|
21
|
+
*/
|
|
22
|
+
async function fetchAgentCheckoutLink(email, source = 'mcp') {
|
|
23
|
+
try {
|
|
24
|
+
const response = await axios.post(`${APP_BASE_URL}/api/account/checkout/agent-session`, { email, source }, { headers: { 'Content-Type': 'application/json' }, timeout: 8000 });
|
|
25
|
+
return response.data?.checkoutUrl || response.data?.url || null;
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
console.warn(`[agent-checkout] Failed to create checkout session: ${err?.message}`);
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Attempt to generate a one-click Stripe setup URL for adding a payment method.
|
|
34
|
+
* Calls the App's setup-url endpoint. Returns the URL on success, or null on failure.
|
|
35
|
+
* Non-blocking: failures fall back to the billing page URL.
|
|
36
|
+
*/
|
|
37
|
+
async function fetchSetupUrl(emailOrAccountId) {
|
|
38
|
+
try {
|
|
39
|
+
const body = emailOrAccountId.includes('@')
|
|
40
|
+
? { email: emailOrAccountId }
|
|
41
|
+
: { accountId: emailOrAccountId };
|
|
42
|
+
const response = await axios.post(`${APP_BASE_URL}/api/account/setup-url`, body, { headers: { 'Content-Type': 'application/json' }, timeout: 8000 });
|
|
43
|
+
return response.data?.setupUrl || null;
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
console.warn(`[setup-url] Failed to generate setup URL: ${err?.message}`);
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// Error classification
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
/**
|
|
54
|
+
* Classify API errors for access gating.
|
|
55
|
+
* Now handles both 403 Forbidden (existing) and 402 Payment Required
|
|
56
|
+
* (new individual trial system, planCode 13).
|
|
57
|
+
*/
|
|
58
|
+
export function classifyAccessError(err) {
|
|
59
|
+
const status = err.response?.status;
|
|
60
|
+
if (status !== 403 && status !== 402)
|
|
61
|
+
return null;
|
|
62
|
+
const code = (err.response?.data?.error?.code || err.response?.data?.code || '').toString().toUpperCase();
|
|
63
|
+
const msg = (err.response?.data?.error?.message || err.response?.data?.error || err.response?.data?.message || err.message || '').toString().toLowerCase();
|
|
64
|
+
// 402 Payment Required is always a credits/limit issue
|
|
65
|
+
if (status === 402)
|
|
66
|
+
return 'credits';
|
|
67
|
+
// 403 sub-classification
|
|
68
|
+
if (code === 'LEGACY_TRIAL_RETIRED')
|
|
69
|
+
return 'legacy_retired';
|
|
70
|
+
if (code === 'GRAPH_DISABLED' || msg.includes('disabled'))
|
|
71
|
+
return 'disabled';
|
|
72
|
+
if (code === 'CREDITS_EXHAUSTED' ||
|
|
73
|
+
code === 'INSUFFICIENT_CREDITS' ||
|
|
74
|
+
code === 'LIMIT_EXCEEDED' ||
|
|
75
|
+
code === 'PLAN_LIMIT_EXCEEDED' ||
|
|
76
|
+
code === 'TRIAL_EXHAUSTED' ||
|
|
77
|
+
msg.includes('credit') ||
|
|
78
|
+
msg.includes('limit reached') ||
|
|
79
|
+
msg.includes('limit exceeded') ||
|
|
80
|
+
msg.includes('trial limit'))
|
|
81
|
+
return 'credits';
|
|
82
|
+
return 'forbidden'; // FORBIDDEN — plan doesn't cover this source
|
|
83
|
+
}
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// Access error response builder
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
/**
|
|
88
|
+
* Build a user-friendly response for 403 errors on supplemental tools.
|
|
89
|
+
* FORBIDDEN → silent skip (return empty data, not an error)
|
|
90
|
+
* GRAPH_DISABLED → mention it so the user knows they opted out
|
|
91
|
+
* CREDITS → trial-aware handling (auto-upgrade or prompt for email)
|
|
92
|
+
*/
|
|
93
|
+
export async function handleAccessError(err, toolName) {
|
|
94
|
+
const accessType = classifyAccessError(err);
|
|
95
|
+
if (accessType === 'forbidden') {
|
|
96
|
+
// Silent skip — return empty result, NOT an error, so the LLM moves on
|
|
97
|
+
return { isError: false, content: [{ type: 'text', text: JSON.stringify({ data: null, note: 'This data source is not included in the user\'s current plan. Skipping.' }) }] };
|
|
98
|
+
}
|
|
99
|
+
if (accessType === 'disabled') {
|
|
100
|
+
return { isError: false, content: [{ type: 'text', text: JSON.stringify({ data: null, note: `This data source is currently disabled in the user's settings. They can re-enable it at https://app.fodda.ai` }) }] };
|
|
101
|
+
}
|
|
102
|
+
if (accessType === 'legacy_retired') {
|
|
103
|
+
const errorMsg = err.response?.data?.error?.message || err.response?.data?.error || err.response?.data?.message
|
|
104
|
+
|| 'Legacy trial keys are no longer supported. Sign up at app.fodda.ai.';
|
|
105
|
+
const signupUrl = err.response?.data?.signupUrl || 'https://app.fodda.ai';
|
|
106
|
+
return { isError: false, content: [{ type: 'text', text: JSON.stringify({ status: 'LEGACY_TRIAL_RETIRED', message: errorMsg, signupUrl }) }] };
|
|
107
|
+
}
|
|
108
|
+
if (accessType === 'credits') {
|
|
109
|
+
const errorData = err.response?.data?.error || err.response?.data || {};
|
|
110
|
+
const msg = errorData.message || 'Query limit reached.';
|
|
111
|
+
const upsell = errorData.upsell || null;
|
|
112
|
+
const usage = err.response?.data?.usage || null;
|
|
113
|
+
const payg = err.response?.data?.payg || null;
|
|
114
|
+
const agentCheckout = err.response?.data?.agent_checkout || null;
|
|
115
|
+
// Try to get an inline checkout link (best-effort, non-blocking)
|
|
116
|
+
let checkoutUrl = agentCheckout?.url || null;
|
|
117
|
+
if (!checkoutUrl) {
|
|
118
|
+
checkoutUrl = await fetchAgentCheckoutLink(null, 'mcp');
|
|
119
|
+
}
|
|
120
|
+
const response = {
|
|
121
|
+
status: 'CREDITS_EXHAUSTED',
|
|
122
|
+
message: checkoutUrl
|
|
123
|
+
? `⚡ You've used all your Fodda credits this cycle.\n\n🛒 **Buy 100 more tokens →** ${checkoutUrl}\n\nThis opens a secure Stripe Checkout page. After payment, your credits will be available immediately.\n\nAlternatively, you can upgrade your plan at https://app.fodda.ai`
|
|
124
|
+
: msg,
|
|
125
|
+
upsell: upsell,
|
|
126
|
+
usage: usage,
|
|
127
|
+
action: checkoutUrl ? 'CHECKOUT_AVAILABLE' : 'UPGRADE_REQUIRED',
|
|
128
|
+
note: 'Present the checkout link prominently. Also mention the upgrade option and PAYG as alternatives.',
|
|
129
|
+
};
|
|
130
|
+
if (checkoutUrl) {
|
|
131
|
+
response.checkout_url = checkoutUrl;
|
|
132
|
+
}
|
|
133
|
+
if (payg) {
|
|
134
|
+
response.payg = payg;
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
isError: true,
|
|
138
|
+
content: [{
|
|
139
|
+
type: 'text',
|
|
140
|
+
text: JSON.stringify(response, null, 2)
|
|
141
|
+
}]
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// Not an access error — fall through to generic handling
|
|
145
|
+
const msg = err.response?.data?.error?.message || err.response?.data?.message || err.message;
|
|
146
|
+
return { isError: true, content: [{ type: 'text', text: JSON.stringify({ error: msg }) }] };
|
|
147
|
+
}
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
// Trial detection helpers
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
/**
|
|
152
|
+
* Build the portal upgrade URL for a trial user.
|
|
153
|
+
* Pre-fills their email so the portal can skip the identification step.
|
|
154
|
+
*/
|
|
155
|
+
function buildPortalUpgradeUrl(email) {
|
|
156
|
+
const base = `${APP_BASE_URL}/portal`;
|
|
157
|
+
const params = new URLSearchParams({ action: 'upgrade' });
|
|
158
|
+
if (email && email.includes('@'))
|
|
159
|
+
params.set('email', email);
|
|
160
|
+
return `${base}?${params.toString()}`;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Determine whether the error response indicates an individual trial account
|
|
164
|
+
* (planCode 13). These keys look like sk_live_ but the backend tags them
|
|
165
|
+
* as trial via response metadata.
|
|
166
|
+
*/
|
|
167
|
+
function isIndividualTrial(err) {
|
|
168
|
+
const data = err.response?.data || {};
|
|
169
|
+
const errorObj = data.error || {};
|
|
170
|
+
// Check planCode in multiple locations the backend might place it
|
|
171
|
+
const planCode = data.planCode ?? data.plan_code ?? errorObj.planCode ?? errorObj.plan_code;
|
|
172
|
+
if (planCode !== undefined && String(planCode) === '13')
|
|
173
|
+
return true;
|
|
174
|
+
// Check explicit boolean flags
|
|
175
|
+
if (data.isTrial === true || data.is_trial === true)
|
|
176
|
+
return true;
|
|
177
|
+
if (errorObj.isTrial === true || errorObj.is_trial === true)
|
|
178
|
+
return true;
|
|
179
|
+
// Check error code
|
|
180
|
+
const code = (errorObj.code || data.code || '').toString().toUpperCase();
|
|
181
|
+
if (code === 'TRIAL_EXHAUSTED')
|
|
182
|
+
return true;
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
// Trial credit exhaustion handler
|
|
187
|
+
// ---------------------------------------------------------------------------
|
|
188
|
+
/**
|
|
189
|
+
* Trial-aware credit exhaustion handler for core graph tools.
|
|
190
|
+
*
|
|
191
|
+
* Supports two trial flavours:
|
|
192
|
+
* 1. Legacy shared trial keys — apiKey starts with `sk_trial_`
|
|
193
|
+
* 2. Individual trial accounts — apiKey is `sk_live_` but backend returns
|
|
194
|
+
* planCode 13 / isTrial / TRIAL_EXHAUSTED in the error response.
|
|
195
|
+
*
|
|
196
|
+
* When a trial user hits their limit (25 lifetime queries for individual,
|
|
197
|
+
* 50 per-user for legacy):
|
|
198
|
+
* - If userId (email) is available → attempt auto-upgrade to Base account
|
|
199
|
+
* - If no userId → show upgrade portal link
|
|
200
|
+
* - If not a trial key → standard credit exhaustion message
|
|
201
|
+
* Falls through to generic error handling for non-credit errors.
|
|
202
|
+
*/
|
|
203
|
+
export async function handleTrialCreditExhaustion(err, sessionApiKey, sessionUserId) {
|
|
204
|
+
const accessType = classifyAccessError(err);
|
|
205
|
+
// ── Legacy trial key retirement — surface API message directly ──
|
|
206
|
+
if (accessType === 'legacy_retired') {
|
|
207
|
+
const errorMsg = err.response?.data?.error?.message || err.response?.data?.error || err.response?.data?.message
|
|
208
|
+
|| 'Legacy trial keys are no longer supported. Sign up for a free Base account at app.fodda.ai to get 100 API calls/month.';
|
|
209
|
+
const signupUrl = err.response?.data?.signupUrl || err.response?.data?.error?.signupUrl || 'https://app.fodda.ai';
|
|
210
|
+
return {
|
|
211
|
+
isError: false,
|
|
212
|
+
content: [{
|
|
213
|
+
type: 'text',
|
|
214
|
+
text: JSON.stringify({
|
|
215
|
+
status: 'LEGACY_TRIAL_RETIRED',
|
|
216
|
+
message: errorMsg,
|
|
217
|
+
signupUrl,
|
|
218
|
+
action: 'VISIT_APP',
|
|
219
|
+
note: 'Present the message to the user exactly as written — it already contains the right context (new account created, existing account found, or signup needed). Include the signupUrl as a clickable link.',
|
|
220
|
+
}, null, 2)
|
|
221
|
+
}]
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
if (accessType !== 'credits')
|
|
225
|
+
return null; // Not a credit error — let caller handle
|
|
226
|
+
// sk_trial_ keys are retired — isLegacyTrial always false.
|
|
227
|
+
// Individual trial accounts (planCode 13) use sk_live_ keys; detected from the error response.
|
|
228
|
+
const isNewTrial = isIndividualTrial(err);
|
|
229
|
+
const isTrial = isNewTrial;
|
|
230
|
+
// Extract usage metadata from the error response (backend may include it)
|
|
231
|
+
const errUsage = err.response?.data?.usage || null;
|
|
232
|
+
const usedCount = errUsage?.used ?? errUsage?.queries_used ?? null;
|
|
233
|
+
const limitCount = errUsage?.limit ?? errUsage?.query_limit ?? (isNewTrial ? 25 : null);
|
|
234
|
+
if (isTrial) {
|
|
235
|
+
const portalUrl = buildPortalUpgradeUrl(sessionUserId && sessionUserId !== 'anonymous' ? sessionUserId : null);
|
|
236
|
+
const usageNote = (usedCount !== null && limitCount !== null)
|
|
237
|
+
? ` (${usedCount}/${limitCount} queries used)`
|
|
238
|
+
: '';
|
|
239
|
+
return {
|
|
240
|
+
isError: false,
|
|
241
|
+
content: [{
|
|
242
|
+
type: 'text',
|
|
243
|
+
text: JSON.stringify({
|
|
244
|
+
status: 'TRIAL_EXHAUSTED',
|
|
245
|
+
message: `Your Fodda trial limit has been reached${usageNote}. Upgrade to the free **Base** plan (100 queries/month upon email verification) or a paid plan to continue using Fodda.\n\n🚀 **[Upgrade Now →](${portalUrl})**`,
|
|
246
|
+
action: 'UPGRADE_REQUIRED',
|
|
247
|
+
upgrade_url: portalUrl,
|
|
248
|
+
note: 'Present the upgrade link prominently. The Base plan is FREE and gives 100 queries/month after email verification.',
|
|
249
|
+
}, null, 2)
|
|
250
|
+
}]
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
// Non-trial credit exhaustion — handles both legacy CREDITS_EXHAUSTED and new PLAN_LIMIT_EXCEEDED
|
|
254
|
+
const errorData = err.response?.data?.error || err.response?.data || {};
|
|
255
|
+
const errCode = (errorData.code || err.response?.data?.code || '').toString().toUpperCase();
|
|
256
|
+
const apiMsg = errorData.message || "You've used all your tokens for this month.";
|
|
257
|
+
const upsell = errorData.upsell || null;
|
|
258
|
+
const usage = err.response?.data?.usage || null;
|
|
259
|
+
const payg = err.response?.data?.payg || null;
|
|
260
|
+
const agentCheckout = err.response?.data?.agent_checkout || null;
|
|
261
|
+
// Resolve email: session userId (if it's an email), or null
|
|
262
|
+
const email = sessionUserId && sessionUserId.includes('@') ? sessionUserId : null;
|
|
263
|
+
// ── PLAN_LIMIT_EXCEEDED — overage billing (no card on file) ──
|
|
264
|
+
// The upstream API returns setupUrl directly; if missing, fetch it ourselves
|
|
265
|
+
if (errCode === 'PLAN_LIMIT_EXCEEDED') {
|
|
266
|
+
let setupUrl = err.response?.data?.setupUrl || errorData.setupUrl || null;
|
|
267
|
+
if (!setupUrl && (email || sessionUserId)) {
|
|
268
|
+
setupUrl = await fetchSetupUrl(email || sessionUserId);
|
|
269
|
+
}
|
|
270
|
+
const upgradeUrl = `${APP_BASE_URL}?view=billing`;
|
|
271
|
+
const response = {
|
|
272
|
+
status: 'PLAN_LIMIT_EXCEEDED',
|
|
273
|
+
code: 'PLAN_LIMIT_EXCEEDED',
|
|
274
|
+
message: setupUrl
|
|
275
|
+
? `⚡ Monthly API call limit exceeded. Add a payment method to continue at $0.20/token.\n\n💳 **[Add payment method →](${setupUrl})**\n\nThis is a one-click Stripe link to add a card. After adding, queries resume immediately with overage billing.\n\nOr manage your billing at ${upgradeUrl}`
|
|
276
|
+
: `⚡ Monthly API call limit exceeded. Add a payment method to continue at $0.20/token.\n\nManage your billing at ${upgradeUrl}`,
|
|
277
|
+
action: setupUrl ? 'ADD_PAYMENT_METHOD' : 'VISIT_BILLING',
|
|
278
|
+
note: 'Present the setupUrl prominently — it is a one-click card addition link. The upgradeUrl lets them manage billing.',
|
|
279
|
+
};
|
|
280
|
+
if (setupUrl)
|
|
281
|
+
response.setupUrl = setupUrl;
|
|
282
|
+
response.upgradeUrl = upgradeUrl;
|
|
283
|
+
if (usage)
|
|
284
|
+
response.usage = usage;
|
|
285
|
+
return {
|
|
286
|
+
isError: true,
|
|
287
|
+
content: [{
|
|
288
|
+
type: 'text',
|
|
289
|
+
text: JSON.stringify(response, null, 2)
|
|
290
|
+
}]
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
// ── Legacy credit exhaustion — checkout link + upsell (Base users) ──
|
|
294
|
+
// Try to get an inline checkout link (best-effort, non-blocking)
|
|
295
|
+
let checkoutUrl = agentCheckout?.url || null;
|
|
296
|
+
if (!checkoutUrl) {
|
|
297
|
+
checkoutUrl = await fetchAgentCheckoutLink(email, 'mcp');
|
|
298
|
+
}
|
|
299
|
+
const portalUrl = buildPortalUpgradeUrl(email);
|
|
300
|
+
const response = {
|
|
301
|
+
status: 'CREDITS_EXHAUSTED',
|
|
302
|
+
message: checkoutUrl
|
|
303
|
+
? `⚡ You've used all your Fodda credits this cycle.\n\n🛒 **Buy 100 more tokens →** ${checkoutUrl}\n\nThis opens a secure Stripe Checkout page. After payment, your credits will be available immediately.\n\nAlternatively, you can upgrade your plan at ${portalUrl}`
|
|
304
|
+
: apiMsg,
|
|
305
|
+
upsell: upsell,
|
|
306
|
+
usage: usage,
|
|
307
|
+
action: checkoutUrl ? 'CHECKOUT_AVAILABLE' : 'VISIT_APP',
|
|
308
|
+
manage_url: portalUrl,
|
|
309
|
+
};
|
|
310
|
+
if (checkoutUrl) {
|
|
311
|
+
response.checkout_url = checkoutUrl;
|
|
312
|
+
if (!email) {
|
|
313
|
+
response.checkout_note = "You'll be asked for your email during checkout.";
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (payg) {
|
|
317
|
+
response.payg = payg;
|
|
318
|
+
}
|
|
319
|
+
return {
|
|
320
|
+
isError: false,
|
|
321
|
+
content: [{
|
|
322
|
+
type: 'text',
|
|
323
|
+
text: JSON.stringify(response, null, 2)
|
|
324
|
+
}]
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=errorHandling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandling.js","sourceRoot":"","sources":["../src/errorHandling.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED