@hydradb/mcp 1.1.1 → 1.2.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.
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAE1C,uEAAuE;AACvE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;AACrC,SAAS,WAAW,CAAC,OAAe;IACnC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC;AACD,SAAS,QAAQ,CAAC,OAAe,EAAE,IAAY;IAC9C,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO;IACpC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxB,IAAI,CAAC,OAAO,CAAC,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CACtB,GAAc,EACd,SAAiB,EACjB,UAAkB,EAClB,OAAe,WAAW;IAE1B,MAAM,cAAc,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,cAAc,IAAI,IAAI,IAAI,cAAc,KAAK,EAAE,EAAE,CAAC;QACrD,OAAO,cAAc,CAAC;IACvB,CAAC;IACD,MAAM,eAAe,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC,IAAI,eAAe,IAAI,IAAI,IAAI,eAAe,KAAK,EAAE,EAAE,CAAC;QACvD,QAAQ,CACP,sCAAsC,UAAU,uBAAuB,SAAS,WAAW,EAC3F,IAAI,CACJ,CAAC;QACF,OAAO,eAAe,CAAC;IACxB,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa,CAC5B,MAAiB,OAAO,CAAC,GAAG,EAC5B,OAAe,WAAW;IAE1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;IACzE,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACd,6FAA6F,CAC7F,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,IAAI,CAAC,CAAC;IAC9E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACd,gGAAgG,CAChG,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GACf,OAAO,CAAC,GAAG,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,IAAI,CAAC;QAClE,kBAAkB,CAAC;IAEpB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;IAE5E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AAClD,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/context.d.ts CHANGED
@@ -1,5 +1,45 @@
1
- import type { RecallResponse } from "./types.js";
2
- export declare function buildRecalledContext(response: RecallResponse, opts?: {
1
+ import type { HydraDB as SDK } from "@hydradb/sdk";
2
+ /**
3
+ * The renderer reads SDK payloads directly.
4
+ *
5
+ * There used to be a snake_case mirror of every one of these shapes in
6
+ * `src/types.ts`, with adapters mapping the SDK's camelCase onto it purely so
7
+ * this file could keep its original field names. That bought nothing and cost a
8
+ * translation layer that had to be kept in step with the SDK by hand — and did
9
+ * silently drop a field once (`sourceChunkIds`).
10
+ *
11
+ * Triplet innards stay snake_case even here: the SDK types `relation`/`source`/
12
+ * `target` as `Record<string, unknown>`, so the wire shape passes through
13
+ * untouched and `formatTriplet` needs no translation either.
14
+ */
15
+ type RecallResponse = SDK.SearchV2RetrievalResult;
16
+ /**
17
+ * How many chunks the renderer will actually emit.
18
+ *
19
+ * The caller needs this for its "Found N" header. Reporting the raw chunk count
20
+ * there while the body shows fewer is the same disagreement the removed summary
21
+ * block had, reintroduced by deduping.
22
+ */
23
+ export declare function renderedChunkCount(response: RecallResponse): number;
24
+ export declare function renderRecalledContext(response: RecallResponse, opts?: Parameters<typeof buildRecalledContext>[1]): {
25
+ text: string;
26
+ shown: number;
27
+ };
28
+ export declare function buildRecalledContext(response: RecallResponse, opts?: Parameters<typeof render>[1]): string;
29
+ declare function render(response: RecallResponse, opts?: {
3
30
  maxGroupOccurrences?: number;
4
31
  minEvidenceScore?: number;
5
- }): string;
32
+ /**
33
+ * Per-chunk body ceiling. Unset renders every chunk in full, which is what
34
+ * `detail: "full"` asks for.
35
+ */
36
+ maxChunkChars?: number;
37
+ /** Drop the Extra Context blocks entirely (compact mode). */
38
+ includeExtraContext?: boolean;
39
+ /** Total character ceiling for the whole rendering. */
40
+ maxTotalChars?: number;
41
+ }): {
42
+ text: string;
43
+ shown: number;
44
+ };
45
+ export {};
package/dist/context.js CHANGED
@@ -1,3 +1,102 @@
1
+ /**
2
+ * A chunk's readable text, unwrapping the v2 source envelope when present.
3
+ *
4
+ * Ingest can store a chunk whose body is the serialised source record rather
5
+ * than the text itself:
6
+ *
7
+ * {"id":"s9","tenant_id":"t","content":{"text":"the actual body"}}
8
+ *
9
+ * Rendered verbatim, that ships ids, tenant identifiers and JSON punctuation
10
+ * into the prompt in place of the content, and the reader has to parse it back
11
+ * out. The SDK's own renderer unwraps this (`dist/helpers/buildString.js`);
12
+ * this port keeps the behaviour without taking the rest of that helper, which
13
+ * drops the evidence-score filter, extra context and `raw_predicate` handling
14
+ * below.
15
+ *
16
+ * The wire format is snake_case regardless of SDK casing, so the keys checked
17
+ * here are the wire ones. Anything that does not match the envelope shape is
18
+ * returned untouched — a chunk that legitimately begins and ends with braces is
19
+ * left alone.
20
+ */
21
+ function extractChunkText(chunkContent) {
22
+ if (!chunkContent)
23
+ return "";
24
+ const trimmed = chunkContent.trim();
25
+ if (!trimmed.startsWith("{") || !trimmed.endsWith("}"))
26
+ return trimmed;
27
+ let parsed;
28
+ try {
29
+ parsed = JSON.parse(trimmed);
30
+ }
31
+ catch {
32
+ return trimmed;
33
+ }
34
+ if (typeof parsed !== "object" || parsed === null)
35
+ return trimmed;
36
+ // Unwrap ONLY when nothing would be lost by doing so.
37
+ //
38
+ // A nested `content.text` is not evidence of an envelope, and neither is an
39
+ // `id` alongside it — a user can legitimately store
40
+ // `{"id":"cfg","content":{"text":"..."},"version":2}`, and unwrapping that
41
+ // discards `version` silently, turning a stored document into one of its
42
+ // fragments. So instead of guessing what an envelope looks like, check the
43
+ // inverse: every key we are about to drop must be one the envelope is known
44
+ // to carry. An unrecognised sibling means this is someone's document, and it
45
+ // is returned untouched.
46
+ //
47
+ // The asymmetry is deliberate. Leaving a real envelope wrapped is ugly;
48
+ // unwrapping a real document destroys data.
49
+ const record = parsed;
50
+ // Only SCOPING keys. These are identifiers the server stamps on a record;
51
+ // they carry nothing the user wrote, so discarding them loses nothing.
52
+ //
53
+ // The previous allowlist also contained `title`, `metadata`, `timestamp` and
54
+ // friends. Those ARE envelope fields, but they also carry user data — so a
55
+ // document with any of them populated was being reduced to its content.text
56
+ // and the rest silently dropped. Three rounds of narrowing the guess did not
57
+ // fix that, because the premise was wrong: the test cannot be "does this look
58
+ // like an envelope", it has to be "is there anything here to lose".
59
+ const SCOPING_KEYS = new Set([
60
+ "content",
61
+ "id",
62
+ "tenant_id",
63
+ "sub_tenant_id",
64
+ "source_id",
65
+ "chunk_id",
66
+ ]);
67
+ // Any other key holding an actual value means this is someone's document.
68
+ // Empty strings, nulls and empty objects are not data, so a bare envelope
69
+ // carrying `"title": ""` still unwraps.
70
+ const hasData = (value) => {
71
+ if (value == null)
72
+ return false;
73
+ if (typeof value === "string")
74
+ return value.trim() !== "";
75
+ if (Array.isArray(value))
76
+ return value.length > 0;
77
+ if (typeof value === "object")
78
+ return Object.keys(value).length > 0;
79
+ return true;
80
+ };
81
+ const wouldLoseSomething = Object.entries(record).some(([key, value]) => !SCOPING_KEYS.has(key) && hasData(value));
82
+ if (wouldLoseSomething)
83
+ return trimmed;
84
+ // And require a field that is unambiguously OURS. `id` alone is not — a
85
+ // user's own document can carry one. `tenant_id`/`sub_tenant_id` are internal
86
+ // scoping fields the server stamps on; a hand-written document has neither.
87
+ const looksLikeSource = ["tenant_id", "sub_tenant_id"].some((key) => typeof record[key] === "string");
88
+ if (!looksLikeSource)
89
+ return trimmed;
90
+ const content = record.content;
91
+ if (typeof content === "object" && content !== null) {
92
+ for (const key of ["text", "markdown"]) {
93
+ const value = content[key];
94
+ if (typeof value === "string" && value.trim())
95
+ return value.trim();
96
+ }
97
+ }
98
+ return trimmed;
99
+ }
1
100
  function formatTriplet(triplet) {
2
101
  const src = triplet.source?.name ?? "?";
3
102
  const rel = triplet.relation;
@@ -6,57 +105,226 @@ function formatTriplet(triplet) {
6
105
  const ctx = rel?.context ? ` [${rel.context}]` : "";
7
106
  return ` (${src}) —[${predicate}]→ (${tgt})${ctx}`;
8
107
  }
108
+ /**
109
+ * Normalised form for comparing two bodies. Retrieval returns overlapping
110
+ * windows over the same source, and they rarely differ by more than whitespace.
111
+ */
112
+ function normalise(text) {
113
+ return text.replace(/\s+/g, " ").trim().toLowerCase();
114
+ }
115
+ /**
116
+ * Chunk indices whose body is wholly contained in another chunk's body.
117
+ *
118
+ * The API returns overlapping windows, so a short chunk is frequently a literal
119
+ * substring of a longer one — in a live 15-chunk sample, 4 were fully contained
120
+ * in another, roughly a quarter of the body re-sent for nothing.
121
+ *
122
+ * Ties are resolved by keeping the earlier (higher-ranked) chunk, and identical
123
+ * bodies collapse to one. O(n^2) over at most 50 items is free.
124
+ */
125
+ function containedChunkIndices(bodies, sourceIds) {
126
+ const normalised = bodies.map(normalise);
127
+ /** duplicate chunk index -> the 1-based chunk number holding the same text. */
128
+ const dropped = new Map();
129
+ for (let i = 0; i < normalised.length; i++) {
130
+ if (dropped.has(i))
131
+ continue;
132
+ const a = normalised[i];
133
+ if (a === "")
134
+ continue;
135
+ for (let j = 0; j < normalised.length; j++) {
136
+ if (i === j || dropped.has(j))
137
+ continue;
138
+ const b = normalised[j];
139
+ if (b === "")
140
+ continue;
141
+ // Only within ONE source. Two different sources can legitimately hold
142
+ // the same sentence — a policy quoted in two documents, the same fact
143
+ // recorded twice — and suppressing one of those does not remove
144
+ // duplication, it removes a MATCH: its id, score and graph relations
145
+ // all disappear, and the caller can no longer discover that source.
146
+ // The duplication this exists to remove is the overlapping windows
147
+ // retrieval returns over a single source.
148
+ const sameSource = sourceIds[i] != null && sourceIds[i] === sourceIds[j];
149
+ if (!sameSource)
150
+ continue;
151
+ // Point BACKWARDS only. Truncation drops sections from the end, so a
152
+ // pointer to an earlier chunk always resolves; one aimed forward can
153
+ // name a chunk the budget removed, leaving the caller told the text is
154
+ // in "Chunk 12" when there is no Chunk 12.
155
+ if (i >= j)
156
+ continue;
157
+ // Keep the longer body; on an exact tie keep whichever ranked first.
158
+ const keepsI = a.length > b.length || (a.length === b.length && i < j);
159
+ if (keepsI && a.includes(b))
160
+ dropped.set(j, i + 1);
161
+ }
162
+ }
163
+ return dropped;
164
+ }
165
+ /**
166
+ * How many chunks the renderer will actually emit.
167
+ *
168
+ * The caller needs this for its "Found N" header. Reporting the raw chunk count
169
+ * there while the body shows fewer is the same disagreement the removed summary
170
+ * block had, reintroduced by deduping.
171
+ */
172
+ export function renderedChunkCount(response) {
173
+ const chunks = response.chunks ?? [];
174
+ const contained = containedChunkIndices(chunks.map((c) => extractChunkText(c.chunkContent)), chunks.map((c) => c.id));
175
+ // Every chunk is still rendered; only duplicated BODIES are collapsed.
176
+ return chunks.length;
177
+ }
178
+ /**
179
+ * Render, and report how many chunks the caller can actually see.
180
+ *
181
+ * `buildRecalledContext` returns only the text, so a caller counting chunks had
182
+ * to compute that separately — and any count computed before the total-character
183
+ * budget applies overstates what survived it. The header and the body must
184
+ * describe the same thing.
185
+ */
186
+ /** Room reserved for the truncation notice itself, so it also fits. */
187
+ const TRUNCATION_NOTE_ALLOWANCE = 240;
188
+ export function renderRecalledContext(response, opts) {
189
+ // The count comes from the renderer, which knows exactly how many sections it
190
+ // emitted. Deriving it by matching /^Chunk \d+/ over the finished text meant a
191
+ // stored body containing a line like "Chunk 5 of the manual" was counted as a
192
+ // rendered section, so `Found N` announced more matches than existed — the
193
+ // same header/body disagreement this PR removed, reintroduced by the fix for
194
+ // it.
195
+ return render(response, opts);
196
+ }
9
197
  export function buildRecalledContext(response, opts) {
198
+ return render(response, opts).text;
199
+ }
200
+ function render(response, opts) {
10
201
  const minScore = opts?.minEvidenceScore ?? 0.4;
11
202
  const maxGroupOccurrences = opts?.maxGroupOccurrences;
203
+ const maxChunkChars = opts?.maxChunkChars;
204
+ const includeExtraContext = opts?.includeExtraContext ?? true;
12
205
  const chunks = response.chunks ?? [];
13
- const graphCtx = response.graph_context ?? {
14
- query_paths: [],
15
- chunk_relations: [],
16
- chunk_id_to_group_ids: {},
206
+ const graphCtx = response.graphContext ?? {
207
+ queryPaths: [],
208
+ chunkRelations: [],
209
+ chunkIdToGroupIds: {},
17
210
  };
18
- const extraContextMap = response.additional_context ?? {};
19
- const rawRelations = graphCtx.chunk_relations ?? [];
211
+ const extraContextMap = response.additionalContext ?? {};
212
+ const rawRelations = graphCtx.chunkRelations ?? [];
20
213
  const relationIndex = {};
21
214
  for (let idx = 0; idx < rawRelations.length; idx++) {
22
215
  const relation = rawRelations[idx];
23
- if ((relation.relevancy_score ?? 0) < minScore)
216
+ if ((relation.relevancyScore ?? 0) < minScore)
24
217
  continue;
25
- const groupId = relation.group_id ?? `p_${idx}`;
218
+ const groupId = relation.groupId ?? `p_${idx}`;
26
219
  relationIndex[groupId] = relation;
27
220
  }
28
- const chunkToGroupIds = graphCtx.chunk_id_to_group_ids ?? {};
221
+ // Direct chunk relation links, the mapping the server states explicitly and
222
+ // the one the SDK's own renderer reaches for first. Without it this renderer
223
+ // had only the indirect route (group_id + chunk_id_to_group_ids) and the
224
+ // triplet.chunk_id scan, so any relation the server linked ONLY via
225
+ // source_chunk_ids was silently dropped from the output.
226
+ const directRelations = {};
227
+ for (const [groupId, relation] of Object.entries(relationIndex)) {
228
+ for (const chunkId of relation.sourceChunkIds ?? []) {
229
+ const bucket = directRelations[chunkId];
230
+ if (bucket)
231
+ bucket.push([groupId, relation]);
232
+ else
233
+ directRelations[chunkId] = [[groupId, relation]];
234
+ }
235
+ }
236
+ const chunkToGroupIds = graphCtx.chunkIdToGroupIds ?? {};
29
237
  const consumedExtraIds = new Set();
30
238
  const groupOccurrenceCounts = {};
31
239
  const chunkSections = [];
240
+ // Suppress chunks wholly contained in another chunk before rendering any of
241
+ // them, so the numbering reflects what the caller actually receives.
242
+ // Body collapsing is disabled when per-chunk trimming is on. Compact mode
243
+ // already caps each body, so the duplication it would remove is small — and
244
+ // the pointer could name a chunk whose RENDERED body was cut before the
245
+ // shared text, promising content no rendered chunk actually contains.
246
+ const contained = maxChunkChars == null
247
+ ? containedChunkIndices(chunks.map((c) => extractChunkText(c.chunkContent)), chunks.map((c) => c.id))
248
+ : new Map();
249
+ // Extra context is deduped by CONTENT as well as by id: the same passage
250
+ // arrives under different ids, and an id-keyed check never notices.
251
+ // Maps a passage to the chunk number that already rendered it, so a later
252
+ // chunk can point at it instead of either repeating it or losing the
253
+ // association entirely.
254
+ const seenExtraContent = new Map();
255
+ let rendered = 0;
32
256
  for (let i = 0; i < chunks.length; i++) {
33
257
  const chunk = chunks[i];
258
+ rendered++;
259
+ // A contained chunk is rendered, but its BODY is replaced with a pointer.
260
+ // Only the text is duplicated: the id, score, graph relations and
261
+ // extra-context references belong to THIS chunk and exist nowhere else,
262
+ // so dropping the whole section would remove associations rather than
263
+ // repetition — and take a discoverable source id with them.
264
+ const bodyDuplicateOf = contained.get(i);
34
265
  const lines = [];
35
- lines.push(`Chunk ${i + 1}`);
36
- const meta = chunk.document_metadata ?? {};
37
- const title = chunk.source_title || meta.title;
266
+ // The id rides in the chunk header because this block is what a caller
267
+ // actually reads. Without it a recall result is unactionable: there is no
268
+ // value anywhere in the output that `hydradb_inspect` or `hydradb_delete`
269
+ // will accept, so a follow-up means guessing an id or listing everything
270
+ // and matching on prose.
271
+ const chunkId = chunk.id;
272
+ // The score lives here rather than in a separate summary block. It was the
273
+ // only thing that block carried which this one did not, and reproducing it
274
+ // meant re-sending a truncated copy of every chunk body to deliver one
275
+ // percentage per chunk.
276
+ const score = chunk.relevancyScore != null
277
+ ? ` (${Math.round(chunk.relevancyScore * 100)}%)`
278
+ : "";
279
+ lines.push(`Chunk ${rendered}${chunkId ? ` [id: ${chunkId}]` : ""}${score}`);
280
+ const meta = chunk.additionalMetadata ?? {};
281
+ const title = chunk.sourceTitle || meta.title;
38
282
  if (title) {
39
283
  lines.push(`Source: ${title}`);
40
284
  }
41
- lines.push(chunk.chunk_content ?? "");
42
- const chunkUuid = chunk.chunk_uuid;
285
+ const bodyText = extractChunkText(chunk.chunkContent);
286
+ if (bodyDuplicateOf != null) {
287
+ lines.push(`(same text as Chunk ${bodyDuplicateOf})`);
288
+ }
289
+ else
290
+ lines.push(maxChunkChars != null && bodyText.length > maxChunkChars
291
+ ? `${bodyText.slice(0, maxChunkChars)}… [chunk truncated: ${bodyText.length} chars; ` +
292
+ `use detail:"full" or ${"hydradb_inspect"} for the whole source]`
293
+ : bodyText);
294
+ // The SDK types this optional where the old hand-written mirror had it
295
+ // required. An absent uuid simply matches no relation, which is the
296
+ // correct outcome — it must not throw and must not match everything.
297
+ const chunkUuid = chunk.chunkUuid ?? "";
43
298
  const linkedGroupIds = chunkToGroupIds[chunkUuid] ?? [];
44
299
  const matchedRelations = [];
45
- // Track whether the primary lookup found any candidate groups
46
- // (even if all were capped) to avoid incorrectly falling through
47
- // to the fallback path
300
+ /** Take a relation for this chunk unless its group is already capped. */
301
+ const take = (gid, relation) => {
302
+ const occurrences = groupOccurrenceCounts[gid] ?? 0;
303
+ if (maxGroupOccurrences == null || occurrences < maxGroupOccurrences) {
304
+ matchedRelations.push(relation);
305
+ groupOccurrenceCounts[gid] = occurrences + 1;
306
+ }
307
+ };
308
+ // Preferred route: the server said which chunks this relation came from.
309
+ const direct = directRelations[chunkUuid] ?? [];
310
+ for (const [gid, relation] of direct) {
311
+ take(gid, relation);
312
+ }
313
+ // Track whether a lookup found any candidate groups (even if all were
314
+ // capped) to avoid incorrectly falling through to the fallback path
48
315
  const hasLinkedGroups = linkedGroupIds.some((gid) => !!relationIndex[gid]);
49
- for (const gid of linkedGroupIds) {
50
- if (relationIndex[gid]) {
51
- const occurrences = groupOccurrenceCounts[gid] ?? 0;
52
- if (maxGroupOccurrences == null ||
53
- occurrences < maxGroupOccurrences) {
54
- matchedRelations.push(relationIndex[gid]);
55
- groupOccurrenceCounts[gid] = occurrences + 1;
316
+ // Indirect route, used only when the direct one produced no candidates —
317
+ // running both would attach the same relation twice.
318
+ if (direct.length === 0) {
319
+ for (const gid of linkedGroupIds) {
320
+ if (relationIndex[gid]) {
321
+ take(gid, relationIndex[gid]);
56
322
  }
57
323
  }
58
324
  }
59
- if (matchedRelations.length === 0 && !hasLinkedGroups) {
325
+ if (matchedRelations.length === 0 &&
326
+ !hasLinkedGroups &&
327
+ direct.length === 0) {
60
328
  for (const [gid, rel] of Object.entries(relationIndex)) {
61
329
  const triplets = rel.triplets ?? [];
62
330
  const hasChunk = triplets.some((t) => t.relation?.chunk_id === chunkUuid);
@@ -78,15 +346,15 @@ export function buildRecalledContext(response, opts) {
78
346
  relationLines.push(formatTriplet(triplet));
79
347
  }
80
348
  }
81
- else if (rel.combined_context) {
82
- relationLines.push(` ${rel.combined_context}`);
349
+ else if (rel.combinedContext) {
350
+ relationLines.push(` ${rel.combinedContext}`);
83
351
  }
84
352
  }
85
353
  if (relationLines.length > 0) {
86
354
  lines.push("Graph Relations:");
87
355
  lines.push(...relationLines);
88
356
  }
89
- const extraIds = chunk.extra_context_ids ?? [];
357
+ const extraIds = includeExtraContext ? (chunk.extraContextIds ?? []) : [];
90
358
  if (extraIds.length > 0 && Object.keys(extraContextMap).length > 0) {
91
359
  const extraLines = [];
92
360
  for (const ctxId of extraIds) {
@@ -95,8 +363,25 @@ export function buildRecalledContext(response, opts) {
95
363
  const extraChunk = extraContextMap[ctxId];
96
364
  if (extraChunk) {
97
365
  consumedExtraIds.add(ctxId);
98
- const extraContent = extraChunk.chunk_content ?? "";
99
- const extraTitle = extraChunk.source_title ?? "";
366
+ const extraContent = extractChunkText(extraChunk.chunkContent);
367
+ // Keying only on id let byte-identical passages through under
368
+ // different ids — three ~700-char duplicates in one live sample.
369
+ // The title is part of the key: the same passage attributed to a
370
+ // different source is not a duplicate, it is a second citation,
371
+ // and dropping it would strip that chunk's attribution.
372
+ // Placement is the ONLY thing tying an extra-context block to its
373
+ // chunk, so suppressing a repeat outright leaves that chunk looking
374
+ // as though it referenced nothing. Cite where it was shown instead:
375
+ // the association survives, and the passage is still sent once.
376
+ const fingerprint = `${extraChunk.sourceTitle ?? ""}\u0000${normalise(extraContent)}`;
377
+ const shownIn = fingerprint !== "" ? seenExtraContent.get(fingerprint) : undefined;
378
+ if (shownIn != null) {
379
+ extraLines.push(` Related Context: (same as Chunk ${shownIn})`);
380
+ continue;
381
+ }
382
+ if (fingerprint !== "")
383
+ seenExtraContent.set(fingerprint, rendered);
384
+ const extraTitle = extraChunk.sourceTitle ?? "";
100
385
  if (extraTitle) {
101
386
  extraLines.push(` Related Context (${extraTitle}): ${extraContent}`);
102
387
  }
@@ -113,10 +398,10 @@ export function buildRecalledContext(response, opts) {
113
398
  chunkSections.push(lines.join("\n"));
114
399
  }
115
400
  const entityPathLines = [];
116
- const rawPaths = graphCtx.query_paths ?? [];
401
+ const rawPaths = graphCtx.queryPaths ?? [];
117
402
  for (const path of rawPaths) {
118
- if (path.combined_context) {
119
- entityPathLines.push(path.combined_context);
403
+ if (path.combinedContext) {
404
+ entityPathLines.push(path.combinedContext);
120
405
  }
121
406
  else {
122
407
  const triplets = path.triplets ?? [];
@@ -145,6 +430,61 @@ export function buildRecalledContext(response, opts) {
145
430
  output.push("=== CONTEXT ===");
146
431
  output.push(chunkSections.join("\n\n---\n\n"));
147
432
  }
148
- return output.join("\n");
433
+ const text = output.join("\n");
434
+ const budget = opts?.maxTotalChars;
435
+ if (budget != null && text.length > budget) {
436
+ // A per-chunk cap does not bound the whole: fifty capped chunks still add
437
+ // up. The total ceiling is the one that actually protects the caller.
438
+ //
439
+ // Cut at a CHUNK boundary, not mid-string. Slicing the joined text can
440
+ // sever a chunk header, leaving a partial `[id: …]` the caller might try
441
+ // to use, and it silently removes whole sections the "Found N" header is
442
+ // still counting. Dropping whole chunks and saying how many were dropped
443
+ // keeps the header and the body describing the same thing.
444
+ // The prefix needs its own ceiling, not just a place in the accounting: a
445
+ // graph-heavy result can produce entity paths that exceed the whole budget
446
+ // on their own, and then no amount of dropping chunks brings the total
447
+ // under it. Half the budget leaves room for the chunks the caller asked
448
+ // for.
449
+ const headBudget = Math.floor(budget / 2);
450
+ let head = "";
451
+ if (entityPathLines.length > 0) {
452
+ const keptPaths = [];
453
+ let headUsed = "=== ENTITY PATHS ===\n\n".length;
454
+ for (const line of entityPathLines) {
455
+ if (headUsed + line.length + 1 > headBudget)
456
+ break;
457
+ keptPaths.push(line);
458
+ headUsed += line.length + 1;
459
+ }
460
+ const droppedPaths = entityPathLines.length - keptPaths.length;
461
+ head =
462
+ `=== ENTITY PATHS ===\n${keptPaths.join("\n")}` +
463
+ (droppedPaths > 0 ? `\n[${droppedPaths} more entity path(s) omitted]` : "") +
464
+ "\n\n";
465
+ }
466
+ const kept = [];
467
+ // The prefix and the framing count against the ceiling too. Budgeting only
468
+ // the chunk sections let a graph-heavy result exceed the documented limit
469
+ // by however large its entity paths happened to be.
470
+ let used = head.length + "=== CONTEXT ===\n".length + TRUNCATION_NOTE_ALLOWANCE;
471
+ const separator = "\n\n---\n\n";
472
+ for (const section of chunkSections) {
473
+ const cost = section.length + (kept.length > 0 ? separator.length : 0);
474
+ if (used + cost > budget)
475
+ break;
476
+ kept.push(section);
477
+ used += cost;
478
+ }
479
+ const dropped = chunkSections.length - kept.length;
480
+ return {
481
+ text: `${head}=== CONTEXT ===\n${kept.join(separator)}\n\n` +
482
+ `[response truncated: showing ${kept.length} of ${chunkSections.length} chunks. ` +
483
+ `${dropped} omitted to stay within ${budget} characters. Narrow the query, lower ` +
484
+ `max_results, or fetch a specific source with hydradb_inspect.]`,
485
+ shown: kept.length,
486
+ };
487
+ }
488
+ return { text, shown: chunkSections.length };
149
489
  }
150
490
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}