pi-fabric 0.82.1 → 0.82.2

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 (29) hide show
  1. package/dist/chunks/{chunk-LYZMKRKM.js → chunk-AB3DHS5B.js} +2 -2
  2. package/dist/chunks/{chunk-EVW4SYOF.js → chunk-AQVVGIQI.js} +2 -2
  3. package/dist/chunks/{chunk-NUGAZERX.js → chunk-F7ZDTK7B.js} +8 -7
  4. package/dist/chunks/chunk-F7ZDTK7B.js.map +7 -0
  5. package/dist/chunks/{chunk-JCIF7VFN.js → chunk-HXAEON2E.js} +54 -33
  6. package/dist/chunks/{chunk-JCIF7VFN.js.map → chunk-HXAEON2E.js.map} +2 -2
  7. package/dist/chunks/{chunk-7AK5EOIT.js → chunk-LCGYENIY.js} +394 -138
  8. package/dist/chunks/chunk-LCGYENIY.js.map +7 -0
  9. package/dist/chunks/{fabric-runtime-state-A2HY6UQV.js → fabric-runtime-state-5Y5CEC2E.js} +5 -5
  10. package/dist/entropy/index.js +3 -3
  11. package/dist/index.js +4 -4
  12. package/dist/memory/context.d.ts.map +1 -1
  13. package/dist/memory/discovery.js +2 -2
  14. package/dist/memory/index.d.ts +1 -0
  15. package/dist/memory/index.d.ts.map +1 -1
  16. package/dist/memory/normalize.d.ts +2 -2
  17. package/dist/memory/normalize.d.ts.map +1 -1
  18. package/dist/memory/normalize.js +1 -1
  19. package/dist/memory/search.d.ts.map +1 -1
  20. package/dist/memory/search.js +2 -2
  21. package/dist/providers/memory-provider.d.ts +9 -0
  22. package/dist/providers/memory-provider.d.ts.map +1 -1
  23. package/dist/providers/memory-provider.js +4 -4
  24. package/package.json +1 -1
  25. package/dist/chunks/chunk-7AK5EOIT.js.map +0 -7
  26. package/dist/chunks/chunk-NUGAZERX.js.map +0 -7
  27. /package/dist/chunks/{chunk-LYZMKRKM.js.map → chunk-AB3DHS5B.js.map} +0 -0
  28. /package/dist/chunks/{chunk-EVW4SYOF.js.map → chunk-AQVVGIQI.js.map} +0 -0
  29. /package/dist/chunks/{fabric-runtime-state-A2HY6UQV.js.map → fabric-runtime-state-5Y5CEC2E.js.map} +0 -0
@@ -11,7 +11,7 @@ import {
11
11
  import {
12
12
  sessionDirForCwd,
13
13
  sessionsDirRoot
14
- } from "./chunk-EVW4SYOF.js";
14
+ } from "./chunk-AQVVGIQI.js";
15
15
  import {
16
16
  stableJsonHash
17
17
  } from "./chunk-CIJPRYAP.js";
@@ -1602,4 +1602,4 @@ export {
1602
1602
  saveObservationPool,
1603
1603
  runEntropyTrial
1604
1604
  };
1605
- //# sourceMappingURL=chunk-LYZMKRKM.js.map
1605
+ //# sourceMappingURL=chunk-AB3DHS5B.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  readSessionHeader
3
- } from "./chunk-JCIF7VFN.js";
3
+ } from "./chunk-HXAEON2E.js";
4
4
 
5
5
  // src/memory/discovery.ts
6
6
  import fs from "node:fs";
@@ -109,4 +109,4 @@ export {
109
109
  resolveSessionTarget,
110
110
  resolveScope
111
111
  };
112
- //# sourceMappingURL=chunk-EVW4SYOF.js.map
112
+ //# sourceMappingURL=chunk-AQVVGIQI.js.map
@@ -9,7 +9,7 @@ import {
9
9
  import {
10
10
  DEFAULT_MEMORY_INDEX_PRIVACY,
11
11
  normalizeSession
12
- } from "./chunk-JCIF7VFN.js";
12
+ } from "./chunk-HXAEON2E.js";
13
13
 
14
14
  // src/memory/index.ts
15
15
  import crypto2 from "node:crypto";
