fodda-mcp 1.46.31 → 1.46.97

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 (289) hide show
  1. package/README.md +14 -94
  2. package/dist/agents/fodda-researcher/skills.d.ts +1 -1
  3. package/dist/agents/fodda-researcher/skills.d.ts.map +1 -1
  4. package/dist/agents/fodda-researcher/skills.js +1 -1
  5. package/dist/brandTemplate.d.ts +1 -1
  6. package/dist/brandTemplate.d.ts.map +1 -1
  7. package/dist/brandTemplate.js +162 -74
  8. package/dist/brandTemplate.js.map +1 -1
  9. package/dist/catalogCache.d.ts +29 -1
  10. package/dist/catalogCache.d.ts.map +1 -1
  11. package/dist/catalogCache.js +267 -16
  12. package/dist/catalogCache.js.map +1 -1
  13. package/dist/coverageRelevance.d.ts +97 -2
  14. package/dist/coverageRelevance.d.ts.map +1 -1
  15. package/dist/coverageRelevance.js +959 -164
  16. package/dist/coverageRelevance.js.map +1 -1
  17. package/dist/editorialFill.d.ts +5 -0
  18. package/dist/editorialFill.d.ts.map +1 -1
  19. package/dist/editorialFill.js +1 -1
  20. package/dist/editorialFill.js.map +1 -1
  21. package/dist/enrichment.d.ts +26 -0
  22. package/dist/enrichment.d.ts.map +1 -1
  23. package/dist/enrichment.js +394 -31
  24. package/dist/enrichment.js.map +1 -1
  25. package/dist/errorHandling.d.ts +35 -7
  26. package/dist/errorHandling.d.ts.map +1 -1
  27. package/dist/errorHandling.js +225 -155
  28. package/dist/errorHandling.js.map +1 -1
  29. package/dist/index.d.ts +25 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +351 -143
  32. package/dist/index.js.map +1 -1
  33. package/dist/jobs/jlens_quarterly_sweep.d.ts +62 -0
  34. package/dist/jobs/jlens_quarterly_sweep.d.ts.map +1 -0
  35. package/dist/jobs/jlens_quarterly_sweep.js +160 -0
  36. package/dist/jobs/jlens_quarterly_sweep.js.map +1 -0
  37. package/dist/pricingCache.d.ts.map +1 -1
  38. package/dist/pricingCache.js +41 -1
  39. package/dist/pricingCache.js.map +1 -1
  40. package/dist/queryCache.d.ts.map +1 -1
  41. package/dist/queryCache.js +2 -0
  42. package/dist/queryCache.js.map +1 -1
  43. package/dist/reportBriefing.d.ts +89 -0
  44. package/dist/reportBriefing.d.ts.map +1 -0
  45. package/dist/reportBriefing.js +662 -0
  46. package/dist/reportBriefing.js.map +1 -0
  47. package/dist/searchTemplate.d.ts.map +1 -1
  48. package/dist/searchTemplate.js +65 -53
  49. package/dist/searchTemplate.js.map +1 -1
  50. package/dist/services/graphRouter.d.ts +7 -0
  51. package/dist/services/graphRouter.d.ts.map +1 -0
  52. package/dist/services/graphRouter.js +7 -0
  53. package/dist/services/graphRouter.js.map +1 -0
  54. package/dist/services/notifications.d.ts +49 -0
  55. package/dist/services/notifications.d.ts.map +1 -0
  56. package/dist/services/notifications.js +206 -0
  57. package/dist/services/notifications.js.map +1 -0
  58. package/dist/sessionTracker.d.ts +19 -2
  59. package/dist/sessionTracker.d.ts.map +1 -1
  60. package/dist/sessionTracker.js +69 -16
  61. package/dist/sessionTracker.js.map +1 -1
  62. package/dist/skillClient.d.ts.map +1 -1
  63. package/dist/skillClient.js +11 -6
  64. package/dist/skillClient.js.map +1 -1
  65. package/dist/svgVisuals.d.ts +17 -19
  66. package/dist/svgVisuals.d.ts.map +1 -1
  67. package/dist/svgVisuals.js +189 -233
  68. package/dist/svgVisuals.js.map +1 -1
  69. package/dist/systemPrompt.d.ts +7 -2
  70. package/dist/systemPrompt.d.ts.map +1 -1
  71. package/dist/systemPrompt.js +110 -68
  72. package/dist/systemPrompt.js.map +1 -1
  73. package/dist/telemetry.d.ts.map +1 -1
  74. package/dist/telemetry.js +15 -0
  75. package/dist/telemetry.js.map +1 -1
  76. package/dist/test_adjacent_trends_polymorphic.d.ts +2 -0
  77. package/dist/test_adjacent_trends_polymorphic.d.ts.map +1 -0
  78. package/dist/test_adjacent_trends_polymorphic.js +154 -0
  79. package/dist/test_adjacent_trends_polymorphic.js.map +1 -0
  80. package/dist/test_book_a_call_live.js +18 -5
  81. package/dist/test_book_a_call_live.js.map +1 -1
  82. package/dist/test_byo_mcp_submission_clarity.d.ts +2 -0
  83. package/dist/test_byo_mcp_submission_clarity.d.ts.map +1 -0
  84. package/dist/test_byo_mcp_submission_clarity.js +142 -0
  85. package/dist/test_byo_mcp_submission_clarity.js.map +1 -0
  86. package/dist/test_capabilities_guidance.d.ts +2 -0
  87. package/dist/test_capabilities_guidance.d.ts.map +1 -0
  88. package/dist/test_capabilities_guidance.js +372 -0
  89. package/dist/test_capabilities_guidance.js.map +1 -0
  90. package/dist/test_client_provenance.d.ts +2 -0
  91. package/dist/test_client_provenance.d.ts.map +1 -0
  92. package/dist/test_client_provenance.js +77 -0
  93. package/dist/test_client_provenance.js.map +1 -0
  94. package/dist/test_connection_surface_cleanup.d.ts +2 -0
  95. package/dist/test_connection_surface_cleanup.d.ts.map +1 -0
  96. package/dist/test_connection_surface_cleanup.js +203 -0
  97. package/dist/test_connection_surface_cleanup.js.map +1 -0
  98. package/dist/test_consult_routing.d.ts +2 -0
  99. package/dist/test_consult_routing.d.ts.map +1 -0
  100. package/dist/test_consult_routing.js +86 -0
  101. package/dist/test_consult_routing.js.map +1 -0
  102. package/dist/test_consult_split.d.ts +2 -0
  103. package/dist/test_consult_split.d.ts.map +1 -0
  104. package/dist/test_consult_split.js +30 -0
  105. package/dist/test_consult_split.js.map +1 -0
  106. package/dist/test_coverage_relevance.js +111 -70
  107. package/dist/test_coverage_relevance.js.map +1 -1
  108. package/dist/test_coverage_replay.d.ts +2 -0
  109. package/dist/test_coverage_replay.d.ts.map +1 -0
  110. package/dist/test_coverage_replay.js +170 -0
  111. package/dist/test_coverage_replay.js.map +1 -0
  112. package/dist/test_dcr_and_legacy_deprecation.js +45 -50
  113. package/dist/test_dcr_and_legacy_deprecation.js.map +1 -1
  114. package/dist/test_demand_signal_logging.d.ts +2 -0
  115. package/dist/test_demand_signal_logging.d.ts.map +1 -0
  116. package/dist/test_demand_signal_logging.js +92 -0
  117. package/dist/test_demand_signal_logging.js.map +1 -0
  118. package/dist/test_earnings_activity_scope.d.ts +5 -0
  119. package/dist/test_earnings_activity_scope.d.ts.map +1 -0
  120. package/dist/test_earnings_activity_scope.js +101 -0
  121. package/dist/test_earnings_activity_scope.js.map +1 -0
  122. package/dist/test_earnings_divergence_live.d.ts +5 -0
  123. package/dist/test_earnings_divergence_live.d.ts.map +1 -0
  124. package/dist/test_earnings_divergence_live.js +135 -0
  125. package/dist/test_earnings_divergence_live.js.map +1 -0
  126. package/dist/test_earnings_hygiene_and_binding.d.ts +5 -0
  127. package/dist/test_earnings_hygiene_and_binding.d.ts.map +1 -0
  128. package/dist/test_earnings_hygiene_and_binding.js +104 -0
  129. package/dist/test_earnings_hygiene_and_binding.js.map +1 -0
  130. package/dist/test_exec_quotes_render.d.ts +2 -0
  131. package/dist/test_exec_quotes_render.d.ts.map +1 -0
  132. package/dist/test_exec_quotes_render.js +86 -0
  133. package/dist/test_exec_quotes_render.js.map +1 -0
  134. package/dist/test_expert_intro.d.ts +2 -0
  135. package/dist/test_expert_intro.d.ts.map +1 -0
  136. package/dist/test_expert_intro.js +57 -0
  137. package/dist/test_expert_intro.js.map +1 -0
  138. package/dist/test_expert_layer.d.ts +11 -0
  139. package/dist/test_expert_layer.d.ts.map +1 -0
  140. package/dist/test_expert_layer.js +356 -0
  141. package/dist/test_expert_layer.js.map +1 -0
  142. package/dist/test_gap_alert.js +8 -0
  143. package/dist/test_gap_alert.js.map +1 -1
  144. package/dist/test_grok_offering_surfaces.d.ts +2 -0
  145. package/dist/test_grok_offering_surfaces.d.ts.map +1 -0
  146. package/dist/test_grok_offering_surfaces.js +155 -0
  147. package/dist/test_grok_offering_surfaces.js.map +1 -0
  148. package/dist/test_human_agent_live.d.ts +2 -0
  149. package/dist/test_human_agent_live.d.ts.map +1 -0
  150. package/dist/test_human_agent_live.js +48 -0
  151. package/dist/test_human_agent_live.js.map +1 -0
  152. package/dist/test_identity_gap.d.ts +2 -0
  153. package/dist/test_identity_gap.d.ts.map +1 -0
  154. package/dist/test_identity_gap.js +171 -0
  155. package/dist/test_identity_gap.js.map +1 -0
  156. package/dist/test_intelligence_and_verifier.d.ts +17 -0
  157. package/dist/test_intelligence_and_verifier.d.ts.map +1 -0
  158. package/dist/test_intelligence_and_verifier.js +162 -0
  159. package/dist/test_intelligence_and_verifier.js.map +1 -0
  160. package/dist/test_latency_mcp_brief5.d.ts +12 -0
  161. package/dist/test_latency_mcp_brief5.d.ts.map +1 -0
  162. package/dist/test_latency_mcp_brief5.js +200 -0
  163. package/dist/test_latency_mcp_brief5.js.map +1 -0
  164. package/dist/test_limit_and_credit_card_capture.d.ts +21 -0
  165. package/dist/test_limit_and_credit_card_capture.d.ts.map +1 -0
  166. package/dist/test_limit_and_credit_card_capture.js +216 -0
  167. package/dist/test_limit_and_credit_card_capture.js.map +1 -0
  168. package/dist/test_list_graphs_topics.js +1 -1
  169. package/dist/test_list_graphs_topics.js.map +1 -1
  170. package/dist/test_live_deployed_mcp_search.d.ts +2 -0
  171. package/dist/test_live_deployed_mcp_search.d.ts.map +1 -0
  172. package/dist/test_live_deployed_mcp_search.js +85 -0
  173. package/dist/test_live_deployed_mcp_search.js.map +1 -0
  174. package/dist/test_live_deployed_split.d.ts +2 -0
  175. package/dist/test_live_deployed_split.d.ts.map +1 -0
  176. package/dist/test_live_deployed_split.js +72 -0
  177. package/dist/test_live_deployed_split.js.map +1 -0
  178. package/dist/test_live_endpoint_runner.js +2 -2
  179. package/dist/test_live_endpoint_runner.js.map +1 -1
  180. package/dist/test_live_mcp.js +1 -1
  181. package/dist/test_live_mcp.js.map +1 -1
  182. package/dist/test_live_neil_widget.d.ts +2 -0
  183. package/dist/test_live_neil_widget.d.ts.map +1 -0
  184. package/dist/test_live_neil_widget.js +84 -0
  185. package/dist/test_live_neil_widget.js.map +1 -0
  186. package/dist/test_longpoll_status.d.ts +2 -0
  187. package/dist/test_longpoll_status.d.ts.map +1 -0
  188. package/dist/test_longpoll_status.js +117 -0
  189. package/dist/test_longpoll_status.js.map +1 -0
  190. package/dist/test_mcp_find_expert_and_vocabulary_routing.d.ts +2 -0
  191. package/dist/test_mcp_find_expert_and_vocabulary_routing.d.ts.map +1 -0
  192. package/dist/test_mcp_find_expert_and_vocabulary_routing.js +130 -0
  193. package/dist/test_mcp_find_expert_and_vocabulary_routing.js.map +1 -0
  194. package/dist/test_next_moves.js +644 -279
  195. package/dist/test_next_moves.js.map +1 -1
  196. package/dist/test_next_moves_transcripts.js +122 -40
  197. package/dist/test_next_moves_transcripts.js.map +1 -1
  198. package/dist/test_on_request_caller_identity.d.ts +13 -0
  199. package/dist/test_on_request_caller_identity.d.ts.map +1 -0
  200. package/dist/test_on_request_caller_identity.js +131 -0
  201. package/dist/test_on_request_caller_identity.js.map +1 -0
  202. package/dist/test_on_request_intercept.d.ts +10 -0
  203. package/dist/test_on_request_intercept.d.ts.map +1 -0
  204. package/dist/test_on_request_intercept.js +95 -0
  205. package/dist/test_on_request_intercept.js.map +1 -0
  206. package/dist/test_onboarding_consent_and_errors.d.ts +2 -0
  207. package/dist/test_onboarding_consent_and_errors.d.ts.map +1 -0
  208. package/dist/test_onboarding_consent_and_errors.js +110 -0
  209. package/dist/test_onboarding_consent_and_errors.js.map +1 -0
  210. package/dist/test_onboarding_live_scenarios.d.ts +2 -0
  211. package/dist/test_onboarding_live_scenarios.d.ts.map +1 -0
  212. package/dist/test_onboarding_live_scenarios.js +189 -0
  213. package/dist/test_onboarding_live_scenarios.js.map +1 -0
  214. package/dist/test_referral_live.d.ts +2 -0
  215. package/dist/test_referral_live.d.ts.map +1 -0
  216. package/dist/test_referral_live.js +33 -0
  217. package/dist/test_referral_live.js.map +1 -0
  218. package/dist/test_referral_piers.d.ts +2 -0
  219. package/dist/test_referral_piers.d.ts.map +1 -0
  220. package/dist/test_referral_piers.js +33 -0
  221. package/dist/test_referral_piers.js.map +1 -0
  222. package/dist/test_report_editorial_briefing.d.ts +21 -0
  223. package/dist/test_report_editorial_briefing.d.ts.map +1 -0
  224. package/dist/test_report_editorial_briefing.js +356 -0
  225. package/dist/test_report_editorial_briefing.js.map +1 -0
  226. package/dist/test_search_graph_quality.d.ts +2 -0
  227. package/dist/test_search_graph_quality.d.ts.map +1 -0
  228. package/dist/test_search_graph_quality.js +493 -0
  229. package/dist/test_search_graph_quality.js.map +1 -0
  230. package/dist/test_service_to_service_auth.d.ts +2 -0
  231. package/dist/test_service_to_service_auth.d.ts.map +1 -0
  232. package/dist/test_service_to_service_auth.js +199 -0
  233. package/dist/test_service_to_service_auth.js.map +1 -0
  234. package/dist/test_sources_live.d.ts +2 -0
  235. package/dist/test_sources_live.d.ts.map +1 -0
  236. package/dist/test_sources_live.js +30 -0
  237. package/dist/test_sources_live.js.map +1 -0
  238. package/dist/test_specialist_and_analyst_tiers.d.ts +2 -0
  239. package/dist/test_specialist_and_analyst_tiers.d.ts.map +1 -0
  240. package/dist/test_specialist_and_analyst_tiers.js +155 -0
  241. package/dist/test_specialist_and_analyst_tiers.js.map +1 -0
  242. package/dist/test_v2_2_visual_hardening.d.ts +5 -0
  243. package/dist/test_v2_2_visual_hardening.d.ts.map +1 -0
  244. package/dist/test_v2_2_visual_hardening.js +333 -0
  245. package/dist/test_v2_2_visual_hardening.js.map +1 -0
  246. package/dist/test_verify_deprecate_render_spec.d.ts +2 -0
  247. package/dist/test_verify_deprecate_render_spec.d.ts.map +1 -0
  248. package/dist/test_verify_deprecate_render_spec.js +217 -0
  249. package/dist/test_verify_deprecate_render_spec.js.map +1 -0
  250. package/dist/test_verify_neil_demo.d.ts +2 -0
  251. package/dist/test_verify_neil_demo.d.ts.map +1 -0
  252. package/dist/test_verify_neil_demo.js +149 -0
  253. package/dist/test_verify_neil_demo.js.map +1 -0
  254. package/dist/test_waitable_research_and_grounded_links.d.ts +2 -0
  255. package/dist/test_waitable_research_and_grounded_links.d.ts.map +1 -0
  256. package/dist/test_waitable_research_and_grounded_links.js +129 -0
  257. package/dist/test_waitable_research_and_grounded_links.js.map +1 -0
  258. package/dist/test_widget_guards.d.ts +2 -0
  259. package/dist/test_widget_guards.d.ts.map +1 -0
  260. package/dist/test_widget_guards.js +229 -0
  261. package/dist/test_widget_guards.js.map +1 -0
  262. package/dist/test_zero_retention_alerts.d.ts +14 -0
  263. package/dist/test_zero_retention_alerts.d.ts.map +1 -0
  264. package/dist/test_zero_retention_alerts.js +76 -0
  265. package/dist/test_zero_retention_alerts.js.map +1 -0
  266. package/dist/toolHandlers.d.ts +38 -1
  267. package/dist/toolHandlers.d.ts.map +1 -1
  268. package/dist/toolHandlers.js +3856 -938
  269. package/dist/toolHandlers.js.map +1 -1
  270. package/dist/tools.d.ts +20 -0
  271. package/dist/tools.d.ts.map +1 -1
  272. package/dist/tools.js +25 -4
  273. package/dist/tools.js.map +1 -1
  274. package/dist/verify_discoverability.d.ts +2 -0
  275. package/dist/verify_discoverability.d.ts.map +1 -0
  276. package/dist/verify_discoverability.js +53 -0
  277. package/dist/verify_discoverability.js.map +1 -0
  278. package/dist/verify_tools_endpoint.js +16 -3
  279. package/dist/verify_tools_endpoint.js.map +1 -1
  280. package/dist/widgetShell.d.ts +2 -2
  281. package/dist/widgetShell.d.ts.map +1 -1
  282. package/dist/widgetShell.js +1 -1
  283. package/dist/widgetShell.js.map +1 -1
  284. package/package.json +1 -1
  285. package/server.json +4 -32
  286. package/dist/oauthRegisterShim.d.ts +0 -13
  287. package/dist/oauthRegisterShim.d.ts.map +0 -1
  288. package/dist/oauthRegisterShim.js +0 -83
  289. package/dist/oauthRegisterShim.js.map +0 -1
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Test suite for Zero Retention Alert Suppression and Query Privacy.
3
+ *
4
+ * Verifies:
5
+ * 1. buildGapAlertText redacts raw query to '[zero-retention contract]' when zeroQueryRetention is true.
6
+ * 2. buildFrustrationAlertText redacts queries to '[zero-retention contract]' when zeroQueryRetention is true.
7
+ * 3. Standard unflagged accounts continue to emit original query strings.
8
+ * 4. createSessionTracker tracks and updates zeroQueryRetention state correctly.
9
+ * 5. get_my_account status mapping logic surfaces queryRetention correctly.
10
+ *
11
+ * Run: node dist/test_zero_retention_alerts.js
12
+ */
13
+ import { createSessionTracker, buildGapAlertText, buildFrustrationAlertText, } from './sessionTracker.js';
14
+ delete process.env.SLACK_BOT_TOKEN; // prevent accidental live posts
15
+ let failures = 0;
16
+ function check(label, actual, expected) {
17
+ const pass = JSON.stringify(actual) === JSON.stringify(expected);
18
+ if (!pass)
19
+ failures++;
20
+ console.log(`${pass ? 'PASS' : 'FAIL'} ${label} (got ${JSON.stringify(actual)}, want ${JSON.stringify(expected)})`);
21
+ }
22
+ console.log('--- TEST: Data Gap Alert Suppression ---');
23
+ const thinCoverage = { status: 'thin', results_returned: 5, results_on_topic: 1, layers_searched: ['retail', 'technology'] };
24
+ // Standard account data gap
25
+ const standardGapText = buildGapAlertText('user@enterprise.com', 'search_graph', 'Internal M&A Strategy 2026', thinCoverage, false);
26
+ check('Standard gap alert includes raw query', standardGapText.includes('"Internal M&A Strategy 2026"'), true);
27
+ check('Standard gap alert does not have redacted placeholder', standardGapText.includes('[zero-retention contract]'), false);
28
+ // Zero retention account data gap
29
+ const zeroGapText = buildGapAlertText('user@enterprise.com', 'search_graph', 'Internal M&A Strategy 2026', thinCoverage, true);
30
+ check('Zero retention gap alert has redacted placeholder', zeroGapText.includes('🔎 Query: [zero-retention contract]'), true);
31
+ check('Zero retention gap alert omits raw query text', zeroGapText.includes('Internal M&A Strategy 2026'), false);
32
+ check('Zero retention gap alert preserves coverage metrics', zeroGapText.includes('thin — 1 of 5 results on-topic'), true);
33
+ check('Zero retention gap alert preserves searched layers', zeroGapText.includes('retail, technology'), true);
34
+ console.log('\n--- TEST: Frustration Alert Suppression ---');
35
+ const frustrationDetails = {
36
+ pattern: 'LOW_YIELD',
37
+ graphsTried: ['retail', 'finance'],
38
+ recentQueries: ['secret initiative project titan', 'titan roadmap Q3'],
39
+ score: 2,
40
+ };
41
+ // Standard frustration alert
42
+ const standardFrustrationText = buildFrustrationAlertText('user@enterprise.com', frustrationDetails, false);
43
+ check('Standard frustration alert includes queries', standardFrustrationText.includes('secret initiative project titan, titan roadmap Q3'), true);
44
+ check('Standard frustration alert does not have redacted placeholder', standardFrustrationText.includes('[zero-retention contract]'), false);
45
+ // Zero retention frustration alert
46
+ const zeroFrustrationText = buildFrustrationAlertText('user@enterprise.com', frustrationDetails, true);
47
+ check('Zero retention frustration alert has redacted placeholder', zeroFrustrationText.includes('🔎 Queries: [zero-retention contract]'), true);
48
+ check('Zero retention frustration alert omits raw queries', zeroFrustrationText.includes('secret initiative project titan'), false);
49
+ check('Zero retention frustration alert preserves pattern', zeroFrustrationText.includes('🔍 Pattern: LOW_YIELD'), true);
50
+ check('Zero retention frustration alert preserves graphs tried', zeroFrustrationText.includes('📊 Graphs tried: retail, finance'), true);
51
+ check('Zero retention frustration alert preserves score', zeroFrustrationText.includes('📈 Frustration score: 2/3'), true);
52
+ console.log('\n--- TEST: SessionTracker State Management ---');
53
+ const defaultTracker = createSessionTracker();
54
+ check('Default tracker zeroQueryRetention is false', defaultTracker.isZeroQueryRetention(), false);
55
+ const flaggedTracker = createSessionTracker({ zeroQueryRetention: true });
56
+ check('Flagged tracker zeroQueryRetention is true', flaggedTracker.isZeroQueryRetention(), true);
57
+ defaultTracker.setZeroQueryRetention(true);
58
+ check('Dynamically updated tracker zeroQueryRetention is true', defaultTracker.isZeroQueryRetention(), true);
59
+ console.log('\n--- TEST: get_my_account queryRetention Resolution ---');
60
+ function resolveQueryRetention(account) {
61
+ const isZero = Boolean(account?.zero_query_retention ||
62
+ account?.zeroQueryRetention ||
63
+ account?.query_retention === 'zero (contract)' ||
64
+ (typeof account?.query_retention === 'string' && account.query_retention.startsWith('zero')) ||
65
+ account?.queryRetention === 'zero (contract)' ||
66
+ (typeof account?.queryRetention === 'string' && account.queryRetention.startsWith('zero')));
67
+ return account?.query_retention || (isZero ? 'zero (contract)' : 'standard');
68
+ }
69
+ check('Standard account without flags resolves to standard', resolveQueryRetention({ plan: 'Pro' }), 'standard');
70
+ check('Explicit query_retention: "standard" resolves to standard', resolveQueryRetention({ query_retention: 'standard' }), 'standard');
71
+ check('Account with zero_query_retention: true resolves to zero (contract)', resolveQueryRetention({ zero_query_retention: true }), 'zero (contract)');
72
+ check('Account with zeroQueryRetention: true resolves to zero (contract)', resolveQueryRetention({ zeroQueryRetention: true }), 'zero (contract)');
73
+ check('Account with query_retention: "zero (contract)" resolves to zero (contract)', resolveQueryRetention({ query_retention: 'zero (contract)' }), 'zero (contract)');
74
+ console.log(failures === 0 ? '\nALL ZERO RETENTION TESTS PASSED' : `\n${failures} CHECK(S) FAILED`);
75
+ process.exit(failures === 0 ? 0 : 1);
76
+ //# sourceMappingURL=test_zero_retention_alerts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_zero_retention_alerts.js","sourceRoot":"","sources":["../src/test_zero_retention_alerts.ts"],"names":[],"mappings":"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"}
@@ -3,17 +3,54 @@
3
3
  *
