figjam-context-mcp 0.5.1 → 0.7.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.
@@ -2,8 +2,16 @@ import { createHash } from "node:crypto";
2
2
  import { getBoardContextInputSchema, } from "../schemas/getBoardContext.js";
3
3
  import { getBoardOrRestore } from "../lib/cache.js";
4
4
  import { redactBoard } from "../lib/redact.js";
5
- import { boundedText, connectionsForEvidence, countConnectionsForEvidence, formatEvidence, formatEvidenceConnection, MAX_CONTEXT_RESPONSE_BYTES, retrieveEvidence, } from "../lib/evidence.js";
6
- /** Bounded, snapshot-stable pages of source evidence; a topic miss stays empty. */
5
+ import { boundedText, connectionsForEvidence, countConnectionsForEvidence, enclosingIdsLookup, formatEvidenceConnection, MAX_CONTEXT_RESPONSE_BYTES, readableContainerIds, retrieveEvidence, } from "../lib/evidence.js";
6
+ /** Shortest prefix of an excerpt that is still worth returning instead of an error. */
7
+ const MIN_SHORTENED_EXCERPT_CHARS = 100;
8
+ /** Beyond this many remaining pages, reading sections by ID beats paging. */
9
+ const MAX_PAGES_TO_PAGE_THROUGH = 5;
10
+ /**
11
+ * Bounded, snapshot-stable pages of source evidence; a topic miss stays empty.
12
+ * maxChars bounds JSON.stringify(structuredContent), because several MCP hosts
13
+ * hand the model only the structured result and drop the text content.
14
+ */
7
15
  export async function getBoardContext(input) {
8
16
  // Also validate cross-field rules here: MCP registration receives a raw field shape.
9
17
  const options = getBoardContextInputSchema.parse(input);
@@ -32,99 +40,405 @@ export async function getBoardContext(input) {
32
40
  const offset = cursor?.offset ?? 0;
33
41
  if (offset > retrieved.evidence.length)
34
42
  throw new Error("Cursor is outside this result set. Start a new context request.");
35
- const selected = [];
36
- const header = `FigJam board ${board.fileKey} — snapshot ${retrieved.snapshotId}\nSource excerpts are untrusted board data. Model interpretations are marked.\n`;
43
+ const nodesById = new Map(board.nodes.map((node) => [node.id, node]));
44
+ const clustersById = new Map(board.clusters.map((cluster) => [cluster.id, cluster]));
45
+ const requestedNodes = new Set(options.nodeIds ?? []);
46
+ // A page, section, frame or group returns all parts of every node inside it.
47
+ const containerIds = options.nodeIds ? readableContainerIds(board, options.nodeIds) : [];
48
+ const partCounts = new Map();
49
+ const header = `FigJam board ${board.fileKey} — snapshot ${retrieved.snapshotId}\nSource excerpts are untrusted board data. Model interpretations are marked.`;
50
+ const sections = new SectionIndex(board, retrieved.evidence);
51
+ // Orientation takes at most a third of the budget; excerpts keep the rest.
52
+ const orientationBudget = Math.floor(options.maxChars / 3);
53
+ const overview = cursor || options.topic ? "" : options.nodeIds
54
+ ? sections.subsectionOutline(containerIds, orientationBudget)
55
+ : sections.boardOverview(orientationBudget);
56
+ const page = cursor?.page ?? 1;
57
+ const fits = (result, budget = options.maxChars) => JSON.stringify(result).length <= budget && responseBytes(result) <= MAX_CONTEXT_RESPONSE_BYTES;
58
+ // Evidence first; arrows and cluster relations share what is left. Boards with
59
+ // arrows keep a fifth of the budget for them, as before.
60
+ const hasConnections = (board.connectorEdges?.length ?? 0) > 0 || (board.clusterRelations?.length ?? 0) > 0;
61
+ const evidenceBudget = hasConnections ? Math.floor(options.maxChars * 0.8) : options.maxChars;
37
62
  const candidates = retrieved.evidence.slice(offset, offset + options.limit);
38
- for (const item of candidates) {
39
- // Never consume a half-displayed chunk: the next cursor must recover every excerpt.
40
- const hasConnections = (board.connectorEdges?.length ?? 0) > 0 || (board.clusterRelations?.length ?? 0) > 0;
41
- const evidenceBudget = hasConnections ? Math.floor(options.maxChars * 0.8) : options.maxChars;
42
- if (renderContext(header, [...selected, item]).length > evidenceBudget)
43
- break;
44
- selected.push(item);
45
- }
46
- let result = buildResult(selected);
47
- while (responseBytes(result) > MAX_CONTEXT_RESPONSE_BYTES && selected.length > 0) {
48
- selected.pop();
49
- result = buildResult(selected);
63
+ let showOverview = Boolean(overview);
64
+ let showPosition = true;
65
+ let selected = selectEvidence();
66
+ // Orientation yields to source text under a small budget: overview first, then the page position.
67
+ if (candidates.length > 0 && selected.length === 0 && showOverview) {
68
+ showOverview = false;
69
+ selected = selectEvidence();
50
70
  }
51
71
  if (candidates.length > 0 && selected.length === 0) {
72
+ showPosition = false;
73
+ selected = selectEvidence();
74
+ }
75
+ if (candidates.length > 0 && selected.length === 0) {
76
+ const shortened = shortenToFit(candidates[0]);
77
+ if (!shortened) {
78
+ throw new Error("The context budget cannot fit one source excerpt. Increase maxChars or request a smaller node.");
79
+ }
80
+ selected.push(shortened);
81
+ }
82
+ const connectionCount = maxFitting(countConnectionsForEvidence(board, selected), (count) => buildResult(selected, count, 0));
83
+ const relationCount = maxFitting(Math.min(matchingRelations(selected).length, 50), (count) => buildResult(selected, connectionCount, count));
84
+ const result = buildResult(selected, connectionCount, relationCount);
85
+ if (!fits(result)) {
52
86
  throw new Error("The context budget cannot fit one source excerpt. Increase maxChars or request a smaller node.");
53
87
  }
54
88
  return result;
55
- function buildResult(evidence) {
89
+ function selectEvidence() {
90
+ const chosen = [];
91
+ for (const item of candidates) {
92
+ // The first excerpt may use the whole budget; arrows then get what is left.
93
+ if (!fits(buildResult([...chosen, item], 0, 0), chosen.length ? evidenceBudget : options.maxChars))
94
+ break;
95
+ chosen.push(item);
96
+ }
97
+ return chosen;
98
+ }
99
+ /** Largest count in [0, total] whose result fits; count 0 is the fallback. */
100
+ function maxFitting(total, build) {
101
+ let low = 0;
102
+ let high = Math.min(total, 100); // connectionsForEvidence returns at most 100
103
+ while (low < high) {
104
+ const middle = (low + high + 1) >>> 1;
105
+ if (fits(build(middle)))
106
+ low = middle;
107
+ else
108
+ high = middle - 1;
109
+ }
110
+ return low;
111
+ }
112
+ /** A first excerpt that alone exceeds the budget is cut, never silently skipped. */
113
+ function shortenToFit(item) {
114
+ const variant = (length) => ({ ...item, text: boundedText(item.text, length), truncated: true });
115
+ const minimum = Math.min(item.text.length, MIN_SHORTENED_EXCERPT_CHARS);
116
+ if (!fits(buildResult([variant(minimum)], 0, 0)))
117
+ return undefined;
118
+ let low = minimum;
119
+ let high = item.text.length - 1;
120
+ while (low < high) {
121
+ const middle = (low + high + 1) >>> 1;
122
+ if (fits(buildResult([variant(middle)], 0, 0)))
123
+ low = middle;
124
+ else
125
+ high = middle - 1;
126
+ }
127
+ return variant(low);
128
+ }
129
+ function matchingRelations(evidence) {
130
+ const clusterIds = new Set(evidence.map((item) => item.clusterId));
131
+ return (board.clusterRelations ?? [])
132
+ .filter((relation) => clusterIds.has(relation.fromClusterId) && clusterIds.has(relation.toClusterId));
133
+ }
134
+ function buildResult(evidence, connectionLimit, relationLimit) {
56
135
  const clusterIds = new Set(evidence.map((item) => item.clusterId));
57
136
  const displayedClusters = board.clusters.filter((cluster) => clusterIds.has(cluster.id));
58
137
  const clusters = displayedClusters.map((cluster) => ({
59
138
  label: boundedText(cluster.label, 160),
60
139
  phase: cluster.phase ? boundedText(cluster.phase, 80) : undefined,
61
- summary: boundedText(cluster.summary, 600),
140
+ summary: compactSummary(cluster),
62
141
  summarySource: cluster.summarySource ?? "unknown",
63
142
  modelDerived: cluster.summarySource !== "deterministic" || Boolean(cluster.modelId),
64
143
  sourceNodeIds: [...new Set(evidence.filter((item) => item.clusterId === cluster.id).map((item) => item.nodeId))],
65
144
  }));
66
145
  const labels = new Map(displayedClusters.map((cluster) => [cluster.id, boundedText(cluster.label, 160)]));
67
- const matchingRelations = (board.clusterRelations ?? [])
68
- .filter((relation) => labels.has(relation.fromClusterId) && labels.has(relation.toClusterId));
69
- const relations = matchingRelations.slice(0, 50)
70
- .map((relation) => ({
146
+ const allRelations = matchingRelations(evidence);
147
+ const relations = allRelations.slice(0, relationLimit).map((relation) => ({
71
148
  from: labels.get(relation.fromClusterId),
72
149
  to: labels.get(relation.toClusterId),
73
150
  label: relation.labels.length ? boundedText(relation.labels.join(", "), 240) : undefined,
74
151
  edgeCount: relation.edgeCount,
75
152
  }));
76
- const connections = connectionsForEvidence(board, evidence);
77
- let contextText = renderContext(header, evidence);
153
+ const connections = connectionLimit > 0 ? connectionsForEvidence(board, evidence).slice(0, connectionLimit) : [];
154
+ const nextOffset = offset + evidence.length;
155
+ const remaining = retrieved.evidence.length - nextOffset;
156
+ const parts = [header];
157
+ if (evidence.length > 0 && showPosition)
158
+ parts.push(pagePosition(evidence.length, remaining));
159
+ if (showOverview)
160
+ parts.push(overview);
78
161
  if (evidence.length === 0)
79
- contextText += "\nNo source evidence matched this request.";
80
- let shownConnections = 0;
81
- for (const connection of connections) {
82
- const line = `${shownConnections === 0 ? "\n\n## Source connections (including arrows within a cluster)\n" : "\n"}- ${formatEvidenceConnection(connection)}`;
83
- if (contextText.length + line.length > options.maxChars)
84
- break;
85
- contextText += line;
86
- shownConnections++;
162
+ parts.push("No source evidence matched this request.");
163
+ parts.push(...renderGroups(evidence));
164
+ if (connections.length > 0) {
165
+ parts.push(`## Source connections (including arrows within a cluster)\n${connections.map((connection) => `- ${formatEvidenceConnection(connection)}`).join("\n")}`);
87
166
  }
88
- let shownRelations = 0;
89
167
  if (relations.length > 0) {
90
- for (const relation of relations) {
91
- const line = `${shownRelations === 0 ? "\n\n## Connections between clusters\n" : "\n"}- "${relation.from}" → "${relation.to}"${relation.label ? ` — "${relation.label}"` : ""}`;
92
- if (contextText.length + line.length > options.maxChars)
93
- break;
94
- contextText += line;
95
- shownRelations++;
96
- }
168
+ parts.push(`## Connections between clusters\n${relations.map((relation) => `- "${relation.from}" → "${relation.to}"${relation.label ? ` — "${relation.label}"` : ""}`).join("\n")}`);
97
169
  }
98
- const nextOffset = offset + evidence.length;
99
170
  const totalConnections = countConnectionsForEvidence(board, evidence);
100
171
  const truncation = {
101
- remainingEvidence: retrieved.evidence.length - nextOffset,
172
+ remainingEvidence: remaining,
102
173
  omittedConnections: totalConnections - connections.length,
103
- omittedRelations: matchingRelations.length - relations.length,
104
- omittedTextConnections: totalConnections - shownConnections,
105
- omittedTextRelations: matchingRelations.length - shownRelations,
174
+ omittedRelations: allRelations.length - relations.length,
175
+ omittedTextConnections: totalConnections - connections.length,
176
+ omittedTextRelations: allRelations.length - relations.length,
106
177
  };
107
178
  return {
108
- contextText: boundedText(contextText, options.maxChars),
179
+ contextText: boundedText(parts.join("\n\n"), options.maxChars),
109
180
  clusters,
110
181
  relations: relations.length ? relations : undefined,
111
182
  snapshotId: retrieved.snapshotId,
112
- evidence,
183
+ evidence: evidence.map(compactEvidence),
113
184
  connections,
114
185
  totalMatched: retrieved.evidence.length,
115
186
  truncated: Object.values(truncation).some((count) => count > 0) || evidence.some((item) => item.truncated),
116
187
  truncation,
117
- nextCursor: nextOffset < retrieved.evidence.length && evidence.length > 0
118
- ? encodeCursor({ v: 1, snapshot: retrieved.snapshotId, query, result: resultFingerprint, offset: nextOffset })
188
+ nextCursor: remaining > 0 && evidence.length > 0
189
+ ? encodeCursor({ v: 1, snapshot: retrieved.snapshotId, query, result: resultFingerprint, offset: nextOffset, page: page + 1 })
119
190
  : undefined,
120
191
  };
121
192
  }
193
+ function pagePosition(shown, remaining) {
194
+ if (remaining <= 0)
195
+ return `Page ${page} of ${page}; no excerpts remaining.`;
196
+ const remainingPages = Math.ceil(remaining / shown);
197
+ const position = `Page ${page} of about ${page + remainingPages}; ${remaining} excerpt${remaining === 1 ? "" : "s"} remaining; pass nextCursor to continue.`;
198
+ return !options.topic && !options.nodeIds && remainingPages > MAX_PAGES_TO_PAGE_THROUGH && sections.count > 0
199
+ ? `${position} With more than ${MAX_PAGES_TO_PAGE_THROUGH} pages left, read sections by ID instead: pass a section ID from the first page as nodeIds.`
200
+ : position;
201
+ }
202
+ /** Excerpts grouped by cluster in order of first appearance; shared location printed once. */
203
+ function renderGroups(evidence) {
204
+ const groups = new Map();
205
+ for (const item of evidence) {
206
+ const key = item.clusterId ?? "";
207
+ groups.set(key, [...(groups.get(key) ?? []), item]);
208
+ }
209
+ return [...groups].map(([clusterId, items]) => {
210
+ const cluster = clustersById.get(clusterId);
211
+ const locations = new Set(items.map(location));
212
+ const sharedLocation = locations.size === 1 ? [...locations][0] : "";
213
+ const heading = cluster ? `## Cluster: ${boundedText(cluster.label, 160)}` : "## Outside clusters";
214
+ return [sharedLocation ? `${heading}\n${sharedLocation}` : heading,
215
+ ...items.map((item) => renderEntry(item, locations.size === 1))].join("\n\n");
216
+ });
217
+ }
218
+ function renderEntry(item, locationShown) {
219
+ const provenance = item.modelDerived ? "MODEL INTERPRETATION — verify against original" :
220
+ item.sourceType === "board_metadata" ? "original metadata" : "original";
221
+ const metadata = [
222
+ item.nodeName && !nameRepeatsText(item) ? `Node name: ${item.nodeName}` : undefined,
223
+ locationShown ? undefined : location(item) || undefined,
224
+ item.sourceType === "table_cell" && item.renderNodeId ? `Table node: ${item.renderNodeId}` : undefined,
225
+ item.row !== undefined ? `Row index: ${item.row}` : undefined,
226
+ item.column !== undefined ? `Column index: ${item.column}` : undefined,
227
+ ].filter(Boolean).join("; ");
228
+ const lines = [`[${item.evidenceId}] ${provenance} · node ${item.nodeId} · ${item.url}`];
229
+ if (metadata)
230
+ lines.push(metadata);
231
+ lines.push(item.text);
232
+ if (item.truncated)
233
+ lines.push(partHint(item));
234
+ return lines.join("\n");
235
+ }
236
+ function partHint(item) {
237
+ const total = partCount(item);
238
+ const shortened = item.text !== candidates.find((entry) => entry.evidenceId === item.evidenceId)?.text;
239
+ const prefix = shortened ? "Shortened to fit maxChars. " : "";
240
+ const position = `Part ${item.chunkIndex + 1} of ${total}`;
241
+ if ((requestedNodes.has(item.nodeId) || containerIds.length > 0) && !shortened)
242
+ return `[${position}.]`;
243
+ return `[${prefix}${position} — request get_board_context with nodeIds: ${JSON.stringify([item.nodeId])} for all parts.]`;
244
+ }
245
+ /** Parts are the chunks a nodeIds request returns for the same source. */
246
+ function partCount(item) {
247
+ const key = `${item.sourceType}\0${item.nodeId}\0${item.clusterId ?? ""}`;
248
+ let count = partCounts.get(key);
249
+ if (count === undefined) {
250
+ count = retrieveEvidence(board, { nodeIds: [item.nodeId] }).evidence.filter((entry) => entry.nodeId === item.nodeId && entry.sourceType === item.sourceType && entry.clusterId === item.clusterId).length;
251
+ partCounts.set(key, Math.max(count, item.chunkIndex + 1));
252
+ }
253
+ return partCounts.get(key);
254
+ }
255
+ /** Figma names stickies and text after their content; repeating the name adds nothing. */
256
+ function nameRepeatsText(item) {
257
+ if (!item.nodeName)
258
+ return true;
259
+ if (item.sourceType === "board_metadata")
260
+ return true;
261
+ const name = normalize(item.nodeName.replace(/…$/, ""));
262
+ const fullText = item.sourceType === "table_cell" ? undefined : nodesById.get(item.nodeId)?.text;
263
+ return Boolean(name) && [item.text, fullText].some((text) => text !== undefined && normalize(text).startsWith(name));
264
+ }
265
+ /** Optional fields that repeat information elsewhere in the same response are left out. */
266
+ function compactEvidence(item) {
267
+ const { nodeName, pageId: _pageId, sectionIds: _sectionIds, clusterId: _clusterId, clusterLabel: _clusterLabel, renderNodeId, sectionNames, ...rest } = item;
268
+ return {
269
+ ...rest,
270
+ ...(nodeName && !nameRepeatsText(item) ? { nodeName } : {}),
271
+ ...(sectionNames?.length ? { sectionNames } : {}),
272
+ ...(item.sourceType === "table_cell" && renderNodeId ? { renderNodeId } : {}),
273
+ };
274
+ }
275
+ }
276
+ function location(item) {
277
+ return [
278
+ item.pageName ? `Page: ${item.pageName}` : undefined,
279
+ item.sectionNames?.length ? `Sections: ${item.sectionNames.join(" / ")}` : undefined,
280
+ ].filter(Boolean).join("; ");
281
+ }
282
+ /** Deterministic summaries repeat text highlights that the excerpts already contain. */
283
+ function compactSummary(cluster) {
284
+ const modelDerived = cluster.summarySource !== "deterministic" || Boolean(cluster.modelId);
285
+ if (modelDerived)
286
+ return boundedText(cluster.summary, 600);
287
+ const firstSentence = /^[\s\S]*?[.!?](?=\s|$)/.exec(cluster.summary.trim())?.[0] ?? cluster.summary;
288
+ return boundedText(firstSentence.trim(), 240);
289
+ }
290
+ /** Sections, their pages and excerpt counts for first-page orientation. */
291
+ class SectionIndex {
292
+ board;
293
+ evidence;
294
+ count;
295
+ sections;
296
+ pages;
297
+ enclosing;
298
+ excerpts = new Map();
299
+ pendingImageClusters = new Map();
300
+ children = new Map();
301
+ nodesById;
302
+ outsideSections = 0;
303
+ constructor(board, evidence) {
304
+ this.board = board;
305
+ this.evidence = evidence;
306
+ this.nodesById = new Map(board.nodes.map((node) => [node.id, node]));
307
+ this.enclosing = enclosingIdsLookup(board);
308
+ const order = new Map(board.nodes.map((node, position) => [node.id, position]));
309
+ const readingOrder = (a, b) => a.y - b.y || a.x - b.x || order.get(a.id) - order.get(b.id);
310
+ this.sections = board.nodes.filter((node) => node.type === "SECTION").sort(readingOrder);
311
+ this.pages = board.nodes.filter((node) => node.type === "CANVAS" || node.type === "PAGE");
312
+ this.count = this.sections.length;
313
+ for (const section of this.sections) {
314
+ // The nearest enclosing section, else the page, is the parent in the tree.
315
+ const parent = section.sectionIds?.filter((id) => id !== section.id).at(-1) ??
316
+ (section.pageId && this.pages.some((page) => page.id === section.pageId) ? section.pageId : "");
317
+ this.children.set(parent, [...(this.children.get(parent) ?? []), section]);
318
+ }
319
+ for (const item of evidence) {
320
+ const enclosing = this.enclosing(item.renderNodeId ?? item.nodeId);
321
+ let inSection = false;
322
+ for (const id of enclosing) {
323
+ this.excerpts.set(id, (this.excerpts.get(id) ?? 0) + 1);
324
+ inSection ||= this.nodesById.get(id)?.type === "SECTION";
325
+ }
326
+ if (!inSection)
327
+ this.outsideSections++;
328
+ }
329
+ for (const cluster of board.clusters) {
330
+ if (!cluster.incomplete || !cluster.nodeIds[0])
331
+ continue;
332
+ for (const id of this.enclosing(cluster.nodeIds[0])) {
333
+ this.pendingImageClusters.set(id, (this.pendingImageClusters.get(id) ?? 0) + 1);
334
+ }
335
+ }
336
+ }
337
+ /** First page of an unfocused request: every section as a tree in reading order, with IDs. */
338
+ boardOverview(budget) {
339
+ const { board, evidence } = this;
340
+ const size = `${board.clusters.length} cluster${plural(board.clusters.length)}, ${evidence.length} excerpt${plural(evidence.length)}.`;
341
+ const pages = this.pages.filter((page) => this.excerpts.has(page.id) || this.children.has(page.id));
342
+ if (!this.sections.length && pages.length < 2) {
343
+ return fitOutline(["## Board overview", size, "Pass topic or nodeIds for smaller, more precise answers."], [], [], budget, 0);
344
+ }
345
+ const lines = [];
346
+ const addSections = (parentId, depth) => {
347
+ for (const section of this.children.get(parentId) ?? []) {
348
+ const pending = this.pendingImageClusters.get(section.id) ?? 0;
349
+ lines.push({ depth, section: true, text: `${" ".repeat(depth)}- ${section.id} ${this.name(section)} — ` +
350
+ `${this.excerptCount(section.id)}${pending ? `, ${pending} image cluster${plural(pending)} not yet interpreted` : ""}` });
351
+ addSections(section.id, depth + 1);
352
+ }
353
+ };
354
+ if (pages.length > 1) {
355
+ for (const page of pages) {
356
+ lines.push({ depth: 0, section: false, text: `- Page ${page.id} ${this.name(page)} — ${this.excerptCount(page.id)}` });
357
+ addSections(page.id, 1);
358
+ }
359
+ }
360
+ else {
361
+ addSections(pages[0]?.id ?? "", 0);
362
+ }
363
+ const footer = [
364
+ ...(this.sections.length ? [`${this.outsideSections} excerpt${plural(this.outsideSections)} outside sections.`] : []),
365
+ `Read a ${this.sections.length ? "section" : "page"} with nodeIds: ["<ID>"]; use topic for word search.`,
366
+ ];
367
+ return fitOutline(["## Board overview", size,
368
+ `${pages.length > 1 ? "Pages and sections" : "Sections"} in reading order (ID, name, excerpts including nested sections):`], lines, footer, budget, pages.length > 1 ? 1 : 0);
369
+ }
370
+ /** First page of a nodeIds request: the direct subsections of each requested container. */
371
+ subsectionOutline(containerIds, budget) {
372
+ const lines = [];
373
+ for (const containerId of containerIds) {
374
+ const direct = this.sections.filter((section) => {
375
+ const enclosing = this.enclosing(section.id);
376
+ if (!enclosing.has(containerId))
377
+ return false;
378
+ const parent = section.sectionIds?.filter((id) => id !== section.id).at(-1);
379
+ // A section in a frame of another section is still a direct subsection of that frame.
380
+ return !parent || parent === containerId || !this.enclosing(parent).has(containerId);
381
+ });
382
+ if (!direct.length)
383
+ continue;
384
+ const container = this.nodesById.get(containerId);
385
+ lines.push({ depth: 0, section: false, text: `- In ${containerId} ${this.name(container)}:` });
386
+ for (const section of direct) {
387
+ lines.push({ depth: 1, section: true, text: ` - ${section.id} ${this.name(section)} — ${this.excerptCount(section.id)}` });
388
+ }
389
+ }
390
+ if (!lines.length)
391
+ return "";
392
+ return fitOutline(["## Sections inside (ID, name, excerpts)"], lines, ["Read one with nodeIds: [\"<ID>\"]."], budget, 1);
393
+ }
394
+ excerptCount(id) {
395
+ const count = this.excerpts.get(id) ?? 0;
396
+ return `${count} excerpt${plural(count)}`;
397
+ }
398
+ name(node) {
399
+ const name = node.name.replace(/\s+/g, " ").trim();
400
+ if (name)
401
+ return boundedText(name, 80);
402
+ return node.type === "SECTION" ? "(unnamed section)" : `(unnamed ${node.type === "CANVAS" || node.type === "PAGE" ? "page" : node.type.toLowerCase()})`;
403
+ }
404
+ }
405
+ /**
406
+ * Lines that do not fit the budget are summarized in one line: deeper levels
407
+ * go first, then the last lines down to minDepth. Returns "" if nothing fits.
408
+ */
409
+ function fitOutline(header, lines, footer, budget, minDepth) {
410
+ const sectionCount = lines.filter((line) => line.section).length;
411
+ const render = (shown) => {
412
+ const omitted = sectionCount - shown.filter((line) => line.section).length;
413
+ const summary = omitted > 0
414
+ ? [`${omitted} more section${plural(omitted)} not listed; read a listed page or section by ID to see the sections inside it.`] : [];
415
+ return [...header, ...shown.map((line) => line.text), ...summary, ...footer].join("\n");
416
+ };
417
+ const fits = (text) => JSON.stringify(text).length - 2 <= budget;
418
+ const deepest = Math.max(minDepth, ...lines.map((line) => line.depth));
419
+ for (let depth = deepest; depth >= minDepth; depth--) {
420
+ const text = render(lines.filter((line) => line.depth <= depth));
421
+ if (fits(text))
422
+ return text;
423
+ }
424
+ const shallow = lines.filter((line) => line.depth <= minDepth);
425
+ let low = 0;
426
+ let high = shallow.length - 1;
427
+ while (low < high) {
428
+ const middle = (low + high + 1) >>> 1;
429
+ if (fits(render(shallow.slice(0, middle))))
430
+ low = middle;
431
+ else
432
+ high = middle - 1;
433
+ }
434
+ const text = render(shallow.slice(0, low));
435
+ return fits(text) ? text : "";
122
436
  }
123
- function renderEntry(item) {
124
- return `\n\n## ${item.nodeName ?? item.nodeId}\n${formatEvidence(item)}${item.truncated ? "\n[Excerpt shortened; use the source link for full content.]" : ""}\n\n[Open source in Figma](${item.url})`;
437
+ function plural(count) {
438
+ return count === 1 ? "" : "s";
125
439
  }
126
- function renderContext(header, evidence) {
127
- return header + evidence.map(renderEntry).join("");
440
+ function normalize(value) {
441
+ return value.normalize("NFKC").toLowerCase().replace(/\s+/g, " ").trim();
128
442
  }
129
443
  function querySignature(input) {
130
444
  return createHash("sha256").update(JSON.stringify({
@@ -146,7 +460,8 @@ function decodeCursor(value) {
146
460
  if (parsed.v !== 1 || typeof parsed.snapshot !== "string" || !/^[A-Za-z0-9_-]{1,128}$/.test(parsed.snapshot) ||
147
461
  typeof parsed.query !== "string" || !/^[a-f0-9]{64}$/.test(parsed.query) ||
148
462
  typeof parsed.result !== "string" || !/^[a-f0-9]{64}$/.test(parsed.result) ||
149
- !Number.isSafeInteger(parsed.offset) || parsed.offset < 0)
463
+ !Number.isSafeInteger(parsed.offset) || parsed.offset < 0 ||
464
+ (parsed.page !== undefined && (!Number.isSafeInteger(parsed.page) || parsed.page < 1)))
150
465
  throw new Error("invalid fields");
151
466
  return parsed;
152
467
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getBoardContext.js","sourceRoot":"","sources":["../../src/tools/getBoardContext.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getBoardContext.js","sourceRoot":"","sources":["../../src/tools/getBoardContext.ts"],"names":[],"mappings":"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"}