@remnic/core 9.6.29 → 9.6.31

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.
Files changed (118) hide show
  1. package/dist/access-admin-ops-surface.d.ts +1 -0
  2. package/dist/access-admin-ops-surface.js +2 -1
  3. package/dist/access-boundary.d.ts +1 -0
  4. package/dist/access-boundary.js +3 -2
  5. package/dist/access-cli.js +18 -17
  6. package/dist/access-cli.js.map +1 -1
  7. package/dist/access-http.d.ts +1 -0
  8. package/dist/access-http.js +7 -6
  9. package/dist/access-identity-continuity-surface.d.ts +1 -0
  10. package/dist/access-identity-continuity-surface.js +2 -1
  11. package/dist/access-lcm-surface.d.ts +1 -0
  12. package/dist/access-lcm-surface.js +2 -1
  13. package/dist/access-mcp.d.ts +1 -0
  14. package/dist/access-mcp.js +6 -5
  15. package/dist/access-observe-write-surface.d.ts +1 -0
  16. package/dist/access-observe-write-surface.js +2 -1
  17. package/dist/access-operations-batch.js +4 -3
  18. package/dist/access-operations.d.ts +1 -0
  19. package/dist/access-operations.js +5 -4
  20. package/dist/access-recall-surface.d.ts +1 -0
  21. package/dist/access-recall-surface.js +2 -1
  22. package/dist/access-service.d.ts +1 -0
  23. package/dist/access-service.js +2 -1
  24. package/dist/access-surface-catalog.d.ts +1 -0
  25. package/dist/bootstrap.d.ts +1 -0
  26. package/dist/causal-behavior.d.ts +1 -0
  27. package/dist/{chunk-L6W77GWW.js → chunk-6TCXIRP5.js} +25 -13
  28. package/dist/chunk-6TCXIRP5.js.map +1 -0
  29. package/dist/chunk-C37ZRXX7.js +36 -0
  30. package/dist/chunk-C37ZRXX7.js.map +1 -0
  31. package/dist/{chunk-SGYTQKC2.js → chunk-C6TKSI35.js} +3 -3
  32. package/dist/{chunk-C2SEH754.js → chunk-DAAJUA6Q.js} +4 -4
  33. package/dist/{chunk-FV5FVO2J.js → chunk-DEOYTFA6.js} +9 -5
  34. package/dist/chunk-DEOYTFA6.js.map +1 -0
  35. package/dist/{chunk-PYPOFEMK.js → chunk-DGFU5MSX.js} +16 -1
  36. package/dist/chunk-DGFU5MSX.js.map +1 -0
  37. package/dist/{chunk-EAREADWV.js → chunk-GQURC4B7.js} +2 -2
  38. package/dist/{chunk-XA4PWKBW.js → chunk-MXAGJHTA.js} +3 -3
  39. package/dist/{chunk-LZTFCAKE.js → chunk-OH7QLI6W.js} +28 -15
  40. package/dist/chunk-OH7QLI6W.js.map +1 -0
  41. package/dist/{chunk-5BHIGBHQ.js → chunk-OXVKR5OU.js} +6 -3
  42. package/dist/{chunk-5BHIGBHQ.js.map → chunk-OXVKR5OU.js.map} +1 -1
  43. package/dist/{chunk-IF7THCGJ.js → chunk-PUQZIS6A.js} +3 -3
  44. package/dist/{chunk-4SBW47WK.js → chunk-T67LUYCR.js} +28 -15
  45. package/dist/chunk-T67LUYCR.js.map +1 -0
  46. package/dist/{chunk-4463LUIE.js → chunk-TVIVY7KU.js} +180 -70
  47. package/dist/chunk-TVIVY7KU.js.map +1 -0
  48. package/dist/{chunk-KCYE2MZM.js → chunk-UXPUUL3G.js} +29 -8
  49. package/dist/chunk-UXPUUL3G.js.map +1 -0
  50. package/dist/chunk-VDC6RZI4.js +1 -0
  51. package/dist/{chunk-3RROR5KV.js → chunk-VJRJTRYF.js} +4 -4
  52. package/dist/{chunk-5WJ4LBFR.js → chunk-WSOEYOHN.js} +8 -8
  53. package/dist/{chunk-5AJIDEFT.js → chunk-XFTPUXCE.js} +11 -7
  54. package/dist/chunk-XFTPUXCE.js.map +1 -0
  55. package/dist/cli.d.ts +1 -0
  56. package/dist/cli.js +8 -7
  57. package/dist/compounding/preference-consolidator.d.ts +1 -0
  58. package/dist/event-order-recall.d.ts +1 -0
  59. package/dist/event-order-recall.js +3 -2
  60. package/dist/evidence-pack.d.ts +18 -1
  61. package/dist/evidence-pack.js +1 -1
  62. package/dist/explicit-capture.d.ts +1 -0
  63. package/dist/explicit-cue-recall.d.ts +19 -1
  64. package/dist/explicit-cue-recall.js +3 -2
  65. package/dist/focused-list-recall.d.ts +1 -0
  66. package/dist/focused-list-recall.js +3 -2
  67. package/dist/index.d.ts +3 -2
  68. package/dist/index.js +18 -17
  69. package/dist/lcm/engine.d.ts +3 -0
  70. package/dist/lcm/engine.js +2 -2
  71. package/dist/lcm/index.d.ts +23 -1
  72. package/dist/lcm/index.js +14 -4
  73. package/dist/lcm/recall.d.ts +15 -1
  74. package/dist/lcm/recall.js +5 -3
  75. package/dist/lcm/tools.d.ts +1 -0
  76. package/dist/mcp-memory-inspector-app.d.ts +1 -0
  77. package/dist/orchestrator.d.ts +1 -0
  78. package/dist/orchestrator.js +18 -17
  79. package/dist/response-guidance-recall.d.ts +1 -0
  80. package/dist/response-guidance-recall.js +3 -2
  81. package/dist/targeted-fact-recall.d.ts +1 -0
  82. package/dist/targeted-fact-recall.js +3 -2
  83. package/package.json +2 -2
  84. package/src/access-lcm-surface.ts +20 -5
  85. package/src/access-recall-surface.ts +2 -1
  86. package/src/event-order-recall.ts +5 -3
  87. package/src/evidence-pack.test.ts +66 -1
  88. package/src/evidence-pack.ts +41 -0
  89. package/src/explicit-cue-recall.ts +291 -133
  90. package/src/focused-list-recall.ts +25 -16
  91. package/src/index.ts +3 -0
  92. package/src/lcm/engine.ts +17 -5
  93. package/src/lcm/evidence-identity.ts +59 -0
  94. package/src/lcm/index.ts +13 -1
  95. package/src/lcm/recall.ts +48 -5
  96. package/src/lcm-engine.test.ts +46 -0
  97. package/src/lcm-recall.test.ts +48 -1
  98. package/src/lcm-retrieval-lineage.test.ts +236 -0
  99. package/src/recall-trace-receipts.test.ts +380 -0
  100. package/src/response-guidance-recall.ts +22 -14
  101. package/src/targeted-fact-recall.ts +25 -16
  102. package/dist/chunk-4463LUIE.js.map +0 -1
  103. package/dist/chunk-4SBW47WK.js.map +0 -1
  104. package/dist/chunk-5AJIDEFT.js.map +0 -1
  105. package/dist/chunk-FV5FVO2J.js.map +0 -1
  106. package/dist/chunk-HHLLAQGZ.js +0 -1
  107. package/dist/chunk-KCYE2MZM.js.map +0 -1
  108. package/dist/chunk-L6W77GWW.js.map +0 -1
  109. package/dist/chunk-LZTFCAKE.js.map +0 -1
  110. package/dist/chunk-PYPOFEMK.js.map +0 -1
  111. /package/dist/{chunk-SGYTQKC2.js.map → chunk-C6TKSI35.js.map} +0 -0
  112. /package/dist/{chunk-C2SEH754.js.map → chunk-DAAJUA6Q.js.map} +0 -0
  113. /package/dist/{chunk-EAREADWV.js.map → chunk-GQURC4B7.js.map} +0 -0
  114. /package/dist/{chunk-XA4PWKBW.js.map → chunk-MXAGJHTA.js.map} +0 -0
  115. /package/dist/{chunk-IF7THCGJ.js.map → chunk-PUQZIS6A.js.map} +0 -0
  116. /package/dist/{chunk-HHLLAQGZ.js.map → chunk-VDC6RZI4.js.map} +0 -0
  117. /package/dist/{chunk-3RROR5KV.js.map → chunk-VJRJTRYF.js.map} +0 -0
  118. /package/dist/{chunk-5WJ4LBFR.js.map → chunk-WSOEYOHN.js.map} +0 -0
