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
|
|
16111
|
+
let count2 = 0;
|
|
16112
16112
|
for (const key in schema) {
|
|
16113
16113
|
if (key === "$ref")
|
|
16114
16114
|
return Infinity;
|
|
16115
|
-
|
|
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) =>
|
|
16119
|
+
(0, util_1.eachItem)(schema[key], (sch) => count2 += countKeys(sch));
|
|
16120
16120
|
}
|
|
16121
|
-
if (
|
|
16121
|
+
if (count2 === Infinity)
|
|
16122
16122
|
return Infinity;
|
|
16123
16123
|
}
|
|
16124
|
-
return
|
|
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
|
|
19323
|
-
validateItems(schValid, () => gen.if(schValid, () => checkLimits(
|
|
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(
|
|
19337
|
-
gen.code((0, codegen_1._)`${
|
|
19336
|
+
function checkLimits(count2) {
|
|
19337
|
+
gen.code((0, codegen_1._)`${count2}++`);
|
|
19338
19338
|
if (max === void 0) {
|
|
19339
|
-
gen.if((0, codegen_1._)`${
|
|
19339
|
+
gen.if((0, codegen_1._)`${count2} >= ${min}`, () => gen.assign(valid, true).break());
|
|
19340
19340
|
} else {
|
|
19341
|
-
gen.if((0, codegen_1._)`${
|
|
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._)`${
|
|
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
|
|
21692
|
+
let count2 = 4;
|
|
21693
21693
|
let code = 0;
|
|
21694
|
-
while (
|
|
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
|
|
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-" +
|
|
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
|
-
|
|
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
|
|
16111
|
+
let count2 = 0;
|
|
16112
16112
|
for (const key in schema) {
|
|
16113
16113
|
if (key === "$ref")
|
|
16114
16114
|
return Infinity;
|
|
16115
|
-
|
|
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) =>
|
|
16119
|
+
(0, util_1.eachItem)(schema[key], (sch) => count2 += countKeys(sch));
|
|
16120
16120
|
}
|
|
16121
|
-
if (
|
|
16121
|
+
if (count2 === Infinity)
|
|
16122
16122
|
return Infinity;
|
|
16123
16123
|
}
|
|
16124
|
-
return
|
|
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
|
|
19323
|
-
validateItems(schValid, () => gen.if(schValid, () => checkLimits(
|
|
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(
|
|
19337
|
-
gen.code((0, codegen_1._)`${
|
|
19336
|
+
function checkLimits(count2) {
|
|
19337
|
+
gen.code((0, codegen_1._)`${count2}++`);
|
|
19338
19338
|
if (max === void 0) {
|
|
19339
|
-
gen.if((0, codegen_1._)`${
|
|
19339
|
+
gen.if((0, codegen_1._)`${count2} >= ${min}`, () => gen.assign(valid, true).break());
|
|
19340
19340
|
} else {
|
|
19341
|
-
gen.if((0, codegen_1._)`${
|
|
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._)`${
|
|
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
|
|
21692
|
+
let count2 = 4;
|
|
21693
21693
|
let code = 0;
|
|
21694
|
-
while (
|
|
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
|
|
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-" +
|
|
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
|
-
|
|
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);
|