@cortexkit/pi-magic-context 0.49.25 → 0.49.27

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 (39) hide show
  1. package/dist/auto-search-worker.js +4 -4
  2. package/dist/chunk-embedding-write-worker.js +8 -9
  3. package/dist/{compartment-chunk-embedding-g9a977b8.js → compartment-chunk-embedding-pkk5beqp.js} +3 -3
  4. package/dist/{embedding-backfill-qxzjy5v2.js → embedding-backfill-25fp3b8w.js} +7 -7
  5. package/dist/{index-0dr64gsy.js → index-0s14xaca.js} +2 -2
  6. package/dist/{index-n8e5e9fp.js → index-0x1c054v.js} +1 -1
  7. package/dist/{index-hxp6q5f8.js → index-48twbev2.js} +50 -36
  8. package/dist/{index-j3pz3a1b.js → index-4zemngt7.js} +1 -1
  9. package/dist/{index-d53veb5e.js → index-5d506f7y.js} +719 -23
  10. package/dist/{index-8hmqdav2.js → index-6981g1xv.js} +39 -8
  11. package/dist/{index-1g0r4req.js → index-bkcwcghx.js} +1308 -104
  12. package/dist/{index-8a2wvrda.js → index-bvpar0bg.js} +2 -5
  13. package/dist/{index-w1avzkdt.js → index-g026ztby.js} +1 -1
  14. package/dist/{index-cm9e52mb.js → index-kagezf2h.js} +18 -4
  15. package/dist/{index-wb2t932e.js → index-kmk3xpf9.js} +1 -1
  16. package/dist/{index-zn2xdbjy.js → index-sdsnb5b6.js} +8 -8
  17. package/dist/index-v0ht940m.js +488 -0
  18. package/dist/{index-cms6wfmd.js → index-vea2d9ka.js} +1 -1
  19. package/dist/{index-nxq2srg9.js → index-wjbqw6r1.js} +1 -1
  20. package/dist/{index-00c5a49f.js → index-xa90f88m.js} +3 -3
  21. package/dist/{index-fzfpq5bd.js → index-xw070axm.js} +3 -3
  22. package/dist/index.js +726 -688
  23. package/dist/{message-fts-rowid-map-1tb3qjtc.js → message-fts-rowid-map-3mbvdgn9.js} +2 -4
  24. package/dist/{message-index-bounded-yj7s7cwz.js → message-index-bounded-avbaa7wa.js} +19 -22
  25. package/dist/migration-worker.js +7 -8
  26. package/dist/{project-embedding-registry-9e82qsb6.js → project-embedding-registry-hc4ahjdt.js} +6 -6
  27. package/dist/raw-ordinal-warmup-worker.js +7 -30
  28. package/dist/{read-session-chunk-rndwjfrx.js → read-session-chunk-1rfprgc1.js} +6 -4
  29. package/dist/{read-session-raw-napqv76k.js → read-session-raw-g9b1zdn5.js} +3 -1
  30. package/dist/{search-archive-qa1sf8hc.js → search-archive-mpjeecwj.js} +5 -5
  31. package/dist/{search-2aa5kzyp.js → search-vkkfg27q.js} +13 -14
  32. package/dist/{storage-tags-r48vxthe.js → storage-tags-9qaasrky.js} +2 -2
  33. package/dist/subagent-entry.js +17 -18
  34. package/dist/tag-snapshot-worker-pi.js +9 -10
  35. package/package.json +1 -1
  36. package/dist/index-n4wyxcgr.js +0 -712
  37. package/dist/index-wrr9rp9a.js +0 -16
  38. package/dist/index-zmg1td73.js +0 -2100
  39. package/dist/message-index-fedjhja5.js +0 -58
@@ -5,7 +5,7 @@ import {
5
5
  } from "./index-2qtx0q6h.js";
6
6
  import {
7
7
  runSessionWarmupWorker
8
- } from "./index-8hmqdav2.js";
8
+ } from "./index-6981g1xv.js";
9
9
  import {
10
10
  logSlowWriteTransaction
11
11
  } from "./index-hqw0rt9k.js";
@@ -168,9 +168,6 @@ function messageFtsOrdinalRangeIsMapped2(db, sessionId, startOrdinal, endOrdinal
168
168
  const ordinalCount = endOrdinal - startOrdinal + 1;
169
169
  return row?.sourceOrdinalCount === ordinalCount && row.expectedMapCount === row.mappedCount;
170
170
  }
