@cortexkit/opencode-magic-context 0.42.4 → 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 (144) 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/curate-category-rotation.d.ts +26 -0
  11. package/dist/features/magic-context/dreamer/curate-category-rotation.d.ts.map +1 -0
  12. package/dist/features/magic-context/dreamer/open-opencode-db.d.ts.map +1 -1
  13. package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts +7 -5
  14. package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts.map +1 -1
  15. package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
  16. package/dist/features/magic-context/dreamer/task-gates.d.ts +1 -0
  17. package/dist/features/magic-context/dreamer/task-gates.d.ts.map +1 -1
  18. package/dist/features/magic-context/dreamer/task-prompts.d.ts +3 -0
  19. package/dist/features/magic-context/dreamer/task-prompts.d.ts.map +1 -1
  20. package/dist/features/magic-context/dreamer/task-registry.d.ts +6 -0
  21. package/dist/features/magic-context/dreamer/task-registry.d.ts.map +1 -1
  22. package/dist/features/magic-context/dreamer/task-scheduler.d.ts +5 -1
  23. package/dist/features/magic-context/dreamer/task-scheduler.d.ts.map +1 -1
  24. package/dist/features/magic-context/memory/embedding-local.d.ts +12 -0
  25. package/dist/features/magic-context/memory/embedding-local.d.ts.map +1 -1
  26. package/dist/features/magic-context/memory/embedding.d.ts +1 -1
  27. package/dist/features/magic-context/memory/embedding.d.ts.map +1 -1
  28. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  29. package/dist/features/magic-context/migrations.d.ts +12 -0
  30. package/dist/features/magic-context/migrations.d.ts.map +1 -1
  31. package/dist/features/magic-context/project-embedding-registry.d.ts +1 -0
  32. package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
  33. package/dist/features/magic-context/session-project-backfill.d.ts.map +1 -1
  34. package/dist/features/magic-context/storage-db.d.ts +1 -1
  35. package/dist/features/magic-context/tool-owner-backfill.d.ts.map +1 -1
  36. package/dist/hooks/auto-update-checker/index.d.ts.map +1 -1
  37. package/dist/hooks/magic-context/cache-busting-signals.d.ts +0 -1
  38. package/dist/hooks/magic-context/cache-busting-signals.d.ts.map +1 -1
  39. package/dist/hooks/magic-context/channel2-delivery.d.ts +8 -0
  40. package/dist/hooks/magic-context/channel2-delivery.d.ts.map +1 -1
  41. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts +12 -0
  42. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
  43. package/dist/hooks/magic-context/hook.d.ts +4 -4
  44. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  45. package/dist/hooks/magic-context/module-state-sync.d.ts +3 -0
  46. package/dist/hooks/magic-context/module-state-sync.d.ts.map +1 -1
  47. package/dist/hooks/magic-context/module-transport.d.ts +24 -2
  48. package/dist/hooks/magic-context/module-transport.d.ts.map +1 -1
  49. package/dist/hooks/magic-context/module-wire.d.ts +1 -1
  50. package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
  51. package/dist/hooks/magic-context/producer-window-guard.d.ts +31 -1
  52. package/dist/hooks/magic-context/producer-window-guard.d.ts.map +1 -1
  53. package/dist/hooks/magic-context/read-session-chunk.d.ts +6 -0
  54. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  55. package/dist/hooks/magic-context/read-session-db.d.ts +8 -0
  56. package/dist/hooks/magic-context/read-session-db.d.ts.map +1 -1
  57. package/dist/hooks/magic-context/read-session-formatting.d.ts +6 -0
  58. package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -1
  59. package/dist/hooks/magic-context/rust-mode-transform.d.ts +30 -0
  60. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  61. package/dist/hooks/magic-context/rust-refusal-recovery.d.ts +28 -0
  62. package/dist/hooks/magic-context/rust-refusal-recovery.d.ts.map +1 -0
  63. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
  64. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  65. package/dist/hooks/magic-context/transform.d.ts +7 -0
  66. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  67. package/dist/{index-bkg2fdj1.js → index-4wwr6cz0.js} +3 -0
  68. package/dist/{index-jkrqhc7y.js → index-a9ssj59b.js} +94 -15
  69. package/dist/{index-faay035c.js → index-djp6rwz6.js} +484 -57
  70. package/dist/{index-p474rw9p.js → index-ngjmj6xx.js} +1 -1
  71. package/dist/{index-d8mgqezq.js → index-s61hh7gv.js} +50 -17
  72. package/dist/{index-1ar7b3e9.js → index-znraa0kv.js} +1 -1
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +1667 -380
  75. package/dist/plugin/embedding-bootstrap.d.ts.map +1 -1
  76. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  77. package/dist/plugin/memory-id-translation.d.ts +23 -0
  78. package/dist/plugin/memory-id-translation.d.ts.map +1 -0
  79. package/dist/plugin/rust-tool-backends.d.ts +1 -1
  80. package/dist/plugin/rust-tool-backends.d.ts.map +1 -1
  81. package/dist/{recomp-orchestrator-c4sa354a.js → recomp-orchestrator-0xx1364v.js} +4 -4
  82. package/dist/{send-session-notification-xnypkxpx.js → send-session-notification-jbxknvar.js} +2 -2
  83. package/dist/shared/auto-update-provenance.d.ts +9 -0
  84. package/dist/shared/auto-update-provenance.d.ts.map +1 -0
  85. package/dist/shared/conflict-detector.d.ts +5 -1
  86. package/dist/shared/conflict-detector.d.ts.map +1 -1
  87. package/dist/shared/opencode-db-path.d.ts +31 -2
  88. package/dist/shared/opencode-db-path.d.ts.map +1 -1
  89. package/dist/shared/prompt-surface-runtime.d.ts +3 -3
  90. package/dist/shared/prompt-surface-runtime.d.ts.map +1 -1
  91. package/dist/{storage-meta-session-x3j0q9qy.js → storage-meta-session-z818pn1e.js} +2 -2
  92. package/dist/{task-config-ys0arma5.js → task-config-cv8k9y8r.js} +1 -1
  93. package/dist/tools/ctx-expand/mode.d.ts +31 -0
  94. package/dist/tools/ctx-expand/mode.d.ts.map +1 -0
  95. package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
  96. package/dist/tools/ctx-memory/tools.d.ts.map +1 -1
  97. package/dist/tools/ctx-note/constants.d.ts +1 -1
  98. package/dist/tools/ctx-note/constants.d.ts.map +1 -1
  99. package/dist/tools/ctx-note/tools.d.ts.map +1 -1
  100. package/dist/tools/ctx-note/types.d.ts +1 -1
  101. package/dist/tools/ctx-note/types.d.ts.map +1 -1
  102. package/dist/tools/ctx-reduce/constants.d.ts +1 -1
  103. package/dist/tools/ctx-reduce/constants.d.ts.map +1 -1
  104. package/dist/tools/ctx-search/types.d.ts +1 -1
  105. package/dist/tools/ctx-search/types.d.ts.map +1 -1
  106. package/dist/tools/light-descriptions.d.ts +2 -2
  107. package/dist/tools/light-descriptions.d.ts.map +1 -1
  108. package/dist/v2/hidden-completion.d.ts +69 -13
  109. package/dist/v2/hidden-completion.d.ts.map +1 -1
  110. package/dist/v2/hooks/context.d.ts +13 -1
  111. package/dist/v2/hooks/context.d.ts.map +1 -1
  112. package/dist/v2/hooks/hidden-child.d.ts +31 -0
  113. package/dist/v2/hooks/hidden-child.d.ts.map +1 -0
  114. package/dist/v2/hooks/store.d.ts.map +1 -1
  115. package/dist/v2/hooks/types.d.ts +99 -19
  116. package/dist/v2/hooks/types.d.ts.map +1 -1
  117. package/dist/v2/server.d.ts +19 -0
  118. package/dist/v2/server.d.ts.map +1 -1
  119. package/dist/v2/server.js +2311 -2724
  120. package/dist/v2/store-reader.d.ts +11 -5
  121. package/dist/v2/store-reader.d.ts.map +1 -1
  122. package/dist/v2/tui/index.d.ts +10 -0
  123. package/dist/v2/tui/index.d.ts.map +1 -0
  124. package/dist/v2/tui/types.d.ts +80 -0
  125. package/dist/v2/tui/types.d.ts.map +1 -0
  126. package/package.json +5 -4
  127. package/src/agents/magic-context-prompt.ts +1 -1
  128. package/src/config/index.ts +31 -1
  129. package/src/config/protected-tokens.test.ts +40 -0
  130. package/src/config/schema/magic-context.ts +8 -3
  131. package/src/features/magic-context/dreamer/task-registry.ts +10 -0
  132. package/src/shared/auto-update-provenance.ts +42 -0
  133. package/src/shared/conflict-detector.test.ts +53 -0
  134. package/src/shared/conflict-detector.ts +88 -19
  135. package/src/shared/models-dev-cache.test.ts +25 -0
  136. package/src/shared/opencode-db-path.test.ts +96 -0
  137. package/src/shared/opencode-db-path.ts +146 -15
  138. package/src/shared/prompt-surface-a1-golden.md +12 -16
  139. package/src/shared/prompt-surface-runtime.test.ts +20 -0
  140. package/src/shared/prompt-surface-runtime.ts +7 -5
  141. package/src/tui/entry.mjs +11 -1
  142. package/src/v2/tui/host-contract.test.ts +202 -0
  143. package/src/v2/tui/index.ts +270 -0
  144. 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
 
