@clien-ai/mcp 0.9.0 → 0.10.1
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 +9 -2
- package/dist/tools/collections.js +25 -7
- package/dist/tools/collections.js.map +1 -1
- package/dist/tools/credits.js +299 -0
- package/dist/tools/credits.js.map +1 -0
- package/dist/tools/interview-scripts.js +18 -8
- package/dist/tools/interview-scripts.js.map +1 -1
- package/dist/tools/interview.js +130 -4
- package/dist/tools/interview.js.map +1 -1
- package/dist/tools/output-schemas.js +20 -0
- package/dist/tools/output-schemas.js.map +1 -1
- package/dist/tools/personas.js +26 -21
- package/dist/tools/personas.js.map +1 -1
- package/dist/tools/registry.js +90 -6
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/report-digest.js +73 -4
- package/dist/tools/report-digest.js.map +1 -1
- package/dist/tools/reports.js +3 -1
- package/dist/tools/reports.js.map +1 -1
- package/dist/tools/research.js +45 -20
- package/dist/tools/research.js.map +1 -1
- package/dist/tools/scoped-research.js +210 -15
- package/dist/tools/scoped-research.js.map +1 -1
- package/dist/tools/status.js +16 -8
- package/dist/tools/status.js.map +1 -1
- package/dist/types/report.js +88 -6
- package/dist/types/report.js.map +1 -1
- package/package.json +1 -1
package/dist/tools/research.js
CHANGED
|
@@ -32,7 +32,7 @@ import { OAuthError } from '../auth/oauth.js';
|
|
|
32
32
|
import { ResearchReportDataSchema } from '../types/report.js';
|
|
33
33
|
import { ToolError } from './errors.js';
|
|
34
34
|
import { composeReportText } from './report-digest.js';
|
|
35
|
-
import { safeInline, truncate } from './render-safety.js';
|
|
35
|
+
import { safeId, safeInline, truncate } from './render-safety.js';
|
|
36
36
|
import { classifyResearchTask, buildTaskGuardMessage } from './task-guard.js';
|
|
37
37
|
// Per-endpoint timeouts (#173). Node fetch has no implicit timeout, so a hung
|
|
38
38
|
// Supabase or Clien.ai endpoint would otherwise wedge the MCP server forever.
|
|
@@ -342,7 +342,7 @@ export async function runResearch(input, deps) {
|
|
|
342
342
|
const deadline = deps.maxDurationMs ? Date.now() + deps.maxDurationMs : Number.POSITIVE_INFINITY;
|
|
343
343
|
while (!TERMINAL_STATUSES.has(status)) {
|
|
344
344
|
if (Date.now() > deadline) {
|
|
345
|
-
throw new ResearchToolError(`Research did not complete within the allotted time. Check the web report: ${webJobUrl(deps.config, jobId)}`, { jobId });
|
|
345
|
+
throw new ResearchToolError(`Research did not complete within the allotted time. Check the web report: ${webJobUrl(deps.config, jobId, startProjectId)}`, { jobId });
|
|
346
346
|
}
|
|
347
347
|
await sleepImpl(pollIntervalMs);
|
|
348
348
|
let eventsResponse;
|
|
@@ -355,7 +355,7 @@ export async function runResearch(input, deps) {
|
|
|
355
355
|
// Treat poll timeouts the same as transient 5xx — backoff and retry.
|
|
356
356
|
consecutiveServerErrors += 1;
|
|
357
357
|
if (consecutiveServerErrors >= 3) {
|
|
358
|
-
throw new ResearchToolError(`Repeated network timeouts polling /events. Your job is still running — check the web report: ${webJobUrl(deps.config, jobId)}`, { jobId });
|
|
358
|
+
throw new ResearchToolError(`Repeated network timeouts polling /events. Your job is still running — check the web report: ${webJobUrl(deps.config, jobId, startProjectId)}`, { jobId });
|
|
359
359
|
}
|
|
360
360
|
const backoffMs = [2000, 5000, 10_000][consecutiveServerErrors - 1] ?? 10_000;
|
|
361
361
|
await sleepImpl(backoffMs);
|
|
@@ -396,7 +396,7 @@ export async function runResearch(input, deps) {
|
|
|
396
396
|
if (eventsResponse.refreshError?.kind === 'transient') {
|
|
397
397
|
consecutiveServerErrors += 1;
|
|
398
398
|
if (consecutiveServerErrors >= 3) {
|
|
399
|
-
throw new ResearchToolError(`Repeated network errors refreshing session. Your job is still running — check the web report: ${webJobUrl(deps.config, jobId)}`, { jobId });
|
|
399
|
+
throw new ResearchToolError(`Repeated network errors refreshing session. Your job is still running — check the web report: ${webJobUrl(deps.config, jobId, startProjectId)}`, { jobId });
|
|
400
400
|
}
|
|
401
401
|
const backoffMs = [2000, 5000, 10_000][consecutiveServerErrors - 1] ?? 10_000;
|
|
402
402
|
await sleepImpl(backoffMs);
|
|
@@ -405,7 +405,7 @@ export async function runResearch(input, deps) {
|
|
|
405
405
|
// Genuine auth failure — drop the in-memory cached session so the next
|
|
406
406
|
// tool call rebuilds from disk (or fails fast with `oauth_no_tty`).
|
|
407
407
|
deps.invalidateSession?.();
|
|
408
|
-
throw new ResearchToolError(`Session expired during research. Your run is still in progress — view the report at ${webJobUrl(deps.config, jobId)} or re-run clien_research to re-authenticate.`, { jobId });
|
|
408
|
+
throw new ResearchToolError(`Session expired during research. Your run is still in progress — view the report at ${webJobUrl(deps.config, jobId, startProjectId)} or re-run clien_research to re-authenticate.`, { jobId });
|
|
409
409
|
}
|
|
410
410
|
if (category === 'credits') {
|
|
411
411
|
// extremely unlikely mid-run; the server would have 402'd at start.
|
|
@@ -414,7 +414,7 @@ export async function runResearch(input, deps) {
|
|
|
414
414
|
if (category === 'server') {
|
|
415
415
|
consecutiveServerErrors += 1;
|
|
416
416
|
if (consecutiveServerErrors >= 3) {
|
|
417
|
-
throw new ResearchToolError(`Clien.ai is returning server errors. Your job is still running — check the web report: ${webJobUrl(deps.config, jobId)}`, { jobId });
|
|
417
|
+
throw new ResearchToolError(`Clien.ai is returning server errors. Your job is still running — check the web report: ${webJobUrl(deps.config, jobId, startProjectId)}`, { jobId });
|
|
418
418
|
}
|
|
419
419
|
// Exponential backoff: 2s, 5s, 10s.
|
|
420
420
|
const backoffMs = [2000, 5000, 10_000][consecutiveServerErrors - 1] ?? 10_000;
|
|
@@ -438,7 +438,7 @@ export async function runResearch(input, deps) {
|
|
|
438
438
|
catch (err) {
|
|
439
439
|
const e = err;
|
|
440
440
|
if (e.name === 'AbortError' || e.name === 'TimeoutError') {
|
|
441
|
-
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 });
|
|
441
|
+
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, startProjectId)}.`, { jobId });
|
|
442
442
|
}
|
|
443
443
|
throw err;
|
|
444
444
|
}
|
|
@@ -446,9 +446,9 @@ export async function runResearch(input, deps) {
|
|
|
446
446
|
// Non-OK responses are not part of the persistence race — surface
|
|
447
447
|
// immediately without retrying.
|
|
448
448
|
if (reportResponse.status === 404) {
|
|
449
|
-
throw new ResearchToolError(`The research run ${status === 'failed' ? 'failed' : 'did not produce a report'}. See ${webJobUrl(deps.config, jobId)} for details.`, { jobId });
|
|
449
|
+
throw new ResearchToolError(`The research run ${status === 'failed' ? 'failed' : 'did not produce a report'}. See ${webJobUrl(deps.config, jobId, startProjectId)} for details.`, { jobId });
|
|
450
450
|
}
|
|
451
|
-
throw new ResearchToolError(`Failed to fetch report (HTTP ${reportResponse.status}). Job ${jobId} completed with status "${status}". See ${webJobUrl(deps.config, jobId)}.`, { jobId });
|
|
451
|
+
throw new ResearchToolError(`Failed to fetch report (HTTP ${reportResponse.status}). Job ${jobId} completed with status "${status}". See ${webJobUrl(deps.config, jobId, startProjectId)}.`, { jobId });
|
|
452
452
|
}
|
|
453
453
|
reportJson = (await reportResponse.json().catch(() => null));
|
|
454
454
|
if (reportJson?.reportMarkdown)
|
|
@@ -458,12 +458,12 @@ export async function runResearch(input, deps) {
|
|
|
458
458
|
await sleepImpl(REPORT_RETRY_DELAY_MS);
|
|
459
459
|
continue;
|
|
460
460
|
}
|
|
461
|
-
throw new ResearchToolError(`Report is empty for job ${jobId}. View at ${webJobUrl(deps.config, jobId)}.`, { jobId });
|
|
461
|
+
throw new ResearchToolError(`Report is empty for job ${jobId}. View at ${webJobUrl(deps.config, jobId, startProjectId)}.`, { jobId });
|
|
462
462
|
}
|
|
463
463
|
// The loop only exits without throwing once reportMarkdown is present; this
|
|
464
464
|
// guard is effectively unreachable but narrows `reportJson` for TypeScript.
|
|
465
465
|
if (!reportJson?.reportMarkdown) {
|
|
466
|
-
throw new ResearchToolError(`Report is empty for job ${jobId}. View at ${webJobUrl(deps.config, jobId)}.`, { jobId });
|
|
466
|
+
throw new ResearchToolError(`Report is empty for job ${jobId}. View at ${webJobUrl(deps.config, jobId, startProjectId)}.`, { jobId });
|
|
467
467
|
}
|
|
468
468
|
// Validate report_data against our typed schema. On failure, pass through
|
|
469
469
|
// the raw payload unchanged — never drop data, even if the backend ships a
|
|
@@ -656,15 +656,40 @@ async function handleStartError(response) {
|
|
|
656
656
|
}
|
|
657
657
|
throw new ResearchToolError(`Failed to start research (HTTP ${status}): ${truncate(text, 200)}`);
|
|
658
658
|
}
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
659
|
+
/**
|
|
660
|
+
* The web URL every "your run is done — go look at it" line in this package points at.
|
|
661
|
+
*
|
|
662
|
+
* With a project id this deep-links to the run's durable home,
|
|
663
|
+
* `app/(authenticated)/project/[projectId]/research/runs/[runId]` — `(authenticated)` is a route
|
|
664
|
+
* GROUP and contributes no URL segment, so the emitted path starts at `/project`, NOT
|
|
665
|
+
* `/app/project`. Same shape the web completion email builds (`buildReportUrl` in
|
|
666
|
+
* `app/lib/email/send-completion-email.ts`), for the same moment in the same flow.
|
|
667
|
+
*
|
|
668
|
+
* ⚠️ The fallback is `/app/projects` (the index, which redirects to the user's first project or
|
|
669
|
+
* to onboarding) and NEVER bare `/app` — that segment is a layout only, has no page, and 404s.
|
|
670
|
+
* It is a LIVE path, not defensive padding, and reached two ways: a genuinely project-less run,
|
|
671
|
+
* and **version skew** — this client ships to npm on its own cadence, so a published copy can
|
|
672
|
+
* meet a deploy whose `/events` and `/report` responses predate FUL-609 and carry no `projectId`.
|
|
673
|
+
* Every caller therefore passes an id that may legitimately be absent.
|
|
674
|
+
*
|
|
675
|
+
* ⚠️ A URL built as a string is invisible to `tsc`, ESLint and the build alike — a Next.js page is
|
|
676
|
+
* reached by file-system convention, so nothing imports it. What sees this is
|
|
677
|
+
* `__tests__/integration/mcp/mcp-web-links-resolve.test.ts` in the app repo, which resolves both
|
|
678
|
+
* branches against the `app/` route tree on disk; `mcp/__tests__/web-job-url.test.ts` pins the
|
|
679
|
+
* emitted strings off the tools' own wire. Neither derives from the other (FUL-604 shipped a 404
|
|
680
|
+
* for eight days because its one test pinned the broken URL as a literal).
|
|
681
|
+
*
|
|
682
|
+
* ⚠️ `projectId` is the SERVER'S ECHO, not this package's validated input — same provenance
|
|
683
|
+
* `buildScopedResult` guards with `safeId` (FUL-270). Every line calling this is agent-visible
|
|
684
|
+
* prose, so an id carrying a newline would end the sentence early and the remainder would read as
|
|
685
|
+
* a line this tool emitted. `safeId` states it byte-identically or not at all, and "not at all"
|
|
686
|
+
* degrades to the fallback link — which is a true statement rather than a forgeable one.
|
|
687
|
+
*/
|
|
688
|
+
export function webJobUrl(config, jobId, projectId) {
|
|
689
|
+
const renderable = safeId(projectId);
|
|
690
|
+
if (renderable) {
|
|
691
|
+
return `${config.serverUrl}/project/${renderable}/research/runs/${jobId}`;
|
|
692
|
+
}
|
|
668
693
|
return `${config.serverUrl}/app/projects`;
|
|
669
694
|
}
|
|
670
695
|
function summarizeEvents(events) {
|
|
@@ -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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"}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Scoped research primitives — `scan_competitors` (FUL-30)
|
|
2
|
+
* Scoped research primitives — `scan_competitors` (FUL-30), `search_forums` (FUL-29) and
|
|
3
|
+
* `scan_market` (FUL-479).
|
|
3
4
|
*
|
|
4
5
|
* These are the composable, cheaper counterparts to the `clien_research` hero: each runs exactly
|
|
5
|
-
* ONE researcher (web OR
|
|
6
|
+
* ONE researcher (web, forum OR market) as a bounded E2B job rather than the full H1–H8 pipeline.
|
|
7
|
+
*
|
|
8
|
+
* ⚠️ Each mode is a DISTINCT researcher with its own retrieval, output envelope and price — never
|
|
9
|
+
* a label on a shared one. `scan_market` exists because reaching market-only behaviour through the
|
|
10
|
+
* web researcher would have charged for a competitor scan and called it market research; it runs
|
|
11
|
+
* Exa's news + financial verticals, writes a `marketResearch` envelope carrying no competitors,
|
|
12
|
+
* and is the only scoped mode allowed to publish the Market dossier. The MCP
|
|
6
13
|
* package stays a thin bearer-auth HTTP client — this module orchestrates the same start+poll
|
|
7
14
|
* lifecycle `research.ts` uses, over the scoped endpoints:
|
|
8
15
|
*
|
|
@@ -25,7 +32,7 @@
|
|
|
25
32
|
* from `research.ts` — no new client. Only the scoped orchestration loop lives here.
|
|
26
33
|
*/
|
|
27
34
|
import { z } from 'zod';
|
|
28
|
-
import { CompetitorProfileSchema, ForumThreadSchema, } from '../types/report.js';
|
|
35
|
+
import { CompetitorProfileSchema, ForumThreadSchema, MarketFindingsSchema, } from '../types/report.js';
|
|
29
36
|
import { ToolError } from './errors.js';
|
|
30
37
|
import { buildFailureGuidance } from './failure-guidance.js';
|
|
31
38
|
import { formatEngagement } from './engagement-display.js';
|
|
@@ -56,8 +63,12 @@ const PHASE_PROGRESS = {
|
|
|
56
63
|
};
|
|
57
64
|
/** Human label + started-log tool name per mode. */
|
|
58
65
|
const MODE_META = {
|
|
59
|
-
web: { tool: 'scan_competitors', label: 'Competitor scan', noun: 'competitors' },
|
|
60
|
-
forum: { tool: 'search_forums', label: 'Forum search', noun: 'community threads' },
|
|
66
|
+
web: { tool: 'scan_competitors', label: 'Competitor scan', noun: 'competitors', tab: 'Competitors' },
|
|
67
|
+
forum: { tool: 'search_forums', label: 'Forum search', noun: 'community threads', tab: 'Community' },
|
|
68
|
+
// "Market research", not "Market scan": this run reads news and financial sources to establish
|
|
69
|
+
// figures rather than sweeping a landscape for rows, and the web CTA that starts it says the
|
|
70
|
+
// same word. The noun is what a failure message says was NOT produced.
|
|
71
|
+
market: { tool: 'scan_market', label: 'Market research', noun: 'market figures', tab: 'Market' },
|
|
61
72
|
};
|
|
62
73
|
// Input caps. Re-declared locally (the @clien-ai/mcp package is published separately and cannot
|
|
63
74
|
// import from the Next.js app); kept in sync with MIN_IDEA_LENGTH (20) / MAX_IDEA_LENGTH (10_000) /
|
|
@@ -139,6 +150,20 @@ export const SearchForumsInputSchema = z.object({
|
|
|
139
150
|
'their pain, the better the threads.'),
|
|
140
151
|
...sharedScopedFields,
|
|
141
152
|
});
|
|
153
|
+
export const ScanMarketInputSchema = z.object({
|
|
154
|
+
// .trim() before .min() — same rationale as ScanCompetitorsInputSchema.topic above.
|
|
155
|
+
topic: z
|
|
156
|
+
.string()
|
|
157
|
+
.trim()
|
|
158
|
+
.min(TOPIC_MIN, `topic must be at least ${TOPIC_MIN} characters`)
|
|
159
|
+
.max(TOPIC_MAX, 'topic too long')
|
|
160
|
+
.describe('The market to size and characterise, described in a sentence or two (min 20 chars) — e.g. ' +
|
|
161
|
+
'"AI meeting-notes tooling sold to remote engineering teams". Name the CATEGORY and the ' +
|
|
162
|
+
'BUYER: this run searches news and financial-report sources for sizing, growth and demand, ' +
|
|
163
|
+
'and a topic phrased as a single product name gives it nothing to size. It does NOT ' +
|
|
164
|
+
'discover competitors — use `scan_competitors` for the landscape.'),
|
|
165
|
+
...sharedScopedFields,
|
|
166
|
+
});
|
|
142
167
|
export class ScopedResearchToolError extends ToolError {
|
|
143
168
|
}
|
|
144
169
|
const defaultSleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
@@ -165,6 +190,22 @@ export async function searchForums(input, deps) {
|
|
|
165
190
|
}
|
|
166
191
|
return runScopedResearchTool('forum', parsed.data, deps);
|
|
167
192
|
}
|
|
193
|
+
/**
|
|
194
|
+
* `scan_market` (FUL-479) — run a scoped MARKET researcher and return the market block it
|
|
195
|
+
* established.
|
|
196
|
+
*
|
|
197
|
+
* Shares the whole start/poll/promote/report lifecycle with its two siblings; what differs is the
|
|
198
|
+
* researcher the server runs, the envelope it writes, and the dossier the promotion publishes. The
|
|
199
|
+
* server may REFUSE this mode with 503 when the capability is switched off for the deployment —
|
|
200
|
+
* see `handleScopedStartError`, which says so rather than reporting a generic failure.
|
|
201
|
+
*/
|
|
202
|
+
export async function scanMarket(input, deps) {
|
|
203
|
+
const parsed = ScanMarketInputSchema.safeParse(input);
|
|
204
|
+
if (!parsed.success) {
|
|
205
|
+
throw new ScopedResearchToolError(`Invalid input — ${formatZodError(parsed.error)}`);
|
|
206
|
+
}
|
|
207
|
+
return runScopedResearchTool('market', parsed.data, deps);
|
|
208
|
+
}
|
|
168
209
|
async function runScopedResearchTool(mode, input, deps) {
|
|
169
210
|
const { topic, product_name, project_id, project_name } = input;
|
|
170
211
|
const meta = MODE_META[mode];
|
|
@@ -225,6 +266,7 @@ async function runScopedResearchTool(mode, input, deps) {
|
|
|
225
266
|
invalidateSession: deps.invalidateSession,
|
|
226
267
|
label: meta.label,
|
|
227
268
|
config: deps.config,
|
|
269
|
+
projectId,
|
|
228
270
|
});
|
|
229
271
|
// 4. Non-complete terminal state -> surface the reason, plus the refund
|
|
230
272
|
// outcome (the user's money) and a cause-keyed retry hint so the calling
|
|
@@ -243,21 +285,23 @@ async function runScopedResearchTool(mode, input, deps) {
|
|
|
243
285
|
});
|
|
244
286
|
throw new ScopedResearchToolError(`${meta.label} ${poll.status === 'failed' ? 'failed' : 'was cancelled'}${reason}. ` +
|
|
245
287
|
`No ${meta.noun} were produced.${refundNote}${retryHint} ` +
|
|
246
|
-
`Try a more specific topic, or view ${webJobUrl(deps.config, jobId)}.`, { jobId });
|
|
288
|
+
`Try a more specific topic, or view ${webJobUrl(deps.config, jobId, projectId)}.`, { jobId });
|
|
247
289
|
}
|
|
248
290
|
// 5. Promote into the Research collections (best-effort — needs a project; standalone runs skip).
|
|
249
291
|
let promotion = {
|
|
250
292
|
promoted: false,
|
|
251
293
|
errorCode: null,
|
|
252
294
|
retryable: null,
|
|
253
|
-
//
|
|
295
|
+
// FUL-479: a scoped `scan_market` run IS eligible for market authority now, so this is no
|
|
296
|
+
// longer null on every path — `promoteScopedJob` fills it from the server's own discriminator
|
|
297
|
+
// below, and `buildScopedResult` refuses to claim a saved snapshot without it.
|
|
254
298
|
marketUpdated: null,
|
|
255
299
|
};
|
|
256
300
|
if (projectId) {
|
|
257
301
|
promotion = await promoteScopedJob(ctx, jobId);
|
|
258
302
|
}
|
|
259
303
|
// 6. Fetch the structured report.
|
|
260
|
-
const reportData = await fetchScopedReport(ctx, jobId, deps.config);
|
|
304
|
+
const reportData = await fetchScopedReport(ctx, jobId, deps.config, projectId);
|
|
261
305
|
// 7. Extract the RICH slice + build the result.
|
|
262
306
|
return buildScopedResult({
|
|
263
307
|
mode,
|
|
@@ -287,7 +331,7 @@ async function pollScopedJob(ctx, jobId, deps) {
|
|
|
287
331
|
while (!TERMINAL_STATUSES.has(status)) {
|
|
288
332
|
if (Date.now() > deps.deadline) {
|
|
289
333
|
throw new ScopedResearchToolError(`${deps.label} did not complete within the allotted time. The job may still be running — ` +
|
|
290
|
-
`check ${webJobUrl(deps.config, jobId)}.`, { jobId });
|
|
334
|
+
`check ${webJobUrl(deps.config, jobId, deps.projectId)}.`, { jobId });
|
|
291
335
|
}
|
|
292
336
|
await deps.sleep(deps.pollIntervalMs);
|
|
293
337
|
let response;
|
|
@@ -335,7 +379,7 @@ async function pollScopedJob(ctx, jobId, deps) {
|
|
|
335
379
|
}
|
|
336
380
|
deps.invalidateSession?.();
|
|
337
381
|
throw new ScopedResearchToolError(`Session expired during ${deps.label.toLowerCase()}. The run may still be in progress — view ` +
|
|
338
|
-
`${webJobUrl(deps.config, jobId)} or re-run the tool to re-authenticate.`, { jobId });
|
|
382
|
+
`${webJobUrl(deps.config, jobId, deps.projectId)} or re-run the tool to re-authenticate.`, { jobId });
|
|
339
383
|
}
|
|
340
384
|
if (category === 'server') {
|
|
341
385
|
if (await backoffOrBail(deps, ++consecutiveServerErrors, jobId, 'server errors'))
|
|
@@ -356,7 +400,7 @@ async function pollScopedJob(ctx, jobId, deps) {
|
|
|
356
400
|
*/
|
|
357
401
|
async function backoffOrBail(deps, consecutive, jobId, what) {
|
|
358
402
|
if (consecutive >= 3) {
|
|
359
|
-
throw new ScopedResearchToolError(`Repeated ${what} during ${deps.label.toLowerCase()}. The job may still be running — check ${webJobUrl(deps.config, jobId)}.`, { jobId });
|
|
403
|
+
throw new ScopedResearchToolError(`Repeated ${what} during ${deps.label.toLowerCase()}. The job may still be running — check ${webJobUrl(deps.config, jobId, deps.projectId)}.`, { jobId });
|
|
360
404
|
}
|
|
361
405
|
const backoffMs = [2000, 5000, 10_000][consecutive - 1] ?? 10_000;
|
|
362
406
|
await deps.sleep(backoffMs);
|
|
@@ -387,7 +431,7 @@ async function promoteScopedJob(ctx, jobId) {
|
|
|
387
431
|
return outcome;
|
|
388
432
|
}
|
|
389
433
|
/** GET the structured report (JSON variant). Returns report_data (may be null). */
|
|
390
|
-
async function fetchScopedReport(ctx, jobId, config) {
|
|
434
|
+
async function fetchScopedReport(ctx, jobId, config, projectId) {
|
|
391
435
|
let response;
|
|
392
436
|
try {
|
|
393
437
|
response = await apiCall(ctx, 'GET', `/api/validate/${jobId}/report`, {
|
|
@@ -396,11 +440,11 @@ async function fetchScopedReport(ctx, jobId, config) {
|
|
|
396
440
|
});
|
|
397
441
|
}
|
|
398
442
|
catch (err) {
|
|
399
|
-
throwIfTimeout(err, `Report fetch timed out after ${REPORT_FETCH_TIMEOUT_MS / 1000}s. Job ${jobId} completed; view at ${webJobUrl(config, jobId)}.`);
|
|
443
|
+
throwIfTimeout(err, `Report fetch timed out after ${REPORT_FETCH_TIMEOUT_MS / 1000}s. Job ${jobId} completed; view at ${webJobUrl(config, jobId, projectId)}.`);
|
|
400
444
|
throw err;
|
|
401
445
|
}
|
|
402
446
|
if (!response.ok) {
|
|
403
|
-
throw new ScopedResearchToolError(`Failed to fetch the ${jobId} report (HTTP ${response.status}). The run completed — see ${webJobUrl(config, jobId)}.`, { jobId });
|
|
447
|
+
throw new ScopedResearchToolError(`Failed to fetch the ${jobId} report (HTTP ${response.status}). The run completed — see ${webJobUrl(config, jobId, projectId)}.`, { jobId });
|
|
404
448
|
}
|
|
405
449
|
const json = (await response.json().catch(() => null));
|
|
406
450
|
return json?.reportData ?? null;
|
|
@@ -418,9 +462,30 @@ function buildScopedResult(args) {
|
|
|
418
462
|
// than naming a project by an id that is not the project's — the sentence still says
|
|
419
463
|
// the run was attached, it just declines to name an id it cannot state exactly.
|
|
420
464
|
const renderableProjectId = safeId(projectId);
|
|
465
|
+
/**
|
|
466
|
+
* ⚠️ MARKET IS THE ONE MODE WHERE `promoted` IS NOT ENOUGH (FUL-479).
|
|
467
|
+
*
|
|
468
|
+
* `project_market` is a SINGLETON owned by one run, and a promotion can succeed in full while
|
|
469
|
+
* leaving it untouched — because a newer run already owns it (`ignored_as_older`). The other two
|
|
470
|
+
* dossiers accumulate, so for them a successful promotion did add this run's rows; for market it
|
|
471
|
+
* may have added nothing. Saying "Saved to the Research → Market tab" there tells an agent the
|
|
472
|
+
* page now shows THIS run's figures when it shows a different run's, which is the same
|
|
473
|
+
* over-claim `research.ts` refuses for the hero tool, one surface over.
|
|
474
|
+
*
|
|
475
|
+
* `marketUpdated` is the SERVER's discriminator; `null` (an older server, or a rail that cannot
|
|
476
|
+
* report it) says nothing, so the wording falls back to the neutral sentence rather than
|
|
477
|
+
* guessing either way.
|
|
478
|
+
*/
|
|
479
|
+
const marketSavedLine = promotion.marketUpdated === true
|
|
480
|
+
? "Saved to the project's Research → Market tab."
|
|
481
|
+
: promotion.marketUpdated === false
|
|
482
|
+
? 'Attached to the project, but the Market snapshot was NOT changed — a newer run owns it.'
|
|
483
|
+
: 'Attached to the project; the Market snapshot may already be owned by a newer run.';
|
|
421
484
|
const persistenceLine = projectId
|
|
422
485
|
? promotion.promoted
|
|
423
|
-
?
|
|
486
|
+
? mode === 'market'
|
|
487
|
+
? marketSavedLine
|
|
488
|
+
: `Saved to the project's Research → ${MODE_META[mode].tab} tab.`
|
|
424
489
|
: promotion.retryable === false
|
|
425
490
|
? // `errorCode` can be the server's RAW error string on an older server (see
|
|
426
491
|
// `promoteCompletedJob`), so it goes through the same forgery guard every other
|
|
@@ -448,6 +513,13 @@ function buildScopedResult(args) {
|
|
|
448
513
|
_meta: { ...base, competitors },
|
|
449
514
|
};
|
|
450
515
|
}
|
|
516
|
+
if (mode === 'market') {
|
|
517
|
+
const market = extractMarket(reportData);
|
|
518
|
+
return {
|
|
519
|
+
content: [{ type: 'text', text: renderMarket(market, topic, persistenceLine) }],
|
|
520
|
+
_meta: { ...base, market },
|
|
521
|
+
};
|
|
522
|
+
}
|
|
451
523
|
const threads = extractItems(reportData, ['forumResearch', 'threads'], ForumThreadSchema);
|
|
452
524
|
return {
|
|
453
525
|
content: [{ type: 'text', text: renderThreads(threads, topic, persistenceLine) }],
|
|
@@ -488,6 +560,117 @@ function extractItems(reportData, path, schema) {
|
|
|
488
560
|
}
|
|
489
561
|
return items;
|
|
490
562
|
}
|
|
563
|
+
/**
|
|
564
|
+
* Pull the market block out of `report_data.marketResearch` and FLATTEN it (FUL-479).
|
|
565
|
+
*
|
|
566
|
+
* The producer nests three of the five fields under `marketData` and leaves `positioningGaps` as
|
|
567
|
+
* its sibling — a split that exists for the promotion SQL, not for an agent. Flattening here means
|
|
568
|
+
* `MarketFindingsSchema` describes what the caller is actually told, and each field maps 1:1 onto a
|
|
569
|
+
* `project_market` column.
|
|
570
|
+
*
|
|
571
|
+
* Returns `null` when the run wrote no market envelope, which the renderer states as a fact about
|
|
572
|
+
* the RUN rather than as a fact about the market. That distinction is the whole reason this is not
|
|
573
|
+
* a `?? {}`: "this run recorded no figures" and "this market has no figures" are different claims,
|
|
574
|
+
* and only the first is one we can make.
|
|
575
|
+
*
|
|
576
|
+
* ⚠️ It reads `marketResearch` and NOT `webResearch`. A market run writes the former and carries
|
|
577
|
+
* no competitors at all; reading the latter would make this tool render a full run's competitor-era
|
|
578
|
+
* market block if one ever landed on a scoped job, i.e. attribute a $6.50 run's figures to a 4-credit
|
|
579
|
+
* one. The raw payload always survives in `_meta.report_data` either way.
|
|
580
|
+
*/
|
|
581
|
+
function extractMarket(reportData) {
|
|
582
|
+
if (!reportData || typeof reportData !== 'object')
|
|
583
|
+
return null;
|
|
584
|
+
// Keyed by string literal, like `extractItems`' path array, so the navigation is greppable —
|
|
585
|
+
// `producer-field-completeness.test.ts` falsifies this module's "MCP reads marketResearch at a
|
|
586
|
+
// nested path" decision record by looking for exactly this literal, and a dotted property access
|
|
587
|
+
// would let the record outlive the read.
|
|
588
|
+
const envelope = reportData['marketResearch'];
|
|
589
|
+
if (!envelope || typeof envelope !== 'object' || Array.isArray(envelope))
|
|
590
|
+
return null;
|
|
591
|
+
const marketData = envelope['marketData'];
|
|
592
|
+
const nested = marketData && typeof marketData === 'object' && !Array.isArray(marketData)
|
|
593
|
+
? marketData
|
|
594
|
+
: {};
|
|
595
|
+
const parsed = MarketFindingsSchema.safeParse({
|
|
596
|
+
estimatedMarketSize: nested.estimatedMarketSize,
|
|
597
|
+
growthTrend: nested.growthTrend,
|
|
598
|
+
keyTrends: nested.keyTrends,
|
|
599
|
+
claims: nested.claims,
|
|
600
|
+
positioningGaps: envelope['positioningGaps'],
|
|
601
|
+
});
|
|
602
|
+
if (!parsed.success) {
|
|
603
|
+
// Same posture as `extractItems`: a typed field of the wrong type is what crashes a renderer,
|
|
604
|
+
// and the raw payload is preserved in `_meta.report_data`, so the caller loses nothing.
|
|
605
|
+
console.error('[clien-mcp] dropped a malformed marketResearch block from the typed result; ' +
|
|
606
|
+
'the raw payload is preserved in _meta.report_data');
|
|
607
|
+
return null;
|
|
608
|
+
}
|
|
609
|
+
return parsed.data;
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* Render the market block for the agent.
|
|
613
|
+
*
|
|
614
|
+
* Three rules the wording carries, all of them about not over-claiming:
|
|
615
|
+
*
|
|
616
|
+
* 1. An EMPTY result is stated as a fact about the run ("this run recorded no figures"), never
|
|
617
|
+
* as a fact about the market. `get_market`'s four-answer table is the same rule one surface
|
|
618
|
+
* over, and it matters more here: the sentence is one an agent may repeat to a user as a
|
|
619
|
+
* claim about their market.
|
|
620
|
+
* 2. Nothing is INVENTED to fill a gap. A missing size prints no size line at all, rather than
|
|
621
|
+
* a "Data not available" sentinel — a sentinel we wrote is a value nobody asserted, and
|
|
622
|
+
* downstream a non-blank market-size string is treated as a claim.
|
|
623
|
+
* 3. The figures are UNGRADED here and the text says so. `list_competitors` teaches an agent
|
|
624
|
+
* that a bracket beside a fact IS the trust signal; seeing none, it can read silence as
|
|
625
|
+
* "nothing flagged" rather than "categorically un-bracketed on this surface". Same FUL-247
|
|
626
|
+
* reasoning as `renderCompetitors`' TRUST paragraph.
|
|
627
|
+
*/
|
|
628
|
+
function renderMarket(market, topic, persistenceLine) {
|
|
629
|
+
const safeTopic = safeInline(topic, 120) ?? 'this topic';
|
|
630
|
+
const size = safeInline(market?.estimatedMarketSize, 240);
|
|
631
|
+
const trend = safeInline(market?.growthTrend, 40);
|
|
632
|
+
// Guarded per ITEM, so one flattened entry cannot swallow its siblings past a shared truncate,
|
|
633
|
+
// and an entry that collapses to nothing is dropped rather than rendered as an empty gap.
|
|
634
|
+
const claims = (market?.claims ?? [])
|
|
635
|
+
.map((c) => {
|
|
636
|
+
const text = safeInline(c.text, 240);
|
|
637
|
+
if (!text)
|
|
638
|
+
return null;
|
|
639
|
+
const scope = safeInline(c.scope, 24);
|
|
640
|
+
return scope ? `${text} [${scope}]` : text;
|
|
641
|
+
})
|
|
642
|
+
.filter((line) => line !== null);
|
|
643
|
+
const trends = (market?.keyTrends ?? []).map((t) => safeInline(t, 200)).filter(Boolean);
|
|
644
|
+
const gaps = (market?.positioningGaps ?? []).map((g) => safeInline(g, 200)).filter(Boolean);
|
|
645
|
+
const hasAnything = Boolean(size) || Boolean(trend) || claims.length > 0 || trends.length > 0 || gaps.length > 0;
|
|
646
|
+
if (!hasAnything) {
|
|
647
|
+
// A statement about the RUN. Explicitly not "no market was found", and explicitly not zero.
|
|
648
|
+
return (`This market research run recorded no figures for "${safeTopic}". That is what the run ` +
|
|
649
|
+
`produced — it is not a finding that the market is small or absent. ${persistenceLine}`);
|
|
650
|
+
}
|
|
651
|
+
const sections = [`Market research for "${safeTopic}"`, ''];
|
|
652
|
+
if (size)
|
|
653
|
+
sections.push(`**Market size:** ${size}`);
|
|
654
|
+
if (trend)
|
|
655
|
+
sections.push(`**Growth trend:** ${trend}`);
|
|
656
|
+
if (claims.length > 0) {
|
|
657
|
+
sections.push('', '**Figures recorded** (one per line, with the scope the source named):');
|
|
658
|
+
sections.push(...claims.map((c, i) => `${i + 1}. ${c}`));
|
|
659
|
+
}
|
|
660
|
+
if (trends.length > 0) {
|
|
661
|
+
sections.push('', '**Key trends:**');
|
|
662
|
+
sections.push(...trends.map((t) => `- ${t}`));
|
|
663
|
+
}
|
|
664
|
+
if (gaps.length > 0) {
|
|
665
|
+
sections.push('', '**Positioning gaps** (unserved segments and unmet needs):');
|
|
666
|
+
sections.push(...gaps.map((g) => `- ${g}`));
|
|
667
|
+
}
|
|
668
|
+
sections.push('', 'TRUST: these figures are UNGRADED on this surface — no per-figure source state is attached ' +
|
|
669
|
+
'here, and the absence of a marker is not a clean bill of health. A figure with no scope ' +
|
|
670
|
+
'label is a market SIZE whose slice the source never named, not a defaulted "total". Treat ' +
|
|
671
|
+
'every figure as unverified unless you check its source yourself.', '', persistenceLine);
|
|
672
|
+
return sections.join('\n');
|
|
673
|
+
}
|
|
491
674
|
function renderCompetitors(competitors, topic, persistenceLine) {
|
|
492
675
|
if (competitors.length === 0) {
|
|
493
676
|
return `No competitors surfaced for "${safeInline(topic, 120) ?? 'this topic'}". ${persistenceLine}`;
|
|
@@ -703,6 +886,18 @@ async function handleScopedStartError(response, label) {
|
|
|
703
886
|
? `${base} Blocking job_id: ${parsed.job_id} — call clien_research_status with this job_id to re-attach and poll it.`
|
|
704
887
|
: base);
|
|
705
888
|
}
|
|
889
|
+
if (status === 503 && parsed?.code === 'FEATURE_UNAVAILABLE') {
|
|
890
|
+
// FUL-479 kill switch. Distinguished from the circuit breaker below because the two ask for
|
|
891
|
+
// OPPOSITE responses: the breaker is a transient outage and "try again in 30 minutes" is the
|
|
892
|
+
// right advice, while this is a capability the deployment has not switched on — retrying will
|
|
893
|
+
// return the same 503 forever. Nothing was started and nothing was charged, and the agent is
|
|
894
|
+
// told to stop rather than to wait.
|
|
895
|
+
throw new ScopedResearchToolError((parsed?.error ??
|
|
896
|
+
parsed?.message ??
|
|
897
|
+
'This capability is not available on this Clien.ai deployment yet.') +
|
|
898
|
+
' Nothing was started and no credits were used. Do not retry — use `get_market` to read ' +
|
|
899
|
+
'whatever market data the project already holds.');
|
|
900
|
+
}
|
|
706
901
|
if (status === 503 && parsed?.code === 'CIRCUIT_BREAKER_OPEN') {
|
|
707
902
|
throw new ScopedResearchToolError(parsed?.error ?? parsed?.message ?? 'Our research infrastructure is experiencing issues. Please try again in 30 minutes.');
|
|
708
903
|
}
|