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,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comprehensive verification for the Expert Layer updates:
|
|
3
|
+
* 1. cleanDisplayName sanitization (retiring '(Classic Digital Twin)', '(Digital Twin)', etc.)
|
|
4
|
+
* 2. findCandidateExperts domain vs modifier overlap, blind spots, self-rec guards, honest empty
|
|
5
|
+
* 3. find_expert MCP tool registration, responses, and candidate formatting
|
|
6
|
+
* 4. consult_analyst & consult_human_agent deep parameter acceptance and forwarding
|
|
7
|
+
*
|
|
8
|
+
* Run: npm run build && node dist/test_expert_layer.js
|
|
9
|
+
*/
|
|
10
|
+
import assert from 'assert';
|
|
11
|
+
import { cleanDisplayName, normalizeAnalyst } from './catalogCache.js';
|
|
12
|
+
import { findCandidateExperts } from './coverageRelevance.js';
|
|
13
|
+
import { createServer } from './toolHandlers.js';
|
|
14
|
+
async function runTests() {
|
|
15
|
+
console.log('================================================================');
|
|
16
|
+
console.log(' Running Unit Tests: Expert Layer & find_expert Verification');
|
|
17
|
+
console.log('================================================================\n');
|
|
18
|
+
// ─────────────────────────────────────────────────────────────
|
|
19
|
+
// 1. cleanDisplayName Tests
|
|
20
|
+
// ─────────────────────────────────────────────────────────────
|
|
21
|
+
console.log('--- 1. Testing cleanDisplayName ---');
|
|
22
|
+
assert.strictEqual(cleanDisplayName('Thorstein Veblen (Classic Digital Twin)'), 'Thorstein Veblen');
|
|
23
|
+
assert.strictEqual(cleanDisplayName('Jane Austen (Digital Twin)'), 'Jane Austen');
|
|
24
|
+
assert.strictEqual(cleanDisplayName('Ben Dietz (Human Twin)'), 'Ben Dietz');
|
|
25
|
+
assert.strictEqual(cleanDisplayName('John Ruskin (Classic Agent)'), 'John Ruskin');
|
|
26
|
+
assert.strictEqual(cleanDisplayName('Piers Fawkes'), 'Piers Fawkes');
|
|
27
|
+
assert.strictEqual(cleanDisplayName(' Alexis De Tocqueville (Digital Twin) '), 'Alexis De Tocqueville');
|
|
28
|
+
assert.strictEqual(cleanDisplayName('Adam Smith [Classic Digital Twin]'), 'Adam Smith');
|
|
29
|
+
console.log('✅ cleanDisplayName tests passed.\n');
|
|
30
|
+
// ─────────────────────────────────────────────────────────────
|
|
31
|
+
// 2. findCandidateExperts Matching Tests
|
|
32
|
+
// ─────────────────────────────────────────────────────────────
|
|
33
|
+
console.log('--- 2. Testing findCandidateExperts ---');
|
|
34
|
+
const mockAnalysts = [
|
|
35
|
+
{
|
|
36
|
+
analyst_id: 'lauren-goode-beauty',
|
|
37
|
+
name: 'Lauren Goode (Digital Twin)',
|
|
38
|
+
role: 'Beauty & Skincare Specialist',
|
|
39
|
+
description: 'Beauty and skincare specialist focusing on formulations and prestige cosmetics.',
|
|
40
|
+
category: 'human_agent',
|
|
41
|
+
category_label: 'Human Agent',
|
|
42
|
+
is_verified_real_person: true,
|
|
43
|
+
consult_tool: 'consult_human_agent',
|
|
44
|
+
expert_in: ['beauty', 'skincare', 'cosmetics', 'wellness', 'clean beauty'],
|
|
45
|
+
topics: ['prestige beauty', 'dermatology', 'retail'],
|
|
46
|
+
outside_their_lane: ['cryptocurrency', 'b2b saas', 'cycling'],
|
|
47
|
+
blind_spots: ['automotive supply chain'],
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
analyst_id: 'peter-abraham-cycling',
|
|
51
|
+
name: 'Peter Abraham',
|
|
52
|
+
role: 'Cycling & Outdoor Culture Expert',
|
|
53
|
+
description: 'Cycling industry strategist and outdoor culture voice.',
|
|
54
|
+
category: 'human_agent',
|
|
55
|
+
category_label: 'Human Agent',
|
|
56
|
+
is_verified_real_person: true,
|
|
57
|
+
consult_tool: 'consult_human_agent',
|
|
58
|
+
expert_in: ['cycling', 'bicycles', 'gravel racing', 'outdoor apparel'],
|
|
59
|
+
what_they_offer: 'Ask Peter^[HA] to innovate your cycling product strategy',
|
|
60
|
+
topics: ['endurance sports', 'brand strategy'],
|
|
61
|
+
outside_their_lane: ['beauty', 'skincare'],
|
|
62
|
+
blind_spots: ['fast fashion'],
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
analyst_id: 'piers-fawkes',
|
|
66
|
+
name: 'Piers Fawkes',
|
|
67
|
+
role: 'Retail & Consumer Trends Strategist',
|
|
68
|
+
description: 'Founder of PSFK and retail innovation strategist.',
|
|
69
|
+
category: 'human_agent',
|
|
70
|
+
category_label: 'Human Agent',
|
|
71
|
+
is_verified_real_person: true,
|
|
72
|
+
consult_tool: 'consult_human_agent',
|
|
73
|
+
// Note: Piers has cross-cutting modifiers like 'ai', 'strategy', 'trends', 'retail', 'innovation'
|
|
74
|
+
expert_in: ['retail innovation', 'consumer trends', 'strategy', 'ai agents', 'future of shopping'],
|
|
75
|
+
topics: ['omnichannel', 'experiential retail', 'technology strategy'],
|
|
76
|
+
outside_their_lane: ['biotech', 'heavy industrial machinery'],
|
|
77
|
+
blind_spots: [],
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
analyst_id: 'thorstein-veblen',
|
|
81
|
+
name: 'Thorstein Veblen (Classic Digital Twin)',
|
|
82
|
+
role: 'Sociologist & Institutional Economist',
|
|
83
|
+
description: 'Author of Theory of the Leisure Class; institutional critique of consumption.',
|
|
84
|
+
category: 'classic_agent',
|
|
85
|
+
category_label: 'Classic Agent',
|
|
86
|
+
is_verified_real_person: false,
|
|
87
|
+
consult_tool: 'consult_analyst',
|
|
88
|
+
expert_in: ['conspicuous consumption', 'leisure class', 'economic theory', 'status display'],
|
|
89
|
+
topics: ['luxury goods', 'sociology of wealth'],
|
|
90
|
+
outside_their_lane: ['modern digital marketing', 'tiktok algorithms'],
|
|
91
|
+
blind_spots: [],
|
|
92
|
+
},
|
|
93
|
+
];
|
|
94
|
+
// Test 2a: Beauty query - Lauren Goode must match; Piers Fawkes must NOT match despite having 'trends'/'strategy'
|
|
95
|
+
const beautyCandidates = findCandidateExperts('prestige clean beauty and skincare formulation trends', {
|
|
96
|
+
analysts: mockAnalysts,
|
|
97
|
+
limit: 3,
|
|
98
|
+
});
|
|
99
|
+
console.log('Beauty query candidates:', beautyCandidates.map(c => `${c.display_name} (${c.analyst_id})`));
|
|
100
|
+
assert.ok(beautyCandidates.length >= 1, 'Should find at least 1 candidate for beauty');
|
|
101
|
+
assert.strictEqual(beautyCandidates[0]?.analyst_id, 'lauren-goode-beauty', 'Lauren Goode must be top candidate');
|
|
102
|
+
assert.strictEqual(beautyCandidates[0]?.display_name, 'Lauren Goode', 'Candidate display_name must be sanitized');
|
|
103
|
+
assert.ok(!beautyCandidates.some(c => c.analyst_id === 'piers-fawkes'), 'Piers Fawkes must NOT match beauty query solely on "trends" modifier');
|
|
104
|
+
// Test 2b: Cycling query - Peter Abraham must match
|
|
105
|
+
const cyclingCandidates = findCandidateExperts('gravel cycling race culture and gear', {
|
|
106
|
+
analysts: mockAnalysts,
|
|
107
|
+
limit: 3,
|
|
108
|
+
});
|
|
109
|
+
console.log('Cycling query candidates:', cyclingCandidates.map(c => `${c.display_name} (${c.analyst_id})`));
|
|
110
|
+
assert.strictEqual(cyclingCandidates.length, 1);
|
|
111
|
+
assert.strictEqual(cyclingCandidates[0]?.analyst_id, 'peter-abraham-cycling');
|
|
112
|
+
assert.ok(cyclingCandidates[0]?.reason.includes('cycling'), 'Reason should cite cycling domain');
|
|
113
|
+
assert.ok(!cyclingCandidates[0]?.reason.includes('Ask Peter'), 'Reason should not contain what_they_offer askLine imperative');
|
|
114
|
+
console.log('Peter Abraham candidate reason:', cyclingCandidates[0]?.reason);
|
|
115
|
+
// Test 2c: Self-recommendation protection - Peter Abraham excluded when consulting Peter Abraham
|
|
116
|
+
const cyclingSelfExclusion = findCandidateExperts('gravel cycling race culture and gear', {
|
|
117
|
+
analysts: mockAnalysts,
|
|
118
|
+
excludeAnalystId: 'peter-abraham-cycling',
|
|
119
|
+
limit: 3,
|
|
120
|
+
});
|
|
121
|
+
assert.strictEqual(cyclingSelfExclusion.length, 0, 'Must exclude candidate matching excludeAnalystId');
|
|
122
|
+
// Test 2d: Blind spot / outside_their_lane exclusion
|
|
123
|
+
// Peter Abraham has 'beauty' in outside_their_lane
|
|
124
|
+
const peterBeautyCheck = findCandidateExperts('beauty product innovation', {
|
|
125
|
+
analysts: [mockAnalysts[1]], // only Peter
|
|
126
|
+
});
|
|
127
|
+
assert.strictEqual(peterBeautyCheck.length, 0, 'Peter must be excluded from beauty query due to outside_their_lane');
|
|
128
|
+
// Test 2e: Honest Empty Failure
|
|
129
|
+
// Query completely out of scope for all mock analysts
|
|
130
|
+
const outOfDomainCandidates = findCandidateExperts('deep seabed geothermal subsea mining robotic drilling', {
|
|
131
|
+
analysts: mockAnalysts,
|
|
132
|
+
});
|
|
133
|
+
console.log('Out of domain candidates count:', outOfDomainCandidates.length);
|
|
134
|
+
assert.strictEqual(outOfDomainCandidates.length, 0, 'Must return empty array honestly when no expert matches');
|
|
135
|
+
// Test 2f: Classic Agent vs Living Practitioner ranking
|
|
136
|
+
// For luxury consumption: Thorstein Veblen matches
|
|
137
|
+
const luxuryCandidates = findCandidateExperts('conspicuous consumption and luxury status display', {
|
|
138
|
+
analysts: mockAnalysts,
|
|
139
|
+
});
|
|
140
|
+
assert.ok(luxuryCandidates.length >= 1);
|
|
141
|
+
assert.strictEqual(luxuryCandidates[0]?.analyst_id, 'thorstein-veblen');
|
|
142
|
+
assert.strictEqual(luxuryCandidates[0]?.display_name, 'Thorstein Veblen');
|
|
143
|
+
assert.strictEqual(luxuryCandidates[0]?.category, 'classic_agent');
|
|
144
|
+
console.log('✅ findCandidateExperts tests passed.\n');
|
|
145
|
+
// ─────────────────────────────────────────────────────────────
|
|
146
|
+
// 3. find_expert MCP Tool Registration & Execution Tests
|
|
147
|
+
// ─────────────────────────────────────────────────────────────
|
|
148
|
+
console.log('--- 3. Testing find_expert Tool Handler ---');
|
|
149
|
+
const server = await createServer('test_api_key', 'test_user', (async (method, path) => {
|
|
150
|
+
if (path.includes('/v1/analysts')) {
|
|
151
|
+
return { analysts: mockAnalysts };
|
|
152
|
+
}
|
|
153
|
+
return {};
|
|
154
|
+
}), (async () => ({})), () => 'widget_1', () => 'http://localhost');
|
|
155
|
+
const tools = server._registeredTools;
|
|
156
|
+
const findExpertTool = tools['find_expert'];
|
|
157
|
+
assert.ok(findExpertTool, 'find_expert tool must be registered in server tools');
|
|
158
|
+
// Execute with empty/unmatched query
|
|
159
|
+
const emptyResult = await findExpertTool.handler({ query: 'cryogenic orbital propulsion mechanics' });
|
|
160
|
+
const emptyParsed = JSON.parse(emptyResult.content[0].text);
|
|
161
|
+
assert.strictEqual(emptyParsed.total_matches, 0);
|
|
162
|
+
assert.deepStrictEqual(emptyParsed.candidates, []);
|
|
163
|
+
assert.ok(emptyParsed.note && emptyParsed.note.includes('No active expert directly covers this domain'));
|
|
164
|
+
console.log('Empty find_expert result note:', emptyParsed.note);
|
|
165
|
+
// Execute with general matching query (will run against cached analysts)
|
|
166
|
+
const beautyResult = await findExpertTool.handler({ query: 'beauty, cosmetics, and skincare' });
|
|
167
|
+
const beautyParsed = JSON.parse(beautyResult.content[0].text);
|
|
168
|
+
console.log('find_expert beauty query result total_matches:', beautyParsed.total_matches);
|
|
169
|
+
if (beautyParsed.candidates.length > 0) {
|
|
170
|
+
const first = beautyParsed.candidates[0];
|
|
171
|
+
assert.ok(first.analyst_id, 'Candidate must have analyst_id');
|
|
172
|
+
assert.ok(first.display_name, 'Candidate must have display_name');
|
|
173
|
+
assert.ok(!first.display_name.includes('(Classic Digital Twin)'), 'display_name must not contain legacy twin suffix');
|
|
174
|
+
assert.ok(!first.display_name.includes('(Digital Twin)'), 'display_name must not contain legacy twin suffix');
|
|
175
|
+
assert.ok(first.category, 'Candidate must have category');
|
|
176
|
+
assert.ok(first.reason, 'Candidate must have reason explanation');
|
|
177
|
+
assert.ok(first.consult_tool, 'Candidate must have consult_tool');
|
|
178
|
+
}
|
|
179
|
+
console.log('✅ find_expert local fallback tests passed.\n');
|
|
180
|
+
// ─────────────────────────────────────────────────────────────
|
|
181
|
+
// 3b. find_expert API Integration Tests (On-Request, Active, Related Graphs, Timeout Fallback)
|
|
182
|
+
// ─────────────────────────────────────────────────────────────
|
|
183
|
+
console.log('--- 3b. Testing find_expert API Integration & Differentiated Routing ---');
|
|
184
|
+
// Test 3b.1: On-Request Specialist via API
|
|
185
|
+
const serverWithOnRequestApi = await createServer('test_api_key', 'test_user', (async (method, path) => {
|
|
186
|
+
if (path.includes('/v1/experts/search')) {
|
|
187
|
+
return {
|
|
188
|
+
ok: true,
|
|
189
|
+
query: 'nicotine pouches',
|
|
190
|
+
total_matches: 1,
|
|
191
|
+
timing_ms: 15.2,
|
|
192
|
+
results: [
|
|
193
|
+
{
|
|
194
|
+
id: 'adam-specialist',
|
|
195
|
+
slug: 'adam-specialist',
|
|
196
|
+
name: 'Adam Specialist',
|
|
197
|
+
status: 'Unclaimed',
|
|
198
|
+
agent_class: 'human_agent',
|
|
199
|
+
role_title: 'Regulatory & Market Entry Director',
|
|
200
|
+
search_ask_line: 'Ask Adam about market entry and compliance for nicotine pouches and vaping products.',
|
|
201
|
+
why_matched: ['Nicotine pouches', 'Vaping products'],
|
|
202
|
+
topics: ['harm reduction', 'oral nicotine'],
|
|
203
|
+
score: 25
|
|
204
|
+
}
|
|
205
|
+
],
|
|
206
|
+
related_knowledge_graphs: []
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
return {};
|
|
210
|
+
}), (async () => ({})), () => 'widget_1', () => 'http://localhost');
|
|
211
|
+
const findExpertOnRequest = serverWithOnRequestApi._registeredTools['find_expert'];
|
|
212
|
+
const onRequestRes = await findExpertOnRequest.handler({ query: 'nicotine pouches' });
|
|
213
|
+
const onRequestParsed = JSON.parse(onRequestRes.content[0].text);
|
|
214
|
+
assert.strictEqual(onRequestParsed.total_matches, 1);
|
|
215
|
+
const onReqCandidate = onRequestParsed.candidates[0];
|
|
216
|
+
assert.strictEqual(onReqCandidate.analyst_id, 'adam-specialist');
|
|
217
|
+
assert.strictEqual(onReqCandidate.status, 'on_request');
|
|
218
|
+
assert.strictEqual(onReqCandidate.search_ask_line, 'Ask Adam about market entry and compliance for nicotine pouches and vaping products.');
|
|
219
|
+
assert.deepStrictEqual(onReqCandidate.why_matched, ['Nicotine pouches', 'Vaping products']);
|
|
220
|
+
assert.ok(onReqCandidate.next_step.includes('request_expert_intro(analyst_id: \'adam-specialist\')'));
|
|
221
|
+
assert.ok(onReqCandidate.next_step.includes('consult_human_agent(analyst_id: \'adam-specialist\')'));
|
|
222
|
+
console.log('✅ find_expert On-Request candidate routing verified.');
|
|
223
|
+
// Test 3b.2: Active Human Agent via API
|
|
224
|
+
const serverWithActiveApi = await createServer('test_api_key', 'test_user', (async (method, path) => {
|
|
225
|
+
if (path.includes('/v1/experts/search')) {
|
|
226
|
+
return {
|
|
227
|
+
ok: true,
|
|
228
|
+
query: 'clean beauty',
|
|
229
|
+
total_matches: 1,
|
|
230
|
+
timing_ms: 12.0,
|
|
231
|
+
results: [
|
|
232
|
+
{
|
|
233
|
+
id: 'tara-james-taylor',
|
|
234
|
+
slug: 'tara-james-taylor',
|
|
235
|
+
name: 'Tara James Taylor',
|
|
236
|
+
status: 'Active',
|
|
237
|
+
agent_class: 'human_agent',
|
|
238
|
+
role_title: 'Global Head of Beauty & Personal Care',
|
|
239
|
+
search_ask_line: 'Ask Tara about clean beauty formulation trends and retail distribution.',
|
|
240
|
+
why_matched: ['Clean beauty', 'Cosmetics'],
|
|
241
|
+
topics: ['clean beauty', 'skincare'],
|
|
242
|
+
score: 28
|
|
243
|
+
}
|
|
244
|
+
],
|
|
245
|
+
related_knowledge_graphs: []
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
return {};
|
|
249
|
+
}), (async () => ({})), () => 'widget_1', () => 'http://localhost');
|
|
250
|
+
const findExpertActive = serverWithActiveApi._registeredTools['find_expert'];
|
|
251
|
+
const activeRes = await findExpertActive.handler({ query: 'clean beauty' });
|
|
252
|
+
const activeParsed = JSON.parse(activeRes.content[0].text);
|
|
253
|
+
assert.strictEqual(activeParsed.total_matches, 1);
|
|
254
|
+
const activeCandidate = activeParsed.candidates[0];
|
|
255
|
+
assert.strictEqual(activeCandidate.status, 'active');
|
|
256
|
+
assert.strictEqual(activeCandidate.consult_tool, 'consult_human_agent');
|
|
257
|
+
assert.strictEqual(activeCandidate.next_step, "Call consult_human_agent with analyst_id: 'tara-james-taylor'.");
|
|
258
|
+
console.log('✅ find_expert Active Human Agent routing verified.');
|
|
259
|
+
// Test 3b.3: Zero Matches with Related Knowledge Graphs
|
|
260
|
+
const serverWithGraphsApi = await createServer('test_api_key', 'test_user', (async (method, path) => {
|
|
261
|
+
if (path.includes('/v1/experts/search')) {
|
|
262
|
+
return {
|
|
263
|
+
ok: true,
|
|
264
|
+
query: 'sub-orbital hypersonic space travel',
|
|
265
|
+
total_matches: 0,
|
|
266
|
+
timing_ms: 8.5,
|
|
267
|
+
results: [],
|
|
268
|
+
related_knowledge_graphs: [
|
|
269
|
+
{ id: 'tech', name: 'PSFK Technology & Enterprise', description: 'Tech insights' },
|
|
270
|
+
{ id: 'transport', name: 'Mobility & Aerospace Trends', description: 'Transport insights' }
|
|
271
|
+
]
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
return {};
|
|
275
|
+
}), (async () => ({})), () => 'widget_1', () => 'http://localhost');
|
|
276
|
+
const findExpertGraphs = serverWithGraphsApi._registeredTools['find_expert'];
|
|
277
|
+
const graphsRes = await findExpertGraphs.handler({ query: 'sub-orbital hypersonic space travel' });
|
|
278
|
+
const graphsParsed = JSON.parse(graphsRes.content[0].text);
|
|
279
|
+
assert.strictEqual(graphsParsed.total_matches, 0);
|
|
280
|
+
assert.deepStrictEqual(graphsParsed.candidates, []);
|
|
281
|
+
assert.ok(graphsParsed.note.includes('No dedicated Human Agent covers this domain yet'));
|
|
282
|
+
assert.ok(graphsParsed.note.includes('PSFK Technology & Enterprise, Mobility & Aerospace Trends'));
|
|
283
|
+
assert.ok(graphsParsed.note.includes("search_graph(graphId: 'tech', query: 'sub-orbital hypersonic space travel')"));
|
|
284
|
+
assert.strictEqual(graphsParsed.related_knowledge_graphs.length, 2);
|
|
285
|
+
console.log('✅ find_expert Related Knowledge Graphs recommendation verified.');
|
|
286
|
+
// Test 3b.4: Network Error Fallback to Local Matching
|
|
287
|
+
const serverWithErrorApi = await createServer('test_api_key', 'test_user', (async (method, path) => {
|
|
288
|
+
if (path.includes('/v1/experts/search')) {
|
|
289
|
+
throw new Error('Connection refused to Fodda API');
|
|
290
|
+
}
|
|
291
|
+
if (path.includes('/v1/analysts')) {
|
|
292
|
+
return { analysts: mockAnalysts };
|
|
293
|
+
}
|
|
294
|
+
return {};
|
|
295
|
+
}), (async () => ({})), () => 'widget_1', () => 'http://localhost');
|
|
296
|
+
const findExpertError = serverWithErrorApi._registeredTools['find_expert'];
|
|
297
|
+
const errorFallbackRes = await findExpertError.handler({ query: 'beauty, cosmetics, and skincare' });
|
|
298
|
+
assert.strictEqual(errorFallbackRes.isError, undefined);
|
|
299
|
+
const errorFallbackParsed = JSON.parse(errorFallbackRes.content[0].text);
|
|
300
|
+
assert.ok(errorFallbackParsed.total_matches >= 1, 'Local fallback must find candidate despite API error');
|
|
301
|
+
assert.strictEqual(errorFallbackParsed.candidates[0].analyst_id, 'lauren-goode-beauty');
|
|
302
|
+
console.log('✅ find_expert Network Error graceful local fallback verified.');
|
|
303
|
+
// Test 3b.5: Timeout Fallback (>3s) to Local Matching
|
|
304
|
+
const serverWithTimeoutApi = await createServer('test_api_key', 'test_user', (async (method, path) => {
|
|
305
|
+
if (path.includes('/v1/experts/search')) {
|
|
306
|
+
// Simulate slow upstream hang (> 3s)
|
|
307
|
+
await new Promise(resolve => setTimeout(resolve, 3500));
|
|
308
|
+
return { ok: true, results: [] };
|
|
309
|
+
}
|
|
310
|
+
if (path.includes('/v1/analysts')) {
|
|
311
|
+
return { analysts: mockAnalysts };
|
|
312
|
+
}
|
|
313
|
+
return {};
|
|
314
|
+
}), (async () => ({})), () => 'widget_1', () => 'http://localhost');
|
|
315
|
+
const findExpertTimeout = serverWithTimeoutApi._registeredTools['find_expert'];
|
|
316
|
+
const timeoutStart = Date.now();
|
|
317
|
+
const timeoutRes = await findExpertTimeout.handler({ query: 'beauty, cosmetics, and skincare' });
|
|
318
|
+
const elapsed = Date.now() - timeoutStart;
|
|
319
|
+
assert.strictEqual(timeoutRes.isError, undefined);
|
|
320
|
+
assert.ok(elapsed >= 2900 && elapsed < 4500, `Timeout must trigger around 3000ms, took ${elapsed}ms`);
|
|
321
|
+
const timeoutParsed = JSON.parse(timeoutRes.content[0].text);
|
|
322
|
+
assert.ok(timeoutParsed.total_matches >= 1, 'Local fallback must find candidate when API times out');
|
|
323
|
+
assert.strictEqual(timeoutParsed.candidates[0].analyst_id, 'lauren-goode-beauty');
|
|
324
|
+
console.log('✅ find_expert >3s Timeout graceful local fallback verified.\n');
|
|
325
|
+
// ─────────────────────────────────────────────────────────────
|
|
326
|
+
// 4. consult_analyst deep Parameter Tests
|
|
327
|
+
// ─────────────────────────────────────────────────────────────
|
|
328
|
+
console.log('--- 4. Testing consult_analyst deep Parameter ---');
|
|
329
|
+
const consultTool = tools['consult_analyst'];
|
|
330
|
+
assert.ok(consultTool, 'consult_analyst must be registered');
|
|
331
|
+
const shape = typeof consultTool.inputSchema?.def?.shape === 'function'
|
|
332
|
+
? consultTool.inputSchema.def.shape()
|
|
333
|
+
: consultTool.inputSchema?.def?.shape;
|
|
334
|
+
assert.ok(shape && shape.deep, 'consult_analyst schema must accept deep parameter');
|
|
335
|
+
// ─────────────────────────────────────────────────────────────
|
|
336
|
+
// 5. get_capabilities find_expert Inclusion Tests
|
|
337
|
+
// ─────────────────────────────────────────────────────────────
|
|
338
|
+
console.log('--- 5. Testing get_capabilities find_expert Inclusion ---');
|
|
339
|
+
const getCapabilitiesTool = tools['get_capabilities'];
|
|
340
|
+
assert.ok(getCapabilitiesTool, 'get_capabilities must be registered');
|
|
341
|
+
const capRes = await getCapabilitiesTool.handler({});
|
|
342
|
+
const capParsed = JSON.parse(capRes.content[0].text);
|
|
343
|
+
const expertCap = capParsed.capabilities.find((c) => c.id === 'expert_consult');
|
|
344
|
+
assert.ok(expertCap, 'expert_consult capability must exist');
|
|
345
|
+
assert.ok(expertCap.tools.includes('find_expert'), 'find_expert must be listed in expert_consult tools');
|
|
346
|
+
console.log('expert_consult tools:', expertCap.tools);
|
|
347
|
+
console.log('✅ get_capabilities find_expert inclusion verified.\n');
|
|
348
|
+
console.log('================================================================');
|
|
349
|
+
console.log(' ALL EXPERT LAYER TESTS PASSED SUCCESSFULLY!');
|
|
350
|
+
console.log('================================================================');
|
|
351
|
+
}
|
|
352
|
+
runTests().catch((err) => {
|
|
353
|
+
console.error('❌ Test failed:', err);
|
|
354
|
+
process.exit(1);
|
|
355
|
+
});
|
|
356
|
+
//# sourceMappingURL=test_expert_layer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_expert_layer.js","sourceRoot":"","sources":["../src/test_expert_layer.ts"],"names":[],"mappings":"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"}
|
package/dist/test_gap_alert.js
CHANGED
|
@@ -28,6 +28,10 @@ check('text: quotes query', text.includes('"Chinese automotive trends EV brands
|
|
|
28
28
|
check('text: on-topic share', text.includes('thin — 2 of 10 results on-topic'), true);
|
|
29
29
|
check('text: layers', text.includes('domain, expert, report'), true);
|
|
30
30
|
check('text: empty variant', buildGapAlertText('u', 't', 'q', emptyCoverage).includes('empty — 0 results'), true);
|
|
31
|
+
// ── Zero retention message composition ──
|
|
32
|
+
const zeroText = buildGapAlertText('piers.fawkes@psfk.com', 'search_graph', 'Secret Project XYZ Query', thinCoverage, true);
|
|
33
|
+
check('zero text: redacts query', zeroText.includes('[zero-retention contract]'), true);
|
|
34
|
+
check('zero text: does not include raw query', zeroText.includes('Secret Project XYZ Query'), false);
|
|
31
35
|
// ── Gating and dedupe ──
|
|
32
36
|
const tracker = createSessionTracker();
|
|
33
37
|
check('ok coverage: no alert', tracker.postGapToSlack('u', 'search_graph', 'chinese ev market', okCoverage), false);
|
|
@@ -38,6 +42,10 @@ check('same query, different tool: still deduped', tracker.postGapToSlack('u', '
|
|
|
38
42
|
check('whitespace/case variant: deduped', tracker.postGapToSlack('u', 'search_graph', ' Chinese EV Market ', thinCoverage), false);
|
|
39
43
|
check('new query: fires', tracker.postGapToSlack('u', 'search_graph', 'peruvian surf tourism', emptyCoverage), true);
|
|
40
44
|
check('new session: fires again', createSessionTracker().postGapToSlack('u', 'search_graph', 'chinese ev market', thinCoverage), true);
|
|
45
|
+
// ── Zero retention session tracker ──
|
|
46
|
+
const zeroTracker = createSessionTracker({ zeroQueryRetention: true });
|
|
47
|
+
check('zero tracker isZeroQueryRetention', zeroTracker.isZeroQueryRetention(), true);
|
|
48
|
+
check('zero tracker fires alert', zeroTracker.postGapToSlack('u', 'search_graph', 'confidential query', thinCoverage), true);
|
|
41
49
|
console.log(failures === 0 ? '\nALL CHECKS PASSED' : `\n${failures} CHECK(S) FAILED`);
|
|
42
50
|
process.exit(failures === 0 ? 0 : 1);
|
|
43
51
|
//# sourceMappingURL=test_gap_alert.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test_gap_alert.js","sourceRoot":"","sources":["../src/test_gap_alert.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"test_gap_alert.js","sourceRoot":"","sources":["../src/test_gap_alert.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_grok_offering_surfaces.d.ts","sourceRoot":"","sources":["../src/test_grok_offering_surfaces.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,155 @@
|
|
|
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 http from 'node:http';
|
|
6
|
+
import express from 'express';
|
|
7
|
+
import { OFFERING_SCOPED_TOOLS } from './index.js';
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = path.dirname(__filename);
|
|
10
|
+
async function runGrokOfferingSurfacesTests() {
|
|
11
|
+
console.log('=== Test Suite: Grok Bot Marketplace Offering Surfaces (Milestone 2) ===\n');
|
|
12
|
+
// 1. Tool Allowlist Verification (§4)
|
|
13
|
+
console.log('1. Verifying grok-brand-context Tool Allowlist:');
|
|
14
|
+
const expectedAllowlist = [
|
|
15
|
+
'get_capabilities',
|
|
16
|
+
'get_domain_intelligence',
|
|
17
|
+
'brand_tracker',
|
|
18
|
+
'discover_adjacent_trends',
|
|
19
|
+
'get_earnings_intelligence',
|
|
20
|
+
'get_evidence',
|
|
21
|
+
'find_expert',
|
|
22
|
+
'verify_claim',
|
|
23
|
+
];
|
|
24
|
+
const actualTools = OFFERING_SCOPED_TOOLS['grok-brand-context'];
|
|
25
|
+
assert.ok(Array.isArray(actualTools), 'grok-brand-context must be registered in OFFERING_SCOPED_TOOLS');
|
|
26
|
+
console.log(' Actual tools on /grok-brand-context:');
|
|
27
|
+
actualTools.forEach(t => console.log(` - ${t}`));
|
|
28
|
+
// Assert exact allowlist equality
|
|
29
|
+
assert.deepStrictEqual(actualTools.slice().sort(), expectedAllowlist.slice().sort(), 'grok-brand-context tools must match exactly the 8 allowlisted tools');
|
|
30
|
+
console.log(` ✅ All ${expectedAllowlist.length} intended tools present`);
|
|
31
|
+
// 2. Assert Exclusions in Both Directions
|
|
32
|
+
console.log('\n2. Verifying Excluded Tools (Bidirectional Assertion):');
|
|
33
|
+
const prohibitedTools = [
|
|
34
|
+
'get_node',
|
|
35
|
+
'get_neighbors',
|
|
36
|
+
'get_label_values',
|
|
37
|
+
'deep_research_topic',
|
|
38
|
+
'check_research_status',
|
|
39
|
+
'consult_human_agent',
|
|
40
|
+
'request_expert_intro',
|
|
41
|
+
'get_earnings_divergence',
|
|
42
|
+
'get_my_account',
|
|
43
|
+
'generate_visual',
|
|
44
|
+
'read_url',
|
|
45
|
+
];
|
|
46
|
+
prohibitedTools.forEach(prohibited => {
|
|
47
|
+
assert.strictEqual(actualTools.includes(prohibited), false, `Prohibited tool "${prohibited}" must NOT be in grok-brand-context allowlist`);
|
|
48
|
+
console.log(` ✅ Prohibited tool absent: ${prohibited}`);
|
|
49
|
+
});
|
|
50
|
+
// 3. Diff Purity: Every other offering slug is unmodified
|
|
51
|
+
console.log('\n3. Verifying Additive-Only Diff Across Other Offerings:');
|
|
52
|
+
const expectedLiveOfferings = [
|
|
53
|
+
'brand-intelligence',
|
|
54
|
+
'topic-research',
|
|
55
|
+
'deep-research',
|
|
56
|
+
'earnings-intelligence',
|
|
57
|
+
'expert-consult',
|
|
58
|
+
'copilot',
|
|
59
|
+
'chatgpt',
|
|
60
|
+
];
|
|
61
|
+
expectedLiveOfferings.forEach(offering => {
|
|
62
|
+
assert.ok(Array.isArray(OFFERING_SCOPED_TOOLS[offering]), `Existing offering "${offering}" must exist in OFFERING_SCOPED_TOOLS`);
|
|
63
|
+
console.log(` ✅ Existing offering preserved unchanged: ${offering} (${OFFERING_SCOPED_TOOLS[offering].length} tools)`);
|
|
64
|
+
});
|
|
65
|
+
// 4. Source Attribution Mapping Verification
|
|
66
|
+
console.log('\n4. Verifying X-Fodda-Source Attribution Derivation:');
|
|
67
|
+
const offeringSlug = 'grok-brand-context';
|
|
68
|
+
const allowedTools = OFFERING_SCOPED_TOOLS[offeringSlug];
|
|
69
|
+
const isInternalTest = false;
|
|
70
|
+
const isSpt = false;
|
|
71
|
+
const defaultSource = isInternalTest ? 'mcp-internal-test' : ((offeringSlug !== 'mcp' && allowedTools !== undefined) ? offeringSlug : (isSpt ? 'spt' : ''));
|
|
72
|
+
assert.strictEqual(defaultSource, 'grok-brand-context', 'Default source must evaluate to "grok-brand-context"');
|
|
73
|
+
console.log(` ✅ Default source derived for ${offeringSlug}: "${defaultSource}"`);
|
|
74
|
+
// 5. Tool Description Ownership Audit (§5)
|
|
75
|
+
console.log('\n5. Tool Description Ownership Audit (Airtable vs. Code):');
|
|
76
|
+
const toolHandlersPath = fs.existsSync(path.resolve(__dirname, '../src/toolHandlers.ts'))
|
|
77
|
+
? path.resolve(__dirname, '../src/toolHandlers.ts')
|
|
78
|
+
: path.resolve(__dirname, 'toolHandlers.ts');
|
|
79
|
+
const toolHandlersCode = fs.readFileSync(toolHandlersPath, 'utf8');
|
|
80
|
+
// Read tools-manifest.json to see metadata
|
|
81
|
+
const manifestPath = path.resolve(__dirname, '../tools-manifest.json');
|
|
82
|
+
let manifestTools = [];
|
|
83
|
+
if (fs.existsSync(manifestPath)) {
|
|
84
|
+
const manifestData = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
|
|
85
|
+
manifestTools = manifestData.tools || [];
|
|
86
|
+
}
|
|
87
|
+
actualTools.forEach(tool => {
|
|
88
|
+
const toolInManifest = manifestTools.find(t => t.name === tool);
|
|
89
|
+
const codeDefinition = toolHandlersCode.includes(`server.tool('${tool}'`) || toolHandlersCode.includes(`server.tool("${tool}"`);
|
|
90
|
+
console.log(` - Tool "${tool}": [Bills As: ${toolInManifest?.bills_as || 'unknown'}] [Category: ${toolInManifest?.category || 'unknown'}] (Defined in: toolHandlers.ts)`);
|
|
91
|
+
});
|
|
92
|
+
// 6. HTTP Endpoint Simulation: 401 WWW-Authenticate & RFC 9728 Discovery
|
|
93
|
+
console.log('\n6. HTTP Simulation for Grok OAuth & Protected Resource Discovery:');
|
|
94
|
+
const testApp = express();
|
|
95
|
+
testApp.use(express.json());
|
|
96
|
+
const SERVICE_URL = 'https://mcp.fodda.ai';
|
|
97
|
+
const CLERK_ISSUER = 'https://clerk.fodda.ai';
|
|
98
|
+
// OAuth discovery
|
|
99
|
+
testApp.get(['/.well-known/oauth-protected-resource', '/.well-known/oauth-protected-resource/:slug'], (req, res) => {
|
|
100
|
+
const slug = req.params.slug;
|
|
101
|
+
const resourceUrl = slug ? `${SERVICE_URL}/${slug}` : SERVICE_URL;
|
|
102
|
+
res.status(200).json({
|
|
103
|
+
resource: resourceUrl,
|
|
104
|
+
authorization_servers: [CLERK_ISSUER],
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
// Anonymous initialize check
|
|
108
|
+
testApp.post('/grok-brand-context', (req, res) => {
|
|
109
|
+
const rawPath = req.path || '';
|
|
110
|
+
const currentSlug = (rawPath.replace(/^\//, '').split('/')[0] || '');
|
|
111
|
+
const metadataSlug = currentSlug || 'mcp';
|
|
112
|
+
res.setHeader('WWW-Authenticate', `Bearer resource_metadata="${SERVICE_URL}/.well-known/oauth-protected-resource/${metadataSlug}"`);
|
|
113
|
+
return res.status(401).json({
|
|
114
|
+
jsonrpc: '2.0',
|
|
115
|
+
error: { code: -32000, message: 'Authentication required. Connect via OAuth, or use your personal connection URL or API key from https://app.fodda.ai.' },
|
|
116
|
+
id: req.body?.id ?? null,
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
const server = http.createServer(testApp);
|
|
120
|
+
await new Promise((resolve) => server.listen(0, resolve));
|
|
121
|
+
const port = server.address().port;
|
|
122
|
+
try {
|
|
123
|
+
// Test 6.1: Discovery card
|
|
124
|
+
const discoveryRes = await fetch(`http://127.0.0.1:${port}/.well-known/oauth-protected-resource/grok-brand-context`);
|
|
125
|
+
assert.strictEqual(discoveryRes.status, 200);
|
|
126
|
+
const discoveryJson = await discoveryRes.json();
|
|
127
|
+
assert.strictEqual(discoveryJson.resource, 'https://mcp.fodda.ai/grok-brand-context');
|
|
128
|
+
assert.deepStrictEqual(discoveryJson.authorization_servers, ['https://clerk.fodda.ai']);
|
|
129
|
+
console.log(' ✅ .well-known/oauth-protected-resource/grok-brand-context payload verified:');
|
|
130
|
+
console.log(` resource: "${discoveryJson.resource}"`);
|
|
131
|
+
console.log(` authorization_servers: ${JSON.stringify(discoveryJson.authorization_servers)}`);
|
|
132
|
+
// Test 6.2: Anonymous initialize 401 + WWW-Authenticate header
|
|
133
|
+
const initRes = await fetch(`http://127.0.0.1:${port}/grok-brand-context`, {
|
|
134
|
+
method: 'POST',
|
|
135
|
+
headers: { 'Content-Type': 'application/json' },
|
|
136
|
+
body: JSON.stringify({ jsonrpc: '2.0', method: 'initialize', id: 1 }),
|
|
137
|
+
});
|
|
138
|
+
assert.strictEqual(initRes.status, 401);
|
|
139
|
+
const wwwAuth = initRes.headers.get('www-authenticate');
|
|
140
|
+
const expectedWwwAuth = 'Bearer resource_metadata="https://mcp.fodda.ai/.well-known/oauth-protected-resource/grok-brand-context"';
|
|
141
|
+
assert.strictEqual(wwwAuth, expectedWwwAuth);
|
|
142
|
+
console.log(' ✅ Anonymous initialize returned HTTP 401 with expected WWW-Authenticate header:');
|
|
143
|
+
console.log(` WWW-Authenticate: ${wwwAuth}`);
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
server.close();
|
|
147
|
+
}
|
|
148
|
+
console.log('\n=== ALL GROK OFFERING SURFACES VERIFICATIONS PASSED ===\n');
|
|
149
|
+
process.exit(0);
|
|
150
|
+
}
|
|
151
|
+
runGrokOfferingSurfacesTests().catch((err) => {
|
|
152
|
+
console.error('❌ Test failed:', err);
|
|
153
|
+
process.exit(1);
|
|
154
|
+
});
|
|
155
|
+
//# sourceMappingURL=test_grok_offering_surfaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_grok_offering_surfaces.js","sourceRoot":"","sources":["../src/test_grok_offering_surfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_human_agent_live.d.ts","sourceRoot":"","sources":["../src/test_human_agent_live.ts"],"names":[],"mappings":""}
|