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 @@
|
|
|
1
|
+
{"version":3,"file":"test_earnings_activity_scope.js","sourceRoot":"","sources":["../src/test_earnings_activity_scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_earnings_divergence_live.d.ts","sourceRoot":"","sources":["../src/test_earnings_divergence_live.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,eAAe,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verification Test: get_earnings_divergence Reconnection & Query Pricing Registration
|
|
3
|
+
*/
|
|
4
|
+
import 'dotenv/config';
|
|
5
|
+
import fs from 'fs';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import crypto from 'crypto';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
import { initPricingCache, getToolCostSummary } from './pricingCache.js';
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = path.dirname(__filename);
|
|
12
|
+
let passed = 0;
|
|
13
|
+
let failed = 0;
|
|
14
|
+
function assert(condition, msg) {
|
|
15
|
+
if (condition) {
|
|
16
|
+
console.log(` ✅ ${msg}`);
|
|
17
|
+
passed++;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
console.error(` ❌ ${msg}`);
|
|
21
|
+
failed++;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async function run() {
|
|
25
|
+
console.log('\n=== 1. Pricing Cache & Account Verification ===');
|
|
26
|
+
await initPricingCache();
|
|
27
|
+
const costs = getToolCostSummary();
|
|
28
|
+
const divCost = costs.find(c => c.tool === 'get_earnings_divergence');
|
|
29
|
+
assert(divCost !== undefined, 'get_earnings_divergence is present in getToolCostSummary()');
|
|
30
|
+
if (divCost) {
|
|
31
|
+
assert(divCost.tool === 'get_earnings_divergence', 'tool matches get_earnings_divergence');
|
|
32
|
+
assert(divCost.name === 'Earnings Divergence & Deflection', 'name matches "Earnings Divergence & Deflection"');
|
|
33
|
+
assert(divCost.apiCalls === 40, 'apiCalls charged is 40 ($20.00 equivalent)');
|
|
34
|
+
}
|
|
35
|
+
console.log('\n=== 2. Tools Manifest & Code Invariants ===');
|
|
36
|
+
const manifestPath = path.resolve(__dirname, '../tools-manifest.json');
|
|
37
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
|
|
38
|
+
const manifestTool = manifest.tools.find((t) => t.name === 'get_earnings_divergence');
|
|
39
|
+
assert(manifestTool !== undefined, 'get_earnings_divergence found in tools-manifest.json');
|
|
40
|
+
if (manifestTool) {
|
|
41
|
+
assert(manifestTool.bills_as === 'earnings_divergence', 'bills_as is "earnings_divergence"');
|
|
42
|
+
assert(manifestTool.description.includes('$20 per query'), 'description includes published price "$20 per query"');
|
|
43
|
+
assert(manifestTool.description.includes('causal rationales'), 'description mentions "causal rationales"');
|
|
44
|
+
assert(manifestTool.description.includes('When degraded=true, clustering fell back to literal string matching rather than semantic convergence'), 'description documents degraded=true behavior');
|
|
45
|
+
assert(!manifestTool.description.includes('tokens') && !manifestTool.description.includes('via SPT'), 'description has NO token/SPT phrasing');
|
|
46
|
+
assert(!manifestTool.description.includes('(legacy-thematic)'), 'legacy-thematic text was removed');
|
|
47
|
+
}
|
|
48
|
+
const srcPath = fs.existsSync(path.resolve(__dirname, 'toolHandlers.ts'))
|
|
49
|
+
? path.resolve(__dirname, 'toolHandlers.ts')
|
|
50
|
+
: path.resolve(__dirname, '../src/toolHandlers.ts');
|
|
51
|
+
const toolHandlersSrc = fs.readFileSync(srcPath, 'utf8');
|
|
52
|
+
assert(!toolHandlersSrc.includes('/v1/supplemental/earnings/divergence'), 'legacy /v1/supplemental/earnings/divergence route eliminated');
|
|
53
|
+
assert(toolHandlersSrc.includes("sptGuard('earnings_divergence')"), 'sptGuard uses earnings_divergence');
|
|
54
|
+
assert(toolHandlersSrc.includes("queryTypeCode: 'earnings_divergence'"), 'settleOrWithhold uses queryTypeCode earnings_divergence');
|
|
55
|
+
assert(toolHandlersSrc.includes('DEGRADED CLUSTERING: The underlying AI clustering service fell back'), 'degraded warning banner defined in toolHandlers.ts');
|
|
56
|
+
console.log('\n=== 3. Degraded Detection & Warning Transformation Unit Check ===');
|
|
57
|
+
const warningExpected = "DEGRADED CLUSTERING: The underlying AI clustering service fell back to literal string matching. Groupings reflect identical question theme phrasing across calls, NOT semantic convergence on a shared operational or economic mechanism.";
|
|
58
|
+
function applyDegradedCheck(raw) {
|
|
59
|
+
let data = { ...raw };
|
|
60
|
+
const isDegraded = Boolean(data?.degraded || data?.data?.degraded || data?.model_used === 'literal-fallback' || data?.data?.model_used === 'literal-fallback');
|
|
61
|
+
if (isDegraded && data && typeof data === 'object') {
|
|
62
|
+
data = {
|
|
63
|
+
warning: warningExpected,
|
|
64
|
+
...data,
|
|
65
|
+
};
|
|
66
|
+
data.warning = warningExpected;
|
|
67
|
+
}
|
|
68
|
+
return data;
|
|
69
|
+
}
|
|
70
|
+
// Case 1: Degraded flag true at top level
|
|
71
|
+
const degradedMock1 = applyDegradedCheck({ degraded: true, model_used: 'literal-fallback', themes: [] });
|
|
72
|
+
assert(degradedMock1.warning === warningExpected, 'Top-level degraded: true injects warning banner');
|
|
73
|
+
assert(Object.keys(degradedMock1)[0] === 'warning', 'Warning banner is prepended as first key');
|
|
74
|
+
// Case 2: Degraded flag in nested data
|
|
75
|
+
const degradedMock2 = applyDegradedCheck({ data: { degraded: true, themes: [] } });
|
|
76
|
+
assert(degradedMock2.warning === warningExpected, 'Nested data.degraded: true injects warning banner');
|
|
77
|
+
// Case 3: Clean semantic response
|
|
78
|
+
const cleanMock = applyDegradedCheck({ degraded: false, model_used: 'gemini-2.5-flash', themes: [] });
|
|
79
|
+
assert(cleanMock.warning === undefined, 'Clean response emits no warning');
|
|
80
|
+
console.log('\n=== 4. Live Truth-Layer Endpoint Probes ===');
|
|
81
|
+
const apiKey = process.env.FODDA_API_KEY;
|
|
82
|
+
const apiUrl = process.env.FODDA_API_URL || 'https://api.fodda.ai';
|
|
83
|
+
const secret = process.env.FODDA_MCP_SECRET;
|
|
84
|
+
if (!apiKey || !secret) {
|
|
85
|
+
console.warn(' ⚠️ Skipping live endpoint probe: FODDA_API_KEY or FODDA_MCP_SECRET not set');
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
async function probe(queryParams, label) {
|
|
89
|
+
const reqPath = `/v1/earnings/divergence${queryParams ? '?' + queryParams : ''}`;
|
|
90
|
+
const timestamp = Date.now().toString();
|
|
91
|
+
const payload = timestamp + '.' + reqPath;
|
|
92
|
+
const signature = crypto.createHmac('sha256', secret).update(payload).digest('hex');
|
|
93
|
+
const headers = {
|
|
94
|
+
'X-Fodda-Timestamp': timestamp,
|
|
95
|
+
'X-Fodda-Billing': 'mcp-orchestrated',
|
|
96
|
+
'X-API-Key': apiKey,
|
|
97
|
+
'X-Fodda-Signature': signature,
|
|
98
|
+
'Content-Type': 'application/json',
|
|
99
|
+
};
|
|
100
|
+
const res = await fetch(`${apiUrl}${reqPath}`, { headers });
|
|
101
|
+
assert(res.status === 200, `${label}: HTTP 200 returned`);
|
|
102
|
+
const body = await res.json();
|
|
103
|
+
return body;
|
|
104
|
+
}
|
|
105
|
+
// Probe A: Default Live Probe with {}
|
|
106
|
+
console.log('\n [Probe A: Default {}]');
|
|
107
|
+
const defaultData = await probe('min_companies=2&limit=5', 'Default probe');
|
|
108
|
+
assert(defaultData && defaultData.data, 'Default probe returns data envelope');
|
|
109
|
+
assert(Array.isArray(defaultData.data?.themes), 'defaultData.data.themes is an array');
|
|
110
|
+
assert(defaultData.data?.themes?.length > 0, 'defaultData.data.themes count > 0');
|
|
111
|
+
assert(defaultData.data?.tickers_scanned >= 500, `scans covered companies (${defaultData.data?.tickers_scanned} scanned)`);
|
|
112
|
+
const firstTheme = defaultData.data?.themes?.[0];
|
|
113
|
+
if (firstTheme) {
|
|
114
|
+
assert(typeof firstTheme.question_theme === 'string', 'theme has question_theme');
|
|
115
|
+
assert(typeof firstTheme.company_count === 'number' && firstTheme.company_count >= 2, `company_count >= 2 (${firstTheme.company_count})`);
|
|
116
|
+
assert(Array.isArray(firstTheme.companies) && firstTheme.companies.length >= 2, 'companies list has >= 2 tickers');
|
|
117
|
+
assert(typeof firstTheme.directness_breakdown === 'object', 'directness_breakdown object present');
|
|
118
|
+
}
|
|
119
|
+
// Probe B: Sector probe with { sector: 'retail' }
|
|
120
|
+
console.log('\n [Probe B: Sector "retail"]');
|
|
121
|
+
const retailData = await probe('sector=retail&min_companies=1&limit=5', 'Sector retail probe');
|
|
122
|
+
assert(retailData && retailData.data, 'Sector retail probe returns data envelope');
|
|
123
|
+
assert(Array.isArray(retailData.data?.themes), 'retailData.data.themes is an array');
|
|
124
|
+
assert(retailData.data?.themes?.length > 0, `retail themes count > 0 (${retailData.data?.themes?.length})`);
|
|
125
|
+
}
|
|
126
|
+
console.log(`\nResults: ${passed} passed, ${failed} failed`);
|
|
127
|
+
if (failed > 0) {
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
run().catch(err => {
|
|
132
|
+
console.error('Test execution failed:', err);
|
|
133
|
+
process.exit(1);
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=test_earnings_divergence_live.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_earnings_divergence_live.js","sourceRoot":"","sources":["../src/test_earnings_divergence_live.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_earnings_hygiene_and_binding.d.ts","sourceRoot":"","sources":["../src/test_earnings_hygiene_and_binding.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verification Test: Earnings Tool Parameter Binding, Payload Hygiene & Inline Corroboration
|
|
3
|
+
*/
|
|
4
|
+
import { formatEarningsCorroboration } from './toolHandlers.js';
|
|
5
|
+
import fs from 'fs';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = path.dirname(__filename);
|
|
10
|
+
let passed = 0;
|
|
11
|
+
let failed = 0;
|
|
12
|
+
function assert(condition, msg) {
|
|
13
|
+
if (condition) {
|
|
14
|
+
console.log(` ✅ ${msg}`);
|
|
15
|
+
passed++;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
console.error(` ❌ ${msg}`);
|
|
19
|
+
failed++;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
console.log('\n--- 1. Testing formatEarningsCorroboration ---');
|
|
23
|
+
// Case A: Single item with speaker, title, ticker, quote, period
|
|
24
|
+
const itemA = {
|
|
25
|
+
speaker: 'Fabrizio Freda',
|
|
26
|
+
title: 'CEO',
|
|
27
|
+
ticker: 'EL',
|
|
28
|
+
quote: 'Prestige beauty showed resilience across European travel retail.',
|
|
29
|
+
period: 'Q2-2026',
|
|
30
|
+
transcript_url: 'https://seekingalpha.com/article/el-q2-2026'
|
|
31
|
+
};
|
|
32
|
+
const resA = formatEarningsCorroboration(itemA);
|
|
33
|
+
assert(resA !== null, 'formatEarningsCorroboration returns a non-null string for itemA');
|
|
34
|
+
assert(resA.includes('[Earnings Call Corroboration]: Fabrizio Freda (CEO) [EL]: "Prestige beauty showed resilience across European travel retail." (Q2-2026)'), 'Format matches executive quote attribution standard');
|
|
35
|
+
// Case B: Item with theme and ticker (no quote)
|
|
36
|
+
const itemB = {
|
|
37
|
+
ticker: 'ULTA',
|
|
38
|
+
theme: 'Mass vs Prestige margin shifts',
|
|
39
|
+
period: 'Q1-2026'
|
|
40
|
+
};
|
|
41
|
+
const resB = formatEarningsCorroboration(itemB);
|
|
42
|
+
assert(resB !== null, 'formatEarningsCorroboration returns non-null for theme item');
|
|
43
|
+
assert(resB.includes('[Earnings Call Corroboration]: [ULTA] Mass vs Prestige margin shifts (Q1-2026)'), 'Format matches analyst theme standard');
|
|
44
|
+
// Case C: Array of multiple items
|
|
45
|
+
const resMulti = formatEarningsCorroboration([itemA, itemB]);
|
|
46
|
+
assert(resMulti !== null && resMulti.includes('\n'), 'Multi-item corroboration joins with newline');
|
|
47
|
+
assert(resMulti.includes('Fabrizio Freda') && resMulti.includes('ULTA'), 'Multi-item includes all entries');
|
|
48
|
+
// Case D: Fallbacks and edge cases
|
|
49
|
+
assert(formatEarningsCorroboration(null) === null, 'null returns null');
|
|
50
|
+
assert(formatEarningsCorroboration([]) === null, 'empty array returns null');
|
|
51
|
+
assert(formatEarningsCorroboration('Direct quote string') === '[Earnings Call Corroboration]: Direct quote string', 'Plain string supported');
|
|
52
|
+
console.log('\n--- 2. Testing URLSearchParams Binding in get_validated_trends ---');
|
|
53
|
+
const params = new URLSearchParams();
|
|
54
|
+
const ticker = 'EL';
|
|
55
|
+
const sector = 'beauty';
|
|
56
|
+
const search = 'travel retail';
|
|
57
|
+
if (ticker)
|
|
58
|
+
params.set('ticker', ticker);
|
|
59
|
+
if (sector)
|
|
60
|
+
params.set('sector', sector);
|
|
61
|
+
if (search) {
|
|
62
|
+
params.set('search', search);
|
|
63
|
+
params.set('query', search);
|
|
64
|
+
}
|
|
65
|
+
assert(params.get('search') === 'travel retail', 'params contains search');
|
|
66
|
+
assert(params.get('query') === 'travel retail', 'params contains query for API binding compatibility');
|
|
67
|
+
assert(params.get('ticker') === 'EL', 'params contains ticker');
|
|
68
|
+
assert(params.get('sector') === 'beauty', 'params contains sector');
|
|
69
|
+
console.log('\n--- 3. Testing Payload Hygiene (Visual Recipe & Speaker Note Stripping) ---');
|
|
70
|
+
const srcPath = fs.existsSync(path.resolve(__dirname, 'toolHandlers.ts'))
|
|
71
|
+
? path.resolve(__dirname, 'toolHandlers.ts')
|
|
72
|
+
: path.resolve(__dirname, '../src/toolHandlers.ts');
|
|
73
|
+
const toolHandlersSrc = fs.readFileSync(srcPath, 'utf8');
|
|
74
|
+
// Assert FODDA_HOUSE_VISUAL_RECIPE_V2_2 is not in get_validated_trends return
|
|
75
|
+
const getValTrendsMatch = toolHandlersSrc.match(/server\.tool\(\s*'get_validated_trends'[\s\S]*?async \(\{[\s\S]*?\}\) => \{([\s\S]*?)\n \);/);
|
|
76
|
+
assert(Boolean(getValTrendsMatch && getValTrendsMatch[1]), 'Found get_validated_trends handler in toolHandlers.ts');
|
|
77
|
+
if (getValTrendsMatch && getValTrendsMatch[1]) {
|
|
78
|
+
const handlerBody = getValTrendsMatch[1];
|
|
79
|
+
assert(!handlerBody.includes('FODDA_HOUSE_VISUAL_RECIPE_V2_2'), 'get_validated_trends does NOT return FODDA_HOUSE_VISUAL_RECIPE_V2_2');
|
|
80
|
+
assert(handlerBody.includes("params.set('query', search)"), 'get_validated_trends binds query param');
|
|
81
|
+
}
|
|
82
|
+
// Assert SPEAKER NOTE is not pushed into prose parts in consult handlers
|
|
83
|
+
assert(!toolHandlersSrc.includes("parts.push(`--- SPEAKER NOTE:"), 'No parts.push of SPEAKER NOTE into prose in toolHandlers.ts');
|
|
84
|
+
assert(toolHandlersSrc.includes('...(result.speaker_note ? { speaker_note: result.speaker_note } : {})'), 'speaker_note is exposed as structured field in consult returns');
|
|
85
|
+
assert(toolHandlersSrc.includes('...(result.billing ? { billing: result.billing } : {})'), 'billing block is passed through in consult returns');
|
|
86
|
+
assert(toolHandlersSrc.includes('...(result.usage ? { usage: result.usage } : {})'), 'usage block is passed through in consult returns');
|
|
87
|
+
console.log('\n--- 4. Testing tools-manifest.json Integrity ---');
|
|
88
|
+
const manifestRaw = fs.readFileSync(path.resolve(__dirname, '../tools-manifest.json'), 'utf8');
|
|
89
|
+
const manifest = JSON.parse(manifestRaw);
|
|
90
|
+
const valTool = manifest.tools.find((t) => t.name === 'get_validated_trends');
|
|
91
|
+
assert(Boolean(valTool), 'get_validated_trends exists in tools-manifest.json');
|
|
92
|
+
assert(valTool.bills_as === 'earnings_intelligence', 'get_validated_trends bills_as is "earnings_intelligence"');
|
|
93
|
+
assert(valTool.category === 'Financial', 'get_validated_trends category is "Financial"');
|
|
94
|
+
assert(manifest.billable === 23, 'Billable tools count is 23');
|
|
95
|
+
// Verify cost silence guard
|
|
96
|
+
const violations = manifest.tools.filter((t) => /Price:\s*\$|\$\s?\d/i.test(t.description));
|
|
97
|
+
assert(violations.length === 0, `All tool descriptions in manifest are cost-silent (violations: ${violations.length})`);
|
|
98
|
+
console.log(`\n========================================`);
|
|
99
|
+
console.log(`Results: ${passed} passed, ${failed} failed`);
|
|
100
|
+
console.log(`========================================\n`);
|
|
101
|
+
if (failed > 0) {
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=test_earnings_hygiene_and_binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_earnings_hygiene_and_binding.js","sourceRoot":"","sources":["../src/test_earnings_hygiene_and_binding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_exec_quotes_render.d.ts","sourceRoot":"","sources":["../src/test_exec_quotes_render.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
console.log("Running Executive Quotes rendering verification test...");
|
|
3
|
+
// Test the classification and formatting logic mirroring toolHandlers.ts
|
|
4
|
+
function classifyTier(s, rawSources = []) {
|
|
5
|
+
if (typeof s === 'string') {
|
|
6
|
+
if (s.includes('/experts/'))
|
|
7
|
+
return 'web';
|
|
8
|
+
if (s.includes('fodda.ai/graphs/') || s.includes('graph_id='))
|
|
9
|
+
return 'graph';
|
|
10
|
+
return rawSources.includes(s) ? 'graph' : 'web';
|
|
11
|
+
}
|
|
12
|
+
const origin = (s.origin || '').toLowerCase();
|
|
13
|
+
const type = (s.type || s.kind || '').toLowerCase();
|
|
14
|
+
const url = (s.url || '').toLowerCase();
|
|
15
|
+
if (type === 'exec_quote' || origin === 'exec_quote')
|
|
16
|
+
return 'exec_quote';
|
|
17
|
+
if (origin === 'prose' || origin === 'profile')
|
|
18
|
+
return 'web';
|
|
19
|
+
if (type === 'own_graph' || type === 'library_graph' || type === 'graph' || origin === 'graph')
|
|
20
|
+
return 'graph';
|
|
21
|
+
if (type === 'supplemental' || type === 'financial' || type === 'sec')
|
|
22
|
+
return 'supplemental';
|
|
23
|
+
if (type === 'web' || origin === 'web' || url.includes('/experts/'))
|
|
24
|
+
return 'web';
|
|
25
|
+
if (rawSources.includes(s) && !url.includes('/experts/'))
|
|
26
|
+
return 'graph';
|
|
27
|
+
if (url)
|
|
28
|
+
return 'web';
|
|
29
|
+
return 'graph';
|
|
30
|
+
}
|
|
31
|
+
function renderSources(sourcesUsed) {
|
|
32
|
+
const formatLine = (s) => {
|
|
33
|
+
if (typeof s === 'string')
|
|
34
|
+
return `- ${s}`;
|
|
35
|
+
const name = s.title || s.label || s.name || s.id || s.slug || 'Source';
|
|
36
|
+
return s.url ? `- ${name}: ${s.url}` : `- ${name}`;
|
|
37
|
+
};
|
|
38
|
+
const execQuoteSources = sourcesUsed.filter((s) => classifyTier(s) === 'exec_quote');
|
|
39
|
+
const graphSources = sourcesUsed.filter((s) => classifyTier(s) === 'graph');
|
|
40
|
+
const suppSources = sourcesUsed.filter((s) => classifyTier(s) === 'supplemental');
|
|
41
|
+
const webSources = sourcesUsed.filter((s) => classifyTier(s) === 'web');
|
|
42
|
+
const sourceSections = ['--- SOURCES USED ---'];
|
|
43
|
+
if (graphSources.length > 0) {
|
|
44
|
+
sourceSections.push(`[Graph Sources]\n${graphSources.map(formatLine).join('\n')}`);
|
|
45
|
+
}
|
|
46
|
+
if (execQuoteSources.length > 0) {
|
|
47
|
+
sourceSections.push(`[Executive Quotes]\n${execQuoteSources.map(formatLine).join('\n')}`);
|
|
48
|
+
}
|
|
49
|
+
if (suppSources.length > 0) {
|
|
50
|
+
sourceSections.push(`[Supplemental Data]\n${suppSources.map(formatLine).join('\n')}`);
|
|
51
|
+
}
|
|
52
|
+
if (webSources.length > 0) {
|
|
53
|
+
sourceSections.push(`[Web Sources]\n${webSources.map(formatLine).join('\n')}`);
|
|
54
|
+
}
|
|
55
|
+
return sourceSections.join('\n\n');
|
|
56
|
+
}
|
|
57
|
+
// 1. Classification tests
|
|
58
|
+
assert.strictEqual(classifyTier({ type: 'exec_quote', title: 'CEO quote on Q3 earnings' }), 'exec_quote');
|
|
59
|
+
assert.strictEqual(classifyTier({ origin: 'exec_quote', name: 'Quote' }), 'exec_quote');
|
|
60
|
+
assert.strictEqual(classifyTier({ type: 'own_graph', name: 'Strategy Graph' }), 'graph');
|
|
61
|
+
assert.strictEqual(classifyTier({ type: 'supplemental', name: 'SEC 10-K' }), 'supplemental');
|
|
62
|
+
assert.strictEqual(classifyTier({ type: 'web', name: 'Article', url: 'https://example.com' }), 'web');
|
|
63
|
+
console.log("✅ PASS: classifyTier correctly classifies all 4 tiers (graph, exec_quote, supplemental, web)");
|
|
64
|
+
// 2. Ordering test
|
|
65
|
+
const mockSources = [
|
|
66
|
+
{ type: 'web', title: 'TechCrunch Article', url: 'https://techcrunch.com/sample' },
|
|
67
|
+
{ type: 'supplemental', title: 'Q2 2026 Earnings Table' },
|
|
68
|
+
{ type: 'exec_quote', title: 'Satya Nadella on AI Agents (Ignite 2026)' },
|
|
69
|
+
{ type: 'graph', title: 'Enterprise AI Strategy Graph' }
|
|
70
|
+
];
|
|
71
|
+
const rendered = renderSources(mockSources);
|
|
72
|
+
const graphIdx = rendered.indexOf('[Graph Sources]');
|
|
73
|
+
const execIdx = rendered.indexOf('[Executive Quotes]');
|
|
74
|
+
const suppIdx = rendered.indexOf('[Supplemental Data]');
|
|
75
|
+
const webIdx = rendered.indexOf('[Web Sources]');
|
|
76
|
+
assert.ok(graphIdx !== -1, 'Graph Sources missing');
|
|
77
|
+
assert.ok(execIdx !== -1, 'Executive Quotes missing');
|
|
78
|
+
assert.ok(suppIdx !== -1, 'Supplemental Data missing');
|
|
79
|
+
assert.ok(webIdx !== -1, 'Web Sources missing');
|
|
80
|
+
assert.ok(graphIdx < execIdx, '[Graph Sources] must appear before [Executive Quotes]');
|
|
81
|
+
assert.ok(execIdx < suppIdx, '[Executive Quotes] must appear before [Supplemental Data]');
|
|
82
|
+
assert.ok(suppIdx < webIdx, '[Supplemental Data] must appear before [Web Sources]');
|
|
83
|
+
console.log("✅ PASS: Section ordering strictly follows [Graph Sources] -> [Executive Quotes] -> [Supplemental Data] -> [Web Sources]");
|
|
84
|
+
console.log("\nRendered preview:\n" + rendered);
|
|
85
|
+
console.log("\n🎉 All Executive Quotes rendering tests passed successfully!");
|
|
86
|
+
//# sourceMappingURL=test_exec_quotes_render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_exec_quotes_render.js","sourceRoot":"","sources":["../src/test_exec_quotes_render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_expert_intro.d.ts","sourceRoot":"","sources":["../src/test_expert_intro.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { getAnalysts, initCatalogCache } from './catalogCache.js';
|
|
2
|
+
import { findCandidateExperts } from './coverageRelevance.js';
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = path.dirname(__filename);
|
|
8
|
+
async function runTests() {
|
|
9
|
+
console.log('=== Running Expert Intro & Consultation Tests ===\n');
|
|
10
|
+
let passed = 0;
|
|
11
|
+
let total = 0;
|
|
12
|
+
function assert(condition, msg) {
|
|
13
|
+
total++;
|
|
14
|
+
if (condition) {
|
|
15
|
+
console.log(`✅ [PASS] ${msg}`);
|
|
16
|
+
passed++;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
console.error(`❌ [FAIL] ${msg}`);
|
|
20
|
+
process.exitCode = 1;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// 1. Catalog & Candidate Expert Matching
|
|
24
|
+
await initCatalogCache();
|
|
25
|
+
const analysts = getAnalysts();
|
|
26
|
+
assert(analysts.length > 0, `Catalog analysts loaded: ${analysts.length} analysts found`);
|
|
27
|
+
const peterQuery = 'How could I book a call with Peter?';
|
|
28
|
+
const peterCandidates = findCandidateExperts(peterQuery, { limit: 3 });
|
|
29
|
+
const topPeter = peterCandidates[0];
|
|
30
|
+
assert(Boolean(topPeter && (topPeter.display_name.toLowerCase().includes('peter') || topPeter.analyst_id.includes('peter'))), `findCandidateExperts correctly identifies Peter Abraham for "${peterQuery}" -> Matched: ${topPeter?.display_name} (${topPeter?.analyst_id})`);
|
|
31
|
+
const jamesQuery = 'How can I hire James for some consulting?';
|
|
32
|
+
const jamesCandidates = findCandidateExperts(jamesQuery, { limit: 3 });
|
|
33
|
+
const topJames = jamesCandidates[0];
|
|
34
|
+
assert(Boolean(topJames && (topJames.display_name.toLowerCase().includes('james') || topJames.analyst_id.includes('james'))), `findCandidateExperts correctly identifies James Colistra for "${jamesQuery}" -> Matched: ${topJames?.display_name} (${topJames?.analyst_id})`);
|
|
35
|
+
// 2. System Prompt Verification
|
|
36
|
+
const systemPromptPath = fs.existsSync(path.resolve(__dirname, 'systemPrompt.ts'))
|
|
37
|
+
? path.resolve(__dirname, 'systemPrompt.ts')
|
|
38
|
+
: path.resolve(__dirname, '../src/systemPrompt.ts');
|
|
39
|
+
const systemPromptContent = fs.readFileSync(systemPromptPath, 'utf8');
|
|
40
|
+
assert(!systemPromptContent.includes("State clearly that the expert isn't taking calls"), "System prompt does NOT contain legacy refusal 'isn't taking calls'");
|
|
41
|
+
assert(systemPromptContent.includes("doesn't maintain a direct public calendar"), "System prompt contains concierge phrasing: 'doesn't maintain a direct public calendar'");
|
|
42
|
+
assert(systemPromptContent.includes("request_expert_intro"), "System prompt references request_expert_intro tool");
|
|
43
|
+
// 3. Tools Manifest Verification
|
|
44
|
+
const manifestPath = path.resolve(__dirname, '../tools-manifest.json');
|
|
45
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
|
|
46
|
+
const introTool = manifest.tools.find((t) => t.name === 'request_expert_intro');
|
|
47
|
+
assert(Boolean(introTool), "request_expert_intro is registered in tools-manifest.json");
|
|
48
|
+
assert(introTool?.bills_as === 'free', "request_expert_intro is marked free (inquiry lead capture)");
|
|
49
|
+
assert(introTool?.category === 'Expert', "request_expert_intro is categorized under 'Expert'");
|
|
50
|
+
assert(introTool?.profiles?.includes('expert-consult') && introTool?.profiles?.includes('copilot'), "request_expert_intro is included in expert-consult and copilot profiles");
|
|
51
|
+
console.log(`\nTests Completed: ${passed}/${total} passed.`);
|
|
52
|
+
}
|
|
53
|
+
runTests().catch(err => {
|
|
54
|
+
console.error('Test suite failed:', err);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=test_expert_intro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_expert_intro.js","sourceRoot":"","sources":["../src/test_expert_intro.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comprehensive verification for the Expert Layer updates:
|
|
3
|
+
* 1. cleanDisplayName sanitization (retiring '(Classic Digital Twin)', '(Digital Twin)', etc.)
|
|
4
|
+
* 2. findCandidateExperts domain vs modifier overlap, blind spots, self-rec guards, honest empty
|
|
5
|
+
* 3. find_expert MCP tool registration, responses, and candidate formatting
|
|
6
|
+
* 4. consult_analyst & consult_human_agent deep parameter acceptance and forwarding
|
|
7
|
+
*
|
|
8
|
+
* Run: npm run build && node dist/test_expert_layer.js
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=test_expert_layer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_expert_layer.d.ts","sourceRoot":"","sources":["../src/test_expert_layer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|