repoburg 1.3.261 → 1.3.263

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.
@@ -16108,20 +16108,20 @@ var require_resolve = __commonJS({
16108
16108
  return false;
16109
16109
  }
16110
16110
  function countKeys(schema) {
16111
- let count = 0;
16111
+ let count2 = 0;
16112
16112
  for (const key in schema) {
16113
16113
  if (key === "$ref")
16114
16114
  return Infinity;
16115
- count++;
16115
+ count2++;
16116
16116
  if (SIMPLE_INLINED.has(key))
16117
16117
  continue;
16118
16118
  if (typeof schema[key] == "object") {
16119
- (0, util_1.eachItem)(schema[key], (sch) => count += countKeys(sch));
16119
+ (0, util_1.eachItem)(schema[key], (sch) => count2 += countKeys(sch));
16120
16120
  }
16121
- if (count === Infinity)
16121
+ if (count2 === Infinity)
16122
16122
  return Infinity;
16123
16123
  }
16124
- return count;
16124
+ return count2;
16125
16125
  }
16126
16126
  function getFullPath(resolver, id = "", normalize) {
16127
16127
  if (normalize !== false)
@@ -19319,8 +19319,8 @@ var require_contains = __commonJS({
19319
19319
  cxt.result(valid, () => cxt.reset());
19320
19320
  function validateItemsWithCount() {
19321
19321
  const schValid = gen.name("_valid");
19322
- const count = gen.let("count", 0);
19323
- validateItems(schValid, () => gen.if(schValid, () => checkLimits(count)));
19322
+ const count2 = gen.let("count", 0);
19323
+ validateItems(schValid, () => gen.if(schValid, () => checkLimits(count2)));
19324
19324
  }
19325
19325
  function validateItems(_valid, block) {
19326
19326
  gen.forRange("i", 0, len, (i) => {
@@ -19333,16 +19333,16 @@ var require_contains = __commonJS({
19333
19333
  block();
19334
19334
  });
19335
19335
  }
19336
- function checkLimits(count) {
19337
- gen.code((0, codegen_1._)`${count}++`);
19336
+ function checkLimits(count2) {
19337
+ gen.code((0, codegen_1._)`${count2}++`);
19338
19338
  if (max === void 0) {
19339
- gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true).break());
19339
+ gen.if((0, codegen_1._)`${count2} >= ${min}`, () => gen.assign(valid, true).break());
19340
19340
  } else {
19341
- gen.if((0, codegen_1._)`${count} > ${max}`, () => gen.assign(valid, false).break());
19341
+ gen.if((0, codegen_1._)`${count2} > ${max}`, () => gen.assign(valid, false).break());
19342
19342
  if (min === 1)
19343
19343
  gen.assign(valid, true);
19344
19344
  else
19345
- gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true));
19345
+ gen.if((0, codegen_1._)`${count2} >= ${min}`, () => gen.assign(valid, true));
19346
19346
  }
19347
19347
  }
19348
19348
  }
@@ -21689,9 +21689,9 @@ var require_parseJson = __commonJS({
21689
21689
  pos++;
21690
21690
  } else if (c === "u") {
21691
21691
  pos++;
21692
- let count = 4;
21692
+ let count2 = 4;
21693
21693
  let code = 0;
21694
- while (count--) {
21694
+ while (count2--) {
21695
21695
  code <<= 4;
21696
21696
  c = s[pos];
21697
21697
  if (c === void 0) {
@@ -36953,7 +36953,7 @@ var require_fastify_plugin = __commonJS({
36953
36953
  "use strict";
36954
36954
  var getPluginName = require_getPluginName();
36955
36955
  var toCamelCase = require_toCamelCase();
36956
- var count = 0;
36956
+ var count2 = 0;
36957
36957
  function plugin(fn, options = {}) {
36958
36958
  let autoName = false;
36959
36959
  if (fn.default !== void 0) {
@@ -36977,7 +36977,7 @@ var require_fastify_plugin = __commonJS({
36977
36977
  }
36978
36978
  if (!options.name) {
36979
36979
  autoName = true;
36980
- options.name = getPluginName(fn) + "-auto-" + count++;
36980
+ options.name = getPluginName(fn) + "-auto-" + count2++;
36981
36981
  }
36982
36982
  fn[Symbol.for("skip-override")] = options.encapsulate !== true;
36983
36983
  fn[Symbol.for("fastify.display-name")] = options.name;
@@ -41858,6 +41858,7 @@ async function registerTurnRoutes(fastify) {
41858
41858
  ...turn,
41859
41859
  attachments: rawTurn.attachments ? JSON.parse(rawTurn.attachments) : null
41860
41860
  };
41861
+ broadcast("turn:created", { sessionId: id, turn: parsedTurn });
41861
41862
  getProvider(session.runtime_type).startTurn(session, rawTurn).catch((err) => {
41862
41863
  console.error(`[provider] Unhandled error for session ${id}:`, err);
41863
41864
  });
@@ -45478,6 +45479,100 @@ var EFFORT_LABELS2 = {
45478
45479
  max: "Max"
45479
45480
  };
45480
45481
 
45482
+ // src/claude/claude-context.ts
45483
+ function count(n) {
45484
+ return typeof n === "number" && Number.isFinite(n) ? n : 0;
45485
+ }
45486
+ function lastMessageIteration(iterations) {
45487
+ if (!Array.isArray(iterations)) return null;
45488
+ for (let i = iterations.length - 1; i >= 0; i--) {
45489
+ const it = iterations[i];
45490
+ if (!it || typeof it !== "object") continue;
45491
+ if ((it.type === "message" || it.type === "fallback_message") && typeof it.input_tokens === "number") return it;
45492
+ }
45493
+ return null;
45494
+ }
45495
+ function contextTokensFromUsage(usage) {
45496
+ if (!usage || typeof usage !== "object") return null;
45497
+ const u = lastMessageIteration(usage.iterations) ?? usage;
45498
+ const read = count(u.input_tokens) + count(u.cache_creation_input_tokens) + count(u.cache_read_input_tokens);
45499
+ if (read <= 0) return null;
45500
+ return read + count(u.output_tokens);
45501
+ }
45502
+ function counterOf(entry) {
45503
+ if (!entry.context) {
45504
+ entry.context = {
45505
+ window: null,
45506
+ autoCompactThreshold: null,
45507
+ tokens: null,
45508
+ measured: false,
45509
+ apiMessageId: null,
45510
+ seq: 0,
45511
+ windowRequested: false,
45512
+ lastPublished: null
45513
+ };
45514
+ }
45515
+ return entry.context;
45516
+ }
45517
+ function publish(entry, sessionId, db2) {
45518
+ const ctx = counterOf(entry);
45519
+ if (ctx.tokens === null) return;
45520
+ if (!ctx.window) {
45521
+ if (!ctx.windowRequested) void refreshContext(entry, sessionId, db2);
45522
+ return;
45523
+ }
45524
+ const usage = {
45525
+ totalTokens: ctx.tokens,
45526
+ contextWindow: ctx.window,
45527
+ percentage: Math.round(ctx.tokens / ctx.window * 100),
45528
+ ...ctx.autoCompactThreshold ? { autoCompactThreshold: ctx.autoCompactThreshold } : {}
45529
+ };
45530
+ const json = JSON.stringify(usage);
45531
+ if (json === ctx.lastPublished) return;
45532
+ ctx.lastPublished = json;
45533
+ broadcast("turn:contextUsage", { sessionId, ...usage });
45534
+ db2.prepare("UPDATE sessions SET context_usage = ? WHERE id = ?").run(json, sessionId);
45535
+ }
45536
+ function recordApiUsage(entry, sessionId, db2, apiMessageId, usage) {
45537
+ if (entry.threadId) return;
45538
+ const tokens = contextTokensFromUsage(usage);
45539
+ if (tokens === null) return;
45540
+ const ctx = counterOf(entry);
45541
+ const id = apiMessageId ?? ctx.apiMessageId;
45542
+ if (ctx.measured && id !== null && id === ctx.apiMessageId && ctx.tokens !== null && tokens <= ctx.tokens) return;
45543
+ ctx.apiMessageId = id;
45544
+ ctx.tokens = tokens;
45545
+ ctx.measured = true;
45546
+ ctx.seq++;
45547
+ publish(entry, sessionId, db2);
45548
+ }
45549
+ function resetContext(entry, sessionId, db2) {
45550
+ if (entry.threadId) return;
45551
+ const ctx = counterOf(entry);
45552
+ ctx.tokens = null;
45553
+ ctx.measured = false;
45554
+ ctx.apiMessageId = null;
45555
+ ctx.seq++;
45556
+ void refreshContext(entry, sessionId, db2);
45557
+ }
45558
+ async function refreshContext(entry, sessionId, db2) {
45559
+ if (entry.threadId) return;
45560
+ const ctx = counterOf(entry);
45561
+ ctx.windowRequested = true;
45562
+ const seq = ctx.seq;
45563
+ try {
45564
+ const snap = await entry.query.getContextUsage({ detail: "summary" });
45565
+ if (snap.maxTokens > 0) {
45566
+ ctx.window = snap.maxTokens;
45567
+ ctx.autoCompactThreshold = snap.isAutoCompactEnabled && snap.autoCompactThreshold && snap.autoCompactThreshold > 0 ? snap.autoCompactThreshold : null;
45568
+ }
45569
+ if (ctx.seq === seq && !ctx.measured && snap.totalTokens > 0) ctx.tokens = snap.totalTokens;
45570
+ } catch {
45571
+ return;
45572
+ }
45573
+ publish(entry, sessionId, db2);
45574
+ }
45575
+
45481
45576
  // src/claude/claude-provider.ts
45482
45577
  var PromptQueue = class {
45483
45578
  buffer = [];
@@ -45736,6 +45831,7 @@ async function handleMessage(message, sessionId, turnId, entry, db2) {
45736
45831
  turnId,
45737
45832
  db2
45738
45833
  );
45834
+ resetContext(entry, sessionId, db2);
45739
45835
  } else if (sub === "task_started") {
45740
45836
  handleTaskStarted(
45741
45837
  message,
@@ -45772,7 +45868,7 @@ async function handleMessage(message, sessionId, turnId, entry, db2) {
45772
45868
  break;
45773
45869
  }
45774
45870
  case "assistant": {
45775
- handleAssistantMessage(message, sessionId, turnId, db2);
45871
+ handleAssistantMessage(message, sessionId, turnId, entry, db2);
45776
45872
  break;
45777
45873
  }
45778
45874
  case "user": {
@@ -45780,19 +45876,23 @@ async function handleMessage(message, sessionId, turnId, entry, db2) {
45780
45876
  break;
45781
45877
  }
45782
45878
  case "stream_event": {
45783
- handleStreamEvent(message, sessionId, turnId);
45879
+ handleStreamEvent(message, sessionId, turnId, entry, db2);
45784
45880
  break;
45785
45881
  }
45786
45882
  case "result": {
45787
45883
  handleResultMessage(message, sessionId, turnId, entry, db2);
45788
45884
  break;
45789
45885
  }
45886
+ case "conversation_reset": {
45887
+ resetContext(entry, sessionId, db2);
45888
+ break;
45889
+ }
45790
45890
  default:
45791
45891
  break;
45792
45892
  }
45793
45893
  }
45794
45894
  var TOOL_CALL_TYPES = /* @__PURE__ */ new Set(["command_execution", "file_change", "mcp_tool_call"]);
45795
- function handleAssistantMessage(message, sessionId, turnId, db2) {
45895
+ function handleAssistantMessage(message, sessionId, turnId, entry, db2) {
45796
45896
  const messageId = message.uuid;
45797
45897
  const parentToolUseId = message.parent_tool_use_id ?? null;
45798
45898
  if (parentToolUseId) {
@@ -45802,6 +45902,9 @@ function handleAssistantMessage(message, sessionId, turnId, db2) {
45802
45902
  db2.prepare("UPDATE turns SET external_turn_id = ?, updated_at = ? WHERE id = ?").run(messageId, nowExt2, turnId);
45803
45903
  return;
45804
45904
  }
45905
+ if (message.message?.model !== "<synthetic>") {
45906
+ recordApiUsage(entry, sessionId, db2, message.message?.id ?? null, message.message?.usage);
45907
+ }
45805
45908
  const content = message.message.content;
45806
45909
  const anthropicMsgId = message.message?.id ?? messageId;
45807
45910
  const thinkingTexts = thinkingAccumulator.get(messageId);
@@ -45858,12 +45961,19 @@ function handleUserMessage(message, sessionId, turnId, db2) {
45858
45961
  );
45859
45962
  }
45860
45963
  }
45861
- function handleStreamEvent(message, sessionId, turnId) {
45964
+ function handleStreamEvent(message, sessionId, turnId, entry, db2) {
45862
45965
  const rawEvent = message.event;
45863
45966
  const parentToolUseId = message.parent_tool_use_id ?? null;
45864
45967
  if (rawEvent.type === "message_start" && rawEvent.message?.id && !parentToolUseId) {
45865
45968
  streamingMessageIds.set(turnId, rawEvent.message.id);
45866
45969
  }
45970
+ if (!parentToolUseId) {
45971
+ if (rawEvent.type === "message_start" && rawEvent.message?.id) {
45972
+ recordApiUsage(entry, sessionId, db2, rawEvent.message.id, rawEvent.message.usage);
45973
+ } else if (rawEvent.type === "message_delta") {
45974
+ recordApiUsage(entry, sessionId, db2, null, rawEvent.usage);
45975
+ }
45976
+ }
45867
45977
  const delta = mapPartialDelta(message.event);
45868
45978
  if (!delta) return;
45869
45979
  if (parentToolUseId) return;
@@ -46042,24 +46152,7 @@ async function handleResultMessage(message, sessionId, turnId, entry, db2) {
46042
46152
  const now = (/* @__PURE__ */ new Date()).toISOString();
46043
46153
  db2.prepare("UPDATE turns SET token_usage = ?, updated_at = ? WHERE id = ?").run(JSON.stringify(usage), now, turnId);
46044
46154
  broadcast("turn:tokenUsage", { sessionId, turnId, usage });
46045
- try {
46046
- const ctx = await entry.query.getContextUsage();
46047
- if (ctx.totalTokens > 0 && ctx.maxTokens > 0) {
46048
- const contextUsage = {
46049
- totalTokens: ctx.totalTokens,
46050
- contextWindow: ctx.maxTokens,
46051
- percentage: Math.round(ctx.percentage)
46052
- };
46053
- broadcast("turn:contextUsage", { sessionId, ...contextUsage });
46054
- const cuNow = (/* @__PURE__ */ new Date()).toISOString();
46055
- db2.prepare("UPDATE sessions SET context_usage = ?, updated_at = ? WHERE id = ?").run(
46056
- JSON.stringify(contextUsage),
46057
- cuNow,
46058
- sessionId
46059
- );
46060
- }
46061
- } catch {
46062
- }
46155
+ await refreshContext(entry, sessionId, db2);
46063
46156
  completeTurn(db2, sessionId, turnId, usage);
46064
46157
  } else {
46065
46158
  const errorMsg = message.errors?.join("; ") ?? "Claude turn failed";
@@ -46219,6 +46312,7 @@ async function setModel(sessionId, model) {
46219
46312
  const entry = sessionMap2.get(sessionId);
46220
46313
  if (!entry) return;
46221
46314
  await entry.query.setModel(model);
46315
+ void refreshContext(entry, sessionId, getDb());
46222
46316
  }
46223
46317
  async function stopTask(sessionId, taskId) {
46224
46318
  const entry = sessionMap2.get(sessionId);
@@ -16108,20 +16108,20 @@ var require_resolve = __commonJS({
16108
16108
  return false;
16109
16109
  }
16110
16110
  function countKeys(schema) {
16111
- let count = 0;
16111
+ let count2 = 0;
16112
16112
  for (const key in schema) {
16113
16113
  if (key === "$ref")
16114
16114
  return Infinity;
16115
- count++;
16115
+ count2++;
16116
16116
  if (SIMPLE_INLINED.has(key))
16117
16117
  continue;
16118
16118
  if (typeof schema[key] == "object") {
16119
- (0, util_1.eachItem)(schema[key], (sch) => count += countKeys(sch));
16119
+ (0, util_1.eachItem)(schema[key], (sch) => count2 += countKeys(sch));
16120
16120
  }
16121
- if (count === Infinity)
16121
+ if (count2 === Infinity)
16122
16122
  return Infinity;
16123
16123
  }
16124
- return count;
16124
+ return count2;
16125
16125
  }
16126
16126
  function getFullPath(resolver, id = "", normalize) {
16127
16127
  if (normalize !== false)
@@ -19319,8 +19319,8 @@ var require_contains = __commonJS({
19319
19319
  cxt.result(valid, () => cxt.reset());
19320
19320
  function validateItemsWithCount() {
19321
19321
  const schValid = gen.name("_valid");
19322
- const count = gen.let("count", 0);
19323
- validateItems(schValid, () => gen.if(schValid, () => checkLimits(count)));
19322
+ const count2 = gen.let("count", 0);
19323
+ validateItems(schValid, () => gen.if(schValid, () => checkLimits(count2)));
19324
19324
  }
19325
19325
  function validateItems(_valid, block) {
19326
19326
  gen.forRange("i", 0, len, (i) => {
@@ -19333,16 +19333,16 @@ var require_contains = __commonJS({
19333
19333
  block();
19334
19334
  });
19335
19335
  }
19336
- function checkLimits(count) {
19337
- gen.code((0, codegen_1._)`${count}++`);
19336
+ function checkLimits(count2) {
19337
+ gen.code((0, codegen_1._)`${count2}++`);
19338
19338
  if (max === void 0) {
19339
- gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true).break());
19339
+ gen.if((0, codegen_1._)`${count2} >= ${min}`, () => gen.assign(valid, true).break());
19340
19340
  } else {
19341
- gen.if((0, codegen_1._)`${count} > ${max}`, () => gen.assign(valid, false).break());
19341
+ gen.if((0, codegen_1._)`${count2} > ${max}`, () => gen.assign(valid, false).break());
19342
19342
  if (min === 1)
19343
19343
  gen.assign(valid, true);
19344
19344
  else
19345
- gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true));
19345
+ gen.if((0, codegen_1._)`${count2} >= ${min}`, () => gen.assign(valid, true));
19346
19346
  }
19347
19347
  }
19348
19348
  }
@@ -21689,9 +21689,9 @@ var require_parseJson = __commonJS({
21689
21689
  pos++;
21690
21690
  } else if (c === "u") {
21691
21691
  pos++;
21692
- let count = 4;
21692
+ let count2 = 4;
21693
21693
  let code = 0;
21694
- while (count--) {
21694
+ while (count2--) {
21695
21695
  code <<= 4;
21696
21696
  c = s[pos];
21697
21697
  if (c === void 0) {
@@ -36953,7 +36953,7 @@ var require_fastify_plugin = __commonJS({
36953
36953
  "use strict";
36954
36954
  var getPluginName = require_getPluginName();
36955
36955
  var toCamelCase = require_toCamelCase();
36956
- var count = 0;
36956
+ var count2 = 0;
36957
36957
  function plugin(fn, options = {}) {
36958
36958
  let autoName = false;
36959
36959
  if (fn.default !== void 0) {
@@ -36977,7 +36977,7 @@ var require_fastify_plugin = __commonJS({
36977
36977
  }
36978
36978
  if (!options.name) {
36979
36979
  autoName = true;
36980
- options.name = getPluginName(fn) + "-auto-" + count++;
36980
+ options.name = getPluginName(fn) + "-auto-" + count2++;
36981
36981
  }
36982
36982
  fn[Symbol.for("skip-override")] = options.encapsulate !== true;
36983
36983
  fn[Symbol.for("fastify.display-name")] = options.name;
@@ -41845,6 +41845,7 @@ async function registerTurnRoutes(fastify) {
41845
41845
  ...turn,
41846
41846
  attachments: rawTurn.attachments ? JSON.parse(rawTurn.attachments) : null
41847
41847
  };
41848
+ broadcast("turn:created", { sessionId: id, turn: parsedTurn });
41848
41849
  getProvider(session.runtime_type).startTurn(session, rawTurn).catch((err) => {
41849
41850
  console.error(`[provider] Unhandled error for session ${id}:`, err);
41850
41851
  });
@@ -45465,6 +45466,100 @@ var EFFORT_LABELS2 = {
45465
45466
  max: "Max"
45466
45467
  };
45467
45468
 
45469
+ // src/claude/claude-context.ts
45470
+ function count(n) {
45471
+ return typeof n === "number" && Number.isFinite(n) ? n : 0;
45472
+ }
45473
+ function lastMessageIteration(iterations) {
45474
+ if (!Array.isArray(iterations)) return null;
45475
+ for (let i = iterations.length - 1; i >= 0; i--) {
45476
+ const it = iterations[i];
45477
+ if (!it || typeof it !== "object") continue;
45478
+ if ((it.type === "message" || it.type === "fallback_message") && typeof it.input_tokens === "number") return it;
45479
+ }
45480
+ return null;
45481
+ }
45482
+ function contextTokensFromUsage(usage) {
45483
+ if (!usage || typeof usage !== "object") return null;
45484
+ const u = lastMessageIteration(usage.iterations) ?? usage;
45485
+ const read = count(u.input_tokens) + count(u.cache_creation_input_tokens) + count(u.cache_read_input_tokens);
45486
+ if (read <= 0) return null;
45487
+ return read + count(u.output_tokens);
45488
+ }
45489
+ function counterOf(entry) {
45490
+ if (!entry.context) {
45491
+ entry.context = {
45492
+ window: null,
45493
+ autoCompactThreshold: null,
45494
+ tokens: null,
45495
+ measured: false,
45496
+ apiMessageId: null,
45497
+ seq: 0,
45498
+ windowRequested: false,
45499
+ lastPublished: null
45500
+ };
45501
+ }
45502
+ return entry.context;
45503
+ }
45504
+ function publish(entry, sessionId, db2) {
45505
+ const ctx = counterOf(entry);
45506
+ if (ctx.tokens === null) return;
45507
+ if (!ctx.window) {
45508
+ if (!ctx.windowRequested) void refreshContext(entry, sessionId, db2);
45509
+ return;
45510
+ }
45511
+ const usage = {
45512
+ totalTokens: ctx.tokens,
45513
+ contextWindow: ctx.window,
45514
+ percentage: Math.round(ctx.tokens / ctx.window * 100),
45515
+ ...ctx.autoCompactThreshold ? { autoCompactThreshold: ctx.autoCompactThreshold } : {}
45516
+ };
45517
+ const json = JSON.stringify(usage);
45518
+ if (json === ctx.lastPublished) return;
45519
+ ctx.lastPublished = json;
45520
+ broadcast("turn:contextUsage", { sessionId, ...usage });
45521
+ db2.prepare("UPDATE sessions SET context_usage = ? WHERE id = ?").run(json, sessionId);
45522
+ }
45523
+ function recordApiUsage(entry, sessionId, db2, apiMessageId, usage) {
45524
+ if (entry.threadId) return;
45525
+ const tokens = contextTokensFromUsage(usage);
45526
+ if (tokens === null) return;
45527
+ const ctx = counterOf(entry);
45528
+ const id = apiMessageId ?? ctx.apiMessageId;
45529
+ if (ctx.measured && id !== null && id === ctx.apiMessageId && ctx.tokens !== null && tokens <= ctx.tokens) return;
45530
+ ctx.apiMessageId = id;
45531
+ ctx.tokens = tokens;
45532
+ ctx.measured = true;
45533
+ ctx.seq++;
45534
+ publish(entry, sessionId, db2);
45535
+ }
45536
+ function resetContext(entry, sessionId, db2) {
45537
+ if (entry.threadId) return;
45538
+ const ctx = counterOf(entry);
45539
+ ctx.tokens = null;
45540
+ ctx.measured = false;
45541
+ ctx.apiMessageId = null;
45542
+ ctx.seq++;
45543
+ void refreshContext(entry, sessionId, db2);
45544
+ }
45545
+ async function refreshContext(entry, sessionId, db2) {
45546
+ if (entry.threadId) return;
45547
+ const ctx = counterOf(entry);
45548
+ ctx.windowRequested = true;
45549
+ const seq = ctx.seq;
45550
+ try {
45551
+ const snap = await entry.query.getContextUsage({ detail: "summary" });
45552
+ if (snap.maxTokens > 0) {
45553
+ ctx.window = snap.maxTokens;
45554
+ ctx.autoCompactThreshold = snap.isAutoCompactEnabled && snap.autoCompactThreshold && snap.autoCompactThreshold > 0 ? snap.autoCompactThreshold : null;
45555
+ }
45556
+ if (ctx.seq === seq && !ctx.measured && snap.totalTokens > 0) ctx.tokens = snap.totalTokens;
45557
+ } catch {
45558
+ return;
45559
+ }
45560
+ publish(entry, sessionId, db2);
45561
+ }
45562
+
45468
45563
  // src/claude/claude-provider.ts
45469
45564
  var PromptQueue = class {
45470
45565
  buffer = [];
@@ -45723,6 +45818,7 @@ async function handleMessage(message, sessionId, turnId, entry, db2) {
45723
45818
  turnId,
45724
45819
  db2
45725
45820
  );
45821
+ resetContext(entry, sessionId, db2);
45726
45822
  } else if (sub === "task_started") {
45727
45823
  handleTaskStarted(
45728
45824
  message,
@@ -45759,7 +45855,7 @@ async function handleMessage(message, sessionId, turnId, entry, db2) {
45759
45855
  break;
45760
45856
  }
45761
45857
  case "assistant": {
45762
- handleAssistantMessage(message, sessionId, turnId, db2);
45858
+ handleAssistantMessage(message, sessionId, turnId, entry, db2);
45763
45859
  break;
45764
45860
  }
45765
45861
  case "user": {
@@ -45767,19 +45863,23 @@ async function handleMessage(message, sessionId, turnId, entry, db2) {
45767
45863
  break;
45768
45864
  }
45769
45865
  case "stream_event": {
45770
- handleStreamEvent(message, sessionId, turnId);
45866
+ handleStreamEvent(message, sessionId, turnId, entry, db2);
45771
45867
  break;
45772
45868
  }
45773
45869
  case "result": {
45774
45870
  handleResultMessage(message, sessionId, turnId, entry, db2);
45775
45871
  break;
45776
45872
  }
45873
+ case "conversation_reset": {
45874
+ resetContext(entry, sessionId, db2);
45875
+ break;
45876
+ }
45777
45877
  default:
45778
45878
  break;
45779
45879
  }
45780
45880
  }
45781
45881
  var TOOL_CALL_TYPES = /* @__PURE__ */ new Set(["command_execution", "file_change", "mcp_tool_call"]);
45782
- function handleAssistantMessage(message, sessionId, turnId, db2) {
45882
+ function handleAssistantMessage(message, sessionId, turnId, entry, db2) {
45783
45883
  const messageId = message.uuid;
45784
45884
  const parentToolUseId = message.parent_tool_use_id ?? null;
45785
45885
  if (parentToolUseId) {
@@ -45789,6 +45889,9 @@ function handleAssistantMessage(message, sessionId, turnId, db2) {
45789
45889
  db2.prepare("UPDATE turns SET external_turn_id = ?, updated_at = ? WHERE id = ?").run(messageId, nowExt2, turnId);
45790
45890
  return;
45791
45891
  }
45892
+ if (message.message?.model !== "<synthetic>") {
45893
+ recordApiUsage(entry, sessionId, db2, message.message?.id ?? null, message.message?.usage);
45894
+ }
45792
45895
  const content = message.message.content;
45793
45896
  const anthropicMsgId = message.message?.id ?? messageId;
45794
45897
  const thinkingTexts = thinkingAccumulator.get(messageId);
@@ -45845,12 +45948,19 @@ function handleUserMessage(message, sessionId, turnId, db2) {
45845
45948
  );
45846
45949
  }
45847
45950
  }
45848
- function handleStreamEvent(message, sessionId, turnId) {
45951
+ function handleStreamEvent(message, sessionId, turnId, entry, db2) {
45849
45952
  const rawEvent = message.event;
45850
45953
  const parentToolUseId = message.parent_tool_use_id ?? null;
45851
45954
  if (rawEvent.type === "message_start" && rawEvent.message?.id && !parentToolUseId) {
45852
45955
  streamingMessageIds.set(turnId, rawEvent.message.id);
45853
45956
  }
45957
+ if (!parentToolUseId) {
45958
+ if (rawEvent.type === "message_start" && rawEvent.message?.id) {
45959
+ recordApiUsage(entry, sessionId, db2, rawEvent.message.id, rawEvent.message.usage);
45960
+ } else if (rawEvent.type === "message_delta") {
45961
+ recordApiUsage(entry, sessionId, db2, null, rawEvent.usage);
45962
+ }
45963
+ }
45854
45964
  const delta = mapPartialDelta(message.event);
45855
45965
  if (!delta) return;
45856
45966
  if (parentToolUseId) return;
@@ -46029,24 +46139,7 @@ async function handleResultMessage(message, sessionId, turnId, entry, db2) {
46029
46139
  const now = (/* @__PURE__ */ new Date()).toISOString();
46030
46140
  db2.prepare("UPDATE turns SET token_usage = ?, updated_at = ? WHERE id = ?").run(JSON.stringify(usage), now, turnId);
46031
46141
  broadcast("turn:tokenUsage", { sessionId, turnId, usage });
46032
- try {
46033
- const ctx = await entry.query.getContextUsage();
46034
- if (ctx.totalTokens > 0 && ctx.maxTokens > 0) {
46035
- const contextUsage = {
46036
- totalTokens: ctx.totalTokens,
46037
- contextWindow: ctx.maxTokens,
46038
- percentage: Math.round(ctx.percentage)
46039
- };
46040
- broadcast("turn:contextUsage", { sessionId, ...contextUsage });
46041
- const cuNow = (/* @__PURE__ */ new Date()).toISOString();
46042
- db2.prepare("UPDATE sessions SET context_usage = ?, updated_at = ? WHERE id = ?").run(
46043
- JSON.stringify(contextUsage),
46044
- cuNow,
46045
- sessionId
46046
- );
46047
- }
46048
- } catch {
46049
- }
46142
+ await refreshContext(entry, sessionId, db2);
46050
46143
  completeTurn(db2, sessionId, turnId, usage);
46051
46144
  } else {
46052
46145
  const errorMsg = message.errors?.join("; ") ?? "Claude turn failed";
@@ -46206,6 +46299,7 @@ async function setModel(sessionId, model) {
46206
46299
  const entry = sessionMap2.get(sessionId);
46207
46300
  if (!entry) return;
46208
46301
  await entry.query.setModel(model);
46302
+ void refreshContext(entry, sessionId, getDb());
46209
46303
  }
46210
46304
  async function stopTask(sessionId, taskId) {
46211
46305
  const entry = sessionMap2.get(sessionId);