@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.
- package/dist/auto-search-worker.js +3 -3
- package/dist/chunk-embedding-write-worker.js +89 -0
- package/dist/config/schema/agent-overrides.d.ts +12 -12
- package/dist/config/schema/magic-context.d.ts +88 -88
- package/dist/{conflict-warning-hook-f4x5wed7.js → conflict-warning-hook-mgq17yr3.js} +3 -3
- package/dist/{context-dam8p201.js → context-cpxqpkzv.js} +55 -71
- package/dist/{derive-budgets-5306b1jt.js → derive-budgets-zn7yzd2d.js} +1 -1
- package/dist/{embedding-backfill-qbfcbp87.js → embedding-backfill-5e1t5wha.js} +6 -5
- package/dist/embedding-worker.js +1 -1
- package/dist/features/magic-context/chunk-embedding-write-worker.d.ts +2 -0
- package/dist/features/magic-context/chunk-embedding-write-worker.d.ts.map +1 -0
- package/dist/features/magic-context/chunk-embedding-writer.d.ts +48 -0
- package/dist/features/magic-context/chunk-embedding-writer.d.ts.map +1 -0
- package/dist/features/magic-context/compartment-chunk-embedding.d.ts +1 -1
- package/dist/features/magic-context/compartment-chunk-embedding.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/hidden-single-shot.d.ts +3 -2
- package/dist/features/magic-context/dreamer/hidden-single-shot.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/map-memories.d.ts +8 -1
- package/dist/features/magic-context/dreamer/map-memories.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/retrospective-raw-provider.d.ts +2 -0
- package/dist/features/magic-context/dreamer/retrospective-raw-provider.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts +5 -0
- package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/verify-prompt.d.ts +6 -1
- package/dist/features/magic-context/dreamer/verify-prompt.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/verify.d.ts +25 -11
- package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
- package/dist/features/magic-context/mural/compress-cues.d.ts +3 -0
- package/dist/features/magic-context/mural/compress-cues.d.ts.map +1 -1
- package/dist/features/magic-context/project-embedding-registry.d.ts +5 -0
- package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
- package/dist/features/magic-context/storage-tags.d.ts +2 -0
- package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
- package/dist/hooks/magic-context/apply-operations.d.ts +3 -1
- package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
- package/dist/hooks/magic-context/auto-embed-session.d.ts +10 -0
- package/dist/hooks/magic-context/auto-embed-session.d.ts.map +1 -0
- package/dist/hooks/magic-context/compartment-runner.d.ts +4 -0
- package/dist/hooks/magic-context/compartment-runner.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-trigger.d.ts +1 -1
- package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
- package/dist/hooks/magic-context/degraded-pass-refusal.d.ts +2 -0
- package/dist/hooks/magic-context/degraded-pass-refusal.d.ts.map +1 -1
- package/dist/hooks/magic-context/embed-session-state.d.ts +8 -1
- package/dist/hooks/magic-context/embed-session-state.d.ts.map +1 -1
- package/dist/hooks/magic-context/hook.d.ts +3 -1
- package/dist/hooks/magic-context/hook.d.ts.map +1 -1
- package/dist/hooks/magic-context/pending-drop-eligibility.d.ts +14 -0
- package/dist/hooks/magic-context/pending-drop-eligibility.d.ts.map +1 -0
- package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +1 -0
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform.d.ts.map +1 -1
- package/dist/{index-fx90bvjd.js → index-3kdm78zp.js} +2 -2
- package/dist/{index-gf0psee3.js → index-3kx0kg0f.js} +60 -3
- package/dist/{index-1wwh38fk.js → index-5591fg8y.js} +471 -139
- package/dist/{index-b16gpywn.js → index-944w16m0.js} +2 -2
- package/dist/{index-6sz25c3s.js → index-bxdg2nbt.js} +2 -2
- package/dist/{index-7h8a1xpc.js → index-e4dsjj1p.js} +1 -1
- package/dist/{index-05n6ykca.js → index-kf4epshg.js} +3 -3
- package/dist/index-saews2s3.js +229 -0
- package/dist/{index-yx5kgp2x.js → index-t4q9zbbf.js} +95 -73
- package/dist/{index-wqs4q74r.js → index-thvnpfsv.js} +8 -8
- package/dist/{index-95s8xaj1.js → index-tyckte5c.js} +4 -4
- package/dist/{index-qtbdx42g.js → index-w900fbhd.js} +110 -25
- package/dist/{index-6sytd5w3.js → index-xn6q9pg6.js} +7 -7
- package/dist/{index-7zd5asz9.js → index-y1qysm3q.js} +196 -243
- package/dist/{index-x2xjyq8f.js → index-yxycg7fs.js} +9 -9
- package/dist/index.js +54 -92
- package/dist/{message-index-df7swgy1.js → message-index-a6gztaqx.js} +7 -7
- package/dist/{message-index-bounded-nq6rp8xa.js → message-index-bounded-vtgpq6b4.js} +4 -4
- package/dist/migration-worker.js +2 -2
- package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
- package/dist/{project-embedding-registry-q0ysjyzc.js → project-embedding-registry-x45bv3qr.js} +5 -4
- package/dist/raw-ordinal-warmup-worker.js +3 -3
- package/dist/{read-session-chunk-ax05f7gr.js → read-session-chunk-3ae3nfdn.js} +2 -2
- package/dist/{recomp-orchestrator-a0mvby4e.js → recomp-orchestrator-xqb9gwgm.js} +21 -20
- package/dist/{search-fm002702.js → search-deajrd90.js} +16 -15
- package/dist/{send-session-notification-y2wg3fkh.js → send-session-notification-24r4esbh.js} +2 -2
- package/dist/shared/model-suggestion-retry.d.ts +2 -0
- package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
- package/dist/shared/prompt-async-transport.d.ts.map +1 -1
- package/dist/{storage-tags-yygfb9c8.js → storage-tags-s5bg1ahx.js} +1 -1
- package/dist/{transform-postprocess-phase-s84rdf32.js → transform-postprocess-phase-k5t63qm5.js} +21 -20
- package/dist/v2/auto-search-worker.js +3 -3
- package/dist/v2/chunk-embedding-write-worker.js +88 -0
- package/dist/v2/{context-x60fa16g.js → context-k4jrq71s.js} +611 -210
- package/dist/v2/{derive-budgets-z25jw3py.js → derive-budgets-2zh4gm2c.js} +2 -2
- package/dist/v2/{embedding-backfill-mbjyza2a.js → embedding-backfill-jmaf8zrr.js} +6 -5
- package/dist/v2/embedding-worker.js +1 -1
- package/dist/v2/hidden-completion.d.ts +3 -2
- package/dist/v2/hidden-completion.d.ts.map +1 -1
- package/dist/v2/hooks/hidden-child.d.ts.map +1 -1
- package/dist/v2/hooks/transform-features.d.ts +2 -2
- package/dist/v2/hooks/transform-features.d.ts.map +1 -1
- package/dist/v2/{message-index-bounded-pgv1ndpb.js → message-index-bounded-rxxznd34.js} +4 -4
- package/dist/v2/{message-index-5nayhm1r.js → message-index-f947qtbz.js} +7 -7
- package/dist/v2/migration-worker.js +2 -2
- package/dist/v2/{project-embedding-registry-jbmjc0p4.js → project-embedding-registry-0msp56p8.js} +5 -4
- package/dist/v2/raw-ordinal-warmup-worker.js +3 -3
- package/dist/v2/{read-session-chunk-hr3w5bjk.js → read-session-chunk-rq9nx1nn.js} +2 -2
- package/dist/v2/{recomp-orchestrator-8w3449eb.js → recomp-orchestrator-1j1nqrrr.js} +21 -20
- package/dist/v2/retrospective-raw-provider.d.ts.map +1 -1
- package/dist/v2/{search-mhmxgq0e.js → search-n8wqxb1j.js} +16 -15
- package/dist/v2/{send-session-notification-jevgj9fe.js → send-session-notification-8ghn9tnv.js} +2 -2
- package/dist/v2/{server-f7jfmrrz.js → server-34kwfsr4.js} +1 -1
- package/dist/v2/server-4gn3z5an.js +229 -0
- package/dist/v2/{server-4c10404h.js → server-6cdy4rc0.js} +2 -2
- package/dist/v2/{server-25tg45b4.js → server-cfbr1s2x.js} +7 -7
- package/dist/v2/{server-nmrm2rjy.js → server-e298hswg.js} +8 -8
- package/dist/v2/{server-9ewkzqgd.js → server-ef89gdsx.js} +2 -2
- package/dist/v2/{server-m97brnat.js → server-ehyava47.js} +2 -2
- package/dist/v2/{server-5gvkzzrf.js → server-fnqxt9j6.js} +95 -71
- package/dist/v2/{server-sz8jj92q.js → server-hek6z3w6.js} +194 -241
- package/dist/v2/{server-50mkkhy1.js → server-kmbarfmn.js} +9 -9
- package/dist/v2/{server-vknbt0gq.js → server-qhfvvfxj.js} +60 -3
- package/dist/v2/{server-37ngj8qw.js → server-zc3e54vy.js} +1 -1
- package/dist/v2/server.js +9 -8
- package/dist/v2/{storage-tags-a2gq6dw7.js → storage-tags-hcc2adpf.js} +1 -1
- package/dist/v2/store-reader.d.ts +1 -0
- package/dist/v2/store-reader.d.ts.map +1 -1
- package/dist/v2/{wrapup-orchestrator-r82y780v.js → wrapup-orchestrator-hkv8apcc.js} +16 -15
- package/dist/{wrapup-orchestrator-vmt6z3q5.js → wrapup-orchestrator-kxqj4rwh.js} +22 -21
- package/package.json +6 -5
- package/src/shared/model-suggestion-retry.test.ts +34 -0
- package/src/shared/model-suggestion-retry.ts +23 -3
- package/src/shared/prompt-async-transport.test.ts +1 -1
- package/src/shared/prompt-async-transport.ts +16 -3
- package/dist/{index-e6xnpach.js → index-b7p25tm0.js} +0 -0
- package/dist/{index-2pgxcncf.js → index-dgs16axy.js} +0 -0
- package/dist/{index-9vqb5p1s.js → index-e20m7284.js} +0 -0
- package/dist/{index-fwefky9w.js → index-mht7bq0z.js} +0 -0
- package/dist/{index-8ketfacn.js → index-v10f1rjv.js} +3 -3
- package/dist/{index-tdn0zkw4.js → index-wk0n1cgt.js} +0 -0
- package/dist/v2/{index-e6xnpach.js → index-b7p25tm0.js} +0 -0
- package/dist/v2/{server-bxpwy6fy.js → server-atbc19ab.js} +0 -0
- package/dist/v2/{server-2x42esxd.js → server-g10mdym6.js} +0 -0
- package/dist/v2/{server-fa75w6gp.js → server-k2bzedxk.js} +0 -0
- package/dist/v2/{server-kn9n2qgd.js → server-tbe1femw.js} +3 -3
- /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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
672
|
+
} from "./index-xn6q9pg6.js";
|
|
664
673
|
import {
|
|
665
674
|
flushIgnoredMessages2,
|
|
666
675
|
clearIgnoredMessages2,
|
|
667
676
|
observeIgnoredNotificationEvent2,
|
|
668
677
|
sendStatusNotification2
|
|
669
|
-
} from "./index-
|
|
678
|
+
} from "./index-dgs16axy.js";
|
|
670
679
|
import {
|
|
671
680
|
setRecompStarting2,
|
|
672
681
|
setRecompTerminal2
|
|
673
|
-
} from "./index-
|
|
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-
|
|
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
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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-
|
|
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
|
-
|
|
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) =>
|
|
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
|
|
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
|
|
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(", ")}
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
8871
|
-
function computeVerifyBatchSliceMs(remainingMs,
|
|
8872
|
-
return Math.min(remainingMs,
|
|
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
|
-
|
|
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?.(
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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
|
|
9290
|
+
messages
|
|
9100
9291
|
});
|
|
9101
|
-
if (error instanceof DreamerModuleFailureError ||
|
|
9292
|
+
if (error instanceof DreamerModuleFailureError || signal.aborted)
|
|
9102
9293
|
throw error;
|
|
9103
|
-
|
|
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
|
-
|
|
9106
|
-
|
|
9107
|
-
|
|
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
|
|
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
|
-
...
|
|
9841
|
+
...childSpending.size ? {
|
|
9842
|
+
children: [...childSpending].map(([sessionId, promptTokens]) => ({
|
|
9843
|
+
sessionId,
|
|
9844
|
+
promptTokens
|
|
9845
|
+
}))
|
|
9846
|
+
} : {},
|
|
9847
|
+
...effectiveTokenBudget ? {
|
|
9643
9848
|
tokenBudget: {
|
|
9644
|
-
budget:
|
|
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
|
-
|
|
9734
|
-
|
|
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 (
|
|
10042
|
+
if (processed > 0) {
|
|
9826
10043
|
recordRun("completed", null, {
|
|
9827
|
-
progress:
|
|
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
|
-
|
|
10178
|
-
|
|
10400
|
+
const noOpReason = "no reply-following user lines";
|
|
10401
|
+
log2(`[dreamer] retrospective: ${noOpReason}`);
|
|
10402
|
+
return completedWindow(scan.maxScannedTs, noOpReason);
|
|
10179
10403
|
}
|
|
10180
|
-
const
|
|
10181
|
-
if (
|
|
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-
|
|
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-
|
|
16035
|
-
const { sendIgnoredMessage } = await importPluginModule(() => import("./send-session-notification-
|
|
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-
|
|
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 };
|