@cortexkit/pi-magic-context 0.49.19 → 0.49.21

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 (60) hide show
  1. package/dist/auto-search-worker.js +48 -9
  2. package/dist/chunk-embedding-write-worker.js +29 -22
  3. package/dist/{compaction-marker-candidates-wjzqbspm.js → compaction-marker-candidates-p1kqkqhq.js} +3 -3
  4. package/dist/compaction-marker-candidates-worker.js +2 -2
  5. package/dist/compartment-chunk-embedding-y01m95c2.js +64 -0
  6. package/dist/embedding-backfill-2vh6m3bg.js +24 -0
  7. package/dist/embedding-worker-process.js +2 -2
  8. package/dist/embedding-worker.js +6 -6
  9. package/dist/historian-calibration-extension.js +1 -1
  10. package/dist/{index-e1rza8gp.js → index-29nw7n1r.js} +1 -1
  11. package/dist/{index-rrwv9y2k.js → index-2qtx0q6h.js} +214 -5
  12. package/dist/{index-msqrs4nf.js → index-3c3ztwgc.js} +5 -5
  13. package/dist/index-54wmg4rj.js +82 -0
  14. package/dist/{index-yygsh681.js → index-579m1751.js} +3 -3
  15. package/dist/{index-rc1dez8m.js → index-5j6vwg4z.js} +154 -13
  16. package/dist/{index-qpq6w67c.js → index-6wdwv3a6.js} +2 -2
  17. package/dist/{index-vktahpdj.js → index-at6py2k3.js} +9 -3
  18. package/dist/{index-bxmf4dhr.js → index-ccanzg8p.js} +2367 -1243
  19. package/dist/{index-sqt2haap.js → index-dbgg6hsf.js} +28 -14
  20. package/dist/{index-7bqrfyny.js → index-fgs78jyd.js} +12 -15
  21. package/dist/{index-58mj0dzc.js → index-ftvm2acc.js} +181 -46
  22. package/dist/{index-wveb51es.js → index-gqjxy2p7.js} +74 -9
  23. package/dist/{index-d8gc0112.js → index-gwxaz0z5.js} +4 -6
  24. package/dist/{index-d4dt19md.js → index-hqw0rt9k.js} +1 -1
  25. package/dist/{index-g7p75667.js → index-hxp6q5f8.js} +2 -2
  26. package/dist/{index-svgkv4g2.js → index-j3pz3a1b.js} +2 -2
  27. package/dist/{index-f18ec69t.js → index-jn44h81p.js} +1 -1
  28. package/dist/{index-1kcfwk9c.js → index-my0dn413.js} +1 -1
  29. package/dist/{index-apgwdby5.js → index-n4wyxcgr.js} +1 -1
  30. package/dist/{index-rhprywn6.js → index-n8e5e9fp.js} +28 -7
  31. package/dist/{index-z2rkv0mb.js → index-pe5gz5c4.js} +5 -5
  32. package/dist/{index-dtp1efvf.js → index-st4gwt64.js} +2 -2
  33. package/dist/{index-xnch62s6.js → index-vx6f7wff.js} +314 -127
  34. package/dist/{index-jrap43gc.js → index-w1avzkdt.js} +1 -1
  35. package/dist/{index-vmcgew7x.js → index-w1twp2kp.js} +78 -58
  36. package/dist/{index-ek9zvs4f.js → index-w6r3ggnp.js} +57 -27
  37. package/dist/{index-ym6nh2gk.js → index-wgmhk91m.js} +113 -20
  38. package/dist/{index-2mmy81qt.js → index-wqpjhx1p.js} +501 -20
  39. package/dist/index.js +1178 -417
  40. package/dist/{logger-dygt96rn.js → logger-shetp43v.js} +1 -1
  41. package/dist/{message-fts-rowid-map-cvpy2dmb.js → message-fts-rowid-map-59y476bk.js} +6 -5
  42. package/dist/{message-index-rc2x41k4.js → message-index-3snxf11x.js} +15 -14
  43. package/dist/{message-index-bounded-66saeq5j.js → message-index-bounded-4ngt600v.js} +15 -14
  44. package/dist/{message-time-backfill-ssshbdy8.js → message-time-backfill-e3r8ddh1.js} +3 -3
  45. package/dist/migration-worker.js +12 -11
  46. package/dist/{project-embedding-registry-vf1ncptn.js → project-embedding-registry-hfyzs654.js} +14 -13
  47. package/dist/raw-ordinal-warmup-worker.js +136 -101
  48. package/dist/{read-session-chunk-h5bzj91r.js → read-session-chunk-5dmc77q2.js} +10 -9
  49. package/dist/{read-session-raw-9s3xn7fc.js → read-session-raw-yxv2fv34.js} +4 -3
  50. package/dist/{safe-notification-target-2rkvkmw8.js → safe-notification-target-zcpchea6.js} +2 -2
  51. package/dist/search-archive-3daj5ttc.js +21 -0
  52. package/dist/{search-wh7b9zht.js → search-jhfh3tsj.js} +23 -22
  53. package/dist/{sqlite-fsp0sf3r.js → sqlite-v89bj0yy.js} +7 -1
  54. package/dist/{storage-memory-yxxc5v4n.js → storage-memory-0ndn65fm.js} +2 -2
  55. package/dist/{storage-tags-1kets0q8.js → storage-tags-r48vxthe.js} +7 -5
  56. package/dist/subagent-entry.js +28 -26
  57. package/dist/tag-snapshot-worker-pi.js +22 -14
  58. package/package.json +5 -2
  59. package/dist/embedding-backfill-vwag34t0.js +0 -23
  60. package/dist/search-archive-4817pqev.js +0 -20
