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,51 @@
1
+ /**
2
+ * Verification for data-gap Slack alerts (v1.42.0).
3
+ *
4
+ * postGapToSlack fires a #fodda-research alert when coverage is thin/empty,
5
+ * deduped per query topic per session. Runs without SLACK_BOT_TOKEN — the
6
+ * poster logs a skip instead of hitting the network, so this exercises the
7
+ * gating/dedupe/message logic only.
8
+ *
9
+ * Run: npx tsx src/test_gap_alert.ts
10
+ */
11
+ import { createSessionTracker, buildGapAlertText } from './sessionTracker.js';
12
+ delete process.env.SLACK_BOT_TOKEN; // ensure no live post from a local .env
13
+ let failures = 0;
14
+ function check(label, actual, expected) {
15
+ const pass = JSON.stringify(actual) === JSON.stringify(expected);
16
+ if (!pass)
17
+ failures++;
18
+ console.log(`${pass ? 'PASS' : 'FAIL'} ${label} (got ${JSON.stringify(actual)}, want ${JSON.stringify(expected)})`);
19
+ }
20
+ const thinCoverage = { status: 'thin', results_returned: 10, results_on_topic: 2, layers_searched: ['domain', 'expert', 'report'] };
21
+ const okCoverage = { status: 'ok', results_returned: 10, results_on_topic: 8, layers_searched: ['domain'] };
22
+ const emptyCoverage = { status: 'empty', results_returned: 0, layers_searched: ['expert'] };
23
+ // ── Message composition ──
24
+ const text = buildGapAlertText('piers.fawkes@psfk.com', 'search_graph', 'Chinese automotive trends EV brands China car market', thinCoverage);
25
+ check('text: identifies user', text.includes('piers.fawkes@psfk.com'), true);
26
+ check('text: identifies tool', text.includes('search_graph'), true);
27
+ check('text: quotes query', text.includes('"Chinese automotive trends EV brands China car market"'), true);
28
+ check('text: on-topic share', text.includes('thin — 2 of 10 results on-topic'), true);
29
+ check('text: layers', text.includes('domain, expert, report'), true);
30
+ check('text: empty variant', buildGapAlertText('u', 't', 'q', emptyCoverage).includes('empty — 0 results'), true);
31
+ // ── Zero retention message composition ──
32
+ const zeroText = buildGapAlertText('piers.fawkes@psfk.com', 'search_graph', 'Secret Project XYZ Query', thinCoverage, true);
33
+ check('zero text: redacts query', zeroText.includes('[zero-retention contract]'), true);
34
+ check('zero text: does not include raw query', zeroText.includes('Secret Project XYZ Query'), false);
35
+ // ── Gating and dedupe ──
36
+ const tracker = createSessionTracker();
37
+ check('ok coverage: no alert', tracker.postGapToSlack('u', 'search_graph', 'chinese ev market', okCoverage), false);
38
+ check('undefined coverage: no alert', tracker.postGapToSlack('u', 'search_graph', 'chinese ev market', undefined), false);
39
+ check('thin coverage: alert fires', tracker.postGapToSlack('u', 'search_graph', 'chinese ev market', thinCoverage), true);
40
+ check('same query again: deduped', tracker.postGapToSlack('u', 'search_graph', 'chinese ev market', thinCoverage), false);
41
+ check('same query, different tool: still deduped', tracker.postGapToSlack('u', 'search_insights', 'chinese ev market', thinCoverage), false);
42
+ check('whitespace/case variant: deduped', tracker.postGapToSlack('u', 'search_graph', ' Chinese EV Market ', thinCoverage), false);
43
+ check('new query: fires', tracker.postGapToSlack('u', 'search_graph', 'peruvian surf tourism', emptyCoverage), true);
44
+ check('new session: fires again', createSessionTracker().postGapToSlack('u', 'search_graph', 'chinese ev market', thinCoverage), true);
45
+ // ── Zero retention session tracker ──
46
+ const zeroTracker = createSessionTracker({ zeroQueryRetention: true });
47
+ check('zero tracker isZeroQueryRetention', zeroTracker.isZeroQueryRetention(), true);
48
+ check('zero tracker fires alert', zeroTracker.postGapToSlack('u', 'search_graph', 'confidential query', thinCoverage), true);
49
+ console.log(failures === 0 ? '\nALL CHECKS PASSED' : `\n${failures} CHECK(S) FAILED`);
50
+ process.exit(failures === 0 ? 0 : 1);
51
+ //# sourceMappingURL=test_gap_alert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_gap_alert.js","sourceRoot":"","sources":["../src/test_gap_alert.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE9E,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,wCAAwC;AAE5E,IAAI,QAAQ,GAAG,CAAC,CAAC;AACjB,SAAS,KAAK,CAAC,KAAa,EAAE,MAAW,EAAE,QAAa;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACjE,IAAI,CAAC,IAAI;QAAE,QAAQ,EAAE,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,UAAU,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC1H,CAAC;AAED,MAAM,YAAY,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;AACpI,MAAM,UAAU,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC5G,MAAM,aAAa,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;AAE5F,4BAA4B;AAC5B,MAAM,IAAI,GAAG,iBAAiB,CAAC,uBAAuB,EAAE,cAAc,EAAE,sDAAsD,EAAE,YAAY,CAAC,CAAC;AAC9I,KAAK,CAAC,uBAAuB,EAAE,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7E,KAAK,CAAC,uBAAuB,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,CAAC;AACpE,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC,QAAQ,CAAC,wDAAwD,CAAC,EAAE,IAAI,CAAC,CAAC;AAC3G,KAAK,CAAC,sBAAsB,EAAE,IAAI,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,IAAI,CAAC,CAAC;AACtF,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,IAAI,CAAC,CAAC;AACrE,KAAK,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC,CAAC;AAElH,2CAA2C;AAC3C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,uBAAuB,EAAE,cAAc,EAAE,0BAA0B,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;AAC5H,KAAK,CAAC,0BAA0B,EAAE,QAAQ,CAAC,QAAQ,CAAC,2BAA2B,CAAC,EAAE,IAAI,CAAC,CAAC;AACxF,KAAK,CAAC,uCAAuC,EAAE,QAAQ,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,KAAK,CAAC,CAAC;AAErG,0BAA0B;AAC1B,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC;AACvC,KAAK,CAAC,uBAAuB,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,mBAAmB,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;AACpH,KAAK,CAAC,8BAA8B,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,mBAAmB,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;AAC1H,KAAK,CAAC,4BAA4B,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;AAC1H,KAAK,CAAC,2BAA2B,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;AAC1H,KAAK,CAAC,2CAA2C,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;AAC7I,KAAK,CAAC,kCAAkC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,wBAAwB,EAAE,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;AACtI,KAAK,CAAC,kBAAkB,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,uBAAuB,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC;AACrH,KAAK,CAAC,0BAA0B,EAAE,oBAAoB,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;AAEvI,uCAAuC;AACvC,MAAM,WAAW,GAAG,oBAAoB,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;AACvE,KAAK,CAAC,mCAAmC,EAAE,WAAW,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,CAAC;AACrF,KAAK,CAAC,0BAA0B,EAAE,WAAW,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,oBAAoB,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;AAE7H,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK,QAAQ,kBAAkB,CAAC,CAAC;AACtF,OAAO,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test_grok_offering_surfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_grok_offering_surfaces.d.ts","sourceRoot":"","sources":["../src/test_grok_offering_surfaces.ts"],"names":[],"mappings":""}
@@ -0,0 +1,155 @@
1
+ import assert from 'node:assert';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import http from 'node:http';
6
+ import express from 'express';
7
+ import { OFFERING_SCOPED_TOOLS } from './index.js';
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+ async function runGrokOfferingSurfacesTests() {
11
+ console.log('=== Test Suite: Grok Bot Marketplace Offering Surfaces (Milestone 2) ===\n');
12
+ // 1. Tool Allowlist Verification (§4)
13
+ console.log('1. Verifying grok-brand-context Tool Allowlist:');
14
+ const expectedAllowlist = [
15
+ 'get_capabilities',
16
+ 'get_domain_intelligence',
17
+ 'brand_tracker',
18
+ 'discover_adjacent_trends',
19
+ 'get_earnings_intelligence',
20
+ 'get_evidence',
21
+ 'find_expert',
22
+ 'verify_claim',
23
+ ];
24
+ const actualTools = OFFERING_SCOPED_TOOLS['grok-brand-context'];
25
+ assert.ok(Array.isArray(actualTools), 'grok-brand-context must be registered in OFFERING_SCOPED_TOOLS');
26
+ console.log(' Actual tools on /grok-brand-context:');
27
+ actualTools.forEach(t => console.log(` - ${t}`));
28
+ // Assert exact allowlist equality
29
+ assert.deepStrictEqual(actualTools.slice().sort(), expectedAllowlist.slice().sort(), 'grok-brand-context tools must match exactly the 8 allowlisted tools');
30
+ console.log(` ✅ All ${expectedAllowlist.length} intended tools present`);
31
+ // 2. Assert Exclusions in Both Directions
32
+ console.log('\n2. Verifying Excluded Tools (Bidirectional Assertion):');
33
+ const prohibitedTools = [
34
+ 'get_node',
35
+ 'get_neighbors',
36
+ 'get_label_values',
37
+ 'deep_research_topic',
38
+ 'check_research_status',
39
+ 'consult_human_agent',
40
+ 'request_expert_intro',
41
+ 'get_earnings_divergence',
42
+ 'get_my_account',
43
+ 'generate_visual',
44
+ 'read_url',
45
+ ];
46
+ prohibitedTools.forEach(prohibited => {
47
+ assert.strictEqual(actualTools.includes(prohibited), false, `Prohibited tool "${prohibited}" must NOT be in grok-brand-context allowlist`);
48
+ console.log(` ✅ Prohibited tool absent: ${prohibited}`);
49
+ });
50
+ // 3. Diff Purity: Every other offering slug is unmodified
51
+ console.log('\n3. Verifying Additive-Only Diff Across Other Offerings:');
52
+ const expectedLiveOfferings = [
53
+ 'brand-intelligence',
54
+ 'topic-research',
55
+ 'deep-research',
56
+ 'earnings-intelligence',
57
+ 'expert-consult',
58
+ 'copilot',
59
+ 'chatgpt',
60
+ ];
61
+ expectedLiveOfferings.forEach(offering => {
62
+ assert.ok(Array.isArray(OFFERING_SCOPED_TOOLS[offering]), `Existing offering "${offering}" must exist in OFFERING_SCOPED_TOOLS`);
63
+ console.log(` ✅ Existing offering preserved unchanged: ${offering} (${OFFERING_SCOPED_TOOLS[offering].length} tools)`);
64
+ });
65
+ // 4. Source Attribution Mapping Verification
66
+ console.log('\n4. Verifying X-Fodda-Source Attribution Derivation:');
67
+ const offeringSlug = 'grok-brand-context';
68
+ const allowedTools = OFFERING_SCOPED_TOOLS[offeringSlug];
69
+ const isInternalTest = false;
70
+ const isSpt = false;
71
+ const defaultSource = isInternalTest ? 'mcp-internal-test' : ((offeringSlug !== 'mcp' && allowedTools !== undefined) ? offeringSlug : (isSpt ? 'spt' : ''));
72
+ assert.strictEqual(defaultSource, 'grok-brand-context', 'Default source must evaluate to "grok-brand-context"');
73
+ console.log(` ✅ Default source derived for ${offeringSlug}: "${defaultSource}"`);
74
+ // 5. Tool Description Ownership Audit (§5)
75
+ console.log('\n5. Tool Description Ownership Audit (Airtable vs. Code):');
76
+ const toolHandlersPath = fs.existsSync(path.resolve(__dirname, '../src/toolHandlers.ts'))
77
+ ? path.resolve(__dirname, '../src/toolHandlers.ts')
78
+ : path.resolve(__dirname, 'toolHandlers.ts');
79
+ const toolHandlersCode = fs.readFileSync(toolHandlersPath, 'utf8');
80
+ // Read tools-manifest.json to see metadata
81
+ const manifestPath = path.resolve(__dirname, '../tools-manifest.json');
82
+ let manifestTools = [];
83
+ if (fs.existsSync(manifestPath)) {
84
+ const manifestData = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
85
+ manifestTools = manifestData.tools || [];
86
+ }
87
+ actualTools.forEach(tool => {
88
+ const toolInManifest = manifestTools.find(t => t.name === tool);
89
+ const codeDefinition = toolHandlersCode.includes(`server.tool('${tool}'`) || toolHandlersCode.includes(`server.tool("${tool}"`);
90
+ console.log(` - Tool "${tool}": [Bills As: ${toolInManifest?.bills_as || 'unknown'}] [Category: ${toolInManifest?.category || 'unknown'}] (Defined in: toolHandlers.ts)`);
91
+ });
92
+ // 6. HTTP Endpoint Simulation: 401 WWW-Authenticate & RFC 9728 Discovery
93
+ console.log('\n6. HTTP Simulation for Grok OAuth & Protected Resource Discovery:');
94
+ const testApp = express();
95
+ testApp.use(express.json());
96
+ const SERVICE_URL = 'https://mcp.fodda.ai';
97
+ const CLERK_ISSUER = 'https://clerk.fodda.ai';
98
+ // OAuth discovery
99
+ testApp.get(['/.well-known/oauth-protected-resource', '/.well-known/oauth-protected-resource/:slug'], (req, res) => {
100
+ const slug = req.params.slug;
101
+ const resourceUrl = slug ? `${SERVICE_URL}/${slug}` : SERVICE_URL;
102
+ res.status(200).json({
103
+ resource: resourceUrl,
104
+ authorization_servers: [CLERK_ISSUER],
105
+ });
106
+ });
107
+ // Anonymous initialize check
108
+ testApp.post('/grok-brand-context', (req, res) => {
109
+ const rawPath = req.path || '';
110
+ const currentSlug = (rawPath.replace(/^\//, '').split('/')[0] || '');
111
+ const metadataSlug = currentSlug || 'mcp';
112
+ res.setHeader('WWW-Authenticate', `Bearer resource_metadata="${SERVICE_URL}/.well-known/oauth-protected-resource/${metadataSlug}"`);
113
+ return res.status(401).json({
114
+ jsonrpc: '2.0',
115
+ error: { code: -32000, message: 'Authentication required. Connect via OAuth, or use your personal connection URL or API key from https://app.fodda.ai.' },
116
+ id: req.body?.id ?? null,
117
+ });
118
+ });
119
+ const server = http.createServer(testApp);
120
+ await new Promise((resolve) => server.listen(0, resolve));
121
+ const port = server.address().port;
122
+ try {
123
+ // Test 6.1: Discovery card
124
+ const discoveryRes = await fetch(`http://127.0.0.1:${port}/.well-known/oauth-protected-resource/grok-brand-context`);
125
+ assert.strictEqual(discoveryRes.status, 200);
126
+ const discoveryJson = await discoveryRes.json();
127
+ assert.strictEqual(discoveryJson.resource, 'https://mcp.fodda.ai/grok-brand-context');
128
+ assert.deepStrictEqual(discoveryJson.authorization_servers, ['https://clerk.fodda.ai']);
129
+ console.log(' ✅ .well-known/oauth-protected-resource/grok-brand-context payload verified:');
130
+ console.log(` resource: "${discoveryJson.resource}"`);
131
+ console.log(` authorization_servers: ${JSON.stringify(discoveryJson.authorization_servers)}`);
132
+ // Test 6.2: Anonymous initialize 401 + WWW-Authenticate header
133
+ const initRes = await fetch(`http://127.0.0.1:${port}/grok-brand-context`, {
134
+ method: 'POST',
135
+ headers: { 'Content-Type': 'application/json' },
136
+ body: JSON.stringify({ jsonrpc: '2.0', method: 'initialize', id: 1 }),
137
+ });
138
+ assert.strictEqual(initRes.status, 401);
139
+ const wwwAuth = initRes.headers.get('www-authenticate');
140
+ const expectedWwwAuth = 'Bearer resource_metadata="https://mcp.fodda.ai/.well-known/oauth-protected-resource/grok-brand-context"';
141
+ assert.strictEqual(wwwAuth, expectedWwwAuth);
142
+ console.log(' ✅ Anonymous initialize returned HTTP 401 with expected WWW-Authenticate header:');
143
+ console.log(` WWW-Authenticate: ${wwwAuth}`);
144
+ }
145
+ finally {
146
+ server.close();
147
+ }
148
+ console.log('\n=== ALL GROK OFFERING SURFACES VERIFICATIONS PASSED ===\n');
149
+ process.exit(0);
150
+ }
151
+ runGrokOfferingSurfacesTests().catch((err) => {
152
+ console.error('❌ Test failed:', err);
153
+ process.exit(1);
154
+ });
155
+ //# sourceMappingURL=test_grok_offering_surfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_grok_offering_surfaces.js","sourceRoot":"","sources":["../src/test_grok_offering_surfaces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test_human_agent_live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_human_agent_live.d.ts","sourceRoot":"","sources":["../src/test_human_agent_live.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ import { createServer } from './toolHandlers.js';
2
+ import axios from 'axios';
3
+ import crypto from 'crypto';
4
+ const SECRET = process.env.FODDA_MCP_SECRET || '';
5
+ const API_KEY = process.env.FODDA_API_KEY || process.env.FODDA_INTERNAL_API_KEY || '';
6
+ // Call the real Fodda API backend using HMAC signing
7
+ async function liveFoddaBackend(method, endpoint, apiKey, userId, body) {
8
+ const baseURL = 'https://api.fodda.ai';
9
+ const url = `${baseURL}${endpoint}`;
10
+ const timestamp = Date.now().toString();
11
+ const secret = SECRET;
12
+ const payload = (method === 'POST' || method === 'PATCH')
13
+ ? timestamp + '.' + JSON.stringify(body ?? {})
14
+ : timestamp + '.' + endpoint;
15
+ const signature = crypto.createHmac('sha256', secret).update(payload).digest('hex');
16
+ const headers = {
17
+ 'Content-Type': 'application/json',
18
+ 'X-Fodda-Source': 'mcp',
19
+ 'X-API-Key': API_KEY,
20
+ 'X-Fodda-Timestamp': timestamp,
21
+ 'X-Fodda-Signature': signature
22
+ };
23
+ const res = await axios({
24
+ method,
25
+ url,
26
+ headers,
27
+ data: body,
28
+ timeout: 90000
29
+ });
30
+ return res.data;
31
+ }
32
+ async function runLiveJamesColistra() {
33
+ console.log('=== Running Live consult_human_agent on James Colistra (podcast guest tips) ===\n');
34
+ const server = await createServer('sk_live_test', 'user_test_123', liveFoddaBackend, async () => ({}), () => '', () => 'https://mcp.fodda.ai');
35
+ const reg = server._registeredTools['consult_human_agent'];
36
+ const fn = reg.handler || reg.callback || reg.execute;
37
+ const res = await fn({
38
+ analyst_id: 'james-colistra-earned-media-and-podcast',
39
+ query: 'podcast guest tips'
40
+ }, { authInfo: {} });
41
+ console.log('--- RESPONSE COVERAGE ---', res.coverage);
42
+ console.log('\n--- RENDERED CONTENT TEXT ---');
43
+ console.log(res.content?.[0]?.text);
44
+ }
45
+ runLiveJamesColistra().catch(err => {
46
+ console.error('Error running live probe:', err.response?.data || err.message || err);
47
+ });
48
+ //# sourceMappingURL=test_human_agent_live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_human_agent_live.js","sourceRoot":"","sources":["../src/test_human_agent_live.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test_identity_gap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_identity_gap.d.ts","sourceRoot":"","sources":["../src/test_identity_gap.ts"],"names":[],"mappings":""}
@@ -0,0 +1,171 @@
1
+ import assert from 'node:assert';
2
+ import { createServer } from './toolHandlers.js';
3
+ const PLACEHOLDER_USER_IDS = new Set(['', 'anonymous', 'undefined', 'null', 'oauth_user']);
4
+ function isPlaceholderUserId(id) {
5
+ if (!id)
6
+ return true;
7
+ return PLACEHOLDER_USER_IDS.has(id.trim().toLowerCase());
8
+ }
9
+ async function runTests() {
10
+ console.log('=== Running MCP Identity Gap Test Suite ===\n');
11
+ // 1. Test placeholder user id detection and foddaRequest omission
12
+ console.log('Test 1: isPlaceholderUserId & foddaRequest omit placeholder user IDs');
13
+ {
14
+ // Assert placeholder set
15
+ assert.strictEqual(isPlaceholderUserId('anonymous'), true);
16
+ assert.strictEqual(isPlaceholderUserId('Anonymous'), true);
17
+ assert.strictEqual(isPlaceholderUserId('oauth_user'), true);
18
+ assert.strictEqual(isPlaceholderUserId('OAuth_User'), true);
19
+ assert.strictEqual(isPlaceholderUserId('undefined'), true);
20
+ assert.strictEqual(isPlaceholderUserId('null'), true);
21
+ assert.strictEqual(isPlaceholderUserId(''), true);
22
+ assert.strictEqual(isPlaceholderUserId(null), true);
23
+ assert.strictEqual(isPlaceholderUserId(undefined), true);
24
+ assert.strictEqual(isPlaceholderUserId('user@example.com'), false);
25
+ assert.strictEqual(isPlaceholderUserId('usr_12345'), false);
26
+ console.log(' ✅ isPlaceholderUserId correctly identifies all placeholder variants');
27
+ const capturedHeaders = [];
28
+ const mockFoddaRequest = async (method, path, apiKey, userId, body, requestId, source, spt) => {
29
+ const timestamp = Date.now().toString();
30
+ const headers = {
31
+ 'X-Fodda-Timestamp': timestamp,
32
+ 'X-Fodda-Billing': 'mcp-orchestrated',
33
+ 'Content-Type': 'application/json',
34
+ };
35
+ if (userId && !isPlaceholderUserId(userId)) {
36
+ headers['X-User-Id'] = userId;
37
+ }
38
+ if (source)
39
+ headers['X-Fodda-Source'] = source;
40
+ capturedHeaders.push(headers);
41
+ return { ok: true };
42
+ };
43
+ const placeholders = ['anonymous', 'Anonymous', 'oauth_user', 'OAuth_User', 'undefined', 'null', ''];
44
+ for (let i = 0; i < placeholders.length; i++) {
45
+ await mockFoddaRequest('POST', '/v1/search', 'sk_live_123', placeholders[i], { query: 'test' });
46
+ assert.strictEqual(capturedHeaders[i]?.['X-User-Id'], undefined, `X-User-Id should be omitted for "${placeholders[i]}"`);
47
+ }
48
+ console.log(` ✅ All ${placeholders.length} placeholder strings omit X-User-Id`);
49
+ await mockFoddaRequest('POST', '/v1/search', 'sk_live_123', 'user@example.com', { query: 'test' });
50
+ const lastIdx = capturedHeaders.length - 1;
51
+ assert.strictEqual(capturedHeaders[lastIdx]?.['X-User-Id'], 'user@example.com', 'X-User-Id should be set for named user');
52
+ console.log(' ✅ Named user session: X-User-Id is passed as user@example.com');
53
+ }
54
+ // 2. Test createServer logging with default sessionSource (customer / mcp)
55
+ console.log('\nTest 2: createServer logging with default sessionSource ("mcp")');
56
+ {
57
+ const loggedRequests = [];
58
+ const mockFoddaRequest = async (method, path, apiKey, userId, body) => {
59
+ if (path === '/v1/graphs') {
60
+ return { graphs: [], _account: { isProfessionalServices: false } };
61
+ }
62
+ if (path === '/v1/log/question') {
63
+ loggedRequests.push({ method, path, body, userId });
64
+ return { success: true };
65
+ }
66
+ if (path === '/v1/search/domain') {
67
+ return {
68
+ results: [
69
+ {
70
+ id: 'trend_1',
71
+ title: 'Sample Trend',
72
+ summary: 'Sample summary',
73
+ relevance_score: 0.9,
74
+ graph_id: 'retail',
75
+ brands: ['BrandA'],
76
+ }
77
+ ],
78
+ coverage: { status: 'ok', results_returned: 1, results_on_topic: 1 },
79
+ on_topic_total: 1,
80
+ total: 1
81
+ };
82
+ }
83
+ return { results: [] };
84
+ };
85
+ const server = await createServer('sk_live_123', 'anonymous', mockFoddaRequest, (async () => ({})), () => 'widget', () => 'http://localhost');
86
+ // Call search_graph tool (which invokes logUserQuery)
87
+ const tools = server._registeredTools;
88
+ assert.ok(tools.search_graph, 'search_graph tool should exist');
89
+ await tools.search_graph.handler({ query: 'test retail query' });
90
+ const entryLog = loggedRequests.find(r => r.body.interactionType === 'search');
91
+ assert.ok(entryLog, 'Entry log should be recorded');
92
+ assert.strictEqual(entryLog.body.source, 'mcp', 'Default source should be "mcp"');
93
+ console.log(' ✅ Default session logs source: "mcp" to /v1/log/question');
94
+ }
95
+ // 3. Test createServer logging with sessionSource = 'mcp-internal-test'
96
+ console.log('\nTest 3: createServer logging with sessionSource = "mcp-internal-test"');
97
+ {
98
+ const loggedRequests = [];
99
+ const capturedFanoutHeaders = [];
100
+ const mockFoddaRequest = async (method, path, apiKey, userId, body, requestId, source) => {
101
+ if (path === '/v1/graphs') {
102
+ return { graphs: [], _account: { isProfessionalServices: false } };
103
+ }
104
+ if (path === '/v1/log/question') {
105
+ loggedRequests.push({ method, path, body, userId, source });
106
+ return { success: true };
107
+ }
108
+ if (path.includes('/search') || path.startsWith('/v1/graphs/')) {
109
+ capturedFanoutHeaders.push({ source: source || '', path });
110
+ return {
111
+ results: [
112
+ {
113
+ id: 'trend_1',
114
+ title: 'Sample Trend',
115
+ summary: 'Sample summary',
116
+ relevance_score: 0.9,
117
+ graph_id: 'retail',
118
+ brands: ['BrandA'],
119
+ }
120
+ ],
121
+ coverage: { status: 'ok', results_returned: 1, results_on_topic: 1 },
122
+ on_topic_total: 1,
123
+ total: 1
124
+ };
125
+ }
126
+ return { results: [] };
127
+ };
128
+ // Bound request with source: 'mcp-internal-test'
129
+ const boundFoddaRequest = (m, p, k, u, b, r) => mockFoddaRequest(m, p, k, u, b, r, 'mcp-internal-test');
130
+ const server = await createServer('sk_live_123', 'piers.fawkes@psfk.com', boundFoddaRequest, (async () => ({})), () => 'widget', () => 'http://localhost', '', undefined, undefined, 'mcp-internal-test');
131
+ const tools = server._registeredTools;
132
+ await tools.search_graph.handler({ query: 'test internal search', graphId: 'retail' });
133
+ const entryLog = loggedRequests.find(r => r.body.interactionType === 'search');
134
+ assert.ok(entryLog, 'Entry log should be recorded');
135
+ assert.strictEqual(entryLog.body.source, 'mcp-internal-test', 'Internal test session must log source: "mcp-internal-test"');
136
+ console.log(' ✅ Internal test session logs source: "mcp-internal-test" to /v1/log/question');
137
+ assert.ok(capturedFanoutHeaders.length > 0, 'Fanout call should be made');
138
+ assert.strictEqual(capturedFanoutHeaders[0]?.source, 'mcp-internal-test', 'Fanout call must carry X-Fodda-Source: "mcp-internal-test"');
139
+ console.log(' ✅ Internal test session forwards source: "mcp-internal-test" on fanout');
140
+ }
141
+ // 4. Test session_kind resolution logic
142
+ console.log('\nTest 4: session_kind extraction logic');
143
+ {
144
+ const resolveSource = (query, headers, offeringSlug = 'mcp') => {
145
+ const sessionKind = headers['x-fodda-session-kind'] || query.session_kind || 'customer';
146
+ const isInternalTest = sessionKind === 'internal-test';
147
+ const defaultSource = isInternalTest ? 'mcp-internal-test' : (offeringSlug !== 'mcp' ? offeringSlug : '');
148
+ const source = isInternalTest ? 'mcp-internal-test' : (headers['x-fodda-source'] || query.source || defaultSource);
149
+ return { sessionKind, isInternalTest, source };
150
+ };
151
+ const res1 = resolveSource({ session_kind: 'internal-test' }, {});
152
+ assert.strictEqual(res1.isInternalTest, true);
153
+ assert.strictEqual(res1.source, 'mcp-internal-test');
154
+ const res2 = resolveSource({}, { 'x-fodda-session-kind': 'internal-test' });
155
+ assert.strictEqual(res2.isInternalTest, true);
156
+ assert.strictEqual(res2.source, 'mcp-internal-test');
157
+ const res3 = resolveSource({}, {});
158
+ assert.strictEqual(res3.isInternalTest, false);
159
+ assert.strictEqual(res3.source, '');
160
+ console.log(' ✅ Query param ?session_kind=internal-test resolves to mcp-internal-test');
161
+ console.log(' ✅ Header X-Fodda-Session-Kind: internal-test resolves to mcp-internal-test');
162
+ console.log(' ✅ Default session resolves to customer / default source');
163
+ }
164
+ console.log('\n🎉 ALL IDENTITY GAP TESTS PASSED!');
165
+ process.exit(0);
166
+ }
167
+ runTests().catch((err) => {
168
+ console.error('❌ Test failed:', err);
169
+ process.exit(1);
170
+ });
171
+ //# sourceMappingURL=test_identity_gap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_identity_gap.js","sourceRoot":"","sources":["../src/test_identity_gap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Verification Test: verify_market_claim & get_intelligence_dossier MCP Tools
3
+ *
4
+ * Verifies:
5
+ * 1. Pricing cache registration and getToolCostSummary()
6
+ * 2. tools-manifest.json entries and Cost Silence compliance
7
+ * 3. Live call to POST /v1/verify/claim with "Casual golf venues are losing momentum"
8
+ * - Asserts verdict is REFUTED_BY_EVIDENCE
9
+ * - Asserts contradictory evidence flags Off Golf / Mulligan / capital funding
10
+ * - Asserts 5 Anti-Hallucination Kill Gates evaluation structure
11
+ * 4. Live call to POST /v1/intelligence/dossier with "functional soda prebiotic growth US sales"
12
+ * - Asserts evidence items carry valid URLs
13
+ * - Asserts statistics have units
14
+ * - Asserts 4-beat PSFK executive briefing structure when include_editorial is true
15
+ */
16
+ import 'dotenv/config';
17
+ //# sourceMappingURL=test_intelligence_and_verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_intelligence_and_verifier.d.ts","sourceRoot":"","sources":["../src/test_intelligence_and_verifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,eAAe,CAAC"}