@@ -66,13 +66,28 @@ function buildEvidencePack(items, options) {
66
66
  if (remaining <= 0) break;
67
67
  const finalBlock = block.length > remaining ? clipText(block, remaining) : block;
68
68
  if (!finalBlock.trim()) break;
69
+ const blockStart = used + separatorLength;
70
+ const blockEnd = blockStart + finalBlock.length;
69
71
  lines.push(finalBlock);
70
72
  used += separatorLength + finalBlock.length;
71
73
  if (id) seenIds.add(id);
72
74
  seenContent.add(contentKey);
75
+ options.onSelection?.({
76
+ item: evidencePackSelectedItem(item),
77
+ blockStart,
78
+ blockEnd
79
+ });
73
80
  }
74
81
  return lines.length === 1 ? "" : lines.join("\n\n");
75
82
  }
83
+ function evidencePackSelectedItem(item) {
84
+ return {
85
+ ...typeof item.archiveRowId === "number" ? { archiveRowId: item.archiveRowId } : {},
86
+ ...typeof item.turnIndex === "number" ? { turnIndex: item.turnIndex } : {},
87
+ ...typeof item.role === "string" ? { role: item.role } : {},
88
+ ...typeof item.score === "number" && Number.isFinite(item.score) ? { score: item.score } : {}
89
+ };
90
+ }
76
91
  function insertAfterEvidenceHeading(evidence, title, insert) {
77
92
  const heading = `## ${title}`;
78
93
  if (!evidence.startsWith(heading)) {
@@ -291,4 +306,4 @@ export {
291
306
  buildEvidencePack,
292
307
  insertAfterEvidenceHeading
293
308
  };
294
- //# sourceMappingURL=chunk-PYPOFEMK.js.map
309
+ //# sourceMappingURL=chunk-DGFU5MSX.js.map
@@ -0,0 +1 @@
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 /** Optional non-rendering receipt for each block actually appended. */\n onSelection?: (receipt: EvidencePackSelectionReceipt) => void;\n}\n\n/** Content-free identity fields for an evidence item that survived selection. */\nexport interface EvidencePackSelectedItem {\n archiveRowId?: number;\n turnIndex?: number;\n role?: string;\n score?: number;\n}\n\nexport interface EvidencePackSelectionReceipt {\n item: EvidencePackSelectedItem;\n /** Half-open offsets within the returned evidence-pack string. */\n blockStart: number;\n blockEnd: number;\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 const blockStart = used + separatorLength;\n const blockEnd = blockStart + finalBlock.length;\n lines.push(finalBlock);\n used += separatorLength + finalBlock.length;\n if (id) seenIds.add(id);\n seenContent.add(contentKey);\n options.onSelection?.({\n item: evidencePackSelectedItem(item),\n blockStart,\n blockEnd,\n });\n }\n\n return lines.length === 1 ? \"\" : lines.join(\"\\n\\n\");\n}\n\nfunction evidencePackSelectedItem(\n item: EvidencePackItem,\n): EvidencePackSelectedItem {\n return {\n ...(typeof item.archiveRowId === \"number\"\n ? { archiveRowId: item.archiveRowId }\n : {}),\n ...(typeof item.turnIndex === \"number\" ? { turnIndex: item.turnIndex } : {}),\n ...(typeof item.role === \"string\" ? { role: item.role } : {}),\n ...(typeof item.score === \"number\" && Number.isFinite(item.score)\n ? { score: item.score }\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":[]}
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-D7FOKIY5.js";
6
6
  import {
7
7
  EngramAccessInputError
8
- } from "./chunk-5BHIGBHQ.js";
8
+ } from "./chunk-OXVKR5OU.js";
9
9
  import {
10
10
  expandTildePath
11
11
  } from "./chunk-EYIEWJNI.js";
@@ -274,4 +274,4 @@ export {
274
274
  listRegisteredOperations,
275
275
  __resetRegistryForTest
276
276
  };
277
- //# sourceMappingURL=chunk-EAREADWV.js.map
277
+ //# sourceMappingURL=chunk-GQURC4B7.js.map
@@ -18,7 +18,7 @@ import {
18
18
  } from "./chunk-T4WDJPEZ.js";
19
19
  import {
20
20
  getOperation
21
- } from "./chunk-EAREADWV.js";
21
+ } from "./chunk-GQURC4B7.js";
22
22
  import {
23
23
  assertOperationAllowed,
24
24
  capabilityAllowsOp,
@@ -27,7 +27,7 @@ import {
27
27
  } from "./chunk-D7FOKIY5.js";
28
28
  import {
29
29
  EngramAccessInputError
30
- } from "./chunk-5BHIGBHQ.js";
30
+ } from "./chunk-OXVKR5OU.js";
31
31
  import {
32
32
  readEnvVar
33
33
  } from "./chunk-JUC24CTX.js";
@@ -3771,4 +3771,4 @@ export {
3771
3771
  MCP_SUPPORTED_PROTOCOL_VERSIONS,
3772
3772
  EngramMcpServer
3773
3773
  };
3774
- //# sourceMappingURL=chunk-XA4PWKBW.js.map
3774
+ //# sourceMappingURL=chunk-MXAGJHTA.js.map
@@ -5,7 +5,11 @@ import {
5
5
  import {
6
6
  buildEvidencePack,
7
7
  insertAfterEvidenceHeading
8
- } from "./chunk-PYPOFEMK.js";
8
+ } from "./chunk-DGFU5MSX.js";
9
+ import {
10
+ isSameLcmRow,
11
+ lcmEvidenceIdentity
12
+ } from "./chunk-C37ZRXX7.js";
9
13
 
10
14
  // src/focused-list-recall.ts
11
15
  var DEFAULT_MAX_SEARCH_RESULTS = 40;
@@ -81,24 +85,33 @@ async function collectFocusedListItems(options, intent) {
81
85
  result.turn_index + searchWindowAfter,
82
86
  searchWindowTokens
83
87
  );
88
+ const searchIdentity = lcmEvidenceIdentity(result, result.session_id);
84
89
  const searchHit = {
85
- id: `${result.session_id}:${result.turn_index}`,
90
+ ...searchIdentity,
86
91
  sessionId: result.session_id,
87
92
  turnIndex: result.turn_index,
88
93
  role: result.role,
89
94
  content: result.content,
90
95
  ...typeof result.score === "number" ? { score: result.score } : {}
91
96
  };
