@cortexkit/pi-magic-context 0.48.0 → 0.49.1

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 (47) hide show
  1. package/dist/auto-search-worker.js +3 -3
  2. package/dist/embedding-backfill-scywarbn.js +20 -0
  3. package/dist/embedding-worker-process.js +29 -0
  4. package/dist/embedding-worker.js +6 -6
  5. package/dist/historian-calibration-extension.js +30 -5
  6. package/dist/index-0j0zqb4t.js +712 -0
  7. package/dist/{index-pvm4pd5d.js → index-0rasmwm8.js} +811 -76
  8. package/dist/{index-fp37he9a.js → index-0vrkp1jq.js} +1 -1
  9. package/dist/{index-419bndtm.js → index-21v1kfs7.js} +2 -2
  10. package/dist/{index-fm3ksh5e.js → index-27jh224p.js} +4 -4
  11. package/dist/{index-98z1c1r0.js → index-28vnkyy7.js} +1231 -3018
  12. package/dist/{index-wrm4nbj7.js → index-290tzwp1.js} +1 -1
  13. package/dist/{index-603mt6nm.js → index-4gfq5t09.js} +17 -2
  14. package/dist/{index-vf38qhee.js → index-81nthk8j.js} +44 -1
  15. package/dist/{index-5jp1h0bz.js → index-b2anqqad.js} +467 -14
  16. package/dist/{index-6pgq5ns2.js → index-cyrnv16r.js} +314 -1072
  17. package/dist/index-fqb1bddn.js +4947 -0
  18. package/dist/{index-dkx0b1kt.js → index-g7hndmqm.js} +20 -29
  19. package/dist/index-gc2749rx.js +1168 -0
  20. package/dist/{index-5hd7h4rr.js → index-kjd1fj55.js} +39 -31
  21. package/dist/{index-8y5knskr.js → index-mcgehvgw.js} +93 -9
  22. package/dist/{index-r7xg4hvw.js → index-p5zesr4e.js} +26 -722
  23. package/dist/{index-9xb0axhc.js → index-r56xgha8.js} +1 -1
  24. package/dist/{index-544c0e0x.js → index-r874cgmv.js} +42 -40
  25. package/dist/{index-72bdc1bd.js → index-rd53pk0h.js} +4 -4
  26. package/dist/{index-0am8a7k1.js → index-rdtgp48t.js} +8 -6
  27. package/dist/{index-rt5jgzp1.js → index-vakawmbc.js} +160 -25
  28. package/dist/{index-f956htf3.js → index-x3dcnxh0.js} +6 -2
  29. package/dist/{index-zrr5t5a7.js → index-zh1jw8qp.js} +106 -1
  30. package/dist/index.js +2271 -1769
  31. package/dist/{logger-v3dsxdnm.js → logger-j6tecd1h.js} +1 -1
  32. package/dist/{message-index-bounded-t7vvty76.js → message-index-bounded-110sb4fm.js} +13 -12
  33. package/dist/{message-time-backfill-4ndf7hrq.js → message-time-backfill-05ppypkz.js} +2 -2
  34. package/dist/migration-worker.js +10 -9
  35. package/dist/{project-embedding-registry-jy2hmq28.js → project-embedding-registry-64t0mw8y.js} +10 -10
  36. package/dist/raw-ordinal-warmup-worker.js +4 -4
  37. package/dist/{read-session-chunk-47pjn7fz.js → read-session-chunk-rvmc25n5.js} +10 -7
  38. package/dist/{read-session-raw-yn8nawav.js → read-session-raw-npx3920c.js} +5 -3
  39. package/dist/{safe-notification-target-3c1ns931.js → safe-notification-target-vn9kpmv4.js} +2 -2
  40. package/dist/{search-42szfhwp.js → search-7z3w8pmz.js} +19 -18
  41. package/dist/{storage-tags-jym5z6yk.js → storage-tags-kjnsqbdb.js} +6 -6
  42. package/dist/subagent-entry.js +25 -23
  43. package/package.json +3 -3
  44. package/dist/embedding-backfill-bnnytehy.js +0 -20
  45. package/dist/index-bgmv2kaf.js +0 -290
  46. package/dist/index-hrf13mn3.js +0 -2388
  47. /package/dist/{index-5prbx026.js → index-2pp04pmg.js} +0 -0
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  estimateTokens
3
- } from "./index-9xb0axhc.js";
3
+ } from "./index-r56xgha8.js";
4
4
  import {
5
5
  getHarness2
6
6
  } from "./index-0h2mkab2.js";