4
4
  * Extracted from index.ts to reduce monolith size.
5
5
  * Contains createServer() which registers all 30+ MCP tools.
6
+ *
7
+ * ──────────────────────────────────────────────────────────────────────────
8
+ * WARNING — TOOL DESCRIPTIONS IN THIS FILE MAY BE AIRTABLE-OWNED.
9
+ *
10
+ * `npm run build` runs scripts/sync-descriptions-from-airtable.mjs BEFORE tsc.
11
+ * That script reads the Airtable Offerings table (tbl93DJ627r81zKVP) and
12
+ * regex-rewrites the description string in `server.tool('<name>', '...')` for
13
+ * EVERY tool that has a row there. If you hand-edit such a description here,
14
+ * it is silently reverted on the next build.
15
+ *
16
+ * Tool has an Offerings row -> edit the Airtable row, then build.
17
+ * Tool has no Offerings row -> edit it here; the sync leaves it alone.
18
+ *
19
+ * The script exits 0 when AIRTABLE_API_KEY is unset, so a local build can
20
+ * appear to keep your edit while CI/deploy discards it. Verify by running the
21
+ * build and re-reading the description here before you ship.
22
+ *
23
+ * Airtable is the source of truth for published, customer-visible text.
24
+ * See Fodda API docs/bibles/system_clarifications.md section 2.
25
+ * ──────────────────────────────────────────────────────────────────────────
6
26
  */
