fodda-mcp 1.38.0 → 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 (346) hide show
  1. package/README.md +14 -91
  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 +278 -83
  8. package/dist/brandTemplate.js.map +1 -1
  9. package/dist/catalogCache.d.ts +39 -0
  10. package/dist/catalogCache.d.ts.map +1 -1
  11. package/dist/catalogCache.js +293 -22
  12. package/dist/catalogCache.js.map +1 -1
  13. package/dist/coverageRelevance.d.ts +251 -0
  14. package/dist/coverageRelevance.d.ts.map +1 -0
  15. package/dist/coverageRelevance.js +1857 -0
  16. package/dist/coverageRelevance.js.map +1 -0
  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 +442 -29
  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 +411 -106
  32. package/dist/index.js.map +1 -1
  33. package/dist/pricingCache.d.ts.map +1 -1
  34. package/dist/pricingCache.js +55 -3
  35. package/dist/pricingCache.js.map +1 -1
  36. package/dist/queryCache.d.ts.map +1 -1
  37. package/dist/queryCache.js +2 -0
  38. package/dist/queryCache.js.map +1 -1
  39. package/dist/reportBriefing.d.ts +89 -0
  40. package/dist/reportBriefing.d.ts.map +1 -0
  41. package/dist/reportBriefing.js +662 -0
  42. package/dist/reportBriefing.js.map +1 -0
  43. package/dist/searchTemplate.d.ts.map +1 -1
  44. package/dist/searchTemplate.js +65 -53
  45. package/dist/searchTemplate.js.map +1 -1
  46. package/dist/services/graphRouter.d.ts +7 -0
  47. package/dist/services/graphRouter.d.ts.map +1 -0
  48. package/dist/services/graphRouter.js +7 -0
  49. package/dist/services/graphRouter.js.map +1 -0
  50. package/dist/services/notifications.d.ts +2 -2
  51. package/dist/services/notifications.js +3 -3
  52. package/dist/services/notifications.js.map +1 -1
  53. package/dist/sessionTracker.d.ts +42 -3
  54. package/dist/sessionTracker.d.ts.map +1 -1
  55. package/dist/sessionTracker.js +261 -14
  56. package/dist/sessionTracker.js.map +1 -1
  57. package/dist/skillClient.d.ts.map +1 -1
  58. package/dist/skillClient.js +11 -6
  59. package/dist/skillClient.js.map +1 -1
  60. package/dist/svgVisuals.d.ts +17 -19
  61. package/dist/svgVisuals.d.ts.map +1 -1
  62. package/dist/svgVisuals.js +189 -233
  63. package/dist/svgVisuals.js.map +1 -1
  64. package/dist/systemPrompt.d.ts +7 -2
  65. package/dist/systemPrompt.d.ts.map +1 -1
  66. package/dist/systemPrompt.js +153 -81
  67. package/dist/systemPrompt.js.map +1 -1
  68. package/dist/telemetry.d.ts.map +1 -1
  69. package/dist/telemetry.js +15 -0
  70. package/dist/telemetry.js.map +1 -1
  71. package/dist/test_adjacent_trends_polymorphic.d.ts +2 -0
  72. package/dist/test_adjacent_trends_polymorphic.d.ts.map +1 -0
  73. package/dist/test_adjacent_trends_polymorphic.js +154 -0
  74. package/dist/test_adjacent_trends_polymorphic.js.map +1 -0
  75. package/dist/test_book_a_call_live.d.ts +2 -0
  76. package/dist/test_book_a_call_live.d.ts.map +1 -0
  77. package/dist/test_book_a_call_live.js +161 -0
  78. package/dist/test_book_a_call_live.js.map +1 -0
  79. package/dist/test_brand_intelligence_endpoint.js +2 -2
  80. package/dist/test_byo_mcp_submission_clarity.d.ts +2 -0
  81. package/dist/test_byo_mcp_submission_clarity.d.ts.map +1 -0
  82. package/dist/test_byo_mcp_submission_clarity.js +142 -0
  83. package/dist/test_byo_mcp_submission_clarity.js.map +1 -0
  84. package/dist/test_capabilities_guidance.d.ts +2 -0
  85. package/dist/test_capabilities_guidance.d.ts.map +1 -0
  86. package/dist/test_capabilities_guidance.js +372 -0
  87. package/dist/test_capabilities_guidance.js.map +1 -0
  88. package/dist/test_client_provenance.d.ts +2 -0
  89. package/dist/test_client_provenance.d.ts.map +1 -0
  90. package/dist/test_client_provenance.js +77 -0
  91. package/dist/test_client_provenance.js.map +1 -0
  92. package/dist/test_connection_surface_cleanup.d.ts +2 -0
  93. package/dist/test_connection_surface_cleanup.d.ts.map +1 -0
  94. package/dist/test_connection_surface_cleanup.js +203 -0
  95. package/dist/test_connection_surface_cleanup.js.map +1 -0
  96. package/dist/test_consult_routing.d.ts +2 -0
  97. package/dist/test_consult_routing.d.ts.map +1 -0
  98. package/dist/test_consult_routing.js +86 -0
  99. package/dist/test_consult_routing.js.map +1 -0
  100. package/dist/test_consult_split.d.ts +2 -0
  101. package/dist/test_consult_split.d.ts.map +1 -0
  102. package/dist/test_consult_split.js +30 -0
  103. package/dist/test_consult_split.js.map +1 -0
  104. package/dist/test_coverage_relevance.d.ts +12 -0
  105. package/dist/test_coverage_relevance.d.ts.map +1 -0
  106. package/dist/test_coverage_relevance.js +162 -0
  107. package/dist/test_coverage_relevance.js.map +1 -0
  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.d.ts +2 -0
  113. package/dist/test_dcr_and_legacy_deprecation.d.ts.map +1 -0
  114. package/dist/test_dcr_and_legacy_deprecation.js +143 -0
  115. package/dist/test_dcr_and_legacy_deprecation.js.map +1 -0
  116. package/dist/test_demand_signal_logging.d.ts +2 -0
  117. package/dist/test_demand_signal_logging.d.ts.map +1 -0
  118. package/dist/test_demand_signal_logging.js +92 -0
  119. package/dist/test_demand_signal_logging.js.map +1 -0
  120. package/dist/test_earnings_activity_scope.d.ts +5 -0
  121. package/dist/test_earnings_activity_scope.d.ts.map +1 -0
  122. package/dist/test_earnings_activity_scope.js +101 -0
  123. package/dist/test_earnings_activity_scope.js.map +1 -0
  124. package/dist/test_earnings_divergence_live.d.ts +5 -0
  125. package/dist/test_earnings_divergence_live.d.ts.map +1 -0
  126. package/dist/test_earnings_divergence_live.js +135 -0
  127. package/dist/test_earnings_divergence_live.js.map +1 -0
  128. package/dist/test_earnings_hygiene_and_binding.d.ts +5 -0
  129. package/dist/test_earnings_hygiene_and_binding.d.ts.map +1 -0
  130. package/dist/test_earnings_hygiene_and_binding.js +104 -0
  131. package/dist/test_earnings_hygiene_and_binding.js.map +1 -0
  132. package/dist/test_exec_quotes_render.d.ts +2 -0
  133. package/dist/test_exec_quotes_render.d.ts.map +1 -0
  134. package/dist/test_exec_quotes_render.js +86 -0
  135. package/dist/test_exec_quotes_render.js.map +1 -0
  136. package/dist/test_expert_intro.d.ts +2 -0
  137. package/dist/test_expert_intro.d.ts.map +1 -0
  138. package/dist/test_expert_intro.js +57 -0
  139. package/dist/test_expert_intro.js.map +1 -0
  140. package/dist/test_expert_layer.d.ts +11 -0
  141. package/dist/test_expert_layer.d.ts.map +1 -0
  142. package/dist/test_expert_layer.js +356 -0
  143. package/dist/test_expert_layer.js.map +1 -0
  144. package/dist/test_financial_snapshot_render.d.ts +2 -0
  145. package/dist/test_financial_snapshot_render.d.ts.map +1 -0
  146. package/dist/test_financial_snapshot_render.js +167 -0
  147. package/dist/test_financial_snapshot_render.js.map +1 -0
  148. package/dist/test_gap_alert.d.ts +12 -0
  149. package/dist/test_gap_alert.d.ts.map +1 -0
  150. package/dist/test_gap_alert.js +51 -0
  151. package/dist/test_gap_alert.js.map +1 -0
  152. package/dist/test_grok_offering_surfaces.d.ts +2 -0
  153. package/dist/test_grok_offering_surfaces.d.ts.map +1 -0
  154. package/dist/test_grok_offering_surfaces.js +155 -0
  155. package/dist/test_grok_offering_surfaces.js.map +1 -0
  156. package/dist/test_human_agent_live.d.ts +2 -0
  157. package/dist/test_human_agent_live.d.ts.map +1 -0
  158. package/dist/test_human_agent_live.js +48 -0
  159. package/dist/test_human_agent_live.js.map +1 -0
  160. package/dist/test_identity_gap.d.ts +2 -0
  161. package/dist/test_identity_gap.d.ts.map +1 -0
  162. package/dist/test_identity_gap.js +171 -0
  163. package/dist/test_identity_gap.js.map +1 -0
  164. package/dist/test_intelligence_and_verifier.d.ts +17 -0
  165. package/dist/test_intelligence_and_verifier.d.ts.map +1 -0
  166. package/dist/test_intelligence_and_verifier.js +162 -0
  167. package/dist/test_intelligence_and_verifier.js.map +1 -0
  168. package/dist/test_latency_mcp_brief5.d.ts +12 -0
  169. package/dist/test_latency_mcp_brief5.d.ts.map +1 -0
  170. package/dist/test_latency_mcp_brief5.js +200 -0
  171. package/dist/test_latency_mcp_brief5.js.map +1 -0
  172. package/dist/test_limit_and_credit_card_capture.d.ts +21 -0
  173. package/dist/test_limit_and_credit_card_capture.d.ts.map +1 -0
  174. package/dist/test_limit_and_credit_card_capture.js +216 -0
  175. package/dist/test_limit_and_credit_card_capture.js.map +1 -0
  176. package/dist/test_list_graphs_topics.js +1 -1
  177. package/dist/test_list_graphs_topics.js.map +1 -1
  178. package/dist/test_live_deployed_mcp_search.d.ts +2 -0
  179. package/dist/test_live_deployed_mcp_search.d.ts.map +1 -0
  180. package/dist/test_live_deployed_mcp_search.js +85 -0
  181. package/dist/test_live_deployed_mcp_search.js.map +1 -0
  182. package/dist/test_live_deployed_split.d.ts +2 -0
  183. package/dist/test_live_deployed_split.d.ts.map +1 -0
  184. package/dist/test_live_deployed_split.js +72 -0
  185. package/dist/test_live_deployed_split.js.map +1 -0
  186. package/dist/test_live_endpoint_runner.js +2 -2
  187. package/dist/test_live_endpoint_runner.js.map +1 -1
  188. package/dist/test_live_mcp.js +1 -1
  189. package/dist/test_live_mcp.js.map +1 -1
  190. package/dist/test_live_neil_widget.d.ts +2 -0
  191. package/dist/test_live_neil_widget.d.ts.map +1 -0
  192. package/dist/test_live_neil_widget.js +84 -0
  193. package/dist/test_live_neil_widget.js.map +1 -0
  194. package/dist/test_longpoll_status.d.ts +2 -0
  195. package/dist/test_longpoll_status.d.ts.map +1 -0
  196. package/dist/test_longpoll_status.js +117 -0
  197. package/dist/test_longpoll_status.js.map +1 -0
  198. package/dist/test_mcp_find_expert_and_vocabulary_routing.d.ts +2 -0
  199. package/dist/test_mcp_find_expert_and_vocabulary_routing.d.ts.map +1 -0
  200. package/dist/test_mcp_find_expert_and_vocabulary_routing.js +130 -0
  201. package/dist/test_mcp_find_expert_and_vocabulary_routing.js.map +1 -0
  202. package/dist/test_next_moves.d.ts +2 -0
  203. package/dist/test_next_moves.d.ts.map +1 -0
  204. package/dist/test_next_moves.js +714 -0
  205. package/dist/test_next_moves.js.map +1 -0
  206. package/dist/test_next_moves_transcripts.d.ts +2 -0
  207. package/dist/test_next_moves_transcripts.d.ts.map +1 -0
  208. package/dist/test_next_moves_transcripts.js +495 -0
  209. package/dist/test_next_moves_transcripts.js.map +1 -0
  210. package/dist/test_on_request_caller_identity.d.ts +13 -0
  211. package/dist/test_on_request_caller_identity.d.ts.map +1 -0
  212. package/dist/test_on_request_caller_identity.js +131 -0
  213. package/dist/test_on_request_caller_identity.js.map +1 -0
  214. package/dist/test_on_request_intercept.d.ts +10 -0
  215. package/dist/test_on_request_intercept.d.ts.map +1 -0
  216. package/dist/test_on_request_intercept.js +95 -0
  217. package/dist/test_on_request_intercept.js.map +1 -0
  218. package/dist/test_onboarding_consent_and_errors.d.ts +2 -0
  219. package/dist/test_onboarding_consent_and_errors.d.ts.map +1 -0
  220. package/dist/test_onboarding_consent_and_errors.js +110 -0
  221. package/dist/test_onboarding_consent_and_errors.js.map +1 -0
  222. package/dist/test_onboarding_live_scenarios.d.ts +2 -0
  223. package/dist/test_onboarding_live_scenarios.d.ts.map +1 -0
  224. package/dist/test_onboarding_live_scenarios.js +189 -0
  225. package/dist/test_onboarding_live_scenarios.js.map +1 -0
  226. package/dist/test_referral_live.d.ts +2 -0
  227. package/dist/test_referral_live.d.ts.map +1 -0
  228. package/dist/test_referral_live.js +33 -0
  229. package/dist/test_referral_live.js.map +1 -0
  230. package/dist/test_referral_piers.d.ts +2 -0
  231. package/dist/test_referral_piers.d.ts.map +1 -0
  232. package/dist/test_referral_piers.js +33 -0
  233. package/dist/test_referral_piers.js.map +1 -0
  234. package/dist/test_report_editorial_briefing.d.ts +21 -0
  235. package/dist/test_report_editorial_briefing.d.ts.map +1 -0
  236. package/dist/test_report_editorial_briefing.js +356 -0
  237. package/dist/test_report_editorial_briefing.js.map +1 -0
  238. package/dist/test_search_graph_quality.d.ts +2 -0
  239. package/dist/test_search_graph_quality.d.ts.map +1 -0
  240. package/dist/test_search_graph_quality.js +493 -0
  241. package/dist/test_search_graph_quality.js.map +1 -0
  242. package/dist/test_service_to_service_auth.d.ts +2 -0
  243. package/dist/test_service_to_service_auth.d.ts.map +1 -0
  244. package/dist/test_service_to_service_auth.js +199 -0
  245. package/dist/test_service_to_service_auth.js.map +1 -0
  246. package/dist/test_session_next_moves_telemetry.d.ts +2 -0
  247. package/dist/test_session_next_moves_telemetry.d.ts.map +1 -0
  248. package/dist/test_session_next_moves_telemetry.js +100 -0
  249. package/dist/test_session_next_moves_telemetry.js.map +1 -0
  250. package/dist/test_sources_live.d.ts +2 -0
  251. package/dist/test_sources_live.d.ts.map +1 -0
  252. package/dist/test_sources_live.js +30 -0
  253. package/dist/test_sources_live.js.map +1 -0
  254. package/dist/test_specialist_and_analyst_tiers.d.ts +2 -0
  255. package/dist/test_specialist_and_analyst_tiers.d.ts.map +1 -0
  256. package/dist/test_specialist_and_analyst_tiers.js +155 -0
  257. package/dist/test_specialist_and_analyst_tiers.js.map +1 -0
  258. package/dist/test_v2_2_visual_hardening.d.ts +5 -0
  259. package/dist/test_v2_2_visual_hardening.d.ts.map +1 -0
  260. package/dist/test_v2_2_visual_hardening.js +333 -0
  261. package/dist/test_v2_2_visual_hardening.js.map +1 -0
  262. package/dist/test_verify_deprecate_render_spec.d.ts +2 -0
  263. package/dist/test_verify_deprecate_render_spec.d.ts.map +1 -0
  264. package/dist/test_verify_deprecate_render_spec.js +217 -0
  265. package/dist/test_verify_deprecate_render_spec.js.map +1 -0
  266. package/dist/test_verify_neil_demo.d.ts +2 -0
  267. package/dist/test_verify_neil_demo.d.ts.map +1 -0
  268. package/dist/test_verify_neil_demo.js +149 -0
  269. package/dist/test_verify_neil_demo.js.map +1 -0
  270. package/dist/test_waitable_research_and_grounded_links.d.ts +2 -0
  271. package/dist/test_waitable_research_and_grounded_links.d.ts.map +1 -0
  272. package/dist/test_waitable_research_and_grounded_links.js +129 -0
  273. package/dist/test_waitable_research_and_grounded_links.js.map +1 -0
  274. package/dist/test_widget_guards.d.ts +2 -0
  275. package/dist/test_widget_guards.d.ts.map +1 -0
  276. package/dist/test_widget_guards.js +229 -0
  277. package/dist/test_widget_guards.js.map +1 -0
  278. package/dist/test_zero_retention_alerts.d.ts +14 -0
  279. package/dist/test_zero_retention_alerts.d.ts.map +1 -0
  280. package/dist/test_zero_retention_alerts.js +76 -0
  281. package/dist/test_zero_retention_alerts.js.map +1 -0
  282. package/dist/toolHandlers.d.ts +38 -1
  283. package/dist/toolHandlers.d.ts.map +1 -1
  284. package/dist/toolHandlers.js +4290 -711
  285. package/dist/toolHandlers.js.map +1 -1
  286. package/dist/tools.d.ts +22 -1
  287. package/dist/tools.d.ts.map +1 -1
  288. package/dist/tools.js +29 -4
  289. package/dist/tools.js.map +1 -1
  290. package/dist/verify_tools_endpoint.js +19 -5
  291. package/dist/verify_tools_endpoint.js.map +1 -1
  292. package/dist/widgetShell.d.ts +2 -2
  293. package/dist/widgetShell.d.ts.map +1 -1
  294. package/dist/widgetShell.js +1 -1
  295. package/dist/widgetShell.js.map +1 -1
  296. package/package.json +1 -1
  297. package/server.json +3 -31
  298. package/dist/debug_tools.d.ts +0 -2
  299. package/dist/debug_tools.d.ts.map +0 -1
  300. package/dist/debug_tools.js +0 -19
  301. package/dist/debug_tools.js.map +0 -1
  302. package/dist/inspect_list_graphs.d.ts +0 -2
  303. package/dist/inspect_list_graphs.d.ts.map +0 -1
  304. package/dist/inspect_list_graphs.js +0 -25
  305. package/dist/inspect_list_graphs.js.map +0 -1
  306. package/dist/scratch_test.d.ts.map +0 -1
  307. package/dist/scripts/simulate_gemini.d.ts +0 -2
  308. package/dist/scripts/simulate_gemini.d.ts.map +0 -1
  309. package/dist/scripts/simulate_gemini.js +0 -100
  310. package/dist/scripts/simulate_gemini.js.map +0 -1
  311. package/dist/scripts/verify_registry.d.ts +0 -2
  312. package/dist/scripts/verify_registry.d.ts.map +0 -1
  313. package/dist/scripts/verify_registry.js +0 -77
  314. package/dist/scripts/verify_registry.js.map +0 -1
  315. package/dist/src/index.d.ts +0 -2
  316. package/dist/src/index.d.ts.map +0 -1
  317. package/dist/src/index.js +0 -332
  318. package/dist/src/index.js.map +0 -1
  319. package/dist/src/tools.d.ts +0 -12
  320. package/dist/src/tools.d.ts.map +0 -1
  321. package/dist/src/tools.js +0 -104
  322. package/dist/src/tools.js.map +0 -1
  323. package/dist/src/types.d.ts +0 -44
  324. package/dist/src/types.d.ts.map +0 -1
  325. package/dist/src/types.js +0 -2
  326. package/dist/src/types.js.map +0 -1
  327. package/dist/src/verify.d.ts +0 -2
  328. package/dist/src/verify.d.ts.map +0 -1
  329. package/dist/src/verify.js +0 -47
  330. package/dist/src/verify.js.map +0 -1
  331. package/dist/src/verify_hmac.d.ts +0 -2
  332. package/dist/src/verify_hmac.d.ts.map +0 -1
  333. package/dist/src/verify_hmac.js +0 -106
  334. package/dist/src/verify_hmac.js.map +0 -1
  335. package/dist/src/verify_tools_endpoint.d.ts +0 -2
  336. package/dist/src/verify_tools_endpoint.d.ts.map +0 -1
  337. package/dist/src/verify_tools_endpoint.js +0 -40
  338. package/dist/src/verify_tools_endpoint.js.map +0 -1
  339. package/dist/test-waverunner-response.d.ts +0 -2
  340. package/dist/test-waverunner-response.d.ts.map +0 -1
  341. package/dist/test-waverunner-response.js +0 -20
  342. package/dist/test-waverunner-response.js.map +0 -1
  343. package/dist/test_coverage_r2.d.ts +0 -2
  344. package/dist/test_coverage_r2.d.ts.map +0 -1
  345. package/dist/test_coverage_scratch.d.ts +0 -2
  346. package/dist/test_coverage_scratch.d.ts.map +0 -1
