@cortexkit/pi-magic-context 0.21.6 → 0.21.8

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.
@@ -8909,6 +8909,65 @@ var MIGRATIONS = [
8909
8909
  db.exec("ALTER TABLE session_meta ADD COLUMN pending_pi_compaction_marker_state TEXT");
8910
8910
  }
8911
8911
  }
8912
+ },
8913
+ {
8914
+ version: 19,
8915
+ description: "Add compartment state lease table",
8916
+ up: (db) => {
8917
+ db.exec(`
8918
+ CREATE TABLE IF NOT EXISTS compartment_state_lease (
8919
+ session_id TEXT PRIMARY KEY NOT NULL,
8920
+ holder_id TEXT NOT NULL,
8921
+ acquired_at INTEGER NOT NULL,
8922
+ expires_at INTEGER NOT NULL
8923
+ );
8924
+ CREATE INDEX IF NOT EXISTS idx_compartment_state_lease_expires
8925
+ ON compartment_state_lease(expires_at);
8926
+ `);
8927
+ }
8928
+ },
8929
+ {
8930
+ version: 20,
8931
+ description: "Add subagent invocation token accounting",
8932
+ up: (db) => {
8933
+ db.exec(`
8934
+ CREATE TABLE IF NOT EXISTS subagent_invocations (
8935
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
8936
+ session_id TEXT NOT NULL,
8937
+ harness TEXT NOT NULL,
8938
+ subagent TEXT NOT NULL,
8939
+ task TEXT,
8940
+ provider_id TEXT,
8941
+ model_id TEXT,
8942
+ started_at INTEGER NOT NULL,
8943
+ ended_at INTEGER,
8944
+ status TEXT NOT NULL,
8945
+ input_tokens INTEGER NOT NULL DEFAULT 0,
8946
+ output_tokens INTEGER NOT NULL DEFAULT 0,
8947
+ cache_read_tokens INTEGER NOT NULL DEFAULT 0,
8948
+ cache_write_tokens INTEGER NOT NULL DEFAULT 0,
8949
+ error TEXT,
8950
+ parent_invocation_id INTEGER
8951
+ );
8952
+ CREATE INDEX IF NOT EXISTS idx_sai_session_started
8953
+ ON subagent_invocations(session_id, started_at DESC);
8954
+ CREATE INDEX IF NOT EXISTS idx_sai_subagent
8955
+ ON subagent_invocations(subagent, started_at DESC);
8956
+ `);
8957
+ }
8958
+ },
8959
+ {
8960
+ version: 21,
8961
+ description: "Add session lifetime work metrics",
8962
+ up: (db) => {
8963
+ const cols = db.prepare("PRAGMA table_info(session_meta)").all();
8964
+ if (!cols.some((c) => c.name === "new_work_tokens")) {
8965
+ db.exec("ALTER TABLE session_meta ADD COLUMN new_work_tokens INTEGER NOT NULL DEFAULT 0");
8966
+ }
8967
+ if (!cols.some((c) => c.name === "total_input_tokens")) {
8968
+ db.exec("ALTER TABLE session_meta ADD COLUMN total_input_tokens INTEGER NOT NULL DEFAULT 0");
8969
+ }
8970
+ }
8912
8971
  }
8913
8972
  ];
