opencode-harnmem 0.0.0-stage → 0.1.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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +45 -2
  3. package/index.js +512 -0
  4. package/lib/engine.mjs +72 -0
  5. package/lib/format.mjs +119 -0
  6. package/lib/settings.mjs +131 -0
  7. package/package.json +23 -3
  8. package/vendor/core/assets.d.ts +52 -0
  9. package/vendor/core/assets.d.ts.map +1 -0
  10. package/vendor/core/assets.js +227 -0
  11. package/vendor/core/assets.js.map +1 -0
  12. package/vendor/core/config.d.ts +36 -0
  13. package/vendor/core/config.d.ts.map +1 -0
  14. package/vendor/core/config.js +134 -0
  15. package/vendor/core/config.js.map +1 -0
  16. package/vendor/core/consolidate.d.ts +14 -0
  17. package/vendor/core/consolidate.d.ts.map +1 -0
  18. package/vendor/core/consolidate.js +237 -0
  19. package/vendor/core/consolidate.js.map +1 -0
  20. package/vendor/core/data/synonyms.en.txt +61 -0
  21. package/vendor/core/data/synonyms.zh.txt +157 -0
  22. package/vendor/core/extract.d.ts +49 -0
  23. package/vendor/core/extract.d.ts.map +1 -0
  24. package/vendor/core/extract.js +179 -0
  25. package/vendor/core/extract.js.map +1 -0
  26. package/vendor/core/frontmatter.d.ts +31 -0
  27. package/vendor/core/frontmatter.d.ts.map +1 -0
  28. package/vendor/core/frontmatter.js +372 -0
  29. package/vendor/core/frontmatter.js.map +1 -0
  30. package/vendor/core/harnmem.d.ts +87 -0
  31. package/vendor/core/harnmem.d.ts.map +1 -0
  32. package/vendor/core/harnmem.js +918 -0
  33. package/vendor/core/harnmem.js.map +1 -0
  34. package/vendor/core/hot-context.d.ts +28 -0
  35. package/vendor/core/hot-context.d.ts.map +1 -0
  36. package/vendor/core/hot-context.js +179 -0
  37. package/vendor/core/hot-context.js.map +1 -0
  38. package/vendor/core/index.d.ts +16 -0
  39. package/vendor/core/index.d.ts.map +1 -0
  40. package/vendor/core/index.js +10 -0
  41. package/vendor/core/index.js.map +1 -0
  42. package/vendor/core/indexer.d.ts +107 -0
  43. package/vendor/core/indexer.d.ts.map +1 -0
  44. package/vendor/core/indexer.js +282 -0
  45. package/vendor/core/indexer.js.map +1 -0
  46. package/vendor/core/inspect.d.ts +278 -0
  47. package/vendor/core/inspect.d.ts.map +1 -0
  48. package/vendor/core/inspect.js +643 -0
  49. package/vendor/core/inspect.js.map +1 -0
  50. package/vendor/core/lifecycle.d.ts +50 -0
  51. package/vendor/core/lifecycle.d.ts.map +1 -0
  52. package/vendor/core/lifecycle.js +249 -0
  53. package/vendor/core/lifecycle.js.map +1 -0
  54. package/vendor/core/project.d.ts +41 -0
  55. package/vendor/core/project.d.ts.map +1 -0
  56. package/vendor/core/project.js +197 -0
  57. package/vendor/core/project.js.map +1 -0
  58. package/vendor/core/prompts/README.md +96 -0
  59. package/vendor/core/prompts/consolidate-digest.md +31 -0
  60. package/vendor/core/prompts/extract.md +80 -0
  61. package/vendor/core/prompts/migrate.md +96 -0
  62. package/vendor/core/prompts/synonyms.md +43 -0
  63. package/vendor/core/prompts/write-policy.md +12 -0
  64. package/vendor/core/retrieval.d.ts +95 -0
  65. package/vendor/core/retrieval.d.ts.map +1 -0
  66. package/vendor/core/retrieval.js +569 -0
  67. package/vendor/core/retrieval.js.map +1 -0
  68. package/vendor/core/store.d.ts +145 -0
  69. package/vendor/core/store.d.ts.map +1 -0
  70. package/vendor/core/store.js +511 -0
  71. package/vendor/core/store.js.map +1 -0
  72. package/vendor/core/suggest.d.ts +128 -0
  73. package/vendor/core/suggest.d.ts.map +1 -0
  74. package/vendor/core/suggest.js +384 -0
  75. package/vendor/core/suggest.js.map +1 -0
  76. package/vendor/core/text.d.ts +80 -0
  77. package/vendor/core/text.d.ts.map +1 -0
  78. package/vendor/core/text.js +253 -0
  79. package/vendor/core/text.js.map +1 -0
  80. package/vendor/core/types.d.ts +453 -0
  81. package/vendor/core/types.d.ts.map +1 -0
  82. package/vendor/core/types.js +14 -0
  83. package/vendor/core/types.js.map +1 -0
  84. package/vendor/core/util.d.ts +38 -0
  85. package/vendor/core/util.d.ts.map +1 -0
  86. package/vendor/core/util.js +248 -0
  87. package/vendor/core/util.js.map +1 -0
