paracosm 0.8.515 → 0.8.536

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.
@@ -13,6 +13,7 @@
13
13
  * @module paracosm/cli/quickstart-routes
14
14
  */
15
15
  import type { IncomingMessage, ServerResponse } from 'node:http';
16
+ import { WorldModel } from '../runtime/world-model/index.js';
16
17
  import type { ScenarioPackage } from '../engine/types.js';
17
18
  export interface QuickstartDeps {
18
19
  /** Installs a compiled scenario as the active scenario. */
@@ -40,6 +41,16 @@ export interface QuickstartDeps {
40
41
  domain: string;
41
42
  }>;
42
43
  }>) => void;
44
+ /**
45
+ * Lazily compile + cache the corporate-quarterly scenario and return a
46
+ * WorldModel ready for `simulateIntervention`. Used by the
47
+ * /simulate-intervention route so the digital-twin tab does not need
48
+ * the user to compile a scenario first.
49
+ *
50
+ * Returns undefined when the underlying scenario file is missing or
51
+ * compile fails (caller writes a 502 in that case).
52
+ */
53
+ getDigitalTwinWorld?: () => Promise<WorldModel | null>;
43
54
  }
44
55
  export declare function handleFetchSeed(_req: IncomingMessage, res: ServerResponse, body: unknown, deps: QuickstartDeps): Promise<void>;
45
56
  export declare function handleCompileFromSeed(_req: IncomingMessage, res: ServerResponse, body: unknown, deps: QuickstartDeps): Promise<void>;
