@cortexkit/opencode-magic-context 0.49.12 → 0.49.14

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 (141) hide show
  1. package/dist/auto-search-worker.js +3 -3
  2. package/dist/chunk-embedding-write-worker.js +89 -0
  3. package/dist/config/schema/agent-overrides.d.ts +12 -12
  4. package/dist/config/schema/magic-context.d.ts +88 -88
  5. package/dist/{conflict-warning-hook-f4x5wed7.js → conflict-warning-hook-mgq17yr3.js} +3 -3
  6. package/dist/{context-dam8p201.js → context-cpxqpkzv.js} +55 -71
  7. package/dist/{derive-budgets-5306b1jt.js → derive-budgets-zn7yzd2d.js} +1 -1
  8. package/dist/{embedding-backfill-qbfcbp87.js → embedding-backfill-5e1t5wha.js} +6 -5
  9. package/dist/embedding-worker.js +1 -1
  10. package/dist/features/magic-context/chunk-embedding-write-worker.d.ts +2 -0
  11. package/dist/features/magic-context/chunk-embedding-write-worker.d.ts.map +1 -0
  12. package/dist/features/magic-context/chunk-embedding-writer.d.ts +48 -0
  13. package/dist/features/magic-context/chunk-embedding-writer.d.ts.map +1 -0
  14. package/dist/features/magic-context/compartment-chunk-embedding.d.ts +1 -1
  15. package/dist/features/magic-context/compartment-chunk-embedding.d.ts.map +1 -1
  16. package/dist/features/magic-context/dreamer/hidden-single-shot.d.ts +3 -2
  17. package/dist/features/magic-context/dreamer/hidden-single-shot.d.ts.map +1 -1
  18. package/dist/features/magic-context/dreamer/map-memories.d.ts +8 -1
  19. package/dist/features/magic-context/dreamer/map-memories.d.ts.map +1 -1
  20. package/dist/features/magic-context/dreamer/retrospective-raw-provider.d.ts +2 -0
  21. package/dist/features/magic-context/dreamer/retrospective-raw-provider.d.ts.map +1 -1
  22. package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts +5 -0
  23. package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts.map +1 -1
  24. package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
  25. package/dist/features/magic-context/dreamer/verify-prompt.d.ts +6 -1
  26. package/dist/features/magic-context/dreamer/verify-prompt.d.ts.map +1 -1
  27. package/dist/features/magic-context/dreamer/verify.d.ts +25 -11
  28. package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
  29. package/dist/features/magic-context/mural/compress-cues.d.ts +3 -0
  30. package/dist/features/magic-context/mural/compress-cues.d.ts.map +1 -1
  31. package/dist/features/magic-context/project-embedding-registry.d.ts +5 -0
  32. package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
  33. package/dist/features/magic-context/storage-tags.d.ts +2 -0
  34. package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
  35. package/dist/hooks/magic-context/apply-operations.d.ts +3 -1
  36. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
  37. package/dist/hooks/magic-context/auto-embed-session.d.ts +10 -0
  38. package/dist/hooks/magic-context/auto-embed-session.d.ts.map +1 -0
  39. package/dist/hooks/magic-context/compartment-runner.d.ts +4 -0
  40. package/dist/hooks/magic-context/compartment-runner.d.ts.map +1 -1
  41. package/dist/hooks/magic-context/compartment-trigger.d.ts +1 -1
  42. package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
  43. package/dist/hooks/magic-context/degraded-pass-refusal.d.ts +2 -0
  44. package/dist/hooks/magic-context/degraded-pass-refusal.d.ts.map +1 -1
  45. package/dist/hooks/magic-context/embed-session-state.d.ts +8 -1
  46. package/dist/hooks/magic-context/embed-session-state.d.ts.map +1 -1
  47. package/dist/hooks/magic-context/hook.d.ts +3 -1
  48. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  49. package/dist/hooks/magic-context/pending-drop-eligibility.d.ts +14 -0
  50. package/dist/hooks/magic-context/pending-drop-eligibility.d.ts.map +1 -0
  51. package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
  52. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +1 -0
  53. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  54. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  55. package/dist/{index-fx90bvjd.js → index-3kdm78zp.js} +2 -2
  56. package/dist/{index-gf0psee3.js → index-3kx0kg0f.js} +60 -3
  57. package/dist/{index-1wwh38fk.js → index-5591fg8y.js} +471 -139
  58. package/dist/{index-b16gpywn.js → index-944w16m0.js} +2 -2
  59. package/dist/{index-6sz25c3s.js → index-bxdg2nbt.js} +2 -2
  60. package/dist/{index-7h8a1xpc.js → index-e4dsjj1p.js} +1 -1
  61. package/dist/{index-05n6ykca.js → index-kf4epshg.js} +3 -3
  62. package/dist/index-saews2s3.js +229 -0
  63. package/dist/{index-yx5kgp2x.js → index-t4q9zbbf.js} +95 -73
  64. package/dist/{index-wqs4q74r.js → index-thvnpfsv.js} +8 -8
  65. package/dist/{index-95s8xaj1.js → index-tyckte5c.js} +4 -4
  66. package/dist/{index-qtbdx42g.js → index-w900fbhd.js} +110 -25
  67. package/dist/{index-6sytd5w3.js → index-xn6q9pg6.js} +7 -7
  68. package/dist/{index-7zd5asz9.js → index-y1qysm3q.js} +196 -243
  69. package/dist/{index-x2xjyq8f.js → index-yxycg7fs.js} +9 -9
  70. package/dist/index.js +54 -92
  71. package/dist/{message-index-df7swgy1.js → message-index-a6gztaqx.js} +7 -7
  72. package/dist/{message-index-bounded-nq6rp8xa.js → message-index-bounded-vtgpq6b4.js} +4 -4
  73. package/dist/migration-worker.js +2 -2
  74. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  75. package/dist/{project-embedding-registry-q0ysjyzc.js → project-embedding-registry-x45bv3qr.js} +5 -4
  76. package/dist/raw-ordinal-warmup-worker.js +3 -3
  77. package/dist/{read-session-chunk-ax05f7gr.js → read-session-chunk-3ae3nfdn.js} +2 -2
  78. package/dist/{recomp-orchestrator-a0mvby4e.js → recomp-orchestrator-xqb9gwgm.js} +21 -20
  79. package/dist/{search-fm002702.js → search-deajrd90.js} +16 -15
  80. package/dist/{send-session-notification-y2wg3fkh.js → send-session-notification-24r4esbh.js} +2 -2
  81. package/dist/shared/model-suggestion-retry.d.ts +2 -0
  82. package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
  83. package/dist/shared/prompt-async-transport.d.ts.map +1 -1
  84. package/dist/{storage-tags-yygfb9c8.js → storage-tags-s5bg1ahx.js} +1 -1
  85. package/dist/{transform-postprocess-phase-s84rdf32.js → transform-postprocess-phase-k5t63qm5.js} +21 -20
  86. package/dist/v2/auto-search-worker.js +3 -3
  87. package/dist/v2/chunk-embedding-write-worker.js +88 -0
  88. package/dist/v2/{context-x60fa16g.js → context-k4jrq71s.js} +611 -210
  89. package/dist/v2/{derive-budgets-z25jw3py.js → derive-budgets-2zh4gm2c.js} +2 -2
  90. package/dist/v2/{embedding-backfill-mbjyza2a.js → embedding-backfill-jmaf8zrr.js} +6 -5
  91. package/dist/v2/embedding-worker.js +1 -1
  92. package/dist/v2/hidden-completion.d.ts +3 -2
  93. package/dist/v2/hidden-completion.d.ts.map +1 -1
  94. package/dist/v2/hooks/hidden-child.d.ts.map +1 -1
  95. package/dist/v2/hooks/transform-features.d.ts +2 -2
  96. package/dist/v2/hooks/transform-features.d.ts.map +1 -1
  97. package/dist/v2/{message-index-bounded-pgv1ndpb.js → message-index-bounded-rxxznd34.js} +4 -4
  98. package/dist/v2/{message-index-5nayhm1r.js → message-index-f947qtbz.js} +7 -7
  99. package/dist/v2/migration-worker.js +2 -2
  100. package/dist/v2/{project-embedding-registry-jbmjc0p4.js → project-embedding-registry-0msp56p8.js} +5 -4
  101. package/dist/v2/raw-ordinal-warmup-worker.js +3 -3
  102. package/dist/v2/{read-session-chunk-hr3w5bjk.js → read-session-chunk-rq9nx1nn.js} +2 -2
  103. package/dist/v2/{recomp-orchestrator-8w3449eb.js → recomp-orchestrator-1j1nqrrr.js} +21 -20
  104. package/dist/v2/retrospective-raw-provider.d.ts.map +1 -1
  105. package/dist/v2/{search-mhmxgq0e.js → search-n8wqxb1j.js} +16 -15
  106. package/dist/v2/{send-session-notification-jevgj9fe.js → send-session-notification-8ghn9tnv.js} +2 -2
  107. package/dist/v2/{server-f7jfmrrz.js → server-34kwfsr4.js} +1 -1
  108. package/dist/v2/server-4gn3z5an.js +229 -0
  109. package/dist/v2/{server-4c10404h.js → server-6cdy4rc0.js} +2 -2
  110. package/dist/v2/{server-25tg45b4.js → server-cfbr1s2x.js} +7 -7
  111. package/dist/v2/{server-nmrm2rjy.js → server-e298hswg.js} +8 -8
  112. package/dist/v2/{server-9ewkzqgd.js → server-ef89gdsx.js} +2 -2
  113. package/dist/v2/{server-m97brnat.js → server-ehyava47.js} +2 -2
  114. package/dist/v2/{server-5gvkzzrf.js → server-fnqxt9j6.js} +95 -71
  115. package/dist/v2/{server-sz8jj92q.js → server-hek6z3w6.js} +194 -241
  116. package/dist/v2/{server-50mkkhy1.js → server-kmbarfmn.js} +9 -9
  117. package/dist/v2/{server-vknbt0gq.js → server-qhfvvfxj.js} +60 -3
  118. package/dist/v2/{server-37ngj8qw.js → server-zc3e54vy.js} +1 -1
  119. package/dist/v2/server.js +9 -8
  120. package/dist/v2/{storage-tags-a2gq6dw7.js → storage-tags-hcc2adpf.js} +1 -1
  121. package/dist/v2/store-reader.d.ts +1 -0
  122. package/dist/v2/store-reader.d.ts.map +1 -1
  123. package/dist/v2/{wrapup-orchestrator-r82y780v.js → wrapup-orchestrator-hkv8apcc.js} +16 -15
  124. package/dist/{wrapup-orchestrator-vmt6z3q5.js → wrapup-orchestrator-kxqj4rwh.js} +22 -21
  125. package/package.json +6 -5
  126. package/src/shared/model-suggestion-retry.test.ts +34 -0
  127. package/src/shared/model-suggestion-retry.ts +23 -3
  128. package/src/shared/prompt-async-transport.test.ts +1 -1
  129. package/src/shared/prompt-async-transport.ts +16 -3
  130. package/dist/{index-e6xnpach.js → index-b7p25tm0.js} +0 -0
  131. package/dist/{index-2pgxcncf.js → index-dgs16axy.js} +0 -0
  132. package/dist/{index-9vqb5p1s.js → index-e20m7284.js} +0 -0
  133. package/dist/{index-fwefky9w.js → index-mht7bq0z.js} +0 -0
  134. package/dist/{index-8ketfacn.js → index-v10f1rjv.js} +3 -3
  135. package/dist/{index-tdn0zkw4.js → index-wk0n1cgt.js} +0 -0
  136. package/dist/v2/{index-e6xnpach.js → index-b7p25tm0.js} +0 -0
  137. package/dist/v2/{server-bxpwy6fy.js → server-atbc19ab.js} +0 -0
  138. package/dist/v2/{server-2x42esxd.js → server-g10mdym6.js} +0 -0
  139. package/dist/v2/{server-fa75w6gp.js → server-k2bzedxk.js} +0 -0
  140. package/dist/v2/{server-kn9n2qgd.js → server-tbe1femw.js} +3 -3
  141. /package/dist/v2/{server-83ygfha2.js → server-vbe4se57.js} +0 -0
