fodda-mcp 1.38.0 → 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 -91
- 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 +278 -83
- package/dist/brandTemplate.js.map +1 -1
- package/dist/catalogCache.d.ts +39 -0
- package/dist/catalogCache.d.ts.map +1 -1
- package/dist/catalogCache.js +293 -22
- package/dist/catalogCache.js.map +1 -1
- package/dist/coverageRelevance.d.ts +251 -0
- package/dist/coverageRelevance.d.ts.map +1 -0
- package/dist/coverageRelevance.js +1857 -0
- package/dist/coverageRelevance.js.map +1 -0
- 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 +442 -29
- 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 +411 -106
- package/dist/index.js.map +1 -1
- package/dist/pricingCache.d.ts.map +1 -1
- package/dist/pricingCache.js +55 -3
- 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 +2 -2
- package/dist/services/notifications.js +3 -3
- package/dist/services/notifications.js.map +1 -1
- package/dist/sessionTracker.d.ts +42 -3
- package/dist/sessionTracker.d.ts.map +1 -1
- package/dist/sessionTracker.js +261 -14
- 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 +153 -81
- 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.d.ts +2 -0
- package/dist/test_book_a_call_live.d.ts.map +1 -0
- package/dist/test_book_a_call_live.js +161 -0
- package/dist/test_book_a_call_live.js.map +1 -0
- package/dist/test_brand_intelligence_endpoint.js +2 -2
- 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.d.ts +12 -0
- package/dist/test_coverage_relevance.d.ts.map +1 -0
- package/dist/test_coverage_relevance.js +162 -0
- package/dist/test_coverage_relevance.js.map +1 -0
- 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.d.ts +2 -0
- package/dist/test_dcr_and_legacy_deprecation.d.ts.map +1 -0
- package/dist/test_dcr_and_legacy_deprecation.js +143 -0
- package/dist/test_dcr_and_legacy_deprecation.js.map +1 -0
- 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_financial_snapshot_render.d.ts +2 -0
- package/dist/test_financial_snapshot_render.d.ts.map +1 -0
- package/dist/test_financial_snapshot_render.js +167 -0
- package/dist/test_financial_snapshot_render.js.map +1 -0
- package/dist/test_gap_alert.d.ts +12 -0
- package/dist/test_gap_alert.d.ts.map +1 -0
- package/dist/test_gap_alert.js +51 -0
- package/dist/test_gap_alert.js.map +1 -0
- 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.d.ts +2 -0
- package/dist/test_next_moves.d.ts.map +1 -0
- package/dist/test_next_moves.js +714 -0
- package/dist/test_next_moves.js.map +1 -0
- package/dist/test_next_moves_transcripts.d.ts +2 -0
- package/dist/test_next_moves_transcripts.d.ts.map +1 -0
- package/dist/test_next_moves_transcripts.js +495 -0
- package/dist/test_next_moves_transcripts.js.map +1 -0
- 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_session_next_moves_telemetry.d.ts +2 -0
- package/dist/test_session_next_moves_telemetry.d.ts.map +1 -0
- package/dist/test_session_next_moves_telemetry.js +100 -0
- package/dist/test_session_next_moves_telemetry.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 +4290 -711
- package/dist/toolHandlers.js.map +1 -1
- package/dist/tools.d.ts +22 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +29 -4
- package/dist/tools.js.map +1 -1
- package/dist/verify_tools_endpoint.js +19 -5
- 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 +3 -31
- package/dist/debug_tools.d.ts +0 -2
- package/dist/debug_tools.d.ts.map +0 -1
- package/dist/debug_tools.js +0 -19
- package/dist/debug_tools.js.map +0 -1
- package/dist/inspect_list_graphs.d.ts +0 -2
- package/dist/inspect_list_graphs.d.ts.map +0 -1
- package/dist/inspect_list_graphs.js +0 -25
- package/dist/inspect_list_graphs.js.map +0 -1
- package/dist/scratch_test.d.ts.map +0 -1
- package/dist/scripts/simulate_gemini.d.ts +0 -2
- package/dist/scripts/simulate_gemini.d.ts.map +0 -1
- package/dist/scripts/simulate_gemini.js +0 -100
- package/dist/scripts/simulate_gemini.js.map +0 -1
- package/dist/scripts/verify_registry.d.ts +0 -2
- package/dist/scripts/verify_registry.d.ts.map +0 -1
- package/dist/scripts/verify_registry.js +0 -77
- package/dist/scripts/verify_registry.js.map +0 -1
- package/dist/src/index.d.ts +0 -2
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -332
- package/dist/src/index.js.map +0 -1
- package/dist/src/tools.d.ts +0 -12
- package/dist/src/tools.d.ts.map +0 -1
- package/dist/src/tools.js +0 -104
- package/dist/src/tools.js.map +0 -1
- package/dist/src/types.d.ts +0 -44
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -2
- package/dist/src/types.js.map +0 -1
- package/dist/src/verify.d.ts +0 -2
- package/dist/src/verify.d.ts.map +0 -1
- package/dist/src/verify.js +0 -47
- package/dist/src/verify.js.map +0 -1
- package/dist/src/verify_hmac.d.ts +0 -2
- package/dist/src/verify_hmac.d.ts.map +0 -1
- package/dist/src/verify_hmac.js +0 -106
- package/dist/src/verify_hmac.js.map +0 -1
- package/dist/src/verify_tools_endpoint.d.ts +0 -2
- package/dist/src/verify_tools_endpoint.d.ts.map +0 -1
- package/dist/src/verify_tools_endpoint.js +0 -40
- package/dist/src/verify_tools_endpoint.js.map +0 -1
- package/dist/test-waverunner-response.d.ts +0 -2
- package/dist/test-waverunner-response.d.ts.map +0 -1
- package/dist/test-waverunner-response.js +0 -20
- package/dist/test-waverunner-response.js.map +0 -1
- package/dist/test_coverage_r2.d.ts +0 -2
- package/dist/test_coverage_r2.d.ts.map +0 -1
- package/dist/test_coverage_scratch.d.ts +0 -2
- package/dist/test_coverage_scratch.d.ts.map +0 -1
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verification Test: verify_market_claim & get_intelligence_dossier MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Verifies:
|
|
5
|
+
* 1. Pricing cache registration and getToolCostSummary()
|
|
6
|
+
* 2. tools-manifest.json entries and Cost Silence compliance
|
|
7
|
+
* 3. Live call to POST /v1/verify/claim with "Casual golf venues are losing momentum"
|
|
8
|
+
* - Asserts verdict is REFUTED_BY_EVIDENCE
|
|
9
|
+
* - Asserts contradictory evidence flags Off Golf / Mulligan / capital funding
|
|
10
|
+
* - Asserts 5 Anti-Hallucination Kill Gates evaluation structure
|
|
11
|
+
* 4. Live call to POST /v1/intelligence/dossier with "functional soda prebiotic growth US sales"
|
|
12
|
+
* - Asserts evidence items carry valid URLs
|
|
13
|
+
* - Asserts statistics have units
|
|
14
|
+
* - Asserts 4-beat PSFK executive briefing structure when include_editorial is true
|
|
15
|
+
*/
|
|
16
|
+
import 'dotenv/config';
|
|
17
|
+
import fs from 'fs';
|
|
18
|
+
import path from 'path';
|
|
19
|
+
import axios from 'axios';
|
|
20
|
+
import crypto from 'crypto';
|
|
21
|
+
import { fileURLToPath } from 'url';
|
|
22
|
+
import { initPricingCache, getToolCostSummary, getQueryPrice } from './pricingCache.js';
|
|
23
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
24
|
+
const __dirname = path.dirname(__filename);
|
|
25
|
+
let passed = 0;
|
|
26
|
+
let failed = 0;
|
|
27
|
+
function assert(condition, msg) {
|
|
28
|
+
if (condition) {
|
|
29
|
+
console.log(` ✅ ${msg}`);
|
|
30
|
+
passed++;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
console.error(` ❌ ${msg}`);
|
|
34
|
+
failed++;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function callApi(method, endpoint, body) {
|
|
38
|
+
const secret = process.env.FODDA_MCP_SECRET;
|
|
39
|
+
const baseUrl = process.env.FODDA_API_URL || 'https://api.fodda.ai';
|
|
40
|
+
const timestamp = Date.now().toString();
|
|
41
|
+
const payload = method === 'POST' ? `${timestamp}.${JSON.stringify(body ?? {})}` : `${timestamp}.${endpoint}`;
|
|
42
|
+
const signature = secret ? crypto.createHmac('sha256', secret).update(payload).digest('hex') : '';
|
|
43
|
+
const headers = {
|
|
44
|
+
'Content-Type': 'application/json',
|
|
45
|
+
'X-Fodda-Timestamp': timestamp,
|
|
46
|
+
'X-Fodda-Signature': signature,
|
|
47
|
+
'X-Fodda-Billing': 'mcp-orchestrated',
|
|
48
|
+
'X-API-Key': process.env.FODDA_API_KEY || 'sk_live_abcdef',
|
|
49
|
+
};
|
|
50
|
+
const res = await axios({
|
|
51
|
+
method,
|
|
52
|
+
url: `${baseUrl}${endpoint}`,
|
|
53
|
+
data: body,
|
|
54
|
+
headers,
|
|
55
|
+
timeout: 90000,
|
|
56
|
+
});
|
|
57
|
+
return res.data;
|
|
58
|
+
}
|
|
59
|
+
async function run() {
|
|
60
|
+
console.log('\n=== 1. Pricing Cache & Cost Summary ===');
|
|
61
|
+
await initPricingCache();
|
|
62
|
+
const costs = getToolCostSummary();
|
|
63
|
+
const claimTool = costs.find(c => c.tool === 'verify_market_claim');
|
|
64
|
+
assert(claimTool !== undefined, 'verify_market_claim is registered in pricing cache');
|
|
65
|
+
if (claimTool) {
|
|
66
|
+
assert(claimTool.apiCalls === 1, 'verify_market_claim is billed as 1 call ($0.50 equivalent)');
|
|
67
|
+
}
|
|
68
|
+
const dossierTool = costs.find(c => c.tool === 'get_intelligence_dossier');
|
|
69
|
+
assert(dossierTool !== undefined, 'get_intelligence_dossier is registered in pricing cache');
|
|
70
|
+
if (dossierTool) {
|
|
71
|
+
assert(dossierTool.apiCalls === 1, 'get_intelligence_dossier is billed as 1 call ($0.50 equivalent)');
|
|
72
|
+
}
|
|
73
|
+
console.log('\n=== 2. Tools Manifest & Cost Silence Guards ===');
|
|
74
|
+
const manifestPath = path.resolve(__dirname, '../tools-manifest.json');
|
|
75
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
|
|
76
|
+
const mVerify = manifest.tools.find((t) => t.name === 'verify_market_claim');
|
|
77
|
+
assert(mVerify !== undefined, 'verify_market_claim exists in tools-manifest.json');
|
|
78
|
+
if (mVerify) {
|
|
79
|
+
assert(mVerify.bills_as === 'topic_research', 'verify_market_claim bills_as is "topic_research"');
|
|
80
|
+
assert(mVerify.description.length > 0, 'verify_market_claim description is populated');
|
|
81
|
+
assert(!/\b(?:tokens?|via SPT)\b/i.test(mVerify.description), 'verify_market_claim description has NO token/SPT phrasing');
|
|
82
|
+
}
|
|
83
|
+
const mDossier = manifest.tools.find((t) => t.name === 'get_intelligence_dossier');
|
|
84
|
+
assert(mDossier !== undefined, 'get_intelligence_dossier exists in tools-manifest.json');
|
|
85
|
+
if (mDossier) {
|
|
86
|
+
assert(mDossier.bills_as === 'topic_research', 'get_intelligence_dossier bills_as is "topic_research"');
|
|
87
|
+
assert(mDossier.category === 'Intelligence', 'get_intelligence_dossier category is "Intelligence"');
|
|
88
|
+
assert(mDossier.description.includes('$0.50'), 'get_intelligence_dossier description includes "$0.50"');
|
|
89
|
+
assert(!/\b(?:tokens?|via SPT)\b/i.test(mDossier.description), 'get_intelligence_dossier description has NO token/SPT phrasing');
|
|
90
|
+
}
|
|
91
|
+
console.log('\n=== 3. Live verify_market_claim Verification ("Casual golf venues are losing momentum") ===');
|
|
92
|
+
try {
|
|
93
|
+
const claimResult = await callApi('POST', '/v1/verify/claim', {
|
|
94
|
+
claim: 'Casual golf venues are losing momentum',
|
|
95
|
+
context: 'golf entertainment venues Topgolf Off Golf',
|
|
96
|
+
sector: 'sports',
|
|
97
|
+
strict_gates: true,
|
|
98
|
+
});
|
|
99
|
+
assert(claimResult.ok === true, 'Claim verification returned ok: true');
|
|
100
|
+
assert(claimResult.verdict === 'REFUTED_BY_EVIDENCE', `Verdict is REFUTED_BY_EVIDENCE (got: ${claimResult.verdict})`);
|
|
101
|
+
assert(claimResult.verified === false, 'Claim verified flag is false');
|
|
102
|
+
assert(Boolean(claimResult.kill_reason), `Kill reason is populated: "${claimResult.kill_reason}"`);
|
|
103
|
+
const killReasonLower = (claimResult.kill_reason || '').toLowerCase();
|
|
104
|
+
const critiqueLower = (claimResult.adversarial_critique || '').toLowerCase();
|
|
105
|
+
const contraTitles = (claimResult.contradictory_evidence || []).map((e) => (e.title || '').toLowerCase()).join(' ');
|
|
106
|
+
const flagsExpansion = killReasonLower.includes('expansion') || contraTitles.includes('off golf') || contraTitles.includes('mulligan') || critiqueLower.includes('off golf') || critiqueLower.includes('mulligan');
|
|
107
|
+
assert(flagsExpansion, 'Contradictory evidence or critique correctly flags Off Golf/Mulligan funding or category expansion');
|
|
108
|
+
assert(Boolean(claimResult.gates), 'Gates object is present');
|
|
109
|
+
assert(claimResult.gates?.adversarial_counter_thesis !== undefined, 'Gate 1 (Adversarial Counter-Thesis) evaluated');
|
|
110
|
+
assert(claimResult.gates?.multi_source_corroboration !== undefined, 'Gate 2 (Multi-Source Corroboration) evaluated');
|
|
111
|
+
assert(claimResult.gates?.numeric_spine !== undefined, 'Gate 3 (Numeric Spine) evaluated');
|
|
112
|
+
assert(claimResult.gates?.entity_verification !== undefined, 'Gate 4 (Entity Verification) evaluated');
|
|
113
|
+
assert(claimResult.gates?.supporting_commentary !== undefined, 'Gate 5 (Supporting Commentary) evaluated');
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
assert(false, `verify_market_claim API call failed: ${err.response?.data?.message || err.message}`);
|
|
117
|
+
}
|
|
118
|
+
console.log('\n=== 4. Live get_intelligence_dossier Verification ("functional soda prebiotic growth US sales") ===');
|
|
119
|
+
try {
|
|
120
|
+
const dossierResult = await callApi('POST', '/v1/intelligence/dossier', {
|
|
121
|
+
topic: 'functional soda prebiotic growth US sales',
|
|
122
|
+
sector: 'food',
|
|
123
|
+
include_editorial: true,
|
|
124
|
+
});
|
|
125
|
+
assert(dossierResult.ok === true, 'Dossier query returned ok: true');
|
|
126
|
+
assert(Boolean(dossierResult.dossier), 'Dossier object is present');
|
|
127
|
+
const evidence = dossierResult.dossier?.evidence_items || [];
|
|
128
|
+
assert(evidence.length > 0, `Evidence items returned (${evidence.length} items)`);
|
|
129
|
+
const hasLiveUrls = evidence.some((e) => (e.url || e.source_url) && /^https?:\/\//i.test(e.url || e.source_url));
|
|
130
|
+
assert(hasLiveUrls, 'Evidence items carry live citable URLs');
|
|
131
|
+
const stats = dossierResult.dossier?.statistics || [];
|
|
132
|
+
assert(Array.isArray(stats), 'Macro / quantitative statistics array returned');
|
|
133
|
+
if (stats.length > 0) {
|
|
134
|
+
const statsHaveUnits = stats.some((s) => Boolean(s.unit || s.metric));
|
|
135
|
+
assert(statsHaveUnits, 'Statistics items specify units and indicator names');
|
|
136
|
+
}
|
|
137
|
+
assert(Boolean(dossierResult.dossier?.adversarial_critique), 'Adversarial critique / contrarian stress-test is populated');
|
|
138
|
+
assert(Boolean(dossierResult.editorial), 'Editorial output is generated when include_editorial is true');
|
|
139
|
+
if (dossierResult.editorial) {
|
|
140
|
+
const ed = dossierResult.editorial;
|
|
141
|
+
assert(Boolean(ed.headline), `Editorial headline: "${ed.headline}"`);
|
|
142
|
+
assert(Boolean(ed.sections?.structured?.market_lede), 'Beat 1 (Market Lede) is structured');
|
|
143
|
+
assert(Boolean(ed.sections?.structured?.core_debate), 'Beat 2 (Core Tension / Debate) is structured');
|
|
144
|
+
assert(Boolean(ed.sections?.structured?.competing_playbooks), 'Beat 3 (Competing Playbooks) is structured');
|
|
145
|
+
assert(Boolean(ed.sections?.structured?.strategic_stakes), 'Beat 4 (Strategic Stakes) is structured');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
assert(false, `get_intelligence_dossier API call failed: ${err.response?.data?.message || err.message}`);
|
|
150
|
+
}
|
|
151
|
+
console.log(`\n========================================`);
|
|
152
|
+
console.log(`Test Results: ${passed} passed, ${failed} failed`);
|
|
153
|
+
console.log(`========================================\n`);
|
|
154
|
+
if (failed > 0) {
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
run().catch((err) => {
|
|
159
|
+
console.error('Fatal error during test run:', err);
|
|
160
|
+
process.exit(1);
|
|
161
|
+
});
|
|
162
|
+
//# sourceMappingURL=test_intelligence_and_verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_intelligence_and_verifier.js","sourceRoot":"","sources":["../src/test_intelligence_and_verifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Automated Verification Suite for Brief #5: MCP Client Slim Endpoints
|
|
3
|
+
* Tests:
|
|
4
|
+
* 1. get_my_account points to /v1/account with fallback to /v1/graphs?view=mcp
|
|
5
|
+
* 2. Response shape and fields for get_my_account mirror existing human-safe format without SPT/token text
|
|
6
|
+
* 3. Session init and list_graphs request ?view=mcp
|
|
7
|
+
* 4. serializeGraphForList allowlist preserves routing fields (suitable_questions, price_per_query, accessible, disabled)
|
|
8
|
+
* 5. Outbound requests send Accept-Encoding: gzip and auto-decompress
|
|
9
|
+
* 6. Before/after payload size measurements
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=test_latency_mcp_brief5.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_latency_mcp_brief5.d.ts","sourceRoot":"","sources":["../src/test_latency_mcp_brief5.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Automated Verification Suite for Brief #5: MCP Client Slim Endpoints
|
|
3
|
+
* Tests:
|
|
4
|
+
* 1. get_my_account points to /v1/account with fallback to /v1/graphs?view=mcp
|
|
5
|
+
* 2. Response shape and fields for get_my_account mirror existing human-safe format without SPT/token text
|
|
6
|
+
* 3. Session init and list_graphs request ?view=mcp
|
|
7
|
+
* 4. serializeGraphForList allowlist preserves routing fields (suitable_questions, price_per_query, accessible, disabled)
|
|
8
|
+
* 5. Outbound requests send Accept-Encoding: gzip and auto-decompress
|
|
9
|
+
* 6. Before/after payload size measurements
|
|
10
|
+
*/
|
|
11
|
+
import http from 'http';
|
|
12
|
+
import axios from 'axios';
|
|
13
|
+
import { foddaRequest } from './index.js';
|
|
14
|
+
let passed = 0;
|
|
15
|
+
let failed = 0;
|
|
16
|
+
function assert(condition, msg) {
|
|
17
|
+
if (condition) {
|
|
18
|
+
console.log(`✅ PASS: ${msg}`);
|
|
19
|
+
passed++;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
console.error(`❌ FAIL: ${msg}`);
|
|
23
|
+
failed++;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function runTests() {
|
|
27
|
+
console.log('--- Brief #5 MCP Client Verification Suite ---\n');
|
|
28
|
+
// Test 1: Outbound Accept-Encoding header check
|
|
29
|
+
const headersSent = {};
|
|
30
|
+
const mockServer = http.createServer((req, res) => {
|
|
31
|
+
Object.assign(headersSent, req.headers);
|
|
32
|
+
const url = new URL(req.url || '', `http://${req.headers.host}`);
|
|
33
|
+
if (url.pathname === '/v1/account') {
|
|
34
|
+
const accountPayload = {
|
|
35
|
+
requestId: 'test-req-123',
|
|
36
|
+
version: 'v1.1',
|
|
37
|
+
_account: {
|
|
38
|
+
plan: 'Pro',
|
|
39
|
+
query_retention: 'standard',
|
|
40
|
+
tokens_remaining: 450,
|
|
41
|
+
tokens_total: 500,
|
|
42
|
+
tokens_used: 50,
|
|
43
|
+
accessible_graphs: ['retail', 'tech', 'food'],
|
|
44
|
+
profile: { name: 'Piers', company: 'PSFK', jobTitle: 'CEO' }
|
|
45
|
+
},
|
|
46
|
+
usage: {
|
|
47
|
+
plan: 'Pro',
|
|
48
|
+
calls_used: 50,
|
|
49
|
+
monthly_allowance: 500,
|
|
50
|
+
calls_remaining: 450
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
54
|
+
return res.end(JSON.stringify(accountPayload));
|
|
55
|
+
}
|
|
56
|
+
if (url.pathname === '/v1/graphs') {
|
|
57
|
+
const isMcp = url.searchParams.get('view') === 'mcp';
|
|
58
|
+
const graphsPayload = {
|
|
59
|
+
requestId: 'test-req-456',
|
|
60
|
+
graphs: [
|
|
61
|
+
{
|
|
62
|
+
graph_id: 'retail',
|
|
63
|
+
name: 'Retail Intelligence',
|
|
64
|
+
description: 'Consumer retail insights and market trends',
|
|
65
|
+
agent_prompt: 'Route retail and shopper queries here',
|
|
66
|
+
suitable_questions: ['What are grocery margins in 2026?'],
|
|
67
|
+
status: 'live',
|
|
68
|
+
graph_type: 'domain',
|
|
69
|
+
price_per_query: '$0.50',
|
|
70
|
+
accessible: true,
|
|
71
|
+
disabled: false
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
graph_id: 'tech',
|
|
75
|
+
name: 'Technology Trends',
|
|
76
|
+
description: 'Enterprise AI and software trends',
|
|
77
|
+
agent_prompt: 'Route enterprise AI questions here',
|
|
78
|
+
suitable_questions: ['How is agentic AI adopted in fintech?'],
|
|
79
|
+
status: 'live',
|
|
80
|
+
graph_type: 'domain',
|
|
81
|
+
price_per_query: '$0.50',
|
|
82
|
+
accessible: true,
|
|
83
|
+
disabled: false
|
|
84
|
+
}
|
|
85
|
+
],
|
|
86
|
+
_account: {
|
|
87
|
+
plan: 'Pro',
|
|
88
|
+
tokens_remaining: 450,
|
|
89
|
+
tokens_total: 500
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
93
|
+
return res.end(JSON.stringify(graphsPayload));
|
|
94
|
+
}
|
|
95
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
96
|
+
res.end(JSON.stringify({ error: 'NOT_FOUND' }));
|
|
97
|
+
});
|
|
98
|
+
await new Promise((resolve) => mockServer.listen(0, '127.0.0.1', () => resolve()));
|
|
99
|
+
const port = mockServer.address().port;
|
|
100
|
+
const originalApiUrl = process.env.FODDA_API_URL;
|
|
101
|
+
process.env.FODDA_API_URL = `http://127.0.0.1:${port}`;
|
|
102
|
+
try {
|
|
103
|
+
// Test 1: Outbound Accept-Encoding includes gzip
|
|
104
|
+
const accountData = await foddaRequest('GET', '/v1/account', 'test-key', 'user@example.com');
|
|
105
|
+
assert(Boolean(headersSent['accept-encoding']?.includes('gzip') || headersSent['accept-encoding']?.includes('*')), `Outbound calls send Accept-Encoding with compression support: ${headersSent['accept-encoding']}`);
|
|
106
|
+
// Test 2: GET /v1/account payload structure and size
|
|
107
|
+
assert(accountData && accountData._account?.plan === 'Pro', 'GET /v1/account returns account data');
|
|
108
|
+
const accountPayloadSize = Buffer.byteLength(JSON.stringify(accountData));
|
|
109
|
+
assert(accountPayloadSize < 2000, `GET /v1/account is lightweight (~${accountPayloadSize} bytes, target <2KB)`);
|
|
110
|
+
// Test 3: GET /v1/graphs?view=mcp returns slim routing fields
|
|
111
|
+
const graphsMcpData = await foddaRequest('GET', '/v1/graphs?view=mcp', 'test-key', 'user@example.com');
|
|
112
|
+
assert(Array.isArray(graphsMcpData?.graphs) && graphsMcpData.graphs.length === 2, 'GET /v1/graphs?view=mcp returns graph catalog');
|
|
113
|
+
const firstGraph = graphsMcpData.graphs[0];
|
|
114
|
+
assert(firstGraph.graph_id === 'retail' && firstGraph.agent_prompt != null && firstGraph.suitable_questions?.length > 0, 'GET /v1/graphs?view=mcp preserves graph_id, agent_prompt, and suitable_questions');
|
|
115
|
+
// Test 4: Verification of no SPT / token text in tool output formatting
|
|
116
|
+
const rawAccount = accountData._account;
|
|
117
|
+
const formattedStatus = {
|
|
118
|
+
plan: rawAccount.plan,
|
|
119
|
+
queryRetention: rawAccount.query_retention || 'standard',
|
|
120
|
+
api_calls_remaining: rawAccount.tokens_remaining ?? rawAccount.credits,
|
|
121
|
+
api_calls_total: rawAccount.tokens_total,
|
|
122
|
+
api_calls_used: rawAccount.tokens_used,
|
|
123
|
+
};
|
|
124
|
+
const outputJson = JSON.stringify(formattedStatus);
|
|
125
|
+
assert(!outputJson.toLowerCase().includes('token') && !outputJson.toLowerCase().includes('spt'), 'Account status contains no "token" or "spt" text');
|
|
126
|
+
assert(formattedStatus.api_calls_remaining === 450, 'Account status correctly formats balance as api_calls_remaining');
|
|
127
|
+
// Test 5: Fallback behavior if /v1/account returns 404 (e.g., during deployment rollover)
|
|
128
|
+
const mockServer404 = http.createServer((req, res) => {
|
|
129
|
+
const url = new URL(req.url || '', `http://${req.headers.host}`);
|
|
130
|
+
if (url.pathname === '/v1/account') {
|
|
131
|
+
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
132
|
+
return res.end('Cannot GET /v1/account');
|
|
133
|
+
}
|
|
134
|
+
if (url.pathname === '/v1/graphs') {
|
|
135
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
136
|
+
return res.end(JSON.stringify({
|
|
137
|
+
requestId: 'fallback-req',
|
|
138
|
+
_account: { plan: 'Pro-Fallback', tokens_remaining: 999 }
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
res.writeHead(404);
|
|
142
|
+
res.end();
|
|
143
|
+
});
|
|
144
|
+
await new Promise((resolve) => mockServer404.listen(0, '127.0.0.1', () => resolve()));
|
|
145
|
+
const port404 = mockServer404.address().port;
|
|
146
|
+
process.env.FODDA_API_URL = `http://127.0.0.1:${port404}`;
|
|
147
|
+
let fallbackData;
|
|
148
|
+
try {
|
|
149
|
+
fallbackData = await foddaRequest('GET', '/v1/account', 'test-key', 'user@example.com');
|
|
150
|
+
}
|
|
151
|
+
catch (e) {
|
|
152
|
+
if (e.response?.status === 404) {
|
|
153
|
+
fallbackData = await foddaRequest('GET', '/v1/graphs?view=mcp', 'test-key', 'user@example.com');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
assert(fallbackData?._account?.plan === 'Pro-Fallback', 'Graceful fallback to /v1/graphs?view=mcp succeeds if /v1/account returns 404');
|
|
157
|
+
mockServer404.close();
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
mockServer.close();
|
|
161
|
+
if (originalApiUrl) {
|
|
162
|
+
process.env.FODDA_API_URL = originalApiUrl;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
delete process.env.FODDA_API_URL;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Test 6: Live comparison against production api.fodda.ai
|
|
169
|
+
console.log('\n--- Live API Verification (api.fodda.ai) ---');
|
|
170
|
+
try {
|
|
171
|
+
const liveKey = '7ae90d3753d34914fa1dc6fe21396cc30d572ca61fbe5eb7029d367adf22b08e';
|
|
172
|
+
const fullGraphsRes = await axios.get('https://api.fodda.ai/v1/graphs', {
|
|
173
|
+
headers: { 'X-API-Key': liveKey }
|
|
174
|
+
});
|
|
175
|
+
const fullSize = Buffer.byteLength(JSON.stringify(fullGraphsRes.data));
|
|
176
|
+
console.log(`Live GET /v1/graphs (full) size: ${Math.round(fullSize / 1024)} KB (${fullSize} bytes)`);
|
|
177
|
+
const mcpGraphsRes = await axios.get('https://api.fodda.ai/v1/graphs?view=mcp', {
|
|
178
|
+
headers: { 'X-API-Key': liveKey }
|
|
179
|
+
});
|
|
180
|
+
const mcpSize = Buffer.byteLength(JSON.stringify(mcpGraphsRes.data));
|
|
181
|
+
console.log(`Live GET /v1/graphs?view=mcp size: ${Math.round(mcpSize / 1024)} KB (${mcpSize} bytes)`);
|
|
182
|
+
assert(mcpGraphsRes.status === 200, 'Live GET /v1/graphs?view=mcp returns 200 OK');
|
|
183
|
+
assert(Array.isArray(mcpGraphsRes.data.graphs), 'Live response contains graphs array');
|
|
184
|
+
assert(mcpGraphsRes.data.graphs.length === fullGraphsRes.data.graphs.length, `Routing parity: both endpoints return ${mcpGraphsRes.data.graphs.length} graphs`);
|
|
185
|
+
}
|
|
186
|
+
catch (e) {
|
|
187
|
+
console.warn(`Live test warning (non-fatal): ${e.message}`);
|
|
188
|
+
}
|
|
189
|
+
console.log(`\n========================================`);
|
|
190
|
+
console.log(`Tests Passed: ${passed} | Tests Failed: ${failed}`);
|
|
191
|
+
console.log(`========================================\n`);
|
|
192
|
+
if (failed > 0) {
|
|
193
|
+
process.exit(1);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
runTests().catch(err => {
|
|
197
|
+
console.error('Test suite uncaught error:', err);
|
|
198
|
+
process.exit(1);
|
|
199
|
+
});
|
|
200
|
+
//# sourceMappingURL=test_latency_mcp_brief5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_latency_mcp_brief5.js","sourceRoot":"","sources":["../src/test_latency_mcp_brief5.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test: Daily Burst Limit & Monthly Plan Limit Handling with Credit Card Capture
|
|
3
|
+
* and ChatGPT Commerce-Silence Invariant
|
|
4
|
+
*
|
|
5
|
+
* Verifies:
|
|
6
|
+
* 1. DAILY_LIMIT_EXCEEDED:
|
|
7
|
+
* - classifyAccessError classifies as 'credits'
|
|
8
|
+
* - handleAccessError and handleTrialCreditExhaustion return code DAILY_LIMIT_EXCEEDED, action SETUP_CARD, setup_url, and verbatim next_action
|
|
9
|
+
* 2. PLAN_LIMIT_EXCEEDED:
|
|
10
|
+
* - handleAccessError and handleTrialCreditExhaustion return code PLAN_LIMIT_EXCEEDED, action ADD_PAYMENT_METHOD, setup_url, overage_rate_usd, and verbatim next_action
|
|
11
|
+
* 3. CREDITS_EXHAUSTED:
|
|
12
|
+
* - returns isError: true (an actionable stop, not data)
|
|
13
|
+
* - top-up call count and price dynamically sourced from payload (no hardcoded figures)
|
|
14
|
+
* 4. TRIAL_EXHAUSTED:
|
|
15
|
+
* - returns isError: true, upgrade_url on app.fodda.ai, free Base account framing (not "top up" / not fodda.ai/account/billing)
|
|
16
|
+
* 5. ChatGPT Commerce-Silence Parity:
|
|
17
|
+
* - All 4 credit codes on ChatGPT session source return clean QUOTA_EXHAUSTED payload
|
|
18
|
+
* - Zero Stripe URLs, zero dollar amounts, zero "API calls" text, manage_url: https://app.fodda.ai/account
|
|
19
|
+
*/
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=test_limit_and_credit_card_capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_limit_and_credit_card_capture.d.ts","sourceRoot":"","sources":["../src/test_limit_and_credit_card_capture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
|