@clien-ai/mcp 0.1.5 → 0.1.6
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/dist/tools/registry.js +51 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/research.js +40 -18
- package/dist/tools/research.js.map +1 -1
- package/dist/tools/scoped-research.js +546 -0
- package/dist/tools/scoped-research.js.map +1 -0
- package/dist/types/report.js +38 -0
- package/dist/types/report.js.map +1 -1
- package/package.json +1 -1
package/dist/tools/registry.js
CHANGED
|
@@ -19,6 +19,7 @@ import { ListProjectsInputSchema, CreateProjectInputSchema, listProjects, create
|
|
|
19
19
|
import { CreatePersonaInputSchema, createPersona } from './personas.js';
|
|
20
20
|
import { ListReportsInputSchema, GetReportInputSchema, listReports, getReport, } from './reports.js';
|
|
21
21
|
import { InterviewPersonaInputSchema, interviewPersona } from './interview.js';
|
|
22
|
+
import { ScanCompetitorsInputSchema, scanCompetitors, SearchForumsInputSchema, searchForums, } from './scoped-research.js';
|
|
22
23
|
function defineTool(def) {
|
|
23
24
|
return { ...def, jsonSchema: zodToInputSchema(def.zodSchema) };
|
|
24
25
|
}
|
|
@@ -60,6 +61,56 @@ export const TOOLS = [
|
|
|
60
61
|
zodSchema: StatusInputSchema,
|
|
61
62
|
handler: (args, deps) => getResearchStatus(args, deps),
|
|
62
63
|
}),
|
|
64
|
+
defineTool({
|
|
65
|
+
name: 'scan_competitors',
|
|
66
|
+
description: 'Scan the competitive landscape for a product idea or market — a targeted, cheaper alternative ' +
|
|
67
|
+
'to the full clien_research report when you only need the COMPETITOR dimension. Runs one web ' +
|
|
68
|
+
'researcher (not the whole H1-H8 pipeline): typical wall time 2-10 minutes, progress streamed ' +
|
|
69
|
+
'via notifications/progress. Returns a structured list of competitors in `_meta.competitors` — ' +
|
|
70
|
+
'each with name, url, description, pricing, strengths[], weaknesses[], and relevantHypotheses[] — ' +
|
|
71
|
+
'plus a readable summary. ' +
|
|
72
|
+
'WHAT COUNTS AS A COMPETITOR: direct and adjacent products/services a target user would ' +
|
|
73
|
+
'realistically evaluate or already use to solve the same problem — including incumbents, ' +
|
|
74
|
+
'startups, and notable open-source or DIY alternatives; not tangential tools. Depth is a ' +
|
|
75
|
+
'focused landscape scan (roughly 3-10 competitors), not an exhaustive market map. ' +
|
|
76
|
+
'ATTACH TO A PROJECT so results are saved to the web app\'s Research → Competitors tab: pass ' +
|
|
77
|
+
'`project_id` for an existing project, or `project_name` to auto-create one. Without either, ' +
|
|
78
|
+
'the scan still returns competitors here but does NOT persist them. ' +
|
|
79
|
+
'Composes well: run this for a quick competitor spot-check, or before/after a pivot to compare ' +
|
|
80
|
+
'landscapes; for a COMPLETE validation (personas, interviews, synthesis) prefer clien_research. ' +
|
|
81
|
+
'This debits credits (a scoped web scan). ' +
|
|
82
|
+
'IMPORTANT: if the call drops mid-flight with "MCP error -32000", the job keeps running on the ' +
|
|
83
|
+
'backend — do NOT blindly re-call (that starts a new run and debits again); the job_id is logged ' +
|
|
84
|
+
'to the MCP server stderr as `[clien-mcp] scan_competitors started job_id=…`.',
|
|
85
|
+
zodSchema: ScanCompetitorsInputSchema,
|
|
86
|
+
handler: (args, deps) => scanCompetitors(args, deps),
|
|
87
|
+
}),
|
|
88
|
+
defineTool({
|
|
89
|
+
name: 'search_forums',
|
|
90
|
+
description: 'Search real community discussions (Reddit, Hacker News, Product Hunt) for PRODUCT-VALIDATION ' +
|
|
91
|
+
'signal about an idea or user problem — a targeted, cheaper alternative to the full clien_research ' +
|
|
92
|
+
'report when you only need the COMMUNITY dimension. Runs one forum researcher (not the whole ' +
|
|
93
|
+
'H1-H8 pipeline): typical wall time 2-10 minutes, progress streamed via notifications/progress. ' +
|
|
94
|
+
'Returns a structured list of threads in `_meta.threads` — each with title, url, platform, ' +
|
|
95
|
+
'sentimentSummary, relevantQuotes[], and (when available) upvotes and commentCount — plus a ' +
|
|
96
|
+
'readable summary. ' +
|
|
97
|
+
'WHAT IT LOOKS FOR: evidence about the PROBLEM and demand — people describing the pain point, ' +
|
|
98
|
+
'asking for a solution, or complaining about existing tools — not generic keyword hits. This is ' +
|
|
99
|
+
'NOT a generic web search; frame the topic as a user problem/audience for the best threads. ' +
|
|
100
|
+
'ATTACH TO A PROJECT so results are saved to the web app\'s Research → Community tab: pass ' +
|
|
101
|
+
'`project_id` for an existing project, or `project_name` to auto-create one. Without either, the ' +
|
|
102
|
+
'threads are returned here but NOT persisted. ' +
|
|
103
|
+
'Composes well with scan_competitors (demand + landscape) for a quick read on an idea — but run ' +
|
|
104
|
+
'the two SEQUENTIALLY when they target the same project: the backend allows one active research ' +
|
|
105
|
+
'run per project, so a parallel second call fails with 409. For a ' +
|
|
106
|
+
'COMPLETE validation (personas, interviews, synthesis) prefer clien_research. ' +
|
|
107
|
+
'This debits credits (a scoped forum scan). ' +
|
|
108
|
+
'IMPORTANT: if the call drops mid-flight with "MCP error -32000", the job keeps running on the ' +
|
|
109
|
+
'backend — do NOT blindly re-call (that starts a new run and debits again); the job_id is logged ' +
|
|
110
|
+
'to the MCP server stderr as `[clien-mcp] search_forums started job_id=…`.',
|
|
111
|
+
zodSchema: SearchForumsInputSchema,
|
|
112
|
+
handler: (args, deps) => searchForums(args, deps),
|
|
113
|
+
}),
|
|
63
114
|
defineTool({
|
|
64
115
|
name: 'list_projects',
|
|
65
116
|
description: 'List the caller\'s Clien.ai projects (newest first, paginated). Returns each ' +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAqB,MAAM,eAAe,CAAA;AACnF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,YAAY,EACZ,aAAa,GACd,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACvE,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,WAAW,EACX,SAAS,GACV,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/research.js
CHANGED
|
@@ -33,6 +33,12 @@ import { ToolError } from './errors.js';
|
|
|
33
33
|
const START_TIMEOUT_MS = 30_000;
|
|
34
34
|
const EVENTS_POLL_TIMEOUT_MS = 30_000;
|
|
35
35
|
const REPORT_FETCH_TIMEOUT_MS = 60_000;
|
|
36
|
+
// status=complete can race ahead of report persistence (~100ms window; see
|
|
37
|
+
// docs/solutions/integration-issues/validation-pipeline-multi-layer-failures.md).
|
|
38
|
+
// A 200 with null reportMarkdown right after a terminal status is a transient
|
|
39
|
+
// gap, not a real empty report — retry a few times before failing.
|
|
40
|
+
const REPORT_MAX_ATTEMPTS = 3;
|
|
41
|
+
const REPORT_RETRY_DELAY_MS = 1500;
|
|
36
42
|
export const ResearchInputSchema = z.object({
|
|
37
43
|
idea: z
|
|
38
44
|
.string()
|
|
@@ -329,27 +335,43 @@ export async function runResearch(input, deps) {
|
|
|
329
335
|
const text = await eventsResponse.text().catch(() => '');
|
|
330
336
|
throw new ResearchToolError(`Unexpected error polling events (HTTP ${eventsResponse.status}): ${truncate(text, 200)}`, { jobId });
|
|
331
337
|
}
|
|
332
|
-
// 3. Fetch final report (JSON variant)
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
338
|
+
// 3. Fetch final report (JSON variant). A 200 with null reportMarkdown right
|
|
339
|
+
// after a terminal status is the persistence race, not a real empty report —
|
|
340
|
+
// retry a few times (using the injected sleep so it stays deterministic in
|
|
341
|
+
// tests) before surfacing the empty-report error.
|
|
342
|
+
let reportJson = null;
|
|
343
|
+
for (let attempt = 1; attempt <= REPORT_MAX_ATTEMPTS; attempt += 1) {
|
|
344
|
+
let reportResponse;
|
|
345
|
+
try {
|
|
346
|
+
reportResponse = await apiCall(ctx, 'GET', `/api/validate/${jobId}/report`, { acceptJson: true, timeoutMs: REPORT_FETCH_TIMEOUT_MS });
|
|
341
347
|
}
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
throw new ResearchToolError(`The research run ${status === 'failed' ? 'failed' : 'did not produce a report'}. See ${webJobUrl(deps.config, jobId)} for details.`, { jobId });
|
|
348
|
+
catch (err) {
|
|
349
|
+
const e = err;
|
|
350
|
+
if (e.name === 'AbortError' || e.name === 'TimeoutError') {
|
|
351
|
+
throw new ResearchToolError(`Clien.ai report fetch timed out after ${REPORT_FETCH_TIMEOUT_MS / 1000}s. Job ${jobId} completed; view at ${webJobUrl(deps.config, jobId)}.`, { jobId });
|
|
352
|
+
}
|
|
353
|
+
throw err;
|
|
349
354
|
}
|
|
350
|
-
|
|
355
|
+
if (!reportResponse.ok) {
|
|
356
|
+
// Non-OK responses are not part of the persistence race — surface
|
|
357
|
+
// immediately without retrying.
|
|
358
|
+
if (reportResponse.status === 404) {
|
|
359
|
+
throw new ResearchToolError(`The research run ${status === 'failed' ? 'failed' : 'did not produce a report'}. See ${webJobUrl(deps.config, jobId)} for details.`, { jobId });
|
|
360
|
+
}
|
|
361
|
+
throw new ResearchToolError(`Failed to fetch report (HTTP ${reportResponse.status}). Job ${jobId} completed with status "${status}". See ${webJobUrl(deps.config, jobId)}.`, { jobId });
|
|
362
|
+
}
|
|
363
|
+
reportJson = (await reportResponse.json().catch(() => null));
|
|
364
|
+
if (reportJson?.reportMarkdown)
|
|
365
|
+
break;
|
|
366
|
+
// 200 with falsy reportMarkdown — retry unless we've exhausted attempts.
|
|
367
|
+
if (attempt < REPORT_MAX_ATTEMPTS) {
|
|
368
|
+
await sleepImpl(REPORT_RETRY_DELAY_MS);
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
throw new ResearchToolError(`Report is empty for job ${jobId}. View at ${webJobUrl(deps.config, jobId)}.`, { jobId });
|
|
351
372
|
}
|
|
352
|
-
|
|
373
|
+
// The loop only exits without throwing once reportMarkdown is present; this
|
|
374
|
+
// guard is effectively unreachable but narrows `reportJson` for TypeScript.
|
|
353
375
|
if (!reportJson?.reportMarkdown) {
|
|
354
376
|
throw new ResearchToolError(`Report is empty for job ${jobId}. View at ${webJobUrl(deps.config, jobId)}.`, { jobId });
|
|
355
377
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scoped research primitives — `scan_competitors` (FUL-30) and `search_forums` (FUL-29).
|
|
3
|
+
*
|
|
4
|
+
* These are the composable, cheaper counterparts to the `clien_research` hero: each runs exactly
|
|
5
|
+
* ONE researcher (web OR forum) as a bounded E2B job rather than the full H1–H8 pipeline. The MCP
|
|
6
|
+
* package stays a thin bearer-auth HTTP client — this module orchestrates the same start+poll
|
|
7
|
+
* lifecycle `research.ts` uses, over the scoped endpoints:
|
|
8
|
+
*
|
|
9
|
+
* 1. Resolve a project (an explicit `project_id`, else auto-create from `project_name`, else
|
|
10
|
+
* a standalone run). A project is what makes results land in the web app's Research tab.
|
|
11
|
+
* 2. POST /api/validate/scoped/start { mode, topic, productName?, projectId? } -> { jobId }.
|
|
12
|
+
* The server derives the per-tool credit cost from `mode` and debits ONCE, after a confirmed
|
|
13
|
+
* spawn (see the scoped route + spawnScopedSandboxBackground) — the tool never touches billing.
|
|
14
|
+
* 3. Poll /api/validate/{jobId}/events every `pollIntervalMs` until a terminal status, forwarding
|
|
15
|
+
* progress as MCP notifications/progress so a multi-minute run keeps the caller's timeout alive.
|
|
16
|
+
* 4. On `complete`, POST /api/validate/{jobId}/promote (best-effort) so the findings promote into
|
|
17
|
+
* the project's Research collections tagged source='mcp'; then GET /api/validate/{jobId}/report
|
|
18
|
+
* (Accept: application/json) for the structured `report_data`.
|
|
19
|
+
* 5. Return the RICH slice — `report_data.webResearch.competitors[]` (name/url/description/pricing/
|
|
20
|
+
* strengths/weaknesses/relevantHypotheses) or `report_data.forumResearch.threads[]`
|
|
21
|
+
* (title/url/platform/sentimentSummary/relevantQuotes/upvotes/commentCount) — plus a readable
|
|
22
|
+
* summary. These primitives NEVER create personas or interviews (collection-only).
|
|
23
|
+
*
|
|
24
|
+
* HTTP machinery (auth, 401→refresh→retry, per-endpoint timeouts, error categorization) is reused
|
|
25
|
+
* from `research.ts` — no new client. Only the scoped orchestration loop lives here.
|
|
26
|
+
*/
|
|
27
|
+
import { z } from 'zod';
|
|
28
|
+
import { CompetitorProfileSchema, ForumThreadSchema, } from '../types/report.js';
|
|
29
|
+
import { ToolError } from './errors.js';
|
|
30
|
+
import { apiCall, categorizeFetchError, truncate, webJobUrl, } from './research.js';
|
|
31
|
+
// Per-endpoint timeouts. Node fetch has no implicit timeout, so a hung endpoint would otherwise
|
|
32
|
+
// wedge the MCP server forever (mirrors research.ts:START/EVENTS/REPORT_TIMEOUT_MS).
|
|
33
|
+
const START_TIMEOUT_MS = 30_000;
|
|
34
|
+
const EVENTS_POLL_TIMEOUT_MS = 30_000;
|
|
35
|
+
const PROMOTE_TIMEOUT_MS = 30_000;
|
|
36
|
+
const REPORT_FETCH_TIMEOUT_MS = 60_000;
|
|
37
|
+
/**
|
|
38
|
+
* A scoped run is a single researcher (~1–10 min), an order of magnitude shorter than the hero's
|
|
39
|
+
* 15–25 min. Cap generously so a slow-but-progressing run isn't killed, but bounded so a wedged
|
|
40
|
+
* job surfaces instead of hanging. Overridable via deps for tests.
|
|
41
|
+
*/
|
|
42
|
+
const DEFAULT_MAX_DURATION_MS = 15 * 60_000;
|
|
43
|
+
const TERMINAL_STATUSES = new Set(['complete', 'failed', 'cancelled']);
|
|
44
|
+
// Coarse phase -> progress (0..1). We emit on every events batch; the exact number matters less
|
|
45
|
+
// than emitting *something* each poll so the SDK's resetTimeoutOnProgress keeps the call alive.
|
|
46
|
+
const PHASE_PROGRESS = {
|
|
47
|
+
initialising: 0.1,
|
|
48
|
+
researching: 0.5,
|
|
49
|
+
synthesising: 0.85,
|
|
50
|
+
complete: 1,
|
|
51
|
+
failed: 1,
|
|
52
|
+
cancelled: 1,
|
|
53
|
+
};
|
|
54
|
+
/** Human label + started-log tool name per mode. */
|
|
55
|
+
const MODE_META = {
|
|
56
|
+
web: { tool: 'scan_competitors', label: 'Competitor scan', noun: 'competitors' },
|
|
57
|
+
forum: { tool: 'search_forums', label: 'Forum search', noun: 'community threads' },
|
|
58
|
+
};
|
|
59
|
+
// Input caps. Re-declared locally (the @clien-ai/mcp package is published separately and cannot
|
|
60
|
+
// import from the Next.js app); kept in sync with MIN_IDEA_LENGTH (20) / MAX_IDEA_LENGTH (10_000) /
|
|
61
|
+
// PROJECT_NAME_MAX (100). The server re-validates regardless — this is the advertised spec.
|
|
62
|
+
const TOPIC_MIN = 20;
|
|
63
|
+
const TOPIC_MAX = 10_000;
|
|
64
|
+
const PROJECT_NAME_MAX = 100;
|
|
65
|
+
/** Fields shared by both scoped tools; each tool wraps these with a tool-specific `topic` blurb. */
|
|
66
|
+
const sharedScopedFields = {
|
|
67
|
+
product_name: z
|
|
68
|
+
.string()
|
|
69
|
+
.trim()
|
|
70
|
+
.min(1, 'product_name must be non-empty')
|
|
71
|
+
.max(PROJECT_NAME_MAX, `product_name too long (max ${PROJECT_NAME_MAX} chars)`)
|
|
72
|
+
.optional()
|
|
73
|
+
.describe('Optional short product/brand name for research context (2-4 words). Sharpens the ' +
|
|
74
|
+
'researcher\'s framing; defaults to a slug of `topic` when omitted.'),
|
|
75
|
+
project_id: z
|
|
76
|
+
.string()
|
|
77
|
+
.uuid()
|
|
78
|
+
.optional()
|
|
79
|
+
.describe('Clien.ai project UUID to attach this scan to. REQUIRED for the results to be saved to the ' +
|
|
80
|
+
'project\'s Research tab (competitors/community collections are project-scoped). Call ' +
|
|
81
|
+
'`list_projects` to find one. When omitted, supply `project_name` to auto-create a project, ' +
|
|
82
|
+
'or the scan runs standalone (results returned here but NOT persisted).'),
|
|
83
|
+
project_name: z
|
|
84
|
+
.string()
|
|
85
|
+
.trim()
|
|
86
|
+
.min(1, 'project_name must be non-empty')
|
|
87
|
+
.max(PROJECT_NAME_MAX, `project_name too long (max ${PROJECT_NAME_MAX} chars)`)
|
|
88
|
+
.optional()
|
|
89
|
+
.describe('Name for a NEW Clien.ai project to auto-create and attach this scan to. Supply this (a short ' +
|
|
90
|
+
'2-4 word product name) whenever you do NOT already have a `project_id`, so the findings are ' +
|
|
91
|
+
'discoverable in the web app\'s Research tab. The project is created server-side ONLY when ' +
|
|
92
|
+
'the run is accepted — insufficient credits or an active-run conflict will not create it, ' +
|
|
93
|
+
'and retries never mint duplicates. Ignored when `project_id` is provided.'),
|
|
94
|
+
};
|
|
95
|
+
export const ScanCompetitorsInputSchema = z.object({
|
|
96
|
+
// .trim() BEFORE .min(): without it, 20+ whitespace chars pass both this and the server's
|
|
97
|
+
// untrimmed min-length check, then the server's sanitizer trims the prompt to empty AFTER
|
|
98
|
+
// validation — a debited run with a blank problem statement. (review: adversarial-codex)
|
|
99
|
+
topic: z
|
|
100
|
+
.string()
|
|
101
|
+
.trim()
|
|
102
|
+
.min(TOPIC_MIN, `topic must be at least ${TOPIC_MIN} characters`)
|
|
103
|
+
.max(TOPIC_MAX, 'topic too long')
|
|
104
|
+
.describe('The product, idea, or market to scan the competitive landscape for. Describe it in a ' +
|
|
105
|
+
'sentence or two (min 20 chars) — e.g. "an AI meeting-notes tool for remote engineering ' +
|
|
106
|
+
'teams that auto-files action items into Linear". More context yields sharper competitor ' +
|
|
107
|
+
'discovery.'),
|
|
108
|
+
...sharedScopedFields,
|
|
109
|
+
});
|
|
110
|
+
export const SearchForumsInputSchema = z.object({
|
|
111
|
+
// .trim() before .min() — same rationale as ScanCompetitorsInputSchema.topic above.
|
|
112
|
+
topic: z
|
|
113
|
+
.string()
|
|
114
|
+
.trim()
|
|
115
|
+
.min(TOPIC_MIN, `topic must be at least ${TOPIC_MIN} characters`)
|
|
116
|
+
.max(TOPIC_MAX, 'topic too long')
|
|
117
|
+
.describe('The user problem, product idea, or audience to search community discussions for — framed as a ' +
|
|
118
|
+
'PROBLEM, not a keyword (min 20 chars). e.g. "how remote engineering teams currently capture ' +
|
|
119
|
+
'and track action items from meetings, and what frustrates them". This mines PRODUCT-VALIDATION ' +
|
|
120
|
+
'signal on Reddit / Hacker News / Product Hunt (pain points, demand signals, gripes about ' +
|
|
121
|
+
'existing tools) — it is NOT a generic web search. The more the topic names the audience and ' +
|
|
122
|
+
'their pain, the better the threads.'),
|
|
123
|
+
...sharedScopedFields,
|
|
124
|
+
});
|
|
125
|
+
export class ScopedResearchToolError extends ToolError {
|
|
126
|
+
}
|
|
127
|
+
const defaultSleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
128
|
+
// ------------------------------------------------------------------
|
|
129
|
+
// Public tool handlers
|
|
130
|
+
// ------------------------------------------------------------------
|
|
131
|
+
/**
|
|
132
|
+
* `scan_competitors` (FUL-30) — run a scoped WEB researcher and return the competitive landscape.
|
|
133
|
+
*/
|
|
134
|
+
export async function scanCompetitors(input, deps) {
|
|
135
|
+
const parsed = ScanCompetitorsInputSchema.safeParse(input);
|
|
136
|
+
if (!parsed.success) {
|
|
137
|
+
throw new ScopedResearchToolError(`Invalid input — ${formatZodError(parsed.error)}`);
|
|
138
|
+
}
|
|
139
|
+
return runScopedResearchTool('web', parsed.data, deps);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* `search_forums` (FUL-29) — run a scoped FORUM researcher and return community/forum signal.
|
|
143
|
+
*/
|
|
144
|
+
export async function searchForums(input, deps) {
|
|
145
|
+
const parsed = SearchForumsInputSchema.safeParse(input);
|
|
146
|
+
if (!parsed.success) {
|
|
147
|
+
throw new ScopedResearchToolError(`Invalid input — ${formatZodError(parsed.error)}`);
|
|
148
|
+
}
|
|
149
|
+
return runScopedResearchTool('forum', parsed.data, deps);
|
|
150
|
+
}
|
|
151
|
+
async function runScopedResearchTool(mode, input, deps) {
|
|
152
|
+
const { topic, product_name, project_id, project_name } = input;
|
|
153
|
+
const meta = MODE_META[mode];
|
|
154
|
+
const fetchImpl = deps.fetch ?? fetch;
|
|
155
|
+
const sleepImpl = deps.sleep ?? defaultSleep;
|
|
156
|
+
const pollIntervalMs = deps.pollIntervalMs ?? deps.config.pollIntervalMs;
|
|
157
|
+
const ctx = { config: deps.config, session: deps.session, fetch: fetchImpl };
|
|
158
|
+
// 1. Resolve the project: an explicit id wins. A project_name is FORWARDED to the server,
|
|
159
|
+
// which auto-creates the project only after its billing/infra gates accept the run — so a
|
|
160
|
+
// refused start (402/409/503) never strands an orphan project and a retry never mints a
|
|
161
|
+
// duplicate. The created id comes back in the 202 echo below. (review FUL-30 #1)
|
|
162
|
+
let projectId = project_id ?? null;
|
|
163
|
+
// 2. Start the scoped job. The server derives the billing tool + cost from `mode`.
|
|
164
|
+
const startBody = {
|
|
165
|
+
mode,
|
|
166
|
+
topic,
|
|
167
|
+
};
|
|
168
|
+
if (product_name)
|
|
169
|
+
startBody.productName = product_name;
|
|
170
|
+
if (projectId)
|
|
171
|
+
startBody.projectId = projectId;
|
|
172
|
+
if (!projectId && project_name)
|
|
173
|
+
startBody.projectName = project_name;
|
|
174
|
+
let startResponse;
|
|
175
|
+
try {
|
|
176
|
+
startResponse = await apiCall(ctx, 'POST', '/api/validate/scoped/start', {
|
|
177
|
+
body: startBody,
|
|
178
|
+
timeoutMs: START_TIMEOUT_MS,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
throwIfTimeout(err, `${meta.label} start endpoint timed out after ${START_TIMEOUT_MS / 1000}s. Try again in a moment.`);
|
|
183
|
+
throw err;
|
|
184
|
+
}
|
|
185
|
+
if (!startResponse.ok) {
|
|
186
|
+
if (startResponse.status === 401)
|
|
187
|
+
deps.invalidateSession?.();
|
|
188
|
+
await handleScopedStartError(startResponse, meta.label);
|
|
189
|
+
}
|
|
190
|
+
const startJson = (await startResponse.json().catch(() => null));
|
|
191
|
+
if (!startJson?.jobId) {
|
|
192
|
+
throw new ScopedResearchToolError(`Clien.ai accepted the ${meta.tool} request but did not return a job id. Please try again.`);
|
|
193
|
+
}
|
|
194
|
+
const jobId = startJson.jobId;
|
|
195
|
+
// The scoped route echoes the resolved projectId; trust it over our local copy.
|
|
196
|
+
if (startJson.projectId !== undefined)
|
|
197
|
+
projectId = startJson.projectId;
|
|
198
|
+
// stderr breadcrumb: surfaces the job_id in the host's MCP log before the multi-minute run, so a
|
|
199
|
+
// mid-flight -32000 drop is recoverable (mirrors research.ts).
|
|
200
|
+
console.error(`[clien-mcp] ${meta.tool} started job_id=${jobId}`);
|
|
201
|
+
await emitProgress(deps, { progress: 0, total: 1, message: `${meta.label} started (job ${jobId})` });
|
|
202
|
+
// 3. Poll to a terminal status.
|
|
203
|
+
const poll = await pollScopedJob(ctx, jobId, {
|
|
204
|
+
sleep: sleepImpl,
|
|
205
|
+
pollIntervalMs,
|
|
206
|
+
deadline: Date.now() + (deps.maxDurationMs ?? DEFAULT_MAX_DURATION_MS),
|
|
207
|
+
onProgress: deps.onProgress,
|
|
208
|
+
invalidateSession: deps.invalidateSession,
|
|
209
|
+
label: meta.label,
|
|
210
|
+
config: deps.config,
|
|
211
|
+
});
|
|
212
|
+
// 4. Non-complete terminal state -> surface the reason.
|
|
213
|
+
if (poll.status !== 'complete') {
|
|
214
|
+
const reason = poll.lastMessage ? ` (${poll.lastMessage})` : '';
|
|
215
|
+
throw new ScopedResearchToolError(`${meta.label} ${poll.status === 'failed' ? 'failed' : 'was cancelled'}${reason}. ` +
|
|
216
|
+
`No ${meta.noun} were produced — try a more specific topic, or view ${webJobUrl(deps.config, jobId)}.`, { jobId });
|
|
217
|
+
}
|
|
218
|
+
// 5. Promote into the Research collections (best-effort — needs a project; standalone runs skip).
|
|
219
|
+
let promoted = false;
|
|
220
|
+
if (projectId) {
|
|
221
|
+
promoted = await promoteScopedJob(ctx, jobId);
|
|
222
|
+
}
|
|
223
|
+
// 6. Fetch the structured report.
|
|
224
|
+
const reportData = await fetchScopedReport(ctx, jobId, deps.config);
|
|
225
|
+
// 7. Extract the RICH slice + build the result.
|
|
226
|
+
return buildScopedResult({
|
|
227
|
+
mode,
|
|
228
|
+
jobId,
|
|
229
|
+
status: poll.status,
|
|
230
|
+
projectId,
|
|
231
|
+
promoted,
|
|
232
|
+
reportData,
|
|
233
|
+
topic,
|
|
234
|
+
totalCostCents: poll.totalCostCents,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Poll /events until a terminal status. Backs off on transient 5xx / poll timeouts (2s,5s,10s, then
|
|
239
|
+
* bail after 3 consecutive), invalidates the session on a genuine 401, and enforces `deadline`.
|
|
240
|
+
* Emits coarse progress each batch so the caller's timeout resets.
|
|
241
|
+
*/
|
|
242
|
+
async function pollScopedJob(ctx, jobId, deps) {
|
|
243
|
+
let status = 'initialising';
|
|
244
|
+
let lastSequence = 0;
|
|
245
|
+
let lastMessage = null;
|
|
246
|
+
let totalCostCents;
|
|
247
|
+
let consecutiveServerErrors = 0;
|
|
248
|
+
while (!TERMINAL_STATUSES.has(status)) {
|
|
249
|
+
if (Date.now() > deps.deadline) {
|
|
250
|
+
throw new ScopedResearchToolError(`${deps.label} did not complete within the allotted time. The job may still be running — ` +
|
|
251
|
+
`check ${webJobUrl(deps.config, jobId)}.`, { jobId });
|
|
252
|
+
}
|
|
253
|
+
await deps.sleep(deps.pollIntervalMs);
|
|
254
|
+
let response;
|
|
255
|
+
try {
|
|
256
|
+
response = await apiCall(ctx, 'GET', `/api/validate/${jobId}/events?since=${lastSequence}&limit=100`, {
|
|
257
|
+
timeoutMs: EVENTS_POLL_TIMEOUT_MS,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
catch (err) {
|
|
261
|
+
if (isTimeout(err)) {
|
|
262
|
+
if (await backoffOrBail(deps, ++consecutiveServerErrors, jobId, 'network timeouts polling /events'))
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
throw err;
|
|
266
|
+
}
|
|
267
|
+
if (response.ok) {
|
|
268
|
+
consecutiveServerErrors = 0;
|
|
269
|
+
const data = (await response.json().catch(() => null));
|
|
270
|
+
if (data?.job?.status)
|
|
271
|
+
status = data.job.status;
|
|
272
|
+
if (typeof data?.job?.totalCostCents === 'number')
|
|
273
|
+
totalCostCents = data.job.totalCostCents;
|
|
274
|
+
if (typeof data?.lastSequence === 'number')
|
|
275
|
+
lastSequence = data.lastSequence;
|
|
276
|
+
const summary = summarizeEvent(data?.events);
|
|
277
|
+
if (summary)
|
|
278
|
+
lastMessage = summary;
|
|
279
|
+
await emitProgress(deps, {
|
|
280
|
+
progress: PHASE_PROGRESS[status] ?? 0.5,
|
|
281
|
+
total: 1,
|
|
282
|
+
message: summary ?? `phase: ${status}`,
|
|
283
|
+
});
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
const category = categorizeFetchError(response.status);
|
|
287
|
+
if (category === 'auth') {
|
|
288
|
+
if (response.refreshError?.kind === 'transient') {
|
|
289
|
+
if (await backoffOrBail(deps, ++consecutiveServerErrors, jobId, 'network errors refreshing session'))
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
deps.invalidateSession?.();
|
|
293
|
+
throw new ScopedResearchToolError(`Session expired during ${deps.label.toLowerCase()}. The run may still be in progress — view ` +
|
|
294
|
+
`${webJobUrl(deps.config, jobId)} or re-run the tool to re-authenticate.`, { jobId });
|
|
295
|
+
}
|
|
296
|
+
if (category === 'server') {
|
|
297
|
+
if (await backoffOrBail(deps, ++consecutiveServerErrors, jobId, 'server errors'))
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
if (category === 'credits') {
|
|
301
|
+
// Extremely unlikely mid-run; the server 402s at start.
|
|
302
|
+
throw new ScopedResearchToolError('Insufficient credits — buy more at https://clien.ai/app/billing', { jobId });
|
|
303
|
+
}
|
|
304
|
+
const text = await response.text().catch(() => '');
|
|
305
|
+
throw new ScopedResearchToolError(`Unexpected error polling ${deps.label.toLowerCase()} events (HTTP ${response.status}): ${truncate(text, 200)}`, { jobId });
|
|
306
|
+
}
|
|
307
|
+
return { status, lastMessage, totalCostCents };
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Backoff helper for transient poll failures. Returns true if the caller should `continue` (backed
|
|
311
|
+
* off), or throws once the consecutive-error budget (3) is spent.
|
|
312
|
+
*/
|
|
313
|
+
async function backoffOrBail(deps, consecutive, jobId, what) {
|
|
314
|
+
if (consecutive >= 3) {
|
|
315
|
+
throw new ScopedResearchToolError(`Repeated ${what} during ${deps.label.toLowerCase()}. The job may still be running — check ${webJobUrl(deps.config, jobId)}.`, { jobId });
|
|
316
|
+
}
|
|
317
|
+
const backoffMs = [2000, 5000, 10_000][consecutive - 1] ?? 10_000;
|
|
318
|
+
await deps.sleep(backoffMs);
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
321
|
+
// ------------------------------------------------------------------
|
|
322
|
+
// Promote + report
|
|
323
|
+
// ------------------------------------------------------------------
|
|
324
|
+
/**
|
|
325
|
+
* Fire the completion promotion (POST /promote). Best-effort: on any failure we log to stderr and
|
|
326
|
+
* return false — the tool still returns the findings, and the server's stale-job sweep re-promotes
|
|
327
|
+
* later. The server derives source='mcp' from the job config, so nothing is passed here.
|
|
328
|
+
*
|
|
329
|
+
* Success is judged by the response BODY, not just the HTTP status: the route returns 200 when the
|
|
330
|
+
* hero step succeeded even if the COLLECTIONS step failed — and for a scoped scan collections are
|
|
331
|
+
* the only promoted payload. The route reports the collections outcome additively; an absent field
|
|
332
|
+
* (older server) is treated as success for backward compatibility. (review FUL-30 #10)
|
|
333
|
+
*/
|
|
334
|
+
async function promoteScopedJob(ctx, jobId) {
|
|
335
|
+
try {
|
|
336
|
+
const response = await apiCall(ctx, 'POST', `/api/validate/${jobId}/promote`, {
|
|
337
|
+
timeoutMs: PROMOTE_TIMEOUT_MS,
|
|
338
|
+
});
|
|
339
|
+
if (response.ok) {
|
|
340
|
+
const body = (await response.json().catch(() => null));
|
|
341
|
+
if (body?.collections?.error == null)
|
|
342
|
+
return true;
|
|
343
|
+
console.error(`[clien-mcp] promote for job ${jobId} returned 200 but the collections step failed: ` +
|
|
344
|
+
`${body.collections.error} — findings will appear in the Research tab after the next server sweep`);
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
const text = await response.text().catch(() => '');
|
|
348
|
+
console.error(`[clien-mcp] promote failed for job ${jobId} (HTTP ${response.status}): ${truncate(text, 200)} — ` +
|
|
349
|
+
'findings will appear in the Research tab after the next server sweep');
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
catch (err) {
|
|
353
|
+
console.error(`[clien-mcp] promote request errored for job ${jobId}:`, err instanceof Error ? err.message : String(err));
|
|
354
|
+
return false;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
/** GET the structured report (JSON variant). Returns report_data (may be null). */
|
|
358
|
+
async function fetchScopedReport(ctx, jobId, config) {
|
|
359
|
+
let response;
|
|
360
|
+
try {
|
|
361
|
+
response = await apiCall(ctx, 'GET', `/api/validate/${jobId}/report`, {
|
|
362
|
+
acceptJson: true,
|
|
363
|
+
timeoutMs: REPORT_FETCH_TIMEOUT_MS,
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
catch (err) {
|
|
367
|
+
throwIfTimeout(err, `Report fetch timed out after ${REPORT_FETCH_TIMEOUT_MS / 1000}s. Job ${jobId} completed; view at ${webJobUrl(config, jobId)}.`);
|
|
368
|
+
throw err;
|
|
369
|
+
}
|
|
370
|
+
if (!response.ok) {
|
|
371
|
+
throw new ScopedResearchToolError(`Failed to fetch the ${jobId} report (HTTP ${response.status}). The run completed — see ${webJobUrl(config, jobId)}.`, { jobId });
|
|
372
|
+
}
|
|
373
|
+
const json = (await response.json().catch(() => null));
|
|
374
|
+
return json?.reportData ?? null;
|
|
375
|
+
}
|
|
376
|
+
// ------------------------------------------------------------------
|
|
377
|
+
// Result building
|
|
378
|
+
// ------------------------------------------------------------------
|
|
379
|
+
function buildScopedResult(args) {
|
|
380
|
+
const { mode, jobId, status, projectId, promoted, reportData, topic, totalCostCents } = args;
|
|
381
|
+
const persistenceLine = projectId
|
|
382
|
+
? promoted
|
|
383
|
+
? `Saved to the project's Research → ${mode === 'web' ? 'Competitors' : 'Community'} tab.`
|
|
384
|
+
: `Attached to project ${projectId}; the Research tab will populate shortly (promotion is retrying).`
|
|
385
|
+
: 'Not attached to a project — results are returned here but NOT saved. Pass `project_id` or ' +
|
|
386
|
+
'`project_name` to persist them to your Research tab.';
|
|
387
|
+
const base = {
|
|
388
|
+
job_id: jobId,
|
|
389
|
+
status,
|
|
390
|
+
project_id: projectId,
|
|
391
|
+
promoted,
|
|
392
|
+
report_data: reportData,
|
|
393
|
+
...(totalCostCents !== undefined ? { total_cost_cents: totalCostCents } : {}),
|
|
394
|
+
};
|
|
395
|
+
if (mode === 'web') {
|
|
396
|
+
const competitors = extractItems(reportData, ['webResearch', 'competitors'], CompetitorProfileSchema);
|
|
397
|
+
return {
|
|
398
|
+
content: [{ type: 'text', text: renderCompetitors(competitors, topic, persistenceLine) }],
|
|
399
|
+
_meta: { ...base, competitors },
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
const threads = extractItems(reportData, ['forumResearch', 'threads'], ForumThreadSchema);
|
|
403
|
+
return {
|
|
404
|
+
content: [{ type: 'text', text: renderThreads(threads, topic, persistenceLine) }],
|
|
405
|
+
_meta: { ...base, threads },
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Pull an array out of report_data at `path` and validate each element against `schema`.
|
|
410
|
+
* Elements that FAIL validation are DROPPED from the typed result (with a stderr note) rather
|
|
411
|
+
* than passed through raw: the schemas are `.passthrough()` with almost-all-optional fields, so
|
|
412
|
+
* a failure means a declared field has the WRONG TYPE (e.g. strengths as a string) — exactly the
|
|
413
|
+
* shapes the renderers crash on, which would destroy the whole result of a completed, debited
|
|
414
|
+
* run. The raw, unfiltered payload always survives untouched in `_meta.report_data`, so no data
|
|
415
|
+
* is lost to the caller. (review FUL-30 #5, validator-reproduced crash)
|
|
416
|
+
*/
|
|
417
|
+
function extractItems(reportData, path, schema) {
|
|
418
|
+
let node = reportData;
|
|
419
|
+
for (const key of path) {
|
|
420
|
+
if (node && typeof node === 'object')
|
|
421
|
+
node = node[key];
|
|
422
|
+
else
|
|
423
|
+
return [];
|
|
424
|
+
}
|
|
425
|
+
if (!Array.isArray(node))
|
|
426
|
+
return [];
|
|
427
|
+
const items = [];
|
|
428
|
+
let dropped = 0;
|
|
429
|
+
for (const raw of node) {
|
|
430
|
+
const parsed = schema.safeParse(raw);
|
|
431
|
+
if (parsed.success)
|
|
432
|
+
items.push(parsed.data);
|
|
433
|
+
else
|
|
434
|
+
dropped += 1;
|
|
435
|
+
}
|
|
436
|
+
if (dropped > 0) {
|
|
437
|
+
console.error(`[clien-mcp] dropped ${dropped} malformed ${path.join('.')} element(s) from the typed result; ` +
|
|
438
|
+
'the raw payload is preserved in _meta.report_data');
|
|
439
|
+
}
|
|
440
|
+
return items;
|
|
441
|
+
}
|
|
442
|
+
function renderCompetitors(competitors, topic, persistenceLine) {
|
|
443
|
+
if (competitors.length === 0) {
|
|
444
|
+
return `No competitors surfaced for "${truncate(topic, 120)}". ${persistenceLine}`;
|
|
445
|
+
}
|
|
446
|
+
const lines = competitors.map((c, i) => {
|
|
447
|
+
const header = `${i + 1}. **${c.name || 'Unnamed competitor'}**${c.pricing ? ` — ${c.pricing}` : ''}`;
|
|
448
|
+
const desc = c.description ? `\n ${truncate(c.description, 240)}` : '';
|
|
449
|
+
const url = c.url ? `\n ${c.url}` : '';
|
|
450
|
+
const strengths = c.strengths?.length ? `\n Strengths: ${c.strengths.join('; ')}` : '';
|
|
451
|
+
const weaknesses = c.weaknesses?.length ? `\n Weaknesses: ${c.weaknesses.join('; ')}` : '';
|
|
452
|
+
return `${header}${desc}${url}${strengths}${weaknesses}`;
|
|
453
|
+
});
|
|
454
|
+
return (`Found ${competitors.length} competitor${competitors.length === 1 ? '' : 's'} for "${truncate(topic, 120)}":\n\n` +
|
|
455
|
+
`${lines.join('\n\n')}\n\n${persistenceLine}`);
|
|
456
|
+
}
|
|
457
|
+
function renderThreads(threads, topic, persistenceLine) {
|
|
458
|
+
if (threads.length === 0) {
|
|
459
|
+
return `No community threads surfaced for "${truncate(topic, 120)}". ${persistenceLine}`;
|
|
460
|
+
}
|
|
461
|
+
const lines = threads.map((t, i) => {
|
|
462
|
+
const platform = t.platform ? ` [${t.platform}${t.subreddit ? `/${t.subreddit}` : ''}]` : '';
|
|
463
|
+
const header = `${i + 1}. **${truncate(t.title || 'Untitled thread', 160)}**${platform}`;
|
|
464
|
+
const sentiment = t.sentimentSummary ? `\n ${truncate(t.sentimentSummary, 240)}` : '';
|
|
465
|
+
const url = t.url ? `\n ${t.url}` : '';
|
|
466
|
+
const quote = t.relevantQuotes?.length ? `\n "${truncate(t.relevantQuotes[0] ?? '', 200)}"` : '';
|
|
467
|
+
return `${header}${sentiment}${url}${quote}`;
|
|
468
|
+
});
|
|
469
|
+
return (`Found ${threads.length} community thread${threads.length === 1 ? '' : 's'} for "${truncate(topic, 120)}":\n\n` +
|
|
470
|
+
`${lines.join('\n\n')}\n\n${persistenceLine}`);
|
|
471
|
+
}
|
|
472
|
+
/** Map a non-ok POST /scoped/start response to a user-facing ScopedResearchToolError. */
|
|
473
|
+
async function handleScopedStartError(response, label) {
|
|
474
|
+
const text = await response.text().catch(() => '');
|
|
475
|
+
let parsed = null;
|
|
476
|
+
try {
|
|
477
|
+
parsed = JSON.parse(text);
|
|
478
|
+
}
|
|
479
|
+
catch {
|
|
480
|
+
// non-JSON body
|
|
481
|
+
}
|
|
482
|
+
const status = response.status;
|
|
483
|
+
if (status === 402 || parsed?.code === 'INSUFFICIENT_CREDITS') {
|
|
484
|
+
const balance = typeof parsed?.balance === 'number' ? parsed.balance : null;
|
|
485
|
+
const required = typeof parsed?.required === 'number' ? parsed.required : null;
|
|
486
|
+
const buyUrl = typeof parsed?.buy_url === 'string' && parsed.buy_url.length > 0 ? parsed.buy_url : 'https://clien.ai/app/billing';
|
|
487
|
+
if (balance !== null && required !== null) {
|
|
488
|
+
const needed = Math.max(required - balance, 1);
|
|
489
|
+
throw new ScopedResearchToolError(`Insufficient credits for this ${label.toLowerCase()} — you have ${balance}, this run needs ` +
|
|
490
|
+
`${required} (${needed} more). Buy credits at ${buyUrl}.`);
|
|
491
|
+
}
|
|
492
|
+
throw new ScopedResearchToolError(`Insufficient credits for this ${label.toLowerCase()}. Buy more at ${buyUrl}.`);
|
|
493
|
+
}
|
|
494
|
+
if (status === 409) {
|
|
495
|
+
throw new ScopedResearchToolError(parsed?.message ?? parsed?.error ?? 'A research run is already in progress for this project.');
|
|
496
|
+
}
|
|
497
|
+
if (status === 503 && parsed?.code === 'CIRCUIT_BREAKER_OPEN') {
|
|
498
|
+
throw new ScopedResearchToolError(parsed?.error ?? parsed?.message ?? 'Our research infrastructure is experiencing issues. Please try again in 30 minutes.');
|
|
499
|
+
}
|
|
500
|
+
if (status === 401) {
|
|
501
|
+
throw new ScopedResearchToolError('Authentication failed. Re-run the tool to re-authenticate.');
|
|
502
|
+
}
|
|
503
|
+
if (status === 400) {
|
|
504
|
+
throw new ScopedResearchToolError(parsed?.message ?? parsed?.error ?? `Bad request: ${truncate(text, 300)}`);
|
|
505
|
+
}
|
|
506
|
+
if (status >= 500) {
|
|
507
|
+
throw new ScopedResearchToolError(`Clien.ai server error (${status}). Please try again in a few minutes.`);
|
|
508
|
+
}
|
|
509
|
+
throw new ScopedResearchToolError(`Failed to start ${label.toLowerCase()} (HTTP ${status}): ${truncate(text, 200)}`);
|
|
510
|
+
}
|
|
511
|
+
function isTimeout(err) {
|
|
512
|
+
const e = err;
|
|
513
|
+
return e?.name === 'AbortError' || e?.name === 'TimeoutError';
|
|
514
|
+
}
|
|
515
|
+
function throwIfTimeout(err, message) {
|
|
516
|
+
if (isTimeout(err))
|
|
517
|
+
throw new ScopedResearchToolError(message);
|
|
518
|
+
}
|
|
519
|
+
function summarizeEvent(events) {
|
|
520
|
+
if (!events || events.length === 0)
|
|
521
|
+
return null;
|
|
522
|
+
const last = events[events.length - 1];
|
|
523
|
+
if (!last)
|
|
524
|
+
return null;
|
|
525
|
+
const type = last.eventType ?? 'event';
|
|
526
|
+
const data = last.eventData ?? {};
|
|
527
|
+
if (typeof data.message === 'string' && data.message.length > 0)
|
|
528
|
+
return truncate(`${type}: ${data.message}`, 120);
|
|
529
|
+
if (typeof data.phase === 'string')
|
|
530
|
+
return truncate(`${type}: ${data.phase}`, 120);
|
|
531
|
+
return type;
|
|
532
|
+
}
|
|
533
|
+
function formatZodError(error) {
|
|
534
|
+
return error.issues.map((i) => `${i.path.join('.') || 'input'}: ${i.message}`).join('; ');
|
|
535
|
+
}
|
|
536
|
+
async function emitProgress(deps, progress) {
|
|
537
|
+
try {
|
|
538
|
+
await deps.onProgress?.(progress);
|
|
539
|
+
}
|
|
540
|
+
catch {
|
|
541
|
+
// progress is advisory; never let it tank the run
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
// Internal — exported for the search_forums handler (added in FUL-29) and unit tests.
|
|
545
|
+
export { runScopedResearchTool };
|
|
546
|
+
//# sourceMappingURL=scoped-research.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoped-research.js","sourceRoot":"","sources":["../../src/tools/scoped-research.ts"],"names":[],"mappings":"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"}
|
package/dist/types/report.js
CHANGED
|
@@ -57,4 +57,42 @@ export const ResearchReportDataSchema = z
|
|
|
57
57
|
overallConfidence: z.number().min(0).max(1).optional(),
|
|
58
58
|
})
|
|
59
59
|
.passthrough();
|
|
60
|
+
/**
|
|
61
|
+
* The RICH competitor profile from `report_data.webResearch.competitors[]` — the shape the
|
|
62
|
+
* `scan_competitors` primitive (FUL-30) surfaces to the caller and the server promotes into the
|
|
63
|
+
* Research → Competitors collection. Distinct from the lean top-level {@link CompetitorSchema}
|
|
64
|
+
* above, which drops pricing/strengths/weaknesses/relevantHypotheses.
|
|
65
|
+
*
|
|
66
|
+
* Only `name` is required; everything else is optional + `.passthrough()` so a backend/agent that
|
|
67
|
+
* adds or reshapes a field never causes us to drop competitor data (same philosophy as the rest of
|
|
68
|
+
* this module — validate leniently, preserve the raw payload).
|
|
69
|
+
*/
|
|
70
|
+
export const CompetitorProfileSchema = z
|
|
71
|
+
.object({
|
|
72
|
+
name: z.string(),
|
|
73
|
+
url: z.string().optional(),
|
|
74
|
+
description: z.string().optional(),
|
|
75
|
+
pricing: z.string().optional(),
|
|
76
|
+
strengths: z.array(z.string()).optional(),
|
|
77
|
+
weaknesses: z.array(z.string()).optional(),
|
|
78
|
+
relevantHypotheses: z.array(z.string()).optional(),
|
|
79
|
+
})
|
|
80
|
+
.passthrough();
|
|
81
|
+
/**
|
|
82
|
+
* A community/forum thread from `report_data.forumResearch.threads[]` — the shape the
|
|
83
|
+
* `search_forums` primitive (FUL-29) surfaces to the caller and the server promotes into the
|
|
84
|
+
* Research → Community collection. Only `title` is required; the rest is optional + passthrough.
|
|
85
|
+
*/
|
|
86
|
+
export const ForumThreadSchema = z
|
|
87
|
+
.object({
|
|
88
|
+
title: z.string(),
|
|
89
|
+
url: z.string().optional(),
|
|
90
|
+
platform: z.string().optional(),
|
|
91
|
+
subreddit: z.string().optional(),
|
|
92
|
+
sentimentSummary: z.string().optional(),
|
|
93
|
+
relevantQuotes: z.array(z.string()).optional(),
|
|
94
|
+
upvotes: z.number().optional(),
|
|
95
|
+
commentCount: z.number().optional(),
|
|
96
|
+
})
|
|
97
|
+
.passthrough();
|
|
60
98
|
//# sourceMappingURL=report.js.map
|
package/dist/types/report.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/types/report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;;;;;;;GAQG;AACH,oEAAoE;AACpE,yEAAyE;AACzE,6EAA6E;AAC7E,yEAAyE;AACzE,2EAA2E;AAC3E,wBAAwB;AACxB,EAAE;AACF,4EAA4E;AAC5E,0EAA0E;AAC1E,0DAA0D;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC;KAC9B,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC1D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC;KACD,WAAW,EAAE,CAAA;AAIhB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC;KACtC,MAAM,CAAC;IACN,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE;IACjD,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC3C,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IACzC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC3C,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IAChD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACvC,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACvD,CAAC;KACD,WAAW,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/types/report.ts"],"names":[],"mappings":"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"}
|