@clien-ai/mcp 0.2.1 → 0.3.0
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 +96 -11
- package/dist/server.js +10 -0
- package/dist/server.js.map +1 -1
- package/dist/tools/collections.js +433 -0
- package/dist/tools/collections.js.map +1 -0
- package/dist/tools/interview.js +190 -25
- package/dist/tools/interview.js.map +1 -1
- package/dist/tools/param-aliases.js +144 -0
- package/dist/tools/param-aliases.js.map +1 -0
- package/dist/tools/personas.js +442 -40
- package/dist/tools/personas.js.map +1 -1
- package/dist/tools/projects.js +545 -6
- package/dist/tools/projects.js.map +1 -1
- package/dist/tools/registry.js +234 -18
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/scoped-research.js +19 -3
- package/dist/tools/scoped-research.js.map +1 -1
- package/dist/types/report.js +180 -2
- package/dist/types/report.js.map +1 -1
- package/package.json +1 -1
package/dist/tools/projects.js
CHANGED
|
@@ -13,6 +13,9 @@
|
|
|
13
13
|
* AI can pick a `project_id` to pass to `clien_research`.
|
|
14
14
|
* - create_project → POST /api/projects { name, description? } →
|
|
15
15
|
* 201 { project }. Returns a confirmation line + the project in `_meta`.
|
|
16
|
+
* - get_project → the one-call orientation hub (FUL-216 / §U8). Fans out
|
|
17
|
+
* CLIENT-SIDE to project-meta + the five child collections in parallel and
|
|
18
|
+
* degrades per child. See the section comment further down.
|
|
16
19
|
*
|
|
17
20
|
* Error mapping mirrors `status.ts`: 401 → invalidate the cached session and
|
|
18
21
|
* surface a re-auth message; 400 → the server's validation message; other
|
|
@@ -23,6 +26,7 @@
|
|
|
23
26
|
import { z } from 'zod';
|
|
24
27
|
import { ToolError } from './errors.js';
|
|
25
28
|
import { apiCall, categorizeFetchError, truncate, } from './research.js';
|
|
29
|
+
import { toCompetitorSummary, toCommunitySignalSummary } from './collections.js';
|
|
26
30
|
const PROJECTS_FETCH_TIMEOUT_MS = 30_000;
|
|
27
31
|
// Caps re-declared locally: the @clien-ai/mcp package is published separately
|
|
28
32
|
// and cannot import from the Next.js app. Kept in sync with VALIDATION_LIMITS
|
|
@@ -89,20 +93,33 @@ async function throwForResponse(response, deps, action) {
|
|
|
89
93
|
deps.invalidateSession?.();
|
|
90
94
|
throw new ProjectToolError('Session expired. Re-run any Clien.ai tool to re-authenticate, then try again.');
|
|
91
95
|
}
|
|
96
|
+
const detail = await parseErrorDetail(response);
|
|
97
|
+
if (response.status === 400) {
|
|
98
|
+
throw new ProjectToolError(`Could not ${action} — ${detail}`);
|
|
99
|
+
}
|
|
100
|
+
throw new ProjectToolError(`Failed to ${action} (HTTP ${response.status}): ${detail}`);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Read a non-ok response body into a short human detail: the server's
|
|
104
|
+
* `{ error, code }` when it is JSON, otherwise the truncated raw text.
|
|
105
|
+
*
|
|
106
|
+
* Shared by the throwing path (`throwForResponse`) and the degrading path
|
|
107
|
+
* (`hubFetch`) so the two cannot drift. They differ in what they DO with a
|
|
108
|
+
* failure, not in how they read one, and a fix to the parsing — a new envelope
|
|
109
|
+
* field, a different truncation bound — should not have to be made twice in one
|
|
110
|
+
* file to take effect in both.
|
|
111
|
+
*/
|
|
112
|
+
async function parseErrorDetail(response) {
|
|
92
113
|
const text = await response.text().catch(() => '');
|
|
93
|
-
let detail = truncate(text, 200);
|
|
94
114
|
try {
|
|
95
115
|
const parsed = JSON.parse(text);
|
|
96
116
|
if (parsed?.error)
|
|
97
|
-
|
|
117
|
+
return `${parsed.error}${parsed.code ? ` (${parsed.code})` : ''}`;
|
|
98
118
|
}
|
|
99
119
|
catch {
|
|
100
120
|
// non-JSON body — fall back to the truncated raw text
|
|
101
121
|
}
|
|
102
|
-
|
|
103
|
-
throw new ProjectToolError(`Could not ${action} — ${detail}`);
|
|
104
|
-
}
|
|
105
|
-
throw new ProjectToolError(`Failed to ${action} (HTTP ${response.status}): ${detail}`);
|
|
122
|
+
return truncate(text, 200);
|
|
106
123
|
}
|
|
107
124
|
export async function listProjects(input, deps) {
|
|
108
125
|
const parsed = ListProjectsInputSchema.safeParse(input);
|
|
@@ -192,4 +209,526 @@ export async function createProject(input, deps) {
|
|
|
192
209
|
_meta: { project },
|
|
193
210
|
};
|
|
194
211
|
}
|
|
212
|
+
// ---------------------------------------------------------------------------
|
|
213
|
+
// get_project (FUL-216 / §U8) — the one-call project orientation hub
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
//
|
|
216
|
+
// Answers "what is the state of my project?" in ONE call instead of the ~5 an
|
|
217
|
+
// agent needed before (list_personas + list_interviews + list_competitors +
|
|
218
|
+
// list_community_signals + list_reports), by fanning out CLIENT-SIDE to
|
|
219
|
+
// project-meta and the five child endpoints in parallel. Resolved in eng review:
|
|
220
|
+
// no new app-side aggregate endpoint — this is pure composition over reads that
|
|
221
|
+
// already ship, so it adds no server surface to secure or keep in sync.
|
|
222
|
+
//
|
|
223
|
+
// ★ GRACEFUL DEGRADATION IS THE POINT. An orientation tool that dies because one
|
|
224
|
+
// collection hiccuped is worse than useless: the agent loses the other four too,
|
|
225
|
+
// and gets nothing for its round-trip. So every child is isolated — a failure
|
|
226
|
+
// becomes `{ error: 'unavailable', detail }` under its own key in
|
|
227
|
+
// `_meta.collections` while the rest return normally. Two independent layers
|
|
228
|
+
// enforce this:
|
|
229
|
+
// 1. `hubFetch` never throws — it returns a discriminated outcome.
|
|
230
|
+
// 2. `Promise.allSettled` wraps the lot anyway, so even a BUG in (1) turns into
|
|
231
|
+
// an error stub rather than a thrown tool call. Belt and braces on purpose:
|
|
232
|
+
// "never throws" should hold by construction, not by my helper being right.
|
|
233
|
+
//
|
|
234
|
+
// The two deliberate exceptions are the PROJECT itself, where throwing is the
|
|
235
|
+
// honest answer rather than a failure of nerve:
|
|
236
|
+
// - 401 → the session is dead; every child is failing for the same reason, and
|
|
237
|
+
// a hub full of "unavailable" would bury the one thing the agent must do
|
|
238
|
+
// (re-authenticate) under five identical stubs.
|
|
239
|
+
// - 404 → the project does not exist or is not this account's. Returning
|
|
240
|
+
// "here is your project: 0 personas, 0 reports" for someone else's UUID
|
|
241
|
+
// would be a confident answer to a question we cannot answer.
|
|
242
|
+
// Any OTHER project-meta failure (5xx, timeout, unreadable body) degrades like a
|
|
243
|
+
// child: the children may well have loaded, and a partial map beats nothing.
|
|
244
|
+
//
|
|
245
|
+
// ⚠️ ORDERING: the five endpoints do NOT share a sort key, and the differences
|
|
246
|
+
// are user-visible, so each collection carries its OWN ordering phrase (see
|
|
247
|
+
// `HUB_CHILDREN`). Verified against the `.order()` calls in the app's db layer at
|
|
248
|
+
// the time of writing — personas `created_at`, interviews `started_at`, reports
|
|
249
|
+
// `created_at`, competitors `last_seen_at` (newest ACTIVITY), community
|
|
250
|
+
// `created_at` (newest DISCOVERY). Do not collapse these into one "newest first":
|
|
251
|
+
// U7 shipped a copied ordering claim that told agents the wrong thing.
|
|
252
|
+
//
|
|
253
|
+
// ⚠️ COUNTS ARE NOT ALL EXACT. Four endpoints return `pagination.total`; the
|
|
254
|
+
// reports list (`GET /api/validate`) returns `{ jobs }` with NO total and NO
|
|
255
|
+
// offset. So a reports count is a FLOOR, not a count, whenever the page comes
|
|
256
|
+
// back full. Every collection therefore carries `countExact`, and the text says
|
|
257
|
+
// "at least N" when it is false — the one tool whose whole job is telling an
|
|
258
|
+
// agent what exists must not round a floor up into a fact.
|
|
259
|
+
//
|
|
260
|
+
// ⚠️ VOCABULARY: inlined competitors and community signals go through the SAME
|
|
261
|
+
// `toCompetitorSummary` / `toCommunitySignalSummary` mappers `list_competitors` /
|
|
262
|
+
// `list_community_signals` use (FUL-215). Passing the raw rows through here
|
|
263
|
+
// instead would hand an agent `comment_count` from this tool and `commentCount`
|
|
264
|
+
// from that one for a single number.
|
|
265
|
+
// Matches every sibling read tool's 30s (PROJECTS_/PERSONAS_/COLLECTIONS_/
|
|
266
|
+
// REPORTS_FETCH_TIMEOUT_MS). A tighter budget here would make the SAME endpoint
|
|
267
|
+
// read as "unavailable" through this tool while `list_personas` returned it
|
|
268
|
+
// fine — the fan-out is parallel, so a longer per-leg budget costs no extra
|
|
269
|
+
// wall time, and a spurious "unavailable" is the expensive outcome.
|
|
270
|
+
const HUB_FETCH_TIMEOUT_MS = 30_000;
|
|
271
|
+
const HUB_LIMIT_MAX = 50;
|
|
272
|
+
const HUB_LIMIT_DEFAULT = 10;
|
|
273
|
+
/** The child collections `include` can inline. Order drives the text rendering. */
|
|
274
|
+
const HUB_COLLECTIONS = [
|
|
275
|
+
'personas',
|
|
276
|
+
'interviews',
|
|
277
|
+
'competitors',
|
|
278
|
+
'community',
|
|
279
|
+
'reports',
|
|
280
|
+
];
|
|
281
|
+
export const GetProjectInputSchema = z.object({
|
|
282
|
+
project_id: z
|
|
283
|
+
.string()
|
|
284
|
+
.uuid()
|
|
285
|
+
.describe('UUID of the project to orient on. Get it from `list_projects` (or ' +
|
|
286
|
+
'`create_project`). Rejected with a 404 if the project does not exist or ' +
|
|
287
|
+
'belongs to a different account.'),
|
|
288
|
+
include: z
|
|
289
|
+
.array(z.enum(HUB_COLLECTIONS))
|
|
290
|
+
.optional()
|
|
291
|
+
.describe('Optional list of child collections to INLINE in full — any of ' +
|
|
292
|
+
'"personas", "interviews", "competitors", "community", "reports". Omit ' +
|
|
293
|
+
'(the default) to get counts, IDs, and one-line summaries only, which is ' +
|
|
294
|
+
'usually enough to decide what to read next. Name a collection here when ' +
|
|
295
|
+
'you intend to reason over its records and want to skip the follow-up ' +
|
|
296
|
+
'call. NOTE: inlined interviews carry `messageCount` but NOT their message ' +
|
|
297
|
+
'transcripts — a page of full transcripts would swamp the response; use ' +
|
|
298
|
+
'`get_interview` for one transcript.'),
|
|
299
|
+
limit: z
|
|
300
|
+
.number()
|
|
301
|
+
.int()
|
|
302
|
+
.min(1)
|
|
303
|
+
.max(HUB_LIMIT_MAX)
|
|
304
|
+
.optional()
|
|
305
|
+
.default(HUB_LIMIT_DEFAULT)
|
|
306
|
+
.describe(`Maximum records to sample PER collection (1-${HUB_LIMIT_MAX}, default ${HUB_LIMIT_DEFAULT}). ` +
|
|
307
|
+
'Caps the response size — this tool reads five collections at once. The ' +
|
|
308
|
+
'COUNTS are still the project-wide totals (except reports, see ' +
|
|
309
|
+
'`countExact`); this only bounds how many ids/summaries/inlined records ' +
|
|
310
|
+
'come back. To page beyond it, use the per-collection list tool.'),
|
|
311
|
+
});
|
|
312
|
+
/**
|
|
313
|
+
* Fan-out specs, keyed by `ChildKey` rather than held in a bare array so BOTH
|
|
314
|
+
* directions are compiler-checked: an `include` value with no spec, or a spec
|
|
315
|
+
* for a key `include` does not offer, is a type error. As a plain
|
|
316
|
+
* `readonly ChildSpec[]` only the spec→key direction was checked — adding a
|
|
317
|
+
* sixth entry to `HUB_COLLECTIONS` compiled fine and silently produced an
|
|
318
|
+
* `include` option that fetched nothing.
|
|
319
|
+
*/
|
|
320
|
+
const HUB_CHILD_SPECS = {
|
|
321
|
+
personas: {
|
|
322
|
+
key: 'personas',
|
|
323
|
+
path: '/api/personas',
|
|
324
|
+
collectionKey: 'personas',
|
|
325
|
+
label: 'Personas',
|
|
326
|
+
order: 'newest created first',
|
|
327
|
+
hasTotal: true,
|
|
328
|
+
supportsOffset: true,
|
|
329
|
+
listTool: 'list_personas',
|
|
330
|
+
},
|
|
331
|
+
interviews: {
|
|
332
|
+
key: 'interviews',
|
|
333
|
+
path: '/api/interviews',
|
|
334
|
+
collectionKey: 'interviews',
|
|
335
|
+
label: 'Interviews',
|
|
336
|
+
// `interviews-api.ts` orders by `started_at`, not `created_at`.
|
|
337
|
+
order: 'newest started first',
|
|
338
|
+
hasTotal: true,
|
|
339
|
+
supportsOffset: true,
|
|
340
|
+
listTool: 'list_interviews',
|
|
341
|
+
},
|
|
342
|
+
competitors: {
|
|
343
|
+
key: 'competitors',
|
|
344
|
+
path: '/api/competitors',
|
|
345
|
+
collectionKey: 'competitors',
|
|
346
|
+
label: 'Competitors',
|
|
347
|
+
// `last_seen_at DESC` — a competitor re-sighted by a later run moves back up.
|
|
348
|
+
order: 'most recently seen first',
|
|
349
|
+
hasTotal: true,
|
|
350
|
+
supportsOffset: true,
|
|
351
|
+
listTool: 'list_competitors',
|
|
352
|
+
},
|
|
353
|
+
community: {
|
|
354
|
+
key: 'community',
|
|
355
|
+
path: '/api/community',
|
|
356
|
+
collectionKey: 'communitySignals',
|
|
357
|
+
label: 'Community signals',
|
|
358
|
+
// `created_at DESC` — FIRST sighting, deliberately stable under re-merge.
|
|
359
|
+
order: 'newest discovered first',
|
|
360
|
+
hasTotal: true,
|
|
361
|
+
supportsOffset: true,
|
|
362
|
+
listTool: 'list_community_signals',
|
|
363
|
+
},
|
|
364
|
+
reports: {
|
|
365
|
+
key: 'reports',
|
|
366
|
+
path: '/api/validate',
|
|
367
|
+
collectionKey: 'jobs',
|
|
368
|
+
label: 'Reports',
|
|
369
|
+
order: 'newest created first',
|
|
370
|
+
hasTotal: false,
|
|
371
|
+
supportsOffset: false,
|
|
372
|
+
listTool: 'list_reports',
|
|
373
|
+
},
|
|
374
|
+
};
|
|
375
|
+
/**
|
|
376
|
+
* The fan-out list, ordered by `HUB_COLLECTIONS` so the rendering order and the
|
|
377
|
+
* `include` enum can never disagree.
|
|
378
|
+
*/
|
|
379
|
+
const HUB_CHILDREN = HUB_COLLECTIONS.map((key) => HUB_CHILD_SPECS[key]);
|
|
380
|
+
/** GET one fan-out target. Never throws — that is the whole contract. */
|
|
381
|
+
async function hubFetch(deps, path) {
|
|
382
|
+
const ctx = makeCtx(deps);
|
|
383
|
+
let response;
|
|
384
|
+
try {
|
|
385
|
+
response = await apiCall(ctx, 'GET', path, { timeoutMs: HUB_FETCH_TIMEOUT_MS });
|
|
386
|
+
}
|
|
387
|
+
catch (err) {
|
|
388
|
+
const e = err;
|
|
389
|
+
if (e.name === 'AbortError' || e.name === 'TimeoutError') {
|
|
390
|
+
return { ok: false, kind: 'timeout', detail: `timed out after ${HUB_FETCH_TIMEOUT_MS / 1000}s` };
|
|
391
|
+
}
|
|
392
|
+
return { ok: false, kind: 'http', detail: truncate(e.message ?? String(err), 200) };
|
|
393
|
+
}
|
|
394
|
+
if (!response.ok) {
|
|
395
|
+
if (categorizeFetchError(response.status) === 'auth') {
|
|
396
|
+
return {
|
|
397
|
+
ok: false,
|
|
398
|
+
kind: 'auth',
|
|
399
|
+
detail: 'session expired (HTTP 401)',
|
|
400
|
+
transientRefresh: response.refreshError?.kind === 'transient',
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
const detail = await parseErrorDetail(response);
|
|
404
|
+
if (response.status === 404) {
|
|
405
|
+
return { ok: false, kind: 'notFound', detail: detail || 'not found' };
|
|
406
|
+
}
|
|
407
|
+
if (response.status === 429) {
|
|
408
|
+
// Worth its own kind: one `get_project` spends six requests at once, and
|
|
409
|
+
// `/api/validate` sits behind a per-user read limiter shared with the
|
|
410
|
+
// other validation reads. Folded into the generic HTTP bucket, a rate
|
|
411
|
+
// limit reads as a broken endpoint — so an agent retries immediately
|
|
412
|
+
// (making it worse) instead of waiting, or gives up on data that is
|
|
413
|
+
// simply behind a cooldown.
|
|
414
|
+
const retryAfter = response.headers.get('retry-after');
|
|
415
|
+
return {
|
|
416
|
+
ok: false,
|
|
417
|
+
kind: 'rateLimited',
|
|
418
|
+
detail: `rate limited (HTTP 429)${retryAfter ? ` — retry after ${retryAfter}s` : ''}` +
|
|
419
|
+
`${detail ? `: ${detail}` : ''}`,
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
return {
|
|
423
|
+
ok: false,
|
|
424
|
+
kind: 'http',
|
|
425
|
+
detail: `HTTP ${response.status}${detail ? `: ${detail}` : ''}`,
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
const json = (await response.json().catch(() => null));
|
|
429
|
+
if (!json || typeof json !== 'object') {
|
|
430
|
+
return { ok: false, kind: 'body', detail: 'the server returned a 200 with an unreadable body' };
|
|
431
|
+
}
|
|
432
|
+
return { ok: true, json };
|
|
433
|
+
}
|
|
434
|
+
function describeFailure(outcome) {
|
|
435
|
+
switch (outcome.kind) {
|
|
436
|
+
case 'auth':
|
|
437
|
+
return 'session expired (HTTP 401)';
|
|
438
|
+
case 'notFound':
|
|
439
|
+
return 'not found, or not owned by this account (HTTP 404)';
|
|
440
|
+
case 'timeout':
|
|
441
|
+
case 'body':
|
|
442
|
+
case 'rateLimited':
|
|
443
|
+
case 'http':
|
|
444
|
+
return outcome.detail;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Normalise a child row for the hub.
|
|
449
|
+
*
|
|
450
|
+
* Competitors and community signals go through U7's mappers so this tool and
|
|
451
|
+
* `list_competitors` / `list_community_signals` speak ONE vocabulary for the same
|
|
452
|
+
* concepts. Interviews are stripped of `messages`: `GET /api/interviews`
|
|
453
|
+
* eager-loads `messages(*)`, so inlining a page of them verbatim would return
|
|
454
|
+
* every word of every transcript from an orientation call.
|
|
455
|
+
*/
|
|
456
|
+
function toHubItem(key, row) {
|
|
457
|
+
const record = (row !== null && typeof row === 'object' ? row : {});
|
|
458
|
+
switch (key) {
|
|
459
|
+
case 'competitors':
|
|
460
|
+
return toCompetitorSummary(record);
|
|
461
|
+
case 'community':
|
|
462
|
+
return toCommunitySignalSummary(record);
|
|
463
|
+
case 'interviews': {
|
|
464
|
+
const { messages, ...rest } = record;
|
|
465
|
+
return { ...rest, messageCount: Array.isArray(messages) ? messages.length : null };
|
|
466
|
+
}
|
|
467
|
+
case 'personas':
|
|
468
|
+
case 'reports':
|
|
469
|
+
return record;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
function nonEmptyString(value) {
|
|
473
|
+
return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null;
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* A server-reported `total` we are willing to publish as an exact count, or
|
|
477
|
+
* `null` when the response cannot support one.
|
|
478
|
+
*
|
|
479
|
+
* Rejects a non-integer, a negative, and — the case worth spelling out — a total
|
|
480
|
+
* SMALLER than the rows the same response just delivered. That combination is
|
|
481
|
+
* self-contradictory, and rendering it produced "Competitors: 0" directly above
|
|
482
|
+
* a competitor's name. A caller cannot act on a collection that reports two
|
|
483
|
+
* different realities, so neither number is published.
|
|
484
|
+
*/
|
|
485
|
+
function validTotal(value, deliveredRows) {
|
|
486
|
+
if (typeof value !== 'number' || !Number.isInteger(value) || value < 0)
|
|
487
|
+
return null;
|
|
488
|
+
return value < deliveredRows ? null : value;
|
|
489
|
+
}
|
|
490
|
+
/** One-line human label per child kind, for both the text body and `summaries`. */
|
|
491
|
+
function labelFor(key, item) {
|
|
492
|
+
switch (key) {
|
|
493
|
+
case 'personas': {
|
|
494
|
+
const name = nonEmptyString(item.name) ?? '(unnamed persona)';
|
|
495
|
+
const role = nonEmptyString(item.role);
|
|
496
|
+
return role ? `${name} (${role})` : name;
|
|
497
|
+
}
|
|
498
|
+
case 'interviews': {
|
|
499
|
+
const status = nonEmptyString(item.status) ?? 'unknown';
|
|
500
|
+
// `messageCount` is null when the row carried no `messages` array — we do
|
|
501
|
+
// not KNOW the count. Printing "0 messages" for that would state an empty
|
|
502
|
+
// transcript as fact, which reads as "this interview never happened".
|
|
503
|
+
const count = item.messageCount;
|
|
504
|
+
if (typeof count !== 'number')
|
|
505
|
+
return `${status} — message count unknown`;
|
|
506
|
+
return `${status} — ${count} message${count === 1 ? '' : 's'}`;
|
|
507
|
+
}
|
|
508
|
+
case 'competitors':
|
|
509
|
+
return nonEmptyString(item.name) ?? '(unnamed competitor)';
|
|
510
|
+
case 'community':
|
|
511
|
+
return truncate(nonEmptyString(item.title) ?? '(untitled thread)', 80);
|
|
512
|
+
case 'reports': {
|
|
513
|
+
const prompt = nonEmptyString(item.prompt);
|
|
514
|
+
const status = nonEmptyString(item.status) ?? 'unknown';
|
|
515
|
+
return `${prompt ? `"${truncate(prompt, 60)}"` : '(no prompt)'} — ${status}`;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
function buildCollection(spec, outcome, limit, inline) {
|
|
520
|
+
if (!outcome.ok) {
|
|
521
|
+
return { error: 'unavailable', detail: describeFailure(outcome) };
|
|
522
|
+
}
|
|
523
|
+
const raw = outcome.json[spec.collectionKey];
|
|
524
|
+
if (!Array.isArray(raw)) {
|
|
525
|
+
// A 200 whose body we cannot read is NOT an empty collection, and here the
|
|
526
|
+
// difference is expensive: "0 competitors" nudges an agent straight into a
|
|
527
|
+
// credit-debiting `scan_competitors` for data the project may already hold.
|
|
528
|
+
return {
|
|
529
|
+
error: 'unavailable',
|
|
530
|
+
detail: `the server returned a 200 with no \`${spec.collectionKey}\` array — ` +
|
|
531
|
+
'this is a failed read, NOT an empty collection',
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
// Slice before mapping. The server is asked for `limit` and every endpoint
|
|
535
|
+
// caps at or above it, but `limit` is ADVERTISED as the per-collection cap, so
|
|
536
|
+
// a server that over-returns must not silently blow past the size bound an
|
|
537
|
+
// agent chose — five collections over-returning at once is how an orientation
|
|
538
|
+
// call turns into a context flood.
|
|
539
|
+
const items = raw.slice(0, limit).map((row) => toHubItem(spec.key, row));
|
|
540
|
+
const pagination = outcome.json.pagination;
|
|
541
|
+
const rawTotal = pagination?.total;
|
|
542
|
+
const total = spec.hasTotal ? validTotal(rawTotal, items.length) : null;
|
|
543
|
+
if (spec.hasTotal && total === null) {
|
|
544
|
+
// Same principle as the missing-array case above, and it needs saying twice
|
|
545
|
+
// because the failure looks different: a paginated endpoint that answers
|
|
546
|
+
// without a usable `pagination.total` has NOT told us the collection is
|
|
547
|
+
// empty. Falling back to the page length would publish `count: 0,
|
|
548
|
+
// countExact: true` — a confident "this project has none" derived from a
|
|
549
|
+
// broken response, which is exactly the claim that sends an agent off to run
|
|
550
|
+
// a credit-debiting scan. A total smaller than the rows already in hand is
|
|
551
|
+
// rejected by the same rule: a response that contradicts itself cannot be
|
|
552
|
+
// reported as a fact in either direction.
|
|
553
|
+
return {
|
|
554
|
+
error: 'unavailable',
|
|
555
|
+
detail: `the server returned a 200 with no usable \`pagination.total\` for ` +
|
|
556
|
+
`\`${spec.collectionKey}\`${typeof rawTotal === 'number' ? ` (got ${rawTotal} with ${items.length} rows)` : ''} — this is a failed read, NOT an empty collection`,
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
const entry = {
|
|
560
|
+
count: total ?? items.length,
|
|
561
|
+
// With no server-side total, a FULL page means there are probably more.
|
|
562
|
+
countExact: total !== null ? true : items.length < limit,
|
|
563
|
+
shown: items.length,
|
|
564
|
+
ids: items.map((item) => nonEmptyString(item.id)).filter((id) => id !== null),
|
|
565
|
+
summaries: items.map((item) => ({
|
|
566
|
+
id: nonEmptyString(item.id),
|
|
567
|
+
label: labelFor(spec.key, item),
|
|
568
|
+
})),
|
|
569
|
+
};
|
|
570
|
+
if (inline)
|
|
571
|
+
entry.items = items;
|
|
572
|
+
return entry;
|
|
573
|
+
}
|
|
574
|
+
function isUnavailable(entry) {
|
|
575
|
+
return 'error' in entry;
|
|
576
|
+
}
|
|
577
|
+
function countPhrase(entry) {
|
|
578
|
+
return entry.countExact ? String(entry.count) : `at least ${entry.count}`;
|
|
579
|
+
}
|
|
580
|
+
export async function getProject(input, deps) {
|
|
581
|
+
const parsed = GetProjectInputSchema.safeParse(input);
|
|
582
|
+
if (!parsed.success) {
|
|
583
|
+
throw new ProjectToolError(`Invalid input — ${formatZodError(parsed.error)}`);
|
|
584
|
+
}
|
|
585
|
+
const { project_id: projectId, include, limit } = parsed.data;
|
|
586
|
+
const inlined = new Set(include ?? []);
|
|
587
|
+
const childPath = (spec) => {
|
|
588
|
+
const query = new URLSearchParams({ projectId, limit: String(limit) });
|
|
589
|
+
// `/api/validate` takes `limit` only — it has no `offset` param and returns
|
|
590
|
+
// no `pagination`. Sending one would be advertising paging it cannot do.
|
|
591
|
+
if (spec.supportsOffset)
|
|
592
|
+
query.set('offset', '0');
|
|
593
|
+
return `${spec.path}?${query.toString()}`;
|
|
594
|
+
};
|
|
595
|
+
// One parallel round trip for all six reads. `allSettled` is the outer
|
|
596
|
+
// guarantee: a rejected settle (only reachable via a bug in `hubFetch`, which
|
|
597
|
+
// is written not to throw) degrades to a stub instead of failing the call.
|
|
598
|
+
const settled = await Promise.allSettled([
|
|
599
|
+
hubFetch(deps, `/api/projects/${projectId}`),
|
|
600
|
+
...HUB_CHILDREN.map((spec) => hubFetch(deps, childPath(spec))),
|
|
601
|
+
]);
|
|
602
|
+
const toOutcome = (result) => {
|
|
603
|
+
if (!result)
|
|
604
|
+
return { ok: false, kind: 'http', detail: 'no response' };
|
|
605
|
+
if (result.status === 'fulfilled')
|
|
606
|
+
return result.value;
|
|
607
|
+
const reason = result.reason;
|
|
608
|
+
return { ok: false, kind: 'http', detail: truncate(reason?.message ?? String(result.reason), 200) };
|
|
609
|
+
};
|
|
610
|
+
const projectOutcome = toOutcome(settled[0]);
|
|
611
|
+
const childOutcomes = HUB_CHILDREN.map((spec, index) => ({
|
|
612
|
+
spec,
|
|
613
|
+
outcome: toOutcome(settled[index + 1]),
|
|
614
|
+
}));
|
|
615
|
+
// Drop the cached session if ANY leg saw a genuine 401 — the children are
|
|
616
|
+
// separate requests, so a stale token can surface there first.
|
|
617
|
+
const allOutcomes = [projectOutcome, ...childOutcomes.map((child) => child.outcome)];
|
|
618
|
+
const genuineAuthFailure = allOutcomes.some((outcome) => !outcome.ok && outcome.kind === 'auth' && !outcome.transientRefresh);
|
|
619
|
+
if (genuineAuthFailure)
|
|
620
|
+
deps.invalidateSession?.();
|
|
621
|
+
// `!transientRefresh` mirrors the invalidation predicate above, and the two
|
|
622
|
+
// must agree: a 401 whose inline refresh failed for NETWORK reasons is not an
|
|
623
|
+
// expired session. Telling the user to re-authenticate then would send them to
|
|
624
|
+
// fix an account that is fine, and it would fail the whole call for a blip the
|
|
625
|
+
// degradation path handles — so a transient one falls through and degrades
|
|
626
|
+
// like any other project-meta failure.
|
|
627
|
+
if (!projectOutcome.ok && projectOutcome.kind === 'auth' && !projectOutcome.transientRefresh) {
|
|
628
|
+
throw new ProjectToolError('Session expired. Re-run any Clien.ai tool to re-authenticate, then try again.');
|
|
629
|
+
}
|
|
630
|
+
if (!projectOutcome.ok && projectOutcome.kind === 'notFound') {
|
|
631
|
+
throw new ProjectToolError(`Project ${projectId} not found. It may not exist or may belong to a different ` +
|
|
632
|
+
'account — call list_projects to confirm the id.');
|
|
633
|
+
}
|
|
634
|
+
let projectMeta = null;
|
|
635
|
+
let projectFailure = null;
|
|
636
|
+
if (projectOutcome.ok) {
|
|
637
|
+
const candidate = projectOutcome.json.project;
|
|
638
|
+
if (candidate !== null && typeof candidate === 'object') {
|
|
639
|
+
projectMeta = candidate;
|
|
640
|
+
}
|
|
641
|
+
else {
|
|
642
|
+
projectFailure = 'the server returned a 200 with no `project` object';
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
else {
|
|
646
|
+
projectFailure = describeFailure(projectOutcome);
|
|
647
|
+
}
|
|
648
|
+
const collections = {};
|
|
649
|
+
for (const { spec, outcome } of childOutcomes) {
|
|
650
|
+
collections[spec.key] = buildCollection(spec, outcome, limit, inlined.has(spec.key));
|
|
651
|
+
}
|
|
652
|
+
// --- text rendering -------------------------------------------------------
|
|
653
|
+
// ⚠️ Everything below runs AFTER the fan-out, which means it is OUTSIDE the
|
|
654
|
+
// `allSettled` backstop — a throw here fails the whole call and discards six
|
|
655
|
+
// successfully fetched collections, defeating the entire point of the design.
|
|
656
|
+
// So the renderer must be total for ANY value the server can put in these
|
|
657
|
+
// fields. `nonEmptyString` is the guard: a numeric `description` previously
|
|
658
|
+
// reached `truncate`, whose `s.slice` is not a function on a number.
|
|
659
|
+
const projectName = nonEmptyString(projectMeta?.name);
|
|
660
|
+
const projectDescription = nonEmptyString(projectMeta?.description);
|
|
661
|
+
const header = projectMeta
|
|
662
|
+
? `Project "${projectName ?? '(unnamed)'}" (id: ${projectId})` +
|
|
663
|
+
(projectMeta.isLocked ? ' — ⚠️ LOCKED (read-only until the subscription is upgraded)' : '')
|
|
664
|
+
: `Project ${projectId}`;
|
|
665
|
+
const descriptionLine = projectDescription ? `\n${truncate(projectDescription, 300)}` : '';
|
|
666
|
+
const projectWarning = projectFailure
|
|
667
|
+
? `\n⚠️ Project metadata unavailable — ${projectFailure}. The collections below were still read.`
|
|
668
|
+
: '';
|
|
669
|
+
const countLines = HUB_CHILDREN.map((spec) => {
|
|
670
|
+
const entry = collections[spec.key];
|
|
671
|
+
if (!entry || isUnavailable(entry)) {
|
|
672
|
+
return (`- ⚠️ ${spec.label}: UNAVAILABLE — ${entry?.detail ?? 'unknown error'}. ` +
|
|
673
|
+
'This is a failed read, not an empty collection — do not conclude there are none.');
|
|
674
|
+
}
|
|
675
|
+
if (entry.count === 0)
|
|
676
|
+
return `- ${spec.label}: 0`;
|
|
677
|
+
const shownNote = entry.shown < entry.count ? `, showing ${entry.shown}` : '';
|
|
678
|
+
const totalNote = entry.countExact
|
|
679
|
+
? ''
|
|
680
|
+
: ' — this endpoint reports no total, so the count is a lower bound';
|
|
681
|
+
return `- ${spec.label}: ${countPhrase(entry)} (${spec.order}${shownNote})${totalNote}`;
|
|
682
|
+
});
|
|
683
|
+
const detailBlocks = HUB_CHILDREN.flatMap((spec) => {
|
|
684
|
+
const entry = collections[spec.key];
|
|
685
|
+
if (!entry || isUnavailable(entry) || entry.summaries.length === 0)
|
|
686
|
+
return [];
|
|
687
|
+
const lines = entry.summaries.map((s) => ` - ${s.label} — id: ${s.id ?? 'unknown'}`);
|
|
688
|
+
// Two different "there is more" cases, and the second one used to be
|
|
689
|
+
// unreachable: when `countExact` is false there is no server total, so
|
|
690
|
+
// `count` EQUALS `shown` and the first branch never fires — leaving the one
|
|
691
|
+
// collection whose count is a lower bound as the only one that never told
|
|
692
|
+
// the agent how to see the rest.
|
|
693
|
+
let more = '';
|
|
694
|
+
if (entry.shown < entry.count) {
|
|
695
|
+
more = `\n (${entry.count - entry.shown} more — page with ${spec.listTool})`;
|
|
696
|
+
}
|
|
697
|
+
else if (!entry.countExact) {
|
|
698
|
+
more = `\n (there may be more — page with ${spec.listTool})`;
|
|
699
|
+
}
|
|
700
|
+
return [`${spec.label} (${spec.order}):\n${lines.join('\n')}${more}`];
|
|
701
|
+
});
|
|
702
|
+
const loaded = HUB_CHILDREN.map((spec) => collections[spec.key]).filter((entry) => entry !== undefined && !isUnavailable(entry));
|
|
703
|
+
const everythingLoaded = loaded.length === HUB_CHILDREN.length;
|
|
704
|
+
// `projectFailure === null` is load-bearing, not belt-and-braces: without it a
|
|
705
|
+
// 502 on project meta plus five genuinely empty children rendered "⚠️ Project
|
|
706
|
+
// metadata unavailable" and "This project is empty — nothing failed" in the
|
|
707
|
+
// same response. The one claim this tool exists to make trustworthy is the
|
|
708
|
+
// difference between "failed" and "empty"; contradicting itself about that in
|
|
709
|
+
// consecutive lines is worse than either message alone.
|
|
710
|
+
const isEmptyProject = projectFailure === null && everythingLoaded && loaded.every((entry) => entry.count === 0);
|
|
711
|
+
const footer = isEmptyProject
|
|
712
|
+
? '\n\nThis project is empty — nothing failed, there is simply no data yet. Run ' +
|
|
713
|
+
'clien_research for a full validation pass, or create_persona / scan_competitors / ' +
|
|
714
|
+
'search_forums for a targeted first step.'
|
|
715
|
+
: '\n\nIds and full records are in `_meta.collections`. Read one child with get_persona / ' +
|
|
716
|
+
'get_interview / get_report, page a whole collection with list_personas / list_interviews / ' +
|
|
717
|
+
'list_competitors / list_community_signals / list_reports, or re-call get_project with ' +
|
|
718
|
+
'`include` to inline a collection here.';
|
|
719
|
+
const text = `${header}${descriptionLine}${projectWarning}\n\n${countLines.join('\n')}` +
|
|
720
|
+
(detailBlocks.length > 0 ? `\n\n${detailBlocks.join('\n\n')}` : '') +
|
|
721
|
+
footer;
|
|
722
|
+
return {
|
|
723
|
+
content: [{ type: 'text', text }],
|
|
724
|
+
_meta: {
|
|
725
|
+
// Same `{ error: 'unavailable', detail }` shape as a degraded collection,
|
|
726
|
+
// so a caller keys on the presence of `.error` in exactly one way.
|
|
727
|
+
project: projectMeta ?? { error: 'unavailable', detail: projectFailure },
|
|
728
|
+
collections,
|
|
729
|
+
limit,
|
|
730
|
+
included: [...inlined],
|
|
731
|
+
},
|
|
732
|
+
};
|
|
733
|
+
}
|
|
195
734
|
//# sourceMappingURL=projects.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"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"}
|