@@ -57,4 +68,23 @@ export declare function handleGenerateActors(_req: IncomingMessage, res: ServerR
57
68
  * rather than failing the whole run.
58
69
  */
59
70
  export declare function handleGroundScenario(_req: IncomingMessage, res: ServerResponse, body: unknown, deps: QuickstartDeps): Promise<void>;
71
+ /**
72
+ * POST /api/quickstart/simulate-intervention
73
+ *
74
+ * Synchronous digital-twin run: applies a SubjectConfig + InterventionConfig
75
+ * to a leader against the corporate-quarterly scenario and returns the
76
+ * full RunArtifact JSON. Drives the dashboard's Digital Twin tab.
77
+ *
78
+ * Behaviour:
79
+ * - If `scenarioId` is provided, resolves it via deps.getScenarioById.
80
+ * - Otherwise calls deps.getDigitalTwinWorld() which lazily compiles
81
+ * corporate-quarterly.json and caches the WorldModel.
82
+ * - Leader defaults to a Cautious Methodical Evaluator HEXACO profile
83
+ * if the body does not supply one.
84
+ * - Options default to maxTurns=2, seed=11, costPreset='economy' so a
85
+ * single intervention run completes in ~30-90s on prod.
86
+ *
87
+ * Response shape: `{ artifact, durationMs }` on success.
88
+ */
89
+ export declare function handleSimulateIntervention(_req: IncomingMessage, res: ServerResponse, body: unknown, deps: QuickstartDeps): Promise<void>;
60
90
  //# sourceMappingURL=quickstart-routes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"quickstart-routes.d.ts","sourceRoot":"","sources":["../../src/cli/quickstart-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AA4B1D,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,iBAAiB,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;IACvD,oEAAoE;IACpE,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,eAAe,GAAG,SAAS,CAAC;IAC7D,6EAA6E;IAC7E,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/F,kDAAkD;IAClD,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB;;;kEAG8D;IAC9D,wBAAwB,CAAC,EAAE,CACzB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,KACjG,IAAI,CAAC;CACX;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAwCf"}
1
+ {"version":3,"file":"quickstart-routes.d.ts","sourceRoot":"","sources":["../../src/cli/quickstart-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIjE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,oBAAoB,CAAC;AA0GvE,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,iBAAiB,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;IACvD,oEAAoE;IACpE,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,eAAe,GAAG,SAAS,CAAC;IAC7D,6EAA6E;IAC7E,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/F,kDAAkD;IAClD,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB;;;kEAG8D;IAC9D,wBAAwB,CAAC,EAAE,CACzB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,KACjG,IAAI,CAAC;IACV;;;;;;;;OAQG;IACH,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;CACxD;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CA0Cf;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAuEf"}
@@ -1,6 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { compileFromSeed } from '../engine/compiler/compile-from-seed.js';
3
3
  import { generateQuickstartActors } from '../runtime/world-model/index.js';
4
+ import { WorldModel } from '../runtime/world-model/index.js';
4
5
  import { groundScenario } from './server/deep-research.js';
5
6
  const FetchSeedSchema = z.object({
6
7
  url: z.string().url().max(2048),
@@ -23,6 +24,76 @@ const GenerateActorsSchema = z.object({
23
24
  const GroundScenarioSchema = z.object({
24
25
  scenarioId: z.string().min(3).max(64),
25
26
  });
27
+ const SubjectSignalSchema = z.object({
28
+ label: z.string().min(1).max(80),
29
+ value: z.union([z.number(), z.string()]),
30
+ unit: z.string().max(40).optional(),
31
+ recordedAt: z.string().max(64).optional(),
32
+ });
33
+ const SubjectMarkerSchema = z.object({
34
+ id: z.string().min(1).max(64),
35
+ category: z.string().max(40).optional(),
36
+ value: z.union([z.string(), z.number(), z.boolean()]),
37
+ });
38
+ const SubjectSchema = z.object({
39
+ id: z.string().min(1).max(80),
40
+ name: z.string().min(1).max(120),
41
+ profile: z.record(z.string(), z.unknown()).optional(),
42
+ signals: z.array(SubjectSignalSchema).max(40).optional(),
43
+ markers: z.array(SubjectMarkerSchema).max(40).optional(),
44
+ });
45
+ const InterventionSchema = z.object({
46
+ id: z.string().min(1).max(80),
47
+ name: z.string().min(1).max(120),
48
+ description: z.string().min(1).max(600),
49
+ duration: z.object({
50
+ value: z.number(),
51
+ unit: z.string().min(1).max(40),
52
+ }).optional(),
53
+ adherenceProfile: z.object({
54
+ expected: z.number().min(0).max(1),
55
+ risks: z.array(z.string()).optional(),
56
+ }).optional(),
57
+ });
58
+ const LeaderSchema = z.object({
59
+ name: z.string().min(1).max(80),
60
+ archetype: z.string().min(1).max(60),
61
+ unit: z.string().min(1).max(80).optional(),
62
+ hexaco: z.object({
63
+ openness: z.number().min(0).max(1),
64
+ conscientiousness: z.number().min(0).max(1),
65
+ extraversion: z.number().min(0).max(1),
66
+ agreeableness: z.number().min(0).max(1),
67
+ emotionality: z.number().min(0).max(1),
68
+ honestyHumility: z.number().min(0).max(1),
69
+ }),
70
+ instructions: z.string().default(''),
71
+ });
72
+ const SimulateInterventionSchema = z.object({
73
+ subject: SubjectSchema,
74
+ intervention: InterventionSchema,
75
+ leader: LeaderSchema.optional(),
76
+ scenarioId: z.string().min(3).max(80).optional(),
77
+ options: z.object({
78
+ maxTurns: z.number().int().min(1).max(6).optional(),
79
+ seed: z.number().int().optional(),
80
+ costPreset: z.enum(['quality', 'economy']).optional(),
81
+ }).optional(),
82
+ });
83
+ const DEFAULT_DIGITAL_TWIN_LEADER = {
84
+ name: 'Cautious Methodical Evaluator',
85
+ archetype: 'The Methodical Evaluator',
86
+ unit: 'Lab leadership',
87
+ hexaco: {
88
+ openness: 0.55,
89
+ conscientiousness: 0.92,
90
+ extraversion: 0.4,
91
+ agreeableness: 0.65,
92
+ emotionality: 0.55,
93
+ honestyHumility: 0.88,
94
+ },
95
+ instructions: '',
96
+ };
26
97
  export async function handleFetchSeed(_req, res, body, deps) {
27
98
  const parsed = FetchSeedSchema.safeParse(body);
28
99
  if (!parsed.success) {
@@ -154,6 +225,8 @@ export async function handleGroundScenario(_req, res, body, deps) {
154
225
  totalSources: result.totalSources,
155
226
  durationMs: result.durationMs,
156
227
  emptyQueries: result.emptyQueries,
228
+ providersUsed: result.providersUsed,
229
+ providersFailed: result.providersFailed,
157
230
  }));
158
231
  }
159
232
  catch (err) {
@@ -161,4 +234,87 @@ export async function handleGroundScenario(_req, res, body, deps) {
161
234
  res.end(JSON.stringify({ error: `Grounding failed: ${String(err)}` }));
162
235
  }
163
236
  }
237
+ /**
238
+ * POST /api/quickstart/simulate-intervention
239
+ *
240
+ * Synchronous digital-twin run: applies a SubjectConfig + InterventionConfig
241
+ * to a leader against the corporate-quarterly scenario and returns the
242
+ * full RunArtifact JSON. Drives the dashboard's Digital Twin tab.
243
+ *
244
+ * Behaviour:
245
+ * - If `scenarioId` is provided, resolves it via deps.getScenarioById.
246
+ * - Otherwise calls deps.getDigitalTwinWorld() which lazily compiles
247
+ * corporate-quarterly.json and caches the WorldModel.
248
+ * - Leader defaults to a Cautious Methodical Evaluator HEXACO profile
249
+ * if the body does not supply one.
250
+ * - Options default to maxTurns=2, seed=11, costPreset='economy' so a
251
+ * single intervention run completes in ~30-90s on prod.
252
+ *
253
+ * Response shape: `{ artifact, durationMs }` on success.
254
+ */
255
+ export async function handleSimulateIntervention(_req, res, body, deps) {
256
+ const parsed = SimulateInterventionSchema.safeParse(body);
257
+ if (!parsed.success) {
258
+ res.writeHead(400, { 'Content-Type': 'application/json' });
259
+ res.end(JSON.stringify({
260
+ error: 'Invalid simulate-intervention payload',
261
+ issues: parsed.error.issues.slice(0, 5).map(i => `${i.path.join('.')}: ${i.message}`),
262
+ }));
263
+ return;
264
+ }
265
+ const { subject, intervention, leader, scenarioId, options = {} } = parsed.data;
266
+ let world = null;
267
+ if (scenarioId) {
268
+ const sc = deps.getScenarioById(scenarioId);
269
+ if (!sc) {
270
+ res.writeHead(404, { 'Content-Type': 'application/json' });
271
+ res.end(JSON.stringify({ error: `Scenario '${scenarioId}' not found.` }));
272
+ return;
273
+ }
274
+ world = WorldModel.fromScenario(sc);
275
+ }
276
+ else {
277
+ if (!deps.getDigitalTwinWorld) {
278
+ res.writeHead(503, { 'Content-Type': 'application/json' });
279
+ res.end(JSON.stringify({ error: 'Digital-twin scenario provider not configured on server.' }));
280
+ return;
281
+ }
282
+ try {
283
+ world = await deps.getDigitalTwinWorld();
284
+ }
285
+ catch (err) {
286
+ console.error('[simulate-intervention] getDigitalTwinWorld failed:', err);
287
+ res.writeHead(502, { 'Content-Type': 'application/json' });
288
+ res.end(JSON.stringify({ error: 'Failed to prepare digital-twin scenario.' }));
289
+ return;
290
+ }
291
+ if (!world) {
292
+ res.writeHead(503, { 'Content-Type': 'application/json' });
293
+ res.end(JSON.stringify({ error: 'Digital-twin scenario unavailable. Provide scenarioId or check server config.' }));
294
+ return;
295
+ }
296
+ }
297
+ const effectiveLeader = leader
298
+ ? { ...leader, unit: leader.unit ?? 'Lab leadership', instructions: leader.instructions ?? '' }
299
+ : DEFAULT_DIGITAL_TWIN_LEADER;
300
+ const startedAt = Date.now();
301
+ let artifact;
302
+ try {
303
+ artifact = await world.simulateIntervention(subject, intervention, effectiveLeader, {
304
+ maxTurns: options.maxTurns ?? 2,
305
+ seed: options.seed ?? 11,
306
+ costPreset: options.costPreset ?? 'economy',
307
+ captureSnapshots: false,
308
+ });
309
+ }
310
+ catch (err) {
311
+ console.error('[simulate-intervention] simulateIntervention failed:', err);
312
+ res.writeHead(500, { 'Content-Type': 'application/json' });
313
+ res.end(JSON.stringify({ error: `Intervention run failed: ${err instanceof Error ? err.message : String(err)}` }));
314
+ return;
315
+ }
316
+ const durationMs = Date.now() - startedAt;
317
+ res.writeHead(200, { 'Content-Type': 'application/json' });
318
+ res.end(JSON.stringify({ artifact, durationMs }));
319
+ }
164
320
  //# sourceMappingURL=quickstart-routes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"quickstart-routes.js","sourceRoot":"","sources":["../../src/cli/quickstart-routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"quickstart-routes.js","sourceRoot":"","sources":["../../src/cli/quickstart-routes.ts"],"names":[],"mappings":"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"}
@@ -18,17 +18,24 @@
18
18
  * @module paracosm/cli/server/deep-research
19
19
  */
20
20
  import type { ScenarioPackage } from '../../engine/types.js';
21
+ /** Identifier for the search provider that surfaced a given result.
22
+ * Lets the UI render a per-source provider chip and lets the
23
+ * grounding pass dedupe across providers. */
24
+ export type SearchProvider = 'serper' | 'tavily' | 'firecrawl';
21
25
  export interface SerperResult {
22
- /** Result title from Serper. */
26
+ /** Result title from the search provider. */
23
27
  title: string;
24
28
  /** Canonical URL of the source. */
25
29
  link: string;
26
- /** Free-text snippet from Serper, usually 100-200 chars. */
30
+ /** Free-text snippet, usually 100-200 chars. */
27
31
  snippet: string;
28
32
  /** Optional date string, present for news-style results. */
29
33
  date?: string;
30
34
  /** Origin domain (e.g. "wikipedia.org"); derived from `link`. */
31
35
  domain: string;
36
+ /** Which provider surfaced this result. Surfaced in the citation
37
+ * log so the demo viewer sees parallel-provider grounding. */
38
+ provider: SearchProvider;
32
39
  }
33
40
  export interface GroundingCitation {
34
41
  /** Query that surfaced this result. Useful for showing the user
@@ -60,6 +67,17 @@ export interface GroundingResult {
60
67
  durationMs: number;
61
68
  /** Queries that returned 0 results or failed. Used to surface gaps. */
62
69
  emptyQueries: string[];
70
+ /** Providers that successfully returned at least one result on at
71
+ * least one query. Surfaced as a chip row in the Quickstart card so
72
+ * the demo viewer sees which sources backed the run. */
73
+ providersUsed: SearchProvider[];
74
+ /** Providers that errored out for every query (e.g. Firecrawl when
75
+ * the account is out of credits). Logged as warn lines so the user
76
+ * knows why a provider didn't contribute. */
77
+ providersFailed: Array<{
78
+ provider: SearchProvider;
79
+ reason: string;
80
+ }>;
63
81
  }
64
82
  /**
65
83
  * Derive 3 search queries from the ScenarioPackage. We pick the
@@ -71,21 +89,43 @@ export interface GroundingResult {
71
89
  */
72
90
  export declare function deriveGroundingQueries(scenario: ScenarioPackage): string[];
73
91
  /**
74
- * One Serper search. Returns up to `maxResults` unique results. Throws
75
- * on network/parse errors so the caller can mark the query as failed
92
+ * One Serper search. Returns up to `maxResults` results. Throws on
93
+ * network/parse errors so the caller can mark the query as failed
76
94
  * in its progress log; never returns null/undefined.
77
95
  */
78
96
  export declare function searchSerper(query: string, apiKey: string, maxResults?: number, fetchImpl?: typeof fetch): Promise<SerperResult[]>;
79
97
  /**
80
- * Run the grounding pass for a scenario. Calls searchSerper for each
81
- * derived query in parallel, deduplicates results by URL across
82
- * queries, and emits progress callbacks for the Quickstart UI.
98
+ * One Tavily search. Tavily ships its own AI-summarized results so
99
+ * the snippets are denser than Serper's. Auth is body-based
100
+ * (api_key field) rather than header we use the modern body shape.
101
+ */
102
+ export declare function searchTavily(query: string, apiKey: string, maxResults?: number, fetchImpl?: typeof fetch): Promise<SerperResult[]>;
103
+ /**
104
+ * One Firecrawl search. Currently disabled in the grounding pass
105
+ * because the production account is out of credits (HTTP 402). Kept
106
+ * for completeness so the grounding helper can light up Firecrawl
107
+ * automatically once credits are topped up — no code change required.
108
+ */
109
+ export declare function searchFirecrawl(query: string, apiKey: string, maxResults?: number, fetchImpl?: typeof fetch): Promise<SerperResult[]>;
110
+ /**
111
+ * Run the grounding pass for a scenario. For each derived query, fans
112
+ * out to every configured search provider (Serper, Tavily, Firecrawl)
113
+ * in parallel, dedupes by URL across providers + queries, and emits
114
+ * progress callbacks for the Quickstart UI.
115
+ *
116
+ * Provider selection: every provider whose API key is non-empty is
117
+ * tried. A provider that fails on every query (e.g. Firecrawl HTTP 402
118
+ * when out of credits) is reported in `providersFailed` rather than
119
+ * crashing the whole pass — the run continues with whatever providers
120
+ * are healthy.
83
121
  *
84
- * Returns null when SERPER_API_KEY is not set so the caller can skip
85
- * the whole stage gracefully (rather than fail the run).
122
+ * Returns null only when ALL providers are missing API keys; otherwise
123
+ * returns a result that may be partially-populated.
86
124
  */
87
125
  export declare function groundScenario(scenario: ScenarioPackage, options?: {
88
126
  serperApiKey?: string;
127
+ tavilyApiKey?: string;
128
+ firecrawlApiKey?: string;
89
129
  maxResultsPerQuery?: number;
90
130
  onProgress?: (event: GroundingProgressEvent) => void;
91
131
  fetchImpl?: typeof fetch;
@@ -1 +1 @@
1
- {"version":3,"file":"deep-research.d.ts","sourceRoot":"","sources":["../../../src/cli/server/deep-research.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI7D,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC;gDAC4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,iEAAiE;IACjE,IAAI,EAAE,eAAe,GAAG,YAAY,GAAG,cAAc,GAAG,UAAU,CAAC;IACnE,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,EAAE,CAgC1E;AAmBD;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,SAAI,EACd,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,YAAY,EAAE,CAAC,CAyBzB;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,eAAe,EACzB,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACrD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CACrB,GACL,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA8DjC"}
1
+ {"version":3,"file":"deep-research.d.ts","sourceRoot":"","sources":["../../../src/cli/server/deep-research.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  const SERPER_ENDPOINT = 'https://google.serper.dev/search';
2
+ const TAVILY_ENDPOINT = 'https://api.tavily.com/search';
3
+ const FIRECRAWL_ENDPOINT = 'https://api.firecrawl.dev/v1/search';
2
4
  /**
3
5
  * Derive 3 search queries from the ScenarioPackage. We pick the
4
6
  * scenario's primary subject (compiled from the seed text), one
@@ -50,8 +52,8 @@ function urlDomain(url) {
50
52
  }
51
53
  }
52
54
  /**
53
- * One Serper search. Returns up to `maxResults` unique results. Throws
54
- * on network/parse errors so the caller can mark the query as failed
55
+ * One Serper search. Returns up to `maxResults` results. Throws on
56
+ * network/parse errors so the caller can mark the query as failed
55
57
  * in its progress log; never returns null/undefined.
56
58
  */
57
59
  export async function searchSerper(query, apiKey, maxResults = 5, fetchImpl = fetch) {
@@ -77,70 +79,187 @@ export async function searchSerper(query, apiKey, maxResults = 5, fetchImpl = fe
77
79
  snippet: typeof r.snippet === 'string' ? r.snippet : '',
78
80
  date: typeof r.date === 'string' ? r.date : undefined,
79
81
  domain: urlDomain(r.link),
82
+ provider: 'serper',
80
83
  }));
81
84
  }
82
85
  /**
83
- * Run the grounding pass for a scenario. Calls searchSerper for each
84
- * derived query in parallel, deduplicates results by URL across
85
- * queries, and emits progress callbacks for the Quickstart UI.
86
+ * One Tavily search. Tavily ships its own AI-summarized results so
87
+ * the snippets are denser than Serper's. Auth is body-based
88
+ * (api_key field) rather than header we use the modern body shape.
89
+ */
90
+ export async function searchTavily(query, apiKey, maxResults = 5, fetchImpl = fetch) {
91
+ const res = await fetchImpl(TAVILY_ENDPOINT, {
92
+ method: 'POST',
93
+ headers: { 'Content-Type': 'application/json' },
94
+ body: JSON.stringify({ api_key: apiKey, query, max_results: maxResults }),
95
+ });
96
+ if (!res.ok) {
97
+ throw new Error(`Tavily HTTP ${res.status}: ${await res.text().catch(() => '<no body>')}`);
98
+ }
99
+ const body = (await res.json());
100
+ const results = body.results ?? [];
101
+ return results
102
+ .filter((r) => typeof r.title === 'string' && typeof r.url === 'string')
103
+ .slice(0, maxResults)
104
+ .map((r) => ({
105
+ title: r.title,
106
+ link: r.url,
107
+ snippet: typeof r.content === 'string' ? r.content : '',
108
+ date: typeof r.published_date === 'string' ? r.published_date : undefined,
109
+ domain: urlDomain(r.url),
110
+ provider: 'tavily',
111
+ }));
112
+ }
113
+ /**
114
+ * One Firecrawl search. Currently disabled in the grounding pass
115
+ * because the production account is out of credits (HTTP 402). Kept
116
+ * for completeness so the grounding helper can light up Firecrawl
117
+ * automatically once credits are topped up — no code change required.
118
+ */
119
+ export async function searchFirecrawl(query, apiKey, maxResults = 5, fetchImpl = fetch) {
120
+ const res = await fetchImpl(FIRECRAWL_ENDPOINT, {
121
+ method: 'POST',
122
+ headers: {
123
+ 'Authorization': `Bearer ${apiKey}`,
124
+ 'Content-Type': 'application/json',
125
+ },
126
+ body: JSON.stringify({ query, limit: maxResults }),
127
+ });
128
+ if (!res.ok) {
129
+ throw new Error(`Firecrawl HTTP ${res.status}: ${await res.text().catch(() => '<no body>')}`);
130
+ }
131
+ const body = (await res.json());
132
+ const data = body.data ?? [];
133
+ return data
134
+ .filter((r) => typeof r.title === 'string' && typeof r.url === 'string')
135
+ .slice(0, maxResults)
136
+ .map((r) => ({
137
+ title: r.title,
138
+ link: r.url,
139
+ snippet: typeof r.description === 'string' ? r.description : '',
140
+ domain: urlDomain(r.url),
141
+ provider: 'firecrawl',
142
+ }));
143
+ }
144
+ /**
145
+ * Run the grounding pass for a scenario. For each derived query, fans
146
+ * out to every configured search provider (Serper, Tavily, Firecrawl)
147
+ * in parallel, dedupes by URL across providers + queries, and emits
148
+ * progress callbacks for the Quickstart UI.
86
149
  *
87
- * Returns null when SERPER_API_KEY is not set so the caller can skip
88
- * the whole stage gracefully (rather than fail the run).
150
+ * Provider selection: every provider whose API key is non-empty is
151
+ * tried. A provider that fails on every query (e.g. Firecrawl HTTP 402
152
+ * when out of credits) is reported in `providersFailed` rather than
153
+ * crashing the whole pass — the run continues with whatever providers
154
+ * are healthy.
155
+ *
156
+ * Returns null only when ALL providers are missing API keys; otherwise
157
+ * returns a result that may be partially-populated.
89
158
  */
90
159
  export async function groundScenario(scenario, options = {}) {
91
- const apiKey = options.serperApiKey ?? process.env.SERPER_API_KEY;
92
- if (!apiKey)
160
+ const serperKey = options.serperApiKey ?? process.env.SERPER_API_KEY ?? '';
161
+ const tavilyKey = options.tavilyApiKey ?? process.env.TAVILY_API_KEY ?? '';
162
+ const firecrawlKey = options.firecrawlApiKey ?? process.env.FIRECRAWL_API_KEY ?? '';
163
+ if (!serperKey && !tavilyKey && !firecrawlKey)
93
164
  return null;
94
- const maxPerQuery = options.maxResultsPerQuery ?? 5;
165
+ const maxPerQuery = options.maxResultsPerQuery ?? 4;
95
166
  const fetchImpl = options.fetchImpl ?? fetch;
96
167
  const t0 = Date.now();
97
168
  const queries = deriveGroundingQueries(scenario);
98
169
  const seenUrls = new Set();
99
170
  const citations = [];
100
171
  const emptyQueries = [];
101
- // Run all queries in parallel Serper is rate-limited per minute
102
- // not per second, so 3 simultaneous calls are well under any cap.
172
+ // Track per-provider success/failure across all queries so we can
173
+ // surface providersUsed / providersFailed at the end. We treat a
174
+ // provider as "used" when it returned at least one result for any
175
+ // query, "failed" when it errored on every query that asked it.
176
+ const providerSucceededAtLeastOnce = new Set();
177
+ const providerFailureMessages = new Map();
178
+ const providerCallCount = new Map();
179
+ const providerFailureCount = new Map();
180
+ const providersForQuery = (q) => {
181
+ const calls = [];
182
+ if (serperKey) {
183
+ calls.push({ provider: 'serper', fn: () => searchSerper(q, serperKey, maxPerQuery, fetchImpl) });
184
+ }
185
+ if (tavilyKey) {
186
+ calls.push({ provider: 'tavily', fn: () => searchTavily(q, tavilyKey, maxPerQuery, fetchImpl) });
187
+ }
188
+ if (firecrawlKey) {
189
+ calls.push({ provider: 'firecrawl', fn: () => searchFirecrawl(q, firecrawlKey, maxPerQuery, fetchImpl) });
190
+ }
191
+ return calls;
192
+ };
103
193
  await Promise.all(queries.map(async (q) => {
104
194
  options.onProgress?.({
105
195
  kind: 'query_started',
106
196
  query: q,
107
197
  elapsedMs: Date.now() - t0,
108
198
  });
109
- try {
110
- const raw = await searchSerper(q, apiKey, maxPerQuery, fetchImpl);
111
- const deduped = raw.filter((r) => {
112
- if (seenUrls.has(r.link))
113
- return false;
114
- seenUrls.add(r.link);
115
- return true;
116
- });
117
- if (deduped.length === 0)
118
- emptyQueries.push(q);
119
- citations.push({ query: q, sources: deduped });
120
- options.onProgress?.({
121
- kind: 'query_done',
122
- query: q,
123
- resultCount: deduped.length,
124
- totalCitations: seenUrls.size,
125
- elapsedMs: Date.now() - t0,
126
- });
199
+ const calls = providersForQuery(q);
200
+ const settled = await Promise.allSettled(calls.map((c) => c.fn()));
201
+ const merged = [];
202
+ for (let i = 0; i < calls.length; i += 1) {
203
+ const { provider } = calls[i];
204
+ const result = settled[i];
205
+ providerCallCount.set(provider, (providerCallCount.get(provider) ?? 0) + 1);
206
+ if (result.status === 'fulfilled') {
207
+ if (result.value.length > 0)
208
+ providerSucceededAtLeastOnce.add(provider);
209
+ merged.push(...result.value);
210
+ }
211
+ else {
212
+ providerFailureCount.set(provider, (providerFailureCount.get(provider) ?? 0) + 1);
213
+ const msg = result.reason instanceof Error ? result.reason.message : String(result.reason);
214
+ providerFailureMessages.set(provider, msg);
215
+ }
127
216
  }
128
- catch (err) {
217
+ // Dedup by URL across providers and prior queries so a Wikipedia
218
+ // hit that appears on both Serper + Tavily is shown once. The
219
+ // surviving copy is the first one we saw; later copies could
220
+ // theoretically merge metadata but the simple-first-wins rule
221
+ // is what the UI expects.
222
+ const deduped = merged.filter((r) => {
223
+ if (seenUrls.has(r.link))
224
+ return false;
225
+ seenUrls.add(r.link);
226
+ return true;
227
+ });
228
+ if (deduped.length === 0)
129
229
  emptyQueries.push(q);
130
- citations.push({ query: q, sources: [] });
131
- options.onProgress?.({
132
- kind: 'query_failed',
133
- query: q,
134
- error: err instanceof Error ? err.message : String(err),
135
- elapsedMs: Date.now() - t0,
230
+ citations.push({ query: q, sources: deduped });
231
+ options.onProgress?.({
232
+ kind: 'query_done',
233
+ query: q,
234
+ resultCount: deduped.length,
235
+ totalCitations: seenUrls.size,
236
+ elapsedMs: Date.now() - t0,
237
+ });
238
+ }));
239
+ // A provider is "failed" iff it was called for every query and
240
+ // failed every call. A provider that hit credits-exhausted on the
241
+ // first query and was therefore tried again on the second / third
242
+ // (and failed there too) gets reported. A provider that succeeded
243
+ // even once goes into providersUsed instead.
244
+ const providersFailed = [];
245
+ for (const [provider, fails] of providerFailureCount.entries()) {
246
+ if (providerSucceededAtLeastOnce.has(provider))
247
+ continue;
248
+ const calls = providerCallCount.get(provider) ?? 0;
249
+ if (calls > 0 && fails === calls) {
250
+ providersFailed.push({
251
+ provider,
252
+ reason: providerFailureMessages.get(provider) ?? 'unknown',
136
253
  });
137
254
  }
138
- }));
255
+ }
139
256
  const result = {
140
257
  citations,
141
258
  totalSources: seenUrls.size,
142
259
  durationMs: Date.now() - t0,
143
260
  emptyQueries,
261
+ providersUsed: [...providerSucceededAtLeastOnce],
262
+ providersFailed,
144
263
  };
145
264
  options.onProgress?.({
146
265
  kind: 'complete',