@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.
@@ -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
- export function webJobUrl(config, jobId) {
660
- // `/app` has no page (it's only a layout segment), so the old
661
- // `/app?job=<id>` link 404'd — nothing reads the `job` query param. Point at
662
- // `/app/projects`, which redirects to the user's project (or onboarding).
663
- // The jobId is still surfaced in the recovery message text + stderr, and the
664
- // `clien_research_status` tool re-attaches by jobId. If a standalone
665
- // per-job report viewer (e.g. `/app/report/{jobId}`) ever lands, switch this
666
- // to that route so the link deep-links to the exact run.
667
- void jobId;
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) and `search_forums` (FUL-29).
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 forum) as a bounded E2B job rather than the full H1–H8 pipeline. The MCP
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
- // A scoped run is never eligible for market authority, so this stays null on every path here.
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
- ? `Saved to the project's Research → ${mode === 'web' ? 'Competitors' : 'Community'} tab.`
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
  }