@@ -612,15 +612,19 @@ var bm25Score = (shards, terms, filters, candidateLimit = Number.MAX_SAFE_INTEGE
612
612
  for (let index = 0; index < matching.length; index += 1) {
613
613
  const item = matching[index];
614
614
  let score = 0;
615
+ let matchedTerms = 0;
615
616
  for (const term of queryTerms) {
616
617
  const tf = item.counts.get(term) ?? 0;
617
618
  if (tf === 0) continue;
619
+ matchedTerms += 1;
618
620
  const df = documentFrequency.get(term) ?? 0;
619
621
  const idf = Math.log((matching.length - df + 0.5) / (df + 0.5) + 1);
620
622
  const normalized = tf * (K + 1) / (tf + K * (1 - B + B * (lengths[index] / averageLength)));
621
623
  score += idf * normalized;
622
624
  }
623
- if (score > 0) results.push({ entry: item.entry, sessionMtime: item.mtime, score });
625
+ if (score > 0) {
626
+ results.push({ entry: item.entry, sessionMtime: item.mtime, score, matchedTerms });
627
+ }
624
628
  }
625
629
  results.sort((left, right) => {
626
630
  if (right.score !== left.score) return right.score - left.score;
@@ -803,10 +807,7 @@ var filteredEntryCount = (shards, filters) => {
803
807
  };
804
808
  var collectTermMatches = (shards, terms, filters, maxEntries, match) => {
805
809
  const scored = bm25Score(shards, terms, filters, maxEntries);
806
- const selected = match === "all" ? scored.filter((item) => {
807
- const counts = lexicalTermCounts(item.entry.text);
808
- return terms.every((term) => (counts.get(term) ?? 0) > 0);
809
- }) : scored;
810
+ const selected = match === "all" ? scored.filter((item) => item.matchedTerms === terms.length) : scored;
810
811
  return selected.map((item) => ({
811
812
  entry: item.entry,
812
813
  matched: true,
@@ -1225,4 +1226,4 @@ export {
1225
1226
  searchMemoryIndex,
1226
1227
  searchShards
1227
1228
  };
1228
- //# sourceMappingURL=chunk-NUGAZERX.js.map
1229
+ //# sourceMappingURL=chunk-F7ZDTK7B.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/memory/index.ts", "../../src/memory/lineage.ts", "../../src/memory/regex.ts", "../../src/memory/search.ts"],
4
+ "sourcesContent": ["import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { foldSessionDigest, type SessionDigest } from \"./digest.js\";\nimport type { SessionRef } from \"./discovery.js\";\nimport type { LiveSessionBranch, MemoryBranches, SessionLineage } from \"./lineage.js\";\nimport { reconstructSessionLineage } from \"./lineage.js\";\nimport type { NormalizedEntry } from \"./normalize.js\";\nimport { DEFAULT_MEMORY_INDEX_PRIVACY, normalizeSession } from \"./normalize.js\";\nimport { compareLexical, lexicalTermCounts, tokenizeLexical } from \"./tokenize.js\";\n\nexport const MEMORY_CACHE_VERSION = 6;\nexport const DEFAULT_HOT_SESSIONS = 50;\nconst DEFAULT_MAX_COLD_VOCABULARY_BYTES = 512 * 1024;\nconst DEFAULT_MAX_COLD_CACHE_BYTES = 1024 * 1024;\nconst DEFAULT_MAX_SYNC_SESSIONS = 10_000;\nconst DEFAULT_MAX_SYNC_SOURCE_BYTES = 512 * 1024 * 1024;\nconst DEFAULT_MAX_CACHE_CLEANUP_FILES = 100_000;\n\ntype MemoryTier = \"hot\" | \"cold\";\n\ninterface CacheRecord {\n cacheVersion: typeof MEMORY_CACHE_VERSION;\n kind: \"shard\" | \"digest\";\n mtime: number;\n size: number;\n sourceHash: string;\n branches: MemoryBranches;\n lineageFingerprint: string;\n policy: string;\n cacheBytes: number;\n cacheSourceRatio: number;\n}\n\nexport interface Shard extends CacheRecord {\n kind: \"shard\";\n sessionFile: string;\n sessionId: string;\n entries: NormalizedEntry[];\n totalEntryCount: number;\n indexCoverage: { complete: boolean; reasons: string[] };\n tier?: MemoryTier;\n indexReason?: string;\n}\n\nexport interface DigestShard extends SessionDigest, CacheRecord {\n kind: \"digest\";\n}\n\nexport interface MemoryIndexOptions {\n indexDir: string;\n maxEntryChars: number;\n hotSessions?: number;\n digestTerms?: number;\n maxColdVocabularyBytes?: number;\n maxColdCacheBytes?: number;\n maxSyncSessions?: number;\n maxSyncSourceBytes?: number;\n maxCacheCleanupFiles?: number;\n branches?: MemoryBranches;\n indexThinking?: boolean;\n indexToolOutput?: boolean;\n liveBranchForFile?: (sessionFile: string) => LiveSessionBranch | undefined;\n}\n\nexport interface EntryRange {\n first: number;\n last: number;\n}\n\nconst cacheBaseName = (sessionFile: string): string => {\n const hash = crypto.createHash(\"sha1\").update(sessionFile).digest(\"hex\").slice(0, 16);\n const safeBase = path.basename(sessionFile).replace(/[^a-zA-Z0-9._-]/g, \"_\");\n return `${hash}-${safeBase}`;\n};\n\nconst cacheModeSuffix = (branches: MemoryBranches): string => branches === \"all\" ? \".all\" : \"\";\n\nexport const shardPathForSession = (\n sessionFile: string,\n indexDir: string,\n branches: MemoryBranches = \"active\",\n): string => path.join(indexDir, `${cacheBaseName(sessionFile)}${cacheModeSuffix(branches)}.json`);\n\nexport const digestPathForSession = (\n sessionFile: string,\n indexDir: string,\n branches: MemoryBranches = \"active\",\n): string => path.join(indexDir, `${cacheBaseName(sessionFile)}${cacheModeSuffix(branches)}.digest.json`);\n\nconst policyPrivacy = (options: MemoryIndexOptions): string =>\n `thinking:${options.indexThinking ?? DEFAULT_MEMORY_INDEX_PRIVACY.indexThinking};tool-output:${options.indexToolOutput ?? DEFAULT_MEMORY_INDEX_PRIVACY.indexToolOutput}`;\nconst shardPolicy = (options: MemoryIndexOptions, lineage: SessionLineage): string =>\n `entry:${options.maxEntryChars};branches:${lineage.branches};lineage:${lineage.fingerprint};${policyPrivacy(options)}`;\nconst digestPolicy = (options: MemoryIndexOptions, lineage: SessionLineage): string =>\n `vocab:${options.maxColdVocabularyBytes ?? DEFAULT_MAX_COLD_VOCABULARY_BYTES};cache:${options.maxColdCacheBytes ?? DEFAULT_MAX_COLD_CACHE_BYTES};branches:${lineage.branches};lineage:${lineage.fingerprint};${policyPrivacy(options)}`;\n\nconst resolveLineage = (sessionFile: string, options: MemoryIndexOptions): SessionLineage =>\n reconstructSessionLineage(\n sessionFile,\n options.branches ?? \"active\",\n options.liveBranchForFile?.(sessionFile),\n );\n\nconst normalizationOptions = (options: MemoryIndexOptions, lineage: SessionLineage) => ({\n lineage,\n indexThinking: options.indexThinking ?? DEFAULT_MEMORY_INDEX_PRIVACY.indexThinking,\n indexToolOutput: options.indexToolOutput ?? DEFAULT_MEMORY_INDEX_PRIVACY.indexToolOutput,\n});\n\nconst readShardFile = (\n filePath: string,\n maxBytes = DEFAULT_MAX_SYNC_SOURCE_BYTES,\n): Shard | null => {\n try {\n const stat = fs.statSync(filePath);\n if (!stat.isFile() || stat.size > maxBytes) return null;\n const parsed = JSON.parse(fs.readFileSync(filePath, \"utf8\")) as Shard;\n if (\n parsed.cacheVersion !== MEMORY_CACHE_VERSION ||\n parsed.kind !== \"shard\" ||\n typeof parsed.sessionFile !== \"string\" ||\n typeof parsed.sessionId !== \"string\" ||\n typeof parsed.sourceHash !== \"string\" ||\n parsed.sourceHash.length !== 64 ||\n (parsed.branches !== \"active\" && parsed.branches !== \"all\") ||\n typeof parsed.lineageFingerprint !== \"string\" ||\n parsed.lineageFingerprint.length !== 64 ||\n typeof parsed.policy !== \"string\" ||\n typeof parsed.cacheBytes !== \"number\" ||\n parsed.cacheBytes !== stat.size ||\n typeof parsed.cacheSourceRatio !== \"number\" ||\n typeof parsed.totalEntryCount !== \"number\" ||\n typeof parsed.indexCoverage !== \"object\" ||\n parsed.indexCoverage === null ||\n typeof parsed.indexCoverage.complete !== \"boolean\" ||\n !Array.isArray(parsed.indexCoverage.reasons) ||\n !parsed.indexCoverage.reasons.every((reason) => typeof reason === \"string\") ||\n !Array.isArray(parsed.entries) ||\n !parsed.entries.every((entry) =>\n entry !== null &&\n typeof entry === \"object\" &&\n typeof entry.index === \"number\" &&\n typeof entry.sessionFile === \"string\" &&\n typeof entry.text === \"string\")\n ) return null;\n return parsed;\n } catch {\n return null;\n }\n};\n\nconst readDigestFile = (\n filePath: string,\n maxBytes = DEFAULT_MAX_COLD_CACHE_BYTES,\n): DigestShard | null => {\n try {\n const stat = fs.statSync(filePath);\n if (!stat.isFile() || stat.size > maxBytes) return null;\n const parsed = JSON.parse(fs.readFileSync(filePath, \"utf8\")) as DigestShard;\n if (\n parsed.cacheVersion !== MEMORY_CACHE_VERSION ||\n parsed.kind !== \"digest\" ||\n typeof parsed.sessionId !== \"string\" ||\n typeof parsed.file !== \"string\" ||\n typeof parsed.sourceHash !== \"string\" ||\n parsed.sourceHash.length !== 64 ||\n (parsed.branches !== \"active\" && parsed.branches !== \"all\") ||\n typeof parsed.lineageFingerprint !== \"string\" ||\n parsed.lineageFingerprint.length !== 64 ||\n typeof parsed.policy !== \"string\" ||\n typeof parsed.cacheBytes !== \"number\" ||\n parsed.cacheBytes !== stat.size ||\n typeof parsed.cacheSourceRatio !== \"number\" ||\n !Array.isArray(parsed.filesTouched) ||\n !Array.isArray(parsed.vocabulary) ||\n !parsed.vocabulary.every((term, index) =>\n typeof term === \"string\" && (index === 0 || parsed.vocabulary[index - 1]! < term)) ||\n !Array.isArray(parsed.addresses) ||\n !parsed.addresses.every((address) =>\n Array.isArray(address) &&\n address.length === 10 &&\n typeof address[0] === \"number\" &&\n (address[1] === null || typeof address[1] === \"string\") &&\n (address[2] === null || typeof address[2] === \"string\") &&\n (address[3] === null || typeof address[3] === \"string\") &&\n (address[4] === null || typeof address[4] === \"string\") &&\n (address[5] === null || typeof address[5] === \"number\") &&\n (address[6] === null || typeof address[6] === \"string\") &&\n (address[7] === null || typeof address[7] === \"string\") &&\n (address[8] === null || typeof address[8] === \"string\") &&\n (address[9] === null ||\n address[9] === \"succeeded\" ||\n address[9] === \"failed\" ||\n address[9] === \"aborted\" ||\n address[9] === \"timed_out\")) ||\n typeof parsed.indexCoverage !== \"object\" ||\n parsed.indexCoverage === null ||\n typeof parsed.indexCoverage.complete !== \"boolean\" ||\n typeof parsed.indexCoverage.vocabularyBytes !== \"number\" ||\n !Array.isArray(parsed.indexCoverage.reasons) ||\n !parsed.indexCoverage.reasons.every((reason) => typeof reason === \"string\") ||\n typeof parsed.mtime !== \"number\" ||\n typeof parsed.size !== \"number\"\n ) return null;\n return parsed;\n } catch {\n return null;\n }\n};\n\nconst serializedBytes = (value: unknown): number =>\n Buffer.byteLength(JSON.stringify(value), \"utf8\");\n\nconst applyCacheMetrics = <T extends CacheRecord>(value: T): T => {\n let previous = -1;\n for (let iteration = 0; iteration < 5; iteration += 1) {\n const bytes = serializedBytes(value);\n value.cacheBytes = bytes;\n value.cacheSourceRatio = value.size === 0 ? 0 : Number((bytes / value.size).toFixed(6));\n if (bytes === previous) break;\n previous = bytes;\n }\n value.cacheBytes = serializedBytes(value);\n value.cacheSourceRatio = value.size === 0\n ? 0\n : Number((value.cacheBytes / value.size).toFixed(6));\n return value;\n};\n\nconst writeCacheFile = (filePath: string, value: Shard | DigestShard): boolean => {\n try {\n fs.mkdirSync(path.dirname(filePath), { recursive: true, mode: 0o700 });\n try { fs.chmodSync(path.dirname(filePath), 0o700); } catch {}\n fs.writeFileSync(filePath, JSON.stringify(value), { encoding: \"utf8\", mode: 0o600 });\n try { fs.chmodSync(filePath, 0o600); } catch {}\n return true;\n } catch {\n return false;\n }\n};\n\nconst removeCacheFile = (filePath: string): void => {\n try {\n fs.rmSync(filePath, { force: true, recursive: true });\n } catch {\n // Cache cleanup is best effort.\n }\n};\n\nexport interface SourceState {\n mtime: number;\n size: number;\n sourceHash: string;\n}\n\nexport const fingerprintSource = (file: string): SourceState | null => {\n try {\n const content = fs.readFileSync(file);\n const stat = fs.statSync(file);\n if (!stat.isFile()) return null;\n return {\n mtime: stat.mtimeMs,\n size: stat.size,\n sourceHash: crypto.createHash(\"sha256\").update(content).digest(\"hex\"),\n };\n } catch {\n return null;\n }\n};\n\nconst isCacheFresh = (\n cache: CacheRecord | null,\n state: SourceState,\n policy: string,\n): boolean =>\n cache !== null &&\n cache.mtime === state.mtime &&\n cache.size === state.size &&\n cache.sourceHash === state.sourceHash &&\n cache.policy === policy;\n\nconst missingShard = (\n ref: SessionRef,\n lineage: SessionLineage,\n reason = \"source_unavailable\",\n): Shard => ({\n cacheVersion: MEMORY_CACHE_VERSION,\n kind: \"shard\",\n sessionFile: ref.file,\n sessionId: ref.id,\n mtime: 0,\n size: 0,\n sourceHash: \"\",\n branches: lineage.branches,\n lineageFingerprint: lineage.fingerprint,\n policy: reason,\n cacheBytes: 0,\n cacheSourceRatio: 0,\n entries: [],\n totalEntryCount: 0,\n indexCoverage: { complete: false, reasons: [reason] },\n tier: \"hot\",\n indexReason: reason,\n});\n\nexport const loadShard = (ref: SessionRef, options: MemoryIndexOptions): Shard => {\n const lineage = resolveLineage(ref.file, options);\n const filePath = shardPathForSession(ref.file, options.indexDir, lineage.branches);\n const state = fingerprintSource(ref.file);\n if (!state) {\n removeCacheFile(filePath);\n return missingShard(ref, lineage);\n }\n const policy = shardPolicy(options, lineage);\n const cached = readShardFile(\n filePath,\n options.maxSyncSourceBytes ?? DEFAULT_MAX_SYNC_SOURCE_BYTES,\n );\n if (isCacheFresh(cached, state, policy) && cached?.sessionFile === ref.file) return cached;\n if (fs.existsSync(filePath)) removeCacheFile(filePath);\n const { entries, header, indexCoverage } = normalizeSession(\n ref.file,\n options.maxEntryChars,\n normalizationOptions(options, lineage),\n );\n const finalState = fingerprintSource(ref.file);\n const finalLineage = resolveLineage(ref.file, options);\n if (\n !finalState ||\n finalState.sourceHash !== state.sourceHash ||\n finalLineage.fingerprint !== lineage.fingerprint\n ) {\n removeCacheFile(filePath);\n return missingShard(\n ref,\n finalLineage,\n finalState?.sourceHash === state.sourceHash\n ? \"lineage_changed_during_index\"\n : \"source_changed_during_index\",\n );\n }\n const shard = applyCacheMetrics<Shard>({\n cacheVersion: MEMORY_CACHE_VERSION,\n kind: \"shard\",\n sessionFile: ref.file,\n sessionId: header?.sessionId ?? ref.id,\n ...state,\n branches: lineage.branches,\n lineageFingerprint: lineage.fingerprint,\n policy,\n cacheBytes: 0,\n cacheSourceRatio: 0,\n entries,\n totalEntryCount: entries.length,\n indexCoverage,\n tier: \"hot\",\n });\n writeCacheFile(filePath, shard);\n return shard;\n};\n\nconst hydrateShard = (\n ref: SessionRef,\n options: MemoryIndexOptions,\n entryRange?: EntryRange,\n): Shard => {\n const lineage = resolveLineage(ref.file, options);\n const state = fingerprintSource(ref.file);\n if (!state) return { ...missingShard(ref, lineage), tier: \"cold\" };\n const { entries, header, indexCoverage } = normalizeSession(\n ref.file,\n options.maxEntryChars,\n normalizationOptions(options, lineage),\n );\n const finalState = fingerprintSource(ref.file);\n const finalLineage = resolveLineage(ref.file, options);\n if (\n !finalState ||\n finalState.sourceHash !== state.sourceHash ||\n finalLineage.fingerprint !== lineage.fingerprint\n ) {\n return {\n ...missingShard(\n ref,\n finalLineage,\n finalState?.sourceHash === state.sourceHash\n ? \"lineage_changed_during_index\"\n : \"source_changed_during_index\",\n ),\n tier: \"cold\",\n };\n }\n const selected = entryRange\n ? entries.filter((entry) => entry.index >= entryRange.first && entry.index <= entryRange.last)\n : entries;\n return {\n cacheVersion: MEMORY_CACHE_VERSION,\n kind: \"shard\",\n sessionFile: ref.file,\n sessionId: header?.sessionId ?? ref.id,\n ...state,\n branches: lineage.branches,\n lineageFingerprint: lineage.fingerprint,\n policy: shardPolicy(options, lineage),\n cacheBytes: 0,\n cacheSourceRatio: 0,\n entries: selected,\n totalEntryCount: entries.length,\n indexCoverage,\n tier: \"cold\",\n };\n};\n\nconst missingDigest = (\n ref: SessionRef,\n lineage: SessionLineage,\n reason = \"source_unavailable\",\n): DigestShard => ({\n cacheVersion: MEMORY_CACHE_VERSION,\n kind: \"digest\",\n sessionId: ref.id,\n file: ref.file,\n cwd: ref.cwd,\n firstTs: null,\n lastTs: null,\n entryCount: 0,\n filesTouched: [],\n toolHistogram: {},\n errorCount: 0,\n vocabulary: [],\n addresses: [],\n indexCoverage: { complete: false, vocabularyBytes: 2, reasons: [reason] },\n mtime: 0,\n size: 0,\n sourceHash: \"\",\n branches: lineage.branches,\n lineageFingerprint: lineage.fingerprint,\n policy: reason,\n cacheBytes: 0,\n cacheSourceRatio: 0,\n});\n\nconst maxFittingPrefix = <T>(\n values: T[],\n fits: (candidate: T[]) => boolean,\n): T[] => {\n let low = 0;\n let high = values.length;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n if (fits(values.slice(0, middle))) low = middle;\n else high = middle - 1;\n }\n return values.slice(0, low);\n};\n\nconst fitDigestCache = (digest: DigestShard, maxBytes: number): DigestShard => {\n applyCacheMetrics(digest);\n if (digest.cacheBytes <= maxBytes) return digest;\n\n digest.indexCoverage.complete = false;\n if (!digest.indexCoverage.reasons.includes(\"max_cold_cache_bytes\")) {\n digest.indexCoverage.reasons.push(\"max_cold_cache_bytes\");\n }\n digest.addresses = maxFittingPrefix(digest.addresses, (addresses) => {\n digest.addresses = addresses;\n applyCacheMetrics(digest);\n return digest.cacheBytes <= maxBytes;\n });\n applyCacheMetrics(digest);\n if (digest.cacheBytes <= maxBytes) return digest;\n\n digest.vocabulary = maxFittingPrefix(digest.vocabulary, (vocabulary) => {\n digest.vocabulary = vocabulary;\n digest.indexCoverage.vocabularyBytes = serializedBytes(vocabulary);\n applyCacheMetrics(digest);\n return digest.cacheBytes <= maxBytes;\n });\n digest.indexCoverage.vocabularyBytes = serializedBytes(digest.vocabulary);\n return applyCacheMetrics(digest);\n};\n\nexport const loadDigest = (ref: SessionRef, options: MemoryIndexOptions): DigestShard => {\n const lineage = resolveLineage(ref.file, options);\n const filePath = digestPathForSession(ref.file, options.indexDir, lineage.branches);\n const state = fingerprintSource(ref.file);\n if (!state) {\n removeCacheFile(filePath);\n return missingDigest(ref, lineage);\n }\n const policy = digestPolicy(options, lineage);\n const maxCacheBytes = options.maxColdCacheBytes ?? DEFAULT_MAX_COLD_CACHE_BYTES;\n const cached = readDigestFile(filePath, maxCacheBytes);\n if (\n isCacheFresh(cached, state, policy) &&\n cached?.file === ref.file &&\n serializedBytes(cached) <= maxCacheBytes\n ) return cached;\n if (fs.existsSync(filePath)) removeCacheFile(filePath);\n\n const { entries, header, indexCoverage } = normalizeSession(\n ref.file,\n Number.MAX_SAFE_INTEGER,\n normalizationOptions(options, lineage),\n );\n const finalState = fingerprintSource(ref.file);\n const finalLineage = resolveLineage(ref.file, options);\n if (\n !finalState ||\n finalState.sourceHash !== state.sourceHash ||\n finalLineage.fingerprint !== lineage.fingerprint\n ) {\n removeCacheFile(filePath);\n return missingDigest(\n ref,\n finalLineage,\n finalState?.sourceHash === state.sourceHash\n ? \"lineage_changed_during_index\"\n : \"source_changed_during_index\",\n );\n }\n const digest = foldSessionDigest({\n sessionId: header?.sessionId ?? ref.id,\n file: ref.file,\n cwd: header?.cwd ?? ref.cwd,\n entries,\n maxVocabularyBytes:\n options.maxColdVocabularyBytes ?? DEFAULT_MAX_COLD_VOCABULARY_BYTES,\n normalizationCoverage: indexCoverage,\n });\n const persisted = fitDigestCache({\n cacheVersion: MEMORY_CACHE_VERSION,\n kind: \"digest\",\n ...digest,\n ...state,\n branches: lineage.branches,\n lineageFingerprint: lineage.fingerprint,\n policy,\n cacheBytes: 0,\n cacheSourceRatio: 0,\n }, maxCacheBytes);\n if (persisted.cacheBytes <= maxCacheBytes) writeCacheFile(filePath, persisted);\n return persisted;\n};\n\nconst compareRefsByRecency = (left: SessionRef, right: SessionRef): number => {\n if (right.mtime !== left.mtime) return right.mtime - left.mtime;\n return compareLexical(left.file, right.file);\n};\n\nconst classifySessionTiers = (\n refs: SessionRef[],\n hotSessions = DEFAULT_HOT_SESSIONS,\n): Map<string, MemoryTier> => {\n const sorted = [...refs].sort(compareRefsByRecency);\n const hot = new Set(sorted.slice(0, Math.max(0, Math.floor(hotSessions))).map((ref) => ref.file));\n return new Map(sorted.map((ref) => [ref.file, hot.has(ref.file) ? \"hot\" : \"cold\"]));\n};\n\nexport interface MemoryCoverage {\n complete: boolean;\n indexedSessions: number;\n eligibleSessions: number;\n staleSessions: number;\n incompleteSessions: number;\n reasons: string[];\n}\n\nexport interface TieredIndexBundle {\n shards: Shard[];\n digests: DigestShard[];\n refs: SessionRef[];\n tiers: Map<string, MemoryTier>;\n coverage: MemoryCoverage;\n}\n\nconst cleanupCacheDirectory = (\n indexDir: string,\n branchesToClean: MemoryBranches,\n maxFiles: number,\n maxBytes: number,\n): { complete: boolean; reasons: string[] } => {\n let directory: fs.Dir;\n try {\n directory = fs.opendirSync(indexDir);\n } catch {\n return { complete: true, reasons: [] };\n }\n let inspected = 0;\n let inspectedBytes = 0;\n try {\n while (true) {\n const entry = directory.readSync();\n if (!entry) return { complete: true, reasons: [] };\n if (!entry.name.endsWith(\".json\")) continue;\n if (inspected >= maxFiles) {\n return { complete: false, reasons: [\"cache_cleanup_budget\"] };\n }\n inspected += 1;\n const cacheFile = path.join(indexDir, entry.name);\n if (!entry.isFile()) {\n removeCacheFile(cacheFile);\n continue;\n }\n let cacheBytes: number;\n try {\n cacheBytes = fs.statSync(cacheFile).size;\n } catch {\n removeCacheFile(cacheFile);\n continue;\n }\n if (inspectedBytes + cacheBytes > maxBytes) {\n return { complete: false, reasons: [\"cache_cleanup_budget\"] };\n }\n inspectedBytes += cacheBytes;\n try {\n const parsed = JSON.parse(fs.readFileSync(cacheFile, \"utf8\")) as Record<string, unknown>;\n const kind = parsed.kind;\n const source = kind === \"shard\" && typeof parsed.sessionFile === \"string\"\n ? parsed.sessionFile\n : kind === \"digest\" && typeof parsed.file === \"string\" ? parsed.file : null;\n const branches = parsed.branches === \"active\" || parsed.branches === \"all\"\n ? parsed.branches\n : null;\n if (branches !== null && branches !== branchesToClean) continue;\n const expected = source && branches && kind === \"shard\"\n ? shardPathForSession(source, indexDir, branches)\n : source && branches && kind === \"digest\"\n ? digestPathForSession(source, indexDir, branches)\n : null;\n const structurallyValid = kind === \"shard\"\n ? readShardFile(cacheFile, cacheBytes) !== null\n : kind === \"digest\" ? readDigestFile(cacheFile, cacheBytes) !== null : false;\n if (\n parsed.cacheVersion !== MEMORY_CACHE_VERSION ||\n source === null ||\n expected !== cacheFile ||\n !fs.existsSync(source) ||\n !structurallyValid\n ) removeCacheFile(cacheFile);\n } catch {\n removeCacheFile(cacheFile);\n }\n }\n } finally {\n directory.closeSync();\n }\n};\n\nconst sourceSize = (file: string): number | null => {\n try {\n const stat = fs.statSync(file);\n return stat.isFile() ? stat.size : null;\n } catch {\n return null;\n }\n};\n\nexport const loadTieredIndex = (\n refs: SessionRef[],\n allRefs: SessionRef[],\n options: MemoryIndexOptions,\n hydrate = false,\n entryRange?: EntryRange,\n): TieredIndexBundle => {\n const cleanup = cleanupCacheDirectory(\n options.indexDir,\n options.branches ?? \"active\",\n options.maxCacheCleanupFiles ?? DEFAULT_MAX_CACHE_CLEANUP_FILES,\n options.maxSyncSourceBytes ?? DEFAULT_MAX_SYNC_SOURCE_BYTES,\n );\n const tierRefs = allRefs.length > 0 ? allRefs : refs;\n const tiers = classifySessionTiers(tierRefs, options.hotSessions ?? DEFAULT_HOT_SESSIONS);\n const maxSessions = options.maxSyncSessions ?? DEFAULT_MAX_SYNC_SESSIONS;\n const maxSourceBytes = options.maxSyncSourceBytes ?? DEFAULT_MAX_SYNC_SOURCE_BYTES;\n const shards: Shard[] = [];\n const digests: DigestShard[] = [];\n const reasons = new Set(cleanup.reasons);\n let indexedSessions = 0;\n let incompleteSessions = 0;\n let processedSessions = 0;\n let processedSourceBytes = 0;\n\n for (const ref of refs) {\n const size = sourceSize(ref.file);\n if (size === null) {\n reasons.add(\"source_unavailable\");\n continue;\n }\n if (processedSessions >= maxSessions) {\n reasons.add(\"max_sync_sessions\");\n continue;\n }\n const tier = tiers.get(ref.file) ?? \"cold\";\n const sourceWorkBytes = size * (hydrate && tier === \"cold\" ? 6 : 3);\n if (processedSourceBytes + sourceWorkBytes > maxSourceBytes) {\n reasons.add(\"max_sync_source_bytes\");\n continue;\n }\n processedSessions += 1;\n processedSourceBytes += sourceWorkBytes;\n try {\n if (hydrate) {\n if (tier === \"cold\") loadDigest(ref, options);\n const shard = hydrateShard(ref, options, entryRange);\n shards.push(shard);\n if (shard.sourceHash) indexedSessions += 1;\n else reasons.add(shard.indexReason ?? \"source_unavailable\");\n if (shard.sourceHash && !shard.indexCoverage.complete) {\n incompleteSessions += 1;\n for (const reason of shard.indexCoverage.reasons) reasons.add(reason);\n }\n } else if (tier === \"hot\") {\n const shard = loadShard(ref, options);\n removeCacheFile(digestPathForSession(\n ref.file,\n options.indexDir,\n options.branches ?? \"active\",\n ));\n shards.push(shard);\n if (shard.sourceHash) indexedSessions += 1;\n else reasons.add(shard.indexReason ?? \"source_unavailable\");\n if (shard.sourceHash && !shard.indexCoverage.complete) {\n incompleteSessions += 1;\n for (const reason of shard.indexCoverage.reasons) reasons.add(reason);\n }\n } else {\n const digest = loadDigest(ref, options);\n removeCacheFile(shardPathForSession(\n ref.file,\n options.indexDir,\n options.branches ?? \"active\",\n ));\n digests.push(digest);\n if (digest.sourceHash) indexedSessions += 1;\n if (!digest.indexCoverage.complete) {\n incompleteSessions += 1;\n for (const reason of digest.indexCoverage.reasons) reasons.add(reason);\n }\n }\n } catch {\n reasons.add(\"index_error\");\n }\n }\n\n const eligibleSessions = refs.length;\n const staleSessions = eligibleSessions - indexedSessions;\n return {\n shards,\n digests,\n refs,\n tiers,\n coverage: {\n complete: cleanup.complete && staleSessions === 0 && incompleteSessions === 0,\n indexedSessions,\n eligibleSessions,\n staleSessions,\n incompleteSessions,\n reasons: [...reasons].sort(compareLexical),\n },\n };\n};\n\nexport interface SearchFilters {\n role?: string;\n tool?: string;\n ref?: string;\n provider?: string;\n action?: string;\n outcome?: NonNullable<NormalizedEntry[\"outcome\"]>;\n since?: number;\n until?: number;\n}\n\nconst matchesFilters = (entry: NormalizedEntry, filters: SearchFilters): boolean => {\n if (filters.role !== undefined && entry.role !== filters.role) return false;\n if (filters.tool !== undefined && entry.toolName !== filters.tool) return false;\n if (filters.ref !== undefined && entry.ref !== filters.ref) return false;\n if (filters.provider !== undefined && entry.provider !== filters.provider) return false;\n if (filters.action !== undefined && entry.action !== filters.action) return false;\n if (filters.outcome !== undefined && entry.outcome !== filters.outcome) return false;\n if (filters.since !== undefined && entry.timestamp !== null && entry.timestamp < filters.since) return false;\n if (filters.until !== undefined && entry.timestamp !== null && entry.timestamp > filters.until) return false;\n return true;\n};\n\nexport interface IndexedEntry {\n entry: NormalizedEntry;\n sessionMtime: number;\n}\n\nexport interface ScoredEntry extends IndexedEntry {\n score: number;\n matchedTerms: number;\n}\n\nexport interface ShardBundle {\n shards: Shard[];\n refs: SessionRef[];\n}\n\nexport const loadShards = (refs: SessionRef[], options: MemoryIndexOptions): ShardBundle => ({\n shards: refs.map((ref) => loadShard(ref, options)),\n refs,\n});\n\nexport const bm25Score = (\n shards: Shard[],\n terms: string[],\n filters: SearchFilters,\n candidateLimit = Number.MAX_SAFE_INTEGER,\n): ScoredEntry[] => {\n const queryTerms = [...new Set(terms.flatMap((term) => tokenizeLexical(term)))];\n const matching: { entry: NormalizedEntry; mtime: number; counts: Map<string, number> }[] = [];\n for (const shard of shards) {\n for (const entry of shard.entries) {\n if (matchesFilters(entry, filters) && matching.length < candidateLimit) {\n matching.push({ entry, mtime: shard.mtime, counts: lexicalTermCounts(entry.text) });\n }\n }\n }\n if (matching.length === 0 || queryTerms.length === 0) return [];\n\n const lengths = matching.map((item) => Math.max(1, [...item.counts.values()].reduce((a, b) => a + b, 0)));\n const averageLength = lengths.reduce((sum, length) => sum + length, 0) / matching.length;\n const documentFrequency = new Map<string, number>();\n for (const item of matching) {\n for (const term of queryTerms) {\n if ((item.counts.get(term) ?? 0) > 0) {\n documentFrequency.set(term, (documentFrequency.get(term) ?? 0) + 1);\n }\n }\n }\n\n const K = 1.2;\n const B = 0.75;\n const results: ScoredEntry[] = [];\n for (let index = 0; index < matching.length; index += 1) {\n const item = matching[index]!;\n let score = 0;\n let matchedTerms = 0;\n for (const term of queryTerms) {\n const tf = item.counts.get(term) ?? 0;\n if (tf === 0) continue;\n matchedTerms += 1;\n const df = documentFrequency.get(term) ?? 0;\n const idf = Math.log((matching.length - df + 0.5) / (df + 0.5) + 1);\n const normalized = (tf * (K + 1)) /\n (tf + K * (1 - B + B * (lengths[index]! / averageLength)));\n score += idf * normalized;\n }\n if (score > 0) {\n results.push({ entry: item.entry, sessionMtime: item.mtime, score, matchedTerms });\n }\n }\n\n results.sort((left, right) => {\n if (right.score !== left.score) return right.score - left.score;\n if (right.sessionMtime !== left.sessionMtime) return right.sessionMtime - left.sessionMtime;\n if (left.entry.index !== right.entry.index) return left.entry.index - right.entry.index;\n return compareLexical(left.entry.sessionFile, right.entry.sessionFile);\n });\n return results;\n};\n\nexport const recentEntries = (\n shards: Shard[],\n filters: SearchFilters,\n limit: number,\n): IndexedEntry[] => {\n const all: IndexedEntry[] = [];\n for (const shard of shards) {\n for (const entry of shard.entries) {\n if (matchesFilters(entry, filters)) all.push({ entry, sessionMtime: shard.mtime });\n }\n }\n all.sort((left, right) => {\n if (right.sessionMtime !== left.sessionMtime) return right.sessionMtime - left.sessionMtime;\n if (left.entry.index !== right.entry.index) return left.entry.index - right.entry.index;\n return compareLexical(left.entry.sessionFile, right.entry.sessionFile);\n });\n return all.slice(0, Math.max(0, limit));\n};\n", "import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\n\nexport type MemoryBranches = \"active\" | \"all\";\n\nexport interface LiveSessionBranch {\n entries: readonly unknown[];\n leafId: string | null;\n}\n\nexport interface SessionLineage {\n branches: MemoryBranches;\n leafId: string | null;\n entryOrdinals: ReadonlySet<number> | null;\n fingerprint: string;\n coverageReasons: string[];\n}\n\ninterface PersistedNode {\n id: string;\n parentId: string | null;\n ordinal: number;\n}\n\nconst fingerprint = (branches: MemoryBranches, leafId: string | null, ids: string[]): string =>\n crypto.createHash(\"sha256\").update(JSON.stringify({ branches, leafId, ids })).digest(\"hex\");\n\nconst readPersistedNodes = (sessionFile: string): PersistedNode[] => {\n let content: string;\n try {\n content = fs.readFileSync(sessionFile, \"utf8\");\n } catch {\n return [];\n }\n const nodes: PersistedNode[] = [];\n let ordinal = 0;\n for (const line of content.split(\"\\n\")) {\n if (!line.trim()) continue;\n let raw: Record<string, unknown>;\n try {\n raw = JSON.parse(line) as Record<string, unknown>;\n } catch {\n continue;\n }\n if (raw.type === \"session\") continue;\n if (typeof raw.id === \"string\" && (raw.parentId === null || typeof raw.parentId === \"string\")) {\n nodes.push({ id: raw.id, parentId: raw.parentId, ordinal });\n }\n ordinal += 1;\n }\n return nodes;\n};\n\nconst allLineage = (): SessionLineage => ({\n branches: \"all\",\n leafId: null,\n entryOrdinals: null,\n fingerprint: fingerprint(\"all\", null, []),\n coverageReasons: [],\n});\n\n/**\n * Reconstruct Pi 0.80.6's persisted leaf semantics without treating append\n * order as a transcript: the final persisted entry is the leaf, duplicate IDs\n * resolve to their last record in the ID map, and parent links are walked to a\n * root. Cycles are stopped defensively and reported as incomplete coverage.\n */\nexport const reconstructSessionLineage = (\n sessionFile: string,\n branches: MemoryBranches,\n liveBranch?: LiveSessionBranch,\n): SessionLineage => {\n if (branches === \"all\") return allLineage();\n\n const nodes = readPersistedNodes(sessionFile);\n const byId = new Map(nodes.map((node) => [node.id, node]));\n const liveIds = liveBranch?.entries.flatMap((entry) => {\n if (entry === null || typeof entry !== \"object\" || Array.isArray(entry)) return [];\n const id = (entry as Record<string, unknown>).id;\n return typeof id === \"string\" ? [id] : [];\n });\n const leafId = liveBranch ? liveBranch.leafId : (nodes[nodes.length - 1]?.id ?? null);\n const path: PersistedNode[] = [];\n const reasons = new Set<string>();\n\n if (liveIds) {\n for (const id of liveIds) {\n const node = byId.get(id);\n if (node) path.push(node);\n }\n } else {\n const seen = new Set<string>();\n let current = leafId ? byId.get(leafId) : undefined;\n while (current) {\n if (seen.has(current.id)) {\n reasons.add(\"invalid_parent_graph\");\n break;\n }\n seen.add(current.id);\n path.push(current);\n current = current.parentId ? byId.get(current.parentId) : undefined;\n }\n path.reverse();\n }\n\n const ids = liveIds ?? path.map((node) => node.id);\n return {\n branches: \"active\",\n leafId,\n entryOrdinals: new Set(path.map((node) => node.ordinal)),\n fingerprint: fingerprint(\"active\", leafId, ids),\n coverageReasons: [...reasons].sort(),\n };\n};\n", "import { Worker } from \"node:worker_threads\";\n\nexport interface RegexLimits {\n maxPatternBytes: number;\n timeoutMs: number;\n}\n\nexport interface RegexExecutionError {\n code: \"invalid_regex\" | \"regex_pattern_too_large\" | \"regex_timeout\" | \"regex_worker_error\";\n message: string;\n}\n\nexport type RegexExecutionResult =\n | { complete: true; matched: number[] }\n | { complete: false; matched: []; error: RegexExecutionError };\n\nconst WORKER_SOURCE = String.raw`\nconst { parentPort } = require(\"node:worker_threads\");\nparentPort.on(\"message\", ({ pattern, haystacks }) => {\n try {\n const regex = new RegExp(pattern, \"iu\");\n const matched = [];\n for (let index = 0; index < haystacks.length; index += 1) {\n if (regex.test(haystacks[index])) matched.push(index);\n }\n parentPort.postMessage({ matched });\n } catch (error) {\n parentPort.postMessage({\n error: {\n code: \"invalid_regex\",\n message: error instanceof Error ? error.message : String(error),\n },\n });\n }\n});\n`;\n\n/** Execute untrusted regex in a disposable worker that can be forcibly terminated. */\nexport const executeBoundedRegex = async (\n pattern: string,\n haystacks: string[],\n limits: RegexLimits,\n): Promise<RegexExecutionResult> => {\n const patternBytes = Buffer.byteLength(pattern, \"utf8\");\n if (patternBytes > limits.maxPatternBytes) {\n return {\n complete: false,\n matched: [],\n error: {\n code: \"regex_pattern_too_large\",\n message: `Regex pattern is ${patternBytes} bytes; limit is ${limits.maxPatternBytes}.`,\n },\n };\n }\n\n return new Promise((resolve) => {\n let worker: Worker;\n try {\n worker = new Worker(WORKER_SOURCE, {\n eval: true,\n resourceLimits: { maxOldGenerationSizeMb: 16, maxYoungGenerationSizeMb: 4 },\n });\n } catch (error) {\n resolve({\n complete: false,\n matched: [],\n error: {\n code: \"regex_worker_error\",\n message: error instanceof Error ? error.message : String(error),\n },\n });\n return;\n }\n let settled = false;\n const finish = (result: RegexExecutionResult): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n void worker.terminate();\n resolve(result);\n };\n const timer = setTimeout(() => {\n finish({\n complete: false,\n matched: [],\n error: {\n code: \"regex_timeout\",\n message: `Regex execution exceeded ${limits.timeoutMs} ms.`,\n },\n });\n }, limits.timeoutMs);\n worker.once(\"message\", (message: unknown) => {\n const record = message as { matched?: unknown; error?: RegexExecutionError };\n if (record.error) {\n finish({ complete: false, matched: [], error: record.error });\n return;\n }\n if (Array.isArray(record.matched) && record.matched.every((value) => Number.isInteger(value))) {\n finish({ complete: true, matched: record.matched as number[] });\n return;\n }\n finish({\n complete: false,\n matched: [],\n error: { code: \"regex_worker_error\", message: \"Regex worker returned an invalid result.\" },\n });\n });\n worker.once(\"error\", (error: unknown) => {\n finish({\n complete: false,\n matched: [],\n error: {\n code: \"regex_worker_error\",\n message: error instanceof Error ? error.message : String(error),\n },\n });\n });\n worker.postMessage({ pattern, haystacks });\n });\n};\n", "import type { DigestEntryAddress } from \"./digest.js\";\nimport type { MemoryBranches } from \"./lineage.js\";\nimport type { NormalizedEntry } from \"./normalize.js\";\nimport type { DigestShard, SearchFilters, Shard } from \"./index.js\";\nimport { bm25Score, recentEntries, type ScoredEntry } from \"./index.js\";\nimport { executeBoundedRegex, type RegexExecutionError } from \"./regex.js\";\nimport {\n compareLexical,\n normalizeMemoryPhrase,\n planMemoryQuery,\n type MemoryQueryMatch,\n type MemoryQueryMode,\n} from \"./tokenize.js\";\n\nexport const DEFAULT_REGEX_MAX_PATTERN_BYTES = 1_024;\nexport const DEFAULT_REGEX_MAX_HAYSTACK_TERMS = 20_000;\nexport const DEFAULT_REGEX_MAX_HAYSTACK_BYTES = 2 * 1024 * 1024;\nexport const DEFAULT_REGEX_TIMEOUT_MS = 250;\nconst DEFAULT_SEARCH_MAX_CANDIDATE_ENTRIES = 50_000;\nconst DEFAULT_SEARCH_MAX_CANDIDATE_DIGESTS = 10_000;\nconst DEFAULT_SEARCH_MAX_CANDIDATE_ITEMS = 10_000;\n\nexport interface SearchQuery {\n query?: string;\n queryMode?: MemoryQueryMode;\n queryMatch?: MemoryQueryMatch;\n filters?: SearchFilters;\n limit?: number;\n candidateLimits?: {\n maxEntries: number;\n maxDigests: number;\n maxItems: number;\n };\n regexLimits?: {\n maxPatternBytes: number;\n maxHaystackTerms: number;\n maxHaystackBytes: number;\n timeoutMs: number;\n };\n}\n\nexport interface SearchSegmentEntry {\n entry: NormalizedEntry;\n matched: boolean;\n marker: \">\" | \" \";\n score: number;\n}\n\ninterface ExactEntryAddress {\n index: number;\n entryId: string | null;\n operationAddress: string | null;\n}\n\nexport interface SearchSegment {\n sessionId: string;\n sessionFile: string;\n sourceHash: string;\n branches: MemoryBranches;\n lineageFingerprint: string;\n sessionMtime: number;\n range: string;\n entryRange: { first: number; last: number };\n entries: SearchSegmentEntry[];\n exactMatches: ExactEntryAddress[];\n matchedCount: number;\n score: number;\n tier: \"hot\" | \"cold\";\n}\n\nexport interface DigestHit {\n sessionId: string;\n sessionFile: string;\n sourceHash: string;\n branches: MemoryBranches;\n lineageFingerprint: string;\n cwd: string;\n lastTs: number | null;\n sessionMtime: number;\n score: number;\n tier: \"cold\";\n matchedTerms: number;\n matchedStructuralEntries: number;\n}\n\ntype SearchItem =\n | { kind: \"entry\"; segment: SearchSegment }\n | { kind: \"digest\"; digest: DigestHit };\n\ninterface QueryCoverage {\n complete: boolean;\n reasons: string[];\n error?: RegexExecutionError;\n}\n\ntype MemoryMatchMode = \"browse\" | \"lexical\" | \"phrase\" | \"regex\" | \"structural\" | \"combined\";\n\nexport interface SearchResult {\n matchMode: MemoryMatchMode;\n matchedCount: number;\n totalMatches: number;\n totalItems: number;\n segmentCount: number;\n segments: SearchSegment[];\n digestHits: DigestHit[];\n items: SearchItem[];\n queryCoverage: QueryCoverage;\n}\n\nconst segmentStartRoles = new Set([\"user\", \"bashExecution\", \"compaction\"]);\n\nconst matchesFilters = (entry: NormalizedEntry, filters: SearchFilters): boolean => {\n if (filters.role !== undefined && entry.role !== filters.role) return false;\n if (filters.tool !== undefined && entry.toolName !== filters.tool) return false;\n if (filters.ref !== undefined && entry.ref !== filters.ref) return false;\n if (filters.provider !== undefined && entry.provider !== filters.provider) return false;\n if (filters.action !== undefined && entry.action !== filters.action) return false;\n if (filters.outcome !== undefined && entry.outcome !== filters.outcome) return false;\n if (filters.since !== undefined && entry.timestamp !== null && entry.timestamp < filters.since) return false;\n if (filters.until !== undefined && entry.timestamp !== null && entry.timestamp > filters.until) return false;\n return true;\n};\n\nconst addressMatchesFilters = (address: DigestEntryAddress, filters: SearchFilters): boolean => {\n if (filters.role !== undefined && address[3] !== filters.role) return false;\n if (filters.tool !== undefined && address[4] !== filters.tool) return false;\n if (filters.ref !== undefined && address[6] !== filters.ref) return false;\n if (filters.provider !== undefined && address[7] !== filters.provider) return false;\n if (filters.action !== undefined && address[8] !== filters.action) return false;\n if (filters.outcome !== undefined && address[9] !== filters.outcome) return false;\n if (filters.since !== undefined && address[5] !== null && address[5] < filters.since) return false;\n if (filters.until !== undefined && address[5] !== null && address[5] > filters.until) return false;\n return true;\n};\n\nconst hasFilters = (filters: SearchFilters): boolean => Object.keys(filters).length > 0;\n\nconst lexicalProvenanceWeight = (entry: NormalizedEntry, filters: SearchFilters): number => {\n if (\n filters.tool !== undefined ||\n filters.ref !== undefined ||\n filters.provider !== undefined ||\n filters.action !== undefined ||\n filters.outcome !== undefined\n ) return 1;\n if (entry.toolName === null && entry.role === \"assistant\") return 2.5;\n if (entry.toolName === null && entry.role === \"user\") return 2.25;\n if (entry.toolName === null && (entry.role === \"compactionSummary\" || entry.role === \"custom\")) return 1.5;\n if (entry.role === \"toolResult\" || entry.role === \"fabricOperation\") return 0.75;\n if (entry.toolName !== null) return 0.7;\n return 1;\n};\n\ninterface LocatedEntry {\n entry: NormalizedEntry;\n matched: boolean;\n sessionMtime: number;\n score: number;\n}\n\nconst sortLocated = (located: LocatedEntry[]): void => {\n located.sort((left, right) => {\n if (right.score !== left.score) return right.score - left.score;\n if (right.sessionMtime !== left.sessionMtime) return right.sessionMtime - left.sessionMtime;\n if (left.entry.index !== right.entry.index) return left.entry.index - right.entry.index;\n return compareLexical(left.entry.sessionFile, right.entry.sessionFile);\n });\n};\n\nconst filteredEntryCount = (shards: Shard[], filters: SearchFilters): number => {\n let count = 0;\n for (const shard of shards) {\n for (const entry of shard.entries) if (matchesFilters(entry, filters)) count += 1;\n }\n return count;\n};\n\nconst collectTermMatches = (\n shards: Shard[],\n terms: string[],\n filters: SearchFilters,\n maxEntries: number,\n match: MemoryQueryMatch,\n): LocatedEntry[] => {\n const scored: ScoredEntry[] = bm25Score(shards, terms, filters, maxEntries);\n const selected = match === \"all\"\n ? scored.filter((item) => item.matchedTerms === terms.length)\n : scored;\n return selected.map((item) => ({\n entry: item.entry,\n matched: true,\n sessionMtime: item.sessionMtime,\n score: item.score * lexicalProvenanceWeight(item.entry, filters),\n }));\n};\n\nconst collectPhraseMatches = (\n shards: Shard[],\n phrase: string,\n filters: SearchFilters,\n maxEntries: number,\n): LocatedEntry[] => {\n const located: LocatedEntry[] = [];\n let inspected = 0;\n outer: for (const shard of shards) {\n for (const entry of shard.entries) {\n if (!matchesFilters(entry, filters)) continue;\n if (inspected >= maxEntries) break outer;\n inspected += 1;\n if (!normalizeMemoryPhrase(entry.text).includes(phrase)) continue;\n located.push({\n entry,\n matched: true,\n sessionMtime: shard.mtime,\n score: lexicalProvenanceWeight(entry, filters),\n });\n }\n }\n sortLocated(located);\n return located;\n};\n\nconst collectRecent = (\n shards: Shard[],\n filters: SearchFilters,\n maxEntries: number,\n score = 0,\n): LocatedEntry[] =>\n recentEntries(shards, filters, maxEntries).map((item) => ({\n entry: item.entry,\n matched: true,\n sessionMtime: item.sessionMtime,\n score,\n }));\n\nconst digestStructuralMatchCount = (digest: DigestShard, filters: SearchFilters): number =>\n hasFilters(filters)\n ? digest.addresses.filter((address) => addressMatchesFilters(address, filters)).length\n : 0;\n\nconst digestCanMatchFilters = (digest: DigestShard, filters: SearchFilters): boolean =>\n !hasFilters(filters) || digestStructuralMatchCount(digest, filters) > 0;\n\nconst toDigestHit = (\n digest: DigestShard,\n score: number,\n matchedTerms: number,\n matchedStructuralEntries = 0,\n): DigestHit => ({\n sessionId: digest.sessionId,\n sessionFile: digest.file,\n sourceHash: digest.sourceHash,\n branches: digest.branches,\n lineageFingerprint: digest.lineageFingerprint,\n cwd: digest.cwd,\n lastTs: digest.lastTs,\n sessionMtime: digest.mtime,\n score,\n tier: \"cold\",\n matchedTerms,\n matchedStructuralEntries,\n});\n\nconst scoreDigestTerms = (\n digests: DigestShard[],\n terms: string[],\n filters: SearchFilters,\n maxDigests: number,\n match: MemoryQueryMatch,\n): { hits: DigestHit[]; complete: boolean } => {\n if (digests.length === 0 || terms.length === 0) return { hits: [], complete: true };\n const candidates: Array<{ digest: DigestShard; matches: string[]; structuralMatches: number }> = [];\n let matchingDigests = 0;\n for (const digest of digests) {\n if (!digestCanMatchFilters(digest, filters)) continue;\n const vocabulary = new Set(digest.vocabulary);\n const matches = terms.filter((term) => vocabulary.has(term));\n if (matches.length === 0 || (match === \"all\" && matches.length !== terms.length)) continue;\n matchingDigests += 1;\n if (candidates.length < maxDigests) {\n candidates.push({\n digest,\n matches,\n structuralMatches: digestStructuralMatchCount(digest, filters),\n });\n }\n }\n const documentFrequency = new Map<string, number>();\n for (const candidate of candidates) {\n for (const term of candidate.matches) {\n documentFrequency.set(term, (documentFrequency.get(term) ?? 0) + 1);\n }\n }\n\n const hits = candidates.map((candidate) => {\n const score = candidate.matches.reduce((total, term) => {\n const df = documentFrequency.get(term) ?? 0;\n return total + Math.log((candidates.length - df + 0.5) / (df + 0.5) + 1);\n }, 0);\n return toDigestHit(\n candidate.digest,\n score,\n candidate.matches.length,\n candidate.structuralMatches,\n );\n });\n return { hits, complete: matchingDigests <= maxDigests };\n};\n\ninterface RegexHotTarget {\n kind: \"hot\";\n shard: Shard;\n entry: NormalizedEntry;\n}\n\ninterface RegexColdTarget {\n kind: \"cold\";\n digest: DigestShard;\n}\n\ntype RegexTarget = RegexHotTarget | RegexColdTarget;\n\nconst collectRegexTargets = (\n shards: Shard[],\n digests: DigestShard[],\n filters: SearchFilters,\n maxTerms: number,\n maxBytes: number,\n): { haystacks: string[]; targets: RegexTarget[]; complete: boolean; reasons: string[] } => {\n const haystacks: string[] = [];\n const targets: RegexTarget[] = [];\n let bytes = 0;\n let complete = true;\n const reasons = new Set<string>();\n const append = (haystack: string, target: RegexTarget): boolean => {\n const nextBytes = Buffer.byteLength(haystack, \"utf8\");\n if (haystacks.length >= maxTerms) {\n complete = false;\n reasons.add(\"regex_max_haystack_terms\");\n return false;\n }\n if (bytes + nextBytes > maxBytes) {\n complete = false;\n reasons.add(\"regex_max_haystack_bytes\");\n return false;\n }\n haystacks.push(haystack);\n targets.push(target);\n bytes += nextBytes;\n return true;\n };\n\n outer: for (const shard of shards) {\n for (const entry of shard.entries) {\n if (!matchesFilters(entry, filters)) continue;\n if (!append(entry.text, { kind: \"hot\", shard, entry })) break outer;\n }\n }\n if (complete) {\n outer: for (const digest of digests) {\n if (!digestCanMatchFilters(digest, filters)) continue;\n for (const term of digest.vocabulary) {\n if (!append(term, { kind: \"cold\", digest })) break outer;\n }\n }\n }\n return { haystacks, targets, complete, reasons: [...reasons].sort(compareLexical) };\n};\n\nconst searchRegex = async (\n shards: Shard[],\n digests: DigestShard[],\n pattern: string,\n filters: SearchFilters,\n query: SearchQuery,\n): Promise<{ located: LocatedEntry[]; digestHits: DigestHit[]; coverage: QueryCoverage }> => {\n const limits = query.regexLimits ?? {\n maxPatternBytes: DEFAULT_REGEX_MAX_PATTERN_BYTES,\n maxHaystackTerms: DEFAULT_REGEX_MAX_HAYSTACK_TERMS,\n maxHaystackBytes: DEFAULT_REGEX_MAX_HAYSTACK_BYTES,\n timeoutMs: DEFAULT_REGEX_TIMEOUT_MS,\n };\n const collected = collectRegexTargets(\n shards,\n digests,\n filters,\n limits.maxHaystackTerms,\n limits.maxHaystackBytes,\n );\n const execution = await executeBoundedRegex(pattern, collected.haystacks, {\n maxPatternBytes: limits.maxPatternBytes,\n timeoutMs: limits.timeoutMs,\n });\n if (!execution.complete) {\n return {\n located: [],\n digestHits: [],\n coverage: { complete: false, reasons: [execution.error.code], error: execution.error },\n };\n }\n\n const located: LocatedEntry[] = [];\n const coldMatches = new Map<DigestShard, number>();\n for (const index of execution.matched) {\n const target = collected.targets[index];\n if (!target) continue;\n if (target.kind === \"hot\") {\n located.push({\n entry: target.entry,\n matched: true,\n sessionMtime: target.shard.mtime,\n score: lexicalProvenanceWeight(target.entry, filters),\n });\n } else {\n coldMatches.set(target.digest, (coldMatches.get(target.digest) ?? 0) + 1);\n }\n }\n const reasons = new Set(collected.reasons);\n if (coldMatches.size > 0 && hasFilters(filters)) {\n reasons.add(\"cold_structural_filter_requires_hydration\");\n }\n return {\n located,\n digestHits: [...coldMatches].map(([digest, count]) =>\n toDigestHit(digest, count, count, digestStructuralMatchCount(digest, filters))),\n coverage: {\n complete: collected.complete && reasons.size === 0,\n reasons: [...reasons].sort(compareLexical),\n },\n };\n};\n\nconst sortDigestHits = (hits: DigestHit[]): void => {\n hits.sort((left, right) => {\n if (right.score !== left.score) return right.score - left.score;\n if (right.sessionMtime !== left.sessionMtime) return right.sessionMtime - left.sessionMtime;\n return compareLexical(left.sessionFile, right.sessionFile);\n });\n};\n\nexport const searchMemoryIndex = async (\n shards: Shard[],\n digests: DigestShard[],\n query: SearchQuery,\n): Promise<SearchResult> => {\n const filters: SearchFilters = query.filters ?? {};\n const plan = planMemoryQuery(\n query.query,\n query.queryMode ?? \"literal\",\n query.queryMatch ?? \"any\",\n );\n const limits = query.candidateLimits ?? {\n maxEntries: DEFAULT_SEARCH_MAX_CANDIDATE_ENTRIES,\n maxDigests: DEFAULT_SEARCH_MAX_CANDIDATE_DIGESTS,\n maxItems: DEFAULT_SEARCH_MAX_CANDIDATE_ITEMS,\n };\n const maxEntries = Math.max(1, Math.floor(limits.maxEntries));\n const maxDigests = Math.max(1, Math.floor(limits.maxDigests));\n const maxItems = Math.max(1, Math.floor(limits.maxItems));\n let located: LocatedEntry[];\n let digestHits: DigestHit[] = [];\n let queryCoverage: QueryCoverage = { complete: true, reasons: [] };\n const structurallyFiltered = hasFilters(filters);\n const matchMode: MemoryMatchMode = plan.kind === \"browse\"\n ? structurallyFiltered ? \"structural\" : \"browse\"\n : structurallyFiltered\n ? \"combined\"\n : plan.kind === \"regex\"\n ? \"regex\"\n : plan.kind === \"phrase\"\n ? \"phrase\"\n : \"lexical\";\n const markOnlyMatches = plan.kind !== \"browse\" || structurallyFiltered;\n const coverageReasons = new Set<string>();\n\n if (plan.kind === \"browse\") {\n const eligibleEntries = filteredEntryCount(shards, filters);\n located = collectRecent(shards, filters, maxEntries, structurallyFiltered ? 1 : 0);\n if (eligibleEntries > maxEntries) coverageReasons.add(\"candidate_entry_budget\");\n let eligibleDigests = 0;\n for (const digest of digests) {\n if (!digestCanMatchFilters(digest, filters)) continue;\n eligibleDigests += 1;\n if (digestHits.length < maxDigests) {\n const structuralMatches = digestStructuralMatchCount(digest, filters);\n digestHits.push(toDigestHit(\n digest,\n structurallyFiltered ? 1 : 0,\n 0,\n structuralMatches,\n ));\n }\n }\n if (eligibleDigests > maxDigests) coverageReasons.add(\"candidate_digest_budget\");\n } else if (plan.kind === \"regex\") {\n const regexResult = await searchRegex(shards, digests, plan.pattern, filters, query);\n located = regexResult.located.slice(0, maxEntries);\n digestHits = regexResult.digestHits.slice(0, maxDigests);\n queryCoverage = regexResult.coverage;\n if (regexResult.located.length > maxEntries) coverageReasons.add(\"candidate_entry_budget\");\n if (regexResult.digestHits.length > maxDigests) coverageReasons.add(\"candidate_digest_budget\");\n sortLocated(located);\n } else if (plan.kind === \"phrase\") {\n const eligibleEntries = filteredEntryCount(shards, filters);\n located = collectPhraseMatches(shards, plan.phrase, filters, maxEntries);\n if (eligibleEntries > maxEntries) coverageReasons.add(\"candidate_entry_budget\");\n const digestResult = scoreDigestTerms(digests, plan.terms, filters, maxDigests, \"all\");\n digestHits = digestResult.hits;\n if (!digestResult.complete) coverageReasons.add(\"candidate_digest_budget\");\n if (digestHits.length > 0) coverageReasons.add(\"cold_phrase_requires_hydration\");\n if (digestHits.length > 0 && hasFilters(filters)) {\n coverageReasons.add(\"cold_structural_filter_requires_hydration\");\n }\n } else {\n const eligibleEntries = filteredEntryCount(shards, filters);\n located = collectTermMatches(shards, plan.terms, filters, maxEntries, plan.match);\n if (eligibleEntries > maxEntries) coverageReasons.add(\"candidate_entry_budget\");\n const digestResult = scoreDigestTerms(digests, plan.terms, filters, maxDigests, plan.match);\n digestHits = digestResult.hits;\n if (!digestResult.complete) coverageReasons.add(\"candidate_digest_budget\");\n if (digestHits.length > 0 && plan.match === \"all\" && plan.terms.length > 1) {\n coverageReasons.add(\"cold_all_terms_requires_hydration\");\n }\n if (digestHits.length > 0 && hasFilters(filters)) {\n coverageReasons.add(\"cold_structural_filter_requires_hydration\");\n }\n }\n\n sortDigestHits(digestHits);\n for (const reason of queryCoverage.reasons) coverageReasons.add(reason);\n queryCoverage = {\n ...queryCoverage,\n complete: queryCoverage.complete && coverageReasons.size === 0,\n reasons: [...coverageReasons].sort(compareLexical),\n };\n return groupIntoResults(\n shards,\n located,\n digestHits,\n markOnlyMatches,\n matchMode,\n maxItems,\n queryCoverage,\n );\n};\n\nexport const searchShards = (shards: Shard[], query: SearchQuery): Promise<SearchResult> =>\n searchMemoryIndex(shards, [], query);\n\nconst groupIntoResults = (\n shards: Shard[],\n located: LocatedEntry[],\n digestHits: DigestHit[],\n markOnlyMatches: boolean,\n matchMode: MemoryMatchMode,\n maxItems: number,\n queryCoverage: QueryCoverage,\n): SearchResult => {\n if (located.length === 0 && digestHits.length === 0) {\n return {\n matchMode,\n matchedCount: 0,\n totalMatches: 0,\n totalItems: 0,\n segmentCount: 0,\n segments: [],\n digestHits: [],\n items: [],\n queryCoverage,\n };\n }\n\n const shardsByFile = new Map(shards.map((shard) => [shard.sessionFile, shard]));\n const sessionOrder: string[] = [];\n const matchedBySession = new Map<string, Set<number>>();\n const scores = new Map<string, number>();\n for (const item of located) {\n if (!matchedBySession.has(item.entry.sessionFile)) sessionOrder.push(item.entry.sessionFile);\n const set = matchedBySession.get(item.entry.sessionFile) ?? new Set<number>();\n set.add(item.entry.index);\n matchedBySession.set(item.entry.sessionFile, set);\n scores.set(`${item.entry.sessionFile}\\0${item.entry.index}`, item.score);\n }\n\n const segments: SearchSegment[] = [];\n for (const file of sessionOrder) {\n const shard = shardsByFile.get(file);\n const matchedSet = matchedBySession.get(file);\n if (!shard || !matchedSet) continue;\n let current: NormalizedEntry[] = [];\n let currentStart = 0;\n const flush = (): void => {\n if (current.length === 0) return;\n const entries: SearchSegmentEntry[] = current.map((entry) => {\n const matched = matchedSet.has(entry.index);\n return {\n entry,\n matched,\n marker: markOnlyMatches ? (matched ? \">\" : \" \") : \">\",\n score: matched ? scores.get(`${file}\\0${entry.index}`) ?? 0 : 0,\n };\n });\n const matchedEntries = entries.filter((entry) => entry.matched);\n if (markOnlyMatches && matchedEntries.length === 0) {\n current = [];\n return;\n }\n const lastIndex = current[current.length - 1]!.index;\n const range = lastIndex === currentStart ? `#${currentStart}` : `#${currentStart}-#${lastIndex}`;\n const score = Math.max(\n 0,\n ...matchedEntries.map((item) => scores.get(`${file}\\0${item.entry.index}`) ?? 0),\n );\n segments.push({\n sessionId: shard.sessionId,\n sessionFile: shard.sessionFile,\n sourceHash: shard.sourceHash,\n branches: shard.branches,\n lineageFingerprint: shard.lineageFingerprint,\n sessionMtime: shard.mtime,\n range,\n entryRange: { first: currentStart, last: lastIndex },\n entries,\n exactMatches: matchedEntries.map(({ entry }) => ({\n index: entry.index,\n entryId: entry.entryId,\n operationAddress: entry.operationAddress ?? null,\n })),\n matchedCount: matchedEntries.length,\n score,\n tier: shard.tier ?? \"hot\",\n });\n current = [];\n };\n\n for (const entry of shard.entries) {\n if (current.length > 0 && entry.role !== null && segmentStartRoles.has(entry.role)) flush();\n if (current.length === 0) currentStart = entry.index;\n current.push(entry);\n }\n flush();\n }\n\n const items: SearchItem[] = [\n ...segments.map((segment): SearchItem => ({ kind: \"entry\", segment })),\n ...digestHits.map((digest): SearchItem => ({ kind: \"digest\", digest })),\n ];\n items.sort(compareSearchItems);\n const candidateItemsExceeded = items.length > maxItems;\n const limitedItems = items.slice(0, maxItems);\n const limitedSegments = limitedItems\n .filter((item): item is { kind: \"entry\"; segment: SearchSegment } => item.kind === \"entry\")\n .map((item) => item.segment);\n const limitedDigests = limitedItems\n .filter((item): item is { kind: \"digest\"; digest: DigestHit } => item.kind === \"digest\")\n .map((item) => item.digest);\n const matchedCount = limitedSegments.reduce((sum, segment) => sum + segment.matchedCount, 0)\n + limitedDigests.length;\n const finalCoverage = candidateItemsExceeded\n ? {\n ...queryCoverage,\n complete: false,\n reasons: [...new Set([...queryCoverage.reasons, \"candidate_item_budget\"])].sort(compareLexical),\n }\n : queryCoverage;\n return {\n matchMode,\n matchedCount,\n totalMatches: matchedCount,\n totalItems: limitedItems.length,\n segmentCount: limitedSegments.length,\n segments: limitedSegments,\n digestHits: limitedDigests,\n items: limitedItems,\n queryCoverage: finalCoverage,\n };\n};\n\nconst compareSearchItems = (left: SearchItem, right: SearchItem): number => {\n const leftValue = left.kind === \"entry\" ? left.segment : left.digest;\n const rightValue = right.kind === \"entry\" ? right.segment : right.digest;\n if (rightValue.score !== leftValue.score) return rightValue.score - leftValue.score;\n if (rightValue.sessionMtime !== leftValue.sessionMtime) return rightValue.sessionMtime - leftValue.sessionMtime;\n if (left.kind !== right.kind) return left.kind === \"entry\" ? -1 : 1;\n if (left.kind === \"entry\" && right.kind === \"entry\") {\n const leftIndex = left.segment.entries[0]?.entry.index ?? 0;\n const rightIndex = right.segment.entries[0]?.entry.index ?? 0;\n if (leftIndex !== rightIndex) return leftIndex - rightIndex;\n return compareLexical(left.segment.sessionFile, right.segment.sessionFile);\n }\n if (left.kind === \"digest\" && right.kind === \"digest\") {\n return compareLexical(left.digest.sessionFile, right.digest.sessionFile);\n }\n return 0;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["crypto", "fs", "path", "crypto", "fs", "matchesFilters"]
7
+ }
@@ -536,43 +536,64 @@ var expandSessionEntry = (sessionFile, index, options = {}) => {
536
536
  const { entries } = normalizeSession(sessionFile, Number.MAX_SAFE_INTEGER, options);
537
537
  return entries.find((entry) => entry.index === index)?.text ?? null;
538
538
  };
539
- var expandSessionEntries = (sessionFile, selection, options = {}) => {
540
- const { entries } = normalizeSession(sessionFile, Number.MAX_SAFE_INTEGER, options);
539
+ var toExpandedSessionEntry = (entry) => ({
540
+ index: entry.index,
541
+ entryId: entry.entryId,
542
+ parentId: entry.parentId,
543
+ type: entry.type,
544
+ role: entry.role,
545
+ timestamp: entry.timestamp,
546
+ isError: entry.isError,
547
+ text: entry.text,
548
+ ...entry.parentEntryId !== void 0 ? { parentEntryId: entry.parentEntryId } : {},
549
+ ...entry.operationAddress ? { operationAddress: entry.operationAddress } : {},
550
+ ...entry.toolName ? { toolName: entry.toolName } : {},
551
+ ...entry.ref ? { ref: entry.ref } : {},
552
+ ...entry.provider ? { provider: entry.provider } : {},
553
+ ...entry.action ? { action: entry.action } : {},
554
+ ...entry.outcome ? { outcome: entry.outcome } : {},
555
+ ...entry.filesTouched ? { filesTouched: entry.filesTouched } : {},
556
+ ...entry.operation ? { operation: entry.operation } : {},
557
+ ...entry.branchFact ? { branchFact: entry.branchFact } : {},
558
+ ...entry.factAddress ? { factAddress: entry.factAddress } : {},
559
+ ...entry.carrierEntryId ? { carrierEntryId: entry.carrierEntryId } : {},
560
+ ...entry.carrierParentId !== void 0 ? { carrierParentId: entry.carrierParentId } : {},
561
+ ...entry.carrierFromId !== void 0 ? { carrierFromId: entry.carrierFromId } : {}
562
+ });
563
+ var expandNormalizedEntries = (entries, selection) => {
541
564
  const indices = new Set(selection.indices ?? []);
542
565
  const entryIds = new Set(selection.entryIds ?? []);
543
566
  const operationAddresses = new Set(selection.operationAddresses ?? []);
544
567
  const range = selection.entryRange;
545
568
  return entries.filter(
546
569
  (entry) => indices.has(entry.index) || entry.entryId !== null && entryIds.has(entry.entryId) || entry.operationAddress !== void 0 && operationAddresses.has(entry.operationAddress) || range !== void 0 && entry.index >= range.first && entry.index <= range.last
547
- ).map((entry) => ({
548
- index: entry.index,
549
- entryId: entry.entryId,
550
- parentId: entry.parentId,
551
- type: entry.type,
552
- role: entry.role,
553
- timestamp: entry.timestamp,
554
- isError: entry.isError,
555
- text: entry.text,
556
- ...entry.parentEntryId !== void 0 ? { parentEntryId: entry.parentEntryId } : {},
557
- ...entry.operationAddress ? { operationAddress: entry.operationAddress } : {},
558
- ...entry.toolName ? { toolName: entry.toolName } : {},
559
- ...entry.ref ? { ref: entry.ref } : {},
560
- ...entry.provider ? { provider: entry.provider } : {},
561
- ...entry.action ? { action: entry.action } : {},
562
- ...entry.outcome ? { outcome: entry.outcome } : {},
563
- ...entry.filesTouched ? { filesTouched: entry.filesTouched } : {},
564
- ...entry.operation ? { operation: entry.operation } : {},
565
- ...entry.branchFact ? { branchFact: entry.branchFact } : {},
566
- ...entry.factAddress ? { factAddress: entry.factAddress } : {},
567
- ...entry.carrierEntryId ? { carrierEntryId: entry.carrierEntryId } : {},
568
- ...entry.carrierParentId !== void 0 ? { carrierParentId: entry.carrierParentId } : {},
569
- ...entry.carrierFromId !== void 0 ? { carrierFromId: entry.carrierFromId } : {}
570
- }));
570
+ ).map(toExpandedSessionEntry);
571
571
  };
572
- var expandSessionEntriesChecked = (sessionFile, selection, options = {}) => {
572
+ var expandSessionEntries = (sessionFile, selection, options = {}) => {
573
573
  const { entries } = normalizeSession(sessionFile, Number.MAX_SAFE_INTEGER, options);
574
- for (const address of new Set(selection.entryIds ?? [])) {
575
- const matches = entries.filter((entry) => entry.entryId === address).length;
574
+ return expandNormalizedEntries(entries, selection);
575
+ };
576
+ var expandSessionEntriesChecked = (sessionFileOrEntries, selection, options = {}) => {
577
+ const entries = typeof sessionFileOrEntries === "string" ? normalizeSession(sessionFileOrEntries, Number.MAX_SAFE_INTEGER, options).entries : sessionFileOrEntries;
578
+ const requestedEntryIds = new Set(selection.entryIds ?? []);
579
+ const requestedOperationAddresses = new Set(selection.operationAddresses ?? []);
580
+ const entryIdCounts = new Map([...requestedEntryIds].map((address) => [address, 0]));
581
+ const operationAddressCounts = new Map(
582
+ [...requestedOperationAddresses].map((address) => [address, 0])
583
+ );
584
+ for (const entry of entries) {
585
+ if (entry.entryId !== null && requestedEntryIds.has(entry.entryId)) {
586
+ entryIdCounts.set(entry.entryId, (entryIdCounts.get(entry.entryId) ?? 0) + 1);
587
+ }
588
+ if (entry.operationAddress !== void 0 && requestedOperationAddresses.has(entry.operationAddress)) {
589
+ operationAddressCounts.set(
590
+ entry.operationAddress,
591
+ (operationAddressCounts.get(entry.operationAddress) ?? 0) + 1
592
+ );
593
+ }
594
+ }
595
+ for (const address of requestedEntryIds) {
596
+ const matches = entryIdCounts.get(address) ?? 0;
576
597
  if (matches !== 1) {
577
598
  return {
578
599
  expanded: [],
@@ -586,8 +607,8 @@ var expandSessionEntriesChecked = (sessionFile, selection, options = {}) => {
586
607
  };
587
608
  }
588
609
  }
589
- for (const address of new Set(selection.operationAddresses ?? [])) {
590
- const matches = entries.filter((entry) => entry.operationAddress === address).length;
610
+ for (const address of requestedOperationAddresses) {
611
+ const matches = operationAddressCounts.get(address) ?? 0;
591
612
  if (matches !== 1) {
592
613
  return {
593
614
  expanded: [],
@@ -601,7 +622,7 @@ var expandSessionEntriesChecked = (sessionFile, selection, options = {}) => {
601
622
  };
602
623
  }
603
624
  }
604
- return { expanded: expandSessionEntries(sessionFile, selection, options) };
625
+ return { expanded: expandNormalizedEntries(entries, selection) };
605
626
  };
606
627
 
607
628
  export {
@@ -613,4 +634,4 @@ export {
613
634
  expandSessionEntries,
614
635
  expandSessionEntriesChecked
615
636
  };
616
- //# sourceMappingURL=chunk-JCIF7VFN.js.map
637
+ //# sourceMappingURL=chunk-HXAEON2E.js.map