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,356 @@
1
+ /**
2
+ * Comprehensive Test Suite for 5-Pillar Editorial & Network Synthesis (v1.46.44).
3
+ *
4
+ * Uses realistic API response fixtures:
5
+ * - Evidence as object `{ statistics: [...], case_studies: [...] }`
6
+ * - Real catalog cache state with `setCachedCatalogForTesting`
7
+ * - Real human twin fields (`isVerifiedRealPerson`, `expertSlug`)
8
+ * - `relevance_score` fields
9
+ *
10
+ * Tests:
11
+ * 1. Primary Report Graph Resolution & Row Partitioning
12
+ * 2. Deduplication of Network Signals against Primary Evidence
13
+ * 3. Human Expert Digital Twin matching (valid match vs. 0-overlap decline)
14
+ * 4. 5-Pillar Payload generation (JSON keys + Pre-rendered Markdown)
15
+ * 5. Mechanical fallback path verification
16
+ * 6. Non-leakage of token / SPT mechanics
17
+ * 7. Absolute HTTPS URLs in all links
18
+ * 8. Honest empty-coverage hook framing
19
+ */
20
+ import assert from 'assert';
21
+ import { setCachedCatalogForTesting } from './catalogCache.js';
22
+ import { resolvePrimaryReportGraph, partitionReportResults, matchHumanExpertTwin, buildReportEditorialBriefing, extractEvidenceFromRow, } from './reportBriefing.js';
23
+ console.log('🧪 Running Comprehensive Test Suite: 5-Pillar Editorial & Network Synthesis (v1.46.44)...\n');
24
+ // ---------------------------------------------------------------------------
25
+ // Seed Catalog Cache with realistic graphs & human twins
26
+ // ---------------------------------------------------------------------------
27
+ const mockCatalog = {
28
+ version: '1.0.0',
29
+ generated_at: new Date().toISOString(),
30
+ graph_count: 3,
31
+ graphs: [
32
+ {
33
+ graph_id: 'jack-morton-fan-experience-trends',
34
+ name: 'Jack Morton Fan Experience Trends',
35
+ description: 'Fan experience, hospitality, and brand activation trends',
36
+ curator: 'Jack Morton Worldwide',
37
+ curator_url: 'https://jackmorton.com',
38
+ quality_checker_name: 'Quality Lead',
39
+ quality_checker_title: 'Director',
40
+ quality_checker_company: 'Fodda',
41
+ update_frequency: 'monthly',
42
+ domain: 'experience',
43
+ version: '1.0.0',
44
+ node_types: ['Trend'],
45
+ relationship_types: ['RELATES_TO'],
46
+ status: 'live',
47
+ topics: ['fan experience', 'fandom', 'hospitality', 'brand community', 'sports'],
48
+ graph_type: 'industry report',
49
+ headline: 'Fan Experience Trends',
50
+ subhead: 'The Shift to Active Participation',
51
+ geography: 'Global',
52
+ icon_url: 'https://fodda.ai/icons/jm.png',
53
+ company: 'Jack Morton Worldwide',
54
+ source_url: 'https://jackmorton.com/report',
55
+ available_as: 'report',
56
+ is_playground: false,
57
+ last_updated: '2026-08-01',
58
+ published_date: '2026-08-01',
59
+ example_queries: ['fan engagement', 'tactile hospitality'],
60
+ portrait_url: '',
61
+ trend_count: 15,
62
+ evidence_count: 45,
63
+ last_synced: '2026-08-01',
64
+ webpage_url: 'https://fodda.ai/graphs/jack-morton-fan-experience-trends',
65
+ },
66
+ {
67
+ graph_id: 'peak-sportstech',
68
+ name: 'PEAK SportsTech Report',
69
+ description: 'Sports venue infrastructure and smart concessions',
70
+ curator: 'PEAK Sports Research',
71
+ curator_url: 'https://peaksports.com',
72
+ quality_checker_name: 'Quality Lead',
73
+ quality_checker_title: 'Director',
74
+ quality_checker_company: 'Fodda',
75
+ update_frequency: 'quarterly',
76
+ domain: 'sports',
77
+ version: '1.0.0',
78
+ node_types: ['Trend'],
79
+ relationship_types: ['RELATES_TO'],
80
+ status: 'live',
81
+ topics: ['sports venues', 'concessions', 'fan hospitality', 'stadium tech'],
82
+ graph_type: 'industry report',
83
+ headline: 'SportsTech Infrastructure',
84
+ subhead: 'Next-Gen Stadium Hospitality',
85
+ geography: 'Global',
86
+ icon_url: 'https://fodda.ai/icons/peak.png',
87
+ company: 'PEAK Sports Research',
88
+ source_url: 'https://peaksports.com/report',
89
+ available_as: 'report',
90
+ is_playground: false,
91
+ last_updated: '2026-07-15',
92
+ published_date: '2026-07-15',
93
+ example_queries: ['intuit dome', 'frictionless checkout'],
94
+ portrait_url: '',
95
+ trend_count: 20,
96
+ evidence_count: 60,
97
+ last_synced: '2026-07-15',
98
+ webpage_url: 'https://fodda.ai/graphs/peak-sportstech',
99
+ },
100
+ {
101
+ graph_id: 'dentsu-growth',
102
+ name: 'Dentsu Brand Growth',
103
+ description: 'Creative effectiveness and product design in marketing',
104
+ curator: 'Dentsu Creative',
105
+ curator_url: 'https://dentsu.com',
106
+ quality_checker_name: 'Quality Lead',
107
+ quality_checker_title: 'Director',
108
+ quality_checker_company: 'Fodda',
109
+ update_frequency: 'quarterly',
110
+ domain: 'brand',
111
+ version: '1.0.0',
112
+ node_types: ['Trend'],
113
+ relationship_types: ['RELATES_TO'],
114
+ status: 'live',
115
+ topics: ['brand growth', 'tactile marketing', 'creative effectiveness'],
116
+ graph_type: 'industry report',
117
+ headline: 'Brand Growth Benchmarks',
118
+ subhead: 'Tactile Design & Engagement',
119
+ geography: 'Global',
120
+ icon_url: 'https://fodda.ai/icons/dentsu.png',
121
+ company: 'Dentsu Creative',
122
+ source_url: 'https://dentsu.com/report',
123
+ available_as: 'report',
124
+ is_playground: false,
125
+ last_updated: '2026-06-01',
126
+ published_date: '2026-06-01',
127
+ example_queries: ['creative design', 'product marketing'],
128
+ portrait_url: '',
129
+ trend_count: 12,
130
+ evidence_count: 36,
131
+ last_synced: '2026-06-01',
132
+ webpage_url: 'https://fodda.ai/graphs/dentsu-growth',
133
+ }
134
+ ]
135
+ };
136
+ const mockAnalysts = [
137
+ {
138
+ id: 'rec12345678901234',
139
+ analyst_id: 'peter-abraham-bicycles-cycling',
140
+ name: 'Peter Abraham',
141
+ description: 'Brand culture, participation, and sports community strategist',
142
+ expertSlug: 'peter-abraham-bicycles-cycling',
143
+ isVerifiedRealPerson: true,
144
+ is_digital_twin: true,
145
+ is_human_agent: true,
146
+ expert_in: 'Brand community culture, experiential participation, cycling and endurance sports',
147
+ what_they_offer: 'Advises brands on building authentic participatory community culture.',
148
+ topics: ['brand community', 'fan experience', 'participation', 'cycling', 'sports'],
149
+ },
150
+ {
151
+ id: 'rec98765432109876',
152
+ analyst_id: 'dr-elena-biotech',
153
+ name: 'Dr. Elena Rostova',
154
+ description: 'Biopharmaceutical research and immunology',
155
+ expertSlug: 'dr-elena-biotech',
156
+ isVerifiedRealPerson: true,
157
+ is_digital_twin: true,
158
+ is_human_agent: true,
159
+ expert_in: 'Immunology, clinical oncology, mRNA therapeutics',
160
+ what_they_offer: 'Reviews clinical trial design and biopharma regulatory pipelines.',
161
+ topics: ['oncology', 'immunology', 'biopharma'],
162
+ }
163
+ ];
164
+ setCachedCatalogForTesting(mockCatalog, mockAnalysts);
165
+ // Live API shape with object evidence and relevance_score
166
+ const mockLiveReportRows = [
167
+ {
168
+ trend_id: 'jm-1',
169
+ name: 'Participation as the Price of Entry',
170
+ graph_id: 'jack-morton-fan-experience-trends',
171
+ summary: 'Three-quarters of adults identify with fandoms, demanding hands-on involvement.',
172
+ relevance_score: 0.94,
173
+ evidence: {
174
+ statistics: [
175
+ { stat: '42%', snippet: '42% of modern fans actively seek hands-on community involvement rather than passive spectatorship.' },
176
+ { percentage: '75%', snippet: '75% of adults surveyed identify with at least one fandom.' }
177
+ ],
178
+ case_studies: [
179
+ { title: 'Interactive Fanzone Activation', snippet: 'Hands-on fan labs delivered 3x higher dwell time during championship weekend.' }
180
+ ]
181
+ }
182
+ },
183
+ {
184
+ trend_id: 'jm-2',
185
+ name: 'Tactile Hospitality and Sensory Immersion',
186
+ graph_id: 'jack-morton-fan-experience-trends',
187
+ summary: 'Physical stadium environments require tactile, sensory engagements to justify in-person attendance.',
188
+ relevance_score: 0.89,
189
+ evidence: {
190
+ statistics: [
191
+ { stat: '$180', snippet: 'Average premium spend per attendee increases by 28% in immersive sensory hospitality suites.' }
192
+ ],
193
+ case_studies: [
194
+ { title: 'SanDisk FIFA Whistle USB Drive', snippet: 'SanDisk FIFA World Cup Whistle USB drive demonstrated how tactile product design drives consumer willingness to pay.' }
195
+ ]
196
+ }
197
+ },
198
+ {
199
+ trend_id: 'peak-1',
200
+ name: 'Frictionless Concession Infrastructure',
201
+ graph_id: 'peak-sportstech',
202
+ summary: 'Intuit Dome deployed over 40 checkout-free outlets, proving frictionless infrastructure is table stakes for fan hospitality.',
203
+ relevance_score: 0.81,
204
+ evidence: {
205
+ statistics: [
206
+ { stat: '40+ stores', snippet: 'Over 40 autonomous checkout stores deployed at Intuit Dome.' }
207
+ ]
208
+ }
209
+ },
210
+ {
211
+ trend_id: 'dentsu-1',
212
+ name: 'Tactile Brand Merchandising',
213
+ graph_id: 'dentsu-growth',
214
+ summary: 'Tactile sensory merchandising drives higher consumer brand equity.',
215
+ relevance_score: 0.73,
216
+ evidence: {
217
+ case_studies: [
218
+ { title: 'SanDisk FIFA Whistle USB Drive', snippet: 'SanDisk FIFA World Cup Whistle USB drive demonstrated how tactile product design drives consumer willingness to pay.' }
219
+ ]
220
+ }
221
+ }
222
+ ];
223
+ async function runTests() {
224
+ // -----------------------------------------------------------------------
225
+ // TEST 1: Evidence Extraction (Object vs Array shapes)
226
+ // -----------------------------------------------------------------------
227
+ console.log('--- TEST 1: Evidence Extraction from Object & Array Shapes ---');
228
+ const evObj = extractEvidenceFromRow(mockLiveReportRows[0]);
229
+ assert.strictEqual(evObj.stats.length, 2, 'Should extract 2 stats from object evidence');
230
+ assert.ok(evObj.stats.includes('42%'), 'Should contain 42%');
231
+ assert.ok(evObj.stats.includes('75%'), 'Should contain 75%');
232
+ assert.strictEqual(evObj.caseStudies.length, 1, 'Should extract 1 case study');
233
+ console.log('✅ PASS: Evidence object extraction correctly pulls stats, snippets, and case studies.\n');
234
+ // -----------------------------------------------------------------------
235
+ // TEST 2: Primary Report Graph Resolution
236
+ // -----------------------------------------------------------------------
237
+ console.log('--- TEST 2: Primary Report Graph Resolution ---');
238
+ const resolvedByName = resolvePrimaryReportGraph('What does the Jack Morton fan experience report say?');
239
+ assert.ok(resolvedByName, 'Should resolve graph from Jack Morton curator in query');
240
+ assert.strictEqual(resolvedByName?.graph_id, 'jack-morton-fan-experience-trends');
241
+ const resolvedByRows = resolvePrimaryReportGraph('fan engagement trends', mockLiveReportRows);
242
+ assert.ok(resolvedByRows, 'Should resolve primary graph from highest density in result rows');
243
+ assert.strictEqual(resolvedByRows?.graph_id, 'jack-morton-fan-experience-trends');
244
+ console.log('✅ PASS: Primary report graph resolution verified.\n');
245
+ // -----------------------------------------------------------------------
246
+ // TEST 3: Partitioning & Evidence Deduplication
247
+ // -----------------------------------------------------------------------
248
+ console.log('--- TEST 3: Partitioning & Cross-Graph Deduplication ---');
249
+ const { primaryRows, networkRows } = partitionReportResults(mockLiveReportRows, 'jack-morton-fan-experience-trends');
250
+ assert.strictEqual(primaryRows.length, 2, 'Should have 2 primary rows for Jack Morton graph');
251
+ // dentsu-1 contains duplicate SanDisk FIFA Whistle case study from jm-2, so it must be deduped out
252
+ assert.strictEqual(networkRows.length, 1, 'Network rows should have exactly 1 item after deduplicating duplicate SanDisk case study');
253
+ assert.strictEqual(networkRows[0].graph_id, 'peak-sportstech', 'Remaining network signal must be peak-sportstech');
254
+ console.log('✅ PASS: Partitioning and server-side deduplication verified.\n');
255
+ // -----------------------------------------------------------------------
256
+ // TEST 4: Human Expert Twin Matching & 0-Overlap Strictness
257
+ // -----------------------------------------------------------------------
258
+ console.log('--- TEST 4: Human Expert Digital Twin Matching ---');
259
+ const matchedTwin = matchHumanExpertTwin('fan experience brand community participation');
260
+ assert.ok(matchedTwin, 'Should match Peter Abraham on fan experience & brand community');
261
+ assert.strictEqual(matchedTwin?.name, 'Peter Abraham');
262
+ assert.strictEqual(matchedTwin?.slug, 'peter-abraham-bicycles-cycling');
263
+ assert.strictEqual(matchedTwin?.is_human_agent, true);
264
+ // 0-overlap test: query completely outside any twin's domain
265
+ const zeroOverlapTwin = matchHumanExpertTwin('superconducting quantum error correction transmon qubits');
266
+ assert.strictEqual(zeroOverlapTwin, undefined, 'Must NOT match any expert when topical overlap is zero');
267
+ console.log('✅ PASS: Human expert twin matched accurately and declined on zero overlap.\n');
268
+ // -----------------------------------------------------------------------
269
+ // TEST 5: 5-Pillar Payload Generation (Full Suite)
270
+ // -----------------------------------------------------------------------
271
+ console.log('--- TEST 5: 5-Pillar Editorial Payload Generation ---');
272
+ const payload = await buildReportEditorialBriefing({
273
+ data: { results: mockLiveReportRows, total: 4 },
274
+ query: 'What does the new Jack Morton fan experience report say?',
275
+ annotatedData: {
276
+ coverage: { status: 'ok' },
277
+ next_moves: {
278
+ candidates: [
279
+ { prompt: 'Explore sports venue infrastructure', tool: 'get_report_intelligence', args: { query: 'PEAK SportsTech' } }
280
+ ]
281
+ }
282
+ }
283
+ });
284
+ assert.strictEqual(payload.view, 'editorial');
285
+ assert.ok(payload.topline_hook.text.length > 10, 'Topline hook must be populated');
286
+ assert.ok(payload.shifts.length >= 2, 'Should extract structural shifts');
287
+ assert.ok(payload.shifts[0]?.title, 'First shift must have title');
288
+ assert.ok(payload.shifts[0]?.narrative, 'First shift must have narrative');
289
+ assert.ok(payload.shifts[0]?.stats.length > 0, 'First shift must carry extracted stats');
290
+ // Pillar 3 check
291
+ assert.strictEqual(payload.network_signals.length, 1, 'Should include peak-sportstech network signal');
292
+ const netSig = payload.network_signals[0];
293
+ assert.ok(netSig, 'Network signal must exist');
294
+ assert.strictEqual(netSig?.curator, 'PEAK Sports Research', 'Curator must be populated from catalog cache');
295
+ assert.strictEqual(netSig?.source_report, 'PEAK SportsTech Report');
296
+ assert.ok(netSig?.url.startsWith('https://'), `Network signal url must be absolute https: ${netSig?.url}`);
297
+ // Pillar 4 check
298
+ assert.ok(payload.expert_spotlight, 'Expert spotlight must be populated');
299
+ assert.strictEqual(payload.expert_spotlight?.name, 'Peter Abraham');
300
+ assert.strictEqual(payload.expert_spotlight?.consult_url, 'https://expert.fodda.ai/peter-abraham-bicycles-cycling');
301
+ assert.strictEqual(payload.expert_spotlight?.consult_tool, 'consult_human_agent');
302
+ // Pillar 5 check
303
+ assert.ok(payload.follow_ups.length >= 2, 'Should have runnable follow-ups');
304
+ for (const fu of payload.follow_ups) {
305
+ assert.ok(fu.prompt, 'Follow up must have prompt');
306
+ assert.ok(fu.tool, 'Follow up must specify tool');
307
+ assert.ok(typeof fu.args === 'object', 'Follow up must provide args object');
308
+ assert.ok(fu.app_url.startsWith('https://'), `Follow up app_url must be https: ${fu.app_url}`);
309
+ }
310
+ // Markdown rendering check
311
+ assert.ok(payload.briefing_markdown.includes('Strategic Briefing:'), 'Markdown must have main title');
312
+ assert.ok(payload.briefing_markdown.includes('Core Tension:'), 'Markdown must include Core Tension');
313
+ assert.ok(payload.briefing_markdown.includes('Core Structural Shifts'), 'Markdown must include shifts');
314
+ assert.ok(payload.briefing_markdown.includes('Cross-Graph Network Signals'), 'Markdown must include network signals');
315
+ assert.ok(payload.briefing_markdown.includes('Human Expert Digital Twin Spotlight'), 'Markdown must include expert spotlight');
316
+ console.log('✅ PASS: All 5 pillars verified with real catalog and object evidence.\n');
317
+ // -----------------------------------------------------------------------
318
+ // TEST 6: Pricing / SPT Invariant Safety Checks
319
+ // -----------------------------------------------------------------------
320
+ console.log('--- TEST 6: Pricing / SPT Invariant Safety Checks ---');
321
+ const jsonString = JSON.stringify(payload);
322
+ const forbiddenPatterns = [
323
+ /\bvia SPT\b/i,
324
+ /\bSPT_RATE\b/i,
325
+ /\btoken cost\b/i,
326
+ /\bshared payment token\b/i,
327
+ /\bSPT token\b/i,
328
+ ];
329
+ for (const pattern of forbiddenPatterns) {
330
+ assert.ok(!pattern.test(jsonString), `Payload must not contain banned pricing/token terminology: ${pattern}`);
331
+ assert.ok(!pattern.test(payload.briefing_markdown), `Markdown must not contain banned pricing/token terminology: ${pattern}`);
332
+ }
333
+ console.log('✅ PASS: Zero SPT or machine-pricing terminology leaked in editorial text.\n');
334
+ // -----------------------------------------------------------------------
335
+ // TEST 7: Empty Coverage Honest Hook
336
+ // -----------------------------------------------------------------------
337
+ console.log('--- TEST 7: Honest Empty Coverage Hook ---');
338
+ const emptyPayload = await buildReportEditorialBriefing({
339
+ data: { results: [], total: 0 },
340
+ query: 'quantum cryogenic cooling in fast fashion',
341
+ annotatedData: {
342
+ coverage: { status: 'empty' },
343
+ }
344
+ });
345
+ assert.strictEqual(emptyPayload.view, 'editorial');
346
+ assert.ok(emptyPayload.topline_hook.text.includes('No published report intelligence was found specifically matching'), 'Empty hook must honestly state no published report was found');
347
+ assert.ok(!emptyPayload.topline_hook.text.includes('critical shifts across'), 'Must NOT assert fake critical shifts on empty coverage');
348
+ assert.strictEqual(emptyPayload.expert_spotlight, undefined, 'Must not attach an expert spotlight when coverage is empty / zero overlap');
349
+ console.log('✅ PASS: Honest empty coverage hook verified.\n');
350
+ console.log('🎉 ALL COMPREHENSIVE TESTS PASSED SUCCESSFULLY!');
351
+ }
352
+ runTests().catch(err => {
353
+ console.error('❌ Test failed:', err);
354
+ process.exit(1);
355
+ });
356
+ //# sourceMappingURL=test_report_editorial_briefing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_report_editorial_briefing.js","sourceRoot":"","sources":["../src/test_report_editorial_briefing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test_search_graph_quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_search_graph_quality.d.ts","sourceRoot":"","sources":["../src/test_search_graph_quality.ts"],"names":[],"mappings":""}