7
27
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
28
  export declare function resolveAnalystAlias(analystIdInput: string, companyInput?: string): {
9
29
  analyst_id: string;
10
30
  company?: string | undefined;
11
31
  };
32
+ /**
33
+ * Response hygiene filter for ChatGPT Apps Directory submission.
34
+ * Drops internal keys:
35
+ * - starting with `_` (e.g. `_account`, `_raw`, `_upstream_usage`)
36
+ * - `record_id`, `airtable_*` / keys matching airtable
37
+ * - `debug`, `trace`, `internal`
38
+ * - values matching `^rec[A-Za-z0-9]{14}$` (Airtable record IDs)
39
+ * Preserves all chainable IDs: analyst_id, graph_id, node_id, job_id, trend_id, id, session_id.
40
+ */
41
+ export declare function sanitizePayloadForChatGpt(obj: any): any;
42
+ /**
43
+ * Format pre-materialized earnings corroboration attached to trend hits.
44
+ * Formats executive quotes and analyst question themes with proper attribution:
45
+ * E.g. `[Earnings Call Corroboration]: Fabrizio Freda (CEO) [EL]: "Prestige beauty showed resilience across European travel retail." (Q2-2026)`
46
+ * Or: `[Earnings Call Corroboration]: [ULTA] Mass vs Prestige dynamic (Q2-2026)`
47
+ */
48
+ export declare function formatEarningsCorroboration(corroboration: any): string | null;
12
49
  export type { FoddaRequestFn, WaverunnerRequestFn } from './types.js';
