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
@@ -36,15 +36,50 @@ export function computeLifecycle(row, now) {
36
36
  return 'mature';
37
37
  return 'building';
38
38
  }
39
+ export function reconcileFreshnessDays(row, now) {
40
+ const ts = now || Date.now();
41
+ const substantiveDateStr = row.freshnessDate || row.published_date || row.lastSeen || (Array.isArray(row.evidence) && row.evidence[0]?.publishedAt) || null;
42
+ if (substantiveDateStr) {
43
+ const subTime = new Date(substantiveDateStr).getTime();
44
+ if (!isNaN(subTime) && subTime > 0) {
45
+ const calculatedDays = Math.max(0, Math.floor((ts - subTime) / 86400000));
46
+ // If the API returned a freshnessDays that is derived from DB updated_at
47
+ // (e.g. freshnessDays is 16 from DB updated_at while substantive date is 190 days ago),
48
+ // prefer the substantive calculation.
49
+ if (row.freshnessDays !== undefined && row.freshnessDays !== null) {
50
+ if (Math.abs(calculatedDays - row.freshnessDays) > 30 && calculatedDays > row.freshnessDays) {
51
+ return calculatedDays;
52
+ }
53
+ return row.freshnessDays;
54
+ }
55
+ return calculatedDays;
56
+ }
57
+ }
58
+ if (row.freshnessDays !== undefined && row.freshnessDays !== null) {
59
+ return row.freshnessDays;
60
+ }
61
+ return null;
62
+ }
39
63
  export function computeMomentum(row, now) {
40
64
  const ts = now || Date.now();
41
- const last = row.lastSeen ? new Date(row.lastSeen).getTime() : 0;
42
- const freshnessDays = row.freshnessDays || (last ? (ts - last) / (1000 * 60 * 60 * 24) : 999);
43
- if (freshnessDays < 30)
44
- return 'accelerating';
45
- if (freshnessDays < 90)
65
+ const freshnessDays = reconcileFreshnessDays(row, ts);
66
+ if (freshnessDays !== null) {
67
+ if (freshnessDays < 45)
68
+ return 'accelerating';
69
+ if (freshnessDays < 120)
70
+ return 'steady';
71
+ if (freshnessDays < 240)
72
+ return 'building';
73
+ return 'slowing';
74
+ }
75
+ // Fallback based on lifecycle or evidence count
76
+ if (row.lifecycle === 'fading')
77
+ return 'slowing';
78
+ if (row.lifecycle === 'emerging' || row.lifecycle === 'building')
79
+ return 'steady';
80
+ if ((row.evidence_count || row.evidenceCount || 0) >= 5)
46
81
  return 'steady';
47
- return 'slowing';
82
+ return 'steady';
48
83
  }
