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.
Files changed (106) hide show
  1. package/LICENSE +31 -0
  2. package/README.md +176 -18
  3. package/dist/a2aHandler.d.ts +20 -0
  4. package/dist/a2aHandler.d.ts.map +1 -0
  5. package/dist/a2aHandler.js +247 -0
  6. package/dist/a2aHandler.js.map +1 -0
  7. package/dist/agents/fodda-researcher/index.d.ts +35 -0
  8. package/dist/agents/fodda-researcher/index.d.ts.map +1 -0
  9. package/dist/agents/fodda-researcher/index.js +62 -0
  10. package/dist/agents/fodda-researcher/index.js.map +1 -0
  11. package/dist/agents/fodda-researcher/skills.d.ts +16 -0
  12. package/dist/agents/fodda-researcher/skills.d.ts.map +1 -0
  13. package/dist/agents/fodda-researcher/skills.js +163 -0
  14. package/dist/agents/fodda-researcher/skills.js.map +1 -0
  15. package/dist/brandTemplate.d.ts +14 -0
  16. package/dist/brandTemplate.d.ts.map +1 -0
  17. package/dist/brandTemplate.js +742 -0
  18. package/dist/brandTemplate.js.map +1 -0
  19. package/dist/catalogCache.d.ts +177 -0
  20. package/dist/catalogCache.d.ts.map +1 -0
  21. package/dist/catalogCache.js +708 -0
  22. package/dist/catalogCache.js.map +1 -0
  23. package/dist/editorialFill.d.ts +44 -0
  24. package/dist/editorialFill.d.ts.map +1 -0
  25. package/dist/editorialFill.js +377 -0
  26. package/dist/editorialFill.js.map +1 -0
  27. package/dist/enrichment.d.ts +74 -0
  28. package/dist/enrichment.d.ts.map +1 -0
  29. package/dist/enrichment.js +211 -0
  30. package/dist/enrichment.js.map +1 -0
  31. package/dist/errorHandling.d.ts +52 -0
  32. package/dist/errorHandling.d.ts.map +1 -0
  33. package/dist/errorHandling.js +327 -0
  34. package/dist/errorHandling.js.map +1 -0
  35. package/dist/index.d.ts +0 -1
  36. package/dist/index.js +595 -581
  37. package/dist/index.js.map +1 -1
  38. package/dist/pricingCache.d.ts +99 -0
  39. package/dist/pricingCache.d.ts.map +1 -0
  40. package/dist/pricingCache.js +414 -0
  41. package/dist/pricingCache.js.map +1 -0
  42. package/dist/queryCache.d.ts +25 -0
  43. package/dist/queryCache.d.ts.map +1 -0
  44. package/dist/queryCache.js +194 -0
  45. package/dist/queryCache.js.map +1 -0
  46. package/dist/searchTemplate.d.ts +16 -0
  47. package/dist/searchTemplate.d.ts.map +1 -0
  48. package/dist/searchTemplate.js +318 -0
  49. package/dist/searchTemplate.js.map +1 -0
  50. package/dist/sessionTracker.d.ts +39 -0
  51. package/dist/sessionTracker.d.ts.map +1 -0
  52. package/dist/sessionTracker.js +187 -0
  53. package/dist/sessionTracker.js.map +1 -0
  54. package/dist/skillClient.d.ts +142 -0
  55. package/dist/skillClient.d.ts.map +1 -0
  56. package/dist/skillClient.js +256 -0
  57. package/dist/skillClient.js.map +1 -0
  58. package/dist/svgVisuals.d.ts +77 -0
  59. package/dist/svgVisuals.d.ts.map +1 -0
  60. package/dist/svgVisuals.js +323 -0
  61. package/dist/svgVisuals.js.map +1 -0
  62. package/dist/systemPrompt.d.ts +26 -0
  63. package/dist/systemPrompt.d.ts.map +1 -0
  64. package/dist/systemPrompt.js +546 -0
  65. package/dist/systemPrompt.js.map +1 -0
  66. package/dist/test-waverunner-response.d.ts +2 -0
  67. package/dist/test-waverunner-response.d.ts.map +1 -0
  68. package/dist/test-waverunner-response.js +20 -0
  69. package/dist/test-waverunner-response.js.map +1 -0
  70. package/dist/test_analyst.d.ts +2 -0
  71. package/dist/test_analyst.d.ts.map +1 -0
  72. package/dist/test_analyst.js +39 -0
  73. package/dist/test_analyst.js.map +1 -0
  74. package/dist/test_analyst_local.d.ts +2 -0
  75. package/dist/test_analyst_local.d.ts.map +1 -0
  76. package/dist/test_analyst_local.js +51 -0
  77. package/dist/test_analyst_local.js.map +1 -0
  78. package/dist/test_live_mcp.js +1 -1
  79. package/dist/test_skills.d.ts +9 -0
  80. package/dist/test_skills.d.ts.map +1 -0
  81. package/dist/test_skills.js +267 -0
  82. package/dist/test_skills.js.map +1 -0
  83. package/dist/toolHandlers.d.ts +11 -0
  84. package/dist/toolHandlers.d.ts.map +1 -0
  85. package/dist/toolHandlers.js +2829 -0
  86. package/dist/toolHandlers.js.map +1 -0
  87. package/dist/tools.d.ts +78 -3
  88. package/dist/tools.d.ts.map +1 -1
  89. package/dist/tools.js +85 -292
  90. package/dist/tools.js.map +1 -1
  91. package/dist/trialTracker.d.ts +58 -0
  92. package/dist/trialTracker.d.ts.map +1 -0
  93. package/dist/trialTracker.js +179 -0
  94. package/dist/trialTracker.js.map +1 -0
  95. package/dist/types.d.ts +1 -0
  96. package/dist/types.d.ts.map +1 -1
  97. package/dist/verify_hmac.js +1 -1
  98. package/dist/verify_hmac.js.map +1 -1
  99. package/dist/verify_tools_endpoint.js +5 -5
  100. package/dist/verify_tools_endpoint.js.map +1 -1
  101. package/dist/widgetShell.d.ts +15 -0
  102. package/dist/widgetShell.d.ts.map +1 -0
  103. package/dist/widgetShell.js +151 -0
  104. package/dist/widgetShell.js.map +1 -0
  105. package/package.json +8 -4
  106. 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
@@ -1,3 +1,2 @@
1
- #!/usr/bin/env node
2
1
  export {};
3
2
  //# sourceMappingURL=index.d.ts.map