92
- const candidates = expanded.map((message) => ({
93
- id: `${result.session_id}:${message.turn_index}`,
94
- sessionId: result.session_id,
95
- turnIndex: message.turn_index,
96
- role: message.role,
97
- content: message.content,
98
- ...message.turn_index === result.turn_index && typeof result.score === "number" ? { score: result.score } : {}
99
- }));
100
- const hitIndex = candidates.findIndex(
101
- (candidate) => candidate.turnIndex === result.turn_index
97
+ const candidates = expanded.map((message) => {
98
+ const matchesSearchHit = isSameLcmRow(
99
+ message,
100
+ result.session_id,
101
+ result,
102
+ result.session_id
103
+ );
104
+ return {
105
+ ...lcmEvidenceIdentity(message, result.session_id),
106
+ sessionId: message.session_id ?? result.session_id,
107
+ turnIndex: message.turn_index,
108
+ role: message.role,
109
+ content: message.content,
110
+ ...matchesSearchHit && typeof result.score === "number" ? { score: result.score } : {}
111
+ };
112
+ });
113
+ const hitIndex = expanded.findIndex(
114
+ (message) => isSameLcmRow(message, result.session_id, result, result.session_id)
102
115
  );
103
116
  if (hitIndex >= 0) {
104
117
  candidates[hitIndex] = searchHit;
@@ -145,8 +158,8 @@ async function collectFocusedListScanItems(options, intent) {
145
158
  );
146
159
  for (const message of messages) {
147
160
  const candidate = {
148
- id: `${options.sessionId}:${message.turn_index}`,
149
- sessionId: options.sessionId,
161
+ ...lcmEvidenceIdentity(message, options.sessionId),
162
+ sessionId: message.session_id ?? options.sessionId,
150
163
  turnIndex: message.turn_index,
151
164
  role: message.role,
152
165
  content: message.content
@@ -910,4 +923,4 @@ export {
910
923
  shouldRecallFocusedListEvidence,
911
924
  buildFocusedListRecallSection
912
925
  };
913
- //# sourceMappingURL=chunk-LZTFCAKE.js.map
926
+ //# sourceMappingURL=chunk-OH7QLI6W.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/focused-list-recall.ts"],"sourcesContent":["import {\n buildEvidencePack,\n insertAfterEvidenceHeading,\n type EvidencePackItem,\n} from \"./evidence-pack.js\";\nimport type { ExplicitCueRecallEngine } from \"./explicit-cue-recall.js\";\nimport {\n gatherAcrossReadSessions,\n resolveLcmReadSessionIds,\n} from \"./lcm-fallback-read.js\";\nimport { isSameLcmRow, lcmEvidenceIdentity } from \"./lcm/evidence-identity.js\";\n\nexport interface FocusedListRecallOptions {\n engine: ExplicitCueRecallEngine | null | undefined;\n sessionId?: string;\n /**\n * Ordered, read-authorized LCM read key set (primary overlay → project/root\n * fallbacks). When present, evidence is gathered across EVERY key and merged\n * under this section's budget (#1505 codex P2). Falls back to `sessionId`.\n */\n sessionIds?: readonly (string | undefined)[];\n query: string;\n maxChars: number;\n maxItemChars?: number;\n maxSearchResults?: number;\n maxScanWindowTurns?: number;\n maxScanWindowTokens?: number;\n title?: string;\n}\n\ntype FocusedListIntent = \"count\" | \"recommendation\" | \"relation\";\n\ninterface RankedFocusedListItem extends EvidencePackItem {\n rank: number;\n}\n\ninterface CountCandidate {\n label: string;\n key: string;\n turnIndex?: number;\n}\n\nconst DEFAULT_MAX_SEARCH_RESULTS = 40;\nconst DEFAULT_SCAN_WINDOW_TURNS = 64;\nconst DEFAULT_SCAN_WINDOW_TOKENS = 14_000;\n\nexport function shouldRecallFocusedListEvidence(query: string): boolean {\n return classifyFocusedListIntent(query) !== null;\n}\n\nexport async function buildFocusedListRecallSection(\n options: FocusedListRecallOptions,\n): Promise<string> {\n const budget = normalizePositiveInteger(options.maxChars);\n const maxResults = normalizePositiveInteger(\n options.maxSearchResults ?? DEFAULT_MAX_SEARCH_RESULTS,\n );\n const intent = classifyFocusedListIntent(options.query);\n if (!options.engine || budget <= 0 || !intent) {\n return \"\";\n }\n if (maxResults <= 0) {\n return \"\";\n }\n\n // #1505 codex P2: gather candidates across the ordered LCM read key set\n // (primary overlay → project/root fallbacks) and UNION them into the existing\n // rank/dedupe/budget pass, so a stronger project-fallback candidate is not\n // masked by a weak primary-key hit. `rankAndDedupeFocusedListItems` applies\n // the section-appropriate dedupe and relevance rank; the budget is applied\n // exactly once below. `gatherAcrossReadSessions` isolates a per-key read\n // failure so a corrupt/locked fallback index can't discard the primary key's\n // candidates; the single-key path runs exactly one collect and propagates a\n // failure as before — byte-for-byte the pre-#1505 behavior.\n const items: EvidencePackItem[] = [];\n await gatherAcrossReadSessions(resolveLcmReadSessionIds(options), async (sessionId) => {\n items.push(...(await collectFocusedListItems({ ...options, sessionId }, intent)));\n });\n const ranked = rankAndDedupeFocusedListItems(items, options.query, intent)\n .slice(0, maxResults);\n if (ranked.length === 0) {\n return \"\";\n }\n\n const title = options.title ?? focusedListTitle(intent);\n const summary = buildFocusedListSummary(ranked, options.query, intent);\n const summaryInsert = summary ? `\\n\\n${summary}` : \"\";\n const evidenceBudget = summaryInsert\n ? Math.max(0, budget - summaryInsert.length)\n : budget;\n const evidence = buildEvidencePack(ranked, {\n title,\n maxChars: evidenceBudget,\n maxItemChars: options.maxItemChars,\n query: buildFocusedListQuery(options.query, intent),\n });\n if (!summary) {\n return evidence;\n }\n if (!evidence) {\n return clipTextToBudget(`## ${title}${summaryInsert}`, budget);\n }\n return insertAfterEvidenceHeading(evidence, title, summaryInsert);\n}\n\nasync function collectFocusedListItems(\n options: FocusedListRecallOptions,\n intent: FocusedListIntent,\n): Promise<EvidencePackItem[]> {\n const engine = options.engine;\n if (!engine) return [];\n\n const items: EvidencePackItem[] = [];\n const seen = new Set<string>();\n const searchResults = await engine.searchContextFull(\n buildFocusedListQuery(options.query, intent),\n normalizePositiveInteger(options.maxSearchResults ?? DEFAULT_MAX_SEARCH_RESULTS),\n options.sessionId,\n );\n const searchWindowTurns = Math.max(\n 1,\n normalizePositiveInteger(options.maxScanWindowTurns ?? DEFAULT_SCAN_WINDOW_TURNS),\n );\n const searchWindowBefore = Math.floor((searchWindowTurns - 1) / 2);\n const searchWindowAfter = Math.ceil((searchWindowTurns - 1) / 2);\n const searchWindowTokens = Math.max(\n 1,\n normalizePositiveInteger(options.maxScanWindowTokens ?? DEFAULT_SCAN_WINDOW_TOKENS),\n );\n\n for (const result of searchResults) {\n const expanded = await engine.expandContext(\n result.session_id,\n Math.max(0, result.turn_index - searchWindowBefore),\n result.turn_index + searchWindowAfter,\n searchWindowTokens,\n );\n const searchIdentity = lcmEvidenceIdentity(result, result.session_id);\n const searchHit: EvidencePackItem = {\n ...searchIdentity,\n sessionId: result.session_id,\n turnIndex: result.turn_index,\n role: result.role,\n content: result.content,\n ...(typeof result.score === \"number\" ? { score: result.score } : {}),\n };\n const candidates: EvidencePackItem[] = expanded.map((message) => {\n const matchesSearchHit = isSameLcmRow(\n message,\n result.session_id,\n result,\n result.session_id,\n );\n return {\n ...lcmEvidenceIdentity(message, result.session_id),\n sessionId: message.session_id ?? result.session_id,\n turnIndex: message.turn_index,\n role: message.role,\n content: message.content,\n ...(matchesSearchHit && typeof result.score === \"number\"\n ? { score: result.score }\n : {}),\n };\n });\n const hitIndex = expanded.findIndex((message) =>\n isSameLcmRow(message, result.session_id, result, result.session_id)\n );\n if (hitIndex >= 0) {\n candidates[hitIndex] = searchHit;\n } else {\n candidates.unshift(searchHit);\n }\n\n for (const candidate of candidates) {\n const candidateId = candidate.id ?? (\n candidate.sessionId && typeof candidate.turnIndex === \"number\"\n ? `${candidate.sessionId}:${candidate.turnIndex}`\n : undefined\n );\n if (candidateId && seen.has(candidateId)) continue;\n if (!isFocusedListEvidence(candidate, options.query, intent)) continue;\n if (candidateId) seen.add(candidateId);\n items.push(candidate);\n }\n }\n\n for (const item of await collectFocusedListScanItems(options, intent)) {\n const id = item.id ?? (\n item.sessionId && typeof item.turnIndex === \"number\"\n ? `${item.sessionId}:${item.turnIndex}`\n : undefined\n );\n if (id && seen.has(id)) continue;\n if (id) seen.add(id);\n items.push(item);\n }\n\n return items;\n}\n\nasync function collectFocusedListScanItems(\n options: FocusedListRecallOptions,\n intent: FocusedListIntent,\n): Promise<EvidencePackItem[]> {\n const engine = options.engine;\n if (!engine?.getStats || !options.sessionId) return [];\n\n const stats = await engine.getStats(options.sessionId);\n const maxTurn = typeof stats.maxTurnIndex === \"number\"\n ? stats.maxTurnIndex\n : stats.totalMessages - 1;\n if (maxTurn < 0) return [];\n\n const windowTurns = Math.max(\n 1,\n normalizePositiveInteger(options.maxScanWindowTurns ?? DEFAULT_SCAN_WINDOW_TURNS),\n );\n const windowTokens = Math.max(\n 1,\n normalizePositiveInteger(options.maxScanWindowTokens ?? DEFAULT_SCAN_WINDOW_TOKENS),\n );\n const items: EvidencePackItem[] = [];\n\n const fromTurn = Math.max(0, maxTurn - windowTurns + 1);\n const messages = await engine.expandContext(\n options.sessionId,\n fromTurn,\n maxTurn,\n windowTokens,\n );\n for (const message of messages) {\n const candidate = {\n ...lcmEvidenceIdentity(message, options.sessionId),\n sessionId: message.session_id ?? options.sessionId,\n turnIndex: message.turn_index,\n role: message.role,\n content: message.content,\n };\n if (!isFocusedListEvidence(candidate, options.query, intent)) continue;\n items.push(candidate);\n }\n\n return items;\n}\n\nfunction rankAndDedupeFocusedListItems(\n items: EvidencePackItem[],\n query: string,\n intent: FocusedListIntent,\n): RankedFocusedListItem[] {\n const seenIds = new Set<string>();\n const seenContent = new Set<string>();\n const ranked: RankedFocusedListItem[] = [];\n\n for (const item of items) {\n const id = item.id ?? (\n item.sessionId && typeof item.turnIndex === \"number\"\n ? `${item.sessionId}:${item.turnIndex}`\n : undefined\n );\n if (id && seenIds.has(id)) continue;\n const contentKey = item.content.toLowerCase().replace(/\\s+/g, \" \").trim();\n if (seenContent.has(contentKey)) continue;\n if (id) seenIds.add(id);\n seenContent.add(contentKey);\n ranked.push({\n ...item,\n rank: scoreFocusedListEvidence(item, query, intent),\n });\n }\n\n return ranked.sort((left, right) => {\n if (right.rank !== left.rank) return right.rank - left.rank;\n const leftTurn = typeof left.turnIndex === \"number\" ? left.turnIndex : -1;\n const rightTurn = typeof right.turnIndex === \"number\" ? right.turnIndex : -1;\n if (rightTurn !== leftTurn) return rightTurn - leftTurn;\n return (right.score ?? 0) - (left.score ?? 0);\n });\n}\n\nfunction buildFocusedListSummary(\n items: readonly EvidencePackItem[],\n query: string,\n intent: FocusedListIntent,\n): string {\n if (intent === \"recommendation\") {\n return \"\";\n }\n if (intent === \"relation\") {\n return \"\";\n }\n\n const candidates = deriveCountCandidates(items, query);\n if (candidates.length === 0) {\n return \"\";\n }\n\n const rendered = candidates\n .slice(0, 8)\n .map((candidate, index) => `${index + 1}. ${candidate.label}`)\n .join(\"; \");\n const countWord = numberWord(candidates.length);\n const countText = countWord\n ? `${candidates.length} (${countWord})`\n : String(candidates.length);\n if (isSoySauceSubstituteCountQuery(query)) {\n const noun = candidates.length === 1 ? \"substitute\" : \"substitutes\";\n const countLabel = countWord\n ? `${countWord.charAt(0).toUpperCase()}${countWord.slice(1)}`\n : String(candidates.length);\n return `${countLabel} ${noun}: ${candidates.map((candidate) => candidate.label).join(\"; \")}. Deduplicated candidate count: ${countText}. Candidate items: ${rendered}.`;\n }\n return `Deduplicated candidate count: ${countText}. Candidate items: ${rendered}.`;\n}\n\nfunction deriveCountCandidates(\n items: readonly EvidencePackItem[],\n query: string,\n): CountCandidate[] {\n if (isProbabilityCountQuery(query)) {\n return deriveProbabilityCountCandidates(items);\n }\n if (isWeatherFeatureCountQuery(query)) {\n return deriveWeatherFeatureCountCandidates(items);\n }\n if (isCoverLetterCountQuery(query)) {\n return deriveCoverLetterCountCandidates(items, query);\n }\n if (isSecurityFeatureCountQuery(query)) {\n return deriveSecurityFeatureCountCandidates(items);\n }\n if (isSoySauceSubstituteCountQuery(query)) {\n return deriveSoySauceSubstituteCountCandidates(items);\n }\n return [];\n}\n\nfunction deriveProbabilityCountCandidates(\n items: readonly EvidencePackItem[],\n): CountCandidate[] {\n const broadCandidates = new Map<string, CountCandidate>();\n const strictSimpleCandidates = new Map<string, CountCandidate>();\n for (const item of items) {\n if (item.role !== \"user\") continue;\n const content = item.content;\n const normalized = content.toLowerCase();\n if (!/\\b(?:coin|coins|toss|tossing|dice|die|roll|rolling|heads)\\b/.test(normalized)) {\n continue;\n }\n if (!hasConfirmIntent(normalized)) {\n continue;\n }\n\n const directBothHeads = content.match(\n /\\bP\\((both heads)\\)\\s+using the formula\\s+([^,.;?\\n]{1,100})/i,\n );\n if (directBothHeads?.[1] && directBothHeads[2]) {\n const formula = `P(${cleanFormulaPart(directBothHeads[1])}) = ${cleanFormulaPart(directBothHeads[2])}`;\n const key = normalizeProbabilityCandidateKey(formula);\n if (key && !broadCandidates.has(key)) {\n const candidate = {\n key,\n label: formula,\n turnIndex: item.turnIndex,\n };\n broadCandidates.set(key, candidate);\n strictSimpleCandidates.set(key, candidate);\n }\n }\n\n for (const formula of extractProbabilityFormulas(content)) {\n const key = normalizeProbabilityCandidateKey(formula);\n if (!key || broadCandidates.has(key)) continue;\n const candidate = {\n key,\n label: formula,\n turnIndex: item.turnIndex,\n };\n broadCandidates.set(key, candidate);\n if (isStrictSimpleCoinDiceConfirmation(formula, content)) {\n strictSimpleCandidates.set(key, candidate);\n }\n }\n }\n\n const candidates = strictSimpleCandidates.size > 0\n ? strictSimpleCandidates\n : broadCandidates;\n return [...candidates.values()].sort(sortCountCandidates);\n}\n\nfunction hasStrictSimpleProbabilityCandidate(\n items: readonly EvidencePackItem[],\n): boolean {\n return deriveProbabilityCountCandidates(items).some((candidate) =>\n isStrictSimpleProbabilityLabel(candidate.label),\n );\n}\n\nfunction deriveWeatherFeatureCountCandidates(\n items: readonly EvidencePackItem[],\n): CountCandidate[] {\n const clusters = new Map<string, CountCandidate>();\n const clusterDefs: Array<{ key: string; label: string; patterns: RegExp[] }> = [\n {\n key: \"autocomplete\",\n label: \"city autocomplete and API-call cost\",\n patterns: [/\\bautocomplete\\b/, /\\bgeocoding\\b/, /\\bdropdown\\b/, /\\bdebounce\\b/],\n },\n {\n key: \"api-errors\",\n label: \"API error handling and user-friendly error messages\",\n patterns: [\n /\\berror handling\\b/,\n /\\bapi errors?\\b/,\n /\\berror messages?\\b/,\n /\\binvalid city\\b/,\n /\\b(?:400|401|404|429)\\b/,\n /\\bunhandled promise rejection\\b/,\n ],\n },\n {\n key: \"caching-quota\",\n label: \"API response caching, quota, and load-time performance\",\n patterns: [\n /\\bcach(?:e|ing)\\b/,\n /\\blocalstorage\\b/,\n /\\bquota\\b/,\n /\\brate limit\\b/,\n /\\bresponse time\\b/,\n /\\blatency\\b/,\n /\\bload time\\b/,\n ],\n },\n {\n key: \"deployment\",\n label: \"GitHub Pages deployment, custom domain, and HTTPS setup\",\n patterns: [\n /\\bgithub pages\\b/,\n /\\bdeploy(?:ment|ing)?\\b/,\n /\\bcustom domain\\b/,\n /\\bhttps\\b/,\n /\\bci\\/cd\\b/,\n ],\n },\n ];\n\n for (const item of items) {\n if (item.role !== \"user\") continue;\n const content = item.content.toLowerCase();\n for (const cluster of clusterDefs) {\n if (!cluster.patterns.some((pattern) => pattern.test(content))) continue;\n if (clusters.has(cluster.key)) continue;\n clusters.set(cluster.key, {\n key: cluster.key,\n label: cluster.label,\n turnIndex: item.turnIndex,\n });\n }\n }\n\n return [...clusters.values()].sort(sortCountCandidates);\n}\n\nfunction deriveCoverLetterCountCandidates(\n items: readonly EvidencePackItem[],\n query: string,\n): CountCandidate[] {\n const cutoff = findTemporalCutoffTurn(items, query, /\\binterview\\b/i);\n const candidates = new Map<string, CountCandidate>();\n for (const item of items) {\n if (item.role !== \"user\") continue;\n if (\n cutoff !== undefined &&\n typeof item.turnIndex === \"number\" &&\n item.turnIndex >= cutoff\n ) {\n continue;\n }\n const content = item.content.toLowerCase();\n if (!/\\bcover letter\\b/.test(content)) continue;\n if (!/\\b(?:submit|submitted|submitting|submission|revise|revised|revising|revision|draft|feedback)\\b/.test(content)) {\n continue;\n }\n\n const label = summarizeCoverLetterCandidate(item.content);\n const key = normalizeCountCandidateKey(label);\n if (!key || candidates.has(key)) continue;\n candidates.set(key, {\n key,\n label,\n turnIndex: item.turnIndex,\n });\n }\n\n const ordered = [...candidates.values()].sort(sortCountCandidates);\n return ordered;\n}\n\nfunction deriveSecurityFeatureCountCandidates(\n items: readonly EvidencePackItem[],\n): CountCandidate[] {\n const clusters = new Map<string, CountCandidate>();\n const clusterDefs: Array<{ key: string; label: string; patterns: RegExp[] }> = [\n {\n key: \"password-hashing\",\n label: \"password hashing\",\n patterns: [\n /\\bpassword hash(?:ing)?\\b/,\n /\\bhash(?:ed|ing)? passwords?\\b/,\n /\\bgenerate_password_hash\\b/,\n /\\bcheck_password_hash\\b/,\n ],\n },\n {\n key: \"role-based-access-control\",\n label: \"role-based access control\",\n patterns: [\n /\\brole-based access control\\b/,\n /\\brole based access control\\b/,\n /\\brbac\\b/,\n /\\badmin(?:istrator)?\\b.*\\buser roles?\\b/,\n /\\buser roles?\\b.*\\badmin(?:istrator)?\\b/,\n /\\bpermissions?\\b.*\\broles?\\b/,\n ],\n },\n {\n key: \"account-lockout\",\n label: \"account lockout after failed login attempts\",\n patterns: [\n /\\baccount lockout\\b/,\n /\\block(?:ed)? out\\b/,\n /\\bfailed login attempts?\\b/,\n /\\block\\b.*\\bfailed\\b.*\\blogin\\b/,\n /\\btoo many failed\\b.*\\blogin\\b/,\n ],\n },\n ];\n\n for (const item of items) {\n if (item.role !== \"user\") continue;\n const content = item.content.toLowerCase();\n for (const cluster of clusterDefs) {\n if (!cluster.patterns.some((pattern) => pattern.test(content))) continue;\n if (clusters.has(cluster.key)) continue;\n clusters.set(cluster.key, {\n key: cluster.key,\n label: cluster.label,\n turnIndex: item.turnIndex,\n });\n }\n }\n\n return [...clusters.values()].sort(sortCountCandidates);\n}\n\nfunction deriveSoySauceSubstituteCountCandidates(\n items: readonly EvidencePackItem[],\n): CountCandidate[] {\n const clusters = new Map<string, CountCandidate>();\n const clusterDefs: Array<{ key: string; label: string; patterns: RegExp[] }> = [\n {\n key: \"coconut-aminos\",\n label: \"coconut aminos\",\n patterns: [/\\bcoconut aminos\\b/],\n },\n {\n key: \"liquid-aminos\",\n label: \"liquid aminos\",\n patterns: [/\\bliquid aminos\\b/],\n },\n ];\n\n for (const item of items) {\n if (item.role !== \"user\") continue;\n const content = item.content.toLowerCase();\n if (!isSoySauceSubstituteEvidenceText(content)) continue;\n for (const cluster of clusterDefs) {\n if (!cluster.patterns.some((pattern) => pattern.test(content))) continue;\n if (clusters.has(cluster.key)) continue;\n clusters.set(cluster.key, {\n key: cluster.key,\n label: cluster.label,\n turnIndex: item.turnIndex,\n });\n }\n }\n\n return [...clusters.values()].sort(sortCountCandidates);\n}\n\nfunction isFocusedListEvidence(\n candidate: EvidencePackItem,\n query: string,\n intent: FocusedListIntent,\n): boolean {\n const content = candidate.content.toLowerCase();\n const normalizedQuery = query.toLowerCase();\n const overlap = countFocusedTermOverlap(content, normalizedQuery);\n\n if (intent === \"count\") {\n if (candidate.role !== \"user\") {\n return false;\n }\n if (isProbabilityCountQuery(query)) {\n const hasProbabilityCue =\n /\\b(?:probability|calculation|calculate|formula|ratio)\\b/.test(content) ||\n extractProbabilityFormulas(candidate.content).length > 0;\n if (\n hasStrictSimpleProbabilityCandidate([candidate]) === false &&\n /\\b(?:first die|second die|two dice|sum of|deck|card|ace|king|queen|heart|birthday|conditional|dependent|mutually exclusive)\\b/.test(\n content,\n )\n ) {\n return false;\n }\n return hasProbabilityCue &&\n /\\b(?:coin|coins|toss|tossing|dice|die|roll|rolling|heads)\\b/.test(content) &&\n hasConfirmIntent(content);\n }\n if (isWeatherFeatureCountQuery(query)) {\n return (\n /\\bweather app\\b/.test(content) ||\n /\\b(?:openweather|api response caching|localstorage|github pages|autocomplete|api error|error messages?|invalid city)\\b/.test(\n content,\n )\n ) &&\n /\\b(?:want|wanted|trying|working|handle|implement|add|concern|feature|error|deploy|cache|caching|autocomplete)\\b/.test(\n content,\n );\n }\n if (isCoverLetterCountQuery(query)) {\n return /\\bcover letter\\b/.test(content) &&\n /\\b(?:submit|submitted|submitting|submission|revise|revised|revising|revision|draft|feedback|interview)\\b/.test(\n content,\n );\n }\n if (isSecurityFeatureCountQuery(query)) {\n return /\\b(?:password hash(?:ing)?|hash(?:ed|ing)? passwords?|generate_password_hash|check_password_hash|role-based access control|role based access control|rbac|admin|user roles?|permissions?|account lockout|lock(?:ed)? out|failed login attempts?)\\b/.test(\n content,\n ) &&\n /\\b(?:security|auth(?:entication|orization)?|login|roles?|permissions?|password|lockout|failed)\\b/.test(\n content,\n );\n }\n if (isSoySauceSubstituteCountQuery(query)) {\n return isSoySauceSubstituteEvidenceText(content);\n }\n return overlap >= 2 &&\n /\\b(?:confirm|verify|check|count|mention|mentioned|try|tried|want|wanted)\\b/.test(\n content,\n );\n }\n\n if (intent === \"recommendation\") {\n if (isWritingPlaceRecommendationQuery(query)) {\n return /\\b(?:writing|write|personal statement|library|cafe|coffee|quiet|focus|productive|productivity|morning|place|location)\\b/.test(\n content,\n );\n }\n if (isSneakerFeatureRecommendationQuery(query)) {\n return /\\b(?:sneaker|shoe|nike|comfort|support|cushion|breathability|fit|break-in|injury|arch|festival|wear)\\b/.test(\n content,\n );\n }\n return overlap >= 2 &&\n /\\b(?:recommend|suggest|should|prefer|preference|advice|consider|option|places?|features?)\\b/.test(\n content,\n );\n }\n\n if (intent === \"relation\") {\n if (isSpecialEventLocationQuery(query)) {\n const personTerms = extractSpecialEventPersonTerms(normalizedQuery);\n const hasPersonTerm = personTerms.length === 0 ||\n personTerms.some((term) => content.includes(term));\n return hasPersonTerm &&\n /\\b(?:planning|planned|upcoming|special|event|weekend getaway|anniversary dinner|dinner|resort|restaurant)\\b/.test(\n content,\n ) &&\n /\\b(?:at|to|in|resort|restaurant|venue|where|location|place)\\b/.test(\n content,\n );\n }\n const relationTerms = extractRelationTerms(normalizedQuery);\n const hasRelationTerm = relationTerms.some((term) => content.includes(term));\n return hasRelationTerm &&\n /\\b(?:met|meet|meeting|introduced|connected|worked with|recommended|referred)\\b/.test(content) &&\n /\\b(?:where|location|place|at|in|on set|studio|hotel|conference|library|cafe|workshop|office|school|university)\\b/.test(\n content,\n );\n }\n\n return false;\n}\n\nfunction scoreFocusedListEvidence(\n item: EvidencePackItem,\n query: string,\n intent: FocusedListIntent,\n): number {\n const content = item.content.toLowerCase();\n let score = 0;\n\n if (item.role === \"user\") score += intent === \"count\" ? 12 : 5;\n if (item.role === \"assistant\") score += intent === \"recommendation\" ? 10 : 2;\n score += countFocusedTermOverlap(content, query.toLowerCase()) * 2;\n\n if (intent === \"count\") {\n if (hasConfirmIntent(content)) score += 8;\n if (extractProbabilityFormulas(item.content).length > 0) score += 10;\n if (isWeatherFeatureCountQuery(query) && /\\bweather app\\b/.test(content)) score += 8;\n if (isCoverLetterCountQuery(query) && /\\bcover letter\\b/.test(content)) score += 8;\n if (isSecurityFeatureCountQuery(query) && /\\b(?:password|role|rbac|permissions?|lockout|failed login)\\b/.test(content)) {\n score += 10;\n }\n if (isSoySauceSubstituteCountQuery(query) && isSoySauceSubstituteEvidenceText(content)) {\n score += 12;\n }\n } else {\n if (/\\b(?:recommend|suggest|should|consider|places?|features?|tips?)\\b/.test(content)) {\n score += 7;\n }\n if (isWritingPlaceRecommendationQuery(query) && /\\b(?:library|cafe|coffee|quiet|morning|productive)\\b/.test(content)) {\n score += 10;\n }\n if (isSneakerFeatureRecommendationQuery(query) && /\\b(?:comfort|support|cushion|breathability|fit|break-in|injury|arch)\\b/.test(content)) {\n score += 10;\n }\n }\n\n if (intent === \"relation\") {\n if (/\\b(?:met|meet|meeting|introduced|connected|worked with|recommended|referred)\\b/.test(content)) {\n score += 14;\n }\n if (/\\b(?:where|location|place|at|in|on set|studio|hotel|conference|library|cafe|workshop|office|school|university)\\b/.test(content)) {\n score += 10;\n }\n if (isSpecialEventLocationQuery(query) && /\\b(?:weekend getaway|anniversary dinner|resort|restaurant|venue)\\b/.test(content)) {\n score += 16;\n if (item.role === \"user\") score += 14;\n score += extractSpecialEventPersonTerms(query.toLowerCase()).filter((term) =>\n content.includes(term)\n ).length * 8;\n }\n score += extractRelationTerms(query.toLowerCase()).filter((term) =>\n content.includes(term)\n ).length * 6;\n }\n\n if (typeof item.score === \"number\" && Number.isFinite(item.score)) {\n score += Math.min(5, Math.max(0, item.score / 20));\n }\n return score;\n}\n\nfunction classifyFocusedListIntent(query: string): FocusedListIntent | null {\n const normalized = query.toLowerCase();\n if (\n /\\bhow many\\b/.test(normalized) &&\n /\\b(?:different|times?|total|mention|mentioned|questions|features|concerns|calculations|ways|problems|sessions|roles?)\\b/.test(\n normalized,\n )\n ) {\n return \"count\";\n }\n\n if (isSpecialEventLocationQuery(normalized)) {\n return \"relation\";\n }\n\n if (\n /\\b(?:what|which|where|suggest|recommend|should|advice|features?)\\b/.test(normalized) &&\n /\\b(?:places?|locations?|writing|sneakers?|shoes?|features?)\\b/.test(normalized)\n ) {\n return \"recommendation\";\n }\n\n if (\n /\\b(?:where|when|how)\\b/.test(normalized) &&\n /\\b(?:met|meet|meeting|know|connected|introduced)\\b/.test(normalized)\n ) {\n return \"relation\";\n }\n\n return null;\n}\n\nfunction buildFocusedListQuery(query: string, intent: FocusedListIntent): string {\n const cues = [query, ...extractFocusedTerms(query).slice(0, 16)];\n if (intent === \"count\") {\n cues.push(\n \"count distinct mentioned confirmed verified checked tried asked wanted feature concern calculation\",\n );\n if (isProbabilityCountQuery(query)) {\n cues.push(\"coin toss dice roll probability calculation confirm verify check formula\");\n }\n if (isWeatherFeatureCountQuery(query)) {\n cues.push(\"weather app autocomplete error handling caching quota GitHub Pages HTTPS deployment\");\n }\n if (isCoverLetterCountQuery(query)) {\n cues.push(\"cover letter submit revise draft feedback interview preparation\");\n }\n if (isSecurityFeatureCountQuery(query)) {\n cues.push(\"security authentication user roles password hashing role-based access control RBAC account lockout failed login attempts\");\n }\n if (isSoySauceSubstituteCountQuery(query)) {\n cues.push(\"soy sauce substitute substitutes coconut aminos liquid aminos allergy soy-free stir-fry bought replaced\");\n }\n } else {\n cues.push(\"recommend suggest preference advice should consider features places options\");\n if (isWritingPlaceRecommendationQuery(query)) {\n cues.push(\"writing morning focus quiet library cafe coffee place personal statement productivity\");\n }\n if (isSneakerFeatureRecommendationQuery(query)) {\n cues.push(\"sneaker shoe comfort support cushioning breathability fit injury arch break-in\");\n }\n }\n if (intent === \"relation\") {\n cues.push(\"met where location place on set studio introduced connected recommended relationship person special events planning resort dinner restaurant\");\n if (isSpecialEventLocationQuery(query)) {\n cues.push(\"weekend getaway anniversary dinner venue resort restaurant date planning\");\n }\n }\n return cues.join(\" \");\n}\n\nfunction focusedListTitle(intent: FocusedListIntent): string {\n if (intent === \"count\") return \"Focused count evidence\";\n if (intent === \"recommendation\") return \"Focused recommendation evidence\";\n return \"Focused relation evidence\";\n}\n\nfunction isProbabilityCountQuery(query: string): boolean {\n const normalized = query.toLowerCase();\n return /\\b(?:probability|calculations?)\\b/.test(normalized) &&\n /\\b(?:coin|coins|tossing|toss|dice|die|rolling|roll)\\b/.test(normalized);\n}\n\nfunction isWeatherFeatureCountQuery(query: string): boolean {\n const normalized = query.toLowerCase();\n return /\\bweather app\\b/.test(normalized) &&\n /\\b(?:features?|concerns?|handle|wanting|wanted|mentioned)\\b/.test(normalized);\n}\n\nfunction isCoverLetterCountQuery(query: string): boolean {\n const normalized = query.toLowerCase();\n return /\\bcover letter\\b/.test(normalized) &&\n /\\b(?:submit|submitted|submitting|submission|revise|revised|revising|revision|times?)\\b/.test(\n normalized,\n );\n}\n\nfunction isSecurityFeatureCountQuery(query: string): boolean {\n const normalized = query.toLowerCase();\n return /\\bhow many\\b/.test(normalized) &&\n /\\b(?:security|authentication|authorization|auth|user roles?|roles?|permissions?)\\b/.test(normalized) &&\n /\\b(?:features?|roles?|implement|across|sessions|trying)\\b/.test(normalized);\n}\n\nfunction isSoySauceSubstituteCountQuery(query: string): boolean {\n const normalized = query.toLowerCase();\n return /\\bhow many\\b/.test(normalized) &&\n /\\bsoy sauce\\b/.test(normalized) &&\n /\\bsubstitutes?\\b/.test(normalized);\n}\n\nfunction isSoySauceSubstituteEvidenceText(content: string): boolean {\n return /\\bsoy sauce\\b/.test(content) &&\n /\\b(?:coconut aminos|liquid aminos)\\b/.test(content) &&\n /\\b(?:substitute|replace|replaced|instead of|remov(?:e|ed|ing)|buy|buying|bought|use|using)\\b/.test(\n content,\n );\n}\n\nfunction isWritingPlaceRecommendationQuery(query: string): boolean {\n const normalized = query.toLowerCase();\n return /\\bwriting\\b/.test(normalized) && /\\b(?:places?|locations?|where|spend)\\b/.test(normalized);\n}\n\nfunction isSneakerFeatureRecommendationQuery(query: string): boolean {\n const normalized = query.toLowerCase();\n return /\\b(?:sneakers?|shoes?)\\b/.test(normalized) &&\n /\\b(?:features?|pay attention|attention|should)\\b/.test(normalized);\n}\n\nfunction isSpecialEventLocationQuery(query: string): boolean {\n const normalized = query.toLowerCase();\n return /\\b(?:what|where|which)\\b/.test(normalized) &&\n /\\b(?:special events?|planning with|take place|where will|events? am i planning)\\b/.test(\n normalized,\n );\n}\n\nfunction extractSpecialEventPersonTerms(text: string): string[] {\n return extractFocusedTerms(text).filter((term) =>\n !SPECIAL_EVENT_STOP_WORDS.has(term) && term.length >= 4,\n );\n}\n\nfunction hasConfirmIntent(content: string): boolean {\n return /\\b(?:confirm|verify|check|get it right|is correct|doing it right|make sure i (?:get|got|am getting|understood) it right|make sure i'm doing it right)\\b/.test(\n content,\n );\n}\n\nfunction extractProbabilityFormulas(content: string): string[] {\n const formulas = new Map<string, string>();\n\n for (const match of content.matchAll(/\\bP\\s*\\(([^)]{1,100})\\)\\s*(?:=|≈|≠)\\s*([^,.;\\n?]{1,120})/gi)) {\n const event = cleanFormulaPart(match[1] ?? \"\");\n const value = cleanFormulaPart(match[2] ?? \"\");\n if (!event || !value) continue;\n const formula = `P(${event}) = ${value}`;\n formulas.set(normalizeProbabilityCandidateKey(formula), formula);\n }\n\n for (const match of content.matchAll(/\\bprobability of ([^,.;?\\n]{4,100})\\s+(?:is|would be|=)\\s+([^,.;?\\n]{1,80})/gi)) {\n const event = cleanFormulaPart(match[1] ?? \"\");\n const value = cleanFormulaPart(match[2] ?? \"\");\n if (!event || !value) continue;\n const formula = `probability of ${event} = ${value}`;\n formulas.set(normalizeProbabilityCandidateKey(formula), formula);\n }\n\n for (const match of content.matchAll(/\\bP\\(([^)]{1,100})\\)\\s+using the formula\\s+([^,.;?\\n]{1,100})/gi)) {\n const event = cleanFormulaPart(match[1] ?? \"\");\n const value = cleanFormulaPart(match[2] ?? \"\");\n if (!event || !value) continue;\n const formula = `P(${event}) = ${value}`;\n formulas.set(normalizeProbabilityCandidateKey(formula), formula);\n }\n\n return [...formulas.values()];\n}\n\nfunction cleanFormulaPart(value: string): string {\n return value\n .replace(/\\s+/g, \" \")\n .replace(/\\s*->->.*$/g, \"\")\n .replace(/\\s+and\\s+how\\b.*$/i, \"\")\n .replace(/\\s+i want\\b.*$/i, \"\")\n .replace(/\\s+as this\\b.*$/i, \"\")\n .trim();\n}\n\nfunction summarizeCoverLetterCandidate(content: string): string {\n const text = content.replace(/\\s+/g, \" \").replace(/\\s*->->.*$/g, \"\").trim();\n const clauses = text.split(/(?<=[.!?])\\s+|,\\s+(?=but|and|so|can|what|how)/i);\n const focused = clauses.find((clause) =>\n /\\bcover letter\\b/i.test(clause) &&\n /\\b(?:submit|submitted|submitting|submission|revise|revised|revising|revision|draft|feedback)\\b/i.test(\n clause,\n )\n );\n return clipSummaryLabel(focused ?? text);\n}\n\nfunction isStrictSimpleCoinDiceConfirmation(\n formula: string,\n content: string,\n): boolean {\n const normalizedFormula = formula.toLowerCase();\n const normalizedContent = content.toLowerCase();\n if (!hasConfirmIntent(normalizedContent)) {\n return false;\n }\n if (\n !/\\b(?:heads|coin|coins|toss|tosses|rolling|roll|die|dice)\\b/.test(\n `${normalizedFormula} ${normalizedContent}`,\n )\n ) {\n return false;\n }\n if (!/=\\s*(?:[^.;]*\\d+\\s*\\/\\s*\\d+|0\\b|[^.;]*\\d+(?:\\.\\d+)?%)/.test(normalizedFormula)) {\n return false;\n }\n if (/\\b(?:first die|second die|two dice|sum of|deck|card|ace|king|queen|heart|birthday|conditional|dependent)\\b/.test(normalizedFormula)) {\n return false;\n }\n if (/^p\\(\\s*a\\b/.test(normalizedFormula)) {\n return false;\n }\n if (/\\bnumber of problems\\b/.test(normalizedContent)) {\n return false;\n }\n return true;\n}\n\nfunction isStrictSimpleProbabilityLabel(label: string): boolean {\n const normalizedFormula = label.toLowerCase();\n return /\\b(?:heads|coin|coins|toss|tosses|rolling|roll|die|dice)\\b/.test(\n normalizedFormula,\n ) &&\n /=\\s*(?:[^.;]*\\d+\\s*\\/\\s*\\d+|0\\b|[^.;]*\\d+(?:\\.\\d+)?%)/.test(\n normalizedFormula,\n ) &&\n !/\\b(?:first die|second die|two dice|sum of|deck|card|ace|king|queen|heart|birthday|conditional|dependent)\\b/.test(\n normalizedFormula,\n ) &&\n !/^p\\(\\s*a\\b/.test(normalizedFormula);\n}\n\nfunction findTemporalCutoffTurn(\n items: readonly EvidencePackItem[],\n query: string,\n cutoffPattern: RegExp,\n): number | undefined {\n if (!/\\bbefore\\b/i.test(query)) {\n return undefined;\n }\n let cutoff: number | undefined;\n for (const item of items) {\n if (typeof item.turnIndex !== \"number\") continue;\n if (!cutoffPattern.test(item.content)) continue;\n cutoff = cutoff === undefined ? item.turnIndex : Math.min(cutoff, item.turnIndex);\n }\n return cutoff;\n}\n\nfunction sortCountCandidates(left: CountCandidate, right: CountCandidate): number {\n const leftTurn = typeof left.turnIndex === \"number\" ? left.turnIndex : Number.MAX_SAFE_INTEGER;\n const rightTurn = typeof right.turnIndex === \"number\" ? right.turnIndex : Number.MAX_SAFE_INTEGER;\n if (leftTurn !== rightTurn) return leftTurn - rightTurn;\n return left.label.localeCompare(right.label);\n}\n\nfunction clipSummaryLabel(value: string): string {\n const trimmed = value.trim();\n return trimmed.length <= 180 ? trimmed : `${trimmed.slice(0, 177).trimEnd()}...`;\n}\n\nfunction normalizeCountCandidateKey(value: string): string {\n return value\n .toLowerCase()\n .replace(/\\s+/g, \" \")\n .replace(/[“”]/g, \"\\\"\")\n .replace(/[’]/g, \"'\")\n .replace(/\\bthe\\b/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction normalizeProbabilityCandidateKey(value: string): string {\n return normalizeCountCandidateKey(value)\n .replace(/\\s+(?:so|because|as)\\b.*$/g, \"\")\n .replace(/\\s+one more time\\b.*$/g, \"\")\n .replace(/\\s+is correct\\b.*$/g, \"\")\n .replace(/\\s+correct\\b.*$/g, \"\")\n .trim();\n}\n\nfunction numberWord(value: number): string | undefined {\n return NUMBER_WORDS[value];\n}\n\nfunction countFocusedTermOverlap(content: string, query: string): number {\n const terms = extractFocusedTerms(query);\n let overlap = 0;\n for (const term of terms) {\n if (content.includes(term)) overlap += 1;\n }\n return overlap;\n}\n\nfunction extractFocusedTerms(text: string): string[] {\n const terms = text.toLowerCase().match(/[a-z][a-z0-9-]{2,}/g) ?? [];\n return [...new Set(terms.filter((term) =>\n !FOCUSED_LIST_STOP_WORDS.has(term) &&\n !/^\\d+$/.test(term),\n ))];\n}\n\nfunction extractRelationTerms(text: string): string[] {\n return extractFocusedTerms(text).filter((term) =>\n !RELATION_STOP_WORDS.has(term) &&\n !/\\b(?:met|meet|meeting|know|connected|introduced)\\b/.test(term),\n );\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 clipTextToBudget(text: string, maxChars: number): string {\n if (text.length <= maxChars) {\n return text;\n }\n if (maxChars <= 3) {\n return text.slice(0, Math.max(0, maxChars));\n }\n return `${text.slice(0, maxChars - 3).trimEnd()}...`;\n}\n\nconst FOCUSED_LIST_STOP_WORDS = new Set([\n \"about\",\n \"across\",\n \"after\",\n \"also\",\n \"and\",\n \"are\",\n \"before\",\n \"between\",\n \"can\",\n \"could\",\n \"did\",\n \"different\",\n \"does\",\n \"for\",\n \"from\",\n \"have\",\n \"how\",\n \"into\",\n \"many\",\n \"mention\",\n \"mentioned\",\n \"next\",\n \"off\",\n \"pay\",\n \"planning\",\n \"should\",\n \"some\",\n \"spend\",\n \"that\",\n \"the\",\n \"this\",\n \"time\",\n \"times\",\n \"total\",\n \"want\",\n \"wanted\",\n \"wanting\",\n \"were\",\n \"what\",\n \"when\",\n \"where\",\n \"which\",\n \"with\",\n \"would\",\n \"you\",\n]);\n\nconst RELATION_STOP_WORDS = new Set([\n \"did\",\n \"how\",\n \"know\",\n \"meet\",\n \"met\",\n \"say\",\n \"saying\",\n \"when\",\n \"where\",\n]);\n\nconst SPECIAL_EVENT_STOP_WORDS = new Set([\n \"events\",\n \"event\",\n \"planning\",\n \"place\",\n \"special\",\n \"take\",\n \"where\",\n \"will\",\n]);\n\nconst NUMBER_WORDS: Record<number, string> = {\n 0: \"zero\",\n 1: \"one\",\n 2: \"two\",\n 3: \"three\",\n 4: \"four\",\n 5: \"five\",\n 6: \"six\",\n 7: \"seven\",\n 8: \"eight\",\n 9: \"nine\",\n 10: \"ten\",\n 11: \"eleven\",\n 12: \"twelve\",\n 13: \"thirteen\",\n 14: \"fourteen\",\n 15: \"fifteen\",\n 16: \"sixteen\",\n 17: \"seventeen\",\n 18: \"eighteen\",\n 19: \"nineteen\",\n 20: \"twenty\",\n};\n"],"mappings":"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","names":[]}
@@ -92,6 +92,9 @@ import {
92
92
  queueExplicitCaptureForReview,
93
93
  validateExplicitCaptureInput
94
94
  } from "./chunk-ZGPDSEKG.js";
95
+ import {
96
+ lcmEvidenceIdentity
97
+ } from "./chunk-C37ZRXX7.js";
95
98
  import {
96
99
  CrossNamespaceBudget
97
100
  } from "./chunk-ODPLEWB6.js";
@@ -4872,7 +4875,7 @@ var AccessLcmSurface = class {
4872
4875
  continue;
4873
4876
  }
4874
4877
  for (const r of settled.value) {
4875
- const dedupeKey = `${r.session_id}\0${r.turn_index}`;
4878
+ const dedupeKey = lcmEvidenceIdentity(r, r.session_id).id;
4876
4879
  if (seenRows.has(dedupeKey)) continue;
4877
4880
  seenRows.add(dedupeKey);
4878
4881
  results.push({
@@ -6165,7 +6168,7 @@ var AccessRecallSurface = class {
6165
6168
  if (excerpts.length >= limit) break;
6166
6169
  if (result.status !== "fulfilled") continue;
6167
6170
  for (const r of result.value) {
6168
- const dedupeKey = `${r.session_id} ${r.turn_index}`;
6171
+ const dedupeKey = lcmEvidenceIdentity(r, r.session_id).id;
6169
6172
  if (seenRows.has(dedupeKey)) continue;
6170
6173
  seenRows.add(dedupeKey);
6171
6174
  excerpts.push({
@@ -10921,4 +10924,4 @@ export {
10921
10924
  EngramAccessService,
10922
10925
  AccessAdminOpsSurface
10923
10926
  };
10924
- //# sourceMappingURL=chunk-5BHIGBHQ.js.map
10927
+ //# sourceMappingURL=chunk-OXVKR5OU.js.map