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,154 @@
1
+ import assert from 'node:assert';
2
+ import { createServer } from './toolHandlers.js';
3
+ import { setCachedCatalogForTesting } from './catalogCache.js';
4
+ console.log('=== Running Verification: Polymorphic discover_adjacent_trends ===\n');
5
+ let passed = 0;
6
+ let failed = 0;
7
+ function check(condition, msg) {
8
+ if (condition) {
9
+ console.log(` ✅ ${msg}`);
10
+ passed++;
11
+ }
12
+ else {
13
+ console.error(` ❌ ${msg}`);
14
+ failed++;
15
+ }
16
+ }
17
+ const mockGraphsList = [
18
+ {
19
+ graph_id: 'retail',
20
+ name: 'Retail Strategy & Innovation',
21
+ domain: 'retail',
22
+ graph_type: 'domain',
23
+ status: 'live',
24
+ topics: ['retail', 'freight', 'logistics', 'capacity', 'peak season', 'packaging'],
25
+ trend_count: 150,
26
+ evidence_count: 500,
27
+ headline: 'Future of retail operations and omnichannel commerce'
28
+ }
29
+ ];
30
+ const mockAnalystsList = [];
31
+ setCachedCatalogForTesting({ version: '1.0', generated_at: new Date().toISOString(), graph_count: mockGraphsList.length, graphs: mockGraphsList }, mockAnalystsList);
32
+ async function mockFoddaBackend(method, endpoint, apiKey, userId, body) {
33
+ if (endpoint.includes('/v1/graphs/catalog') || endpoint === '/v1/graphs') {
34
+ return { graphs: mockGraphsList };
35
+ }
36
+ if (endpoint.includes('/search')) {
37
+ return {
38
+ total: 2,
39
+ on_topic_total: 2,
40
+ rows: [
41
+ {
42
+ title: 'Peak Season Freight Guarantee Contracts',
43
+ trendName: 'Peak Season Freight Guarantee Contracts',
44
+ node_id: '2507.0',
45
+ score: 0.95,
46
+ trendLifecycle: 'emerging',
47
+ signal_score: 88,
48
+ brandNames: ['Walmart', 'Target']
49
+ },
50
+ {
51
+ title: 'Dedicated Fleet Capacity Reserves',
52
+ trendName: 'Dedicated Fleet Capacity Reserves',
53
+ node_id: '2508.0',
54
+ score: 0.89,
55
+ trendLifecycle: 'building',
56
+ signal_score: 82,
57
+ brandNames: ['Amazon']
58
+ }
59
+ ]
60
+ };
61
+ }
62
+ if (endpoint.includes('/adjacent')) {
63
+ return {
64
+ adjacent: [
65
+ {
66
+ name: 'Dynamic Intermodal Route Optimization',
67
+ trendName: 'Dynamic Intermodal Route Optimization',
68
+ node_id: '3101.0',
69
+ similarity: 0.86,
70
+ vertical: 'retail',
71
+ description: 'Retailers re-routing supply chains dynamically around bottlenecked ports.'
72
+ },
73
+ {
74
+ name: 'Shared Warehousing Cooperatives',
75
+ trendName: 'Shared Warehousing Cooperatives',
76
+ node_id: '3102.0',
77
+ similarity: 0.81,
78
+ vertical: 'retail',
79
+ description: 'Mid-sized retailers pooling distribution facilities to buffer volume spikes.'
80
+ }
81
+ ]
82
+ };
83
+ }
84
+ return {};
85
+ }
86
+ async function runTests() {
87
+ const server = await createServer('sk_live_test_key', 'user_test_123', mockFoddaBackend, async () => ({}), () => '', () => 'https://mcp.fodda.ai');
88
+ const toolReg = server._registeredTools['discover_adjacent_trends'];
89
+ assert.ok(toolReg, 'discover_adjacent_trends tool must be registered');
90
+ const toolFn = toolReg.handler || toolReg.callback || toolReg.execute;
91
+ // ---------------------------------------------------------------------------
92
+ // Test 1: Calling with seed_query (repro of user prompt)
93
+ // ---------------------------------------------------------------------------
94
+ console.log('1. Testing call with { seed_query: "retailers paying to guarantee freight capacity ahead of peak season" }...');
95
+ const res1 = await toolFn({
96
+ seed_query: 'retailers paying to guarantee freight capacity ahead of peak season'
97
+ }, { authInfo: {} });
98
+ check(!res1.isError, 'Call with seed_query does not error');
99
+ assert.ok(Array.isArray(res1.content) && res1.content.length > 0, 'Must return content array');
100
+ const text1 = res1.content[0].text;
101
+ check(text1.includes('topic_adjacency_cascade'), 'Payload indicates topic_adjacency_cascade mode');
102
+ check(text1.includes('Peak Season Freight Guarantee Contracts'), 'Found seed trend in response');
103
+ check(text1.includes('Dynamic Intermodal Route Optimization'), 'Found adjacent trend in response');
104
+ check(!!res1.next_moves, 'Returns structured next_moves metadata');
105
+ // ---------------------------------------------------------------------------
106
+ // Test 2: Calling with query alias
107
+ // ---------------------------------------------------------------------------
108
+ console.log('\n2. Testing call with { query: "sustainable luxury packaging" }...');
109
+ const res2 = await toolFn({
110
+ query: 'sustainable luxury packaging'
111
+ }, { authInfo: {} });
112
+ check(!res2.isError, 'Call with query does not error');
113
+ const text2 = res2.content[0].text;
114
+ check(text2.includes('topic_adjacency_cascade'), 'Payload indicates topic_adjacency_cascade mode');
115
+ check(!!res2.next_moves, 'Returns structured next_moves metadata');
116
+ // ---------------------------------------------------------------------------
117
+ // Test 3: Calling with text phrase passed into trend_id
118
+ // ---------------------------------------------------------------------------
119
+ console.log('\n3. Testing call with text phrase passed into trend_id...');
120
+ const res3 = await toolFn({
121
+ trend_id: 'retailers paying to guarantee freight capacity ahead of peak season'
122
+ }, { authInfo: {} });
123
+ check(!res3.isError, 'Call with phrase trend_id does not error');
124
+ const text3 = res3.content[0].text;
125
+ check(text3.includes('topic_adjacency_cascade'), 'Phrase trend_id auto-routes to topic cascade');
126
+ // ---------------------------------------------------------------------------
127
+ // Test 4: Legacy node lookup with graphId and trend_id
128
+ // ---------------------------------------------------------------------------
129
+ console.log('\n4. Testing legacy node ID lookup with { graphId: "retail", trend_id: "2507.0" }...');
130
+ const res4 = await toolFn({
131
+ graphId: 'retail',
132
+ trend_id: '2507.0'
133
+ }, { authInfo: {} });
134
+ check(!res4.isError, 'Legacy node lookup does not error');
135
+ const text4 = res4.content[0].text;
136
+ check(!text4.includes('topic_adjacency_cascade'), 'Legacy node lookup runs single-node lookup');
137
+ check(text4.includes('Dynamic Intermodal Route Optimization'), 'Returns adjacent nodes');
138
+ check(!!res4.next_moves, 'Returns structured next_moves metadata');
139
+ // ---------------------------------------------------------------------------
140
+ // Test 5: Empty arguments error handling
141
+ // ---------------------------------------------------------------------------
142
+ console.log('\n5. Testing empty argument call...');
143
+ const res5 = await toolFn({}, { authInfo: {} });
144
+ check(res5.isError === true, 'Empty argument call returns error');
145
+ check(res5.content[0].text.includes('discover_adjacent_trends requires either'), 'Error contains helpful guidance');
146
+ console.log(`\nResults: ${passed} passed, ${failed} failed`);
147
+ if (failed > 0)
148
+ process.exit(1);
149
+ }
150
+ runTests().catch(err => {
151
+ console.error('Test execution failed:', err);
152
+ process.exit(1);
153
+ });
154
+ //# sourceMappingURL=test_adjacent_trends_polymorphic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_adjacent_trends_polymorphic.js","sourceRoot":"","sources":["../src/test_adjacent_trends_polymorphic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test_book_a_call_live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_book_a_call_live.d.ts","sourceRoot":"","sources":["../src/test_book_a_call_live.ts"],"names":[],"mappings":""}
@@ -0,0 +1,161 @@
1
+ import { createServer } from './toolHandlers.js';
2
+ import axios from 'axios';
3
+ import crypto from 'crypto';
4
+ import assert from 'assert';
5
+ import dotenv from 'dotenv';
6
+ dotenv.config();
7
+ const SECRET = process.env.FODDA_MCP_SECRET || '';
8
+ const API_KEY = process.env.FODDA_API_KEY || process.env.FODDA_INTERNAL_API_KEY || 'sk_live_abcdef';
9
+ const BASE_URL = process.env.FODDA_API_URL || 'https://api.fodda.ai';
10
+ // Call the real Fodda API backend using HMAC signing
11
+ async function liveFoddaBackend(method, endpoint, apiKey, userId, body) {
12
+ const url = `${BASE_URL}${endpoint}`;
13
+ const timestamp = Date.now().toString();
14
+ const payload = (method === 'POST' || method === 'PATCH')
15
+ ? timestamp + '.' + JSON.stringify(body ?? {})
16
+ : timestamp + '.' + endpoint;
17
+ const signature = crypto.createHmac('sha256', SECRET).update(payload).digest('hex');
18
+ const headers = {
19
+ 'Content-Type': 'application/json',
20
+ 'X-Fodda-Source': 'mcp',
21
+ 'X-API-Key': apiKey || API_KEY,
22
+ 'X-Fodda-Timestamp': timestamp,
23
+ 'X-Fodda-Signature': signature
24
+ };
25
+ const res = await axios({
26
+ method,
27
+ url,
28
+ headers,
29
+ data: body,
30
+ timeout: 90000
31
+ });
32
+ return res.data;
33
+ }
34
+ async function runBookACallVerification() {
35
+ console.log('================================================================');
36
+ console.log(' RUNNING VERIFICATION: Human Agent Book-a-Call & Plain Language');
37
+ console.log('================================================================\n');
38
+ const server = await createServer(API_KEY, 'user_test_book_a_call', liveFoddaBackend, async () => ({}), () => '', () => 'https://mcp.fodda.ai');
39
+ const tools = server._registeredTools;
40
+ // ─────────────────────────────────────────────────────────────
41
+ // TEST 1: list_analysts Output Whitelisting & Payload Size
42
+ // ─────────────────────────────────────────────────────────────
43
+ console.log('--- TEST 1: list_analysts Whitelist Projection ---');
44
+ const listAnalystsFn = tools['list_analysts'].handler || tools['list_analysts'].callback || tools['list_analysts'].execute;
45
+ const listRes = await listAnalystsFn({}, { authInfo: {} });
46
+ const listText = listRes.content?.[0]?.text || '';
47
+ const parsedList = JSON.parse(listText);
48
+ const analysts = parsedList.analysts || [];
49
+ console.log(`Retrieved ${analysts.length} analysts from list_analysts.`);
50
+ console.log(`list_analysts serialized JSON byte length: ${Buffer.byteLength(listText, 'utf8')} bytes`);
51
+ assert.ok(analysts.length > 0, 'No analysts returned from list_analysts');
52
+ for (const a of analysts) {
53
+ // Required whitelisted keys
54
+ assert.ok(a.analyst_id, `Analyst missing analyst_id: ${JSON.stringify(a)}`);
55
+ assert.ok(a.name, `Analyst missing name: ${JSON.stringify(a)}`);
56
+ assert.ok(a.type, `Analyst missing type: ${JSON.stringify(a)}`);
57
+ assert.ok(a.consult_tool, `Analyst missing consult_tool: ${JSON.stringify(a)}`);
58
+ // Banned leaked keys from raw Airtable dump
59
+ assert.strictEqual(a.voiceProfile, undefined, `Analyst ${a.name} leaked raw voiceProfile`);
60
+ assert.strictEqual(a.expertCard, undefined, `Analyst ${a.name} leaked raw expertCard`);
61
+ assert.strictEqual(a.systemInstructions, undefined, `Analyst ${a.name} leaked raw systemInstructions`);
62
+ assert.strictEqual(a.signatureInsights, undefined, `Analyst ${a.name} leaked raw signatureInsights`);
63
+ assert.strictEqual(a.imageUrl, undefined, `Analyst ${a.name} leaked raw imageUrl`);
64
+ assert.strictEqual(a.portraitUrl, undefined, `Analyst ${a.name} leaked raw portraitUrl`);
65
+ assert.strictEqual(a.dateCreated, undefined, `Analyst ${a.name} leaked raw dateCreated`);
66
+ assert.strictEqual(a.dateLastUpdated, undefined, `Analyst ${a.name} leaked raw dateLastUpdated`);
67
+ assert.strictEqual(a.askLine, undefined, `Analyst ${a.name} leaked raw askLine (must be what_they_offer)`);
68
+ assert.strictEqual(a.blindSpots, undefined, `Analyst ${a.name} leaked raw blindSpots (must be outside_their_lane)`);
69
+ }
70
+ const jeremyInList = analysts.find((a) => a.analyst_id.includes('jeremy') || a.name.includes('Jeremy'));
71
+ assert.ok(jeremyInList, 'Jeremy Bergstein not found in list_analysts');
72
+ console.log('Jeremy Bergstein projected record in list_analysts:');
73
+ console.log(JSON.stringify(jeremyInList, null, 2));
74
+ if (jeremyInList.book_a_call) {
75
+ assert.ok(jeremyInList.book_a_call.url, 'Jeremy book_a_call missing url');
76
+ assert.ok(jeremyInList.book_a_call.rate_display, 'Jeremy book_a_call missing rate_display');
77
+ console.log(`✅ PASS: Jeremy book_a_call present in list_analysts -> rate: "${jeremyInList.book_a_call.rate_display}", url: "${jeremyInList.book_a_call.url}"`);
78
+ }
79
+ else {
80
+ console.log('ℹ️ NOTE: /v1/human-agents returned null for Jeremy book_a_call on current API revision.');
81
+ }
82
+ console.log('✅ PASS: list_analysts whitelisting verified with zero leaked internal keys.\n');
83
+ // ─────────────────────────────────────────────────────────────
84
+ // TEST 2: consult_human_agent with book_a_call set (Jeremy Bergstein)
85
+ // ─────────────────────────────────────────────────────────────
86
+ console.log('--- TEST 2: consult_human_agent for Jeremy Bergstein (book_a_call present) ---');
87
+ const consultFn = tools['consult_human_agent'].handler || tools['consult_human_agent'].callback || tools['consult_human_agent'].execute;
88
+ const jeremyConsultRes = await consultFn({
89
+ analyst_id: 'jeremy-bergstein-science-education-innovation',
90
+ query: 'how can I hire Jeremy for some consulting?'
91
+ }, { authInfo: {} });
92
+ console.log('Response top-level keys:', Object.keys(jeremyConsultRes));
93
+ console.log('Response coverage:', jeremyConsultRes.coverage);
94
+ console.log('Response book_a_call:', JSON.stringify(jeremyConsultRes.book_a_call));
95
+ console.log('Response analyst:', JSON.stringify(jeremyConsultRes.analyst));
96
+ const jeremyText = jeremyConsultRes.content?.[0]?.text || '';
97
+ console.log('\nRendered text output snippet:');
98
+ console.log(jeremyText.slice(0, 400));
99
+ if (jeremyConsultRes.book_a_call) {
100
+ assert.ok(jeremyConsultRes.book_a_call.url, 'Missing url in consult book_a_call');
101
+ assert.ok(typeof jeremyConsultRes.book_a_call.rate_display === 'string' && jeremyConsultRes.book_a_call.rate_display.length > 0, 'Missing or empty rate_display');
102
+ assert.ok(jeremyText.includes('--- BOOK A CALL:'), 'Rendered text does not include --- BOOK A CALL: marker');
103
+ console.log(`✅ PASS: Top-level book_a_call has verbatim rate_display "${jeremyConsultRes.book_a_call.rate_display}" and url "${jeremyConsultRes.book_a_call.url}"`);
104
+ }
105
+ else {
106
+ console.log('ℹ️ NOTE: Upstream API returned null for Jeremy book_a_call.');
107
+ }
108
+ console.log('✅ PASS: consult_human_agent for Jeremy Bergstein returned expected envelope.\n');
109
+ // ─────────────────────────────────────────────────────────────
110
+ // TEST 3: consult_human_agent with book_a_call present (James Colistra)
111
+ // ─────────────────────────────────────────────────────────────
112
+ console.log('--- TEST 3: consult_human_agent for James Colistra (book_a_call populated) ---');
113
+ const jamesConsultRes = await consultFn({
114
+ analyst_id: 'james-colistra-earned-media-and-podcast',
115
+ query: 'how could i hire James for some consulting!'
116
+ }, { authInfo: {} });
117
+ console.log('James response book_a_call:', JSON.stringify(jamesConsultRes.book_a_call));
118
+ assert.ok(jamesConsultRes.book_a_call, 'James book_a_call should be populated');
119
+ assert.strictEqual(jamesConsultRes.book_a_call.rate_display, '$250/hr', 'James book_a_call rate_display must be $250/hr');
120
+ assert.strictEqual(jamesConsultRes.book_a_call.url, 'https://meetings-na2.hubspot.com/james-colistra/introcall', 'James book_a_call url mismatch');
121
+ console.log('✅ PASS: James Colistra consult returned book_a_call populated as expected.\n');
122
+ // ─────────────────────────────────────────────────────────────
123
+ // TEST 3B: consult_human_agent with book_a_call null (Peter Abraham - no bookURL)
124
+ // ─────────────────────────────────────────────────────────────
125
+ console.log('--- TEST 3B: consult_human_agent for Peter Abraham (book_a_call null) ---');
126
+ const peterConsultRes = await consultFn({
127
+ analyst_id: 'peter-abraham-bicycles-cycling',
128
+ query: 'how could i book a call with Peter?'
129
+ }, { authInfo: {} });
130
+ console.log('Peter response book_a_call:', peterConsultRes.book_a_call);
131
+ assert.strictEqual(peterConsultRes.book_a_call, null, 'Peter book_a_call should be null');
132
+ console.log('✅ PASS: Peter Abraham consult returned book_a_call: null as expected.\n');
133
+ // ─────────────────────────────────────────────────────────────
134
+ // TEST 4: Grep for Leaked Internal Field Names & Slugs in Text
135
+ // ─────────────────────────────────────────────────────────────
136
+ console.log('--- TEST 4: Zero Internal Field Names or Slugs Leaked in Prose ---');
137
+ const bannedInternalKeys = ['askLine', 'blindSpots', 'signatureInsights', 'exampleQueries', 'voiceProfile', 'expertCard', 'systemInstructions'];
138
+ const bannedToolsInProse = ['request_deliverable', 'consult_human_agent', 'list_analysts'];
139
+ const bannedTechnicalSlugsInProse = ['peter-abraham-bicycles-cycling', 'anu-lingala-macro', 'ben-dietz-sic'];
140
+ // 4A: Check list_analysts JSON for banned internal keys
141
+ for (const key of bannedInternalKeys) {
142
+ assert.ok(!listText.includes(`"${key}"`), `Found leaked internal field name key: "${key}" in list_analysts JSON!`);
143
+ }
144
+ // 4B: Check consult prose output for leaked field names and tool names
145
+ const consultProse = `${jeremyText}\n${jamesConsultRes.content?.[0]?.text || ''}`;
146
+ for (const key of bannedInternalKeys) {
147
+ assert.ok(!consultProse.includes(key), `Found leaked internal field name: "${key}" in consult prose!`);
148
+ }
149
+ for (const toolName of bannedToolsInProse) {
150
+ assert.ok(!consultProse.includes(toolName), `Found leaked tool name: "${toolName}" in consult prose!`);
151
+ }
152
+ console.log('✅ PASS: Verified zero occurrences of internal field names or tool names in consult output.\n');
153
+ console.log('================================================================');
154
+ console.log(' ALL BOOK-A-CALL AND PLAIN-LANGUAGE TESTS PASSED SUCCESSFULLY! ');
155
+ console.log('================================================================');
156
+ }
157
+ runBookACallVerification().catch(err => {
158
+ console.error('❌ Verification failed:', err.response?.data || err.message || err);
159
+ process.exit(1);
160
+ });
161
+ //# sourceMappingURL=test_book_a_call_live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_book_a_call_live.js","sourceRoot":"","sources":["../src/test_book_a_call_live.ts"],"names":[],"mappings":"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"}
@@ -4,8 +4,8 @@ async function runVerification() {
4
4
  console.log('=== Scoped Endpoints & Discovery Verification ===');
5
5
  // 1. Verify OFFERING_SCOPED_TOOLS map
6
6
  const brandTools = OFFERING_SCOPED_TOOLS['brand-intelligence'];
7
- if (!brandTools || brandTools.length !== 12) {
8
- throw new Error(`Expected 12 tools for brand-intelligence, got ${brandTools?.length}`);
7
+ if (!brandTools || brandTools.length !== 13) {
8
+ throw new Error(`Expected 13 tools for brand-intelligence, got ${brandTools?.length}`);
9
9
  }
10
10
  if (!brandTools.includes('brand_tracker') || !brandTools.includes('search_graph')) {
11
11
  throw new Error('Missing primary tools in brand-intelligence scope');
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test_byo_mcp_submission_clarity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_byo_mcp_submission_clarity.d.ts","sourceRoot":"","sources":["../src/test_byo_mcp_submission_clarity.ts"],"names":[],"mappings":""}
@@ -0,0 +1,142 @@
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 { STATIC_BEHAVIORAL_RULES } from './systemPrompt.js';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+ console.log('=== Running BYO-MCP Submission Clarity & Ghosting Prevention Verification ===\n');
9
+ let passed = 0;
10
+ let failed = 0;
11
+ function check(condition, msg) {
12
+ if (condition) {
13
+ console.log(` ✅ ${msg}`);
14
+ passed++;
15
+ }
16
+ else {
17
+ console.error(` ❌ ${msg}`);
18
+ failed++;
19
+ }
20
+ }
21
+ // ---------------------------------------------------------------------------
22
+ // 1. Invariant Grep Check: Zero occurrences of misleading persistence copy
23
+ // ---------------------------------------------------------------------------
24
+ console.log('1. Verifying Zero Misleading Persistence Copy in Source Files...');
25
+ const projectRoot = path.resolve(__dirname, '..');
26
+ const srcDir = fs.existsSync(path.resolve(__dirname, 'systemPrompt.ts')) ? __dirname : path.resolve(projectRoot, 'src');
27
+ const systemPromptPath = path.resolve(srcDir, 'systemPrompt.ts');
28
+ const toolHandlersPath = path.resolve(srcDir, 'toolHandlers.ts');
29
+ const systemPromptContent = fs.readFileSync(systemPromptPath, 'utf8');
30
+ const toolHandlersContent = fs.readFileSync(toolHandlersPath, 'utf8');
31
+ const forbiddenPhrases = [
32
+ 'nothing is saved to fodda until you complete all',
33
+ 'progress lives only in this conversation',
34
+ 'held in this chat session until final submit',
35
+ 'is recorded when you connect it',
36
+ 'recorded when you connect it'
37
+ ];
38
+ for (const phrase of forbiddenPhrases) {
39
+ const spCount = (systemPromptContent.toLowerCase().match(new RegExp(phrase, 'g')) || []).length;
40
+ const thCount = (toolHandlersContent.toLowerCase().match(new RegExp(phrase, 'g')) || []).length;
41
+ check(spCount === 0, `Zero occurrences of "${phrase}" in systemPrompt.ts (found ${spCount})`);
42
+ check(thCount === 0, `Zero occurrences of "${phrase}" in toolHandlers.ts (found ${thCount})`);
43
+ }
44
+ // ---------------------------------------------------------------------------
45
+ // 2. System Prompt Guardrails & Behavioral Rules Verification
46
+ // ---------------------------------------------------------------------------
47
+ console.log('\n2. Verifying System Prompt BYO-MCP Rules & Guardrails...');
48
+ check(STATIC_BEHAVIORAL_RULES.includes('NEVER CLAIM SUBMISSION OR REVIEW STATUS WITHOUT TOOL EXECUTION'), 'STATIC_BEHAVIORAL_RULES contains strict negative constraint header against premature completion claims');
49
+ check(STATIC_BEHAVIORAL_RULES.includes('finalize_byo_mcp_onboarding has actually returned { status: \'submitted_for_review\' }'), 'Prompt requires finalize_byo_mcp_onboarding to return status: submitted_for_review before claiming submission');
50
+ check(STATIC_BEHAVIORAL_RULES.includes('Your profile is saved once you accept the terms. Your MCP connection is only checked, not saved, until you submit at the end.'), 'Prompt contains honest persistence demarcation for BYO-MCP branch');
51
+ check(STATIC_BEHAVIORAL_RULES.includes('Your MCP connection is only checked, not saved, until final submission.'), 'Prompt contains honest pause/interruption copy for BYO-MCP branch');
52
+ check(STATIC_BEHAVIORAL_RULES.includes('STREAMLINED BYO-MCP EXECUTION PATH:'), 'Prompt defines STREAMLINED BYO-MCP EXECUTION PATH section');
53
+ check(STATIC_BEHAVIORAL_RULES.includes('https://www.fodda.ai/terms') && STATIC_BEHAVIORAL_RULES.includes('https://www.fodda.ai/privacy'), 'Prompt explicitly specifies the exact Terms of Service acceptance confirmation links');
54
+ // ---------------------------------------------------------------------------
55
+ // 3. Tool Handlers Copy & Next-Step Guidance Verification
56
+ // ---------------------------------------------------------------------------
57
+ console.log('\n3. Verifying Tool Handlers Guidance...');
58
+ // begin_expert_onboarding introText
59
+ check(toolHandlersContent.includes('Your profile is saved once you accept the terms. Your MCP connection is only checked, not saved, until you submit at the end.'), 'begin_expert_onboarding introText contains honest BYO-MCP persistence copy');
60
+ // submit_mcp_source next_step guidance
61
+ check(toolHandlersContent.includes('finalize_byo_mcp_onboarding') &&
62
+ toolHandlersContent.includes("Your MCP connection is only checked, not saved, until you submit at the end."), 'submit_mcp_source statusText directs the agent to confirm topics and submit for review');
63
+ // finalize_byo_mcp_onboarding description
64
+ check(toolHandlersContent.includes('Profile is saved once terms are accepted; MCP details are verified and submitted for review here.'), 'finalize_byo_mcp_onboarding tool description declares profile saved on terms acceptance and MCP submitted for review');
65
+ // submit_basic_info termsAccepted gate
66
+ check(toolHandlersContent.includes('Explicit acceptance required: The expert must review and agree to the Fodda Terms of Service'), 'submit_basic_info rejects with explicit prompt when termsAccepted is not true');
67
+ // ---------------------------------------------------------------------------
68
+ // 4. Simulated Agent Transcript Guardrail Verification
69
+ // ---------------------------------------------------------------------------
70
+ console.log('\n4. Verifying Transcript Simulation Guardrails...');
71
+ function validateAgentMessage(state, agentMessage) {
72
+ const prematureSubmissionPhrases = [
73
+ /submitted for review/i,
74
+ /profile has been submitted/i,
75
+ /recorded your url/i,
76
+ /sent for administrative review/i,
77
+ /profile is submitted/i
78
+ ];
79
+ if (!state.finalized || state.finalizationStatus !== 'submitted_for_review') {
80
+ for (const pattern of prematureSubmissionPhrases) {
81
+ if (pattern.test(agentMessage)) {
82
+ return {
83
+ valid: false,
84
+ reason: `Violation: Agent claimed submission/recording ("${agentMessage.match(pattern)?.[0]}") before finalize_byo_mcp_onboarding succeeded.`
85
+ };
86
+ }
87
+ }
88
+ }
89
+ if (state.mcpConnected && !state.termsAccepted && !state.finalized) {
90
+ // Agent must prompt for terms acceptance
91
+ const termsMentioned = agentMessage.includes('https://www.fodda.ai/terms') && agentMessage.includes('https://www.fodda.ai/privacy');
92
+ if (!termsMentioned) {
93
+ return {
94
+ valid: false,
95
+ reason: 'Violation: Agent did not prompt for explicit Terms of Service and Privacy Policy acceptance after MCP probe.'
96
+ };
97
+ }
98
+ }
99
+ return { valid: true };
100
+ }
101
+ // Scenario A: The Steve Bryant Incident Hallucination Simulation
102
+ const statePreToolExecution = {
103
+ step: 'mcp_shared_in_chat',
104
+ mcpConnected: false,
105
+ termsAccepted: false,
106
+ finalized: false
107
+ };
108
+ const hallucinatedResponse = "Great Steve! I have recorded your MCP endpoint https://games.thisisdelightful.com/mcp and your Human Agent profile has been submitted for review!";
109
+ const validationA = validateAgentMessage(statePreToolExecution, hallucinatedResponse);
110
+ check(!validationA.valid && Boolean(validationA.reason?.includes('Violation: Agent claimed submission/recording')), 'Premature completion claim without tool execution is correctly flagged as a guardrail violation');
111
+ // Scenario B: Correct Multi-Step Execution with Terms Acceptance
112
+ const stateProbed = {
113
+ step: 'mcp_connected',
114
+ mcpConnected: true,
115
+ termsAccepted: false,
116
+ finalized: false
117
+ };
118
+ const compliantStepResponse = [
119
+ "✅ **MCP Endpoint Connected & Verified**: `https://games.thisisdelightful.com/mcp`",
120
+ "• **Discovered Tools (4)**: fetch_game_trends, get_platform_shares, list_studio_reports, analyze_monetization",
121
+ "• **Discovered Expertise Topics**: Video Games Industry, Game Monetization, Platform Strategy, Indie Game Development",
122
+ "",
123
+ "To complete submission, please confirm that you accept the Fodda Terms of Service (https://www.fodda.ai/terms) and Privacy Policy (https://www.fodda.ai/privacy)."
124
+ ].join('\n');
125
+ const validationB = validateAgentMessage(stateProbed, compliantStepResponse);
126
+ check(validationB.valid, 'Compliant response displaying discovered tools and requesting explicit Terms acceptance passes validation');
127
+ // Scenario C: Finalization Execution
128
+ const stateFinalized = {
129
+ step: 'onboarding_complete',
130
+ mcpConnected: true,
131
+ termsAccepted: true,
132
+ finalized: true,
133
+ finalizationStatus: 'submitted_for_review'
134
+ };
135
+ const compliantFinalResponse = "🎉 **Human Agent Submission Received!** Your Human Agent profile for Steve Bryant has been submitted for review.";
136
+ const validationC = validateAgentMessage(stateFinalized, compliantFinalResponse);
137
+ check(validationC.valid, 'Post-finalization message declaring submitted_for_review passes validation');
138
+ console.log(`\nVerification Summary: ${passed} passed, ${failed} failed.`);
139
+ if (failed > 0) {
140
+ process.exit(1);
141
+ }
142
+ //# sourceMappingURL=test_byo_mcp_submission_clarity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_byo_mcp_submission_clarity.js","sourceRoot":"","sources":["../src/test_byo_mcp_submission_clarity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test_capabilities_guidance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_capabilities_guidance.d.ts","sourceRoot":"","sources":["../src/test_capabilities_guidance.ts"],"names":[],"mappings":""}