@cortexkit/opencode-magic-context 0.42.5 → 0.42.6

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 (128) hide show
  1. package/README.md +2 -2
  2. package/dist/config/index.d.ts +9 -0
  3. package/dist/config/index.d.ts.map +1 -1
  4. package/dist/config/schema/magic-context.d.ts +1 -0
  5. package/dist/config/schema/magic-context.d.ts.map +1 -1
  6. package/dist/{conflict-warning-hook-jyj54gbe.js → conflict-warning-hook-aktepwpz.js} +3 -3
  7. package/dist/features/magic-context/compaction-marker.d.ts.map +1 -1
  8. package/dist/features/magic-context/context-authority.d.ts +28 -1
  9. package/dist/features/magic-context/context-authority.d.ts.map +1 -1
  10. package/dist/features/magic-context/dreamer/open-opencode-db.d.ts.map +1 -1
  11. package/dist/features/magic-context/dreamer/task-scheduler.d.ts.map +1 -1
  12. package/dist/features/magic-context/memory/embedding-local.d.ts +1 -0
  13. package/dist/features/magic-context/memory/embedding-local.d.ts.map +1 -1
  14. package/dist/features/magic-context/memory/embedding.d.ts +1 -1
  15. package/dist/features/magic-context/memory/embedding.d.ts.map +1 -1
  16. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  17. package/dist/features/magic-context/migrations.d.ts +12 -0
  18. package/dist/features/magic-context/migrations.d.ts.map +1 -1
  19. package/dist/features/magic-context/project-embedding-registry.d.ts +1 -0
  20. package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
  21. package/dist/features/magic-context/session-project-backfill.d.ts.map +1 -1
  22. package/dist/features/magic-context/storage-db.d.ts +1 -1
  23. package/dist/features/magic-context/tool-owner-backfill.d.ts.map +1 -1
  24. package/dist/hooks/auto-update-checker/index.d.ts.map +1 -1
  25. package/dist/hooks/magic-context/cache-busting-signals.d.ts +0 -1
  26. package/dist/hooks/magic-context/cache-busting-signals.d.ts.map +1 -1
  27. package/dist/hooks/magic-context/channel2-delivery.d.ts +8 -0
  28. package/dist/hooks/magic-context/channel2-delivery.d.ts.map +1 -1
  29. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts +12 -0
  30. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
  31. package/dist/hooks/magic-context/hook.d.ts +4 -4
  32. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  33. package/dist/hooks/magic-context/module-state-sync.d.ts +3 -0
  34. package/dist/hooks/magic-context/module-state-sync.d.ts.map +1 -1
  35. package/dist/hooks/magic-context/module-transport.d.ts +24 -2
  36. package/dist/hooks/magic-context/module-transport.d.ts.map +1 -1
  37. package/dist/hooks/magic-context/module-wire.d.ts +1 -1
  38. package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
  39. package/dist/hooks/magic-context/producer-window-guard.d.ts +31 -1
  40. package/dist/hooks/magic-context/producer-window-guard.d.ts.map +1 -1
  41. package/dist/hooks/magic-context/read-session-chunk.d.ts +6 -0
  42. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  43. package/dist/hooks/magic-context/read-session-db.d.ts +8 -0
  44. package/dist/hooks/magic-context/read-session-db.d.ts.map +1 -1
  45. package/dist/hooks/magic-context/read-session-formatting.d.ts +6 -0
  46. package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -1
  47. package/dist/hooks/magic-context/rust-mode-transform.d.ts +30 -0
  48. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  49. package/dist/hooks/magic-context/rust-refusal-recovery.d.ts +28 -0
  50. package/dist/hooks/magic-context/rust-refusal-recovery.d.ts.map +1 -0
  51. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  52. package/dist/hooks/magic-context/transform.d.ts +7 -0
  53. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  54. package/dist/{index-jkrqhc7y.js → index-a9ssj59b.js} +94 -15
  55. package/dist/{index-3wbd8sdq.js → index-djp6rwz6.js} +455 -46
  56. package/dist/{index-p474rw9p.js → index-ngjmj6xx.js} +1 -1
  57. package/dist/{index-d8mgqezq.js → index-s61hh7gv.js} +50 -17
  58. package/dist/{index-1ar7b3e9.js → index-znraa0kv.js} +1 -1
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +1485 -360
  61. package/dist/plugin/embedding-bootstrap.d.ts.map +1 -1
  62. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  63. package/dist/plugin/memory-id-translation.d.ts +23 -0
  64. package/dist/plugin/memory-id-translation.d.ts.map +1 -0
  65. package/dist/plugin/rust-tool-backends.d.ts +1 -1
  66. package/dist/plugin/rust-tool-backends.d.ts.map +1 -1
  67. package/dist/{recomp-orchestrator-k20sfpm2.js → recomp-orchestrator-0xx1364v.js} +4 -4
  68. package/dist/{send-session-notification-xnypkxpx.js → send-session-notification-jbxknvar.js} +2 -2
  69. package/dist/shared/auto-update-provenance.d.ts +9 -0
  70. package/dist/shared/auto-update-provenance.d.ts.map +1 -0
  71. package/dist/shared/conflict-detector.d.ts +5 -1
  72. package/dist/shared/conflict-detector.d.ts.map +1 -1
  73. package/dist/shared/opencode-db-path.d.ts +31 -2
  74. package/dist/shared/opencode-db-path.d.ts.map +1 -1
  75. package/dist/shared/prompt-surface-runtime.d.ts +3 -3
  76. package/dist/shared/prompt-surface-runtime.d.ts.map +1 -1
  77. package/dist/{storage-meta-session-x3j0q9qy.js → storage-meta-session-z818pn1e.js} +2 -2
  78. package/dist/tools/ctx-expand/mode.d.ts +31 -0
  79. package/dist/tools/ctx-expand/mode.d.ts.map +1 -0
  80. package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
  81. package/dist/tools/ctx-memory/tools.d.ts.map +1 -1
  82. package/dist/tools/ctx-note/constants.d.ts +1 -1
  83. package/dist/tools/ctx-note/constants.d.ts.map +1 -1
  84. package/dist/tools/ctx-note/tools.d.ts.map +1 -1
  85. package/dist/tools/ctx-note/types.d.ts +1 -1
  86. package/dist/tools/ctx-note/types.d.ts.map +1 -1
  87. package/dist/tools/ctx-reduce/constants.d.ts +1 -1
  88. package/dist/tools/ctx-reduce/constants.d.ts.map +1 -1
  89. package/dist/tools/ctx-search/types.d.ts +1 -1
  90. package/dist/tools/ctx-search/types.d.ts.map +1 -1
  91. package/dist/tools/light-descriptions.d.ts +2 -2
  92. package/dist/tools/light-descriptions.d.ts.map +1 -1
  93. package/dist/v2/hidden-completion.d.ts +69 -13
  94. package/dist/v2/hidden-completion.d.ts.map +1 -1
  95. package/dist/v2/hooks/context.d.ts +13 -1
  96. package/dist/v2/hooks/context.d.ts.map +1 -1
  97. package/dist/v2/hooks/hidden-child.d.ts +31 -0
  98. package/dist/v2/hooks/hidden-child.d.ts.map +1 -0
  99. package/dist/v2/hooks/store.d.ts.map +1 -1
  100. package/dist/v2/hooks/types.d.ts +99 -19
  101. package/dist/v2/hooks/types.d.ts.map +1 -1
  102. package/dist/v2/server.d.ts +19 -0
  103. package/dist/v2/server.d.ts.map +1 -1
  104. package/dist/v2/server.js +1781 -253
  105. package/dist/v2/store-reader.d.ts +11 -5
  106. package/dist/v2/store-reader.d.ts.map +1 -1
  107. package/dist/v2/tui/index.d.ts +10 -0
  108. package/dist/v2/tui/index.d.ts.map +1 -0
  109. package/dist/v2/tui/types.d.ts +80 -0
  110. package/dist/v2/tui/types.d.ts.map +1 -0
  111. package/package.json +5 -4
  112. package/src/agents/magic-context-prompt.ts +1 -1
  113. package/src/config/index.ts +31 -1
  114. package/src/config/protected-tokens.test.ts +40 -0
  115. package/src/config/schema/magic-context.ts +8 -3
  116. package/src/shared/auto-update-provenance.ts +42 -0
  117. package/src/shared/conflict-detector.test.ts +53 -0
  118. package/src/shared/conflict-detector.ts +88 -19
  119. package/src/shared/models-dev-cache.test.ts +25 -0
  120. package/src/shared/opencode-db-path.test.ts +96 -0
  121. package/src/shared/opencode-db-path.ts +146 -15
  122. package/src/shared/prompt-surface-a1-golden.md +12 -16
  123. package/src/shared/prompt-surface-runtime.test.ts +20 -0
  124. package/src/shared/prompt-surface-runtime.ts +7 -5
  125. package/src/tui/entry.mjs +11 -1
  126. package/src/v2/tui/host-contract.test.ts +202 -0
  127. package/src/v2/tui/index.ts +270 -0
  128. package/src/v2/tui/types.ts +67 -0
@@ -11,9 +11,10 @@ import {
11
11
  SESSION_SCOPED_TABLES,
12
12
  deleteSessionScopedRows,
13
13
  updateSessionMeta2
14
- } from "./index-1ar7b3e9.js";
14
+ } from "./index-znraa0kv.js";
15
15
  import {
16
16
  resolveOpenCodeDbPath,
17
+ assertOpenCodeStoreGeneration,
17
18
  openCodeDbPathExists,
18
19
  claimOpenCodeDbDiagnosticOnce,
19
20
  registerSlowWriteReporter,
@@ -25,7 +26,7 @@ import {
25
26
  withReadOnlySessionDb,
26
27
  getRawSessionMessageCountFromDb,
27
28
  getMessageTimesFromOpenCodeDb
28
- } from "./index-jkrqhc7y.js";
29
+ } from "./index-a9ssj59b.js";
29
30
  import {
30
31
  pushNotification2
31
32
  } from "./index-jdxxq8cz.js";
