fodda-mcp 1.46.31 → 1.46.97

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/README.md +14 -94
  2. package/dist/agents/fodda-researcher/skills.d.ts +1 -1
  3. package/dist/agents/fodda-researcher/skills.d.ts.map +1 -1
  4. package/dist/agents/fodda-researcher/skills.js +1 -1
  5. package/dist/brandTemplate.d.ts +1 -1
  6. package/dist/brandTemplate.d.ts.map +1 -1
  7. package/dist/brandTemplate.js +162 -74
  8. package/dist/brandTemplate.js.map +1 -1
  9. package/dist/catalogCache.d.ts +29 -1
  10. package/dist/catalogCache.d.ts.map +1 -1
  11. package/dist/catalogCache.js +267 -16
  12. package/dist/catalogCache.js.map +1 -1
  13. package/dist/coverageRelevance.d.ts +97 -2
  14. package/dist/coverageRelevance.d.ts.map +1 -1
  15. package/dist/coverageRelevance.js +959 -164
  16. package/dist/coverageRelevance.js.map +1 -1
  17. package/dist/editorialFill.d.ts +5 -0
  18. package/dist/editorialFill.d.ts.map +1 -1
  19. package/dist/editorialFill.js +1 -1
  20. package/dist/editorialFill.js.map +1 -1
  21. package/dist/enrichment.d.ts +26 -0
  22. package/dist/enrichment.d.ts.map +1 -1
  23. package/dist/enrichment.js +394 -31
  24. package/dist/enrichment.js.map +1 -1
  25. package/dist/errorHandling.d.ts +35 -7
  26. package/dist/errorHandling.d.ts.map +1 -1
  27. package/dist/errorHandling.js +225 -155
  28. package/dist/errorHandling.js.map +1 -1
  29. package/dist/index.d.ts +25 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +351 -143
  32. package/dist/index.js.map +1 -1
  33. package/dist/jobs/jlens_quarterly_sweep.d.ts +62 -0
  34. package/dist/jobs/jlens_quarterly_sweep.d.ts.map +1 -0
  35. package/dist/jobs/jlens_quarterly_sweep.js +160 -0
  36. package/dist/jobs/jlens_quarterly_sweep.js.map +1 -0
  37. package/dist/pricingCache.d.ts.map +1 -1
  38. package/dist/pricingCache.js +41 -1
  39. package/dist/pricingCache.js.map +1 -1
  40. package/dist/queryCache.d.ts.map +1 -1
  41. package/dist/queryCache.js +2 -0
  42. package/dist/queryCache.js.map +1 -1
  43. package/dist/reportBriefing.d.ts +89 -0
  44. package/dist/reportBriefing.d.ts.map +1 -0
  45. package/dist/reportBriefing.js +662 -0
  46. package/dist/reportBriefing.js.map +1 -0
  47. package/dist/searchTemplate.d.ts.map +1 -1
  48. package/dist/searchTemplate.js +65 -53
  49. package/dist/searchTemplate.js.map +1 -1
  50. package/dist/services/graphRouter.d.ts +7 -0
  51. package/dist/services/graphRouter.d.ts.map +1 -0
  52. package/dist/services/graphRouter.js +7 -0
  53. package/dist/services/graphRouter.js.map +1 -0
  54. package/dist/services/notifications.d.ts +49 -0
  55. package/dist/services/notifications.d.ts.map +1 -0
  56. package/dist/services/notifications.js +206 -0
  57. package/dist/services/notifications.js.map +1 -0
  58. package/dist/sessionTracker.d.ts +19 -2
  59. package/dist/sessionTracker.d.ts.map +1 -1
  60. package/dist/sessionTracker.js +69 -16
  61. package/dist/sessionTracker.js.map +1 -1
  62. package/dist/skillClient.d.ts.map +1 -1
  63. package/dist/skillClient.js +11 -6
  64. package/dist/skillClient.js.map +1 -1
  65. package/dist/svgVisuals.d.ts +17 -19
  66. package/dist/svgVisuals.d.ts.map +1 -1
  67. package/dist/svgVisuals.js +189 -233
  68. package/dist/svgVisuals.js.map +1 -1
  69. package/dist/systemPrompt.d.ts +7 -2
  70. package/dist/systemPrompt.d.ts.map +1 -1
  71. package/dist/systemPrompt.js +110 -68
  72. package/dist/systemPrompt.js.map +1 -1
  73. package/dist/telemetry.d.ts.map +1 -1
  74. package/dist/telemetry.js +15 -0
  75. package/dist/telemetry.js.map +1 -1
  76. package/dist/test_adjacent_trends_polymorphic.d.ts +2 -0
  77. package/dist/test_adjacent_trends_polymorphic.d.ts.map +1 -0
  78. package/dist/test_adjacent_trends_polymorphic.js +154 -0
  79. package/dist/test_adjacent_trends_polymorphic.js.map +1 -0
  80. package/dist/test_book_a_call_live.js +18 -5
  81. package/dist/test_book_a_call_live.js.map +1 -1
  82. package/dist/test_byo_mcp_submission_clarity.d.ts +2 -0
  83. package/dist/test_byo_mcp_submission_clarity.d.ts.map +1 -0
  84. package/dist/test_byo_mcp_submission_clarity.js +142 -0
  85. package/dist/test_byo_mcp_submission_clarity.js.map +1 -0
  86. package/dist/test_capabilities_guidance.d.ts +2 -0
  87. package/dist/test_capabilities_guidance.d.ts.map +1 -0
  88. package/dist/test_capabilities_guidance.js +372 -0
  89. package/dist/test_capabilities_guidance.js.map +1 -0
  90. package/dist/test_client_provenance.d.ts +2 -0
  91. package/dist/test_client_provenance.d.ts.map +1 -0
  92. package/dist/test_client_provenance.js +77 -0
  93. package/dist/test_client_provenance.js.map +1 -0
  94. package/dist/test_connection_surface_cleanup.d.ts +2 -0
  95. package/dist/test_connection_surface_cleanup.d.ts.map +1 -0
  96. package/dist/test_connection_surface_cleanup.js +203 -0
  97. package/dist/test_connection_surface_cleanup.js.map +1 -0
  98. package/dist/test_consult_routing.d.ts +2 -0
  99. package/dist/test_consult_routing.d.ts.map +1 -0
  100. package/dist/test_consult_routing.js +86 -0
  101. package/dist/test_consult_routing.js.map +1 -0
  102. package/dist/test_consult_split.d.ts +2 -0
  103. package/dist/test_consult_split.d.ts.map +1 -0
  104. package/dist/test_consult_split.js +30 -0
  105. package/dist/test_consult_split.js.map +1 -0
  106. package/dist/test_coverage_relevance.js +111 -70
  107. package/dist/test_coverage_relevance.js.map +1 -1
  108. package/dist/test_coverage_replay.d.ts +2 -0
  109. package/dist/test_coverage_replay.d.ts.map +1 -0
  110. package/dist/test_coverage_replay.js +170 -0
  111. package/dist/test_coverage_replay.js.map +1 -0
  112. package/dist/test_dcr_and_legacy_deprecation.js +45 -50
  113. package/dist/test_dcr_and_legacy_deprecation.js.map +1 -1
  114. package/dist/test_demand_signal_logging.d.ts +2 -0
  115. package/dist/test_demand_signal_logging.d.ts.map +1 -0
  116. package/dist/test_demand_signal_logging.js +92 -0
  117. package/dist/test_demand_signal_logging.js.map +1 -0
  118. package/dist/test_earnings_activity_scope.d.ts +5 -0
  119. package/dist/test_earnings_activity_scope.d.ts.map +1 -0
  120. package/dist/test_earnings_activity_scope.js +101 -0
  121. package/dist/test_earnings_activity_scope.js.map +1 -0
  122. package/dist/test_earnings_divergence_live.d.ts +5 -0
  123. package/dist/test_earnings_divergence_live.d.ts.map +1 -0
  124. package/dist/test_earnings_divergence_live.js +135 -0
  125. package/dist/test_earnings_divergence_live.js.map +1 -0
  126. package/dist/test_earnings_hygiene_and_binding.d.ts +5 -0
  127. package/dist/test_earnings_hygiene_and_binding.d.ts.map +1 -0
  128. package/dist/test_earnings_hygiene_and_binding.js +104 -0
  129. package/dist/test_earnings_hygiene_and_binding.js.map +1 -0
  130. package/dist/test_exec_quotes_render.d.ts +2 -0
  131. package/dist/test_exec_quotes_render.d.ts.map +1 -0
  132. package/dist/test_exec_quotes_render.js +86 -0
  133. package/dist/test_exec_quotes_render.js.map +1 -0
  134. package/dist/test_expert_intro.d.ts +2 -0
  135. package/dist/test_expert_intro.d.ts.map +1 -0
  136. package/dist/test_expert_intro.js +57 -0
  137. package/dist/test_expert_intro.js.map +1 -0
  138. package/dist/test_expert_layer.d.ts +11 -0
  139. package/dist/test_expert_layer.d.ts.map +1 -0
  140. package/dist/test_expert_layer.js +356 -0
  141. package/dist/test_expert_layer.js.map +1 -0
  142. package/dist/test_gap_alert.js +8 -0
  143. package/dist/test_gap_alert.js.map +1 -1
  144. package/dist/test_grok_offering_surfaces.d.ts +2 -0
  145. package/dist/test_grok_offering_surfaces.d.ts.map +1 -0
  146. package/dist/test_grok_offering_surfaces.js +155 -0
  147. package/dist/test_grok_offering_surfaces.js.map +1 -0
  148. package/dist/test_human_agent_live.d.ts +2 -0
  149. package/dist/test_human_agent_live.d.ts.map +1 -0
  150. package/dist/test_human_agent_live.js +48 -0
  151. package/dist/test_human_agent_live.js.map +1 -0
  152. package/dist/test_identity_gap.d.ts +2 -0
  153. package/dist/test_identity_gap.d.ts.map +1 -0
  154. package/dist/test_identity_gap.js +171 -0
  155. package/dist/test_identity_gap.js.map +1 -0
  156. package/dist/test_intelligence_and_verifier.d.ts +17 -0
  157. package/dist/test_intelligence_and_verifier.d.ts.map +1 -0
  158. package/dist/test_intelligence_and_verifier.js +162 -0
  159. package/dist/test_intelligence_and_verifier.js.map +1 -0
  160. package/dist/test_latency_mcp_brief5.d.ts +12 -0
  161. package/dist/test_latency_mcp_brief5.d.ts.map +1 -0
  162. package/dist/test_latency_mcp_brief5.js +200 -0
  163. package/dist/test_latency_mcp_brief5.js.map +1 -0
  164. package/dist/test_limit_and_credit_card_capture.d.ts +21 -0
  165. package/dist/test_limit_and_credit_card_capture.d.ts.map +1 -0
  166. package/dist/test_limit_and_credit_card_capture.js +216 -0
  167. package/dist/test_limit_and_credit_card_capture.js.map +1 -0
  168. package/dist/test_list_graphs_topics.js +1 -1
  169. package/dist/test_list_graphs_topics.js.map +1 -1
  170. package/dist/test_live_deployed_mcp_search.d.ts +2 -0
  171. package/dist/test_live_deployed_mcp_search.d.ts.map +1 -0
  172. package/dist/test_live_deployed_mcp_search.js +85 -0
  173. package/dist/test_live_deployed_mcp_search.js.map +1 -0
  174. package/dist/test_live_deployed_split.d.ts +2 -0
  175. package/dist/test_live_deployed_split.d.ts.map +1 -0
  176. package/dist/test_live_deployed_split.js +72 -0
  177. package/dist/test_live_deployed_split.js.map +1 -0
  178. package/dist/test_live_endpoint_runner.js +2 -2
  179. package/dist/test_live_endpoint_runner.js.map +1 -1
  180. package/dist/test_live_mcp.js +1 -1
  181. package/dist/test_live_mcp.js.map +1 -1
  182. package/dist/test_live_neil_widget.d.ts +2 -0
  183. package/dist/test_live_neil_widget.d.ts.map +1 -0
  184. package/dist/test_live_neil_widget.js +84 -0
  185. package/dist/test_live_neil_widget.js.map +1 -0
  186. package/dist/test_longpoll_status.d.ts +2 -0
  187. package/dist/test_longpoll_status.d.ts.map +1 -0
  188. package/dist/test_longpoll_status.js +117 -0
  189. package/dist/test_longpoll_status.js.map +1 -0
  190. package/dist/test_mcp_find_expert_and_vocabulary_routing.d.ts +2 -0
  191. package/dist/test_mcp_find_expert_and_vocabulary_routing.d.ts.map +1 -0
  192. package/dist/test_mcp_find_expert_and_vocabulary_routing.js +130 -0
  193. package/dist/test_mcp_find_expert_and_vocabulary_routing.js.map +1 -0
  194. package/dist/test_next_moves.js +644 -279
  195. package/dist/test_next_moves.js.map +1 -1
  196. package/dist/test_next_moves_transcripts.js +122 -40
  197. package/dist/test_next_moves_transcripts.js.map +1 -1
  198. package/dist/test_on_request_caller_identity.d.ts +13 -0
  199. package/dist/test_on_request_caller_identity.d.ts.map +1 -0
  200. package/dist/test_on_request_caller_identity.js +131 -0
  201. package/dist/test_on_request_caller_identity.js.map +1 -0
  202. package/dist/test_on_request_intercept.d.ts +10 -0
  203. package/dist/test_on_request_intercept.d.ts.map +1 -0
  204. package/dist/test_on_request_intercept.js +95 -0
  205. package/dist/test_on_request_intercept.js.map +1 -0
  206. package/dist/test_onboarding_consent_and_errors.d.ts +2 -0
  207. package/dist/test_onboarding_consent_and_errors.d.ts.map +1 -0
  208. package/dist/test_onboarding_consent_and_errors.js +110 -0
  209. package/dist/test_onboarding_consent_and_errors.js.map +1 -0
  210. package/dist/test_onboarding_live_scenarios.d.ts +2 -0
  211. package/dist/test_onboarding_live_scenarios.d.ts.map +1 -0
  212. package/dist/test_onboarding_live_scenarios.js +189 -0
  213. package/dist/test_onboarding_live_scenarios.js.map +1 -0
  214. package/dist/test_referral_live.d.ts +2 -0
  215. package/dist/test_referral_live.d.ts.map +1 -0
  216. package/dist/test_referral_live.js +33 -0
  217. package/dist/test_referral_live.js.map +1 -0
  218. package/dist/test_referral_piers.d.ts +2 -0
  219. package/dist/test_referral_piers.d.ts.map +1 -0
  220. package/dist/test_referral_piers.js +33 -0
  221. package/dist/test_referral_piers.js.map +1 -0
  222. package/dist/test_report_editorial_briefing.d.ts +21 -0
  223. package/dist/test_report_editorial_briefing.d.ts.map +1 -0
  224. package/dist/test_report_editorial_briefing.js +356 -0
  225. package/dist/test_report_editorial_briefing.js.map +1 -0
  226. package/dist/test_search_graph_quality.d.ts +2 -0
  227. package/dist/test_search_graph_quality.d.ts.map +1 -0
  228. package/dist/test_search_graph_quality.js +493 -0
  229. package/dist/test_search_graph_quality.js.map +1 -0
  230. package/dist/test_service_to_service_auth.d.ts +2 -0
  231. package/dist/test_service_to_service_auth.d.ts.map +1 -0
  232. package/dist/test_service_to_service_auth.js +199 -0
  233. package/dist/test_service_to_service_auth.js.map +1 -0
  234. package/dist/test_sources_live.d.ts +2 -0
  235. package/dist/test_sources_live.d.ts.map +1 -0
  236. package/dist/test_sources_live.js +30 -0
  237. package/dist/test_sources_live.js.map +1 -0
  238. package/dist/test_specialist_and_analyst_tiers.d.ts +2 -0
  239. package/dist/test_specialist_and_analyst_tiers.d.ts.map +1 -0
  240. package/dist/test_specialist_and_analyst_tiers.js +155 -0
  241. package/dist/test_specialist_and_analyst_tiers.js.map +1 -0
  242. package/dist/test_v2_2_visual_hardening.d.ts +5 -0
  243. package/dist/test_v2_2_visual_hardening.d.ts.map +1 -0
  244. package/dist/test_v2_2_visual_hardening.js +333 -0
  245. package/dist/test_v2_2_visual_hardening.js.map +1 -0
  246. package/dist/test_verify_deprecate_render_spec.d.ts +2 -0
  247. package/dist/test_verify_deprecate_render_spec.d.ts.map +1 -0
  248. package/dist/test_verify_deprecate_render_spec.js +217 -0
  249. package/dist/test_verify_deprecate_render_spec.js.map +1 -0
  250. package/dist/test_verify_neil_demo.d.ts +2 -0
  251. package/dist/test_verify_neil_demo.d.ts.map +1 -0
  252. package/dist/test_verify_neil_demo.js +149 -0
  253. package/dist/test_verify_neil_demo.js.map +1 -0
  254. package/dist/test_waitable_research_and_grounded_links.d.ts +2 -0
  255. package/dist/test_waitable_research_and_grounded_links.d.ts.map +1 -0
  256. package/dist/test_waitable_research_and_grounded_links.js +129 -0
  257. package/dist/test_waitable_research_and_grounded_links.js.map +1 -0
  258. package/dist/test_widget_guards.d.ts +2 -0
  259. package/dist/test_widget_guards.d.ts.map +1 -0
  260. package/dist/test_widget_guards.js +229 -0
  261. package/dist/test_widget_guards.js.map +1 -0
  262. package/dist/test_zero_retention_alerts.d.ts +14 -0
  263. package/dist/test_zero_retention_alerts.d.ts.map +1 -0
  264. package/dist/test_zero_retention_alerts.js +76 -0
  265. package/dist/test_zero_retention_alerts.js.map +1 -0
  266. package/dist/toolHandlers.d.ts +38 -1
  267. package/dist/toolHandlers.d.ts.map +1 -1
  268. package/dist/toolHandlers.js +3856 -938
  269. package/dist/toolHandlers.js.map +1 -1
  270. package/dist/tools.d.ts +20 -0
  271. package/dist/tools.d.ts.map +1 -1
  272. package/dist/tools.js +25 -4
  273. package/dist/tools.js.map +1 -1
  274. package/dist/verify_discoverability.d.ts +2 -0
  275. package/dist/verify_discoverability.d.ts.map +1 -0
  276. package/dist/verify_discoverability.js +53 -0
  277. package/dist/verify_discoverability.js.map +1 -0
  278. package/dist/verify_tools_endpoint.js +16 -3
  279. package/dist/verify_tools_endpoint.js.map +1 -1
  280. package/dist/widgetShell.d.ts +2 -2
  281. package/dist/widgetShell.d.ts.map +1 -1
  282. package/dist/widgetShell.js +1 -1
  283. package/dist/widgetShell.js.map +1 -1
  284. package/package.json +1 -1
  285. package/server.json +4 -32
  286. package/dist/oauthRegisterShim.d.ts +0 -13
  287. package/dist/oauthRegisterShim.d.ts.map +0 -1
  288. package/dist/oauthRegisterShim.js +0 -83
  289. package/dist/oauthRegisterShim.js.map +0 -1
