@cortexkit/opencode-magic-context 0.36.1 → 0.37.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 (125) hide show
  1. package/dist/config/index.d.ts.map +1 -1
  2. package/dist/config/project-security.d.ts +2 -1
  3. package/dist/config/project-security.d.ts.map +1 -1
  4. package/dist/config/schema/magic-context.d.ts +10 -0
  5. package/dist/config/schema/magic-context.d.ts.map +1 -1
  6. package/dist/{conflict-warning-hook-mt0ttc4x.js → conflict-warning-hook-an4fxhwf.js} +3 -3
  7. package/dist/{derive-budgets-88mxk2w1.js → derive-budgets-0f8xpyw2.js} +3 -2
  8. package/dist/features/magic-context/context-authority.d.ts.map +1 -1
  9. package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts.map +1 -1
  10. package/dist/features/magic-context/memory/embedding-openai.d.ts +3 -1
  11. package/dist/features/magic-context/memory/embedding-openai.d.ts.map +1 -1
  12. package/dist/features/magic-context/memory/project-identity.d.ts +6 -0
  13. package/dist/features/magic-context/memory/project-identity.d.ts.map +1 -1
  14. package/dist/features/magic-context/migrations.d.ts.map +1 -1
  15. package/dist/features/magic-context/overflow-detection.d.ts.map +1 -1
  16. package/dist/features/magic-context/smart-notes/runner.d.ts.map +1 -1
  17. package/dist/features/magic-context/smart-notes/wake-plane.d.ts +21 -0
  18. package/dist/features/magic-context/smart-notes/wake-plane.d.ts.map +1 -0
  19. package/dist/features/magic-context/storage-db.d.ts +13 -2
  20. package/dist/features/magic-context/storage-db.d.ts.map +1 -1
  21. package/dist/features/magic-context/storage-meta-persisted.d.ts +22 -0
  22. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  23. package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
  24. package/dist/features/magic-context/storage-meta-shared.d.ts.map +1 -1
  25. package/dist/features/magic-context/storage-primers.d.ts +11 -0
  26. package/dist/features/magic-context/storage-primers.d.ts.map +1 -1
  27. package/dist/features/magic-context/storage-schema-helpers.d.ts.map +1 -1
  28. package/dist/features/magic-context/user-memory/storage-user-memory.d.ts +7 -0
  29. package/dist/features/magic-context/user-memory/storage-user-memory.d.ts.map +1 -1
  30. package/dist/features/magic-context/window-report-ledger.d.ts +70 -0
  31. package/dist/features/magic-context/window-report-ledger.d.ts.map +1 -0
  32. package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
  33. package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
  34. package/dist/hooks/magic-context/event-resolvers.d.ts +4 -0
  35. package/dist/hooks/magic-context/event-resolvers.d.ts.map +1 -1
  36. package/dist/hooks/magic-context/execute-status.d.ts +2 -1
  37. package/dist/hooks/magic-context/execute-status.d.ts.map +1 -1
  38. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  39. package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
  40. package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -1
  41. package/dist/hooks/magic-context/lkg-slot.d.ts +20 -0
  42. package/dist/hooks/magic-context/lkg-slot.d.ts.map +1 -1
  43. package/dist/hooks/magic-context/module-state-sync.d.ts +8 -0
  44. package/dist/hooks/magic-context/module-state-sync.d.ts.map +1 -1
  45. package/dist/hooks/magic-context/module-transport.d.ts.map +1 -1
  46. package/dist/hooks/magic-context/module-wire.d.ts +6 -1
  47. package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
  48. package/dist/hooks/magic-context/rust-mode-transform.d.ts +17 -0
  49. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  50. package/dist/hooks/magic-context/strip-content.d.ts +25 -0
  51. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
  52. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  53. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +11 -3
  54. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  55. package/dist/hooks/magic-context/transform.d.ts +10 -0
  56. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  57. package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
  58. package/dist/{index-1skzp4dc.js → index-0ze9p983.js} +572 -92
  59. package/dist/{index-nsx2n9eg.js → index-4cz5nfxf.js} +3 -3
  60. package/dist/{index-f1tnb3vm.js → index-8pqfcghm.js} +21 -9
  61. package/dist/{index-zp6x6s6a.js → index-cae89eas.js} +25 -6
  62. package/dist/index-cgyfn1s2.js +53 -0
  63. package/dist/{index-3zqcdwqr.js → index-crke4z5j.js} +7 -4
  64. package/dist/{index-tsgs7td8.js → index-pck9vadr.js} +1 -1
  65. package/dist/index-q0t189ay.js +741 -0
  66. package/dist/{index-3tnkymva.js → index-sw8gnq34.js} +1 -1
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +1172 -287
  69. package/dist/plugin/hooks/create-session-hooks.d.ts +3 -0
  70. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  71. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  72. package/dist/{recomp-orchestrator-a0g9b52q.js → recomp-orchestrator-c3ff16k7.js} +7 -6
  73. package/dist/{safe-notification-target-c11fdda2.js → safe-notification-target-b693f9x3.js} +2 -2
  74. package/dist/{send-session-notification-bgtf4853.js → send-session-notification-dxske5zm.js} +3 -3
  75. package/dist/shared/conflict-detector.d.ts +63 -0
  76. package/dist/shared/conflict-detector.d.ts.map +1 -1
  77. package/dist/shared/harness-provider-map.d.ts +8 -0
  78. package/dist/shared/harness-provider-map.d.ts.map +1 -1
  79. package/dist/shared/logger.d.ts +8 -0
  80. package/dist/shared/logger.d.ts.map +1 -1
  81. package/dist/shared/models-dev-cache.d.ts +5 -0
  82. package/dist/shared/models-dev-cache.d.ts.map +1 -1
  83. package/dist/shared/prompt-surface-runtime.d.ts.map +1 -1
  84. package/dist/shared/prompt-surface.d.ts +2 -0
  85. package/dist/shared/prompt-surface.d.ts.map +1 -1
  86. package/dist/shared/rpc-client.d.ts.map +1 -1
  87. package/dist/shared/rpc-types.d.ts +14 -0
  88. package/dist/shared/rpc-types.d.ts.map +1 -1
  89. package/dist/shared/rpc-utils.d.ts +19 -9
  90. package/dist/shared/rpc-utils.d.ts.map +1 -1
  91. package/dist/shared/window-geometry.d.ts +89 -0
  92. package/dist/shared/window-geometry.d.ts.map +1 -0
  93. package/dist/{storage-meta-session-df9tstzr.js → storage-meta-session-mk4gsnke.js} +4 -3
  94. package/dist/tools/ctx-memory/tools.d.ts.map +1 -1
  95. package/dist/tools/ctx-note/tools.d.ts.map +1 -1
  96. package/dist/tui/data/context-db.d.ts.map +1 -1
  97. package/dist/tui-compiled/data/context-db.d.ts.map +1 -1
  98. package/package.json +1 -1
  99. package/src/config/index.ts +2 -0
  100. package/src/config/latch-permanence-guard.test.ts +218 -0
  101. package/src/config/project-security.ts +10 -1
  102. package/src/config/schema/magic-context.ts +10 -0
  103. package/src/shared/__fixtures__/window-overlay.v1.json +337 -0
  104. package/src/shared/conflict-detector.test.ts +176 -1
  105. package/src/shared/conflict-detector.ts +126 -3
  106. package/src/shared/harness-provider-map.test.ts +20 -0
  107. package/src/shared/harness-provider-map.ts +19 -0
  108. package/src/shared/logger.test.ts +119 -0
  109. package/src/shared/logger.ts +33 -15
  110. package/src/shared/models-dev-cache.test.ts +17 -0
  111. package/src/shared/models-dev-cache.ts +58 -6
  112. package/src/shared/prompt-surface-runtime.ts +5 -3
  113. package/src/shared/prompt-surface.test.ts +38 -0
  114. package/src/shared/prompt-surface.ts +15 -2
  115. package/src/shared/rpc-client.ts +4 -2
  116. package/src/shared/rpc-types.ts +14 -0
  117. package/src/shared/rpc-utils.test.ts +137 -13
  118. package/src/shared/rpc-utils.ts +144 -31
  119. package/src/shared/window-geometry.test.ts +309 -0
  120. package/src/shared/window-geometry.ts +629 -0
  121. package/src/tui/data/context-db.ts +5 -0
  122. package/src/tui/index.tsx +22 -0
  123. package/src/tui-compiled/data/context-db.ts +5 -0
  124. package/src/tui-compiled/index.tsx +319 -255
  125. package/dist/index-wgvxkqpx.js +0 -342
@@ -1,9 +1,8 @@
1
1
  import {
2
2
  deriveTriggerBudget,
3
3
  modelSupportsVision,
4
- piModelRefToCanonical,
5
4
  shouldEnforcePrivateStoragePermissions
6
- } from "./index-wgvxkqpx.js";
5
+ } from "./index-q0t189ay.js";
7
6
  import {
8
7
  parseProviderModel
9
8
  } from "./index-td9depx5.js";
@@ -11,7 +10,7 @@ import {
11
10
  describeError,
12
11
  getErrorMessage,
13
12
  sendIgnoredMessage
14
- } from "./index-nsx2n9eg.js";
13
+ } from "./index-4cz5nfxf.js";
15
14
  import {
16
15
  buildToolArcs,
17
16
  buildTrueRawTokenIndex,
@@ -35,13 +34,17 @@ import {
35
34
  readSessionChunk,
36
35
  stableStringify,
37
36
  updateSessionMeta
38
- } from "./index-3zqcdwqr.js";
37
+ } from "./index-crke4z5j.js";
38
+ import {
39
+ modelRefLookupOrder,
40
+ piModelRefToCanonical
41
+ } from "./index-cgyfn1s2.js";
39
42
  import {
40
43
  Database,
41
44
  closeQuietly,
42
45
  getMessageTimesFromOpenCodeDb,
43
46
  withPrivilegedWriter
44
- } from "./index-3tnkymva.js";
47
+ } from "./index-sw8gnq34.js";
45
48
  import {
46
49
  detectConfigFile
47
50
  } from "./index-8mtsfhyg.js";
