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,333 @@
1
+ /**
2
+ * Verification Test: v2.2 MCP Visual House Style & Server SVG Template Hardening
3
+ */
4
+ import { renderCulturalShifts, renderCompetitiveCompass, renderTrendConstellation, renderImplicationLadder, renderInnovationPathway, renderWhiteSpaceMap, } from './svgVisuals.js';
5
+ import { FODDA_HOUSE_VISUAL_RECIPE_V2_2, FODDA_HOUSE_VISUAL_RECIPE_CONFIRM_THEMES, } from './systemPrompt.js';
6
+ let passed = 0;
7
+ let failed = 0;
8
+ function assert(condition, msg) {
9
+ if (condition) {
10
+ console.log(` ✅ ${msg}`);
11
+ passed++;
12
+ }
13
+ else {
14
+ console.error(` ❌ ${msg}`);
15
+ failed++;
16
+ }
17
+ }
18
+ console.log('\n--- 1. Testing Server-Side SVG Templates ---');
19
+ // 1. cultural_shifts
20
+ const shiftsSvg = renderCulturalShifts([
21
+ { from: 'Mass Production', to: 'Micro-Batch Customization' },
22
+ { from: 'Seasonal Drops', to: 'Continuous Real-Time Curation' },
23
+ ]);
24
+ assert(shiftsSvg.includes('class="fodda-viz"'), 'cultural_shifts has class="fodda-viz"');
25
+ assert(shiftsSvg.includes('.fodda-viz {'), 'cultural_shifts styles scoped to .fodda-viz');
26
+ assert(!shiftsSvg.includes(':root {'), 'cultural_shifts does NOT contain :root');
27
+ const svgOpenTag = shiftsSvg.slice(0, shiftsSvg.indexOf('>'));
28
+ assert(svgOpenTag.includes('width="100%"'), 'cultural_shifts opening svg tag has width="100%"');
29
+ assert(!svgOpenTag.includes('width="500"'), 'cultural_shifts opening svg tag does not have fixed pixel width');
30
+ assert(shiftsSvg.includes('fill="currentColor"'), 'cultural_shifts uses fill="currentColor"');
31
+ assert(shiftsSvg.includes('var(--fodda-accent)'), 'cultural_shifts uses var(--fodda-accent)');
32
+ assert(shiftsSvg.includes('shape-rendering="crispEdges"'), 'cultural_shifts uses crispEdges on rectilinear divider lines');
33
+ // 2. competitive_compass
34
+ const compassSvg = renderCompetitiveCompass([
35
+ { name: 'Nike', x: 0.7, y: 0.8, focus: true },
36
+ { name: 'Adidas', x: 0.3, y: 0.6 },
37
+ { name: 'Lululemon', x: 0.2, y: 0.85 },
38
+ { name: 'On Running', x: 0.8, y: 0.7 },
39
+ ], { left: 'Performance', right: 'Lifestyle', top: 'Premium', bottom: 'Mass Market' });
40
+ assert(compassSvg.includes('class="fodda-viz"'), 'competitive_compass has class="fodda-viz"');
41
+ assert(compassSvg.includes('.fodda-viz {'), 'competitive_compass styles scoped to .fodda-viz');
42
+ assert(compassSvg.includes('width="100%"'), 'competitive_compass has width="100%"');
43
+ assert(compassSvg.includes('shape-rendering="crispEdges"'), 'competitive_compass has crispEdges on 90° axis lines');
44
+ assert(compassSvg.includes('stroke="var(--fodda-line)"'), 'competitive_compass uses var(--fodda-line)');
45
+ assert(!compassSvg.includes('stroke-dasharray="3 3"/>'), 'competitive_compass has NO artificial pairwise connector lines');
46
+ assert(compassSvg.includes('text-anchor="start"'), 'competitive_compass anchors left label inward');
47
+ assert(compassSvg.includes('text-anchor="end"'), 'competitive_compass anchors right label inward');
48
+ assert(compassSvg.includes('y="244"'), 'competitive_compass places horizontal axis labels below axis line at y=244');
49
+ assert(compassSvg.includes('fill="var(--fodda-accent)"'), 'competitive_compass highlights focal brand with var(--fodda-accent)');
50
+ // Test top-level focus string parameter (e.g. focus: "On")
51
+ const topLevelFocusCompass = renderCompetitiveCompass([
52
+ { name: 'Nike', x: 0.7, y: 0.8 },
53
+ { name: 'On', x: 0.8, y: 0.7 },
54
+ { name: 'New Balance', x: 0.3, y: 0.5 },
55
+ ], { left: 'Performance', right: 'Lifestyle', top: 'Premium', bottom: 'Mass Market' }, 'On');
56
+ assert(topLevelFocusCompass.includes('fill="var(--fodda-accent)"'), 'competitive_compass highlights focal brand passed via top-level focus string');
57
+ // Test competitive_compass neutral when no focus is given
58
+ const neutralCompassSvg = renderCompetitiveCompass([
59
+ { name: 'Brand A', x: 0.2, y: 0.8 },
60
+ { name: 'Brand B', x: 0.8, y: 0.3 },
61
+ ], { left: 'Traditional', right: 'Innovative', top: 'Premium', bottom: 'Mass' });
62
+ assert(!neutralCompassSvg.includes('fill="var(--fodda-accent)"'), 'competitive_compass renders all nodes neutral when no focus is specified');
63
+ // 3. trend_constellation
64
+ const constellationSvg = renderTrendConstellation([
65
+ { name: 'Digital Identity', x: 0.2, y: 0.3, focus: true },
66
+ { name: 'Synthetic Media', x: 0.7, y: 0.4 },
67
+ { name: 'Autonomous Agents', x: 0.4, y: 0.8 },
68
+ ], [
69
+ { from: 0, to: 1, strength: 0.8 },
70
+ { from: 1, to: 2, strength: 0.6 },
71
+ ]);
72
+ assert(constellationSvg.includes('class="fodda-viz"'), 'trend_constellation has class="fodda-viz"');
73
+ assert(constellationSvg.includes('width="100%"'), 'trend_constellation has width="100%"');
74
+ assert(!constellationSvg.includes('shape-rendering="crispEdges"'), 'trend_constellation does NOT apply crispEdges to diagonal connectors');
75
+ assert(constellationSvg.includes('fill="var(--fodda-accent)"'), 'trend_constellation highlights focal trend with accent');
76
+ // 4. implication_ladder
77
+ const ladderSvg = renderImplicationLadder({
78
+ signal: 'Gen Z uses TikTok as primary search engine',
79
+ trend: 'Algorithmic Visual Discovery',
80
+ so_what: 'Text-first SEO ranking value drops 40%',
81
+ do_what: 'Reallocate 30% of content budget to short-form indexed video',
82
+ });
83
+ assert(ladderSvg.includes('class="fodda-viz"'), 'implication_ladder has class="fodda-viz"');
84
+ assert(ladderSvg.includes('width="100%"'), 'implication_ladder has width="100%"');
85
+ assert(ladderSvg.includes('shape-rendering="crispEdges"'), 'implication_ladder uses crispEdges on vertical spine line');
86
+ assert(ladderSvg.includes('fill="var(--fodda-accent)"'), 'implication_ladder highlights "Do What" rung with accent');
87
+ // 5. innovation_pathway
88
+ const pathwaySvg = renderInnovationPathway({
89
+ now: 'Fragmented manual research',
90
+ near_term: 'Agent-assisted synthesis',
91
+ future: 'Autonomous intelligence loops',
92
+ });
93
+ assert(pathwaySvg.includes('class="fodda-viz"'), 'innovation_pathway has class="fodda-viz"');
94
+ assert(pathwaySvg.includes('width="100%"'), 'innovation_pathway has width="100%"');
95
+ assert(pathwaySvg.includes('shape-rendering="crispEdges"'), 'innovation_pathway uses crispEdges on horizontal connector line');
96
+ assert(pathwaySvg.includes('fill="var(--fodda-accent)"'), 'innovation_pathway highlights future vision step with accent');
97
+ // 6. opportunity_map
98
+ const mapSvg = renderWhiteSpaceMap([
99
+ { name: 'Feature X', consumer_desire: 0.9, market_activity: 0.1 },
100
+ { name: 'Feature Y', consumer_desire: 0.3, market_activity: 0.8 },
101
+ ], 'Market Activity →', 'Consumer Desire →');
102
+ assert(mapSvg.includes('class="fodda-viz"'), 'opportunity_map has class="fodda-viz"');
103
+ assert(mapSvg.includes('width="100%"'), 'opportunity_map has width="100%"');
104
+ assert(mapSvg.includes('★ BUILD HERE'), 'opportunity_map renders ★ BUILD HERE zone');
105
+ assert(mapSvg.includes('shape-rendering="crispEdges"'), 'opportunity_map applies crispEdges on 90° axes');
106
+ console.log('\n--- 2. Testing Client-Rendered Multi-Item Guidance Recipes ---');
107
+ assert(FODDA_HOUSE_VISUAL_RECIPE_V2_2.includes('[Fodda House Visual Recipe v2.2]'), 'Recipe v2.2 contains header');
108
+ assert(FODDA_HOUSE_VISUAL_RECIPE_V2_2.includes('currentColor and host CSS variables'), 'Recipe v2.2 mentions currentColor');
109
+ assert(FODDA_HOUSE_VISUAL_RECIPE_V2_2.includes('Light mode: Bg #ffffff / #faf9f5'), 'Recipe v2.2 contains light mode palette');
110
+ assert(FODDA_HOUSE_VISUAL_RECIPE_V2_2.includes('Dark mode: Bg #18181b'), 'Recipe v2.2 contains dark mode palette');
111
+ assert(FODDA_HOUSE_VISUAL_RECIPE_CONFIRM_THEMES.includes('Layout hint: Horizontal progress stepper'), 'confirm_themes recipe has stepper layout hint');
112
+ console.log('\n--- 3. Testing Brand Intelligence Widget v2.2 Hardening ---');
113
+ import { renderBrandWidget } from './brandTemplate.js';
114
+ import { computeMomentum } from './enrichment.js';
115
+ // Test all 4 momentum computation states
116
+ const momAcc = computeMomentum({ freshnessDays: 20 });
117
+ const momStd = computeMomentum({ freshnessDays: 60 });
118
+ const momBld = computeMomentum({ freshnessDays: 150 });
119
+ const momSlow = computeMomentum({ freshnessDays: 300 });
120
+ const momFading = computeMomentum({ lifecycle: 'fading' });
121
+ const momFallback = computeMomentum({ lifecycle: 'emerging' });
122
+ assert(momAcc === 'accelerating', 'computeMomentum returns accelerating for <45 days');
123
+ assert(momStd === 'steady', 'computeMomentum returns steady for 60 days');
124
+ assert(momBld === 'building', 'computeMomentum returns building for 150 days');
125
+ assert(momSlow === 'slowing', 'computeMomentum returns slowing for >240 days');
126
+ assert(momFading === 'slowing', 'computeMomentum returns slowing for fading lifecycle');
127
+ assert(momFallback === 'steady', 'computeMomentum defaults unknown active trends to steady');
128
+ // Test brand widget generation
129
+ const sampleProfile = {
130
+ brand: 'Nike',
131
+ summary: { lifecycle_distribution: { building: 3, emerging: 2, mature: 4 } },
132
+ trend_footprint: [
133
+ { trend_name: 'Direct to Consumer 2.0', graphName: 'retail', evidence_count: 8, lifecycle: 'mature', momentum: 'steady' },
134
+ { trend_name: 'Generative Athletic Apparel', graphName: 'fashion', evidence_count: 5, lifecycle: 'building', momentum: 'building' },
135
+ { trend_name: 'Micro-Community Running', graphName: 'sports', evidence_count: 3, lifecycle: 'emerging', momentum: 'accelerating' },
136
+ ],
137
+ evidence_items: [
138
+ { title: 'Nike Direct Shift', published_at: '2025-11-15', category: 'Case Study', graphName: 'retail', source_url: 'https://example.com/article' },
139
+ { title: '361° Innovation', published_at: null, category: 'Signal', graphName: 'sports' }, // no date
140
+ ],
141
+ competitive_context: { co_occurring_brands: [] }, // empty competitors
142
+ cross_graph_presence: [{ graphName: 'retail' }, { graphName: 'fashion' }, { graphName: 'sports' }],
143
+ supplemental_signals: {
144
+ google_trends: {
145
+ interest_over_time: [
146
+ { date: '2025-08-31', value: 40 },
147
+ { date: '2026-02-15', value: 85 },
148
+ ],
149
+ peak_interest: 85,
150
+ latest_value: 85,
151
+ },
152
+ },
153
+ };
154
+ const brandWidgetResult = await renderBrandWidget(sampleProfile);
155
+ const widgetHtml = brandWidgetResult.widget_html;
156
+ assert(widgetHtml.includes('.fodda-brand-widget'), 'Brand widget styles scoped to .fodda-brand-widget');
157
+ assert(!widgetHtml.includes(':root{'), 'Brand widget does NOT contain :root');
158
+ assert(!widgetHtml.includes('<div class="sec">Competitive</div>'), 'Brand widget hides Competitive header when competitors array is empty');
159
+ assert(!widgetHtml.includes('<span class="bd"></span>'), 'Brand widget does not render empty date badges');
160
+ assert(widgetHtml.includes("Aug '25"), 'Brand widget computes dynamic start date for Google Trends');
161
+ assert(!widgetHtml.includes("Apr '25"), 'Brand widget does NOT use hardcoded Apr 25 start date');
162
+ assert(widgetHtml.includes('var(--fodda-accent)'), 'Brand widget Google Trends uses var(--fodda-accent)');
163
+ assert(widgetHtml.includes('<svg width="24" height="24"'), 'Brand widget uses inline SVG logo');
164
+ // Headline verdict verification (should read trend momentums, not contradict with slowing ↓)
165
+ assert(widgetHtml.includes('rising ↑') || widgetHtml.includes('building ↗'), 'Headline verdict matches trend momentum (rising/building, NOT slowing)');
166
+ assert(!widgetHtml.includes('slowing ↓'), 'Headline verdict does NOT contradict active trend momentum');
167
+ console.log('\n--- 4. Testing Recipe Delivery Paths ---');
168
+ // Verify recipe is attached when widget is absent
169
+ const testContentNoWidget = [{ type: 'text', text: 'raw data' }];
170
+ const testWidgetEmpty = { widget_html: '' };
171
+ if (testWidgetEmpty.widget_html) {
172
+ testContentNoWidget.push({ type: 'text', text: 'widget block' });
173
+ }
174
+ else {
175
+ testContentNoWidget.push({ type: 'text', text: FODDA_HOUSE_VISUAL_RECIPE_V2_2 });
176
+ }
177
+ assert(testContentNoWidget.some(c => c.text.includes('[Fodda House Visual Recipe v2.2]')), 'Recipe attaches when widget_html is absent');
178
+ // Verify recipe is suppressed when widget is present
179
+ const testContentWithWidget = [{ type: 'text', text: 'raw data' }];
180
+ const testWidgetPresent = { widget_html: '<div class="fodda-brand-widget">...</div>' };
181
+ if (testWidgetPresent.widget_html) {
182
+ testContentWithWidget.push({ type: 'text', text: testWidgetPresent.widget_html });
183
+ }
184
+ else {
185
+ testContentWithWidget.push({ type: 'text', text: FODDA_HOUSE_VISUAL_RECIPE_V2_2 });
186
+ }
187
+ assert(!testContentWithWidget.some(c => c.text.includes('[Fodda House Visual Recipe v2.2]')), 'Recipe is suppressed when widget_html is present');
188
+ import fs from 'fs';
189
+ import path from 'path';
190
+ // Generate HTML gallery for manual visual verification (Light Mode, Dark Mode, 380px column)
191
+ const htmlGallery = `<!DOCTYPE html>
192
+ <html lang="en">
193
+ <head>
194
+ <meta charset="UTF-8">
195
+ <title>Fodda MCP Visual Hardening v2.2 - Preview Gallery</title>
196
+ <style>
197
+ body {
198
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
199
+ margin: 0;
200
+ padding: 24px;
201
+ background: #e2e8f0;
202
+ color: #1e293b;
203
+ }
204
+ h1, h2 { margin-top: 0; }
205
+ .grid {
206
+ display: grid;
207
+ grid-template-columns: 1fr 1fr;
208
+ gap: 24px;
209
+ margin-bottom: 32px;
210
+ }
211
+ .preview-card {
212
+ border-radius: 12px;
213
+ padding: 20px;
214
+ box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1);
215
+ }
216
+ .light-theme {
217
+ background: #ffffff;
218
+ color: #18181b;
219
+ }
220
+ .dark-theme {
221
+ background: #18181b;
222
+ color: #f4f4f5;
223
+ }
224
+ .mobile-container {
225
+ width: 380px;
226
+ margin: 0 auto;
227
+ border: 2px dashed #94a3b8;
228
+ padding: 12px;
229
+ border-radius: 12px;
230
+ }
231
+ .section-title {
232
+ font-size: 18px;
233
+ font-weight: 700;
234
+ margin-bottom: 12px;
235
+ padding-bottom: 6px;
236
+ border-bottom: 2px solid #cbd5e1;
237
+ }
238
+ </style>
239
+ </head>
240
+ <body>
241
+ <h1>Fodda MCP Visual House Style & Server SVG Hardening (v2.2)</h1>
242
+ <p>Visual verification suite for Light Theme, Dark Theme, and Narrow Mobile Viewport (380px).</p>
243
+
244
+ <h2 class="section-title">1. Cultural Shifts</h2>
245
+ <div class="grid">
246
+ <div class="preview-card light-theme">
247
+ <h3>Light Mode</h3>
248
+ ${shiftsSvg}
249
+ </div>
250
+ <div class="preview-card dark-theme">
251
+ <h3>Dark Mode</h3>
252
+ ${shiftsSvg}
253
+ </div>
254
+ </div>
255
+
256
+ <h2 class="section-title">2. Competitive Positioning Compass</h2>
257
+ <div class="grid">
258
+ <div class="preview-card light-theme">
259
+ <h3>Light Mode (Standard)</h3>
260
+ ${compassSvg}
261
+ </div>
262
+ <div class="preview-card dark-theme">
263
+ <h3>Dark Mode (Standard)</h3>
264
+ ${compassSvg}
265
+ </div>
266
+ </div>
267
+ <div class="mobile-container light-theme">
268
+ <h3>Mobile 380px Container (Light)</h3>
269
+ ${compassSvg}
270
+ </div>
271
+
272
+ <h2 class="section-title">3. Trend Constellation</h2>
273
+ <div class="grid">
274
+ <div class="preview-card light-theme">
275
+ <h3>Light Mode</h3>
276
+ ${constellationSvg}
277
+ </div>
278
+ <div class="preview-card dark-theme">
279
+ <h3>Dark Mode</h3>
280
+ ${constellationSvg}
281
+ </div>
282
+ </div>
283
+
284
+ <h2 class="section-title">4. Strategic Implication Ladder</h2>
285
+ <div class="grid">
286
+ <div class="preview-card light-theme">
287
+ <h3>Light Mode</h3>
288
+ ${ladderSvg}
289
+ </div>
290
+ <div class="preview-card dark-theme">
291
+ <h3>Dark Mode</h3>
292
+ ${ladderSvg}
293
+ </div>
294
+ </div>
295
+
296
+ <h2 class="section-title">5. Innovation Pathway</h2>
297
+ <div class="grid">
298
+ <div class="preview-card light-theme">
299
+ <h3>Light Mode</h3>
300
+ ${pathwaySvg}
301
+ </div>
302
+ <div class="preview-card dark-theme">
303
+ <h3>Dark Mode</h3>
304
+ ${pathwaySvg}
305
+ </div>
306
+ </div>
307
+
308
+ <h2 class="section-title">6. Opportunity White Space Map</h2>
309
+ <div class="grid">
310
+ <div class="preview-card light-theme">
311
+ <h3>Light Mode</h3>
312
+ ${mapSvg}
313
+ </div>
314
+ <div class="preview-card dark-theme">
315
+ <h3>Dark Mode</h3>
316
+ ${mapSvg}
317
+ </div>
318
+ </div>
319
+ </body>
320
+ </html>`;
321
+ const scratchDir = path.resolve('scratch');
322
+ if (!fs.existsSync(scratchDir))
323
+ fs.mkdirSync(scratchDir, { recursive: true });
324
+ fs.writeFileSync(path.join(scratchDir, 'visual_preview.html'), htmlGallery, 'utf8');
325
+ console.log(' ✅ Generated scratch/visual_preview.html gallery for manual visual inspection.');
326
+ console.log(`\nResults: ${passed} passed, ${failed} failed`);
327
+ if (failed > 0) {
328
+ process.exit(1);
329
+ }
330
+ else {
331
+ console.log('🎉 All tests passed successfully!');
332
+ }
333
+ //# sourceMappingURL=test_v2_2_visual_hardening.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_v2_2_visual_hardening.js","sourceRoot":"","sources":["../src/test_v2_2_visual_hardening.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test_verify_deprecate_render_spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_verify_deprecate_render_spec.d.ts","sourceRoot":"","sources":["../src/test_verify_deprecate_render_spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,217 @@
1
+ import assert from 'node:assert';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { createServer } from './toolHandlers.js';
6
+ import { setCachedCatalogForTesting } from './catalogCache.js';
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+ console.log('=== Running Verification: Deprecate Imperative Render Spec & Migrate to Structured Next Moves ===\n');
10
+ let passed = 0;
11
+ let failed = 0;
12
+ function check(condition, msg) {
13
+ if (condition) {
14
+ console.log(` ✅ ${msg}`);
15
+ passed++;
16
+ }
17
+ else {
18
+ console.error(` ❌ ${msg}`);
19
+ failed++;
20
+ }
21
+ }
22
+ // ---------------------------------------------------------------------------
23
+ // 1. Static Invariant Grep Check: Zero occurrences in toolHandlers.ts & systemPrompt.ts
24
+ // ---------------------------------------------------------------------------
25
+ console.log('1. Verifying Zero Imperative Closing Directives in Source Files...');
26
+ const projectRoot = path.resolve(__dirname, '..');
27
+ const srcDir = fs.existsSync(path.resolve(__dirname, 'toolHandlers.ts')) ? __dirname : path.resolve(projectRoot, 'src');
28
+ const toolHandlersPath = path.resolve(srcDir, 'toolHandlers.ts');
29
+ const systemPromptPath = path.resolve(srcDir, 'systemPrompt.ts');
30
+ const toolHandlersContent = fs.readFileSync(toolHandlersPath, 'utf8');
31
+ const systemPromptContent = fs.readFileSync(systemPromptPath, 'utf8');
32
+ const forbiddenImperatives = [
33
+ '── NEXT MOVES CLOSING BLOCK',
34
+ 'Reproduce this exact 3-sentence closing block verbatim',
35
+ 'Reproduce this exact',
36
+ 'closingBlockInstruction'
37
+ ];
38
+ for (const phrase of forbiddenImperatives) {
39
+ const thCount = (toolHandlersContent.match(new RegExp(phrase.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g')) || []).length;
40
+ check(thCount === 0, `Zero occurrences of "${phrase}" in toolHandlers.ts (found ${thCount})`);
41
+ }
42
+ const spBannerCount = (systemPromptContent.match(/NEXT MOVES CLOSING BLOCK \(Render Spec 1\.3\)/g) || []).length;
43
+ check(spBannerCount === 0, `Zero occurrences of "NEXT MOVES CLOSING BLOCK (Render Spec 1.3)" in systemPrompt.ts (found ${spBannerCount})`);
44
+ // ---------------------------------------------------------------------------
45
+ // 2. Runtime Invocation Verification: brand_tracker and consult_human_agent
46
+ // ---------------------------------------------------------------------------
47
+ console.log('\n2. Verifying Runtime Tool Outputs & Structured next_moves...');
48
+ const mockGraphsList = [
49
+ {
50
+ graph_id: 'retail',
51
+ name: 'Retail Strategy & Innovation',
52
+ domain: 'retail',
53
+ graph_type: 'domain',
54
+ status: 'live',
55
+ topics: ['retail', 'commerce'],
56
+ trend_count: 150,
57
+ evidence_count: 500,
58
+ headline: 'Future of retail operations and omnichannel commerce'
59
+ },
60
+ {
61
+ graph_id: 'sports',
62
+ name: 'Sports & Active Culture',
63
+ domain: 'sports',
64
+ graph_type: 'domain',
65
+ status: 'live',
66
+ topics: ['sports', 'footwear'],
67
+ trend_count: 95,
68
+ evidence_count: 400,
69
+ headline: 'Performance footwear, digital athletics, and fan engagement'
70
+ },
71
+ {
72
+ graph_id: 'ben-dietz-sic',
73
+ name: '[SIC] Weekly — Cultural Strategy',
74
+ domain: 'culture',
75
+ graph_type: 'expert',
76
+ status: 'live',
77
+ curator: 'Ben Dietz',
78
+ topics: ['culture', 'marketing'],
79
+ trend_count: 80,
80
+ evidence_count: 320,
81
+ headline: 'Youth culture, street culture, and brand relevance'
82
+ }
83
+ ];
84
+ const mockAnalystsList = [
85
+ {
86
+ analyst_id: 'ben-dietz-sic',
87
+ name: 'Ben Dietz',
88
+ status: 'Active',
89
+ topics: ['culture', 'marketing'],
90
+ description: 'Cultural strategy and youth marketing',
91
+ graph_type: 'expert'
92
+ }
93
+ ];
94
+ setCachedCatalogForTesting({ version: '1.0', generated_at: new Date().toISOString(), graph_count: mockGraphsList.length, graphs: mockGraphsList }, mockAnalystsList);
95
+ async function mockFoddaBackend(method, endpoint, apiKey, userId, body) {
96
+ if (endpoint.includes('/v1/graphs/catalog') || endpoint === '/v1/graphs') {
97
+ return { graphs: mockGraphsList };
98
+ }
99
+ if (endpoint.includes('/v1/analysts') || endpoint.includes('/v1/human-agents')) {
100
+ if (endpoint.includes('/consult')) {
101
+ return {
102
+ coverage: 'in',
103
+ report: 'Cultural brands must anchor community-led commerce around authentic rituals.',
104
+ sources_used: [
105
+ { title: 'Community Rituals in Streetwear', graphId: 'ben-dietz-sic', brandNames: ['Supreme', 'Aimé Leon Dore'] }
106
+ ],
107
+ expert_thread: {
108
+ on_topic_total: 8,
109
+ cited_count: 1,
110
+ uncited_themes: ['Zines & Subcultures', 'Discord Councils'],
111
+ brands: ['Supreme', 'Aimé Leon Dore'],
112
+ next_angle: 'We can explore how creator-led retail formats differ across European luxury markets next.'
113
+ },
114
+ session_id: 'sess_test_123'
115
+ };
116
+ }
117
+ return mockAnalystsList;
118
+ }
119
+ if (endpoint.includes('/v1/supplemental/truth/')) {
120
+ return {
121
+ source: 'truth_layer',
122
+ truth_layer: { ticker: 'NKE', company: 'Nike, Inc.', headline: 'Direct channel growth and inventory normalization' }
123
+ };
124
+ }
125
+ if (endpoint.includes('/brand-intelligence') || endpoint.includes('/graphs/')) {
126
+ return {
127
+ brand: 'Nike',
128
+ trend_footprint: [
129
+ { title: 'Digital Athlete Ecosystems', graphId: 'sports', score: 1.9, brandNames: ['Nike', 'Apple'] },
130
+ { title: 'Direct-to-Consumer Innovation', graphId: 'retail', score: 1.7, brandNames: ['Nike', 'Adidas'] },
131
+ { title: 'Sustainable Performance Materials', graphId: 'sports', score: 1.6, brandNames: ['Nike'] }
132
+ ],
133
+ competitive_context: {
134
+ co_occurring: [
135
+ { brand: 'Adidas', co_occurrences: 6, graphIds: ['retail', 'sports'] },
136
+ { brand: 'Lululemon', co_occurrences: 4, graphIds: ['sports'] }
137
+ ]
138
+ },
139
+ summary: {
140
+ total_evidence_items: 24,
141
+ total_trends_connected: 8,
142
+ graphs_present_in: ['sports', 'retail']
143
+ }
144
+ };
145
+ }
146
+ return {};
147
+ }
148
+ async function runRuntimeTests() {
149
+ const server = await createServer('sk_live_test_key', 'user_test_123', mockFoddaBackend, async () => ({}), () => '', () => 'https://mcp.fodda.ai');
150
+ // Test A: brand_tracker("Nike")
151
+ const brandTrackerReg = server._registeredTools['brand_tracker'];
152
+ assert.ok(brandTrackerReg, 'brand_tracker tool must be registered');
153
+ const brandTrackerFn = brandTrackerReg.handler || brandTrackerReg.callback || brandTrackerReg.execute;
154
+ const btRes = await brandTrackerFn({ brand_name: 'Nike' }, { authInfo: {} });
155
+ assert.ok(Array.isArray(btRes.content) && btRes.content.length > 0, 'brand_tracker must return content array');
156
+ const btFullText = btRes.content.map((c) => c.text || '').join('\n');
157
+ check(!btFullText.includes('── NEXT MOVES CLOSING BLOCK'), 'brand_tracker content does not contain NEXT MOVES CLOSING BLOCK banner');
158
+ check(!btFullText.includes('Reproduce this exact 3-sentence closing block verbatim'), 'brand_tracker content does not contain imperative reproduction directive');
159
+ // Extract next_moves
160
+ let btNextMoves = btRes.next_moves;
161
+ if (!btNextMoves) {
162
+ for (const c of btRes.content) {
163
+ if (c.text?.startsWith('{') || c.text?.includes('── RAW DATA')) {
164
+ const raw = c.text.replace('── RAW DATA (for follow-up reasoning) ──\n', '').trim();
165
+ try {
166
+ const parsed = JSON.parse(raw);
167
+ if (parsed?.next_moves)
168
+ btNextMoves = parsed.next_moves;
169
+ }
170
+ catch { }
171
+ }
172
+ }
173
+ }
174
+ check(!!btNextMoves, 'brand_tracker returns structured next_moves metadata');
175
+ check(!!btNextMoves?.thread, 'brand_tracker next_moves has thread');
176
+ check(!!(btNextMoves?.specific || btNextMoves?.shelf), 'brand_tracker next_moves has specific or shelf');
177
+ check(typeof btNextMoves?.scope === 'string' && btNextMoves.scope.length > 0, `brand_tracker next_moves has scope string: "${btNextMoves?.scope}"`);
178
+ // Test B: consult_human_agent
179
+ const consultReg = server._registeredTools['consult_human_agent'];
180
+ assert.ok(consultReg, 'consult_human_agent tool must be registered');
181
+ const consultFn = consultReg.handler || consultReg.callback || consultReg.execute;
182
+ const consultRes = await consultFn({ analyst_id: 'ben-dietz-sic', query: 'What is the future of creator-led retail?' }, { authInfo: {} });
183
+ assert.ok(Array.isArray(consultRes.content) && consultRes.content.length > 0, 'consult_human_agent must return content array');
184
+ const consultFullText = consultRes.content.map((c) => c.text || '').join('\n');
185
+ check(!consultFullText.includes('── NEXT MOVES CLOSING BLOCK'), 'consult_human_agent content does not contain NEXT MOVES CLOSING BLOCK banner');
186
+ check(!consultFullText.includes('Reproduce this exact 3-sentence closing block verbatim'), 'consult_human_agent content does not contain imperative reproduction directive');
187
+ const consultNextMoves = consultRes.next_moves;
188
+ check(!!consultNextMoves, 'consult_human_agent returns structured next_moves metadata');
189
+ check(!!consultNextMoves?.thread, 'consult_human_agent next_moves has thread');
190
+ check(typeof consultNextMoves?.scope === 'string' && consultNextMoves.scope.length > 0, `consult_human_agent next_moves has scope string: "${consultNextMoves?.scope}"`);
191
+ check(!!consultNextMoves?.consult_envelope, 'consult_human_agent next_moves has consult_envelope');
192
+ check(typeof consultNextMoves?.consult_envelope?.thread_line === 'string', 'consult_human_agent consult_envelope has thread_line');
193
+ check(typeof consultNextMoves?.consult_envelope?.shelf_line === 'string', 'consult_human_agent consult_envelope has shelf_line');
194
+ check(typeof consultNextMoves?.consult_envelope?.scope_line === 'string', 'consult_human_agent consult_envelope has scope_line');
195
+ check(consultRes.content[0].text.includes('── STRUCTURED NEXT MOVES'), 'consult_human_agent content[0].text includes STRUCTURED NEXT MOVES metadata block');
196
+ check(consultRes.content[0].text.includes('--- SUGGESTED FOLLOW-UPS ---'), 'consult_human_agent content[0].text includes SUGGESTED FOLLOW-UPS block');
197
+ check(consultRes.content[0].text.includes('consult_envelope'), 'consult_human_agent content[0].text contains consult_envelope metadata');
198
+ // Test C: consult_analyst
199
+ const analystReg = server._registeredTools['consult_analyst'];
200
+ assert.ok(analystReg, 'consult_analyst tool must be registered');
201
+ const analystFn = analystReg.handler || analystReg.callback || analystReg.execute;
202
+ const analystRes = await analystFn({ analyst_id: 'ben-dietz-sic', query: 'What is the future of creator-led retail?' }, { authInfo: {} });
203
+ assert.ok(Array.isArray(analystRes.content) && analystRes.content.length > 0, 'consult_analyst must return content array');
204
+ check(!analystRes.content[0].text.includes('── NEXT MOVES CLOSING BLOCK'), 'consult_analyst content does not contain NEXT MOVES CLOSING BLOCK banner');
205
+ check(analystRes.content[0].text.includes('── STRUCTURED NEXT MOVES'), 'consult_analyst content[0].text includes STRUCTURED NEXT MOVES metadata block');
206
+ check(analystRes.content[0].text.includes('--- SUGGESTED FOLLOW-UPS ---'), 'consult_analyst content[0].text includes SUGGESTED FOLLOW-UPS block');
207
+ check(analystRes.content[0].text.includes('consult_envelope'), 'consult_analyst content[0].text contains consult_envelope metadata');
208
+ console.log(`\nVerification Summary: ${passed} checks passed, ${failed} checks failed.`);
209
+ if (failed > 0) {
210
+ process.exit(1);
211
+ }
212
+ }
213
+ runRuntimeTests().catch(err => {
214
+ console.error('Verification run failed:', err);
215
+ process.exit(1);
216
+ });
217
+ //# sourceMappingURL=test_verify_deprecate_render_spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_verify_deprecate_render_spec.js","sourceRoot":"","sources":["../src/test_verify_deprecate_render_spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test_verify_neil_demo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_verify_neil_demo.d.ts","sourceRoot":"","sources":["../src/test_verify_neil_demo.ts"],"names":[],"mappings":""}