@@ -8946,7 +9138,7 @@ function memoizedContent(kind, content) {
8946
9138
  return cached;
8947
9139
  const measured = {
8948
9140
  hash: fnv1a32(key),
8949
- tokens: kind === "excluded" ? 0 : estimateTokens(content),
9141
+ tokens: kind === "excluded" ? 0 : undefined,
8950
9142
  keyBytes: key.length * 2 + 32
8951
9143
  };
8952
9144
  contentMemo.set(key, measured);
@@ -8962,6 +9154,13 @@ function memoizedContent(kind, content) {
8962
9154
  }
8963
9155
  return measured;
8964
9156
  }
9157
+ function memoizedTokens(kind, content) {
9158
+ const measured = memoizedContent(kind, content);
9159
+ if (measured.tokens === undefined) {
9160
+ measured.tokens = estimateTokens(content);
9161
+ }
9162
+ return measured.tokens;
9163
+ }
8965
9164
  function safeStableStringify(value) {
8966
9165
  if (value === undefined || value === null)
8967
9166
  return "";
@@ -9264,8 +9463,8 @@ function fileContentAndTokens(part) {
9264
9463
  };
9265
9464
  }
9266
9465
  const content = firstString(part, ["content", "text", "source", "url"]);
9267
- const memo = memoizedContent("file", content);
9268
- return { content, tokens: memo.tokens };
9466
+ const tokens = memoizedTokens("file", content);
9467
+ return { content, tokens };
9269
9468
  }