@@ -51,7 +54,7 @@ import {
51
54
  import {
52
55
  log,
53
56
  sessionLog
54
- } from "./index-f1tnb3vm.js";
57
+ } from "./index-8pqfcghm.js";
55
58
  import {
56
59
  ensureCortexKitArtifactGitignore,
57
60
  getDataDir,
@@ -602,20 +605,24 @@ function rpcPortFilePath(storageDir, directory, pid = process.pid, instanceId) {
602
605
  }
603
606
  function isPidAlive(pid) {
604
607
  if (!Number.isInteger(pid) || pid <= 0)
605
- return false;
608
+ return "dead";
609
+ if (rpcIdentityPlatform === "win32")
610
+ return readWindowsProcess(pid).state;
606
611
  try {
607
- process.kill(pid, 0);
608
- return true;
609
- } catch (err) {
610
- return err.code === "EPERM";
612
+ rpcIdentityProcessKill(pid, 0);
613
+ return "alive";
614
+ } catch (error) {
615
+ return error.code === "ESRCH" ? "dead" : "inconclusive";
611
616
  }
612
617
  }
613
618
  var RPC_IDENTITY_SKEW_TOLERANCE_MS = 120000;
614
619
  var LINUX_CLOCK_TICKS_PER_SECOND = 100;
615
620
  var PS_PROBE_TIMEOUT_MS = 1000;
616
621
  var OPEN_CODE_COMMAND_MARKERS = ["opencode", "node", "bun", "electron"];
622
+ var TASKLIST_NO_TASKS_PATTERN = /^INFO:\s+No tasks are running which match the specified criteria\.?$/im;
617
623
  var rpcIdentityReadFileSync = readFileSync;
618
624
  var rpcIdentityExecFileSync = execFileSync;
625
+ var rpcIdentityProcessKill = process.kill;
619
626
  var rpcProcessListExecFileSync = execFileSync;
620
627
  var rpcIdentityPlatform = process.platform;
621
628
  var rpcIdentityNowMs = () => Date.now();
@@ -645,7 +652,8 @@ function readPsProcessStartTime(pid) {
645
652
  try {
646
653
  const output = rpcIdentityExecFileSync("ps", ["-p", String(pid), "-o", "lstart="], {
647
654
  encoding: "utf8",
648
- timeout: PS_PROBE_TIMEOUT_MS
655
+ timeout: PS_PROBE_TIMEOUT_MS,
656
+ stdio: ["ignore", "pipe", "pipe"]
649
657
  });
650
658
  const processStartTime = Date.parse(String(output).trim());
651
659
  return Number.isFinite(processStartTime) ? processStartTime : null;
@@ -653,6 +661,70 @@ function readPsProcessStartTime(pid) {
653
661
  return null;
654
662
  }
655
663
  }
664
+ function parseCsvLine(line) {
665
+ const fields = [];
666
+ let field = "";
667
+ let quoted = false;
668
+ for (let index = 0;index < line.length; index += 1) {
669
+ const character = line[index];
670
+ if (character === '"') {
671
+ if (quoted && line[index + 1] === '"') {
672
+ field += '"';
673
+ index += 1;
674
+ } else {
675
+ quoted = !quoted;
676
+ }
677
+ } else if (character === "," && !quoted) {
678
+ fields.push(field);
679
+ field = "";
680
+ } else {
681
+ field += character;
682
+ }
683
+ }
684
+ if (quoted)
685
+ return null;
686
+ fields.push(field);
687
+ return fields;
688
+ }
689
+ function parseTasklistOutput(output) {
690
+ const entries = [];
691
+ let sawHeader = false;
692
+ for (const rawLine of output.split(/\r?\n/)) {
693
+ const line = rawLine.trim();
694
+ if (!line)
695
+ continue;
696
+ if (TASKLIST_NO_TASKS_PATTERN.test(line))
697
+ return [];
698
+ const fields = parseCsvLine(line);
699
+ if (!fields)
700
+ continue;
701
+ if (fields[1]?.trim().toLowerCase() === "pid") {
702
+ sawHeader = true;
703
+ continue;
704
+ }
705
+ const pid = Number(fields[1]);
706
+ if (!Number.isInteger(pid) || pid <= 0 || !fields[0])
707
+ continue;
708
+ entries.push({ pid, command: fields[0] });
709
+ }
710
+ return entries.length > 0 || sawHeader ? entries : null;
711
+ }
712
+ function readWindowsProcess(pid) {
713
+ try {
714
+ const output = rpcIdentityExecFileSync("tasklist", ["/FO", "CSV", "/FI", `PID eq ${pid}`], {
715
+ encoding: "utf8",
716
+ timeout: PS_PROBE_TIMEOUT_MS,
717
+ stdio: ["ignore", "pipe", "pipe"]
718
+ });
719
+ const entries = parseTasklistOutput(String(output));
720
+ if (entries === null)
721
+ return { state: "inconclusive" };
722
+ const process2 = entries.find((entry) => entry.pid === pid);
723
+ return process2 ? { state: "alive", command: process2.command } : { state: "dead" };
724
+ } catch {
725
+ return { state: "inconclusive" };
726
+ }
727
+ }
656
728
  function readLinuxProcessCommand(pid) {
657
729
  try {
658
730
  return String(rpcIdentityReadFileSync(`/proc/${pid}/cmdline`, "utf8"));
@@ -664,7 +736,8 @@ function readPsProcessCommand(pid) {
664
736
  try {
665
737
  const output = rpcIdentityExecFileSync("ps", ["-p", String(pid), "-o", "command="], {
666
738
  encoding: "utf8",
667
- timeout: PS_PROBE_TIMEOUT_MS
739
+ timeout: PS_PROBE_TIMEOUT_MS,
740
+ stdio: ["ignore", "pipe", "pipe"]
668
741
  });
669
742
  return String(output);
670
743
  } catch {
@@ -677,17 +750,17 @@ function commandLooksLikeOpenCode(command) {
677
750
  }
678
751
  function isPidIdentityPlausible(record) {
679
752
  if (!Number.isInteger(record.pid) || record.pid <= 0)
680
- return false;
753
+ return "implausible";
681
754
  if (Number.isFinite(record.started_at) && record.started_at > 0) {
682
- const processStartTime = rpcIdentityPlatform === "linux" ? readLinuxProcessStartTime(record.pid) : readPsProcessStartTime(record.pid);
755
+ const processStartTime = rpcIdentityPlatform === "linux" ? readLinuxProcessStartTime(record.pid) : rpcIdentityPlatform === "win32" ? null : readPsProcessStartTime(record.pid);
683
756
  if (processStartTime === null)
684
- return true;
685
- return processStartTime <= record.started_at + RPC_IDENTITY_SKEW_TOLERANCE_MS;
757
+ return "inconclusive";
758
+ return processStartTime <= record.started_at + RPC_IDENTITY_SKEW_TOLERANCE_MS ? "plausible" : "implausible";
686
759
  }
687
- const command = rpcIdentityPlatform === "linux" ? readLinuxProcessCommand(record.pid) : readPsProcessCommand(record.pid);
760
+ const command = rpcIdentityPlatform === "linux" ? readLinuxProcessCommand(record.pid) : rpcIdentityPlatform === "win32" ? readWindowsProcess(record.pid).command ?? null : readPsProcessCommand(record.pid);
688
761
  if (command === null)
689
- return true;
690
- return commandLooksLikeOpenCode(command);
762
+ return "inconclusive";
763
+ return commandLooksLikeOpenCode(command) ? "plausible" : "implausible";
691
764
  }
692
765
  function commandLooksLikePi(command) {
693
766
  const normalized = command.trim().toLowerCase().replaceAll("\\", "/");
@@ -705,20 +778,39 @@ function commandLooksLikePi(command) {
705
778
  function inspectLivePiProcesses() {
706
779
  if (false) {}
707
780
  try {
708
- const output = String(rpcProcessListExecFileSync("ps", ["-axo", "pid=,command="], {
781
+ const isWindows = rpcIdentityPlatform === "win32";
782
+ const output = String(rpcProcessListExecFileSync(isWindows ? "tasklist" : "ps", isWindows ? ["/FO", "CSV"] : ["-axo", "pid=,command="], {
709
783
  encoding: "utf8",
710
- timeout: PS_PROBE_TIMEOUT_MS
784
+ timeout: PS_PROBE_TIMEOUT_MS,
785
+ stdio: ["ignore", "pipe", "pipe"]
711
786
  }));
712
787
  const pids = new Set;
713
- for (const line of output.split(/\r?\n/)) {
714
- const match = /^\s*(\d+)\s+(.+)$/.exec(line);
715
- if (!match)
716
- continue;
717
- const pid = Number(match[1]);
718
- if (!Number.isInteger(pid) || pid <= 0 || pid === process.pid)
719
- continue;
720
- if (commandLooksLikePi(match[2]))
721
- pids.add(pid);
788
+ if (isWindows) {
789
+ const entries = parseTasklistOutput(output);
790
+ if (entries === null) {
791
+ return {
792
+ state: "unreadable",
793
+ processIds: [],
794
+ error: "tasklist output unavailable"
795
+ };
796
+ }
797
+ for (const entry of entries) {
798
+ if (entry.pid === process.pid)
799
+ continue;
800
+ if (commandLooksLikePi(entry.command))
801
+ pids.add(entry.pid);
802
+ }
803
+ } else {
804
+ for (const line of output.split(/\r?\n/)) {
805
+ const match = /^\s*(\d+)\s+(.+)$/.exec(line);
806
+ if (!match)
807
+ continue;
808
+ const pid = Number(match[1]);
809
+ if (!Number.isInteger(pid) || pid <= 0 || pid === process.pid)
810
+ continue;
811
+ if (commandLooksLikePi(match[2]))
812
+ pids.add(pid);
813
+ }
722
814
  }
723
815
  return { state: "known", processIds: [...pids].sort((left, right) => left - right) };
724
816
  } catch (error) {
@@ -729,9 +821,6 @@ function inspectLivePiProcesses() {
729
821
  };
730
822
  }
731
823
  }
732
- function discoverLivePiProcessIds() {
733
- return inspectLivePiProcesses().processIds;
734
- }
735
824
  function parseRpcPortFile(content, fallbackPid = 0) {
736
825
  const trimmed = content.trim();
737
826
  if (!trimmed)
@@ -1415,6 +1504,7 @@ function prepareMirrorPageStatements(db) {
1415
1504
  return {
1416
1505
  identityByModule: db.prepare("SELECT context_row_id FROM mirror_identity WHERE domain = ? AND module_project = ? AND module_row_id = ?"),
1417
1506
  insertIdentity: db.prepare("INSERT OR IGNORE INTO mirror_identity(domain, module_project, module_row_id, context_row_id) VALUES (?, ?, ?, ?)"),
1507
+ deleteIdentityByContext: db.prepare("DELETE FROM mirror_identity WHERE domain = ? AND context_row_id = ?"),
1418
1508
  deleteLiveMemory: db.prepare("DELETE FROM mirror_live_memory_rows WHERE module_project = ? AND module_row_id = ?"),
1419
1509
  deletePendingReferencesForMemory: db.prepare("DELETE FROM mirror_pending_references WHERE domain = ? AND module_project = ? AND (module_row_id = ? OR target_module_row_id = ?)"),
1420
1510
  deleteIdentity: db.prepare("DELETE FROM mirror_identity WHERE domain = ? AND module_project = ? AND module_row_id = ?"),
@@ -1466,7 +1556,7 @@ function prepareMirrorPageStatements(db) {
1466
1556
  check_quarantined_until = ?, check_next_due_at = ?, check_compiled_at = ?, check_false_since_at = ?,
1467
1557
  check_last_liveness_at = ?, last_checked_at = ?, check_status = ?, check_version = ?,
1468
1558
  policy_version = ?, anchor_block_id = ?, anchor_ordinal = ?, created_at = ?, updated_at = ? WHERE id = ?`),
1469
- upsertNoteRevision: db.prepare("INSERT INTO mirror_note_revisions(module_project, module_row_id, context_row_id, status_version) VALUES (?, ?, ?, ?) ON CONFLICT(module_project, module_row_id) DO UPDATE SET context_row_id = excluded.context_row_id, status_version = excluded.status_version"),
1559
+ upsertNoteRevision: db.prepare("INSERT OR REPLACE INTO mirror_note_revisions(module_project, module_row_id, context_row_id, status_version) VALUES (?, ?, ?, ?)"),
1470
1560
  translateMemoryReferences: db.prepare(`UPDATE memories
1471
1561
  SET superseded_by_memory_id = (
1472
1562
  SELECT target.context_row_id
@@ -1551,6 +1641,9 @@ function rememberIdentity(db, domain, moduleProject, moduleRowId, contextRowId,
1551
1641
  const existing = mirrorIdentity(db, domain, moduleProject, moduleRowId, statements);
1552
1642
  if (existing)
1553
1643
  return;
1644
+ if (domain === "notes") {
1645
+ (statements?.deleteIdentityByContext ?? db.prepare("DELETE FROM mirror_identity WHERE domain = ? AND context_row_id = ?")).run(domain, contextRowId);
1646
+ }
1554
1647
  (statements?.insertIdentity ?? db.prepare("INSERT OR IGNORE INTO mirror_identity(domain, module_project, module_row_id, context_row_id) VALUES (?, ?, ?, ?)")).run(domain, moduleProject, moduleRowId, contextRowId);
1555
1648
  }
1556
1649
  function contextMemoryId(db, domain, moduleProject, row, moduleRowId, statements) {
@@ -2133,6 +2226,8 @@ function healAllNullColumns(db) {
2133
2226
  ["stripped_placeholder_ids", ""],
2134
2227
  ["stale_reduce_stripped_ids", ""],
2135
2228
  ["processed_image_stripped_ids", ""],
2229
+ ["merged_reasoning_stripped_ids", ""],
2230
+ ["trailing_blank_decisions", ""],
2136
2231
  ["memory_block_cache", ""],
2137
2232
  ["memory_block_ids", ""],
2138
2233
  ["compaction_marker_state", ""],
@@ -2244,6 +2339,7 @@ import path from "node:path";
2244
2339
  var GIT_TIMEOUT_MS = 5000;
2245
2340
  var TRANSIENT_FAILURE_COOLDOWN_MS = 5 * 60 * 1000;
2246
2341
  var identityCache = new Map;
2342
+ var linkedGitWorktreeCache = new Map;
2247
2343
  var lastKnownGitIdentityCache = new Map;
2248
2344
  var directoryFallbackCache = new Map;
2249
2345
  var transientFailureCooldown = new Map;
@@ -2458,7 +2554,12 @@ function takeDubiousOwnershipProjectIdentityWarning(directory) {
2458
2554
  return formatDubiousOwnershipWarning(canonical);
2459
2555
  }
2460
2556
  function canonicalUserHomeDirectory() {
2461
- return realpathSync.native(userHomeDirectoryForIdentity());
2557
+ const homeDirectory = userHomeDirectoryForIdentity();
2558
+ try {
2559
+ return realpathSync.native(homeDirectory);
2560
+ } catch {
2561
+ return homeDirectory;
2562
+ }
2462
2563
  }
2463
2564
  function isUserHomeDirectory(directory) {
2464
2565
  try {
@@ -2592,6 +2693,27 @@ function normalizeStoredProjectPath(rawOrStored) {
2592
2693
  function storedPathBelongsToIdentity(storedProjectPath, projectIdentity) {
2593
2694
  return storedProjectPath === projectIdentity || normalizeStoredProjectPath(storedProjectPath) === projectIdentity;
2594
2695
  }
2696
+ function isLinkedGitWorktree(directory) {
2697
+ const resolvedDirectory = path.resolve(directory);
2698
+ const cached = linkedGitWorktreeCache.get(resolvedDirectory);
2699
+ if (cached !== undefined)
2700
+ return cached;
2701
+ let linked = false;
2702
+ try {
2703
+ const output = execFileSyncForIdentity("git", ["rev-parse", "--path-format=absolute", "--git-dir", "--git-common-dir"], {
2704
+ cwd: resolvedDirectory,
2705
+ encoding: "utf8",
2706
+ timeout: GIT_TIMEOUT_MS,
2707
+ windowsHide: true
2708
+ });
2709
+ const [gitDir, commonDir] = String(output).split(/\r?\n/u).map((line) => line.trim()).filter(Boolean);
2710
+ linked = Boolean(gitDir && commonDir && path.resolve(gitDir) !== path.resolve(commonDir));
2711
+ } catch {
2712
+ linked = hasGitDir(resolvedDirectory);
2713
+ }
2714
+ linkedGitWorktreeCache.set(resolvedDirectory, linked);
2715
+ return linked;
2716
+ }
2595
2717
  // src/features/magic-context/workspaces.ts
2596
2718
  var VALID_SHARE_CATEGORIES = new Set(V2_MEMORY_CATEGORIES);
2597
2719
  var DEFAULT_WORKSPACE_SHARE_CATEGORIES = ["CONSTRAINTS"];
@@ -3083,6 +3205,7 @@ var MIGRATIONS = [
3083
3205
  status TEXT NOT NULL DEFAULT 'active',
3084
3206
  promoted_at INTEGER NOT NULL,
3085
3207
  source_candidate_ids TEXT DEFAULT '[]',
3208
+ source_candidate_provenance TEXT,
3086
3209
  created_at INTEGER NOT NULL,
3087
3210
  updated_at INTEGER NOT NULL
3088
3211
  );
@@ -4109,6 +4232,7 @@ var MIGRATIONS = [
4109
4232
  last_observed_at INTEGER,
4110
4233
  answer_refreshed_at INTEGER,
4111
4234
  source_candidate_ids TEXT NOT NULL DEFAULT '[]',
4235
+ source_candidate_provenance TEXT,
4112
4236
  created_at INTEGER NOT NULL,
4113
4237
  updated_at INTEGER NOT NULL
4114
4238
  );
@@ -4918,6 +5042,37 @@ var MIGRATIONS = [
4918
5042
  ensureColumn(db, "notes", "compiled_at", "INTEGER");
4919
5043
  ensureColumn(db, "notes", "compile_status", "TEXT CHECK(compile_status IN ('compiled', 'plain', 'refused'))");
4920
5044
  }
5045
+ },
5046
+ {
5047
+ version: 77,
5048
+ description: "persist scoped provenance for promoted user memories and primers",
5049
+ up(db) {
5050
+ if (tableExists2(db, "user_memories")) {
5051
+ ensureColumn(db, "user_memories", "source_candidate_provenance", "TEXT");
5052
+ }
5053
+ if (tableExists2(db, "primers")) {
5054
+ ensureColumn(db, "primers", "source_candidate_provenance", "TEXT");
5055
+ }
5056
+ }
5057
+ },
5058
+ {
5059
+ version: 78,
5060
+ description: "add migration_pending journal for crash-safe cross-harness session migration",
5061
+ up(db) {
5062
+ db.exec(`
5063
+ CREATE TABLE IF NOT EXISTS migration_pending (
5064
+ migration_key TEXT PRIMARY KEY,
5065
+ source_session_id TEXT NOT NULL,
5066
+ target_harness TEXT NOT NULL,
5067
+ pi_session_id TEXT NOT NULL,
5068
+ final_path TEXT NOT NULL,
5069
+ stage_path TEXT NOT NULL,
5070
+ content_sha256 TEXT NOT NULL,
5071
+ phase TEXT NOT NULL CHECK (phase IN ('staged', 'db_committed')),
5072
+ created_at INTEGER NOT NULL
5073
+ );
5074
+ `);
5075
+ }
4921
5076
  }
4922
5077
  ];
4923
5078
  var LATEST_MIGRATION_VERSION = MIGRATIONS.reduce((max, m) => Math.max(max, m.version), 0);
@@ -5385,7 +5540,7 @@ function getSchemaFenceRejection() {
5385
5540
  function getMigrationOnOpenRefusal() {
5386
5541
  return lastMigrationOnOpenRefusal;
5387
5542
  }
5388
- var LATEST_SUPPORTED_VERSION = 76;
5543
+ var LATEST_SUPPORTED_VERSION = 78;
5389
5544
  var PERMISSIONS_ENFORCEABLE = process.platform !== "win32";
5390
5545
  var defaultStoragePermissionFs = { chmodSync, mkdirSync };
5391
5546
  var storagePermissionFs = defaultStoragePermissionFs;
@@ -5585,6 +5740,7 @@ function inspectRpcServerDiscovery(storageDir) {
5585
5740
  }
5586
5741
  const pids = new Set;
5587
5742
  const staleFiles = [];
5743
+ const inconclusivePids = new Set;
5588
5744
  for (const portFile of portFiles) {
5589
5745
  let raw;
5590
5746
  try {
@@ -5604,10 +5760,15 @@ function inspectRpcServerDiscovery(storageDir) {
5604
5760
  return junk;
5605
5761
  continue;
5606
5762
  }
5607
- if (isPidAlive(record.pid) && isPidIdentityPlausible(record))
5763
+ const liveness = isPidAlive(record.pid);
5764
+ const identity = liveness === "dead" ? "implausible" : isPidIdentityPlausible(record);
5765
+ if (liveness === "alive" && identity === "plausible") {
5608
5766
  pids.add(record.pid);
5609
- else
5767
+ } else if (liveness === "dead" || identity === "implausible") {
5610
5768
  staleFiles.push(portFile);
5769
+ } else {
5770
+ inconclusivePids.add(record.pid);
5771
+ }
5611
5772
  }
5612
5773
  for (const staleFile of staleFiles) {
5613
5774
  try {
@@ -5620,8 +5781,29 @@ function inspectRpcServerDiscovery(storageDir) {
5620
5781
  if (serverPids.length > 0) {
5621
5782
  return { state: "live", serverPids, staleFiles };
5622
5783
  }
5784
+ const uncertainPids = [...inconclusivePids].sort((a, b) => a - b);
5785
+ if (uncertainPids.length > 0) {
5786
+ return {
5787
+ state: "inconclusive",
5788
+ serverPids: [],
5789
+ staleFiles,
5790
+ inconclusivePids: uncertainPids
5791
+ };
5792
+ }
5623
5793
  return { state: "stale", serverPids: [], staleFiles };
5624
5794
  }
5795
+ function formatInconclusiveOpenCodeMigrationWarning(dbPath, pids) {
5796
+ return `[magic-context] storage warning: continuing migration for ${dbPath}; OpenCode server PID ${pids.join(", ")} was not confirmed because its liveness or identity check could not run. This commonly means an OS sandbox denied kill(0) or ps. No live OpenCode server was confirmed.`;
5797
+ }
5798
+ function logInconclusiveMigrationProbes(dbPath, discovery, piProbeState) {
5799
+ const uncertainPids = discovery.inconclusivePids ?? [];
5800
+ if (uncertainPids.length > 0) {
5801
+ log(formatInconclusiveOpenCodeMigrationWarning(dbPath, uncertainPids));
5802
+ }
5803
+ if (piProbeState === "unreadable") {
5804
+ log(`[magic-context] storage warning: continuing migration for ${dbPath}; the Pi/OMP process-list probe could not run, which commonly means an OS sandbox denied ps. No live Pi harness was confirmed.`);
5805
+ }
5806
+ }
5625
5807
  function enforceMigrationOnOpenGuard(db, dbPath, dbDir, latestSupportedVersion) {
5626
5808
  const persistedVersion = getPersistedSchemaVersion(db);
5627
5809
  if (persistedVersion >= latestSupportedVersion) {
@@ -5629,9 +5811,11 @@ function enforceMigrationOnOpenGuard(db, dbPath, dbDir, latestSupportedVersion)
5629
5811
  return true;
5630
5812
  }
5631
5813
  const discovery = inspectRpcServerDiscovery(dbDir);
5632
- const piPids = discoverLivePiProcessIds();
5633
- if ((discovery.state === "absent" || discovery.state === "stale") && piPids.length === 0) {
5814
+ const piDiscovery = inspectLivePiProcesses();
5815
+ const piPids = piDiscovery.processIds;
5816
+ if ((discovery.state === "absent" || discovery.state === "stale" || discovery.state === "inconclusive") && piPids.length === 0) {
5634
5817
  lastMigrationOnOpenRefusal = null;
5818
+ logInconclusiveMigrationProbes(dbPath, discovery, piDiscovery.state);
5635
5819
  return true;
5636
5820
  }
5637
5821
  const blockingPids = [...new Set([...discovery.serverPids, ...piPids])].sort((left, right) => left - right);
@@ -5649,10 +5833,10 @@ function enforceMigrationOnOpenGuard(db, dbPath, dbDir, latestSupportedVersion)
5649
5833
  log(`[magic-context] storage fatal: refusing to migrate ${dbPath} from upstream migration v${persistedVersion} to v${latestSupportedVersion} because RPC discovery file ${unreadableFile} is uncertain (${arm} arm), so the absence of a live OpenCode server cannot be proven. ${recovery}`);
5650
5834
  } else {
5651
5835
  const blockers = [
5652
- ...discovery.serverPids.map((pid) => `OpenCode server PID ${pid}`),
5653
- ...piPids.map((pid) => `Pi harness PID ${pid}`)
5836
+ ...discovery.serverPids.map((pid) => `confirmed OpenCode server PID ${pid}`),
5837
+ ...piPids.map((pid) => `confirmed Pi harness PID ${pid}`)
5654
5838
  ];
5655
- log(`[magic-context] storage fatal: refusing to migrate ${dbPath} from upstream migration v${persistedVersion} to v${latestSupportedVersion} while ${blockers.join(", ")} may still use the old plugin build. Restart the blocking harness, then retry this process.`);
5839
+ log(`[magic-context] storage fatal: refusing to migrate ${dbPath} from upstream migration v${persistedVersion} to v${latestSupportedVersion} while ${blockers.join(", ")} still use the old plugin build. Restart the blocking harness, then retry this process.`);
5656
5840
  }
5657
5841
  return false;
5658
5842
  }
@@ -5876,6 +6060,7 @@ function initializeDatabase(db) {
5876
6060
  last_observed_at INTEGER,
5877
6061
  answer_refreshed_at INTEGER,
5878
6062
  source_candidate_ids TEXT NOT NULL DEFAULT '[]',
6063
+ source_candidate_provenance TEXT,
5879
6064
  created_at INTEGER NOT NULL,
5880
6065
  updated_at INTEGER NOT NULL
5881
6066
  );
@@ -6511,6 +6696,11 @@ CREATE INDEX IF NOT EXISTS idx_dream_queue_pending ON dream_queue(started_at, en
6511
6696
  ensureColumn(db, "primer_candidates", "question_embedding", "BLOB");
6512
6697
  ensureColumn(db, "primer_candidates", "question_embedding_model_id", "TEXT");
6513
6698
  ensureColumn(db, "primers", "question_embedding_model_id", "TEXT");
6699
+ ensureColumn(db, "primers", "source_candidate_provenance", "TEXT");
6700
+ const hasUserMemoriesTable = db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'user_memories'").get();
6701
+ if (hasUserMemoriesTable) {
6702
+ ensureColumn(db, "user_memories", "source_candidate_provenance", "TEXT");
6703
+ }
6514
6704
  db.exec(`
6515
6705
  CREATE UNIQUE INDEX IF NOT EXISTS idx_primer_candidates_occurrence
6516
6706
  ON primer_candidates(project_path, harness, session_id, source_start_message_id, source_end_message_id);
@@ -6584,6 +6774,8 @@ CREATE INDEX IF NOT EXISTS idx_dream_queue_pending ON dream_queue(started_at, en
6584
6774
  ensureColumn(db, "session_meta", "stripped_placeholder_ids", "TEXT DEFAULT ''");
6585
6775
  ensureColumn(db, "session_meta", "stale_reduce_stripped_ids", "TEXT DEFAULT ''");
6586
6776
  ensureColumn(db, "session_meta", "processed_image_stripped_ids", "TEXT DEFAULT ''");
6777
+ ensureColumn(db, "session_meta", "merged_reasoning_stripped_ids", "TEXT DEFAULT ''");
6778
+ ensureColumn(db, "session_meta", "trailing_blank_decisions", "TEXT DEFAULT ''");
6587
6779
  ensureColumn(db, "compartments", "start_message_id", "TEXT DEFAULT ''");
6588
6780
  ensureColumn(db, "compartments", "end_message_id", "TEXT DEFAULT ''");
6589
6781
  ensureColumn(db, "memory_embeddings", "model_id", "TEXT");
@@ -8205,7 +8397,7 @@ function clearHistorianFailureState(db, sessionId) {
8205
8397
  })();
8206
8398
  }
8207
8399
  function normalizeDetectedLimitModelKey(modelKey) {
8208
- return typeof modelKey === "string" && modelKey.length > 0 ? modelKey : null;
8400
+ return typeof modelKey === "string" && modelKey.length > 0 ? piModelRefToCanonical(modelKey) : null;
8209
8401
  }
8210
8402
  function normalizeEmergencyRecoveryOrigin(value) {
8211
8403
  return value === "provider_overflow" || value === "proactive_model_shrink" ? value : null;
@@ -8356,6 +8548,84 @@ function removeStrippedPlaceholderId(db, sessionId, messageId) {
8356
8548
  applyStrippedPlaceholderDelta(db, sessionId, { remove: [messageId] });
8357
8549
  return true;
8358
8550
  }
8551
+ function getMergedReasoningStrippedIds(db, sessionId) {
8552
+ const row = db.prepare("SELECT merged_reasoning_stripped_ids FROM session_meta WHERE session_id = ?").get(sessionId);
8553
+ return new Set(parseStrippedBlob(row?.merged_reasoning_stripped_ids));
8554
+ }
8555
+ function addMergedReasoningStrippedIds(db, sessionId, ids) {
8556
+ const add = [...ids];
8557
+ if (add.length === 0)
8558
+ return true;
8559
+ ensureSessionMetaRow(db, sessionId);
8560
+ for (let attempt = 0;attempt < CAS_RETRY_LIMIT; attempt += 1) {
8561
+ const row = db.prepare("SELECT merged_reasoning_stripped_ids FROM session_meta WHERE session_id = ?").get(sessionId);
8562
+ const rawStored = row ? row.merged_reasoning_stripped_ids ?? null : null;
8563
+ const current = new Set(parseStrippedBlob(rawStored));
8564
+ let changed = false;
8565
+ for (const id of add) {
8566
+ if (!current.has(id)) {
8567
+ current.add(id);
8568
+ changed = true;
8569
+ }
8570
+ }
8571
+ if (!changed)
8572
+ return true;
8573
+ const nextBlob = JSON.stringify([...current]);
8574
+ const result = db.prepare("UPDATE session_meta SET merged_reasoning_stripped_ids = ? WHERE session_id = ? AND merged_reasoning_stripped_ids IS ?").run(nextBlob, sessionId, rawStored);
8575
+ if (result.changes > 0)
8576
+ return true;
8577
+ }
8578
+ sessionLog(sessionId, `merged_reasoning_stripped_ids CAS: ${CAS_RETRY_LIMIT} retries exhausted`);
8579
+ return false;
8580
+ }
8581
+ function parseTrailingBlankDecisions(raw) {
8582
+ if (!raw)
8583
+ return new Map;
8584
+ try {
8585
+ const parsed = JSON.parse(raw);
8586
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
8587
+ return new Map;
8588
+ const decisions = new Map;
8589
+ for (const [id, decision] of Object.entries(parsed)) {
8590
+ if (id.length > 0 && (decision === "keep" || decision === "strip")) {
8591
+ decisions.set(id, decision);
8592
+ }
8593
+ }
8594
+ return decisions;
8595
+ } catch {
8596
+ return new Map;
8597
+ }
8598
+ }
8599
+ function getTrailingBlankDecisions(db, sessionId) {
8600
+ const row = db.prepare("SELECT trailing_blank_decisions FROM session_meta WHERE session_id = ?").get(sessionId);
8601
+ return parseTrailingBlankDecisions(row?.trailing_blank_decisions);
8602
+ }
8603
+ function addTrailingBlankDecisions(db, sessionId, additions) {
8604
+ const add = [...additions];
8605
+ if (add.length === 0)
8606
+ return true;
8607
+ ensureSessionMetaRow(db, sessionId);
8608
+ for (let attempt = 0;attempt < CAS_RETRY_LIMIT; attempt += 1) {
8609
+ const row = db.prepare("SELECT trailing_blank_decisions FROM session_meta WHERE session_id = ?").get(sessionId);
8610
+ const rawStored = row ? row.trailing_blank_decisions ?? null : null;
8611
+ const current = parseTrailingBlankDecisions(rawStored);
8612
+ let changed = false;
8613
+ for (const [id, decision] of add) {
8614
+ if (!current.has(id)) {
8615
+ current.set(id, decision);
8616
+ changed = true;
8617
+ }
8618
+ }
8619
+ if (!changed)
8620
+ return true;
8621
+ const nextBlob = JSON.stringify(Object.fromEntries(current));
8622
+ const result = db.prepare("UPDATE session_meta SET trailing_blank_decisions = ? WHERE session_id = ? AND trailing_blank_decisions IS ?").run(nextBlob, sessionId, rawStored);
8623
+ if (result.changes > 0)
8624
+ return true;
8625
+ }
8626
+ sessionLog(sessionId, `trailing_blank_decisions CAS: ${CAS_RETRY_LIMIT} retries exhausted`);
8627
+ return false;
8628
+ }
8359
8629
  function getStaleReduceStrippedIds(db, sessionId) {
8360
8630
  const row = db.prepare("SELECT stale_reduce_stripped_ids FROM session_meta WHERE session_id = ?").get(sessionId);
8361
8631
  return new Set(parseStrippedBlob(row?.stale_reduce_stripped_ids));
@@ -8803,6 +9073,76 @@ function parseCandidateIds(raw) {
8803
9073
  return [];
8804
9074
  }
8805
9075
  }
9076
+ function parsePrimerSourceProvenance(raw) {
9077
+ if (raw === null)
9078
+ return null;
9079
+ try {
9080
+ const parsed = JSON.parse(raw);
9081
+ if (!Array.isArray(parsed))
9082
+ return null;
9083
+ const provenance = [];
9084
+ for (const value of parsed) {
9085
+ if (!value || typeof value !== "object")
9086
+ return null;
9087
+ const source = value;
9088
+ if (typeof source.candidate_id !== "number" || !Number.isFinite(source.candidate_id) || typeof source.project_path !== "string" || typeof source.harness !== "string" || typeof source.session_id !== "string" || source.source_compartment_start !== null && typeof source.source_compartment_start !== "number" || source.source_compartment_end !== null && typeof source.source_compartment_end !== "number" || typeof source.source_start_message_id !== "string" || typeof source.source_end_message_id !== "string") {
9089
+ return null;
9090
+ }
9091
+ provenance.push({
9092
+ candidateId: source.candidate_id,
9093
+ projectPath: source.project_path,
9094
+ harness: source.harness,
9095
+ sessionId: source.session_id,
9096
+ sourceCompartmentStart: source.source_compartment_start,
9097
+ sourceCompartmentEnd: source.source_compartment_end,
9098
+ sourceStartMessageId: source.source_start_message_id,
9099
+ sourceEndMessageId: source.source_end_message_id
9100
+ });
9101
+ }
9102
+ return provenance;
9103
+ } catch {
9104
+ return null;
9105
+ }
9106
+ }
9107
+ function loadPrimerSourceProvenance(db, candidateIds) {
9108
+ const ids = [...new Set(candidateIds)].sort((a, b) => a - b);
9109
+ if (ids.length === 0)
9110
+ return [];
9111
+ const placeholders3 = ids.map(() => "?").join(",");
9112
+ const rows = db.prepare(`SELECT id, project_path, harness, session_id,
9113
+ source_compartment_start, source_compartment_end,
9114
+ source_start_message_id, source_end_message_id
9115
+ FROM primer_candidates
9116
+ WHERE id IN (${placeholders3})
9117
+ ORDER BY id ASC`).all(...ids);
9118
+ return rows.map((row) => ({
9119
+ candidateId: row.id,
9120
+ projectPath: row.project_path,
9121
+ harness: row.harness,
9122
+ sessionId: row.session_id,
9123
+ sourceCompartmentStart: row.source_compartment_start,
9124
+ sourceCompartmentEnd: row.source_compartment_end,
9125
+ sourceStartMessageId: row.source_start_message_id,
9126
+ sourceEndMessageId: row.source_end_message_id
9127
+ }));
9128
+ }
9129
+ function serializePrimerSourceProvenance(provenance, sourceCandidateIds) {
9130
+ if (provenance.length === 0 && sourceCandidateIds.length > 0)
9131
+ return null;
9132
+ return JSON.stringify(provenance.map((source) => ({
9133
+ candidate_id: source.candidateId,
9134
+ project_path: source.projectPath,
9135
+ harness: source.harness,
9136
+ session_id: source.sessionId,
9137
+ source_compartment_start: source.sourceCompartmentStart,
9138
+ source_compartment_end: source.sourceCompartmentEnd,
9139
+ source_start_message_id: source.sourceStartMessageId,
9140
+ source_end_message_id: source.sourceEndMessageId
9141
+ })));
9142
+ }
9143
+ function normalizedCandidateIds(candidateIds) {
9144
+ return [...new Set(candidateIds)].sort((a, b) => a - b);
9145
+ }
8806
9146
  function toCandidate(row) {
8807
9147
  return {
8808
9148
  id: row.id,
@@ -8835,6 +9175,7 @@ function toPrimer(row) {
8835
9175
  lastObservedAt: row.last_observed_at,
8836
9176
  answerRefreshedAt: row.answer_refreshed_at,
8837
9177
  sourceCandidateIds: parseCandidateIds(row.source_candidate_ids),
9178
+ sourceProvenance: parsePrimerSourceProvenance(row.source_candidate_provenance),
8838
9179
  createdAt: row.created_at,
8839
9180
  updatedAt: row.updated_at
8840
9181
  };
@@ -8906,23 +9247,43 @@ function getActivePrimers(db, projectPath) {
8906
9247
  return rows.map(toPrimer);
8907
9248
  }
8908
9249
  function createPrimer(db, input) {
8909
- const now = input.now ?? Date.now();
8910
- const info = db.prepare(`INSERT INTO primers (
8911
- project_path, question, question_embedding, question_embedding_model_id, answer,
8912
- status, total_support, last_observed_at, answer_refreshed_at,
8913
- source_candidate_ids, created_at, updated_at
8914
- ) VALUES (?, ?, ?, ?, ?, 'active', ?, ?, NULL, ?, ?, ?)`).run(input.projectPath, input.question, vectorBlob(input.questionEmbedding), input.questionEmbeddingModelId ?? null, input.answer ?? "", input.totalSupport, input.lastObservedAt, JSON.stringify([...new Set(input.sourceCandidateIds)].sort((a, b) => a - b)), now, now);
8915
- return Number(info.lastInsertRowid);
9250
+ return db.transaction(() => {
9251
+ const now = input.now ?? Date.now();
9252
+ const sourceCandidateIds = normalizedCandidateIds(input.sourceCandidateIds);
9253
+ const sourceProvenance = loadPrimerSourceProvenance(db, sourceCandidateIds);
9254
+ const info = db.prepare(`INSERT INTO primers (
9255
+ project_path, question, question_embedding, question_embedding_model_id, answer,
9256
+ status, total_support, last_observed_at, answer_refreshed_at,
9257
+ source_candidate_ids, source_candidate_provenance, created_at, updated_at
9258
+ ) VALUES (?, ?, ?, ?, ?, 'active', ?, ?, NULL, ?, ?, ?, ?)`).run(input.projectPath, input.question, vectorBlob(input.questionEmbedding), input.questionEmbeddingModelId ?? null, input.answer ?? "", input.totalSupport, input.lastObservedAt, JSON.stringify(sourceCandidateIds), serializePrimerSourceProvenance(sourceProvenance, sourceCandidateIds), now, now);
9259
+ return Number(info.lastInsertRowid);
9260
+ })();
8916
9261
  }
8917
9262
  function updatePrimerSupport(db, input) {
8918
- db.prepare(`UPDATE primers
8919
- SET question_embedding = COALESCE(?, question_embedding),
8920
- question_embedding_model_id = COALESCE(?, question_embedding_model_id),
8921
- total_support = ?,
8922
- last_observed_at = ?,
8923
- source_candidate_ids = ?,
8924
- updated_at = ?
8925
- WHERE id = ?`).run(vectorBlob(input.questionEmbedding), input.questionEmbeddingModelId ?? null, input.totalSupport, input.lastObservedAt, JSON.stringify([...new Set(input.sourceCandidateIds)].sort((a, b) => a - b)), input.now ?? Date.now(), input.primerId);
9263
+ db.transaction(() => {
9264
+ const sourceCandidateIds = normalizedCandidateIds(input.sourceCandidateIds);
9265
+ const allowedIds = new Set(sourceCandidateIds);
9266
+ const existingRow = db.prepare("SELECT source_candidate_provenance FROM primers WHERE id = ?").get(input.primerId);
9267
+ const provenanceByCandidateId = new Map;
9268
+ for (const source of parsePrimerSourceProvenance(existingRow?.source_candidate_provenance ?? null) ?? []) {
9269
+ if (allowedIds.has(source.candidateId)) {
9270
+ provenanceByCandidateId.set(source.candidateId, source);
9271
+ }
9272
+ }
9273
+ for (const source of loadPrimerSourceProvenance(db, sourceCandidateIds)) {
9274
+ provenanceByCandidateId.set(source.candidateId, source);
9275
+ }
9276
+ const sourceProvenance = [...provenanceByCandidateId.values()].sort((a, b) => a.candidateId - b.candidateId);
9277
+ db.prepare(`UPDATE primers
9278
+ SET question_embedding = COALESCE(?, question_embedding),
9279
+ question_embedding_model_id = COALESCE(?, question_embedding_model_id),
9280
+ total_support = ?,
9281
+ last_observed_at = ?,
9282
+ source_candidate_ids = ?,
9283
+ source_candidate_provenance = ?,
9284
+ updated_at = ?
9285
+ WHERE id = ?`).run(vectorBlob(input.questionEmbedding), input.questionEmbeddingModelId ?? null, input.totalSupport, input.lastObservedAt, JSON.stringify(sourceCandidateIds), serializePrimerSourceProvenance(sourceProvenance, sourceCandidateIds), input.now ?? Date.now(), input.primerId);
9286
+ })();
8926
9287
  }
8927
9288
  function updatePrimerAnswer(db, primerId, answer, refreshedAt = Date.now()) {
8928
9289
  db.prepare("UPDATE primers SET answer = ?, answer_refreshed_at = ?, updated_at = ? WHERE id = ?").run(answer, refreshedAt, refreshedAt, primerId);
@@ -9651,7 +10012,7 @@ var LIMIT_EXTRACTION_PATTERNS = [
9651
10012
  pattern: /too large for model with (\d+) maximum context length/i,
9652
10013
  provenance: "combined"
9653
10014
  },
9654
- { pattern: /context size.*(\d+) tokens?/i, provenance: "combined" },
10015
+ { pattern: /context size[^0-9]{0,40}(\d{4,})\s*tokens?/i, provenance: "combined" },
9655
10016
  { pattern: /exceeds? the context length of (\d+)/i, provenance: "combined" },
9656
10017
  {
9657
10018
  pattern: />\s*(\d+)\s*(?:tokens?\s*)?(?:maximum|max|limit)\b/i,
@@ -10052,16 +10413,25 @@ function modelKeyLookupOrder(modelKey) {
10052
10413
  return [];
10053
10414
  const provider = modelKey.slice(0, slash);
10054
10415
  let modelID = modelKey.slice(slash + 1);
10416
+ const providerRefs = modelRefLookupOrder(`${provider}/${modelID}`);
10055
10417
  const candidates = [];
10056
10418
  while (modelID.length > 0) {
10057
- candidates.push({ key: `${provider}/${modelID}`, source: "exact" });
10419
+ for (const providerRef of providerRefs) {
10420
+ const providerSlash = providerRef.indexOf("/");
10421
+ const providerPrefix = providerRef.slice(0, providerSlash);
10422
+ candidates.push({ key: `${providerPrefix}/${modelID}`, source: "exact" });
10423
+ }
10058
10424
  candidates.push({ key: modelID, source: "bare" });
10059
10425
  const lastDash = modelID.lastIndexOf("-");
10060
10426
  if (lastDash <= 0)
10061
10427
  break;
10062
10428
  modelID = modelID.slice(0, lastDash);
10063
10429
  }
10064
- candidates.push({ key: `${provider}/*`, source: "wildcard" });
10430
+ for (const providerRef of providerRefs) {
10431
+ const providerSlash = providerRef.indexOf("/");
10432
+ const providerPrefix = providerRef.slice(0, providerSlash);
10433
+ candidates.push({ key: `${providerPrefix}/*`, source: "wildcard" });
10434
+ }
10065
10435
  const seen = new Set;
10066
10436
  return candidates.filter((candidate) => {
10067
10437
  if (seen.has(candidate.key))
@@ -10592,12 +10962,13 @@ function createPromptSurfaceGuidanceEpochCache(runtime) {
10592
10962
  const epochs = new Map;
10593
10963
  return {
10594
10964
  resolve(sessionId, config, modelKey) {
10965
+ const canonicalModelKey = modelKey ? piModelRefToCanonical(modelKey) : undefined;
10595
10966
  const cached = epochs.get(sessionId);
10596
- if (cached && cached.config === config && cached.modelKey === modelKey) {
10967
+ if (cached && cached.config === config && cached.modelKey === canonicalModelKey) {
10597
10968
  return cached.selection;
10598
10969
  }
10599
- const selection = runtime.resolveGuidance(config, modelKey);
10600
- epochs.set(sessionId, { config, modelKey, selection });
10970
+ const selection = runtime.resolveGuidance(config, canonicalModelKey);
10971
+ epochs.set(sessionId, { config, modelKey: canonicalModelKey, selection });
10601
10972
  return selection;
10602
10973
  },
10603
10974
  clear(sessionId) {
@@ -10703,13 +11074,44 @@ function pruneExpiredUserMemoryCandidates(db, ttlMs, now = Date.now()) {
10703
11074
  const result = db.prepare("DELETE FROM user_memory_candidates WHERE created_at < ?").run(cutoff);
10704
11075
  return Number(result.changes ?? 0);
10705
11076
  }
11077
+ function loadUserMemorySourceProvenance(db, candidateIds) {
11078
+ const ids = [...new Set(candidateIds)].sort((a, b) => a - b);
11079
+ if (ids.length === 0)
11080
+ return [];
11081
+ const placeholders3 = ids.map(() => "?").join(",");
11082
+ const rows = db.prepare(`SELECT id, session_id, source_compartment_start, source_compartment_end
11083
+ FROM user_memory_candidates
11084
+ WHERE id IN (${placeholders3})
11085
+ ORDER BY id ASC`).all(...ids);
11086
+ return rows.map((row) => ({
11087
+ candidateId: row.id,
11088
+ sessionId: row.session_id,
11089
+ sourceCompartmentStart: row.source_compartment_start,
11090
+ sourceCompartmentEnd: row.source_compartment_end
11091
+ }));
11092
+ }
11093
+ function serializeUserMemorySourceProvenance(provenance, sourceCandidateIds) {
11094
+ if (provenance.length === 0 && sourceCandidateIds.length > 0)
11095
+ return null;
11096
+ return JSON.stringify(provenance.map((source) => ({
11097
+ candidate_id: source.candidateId,
11098
+ session_id: source.sessionId,
11099
+ source_compartment_start: source.sourceCompartmentStart,
11100
+ source_compartment_end: source.sourceCompartmentEnd
11101
+ })));
11102
+ }
10706
11103
  function insertUserMemory(db, content, sourceCandidateIds) {
10707
- const now = Date.now();
10708
- const result = db.prepare("INSERT INTO user_memories (content, status, promoted_at, source_candidate_ids, created_at, updated_at) VALUES (?, 'active', ?, ?, ?, ?)").run(content, now, JSON.stringify(sourceCandidateIds), now, now);
10709
- return Number(result.lastInsertRowid);
11104
+ return db.transaction(() => {
11105
+ const now = Date.now();
11106
+ const sourceProvenance = loadUserMemorySourceProvenance(db, sourceCandidateIds);
11107
+ const result = db.prepare(`INSERT INTO user_memories
11108
+ (content, status, promoted_at, source_candidate_ids, source_candidate_provenance, created_at, updated_at)
11109
+ VALUES (?, 'active', ?, ?, ?, ?, ?)`).run(content, now, JSON.stringify(sourceCandidateIds), serializeUserMemorySourceProvenance(sourceProvenance, sourceCandidateIds), now, now);
11110
+ return Number(result.lastInsertRowid);
11111
+ })();
10710
11112
  }
10711
11113
  function getActiveUserMemories(db) {
10712
- const rows = db.prepare("SELECT id, content, status, promoted_at, source_candidate_ids, created_at, updated_at FROM user_memories WHERE status = 'active' ORDER BY promoted_at ASC, id ASC").all();
11114
+ const rows = db.prepare("SELECT id, content, status, promoted_at, source_candidate_ids, source_candidate_provenance, created_at, updated_at FROM user_memories WHERE status = 'active' ORDER BY promoted_at ASC, id ASC").all();
10713
11115
  return rows.map(parseUserMemoryRow);
10714
11116
  }
10715
11117
  function updateUserMemoryContent(db, id, content) {
@@ -10718,17 +11120,49 @@ function updateUserMemoryContent(db, id, content) {
10718
11120
  function dismissUserMemory(db, id) {
10719
11121
  db.prepare("UPDATE user_memories SET status = 'dismissed', updated_at = ? WHERE id = ?").run(Date.now(), id);
10720
11122
  }
10721
- function parseUserMemoryRow(row) {
10722
- let candidateIds = [];
11123
+ function parseCandidateIds2(raw) {
10723
11124
  try {
10724
- candidateIds = JSON.parse(row.source_candidate_ids);
10725
- } catch {}
11125
+ const parsed = JSON.parse(raw);
11126
+ return Array.isArray(parsed) ? parsed.filter((id) => typeof id === "number" && Number.isFinite(id)) : [];
11127
+ } catch {
11128
+ return [];
11129
+ }
11130
+ }
11131
+ function parseUserMemorySourceProvenance(raw) {
11132
+ if (raw === null)
11133
+ return null;
11134
+ try {
11135
+ const parsed = JSON.parse(raw);
11136
+ if (!Array.isArray(parsed))
11137
+ return null;
11138
+ const provenance = [];
11139
+ for (const value of parsed) {
11140
+ if (!value || typeof value !== "object")
11141
+ return null;
11142
+ const source = value;
11143
+ if (typeof source.candidate_id !== "number" || !Number.isFinite(source.candidate_id) || typeof source.session_id !== "string" || source.source_compartment_start !== null && typeof source.source_compartment_start !== "number" || source.source_compartment_end !== null && typeof source.source_compartment_end !== "number") {
11144
+ return null;
11145
+ }
11146
+ provenance.push({
11147
+ candidateId: source.candidate_id,
11148
+ sessionId: source.session_id,
11149
+ sourceCompartmentStart: source.source_compartment_start,
11150
+ sourceCompartmentEnd: source.source_compartment_end
11151
+ });
11152
+ }
11153
+ return provenance;
11154
+ } catch {
11155
+ return null;
11156
+ }
11157
+ }
11158
+ function parseUserMemoryRow(row) {
10726
11159
  return {
10727
11160
  id: row.id,
10728
11161
  content: row.content,
10729
11162
  status: row.status === "dismissed" ? "dismissed" : "active",
10730
11163
  promotedAt: row.promoted_at,
10731
- sourceCandidateIds: candidateIds,
11164
+ sourceCandidateIds: parseCandidateIds2(row.source_candidate_ids),
11165
+ sourceProvenance: parseUserMemorySourceProvenance(row.source_candidate_provenance),
10732
11166
  createdAt: row.created_at,
10733
11167
  updatedAt: row.updated_at
10734
11168
  };
@@ -27253,6 +27687,9 @@ var MagicContextConfigSchema = exports_external.object({
27253
27687
  exports_external.number().min(0),
27254
27688
  exports_external.object({ default: exports_external.number().min(0) }).catchall(exports_external.number().min(0))
27255
27689
  ]).optional().describe('User-only output-token reservation override. Number or per-model object ({ default: 16384, "provider/model": 8192 }); 0 disables reservation. When unset, Magic Context reserves the catalog output limit (capped at 25% of context) for shared-window providers and keeps proven separate-quota Google/Gemini windows unchanged.'),
27690
+ models: exports_external.object({
27691
+ window_overlay_path: exports_external.string().trim().min(1).optional()
27692
+ }).optional().describe("User-only Fusiform window-overlay settings. The path defaults to <dataDir>/fusiform/window-overlay.json."),
27256
27693
  toast_duration_ms: exports_external.number().min(0).max(60000).default(5000).describe("TUI toast lifetime in milliseconds for Magic Context notifications. Set to 0 to disable Magic Context toasts entirely (min: 0, max: 60000, default: 5000)"),
27257
27694
  execute_threshold_percentage: exports_external.union([
27258
27695
  exports_external.number().min(20).max(90, EXECUTE_THRESHOLD_CAP_MESSAGE),
@@ -30769,9 +31206,14 @@ function blockedEmbeddingEndpointReason(endpoint) {
30769
31206
  function normalizeEndpoint2(endpoint) {
30770
31207
  return endpoint?.trim().replace(/\/+$/, "") ?? "";
30771
31208
  }
30772
- function embeddingModelsMatch(served, requested) {
30773
- const a = served.trim().toLowerCase();
30774
- const b = requested.trim().toLowerCase();
31209
+ function parseEmbeddingModel(model) {
31210
+ const lastColon = model.lastIndexOf(":");
31211
+ if (lastColon > model.lastIndexOf("/")) {
31212
+ return { base: model.slice(0, lastColon), tag: model.slice(lastColon + 1) };
31213
+ }
31214
+ return { base: model };
31215
+ }
31216
+ function matchNormalizedEmbeddingModels(a, b) {
30775
31217
  if (a.length === 0 || b.length === 0)
30776
31218
  return true;
30777
31219
  if (a === b)
@@ -30785,6 +31227,16 @@ function embeddingModelsMatch(served, requested) {
30785
31227
  return true;
30786
31228
  return false;
30787
31229
  }
31230
+ function embeddingModelsMatch(served, requested) {
31231
+ const a = served.trim().toLowerCase();
31232
+ const b = requested.trim().toLowerCase();
31233
+ const servedModel = parseEmbeddingModel(a);
31234
+ const requestedModel = parseEmbeddingModel(b);
31235
+ if (servedModel.tag !== undefined && requestedModel.tag !== undefined && servedModel.tag !== requestedModel.tag) {
31236
+ return false;
31237
+ }
31238
+ return matchNormalizedEmbeddingModels(servedModel.base, requestedModel.base);
31239
+ }
30788
31240
  var FAILURE_THRESHOLD = 3;
30789
31241
  var FAILURE_WINDOW_MS = 60000;
30790
31242
  var OPEN_DURATION_MS = 5 * 60000;
@@ -30915,7 +31367,7 @@ class OpenAICompatibleEmbeddingProvider {
30915
31367
  const servedModel = typeof body.model === "string" ? body.model : "";
30916
31368
  if (this.model && servedModel && !embeddingModelsMatch(servedModel, this.model)) {
30917
31369
  if (!this.modelMismatchLogged) {
30918
- log(`[magic-context] embedding endpoint served a DIFFERENT model than requested — refusing the substituted vectors (they have the wrong dimensions/space). requested="${this.model}" served="${servedModel}". The endpoint likely substituted a loaded model; load/select "${this.model}" on the endpoint, or set embedding.model to the served model.`);
31370
+ log(`[magic-context] embedding endpoint served a DIFFERENT model than requested — refusing the substituted vectors (they have the wrong dimensions/space). requested="${this.model}" served="${servedModel}". Check that the endpoint serves the requested model; variant suffixes and vendor prefixes are matched automatically.`);
30919
31371
  this.modelMismatchLogged = true;
30920
31372
  }
30921
31373
  this.recordFailure(isProbe);
@@ -36710,11 +37162,15 @@ function trimMemoriesToBudget(sessionId, memories, budgetTokens) {
36710
37162
  }
36711
37163
  function prepareCompartmentInjection(db, sessionId, messages, isCacheBusting, projectPath, injectionBudgetTokens, temporalAwareness) {
36712
37164
  const cached2 = injectionCache.get(sessionId);
36713
- if (!isCacheBusting && cached2) {
36714
- if (cached2.kind === "empty") {
37165
+ if (cached2 && cached2.db !== db) {
37166
+ clearInjectionCache(sessionId);
37167
+ }
37168
+ const usableCached = cached2?.db === db ? cached2 : undefined;
37169
+ if (!isCacheBusting && usableCached) {
37170
+ if (usableCached.kind === "empty") {
36715
37171
  return null;
36716
37172
  }
36717
- const prepared = cached2.injection;
37173
+ const prepared = usableCached.injection;
36718
37174
  if (prepared.compartmentEndMessageId === null) {
36719
37175
  sessionLog(sessionId, "compartment injection cache in degraded mode (null boundary), forcing rebuild");
36720
37176
  } else {
@@ -36761,6 +37217,7 @@ function prepareCompartmentInjection(db, sessionId, messages, isCacheBusting, pr
36761
37217
  }
36762
37218
  if (compartments.length === 0 && facts.length === 0 && !memoryBlock) {
36763
37219
  injectionCache.set(sessionId, {
37220
+ db,
36764
37221
  kind: "empty",
36765
37222
  compartmentEndMessageId: "",
36766
37223
  renderedBytes: 0
@@ -36800,7 +37257,7 @@ function prepareCompartmentInjection(db, sessionId, messages, isCacheBusting, pr
36800
37257
  memoryCount,
36801
37258
  rebuiltFromDb: true
36802
37259
  };
36803
- injectionCache.set(sessionId, { kind: "populated", injection: result2 });
37260
+ injectionCache.set(sessionId, { db, kind: "populated", injection: result2 });
36804
37261
  return result2;
36805
37262
  }
36806
37263
  const lastCompartment = compartments[compartments.length - 1];
@@ -36832,7 +37289,7 @@ function prepareCompartmentInjection(db, sessionId, messages, isCacheBusting, pr
36832
37289
  memoryCount,
36833
37290
  rebuiltFromDb: true
36834
37291
  };
36835
- injectionCache.set(sessionId, { kind: "populated", injection: result2 });
37292
+ injectionCache.set(sessionId, { db, kind: "populated", injection: result2 });
36836
37293
  return result2;
36837
37294
  }
36838
37295
  let skippedVisibleMessages = 0;
@@ -36893,7 +37350,7 @@ function prepareCompartmentInjection(db, sessionId, messages, isCacheBusting, pr
36893
37350
  if (needsFreshMaterialization) {
36894
37351
  result.needsFreshMaterialization = true;
36895
37352
  }
36896
- injectionCache.set(sessionId, { kind: "populated", injection: result });
37353
+ injectionCache.set(sessionId, { db, kind: "populated", injection: result });
36897
37354
  return result;
36898
37355
  }
36899
37356
  function readCachedBaselineState(db, sessionId) {
@@ -37255,7 +37712,7 @@ function readCurrentM0SnapshotMarkersUncached(args) {
37255
37712
  upgradeState: getUpgradeState(args.db, args.sessionId),
37256
37713
  compartmentRenderEpoch: COMPARTMENT_RENDER_EPOCH,
37257
37714
  systemHash: hard.systemHash,
37258
- modelKey: hard.modelKey,
37715
+ modelKey: piModelRefToCanonical(hard.modelKey),
37259
37716
  projectIdentity: args.projectPath ?? null,
37260
37717
  muralEnabled: args.muralEnabled === true,
37261
37718
  renderBudgetIdentity: renderBudgetIdentity(args.memoryInjectionBudgetTokens, args.historyBudgetTokens)
@@ -37358,7 +37815,9 @@ function mustMaterialize(args) {
37358
37815
  if (cachedUpgradeIdentity.muralEnabled !== null && cachedUpgradeIdentity.muralEnabled !== current.muralEnabled || cachedUpgradeIdentity.renderBudgetIdentity !== null && cachedUpgradeIdentity.renderBudgetIdentity !== current.renderBudgetIdentity) {
37359
37816
  return { value: true, reason: "render_config" };
37360
37817
  }
37361
- if (hard.modelKey !== "" && hard.modelKey !== (args.state.cachedM0ModelKey ?? "")) {
37818
+ const canonicalHardModelKey = piModelRefToCanonical(hard.modelKey);
37819
+ const canonicalCachedModelKey = piModelRefToCanonical(args.state.cachedM0ModelKey ?? "");
37820
+ if (canonicalHardModelKey !== "" && canonicalHardModelKey !== canonicalCachedModelKey) {
37362
37821
  return { value: true, reason: "model_change" };
37363
37822
  }
37364
37823
  if (hard.systemHash !== "" && hard.systemHash !== (args.state.cachedM0SystemHash ?? "")) {
@@ -38102,7 +38561,7 @@ function markersFromCachedRow(row) {
38102
38561
  };
38103
38562
  }
38104
38563
  function cachedRowMatchesState(row, state2) {
38105
- return bufferEqualsNullable(row.cached_m0_bytes, state2.cachedM0Bytes) && (row.cached_m0_mural_data_url ?? null) === (state2.cachedM0MuralDataUrl ?? null) && (row.cached_m0_mural_hash ?? null) === (state2.cachedM0MuralHash ?? null) && row.cached_m0_project_memory_epoch === state2.cachedM0ProjectMemoryEpoch && (row.cached_m0_workspace_fingerprint ?? null) === (state2.cachedM0WorkspaceFingerprint ?? null) && row.cached_m0_project_user_profile_version === state2.cachedM0ProjectUserProfileVersion && row.cached_m0_max_compartment_seq === state2.cachedM0MaxCompartmentSeq && row.cached_m0_max_memory_id === state2.cachedM0MaxMemoryId && row.cached_m0_max_mutation_id === state2.cachedM0MaxMutationId && row.cached_m0_max_memory_mutation_id === state2.cachedM0MaxMemoryMutationId && row.cached_m0_materialized_at === state2.cachedM0MaterializedAt && row.cached_m0_session_facts_version === state2.cachedM0SessionFactsVersion && (row.cached_m0_upgrade_state ?? null) === (state2.cachedM0UpgradeState ?? null) && (row.cached_m0_system_hash ?? "") === (state2.cachedM0SystemHash ?? "") && (row.cached_m0_model_key ?? "") === (state2.cachedM0ModelKey ?? "") && (row.cached_m0_project_identity ?? null) === (state2.cachedM0ProjectIdentity ?? null);
38564
+ return bufferEqualsNullable(row.cached_m0_bytes, state2.cachedM0Bytes) && (row.cached_m0_mural_data_url ?? null) === (state2.cachedM0MuralDataUrl ?? null) && (row.cached_m0_mural_hash ?? null) === (state2.cachedM0MuralHash ?? null) && row.cached_m0_project_memory_epoch === state2.cachedM0ProjectMemoryEpoch && (row.cached_m0_workspace_fingerprint ?? null) === (state2.cachedM0WorkspaceFingerprint ?? null) && row.cached_m0_project_user_profile_version === state2.cachedM0ProjectUserProfileVersion && row.cached_m0_max_compartment_seq === state2.cachedM0MaxCompartmentSeq && row.cached_m0_max_memory_id === state2.cachedM0MaxMemoryId && row.cached_m0_max_mutation_id === state2.cachedM0MaxMutationId && row.cached_m0_max_memory_mutation_id === state2.cachedM0MaxMemoryMutationId && row.cached_m0_materialized_at === state2.cachedM0MaterializedAt && row.cached_m0_session_facts_version === state2.cachedM0SessionFactsVersion && (row.cached_m0_upgrade_state ?? null) === (state2.cachedM0UpgradeState ?? null) && (row.cached_m0_system_hash ?? "") === (state2.cachedM0SystemHash ?? "") && piModelRefToCanonical(row.cached_m0_model_key ?? "") === piModelRefToCanonical(state2.cachedM0ModelKey ?? "") && (row.cached_m0_project_identity ?? null) === (state2.cachedM0ProjectIdentity ?? null);
38106
38565
  }
38107
38566
  function applyCachedRowToState(state2, row) {
38108
38567
  const markers = markersFromCachedRow(row);
@@ -42326,6 +42785,25 @@ function lkgContentDigestFromFields(fields) {
42326
42785
  }
42327
42786
  return hash2.digest("base64url");
42328
42787
  }
42788
+ function incrementalLkgContentDigests(entries, prior) {
42789
+ const aligned = prior !== undefined && prior.ids.length === prior.signatures.length && prior.signatures.length === prior.digests.length;
42790
+ let reusedPrefix = 0;
42791
+ if (aligned && prior) {
42792
+ while (reusedPrefix < entries.length && reusedPrefix < prior.ids.length && entries[reusedPrefix]?.id === prior.ids[reusedPrefix] && entries[reusedPrefix]?.signature === prior.signatures[reusedPrefix]) {
42793
+ reusedPrefix += 1;
42794
+ }
42795
+ }
42796
+ const digests = [];
42797
+ if (aligned && prior) {
42798
+ for (let index = 0;index < reusedPrefix; index += 1) {
42799
+ digests.push(prior.digests[index]);
42800
+ }
42801
+ }
42802
+ for (let index = reusedPrefix;index < entries.length; index += 1) {
42803
+ digests.push(lkgContentDigestFromFields(entries[index]?.fields ?? []));
42804
+ }
42805
+ return { digests, reusedPrefix };
42806
+ }
42329
42807
  function lkgContentDigest(message) {
42330
42808
  const fields = lkgContentFields(message);
42331
42809
  return fields ? lkgContentDigestFromFields(fields) : null;
@@ -42335,7 +42813,7 @@ function touch(sessionId, entry) {
42335
42813
  slots.set(sessionId, entry);
42336
42814
  }
42337
42815
  function captureSlot(sessionId, slot) {
42338
- if (slot.inputContentDigests.length !== slot.inputIdSeq.length || slot.inputContentDigests.some((digest) => digest.length === 0)) {
42816
+ if (slot.inputContentDigests.length !== slot.inputIdSeq.length || slot.inputContentDigests.some((digest) => digest.length === 0) || slot.inputContentSignatures !== undefined && (slot.inputContentSignatures.length !== slot.inputIdSeq.length || slot.inputContentSignatures.some((signature) => signature.length === 0))) {
42339
42817
  return false;
42340
42818
  }
42341
42819
  const bytes = slotBytes(slot);
@@ -42368,7 +42846,8 @@ function captureSlot(sessionId, slot) {
42368
42846
  slot: {
42369
42847
  ...slot,
42370
42848
  inputIdSeq: [...slot.inputIdSeq],
42371
- inputContentDigests: [...slot.inputContentDigests]
42849
+ inputContentDigests: [...slot.inputContentDigests],
42850
+ inputContentSignatures: slot.inputContentSignatures ? [...slot.inputContentSignatures] : undefined
42372
42851
  },
42373
42852
  bytes
42374
42853
  };
@@ -42384,7 +42863,8 @@ function getSlot(sessionId) {
42384
42863
  return {
42385
42864
  ...entry.slot,
42386
42865
  inputIdSeq: [...entry.slot.inputIdSeq],
42387
- inputContentDigests: [...entry.slot.inputContentDigests]
42866
+ inputContentDigests: [...entry.slot.inputContentDigests],
42867
+ inputContentSignatures: entry.slot.inputContentSignatures ? [...entry.slot.inputContentSignatures] : undefined
42388
42868
  };
42389
42869
  }
42390
42870
  function dropSlot(sessionId, _reason) {
@@ -42654,4 +43134,4 @@ async function runUpgradeMemoryMigration(ctx, sessionId, migrationDirectory) {
42654
43134
  }
42655
43135
  }
42656
43136
 
42657
- export { withContentLanguageDirective, buildPrimaryLanguageDirective, cortexKitUserConfigBasePath, cortexKitProjectConfigBasePath, resolveLegacyConfigSources, resolveLegacyConfigSourcesForHarness, migrateMagicContextConfigLocations, exports_external, DEFAULT_PROTECTED_TAGS, parseCron, nextOccurrence, nextDueAtMs, promptSurfaceConfigIdentity, resolvePromptSurface, resolveModelConfigOrDefault, DEFAULT_EXECUTE_THRESHOLD_PERCENTAGE, DEFAULT_HISTORIAN_TIMEOUT_MS, DEFAULT_LOCAL_EMBEDDING_MODEL, MagicContextConfigSchema, getOpenCodeDbPath, removeMcOwnedCompactionMarkers, isFailClosedBlockingError, shouldBypassFailClosedBlock, resolveAgentNameFromMessages, createFailClosedController, recordHookInitFailure, clearHookInitFailure, getLastHookInitFailure, ProjectIdentityError, resolveProjectIdentityStrict, takeDubiousOwnershipProjectIdentityWarning, resolveProjectIdentity, resolveProjectIdentityForSession, normalizeStoredProjectPath, storedPathBelongsToIdentity, recordSessionProjectIdentity, beginBootQuietPeriod, bootQuietRemainingMs, scheduleAfterBootQuiet, rpcPortDir, rpcPortFilePath, isPidAlive, parseRpcPortFile, registerModuleNoteEvaluationBridge, getModuleNoteEvaluationBridge, getContextStoreUuid, ensureContextStoreUuid, getAuthorityManagedMarker, reconcileAuthorityProject, checksumAuthoritySeedRows, prepareAuthority, drainAuthority, getMirrorCursor, applyMirroredNoteCompileFields, applyMirrorPage, pullMemoryMirrorOnce, V2_MEMORY_CATEGORIES, CATEGORY_PRIORITY, resolveWorkspaceShareCategories, resolveWorkspaceIdentitySet, expandWorkspaceIdentitySetWithAliases, resolveStoredPathWorkspaceIdentity, storedPathBelongsToWorkspace, sourceNameForMemory, computeWorkspaceEpochFingerprint, recordToolDefinition, getMeasuredToolDefinitionTokens, getSchemaFenceRejection, getMigrationOnOpenRefusal, LATEST_SUPPORTED_VERSION, getDatabasePath, getPersistedSchemaVersion, setSqlitePragmaConfig, runSqliteOptimize, openDatabase, openDatabaseAsync, isDatabasePersisted, getDatabasePersistenceError, COMPARTMENT_LEASE_RENEWAL_MS, acquireCompartmentLease, renewCompartmentLease, releaseCompartmentLease, getCompartments, getLastCompartmentEndMessage, getLastCompartmentEndMessageId, clearRecompStaging, recordEmbeddingMeasurement, getMaxM0MutationId, queueMemoryMutation, getMemoryMutationsForRenderByProjects, getMaxMemoryMutationIdForProjects, MAX_EXECUTE_THRESHOLD, escalationBands, isEmergencyRecoveryArmed, isProviderOverflowReconfirmed, getEmergencyRecoveryArmedAt, loadPersistedUsage, loadProtectedTailMeta, resetProtectedTailNoEligibleHead, getWrapupInProgressState, acquireWrapupInProgress, updateWrapupInProgress, releaseWrapupInProgress, resolveCompactionModeRecord, getCompactionModeRecord, setCompactionModeRecord, getPersistedReasoningWatermark, setPersistedReasoningWatermark, clearPersistedReasoningWatermark, getEmergencyInputSample, setEmergencyDropSample, clearEmergencyDropSample, getLastNudgeUndropped, setLastNudgeUndropped, getLastNudgeLevel, setLastNudgeLevel, resetLastNudgeCycle, resetLastNudgeCycleIfTailShrank, getChannel2NudgeState, getChannel2NudgeClaim, setChannel2NudgeState, casChannel2NudgeState, claimChannel2NudgeState, casChannel2NudgeClaim, getPersistedNoteNudge, getNoteNudgeAnchors, getAutoSearchHintDecisions, appendAutoSearchHintDecision, pruneNoteNudgeAnchors, pruneAutoSearchHintDecisions, removeNoteNudgeAnchorByMessageId, removeAutoSearchHintDecisionByMessageId, getPersistedTodoPermissionDenied, setPersistedTodoPermissionDenied, getPersistedTodoSyntheticAnchor, setPersistedTodoSyntheticAnchor, clearPersistedTodoSyntheticAnchor, setNoteLastReadAt, getHistorianFailureState, clearHistorianFailureState, getOverflowState, recordOverflowDetected, recordDetectedContextLimit, clearEmergencyRecovery, clearDetectedContextLimit, getPersistedCompactionMarkerState, setPersistedCompactionMarkerState, getStrippedPlaceholderIds, applyStrippedPlaceholderDelta, removeStrippedPlaceholderId, getStaleReduceStrippedIds, addStaleReduceStrippedIds, getProcessedImageStrippedIds, addProcessedImageStrippedIds, getPendingCompactionMarkerState, clearPendingCompactionMarkerStateIf, peekDeferredExecutePending, setDeferredExecutePendingIfAbsent, clearDeferredExecutePendingIfMatches, getSessionsWithPendingMarker, setSessionWorkMetrics, getNotes, addNote, getSessionNotes, getPendingSmartNotes, getReadySmartNotes, updateNote, dismissNote, markNoteReady, markNoteChecked, queuePendingOp, getPendingOps, clearPendingOps, removePendingOp, PRIMER_CANDIDATE_TTL_MS, PRIMER_CANDIDATE_MAX_AGE_MS, primerOccurrenceKey, primerOccurrenceUtcDay, updatePrimerCandidateEmbedding, getPrimerCandidatesByIds, getPrimerCandidatesForPromotion, countPrimerCandidatesForProject, getActivePrimers, createPrimer, updatePrimerSupport, updatePrimerAnswer, GLOBAL_USER_PROFILE_PROJECT_PATH, getProjectState, bumpProjectMemoryEpoch, bumpProjectUserProfileVersion, saveSourceContent, replaceSourceContent, getSourceContents, getActiveTagTokenAggregate, AGE_RECLAIM_MIN_TOKENS, getOldestActiveUnprotectedToolTags, getActiveToolTagsForAgeReclaim, getTriggerTagTokenUpperBound, getActiveTagTokenTotalsByMessage, tagTokenCountIsNull, backfillTagTokenCounts, insertTag, updateTagStatus, updateTagDropMode, updateCavemanDepth, updateTagMessageId, deleteTagsByMessageId, getMaxTagNumberBySession, getTagNumberByMessageId, deriveTagLoadFloor, getTagsBySession, getActiveTagsBySession, getDroppedTagsBySession, getTagsByNumbers, getMaxDroppedTagNumber, getToolTagNumberByOwner, getNullOwnerToolTag, adoptNullOwnerToolTag, getCandidateToolOwners, pickNearestPriorOwner, createChildSessionWithFence, detectOverflow, promptSyncWithValidatedOutputRetry, normalizeSDKResponse, promptSurfaceHashMaterial, createPromptSurfaceRuntime, createPromptSurfaceGuidanceEpochCache, extractLatestAssistantText, hasLengthCappedOutput, setKeepSubagents, shouldKeepSubagents, recordChildInvocation, COMPARTMENT_AGENT_SYSTEM_PROMPT, HISTORIAN_EDITOR_SYSTEM_PROMPT, COMPARTMENT_STRUCTURAL_SYSTEM_PROMPT, Priority, AdmissionClass, StaleRouteHandleError, SocketClosedError, SocketTimeoutError, SubcClient, isConsumerReconnectTransient, getCompartmentEvents, loadCompartmentChunkEmbeddingsForSearch, cosineSimilarity, SYNAPSE_DEFAULT_MODEL, SynapseEmbeddingProvider, computeNormalizedHash, saveCommitEmbedding, loadProjectCommitEmbeddings, loadUnembeddedCommits, countEmbeddedCommits, upsertCommits, getLatestIndexedCommitTimeMs, enforceProjectCap, GIT_SWEEP_LEASE_RENEWAL_MS, acquireGitSweepLease, renewGitSweepLease, markGitSweepSuccessAndRelease, parkGitSweepNonIndexable, releaseGitSweepLease, saveEmbeddingIfHashMatches, getProjectEmbeddings, peekProjectEmbeddings, invalidateProject, invalidateMemory, markProjectLoadUntrusted, contentSha256, sweepStaleEmbeddingIdentitiesForProject, registerProjectEmbedding, registerProjectShadowEmbedding, getShadowEmbeddingMeasurementCohort, getPrimaryEmbeddingMeasurementCohort, embedShadowTextForProject, enqueueShadowEmbeddingItems, registerProjectInObservationMode, getProjectEmbeddingSnapshot, embedTextForProject, embedBatchForProject, embedItemsForProject, embedUnembeddedMemoriesForProject, drainCommitBacklogForProject, embedSessionCompartmentChunks, getEmbeddingCoverageStatus, isEmbeddingEnabled, embedText, ensureMemoryEmbeddings, computeCueContentHash, hasMuralCueColumns, getMuralCueState, memoryNeedsCue, setMuralCue, recordMuralCueRejection, hasMemoryShareableColumn, hasMemoryClassifiedAtColumn, getUnclassifiedMemoryIds, ModuleMemoryAuthorityError, insertMemory, insertMemoryIdempotent, getMemoryByHash, getMemoriesByProject, buildWorkspaceMemorySqlFilter, getMemoriesByProjects, getMaxMemoryIdForProjects, readNewMemoriesForM1Union, getMemoryById, getMemoriesByIds, updateMemorySeenCount, updateMemoryRetrievalCount, setMemoryClassification, supersededMemory, mergeMemoryStats, archiveMemory, getMemoryCountsByStatus, sanitizeFtsQuery, searchMemoriesFTS, searchMemoriesFTSUnion, recordMemoryMapping, recordMemoryVerifications, getUnmappedMemoryIds, clearMemoryVerifications, getMemoryVerifications, resolveGitTopLevel, readGitHead, readGitChangedFilesSince, readGitFileChangeTimesSince, verificationFileExists, normalizeVerificationFiles, USER_MEMORY_CANDIDATE_TTL_MS, insertUserMemoryCandidates, getUserMemoryCandidates, deleteUserMemoryCandidates, pruneExpiredUserMemoryCandidates, insertUserMemory, getActiveUserMemories, updateUserMemoryContent, dismissUserMemory, MARKER_SUMMARY_TEXT, applyDeferredCompactionMarker, removeCompactionMarkerForSession, checkCompactionMarkerConsistency, getMural, BoundedSessionMap, extractM0Block, formatDate, injectTemporalMarkers, clearInjectionCache, getVisibleMemoryIds, prepareCompartmentInjection, renderCompartmentInjection, mustMaterialize, trimMemoriesToBudgetV2, renderMemoryBlockV2, injectM0M1, onNoteTrigger, peekNoteNudgeText, markNoteNudgeDelivered, clearNoteNudgeTriggerAndCooldown, resetNoteNudgeCooldownOnly, clearNoteNudgeTriggerOnly, RECOVERY_NO_HEAD_LIMIT, resolveOpenCodeProtectedTailBoundary, resolveWrapupProtectedTailBoundary, getRawHistoryEligibility, hasRunnableCompartmentWindow, recordHighPressureNoEligibleHead, runCompartmentAgent, snapRangeToCompartments, LKG_SNAPSHOT_ARRAY, LKG_SNAPSHOT_OBJECT, LKG_SNAPSHOT_KEY, LKG_SNAPSHOT_STRING, LKG_SNAPSHOT_NUMBER, LKG_SNAPSHOT_BOOLEAN, LKG_SNAPSHOT_NULL, LKG_SNAPSHOT_UNDEFINED, lkgContentDigestFromFields, lkgContentDigest, captureSlot, getSlot, dropSlot, noteEntry, getActiveCompartmentRun, markActiveCompartmentRunPublished, registerActiveCompartmentRun, startCompartmentAgent, isRecompFailure, isRecompSkip, isRecompComplete, extractRecompReason, contextualizeUpgradeReason, setRecompStarting, setRecompNote, setRecompTerminal, runManagedRecomp, runManagedUpgrade };
43137
+ export { withContentLanguageDirective, buildPrimaryLanguageDirective, cortexKitUserConfigBasePath, cortexKitProjectConfigBasePath, resolveLegacyConfigSources, resolveLegacyConfigSourcesForHarness, migrateMagicContextConfigLocations, exports_external, DEFAULT_PROTECTED_TAGS, parseCron, nextOccurrence, nextDueAtMs, promptSurfaceConfigIdentity, resolvePromptSurface, resolveModelConfigOrDefault, DEFAULT_EXECUTE_THRESHOLD_PERCENTAGE, DEFAULT_HISTORIAN_TIMEOUT_MS, DEFAULT_LOCAL_EMBEDDING_MODEL, MagicContextConfigSchema, getOpenCodeDbPath, removeMcOwnedCompactionMarkers, isFailClosedBlockingError, shouldBypassFailClosedBlock, resolveAgentNameFromMessages, createFailClosedController, recordHookInitFailure, clearHookInitFailure, getLastHookInitFailure, ProjectIdentityError, resolveProjectIdentityStrict, takeDubiousOwnershipProjectIdentityWarning, resolveProjectIdentity, resolveProjectIdentityForSession, normalizeStoredProjectPath, storedPathBelongsToIdentity, isLinkedGitWorktree, recordSessionProjectIdentity, beginBootQuietPeriod, bootQuietRemainingMs, scheduleAfterBootQuiet, rpcPortDir, rpcPortFilePath, isPidAlive, parseRpcPortFile, registerModuleNoteEvaluationBridge, getModuleNoteEvaluationBridge, getContextStoreUuid, ensureContextStoreUuid, getAuthorityManagedMarker, reconcileAuthorityProject, checksumAuthoritySeedRows, prepareAuthority, drainAuthority, getMirrorCursor, applyMirroredNoteCompileFields, applyMirrorPage, pullMemoryMirrorOnce, V2_MEMORY_CATEGORIES, CATEGORY_PRIORITY, resolveWorkspaceShareCategories, resolveWorkspaceIdentitySet, expandWorkspaceIdentitySetWithAliases, resolveStoredPathWorkspaceIdentity, storedPathBelongsToWorkspace, sourceNameForMemory, computeWorkspaceEpochFingerprint, recordToolDefinition, getMeasuredToolDefinitionTokens, getSchemaFenceRejection, getMigrationOnOpenRefusal, LATEST_SUPPORTED_VERSION, getDatabasePath, getPersistedSchemaVersion, setSqlitePragmaConfig, runSqliteOptimize, openDatabase, openDatabaseAsync, isDatabasePersisted, getDatabasePersistenceError, COMPARTMENT_LEASE_RENEWAL_MS, acquireCompartmentLease, renewCompartmentLease, releaseCompartmentLease, getCompartments, getLastCompartmentEndMessage, getLastCompartmentEndMessageId, clearRecompStaging, recordEmbeddingMeasurement, getMaxM0MutationId, queueMemoryMutation, getMemoryMutationsForRenderByProjects, getMaxMemoryMutationIdForProjects, MAX_EXECUTE_THRESHOLD, escalationBands, isEmergencyRecoveryArmed, isProviderOverflowReconfirmed, getEmergencyRecoveryArmedAt, loadPersistedUsage, loadProtectedTailMeta, resetProtectedTailNoEligibleHead, getWrapupInProgressState, acquireWrapupInProgress, updateWrapupInProgress, releaseWrapupInProgress, resolveCompactionModeRecord, getCompactionModeRecord, setCompactionModeRecord, getPersistedReasoningWatermark, setPersistedReasoningWatermark, clearPersistedReasoningWatermark, getEmergencyInputSample, setEmergencyDropSample, clearEmergencyDropSample, getLastNudgeUndropped, setLastNudgeUndropped, getLastNudgeLevel, setLastNudgeLevel, resetLastNudgeCycle, resetLastNudgeCycleIfTailShrank, getChannel2NudgeState, getChannel2NudgeClaim, setChannel2NudgeState, casChannel2NudgeState, claimChannel2NudgeState, casChannel2NudgeClaim, getPersistedNoteNudge, getNoteNudgeAnchors, getAutoSearchHintDecisions, appendAutoSearchHintDecision, pruneNoteNudgeAnchors, pruneAutoSearchHintDecisions, removeNoteNudgeAnchorByMessageId, removeAutoSearchHintDecisionByMessageId, getPersistedTodoPermissionDenied, setPersistedTodoPermissionDenied, getPersistedTodoSyntheticAnchor, setPersistedTodoSyntheticAnchor, clearPersistedTodoSyntheticAnchor, setNoteLastReadAt, getHistorianFailureState, clearHistorianFailureState, getOverflowState, recordOverflowDetected, recordDetectedContextLimit, clearEmergencyRecovery, clearDetectedContextLimit, getPersistedCompactionMarkerState, setPersistedCompactionMarkerState, getStrippedPlaceholderIds, applyStrippedPlaceholderDelta, removeStrippedPlaceholderId, getMergedReasoningStrippedIds, addMergedReasoningStrippedIds, getTrailingBlankDecisions, addTrailingBlankDecisions, getStaleReduceStrippedIds, addStaleReduceStrippedIds, getProcessedImageStrippedIds, addProcessedImageStrippedIds, getPendingCompactionMarkerState, clearPendingCompactionMarkerStateIf, peekDeferredExecutePending, setDeferredExecutePendingIfAbsent, clearDeferredExecutePendingIfMatches, getSessionsWithPendingMarker, setSessionWorkMetrics, getNotes, addNote, getSessionNotes, getPendingSmartNotes, getReadySmartNotes, updateNote, dismissNote, markNoteReady, markNoteChecked, queuePendingOp, getPendingOps, clearPendingOps, removePendingOp, PRIMER_CANDIDATE_TTL_MS, PRIMER_CANDIDATE_MAX_AGE_MS, primerOccurrenceKey, primerOccurrenceUtcDay, updatePrimerCandidateEmbedding, getPrimerCandidatesByIds, getPrimerCandidatesForPromotion, countPrimerCandidatesForProject, getActivePrimers, createPrimer, updatePrimerSupport, updatePrimerAnswer, GLOBAL_USER_PROFILE_PROJECT_PATH, getProjectState, bumpProjectMemoryEpoch, bumpProjectUserProfileVersion, saveSourceContent, replaceSourceContent, getSourceContents, getActiveTagTokenAggregate, AGE_RECLAIM_MIN_TOKENS, getOldestActiveUnprotectedToolTags, getActiveToolTagsForAgeReclaim, getTriggerTagTokenUpperBound, getActiveTagTokenTotalsByMessage, tagTokenCountIsNull, backfillTagTokenCounts, insertTag, updateTagStatus, updateTagDropMode, updateCavemanDepth, updateTagMessageId, deleteTagsByMessageId, getMaxTagNumberBySession, getTagNumberByMessageId, deriveTagLoadFloor, getTagsBySession, getActiveTagsBySession, getDroppedTagsBySession, getTagsByNumbers, getMaxDroppedTagNumber, getToolTagNumberByOwner, getNullOwnerToolTag, adoptNullOwnerToolTag, getCandidateToolOwners, pickNearestPriorOwner, createChildSessionWithFence, detectOverflow, promptSyncWithValidatedOutputRetry, normalizeSDKResponse, promptSurfaceHashMaterial, createPromptSurfaceRuntime, createPromptSurfaceGuidanceEpochCache, extractLatestAssistantText, hasLengthCappedOutput, setKeepSubagents, shouldKeepSubagents, recordChildInvocation, COMPARTMENT_AGENT_SYSTEM_PROMPT, HISTORIAN_EDITOR_SYSTEM_PROMPT, COMPARTMENT_STRUCTURAL_SYSTEM_PROMPT, Priority, AdmissionClass, StaleRouteHandleError, SocketClosedError, SocketTimeoutError, SubcClient, isConsumerReconnectTransient, connectionFileExists, getCompartmentEvents, loadCompartmentChunkEmbeddingsForSearch, cosineSimilarity, SYNAPSE_DEFAULT_MODEL, SynapseEmbeddingProvider, computeNormalizedHash, saveCommitEmbedding, loadProjectCommitEmbeddings, loadUnembeddedCommits, countEmbeddedCommits, upsertCommits, getLatestIndexedCommitTimeMs, enforceProjectCap, GIT_SWEEP_LEASE_RENEWAL_MS, acquireGitSweepLease, renewGitSweepLease, markGitSweepSuccessAndRelease, parkGitSweepNonIndexable, releaseGitSweepLease, saveEmbeddingIfHashMatches, getProjectEmbeddings, peekProjectEmbeddings, invalidateProject, invalidateMemory, markProjectLoadUntrusted, contentSha256, sweepStaleEmbeddingIdentitiesForProject, registerProjectEmbedding, registerProjectShadowEmbedding, getShadowEmbeddingMeasurementCohort, getPrimaryEmbeddingMeasurementCohort, embedShadowTextForProject, enqueueShadowEmbeddingItems, registerProjectInObservationMode, getProjectEmbeddingSnapshot, embedTextForProject, embedBatchForProject, embedItemsForProject, embedUnembeddedMemoriesForProject, drainCommitBacklogForProject, embedSessionCompartmentChunks, getEmbeddingCoverageStatus, isEmbeddingEnabled, embedText, ensureMemoryEmbeddings, computeCueContentHash, hasMuralCueColumns, getMuralCueState, memoryNeedsCue, setMuralCue, recordMuralCueRejection, hasMemoryShareableColumn, hasMemoryClassifiedAtColumn, getUnclassifiedMemoryIds, ModuleMemoryAuthorityError, insertMemory, insertMemoryIdempotent, getMemoryByHash, getMemoriesByProject, buildWorkspaceMemorySqlFilter, getMemoriesByProjects, getMaxMemoryIdForProjects, readNewMemoriesForM1Union, getMemoryById, getMemoriesByIds, updateMemorySeenCount, updateMemoryRetrievalCount, setMemoryClassification, supersededMemory, mergeMemoryStats, archiveMemory, getMemoryCountsByStatus, sanitizeFtsQuery, searchMemoriesFTS, searchMemoriesFTSUnion, recordMemoryMapping, recordMemoryVerifications, getUnmappedMemoryIds, clearMemoryVerifications, getMemoryVerifications, resolveGitTopLevel, readGitHead, readGitChangedFilesSince, readGitFileChangeTimesSince, verificationFileExists, normalizeVerificationFiles, USER_MEMORY_CANDIDATE_TTL_MS, insertUserMemoryCandidates, getUserMemoryCandidates, deleteUserMemoryCandidates, pruneExpiredUserMemoryCandidates, insertUserMemory, getActiveUserMemories, updateUserMemoryContent, dismissUserMemory, MARKER_SUMMARY_TEXT, applyDeferredCompactionMarker, removeCompactionMarkerForSession, checkCompactionMarkerConsistency, getMural, resolveMuralWire, BoundedSessionMap, extractM0Block, formatDate, injectTemporalMarkers, clearInjectionCache, getVisibleMemoryIds, prepareCompartmentInjection, renderCompartmentInjection, mustMaterialize, trimMemoriesToBudgetV2, renderMemoryBlockV2, injectM0M1, onNoteTrigger, peekNoteNudgeText, markNoteNudgeDelivered, clearNoteNudgeTriggerAndCooldown, resetNoteNudgeCooldownOnly, clearNoteNudgeTriggerOnly, RECOVERY_NO_HEAD_LIMIT, resolveOpenCodeProtectedTailBoundary, resolveWrapupProtectedTailBoundary, getRawHistoryEligibility, hasRunnableCompartmentWindow, recordHighPressureNoEligibleHead, runCompartmentAgent, snapRangeToCompartments, LKG_SNAPSHOT_ARRAY, LKG_SNAPSHOT_OBJECT, LKG_SNAPSHOT_KEY, LKG_SNAPSHOT_STRING, LKG_SNAPSHOT_NUMBER, LKG_SNAPSHOT_BOOLEAN, LKG_SNAPSHOT_NULL, LKG_SNAPSHOT_UNDEFINED, incrementalLkgContentDigests, lkgContentDigest, captureSlot, getSlot, dropSlot, noteEntry, getActiveCompartmentRun, markActiveCompartmentRunPublished, registerActiveCompartmentRun, startCompartmentAgent, isRecompFailure, isRecompSkip, isRecompComplete, extractRecompReason, contextualizeUpgradeReason, setRecompStarting, setRecompNote, setRecompTerminal, runManagedRecomp, runManagedUpgrade };