@cortexkit/opencode-magic-context 0.38.1 → 0.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/README.md +37 -4
  2. package/dist/config/index.d.ts.map +1 -1
  3. package/dist/config/project-security.d.ts +11 -6
  4. package/dist/config/project-security.d.ts.map +1 -1
  5. package/dist/config/raw-loader.d.ts +42 -0
  6. package/dist/config/raw-loader.d.ts.map +1 -0
  7. package/dist/config/schema/magic-context.d.ts +585 -550
  8. package/dist/config/schema/magic-context.d.ts.map +1 -1
  9. package/dist/features/magic-context/dreamer/classify.d.ts +3 -2
  10. package/dist/features/magic-context/dreamer/classify.d.ts.map +1 -1
  11. package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts +9 -2
  12. package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts.map +1 -1
  13. package/dist/features/magic-context/dreamer/map-memories-prompt.d.ts +4 -2
  14. package/dist/features/magic-context/dreamer/map-memories-prompt.d.ts.map +1 -1
  15. package/dist/features/magic-context/dreamer/map-memories.d.ts +21 -5
  16. package/dist/features/magic-context/dreamer/map-memories.d.ts.map +1 -1
  17. package/dist/features/magic-context/dreamer/refresh-primers.d.ts +3 -2
  18. package/dist/features/magic-context/dreamer/refresh-primers.d.ts.map +1 -1
  19. package/dist/features/magic-context/dreamer/task-config.d.ts +2 -1
  20. package/dist/features/magic-context/dreamer/task-config.d.ts.map +1 -1
  21. package/dist/features/magic-context/dreamer/task-executor.d.ts +0 -1
  22. package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
  23. package/dist/features/magic-context/dreamer/task-scheduler.d.ts +3 -2
  24. package/dist/features/magic-context/dreamer/task-scheduler.d.ts.map +1 -1
  25. package/dist/features/magic-context/dreamer/verify-prompt.d.ts +5 -2
  26. package/dist/features/magic-context/dreamer/verify-prompt.d.ts.map +1 -1
  27. package/dist/features/magic-context/dreamer/verify.d.ts +6 -3
  28. package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
  29. package/dist/features/magic-context/migrations.d.ts.map +1 -1
  30. package/dist/features/magic-context/mural/compress-cues.d.ts +3 -2
  31. package/dist/features/magic-context/mural/compress-cues.d.ts.map +1 -1
  32. package/dist/features/magic-context/smart-notes/compiler.d.ts +3 -2
  33. package/dist/features/magic-context/smart-notes/compiler.d.ts.map +1 -1
  34. package/dist/features/magic-context/smart-notes/condition-compiler.d.ts +2 -0
  35. package/dist/features/magic-context/smart-notes/condition-compiler.d.ts.map +1 -1
  36. package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts.map +1 -1
  37. package/dist/features/magic-context/storage-db.d.ts +1 -1
  38. package/dist/features/magic-context/storage-db.d.ts.map +1 -1
  39. package/dist/features/magic-context/storage-meta-persisted.d.ts +7 -2
  40. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  41. package/dist/features/magic-context/storage-meta-shared.d.ts +1 -0
  42. package/dist/features/magic-context/storage-meta-shared.d.ts.map +1 -1
  43. package/dist/features/magic-context/storage-meta.d.ts +1 -1
  44. package/dist/features/magic-context/storage-meta.d.ts.map +1 -1
  45. package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
  46. package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
  47. package/dist/features/magic-context/storage.d.ts +1 -1
  48. package/dist/features/magic-context/storage.d.ts.map +1 -1
  49. package/dist/features/magic-context/tool-definition-tokens.d.ts +10 -0
  50. package/dist/features/magic-context/tool-definition-tokens.d.ts.map +1 -1
  51. package/dist/features/magic-context/transform-decision-log.d.ts +11 -0
  52. package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
  53. package/dist/features/magic-context/user-memory/review-user-memories.d.ts +3 -2
  54. package/dist/features/magic-context/user-memory/review-user-memories.d.ts.map +1 -1
  55. package/dist/hooks/magic-context/channel2-delivery.d.ts +3 -1
  56. package/dist/hooks/magic-context/channel2-delivery.d.ts.map +1 -1
  57. package/dist/hooks/magic-context/command-handler.d.ts +4 -0
  58. package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
  59. package/dist/hooks/magic-context/compartment-runner-historian.d.ts +4 -1
  60. package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -1
  61. package/dist/hooks/magic-context/compartment-runner-partial-recomp.d.ts.map +1 -1
  62. package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -1
  63. package/dist/hooks/magic-context/compartment-runner-types.d.ts +4 -1
  64. package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -1
  65. package/dist/hooks/magic-context/ctx-reduce-nudge.d.ts +14 -2
  66. package/dist/hooks/magic-context/ctx-reduce-nudge.d.ts.map +1 -1
  67. package/dist/hooks/magic-context/emergency-fail-closed.d.ts +7 -0
  68. package/dist/hooks/magic-context/emergency-fail-closed.d.ts.map +1 -1
  69. package/dist/hooks/magic-context/hook-handlers.d.ts.map +1 -1
  70. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  71. package/dist/hooks/magic-context/inject-compartments.d.ts +12 -1
  72. package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
  73. package/dist/hooks/magic-context/lkg-persist.d.ts +14 -0
  74. package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -0
  75. package/dist/hooks/magic-context/lkg-slot.d.ts +13 -0
  76. package/dist/hooks/magic-context/lkg-slot.d.ts.map +1 -1
  77. package/dist/hooks/magic-context/module-state-sync.d.ts +1 -0
  78. package/dist/hooks/magic-context/module-state-sync.d.ts.map +1 -1
  79. package/dist/hooks/magic-context/module-transport.d.ts +12 -0
  80. package/dist/hooks/magic-context/module-transport.d.ts.map +1 -1
  81. package/dist/hooks/magic-context/raw-fallback-context-limit.d.ts.map +1 -1
  82. package/dist/hooks/magic-context/recomp-orchestrator.d.ts +4 -1
  83. package/dist/hooks/magic-context/recomp-orchestrator.d.ts.map +1 -1
  84. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  85. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts +12 -0
  86. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
  87. package/dist/hooks/magic-context/transform-compartment-phase.d.ts +3 -1
  88. package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
  89. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +4 -0
  90. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  91. package/dist/hooks/magic-context/transform.d.ts +9 -1
  92. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  93. package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
  94. package/dist/{index-2y0ybv5x.js → index-3dkzzh0t.js} +15 -17
  95. package/dist/index-ehpzdy0v.js +126 -0
  96. package/dist/{index-5znjkjws.js → index-k2ts0wk1.js} +486 -106
  97. package/dist/{index-22mw8km4.js → index-rw0qrkvq.js} +4 -2
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +17186 -14853
  100. package/dist/model-resolution-r9jbcz86.js +15 -0
  101. package/dist/plugin/dream-timer.d.ts +3 -0
  102. package/dist/plugin/dream-timer.d.ts.map +1 -1
  103. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  104. package/dist/plugin/messages-transform.d.ts +14 -6
  105. package/dist/plugin/messages-transform.d.ts.map +1 -1
  106. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  107. package/dist/{recomp-orchestrator-p030kxtc.js → recomp-orchestrator-2pncxee7.js} +2 -3
  108. package/dist/shared/jsonc-edit.d.ts +6 -1
  109. package/dist/shared/jsonc-edit.d.ts.map +1 -1
  110. package/dist/shared/model-resolution.d.ts +53 -0
  111. package/dist/shared/model-resolution.d.ts.map +1 -0
  112. package/dist/shared/model-suggestion-retry.d.ts +4 -1
  113. package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
  114. package/dist/shared/resolve-fallbacks.d.ts +5 -1
  115. package/dist/shared/resolve-fallbacks.d.ts.map +1 -1
  116. package/dist/shared/status-detail-text.d.ts +4 -0
  117. package/dist/shared/status-detail-text.d.ts.map +1 -0
  118. package/dist/shared/subagent-runner.d.ts +2 -1
  119. package/dist/shared/subagent-runner.d.ts.map +1 -1
  120. package/dist/{storage-meta-session-2306t3j7.js → storage-meta-session-yvtbaw7c.js} +1 -1
  121. package/dist/{task-config-at3adc59.js → task-config-a1qmj9bx.js} +2 -2
  122. package/package.json +4 -2
  123. package/src/config/index.test.ts +73 -17
  124. package/src/config/index.ts +38 -23
  125. package/src/config/project-security.hostile-matrix.test.ts +471 -0
  126. package/src/config/project-security.test.ts +26 -5
  127. package/src/config/project-security.ts +141 -22
  128. package/src/config/raw-loader.test.ts +424 -0
  129. package/src/config/raw-loader.ts +490 -0
  130. package/src/config/schema/magic-context.test.ts +144 -2
  131. package/src/config/schema/magic-context.ts +253 -49
  132. package/src/shared/jsonc-edit.ts +74 -1
  133. package/src/shared/model-resolution.test.ts +170 -0
  134. package/src/shared/model-resolution.ts +227 -0
  135. package/src/shared/model-suggestion-retry.test.ts +27 -0
  136. package/src/shared/model-suggestion-retry.ts +19 -10
  137. package/src/shared/resolve-fallbacks.test.ts +13 -1
  138. package/src/shared/resolve-fallbacks.ts +19 -4
  139. package/src/shared/status-detail-text.test.ts +80 -0
  140. package/src/shared/status-detail-text.ts +56 -0
  141. package/src/shared/subagent-runner.ts +3 -1
  142. package/dist/index-td9depx5.js +0 -46
  143. package/dist/resolve-fallbacks-qf0ekmz9.js +0 -11
@@ -3,9 +3,6 @@ import {
3
3
  modelSupportsVision,
4
4
  shouldEnforcePrivateStoragePermissions
5
5
  } from "./index-mg1yx1ph.js";
6
- import {
7
- parseProviderModel
8
- } from "./index-td9depx5.js";
9
6
  import {
10
7
  describeError,
11
8
  getErrorMessage,
@@ -17,7 +14,7 @@ import {
17
14
  ensureSessionMetaRow,
18
15
  persistCachedM0,
19
16
  updateSessionMeta
20
- } from "./index-22mw8km4.js";
17
+ } from "./index-rw0qrkvq.js";
21
18
  import {
22
19
  modelRefLookupOrder,
23
20
  piModelRefToCanonical
@@ -5161,6 +5158,37 @@ var MIGRATIONS = [
5161
5158
  ensureColumn(db, "transform_decisions", "m0_model_key_prev", "TEXT");
5162
5159
  ensureColumn(db, "transform_decisions", "m0_model_key_new", "TEXT");
5163
5160
  }
5161
+ },
5162
+ {
5163
+ version: 80,
5164
+ description: "record observed m[0] tool-set hash comparisons",
5165
+ up(db) {
5166
+ if (!tableExists2(db, "transform_decisions"))
5167
+ return;
5168
+ ensureColumn(db, "transform_decisions", "m0_tool_set_hash_prev", "TEXT");
5169
+ ensureColumn(db, "transform_decisions", "m0_tool_set_hash_new", "TEXT");
5170
+ }
5171
+ },
5172
+ {
5173
+ version: 81,
5174
+ description: "persist last-known-good transform snapshots across restarts",
5175
+ up(db) {
5176
+ db.exec(`
5177
+ CREATE TABLE IF NOT EXISTS lkg_slots (
5178
+ session_id TEXT PRIMARY KEY,
5179
+ json_prefix TEXT NOT NULL,
5180
+ input_id_seq TEXT NOT NULL,
5181
+ input_content_digests TEXT NOT NULL,
5182
+ input_content_signatures TEXT,
5183
+ last_input_message_id TEXT NOT NULL,
5184
+ model_key TEXT,
5185
+ provider_key TEXT,
5186
+ captured_at INTEGER NOT NULL,
5187
+ row_version INTEGER,
5188
+ capture_sequence INTEGER
5189
+ );
5190
+ `);
5191
+ }
5164
5192
  }
5165
5193
  ];
5166
5194
  var LATEST_MIGRATION_VERSION = MIGRATIONS.reduce((max, m) => Math.max(max, m.version), 0);
