@mneme-ai/core 0.22.2 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/dist/htc/abstract.d.ts +41 -0
  2. package/dist/htc/abstract.d.ts.map +1 -0
  3. package/dist/htc/abstract.js +97 -0
  4. package/dist/htc/abstract.js.map +1 -0
  5. package/dist/htc/abstract.test.d.ts +2 -0
  6. package/dist/htc/abstract.test.d.ts.map +1 -0
  7. package/dist/htc/abstract.test.js +169 -0
  8. package/dist/htc/abstract.test.js.map +1 -0
  9. package/dist/htc/clusters.d.ts +38 -0
  10. package/dist/htc/clusters.d.ts.map +1 -0
  11. package/dist/htc/clusters.js +103 -0
  12. package/dist/htc/clusters.js.map +1 -0
  13. package/dist/htc/clusters.test.d.ts +2 -0
  14. package/dist/htc/clusters.test.d.ts.map +1 -0
  15. package/dist/htc/clusters.test.js +128 -0
  16. package/dist/htc/clusters.test.js.map +1 -0
  17. package/dist/htc/index.d.ts +16 -0
  18. package/dist/htc/index.d.ts.map +1 -0
  19. package/dist/htc/index.js +16 -0
  20. package/dist/htc/index.js.map +1 -0
  21. package/dist/htc/memoir.d.ts +27 -0
  22. package/dist/htc/memoir.d.ts.map +1 -0
  23. package/dist/htc/memoir.js +50 -0
  24. package/dist/htc/memoir.js.map +1 -0
  25. package/dist/htc/memoir.test.d.ts +2 -0
  26. package/dist/htc/memoir.test.d.ts.map +1 -0
  27. package/dist/htc/memoir.test.js +87 -0
  28. package/dist/htc/memoir.test.js.map +1 -0
  29. package/dist/htc/storage.d.ts +24 -0
  30. package/dist/htc/storage.d.ts.map +1 -0
  31. package/dist/htc/storage.js +170 -0
  32. package/dist/htc/storage.js.map +1 -0
  33. package/dist/htc/storage.test.d.ts +2 -0
  34. package/dist/htc/storage.test.d.ts.map +1 -0
  35. package/dist/htc/storage.test.js +327 -0
  36. package/dist/htc/storage.test.js.map +1 -0
  37. package/dist/htc/types.d.ts +86 -0
  38. package/dist/htc/types.d.ts.map +1 -0
  39. package/dist/htc/types.js +22 -0
  40. package/dist/htc/types.js.map +1 -0
  41. package/dist/index.d.ts +1 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +1 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/retrieve/ddtree.d.ts +67 -0
  46. package/dist/retrieve/ddtree.d.ts.map +1 -0
  47. package/dist/retrieve/ddtree.js +156 -0
  48. package/dist/retrieve/ddtree.js.map +1 -0
  49. package/dist/retrieve/ddtree.test.d.ts +2 -0
  50. package/dist/retrieve/ddtree.test.d.ts.map +1 -0
  51. package/dist/retrieve/ddtree.test.js +181 -0
  52. package/dist/retrieve/ddtree.test.js.map +1 -0
  53. package/dist/retrieve/index.d.ts +3 -0
  54. package/dist/retrieve/index.d.ts.map +1 -1
  55. package/dist/retrieve/index.js +3 -0
  56. package/dist/retrieve/index.js.map +1 -1
  57. package/dist/retrieve/leviathan.d.ts +68 -0
  58. package/dist/retrieve/leviathan.d.ts.map +1 -0
  59. package/dist/retrieve/leviathan.js +192 -0
  60. package/dist/retrieve/leviathan.js.map +1 -0
  61. package/dist/retrieve/leviathan.test.d.ts +2 -0
  62. package/dist/retrieve/leviathan.test.d.ts.map +1 -0
  63. package/dist/retrieve/leviathan.test.js +124 -0
  64. package/dist/retrieve/leviathan.test.js.map +1 -0
  65. package/dist/retrieve/search.d.ts +7 -0
  66. package/dist/retrieve/search.d.ts.map +1 -1
  67. package/dist/retrieve/search.js +31 -3
  68. package/dist/retrieve/search.js.map +1 -1
  69. package/dist/retrieve/stream.d.ts +93 -0
  70. package/dist/retrieve/stream.d.ts.map +1 -0
  71. package/dist/retrieve/stream.js +52 -0
  72. package/dist/retrieve/stream.js.map +1 -0
  73. package/dist/retrieve/stream.test.d.ts +2 -0
  74. package/dist/retrieve/stream.test.d.ts.map +1 -0
  75. package/dist/retrieve/stream.test.js +118 -0
  76. package/dist/retrieve/stream.test.js.map +1 -0
  77. package/dist/retrieve/synthesize.d.ts +7 -0
  78. package/dist/retrieve/synthesize.d.ts.map +1 -1
  79. package/dist/retrieve/synthesize.js +48 -2
  80. package/dist/retrieve/synthesize.js.map +1 -1
  81. package/dist/store/schema.d.ts +3 -2
  82. package/dist/store/schema.d.ts.map +1 -1
  83. package/dist/store/schema.js +42 -1
  84. package/dist/store/schema.js.map +1 -1
  85. package/dist/store/sqlite.test.js +1 -1
  86. package/dist/util/constraint-pruner.d.ts +76 -0
  87. package/dist/util/constraint-pruner.d.ts.map +1 -0
  88. package/dist/util/constraint-pruner.js +89 -0
  89. package/dist/util/constraint-pruner.js.map +1 -0
  90. package/dist/util/constraint-pruner.test.d.ts +2 -0
  91. package/dist/util/constraint-pruner.test.d.ts.map +1 -0
  92. package/dist/util/constraint-pruner.test.js +101 -0
  93. package/dist/util/constraint-pruner.test.js.map +1 -0
  94. package/dist/util/index.d.ts +1 -0
  95. package/dist/util/index.d.ts.map +1 -1
  96. package/dist/util/index.js +1 -0
  97. package/dist/util/index.js.map +1 -1
  98. package/dist/wisdom/index.d.ts +2 -0
  99. package/dist/wisdom/index.d.ts.map +1 -1
  100. package/dist/wisdom/index.js +2 -0
  101. package/dist/wisdom/index.js.map +1 -1
  102. package/dist/wisdom/mutant-adapt.d.ts +69 -0
  103. package/dist/wisdom/mutant-adapt.d.ts.map +1 -0
  104. package/dist/wisdom/mutant-adapt.js +216 -0
  105. package/dist/wisdom/mutant-adapt.js.map +1 -0
  106. package/dist/wisdom/mutant-adapt.test.d.ts +2 -0
  107. package/dist/wisdom/mutant-adapt.test.d.ts.map +1 -0
  108. package/dist/wisdom/mutant-adapt.test.js +184 -0
  109. package/dist/wisdom/mutant-adapt.test.js.map +1 -0
  110. package/dist/wisdom/session.d.ts +60 -0
  111. package/dist/wisdom/session.d.ts.map +1 -0
  112. package/dist/wisdom/session.js +193 -0
  113. package/dist/wisdom/session.js.map +1 -0
  114. package/dist/wisdom/session.test.d.ts +2 -0
  115. package/dist/wisdom/session.test.d.ts.map +1 -0
  116. package/dist/wisdom/session.test.js +161 -0
  117. package/dist/wisdom/session.test.js.map +1 -0
  118. package/package.json +1 -1
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Leviathan citation verification — speculative-decoding-style draft/target
3
+ * loop applied to LLM answers.
4
+ *
5
+ * Algorithm 1 from the Leviathan paper: a fast "draft" model proposes,
6
+ * a strict "target" rejects un-supported tokens, residual sampling re-drafts.
7
+ *
8
+ * Mneme's adaptation:
9
+ * - Draft = the LLM's synthesized answer (already produced by `synthesize()`)
10
+ * - Target = a deterministic citation matcher (each backticked hash must
11
+ * exist in the evidence pool AND the surrounding sentence must
12
+ * contextually match the cited commit's subject)
13
+ * - Reject = mark the unverified claim with `[unverified: ...]` so the
14
+ * user sees what was filtered (no silent deletion)
15
+ * - Residual = `degraded: true` when too many rejections — caller should
16
+ * warn the user that trust is reduced
17
+ *
18
+ * The keyword/token-overlap match is intentionally lightweight (no embedding
19
+ * call). Cosine on a sentence-level embedding would be more accurate but
20
+ * Mneme's core stays dep-free; embeddings live in the embeddings package and
21
+ * we don't want a runtime cycle. Empirically the 0.2 token-overlap floor
22
+ * catches "hash present, sentence completely unrelated" without flagging
23
+ * legitimate paraphrases.
24
+ */
25
+ /** Fraction of claims that must verify before we stop calling the answer "degraded." */
26
+ const TRUST_FLOOR = 0.6;
27
+ /** Token-overlap floor — surrounding sentence vs commit subject. */
28
+ const CONTEXT_MATCH_FLOOR = 0.2;
29
+ /**
30
+ * Run Algorithm-1-style verification on an LLM answer.
31
+ *
32
+ * The loop is single-pass (we don't actually re-draft, since the answer is
33
+ * already paid-for). Instead we tag rejected spans inline so the renderer
34
+ * can dim/strikethrough them.
35
+ */
36
+ export function verifyAnswerLeviathan(input) {
37
+ const { answer, evidence, events } = input;
38
+ const sentences = splitSentences(answer);
39
+ const verifications = [];
40
+ const cleanedSentences = [];
41
+ let totalWithCitation = 0;
42
+ let verifiedWithCitation = 0;
43
+ for (const sentence of sentences) {
44
+ const trimmed = sentence.trim();
45
+ if (!trimmed) {
46
+ cleanedSentences.push(sentence);
47
+ continue;
48
+ }
49
+ const citedHash = extractHash(trimmed);
50
+ if (!citedHash) {
51
+ verifications.push({
52
+ claimText: trimmed,
53
+ verdict: "no-citation",
54
+ reason: "intro/conclusion sentence with no hash citation",
55
+ });
56
+ cleanedSentences.push(sentence);
57
+ continue;
58
+ }
59
+ totalWithCitation += 1;
60
+ const matched = findEvidenceForHash(citedHash, evidence);
61
+ if (!matched) {
62
+ const reason = `cited \`${citedHash}\` is not in the evidence pool`;
63
+ verifications.push({
64
+ claimText: trimmed,
65
+ citedHash,
66
+ verdict: "hash-not-in-evidence",
67
+ reason,
68
+ });
69
+ cleanedSentences.push(wrapUnverified(sentence, "hash not in evidence"));
70
+ events?.emit({ kind: "verify", claim: trimmed, ok: false, reason });
71
+ continue;
72
+ }
73
+ const overlap = tokenOverlap(trimmed, matched.subject);
74
+ if (overlap < CONTEXT_MATCH_FLOOR) {
75
+ const reason = `sentence does not contextually match commit subject (overlap=${overlap.toFixed(2)})`;
76
+ verifications.push({
77
+ claimText: trimmed,
78
+ citedHash,
79
+ verdict: "claim-not-supported",
80
+ reason,
81
+ });
82
+ cleanedSentences.push(wrapUnverified(sentence, "claim not supported by commit subject"));
83
+ events?.emit({ kind: "verify", claim: trimmed, ok: false, reason });
84
+ continue;
85
+ }
86
+ verifiedWithCitation += 1;
87
+ verifications.push({
88
+ claimText: trimmed,
89
+ citedHash,
90
+ verdict: "verified",
91
+ reason: `hash present in evidence; subject overlap=${overlap.toFixed(2)}`,
92
+ });
93
+ cleanedSentences.push(sentence);
94
+ events?.emit({ kind: "verify", claim: trimmed, ok: true });
95
+ }
96
+ const trustScore = totalWithCitation === 0 ? 1.0 : verifiedWithCitation / totalWithCitation;
97
+ const degraded = trustScore < TRUST_FLOOR;
98
+ return {
99
+ cleanedAnswer: cleanedSentences.join("").trim() || answer.trim(),
100
+ verifications,
101
+ trustScore: Number(trustScore.toFixed(2)),
102
+ degraded,
103
+ };
104
+ }
105
+ /**
106
+ * Split an answer into "claim sentences" but preserve trailing punctuation +
107
+ * inter-sentence whitespace. We need the whitespace back when we re-join so
108
+ * the cleaned answer reads naturally.
109
+ *
110
+ * Returns an array where each element is "<sentence-content><punct><ws>".
111
+ */
112
+ function splitSentences(text) {
113
+ if (!text)
114
+ return [];
115
+ // Capture sentence-ending punctuation. We split on `. ! ?` followed by
116
+ // whitespace OR end-of-string.
117
+ const out = [];
118
+ const re = /[^.!?]+[.!?]+(\s*)|[^.!?]+$/g;
119
+ let m;
120
+ while ((m = re.exec(text)) !== null) {
121
+ out.push(m[0]);
122
+ }
123
+ return out;
124
+ }
125
+ /**
126
+ * Extract the first backticked hex token (>=4 chars) from a sentence.
127
+ * Returns the hash lowercased, or undefined if no hash.
128
+ *
129
+ * Mirrors `findUnverifiedCitations` in synthesize.ts so a hash that one
130
+ * function flags is the same one this function checks.
131
+ */
132
+ function extractHash(sentence) {
133
+ const m = sentence.match(/`([0-9a-f]{4,40})`/i);
134
+ return m ? m[1].toLowerCase() : undefined;
135
+ }
136
+ /** Find the evidence entry whose hash prefix-matches the cited hash (either direction). */
137
+ function findEvidenceForHash(cited, evidence) {
138
+ const c = cited.toLowerCase();
139
+ for (const e of evidence) {
140
+ const h = e.hash.toLowerCase();
141
+ const sh = (e.shortHash ?? "").toLowerCase();
142
+ if (h === c || h.startsWith(c) || c.startsWith(h))
143
+ return e;
144
+ if (sh && (sh === c || sh.startsWith(c) || c.startsWith(sh)))
145
+ return e;
146
+ }
147
+ return undefined;
148
+ }
149
+ /**
150
+ * Lightweight Jaccard-like token overlap: shared tokens / total unique tokens
151
+ * after dropping stopwords + the cited hash itself. Symmetric, in [0,1].
152
+ */
153
+ export function tokenOverlap(sentence, subject) {
154
+ const a = tokenize(sentence);
155
+ const b = tokenize(subject);
156
+ if (a.size === 0 || b.size === 0)
157
+ return 0;
158
+ let shared = 0;
159
+ for (const t of a)
160
+ if (b.has(t))
161
+ shared += 1;
162
+ const union = new Set([...a, ...b]).size;
163
+ return union === 0 ? 0 : shared / union;
164
+ }
165
+ const STOPWORDS = new Set([
166
+ "the", "a", "an", "and", "or", "but", "of", "to", "in", "on", "for",
167
+ "with", "is", "was", "are", "were", "be", "been", "being",
168
+ "this", "that", "these", "those", "it", "its",
169
+ "as", "by", "at", "from", "into", "see", "also",
170
+ ]);
171
+ function tokenize(text) {
172
+ const toks = new Set();
173
+ // Strip backtick spans so the hash itself doesn't count as a shared token.
174
+ const noBackticks = text.replace(/`[^`]*`/g, " ");
175
+ for (const raw of noBackticks.toLowerCase().split(/[^a-z0-9]+/)) {
176
+ if (!raw)
177
+ continue;
178
+ if (STOPWORDS.has(raw))
179
+ continue;
180
+ if (raw.length < 2)
181
+ continue;
182
+ toks.add(raw);
183
+ }
184
+ return toks;
185
+ }
186
+ function wrapUnverified(sentence, reason) {
187
+ // Preserve trailing whitespace so re-joined paragraphs flow naturally.
188
+ const tail = sentence.match(/\s*$/)?.[0] ?? "";
189
+ const body = sentence.slice(0, sentence.length - tail.length);
190
+ return `[unverified: ${reason}] ${body}${tail}`;
191
+ }
192
+ //# sourceMappingURL=leviathan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leviathan.js","sourceRoot":"","sources":["../../src/retrieve/leviathan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=leviathan.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leviathan.test.d.ts","sourceRoot":"","sources":["../../src/retrieve/leviathan.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,124 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { tokenOverlap, verifyAnswerLeviathan } from "./leviathan.js";
3
+ import { InMemorySink } from "./stream.js";
4
+ const ev = (hash, subject) => ({
5
+ hash,
6
+ shortHash: hash.slice(0, 7),
7
+ subject,
8
+ });
9
+ describe("verifyAnswerLeviathan — verdicts", () => {
10
+ it("verifies a hash that is in evidence and contextually matches the subject", () => {
11
+ const result = verifyAnswerLeviathan({
12
+ answer: "We fixed the Stripe bigint overflow in `abc1234`.",
13
+ evidence: [ev("abc1234567890abc", "Fix Stripe bigint overflow")],
14
+ });
15
+ expect(result.verifications).toHaveLength(1);
16
+ expect(result.verifications[0].verdict).toBe("verified");
17
+ expect(result.trustScore).toBe(1);
18
+ expect(result.degraded).toBe(false);
19
+ // Verified spans are NOT wrapped.
20
+ expect(result.cleanedAnswer).not.toContain("[unverified");
21
+ });
22
+ it("flags hash-not-in-evidence and wraps the offending sentence", () => {
23
+ const result = verifyAnswerLeviathan({
24
+ answer: "See `bad9999` for details.",
25
+ evidence: [ev("abc1234567890abc", "Fix Stripe bigint overflow")],
26
+ });
27
+ expect(result.verifications[0].verdict).toBe("hash-not-in-evidence");
28
+ expect(result.cleanedAnswer).toContain("[unverified");
29
+ expect(result.trustScore).toBe(0);
30
+ expect(result.degraded).toBe(true);
31
+ });
32
+ it("flags claim-not-supported when hash exists but subject overlap is below floor", () => {
33
+ const result = verifyAnswerLeviathan({
34
+ // Sentence is about authentication; subject is about a Stripe overflow.
35
+ answer: "Authentication tokens are rotated every hour, see `abc1234`.",
36
+ evidence: [ev("abc1234567890abc", "Fix Stripe bigint overflow")],
37
+ });
38
+ expect(result.verifications[0].verdict).toBe("claim-not-supported");
39
+ expect(result.cleanedAnswer).toContain("[unverified");
40
+ });
41
+ it("marks no-citation sentences as no-citation but keeps them in the cleaned answer", () => {
42
+ const result = verifyAnswerLeviathan({
43
+ answer: "This is the verdict. The history is clear.",
44
+ evidence: [ev("abc1234567890abc", "Fix Stripe bigint overflow")],
45
+ });
46
+ expect(result.verifications.every((v) => v.verdict === "no-citation")).toBe(true);
47
+ // Both intro/conclusion sentences kept as-is.
48
+ expect(result.cleanedAnswer).toContain("This is the verdict");
49
+ expect(result.cleanedAnswer).toContain("The history is clear");
50
+ });
51
+ it("trust score is fraction of citation-bearing claims that verified", () => {
52
+ const result = verifyAnswerLeviathan({
53
+ answer: "Stripe bigint fix landed in `abc1234`. Auth rotation lives in `bad9999`.",
54
+ evidence: [ev("abc1234567890abc", "Fix Stripe bigint overflow")],
55
+ });
56
+ // 1 verified, 1 hash-not-in-evidence → 0.5
57
+ expect(result.trustScore).toBe(0.5);
58
+ expect(result.degraded).toBe(true); // 0.5 < 0.6 floor
59
+ });
60
+ it("trustScore = 1.0 when no citations are present (intro/conclusion only)", () => {
61
+ const result = verifyAnswerLeviathan({
62
+ answer: "The evidence is mixed. We cannot commit to a verdict.",
63
+ evidence: [ev("abc1234567890abc", "Fix Stripe bigint overflow")],
64
+ });
65
+ expect(result.trustScore).toBe(1.0);
66
+ expect(result.degraded).toBe(false);
67
+ });
68
+ it("matches by hash prefix in either direction (short hash <-> long hash)", () => {
69
+ const result = verifyAnswerLeviathan({
70
+ answer: "Stripe bigint fix landed in `abc12345678`.",
71
+ evidence: [ev("abc1234", "Fix Stripe bigint overflow")],
72
+ });
73
+ expect(result.verifications[0].verdict).toBe("verified");
74
+ });
75
+ it("emits verify events to the sink", () => {
76
+ const sink = new InMemorySink();
77
+ verifyAnswerLeviathan({
78
+ answer: "Stripe bigint fix landed in `abc1234`. See `bad9999` for unrelated.",
79
+ evidence: [ev("abc1234567890abc", "Fix Stripe bigint overflow")],
80
+ events: sink,
81
+ });
82
+ const verifies = sink.byKind("verify");
83
+ expect(verifies).toHaveLength(2);
84
+ expect(verifies[0].ok).toBe(true);
85
+ expect(verifies[1].ok).toBe(false);
86
+ expect(verifies[1].reason).toContain("not in the evidence pool");
87
+ });
88
+ it("degraded flag flips when too many rejections accumulate", () => {
89
+ const result = verifyAnswerLeviathan({
90
+ answer: "See `dead0001`. Also `dead0002`. Lastly `abc1234`.",
91
+ evidence: [ev("abc1234567890abc", "Fix Stripe bigint overflow")],
92
+ });
93
+ // 1 of 3 verified → 0.33 → degraded.
94
+ expect(result.degraded).toBe(true);
95
+ expect(result.trustScore).toBeLessThan(0.6);
96
+ });
97
+ it("preserves verified sentences verbatim in cleanedAnswer", () => {
98
+ const result = verifyAnswerLeviathan({
99
+ answer: "We fixed the Stripe bigint overflow in `abc1234`.",
100
+ evidence: [ev("abc1234567890abc", "Fix Stripe bigint overflow")],
101
+ });
102
+ expect(result.cleanedAnswer).toContain("Stripe bigint overflow");
103
+ expect(result.cleanedAnswer).toContain("`abc1234`");
104
+ });
105
+ });
106
+ describe("tokenOverlap", () => {
107
+ it("returns 1 for identical sentences", () => {
108
+ expect(tokenOverlap("stripe bigint overflow", "stripe bigint overflow")).toBe(1);
109
+ });
110
+ it("returns 0 for disjoint token sets", () => {
111
+ expect(tokenOverlap("authentication tokens", "Stripe bigint")).toBe(0);
112
+ });
113
+ it("ignores stopwords and the cited hash itself", () => {
114
+ // Only 'stripe' overlaps; everything else is stopwords or the hash.
115
+ const overlap = tokenOverlap("This is the stripe fix `abc1234`.", "Stripe bigint");
116
+ expect(overlap).toBeGreaterThan(0);
117
+ });
118
+ it("is symmetric", () => {
119
+ const a = "stripe bigint overflow";
120
+ const b = "fix overflow in stripe";
121
+ expect(tokenOverlap(a, b)).toBeCloseTo(tokenOverlap(b, a), 6);
122
+ });
123
+ });
124
+ //# sourceMappingURL=leviathan.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leviathan.test.js","sourceRoot":"","sources":["../../src/retrieve/leviathan.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { AskResult, CommitChunk, EmbeddingProvider, RepoMeta, SearchResult } from "../types.js";
2
2
  import type { MnemeStore } from "../store/sqlite.js";
3
+ import type { EventSink } from "./stream.js";
3
4
  export interface SearchOptions {
4
5
  store: MnemeStore;
5
6
  embedder?: EmbeddingProvider;
@@ -20,6 +21,12 @@ export interface SearchOptions {
20
21
  minFtsHits: number;
21
22
  minSemCosine: number;
22
23
  };
24
+ /**
25
+ * Speculative-reasoning event sink. When provided, search emits
26
+ * `consider` / `accept` / `prune` events as it scores candidates so callers
27
+ * can render a live trace. Defaults to a no-op sink — zero cost when unused.
28
+ */
29
+ events?: EventSink;
23
30
  }
24
31
  /** Thresholds used when confidenceFloor === "auto". Calibrated from the eval set. */
25
32
  export declare const DEFAULT_CONFIDENCE: {
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/retrieve/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAGT,WAAW,EACX,iBAAiB,EACjB,QAAQ,EACR,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CACjF;AAED,qFAAqF;AACrF,eAAO,MAAM,kBAAkB,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAG1E,CAAC;AAEF,6EAA6E;AAC7E,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAEjE;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,eAAe,CAmB3E;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA6ExF;AAED,wBAAsB,GAAG,CACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,SAAS,CAAC,CAQpB;AAiDD,wBAAgB,MAAM,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAc/D;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,QAAQ,EAAE,EACf,GAAG,EAAE,QAAQ,EAAE,EACf,GAAG,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE,KAAK,CAAC;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAW9C"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/retrieve/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAGT,WAAW,EACX,iBAAiB,EACjB,QAAQ,EACR,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAChF;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,qFAAqF;AACrF,eAAO,MAAM,kBAAkB,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAG1E,CAAC;AAEF,6EAA6E;AAC7E,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAEjE;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,eAAe,CAmB3E;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA2GxF;AAED,wBAAsB,GAAG,CACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,SAAS,CAAC,CAQpB;AAiDD,wBAAgB,MAAM,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAc/D;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,QAAQ,EAAE,EACf,GAAG,EAAE,QAAQ,EAAE,EACf,GAAG,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE,KAAK,CAAC;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAW9C"}
@@ -111,9 +111,37 @@ export async function search(query, opts) {
111
111
  });
112
112
  }
113
113
  }
114
- return Array.from(byCommit.values())
115
- .sort((a, b) => b.score - a.score)
116
- .slice(0, topK);
114
+ const ranked = Array.from(byCommit.values()).sort((a, b) => b.score - a.score);
115
+ // Speculative-reasoning trace: every candidate emits `consider`; the topK
116
+ // emit `accept` and the rest emit `prune` so the caller can render the
117
+ // model's elimination process. Cheap when no sink is attached.
118
+ if (opts.events) {
119
+ const sink = opts.events;
120
+ const accepted = ranked.slice(0, topK);
121
+ const pruned = ranked.slice(topK);
122
+ for (const r of ranked) {
123
+ sink.emit({
124
+ kind: "consider",
125
+ commit: { shortHash: r.commit.shortHash, subject: r.commit.subject },
126
+ score: r.score,
127
+ });
128
+ }
129
+ for (const r of accepted) {
130
+ sink.emit({
131
+ kind: "accept",
132
+ commit: { shortHash: r.commit.shortHash, subject: r.commit.subject },
133
+ reason: "above score floor",
134
+ });
135
+ }
136
+ for (const r of pruned) {
137
+ sink.emit({
138
+ kind: "prune",
139
+ commit: { shortHash: r.commit.shortHash, subject: r.commit.subject },
140
+ reason: "below topK cut",
141
+ });
142
+ }
143
+ }
144
+ return ranked.slice(0, topK);
117
145
  }
118
146
  export async function ask(question, opts) {
119
147
  const results = await search(question, opts);
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/retrieve/search.ts"],"names":[],"mappings":"AA8BA,qFAAqF;AACrF,MAAM,CAAC,MAAM,kBAAkB,GAAiD;IAC9E,UAAU,EAAE,CAAC;IACb,YAAY,EAAE,GAAG;CAClB,CAAC;AAKF;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAuB;IACxD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC;IAE9B,mEAAmE;IACnE,IAAI,GAAG,GAAG,KAAK;QAAE,OAAO,MAAM,CAAC;IAE/B,oEAAoE;IACpE,2EAA2E;IAC3E,4CAA4C;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,MAAM,GAAG,GAAG,GAAG,GAAG,QAAQ,CAAC;IAC3B,MAAM,KAAK,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,QAAQ,CAAC;IAEzD,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAClE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACpE,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAC/B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAa,EAAE,IAAmB;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACvC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAA2B,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAiB;QAC/G,IAAI,EAAE,CAAC,GAAG,CAAC;QACX,GAAG,EAAE,CAAC,CAAC,IAAI;KACZ,CAAC,CAAC,CAAC;IAEJ,IAAI,cAAc,GAA6D,EAAE,CAAC;IAClF,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,EAAE,CAAC;QAC/D,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAClD,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,IAAI,GAA+C,EAAE,CAAC;gBAC5D,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,CAAC;oBAChD,iEAAiE;oBACjE,iEAAiE;oBACjE,gEAAgE;oBAChE,8CAA8C;oBAC9C,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;wBAAE,SAAS;oBAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;oBAChC,IAAI,CAAC,IAAI,CAAC;wBACR,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAA2B,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAiB;wBAC/G,GAAG;qBACJ,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBACnC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;gBACjC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACxG,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;YACpE,iEAAiE;YACjE,cAAc,GAAG,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,iFAAiF;IACjF,gEAAgE;IAChE,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC;IAC7C,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC;QAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC;QAChD,MAAM,KAAK,GAAG,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;QAC9C,IAAI,KAAK,IAAI,KAAK;YAAE,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,SAAS,EAAE,cAAc,EAAE;QAC5D,aAAa,EAAE,CAAC,GAAG,cAAc;QACjC,cAAc;QACd,CAAC,EAAE,EAAE;KACN,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YACnD,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE;gBAC/B,MAAM;gBACN,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,aAAa,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;aACzB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;SACjC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,QAAgB,EAChB,IAAmB;IAEnB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC7C,OAAO;QACL,QAAQ;QACR,OAAO,EAAE,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC7C,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACrF,aAAa,EAAE,OAAO;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc,EAAE,IAAe;IACxD,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC;QACT,IAAI,EAAE,QAAQ;QACd,EAAE,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/C,KAAK,EAAE,MAAM,CAAC,OAAO;QACrB,GAAG,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;QACtC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;KACtD,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1E,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,IAAI;YACV,EAAE,EAAE,IAAI,MAAM,CAAC,QAAQ,EAAE;YACzB,KAAK,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO;YACvC,GAAG,EAAE,sBAAsB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,SAAS,MAAM,CAAC,QAAQ,EAAE;YAC5E,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC;SACrD,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,IAAe;IACnD,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IACjD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,sBAAsB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,WAAW,IAAI,EAAE,CAAC;IAClG,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,sBAAsB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,aAAa,IAAI,EAAE,CAAC;IACpG,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,yBAAyB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,YAAY,IAAI,EAAE,CAAC;IACzG,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB,EAAE,OAAuB;IAClE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,+CAA+C,QAAQ,iIAAiI,CAAC;IAClM,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;QACnC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;QAChF,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,IAAI,KAAK,MAAM,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACtE,CAAC,CAAC,CAAC;IACH,OAAO;QACL,SAAS,OAAO,CAAC,MAAM,6BAA6B,QAAQ,IAAI;QAChE,cAAc;QACd,GAAG,KAAK;KACT,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,CAAe,EAAE,CAAe;IACrD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACjB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACjB,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;QACf,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QACd,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAChB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC;AACvC,CAAC;AAQD,MAAM,UAAU,oBAAoB,CAClC,GAAe,EACf,GAAe,EACf,GAAiE;IAEjE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAiD,CAAC;IACrE,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,MAAM,CACb,GAAuD,EACvD,KAAkB,EAClB,GAAW;IAEX,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9B,IAAI,GAAG;QAAE,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC;;QACrB,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS;IACpC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;AACjC,CAAC;AAED,SAAS,KAAK,CAAC,CAAS,EAAE,EAAU,EAAE,EAAU;IAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/retrieve/search.ts"],"names":[],"mappings":"AAqCA,qFAAqF;AACrF,MAAM,CAAC,MAAM,kBAAkB,GAAiD;IAC9E,UAAU,EAAE,CAAC;IACb,YAAY,EAAE,GAAG;CAClB,CAAC;AAKF;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAuB;IACxD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC;IAE9B,mEAAmE;IACnE,IAAI,GAAG,GAAG,KAAK;QAAE,OAAO,MAAM,CAAC;IAE/B,oEAAoE;IACpE,2EAA2E;IAC3E,4CAA4C;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,MAAM,GAAG,GAAG,GAAG,GAAG,QAAQ,CAAC;IAC3B,MAAM,KAAK,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,QAAQ,CAAC;IAEzD,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAClE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACpE,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAC/B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAa,EAAE,IAAmB;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACvC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAA2B,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAiB;QAC/G,IAAI,EAAE,CAAC,GAAG,CAAC;QACX,GAAG,EAAE,CAAC,CAAC,IAAI;KACZ,CAAC,CAAC,CAAC;IAEJ,IAAI,cAAc,GAA6D,EAAE,CAAC;IAClF,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,EAAE,CAAC;QAC/D,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAClD,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,IAAI,GAA+C,EAAE,CAAC;gBAC5D,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,CAAC;oBAChD,iEAAiE;oBACjE,iEAAiE;oBACjE,gEAAgE;oBAChE,8CAA8C;oBAC9C,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;wBAAE,SAAS;oBAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;oBAChC,IAAI,CAAC,IAAI,CAAC;wBACR,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAA2B,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAiB;wBAC/G,GAAG;qBACJ,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBACnC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;gBACjC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACxG,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;YACpE,iEAAiE;YACjE,cAAc,GAAG,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,iFAAiF;IACjF,gEAAgE;IAChE,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC;IAC7C,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC;QAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC;QAChD,MAAM,KAAK,GAAG,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;QAC9C,IAAI,KAAK,IAAI,KAAK;YAAE,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,SAAS,EAAE,cAAc,EAAE;QAC5D,aAAa,EAAE,CAAC,GAAG,cAAc;QACjC,cAAc;QACd,CAAC,EAAE,EAAE;KACN,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YACnD,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE;gBAC/B,MAAM;gBACN,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,aAAa,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;aACzB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAE/E,0EAA0E;IAC1E,uEAAuE;IACvE,+DAA+D;IAC/D,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE;gBACpE,KAAK,EAAE,CAAC,CAAC,KAAK;aACf,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE;gBACpE,MAAM,EAAE,mBAAmB;aAC5B,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE;gBACpE,MAAM,EAAE,gBAAgB;aACzB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,QAAgB,EAChB,IAAmB;IAEnB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC7C,OAAO;QACL,QAAQ;QACR,OAAO,EAAE,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC7C,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACrF,aAAa,EAAE,OAAO;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc,EAAE,IAAe;IACxD,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC;QACT,IAAI,EAAE,QAAQ;QACd,EAAE,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/C,KAAK,EAAE,MAAM,CAAC,OAAO;QACrB,GAAG,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;QACtC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;KACtD,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1E,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,IAAI;YACV,EAAE,EAAE,IAAI,MAAM,CAAC,QAAQ,EAAE;YACzB,KAAK,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO;YACvC,GAAG,EAAE,sBAAsB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,SAAS,MAAM,CAAC,QAAQ,EAAE;YAC5E,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC;SACrD,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,IAAe;IACnD,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IACjD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,sBAAsB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,WAAW,IAAI,EAAE,CAAC;IAClG,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,sBAAsB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,aAAa,IAAI,EAAE,CAAC;IACpG,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,yBAAyB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,YAAY,IAAI,EAAE,CAAC;IACzG,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB,EAAE,OAAuB;IAClE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,+CAA+C,QAAQ,iIAAiI,CAAC;IAClM,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;QACnC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;QAChF,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,IAAI,KAAK,MAAM,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACtE,CAAC,CAAC,CAAC;IACH,OAAO;QACL,SAAS,OAAO,CAAC,MAAM,6BAA6B,QAAQ,IAAI;QAChE,cAAc;QACd,GAAG,KAAK;KACT,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,CAAe,EAAE,CAAe;IACrD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACjB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACjB,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;QACf,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QACd,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAChB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC;AACvC,CAAC;AAQD,MAAM,UAAU,oBAAoB,CAClC,GAAe,EACf,GAAe,EACf,GAAiE;IAEjE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAiD,CAAC;IACrE,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,MAAM,CACb,GAAuD,EACvD,KAAkB,EAClB,GAAW;IAEX,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9B,IAAI,GAAG;QAAE,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC;;QACrB,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS;IACpC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;AACjC,CAAC;AAED,SAAS,KAAK,CAAC,CAAS,EAAE,EAAU,EAAE,EAAU;IAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Speculative-reasoning event stream — pub/sub layer for the retrieval
3
+ * pipeline so callers (CLI, MCP, audit logs) can render the model's "thought
4
+ * trace" in real time, not just the final answer.
5
+ *
6
+ * Inspired by the KAT-0B Try / Accept / Contradiction / Backtrack / Solved
7
+ * trace. In Mneme's flavor:
8
+ * - `consider` — a candidate commit was scored
9
+ * - `accept` — the candidate cleared the score floor
10
+ * - `prune` — the candidate was rejected (with a human reason)
11
+ * - `contradict` — two commits disagree on the verdict
12
+ * - `backtrack` — the synthesizer abandoned a hypothesis
13
+ * - `synthesize` — the LLM was invoked with N citations
14
+ * - `verify` — Leviathan verified (or rejected) a single claim
15
+ * - `done` — the pipeline finished (with total wallclock)
16
+ *
17
+ * Sinks are intentionally trivial. The `EventSink` interface keeps core
18
+ * dependency-free; callers wire in callbacks (CLI), arrays (tests), or null
19
+ * (production-quiet).
20
+ */
21
+ export type StreamEvent = {
22
+ kind: "consider";
23
+ commit: {
24
+ shortHash: string;
25
+ subject: string;
26
+ };
27
+ score: number;
28
+ } | {
29
+ kind: "accept";
30
+ commit: {
31
+ shortHash: string;
32
+ subject: string;
33
+ };
34
+ reason: string;
35
+ } | {
36
+ kind: "prune";
37
+ commit: {
38
+ shortHash: string;
39
+ subject: string;
40
+ };
41
+ reason: string;
42
+ } | {
43
+ kind: "contradict";
44
+ commit: {
45
+ shortHash: string;
46
+ subject: string;
47
+ };
48
+ against: string;
49
+ } | {
50
+ kind: "backtrack";
51
+ from: string;
52
+ to: string;
53
+ } | {
54
+ kind: "synthesize";
55
+ citationsCount: number;
56
+ } | {
57
+ kind: "verify";
58
+ claim: string;
59
+ ok: boolean;
60
+ reason?: string;
61
+ } | {
62
+ kind: "done";
63
+ durationMs: number;
64
+ };
65
+ /**
66
+ * Output port for stream events. Implementations decide where events go —
67
+ * stdout, an array, a websocket, or /dev/null.
68
+ */
69
+ export interface EventSink {
70
+ emit(ev: StreamEvent): void;
71
+ }
72
+ /** Quiet sink — drops everything. The default. */
73
+ export declare class NullSink implements EventSink {
74
+ emit(_: StreamEvent): void;
75
+ }
76
+ /** Test-friendly sink — appends to an in-memory array for assertions. */
77
+ export declare class InMemorySink implements EventSink {
78
+ events: StreamEvent[];
79
+ emit(ev: StreamEvent): void;
80
+ /** Convenience: filter events by kind, useful in tests. */
81
+ byKind<K extends StreamEvent["kind"]>(kind: K): Array<Extract<StreamEvent, {
82
+ kind: K;
83
+ }>>;
84
+ /** Reset between test cases without re-allocating the sink. */
85
+ clear(): void;
86
+ }
87
+ /** Callback sink — bridge to external transports (CLI renderer, MCP). */
88
+ export declare class CallbackSink implements EventSink {
89
+ private readonly cb;
90
+ constructor(cb: (e: StreamEvent) => void);
91
+ emit(ev: StreamEvent): void;
92
+ }
93
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/retrieve/stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnF;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClF;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjF;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACvF;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,CAAC;CAC7B;AAED,kDAAkD;AAClD,qBAAa,QAAS,YAAW,SAAS;IACxC,IAAI,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI;CAG3B;AAED,yEAAyE;AACzE,qBAAa,YAAa,YAAW,SAAS;IAC5C,MAAM,EAAE,WAAW,EAAE,CAAM;IAC3B,IAAI,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAI3B,2DAA2D;IAC3D,MAAM,CAAC,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC,CAAC;IAMxF,+DAA+D;IAC/D,KAAK,IAAI,IAAI;CAGd;AAED,yEAAyE;AACzE,qBAAa,YAAa,YAAW,SAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,KAAK,IAAI;IACzD,IAAI,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;CAG5B"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Speculative-reasoning event stream — pub/sub layer for the retrieval
3
+ * pipeline so callers (CLI, MCP, audit logs) can render the model's "thought
4
+ * trace" in real time, not just the final answer.
5
+ *
6
+ * Inspired by the KAT-0B Try / Accept / Contradiction / Backtrack / Solved
7
+ * trace. In Mneme's flavor:
8
+ * - `consider` — a candidate commit was scored
9
+ * - `accept` — the candidate cleared the score floor
10
+ * - `prune` — the candidate was rejected (with a human reason)
11
+ * - `contradict` — two commits disagree on the verdict
12
+ * - `backtrack` — the synthesizer abandoned a hypothesis
13
+ * - `synthesize` — the LLM was invoked with N citations
14
+ * - `verify` — Leviathan verified (or rejected) a single claim
15
+ * - `done` — the pipeline finished (with total wallclock)
16
+ *
17
+ * Sinks are intentionally trivial. The `EventSink` interface keeps core
18
+ * dependency-free; callers wire in callbacks (CLI), arrays (tests), or null
19
+ * (production-quiet).
20
+ */
21
+ /** Quiet sink — drops everything. The default. */
22
+ export class NullSink {
23
+ emit(_) {
24
+ /* intentionally empty */
25
+ }
26
+ }
27
+ /** Test-friendly sink — appends to an in-memory array for assertions. */
28
+ export class InMemorySink {
29
+ events = [];
30
+ emit(ev) {
31
+ this.events.push(ev);
32
+ }
33
+ /** Convenience: filter events by kind, useful in tests. */
34
+ byKind(kind) {
35
+ return this.events.filter((e) => e.kind === kind);
36
+ }
37
+ /** Reset between test cases without re-allocating the sink. */
38
+ clear() {
39
+ this.events = [];
40
+ }
41
+ }
42
+ /** Callback sink — bridge to external transports (CLI renderer, MCP). */
43
+ export class CallbackSink {
44
+ cb;
45
+ constructor(cb) {
46
+ this.cb = cb;
47
+ }
48
+ emit(ev) {
49
+ this.cb(ev);
50
+ }
51
+ }
52
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/retrieve/stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAoBH,kDAAkD;AAClD,MAAM,OAAO,QAAQ;IACnB,IAAI,CAAC,CAAc;QACjB,yBAAyB;IAC3B,CAAC;CACF;AAED,yEAAyE;AACzE,MAAM,OAAO,YAAY;IACvB,MAAM,GAAkB,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAe;QAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;IAED,2DAA2D;IAC3D,MAAM,CAAgC,IAAO;QAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAE/C,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;CACF;AAED,yEAAyE;AACzE,MAAM,OAAO,YAAY;IACM;IAA7B,YAA6B,EAA4B;QAA5B,OAAE,GAAF,EAAE,CAA0B;IAAG,CAAC;IAC7D,IAAI,CAAC,EAAe;QAClB,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stream.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.test.d.ts","sourceRoot":"","sources":["../../src/retrieve/stream.test.ts"],"names":[],"mappings":""}