7
7
  import {
8
8
  sessionLog2
9
- } from "./index-f956htf3.js";
9
+ } from "./index-x3dcnxh0.js";
10
10
  import {
11
11
  getTagIdentityWriteGeneration2,
12
12
  getSqliteDatabasePath2
@@ -14,7 +14,7 @@ import {
14
14
  import {
15
15
  tagOrderConstraintIndex,
16
16
  tagIdentityRevisionKey
17
- } from "./index-8y5knskr.js";
17
+ } from "./index-mcgehvgw.js";
18
18
  import {
19
19
  DEFAULT_PROTECTED_TOOLS,
20
20
  normalizeProtectedToolName,
@@ -2021,6 +2021,15 @@ function readTagIdentityRevision(db, sessionId) {
2021
2021
  const row = db.prepare("SELECT value FROM schema_migrations_meta WHERE key = ?").get(tagIdentityRevisionKey(sessionId));
2022
2022
  return typeof row?.value === "string" ? row.value : null;
2023
2023
  }
2024
+ function captureInitialTagOwnerRevision(db, sessionId, cached, appendedRows) {
2025
+ if (cached.identityRevision !== null || appendedRows === 0)
2026
+ return true;
2027
+ const revision = readTagIdentityRevision(db, sessionId);
2028
+ if (revision !== null && !/^[1-9]\d*:0$/.test(revision))
2029
+ return false;
2030
+ cached.identityRevision = revision;
2031
+ return true;
2032
+ }
2024
2033
  function appendedSinceForeignCommit(db, sessionId, cached) {
2025
2034
  tagOwnerShapeChecks += 1;
2026
2035
  const rows = db.prepare(TAG_OWNER_APPENDED_WITH_SHAPE_SQL).all(cached.globalLastRowId, sessionId, tagIdentityRevisionKey(sessionId), sessionId);
@@ -2061,6 +2070,11 @@ function readTagOwnerSummary(db, sessionId, proseRatio, extraRatios = []) {
2061
2070
  rows.push(...page);
2062
2071
  }
2063
2072
  }
2073
+ if (!captureInitialTagOwnerRevision(db, sessionId, cached, rows.length)) {
2074
+ if (offThreadOnly)
2075
+ throw new TagOwnerSummaryNotReady;
2076
+ rows = null;
2077
+ }
2064
2078
  } else {
2065
2079
  if (offThreadOnly)
2066
2080
  db.exec("BEGIN");
@@ -2193,7 +2207,7 @@ function getTagNumberByMessageIdStatement(db) {
2193
2207
  function getAssignableTagNumberByMessageIdStatement(db) {
2194
2208
  let stmt = getAssignableTagNumberByMessageIdStatements.get(db);
2195
2209
  if (!stmt) {
2196
- stmt = db.prepare(`SELECT tag_number FROM tags
2210
+ stmt = db.prepare(`SELECT tag_number FROM tags INDEXED BY idx_tags_session_message_id
2197
2211
  WHERE session_id = ?
2198
2212
  AND message_id = ?
2199
2213
  AND NOT (
@@ -2258,30 +2272,23 @@ function updateTagStatus2(db, sessionId, tagId, status) {
2258
2272
  getUpdateTagStatusStatement(db).run(status, sessionId, tagId);
2259
2273
  }
2260
2274
  var inertWhitespaceStatements = new WeakMap;
2261
- function getInertWhitespaceAssistantTags2(db, sessionId, messageIds) {
2262
- if (messageIds) {
2263
- let statement = inertWhitespaceStatements.get(db);
2264
- if (!statement) {
2265
- statement = db.prepare(`SELECT tag_number AS tagNumber, entry_fingerprint AS entryFingerprint
2266
- FROM json_each(?) AS owners CROSS JOIN tags
2267
- WHERE tags.session_id = ? AND tags.type = 'message' AND tags.status = 'compacted'
2268
- AND entry_fingerprint >= ? || owners.value || ':p'
2269
- AND entry_fingerprint < ? || owners.value || ':q'
2270
- ORDER BY CAST(owners.key AS INTEGER), entry_fingerprint, tags.id`);
2271
- inertWhitespaceStatements.set(db, statement);
2272
- }
2273
- const rows = statement.all(JSON.stringify([...new Set(messageIds)]), sessionId, WHITESPACE_ASSISTANT_INERT_FINGERPRINT_PREFIX, WHITESPACE_ASSISTANT_INERT_FINGERPRINT_PREFIX);
2274
- return rows.map((row) => ({
2275
- tagNumber: row.tagNumber,
2276
- contentId: row.entryFingerprint.slice(WHITESPACE_ASSISTANT_INERT_FINGERPRINT_PREFIX.length)
2277
- }));
2278
- }
2279
- const rows = db.prepare(`SELECT tag_number AS tagNumber, entry_fingerprint AS entryFingerprint
2280
- FROM tags
2281
- WHERE session_id = ?
2282
- AND type = 'message'
2283
- AND status = 'compacted'
2284
- AND entry_fingerprint LIKE ?`).all(sessionId, `${WHITESPACE_ASSISTANT_INERT_FINGERPRINT_PREFIX}%`);
2275
+ var inertWhitespaceByNumberStatements = new WeakMap;
2276
+ function getInertWhitespaceAssistantTagsByNumbers2(db, sessionId, tagNumbers) {
2277
+ if (tagNumbers.length === 0)
2278
+ return [];
2279
+ let statement = inertWhitespaceByNumberStatements.get(db);
2280
+ if (!statement) {
2281
+ statement = db.prepare(`SELECT tags.tag_number AS tagNumber, tags.entry_fingerprint AS entryFingerprint
2282
+ FROM json_each(?) AS wanted CROSS JOIN tags
2283
+ WHERE tags.session_id = ?
2284
+ AND tags.tag_number = wanted.value
2285
+ AND tags.type = 'message'
2286
+ AND tags.status = 'compacted'
2287
+ AND tags.entry_fingerprint LIKE ?
2288
+ ORDER BY tags.tag_number, tags.id`);
2289
+ inertWhitespaceByNumberStatements.set(db, statement);
2290
+ }
2291
+ const rows = statement.all(JSON.stringify([...new Set(tagNumbers)]), sessionId, `${WHITESPACE_ASSISTANT_INERT_FINGERPRINT_PREFIX}%`);
2285
2292
  return rows.flatMap((row) => {
2286
2293
  const contentId = row.entryFingerprint.slice(WHITESPACE_ASSISTANT_INERT_FINGERPRINT_PREFIX.length);
2287
2294
  return contentId.length > 0 ? [{ tagNumber: row.tagNumber, contentId }] : [];
@@ -2727,7 +2734,8 @@ function markTagsCompactedByMessageIds2(db, sessionId, messageIds, eligibleTagNu
2727
2734
  SELECT value AS source_id, lower(value) AS folded_id FROM json_each(?)
2728
2735
  )
2729
2736
  SELECT id, tag_number, message_id, tool_owner_message_id FROM tags INDEXED BY ${tagOrderConstraintIndex(db)}
2730
- WHERE session_id = ? AND status IN ('active', 'dropped') AND (
2737
+ WHERE session_id = ? ${eligibleTagNumbers ? "AND tag_number IN (SELECT value FROM json_each(?))" : ""}
2738
+ AND status IN ('active', 'dropped') AND (
2731
2739
  message_id IN (SELECT source_id FROM ids)
2732
2740
  OR tool_owner_message_id IN (SELECT source_id FROM ids)
2733
2741
  OR (instr(lower(message_id), ':p') > 0 AND
@@ -2736,7 +2744,7 @@ function markTagsCompactedByMessageIds2(db, sessionId, messageIds, eligibleTagNu
2736
2744
  lower(substr(message_id, 1, instr(lower(message_id), ':file') - 1)) IN (SELECT folded_id FROM ids))
2737
2745
  OR (? AND instr(message_id, ':') > 0)
2738
2746
  OR ?
2739
- )`).all(JSON.stringify(Array.from(ids)), sessionId, Array.from(ids).some((id) => id.includes(":")) ? 1 : 0, nulPrefixes.size > 0 ? 1 : 0);
2747
+ )`).all(JSON.stringify(Array.from(ids)), sessionId, ...eligibleTagNumbers ? [JSON.stringify([...eligibleTagNumbers])] : [], Array.from(ids).some((id) => id.includes(":")) ? 1 : 0, nulPrefixes.size > 0 ? 1 : 0);
2740
2748
  const candidates = rows.filter((row) => (eligibleTagNumbers === undefined || eligibleTagNumbers.has(row.tag_number)) && matches(row.message_id, row.tool_owner_message_id));
2741
2749
  if (candidates.length === 0)
2742
2750
  return 0;
@@ -3095,4 +3103,4 @@ function deleteToolTagsByOwner(db, sessionId, ownerMsgId) {
3095
3103
  return getDeleteToolTagsByOwnerStatement(db).all(sessionId, ownerMsgId).length;
3096
3104
  }
3097
3105
 
3098
- export { UNKNOWN_FIT_RATIO, resolveDecisionCalibration, hasMeasuredDecisionCalibration, providerMass, localBudget, calibrationForModelKey, historyLocalBudget, adoptedProtectedToolsPolicy, protectedToolTagNumbers, protectedToolTokenCount, stripWellFormedLeadingTagPrefix, stripPersistedAssistantText, byteSize, stripTagPrefix, peelLeadingMcTagNotation, prependTag, isRecord, TEXT_TAG_IDENTITY_MARKER, contentTagOwnerMessageId, estimateImageTokensFromDataUrl, providerVisiblePart, providerVisibleMessage, TODO_STATUSES, TODO_PRIORITIES, TITLE_DONE_STATUSES, normalizeTodoStateJson, buildSyntheticTodoPart, stripChannel1ReminderSpans, compareMeasuredTailPrefix, formatTailHygienePrefixMismatch, freezeTailHygieneMeasurement, effectiveTailHygiene, CHANNEL1_SENTINEL, CHANNEL1_FLOOR_TOKENS, decideChannel1, evaluateChannel2, reclaimableToolOutputCount, buildChannel2Reminder, buildChannel1Reminder, planEmergencyDrop, measureEmergencyTag, queuePendingOp, queuePendingDropForUnchangedTag, getPendingOps, getPendingOpsCount, clearPendingOps, removePendingOp, updateTagByteSize2, getRecentTagOwnerMessageIds2, getActiveTagTokenAggregate2, AGE_RECLAIM_MIN_TOKENS2, getOldestActiveUnprotectedToolTags2, getActiveToolTagsForAgeReclaim2, getTriggerTagTokenUpperBound2, getActiveTagTokenTotalsByMessage2, updateTagInputByteSize2, updateTagTokenCount2, getPersistedToolTagAccounting2, getAllStatusTagTokenTotalsFlat2, getReasoningTokenEstimatesByMessage2, tryGetReasoningTokenEstimatesByMessage2, getMaxTagNumberByOwnerMessage2, scanTagOwnerSummary2, scanTagOwnerDelta2, updateTagInputTokenCount2, tagTokenCountIsNull2, backfillTagTokenCounts2, insertTag2, updateTagStatus2, getInertWhitespaceAssistantTags2, updateTagDropMode2, updateCavemanDepth2, updateTagMessageId2, hasPiFallbackMessageTags2, findAdoptableFallbackTags2, adoptFallbackTagMessageId2, foldShrunkPartTags2, hasPiFallbackToolOwnerTags2, findPiFallbackToolOwnerTags2, PiTagIdentityConflictError2, getPiMessageTagCandidates2, findPiTagIdentityConflict2, adoptPiFallbackToolOwnerTag2, adoptPiFallbackMessageTag2, markTagsCompactedByMessageIds2, deleteTagsByMessageId2, getMaxTagNumberBySession2, getTagNumberByMessageId2, getAssignableTagNumberByMessageId2, getMinMessageTagNumberForRawId2, deriveTagLoadFloor2, TAG_SELECT_COLUMNS2, getTagsBySession2, getActiveTagsBySession2, getTagsForPendingOperations2, getTagsByNumbers2, getNewestToolTagNumbers2, getDroppedTagsByNumbers2, getMaxDroppedTagNumber2, getTagById2, getTopNBySize2, getToolTagNumberByOwner2, getNullOwnerToolTag2, adoptNullOwnerToolTag2, getCandidateToolOwners2, pickNearestPriorOwner2 };
3106
+ export { UNKNOWN_FIT_RATIO, resolveDecisionCalibration, hasMeasuredDecisionCalibration, providerMass, localBudget, calibrationForModelKey, historyLocalBudget, adoptedProtectedToolsPolicy, protectedToolTagNumbers, protectedToolTokenCount, stripWellFormedLeadingTagPrefix, stripPersistedAssistantText, byteSize, stripTagPrefix, peelLeadingMcTagNotation, prependTag, isRecord, TEXT_TAG_IDENTITY_MARKER, contentTagOwnerMessageId, estimateImageTokensFromDataUrl, providerVisiblePart, providerVisibleMessage, TODO_STATUSES, TODO_PRIORITIES, TITLE_DONE_STATUSES, normalizeTodoStateJson, buildSyntheticTodoPart, stripChannel1ReminderSpans, compareMeasuredTailPrefix, formatTailHygienePrefixMismatch, freezeTailHygieneMeasurement, effectiveTailHygiene, CHANNEL1_SENTINEL, CHANNEL1_FLOOR_TOKENS, decideChannel1, evaluateChannel2, reclaimableToolOutputCount, buildChannel2Reminder, buildChannel1Reminder, planEmergencyDrop, measureEmergencyTag, queuePendingOp, queuePendingDropForUnchangedTag, getPendingOps, getPendingOpsCount, clearPendingOps, removePendingOp, updateTagByteSize2, getRecentTagOwnerMessageIds2, getActiveTagTokenAggregate2, AGE_RECLAIM_MIN_TOKENS2, getOldestActiveUnprotectedToolTags2, getActiveToolTagsForAgeReclaim2, getTriggerTagTokenUpperBound2, getActiveTagTokenTotalsByMessage2, updateTagInputByteSize2, updateTagTokenCount2, getPersistedToolTagAccounting2, getAllStatusTagTokenTotalsFlat2, getReasoningTokenEstimatesByMessage2, tryGetReasoningTokenEstimatesByMessage2, getMaxTagNumberByOwnerMessage2, scanTagOwnerSummary2, scanTagOwnerDelta2, updateTagInputTokenCount2, tagTokenCountIsNull2, backfillTagTokenCounts2, insertTag2, updateTagStatus2, getInertWhitespaceAssistantTagsByNumbers2, updateTagDropMode2, updateCavemanDepth2, updateTagMessageId2, hasPiFallbackMessageTags2, findAdoptableFallbackTags2, adoptFallbackTagMessageId2, foldShrunkPartTags2, hasPiFallbackToolOwnerTags2, findPiFallbackToolOwnerTags2, PiTagIdentityConflictError2, getPiMessageTagCandidates2, findPiTagIdentityConflict2, adoptPiFallbackToolOwnerTag2, adoptPiFallbackMessageTag2, markTagsCompactedByMessageIds2, deleteTagsByMessageId2, getMaxTagNumberBySession2, getTagNumberByMessageId2, getAssignableTagNumberByMessageId2, getMinMessageTagNumberForRawId2, deriveTagLoadFloor2, TAG_SELECT_COLUMNS2, getTagsBySession2, getActiveTagsBySession2, getTagsForPendingOperations2, getTagsByNumbers2, getNewestToolTagNumbers2, getDroppedTagsByNumbers2, getMaxDroppedTagNumber2, getTagById2, getTopNBySize2, getToolTagNumberByOwner2, getNullOwnerToolTag2, adoptNullOwnerToolTag2, getCandidateToolOwners2, pickNearestPriorOwner2 };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionLog2
3
- } from "./index-f956htf3.js";
3
+ } from "./index-x3dcnxh0.js";
4
4
 
5
5
  // ../plugin/src/shared/stable-json.ts
6
6
  function stableStringify(value, seen = new WeakSet) {
@@ -415,12 +415,42 @@ function tagOrderConstraintIndex(db) {
415
415
 
416
416
  // ../plugin/src/features/magic-context/storage-tag-identity-revision.ts
417
417
  var TAG_IDENTITY_REVISION_PREFIX = "tag_identity_revision:";
418
+ var TAG_REVISION_PREFIX = "tag_revision:";
419
+ var TAG_TOMBSTONE_OWNER_PREFIX = "tag_revision_owner:";
420
+ var TAG_REVISION_INCARNATION_KEY = "tag_revision_incarnation";
421
+ var tagRevisionIncarnationSql = (value) => `CASE WHEN INSTR(${value}, ':') > 0 THEN SUBSTR(${value}, 1, INSTR(${value}, ':') - 1) ELSE '0' END`;
422
+ var tagRevisionCountSql = (value) => `CAST(CASE WHEN INSTR(${value}, ':') > 0 THEN SUBSTR(${value}, INSTR(${value}, ':') + 1) ELSE ${value} END AS INTEGER)`;
423
+ var ADVANCE = (delta = "1") => `CASE
424
+ WHEN ${tagRevisionCountSql("value")} <= 9223372036854775807 - ${delta}
425
+ THEN (${tagRevisionIncarnationSql("value")}) || ':' || CAST(${tagRevisionCountSql("value")} + ${delta} AS TEXT)
426
+ ELSE NULL END`;
427
+ function tagTombstoneOwnerRange(sessionId) {
428
+ const stem = `${TAG_TOMBSTONE_OWNER_PREFIX}${JSON.stringify(sessionId)}`;
429
+ return [`${stem}:`, `${stem};`];
430
+ }
431
+ function tagTombstoneOwnerKey(sessionId, harness) {
432
+ return `${tagTombstoneOwnerRange(sessionId)[0]}${harness}`;
433
+ }
434
+ function tagRevisionKey(sessionId) {
435
+ return `${TAG_REVISION_PREFIX}${sessionId}`;
436
+ }
418
437
  function tagIdentityRevisionKey(sessionId) {
419
438
  return `${TAG_IDENTITY_REVISION_PREFIX}${sessionId}`;
420
439
  }
421
- var BUMP = (session) => `INSERT INTO schema_migrations_meta (key, value)
422
- VALUES ('${TAG_IDENTITY_REVISION_PREFIX}' || ${session}, '1')
423
- ON CONFLICT(key) DO UPDATE SET value = CAST(CAST(value AS INTEGER) + 1 AS TEXT)`;
440
+ var BUMP = (session, prefix = TAG_IDENTITY_REVISION_PREFIX) => `INSERT INTO schema_migrations_meta (key, value)
441
+ VALUES ('${prefix}' || ${session}, '1')
442
+ ON CONFLICT(key) DO UPDATE SET value = ${ADVANCE()}`;
443
+ var TAG_INSERT_CONFLICT_ROWS = `SELECT id, session_id, tag_number FROM tags WHERE id = NEW.id
444
+ UNION SELECT id, session_id, tag_number FROM tags WHERE session_id = NEW.session_id AND tag_number = NEW.tag_number
445
+ UNION SELECT id, session_id, tag_number FROM tags
446
+ WHERE NEW.type = 'tool' AND NEW.tool_owner_message_id IS NOT NULL
447
+ AND type = 'tool' AND tool_owner_message_id IS NOT NULL
448
+ AND session_id = NEW.session_id AND message_id = NEW.message_id
449
+ AND tool_owner_message_id = NEW.tool_owner_message_id`;
450
+ var BUMP_INSERT_CONFLICTS = (prefix) => `INSERT INTO schema_migrations_meta (key, value)
451
+ SELECT '${prefix}' || session_id, CAST(COUNT(*) AS TEXT)
452
+ FROM (${TAG_INSERT_CONFLICT_ROWS}) GROUP BY session_id
453
+ ON CONFLICT(key) DO UPDATE SET value = ${ADVANCE("CAST(excluded.value AS INTEGER)")}`;
424
454
  var TRIGGER_SQL = `CREATE TEMP TRIGGER IF NOT EXISTS mc_tag_identity_revision_au
425
455
  AFTER UPDATE OF id, session_id, message_id, tag_number, type, tool_owner_message_id, reasoning_token_count
426
456
  ON main.tags
@@ -429,15 +459,69 @@ var TRIGGER_SQL = `CREATE TEMP TRIGGER IF NOT EXISTS mc_tag_identity_revision_au
429
459
  INSERT INTO schema_migrations_meta (key, value)
430
460
  SELECT '${TAG_IDENTITY_REVISION_PREFIX}' || NEW.session_id, '1'
431
461
  WHERE NEW.session_id IS NOT OLD.session_id
432
- ON CONFLICT(key) DO UPDATE SET value = CAST(CAST(value AS INTEGER) + 1 AS TEXT);
462
+ ON CONFLICT(key) DO UPDATE SET value = ${ADVANCE()};
433
463
  END`;
434
464
  function installTagIdentityRevisionTrigger(db) {
465
+ db.exec(`DROP TRIGGER IF EXISTS temp.mc_tag_identity_revision_au;
466
+ DROP TRIGGER IF EXISTS temp.mc_tag_revision_bi;
467
+ DROP TRIGGER IF EXISTS temp.mc_tag_revision_ai;
468
+ DROP TRIGGER IF EXISTS temp.mc_tag_revision_au;
469
+ DROP TRIGGER IF EXISTS temp.mc_tag_revision_ad;
470
+ DROP TRIGGER IF EXISTS temp.mc_tag_revision_seed_ai;`);
471
+ db.exec(`CREATE TEMP TRIGGER mc_tag_revision_seed_ai AFTER INSERT ON main.schema_migrations_meta
472
+ WHEN INSTR(NEW.value, ':') = 0 AND (
473
+ SUBSTR(NEW.key, 1, ${TAG_REVISION_PREFIX.length}) = '${TAG_REVISION_PREFIX}'
474
+ OR SUBSTR(NEW.key, 1, ${TAG_IDENTITY_REVISION_PREFIX.length}) = '${TAG_IDENTITY_REVISION_PREFIX}')
475
+ BEGIN
476
+ INSERT INTO schema_migrations_meta (key, value) VALUES ('${TAG_REVISION_INCARNATION_KEY}', '1')
477
+ ON CONFLICT(key) DO UPDATE SET value = CAST(CASE
478
+ WHEN CAST(value AS INTEGER) < 9223372036854775807 THEN CAST(value AS INTEGER) + 1
479
+ ELSE NULL END AS TEXT);
480
+ UPDATE schema_migrations_meta SET value =
481
+ (SELECT value FROM schema_migrations_meta WHERE key = '${TAG_REVISION_INCARNATION_KEY}')
482
+ || ':' || CAST(NEW.value AS TEXT) WHERE key = NEW.key;
483
+ INSERT INTO schema_migrations_meta (key, value)
484
+ SELECT '${TAG_REVISION_INCARNATION_KEY}', '1'
485
+ WHERE SUBSTR(NEW.key, 1, ${TAG_REVISION_PREFIX.length}) = '${TAG_REVISION_PREFIX}'
486
+ AND NOT EXISTS (SELECT 1 FROM schema_migrations_meta
487
+ WHERE key = '${TAG_IDENTITY_REVISION_PREFIX}' || SUBSTR(NEW.key, ${TAG_REVISION_PREFIX.length + 1}))
488
+ ON CONFLICT(key) DO UPDATE SET value = CAST(CASE
489
+ WHEN CAST(value AS INTEGER) < 9223372036854775807 THEN CAST(value AS INTEGER) + 1
490
+ ELSE NULL END AS TEXT);
491
+ INSERT INTO schema_migrations_meta (key, value)
492
+ SELECT '${TAG_IDENTITY_REVISION_PREFIX}' || SUBSTR(NEW.key, ${TAG_REVISION_PREFIX.length + 1}),
493
+ (SELECT value FROM schema_migrations_meta WHERE key = '${TAG_REVISION_INCARNATION_KEY}') || ':0'
494
+ WHERE SUBSTR(NEW.key, 1, ${TAG_REVISION_PREFIX.length}) = '${TAG_REVISION_PREFIX}'
495
+ AND NOT EXISTS (SELECT 1 FROM schema_migrations_meta
496
+ WHERE key = '${TAG_IDENTITY_REVISION_PREFIX}' || SUBSTR(NEW.key, ${TAG_REVISION_PREFIX.length + 1}));
497
+ END;`);
435
498
  db.exec(TRIGGER_SQL);
499
+ db.exec(`CREATE TEMP TRIGGER IF NOT EXISTS mc_tag_revision_bi BEFORE INSERT ON main.tags BEGIN
500
+ ${BUMP_INSERT_CONFLICTS(TAG_REVISION_PREFIX)};
501
+ ${BUMP_INSERT_CONFLICTS(TAG_IDENTITY_REVISION_PREFIX)};
502
+ UPDATE session_meta SET tags_version = tags_version + 1
503
+ WHERE session_id IN (SELECT session_id FROM (${TAG_INSERT_CONFLICT_ROWS}));
504
+ END;`);
505
+ db.exec(`CREATE TEMP TRIGGER IF NOT EXISTS mc_tag_revision_ai AFTER INSERT ON main.tags BEGIN
506
+ ${BUMP("NEW.session_id", TAG_REVISION_PREFIX)};
507
+ END;
508
+ CREATE TEMP TRIGGER IF NOT EXISTS mc_tag_revision_au AFTER UPDATE ON main.tags BEGIN
509
+ ${BUMP("OLD.session_id", TAG_REVISION_PREFIX)};
510
+ INSERT INTO schema_migrations_meta (key, value)
511
+ SELECT '${TAG_REVISION_PREFIX}' || NEW.session_id, '1'
512
+ WHERE NEW.session_id IS NOT OLD.session_id
513
+ ON CONFLICT(key) DO UPDATE SET value = ${ADVANCE()};
514
+ END;
515
+ CREATE TEMP TRIGGER IF NOT EXISTS mc_tag_revision_ad AFTER DELETE ON main.tags BEGIN
516
+ ${BUMP("OLD.session_id", TAG_REVISION_PREFIX)};
517
+ END;`);
436
518
  }
437
519
  function deleteTagIdentityRevisions(db, sessionIds) {
438
- const statement = db.prepare("DELETE FROM schema_migrations_meta WHERE key = ? AND NOT EXISTS (SELECT 1 FROM tags WHERE session_id = ?)");
439
- for (const sessionId of sessionIds)
440
- statement.run(tagIdentityRevisionKey(sessionId), sessionId);
520
+ const statement = db.prepare(`INSERT INTO schema_migrations_meta (key, value) VALUES (?, '1')
521
+ ON CONFLICT(key) DO UPDATE SET value = ${ADVANCE()}`);
522
+ for (const sessionId of sessionIds) {
523
+ statement.run(tagIdentityRevisionKey(sessionId));
524
+ }
441
525
  }
442
526
 
443
- export { stableStringify, closeQuietly, isKnownAutocommit, getTableColumnNames, ensureColumn, healAllNullColumns, observeTemporalDecisions, freezeTemporalDecisions, installV95PerfSchema, tagOrderConstraintIndex, tagIdentityRevisionKey, installTagIdentityRevisionTrigger, deleteTagIdentityRevisions };
527
+ export { stableStringify, 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 };