@@ -0,0 +1,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"}
@@ -0,0 +1,162 @@
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
+ import fs from 'fs';
18
+ import path from 'path';
19
+ import axios from 'axios';
20
+ import crypto from 'crypto';
21
+ import { fileURLToPath } from 'url';
22
+ import { initPricingCache, getToolCostSummary, getQueryPrice } from './pricingCache.js';
23
+ const __filename = fileURLToPath(import.meta.url);
24
+ const __dirname = path.dirname(__filename);
25
+ let passed = 0;
26
+ let failed = 0;
27
+ function assert(condition, msg) {
28
+ if (condition) {
29
+ console.log(` ✅ ${msg}`);
30
+ passed++;
31
+ }
32
+ else {
33
+ console.error(` ❌ ${msg}`);
34
+ failed++;
35
+ }
36
+ }
37
+ async function callApi(method, endpoint, body) {
38
+ const secret = process.env.FODDA_MCP_SECRET;
39
+ const baseUrl = process.env.FODDA_API_URL || 'https://api.fodda.ai';
40
+ const timestamp = Date.now().toString();
41
+ const payload = method === 'POST' ? `${timestamp}.${JSON.stringify(body ?? {})}` : `${timestamp}.${endpoint}`;
42
+ const signature = secret ? crypto.createHmac('sha256', secret).update(payload).digest('hex') : '';
43
+ const headers = {
44
+ 'Content-Type': 'application/json',
45
+ 'X-Fodda-Timestamp': timestamp,
46
+ 'X-Fodda-Signature': signature,
47
+ 'X-Fodda-Billing': 'mcp-orchestrated',
48
+ 'X-API-Key': process.env.FODDA_API_KEY || 'sk_live_abcdef',
49
+ };
50
+ const res = await axios({
51
+ method,
52
+ url: `${baseUrl}${endpoint}`,
53
+ data: body,
54
+ headers,
55
+ timeout: 90000,
56
+ });
57
+ return res.data;
58
+ }
59
+ async function run() {
60
+ console.log('\n=== 1. Pricing Cache & Cost Summary ===');
61
+ await initPricingCache();
62
+ const costs = getToolCostSummary();
63
+ const claimTool = costs.find(c => c.tool === 'verify_market_claim');
64
+ assert(claimTool !== undefined, 'verify_market_claim is registered in pricing cache');
65
+ if (claimTool) {
66
+ assert(claimTool.apiCalls === 1, 'verify_market_claim is billed as 1 call ($0.50 equivalent)');
67
+ }
68
+ const dossierTool = costs.find(c => c.tool === 'get_intelligence_dossier');
69
+ assert(dossierTool !== undefined, 'get_intelligence_dossier is registered in pricing cache');
70
+ if (dossierTool) {
71
+ assert(dossierTool.apiCalls === 1, 'get_intelligence_dossier is billed as 1 call ($0.50 equivalent)');
72
+ }
73
+ console.log('\n=== 2. Tools Manifest & Cost Silence Guards ===');
74
+ const manifestPath = path.resolve(__dirname, '../tools-manifest.json');
75
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
76
+ const mVerify = manifest.tools.find((t) => t.name === 'verify_market_claim');
77
+ assert(mVerify !== undefined, 'verify_market_claim exists in tools-manifest.json');
78
+ if (mVerify) {
79
+ assert(mVerify.bills_as === 'topic_research', 'verify_market_claim bills_as is "topic_research"');
80
+ assert(mVerify.description.length > 0, 'verify_market_claim description is populated');
81
+ assert(!/\b(?:tokens?|via SPT)\b/i.test(mVerify.description), 'verify_market_claim description has NO token/SPT phrasing');
82
+ }
83
+ const mDossier = manifest.tools.find((t) => t.name === 'get_intelligence_dossier');
84
+ assert(mDossier !== undefined, 'get_intelligence_dossier exists in tools-manifest.json');
85
+ if (mDossier) {
86
+ assert(mDossier.bills_as === 'topic_research', 'get_intelligence_dossier bills_as is "topic_research"');
87
+ assert(mDossier.category === 'Intelligence', 'get_intelligence_dossier category is "Intelligence"');
88
+ assert(mDossier.description.includes('$0.50'), 'get_intelligence_dossier description includes "$0.50"');
89
+ assert(!/\b(?:tokens?|via SPT)\b/i.test(mDossier.description), 'get_intelligence_dossier description has NO token/SPT phrasing');
90
+ }
91
+ console.log('\n=== 3. Live verify_market_claim Verification ("Casual golf venues are losing momentum") ===');
92
+ try {
93
+ const claimResult = await callApi('POST', '/v1/verify/claim', {
94
+ claim: 'Casual golf venues are losing momentum',
95
+ context: 'golf entertainment venues Topgolf Off Golf',
96
+ sector: 'sports',
97
+ strict_gates: true,
98
+ });
99
+ assert(claimResult.ok === true, 'Claim verification returned ok: true');
100
+ assert(claimResult.verdict === 'REFUTED_BY_EVIDENCE', `Verdict is REFUTED_BY_EVIDENCE (got: ${claimResult.verdict})`);
101
+ assert(claimResult.verified === false, 'Claim verified flag is false');
102
+ assert(Boolean(claimResult.kill_reason), `Kill reason is populated: "${claimResult.kill_reason}"`);
103
+ const killReasonLower = (claimResult.kill_reason || '').toLowerCase();
104
+ const critiqueLower = (claimResult.adversarial_critique || '').toLowerCase();
105
+ const contraTitles = (claimResult.contradictory_evidence || []).map((e) => (e.title || '').toLowerCase()).join(' ');
106
+ const flagsExpansion = killReasonLower.includes('expansion') || contraTitles.includes('off golf') || contraTitles.includes('mulligan') || critiqueLower.includes('off golf') || critiqueLower.includes('mulligan');
107
+ assert(flagsExpansion, 'Contradictory evidence or critique correctly flags Off Golf/Mulligan funding or category expansion');
108
+ assert(Boolean(claimResult.gates), 'Gates object is present');
109
+ assert(claimResult.gates?.adversarial_counter_thesis !== undefined, 'Gate 1 (Adversarial Counter-Thesis) evaluated');
110
+ assert(claimResult.gates?.multi_source_corroboration !== undefined, 'Gate 2 (Multi-Source Corroboration) evaluated');
111
+ assert(claimResult.gates?.numeric_spine !== undefined, 'Gate 3 (Numeric Spine) evaluated');
112
+ assert(claimResult.gates?.entity_verification !== undefined, 'Gate 4 (Entity Verification) evaluated');
113
+ assert(claimResult.gates?.supporting_commentary !== undefined, 'Gate 5 (Supporting Commentary) evaluated');
114
+ }
115
+ catch (err) {
116
+ assert(false, `verify_market_claim API call failed: ${err.response?.data?.message || err.message}`);
117
+ }
118
+ console.log('\n=== 4. Live get_intelligence_dossier Verification ("functional soda prebiotic growth US sales") ===');
119
+ try {
120
+ const dossierResult = await callApi('POST', '/v1/intelligence/dossier', {
121
+ topic: 'functional soda prebiotic growth US sales',
122
+ sector: 'food',
123
+ include_editorial: true,
124
+ });
125
+ assert(dossierResult.ok === true, 'Dossier query returned ok: true');
126
+ assert(Boolean(dossierResult.dossier), 'Dossier object is present');
127
+ const evidence = dossierResult.dossier?.evidence_items || [];
128
+ assert(evidence.length > 0, `Evidence items returned (${evidence.length} items)`);
129
+ const hasLiveUrls = evidence.some((e) => (e.url || e.source_url) && /^https?:\/\//i.test(e.url || e.source_url));
130
+ assert(hasLiveUrls, 'Evidence items carry live citable URLs');
131
+ const stats = dossierResult.dossier?.statistics || [];
132
+ assert(Array.isArray(stats), 'Macro / quantitative statistics array returned');
133
+ if (stats.length > 0) {
134
+ const statsHaveUnits = stats.some((s) => Boolean(s.unit || s.metric));
135
+ assert(statsHaveUnits, 'Statistics items specify units and indicator names');
136
+ }
137
+ assert(Boolean(dossierResult.dossier?.adversarial_critique), 'Adversarial critique / contrarian stress-test is populated');
138
+ assert(Boolean(dossierResult.editorial), 'Editorial output is generated when include_editorial is true');
139
+ if (dossierResult.editorial) {
140
+ const ed = dossierResult.editorial;
141
+ assert(Boolean(ed.headline), `Editorial headline: "${ed.headline}"`);
142
+ assert(Boolean(ed.sections?.structured?.market_lede), 'Beat 1 (Market Lede) is structured');
143
+ assert(Boolean(ed.sections?.structured?.core_debate), 'Beat 2 (Core Tension / Debate) is structured');
144
+ assert(Boolean(ed.sections?.structured?.competing_playbooks), 'Beat 3 (Competing Playbooks) is structured');
145
+ assert(Boolean(ed.sections?.structured?.strategic_stakes), 'Beat 4 (Strategic Stakes) is structured');
146
+ }
147
+ }
148
+ catch (err) {
149
+ assert(false, `get_intelligence_dossier API call failed: ${err.response?.data?.message || err.message}`);
150
+ }
151
+ console.log(`\n========================================`);
152
+ console.log(`Test Results: ${passed} passed, ${failed} failed`);
153
+ console.log(`========================================\n`);
154
+ if (failed > 0) {
155
+ process.exit(1);
156
+ }
157
+ }
158
+ run().catch((err) => {
159
+ console.error('Fatal error during test run:', err);
160
+ process.exit(1);
161
+ });
162
+ //# sourceMappingURL=test_intelligence_and_verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_intelligence_and_verifier.js","sourceRoot":"","sources":["../src/test_intelligence_and_verifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Automated Verification Suite for Brief #5: MCP Client Slim Endpoints
3
+ * Tests:
4
+ * 1. get_my_account points to /v1/account with fallback to /v1/graphs?view=mcp
5
+ * 2. Response shape and fields for get_my_account mirror existing human-safe format without SPT/token text
6
+ * 3. Session init and list_graphs request ?view=mcp
7
+ * 4. serializeGraphForList allowlist preserves routing fields (suitable_questions, price_per_query, accessible, disabled)
8
+ * 5. Outbound requests send Accept-Encoding: gzip and auto-decompress
9
+ * 6. Before/after payload size measurements
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=test_latency_mcp_brief5.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_latency_mcp_brief5.d.ts","sourceRoot":"","sources":["../src/test_latency_mcp_brief5.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}