@@ -79,25 +79,8 @@ import {
79
79
  renewGitSweepLease,
80
80
  markGitSweepSuccessAndRelease,
81
81
  parkGitSweepNonIndexable,
82
- releaseGitSweepLease,
83
- describeShadowBackfillWriteRefusal2,
84
- markProjectLoadUntrusted2,
85
- drainProjectEmbeddingIdentityMaintenance2,
86
- drainStaleEmbeddingIdentitiesForProject2,
87
- registerProjectEmbedding2,
88
- registerProjectShadowEmbedding2,
89
- enqueueShadowEmbeddingItems2,
90
- registerProjectInObservationMode2,
91
- unregisterProjectShadowEmbedding2,
92
- getProjectEmbeddingSnapshot2,
93
- embedTextForProject2,
94
- embedBatchForProject2,
95
- embedUnembeddedMemoriesForProject2,
96
- embedUnembeddedMemoriesForProjectOutcome2,
97
- drainCommitBacklogForProject2,
98
- embedSessionCompartmentChunks2,
99
- getEmbeddingCoverageStatus2
100
- } from "./index-7zd5asz9.js";
82
+ releaseGitSweepLease
83
+ } from "./index-saews2s3.js";
101
84
  import {
102
85
  hasTrustedAbsoluteWall,
103
86
  applyProvenInputFloor,
@@ -109,7 +92,7 @@ import {
109
92
  deriveTriggerBudget2,
110
93
  resolveKnownHistorianContextLimit2,
111
94
  resolveHistorianProducerLimits2
112
- } from "./index-8ketfacn.js";
95
+ } from "./index-v10f1rjv.js";
113
96
  import {
114
97
  resolveModelCalibration,
115
98
  calibrateBuckets,
@@ -160,7 +143,7 @@ import {
160
143
  getDroppedTagsByNumbers2,
161
144
  getMaxDroppedTagNumber2,
162
145
  getTagById2
163
- } from "./index-fwefky9w.js";
146
+ } from "./index-mht7bq0z.js";
164
147
  import {
165
148
  observeTemporalDecisions,
166
149
  stableStringify
@@ -313,7 +296,7 @@ import {
313
296
  readRawSessionMessageById2,
314
297
  readSessionChunk2,
315
298
  readRawSessionSeedTail2
316
- } from "./index-b16gpywn.js";
299
+ } from "./index-944w16m0.js";
317
300
  import {
318
301
  getMeasuredToolDefinitionTokens
319
302
  } from "./index-n6m03s3n.js";
