@cortexkit/opencode-magic-context 0.49.20 → 0.49.22

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 (188) hide show
  1. package/dist/auto-search-worker.js +6 -6
  2. package/dist/chunk-embedding-write-worker.js +9 -9
  3. package/dist/{compaction-marker-candidates-b2q30cft.js → compaction-marker-candidates-31h86ph0.js} +2 -2
  4. package/dist/compaction-marker-candidates-worker.js +2 -2
  5. package/dist/{compartment-chunk-embedding-va090as0.js → compartment-chunk-embedding-he60aaa2.js} +5 -5
  6. package/dist/config/project-security.d.ts.map +1 -1
  7. package/dist/config/schema/magic-context.d.ts +37 -3
  8. package/dist/config/schema/magic-context.d.ts.map +1 -1
  9. package/dist/{conflict-warning-hook-frp3z2wk.js → conflict-warning-hook-2r32hyx6.js} +5 -5
  10. package/dist/{context-mkece1db.js → context-j7hp43a0.js} +153 -83
  11. package/dist/{embedding-backfill-gy3p78py.js → embedding-backfill-dtke6tck.js} +11 -11
  12. package/dist/embedding-worker-process.js +1 -1
  13. package/dist/embedding-worker.js +4 -4
  14. package/dist/features/magic-context/dreamer/docs-proposals.d.ts +1 -0
  15. package/dist/features/magic-context/dreamer/docs-proposals.d.ts.map +1 -1
  16. package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
  17. package/dist/features/magic-context/memory/embedding-synapse.d.ts.map +1 -1
  18. package/dist/features/magic-context/memory/embedding-worker-client.d.ts +7 -1
  19. package/dist/features/magic-context/memory/embedding-worker-client.d.ts.map +1 -1
  20. package/dist/features/magic-context/message-index-async.d.ts +7 -2
  21. package/dist/features/magic-context/message-index-async.d.ts.map +1 -1
  22. package/dist/features/magic-context/project-embedding-registry.d.ts +2 -0
  23. package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
  24. package/dist/features/magic-context/search-rerank.d.ts +9 -2
  25. package/dist/features/magic-context/search-rerank.d.ts.map +1 -1
  26. package/dist/features/magic-context/search.d.ts +2 -0
  27. package/dist/features/magic-context/search.d.ts.map +1 -1
  28. package/dist/features/magic-context/storage-db.d.ts +2 -0
  29. package/dist/features/magic-context/storage-db.d.ts.map +1 -1
  30. package/dist/features/magic-context/storage-meta-persisted.d.ts +1 -0
  31. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  32. package/dist/hooks/magic-context/auto-search-worker-client.d.ts.map +1 -1
  33. package/dist/hooks/magic-context/cache-busting-signals.d.ts +1 -0
  34. package/dist/hooks/magic-context/cache-busting-signals.d.ts.map +1 -1
  35. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  36. package/dist/hooks/magic-context/served-shape-repair.d.ts +19 -0
  37. package/dist/hooks/magic-context/served-shape-repair.d.ts.map +1 -0
  38. package/dist/hooks/magic-context/strip-content.d.ts +4 -2
  39. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
  40. package/dist/hooks/magic-context/tag-content-primitives.d.ts +1 -1
  41. package/dist/hooks/magic-context/tag-content-primitives.d.ts.map +1 -1
  42. package/dist/hooks/magic-context/tag-messages.d.ts +2 -1
  43. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  44. package/dist/hooks/magic-context/text-complete.d.ts +1 -1
  45. package/dist/hooks/magic-context/text-complete.d.ts.map +1 -1
  46. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  47. package/dist/hooks/magic-context/transform.d.ts +2 -2
  48. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  49. package/dist/{index-t7hx3qcb.js → index-11gzxvf4.js} +101 -46
  50. package/dist/{index-neb2jaed.js → index-1gtfne2c.js} +1 -1
  51. package/dist/{index-67nyj0gy.js → index-1kbznkft.js} +48 -24
  52. package/dist/{index-1pefp8ar.js → index-3svaejkh.js} +4 -4
  53. package/dist/{index-0wthn7fp.js → index-51rdvtkz.js} +35 -4
  54. package/dist/{index-kc9pn495.js → index-66eby7hx.js} +1 -1
  55. package/dist/{index-pnjwa6qa.js → index-9q1g3c5q.js} +2 -2
  56. package/dist/{index-rmd0069m.js → index-a9zvn5fe.js} +24 -10
  57. package/dist/{index-jfh3cktr.js → index-ffzhwfzy.js} +3 -3
  58. package/dist/{v2/server-1zx2pa5d.js → index-gzy5w8ya.js} +193 -4
  59. package/dist/{index-d6rp4dxh.js → index-j32jj2t8.js} +4 -4
  60. package/dist/{index-35qc6606.js → index-jfem3dgz.js} +1 -1
  61. package/dist/{index-y4a3nhtk.js → index-jjvbk92s.js} +1 -1
  62. package/dist/{index-4n7w9rad.js → index-jmq8kfe7.js} +5 -5
  63. package/dist/{index-c4b76d4t.js → index-kfyb3k6n.js} +1 -1
  64. package/dist/{index-vkc1ca9p.js → index-kq5w68dp.js} +1 -1
  65. package/dist/{index-11zf2wwc.js → index-ksq50rg0.js} +2 -2
  66. package/dist/{index-153r2q6z.js → index-m32esgmj.js} +2 -2
  67. package/dist/{index-x4k3f4mf.js → index-mnhcdfxg.js} +148 -8
  68. package/dist/{index-48stjd56.js → index-mnnkgq0q.js} +10 -4
  69. package/dist/{index-wgypt3cs.js → index-nxrsns5x.js} +2466 -1290
  70. package/dist/{index-616rsjrv.js → index-qgh1qwjj.js} +1 -1
  71. package/dist/{index-jr5na10t.js → index-rxqr723x.js} +4 -4
  72. package/dist/{index-dc8hy95c.js → index-syaazvy2.js} +123 -40
  73. package/dist/{index-adk2z5d8.js → index-wfybj1dw.js} +2 -4
  74. package/dist/{index-305y133n.js → index-whcgcfrv.js} +6 -3
  75. package/dist/{index-jmycsey7.js → index-x6cbrv9h.js} +2 -2
  76. package/dist/{index-v7r4td4c.js → index-y76rhsnr.js} +28 -17
  77. package/dist/{index-2yhtnfcf.js → index-zy67whjr.js} +26 -8
  78. package/dist/index.js +43 -42
  79. package/dist/{message-fts-rowid-map-22tevnnj.js → message-fts-rowid-map-e79b7b6x.js} +3 -3
  80. package/dist/{message-index-5qxcz6h7.js → message-index-4q8ek2fc.js} +10 -10
  81. package/dist/{message-index-bounded-n0m0t7tv.js → message-index-bounded-rydsg9r5.js} +10 -10
  82. package/dist/{message-time-backfill-0myx7fz3.js → message-time-backfill-4qva0b4f.js} +1 -1
  83. package/dist/migration-worker.js +6 -6
  84. package/dist/plugin/embedding-bootstrap.d.ts +1 -0
  85. package/dist/plugin/embedding-bootstrap.d.ts.map +1 -1
  86. package/dist/plugin/hooks/create-session-hooks.d.ts +1 -0
  87. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  88. package/dist/plugin/tool-registry.d.ts.map +1 -1
  89. package/dist/{project-embedding-registry-s2pqgec9.js → project-embedding-registry-hn529988.js} +12 -10
  90. package/dist/raw-ordinal-warmup-worker.js +8 -8
  91. package/dist/{read-session-chunk-0a8vdyqp.js → read-session-chunk-t039f0m5.js} +6 -6
  92. package/dist/{read-session-raw-y5cszf0b.js → read-session-raw-aw6jgvwg.js} +2 -2
  93. package/dist/{recomp-orchestrator-61vyha9j.js → recomp-orchestrator-hbm53jj5.js} +23 -23
  94. package/dist/{search-archive-8q9s49p5.js → search-archive-weh164mh.js} +7 -7
  95. package/dist/{search-v1y9ejws.js → search-hea079d7.js} +19 -19
  96. package/dist/{send-session-notification-0k6qzydk.js → send-session-notification-gqzkz7da.js} +4 -4
  97. package/dist/shared/sqlite.d.ts +5 -0
  98. package/dist/shared/sqlite.d.ts.map +1 -1
  99. package/dist/shared/tag-transcript.d.ts +2 -0
  100. package/dist/shared/tag-transcript.d.ts.map +1 -1
  101. package/dist/{sqlite-1rpvw2rj.js → sqlite-zdgm52sv.js} +5 -1
  102. package/dist/{storage-memory-nm7v82mj.js → storage-memory-e6a7mb0k.js} +2 -2
  103. package/dist/{storage-tags-r6nk29n4.js → storage-tags-a77q4v77.js} +2 -2
  104. package/dist/tools/ctx-search/tools.d.ts.map +1 -1
  105. package/dist/tools/ctx-search/types.d.ts +1 -0
  106. package/dist/tools/ctx-search/types.d.ts.map +1 -1
  107. package/dist/{transform-postprocess-phase-vtrgb7m6.js → transform-postprocess-phase-0b04tm1p.js} +23 -23
  108. package/dist/v2/auto-search-worker.js +6 -6
  109. package/dist/v2/chunk-embedding-write-worker.js +11 -11
  110. package/dist/v2/{compaction-marker-candidates-cfab70cs.js → compaction-marker-candidates-m4vmye3w.js} +2 -2
  111. package/dist/v2/compaction-marker-candidates-worker.js +2 -2
  112. package/dist/v2/{compartment-chunk-embedding-nbdqx1td.js → compartment-chunk-embedding-8jjmcgeg.js} +5 -5
  113. package/dist/v2/{context-cc33tv2z.js → context-ea3x7smm.js} +652 -468
  114. package/dist/v2/{embedding-backfill-yxv2h5mc.js → embedding-backfill-5e74ae0m.js} +11 -11
  115. package/dist/v2/embedding-worker-process.js +1 -1
  116. package/dist/v2/embedding-worker.js +4 -4
  117. package/dist/v2/hooks/context.d.ts.map +1 -1
  118. package/dist/v2/hooks/copied-tag-notation.d.ts +1 -1
  119. package/dist/v2/hooks/copied-tag-notation.d.ts.map +1 -1
  120. package/dist/v2/hooks/dream-timer.d.ts +2 -0
  121. package/dist/v2/hooks/dream-timer.d.ts.map +1 -1
  122. package/dist/v2/hooks/embedding-lifecycle.d.ts +7 -0
  123. package/dist/v2/hooks/embedding-lifecycle.d.ts.map +1 -0
  124. package/dist/v2/hooks/payload.d.ts.map +1 -1
  125. package/dist/v2/hooks/store.d.ts +2 -0
  126. package/dist/v2/hooks/store.d.ts.map +1 -1
  127. package/dist/v2/hooks/tools.d.ts +2 -1
  128. package/dist/v2/hooks/tools.d.ts.map +1 -1
  129. package/dist/v2/hooks/transform-features.d.ts +2 -2
  130. package/dist/v2/hooks/transform-features.d.ts.map +1 -1
  131. package/dist/v2/{message-fts-rowid-map-dg12wymk.js → message-fts-rowid-map-n8fdg2ja.js} +3 -3
  132. package/dist/v2/{message-index-bounded-f4e01xk0.js → message-index-bounded-8rcd7qq9.js} +12 -12
  133. package/dist/v2/{message-index-ydzrp6y6.js → message-index-qz9wdp82.js} +12 -12
  134. package/dist/v2/{message-time-backfill-ddh8n9gy.js → message-time-backfill-zvthw6xb.js} +1 -1
  135. package/dist/v2/migration-worker.js +8 -8
  136. package/dist/v2/{project-embedding-registry-deza9ksw.js → project-embedding-registry-v38q4xd5.js} +12 -10
  137. package/dist/v2/raw-ordinal-warmup-worker.js +8 -8
  138. package/dist/v2/{read-session-chunk-8cxfagky.js → read-session-chunk-wazfyxcg.js} +8 -8
  139. package/dist/v2/{read-session-raw-1nrrecvx.js → read-session-raw-b70cpwzj.js} +2 -2
  140. package/dist/v2/{recomp-orchestrator-47m4hv5g.js → recomp-orchestrator-b12zaptj.js} +25 -25
  141. package/dist/v2/{search-archive-e80cvc09.js → search-archive-x64rtz1z.js} +9 -9
  142. package/dist/v2/{search-fjz746zr.js → search-hza9x72a.js} +21 -21
  143. package/dist/v2/{send-session-notification-nwvrv34d.js → send-session-notification-8eqe259v.js} +4 -4
  144. package/dist/v2/{server-4sxjs6hn.js → server-132h8twc.js} +4 -4
  145. package/dist/v2/{server-271qxsf5.js → server-24g8r2d0.js} +2466 -1290
  146. package/dist/v2/{server-m91f9m5s.js → server-33nqbqkw.js} +123 -40
  147. package/dist/v2/{server-brj8j2gk.js → server-3vhxy2k5.js} +1 -1
  148. package/dist/v2/{server-55rgxfrw.js → server-4kjmrjn4.js} +1 -1
  149. package/dist/v2/{server-wyawsa88.js → server-62g58aaz.js} +2 -2
  150. package/dist/v2/{server-230fnbws.js → server-6v3cdzsx.js} +1 -1
  151. package/dist/v2/{server-ygtykank.js → server-806rzhs6.js} +1 -1
  152. package/dist/v2/{server-5arr9ecn.js → server-94wk1ey3.js} +12 -1
  153. package/dist/v2/{server-af2pght7.js → server-ab1g0wn9.js} +2 -4
  154. package/dist/v2/{server-0epqaxhd.js → server-ad18djzs.js} +26 -8
  155. package/dist/v2/{server-4nw4fqhr.js → server-bsgd4dk1.js} +1 -1
  156. package/dist/v2/{server-dj7tz4ph.js → server-d1dzgvwd.js} +1 -1
  157. package/dist/v2/{server-vn2nwcv6.js → server-d48x3m4x.js} +4 -4
  158. package/dist/v2/{server-br1x0tev.js → server-dtp8hcjh.js} +2 -2
  159. package/dist/v2/{server-a3dwxfgd.js → server-fa7vtp40.js} +7 -4
  160. package/dist/{index-1zx2pa5d.js → v2/server-gzy5w8ya.js} +193 -4
  161. package/dist/v2/{server-hqzyq8n4.js → server-j8h7bsca.js} +26 -12
  162. package/dist/v2/{server-y4a3nhtk.js → server-jjvbk92s.js} +1 -1
  163. package/dist/v2/{server-ej96a39v.js → server-m4bfaevz.js} +1186 -1046
  164. package/dist/v2/{server-63fqdghs.js → server-ppcd1qxh.js} +92 -86
  165. package/dist/v2/{server-ne8arh8t.js → server-qjvk4a9t.js} +1 -1
  166. package/dist/v2/{server-xsryvyf6.js → server-qteg2kt9.js} +4 -4
  167. package/dist/v2/{server-168pb207.js → server-rqebawx1.js} +1 -1
  168. package/dist/v2/{server-j4jnp9b5.js → server-vr4szghm.js} +35 -4
  169. package/dist/v2/{server-9x0kmta4.js → server-wwaw5npa.js} +3 -3
  170. package/dist/v2/{server-c7dxxsj7.js → server-zg5y109h.js} +33 -33
  171. package/dist/v2/server.js +6 -6
  172. package/dist/v2/{sqlite-1rpvw2rj.js → sqlite-zdgm52sv.js} +5 -1
  173. package/dist/v2/{storage-memory-nm7v82mj.js → storage-memory-e6a7mb0k.js} +2 -2
  174. package/dist/v2/{storage-tags-ss08kj5r.js → storage-tags-q71rnr9f.js} +3 -3
  175. package/dist/v2/store-reader.d.ts +2 -0
  176. package/dist/v2/store-reader.d.ts.map +1 -1
  177. package/dist/v2/{wrapup-orchestrator-639whfhq.js → wrapup-orchestrator-3ssd5yy1.js} +25 -25
  178. package/dist/wrapup-orchestrator-5vpcd1zx.js +49 -0
  179. package/package.json +2 -2
  180. package/src/config/index.test.ts +44 -0
  181. package/src/config/project-security.ts +15 -0
  182. package/src/config/rerank.test.ts +60 -0
  183. package/src/config/schema/magic-context.ts +57 -0
  184. package/src/shared/model-suggestion-retry.ts +1 -1
  185. package/src/shared/sqlite-turn-deadline.test.ts +270 -0
  186. package/src/shared/sqlite.ts +235 -7
  187. package/src/shared/tag-transcript.ts +9 -1
  188. package/dist/wrapup-orchestrator-mnvt2g8m.js +0 -49