49
84
  export function isFastMover(row, now) {
50
85
  const ts = now || Date.now();
@@ -74,6 +109,109 @@ const EVIDENCE_ROLES = {
74
109
  'datapoint': 'background', // Narrative texture — NOT standalone evidence
75
110
  'data point': 'background',
76
111
  };
112
+ // ---------------------------------------------------------------------------
113
+ // Geographic Metadata & Placeholder Cleaning
114
+ // ---------------------------------------------------------------------------
115
+ export const KNOWN_CITY_LOCATIONS = {
116
+ 'milan': 'Milan, Italy',
117
+ 'paris': 'Paris, France',
118
+ 'tokyo': 'Tokyo, Japan',
119
+ 'harajuku': 'Tokyo, Japan',
120
+ 'ginza': 'Tokyo, Japan',
121
+ 'shibuya': 'Tokyo, Japan',
122
+ 'kyoto': 'Kyoto, Japan',
123
+ 'london': 'London, UK',
124
+ 'mayfair': 'London, UK',
125
+ 'covent garden': 'London, UK',
126
+ 'new york': 'New York, USA',
127
+ 'soho': 'New York, USA',
128
+ 'manhattan': 'New York, USA',
129
+ 'brooklyn': 'New York, USA',
130
+ 'los angeles': 'Los Angeles, USA',
131
+ 'beverly hills': 'Los Angeles, USA',
132
+ 'west hollywood': 'Los Angeles, USA',
133
+ 'miami': 'Miami, USA',
134
+ 'chicago': 'Chicago, USA',
135
+ 'san francisco': 'San Francisco, USA',
136
+ 'seattle': 'Seattle, USA',
137
+ 'atlanta': 'Atlanta, USA',
138
+ 'las vegas': 'Las Vegas, USA',
139
+ 'dallas': 'Dallas, USA',
140
+ 'austin': 'Austin, USA',
141
+ 'boston': 'Boston, USA',
142
+ 'singapore': 'Singapore',
143
+ 'hong kong': 'Hong Kong',
144
+ 'shanghai': 'Shanghai, China',
145
+ 'beijing': 'Beijing, China',
146
+ 'seoul': 'Seoul, South Korea',
147
+ 'gangnam': 'Seoul, South Korea',
148
+ 'dubai': 'Dubai, UAE',
149
+ 'rome': 'Rome, Italy',
150
+ 'florence': 'Florence, Italy',
151
+ 'venice': 'Venice, Italy',
152
+ 'berlin': 'Berlin, Germany',
153
+ 'munich': 'Munich, Germany',
154
+ 'madrid': 'Madrid, Spain',
155
+ 'barcelona': 'Barcelona, Spain',
156
+ 'sydney': 'Sydney, Australia',
157
+ 'melbourne': 'Melbourne, Australia',
158
+ 'toronto': 'Toronto, Canada',
159
+ 'vancouver': 'Vancouver, Canada',
160
+ 'buenos aires': 'Buenos Aires, Argentina',
161
+ 'são paulo': 'São Paulo, Brazil',
162
+ 'sao paulo': 'São Paulo, Brazil',
163
+ 'rio de janeiro': 'Rio de Janeiro, Brazil'
164
+ };
165
+ const PLACEHOLDER_TOKENS = new Set([
166
+ 'string', 'n/a', 'na', 'n', 'a', 'none', 'null', 'undefined', 'unknown',
167
+ 'placeholder', 'test', 'tbd', 'tba'
168
+ ]);
169
+ export function isPlaceholderPlace(val) {
170
+ if (val === null || val === undefined)
171
+ return true;
172
+ if (typeof val !== 'string') {
173
+ if (Array.isArray(val)) {
174
+ return val.length === 0 || val.every(p => isPlaceholderPlace(p));
175
+ }
176
+ return true;
177
+ }
178
+ const trimmed = val.trim().toLowerCase();
179
+ if (!trimmed)
180
+ return true;
181
+ if (PLACEHOLDER_TOKENS.has(trimmed) || /^(string(,\s*string)*|n\/?a|none|null|undefined|unknown|placeholder|test|tbd|tba)$/i.test(trimmed)) {
182
+ return true;
183
+ }
184
+ const parts = trimmed.split(/[,/]/).map(p => p.trim()).filter(Boolean);
185
+ if (parts.length === 0)
186
+ return true;
187
+ return parts.every(p => PLACEHOLDER_TOKENS.has(p));
188
+ }
189
+ export function reconcilePlace(currentPlace, title, summary) {
190
+ let place = currentPlace && !isPlaceholderPlace(currentPlace) ? currentPlace.trim() : undefined;
191
+ const text = `${title || ''} ${summary || ''}`;
192
+ if (!text.trim())
193
+ return place;
194
+ // Normalize duplicate components like "Singapore, Singapore" -> "Singapore"
195
+ if (place) {
196
+ const parts = place.split(',').map(s => s.trim());
197
+ if (parts.length === 2 && parts[0] && parts[1] && parts[0].toLowerCase() === parts[1].toLowerCase()) {
198
+ place = parts[0];
199
+ }
200
+ }
201
+ // Sort by key length descending so longer/more specific keys match before shorter substrings
202
+ const sortedEntries = Object.entries(KNOWN_CITY_LOCATIONS).sort((a, b) => b[0].length - a[0].length);
203
+ for (const [cityKey, canonicalLocation] of sortedEntries) {
204
+ const pattern = new RegExp(`\\b(?:in|at|across|hosted in|opens? in|launched in)\\s+${cityKey}\\b|\\b${cityKey}\\s+(?:pop-?up|ephemeral|store|carousel|activation|flagship|boutique|residency)\\b`, 'i');
205
+ if (pattern.test(text)) {
206
+ // If place is missing or contradicts the explicit city from text, override
207
+ if (!place || !place.toLowerCase().includes(cityKey)) {
208
+ return canonicalLocation;
209
+ }
210
+ return place;
211
+ }
212
+ }
213
+ return place;
214
+ }
77
215
  /**
78
216
  * Enrich evidence items with pre-formatted markdown citations and editorial roles.
79
217
  * Models are much more likely to pass through a ready-made link than construct one.
@@ -92,39 +230,280 @@ export function enrichEvidence(items, opts = {}) {
92
230
  });
93
231
  }
94
232
  return items.map(item => {
233
+ const cleanItem = { ...item };
95
234
  // Assign editorial role based on content type — but don't stamp unknown
96
235
  // contentTypes as 'proof' (that mislabels everything as standalone evidence).
97
- const ct = (item.contentType || '').toLowerCase();
236
+ const ct = (cleanItem.contentType || '').toLowerCase();
98
237
  const mappedRole = EVIDENCE_ROLES[ct];
99
238
  if (mappedRole)
100
- item.role = mappedRole;
101
- if (item.formatted_citation)
102
- return item; // already enriched
103
- const title = item.title?.trim();
104
- const url = item.sourceUrl?.trim();
105
- // Enhanced citation for quotes with speaker attribution
106
- if (item.role === 'voice' && item.speakerName) {
107
- const speaker = item.speakerName;
108
- const titleSuffix = item.speakerTitle ? `, ${item.speakerTitle}` : '';
109
- const pub = item.publication || 'Source';
110
- if (url) {
111
- item.formatted_citation = `"${title || 'Quote'}" — ${speaker}${titleSuffix} ([${pub}](${url}))`;
239
+ cleanItem.role = mappedRole;
240
+ const url = cleanItem.sourceUrl?.trim();
241
+ const rawPubName = cleanItem.publication?.trim() || cleanItem.sourceName?.trim() || (url ? extractCleanDomain(url) : 'Source');
242
+ // Clean RSS feed labels (e.g. "Fast Casual | Latest Media" -> "Fast Casual", "NYT > Top Stories" -> "NYT")
243
+ let cleanPub = rawPubName.split('|')[0].trim().split('>')[0].trim().split(' - ')[0].trim().split(':')[0].trim();
244
+ if (cleanPub.endsWith(' RSS') || cleanPub.endsWith(' Feed')) {
245
+ cleanPub = cleanPub.replace(/\s+(RSS|Feed)$/i, '').trim();
246
+ }
247
+ // Canonical name normalization
248
+ if (cleanPub.toUpperCase() === 'NYT' || cleanPub.toUpperCase().startsWith('NYT ') || cleanPub === 'New York Times') {
249
+ cleanPub = 'The New York Times';
250
+ }
251
+ else if (cleanPub.toUpperCase() === 'WSJ' || cleanPub.toUpperCase().startsWith('WSJ ')) {
252
+ cleanPub = 'The Wall Street Journal';
253
+ }
254
+ else if (cleanPub.toUpperCase() === 'FT' || cleanPub.toUpperCase().startsWith('FT ')) {
255
+ cleanPub = 'Financial Times';
256
+ }
257
+ else if (cleanPub.toUpperCase() === 'BOF' || cleanPub === 'Business of Fashion') {
258
+ cleanPub = 'The Business of Fashion';
259
+ }
260
+ const isInternalFoddaUrl = url ? /fodda\.ai/i.test(url) : true;
261
+ const finalPubLabel = cleanPub.startsWith('via ') ? cleanPub : `via ${cleanPub}`;
262
+ cleanItem.short_citation = (url && !isInternalFoddaUrl) ? `[${finalPubLabel}](${url})` : finalPubLabel;
263
+ if (!cleanItem.formatted_citation) {
264
+ const title = cleanItem.title?.trim();
265
+ // Enhanced citation for quotes with speaker attribution
266
+ if (cleanItem.role === 'voice' && cleanItem.speakerName) {
267
+ const speaker = cleanItem.speakerName;
268
+ const titleSuffix = cleanItem.speakerTitle ? `, ${cleanItem.speakerTitle}` : '';
269
+ const pub = cleanItem.publication || 'Source';
270
+ if (url) {
271
+ cleanItem.formatted_citation = `"${title || 'Quote'}" — ${speaker}${titleSuffix} ([${pub}](${url}))`;
272
+ }
273
+ else {
274
+ cleanItem.formatted_citation = `"${title || 'Quote'}" — ${speaker}${titleSuffix} (${pub})`;
275
+ }
276
+ }
277
+ else if (title && url) {
278
+ cleanItem.formatted_citation = `[${title}](${url})`;
279
+ }
280
+ else if (title) {
281
+ cleanItem.formatted_citation = `${title} (no link available)`;
282
+ }
283
+ else if (url) {
284
+ cleanItem.formatted_citation = `[Source](${url})`;
285
+ }
286
+ }
287
+ // Clean and reconcile place metadata
288
+ if (cleanItem.place !== undefined) {
289
+ cleanItem.place = reconcilePlace(cleanItem.place, cleanItem.title, cleanItem.summary);
290
+ if (!cleanItem.place || isPlaceholderPlace(cleanItem.place)) {
291
+ delete cleanItem.place;
292
+ }
293
+ }
294
+ else if (cleanItem.title || cleanItem.summary) {
295
+ const detectedPlace = reconcilePlace(undefined, cleanItem.title, cleanItem.summary);
296
+ if (detectedPlace) {
297
+ cleanItem.place = detectedPlace;
298
+ }
299
+ }
300
+ // Clean dead / null / empty / placeholder fields to prevent LLM context bloat
301
+ for (const k of ['imageUrl', 'speakerName', 'speakerTitle', 'publication', 'place']) {
302
+ if (cleanItem[k] === null || cleanItem[k] === undefined || cleanItem[k] === '' || (k === 'place' && isPlaceholderPlace(cleanItem[k]))) {
303
+ delete cleanItem[k];
304
+ }
305
+ }
306
+ if (cleanItem.id && cleanItem.node_id && String(cleanItem.id) === String(cleanItem.node_id)) {
307
+ delete cleanItem.id;
308
+ }
309
+ if (Array.isArray(cleanItem.brandNames) && cleanItem.brandNames.length === 0) {
310
+ delete cleanItem.brandNames;
311
+ }
312
+ return cleanItem;
313
+ });
314
+ }
315
+ // ---------------------------------------------------------------------------
316
+ // Market Tier & Category Vocabularies
317
+ // ---------------------------------------------------------------------------
318
+ export const LUXURY_KEYWORDS = new Set(['luxury', 'haute', 'couture', 'prestige', 'high-end', 'designer']);
319
+ export const LUXURY_BRANDS = new Set([
320
+ 'dior', 'louis vuitton', 'chanel', 'gucci', 'hermès', 'hermes', 'prada', 'cartier',
321
+ 'tiffany', 'saint laurent', 'balenciaga', 'bottega veneta', 'burberry', 'moncler',
322
+ 'loewe', 'celine', 'fendi', 'versace', 'ferragamo', 'valentino', 'rolex', 'harrods',
323
+ 'maison margiela', 'the macallan', 'hennessy', 'rh', 'nordstrom', 'saks', 'bergdorf',
324
+ 'kering', 'lvmh', 'richemont', 'bulgari', 'bvlgari', 'chopard', 'patek philippe', 'audemars piguet',
325
+ "bloomingdale's", "bloomingdales", "harrods", "le bon marché", "la samaritaine",
326
+ "selfridges", "lane crawford", "neiman marcus", "galeries lafayette", "l’oréal travel retail",
327
+ "l'oréal travel retail", "l'oreal travel retail", "campari"
328
+ ]);
329
+ export const MASS_BUDGET_KEYWORDS = new Set(['budget', 'discount', 'mass-market', 'value', 'cheap', 'fast-food', 'low-cost']);
330
+ export const MASS_BUDGET_BRANDS = new Set([
331
+ 'miniso', 'kfc', 'mcdonald\'s', 'mcdonalds', 'taco bell', 'burger king', 'dollar general',
332
+ 'dollar tree', 'five below', 'primark', 'shein', 'temu', 'walmart', 'popeyes', 'domino\'s'
333
+ ]);
334
+ export const DIGITAL_OR_B2B_PATTERNS = [
335
+ /\btiktok shop\b/i,
336
+ /\bonline marketplace\b/i,
337
+ /\be-?commerce platform\b/i,
338
+ /\becommerce storefront\b/i,
339
+ /\bdigital storefront\b/i,
340
+ /\bsupply chain pilot\b/i,
341
+ /\benterprise-wide technology bundles\b/i,
342
+ /\bagentic shopping models\b/i,
343
+ /\bwarehouse logistics\b/i,
344
+ /\bcheckout api\b/i,
345
+ /\bquick delivery partnerships\b/i,
346
+ /\bconnected packaging\b/i,
347
+ /\bsoftware platform\b/i,
348
+ /\bcloud infrastructure\b/i,
349
+ ];
350
+ export const PHYSICAL_SPATIAL_TERMS = new Set([
351
+ 'pop-up', 'popup', 'pop up', 'pop-ups', 'popups', 'pop ups',
352
+ 'temporary store', 'temporary space', 'temporary retail', 'temporary restaurant',
353
+ 'ephemeral', 'kiosk', 'activation', 'experiential', 'installation', 'showcase',
354
+ 'concept store', 'in-store', 'physical store', 'storefront', 'shop-in-shop',
355
+ 'store-in-store', 'exhibition', 'retail space', 'boutique', 'resortcore',
356
+ 'carousel', 'sampling', 'tasting', 'theater play', 'wellness hub', 'venue', 'hub',
357
+ 'destination', 'physical experience', 'in-person'
358
+ ]);
359
+ const GENERIC_QUERY_STOPWORDS = new Set([
360
+ 'a', 'an', 'the', 'and', 'or', 'of', 'in', 'on', 'for', 'to', 'with', 'from', 'by', 'at',
361
+ 'as', 'is', 'are', 'was', 'be', 'how', 'what', 'trend', 'trends', 'market', 'emerging',
362
+ 'retail', 'consumer', 'report', 'insights', 'data'
363
+ ]);
364
+ /**
365
+ * Filter and rank evidence items against query qualifiers and trend context.
366
+ * Strictly validates evidence against parent trend topic and medium (e.g. physical pop-ups
367
+ * vs digital e-commerce/supply chain) and filters counter-tier brands.
368
+ */
369
+ export function rankAndFilterEvidence(items, query, trendContext, opts = {}) {
370
+ if (!Array.isArray(items) || items.length === 0)
371
+ return [];
372
+ const maxItems = opts.maxItems ?? 3;
373
+ const qLower = (query || '').toLowerCase();
374
+ const qWords = qLower.split(/[^a-z0-9]+/).filter(w => w.length > 2 && !GENERIC_QUERY_STOPWORDS.has(w));
375
+ const isFinancialQuery = /\b(revenue|ebitda|gross margin|earnings|quarterly|q[1-4]|financial|valuation|guidance|stock|dividend|probes)\b/i.test(qLower);
376
+ const hasLuxuryQuery = [...LUXURY_KEYWORDS].some(k => qLower.includes(k));
377
+ const hasBudgetQuery = [...MASS_BUDGET_KEYWORDS].some(k => qLower.includes(k));
378
+ const trendTitle = (trendContext?.trendName || trendContext?.title || trendContext?.label || '').toLowerCase();
379
+ const trendWords = trendTitle.split(/[^a-z0-9]+/).filter((w) => w.length > 2 && !GENERIC_QUERY_STOPWORDS.has(w));
380
+ const isPopUpTrend = /\b(pop-?ups?|temporary store|temporary retail)\b/i.test(trendTitle) || /\b(pop-?ups?)\b/i.test(qLower);
381
+ const scored = items.map((item, idx) => {
382
+ const title = (item.title || '').toLowerCase();
383
+ const summary = (item.summary || item.excerpt || '').toLowerCase();
384
+ const contentType = (item.contentType || '').toLowerCase();
385
+ const brands = Array.isArray(item.brandNames)
386
+ ? item.brandNames.map((b) => String(b).toLowerCase())
387
+ : (typeof item.brandNames === 'string' ? item.brandNames.toLowerCase().split('|') : []);
388
+ const fullText = `${title} ${summary} ${brands.join(' ')}`;
389
+ // 1. Digital/B2B Disqualification for Physical Pop-Up / Spatial Trends
390
+ if (isPopUpTrend) {
391
+ const isDigitalOrB2B = DIGITAL_OR_B2B_PATTERNS.some(p => p.test(fullText));
392
+ const mentionsPhysical = [...PHYSICAL_SPATIAL_TERMS].some(term => fullText.includes(term));
393
+ if (isDigitalOrB2B && !mentionsPhysical) {
394
+ return { item, score: -999, originalIdx: idx, reason: 'digital-only/B2B mismatch for physical pop-up trend' };
395
+ }
396
+ if (!mentionsPhysical) {
397
+ return { item, score: -999, originalIdx: idx, reason: 'no physical pop-up/spatial keyword' };
112
398
  }
113
- else {
114
- item.formatted_citation = `"${title || 'Quote'}" — ${speaker}${titleSuffix} (${pub})`;
399
+ }
400
+ // 2. Demote financial / earnings transcripts for qualitative queries
401
+ const isEarningsOrFinancial = /\b(revenue|ebitda|gross margin|earnings|quarterly|q[1-4]|probes|consolidated revenue|adjusted ebitda)\b/i.test(title) ||
402
+ /\b(investor relations|q[1-4] 202[0-9]|earnings call|quarterly results)\b/i.test(fullText);
403
+ if (isEarningsOrFinancial && !isFinancialQuery) {
404
+ return { item, score: -999, originalIdx: idx, reason: 'financial transcript on qualitative query' };
405
+ }
406
+ // 3. Category tier matching
407
+ if (hasLuxuryQuery) {
408
+ const mentionsMassBrand = brands.some((b) => MASS_BUDGET_BRANDS.has(b)) ||
409
+ [...MASS_BUDGET_BRANDS].some(b => fullText.includes(b));
410
+ if (mentionsMassBrand) {
411
+ return { item, score: -999, originalIdx: idx, reason: 'mass-market brand on luxury query' };
115
412
  }
116
413
  }
117
- else if (title && url) {
118
- item.formatted_citation = `[${title}](${url})`;
414
+ // Trend validation baseline
415
+ let score = 5.0;
416
+ // Luxury boost
417
+ if (hasLuxuryQuery) {
418
+ const mentionsLuxuryBrand = brands.some((b) => LUXURY_BRANDS.has(b)) ||
419
+ [...LUXURY_BRANDS].some(b => fullText.includes(b));
420
+ const mentionsLuxuryKeyword = [...LUXURY_KEYWORDS].some(k => fullText.includes(k));
421
+ if (mentionsLuxuryBrand)
422
+ score += 20.0;
423
+ if (mentionsLuxuryKeyword)
424
+ score += 10.0;
425
+ }
426
+ else if (hasBudgetQuery) {
427
+ const mentionsMassBrand = brands.some((b) => MASS_BUDGET_BRANDS.has(b)) ||
428
+ [...MASS_BUDGET_BRANDS].some(b => fullText.includes(b));
429
+ if (mentionsMassBrand)
430
+ score += 15.0;
431
+ }
432
+ // Pop-up keyword boost
433
+ if (isPopUpTrend) {
434
+ if (/\bpop-?ups?\b/i.test(title))
435
+ score += 8.0;
436
+ else if (/\bpop-?ups?\b/i.test(summary))
437
+ score += 4.0;
119
438
  }
120
- else if (title) {
121
- item.formatted_citation = `${title} (no link available)`;
439
+ // Query term overlap
440
+ for (const word of qWords) {
441
+ if (title.includes(word))
442
+ score += 4.0;
443
+ else if (summary.includes(word))
444
+ score += 2.0;
445
+ if (brands.some((b) => b.includes(word)))
446
+ score += 3.0;
122
447
  }
123
- else if (url) {
124
- item.formatted_citation = `[Source](${url})`;
448
+ // Trend topic overlap
449
+ for (const word of trendWords) {
450
+ if (title.includes(word))
451
+ score += 2.5;
452
+ else if (summary.includes(word))
453
+ score += 1.0;
125
454
  }
126
- return item;
455
+ // Content type preference (prioritize tangible proof/case studies)
456
+ if (contentType === 'signal' || contentType === 'case study' || contentType === 'case_study') {
457
+ score += 3.0;
458
+ }
459
+ else if (contentType === 'interpretation' || contentType === 'analysis') {
460
+ score += 1.5;
461
+ }
462
+ // Recency bonus
463
+ if (item.publishedAt) {
464
+ const daysAgo = (Date.now() - new Date(item.publishedAt).getTime()) / 864e5;
465
+ if (!isNaN(daysAgo) && daysAgo < 180)
466
+ score += 2.0;
467
+ }
468
+ return { item, score, originalIdx: idx, reason: 'ok' };
469
+ });
470
+ // Only allow positive-scoring, non-disqualified items
471
+ const positiveEligible = scored.filter(s => s.score >= 5.0);
472
+ positiveEligible.sort((a, b) => {
473
+ if (b.score !== a.score)
474
+ return b.score - a.score;
475
+ return a.originalIdx - b.originalIdx;
127
476
  });
477
+ // If no items qualify, return [] — never fall back to off-topic / disqualified items!
478
+ return positiveEligible.slice(0, maxItems).map(s => s.item);
479
+ }
480
+ function extractCleanDomain(urlStr) {
481
+ try {
482
+ const u = new URL(urlStr);
483
+ const host = u.hostname.replace(/^www\./, '');
484
+ if (host.includes('jingdaily'))
485
+ return 'via Jing Daily';
486
+ if (host.includes('businessoffashion') || host.includes('bof'))
487
+ return 'via BoF';
488
+ if (host.includes('mckinsey'))
489
+ return 'via McKinsey';
490
+ if (host.includes('365retail'))
491
+ return 'via 365 Retail';
492
+ if (host.includes('futuremarketinsights'))
493
+ return 'via Future Market Insights';
494
+ if (host.includes('insightaceanalytic'))
495
+ return 'via InsightAce Analytic';
496
+ if (host.includes('nytimes'))
497
+ return 'via NYT';
498
+ if (host.includes('wallpaper'))
499
+ return 'via Wallpaper*';
500
+ if (host.includes('digiday'))
501
+ return 'via Digiday';
502
+ return `via ${host}`;
503
+ }
504
+ catch {
505
+ return 'Source';
506
+ }
128
507
  }
129
508
  // ---------------------------------------------------------------------------
130
509
  // Fodda theme block — visualization branding for graph data
@@ -139,7 +518,7 @@ const GRAPH_COLOR_OVERRIDES = {
139
518
  export function getFoddaTheme(graphId) {
140
519
  const PSFK_DOMAIN_GRAPHS = getDomainGraphIds().size > 0
141
520
  ? getDomainGraphIds()
142
- : new Set(['retail', 'beauty', 'fashion', 'sports', 'ce-design']); // fallback
521
+ : new Set(['food', 'retail', 'tech', 'travel', 'beauty', 'fashion', 'sports', 'ce-design']); // fallback
143
522
  let graphTypeColor;
144
523
  if (GRAPH_COLOR_OVERRIDES[graphId]) {
145
524
  graphTypeColor = GRAPH_COLOR_OVERRIDES[graphId];
@@ -208,4 +587,38 @@ export function getSupplementalTheme() {
208
587
  }
209
588
  };
210
589
  }
590
+ /**
591
+ * Truncates whyNow cleanly without mid-word or mid-sentence cuts.
592
+ * - Leaves text intact if <= maxLength (default 280 chars).
593
+ * - Prefers breaking at sentence boundaries (.!?) if available between minLength (140) and maxLength.
594
+ * - Otherwise breaks at the nearest word boundary before maxLength and appends '...'.
595
+ * - Trims any dangling punctuation before the ellipsis.
596
+ */
597
+ export function cleanTruncateWhyNow(whyNow, maxLength = 280, minLength = 140) {
598
+ if (!whyNow || typeof whyNow !== 'string')
599
+ return whyNow;
600
+ const trimmed = whyNow.trim();
601
+ if (trimmed.length <= maxLength)
602
+ return trimmed;
603
+ const window = trimmed.slice(0, maxLength);
604
+ // Check for clean sentence ending within [minLength, maxLength]
605
+ // Matches period, exclamation, or question mark followed by whitespace or end of string
606
+ const sentenceMatches = [...window.matchAll(/([.!?])(?:\s+|$)/g)];
607
+ const validSentenceEnds = sentenceMatches
608
+ .map(m => (m.index ?? 0) + (m[1]?.length || 1))
609
+ .filter(idx => idx >= minLength && idx <= maxLength);
610
+ if (validSentenceEnds.length > 0) {
611
+ const bestEnd = validSentenceEnds[validSentenceEnds.length - 1];
612
+ return trimmed.slice(0, bestEnd).trim();
613
+ }
614
+ // Fall back to last word boundary
615
+ const lastSpace = window.lastIndexOf(' ');
616
+ if (lastSpace >= minLength) {
617
+ const cut = window.slice(0, lastSpace).replace(/[,;:—\-\.\s]+$/, '').trim();
618
+ return `${cut}...`;
619
+ }
620
+ // Fallback if no suitable word boundary found
621
+ const cut = window.replace(/[,;:—\-\.\s]+$/, '').trim();
622
+ return `${cut}...`;
623
+ }
211
624
  //# sourceMappingURL=enrichment.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"enrichment.js","sourceRoot":"","sources":["../src/enrichment.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"enrichment.js","sourceRoot":"","sources":["../src/enrichment.ts"],"names":[],"mappings":"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"}
@@ -14,13 +14,43 @@
14
14
  * (new individual trial system, planCode 13).
15
15
  */
16
16
  export declare function classifyAccessError(err: any): 'forbidden' | 'disabled' | 'credits' | 'legacy_retired' | null;
17
+ export interface UnifiedLimitErrorOptions {
18
+ code: 'DAILY_LIMIT_EXCEEDED' | 'PLAN_LIMIT_EXCEEDED' | 'CREDITS_EXHAUSTED' | 'TRIAL_EXHAUSTED';
19
+ setupUrl?: string | null;
20
+ topUpUrl?: string | null;
21
+ overageRateUsd?: number | null;
22
+ upgradeUrl?: string | null;
23
+ renewsAt?: string | null;
24
+ usage?: any;
25
+ payg?: any;
26
+ agentCheckout?: {
27
+ url?: string;
28
+ api_calls?: number;
29
+ price_usd?: number;
30
+ price?: number;
31
+ } | null;
32
+ }
33
+ export declare function buildChatGptQuotaExhausted(): {
34
+ isError: boolean;
35
+ content: {
36
+ type: 'text';
37
+ text: string;
38
+ }[];
39
+ };
40
+ export declare function buildUnifiedLimitError(options: UnifiedLimitErrorOptions): {
41
+ isError: boolean;
42
+ content: {
43
+ type: 'text';
44
+ text: string;
45
+ }[];
46
+ };
17
47
  /**
18
48
  * Build a user-friendly response for 403 errors on supplemental tools.
19
49
  * FORBIDDEN → silent skip (return empty data, not an error)
20
50
  * GRAPH_DISABLED → mention it so the user knows they opted out
21
51
  * CREDITS → trial-aware handling (auto-upgrade or prompt for email)
22
52
  */
23
- export declare function handleAccessError(err: any, toolName: string, userId?: string, apiKey?: string): Promise<{
53
+ export declare function handleAccessError(err: any, toolName: string, userId?: string, apiKey?: string, source?: string): Promise<{
24
54
  isError: boolean;
25
55
  content: {
26
56
  type: 'text';
@@ -35,14 +65,12 @@ export declare function handleAccessError(err: any, toolName: string, userId?: s
35
65
  * 2. Individual trial accounts — apiKey is `sk_live_` but backend returns
36
66
  * planCode 13 / isTrial / TRIAL_EXHAUSTED in the error response.
37
67
  *
38
- * When a trial user hits their limit (25 lifetime queries for individual,
39
- * 50 per-user for legacy):
40
- * - If userId (email) is available → attempt auto-upgrade to Base account
41
- * - If no userId → show upgrade portal link
42
- * - If not a trial key → standard credit exhaustion message
68
+ * When a trial user hits their limit:
69
+ * - If ChatGPT source → clean QUOTA_EXHAUSTED with zero commerce/pricing
70
+ * - Non-ChatGPT → unified limit error payload with verbatim next_action
43
71
  * Falls through to generic error handling for non-credit errors.
44
72
  */
45
- export declare function handleTrialCreditExhaustion(err: any, sessionApiKey: string, sessionUserId: string): Promise<{
73
+ export declare function handleTrialCreditExhaustion(err: any, sessionApiKey: string, sessionUserId: string, sessionSource?: string): Promise<{
46
74
  isError: boolean;
47
75
  content: {
48
76
  type: 'text';