@@ -5616,6 +5644,14 @@ function keyFor(providerID, modelID, agentName) {
5616
5644
  function fingerprintFor(description, parameters) {
5617
5645
  return createHash5("sha256").update(description).update("\x00").update(stableStringify(parameters)).digest("hex");
5618
5646
  }
5647
+ function getCurrentToolSetHash(providerID, modelID, agentName) {
5648
+ if (!providerID || !modelID)
5649
+ return "";
5650
+ const toolIds = measurements.get(keyFor(providerID, modelID, agentName));
5651
+ if (!toolIds || toolIds.size === 0)
5652
+ return "";
5653
+ return createHash5("sha256").update(Array.from(toolIds.keys()).sort().join("\x00")).digest("hex");
5654
+ }
5619
5655
  function setDatabase(db) {
5620
5656
  persistenceDb = db;
5621
5657
  cachedInsertStmt = null;
@@ -5957,7 +5993,7 @@ function getSchemaFenceRejection() {
5957
5993
  function getMigrationOnOpenRefusal() {
5958
5994
  return lastMigrationOnOpenRefusal;
5959
5995
  }
5960
- var LATEST_SUPPORTED_VERSION = 79;
5996
+ var LATEST_SUPPORTED_VERSION = 81;
5961
5997
  var PERMISSIONS_ENFORCEABLE = process.platform !== "win32";
5962
5998
  var defaultStoragePermissionFs = { chmodSync, mkdirSync };
5963
5999
  var storagePermissionFs = defaultStoragePermissionFs;
@@ -7109,10 +7145,12 @@ CREATE INDEX IF NOT EXISTS idx_dream_queue_pending ON dream_queue(started_at, en
7109
7145
  decision TEXT NOT NULL,
7110
7146
  materialized INTEGER NOT NULL DEFAULT 0,
7111
7147
  materialize_reason TEXT,
7112
- system_hash_prev TEXT,
7113
- system_hash_new TEXT,
7114
- m0_model_key_prev TEXT,
7115
- m0_model_key_new TEXT,
7148
+ system_hash_prev TEXT,
7149
+ system_hash_new TEXT,
7150
+ m0_tool_set_hash_prev TEXT,
7151
+ m0_tool_set_hash_new TEXT,
7152
+ m0_model_key_prev TEXT,
7153
+ m0_model_key_new TEXT,
7116
7154
  emergency INTEGER NOT NULL DEFAULT 0,
7117
7155
  dropped_tokens INTEGER NOT NULL DEFAULT 0,
7118
7156
  dropped_count INTEGER NOT NULL DEFAULT 0,
@@ -7450,10 +7488,12 @@ CREATE INDEX IF NOT EXISTS idx_dream_queue_pending ON dream_queue(started_at, en
7450
7488
  decision TEXT NOT NULL,
7451
7489
  materialized INTEGER NOT NULL DEFAULT 0,
7452
7490
  materialize_reason TEXT,
7453
- system_hash_prev TEXT,
7454
- system_hash_new TEXT,
7455
- m0_model_key_prev TEXT,
7456
- m0_model_key_new TEXT,
7491
+ system_hash_prev TEXT,
7492
+ system_hash_new TEXT,
7493
+ m0_tool_set_hash_prev TEXT,
7494
+ m0_tool_set_hash_new TEXT,
7495
+ m0_model_key_prev TEXT,
7496
+ m0_model_key_new TEXT,
7457
7497
  emergency INTEGER NOT NULL DEFAULT 0,
7458
7498
  dropped_tokens INTEGER NOT NULL DEFAULT 0,
7459
7499
  dropped_count INTEGER NOT NULL DEFAULT 0,
@@ -10680,6 +10720,7 @@ function clearEmergencyDropSample(db, sessionId) {
10680
10720
  db.prepare("UPDATE session_meta SET last_emergency_input_sample = 0 WHERE session_id = ?").run(sessionId);
10681
10721
  })();
10682
10722
  }
10723
+ var EMPTY_CHANNEL1_NUDGE_STATE = { level: "", ordinal: 0 };
10683
10724
  function isLastNudgeUndroppedRow(row) {
10684
10725
  return typeof row === "object" && row !== null && typeof row.last_nudge_undropped === "number";
10685
10726
  }
@@ -10689,6 +10730,24 @@ function isLastNudgeLevelRow(row) {
10689
10730
  function normalizeLastNudgeLevel(value) {
10690
10731
  return value === "gentle" || value === "firm" || value === "urgent" ? value : "";
10691
10732
  }
10733
+ function parseChannel1NudgeState(raw) {
10734
+ try {
10735
+ const parsed = JSON.parse(raw);
10736
+ if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
10737
+ return {
10738
+ level: normalizeLastNudgeLevel(parsed.level),
10739
+ ordinal: typeof parsed.ordinal === "number" ? Math.max(0, Math.round(parsed.ordinal)) : 0
10740
+ };
10741
+ }
10742
+ } catch {}
10743
+ return { level: normalizeLastNudgeLevel(raw), ordinal: 0 };
10744
+ }
10745
+ function serializeChannel1NudgeState(value) {
10746
+ return JSON.stringify({
10747
+ level: normalizeLastNudgeLevel(value.level),
10748
+ ordinal: Math.max(0, Math.round(value.ordinal))
10749
+ });
10750
+ }
10692
10751
  function getLastNudgeUndropped(db, sessionId) {
10693
10752
  const result = db.prepare("SELECT last_nudge_undropped FROM session_meta WHERE session_id = ?").get(sessionId);
10694
10753
  return isLastNudgeUndroppedRow(result) ? result.last_nudge_undropped : 0;
@@ -10699,27 +10758,27 @@ function setLastNudgeUndropped(db, sessionId, value) {
10699
10758
  db.prepare("UPDATE session_meta SET last_nudge_undropped = ? WHERE session_id = ?").run(Math.max(0, Math.round(value)), sessionId);
10700
10759
  })();
10701
10760
  }
10702
- function getLastNudgeLevel(db, sessionId) {
10761
+ function getChannel1NudgeState(db, sessionId) {
10703
10762
  const result = db.prepare("SELECT last_nudge_level FROM session_meta WHERE session_id = ?").get(sessionId);
10704
- return isLastNudgeLevelRow(result) ? normalizeLastNudgeLevel(result.last_nudge_level) : "";
10763
+ return isLastNudgeLevelRow(result) ? parseChannel1NudgeState(result.last_nudge_level) : EMPTY_CHANNEL1_NUDGE_STATE;
10705
10764
  }
10706
- function setLastNudgeLevel(db, sessionId, value) {
10765
+ function setChannel1NudgeState(db, sessionId, value) {
10707
10766
  db.transaction(() => {
10708
10767
  ensureSessionMetaRow(db, sessionId);
10709
- db.prepare("UPDATE session_meta SET last_nudge_level = ? WHERE session_id = ?").run(normalizeLastNudgeLevel(value), sessionId);
10768
+ db.prepare("UPDATE session_meta SET last_nudge_level = ? WHERE session_id = ?").run(serializeChannel1NudgeState(value), sessionId);
10710
10769
  })();
10711
10770
  }
10712
10771
  function resetLastNudgeCycle(db, sessionId) {
10713
10772
  db.transaction(() => {
10714
10773
  ensureSessionMetaRow(db, sessionId);
10715
- db.prepare("UPDATE session_meta SET last_nudge_undropped = 0, last_nudge_level = '' WHERE session_id = ?").run(sessionId);
10774
+ db.prepare("UPDATE session_meta SET last_nudge_undropped = 0, last_nudge_level = ? WHERE session_id = ?").run(serializeChannel1NudgeState(EMPTY_CHANNEL1_NUDGE_STATE), sessionId);
10716
10775
  })();
10717
10776
  }
10718
10777
  function resetLastNudgeCycleIfTailShrank(db, sessionId, measuredUndropped) {
10719
10778
  let changed = false;
10720
10779
  db.transaction(() => {
10721
10780
  ensureSessionMetaRow(db, sessionId);
10722
- const result = db.prepare("UPDATE session_meta SET last_nudge_undropped = 0, last_nudge_level = '' WHERE session_id = ? AND last_nudge_undropped > ?").run(sessionId, Math.max(0, Math.round(measuredUndropped)));
10781
+ const result = db.prepare("UPDATE session_meta SET last_nudge_undropped = 0, last_nudge_level = ? WHERE session_id = ? AND last_nudge_undropped > ?").run(serializeChannel1NudgeState(EMPTY_CHANNEL1_NUDGE_STATE), sessionId, Math.max(0, Math.round(measuredUndropped)));
10723
10782
  changed = (result.changes ?? 0) > 0;
10724
10783
  })();
10725
10784
  return changed;
@@ -12417,12 +12476,27 @@ function collectToolPartIdentities(messages) {
12417
12476
  }
12418
12477
  return identities;
12419
12478
  }
12479
+ function isMachineGeneratedUserPart(part) {
12480
+ if (!isRecord(part))
12481
+ return false;
12482
+ const metadata = isRecord(part.metadata) ? part.metadata : null;
12483
+ const marker = metadata && isRecord(metadata.marker) ? metadata.marker : null;
12484
+ return part.synthetic === true || part.ignored === true || marker?.kind != null || isSyntheticTodoPart(part);
12485
+ }
12420
12486
  function isSyntheticMessage(message) {
12421
- const structuralHead = message.info.id === undefined && message.info.role === "user" && message.parts.length > 0 && message.parts.every((part) => isRecord(part) && part.synthetic === true);
12422
- return structuralHead || message.info.summary === true || message.info.id === TODO_HEAD_ANCHOR_ID;
12487
+ const syntheticUserRow = message.info.role === "user" && message.parts.length > 0 && message.parts.every(isMachineGeneratedUserPart);
12488
+ return syntheticUserRow || message.info.summary === true || message.info.id === TODO_HEAD_ANCHOR_ID;
12489
+ }
12490
+ function countRealUserMessages(messages) {
12491
+ let count = 0;
12492
+ for (const message of messages) {
12493
+ if (message.info.role === "user" && !isSyntheticMessage(message))
12494
+ count += 1;
12495
+ }
12496
+ return count;
12423
12497
  }
12424
12498
  function isSyntheticPart(part) {
12425
- return isRecord(part) && part.synthetic === true || isSyntheticTodoPart(part);
12499
+ return isMachineGeneratedUserPart(part);
12426
12500
  }
12427
12501
  function stripChannel1ReminderSpans(output) {
12428
12502
  let stripped = output;
@@ -12583,7 +12657,8 @@ function snapshot(args) {
12583
12657
  const memo = memoizedContent(args.kind, args.content);
12584
12658
  const tag = args.tag;
12585
12659
  const isProtected = tag ? args.protectedNumbers.has(tag.tagNumber) : false;
12586
- const uTokens = tag?.status === "active" && !isProtected && args.kind !== "excluded" ? args.tokens : 0;
12660
+ const queuedForDrop = tag ? args.pendingDropTagNumbers.has(tag.tagNumber) : false;
12661
+ const uTokens = tag?.status === "active" && !isProtected && !queuedForDrop && args.kind !== "excluded" ? args.tokens : 0;
12587
12662
  return {
12588
12663
  key: args.key,
12589
12664
  contentHash: memo.hash,
@@ -12592,7 +12667,8 @@ function snapshot(args) {
12592
12667
  uTokens,
12593
12668
  tagNumber: tag?.tagNumber ?? null,
12594
12669
  tagStatus: tag?.status ?? null,
12595
- protected: isProtected
12670
+ protected: isProtected,
12671
+ queuedForDrop
12596
12672
  };
12597
12673
  }
12598
12674
  function excludedSnapshot(key, part) {
@@ -12603,7 +12679,8 @@ function excludedSnapshot(key, part) {
12603
12679
  content,
12604
12680
  tokens: 0,
12605
12681
  tag: undefined,
12606
- protectedNumbers: new Set
12682
+ protectedNumbers: new Set,
12683
+ pendingDropTagNumbers: new Set
12607
12684
  });
12608
12685
  }
12609
12686
  function fileContentAndTokens(part) {
@@ -12639,6 +12716,7 @@ function sameTailHygieneStructuralSignature(expected, actual) {
12639
12716
  return expected.partCounts.every((count, index) => count === actual.partCounts[index]);
12640
12717
  }
12641
12718
  function measureTailHygiene(input) {
12719
+ const pendingDropTagNumbers = input.pendingDropTagNumbers ?? new Set;
12642
12720
  const toolIdentities = collectToolPartIdentities(input.messages);
12643
12721
  const attribution = buildTagAttribution({
12644
12722
  messages: input.messages,
@@ -12688,7 +12766,8 @@ function measureTailHygiene(input) {
12688
12766
  content,
12689
12767
  tokens: memo.tokens,
12690
12768
  tag,
12691
- protectedNumbers: attribution.protectedNumbers
12769
+ protectedNumbers: attribution.protectedNumbers,
12770
+ pendingDropTagNumbers
12692
12771
  });
12693
12772
  parts.push(measured);
12694
12773
  t += measured.tokens;
@@ -12708,7 +12787,8 @@ function measureTailHygiene(input) {
12708
12787
  content: file.content,
12709
12788
  tokens: file.tokens,
12710
12789
  tag,
12711
- protectedNumbers: attribution.protectedNumbers
12790
+ protectedNumbers: attribution.protectedNumbers,
12791
+ pendingDropTagNumbers
12712
12792
  });
12713
12793
  parts.push(measured);
12714
12794
  t += measured.tokens;
@@ -12732,7 +12812,8 @@ function measureTailHygiene(input) {
12732
12812
  content: inputText,
12733
12813
  tokens: memo.tokens,
12734
12814
  tag,
12735
- protectedNumbers: attribution.protectedNumbers
12815
+ protectedNumbers: attribution.protectedNumbers,
12816
+ pendingDropTagNumbers
12736
12817
  });
12737
12818
  parts.push(measured);
12738
12819
  t += measured.tokens;
@@ -12751,7 +12832,8 @@ function measureTailHygiene(input) {
12751
12832
  content: output,
12752
12833
  tokens: memo.tokens,
12753
12834
  tag,
12754
- protectedNumbers: attribution.protectedNumbers
12835
+ protectedNumbers: attribution.protectedNumbers,
12836
+ pendingDropTagNumbers
12755
12837
  });
12756
12838
  parts.push(measured);
12757
12839
  t += measured.tokens;
@@ -12774,26 +12856,35 @@ function measureTailHygiene(input) {
12774
12856
  };
12775
12857
  }
12776
12858
  function sameMeasuredPrefix(baseline, current) {
12777
- if (current.length < baseline.length)
12778
- return { valid: false, boundaryAdvanceU: 0 };
12859
+ if (current.length < baseline.length) {
12860
+ return { valid: false, boundaryAdvanceU: 0, queuedDropDeltaU: 0 };
12861
+ }
12779
12862
  let boundaryAdvanceU = 0;
12863
+ let queuedDropDeltaU = 0;
12780
12864
  for (let index = 0;index < baseline.length; index += 1) {
12781
12865
  const before = baseline[index];
12782
12866
  const after = current[index];
12783
12867
  if (before.key !== after.key || before.contentHash !== after.contentHash || before.kind !== after.kind || before.tokens !== after.tokens || before.tagNumber !== after.tagNumber || before.tagStatus !== after.tagStatus) {
12784
- return { valid: false, boundaryAdvanceU: 0 };
12868
+ return { valid: false, boundaryAdvanceU: 0, queuedDropDeltaU: 0 };
12869
+ }
12870
+ if (!before.protected && after.protected) {
12871
+ return { valid: false, boundaryAdvanceU: 0, queuedDropDeltaU: 0 };
12785
12872
  }
12786
- if (!before.protected && after.protected)
12787
- return { valid: false, boundaryAdvanceU: 0 };
12788
12873
  if (before.protected && !after.protected) {
12789
- if (after.tagStatus !== "active")
12790
- return { valid: false, boundaryAdvanceU: 0 };
12791
- boundaryAdvanceU += after.tokens;
12874
+ if (after.tagStatus !== "active") {
12875
+ return { valid: false, boundaryAdvanceU: 0, queuedDropDeltaU: 0 };
12876
+ }
12877
+ boundaryAdvanceU += after.uTokens;
12878
+ } else if (before.queuedForDrop !== after.queuedForDrop) {
12879
+ if (before.tagStatus !== "active" || after.tagStatus !== "active") {
12880
+ return { valid: false, boundaryAdvanceU: 0, queuedDropDeltaU: 0 };
12881
+ }
12882
+ queuedDropDeltaU += after.uTokens - before.uTokens;
12792
12883
  } else if (before.uTokens !== after.uTokens) {
12793
- return { valid: false, boundaryAdvanceU: 0 };
12884
+ return { valid: false, boundaryAdvanceU: 0, queuedDropDeltaU: 0 };
12794
12885
  }
12795
12886
  }
12796
- return { valid: true, boundaryAdvanceU };
12887
+ return { valid: true, boundaryAdvanceU, queuedDropDeltaU };
12797
12888
  }
12798
12889
  function refreshTailHygieneBaseline(input) {
12799
12890
  const measured = measureTailHygiene(input);
@@ -12825,7 +12916,7 @@ function refreshTailHygieneBaseline(input) {
12825
12916
  };
12826
12917
  }
12827
12918
  let turnDeltaT = 0;
12828
- let turnDeltaU = prefix.boundaryAdvanceU;
12919
+ let turnDeltaU = prefix.boundaryAdvanceU + prefix.queuedDropDeltaU;
12829
12920
  for (let index = input.previous.baselineParts.length;index < measured.parts.length; index += 1) {
12830
12921
  const part = measured.parts[index];
12831
12922
  turnDeltaT += part.tokens;
@@ -12951,26 +13042,44 @@ function formatOldestReclaimableHint(hint) {
12951
13042
  return rendered.length > 0 ? `
12952
13043
  oldest reclaimable: ${rendered}.` : "";
12953
13044
  }
12954
- function buildChannel2Reminder(undroppedTokens, hint) {
13045
+ function buildChannel2Reminder(undroppedTokens, usableWindowTokens, hint) {
12955
13046
  const amount = approxThousands(undroppedTokens);
13047
+ const usableWindow = approxThousands(usableWindowTokens);
12956
13048
  const hintText = formatOldestReclaimableHint(hint);
12957
13049
  return `<system-reminder>
12958
- ` + `Routine context housekeeping is near: a large span of this session will be comparted soon, ` + `and ~${amount} tokens of tool output remain unreduced. Drop spent outputs with ctx_reduce ` + `first so the archived span is the part that matters.${hintText}
13050
+ ` + `Routine housekeeping: an older span of this session folds into compact history automatically — nothing is lost and nothing pauses. ` + `Drop spent tool outputs with ctx_reduce first so the archive keeps only what matters (~${amount} of ~${usableWindow} reclaimable).${hintText}
12959
13051
  ` + `</system-reminder>`;
12960
13052
  }
12961
- function buildChannel1Reminder(level, undroppedTokens, hint) {
12962
- const amount = approxThousands(undroppedTokens);
13053
+ var CHANNEL1_STICKY_REAL_USER_TURN_GAP = 3;
13054
+ function shouldUseStickyChannel1Reminder(input) {
13055
+ if (input.lastLevel !== input.level)
13056
+ return false;
13057
+ if (input.lastOrdinal > input.currentRealUserTurnCount)
13058
+ return false;
13059
+ const gap = input.currentRealUserTurnCount - input.lastOrdinal;
13060
+ return gap >= 0 && gap < CHANNEL1_STICKY_REAL_USER_TURN_GAP;
13061
+ }
13062
+ function buildChannel1Reminder(level, undroppedTokens, usableWindowTokens, hint, sticky = false) {
12963
13063
  const hintText = formatOldestReclaimableHint(hint);
13064
+ if (sticky) {
13065
+ return `
13066
+
13067
+ <system-reminder>
13068
+ Reminder: ctx_reduce housekeeping still pending —${hintText}
13069
+ </system-reminder>`;
13070
+ }
13071
+ const amount = approxThousands(undroppedTokens);
13072
+ const usableWindow = approxThousands(usableWindowTokens);
12964
13073
  let body;
12965
13074
  switch (level) {
12966
13075
  case "gentle":
12967
- body = `You have ~${amount} tokens of content you have not reduced. ` + `When you are done with earlier outputs, dropping them with ctx_reduce keeps context lean.`;
13076
+ body = `Housekeeping: some earlier tool outputs are spent and can be dropped with ctx_reduce when you are done with them. ` + `Context is managed automatically — this is tidiness, never a reason to rush or narrow scope.`;
12968
13077
  break;
12969
13078
  case "firm":
12970
- body = `~${amount} tokens of unreduced content has built up. ` + `At your next natural stopping point, consider dropping what you have already processed with ctx_reduce.`;
13079
+ body = `Housekeeping: ~${amount} of this session's ~${usableWindow} window is spent tool output. ` + `Drop what you have already processed with ctx_reduce at a natural stopping point. ` + `Not a limit — nothing is lost either way.`;
12971
13080
  break;
12972
13081
  case "urgent":
12973
- body = `~${amount} tokens of unreduced content remain across most of the live tail. ` + `Consider dropping spent outputs with ctx_reduce so the archived span is the part that matters.`;
13082
+ body = `Housekeeping backlog: ~${amount} of this session's ~${usableWindow} window is spent tool output — worth a ctx_reduce pass now. ` + `This is routine and lossless; it is never a reason to change scope.`;
12974
13083
  break;
12975
13084
  }
12976
13085
  return `
@@ -13181,8 +13290,14 @@ function getOldestActiveUnprotectedToolTags(db, sessionId, protectedTags = 0, li
13181
13290
  const params = protectedTags > 0 ? [sessionId, AGE_RECLAIM_MIN_TOKENS, sessionId, protectedTags - 1] : [sessionId, AGE_RECLAIM_MIN_TOKENS];
13182
13291
  const rows = db.prepare(`SELECT tag_number, tool_name
13183
13292
  FROM tags
13184
- WHERE session_id = ? AND status = 'active' AND type = 'tool'
13185
- ${valueFloor}
13293
+ WHERE session_id = ? AND status = 'active' AND type = 'tool'
13294
+ AND NOT EXISTS (
13295
+ SELECT 1 FROM pending_ops
13296
+ WHERE pending_ops.session_id = tags.session_id
13297
+ AND pending_ops.tag_id = tags.tag_number
13298
+ AND pending_ops.operation = 'drop'
13299
+ )
13300
+ ${valueFloor}
13186
13301
  ${whereProtected}
13187
13302
  ORDER BY tag_number ASC, id ASC`).all(...params);
13188
13303
  return rows.filter((row) => typeof row.tag_number === "number").map((row) => ({
@@ -13821,6 +13936,59 @@ function parseReportedLimit(message) {
13821
13936
  return;
13822
13937
  }
13823
13938
 
13939
+ // src/shared/resolve-fallbacks.ts
13940
+ function resolveFallbackChain(userFallbacks) {
13941
+ const userList = normalizeUserFallbacks(userFallbacks);
13942
+ return dedupe(userList.filter(isValidModelSpec));
13943
+ }
13944
+ function normalizeUserFallbacks(userFallbacks) {
13945
+ if (!userFallbacks)
13946
+ return [];
13947
+ if (typeof userFallbacks === "string") {
13948
+ const trimmed = userFallbacks.trim();
13949
+ return trimmed ? [trimmed] : [];
13950
+ }
13951
+ return userFallbacks.map((s) => s.trim()).filter((s) => s.length > 0);
13952
+ }
13953
+ function isValidModelSpec(spec) {
13954
+ const slash = spec.indexOf("/");
13955
+ return slash > 0 && slash < spec.length - 1;
13956
+ }
13957
+ function dedupe(list) {
13958
+ const seen = new Set;
13959
+ const out = [];
13960
+ for (const item of list) {
13961
+ if (seen.has(item))
13962
+ continue;
13963
+ seen.add(item);
13964
+ out.push(item);
13965
+ }
13966
+ return out;
13967
+ }
13968
+ function parseProviderModel(spec) {
13969
+ const slash = spec.indexOf("/");
13970
+ if (slash < 1 || slash >= spec.length - 1)
13971
+ return null;
13972
+ return {
13973
+ providerID: spec.slice(0, slash).trim(),
13974
+ modelID: spec.slice(slash + 1).trim()
13975
+ };
13976
+ }
13977
+ function modelBodyField(spec) {
13978
+ const entry = toModelEntry(spec);
13979
+ if (!entry)
13980
+ return {};
13981
+ const parsed = parseProviderModel(entry.model);
13982
+ return parsed ? { model: parsed, ...entry.qualifier ? { variant: entry.qualifier } : {} } : {};
13983
+ }
13984
+ function toModelEntry(spec) {
13985
+ if (typeof spec === "string") {
13986
+ const model = spec.trim();
13987
+ return model ? { model } : undefined;
13988
+ }
13989
+ return spec;
13990
+ }
13991
+
13824
13992
  // src/shared/model-suggestion-retry.ts
13825
13993
  var ABORT_CALL_TIMEOUT_MS = 3000;
13826
13994
  function copyPromptArgs(args, body) {
@@ -13985,15 +14153,18 @@ async function promptSyncWithModelSuggestionRetry(client, args, options = {}) {
13985
14153
  log(`[${callContext}] primary (${explicitPrimaryLabel}) failed: ${shortErr(error)}; trying ${fallbacks.length} fallback(s)`);
13986
14154
  }
13987
14155
  for (let i = 0;i < fallbacks.length; i += 1) {
13988
- const parsed = parseProviderModel(fallbacks[i]);
14156
+ const fallback = toModelEntry(fallbacks[i]);
14157
+ const parsed = fallback ? parseProviderModel(fallback.model) : null;
13989
14158
  if (!parsed) {
13990
- log(`[${callContext}] skipping invalid fallback spec: ${fallbacks[i]}`);
14159
+ log(`[${callContext}] skipping invalid fallback spec: ${String(fallbacks[i])}`);
13991
14160
  continue;
13992
14161
  }
13993
14162
  const label = `${parsed.providerID}/${parsed.modelID}`;
14163
+ const { variant: _primaryVariant, ...bodyWithoutPrimaryVariant } = baseBody;
13994
14164
  const attemptArgs = copyPromptArgs(baseArgs, {
13995
- ...baseBody,
13996
- model: parsed
14165
+ ...bodyWithoutPrimaryVariant,
14166
+ model: parsed,
14167
+ ...fallback?.qualifier ? { variant: fallback.qualifier } : {}
13997
14168
  });
13998
14169
  try {
13999
14170
  await attemptOnce(client, attemptArgs, timeoutMs, options.signal, callContext, label);
@@ -14009,7 +14180,7 @@ async function promptSyncWithModelSuggestionRetry(client, args, options = {}) {
14009
14180
  }
14010
14181
  }
14011
14182
  }
14012
- log(`[${callContext}] all models exhausted; tried: ${[explicitPrimaryLabel, ...fallbacks].join(", ")}; last error: ${shortErr(lastError)}`);
14183
+ log(`[${callContext}] all models exhausted; tried: ${[explicitPrimaryLabel, ...fallbacks.map((fallback) => toModelEntry(fallback)?.model ?? String(fallback))].join(", ")}; last error: ${shortErr(lastError)}`);
14013
14184
  throw lastError ?? new Error("All fallback models failed");
14014
14185
  }
14015
14186
  async function attemptAndValidate(client, args, timeoutMs, signal, callContext, attempt, options) {
@@ -14047,15 +14218,18 @@ async function promptSyncWithValidatedOutputRetry(client, args, options) {
14047
14218
  log(`[${callContext}] primary (${explicitPrimaryLabel}) failed validation/prompt: ${shortErr(error)}; trying ${fallbacks.length} fallback(s)`);
14048
14219
  }
14049
14220
  for (let i = 0;i < fallbacks.length; i += 1) {
14050
- const parsed = parseProviderModel(fallbacks[i]);
14221
+ const fallback = toModelEntry(fallbacks[i]);
14222
+ const parsed = fallback ? parseProviderModel(fallback.model) : null;
14051
14223
  if (!parsed) {
14052
- log(`[${callContext}] skipping invalid fallback spec: ${fallbacks[i]}`);
14224
+ log(`[${callContext}] skipping invalid fallback spec: ${String(fallbacks[i])}`);
14053
14225
  continue;
14054
14226
  }
14055
14227
  const label = `${parsed.providerID}/${parsed.modelID}`;
14228
+ const { variant: _primaryVariant, ...bodyWithoutPrimaryVariant } = baseBody;
14056
14229
  const attemptArgs = copyPromptArgs(baseArgs, {
14057
- ...baseBody,
14058
- model: parsed
14230
+ ...bodyWithoutPrimaryVariant,
14231
+ model: parsed,
14232
+ ...fallback?.qualifier ? { variant: fallback.qualifier } : {}
14059
14233
  });
14060
14234
  const attempt = {
14061
14235
  label,
@@ -14080,7 +14254,7 @@ async function promptSyncWithValidatedOutputRetry(client, args, options) {
14080
14254
  }
14081
14255
  }
14082
14256
  }
14083
- log(`[${callContext}] all models exhausted; tried: ${[explicitPrimaryLabel, ...fallbacks].join(", ")}; original error: ${shortErr(firstError)}; last error: ${shortErr(lastError)}`);
14257
+ log(`[${callContext}] all models exhausted; tried: ${[explicitPrimaryLabel, ...fallbacks.map((fallback) => toModelEntry(fallback)?.model ?? String(fallback))].join(", ")}; original error: ${shortErr(firstError)}; last error: ${shortErr(lastError)}`);
14084
14258
  throw firstError ?? lastError ?? new Error("All fallback models failed validation");
14085
14259
  }
14086
14260
  // src/shared/normalize-sdk-response.ts
@@ -31227,16 +31401,103 @@ var PromptSurfaceConfigSchema = exports_external.object({
31227
31401
  message: "tool description values must not be empty or whitespace-only"
31228
31402
  })).optional().describe("USER-LEVEL ONLY top-level description overrides keyed by ctx_* tool ID; parameter schemas and descriptions are unchanged.")
31229
31403
  }).describe("Prompt-surface preset routing. Project config may select default/models, while guidance_override_path and tool_descriptions are user-level only.");
31404
+ var PER_HARNESS_MIGRATION_INVENTORY = {
31405
+ historian: {
31406
+ retained: [
31407
+ "temperature",
31408
+ "top_p",
31409
+ "prompt",
31410
+ "tools",
31411
+ "disable",
31412
+ "description",
31413
+ "mode",
31414
+ "color",
31415
+ "maxSteps",
31416
+ "permission",
31417
+ "maxTokens",
31418
+ "two_pass",
31419
+ "disallowed_tools"
31420
+ ],
31421
+ migrated_execution: ["model", "fallback_models", "variant", "thinking_level"]
31422
+ },
31423
+ dreamer: {
31424
+ retained: [
31425
+ "temperature",
31426
+ "top_p",
31427
+ "prompt",
31428
+ "tools",
31429
+ "disable",
31430
+ "description",
31431
+ "mode",
31432
+ "color",
31433
+ "maxSteps",
31434
+ "permission",
31435
+ "maxTokens",
31436
+ "inject_docs"
31437
+ ],
31438
+ migrated_execution: ["model", "fallback_models", "variant", "thinking_level"]
31439
+ },
31440
+ task: {
31441
+ retained: ["schedule", "promotion_threshold"],
31442
+ migrated_execution: [
31443
+ "model",
31444
+ "fallback_models",
31445
+ "variant",
31446
+ "thinking_level",
31447
+ "timeout_minutes"
31448
+ ]
31449
+ }
31450
+ };
31451
+ var OcEntryObjectSchema = exports_external.object({
31452
+ model: exports_external.string().describe("OpenCode model ID (for example, provider/model)."),
31453
+ variant: exports_external.string().optional().describe("OpenCode reasoning variant for this entry.")
31454
+ }).strict();
31455
+ var OcEntrySchema = exports_external.union([exports_external.string(), OcEntryObjectSchema]);
31456
+ var PiEntryObjectSchema = exports_external.object({
31457
+ model: exports_external.string().describe("Pi model ID (for example, provider/model)."),
31458
+ thinking_level: PiThinkingLevelSchema.describe("Pi thinking level for this entry.")
31459
+ }).strict();
31460
+ var PiEntrySchema = exports_external.union([exports_external.string(), PiEntryObjectSchema]);
31461
+ var OpenCodeHarnessBlockSchema = exports_external.object({
31462
+ model: OcEntrySchema.optional().describe("Primary OpenCode model entry."),
31463
+ fallback_models: exports_external.array(OcEntrySchema).optional().describe("Ordered fallback OpenCode entries. New-shape configuration requires an array; legacy singleton values migrate to a one-element array."),
31464
+ variant: exports_external.string().optional().describe("OpenCode reasoning variant for the primary entry when it declares none. Fallback entries declare variants per-entry.")
31465
+ }).strict().describe("Strict OpenCode model-resolution block. It accepts no Pi vocabulary.");
31466
+ var PiHarnessBlockSchema = exports_external.object({
31467
+ model: PiEntrySchema.optional().describe("Primary Pi model entry."),
31468
+ fallback_models: exports_external.array(PiEntrySchema).optional().describe("Ordered fallback Pi entries. New-shape configuration requires an array; legacy singleton values migrate to a one-element array."),
31469
+ thinking_level: PiThinkingLevelSchema.describe("Pi thinking level for the primary entry when it declares none. Fallback entries declare thinking levels per-entry.")
31470
+ }).strict().describe("Strict Pi model-resolution block. It accepts no OpenCode vocabulary.");
31471
+ var OpenCodeTaskExecutionSchema = exports_external.object({
31472
+ model: OcEntrySchema.optional().describe("OpenCode model entry for this task."),
31473
+ fallback_models: exports_external.array(OcEntrySchema).optional().describe("Ordered OpenCode fallback entries for this task."),
31474
+ variant: exports_external.string().optional().describe("OpenCode reasoning variant for this task's primary entry when it declares none. Fallback entries declare variants per-entry."),
31475
+ timeout_minutes: exports_external.number().min(5).optional().describe("Minutes allowed for this task before it is aborted.")
31476
+ }).strict();
31477
+ var PiTaskExecutionSchema = exports_external.object({
31478
+ model: PiEntrySchema.optional().describe("Pi model entry for this task."),
31479
+ fallback_models: exports_external.array(PiEntrySchema).optional().describe("Ordered Pi fallback entries for this task."),
31480
+ thinking_level: PiThinkingLevelSchema.describe("Pi thinking level for this task's primary entry when it declares none. Fallback entries declare thinking levels per-entry."),
31481
+ timeout_minutes: exports_external.number().min(5).optional().describe("Minutes allowed for this task before it is aborted.")
31482
+ }).strict();
31483
+ var DreamerOpenCodeHarnessBlockSchema = exports_external.object({
31484
+ model: OcEntrySchema.optional().describe("Primary OpenCode model entry."),
31485
+ fallback_models: exports_external.array(OcEntrySchema).optional().describe("Ordered fallback OpenCode entries. New-shape configuration requires an array; legacy singleton values migrate to a one-element array."),
31486
+ variant: exports_external.string().optional().describe("OpenCode reasoning variant for the primary entry when it declares none. Fallback entries declare variants per-entry."),
31487
+ tasks: exports_external.record(exports_external.string(), OpenCodeTaskExecutionSchema).optional().describe("OpenCode task execution overrides. Each named task accepts only model, fallback_models, variant, and timeout_minutes.")
31488
+ }).strict().describe("Strict OpenCode dreamer model-resolution block. It accepts no Pi vocabulary.");
31489
+ var DreamerPiHarnessBlockSchema = exports_external.object({
31490
+ model: PiEntrySchema.optional().describe("Primary Pi model entry."),
31491
+ fallback_models: exports_external.array(PiEntrySchema).optional().describe("Ordered fallback Pi entries. New-shape configuration requires an array; legacy singleton values migrate to a one-element array."),
31492
+ thinking_level: PiThinkingLevelSchema.describe("Pi thinking level for the primary entry when it declares none. Fallback entries declare thinking levels per-entry."),
31493
+ tasks: exports_external.record(exports_external.string(), PiTaskExecutionSchema).optional().describe("Pi task execution overrides. Each named task accepts only model, fallback_models, thinking_level, and timeout_minutes.")
31494
+ }).strict().describe("Strict Pi dreamer model-resolution block. It accepts no OpenCode vocabulary.");
31230
31495
  var CronScheduleSchema = exports_external.string().refine((s) => s.trim() === "" || isValidCron(s), {
31231
31496
  message: 'Invalid schedule: use a 5-field cron expression (e.g. "0 3 * * *" for 3am daily, "0 3 * * 0" for Sunday 3am, "0 */6 * * *" every 6h) or "" to disable.'
31232
31497
  }).describe('5-field cron schedule (e.g. "0 3 * * *"), or "" to disable this task.');
31233
31498
  var DreamTaskBaseConfigSchema = exports_external.object({
31234
- schedule: CronScheduleSchema.default(""),
31235
- model: exports_external.string().optional().describe("Per-task model override (inherits dreamer.model)"),
31236
- fallback_models: exports_external.union([exports_external.string(), exports_external.array(exports_external.string())]).optional().describe("Per-task fallback chain (inherits dreamer.fallback_models)"),
31237
- thinking_level: PiThinkingLevelSchema.describe("Pi only: per-task thinking level"),
31238
- timeout_minutes: exports_external.number().min(5).default(20).describe("Minutes allowed for this task before it is aborted")
31239
- });
31499
+ schedule: CronScheduleSchema.default("")
31500
+ }).strict();
31240
31501
  var PromotionThresholdSchema = exports_external.number().min(2).max(20).optional().describe("review-user-memories: min candidate observations before promotion is considered (default: 3)");
31241
31502
  var PrimerPromotionThresholdSchema = exports_external.number().min(2).max(20).optional().describe("promote-primers: min recurring source days before promotion is considered (default: 2)");
31242
31503
  var DreamTaskConfigSchema = DreamTaskBaseConfigSchema.extend({
@@ -31283,20 +31544,35 @@ var DreamTasksSchema = exports_external.object({
31283
31544
  "review-user-memories": ReviewUserMemoriesTaskConfigSchema.default(() => ReviewUserMemoriesTaskConfigSchema.parse(defaultTaskConfig("review-user-memories"))),
31284
31545
  "promote-primers": PromotePrimersTaskConfigSchema.default(() => PromotePrimersTaskConfigSchema.parse(defaultTaskConfig("promote-primers"))),
31285
31546
  "refresh-primers": DreamTaskBaseConfigSchema.default(() => DreamTaskBaseConfigSchema.parse(defaultTaskConfig("refresh-primers")))
31286
- }).describe("Per-task scheduling + model config. Each task has its own cron schedule and may override the dreamer-level model.");
31287
- var DreamerConfigSchema = AgentOverrideConfigSchema.merge(exports_external.object({
31547
+ }).describe("Harness-independent task metadata. schedule, promotion_threshold, and other task metadata remain here; execution settings live under dreamer.opencode.tasks or dreamer.pi.tasks.");
31548
+ var AgentMetadataSchema = AgentOverrideConfigSchema.pick({
31549
+ temperature: true,
31550
+ top_p: true,
31551
+ prompt: true,
31552
+ tools: true,
31553
+ disable: true,
31554
+ description: true,
31555
+ mode: true,
31556
+ color: true,
31557
+ maxSteps: true,
31558
+ permission: true,
31559
+ maxTokens: true
31560
+ });
31561
+ var DreamerConfigSchema = AgentMetadataSchema.extend({
31562
+ opencode: DreamerOpenCodeHarnessBlockSchema.optional(),
31563
+ pi: DreamerPiHarnessBlockSchema.optional(),
31288
31564
  tasks: DreamTasksSchema.default(() => DreamTasksSchema.parse({})),
31289
- inject_docs: exports_external.boolean().default(true).describe("Inject ARCHITECTURE.md and STRUCTURE.md into the m[0] `<project-docs>` block (default true)"),
31290
- thinking_level: PiThinkingLevelSchema.describe("Pi only: default thinking level for dreamer subagent invocations. See historian.thinking_level.")
31291
- }));
31565
+ inject_docs: exports_external.boolean().default(true).describe("Inject ARCHITECTURE.md and STRUCTURE.md into the m[0] `<project-docs>` block (default true)")
31566
+ });
31292
31567
  var SidekickConfigSchema = AgentOverrideConfigSchema.extend({
31293
31568
  timeout_ms: exports_external.number().default(30000).describe("Timeout for sidekick calls in milliseconds"),
31294
31569
  system_prompt: exports_external.string().optional().describe("Custom system prompt for sidekick"),
31295
- thinking_level: PiThinkingLevelSchema.describe("Pi only: explicit thinking level for sidekick subagent invocations. See historian.thinking_level.")
31570
+ thinking_level: PiThinkingLevelSchema.describe("Pi only: explicit thinking level for sidekick subagent invocations. See historian.pi.thinking_level.")
31296
31571
  }).optional();
31297
- var HistorianConfigSchema = AgentOverrideConfigSchema.extend({
31572
+ var HistorianConfigSchema = AgentMetadataSchema.extend({
31573
+ opencode: OpenCodeHarnessBlockSchema.optional(),
31574
+ pi: PiHarnessBlockSchema.optional(),
31298
31575
  two_pass: exports_external.boolean().default(false).describe("Run a second editor pass over historian output to clean low-signal U: lines and cross-compartment duplicates. Adds ~1 extra API call and ~1.3x cost per historian run. Useful for models without extended thinking support. (default: false)"),
31299
- thinking_level: PiThinkingLevelSchema.describe("Pi only: explicit thinking level passed as --thinking <level> to Pi historian subagent invocations. Required when using reasoning models (e.g. github-copilot/gpt-5.4) because Pi's default thinking-level resolution can pick a value the provider rejects. OpenCode users set variant instead. Valid: off | minimal | low | medium | high | xhigh | max"),
31300
31576
  disallowed_tools: exports_external.array(exports_external.enum(["*", "read", "aft_outline", "aft_zoom", "aft_search"])).default([]).describe(`OpenCode only. Tools to REMOVE from the historian's default allow-list [read, aft_outline, aft_zoom, aft_search]. Applies to both historian and historian-editor agents. Use ["*"] to strip all tool definitions from the model request — this prevents weak instruction-following models (e.g. mistral-small-latest) from entering tool-calling loops. Individual tool names remove just that tool. Note: a user-supplied historian.permission override can re-allow a tool that disallowed_tools removed — disallowed_tools sets the baseline, permission overrides take precedence. (default: [])`)
31301
31577
  }).optional();
31302
31578
  var EmbeddingFallbackProviderSchema = exports_external.enum(["local", "openai-compatible", "off"]);
@@ -31406,8 +31682,8 @@ var MagicContextConfigSchema = exports_external.object({
31406
31682
  transform_mode: exports_external.enum(["ts", "rust"]).default("ts").describe('Experimental: routes the entire Magic Context runtime for the project through the ck-mc Rust module over subc (requires user-level `subc` config); "ts" is the current TypeScript pipeline.'),
31407
31683
  auto_update: exports_external.boolean().optional().describe("Enable automatic npm self-update checks for the OpenCode plugin. Security: USER-only in config loader, so hostile project configs cannot suppress updates."),
31408
31684
  language: exports_external.string().trim().toLowerCase().refine((s) => isValidLanguageCode(s), 'language must be a 2-letter ISO 639-1 code (e.g. "tr", "es", "de")').optional().describe("Output language for Magic Context's generated content and guidance, as a " + '2-letter ISO 639-1 code (e.g. "tr", "es", "de", "ja", "pt"). When set, the ' + "historian, dreamer, sidekick, and the agent-guidance block instruct the model to " + "write its PROSE in this language while keeping all structural tokens (XML tags, " + "the five memory category names, code identifiers, file paths) in English. " + "USER-LEVEL ONLY (ignored in project config for security). Unset = today's " + "behavior (model mirrors the conversation; English scaffolding). Changing it " + "triggers one cache re-materialization; existing compartments/memories keep their " + "original language until naturally rewritten."),
31409
- historian: HistorianConfigSchema.describe("Historian agent configuration (model, fallback_models, variant, temperature, maxTokens, permission, two_pass, etc.)"),
31410
- dreamer: DreamerConfigSchema.optional().describe("Dreamer agent + scheduling configuration (model, fallback_models, disable, schedule, tasks, etc.)"),
31685
+ historian: HistorianConfigSchema.describe("Historian metadata plus independent strict OpenCode and Pi execution blocks. Retained metadata stays at historian; model, fallback_models, variant, and thinking_level belong only in historian.opencode or historian.pi."),
31686
+ dreamer: DreamerConfigSchema.optional().describe("Dreamer metadata and scheduling plus independent strict OpenCode and Pi execution blocks. schedule and promotion_threshold stay at dreamer.tasks; model, fallback_models, variant, thinking_level, and timeout_minutes belong only in the matching harness block."),
31411
31687
  smart_notes: exports_external.object({
31412
31688
  retina_handoff: exports_external.boolean().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.")
31413
31689
  }).default({ retina_handoff: false }).describe("Smart-note ownership transition controls."),
@@ -38578,6 +38854,7 @@ async function runValidatedHistorianPass(args) {
38578
38854
  const firstRun = await runHistorianPrompt({
38579
38855
  ...args,
38580
38856
  dumpLabel: `${args.dumpLabelBase}-initial`,
38857
+ modelOverride: args.model,
38581
38858
  agentId: args.agentId
38582
38859
  });
38583
38860
  if (!firstRun.ok || !firstRun.result) {
@@ -38606,6 +38883,7 @@ async function runValidatedHistorianPass(args) {
38606
38883
  ...args,
38607
38884
  prompt: repairPrompt,
38608
38885
  dumpLabel: `${args.dumpLabelBase}-repair`,
38886
+ modelOverride: args.model,
38609
38887
  agentId: args.agentId
38610
38888
  });
38611
38889
  if (!repairRun.ok || !repairRun.result) {
@@ -38646,7 +38924,8 @@ async function runEditorPassOrFallback(args) {
38646
38924
  timeoutMs: args.timeoutMs,
38647
38925
  dumpLabel: `${args.dumpLabelBase}-editor`,
38648
38926
  agentId: HISTORIAN_EDITOR_AGENT,
38649
- parentInvocationId: args.draftInvocationId ?? null
38927
+ parentInvocationId: args.draftInvocationId ?? null,
38928
+ modelOverride: args.model
38650
38929
  });
38651
38930
  if (!editorRun.ok || !editorRun.result) {
38652
38931
  sessionLog(args.parentSessionId, "historian two-pass: editor call failed", {
@@ -38699,7 +38978,7 @@ async function runHistorianPrompt(args) {
38699
38978
  });
38700
38979
  };
38701
38980
  try {
38702
- sessionLog(parentSessionId, `historian: creating child session (agent=${agentId}, model=${modelOverride ? `${modelOverride.providerID}/${modelOverride.modelID}` : `agent:${agentId}`})`);
38981
+ sessionLog(parentSessionId, `historian: creating child session (agent=${toModelEntry(modelOverride)?.model ?? `agent:${agentId}`})`);
38703
38982
  const createResponse = await createChildSessionWithFence({
38704
38983
  client,
38705
38984
  db,
@@ -38723,7 +39002,7 @@ async function runHistorianPrompt(args) {
38723
39002
  query: { directory: sessionDirectory },
38724
39003
  body: {
38725
39004
  agent: agentId,
38726
- ...modelOverride ? { model: modelOverride } : {},
39005
+ ...modelBodyField(modelOverride),
38727
39006
  parts: [{ type: "text", text: prompt, synthetic: true }]
38728
39007
  }
38729
39008
  }, {
@@ -38793,10 +39072,21 @@ async function runHistorianPrompt(args) {
38793
39072
  async function runFallbackHistorianPass(args) {
38794
39073
  const seen = new Set;
38795
39074
  const chain = [];
38796
- for (const candidate of [...args.fallbackModels ?? [], args.fallbackModelId ?? ""]) {
38797
- if (!candidate || seen.has(candidate))
39075
+ const primary = toModelEntry(args.model);
39076
+ for (const candidateInput of [
39077
+ ...args.fallbackModels ?? [],
39078
+ ...args.fallbackModelId ? [{ model: args.fallbackModelId }] : []
39079
+ ]) {
39080
+ const candidate = toModelEntry(candidateInput);
39081
+ if (!candidate)
39082
+ continue;
39083
+ const key = `${candidate.model}\x00${candidate.qualifier ?? ""}`;
39084
+ if (!candidate.model || seen.has(key))
39085
+ continue;
39086
+ if (primary?.model === candidate.model && primary.qualifier === candidate.qualifier) {
38798
39087
  continue;
38799
- seen.add(candidate);
39088
+ }
39089
+ seen.add(key);
38800
39090
  chain.push(candidate);
38801
39091
  }
38802
39092
  if (chain.length === 0) {
@@ -38804,9 +39094,9 @@ async function runFallbackHistorianPass(args) {
38804
39094
  }
38805
39095
  let lastError = args.error;
38806
39096
  for (let i = 0;i < chain.length; i += 1) {
38807
- const modelId = chain[i];
38808
- const modelOverride = parseModelOverride(modelId);
38809
- if (!modelOverride)
39097
+ const modelOverride = chain[i];
39098
+ const modelId = modelOverride.model;
39099
+ if (!parseModelOverride(modelId))
38810
39100
  continue;
38811
39101
  const isSessionModelLastResort = modelId === args.fallbackModelId && i === chain.length - 1;
38812
39102
  sessionLog(args.parentSessionId, `compartment agent: retrying historian with ${modelId} (${isSessionModelLastResort ? "session-model last resort" : "configured fallback"} ${i + 1}/${chain.length})`);
@@ -40351,6 +40641,7 @@ function isDroppedPlaceholder(text) {
40351
40641
  }
40352
40642
  var EMPTY_HARD_SIGNALS = {
40353
40643
  systemHash: "",
40644
+ toolSetHash: "",
40354
40645
  modelKey: "",
40355
40646
  cacheExpired: false,
40356
40647
  lastResponseTime: 0
@@ -40654,6 +40945,7 @@ function readCurrentM0SnapshotMarkersUncached(args) {
40654
40945
  upgradeState: getUpgradeState(args.db, args.sessionId),
40655
40946
  compartmentRenderEpoch: COMPARTMENT_RENDER_EPOCH,
40656
40947
  systemHash: hard.systemHash,
40948
+ toolSetHash: hard.toolSetHash ?? "",
40657
40949
  modelKey: piModelRefToCanonical(hard.modelKey),
40658
40950
  projectIdentity: args.projectPath ?? null,
40659
40951
  muralEnabled: args.muralEnabled === true,
@@ -40669,6 +40961,7 @@ function refreshVolatileMarkerInputs(markers, args) {
40669
40961
  projectDocsHash: projectDirectory && args.injectDocs !== false ? computeProjectDocsHash(projectDirectory) : "",
40670
40962
  materializedAt: Date.now(),
40671
40963
  systemHash: hard.systemHash,
40964
+ toolSetHash: hard.toolSetHash ?? "",
40672
40965
  modelKey: hard.modelKey,
40673
40966
  projectIdentity: args.projectPath ?? null,
40674
40967
  muralEnabled: args.muralEnabled === true,
@@ -40736,6 +41029,7 @@ function snapshotMarkersFromCachedM0(state2) {
40736
41029
  upgradeState: cachedUpgradeIdentity.upgradeState,
40737
41030
  compartmentRenderEpoch: cachedUpgradeIdentity.compartmentRenderEpoch,
40738
41031
  systemHash: state2.cachedM0SystemHash ?? "",
41032
+ toolSetHash: state2.cachedM0ToolSetHash ?? "",
40739
41033
  modelKey: state2.cachedM0ModelKey ?? "",
40740
41034
  projectIdentity: state2.cachedM0ProjectIdentity ?? null,
40741
41035
  muralHash: state2.cachedM0MuralHash ?? null,
@@ -40776,8 +41070,14 @@ function mustMaterialize(args) {
40776
41070
  systemHashNew: hard.systemHash
40777
41071
  };
40778
41072
  }
41073
+ const liveToolSetHash = hard.toolSetHash ?? "";
41074
+ const toolSetHashComparison = liveToolSetHash !== "" ? {
41075
+ m0ToolSetHashPrev: args.state.cachedM0ToolSetHash ?? "",
41076
+ m0ToolSetHashNew: liveToolSetHash
41077
+ } : null;
41078
+ const withToolSetHashComparison = (decision) => toolSetHashComparison ? { ...decision, ...toolSetHashComparison } : decision;
40779
41079
  if (hard.cacheExpired && hard.lastResponseTime > 0 && hard.lastResponseTime > (args.state.cachedM0MaterializedAt ?? 0)) {
40780
- return { value: true, reason: "ttl_idle" };
41080
+ return withToolSetHashComparison({ value: true, reason: "ttl_idle" });
40781
41081
  }
40782
41082
  if (current.projectIdentity !== null) {
40783
41083
  const cachedProjectIdentity = args.state.cachedM0ProjectIdentity ?? null;
@@ -40785,23 +41085,23 @@ function mustMaterialize(args) {
40785
41085
  args.state.cachedM0ProjectIdentity = current.projectIdentity;
40786
41086
  args.db.prepare("UPDATE session_meta SET cached_m0_project_identity = ? WHERE session_id = ?").run(current.projectIdentity, args.sessionId);
40787
41087
  } else if (cachedProjectIdentity !== current.projectIdentity) {
40788
- return { value: true, reason: "project_change" };
41088
+ return withToolSetHashComparison({ value: true, reason: "project_change" });
40789
41089
  }
40790
41090
  }
40791
41091
  if (current.workspaceFingerprint !== null || (args.state.cachedM0WorkspaceFingerprint ?? null) !== null) {
40792
41092
  if ((args.state.cachedM0WorkspaceFingerprint ?? null) !== current.workspaceFingerprint) {
40793
- return { value: true, reason: "project_memory_epoch" };
41093
+ return withToolSetHashComparison({ value: true, reason: "project_memory_epoch" });
40794
41094
  }
40795
41095
  } else if (args.state.cachedM0ProjectMemoryEpoch !== current.projectMemoryEpoch) {
40796
41096
  return { value: true, reason: "project_memory_epoch" };
40797
41097
  }
40798
41098
  if (args.state.cachedM0MaxMutationId !== current.maxMutationId) {
40799
- return { value: true, reason: "max_mutation_id" };
41099
+ return withToolSetHashComparison({ value: true, reason: "max_mutation_id" });
40800
41100
  }
40801
41101
  if (cachedUpgradeIdentity.upgradeState !== current.upgradeState) {
40802
- return { value: true, reason: "upgrade_state" };
41102
+ return withToolSetHashComparison({ value: true, reason: "upgrade_state" });
40803
41103
  }
40804
- return { value: false, reason: null };
41104
+ return withToolSetHashComparison({ value: false, reason: null });
40805
41105
  }
40806
41106
  function trimMemoriesToBudgetV2(sessionId, memories, budgetTokens, renderOptions = {}) {
40807
41107
  const selectionOrder = [...memories].sort(memorySelectionOrder);
@@ -41088,6 +41388,7 @@ function applyMarkersToState(state2, m0Bytes, markers, m1Bytes) {
41088
41388
  state2.cachedM0SessionFactsVersion = markers.sessionFactsVersion;
41089
41389
  state2.cachedM0UpgradeState = encodeCachedM0UpgradeIdentity(markers.upgradeState, markers.compartmentRenderEpoch, markers.muralEnabled, markers.renderBudgetIdentity);
41090
41390
  state2.cachedM0SystemHash = markers.systemHash;
41391
+ state2.cachedM0ToolSetHash = markers.toolSetHash;
41091
41392
  state2.cachedM0ModelKey = markers.modelKey;
41092
41393
  state2.cachedM0ProjectIdentity = markers.projectIdentity;
41093
41394
  state2.cachedM0MuralHash = markers.muralHash ?? null;
@@ -41230,6 +41531,7 @@ function materializeM0(options) {
41230
41531
  upgradeState: getUpgradeState(options.db, options.sessionId),
41231
41532
  compartmentRenderEpoch: COMPARTMENT_RENDER_EPOCH,
41232
41533
  systemHash: snapshotMarkers.systemHash,
41534
+ toolSetHash: snapshotMarkers.toolSetHash,
41233
41535
  modelKey: snapshotMarkers.modelKey,
41234
41536
  projectIdentity: projectPath ?? null,
41235
41537
  muralEnabled: snapshotMarkers.muralEnabled,
@@ -41270,6 +41572,7 @@ function materializeM0(options) {
41270
41572
  sessionFactsVersion: snapshotMarkers.sessionFactsVersion,
41271
41573
  upgradeState: encodeCachedM0UpgradeIdentity(snapshotMarkers.upgradeState, snapshotMarkers.compartmentRenderEpoch, snapshotMarkers.muralEnabled, snapshotMarkers.renderBudgetIdentity),
41272
41574
  systemHash: snapshotMarkers.systemHash,
41575
+ toolSetHash: snapshotMarkers.toolSetHash,
41273
41576
  modelKey: snapshotMarkers.modelKey,
41274
41577
  projectIdentity: snapshotMarkers.projectIdentity
41275
41578
  });
@@ -41466,9 +41769,10 @@ function readCachedM0M1Row(db, sessionId) {
41466
41769
  cached_m0_project_docs_hash,
41467
41770
  cached_m0_materialized_at,
41468
41771
  cached_m0_session_facts_version,
41469
- cached_m0_upgrade_state,
41470
- cached_m0_system_hash,
41471
- cached_m0_model_key,
41772
+ cached_m0_upgrade_state,
41773
+ cached_m0_system_hash,
41774
+ cached_m0_tool_set_hash,
41775
+ cached_m0_model_key,
41472
41776
  cached_m0_project_identity,
41473
41777
  memory_block_ids
41474
41778
  FROM session_meta
@@ -41506,6 +41810,7 @@ function markersFromCachedRow(row) {
41506
41810
  upgradeState: cachedUpgradeIdentity.upgradeState,
41507
41811
  compartmentRenderEpoch: cachedUpgradeIdentity.compartmentRenderEpoch,
41508
41812
  systemHash: row.cached_m0_system_hash ?? "",
41813
+ toolSetHash: row.cached_m0_tool_set_hash ?? "",
41509
41814
  modelKey: row.cached_m0_model_key ?? "",
41510
41815
  projectIdentity: row.cached_m0_project_identity ?? null,
41511
41816
  muralHash: row.cached_m0_mural_hash ?? null,
@@ -41514,7 +41819,7 @@ function markersFromCachedRow(row) {
41514
41819
  };
41515
41820
  }
41516
41821
  function cachedRowMatchesState(row, state2) {
41517
- return bufferEqualsNullable(row.cached_m0_bytes, state2.cachedM0Bytes) && (row.cached_m0_mural_data_url ?? null) === (state2.cachedM0MuralDataUrl ?? null) && (row.cached_m0_mural_hash ?? null) === (state2.cachedM0MuralHash ?? null) && row.cached_m0_project_memory_epoch === state2.cachedM0ProjectMemoryEpoch && (row.cached_m0_workspace_fingerprint ?? null) === (state2.cachedM0WorkspaceFingerprint ?? null) && row.cached_m0_project_user_profile_version === state2.cachedM0ProjectUserProfileVersion && row.cached_m0_max_compartment_seq === state2.cachedM0MaxCompartmentSeq && row.cached_m0_max_memory_id === state2.cachedM0MaxMemoryId && row.cached_m0_max_mutation_id === state2.cachedM0MaxMutationId && row.cached_m0_max_memory_mutation_id === state2.cachedM0MaxMemoryMutationId && row.cached_m0_materialized_at === state2.cachedM0MaterializedAt && row.cached_m0_session_facts_version === state2.cachedM0SessionFactsVersion && (row.cached_m0_upgrade_state ?? null) === (state2.cachedM0UpgradeState ?? null) && (row.cached_m0_system_hash ?? "") === (state2.cachedM0SystemHash ?? "") && piModelRefToCanonical(row.cached_m0_model_key ?? "") === piModelRefToCanonical(state2.cachedM0ModelKey ?? "") && (row.cached_m0_project_identity ?? null) === (state2.cachedM0ProjectIdentity ?? null);
41822
+ return bufferEqualsNullable(row.cached_m0_bytes, state2.cachedM0Bytes) && (row.cached_m0_mural_data_url ?? null) === (state2.cachedM0MuralDataUrl ?? null) && (row.cached_m0_mural_hash ?? null) === (state2.cachedM0MuralHash ?? null) && row.cached_m0_project_memory_epoch === state2.cachedM0ProjectMemoryEpoch && (row.cached_m0_workspace_fingerprint ?? null) === (state2.cachedM0WorkspaceFingerprint ?? null) && row.cached_m0_project_user_profile_version === state2.cachedM0ProjectUserProfileVersion && row.cached_m0_max_compartment_seq === state2.cachedM0MaxCompartmentSeq && row.cached_m0_max_memory_id === state2.cachedM0MaxMemoryId && row.cached_m0_max_mutation_id === state2.cachedM0MaxMutationId && row.cached_m0_max_memory_mutation_id === state2.cachedM0MaxMemoryMutationId && row.cached_m0_materialized_at === state2.cachedM0MaterializedAt && row.cached_m0_session_facts_version === state2.cachedM0SessionFactsVersion && (row.cached_m0_upgrade_state ?? null) === (state2.cachedM0UpgradeState ?? null) && (row.cached_m0_system_hash ?? "") === (state2.cachedM0SystemHash ?? "") && (row.cached_m0_tool_set_hash ?? "") === (state2.cachedM0ToolSetHash ?? "") && piModelRefToCanonical(row.cached_m0_model_key ?? "") === piModelRefToCanonical(state2.cachedM0ModelKey ?? "") && (row.cached_m0_project_identity ?? null) === (state2.cachedM0ProjectIdentity ?? null);
41518
41823
  }
41519
41824
  function applyCachedRowToState(state2, row) {
41520
41825
  const markers = markersFromCachedRow(row);
@@ -41537,6 +41842,7 @@ function applyCachedRowToState(state2, row) {
41537
41842
  state2.cachedM0SessionFactsVersion = markers.sessionFactsVersion;
41538
41843
  state2.cachedM0UpgradeState = encodeCachedM0UpgradeIdentity(markers.upgradeState, markers.compartmentRenderEpoch, markers.muralEnabled, markers.renderBudgetIdentity);
41539
41844
  state2.cachedM0SystemHash = markers.systemHash;
41845
+ state2.cachedM0ToolSetHash = markers.toolSetHash;
41540
41846
  state2.cachedM0ModelKey = markers.modelKey;
41541
41847
  state2.cachedM0ProjectIdentity = markers.projectIdentity;
41542
41848
  state2.snapshotMarkers = markers;
@@ -45006,6 +45312,7 @@ Historian pass ${passCount + 1}, attempt ${passAttempt} started for messages ${c
45006
45312
  sequenceOffset: candidateCompartments.length,
45007
45313
  dumpLabelBase: `recomp-${sessionId}-${chunk.startIndex}-${chunk.endIndex}-pass-${passCount + 1}`,
45008
45314
  timeoutMs: historianTimeoutMs,
45315
+ model: deps.model,
45009
45316
  fallbackModelId: deps.fallbackModelId,
45010
45317
  fallbackModels: deps.fallbackModels,
45011
45318
  twoPass: deps.historianTwoPass,
@@ -45426,6 +45733,7 @@ Historian pass ${passCount + 1}, attempt ${passAttempt} started for messages ${c
45426
45733
  sequenceOffset: candidateCompartments.length,
45427
45734
  dumpLabelBase: `partial-recomp-${sessionId}-${chunk.startIndex}-${chunk.endIndex}-pass-${passCount + 1}`,
45428
45735
  timeoutMs: historianTimeoutMs,
45736
+ model: deps.model,
45429
45737
  fallbackModelId: deps.fallbackModelId,
45430
45738
  fallbackModels: deps.fallbackModels,
45431
45739
  twoPass: deps.historianTwoPass,
@@ -45675,6 +45983,10 @@ var LKG_SINGLE_SLOT_BYTES = 24 * 1024 * 1024;
45675
45983
  var LKG_METADATA_BYTES = 256;
45676
45984
  var slots = new Map;
45677
45985
  var totalBytes = 0;
45986
+ var persistenceBackend;
45987
+ function registerLkgPersistence(backend) {
45988
+ persistenceBackend = backend;
45989
+ }
45678
45990
  function slotBytes(slot) {
45679
45991
  const digestBytes = slot.inputContentDigests.reduce((total, digest) => total + 2 * digest.length, 0);
45680
45992
  return 2 * slot.jsonPrefix.length + digestBytes + LKG_METADATA_BYTES;
@@ -45808,24 +46120,91 @@ function captureSlot(sessionId, slot) {
45808
46120
  totalBytes += bytes;
45809
46121
  return true;
45810
46122
  }
46123
+ function installHydratedSlot(sessionId, slot) {
46124
+ const bytes = slotBytes(slot);
46125
+ if (bytes > LKG_SINGLE_SLOT_BYTES)
46126
+ return false;
46127
+ const prior = slots.get(sessionId);
46128
+ if (prior)
46129
+ totalBytes -= prior.bytes;
46130
+ slots.delete(sessionId);
46131
+ while (totalBytes + bytes > LKG_TOTAL_BYTES) {
46132
+ const oldest = slots.keys().next().value;
46133
+ if (oldest === undefined)
46134
+ break;
46135
+ const evicted = slots.get(oldest);
46136
+ slots.delete(oldest);
46137
+ if (evicted)
46138
+ totalBytes -= evicted.bytes;
46139
+ }
46140
+ if (totalBytes + bytes > LKG_TOTAL_BYTES) {
46141
+ if (prior) {
46142
+ slots.set(sessionId, prior);
46143
+ totalBytes += prior.bytes;
46144
+ }
46145
+ return false;
46146
+ }
46147
+ const entry = {
46148
+ slot: {
46149
+ ...slot,
46150
+ inputIdSeq: [...slot.inputIdSeq],
46151
+ inputContentDigests: [...slot.inputContentDigests],
46152
+ inputContentSignatures: slot.inputContentSignatures ? [...slot.inputContentSignatures] : undefined
46153
+ },
46154
+ bytes
46155
+ };
46156
+ slots.set(sessionId, entry);
46157
+ totalBytes += bytes;
46158
+ return true;
46159
+ }
46160
+ function hydrateSlotFromPersistence(sessionId) {
46161
+ const backend = persistenceBackend;
46162
+ if (!backend)
46163
+ return;
46164
+ let loaded;
46165
+ try {
46166
+ loaded = backend.load(sessionId);
46167
+ } catch (error51) {
46168
+ sessionLog(sessionId, "LKG durable hydration failed:", error51);
46169
+ return;
46170
+ }
46171
+ if (!loaded)
46172
+ return;
46173
+ if (!installHydratedSlot(sessionId, loaded))
46174
+ return;
46175
+ sessionLog(sessionId, "lkg_hydrated_from_disk");
46176
+ const entry = slots.get(sessionId);
46177
+ return entry ? copySlotForRead(entry.slot) : undefined;
46178
+ }
46179
+ function copySlotForRead(slot) {
46180
+ return {
46181
+ ...slot,
46182
+ inputIdSeq: [...slot.inputIdSeq],
46183
+ inputContentDigests: [...slot.inputContentDigests],
46184
+ inputContentSignatures: slot.inputContentSignatures ? [...slot.inputContentSignatures] : undefined
46185
+ };
46186
+ }
45811
46187
  function getSlot(sessionId) {
45812
46188
  const entry = slots.get(sessionId);
45813
46189
  if (!entry)
45814
- return;
46190
+ return hydrateSlotFromPersistence(sessionId);
45815
46191
  touch(sessionId, entry);
45816
- return {
45817
- ...entry.slot,
45818
- inputIdSeq: [...entry.slot.inputIdSeq],
45819
- inputContentDigests: [...entry.slot.inputContentDigests],
45820
- inputContentSignatures: entry.slot.inputContentSignatures ? [...entry.slot.inputContentSignatures] : undefined
45821
- };
46192
+ return copySlotForRead(entry.slot);
45822
46193
  }
45823
46194
  function dropSlot(sessionId, _reason) {
45824
46195
  const entry = slots.get(sessionId);
45825
- if (!entry)
46196
+ if (entry) {
46197
+ slots.delete(sessionId);
46198
+ totalBytes -= entry.bytes;
46199
+ }
46200
+ const backend = persistenceBackend;
46201
+ if (!backend)
45826
46202
  return;
45827
- slots.delete(sessionId);
45828
- totalBytes -= entry.bytes;
46203
+ try {
46204
+ backend.clear(sessionId);
46205
+ } catch (error51) {
46206
+ sessionLog(sessionId, "LKG durable clear failed:", error51);
46207
+ }
45829
46208
  }
45830
46209
  function noteEntry(sessionId, messages) {
45831
46210
  const slot = getSlot(sessionId);
@@ -45938,6 +46317,7 @@ function buildRecompDeps(ctx, sessionId) {
45938
46317
  directory: ctx.directory,
45939
46318
  memoryEnabled: ctx.memoryEnabled,
45940
46319
  autoPromote: ctx.autoPromote,
46320
+ model: ctx.historianModel,
45941
46321
  fallbackModels: ctx.fallbackModels,
45942
46322
  language: ctx.language,
45943
46323
  fallbackModelId: ctx.fallbackModelId ?? resolveLiveModelKey(ctx.liveSessionState, sessionId),
@@ -46076,7 +46456,7 @@ async function runUpgradeMemoryMigration(ctx, sessionId, migrationDirectory) {
46076
46456
  directory: migrationDirectory,
46077
46457
  parentSessionId: sessionId,
46078
46458
  primaryModelId: ctx.fallbackModelId ?? resolveLiveModelKey(ctx.liveSessionState, sessionId),
46079
- fallbackModels: ctx.fallbackModels,
46459
+ fallbackModels: ctx.fallbackModels.map((entry) => typeof entry === "string" ? entry : entry.model),
46080
46460
  timeoutMs: ctx.historianTimeoutMs,
46081
46461
  userMemoriesEnabled: ctx.userMemoriesEnabled,
46082
46462
  language: ctx.language
@@ -46087,4 +46467,4 @@ async function runUpgradeMemoryMigration(ctx, sessionId, migrationDirectory) {
46087
46467
  }
46088
46468
  }
46089
46469
 
46090
- export { withContentLanguageDirective, buildPrimaryLanguageDirective, cortexKitUserConfigBasePath, cortexKitProjectConfigBasePath, resolveLegacyConfigSources, resolveLegacyConfigSourcesForHarness, migrateMagicContextConfigLocations, exports_external, DEFAULT_PROTECTED_TAGS, parseCron, nextOccurrence, nextDueAtMs, promptSurfaceConfigIdentity, resolvePromptSurface, resolveModelConfigOrDefault, DEFAULT_EXECUTE_THRESHOLD_PERCENTAGE, DEFAULT_HISTORIAN_TIMEOUT_MS, DEFAULT_LOCAL_EMBEDDING_MODEL, MagicContextConfigSchema, getOpenCodeDbPath, removeMcOwnedCompactionMarkers, isFailClosedBlockingError, shouldBypassFailClosedBlock, resolveAgentNameFromMessages, createFailClosedController, recordHookInitFailure, clearHookInitFailure, getLastHookInitFailure, ProjectIdentityError, resolveProjectIdentityStrict, takeDubiousOwnershipProjectIdentityWarning, resolveProjectIdentity, resolveProjectIdentityForSession, normalizeStoredProjectPath, storedPathBelongsToIdentity, isLinkedGitWorktree, recordSessionProjectIdentity, beginBootQuietPeriod, bootQuietRemainingMs, scheduleAfterBootQuiet, rpcPortDir, rpcPortFilePath, isPidAlive, parseRpcPortFile, registerModuleNoteEvaluationBridge, getModuleNoteEvaluationBridge, getContextStoreUuid, ensureContextStoreUuid, getAuthorityManagedMarker, reconcileAuthorityProject, checksumAuthoritySeedRows, prepareAuthority, drainAuthority, getMirrorCursor, applyMirroredNoteCompileFields, applyMirrorPage, pullMemoryMirrorOnce, V2_MEMORY_CATEGORIES, CATEGORY_PRIORITY, resolveWorkspaceShareCategories, resolveWorkspaceIdentitySet, expandWorkspaceIdentitySetWithAliases, resolveStoredPathWorkspaceIdentity, storedPathBelongsToWorkspace, sourceNameForMemory, computeWorkspaceEpochFingerprint, textMentionsRecentCommit, hasMeaningfulUserText, extractTexts, extractToolCallSummaries, preloadTokenizer, estimateTokens, normalizeText, recordToolDefinition, getMeasuredToolDefinitionTokens, getSchemaFenceRejection, getMigrationOnOpenRefusal, LATEST_SUPPORTED_VERSION, getDatabasePath, getPersistedSchemaVersion, setSqlitePragmaConfig, runSqliteOptimize, openDatabase, openDatabaseAsync, isDatabasePersisted, getDatabasePersistenceError, COMPARTMENT_LEASE_RENEWAL_MS, acquireCompartmentLease, renewCompartmentLease, releaseCompartmentLease, getCompartments, getLastCompartmentEndMessage, getLastCompartmentEndMessageId, clearRecompStaging, isRawCompactionSummaryInfo, extractInMemoryMessageViews, buildInMemoryTailRawMessages, isRecord, estimateTrueRawMessageTokens, invalidateTrueRawTokenCache, stripPersistedAssistantText, byteSize, stripTagPrefix, prependTag, isThinkingPart, isTextPart, isToolPartWithOutput, isFilePart, buildFileSourceContent, isEditTool, partHasCompletedResult, extractToolCallObservation, ToolMutationBatch, createToolDropTarget, setRawMessageProvider, cleanUserText, withRawSessionMessageCache, readRawSessionMessages, primeTailRawMessageCache, primeInMemoryTailRawMessageCache, readRawSessionMessageOrdinalPage, getRawSessionStoredMessageCount, readRawSessionMessagePartsById, readRawSessionMessageOrdinalById, readRawSessionMessageById, readSessionChunk, getMessageIndexSourceIdentity, isMessageIndexSourceCurrent, getLastIndexedOrdinal, getIndexedMessageCorpusSize, getMessageIndexReconciliationStartOrdinal, isMessageIndexReconciledThrough, deleteIndexedMessage, clearIndexedMessages, indexSingleMessage, indexMessagesAfterOrdinal, sweepOrphanedOpenCodeMessageIndexes, recordEmbeddingMeasurement, getMaxM0MutationId, queueMemoryMutation, getMemoryMutationsForRenderByProjects, getMaxMemoryMutationIdForProjects, MAX_EXECUTE_THRESHOLD, escalationBands, isEmergencyRecoveryArmed, isProviderOverflowReconfirmed, getEmergencyRecoveryArmedAt, loadPersistedUsage, loadProtectedTailMeta, resetProtectedTailNoEligibleHead, getWrapupInProgressState, acquireWrapupInProgress, updateWrapupInProgress, releaseWrapupInProgress, resolveCompactionModeRecord, getCompactionModeRecord, setCompactionModeRecord, getPersistedReasoningWatermark, setPersistedReasoningWatermark, clearPersistedReasoningWatermark, getEmergencyInputSample, setEmergencyDropSample, clearEmergencyDropSample, getLastNudgeUndropped, setLastNudgeUndropped, getLastNudgeLevel, setLastNudgeLevel, resetLastNudgeCycle, resetLastNudgeCycleIfTailShrank, getChannel2NudgeState, getChannel2NudgeClaim, setChannel2NudgeState, casChannel2NudgeState, claimChannel2NudgeState, casChannel2NudgeClaim, getPersistedNoteNudge, getNoteNudgeAnchors, getAutoSearchHintDecisions, appendAutoSearchHintDecision, pruneNoteNudgeAnchors, pruneAutoSearchHintDecisions, removeNoteNudgeAnchorByMessageId, removeAutoSearchHintDecisionByMessageId, getPersistedTodoPermissionDenied, setPersistedTodoPermissionDenied, getPersistedTodoSyntheticAnchor, setPersistedTodoSyntheticAnchor, clearPersistedTodoSyntheticAnchor, setNoteLastReadAt, getHistorianFailureState, clearHistorianFailureState, getOverflowState, recordOverflowDetected, recordDetectedContextLimit, clearEmergencyRecovery, clearDetectedContextLimit, getPersistedCompactionMarkerState, setPersistedCompactionMarkerState, getStrippedPlaceholderIds, applyStrippedPlaceholderDelta, removeStrippedPlaceholderId, getMergedReasoningStrippedIds, addMergedReasoningStrippedIds, getTrailingBlankDecisions, addTrailingBlankDecisions, getStaleReduceStrippedIds, addStaleReduceStrippedIds, getProcessedImageStrippedIds, addProcessedImageStrippedIds, getPendingCompactionMarkerState, clearPendingCompactionMarkerStateIf, peekDeferredExecutePending, setDeferredExecutePendingIfAbsent, clearDeferredExecutePendingIfMatches, getSessionsWithPendingMarker, setSessionWorkMetrics, getNotes, addNote, getSessionNotes, getPendingSmartNotes, getReadySmartNotes, updateNote, dismissNote, markNoteReady, markNoteChecked, queuePendingOp, getPendingOps, clearPendingOps, removePendingOp, PRIMER_CANDIDATE_TTL_MS, PRIMER_CANDIDATE_MAX_AGE_MS, primerOccurrenceKey, primerOccurrenceUtcDay, updatePrimerCandidateEmbedding, getPrimerCandidatesByIds, getPrimerCandidatesForPromotion, countPrimerCandidatesForProject, getActivePrimers, createPrimer, updatePrimerSupport, updatePrimerAnswer, GLOBAL_USER_PROFILE_PROJECT_PATH, getProjectState, bumpProjectMemoryEpoch, bumpProjectUserProfileVersion, saveSourceContent, replaceSourceContent, getSourceContents, CTX_REDUCE_KEEP, estimateImageTokensFromDataUrl, normalizeTodoStateJson, buildSyntheticTodoPart, computeSyntheticCallId, isSyntheticTodoPart, tailHygieneStructuralSignature, sameTailHygieneStructuralSignature, refreshTailHygieneBaseline, effectiveTailHygiene, assertTailHygieneContentUnchanged, CHANNEL1_SENTINEL, CHANNEL1_FLOOR_TOKENS, toolOutputTokens, decideChannel1, evaluateChannel2, buildChannel2Reminder, buildChannel1Reminder, estimateEmergencyDropReclaimTokens, planEmergencyDrop, AGE_RECLAIM_MIN_TOKENS, getOldestActiveUnprotectedToolTags, getActiveToolTagsForAgeReclaim, getTriggerTagTokenUpperBound, getActiveTagTokenTotalsByMessage, tagTokenCountIsNull, backfillTagTokenCounts, insertTag, updateTagStatus, updateTagDropMode, updateCavemanDepth, updateTagMessageId, deleteTagsByMessageId, getMaxTagNumberBySession, getTagNumberByMessageId, deriveTagLoadFloor, getTagsBySession, getActiveTagsBySession, getTailHygieneTags, getDroppedTagsBySession, getTagsByNumbers, getMaxDroppedTagNumber, getToolTagNumberByOwner, getNullOwnerToolTag, adoptNullOwnerToolTag, getCandidateToolOwners, pickNearestPriorOwner, createChildSessionWithFence, detectOverflow, promptSyncWithValidatedOutputRetry, normalizeSDKResponse, promptSurfaceHashMaterial, createPromptSurfaceRuntime, createPromptSurfaceGuidanceEpochCache, extractLatestAssistantText, hasLengthCappedOutput, setKeepSubagents, shouldKeepSubagents, recordChildInvocation, COMPARTMENT_AGENT_SYSTEM_PROMPT, HISTORIAN_EDITOR_SYSTEM_PROMPT, COMPARTMENT_STRUCTURAL_SYSTEM_PROMPT, Priority, AdmissionClass, StaleRouteHandleError, SocketClosedError, SocketTimeoutError, SubcClient, isConsumerReconnectTransient, connectionFileExists, getCompartmentEvents, loadCompartmentChunkEmbeddingsForSearch, cosineSimilarity, SYNAPSE_DEFAULT_MODEL, SynapseEmbeddingProvider, computeNormalizedHash, saveCommitEmbedding, loadProjectCommitEmbeddings, loadUnembeddedCommits, countEmbeddedCommits, upsertCommits, getLatestIndexedCommitTimeMs, enforceProjectCap, GIT_SWEEP_LEASE_RENEWAL_MS, acquireGitSweepLease, renewGitSweepLease, markGitSweepSuccessAndRelease, parkGitSweepNonIndexable, releaseGitSweepLease, saveEmbeddingIfHashMatches, getProjectEmbeddings, peekProjectEmbeddings, invalidateProject, invalidateMemory, markProjectLoadUntrusted, contentSha256, sweepStaleEmbeddingIdentitiesForProject, registerProjectEmbedding, registerProjectShadowEmbedding, getShadowEmbeddingMeasurementCohort, getPrimaryEmbeddingMeasurementCohort, embedShadowTextForProject, enqueueShadowEmbeddingItems, registerProjectInObservationMode, getProjectEmbeddingSnapshot, embedTextForProject, embedBatchForProject, embedItemsForProject, embedUnembeddedMemoriesForProject, drainCommitBacklogForProject, embedSessionCompartmentChunks, getEmbeddingCoverageStatus, isEmbeddingEnabled, embedText, ensureMemoryEmbeddings, computeCueContentHash, hasMuralCueColumns, getMuralCueState, memoryNeedsCue, setMuralCue, recordMuralCueRejection, hasMemoryShareableColumn, hasMemoryClassifiedAtColumn, getUnclassifiedMemoryIds, ModuleMemoryAuthorityError, insertMemory, insertMemoryIdempotent, getMemoryByHash, getMemoriesByProject, buildWorkspaceMemorySqlFilter, getMemoriesByProjects, getMaxMemoryIdForProjects, readNewMemoriesForM1Union, getMemoryById, getMemoriesByIds, updateMemorySeenCount, updateMemoryRetrievalCount, setMemoryClassification, supersededMemory, mergeMemoryStats, archiveMemory, getMemoryCountsByStatus, sanitizeFtsQuery, searchMemoriesFTS, searchMemoriesFTSUnion, recordMemoryMapping, recordMemoryVerifications, getUnmappedMemoryIds, clearMemoryVerifications, getMemoryVerifications, resolveGitTopLevel, readGitHead, readGitChangedFilesSince, readGitFileChangeTimesSince, verificationFileExists, normalizeVerificationFiles, USER_MEMORY_CANDIDATE_TTL_MS, insertUserMemoryCandidates, getUserMemoryCandidates, deleteUserMemoryCandidates, pruneExpiredUserMemoryCandidates, insertUserMemory, getActiveUserMemories, updateUserMemoryContent, dismissUserMemory, MARKER_SUMMARY_TEXT, applyDeferredCompactionMarker, removeCompactionMarkerForSession, checkCompactionMarkerConsistency, getMural, resolveMuralWire, BoundedSessionMap, extractM0Block, formatDate, injectTemporalMarkers, clearInjectionCache, getVisibleMemoryIds, prepareCompartmentInjection, renderCompartmentInjection, mustMaterialize, trimMemoriesToBudgetV2, renderMemoryBlockV2, injectM0M1, onNoteTrigger, peekNoteNudgeText, markNoteNudgeDelivered, clearNoteNudgeTriggerAndCooldown, resetNoteNudgeCooldownOnly, clearNoteNudgeTriggerOnly, RECOVERY_NO_HEAD_LIMIT, resolveOpenCodeProtectedTailBoundary, resolveWrapupProtectedTailBoundary, getRawHistoryEligibility, hasRunnableCompartmentWindow, recordHighPressureNoEligibleHead, runCompartmentAgent, snapRangeToCompartments, LKG_SNAPSHOT_ARRAY, LKG_SNAPSHOT_OBJECT, LKG_SNAPSHOT_KEY, LKG_SNAPSHOT_STRING, LKG_SNAPSHOT_NUMBER, LKG_SNAPSHOT_BOOLEAN, LKG_SNAPSHOT_NULL, LKG_SNAPSHOT_UNDEFINED, incrementalLkgContentDigests, lkgContentDigest, captureSlot, getSlot, dropSlot, noteEntry, getActiveCompartmentRun, markActiveCompartmentRunPublished, registerActiveCompartmentRun, startCompartmentAgent, isRecompFailure, isRecompSkip, isRecompComplete, extractRecompReason, contextualizeUpgradeReason, setRecompStarting, setRecompNote, setRecompTerminal, runManagedRecomp, runManagedUpgrade };
46470
+ export { withContentLanguageDirective, buildPrimaryLanguageDirective, cortexKitUserConfigBasePath, cortexKitProjectConfigBasePath, resolveLegacyConfigSources, resolveLegacyConfigSourcesForHarness, migrateMagicContextConfigLocations, exports_external, DEFAULT_PROTECTED_TAGS, parseCron, nextOccurrence, nextDueAtMs, promptSurfaceConfigIdentity, resolvePromptSurface, resolveModelConfigOrDefault, DEFAULT_EXECUTE_THRESHOLD_PERCENTAGE, DEFAULT_HISTORIAN_TIMEOUT_MS, DEFAULT_LOCAL_EMBEDDING_MODEL, PER_HARNESS_MIGRATION_INVENTORY, MagicContextConfigSchema, getOpenCodeDbPath, removeMcOwnedCompactionMarkers, isFailClosedBlockingError, shouldBypassFailClosedBlock, resolveAgentNameFromMessages, createFailClosedController, recordHookInitFailure, clearHookInitFailure, getLastHookInitFailure, ProjectIdentityError, resolveProjectIdentityStrict, takeDubiousOwnershipProjectIdentityWarning, resolveProjectIdentity, resolveProjectIdentityForSession, normalizeStoredProjectPath, storedPathBelongsToIdentity, isLinkedGitWorktree, recordSessionProjectIdentity, beginBootQuietPeriod, bootQuietRemainingMs, scheduleAfterBootQuiet, rpcPortDir, rpcPortFilePath, isPidAlive, parseRpcPortFile, registerModuleNoteEvaluationBridge, getModuleNoteEvaluationBridge, getContextStoreUuid, ensureContextStoreUuid, getAuthorityManagedMarker, reconcileAuthorityProject, checksumAuthoritySeedRows, prepareAuthority, drainAuthority, getMirrorCursor, applyMirroredNoteCompileFields, applyMirrorPage, pullMemoryMirrorOnce, V2_MEMORY_CATEGORIES, CATEGORY_PRIORITY, resolveWorkspaceShareCategories, resolveWorkspaceIdentitySet, expandWorkspaceIdentitySetWithAliases, resolveStoredPathWorkspaceIdentity, storedPathBelongsToWorkspace, sourceNameForMemory, computeWorkspaceEpochFingerprint, textMentionsRecentCommit, hasMeaningfulUserText, extractTexts, extractToolCallSummaries, preloadTokenizer, estimateTokens, normalizeText, getCurrentToolSetHash, recordToolDefinition, getMeasuredToolDefinitionTokens, getSchemaFenceRejection, getMigrationOnOpenRefusal, LATEST_SUPPORTED_VERSION, getDatabasePath, getPersistedSchemaVersion, setSqlitePragmaConfig, runSqliteOptimize, openDatabase, openDatabaseAsync, isDatabasePersisted, getDatabasePersistenceError, COMPARTMENT_LEASE_RENEWAL_MS, acquireCompartmentLease, renewCompartmentLease, releaseCompartmentLease, getCompartments, getLastCompartmentEndMessage, getLastCompartmentEndMessageId, clearRecompStaging, isRawCompactionSummaryInfo, extractInMemoryMessageViews, buildInMemoryTailRawMessages, isRecord, estimateTrueRawMessageTokens, invalidateTrueRawTokenCache, stripPersistedAssistantText, byteSize, stripTagPrefix, prependTag, isThinkingPart, isTextPart, isToolPartWithOutput, isFilePart, buildFileSourceContent, isEditTool, partHasCompletedResult, extractToolCallObservation, ToolMutationBatch, createToolDropTarget, setRawMessageProvider, cleanUserText, withRawSessionMessageCache, readRawSessionMessages, primeTailRawMessageCache, primeInMemoryTailRawMessageCache, readRawSessionMessageOrdinalPage, getRawSessionStoredMessageCount, readRawSessionMessagePartsById, readRawSessionMessageOrdinalById, readRawSessionMessageById, readSessionChunk, getMessageIndexSourceIdentity, isMessageIndexSourceCurrent, getLastIndexedOrdinal, getIndexedMessageCorpusSize, getMessageIndexReconciliationStartOrdinal, isMessageIndexReconciledThrough, deleteIndexedMessage, clearIndexedMessages, indexSingleMessage, indexMessagesAfterOrdinal, sweepOrphanedOpenCodeMessageIndexes, recordEmbeddingMeasurement, getMaxM0MutationId, queueMemoryMutation, getMemoryMutationsForRenderByProjects, getMaxMemoryMutationIdForProjects, MAX_EXECUTE_THRESHOLD, escalationBands, isEmergencyRecoveryArmed, isProviderOverflowReconfirmed, getEmergencyRecoveryArmedAt, loadPersistedUsage, loadProtectedTailMeta, resetProtectedTailNoEligibleHead, getWrapupInProgressState, acquireWrapupInProgress, updateWrapupInProgress, releaseWrapupInProgress, resolveCompactionModeRecord, getCompactionModeRecord, setCompactionModeRecord, getPersistedReasoningWatermark, setPersistedReasoningWatermark, clearPersistedReasoningWatermark, getEmergencyInputSample, setEmergencyDropSample, clearEmergencyDropSample, getLastNudgeUndropped, setLastNudgeUndropped, getChannel1NudgeState, setChannel1NudgeState, resetLastNudgeCycle, resetLastNudgeCycleIfTailShrank, getChannel2NudgeState, getChannel2NudgeClaim, setChannel2NudgeState, casChannel2NudgeState, claimChannel2NudgeState, casChannel2NudgeClaim, getPersistedNoteNudge, getNoteNudgeAnchors, getAutoSearchHintDecisions, appendAutoSearchHintDecision, pruneNoteNudgeAnchors, pruneAutoSearchHintDecisions, removeNoteNudgeAnchorByMessageId, removeAutoSearchHintDecisionByMessageId, getPersistedTodoPermissionDenied, setPersistedTodoPermissionDenied, getPersistedTodoSyntheticAnchor, setPersistedTodoSyntheticAnchor, clearPersistedTodoSyntheticAnchor, setNoteLastReadAt, getHistorianFailureState, clearHistorianFailureState, getOverflowState, recordOverflowDetected, recordDetectedContextLimit, clearEmergencyRecovery, clearDetectedContextLimit, getPersistedCompactionMarkerState, setPersistedCompactionMarkerState, getStrippedPlaceholderIds, applyStrippedPlaceholderDelta, removeStrippedPlaceholderId, getMergedReasoningStrippedIds, addMergedReasoningStrippedIds, getTrailingBlankDecisions, addTrailingBlankDecisions, getStaleReduceStrippedIds, addStaleReduceStrippedIds, getProcessedImageStrippedIds, addProcessedImageStrippedIds, getPendingCompactionMarkerState, clearPendingCompactionMarkerStateIf, peekDeferredExecutePending, setDeferredExecutePendingIfAbsent, clearDeferredExecutePendingIfMatches, getSessionsWithPendingMarker, setSessionWorkMetrics, getNotes, addNote, getSessionNotes, getPendingSmartNotes, getReadySmartNotes, updateNote, dismissNote, markNoteReady, markNoteChecked, queuePendingOp, getPendingOps, clearPendingOps, removePendingOp, PRIMER_CANDIDATE_TTL_MS, PRIMER_CANDIDATE_MAX_AGE_MS, primerOccurrenceKey, primerOccurrenceUtcDay, updatePrimerCandidateEmbedding, getPrimerCandidatesByIds, getPrimerCandidatesForPromotion, countPrimerCandidatesForProject, getActivePrimers, createPrimer, updatePrimerSupport, updatePrimerAnswer, GLOBAL_USER_PROFILE_PROJECT_PATH, getProjectState, bumpProjectMemoryEpoch, bumpProjectUserProfileVersion, saveSourceContent, replaceSourceContent, getSourceContents, CTX_REDUCE_KEEP, estimateImageTokensFromDataUrl, normalizeTodoStateJson, buildSyntheticTodoPart, computeSyntheticCallId, isSyntheticTodoPart, countRealUserMessages, tailHygieneStructuralSignature, sameTailHygieneStructuralSignature, refreshTailHygieneBaseline, effectiveTailHygiene, assertTailHygieneContentUnchanged, CHANNEL1_SENTINEL, CHANNEL1_FLOOR_TOKENS, toolOutputTokens, decideChannel1, evaluateChannel2, buildChannel2Reminder, shouldUseStickyChannel1Reminder, buildChannel1Reminder, estimateEmergencyDropReclaimTokens, planEmergencyDrop, AGE_RECLAIM_MIN_TOKENS, getOldestActiveUnprotectedToolTags, getActiveToolTagsForAgeReclaim, getTriggerTagTokenUpperBound, getActiveTagTokenTotalsByMessage, tagTokenCountIsNull, backfillTagTokenCounts, insertTag, updateTagStatus, updateTagDropMode, updateCavemanDepth, updateTagMessageId, deleteTagsByMessageId, getMaxTagNumberBySession, getTagNumberByMessageId, deriveTagLoadFloor, getTagsBySession, getActiveTagsBySession, getTailHygieneTags, getDroppedTagsBySession, getTagsByNumbers, getMaxDroppedTagNumber, getToolTagNumberByOwner, getNullOwnerToolTag, adoptNullOwnerToolTag, getCandidateToolOwners, pickNearestPriorOwner, createChildSessionWithFence, detectOverflow, resolveFallbackChain, modelBodyField, promptSyncWithValidatedOutputRetry, normalizeSDKResponse, promptSurfaceHashMaterial, createPromptSurfaceRuntime, createPromptSurfaceGuidanceEpochCache, extractLatestAssistantText, hasLengthCappedOutput, setKeepSubagents, shouldKeepSubagents, recordChildInvocation, COMPARTMENT_AGENT_SYSTEM_PROMPT, HISTORIAN_EDITOR_SYSTEM_PROMPT, COMPARTMENT_STRUCTURAL_SYSTEM_PROMPT, Priority, AdmissionClass, StaleRouteHandleError, SocketClosedError, SocketTimeoutError, SubcClient, isConsumerReconnectTransient, connectionFileExists, getCompartmentEvents, loadCompartmentChunkEmbeddingsForSearch, cosineSimilarity, SYNAPSE_DEFAULT_MODEL, SynapseEmbeddingProvider, computeNormalizedHash, saveCommitEmbedding, loadProjectCommitEmbeddings, loadUnembeddedCommits, countEmbeddedCommits, upsertCommits, getLatestIndexedCommitTimeMs, enforceProjectCap, GIT_SWEEP_LEASE_RENEWAL_MS, acquireGitSweepLease, renewGitSweepLease, markGitSweepSuccessAndRelease, parkGitSweepNonIndexable, releaseGitSweepLease, saveEmbeddingIfHashMatches, getProjectEmbeddings, peekProjectEmbeddings, invalidateProject, invalidateMemory, markProjectLoadUntrusted, contentSha256, sweepStaleEmbeddingIdentitiesForProject, registerProjectEmbedding, registerProjectShadowEmbedding, getShadowEmbeddingMeasurementCohort, getPrimaryEmbeddingMeasurementCohort, embedShadowTextForProject, enqueueShadowEmbeddingItems, registerProjectInObservationMode, getProjectEmbeddingSnapshot, embedTextForProject, embedBatchForProject, embedItemsForProject, embedUnembeddedMemoriesForProject, drainCommitBacklogForProject, embedSessionCompartmentChunks, getEmbeddingCoverageStatus, isEmbeddingEnabled, embedText, ensureMemoryEmbeddings, computeCueContentHash, hasMuralCueColumns, getMuralCueState, memoryNeedsCue, setMuralCue, recordMuralCueRejection, hasMemoryShareableColumn, hasMemoryClassifiedAtColumn, getUnclassifiedMemoryIds, ModuleMemoryAuthorityError, insertMemory, insertMemoryIdempotent, getMemoryByHash, getMemoriesByProject, buildWorkspaceMemorySqlFilter, getMemoriesByProjects, getMaxMemoryIdForProjects, readNewMemoriesForM1Union, getMemoryById, getMemoriesByIds, updateMemorySeenCount, updateMemoryRetrievalCount, setMemoryClassification, supersededMemory, mergeMemoryStats, archiveMemory, getMemoryCountsByStatus, sanitizeFtsQuery, searchMemoriesFTS, searchMemoriesFTSUnion, recordMemoryMapping, recordMemoryVerifications, getUnmappedMemoryIds, clearMemoryVerifications, getMemoryVerifications, resolveGitTopLevel, readGitHead, readGitChangedFilesSince, readGitFileChangeTimesSince, verificationFileExists, normalizeVerificationFiles, USER_MEMORY_CANDIDATE_TTL_MS, insertUserMemoryCandidates, getUserMemoryCandidates, deleteUserMemoryCandidates, pruneExpiredUserMemoryCandidates, insertUserMemory, getActiveUserMemories, updateUserMemoryContent, dismissUserMemory, getMural, BoundedSessionMap, registerLkgPersistence, LKG_SNAPSHOT_ARRAY, LKG_SNAPSHOT_OBJECT, LKG_SNAPSHOT_KEY, LKG_SNAPSHOT_STRING, LKG_SNAPSHOT_NUMBER, LKG_SNAPSHOT_BOOLEAN, LKG_SNAPSHOT_NULL, LKG_SNAPSHOT_UNDEFINED, incrementalLkgContentDigests, lkgContentDigest, captureSlot, getSlot, dropSlot, noteEntry, onNoteTrigger, peekNoteNudgeText, markNoteNudgeDelivered, clearNoteNudgeTriggerAndCooldown, resetNoteNudgeCooldownOnly, clearNoteNudgeTriggerOnly, extractM0Block, resolveMuralWire, MARKER_SUMMARY_TEXT, applyDeferredCompactionMarker, removeCompactionMarkerForSession, checkCompactionMarkerConsistency, formatDate, injectTemporalMarkers, clearInjectionCache, getVisibleMemoryIds, prepareCompartmentInjection, renderCompartmentInjection, mustMaterialize, trimMemoriesToBudgetV2, renderMemoryBlockV2, injectM0M1, RECOVERY_NO_HEAD_LIMIT, resolveOpenCodeProtectedTailBoundary, resolveWrapupProtectedTailBoundary, getRawHistoryEligibility, hasRunnableCompartmentWindow, recordHighPressureNoEligibleHead, runCompartmentAgent, snapRangeToCompartments, getActiveCompartmentRun, markActiveCompartmentRunPublished, registerActiveCompartmentRun, startCompartmentAgent, isRecompFailure, isRecompSkip, isRecompComplete, extractRecompReason, contextualizeUpgradeReason, setRecompStarting, setRecompNote, setRecompTerminal, runManagedRecomp, runManagedUpgrade };