@@ -3,11 +3,11 @@ import {
3
3
  } from "./index-0h2mkab2.js";
4
4
  import {
5
5
  getMagicContextStorageDir
6
- } from "./index-7bqrfyny.js";
6
+ } from "./index-fgs78jyd.js";
7
7
  import {
8
8
  isPidAlive,
9
9
  readProcessStartTime
10
- } from "./index-apgwdby5.js";
10
+ } from "./index-n4wyxcgr.js";
11
11
  import {
12
12
  resolveOpenCodeDbPath,
13
13
  assertOpenCodeStoreGeneration
@@ -18,23 +18,23 @@ import {
18
18
  prepareCachedStatement2,
19
19
  withSqliteBackgroundWriter2,
20
20
  withoutSqliteTransformPass2
21
- } from "./index-rrwv9y2k.js";
21
+ } from "./index-2qtx0q6h.js";
22
22
  import {
23
23
  removeSystemReminders,
24
24
  removeNestedBlocks,
25
25
  hasMeaningfulUserText2,
26
26
  extractTexts2
27
- } from "./index-1kcfwk9c.js";
27
+ } from "./index-my0dn413.js";
28
28
  import {
29
29
  recordMessageFtsRowid2,
30
30
  recordIndexedMessageTime2,
31
31
  messageFtsOrdinalRangeIsMapped2,
32
32
  getMessageFtsRowidMapBackfillProgress2,
33
33
  deleteUnmappedMessageFtsRows2
34
- } from "./index-yygsh681.js";
34
+ } from "./index-579m1751.js";
35
35
  import {
36
- deleteChunkEmbedBackoffForSession
37
- } from "./index-xnch62s6.js";
36
+ deleteChunkEmbedBackoffForSession2
37
+ } from "./index-vx6f7wff.js";
38
38
  import {
39
39
  closeQuietly,
40
40
  TAG_TOMBSTONE_OWNER_PREFIX,
@@ -43,16 +43,16 @@ import {
43
43
  tagRevisionKey,
44
44
  tagIdentityRevisionKey,
45
45
  deleteTagIdentityRevisions
46
- } from "./index-jrap43gc.js";
46
+ } from "./index-w1avzkdt.js";
47
47
  import {
48
48
  cleanUserText2
49
- } from "./index-wveb51es.js";
49
+ } from "./index-gqjxy2p7.js";
50
50
  import {
51
51
  sameProjectDirectory
52
52
  } from "./index-wrr9rp9a.js";