9270
9469
  function contentSignature(parts) {
9271
9470
  return fnv1a32(parts.map((part) => `${part.key}:${part.contentHash}`).join("\x00"));
@@ -9350,13 +9549,13 @@ function measureTailHygiene(input) {
9350
9549
  parts.push(excludedSnapshot(`${key}\x00excluded`, part));
9351
9550
  continue;
9352
9551
  }
9353
- const memo = memoizedContent("text", content);
9552
+ const tokens = memoizedTokens("text", content);
9354
9553
  const tag = attribution.messageTags.get(`${message.info.id}:p${partIndex}`);
9355
9554
  const measured = snapshot({
9356
9555
  key: `${key}\x00text`,
9357
9556
  kind: "text",
9358
9557
  content,
9359
- tokens: memo.tokens,
9558
+ tokens,
9360
9559
  tag,
9361
9560
  protectedNumbers: attribution.protectedNumbers,
9362
9561
  pendingDropTagNumbers
@@ -9397,12 +9596,12 @@ function measureTailHygiene(input) {
9397
9596
  const tag = attribution.toolTagsByPart.get(part);
9398
9597
  const inputText = toolInputText(part);
9399
9598
  if (inputText !== null) {
9400
- const memo = memoizedContent("toolInput", inputText);
9599
+ const tokens = memoizedTokens("toolInput", inputText);
9401
9600
  const measured = snapshot({
9402
9601
  key: `${key}\x00toolInput`,
9403
9602
  kind: "toolInput",
9404
9603
  content: inputText,
9405
- tokens: memo.tokens,
9604
+ tokens,
9406
9605
  tag,
9407
9606
  protectedNumbers: attribution.protectedNumbers,
9408
9607
  pendingDropTagNumbers
@@ -9417,12 +9616,12 @@ function measureTailHygiene(input) {
9417
9616
  if (isDropSentinel(output)) {
9418
9617
  parts.push(excludedSnapshot(`${key}\x00excludedOutput`, output));
9419
9618
  } else {
9420
- const memo = memoizedContent("toolOutput", output);
9619
+ const tokens = memoizedTokens("toolOutput", output);
9421
9620
  const measured = snapshot({
9422
9621
  key: `${key}\x00toolOutput`,
9423
9622
  kind: "toolOutput",
9424
9623
  content: output,
9425
- tokens: memo.tokens,
9624
+ tokens,
9426
9625
  tag,
9427
9626
  protectedNumbers: attribution.protectedNumbers,
9428
9627
  pendingDropTagNumbers
@@ -9513,7 +9712,7 @@ function refreshTailHygieneBaseline(input) {
9513
9712
  for (let index = input.previous.baselineParts.length;index < measured.parts.length; index += 1) {
9514
9713
  const part = measured.parts[index];
9515
9714
  turnDeltaT += part.tokens;
9516
- if (part.kind !== "toolOutput")
9715
+ if (part.kind !== "toolOutput" || !part.protected)
9517
9716
  turnDeltaU += part.uTokens;
9518
9717
  }
9519
9718
  return {
@@ -10781,6 +10980,20 @@ function countRawSessionMessageOrdinalsFromDb(db, sessionId) {
10781
10980
  )`).get(sessionId);
10782
10981
  return typeof row?.count === "number" ? row.count : 0;
10783
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
+ }
10784
10997
  function readRawSessionMessageOrdinalPageFromDb(db, sessionId, after, limit) {
10785
10998
  const pageSize = Math.max(1, Math.floor(limit));
10786
10999
  const rows = (after ? db.prepare(`SELECT id, data, time_created
@@ -12087,6 +12300,17 @@ function getRawSessionStoredMessageCount(sessionId) {
12087
12300
  return 0;
12088
12301
  return withReadOnlySessionDb((db) => countStoredRawSessionMessagesFromDb(db, sessionId));
12089
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
+ }
12090
12314
  function readRawSessionMessagePartsById(sessionId, messageId, onQuery) {
12091
12315
  const provider = sessionProviders.get(sessionId);
12092
12316
  if (provider?.readMessagePartsById)
@@ -12277,6 +12501,14 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12277
12501
  const totalMessageCount = getCachedAbsoluteMessageCount(sessionId) ?? messages.length;
12278
12502
  const startOrdinal = Math.max(1, offset);
12279
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
+ }
12280
12512
  const lines = [];
12281
12513
  const lineMeta = [];
12282
12514
  const flushedToolOnlyBlocks = [];
@@ -12290,6 +12522,25 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12290
12522
  let pendingNoiseMeta = [];
12291
12523
  let commitClusters = 0;
12292
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
+ }
12293
12544
  function recordFilteredNoise(meta) {
12294
12545
  pendingNoiseMeta.push(meta);
12295
12546
  if (!currentBlock) {
@@ -12316,7 +12567,23 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12316
12567
  highestScannedOrdinal = Math.max(highestScannedOrdinal, lastOrdinal);
12317
12568
  lastMessageId = currentBlock.meta[currentBlock.meta.length - 1]?.messageId ?? "";
12318
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
+ }
12319
12585
  lines.push(blockText);
12586
+ sourceCharacters = lineStart + blockText.length;
12320
12587
  lineMeta.push(...currentBlock.meta);
12321
12588
  totalTokens += blockTokens;
12322
12589
  if (currentBlock.isToolOnly) {
@@ -12326,11 +12593,15 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12326
12593
  });
12327
12594
  }
12328
12595
  currentBlock = null;
12596
+ currentBlockApproxTokens = 0;
12329
12597
  return true;
12330
12598
  }
12331
12599
  for (const msg of messages) {
12332
12600
  if (eligibleEndOrdinal !== undefined && msg.ordinal >= eligibleEndOrdinal)
12333
12601
  break;
12602
+ if (admittedOversizeComponentEnd !== null && msg.ordinal > admittedOversizeComponentEnd) {
12603
+ break;
12604
+ }
12334
12605
  if (msg.ordinal < startOrdinal)
12335
12606
  continue;
12336
12607
  const meta = { ordinal: msg.ordinal, messageId: msg.id };
@@ -12344,6 +12615,10 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12344
12615
  if (currentBlock && currentBlock.role === "A") {
12345
12616
  currentBlock.endOrdinal = msg.ordinal;
12346
12617
  currentBlock.parts.push(tcText);
12618
+ currentBlock.partMeta.push({
12619
+ ordinal: msg.ordinal,
12620
+ toolResultBodyTokens: extractToolResultBodyTokens(msg.parts)
12621
+ });
12347
12622
  currentBlock.meta.push(...pendingNoiseMeta, meta);
12348
12623
  pendingNoiseMeta = [];
12349
12624
  } else {
@@ -12354,12 +12629,19 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12354
12629
  startOrdinal: pendingNoiseMeta[0]?.ordinal ?? msg.ordinal,
12355
12630
  endOrdinal: msg.ordinal,
12356
12631
  parts: [tcText],
12632
+ partMeta: [
12633
+ {
12634
+ ordinal: msg.ordinal,
12635
+ toolResultBodyTokens: extractToolResultBodyTokens(msg.parts)
12636
+ }
12637
+ ],
12357
12638
  meta: [...pendingNoiseMeta, meta],
12358
12639
  commitHashes: [],
12359
12640
  isToolOnly: true
12360
12641
  };
12361
12642
  pendingNoiseMeta = [];
12362
12643
  }
12644
+ pinComponentWhenFormattedBudgetCrosses(msg.ordinal, tcText);
12363
12645
  continue;
12364
12646
  }
12365
12647
  const role = compactRole(msg.role);
@@ -12376,11 +12658,16 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12376
12658
  if (currentBlock && currentBlock.role === role) {
12377
12659
  currentBlock.endOrdinal = msg.ordinal;
12378
12660
  currentBlock.parts.push(text);
12661
+ currentBlock.partMeta.push({
12662
+ ordinal: msg.ordinal,
12663
+ toolResultBodyTokens: extractToolResultBodyTokens(msg.parts)
12664
+ });
12379
12665
  currentBlock.meta.push(...pendingNoiseMeta, meta);
12380
12666
  currentBlock.commitHashes = mergeCommitHashes(currentBlock.commitHashes, compacted.commitHashes);
12381
12667
  if (msgHasNarrative)
12382
12668
  currentBlock.isToolOnly = false;
12383
12669
  pendingNoiseMeta = [];
12670
+ pinComponentWhenFormattedBudgetCrosses(msg.ordinal, text);
12384
12671
  continue;
12385
12672
  }
12386
12673
  if (!flushCurrentBlock())
@@ -12390,11 +12677,18 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12390
12677
  startOrdinal: pendingNoiseMeta[0]?.ordinal ?? msg.ordinal,
12391
12678
  endOrdinal: msg.ordinal,
12392
12679
  parts: [text],
12680
+ partMeta: [
12681
+ {
12682
+ ordinal: msg.ordinal,
12683
+ toolResultBodyTokens: extractToolResultBodyTokens(msg.parts)
12684
+ }
12685
+ ],
12393
12686
  meta: [...pendingNoiseMeta, meta],
12394
12687
  commitHashes: [...compacted.commitHashes],
12395
12688
  isToolOnly: !msgHasNarrative
12396
12689
  };
12397
12690
  pendingNoiseMeta = [];
12691
+ pinComponentWhenFormattedBudgetCrosses(msg.ordinal, text);
12398
12692
  }
12399
12693
  if (flushCurrentBlock() && pendingNoiseMeta.length > 0) {
12400
12694
  highestScannedOrdinal = Math.max(highestScannedOrdinal, pendingNoiseMeta[pendingNoiseMeta.length - 1]?.ordinal ?? highestScannedOrdinal);
@@ -12425,7 +12719,8 @@ function readSessionChunk(sessionId, tokenBudget, offset = 1, eligibleEndOrdinal
12425
12719
  ...messagesProcessed === 0 && text.length === 0 ? { filteredNoiseLines: pendingNoiseMeta } : {},
12426
12720
  commitClusterCount: commitClusters,
12427
12721
  toolOnlyRanges,
12428
- completedToolArcs
12722
+ completedToolArcs,
12723
+ toolResultBoundaries
12429
12724
  };
12430
12725
  }
12431
12726
  function readRawSessionSeedTail(sessionId, boundaryId, onQuery) {
@@ -12846,19 +13141,25 @@ function indexMessagesAfterOrdinal(db, sessionId, messages, _lastIndexedOrdinal,
12846
13141
  }
12847
13142
  return inserted;
12848
13143
  }
12849
- function getMessageHistoryOrphanSweepState(db) {
12850
- 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) ?? {};
12851
13152
  }
12852
- function persistMessageHistoryOrphanSweepState(db, cursor, lastSweptAt) {
13153
+ function persistMessageHistoryOrphanSweepState(db, cursor, lastSweptAt, harness) {
12853
13154
  db.prepare(`INSERT INTO message_history_orphan_sweep (harness, cursor_session_id, last_swept_at)
12854
- VALUES ('opencode', ?, ?)
13155
+ VALUES (?, ?, ?)
12855
13156
  ON CONFLICT(harness) DO UPDATE SET
12856
13157
  cursor_session_id = excluded.cursor_session_id,
12857
- last_swept_at = excluded.last_swept_at`).run(cursor, lastSweptAt);
13158
+ last_swept_at = excluded.last_swept_at`).run(harness, cursor, lastSweptAt);
12858
13159
  }
12859
- function getOpenCodeSessionScopedCandidateSourceSql() {
13160
+ function getOpenCodeSessionScopedCandidateSourceSql(harness) {
12860
13161
  return SESSION_SCOPED_TABLES.filter((definition) => definition.harnessScoped === true).map((definition) => {
12861
- const predicates = ["session_id IS NOT NULL", "harness = 'opencode'"];
13162
+ const predicates = ["session_id IS NOT NULL", `harness = '${harness}'`];
12862
13163
  if (definition.extraPredicate)
12863
13164
  predicates.push(definition.extraPredicate);
12864
13165
  return `SELECT session_id FROM ${definition.table} WHERE ${predicates.join(" AND ")}`;
@@ -12872,7 +13173,8 @@ function sweepOrphanedOpenCodeMessageIndexes(db, openReadableOpenCodeDb, options
12872
13173
  const safetyAgeMs = Math.max(0, options.safetyAgeMs ?? MESSAGE_HISTORY_ORPHAN_SAFETY_AGE_MS);
12873
13174
  const cooldownMs = Math.max(0, options.cooldownMs ?? MESSAGE_HISTORY_ORPHAN_SWEEP_COOLDOWN_MS);
12874
13175
  const unavailableReprobeMs = Math.max(cooldownMs, options.unavailableReprobeMs ?? MESSAGE_HISTORY_ORPHAN_UNAVAILABLE_REPROBE_MS);
12875
- const state = getMessageHistoryOrphanSweepState(db);
13176
+ const harness = openCodeSweepHarness();
13177
+ const state = getMessageHistoryOrphanSweepState(db, harness);
12876
13178
  const cursor = typeof state.cursor_session_id === "string" ? state.cursor_session_id : "";
12877
13179
  if (typeof state.last_swept_at === "number" && state.last_swept_at + cooldownMs > now) {
12878
13180
  return { status: "cooldown", scanned: 0, deleted: 0, cursor };
@@ -12884,12 +13186,12 @@ function sweepOrphanedOpenCodeMessageIndexes(db, openReadableOpenCodeDb, options
12884
13186
  openCodeDb = null;
12885
13187
  }
12886
13188
  if (!openCodeDb) {
12887
- persistMessageHistoryOrphanSweepState(db, cursor, now + unavailableReprobeMs - cooldownMs);
13189
+ persistMessageHistoryOrphanSweepState(db, cursor, now + unavailableReprobeMs - cooldownMs, harness);
12888
13190
  return { status: "source_unavailable", scanned: 0, deleted: 0, cursor };
12889
13191
  }
12890
13192
  try {
12891
13193
  const cutoff = now - safetyAgeMs;
12892
- const candidateSourceSql = getOpenCodeSessionScopedCandidateSourceSql();
13194
+ const candidateSourceSql = getOpenCodeSessionScopedCandidateSourceSql(harness);
12893
13195
  const candidates = db.prepare(`SELECT session_id
12894
13196
  FROM (${candidateSourceSql}) AS session_candidates
12895
13197
  WHERE session_id > ?
@@ -12897,7 +13199,7 @@ function sweepOrphanedOpenCodeMessageIndexes(db, openReadableOpenCodeDb, options
12897
13199
  SELECT 1
12898
13200
  FROM message_history_index
12899
13201
  WHERE message_history_index.session_id = session_candidates.session_id
12900
- AND message_history_index.harness = 'opencode'
13202
+ AND message_history_index.harness = '${harness}'
12901
13203
  AND message_history_index.updated_at > ?
12902
13204
  )
12903
13205
  ORDER BY session_id ASC
@@ -12918,13 +13220,13 @@ function sweepOrphanedOpenCodeMessageIndexes(db, openReadableOpenCodeDb, options
12918
13220
  SELECT 1
12919
13221
  FROM message_history_index
12920
13222
  WHERE message_history_index.session_id = session_candidates.session_id
12921
- AND message_history_index.harness = 'opencode'
13223
+ AND message_history_index.harness = '${harness}'
12922
13224
  AND message_history_index.updated_at > ?
12923
13225
  )
12924
13226
  LIMIT 1`);
12925
13227
  const eligibleSessionIds = missingSessionIds.filter((sessionId) => stillEligible.get(sessionId, cutoff));
12926
- deleted = deleteSessionScopedRows(db, eligibleSessionIds, "opencode");
12927
- persistMessageHistoryOrphanSweepState(db, nextCursor, completedAt);
13228
+ deleted = deleteSessionScopedRows(db, eligibleSessionIds, harness);
13229
+ persistMessageHistoryOrphanSweepState(db, nextCursor, completedAt, harness);
12928
13230
  db.exec("COMMIT");
12929
13231
  committed = true;
12930
13232
  logSlowWriteTransaction("message_index_orphan_sweep", transactionStartedAt);
@@ -18448,6 +18750,7 @@ var DEFAULT_EXECUTE_THRESHOLD_PERCENTAGE = 65;
18448
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.";
18449
18751
  var DEFAULT_HISTORIAN_TIMEOUT_MS = 600000;
18450
18752
  var DEFAULT_HISTORY_BUDGET_PERCENTAGE = 0.15;
18753
+ var PROTECTED_TOKENS_MIN = 4000;
18451
18754
  var DEFAULT_LOCAL_EMBEDDING_MODEL = "Xenova/all-MiniLM-L6-v2";
18452
18755
  var PiThinkingLevelSchema = _enum(["off", "minimal", "low", "medium", "high", "xhigh", "max"]).optional();
18453
18756
  var OmpThinkingLevelSchema = _enum(["off", "minimal", "low", "medium", "high", "xhigh", "max", "inherit", "auto"]).optional();
@@ -18817,8 +19120,8 @@ var MagicContextConfigSchema = object({
18817
19120
  smart_notes: object({
18818
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.")
18819
19122
  }).default({ retina_handoff: false }).describe("Smart-note ownership transition controls."),
18820
- 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).`),
18821
- 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."),
18822
19125
  output_reserve: union([
18823
19126
  number2().min(0),
18824
19127
  object({ default: number2().min(0) }).catchall(number2().min(0))
@@ -18834,7 +19137,7 @@ var MagicContextConfigSchema = object({
18834
19137
  execute_threshold_tokens: object({
18835
19138
  default: number2().min(5000).max(2000000).optional()
18836
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."),
18837
- 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)."),
18838
19141
  protected_tags: unknown().optional().describe("Deprecated: number of recent tags to protect. Ignored for behaviour; use protected_tokens instead.").meta({ deprecated: true }),
18839
19142
  clear_reasoning_age: number2().min(10).default(50).describe("Clear reasoning/thinking blocks older than N tags (default: 50)"),
18840
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)"),
@@ -22450,9 +22753,9 @@ function migrateMagicContextConfigLocations(directory, logger) {
22450
22753
  }
22451
22754
 
22452
22755
  // src/tools/light-descriptions.ts
22453
- 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.`;
22454
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.`;
22455
- 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.`;
22456
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.`;
22457
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.`;
22458
22761
 
@@ -22532,8 +22835,8 @@ function createPromptSurfaceRuntime(options) {
22532
22835
  return content;
22533
22836
  };
22534
22837
  return {
22535
- resolveRegistration(config) {
22536
- const { preset } = resolvePromptSurface(config, undefined);
22838
+ resolveRegistration(config, modelKey) {
22839
+ const { preset } = resolvePromptSurface(config, modelKey);
22537
22840
  const overrides = config?.tool_descriptions ?? {};
22538
22841
  for (const [toolId, description] of Object.entries(overrides)) {
22539
22842
  if (!PROMPT_SURFACE_TOOL_ID_SET.has(toolId)) {
@@ -27902,16 +28205,27 @@ function startLockHeartbeat(lockPath) {
27902
28205
  timer.unref?.();
27903
28206
  return () => clearInterval(timer);
27904
28207
  }
28208
+ var ONNX_RUNTIME_WEB_SPECIFIER = "onnxruntime-web";
27905
28209
  var localEmbeddingRuntimeMode = "native";
27906
28210
  var localEmbeddingProcessFailure = null;
27907
28211
  var wasmRuntimeInjected = false;
27908
28212
  var localEmbeddingHostForRuntime = currentLocalEmbeddingHost;
28213
+ var resolveWasmOrtForRuntime = () => {
28214
+ try {
28215
+ return typeof import.meta.resolve === "function" ? import.meta.resolve(ONNX_RUNTIME_WEB_SPECIFIER) : undefined;
28216
+ } catch {
28217
+ return;
28218
+ }
28219
+ };
28220
+ var importWasmOrtModule = async (specifier) => await import(specifier);
28221
+ var importWasmOrtModuleForRuntime = importWasmOrtModule;
27909
28222
  var importWasmOrtForRuntime = async () => {
27910
28223
  const { createRequire: createRequireFn } = await import("node:module");
27911
28224
  const requireFn = createRequireFn(import.meta.url);
27912
- const ortEntry = requireFn.resolve("onnxruntime-web");
28225
+ const ortEntry = requireFn.resolve(ONNX_RUNTIME_WEB_SPECIFIER);
28226
+ const ortSpecifier = resolveWasmOrtForRuntime() ?? ONNX_RUNTIME_WEB_SPECIFIER;
27913
28227
  return {
27914
- module: await import("onnxruntime-web"),
28228
+ module: await importWasmOrtModuleForRuntime(ortSpecifier),
27915
28229
  entryPath: ortEntry
27916
28230
  };
27917
28231
  };
@@ -27977,6 +28291,7 @@ async function injectWasmOrt() {
27977
28291
  try {
27978
28292
  const { module: ortWeb, entryPath } = await importWasmOrtForRuntime();
27979
28293
  if (ortWeb.env?.wasm) {
28294
+ ortWeb.env.wasm.numThreads = 1;
27980
28295
  ortWeb.env.wasm.wasmPaths = `${pathToFileURL2(dirname5(entryPath)).href}/`;
27981
28296
  }
27982
28297
  globalThis[Symbol.for("onnxruntime")] = ortWeb;
@@ -30098,6 +30413,26 @@ function registerProjectInObservationMode(db, projectIdentity, sourceDirectory,
30098
30413
  disposeProvider(prior?.provider ?? null);
30099
30414
  return snapshotFor(registration);
30100
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
+ }
30101
30436
  function getProjectEmbeddingSnapshot(projectIdentity) {
30102
30437
  const registration = projectRegistrations.get(projectIdentity);
30103
30438
  return registration ? snapshotFor(registration) : null;
@@ -31351,6 +31686,12 @@ function getWritableOpenCodeDb() {
31351
31686
  throw new Error(`OpenCode database not found at ${dbPath} (source=${resolution.source}; is OpenCode installed?)`);
31352
31687
  }
31353
31688
  const db = new Database(dbPath);
31689
+ try {
31690
+ assertOpenCodeStoreGeneration(db, "v1", dbPath);
31691
+ } catch (error) {
31692
+ closeQuietly(db);
31693
+ throw error;
31694
+ }
31354
31695
  db.exec("PRAGMA busy_timeout=5000");
31355
31696
  db.exec("PRAGMA journal_mode=WAL");
31356
31697
  cachedWriteDb = { path: dbPath, db };
@@ -36944,17 +37285,65 @@ function persistFilteredNoise(db, sessionId, chunk, eligibleEnd) {
36944
37285
  }
36945
37286
 
36946
37287
  // src/hooks/magic-context/producer-window-guard.ts
36947
- 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
+ }
36948
37297
  function producerWindowFailureReason(input) {
36949
37298
  const { producerSourceTokens, contextLimitTokens, maxOutputTokens } = input;
36950
- 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) {
36951
37301
  return null;
36952
37302
  }
36953
37303
  const usableInputTokens = Math.max(0, Math.floor(contextLimitTokens - maxOutputTokens));
36954
- const refusalThreshold = usableInputTokens * (1 + PRODUCER_WINDOW_REFUSAL_MARGIN);
36955
- if (producerSourceTokens < refusalThreshold)
37304
+ if (producerSourceTokens <= producerInputLimitTokens)
36956
37305
  return null;
36957
- 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
+ };
36958
37347
  }
36959
37348
 
36960
37349
  // src/hooks/magic-context/protected-tail-boundary.ts
@@ -39474,6 +39863,25 @@ function shouldSuppressHistorianAlert(sessionId) {
39474
39863
  lastHistorianAlertBySession.set(sessionId, Date.now());
39475
39864
  return false;
39476
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
+ }
39477
39885
  async function runCompartmentAgent(deps) {
39478
39886
  const {
39479
39887
  client,
@@ -39677,11 +40085,20 @@ async function runCompartmentAgent(deps) {
39677
40085
  rollbackDrainReservation();
39678
40086
  return;
39679
40087
  }
39680
- 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);
39681
40095
  const producerSourceTokens = estimateTokens(chunkText);
39682
40096
  if (boundarySnapshot.oversizeAtomicUnit || chunk.oversizeAtomicUnit) {
39683
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)}`);
39684
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
+ }
39685
40102
  const producerWindowFailure = producerWindowFailureReason({
39686
40103
  producerSourceTokens,
39687
40104
  contextLimitTokens: deps.historianContextLimit,
@@ -39812,6 +40229,16 @@ ${chunkText}`,
39812
40229
  return;
39813
40230
  }
39814
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
+ }
39815
40242
  let published = false;
39816
40243
  const transactionStartedAt = performance.now();
39817
40244
  db.exec("BEGIN IMMEDIATE");
@@ -41515,4 +41942,4 @@ async function runUpgradeMemoryMigration(ctx, sessionId, migrationDirectory) {
41515
41942
  }
41516
41943
  }
41517
41944
 
41518
- 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 };