171
- function getMessageFtsRowidMapBackfillProgress2(db) {
172
- return getBackfillState(db);
173
- }
174
171
  function deleteUnmappedMessageFtsRows2(db, sessionIds) {
175
172
  if (sessionIds.length === 0)
176
173
  return;
@@ -182,4 +179,4 @@ function deleteUnmappedMessageFtsRows2(db, sessionIds) {
182
179
  WHERE rowid > ? AND session_id IN (${placeholders})`).run(state.watermarkRowid, ...sessionIds);
183
180
  }
184
181
 
185
- export { recordMessageFtsRowid2, recordIndexedMessageTime2, runMessageFtsRowidMapBackfill2, startMessageFtsRowidMapBackfill2, messageFtsOrdinalRangeIsMapped2, getMessageFtsRowidMapBackfillProgress2, deleteUnmappedMessageFtsRows2 };
182
+ export { recordMessageFtsRowid2, recordIndexedMessageTime2, runMessageFtsRowidMapBackfill2, startMessageFtsRowidMapBackfill2, messageFtsOrdinalRangeIsMapped2, deleteUnmappedMessageFtsRows2 };
@@ -539,4 +539,4 @@ function deleteTagIdentityRevisions(db, sessionIds) {
539
539
  }
540
540
  }
541
541
 
542
- export { stableStringify, jsonHashSink, closeQuietly, isKnownAutocommit, getTableColumnNames, ensureColumn, healAllNullColumns, observeTemporalDecisions, freezeTemporalDecisions, installV95PerfSchema, tagOrderConstraintIndex, TAG_TOMBSTONE_OWNER_PREFIX, tagRevisionIncarnationSql, tagRevisionCountSql, tagTombstoneOwnerRange, tagTombstoneOwnerKey, tagRevisionKey, tagIdentityRevisionKey, TAG_INSERT_CONFLICT_ROWS, installTagIdentityRevisionTrigger, deleteTagIdentityRevisions };
542
+ export { stableStringify, jsonHashSink, closeQuietly, isKnownAutocommit, getTableColumnNames, ensureColumn, healAllNullColumns, observeTemporalDecisions, freezeTemporalDecisions, installV95PerfSchema, tagOrderConstraintIndex, tagRevisionIncarnationSql, tagRevisionCountSql, tagTombstoneOwnerRange, tagTombstoneOwnerKey, tagRevisionKey, tagIdentityRevisionKey, TAG_INSERT_CONFLICT_ROWS, installTagIdentityRevisionTrigger, deleteTagIdentityRevisions };
@@ -23,7 +23,7 @@ import {
23
23
  TAG_SELECT_COLUMNS2,
24
24
  getCandidateToolOwners2,
25
25
  pickNearestPriorOwner2
26
- } from "./index-n8e5e9fp.js";
26
+ } from "./index-0x1c054v.js";
27
27
  import {
28
28
  OMO_INTERNAL_INITIATOR_MARKER,
29
29
  isSystemDirective,
@@ -47,7 +47,7 @@ import {
47
47
  import {
48
48
  stableStringify,
49
49
  closeQuietly
50
- } from "./index-w1avzkdt.js";
50
+ } from "./index-g026ztby.js";
51
51
  import {
52
52
  resolveOpenCodeDbPath,
53
53
  assertOpenCodeStoreGeneration,
@@ -72,7 +72,7 @@ import {
72
72
  hasRawSessionMessageByIdFromDb2,
73
73
  readRawSeedTailFromDb2,
74
74
  readRawSessionBoundaryEndpointsFromDb2
75
- } from "./index-8hmqdav2.js";
75
+ } from "./index-6981g1xv.js";
76
76
  import {
77
77
  logSlowWriteTransaction
78
78
  } from "./index-hqw0rt9k.js";
@@ -4700,6 +4700,20 @@ function readRawSessionMessageOrdinalById2(sessionId, messageId) {
4700
4700
  return null;
4701
4701
  return withReadOnlySessionDb((db) => readRawSessionMessageOrdinalByIdFromDb2(db, sessionId, messageId));
4702
4702
  }
4703
+ function resolveHistorianChunkStart2(sessionId, newest) {
4704
+ if (!newest)
4705
+ return 1;
4706
+ const fallback = newest.endMessage + 1;
4707
+ if (hasRawMessageProvider2(sessionId))
4708
+ return fallback;
4709
+ const endId = newest.endMessageId;
4710
+ if (typeof endId !== "string" || endId.length === 0)
4711
+ return fallback;
4712
+ const ordinal = readRawSessionMessageOrdinalById2(sessionId, endId);
4713
+ if (typeof ordinal !== "number" || !Number.isFinite(ordinal) || ordinal < 1)
4714
+ return fallback;
4715
+ return ordinal + 1;
4716
+ }
4703
4717
  function readRawSessionMessageOrderPosition(sessionId, messageId) {
4704
4718
  const provider = sessionProviders.get(sessionId)?.provider;
4705
4719
  if (provider) {
@@ -5200,4 +5214,4 @@ function readRawSessionSeedTail2(sessionId, boundaryId, onQuery) {
5200
5214
  });
5201
5215
  }
5202
5216
 
5203
- export { detectThinkingBindingMismatch, detectLatestTurnThinkingMismatch, isPrefixBoundThinkingModel, detectOverflow, MAX_EXECUTE_THRESHOLD, escalationBands, MERGED_REASONING_PARTS_PREFIX, decodeMergedReasoningParts, HYGIENE_PROVIDER_UNITS_VERSION, sessionDecisionCalibration, transitionSessionHygieneUnits, computeProtectionWindow, readEpochFloorSnapshot, getProtectionWindowForSession, SESSION_META_SELECT_COLUMNS, META_COLUMNS, BOOLEAN_META_KEYS, NULL_BIND_META_KEYS, isSessionMetaRow, getDefaultSessionMeta, ensureSessionMetaRow, toSessionMeta, persistCachedM0, clearCachedM0M1, isRustMarkerAdmissionFenced, ReplayDocumentError, readReplayEnvelope, readReplayDocument, updateReplayDocument, writeReplayDocument, isProviderOverflowFailClosedProven, getEmergencyRecoveryArmedAt, describeProtectedTailDrainBudgetSkip, loadProtectedTailMeta, markProtectedTailPolicyV3Seeded, recordProtectedTailPublicationFloor, recordProtectedTailNoEligibleHead, getWrapupInProgressState, isWrapupInProgress, acquireWrapupInProgress, updateWrapupInProgress, releaseWrapupInProgress, resolveCompactionModeRecord, getCompactionModeRecord, setCompactionModeRecord, EMERGENCY_DRAIN_FAILURE_BACKOFF_MS, getProtectedTailDrainBudgetSkip, reserveProtectedTailDrainTokens, clearEmergencyDrainLatch, recordHistorianDrainFailure, clearHistorianDrainFailure, rollbackProtectedTailDrainReservation, clearPersistedReasoningWatermark, getEmergencyInputSample, setEmergencyDropSample, clearEmergencyDropSample, getLastNudgeUndropped, setLastNudgeUndropped, getChannel1NudgeState, setChannel1NudgeState, markChannel1PostReduceGracePending, captureChannel1PostReduceGraceBaseline, getChannel2NudgeState, getChannel2NudgeClaim, setChannel2NudgeState, casChannel2NudgeState, claimChannel2NudgeState, casChannel2NudgeClaim, getPersistedNoteNudge, setPersistedNoteNudgeTrigger, setPersistedNoteNudgeTriggerMessageId, getNoteNudgeAnchors, getAutoSearchHintDecisions, deliverNoteNudgeAtomic, appendAutoSearchHintDecision, pruneNoteNudgeAnchors, queueAutoSearchHintDecisionRetirement, flushAutoSearchHintDecisionRetirement, getPersistedTodoSyntheticAnchor, setPersistedTodoSyntheticAnchor, clearPersistedTodoSyntheticAnchor, getNoteLastReadAt, setNoteLastReadAt, getHistorianFailureState, incrementHistorianFailure, clearHistorianFailureState, getOverflowState, recordOverflowDetected, clearEmergencyRecovery, clearDetectedContextLimit, getPersistedCompactionMarkerState, setPersistedCompactionMarkerState, parseStrippedPlaceholderState, serializeStrippedPlaceholderState, getStrippedPlaceholderIds, applyStrippedPlaceholderDelta, THINKING_BINDING_RECOVERY_FROZEN_PREFIX, THINKING_BINDING_STRIP_ORDER_END_MARKER, thinkingBindingRecoveryFrozenId, COMPACTION_OFF_THINKING_FROZEN_PREFIX, getThinkingBindingRecoveryTarget, armThinkingBindingRecovery, clearThinkingBindingRecoveryIf, getMergedReasoningStrippedIds, addMergedReasoningStrippedIds, getProcessedImageStrippedIds, parseProcessedImageMarkers, serializeProcessedImageMarkers, addProcessedImageStrippedIds, getPendingCompactionMarkerState, getCompactionMarkerHealth, loadPostprocessReplaySnapshot, clearPendingCompactionMarkerStateIf, getPendingPiCompactionMarkerState, setPendingPiCompactionMarkerState, clearPendingPiCompactionMarkerStateIf, logPiCompactionMarkerClear, getSessionsWithPendingPiMarker, setSessionWorkMetrics, getSessionWorkMetrics, resolveEpochFloorForPass, withReadOnlySessionDb, expandToolPart, askAnswerLines, retreatPastHostUnservedRows, isCoveredInstructionRow, completedToolArcCrossesBoundary, estimateTrueRawMessageTokens, buildToolArcs, fenceBoundaryForCompletedToolArcs, fenceBoundaryForToolArcs, buildTrueRawTokenIndex, computeRawRangeFingerprint, invalidateTrueRawTokenCache, stripSystemInjection, isFilePart, hasUserAnswerMetadata, DreamTokenBudgetExceeded, TOKEN_BUDGET_FINALIZE_MESSAGE, TOKEN_BUDGET_TOOL_REFUSAL, registerBudgetFinalizeChild, releaseBudgetFinalizeChild, createDreamTokenBudget, droppedInputMarker, createDroppedInputGuard, isEditTool, applyEditMarkerToInput, modelAcceptsEmptyContent, isAnthropicFamilyRoute, variantChangeBustsProviderCache, isInActiveAnthropicTurn, activeAnthropicTurnStart, hasAnthropicReasoning, findLatestAssistantReasoningMutationExemptMessage, DEFAULT_KEEP_REASONING_TOKENS, resolveKeepReasoningTokens, reasoningStepCost, reasoningBudgetCutoff, reasoningTextAndOpaque, opaqueThinkingCost, estimatePartImageTokens, SKELETON_REAL_INPUT_MAX_BYTES, toolInputStringBytes, resolveHostServedBoundaryId2, hasRawMessageProvider2, setRawMessageProvider2, setBoundedRawMessageProvider2, withRawMessageProvider2, cleanUserText2, withRawSessionMessageCache2, readRawSessionMessages2, readRawSessionMessagePage2, getRawSessionMessageOrdinalCount2, RAW_MESSAGE_VISIT_PAGE_SIZE2, visitRawSessionMessages2, visitRawSessionMessagesAsync2, readRawSessionMessageRange2, prepareRawSessionOrdinals2, primeTailRawMessageCache2, getCachedAbsoluteMessageCount2, primeInMemoryTailRawMessageCache2, readRawSessionMessageOrdinalPage2, getRawSessionStoredMessageCount2, readRawSessionMessageIdOrdinalsForRange2, readRawSessionMessageIdOrdinals2, readRawSessionMessagePartsById2, readRawSessionBoundaryEndpoints2, hasRawSessionMessageById2, readRawSessionMessageOrdinalById2, compareRawSessionMessageOrder2, readRawSessionMessageById2, getRawSessionMessageCount2, RAW_SESSION_TAG_KEY_PAGE_SIZE2, getRawSessionTagKeysThrough2, getLegacyProtectedTailStartOrdinal2, getProtectedTailStartOrdinal2, readSessionChunk2, getRawSessionMessageIdsThrough2, readRawSessionSeedTail2 };
5217
+ export { detectThinkingBindingMismatch, detectLatestTurnThinkingMismatch, isPrefixBoundThinkingModel, detectOverflow, MAX_EXECUTE_THRESHOLD, escalationBands, MERGED_REASONING_PARTS_PREFIX, decodeMergedReasoningParts, HYGIENE_PROVIDER_UNITS_VERSION, sessionDecisionCalibration, transitionSessionHygieneUnits, computeProtectionWindow, readEpochFloorSnapshot, getProtectionWindowForSession, SESSION_META_SELECT_COLUMNS, META_COLUMNS, BOOLEAN_META_KEYS, NULL_BIND_META_KEYS, isSessionMetaRow, getDefaultSessionMeta, ensureSessionMetaRow, toSessionMeta, persistCachedM0, clearCachedM0M1, isRustMarkerAdmissionFenced, ReplayDocumentError, readReplayEnvelope, readReplayDocument, updateReplayDocument, writeReplayDocument, isProviderOverflowFailClosedProven, getEmergencyRecoveryArmedAt, describeProtectedTailDrainBudgetSkip, loadProtectedTailMeta, markProtectedTailPolicyV3Seeded, recordProtectedTailPublicationFloor, recordProtectedTailNoEligibleHead, getWrapupInProgressState, isWrapupInProgress, acquireWrapupInProgress, updateWrapupInProgress, releaseWrapupInProgress, resolveCompactionModeRecord, getCompactionModeRecord, setCompactionModeRecord, EMERGENCY_DRAIN_FAILURE_BACKOFF_MS, getProtectedTailDrainBudgetSkip, reserveProtectedTailDrainTokens, clearEmergencyDrainLatch, recordHistorianDrainFailure, clearHistorianDrainFailure, rollbackProtectedTailDrainReservation, clearPersistedReasoningWatermark, getEmergencyInputSample, setEmergencyDropSample, clearEmergencyDropSample, getLastNudgeUndropped, setLastNudgeUndropped, getChannel1NudgeState, setChannel1NudgeState, markChannel1PostReduceGracePending, captureChannel1PostReduceGraceBaseline, getChannel2NudgeState, getChannel2NudgeClaim, setChannel2NudgeState, casChannel2NudgeState, claimChannel2NudgeState, casChannel2NudgeClaim, getPersistedNoteNudge, setPersistedNoteNudgeTrigger, setPersistedNoteNudgeTriggerMessageId, getNoteNudgeAnchors, getAutoSearchHintDecisions, deliverNoteNudgeAtomic, appendAutoSearchHintDecision, pruneNoteNudgeAnchors, queueAutoSearchHintDecisionRetirement, flushAutoSearchHintDecisionRetirement, getPersistedTodoSyntheticAnchor, setPersistedTodoSyntheticAnchor, clearPersistedTodoSyntheticAnchor, getNoteLastReadAt, setNoteLastReadAt, getHistorianFailureState, incrementHistorianFailure, clearHistorianFailureState, getOverflowState, recordOverflowDetected, clearEmergencyRecovery, clearDetectedContextLimit, getPersistedCompactionMarkerState, setPersistedCompactionMarkerState, parseStrippedPlaceholderState, serializeStrippedPlaceholderState, getStrippedPlaceholderIds, applyStrippedPlaceholderDelta, THINKING_BINDING_RECOVERY_FROZEN_PREFIX, THINKING_BINDING_STRIP_ORDER_END_MARKER, thinkingBindingRecoveryFrozenId, COMPACTION_OFF_THINKING_FROZEN_PREFIX, getThinkingBindingRecoveryTarget, armThinkingBindingRecovery, clearThinkingBindingRecoveryIf, getMergedReasoningStrippedIds, addMergedReasoningStrippedIds, getProcessedImageStrippedIds, parseProcessedImageMarkers, serializeProcessedImageMarkers, addProcessedImageStrippedIds, getPendingCompactionMarkerState, getCompactionMarkerHealth, loadPostprocessReplaySnapshot, clearPendingCompactionMarkerStateIf, getPendingPiCompactionMarkerState, setPendingPiCompactionMarkerState, clearPendingPiCompactionMarkerStateIf, logPiCompactionMarkerClear, getSessionsWithPendingPiMarker, setSessionWorkMetrics, getSessionWorkMetrics, resolveEpochFloorForPass, withReadOnlySessionDb, expandToolPart, askAnswerLines, retreatPastHostUnservedRows, isCoveredInstructionRow, completedToolArcCrossesBoundary, estimateTrueRawMessageTokens, buildToolArcs, fenceBoundaryForCompletedToolArcs, fenceBoundaryForToolArcs, buildTrueRawTokenIndex, computeRawRangeFingerprint, invalidateTrueRawTokenCache, stripSystemInjection, isFilePart, hasUserAnswerMetadata, DreamTokenBudgetExceeded, TOKEN_BUDGET_FINALIZE_MESSAGE, TOKEN_BUDGET_TOOL_REFUSAL, registerBudgetFinalizeChild, releaseBudgetFinalizeChild, createDreamTokenBudget, droppedInputMarker, createDroppedInputGuard, isEditTool, applyEditMarkerToInput, modelAcceptsEmptyContent, isAnthropicFamilyRoute, variantChangeBustsProviderCache, isInActiveAnthropicTurn, activeAnthropicTurnStart, hasAnthropicReasoning, findLatestAssistantReasoningMutationExemptMessage, DEFAULT_KEEP_REASONING_TOKENS, resolveKeepReasoningTokens, reasoningStepCost, reasoningBudgetCutoff, reasoningTextAndOpaque, opaqueThinkingCost, estimatePartImageTokens, SKELETON_REAL_INPUT_MAX_BYTES, toolInputStringBytes, resolveHostServedBoundaryId2, hasRawMessageProvider2, setRawMessageProvider2, setBoundedRawMessageProvider2, withRawMessageProvider2, cleanUserText2, withRawSessionMessageCache2, readRawSessionMessages2, readRawSessionMessagePage2, getRawSessionMessageOrdinalCount2, RAW_MESSAGE_VISIT_PAGE_SIZE2, visitRawSessionMessages2, visitRawSessionMessagesAsync2, readRawSessionMessageRange2, prepareRawSessionOrdinals2, primeTailRawMessageCache2, getCachedAbsoluteMessageCount2, primeInMemoryTailRawMessageCache2, readRawSessionMessageOrdinalPage2, getRawSessionStoredMessageCount2, readRawSessionMessageIdOrdinalsForRange2, readRawSessionMessageIdOrdinals2, readRawSessionMessagePartsById2, readRawSessionBoundaryEndpoints2, hasRawSessionMessageById2, readRawSessionMessageOrdinalById2, resolveHistorianChunkStart2, compareRawSessionMessageOrder2, readRawSessionMessageById2, getRawSessionMessageCount2, RAW_SESSION_TAG_KEY_PAGE_SIZE2, getRawSessionTagKeysThrough2, getLegacyProtectedTailStartOrdinal2, getProtectedTailStartOrdinal2, readSessionChunk2, getRawSessionMessageIdsThrough2, readRawSessionSeedTail2 };
@@ -13,7 +13,7 @@ import {
13
13
  } from "./index-gwxaz0z5.js";
14
14
  import {
15
15
  messageFtsOrdinalRangeIsMapped2
16
- } from "./index-8a2wvrda.js";
16
+ } from "./index-bvpar0bg.js";
17
17
 
18
18
  // ../plugin/src/features/magic-context/compartment-chunk-embedding.ts
19
19
  import { createHash } from "node:crypto";
@@ -22,10 +22,10 @@ import {
22
22
  resolveStoredPathWorkspaceIdentity,
23
23
  sourceNameForMemory,
24
24
  managedAuthorityNoteRow
25
- } from "./index-0dr64gsy.js";
25
+ } from "./index-0s14xaca.js";
26
26
  import {
27
27
  isKnownAutocommit
28
- } from "./index-w1avzkdt.js";
28
+ } from "./index-g026ztby.js";
29
29
  import {
30
30
  SubcClient
31
31
  } from "./index-gwxaz0z5.js";
@@ -34,7 +34,7 @@ import {
34
34
  loadCompartmentChunkEmbeddingsForSearch2,
35
35
  peekCompartmentChunkSearchPool2,
36
36
  warmCompartmentChunkSearchPool2
37
- } from "./index-wb2t932e.js";
37
+ } from "./index-kmk3xpf9.js";
38
38
  import {
39
39
  recordEmbeddingMeasurement,
40
40
  saveCommitEmbedding,
@@ -52,7 +52,7 @@ import {
52
52
  getProjectEmbeddingSnapshot2,
53
53
  embedTextForProject2,
54
54
  embedItemsForProject2
55
- } from "./index-00c5a49f.js";
55
+ } from "./index-xa90f88m.js";
56
56
  import {
57
57
  saveEmbeddingIfHashMatches,
58
58
  getProjectEmbeddings2
@@ -62,7 +62,7 @@ import {
62
62
  isEmbeddingEnabled,
63
63
  embedText,
64
64
  ensureMemoryEmbeddings2
65
- } from "./index-nxq2srg9.js";
65
+ } from "./index-wjbqw6r1.js";
66
66
  import {
67
67
  getMemorySelectColumns2,
68
68
  isMemoryRow2,
@@ -81,8 +81,8 @@ import {
81
81
  cleanSearchText,
82
82
  keywordRelevance,
83
83
  matchedSearchSnippet,
84
- getIndexedMessageCorpusSize2
85
- } from "./index-zmg1td73.js";
84
+ getIndexedMessageCorpusSize
85
+ } from "./index-v0ht940m.js";
86
86
  import {
87
87
  MESSAGE_FTS_SESSION_FILTER_SQL,
88
88
  withMessageFtsSessionFilter
@@ -3024,7 +3024,7 @@ function searchMessagesInSnapshot(args, sessionFirst) {
3024
3024
  return renderRows(args.limit);
3025
3025
  }
3026
3026
  const sanitizedProbes = probes.map((probe) => ({ probe, query: sanitizeFtsQuery(probe) })).filter((entry) => entry.query.length > 0);
3027
- const corpusSize = getIndexedMessageCorpusSize2(args.db, args.sessionId, cutoff);
3027
+ const corpusSize = getIndexedMessageCorpusSize(args.db, args.sessionId, cutoff);
3028
3028
  const probeCounts = countSessionFtsMatchesBatch(args.db, args.sessionId, sanitizedProbes.map((entry) => entry.query), cutoff, args.dateRange, sessionFirst);
3029
3029
  const collectBaseDiagnostics = args.diagnostics !== undefined && cutoff !== null;
3030
3030
  const baseOutcome = collectBaseDiagnostics && baseQuery.length > 0 ? runMessageFtsQueryWithDiagnostics({
@@ -0,0 +1,488 @@
1
+ import {
2
+ getHarness2
3
+ } from "./index-0h2mkab2.js";
4
+ import {
5
+ removeSystemReminders,
6
+ removeNestedBlocks,
7
+ hasMeaningfulUserText2,
8
+ extractTexts2
9
+ } from "./index-my0dn413.js";
10
+ import {
11
+ cleanUserText2
12
+ } from "./index-kagezf2h.js";
13
+ import {
14
+ recordMessageFtsRowid2,
15
+ recordIndexedMessageTime2,
16
+ messageFtsOrdinalRangeIsMapped2
17
+ } from "./index-bvpar0bg.js";
18
+ import {
19
+ logSlowWriteTransaction
20
+ } from "./index-hqw0rt9k.js";
21
+
22
+ // ../plugin/src/features/magic-context/compression-depth-storage.ts
23
+ var incrementDepthStatements = new WeakMap;
24
+ var totalDepthStatements = new WeakMap;
25
+ var maxDepthStatements = new WeakMap;
26
+ var clearDepthStatements = new WeakMap;
27
+ function getClearDepthStatement(db) {
28
+ let stmt = clearDepthStatements.get(db);
29
+ if (!stmt) {
30
+ stmt = db.prepare("DELETE FROM compression_depth WHERE session_id = ?");
31
+ clearDepthStatements.set(db, stmt);
32
+ }
33
+ return stmt;
34
+ }
35
+ function clearCompressionDepth(db, sessionId) {
36
+ getClearDepthStatement(db).run(sessionId);
37
+ }
38
+ function clearCompressionDepthRange(db, sessionId, startOrdinal, endOrdinal) {
39
+ if (endOrdinal < startOrdinal) {
40
+ return;
41
+ }
42
+ db.prepare("DELETE FROM compression_depth WHERE session_id = ? AND message_ordinal BETWEEN ? AND ?").run(sessionId, startOrdinal, endOrdinal);
43
+ }
44
+
45
+ // ../plugin/src/features/magic-context/message-index.ts
46
+ import { createHash } from "node:crypto";
47
+
48
+ // ../plugin/src/shared/search-text.ts
49
+ function removeTaskNotifications(text) {
50
+ return removeNestedBlocks(text, ["task", "task_cohort"]);
51
+ }
52
+ function cleanSearchText(text) {
53
+ return removeNestedBlocks(text, ["system-reminder", "task", "task_cohort"]).replace(/\s+/g, " ").trim();
54
+ }
55
+ var QUERY_STOP_WORDS = new Set("a an and are as at be been by can could did do does for from how i in is it me my of on or our please should that the their them there these they this to us was we were what when where which who why will with would you your".split(" "));
56
+ function terms(text) {
57
+ return [
58
+ ...new Set((text.toLowerCase().match(/[\p{L}\p{N}_]+/gu) ?? []).filter((term) => !QUERY_STOP_WORDS.has(term)))
59
+ ];
60
+ }
61
+ function keywordRelevance(query, content) {
62
+ const needles = terms(query);
63
+ if (needles.length === 0)
64
+ return 0;
65
+ const words = new Set(terms(cleanSearchText(content)));
66
+ return 0.8 * needles.filter((term) => words.has(term)).length / needles.length;
67
+ }
68
+ function matchedSearchSnippet(content, query, cap = 220) {
69
+ const text = cleanSearchText(content);
70
+ const needles = new Set(terms(query));
71
+ const matches = [...text.matchAll(/[\p{L}\p{N}_]+/gu)].filter((match) => needles.has(match[0].toLowerCase()));
72
+ if (matches.length === 0)
73
+ return "";
74
+ let bestStart = matches[0].index;
75
+ let bestCoverage = -1;
76
+ for (const match of matches) {
77
+ const start = Math.max(0, match.index - Math.floor(cap / 5));
78
+ const coverage = keywordRelevance(query, text.slice(start, start + cap));
79
+ if (coverage > bestCoverage) {
80
+ bestStart = start;
81
+ bestCoverage = coverage;
82
+ }
83
+ }
84
+ if (bestStart > 0) {
85
+ const boundary = text.indexOf(" ", bestStart);
86
+ if (boundary >= 0 && boundary < matches[matches.length - 1].index)
87
+ bestStart = boundary + 1;
88
+ }
89
+ const passage = text.slice(bestStart, bestStart + cap).trim();
90
+ return `${bestStart > 0 ? "…" : ""}${passage}${bestStart + cap < text.length ? "…" : ""}`;
91
+ }
92
+
93
+ // ../plugin/src/features/magic-context/message-index.ts
94
+ var lastIndexedStatements = new WeakMap;
95
+ var insertMessageStatements = new WeakMap;
96
+ var upsertProgressStatements = new WeakMap;
97
+ var upsertDirtyFloorStatements = new WeakMap;
98
+ var deleteFtsStatements = new WeakMap;
99
+ var deleteFtsRangeStatements = new WeakMap;
100
+ var deleteIndexStatements = new WeakMap;
101
+ var countIndexedMessageStatements = new WeakMap;
102
+ var getMessageSourceStatements = new WeakMap;
103
+ var upsertMessageSourceStatements = new WeakMap;
104
+ var deleteMessageSourceStatements = new WeakMap;
105
+ var deleteMessageSourceRangeStatements = new WeakMap;
106
+ var deleteMessageFtsStatements = new WeakMap;
107
+ var deleteFtsMapStatements = new WeakMap;
108
+ var deleteFtsMapRangeStatements = new WeakMap;
109
+ var deleteMessageFtsMapStatements = new WeakMap;
110
+ var MESSAGE_INDEX_MAX_FTS_BYTES = 64 * 1024;
111
+ var skipStatements = new WeakMap;
112
+ function skipStatement(db, sql) {
113
+ const statements = skipStatements.get(db) ?? new Map;
114
+ skipStatements.set(db, statements);
115
+ let statement = statements.get(sql);
116
+ if (!statement) {
117
+ statement = db.prepare(sql);
118
+ statements.set(sql, statement);
119
+ }
120
+ return statement;
121
+ }
122
+ var messageIndexSkipKey = (sessionId, messageId) => `message_index_skip:${JSON.stringify([sessionId, messageId])}`;
123
+ function normalizeIndexText(text) {
124
+ return text.replace(/\s+/g, " ").trim();
125
+ }
126
+ function getLastIndexedStatement(db) {
127
+ let stmt = lastIndexedStatements.get(db);
128
+ if (!stmt) {
129
+ stmt = db.prepare("SELECT last_indexed_ordinal, dirty_floor_ordinal FROM message_history_index WHERE session_id = ?");
130
+ lastIndexedStatements.set(db, stmt);
131
+ }
132
+ return stmt;
133
+ }
134
+ function getInsertMessageStatement(db) {
135
+ let stmt = insertMessageStatements.get(db);
136
+ if (!stmt) {
137
+ stmt = db.prepare("INSERT INTO message_history_fts (session_id, message_ordinal, message_id, role, content) VALUES (?, ?, ?, ?, ?)");
138
+ insertMessageStatements.set(db, stmt);
139
+ }
140
+ return stmt;
141
+ }
142
+ function getUpsertProgressStatement(db) {
143
+ let stmt = upsertProgressStatements.get(db);
144
+ if (!stmt) {
145
+ stmt = db.prepare("INSERT INTO message_history_index (session_id, last_indexed_ordinal, dirty_floor_ordinal, updated_at, harness) VALUES (?, ?, ?, ?, ?) ON CONFLICT(session_id) DO UPDATE SET last_indexed_ordinal = excluded.last_indexed_ordinal, dirty_floor_ordinal = excluded.dirty_floor_ordinal, updated_at = excluded.updated_at");
146
+ upsertProgressStatements.set(db, stmt);
147
+ }
148
+ return stmt;
149
+ }
150
+ function getUpsertDirtyFloorStatement(db) {
151
+ let stmt = upsertDirtyFloorStatements.get(db);
152
+ if (!stmt) {
153
+ stmt = db.prepare("INSERT INTO message_history_index (session_id, last_indexed_ordinal, dirty_floor_ordinal, updated_at, harness) VALUES (?, ?, ?, ?, ?) ON CONFLICT(session_id) DO UPDATE SET last_indexed_ordinal = MAX(message_history_index.last_indexed_ordinal, excluded.last_indexed_ordinal), dirty_floor_ordinal = CASE WHEN message_history_index.dirty_floor_ordinal <= 0 THEN excluded.dirty_floor_ordinal WHEN excluded.dirty_floor_ordinal <= 0 THEN message_history_index.dirty_floor_ordinal ELSE MIN(message_history_index.dirty_floor_ordinal, excluded.dirty_floor_ordinal) END, updated_at = excluded.updated_at");
154
+ upsertDirtyFloorStatements.set(db, stmt);
155
+ }
156
+ return stmt;
157
+ }
158
+ function getDeleteFtsRangeStatement(db) {
159
+ let stmt = deleteFtsRangeStatements.get(db);
160
+ if (!stmt) {
161
+ stmt = db.prepare(`DELETE FROM message_history_fts
162
+ WHERE rowid IN (
163
+ SELECT fts_rowid
164
+ FROM message_fts_rowid_map
165
+ WHERE session_id = ? AND message_ordinal BETWEEN ? AND ?
166
+ )`);
167
+ deleteFtsRangeStatements.set(db, stmt);
168
+ }
169
+ return stmt;
170
+ }
171
+ function getCountIndexedMessageStatement(db) {
172
+ let stmt = countIndexedMessageStatements.get(db);
173
+ if (!stmt) {
174
+ stmt = db.prepare(`SELECT COUNT(*) AS count
175
+ FROM message_history_source AS source
176
+ JOIN message_fts_rowid_map AS map
177
+ ON map.session_id = source.session_id
178
+ AND map.message_ordinal = source.message_ordinal
179
+ WHERE source.session_id = ? AND source.message_id = ?`);
180
+ countIndexedMessageStatements.set(db, stmt);
181
+ }
182
+ return stmt;
183
+ }
184
+ function getMessageSourceStatement(db) {
185
+ let stmt = getMessageSourceStatements.get(db);
186
+ if (!stmt) {
187
+ stmt = db.prepare("SELECT message_ordinal, source_version, normalized_content_hash, role FROM message_history_source WHERE session_id = ? AND message_id = ?");
188
+ getMessageSourceStatements.set(db, stmt);
189
+ }
190
+ return stmt;
191
+ }
192
+ function getUpsertMessageSourceStatement(db) {
193
+ let stmt = upsertMessageSourceStatements.get(db);
194
+ if (!stmt) {
195
+ stmt = db.prepare(`INSERT INTO message_history_source (
196
+ session_id, message_id, message_ordinal, source_version,
197
+ normalized_content_hash, role, harness, updated_at
198
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
199
+ ON CONFLICT(session_id, message_id) DO UPDATE SET
200
+ message_ordinal = excluded.message_ordinal,
201
+ source_version = excluded.source_version,
202
+ normalized_content_hash = excluded.normalized_content_hash,
203
+ role = excluded.role,
204
+ harness = excluded.harness,
205
+ updated_at = excluded.updated_at`);
206
+ upsertMessageSourceStatements.set(db, stmt);
207
+ }
208
+ return stmt;
209
+ }
210
+ function getDeleteMessageSourceRangeStatement(db) {
211
+ let stmt = deleteMessageSourceRangeStatements.get(db);
212
+ if (!stmt) {
213
+ stmt = db.prepare("DELETE FROM message_history_source WHERE session_id = ? AND message_ordinal BETWEEN ? AND ?");
214
+ deleteMessageSourceRangeStatements.set(db, stmt);
215
+ }
216
+ return stmt;
217
+ }
218
+ function getDeleteMessageFtsStatement(db) {
219
+ let stmt = deleteMessageFtsStatements.get(db);
220
+ if (!stmt) {
221
+ stmt = db.prepare(`DELETE FROM message_history_fts
222
+ WHERE rowid IN (
223
+ SELECT map.fts_rowid
224
+ FROM message_history_source AS source
225
+ JOIN message_fts_rowid_map AS map
226
+ ON map.session_id = source.session_id
227
+ AND map.message_ordinal = source.message_ordinal
228
+ WHERE source.session_id = ? AND source.message_id = ?
229
+ )`);
230
+ deleteMessageFtsStatements.set(db, stmt);
231
+ }
232
+ return stmt;
233
+ }
234
+ function getDeleteFtsMapRangeStatement(db) {
235
+ let stmt = deleteFtsMapRangeStatements.get(db);
236
+ if (!stmt) {
237
+ stmt = db.prepare("DELETE FROM message_fts_rowid_map WHERE session_id = ? AND message_ordinal BETWEEN ? AND ?");
238
+ deleteFtsMapRangeStatements.set(db, stmt);
239
+ }
240
+ return stmt;
241
+ }
242
+ function getDeleteMessageFtsMapStatement(db) {
243
+ let stmt = deleteMessageFtsMapStatements.get(db);
244
+ if (!stmt) {
245
+ stmt = db.prepare(`DELETE FROM message_fts_rowid_map
246
+ WHERE session_id = ?
247
+ AND message_ordinal = (
248
+ SELECT message_ordinal
249
+ FROM message_history_source
250
+ WHERE session_id = ? AND message_id = ?
251
+ )`);
252
+ deleteMessageFtsMapStatements.set(db, stmt);
253
+ }
254
+ return stmt;
255
+ }
256
+ function insertMessageFtsRow(db, sessionId, messageOrdinal, messageId, role, content, messageTimeMs) {
257
+ const result = getInsertMessageStatement(db).run(sessionId, messageOrdinal, messageId, role, content);
258
+ recordMessageFtsRowid2(db, sessionId, messageOrdinal, result.lastInsertRowid, messageTimeMs ?? null);
259
+ }
260
+ function normalizeSourceVersion(version) {
261
+ if (typeof version === "number")
262
+ return `number:${version}`;
263
+ if (typeof version === "string")
264
+ return `string:${version}`;
265
+ return "null";
266
+ }
267
+ function toMessageIndexSource(message) {
268
+ const content = getIndexableContent(message.role, message.parts);
269
+ return {
270
+ id: message.id,
271
+ ordinal: message.ordinal,
272
+ role: message.role,
273
+ createdAt: message.createdAt,
274
+ sourceVersion: normalizeSourceVersion(message.version),
275
+ contentHash: createHash("sha256").update(content).digest("hex"),
276
+ content
277
+ };
278
+ }
279
+ function getMessageSourceSnapshot(message) {
280
+ return toMessageIndexSource(message);
281
+ }
282
+ function getMessageIndexSourceIdentity(message) {
283
+ const source = getMessageSourceSnapshot(message);
284
+ return JSON.stringify([
285
+ source.ordinal,
286
+ source.sourceVersion,
287
+ source.contentHash,
288
+ source.role,
289
+ message.createdAt ?? null
290
+ ]);
291
+ }
292
+ function isMessageIndexSourceCurrent(db, sessionId, message) {
293
+ const source = getMessageSourceSnapshot(message);
294
+ return isIndexSourceCurrent(db, sessionId, source);
295
+ }
296
+ function isIndexSourceCurrent(db, sessionId, source) {
297
+ const row = getMessageSourceStatement(db).get(sessionId, source.id);
298
+ return row?.message_ordinal === source.ordinal && row.source_version === source.sourceVersion && row.normalized_content_hash === source.contentHash && row.role === source.role;
299
+ }
300
+ function writeMessageSource(db, sessionId, source, now) {
301
+ getUpsertMessageSourceStatement(db).run(sessionId, source.id, source.ordinal, source.sourceVersion, source.contentHash, source.role, getHarness2(), now);
302
+ const bytes = Buffer.byteLength(source.content);
303
+ if (source.ftsSkippedBytes !== undefined || bytes > MESSAGE_INDEX_MAX_FTS_BYTES) {
304
+ skipStatement(db, "INSERT INTO schema_migrations_meta(key,value) VALUES (?,?) ON CONFLICT(key) DO UPDATE SET value=excluded.value").run(messageIndexSkipKey(sessionId, source.id), JSON.stringify({
305
+ reason: "oversized",
306
+ bytes: source.ftsSkippedBytes ?? bytes,
307
+ contentHash: source.contentHash,
308
+ ordinal: source.ordinal,
309
+ complete: true
310
+ }));
311
+ return "";
312
+ }
313
+ skipStatement(db, "DELETE FROM schema_migrations_meta WHERE key=?").run(messageIndexSkipKey(sessionId, source.id));
314
+ return source.content;
315
+ }
316
+ function getLastIndexedOrdinal(db, sessionId) {
317
+ const row = getLastIndexedStatement(db).get(sessionId);
318
+ return typeof row?.last_indexed_ordinal === "number" ? row.last_indexed_ordinal : 0;
319
+ }
320
+ function getIndexedMessageCorpusSize(db, sessionId, maxOrdinal) {
321
+ const watermark = getLastIndexedOrdinal(db, sessionId);
322
+ return maxOrdinal === null ? watermark : Math.min(watermark, Math.max(0, maxOrdinal));
323
+ }
324
+ function getDirtyIndexFloor(db, sessionId) {
325
+ const row = getLastIndexedStatement(db).get(sessionId);
326
+ return typeof row?.dirty_floor_ordinal === "number" && row.dirty_floor_ordinal > 0 ? row.dirty_floor_ordinal : null;
327
+ }
328
+ function markMessageIndexDirty(db, sessionId, floorOrdinal) {
329
+ const dirtyFloor = Math.max(1, Math.floor(floorOrdinal));
330
+ getUpsertDirtyFloorStatement(db).run(sessionId, getLastIndexedOrdinal(db, sessionId), dirtyFloor, Date.now(), getHarness2());
331
+ }
332
+ function isMessageAlreadyIndexed(db, sessionId, messageId) {
333
+ const row = getCountIndexedMessageStatement(db).get(sessionId, messageId);
334
+ return (typeof row?.count === "number" ? row.count : 0) > 0;
335
+ }
336
+ function setIndexProgress(db, sessionId, watermark, dirtyFloor, now) {
337
+ getUpsertProgressStatement(db).run(sessionId, Math.max(0, Math.floor(watermark)), dirtyFloor ?? 0, now, getHarness2());
338
+ }
339
+ function getMessageIndexReconciliationStartOrdinal(db, sessionId) {
340
+ const watermark = getLastIndexedOrdinal(db, sessionId);
341
+ const dirtyFloor = getDirtyIndexFloor(db, sessionId);
342
+ return dirtyFloor === null ? watermark : Math.min(watermark, dirtyFloor - 1);
343
+ }
344
+ function isMessageIndexReconciledThrough(db, sessionId, finalWatermark) {
345
+ const dirtyFloor = getDirtyIndexFloor(db, sessionId);
346
+ return getLastIndexedOrdinal(db, sessionId) >= finalWatermark && dirtyFloor === null;
347
+ }
348
+ function getIndexableContent(role, parts) {
349
+ if (role === "user") {
350
+ if (!hasMeaningfulUserText2(parts)) {
351
+ return "";
352
+ }
353
+ return extractTexts2(parts).map(removeTaskNotifications).map(cleanUserText2).map(normalizeIndexText).filter((text) => text.length > 0).join(" / ");
354
+ }
355
+ if (role === "assistant") {
356
+ return extractTexts2(parts).map(removeTaskNotifications).map(removeSystemReminders).map(normalizeIndexText).filter((text) => text.length > 0).join(" / ");
357
+ }
358
+ return "";
359
+ }
360
+ function indexSingleMessageInTransaction(db, sessionId, message, now, dirtyFloorBeforeAttempt, source) {
361
+ const currentWatermark = getLastIndexedOrdinal(db, sessionId);
362
+ const dirtyFloor = getDirtyIndexFloor(db, sessionId);
363
+ if (message.ordinal <= currentWatermark) {
364
+ if (isIndexSourceCurrent(db, sessionId, source)) {
365
+ recordIndexedMessageTime2(db, sessionId, message.ordinal, message.createdAt);
366
+ return false;
367
+ }
368
+ if (!messageFtsOrdinalRangeIsMapped2(db, sessionId, message.ordinal, message.ordinal)) {
369
+ return false;
370
+ }
371
+ getDeleteMessageFtsStatement(db).run(sessionId, message.id);
372
+ getDeleteMessageFtsMapStatement(db).run(sessionId, sessionId, message.id);
373
+ const content = writeMessageSource(db, sessionId, source, now);
374
+ if (content.length > 0 && (message.role === "user" || message.role === "assistant")) {
375
+ insertMessageFtsRow(db, sessionId, message.ordinal, message.id, message.role, content, message.createdAt);
376
+ }
377
+ setIndexProgress(db, sessionId, currentWatermark, dirtyFloorBeforeAttempt === message.ordinal ? null : dirtyFloorBeforeAttempt, now);
378
+ return true;
379
+ }
380
+ if (message.ordinal !== currentWatermark + 1 || dirtyFloor !== null && dirtyFloor !== message.ordinal) {
381
+ return false;
382
+ }
383
+ const content = writeMessageSource(db, sessionId, source, now);
384
+ let inserted = false;
385
+ if (content.length > 0 && (message.role === "user" || message.role === "assistant") && !isMessageAlreadyIndexed(db, sessionId, message.id)) {
386
+ insertMessageFtsRow(db, sessionId, message.ordinal, message.id, message.role, content, message.createdAt);
387
+ inserted = true;
388
+ }
389
+ setIndexProgress(db, sessionId, message.ordinal, dirtyFloorBeforeAttempt === message.ordinal ? null : dirtyFloorBeforeAttempt, now);
390
+ return inserted;
391
+ }
392
+ function indexSingleMessage(db, sessionId, message, shouldCommit = () => true, preparedSource) {
393
+ if (!shouldCommit())
394
+ return false;
395
+ const source = preparedSource ?? getMessageSourceSnapshot(message);
396
+ const currentWatermark = getLastIndexedOrdinal(db, sessionId);
397
+ if (message.ordinal <= currentWatermark && isIndexSourceCurrent(db, sessionId, source)) {
398
+ recordIndexedMessageTime2(db, sessionId, message.ordinal, message.createdAt);
399
+ return false;
400
+ }
401
+ const dirtyFloorBeforeAttempt = getDirtyIndexFloor(db, sessionId);
402
+ markMessageIndexDirty(db, sessionId, Math.min(message.ordinal, currentWatermark + 1));
403
+ db.exec("BEGIN IMMEDIATE");
404
+ const transactionStartedAt = performance.now();
405
+ let committed = false;
406
+ try {
407
+ const result = indexSingleMessageInTransaction(db, sessionId, message, Date.now(), dirtyFloorBeforeAttempt, source);
408
+ if (!shouldCommit())
409
+ return false;
410
+ db.exec("COMMIT");
411
+ committed = true;
412
+ logSlowWriteTransaction("message_index_incremental", transactionStartedAt);
413
+ return result;
414
+ } finally {
415
+ if (!committed) {
416
+ try {
417
+ db.exec("ROLLBACK");
418
+ } catch {}
419
+ }
420
+ }
421
+ }
422
+ function indexMessagesAfterOrdinal(db, sessionId, messages, _lastIndexedOrdinal, finalWatermark = messages.length) {
423
+ return indexItemsAfterOrdinal(db, sessionId, messages, finalWatermark, toMessageIndexSource);
424
+ }
425
+ function indexItemsAfterOrdinal(db, sessionId, items, finalWatermark, toSource) {
426
+ const now = Date.now();
427
+ let inserted = 0;
428
+ const sources = new Map(items.map((item) => [item.ordinal, toSource(item)]));
429
+ db.exec("BEGIN IMMEDIATE");
430
+ const transactionStartedAt = performance.now();
431
+ let committed = false;
432
+ try {
433
+ const currentWatermark = getLastIndexedOrdinal(db, sessionId);
434
+ const dirtyFloor = getDirtyIndexFloor(db, sessionId);
435
+ const effectiveWatermark = dirtyFloor === null ? currentWatermark : Math.min(currentWatermark, Math.max(0, dirtyFloor - 1));
436
+ if (dirtyFloor !== null && dirtyFloor <= currentWatermark && !messageFtsOrdinalRangeIsMapped2(db, sessionId, dirtyFloor, Math.min(currentWatermark, finalWatermark))) {
437
+ db.exec("COMMIT");
438
+ committed = true;
439
+ logSlowWriteTransaction("message_index_reconcile", transactionStartedAt);
440
+ return 0;
441
+ }
442
+ if (dirtyFloor !== null && dirtyFloor <= finalWatermark) {
443
+ getDeleteFtsRangeStatement(db).run(sessionId, dirtyFloor, finalWatermark);
444
+ getDeleteFtsMapRangeStatement(db).run(sessionId, dirtyFloor, finalWatermark);
445
+ getDeleteMessageSourceRangeStatement(db).run(sessionId, dirtyFloor, finalWatermark);
446
+ }
447
+ const itemsByOrdinal = new Map;
448
+ for (const item of items) {
449
+ if (item.ordinal > effectiveWatermark && item.ordinal <= finalWatermark) {
450
+ itemsByOrdinal.set(item.ordinal, item);
451
+ }
452
+ }
453
+ let coveredWatermark = effectiveWatermark;
454
+ while (coveredWatermark < finalWatermark && itemsByOrdinal.has(coveredWatermark + 1)) {
455
+ coveredWatermark += 1;
456
+ }
457
+ for (let ordinal = effectiveWatermark + 1;ordinal <= coveredWatermark; ordinal++) {
458
+ const item = itemsByOrdinal.get(ordinal);
459
+ if (!item)
460
+ continue;
461
+ const message = sources.get(ordinal);
462
+ if (!message)
463
+ continue;
464
+ const content = writeMessageSource(db, sessionId, message, now);
465
+ if (content.length === 0 || message.role !== "user" && message.role !== "assistant" || isMessageAlreadyIndexed(db, sessionId, message.id)) {
466
+ continue;
467
+ }
468
+ insertMessageFtsRow(db, sessionId, message.ordinal, message.id, message.role, content, message.createdAt);
469
+ inserted += 1;
470
+ }
471
+ const missingFloor = coveredWatermark < finalWatermark ? coveredWatermark + 1 : null;
472
+ const preservedFloor = dirtyFloor !== null && dirtyFloor > finalWatermark ? dirtyFloor : null;
473
+ const nextDirtyFloor = missingFloor === null ? preservedFloor : preservedFloor === null ? missingFloor : Math.min(missingFloor, preservedFloor);
474
+ setIndexProgress(db, sessionId, coveredWatermark, nextDirtyFloor, now);
475
+ db.exec("COMMIT");
476
+ committed = true;
477
+ logSlowWriteTransaction("message_index_reconcile", transactionStartedAt);
478
+ } finally {
479
+ if (!committed) {
480
+ try {
481
+ db.exec("ROLLBACK");
482
+ } catch {}
483
+ }
484
+ }
485
+ return inserted;
486
+ }
487
+
488
+ export { clearCompressionDepth, clearCompressionDepthRange, cleanSearchText, keywordRelevance, matchedSearchSnippet, MESSAGE_INDEX_MAX_FTS_BYTES, messageIndexSkipKey, getMessageIndexSourceIdentity, isMessageIndexSourceCurrent, getLastIndexedOrdinal, getIndexedMessageCorpusSize, markMessageIndexDirty, getMessageIndexReconciliationStartOrdinal, isMessageIndexReconciledThrough, getIndexableContent, indexSingleMessage, indexMessagesAfterOrdinal };
@@ -6,7 +6,7 @@ import {
6
6
  } from "./index-my0dn413.js";
7
7
  import {
8
8
  readRawSessionMessageIdOrdinalsForRange2
9
- } from "./index-cm9e52mb.js";
9
+ } from "./index-kagezf2h.js";
10
10
 
11
11
  // ../plugin/src/tools/ctx-expand/search-archive.ts
12
12
  var archiveReadsOnThisThread = 0;