fodda-mcp 1.32.1 → 1.46.31
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 -16
- package/dist/a2aHandler.d.ts +33 -3
- package/dist/a2aHandler.d.ts.map +1 -1
- package/dist/a2aHandler.js +189 -36
- package/dist/a2aHandler.js.map +1 -1
- package/dist/agentFacts.d.ts +21 -0
- package/dist/agentFacts.d.ts.map +1 -0
- package/dist/agentFacts.js +72 -0
- package/dist/agentFacts.js.map +1 -0
- package/dist/agents/fodda-researcher/index.d.ts +6 -0
- package/dist/agents/fodda-researcher/index.d.ts.map +1 -1
- package/dist/agents/fodda-researcher/index.js +18 -0
- package/dist/agents/fodda-researcher/index.js.map +1 -1
- 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 +8 -3
- package/dist/agents/fodda-researcher/skills.js.map +1 -1
- package/dist/brandTemplate.d.ts +1 -1
- package/dist/brandTemplate.d.ts.map +1 -1
- package/dist/brandTemplate.js +179 -11
- package/dist/brandTemplate.js.map +1 -1
- package/dist/catalogCache.d.ts +14 -13
- package/dist/catalogCache.d.ts.map +1 -1
- package/dist/catalogCache.js +266 -67
- package/dist/catalogCache.js.map +1 -1
- package/dist/coverageRelevance.d.ts +156 -0
- package/dist/coverageRelevance.d.ts.map +1 -0
- package/dist/coverageRelevance.js +1062 -0
- package/dist/coverageRelevance.js.map +1 -0
- package/dist/deepResearch.d.ts +43 -0
- package/dist/deepResearch.d.ts.map +1 -0
- package/dist/deepResearch.js +498 -0
- package/dist/deepResearch.js.map +1 -0
- package/dist/enrichment.d.ts.map +1 -1
- package/dist/enrichment.js +51 -1
- package/dist/enrichment.js.map +1 -1
- package/dist/errorHandling.d.ts +1 -1
- package/dist/errorHandling.d.ts.map +1 -1
- package/dist/errorHandling.js +26 -6
- package/dist/errorHandling.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +548 -38
- package/dist/index.js.map +1 -1
- package/dist/linkedinEngine.d.ts +150 -0
- package/dist/linkedinEngine.d.ts.map +1 -0
- package/dist/linkedinEngine.js +696 -0
- package/dist/linkedinEngine.js.map +1 -0
- package/dist/oauthRegisterShim.d.ts +13 -0
- package/dist/oauthRegisterShim.d.ts.map +1 -0
- package/dist/oauthRegisterShim.js +83 -0
- package/dist/oauthRegisterShim.js.map +1 -0
- package/dist/pricingCache.d.ts +6 -8
- package/dist/pricingCache.d.ts.map +1 -1
- package/dist/pricingCache.js +69 -13
- package/dist/pricingCache.js.map +1 -1
- package/dist/queryCache.d.ts +2 -0
- package/dist/queryCache.d.ts.map +1 -1
- package/dist/queryCache.js +11 -2
- package/dist/queryCache.js.map +1 -1
- package/dist/resources.d.ts +27 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +126 -0
- package/dist/resources.js.map +1 -0
- package/dist/sessionTracker.d.ts +24 -2
- package/dist/sessionTracker.d.ts.map +1 -1
- package/dist/sessionTracker.js +198 -4
- package/dist/sessionTracker.js.map +1 -1
- package/dist/systemPrompt.d.ts +3 -3
- package/dist/systemPrompt.d.ts.map +1 -1
- package/dist/systemPrompt.js +81 -61
- package/dist/systemPrompt.js.map +1 -1
- package/dist/telemetry.d.ts +43 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +101 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/test_analyst.js +2 -2
- package/dist/test_analyst.js.map +1 -1
- 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 +148 -0
- package/dist/test_book_a_call_live.js.map +1 -0
- package/dist/test_brand_intelligence_endpoint.d.ts +2 -0
- package/dist/test_brand_intelligence_endpoint.d.ts.map +1 -0
- package/dist/test_brand_intelligence_endpoint.js +20 -0
- package/dist/test_brand_intelligence_endpoint.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 +121 -0
- package/dist/test_coverage_relevance.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 +148 -0
- package/dist/test_dcr_and_legacy_deprecation.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 +43 -0
- package/dist/test_gap_alert.js.map +1 -0
- package/dist/test_list_graphs_topics.d.ts +2 -0
- package/dist/test_list_graphs_topics.d.ts.map +1 -0
- package/dist/test_list_graphs_topics.js +26 -0
- package/dist/test_list_graphs_topics.js.map +1 -0
- package/dist/test_live_endpoint_runner.d.ts +2 -0
- package/dist/test_live_endpoint_runner.d.ts.map +1 -0
- package/dist/test_live_endpoint_runner.js +65 -0
- package/dist/test_live_endpoint_runner.js.map +1 -0
- package/dist/test_local_list_graphs.d.ts +2 -0
- package/dist/test_local_list_graphs.d.ts.map +1 -0
- package/dist/test_local_list_graphs.js +53 -0
- package/dist/test_local_list_graphs.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 +349 -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 +413 -0
- package/dist/test_next_moves_transcripts.js.map +1 -0
- package/dist/test_nike_cmo_alias.d.ts +2 -0
- package/dist/test_nike_cmo_alias.d.ts.map +1 -0
- package/dist/test_nike_cmo_alias.js +76 -0
- package/dist/test_nike_cmo_alias.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_token_resolution.d.ts +2 -0
- package/dist/test_token_resolution.d.ts.map +1 -0
- package/dist/test_token_resolution.js +82 -0
- package/dist/test_token_resolution.js.map +1 -0
- package/dist/toolHandlers.d.ts +7 -3
- package/dist/toolHandlers.d.ts.map +1 -1
- package/dist/toolHandlers.js +1678 -364
- package/dist/toolHandlers.js.map +1 -1
- package/dist/tools.d.ts +7 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +12 -3
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +9 -46
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -1
- package/dist/verify_tools_endpoint.js +4 -3
- package/dist/verify_tools_endpoint.js.map +1 -1
- package/package.json +5 -2
- package/server.json +16 -3
- 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
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { generateNextMoves, generateConsultNextMoves, renderConsultClosingEnvelope } from './coverageRelevance.js';
|
|
3
|
+
import { setCachedCatalogForTesting } from './catalogCache.js';
|
|
4
|
+
console.log('--- Running Next Moves Unit Tests ---');
|
|
5
|
+
// Mock graphs
|
|
6
|
+
const mockGraphs = [
|
|
7
|
+
{
|
|
8
|
+
graph_id: 'retail',
|
|
9
|
+
name: 'Retail Strategy & Innovation',
|
|
10
|
+
graph_type: 'domain',
|
|
11
|
+
status: 'live',
|
|
12
|
+
topics: ['retail'],
|
|
13
|
+
trend_count: 150,
|
|
14
|
+
evidence_count: 600,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
graph_id: 'ben-dietz-sic',
|
|
18
|
+
name: '[SIC] Weekly — Cultural Strategy',
|
|
19
|
+
graph_type: 'expert',
|
|
20
|
+
status: 'live',
|
|
21
|
+
topics: ['culture'],
|
|
22
|
+
curator: 'Ben Dietz',
|
|
23
|
+
trend_count: 80,
|
|
24
|
+
evidence_count: 300,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
graph_id: 'beauty',
|
|
28
|
+
name: 'Beauty & Wellness',
|
|
29
|
+
graph_type: 'domain',
|
|
30
|
+
status: 'live',
|
|
31
|
+
topics: ['beauty'],
|
|
32
|
+
trend_count: 120,
|
|
33
|
+
evidence_count: 450,
|
|
34
|
+
}
|
|
35
|
+
];
|
|
36
|
+
// Mock analysts
|
|
37
|
+
const mockAnalysts = [
|
|
38
|
+
{
|
|
39
|
+
analyst_id: 'ben-dietz-sic',
|
|
40
|
+
name: 'Ben Dietz',
|
|
41
|
+
status: 'Active',
|
|
42
|
+
topics: ['culture', 'marketing', 'trends'],
|
|
43
|
+
description: 'Cultural strategy and youth marketing',
|
|
44
|
+
graph_type: 'expert',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
analyst_id: 'retail-lead',
|
|
48
|
+
name: 'Retail Strategy Lead',
|
|
49
|
+
status: 'Active',
|
|
50
|
+
topics: ['retail', 'commerce', 'omnichannel'],
|
|
51
|
+
description: 'Omnichannel retail innovation',
|
|
52
|
+
graph_type: 'expert',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
analyst_id: 'inactive-expert',
|
|
56
|
+
name: 'Inactive Guy',
|
|
57
|
+
status: 'Paused',
|
|
58
|
+
topics: ['retail'],
|
|
59
|
+
description: 'Old retail',
|
|
60
|
+
graph_type: 'expert',
|
|
61
|
+
}
|
|
62
|
+
];
|
|
63
|
+
// Initialize catalog cache for testing
|
|
64
|
+
setCachedCatalogForTesting({ version: '1.0', generated_at: new Date().toISOString(), graph_count: mockGraphs.length, graphs: mockGraphs }, mockAnalysts);
|
|
65
|
+
// Test 1: Full coverage with more signals remaining
|
|
66
|
+
{
|
|
67
|
+
const rows = [
|
|
68
|
+
{ title: 'AI in store operations', brandNames: ['Nike', 'Adidas'], graphId: 'retail', theme: 'AI in retail' },
|
|
69
|
+
{ title: 'Smart checkout systems', brands: ['Amazon'], graphId: 'retail', theme: 'AI in retail' },
|
|
70
|
+
];
|
|
71
|
+
const nextMoves = generateNextMoves(rows, 'AI in retail stores', ['retail'], 'ok', undefined, undefined, mockGraphs, mockAnalysts, { total: 10, onTopicTotal: 10, knownBrand: 'Nike' });
|
|
72
|
+
assert.ok(nextMoves, 'nextMoves should be defined');
|
|
73
|
+
assert.strictEqual(nextMoves.presentation, 'internal');
|
|
74
|
+
assert.strictEqual(nextMoves.scope_prompt, true);
|
|
75
|
+
assert.strictEqual(nextMoves.known_brand, 'Nike');
|
|
76
|
+
assert.strictEqual(nextMoves.thread?.kind, 'more_in_graph');
|
|
77
|
+
assert.strictEqual(nextMoves.thread?.graph_id, 'retail');
|
|
78
|
+
assert.strictEqual(nextMoves.thread?.remaining_count, 8);
|
|
79
|
+
assert.ok(nextMoves.specific?.brands?.includes('Nike'));
|
|
80
|
+
assert.ok(nextMoves.specific?.brands?.includes('Adidas'));
|
|
81
|
+
console.log('✅ Test 1 Passed: Full coverage with remaining signals');
|
|
82
|
+
}
|
|
83
|
+
// Test 2: Thin coverage with adjacent room
|
|
84
|
+
{
|
|
85
|
+
const rows = [
|
|
86
|
+
{ title: 'Underground fashion drops', graphId: 'ben-dietz-sic' }
|
|
87
|
+
];
|
|
88
|
+
const nextMoves = generateNextMoves(rows, 'underground streetwear subcultures', ['retail'], 'thin', undefined, undefined, mockGraphs, mockAnalysts);
|
|
89
|
+
assert.ok(nextMoves, 'nextMoves should be defined');
|
|
90
|
+
assert.ok(nextMoves.thread?.kind === 'adjacent_room' || nextMoves.thread?.kind === 'honest_thin');
|
|
91
|
+
assert.ok(nextMoves.specific?.expert?.display_name, 'Should recommend a relevant active expert');
|
|
92
|
+
assert.notStrictEqual(nextMoves.specific?.expert?.analyst_id, 'inactive-expert', 'Never recommend inactive expert');
|
|
93
|
+
console.log('✅ Test 2 Passed: Thin coverage with adjacent room & expert match');
|
|
94
|
+
}
|
|
95
|
+
// Test 3: Expert consult exclusion
|
|
96
|
+
{
|
|
97
|
+
const rows = [
|
|
98
|
+
{ title: 'Streetwear culture shift', brands: ['Supreme', 'Stussy'], graphId: 'ben-dietz-sic' }
|
|
99
|
+
];
|
|
100
|
+
const nextMoves = generateNextMoves(rows, 'streetwear trends', ['ben-dietz-sic'], 'ok', undefined, undefined, mockGraphs, mockAnalysts, { currentAnalystId: 'ben-dietz-sic' });
|
|
101
|
+
assert.ok(nextMoves, 'nextMoves should be defined');
|
|
102
|
+
if (nextMoves.specific?.expert) {
|
|
103
|
+
assert.notStrictEqual(nextMoves.specific.expert.analyst_id, 'ben-dietz-sic', 'Should not recommend the analyst currently being consulted');
|
|
104
|
+
}
|
|
105
|
+
assert.deepStrictEqual(nextMoves.specific?.brands, ['Supreme', 'Stussy']);
|
|
106
|
+
console.log('✅ Test 3 Passed: Expert consult does not recommend self');
|
|
107
|
+
}
|
|
108
|
+
// Test 4: OK coverage with 0 remainder and all relevant graphs searched -> thread should be undefined
|
|
109
|
+
{
|
|
110
|
+
const rows = [
|
|
111
|
+
{ title: 'Trend 1', graphId: 'retail' },
|
|
112
|
+
{ title: 'Trend 2', graphId: 'ben-dietz-sic' },
|
|
113
|
+
{ title: 'Trend 3', graphId: 'beauty' },
|
|
114
|
+
];
|
|
115
|
+
const nextMoves = generateNextMoves(rows, 'retail strategy and cultural trends', ['retail', 'ben-dietz-sic', 'beauty'], 'ok', undefined, undefined, mockGraphs, mockAnalysts, { total: 3, onTopicTotal: 3 });
|
|
116
|
+
assert.ok(nextMoves, 'nextMoves should be defined');
|
|
117
|
+
assert.strictEqual(nextMoves.thread, undefined, 'Thread should be dropped when ok coverage has 0 remainder and no unsearched room');
|
|
118
|
+
console.log('✅ Test 4 Passed: OK coverage with 0 remainder drops thread line');
|
|
119
|
+
}
|
|
120
|
+
// Test 5: Statistics source populated on market/retail queries
|
|
121
|
+
{
|
|
122
|
+
const rows = [{ title: 'Retail spending surge', graphId: 'retail' }];
|
|
123
|
+
const nextMoves = generateNextMoves(rows, 'retail consumer spending market trends', ['retail'], 'ok', undefined, undefined, mockGraphs, mockAnalysts);
|
|
124
|
+
assert.ok(nextMoves.specific?.statistics_source, 'Should recommend a statistics source for retail spending queries');
|
|
125
|
+
assert.ok(nextMoves.specific.statistics_source.includes('Census'), 'Should recommend Census for retail spending');
|
|
126
|
+
console.log('✅ Test 5 Passed: Statistics source populated for market query');
|
|
127
|
+
}
|
|
128
|
+
// ── Consult-Specific Next Moves Unit Tests (Render Spec 1.3) ──
|
|
129
|
+
// Test 6: Consult with explicit expert_thread.next_angle
|
|
130
|
+
{
|
|
131
|
+
const mockResult = {
|
|
132
|
+
coverage: 'in',
|
|
133
|
+
report: 'In my cultural strategy framework, community commerce requires authentic creator alignment.',
|
|
134
|
+
sources_used: [{ title: 'Creator Collectives and Community Commerce', type: 'own_graph', graph_id: 'ben-dietz-sic' }],
|
|
135
|
+
expert_thread: {
|
|
136
|
+
on_topic_total: 8,
|
|
137
|
+
cited_count: 1,
|
|
138
|
+
uncited_themes: ['Zines & Subcultures', 'Discord Councils'],
|
|
139
|
+
brands: ['Supreme', 'Aimé Leon Dore'],
|
|
140
|
+
next_angle: 'We can explore how creator collectives differ across European luxury markets next.'
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
const nextMoves = generateConsultNextMoves(mockResult, 'cultural community commerce and luxury retail', 'ben-dietz-sic', { knownBrand: 'Aimé Leon Dore' }, mockGraphs, mockAnalysts);
|
|
144
|
+
assert.ok(nextMoves.consult_envelope, 'consult_envelope must be populated');
|
|
145
|
+
assert.strictEqual(nextMoves.consult_envelope.thread_line, 'We can explore how creator collectives differ across European luxury markets next.');
|
|
146
|
+
// Shelf must exclude Ben Dietz's own graph
|
|
147
|
+
assert.ok(nextMoves.consult_envelope.shelf_line, 'Shelf line must be defined');
|
|
148
|
+
assert.ok(!nextMoves.consult_envelope.shelf_line.includes('Ben Dietz'), 'Shelf must strictly exclude current expert');
|
|
149
|
+
assert.ok(nextMoves.consult_envelope.shelf_line.startsWith('Fodda also holds trend signals on this in'), 'Shelf must use standard platform phrasing');
|
|
150
|
+
assert.strictEqual(nextMoves.consult_envelope.scope_line, 'Want this cut to Aimé Leon Dore specifically?');
|
|
151
|
+
const rendered = renderConsultClosingEnvelope(nextMoves);
|
|
152
|
+
assert.strictEqual(rendered.lines.length, 3, 'Must render exactly 3 sentences');
|
|
153
|
+
console.log('✅ Test 6 Passed: Consult with explicit next_angle and 1.2 scope copy');
|
|
154
|
+
}
|
|
155
|
+
// Test 7: Consult fallback to uncited_themes when next_angle is absent
|
|
156
|
+
{
|
|
157
|
+
const mockResult = {
|
|
158
|
+
coverage: 'in',
|
|
159
|
+
report: 'Community commerce analysis.',
|
|
160
|
+
sources_used: [{ title: 'Creator Collectives', type: 'own_graph', graph_id: 'ben-dietz-sic' }],
|
|
161
|
+
expert_thread: {
|
|
162
|
+
on_topic_total: 5,
|
|
163
|
+
cited_count: 1,
|
|
164
|
+
uncited_themes: ['Discord Councils', 'Zines & Subcultures'],
|
|
165
|
+
brands: ['Supreme'],
|
|
166
|
+
next_angle: null
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
const nextMoves = generateConsultNextMoves(mockResult, 'cultural community commerce', 'ben-dietz-sic', undefined, mockGraphs, mockAnalysts);
|
|
170
|
+
assert.ok(nextMoves.consult_envelope, 'consult_envelope must be populated');
|
|
171
|
+
assert.strictEqual(nextMoves.consult_envelope.thread_line, 'If you want to stay on this, we can look into Discord Councils in my graph.');
|
|
172
|
+
assert.strictEqual(nextMoves.consult_envelope.scope_line, "If you tell me the brand or brief you're working on, I'll cut this to that.");
|
|
173
|
+
console.log('✅ Test 7 Passed: Consult fallback to uncited_themes with 1.2 scope copy');
|
|
174
|
+
}
|
|
175
|
+
// Test 8: Consult fallback to graph remainder when next_angle and uncited_themes are absent
|
|
176
|
+
{
|
|
177
|
+
const mockResult = {
|
|
178
|
+
coverage: 'in',
|
|
179
|
+
report: 'Community commerce analysis.',
|
|
180
|
+
sources_used: [{ title: 'Creator Collectives', type: 'own_graph', graph_id: 'ben-dietz-sic' }],
|
|
181
|
+
expert_thread: {
|
|
182
|
+
on_topic_total: 6,
|
|
183
|
+
cited_count: 1,
|
|
184
|
+
uncited_themes: [],
|
|
185
|
+
brands: [],
|
|
186
|
+
next_angle: null
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
const nextMoves = generateConsultNextMoves(mockResult, 'cultural community commerce', 'ben-dietz-sic', undefined, mockGraphs, mockAnalysts);
|
|
190
|
+
assert.ok(nextMoves.consult_envelope, 'consult_envelope must be populated');
|
|
191
|
+
assert.strictEqual(nextMoves.consult_envelope.thread_line, 'There are several more trends in my graph exploring this topic — want me to pull those?');
|
|
192
|
+
assert.strictEqual(nextMoves.consult_envelope.scope_line, "If you tell me the brand or brief you're working on, I'll cut this to that.");
|
|
193
|
+
console.log('✅ Test 8 Passed: Consult fallback to graph remainder');
|
|
194
|
+
}
|
|
195
|
+
// Test 9: Out-of-lane / decline consult with referrals
|
|
196
|
+
{
|
|
197
|
+
const mockResult = {
|
|
198
|
+
coverage: 'out',
|
|
199
|
+
report: 'This Human Agent does not cover technical retail logistics.',
|
|
200
|
+
sources_used: [],
|
|
201
|
+
referrals: [
|
|
202
|
+
{ id: 'retail-lead', name: 'Retail Strategy Lead', curator: 'Retail Strategy Lead', reason: 'omnichannel retail logistics directly', status: 'Active' }
|
|
203
|
+
],
|
|
204
|
+
expert_thread: {
|
|
205
|
+
on_topic_total: 0,
|
|
206
|
+
cited_count: 0,
|
|
207
|
+
uncited_themes: [],
|
|
208
|
+
brands: [],
|
|
209
|
+
next_angle: null
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
const nextMoves = generateConsultNextMoves(mockResult, 'warehouse logistics automation', 'ben-dietz-sic', undefined, mockGraphs, mockAnalysts);
|
|
213
|
+
assert.ok(nextMoves.consult_envelope, 'consult_envelope must be populated');
|
|
214
|
+
assert.strictEqual(nextMoves.consult_envelope.thread_line, "For inquiries on this topic, I'd recommend connecting with Retail Strategy Lead who covers omnichannel retail logistics directly.");
|
|
215
|
+
console.log('✅ Test 9 Passed: Out-of-lane consult with peer referral');
|
|
216
|
+
}
|
|
217
|
+
// Test 10: next_angle token check failure triggers fallback per §2.A.5
|
|
218
|
+
{
|
|
219
|
+
const mockResult = {
|
|
220
|
+
coverage: 'in',
|
|
221
|
+
report: 'Cultural brands analysis.',
|
|
222
|
+
sources_used: [{ title: 'Streetwear Dynamics', type: 'own_graph', graph_id: 'ben-dietz-sic' }],
|
|
223
|
+
expert_thread: {
|
|
224
|
+
on_topic_total: 5,
|
|
225
|
+
cited_count: 1,
|
|
226
|
+
uncited_themes: ['Underground Music'],
|
|
227
|
+
brands: [],
|
|
228
|
+
// Hallucinated / completely unrelated angle sharing no tokens with sources or uncited themes:
|
|
229
|
+
next_angle: 'We should look into quantum computing aerospace satellites.'
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
const nextMoves = generateConsultNextMoves(mockResult, 'streetwear dynamics', 'ben-dietz-sic', undefined, mockGraphs, mockAnalysts);
|
|
233
|
+
assert.ok(nextMoves.consult_envelope, 'consult_envelope must be populated');
|
|
234
|
+
assert.strictEqual(nextMoves.consult_envelope.thread_line, 'If you want to stay on this, we can look into Underground Music in my graph.', 'Ungrounded next_angle must fail token check and fall back to uncited_themes');
|
|
235
|
+
console.log('✅ Test 10 Passed: next_angle token check failure triggers clean fallback');
|
|
236
|
+
}
|
|
237
|
+
// Test 11: Consult with empty shelf candidate list omits sentence 2 (2 sentences rendered)
|
|
238
|
+
{
|
|
239
|
+
const mockResult = {
|
|
240
|
+
coverage: 'in',
|
|
241
|
+
report: 'Niche topic report.',
|
|
242
|
+
sources_used: [{ title: 'Niche Analysis', type: 'own_graph', graph_id: 'ben-dietz-sic' }],
|
|
243
|
+
expert_thread: {
|
|
244
|
+
on_topic_total: 3,
|
|
245
|
+
cited_count: 1,
|
|
246
|
+
uncited_themes: ['Subculture Zines'],
|
|
247
|
+
next_angle: 'We can explore subculture zines next.'
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
// Only 1 graph in catalog (the expert's own graph), so no candidate shelf graphs exist
|
|
251
|
+
const onlyOwnGraph = [mockGraphs[1]];
|
|
252
|
+
setCachedCatalogForTesting({ version: '1.0', generated_at: new Date().toISOString(), graph_count: 1, graphs: onlyOwnGraph }, mockAnalysts);
|
|
253
|
+
const nextMoves = generateConsultNextMoves(mockResult, 'obscure query with no other graph coverage', 'ben-dietz-sic', undefined, onlyOwnGraph, mockAnalysts);
|
|
254
|
+
assert.ok(nextMoves.consult_envelope, 'consult_envelope must be populated');
|
|
255
|
+
assert.strictEqual(nextMoves.consult_envelope.shelf_line, undefined, 'shelf_line must be omitted when no relevant graphs exist');
|
|
256
|
+
assert.strictEqual(nextMoves.shelf, undefined, 'shelf must be undefined when no candidates exist');
|
|
257
|
+
const rendered = renderConsultClosingEnvelope(nextMoves);
|
|
258
|
+
assert.strictEqual(rendered.lines.length, 2, 'Must render exactly 2 sentences when shelf is omitted');
|
|
259
|
+
assert.strictEqual(rendered.text, "We can explore subculture zines next. If you tell me the brand or brief you're working on, I'll cut this to that.");
|
|
260
|
+
console.log('✅ Test 11 Passed: Consult with empty shelf candidates cleanly omits sentence 2');
|
|
261
|
+
}
|
|
262
|
+
// Test 12: Pinned regression test against 1.46.23 envelope for search_graph("Gen Z beverage hydration trends")
|
|
263
|
+
{
|
|
264
|
+
const rows = [
|
|
265
|
+
{ title: 'Functional Hydration Beverages', brandNames: ['Liquid IV', 'Gatorade'], graphId: 'retail', score: 1.8, topics: ['beverage', 'retail'], on_topic_total: 8 },
|
|
266
|
+
{ title: 'Electrolyte Micro-Dosing', brandNames: ['Waterdrop'], graphId: 'retail', score: 1.6, topics: ['wellness'], on_topic_total: 8 },
|
|
267
|
+
{ title: 'Adaptogenic Sparkling Waters', brandNames: ['Recess', 'Kin'], graphId: 'retail', score: 1.7, topics: ['beverage'], on_topic_total: 8 },
|
|
268
|
+
{ title: 'Off-topic Gaming trend', brandNames: ['PlayStation'], graphId: 'retail', score: 0.2, topics: ['gaming'], on_topic_total: 8 },
|
|
269
|
+
{ title: 'Off-topic Luxury trend', brandNames: ['Hermès'], graphId: 'retail', score: 0.1, topics: ['luxury'], on_topic_total: 8 }
|
|
270
|
+
];
|
|
271
|
+
const nextMoves = generateNextMoves(rows, 'Gen Z beverage hydration trends', ['retail'], 'ok', undefined, undefined, mockGraphs, mockAnalysts, { total: 12, onTopicTotal: 8 });
|
|
272
|
+
assert.ok(nextMoves, 'nextMoves must be defined');
|
|
273
|
+
assert.strictEqual(nextMoves.thread?.kind, 'more_in_graph', 'Thread kind must be more_in_graph');
|
|
274
|
+
assert.strictEqual(nextMoves.thread?.graph_id, 'retail');
|
|
275
|
+
assert.ok(typeof nextMoves.thread?.remaining_count === 'number' && nextMoves.thread.remaining_count > 0, 'remaining_count must be > 0');
|
|
276
|
+
// Brands must be extracted strictly from on-topic rows (Liquid IV, Gatorade, Waterdrop, Recess, Kin)
|
|
277
|
+
// and NEVER from off-topic rows (PlayStation, Hermès)
|
|
278
|
+
assert.ok(nextMoves.specific?.brands && nextMoves.specific.brands.length > 0, 'specific.brands must be populated');
|
|
279
|
+
const ON_TOPIC_BEVERAGE_BRANDS = new Set(['Liquid IV', 'Gatorade', 'Waterdrop', 'Recess', 'Kin']);
|
|
280
|
+
for (const b of nextMoves.specific.brands) {
|
|
281
|
+
assert.ok(ON_TOPIC_BEVERAGE_BRANDS.has(b), `Brand "${b}" must be from on-topic rows`);
|
|
282
|
+
assert.notStrictEqual(b, 'PlayStation', 'Must not contain off-topic PlayStation');
|
|
283
|
+
assert.notStrictEqual(b, 'Hermès', 'Must not contain off-topic Hermès');
|
|
284
|
+
}
|
|
285
|
+
console.log('✅ Test 12 Passed: Pinned regression test against 1.46.23 envelope for search_graph');
|
|
286
|
+
}
|
|
287
|
+
// Test 13: Lululemon competitor filter with explicit allowed athletic/apparel list
|
|
288
|
+
{
|
|
289
|
+
const ALLOWED_LULULEMON_COMPETITORS = new Set([
|
|
290
|
+
'Nike', 'Adidas', 'Alo', 'Alo Yoga', 'Vuori', 'Athleta',
|
|
291
|
+
'Under Armour', 'Gymshark', 'On', 'On Running', 'Puma',
|
|
292
|
+
'New Balance', 'Lorna Jane', 'Sweaty Betty', "Arc'teryx"
|
|
293
|
+
]);
|
|
294
|
+
// Simulated Lululemon footprint trends (sports graph)
|
|
295
|
+
const sportsFootprint = [
|
|
296
|
+
{ trend_name: 'Studio Athletic Performance', brandNames: ['Alo', 'Vuori'], graphId: 'sports', signal_score: 180 },
|
|
297
|
+
{ trend_name: 'Technical Running Apparel', brandNames: ['Nike', 'On Running'], graphId: 'sports', signal_score: 160 }
|
|
298
|
+
];
|
|
299
|
+
const nextMovesWithSports = generateNextMoves(sportsFootprint, 'Lululemon', ['sports'], 'ok', undefined, undefined, mockGraphs, mockAnalysts, {
|
|
300
|
+
isBrandTracker: true,
|
|
301
|
+
competitiveLandscape: ['Alo', 'Vuori'],
|
|
302
|
+
brandDisplayName: 'Lululemon',
|
|
303
|
+
earningsStatsSource: "Lululemon's latest earnings and financial results"
|
|
304
|
+
});
|
|
305
|
+
if (nextMovesWithSports.specific?.brands) {
|
|
306
|
+
for (const b of nextMovesWithSports.specific.brands) {
|
|
307
|
+
assert.ok(ALLOWED_LULULEMON_COMPETITORS.has(b), `Brand "${b}" must be in allowed athletic/apparel competitor list`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// Simulated Lululemon with no sector-matching competitors (e.g. noise only -> competitiveLandscape empty)
|
|
311
|
+
const nextMovesEmptyCompetitors = generateNextMoves(sportsFootprint, 'Lululemon', ['sports'], 'ok', undefined, undefined, mockGraphs, mockAnalysts, {
|
|
312
|
+
isBrandTracker: true,
|
|
313
|
+
competitiveLandscape: [], // <1 competitor survives
|
|
314
|
+
brandDisplayName: 'Lululemon',
|
|
315
|
+
earningsStatsSource: "Lululemon's latest earnings and financial results"
|
|
316
|
+
});
|
|
317
|
+
assert.strictEqual(nextMovesEmptyCompetitors.specific?.brands, undefined, 'specific.brands must be undefined when competitiveLandscape is empty');
|
|
318
|
+
assert.strictEqual(nextMovesEmptyCompetitors.specific?.statistics_source, "Lululemon's latest earnings and financial results");
|
|
319
|
+
const closing = renderConsultClosingEnvelope(nextMovesEmptyCompetitors);
|
|
320
|
+
assert.ok(!closing.text.includes('La Mer'), 'Must never mention La Mer');
|
|
321
|
+
assert.ok(!closing.text.includes('NCR'), 'Must never mention NCR');
|
|
322
|
+
assert.ok(!closing.text.includes('Discover'), 'Must never mention Discover');
|
|
323
|
+
console.log('✅ Test 13 Passed: Lululemon competitor filter strictly adheres to athletic/apparel allowed set or omits clause');
|
|
324
|
+
}
|
|
325
|
+
// Test 14: Consult shelf score floor (query with low relevance to domain graphs cleanly omits sentence 2)
|
|
326
|
+
{
|
|
327
|
+
const mockResult = {
|
|
328
|
+
coverage: 'in',
|
|
329
|
+
report: 'Earned media and podcast strategies.',
|
|
330
|
+
sources_used: [{ title: 'Podcast Guesting Tips', type: 'own_graph', graph_id: 'james-colistra-earned-media-and-podcast' }],
|
|
331
|
+
expert_thread: {
|
|
332
|
+
on_topic_total: 4,
|
|
333
|
+
cited_count: 1,
|
|
334
|
+
uncited_themes: ['Host Alignment'],
|
|
335
|
+
next_angle: 'We can explore host alignment and podcast pitching strategies next.'
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
const nextMoves = generateConsultNextMoves(mockResult, 'podcast guest tips', 'james-colistra-earned-media-and-podcast', undefined, mockGraphs, mockAnalysts);
|
|
339
|
+
assert.ok(nextMoves.consult_envelope, 'consult_envelope must be populated');
|
|
340
|
+
assert.strictEqual(nextMoves.consult_envelope.shelf_line, undefined, 'shelf_line must be omitted when candidate graphs score below 0.10 floor');
|
|
341
|
+
assert.strictEqual(nextMoves.shelf, undefined, 'shelf must be undefined below floor');
|
|
342
|
+
const rendered = renderConsultClosingEnvelope(nextMoves);
|
|
343
|
+
assert.strictEqual(rendered.lines.length, 2, 'Must render exactly 2 sentences when shelf is below 0.10 floor');
|
|
344
|
+
assert.ok(!rendered.text.includes('Retail Strategy & Innovation'), 'Must not merchandise unrelated retail graph');
|
|
345
|
+
assert.ok(!rendered.text.includes('Beauty & Wellness'), 'Must not merchandise unrelated beauty graph');
|
|
346
|
+
console.log('✅ Test 14 Passed: Consult shelf score floor cleanly omits sentence 2 on low relevance');
|
|
347
|
+
}
|
|
348
|
+
console.log('\nAll Next Moves unit tests passed successfully!');
|
|
349
|
+
//# sourceMappingURL=test_next_moves.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_next_moves.js","sourceRoot":"","sources":["../src/test_next_moves.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_next_moves_transcripts.d.ts","sourceRoot":"","sources":["../src/test_next_moves_transcripts.ts"],"names":[],"mappings":""}
|