figjam-context-mcp 0.0.0-stage → 0.4.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/.env.example +66 -0
- package/CHANGELOG.md +43 -0
- package/LICENSE +21 -0
- package/README.md +149 -2
- package/SECURITY.md +26 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/boardDiff.d.ts +55 -0
- package/dist/lib/boardDiff.js +285 -0
- package/dist/lib/boardDiff.js.map +1 -0
- package/dist/lib/cache.d.ts +9 -0
- package/dist/lib/cache.js +63 -0
- package/dist/lib/cache.js.map +1 -0
- package/dist/lib/connectorGraph.d.ts +32 -0
- package/dist/lib/connectorGraph.js +121 -0
- package/dist/lib/connectorGraph.js.map +1 -0
- package/dist/lib/docStructureMapper.d.ts +24 -0
- package/dist/lib/docStructureMapper.js +121 -0
- package/dist/lib/docStructureMapper.js.map +1 -0
- package/dist/lib/env.d.ts +2 -0
- package/dist/lib/env.js +25 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/evidence.d.ts +63 -0
- package/dist/lib/evidence.js +474 -0
- package/dist/lib/evidence.js.map +1 -0
- package/dist/lib/figmaApi.d.ts +24 -0
- package/dist/lib/figmaApi.js +173 -0
- package/dist/lib/figmaApi.js.map +1 -0
- package/dist/lib/llmClient.d.ts +61 -0
- package/dist/lib/llmClient.js +441 -0
- package/dist/lib/llmClient.js.map +1 -0
- package/dist/lib/llmOutputBudgets.d.ts +6 -0
- package/dist/lib/llmOutputBudgets.js +13 -0
- package/dist/lib/llmOutputBudgets.js.map +1 -0
- package/dist/lib/llmTimeouts.d.ts +4 -0
- package/dist/lib/llmTimeouts.js +10 -0
- package/dist/lib/llmTimeouts.js.map +1 -0
- package/dist/lib/modelRegistry.d.ts +12 -0
- package/dist/lib/modelRegistry.js +91 -0
- package/dist/lib/modelRegistry.js.map +1 -0
- package/dist/lib/nodeTree.d.ts +9 -0
- package/dist/lib/nodeTree.js +174 -0
- package/dist/lib/nodeTree.js.map +1 -0
- package/dist/lib/persistentCache.d.ts +32 -0
- package/dist/lib/persistentCache.js +301 -0
- package/dist/lib/persistentCache.js.map +1 -0
- package/dist/lib/spatialCluster.d.ts +58 -0
- package/dist/lib/spatialCluster.js +340 -0
- package/dist/lib/spatialCluster.js.map +1 -0
- package/dist/lib/visionInterpreter.d.ts +14 -0
- package/dist/lib/visionInterpreter.js +205 -0
- package/dist/lib/visionInterpreter.js.map +1 -0
- package/dist/schemas/answerFromBoard.d.ts +75 -0
- package/dist/schemas/answerFromBoard.js +28 -0
- package/dist/schemas/answerFromBoard.js.map +1 -0
- package/dist/schemas/common.d.ts +14 -0
- package/dist/schemas/common.js +59 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/diagnoseLlmConfig.d.ts +35 -0
- package/dist/schemas/diagnoseLlmConfig.js +20 -0
- package/dist/schemas/diagnoseLlmConfig.js.map +1 -0
- package/dist/schemas/diffBoard.d.ts +118 -0
- package/dist/schemas/diffBoard.js +61 -0
- package/dist/schemas/diffBoard.js.map +1 -0
- package/dist/schemas/getBoardContext.d.ts +255 -0
- package/dist/schemas/getBoardContext.js +77 -0
- package/dist/schemas/getBoardContext.js.map +1 -0
- package/dist/schemas/ingestBoard.d.ts +96 -0
- package/dist/schemas/ingestBoard.js +88 -0
- package/dist/schemas/ingestBoard.js.map +1 -0
- package/dist/server.d.ts +16 -0
- package/dist/server.js +131 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/answerFromBoard.d.ts +9 -0
- package/dist/tools/answerFromBoard.js +239 -0
- package/dist/tools/answerFromBoard.js.map +1 -0
- package/dist/tools/diagnoseLlmConfig.d.ts +4 -0
- package/dist/tools/diagnoseLlmConfig.js +158 -0
- package/dist/tools/diagnoseLlmConfig.js.map +1 -0
- package/dist/tools/diffBoard.d.ts +11 -0
- package/dist/tools/diffBoard.js +49 -0
- package/dist/tools/diffBoard.js.map +1 -0
- package/dist/tools/getBoardContext.d.ts +3 -0
- package/dist/tools/getBoardContext.js +157 -0
- package/dist/tools/getBoardContext.js.map +1 -0
- package/dist/tools/ingestBoard.d.ts +8 -0
- package/dist/tools/ingestBoard.js +594 -0
- package/dist/tools/ingestBoard.js.map +1 -0
- package/dist/types.d.ts +145 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/docs/pipeline.gif +0 -0
- package/package.json +73 -4
- package/server.json +48 -0
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { connectorArrow } from "./connectorGraph.js";
|
|
3
|
+
export const EVIDENCE_CHUNK_CHARS = 1200;
|
|
4
|
+
export const MAX_CONTEXT_RESPONSE_BYTES = 128 * 1024;
|
|
5
|
+
const MAX_INDEX_ENTRIES = 100_000;
|
|
6
|
+
const FIELD_WEIGHTS = { text: 1, node: 0.35, section: 0.20, page: 0.10, cluster: 0.05 };
|
|
7
|
+
const FIELDS = Object.keys(FIELD_WEIGHTS);
|
|
8
|
+
const ORIGINAL_FIELDS = FIELDS.filter((field) => field !== "cluster");
|
|
9
|
+
const MAX_PREFIX_TERMS = 32;
|
|
10
|
+
const PREFIX_MATCH_WEIGHT = 0.6;
|
|
11
|
+
// A snapshot is immutable once published by ingest. Weak references let LRU eviction reclaim indexes.
|
|
12
|
+
const indexes = new WeakMap();
|
|
13
|
+
const segmenter = new Intl.Segmenter("und", { granularity: "word" });
|
|
14
|
+
const STOPWORDS = new Set([
|
|
15
|
+
"a", "an", "and", "are", "as", "at", "be", "by", "can", "did", "do", "does", "for", "from",
|
|
16
|
+
"has", "have", "how", "i", "in", "is", "it", "its", "me", "of", "on", "or", "our", "that",
|
|
17
|
+
"the", "their", "there", "these", "this", "to", "was", "we", "were", "what", "when", "where",
|
|
18
|
+
"which", "who", "why", "with", "you", "your", "about", "board", "project", "please", "find",
|
|
19
|
+
"aber", "als", "am", "an", "auch", "auf", "aus", "bei", "das", "dem", "den", "der", "des",
|
|
20
|
+
"die", "ein", "eine", "einen", "einer", "es", "für", "hat", "haben", "im", "ist", "mit",
|
|
21
|
+
"nach", "nicht", "oder", "sich", "sie", "sind", "über", "um", "und", "vom", "von", "war",
|
|
22
|
+
"welche", "welcher", "welches", "wer", "wie", "wo", "zu", "zum", "zur", "projekt", "bitte",
|
|
23
|
+
"dass", "laut", "bereits",
|
|
24
|
+
]);
|
|
25
|
+
/** Unicode word segmentation supports accented words and scripts without whitespace. */
|
|
26
|
+
export function evidenceTokens(text) {
|
|
27
|
+
return Array.from(segmenter.segment(text.normalize("NFKC").toLowerCase()))
|
|
28
|
+
.filter((part) => part.isWordLike)
|
|
29
|
+
.map((part) => part.segment)
|
|
30
|
+
.filter((word) => !STOPWORDS.has(word));
|
|
31
|
+
}
|
|
32
|
+
export function snapshotIdForBoard(board) {
|
|
33
|
+
if (board.snapshotId)
|
|
34
|
+
return board.snapshotId;
|
|
35
|
+
// Compatibility for in-memory consumers that have not assigned a persisted snapshot yet.
|
|
36
|
+
// Model summaries participate here because those consumers can have no original nodes.
|
|
37
|
+
return digest(JSON.stringify({
|
|
38
|
+
fileKey: board.fileKey,
|
|
39
|
+
nodeHash: board.nodeHash,
|
|
40
|
+
nodes: board.nodes,
|
|
41
|
+
clusters: board.clusters,
|
|
42
|
+
connectors: board.connectorEdges,
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
export function nodeLink(board, nodeId) {
|
|
46
|
+
return `https://www.figma.com/board/${encodeURIComponent(board.fileKey)}?node-id=${encodeURIComponent(nodeId)}`;
|
|
47
|
+
}
|
|
48
|
+
/** Deterministic field-weighted BM25 over original chunks and source metadata. */
|
|
49
|
+
export function retrieveEvidence(board, options = {}) {
|
|
50
|
+
const index = getIndex(board);
|
|
51
|
+
let matches;
|
|
52
|
+
if (options.nodeIds) {
|
|
53
|
+
const requested = new Set(options.nodeIds);
|
|
54
|
+
matches = index.entries.filter(({ evidence }) => requested.has(evidence.nodeId) || Boolean(evidence.renderNodeId && requested.has(evidence.renderNodeId)));
|
|
55
|
+
}
|
|
56
|
+
else if (options.query?.trim()) {
|
|
57
|
+
const queryTerms = [...new Set(evidenceTokens(options.query))];
|
|
58
|
+
const scores = new Map();
|
|
59
|
+
for (const field of ORIGINAL_FIELDS)
|
|
60
|
+
addFieldScores(index, field, queryTerms, scores);
|
|
61
|
+
// Derived cluster labels can help rank an original match, never create one.
|
|
62
|
+
addFieldScores(index, "cluster", queryTerms, scores, new Set(scores.keys()));
|
|
63
|
+
matches = [...scores.entries()]
|
|
64
|
+
.sort(([a, aScore], [b, bScore]) => bScore - aScore || a - b)
|
|
65
|
+
.map(([entry]) => index.entries[entry]);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// A board overview covers different areas before spending its budget on another
|
|
69
|
+
// paragraph from the same large cluster. Order remains stable for pagination.
|
|
70
|
+
matches = interleaveClusters(index.entries);
|
|
71
|
+
}
|
|
72
|
+
const totalMatched = matches.length;
|
|
73
|
+
const primary = (options.limit === undefined ? matches : matches.slice(0, options.limit))
|
|
74
|
+
.map((entry) => entry.evidence);
|
|
75
|
+
const selected = [...primary];
|
|
76
|
+
if (options.includeNeighbors && selected.length > 0) {
|
|
77
|
+
if (options.query?.trim())
|
|
78
|
+
addTableNeighbors(index, selected, options.tableNeighborLimit ?? 6);
|
|
79
|
+
addNeighbors(board, index, primary, selected, options.neighborLimit ?? 6);
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
snapshotId: index.snapshotId,
|
|
83
|
+
evidence: selected,
|
|
84
|
+
primaryEvidenceIds: primary.map((item) => item.evidenceId),
|
|
85
|
+
connections: connectionsForEvidence(board, selected),
|
|
86
|
+
totalMatched,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/** Only connections between displayed source nodes are evidence for the current response. */
|
|
90
|
+
export function connectionsForEvidence(board, evidence) {
|
|
91
|
+
return matchingConnections(board, evidence)
|
|
92
|
+
.slice(0, 100)
|
|
93
|
+
.map((edge) => ({
|
|
94
|
+
connectorId: edge.connectorId,
|
|
95
|
+
fromNodeId: edge.fromNodeId,
|
|
96
|
+
toNodeId: edge.toNodeId,
|
|
97
|
+
direction: edge.direction ?? "forward",
|
|
98
|
+
label: edge.label ? boundedText(edge.label, 240) : undefined,
|
|
99
|
+
url: nodeLink(board, edge.connectorId),
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
export function countConnectionsForEvidence(board, evidence) {
|
|
103
|
+
return matchingConnections(board, evidence).length;
|
|
104
|
+
}
|
|
105
|
+
export function formatEvidenceConnection(connection) {
|
|
106
|
+
return `${connection.fromNodeId} ${connectorArrow(connection)} ${connection.toNodeId}${connection.label ? ` (${connection.label})` : ""}`;
|
|
107
|
+
}
|
|
108
|
+
function matchingConnections(board, evidence) {
|
|
109
|
+
const selected = new Set(evidence.flatMap((item) => [item.nodeId, ...(item.renderNodeId ? [item.renderNodeId] : [])]));
|
|
110
|
+
return (board.connectorEdges ?? []).filter((edge) => selected.has(edge.fromNodeId) && selected.has(edge.toNodeId));
|
|
111
|
+
}
|
|
112
|
+
function interleaveClusters(entries) {
|
|
113
|
+
const groups = new Map();
|
|
114
|
+
for (const entry of entries) {
|
|
115
|
+
const key = entry.evidence.clusterId ?? entry.evidence.nodeId;
|
|
116
|
+
const group = groups.get(key) ?? [];
|
|
117
|
+
group.push(entry);
|
|
118
|
+
groups.set(key, group);
|
|
119
|
+
}
|
|
120
|
+
const ordered = [];
|
|
121
|
+
let active = [...groups.values()];
|
|
122
|
+
for (let offset = 0; active.length; offset++) {
|
|
123
|
+
const next = [];
|
|
124
|
+
for (const group of active) {
|
|
125
|
+
ordered.push(group[offset]);
|
|
126
|
+
if (group.length > offset + 1)
|
|
127
|
+
next.push(group);
|
|
128
|
+
}
|
|
129
|
+
active = next;
|
|
130
|
+
}
|
|
131
|
+
return ordered;
|
|
132
|
+
}
|
|
133
|
+
export function formatEvidence(item) {
|
|
134
|
+
const provenance = item.modelDerived ? "MODEL INTERPRETATION; verify against original" :
|
|
135
|
+
item.sourceType === "board_metadata" ? "original board metadata" : "original board text";
|
|
136
|
+
const metadata = [
|
|
137
|
+
item.nodeName ? `Node name: ${item.nodeName}` : undefined,
|
|
138
|
+
item.pageName ? `Page: ${item.pageName}` : undefined,
|
|
139
|
+
item.sectionNames?.length ? `Sections: ${item.sectionNames.join(" / ")}` : undefined,
|
|
140
|
+
item.sourceType === "table_cell" && item.renderNodeId ? `Table node: ${item.renderNodeId}` : undefined,
|
|
141
|
+
item.row !== undefined ? `Row index: ${item.row}` : undefined,
|
|
142
|
+
item.column !== undefined ? `Column index: ${item.column}` : undefined,
|
|
143
|
+
].filter(Boolean).join("; ");
|
|
144
|
+
return `[${item.evidenceId}] ${item.nodeName ?? item.nodeId} (${provenance}; node ${item.nodeId})\n${item.clusterLabel ? `Cluster label: ${item.clusterLabel}\n` : ""}${metadata ? `Original source metadata: ${metadata}\n` : ""}${item.text}`;
|
|
145
|
+
}
|
|
146
|
+
export function boundedText(value, maxChars) {
|
|
147
|
+
if (value.length <= maxChars)
|
|
148
|
+
return value;
|
|
149
|
+
if (maxChars <= 0)
|
|
150
|
+
return "";
|
|
151
|
+
let end = maxChars - 1;
|
|
152
|
+
if (end > 0 && /[\uD800-\uDBFF]/.test(value[end - 1]))
|
|
153
|
+
end--;
|
|
154
|
+
return `${value.slice(0, end)}…`;
|
|
155
|
+
}
|
|
156
|
+
function addFieldScores(index, field, queryTerms, scores, allowed) {
|
|
157
|
+
const fieldIndex = index.fields[field];
|
|
158
|
+
for (const term of queryTerms) {
|
|
159
|
+
const alternatives = [{ term, weight: 1 }, ...compoundPrefixes(index.vocabulary, term)
|
|
160
|
+
.map((prefix) => ({ term: prefix, weight: PREFIX_MATCH_WEIGHT }))];
|
|
161
|
+
// A query word contributes once per field/chunk; several matching compounds
|
|
162
|
+
// must not turn a partial match into an unbounded frequency bonus.
|
|
163
|
+
const termScores = new Map();
|
|
164
|
+
for (const alternative of alternatives) {
|
|
165
|
+
const postings = fieldIndex.postings.get(alternative.term) ?? [];
|
|
166
|
+
const idf = Math.log(1 + (index.entries.length - postings.length + 0.5) / (postings.length + 0.5));
|
|
167
|
+
for (const posting of postings) {
|
|
168
|
+
if (allowed && !allowed.has(posting.index))
|
|
169
|
+
continue;
|
|
170
|
+
const length = index.entries[posting.index].lengths[field];
|
|
171
|
+
const normalization = 1.2 * (0.25 + 0.75 * length / fieldIndex.averageLength);
|
|
172
|
+
const score = alternative.weight * FIELD_WEIGHTS[field] * idf * posting.frequency * 2.2 /
|
|
173
|
+
(posting.frequency + normalization);
|
|
174
|
+
termScores.set(posting.index, Math.max(termScores.get(posting.index) ?? 0, score));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
for (const [entry, score] of termScores)
|
|
178
|
+
scores.set(entry, (scores.get(entry) ?? 0) + score);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function compoundPrefixes(vocabulary, term) {
|
|
182
|
+
// This is a bounded lexical aid for compounds, not substring or fuzzy search.
|
|
183
|
+
// Short acronyms, numbers, and non-Latin segmentation retain exact matching.
|
|
184
|
+
if (term.length < 5 || !/^[\p{Script=Latin}\p{M}]+$/u.test(term))
|
|
185
|
+
return [];
|
|
186
|
+
let low = 0;
|
|
187
|
+
let high = vocabulary.length;
|
|
188
|
+
while (low < high) {
|
|
189
|
+
const middle = (low + high) >>> 1;
|
|
190
|
+
if (vocabulary[middle] < term)
|
|
191
|
+
low = middle + 1;
|
|
192
|
+
else
|
|
193
|
+
high = middle;
|
|
194
|
+
}
|
|
195
|
+
const expanded = [];
|
|
196
|
+
for (let position = low; position < vocabulary.length && expanded.length < MAX_PREFIX_TERMS; position++) {
|
|
197
|
+
const word = vocabulary[position];
|
|
198
|
+
if (!word.startsWith(term))
|
|
199
|
+
break;
|
|
200
|
+
if (word.length >= term.length + 3 && /^[\p{Script=Latin}\p{M}]+$/u.test(word))
|
|
201
|
+
expanded.push(word);
|
|
202
|
+
}
|
|
203
|
+
return expanded;
|
|
204
|
+
}
|
|
205
|
+
function getIndex(board) {
|
|
206
|
+
const existing = indexes.get(board);
|
|
207
|
+
if (existing)
|
|
208
|
+
return existing;
|
|
209
|
+
const snapshotId = snapshotIdForBoard(board);
|
|
210
|
+
const evidence = buildEvidence(board, snapshotId);
|
|
211
|
+
const nodesById = new Map(board.nodes.map((node) => [node.id, node]));
|
|
212
|
+
const emptyField = () => ({ postings: new Map(), averageLength: 1 });
|
|
213
|
+
const fields = {
|
|
214
|
+
text: emptyField(), node: emptyField(), section: emptyField(), page: emptyField(), cluster: emptyField(),
|
|
215
|
+
};
|
|
216
|
+
const totalLengths = { text: 0, node: 0, section: 0, page: 0, cluster: 0 };
|
|
217
|
+
const entries = [];
|
|
218
|
+
for (const item of evidence) {
|
|
219
|
+
const node = nodesById.get(item.renderNodeId ?? item.nodeId);
|
|
220
|
+
const values = evidenceFields(item, node, nodesById);
|
|
221
|
+
const lengths = {};
|
|
222
|
+
const position = entries.length;
|
|
223
|
+
for (const field of FIELDS) {
|
|
224
|
+
const tokens = evidenceTokens(values[field]);
|
|
225
|
+
lengths[field] = tokens.length;
|
|
226
|
+
totalLengths[field] += tokens.length;
|
|
227
|
+
const frequencies = new Map();
|
|
228
|
+
for (const token of tokens)
|
|
229
|
+
frequencies.set(token, (frequencies.get(token) ?? 0) + 1);
|
|
230
|
+
for (const [term, frequency] of frequencies) {
|
|
231
|
+
const list = fields[field].postings.get(term) ?? [];
|
|
232
|
+
list.push({ index: position, frequency });
|
|
233
|
+
fields[field].postings.set(term, list);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
entries.push({ evidence: item, lengths });
|
|
237
|
+
}
|
|
238
|
+
for (const field of FIELDS) {
|
|
239
|
+
fields[field].averageLength = totalLengths[field] / Math.max(1, entries.length) || 1;
|
|
240
|
+
}
|
|
241
|
+
const vocabulary = [...new Set(ORIGINAL_FIELDS.flatMap((field) => [...fields[field].postings.keys()]))].sort();
|
|
242
|
+
const index = { snapshotId, entries, fields, vocabulary };
|
|
243
|
+
indexes.set(board, index);
|
|
244
|
+
return index;
|
|
245
|
+
}
|
|
246
|
+
function evidenceFields(item, node, nodesById) {
|
|
247
|
+
const normalize = (value) => value.normalize("NFKC").toLowerCase().replace(/\s+/g, " ").trim();
|
|
248
|
+
const name = normalize(node?.name ?? "");
|
|
249
|
+
const text = normalize(node?.text ?? "");
|
|
250
|
+
// Figma frequently derives the node name from its full text or its opening.
|
|
251
|
+
// Indexing that name on every chunk leaks a match into unrelated trailing text.
|
|
252
|
+
const nameDuplicatesText = Boolean(name && text && text.startsWith(name));
|
|
253
|
+
return {
|
|
254
|
+
text: item.text,
|
|
255
|
+
node: [item.sourceType === "board_metadata" || nameDuplicatesText ? "" : node?.name, node?.type]
|
|
256
|
+
.filter(Boolean).join("\n"),
|
|
257
|
+
section: (node?.sectionIds ?? []).map((id) => nodesById.get(id)?.name ?? "").join("\n"),
|
|
258
|
+
page: node?.pageId ? nodesById.get(node.pageId)?.name ?? "" : "",
|
|
259
|
+
cluster: item.clusterLabel ?? "",
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
function buildEvidence(board, snapshotId) {
|
|
263
|
+
const clusterOf = new Map();
|
|
264
|
+
for (const cluster of board.clusters) {
|
|
265
|
+
for (const nodeId of cluster.nodeIds)
|
|
266
|
+
if (!clusterOf.has(nodeId))
|
|
267
|
+
clusterOf.set(nodeId, cluster);
|
|
268
|
+
}
|
|
269
|
+
const evidence = [];
|
|
270
|
+
const append = (text, source, cluster) => {
|
|
271
|
+
const chunks = chunkText(text);
|
|
272
|
+
for (const [chunkIndex, chunk] of chunks.entries()) {
|
|
273
|
+
if (evidence.length >= MAX_INDEX_ENTRIES) {
|
|
274
|
+
throw new Error(`Board exceeds the ${MAX_INDEX_ENTRIES}-chunk evidence limit. Ingest a smaller board or page.`);
|
|
275
|
+
}
|
|
276
|
+
evidence.push({
|
|
277
|
+
...source,
|
|
278
|
+
evidenceId: `ev_${digest(`${snapshotId}\0${source.sourceType}\0${source.nodeId}\0${source.modelDerived ? cluster?.id ?? "" : ""}\0${chunkIndex}\0${chunk}`).slice(0, 32)}`,
|
|
279
|
+
snapshotId,
|
|
280
|
+
nodeId: source.nodeId,
|
|
281
|
+
text: chunk,
|
|
282
|
+
clusterId: cluster?.id,
|
|
283
|
+
clusterLabel: cluster ? boundedText(cluster.label, 160) : undefined,
|
|
284
|
+
chunkIndex,
|
|
285
|
+
url: nodeLink(board, source.renderNodeId ?? source.nodeId),
|
|
286
|
+
truncated: chunks.length > 1,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
const nodesById = new Map(board.nodes.map((node) => [node.id, node]));
|
|
291
|
+
for (const node of board.nodes) {
|
|
292
|
+
const cluster = clusterOf.get(node.id);
|
|
293
|
+
const provenance = nodeProvenance(node, nodesById);
|
|
294
|
+
if (node.table?.cells.length) {
|
|
295
|
+
for (const cell of node.table.cells) {
|
|
296
|
+
append(cell.text, {
|
|
297
|
+
...provenance,
|
|
298
|
+
nodeId: cell.id,
|
|
299
|
+
renderNodeId: node.renderNodeId ?? node.id,
|
|
300
|
+
sourceType: "table_cell",
|
|
301
|
+
modelDerived: false,
|
|
302
|
+
row: cell.row,
|
|
303
|
+
column: cell.column,
|
|
304
|
+
}, cluster);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
else if (node.text?.trim()) {
|
|
308
|
+
append(node.text, { ...provenance, nodeId: node.id, sourceType: "board_text", modelDerived: false }, cluster);
|
|
309
|
+
}
|
|
310
|
+
if (!node.text?.trim() && !node.table?.cells.some((cell) => cell.text.trim()) && node.name.trim()) {
|
|
311
|
+
append(node.name, { ...provenance, nodeId: node.id, sourceType: "board_metadata", modelDerived: false }, cluster);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
for (const cluster of board.clusters) {
|
|
315
|
+
const modelDerived = cluster.summarySource === "vision_llm" || cluster.summarySource === "text_llm" || Boolean(cluster.modelId);
|
|
316
|
+
const hasOriginalText = cluster.nodeIds.some((id) => {
|
|
317
|
+
const node = nodesById.get(id);
|
|
318
|
+
return Boolean(node?.text?.trim() || node?.table?.cells.some((cell) => cell.text.trim()));
|
|
319
|
+
});
|
|
320
|
+
if (!modelDerived && hasOriginalText)
|
|
321
|
+
continue;
|
|
322
|
+
const nodeId = cluster.nodeIds.find((id) => nodesById.get(id)?.imageRef) ?? cluster.nodeIds[0];
|
|
323
|
+
if (!nodeId)
|
|
324
|
+
continue;
|
|
325
|
+
append(cluster.summary, {
|
|
326
|
+
...nodeProvenance(nodesById.get(nodeId), nodesById),
|
|
327
|
+
nodeId,
|
|
328
|
+
sourceType: modelDerived ? "model_interpretation" : "cluster_summary",
|
|
329
|
+
// A legacy/deterministic summary is not a verbatim source either.
|
|
330
|
+
modelDerived: true,
|
|
331
|
+
}, cluster);
|
|
332
|
+
}
|
|
333
|
+
return evidence;
|
|
334
|
+
}
|
|
335
|
+
function nodeProvenance(node, nodesById) {
|
|
336
|
+
const sectionIds = node?.sectionIds?.slice(-16);
|
|
337
|
+
const pageName = node?.pageId ? nodesById.get(node.pageId)?.name : undefined;
|
|
338
|
+
return {
|
|
339
|
+
pageId: node?.pageId,
|
|
340
|
+
sectionIds,
|
|
341
|
+
renderNodeId: node?.renderNodeId,
|
|
342
|
+
nodeName: node?.name ? boundedText(node.name, 160) : undefined,
|
|
343
|
+
pageName: pageName ? boundedText(pageName, 160) : undefined,
|
|
344
|
+
sectionNames: sectionIds?.map((id) => nodesById.get(id)?.name)
|
|
345
|
+
.filter((name) => Boolean(name)).map((name) => boundedText(name, 80)),
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
function chunkText(text) {
|
|
349
|
+
const value = text.trim();
|
|
350
|
+
const chunks = [];
|
|
351
|
+
let start = 0;
|
|
352
|
+
while (start < value.length) {
|
|
353
|
+
let end = Math.min(value.length, start + EVIDENCE_CHUNK_CHARS);
|
|
354
|
+
if (end < value.length) {
|
|
355
|
+
const whitespace = Math.max(value.lastIndexOf(" ", end), value.lastIndexOf("\n", end));
|
|
356
|
+
if (whitespace > start + EVIDENCE_CHUNK_CHARS / 2)
|
|
357
|
+
end = whitespace;
|
|
358
|
+
if (/[\uD800-\uDBFF]/.test(value[end - 1]))
|
|
359
|
+
end--;
|
|
360
|
+
}
|
|
361
|
+
const chunk = value.slice(start, end).trim();
|
|
362
|
+
if (chunk)
|
|
363
|
+
chunks.push(chunk);
|
|
364
|
+
start = end;
|
|
365
|
+
}
|
|
366
|
+
return chunks;
|
|
367
|
+
}
|
|
368
|
+
/** A matching cell needs nearby labels/values to retain its table meaning. */
|
|
369
|
+
function addTableNeighbors(index, selected, limit) {
|
|
370
|
+
if (limit <= 0)
|
|
371
|
+
return;
|
|
372
|
+
const rowGroups = new Map();
|
|
373
|
+
const unpositionedTables = new Set();
|
|
374
|
+
const rowKey = (tableId, row) => `${tableId}\0${row}`;
|
|
375
|
+
for (const item of selected) {
|
|
376
|
+
if (item.sourceType !== "table_cell" || !item.renderNodeId)
|
|
377
|
+
continue;
|
|
378
|
+
if (item.row === undefined)
|
|
379
|
+
unpositionedTables.add(item.renderNodeId);
|
|
380
|
+
else
|
|
381
|
+
rowGroups.set(rowKey(item.renderNodeId, item.row), []);
|
|
382
|
+
}
|
|
383
|
+
const existing = new Set(selected.map((item) => item.evidenceId));
|
|
384
|
+
const wholeTables = new Map();
|
|
385
|
+
for (const { evidence: item } of index.entries) {
|
|
386
|
+
if (item.sourceType !== "table_cell" || !item.renderNodeId || existing.has(item.evidenceId))
|
|
387
|
+
continue;
|
|
388
|
+
if (item.row !== undefined)
|
|
389
|
+
rowGroups.get(rowKey(item.renderNodeId, item.row))?.push(item);
|
|
390
|
+
if (unpositionedTables.has(item.renderNodeId)) {
|
|
391
|
+
const group = wholeTables.get(item.renderNodeId) ?? [];
|
|
392
|
+
group.push(item);
|
|
393
|
+
wholeTables.set(item.renderNodeId, group);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
let added = 0;
|
|
397
|
+
let active = [...rowGroups.values()].filter((group) => group.length > 0);
|
|
398
|
+
for (let offset = 0; active.length && added < limit; offset++) {
|
|
399
|
+
const next = [];
|
|
400
|
+
for (const group of active) {
|
|
401
|
+
if (added >= limit)
|
|
402
|
+
break;
|
|
403
|
+
const item = group[offset];
|
|
404
|
+
selected.push(item);
|
|
405
|
+
existing.add(item.evidenceId);
|
|
406
|
+
added++;
|
|
407
|
+
if (group.length > offset + 1)
|
|
408
|
+
next.push(group);
|
|
409
|
+
}
|
|
410
|
+
active = next;
|
|
411
|
+
}
|
|
412
|
+
// Without recorded rows there is no justified "nearby" prefix. Keep a small
|
|
413
|
+
// table only when its complete remaining context fits; otherwise add none.
|
|
414
|
+
for (const group of wholeTables.values()) {
|
|
415
|
+
const missing = group.filter((item) => !existing.has(item.evidenceId));
|
|
416
|
+
if (missing.length > limit - added)
|
|
417
|
+
continue;
|
|
418
|
+
selected.push(...missing);
|
|
419
|
+
for (const item of missing)
|
|
420
|
+
existing.add(item.evidenceId);
|
|
421
|
+
added += missing.length;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
function addNeighbors(board, index, primary, selected, limit) {
|
|
425
|
+
const primaryNodes = new Set(primary.flatMap((item) => [item.nodeId, ...(item.renderNodeId ? [item.renderNodeId] : [])]));
|
|
426
|
+
const neighborIds = new Set();
|
|
427
|
+
for (const edge of board.connectorEdges ?? []) {
|
|
428
|
+
if (primaryNodes.has(edge.fromNodeId))
|
|
429
|
+
neighborIds.add(edge.toNodeId);
|
|
430
|
+
if (primaryNodes.has(edge.toNodeId))
|
|
431
|
+
neighborIds.add(edge.fromNodeId);
|
|
432
|
+
}
|
|
433
|
+
const existing = new Set(selected.map((item) => item.evidenceId));
|
|
434
|
+
const groups = new Map();
|
|
435
|
+
for (const { evidence: item } of index.entries) {
|
|
436
|
+
const wholeTable = item.sourceType === "table_cell" && Boolean(item.renderNodeId && neighborIds.has(item.renderNodeId));
|
|
437
|
+
if (existing.has(item.evidenceId) || !(neighborIds.has(item.nodeId) || wholeTable ||
|
|
438
|
+
Boolean(item.renderNodeId && neighborIds.has(item.renderNodeId))))
|
|
439
|
+
continue;
|
|
440
|
+
const key = item.renderNodeId ?? item.nodeId;
|
|
441
|
+
const group = groups.get(key) ?? { items: [], wholeTable };
|
|
442
|
+
group.items.push(item);
|
|
443
|
+
group.wholeTable ||= wholeTable;
|
|
444
|
+
groups.set(key, group);
|
|
445
|
+
}
|
|
446
|
+
let added = 0;
|
|
447
|
+
let active = [...groups.values()];
|
|
448
|
+
// Each ordinary neighbor gets one excerpt before a long neighbor gets another.
|
|
449
|
+
// A directly connected table without a selected row is atomic, never a prefix.
|
|
450
|
+
for (let offset = 0; active.length && added < limit; offset++) {
|
|
451
|
+
const next = [];
|
|
452
|
+
for (const group of active) {
|
|
453
|
+
if (added >= limit)
|
|
454
|
+
break;
|
|
455
|
+
if (group.wholeTable) {
|
|
456
|
+
if (group.items.length <= limit - added) {
|
|
457
|
+
selected.push(...group.items);
|
|
458
|
+
added += group.items.length;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
selected.push(group.items[offset]);
|
|
463
|
+
added++;
|
|
464
|
+
if (group.items.length > offset + 1)
|
|
465
|
+
next.push(group);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
active = next;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
function digest(value) {
|
|
472
|
+
return createHash("sha256").update(value).digest("hex");
|
|
473
|
+
}
|
|
474
|
+
//# sourceMappingURL=evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/lib/evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare const FILE_MAX_BYTES: number;
|
|
2
|
+
export declare const IMAGE_MAX_BYTES: number;
|
|
3
|
+
export declare const INGEST_IMAGE_MAX_BYTES: number;
|
|
4
|
+
export interface DownloadBudget {
|
|
5
|
+
usedBytes: number;
|
|
6
|
+
maxBytes: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class FigmaApiError extends Error {
|
|
9
|
+
readonly status: number;
|
|
10
|
+
readonly retryAfter?: number | undefined;
|
|
11
|
+
constructor(message: string, status: number, retryAfter?: number | undefined);
|
|
12
|
+
}
|
|
13
|
+
export declare class FigmaDownloadBudgetError extends Error {
|
|
14
|
+
constructor();
|
|
15
|
+
}
|
|
16
|
+
export declare class FigmaTimeoutError extends Error {
|
|
17
|
+
constructor(message: string);
|
|
18
|
+
}
|
|
19
|
+
export declare function fetchFileTree(fileKey: string, token: string, signal?: AbortSignal): Promise<unknown>;
|
|
20
|
+
export declare function fetchFileMetadata(fileKey: string, token: string, signal?: AbortSignal): Promise<{
|
|
21
|
+
version: string;
|
|
22
|
+
}>;
|
|
23
|
+
export declare function fetchImageRefs(fileKey: string, token: string, signal?: AbortSignal): Promise<Record<string, string>>;
|
|
24
|
+
export declare function fetchScreenshot(fileKey: string, nodeIds: string[], token: string, signal?: AbortSignal, budget?: DownloadBudget, version?: string): Promise<Buffer[]>;
|