@cortexkit/pi-magic-context 0.44.0 → 0.44.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.
@@ -1,7 +1,8 @@
1
1
  import {
2
2
  getHarness,
3
+ harnessOwnsOpenCodeStore,
3
4
  log
4
- } from "./index-tfzybajk.js";
5
+ } from "./index-59dmj4zs.js";
5
6
 
6
7
  // ../plugin/src/features/magic-context/reclaim-protection.ts
7
8
  var CTX_REDUCE_KEEP = 3;
@@ -2441,7 +2442,7 @@ function closeQuietly(db) {
2441
2442
 
2442
2443
  // ../plugin/src/hooks/magic-context/read-session-db.ts
2443
2444
  function openCodeDbExists() {
2444
- return openCodeDbPathExists(resolveOpenCodeDbPath());
2445
+ return harnessOwnsOpenCodeStore() && openCodeDbPathExists(resolveOpenCodeDbPath());
2445
2446
  }
2446
2447
  var cachedReadOnlyDb = null;
2447
2448
  function closeCachedReadOnlyDb() {
@@ -2457,6 +2458,9 @@ function closeCachedReadOnlyDb() {
2457
2458
  }
2458
2459
  }
2459
2460
  function getReadOnlySessionDb() {
2461
+ if (!harnessOwnsOpenCodeStore()) {
2462
+ throw new Error("OpenCode session database is not readable from a Pi-compatible process; its history lives in Pi sessions");
2463
+ }
2460
2464
  const resolution = resolveOpenCodeDbPath();
2461
2465
  const dbPath = resolution.path;
2462
2466
  if (!openCodeDbPathExists(resolution)) {
@@ -2499,7 +2503,7 @@ function logProbeFailureOnce(resolution, error) {
2499
2503
  }
2500
2504
  function getMessageTimesFromOpenCodeDb(sessionId, messageIds) {
2501
2505
  const result = new Map;
2502
- if (messageIds.length === 0)
2506
+ if (messageIds.length === 0 || !harnessOwnsOpenCodeStore())
2503
2507
  return result;
2504
2508
  try {
2505
2509
  withReadOnlySessionDb((db) => {
@@ -2606,11 +2610,23 @@ function readRawSessionMessagesFromDb(db, sessionId) {
2606
2610
  });
2607
2611
  }
2608
2612
  function readRawSessionMessagePageFromDb(db, sessionId, afterOrdinal, limit, finalWatermark = Number.MAX_SAFE_INTEGER) {
2613
+ const messageRows = readRawMessagePageRows(db, sessionId, afterOrdinal, limit, finalWatermark);
2614
+ if (messageRows.length === 0)
2615
+ return [];
2616
+ const placeholders = messageRows.map(() => "?").join(", ");
2617
+ const partRows = db.prepare(`SELECT message_id, data, time_updated
2618
+ FROM part
2619
+ WHERE +session_id = ?
2620
+ AND likelihood(message_id IN (${placeholders}), 0.000001)
2621
+ ORDER BY message_id ASC, time_created ASC, id ASC`).all(sessionId, ...messageRows.map((row) => row.id)).filter(isRawPartRow);
2622
+ return assembleRawMessagePage(messageRows, partRows);
2623
+ }
2624
+ function readRawMessagePageRows(db, sessionId, afterOrdinal, limit, finalWatermark) {
2609
2625
  const remaining = Math.max(0, Math.floor(finalWatermark) - Math.floor(afterOrdinal));
2610
2626
  const pageSize = Math.min(Math.max(1, Math.floor(limit)), remaining);
2611
2627
  if (pageSize === 0)
2612
2628
  return [];
2613
- const messageRows = db.prepare(`SELECT id, data, time_created, time_updated
2629
+ return db.prepare(`SELECT id, data, time_created, time_updated
2614
2630
  FROM message
2615
2631
  WHERE session_id = ?
2616
2632
  AND NOT (
@@ -2626,14 +2642,8 @@ function readRawSessionMessagePageFromDb(db, sessionId, afterOrdinal, limit, fin
2626
2642
  ...row,
2627
2643
  ordinal: Math.floor(afterOrdinal) + index + 1
2628
2644
  }));
2629
- if (messageRows.length === 0)
2630
- return [];
2631
- const placeholders = messageRows.map(() => "?").join(", ");
2632
- const partRows = db.prepare(`SELECT message_id, data, time_updated
2633
- FROM part
2634
- WHERE +session_id = ?
2635
- AND likelihood(message_id IN (${placeholders}), 0.000001)
2636
- ORDER BY message_id ASC, time_created ASC, id ASC`).all(sessionId, ...messageRows.map((row) => row.id)).filter(isRawPartRow);
2645
+ }
2646
+ function assembleRawMessagePage(messageRows, partRows) {
2637
2647
  const partsByMessageId = new Map;
2638
2648
  for (const part of partRows) {
2639
2649
  const list = partsByMessageId.get(part.message_id) ?? [];
@@ -2652,6 +2662,49 @@ function readRawSessionMessagePageFromDb(db, sessionId, afterOrdinal, limit, fin
2652
2662
  };
2653
2663
  });
2654
2664
  }
2665
+ var RAW_SUMMARY_TEXT_MAX_CHARS = 8192;
2666
+ var RAW_SUMMARY_ARG_MAX_CHARS = 512;
2667
+ var RAW_SUMMARY_TOOL_INPUT_KEYS = [
2668
+ "description",
2669
+ "filePath",
2670
+ "path",
2671
+ "pattern",
2672
+ "query",
2673
+ "symbol",
2674
+ "module",
2675
+ "action"
2676
+ ];
2677
+ function summaryStringField(jsonPath) {
2678
+ return `CASE WHEN json_type(data, '${jsonPath}') = 'text' THEN substr(json_extract(data, '${jsonPath}'), 1, ${RAW_SUMMARY_ARG_MAX_CHARS}) END`;
2679
+ }
2680
+ var RAW_SUMMARY_PART_DATA_SQL = `CASE
2681
+ WHEN json_extract(data, '$.type') = 'text'
2682
+ THEN json_set(data, '$.text', substr(json_extract(data, '$.text'), 1, ${RAW_SUMMARY_TEXT_MAX_CHARS}))
2683
+ ELSE json_object(
2684
+ 'type', 'tool',
2685
+ 'tool', ${summaryStringField("$.tool")},
2686
+ 'callID', ${summaryStringField("$.callID")},
2687
+ 'state', json_object(
2688
+ 'status', ${summaryStringField("$.state.status")},
2689
+ 'input', json_object(${RAW_SUMMARY_TOOL_INPUT_KEYS.map((key) => `'${key}', ${summaryStringField(`$.state.input.${key}`)}`).join(", ")}),
2690
+ 'metadata', json_object('description', ${summaryStringField("$.state.metadata.description")})
2691
+ )
2692
+ )
2693
+ END`;
2694
+ function readRawSessionMessageSummaryPageFromDb(db, sessionId, afterOrdinal, limit, finalWatermark = Number.MAX_SAFE_INTEGER) {
2695
+ const messageRows = readRawMessagePageRows(db, sessionId, afterOrdinal, limit, finalWatermark);
2696
+ if (messageRows.length === 0)
2697
+ return [];
2698
+ const placeholders = messageRows.map(() => "?").join(", ");
2699
+ const partRows = db.prepare(`SELECT message_id, ${RAW_SUMMARY_PART_DATA_SQL} AS data, time_updated
2700
+ FROM part
2701
+ WHERE +session_id = ?
2702
+ AND likelihood(message_id IN (${placeholders}), 0.000001)
2703
+ AND json_valid(data) = 1
2704
+ AND json_extract(data, '$.type') IN ('text', 'tool')
2705
+ ORDER BY message_id ASC, time_created ASC, id ASC`).all(sessionId, ...messageRows.map((row) => row.id)).filter(isRawPartRow);
2706
+ return assembleRawMessagePage(messageRows, partRows);
2707
+ }
2655
2708
  function countRawSessionMessageOrdinalsFromDb(db, sessionId) {
2656
2709
  const row = db.prepare(`SELECT COUNT(*) AS count
2657
2710
  FROM message
@@ -4239,6 +4292,45 @@ function readRawSessionMessageRangeFromSource(sessionId, fromOrdinal, toOrdinal)
4239
4292
  }
4240
4293
  return messages;
4241
4294
  }
4295
+ var RAW_MESSAGE_VISIT_PAGE_SIZE = 50;
4296
+ function visitRawSessionMessages2(sessionId, fromOrdinal, toOrdinal, visit, options = {}) {
4297
+ const from = Math.max(1, Math.floor(fromOrdinal));
4298
+ const to = Math.floor(toOrdinal);
4299
+ if (to < from)
4300
+ return;
4301
+ const provider = sessionProviders.get(sessionId);
4302
+ if (provider && !provider.readMessagePage) {
4303
+ for (const message of provider.readMessages()) {
4304
+ if (message.ordinal < from || message.ordinal > to)
4305
+ continue;
4306
+ if (!visit(message))
4307
+ return;
4308
+ }
4309
+ return;
4310
+ }
4311
+ if (!provider && !openCodeDbExists())
4312
+ return;
4313
+ const pageSize = Math.max(1, Math.floor(options.pageSize ?? RAW_MESSAGE_VISIT_PAGE_SIZE));
4314
+ let afterOrdinal = from - 1;
4315
+ while (afterOrdinal < to) {
4316
+ const limit = Math.min(pageSize, to - afterOrdinal);
4317
+ const cursor = afterOrdinal;
4318
+ const page = provider?.readMessagePage ? provider.readMessagePage(cursor, limit, to) : withReadOnlySessionDb((db) => options.summary ? readRawSessionMessageSummaryPageFromDb(db, sessionId, cursor, limit, to) : readRawSessionMessagePageFromDb(db, sessionId, cursor, limit, to));
4319
+ if (page.length === 0)
4320
+ return;
4321
+ let nextOrdinal = afterOrdinal;
4322
+ for (const message of page) {
4323
+ if (message.ordinal < from || message.ordinal > to)
4324
+ continue;
4325
+ if (!visit(message))
4326
+ return;
4327
+ nextOrdinal = Math.max(nextOrdinal, message.ordinal);
4328
+ }
4329
+ if (nextOrdinal <= afterOrdinal)
4330
+ return;
4331
+ afterOrdinal = nextOrdinal;
4332
+ }
4333
+ }
4242
4334
  function readRawSessionMessageRange2(sessionId, fromOrdinal, toOrdinal) {
4243
4335
  const from = Math.max(1, Math.floor(fromOrdinal));
4244
4336
  const to = Math.floor(toOrdinal);
@@ -4777,4 +4869,4 @@ function readSessionChunk2(sessionId, tokenBudget, offset = 1, eligibleEndOrdina
4777
4869
  toolResultBoundaries
4778
4870
  };
4779
4871
  }
4780
- export { CTX_REDUCE_KEEP, newestCtxReduceTagNumbers, textMentionsRecentCommit, removeSystemReminders, hasMeaningfulUserText2, extractTexts2, extractToolCallSummaries, preloadTokenizer, estimateTokens, normalizeText, stripWellFormedLeadingTagPrefix, stripPersistedAssistantText, byteSize, stripTagPrefix, peelLeadingMcTagNotation, prependTag, isRecord, stableStringify, estimateImageTokensFromDataUrl, 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, updateTagByteSize, getRecentTagOwnerMessageIds, AGE_RECLAIM_MIN_TOKENS, getOldestActiveUnprotectedToolTags, getActiveToolTagsForAgeReclaim, getTriggerTagTokenUpperBound, updateTagInputByteSize, updateTagTokenCount, getPersistedToolTagAccounting, getAllStatusTagTokenTotalsFlat, updateTagInputTokenCount, tagTokenCountIsNull, backfillTagTokenCounts, insertTag, updateTagStatus, getInertWhitespaceAssistantTags, updateTagDropMode, updateCavemanDepth, hasPiFallbackMessageTags, findAdoptableFallbackTags, hasPiFallbackToolOwnerTags, findPiFallbackToolOwnerTags, adoptPiFallbackToolOwnerTag, adoptPiFallbackMessageTag, getMaxTagNumberBySession, getTagNumberByMessageId, getAssignableTagNumberByMessageId, deriveTagLoadFloor, TAG_SELECT_COLUMNS, getTagsBySession, getActiveTagsBySession, getTagsForPendingOperations, getTagsByNumbers, getDroppedTagsByNumbers, getMaxDroppedTagNumber, getToolTagNumberByOwner, getNullOwnerToolTag, adoptNullOwnerToolTag, retreatPastHostUnservedRows, resolveOpenCodeDbPath, hasV1MessageTables, assertOpenCodeStoreGeneration, openCodeDbPathExists, getOpenCodeDbProbeDescriptions, recordOpenCodeDbReadFailure, clearOpenCodeDbReadFailure, claimOpenCodeDbDiagnosticOnce, registerSlowWriteReporter, detectSqliteRuntime, Database, withPrivilegedWriter, closeQuietly, withReadOnlySessionDb, completedToolArcCrossesBoundary, estimateTrueRawMessageTokens, buildToolArcs, fenceBoundaryForCompletedToolArcs, fenceBoundaryForToolArcs, buildTrueRawTokenIndex, computeRawRangeFingerprint, invalidateTrueRawTokenCache, droppedInputMarker, createDroppedInputGuard, isEditTool, applyEditMarkerToInput, setDatabase, loadToolDefinitionMeasurements, resolveDecisionCalibration, providerMass, localBudget, calibrationForModelKey, historyLocalBudget, SKELETON_REAL_INPUT_MAX_BYTES, toolInputStringBytes, resolveHostServedBoundaryId2, hasRawMessageProvider2, setRawMessageProvider2, withRawMessageProvider2, cleanUserText2, withRawSessionMessageCache2, readRawSessionMessages2, readRawSessionMessagePage2, getRawSessionMessageOrdinalCount2, readRawSessionMessageRange2, primeTailRawMessageCache2, getCachedAbsoluteMessageCount2, primeInMemoryTailRawMessageCache2, readRawSessionMessageIdOrdinalsForRange2, hasRawSessionMessageById2, readRawSessionMessageOrdinalById2, compareRawSessionMessageOrder2, getRawSessionMessageCount2, getRawSessionTagKeysThrough2, getLegacyProtectedTailStartOrdinal2, readSessionChunk2 };
4872
+ export { CTX_REDUCE_KEEP, newestCtxReduceTagNumbers, textMentionsRecentCommit, removeSystemReminders, hasMeaningfulUserText2, extractTexts2, extractToolCallSummaries, preloadTokenizer, estimateTokens, normalizeText, stripWellFormedLeadingTagPrefix, stripPersistedAssistantText, byteSize, stripTagPrefix, peelLeadingMcTagNotation, prependTag, isRecord, stableStringify, estimateImageTokensFromDataUrl, 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, updateTagByteSize, getRecentTagOwnerMessageIds, AGE_RECLAIM_MIN_TOKENS, getOldestActiveUnprotectedToolTags, getActiveToolTagsForAgeReclaim, getTriggerTagTokenUpperBound, updateTagInputByteSize, updateTagTokenCount, getPersistedToolTagAccounting, getAllStatusTagTokenTotalsFlat, updateTagInputTokenCount, tagTokenCountIsNull, backfillTagTokenCounts, insertTag, updateTagStatus, getInertWhitespaceAssistantTags, updateTagDropMode, updateCavemanDepth, hasPiFallbackMessageTags, findAdoptableFallbackTags, hasPiFallbackToolOwnerTags, findPiFallbackToolOwnerTags, adoptPiFallbackToolOwnerTag, adoptPiFallbackMessageTag, getMaxTagNumberBySession, getTagNumberByMessageId, getAssignableTagNumberByMessageId, deriveTagLoadFloor, TAG_SELECT_COLUMNS, getTagsBySession, getActiveTagsBySession, getTagsForPendingOperations, getTagsByNumbers, getDroppedTagsByNumbers, getMaxDroppedTagNumber, getToolTagNumberByOwner, getNullOwnerToolTag, adoptNullOwnerToolTag, retreatPastHostUnservedRows, resolveOpenCodeDbPath, hasV1MessageTables, assertOpenCodeStoreGeneration, openCodeDbPathExists, getOpenCodeDbProbeDescriptions, recordOpenCodeDbReadFailure, clearOpenCodeDbReadFailure, claimOpenCodeDbDiagnosticOnce, registerSlowWriteReporter, detectSqliteRuntime, Database, withPrivilegedWriter, closeQuietly, withReadOnlySessionDb, RAW_SUMMARY_TEXT_MAX_CHARS, completedToolArcCrossesBoundary, estimateTrueRawMessageTokens, buildToolArcs, fenceBoundaryForCompletedToolArcs, fenceBoundaryForToolArcs, buildTrueRawTokenIndex, computeRawRangeFingerprint, invalidateTrueRawTokenCache, droppedInputMarker, createDroppedInputGuard, isEditTool, applyEditMarkerToInput, setDatabase, loadToolDefinitionMeasurements, resolveDecisionCalibration, providerMass, localBudget, calibrationForModelKey, historyLocalBudget, SKELETON_REAL_INPUT_MAX_BYTES, toolInputStringBytes, resolveHostServedBoundaryId2, hasRawMessageProvider2, setRawMessageProvider2, withRawMessageProvider2, cleanUserText2, withRawSessionMessageCache2, readRawSessionMessages2, readRawSessionMessagePage2, getRawSessionMessageOrdinalCount2, visitRawSessionMessages2, readRawSessionMessageRange2, primeTailRawMessageCache2, getCachedAbsoluteMessageCount2, primeInMemoryTailRawMessageCache2, readRawSessionMessageIdOrdinalsForRange2, hasRawSessionMessageById2, readRawSessionMessageOrdinalById2, compareRawSessionMessageOrder2, getRawSessionMessageCount2, getRawSessionTagKeysThrough2, getLegacyProtectedTailStartOrdinal2, readSessionChunk2 };