13
50
  import type { FoddaRequestFn, WaverunnerRequestFn } from './types.js';
14
51
  export declare function createServer(apiKey: string, userId: string, foddaRequest: FoddaRequestFn, waverunnerRequest: WaverunnerRequestFn, storeWidget: (html: string) => string, getServiceUrl: () => string, entryId?: string, sptCtx?: {
15
52
  token: string;
16
53
  maxAmountCents: number | null;
17
54
  prices: Record<string, number>;
18
- }, allowedTools?: Set<string> | string[]): Promise<McpServer>;
55
+ }, allowedTools?: Set<string> | string[], sessionSource?: string): Promise<McpServer>;
19
56
  //# sourceMappingURL=toolHandlers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolHandlers.d.ts","sourceRoot":"","sources":["../src/toolHandlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkCpE,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CA+CvI;AAwGD,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA8DtE,wBAAsB,YAAY,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,cAAc,EAC5B,iBAAiB,EAAE,mBAAmB,EACtC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EACrC,aAAa,EAAE,MAAM,MAAM,EAC3B,OAAO,GAAE,MAAW,EAEpB,MAAM,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EACzF,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,GACtC,OAAO,CAAC,SAAS,CAAC,CA8iJpB"}
1
+ {"version":3,"file":"toolHandlers.d.ts","sourceRoot":"","sources":["../src/toolHandlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmCpE,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CA+CvI;AAkCD;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAuBvD;AAyED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,aAAa,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAmC7E;AAoBD,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA0EtE,wBAAsB,YAAY,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,cAAc,EAC5B,iBAAiB,EAAE,mBAAmB,EACtC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EACrC,aAAa,EAAE,MAAM,MAAM,EAC3B,OAAO,GAAE,MAAW,EAEpB,MAAM,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EACzF,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,EACrC,aAAa,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,SAAS,CAAC,CA+iPpB"}