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,199 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import crypto from 'crypto';
|
|
3
|
+
import assert from 'assert';
|
|
4
|
+
const TEST_PORT = 8991;
|
|
5
|
+
const FODDA_INTERNAL_API_KEY = 'test_internal_secret_key_12345';
|
|
6
|
+
const FODDA_MCP_SECRET = 'test_mcp_hmac_secret_67890';
|
|
7
|
+
process.env.PORT = String(TEST_PORT);
|
|
8
|
+
process.env.FODDA_INTERNAL_API_KEY = FODDA_INTERNAL_API_KEY;
|
|
9
|
+
process.env.FODDA_MCP_SECRET = FODDA_MCP_SECRET;
|
|
10
|
+
// Import index.js to boot the MCP server on TEST_PORT
|
|
11
|
+
await import('./index.js');
|
|
12
|
+
function parseMcpResponse(data) {
|
|
13
|
+
if (typeof data === 'object' && data !== null)
|
|
14
|
+
return data;
|
|
15
|
+
if (typeof data === 'string') {
|
|
16
|
+
const line = data.split('\n').find((l) => l.startsWith('data: '));
|
|
17
|
+
if (line) {
|
|
18
|
+
return JSON.parse(line.slice(6));
|
|
19
|
+
}
|
|
20
|
+
return JSON.parse(data);
|
|
21
|
+
}
|
|
22
|
+
return data;
|
|
23
|
+
}
|
|
24
|
+
async function runServiceToServiceAuthTests() {
|
|
25
|
+
console.log('=== Service-to-Service Connection & Bearer Auth Verification Suite ===\n');
|
|
26
|
+
const baseUrl = `http://localhost:${TEST_PORT}`;
|
|
27
|
+
// Wait for server /health to respond
|
|
28
|
+
let ready = false;
|
|
29
|
+
for (let i = 0; i < 30; i++) {
|
|
30
|
+
try {
|
|
31
|
+
const h = await axios.get(`${baseUrl}/health`);
|
|
32
|
+
if (h.status === 200) {
|
|
33
|
+
ready = true;
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
assert(ready, 'Server failed to start on TEST_PORT');
|
|
42
|
+
console.log(`[test-server] Verified server healthy on port ${TEST_PORT}\n`);
|
|
43
|
+
try {
|
|
44
|
+
// ── TEST 1: Pure Legacy Query String (Should fail with -32001) ──
|
|
45
|
+
console.log('--- Test 1: Legacy Query-String Request (No Headers) ---');
|
|
46
|
+
try {
|
|
47
|
+
await axios.post(`${baseUrl}/mcp?api_key=sk_live_legacy&user_id=legacy@example.com`, {
|
|
48
|
+
jsonrpc: '2.0',
|
|
49
|
+
id: 1,
|
|
50
|
+
method: 'tools/list'
|
|
51
|
+
}, {
|
|
52
|
+
headers: { 'Content-Type': 'application/json' }
|
|
53
|
+
});
|
|
54
|
+
assert.fail('Expected 401 for pure legacy URL query parameters');
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
assert.strictEqual(err.response?.status, 401, 'Status must be 401');
|
|
58
|
+
assert.strictEqual(err.response?.data?.error?.code, -32001, 'Error code must be -32001');
|
|
59
|
+
assert(err.response?.data?.error?.message?.includes('this connection URL is outdated'), 'Message must indicate outdated URL');
|
|
60
|
+
console.log(' ✅ Correctly rejected legacy query-string client with -32001');
|
|
61
|
+
}
|
|
62
|
+
// ── TEST 2: Authorization: Bearer <apiKey> on /mcp (Stateless tools/list direct curl test) ──
|
|
63
|
+
console.log('\n--- Test 2: Stateless tools/list with Authorization: Bearer Header ---');
|
|
64
|
+
const res2 = await axios.post(`${baseUrl}/mcp`, {
|
|
65
|
+
jsonrpc: '2.0',
|
|
66
|
+
id: 1,
|
|
67
|
+
method: 'tools/list'
|
|
68
|
+
}, {
|
|
69
|
+
headers: {
|
|
70
|
+
'Content-Type': 'application/json',
|
|
71
|
+
'Authorization': 'Bearer sk_live_test_analyst'
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
assert.strictEqual(res2.status, 200, 'Status must be 200 OK');
|
|
75
|
+
const parsed2 = parseMcpResponse(res2.data);
|
|
76
|
+
assert(Array.isArray(parsed2?.result?.tools), 'Must return tools array');
|
|
77
|
+
assert(parsed2.result.tools.length > 0, 'Must have registered tools');
|
|
78
|
+
console.log(` ✅ Successfully returned ${parsed2.result.tools.length} tools via direct Bearer auth`);
|
|
79
|
+
// ── TEST 3: Bearer Header with legacy query params present (Bypass check) ──
|
|
80
|
+
console.log('\n--- Test 3: Bearer Header overriding legacy query params on /mcp ---');
|
|
81
|
+
const res3 = await axios.post(`${baseUrl}/mcp?api_key=sk_live_test_analyst&user_id=user@example.com`, {
|
|
82
|
+
jsonrpc: '2.0',
|
|
83
|
+
id: 2,
|
|
84
|
+
method: 'tools/list'
|
|
85
|
+
}, {
|
|
86
|
+
headers: {
|
|
87
|
+
'Content-Type': 'application/json',
|
|
88
|
+
'Authorization': 'Bearer sk_live_test_analyst'
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
assert.strictEqual(res3.status, 200, 'Status must be 200 OK');
|
|
92
|
+
const parsed3 = parseMcpResponse(res3.data);
|
|
93
|
+
assert.strictEqual(parsed3?.error, undefined, 'Must not return JSON-RPC error');
|
|
94
|
+
assert(parsed3?.result?.tools?.length > 0, 'Must return tools');
|
|
95
|
+
console.log(' ✅ Bearer header cleanly bypassed -32001 deprecation error');
|
|
96
|
+
// ── TEST 4: Internal Service Auth via X-Internal-Key ──
|
|
97
|
+
console.log('\n--- Test 4: Internal Service Auth via X-Internal-Key ---');
|
|
98
|
+
const res4 = await axios.post(`${baseUrl}/mcp?api_key=internal_call&user_id=service@fodda.ai`, {
|
|
99
|
+
jsonrpc: '2.0',
|
|
100
|
+
id: 3,
|
|
101
|
+
method: 'tools/list'
|
|
102
|
+
}, {
|
|
103
|
+
headers: {
|
|
104
|
+
'Content-Type': 'application/json',
|
|
105
|
+
'X-Internal-Key': FODDA_INTERNAL_API_KEY,
|
|
106
|
+
'X-User-Email': 'researcher@fodda.ai'
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
assert.strictEqual(res4.status, 200, 'Status must be 200 OK');
|
|
110
|
+
const parsed4 = parseMcpResponse(res4.data);
|
|
111
|
+
assert(parsed4?.result?.tools?.length > 0, 'Must list tools for internal key');
|
|
112
|
+
console.log(' ✅ X-Internal-Key successfully authenticated and bypassed deprecation');
|
|
113
|
+
// ── TEST 5: Internal Service Auth via HMAC X-Fodda-Signature ──
|
|
114
|
+
console.log('\n--- Test 5: Internal Service Auth via HMAC X-Fodda-Signature ---');
|
|
115
|
+
const timestamp = Date.now().toString();
|
|
116
|
+
const body5 = {
|
|
117
|
+
jsonrpc: '2.0',
|
|
118
|
+
id: 4,
|
|
119
|
+
method: 'tools/list'
|
|
120
|
+
};
|
|
121
|
+
const payload5 = `${timestamp}.${JSON.stringify(body5)}`;
|
|
122
|
+
const signature5 = crypto.createHmac('sha256', FODDA_MCP_SECRET).update(payload5).digest('hex');
|
|
123
|
+
const res5 = await axios.post(`${baseUrl}/mcp?api_key=system&user_id=system@fodda.ai`, body5, {
|
|
124
|
+
headers: {
|
|
125
|
+
'Content-Type': 'application/json',
|
|
126
|
+
'X-Fodda-Timestamp': timestamp,
|
|
127
|
+
'X-Fodda-Signature': signature5
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
assert.strictEqual(res5.status, 200, 'Status must be 200 OK');
|
|
131
|
+
const parsed5 = parseMcpResponse(res5.data);
|
|
132
|
+
assert(parsed5?.result?.tools?.length > 0, 'Must list tools for valid HMAC');
|
|
133
|
+
console.log(' ✅ Valid HMAC signature successfully authenticated and bypassed deprecation');
|
|
134
|
+
// ── TEST 6: User Identity Resolution from X-User-Email & X-User-Id in stateful session ──
|
|
135
|
+
console.log('\n--- Test 6: Stateful initialize handshake with X-User-Email ---');
|
|
136
|
+
const res6 = await axios.post(`${baseUrl}/mcp`, {
|
|
137
|
+
jsonrpc: '2.0',
|
|
138
|
+
id: 5,
|
|
139
|
+
method: 'initialize',
|
|
140
|
+
params: {
|
|
141
|
+
protocolVersion: '2024-11-05',
|
|
142
|
+
capabilities: {},
|
|
143
|
+
clientInfo: { name: 'fodda-sandbox', version: '1.0.0' }
|
|
144
|
+
}
|
|
145
|
+
}, {
|
|
146
|
+
headers: {
|
|
147
|
+
'Content-Type': 'application/json',
|
|
148
|
+
'Authorization': 'Bearer sk_live_test_sandbox',
|
|
149
|
+
'X-User-Email': 'sandbox_tester@example.com'
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
assert.strictEqual(res6.status, 200, 'Status must be 200 OK');
|
|
153
|
+
const sessionId = res6.headers['mcp-session-id'];
|
|
154
|
+
assert(sessionId, 'Server must emit Mcp-Session-Id header');
|
|
155
|
+
console.log(` ✅ Initialized stateful session with session ID: ${sessionId}`);
|
|
156
|
+
// Call tools/list with session ID
|
|
157
|
+
const res6b = await axios.post(`${baseUrl}/mcp`, {
|
|
158
|
+
jsonrpc: '2.0',
|
|
159
|
+
id: 6,
|
|
160
|
+
method: 'tools/list'
|
|
161
|
+
}, {
|
|
162
|
+
headers: {
|
|
163
|
+
'Content-Type': 'application/json',
|
|
164
|
+
'Mcp-Session-Id': sessionId
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
assert.strictEqual(res6b.status, 200, 'Status must be 200 OK');
|
|
168
|
+
const parsed6b = parseMcpResponse(res6b.data);
|
|
169
|
+
assert(parsed6b?.result?.tools?.length > 0, 'Must list tools with session ID');
|
|
170
|
+
console.log(' ✅ Subsequent tool listing succeeded on initialized session');
|
|
171
|
+
// ── TEST 7: SDK StreamableHTTPClientTransport connection (Matching mcpChatService) ──
|
|
172
|
+
console.log('\n--- Test 7: StreamableHTTPClientTransport SDK with Authorization Header ---');
|
|
173
|
+
const { Client } = await import('@modelcontextprotocol/sdk/client/index.js');
|
|
174
|
+
const { StreamableHTTPClientTransport } = await import('@modelcontextprotocol/sdk/client/streamableHttp.js');
|
|
175
|
+
const clientTransport = new StreamableHTTPClientTransport(new URL(`${baseUrl}/mcp`), {
|
|
176
|
+
requestInit: {
|
|
177
|
+
headers: {
|
|
178
|
+
'Authorization': 'Bearer sk_live_test_sandbox_sdk',
|
|
179
|
+
'X-User-Email': 'sdk_user@example.com'
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
const mcpClient = new Client({ name: 'fodda-sandbox', version: '1.0.0' });
|
|
184
|
+
await mcpClient.connect(clientTransport);
|
|
185
|
+
const toolsResult = await mcpClient.listTools();
|
|
186
|
+
assert(Array.isArray(toolsResult.tools), 'SDK listTools must return tools array');
|
|
187
|
+
assert(toolsResult.tools.length > 0, 'SDK must receive tools');
|
|
188
|
+
console.log(` ✅ SDK Client connected and listed ${toolsResult.tools.length} tools via StreamableHTTPClientTransport`);
|
|
189
|
+
await mcpClient.close();
|
|
190
|
+
console.log('\n🎉 ALL SERVICE-TO-SERVICE AUTH TESTS PASSED CLEANLY! 🎉');
|
|
191
|
+
process.exit(0);
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
console.error('Test Suite Failed:', err);
|
|
195
|
+
process.exit(1);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
runServiceToServiceAuthTests();
|
|
199
|
+
//# sourceMappingURL=test_service_to_service_auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_service_to_service_auth.js","sourceRoot":"","sources":["../src/test_service_to_service_auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_sources_live.d.ts","sourceRoot":"","sources":["../src/test_sources_live.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import dotenv from 'dotenv';
|
|
2
|
+
dotenv.config();
|
|
3
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
4
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
5
|
+
const DEPLOYED_MCP_URL = process.env.TEST_URL || 'https://mcp.fodda.ai/mcp';
|
|
6
|
+
const FODDA_API_KEY = process.env.FODDA_API_KEY || 'sk_live_abcdef';
|
|
7
|
+
async function testSourcesLive() {
|
|
8
|
+
console.log(`=== Testing sources_used stringification fix on Revision fodda-mcp-00443-kvt ===\n`);
|
|
9
|
+
const transport = new StreamableHTTPClientTransport(new URL(`${DEPLOYED_MCP_URL}?api_key=${FODDA_API_KEY}&session_kind=internal-test`));
|
|
10
|
+
const client = new Client({ name: 'live-sources-verifier', version: '1.0.0' });
|
|
11
|
+
await client.connect(transport);
|
|
12
|
+
console.log('Calling consult_human_agent with analyst_id: "anu-lingala-macro"...');
|
|
13
|
+
const result = await client.callTool({
|
|
14
|
+
name: 'consult_human_agent',
|
|
15
|
+
arguments: {
|
|
16
|
+
analyst_id: 'anu-lingala-macro',
|
|
17
|
+
query: 'What are the major cultural macro-trends right now?'
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
const text = result.content[0]?.text || '';
|
|
21
|
+
console.log(`\nResult output:\n"${text.slice(-500)}"\n`);
|
|
22
|
+
if (text.includes('--- SOURCES USED ---') && !text.includes('- Source\n- Source')) {
|
|
23
|
+
console.log('🎉 SUCCESS: sources_used footer printed real source names (no stringification bug)!');
|
|
24
|
+
}
|
|
25
|
+
await client.close();
|
|
26
|
+
}
|
|
27
|
+
testSourcesLive().catch(err => {
|
|
28
|
+
console.error('❌ Error:', err.message || err);
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=test_sources_live.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_sources_live.js","sourceRoot":"","sources":["../src/test_sources_live.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAEnG,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,0BAA0B,CAAC;AAC5E,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,gBAAgB,CAAC;AAEpE,KAAK,UAAU,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;IAElG,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAC/C,IAAI,GAAG,CAAC,GAAG,gBAAgB,YAAY,aAAa,6BAA6B,CAAC,CACrF,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/E,MAAM,MAAM,CAAC,OAAO,CAAC,SAAgB,CAAC,CAAC;IAEvC,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;QACjC,IAAI,EAAE,qBAAqB;QAC3B,SAAS,EAAE;YACP,UAAU,EAAE,mBAAmB;YAC/B,KAAK,EAAE,qDAAqD;SAC/D;KACJ,CAAC,CAAC;IAEH,MAAM,IAAI,GAAI,MAAM,CAAC,OAAe,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAEzD,IAAI,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,qFAAqF,CAAC,CAAC;IACvG,CAAC;IAED,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC;AAED,eAAe,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IAC1B,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_specialist_and_analyst_tiers.d.ts","sourceRoot":"","sources":["../src/test_specialist_and_analyst_tiers.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import { createServer } from './toolHandlers.js';
|
|
3
|
+
async function mockFoddaRequest(method, path, apiKey, userId, body) {
|
|
4
|
+
if (path === '/v1/graphs/catalog')
|
|
5
|
+
return { graphs: [] };
|
|
6
|
+
if (path === '/v1/analysts')
|
|
7
|
+
return [
|
|
8
|
+
{
|
|
9
|
+
analyst_id: 'ben-dietz-sic',
|
|
10
|
+
name: 'Ben Dietz',
|
|
11
|
+
graphSubType: 'Digital Twin',
|
|
12
|
+
expertIn: 'youth culture, streetwear, underground music',
|
|
13
|
+
description: 'Cultural strategist and host of [SIC] Weekly',
|
|
14
|
+
topics: ['streetwear', 'culture']
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
analyst_id: 'brand-cmo',
|
|
18
|
+
name: 'Brand CMO',
|
|
19
|
+
graphSubType: 'Executive',
|
|
20
|
+
expertIn: 'enterprise brand marketing, corporate governance',
|
|
21
|
+
description: 'Corporate CMO lens grounded in SEC filings',
|
|
22
|
+
topics: ['brand', 'marketing', 'earnings']
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
analyst_id: 'john-ruskin',
|
|
26
|
+
name: 'John Ruskin',
|
|
27
|
+
graphSubType: 'Classic Digital Twin',
|
|
28
|
+
expertIn: 'craftsmanship, aesthetic philosophy, moral critique',
|
|
29
|
+
description: 'Victorian art critic and social thinker',
|
|
30
|
+
topics: ['art', 'craftsmanship', 'philosophy']
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
analyst_id: 'retail-synthetic',
|
|
34
|
+
name: 'Retail Synthetic Analyst',
|
|
35
|
+
graphSubType: 'Synthetic Expert',
|
|
36
|
+
expertIn: 'omnichannel retail logistics',
|
|
37
|
+
description: 'Synthetic retail domain lens',
|
|
38
|
+
topics: ['retail', 'logistics']
|
|
39
|
+
}
|
|
40
|
+
];
|
|
41
|
+
if (path === '/v1/human-agents/book-a-call-map')
|
|
42
|
+
return {};
|
|
43
|
+
if (path === '/v1/search/expert') {
|
|
44
|
+
return {
|
|
45
|
+
total: 3,
|
|
46
|
+
on_topic_total: 3,
|
|
47
|
+
results: [
|
|
48
|
+
{ id: '1', title: 'Streetwear drop model evolving', graphId: 'ben-dietz-sic', score: 0.85 }
|
|
49
|
+
]
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (path === '/v1/human-agents/consult') {
|
|
53
|
+
return {
|
|
54
|
+
result: 'Deep research into youth streetwear indicates emerging micro-communities.',
|
|
55
|
+
coverage: 'in',
|
|
56
|
+
sources_used: [
|
|
57
|
+
{ title: 'Subculture Signal', url: 'https://fodda.ai/signals/1' }
|
|
58
|
+
],
|
|
59
|
+
receivedBody: body
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return {};
|
|
63
|
+
}
|
|
64
|
+
async function mockWaverunnerRequest() { return {}; }
|
|
65
|
+
async function runTests() {
|
|
66
|
+
console.log('--- Testing Specialist Intelligence & 4-Tier Analyst Classification ---');
|
|
67
|
+
const server = await createServer('sk_test', 'test_user', mockFoddaRequest, mockWaverunnerRequest, () => 'widget_1', () => 'http://localhost');
|
|
68
|
+
// @ts-ignore
|
|
69
|
+
const tools = server._registeredTools;
|
|
70
|
+
// 1. Verify get_specialist_intelligence and get_expert_intelligence exist
|
|
71
|
+
assert.ok(tools['get_specialist_intelligence'], 'get_specialist_intelligence must be registered');
|
|
72
|
+
assert.ok(tools['get_expert_intelligence'], 'get_expert_intelligence legacy alias must be registered');
|
|
73
|
+
console.log('✅ Tool Registration Passed: get_specialist_intelligence & get_expert_intelligence alias present');
|
|
74
|
+
// 2. Call list_analysts with no filter (all)
|
|
75
|
+
const listTool = tools['list_analysts'];
|
|
76
|
+
const allRes = await listTool.handler({});
|
|
77
|
+
const allData = JSON.parse(allRes.content[0].text);
|
|
78
|
+
assert.strictEqual(allData.analysts.length, 4, 'Should return 4 analysts');
|
|
79
|
+
const ben = allData.analysts.find((a) => a.analyst_id === 'ben-dietz-sic');
|
|
80
|
+
assert.strictEqual(ben.category, 'human_agent');
|
|
81
|
+
assert.strictEqual(ben.category_label, 'Human Agent');
|
|
82
|
+
assert.strictEqual(ben.twin_type, 'Expert Digital Twin');
|
|
83
|
+
assert.strictEqual(ben.is_verified_real_person, true);
|
|
84
|
+
assert.strictEqual(ben.consult_tool, 'consult_human_agent');
|
|
85
|
+
const cmo = allData.analysts.find((a) => a.analyst_id === 'brand-cmo');
|
|
86
|
+
assert.strictEqual(cmo.category, 'c_suite_agent');
|
|
87
|
+
assert.strictEqual(cmo.category_label, 'C-Suite Agent');
|
|
88
|
+
assert.strictEqual(cmo.is_verified_real_person, false);
|
|
89
|
+
assert.strictEqual(cmo.consult_tool, 'consult_analyst');
|
|
90
|
+
const ruskin = allData.analysts.find((a) => a.analyst_id === 'john-ruskin');
|
|
91
|
+
assert.strictEqual(ruskin.category, 'classic_agent');
|
|
92
|
+
assert.strictEqual(ruskin.category_label, 'Classic Agent');
|
|
93
|
+
assert.strictEqual(ruskin.twin_type, 'Classic Agent');
|
|
94
|
+
assert.strictEqual(ruskin.is_verified_real_person, false);
|
|
95
|
+
assert.strictEqual(ruskin.consult_tool, 'consult_analyst');
|
|
96
|
+
const synthetic = allData.analysts.find((a) => a.analyst_id === 'retail-synthetic');
|
|
97
|
+
assert.strictEqual(synthetic.category, 'synthetic_agent');
|
|
98
|
+
assert.strictEqual(synthetic.category_label, 'Synthetic Agent');
|
|
99
|
+
assert.strictEqual(synthetic.is_verified_real_person, false);
|
|
100
|
+
console.log('✅ 4-Tier Categorization Passed: Human Agent, Classic Agent, C-Suite, and Synthetic correctly classified');
|
|
101
|
+
// 3. Test list_analysts category filtering
|
|
102
|
+
const humanOnlyRes = await listTool.handler({ category: 'human_agent' });
|
|
103
|
+
const humanOnlyData = JSON.parse(humanOnlyRes.content[0].text);
|
|
104
|
+
assert.strictEqual(humanOnlyData.analysts.length, 1);
|
|
105
|
+
assert.strictEqual(humanOnlyData.analysts[0].analyst_id, 'ben-dietz-sic');
|
|
106
|
+
const cSuiteOnlyRes = await listTool.handler({ category: 'c_suite_agent' });
|
|
107
|
+
const cSuiteData = JSON.parse(cSuiteOnlyRes.content[0].text);
|
|
108
|
+
assert.strictEqual(cSuiteData.analysts.length, 1);
|
|
109
|
+
assert.strictEqual(cSuiteData.analysts[0].analyst_id, 'brand-cmo');
|
|
110
|
+
console.log('✅ Category Filtering Passed: list_analysts correctly filters by category');
|
|
111
|
+
// 4. Test list_analysts natural query filtering
|
|
112
|
+
const queryRes = await listTool.handler({ query: 'underground streetwear' });
|
|
113
|
+
const queryData = JSON.parse(queryRes.content[0].text);
|
|
114
|
+
assert.strictEqual(queryData.analysts.length, 1);
|
|
115
|
+
assert.strictEqual(queryData.analysts[0].analyst_id, 'ben-dietz-sic');
|
|
116
|
+
console.log('✅ Query Filtering Passed: list_analysts matches natural language query to analyst lane');
|
|
117
|
+
// 5. Test consult_human_agent deep / homework mode
|
|
118
|
+
let lastConsultBody = null;
|
|
119
|
+
const customFoddaRequest = async (method, path, key, uid, body) => {
|
|
120
|
+
if (path === '/v1/human-agents/consult') {
|
|
121
|
+
lastConsultBody = body;
|
|
122
|
+
return {
|
|
123
|
+
result: 'Detailed breakdown with evidence',
|
|
124
|
+
coverage: 'in',
|
|
125
|
+
sources_used: []
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return mockFoddaRequest(method, path, key, uid, body);
|
|
129
|
+
};
|
|
130
|
+
const consultServer = await createServer('sk_test', 'test_user', customFoddaRequest, mockWaverunnerRequest, () => 'widget_1', () => 'http://localhost');
|
|
131
|
+
// @ts-ignore
|
|
132
|
+
const consultTools = consultServer._registeredTools;
|
|
133
|
+
const consultTool = consultTools['consult_human_agent'];
|
|
134
|
+
// Case A: explicit deep: true
|
|
135
|
+
await consultTool.handler({
|
|
136
|
+
analyst_id: 'ben-dietz-sic',
|
|
137
|
+
query: 'Analyze luxury streetwear collaboration trends',
|
|
138
|
+
deep: true
|
|
139
|
+
});
|
|
140
|
+
assert.strictEqual(lastConsultBody?.deep, true, 'Must pass deep: true when deep param is set');
|
|
141
|
+
// Case B: natural query "do your homework"
|
|
142
|
+
lastConsultBody = null;
|
|
143
|
+
await consultTool.handler({
|
|
144
|
+
analyst_id: 'ben-dietz-sic',
|
|
145
|
+
query: 'Can you do your homework and find concrete data on streetwear drops?'
|
|
146
|
+
});
|
|
147
|
+
assert.strictEqual(lastConsultBody?.deep, true, 'Must auto-detect homework intent from query and pass deep: true');
|
|
148
|
+
console.log('✅ Multi-Turn Homework Passed: consult_human_agent triggers deep background research');
|
|
149
|
+
console.log('\nAll Specialist & 4-Tier Agent tests passed successfully!');
|
|
150
|
+
}
|
|
151
|
+
runTests().catch(err => {
|
|
152
|
+
console.error('Test run failed:', err);
|
|
153
|
+
process.exit(1);
|
|
154
|
+
});
|
|
155
|
+
//# sourceMappingURL=test_specialist_and_analyst_tiers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_specialist_and_analyst_tiers.js","sourceRoot":"","sources":["../src/test_specialist_and_analyst_tiers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_v2_2_visual_hardening.d.ts","sourceRoot":"","sources":["../src/test_v2_2_visual_hardening.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|