8914
8973
  function ensureMigrationsTable(db) {
@@ -141956,6 +142015,15 @@ function initializeDatabase(db) {
141956
142015
  );
141957
142016
  CREATE INDEX IF NOT EXISTS idx_compartments_session ON compartments(session_id);
141958
142017
 
142018
+ CREATE TABLE IF NOT EXISTS compartment_state_lease (
142019
+ session_id TEXT PRIMARY KEY NOT NULL,
142020
+ holder_id TEXT NOT NULL,
142021
+ acquired_at INTEGER NOT NULL,
142022
+ expires_at INTEGER NOT NULL
142023
+ );
142024
+ CREATE INDEX IF NOT EXISTS idx_compartment_state_lease_expires
142025
+ ON compartment_state_lease(expires_at);
142026
+
141959
142027
  CREATE TABLE IF NOT EXISTS compression_depth (
141960
142028
  session_id TEXT NOT NULL,
141961
142029
  message_ordinal INTEGER NOT NULL,
@@ -142152,12 +142220,37 @@ CREATE INDEX IF NOT EXISTS idx_dream_queue_pending ON dream_queue(started_at, en
142152
142220
  -- is a valid JSON blob written via setPendingPiCompactionMarkerState.
142153
142221
  -- Excluded from healNullTextColumns.
142154
142222
  pending_pi_compaction_marker_state TEXT,
142223
+ new_work_tokens INTEGER NOT NULL DEFAULT 0,
142224
+ total_input_tokens INTEGER NOT NULL DEFAULT 0,
142155
142225
  -- deferred_execute_state: intentionally NULLABLE without a default.
142156
142226
  -- Absence is SQL NULL; presence is a JSON blob written via
142157
142227
  -- setDeferredExecutePendingIfAbsent. Excluded from healNullTextColumns.
142158
142228
  deferred_execute_state TEXT
142159
142229
  );
142160
142230
 
142231
+ CREATE TABLE IF NOT EXISTS subagent_invocations (
142232
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
142233
+ session_id TEXT NOT NULL,
142234
+ harness TEXT NOT NULL,
142235
+ subagent TEXT NOT NULL,
142236
+ task TEXT,
142237
+ provider_id TEXT,
142238
+ model_id TEXT,
142239
+ started_at INTEGER NOT NULL,
142240
+ ended_at INTEGER,
142241
+ status TEXT NOT NULL,
142242
+ input_tokens INTEGER NOT NULL DEFAULT 0,
142243
+ output_tokens INTEGER NOT NULL DEFAULT 0,
142244
+ cache_read_tokens INTEGER NOT NULL DEFAULT 0,
142245
+ cache_write_tokens INTEGER NOT NULL DEFAULT 0,
142246
+ error TEXT,
142247
+ parent_invocation_id INTEGER
142248
+ );
142249
+ CREATE INDEX IF NOT EXISTS idx_sai_session_started
142250
+ ON subagent_invocations(session_id, started_at DESC);
142251
+ CREATE INDEX IF NOT EXISTS idx_sai_subagent
142252
+ ON subagent_invocations(subagent, started_at DESC);
142253
+
142161
142254
  CREATE INDEX IF NOT EXISTS idx_tags_session_tag_number ON tags(session_id, tag_number);
142162
142255
  CREATE INDEX IF NOT EXISTS idx_tags_session_message_id ON tags(session_id, message_id);
142163
142256
  CREATE INDEX IF NOT EXISTS idx_pending_ops_session ON pending_ops(session_id);
@@ -142249,6 +142342,8 @@ CREATE INDEX IF NOT EXISTS idx_dream_queue_pending ON dream_queue(started_at, en
142249
142342
  ensureColumn(db, "session_meta", "needs_emergency_recovery", "INTEGER DEFAULT 0");
142250
142343
  ensureColumn(db, "session_meta", "pending_compaction_marker_state", "TEXT");
142251
142344
  ensureColumn(db, "session_meta", "pending_pi_compaction_marker_state", "TEXT");
142345
+ ensureColumn(db, "session_meta", "new_work_tokens", "INTEGER NOT NULL DEFAULT 0");
142346
+ ensureColumn(db, "session_meta", "total_input_tokens", "INTEGER NOT NULL DEFAULT 0");
142252
142347
  ensureColumn(db, "session_meta", "deferred_execute_state", "TEXT");
142253
142348
  ensureColumn(db, "tags", "harness", "TEXT NOT NULL DEFAULT 'opencode'");
142254
142349
  ensureColumn(db, "pending_ops", "harness", "TEXT NOT NULL DEFAULT 'opencode'");
@@ -142312,7 +142407,9 @@ function healNullIntegerColumns(db) {
142312
142407
  ["tool_call_tokens", 0],
142313
142408
  ["note_nudge_trigger_pending", 0],
142314
142409
  ["observed_safe_input_tokens", 0],
142315
- ["cache_alert_sent", 0]
142410
+ ["cache_alert_sent", 0],
142411
+ ["new_work_tokens", 0],
142412
+ ["total_input_tokens", 0]
142316
142413
  ];
142317
142414
  for (const [column, fallback] of columns) {
142318
142415
  try {
@@ -142384,6 +142481,56 @@ import { existsSync as existsSync6, readFileSync as readFileSync3 } from "node:f
142384
142481
  import { homedir as homedir3 } from "node:os";
142385
142482
  import { join as join6 } from "node:path";
142386
142483
 
142484
+ // ../plugin/src/config/agent-disable.ts
142485
+ function isDreamerRunnable(config) {
142486
+ return !!config.dreamer && config.dreamer.disable !== true;
142487
+ }
142488
+ function clonePlainObject(value) {
142489
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
142490
+ return;
142491
+ }
142492
+ return { ...value };
142493
+ }
142494
+ function migrateLegacyEnabledForAgent(args) {
142495
+ const agent = clonePlainObject(args.patched[args.agentName]);
142496
+ if (!agent || !("enabled" in agent))
142497
+ return;
142498
+ const enabled = agent.enabled;
142499
+ const disable = agent.disable;
142500
+ delete agent.enabled;
142501
+ if (args.agentName === "historian") {
142502
+ args.warnings.push('Removed invalid "historian.enabled" in-memory (run doctor to persist).');
142503
+ args.patched.historian = agent;
142504
+ return;
142505
+ }
142506
+ if (args.agentName === "dreamer") {
142507
+ if (disable !== true && enabled === false) {
142508
+ agent.disable = true;
142509
+ args.warnings.push('Migrated "dreamer.enabled=false" → "dreamer.disable=true" in-memory (run doctor to persist). This now also disables manual /ctx-dream; for manual-only remove disable and set schedule="".');
142510
+ }
142511
+ args.patched.dreamer = agent;
142512
+ return;
142513
+ }
142514
+ if (disable !== true && enabled === false) {
142515
+ agent.disable = true;
142516
+ args.warnings.push('Migrated "sidekick.enabled=false" → "sidekick.disable=true" in-memory (run doctor to persist).');
142517
+ }
142518
+ args.patched.sidekick = agent;
142519
+ }
142520
+ function migrateLegacyAgentEnabledInMemory(rawConfig, warnings) {
142521
+ const shouldPatch = ["dreamer", "sidekick", "historian"].some((key) => {
142522
+ const agent = rawConfig[key];
142523
+ return typeof agent === "object" && agent !== null && !Array.isArray(agent) && "enabled" in agent;
142524
+ });
142525
+ if (!shouldPatch)
142526
+ return rawConfig;
142527
+ const patched = { ...rawConfig };
142528
+ migrateLegacyEnabledForAgent({ patched, agentName: "dreamer", warnings });
142529
+ migrateLegacyEnabledForAgent({ patched, agentName: "sidekick", warnings });
142530
+ migrateLegacyEnabledForAgent({ patched, agentName: "historian", warnings });
142531
+ return patched;
142532
+ }
142533
+
142387
142534
  // ../../node_modules/.bun/zod@4.4.3/node_modules/zod/v4/classic/external.js
142388
142535
  var exports_external = {};
142389
142536
  __export(exports_external, {
@@ -156723,7 +156870,6 @@ var DEFAULT_DREAMER_TASKS = [
156723
156870
  ];
156724
156871
  var PiThinkingLevelSchema = exports_external.enum(["off", "minimal", "low", "medium", "high", "xhigh"]).optional();
156725
156872
  var DreamerConfigSchema = AgentOverrideConfigSchema.merge(exports_external.object({
156726
- enabled: exports_external.boolean().default(false),
156727
156873
  schedule: exports_external.string().default("02:00-06:00"),
156728
156874
  max_runtime_minutes: exports_external.number().min(10).default(120),
156729
156875
  tasks: exports_external.array(DreamingTaskSchema).default(DEFAULT_DREAMER_TASKS),
@@ -156741,7 +156887,6 @@ var DreamerConfigSchema = AgentOverrideConfigSchema.merge(exports_external.objec
156741
156887
  thinking_level: PiThinkingLevelSchema
156742
156888
  }));
156743
156889
  var SidekickConfigSchema = AgentOverrideConfigSchema.extend({
156744
- enabled: exports_external.boolean().default(false),
156745
156890
  timeout_ms: exports_external.number().default(30000),
156746
156891
  system_prompt: exports_external.string().optional(),
156747
156892
  thinking_level: PiThinkingLevelSchema
@@ -157131,9 +157276,11 @@ function mergeRawConfigs(base, override) {
157131
157276
  return merged;
157132
157277
  }
157133
157278
  function parsePiConfig(rawConfig, recoveredTopLevelKeys = []) {
157134
- const parsed = MagicContextConfigSchema.safeParse(rawConfig);
157279
+ const preMigrationWarnings = [];
157280
+ const migrated = migrateLegacyAgentEnabledInMemory(rawConfig, preMigrationWarnings);
157281
+ const parsed = MagicContextConfigSchema.safeParse(migrated);
157135
157282
  if (parsed.success) {
157136
- return { config: parsed.data, warnings: [] };
157283
+ return { config: parsed.data, warnings: preMigrationWarnings };
157137
157284
  }
157138
157285
  const defaults = MagicContextConfigSchema.parse({});
157139
157286
  const errorPaths = new Set;
@@ -157143,8 +157290,8 @@ function parsePiConfig(rawConfig, recoveredTopLevelKeys = []) {
157143
157290
  errorPaths.add(String(topKey));
157144
157291
  }
157145
157292
  }
157146
- const patched = { ...rawConfig };
157147
- const warnings = [];
157293
+ const patched = { ...migrated };
157294
+ const warnings = [...preMigrationWarnings];
157148
157295
  for (const key of errorPaths) {
157149
157296
  recoveredTopLevelKeys.push(key);
157150
157297
  const isAgentConfig = key === "historian" || key === "dreamer" || key === "sidekick";
@@ -163148,7 +163295,7 @@ function convertEntriesToRawMessages(entries) {
163148
163295
  if (pendingToolParts.length > 0) {
163149
163296
  result.push({
163150
163297
  ordinal: nextOrdinal++,
163151
- id: pendingFirstRealId,
163298
+ id: `synth-user-${pendingFirstRealId}`,
163152
163299
  role: "user",
163153
163300
  parts: pendingToolParts
163154
163301
  });
@@ -163173,7 +163320,7 @@ function convertEntriesToRawMessages(entries) {
163173
163320
  if (pendingToolParts.length > 0) {
163174
163321
  result.push({
163175
163322
  ordinal: nextOrdinal,
163176
- id: pendingFirstRealId,
163323
+ id: `synth-user-${pendingFirstRealId}`,
163177
163324
  role: "user",
163178
163325
  parts: pendingToolParts
163179
163326
  });
@@ -163325,6 +163472,99 @@ function createCtxExpandTool(_deps) {
163325
163472
  }
163326
163473
  };
163327
163474
  }
163475
+ // ../plugin/src/features/magic-context/compartment-lease.ts
163476
+ var COMPARTMENT_LEASE_TTL_MS = 5 * 60 * 1000;
163477
+ var COMPARTMENT_LEASE_RENEWAL_MS = 60 * 1000;
163478
+ function acquireCompartmentLease(db, sessionId, holderId) {
163479
+ const acquiredAt = Date.now();
163480
+ const expiresAt = acquiredAt + COMPARTMENT_LEASE_TTL_MS;
163481
+ const result = db.prepare(`INSERT INTO compartment_state_lease (session_id, holder_id, acquired_at, expires_at)
163482
+ VALUES (?, ?, ?, ?)
163483
+ ON CONFLICT(session_id) DO UPDATE SET
163484
+ holder_id = excluded.holder_id,
163485
+ acquired_at = excluded.acquired_at,
163486
+ expires_at = excluded.expires_at
163487
+ WHERE compartment_state_lease.holder_id = excluded.holder_id
163488
+ OR compartment_state_lease.expires_at <= ?`).run(sessionId, holderId, acquiredAt, expiresAt, acquiredAt);
163489
+ if (result.changes !== 1) {
163490
+ return null;
163491
+ }
163492
+ return { sessionId, holderId, acquiredAt, expiresAt };
163493
+ }
163494
+ function renewCompartmentLease(db, sessionId, holderId) {
163495
+ const now = Date.now();
163496
+ const expiresAt = now + COMPARTMENT_LEASE_TTL_MS;
163497
+ const result = db.prepare(`UPDATE compartment_state_lease
163498
+ SET expires_at = ?, acquired_at = ?
163499
+ WHERE session_id = ? AND holder_id = ? AND expires_at > ?`).run(expiresAt, now, sessionId, holderId, now);
163500
+ return result.changes === 1;
163501
+ }
163502
+ function releaseCompartmentLease(db, sessionId, holderId) {
163503
+ db.prepare("DELETE FROM compartment_state_lease WHERE session_id = ? AND holder_id = ?").run(sessionId, holderId);
163504
+ }
163505
+ function isCompartmentLeaseHeld(db, sessionId, holderId) {
163506
+ const row = db.prepare("SELECT 1 FROM compartment_state_lease WHERE session_id = ? AND holder_id = ? AND expires_at > ?").get(sessionId, holderId, Date.now());
163507
+ return row != null;
163508
+ }
163509
+
163510
+ // ../plugin/src/features/magic-context/compression-depth-storage.ts
163511
+ var incrementDepthStatements = new WeakMap;
163512
+ var totalDepthStatements = new WeakMap;
163513
+ var maxDepthStatements = new WeakMap;
163514
+ var clearDepthStatements = new WeakMap;
163515
+ function getIncrementDepthStatement(db) {
163516
+ let stmt = incrementDepthStatements.get(db);
163517
+ if (!stmt) {
163518
+ stmt = db.prepare("INSERT INTO compression_depth (session_id, message_ordinal, depth, harness) VALUES (?, ?, 1, ?) ON CONFLICT(session_id, message_ordinal) DO UPDATE SET depth = depth + 1");
163519
+ incrementDepthStatements.set(db, stmt);
163520
+ }
163521
+ return stmt;
163522
+ }
163523
+ function getTotalDepthStatement(db) {
163524
+ let stmt = totalDepthStatements.get(db);
163525
+ if (!stmt) {
163526
+ stmt = db.prepare("SELECT COALESCE(SUM(depth), 0) AS total_depth FROM compression_depth WHERE session_id = ? AND message_ordinal BETWEEN ? AND ?");
163527
+ totalDepthStatements.set(db, stmt);
163528
+ }
163529
+ return stmt;
163530
+ }
163531
+ function getClearDepthStatement(db) {
163532
+ let stmt = clearDepthStatements.get(db);
163533
+ if (!stmt) {
163534
+ stmt = db.prepare("DELETE FROM compression_depth WHERE session_id = ?");
163535
+ clearDepthStatements.set(db, stmt);
163536
+ }
163537
+ return stmt;
163538
+ }
163539
+ function incrementCompressionDepth(db, sessionId, startOrdinal, endOrdinal) {
163540
+ if (endOrdinal < startOrdinal) {
163541
+ return;
163542
+ }
163543
+ db.transaction(() => {
163544
+ const stmt = getIncrementDepthStatement(db);
163545
+ for (let ordinal = startOrdinal;ordinal <= endOrdinal; ordinal += 1) {
163546
+ stmt.run(sessionId, ordinal, getHarness());
163547
+ }
163548
+ })();
163549
+ }
163550
+ function getAverageCompressionDepth(db, sessionId, startOrdinal, endOrdinal) {
163551
+ if (endOrdinal < startOrdinal) {
163552
+ return 0;
163553
+ }
163554
+ const row = getTotalDepthStatement(db).get(sessionId, startOrdinal, endOrdinal);
163555
+ const totalDepth = typeof row?.total_depth === "number" ? row.total_depth : 0;
163556
+ const messageCount = endOrdinal - startOrdinal + 1;
163557
+ return totalDepth / messageCount;
163558
+ }
163559
+ function clearCompressionDepth(db, sessionId) {
163560
+ getClearDepthStatement(db).run(sessionId);
163561
+ }
163562
+ function clearCompressionDepthRange(db, sessionId, startOrdinal, endOrdinal) {
163563
+ if (endOrdinal < startOrdinal) {
163564
+ return;
163565
+ }
163566
+ db.prepare("DELETE FROM compression_depth WHERE session_id = ? AND message_ordinal BETWEEN ? AND ?").run(sessionId, startOrdinal, endOrdinal);
163567
+ }
163328
163568
 
163329
163569
  // ../plugin/src/features/magic-context/compartment-storage.ts
163330
163570
  var insertCompartmentStatements = new WeakMap;
@@ -163435,6 +163675,38 @@ function replaceAllCompartmentState(db, sessionId, compartments, facts) {
163435
163675
  db.prepare("UPDATE session_meta SET memory_block_cache = '', memory_block_ids = '' WHERE session_id = ?").run(sessionId);
163436
163676
  })();
163437
163677
  }
163678
+ function replaceAllCompartmentStateAndBumpDepth(db, holderId, sessionId, compartments, facts, depthStartOrdinal, depthEndOrdinal) {
163679
+ const now = Date.now();
163680
+ db.exec("BEGIN IMMEDIATE");
163681
+ let finished = false;
163682
+ try {
163683
+ if (!isCompartmentLeaseHeld(db, sessionId, holderId)) {
163684
+ db.exec("ROLLBACK");
163685
+ finished = true;
163686
+ return false;
163687
+ }
163688
+ db.prepare("DELETE FROM compartments WHERE session_id = ?").run(sessionId);
163689
+ db.prepare("DELETE FROM session_facts WHERE session_id = ?").run(sessionId);
163690
+ insertCompartmentRows(db, sessionId, compartments, now);
163691
+ insertFactRows(db, sessionId, facts, now);
163692
+ db.prepare("UPDATE session_meta SET memory_block_cache = '', memory_block_ids = '' WHERE session_id = ?").run(sessionId);
163693
+ if (depthEndOrdinal >= depthStartOrdinal) {
163694
+ const stmt = getIncrementDepthStatement(db);
163695
+ for (let ordinal = depthStartOrdinal;ordinal <= depthEndOrdinal; ordinal += 1) {
163696
+ stmt.run(sessionId, ordinal, getHarness());
163697
+ }
163698
+ }
163699
+ db.exec("COMMIT");
163700
+ finished = true;
163701
+ return true;
163702
+ } finally {
163703
+ if (!finished) {
163704
+ try {
163705
+ db.exec("ROLLBACK");
163706
+ } catch {}
163707
+ }
163708
+ }
163709
+ }
163438
163710
  function buildCompartmentBlock(compartments, facts, memoryBlock, dateRanges) {
163439
163711
  const lines = [];
163440
163712
  if (memoryBlock) {
@@ -163502,12 +163774,37 @@ function getRecompStaging(db, sessionId) {
163502
163774
  lastEndMessage: lastEnd
163503
163775
  };
163504
163776
  }
163505
- function promoteRecompStaging(db, sessionId) {
163777
+ function promoteRecompStaging(db, sessionId, holderId) {
163506
163778
  const now = Date.now();
163507
- return db.transaction(() => {
163779
+ if (!holderId) {
163780
+ return db.transaction(() => {
163781
+ const staging = getRecompStaging(db, sessionId);
163782
+ if (!staging || staging.compartments.length === 0)
163783
+ return null;
163784
+ db.prepare("DELETE FROM compartments WHERE session_id = ?").run(sessionId);
163785
+ db.prepare("DELETE FROM session_facts WHERE session_id = ?").run(sessionId);
163786
+ insertCompartmentRows(db, sessionId, staging.compartments, now);
163787
+ insertFactRows(db, sessionId, staging.facts, now);
163788
+ db.prepare("DELETE FROM recomp_compartments WHERE session_id = ?").run(sessionId);
163789
+ db.prepare("DELETE FROM recomp_facts WHERE session_id = ?").run(sessionId);
163790
+ db.prepare("UPDATE session_meta SET memory_block_cache = '', memory_block_ids = '' WHERE session_id = ?").run(sessionId);
163791
+ return { compartments: staging.compartments, facts: staging.facts };
163792
+ })();
163793
+ }
163794
+ db.exec("BEGIN IMMEDIATE");
163795
+ let finished = false;
163796
+ try {
163797
+ if (!isCompartmentLeaseHeld(db, sessionId, holderId)) {
163798
+ db.exec("ROLLBACK");
163799
+ finished = true;
163800
+ return null;
163801
+ }
163508
163802
  const staging = getRecompStaging(db, sessionId);
163509
- if (!staging || staging.compartments.length === 0)
163803
+ if (!staging || staging.compartments.length === 0) {
163804
+ db.exec("ROLLBACK");
163805
+ finished = true;
163510
163806
  return null;
163807
+ }
163511
163808
  db.prepare("DELETE FROM compartments WHERE session_id = ?").run(sessionId);
163512
163809
  db.prepare("DELETE FROM session_facts WHERE session_id = ?").run(sessionId);
163513
163810
  insertCompartmentRows(db, sessionId, staging.compartments, now);
@@ -163515,8 +163812,16 @@ function promoteRecompStaging(db, sessionId) {
163515
163812
  db.prepare("DELETE FROM recomp_compartments WHERE session_id = ?").run(sessionId);
163516
163813
  db.prepare("DELETE FROM recomp_facts WHERE session_id = ?").run(sessionId);
163517
163814
  db.prepare("UPDATE session_meta SET memory_block_cache = '', memory_block_ids = '' WHERE session_id = ?").run(sessionId);
163815
+ db.exec("COMMIT");
163816
+ finished = true;
163518
163817
  return { compartments: staging.compartments, facts: staging.facts };
163519
- })();
163818
+ } finally {
163819
+ if (!finished) {
163820
+ try {
163821
+ db.exec("ROLLBACK");
163822
+ } catch {}
163823
+ }
163824
+ }
163520
163825
  }
163521
163826
  function invalidateAllMemoryBlockCaches(db) {
163522
163827
  try {
@@ -164376,64 +164681,6 @@ function createCtxMemoryTool(deps) {
164376
164681
  }
164377
164682
  };
164378
164683
  }
164379
- // ../plugin/src/features/magic-context/compression-depth-storage.ts
164380
- var incrementDepthStatements = new WeakMap;
164381
- var totalDepthStatements = new WeakMap;
164382
- var maxDepthStatements = new WeakMap;
164383
- var clearDepthStatements = new WeakMap;
164384
- function getIncrementDepthStatement(db) {
164385
- let stmt = incrementDepthStatements.get(db);
164386
- if (!stmt) {
164387
- stmt = db.prepare("INSERT INTO compression_depth (session_id, message_ordinal, depth, harness) VALUES (?, ?, 1, ?) ON CONFLICT(session_id, message_ordinal) DO UPDATE SET depth = depth + 1");
164388
- incrementDepthStatements.set(db, stmt);
164389
- }
164390
- return stmt;
164391
- }
164392
- function getTotalDepthStatement(db) {
164393
- let stmt = totalDepthStatements.get(db);
164394
- if (!stmt) {
164395
- stmt = db.prepare("SELECT COALESCE(SUM(depth), 0) AS total_depth FROM compression_depth WHERE session_id = ? AND message_ordinal BETWEEN ? AND ?");
164396
- totalDepthStatements.set(db, stmt);
164397
- }
164398
- return stmt;
164399
- }
164400
- function getClearDepthStatement(db) {
164401
- let stmt = clearDepthStatements.get(db);
164402
- if (!stmt) {
164403
- stmt = db.prepare("DELETE FROM compression_depth WHERE session_id = ?");
164404
- clearDepthStatements.set(db, stmt);
164405
- }
164406
- return stmt;
164407
- }
164408
- function incrementCompressionDepth(db, sessionId, startOrdinal, endOrdinal) {
164409
- if (endOrdinal < startOrdinal) {
164410
- return;
164411
- }
164412
- db.transaction(() => {
164413
- const stmt = getIncrementDepthStatement(db);
164414
- for (let ordinal = startOrdinal;ordinal <= endOrdinal; ordinal += 1) {
164415
- stmt.run(sessionId, ordinal, getHarness());
164416
- }
164417
- })();
164418
- }
164419
- function getAverageCompressionDepth(db, sessionId, startOrdinal, endOrdinal) {
164420
- if (endOrdinal < startOrdinal) {
164421
- return 0;
164422
- }
164423
- const row = getTotalDepthStatement(db).get(sessionId, startOrdinal, endOrdinal);
164424
- const totalDepth = typeof row?.total_depth === "number" ? row.total_depth : 0;
164425
- const messageCount = endOrdinal - startOrdinal + 1;
164426
- return totalDepth / messageCount;
164427
- }
164428
- function clearCompressionDepth(db, sessionId) {
164429
- getClearDepthStatement(db).run(sessionId);
164430
- }
164431
- function clearCompressionDepthRange(db, sessionId, startOrdinal, endOrdinal) {
164432
- if (endOrdinal < startOrdinal) {
164433
- return;
164434
- }
164435
- db.prepare("DELETE FROM compression_depth WHERE session_id = ? AND message_ordinal BETWEEN ? AND ?").run(sessionId, startOrdinal, endOrdinal);
164436
- }
164437
164684
  // ../plugin/src/features/magic-context/message-index.ts
164438
164685
  var lastIndexedStatements = new WeakMap;
164439
164686
  var insertMessageStatements = new WeakMap;
@@ -165077,6 +165324,7 @@ function getPendingPiCompactionMarkerState(db, sessionId) {
165077
165324
  return parsed;
165078
165325
  }
165079
165326
  } catch {}
165327
+ db.prepare("UPDATE session_meta SET pending_pi_compaction_marker_state = NULL WHERE session_id = ? AND pending_pi_compaction_marker_state = ?").run(sessionId, raw);
165080
165328
  return null;
165081
165329
  }
165082
165330
  function setPendingPiCompactionMarkerState(db, sessionId, state) {
@@ -165120,6 +165368,12 @@ function clearDeferredExecutePendingIfMatches(db, sessionId, expected) {
165120
165368
  WHERE session_id = ? AND deferred_execute_state = ?`).run(sessionId, expectedBlob);
165121
165369
  return result.changes > 0;
165122
165370
  }
165371
+ function setSessionWorkMetrics(db, sessionId, newWorkTokens, totalInputTokens) {
165372
+ ensureSessionMetaRow(db, sessionId);
165373
+ db.prepare(`UPDATE session_meta
165374
+ SET new_work_tokens = ?, total_input_tokens = ?
165375
+ WHERE session_id = ?`).run(Math.max(0, Math.floor(newWorkTokens)), Math.max(0, Math.floor(totalInputTokens)), sessionId);
165376
+ }
165123
165377
  // ../plugin/src/features/magic-context/resolve-subagent-fallback.ts
165124
165378
  init_logger();
165125
165379
  await init_read_session_db();
@@ -165435,6 +165689,19 @@ function getSourceContents(db, sessionId, tagIds) {
165435
165689
  }
165436
165690
  return sources;
165437
165691
  }
165692
+ // ../plugin/src/features/magic-context/storage-subagent-invocations.ts
165693
+ function clampToken(value) {
165694
+ return Number.isFinite(value) && value > 0 ? Math.floor(value) : 0;
165695
+ }
165696
+ function recordSubagentInvocation(db, input) {
165697
+ const result = db.prepare(`INSERT INTO subagent_invocations (
165698
+ session_id, harness, subagent, task, provider_id, model_id,
165699
+ started_at, ended_at, status,
165700
+ input_tokens, output_tokens, cache_read_tokens, cache_write_tokens,
165701
+ error, parent_invocation_id
165702
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(input.sessionId, input.harness, input.subagent, input.task ?? null, input.providerId ?? null, input.modelId ?? null, input.startedAt, input.endedAt, input.status, clampToken(input.inputTokens), clampToken(input.outputTokens), clampToken(input.cacheReadTokens), clampToken(input.cacheWriteTokens), input.error ?? null, input.parentInvocationId ?? null);
165703
+ return Number(result.lastInsertRowid);
165704
+ }
165438
165705
  // ../plugin/src/features/magic-context/storage-tags.ts
165439
165706
  var insertTagStatements = new WeakMap;
165440
165707
  var updateTagStatusStatements = new WeakMap;
@@ -167367,8 +167634,7 @@ function magicContextSubagentExtension(pi) {
167367
167634
  try {
167368
167635
  const db = openDatabase();
167369
167636
  if (!db) {
167370
- log("[pi-subagent] storage open failed; tools will not register");
167371
- return;
167637
+ throw new Error("storage open failed; refusing to start without Magic Context tools");
167372
167638
  }
167373
167639
  openedDb = db;
167374
167640
  const directory = process.cwd();
@@ -167382,7 +167648,10 @@ function magicContextSubagentExtension(pi) {
167382
167648
  });
167383
167649
  log(`[pi-subagent] registered tools: ctx_search, ctx_memory, ctx_note, ctx_expand` + ` (memory=${cfg.memory.enabled}, embedding=${cfg.embedding.provider !== "off"},` + ` git_commits=${cfg.experimental.git_commit_indexing.enabled}, dreamer_actions=${dreamerActionsEnabled})`);
167384
167650
  } catch (err5) {
167385
- log(`[pi-subagent] startup failed: ${err5 instanceof Error ? err5.message : String(err5)}`);
167651
+ const message = err5 instanceof Error ? err5.message : String(err5);
167652
+ log(`[pi-subagent] startup failed: ${message}`);
167653
+ process.exitCode = 1;
167654
+ throw err5;
167386
167655
  }
167387
167656
  });
167388
167657
  pi.on("session_shutdown", () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cortexkit/pi-magic-context",
3
- "version": "0.21.6",
3
+ "version": "0.21.8",
4
4
  "type": "module",
5
5
  "description": "Pi coding agent extension for Magic Context — cross-session memory and context management",
6
6
  "main": "dist/index.js",