@cortexkit/magic-context 0.48.0 → 0.49.0

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 (2) hide show
  1. package/dist/index.js +240 -34
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -2212,8 +2212,12 @@ function flush() {
2212
2212
  let currentSize = getCurrentLogSize(logFile);
2213
2213
  const dataSize = Buffer.byteLength(data);
2214
2214
  if (currentSize > 0 && currentSize + dataSize > MAX_LOG_FILE_BYTES) {
2215
- rotateLogFile(logFile, currentSize);
2216
- currentSize = 0;
2215
+ flushesSinceSizeCheck = SIZE_CHECK_INTERVAL_FLUSHES;
2216
+ currentSize = getCurrentLogSize(logFile);
2217
+ if (currentSize > 0 && currentSize + dataSize > MAX_LOG_FILE_BYTES) {
2218
+ rotateLogFile(logFile, currentSize);
2219
+ currentSize = 0;
2220
+ }
2217
2221
  }
2218
2222
  fs.appendFileSync(logFile, data, { encoding: "utf8", mode: 384 });
2219
2223
  buffer = [];
@@ -28995,11 +28999,75 @@ var init_migrations = __esm(async () => {
28995
28999
 
28996
29000
  // ../plugin/src/features/magic-context/storage-tag-identity-revision.ts
28997
29001
  function installTagIdentityRevisionTrigger(db) {
29002
+ db.exec(`DROP TRIGGER IF EXISTS temp.mc_tag_identity_revision_au;
29003
+ DROP TRIGGER IF EXISTS temp.mc_tag_revision_bi;
29004
+ DROP TRIGGER IF EXISTS temp.mc_tag_revision_ai;
29005
+ DROP TRIGGER IF EXISTS temp.mc_tag_revision_au;
29006
+ DROP TRIGGER IF EXISTS temp.mc_tag_revision_ad;
29007
+ DROP TRIGGER IF EXISTS temp.mc_tag_revision_seed_ai;`);
29008
+ db.exec(`CREATE TEMP TRIGGER mc_tag_revision_seed_ai AFTER INSERT ON main.schema_migrations_meta
29009
+ WHEN INSTR(NEW.value, ':') = 0 AND (
29010
+ SUBSTR(NEW.key, 1, ${TAG_REVISION_PREFIX.length}) = '${TAG_REVISION_PREFIX}'
29011
+ OR SUBSTR(NEW.key, 1, ${TAG_IDENTITY_REVISION_PREFIX.length}) = '${TAG_IDENTITY_REVISION_PREFIX}')
29012
+ BEGIN
29013
+ INSERT INTO schema_migrations_meta (key, value) VALUES ('${TAG_REVISION_INCARNATION_KEY}', '1')
29014
+ ON CONFLICT(key) DO UPDATE SET value = CAST(CASE
29015
+ WHEN CAST(value AS INTEGER) < 9223372036854775807 THEN CAST(value AS INTEGER) + 1
29016
+ ELSE NULL END AS TEXT);
29017
+ UPDATE schema_migrations_meta SET value =
29018
+ (SELECT value FROM schema_migrations_meta WHERE key = '${TAG_REVISION_INCARNATION_KEY}')
29019
+ || ':' || CAST(NEW.value AS TEXT) WHERE key = NEW.key;
29020
+ INSERT INTO schema_migrations_meta (key, value)
29021
+ SELECT '${TAG_REVISION_INCARNATION_KEY}', '1'
29022
+ WHERE SUBSTR(NEW.key, 1, ${TAG_REVISION_PREFIX.length}) = '${TAG_REVISION_PREFIX}'
29023
+ AND NOT EXISTS (SELECT 1 FROM schema_migrations_meta
29024
+ WHERE key = '${TAG_IDENTITY_REVISION_PREFIX}' || SUBSTR(NEW.key, ${TAG_REVISION_PREFIX.length + 1}))
29025
+ ON CONFLICT(key) DO UPDATE SET value = CAST(CASE
29026
+ WHEN CAST(value AS INTEGER) < 9223372036854775807 THEN CAST(value AS INTEGER) + 1
29027
+ ELSE NULL END AS TEXT);
29028
+ INSERT INTO schema_migrations_meta (key, value)
29029
+ SELECT '${TAG_IDENTITY_REVISION_PREFIX}' || SUBSTR(NEW.key, ${TAG_REVISION_PREFIX.length + 1}),
29030
+ (SELECT value FROM schema_migrations_meta WHERE key = '${TAG_REVISION_INCARNATION_KEY}') || ':0'
29031
+ WHERE SUBSTR(NEW.key, 1, ${TAG_REVISION_PREFIX.length}) = '${TAG_REVISION_PREFIX}'
29032
+ AND NOT EXISTS (SELECT 1 FROM schema_migrations_meta
29033
+ WHERE key = '${TAG_IDENTITY_REVISION_PREFIX}' || SUBSTR(NEW.key, ${TAG_REVISION_PREFIX.length + 1}));
29034
+ END;`);
28998
29035
  db.exec(TRIGGER_SQL);
28999
- }
29000
- var TAG_IDENTITY_REVISION_PREFIX = "tag_identity_revision:", BUMP = (session) => `INSERT INTO schema_migrations_meta (key, value)
29001
- VALUES ('${TAG_IDENTITY_REVISION_PREFIX}' || ${session}, '1')
29002
- ON CONFLICT(key) DO UPDATE SET value = CAST(CAST(value AS INTEGER) + 1 AS TEXT)`, TRIGGER_SQL;
29036
+ db.exec(`CREATE TEMP TRIGGER IF NOT EXISTS mc_tag_revision_bi BEFORE INSERT ON main.tags BEGIN
29037
+ ${BUMP_INSERT_CONFLICTS(TAG_REVISION_PREFIX)};
29038
+ ${BUMP_INSERT_CONFLICTS(TAG_IDENTITY_REVISION_PREFIX)};
29039
+ UPDATE session_meta SET tags_version = tags_version + 1
29040
+ WHERE session_id IN (SELECT session_id FROM (${TAG_INSERT_CONFLICT_ROWS}));
29041
+ END;`);
29042
+ db.exec(`CREATE TEMP TRIGGER IF NOT EXISTS mc_tag_revision_ai AFTER INSERT ON main.tags BEGIN
29043
+ ${BUMP("NEW.session_id", TAG_REVISION_PREFIX)};
29044
+ END;
29045
+ CREATE TEMP TRIGGER IF NOT EXISTS mc_tag_revision_au AFTER UPDATE ON main.tags BEGIN
29046
+ ${BUMP("OLD.session_id", TAG_REVISION_PREFIX)};
29047
+ INSERT INTO schema_migrations_meta (key, value)
29048
+ SELECT '${TAG_REVISION_PREFIX}' || NEW.session_id, '1'
29049
+ WHERE NEW.session_id IS NOT OLD.session_id
29050
+ ON CONFLICT(key) DO UPDATE SET value = ${ADVANCE()};
29051
+ END;
29052
+ CREATE TEMP TRIGGER IF NOT EXISTS mc_tag_revision_ad AFTER DELETE ON main.tags BEGIN
29053
+ ${BUMP("OLD.session_id", TAG_REVISION_PREFIX)};
29054
+ END;`);
29055
+ }
29056
+ var TAG_IDENTITY_REVISION_PREFIX = "tag_identity_revision:", TAG_REVISION_PREFIX = "tag_revision:", TAG_REVISION_INCARNATION_KEY = "tag_revision_incarnation", tagRevisionIncarnationSql = (value) => `CASE WHEN INSTR(${value}, ':') > 0 THEN SUBSTR(${value}, 1, INSTR(${value}, ':') - 1) ELSE '0' END`, tagRevisionCountSql = (value) => `CAST(CASE WHEN INSTR(${value}, ':') > 0 THEN SUBSTR(${value}, INSTR(${value}, ':') + 1) ELSE ${value} END AS INTEGER)`, ADVANCE = (delta = "1") => `CASE
29057
+ WHEN ${tagRevisionCountSql("value")} <= 9223372036854775807 - ${delta}
29058
+ THEN (${tagRevisionIncarnationSql("value")}) || ':' || CAST(${tagRevisionCountSql("value")} + ${delta} AS TEXT)
29059
+ ELSE NULL END`, BUMP = (session, prefix = TAG_IDENTITY_REVISION_PREFIX) => `INSERT INTO schema_migrations_meta (key, value)
29060
+ VALUES ('${prefix}' || ${session}, '1')
29061
+ ON CONFLICT(key) DO UPDATE SET value = ${ADVANCE()}`, TAG_INSERT_CONFLICT_ROWS = `SELECT id, session_id, tag_number FROM tags WHERE id = NEW.id
29062
+ UNION SELECT id, session_id, tag_number FROM tags WHERE session_id = NEW.session_id AND tag_number = NEW.tag_number
29063
+ UNION SELECT id, session_id, tag_number FROM tags
29064
+ WHERE NEW.type = 'tool' AND NEW.tool_owner_message_id IS NOT NULL
29065
+ AND type = 'tool' AND tool_owner_message_id IS NOT NULL
29066
+ AND session_id = NEW.session_id AND message_id = NEW.message_id
29067
+ AND tool_owner_message_id = NEW.tool_owner_message_id`, BUMP_INSERT_CONFLICTS = (prefix) => `INSERT INTO schema_migrations_meta (key, value)
29068
+ SELECT '${prefix}' || session_id, CAST(COUNT(*) AS TEXT)
29069
+ FROM (${TAG_INSERT_CONFLICT_ROWS}) GROUP BY session_id
29070
+ ON CONFLICT(key) DO UPDATE SET value = ${ADVANCE("CAST(excluded.value AS INTEGER)")}`, TRIGGER_SQL;
29003
29071
  var init_storage_tag_identity_revision = __esm(() => {
29004
29072
  TRIGGER_SQL = `CREATE TEMP TRIGGER IF NOT EXISTS mc_tag_identity_revision_au
29005
29073
  AFTER UPDATE OF id, session_id, message_id, tag_number, type, tool_owner_message_id, reasoning_token_count
@@ -29009,7 +29077,7 @@ var init_storage_tag_identity_revision = __esm(() => {
29009
29077
  INSERT INTO schema_migrations_meta (key, value)
29010
29078
  SELECT '${TAG_IDENTITY_REVISION_PREFIX}' || NEW.session_id, '1'
29011
29079
  WHERE NEW.session_id IS NOT OLD.session_id
29012
- ON CONFLICT(key) DO UPDATE SET value = CAST(CAST(value AS INTEGER) + 1 AS TEXT);
29080
+ ON CONFLICT(key) DO UPDATE SET value = ${ADVANCE()};
29013
29081
  END`;
29014
29082
  });
29015
29083
 
@@ -30381,7 +30449,7 @@ function pickNearestPriorOwner(candidates, currentMessageId, times) {
30381
30449
  }
30382
30450
  return best?.id ?? null;
30383
30451
  }
30384
- var insertTagStatements, updateTagStatusStatements, updateTagDropModeStatements, updateTagMessageIdStatements, getTagNumbersByMessageIdStatements, deleteTagsByMessageIdStatements, getMaxTagNumberBySessionStatements, getTagNumberByMessageIdStatements, getAssignableTagNumberByMessageIdStatements, hasPiFallbackMessageTagStatements, updateTagByteSizeStatements, updateTagInputByteSizeStatements, recentTagOwnerStatements, RECLAIM_HINT_EXCLUDED_TOOLS, getActiveToolTagsForAgeReclaimStatements, scopedActiveTokenTotalStatements, updateTagTokenCountStatements, updateTagInputTokenCountStatements, tagOwnerSummaries, TAG_OWNER_COLUMNS = "id, type, message_id, tool_owner_message_id, tag_number, reasoning_token_count", TAG_OWNER_APPENDED_WITH_SHAPE_SQL, inertWhitespaceStatements, foldStatements, getOwnerScopedToolTagNumbersStatements, getMinMessageTagNumberForRawIdStatements, getActiveTagsBySessionStatements, getNullOwnerToolTagsBySessionStatements, getDroppedTagsBySessionStatements, getMaxDroppedTagNumberStatements, newestToolTagNumberStatements, droppedNumberStatements, tagByIdStatements, getToolTagNumberByOwnerStatements, getNullOwnerToolTagStatements, adoptNullOwnerToolTagStatements, getToolOwnerByTagIdStatements, deleteToolTagsByOwnerStatements;
30452
+ var insertTagStatements, updateTagStatusStatements, updateTagDropModeStatements, updateTagMessageIdStatements, getTagNumbersByMessageIdStatements, deleteTagsByMessageIdStatements, getMaxTagNumberBySessionStatements, getTagNumberByMessageIdStatements, getAssignableTagNumberByMessageIdStatements, hasPiFallbackMessageTagStatements, updateTagByteSizeStatements, updateTagInputByteSizeStatements, recentTagOwnerStatements, RECLAIM_HINT_EXCLUDED_TOOLS, getActiveToolTagsForAgeReclaimStatements, scopedActiveTokenTotalStatements, updateTagTokenCountStatements, updateTagInputTokenCountStatements, tagOwnerSummaries, TAG_OWNER_COLUMNS = "id, type, message_id, tool_owner_message_id, tag_number, reasoning_token_count", TAG_OWNER_APPENDED_WITH_SHAPE_SQL, inertWhitespaceStatements, inertWhitespaceByNumberStatements, foldStatements, getOwnerScopedToolTagNumbersStatements, getMinMessageTagNumberForRawIdStatements, getActiveTagsBySessionStatements, getNullOwnerToolTagsBySessionStatements, getDroppedTagsBySessionStatements, getMaxDroppedTagNumberStatements, newestToolTagNumberStatements, droppedNumberStatements, tagByIdStatements, getToolTagNumberByOwnerStatements, getNullOwnerToolTagStatements, adoptNullOwnerToolTagStatements, getToolOwnerByTagIdStatements, deleteToolTagsByOwnerStatements;
30385
30453
  var init_storage_tags = __esm(async () => {
30386
30454
  init_emergency_drop();
30387
30455
  init_tag_owner_id();
@@ -30423,6 +30491,7 @@ var init_storage_tags = __esm(async () => {
30423
30491
  SELECT NULL, NULL, NULL, NULL, NULL, NULL, 1, COUNT(*), MAX(id), (SELECT value FROM schema_migrations_meta WHERE key = ?)
30424
30492
  FROM tags WHERE session_id = ?`;
30425
30493
  inertWhitespaceStatements = new WeakMap;
30494
+ inertWhitespaceByNumberStatements = new WeakMap;
30426
30495
  foldStatements = new WeakMap;
30427
30496
  getOwnerScopedToolTagNumbersStatements = new WeakMap;
30428
30497
  getMinMessageTagNumberForRawIdStatements = new WeakMap;
@@ -30665,29 +30734,44 @@ function readRawMessagePageRows(db, sessionId, afterOrdinal, limit, finalWaterma
30665
30734
  const pageSize = Math.min(Math.max(1, Math.floor(limit)), remaining);
30666
30735
  if (pageSize === 0)
30667
30736
  return [];
30668
- const parameters = [sessionId];
30669
- if (after)
30670
- parameters.push(after.timeCreated, after.timeCreated, after.timeCreated, after.id);
30671
- parameters.push(pageSize);
30672
- if (!after)
30673
- parameters.push(Math.max(0, Math.floor(afterOrdinal)));
30674
- return db.prepare(`SELECT id, data, time_created, time_updated
30675
- FROM message
30676
- WHERE session_id = ?
30677
- ${after ? "AND time_created >= ? AND (time_created > ? OR (time_created = ? AND id > ?))" : ""}
30678
- AND NOT (
30679
- CASE WHEN json_valid(data) = 1
30680
- THEN COALESCE(json_extract(data, '$.summary'), 0)
30681
- ELSE 0 END = 1
30682
- AND CASE WHEN json_valid(data) = 1
30683
- THEN COALESCE(json_extract(data, '$.finish'), '')
30684
- ELSE '' END = 'stop'
30685
- )
30686
- ORDER BY time_created ASC, id ASC
30687
- LIMIT ? ${after ? "" : "OFFSET ?"}`).all(...parameters).filter(isRawMessageRow).map((row, index) => ({
30688
- ...row,
30689
- ordinal: Math.floor(afterOrdinal) + index + 1
30690
- }));
30737
+ return withReadSnapshot(db, () => {
30738
+ const ordinal = Math.max(0, Math.floor(afterOrdinal));
30739
+ const points = currentOrdinalCheckpoints(db, sessionId)?.scan.checkpoints ?? [];
30740
+ let low = 0;
30741
+ let high = points.length;
30742
+ while (low < high) {
30743
+ const middle = Math.floor((low + high) / 2);
30744
+ if (points[middle].ordinal <= ordinal)
30745
+ low = middle + 1;
30746
+ else
30747
+ high = middle;
30748
+ }
30749
+ const floor = points[low - 1];
30750
+ const useFloor = floor && (!after || compareOrdinalKeys(floor, after) > 0);
30751
+ const anchor = useFloor ? floor : after;
30752
+ const skip = anchor === after && after ? 0 : ordinal - (floor?.ordinal ?? 0);
30753
+ if (skip > ORDINAL_LOOKUP_LIMIT) {
30754
+ prewarmRawSessionOrdinalsForDb(db, sessionId);
30755
+ throw new RawOrdinalsNotReady;
30756
+ }
30757
+ const rawLimit = skip + pageSize + ORDINAL_LOOKUP_LIMIT;
30758
+ const rows = db.prepare(`SELECT id, data, time_created, time_updated, ${EXCLUDED_ROW_SQL} AS excluded
30759
+ FROM message WHERE id IN (
30760
+ SELECT id FROM message WHERE session_id = ?
30761
+ ${anchor ? "AND (time_created, id) > (?, ?)" : ""}
30762
+ ORDER BY time_created, id LIMIT ?)
30763
+ ORDER BY time_created, id`).all(sessionId, ...anchor ? [anchor.timeCreated, anchor.id] : [], rawLimit);
30764
+ rawMessagePageRowsVisited += rows.length;
30765
+ const eligible = rows.filter((row) => row.excluded !== 1);
30766
+ if (eligible.length <= skip && rows.length === rawLimit) {
30767
+ prewarmRawSessionOrdinalsForDb(db, sessionId);
30768
+ throw new RawOrdinalsNotReady;
30769
+ }
30770
+ return eligible.slice(skip, skip + pageSize).filter(isRawMessageRow).map((row, index) => ({
30771
+ ...row,
30772
+ ordinal: ordinal + index + 1
30773
+ }));
30774
+ });
30691
30775
  }
30692
30776
  function assembleRawMessagePage(messageRows, partRows) {
30693
30777
  const partsByMessageId = new Map;
@@ -31349,11 +31433,124 @@ function readRawSeedTailFromDb(db, sessionId, boundaryId) {
31349
31433
  throw new Error("state_sync materialized boundary is missing from raw storage");
31350
31434
  return messages;
31351
31435
  }
31352
- var RAW_MESSAGE_PARTS_BY_ID_SQL = "SELECT message_id, data, time_updated FROM part WHERE +session_id = ? AND likelihood(message_id = ?, 0.000001) ORDER BY time_created ASC, id ASC", RAW_METADATA_KEEP_CHARS = 16384, RAW_METADATA_KEPT_KEYS, RAW_PART_DATA_SQL, RAW_SUMMARY_TEXT_MAX_CHARS = 8192, RAW_SUMMARY_ARG_MAX_CHARS = 512, RAW_SUMMARY_TOOL_INPUT_KEYS, RAW_SUMMARY_PART_DATA_SQL, ORDINAL_SUMMARY_FLAG_SQL = `(CASE WHEN json_valid(data) = 1
31436
+ function readBoundaryEndpointRows(db, sessionId, ids, blockIds, into) {
31437
+ if (ids.length > 0) {
31438
+ boundaryEndpointRowsRead += ids.length;
31439
+ const wanted = JSON.stringify(ids);
31440
+ const ordinals = new Map;
31441
+ for (const row of db.prepare(BOUNDARY_ORDINAL_SQL).all(sessionId, wanted)) {
31442
+ ordinals.set(row.id, row.ordinal);
31443
+ }
31444
+ const rows = db.prepare(BOUNDARY_MESSAGE_SQL).all(sessionId, wanted);
31445
+ for (const id of ids)
31446
+ into.set(id, null);
31447
+ for (const row of rows) {
31448
+ if (!isRawMessageRow(row) || typeof row.time_created !== "number")
31449
+ continue;
31450
+ const info = parseJsonRecord(row.data);
31451
+ if (!info || isRawCompactionSummaryInfo(info))
31452
+ continue;
31453
+ into.set(row.id, {
31454
+ ordinal: ordinals.get(row.id) ?? null,
31455
+ createdAt: row.time_created
31456
+ });
31457
+ }
31458
+ }
31459
+ const servable = blockIds.filter((id) => {
31460
+ const endpoint = into.get(id);
31461
+ return endpoint && endpoint.lastBlockIndex === undefined;
31462
+ });
31463
+ if (servable.length === 0)
31464
+ return;
31465
+ const counts = new Map;
31466
+ for (const row of db.prepare(BOUNDARY_BLOCK_COUNT_SQL).all(sessionId, JSON.stringify(servable))) {
31467
+ counts.set(row.id, row.blocks);
31468
+ }
31469
+ for (const id of servable) {
31470
+ const endpoint = into.get(id);
31471
+ if (!endpoint)
31472
+ continue;
31473
+ const blocks = counts.get(id) ?? 0;
31474
+ into.set(id, { ...endpoint, lastBlockIndex: blocks > 0 ? blocks - 1 : 0 });
31475
+ }
31476
+ }
31477
+ function readRawSessionBoundaryEndpointsFromDb(db, sessionId, ids, blockIds = []) {
31478
+ const wanted = [...new Set(ids)];
31479
+ const wantedBlocks = [...new Set(blockIds)];
31480
+ let sessions = boundaryEndpointCaches.get(db);
31481
+ if (!sessions) {
31482
+ sessions = new Map;
31483
+ boundaryEndpointCaches.set(db, sessions);
31484
+ }
31485
+ for (let attempt = 1;; attempt += 1) {
31486
+ const before = readStoreStamp(db);
31487
+ const cached = sessions.get(sessionId);
31488
+ const reuse = attempt === 1 && cached && sameStoreStamp(cached.stamp, before);
31489
+ const endpoints = new Map(reuse ? cached.endpoints : []);
31490
+ const missing = wanted.filter((id) => !endpoints.has(id));
31491
+ withReadSnapshot(db, () => readBoundaryEndpointRows(db, sessionId, missing, wantedBlocks, endpoints));
31492
+ const unchanged = before !== null && sameStoreStamp(before, readStoreStamp(db));
31493
+ if (unchanged) {
31494
+ sessions.delete(sessionId);
31495
+ sessions.set(sessionId, { stamp: before, endpoints });
31496
+ while (sessions.size > BOUNDARY_ENDPOINT_CACHE_SESSIONS) {
31497
+ const oldest = sessions.keys().next().value;
31498
+ if (oldest === undefined)
31499
+ break;
31500
+ sessions.delete(oldest);
31501
+ }
31502
+ } else if (reuse) {
31503
+ continue;
31504
+ }
31505
+ return new Map(wanted.map((id) => [id, endpoints.get(id) ?? null]));
31506
+ }
31507
+ }
31508
+ var RAW_MESSAGE_PARTS_BY_ID_SQL = "SELECT message_id, data, time_updated FROM part WHERE +session_id = ? AND likelihood(message_id = ?, 0.000001) ORDER BY time_created ASC, id ASC", RAW_METADATA_KEEP_CHARS = 16384, RAW_METADATA_KEPT_KEYS, RAW_PART_DATA_SQL, rawMessagePageRowsVisited = 0, RAW_SUMMARY_TEXT_MAX_CHARS = 8192, RAW_SUMMARY_ARG_MAX_CHARS = 512, RAW_SUMMARY_TOOL_INPUT_KEYS, RAW_SUMMARY_PART_DATA_SQL, ORDINAL_SUMMARY_FLAG_SQL = `(CASE WHEN json_valid(data) = 1
31353
31509
  THEN COALESCE(json_extract(data, '$.summary'), 0)
31354
31510
  ELSE 0 END = 1)`, ORDINAL_STOP_FLAG_SQL = `(CASE WHEN json_valid(data) = 1
31355
31511
  THEN COALESCE(json_extract(data, '$.finish'), '')
31356
- ELSE '' END = 'stop')`, ORDINAL_RANGE_FROM_START_SQL, ORDINAL_RANGE_BETWEEN_SQL, ordinalWatermarks, ordinalWatermarkEpochs, ordinalRowsVisited = 0, STABLE_STORE_ATTEMPTS = 3, EXCLUDED_ROW_SQL, SUMMARY_ANCHOR_SPAN = 256, SUMMARY_ANCHOR_LIMIT = 64, summaryCandidateSets, summaryCandidateEpochs, writtenSummaryIds, indexedCountUnsupported, ordinalJsonRowsRead = 0, summaryFullScans = 0, ANCHOR_ROWS_SQL, SUMMARY_FULL_SCAN_SQL, SUMMARY_SCAN_AFTER_SQL, ANCHOR_CHECK_SQL = "SELECT rowid AS rid, id FROM message WHERE rowid IN (SELECT value FROM json_each(?))", ordinalCheckpoints, ordinalSummarySeeds, ORDINAL_LOOKUP_LIMIT = 512, RawOrdinalsNotReady, CANONICAL_COUNT_SQL;
31512
+ ELSE '' END = 'stop')`, ORDINAL_RANGE_FROM_START_SQL, ORDINAL_RANGE_BETWEEN_SQL, ordinalWatermarks, ordinalWatermarkEpochs, ordinalRowsVisited = 0, STABLE_STORE_ATTEMPTS = 3, EXCLUDED_ROW_SQL, SUMMARY_ANCHOR_SPAN = 256, SUMMARY_ANCHOR_LIMIT = 64, summaryCandidateSets, summaryCandidateEpochs, writtenSummaryIds, indexedCountUnsupported, ordinalJsonRowsRead = 0, summaryFullScans = 0, ANCHOR_ROWS_SQL, SUMMARY_FULL_SCAN_SQL, SUMMARY_SCAN_AFTER_SQL, ANCHOR_CHECK_SQL = "SELECT rowid AS rid, id FROM message WHERE rowid IN (SELECT value FROM json_each(?))", ordinalCheckpoints, ordinalSummarySeeds, ORDINAL_LOOKUP_LIMIT = 512, RawOrdinalsNotReady, CANONICAL_COUNT_SQL, BOUNDARY_ORDINAL_SQL = `
31513
+ SELECT id, ordinal FROM (
31514
+ SELECT id, ROW_NUMBER() OVER (ORDER BY time_created, id) AS ordinal
31515
+ FROM message
31516
+ WHERE session_id = ?
31517
+ AND typeof(id) = 'text' AND typeof(data) = 'text'
31518
+ AND CASE WHEN json_valid(data) THEN NOT (
31519
+ COALESCE(json_type(data, '$.summary'), '') = 'true'
31520
+ AND COALESCE(json_extract(data, '$.finish'), '') = 'stop'
31521
+ ) ELSE 1 END
31522
+ )
31523
+ WHERE id IN (SELECT value FROM json_each(?))`, BOUNDARY_MESSAGE_SQL = `
31524
+ SELECT id, data, time_created FROM message
31525
+ WHERE +session_id = ? AND id IN (SELECT value FROM json_each(?))`, BOUNDARY_BLOCK_COUNT_SQL = `
31526
+ SELECT message_id AS id, SUM(
31527
+ CASE
31528
+ WHEN NOT json_valid(data) OR json_type(data) <> 'object' THEN 0
31529
+ ELSE CASE (CASE WHEN json_type(data, '$.type') = 'text'
31530
+ THEN json_extract(data, '$.type') ELSE 'unknown' END)
31531
+ WHEN 'text' THEN CASE WHEN json_type(data, '$.ignored') = 'true' THEN 0 ELSE 1 END
31532
+ WHEN 'reasoning' THEN 1
31533
+ WHEN 'thinking' THEN 1
31534
+ WHEN 'redacted_thinking' THEN 1
31535
+ WHEN 'tool' THEN 1 + CASE
31536
+ WHEN json_type(data, '$.state') = 'object'
31537
+ AND json_type(data, '$.state.status') = 'text'
31538
+ AND json_extract(data, '$.state.status') IN ('completed', 'error')
31539
+ THEN 1 ELSE 0 END
31540
+ WHEN 'compaction' THEN 0
31541
+ WHEN 'step-finish' THEN 0
31542
+ WHEN 'snapshot' THEN 0
31543
+ WHEN 'patch' THEN 0
31544
+ WHEN 'agent' THEN 0
31545
+ WHEN 'retry' THEN 0
31546
+ ELSE 1
31547
+ END
31548
+ END) AS blocks
31549
+ FROM part
31550
+ WHERE +session_id = ?
31551
+ AND message_id IN (SELECT value FROM json_each(?))
31552
+ AND typeof(message_id) = 'text' AND typeof(data) = 'text'
31553
+ GROUP BY message_id`, boundaryEndpointCaches, BOUNDARY_ENDPOINT_CACHE_SESSIONS = 16, boundaryEndpointRowsRead = 0;
31357
31554
  var init_read_session_raw = __esm(async () => {
31358
31555
  await __promiseAll([
31359
31556
  init_sqlite(),
@@ -31429,6 +31626,7 @@ END`;
31429
31626
  }
31430
31627
  };
31431
31628
  CANONICAL_COUNT_SQL = new Map;
31629
+ boundaryEndpointCaches = new WeakMap;
31432
31630
  });
31433
31631
 
31434
31632
  // ../plugin/src/hooks/magic-context/raw-ordinal-warmup.ts
@@ -31641,7 +31839,7 @@ function getMessageTimesFromOpenCodeDb(sessionId, messageIds) {
31641
31839
  try {
31642
31840
  withReadOnlySessionDb((db) => {
31643
31841
  const placeholders = messageIds.map(() => "?").join(",");
31644
- const rows = db.prepare(`SELECT id, time_created FROM message WHERE session_id = ? AND id IN (${placeholders})`).all(sessionId, ...messageIds);
31842
+ const rows = db.prepare(`SELECT id, time_created FROM message WHERE +session_id = ? AND id IN (${placeholders})`).all(sessionId, ...messageIds);
31645
31843
  for (const row of rows) {
31646
31844
  if (typeof row.id === "string" && typeof row.time_created === "number") {
31647
31845
  result.set(row.id, row.time_created);
@@ -31978,6 +32176,7 @@ __export(exports_read_session_chunk, {
31978
32176
  prepareRawSessionOrdinals: () => prepareRawSessionOrdinals,
31979
32177
  primeInMemoryTailRawMessageCache: () => primeInMemoryTailRawMessageCache,
31980
32178
  primeTailRawMessageCache: () => primeTailRawMessageCache,
32179
+ readRawSessionBoundaryEndpoints: () => readRawSessionBoundaryEndpoints,
31981
32180
  readRawSessionMessageById: () => readRawSessionMessageById,
31982
32181
  readRawSessionMessageIdOrdinals: () => readRawSessionMessageIdOrdinals,
31983
32182
  readRawSessionMessageIdOrdinalsForRange: () => readRawSessionMessageIdOrdinalsForRange,
@@ -32390,6 +32589,13 @@ function readRawSessionMessagePartsById(sessionId, messageId, onQuery) {
32390
32589
  return null;
32391
32590
  return withReadOnlySessionDb((db) => readRawSessionMessagePartsByIdFromDb(db, sessionId, messageId, onQuery));
32392
32591
  }
32592
+ function readRawSessionBoundaryEndpoints(sessionId, ids, blockIds) {
32593
+ if (sessionProviders.get(sessionId)?.provider)
32594
+ return null;
32595
+ if (!openCodeDbExists())
32596
+ return new Map(ids.map((id) => [id, null]));
32597
+ return withReadOnlySessionDb((db) => readRawSessionBoundaryEndpointsFromDb(db, sessionId, ids, blockIds));
32598
+ }
32393
32599
  function hasRawSessionMessageById(sessionId, messageId) {
32394
32600
  const provider = sessionProviders.get(sessionId)?.provider;
32395
32601
  if (provider?.hasMessageById)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cortexkit/magic-context",
3
- "version": "0.48.0",
3
+ "version": "0.49.0",
4
4
  "description": "Unified CLI for Magic Context — setup, doctor, and migration across OpenCode, Pi, and OMP",
5
5
  "keywords": [
6
6
  "opencode",