@@ -0,0 +1,170 @@
1
+ import dotenv from 'dotenv';
2
+ dotenv.config();
3
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
4
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
5
+ const TEST_CASES = [
6
+ {
7
+ id: 'Q1_BEN_IN',
8
+ tool: 'consult_human_agent',
9
+ analyst_id: 'ben-dietz-sic',
10
+ query: 'What trends are you tracking around hype culture and creator-led commerce?',
11
+ expectedCoverageCategory: 'in'
12
+ },
13
+ {
14
+ id: 'Q2_BEN_ADJACENT',
15
+ tool: 'consult_human_agent',
16
+ analyst_id: 'ben-dietz-sic',
17
+ query: 'How are retail banks designing their branch experiences for young consumers?',
18
+ expectedCoverageCategory: 'adjacent'
19
+ },
20
+ {
21
+ id: 'Q3_BEN_OUT',
22
+ tool: 'consult_human_agent',
23
+ analyst_id: 'ben-dietz-sic',
24
+ query: 'What are the technical differences between quantum encryption and classical cryptography algorithms?',
25
+ expectedCoverageCategory: 'out'
26
+ },
27
+ {
28
+ id: 'Q4_JEREMY_IN',
29
+ tool: 'consult_human_agent',
30
+ analyst_id: 'jeremy-bergstein-science-education-innovation',
31
+ query: 'How can science centers and cultural institutions monetize their intellectual property and data?',
32
+ expectedCoverageCategory: 'in'
33
+ },
34
+ {
35
+ id: 'Q5_JEREMY_OUT',
36
+ tool: 'consult_human_agent',
37
+ analyst_id: 'jeremy-bergstein-science-education-innovation',
38
+ query: 'What is the optimal semiconductor fabrication process for 2nm chips?',
39
+ expectedCoverageCategory: 'out'
40
+ },
41
+ {
42
+ id: 'Q6_PIERS_IN',
43
+ tool: 'consult_human_agent',
44
+ analyst_id: 'piers-fawkes-ai-builder-knowledge-graph',
45
+ query: 'What are the top retail customer experience innovations in 2026?',
46
+ expectedCoverageCategory: 'in'
47
+ },
48
+ {
49
+ id: 'Q7_ANU_IN',
50
+ tool: 'consult_human_agent',
51
+ analyst_id: 'anu-lingala-macro',
52
+ query: 'What are the dominant macroeconomic headwinds affecting consumer discretionary spending this year?',
53
+ expectedCoverageCategory: 'in'
54
+ },
55
+ {
56
+ id: 'Q8_RETAIL_SYNTHETIC_IN',
57
+ tool: 'consult_analyst',
58
+ analyst_id: 'retail-strategy-innovation',
59
+ query: 'How are retail brands implementing reverse logistics and resale programs?',
60
+ expectedCoverageCategory: 'in'
61
+ },
62
+ {
63
+ id: 'Q9_SEAMLESS_ROUTING_CHECK',
64
+ tool: 'consult_analyst',
65
+ analyst_id: 'ben-dietz-sic',
66
+ query: 'What is your perspective on youth culture shifts influencing street fashion?',
67
+ expectedCoverageCategory: 'in'
68
+ },
69
+ {
70
+ id: 'Q10_MARKETING_SYNTHETIC_IN',
71
+ tool: 'consult_analyst',
72
+ analyst_id: 'marketing-media-strategy',
73
+ query: 'What are the latest shifts in media spend and CTV ad formats?',
74
+ expectedCoverageCategory: 'in'
75
+ }
76
+ ];
77
+ async function runCoverageReplay() {
78
+ console.log('================================================================');
79
+ console.log(' Coverage Replay Suite — Verification of In/Adjacent/Out Signals');
80
+ console.log(' (Clean Queries without Client Step-A Pasted Bullets)');
81
+ console.log(' NOTE: Billed against the configured FODDA_API_KEY');
82
+ console.log('================================================================\n');
83
+ const DEPLOYED_MCP_URL = process.env.TEST_URL || 'https://mcp.fodda.ai/mcp';
84
+ const TEST_API_KEY = process.env.FODDA_API_KEY || 'sk_live_test_internal';
85
+ const TEST_USER = 'coverage-replay-suite@fodda.ai';
86
+ console.log(`Connecting to MCP server: ${DEPLOYED_MCP_URL}`);
87
+ const transport = new StreamableHTTPClientTransport(new URL(DEPLOYED_MCP_URL), {
88
+ requestInit: {
89
+ headers: {
90
+ 'Authorization': `Bearer ${TEST_API_KEY}`,
91
+ 'X-User-Id': TEST_USER,
92
+ 'X-Fodda-Session-Kind': 'internal-test'
93
+ }
94
+ }
95
+ });
96
+ const client = new Client({ name: 'coverage-replay-client', version: '1.0.0' });
97
+ try {
98
+ await client.connect(transport);
99
+ console.log('Connected to MCP.\n');
100
+ }
101
+ catch (err) {
102
+ console.log(`Note: Could not connect to remote transport (${err.message}). Test cases registered: ${TEST_CASES.length}`);
103
+ return;
104
+ }
105
+ let passCount = 0;
106
+ let failCount = 0;
107
+ for (const tc of TEST_CASES) {
108
+ console.log(`--- [${tc.id}] ${tc.tool} (${tc.analyst_id}) ---`);
109
+ console.log(`Query: "${tc.query}"`);
110
+ console.log(`Expected category: ${tc.expectedCoverageCategory}`);
111
+ const start = Date.now();
112
+ try {
113
+ const res = await client.callTool({
114
+ name: tc.tool,
115
+ arguments: {
116
+ analyst_id: tc.analyst_id,
117
+ query: tc.query,
118
+ userId: TEST_USER
119
+ }
120
+ });
121
+ const duration = Date.now() - start;
122
+ const content = res.content?.[0]?.text || '';
123
+ const coverageMatch = content.match(/--- COVERAGE: ([A-Za-z]+) ---/);
124
+ const coverage = res?.coverage || (coverageMatch ? coverageMatch[1] : 'unknown');
125
+ const coverageLower = coverage.toLowerCase();
126
+ console.log(`Result: duration=${duration}ms, coverage=${coverage}`);
127
+ console.log(`Preview: "${content.slice(0, 120).replace(/\n/g, ' ')}..."`);
128
+ let matchesExpected = false;
129
+ if (tc.expectedCoverageCategory === 'in') {
130
+ matchesExpected = coverageLower === 'in' || coverageLower === 'full';
131
+ }
132
+ else if (tc.expectedCoverageCategory === 'adjacent') {
133
+ matchesExpected = coverageLower === 'adjacent' || coverageLower === 'partial' || coverageLower === 'thin';
134
+ }
135
+ else if (tc.expectedCoverageCategory === 'out') {
136
+ // Out-of-lane queries must either resolve to OUT / EMPTY or deliver the third-person platform decline
137
+ const hasDeclineText = content.includes("doesn't have a lot of information") ||
138
+ content.includes("passed on this") ||
139
+ content.includes("outside their focus") ||
140
+ content.includes("outside their lane");
141
+ matchesExpected = coverageLower === 'out' || coverageLower === 'empty' || hasDeclineText;
142
+ }
143
+ else {
144
+ matchesExpected = true;
145
+ }
146
+ if (matchesExpected) {
147
+ console.log(`✅ PASS: [${tc.id}] coverage "${coverage}" matches expected "${tc.expectedCoverageCategory}"\n`);
148
+ passCount++;
149
+ }
150
+ else {
151
+ console.error(`❌ DRIFT/MISMATCH: [${tc.id}] returned coverage "${coverage}" (expected "${tc.expectedCoverageCategory}")\n`);
152
+ failCount++;
153
+ }
154
+ }
155
+ catch (err) {
156
+ console.error(`❌ ERROR: [${tc.id}] Call failed: ${err.message}\n`);
157
+ failCount++;
158
+ }
159
+ }
160
+ console.log(`Coverage replay finished: ${passCount} passed, ${failCount} failed.`);
161
+ await client.close();
162
+ if (failCount > 0) {
163
+ process.exit(1);
164
+ }
165
+ }
166
+ runCoverageReplay().catch((err) => {
167
+ console.error(err);
168
+ process.exit(1);
169
+ });
170
+ //# sourceMappingURL=test_coverage_replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_coverage_replay.js","sourceRoot":"","sources":["../src/test_coverage_replay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test_dcr_and_legacy_deprecation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_dcr_and_legacy_deprecation.d.ts","sourceRoot":"","sources":["../src/test_dcr_and_legacy_deprecation.ts"],"names":[],"mappings":""}
@@ -0,0 +1,143 @@
1
+ import express from 'express';
2
+ import http from 'http';
3
+ import axios from 'axios';
4
+ async function runVerificationTest() {
5
+ process.env.CLERK_ISSUER_URL = 'https://clerk.fodda.ai';
6
+ // Fodda MCP Server on 8989
7
+ const app = express();
8
+ app.use(express.json());
9
+ // Express req.url redaction helper (app-level safety)
10
+ app.use((req, _res, next) => {
11
+ if (req.url && req.url.includes('api_key=')) {
12
+ req.url = req.url.replace(/api_key=[^&]+/g, 'api_key=REDACTED');
13
+ }
14
+ next();
15
+ });
16
+ // Deprecation middleware for legacy URL parameters
17
+ const LEGACY_DEPRECATION_PATHS = [
18
+ '/sse', '/mcp', '/messages', '/copilot',
19
+ '/brand-intelligence', '/topic-research', '/deep-research',
20
+ '/earnings-intelligence', '/expert-consult'
21
+ ];
22
+ app.use(LEGACY_DEPRECATION_PATHS, (req, res, next) => {
23
+ if (req.query.api_key !== undefined || req.query.user_id !== undefined) {
24
+ const message = 'Fodda: this connection URL is outdated. Get your new MCP URL at https://app.fodda.ai (Connections) and update your connector.';
25
+ const accept = req.headers['accept'] || '';
26
+ const contentType = req.headers['content-type'] || '';
27
+ const isJson = accept.includes('application/json') || contentType.includes('application/json') || (req.method === 'POST' && req.body && typeof req.body === 'object');
28
+ if (isJson && req.method === 'POST') {
29
+ const bodyId = (req.body && typeof req.body === 'object' && 'id' in req.body) ? req.body.id : null;
30
+ return res.status(401).json({
31
+ jsonrpc: '2.0',
32
+ error: {
33
+ code: -32001,
34
+ message,
35
+ data: { docs: 'https://fodda.ai/platform-integration-anthropic-claude' }
36
+ },
37
+ id: bodyId,
38
+ });
39
+ }
40
+ res.setHeader('Content-Type', 'text/plain; charset=utf-8');
41
+ return res.status(401).send(`${message}\n`);
42
+ }
43
+ next();
44
+ });
45
+ const CLERK_ISSUER = process.env.CLERK_ISSUER_URL || 'https://clerk.fodda.ai';
46
+ app.get('/.well-known/oauth-protected-resource', (_req, res) => {
47
+ res.status(200).json({
48
+ resource: 'http://localhost:8989',
49
+ authorization_servers: [CLERK_ISSUER],
50
+ });
51
+ });
52
+ app.get('/.well-known/oauth-protected-resource/mcp', (_req, res) => {
53
+ res.status(200).json({
54
+ resource: 'http://localhost:8989/mcp',
55
+ authorization_servers: [CLERK_ISSUER],
56
+ });
57
+ });
58
+ const mcpServer = http.createServer(app);
59
+ await new Promise((resolve) => mcpServer.listen(8989, () => resolve()));
60
+ console.log('[test] MCP test server listening on 8989');
61
+ try {
62
+ // Test 1: POST to /sse?api_key=sk_live_test&user_id=test@example.com
63
+ console.log('[test] Test 1: POST /sse?api_key=sk_live_test&user_id=test@example.com...');
64
+ try {
65
+ await axios.post('http://localhost:8989/sse?api_key=sk_live_test&user_id=test@example.com', { jsonrpc: '2.0', method: 'initialize', id: 1 }, {
66
+ headers: { 'Content-Type': 'application/json' },
67
+ });
68
+ console.error('FAILED: expected 401');
69
+ }
70
+ catch (err) {
71
+ if (err.response?.status === 401) {
72
+ console.log('[test] PASS: Received 401 JSON-RPC response:', err.response.data);
73
+ if (err.response.data?.error?.code === -32001 && err.response.data?.error?.message?.includes('Fodda: this connection URL is outdated')) {
74
+ console.log('[test] PASS: Error code -32001 and message match specification.');
75
+ }
76
+ else {
77
+ console.error('[test] FAIL: Body did not match expected structure:', err.response.data);
78
+ }
79
+ }
80
+ else {
81
+ console.error('[test] FAIL: Received unexpected status:', err.response?.status);
82
+ }
83
+ }
84
+ // Test 2: GET /sse?api_key=sk_live_test
85
+ console.log('[test] Test 2: GET /sse?api_key=sk_live_test...');
86
+ try {
87
+ await axios.get('http://localhost:8989/sse?api_key=sk_live_test');
88
+ console.error('FAILED: expected 401');
89
+ }
90
+ catch (err) {
91
+ if (err.response?.status === 401) {
92
+ console.log('[test] PASS: Received 401 text/plain response:', err.response.data);
93
+ if (typeof err.response.data === 'string' && err.response.data.includes('Fodda: this connection URL is outdated')) {
94
+ console.log('[test] PASS: Plain text message matches specification.');
95
+ }
96
+ }
97
+ else {
98
+ console.error('[test] FAIL: Received unexpected status:', err.response?.status);
99
+ }
100
+ }
101
+ // Test 3: OAuth Protected Resource Discovery Check (Option A)
102
+ console.log('[test] Test 3: GET /.well-known/oauth-protected-resource and /mcp...');
103
+ const protResp = await axios.get('http://localhost:8989/.well-known/oauth-protected-resource');
104
+ const protMcpResp = await axios.get('http://localhost:8989/.well-known/oauth-protected-resource/mcp');
105
+ if (protResp.data?.authorization_servers?.[0] === 'https://clerk.fodda.ai' && protMcpResp.data?.authorization_servers?.[0] === 'https://clerk.fodda.ai') {
106
+ console.log('[test] PASS: Protected resource metadata advertises authorization server CLERK_ISSUER (https://clerk.fodda.ai).');
107
+ }
108
+ else {
109
+ console.error('[test] FAIL: Protected resource authorization_servers mismatch:', protResp.data, protMcpResp.data);
110
+ }
111
+ // Test 4: Live Clerk Native DCR Check (No-Scope Default Scopes including openid)
112
+ console.log('[test] Test 4: Live Clerk POST https://clerk.fodda.ai/oauth/register without scope...');
113
+ try {
114
+ const dcrResp = await axios.post('https://clerk.fodda.ai/oauth/register', {
115
+ client_name: 'Antigravity Test DCR Client',
116
+ redirect_uris: ['https://example.com/callback'],
117
+ grant_types: ['authorization_code'],
118
+ response_types: ['code'],
119
+ token_endpoint_auth_method: 'none',
120
+ }, {
121
+ headers: { 'Content-Type': 'application/json' },
122
+ timeout: 10000,
123
+ });
124
+ console.log('[test] Live Clerk DCR status:', dcrResp.status);
125
+ console.log('[test] Live Clerk DCR granted scope:', dcrResp.data?.scope);
126
+ if (dcrResp.data?.scope?.includes('openid')) {
127
+ console.log('[test] PASS: Live Clerk native DCR returned default scope containing openid!');
128
+ }
129
+ else {
130
+ console.error('[test] FAIL: openid not found in Live Clerk returned scope:', dcrResp.data);
131
+ }
132
+ }
133
+ catch (err) {
134
+ console.error('[test] Warning/Error on live Clerk DCR probe:', err.message);
135
+ }
136
+ }
137
+ finally {
138
+ mcpServer.close();
139
+ console.log('[test] Test server stopped.');
140
+ }
141
+ }
142
+ runVerificationTest().catch(console.error);
143
+ //# sourceMappingURL=test_dcr_and_legacy_deprecation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_dcr_and_legacy_deprecation.js","sourceRoot":"","sources":["../src/test_dcr_and_legacy_deprecation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test_demand_signal_logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_demand_signal_logging.d.ts","sourceRoot":"","sources":["../src/test_demand_signal_logging.ts"],"names":[],"mappings":""}
@@ -0,0 +1,92 @@
1
+ import dotenv from 'dotenv';
2
+ dotenv.config();
3
+ import axios from 'axios';
4
+ const AIRTABLE_API_KEY = process.env.AIRTABLE_API_KEY;
5
+ const AIRTABLE_BASE_ID = 'appXUeeWN1uD9NdCW';
6
+ const AIRTABLE_QUESTIONS_TABLE_ID = 'tblvHx1DzwuTq3TJE';
7
+ async function verifyDemandSignalLogging() {
8
+ console.log('=== Verifying Demand Signal Logging & Airtable Enrichment ===\n');
9
+ if (!AIRTABLE_API_KEY) {
10
+ console.warn('AIRTABLE_API_KEY not found in environment — skipping Airtable live read check');
11
+ process.exit(0);
12
+ }
13
+ const testQuery = `agent commerce verification ${Date.now()}`;
14
+ const userEmail = 'verifier@fodda.ai';
15
+ const airtableUrl = `https://api.airtable.com/v0/${AIRTABLE_BASE_ID}/${AIRTABLE_QUESTIONS_TABLE_ID}`;
16
+ const headers = {
17
+ 'Authorization': `Bearer ${AIRTABLE_API_KEY}`,
18
+ 'Content-Type': 'application/json'
19
+ };
20
+ // 1. Simulate entry log call (POST /v1/log/question at search start)
21
+ console.log(`1. Creating entry log for query: "${testQuery}"...`);
22
+ const createResp = await axios.post(airtableUrl, {
23
+ records: [{
24
+ fields: {
25
+ "question": testQuery,
26
+ "apiCall": `search: ${testQuery}`,
27
+ "userEmail": userEmail,
28
+ "vertical": "all",
29
+ "graphId": "all",
30
+ "source": "mcp",
31
+ "Date": new Date().toISOString(),
32
+ "interaction_type": "search"
33
+ }
34
+ }],
35
+ typecast: true
36
+ }, { headers });
37
+ const recordId = createResp.data.records[0].id;
38
+ console.log(` Created entry record ID: ${recordId}`);
39
+ // 2. Simulate post-search quality enrich call
40
+ console.log('2. Enriching record with aggregate quality signal & searched_graphs...');
41
+ const searchedGraphs = ['retail', 'beauty', 'tech'];
42
+ const userContext = `searched_graphs: ${searchedGraphs.join(', ')}`;
43
+ const resultCount = 2;
44
+ const resultQuality = 'WEAK';
45
+ await axios.patch(airtableUrl, {
46
+ records: [{
47
+ id: recordId,
48
+ fields: {
49
+ "resultCount": resultCount,
50
+ "resultQuality": resultQuality,
51
+ "userContext": userContext
52
+ }
53
+ }],
54
+ typecast: true
55
+ }, { headers });
56
+ console.log(' Enriched record successfully');
57
+ // 3. Fetch record from Airtable to verify state
58
+ console.log('3. Fetching updated record from Airtable...');
59
+ const fetchResp = await axios.get(`${airtableUrl}/${recordId}`, { headers });
60
+ const fields = fetchResp.data.fields;
61
+ console.log('\n--- Airtable Row Verification Results ---');
62
+ console.log(`Record ID: ${fetchResp.data.id}`);
63
+ console.log(`Question: ${fields.question}`);
64
+ console.log(`Result Count: ${fields.resultCount}`);
65
+ console.log(`Result Quality: ${fields.resultQuality}`);
66
+ console.log(`User Context: ${fields.userContext}`);
67
+ console.log(`Interaction Type: ${fields.interaction_type}`);
68
+ let passed = true;
69
+ if (fields.resultCount !== resultCount) {
70
+ console.error(`❌ Mismatch: resultCount expected ${resultCount}, got ${fields.resultCount}`);
71
+ passed = false;
72
+ }
73
+ if (fields.resultQuality !== resultQuality) {
74
+ console.error(`❌ Mismatch: resultQuality expected ${resultQuality}, got ${fields.resultQuality}`);
75
+ passed = false;
76
+ }
77
+ if (fields.userContext !== userContext) {
78
+ console.error(`❌ Mismatch: userContext expected "${userContext}", got "${fields.userContext}"`);
79
+ passed = false;
80
+ }
81
+ if (passed) {
82
+ console.log('\n🎉 DEMAND SIGNAL AIRTABLE ENRICHMENT VERIFIED SUCCESSFULLY!');
83
+ }
84
+ else {
85
+ process.exit(1);
86
+ }
87
+ }
88
+ verifyDemandSignalLogging().catch(err => {
89
+ console.error('❌ Verification script failed:', err.message || err);
90
+ process.exit(1);
91
+ });
92
+ //# sourceMappingURL=test_demand_signal_logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_demand_signal_logging.js","sourceRoot":"","sources":["../src/test_demand_signal_logging.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Verification Test: get_earnings_intelligence Activity Scope & ESG Conflation Fix
3
+ */
4
+ import 'dotenv/config';
5
+ //# sourceMappingURL=test_earnings_activity_scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_earnings_activity_scope.d.ts","sourceRoot":"","sources":["../src/test_earnings_activity_scope.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,eAAe,CAAC"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Verification Test: get_earnings_intelligence Activity Scope & ESG Conflation Fix
3
+ */
4
+ import 'dotenv/config';
5
+ import fs from 'fs';
6
+ import path from 'path';
7
+ import crypto from 'crypto';
8
+ import { fileURLToPath } from 'url';
9
+ import { z } from 'zod';
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = path.dirname(__filename);
12
+ let passed = 0;
13
+ let failed = 0;
14
+ function assert(condition, msg) {
15
+ if (condition) {
16
+ console.log(` ✅ ${msg}`);
17
+ passed++;
18
+ }
19
+ else {
20
+ console.error(` ❌ ${msg}`);
21
+ failed++;
22
+ }
23
+ }
24
+ async function run() {
25
+ console.log('\n=== 1. Tools Manifest & Cost Silence Verification ===');
26
+ const manifestPath = path.resolve(__dirname, '../tools-manifest.json');
27
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
28
+ const manifestTool = manifest.tools.find((t) => t.name === 'get_earnings_intelligence');
29
+ assert(manifestTool !== undefined, 'get_earnings_intelligence found in tools-manifest.json');
30
+ if (manifestTool) {
31
+ assert(manifestTool.bills_as === 'earnings_intelligence', 'bills_as is "earnings_intelligence"');
32
+ assert(manifestTool.category === 'Financial', 'category is "Financial"');
33
+ assert(manifestTool.description.includes('sustainability'), 'description mentions "sustainability"');
34
+ assert(manifestTool.description.includes('activity: "sustainability" | "marketing" | "retail" | "technology"'), 'description documents all activity enum values');
35
+ assert(manifestTool.description.includes('server-side intent routing'), 'description documents server-side intent routing');
36
+ assert(!manifestTool.description.includes('tokens') && !manifestTool.description.includes('via SPT'), 'description contains NO token/SPT mentions');
37
+ assert(!manifestTool.description.includes('Price: $'), 'description contains NO legacy Price: $ mentions');
38
+ }
39
+ console.log('\n=== 2. Tool Definition & Parameter Binding in src/toolHandlers.ts ===');
40
+ const srcPath = fs.existsSync(path.resolve(__dirname, 'toolHandlers.ts'))
41
+ ? path.resolve(__dirname, 'toolHandlers.ts')
42
+ : path.resolve(__dirname, '../src/toolHandlers.ts');
43
+ const toolHandlersSrc = fs.readFileSync(srcPath, 'utf8');
44
+ assert(toolHandlersSrc.includes("activity: z.enum(['sustainability', 'marketing', 'retail', 'technology']).optional()"), 'activity parameter is defined as optional enum');
45
+ assert(toolHandlersSrc.includes("if (activity) params.set('activity', activity);"), 'activity parameter is forwarded to URLSearchParams');
46
+ assert(toolHandlersSrc.includes("logUserQuery(search || brand || ticker || industry || sector || activity || 'earnings snapshot', 'earnings_intelligence');"), 'activity included in logUserQuery fallback');
47
+ assert(toolHandlersSrc.includes("query: search || brand || ticker || sector || activity || ''"), 'activity included in settleOrWithhold query string');
48
+ console.log('\n=== 3. Zod Parameter Validation Logic ===');
49
+ const activitySchema = z.enum(['sustainability', 'marketing', 'retail', 'technology']).optional();
50
+ assert(activitySchema.safeParse('sustainability').success, 'Accepts "sustainability"');
51
+ assert(activitySchema.safeParse('marketing').success, 'Accepts "marketing"');
52
+ assert(activitySchema.safeParse('retail').success, 'Accepts "retail"');
53
+ assert(activitySchema.safeParse('technology').success, 'Accepts "technology"');
54
+ assert(activitySchema.safeParse(undefined).success, 'Accepts undefined (optional)');
55
+ assert(!activitySchema.safeParse('finance').success, 'Rejects invalid activity "finance"');
56
+ assert(!activitySchema.safeParse('operations').success, 'Rejects invalid activity "operations"');
57
+ console.log('\n=== 4. Live API Connectivity (GET /v1/supplemental/earnings/snapshot) ===');
58
+ const apiKey = process.env.FODDA_API_KEY;
59
+ const secret = process.env.FODDA_MCP_SECRET;
60
+ const baseUrl = process.env.FODDA_API_URL || 'https://api.fodda.ai';
61
+ if (apiKey) {
62
+ const pathStr = '/v1/supplemental/earnings/snapshot?sector=apparel&activity=sustainability';
63
+ const timestamp = Date.now().toString();
64
+ const headers = {
65
+ 'X-Fodda-Timestamp': timestamp,
66
+ 'X-Fodda-Billing': 'mcp-orchestrated',
67
+ 'Content-Type': 'application/json',
68
+ 'X-API-Key': apiKey,
69
+ };
70
+ if (secret) {
71
+ const payload = timestamp + '.' + pathStr;
72
+ headers['X-Fodda-Signature'] = crypto.createHmac('sha256', secret).update(payload).digest('hex');
73
+ }
74
+ try {
75
+ const res = await fetch(baseUrl + pathStr, { headers });
76
+ assert(res.status === 200, `Live API returned HTTP ${res.status} for ?sector=apparel&activity=sustainability`);
77
+ const data = await res.json();
78
+ assert(data && data.snapshot !== undefined, 'API response contains snapshot object');
79
+ assert(data.snapshot && data.snapshot.query !== undefined, 'Snapshot contains query metadata');
80
+ console.log(` Total results returned: ${data.snapshot?.total_results}`);
81
+ }
82
+ catch (err) {
83
+ console.error(` ❌ Live API request error: ${err.message}`);
84
+ failed++;
85
+ }
86
+ }
87
+ else {
88
+ console.log(' ⚠️ FODDA_API_KEY not found in environment, skipping live endpoint call.');
89
+ }
90
+ console.log(`\n========================================`);
91
+ console.log(`Results: ${passed} passed, ${failed} failed`);
92
+ console.log(`========================================\n`);
93
+ if (failed > 0) {
94
+ process.exit(1);
95
+ }
96
+ }
97
+ run().catch(err => {
98
+ console.error('Test script error:', err);
99
+ process.exit(1);
100
+ });
101
+ //# sourceMappingURL=test_earnings_activity_scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_earnings_activity_scope.js","sourceRoot":"","sources":["../src/test_earnings_activity_scope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Verification Test: get_earnings_divergence Reconnection & Query Pricing Registration
3
+ */
4
+ import 'dotenv/config';
5
+ //# sourceMappingURL=test_earnings_divergence_live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_earnings_divergence_live.d.ts","sourceRoot":"","sources":["../src/test_earnings_divergence_live.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,eAAe,CAAC"}