@@ -6,7 +6,7 @@ import {
6
6
  resolveLegacyConfigSources,
7
7
  getProtectedTokensTierOverrides,
8
8
  loadPluginConfigDetailed
9
- } from "./server-5arr9ecn.js";
9
+ } from "./server-94wk1ey3.js";
10
10
  import {
11
11
  getHarness2,
12
12
  harnessOwnsOpenCodeStore2
@@ -46,7 +46,7 @@ import {
46
46
  DEFAULT_HISTORIAN_TIMEOUT_MS,
47
47
  DEFAULT_LOCAL_EMBEDDING_MODEL,
48
48
  DREAM_TASK_PROMOTION_DEFAULTS
49
- } from "./server-271qxsf5.js";
49
+ } from "./server-24g8r2d0.js";
50
50
  import {
51
51
  CANONICAL_DREAM_TASKS,
52
52
  DREAM_TASK_CAPABILITIES,
@@ -286,7 +286,7 @@ import {
286
286
  startCompartmentAgent,
287
287
  setRecompStarting2,
288
288
  setRecompTerminal2
289
- } from "./server-c7dxxsj7.js";
289
+ } from "./server-zg5y109h.js";
290
290
  import {
291
291
  resolveHistorianModel2
292
292
  } from "./server-5kym00ag.js";
