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.
- package/README.md +14 -94
- package/dist/agents/fodda-researcher/skills.d.ts +1 -1
- package/dist/agents/fodda-researcher/skills.d.ts.map +1 -1
- package/dist/agents/fodda-researcher/skills.js +1 -1
- package/dist/brandTemplate.d.ts +1 -1
- package/dist/brandTemplate.d.ts.map +1 -1
- package/dist/brandTemplate.js +162 -74
- package/dist/brandTemplate.js.map +1 -1
- package/dist/catalogCache.d.ts +29 -1
- package/dist/catalogCache.d.ts.map +1 -1
- package/dist/catalogCache.js +267 -16
- package/dist/catalogCache.js.map +1 -1
- package/dist/coverageRelevance.d.ts +97 -2
- package/dist/coverageRelevance.d.ts.map +1 -1
- package/dist/coverageRelevance.js +959 -164
- package/dist/coverageRelevance.js.map +1 -1
- package/dist/editorialFill.d.ts +5 -0
- package/dist/editorialFill.d.ts.map +1 -1
- package/dist/editorialFill.js +1 -1
- package/dist/editorialFill.js.map +1 -1
- package/dist/enrichment.d.ts +26 -0
- package/dist/enrichment.d.ts.map +1 -1
- package/dist/enrichment.js +394 -31
- package/dist/enrichment.js.map +1 -1
- package/dist/errorHandling.d.ts +35 -7
- package/dist/errorHandling.d.ts.map +1 -1
- package/dist/errorHandling.js +225 -155
- package/dist/errorHandling.js.map +1 -1
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +351 -143
- package/dist/index.js.map +1 -1
- package/dist/jobs/jlens_quarterly_sweep.d.ts +62 -0
- package/dist/jobs/jlens_quarterly_sweep.d.ts.map +1 -0
- package/dist/jobs/jlens_quarterly_sweep.js +160 -0
- package/dist/jobs/jlens_quarterly_sweep.js.map +1 -0
- package/dist/pricingCache.d.ts.map +1 -1
- package/dist/pricingCache.js +41 -1
- package/dist/pricingCache.js.map +1 -1
- package/dist/queryCache.d.ts.map +1 -1
- package/dist/queryCache.js +2 -0
- package/dist/queryCache.js.map +1 -1
- package/dist/reportBriefing.d.ts +89 -0
- package/dist/reportBriefing.d.ts.map +1 -0
- package/dist/reportBriefing.js +662 -0
- package/dist/reportBriefing.js.map +1 -0
- package/dist/searchTemplate.d.ts.map +1 -1
- package/dist/searchTemplate.js +65 -53
- package/dist/searchTemplate.js.map +1 -1
- package/dist/services/graphRouter.d.ts +7 -0
- package/dist/services/graphRouter.d.ts.map +1 -0
- package/dist/services/graphRouter.js +7 -0
- package/dist/services/graphRouter.js.map +1 -0
- package/dist/services/notifications.d.ts +49 -0
- package/dist/services/notifications.d.ts.map +1 -0
- package/dist/services/notifications.js +206 -0
- package/dist/services/notifications.js.map +1 -0
- package/dist/sessionTracker.d.ts +19 -2
- package/dist/sessionTracker.d.ts.map +1 -1
- package/dist/sessionTracker.js +69 -16
- package/dist/sessionTracker.js.map +1 -1
- package/dist/skillClient.d.ts.map +1 -1
- package/dist/skillClient.js +11 -6
- package/dist/skillClient.js.map +1 -1
- package/dist/svgVisuals.d.ts +17 -19
- package/dist/svgVisuals.d.ts.map +1 -1
- package/dist/svgVisuals.js +189 -233
- package/dist/svgVisuals.js.map +1 -1
- package/dist/systemPrompt.d.ts +7 -2
- package/dist/systemPrompt.d.ts.map +1 -1
- package/dist/systemPrompt.js +110 -68
- package/dist/systemPrompt.js.map +1 -1
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +15 -0
- package/dist/telemetry.js.map +1 -1
- package/dist/test_adjacent_trends_polymorphic.d.ts +2 -0
- package/dist/test_adjacent_trends_polymorphic.d.ts.map +1 -0
- package/dist/test_adjacent_trends_polymorphic.js +154 -0
- package/dist/test_adjacent_trends_polymorphic.js.map +1 -0
- package/dist/test_book_a_call_live.js +18 -5
- package/dist/test_book_a_call_live.js.map +1 -1
- package/dist/test_byo_mcp_submission_clarity.d.ts +2 -0
- package/dist/test_byo_mcp_submission_clarity.d.ts.map +1 -0
- package/dist/test_byo_mcp_submission_clarity.js +142 -0
- package/dist/test_byo_mcp_submission_clarity.js.map +1 -0
- package/dist/test_capabilities_guidance.d.ts +2 -0
- package/dist/test_capabilities_guidance.d.ts.map +1 -0
- package/dist/test_capabilities_guidance.js +372 -0
- package/dist/test_capabilities_guidance.js.map +1 -0
- package/dist/test_client_provenance.d.ts +2 -0
- package/dist/test_client_provenance.d.ts.map +1 -0
- package/dist/test_client_provenance.js +77 -0
- package/dist/test_client_provenance.js.map +1 -0
- package/dist/test_connection_surface_cleanup.d.ts +2 -0
- package/dist/test_connection_surface_cleanup.d.ts.map +1 -0
- package/dist/test_connection_surface_cleanup.js +203 -0
- package/dist/test_connection_surface_cleanup.js.map +1 -0
- package/dist/test_consult_routing.d.ts +2 -0
- package/dist/test_consult_routing.d.ts.map +1 -0
- package/dist/test_consult_routing.js +86 -0
- package/dist/test_consult_routing.js.map +1 -0
- package/dist/test_consult_split.d.ts +2 -0
- package/dist/test_consult_split.d.ts.map +1 -0
- package/dist/test_consult_split.js +30 -0
- package/dist/test_consult_split.js.map +1 -0
- package/dist/test_coverage_relevance.js +111 -70
- package/dist/test_coverage_relevance.js.map +1 -1
- package/dist/test_coverage_replay.d.ts +2 -0
- package/dist/test_coverage_replay.d.ts.map +1 -0
- package/dist/test_coverage_replay.js +170 -0
- package/dist/test_coverage_replay.js.map +1 -0
- package/dist/test_dcr_and_legacy_deprecation.js +45 -50
- package/dist/test_dcr_and_legacy_deprecation.js.map +1 -1
- package/dist/test_demand_signal_logging.d.ts +2 -0
- package/dist/test_demand_signal_logging.d.ts.map +1 -0
- package/dist/test_demand_signal_logging.js +92 -0
- package/dist/test_demand_signal_logging.js.map +1 -0
- package/dist/test_earnings_activity_scope.d.ts +5 -0
- package/dist/test_earnings_activity_scope.d.ts.map +1 -0
- package/dist/test_earnings_activity_scope.js +101 -0
- package/dist/test_earnings_activity_scope.js.map +1 -0
- package/dist/test_earnings_divergence_live.d.ts +5 -0
- package/dist/test_earnings_divergence_live.d.ts.map +1 -0
- package/dist/test_earnings_divergence_live.js +135 -0
- package/dist/test_earnings_divergence_live.js.map +1 -0
- package/dist/test_earnings_hygiene_and_binding.d.ts +5 -0
- package/dist/test_earnings_hygiene_and_binding.d.ts.map +1 -0
- package/dist/test_earnings_hygiene_and_binding.js +104 -0
- package/dist/test_earnings_hygiene_and_binding.js.map +1 -0
- package/dist/test_exec_quotes_render.d.ts +2 -0
- package/dist/test_exec_quotes_render.d.ts.map +1 -0
- package/dist/test_exec_quotes_render.js +86 -0
- package/dist/test_exec_quotes_render.js.map +1 -0
- package/dist/test_expert_intro.d.ts +2 -0
- package/dist/test_expert_intro.d.ts.map +1 -0
- package/dist/test_expert_intro.js +57 -0
- package/dist/test_expert_intro.js.map +1 -0
- package/dist/test_expert_layer.d.ts +11 -0
- package/dist/test_expert_layer.d.ts.map +1 -0
- package/dist/test_expert_layer.js +356 -0
- package/dist/test_expert_layer.js.map +1 -0
- package/dist/test_gap_alert.js +8 -0
- package/dist/test_gap_alert.js.map +1 -1
- package/dist/test_grok_offering_surfaces.d.ts +2 -0
- package/dist/test_grok_offering_surfaces.d.ts.map +1 -0
- package/dist/test_grok_offering_surfaces.js +155 -0
- package/dist/test_grok_offering_surfaces.js.map +1 -0
- package/dist/test_human_agent_live.d.ts +2 -0
- package/dist/test_human_agent_live.d.ts.map +1 -0
- package/dist/test_human_agent_live.js +48 -0
- package/dist/test_human_agent_live.js.map +1 -0
- package/dist/test_identity_gap.d.ts +2 -0
- package/dist/test_identity_gap.d.ts.map +1 -0
- package/dist/test_identity_gap.js +171 -0
- package/dist/test_identity_gap.js.map +1 -0
- package/dist/test_intelligence_and_verifier.d.ts +17 -0
- package/dist/test_intelligence_and_verifier.d.ts.map +1 -0
- package/dist/test_intelligence_and_verifier.js +162 -0
- package/dist/test_intelligence_and_verifier.js.map +1 -0
- package/dist/test_latency_mcp_brief5.d.ts +12 -0
- package/dist/test_latency_mcp_brief5.d.ts.map +1 -0
- package/dist/test_latency_mcp_brief5.js +200 -0
- package/dist/test_latency_mcp_brief5.js.map +1 -0
- package/dist/test_limit_and_credit_card_capture.d.ts +21 -0
- package/dist/test_limit_and_credit_card_capture.d.ts.map +1 -0
- package/dist/test_limit_and_credit_card_capture.js +216 -0
- package/dist/test_limit_and_credit_card_capture.js.map +1 -0
- package/dist/test_list_graphs_topics.js +1 -1
- package/dist/test_list_graphs_topics.js.map +1 -1
- package/dist/test_live_deployed_mcp_search.d.ts +2 -0
- package/dist/test_live_deployed_mcp_search.d.ts.map +1 -0
- package/dist/test_live_deployed_mcp_search.js +85 -0
- package/dist/test_live_deployed_mcp_search.js.map +1 -0
- package/dist/test_live_deployed_split.d.ts +2 -0
- package/dist/test_live_deployed_split.d.ts.map +1 -0
- package/dist/test_live_deployed_split.js +72 -0
- package/dist/test_live_deployed_split.js.map +1 -0
- package/dist/test_live_endpoint_runner.js +2 -2
- package/dist/test_live_endpoint_runner.js.map +1 -1
- package/dist/test_live_mcp.js +1 -1
- package/dist/test_live_mcp.js.map +1 -1
- package/dist/test_live_neil_widget.d.ts +2 -0
- package/dist/test_live_neil_widget.d.ts.map +1 -0
- package/dist/test_live_neil_widget.js +84 -0
- package/dist/test_live_neil_widget.js.map +1 -0
- package/dist/test_longpoll_status.d.ts +2 -0
- package/dist/test_longpoll_status.d.ts.map +1 -0
- package/dist/test_longpoll_status.js +117 -0
- package/dist/test_longpoll_status.js.map +1 -0
- package/dist/test_mcp_find_expert_and_vocabulary_routing.d.ts +2 -0
- package/dist/test_mcp_find_expert_and_vocabulary_routing.d.ts.map +1 -0
- package/dist/test_mcp_find_expert_and_vocabulary_routing.js +130 -0
- package/dist/test_mcp_find_expert_and_vocabulary_routing.js.map +1 -0
- package/dist/test_next_moves.js +644 -279
- package/dist/test_next_moves.js.map +1 -1
- package/dist/test_next_moves_transcripts.js +122 -40
- package/dist/test_next_moves_transcripts.js.map +1 -1
- package/dist/test_on_request_caller_identity.d.ts +13 -0
- package/dist/test_on_request_caller_identity.d.ts.map +1 -0
- package/dist/test_on_request_caller_identity.js +131 -0
- package/dist/test_on_request_caller_identity.js.map +1 -0
- package/dist/test_on_request_intercept.d.ts +10 -0
- package/dist/test_on_request_intercept.d.ts.map +1 -0
- package/dist/test_on_request_intercept.js +95 -0
- package/dist/test_on_request_intercept.js.map +1 -0
- package/dist/test_onboarding_consent_and_errors.d.ts +2 -0
- package/dist/test_onboarding_consent_and_errors.d.ts.map +1 -0
- package/dist/test_onboarding_consent_and_errors.js +110 -0
- package/dist/test_onboarding_consent_and_errors.js.map +1 -0
- package/dist/test_onboarding_live_scenarios.d.ts +2 -0
- package/dist/test_onboarding_live_scenarios.d.ts.map +1 -0
- package/dist/test_onboarding_live_scenarios.js +189 -0
- package/dist/test_onboarding_live_scenarios.js.map +1 -0
- package/dist/test_referral_live.d.ts +2 -0
- package/dist/test_referral_live.d.ts.map +1 -0
- package/dist/test_referral_live.js +33 -0
- package/dist/test_referral_live.js.map +1 -0
- package/dist/test_referral_piers.d.ts +2 -0
- package/dist/test_referral_piers.d.ts.map +1 -0
- package/dist/test_referral_piers.js +33 -0
- package/dist/test_referral_piers.js.map +1 -0
- package/dist/test_report_editorial_briefing.d.ts +21 -0
- package/dist/test_report_editorial_briefing.d.ts.map +1 -0
- package/dist/test_report_editorial_briefing.js +356 -0
- package/dist/test_report_editorial_briefing.js.map +1 -0
- package/dist/test_search_graph_quality.d.ts +2 -0
- package/dist/test_search_graph_quality.d.ts.map +1 -0
- package/dist/test_search_graph_quality.js +493 -0
- package/dist/test_search_graph_quality.js.map +1 -0
- package/dist/test_service_to_service_auth.d.ts +2 -0
- package/dist/test_service_to_service_auth.d.ts.map +1 -0
- package/dist/test_service_to_service_auth.js +199 -0
- package/dist/test_service_to_service_auth.js.map +1 -0
- package/dist/test_sources_live.d.ts +2 -0
- package/dist/test_sources_live.d.ts.map +1 -0
- package/dist/test_sources_live.js +30 -0
- package/dist/test_sources_live.js.map +1 -0
- package/dist/test_specialist_and_analyst_tiers.d.ts +2 -0
- package/dist/test_specialist_and_analyst_tiers.d.ts.map +1 -0
- package/dist/test_specialist_and_analyst_tiers.js +155 -0
- package/dist/test_specialist_and_analyst_tiers.js.map +1 -0
- package/dist/test_v2_2_visual_hardening.d.ts +5 -0
- package/dist/test_v2_2_visual_hardening.d.ts.map +1 -0
- package/dist/test_v2_2_visual_hardening.js +333 -0
- package/dist/test_v2_2_visual_hardening.js.map +1 -0
- package/dist/test_verify_deprecate_render_spec.d.ts +2 -0
- package/dist/test_verify_deprecate_render_spec.d.ts.map +1 -0
- package/dist/test_verify_deprecate_render_spec.js +217 -0
- package/dist/test_verify_deprecate_render_spec.js.map +1 -0
- package/dist/test_verify_neil_demo.d.ts +2 -0
- package/dist/test_verify_neil_demo.d.ts.map +1 -0
- package/dist/test_verify_neil_demo.js +149 -0
- package/dist/test_verify_neil_demo.js.map +1 -0
- package/dist/test_waitable_research_and_grounded_links.d.ts +2 -0
- package/dist/test_waitable_research_and_grounded_links.d.ts.map +1 -0
- package/dist/test_waitable_research_and_grounded_links.js +129 -0
- package/dist/test_waitable_research_and_grounded_links.js.map +1 -0
- package/dist/test_widget_guards.d.ts +2 -0
- package/dist/test_widget_guards.d.ts.map +1 -0
- package/dist/test_widget_guards.js +229 -0
- package/dist/test_widget_guards.js.map +1 -0
- package/dist/test_zero_retention_alerts.d.ts +14 -0
- package/dist/test_zero_retention_alerts.d.ts.map +1 -0
- package/dist/test_zero_retention_alerts.js +76 -0
- package/dist/test_zero_retention_alerts.js.map +1 -0
- package/dist/toolHandlers.d.ts +38 -1
- package/dist/toolHandlers.d.ts.map +1 -1
- package/dist/toolHandlers.js +3856 -938
- package/dist/toolHandlers.js.map +1 -1
- package/dist/tools.d.ts +20 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +25 -4
- package/dist/tools.js.map +1 -1
- package/dist/verify_discoverability.d.ts +2 -0
- package/dist/verify_discoverability.d.ts.map +1 -0
- package/dist/verify_discoverability.js +53 -0
- package/dist/verify_discoverability.js.map +1 -0
- package/dist/verify_tools_endpoint.js +16 -3
- package/dist/verify_tools_endpoint.js.map +1 -1
- package/dist/widgetShell.d.ts +2 -2
- package/dist/widgetShell.d.ts.map +1 -1
- package/dist/widgetShell.js +1 -1
- package/dist/widgetShell.js.map +1 -1
- package/package.json +1 -1
- package/server.json +4 -32
- package/dist/oauthRegisterShim.d.ts +0 -13
- package/dist/oauthRegisterShim.d.ts.map +0 -1
- package/dist/oauthRegisterShim.js +0 -83
- package/dist/oauthRegisterShim.js.map +0 -1
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import { reconcileFreshnessDays, rankAndFilterEvidence, enrichEvidence, computeMomentum, isPlaceholderPlace, reconcilePlace, LUXURY_KEYWORDS, LUXURY_BRANDS, MASS_BUDGET_KEYWORDS, MASS_BUDGET_BRANDS, cleanTruncateWhyNow } from './enrichment.js';
|
|
3
|
+
import { computeTierFit, generateNextMoves } from './coverageRelevance.js';
|
|
4
|
+
import { sanitizePayloadForChatGpt } from './toolHandlers.js';
|
|
5
|
+
import { classifyAccessError } from './errorHandling.js';
|
|
6
|
+
import { setCachedCatalogForTesting, getRelevantGraphs, getGraphs } from './catalogCache.js';
|
|
7
|
+
console.log('--- Running search_graph Quality, Freshness & Payload Slimming Suite ---\n');
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Test 1: Freshness Reconciliation (Issue 2)
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
console.log('Test 1: Freshness Reconciliation overrides database updated_at');
|
|
12
|
+
const rowWithStaleUpdatedAt = {
|
|
13
|
+
trendName: 'Pop Ups As Test Labs',
|
|
14
|
+
freshnessDays: 16, // Returned from API based on August updated_at
|
|
15
|
+
freshnessDate: '2026-02-26T06:02:34.000Z', // Actual substantive date (~192 days ago)
|
|
16
|
+
updated_at: '2026-08-22T04:17:59.538Z',
|
|
17
|
+
lastSeen: '2026-05-08T00:00:00.000Z'
|
|
18
|
+
};
|
|
19
|
+
const fixedFreshnessDays = reconcileFreshnessDays(rowWithStaleUpdatedAt, new Date('2026-09-06T12:00:00Z').getTime());
|
|
20
|
+
assert.ok(fixedFreshnessDays !== null, 'freshnessDays should not be null');
|
|
21
|
+
assert.ok(fixedFreshnessDays >= 190, `freshnessDays should reflect Feb 2026 date (~192 days), got ${fixedFreshnessDays}`);
|
|
22
|
+
assert.ok(fixedFreshnessDays !== 16, 'freshnessDays should NOT be 16 from DB updated_at');
|
|
23
|
+
const momentum = computeMomentum(rowWithStaleUpdatedAt, new Date('2026-09-06T12:00:00Z').getTime());
|
|
24
|
+
assert.strictEqual(momentum, 'building', 'Momentum should be building (~192 days), NOT accelerating (<45 days)');
|
|
25
|
+
console.log('✅ Test 1 Passed: Freshness correctly reconciled to substantive editorial date');
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Test 2: Evidence Relevance Ranking & Miniso/Earnings Suppression (Issue 1)
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
console.log('\nTest 2: Evidence Relevance Ranking filters generic earnings & boosts luxury');
|
|
30
|
+
const mockEvidenceItems = [
|
|
31
|
+
{
|
|
32
|
+
title: 'Samuel (UBS) probes Miniso',
|
|
33
|
+
summary: 'First, Mr. Ye, in your prepared remarks, you mentioned something regarding IP. I want to ask about Mexico...',
|
|
34
|
+
contentType: 'interpretation',
|
|
35
|
+
brandNames: ['Miniso', 'UBS'],
|
|
36
|
+
publishedAt: '2026-03-31T00:00:00.000Z'
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
title: 'Miniso Q4 2025 Revenue',
|
|
40
|
+
summary: 'Miniso reported revenue of Q4 2025 Group Revenue: RMB 6.25 billion; Full Year 2025...',
|
|
41
|
+
contentType: 'metric',
|
|
42
|
+
brandNames: ['Miniso'],
|
|
43
|
+
publishedAt: '2026-03-31T00:00:00.000Z'
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
title: 'KFC Japan Christmas-Themed Pop-Up Restaurant Reworking Core Menu Items',
|
|
47
|
+
summary: 'KFC Japan is hosting a temporary restaurant at Hills Café in Roppongi Hills...',
|
|
48
|
+
contentType: 'case_study',
|
|
49
|
+
brandNames: ['KFC'],
|
|
50
|
+
publishedAt: '2026-02-18T00:00:00.000Z'
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
title: 'Dior Temporary Retail Space Activating Personalized Consultations and Product Offerings',
|
|
54
|
+
summary: 'Dior established a temporary retail space, an exclusive luxury pop-up store in Oakland Place...',
|
|
55
|
+
contentType: 'case_study',
|
|
56
|
+
brandNames: ['Dior'],
|
|
57
|
+
publishedAt: '2026-02-24T04:09:00.813Z'
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
title: "Macy's Bloomingdale's Repositions as Local Leader for Premium/Luxury Customers",
|
|
61
|
+
summary: "Bloomingdale's strategy is anchored on becoming a local destination for luxury pop-ups and discovery...",
|
|
62
|
+
contentType: 'case_study',
|
|
63
|
+
brandNames: ["Bloomingdale's"],
|
|
64
|
+
publishedAt: '2026-03-18T00:00:00.000Z'
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
title: 'Hermès Ephemeral Store and Fragrance Pop-Up in Kyoto',
|
|
68
|
+
summary: 'Hermès opened an ephemeral retail space and craft pop-up activation...',
|
|
69
|
+
contentType: 'case_study',
|
|
70
|
+
brandNames: ['Hermès'],
|
|
71
|
+
publishedAt: '2026-03-01T00:00:00.000Z'
|
|
72
|
+
}
|
|
73
|
+
];
|
|
74
|
+
const luxuryQuery = 'Emerging trends in luxury retail activations and pop-up experiences';
|
|
75
|
+
const rankedEvidence = rankAndFilterEvidence(mockEvidenceItems, luxuryQuery, { trendName: 'Pop Ups As Test Labs' }, { maxItems: 3 });
|
|
76
|
+
assert.strictEqual(rankedEvidence.length, 3, 'Should return top 3 items');
|
|
77
|
+
const topTitles = rankedEvidence.map(e => e.title);
|
|
78
|
+
assert.ok(topTitles.some(t => t.includes('Dior')), 'Dior pop-up should be in top items');
|
|
79
|
+
assert.ok(topTitles.some(t => t.includes("Bloomingdale's")), "Bloomingdale's should be in top items");
|
|
80
|
+
assert.ok(topTitles.some(t => t.includes('Hermès')), 'Hermès should be in top items');
|
|
81
|
+
// Verify Miniso earnings call and Miniso revenue are completely excluded
|
|
82
|
+
const hasMiniso = rankedEvidence.some(e => (e.title || '').includes('Miniso'));
|
|
83
|
+
assert.strictEqual(hasMiniso, false, 'Miniso earnings/revenue items must be suppressed');
|
|
84
|
+
const hasKfc = rankedEvidence.some(e => (e.title || '').includes('KFC'));
|
|
85
|
+
assert.strictEqual(hasKfc, false, 'Mass-market KFC must be suppressed for luxury query');
|
|
86
|
+
console.log('✅ Test 2 Passed: Luxury activations ranked first, Miniso earnings & KFC suppressed');
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
// Test 3: Category & Market Tier Qualifier Weighting (Issue 3)
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
console.log('\nTest 3: Category & Market Tier Fit Scoring');
|
|
91
|
+
const luxuryRow = {
|
|
92
|
+
trendName: 'City-Specific Pop-Ups Co-Produced With Local Operators',
|
|
93
|
+
summary: 'Brands create temporary experiential pop-ups with local luxury operators.',
|
|
94
|
+
brandNames: ['Louis Vuitton', 'Dior', 'Hennessy', 'LVMH']
|
|
95
|
+
};
|
|
96
|
+
const massMarketRow = {
|
|
97
|
+
trendName: 'Pop Ups As Test Labs',
|
|
98
|
+
summary: 'Brands use temporary spaces to test new formats.',
|
|
99
|
+
brandNames: ['Miniso', 'KFC', 'Taco Bell', 'McDonald\'s']
|
|
100
|
+
};
|
|
101
|
+
const luxuryFit = computeTierFit(luxuryRow, luxuryQuery);
|
|
102
|
+
const massFit = computeTierFit(massMarketRow, luxuryQuery);
|
|
103
|
+
assert.ok(luxuryFit > 0.20, `Luxury trend should get positive boost (got ${luxuryFit})`);
|
|
104
|
+
assert.ok(massFit < 0, `Mass-market trend should get demoted on luxury query (got ${massFit})`);
|
|
105
|
+
assert.ok(luxuryFit - massFit > 0.30, 'Tier fit spread should strongly favor luxury row');
|
|
106
|
+
console.log(`✅ Test 3 Passed: Tier fit scores properly separated (luxury: +${luxuryFit.toFixed(2)}, mass: ${massFit.toFixed(2)})`);
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
// Test 4: Null Field Stripping in Evidence Citations (Issue 5)
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
console.log('\nTest 4: Null Field Stripping in enrichEvidence');
|
|
111
|
+
const enriched = enrichEvidence([
|
|
112
|
+
{
|
|
113
|
+
id: 'rec12345678901234',
|
|
114
|
+
node_id: 'rec12345678901234',
|
|
115
|
+
title: 'Dior Pop-Up',
|
|
116
|
+
summary: 'Dior pop-up store with new product launches',
|
|
117
|
+
sourceUrl: 'https://fodda.ai/article/dior',
|
|
118
|
+
imageUrl: null,
|
|
119
|
+
speakerName: null,
|
|
120
|
+
speakerTitle: null,
|
|
121
|
+
publication: null,
|
|
122
|
+
place: '',
|
|
123
|
+
brandNames: [],
|
|
124
|
+
contentType: 'case_study'
|
|
125
|
+
}
|
|
126
|
+
]);
|
|
127
|
+
const cleanedItem = enriched[0];
|
|
128
|
+
assert.strictEqual(cleanedItem.imageUrl, undefined, 'Null imageUrl should be stripped');
|
|
129
|
+
assert.strictEqual(cleanedItem.speakerName, undefined, 'Null speakerName should be stripped');
|
|
130
|
+
assert.strictEqual(cleanedItem.speakerTitle, undefined, 'Null speakerTitle should be stripped');
|
|
131
|
+
assert.strictEqual(cleanedItem.publication, undefined, 'Null publication should be stripped');
|
|
132
|
+
assert.strictEqual(cleanedItem.id, undefined, 'Duplicate id matching node_id should be stripped');
|
|
133
|
+
assert.strictEqual(cleanedItem.place, undefined, 'Empty place string should be stripped');
|
|
134
|
+
assert.strictEqual(cleanedItem.brandNames, undefined, 'Empty brandNames array should be stripped');
|
|
135
|
+
assert.strictEqual(cleanedItem.node_id, 'rec12345678901234', 'node_id should be preserved');
|
|
136
|
+
console.log('✅ Test 4 Passed: Dead null/empty fields cleanly stripped from evidence');
|
|
137
|
+
// ---------------------------------------------------------------------------
|
|
138
|
+
// Test 5: ChatGPT Payload Sanitization & Slimming (Issue 4)
|
|
139
|
+
// ---------------------------------------------------------------------------
|
|
140
|
+
console.log('\nTest 5: ChatGPT Payload Sanitization');
|
|
141
|
+
const mockLitePayload = {
|
|
142
|
+
total: 5,
|
|
143
|
+
dataStatus: 'ok',
|
|
144
|
+
_render_instructions: { rules: ['Rule 1', 'Rule 2'] },
|
|
145
|
+
_attribution: 'Data sourced from Retail',
|
|
146
|
+
rows: [
|
|
147
|
+
{
|
|
148
|
+
node_id: '6575',
|
|
149
|
+
title: 'Location-as-Media Activations',
|
|
150
|
+
summary: 'Brands use spaces as media.',
|
|
151
|
+
relevance_score: 1.18,
|
|
152
|
+
freshnessDays: 192,
|
|
153
|
+
brandNames: ['Dior', 'Louis Vuitton']
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
};
|
|
157
|
+
const sanitizedForChatGpt = sanitizePayloadForChatGpt(mockLitePayload);
|
|
158
|
+
assert.strictEqual(sanitizedForChatGpt._render_instructions, undefined, '_render_instructions should be omitted for ChatGPT');
|
|
159
|
+
assert.strictEqual(sanitizedForChatGpt._attribution, undefined, '_attribution should be omitted for ChatGPT');
|
|
160
|
+
assert.strictEqual(sanitizedForChatGpt.theme, undefined, 'theme should be omitted');
|
|
161
|
+
assert.strictEqual(sanitizedForChatGpt.total, 5, 'total should be preserved');
|
|
162
|
+
assert.strictEqual(sanitizedForChatGpt.rows.length, 1, 'rows should be preserved');
|
|
163
|
+
assert.strictEqual(sanitizedForChatGpt.rows[0].node_id, '6575', 'node_id should be preserved');
|
|
164
|
+
console.log('✅ Test 5 Passed: ChatGPT payload cleanly sanitized and slimmed');
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
// Test 6: Place Reconciliation & Placeholder Stripping (Issues 2 & 3)
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
console.log('\nTest 6: Place Reconciliation & Placeholder Stripping');
|
|
169
|
+
// 6a: isPlaceholderPlace checks
|
|
170
|
+
assert.strictEqual(isPlaceholderPlace('string, string, string'), true, '"string, string, string" must be flagged as placeholder');
|
|
171
|
+
assert.strictEqual(isPlaceholderPlace('string'), true, '"string" must be flagged as placeholder');
|
|
172
|
+
assert.strictEqual(isPlaceholderPlace('N/A'), true, '"N/A" must be flagged as placeholder');
|
|
173
|
+
assert.strictEqual(isPlaceholderPlace('n/a'), true, '"n/a" must be flagged as placeholder');
|
|
174
|
+
assert.strictEqual(isPlaceholderPlace('undefined'), true, '"undefined" must be flagged as placeholder');
|
|
175
|
+
assert.strictEqual(isPlaceholderPlace('null'), true, '"null" must be flagged as placeholder');
|
|
176
|
+
assert.strictEqual(isPlaceholderPlace(''), true, 'Empty string must be flagged as placeholder');
|
|
177
|
+
assert.strictEqual(isPlaceholderPlace(undefined), true, 'undefined must be flagged as placeholder');
|
|
178
|
+
assert.strictEqual(isPlaceholderPlace('Milan, Italy'), false, '"Milan, Italy" is valid place');
|
|
179
|
+
assert.strictEqual(isPlaceholderPlace('Seattle, USA, North America'), false, '"Seattle, USA" is valid place string');
|
|
180
|
+
console.log(' ✅ 6a: isPlaceholderPlace correctly identifies placeholder variants');
|
|
181
|
+
// 6b: reconcilePlace location reconciliation
|
|
182
|
+
const hermesReconciled = reconcilePlace('Seattle, USA, North America', "Launch of 'Hermestories' Experiential Theater Play", "Hermès launched 'Hermestories' in Milan, an experiential theater play designed to allow visitors to discover the history of Hermès.");
|
|
183
|
+
assert.strictEqual(hermesReconciled, 'Milan, Italy', 'Contradictory Seattle place must be reconciled to Milan, Italy based on summary');
|
|
184
|
+
const studioYetReconciled = reconcilePlace('Seattle, USA, North America', 'Studio Yet Pop-Up High-Performance Training Space Launch', "Lululemon is hosting 'Studio Yet,' a 3-week pop-up high-performance training space in Los Angeles.");
|
|
185
|
+
assert.strictEqual(studioYetReconciled, 'Los Angeles, USA', 'Contradictory Seattle place must be reconciled to Los Angeles, USA based on summary');
|
|
186
|
+
const placeholderPlaceReconciled = reconcilePlace('string, string, string', '30atoms Integrates Mobile Testing Station and Transparent Design Within Airport Pop-Up', "Skincare brand 30atoms created a pop-up store in an airport. The design uses stainless steel...");
|
|
187
|
+
assert.strictEqual(placeholderPlaceReconciled, undefined, 'Placeholder place with no city in text should return undefined');
|
|
188
|
+
const diorHarajukuReconciled = reconcilePlace('undefined', "Dior's Addict Sweet Shop in Harajuku: Blurring Lines Between Playful Retail and Emotional Engagement", "Dior has launched the Addict Sweet Shop in Harajuku, transforming retail into an immersive experience...");
|
|
189
|
+
assert.strictEqual(diorHarajukuReconciled, 'Tokyo, Japan', 'Dior in Harajuku should reconcile to Tokyo, Japan');
|
|
190
|
+
console.log(' ✅ 6b: reconcilePlace reconciles text cities and discards placeholders');
|
|
191
|
+
// 6c: enrichEvidence integrates place reconciliation and placeholder stripping
|
|
192
|
+
const enrichedEvidenceWithPlaces = enrichEvidence([
|
|
193
|
+
{
|
|
194
|
+
title: "Launch of 'Hermestories' Experiential Theater Play",
|
|
195
|
+
summary: "Hermès launched 'Hermestories' in Milan, an experiential theater play...",
|
|
196
|
+
place: 'Seattle, USA, North America',
|
|
197
|
+
contentType: 'case_study'
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
title: '30atoms Integrates Mobile Testing Station Within Airport Pop-Up',
|
|
201
|
+
summary: 'Skincare brand 30atoms created a pop-up store in an airport.',
|
|
202
|
+
place: 'string, string, string',
|
|
203
|
+
contentType: 'case_study'
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
title: 'Grace Taylor Pop-Up',
|
|
207
|
+
summary: 'Grace Taylor showcases accessories.',
|
|
208
|
+
place: 'N/A',
|
|
209
|
+
contentType: 'case_study'
|
|
210
|
+
}
|
|
211
|
+
]);
|
|
212
|
+
assert.strictEqual(enrichedEvidenceWithPlaces[0].place, 'Milan, Italy', 'Hermès place must be reconciled to Milan, Italy');
|
|
213
|
+
assert.strictEqual(enrichedEvidenceWithPlaces[1].place, undefined, '30atoms placeholder place must be completely stripped');
|
|
214
|
+
assert.strictEqual(enrichedEvidenceWithPlaces[2].place, undefined, 'Grace Taylor N/A place must be completely stripped');
|
|
215
|
+
console.log(' ✅ 6c: enrichEvidence cleanly reconciles Hermès to Milan and strips all placeholder places');
|
|
216
|
+
console.log('✅ Test 6 Passed: Place reconciliation & placeholder stripping verified');
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
// Test 7: Evidence Count Semantics (Issue 1)
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
console.log('\nTest 7: Evidence Count Semantics (linked_evidence_count, returned_evidence_count, evidence_count)');
|
|
221
|
+
// Simulate search_graph row shaping for 0 relevant evidence (Node 6683: Pop-Ups as Test Labs)
|
|
222
|
+
const rawNode6683Row = {
|
|
223
|
+
node_id: '6683',
|
|
224
|
+
trendName: 'Pop Ups As Test Labs',
|
|
225
|
+
evidence_count: 4, // 4 linked in DB graph
|
|
226
|
+
evidence: [
|
|
227
|
+
{ title: 'Samuel (UBS) probes Miniso', contentType: 'interpretation', brandNames: ['Miniso'] },
|
|
228
|
+
{ title: 'Miniso Q4 Revenue', contentType: 'metric', brandNames: ['Miniso'] },
|
|
229
|
+
{ title: 'PepsiCo Texas Supply Chain Pilot', contentType: 'case_study', brandNames: ['PepsiCo'] },
|
|
230
|
+
{ title: 'P&G Enterprise Software Bundles', contentType: 'case_study', brandNames: ['P&G'] }
|
|
231
|
+
]
|
|
232
|
+
};
|
|
233
|
+
// Apply filtering
|
|
234
|
+
const rawEvidenceCount = rawNode6683Row.evidence.length;
|
|
235
|
+
rawNode6683Row.linked_evidence_count = rawEvidenceCount;
|
|
236
|
+
const filteredEvidence = rankAndFilterEvidence(rawNode6683Row.evidence, luxuryQuery, rawNode6683Row, { maxItems: 3 });
|
|
237
|
+
rawNode6683Row.evidence = enrichEvidence(filteredEvidence);
|
|
238
|
+
rawNode6683Row.returned_evidence_count = rawNode6683Row.evidence.length;
|
|
239
|
+
rawNode6683Row.evidence_count = rawNode6683Row.evidence.length;
|
|
240
|
+
assert.strictEqual(rawNode6683Row.linked_evidence_count, 4, 'linked_evidence_count should reflect the 4 linked items in graph');
|
|
241
|
+
assert.strictEqual(rawNode6683Row.returned_evidence_count, 0, 'returned_evidence_count should be 0 after quality/relevance filtering');
|
|
242
|
+
assert.strictEqual(rawNode6683Row.evidence_count, 0, 'evidence_count must be 0 when evidence array is empty');
|
|
243
|
+
assert.strictEqual(rawNode6683Row.evidence.length, 0, 'evidence array must be empty');
|
|
244
|
+
// Simulate row with 3 valid items (e.g. Immersive Brand Pop-Ups)
|
|
245
|
+
const rawNode8688Row = {
|
|
246
|
+
node_id: '8688',
|
|
247
|
+
trendName: 'Immersive Brand Storytelling Through Themed Activations',
|
|
248
|
+
evidence: [
|
|
249
|
+
{ title: "Dior's Addict Sweet Shop in Harajuku", summary: "Dior launched an immersive retail pop-up in Harajuku...", contentType: 'case_study', brandNames: ['Dior'] },
|
|
250
|
+
{ title: 'Hennessy Lunar New Year Travel Retail Pop-Up', summary: 'Terminal 1 Singapore...', contentType: 'case_study', brandNames: ['Hennessy'] },
|
|
251
|
+
{ title: "Launch of 'Hermestories' Experiential Theater Play", summary: "Hermès launched in Milan...", contentType: 'case_study', brandNames: ['Hermès'] }
|
|
252
|
+
]
|
|
253
|
+
};
|
|
254
|
+
const rawCount8688 = rawNode8688Row.evidence.length;
|
|
255
|
+
rawNode8688Row.linked_evidence_count = rawCount8688;
|
|
256
|
+
const filtered8688 = rankAndFilterEvidence(rawNode8688Row.evidence, luxuryQuery, rawNode8688Row, { maxItems: 3 });
|
|
257
|
+
rawNode8688Row.evidence = enrichEvidence(filtered8688);
|
|
258
|
+
rawNode8688Row.returned_evidence_count = rawNode8688Row.evidence.length;
|
|
259
|
+
rawNode8688Row.evidence_count = rawNode8688Row.evidence.length;
|
|
260
|
+
assert.strictEqual(rawNode8688Row.linked_evidence_count, 3, 'linked_evidence_count should be 3');
|
|
261
|
+
assert.strictEqual(rawNode8688Row.returned_evidence_count, 3, 'returned_evidence_count should be 3');
|
|
262
|
+
assert.strictEqual(rawNode8688Row.evidence_count, 3, 'evidence_count should be 3');
|
|
263
|
+
const diorItem = rawNode8688Row.evidence.find((e) => (e.title || '').includes('Dior'));
|
|
264
|
+
const hermesItem = rawNode8688Row.evidence.find((e) => (e.title || '').includes('Hermestories'));
|
|
265
|
+
assert.ok(diorItem, 'Dior item should be in returned evidence');
|
|
266
|
+
assert.ok(hermesItem, 'Hermès item should be in returned evidence');
|
|
267
|
+
assert.strictEqual(diorItem.place, 'Tokyo, Japan', 'Dior Harajuku place should be Tokyo, Japan');
|
|
268
|
+
assert.strictEqual(hermesItem.place, 'Milan, Italy', 'Hermès place should be Milan, Italy');
|
|
269
|
+
console.log('✅ Test 7 Passed: Evidence count semantics unambiguous (linked: 4, returned: 0, count: 0 for filtered trend)');
|
|
270
|
+
// ---------------------------------------------------------------------------
|
|
271
|
+
// Test 8: Two-Store Indexing Gap & Daily Limit Error Classification
|
|
272
|
+
// ---------------------------------------------------------------------------
|
|
273
|
+
console.log('\nTest 8: Two-Store Indexing Gap Bridge & DAILY_LIMIT_EXCEEDED Classification');
|
|
274
|
+
// 8a. Verify 403 DAILY_LIMIT_EXCEEDED is classified as 'credits' instead of 'forbidden'
|
|
275
|
+
const dailyLimitErr = {
|
|
276
|
+
response: {
|
|
277
|
+
status: 403,
|
|
278
|
+
data: {
|
|
279
|
+
error: 'DAILY_LIMIT_EXCEEDED',
|
|
280
|
+
code: 'DAILY_LIMIT_EXCEEDED',
|
|
281
|
+
message: 'Daily 50-call limit reached on free Base tier. Add a payment card to remove daily burst limits and continue querying without interruption at 50¢ per API call.'
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
assert.strictEqual(classifyAccessError(dailyLimitErr), 'credits', 'DAILY_LIMIT_EXCEEDED must be classified as credits, not forbidden');
|
|
286
|
+
// 8b. Verify active analyst graph (Peter Abraham) is bridged into catalog and routed for cycling
|
|
287
|
+
const baseCatalog = {
|
|
288
|
+
graph_count: 2,
|
|
289
|
+
graphs: [
|
|
290
|
+
{
|
|
291
|
+
graph_id: 'retail',
|
|
292
|
+
name: 'Retail Living Graph',
|
|
293
|
+
curator: 'PSFK',
|
|
294
|
+
graph_type: 'domain',
|
|
295
|
+
status: 'live',
|
|
296
|
+
trend_count: 100,
|
|
297
|
+
topics: ['retail', 'shopping']
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
graph_id: 'sic',
|
|
301
|
+
name: 'SIC Cultural Intelligence',
|
|
302
|
+
curator: 'Ben Dietz',
|
|
303
|
+
graph_type: 'expert',
|
|
304
|
+
status: 'live',
|
|
305
|
+
trend_count: 97,
|
|
306
|
+
topics: ['culture', 'youth', 'streetwear']
|
|
307
|
+
}
|
|
308
|
+
]
|
|
309
|
+
};
|
|
310
|
+
const mockAnalysts = [
|
|
311
|
+
{
|
|
312
|
+
analyst_id: 'peter-abraham-bicycles-cycling',
|
|
313
|
+
name: 'Peter Abraham',
|
|
314
|
+
status: 'Active',
|
|
315
|
+
topics: ['sports', 'cycling'],
|
|
316
|
+
expert_in: 'bicycles, sports & active lifestyle',
|
|
317
|
+
description: 'Sports, outdoor, cycling, and active lifestyle market analyst.'
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
analyst_id: 'ben-dietz-sic',
|
|
321
|
+
name: 'Ben Dietz',
|
|
322
|
+
status: 'Active',
|
|
323
|
+
backingGraphs: ['sic'],
|
|
324
|
+
topics: ['culture', 'streetwear'],
|
|
325
|
+
expert_in: 'culture, music, streetwear',
|
|
326
|
+
description: 'Cultural strategist and writer.'
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
analyst_id: 'jeremy-bergstein-science-education-innovation',
|
|
330
|
+
name: 'Jeremy Bergstein',
|
|
331
|
+
status: 'Active',
|
|
332
|
+
backingGraphs: ['postpals-expert-graph'],
|
|
333
|
+
topics: ['science', 'education'],
|
|
334
|
+
expert_in: 'science and education innovation',
|
|
335
|
+
description: 'Educational innovation lead.'
|
|
336
|
+
}
|
|
337
|
+
];
|
|
338
|
+
setCachedCatalogForTesting(baseCatalog, mockAnalysts);
|
|
339
|
+
const allCatalogGraphs = getGraphs();
|
|
340
|
+
// (1) Peter Abraham bridged via ID fallback
|
|
341
|
+
const bridgedPeter = allCatalogGraphs.find(g => g.graph_id === 'peter-abraham-bicycles-cycling');
|
|
342
|
+
assert.ok(bridgedPeter, 'Peter Abraham must be bridged into catalog graphs');
|
|
343
|
+
assert.strictEqual(bridgedPeter?.graph_type, 'analyst', 'Bridged graph must have graph_type analyst');
|
|
344
|
+
// (2) Ben Dietz does NOT duplicate existing 'sic' graph
|
|
345
|
+
const sicGraphs = allCatalogGraphs.filter(g => g.graph_id === 'sic');
|
|
346
|
+
assert.strictEqual(sicGraphs.length, 1, 'SIC graph must not be duplicated when Ben Dietz is mapped to it');
|
|
347
|
+
// (3) Jeremy Bergstein bridges 'postpals-expert-graph' from backingGraphs
|
|
348
|
+
const bridgedJeremy = allCatalogGraphs.find(g => g.graph_id === 'postpals-expert-graph');
|
|
349
|
+
assert.ok(bridgedJeremy, 'postpals-expert-graph must be bridged from backingGraphs');
|
|
350
|
+
assert.strictEqual(bridgedJeremy?.graph_type, 'analyst', 'Bridged graph must have graph_type analyst');
|
|
351
|
+
const cyclingRouting = getRelevantGraphs('cycling');
|
|
352
|
+
const peterRouted = cyclingRouting.find(r => r.graph.graph_id === 'peter-abraham-bicycles-cycling');
|
|
353
|
+
assert.ok(peterRouted, 'peter-abraham-bicycles-cycling must be routed for query "cycling"');
|
|
354
|
+
assert.ok(peterRouted.score >= 0.80, `peter score should be high (>=0.80), got ${peterRouted.score}`);
|
|
355
|
+
console.log('✅ Test 8 Passed: DAILY_LIMIT_EXCEEDED classified cleanly & multi-HA backingGraphs bridged accurately');
|
|
356
|
+
// ---------------------------------------------------------------------------
|
|
357
|
+
// Test 9: Explicit Scope Honest Failure & Scoped Graph Protection
|
|
358
|
+
// ---------------------------------------------------------------------------
|
|
359
|
+
console.log('\nTest 9: Explicit Scope Honest Failure & Direct Match Protection');
|
|
360
|
+
// 9a: Direct match and high-semantic-score protection against zero-on-topic drop
|
|
361
|
+
const mockValZeroOnTopic = { on_topic_total: 0, rows: [{ name: 'digital wall', semantic_score: 0.90 }] };
|
|
362
|
+
const directMatchMeta = { isDirectMatch: true, graph: { graph_id: 'peter-abraham-bicycles-cycling' } };
|
|
363
|
+
const hasHighSemantic = mockValZeroOnTopic.rows.some((r) => (r.semantic_score || 0) >= 0.75);
|
|
364
|
+
assert.ok(hasHighSemantic, 'Row should have high semantic score (0.90 >= 0.75)');
|
|
365
|
+
// In un-scoped fanout without direct match, generic off-topic graph with 0 on-topic is dropped
|
|
366
|
+
const genericOffTopicMeta = { isDirectMatch: false, graph: { graph_id: 'retail' } };
|
|
367
|
+
const genericOffTopicRows = [{ name: 'Store closures', semantic_score: 0.50 }];
|
|
368
|
+
const shouldDropGeneric = !genericOffTopicMeta.isDirectMatch && !genericOffTopicRows.some((r) => (r.semantic_score || 0) >= 0.75) && mockValZeroOnTopic.on_topic_total === 0;
|
|
369
|
+
assert.ok(shouldDropGeneric, 'Generic off-topic 0 on-topic rows must be dropped in fanout');
|
|
370
|
+
// But direct match or high semantic rows are protected from being dropped
|
|
371
|
+
const shouldDropProtected = !directMatchMeta.isDirectMatch && !hasHighSemantic && mockValZeroOnTopic.on_topic_total === 0;
|
|
372
|
+
assert.ok(!shouldDropProtected, 'Direct match / high-semantic rows must NOT be dropped even if on_topic_total is 0');
|
|
373
|
+
// 9b: Scoped graphs empty result honest failure simulation
|
|
374
|
+
const mockScopedGraphs = [{ graph_id: 'peter-abraham-bicycles-cycling', name: 'Peter Abraham' }];
|
|
375
|
+
const mockEmptyRows = [];
|
|
376
|
+
const unavailableGraphs = [];
|
|
377
|
+
const graphsWithResults = new Set(mockEmptyRows.map((r) => r.graphId));
|
|
378
|
+
for (const g of mockScopedGraphs) {
|
|
379
|
+
if (!graphsWithResults.has(g.graph_id)) {
|
|
380
|
+
unavailableGraphs.push({
|
|
381
|
+
graph_id: g.graph_id,
|
|
382
|
+
reason: 'no matching trends found in this graph for query'
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
assert.strictEqual(unavailableGraphs.length, 1, 'Should record peter-abraham-bicycles-cycling in unavailable_graphs');
|
|
387
|
+
assert.strictEqual(unavailableGraphs[0].graph_id, 'peter-abraham-bicycles-cycling');
|
|
388
|
+
assert.ok(unavailableGraphs[0].reason.includes('no matching trends'), 'Reason should be explicit');
|
|
389
|
+
console.log('✅ Test 9 Passed: Scoped graphs honest failure & zero-on-topic protection verified');
|
|
390
|
+
// ---------------------------------------------------------------------------
|
|
391
|
+
// Test 10: Upstream Evidence Decoupling & include_evidence=false Support
|
|
392
|
+
// ---------------------------------------------------------------------------
|
|
393
|
+
console.log('\nTest 10: Upstream Evidence Decoupling & include_evidence=false Support');
|
|
394
|
+
// Simulate MCP upstream request body construction
|
|
395
|
+
const callerIncludeEvidenceFalse = false;
|
|
396
|
+
const upstreamBody = {
|
|
397
|
+
query: 'cycling and bicycle culture trends',
|
|
398
|
+
limit: 10,
|
|
399
|
+
use_semantic: true,
|
|
400
|
+
include_evidence: true // upstream ALWAYS true to avoid API relevance-gate row dropping
|
|
401
|
+
};
|
|
402
|
+
assert.strictEqual(upstreamBody.include_evidence, true, 'Upstream body must always request evidence so API Relevance Gate has full tokens');
|
|
403
|
+
// Simulate row returned from upstream with evidence
|
|
404
|
+
const upstreamRowWithEvidence = {
|
|
405
|
+
node_id: 'peter-digital-wall',
|
|
406
|
+
trendName: 'digital wall',
|
|
407
|
+
relevance_score: 0.726,
|
|
408
|
+
evidence: [
|
|
409
|
+
{ title: 'The 2025 Bicycle Trend Report', contentType: 'case_study' },
|
|
410
|
+
{ title: 'Peter Abraham on Black Cycling', contentType: 'case_study' }
|
|
411
|
+
]
|
|
412
|
+
};
|
|
413
|
+
// Post-processing when caller passed include_evidence === false
|
|
414
|
+
const rawEv = Array.isArray(upstreamRowWithEvidence.evidence) ? upstreamRowWithEvidence.evidence : [];
|
|
415
|
+
const processedRow = { ...upstreamRowWithEvidence };
|
|
416
|
+
if (callerIncludeEvidenceFalse !== false && rawEv.length > 0) {
|
|
417
|
+
processedRow.evidence = rawEv;
|
|
418
|
+
processedRow.returned_evidence_count = rawEv.length;
|
|
419
|
+
processedRow.evidence_count = rawEv.length;
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
processedRow.evidence = [];
|
|
423
|
+
processedRow.returned_evidence_count = 0;
|
|
424
|
+
processedRow.evidence_count = 0;
|
|
425
|
+
}
|
|
426
|
+
assert.strictEqual(processedRow.evidence.length, 0, 'Evidence array must be stripped when caller passes include_evidence: false');
|
|
427
|
+
assert.strictEqual(processedRow.evidence_count, 0, 'evidence_count must be 0 when caller passes include_evidence: false');
|
|
428
|
+
assert.strictEqual(processedRow.relevance_score, 0.726, 'relevance_score must remain unpenalized (0.726, not crushed to 0.395)');
|
|
429
|
+
console.log('✅ Test 10 Passed: include_evidence decoupling verified (unpenalized score + stripped evidence)');
|
|
430
|
+
// ---------------------------------------------------------------------------
|
|
431
|
+
// Test 11: cleanTruncateWhyNow Word-Boundary & Sentence Preservation
|
|
432
|
+
// ---------------------------------------------------------------------------
|
|
433
|
+
console.log('\nTest 11: cleanTruncateWhyNow Word-Boundary & Sentence Preservation');
|
|
434
|
+
// 11a: Length <= 280 preserves text completely (fixes "...brands levera..." bug)
|
|
435
|
+
const sample215 = 'Consumer demand for micro-mobility has surged across urban centers as municipal infrastructure expands and brands leverage community group rides to foster long-term customer loyalty and engagement in tier-1 markets.';
|
|
436
|
+
const res215 = cleanTruncateWhyNow(sample215);
|
|
437
|
+
assert.strictEqual(res215, sample215, 'Strings <= 280 chars must not be truncated');
|
|
438
|
+
assert.ok(!res215?.includes('levera...'), 'Must never cut words mid-character');
|
|
439
|
+
console.log(' ✅ 11a: Strings <= 280 chars preserved intact with complete words');
|
|
440
|
+
// 11b: String with complete sentence within [140, 280] terminates on clean sentence
|
|
441
|
+
const sampleTwoSentences = 'Consumer demand for micro-mobility has surged across urban centers as municipal infrastructure expands and brands leverage community group rides. These initiatives represent a key shift towards experiential marketing, allowing regional distributors to connect directly with cycling communities across North America and Europe.';
|
|
442
|
+
const resSentence = cleanTruncateWhyNow(sampleTwoSentences);
|
|
443
|
+
assert.strictEqual(resSentence, 'Consumer demand for micro-mobility has surged across urban centers as municipal infrastructure expands and brands leverage community group rides.', 'Should cleanly terminate at sentence boundary when available');
|
|
444
|
+
assert.ok(resSentence.endsWith('.'), 'Sentence termination ends with period, not ellipsis');
|
|
445
|
+
console.log(' ✅ 11b: Clean sentence boundary cleanly captured without dangling ellipsis');
|
|
446
|
+
// 11c: Long single-sentence string breaks at word boundary and appends ellipsis
|
|
447
|
+
const sampleLongSingle = 'Consumer demand for micro-mobility has surged across urban centers as municipal infrastructure expands and brands leverage community group rides to foster long-term customer loyalty and engagement in tier-1 markets through innovative localized experiences that bridge retail and sports culture.';
|
|
448
|
+
const resLongSingle = cleanTruncateWhyNow(sampleLongSingle);
|
|
449
|
+
assert.ok(resLongSingle !== undefined && resLongSingle.endsWith('...'), 'Long strings must end with ellipsis');
|
|
450
|
+
assert.ok(!resLongSingle.match(/[a-zA-Z]\.\.\.$/)?.input?.endsWith('levera...'), 'Must break at word space, not mid-word');
|
|
451
|
+
assert.ok(resLongSingle.length <= 283, 'Total length must respect boundary cap');
|
|
452
|
+
console.log(' ✅ 11c: Long single-sentence breaks at word boundary without mid-word splits');
|
|
453
|
+
console.log('✅ Test 11 Passed: cleanTruncateWhyNow preserves words and sentences cleanly');
|
|
454
|
+
// ---------------------------------------------------------------------------
|
|
455
|
+
// Test 12: Expert Recommendation Shared-Layer Guard & layers_searched Alignment
|
|
456
|
+
// ---------------------------------------------------------------------------
|
|
457
|
+
console.log('\nTest 12: Expert Recommendation Shared-Layer Guard & layers_searched Alignment');
|
|
458
|
+
const mockAnalystsForRec = [
|
|
459
|
+
{
|
|
460
|
+
analyst_id: 'piers-fawkes',
|
|
461
|
+
name: 'Piers Fawkes',
|
|
462
|
+
category: 'human_agent',
|
|
463
|
+
description: 'Founder & CEO of PSFK, AI and knowledge systems expert, customer experience strategist',
|
|
464
|
+
expert_in: 'AI systems that maximize knowledge, intelligence architecture',
|
|
465
|
+
consult_tool: 'consult_human_agent'
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
analyst_id: 'peter-abraham-bicycles-cycling',
|
|
469
|
+
name: 'Peter Abraham',
|
|
470
|
+
category: 'human_agent',
|
|
471
|
+
description: 'Bicycle culture and mobility expert',
|
|
472
|
+
expert_in: 'cycling, cycling culture, mobility',
|
|
473
|
+
consult_tool: 'consult_human_agent'
|
|
474
|
+
}
|
|
475
|
+
];
|
|
476
|
+
const mockCatalogForRec = [
|
|
477
|
+
{ graph_id: 'piers-fawkes', name: 'Piers Fawkes', graph_type: 'expert', status: 'live' },
|
|
478
|
+
{ graph_id: 'peter-abraham-bicycles-cycling', name: 'Peter Abraham', graph_type: 'expert', status: 'live' },
|
|
479
|
+
{ graph_id: 'beauty', name: 'PSFK Beauty', graph_type: 'domain', status: 'live' }
|
|
480
|
+
];
|
|
481
|
+
// 12a: When searchedGraphs is unranked (no relevanceScore) and owner returns 0 rows,
|
|
482
|
+
// Piers Fawkes must NOT be recommended for a beauty query even though query contains 'retail'
|
|
483
|
+
const nextMovesBeauty = await generateNextMoves([{ title: 'Clean beauty formulation', graphId: 'beauty', description: 'Beauty retail experience trends' }], 'beauty industry retail experience', mockCatalogForRec, // unranked list of graphs (broadcast / specialist pool)
|
|
484
|
+
'ok', undefined, undefined, mockCatalogForRec, mockAnalystsForRec, { total: 1, onTopicTotal: 1 });
|
|
485
|
+
assert.strictEqual(nextMovesBeauty.specific?.expert, undefined, 'Unranked owner with 0 returned rows must NOT receive +5.0 boost or be recommended for beauty query');
|
|
486
|
+
console.log(' ✅ 12a: Self-recommendation suppressed for unranked owner with 0 returned rows');
|
|
487
|
+
// 12b: When owner actually returns matching rows, they receive positive recommendation signal
|
|
488
|
+
const nextMovesCycling = await generateNextMoves([{ title: 'Gravel cycling club growth', graphId: 'peter-abraham-bicycles-cycling', description: 'Bicycle culture' }], 'cycling and bicycle culture trends', mockCatalogForRec, 'ok', undefined, undefined, mockCatalogForRec, mockAnalystsForRec, { total: 1, onTopicTotal: 1 });
|
|
489
|
+
assert.strictEqual(nextMovesCycling.specific?.expert?.analyst_id, 'peter-abraham-bicycles-cycling', 'Owner with returned rows must be recommended for relevant topic');
|
|
490
|
+
console.log(' ✅ 12b: Owner with returned rows is properly recommended for on-topic query');
|
|
491
|
+
console.log('✅ Test 12 Passed: Expert recommendation shared guard & layers_searched alignment verified');
|
|
492
|
+
console.log('\nAll search_graph quality, freshness, payload slimming, routing bridge, honest-failure, evidence-decoupling, whyNow-truncation, and expert-recommendation tests passed!');
|
|
493
|
+
//# sourceMappingURL=test_search_graph_quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_search_graph_quality.js","sourceRoot":"","sources":["../src/test_search_graph_quality.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_service_to_service_auth.d.ts","sourceRoot":"","sources":["../src/test_service_to_service_auth.ts"],"names":[],"mappings":""}
|