@@ -0,0 +1,569 @@
1
+ import { budgetOf, retrievalOf } from "./config.js";
2
+ import { expandQueryTerms, extractSnippet, parseTimeExpression, tokenize } from "./text.js";
3
+ import { isStale } from "./lifecycle.js";
4
+ import { clamp, estimateTokens, jaccard, sortedUnique } from "./util.js";
5
+ const HOUR = 3600000;
6
+ /**
7
+ * Synonym-expanded query terms are weaker evidence than the user's own words.
8
+ * They still count for candidate discovery and for an expansion-only match
9
+ * (otherwise a "go live" -> "deploy" query would abstain), but at 35% so an exact
10
+ * rare-token hit (S9 longtail) is never outranked by a synonym strong distractor.
11
+ */
12
+ const EXPANSION_EVIDENCE_WEIGHT = 0.35;
13
+ export class Retriever {
14
+ deps;
15
+ pendingUsage = new Map();
16
+ constructor(deps) {
17
+ this.deps = deps;
18
+ }
19
+ setConfig(config) {
20
+ this.deps.config = config;
21
+ }
22
+ now() {
23
+ return (this.deps.config.now ?? Date.now)();
24
+ }
25
+ pendingUsageUpdates() {
26
+ return this.pendingUsage;
27
+ }
28
+ resetUsage() {
29
+ this.pendingUsage = new Map();
30
+ }
31
+ shards(opts = {}) {
32
+ const scope = opts.scope ?? "all";
33
+ const project = opts.project ?? this.deps.getProjectId();
34
+ const out = [];
35
+ if (scope === "all" || scope === "user")
36
+ out.push({ scope: "user", name: "user" });
37
+ if ((scope === "all" || scope === "project") && project)
38
+ out.push({ scope: "project", project, name: project });
39
+ return out;
40
+ }
41
+ queryTerms(query) {
42
+ const config = retrievalOf(this.deps.config);
43
+ const base = sortedUnique(tokenize(query, { stopwords: true, query: true }));
44
+ if (!config.synonyms)
45
+ return base;
46
+ let synonyms = new Map();
47
+ try {
48
+ synonyms = this.deps.loadSynonyms();
49
+ }
50
+ catch {
51
+ synonyms = new Map();
52
+ }
53
+ return sortedUnique(expandQueryTerms(base, synonyms));
54
+ }
55
+ /** Original (non-synonym-expanded) query terms; used for ranking strength. */
56
+ baseQueryTerms(query) {
57
+ return sortedUnique(tokenize(query, { stopwords: true, query: true }));
58
+ }
59
+ /**
60
+ * Eligibility filter shared by lexical scoring and link diffusion. Kept out
61
+ * of the per-shard scorer so link-boosted docs get the same status/as-of/
62
+ * entity/time-window treatment as lexically matched ones.
63
+ */
64
+ isEligible(doc, opts) {
65
+ if (doc.status === "dropped")
66
+ return false;
67
+ const allowedStatus = opts.includeArchived
68
+ ? doc.status !== "dropped"
69
+ : opts.includeSuperseded || opts.asOf !== undefined
70
+ ? doc.status === "active" || doc.status === "superseded"
71
+ : doc.status === "active";
72
+ if (!allowedStatus)
73
+ return false;
74
+ if (opts.asOf !== undefined) {
75
+ if (doc.validFrom > opts.asOf)
76
+ return false;
77
+ if (doc.validTo !== null && doc.validTo > opts.asOf)
78
+ return false;
79
+ }
80
+ if (opts.entity && !doc.entities.some((e) => e.toLowerCase().includes(opts.entity)))
81
+ return false;
82
+ if (opts.timeWindow) {
83
+ const anchor = doc.lastUsed || doc.updated || doc.created;
84
+ if (anchor < opts.timeWindow.from || anchor > opts.timeWindow.to)
85
+ return false;
86
+ }
87
+ return true;
88
+ }
89
+ /**
90
+ * Final score for one candidate. `lex` combines relative BM25 strength with
91
+ * BM25 saturation: raw/(raw+2) alone loses the exact-rare-token advantage
92
+ * (S9: gold raw 37.9 -> .950 vs distractor .919); minmax/maxRaw separates the
93
+ * best match (gold ~.95 vs distractor ~.31) while absolute weak matches stay
94
+ * low. ScoreParts.lex remains 0..1.
95
+ */
96
+ buildCandidate(index, docIdx, raw, maxRaw, link, weights) {
97
+ const config = this.deps.config;
98
+ const retrieval = retrievalOf(config);
99
+ const now = this.now();
100
+ const doc = index.docs[docIdx];
101
+ const anchor = doc.lastUsed || doc.updated || doc.created;
102
+ const hours = Math.max(0, (now - anchor) / HOUR);
103
+ const lex = raw > 0 && maxRaw > 0 ? (raw / maxRaw) * (raw / (raw + 2)) : 0;
104
+ // `raw` here is *effective* lexical evidence: base-term BM25 plus a discounted
105
+ // share of synonym-expanded matches (see EXPANSION_EVIDENCE_WEIGHT). This keeps
106
+ // the exact-rare-token ranking of S9 while leaving expansion-only hits above the
107
+ // abstain threshold.
108
+ const parts = {
109
+ lex,
110
+ imp: clamp(doc.importance / 10, 0, 1),
111
+ conf: clamp(doc.confidence, 0, 1),
112
+ rec: Math.pow(retrieval.decayPerHour, hours),
113
+ use: clamp(Math.log1p(doc.usedCount) / Math.log1p(20), 0, 1),
114
+ pin: doc.pinned ? 1 : 0,
115
+ link: clamp(link, 0, 1),
116
+ stale: isStale(fakeRecord(doc), now, config) ? 1 : 0,
117
+ total: 0,
118
+ };
119
+ const score = weights.lex * parts.lex +
120
+ weights.imp * parts.imp +
121
+ weights.conf * parts.conf +
122
+ weights.rec * parts.rec +
123
+ weights.use * parts.use +
124
+ weights.pin * parts.pin +
125
+ weights.link * parts.link -
126
+ weights.stale * parts.stale;
127
+ parts.total = Number(score.toFixed(6));
128
+ return { doc, score, parts, index, docIdx };
129
+ }
130
+ async search(opts) {
131
+ const started = Date.now();
132
+ const config = this.deps.config;
133
+ const retrieval = retrievalOf(config);
134
+ const now = this.now();
135
+ const query = (opts.query ?? "").trim();
136
+ const limit = clamp(opts.limit ?? 8, 1, 50);
137
+ const asOf = opts.asOf === undefined
138
+ ? undefined
139
+ : typeof opts.asOf === "number"
140
+ ? opts.asOf
141
+ : parseAsOfSafe(opts.asOf, now);
142
+ const timeWindow = parseTimeExpression(query, now);
143
+ const terms = this.queryTerms(query);
144
+ const baseTerms = this.baseQueryTerms(query);
145
+ const weights = { ...retrieval.weights, ...(opts.weights ?? {}) };
146
+ const shards = opts.includeArchived ? await this.deps.store.listShards() : this.shards(opts);
147
+ const indexes = [];
148
+ for (const shard of shards)
149
+ indexes.push(await this.deps.index.get(shard));
150
+ const eligible = {
151
+ asOf,
152
+ includeSuperseded: Boolean(opts.includeHistory || opts.asOf),
153
+ includeArchived: Boolean(opts.includeArchived),
154
+ timeWindow,
155
+ entity: opts.entity,
156
+ };
157
+ const bm25 = { k1: retrieval.k1, b: retrieval.b };
158
+ // Pass 1: lexical scan across every loaded shard. Candidate discovery uses
159
+ // all query terms (including synonym expansions), but every candidate also
160
+ // carries a base-term score: synonym-only matches should not outrank an
161
+ // exact rare-token hit. Build the cross-shard id -> location map once so
162
+ // link hops can jump from a project doc to a user doc in O(1).
163
+ const where = new Map();
164
+ const lexical = new Map();
165
+ let maxRaw = 0;
166
+ for (const index of indexes) {
167
+ index.docs.forEach((doc, docIdx) => {
168
+ if (!this.isEligible(doc, eligible))
169
+ return;
170
+ if (!where.has(doc.id))
171
+ where.set(doc.id, { index, docIdx });
172
+ if (terms.length === 0)
173
+ return;
174
+ const raw = index.score(terms, docIdx, bm25);
175
+ if (raw <= 0)
176
+ return;
177
+ const rawBase = baseTerms.length === terms.length ? raw : index.score(baseTerms, docIdx, bm25);
178
+ const evidence = rawBase + EXPANSION_EVIDENCE_WEIGHT * Math.max(0, raw - rawBase);
179
+ lexical.set(doc.id, { index, docIdx, doc, raw, evidence });
180
+ if (evidence > maxRaw)
181
+ maxRaw = evidence;
182
+ });
183
+ }
184
+ // Pass 2: two-hop link diffusion from the strongest raw hits (top-5 across
185
+ // all shards). A direct neighbor gets full hop-1 evidence and a 2-hop target
186
+ // gets half; targets may live in any loaded shard. Adjacency maps keep each
187
+ // hop O(degree). Full hop-1 weight is what lets a user-scope reference
188
+ // record (linked from a project decision) enter the top-10 next to its
189
+ // anchor in S5-style "the two belong together" questions.
190
+ const linkBoost = new Map();
191
+ if (terms.length > 0 && retrieval.linkDiffusion && lexical.size > 0) {
192
+ const seeds = [...lexical.values()]
193
+ .sort((a, b) => b.evidence - a.evidence || a.doc.id.localeCompare(b.doc.id))
194
+ .slice(0, 5);
195
+ const seedIds = new Set(seeds.map((seed) => seed.doc.id));
196
+ const hop1 = new Map();
197
+ const hop2 = new Map();
198
+ for (const seed of seeds) {
199
+ for (const neighbor of seed.index.linkNeighbors(seed.doc.id)) {
200
+ if (seedIds.has(neighbor))
201
+ continue;
202
+ if (!hop1.has(neighbor))
203
+ hop1.set(neighbor, 1.0);
204
+ const location = where.get(neighbor);
205
+ if (!location)
206
+ continue;
207
+ for (const second of location.index.linkNeighbors(neighbor)) {
208
+ if (seedIds.has(second) || hop1.has(second))
209
+ continue;
210
+ if (!hop2.has(second))
211
+ hop2.set(second, 0.5);
212
+ }
213
+ }
214
+ }
215
+ for (const [id, boost] of hop1)
216
+ linkBoost.set(id, Math.max(linkBoost.get(id) ?? 0, boost));
217
+ for (const [id, boost] of hop2)
218
+ linkBoost.set(id, Math.max(linkBoost.get(id) ?? 0, boost));
219
+ }
220
+ // Pass 3: score lexical candidates plus link-only candidates.
221
+ const candidates = [];
222
+ const added = new Set();
223
+ for (const entry of lexical.values()) {
224
+ candidates.push(this.buildCandidate(entry.index, entry.docIdx, entry.evidence, maxRaw, linkBoost.get(entry.doc.id) ?? 0, weights));
225
+ added.add(entry.doc.id);
226
+ }
227
+ for (const [id, boost] of linkBoost) {
228
+ if (added.has(id))
229
+ continue;
230
+ const location = where.get(id);
231
+ if (!location)
232
+ continue;
233
+ candidates.push(this.buildCandidate(location.index, location.docIdx, 0, maxRaw, boost, weights));
234
+ added.add(id);
235
+ }
236
+ candidates.sort((a, b) => b.score - a.score || a.doc.id.localeCompare(b.doc.id));
237
+ // Cap the MMR pool: diversification is O(pool * picked * jaccard), and S9
238
+ // produced ~2500 candidates (~170ms/query). Keep the strongest
239
+ // max(limit*10, 80); the sort above makes the cut deterministic.
240
+ const poolCap = Math.max(limit * 10, 80);
241
+ const pool = candidates.slice(0, poolCap);
242
+ const diversified = retrieval.mmr ? this.mmr(pool, limit, retrieval.mmrLambda) : pool.slice(0, limit);
243
+ const budget = budgetOf(config).searchTokens;
244
+ const picked = [];
245
+ let tokens = 0;
246
+ for (const candidate of diversified) {
247
+ const cost = this.renderHitCost(candidate);
248
+ if (picked.length > 0 && tokens + cost > budget)
249
+ break;
250
+ picked.push(candidate);
251
+ tokens += cost;
252
+ }
253
+ const abstained = this.shouldAbstain(terms, picked, query);
254
+ if (abstained) {
255
+ return {
256
+ query,
257
+ total: 0,
258
+ results: [],
259
+ abstained: true,
260
+ debug: opts.debug
261
+ ? { candidateCount: candidates.length, truncated: [], elapsedMs: Date.now() - started, shards: shards.map((s) => s.name) }
262
+ : undefined,
263
+ };
264
+ }
265
+ const results = [];
266
+ for (const candidate of picked) {
267
+ const shard = {
268
+ scope: candidate.doc.scope,
269
+ project: candidate.doc.project,
270
+ name: candidate.doc.shard,
271
+ };
272
+ const record = await this.deps.store.readRecord(shard, candidate.doc.id);
273
+ const snippet = record ? extractSnippet(record.content, 400) : candidate.doc.description;
274
+ results.push({
275
+ id: candidate.doc.id,
276
+ type: candidate.doc.type,
277
+ category: candidate.doc.category,
278
+ scope: candidate.doc.scope,
279
+ project: candidate.doc.project,
280
+ title: candidate.doc.title,
281
+ description: candidate.doc.description,
282
+ snippet,
283
+ score: Number(candidate.score.toFixed(4)),
284
+ status: candidate.doc.status,
285
+ pinned: candidate.doc.pinned,
286
+ historical: candidate.doc.status !== "active",
287
+ updated: candidate.doc.updated,
288
+ parts: opts.debug ? candidate.parts : undefined,
289
+ });
290
+ this.noteUsage(candidate.doc.id, candidate.doc.usedCount, now);
291
+ }
292
+ return {
293
+ query,
294
+ total: candidates.length,
295
+ results,
296
+ abstained: false,
297
+ debug: opts.debug
298
+ ? { candidateCount: candidates.length, truncated: [], elapsedMs: Date.now() - started, shards: shards.map((s) => s.name) }
299
+ : undefined,
300
+ };
301
+ }
302
+ shouldAbstain(terms, picked, query) {
303
+ if (!query)
304
+ return false;
305
+ if (terms.length === 0)
306
+ return true;
307
+ const top = picked[0];
308
+ if (!top)
309
+ return true;
310
+ if (top.doc.pinned || top.parts.pin > 0)
311
+ return false;
312
+ const threshold = retrievalOf(this.deps.config).abstainLex;
313
+ return top.parts.lex < threshold && top.parts.link === 0;
314
+ }
315
+ mmr(candidates, limit, lambda) {
316
+ const chosen = [];
317
+ const pool = [...candidates];
318
+ // docTerms are long arrays (dozens of CJK n-grams); jaccard() would allocate
319
+ // two Sets per comparison — O(pool * picked) allocations per query. Materialize
320
+ // each candidate's set once and reuse it for every comparison.
321
+ const termSets = new Map();
322
+ const setOf = (candidate) => {
323
+ let set = termSets.get(candidate);
324
+ if (!set) {
325
+ set = new Set(candidate.index.docTerms[candidate.docIdx] ?? []);
326
+ termSets.set(candidate, set);
327
+ }
328
+ return set;
329
+ };
330
+ while (pool.length > 0 && chosen.length < limit) {
331
+ let bestIdx = 0;
332
+ let bestValue = Number.NEGATIVE_INFINITY;
333
+ for (let i = 0; i < pool.length; i++) {
334
+ const candidate = pool[i];
335
+ let maxSim = 0;
336
+ for (const picked of chosen) {
337
+ const sim = jaccard(setOf(candidate), setOf(picked));
338
+ if (sim > maxSim)
339
+ maxSim = sim;
340
+ }
341
+ const value = lambda * candidate.score - (1 - lambda) * maxSim;
342
+ if (value > bestValue) {
343
+ bestValue = value;
344
+ bestIdx = i;
345
+ }
346
+ }
347
+ chosen.push(pool.splice(bestIdx, 1)[0]);
348
+ }
349
+ return chosen;
350
+ }
351
+ renderHitCost(candidate) {
352
+ const line = `- [${candidate.doc.type}] ${candidate.doc.title} — ${candidate.doc.description}`;
353
+ return estimateTokens(line) + 20;
354
+ }
355
+ noteUsage(id, usedCount, now) {
356
+ this.pendingUsage.set(id, { lastUsed: now, usedCount: usedCount + 1 });
357
+ }
358
+ /** Read one memory (optionally as-of a historical time). */
359
+ async read(id, opts = {}) {
360
+ const shard = await this.findShardFor(id);
361
+ if (!shard)
362
+ return null;
363
+ let record = await this.deps.store.readRecord(shard, id);
364
+ if (!record)
365
+ return null;
366
+ const index = await this.deps.index.get(shard);
367
+ const result = { record, backlinks: index.backlinks(id) };
368
+ if (opts.includeHistory) {
369
+ const chain = [];
370
+ let cursor = record;
371
+ const seen = new Set();
372
+ while (cursor && !seen.has(cursor.id)) {
373
+ seen.add(cursor.id);
374
+ chain.push(cursor);
375
+ if (!cursor.supersededBy)
376
+ break;
377
+ const next = await this.deps.store.findRecord(cursor.supersededBy);
378
+ cursor = next ? next.record : null;
379
+ }
380
+ result.history = chain;
381
+ }
382
+ if (opts.asOf !== undefined) {
383
+ const asOf = typeof opts.asOf === "number" ? opts.asOf : parseAsOfSafe(opts.asOf, this.now());
384
+ let bestVersion = null;
385
+ for (const scanShard of await this.deps.store.listShards()) {
386
+ const { records } = await this.deps.store.readShard(scanShard);
387
+ for (const candidate of records) {
388
+ const related = candidate.id === id || candidate.supersededBy === id || record.supersedes.includes(candidate.id);
389
+ if (!related)
390
+ continue;
391
+ if (candidate.validFrom > asOf)
392
+ continue;
393
+ if (candidate.validTo !== null && candidate.validTo <= asOf)
394
+ continue;
395
+ if (!bestVersion || candidate.validFrom > bestVersion.validFrom)
396
+ bestVersion = candidate;
397
+ }
398
+ }
399
+ if (bestVersion)
400
+ result.record = bestVersion;
401
+ else
402
+ result.record = { ...record, status: "archived" };
403
+ }
404
+ return result;
405
+ }
406
+ async findShardFor(id) {
407
+ const project = this.deps.getProjectId();
408
+ const ordered = project
409
+ ? [{ scope: "project", project, name: project }, { scope: "user", name: "user" }]
410
+ : [{ scope: "user", name: "user" }];
411
+ for (const shard of ordered) {
412
+ if (await this.deps.store.readRecord(shard, id))
413
+ return shard;
414
+ }
415
+ for (const shard of await this.deps.store.listShards()) {
416
+ if (await this.deps.store.readRecord(shard, id))
417
+ return shard;
418
+ }
419
+ return null;
420
+ }
421
+ /**
422
+ * Build the injected markdown block. Deterministic given (store, config,
423
+ * project, now-second): the adapter caches it to keep the prompt prefix
424
+ * byte-stable between turns.
425
+ */
426
+ async buildContext(reason = "session_start") {
427
+ const config = this.deps.config;
428
+ const now = this.now();
429
+ const budgetConfig = budgetOf(config);
430
+ const shards = this.shards();
431
+ const indexes = [];
432
+ for (const shard of shards)
433
+ indexes.push(await this.deps.index.get(shard));
434
+ const docs = indexes.flatMap((index) => index.docs);
435
+ const digests = [];
436
+ for (const shard of shards) {
437
+ for (const digest of await this.deps.store.listDigests(shard)) {
438
+ digests.push({ title: digest.title, body: digest.body });
439
+ }
440
+ }
441
+ const layout = layoutHotContext(docs, digests, {
442
+ now,
443
+ budgetTokens: budgetConfig.injectTokens,
444
+ maxPinned: budgetConfig.maxPinned,
445
+ hotEntries: budgetConfig.hotEntries,
446
+ decayPerHour: retrievalOf(config).decayPerHour,
447
+ });
448
+ if (!layout.hasContent) {
449
+ return { text: "", reason, snapshotAt: now, ids: [], tokensEstimate: 0 };
450
+ }
451
+ const text = renderContextText(layout.sections);
452
+ return { text, reason, snapshotAt: now, ids: layout.ids, tokensEstimate: estimateTokens(text) };
453
+ }
454
+ }
455
+ export const CONTEXT_HEADER = "## HarnMem memory (cross-harness; stable snapshot)";
456
+ export const CONTEXT_FOOTER = "<!-- SSOT: ~/.harnmem. Use memory_search for details; never invent memory ids. Snapshot refreshes on session start, after memory writes and at day rollover. -->";
457
+ /**
458
+ * Deterministic hot-index layout shared by the async engine path and the
459
+ * synchronous cold-start fallback (see `hot-context.ts`). Pure function: given
460
+ * the same docs/digests/options it renders identical bytes, which keeps the
461
+ * injected block byte-stable across harness restarts.
462
+ */
463
+ export function layoutHotContext(docs, digests, options) {
464
+ const { now, budgetTokens, maxPinned, hotEntries, decayPerHour } = options;
465
+ const active = docs.filter((doc) => doc.status === "active");
466
+ const ids = [];
467
+ const lines = [];
468
+ let tokens = 0;
469
+ const contextScore = (doc) => {
470
+ const anchor = doc.lastUsed || doc.updated || doc.created;
471
+ const rec = Math.pow(decayPerHour, Math.max(0, (now - anchor) / HOUR));
472
+ const use = clamp(Math.log1p(doc.usedCount) / Math.log1p(20), 0, 1);
473
+ return 0.55 * (doc.importance / 10) + 0.2 * doc.confidence + 0.1 * rec + 0.1 * use + 0.05 * (doc.pinned ? 1 : 0);
474
+ };
475
+ const pinned = active
476
+ .filter((doc) => doc.pinned)
477
+ .sort((a, b) => b.importance - a.importance || b.updated - a.updated || a.id.localeCompare(b.id))
478
+ .slice(0, maxPinned);
479
+ const pinnedIds = new Set(pinned.map((doc) => doc.id));
480
+ for (const doc of pinned) {
481
+ const line = `- 📌 [${doc.type}] ${doc.title} — ${doc.description}`;
482
+ tokens += estimateTokens(line);
483
+ ids.push(doc.id);
484
+ lines.push(line);
485
+ }
486
+ const pool = active
487
+ .filter((doc) => !pinnedIds.has(doc.id))
488
+ .sort((a, b) => contextScore(b) - contextScore(a) || b.updated - a.updated || a.id.localeCompare(b.id));
489
+ let added = 0;
490
+ for (const doc of pool) {
491
+ if (added >= Math.max(0, hotEntries - pinned.length))
492
+ break;
493
+ const line = `- [${doc.type}] ${doc.title} — ${doc.description}`;
494
+ const cost = estimateTokens(line);
495
+ if (tokens + cost > budgetTokens)
496
+ break;
497
+ lines.push(line);
498
+ ids.push(doc.id);
499
+ tokens += cost;
500
+ added++;
501
+ }
502
+ const digestLines = [];
503
+ for (const digest of digests) {
504
+ const line = `- ${digest.title}: ${extractSnippet(digest.body, 160)}`;
505
+ const cost = estimateTokens(line);
506
+ if (tokens + cost > budgetTokens)
507
+ break;
508
+ digestLines.push(line);
509
+ tokens += cost;
510
+ }
511
+ const sections = [];
512
+ if (lines.length > 0)
513
+ sections.push(...lines);
514
+ if (digestLines.length > 0)
515
+ sections.push("### Digests", ...digestLines);
516
+ return { sections, ids, tokensEstimate: tokens, hasContent: sections.length > 0 };
517
+ }
518
+ /** Render the exact injected block around a hot-index layout. */
519
+ export function renderContextText(sections) {
520
+ return `${CONTEXT_HEADER}\n\n${sections.join("\n")}\n\n${CONTEXT_FOOTER}`;
521
+ }
522
+ function parseAsOfSafe(value, fallback) {
523
+ if (typeof value === "number" && Number.isFinite(value))
524
+ return value;
525
+ if (typeof value === "string") {
526
+ const trimmed = value.trim();
527
+ if (/^\d{4}-\d{2}-\d{2}$/.test(trimmed)) {
528
+ const ts = Date.parse(`${trimmed}T23:59:59.999Z`);
529
+ if (Number.isFinite(ts))
530
+ return ts;
531
+ }
532
+ const ts = Date.parse(trimmed);
533
+ if (Number.isFinite(ts))
534
+ return ts;
535
+ }
536
+ return fallback;
537
+ }
538
+ function fakeRecord(doc) {
539
+ return {
540
+ schema: 1,
541
+ id: doc.id,
542
+ type: doc.type,
543
+ scope: doc.scope,
544
+ project: doc.project,
545
+ title: doc.title,
546
+ description: doc.description,
547
+ content: "",
548
+ tags: doc.tags,
549
+ entities: doc.entities,
550
+ importance: doc.importance,
551
+ confidence: doc.confidence,
552
+ pinned: doc.pinned,
553
+ status: doc.status,
554
+ created: doc.created,
555
+ updated: doc.updated,
556
+ lastUsed: doc.lastUsed || undefined,
557
+ usedCount: doc.usedCount,
558
+ validFrom: doc.validFrom,
559
+ validTo: doc.validTo,
560
+ observedAt: doc.created,
561
+ evidence: 1,
562
+ source: { harness: "unknown", ts: doc.created },
563
+ provenance: [],
564
+ links: doc.links,
565
+ supersedes: [],
566
+ supersededBy: null,
567
+ };
568
+ }
569
+ //# sourceMappingURL=retrieval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retrieval.js","sourceRoot":"","sources":["../src/retrieval.ts"],"names":[],"mappings":"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"}