@@ -47,7 +48,7 @@ import {
47
48
  getErrorMessage,
48
49
  describeError,
49
50
  sendStatusNotification2
50
- } from "./index-p474rw9p.js";
51
+ } from "./index-ngjmj6xx.js";
51
52
  import {
52
53
  piModelRefToCanonical,
53
54
  modelRefLookupOrder
@@ -2168,6 +2169,20 @@ function prepareMirrorPageStatements(db) {
2168
2169
  function mirrorIdentity(db, domain, moduleProject, moduleRowId, statements) {
2169
2170
  return (statements?.identityByModule ?? db.prepare("SELECT context_row_id FROM mirror_identity WHERE domain = ? AND module_project = ? AND module_row_id = ?")).get(domain, moduleProject, moduleRowId) ?? null;
2170
2171
  }
2172
+ function moduleMemoryIdentityForHostId(db, contextRowId) {
2173
+ const row = db.prepare(`SELECT module_project, module_row_id, context_row_id
2174
+ FROM mirror_identity
2175
+ WHERE domain = 'memories' AND context_row_id = ?`).get(contextRowId);
2176
+ return row ? {
2177
+ moduleProject: row.module_project,
2178
+ moduleRowId: row.module_row_id,
2179
+ contextRowId: row.context_row_id
2180
+ } : null;
2181
+ }
2182
+ function hostMemoryIdentityForModuleId(db, moduleProject, moduleRowId) {
2183
+ const row = mirrorIdentity(db, "memories", moduleProject, moduleRowId);
2184
+ return row ? { moduleProject, moduleRowId, contextRowId: row.context_row_id } : null;
2185
+ }
2171
2186
  function applyMirroredNoteCompileFields(args) {
2172
2187
  return withPrivilegedWriter(args.db, () => {
2173
2188
  const result = args.db.prepare(`UPDATE notes
@@ -2395,6 +2410,26 @@ function applyNoteRow(db, feed, statements) {
2395
2410
  statements.updateNote.run(rowString(effectiveRow, "type", "smart"), contextStatus, moduleProject, rowNullableString(effectiveRow, "session_id"), rowString(effectiveRow, "content"), rowNullableString(effectiveRow, "surface_condition"), rowNullableString(effectiveRow, "compiled_provider"), rowNullableString(effectiveRow, "compiled_config"), typeof effectiveRow.compiled_at === "number" ? effectiveRow.compiled_at : null, rowNullableString(effectiveRow, "compile_status"), typeof effectiveRow.ready_at === "number" ? effectiveRow.ready_at : null, rowNullableString(effectiveRow, "ready_reason"), rowNullableString(effectiveRow, "manifest_json"), rowNullableString(effectiveRow, "compiled_check"), rowNullableString(effectiveRow, "check_hash"), rowNullableString(effectiveRow, "check_cron"), rowNumber(effectiveRow, "check_failure_count"), rowNumber(effectiveRow, "check_network_failure_count"), typeof effectiveRow.check_quarantined_until === "number" ? effectiveRow.check_quarantined_until : null, typeof effectiveRow.check_next_due_at === "number" ? effectiveRow.check_next_due_at : null, typeof effectiveRow.check_compiled_at === "number" ? effectiveRow.check_compiled_at : null, typeof effectiveRow.check_false_since_at === "number" ? effectiveRow.check_false_since_at : null, typeof effectiveRow.check_last_liveness_at === "number" ? effectiveRow.check_last_liveness_at : null, typeof effectiveRow.last_checked_at === "number" ? effectiveRow.last_checked_at : null, rowString(effectiveRow, "check_status", "uncompiled"), rowNumber(effectiveRow, "check_version"), rowNumber(effectiveRow, "policy_version", 1), rowNullableString(effectiveRow, "anchor_block_id"), typeof effectiveRow.anchor_ordinal === "number" ? effectiveRow.anchor_ordinal : null, rowNumber(effectiveRow, "created_at_ms"), rowNumber(effectiveRow, "updated_at_ms"), contextId);
2396
2411
  statements.upsertNoteRevision.run(moduleProject, feed.module_row_id, contextId, rowNumber(effectiveRow, "status_version"));
2397
2412
  }
2413
+ function applyTargetedMemoryMirrorRow(args) {
2414
+ const { db, row } = args;
2415
+ if (row.domain !== "memories" || row.op === "tombstone") {
2416
+ throw new Error("targeted memory mirror requires a live memory row");
2417
+ }
2418
+ const project = rowString(row.full_row_snapshot, "project_path");
2419
+ if (!project)
2420
+ throw new Error("memory feed snapshot has no project_path");
2421
+ withPrivilegedWriter(db, () => {
2422
+ db.transaction(() => {
2423
+ ensureMemoryRepairState(db);
2424
+ const statements = prepareMirrorPageStatements(db);
2425
+ applyMemoryRow(db, row, statements);
2426
+ translateMemoryReferences(statements);
2427
+ repairNullClobberedMemoryRows(statements);
2428
+ bumpDomainMutationEpoch(db, project, "memories");
2429
+ }).immediate();
2430
+ });
2431
+ return hostMemoryIdentityForModuleId(db, project, row.module_row_id);
2432
+ }
2398
2433
  function applyMirrorPage(args) {
2399
2434
  const { db, page } = args;
2400
2435
  if (!AUTHORITY_DOMAINS.includes(page.domain))
@@ -2578,6 +2613,28 @@ async function pullAndApplyMirrorPageWithStatus(args) {
2578
2613
  limit
2579
2614
  });
2580
2615
  const nextCursor = applyMirrorPage({ db: args.db, page: response.page });
2616
+ if (args.domain === "memories" && args.module.memoryIdentityAck) {
2617
+ const rowsByProject = new Map;
2618
+ for (const feed of response.page.rows) {
2619
+ if (feed.domain !== "memories" || feed.op === "tombstone")
2620
+ continue;
2621
+ const project = rowString(feed.full_row_snapshot, "project_path");
2622
+ if (!project)
2623
+ continue;
2624
+ const identity = mirrorIdentity(args.db, "memories", project, feed.module_row_id);
2625
+ if (!identity)
2626
+ continue;
2627
+ const rows = rowsByProject.get(project) ?? [];
2628
+ rows.push({
2629
+ module_row_id: feed.module_row_id,
2630
+ context_row_id: identity.context_row_id
2631
+ });
2632
+ rowsByProject.set(project, rows);
2633
+ }
2634
+ for (const [project, rows] of rowsByProject) {
2635
+ await args.module.memoryIdentityAck({ project, rows });
2636
+ }
2637
+ }
2581
2638
  return {
2582
2639
  cursor: nextCursor,
2583
2640
  hasMore: response.page.has_more,
@@ -3768,6 +3825,114 @@ function isSqliteLockError(error) {
3768
3825
  function tableExists2(db, name) {
3769
3826
  return Boolean(db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name = ?").get(name));
3770
3827
  }
3828
+ function tableHasHarnessColumn(db, name) {
3829
+ if (!tableExists2(db, name))
3830
+ return false;
3831
+ return db.prepare(`PRAGMA table_info(${name})`).all().some((column) => column.name === "harness");
3832
+ }
3833
+ var V85_OPENCODE2_RELABEL_TABLES = [
3834
+ "tags",
3835
+ "pending_ops",
3836
+ "source_contents",
3837
+ "compartments",
3838
+ "compartment_chunk_embeddings",
3839
+ "session_projects",
3840
+ "compartment_events",
3841
+ "compression_depth",
3842
+ "session_facts",
3843
+ "primer_candidates",
3844
+ "notes",
3845
+ "message_history_index",
3846
+ "message_history_source",
3847
+ "pending_session_cleanup",
3848
+ "message_history_orphan_sweep",
3849
+ "session_meta",
3850
+ "subagent_invocations",
3851
+ "historian_runs",
3852
+ "transform_decisions",
3853
+ "recomp_compartments",
3854
+ "recomp_facts"
3855
+ ];
3856
+ var V85_OPTIONAL_OPENCODE2_RELABEL_TABLES = ["session_project_backfill_state"];
3857
+ function deleteLosingOpenCode2Twin(db, table, joinColumns, newerPredicate) {
3858
+ if (!tableHasHarnessColumn(db, table))
3859
+ return;
3860
+ const naturalJoin = joinColumns.map((column) => `oc.${column} = o2.${column}`).join(" AND ");
3861
+ const o2On = naturalJoin ? `${naturalJoin} AND oc.harness = 'opencode'` : `oc.harness = 'opencode'`;
3862
+ const ocOn = naturalJoin ? `${naturalJoin} AND o2.harness = 'opencode2'` : `o2.harness = 'opencode2'`;
3863
+ db.exec(`
3864
+ DELETE FROM ${table}
3865
+ WHERE rowid IN (
3866
+ SELECT o2.rowid
3867
+ FROM ${table} AS o2
3868
+ JOIN ${table} AS oc
3869
+ ON ${o2On}
3870
+ WHERE o2.harness = 'opencode2'
3871
+ AND NOT (${newerPredicate})
3872
+ );
3873
+ DELETE FROM ${table}
3874
+ WHERE rowid IN (
3875
+ SELECT oc.rowid
3876
+ FROM ${table} AS oc
3877
+ JOIN ${table} AS o2
3878
+ ON ${ocOn}
3879
+ WHERE oc.harness = 'opencode'
3880
+ AND (${newerPredicate})
3881
+ );
3882
+ `);
3883
+ }
3884
+ function relabelOpenCode2HarnessRows(db) {
3885
+ deleteLosingOpenCode2Twin(db, "session_projects", ["session_id"], "o2.updated_at > oc.updated_at");
3886
+ deleteLosingOpenCode2Twin(db, "primer_candidates", ["project_path", "session_id", "source_start_message_id", "source_end_message_id"], "o2.created_at > oc.created_at");
3887
+ deleteLosingOpenCode2Twin(db, "transform_decisions", ["session_id", "message_id"], "o2.ts_ms > oc.ts_ms");
3888
+ deleteLosingOpenCode2Twin(db, "message_history_orphan_sweep", [], "COALESCE(o2.last_swept_at, -1) > COALESCE(oc.last_swept_at, -1)");
3889
+ if (tableHasHarnessColumn(db, "session_project_backfill_state")) {
3890
+ db.exec(`
3891
+ DELETE FROM session_project_backfill_state
3892
+ WHERE harness = 'opencode2'
3893
+ AND EXISTS (
3894
+ SELECT 1 FROM session_project_backfill_state WHERE harness = 'opencode'
3895
+ )
3896
+ AND NOT (
3897
+ (status = 'completed'
3898
+ AND (SELECT status FROM session_project_backfill_state WHERE harness = 'opencode')
3899
+ != 'completed')
3900
+ OR (
3901
+ status = (SELECT status FROM session_project_backfill_state WHERE harness = 'opencode')
3902
+ AND COALESCE(started_at, -1) > COALESCE(
3903
+ (SELECT started_at FROM session_project_backfill_state WHERE harness = 'opencode'),
3904
+ -1
3905
+ )
3906
+ )
3907
+ );
3908
+ DELETE FROM session_project_backfill_state
3909
+ WHERE harness = 'opencode'
3910
+ AND EXISTS (
3911
+ SELECT 1 FROM session_project_backfill_state WHERE harness = 'opencode2'
3912
+ )
3913
+ AND (
3914
+ ((SELECT status FROM session_project_backfill_state WHERE harness = 'opencode2') = 'completed'
3915
+ AND status != 'completed')
3916
+ OR (
3917
+ status = (SELECT status FROM session_project_backfill_state WHERE harness = 'opencode2')
3918
+ AND COALESCE(
3919
+ (SELECT started_at FROM session_project_backfill_state WHERE harness = 'opencode2'),
3920
+ -1
3921
+ ) > COALESCE(started_at, -1)
3922
+ )
3923
+ );
3924
+ `);
3925
+ }
3926
+ const tables = new Set([
3927
+ ...V85_OPENCODE2_RELABEL_TABLES,
3928
+ ...V85_OPTIONAL_OPENCODE2_RELABEL_TABLES
3929
+ ]);
3930
+ for (const table of tables) {
3931
+ if (!tableHasHarnessColumn(db, table))
3932
+ continue;
3933
+ db.exec(`UPDATE ${table} SET harness = 'opencode' WHERE harness = 'opencode2'`);
3934
+ }
3935
+ }
3771
3936
  function healMismatchedTierClose(db, table, hasLegacy) {
3772
3937
  if (!tableExists2(db, table))
3773
3938
  return;
@@ -5930,6 +6095,13 @@ var MIGRATIONS = [
5930
6095
  ensureColumn(db, "session_meta", "protected_tokens_effective", "INTEGER");
5931
6096
  ensureColumn(db, "session_meta", "protected_tokens_pre_snapshot", "TEXT");
5932
6097
  }
6098
+ },
6099
+ {
6100
+ version: 85,
6101
+ description: "relabel OpenCode 1.x mis-tagged opencode2 session rows",
6102
+ up(db) {
6103
+ relabelOpenCode2HarnessRows(db);
6104
+ }
5933
6105
  }
5934
6106
  ];
5935
6107
  var LATEST_MIGRATION_VERSION = MIGRATIONS.reduce((max, m) => Math.max(max, m.version), 0);
@@ -6120,6 +6292,25 @@ function extractTexts(parts) {
6120
6292
  }
6121
6293
  return texts;
6122
6294
  }
6295
+ function extractToolResultBodyTokens(parts) {
6296
+ let tokens = 0;
6297
+ for (const part of parts) {
6298
+ if (part === null || typeof part !== "object")
6299
+ continue;
6300
+ const p = part;
6301
+ if (p.type !== "tool")
6302
+ continue;
6303
+ const state = p.state;
6304
+ if (!state || typeof state !== "object")
6305
+ continue;
6306
+ const body = state.output ?? state.error;
6307
+ if (body === undefined)
6308
+ continue;
6309
+ const text = typeof body === "string" ? body : JSON.stringify(body);
6310
+ tokens += Math.ceil(text.length / 4);
6311
+ }
6312
+ return tokens;
6313
+ }
6123
6314
  function extractToolCallSummaries(parts) {
6124
6315
  const summaries = [];
6125
6316
  for (const part of parts) {
@@ -6577,6 +6768,7 @@ function runToolOwnerBackfill(db) {
6577
6768
  const escapedDbPath = opencodeDbPath.replaceAll("'", "''");
6578
6769
  db.exec(`ATTACH '${escapedDbPath}' AS oc_backfill`);
6579
6770
  try {
6771
+ assertOpenCodeStoreGeneration(db, "v1", opencodeDbPath, "oc_backfill");
6580
6772
  backfillToolOwnersInChunks(db, result);
6581
6773
  } finally {
6582
6774
  try {
@@ -6795,7 +6987,7 @@ function getSchemaFenceRejection() {
6795
6987
  function getMigrationOnOpenRefusal() {
6796
6988
  return lastMigrationOnOpenRefusal;
6797
6989
  }
6798
- var LATEST_SUPPORTED_VERSION = 84;
6990
+ var LATEST_SUPPORTED_VERSION = 85;
6799
6991
  var BOOT_SQLITE_BUSY_TIMEOUT_MS = 5000;
6800
6992
  var PERMISSIONS_ENFORCEABLE = process.platform !== "win32";
6801
6993
  var defaultStoragePermissionFs = { chmodSync, mkdirSync };
@@ -7261,7 +7453,7 @@ function initializeDatabase(db, busyTimeoutMs = BOOT_SQLITE_BUSY_TIMEOUT_MS) {
7261
7453
  tag_id INTEGER,
7262
7454
  session_id TEXT,
7263
7455
  content TEXT,
7264
- created_at INTEGER,
7456
+ created_at INTEGER, -- epoch ms; Date.now() on source writes, preserved on session clones
7265
7457
  harness TEXT NOT NULL DEFAULT 'opencode',
7266
7458
  PRIMARY KEY(session_id, tag_id)
7267
7459
  );
@@ -7285,7 +7477,7 @@ function initializeDatabase(db, busyTimeoutMs = BOOT_SQLITE_BUSY_TIMEOUT_MS) {
7285
7477
  p1_embedding BLOB,
7286
7478
  p1_embedding_model_id TEXT,
7287
7479
  legacy INTEGER NOT NULL DEFAULT 0,
7288
- created_at INTEGER NOT NULL,
7480
+ created_at INTEGER NOT NULL, -- epoch ms (Date.now())
7289
7481
  harness TEXT NOT NULL DEFAULT 'opencode',
7290
7482
  UNIQUE(session_id, sequence)
7291
7483
  );
@@ -7304,7 +7496,7 @@ function initializeDatabase(db, busyTimeoutMs = BOOT_SQLITE_BUSY_TIMEOUT_MS) {
7304
7496
  model_id TEXT NOT NULL,
7305
7497
  dims INTEGER NOT NULL,
7306
7498
  vector BLOB NOT NULL,
7307
- created_at INTEGER NOT NULL,
7499
+ created_at INTEGER NOT NULL, -- epoch ms (Date.now())
7308
7500
  UNIQUE(compartment_id, model_id, window_index)
7309
7501
  );
7310
7502
  CREATE INDEX IF NOT EXISTS idx_cce_session ON compartment_chunk_embeddings(session_id);
@@ -7327,7 +7519,7 @@ function initializeDatabase(db, busyTimeoutMs = BOOT_SQLITE_BUSY_TIMEOUT_MS) {
7327
7519
  kind TEXT NOT NULL,
7328
7520
  at_compartment INTEGER,
7329
7521
  fields_json TEXT NOT NULL DEFAULT '{}',
7330
- created_at INTEGER NOT NULL,
7522
+ created_at INTEGER NOT NULL, -- epoch ms (Date.now())
7331
7523
  harness TEXT NOT NULL DEFAULT 'opencode'
7332
7524
  );
7333
7525
  CREATE INDEX IF NOT EXISTS idx_compartment_events_session
@@ -7356,7 +7548,7 @@ function initializeDatabase(db, busyTimeoutMs = BOOT_SQLITE_BUSY_TIMEOUT_MS) {
7356
7548
  session_id TEXT NOT NULL,
7357
7549
  category TEXT NOT NULL,
7358
7550
  content TEXT NOT NULL,
7359
- created_at INTEGER NOT NULL,
7551
+ created_at INTEGER NOT NULL, -- epoch ms (Date.now())
7360
7552
  updated_at INTEGER NOT NULL,
7361
7553
  harness TEXT NOT NULL DEFAULT 'opencode'
7362
7554
  );
@@ -7375,7 +7567,7 @@ function initializeDatabase(db, busyTimeoutMs = BOOT_SQLITE_BUSY_TIMEOUT_MS) {
7375
7567
  source_message_time INTEGER NOT NULL,
7376
7568
  question_embedding BLOB,
7377
7569
  question_embedding_model_id TEXT,
7378
- created_at INTEGER NOT NULL,
7570
+ created_at INTEGER NOT NULL, -- epoch ms (Date.now())
7379
7571
  UNIQUE(project_path, harness, session_id, source_start_message_id, source_end_message_id)
7380
7572
  );
7381
7573
  CREATE INDEX IF NOT EXISTS idx_primer_candidates_project_time
@@ -7398,7 +7590,7 @@ function initializeDatabase(db, busyTimeoutMs = BOOT_SQLITE_BUSY_TIMEOUT_MS) {
7398
7590
  answer_refreshed_at INTEGER,
7399
7591
  source_candidate_ids TEXT NOT NULL DEFAULT '[]',
7400
7592
  source_candidate_provenance TEXT,
7401
- created_at INTEGER NOT NULL,
7593
+ created_at INTEGER NOT NULL, -- epoch ms (Date.now())
7402
7594
  updated_at INTEGER NOT NULL
7403
7595
  );
7404
7596
  CREATE INDEX IF NOT EXISTS idx_primers_project_status_observed
@@ -7511,7 +7703,7 @@ function initializeDatabase(db, busyTimeoutMs = BOOT_SQLITE_BUSY_TIMEOUT_MS) {
7511
7703
  job_id TEXT,
7512
7704
  cursor TEXT,
7513
7705
  status TEXT NOT NULL DEFAULT 'pending',
7514
- created_at INTEGER NOT NULL DEFAULT 0,
7706
+ created_at INTEGER NOT NULL DEFAULT 0, -- epoch ms (Date.now())
7515
7707
  updated_at INTEGER NOT NULL DEFAULT 0,
7516
7708
  UNIQUE(session_id, request_key)
7517
7709
  );
@@ -7552,7 +7744,7 @@ function initializeDatabase(db, busyTimeoutMs = BOOT_SQLITE_BUSY_TIMEOUT_MS) {
7552
7744
  shadow_epoch INTEGER NOT NULL DEFAULT 0,
7553
7745
  corpus_hash TEXT NOT NULL DEFAULT '',
7554
7746
  coverage_json TEXT NOT NULL DEFAULT '{}',
7555
- created_at INTEGER NOT NULL DEFAULT 0,
7747
+ created_at INTEGER NOT NULL DEFAULT 0, -- epoch ms (Date.now())
7556
7748
  UNIQUE(dedup_key, cohort_key)
7557
7749
  );
7558
7750
  CREATE INDEX IF NOT EXISTS idx_embedding_measurement_session
@@ -7975,7 +8167,7 @@ CREATE INDEX IF NOT EXISTS idx_dream_queue_pending ON dream_queue(started_at, en
7975
8167
  importance_avg REAL,
7976
8168
  discarded_last INTEGER NOT NULL DEFAULT 0,
7977
8169
  legacy INTEGER NOT NULL DEFAULT 0,
7978
- created_at INTEGER NOT NULL
8170
+ created_at INTEGER NOT NULL -- epoch ms (Date.now())
7979
8171
  );
7980
8172
  CREATE INDEX IF NOT EXISTS idx_historian_runs_session
7981
8173
  ON historian_runs(session_id, created_at DESC);
@@ -8028,7 +8220,7 @@ CREATE INDEX IF NOT EXISTS idx_dream_queue_pending ON dream_queue(started_at, en
8028
8220
  importance INTEGER NOT NULL DEFAULT 50,
8029
8221
  episode_type TEXT,
8030
8222
  pass_number INTEGER NOT NULL,
8031
- created_at INTEGER NOT NULL,
8223
+ created_at INTEGER NOT NULL, -- epoch ms (Date.now())
8032
8224
  harness TEXT NOT NULL DEFAULT 'opencode',
8033
8225
  UNIQUE(session_id, sequence)
8034
8226
  );
@@ -8039,7 +8231,7 @@ CREATE INDEX IF NOT EXISTS idx_dream_queue_pending ON dream_queue(started_at, en
8039
8231
  category TEXT NOT NULL,
8040
8232
  content TEXT NOT NULL,
8041
8233
  pass_number INTEGER NOT NULL,
8042
- created_at INTEGER NOT NULL,
8234
+ created_at INTEGER NOT NULL, -- epoch ms (Date.now())
8043
8235
  harness TEXT NOT NULL DEFAULT 'opencode'
8044
8236
  );
8045
8237
 
@@ -9520,7 +9712,7 @@ function refreshTailHygieneBaseline(input) {
9520
9712
  for (let index = input.previous.baselineParts.length;index < measured.parts.length; index += 1) {
9521
9713
  const part = measured.parts[index];
9522
9714
  turnDeltaT += part.tokens;
9523
- if (part.kind !== "toolOutput")
9715
+ if (part.kind !== "toolOutput" || !part.protected)
9524
9716
  turnDeltaU += part.uTokens;
9525
9717
  }
9526
9718
  return {
@@ -10788,6 +10980,20 @@ function countRawSessionMessageOrdinalsFromDb(db, sessionId) {
10788
10980
  )`).get(sessionId);
10789
10981
  return typeof row?.count === "number" ? row.count : 0;
10790
10982
  }
10983
+ function readRawSessionMessageIdOrdinalsFromDb(db, sessionId) {
10984
+ const messageRows = db.prepare("SELECT id, data FROM message WHERE session_id = ? ORDER BY time_created ASC, id ASC").all(sessionId).filter(isRawMessageRow);
10985
+ const ordinalById = new Map;
10986
+ let ordinal = 0;
10987
+ for (const row of messageRows) {
10988
+ const info = parseJsonRecord(row.data);
10989
+ if (isRawCompactionSummaryInfo(info))
10990
+ continue;
10991
+ ordinal += 1;
10992
+ if (info)
10993
+ ordinalById.set(row.id, ordinal);
10994
+ }
10995
+ return ordinalById;
10996
+ }
10791
10997
  function readRawSessionMessageOrdinalPageFromDb(db, sessionId, after, limit) {
10792
10998
  const pageSize = Math.max(1, Math.floor(limit));
10793
10999
  const rows = (after ? db.prepare(`SELECT id, data, time_created
@@ -12094,6 +12300,17 @@ function getRawSessionStoredMessageCount(sessionId) {
12094
12300
  return 0;
12095
12301
  return withReadOnlySessionDb((db) => countStoredRawSessionMessagesFromDb(db, sessionId));
12096
12302
  }
12303
+ function readRawSessionMessageIdOrdinals(sessionId) {
12304
+ const provider = sessionProviders.get(sessionId);
12305
+ if (provider?.readMessageIdOrdinals)
12306
+ return provider.readMessageIdOrdinals();
12307
+ if (provider) {
12308
+ return new Map(provider.readMessages().map((message) => [message.id, message.ordinal]));
12309
+ }
12310
+ if (!openCodeDbExists())
12311
+ return new Map;
12312
+ return withReadOnlySessionDb((db) => readRawSessionMessageIdOrdinalsFromDb(db, sessionId));
12313
+ }
12097
12314
  function readRawSessionMessagePartsById(sessionId, messageId, onQuery) {
12098
12315
  const provider = sessionProviders.get(sessionId);
12099
12316
  if (provider?.readMessagePartsById)
@@ -12284,6 +12501,14 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12284
12501
  const totalMessageCount = getCachedAbsoluteMessageCount(sessionId) ?? messages.length;
12285
12502
  const startOrdinal = Math.max(1, offset);
12286
12503
  const completedToolArcs = buildToolArcs(messages).flatMap((arc) => arc.resOrdinal === null ? [] : [{ start: arc.invOrdinal, end: arc.resOrdinal }]);
12504
+ const completedToolComponents = [];
12505
+ for (const arc of completedToolArcs) {
12506
+ const component = completedToolComponents[completedToolComponents.length - 1];
12507
+ if (component && arc.start <= component.end)
12508
+ component.end = Math.max(component.end, arc.end);
12509
+ else
12510
+ completedToolComponents.push({ ...arc });
12511
+ }
12287
12512
  const lines = [];
12288
12513
  const lineMeta = [];
12289
12514
  const flushedToolOnlyBlocks = [];
@@ -12297,6 +12522,25 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12297
12522
  let pendingNoiseMeta = [];
12298
12523
  let commitClusters = 0;
12299
12524
  let lastFlushedRole = "";
12525
+ let admittedOversizeComponentEnd = null;
12526
+ let currentBlockApproxTokens = 0;
12527
+ let formattedBudgetCrossed = false;
12528
+ let sourceCharacters = 0;
12529
+ const toolResultBoundaries = [];
12530
+ function pinComponentWhenFormattedBudgetCrosses(ordinal, appendedText) {
12531
+ if (admittedOversizeComponentEnd !== null || formattedBudgetCrossed || !currentBlock)
12532
+ return;
12533
+ currentBlockApproxTokens += estimateTokens(appendedText) + (currentBlock.parts.length > 1 ? 1 : 0);
12534
+ if (totalTokens + currentBlockApproxTokens + 64 <= tokenBudget)
12535
+ return;
12536
+ const previewTokens = totalTokens + estimateTokens(formatBlock(currentBlock));
12537
+ if (previewTokens <= tokenBudget)
12538
+ return;
12539
+ formattedBudgetCrossed = true;
12540
+ const component = completedToolComponents.find((candidate) => candidate.start <= ordinal && candidate.end >= ordinal);
12541
+ if (component)
12542
+ admittedOversizeComponentEnd = component.end;
12543
+ }
12300
12544
  function recordFilteredNoise(meta) {
12301
12545
  pendingNoiseMeta.push(meta);
12302
12546
  if (!currentBlock) {
@@ -12323,7 +12567,23 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12323
12567
  highestScannedOrdinal = Math.max(highestScannedOrdinal, lastOrdinal);
12324
12568
  lastMessageId = currentBlock.meta[currentBlock.meta.length - 1]?.messageId ?? "";
12325
12569
  messagesProcessed += currentBlock.meta.length;
12570
+ const lineStart = sourceCharacters + (lines.length > 0 ? 1 : 0);
12571
+ const renderedParts = currentBlock.parts.join(" / ");
12572
+ let partOffset = lineStart + (blockText.length - renderedParts.length);
12573
+ for (let index = 0;index < currentBlock.parts.length; index++) {
12574
+ const part = currentBlock.parts[index] ?? "";
12575
+ const partMeta = currentBlock.partMeta[index];
12576
+ if (partMeta && partMeta.toolResultBodyTokens > 0) {
12577
+ toolResultBoundaries.push({
12578
+ ordinal: partMeta.ordinal,
12579
+ sourceOffset: partOffset,
12580
+ bodyTokens: partMeta.toolResultBodyTokens
12581
+ });
12582
+ }
12583
+ partOffset += part.length + (index + 1 < currentBlock.parts.length ? 3 : 0);
12584
+ }
12326
12585
  lines.push(blockText);
12586
+ sourceCharacters = lineStart + blockText.length;
12327
12587
  lineMeta.push(...currentBlock.meta);
12328
12588
  totalTokens += blockTokens;
12329
12589
  if (currentBlock.isToolOnly) {
@@ -12333,11 +12593,15 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12333
12593
  });
12334
12594
  }
12335
12595
  currentBlock = null;
12596
+ currentBlockApproxTokens = 0;
12336
12597
  return true;
12337
12598
  }
12338
12599
  for (const msg of messages) {
12339
12600
  if (eligibleEndOrdinal !== undefined && msg.ordinal >= eligibleEndOrdinal)
12340
12601
  break;
12602
+ if (admittedOversizeComponentEnd !== null && msg.ordinal > admittedOversizeComponentEnd) {
12603
+ break;
12604
+ }
12341
12605
  if (msg.ordinal < startOrdinal)
12342
12606
  continue;
12343
12607
  const meta = { ordinal: msg.ordinal, messageId: msg.id };
@@ -12351,6 +12615,10 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12351
12615
  if (currentBlock && currentBlock.role === "A") {
12352
12616
  currentBlock.endOrdinal = msg.ordinal;
12353
12617
  currentBlock.parts.push(tcText);
12618
+ currentBlock.partMeta.push({
12619
+ ordinal: msg.ordinal,
12620
+ toolResultBodyTokens: extractToolResultBodyTokens(msg.parts)
12621
+ });
12354
12622
  currentBlock.meta.push(...pendingNoiseMeta, meta);
12355
12623
  pendingNoiseMeta = [];
12356
12624
  } else {
@@ -12361,12 +12629,19 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12361
12629
  startOrdinal: pendingNoiseMeta[0]?.ordinal ?? msg.ordinal,
12362
12630
  endOrdinal: msg.ordinal,
12363
12631
  parts: [tcText],
12632
+ partMeta: [
12633
+ {
12634
+ ordinal: msg.ordinal,
12635
+ toolResultBodyTokens: extractToolResultBodyTokens(msg.parts)
12636
+ }
12637
+ ],
12364
12638
  meta: [...pendingNoiseMeta, meta],
12365
12639
  commitHashes: [],
12366
12640
  isToolOnly: true
12367
12641
  };
12368
12642
  pendingNoiseMeta = [];
12369
12643
  }
12644
+ pinComponentWhenFormattedBudgetCrosses(msg.ordinal, tcText);
12370
12645
  continue;
12371
12646
  }
12372
12647
  const role = compactRole(msg.role);
@@ -12383,11 +12658,16 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12383
12658
  if (currentBlock && currentBlock.role === role) {
12384
12659
  currentBlock.endOrdinal = msg.ordinal;
12385
12660
  currentBlock.parts.push(text);
12661
+ currentBlock.partMeta.push({
12662
+ ordinal: msg.ordinal,
12663
+ toolResultBodyTokens: extractToolResultBodyTokens(msg.parts)
12664
+ });
12386
12665
  currentBlock.meta.push(...pendingNoiseMeta, meta);
12387
12666
  currentBlock.commitHashes = mergeCommitHashes(currentBlock.commitHashes, compacted.commitHashes);
12388
12667
  if (msgHasNarrative)
12389
12668
  currentBlock.isToolOnly = false;
12390
12669
  pendingNoiseMeta = [];
12670
+ pinComponentWhenFormattedBudgetCrosses(msg.ordinal, text);
12391
12671
  continue;
12392
12672
  }
12393
12673
  if (!flushCurrentBlock())
@@ -12397,11 +12677,18 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12397
12677
  startOrdinal: pendingNoiseMeta[0]?.ordinal ?? msg.ordinal,
12398
12678
  endOrdinal: msg.ordinal,
12399
12679
  parts: [text],
12680
+ partMeta: [
12681
+ {
12682
+ ordinal: msg.ordinal,
12683
+ toolResultBodyTokens: extractToolResultBodyTokens(msg.parts)
12684
+ }
12685
+ ],
12400
12686
  meta: [...pendingNoiseMeta, meta],
12401
12687
  commitHashes: [...compacted.commitHashes],
12402
12688
  isToolOnly: !msgHasNarrative
12403
12689
  };
12404
12690
  pendingNoiseMeta = [];
12691
+ pinComponentWhenFormattedBudgetCrosses(msg.ordinal, text);
12405
12692
  }
12406
12693
  if (flushCurrentBlock() && pendingNoiseMeta.length > 0) {
12407
12694
  highestScannedOrdinal = Math.max(highestScannedOrdinal, pendingNoiseMeta[pendingNoiseMeta.length - 1]?.ordinal ?? highestScannedOrdinal);
@@ -12432,7 +12719,8 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12432
12719
  ...messagesProcessed === 0 && text.length === 0 ? { filteredNoiseLines: pendingNoiseMeta } : {},
12433
12720
  commitClusterCount: commitClusters,
12434
12721
  toolOnlyRanges,
12435
- completedToolArcs
12722
+ completedToolArcs,
12723
+ toolResultBoundaries
12436
12724
  };
12437
12725
  }
12438
12726
  function readRawSessionSeedTail(sessionId, boundaryId, onQuery) {
@@ -12853,19 +13141,25 @@ function indexMessagesAfterOrdinal(db, sessionId, messages, _lastIndexedOrdinal,
12853
13141
  }
12854
13142
  return inserted;
12855
13143
  }
12856
- function getMessageHistoryOrphanSweepState(db) {
12857
- return db.prepare("SELECT cursor_session_id, last_swept_at FROM message_history_orphan_sweep WHERE harness = 'opencode'").get() ?? {};
13144
+ function openCodeSweepHarness() {
13145
+ const harness = getHarness();
13146
+ if (harness === "opencode" || harness === "opencode2")
13147
+ return harness;
13148
+ throw new Error(`OpenCode orphan sweep cannot read a ${harness} host store`);
13149
+ }
13150
+ function getMessageHistoryOrphanSweepState(db, harness) {
13151
+ return db.prepare("SELECT cursor_session_id, last_swept_at FROM message_history_orphan_sweep WHERE harness = ?").get(harness) ?? {};
12858
13152
  }
12859
- function persistMessageHistoryOrphanSweepState(db, cursor, lastSweptAt) {
13153
+ function persistMessageHistoryOrphanSweepState(db, cursor, lastSweptAt, harness) {
12860
13154
  db.prepare(`INSERT INTO message_history_orphan_sweep (harness, cursor_session_id, last_swept_at)
12861
- VALUES ('opencode', ?, ?)
13155
+ VALUES (?, ?, ?)
12862
13156
  ON CONFLICT(harness) DO UPDATE SET
12863
13157
  cursor_session_id = excluded.cursor_session_id,
12864
- last_swept_at = excluded.last_swept_at`).run(cursor, lastSweptAt);
13158
+ last_swept_at = excluded.last_swept_at`).run(harness, cursor, lastSweptAt);
12865
13159
  }
12866
- function getOpenCodeSessionScopedCandidateSourceSql() {
13160
+ function getOpenCodeSessionScopedCandidateSourceSql(harness) {
12867
13161
  return SESSION_SCOPED_TABLES.filter((definition) => definition.harnessScoped === true).map((definition) => {
12868
- const predicates = ["session_id IS NOT NULL", "harness = 'opencode'"];
13162
+ const predicates = ["session_id IS NOT NULL", `harness = '${harness}'`];
12869
13163
  if (definition.extraPredicate)
12870
13164
  predicates.push(definition.extraPredicate);
12871
13165
  return `SELECT session_id FROM ${definition.table} WHERE ${predicates.join(" AND ")}`;
@@ -12879,7 +13173,8 @@ function sweepOrphanedOpenCodeMessageIndexes(db, openReadableOpenCodeDb, options
12879
13173
  const safetyAgeMs = Math.max(0, options.safetyAgeMs ?? MESSAGE_HISTORY_ORPHAN_SAFETY_AGE_MS);
12880
13174
  const cooldownMs = Math.max(0, options.cooldownMs ?? MESSAGE_HISTORY_ORPHAN_SWEEP_COOLDOWN_MS);
12881
13175
  const unavailableReprobeMs = Math.max(cooldownMs, options.unavailableReprobeMs ?? MESSAGE_HISTORY_ORPHAN_UNAVAILABLE_REPROBE_MS);
12882
- const state = getMessageHistoryOrphanSweepState(db);
13176
+ const harness = openCodeSweepHarness();
13177
+ const state = getMessageHistoryOrphanSweepState(db, harness);
12883
13178
  const cursor = typeof state.cursor_session_id === "string" ? state.cursor_session_id : "";
12884
13179
  if (typeof state.last_swept_at === "number" && state.last_swept_at + cooldownMs > now) {
12885
13180
  return { status: "cooldown", scanned: 0, deleted: 0, cursor };
@@ -12891,12 +13186,12 @@ function sweepOrphanedOpenCodeMessageIndexes(db, openReadableOpenCodeDb, options
12891
13186
  openCodeDb = null;
12892
13187
  }
12893
13188
  if (!openCodeDb) {
12894
- persistMessageHistoryOrphanSweepState(db, cursor, now + unavailableReprobeMs - cooldownMs);
13189
+ persistMessageHistoryOrphanSweepState(db, cursor, now + unavailableReprobeMs - cooldownMs, harness);
12895
13190
  return { status: "source_unavailable", scanned: 0, deleted: 0, cursor };
12896
13191
  }
12897
13192
  try {
12898
13193
  const cutoff = now - safetyAgeMs;
12899
- const candidateSourceSql = getOpenCodeSessionScopedCandidateSourceSql();
13194
+ const candidateSourceSql = getOpenCodeSessionScopedCandidateSourceSql(harness);
12900
13195
  const candidates = db.prepare(`SELECT session_id
12901
13196
  FROM (${candidateSourceSql}) AS session_candidates
12902
13197
  WHERE session_id > ?
@@ -12904,7 +13199,7 @@ function sweepOrphanedOpenCodeMessageIndexes(db, openReadableOpenCodeDb, options
12904
13199
  SELECT 1
12905
13200
  FROM message_history_index
12906
13201
  WHERE message_history_index.session_id = session_candidates.session_id
12907
- AND message_history_index.harness = 'opencode'
13202
+ AND message_history_index.harness = '${harness}'
12908
13203
  AND message_history_index.updated_at > ?
12909
13204
  )
12910
13205
  ORDER BY session_id ASC
@@ -12925,13 +13220,13 @@ function sweepOrphanedOpenCodeMessageIndexes(db, openReadableOpenCodeDb, options
12925
13220
  SELECT 1
12926
13221
  FROM message_history_index
12927
13222
  WHERE message_history_index.session_id = session_candidates.session_id
12928
- AND message_history_index.harness = 'opencode'
13223
+ AND message_history_index.harness = '${harness}'
12929
13224
  AND message_history_index.updated_at > ?
12930
13225
  )
12931
13226
  LIMIT 1`);
12932
13227
  const eligibleSessionIds = missingSessionIds.filter((sessionId) => stillEligible.get(sessionId, cutoff));
12933
- deleted = deleteSessionScopedRows(db, eligibleSessionIds, "opencode");
12934
- persistMessageHistoryOrphanSweepState(db, nextCursor, completedAt);
13228
+ deleted = deleteSessionScopedRows(db, eligibleSessionIds, harness);
13229
+ persistMessageHistoryOrphanSweepState(db, nextCursor, completedAt, harness);
12935
13230
  db.exec("COMMIT");
12936
13231
  committed = true;
12937
13232
  logSlowWriteTransaction("message_index_orphan_sweep", transactionStartedAt);
@@ -18455,6 +18750,7 @@ var DEFAULT_EXECUTE_THRESHOLD_PERCENTAGE = 65;
18455
18750
  var EXECUTE_THRESHOLD_CAP_MESSAGE = "execute_threshold is capped at 90% for cache safety: output capacity is reserved from the usable context window, and the remaining 10% absorbs mid-turn growth before the absolute 95% emergency wall. Use a value between 20 and 90.";
18456
18751
  var DEFAULT_HISTORIAN_TIMEOUT_MS = 600000;
18457
18752
  var DEFAULT_HISTORY_BUDGET_PERCENTAGE = 0.15;
18753
+ var PROTECTED_TOKENS_MIN = 4000;
18458
18754
  var DEFAULT_LOCAL_EMBEDDING_MODEL = "Xenova/all-MiniLM-L6-v2";
18459
18755
  var PiThinkingLevelSchema = _enum(["off", "minimal", "low", "medium", "high", "xhigh", "max"]).optional();
18460
18756
  var OmpThinkingLevelSchema = _enum(["off", "minimal", "low", "medium", "high", "xhigh", "max", "inherit", "auto"]).optional();
@@ -18824,8 +19120,8 @@ var MagicContextConfigSchema = object({
18824
19120
  smart_notes: object({
18825
19121
  retina_handoff: boolean2().default(false).describe("When true, dreamer skips smart notes whose surface conditions compiled to retina provider configs at authoring time. Default false keeps both paths active until the retina consumer is deployed.")
18826
19122
  }).default({ retina_handoff: false }).describe("Smart-note ownership transition controls."),
18827
- cache_ttl: union([string(), object({ default: string() }).catchall(string())]).default("5m").describe(`How long Magic Context assumes the provider's cached prefix stays valid. This is MC's own deferral gate — it does not change the provider's actual cache lifetime. String (e.g. "5m", "1h", "30s") or per-model object ({ default: "5m", "model-id": "10m" }). Set to "never" to mean MC never assumes expiry (for lanes kept warm externally by a cache-keep tool) — disables the idle-TTL heuristic so MC never initiates a rebuild based on elapsed time. Provider-side extended TTL is a separate request-level concern (cache_control: { ttl } in the request body).`),
18828
- prompt_surface: PromptSurfaceConfigSchema.default({ default: "full" }).describe("Prompt-surface presets: default is full; models use bare model IDs, provider/model, or provider/* routing keys. Guidance and tool-description overrides are user-level only. On OpenCode and Pi, per-model routing applies to the guidance block only: tool descriptions are registered once per process, so they follow the default preset (a v1 plugin-surface limitation; per-model tool descriptions are planned for the OpenCode v2 plugin API once the SDK stabilizes)."),
19123
+ cache_ttl: union([string(), object({ default: string() }).catchall(string())]).default("5m").describe(`How long Magic Context assumes the provider's cached prefix stays valid. This is MC's own deferral gate — it does not change the provider's actual cache lifetime. String (e.g. "5m", "1h", "30s") or per-model object ({ default: "5m", "provider/model": "1h", "provider/*": "never" }); keys resolve most-specific first (exact provider/model, bare model ID, shorter dash-prefixes, then the provider/* wildcard, then default). Set to "never" to mean MC never assumes expiry (for lanes kept warm externally by a cache-keep tool) — disables the idle-TTL heuristic so MC never initiates a rebuild based on elapsed time. Provider-side extended TTL is a separate request-level concern (cache_control: { ttl } in the request body).`),
19124
+ prompt_surface: PromptSurfaceConfigSchema.default({ default: "full" }).describe("Prompt-surface presets: default is full; models use bare model IDs, provider/model, or provider/* routing keys. Guidance and tool-description overrides are user-level only. OpenCode 1.x, Pi, and OMP register tool descriptions once per process (they follow the default preset). OpenCode 2 rewrites the five ctx_* descriptions per request from the draft model."),
18829
19125
  output_reserve: union([
18830
19126
  number2().min(0),
18831
19127
  object({ default: number2().min(0) }).catchall(number2().min(0))
@@ -18841,7 +19137,7 @@ var MagicContextConfigSchema = object({
18841
19137
  execute_threshold_tokens: object({
18842
19138
  default: number2().min(5000).max(2000000).optional()
18843
19139
  }).catchall(number2().min(5000).max(2000000)).optional().describe("Absolute token thresholds per model. When matched, overrides execute_threshold_percentage for that model. Accepts `default` for all models or per-model keys. Values above 90% × context_limit are clamped with a warning log. Min 5_000, max 2_000_000."),
18844
- protected_tokens: number2().int().min(4000).max(1e6).optional().describe("Positive integer token floor to protect from automatic reclaim (min: 4_000, max: 1_000_000). When omitted, the derived default is clamp(round(0.05 × usableSoft), min(16_000, round(0.08 × usableSoft)), 64_000)."),
19140
+ protected_tokens: number2().int().min(PROTECTED_TOKENS_MIN).max(1e6).optional().describe("Positive integer token floor to protect from automatic reclaim (min: 4_000, max: 1_000_000). When omitted, the derived default is clamp(round(0.05 × usableSoft), min(16_000, round(0.08 × usableSoft)), 64_000)."),
18845
19141
  protected_tags: unknown().optional().describe("Deprecated: number of recent tags to protect. Ignored for behaviour; use protected_tokens instead.").meta({ deprecated: true }),
18846
19142
  clear_reasoning_age: number2().min(10).default(50).describe("Clear reasoning/thinking blocks older than N tags (default: 50)"),
18847
19143
  history_budget_percentage: number2().min(0.05).max(0.5).default(DEFAULT_HISTORY_BUDGET_PERCENTAGE).describe("Fraction of usable context (context_limit × execute_threshold) reserved for the session history block (default: 0.15)"),
@@ -22457,9 +22753,9 @@ function migrateMagicContextConfigLocations(directory, logger) {
22457
22753
  }
22458
22754
 
22459
22755
  // src/tools/light-descriptions.ts
22460
- var CTX_REDUCE_LIGHT_DESCRIPTION = `For ctx_reduce users, mark spent §N§ outputs discardable; release is QUEUED, not immediate, so content stays visible until space is needed. Newest tags stay protected until they age out. Released content becomes a placeholder; recover it only by rerunning the source or recovery tool, so mark only genuinely finished material. Mark analyzed, redundant, persisted, or merely confirmatory outputs; keep user messages, unresolved errors, unextracted evidence, and exact wording. NEVER blanket-mark a large range: review every tag first.`;
22756
+ var CTX_REDUCE_LIGHT_DESCRIPTION = `Marking QUEUES content for release. It stays fully visible to you until it is actually released, which may be the next turn or many turns later. Newest tags stay protected until they age out. Release leaves a placeholder; recover only by rerunning the source or recovery tool. Mark only finished material. Mark analyzed, redundant, saved, or confirmatory outputs; keep user messages, unresolved errors, unextracted evidence, and exact wording. NEVER blanket-mark a large range: review every tag first.`;
22461
22757
  var CTX_EXPAND_LIGHT_DESCRIPTION = `For ctx_expand users, recover compacted conversation by passing a session-history heading's inclusive start/end ordinals. Results are raw [N] U:/A: transcript capped near 15K tokens; oversized ranges return the head and a continuation. Use verbose=true to list each message ordinal, part previews, and tool-output sizes; use message=N for one complete stored message and its tool exchanges. NEVER expand ranges after the last compartment because that live tail is already visible.`;
22462
- var CTX_NOTE_LIGHT_DESCRIPTION = `For ctx_note: write saves, read lists, update changes, dismiss retires one note_id or 1–50 note_ids (choose one); surface_condition makes a smart note. Smart-note conditions must be externally verifiable via GitHub, disk, git, or web—not this conversation or future actions.`;
22758
+ var CTX_NOTE_LIGHT_DESCRIPTION = `For ctx_note: write saves, read lists, update changes one note (note_ids=[N]), dismiss retires 1–50 (note_ids); surface_condition makes a smart note. Smart-note conditions must be externally verifiable via GitHub, disk, git, or web—not this conversation or future actions.`;
22463
22759
  var CTX_MEMORY_LIGHT_DESCRIPTION = `For ctx_memory users, write one standalone durable fact with category and content; update one ID, archive one or more IDs, merge two or more IDs, or get one to twenty numeric IDs. get reads memories in every status; list remains dreamer-only, so primary agents must NEVER assume bulk-list access.`;
22464
22760
  var CTX_SEARCH_LIGHT_DESCRIPTION = `For ctx_search users, retrieve only hidden recall: memories not in <project-memory>, compacted messages outside the live tail, commits, and notes; phrase query as a question carrying exact terms. Omit sources for broad search; select memory, message, git_commit, or note, or pass memory IDs directly. Hits expand through ctx_expand.`;
22465
22761
 
@@ -22539,8 +22835,8 @@ function createPromptSurfaceRuntime(options) {
22539
22835
  return content;
22540
22836
  };
22541
22837
  return {
22542
- resolveRegistration(config) {
22543
- const { preset } = resolvePromptSurface(config, undefined);
22838
+ resolveRegistration(config, modelKey) {
22839
+ const { preset } = resolvePromptSurface(config, modelKey);
22544
22840
  const overrides = config?.tool_descriptions ?? {};
22545
22841
  for (const [toolId, description] of Object.entries(overrides)) {
22546
22842
  if (!PROMPT_SURFACE_TOOL_ID_SET.has(toolId)) {
@@ -27995,6 +28291,7 @@ async function injectWasmOrt() {
27995
28291
  try {
27996
28292
  const { module: ortWeb, entryPath } = await importWasmOrtForRuntime();
27997
28293
  if (ortWeb.env?.wasm) {
28294
+ ortWeb.env.wasm.numThreads = 1;
27998
28295
  ortWeb.env.wasm.wasmPaths = `${pathToFileURL2(dirname5(entryPath)).href}/`;
27999
28296
  }
28000
28297
  globalThis[Symbol.for("onnxruntime")] = ortWeb;
@@ -30116,6 +30413,26 @@ function registerProjectInObservationMode(db, projectIdentity, sourceDirectory,
30116
30413
  disposeProvider(prior?.provider ?? null);
30117
30414
  return snapshotFor(registration);
30118
30415
  }
30416
+ function unregisterProjectShadowEmbedding(projectIdentity) {
30417
+ const shadow = shadowRegistrations.get(projectIdentity);
30418
+ shadowRegistrations.delete(projectIdentity);
30419
+ dbForShadowQueue.delete(projectIdentity);
30420
+ pendingShadowBackfills.delete(projectIdentity);
30421
+ for (let index = shadowQueue.length - 1;index >= 0; index -= 1) {
30422
+ if (shadowQueue[index].projectIdentity === projectIdentity)
30423
+ shadowQueue.splice(index, 1);
30424
+ }
30425
+ for (const scope of ["memory", "commit", "chunk"]) {
30426
+ const key = `${projectIdentity}:${scope}`;
30427
+ shadowBackfillLastIds.delete(key);
30428
+ shadowBackfillStopReasons.delete(key);
30429
+ shadowBackfillLastWriteOutcomes.delete(key);
30430
+ }
30431
+ const primaryProvider = projectRegistrations.get(projectIdentity)?.provider ?? null;
30432
+ if (shadow?.provider && shadow.provider !== primaryProvider) {
30433
+ disposeProvider(shadow.provider);
30434
+ }
30435
+ }
30119
30436
  function getProjectEmbeddingSnapshot(projectIdentity) {
30120
30437
  const registration = projectRegistrations.get(projectIdentity);
30121
30438
  return registration ? snapshotFor(registration) : null;
@@ -31369,6 +31686,12 @@ function getWritableOpenCodeDb() {
31369
31686
  throw new Error(`OpenCode database not found at ${dbPath} (source=${resolution.source}; is OpenCode installed?)`);
31370
31687
  }
31371
31688
  const db = new Database(dbPath);
31689
+ try {
31690
+ assertOpenCodeStoreGeneration(db, "v1", dbPath);
31691
+ } catch (error) {
31692
+ closeQuietly(db);
31693
+ throw error;
31694
+ }
31372
31695
  db.exec("PRAGMA busy_timeout=5000");
31373
31696
  db.exec("PRAGMA journal_mode=WAL");
31374
31697
  cachedWriteDb = { path: dbPath, db };
@@ -36962,17 +37285,65 @@ function persistFilteredNoise(db, sessionId, chunk, eligibleEnd) {
36962
37285
  }
36963
37286
 
36964
37287
  // src/hooks/magic-context/producer-window-guard.ts
36965
- var PRODUCER_WINDOW_REFUSAL_MARGIN = 0.15;
37288
+ var PRODUCER_WINDOW_REFUSAL_MARGIN = 0.03;
37289
+ var HISTORIAN_TRUNCATION_MARKER = "[… tokens truncated by Magic Context to fit the historian window …]";
37290
+ function producerInputTokenLimit(contextLimitTokens, maxOutputTokens) {
37291
+ if (typeof contextLimitTokens !== "number" || !Number.isFinite(contextLimitTokens) || contextLimitTokens <= 0 || !Number.isFinite(maxOutputTokens) || maxOutputTokens < 0) {
37292
+ return;
37293
+ }
37294
+ const usableInputTokens = Math.max(0, Math.floor(contextLimitTokens - maxOutputTokens));
37295
+ return Math.max(0, Math.floor(usableInputTokens * (1 - PRODUCER_WINDOW_REFUSAL_MARGIN)));
37296
+ }
36966
37297
  function producerWindowFailureReason(input) {
36967
37298
  const { producerSourceTokens, contextLimitTokens, maxOutputTokens } = input;
36968
- if (typeof contextLimitTokens !== "number" || !Number.isFinite(contextLimitTokens) || contextLimitTokens <= 0 || !Number.isFinite(producerSourceTokens) || producerSourceTokens <= 0 || !Number.isFinite(maxOutputTokens) || maxOutputTokens < 0) {
37299
+ const producerInputLimitTokens = producerInputTokenLimit(contextLimitTokens, maxOutputTokens);
37300
+ if (producerInputLimitTokens === undefined || typeof contextLimitTokens !== "number" || !Number.isFinite(producerSourceTokens) || producerSourceTokens <= 0) {
36969
37301
  return null;
36970
37302
  }
36971
37303
  const usableInputTokens = Math.max(0, Math.floor(contextLimitTokens - maxOutputTokens));
36972
- const refusalThreshold = usableInputTokens * (1 + PRODUCER_WINDOW_REFUSAL_MARGIN);
36973
- if (producerSourceTokens < refusalThreshold)
37304
+ if (producerSourceTokens <= producerInputLimitTokens)
36974
37305
  return null;
36975
- return `producer_source_exceeds_window producer_source_tokens=${Math.round(producerSourceTokens)} usable_input_tokens=${usableInputTokens} context_limit_tokens=${Math.round(contextLimitTokens)} max_output_tokens=${Math.round(maxOutputTokens)} refusal_margin=${PRODUCER_WINDOW_REFUSAL_MARGIN}`;
37306
+ return `producer_source_exceeds_window producer_source_tokens=${Math.round(producerSourceTokens)} usable_input_tokens=${usableInputTokens} producer_input_limit_tokens=${producerInputLimitTokens} context_limit_tokens=${Math.round(contextLimitTokens)} max_output_tokens=${Math.round(maxOutputTokens)} estimator_margin=${PRODUCER_WINDOW_REFUSAL_MARGIN}`;
37307
+ }
37308
+ function splitMarkerPair() {
37309
+ return `
37310
+ ${HISTORIAN_TRUNCATION_MARKER}
37311
+ ${HISTORIAN_TRUNCATION_MARKER}
37312
+ `;
37313
+ }
37314
+ function fitAtomicHistorianSourceToProducerWindow(args) {
37315
+ const producerInputLimitTokens = producerInputTokenLimit(args.contextLimitTokens, args.maxOutputTokens);
37316
+ const originalTokens = estimateTokens(args.text);
37317
+ if (producerInputLimitTokens === undefined || originalTokens < producerInputLimitTokens || producerInputLimitTokens <= 0) {
37318
+ return { text: args.text, producerInputLimitTokens, removedTokens: 0 };
37319
+ }
37320
+ const boundary = [...args.resultBoundaries ?? []].filter((candidate) => Number.isFinite(candidate.sourceOffset) && candidate.sourceOffset > 0 && candidate.sourceOffset < args.text.length).sort((a, b) => b.bodyTokens - a.bodyTokens || a.ordinal - b.ordinal)[0];
37321
+ const splitOffset = boundary?.sourceOffset ?? Math.floor(args.text.length / 2);
37322
+ const left = args.text.slice(0, splitOffset);
37323
+ const right = args.text.slice(splitOffset);
37324
+ const markers = splitMarkerPair();
37325
+ const target = producerInputLimitTokens;
37326
+ let lo = 0;
37327
+ let hi = 1;
37328
+ let best = markers;
37329
+ for (let iteration = 0;iteration < 48; iteration++) {
37330
+ const scale = (lo + hi) / 2;
37331
+ const leftLength = Math.floor(left.length * scale);
37332
+ const rightLength = Math.floor(right.length * scale);
37333
+ const candidate = left.slice(0, leftLength) + markers + right.slice(right.length - rightLength);
37334
+ if (estimateTokens(candidate) <= target) {
37335
+ best = candidate;
37336
+ lo = scale;
37337
+ } else {
37338
+ hi = scale;
37339
+ }
37340
+ }
37341
+ return {
37342
+ text: best,
37343
+ producerInputLimitTokens,
37344
+ ...boundary ? { splitBoundaryOrdinal: boundary.ordinal } : {},
37345
+ removedTokens: Math.max(0, originalTokens - estimateTokens(best))
37346
+ };
36976
37347
  }
36977
37348
 
36978
37349
  // src/hooks/magic-context/protected-tail-boundary.ts
@@ -39492,6 +39863,25 @@ function shouldSuppressHistorianAlert(sessionId) {
39492
39863
  lastHistorianAlertBySession.set(sessionId, Date.now());
39493
39864
  return false;
39494
39865
  }
39866
+ function findDanglingPublicationBoundary(sessionId, compartments, resolveOrdinal = readRawSessionMessageOrdinalById) {
39867
+ for (const compartment of compartments) {
39868
+ if (resolveOrdinal(sessionId, compartment.startMessageId) === null) {
39869
+ return {
39870
+ sequence: compartment.sequence,
39871
+ side: "start",
39872
+ messageId: compartment.startMessageId
39873
+ };
39874
+ }
39875
+ if (resolveOrdinal(sessionId, compartment.endMessageId) === null) {
39876
+ return {
39877
+ sequence: compartment.sequence,
39878
+ side: "end",
39879
+ messageId: compartment.endMessageId
39880
+ };
39881
+ }
39882
+ }
39883
+ return null;
39884
+ }
39495
39885
  async function runCompartmentAgent(deps) {
39496
39886
  const {
39497
39887
  client,
@@ -39695,11 +40085,20 @@ async function runCompartmentAgent(deps) {
39695
40085
  rollbackDrainReservation();
39696
40086
  return;
39697
40087
  }
39698
- const chunkText = chunk.oversizeAtomicUnit ? chunk.text : truncateHistorianInputIfNeeded(chunk.text, historianChunkTokens);
40088
+ const fittedAtomicSource = chunk.oversizeAtomicUnit ? fitAtomicHistorianSourceToProducerWindow({
40089
+ text: chunk.text,
40090
+ resultBoundaries: chunk.toolResultBoundaries,
40091
+ contextLimitTokens: deps.historianContextLimit,
40092
+ maxOutputTokens: deps.historianMaxOutputTokens ?? 32000
40093
+ }) : null;
40094
+ const chunkText = chunk.oversizeAtomicUnit ? fittedAtomicSource?.text ?? chunk.text : truncateHistorianInputIfNeeded(chunk.text, historianChunkTokens);
39699
40095
  const producerSourceTokens = estimateTokens(chunkText);
39700
40096
  if (boundarySnapshot.oversizeAtomicUnit || chunk.oversizeAtomicUnit) {
39701
40097
  sessionLog(sessionId, `historian oversize admission: range=${chunk.startIndex}-${chunk.endIndex} rawComponentTokens=${boundarySnapshot.diagnostics?.head.completedFence.tokenMass ?? "unknown"} perRunCap=${perRunCap} producerSourceTokens=${producerSourceTokens} historianChunkTokens=${historianChunkTokens}; ${describeBoundaryDiagnostics(boundarySnapshot)}`);
39702
40098
  }
40099
+ if (fittedAtomicSource && fittedAtomicSource.removedTokens > 0) {
40100
+ sessionLog(sessionId, `historian pathological component split: range=${chunk.startIndex}-${chunk.endIndex} resultBoundary=${fittedAtomicSource.splitBoundaryOrdinal ?? "midpoint"} removedTokens=${fittedAtomicSource.removedTokens} producerSourceTokens=${producerSourceTokens} producerInputLimitTokens=${fittedAtomicSource.producerInputLimitTokens ?? "unknown"}`);
40101
+ }
39703
40102
  const producerWindowFailure = producerWindowFailureReason({
39704
40103
  producerSourceTokens,
39705
40104
  contextLimitTokens: deps.historianContextLimit,
@@ -39830,6 +40229,16 @@ ${chunkText}`,
39830
40229
  return;
39831
40230
  }
39832
40231
  const compartmentTagKeys = await getRawSessionTagKeysThrough(sessionId, lastCompartmentEnd, { db });
40232
+ const danglingBoundary = findDanglingPublicationBoundary(sessionId, newCompartments);
40233
+ if (danglingBoundary) {
40234
+ const reason = `compartment boundary disappeared before publication (sequence=${danglingBoundary.sequence} side=${danglingBoundary.side} missing_id=${danglingBoundary.messageId})`;
40235
+ telemetry.failureReason = `publish-boundary: ${reason}`;
40236
+ sessionLog(sessionId, `historian publish refused: sequence=${danglingBoundary.sequence} side=${danglingBoundary.side} missing_id=${danglingBoundary.messageId}; raw snapshot changed during the historian run`);
40237
+ const failCount = incrementHistorianFailure(db, sessionId, reason);
40238
+ await notifyHistorianIssue(buildHistorianFailureNotice(failCount, reason));
40239
+ rollbackDrainReservation();
40240
+ return;
40241
+ }
39833
40242
  let published = false;
39834
40243
  const transactionStartedAt = performance.now();
39835
40244
  db.exec("BEGIN IMMEDIATE");
@@ -41533,4 +41942,4 @@ async function runUpgradeMemoryMigration(ctx, sessionId, migrationDirectory) {
41533
41942
  }
41534
41943
  }
41535
41944
 
41536
- export { withContentLanguageDirective, buildPrimaryLanguageDirective, setJsoncValue, removeJsoncValue, cortexKitUserConfigBasePath, cortexKitProjectConfigBasePath, resolveLegacyConfigSources, resolveLegacyConfigSourcesForHarness, migrateMagicContextConfigLocations, string, unknown, array, object, union, tuple, record, parseCron, nextOccurrence, nextDueAtMs, promptSurfaceConfigIdentity, resolveModelConfigValue, resolvePromptSurface, resolveModelConfigOrDefault, DEFAULT_EXECUTE_THRESHOLD_PERCENTAGE, DEFAULT_HISTORIAN_TIMEOUT_MS, DEFAULT_LOCAL_EMBEDDING_MODEL, PER_HARNESS_MIGRATION_INVENTORY, PER_HARNESS_MODEL_KEYS, ConfigProfilesSchema, MagicContextConfigSchema, isFailClosedBlockingError, shouldBypassFailClosedBlock, resolveAgentNameFromMessages, createFailClosedController, recordHookInitFailure, clearHookInitFailure, getLastHookInitFailure, ProjectIdentityError, resolveProjectIdentityStrict, takeDubiousOwnershipProjectIdentityWarning, resolveProjectIdentity, directoryHasGitMetadata, resolveProjectIdentityForSession, normalizeStoredProjectPath, storedPathBelongsToIdentity, isLinkedGitWorktree, recordSessionProjectIdentity, beginBootQuietPeriod, bootQuietRemainingMs, scheduleAfterBootQuiet, rpcPortDir, rpcPortFilePath, isPidAlive, parseRpcPortFile, observeAuthorityRouting, registerModuleNoteEvaluationBridge, getModuleNoteEvaluationBridge, getContextStoreUuid, ensureContextStoreUuid, getAuthorityManagedMarker, reconcileAuthorityProject, checksumAuthoritySeedRows, prepareAuthority, drainAuthority, getMemoryMirrorStatus, applyMirroredNoteCompileFields, drainMirrorPages, pullMemoryMirrorOnce, V2_MEMORY_CATEGORIES, CATEGORY_PRIORITY, resolveWorkspaceShareCategories, resolveWorkspaceIdentitySet, expandWorkspaceIdentitySetWithAliases, resolveStoredPathWorkspaceIdentity, storedPathBelongsToWorkspace, sourceNameForMemory, computeWorkspaceEpochFingerprint, textMentionsRecentCommit, hasMeaningfulUserText, extractTexts, extractToolCallSummaries, getTokenizerNativeMemoryStats, preloadTokenizer, estimateTokens, normalizeText, getCurrentToolSetHash, recordToolDefinition, getMeasuredToolDefinitionTokens, getSchemaFenceRejection, getMigrationOnOpenRefusal, LATEST_SUPPORTED_VERSION, getDatabasePath, getPersistedSchemaVersion, setSqlitePragmaConfig, runSqliteOptimize, openDatabase, openDatabaseAsync, isDatabasePersisted, getDatabasePersistenceError, COMPARTMENT_AGENT_SYSTEM_PROMPT, HISTORIAN_EDITOR_SYSTEM_PROMPT, COMPARTMENT_STRUCTURAL_SYSTEM_PROMPT, Priority, AdmissionClass, SocketClosedError, SocketTimeoutError, StaleRouteHandleError, SubcClient, isConsumerReconnectTransient, connectionFileExists, isRecord, CTX_REDUCE_KEEP, newestCtxReduceTagNumbers, stripWellFormedLeadingTagPrefix, stripPersistedAssistantText, byteSize, stripTagPrefix, prependTag, isThinkingPart, estimateImageTokensFromDataUrl, normalizeTodoStateJson, buildSyntheticTodoPart, computeSyntheticCallId, isSyntheticTodoPart, countRealUserMessages, tailHygieneStructuralSignature, sameTailHygieneStructuralSignature, refreshTailHygieneBaseline, effectiveTailHygiene, assertTailHygieneContentUnchanged, CHANNEL1_SENTINEL, CHANNEL1_FLOOR_TOKENS, toolOutputTokens, decideChannel1, evaluateChannel2, formatChannel1Evaluation, formatChannel2Evaluation, reclaimableToolOutputCount, buildChannel2Reminder, buildChannel1Reminder, estimateEmergencyDropReclaimTokens, planEmergencyDrop, getRecentTagOwnerMessageIds, AGE_RECLAIM_MIN_TOKENS, getOldestActiveUnprotectedToolTags, getActiveToolTagsForAgeReclaim, getTriggerTagTokenUpperBound, getActiveTagTokenTotalsByMessage, tagTokenCountIsNull, backfillTagTokenCounts, insertTag, updateTagStatus, markWhitespaceAssistantTagInert, getInertWhitespaceAssistantTags, updateTagDropMode, updateCavemanDepth, updateTagMessageId, markTagsCompactedByMessageIds, deleteTagsByMessageId, getMaxTagNumberBySession, getTagNumberByMessageId, getAssignableTagNumberByMessageId, deriveTagLoadFloor, getTagsBySession, getActiveTagsBySession, getTailHygieneTags, getDroppedTagsBySession, getTagsByNumbers, getDroppedTagsByNumbers, getMaxDroppedTagNumber, getTagById, getToolTagNumberByOwner, getNullOwnerToolTag, adoptNullOwnerToolTag, getCandidateToolOwners, pickNearestPriorOwner, isRawCompactionSummaryInfo, extractInMemoryMessageViews, buildInMemoryTailRawMessages, estimateTrueRawMessageTokens, invalidateTrueRawTokenCache, isTextPart, isToolPartWithOutput, isFilePart, buildFileSourceContent, assertExecutableToolInput, createDroppedInputToolExecuteBeforeHook, isEditTool, partHasCompletedResult, extractToolCallObservation, ToolMutationBatch, createToolDropTarget, setRawMessageProvider, cleanUserText, withRawSessionMessageCache, readRawSessionMessages, primeTailRawMessageCache, primeInMemoryTailRawMessageCache, readRawSessionMessageOrdinalPage, getRawSessionStoredMessageCount, readRawSessionMessagePartsById, readRawSessionMessageOrdinalById, readRawSessionMessageById, readSessionChunk, readRawSessionSeedTail, COMPARTMENT_LEASE_RENEWAL_MS, acquireCompartmentLease, renewCompartmentLease, releaseCompartmentLeaseBestEffort, HAS_COMPARTMENT_CONTENT_SQL, getCompartments, getLastCompartmentEndMessage, getLastCompartmentEndMessageId, clearRecompStaging, getMessageIndexSourceIdentity, isMessageIndexSourceCurrent, getLastIndexedOrdinal, getIndexedMessageCorpusSize, getMessageIndexReconciliationStartOrdinal, isMessageIndexReconciledThrough, deleteIndexedMessage, clearIndexedMessages, indexSingleMessage, indexMessagesAfterOrdinal, sweepOrphanedOpenCodeMessageIndexes, recordEmbeddingMeasurement, getMaxM0MutationId, queueMemoryMutation, getMemoryMutationsForRenderByProjects, getMaxMemoryMutationIdForProjects, MAX_EXECUTE_THRESHOLD, escalationBands, MERGED_REASONING_PARTS_PREFIX, readFrozenMergedReasoningParts, getProtectionWindowForSession, isEmergencyRecoveryArmed, isProviderOverflowReconfirmed, isProviderOverflowFailClosedProven, getEmergencyRecoveryArmedAt, loadPersistedUsage, loadProtectedTailMeta, resetProtectedTailNoEligibleHead, getWrapupInProgressState, acquireWrapupInProgress, updateWrapupInProgress, releaseWrapupInProgress, resolveCompactionModeRecord, getCompactionModeRecord, setCompactionModeRecord, getPersistedReasoningWatermark, setPersistedReasoningWatermark, clearPersistedReasoningWatermark, getEmergencyInputSample, setEmergencyDropSample, clearEmergencyDropSample, getLastNudgeUndropped, setLastNudgeUndropped, getChannel1NudgeState, setChannel1NudgeState, markChannel1PostReduceGracePending, captureChannel1PostReduceGraceBaseline, getChannel2NudgeState, getChannel2NudgeClaim, setChannel2NudgeState, casChannel2NudgeState, claimChannel2NudgeState, casChannel2NudgeClaim, getPersistedNoteNudge, getNoteNudgeAnchors, getAutoSearchHintDecisions, appendAutoSearchHintDecision, pruneNoteNudgeAnchors, pruneAutoSearchHintDecisions, removeNoteNudgeAnchorByMessageId, removeAutoSearchHintDecisionByMessageId, getPersistedTodoPermissionDenied, setPersistedTodoPermissionDenied, getPersistedTodoSyntheticAnchor, setPersistedTodoSyntheticAnchor, clearPersistedTodoSyntheticAnchor, setNoteLastReadAt, getHistorianFailureState, clearHistorianFailureState, getOverflowState, loadTransformPassStateSnapshot, recordOverflowDetected, recordDetectedContextLimit, clearEmergencyRecovery, clearDetectedContextLimit, getPersistedCompactionMarkerState, setPersistedCompactionMarkerState, getDeferredClearedCompactionMarkerState, retireDeferredClearedCompactionMarkerState, getStrippedPlaceholderIds, applyStrippedPlaceholderDelta, removeStrippedPlaceholderId, NEWEST_REASONING_BEARING_ASSISTANT, THINKING_BINDING_RECOVERY_FROZEN_PREFIX, thinkingBindingRecoveryFrozenId, getThinkingBindingRecoveryTarget, armThinkingBindingRecovery, clearThinkingBindingRecoveryIf, getMergedReasoningStrippedIds, addMergedReasoningStrippedIds, getTrailingBlankDecisions, addTrailingBlankDecisions, demoteTrailingBlankKeepDecisions, getStaleReduceStrippedIds, addStaleReduceStrippedIds, getProcessedImageStrippedIds, addProcessedImageStrippedIds, getPendingCompactionMarkerState, loadPostprocessReplaySnapshot, setPendingCompactionMarkerState, clearPendingCompactionMarkerStateIf, getSessionsWithPendingMarker, setSessionWorkMetrics, getObservedEpochFloor, resolveEpochFloorForPass, getNotes, addNote, getSessionNotes, getPendingSmartNotes, getReadySmartNotes, updateNote, dismissNotes, dismissNote, markNoteReady, markNoteChecked, queuePendingOp, getPendingOps, getPendingOpsCount, 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, createChildSessionWithFence, HiddenCompletionRefusal, detectThinkingBindingMismatch, isFable51ThinkingBindingModel, detectOverflow, modelBodyField, toModelEntry, getPromptFailureDetail, promptSyncWithValidatedOutputRetry, normalizeSDKResponse, promptSurfaceHashMaterial, createPromptSurfaceRuntime, createPromptSurfaceGuidanceEpochCache, extractLatestAssistantText, hasLengthCappedOutput, setKeepSubagents, teardownChildSession, renderUserFacingFailure, userFacingFailureCode, renderCapabilityRefusal, capabilityRefusalCode, renderDreamFailure, dreamFailureCode, renderEmbeddingFailure, getCompartmentEvents, SYNAPSE_DEFAULT_MODEL, toSynapseLaneDescriptor, formatSynapseLaneDescriptor, SynapseEmbeddingProvider, loadCompartmentChunkEmbeddingsForSearch, cosineSimilarity, computeNormalizedHash, getLocalEmbeddingNativeMemoryStats, saveCommitEmbedding, loadProjectCommitEmbeddings, loadUnembeddedCommits, countEmbeddedCommits, upsertCommits, getLatestIndexedCommitTimeMs, enforceProjectCap, GIT_SWEEP_LEASE_RENEWAL_MS, acquireGitSweepLease, renewGitSweepLease, markGitSweepSuccessAndRelease, parkGitSweepNonIndexable, releaseGitSweepLease, saveEmbeddingIfHashMatches, getProjectEmbeddings, peekProjectEmbeddings, invalidateProject, invalidateMemory, describeShadowBackfillWriteRefusal, 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, recordChildInvocation, createV1HiddenCompletionExecutor, USER_MEMORY_CANDIDATE_TTL_MS, insertUserMemoryCandidates, getUserMemoryCandidates, deleteUserMemoryCandidates, pruneExpiredUserMemoryCandidates, insertUserMemory, getActiveUserMemories, updateUserMemoryContent, dismissUserMemory, getMural, BoundedSessionMap, registerLkgPersistence, beginLkgPass, visitMessageContentFields, messageContentFields, signatureForFields, exactReusablePrefix, incrementalLkgContentDigests, lkgContentDigest, captureSlot, getInMemorySlot, getSlot, dropSlot, noteEntry, getLkgSlotHeapStats, onNoteTrigger, peekNoteNudgeText, markNoteNudgeDelivered, clearNoteNudgeTriggerAndCooldown, resetNoteNudgeCooldownOnly, clearNoteNudgeTriggerOnly, getOpenCodeDbPath, removeMcOwnedCompactionMarkers, MARKER_SUMMARY_TEXT, applyDeferredCompactionMarker, removeCompactionMarkerForSession, checkCompactionMarkerConsistency, modelKeyAcceptsImages, resolveMuralWire, extractM0Block, formatDate, injectTemporalMarkers, clearInjectionCache, getVisibleMemoryIds, selectHiddenMessagesAtCompactionSeam, prepareCompartmentInjection, renderCompartmentInjection, mustMaterialize, trimMemoriesToBudgetV2, renderMemoryBlockV2, materializeM0, prepareCachedM0M1Replay, hasCompleteCachedM0M1, injectM0M1, describeBoundaryDiagnostics, RECOVERY_NO_HEAD_LIMIT, resolveOpenCodeProtectedTailBoundary, resolveWrapupProtectedTailBoundary, getRawHistoryEligibility, hasRunnableCompartmentWindow, recordHighPressureNoEligibleHead, runCompartmentAgent, snapRangeToCompartments, getActiveCompartmentRun, markActiveCompartmentRunPublished, registerActiveCompartmentRun, startCompartmentAgent, setRecompStarting2, setRecompTerminal2, runManagedRecomp2, runManagedUpgrade2 };
41945
+ export { withContentLanguageDirective, buildPrimaryLanguageDirective, setJsoncValue, removeJsoncValue, cortexKitUserConfigBasePath, cortexKitProjectConfigBasePath, resolveLegacyConfigSources, resolveLegacyConfigSourcesForHarness, migrateMagicContextConfigLocations, string, unknown, array, object, union, tuple, record, parseCron, nextOccurrence, nextDueAtMs, promptSurfaceConfigIdentity, resolveModelConfigValue, resolvePromptSurface, resolveModelConfigOrDefault, DEFAULT_EXECUTE_THRESHOLD_PERCENTAGE, DEFAULT_HISTORIAN_TIMEOUT_MS, PROTECTED_TOKENS_MIN, DEFAULT_LOCAL_EMBEDDING_MODEL, PER_HARNESS_MIGRATION_INVENTORY, PER_HARNESS_MODEL_KEYS, ConfigProfilesSchema, MagicContextConfigSchema, isFailClosedBlockingError, shouldBypassFailClosedBlock, resolveAgentNameFromMessages, createFailClosedController, recordHookInitFailure, clearHookInitFailure, getLastHookInitFailure, ProjectIdentityError, resolveProjectIdentityStrict, takeDubiousOwnershipProjectIdentityWarning, resolveProjectIdentity, directoryHasGitMetadata, resolveProjectIdentityForSession, normalizeStoredProjectPath, storedPathBelongsToIdentity, isLinkedGitWorktree, recordSessionProjectIdentity, beginBootQuietPeriod, bootQuietRemainingMs, scheduleAfterBootQuiet, rpcPortDir, rpcPortFilePath, isPidAlive, parseRpcPortFile, observeAuthorityRouting, registerModuleNoteEvaluationBridge, getModuleNoteEvaluationBridge, getContextStoreUuid, ensureContextStoreUuid, getAuthorityManagedMarker, reconcileAuthorityProject, checksumAuthoritySeedRows, prepareAuthority, drainAuthority, getMemoryMirrorStatus, moduleMemoryIdentityForHostId, hostMemoryIdentityForModuleId, applyMirroredNoteCompileFields, applyTargetedMemoryMirrorRow, drainMirrorPages, pullMemoryMirrorOnce, V2_MEMORY_CATEGORIES, CATEGORY_PRIORITY, resolveWorkspaceShareCategories, resolveWorkspaceIdentitySet, expandWorkspaceIdentitySetWithAliases, resolveStoredPathWorkspaceIdentity, storedPathBelongsToWorkspace, sourceNameForMemory, computeWorkspaceEpochFingerprint, textMentionsRecentCommit, hasMeaningfulUserText, extractTexts, extractToolCallSummaries, getTokenizerNativeMemoryStats, preloadTokenizer, estimateTokens, normalizeText, getCurrentToolSetHash, recordToolDefinition, getMeasuredToolDefinitionTokens, getSchemaFenceRejection, getMigrationOnOpenRefusal, LATEST_SUPPORTED_VERSION, getDatabasePath, getPersistedSchemaVersion, setSqlitePragmaConfig, runSqliteOptimize, openDatabase, openDatabaseAsync, isDatabasePersisted, getDatabasePersistenceError, COMPARTMENT_AGENT_SYSTEM_PROMPT, HISTORIAN_EDITOR_SYSTEM_PROMPT, COMPARTMENT_STRUCTURAL_SYSTEM_PROMPT, Priority, AdmissionClass, SocketClosedError, SocketTimeoutError, StaleRouteHandleError, SubcClient, isConsumerReconnectTransient, connectionFileExists, isRecord, CTX_REDUCE_KEEP, newestCtxReduceTagNumbers, stripWellFormedLeadingTagPrefix, stripPersistedAssistantText, byteSize, stripTagPrefix, prependTag, isThinkingPart, estimateImageTokensFromDataUrl, normalizeTodoStateJson, buildSyntheticTodoPart, computeSyntheticCallId, isSyntheticTodoPart, countRealUserMessages, tailHygieneStructuralSignature, sameTailHygieneStructuralSignature, refreshTailHygieneBaseline, effectiveTailHygiene, assertTailHygieneContentUnchanged, CHANNEL1_SENTINEL, CHANNEL1_FLOOR_TOKENS, toolOutputTokens, decideChannel1, evaluateChannel2, formatChannel1Evaluation, formatChannel2Evaluation, reclaimableToolOutputCount, buildChannel2Reminder, buildChannel1Reminder, estimateEmergencyDropReclaimTokens, planEmergencyDrop, getRecentTagOwnerMessageIds, AGE_RECLAIM_MIN_TOKENS, getOldestActiveUnprotectedToolTags, getActiveToolTagsForAgeReclaim, getTriggerTagTokenUpperBound, getActiveTagTokenTotalsByMessage, tagTokenCountIsNull, backfillTagTokenCounts, insertTag, updateTagStatus, markWhitespaceAssistantTagInert, getInertWhitespaceAssistantTags, updateTagDropMode, updateCavemanDepth, updateTagMessageId, markTagsCompactedByMessageIds, deleteTagsByMessageId, getMaxTagNumberBySession, getTagNumberByMessageId, getAssignableTagNumberByMessageId, deriveTagLoadFloor, getTagsBySession, getActiveTagsBySession, getTailHygieneTags, getDroppedTagsBySession, getTagsByNumbers, getDroppedTagsByNumbers, getMaxDroppedTagNumber, getTagById, getToolTagNumberByOwner, getNullOwnerToolTag, adoptNullOwnerToolTag, getCandidateToolOwners, pickNearestPriorOwner, isRawCompactionSummaryInfo, extractInMemoryMessageViews, buildInMemoryTailRawMessages, estimateTrueRawMessageTokens, invalidateTrueRawTokenCache, isTextPart, isToolPartWithOutput, isFilePart, buildFileSourceContent, assertExecutableToolInput, createDroppedInputToolExecuteBeforeHook, isEditTool, partHasCompletedResult, extractToolCallObservation, ToolMutationBatch, createToolDropTarget, setRawMessageProvider, cleanUserText, withRawSessionMessageCache, readRawSessionMessages, primeTailRawMessageCache, primeInMemoryTailRawMessageCache, readRawSessionMessageOrdinalPage, getRawSessionStoredMessageCount, readRawSessionMessageIdOrdinals, readRawSessionMessagePartsById, readRawSessionMessageOrdinalById, readRawSessionMessageById, readSessionChunk, readRawSessionSeedTail, COMPARTMENT_LEASE_RENEWAL_MS, acquireCompartmentLease, renewCompartmentLease, releaseCompartmentLeaseBestEffort, HAS_COMPARTMENT_CONTENT_SQL, getCompartments, getLastCompartmentEndMessage, getLastCompartmentEndMessageId, clearRecompStaging, getMessageIndexSourceIdentity, isMessageIndexSourceCurrent, getLastIndexedOrdinal, getIndexedMessageCorpusSize, getMessageIndexReconciliationStartOrdinal, isMessageIndexReconciledThrough, deleteIndexedMessage, clearIndexedMessages, indexSingleMessage, indexMessagesAfterOrdinal, sweepOrphanedOpenCodeMessageIndexes, recordEmbeddingMeasurement, getMaxM0MutationId, queueMemoryMutation, getMemoryMutationsForRenderByProjects, getMaxMemoryMutationIdForProjects, MAX_EXECUTE_THRESHOLD, escalationBands, MERGED_REASONING_PARTS_PREFIX, readFrozenMergedReasoningParts, getProtectionWindowForSession, isEmergencyRecoveryArmed, isProviderOverflowReconfirmed, isProviderOverflowFailClosedProven, getEmergencyRecoveryArmedAt, loadPersistedUsage, loadProtectedTailMeta, resetProtectedTailNoEligibleHead, getWrapupInProgressState, acquireWrapupInProgress, updateWrapupInProgress, releaseWrapupInProgress, resolveCompactionModeRecord, getCompactionModeRecord, setCompactionModeRecord, getPersistedReasoningWatermark, setPersistedReasoningWatermark, clearPersistedReasoningWatermark, getEmergencyInputSample, setEmergencyDropSample, clearEmergencyDropSample, getLastNudgeUndropped, setLastNudgeUndropped, getChannel1NudgeState, setChannel1NudgeState, markChannel1PostReduceGracePending, captureChannel1PostReduceGraceBaseline, getChannel2NudgeState, getChannel2NudgeClaim, setChannel2NudgeState, casChannel2NudgeState, claimChannel2NudgeState, casChannel2NudgeClaim, getPersistedNoteNudge, getNoteNudgeAnchors, getAutoSearchHintDecisions, appendAutoSearchHintDecision, pruneNoteNudgeAnchors, pruneAutoSearchHintDecisions, removeNoteNudgeAnchorByMessageId, removeAutoSearchHintDecisionByMessageId, getPersistedTodoPermissionDenied, setPersistedTodoPermissionDenied, getPersistedTodoSyntheticAnchor, setPersistedTodoSyntheticAnchor, clearPersistedTodoSyntheticAnchor, setNoteLastReadAt, getHistorianFailureState, clearHistorianFailureState, getOverflowState, loadTransformPassStateSnapshot, recordOverflowDetected, recordDetectedContextLimit, clearEmergencyRecovery, clearDetectedContextLimit, getPersistedCompactionMarkerState, setPersistedCompactionMarkerState, getDeferredClearedCompactionMarkerState, retireDeferredClearedCompactionMarkerState, getStrippedPlaceholderIds, applyStrippedPlaceholderDelta, removeStrippedPlaceholderId, NEWEST_REASONING_BEARING_ASSISTANT, THINKING_BINDING_RECOVERY_FROZEN_PREFIX, thinkingBindingRecoveryFrozenId, getThinkingBindingRecoveryTarget, armThinkingBindingRecovery, clearThinkingBindingRecoveryIf, getMergedReasoningStrippedIds, addMergedReasoningStrippedIds, getTrailingBlankDecisions, addTrailingBlankDecisions, demoteTrailingBlankKeepDecisions, getStaleReduceStrippedIds, addStaleReduceStrippedIds, getProcessedImageStrippedIds, addProcessedImageStrippedIds, getPendingCompactionMarkerState, loadPostprocessReplaySnapshot, setPendingCompactionMarkerState, clearPendingCompactionMarkerStateIf, getSessionsWithPendingMarker, setSessionWorkMetrics, getObservedEpochFloor, resolveEpochFloorForPass, getNotes, addNote, getSessionNotes, getPendingSmartNotes, getReadySmartNotes, updateNote, dismissNotes, dismissNote, markNoteReady, markNoteChecked, queuePendingOp, getPendingOps, getPendingOpsCount, 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, createChildSessionWithFence, HiddenCompletionRefusal, detectThinkingBindingMismatch, isFable51ThinkingBindingModel, detectOverflow, parseProviderModel, modelBodyField, toModelEntry, getPromptFailureDetail, promptSyncWithValidatedOutputRetry, normalizeSDKResponse, ACTIVE_TOOL_IDS, promptSurfaceHashMaterial, createPromptSurfaceRuntime, createPromptSurfaceGuidanceEpochCache, extractLatestAssistantText, hasLengthCappedOutput, setKeepSubagents, teardownChildSession, renderUserFacingFailure, userFacingFailureCode, renderCapabilityRefusal, capabilityRefusalCode, renderDreamFailure, dreamFailureCode, renderEmbeddingFailure, getCompartmentEvents, SYNAPSE_DEFAULT_MODEL, toSynapseLaneDescriptor, formatSynapseLaneDescriptor, SynapseEmbeddingProvider, loadCompartmentChunkEmbeddingsForSearch, cosineSimilarity, computeNormalizedHash, getLocalEmbeddingNativeMemoryStats, saveCommitEmbedding, loadProjectCommitEmbeddings, loadUnembeddedCommits, countEmbeddedCommits, upsertCommits, getLatestIndexedCommitTimeMs, enforceProjectCap, GIT_SWEEP_LEASE_RENEWAL_MS, acquireGitSweepLease, renewGitSweepLease, markGitSweepSuccessAndRelease, parkGitSweepNonIndexable, releaseGitSweepLease, saveEmbeddingIfHashMatches, getProjectEmbeddings, peekProjectEmbeddings, invalidateProject, invalidateMemory, describeShadowBackfillWriteRefusal, markProjectLoadUntrusted, contentSha256, sweepStaleEmbeddingIdentitiesForProject, registerProjectEmbedding, registerProjectShadowEmbedding, getShadowEmbeddingMeasurementCohort, getPrimaryEmbeddingMeasurementCohort, embedShadowTextForProject, enqueueShadowEmbeddingItems, registerProjectInObservationMode, unregisterProjectShadowEmbedding, 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, recordChildInvocation, createV1HiddenCompletionExecutor, USER_MEMORY_CANDIDATE_TTL_MS, insertUserMemoryCandidates, getUserMemoryCandidates, deleteUserMemoryCandidates, pruneExpiredUserMemoryCandidates, insertUserMemory, getActiveUserMemories, updateUserMemoryContent, dismissUserMemory, getMural, BoundedSessionMap, registerLkgPersistence, beginLkgPass, visitMessageContentFields, messageContentFields, signatureForFields, exactReusablePrefix, incrementalLkgContentDigests, lkgContentDigest, captureSlot, getInMemorySlot, getSlot, dropSlot, noteEntry, getLkgSlotHeapStats, onNoteTrigger, peekNoteNudgeText, markNoteNudgeDelivered, clearNoteNudgeTriggerAndCooldown, resetNoteNudgeCooldownOnly, clearNoteNudgeTriggerOnly, getOpenCodeDbPath, removeMcOwnedCompactionMarkers, MARKER_SUMMARY_TEXT, applyDeferredCompactionMarker, removeCompactionMarkerForSession, checkCompactionMarkerConsistency, modelKeyAcceptsImages, resolveMuralWire, extractM0Block, formatDate, injectTemporalMarkers, clearInjectionCache, getVisibleMemoryIds, selectHiddenMessagesAtCompactionSeam, prepareCompartmentInjection, renderCompartmentInjection, mustMaterialize, trimMemoriesToBudgetV2, renderMemoryBlockV2, materializeM0, prepareCachedM0M1Replay, hasCompleteCachedM0M1, injectM0M1, describeBoundaryDiagnostics, RECOVERY_NO_HEAD_LIMIT, resolveOpenCodeProtectedTailBoundary, resolveWrapupProtectedTailBoundary, getRawHistoryEligibility, hasRunnableCompartmentWindow, recordHighPressureNoEligibleHead, runCompartmentAgent, snapRangeToCompartments, getActiveCompartmentRun, markActiveCompartmentRunPublished, registerActiveCompartmentRun, startCompartmentAgent, setRecompStarting2, setRecompTerminal2, runManagedRecomp2, runManagedUpgrade2 };