@@ -330,7 +313,7 @@ import {
330
313
  runSqliteOptimize,
331
314
  openDatabase,
332
315
  openCurrentDatabase
333
- } from "./index-x2xjyq8f.js";
316
+ } from "./index-yxycg7fs.js";
334
317
  import {
335
318
  registerOwnRpcServerInstance,
336
319
  rpcPortDir,
@@ -349,7 +332,7 @@ import {
349
332
  resolveStoredPathWorkspaceIdentity,
350
333
  storedPathBelongsToWorkspace,
351
334
  computeWorkspaceEpochFingerprint
352
- } from "./index-tdn0zkw4.js";
335
+ } from "./index-wk0n1cgt.js";
353
336
  import {
354
337
  V2_MEMORY_CATEGORIES,
355
338
  CATEGORY_PRIORITY
@@ -374,10 +357,6 @@ import {
374
357
  DREAMER_CLASSIFIER_AGENT,
375
358
  DREAMER_DOCS_AGENT,
376
359
  DREAMER_REVIEWER_AGENT,
377
- embedPauseBySession,
378
- embedRunStateBySession,
379
- invalidateAutoEmbedSession,
380
- getEmbedDrainUiStatus,
381
360
  getCompartments,
382
361
  getLastCompartmentEndMessage,
383
362
  getLastCompartmentEndMessageId,
@@ -453,9 +432,11 @@ import {
453
432
  toModelEntry,
454
433
  isPromptTimeoutError,
455
434
  getPromptFailureDetail,
435
+ raceWithSignal,
456
436
  promptSyncWithValidatedOutputRetry,
457
437
  normalizeSDKResponse,
458
438
  failedInvocationStatus,
439
+ sumTokensFromChildMessages,
459
440
  recordChildInvocation,
460
441
  createPromptAsyncTransport,
461
442
  systemPromptFingerprint,
@@ -522,7 +503,35 @@ import {
522
503
  snapRangeToCompartments,
523
504
  getActiveCompartmentRun,
524
505
  startCompartmentAgent
525
- } from "./index-yx5kgp2x.js";
506
+ } from "./index-t4q9zbbf.js";
507
+ import {
508
+ embedPauseBySession,
509
+ embedRunStateBySession,
510
+ activeEmbeddingSessions,
511
+ autoEmbedAttemptedBySession,
512
+ autoEmbedIdentityBySession,
513
+ autoEmbedRetryAfterBySession,
514
+ invalidateAutoEmbedSession,
515
+ getEmbedDrainUiStatus,
516
+ describeShadowBackfillWriteRefusal2,
517
+ markProjectLoadUntrusted2,
518
+ drainProjectEmbeddingIdentityMaintenance2,
519
+ drainStaleEmbeddingIdentitiesForProject2,
520
+ registerProjectEmbedding2,
521
+ registerProjectShadowEmbedding2,
522
+ enqueueShadowEmbeddingItems2,
523
+ registerProjectInObservationMode2,
524
+ unregisterProjectShadowEmbedding2,
525
+ getProjectEmbeddingSnapshot2,
526
+ embedTextForProject2,
527
+ embedBatchForProject2,
528
+ embedUnembeddedMemoriesForProject2,
529
+ embedUnembeddedMemoriesForProjectOutcome2,
530
+ drainCommitBacklogForProject2,
531
+ embedSessionCompartmentChunks2,
532
+ getEmbeddingCoverageStatus2,
533
+ getAutoEmbeddingSessionCoverage2
534
+ } from "./index-y1qysm3q.js";
526
535
  import {
527
536
  SubcClient,
528
537
  connectionFileExists,
@@ -551,7 +560,7 @@ import {
551
560
  indexSingleMessage2,
552
561
  indexMessagesAfterOrdinal2,
553
562
  sweepOrphanedOpenCodeMessageIndexes2
554
- } from "./index-wqs4q74r.js";
563
+ } from "./index-thvnpfsv.js";
555
564
  import {
556
565
  renderUserFacingFailure,
557
566
  userFacingFailureCode,
@@ -595,7 +604,7 @@ import {
595
604
  readGitFileChangeTimesSince,
596
605
  verificationFileExists,
597
606
  normalizeVerificationFiles
598
- } from "./index-6sz25c3s.js";
607
+ } from "./index-bxdg2nbt.js";
599
608
  import {
600
609
  registerNotificationSink2,
601
610
  pushNotification2,
@@ -605,7 +614,7 @@ import {
605
614
  } from "./index-x8a7jmkh.js";
606
615
  import {
607
616
  getLocalEmbeddingNativeMemoryStats
608
- } from "./index-9vqb5p1s.js";
617
+ } from "./index-e20m7284.js";
609
618
  import {
610
619
  saveEmbeddingIfHashMatches,
611
620
  invalidateProject2,
@@ -613,7 +622,7 @@ import {
613
622
  } from "./index-4dhv7mqz.js";
614
623
  import {
615
624
  cosineSimilarity
616
- } from "./index-fx90bvjd.js";
625
+ } from "./index-3kdm78zp.js";
617
626
  import {
618
627
  computeCueContentHash,
619
628
  hasMuralCueColumns,
@@ -660,17 +669,17 @@ import {
660
669
  resolveMemoriesByIdsForSearch2,
661
670
  unifiedSearch2,
662
671
  formatSearchResults2
663
- } from "./index-6sytd5w3.js";
672
+ } from "./index-xn6q9pg6.js";
664
673
  import {
665
674
  flushIgnoredMessages2,
666
675
  clearIgnoredMessages2,
667
676
  observeIgnoredNotificationEvent2,
668
677
  sendStatusNotification2
669
- } from "./index-2pgxcncf.js";
678
+ } from "./index-dgs16axy.js";
670
679
  import {
671
680
  setRecompStarting2,
672
681
  setRecompTerminal2
673
- } from "./index-05n6ykca.js";
682
+ } from "./index-kf4epshg.js";
674
683
  import {
675
684
  makeToolCompositeKey,
676
685
  searchMessageHistoryOffThread,
@@ -706,6 +715,8 @@ import {
706
715
  replayCavemanCompression,
707
716
  DegradedPassRefusalError,
708
717
  degradedPassError,
718
+ pendingDropEligibilityKey,
719
+ createPendingDropEligibilityCache,
709
720
  applyFlushedStatuses,
710
721
  prewarmTagOwners,
711
722
  waitForTagOwners,
@@ -721,7 +732,7 @@ import {
721
732
  abortSessionFailClosed2,
722
733
  evaluateEmergencyFailClosed2,
723
734
  runPostTransformPhase2
724
- } from "./index-qtbdx42g.js";
735
+ } from "./index-w900fbhd.js";
725
736
  import {
726
737
  ANNOUNCEMENT_VERSION2,
727
738
  ANNOUNCEMENT_FEATURES2,
@@ -743,6 +754,11 @@ import {
743
754
  import {
744
755
  computeNormalizedHash
745
756
  } from "./index-2bvekkfy.js";
757
+ import {
758
+ canonicalModelIdentity,
759
+ piModelRefToCanonical,
760
+ modelRefLookupOrder
761
+ } from "./index-avwt563y.js";
746
762
  import {
747
763
  canonicalProjectDirectory
748
764
  } from "./index-knvkbfvh.js";
@@ -750,18 +766,6 @@ import {
750
766
  getErrorMessage,
751
767
  describeError
752
768
  } from "./index-y8v6yerm.js";
753
- import {
754
- shouldEnforcePrivateStoragePermissions,
755
- ensureStorageDirectorySync,
756
- writeStorageFileAtomicSync,
757
- writeStorageFileAsync,
758
- createStorageWriteStream
759
- } from "./index-fvnzcnww.js";
760
- import {
761
- canonicalModelIdentity,
762
- piModelRefToCanonical,
763
- modelRefLookupOrder
764
- } from "./index-avwt563y.js";
765
769
  import {
766
770
  closeQuietly,
767
771
  isKnownAutocommit
@@ -769,6 +773,13 @@ import {
769
773
  import {
770
774
  logSlowWriteTransaction
771
775
  } from "./index-k29z4aqh.js";
776
+ import {
777
+ shouldEnforcePrivateStoragePermissions,
778
+ ensureStorageDirectorySync,
779
+ writeStorageFileAtomicSync,
780
+ writeStorageFileAsync,
781
+ createStorageWriteStream
782
+ } from "./index-fvnzcnww.js";
772
783
 
773
784
  // src/config/dependency-notes.ts
774
785
  function scheduledTasks(config) {
@@ -1984,10 +1995,28 @@ async function readRetrospectiveScanWindow(provider, projectIdentity, watermarkM
1984
1995
  }
1985
1996
  function readOpenCodeMessagesSince(db, sessionId, sinceMs, capPerSession) {
1986
1997
  const limit = Math.max(1, Math.floor(capPerSession));
1987
- const rows = db.prepare(`SELECT id, data, time_created
1988
- FROM message
1989
- WHERE session_id = ? AND time_created > ?
1990
- ORDER BY time_created ASC, id ASC
1998
+ const rows = db.prepare(`SELECT current.id, current.data, current.time_created,
1999
+ EXISTS (
2000
+ SELECT 1 FROM message assistant_reply
2001
+ WHERE assistant_reply.session_id = current.session_id
2002
+ AND json_valid(assistant_reply.data)
2003
+ AND json_extract(assistant_reply.data, '$.role') = 'assistant'
2004
+ AND (assistant_reply.time_created < current.time_created
2005
+ OR (assistant_reply.time_created = current.time_created
2006
+ AND assistant_reply.id < current.id))
2007
+ AND EXISTS (
2008
+ SELECT 1 FROM message prior_user
2009
+ WHERE prior_user.session_id = current.session_id
2010
+ AND json_valid(prior_user.data)
2011
+ AND json_extract(prior_user.data, '$.role') = 'user'
2012
+ AND (prior_user.time_created < assistant_reply.time_created
2013
+ OR (prior_user.time_created = assistant_reply.time_created
2014
+ AND prior_user.id < assistant_reply.id))
2015
+ )
2016
+ ) AS has_prior_assistant_reply
2017
+ FROM message current
2018
+ WHERE current.session_id = ? AND current.time_created > ?
2019
+ ORDER BY current.time_created ASC, current.id ASC
1991
2020
  LIMIT ?`).all(sessionId, sinceMs, limit + 1);
1992
2021
  const truncated = rows.length > limit;
1993
2022
  const kept = truncated ? rows.slice(0, limit) : rows;
@@ -2091,7 +2120,8 @@ function normalizeOpenCodeRows(db, sessionId, rows) {
2091
2120
  ordinal,
2092
2121
  role,
2093
2122
  parts,
2094
- ts: row.time_created
2123
+ ts: row.time_created,
2124
+ followsAssistantReply: row.has_prior_assistant_reply === 1
2095
2125
  });
2096
2126
  });
2097
2127
  }
@@ -2105,7 +2135,8 @@ function normalizeOpenCodeMessage(args) {
2105
2135
  ordinal: args.ordinal,
2106
2136
  role: "user",
2107
2137
  text,
2108
- ts: args.ts
2138
+ ts: args.ts,
2139
+ ...args.followsAssistantReply ? { followsAssistantReply: true } : {}
2109
2140
  });
2110
2141
  }
2111
2142
  }
@@ -2530,9 +2561,12 @@ async function runCompressCues(args) {
2530
2561
  let timeoutStreakElapsedMs = [];
2531
2562
  for (let i = 0;i < chunks.length; i += 1) {
2532
2563
  const remainingMs = Math.max(0, args.deadline - Date.now());
2533
- if (remainingMs <= 0)
2564
+ if (remainingMs <= 0) {
2565
+ result.stopReason = "deadline";
2534
2566
  break;
2567
+ }
2535
2568
  if (remainingMs < CHUNK_TIMEOUT_FLOOR_MS) {
2569
+ result.stopReason = "deadline";
2536
2570
  log2(`[dreamer] compress-cues: stopping before chunk ${i + 1}/${chunks.length} — remaining budget ${remainingMs}ms is below the ${CHUNK_TIMEOUT_FLOOR_MS}ms chunk floor; banking ${result.compressed} compressed cue(s)`);
2537
2571
  break;
2538
2572
  }
@@ -2541,6 +2575,10 @@ async function runCompressCues(args) {
2541
2575
  if (!chunk)
2542
2576
  break;
2543
2577
  const outcome = await compressOneChunk(args, chunk, sliceMs, abortController.signal);
2578
+ if (outcome.failure) {
2579
+ result.failure = outcome.failure.error;
2580
+ result.failureStage = outcome.failure.stage;
2581
+ }
2544
2582
  result.compressed += outcome.compressed;
2545
2583
  result.skipped += outcome.skipped;
2546
2584
  result.remaining -= outcome.compressed;
@@ -2550,6 +2588,7 @@ async function runCompressCues(args) {
2550
2588
  consecutiveTimeouts += 1;
2551
2589
  timeoutStreakElapsedMs.push(outcome.failure.elapsedMs);
2552
2590
  if (consecutiveTimeouts >= CONSECUTIVE_TIMEOUT_LIMIT) {
2591
+ result.stopReason = "timeout-circuit-breaker";
2553
2592
  log2(`[dreamer] compress-cues: circuit breaker tripped — ${consecutiveTimeouts} consecutive chunk timeouts (model too slow for its time slice); per-chunk elapsed [${timeoutStreakElapsedMs.join("ms, ")}ms] vs ${sliceMs}ms slice; stopping run incomplete with ${chunks.length - i - 1} chunk(s) unattempted`);
2554
2593
  break;
2555
2594
  }
@@ -2566,7 +2605,7 @@ async function runCompressCues(args) {
2566
2605
  }
2567
2606
  }
2568
2607
  function isTimeoutClassError(error) {
2569
- return error instanceof Error && /^prompt timed out after \d+ms$/.test(error.message);
2608
+ return isPromptTimeoutError(error) || getPromptFailureDetail(error)?.failureClass === "provider_timeout";
2570
2609
  }
2571
2610
  async function compressOneChunk(args, chunk, sliceMs, signal) {
2572
2611
  let agentSessionId = null;
@@ -2574,6 +2613,7 @@ async function compressOneChunk(args, chunk, sliceMs, signal) {
2574
2613
  const executor = resolveHiddenCompletionExecutor(args.hiddenCompletionExecutor, args.client, args.db, args.sessionDirectory, "compress-cues");
2575
2614
  let promptSettled = false;
2576
2615
  const startedAt = Date.now();
2616
+ let stage = "child-start";
2577
2617
  try {
2578
2618
  const prompt = buildCompressCuesPrompt({
2579
2619
  projectPath: args.projectIdentity,
@@ -2594,6 +2634,7 @@ async function compressOneChunk(args, chunk, sliceMs, signal) {
2594
2634
  agentSessionId = handle.id || null;
2595
2635
  if (!agentSessionId)
2596
2636
  throw new Error("Could not create compress-cues session.");
2637
+ stage = "prompt";
2597
2638
  const opened = handle;
2598
2639
  const run = await promptSyncWithValidatedOutputRetry(args.client, {
2599
2640
  path: { id: agentSessionId },
@@ -2645,16 +2686,19 @@ async function compressOneChunk(args, chunk, sliceMs, signal) {
2645
2686
  modelId: run.output.modelId
2646
2687
  });
2647
2688
  }
2689
+ stage = "apply";
2648
2690
  return args.moduleRoute ? await applyCuesThroughModule(args, chunk, run.validated, signal) : applyCues(args, chunk, run.validated);
2649
2691
  } catch (error) {
2650
2692
  const desc = describeError(error);
2651
2693
  log2(`[dreamer] compress-cues chunk failed: ${desc.brief}`, desc.stackHead ? { stackHead: desc.stackHead } : undefined);
2652
- if (signal.aborted || error instanceof HiddenCompletionRefusal || error instanceof DreamerProviderOutputFailureError)
2694
+ if (signal.aborted || error instanceof DreamerModuleFailureError || error instanceof HiddenCompletionRefusal || error instanceof DreamerProviderOutputFailureError)
2653
2695
  throw error;
2654
2696
  return {
2655
2697
  compressed: 0,
2656
2698
  skipped: 0,
2657
2699
  failure: {
2700
+ error,
2701
+ stage,
2658
2702
  class: isTimeoutClassError(error) ? "timeout" : "other",
2659
2703
  brief: desc.brief,
2660
2704
  elapsedMs: Date.now() - startedAt
@@ -2808,7 +2852,7 @@ async function applyCuesThroughModule(args, chunk, manifestText, signal) {
2808
2852
  // src/features/magic-context/dreamer/hidden-single-shot.ts
2809
2853
  async function runHiddenSingleShotPrompt(args) {
2810
2854
  const system = withContentLanguageDirective(args.system, args.language);
2811
- const handle = await args.executor.open({
2855
+ const opening = args.executor.open({
2812
2856
  parentSessionId: args.parentSessionId,
2813
2857
  agent: args.agent,
2814
2858
  kind: "dreamer-task",
@@ -2820,6 +2864,17 @@ async function runHiddenSingleShotPrompt(args) {
2820
2864
  directory: args.sessionDirectory,
2821
2865
  ...args.metadata ? { metadata: args.metadata } : {}
2822
2866
  });
2867
+ opening.then((handle) => {
2868
+ if (args.signal?.aborted)
2869
+ return args.executor.close(handle, {
2870
+ promptSettled: false,
2871
+ privacySensitive: args.privacySensitive ?? true,
2872
+ context: `[dreamer] ${args.callContext}`,
2873
+ log: log2
2874
+ });
2875
+ }).catch(() => {});
2876
+ const handle = await raceWithSignal(opening, args.signal);
2877
+ args.onOpened?.(handle.id);
2823
2878
  let promptSettled = false;
2824
2879
  try {
2825
2880
  if (!handle.id)
@@ -2874,12 +2929,16 @@ async function runHiddenSingleShotPrompt(args) {
2874
2929
  }
2875
2930
  throw error;
2876
2931
  } finally {
2877
- await args.executor.close(handle, {
2932
+ const close = args.executor.close(handle, {
2878
2933
  promptSettled,
2879
2934
  privacySensitive: args.privacySensitive ?? true,
2880
2935
  context: `[dreamer] ${args.callContext}`,
2881
2936
  log: log2
2882
2937
  });
2938
+ if (args.signal?.aborted)
2939
+ close.catch(() => {});
2940
+ else
2941
+ await raceWithSignal(close, args.signal);
2883
2942
  }
2884
2943
  }
2885
2944
 
@@ -5044,7 +5103,7 @@ function getAsyncModule() {
5044
5103
  await beforeModuleLoad();
5045
5104
  const [{ default: singlefileAsyncifyVariant }, { newQuickJSAsyncWASMModuleFromVariant }] = await importPluginModule(() => Promise.all([
5046
5105
  import("./index-e7vx3byk.js").then((m)=>__toESM(m.default,1)),
5047
- import("./index-e6xnpach.js")
5106
+ import("./index-b7p25tm0.js")
5048
5107
  ]));
5049
5108
  const module = await newQuickJSAsyncWASMModuleFromVariant(singlefileAsyncifyVariant);
5050
5109
  return module;
@@ -6949,14 +7008,29 @@ function isDeferred(memory, retries) {
6949
7008
  return !!retry && retry.content === contentKey(memory) && retry.deferUntil > Date.now();
6950
7009
  }
6951
7010
  function assistantText(messages) {
6952
- return messages.filter((message) => isRecord(message) && (message.role === "assistant" || isRecord(message.info) && message.info.role === "assistant")).map((message) => extractLatestAssistantText([message]) ?? (isRecord(message) && Array.isArray(message.content) ? message.content.filter(isRecord).filter((part) => part.type === "text" && typeof part.text === "string").map((part) => part.text).join(`
7011
+ const joined = messages.filter((message) => isRecord(message) && (message.role === "assistant" || isRecord(message.info) && message.info.role === "assistant")).map((message) => extractLatestAssistantText([message]) ?? (isRecord(message) && Array.isArray(message.content) ? message.content.filter(isRecord).filter((part) => part.type === "text" && typeof part.text === "string").map((part) => part.text).join(`
6953
7012
  `) : "")).join(`
6954
7013
  `);
7014
+ return joined.trim() ? joined : null;
6955
7015
  }
6956
7016
  function currentManifest(text) {
6957
7017
  const start = text.lastIndexOf("<mappings>");
6958
7018
  return start < 0 ? text : text.slice(start);
6959
7019
  }
7020
+ function parseMapMemoriesCompletion(text, completion, expectedIds) {
7021
+ const source = /<mappings\b/i.test(text) ? text : assistantText(completion.messages ?? []) || text;
7022
+ return validateMapMemoriesManifest(currentManifest(source), expectedIds);
7023
+ }
7024
+ function validateClientMapMemories(messages, expectedIds) {
7025
+ if (hasLengthCappedOutput(messages)) {
7026
+ throw new Error("map-memories returned length-capped output");
7027
+ }
7028
+ const raw = assistantText(messages);
7029
+ if (raw == null) {
7030
+ throw new Error("map-memories returned no output");
7031
+ }
7032
+ return validateMapMemoriesManifest(currentManifest(raw), expectedIds);
7033
+ }
6960
7034
  function logBatchUsage(messages, committed, startedAt) {
6961
7035
  const steps = messages.filter((message) => isRecord(message) && (message.role === "assistant" || isRecord(message.info) && message.info.role === "assistant")).length;
6962
7036
  log2(`[dreamer] map-memories batch: steps=${steps} committed=${committed} steps_per_memory=${committed ? (steps / committed).toFixed(2) : "n/a"} elapsed_ms=${Date.now() - startedAt}`);
@@ -7021,8 +7095,11 @@ async function mapMemories(args) {
7021
7095
  const inputs = allInputs.filter((memory) => !isDeferred(memory, retries));
7022
7096
  result.remaining = allInputs.length;
7023
7097
  result.complete = result.remaining === 0;
7024
- if (inputs.length === 0)
7098
+ if (inputs.length === 0) {
7099
+ if (allInputs.length > 0)
7100
+ result.deferred = true;
7025
7101
  return result;
7102
+ }
7026
7103
  const batches = [];
7027
7104
  for (let i = 0;i < inputs.length; i += MAP_BATCH_SIZE) {
7028
7105
  batches.push({ inputs: inputs.slice(i, i + MAP_BATCH_SIZE), isOmissionRetry: false });
@@ -7048,6 +7125,10 @@ async function mapMemories(args) {
7048
7125
  if (!batch)
7049
7126
  break;
7050
7127
  const outcome = await mapOneBatch(args, batch.inputs, sliceMs, abortController.signal);
7128
+ if (outcome.failure) {
7129
+ result.failure = outcome.failure.error;
7130
+ result.failureStage = outcome.failure.stage;
7131
+ }
7051
7132
  const committed = outcome.mapped + outcome.independent;
7052
7133
  runLeaseGuardedWrite(args.db, args.holderId, args.leaseKey, () => {
7053
7134
  const committedIds = new Set(outcome.committedIds);
@@ -7111,6 +7192,7 @@ async function mapOneBatch(args, batch, sliceMs, signal) {
7111
7192
  const startedAt = Date.now();
7112
7193
  let budgetFinalized = false;
7113
7194
  let failedCompletion;
7195
+ let stage = "child-start";
7114
7196
  const onBudgetUpdate = (state) => {
7115
7197
  budgetFinalized ||= state.finalizeFired;
7116
7198
  args.onBudgetUpdate?.(state);
@@ -7132,15 +7214,19 @@ async function mapOneBatch(args, batch, sliceMs, signal) {
7132
7214
  fallbackModels: args.fallbackModels,
7133
7215
  timeoutMs: sliceMs,
7134
7216
  signal,
7217
+ onOpened: () => {
7218
+ stage = "prompt";
7219
+ },
7135
7220
  onFailureOutput: (completion) => {
7136
7221
  failedCompletion = completion;
7137
7222
  },
7138
- parse: (text, completion) => validateMapMemoriesManifest(currentManifest(assistantText(completion.messages ?? []) || text), new Set(batch.map((memory) => memory.id)))
7223
+ parse: (text, completion) => parseMapMemoriesCompletion(text, completion, new Set(batch.map((memory) => memory.id)))
7139
7224
  });
7140
7225
  recordInvocation2(args, startedAt, {
7141
7226
  status: "completed",
7142
7227
  messages: run.completion.messages ?? []
7143
7228
  });
7229
+ stage = "apply";
7144
7230
  const outcome = await applyParsedBatchMappings(args, batch, run.validated, budgetFinalized, true);
7145
7231
  logBatchUsage(run.completion.messages ?? [], outcome.mapped + outcome.independent, startedAt);
7146
7232
  const returnedIds = new Set(outcome.committedIds);
@@ -7165,6 +7251,7 @@ async function mapOneBatch(args, batch, sliceMs, signal) {
7165
7251
  agentSessionId = typeof created?.id === "string" ? created.id : null;
7166
7252
  if (!agentSessionId)
7167
7253
  throw new Error("Could not create map-memories session.");
7254
+ stage = "prompt";
7168
7255
  const run = await promptSyncWithValidatedOutputRetry(client, {
7169
7256
  path: { id: agentSessionId },
7170
7257
  query: { directory: args.sessionDirectory },
@@ -7192,18 +7279,11 @@ async function mapOneBatch(args, batch, sliceMs, signal) {
7192
7279
  preferResponseOnMissingData: true
7193
7280
  });
7194
7281
  },
7195
- validateOutput: (messages) => {
7196
- if (hasLengthCappedOutput(messages)) {
7197
- throw new Error("map-memories returned length-capped output");
7198
- }
7199
- const text = currentManifest(assistantText(messages));
7200
- if (!text)
7201
- throw new Error("map-memories returned no output");
7202
- return validateMapMemoriesManifest(text, new Set(batch.map((memory) => memory.id)));
7203
- }
7282
+ validateOutput: (messages) => validateClientMapMemories(messages, new Set(batch.map((memory) => memory.id)))
7204
7283
  });
7205
7284
  promptSettled = true;
7206
7285
  recordInvocation2(args, startedAt, { status: "completed", messages: run.output });
7286
+ stage = "apply";
7207
7287
  const outcome = await applyParsedBatchMappings(args, batch, run.validated, budgetFinalized, true);
7208
7288
  logBatchUsage(run.output, outcome.mapped + outcome.independent, startedAt);
7209
7289
  const returnedIds = new Set(outcome.committedIds);
@@ -7232,6 +7312,8 @@ async function mapOneBatch(args, batch, sliceMs, signal) {
7232
7312
  return {
7233
7313
  ...outcome,
7234
7314
  failure: {
7315
+ error,
7316
+ stage,
7235
7317
  class: isTimeoutClassError2(error) ? "timeout" : "other",
7236
7318
  elapsedMs: Date.now() - startedAt
7237
7319
  }
@@ -8751,7 +8833,7 @@ var VERIFY_SYSTEM_PROMPT = `You are a memory verifier for the magic-context syst
8751
8833
 
8752
8834
  Each memory below comes with its backing file(s) — the code it makes a claim about. For EACH memory: use the provided git diff as evidence when present. If no diff is supplied, read its backing files (you may read more if needed) and decide whether the memory is still accurate.
8753
8835
 
8754
- Tools (read-only): read, grep, glob. Request line ranges and keep reads short. You read code only when the evidence requires it; you change nothing.
8836
+ Tools (read-only): read, grep, glob, plus any available AFT navigation tools. Use at most 3 tool calls per memory, including searches and reads. Start with the backing files and likely identifier matches. Never read the same file twice in a batch; reuse evidence. Request short useful line ranges unless the claim concerns the file as a whole. If evidence is insufficient when the call budget runs out, SKIP that memory; uncertainty never justifies archival. You change nothing.
8755
8837
 
8756
8838
  Decide ONE of four outcomes per memory:
8757
8839
  - VERIFIED — still accurate. Keep it as-is.
@@ -8763,7 +8845,7 @@ UPDATE and ARCHIVE are ONLY for claims a repository file can falsify, such as an
8763
8845
 
8764
8846
  BE CONSERVATIVE ABOUT ARCHIVING. Wrong archival of a TRUE memory is the worst possible outcome — far worse than leaving a slightly-stale memory. If you cannot find the code, or you are unsure, or it might still be true somewhere you didn't look: mark it VERIFIED or SKIPPED, never archived. Archive ONLY when you have positive evidence the code contradicts a code fact.
8765
8847
 
8766
- Output ONE XML manifest at the very end and NOTHING else — no narration, no per-memory commentary, no reasoning:
8848
+ Output ONE XML manifest and NOTHING else — no narration or reasoning. Open <verify> before investigating and emit each complete verdict immediately before investigating the next memory, so interruption preserves finished work. Close </verify> when done:
8767
8849
  <verify>
8768
8850
  <verified id="N" files="path/a.ts,path/b.ts"/>
8769
8851
  <update id="M" files="path/c.ts">corrected present-tense content</update>
@@ -8776,17 +8858,24 @@ Rules:
8776
8858
  - Every input memory id MUST appear exactly once, in exactly one of verified/update/archive/skip.
8777
8859
  - files = the COMPLETE current backing set (repo-relative, comma-separated). It may differ from the given mapping if a file moved — record what you actually verified against.
8778
8860
  - Default to VERIFIED. skip when code cannot decide the claim. update and archive are the exceptions, not the norm.`;
8861
+ async function seedVerifyCandidates(memories, directory) {
8862
+ const seeded = await seedIdentifierCandidates(memories.map((m) => ({ ...m, candidates: [] })), directory);
8863
+ return memories.map((m, i) => ({ ...m, candidates: seeded[i].candidates }));
8864
+ }
8779
8865
  function buildVerifyPrompt(projectPath, memories, evidence) {
8780
8866
  const list = memories.map((m) => `[${m.id}] ${m.category}
8781
8867
  Content: ${m.content}
8782
- Backing files: ${m.mappedFiles.join(", ")}`).join(`
8868
+ Backing files: ${m.mappedFiles.join(", ")}${m.candidates?.length ? `
8869
+ Likely files (identifier matches, confirm before using): ${m.candidates.join(", ")}` : ""}`).join(`
8783
8870
 
8784
8871
  `);
8785
8872
  return `## Verify these memories against the code
8786
8873
 
8787
8874
  Project: ${projectPath}
8788
8875
 
8789
- ${evidence ? "The git diff below is the evidence. If changed hunks do not touch a claim, mark it verified without opening files. Open files only when a diff suggests the claim may have changed. A rename or deletion requires an update or archive when positively supported; do not archive on uncertainty." : "Read each memory's backing files to check its claims."} Decide verified / update / archive / skip (default verified; behavioral directives only permit verified or skip), then output ONE <verify> manifest covering every id.
8876
+ When available in this session, use aft_outline to outline the backing file and aft_zoom on the claimed symbol (or aft_search to locate it), instead of paging through whole files. Read a whole file only when the claim is about the file as a whole. Otherwise use the available read-only tools.
8877
+
8878
+ ${evidence ? "The git diff below is the evidence. If changed hunks do not touch a claim, mark it verified without opening files. Open files only when a diff suggests the claim may have changed. A rename or deletion requires an update or archive when positively supported; do not archive on uncertainty." : "Check each memory's claim against its backing files."} Decide verified / update / archive / skip (default verified; behavioral directives only permit verified or skip), then output ONE <verify> manifest covering every id.
8790
8879
 
8791
8880
  <memories>
8792
8881
  ${list}
@@ -8863,13 +8952,57 @@ function validateVerifyManifest(text, expectedIds) {
8863
8952
  assertNoDuplicateManifestIds(ids.filter((id) => expectedIds.has(id)), "verify");
8864
8953
  return parsed;
8865
8954
  }
8955
+ function parsePartialVerifyManifest(text, expectedIds) {
8956
+ const out = { verified: [], updated: [], archived: [], skipped: [] };
8957
+ const start = text.lastIndexOf("<verify>");
8958
+ if (start < 0)
8959
+ return out;
8960
+ const entries = new Map;
8961
+ const conflicts = new Set;
8962
+ for (const match of text.slice(start).matchAll(/<(?:verified|archive|skip)\b[^<>]*\/>|<update\b[^<>]*>[\s\S]*?<\/update>/g)) {
8963
+ try {
8964
+ const parsed = parseVerifyManifest(`<verify>${match[0]}</verify>`);
8965
+ const id = verifyIds(parsed)[0];
8966
+ if (!expectedIds.has(id) || conflicts.has(id))
8967
+ continue;
8968
+ const previous = entries.get(id);
8969
+ if (previous && JSON.stringify(previous) !== JSON.stringify(parsed)) {
8970
+ entries.delete(id);
8971
+ conflicts.add(id);
8972
+ } else
8973
+ entries.set(id, parsed);
8974
+ } catch {}
8975
+ }
8976
+ for (const parsed of entries.values()) {
8977
+ out.verified.push(...parsed.verified);
8978
+ out.updated.push(...parsed.updated);
8979
+ out.archived.push(...parsed.archived);
8980
+ out.skipped.push(...parsed.skipped);
8981
+ }
8982
+ return out;
8983
+ }
8866
8984
 
8867
8985
  // src/features/magic-context/dreamer/verify.ts
8868
- var VERIFY_BATCH_SIZE = 20;
8986
+ var VERIFY_BATCH_SIZE = 5;
8987
+ var VERIFY_TOKENS_PER_MEMORY = 1e5;
8988
+ var VERIFY_RUN_TOKEN_BUDGET = 2500000;
8989
+ var VERIFY_RUN_SLICE_MS = 240000;
8990
+ function verifyBatchTokenBudget(size, configured) {
8991
+ return Math.min(configured ?? Number.MAX_SAFE_INTEGER, size * VERIFY_TOKENS_PER_MEMORY);
8992
+ }
8993
+ function verifyAssistantText(messages) {
8994
+ const text = messages.filter((m) => isRecord(m) && (m.role === "assistant" || isRecord(m.info) && m.info.role === "assistant")).map((m) => extractLatestAssistantText([m]) || (isRecord(m) && Array.isArray(m.content) ? m.content.filter(isRecord).filter((p) => p.type === "text").map((p) => p.text).join(`
8995
+ `) : "")).join(`
8996
+ `);
8997
+ if (!text.trim())
8998
+ return null;
8999
+ const start = text.lastIndexOf("<verify>");
9000
+ return start >= 0 ? text.slice(start) : text;
9001
+ }
8869
9002
  var IDENTICAL_PROVIDER_FAILURE_BATCH_LIMIT = 2;
8870
- var VERIFY_BATCH_FLOOR_MS = 240000;
8871
- function computeVerifyBatchSliceMs(remainingMs, batchesRemaining) {
8872
- return Math.min(remainingMs, Math.max(VERIFY_BATCH_FLOOR_MS, Math.floor(remainingMs / batchesRemaining)));
9003
+ var VERIFY_BATCH_FLOOR_MS = 30000;
9004
+ function computeVerifyBatchSliceMs(remainingMs, _batchesRemaining) {
9005
+ return Math.min(remainingMs, VERIFY_RUN_SLICE_MS);
8873
9006
  }
8874
9007
  function closeBroadCycle(args, cycleStartAt) {
8875
9008
  if (!args.forceBroad || cycleStartAt === undefined)
@@ -8893,6 +9026,7 @@ async function runVerify(args) {
8893
9026
  }
8894
9027
  async function runVerifyWithCooldown(args) {
8895
9028
  const runStartedAt = Date.now();
9029
+ const sliceDeadline = runStartedAt + VERIFY_RUN_SLICE_MS;
8896
9030
  const result = {
8897
9031
  verified: 0,
8898
9032
  updated: 0,
@@ -8935,16 +9069,31 @@ async function runVerifyWithCooldown(args) {
8935
9069
  let consecutiveProviderFailures = 0;
8936
9070
  let priorProviderFailureFingerprint = null;
8937
9071
  let lastProviderFailure = null;
9072
+ let runSpent = 0;
9073
+ const runTokenBudget = Math.min(args.tokenBudget ?? VERIFY_RUN_TOKEN_BUDGET, VERIFY_RUN_TOKEN_BUDGET);
8938
9074
  try {
8939
9075
  for (let i = 0;i < batches.length; i += 1) {
8940
- const remainingMs = Math.max(0, args.deadline - Date.now());
9076
+ const remainingMs = Math.max(0, Math.min(args.deadline, sliceDeadline) - Date.now());
8941
9077
  if (remainingMs < VERIFY_BATCH_FLOOR_MS) {
8942
9078
  result.stopReason = "deadline";
8943
9079
  log2(`[dreamer] ${args.forceBroad ? "verify-broad" : "verify"}: stopping before batch ${i + 1}/${batches.length} — remaining budget ${remainingMs}ms is below the ${VERIFY_BATCH_FLOOR_MS}ms batch floor`);
8944
9080
  break;
8945
9081
  }
8946
9082
  const sliceMs = computeVerifyBatchSliceMs(remainingMs, batches.length - i);
8947
- const counts = await verifyOneBatch(args, batches[i], sliceMs, abortController.signal);
9083
+ if (runSpent >= runTokenBudget) {
9084
+ result.stopReason = "token-budget";
9085
+ break;
9086
+ }
9087
+ let batchSpent = 0;
9088
+ const counts = await verifyOneBatch({
9089
+ ...args,
9090
+ tokenBudget: runTokenBudget - runSpent,
9091
+ onBudgetUpdate: (state) => {
9092
+ runSpent += Math.max(0, state.spent - batchSpent);
9093
+ batchSpent = Math.max(batchSpent, state.spent);
9094
+ args.onBudgetUpdate?.(state);
9095
+ }
9096
+ }, batches[i], sliceMs, abortController.signal);
8948
9097
  result.verified += counts.verified;
8949
9098
  result.updated += counts.updated;
8950
9099
  result.archived += counts.archived;
@@ -8954,6 +9103,10 @@ async function runVerifyWithCooldown(args) {
8954
9103
  result.remaining -= batchProcessed;
8955
9104
  result.batches += 1;
8956
9105
  args.onProgress?.(result.verified + result.updated + result.archived + result.skipped + result.refused, result.refused);
9106
+ if (counts.tokenLimited) {
9107
+ result.stopReason = "token-budget";
9108
+ break;
9109
+ }
8957
9110
  if (counts.timedOut) {
8958
9111
  result.stopReason = "batch-timeout";
8959
9112
  log2(`[dreamer] ${args.forceBroad ? "verify-broad" : "verify"}: batch ${i + 1}/${batches.length} timed out after its ${sliceMs}ms slice; stopping with ${result.remaining} remaining`);
@@ -8988,18 +9141,41 @@ async function runVerifyWithCooldown(args) {
8988
9141
  }
8989
9142
  }
8990
9143
  async function verifyOneBatch(args, batch, sliceMs, signal) {
9144
+ const batchController = new AbortController;
9145
+ const abort = () => batchController.abort(signal.reason);
9146
+ signal.addEventListener("abort", abort, { once: true });
9147
+ if (signal.aborted)
9148
+ abort();
9149
+ const timer = setTimeout(() => batchController.abort(new Error(`verify slice timed out after ${sliceMs}ms`)), sliceMs);
9150
+ const batchSignal = batchController.signal;
9151
+ const tokenBudget = verifyBatchTokenBudget(batch.length, args.tokenBudget);
8991
9152
  let agentSessionId = null;
9153
+ let hiddenSessionId = null;
8992
9154
  let promptSettled = false;
8993
9155
  const startedAt = Date.now();
8994
9156
  let budgetFinalized = false;
9157
+ let failedCompletion;
9158
+ let headAtPrompt = null;
8995
9159
  const onBudgetUpdate = (state) => {
8996
9160
  budgetFinalized ||= state.finalizeFired;
8997
- args.onBudgetUpdate?.(state);
9161
+ args.onBudgetUpdate?.({
9162
+ ...state,
9163
+ ...hiddenSessionId ? { sessionId: hiddenSessionId } : {}
9164
+ });
9165
+ };
9166
+ const reportUsage = (messages, sessionId, fallbackSpent = 0) => {
9167
+ const usage = sumTokensFromChildMessages(messages);
9168
+ onBudgetUpdate({
9169
+ spent: Math.max(fallbackSpent, usage.input + usage.cacheRead + usage.cacheWrite),
9170
+ finalizeFired: budgetFinalized,
9171
+ ...sessionId ? { sessionId } : {}
9172
+ });
8998
9173
  };
8999
9174
  try {
9000
- const headAtPrompt = await readGitHead(args.sessionDirectory);
9001
- const evidence = !args.forceBroad && batch.every((m) => m.verifiedAt) ? await buildVerifyDiffEvidence(args.sessionDirectory, batch) : null;
9002
- const prompt = buildVerifyPrompt(args.projectIdentity, batch, evidence);
9175
+ headAtPrompt = await raceWithSignal(readGitHead(args.sessionDirectory), batchSignal);
9176
+ const evidence = !args.forceBroad && batch.every((m) => m.verifiedAt) ? await raceWithSignal(buildVerifyDiffEvidence(args.sessionDirectory, batch), batchSignal) : null;
9177
+ const prompt = buildVerifyPrompt(args.projectIdentity, await raceWithSignal(seedVerifyCandidates(batch, args.sessionDirectory), batchSignal), evidence);
9178
+ batchSignal.throwIfAborted();
9003
9179
  if (args.hiddenCompletionExecutor) {
9004
9180
  const run = await runHiddenSingleShotPrompt({
9005
9181
  executor: args.hiddenCompletionExecutor,
@@ -9010,41 +9186,53 @@ async function verifyOneBatch(args, batch, sliceMs, signal) {
9010
9186
  prompt,
9011
9187
  title: "magic-context-dream-verify",
9012
9188
  callContext: "dreamer:verify",
9013
- metadata: { tokenBudget: args.tokenBudget, onBudgetUpdate },
9189
+ metadata: { tokenBudget, onBudgetUpdate },
9014
9190
  model: args.model,
9015
9191
  fallbackModels: args.fallbackModels,
9016
9192
  language: args.language,
9017
9193
  timeoutMs: sliceMs,
9018
- signal,
9194
+ signal: batchSignal,
9195
+ onFailureOutput: (completion) => {
9196
+ failedCompletion = completion;
9197
+ },
9198
+ onOpened: (sessionId) => {
9199
+ hiddenSessionId = sessionId;
9200
+ onBudgetUpdate({ spent: 0, finalizeFired: false, sessionId });
9201
+ },
9019
9202
  parse: (text, completion) => {
9020
9203
  const providerFailure = providerOutputFailureFromInvalidManifest(completion.messages ?? [], text);
9021
9204
  if (providerFailure)
9022
9205
  throw providerFailure;
9023
- return validateVerifyManifest(text, new Set(batch.map((memory) => memory.id)));
9206
+ const manifest = verifyAssistantText(completion.messages ?? []) ?? (text.trim() ? text : null);
9207
+ if (!manifest)
9208
+ throw new Error("verify returned no output");
9209
+ return validateVerifyManifest(manifest, new Set(batch.map((memory) => memory.id)));
9024
9210
  }
9025
9211
  });
9026
9212
  recordInvocation4(args, startedAt, {
9027
9213
  status: "completed",
9028
9214
  messages: run.completion.messages ?? []
9029
9215
  });
9030
- return applyParsedVerifyManifest(args, batch, run.validated, evidence?.head ?? headAtPrompt, budgetFinalized);
9216
+ reportUsage(run.completion.messages ?? [], run.childSessionId, run.completion.usage.input + (run.completion.usage.cacheRead ?? 0) + (run.completion.usage.cacheWrite ?? 0));
9217
+ return await applyParsedVerifyManifest(args, batch, run.validated, evidence?.head ?? headAtPrompt, budgetFinalized);
9031
9218
  }
9032
9219
  const client = args.client;
9033
9220
  if (!client)
9034
9221
  throw new Error("verify requires a client or hidden completion executor");
9035
- const createResponse = await createChildSessionWithFence({
9222
+ const createResponse = await raceWithSignal(createChildSessionWithFence({
9036
9223
  client,
9037
9224
  db: args.db,
9038
9225
  parentSessionId: args.parentSessionId,
9039
9226
  title: args.forceBroad ? "magic-context-dream-verify-broad" : "magic-context-dream-verify",
9040
9227
  directory: args.sessionDirectory
9041
- });
9228
+ }), batchSignal);
9042
9229
  const created = normalizeSDKResponse(createResponse, null, {
9043
9230
  preferResponseOnMissingData: true
9044
9231
  });
9045
9232
  agentSessionId = typeof created?.id === "string" ? created.id : null;
9046
9233
  if (!agentSessionId)
9047
9234
  throw new Error("Could not create verify session.");
9235
+ onBudgetUpdate({ spent: 0, finalizeFired: false, sessionId: agentSessionId });
9048
9236
  const run = await promptSyncWithValidatedOutputRetry(client, {
9049
9237
  path: { id: agentSessionId },
9050
9238
  query: { directory: args.sessionDirectory },
@@ -9056,11 +9244,11 @@ async function verifyOneBatch(args, batch, sliceMs, signal) {
9056
9244
  }
9057
9245
  }, {
9058
9246
  transport: createPromptAsyncTransport(client, agentSessionId, {
9059
- tokenBudget: args.tokenBudget,
9247
+ tokenBudget,
9060
9248
  onBudgetUpdate
9061
9249
  }),
9062
9250
  timeoutMs: sliceMs,
9063
- signal,
9251
+ signal: batchSignal,
9064
9252
  fallbackModels: args.fallbackModels,
9065
9253
  callContext: "dreamer:verify",
9066
9254
  fetchOutput: async () => {
@@ -9076,7 +9264,7 @@ async function verifyOneBatch(args, batch, sliceMs, signal) {
9076
9264
  if (hasLengthCappedOutput(messages)) {
9077
9265
  throw new Error("verify returned length-capped output");
9078
9266
  }
9079
- const text = extractLatestAssistantText(messages);
9267
+ const text = verifyAssistantText(messages);
9080
9268
  if (!text)
9081
9269
  throw new Error("verify returned no output");
9082
9270
  const providerFailure = providerOutputFailureFromInvalidManifest(messages, text);
@@ -9087,27 +9275,31 @@ async function verifyOneBatch(args, batch, sliceMs, signal) {
9087
9275
  });
9088
9276
  promptSettled = true;
9089
9277
  recordInvocation4(args, startedAt, { status: "completed", messages: run.output });
9278
+ reportUsage(run.output, agentSessionId);
9090
9279
  return await applyParsedVerifyManifest(args, batch, run.validated, evidence?.head ?? headAtPrompt, budgetFinalized);
9091
9280
  } catch (error) {
9092
9281
  const desc = describeError(error);
9093
9282
  const providerFailure = error instanceof DreamerProviderOutputFailureError ? error : undefined;
9094
9283
  const promptFailure = getPromptFailureDetail(error);
9095
9284
  log2(`[dreamer] verify batch ${providerFailure ? "provider failure" : "failed"}: ${desc.brief}`, desc.stackHead ? { stackHead: desc.stackHead } : undefined);
9285
+ const messages = failedCompletion?.messages ?? await readFailedChildMessages(args.client, agentSessionId, args.sessionDirectory) ?? [];
9286
+ reportUsage(messages, hiddenSessionId ?? agentSessionId, failedCompletion?.usage.input ?? 0);
9096
9287
  recordInvocation4(args, startedAt, {
9097
9288
  status: failedInvocationStatus(error),
9098
9289
  error,
9099
- messages: await readFailedChildMessages(args.client, agentSessionId, args.sessionDirectory)
9290
+ messages
9100
9291
  });
9101
- if (error instanceof DreamerModuleFailureError || error instanceof DreamTokenBudgetExceeded || signal.aborted)
9292
+ if (error instanceof DreamerModuleFailureError || signal.aborted)
9102
9293
  throw error;
9103
- if (promptFailure?.failureClass === "provider_timeout" || isPromptTimeoutError(error)) {
9294
+ const interrupted = batchSignal.aborted || error instanceof DreamTokenBudgetExceeded || promptFailure?.failureClass === "provider_timeout" || isPromptTimeoutError(error);
9295
+ if (interrupted) {
9296
+ const text = verifyAssistantText(messages) ?? failedCompletion?.text ?? "";
9297
+ const recovered = parsePartialVerifyManifest(text, new Set(batch.map((m) => m.id)));
9298
+ const counts = await applyParsedVerifyManifest(args, batch, recovered, headAtPrompt, true);
9104
9299
  return {
9105
- verified: 0,
9106
- updated: 0,
9107
- archived: 0,
9108
- skipped: 0,
9109
- refused: 0,
9110
- timedOut: true
9300
+ ...counts,
9301
+ timedOut: !(error instanceof DreamTokenBudgetExceeded),
9302
+ tokenLimited: error instanceof DreamTokenBudgetExceeded
9111
9303
  };
9112
9304
  }
9113
9305
  if (promptFailure !== null && promptFailure.failureClass !== "parse_failed" && !providerFailure)
@@ -9122,7 +9314,7 @@ async function verifyOneBatch(args, batch, sliceMs, signal) {
9122
9314
  };
9123
9315
  } finally {
9124
9316
  if (agentSessionId && args.client)
9125
- await teardownChildSession({
9317
+ await raceWithSignal(teardownChildSession({
9126
9318
  client: args.client,
9127
9319
  sessionId: agentSessionId,
9128
9320
  sessionDirectory: args.sessionDirectory,
@@ -9130,7 +9322,9 @@ async function verifyOneBatch(args, batch, sliceMs, signal) {
9130
9322
  privacySensitive: true,
9131
9323
  context: "[dreamer] verify",
9132
9324
  log: log2
9133
- });
9325
+ }), batchSignal).catch(() => {});
9326
+ clearTimeout(timer);
9327
+ signal.removeEventListener("abort", abort);
9134
9328
  }
9135
9329
  }
9136
9330
  async function applyParsedVerifyManifest(args, batch, parsed, headAtPrompt, budgetFinalized = false) {
@@ -9157,7 +9351,7 @@ async function applyParsedVerifyManifest(args, batch, parsed, headAtPrompt, budg
9157
9351
  throw new Error(`verify manifest covers ${validIds.length}/${batch.length} batch ids after filtering unknown entries; rejecting mostly-wrong manifest`);
9158
9352
  }
9159
9353
  if (budgetFinalized && validIds.length < batch.length) {
9160
- log2(`[dreamer] verify: accepted partial manifest after token budget: ${validIds.length}/${batch.length}`);
9354
+ log2(`[dreamer] verify: accepted partial manifest after investigation stop: ${validIds.length}/${batch.length}`);
9161
9355
  }
9162
9356
  if (validIds.length === 0) {
9163
9357
  return { verified: 0, updated: 0, archived: 0, skipped: 0, refused: 0 };
@@ -9392,10 +9586,10 @@ function dreamRunFailureDetail(error) {
9392
9586
  child_session_id: null
9393
9587
  };
9394
9588
  }
9395
- const localRefusal = error instanceof HiddenCompletionRefusal;
9589
+ const localRefusal = error instanceof HiddenCompletionRefusal || error instanceof DreamerModuleFailureError;
9396
9590
  const providerFailure = error instanceof Error && error.name === "DreamerProviderOutputFailureError";
9397
9591
  return {
9398
- failure_class: localRefusal ? "local_refusal" : providerFailure ? "provider_error" : /no models?|model chain is empty/i.test(message) ? "no_models" : "unknown",
9592
+ failure_class: localRefusal ? "local_refusal" : providerFailure ? "provider_error" : /lease_(?:lost|expired)|Dream lease (?:lost|unavailable)/i.test(message) ? "child_aborted" : /no models?|model chain is empty/i.test(message) ? "no_models" : "unknown",
9399
9593
  model_attempted: null,
9400
9594
  models_tried: [],
9401
9595
  provider_error: providerFailure ? sanitizeDiagnosticText(message).slice(0, 500) : null,
@@ -9406,6 +9600,10 @@ function dreamRunFailureDetail(error) {
9406
9600
  } : {}
9407
9601
  };
9408
9602
  }
9603
+ function incompleteFailure(error, fallback = "parse_failed") {
9604
+ const detail = dreamRunFailureDetail(error);
9605
+ return detail.failure_class === "unknown" ? { ...detail, failure_class: fallback } : detail;
9606
+ }
9409
9607
  function classifyFailure(error) {
9410
9608
  const described = describeError(error);
9411
9609
  const brief = described.brief;
@@ -9565,6 +9763,7 @@ function createDreamTaskExecutor(deps) {
9565
9763
  const { db, projectIdentity, holderId, leaseKey } = ctx;
9566
9764
  deps.client?.resetDreamTokenBudget?.(config.task);
9567
9765
  const startedAt = Date.now();
9766
+ const effectiveTokenBudget = config.task === "verify" || config.task === "verify-broad" ? Math.min(config.tokenBudget ?? VERIFY_RUN_TOKEN_BUDGET, VERIFY_RUN_TOKEN_BUDGET) : config.tokenBudget;
9568
9767
  const leaseAcquisition = ctx.leaseAcquisition ?? acquireLeaseWithAcquisition(db, holderId, leaseKey) ?? (() => {
9569
9768
  throw new Error("Dream lease unavailable during executor setup");
9570
9769
  })();
@@ -9612,7 +9811,7 @@ function createDreamTaskExecutor(deps) {
9612
9811
  if (state.sessionId) {
9613
9812
  const previous = childSpending.get(state.sessionId) ?? 0;
9614
9813
  budgetSpent += Math.max(0, state.spent - previous);
9615
- childSpending.set(state.sessionId, state.spent);
9814
+ childSpending.set(state.sessionId, Math.max(previous, state.spent));
9616
9815
  } else
9617
9816
  budgetSpent = Math.max(budgetSpent, state.spent);
9618
9817
  budgetFinalized ||= state.finalizeFired;
@@ -9639,9 +9838,15 @@ function createDreamTaskExecutor(deps) {
9639
9838
  failure: extra?.failure ?? dreamRunFailureDetail(error ?? "unknown dreamer failure")
9640
9839
  } : {},
9641
9840
  ...extra?.progress ? { progress: extra.progress } : {},
9642
- ...config.tokenBudget ? {
9841
+ ...childSpending.size ? {
9842
+ children: [...childSpending].map(([sessionId, promptTokens]) => ({
9843
+ sessionId,
9844
+ promptTokens
9845
+ }))
9846
+ } : {},
9847
+ ...effectiveTokenBudget ? {
9643
9848
  tokenBudget: {
9644
- budget: config.tokenBudget,
9849
+ budget: effectiveTokenBudget,
9645
9850
  spent: budgetSpent,
9646
9851
  finalizeFired: budgetFinalized,
9647
9852
  banked: extra?.banked ?? processedDreamTaskItems(backlogAtStart.pending, (extra?.backlogAfter ?? getDreamTaskBacklog(db, projectIdentity, config.task)).pending)
@@ -9730,8 +9935,13 @@ function createDreamTaskExecutor(deps) {
9730
9935
  });
9731
9936
  log2(`[dreamer] compress-cues: compressed=${result.compressed} skipped=${result.skipped} chunks=${result.chunks} remaining=${result.remaining}`);
9732
9937
  if (!result.complete) {
9733
- const error = incompleteMessage(result.remaining);
9734
- recordRun("failed", error);
9938
+ if (result.stopReason === "deadline" && result.chunks === 0)
9939
+ return skip("compress-cues: insufficient time to start a chunk");
9940
+ const error = `${incompleteMessage(result.remaining)}; ${result.failureStage ? `${result.failureStage}: ` : ""}${result.failure ? describeError(result.failure).brief : `${result.skipped} cues rejected by validation`}`;
9941
+ recordRun("failed", error, {
9942
+ banked: result.compressed,
9943
+ failure: incompleteFailure(result.failure, result.failureStage === "child-start" ? "local_refusal" : result.stopReason === "timeout-circuit-breaker" ? "provider_timeout" : "parse_failed")
9944
+ });
9735
9945
  return { status: "failed", transient: true, error };
9736
9946
  }
9737
9947
  recordRun("completed", null);
@@ -9777,9 +9987,15 @@ function createDreamTaskExecutor(deps) {
9777
9987
  });
9778
9988
  log2(`[dreamer] map-memories: committed=${result.mapped + result.independent} mapped=${result.mapped} independent=${result.independent} batches=${result.batches} remaining=${result.remaining} complete=${result.complete}${result.stopReason ? ` stop_reason=${result.stopReason}` : ""}`);
9779
9989
  if (!result.complete) {
9990
+ if (result.deferred)
9991
+ return skip("map-memories: all pending mappings are in content-keyed retry backoff; no child started");
9992
+ if (result.stopReason === "deadline" && result.batches === 0 && !result.failure)
9993
+ return skip("map-memories: insufficient time to start a batch");
9780
9994
  if (result.stopReason === "timeout-circuit-breaker") {
9781
9995
  const error = `map-memories starvation: timeout circuit breaker stopped the run with ${result.remaining} remain`;
9782
- recordRun("failed", error);
9996
+ recordRun("failed", error, {
9997
+ failure: incompleteFailure(result.failure, "provider_timeout")
9998
+ });
9783
9999
  return { status: "failed", transient: true, error };
9784
10000
  }
9785
10001
  const processed = result.mapped + result.independent;
@@ -9788,8 +10004,10 @@ function createDreamTaskExecutor(deps) {
9788
10004
  recordRun("completed", null, { progress });
9789
10005
  return { status: "completed" };
9790
10006
  }
9791
- const error = incompleteMessage(result.remaining);
9792
- recordRun("failed", error);
10007
+ const error = `${incompleteMessage(result.remaining)}; ${result.failureStage ? `${result.failureStage}: ` : ""}${result.failure ? describeError(result.failure).brief : "manifest returned no accepted mapping decisions"}`;
10008
+ recordRun("failed", error, {
10009
+ failure: incompleteFailure(result.failure, result.failureStage === "child-start" ? "local_refusal" : "parse_failed")
10010
+ });
9793
10011
  return { status: "failed", transient: true, error };
9794
10012
  }
9795
10013
  recordRun("completed", null);
@@ -9819,25 +10037,27 @@ function createDreamTaskExecutor(deps) {
9819
10037
  });
9820
10038
  const processed = result.verified + result.updated + result.archived + result.skipped + result.refused;
9821
10039
  const verificationProgress = `${config.task}${config.task === "verify-broad" ? ` cycle ${result.broadCycleStartAt ?? "open"}` : ""}: processed ${processed} (verified ${result.verified}, updated ${result.updated}, archived ${result.archived}, skipped ${result.skipped}, refused ${result.refused}); ${result.remaining} remain`;
9822
- const broadProgress = config.task === "verify-broad" ? verificationProgress : null;
9823
10040
  const backlogAfter = config.task === "verify-broad" ? { pending: result.remaining, total: backlogAtStart.total } : undefined;
9824
10041
  if (!result.complete) {
9825
- if (broadProgress && processed > 0) {
10042
+ if (processed > 0) {
9826
10043
  recordRun("completed", null, {
9827
- progress: broadProgress,
10044
+ progress: verificationProgress,
9828
10045
  memoryChanges: computeMemoryDelta(memoryBefore),
9829
10046
  backlogAfter,
9830
10047
  banked: result.verified + result.updated + result.archived
9831
10048
  });
9832
10049
  return { status: "completed" };
9833
10050
  }
10051
+ if (result.stopReason === "deadline")
10052
+ return skip(`${config.task}: insufficient time to start a batch`);
9834
10053
  const batchTimedOut = result.stopReason === "batch-timeout";
9835
10054
  const error = batchTimedOut ? `${config.task}: a batch timed out within its time slice; ${result.remaining} remain` : incompleteMessage(result.remaining);
9836
10055
  recordRun("failed", error, {
9837
10056
  progress: verificationProgress,
9838
10057
  memoryChanges: computeMemoryDelta(memoryBefore),
9839
10058
  backlogAfter,
9840
- banked: result.verified + result.updated + result.archived
10059
+ banked: result.verified + result.updated + result.archived,
10060
+ failure: incompleteFailure(error, batchTimedOut ? "provider_timeout" : result.stopReason === "token-budget" ? "token_budget" : "parse_failed")
9841
10061
  });
9842
10062
  return { status: "failed", transient: !batchTimedOut, error };
9843
10063
  }
@@ -9961,6 +10181,7 @@ function createDreamTaskExecutor(deps) {
9961
10181
  if (retro.skipReason)
9962
10182
  return skip(retro.skipReason);
9963
10183
  recordRun("completed", null, {
10184
+ progress: retro.noOpReason,
9964
10185
  memoryChanges: computeMemoryDelta(memoryBefore),
9965
10186
  backlogAfter: retro.retrospectiveWatermarkMs == null ? undefined : getDreamTaskBacklog(db, projectIdentity, "retrospective", {
9966
10187
  retrospectiveWatermarkMs: retro.retrospectiveWatermarkMs
@@ -9968,6 +10189,7 @@ function createDreamTaskExecutor(deps) {
9968
10189
  });
9969
10190
  return {
9970
10191
  status: "completed",
10192
+ ...retro.noOpReason ? { detail: retro.noOpReason } : {},
9971
10193
  schedulePatch: retro.retrospectiveWatermarkMs != null || retro.taskStateJson !== undefined ? {
9972
10194
  ...retro.retrospectiveWatermarkMs != null ? {
9973
10195
  retrospectiveWatermarkMs: retro.retrospectiveWatermarkMs
@@ -10167,20 +10389,28 @@ async function runRetrospectiveTask(config, ctx, helpers) {
10167
10389
  const recencyCutoffMs = helpers.invocationStartedAt - recencyDays * RETROSPECTIVE_DAY_MS;
10168
10390
  const scan = await readRetrospectiveScanWindow(provider, projectIdentity, watermarkMs, RETROSPECTIVE_OVERLAP_USER_LINES, { usableInputTokens, recencyCutoffMs });
10169
10391
  const clearedTaskStateJson = activeOverflow ? writeRetrospectiveOverflowState(taskState.root, null) : undefined;
10170
- const completedWindow = (retrospectiveWatermarkMs) => ({
10392
+ const completedWindow = (retrospectiveWatermarkMs, noOpReason) => ({
10171
10393
  retrospectiveWatermarkMs,
10172
- ...clearedTaskStateJson ? { taskStateJson: clearedTaskStateJson } : {}
10394
+ ...clearedTaskStateJson ? { taskStateJson: clearedTaskStateJson } : {},
10395
+ ...noOpReason ? { noOpReason } : {}
10173
10396
  });
10174
10397
  const messages = withGlobalOrdinals(scan.messages);
10175
10398
  const userMessages = messages.filter((message) => message.role === "user" && message.text.trim().length > 0);
10176
10399
  if (userMessages.length === 0) {
10177
- log2("[dreamer] retrospective: no user messages in window");
10178
- return completedWindow(scan.maxScannedTs);
10400
+ const noOpReason = "no reply-following user lines";
10401
+ log2(`[dreamer] retrospective: ${noOpReason}`);
10402
+ return completedWindow(scan.maxScannedTs, noOpReason);
10179
10403
  }
10180
- const postWatermarkOrdinals = new Set(userMessages.filter((message) => message.ts > watermarkMs).map((message) => message.ordinal));
10181
- if (postWatermarkOrdinals.size === 0) {
10404
+ const newUserOrdinals = new Set(userMessages.filter((message) => message.ts > watermarkMs).map((message) => message.ordinal));
10405
+ if (newUserOrdinals.size === 0) {
10182
10406
  log2("[dreamer] retrospective: only overlap lines, nothing new");
10183
- return completedWindow(scan.maxScannedTs);
10407
+ return completedWindow(scan.maxScannedTs, "only overlap lines, nothing new");
10408
+ }
10409
+ const postWatermarkOrdinals = new Set(userMessages.filter((message) => message.ts > watermarkMs && message.followsAssistantReply === true).map((message) => message.ordinal));
10410
+ if (postWatermarkOrdinals.size === 0) {
10411
+ const noOpReason = "no reply-following user lines";
10412
+ log2(`[dreamer] retrospective: ${noOpReason}`);
10413
+ return completedWindow(scan.maxScannedTs, noOpReason);
10184
10414
  }
10185
10415
  const abortController = new AbortController;
10186
10416
  let leaseLost = false;
@@ -13614,12 +13844,12 @@ function buildTriggerInMemoryTail(db, sessionId, messages) {
13614
13844
  function getProactiveCompartmentTriggerPercentage(executeThresholdPercentage) {
13615
13845
  return Math.max(0, executeThresholdPercentage - PROACTIVE_TRIGGER_OFFSET_PERCENTAGE);
13616
13846
  }
13617
- function estimateProjectedPostDropPercentage(db, sessionId, usage, activeTags, keepReasoningTokens, clearedReasoningThroughTag, canClearReasoning, liveBudgetCutoff) {
13847
+ function estimateProjectedPostDropPercentage(db, sessionId, usage, activeTags, keepReasoningTokens, clearedReasoningThroughTag, canClearReasoning, liveBudgetCutoff, eligiblePendingDropTagIds) {
13618
13848
  const totalActiveBytes = activeTags.reduce((sum, tag) => sum + tag.byteSize + tag.reasoningByteSize, 0);
13619
13849
  if (totalActiveBytes === 0)
13620
13850
  return null;
13621
13851
  let droppableBytes = 0;
13622
- const pendingDrops = getPendingOps(db, sessionId).filter((op) => op.operation === "drop");
13852
+ const pendingDrops = getPendingOps(db, sessionId).filter((op) => op.operation === "drop" && eligiblePendingDropTagIds?.has(op.tagId) === true);
13623
13853
  const pendingDropTagIds = new Set(pendingDrops.map((op) => op.tagId));
13624
13854
  if (pendingDrops.length > 0) {
13625
13855
  droppableBytes += activeTags.filter((tag) => pendingDropTagIds.has(tag.tagNumber)).reduce((sum, tag) => sum + tag.byteSize + tag.reasoningByteSize, 0);
@@ -13748,7 +13978,7 @@ function getUnsummarizedTailInfo(db, sessionId, triggerBudget, usage, executeThr
13748
13978
  function formatProjectedPostDropPercentage(value) {
13749
13979
  return value === null ? "none" : `${value.toFixed(1)}%`;
13750
13980
  }
13751
- function checkCompartmentTrigger(db, sessionId, sessionMeta, usage, _previousPercentage, executeThresholdPercentage, triggerBudget, keepReasoningTokens, commitClusterTrigger, preloadedActiveTags, contextLimit, inMemoryTail, taggerFloorOverride, reasoningProjection, reclaimRide) {
13981
+ function checkCompartmentTrigger(db, sessionId, sessionMeta, usage, _previousPercentage, executeThresholdPercentage, triggerBudget, keepReasoningTokens, commitClusterTrigger, preloadedActiveTags, contextLimit, inMemoryTail, taggerFloorOverride, reasoningProjection, reclaimRide, eligiblePendingDropTagIds) {
13752
13982
  if (sessionMeta.compartmentInProgress) {
13753
13983
  sessionLog2(sessionId, `compartment trigger: skipped — historian already in progress (usage=${usage.percentage.toFixed(1)}%)`);
13754
13984
  return { shouldFire: false };
@@ -13812,7 +14042,7 @@ function checkCompartmentTrigger(db, sessionId, sessionMeta, usage, _previousPer
13812
14042
  return { shouldFire: false };
13813
14043
  }
13814
14044
  const canClearReasoning = reasoningProjection?.canClearReasoning ?? modelAcceptsEmptyContent(reasoningProjection?.providerID);
13815
- const projectedPostDropPercentage = estimateProjectedPostDropPercentage(db, sessionId, usage, preloadedActiveTags ?? getActiveTagsBySession2(db, sessionId), keepReasoningTokens, sessionMeta.clearedReasoningThroughTag, canClearReasoning, reasoningProjection?.budgetCutoff);
14045
+ const projectedPostDropPercentage = estimateProjectedPostDropPercentage(db, sessionId, usage, preloadedActiveTags ?? getActiveTagsBySession2(db, sessionId), keepReasoningTokens, sessionMeta.clearedReasoningThroughTag, canClearReasoning, reasoningProjection?.budgetCutoff, eligiblePendingDropTagIds);
13816
14046
  const relativePostDropTarget = executeThresholdPercentage * POST_DROP_TARGET_RATIO;
13817
14047
  const rideLabel = reclaimRide ? reclaimRideLabel(reclaimRide) : "ride=none";
13818
14048
  const dropsCanLand = reclaimRide !== undefined && hasReclaimRide(reclaimRide);
@@ -15979,7 +16209,7 @@ function registerRpcHandlers(rpcServer, args) {
15979
16209
  return { count: buildCompartmentCount(db, sessionId, moduleStatus) };
15980
16210
  });
15981
16211
  const buildManagedCtx = async (db) => {
15982
- const { deriveHistorianChunkTokens, resolveHistorianContextLimit } = await importPluginModule(() => import("./derive-budgets-5306b1jt.js"));
16212
+ const { deriveHistorianChunkTokens, resolveHistorianContextLimit } = await importPluginModule(() => import("./derive-budgets-zn7yzd2d.js"));
15983
16213
  const { resolveHistorianModel } = await importPluginModule(() => import("./model-resolution-nx97z3x7.js"));
15984
16214
  const { userObservationCollectionEnabled, userObservationsRequested } = await importPluginModule(() => import("./task-config-x3qmayd2.js"));
15985
16215
  const DEFAULT_HISTORIAN_TIMEOUT_MS = 10 * 60 * 1000;
@@ -16031,8 +16261,8 @@ function registerRpcHandlers(rpcServer, args) {
16031
16261
  const db = readDatabase();
16032
16262
  if (!db)
16033
16263
  return { ok: false, error: "db unavailable" };
16034
- const { runManagedRecomp } = await importPluginModule(() => import("./recomp-orchestrator-a0mvby4e.js"));
16035
- const { sendIgnoredMessage } = await importPluginModule(() => import("./send-session-notification-y2wg3fkh.js"));
16264
+ const { runManagedRecomp } = await importPluginModule(() => import("./recomp-orchestrator-xqb9gwgm.js"));
16265
+ const { sendIgnoredMessage } = await importPluginModule(() => import("./send-session-notification-24r4esbh.js"));
16036
16266
  log2(`[rpc] recomp requested for session ${sessionId}`);
16037
16267
  if (!args.client && !args.hiddenCompletionExecutor) {
16038
16268
  return {
@@ -16116,7 +16346,7 @@ function registerRpcHandlers(rpcServer, args) {
16116
16346
  const db = readDatabase();
16117
16347
  if (!db)
16118
16348
  return { ok: false, error: "db unavailable" };
16119
- const { runManagedWrapup } = await importPluginModule(() => import("./wrapup-orchestrator-vmt6z3q5.js"));
16349
+ const { runManagedWrapup } = await importPluginModule(() => import("./wrapup-orchestrator-kxqj4rwh.js"));
16120
16350
  const model = liveSessionState.liveModelBySession.get(sessionId);
16121
16351
  const contextLimit = model ? resolveContextLimit(model.providerID, model.modelID, { db, sessionID: sessionId }) : 128000;
16122
16352
  const ctx = {
@@ -16190,6 +16420,85 @@ function registerRpcHandlers(rpcServer, args) {
16190
16420
  });
16191
16421
  }
16192
16422
 
16423
+ // src/hooks/magic-context/auto-embed-session.ts
16424
+ function embeddingIdentity(projectIdentity) {
16425
+ const snapshot = getProjectEmbeddingSnapshot2(projectIdentity);
16426
+ return JSON.stringify([
16427
+ projectIdentity,
16428
+ snapshot?.providerIdentity,
16429
+ snapshot?.chunkModelId,
16430
+ snapshot?.runtimeFingerprint
16431
+ ]);
16432
+ }
16433
+ function maybeAutoEmbedSessionBackfill(deps, sessionId) {
16434
+ const markActive = () => activeEmbeddingSessions.set(sessionId, {
16435
+ project: deps.projectIdentity,
16436
+ model: getProjectEmbeddingSnapshot2(deps.projectIdentity)?.chunkModelId ?? "off"
16437
+ });
16438
+ markActive();
16439
+ const identity = embeddingIdentity(deps.projectIdentity);
16440
+ if (autoEmbedIdentityBySession.get(sessionId) !== identity) {
16441
+ invalidateAutoEmbedSession(sessionId);
16442
+ autoEmbedIdentityBySession.set(sessionId, identity);
16443
+ }
16444
+ if (autoEmbedAttemptedBySession.has(sessionId) || embedPauseBySession.has(sessionId) || embedRunStateBySession.has(sessionId) || Date.now() < (autoEmbedRetryAfterBySession.get(sessionId) ?? 0))
16445
+ return;
16446
+ const controller = new AbortController;
16447
+ embedRunStateBySession.set(sessionId, controller);
16448
+ (async () => {
16449
+ let complete = false;
16450
+ let retryDelay = 1000;
16451
+ let started = false;
16452
+ let reason = "error";
16453
+ let registeredIdentity = identity;
16454
+ try {
16455
+ await new Promise((resolve) => setTimeout(resolve, 0));
16456
+ if (controller.signal.aborted)
16457
+ return;
16458
+ await deps.ensureRegistered();
16459
+ if (controller.signal.aborted)
16460
+ return;
16461
+ markActive();
16462
+ registeredIdentity = embeddingIdentity(deps.projectIdentity);
16463
+ autoEmbedIdentityBySession.set(sessionId, registeredIdentity);
16464
+ const coverage = await getAutoEmbeddingSessionCoverage2(deps.db, deps.projectIdentity, sessionId);
16465
+ if (controller.signal.aborted || !coverage.enabled)
16466
+ return;
16467
+ if (coverage.embedded === coverage.total) {
16468
+ complete = true;
16469
+ return;
16470
+ }
16471
+ const model = getProjectEmbeddingSnapshot2(deps.projectIdentity)?.model;
16472
+ log2(`[magic-context] session backfill start session=${sessionId} missing=${coverage.total - coverage.embedded} model=${model}`);
16473
+ started = true;
16474
+ const outcome = await embedSessionCompartmentChunks2(deps.db, deps.projectIdentity, sessionId, { signal: controller.signal, automatic: true });
16475
+ reason = outcome.status;
16476
+ const after = await getAutoEmbeddingSessionCoverage2(deps.db, deps.projectIdentity, sessionId);
16477
+ complete = after.enabled && after.embedded === after.total;
16478
+ if (!complete && outcome.status !== "busy" && outcome.status !== "aborted") {
16479
+ retryDelay = 60000;
16480
+ if (outcome.status === "nothing" || outcome.status === "done")
16481
+ reason = "deferred";
16482
+ }
16483
+ } catch (error) {
16484
+ log2("[magic-context] auto-embed drain failed:", error);
16485
+ retryDelay = 60000;
16486
+ } finally {
16487
+ if (started)
16488
+ log2(`[magic-context] session backfill ${complete ? "complete" : "stop"} session=${sessionId} reason=${reason}`);
16489
+ if (embedRunStateBySession.get(sessionId) === controller) {
16490
+ embedRunStateBySession.delete(sessionId);
16491
+ }
16492
+ if (!controller.signal.aborted && autoEmbedIdentityBySession.get(sessionId) === registeredIdentity && embeddingIdentity(deps.projectIdentity) === registeredIdentity) {
16493
+ if (complete)
16494
+ autoEmbedAttemptedBySession.add(sessionId);
16495
+ else
16496
+ autoEmbedRetryAfterBySession.set(sessionId, Date.now() + retryDelay);
16497
+ }
16498
+ }
16499
+ })();
16500
+ }
16501
+
16193
16502
  // src/features/magic-context/transform-decision-log.ts
16194
16503
  var TRANSFORM_DECISIONS_RETENTION = 2000;
16195
16504
  var canonicalReasons = new Set([
@@ -23376,6 +23685,13 @@ async function runCompartmentPhaseImpl(args) {
23376
23685
  return snapshot !== null && hasRunnableCompartmentWindow(snapshot);
23377
23686
  }
23378
23687
  async function awaitCompartmentRun(activeRun, reason) {
23688
+ await Promise.resolve();
23689
+ if (activeRun.inlineJoinTimedOutBudgetMs !== undefined && !activeRun.settled) {
23690
+ historianJoinTimedOut = true;
23691
+ historianJoinBudgetMs = activeRun.inlineJoinTimedOutBudgetMs;
23692
+ sessionLog2(args.sessionId, "transform: compartment inline join budget already exhausted for this run — not waiting again");
23693
+ return "timed_out";
23694
+ }
23379
23695
  sessionLog2(args.sessionId, reason);
23380
23696
  const timeoutMs = resolveHistorianInlineJoinBudget(args.historianTimeoutMs);
23381
23697
  historianJoinBudgetMs = timeoutMs;
@@ -23391,6 +23707,7 @@ async function runCompartmentPhaseImpl(args) {
23391
23707
  clearTimeout(timer);
23392
23708
  }
23393
23709
  if (result === "timeout") {
23710
+ activeRun.inlineJoinTimedOutBudgetMs = timeoutMs;
23394
23711
  historianJoinTimedOut = true;
23395
23712
  sessionLog2(args.sessionId, `transform: compartment await timed out after ${timeoutMs}ms — proceeding without waiting`);
23396
23713
  return "timed_out";
@@ -23678,6 +23995,7 @@ function createTransform(deps) {
23678
23995
  memorySyncRequestedSessions: deps.rustMemorySyncRequestedSessions
23679
23996
  }) : undefined;
23680
23997
  let entryReuse;
23998
+ const pendingDropEligibility = createPendingDropEligibilityCache();
23681
23999
  const projectEntry = createLkgEntryProjector({
23682
24000
  onReuse: (stats) => {
23683
24001
  entryReuse = stats;
@@ -24248,6 +24566,18 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so Ma
24248
24566
  prewarmTagOwners(db, sessionId, ownerRatio);
24249
24567
  const tagOwnersReady = isTagOwnerSummaryReady2(db, sessionId, ownerRatio);
24250
24568
  let triggerBoundarySnapshot;
24569
+ let dropProjectionEmergency = contextUsageEarly.percentage >= 95;
24570
+ const dropProjectionKey = () => pendingDropEligibilityKey(db, sessionId, lkgInput, {
24571
+ currentTurnId,
24572
+ model: modelForBudget,
24573
+ protectedTokens: deps.protectedTokens,
24574
+ protectedTokenTierOverrides: deps.protectedTokenTierOverrides,
24575
+ protectedTools: deps.protectedTools,
24576
+ keepReasoningTokens: deps.keepReasoningTokens,
24577
+ usableSoft: windowGeometry?.usableSoft ?? boundaryContextLimit,
24578
+ emergency: dropProjectionEmergency,
24579
+ clearedReasoningThroughTag: sessionMeta?.clearedReasoningThroughTag
24580
+ });
24251
24581
  if (fullFeatureMode && !compactionOff && historianRunnable && tagOwnersReady && !sessionMeta.compartmentInProgress) {
24252
24582
  const tTrigger = performance.now();
24253
24583
  try {
@@ -24260,7 +24590,7 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so Ma
24260
24590
  force: contextUsageEarly.percentage >= forceMaterializationPercentage && (contextUsageEarly.percentage >= 95 || getEmergencyInputSample(db, sessionId) === 0),
24261
24591
  explicitFlush: deps.pendingMaterializationSessions.has(sessionId),
24262
24592
  publishedHistory: isCacheBusting
24263
- });
24593
+ }, pendingDropEligibility.read(sessionId, dropProjectionKey()));
24264
24594
  if (triggerResult.shouldFire) {
24265
24595
  sessionLog2(sessionId, `compartment trigger: firing (reason=${triggerResult.reason})`);
24266
24596
  updateSessionMeta(db, sessionId, { compartmentInProgress: true });
@@ -24566,6 +24896,7 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so Ma
24566
24896
  const protectedTagIds = protectedTagNumbers;
24567
24897
  const protectedCutoff = protectionWindow.cutoff;
24568
24898
  const tPostProcess = performance.now();
24899
+ dropProjectionEmergency = thinkingFitRetries.has(sessionId) || contextUsage.percentage >= 95;
24569
24900
  const postTransformResult = await runPostTransformPhase2({
24570
24901
  opencode2: deps.storeGeneration === "v2",
24571
24902
  normalizeRecoveryTail,
@@ -24623,6 +24954,7 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so Ma
24623
24954
  lastHeuristicsTurnId: deps.lastHeuristicsTurnId,
24624
24955
  keepReasoningTokens: resolveKeepReasoningTokens(deps.keepReasoningTokens, currentModelKeyForBoundary),
24625
24956
  protectedTagIds,
24957
+ onPendingDropEligibility: (eligible) => pendingDropEligibility.record(sessionId, dropProjectionKey(), eligible),
24626
24958
  protectedTagNumbers,
24627
24959
  protectedCutoff,
24628
24960
  protectedCount: protectionWindow.status.protectedCount,
@@ -28845,4 +29177,4 @@ function applyHiddenSubagentTemperature(input, output, log) {
28845
29177
  output.temperature = temperature;
28846
29178
  }
28847
29179
 
28848
- export { logConfigDependencyNotesOnce, openOpenCodeDb, DREAMER_SYSTEM_PROMPT, runSessionProjectBackfill, SMART_NOTE_COMPILER_SYSTEM_PROMPT, createLiveSessionState, RETROSPECTIVE_MAX_USER_MESSAGE_CHARS, RETROSPECTIVE_MESSAGE_TRUNCATION_MARKER, OpenCodeRetrospectiveRawProvider, createDreamTaskExecutor, runManualDream, runDueTasksForProject, scheduleClearAndReindex, startDreamScheduleTimer, createDreamTimerModuleClient, ensureProjectRegisteredFromOpenCodeDirectory, recordOpenCodeProvenInputFloor, resolveOpenCodeProvenInputFloor, resolveContextWindowGeometry, resolveContextLimit, resolveExecuteThresholdDetail, resolveModelKey, resolveSessionId, createScheduler, describeStorageUnavailability, resolveSessionCacheTtl, runEmbedHistoryDrain, pauseEmbedHistoryDrain, formatEmbedStatusText, getSessionProperties, getSessionCreatedInfo, getMessageUpdatedAssistantInfo, getMessageUpdatedInfo, getSessionErrorInfo, getMessageRemovedInfo, summarizeManualDream, createMagicContextCommandHandler, getLiveNotificationParams, createChatMessageHook, createEventHook, createCommandExecuteBeforeHook, createToolExecuteAfterHook, recordHiddenVariantWarning, buildStatusDetail, isDebugRpcEnabled, registerRpcHandlers, clearTransformDecisionSession, scheduleOpenCodeTransformDecisionWrite, stageOpenCodeV2TransformDecision, bindOpenCodeV2TransformDecision, maybeDeliverChannel2, armLatestThinkingRecovery, armBindingRecoverySafely, armLatestThinkingRecoveryFromError, createM0RenderOptions, lkgReplayLimit, measureLkgReplay, STORAGE_BUSY_MESSAGE, StorageBusyRefusalError, bindSystemDateRequestIdentity, bindSystemDateOutput, registerSystemDateRefresh, rustWrapupHistorianFields, UnmanagedOverWindowError, UnresolvedHistoryBoundaryError, clearMessageTokensCache, createTransform, createSubcModuleClient, createModuleToolBackends, createRustRefusalRecovery, createSystemPromptHashHandler, tryMessagesTransformLkgReplay, createMessagesTransformHandler, primaryOnlyToolIds, subagentToolRefusal, guardSubagentTools, hideSubagentTools, createCtxExpandTools, CTX_MEMORY_LIST_TOOL_NAME, CTX_MEMORY_ACTIONS, createCtxMemoryTools, createCtxMemoryListTools, CTX_NOTE_DESCRIPTION, withoutSmartNoteText, createCtxNoteTools, createCtxReduceTools, createCtxSearchTools, parameterDescriptionsFor, applyJsonSchemaParameterDescriptions, MagicContextRpcServer, subagentTemperature, applyHiddenSubagentTemperature };
29180
+ export { logConfigDependencyNotesOnce, openOpenCodeDb, DREAMER_SYSTEM_PROMPT, runSessionProjectBackfill, SMART_NOTE_COMPILER_SYSTEM_PROMPT, createLiveSessionState, RETROSPECTIVE_MAX_USER_MESSAGE_CHARS, RETROSPECTIVE_MESSAGE_TRUNCATION_MARKER, OpenCodeRetrospectiveRawProvider, createDreamTaskExecutor, runManualDream, runDueTasksForProject, scheduleClearAndReindex, startDreamScheduleTimer, createDreamTimerModuleClient, ensureProjectRegisteredFromOpenCodeDirectory, recordOpenCodeProvenInputFloor, resolveOpenCodeProvenInputFloor, resolveContextWindowGeometry, resolveContextLimit, resolveExecuteThresholdDetail, resolveModelKey, resolveSessionId, createScheduler, describeStorageUnavailability, resolveSessionCacheTtl, runEmbedHistoryDrain, pauseEmbedHistoryDrain, formatEmbedStatusText, getSessionProperties, getSessionCreatedInfo, getMessageUpdatedAssistantInfo, getMessageUpdatedInfo, getSessionErrorInfo, getMessageRemovedInfo, summarizeManualDream, createMagicContextCommandHandler, getLiveNotificationParams, createChatMessageHook, createEventHook, createCommandExecuteBeforeHook, createToolExecuteAfterHook, recordHiddenVariantWarning, buildStatusDetail, isDebugRpcEnabled, registerRpcHandlers, maybeAutoEmbedSessionBackfill, clearTransformDecisionSession, scheduleOpenCodeTransformDecisionWrite, stageOpenCodeV2TransformDecision, bindOpenCodeV2TransformDecision, maybeDeliverChannel2, armLatestThinkingRecovery, armBindingRecoverySafely, armLatestThinkingRecoveryFromError, createM0RenderOptions, lkgReplayLimit, measureLkgReplay, STORAGE_BUSY_MESSAGE, StorageBusyRefusalError, bindSystemDateRequestIdentity, bindSystemDateOutput, registerSystemDateRefresh, rustWrapupHistorianFields, UnmanagedOverWindowError, UnresolvedHistoryBoundaryError, clearMessageTokensCache, createTransform, createSubcModuleClient, createModuleToolBackends, createRustRefusalRecovery, createSystemPromptHashHandler, tryMessagesTransformLkgReplay, createMessagesTransformHandler, primaryOnlyToolIds, subagentToolRefusal, guardSubagentTools, hideSubagentTools, createCtxExpandTools, CTX_MEMORY_LIST_TOOL_NAME, CTX_MEMORY_ACTIONS, createCtxMemoryTools, createCtxMemoryListTools, CTX_NOTE_DESCRIPTION, withoutSmartNoteText, createCtxNoteTools, createCtxReduceTools, createCtxSearchTools, parameterDescriptionsFor, applyJsonSchemaParameterDescriptions, MagicContextRpcServer, subagentTemperature, applyHiddenSubagentTemperature };