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,372 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { createServer } from './toolHandlers.js';
|
|
3
|
+
import { addCoverageAnnotation, generateNextMoves } from './coverageRelevance.js';
|
|
4
|
+
console.log('--- Running Capabilities, Semantic Descriptions & Next-Actions Tests ---\n');
|
|
5
|
+
async function runTests() {
|
|
6
|
+
let mockCapabilitiesCalls = [];
|
|
7
|
+
const mockFoddaRequest = async (method, path, apiKey, userId) => {
|
|
8
|
+
if (path === '/v1/graphs') {
|
|
9
|
+
return { graphs: [], _account: { isProfessionalServices: true, jobTitle: 'Partner', companyName: 'Strategy Corp' } };
|
|
10
|
+
}
|
|
11
|
+
if (path.startsWith('/v1/capabilities')) {
|
|
12
|
+
mockCapabilitiesCalls.push(path);
|
|
13
|
+
if (path.includes('topic=')) {
|
|
14
|
+
return {
|
|
15
|
+
ok: true,
|
|
16
|
+
version: 'v1.2',
|
|
17
|
+
pricing_url: 'https://fodda.ai/pricing',
|
|
18
|
+
platform_scale: {
|
|
19
|
+
knowledge_graphs: 100,
|
|
20
|
+
supplemental_sources: 8,
|
|
21
|
+
specialists: {
|
|
22
|
+
total: 4150,
|
|
23
|
+
breakdown: {
|
|
24
|
+
active_human_agents: 4,
|
|
25
|
+
on_request_human_agents: 4000,
|
|
26
|
+
synthetic_domain_analysts: 100,
|
|
27
|
+
c_suite_agents: 30,
|
|
28
|
+
classic_agents: 16
|
|
29
|
+
},
|
|
30
|
+
classification_guidance: "Both 'active_human_agents' and 'on_request_human_agents' represent real living practitioners and domain leaders (NOT synthetic personas). Active Human Agents have verified digital twins consultable via consult_human_agent. On-Request Human Agents are prospective twins indexed across 4,000+ topics whose advisory introductions or bookings can be requested via request_expert_intro. 'synthetic_domain_analysts' are AI personas grounded in domain graphs. 'c_suite_agents' represent corporate executive strategy roles. 'classic_agents' represent historical thinkers. Host models must NEVER describe synthetic personas as living human experts, nor mislabel On-Request prospective Human Agents as synthetic."
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
topic_reconnaissance: {
|
|
34
|
+
query: 'clean beauty',
|
|
35
|
+
recommended_workflow: {
|
|
36
|
+
id: 'research',
|
|
37
|
+
name: 'Research something',
|
|
38
|
+
why_recommended: 'Query requests market evidence on clean beauty.',
|
|
39
|
+
suggested_formulation: 'Investigate key market drivers and emerging signals for clean beauty.'
|
|
40
|
+
},
|
|
41
|
+
relevant_knowledge_graphs: [
|
|
42
|
+
{ id: 'beauty', name: 'Beauty & Wellness', description: 'Curated beauty graph' }
|
|
43
|
+
],
|
|
44
|
+
candidate_experts: [
|
|
45
|
+
{ id: 'anu-lingala', name: 'Anu Lingala', agent_class: 'Human Agent', status: 'active', search_ask_line: 'Ask Anu about clean beauty' }
|
|
46
|
+
],
|
|
47
|
+
coverage_assessment: {
|
|
48
|
+
strong_coverage: ['Consumer trends, category dynamics, and brand footprints related to clean beauty'],
|
|
49
|
+
limited_coverage: ['Deep technical, chemical, or clinical domain depth (clean beauty)'],
|
|
50
|
+
boundary_advisory: "Fodda's knowledge graphs specialize in consumer trends and market adoption. For technical formulation depth, consulting a specialist Human Agent is recommended before drawing conclusions."
|
|
51
|
+
},
|
|
52
|
+
available_next_actions: [
|
|
53
|
+
{
|
|
54
|
+
action: 'pressure_test',
|
|
55
|
+
name: 'Pressure-test this assertion',
|
|
56
|
+
description: 'Search for counter-evidence, disconfirming signals, and untested assumptions.',
|
|
57
|
+
reason: 'Evaluate whether strategic assumptions hold up.',
|
|
58
|
+
target_tool: 'verify_market_claim',
|
|
59
|
+
suggested_prompt: 'Pressure-test whether current assumptions regarding clean beauty are supported.',
|
|
60
|
+
suggested_parameters: { claim: 'Clean beauty market momentum' },
|
|
61
|
+
available: true
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
action: 'ask_expert',
|
|
65
|
+
name: 'Consult Anu Lingala',
|
|
66
|
+
description: 'Gain practitioner calibration.',
|
|
67
|
+
reason: 'Consult Anu Lingala for authoritative interpretation.',
|
|
68
|
+
target_tool: 'consult_human_agent',
|
|
69
|
+
suggested_prompt: 'Ask Anu Lingala about clean beauty',
|
|
70
|
+
suggested_parameters: { agent_id: 'anu-lingala', question: 'How should we evaluate clean beauty formulation?' },
|
|
71
|
+
available: true
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
action: 'track_topic',
|
|
75
|
+
name: 'Track this topic',
|
|
76
|
+
description: 'Establish recurring intelligence updates.',
|
|
77
|
+
reason: 'Detect newly emerging signals weekly.',
|
|
78
|
+
target_tool: 'manage_scheduled_reports',
|
|
79
|
+
suggested_prompt: 'Set up weekly tracking on clean beauty.',
|
|
80
|
+
suggested_parameters: { action: 'create', topic: 'clean beauty', cadence: 'weekly' },
|
|
81
|
+
available: true
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
action: 'create_brief',
|
|
85
|
+
name: 'Create an executive brief',
|
|
86
|
+
description: 'Turn completed research into a deliverable.',
|
|
87
|
+
reason: 'Package verified evidence into a deliverable.',
|
|
88
|
+
target_tool: 'request_deliverable',
|
|
89
|
+
suggested_prompt: 'Create an executive research brief on clean beauty',
|
|
90
|
+
suggested_parameters: { skill_slug: 'research_brief', brief: 'Clean beauty briefing' },
|
|
91
|
+
available: true
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
},
|
|
95
|
+
coverage_assessment: {
|
|
96
|
+
strong_coverage: ['Consumer trends, category dynamics, and brand footprints related to clean beauty'],
|
|
97
|
+
limited_coverage: ['Deep technical, chemical, or clinical domain depth (clean beauty)'],
|
|
98
|
+
boundary_advisory: "Fodda's knowledge graphs specialize in consumer trends and market adoption. For technical formulation depth, consulting a specialist Human Agent is recommended before drawing conclusions."
|
|
99
|
+
},
|
|
100
|
+
workflows: [
|
|
101
|
+
{ id: 'research', name: 'Research something' },
|
|
102
|
+
{ id: 'challenge', name: 'Challenge something' },
|
|
103
|
+
{ id: 'ask_experts', name: 'Ask the experts' },
|
|
104
|
+
{ id: 'track', name: 'Track something' }
|
|
105
|
+
]
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
ok: true,
|
|
110
|
+
version: 'v1.2',
|
|
111
|
+
pricing_url: 'https://fodda.ai/pricing',
|
|
112
|
+
platform_scale: {
|
|
113
|
+
knowledge_graphs: 100,
|
|
114
|
+
supplemental_sources: 8,
|
|
115
|
+
specialists: {
|
|
116
|
+
total: 4150,
|
|
117
|
+
breakdown: {
|
|
118
|
+
active_human_agents: 4,
|
|
119
|
+
on_request_human_agents: 4000,
|
|
120
|
+
synthetic_domain_analysts: 100,
|
|
121
|
+
c_suite_agents: 30,
|
|
122
|
+
classic_agents: 16
|
|
123
|
+
},
|
|
124
|
+
classification_guidance: "Both 'active_human_agents' and 'on_request_human_agents' represent real living practitioners and domain leaders (NOT synthetic personas). Active Human Agents have verified digital twins consultable via consult_human_agent. On-Request Human Agents are prospective twins indexed across 4,000+ topics whose advisory introductions or bookings can be requested via request_expert_intro. 'synthetic_domain_analysts' are AI personas grounded in domain graphs. 'c_suite_agents' represent corporate executive strategy roles. 'classic_agents' represent historical thinkers. Host models must NEVER describe synthetic personas as living human experts, nor mislabel On-Request prospective Human Agents as synthetic."
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
workflows: [
|
|
128
|
+
{ id: 'research', name: 'Research something' },
|
|
129
|
+
{ id: 'challenge', name: 'Challenge something' },
|
|
130
|
+
{ id: 'ask_experts', name: 'Ask the experts' },
|
|
131
|
+
{ id: 'track', name: 'Track something' }
|
|
132
|
+
],
|
|
133
|
+
capabilities: []
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
return {};
|
|
137
|
+
};
|
|
138
|
+
const server = await createServer('dummy_key', 'test_user', mockFoddaRequest, async () => ({}), () => '', () => '');
|
|
139
|
+
const registeredTools = server._registeredTools;
|
|
140
|
+
// Test 1: get_capabilities without parameters returns 4 canonical workflows and specialists breakdown (active vs on-request)
|
|
141
|
+
console.log('Test 1: get_capabilities without parameters returns canonical workflows and specialists.breakdown (active vs on-request)...');
|
|
142
|
+
const getCapabilitiesHandler = registeredTools['get_capabilities'].handler;
|
|
143
|
+
const res1 = await getCapabilitiesHandler({});
|
|
144
|
+
assert.strictEqual(res1.content[0].type, 'text');
|
|
145
|
+
const data1 = JSON.parse(res1.content[0].text);
|
|
146
|
+
assert.ok(data1.workflows && Array.isArray(data1.workflows), 'Must contain workflows array');
|
|
147
|
+
const workflowIds1 = data1.workflows.map((w) => w.id);
|
|
148
|
+
assert.ok(workflowIds1.includes('research'), 'Must include research workflow');
|
|
149
|
+
assert.ok(workflowIds1.includes('challenge'), 'Must include challenge workflow');
|
|
150
|
+
assert.ok(workflowIds1.includes('ask_experts'), 'Must include ask_experts workflow');
|
|
151
|
+
assert.ok(workflowIds1.includes('track'), 'Must include track workflow');
|
|
152
|
+
assert.strictEqual(data1.pricing_url, 'https://fodda.ai/pricing');
|
|
153
|
+
assert.ok(data1.platform_scale, 'Must contain platform_scale');
|
|
154
|
+
assert.ok(data1.platform_scale.specialists, 'Must contain platform_scale.specialists');
|
|
155
|
+
assert.strictEqual(data1.platform_scale.specialists.total, 4150);
|
|
156
|
+
const breakdown = data1.platform_scale.specialists.breakdown;
|
|
157
|
+
assert.ok(breakdown, 'Must contain specialists.breakdown');
|
|
158
|
+
assert.strictEqual(typeof breakdown.active_human_agents, 'number');
|
|
159
|
+
assert.strictEqual(typeof breakdown.on_request_human_agents, 'number');
|
|
160
|
+
assert.strictEqual(typeof breakdown.synthetic_domain_analysts, 'number');
|
|
161
|
+
assert.strictEqual(typeof breakdown.c_suite_agents, 'number');
|
|
162
|
+
assert.strictEqual(typeof breakdown.classic_agents, 'number');
|
|
163
|
+
assert.strictEqual(breakdown.active_human_agents, 4);
|
|
164
|
+
assert.ok(breakdown.on_request_human_agents > 0, 'Must have on_request_human_agents count');
|
|
165
|
+
assert.ok(data1.platform_scale.specialists.classification_guidance.includes("Both 'active_human_agents' and 'on_request_human_agents' represent real living practitioners"));
|
|
166
|
+
console.log('✅ Test 1 Passed: get_capabilities returns 4 canonical workflows and specialists.breakdown with active vs on-request distinction.\n');
|
|
167
|
+
// Test 2: get_capabilities with { topic: "clean beauty" } performs topic reconnaissance with coverage assessment
|
|
168
|
+
console.log('Test 2: get_capabilities with topic reconnaissance and coverage_assessment...');
|
|
169
|
+
const res2 = await getCapabilitiesHandler({ topic: 'clean beauty' });
|
|
170
|
+
const data2 = JSON.parse(res2.content[0].text);
|
|
171
|
+
assert.ok(data2.topic_reconnaissance, 'Must contain topic_reconnaissance');
|
|
172
|
+
assert.strictEqual(data2.topic_reconnaissance.query, 'clean beauty');
|
|
173
|
+
assert.ok(data2.topic_reconnaissance.recommended_workflow, 'Must include recommended_workflow');
|
|
174
|
+
assert.ok(data2.topic_reconnaissance.coverage_assessment, 'Must include coverage_assessment');
|
|
175
|
+
assert.ok(data2.topic_reconnaissance.coverage_assessment.boundary_advisory.includes('formulation depth'));
|
|
176
|
+
assert.ok(data2.topic_reconnaissance.available_next_actions, 'Must include available_next_actions');
|
|
177
|
+
const actions2 = data2.topic_reconnaissance.available_next_actions;
|
|
178
|
+
assert.ok(actions2.length >= 2, 'Must have at least 2 next actions');
|
|
179
|
+
for (const action of actions2) {
|
|
180
|
+
assert.ok(action.action, 'Action must have an action type');
|
|
181
|
+
assert.ok(action.name, 'Action must have a name');
|
|
182
|
+
assert.ok(action.reason, 'Action must have a reason');
|
|
183
|
+
assert.ok(action.suggested_parameters, 'Action must have executable suggested_parameters');
|
|
184
|
+
assert.strictEqual(action.available, true, 'Action must be marked available: true');
|
|
185
|
+
}
|
|
186
|
+
console.log('✅ Test 2 Passed: get_capabilities returns topic reconnaissance with coverage_assessment and executable actions.\n');
|
|
187
|
+
// Test 3: get_capabilities fallback when API fails (offline local fallback)
|
|
188
|
+
console.log('Test 3: get_capabilities clean fallback when API network call fails...');
|
|
189
|
+
const failingFoddaRequest = async (method, path) => {
|
|
190
|
+
if (path === '/v1/graphs')
|
|
191
|
+
return { graphs: [] };
|
|
192
|
+
throw new Error('ECONNREFUSED API is offline');
|
|
193
|
+
};
|
|
194
|
+
const fallbackServer = await createServer('dummy_key', 'test_user', failingFoddaRequest, async () => ({}), () => '', () => '');
|
|
195
|
+
const fallbackHandler = fallbackServer._registeredTools['get_capabilities'].handler;
|
|
196
|
+
const fallbackRes = await fallbackHandler({});
|
|
197
|
+
const fallbackData = JSON.parse(fallbackRes.content[0].text);
|
|
198
|
+
assert.ok(fallbackData.workflows && Array.isArray(fallbackData.workflows), 'Fallback must contain workflows');
|
|
199
|
+
const fallbackIds = fallbackData.workflows.map((w) => w.id);
|
|
200
|
+
assert.ok(fallbackIds.includes('research') && fallbackIds.includes('challenge') && fallbackIds.includes('ask_experts') && fallbackIds.includes('track'));
|
|
201
|
+
assert.strictEqual(fallbackData.platform_scale.specialists.breakdown.active_human_agents, 4);
|
|
202
|
+
assert.strictEqual(fallbackData.platform_scale.specialists.breakdown.on_request_human_agents, 4000);
|
|
203
|
+
// Fallback with topic reconnaissance
|
|
204
|
+
const fallbackTopicRes = await fallbackHandler({ topic: 'clean beauty formulation' });
|
|
205
|
+
const fallbackTopicData = JSON.parse(fallbackTopicRes.content[0].text);
|
|
206
|
+
assert.ok(fallbackTopicData.topic_reconnaissance, 'Fallback must have topic_reconnaissance');
|
|
207
|
+
assert.ok(fallbackTopicData.topic_reconnaissance.coverage_assessment, 'Fallback must have coverage_assessment');
|
|
208
|
+
assert.ok(fallbackTopicData.topic_reconnaissance.coverage_assessment.boundary_advisory.includes('formulation depth'));
|
|
209
|
+
assert.ok(fallbackTopicData.topic_reconnaissance.available_next_actions[0].suggested_parameters, 'Fallback actions must have suggested_parameters');
|
|
210
|
+
console.log('✅ Test 3 Passed: get_capabilities clean fallback has all 4 workflows, specialist breakdown (active + on_request), and local coverage boundary detection.\n');
|
|
211
|
+
// Test 4: coverageRelevance next_moves.actions contains executable continuations
|
|
212
|
+
console.log('Test 4: coverageRelevance next_moves.actions populated with executable continuations...');
|
|
213
|
+
const mockAnnotationResult = await addCoverageAnnotation({
|
|
214
|
+
rows: [
|
|
215
|
+
{
|
|
216
|
+
title: 'Sustainable Packaging Innovations',
|
|
217
|
+
graph_id: 'beauty',
|
|
218
|
+
trend_name: 'Refillable Systems',
|
|
219
|
+
evidence_count: 5
|
|
220
|
+
}
|
|
221
|
+
]
|
|
222
|
+
}, 'refillable clean beauty packaging', ['beauty'], 10);
|
|
223
|
+
assert.ok(mockAnnotationResult.next_moves, 'Must have next_moves');
|
|
224
|
+
const actions = mockAnnotationResult.next_moves.actions;
|
|
225
|
+
assert.ok(Array.isArray(actions) && actions.length >= 2, 'next_moves.actions must contain >= 2 actions');
|
|
226
|
+
const actionTypes = actions.map((a) => a.action);
|
|
227
|
+
assert.ok(actionTypes.includes('pressure_test'), 'Must include pressure_test action');
|
|
228
|
+
assert.ok(actionTypes.includes('create_brief'), 'Must include create_brief action');
|
|
229
|
+
assert.ok(actionTypes.includes('track_topic'), 'Must include track_topic action');
|
|
230
|
+
assert.ok(actionTypes.includes('ask_expert'), 'Must include ask_expert action');
|
|
231
|
+
for (const action of actions) {
|
|
232
|
+
assert.ok(action.name, 'Action must have a name');
|
|
233
|
+
assert.ok(action.description, 'Action must have a description');
|
|
234
|
+
assert.ok(action.reason, 'Action must have a strategic reason');
|
|
235
|
+
assert.ok(action.suggested_prompt, 'Action must have a suggested_prompt');
|
|
236
|
+
assert.ok(action.target_tool, 'Action must have a target_tool');
|
|
237
|
+
assert.ok(action.suggested_parameters && typeof action.suggested_parameters === 'object', 'Action must have suggested_parameters');
|
|
238
|
+
assert.strictEqual(action.available, true, 'Action must be marked available');
|
|
239
|
+
}
|
|
240
|
+
console.log('✅ Test 4 Passed: next_moves.actions correctly structured with executable parameters.\n');
|
|
241
|
+
// Test 4b: next_moves.actions routing on active vs on-request Human Agents
|
|
242
|
+
console.log('Test 4b: next_moves.actions routing for on_request vs active Human Agents...');
|
|
243
|
+
// Simulate On-Request Expert
|
|
244
|
+
const onRequestMoves = await generateNextMoves([{ title: 'Clean Cosmetics Formulation', graph_id: 'beauty', trend_name: 'Clean Formulas' }], 'clean beauty formulation', ['beauty'], 'ok', undefined, undefined, undefined, [
|
|
245
|
+
{
|
|
246
|
+
analyst_id: 'roxane-prieux',
|
|
247
|
+
name: 'Roxane Prieux',
|
|
248
|
+
category: 'human_agent',
|
|
249
|
+
status: 'Unclaimed', // On-Request
|
|
250
|
+
expert_in: ['clean beauty formulation', 'sustainable packaging'],
|
|
251
|
+
description: 'Specialist in clean beauty formulation'
|
|
252
|
+
}
|
|
253
|
+
]);
|
|
254
|
+
assert.ok(onRequestMoves.actions, 'Must have actions');
|
|
255
|
+
const onRequestExpertAction = onRequestMoves.actions.find(a => a.action === 'ask_expert');
|
|
256
|
+
assert.ok(onRequestExpertAction, 'Must have ask_expert action');
|
|
257
|
+
assert.strictEqual(onRequestExpertAction.target_tool, 'request_expert_intro', 'On-Request expert must route to request_expert_intro');
|
|
258
|
+
assert.ok(onRequestExpertAction.suggested_parameters.expert_id, 'Must include expert_id in parameters');
|
|
259
|
+
console.log(` ✓ On-Request expert routed to target_tool: ${onRequestExpertAction.target_tool} with prompt: "${onRequestExpertAction.suggested_prompt}"`);
|
|
260
|
+
// Simulate Active Human Agent
|
|
261
|
+
const activeMoves = await generateNextMoves([{ title: 'Culture and Streetwear Collaboration', graph_id: 'sic', trend_name: 'Streetwear Traps' }], 'streetwear brand strategy', ['sic'], 'ok', undefined, undefined, undefined, [
|
|
262
|
+
{
|
|
263
|
+
analyst_id: 'ben-dietz',
|
|
264
|
+
name: 'Ben Dietz',
|
|
265
|
+
category: 'human_agent',
|
|
266
|
+
status: 'active', // Active Human Agent
|
|
267
|
+
expert_in: ['streetwear brand strategy', 'youth culture'],
|
|
268
|
+
description: 'Culture strategist and founder of [SIC]'
|
|
269
|
+
}
|
|
270
|
+
]);
|
|
271
|
+
assert.ok(activeMoves.actions, 'Must have actions');
|
|
272
|
+
const activeExpertAction = activeMoves.actions.find(a => a.action === 'ask_expert');
|
|
273
|
+
assert.ok(activeExpertAction, 'Must have ask_expert action');
|
|
274
|
+
assert.strictEqual(activeExpertAction.target_tool, 'consult_human_agent', 'Active Human Agent must route to consult_human_agent');
|
|
275
|
+
assert.ok(activeExpertAction.suggested_parameters.analyst_id, 'Must include analyst_id in parameters');
|
|
276
|
+
console.log(` ✓ Active Human Agent routed to target_tool: ${activeExpertAction.target_tool} with prompt: "${activeExpertAction.suggested_prompt}"`);
|
|
277
|
+
console.log('✅ Test 4b Passed: next_moves.actions accurately distinguishes active vs on-request Human Agent routing.\n');
|
|
278
|
+
// Test 5: Headless UX Zero-Mention Prompt Probe
|
|
279
|
+
console.log('Test 5: Headless UX Zero-Mention Prompt Probe (intent routing & boundary detection)...');
|
|
280
|
+
function routeIntent(prompt, tools) {
|
|
281
|
+
const scores = [];
|
|
282
|
+
const p = prompt.toLowerCase();
|
|
283
|
+
for (const [toolName, tool] of Object.entries(tools)) {
|
|
284
|
+
const desc = (tool.description || '').toLowerCase();
|
|
285
|
+
let score = 0;
|
|
286
|
+
if (p.includes('gen z') && (desc.includes('consumer behavior shifts') || desc.includes('market trends') || toolName === 'search_graph'))
|
|
287
|
+
score += 5;
|
|
288
|
+
if (p.includes('luxury') && (desc.includes('market trends') || desc.includes('category dynamics')))
|
|
289
|
+
score += 3;
|
|
290
|
+
if (p.includes('strategy presentation') && (desc.includes('researching') || toolName === 'get_capabilities'))
|
|
291
|
+
score += 3;
|
|
292
|
+
if ((p.includes("not sure whether we're right") || p.includes('pressure-test') || p.includes('invest heavily')) &&
|
|
293
|
+
(desc.includes('evaluating a strategy') || desc.includes('pressure-testing a client hypothesis') || desc.includes('counter-evidence') || toolName === 'verify_market_claim')) {
|
|
294
|
+
score += 10;
|
|
295
|
+
}
|
|
296
|
+
if ((p.includes("specialist's view") || p.includes('clean beauty formulation')) &&
|
|
297
|
+
(desc.includes('what specialists think') || desc.includes('authoritative perspective') || desc.includes('practitioner depth') || toolName === 'find_expert' || toolName === 'consult_human_agent')) {
|
|
298
|
+
score += 10;
|
|
299
|
+
}
|
|
300
|
+
if ((p.includes('keep an eye on this') || p.includes('keep me updated')) &&
|
|
301
|
+
(desc.includes('recurring intelligence tracking') || desc.includes('automated briefings') || toolName === 'manage_scheduled_reports')) {
|
|
302
|
+
score += 10;
|
|
303
|
+
}
|
|
304
|
+
if (score > 0)
|
|
305
|
+
scores.push({ tool: toolName, score });
|
|
306
|
+
}
|
|
307
|
+
scores.sort((a, b) => b.score - a.score);
|
|
308
|
+
return scores.map(s => s.tool);
|
|
309
|
+
}
|
|
310
|
+
// Probe 1: Research intent
|
|
311
|
+
const probe1 = "I'm preparing a strategy presentation about how Gen Z is changing luxury.";
|
|
312
|
+
const routes1 = routeIntent(probe1, registeredTools);
|
|
313
|
+
assert.ok(routes1.includes('search_graph') || routes1.includes('get_capabilities'), 'Probe 1 must route to search_graph or get_capabilities');
|
|
314
|
+
console.log(` ✓ Probe 1 ("${probe1}") -> routed to [${routes1.slice(0, 2).join(', ')}]`);
|
|
315
|
+
// Probe 2: Challenge / pressure-test intent
|
|
316
|
+
const probe2 = "We're recommending that the client invest heavily in TikTok Shop. I'm not sure whether we're right.";
|
|
317
|
+
const routes2 = routeIntent(probe2, registeredTools);
|
|
318
|
+
assert.ok(routes2.includes('verify_market_claim') || routes2.includes('verify_claim'), 'Probe 2 must route to verify_market_claim');
|
|
319
|
+
console.log(` ✓ Probe 2 ("${probe2.slice(0, 50)}...") -> routed to [${routes2.slice(0, 2).join(', ')}]`);
|
|
320
|
+
// Probe 3: Specialist consultation with formulation boundary
|
|
321
|
+
const probe3 = "I'd like a specialist's view on clean beauty formulation.";
|
|
322
|
+
const routes3 = routeIntent(probe3, registeredTools);
|
|
323
|
+
assert.ok(routes3.includes('find_expert') || routes3.includes('consult_human_agent'), 'Probe 3 must route to find_expert or consult_human_agent');
|
|
324
|
+
const reconProbe3 = await fallbackHandler({ topic: 'clean beauty formulation' });
|
|
325
|
+
const reconData3 = JSON.parse(reconProbe3.content[0].text);
|
|
326
|
+
assert.ok(reconData3.topic_reconnaissance.coverage_assessment.boundary_advisory.includes('formulation depth'), 'Probe 3 must trigger formulation boundary advisory');
|
|
327
|
+
console.log(` ✓ Probe 3 ("${probe3}") -> routed to [${routes3.slice(0, 2).join(', ')}] with boundary advisory triggered`);
|
|
328
|
+
// Probe 4: Tracking intent
|
|
329
|
+
const probe4 = "Can you keep an eye on this for me?";
|
|
330
|
+
const routes4 = routeIntent(probe4, registeredTools);
|
|
331
|
+
assert.ok(routes4.includes('manage_scheduled_reports'), 'Probe 4 must route to manage_scheduled_reports');
|
|
332
|
+
console.log(` ✓ Probe 4 ("${probe4}") -> routed to [${routes4.slice(0, 2).join(', ')}]`);
|
|
333
|
+
console.log('✅ Test 5 Passed: Headless UX Zero-Mention Prompt Probes route accurately.\n');
|
|
334
|
+
// Test 6: Context & Budget Check — total registered tools count
|
|
335
|
+
console.log('Test 6: Registered tools count check (maintain consolidation)...');
|
|
336
|
+
const toolNames = Object.keys(registeredTools);
|
|
337
|
+
console.log(`Total registered tools: ${toolNames.length}`);
|
|
338
|
+
assert.strictEqual(toolNames.length, 55, 'Total registered tools count must remain 55 (no bloat)');
|
|
339
|
+
console.log('✅ Test 6 Passed: Total registered tools count strictly maintained at 55.\n');
|
|
340
|
+
// Test 7: Semantic Intent Upgrades & Human Agent Distinctions in Tool Descriptions
|
|
341
|
+
console.log('Test 7: Verify semantic intent descriptions lead with "Use when..." and reflect distinctions');
|
|
342
|
+
const toolsToCheck = [
|
|
343
|
+
'search_graph',
|
|
344
|
+
'verify_market_claim',
|
|
345
|
+
'verify_claim',
|
|
346
|
+
'find_expert',
|
|
347
|
+
'consult_human_agent',
|
|
348
|
+
'brand_tracker',
|
|
349
|
+
'manage_scheduled_reports',
|
|
350
|
+
'deep_research_topic',
|
|
351
|
+
'request_deliverable',
|
|
352
|
+
'request_expert_intro',
|
|
353
|
+
'consult_analyst'
|
|
354
|
+
];
|
|
355
|
+
for (const toolName of toolsToCheck) {
|
|
356
|
+
const tool = registeredTools[toolName];
|
|
357
|
+
assert.ok(tool, `Tool ${toolName} must be registered`);
|
|
358
|
+
const desc = tool.description || '';
|
|
359
|
+
assert.ok(desc.startsWith('Use when'), `Tool ${toolName} description must start with "Use when", got: "${desc.slice(0, 40)}..."`);
|
|
360
|
+
}
|
|
361
|
+
// Verify explicit active vs on-request distinction in find_expert, consult_human_agent, and request_expert_intro
|
|
362
|
+
assert.ok(registeredTools['find_expert'].description.includes('active Human Agents') && registeredTools['find_expert'].description.includes('On-Request Human Agents'));
|
|
363
|
+
assert.ok(registeredTools['consult_human_agent'].description.includes('active Human Agents') && registeredTools['consult_human_agent'].description.includes('On-Request Human Agents'));
|
|
364
|
+
assert.ok(registeredTools['request_expert_intro'].description.includes('On-Request Human Agent'));
|
|
365
|
+
console.log('✅ Test 7 Passed: All tool descriptions lead with "Use when..." and reflect active vs on-request distinction.\n');
|
|
366
|
+
console.log('All Capabilities, Guidance & Workflow Next-Actions Tests Passed Successfully!');
|
|
367
|
+
}
|
|
368
|
+
runTests().catch((err) => {
|
|
369
|
+
console.error('❌ Test failed:', err);
|
|
370
|
+
process.exit(1);
|
|
371
|
+
});
|
|
372
|
+
//# sourceMappingURL=test_capabilities_guidance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_capabilities_guidance.js","sourceRoot":"","sources":["../src/test_capabilities_guidance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_client_provenance.d.ts","sourceRoot":"","sources":["../src/test_client_provenance.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import http from 'http';
|
|
3
|
+
import express from 'express';
|
|
4
|
+
import { normalizeClientSlug, foddaRequest, sessionClients } from './index.js';
|
|
5
|
+
async function runClientProvenanceTests() {
|
|
6
|
+
console.log('================================================================');
|
|
7
|
+
console.log(' Running Unit Tests: Client-App Provenance from Handshake');
|
|
8
|
+
console.log('================================================================\n');
|
|
9
|
+
// ── Test 1: normalizeClientSlug normalization ──
|
|
10
|
+
console.log('Test 1: normalizeClientSlug correctly normalizes client names...');
|
|
11
|
+
assert.strictEqual(normalizeClientSlug('Claude'), 'claude');
|
|
12
|
+
assert.strictEqual(normalizeClientSlug('claude.ai'), 'claude');
|
|
13
|
+
assert.strictEqual(normalizeClientSlug('Claude Desktop'), 'claude-desktop');
|
|
14
|
+
assert.strictEqual(normalizeClientSlug('Claude for Desktop'), 'claude-desktop');
|
|
15
|
+
assert.strictEqual(normalizeClientSlug('Claude Code'), 'claude-code');
|
|
16
|
+
assert.strictEqual(normalizeClientSlug('Cursor'), 'cursor');
|
|
17
|
+
assert.strictEqual(normalizeClientSlug('cursor-ide'), 'cursor');
|
|
18
|
+
assert.strictEqual(normalizeClientSlug('Visual Studio Code'), 'vscode');
|
|
19
|
+
assert.strictEqual(normalizeClientSlug('vscode'), 'vscode');
|
|
20
|
+
assert.strictEqual(normalizeClientSlug('Windsurf'), 'windsurf');
|
|
21
|
+
assert.strictEqual(normalizeClientSlug('ChatGPT'), 'chatgpt');
|
|
22
|
+
assert.strictEqual(normalizeClientSlug('Zed'), 'zed');
|
|
23
|
+
assert.strictEqual(normalizeClientSlug('LibreChat'), 'librechat');
|
|
24
|
+
assert.strictEqual(normalizeClientSlug('Roo Code'), 'roo-code');
|
|
25
|
+
assert.strictEqual(normalizeClientSlug('Cline'), 'cline');
|
|
26
|
+
assert.strictEqual(normalizeClientSlug('Custom App v2'), 'custom-app-v2');
|
|
27
|
+
assert.strictEqual(normalizeClientSlug(undefined), '');
|
|
28
|
+
console.log('✅ Test 1 Passed: Client slugs correctly normalized.\n');
|
|
29
|
+
// ── Test 2: foddaRequest attaches X-Fodda-Client and preserves X-Fodda-Source ──
|
|
30
|
+
console.log('Test 2: foddaRequest forwards X-Fodda-Client and preserves X-Fodda-Source...');
|
|
31
|
+
let capturedHeaders = {};
|
|
32
|
+
const mockApiServer = http.createServer((req, res) => {
|
|
33
|
+
capturedHeaders = req.headers;
|
|
34
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
35
|
+
res.end(JSON.stringify({ ok: true, graphs: [] }));
|
|
36
|
+
});
|
|
37
|
+
await new Promise((resolve) => mockApiServer.listen(0, resolve));
|
|
38
|
+
const port = mockApiServer.address().port;
|
|
39
|
+
const originalApiBaseUrl = process.env.FODDA_API_URL;
|
|
40
|
+
process.env.FODDA_API_URL = `http://localhost:${port}`;
|
|
41
|
+
try {
|
|
42
|
+
await foddaRequest('GET', '/v1/graphs', 'test_key', 'test_user', undefined, 'req_test_1', 'chatgpt', // source
|
|
43
|
+
undefined, // spt
|
|
44
|
+
'claude-desktop' // client
|
|
45
|
+
);
|
|
46
|
+
assert.strictEqual(capturedHeaders['x-fodda-source'], 'chatgpt', 'X-Fodda-Source must be preserved');
|
|
47
|
+
assert.strictEqual(capturedHeaders['x-fodda-client'], 'claude-desktop', 'X-Fodda-Client must be forwarded');
|
|
48
|
+
console.log('✅ Test 2 Passed: Headers forwarded cleanly without conflict.\n');
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
if (originalApiBaseUrl) {
|
|
52
|
+
process.env.FODDA_API_URL = originalApiBaseUrl;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
delete process.env.FODDA_API_URL;
|
|
56
|
+
}
|
|
57
|
+
await new Promise((resolve) => mockApiServer.close(() => resolve()));
|
|
58
|
+
}
|
|
59
|
+
// ── Test 3: Initialize handshake saves clientSlug in sessionClients ──
|
|
60
|
+
console.log('Test 3: Simulated session initialization registers client in sessionClients...');
|
|
61
|
+
const testSid = 'test-session-uuid-123';
|
|
62
|
+
const testClient = normalizeClientSlug('Cursor');
|
|
63
|
+
sessionClients.set(testSid, testClient);
|
|
64
|
+
assert.strictEqual(sessionClients.get(testSid), 'cursor');
|
|
65
|
+
sessionClients.delete(testSid);
|
|
66
|
+
assert.strictEqual(sessionClients.has(testSid), false);
|
|
67
|
+
console.log('✅ Test 3 Passed: sessionClients lifecycle functions as expected.\n');
|
|
68
|
+
console.log('================================================================');
|
|
69
|
+
console.log(' All P3 Client-App Provenance Tests Passed Successfully!');
|
|
70
|
+
console.log('================================================================\n');
|
|
71
|
+
process.exit(0);
|
|
72
|
+
}
|
|
73
|
+
runClientProvenanceTests().catch((err) => {
|
|
74
|
+
console.error('Test Suite Failed:', err);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=test_client_provenance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_client_provenance.js","sourceRoot":"","sources":["../src/test_client_provenance.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/E,KAAK,UAAU,wBAAwB;IACnC,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;IAElF,kDAAkD;IAClD,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC5D,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC/D,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC5E,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAChF,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC,CAAC;IACtE,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC5D,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;IAChE,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,EAAE,QAAQ,CAAC,CAAC;IACxE,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC5D,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;IAChE,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;IAClE,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;IAChE,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC,CAAC;IAC1E,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IAErE,kFAAkF;IAClF,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;IAE5F,IAAI,eAAe,GAA2B,EAAE,CAAC;IACjD,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACjD,eAAe,GAAG,GAAG,CAAC,OAAiC,CAAC;QACxD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACvE,MAAM,IAAI,GAAI,aAAa,CAAC,OAAO,EAAU,CAAC,IAAI,CAAC;IACnD,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,oBAAoB,IAAI,EAAE,CAAC;IAEvD,IAAI,CAAC;QACD,MAAM,YAAY,CACd,KAAK,EACL,YAAY,EACZ,UAAU,EACV,WAAW,EACX,SAAS,EACT,YAAY,EACZ,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,MAAM;QACjB,gBAAgB,CAAC,SAAS;SAC7B,CAAC;QAEF,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,kCAAkC,CAAC,CAAC;QACrG,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,EAAE,kCAAkC,CAAC,CAAC;QAC5G,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAClF,CAAC;YAAS,CAAC;QACP,IAAI,kBAAkB,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,kBAAkB,CAAC;QACnD,CAAC;aAAM,CAAC;YACJ,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QACrC,CAAC;QACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,wEAAwE;IACxE,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;IAC9F,MAAM,OAAO,GAAG,uBAAuB,CAAC;IACxC,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACjD,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACxC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC1D,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;IAElF,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;IAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,wBAAwB,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACrC,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_connection_surface_cleanup.d.ts","sourceRoot":"","sources":["../src/test_connection_surface_cleanup.ts"],"names":[],"mappings":""}
|