53
53
  import {
54
54
  logSlowWriteTransaction
55
- } from "./index-d4dt19md.js";
55
+ } from "./index-hqw0rt9k.js";
56
56
  import {
57
57
  ensurePrivateStorageDirectorySync,
58
58
  writeStorageFileSync,
@@ -63,7 +63,14 @@ import {
63
63
 
64
64
  // ../plugin/src/hooks/magic-context/lkg-recovery-fence.ts
65
65
  import { createHash as createHash2, randomUUID as randomUUID2 } from "node:crypto";
66
- import { lstatSync, readdirSync as readdirSync2, readFileSync as readFileSync2, rmdirSync, rmSync as rmSync2 } from "node:fs";
66
+ import {
67
+ lstatSync,
68
+ opendirSync,
69
+ readdirSync as readdirSync2,
70
+ readFileSync as readFileSync2,
71
+ rmdirSync,
72
+ rmSync as rmSync2
73
+ } from "node:fs";
67
74
  import { basename, dirname, join as join2 } from "node:path";
68
75
 
69
76
  // ../plugin/src/shared/bounded-session-map.ts
@@ -250,6 +257,58 @@ var hash = (value) => createHash2("sha256").update(value).digest("hex");
250
257
  function lkgRecoveryFencePath(sessionId) {
251
258
  return join2(getMagicContextStorageDir(), "lkg-recovery-fences", `${hash(sessionId)}.json`);
252
259
  }
260
+ var lockSweepDirectory;
261
+ function closeLkgLockSweepDirectory() {
262
+ lockSweepDirectory?.dir.closeSync();
263
+ lockSweepDirectory = undefined;
264
+ }
265
+ function takeLkgRecoveryLockSweepPage(maxEntries = 200) {
266
+ const path = join2(getMagicContextStorageDir(), "lkg-recovery-fences");
267
+ if (lockSweepDirectory?.path !== path)
268
+ closeLkgLockSweepDirectory();
269
+ const names = [];
270
+ try {
271
+ lockSweepDirectory ??= { path, dir: opendirSync(path) };
272
+ for (let i = 0;i < Math.min(200, Math.max(1, maxEntries)); i++) {
273
+ const entry = lockSweepDirectory.dir.readSync();
274
+ if (!entry) {
275
+ closeLkgLockSweepDirectory();
276
+ break;
277
+ }
278
+ if (entry.isDirectory() && /^[a-f0-9]{64}\.json\.locks$/.test(entry.name))
279
+ names.push(entry.name);
280
+ }
281
+ } catch {
282
+ closeLkgLockSweepDirectory();
283
+ }
284
+ return names;
285
+ }
286
+ function sweepEmptyLkgRecoveryLockDirectories(names, retainedSessionIds) {
287
+ if (!durableFencesSupported())
288
+ return 0;
289
+ const retainedHashes = new Set(Array.from(retainedSessionIds, hash));
290
+ const root = join2(getMagicContextStorageDir(), "lkg-recovery-fences");
291
+ let removed = 0;
292
+ for (const name of names.slice(0, 200)) {
293
+ if (!/^[a-f0-9]{64}\.json\.locks$/.test(name) || retainedHashes.has(name.slice(0, 64)))
294
+ continue;
295
+ const path = join2(root, name);
296
+ try {
297
+ try {
298
+ lstatSync(path.slice(0, -".locks".length));
299
+ continue;
300
+ } catch (error) {
301
+ if (error.code !== "ENOENT")
302
+ continue;
303
+ }
304
+ if (!lstatSync(path).isDirectory())
305
+ continue;
306
+ rmdirSync(path);
307
+ removed++;
308
+ } catch {}
309
+ }
310
+ return removed;
311
+ }
253
312
  function metadata(slot) {
254
313
  return [
255
314
  slot.inputIdSeq,
@@ -631,6 +690,12 @@ function closeConnection(connection) {
631
690
  counters.readersClosed += 1;
632
691
  }
633
692
  }
693
+ function messageTimesQuery(count) {
694
+ return `SELECT id, COALESCE(time_created, json_extract(data, '$.time.created')) AS created,
695
+ json_extract(data, '$.time.completed') AS completed
696
+ FROM session_message WHERE +session_id = ? AND id IN (${Array.from({ length: count }, () => "?").join(",")})`;
697
+ }
698
+
634
699
  class V2StoreReader {
635
700
  path;
636
701
  pool;
@@ -726,6 +791,12 @@ class V2StoreReader {
726
791
  return typeof row?.count === "number" ? row.count : 0;
727
792
  });
728
793
  }
794
+ messageCountAfterSequence(sessionID, after, through) {
795
+ const rawTypes = RAW_MESSAGE_TYPES.map(() => "?").join(", ");
796
+ const row = this.prepare(`SELECT COUNT(*) AS count FROM session_message
797
+ WHERE session_id = ? AND seq > ? AND seq <= ? AND type IN (${rawTypes})`).get(sessionID, after, through, ...RAW_MESSAGE_TYPES);
798
+ return typeof row?.count === "number" ? row.count : 0;
799
+ }
729
800
  sessionDirectoryPage(afterSessionID, limit) {
730
801
  const rows = this.prepare(`SELECT id, COALESCE(directory, '') AS directory FROM session_v2
731
802
  WHERE id > ? ORDER BY id ASC LIMIT ?`).all(afterSessionID ?? "", limit);
@@ -853,9 +924,7 @@ class V2StoreReader {
853
924
  const times = new Map;
854
925
  for (let offset = 0;offset < ids.length; offset += 500) {
855
926
  const batch = ids.slice(offset, offset + 500);
856
- const rows = this.prepare(`SELECT id, COALESCE(time_created, json_extract(data, '$.time.created')) AS created,
857
- json_extract(data, '$.time.completed') AS completed
858
- FROM session_message WHERE session_id = ? AND id IN (${batch.map(() => "?").join(",")})`).all(sessionID, ...batch);
927
+ const rows = this.prepare(messageTimesQuery(batch.length)).all(sessionID, ...batch);
859
928
  for (const row of rows)
860
929
  times.set(row.id, {
861
930
  created: typeof row.created === "number" ? row.created : undefined,
@@ -1248,7 +1317,7 @@ function deleteSessionScopedRows(db, sessionIds, harness, options = {}) {
1248
1317
  fallback.run(tagTombstoneOwnerKey(id, getHarness2()), getHarness2(), ...tagTombstoneOwnerRange(id));
1249
1318
  }
1250
1319
  for (const sessionId of deletableSessionIds)
1251
- deleteChunkEmbedBackoffForSession(db, sessionId);
1320
+ deleteChunkEmbedBackoffForSession2(db, sessionId);
1252
1321
  for (const definition of SESSION_SCOPED_TABLES) {
1253
1322
  if (definition.table === "message_history_fts") {
1254
1323
  cleanupStatement(db, `DELETE FROM message_history_fts
@@ -1299,7 +1368,7 @@ function deleteSessionScopedRowsSlice(db, sessionId, harness) {
1299
1368
  cleanupStatement(db, "INSERT OR IGNORE INTO schema_migrations_meta(key,value) VALUES (?,?)").run(tagTombstoneOwnerKey(sessionId, harness), harness);
1300
1369
  let remaining = SESSION_CLEANUP_SLICE_ROWS;
1301
1370
  const started = performance.now();
1302
- remaining -= deleteChunkEmbedBackoffForSession(db, sessionId, remaining);
1371
+ remaining -= deleteChunkEmbedBackoffForSession2(db, sessionId, remaining);
1303
1372
  if (remaining <= 0)
1304
1373
  return { complete: false, deleted: 0 };
1305
1374
  for (const definition of SESSION_SCOPED_TABLES) {
@@ -1884,14 +1953,20 @@ function harnessSupportsOpenCodeOrphanSweep(harness) {
1884
1953
  return harness === "opencode" || harness === "opencode2";
1885
1954
  }
1886
1955
  function getMessageHistoryOrphanSweepState(db, harness) {
1887
- return db.prepare("SELECT cursor_session_id, last_swept_at FROM message_history_orphan_sweep WHERE harness = ?").get(harness) ?? {};
1956
+ const state = db.prepare("SELECT cursor_session_id, last_swept_at FROM message_history_orphan_sweep WHERE harness = ?").get(harness) ?? {};
1957
+ if (harness === "opencode2") {
1958
+ if (!state.cursor_session_id?.startsWith("session_v2:"))
1959
+ return {};
1960
+ return { ...state, cursor_session_id: state.cursor_session_id.slice("session_v2:".length) };
1961
+ }
1962
+ return state;
1888
1963
  }
1889
1964
  function persistMessageHistoryOrphanSweepState(db, cursor, lastSweptAt, harness) {
1890
1965
  db.prepare(`INSERT INTO message_history_orphan_sweep (harness, cursor_session_id, last_swept_at)
1891
1966
  VALUES (?, ?, ?)
1892
1967
  ON CONFLICT(harness) DO UPDATE SET
1893
1968
  cursor_session_id = excluded.cursor_session_id,
1894
- last_swept_at = excluded.last_swept_at`).run(harness, cursor, lastSweptAt);
1969
+ last_swept_at = excluded.last_swept_at`).run(harness, harness === "opencode2" ? `session_v2:${cursor}` : cursor, lastSweptAt);
1895
1970
  }
1896
1971
  function getOpenCodeSessionScopedCandidateSourceSql(harness) {
1897
1972
  const sources = SESSION_SCOPED_TABLES.filter((definition) => definition.harnessScoped === true).map((definition) => {
@@ -1939,13 +2014,14 @@ function* sweepOrphanedOpenCodeMessageIndexesInBackground(db, openReadableOpenCo
1939
2014
  let v2Reader;
1940
2015
  try {
1941
2016
  let sessionExists;
2017
+ let liveIds;
1942
2018
  if (harness === "opencode2") {
1943
2019
  try {
1944
2020
  const path = getSqliteDatabasePath2(openCodeDb);
1945
2021
  if (!path)
1946
2022
  throw new Error("OpenCode 2 source has no durable path");
1947
2023
  v2Reader = new V2StoreReader(path);
1948
- const liveIds = new Set(v2Reader.sessionIds());
2024
+ liveIds = new Set(v2Reader.sessionIds());
1949
2025
  if (liveIds.size === 0)
1950
2026
  throw new Error("OpenCode 2 source has no sessions");
1951
2027
  sessionExists = (id) => liveIds.has(id);
@@ -1954,9 +2030,26 @@ function* sweepOrphanedOpenCodeMessageIndexesInBackground(db, openReadableOpenCo
1954
2030
  return { status: "source_unavailable", scanned: 0, deleted: 0, cursor };
1955
2031
  }
1956
2032
  } else {
2033
+ liveIds = new Set(openCodeDb.prepare("SELECT id FROM session").all().map((row) => row.id));
1957
2034
  const query = openCodeDb.prepare("SELECT 1 FROM session WHERE id = ? LIMIT 1");
1958
2035
  sessionExists = (id) => !!query.get(id);
1959
2036
  }
2037
+ if (options.fenceLockNames?.length) {
2038
+ const retainedIds = new Set(liveIds);
2039
+ const sources = SESSION_SCOPED_TABLES.map((def) => `SELECT session_id FROM ${def.table}${def.extraPredicate ? ` WHERE ${def.extraPredicate}` : ""}`);
2040
+ for (const row of db.prepare(sources.join(" UNION ")).all()) {
2041
+ if (typeof row.session_id === "string")
2042
+ retainedIds.add(row.session_id);
2043
+ }
2044
+ for (const row of db.prepare("SELECT key FROM schema_migrations_meta WHERE key >= ? AND key < ?").all(TAG_TOMBSTONE_OWNER_PREFIX, "tag_revision_owner;")) {
2045
+ try {
2046
+ const id = JSON.parse(row.key.slice(TAG_TOMBSTONE_OWNER_PREFIX.length, row.key.lastIndexOf(":")));
2047
+ if (typeof id === "string")
2048
+ retainedIds.add(id);
2049
+ } catch {}
2050
+ }
2051
+ sweepEmptyLkgRecoveryLockDirectories(options.fenceLockNames, retainedIds);
2052
+ }
1960
2053
  const cutoff = now - safetyAgeMs;
1961
2054
  const candidateSourceSql = getOpenCodeSessionScopedCandidateSourceSql(harness);
1962
2055
  const candidates = db.prepare(`SELECT session_id
@@ -2048,4 +2141,4 @@ async function sweepOrphanedOpenCodeMessageIndexesCooperatively2(db, openSource,
2048
2141
  }));
2049
2142
  }
2050
2143
 
2051
- export { BoundedSessionMap, LkgRecoveryFenceError, clearLkgFenceProcessState, lkgFenceRequiresRebuild, lkgRecoveryFenceUnclean, ownsLkgDirtyFence, invalidateCleanLkgRecoveryFence, markLkgRecoveryDirty, commitLkgWithRecoveryFence, clearLkgRecoveryFence, gaDatabasePath, V2StoreReader, readSessionActivity, observeSessionActivity, backfillSessionActivity, deleteSessionScopedRows, clearCompressionDepth, clearCompressionDepthRange, cleanSearchText, keywordRelevance, matchedSearchSnippet, MESSAGE_INDEX_MAX_FTS_BYTES2, messageIndexSkipKey2, toMessageIndexSource2, getMessageIndexSourceIdentity2, isMessageIndexSourceCurrent2, getLastIndexedOrdinal2, getIndexedMessageCorpusSize2, markMessageIndexDirty2, getMessageIndexReconciliationStartOrdinal2, isMessageIndexReconciledThrough2, deleteIndexedMessage2, clearIndexedMessagesInTransaction2, clearIndexedMessages2, getIndexableContent2, indexSingleMessage2, indexMessagesAfterOrdinal2, indexSourcesAfterOrdinal2, sweepOrphanedOpenCodeMessageIndexesCooperatively2 };
2144
+ export { BoundedSessionMap, LkgRecoveryFenceError, clearLkgFenceProcessState, takeLkgRecoveryLockSweepPage, lkgFenceRequiresRebuild, lkgRecoveryFenceUnclean, ownsLkgDirtyFence, invalidateCleanLkgRecoveryFence, markLkgRecoveryDirty, commitLkgWithRecoveryFence, clearLkgRecoveryFence, gaDatabasePath, V2StoreReader, readSessionActivity, observeSessionActivity, backfillSessionActivity, deleteSessionScopedRows, clearCompressionDepth, clearCompressionDepthRange, cleanSearchText, keywordRelevance, matchedSearchSnippet, MESSAGE_INDEX_MAX_FTS_BYTES2, messageIndexSkipKey2, toMessageIndexSource2, getMessageIndexSourceIdentity2, isMessageIndexSourceCurrent2, getLastIndexedOrdinal2, getIndexedMessageCorpusSize2, markMessageIndexDirty2, getMessageIndexReconciliationStartOrdinal2, isMessageIndexReconciledThrough2, deleteIndexedMessage2, clearIndexedMessagesInTransaction2, clearIndexedMessages2, getIndexableContent2, indexSingleMessage2, indexMessagesAfterOrdinal2, indexSourcesAfterOrdinal2, sweepOrphanedOpenCodeMessageIndexesCooperatively2 };