@remnic/core 9.6.30 → 9.6.32
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/dist/access-admin-ops-surface.d.ts +1 -0
- package/dist/access-boundary.d.ts +1 -0
- package/dist/access-cli.js +9 -9
- package/dist/access-http.d.ts +1 -0
- package/dist/access-identity-continuity-surface.d.ts +1 -0
- package/dist/access-lcm-surface.d.ts +1 -0
- package/dist/access-mcp.d.ts +1 -0
- package/dist/access-observe-write-surface.d.ts +1 -0
- package/dist/access-operations.d.ts +1 -0
- package/dist/access-recall-surface.d.ts +1 -0
- package/dist/access-service.d.ts +1 -0
- package/dist/access-surface-catalog.d.ts +1 -0
- package/dist/bootstrap.d.ts +1 -0
- package/dist/causal-behavior.d.ts +1 -0
- package/dist/{chunk-XGSOXFD4.js → chunk-6TCXIRP5.js} +2 -2
- package/dist/{chunk-7O2JL5RY.js → chunk-DEOYTFA6.js} +2 -2
- package/dist/{chunk-R26WO46Z.js → chunk-DGFU5MSX.js} +16 -1
- package/dist/chunk-DGFU5MSX.js.map +1 -0
- package/dist/{chunk-BFU7H32D.js → chunk-OH7QLI6W.js} +2 -2
- package/dist/{chunk-IRMLYBMU.js → chunk-T67LUYCR.js} +2 -2
- package/dist/{chunk-77UPM7P3.js → chunk-TVIVY7KU.js} +160 -61
- package/dist/chunk-TVIVY7KU.js.map +1 -0
- package/dist/{chunk-KCYE2MZM.js → chunk-UXPUUL3G.js} +29 -8
- package/dist/chunk-UXPUUL3G.js.map +1 -0
- package/dist/{chunk-3VSTTB74.js → chunk-WSOEYOHN.js} +7 -7
- package/dist/{chunk-5AJIDEFT.js → chunk-XFTPUXCE.js} +11 -7
- package/dist/chunk-XFTPUXCE.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/compounding/preference-consolidator.d.ts +1 -0
- package/dist/event-order-recall.d.ts +1 -0
- package/dist/event-order-recall.js +2 -2
- package/dist/evidence-pack.d.ts +16 -1
- package/dist/evidence-pack.js +1 -1
- package/dist/explicit-capture.d.ts +1 -0
- package/dist/explicit-cue-recall.d.ts +16 -1
- package/dist/explicit-cue-recall.js +2 -2
- package/dist/focused-list-recall.d.ts +1 -0
- package/dist/focused-list-recall.js +2 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +9 -9
- package/dist/lcm/engine.d.ts +3 -0
- package/dist/lcm/engine.js +2 -2
- package/dist/lcm/index.d.ts +1 -1
- package/dist/lcm/index.js +5 -3
- package/dist/lcm/recall.d.ts +15 -1
- package/dist/lcm/recall.js +5 -3
- package/dist/lcm/tools.d.ts +1 -0
- package/dist/mcp-memory-inspector-app.d.ts +1 -0
- package/dist/orchestrator.d.ts +1 -0
- package/dist/orchestrator.js +9 -9
- package/dist/response-guidance-recall.d.ts +1 -0
- package/dist/response-guidance-recall.js +2 -2
- package/dist/targeted-fact-recall.d.ts +1 -0
- package/dist/targeted-fact-recall.js +2 -2
- package/package.json +2 -2
- package/src/evidence-pack.test.ts +66 -1
- package/src/evidence-pack.ts +39 -0
- package/src/explicit-cue-recall.ts +224 -67
- package/src/index.ts +3 -0
- package/src/lcm/engine.ts +17 -5
- package/src/lcm/index.ts +6 -1
- package/src/lcm/recall.ts +48 -5
- package/src/lcm-engine.test.ts +46 -0
- package/src/lcm-recall.test.ts +48 -1
- package/src/recall-trace-receipts.test.ts +380 -0
- package/dist/chunk-5AJIDEFT.js.map +0 -1
- package/dist/chunk-77UPM7P3.js.map +0 -1
- package/dist/chunk-KCYE2MZM.js.map +0 -1
- package/dist/chunk-R26WO46Z.js.map +0 -1
- /package/dist/{chunk-XGSOXFD4.js.map → chunk-6TCXIRP5.js.map} +0 -0
- /package/dist/{chunk-7O2JL5RY.js.map → chunk-DEOYTFA6.js.map} +0 -0
- /package/dist/{chunk-BFU7H32D.js.map → chunk-OH7QLI6W.js.map} +0 -0
- /package/dist/{chunk-IRMLYBMU.js.map → chunk-T67LUYCR.js.map} +0 -0
- /package/dist/{chunk-3VSTTB74.js.map → chunk-WSOEYOHN.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lcm/recall.ts"],"sourcesContent":["import type { LcmDag, SummaryNode } from \"./dag.js\";\nimport type { LcmArchive } from \"./archive.js\";\nimport { log } from \"../logger.js\";\n\nexport interface LcmRecallConfig {\n freshTailTurns: number;\n budgetChars: number;\n}\n\n/**\n * Assemble a compressed session history section from the summary DAG.\n *\n * Strategy:\n * 1. For the \"fresh tail\" (most recent N turns), use leaf-level summaries for maximum detail.\n * 2. For older portions, use the deepest available summary nodes (most compressed).\n * 3. Fill within budget, prioritizing recent content.\n */\nexport function assembleCompressedHistory(\n dag: LcmDag,\n archive: LcmArchive,\n sessionId: string,\n config: LcmRecallConfig,\n): string {\n const maxTurn = archive.getMaxTurnIndex(sessionId);\n if (maxTurn < 0) return \"\";\n\n const allNodes = dag.getAllNodes(sessionId);\n if (allNodes.length === 0) return \"\";\n\n const freshTailStart = Math.max(0, maxTurn - config.freshTailTurns + 1);\n const sections: string[] = [];\n let usedChars = 0;\n\n // Collect nodes covering the \"old\" portion (before fresh tail)\n if (freshTailStart > 0) {\n const oldNodes = selectBestCoverage(allNodes, 0, freshTailStart - 1);\n for (const node of oldNodes) {\n const label = formatRangeLabel(node, maxTurn);\n const entry = `**${label}** (depth ${node.depth}):\\n${node.summary_text}`;\n if (usedChars + entry.length > config.budgetChars) break;\n sections.push(entry);\n usedChars += entry.length;\n }\n }\n\n // Collect leaf nodes that overlap with the fresh tail region.\n // The old section uses deep nodes (depth > 0), so leaf nodes included here\n // won't duplicate old-section content. Use msg_end >= freshTailStart to\n // include straddling leaf nodes that partially cover the fresh region.\n const freshNodes = allNodes\n .filter(\n (n) => n.depth === 0 && n.msg_end >= freshTailStart && n.msg_end <= maxTurn,\n )\n .sort((a, b) => a.msg_start - b.msg_start);\n\n for (const node of freshNodes) {\n const label = `Recent (turns ${node.msg_start}-${node.msg_end})`;\n const entry = `**${label}**:\\n${node.summary_text}`;\n if (usedChars + entry.length > config.budgetChars) break;\n sections.push(entry);\n usedChars += entry.length;\n }\n\n if (sections.length === 0) return \"\";\n\n return `## Session History (Compressed)\\n\\n${sections.join(\"\\n\\n\")}`;\n}\n\n/**\n * Select the best coverage for a turn range.\n * Prefers deeper (more compressed) nodes. Avoids overlapping coverage.\n */\nfunction selectBestCoverage(\n allNodes: SummaryNode[],\n fromTurn: number,\n toTurn: number,\n): SummaryNode[] {\n // Filter to nodes fully contained in the requested range. Straddling nodes\n // would duplicate protected fresh-tail turns while still emitting their full\n // summary text and range label.\n const candidates = allNodes.filter(\n (n) => n.msg_start >= fromTurn && n.msg_end <= toTurn,\n );\n\n if (candidates.length === 0) return [];\n\n // Sort by msg_start ascending, then depth descending (prefer deeper at same position)\n candidates.sort((a, b) => {\n if (a.msg_start !== b.msg_start) return a.msg_start - b.msg_start;\n return b.depth - a.depth;\n });\n\n // Greedily select non-overlapping nodes, preferring deeper coverage.\n const selected: SummaryNode[] = [];\n let coveredUpTo = fromTurn - 1;\n\n for (const node of candidates) {\n if (node.msg_start > coveredUpTo) {\n selected.push(node);\n coveredUpTo = node.msg_end;\n if (coveredUpTo >= toTurn) break;\n }\n }\n\n // Re-sort selected by msg_start for chronological output\n selected.sort((a, b) => a.msg_start - b.msg_start);\n return selected;\n}\n\nfunction formatRangeLabel(node: SummaryNode, maxTurn: number): string {\n const startPct = Math.round((node.msg_start / Math.max(1, maxTurn)) * 100);\n const endPct = Math.round((node.msg_end / Math.max(1, maxTurn)) * 100);\n\n if (startPct < 33) return `Early session (turns ${node.msg_start}-${node.msg_end})`;\n if (endPct < 66) return `Mid session (turns ${node.msg_start}-${node.msg_end})`;\n return `Later session (turns ${node.msg_start}-${node.msg_end})`;\n}\n"],"mappings":";AAiBO,SAAS,0BACd,KACA,SACA,WACA,QACQ;AACR,QAAM,UAAU,QAAQ,gBAAgB,SAAS;AACjD,MAAI,UAAU,EAAG,QAAO;AAExB,QAAM,WAAW,IAAI,YAAY,SAAS;AAC1C,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,QAAM,iBAAiB,KAAK,IAAI,GAAG,UAAU,OAAO,iBAAiB,CAAC;AACtE,QAAM,WAAqB,CAAC;AAC5B,MAAI,YAAY;AAGhB,MAAI,iBAAiB,GAAG;AACtB,UAAM,WAAW,mBAAmB,UAAU,GAAG,iBAAiB,CAAC;AACnE,eAAW,QAAQ,UAAU;AAC3B,YAAM,QAAQ,iBAAiB,MAAM,OAAO;AAC5C,YAAM,QAAQ,KAAK,KAAK,aAAa,KAAK,KAAK;AAAA,EAAO,KAAK,YAAY;AACvE,UAAI,YAAY,MAAM,SAAS,OAAO,YAAa;AACnD,eAAS,KAAK,KAAK;AACnB,mBAAa,MAAM;AAAA,IACrB;AAAA,EACF;AAMA,QAAM,aAAa,SAChB;AAAA,IACC,CAAC,MAAM,EAAE,UAAU,KAAK,EAAE,WAAW,kBAAkB,EAAE,WAAW;AAAA,EACtE,EACC,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAE3C,aAAW,QAAQ,YAAY;AAC7B,UAAM,QAAQ,iBAAiB,KAAK,SAAS,IAAI,KAAK,OAAO;AAC7D,UAAM,QAAQ,KAAK,KAAK;AAAA,EAAQ,KAAK,YAAY;AACjD,QAAI,YAAY,MAAM,SAAS,OAAO,YAAa;AACnD,aAAS,KAAK,KAAK;AACnB,iBAAa,MAAM;AAAA,EACrB;AAEA,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,SAAO;AAAA;AAAA,EAAsC,SAAS,KAAK,MAAM,CAAC;AACpE;AAMA,SAAS,mBACP,UACA,UACA,QACe;AAIf,QAAM,aAAa,SAAS;AAAA,IAC1B,CAAC,MAAM,EAAE,aAAa,YAAY,EAAE,WAAW;AAAA,EACjD;AAEA,MAAI,WAAW,WAAW,EAAG,QAAO,CAAC;AAGrC,aAAW,KAAK,CAAC,GAAG,MAAM;AACxB,QAAI,EAAE,cAAc,EAAE,UAAW,QAAO,EAAE,YAAY,EAAE;AACxD,WAAO,EAAE,QAAQ,EAAE;AAAA,EACrB,CAAC;AAGD,QAAM,WAA0B,CAAC;AACjC,MAAI,cAAc,WAAW;AAE7B,aAAW,QAAQ,YAAY;AAC7B,QAAI,KAAK,YAAY,aAAa;AAChC,eAAS,KAAK,IAAI;AAClB,oBAAc,KAAK;AACnB,UAAI,eAAe,OAAQ;AAAA,IAC7B;AAAA,EACF;AAGA,WAAS,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AACjD,SAAO;AACT;AAEA,SAAS,iBAAiB,MAAmB,SAAyB;AACpE,QAAM,WAAW,KAAK,MAAO,KAAK,YAAY,KAAK,IAAI,GAAG,OAAO,IAAK,GAAG;AACzE,QAAM,SAAS,KAAK,MAAO,KAAK,UAAU,KAAK,IAAI,GAAG,OAAO,IAAK,GAAG;AAErE,MAAI,WAAW,GAAI,QAAO,wBAAwB,KAAK,SAAS,IAAI,KAAK,OAAO;AAChF,MAAI,SAAS,GAAI,QAAO,sBAAsB,KAAK,SAAS,IAAI,KAAK,OAAO;AAC5E,SAAO,wBAAwB,KAAK,SAAS,IAAI,KAAK,OAAO;AAC/D;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/evidence-pack.ts"],"sourcesContent":["export interface EvidencePackItem {\n id?: string;\n /** Stable SQLite row lineage for diagnostics; intentionally not rendered. */\n archiveRowId?: number;\n sessionId?: string;\n turnIndex?: number;\n role?: string;\n content: string;\n score?: number;\n}\n\nexport interface EvidencePackOptions {\n title?: string;\n maxChars: number;\n maxItemChars?: number;\n query?: string;\n}\n\nconst DEFAULT_MAX_ITEM_CHARS = 1_200;\nconst QUERY_FOCUS_STOPWORDS = new Set([\n \"about\",\n \"after\",\n \"again\",\n \"also\",\n \"and\",\n \"are\",\n \"between\",\n \"can\",\n \"could\",\n \"did\",\n \"does\",\n \"during\",\n \"for\",\n \"from\",\n \"have\",\n \"how\",\n \"into\",\n \"many\",\n \"should\",\n \"that\",\n \"the\",\n \"this\",\n \"till\",\n \"until\",\n \"want\",\n \"was\",\n \"were\",\n \"what\",\n \"when\",\n \"which\",\n \"with\",\n \"would\",\n \"you\",\n]);\n\nexport function buildEvidencePack(\n items: readonly EvidencePackItem[],\n options: EvidencePackOptions,\n): string {\n const budget = normalizePositiveInteger(options.maxChars);\n if (budget <= 0 || items.length === 0) {\n return \"\";\n }\n\n const maxItemChars = normalizePositiveInteger(\n options.maxItemChars ?? DEFAULT_MAX_ITEM_CHARS,\n );\n if (maxItemChars <= 0) {\n return \"\";\n }\n\n const title = options.title ?? \"Evidence\";\n const lines: string[] = [`## ${title}`];\n const seenIds = new Set<string>();\n const seenContent = new Set<string>();\n let used = lines[0]!.length;\n\n for (const item of items) {\n const content = item.content.trim();\n if (!content) continue;\n\n const id = item.id ?? evidenceItemFallbackId(item);\n if (id && seenIds.has(id)) continue;\n\n const contentKey = normalizeEvidenceContent(content);\n if (seenContent.has(contentKey)) continue;\n\n const label = formatEvidenceLabel(item);\n const clipped = clipEvidenceContent(content, maxItemChars, options.query);\n const block = `${label}: ${clipped}`;\n const separatorLength = lines.length > 0 ? 2 : 0;\n const remaining = budget - used - separatorLength;\n if (remaining <= 0) break;\n\n const finalBlock =\n block.length > remaining ? clipText(block, remaining) : block;\n if (!finalBlock.trim()) break;\n\n lines.push(finalBlock);\n used += separatorLength + finalBlock.length;\n if (id) seenIds.add(id);\n seenContent.add(contentKey);\n }\n\n return lines.length === 1 ? \"\" : lines.join(\"\\n\\n\");\n}\n\nexport function insertAfterEvidenceHeading(\n evidence: string,\n title: string,\n insert: string,\n): string {\n const heading = `## ${title}`;\n if (!evidence.startsWith(heading)) {\n return evidence;\n }\n return `${heading}${insert}${evidence.slice(heading.length)}`;\n}\n\nfunction normalizePositiveInteger(value: number): number {\n if (!Number.isFinite(value) || value <= 0) {\n return 0;\n }\n return Math.floor(value);\n}\n\nfunction evidenceItemFallbackId(item: EvidencePackItem): string | undefined {\n if (item.sessionId && typeof item.turnIndex === \"number\") {\n return `${item.sessionId}:${item.turnIndex}`;\n }\n return undefined;\n}\n\nfunction normalizeEvidenceContent(content: string): string {\n return content.toLowerCase().replace(/\\s+/g, \" \").trim();\n}\n\nfunction formatEvidenceLabel(item: EvidencePackItem): string {\n const parts: string[] = [];\n if (item.sessionId) parts.push(item.sessionId);\n if (typeof item.turnIndex === \"number\") parts.push(`turn ${item.turnIndex}`);\n if (item.role) parts.push(item.role);\n if (typeof item.score === \"number\" && Number.isFinite(item.score)) {\n parts.push(`score ${item.score.toFixed(3)}`);\n }\n return parts.length > 0 ? `[${parts.join(\", \")}]` : \"[evidence]\";\n}\n\nfunction clipText(text: string, maxChars: number): string {\n if (text.length <= maxChars) {\n return text;\n }\n if (maxChars <= 1) {\n return text.slice(0, maxChars);\n }\n if (maxChars <= 3) {\n return text.slice(0, maxChars);\n }\n return `${text.slice(0, maxChars - 3).trimEnd()}...`;\n}\n\nfunction clipEvidenceContent(\n content: string,\n maxChars: number,\n query?: string,\n): string {\n if (content.length <= maxChars) {\n return content;\n }\n\n const focused = buildQueryFocusedExcerpt(content, maxChars, query);\n return focused ?? clipText(content, maxChars);\n}\n\nfunction buildQueryFocusedExcerpt(\n content: string,\n maxChars: number,\n query?: string,\n): string | undefined {\n const cues = collectQueryFocusCues(query ?? \"\");\n if (cues.length === 0) {\n return undefined;\n }\n\n const lines = content\n .replaceAll(\"\\r\\n\", \"\\n\")\n .replaceAll(\"\\r\", \"\\n\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (lines.length < 2) {\n return undefined;\n }\n\n const temporalIntent = hasTemporalFocusIntent(query ?? \"\");\n const scored = lines\n .map((line, index) => ({\n index,\n score: scoreEvidenceLine(line, cues, temporalIntent, index),\n }))\n .filter((entry) => entry.score > 0)\n .sort((left, right) => right.score - left.score || left.index - right.index);\n\n if (scored.length === 0) {\n return undefined;\n }\n\n let selected = new Set<number>();\n for (let index = 0; index < Math.min(3, lines.length); index += 1) {\n if (isEvidenceMetadataLine(lines[index]!)) {\n selected.add(index);\n }\n }\n\n for (const entry of scored.slice(0, 8)) {\n const candidate = new Set(selected);\n const radius = lineWindowRadius(lines[entry.index]!, temporalIntent);\n for (\n let index = Math.max(0, entry.index - radius);\n index <= Math.min(lines.length - 1, entry.index + radius);\n index += 1\n ) {\n candidate.add(index);\n }\n if (renderSelectedEvidenceLines(lines, candidate).length <= maxChars) {\n selected = candidate;\n }\n }\n\n const excerpt = buildExcerptFromLineSelection(lines, selected, maxChars);\n return excerpt.length > 0 ? excerpt : undefined;\n}\n\nfunction collectQueryFocusCues(query: string): string[] {\n const words = (query.toLowerCase().match(/[a-z][a-z0-9-]{2,}/g) ?? [])\n .map(trimBoundaryHyphens)\n .filter(\n (word) =>\n word.length >= 3 &&\n !/^\\d+$/.test(word) &&\n !QUERY_FOCUS_STOPWORDS.has(word),\n );\n const cues = new Set<string>();\n for (const word of words) {\n cues.add(word);\n }\n for (let index = 0; index < words.length - 1; index += 1) {\n const left = words[index]!;\n const right = words[index + 1]!;\n if (left.length >= 4 && right.length >= 4) {\n cues.add(`${left} ${right}`);\n }\n }\n for (let index = 0; index < words.length - 2; index += 1) {\n const left = words[index]!;\n const middle = words[index + 1]!;\n const right = words[index + 2]!;\n if (left.length >= 4 && middle.length >= 4 && right.length >= 4) {\n cues.add(`${left} ${middle} ${right}`);\n }\n }\n return [...cues].sort((left, right) => right.length - left.length || left.localeCompare(right));\n}\n\nfunction trimBoundaryHyphens(value: string): string {\n let start = 0;\n let end = value.length;\n while (start < end && value[start] === \"-\") {\n start += 1;\n }\n while (end > start && value[end - 1] === \"-\") {\n end -= 1;\n }\n return start === 0 && end === value.length ? value : value.slice(start, end);\n}\n\nfunction hasTemporalFocusIntent(query: string): boolean {\n return /\\b(?:after|before|between|date|deadline|during|finish(?:ing|ed)?|how many|timeline|week|weeks|when)\\b/i.test(\n query,\n );\n}\n\nfunction scoreEvidenceLine(\n line: string,\n cues: readonly string[],\n temporalIntent: boolean,\n index: number,\n): number {\n const normalized = line.toLowerCase();\n let score = 0;\n for (const cue of cues) {\n if (!normalized.includes(cue)) {\n continue;\n }\n score += cue.includes(\" \") ? 8 : 3;\n }\n if (temporalIntent && hasDateLikeEvidence(line)) {\n score += 6;\n }\n if (\n temporalIntent &&\n /\\b(?:deadline|deployment|finish(?:ing|ed)?|milestones?|schedule|timeline)\\b/i.test(line)\n ) {\n score += 5;\n }\n if (/^\\s{0,3}(?:#{1,6}\\s*)?(?:milestones?|schedule|timeline)\\b/i.test(line)) {\n score += 3;\n }\n if (isEvidenceMetadataLine(line)) {\n score += Math.max(0, 3 - index);\n }\n return score;\n}\n\nfunction hasDateLikeEvidence(line: string): boolean {\n return /\\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\\.?\\s+\\d{1,2}\\b/i.test(\n line,\n ) || /\\b\\d{4}-\\d{2}-\\d{2}\\b/.test(line);\n}\n\nfunction isEvidenceMetadataLine(line: string): boolean {\n return /\\b(?:chat_id|source_chat_id|session_id|plan_id|task_id|ability)=/.test(\n line,\n );\n}\n\nfunction lineWindowRadius(line: string, temporalIntent: boolean): number {\n if (temporalIntent && hasDateLikeEvidence(line)) {\n return 0;\n }\n if (temporalIntent && /^\\s{0,3}(?:#{1,6}\\s*)?(?:milestones?|schedule|timeline)\\b/i.test(line)) {\n return 2;\n }\n return 1;\n}\n\nfunction buildExcerptFromLineSelection(\n lines: readonly string[],\n selected: ReadonlySet<number>,\n maxChars: number,\n): string {\n const ordered = [...selected].sort((left, right) => left - right);\n const output: string[] = [];\n let used = 0;\n let lastIndex = -1;\n\n const append = (text: string): boolean => {\n const separator = output.length === 0 ? \"\" : \"\\n\";\n const remaining = maxChars - used - separator.length;\n if (remaining <= 0) {\n return false;\n }\n const value = text.length > remaining ? clipText(text, remaining) : text;\n if (!value.trim()) {\n return false;\n }\n output.push(value);\n used += separator.length + value.length;\n return text.length <= remaining;\n };\n\n for (const index of ordered) {\n if (lastIndex >= 0 && index > lastIndex + 1 && !append(\"...\")) {\n break;\n }\n if (!append(lines[index]!)) {\n break;\n }\n lastIndex = index;\n }\n\n return output.join(\"\\n\");\n}\n\nfunction renderSelectedEvidenceLines(\n lines: readonly string[],\n selected: ReadonlySet<number>,\n): string {\n const ordered = [...selected].sort((left, right) => left - right);\n const output: string[] = [];\n let lastIndex = -1;\n for (const index of ordered) {\n if (lastIndex >= 0 && index > lastIndex + 1) {\n output.push(\"...\");\n }\n output.push(lines[index]!);\n lastIndex = index;\n }\n return output.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|