@@ -311,7 +311,7 @@ import {
311
311
  openDatabaseAsync,
312
312
  isDatabasePersisted,
313
313
  getDatabasePersistenceError
314
- } from "./server-hqzyq8n4.js";
314
+ } from "./server-j8h7bsca.js";
315
315
  import {
316
316
  pruneMissingProjectIdentities,
317
317
  setHomeProjectPermission,
@@ -328,14 +328,197 @@ import {
328
328
  storedPathBelongsToIdentity,
329
329
  beginBootQuietPeriod,
330
330
  scheduleAfterBootQuiet
331
- } from "./server-ne8arh8t.js";
331
+ } from "./server-qjvk4a9t.js";
332
+ import {
333
+ registerOwnRpcServerInstance,
334
+ rpcPortDir,
335
+ rpcPortFilePath,
336
+ parseRpcPortFile,
337
+ inspectProcessesAsync
338
+ } from "./server-k3t06fxr.js";
339
+ import {
340
+ BoundedSessionMap,
341
+ LkgRecoveryFenceError,
342
+ lkgServedArrayDigest,
343
+ takeLkgRecoveryLockSweepPage,
344
+ hasCleanLkgRecoveryFence,
345
+ dirtyLkgRecoveryRevision,
346
+ ownsLkgDirtyFence,
347
+ invalidateCleanLkgRecoveryFence,
348
+ prepareLkgCaptureFence,
349
+ certifyCommittedLkgCapture,
350
+ markLkgRecoveryDirty,
351
+ gaDatabasePath,
352
+ RAW_MESSAGE_TYPES,
353
+ V2StoreReaderPool,
354
+ V2StoreReader,
355
+ cleanSearchText,
356
+ matchedSearchSnippet,
357
+ advanceSessionActivity,
358
+ backfillSessionActivity,
359
+ getLastIndexedOrdinal2,
360
+ getMessageIndexReconciliationStartOrdinal2,
361
+ isMessageIndexReconciledThrough2,
362
+ clearIndexedMessages2,
363
+ indexMessagesAfterOrdinal2,
364
+ sweepOrphanedOpenCodeMessageIndexesCooperatively2
365
+ } from "./server-ppcd1qxh.js";
366
+ import"./server-51779zs2.js";
367
+ import {
368
+ inRootAsyncContext2,
369
+ getTagIdentityWriteGeneration2,
370
+ Database2,
371
+ getSqliteDatabasePath2,
372
+ getSqliteMemoryStats2,
373
+ withSqliteBackgroundWriter2,
374
+ withSqliteTransformPass2,
375
+ withoutSqliteTransformPass2,
376
+ assertTransformWrite2,
377
+ isTransientSqliteError2,
378
+ SqliteAcquisitionBusyError2,
379
+ withAsyncPrivilegedWriter2
380
+ } from "./server-gzy5w8ya.js";
381
+ import {
382
+ createWorkerShutdown
383
+ } from "./server-cpjk5jd2.js";
384
+ import {
385
+ isRawCompactionSummaryInfo2,
386
+ extractInMemoryMessageViews2,
387
+ buildInMemoryTailRawMessages2,
388
+ RawOrdinalsNotReady2,
389
+ runSessionWarmupWorker
390
+ } from "./server-4kjmrjn4.js";
391
+ import {
392
+ resolveOpenCodeDbPath,
393
+ assertOpenCodeStoreGeneration,
394
+ openCodeDbPathExists,
395
+ recordOpenCodeDbReadFailure,
396
+ clearOpenCodeDbReadFailure,
397
+ claimOpenCodeDbDiagnosticOnce
398
+ } from "./server-2ra6pwf3.js";
399
+ import {
400
+ resolveModelCalibration,
401
+ calibrateBuckets,
402
+ resolveDecisionCalibration
403
+ } from "./server-1zx87sdm.js";
404
+ import {
405
+ protectedToolTagNumbers,
406
+ protectedToolTokenCount,
407
+ stripPersistedAssistantText,
408
+ byteSize,
409
+ stripTagPrefix,
410
+ peelLeadingMcTagNotation,
411
+ prependTag,
412
+ isThinkingPart,
413
+ currentReclaimableToolOutputCount,
414
+ isRecord,
415
+ contentTagOwnerMessageId,
416
+ estimateImageTokensFromDataUrl,
417
+ estimateToolAttachmentImageTokens,
418
+ providerVisiblePart,
419
+ normalizeTodoStateJson,
420
+ buildSyntheticTodoPart,
421
+ computeSyntheticCallId,
422
+ isSyntheticTodoPart,
423
+ countRealUserMessages,
424
+ tailHygieneStructuralSignature,
425
+ sameTailHygieneStructuralSignature,
426
+ formatTailHygienePrefixMismatch,
427
+ refreshTailHygieneBaseline,
428
+ effectiveTailHygiene,
429
+ assertTailHygieneContentUnchangedIfEnabled,
430
+ CHANNEL1_SENTINEL,
431
+ CHANNEL1_FLOOR_TOKENS,
432
+ isDroppedToolOutput,
433
+ toolOutputTokens,
434
+ decideChannel1,
435
+ evaluateChannel2,
436
+ formatChannel1Evaluation,
437
+ formatChannel2Evaluation,
438
+ buildChannel2Reminder,
439
+ buildChannel1Reminder,
440
+ estimateEmergencyDropReclaimTokens,
441
+ planEmergencyDrop,
442
+ measureEmergencyTag,
443
+ queuePendingOp,
444
+ getPendingOps,
445
+ hasPendingDropOps,
446
+ getPendingOpsCount,
447
+ clearPendingOps,
448
+ removePendingOp,
449
+ updateTagByteSize2,
450
+ getRecentTagOwnerMessageIds2,
451
+ AGE_RECLAIM_MIN_TOKENS2,
452
+ getOldestActiveUnprotectedToolTags2,
453
+ getActiveToolTagsForAgeReclaim2,
454
+ getTriggerTagTokenUpperBound2,
455
+ getActiveTagTokenTotalsByMessage2,
456
+ updateTagTokenCount2,
457
+ tryGetReasoningTokenEstimatesByMessage2,
458
+ cachedTagOwnerRatios2,
459
+ tagOwnerWarmupState2,
460
+ installTagOwnerDelta2,
461
+ installTagOwnerSummary2,
462
+ isTagOwnerSummaryReady2,
463
+ tagTokenCountIsNull2,
464
+ backfillTagTokenCounts2,
465
+ insertTag2,
466
+ updateTagStatus2,
467
+ markTagDropped2,
468
+ markWhitespaceAssistantTagInert2,
469
+ getInertWhitespaceAssistantTags2,
470
+ getInertWhitespaceAssistantTagsByNumbers2,
471
+ updateTagDropMode2,
472
+ updateCavemanDepth2,
473
+ updateTagMessageId2,
474
+ markTagsCompactedByMessageIds2,
475
+ getMaxTagNumberBySession2,
476
+ getTagNumberByMessageId2,
477
+ getAssignableTagNumberByMessageId2,
478
+ deriveTagLoadFloor2,
479
+ getTagsBySession2,
480
+ getActiveTagsBySession2,
481
+ getTailHygieneTags2,
482
+ getDroppedTagsBySession2,
483
+ getTagsByNumbers2,
484
+ getNewestToolTagNumbers2,
485
+ getDroppedTagsByNumbers2,
486
+ getMaxDroppedTagNumber2,
487
+ getTagById2,
488
+ getToolTagNumberByOwner2,
489
+ getNullOwnerToolTag2,
490
+ adoptNullOwnerToolTag2,
491
+ getCandidateToolOwners2,
492
+ pickNearestPriorOwner2
493
+ } from "./server-fa7vtp40.js";
494
+ import {
495
+ textMentionsRecentCommit,
496
+ hasMeaningfulUserText2,
497
+ extractTexts2,
498
+ extractToolCallSummaries,
499
+ getTokenizerNativeMemoryStats,
500
+ preloadTokenizer,
501
+ estimateTokens,
502
+ estimateFixedPromptTokens,
503
+ normalizeText
504
+ } from "./server-3mz2qh5a.js";
505
+ import {
506
+ stableStringify,
507
+ getTemporalDecisions,
508
+ observeTemporalDecisions,
509
+ freezeTemporalDecisions,
510
+ tagRevisionKey,
511
+ tagIdentityRevisionKey
512
+ } from "./server-rqebawx1.js";
513
+ import {
514
+ openCodeDbExists,
515
+ withReadOnlySessionDb,
516
+ latestPersistedMessageForRecovery,
517
+ latestRealUserTurnIdFromOpenCodeDb,
518
+ getMessageTimesFromOpenCodeDb,
519
+ findLastAssistantModelFromOpenCodeDb
520
+ } from "./server-3vhxy2k5.js";
332
521
  import {
333
- detectLatestTurnThinkingMismatch,
334
- isPrefixBoundThinkingModel,
335
- detectOverflow,
336
- ensureSessionMetaRow,
337
- clearCachedM0M1,
338
- clearCachedM0,
339
522
  expandToolPart,
340
523
  markHostUnservedRow,
341
524
  markCoveredInstructionRow,
@@ -363,6 +546,9 @@ import {
363
546
  transitionSessionHygieneUnits,
364
547
  readEpochFloorSnapshot,
365
548
  getProtectionWindowForSession,
549
+ ensureSessionMetaRow,
550
+ clearCachedM0M1,
551
+ clearCachedM0,
366
552
  withReplayEnvelopeSnapshot,
367
553
  invalidateReplayEnvelopeSnapshot,
368
554
  isRustMarkerAdmissionFenced,
@@ -453,6 +639,9 @@ import {
453
639
  getReasoningRemovalState,
454
640
  addRemovedReasoningIds,
455
641
  markDropLeavesReasoning,
642
+ detectLatestTurnThinkingMismatch,
643
+ isPrefixBoundThinkingModel,
644
+ detectOverflow,
456
645
  modelAcceptsEmptyContent,
457
646
  isAnthropicFamilyRoute,
458
647
  neutralizeDroppedReasoningPart,
@@ -466,12 +655,15 @@ import {
466
655
  isInActiveAnthropicTurn,
467
656
  activeAnthropicTurnStart,
468
657
  hasAnthropicReasoning,
658
+ markServedShapeRepair,
659
+ prepareServedShapeRepair,
469
660
  stripSystemInjectedMessages,
470
661
  stripDroppedPlaceholderMessages,
471
662
  replayClearedReasoning,
472
663
  replayStrippedInlineThinking,
473
664
  clearOldReasoning,
474
665
  stripClearedReasoning,
666
+ captureInlineThinkingRepairs,
475
667
  stripInlineThinking,
476
668
  findReasoningBearingAssistantIds,
477
669
  findLatestAssistantReasoningMutationExemptMessage,
@@ -523,7 +715,24 @@ import {
523
715
  readRawSessionMessageById2,
524
716
  readSessionChunk2,
525
717
  readRawSessionSeedTail2
526
- } from "./server-ej96a39v.js";
718
+ } from "./server-m4bfaevz.js";
719
+ import {
720
+ getCurrentToolSetHash,
721
+ recordToolDefinition,
722
+ getMeasuredToolDefinitionTokens
723
+ } from "./server-d1dzgvwd.js";
724
+ import"./server-dtp8hcjh.js";
725
+ import {
726
+ SubcClient,
727
+ connectionFileExists,
728
+ SYNAPSE_DEFAULT_MODEL,
729
+ toSynapseLaneDescriptor,
730
+ formatSynapseLaneDescriptor,
731
+ SynapseEmbeddingProvider
732
+ } from "./server-ab1g0wn9.js";
733
+ import {
734
+ deleteChunkEmbedBackoffForSession2
735
+ } from "./server-62g58aaz.js";
527
736
  import {
528
737
  embedPauseBySession,
529
738
  embedRunStateBySession,
@@ -535,6 +744,7 @@ import {
535
744
  getEmbedDrainUiStatus,
536
745
  clearEmbedSessionState,
537
746
  describeShadowBackfillWriteRefusal2,
747
+ retainProjectEmbedding2,
538
748
  markProjectLoadUntrusted2,
539
749
  drainProjectEmbeddingIdentityMaintenance2,
540
750
  drainStaleEmbeddingIdentitiesForProject2,
@@ -552,212 +762,7 @@ import {
552
762
  embedSessionCompartmentChunks2,
553
763
  getEmbeddingCoverageStatus2,
554
764
  getAutoEmbeddingSessionCoverage2
555
- } from "./server-0epqaxhd.js";
556
- import {
557
- textMentionsRecentCommit,
558
- hasMeaningfulUserText2,
559
- extractTexts2,
560
- extractToolCallSummaries,
561
- getTokenizerNativeMemoryStats,
562
- preloadTokenizer,
563
- estimateTokens,
564
- estimateFixedPromptTokens,
565
- normalizeText
566
- } from "./server-3mz2qh5a.js";
567
- import {
568
- SubcClient,
569
- connectionFileExists,
570
- SYNAPSE_DEFAULT_MODEL,
571
- toSynapseLaneDescriptor,
572
- formatSynapseLaneDescriptor,
573
- SynapseEmbeddingProvider
574
- } from "./server-af2pght7.js";
575
- import {
576
- inRootAsyncContext2,
577
- getTagIdentityWriteGeneration2,
578
- Database2,
579
- getSqliteDatabasePath2,
580
- getSqliteMemoryStats2,
581
- withSqliteBackgroundWriter2,
582
- withSqliteTransformPass2,
583
- withoutSqliteTransformPass2,
584
- assertTransformWrite2,
585
- isTransientSqliteError2,
586
- SqliteAcquisitionBusyError2,
587
- withAsyncPrivilegedWriter2
588
- } from "./server-1zx2pa5d.js";
589
- import"./server-51779zs2.js";
590
- import {
591
- createWorkerShutdown
592
- } from "./server-cpjk5jd2.js";
593
- import {
594
- isRawCompactionSummaryInfo2,
595
- extractInMemoryMessageViews2,
596
- buildInMemoryTailRawMessages2,
597
- RawOrdinalsNotReady2,
598
- runSessionWarmupWorker
599
- } from "./server-55rgxfrw.js";
600
- import"./server-br1x0tev.js";
601
- import {
602
- deleteChunkEmbedBackoffForSession2
603
- } from "./server-wyawsa88.js";
604
- import {
605
- registerOwnRpcServerInstance,
606
- rpcPortDir,
607
- rpcPortFilePath,
608
- parseRpcPortFile,
609
- inspectProcessesAsync
610
- } from "./server-k3t06fxr.js";
611
- import {
612
- BoundedSessionMap,
613
- LkgRecoveryFenceError,
614
- lkgServedArrayDigest,
615
- takeLkgRecoveryLockSweepPage,
616
- hasCleanLkgRecoveryFence,
617
- dirtyLkgRecoveryRevision,
618
- ownsLkgDirtyFence,
619
- invalidateCleanLkgRecoveryFence,
620
- prepareLkgCaptureFence,
621
- certifyCommittedLkgCapture,
622
- markLkgRecoveryDirty,
623
- cleanSearchText,
624
- matchedSearchSnippet,
625
- gaDatabasePath,
626
- RAW_MESSAGE_TYPES,
627
- V2StoreReaderPool,
628
- V2StoreReader,
629
- advanceSessionActivity,
630
- backfillSessionActivity,
631
- getLastIndexedOrdinal2,
632
- getMessageIndexReconciliationStartOrdinal2,
633
- isMessageIndexReconciledThrough2,
634
- indexMessagesAfterOrdinal2,
635
- sweepOrphanedOpenCodeMessageIndexesCooperatively2
636
- } from "./server-63fqdghs.js";
637
- import {
638
- stableStringify,
639
- getTemporalDecisions,
640
- observeTemporalDecisions,
641
- freezeTemporalDecisions,
642
- tagRevisionKey,
643
- tagIdentityRevisionKey
644
- } from "./server-168pb207.js";
645
- import {
646
- resolveModelCalibration,
647
- calibrateBuckets,
648
- resolveDecisionCalibration
649
- } from "./server-1zx87sdm.js";
650
- import {
651
- protectedToolTagNumbers,
652
- protectedToolTokenCount,
653
- stripPersistedAssistantText,
654
- byteSize,
655
- stripTagPrefix,
656
- peelLeadingMcTagNotation,
657
- prependTag,
658
- isThinkingPart,
659
- currentReclaimableToolOutputCount,
660
- isRecord,
661
- contentTagOwnerMessageId,
662
- estimateImageTokensFromDataUrl,
663
- estimateToolAttachmentImageTokens,
664
- providerVisiblePart,
665
- normalizeTodoStateJson,
666
- buildSyntheticTodoPart,
667
- computeSyntheticCallId,
668
- isSyntheticTodoPart,
669
- countRealUserMessages,
670
- tailHygieneStructuralSignature,
671
- sameTailHygieneStructuralSignature,
672
- formatTailHygienePrefixMismatch,
673
- refreshTailHygieneBaseline,
674
- effectiveTailHygiene,
675
- assertTailHygieneContentUnchangedIfEnabled,
676
- CHANNEL1_SENTINEL,
677
- CHANNEL1_FLOOR_TOKENS,
678
- isDroppedToolOutput,
679
- toolOutputTokens,
680
- decideChannel1,
681
- evaluateChannel2,
682
- formatChannel1Evaluation,
683
- formatChannel2Evaluation,
684
- buildChannel2Reminder,
685
- buildChannel1Reminder,
686
- estimateEmergencyDropReclaimTokens,
687
- planEmergencyDrop,
688
- measureEmergencyTag,
689
- queuePendingOp,
690
- getPendingOps,
691
- hasPendingDropOps,
692
- getPendingOpsCount,
693
- clearPendingOps,
694
- removePendingOp,
695
- updateTagByteSize2,
696
- getRecentTagOwnerMessageIds2,
697
- AGE_RECLAIM_MIN_TOKENS2,
698
- getOldestActiveUnprotectedToolTags2,
699
- getActiveToolTagsForAgeReclaim2,
700
- getTriggerTagTokenUpperBound2,
701
- getActiveTagTokenTotalsByMessage2,
702
- updateTagTokenCount2,
703
- tryGetReasoningTokenEstimatesByMessage2,
704
- cachedTagOwnerRatios2,
705
- tagOwnerWarmupState2,
706
- installTagOwnerDelta2,
707
- installTagOwnerSummary2,
708
- isTagOwnerSummaryReady2,
709
- tagTokenCountIsNull2,
710
- backfillTagTokenCounts2,
711
- insertTag2,
712
- updateTagStatus2,
713
- markTagDropped2,
714
- markWhitespaceAssistantTagInert2,
715
- getInertWhitespaceAssistantTags2,
716
- getInertWhitespaceAssistantTagsByNumbers2,
717
- updateTagDropMode2,
718
- updateCavemanDepth2,
719
- updateTagMessageId2,
720
- markTagsCompactedByMessageIds2,
721
- getMaxTagNumberBySession2,
722
- getTagNumberByMessageId2,
723
- getAssignableTagNumberByMessageId2,
724
- deriveTagLoadFloor2,
725
- getTagsBySession2,
726
- getActiveTagsBySession2,
727
- getTailHygieneTags2,
728
- getDroppedTagsBySession2,
729
- getTagsByNumbers2,
730
- getNewestToolTagNumbers2,
731
- getDroppedTagsByNumbers2,
732
- getMaxDroppedTagNumber2,
733
- getTagById2,
734
- getToolTagNumberByOwner2,
735
- getNullOwnerToolTag2,
736
- adoptNullOwnerToolTag2,
737
- getCandidateToolOwners2,
738
- pickNearestPriorOwner2
739
- } from "./server-a3dwxfgd.js";
740
- import {
741
- resolveOpenCodeDbPath,
742
- assertOpenCodeStoreGeneration,
743
- openCodeDbPathExists,
744
- recordOpenCodeDbReadFailure,
745
- clearOpenCodeDbReadFailure,
746
- claimOpenCodeDbDiagnosticOnce
747
- } from "./server-2ra6pwf3.js";
748
- import {
749
- openCodeDbExists,
750
- withReadOnlySessionDb,
751
- latestPersistedMessageForRecovery,
752
- latestRealUserTurnIdFromOpenCodeDb,
753
- getMessageTimesFromOpenCodeDb,
754
- findLastAssistantModelFromOpenCodeDb
755
- } from "./server-brj8j2gk.js";
756
- import {
757
- getCurrentToolSetHash,
758
- recordToolDefinition,
759
- getMeasuredToolDefinitionTokens
760
- } from "./server-dj7tz4ph.js";
765
+ } from "./server-ad18djzs.js";
761
766
  import {
762
767
  V2_MEMORY_CATEGORIES,
763
768
  CATEGORY_PRIORITY
@@ -770,7 +775,7 @@ import {
770
775
  resolveStoredPathWorkspaceIdentity,
771
776
  storedPathBelongsToWorkspace,
772
777
  computeWorkspaceEpochFingerprint
773
- } from "./server-9x0kmta4.js";
778
+ } from "./server-wwaw5npa.js";
774
779
  import {
775
780
  configureContextDatabasePragmas2
776
781
  } from "./server-fb3zxn06.js";
@@ -816,7 +821,7 @@ import {
816
821
  readGitFileChangeTimesSince,
817
822
  verificationFileExists,
818
823
  normalizeVerificationFiles
819
- } from "./server-vn2nwcv6.js";
824
+ } from "./server-d48x3m4x.js";
820
825
  import {
821
826
  deriveTriggerBudget2,
822
827
  deriveHistorianChunkTokens2,
@@ -824,7 +829,7 @@ import {
824
829
  resolveHistorianProducerLimits2,
825
830
  resolveHistorianContextLimit2
826
831
  } from "./server-53eh1r8r.js";
827
- import"./server-ygtykank.js";
832
+ import"./server-806rzhs6.js";
828
833
  import {
829
834
  isEmbeddingHostBusy2
830
835
  } from "./server-qt1qqasc.js";
@@ -837,7 +842,7 @@ import {
837
842
  releaseGitSweepLease,
838
843
  recordSessionProjectIdentity,
839
844
  hasRecordedSessionProjectIdentity
840
- } from "./server-4nw4fqhr.js";
845
+ } from "./server-bsgd4dk1.js";
841
846
  import {
842
847
  saveEmbeddingIfHashMatches,
843
848
  invalidateProject2,
@@ -847,10 +852,10 @@ import {
847
852
  getCachedLocalEmbeddingPooling,
848
853
  preflightLocalEmbeddingPooling,
849
854
  getLocalEmbeddingNativeMemoryStats
850
- } from "./server-j4jnp9b5.js";
855
+ } from "./server-vr4szghm.js";
851
856
  import {
852
857
  cosineSimilarity
853
- } from "./server-xsryvyf6.js";
858
+ } from "./server-qteg2kt9.js";
854
859
  import {
855
860
  computeCueContentHash,
856
861
  hasMuralCueColumns,
@@ -875,7 +880,7 @@ import {
875
880
  mergeMemoryStats2,
876
881
  archiveMemory2,
877
882
  getMemoryCountsByStatus2
878
- } from "./server-y4a3nhtk.js";
883
+ } from "./server-jjvbk92s.js";
879
884
  import {
880
885
  registerNotificationSink2,
881
886
  pushNotification2,
@@ -887,7 +892,7 @@ import"./server-1bw1wcbp.js";
887
892
  import {
888
893
  flushIgnoredMessages2,
889
894
  sendStatusNotification2
890
- } from "./server-230fnbws.js";
895
+ } from "./server-6v3cdzsx.js";
891
896
  import {
892
897
  renderSingleStoreMigrationRequiredRefusal,
893
898
  SingleStoreMigrationRequiredError,
@@ -907,14 +912,14 @@ import {
907
912
  resolveMemoriesByIdsForSearch2,
908
913
  unifiedSearch2,
909
914
  formatSearchResults2
910
- } from "./server-m91f9m5s.js";
915
+ } from "./server-33nqbqkw.js";
911
916
  import {
912
917
  resolvePromptContext2
913
918
  } from "./server-fmsr7v69.js";
914
919
  import"./server-kaqs6h31.js";
915
920
  import {
916
921
  renderSearchArchiveOffThread2
917
- } from "./server-4sxjs6hn.js";
922
+ } from "./server-132h8twc.js";
918
923
  import {
919
924
  compareSemverCore
920
925
  } from "./server-84w6rvvf.js";
@@ -1730,6 +1735,270 @@ function summarizeManualDream(summary) {
1730
1735
  `);
1731
1736
  }
1732
1737
 
1738
+ // src/features/magic-context/message-index-async.ts
1739
+ var indexCancellations = new Map;
1740
+ var sessionEpochs = new Map;
1741
+ var workerMeasurements = new WeakMap;
1742
+ function isDatabaseLockedError(error) {
1743
+ if (!error || typeof error !== "object")
1744
+ return false;
1745
+ const e = error;
1746
+ if (typeof e.code === "string") {
1747
+ if (e.code === "SQLITE_BUSY" || e.code === "SQLITE_LOCKED")
1748
+ return true;
1749
+ }
1750
+ if (typeof e.message === "string") {
1751
+ if (/database is locked/i.test(e.message))
1752
+ return true;
1753
+ if (/sqlite_(busy|locked)/i.test(e.message))
1754
+ return true;
1755
+ }
1756
+ return false;
1757
+ }
1758
+ var RECONCILIATION_BATCH_SIZE = 100;
1759
+
1760
+ class MagicContextMessageIndexHeapHolder {
1761
+ reconciledSessions = new Set;
1762
+ reconciledSnapshots = new Map;
1763
+ stalledSessions = new Set;
1764
+ reconciliationScheduledSessions = new Set;
1765
+ clearAndReindexScheduledSessions = new Map;
1766
+ sessionLocks = new Map;
1767
+ incrementalTimers = new Map;
1768
+ pendingIncrementalKeys = new Set;
1769
+ completedIncrementalKeys = new Set;
1770
+ activeReconcilerBuffers = new Map;
1771
+ }
1772
+ var heapHolder = new MagicContextMessageIndexHeapHolder;
1773
+ function clearCompletedIncrementalKeys(sessionId) {
1774
+ const prefix = `${sessionId}\x00`;
1775
+ for (const key of heapHolder.completedIncrementalKeys) {
1776
+ if (key.startsWith(prefix))
1777
+ heapHolder.completedIncrementalKeys.delete(key);
1778
+ }
1779
+ }
1780
+ var PREPARE_RETRY_MS = 60000;
1781
+ async function sourceReady(source, sessionId) {
1782
+ const prepare = source?.prepare;
1783
+ return typeof prepare === "function" ? prepare(sessionId) : true;
1784
+ }
1785
+ function defer(fn) {
1786
+ const immediate = globalThis.setImmediate;
1787
+ if (typeof immediate === "function") {
1788
+ inRootAsyncContext2(() => immediate(fn));
1789
+ return;
1790
+ }
1791
+ inRootAsyncContext2(() => setTimeout(fn, 0));
1792
+ }
1793
+ function yieldToEventLoop() {
1794
+ return new Promise((resolve) => defer(resolve));
1795
+ }
1796
+ function runWithSessionLock(sessionId, operation) {
1797
+ const previous = heapHolder.sessionLocks.get(sessionId) ?? Promise.resolve();
1798
+ const run = previous.catch(() => {
1799
+ return;
1800
+ }).then(async () => {
1801
+ await operation();
1802
+ });
1803
+ heapHolder.sessionLocks.set(sessionId, run);
1804
+ run.finally(() => {
1805
+ if (heapHolder.sessionLocks.get(sessionId) === run) {
1806
+ heapHolder.sessionLocks.delete(sessionId);
1807
+ }
1808
+ }).catch(() => {
1809
+ return;
1810
+ });
1811
+ return run;
1812
+ }
1813
+ function logIndexingError(sessionId, action, error) {
1814
+ if (isDatabaseLockedError(error)) {
1815
+ sessionLog2(sessionId, `message FTS async ${action} skipped (database busy; will retry on next reconciliation)`);
1816
+ return;
1817
+ }
1818
+ sessionLog2(sessionId, `message FTS async ${action} failed: ${error instanceof Error ? error.message : String(error)}`);
1819
+ log2(`[message-index-async] ${action} failed for ${sessionId}:`, error);
1820
+ }
1821
+ function serializedMessageBytes(messages) {
1822
+ try {
1823
+ return Buffer.byteLength(JSON.stringify(messages));
1824
+ } catch {
1825
+ return 0;
1826
+ }
1827
+ }
1828
+ function logReconciliationStall(sessionId, reason) {
1829
+ if (heapHolder.stalledSessions.has(sessionId))
1830
+ return;
1831
+ heapHolder.stalledSessions.add(sessionId);
1832
+ sessionLog2(sessionId, `message FTS reconciliation stalled: ${reason}; will retry`);
1833
+ }
1834
+ async function reconcileSessionIndex(db, sessionId, readMessages) {
1835
+ if (!await sourceReady(readMessages, sessionId)) {
1836
+ logReconciliationStall(sessionId, "raw message reader is not ready");
1837
+ return false;
1838
+ }
1839
+ await runWithSessionLock(sessionId, async () => {
1840
+ if (!readMessages.getRevision && heapHolder.reconciledSessions.has(sessionId))
1841
+ return;
1842
+ let fallbackSnapshot = null;
1843
+ try {
1844
+ const fullReader = typeof readMessages === "function" ? readMessages : null;
1845
+ const revision = readMessages.getRevision?.(sessionId);
1846
+ const previous = heapHolder.reconciledSnapshots.get(sessionId);
1847
+ const finalWatermark = previous && revision === previous.revision ? previous.count : revision !== undefined && readMessages.getCountAfterRevision ? previous && revision > previous.revision ? previous.count + readMessages.getCountAfterRevision(sessionId, previous.revision, revision) : readMessages.getCountAfterRevision(sessionId, -1, revision) : readMessages.getCount ? readMessages.getCount(sessionId) : (fallbackSnapshot = fullReader?.(sessionId) ?? []).length;
1848
+ let cursor = getMessageIndexReconciliationStartOrdinal2(db, sessionId);
1849
+ let after = cursor === previous?.count ? previous.after : undefined;
1850
+ while (cursor < finalWatermark) {
1851
+ const pageEnd = Math.min(finalWatermark, cursor + RECONCILIATION_BATCH_SIZE);
1852
+ const messages = readMessages.readPage ? readMessages.readPage(sessionId, cursor, RECONCILIATION_BATCH_SIZE, finalWatermark, after) : (fallbackSnapshot ?? []).filter((message) => message.ordinal > cursor && message.ordinal <= pageEnd);
1853
+ const retainedMessages = fallbackSnapshot ?? messages;
1854
+ heapHolder.activeReconcilerBuffers.set(sessionId, retainedMessages);
1855
+ withSqliteBackgroundWriter2(() => indexMessagesAfterOrdinal2(db, sessionId, messages, cursor, pageEnd));
1856
+ const nextCursor = getMessageIndexReconciliationStartOrdinal2(db, sessionId);
1857
+ if (nextCursor <= cursor)
1858
+ break;
1859
+ cursor = nextCursor;
1860
+ const last = messages.at(-1);
1861
+ after = last?.ordinal === cursor && typeof last.createdAt === "number" ? { timeCreated: last.createdAt, id: last.id } : undefined;
1862
+ if (cursor < finalWatermark) {
1863
+ await yieldToEventLoop();
1864
+ }
1865
+ }
1866
+ if (isMessageIndexReconciledThrough2(db, sessionId, finalWatermark)) {
1867
+ heapHolder.reconciledSessions.add(sessionId);
1868
+ if (revision !== undefined) {
1869
+ if (!after && finalWatermark > 0 && readMessages.readPage) {
1870
+ const last = readMessages.readPage(sessionId, finalWatermark - 1, 1, finalWatermark).at(-1);
1871
+ if (last?.ordinal === finalWatermark && typeof last.createdAt === "number")
1872
+ after = { timeCreated: last.createdAt, id: last.id };
1873
+ }
1874
+ heapHolder.reconciledSnapshots.set(sessionId, {
1875
+ revision,
1876
+ count: finalWatermark,
1877
+ after
1878
+ });
1879
+ }
1880
+ } else {
1881
+ logReconciliationStall(sessionId, `gap after ordinal ${cursor} (store count ${finalWatermark})`);
1882
+ }
1883
+ } finally {
1884
+ heapHolder.activeReconcilerBuffers.delete(sessionId);
1885
+ }
1886
+ });
1887
+ return true;
1888
+ }
1889
+ function scheduleReconciliation(db, sessionId, readMessages) {
1890
+ if (!readMessages.getRevision && heapHolder.reconciledSessions.has(sessionId) || heapHolder.reconciliationScheduledSessions.has(sessionId)) {
1891
+ return;
1892
+ }
1893
+ heapHolder.reconciliationScheduledSessions.add(sessionId);
1894
+ scheduleAfterBootQuiet(() => {
1895
+ defer(() => {
1896
+ let appendedDuringReconciliation = false;
1897
+ const previousSnapshot = heapHolder.reconciledSnapshots.get(sessionId);
1898
+ reconcileSessionIndex(db, sessionId, readMessages).then((ran) => {
1899
+ if (ran) {
1900
+ const snapshot = heapHolder.reconciledSnapshots.get(sessionId);
1901
+ appendedDuringReconciliation = snapshot !== undefined && snapshot !== previousSnapshot && readMessages.getRevision !== undefined && readMessages.getRevision(sessionId) !== snapshot.revision;
1902
+ return;
1903
+ }
1904
+ inRootAsyncContext2(() => setTimeout(() => {
1905
+ heapHolder.reconciliationScheduledSessions.delete(sessionId);
1906
+ scheduleReconciliation(db, sessionId, readMessages);
1907
+ }, PREPARE_RETRY_MS)).unref?.();
1908
+ }).catch((error) => {
1909
+ logReconciliationStall(sessionId, error instanceof Error ? error.message : String(error));
1910
+ if (isDatabaseLockedError(error))
1911
+ inRootAsyncContext2(() => setTimeout(() => scheduleReconciliation(db, sessionId, readMessages), 1000)).unref();
1912
+ }).finally(() => {
1913
+ heapHolder.reconciliationScheduledSessions.delete(sessionId);
1914
+ if (appendedDuringReconciliation)
1915
+ scheduleReconciliation(db, sessionId, readMessages);
1916
+ });
1917
+ });
1918
+ });
1919
+ }
1920
+ async function sweepOrphanedOpenCodeMessageIndexesOffThread(db, openSource, options = {}) {
1921
+ if (getHarness2() === "opencode" || getHarness2() === "opencode2")
1922
+ options = {
1923
+ ...options,
1924
+ fenceLockNames: options.fenceLockNames ?? takeLkgRecoveryLockSweepPage()
1925
+ };
1926
+ if (getHarness2() === "opencode2")
1927
+ openSource = () => new Database2(gaDatabasePath(getDataDir(), process.env.OPENCODE_CHANNEL ?? "latest"), {
1928
+ readonly: true,
1929
+ fileMustExist: true
1930
+ });
1931
+ const path = getSqliteDatabasePath2(db);
1932
+ if (!path || getHarness2() !== "opencode" && getHarness2() !== "opencode2")
1933
+ return sweepOrphanedOpenCodeMessageIndexesCooperatively2(db, openSource, options);
1934
+ let source = null;
1935
+ let sourcePath = null;
1936
+ try {
1937
+ source = openSource();
1938
+ if (source)
1939
+ sourcePath = getSqliteDatabasePath2(source);
1940
+ } catch {} finally {
1941
+ if (sourcePath)
1942
+ source?.close();
1943
+ }
1944
+ if (!sourcePath)
1945
+ return sweepOrphanedOpenCodeMessageIndexesCooperatively2(db, () => source, options);
1946
+ const reply = await runSessionWarmupWorker({
1947
+ path,
1948
+ sessionId: "",
1949
+ harness: getHarness2(),
1950
+ orphanSweep: { sourcePath, options }
1951
+ }, {});
1952
+ if (!("orphanSweep" in reply))
1953
+ throw new Error("message history orphan sweep worker failed");
1954
+ return reply.orphanSweep;
1955
+ }
1956
+ function scheduleClearAndReindex(db, sessionId, readMessages) {
1957
+ heapHolder.reconciledSessions.delete(sessionId);
1958
+ heapHolder.reconciledSnapshots.delete(sessionId);
1959
+ heapHolder.reconciliationScheduledSessions.delete(sessionId);
1960
+ clearCompletedIncrementalKeys(sessionId);
1961
+ const existing = heapHolder.clearAndReindexScheduledSessions.get(sessionId);
1962
+ if (existing) {
1963
+ existing.source = readMessages;
1964
+ return;
1965
+ }
1966
+ const pending = { source: readMessages };
1967
+ heapHolder.clearAndReindexScheduledSessions.set(sessionId, pending);
1968
+ scheduleAfterBootQuiet(() => {
1969
+ defer(() => {
1970
+ let cleared = false;
1971
+ runWithSessionLock(sessionId, () => {
1972
+ if (heapHolder.clearAndReindexScheduledSessions.get(sessionId) !== pending)
1973
+ return;
1974
+ heapHolder.clearAndReindexScheduledSessions.delete(sessionId);
1975
+ heapHolder.reconciledSessions.delete(sessionId);
1976
+ heapHolder.reconciledSnapshots.delete(sessionId);
1977
+ clearCompletedIncrementalKeys(sessionId);
1978
+ clearIndexedMessages2(db, sessionId);
1979
+ cleared = true;
1980
+ }).then(() => cleared ? reconcileSessionIndex(db, sessionId, pending.source) : undefined).catch((error) => {
1981
+ heapHolder.reconciledSessions.delete(sessionId);
1982
+ if (heapHolder.clearAndReindexScheduledSessions.get(sessionId) === pending)
1983
+ heapHolder.clearAndReindexScheduledSessions.delete(sessionId);
1984
+ logIndexingError(sessionId, "clear and reindex", error);
1985
+ });
1986
+ });
1987
+ });
1988
+ }
1989
+ function getMessageIndexQueueHeapStats() {
1990
+ return {
1991
+ queueLength: heapHolder.reconciliationScheduledSessions.size + heapHolder.incrementalTimers.size + heapHolder.pendingIncrementalKeys.size,
1992
+ reconciliationScheduled: heapHolder.reconciliationScheduledSessions.size,
1993
+ incrementalTimers: heapHolder.incrementalTimers.size,
1994
+ pendingIncremental: heapHolder.pendingIncrementalKeys.size,
1995
+ activeSessionLocks: heapHolder.sessionLocks.size,
1996
+ completedIncrementalKeys: heapHolder.completedIncrementalKeys.size,
1997
+ activeBufferMessages: [...heapHolder.activeReconcilerBuffers.values()].reduce((sum, messages) => sum + messages.length, 0),
1998
+ activeBufferBytes: [...heapHolder.activeReconcilerBuffers.values()].reduce((sum, messages) => sum + serializedMessageBytes(messages), 0)
1999
+ };
2000
+ }
2001
+
1733
2002
  // src/shared/model-cache-ttl.ts
1734
2003
  var MODEL_CACHE_LIFETIMES = [
1735
2004
  {
@@ -3308,197 +3577,6 @@ function capDreamerReadOutput(input, output) {
3308
3577
  return true;
3309
3578
  }
3310
3579
 
3311
- // src/features/magic-context/message-index-async.ts
3312
- var indexCancellations = new Map;
3313
- var sessionEpochs = new Map;
3314
- var workerMeasurements = new WeakMap;
3315
- function isDatabaseLockedError(error) {
3316
- if (!error || typeof error !== "object")
3317
- return false;
3318
- const e = error;
3319
- if (typeof e.code === "string") {
3320
- if (e.code === "SQLITE_BUSY" || e.code === "SQLITE_LOCKED")
3321
- return true;
3322
- }
3323
- if (typeof e.message === "string") {
3324
- if (/database is locked/i.test(e.message))
3325
- return true;
3326
- if (/sqlite_(busy|locked)/i.test(e.message))
3327
- return true;
3328
- }
3329
- return false;
3330
- }
3331
- var RECONCILIATION_BATCH_SIZE = 100;
3332
-
3333
- class MagicContextMessageIndexHeapHolder {
3334
- reconciledSessions = new Set;
3335
- reconciliationScheduledSessions = new Set;
3336
- clearAndReindexScheduledSessions = new Map;
3337
- sessionLocks = new Map;
3338
- incrementalTimers = new Map;
3339
- pendingIncrementalKeys = new Set;
3340
- completedIncrementalKeys = new Set;
3341
- activeReconcilerBuffers = new Map;
3342
- }
3343
- var heapHolder = new MagicContextMessageIndexHeapHolder;
3344
- var PREPARE_RETRY_MS = 60000;
3345
- async function sourceReady(source, sessionId) {
3346
- const prepare = source?.prepare;
3347
- return typeof prepare === "function" ? prepare(sessionId) : true;
3348
- }
3349
- function defer(fn) {
3350
- const immediate = globalThis.setImmediate;
3351
- if (typeof immediate === "function") {
3352
- inRootAsyncContext2(() => immediate(fn));
3353
- return;
3354
- }
3355
- inRootAsyncContext2(() => setTimeout(fn, 0));
3356
- }
3357
- function yieldToEventLoop() {
3358
- return new Promise((resolve) => defer(resolve));
3359
- }
3360
- function runWithSessionLock(sessionId, operation) {
3361
- const previous = heapHolder.sessionLocks.get(sessionId) ?? Promise.resolve();
3362
- const run = previous.catch(() => {
3363
- return;
3364
- }).then(async () => {
3365
- await operation();
3366
- });
3367
- heapHolder.sessionLocks.set(sessionId, run);
3368
- run.finally(() => {
3369
- if (heapHolder.sessionLocks.get(sessionId) === run) {
3370
- heapHolder.sessionLocks.delete(sessionId);
3371
- }
3372
- }).catch(() => {
3373
- return;
3374
- });
3375
- return run;
3376
- }
3377
- function logIndexingError(sessionId, action, error) {
3378
- if (isDatabaseLockedError(error)) {
3379
- sessionLog2(sessionId, `message FTS async ${action} skipped (database busy; will retry on next reconciliation)`);
3380
- return;
3381
- }
3382
- sessionLog2(sessionId, `message FTS async ${action} failed: ${error instanceof Error ? error.message : String(error)}`);
3383
- log2(`[message-index-async] ${action} failed for ${sessionId}:`, error);
3384
- }
3385
- function serializedMessageBytes(messages) {
3386
- try {
3387
- return Buffer.byteLength(JSON.stringify(messages));
3388
- } catch {
3389
- return 0;
3390
- }
3391
- }
3392
- async function reconcileSessionIndex(db, sessionId, readMessages) {
3393
- if (!await sourceReady(readMessages, sessionId))
3394
- return false;
3395
- await runWithSessionLock(sessionId, async () => {
3396
- if (heapHolder.reconciledSessions.has(sessionId))
3397
- return;
3398
- let fallbackSnapshot = null;
3399
- try {
3400
- const fullReader = typeof readMessages === "function" ? readMessages : null;
3401
- const finalWatermark = readMessages.getCount ? readMessages.getCount(sessionId) : (fallbackSnapshot = fullReader?.(sessionId) ?? []).length;
3402
- let cursor = getMessageIndexReconciliationStartOrdinal2(db, sessionId);
3403
- let after;
3404
- while (cursor < finalWatermark) {
3405
- const pageEnd = Math.min(finalWatermark, cursor + RECONCILIATION_BATCH_SIZE);
3406
- const messages = readMessages.readPage ? readMessages.readPage(sessionId, cursor, RECONCILIATION_BATCH_SIZE, finalWatermark, after) : (fallbackSnapshot ?? []).filter((message) => message.ordinal > cursor && message.ordinal <= pageEnd);
3407
- const retainedMessages = fallbackSnapshot ?? messages;
3408
- heapHolder.activeReconcilerBuffers.set(sessionId, retainedMessages);
3409
- withSqliteBackgroundWriter2(() => indexMessagesAfterOrdinal2(db, sessionId, messages, cursor, pageEnd));
3410
- const nextCursor = getMessageIndexReconciliationStartOrdinal2(db, sessionId);
3411
- if (nextCursor <= cursor)
3412
- break;
3413
- cursor = nextCursor;
3414
- const last = messages.at(-1);
3415
- after = last?.ordinal === cursor && typeof last.createdAt === "number" ? { timeCreated: last.createdAt, id: last.id } : undefined;
3416
- if (cursor < finalWatermark) {
3417
- await yieldToEventLoop();
3418
- }
3419
- }
3420
- if (isMessageIndexReconciledThrough2(db, sessionId, finalWatermark)) {
3421
- heapHolder.reconciledSessions.add(sessionId);
3422
- }
3423
- } finally {
3424
- heapHolder.activeReconcilerBuffers.delete(sessionId);
3425
- }
3426
- });
3427
- return true;
3428
- }
3429
- function scheduleReconciliation(db, sessionId, readMessages) {
3430
- if (heapHolder.reconciledSessions.has(sessionId) || heapHolder.reconciliationScheduledSessions.has(sessionId)) {
3431
- return;
3432
- }
3433
- heapHolder.reconciliationScheduledSessions.add(sessionId);
3434
- scheduleAfterBootQuiet(() => {
3435
- defer(() => {
3436
- reconcileSessionIndex(db, sessionId, readMessages).then((ran) => {
3437
- if (ran)
3438
- return;
3439
- inRootAsyncContext2(() => setTimeout(() => {
3440
- heapHolder.reconciliationScheduledSessions.delete(sessionId);
3441
- scheduleReconciliation(db, sessionId, readMessages);
3442
- }, PREPARE_RETRY_MS)).unref?.();
3443
- }).catch((error) => {
3444
- logIndexingError(sessionId, "reconciliation", error);
3445
- if (isDatabaseLockedError(error))
3446
- inRootAsyncContext2(() => setTimeout(() => scheduleReconciliation(db, sessionId, readMessages), 1000)).unref();
3447
- }).finally(() => {
3448
- heapHolder.reconciliationScheduledSessions.delete(sessionId);
3449
- });
3450
- });
3451
- });
3452
- }
3453
- async function sweepOrphanedOpenCodeMessageIndexesOffThread(db, openSource, options = {}) {
3454
- if (getHarness2() === "opencode" || getHarness2() === "opencode2")
3455
- options = {
3456
- ...options,
3457
- fenceLockNames: options.fenceLockNames ?? takeLkgRecoveryLockSweepPage()
3458
- };
3459
- if (getHarness2() === "opencode2")
3460
- openSource = () => new Database2(gaDatabasePath(getDataDir(), process.env.OPENCODE_CHANNEL ?? "latest"), {
3461
- readonly: true,
3462
- fileMustExist: true
3463
- });
3464
- const path = getSqliteDatabasePath2(db);
3465
- if (!path || getHarness2() !== "opencode" && getHarness2() !== "opencode2")
3466
- return sweepOrphanedOpenCodeMessageIndexesCooperatively2(db, openSource, options);
3467
- let source = null;
3468
- let sourcePath = null;
3469
- try {
3470
- source = openSource();
3471
- if (source)
3472
- sourcePath = getSqliteDatabasePath2(source);
3473
- } catch {} finally {
3474
- if (sourcePath)
3475
- source?.close();
3476
- }
3477
- if (!sourcePath)
3478
- return sweepOrphanedOpenCodeMessageIndexesCooperatively2(db, () => source, options);
3479
- const reply = await runSessionWarmupWorker({
3480
- path,
3481
- sessionId: "",
3482
- harness: getHarness2(),
3483
- orphanSweep: { sourcePath, options }
3484
- }, {});
3485
- if (!("orphanSweep" in reply))
3486
- throw new Error("message history orphan sweep worker failed");
3487
- return reply.orphanSweep;
3488
- }
3489
- function getMessageIndexQueueHeapStats() {
3490
- return {
3491
- queueLength: heapHolder.reconciliationScheduledSessions.size + heapHolder.incrementalTimers.size + heapHolder.pendingIncrementalKeys.size,
3492
- reconciliationScheduled: heapHolder.reconciliationScheduledSessions.size,
3493
- incrementalTimers: heapHolder.incrementalTimers.size,
3494
- pendingIncremental: heapHolder.pendingIncrementalKeys.size,
3495
- activeSessionLocks: heapHolder.sessionLocks.size,
3496
- completedIncrementalKeys: heapHolder.completedIncrementalKeys.size,
3497
- activeBufferMessages: [...heapHolder.activeReconcilerBuffers.values()].reduce((sum, messages) => sum + messages.length, 0),
3498
- activeBufferBytes: [...heapHolder.activeReconcilerBuffers.values()].reduce((sum, messages) => sum + serializedMessageBytes(messages), 0)
3499
- };
3500
- }
3501
-
3502
3580
  // src/plugin/sidebar-snapshot-cache.ts
3503
3581
  var MAX_CACHED_SESSIONS = 100;
3504
3582
  var STALE_SNAPSHOT_AGE_MS = 5 * 60 * 1000;
@@ -4262,7 +4340,15 @@ class AutoSearchBusyError extends Error {
4262
4340
  }
4263
4341
  }
4264
4342
  async function searchAutoHint(db, sessionId, projectPath, query, options, entry = new URL(new URL(import.meta.url).pathname.endsWith(".ts") ? "./auto-search-worker.ts" : "./auto-search-worker.js", import.meta.url)) {
4265
- return executeAutoSearchWorker(db, sessionId, projectPath, query, options, entry, "search");
4343
+ const {
4344
+ rerankConfig: _rerankConfig,
4345
+ rerankClient: _rerankClient,
4346
+ rerankConnectionFile: _rerankConnectionFile,
4347
+ onRerankSkipped: _onRerankSkipped,
4348
+ captureRerankLanes: _captureRerankLanes,
4349
+ ...hintOptions
4350
+ } = options;
4351
+ return executeAutoSearchWorker(db, sessionId, projectPath, query, { ...hintOptions, explicitSearch: false, rerank: false }, entry, "search");
4266
4352
  }
4267
4353
  var pendingBackfills = new WeakMap;
4268
4354
  var searchWorkers = new WeakMap;
@@ -5950,7 +6036,7 @@ function canConsumeDeferredOnThisPass(args) {
5950
6036
  return args.schedulerDecision === "execute" || args.contextPercentage >= (args.forceMaterializationPercentage ?? escalationBands(65).forceMaterializationPercentage);
5951
6037
  }
5952
6038
  function hasReclaimRide(signals) {
5953
- return signals.hardFold || signals.force || signals.explicitFlush || signals.publishedHistory || signals.subagentExecute === true || signals.executeReclaim === true;
6039
+ return signals.hardFold || signals.force || signals.explicitFlush || signals.publishedHistory || signals.subagentExecute === true || signals.executeReclaim === true || signals.servedShapeRepair === true;
5954
6040
  }
5955
6041
  function prefixMutationPermitted(gate) {
5956
6042
  return !gate.signedThinkingHold || gate.firstRender || gate.idleExpiry || gate.emergency;
@@ -5964,7 +6050,8 @@ var RECLAIM_RIDE_NAMES = [
5964
6050
  "explicitFlush",
5965
6051
  "publishedHistory",
5966
6052
  "subagentExecute",
5967
- "executeReclaim"
6053
+ "executeReclaim",
6054
+ "servedShapeRepair"
5968
6055
  ];
5969
6056
  function reclaimRideLabel(signals) {
5970
6057
  const active = RECLAIM_RIDE_NAMES.filter((name) => signals[name]);
@@ -9319,7 +9406,7 @@ function tagMessages(sessionId, messages, tagger, db, options = {}) {
9319
9406
  const textPart = part;
9320
9407
  const thinkingParts = messageThinkingParts;
9321
9408
  const contentId = `${messageId}:p${partIndex}`;
9322
- const whitespaceOnlyAssistant = message.info.role === "assistant" && stripTagPrefix(textPart.text).trim().length === 0;
9409
+ const whitespaceOnlyAssistant = message.info.role === "assistant" && (stripTagPrefix(textPart.text).trim().length === 0 || textPart.text.includes("§") && stripPersistedAssistantText(textPart.text).length === 0);
9323
9410
  let existingTagId;
9324
9411
  if (whitespaceOnlyAssistant) {
9325
9412
  const persistedWhitespaceTag = getTagNumberByMessageId2(db, sessionId, contentId);
@@ -9371,7 +9458,7 @@ function tagMessages(sessionId, messages, tagger, db, options = {}) {
9371
9458
  accAssignTag += performance.now() - _tAssignText;
9372
9459
  const persistedSource = sourceContents.get(tagId);
9373
9460
  if (persistedSource !== undefined && !options.refreshSourceContents) {
9374
- textPart.text = options.normalizeRestoredAssistantText && message.info.role === "assistant" ? options.normalizeRestoredAssistantText(persistedSource) : persistedSource;
9461
+ textPart.text = options.normalizeRestoredAssistantText && message.info.role === "assistant" ? options.normalizeRestoredAssistantText(persistedSource, message.info.providerID) : persistedSource;
9375
9462
  } else {
9376
9463
  const sourceContent = stripTagPrefix(textPart.text);
9377
9464
  if (sourceContent.trim().length > 0 || options.refreshSourceContents) {
@@ -10254,6 +10341,9 @@ async function runPostTransformPhase(args) {
10254
10341
  }
10255
10342
  };
10256
10343
  const trailingBlankSourceDecisions = args.trailingBlankSourceDecisions ?? snapshotTrailingBlankSourceDecisions(args.messages);
10344
+ if (!modelAcceptsEmptyContent(args.resolvedProviderID) && !compactionOff)
10345
+ captureInlineThinkingRepairs(args.messages, args.messageTagNumbers, args.sessionMeta?.clearedReasoningThroughTag ?? 0);
10346
+ const servedShapeRepair = prepareServedShapeRepair(args.db, args.sessionId, args.messages, args.readLastServedMessages, compactionOff ? undefined : postprocessReplaySnapshot(args.db, args.sessionId));
10257
10347
  let trailingBlankNewestAssistant;
10258
10348
  for (let index = args.messages.length - 1;index >= 0; index -= 1) {
10259
10349
  const message = args.messages[index];
@@ -10283,8 +10373,8 @@ async function runPostTransformPhase(args) {
10283
10373
  }
10284
10374
  const activeCompartmentRun = args.canRunCompartments ? getActiveCompartmentRun(args.sessionId) : undefined;
10285
10375
  const compartmentRunning = args.canRunCompartments && !args.awaitedCompartmentRun && activeCompartmentRun !== undefined;
10286
- let deferredMaterialize = args.canConsumeDeferredLate && deferredMaterializationWasPending;
10287
- let materializationRequested = isExplicitFlush || deferredMaterialize;
10376
+ let deferredMaterialize = (args.canConsumeDeferredLate || servedShapeRepair.needsRebuild) && deferredMaterializationWasPending;
10377
+ let materializationRequested = isExplicitFlush || deferredMaterialize || servedShapeRepair.needsRebuild;
10288
10378
  const m0M1EnabledForFold = args.m0M1 !== undefined && (!!args.m0M1.projectPath || !!args.m0M1.projectDirectory) && (args.fullFeatureMode || compactionOff);
10289
10379
  const frozenThinking = new Set(args.activeThinkingTurn || compactionOff ? getMergedReasoningStrippedIds(args.db, args.sessionId) : []);
10290
10380
  const compactionOffFrozenThinking = compactionOff ? compactionOffFrozenThinkingIds(frozenThinking) : new Set;
@@ -10338,6 +10428,8 @@ async function runPostTransformPhase(args) {
10338
10428
  rewritingSignedPrefix = true;
10339
10429
  thinkingReleasedForFit ||= forFit;
10340
10430
  };
10431
+ if (servedShapeRepair.needsRebuild && activeThinkingTurn)
10432
+ releaseThinkingForRewrite(false, true);
10341
10433
  if (args.forceSignedRebuildForFit && (activeThinkingPrefixHold || activeThinkingTurn && args.thinkingBindingRecoveryEnabledForModel === true)) {
10342
10434
  releaseThinkingForRewrite(true);
10343
10435
  }
@@ -10369,7 +10461,7 @@ async function runPostTransformPhase(args) {
10369
10461
  let foldBustsServedPrefixThisPass = false;
10370
10462
  let publishedM1RefreshedThisPass = false;
10371
10463
  let prefixPreflightFailed = false;
10372
- const softRefreshOpportunity = !freezeM0M1 && (args.schedulerDecision === "execute" || deferredMaterialize);
10464
+ const softRefreshOpportunity = !freezeM0M1 && (args.schedulerDecision === "execute" || deferredMaterialize || servedShapeRepair.needsRebuild);
10373
10465
  let m0RematerializedThisPass = false;
10374
10466
  const m0CoverageBeforeFold = args.sessionMeta.cachedM0Bytes === null ? -1 : args.sessionMeta.cachedM0MaxCompartmentSeq;
10375
10467
  let m0MaterializeReason = null;
@@ -10498,6 +10590,7 @@ async function runPostTransformPhase(args) {
10498
10590
  const heldIdleExpiryRebuild = activeThinkingPrefixHold && args.m0M1?.hardSignals?.cacheExpired === true;
10499
10591
  const idleExpiryRebuild = (!freezeM0M1 || activeThinkingPrefixHold) && args.m0M1?.hardSignals?.cacheExpired === true;
10500
10592
  const rideSignals = {
10593
+ servedShapeRepair: servedShapeRepair.needsRebuild,
10501
10594
  executeReclaim: false,
10502
10595
  subagentExecute: !args.fullFeatureMode && args.schedulerDecision === "execute",
10503
10596
  hardFold: rewritingSignedPrefix || foldBustsServedPrefixThisPass || firstRenderBust || idleExpiryRebuild,
@@ -10522,15 +10615,18 @@ async function runPostTransformPhase(args) {
10522
10615
  }),
10523
10616
  usableWindow: args.usableWindow
10524
10617
  });
10525
- const publishedWorkDrainAllowed = !compactionOff && reclaimRidePermitted(rideSignals, {
10618
+ const publishedWorkDrainAllowed = (!compactionOff || servedShapeRepair.needsRebuild) && reclaimRidePermitted(rideSignals, {
10526
10619
  signedThinkingHold: activeThinkingPrefixHold,
10527
10620
  firstRender: firstRenderBust,
10528
10621
  idleExpiry: idleExpiryRebuild,
10529
10622
  emergency: emergencyDropEligible
10530
10623
  });
10531
- const shouldApplyPendingOps = publishedWorkDrainAllowed;
10532
- const shouldRunHeuristics = publishedWorkDrainAllowed && (rideSignals.publishedHistory || rideSignals.executeReclaim || materializationRequested || forceMaterialization || foldBustsServedPrefixThisPass || firstRenderBust || heldIdleExpiryRebuild || emergencyDropEligible || args.schedulerDecision === "execute" && (!alreadyRanThisTurn || !args.fullFeatureMode));
10624
+ const shouldApplyPendingOps = !compactionOff && publishedWorkDrainAllowed;
10625
+ const shouldRunHeuristics = !compactionOff && publishedWorkDrainAllowed && (rideSignals.publishedHistory || rideSignals.executeReclaim || rideSignals.servedShapeRepair || materializationRequested || forceMaterialization || foldBustsServedPrefixThisPass || firstRenderBust || heldIdleExpiryRebuild || emergencyDropEligible || args.schedulerDecision === "execute" && (!alreadyRanThisTurn || !args.fullFeatureMode));
10533
10626
  const isCacheBustingPass = publishedWorkDrainAllowed;
10627
+ if (servedShapeRepair.needsRebuild && !isCacheBustingPass)
10628
+ throw new Error("Served-shape repair requires a rebuilding pass");
10629
+ servedShapeRepair.apply(isCacheBustingPass);
10534
10630
  let unheldSignedTurnBust = false;
10535
10631
  if (isCacheBustingPass && !activeThinkingPrefixHold && activeThinkingTurn && args.thinkingBindingRecoveryEnabledForModel === true) {
10536
10632
  if (foldBustsServedPrefixThisPass || firstRenderBust || publishedM1RefreshedThisPass)
@@ -10658,6 +10754,8 @@ async function runPostTransformPhase(args) {
10658
10754
  };
10659
10755
  if (temporalFirstApplication)
10660
10756
  recordFirstApplicationWireEdit(true);
10757
+ if (servedShapeRepair.needsRebuild)
10758
+ recordFirstApplicationWireEdit(true);
10661
10759
  const firstApplicationLocations = new Map;
10662
10760
  const recordFirstApplicationAt = (message, partIndex) => {
10663
10761
  recordFirstApplicationWireEdit(false);
@@ -10800,11 +10898,12 @@ async function runPostTransformPhase(args) {
10800
10898
  if (routineCleanupApplied && canUseEmptySentinels) {
10801
10899
  stripClearedReasoning(args.messages);
10802
10900
  }
10803
- const strippedInline = routineCleanupApplied && ageLaneAllowed ? stripInlineThinking(args.messages, args.messageTagNumbers, budgetCutoff) : 0;
10901
+ const strippedInline = routineCleanupApplied && ageLaneAllowed ? stripInlineThinking(args.messages, args.messageTagNumbers, budgetCutoff, !canUseEmptySentinels) : 0;
10804
10902
  const persistedInlineWatermark = args.sessionMeta?.clearedReasoningThroughTag ?? 0;
10805
10903
  if (routineCleanupApplied && persistedInlineWatermark > 0 && !compactionOff) {
10806
- replayStrippedInlineThinking(args.messages, args.messageTagNumbers, persistedInlineWatermark);
10904
+ replayStrippedInlineThinking(args.messages, args.messageTagNumbers, persistedInlineWatermark, !canUseEmptySentinels);
10807
10905
  }
10906
+ servedShapeRepair.apply(isCacheBustingPass);
10808
10907
  let removedReasoningMessages = 0;
10809
10908
  if (routineCleanupApplied && !prefixBoundModel && reasoningRemovalSelectable && reasoningRemovalReadable) {
10810
10909
  const newIds = selectReasoningRemovals({
@@ -11131,7 +11230,7 @@ async function runPostTransformPhase(args) {
11131
11230
  }
11132
11231
  }
11133
11232
  if (isCacheBustingPass) {
11134
- const droppedResult = stripDroppedPlaceholderMessages(args.messages, args.resolvedProviderID, recordFirstApplicationAt);
11233
+ const droppedResult = stripDroppedPlaceholderMessages(args.messages.filter((message) => !servedShapeRepair.messageIDs.has(message.info.id ?? "")), args.resolvedProviderID, recordFirstApplicationAt);
11135
11234
  const protectedTailStart = Math.max(0, args.messages.length - SYSTEM_INJECTION_ACTIONABLE_TAIL_MESSAGES);
11136
11235
  const systemInjectedResult = stripSystemInjectedMessages(args.messages, protectedTailStart, args.resolvedProviderID, recordFirstApplicationAt);
11137
11236
  const hiddenMessages = args.hiddenMessagesAtCompactionSeam ?? [];
@@ -19094,7 +19193,7 @@ function createTransform(deps) {
19094
19193
  failPass("store-generation-rebase-failure", error);
19095
19194
  }
19096
19195
  }
19097
- if (deps.client !== undefined) {
19196
+ if (deps.client !== undefined || deps.hostMessageReconciliationSource !== undefined) {
19098
19197
  withoutSqliteTransformPass2(() => scheduleReconciliation(db, sessionId, host.hostMessageReconciliationSource));
19099
19198
  }
19100
19199
  const tUserMsg = performance.now();
@@ -19794,7 +19893,7 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so Ma
19794
19893
  if (persistedReasoningWatermark > 0 && !compactionOff) {
19795
19894
  const tReplay = performance.now();
19796
19895
  const replayed = canUseEmptySentinels ? replayClearedReasoning(messages, reasoningByMessage, messageTagNumbers, persistedReasoningWatermark) : 0;
19797
- const replayedInline = replayStrippedInlineThinking(messages, messageTagNumbers, persistedReasoningWatermark);
19896
+ const replayedInline = replayStrippedInlineThinking(messages, messageTagNumbers, persistedReasoningWatermark, !canUseEmptySentinels);
19798
19897
  if (replayed > 0 || replayedInline > 0) {
19799
19898
  sessionLog2(sessionId, `reasoning replay: cleared=${replayed} inlineStripped=${replayedInline} (watermark=${persistedReasoningWatermark})`);
19800
19899
  }
@@ -22419,6 +22518,7 @@ async function ensureProjectRegisteredFromOpenCodeDirectory(directory, db, optio
22419
22518
  } else {
22420
22519
  unregisterProjectShadowEmbedding2(projectIdentity);
22421
22520
  }
22521
+ options.onRegistered?.(projectIdentity);
22422
22522
  }
22423
22523
 
22424
22524
  // src/hooks/magic-context/format-embed-failure.ts
@@ -23679,8 +23779,8 @@ function registerRpcHandlers(rpcServer, args) {
23679
23779
  const db = readDatabase();
23680
23780
  if (!db)
23681
23781
  return { ok: false, error: "db unavailable" };
23682
- const { runManagedRecomp } = await importPluginModule(() => import("./recomp-orchestrator-47m4hv5g.js"));
23683
- const { sendIgnoredMessage } = await importPluginModule(() => import("./send-session-notification-nwvrv34d.js"));
23782
+ const { runManagedRecomp } = await importPluginModule(() => import("./recomp-orchestrator-b12zaptj.js"));
23783
+ const { sendIgnoredMessage } = await importPluginModule(() => import("./send-session-notification-8eqe259v.js"));
23684
23784
  log2(`[rpc] recomp requested for session ${sessionId}`);
23685
23785
  if (!args.client && !args.hiddenCompletionExecutor) {
23686
23786
  return {
@@ -23764,7 +23864,7 @@ function registerRpcHandlers(rpcServer, args) {
23764
23864
  const db = readDatabase();
23765
23865
  if (!db)
23766
23866
  return { ok: false, error: "db unavailable" };
23767
- const { runManagedWrapup } = await importPluginModule(() => import("./wrapup-orchestrator-639whfhq.js"));
23867
+ const { runManagedWrapup } = await importPluginModule(() => import("./wrapup-orchestrator-3ssd5yy1.js"));
23768
23868
  const model = liveSessionState.liveModelBySession.get(sessionId);
23769
23869
  const contextLimit = model ? resolveContextLimit(model.providerID, model.modelID, { db, sessionID: sessionId }) : 128000;
23770
23870
  const ctx = {
@@ -25140,8 +25240,8 @@ function toolStateContent(state) {
25140
25240
  }
25141
25241
 
25142
25242
  // src/v2/hooks/copied-tag-notation.ts
25143
- function stripCopiedTagNotation(text) {
25144
- return text.includes("§") ? stripPersistedAssistantText(text) : text;
25243
+ function stripCopiedTagNotation(text, acceptsEmpty = true) {
25244
+ return text.includes("§") ? stripPersistedAssistantText(text, acceptsEmpty) : text;
25145
25245
  }
25146
25246
 
25147
25247
  // src/v2/hooks/payload.ts
@@ -25396,12 +25496,16 @@ function adaptPayload(draft, admittedIDs = new Set, messageTimes = new Map, hidd
25396
25496
  const messages = [];
25397
25497
  for (const message of source) {
25398
25498
  const parts = [];
25499
+ const copiedTagOnly = [];
25399
25500
  for (const content of message.content) {
25400
25501
  if (paired.has(content))
25401
25502
  continue;
25402
25503
  const part = callParts.get(content) ?? (content.type === "tool-result" ? nativeTool(undefined, { part: content, message }) : clonePreservingInstances(content));
25403
- if (message.role === "assistant" && part.type === "text" && typeof part.text === "string")
25404
- part.text = stripCopiedTagNotation(part.text);
25504
+ if (message.role === "assistant" && part.type === "text" && typeof part.text === "string") {
25505
+ if (!modelAcceptsEmptyContent(draft.model.providerID) && part.text.trim().length > 0 && stripCopiedTagNotation(part.text).trim().length === 0)
25506
+ copiedTagOnly.push({ index: parts.length, text: part.text });
25507
+ part.text = stripCopiedTagNotation(part.text, modelAcceptsEmptyContent(draft.model.providerID));
25508
+ }
25405
25509
  if (message.id && admittedIDs.has(message.id))
25406
25510
  part.synthetic = true;
25407
25511
  parts.push(part);
@@ -25443,6 +25547,7 @@ function adaptPayload(draft, admittedIDs = new Set, messageTimes = new Map, hidd
25443
25547
  });
25444
25548
  }
25445
25549
  originals.set(mapped, message);
25550
+ markServedShapeRepair(mapped.info, copiedTagOnly);
25446
25551
  if (isCoveredInstructionRow(message))
25447
25552
  markCoveredInstructionRow(mapped.info);
25448
25553
  if (typeof message.id !== "string")
@@ -30085,28 +30190,35 @@ function diff(name, before, after) {
30085
30190
  rmSync2(dir, { recursive: true, force: true });
30086
30191
  }
30087
30192
  }
30088
- function validateDocsProposal(projectDir, output, budget, expected) {
30089
- if (Object.entries(expected).some(([name, value]) => docsBaseHashes(projectDir)[name] !== value))
30090
- throw new Error("base drifted");
30193
+ function parseDocsProposalOutput(output) {
30091
30194
  const match = output.match(/```json\s*([\s\S]*?)```/);
30092
30195
  const parsed = JSON.parse(match?.[1] ?? output);
30093
30196
  if (!Array.isArray(parsed))
30094
30197
  throw new Error("proposal must be a JSON array");
30095
30198
  const changes = parsed;
30096
- if (!changes.length)
30097
- throw new Error("empty proposal");
30098
30199
  if (changes.some((item) => !item || !FILES.includes(item.file)))
30099
30200
  throw new Error("unknown proposal file");
30201
+ const seen = new Set;
30202
+ for (const change of changes) {
30203
+ const key = `${change.file}:${change.heading}`;
30204
+ if (!["replace", "add", "remove"].includes(change.action) || typeof change.heading !== "string" || !/^#{1,6} [^\r\n]+$/.test(change.heading) || typeof change.text !== "string" || typeof change.reason !== "string" || !change.reason.trim() || /[\r\n]/.test(change.reason) || seen.has(key))
30205
+ throw new Error(`invalid section change in ${change.file}`);
30206
+ seen.add(key);
30207
+ }
30208
+ return changes;
30209
+ }
30210
+ function validateDocsProposal(projectDir, output, budget, expected) {
30211
+ if (Object.entries(expected).some(([name, value]) => docsBaseHashes(projectDir)[name] !== value))
30212
+ throw new Error("base drifted");
30213
+ const changes = parseDocsProposalOutput(output);
30214
+ if (!changes.length)
30215
+ throw new Error("empty proposal");
30100
30216
  let tokens = 0;
30101
30217
  let diffs = "";
30102
30218
  for (const file of FILES) {
30103
30219
  const before = existsSync4(join8(projectDir, file)) ? readFileSync6(join8(projectDir, file), "utf8") : "";
30104
30220
  let after = before;
30105
- const seen = new Set;
30106
30221
  for (const change of changes.filter((item) => item.file === file)) {
30107
- if (!["replace", "add", "remove"].includes(change.action) || typeof change.heading !== "string" || !/^#{1,6} [^\r\n]+$/.test(change.heading) || typeof change.text !== "string" || typeof change.reason !== "string" || !change.reason.trim() || /[\r\n]/.test(change.reason) || seen.has(change.heading))
30108
- throw new Error(`invalid section change in ${file}`);
30109
- seen.add(change.heading);
30110
30222
  const section = sections(after).find((item) => item.heading === change.heading);
30111
30223
  if (change.action === "add") {
30112
30224
  if (section || !change.text.startsWith(`${change.heading}
@@ -35725,6 +35837,8 @@ async function runAgenticTask(config, ctx, helpers) {
35725
35837
  timeoutMs: Math.min(Math.max(0, deadline - Date.now()), config.timeoutMinutes * 60 * 1000),
35726
35838
  signal: abortController.signal,
35727
35839
  parse: (text, completion) => {
35840
+ if (task === "maintain-docs")
35841
+ parseDocsProposalOutput(text);
35728
35842
  if (task !== "curate")
35729
35843
  return text;
35730
35844
  const memoryOperations = inspectCurateMemoryOperations(completion.messages);
@@ -35788,6 +35902,8 @@ async function runAgenticTask(config, ctx, helpers) {
35788
35902
  if (task !== "curate") {
35789
35903
  if (!text)
35790
35904
  throw new Error("Dreamer returned no assistant output.");
35905
+ if (task === "maintain-docs")
35906
+ parseDocsProposalOutput(text);
35791
35907
  return text;
35792
35908
  }
35793
35909
  const memoryOperations = inspectCurateMemoryOperations(messages);
@@ -35837,7 +35953,7 @@ async function runAgenticTask(config, ctx, helpers) {
35837
35953
  recordInvocation("completed", run.output);
35838
35954
  if (task === "maintain-docs" && docsHashes && changes) {
35839
35955
  try {
35840
- if (run.validated === "[]") {
35956
+ if (parseDocsProposalOutput(String(run.validated)).length === 0) {
35841
35957
  helpers.recordRun("completed", null, { progress: "no corrections proposed" });
35842
35958
  return {
35843
35959
  status: "completed",
@@ -37046,7 +37162,7 @@ function registerV2DreamScheduleTimer(args) {
37046
37162
  since_days: gitCommitIndexing.since_days,
37047
37163
  max_commits: gitCommitIndexing.max_commits
37048
37164
  } : undefined,
37049
- ensureRegistered: ensureProjectRegisteredFromOpenCodeDirectory
37165
+ ensureRegistered: args.ensureRegistered ?? ensureProjectRegisteredFromOpenCodeDirectory
37050
37166
  }).catch((error) => {
37051
37167
  log2(`[magic-context] v2 dream timer registration failed (continuing without it): ${error}`);
37052
37168
  return;
@@ -37141,6 +37257,41 @@ function startDreamTrigger(context, args) {
37141
37257
  };
37142
37258
  }
37143
37259
 
37260
+ // src/v2/hooks/embedding-lifecycle.ts
37261
+ function createV2EmbeddingScope(initialProject) {
37262
+ const releases = new Map;
37263
+ const pending = new Set;
37264
+ let disposed = false;
37265
+ let disposal;
37266
+ const claim = (project) => {
37267
+ if (!releases.has(project))
37268
+ releases.set(project, retainProjectEmbedding2(project));
37269
+ };
37270
+ if (initialProject)
37271
+ claim(initialProject);
37272
+ return {
37273
+ ensureRegistered(directory, db) {
37274
+ if (disposed)
37275
+ return Promise.resolve();
37276
+ const registration = ensureProjectRegisteredFromOpenCodeDirectory(directory, db, {
37277
+ onRegistered: claim
37278
+ });
37279
+ pending.add(registration);
37280
+ return registration.finally(() => pending.delete(registration));
37281
+ },
37282
+ dispose() {
37283
+ disposed = true;
37284
+ disposal ??= (async () => {
37285
+ await Promise.allSettled([...pending]);
37286
+ for (const release of releases.values())
37287
+ release();
37288
+ releases.clear();
37289
+ })();
37290
+ return disposal;
37291
+ }
37292
+ };
37293
+ }
37294
+
37144
37295
  // src/v2/hooks/generate.ts
37145
37296
  function generateReplayAnchor(messages) {
37146
37297
  let index = messages.length - 1;
@@ -38179,6 +38330,22 @@ function* readV2RawMessagePagesForConversion(openReader, sessionID, pageRows = C
38179
38330
  function createV2RawMessageReader(openReader) {
38180
38331
  const servedBoundaryCache = new Map;
38181
38332
  return {
38333
+ getRevision: (sessionID) => {
38334
+ const reader = openReader();
38335
+ try {
38336
+ return reader.latestSequence(sessionID);
38337
+ } finally {
38338
+ reader.close();
38339
+ }
38340
+ },
38341
+ getCountAfterRevision: (sessionID, after, through) => {
38342
+ const reader = openReader();
38343
+ try {
38344
+ return reader.messageCountAfterSequence(sessionID, after, through);
38345
+ } finally {
38346
+ reader.close();
38347
+ }
38348
+ },
38182
38349
  readPage: (sessionID, afterOrdinal, limit, finalWatermark, after) => {
38183
38350
  const reader = openReader();
38184
38351
  try {
@@ -52189,6 +52356,7 @@ function createCtxSearchTool(deps) {
52189
52356
  return formatSearchResults2(query, idResults ?? [], toolContext.sessionID, diagnostics);
52190
52357
  }
52191
52358
  }
52359
+ let rerankSkipped = "";
52192
52360
  const results = await unifiedSearch2(deps.db, toolContext.sessionID, projectPath, query, {
52193
52361
  limit: normalizeLimit2(args.limit),
52194
52362
  memoryEnabled,
@@ -52207,11 +52375,16 @@ function createCtxSearchTool(deps) {
52207
52375
  gitRepositoryAvailable: typeof toolContext.directory === "string" ? directoryHasGitMetadata(toolContext.directory) : undefined,
52208
52376
  explicitSearch: true,
52209
52377
  rerankConnectionFile: deps.rerankConnectionFile,
52378
+ rerankConfig: deps.rerankConfig,
52379
+ onRerankSkipped: (line) => {
52380
+ rerankSkipped = line;
52381
+ },
52210
52382
  searchMessageHistory: (request) => searchMessageHistoryOffThread(deps.db, request),
52211
52383
  signal: toolContext.abort,
52212
52384
  ...dateRange
52213
52385
  });
52214
- return formatSearchResults2(query, results, toolContext.sessionID, diagnostics);
52386
+ return formatSearchResults2(query, results, toolContext.sessionID, diagnostics) + (rerankSkipped ? `
52387
+ ${rerankSkipped}` : "");
52215
52388
  }
52216
52389
  });
52217
52390
  }
@@ -52221,13 +52394,13 @@ function createCtxSearchTools(deps) {
52221
52394
  };
52222
52395
  }
52223
52396
  // src/v2/hooks/tools.ts
52224
- async function registerTools(context, db, config, rustToolBackends, isInternalChild) {
52397
+ async function registerTools(context, db, config, rustToolBackends, isInternalChild, ensureProjectRegistered = ensureProjectRegisteredFromOpenCodeDirectory) {
52225
52398
  const compaction = isCompactionEnabled(config);
52226
52399
  setCtxReduceRegisteredGlobally(compaction);
52227
52400
  const project = {
52228
52401
  db,
52229
52402
  resolveProjectPath: (directory) => resolveProjectIdentityForSession(directory, config.allow_home_project),
52230
- ensureProjectRegistered: ensureProjectRegisteredFromOpenCodeDirectory
52403
+ ensureProjectRegistered
52231
52404
  };
52232
52405
  const definitions = {
52233
52406
  ...compaction ? createCtxReduceTools({
@@ -52247,7 +52420,11 @@ async function registerTools(context, db, config, rustToolBackends, isInternalCh
52247
52420
  smartNotesEnabled: config.smart_notes.enabled,
52248
52421
  ...rustToolBackends ? { rustToolBackends } : {}
52249
52422
  }),
52250
- ...createCtxSearchTools({ ...project, rerankConnectionFile: config.subc?.connection_file }),
52423
+ ...createCtxSearchTools({
52424
+ ...project,
52425
+ rerankConnectionFile: config.subc?.connection_file,
52426
+ rerankConfig: config.rerank
52427
+ }),
52251
52428
  ...config.memory.enabled ? {
52252
52429
  ...createCtxMemoryTools({
52253
52430
  ...project,
@@ -52421,7 +52598,7 @@ function maybeAutoEmbedSessionBackfill(deps, sessionId) {
52421
52598
  }
52422
52599
 
52423
52600
  // src/v2/hooks/transform-features.ts
52424
- function createV2TransformFeatureDeps(config, compactionOff, directory) {
52601
+ function createV2TransformFeatureDeps(config, compactionOff, directory, ensureProjectRegistered = ensureProjectRegisteredFromOpenCodeDirectory) {
52425
52602
  return {
52426
52603
  protectedTools: config.protected_tools,
52427
52604
  commitClusterTrigger: config.commit_cluster_trigger,
@@ -52432,7 +52609,7 @@ function createV2TransformFeatureDeps(config, compactionOff, directory) {
52432
52609
  injectionBudgetTokens: config.memory.injection_budget_tokens,
52433
52610
  autoPromote: config.memory.auto_promote
52434
52611
  },
52435
- ensureProjectRegistered: ensureProjectRegisteredFromOpenCodeDirectory,
52612
+ ensureProjectRegistered,
52436
52613
  historyBudgetPercentage: config.history_budget_percentage,
52437
52614
  experimentalUserMemories: userObservationCollectionEnabled2(config.dreamer),
52438
52615
  userObservationsRequested: userObservationsRequested2(config.dreamer),
@@ -52443,7 +52620,7 @@ function createV2TransformFeatureDeps(config, compactionOff, directory) {
52443
52620
  scoreThreshold: config.memory.auto_search?.score_threshold ?? 0.6,
52444
52621
  minPromptChars: config.memory.auto_search?.min_prompt_chars ?? 20,
52445
52622
  directory,
52446
- ensureProjectRegistered: ensureProjectRegisteredFromOpenCodeDirectory,
52623
+ ensureProjectRegistered,
52447
52624
  wordRules: cavemanWordRulesForLanguage(config.language)
52448
52625
  },
52449
52626
  cavemanTextCompression: compactionOff ? undefined : config.caveman_text_compression?.enabled === true ? {
@@ -52453,7 +52630,7 @@ function createV2TransformFeatureDeps(config, compactionOff, directory) {
52453
52630
  } : undefined
52454
52631
  };
52455
52632
  }
52456
- function createV2AutoEmbedSession(deps) {
52633
+ function createV2AutoEmbedSession(deps, ensureProjectRegistered = ensureProjectRegisteredFromOpenCodeDirectory) {
52457
52634
  return (sessionId) => {
52458
52635
  const directory = deps.resolveDirectory(sessionId);
52459
52636
  const projectIdentity = resolveProjectIdentityForSession(directory, deps.allowHomeProject);
@@ -52463,7 +52640,7 @@ function createV2AutoEmbedSession(deps) {
52463
52640
  db: deps.db,
52464
52641
  projectIdentity,
52465
52642
  ensureRegistered: async () => {
52466
- await ensureProjectRegisteredFromOpenCodeDirectory(directory, deps.db);
52643
+ await ensureProjectRegistered(directory, deps.db);
52467
52644
  deps.onDirectoryResolved?.(sessionId, directory);
52468
52645
  }
52469
52646
  }, sessionId);
@@ -52797,6 +52974,7 @@ async function registerContext(context) {
52797
52974
  console.warn(`[magic-context] v2 setup disabled by conflicting context hooks: ${conflicts.reasons.join("; ")}`);
52798
52975
  return;
52799
52976
  }
52977
+ const embeddings = createV2EmbeddingScope(resolveProjectIdentityForSession(directory, config.allow_home_project));
52800
52978
  const folds = new FoldOwner(context.storage);
52801
52979
  const nativeFoldMemory = !compactionOff && process.env.MC_OC2_INVISIBLE_FOLD === "1" ? nativeFoldCache(() => storage.require()) : undefined;
52802
52980
  const nativeFoldReplay = nativeFoldMemory ? new NativeFoldReplay(nativeFoldMemory, () => openStoreReader(), context.storage) : undefined;
@@ -52853,7 +53031,7 @@ async function registerContext(context) {
52853
53031
  }) : undefined;
52854
53032
  const hiddenChildHook = new HiddenChildHook;
52855
53033
  await context.session.hook("http.request", (draft) => hiddenChildHook.cacheRequest(draft));
52856
- const tools = db && isDatabasePersisted(db) ? await registerTools(context, db, config, moduleToolBackends?.backends, (id) => hiddenChildHook.owns(id)) : undefined;
53034
+ const tools = db && isDatabasePersisted(db) ? await registerTools(context, db, config, moduleToolBackends?.backends, (id) => hiddenChildHook.owns(id), embeddings.ensureRegistered) : undefined;
52857
53035
  const usage = new Map;
52858
53036
  const generateReplay = new V2GenerateReplay;
52859
53037
  await context.session.hook("http.response", async (draft) => {
@@ -52975,7 +53153,8 @@ async function registerContext(context) {
52975
53153
  liveConfig: () => liveConfigReader.poll().effective,
52976
53154
  executor: withLiveDreamerOutputCap(lateHiddenExecutor, config, () => liveConfigReader.poll().effective),
52977
53155
  openReader: openStoreReader,
52978
- rustModeModuleClient
53156
+ rustModeModuleClient,
53157
+ ensureRegistered: embeddings.ensureRegistered
52979
53158
  });
52980
53159
  };
52981
53160
  if (db && isDatabasePersisted(db))
@@ -53249,6 +53428,10 @@ async function registerContext(context) {
53249
53428
  if (!event.data?.sessionID)
53250
53429
  continue;
53251
53430
  const sessionID = event.data.sessionID;
53431
+ if (db && event.type === "session.revert.committed") {
53432
+ const indexDb = db;
53433
+ withoutSqliteTransformPass2(() => scheduleClearAndReindex(indexDb, sessionID, pagedRead));
53434
+ }
53252
53435
  if (event.type?.startsWith("session.revert.") || event.type === "session.message.content.updated") {
53253
53436
  nativeFoldReplay?.onEvent(event);
53254
53437
  restoredRows.forget(sessionID);
@@ -53364,7 +53547,7 @@ async function registerContext(context) {
53364
53547
  }) || draft.model.limit?.context || (state.lastObservedModelKey === modelKey ? state.lastUsageContextLimit : undefined);
53365
53548
  return materializeM0({
53366
53549
  ...createM0RenderOptions({
53367
- ...createV2TransformFeatureDeps(config, compactionOff, directory),
53550
+ ...createV2TransformFeatureDeps(config, compactionOff, directory, embeddings.ensureRegistered),
53368
53551
  ...createV2ThresholdDeps(config)
53369
53552
  }, usage.get(draft.sessionID)?.usage ?? { percentage: 0, inputTokens: 0 }, modelKey, contextLimit, resolveProjectIdentityForSession(directory, config.allow_home_project)),
53370
53553
  db,
@@ -53736,7 +53919,7 @@ async function registerContext(context) {
53736
53919
  await cacheV2SessionDirectory(context.session, draft.sessionID, sessionDirectories);
53737
53920
  prepareHistorySession(draft.sessionID);
53738
53921
  transform ??= createTransform({
53739
- ...createV2TransformFeatureDeps(config, compactionOff, directory),
53922
+ ...createV2TransformFeatureDeps(config, compactionOff, directory, embeddings.ensureRegistered),
53740
53923
  cacheTtlConfig: config.cache_ttl,
53741
53924
  cacheTtlConfigured: config.cacheTtlConfigured,
53742
53925
  sampleCacheTtlConfig: () => liveConfigReader.poll().effective,
@@ -53746,7 +53929,7 @@ async function registerContext(context) {
53746
53929
  contextUsageMap: usage,
53747
53930
  compactionOff,
53748
53931
  storeGeneration: "v2",
53749
- normalizeRestoredAssistantText: stripCopiedTagNotation,
53932
+ normalizeRestoredAssistantText: (text, providerID) => stripCopiedTagNotation(text, providerID === "anthropic"),
53750
53933
  refreshSourceContents: (sessionID) => nativeFoldReplay?.needsHeadRebuild(sessionID) ?? false,
53751
53934
  hostCleanupCompactionMarkers: () => ({
53752
53935
  verified: true,
@@ -53783,7 +53966,7 @@ async function registerContext(context) {
53783
53966
  resolveDirectory: (sessionID) => sessionDirectories.get(sessionID) ?? directory,
53784
53967
  allowHomeProject: config.allow_home_project,
53785
53968
  recompProgressBySession: new Map
53786
- }),
53969
+ }, embeddings.ensureRegistered),
53787
53970
  hiddenCompletionExecutor,
53788
53971
  historianRunnable: !compactionOff && hiddenCompletionExecutor !== undefined && config.historian?.disable !== true,
53789
53972
  historianModel: historianModels.primary,
@@ -54133,6 +54316,7 @@ async function registerContext(context) {
54133
54316
  deletedSessions.clear();
54134
54317
  await dreamTrigger?.dispose();
54135
54318
  await maintenanceTimer?.dispose();
54319
+ await embeddings.dispose();
54136
54320
  for (const release of rawProviders.values())
54137
54321
  release();
54138
54322
  rawProviders.clear();