@averyyy/pi-coding-agent 0.80.3-piclient.9 → 0.80.6-piclient.10
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.
- package/CHANGELOG.md +104 -0
- package/README.md +5 -3
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +4 -4
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts +4 -2
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +1 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/core/agent-session.d.ts +21 -5
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +100 -30
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +13 -5
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/cache-stats.d.ts +49 -0
- package/dist/core/cache-stats.d.ts.map +1 -0
- package/dist/core/cache-stats.js +101 -0
- package/dist/core/cache-stats.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +1 -1
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +1 -2
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +56 -81
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +6 -0
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +6 -3
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +43 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +33 -11
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js +22 -3
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/keybindings.d.ts +8 -3
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +10 -9
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-registry.d.ts +4 -6
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +39 -9
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +10 -0
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +14 -17
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/package-manager.d.ts +4 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +75 -28
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/pi-client-runtime-update.d.ts +14 -0
- package/dist/core/pi-client-runtime-update.d.ts.map +1 -0
- package/dist/core/pi-client-runtime-update.js +27 -0
- package/dist/core/pi-client-runtime-update.js.map +1 -0
- package/dist/core/pi-server-client.d.ts.map +1 -1
- package/dist/core/pi-server-client.js +122 -5
- package/dist/core/pi-server-client.js.map +1 -1
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-attribution.js +0 -10
- package/dist/core/provider-attribution.js.map +1 -1
- package/dist/core/resource-loader.d.ts +2 -2
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +6 -7
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +8 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +20 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +97 -68
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +9 -3
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +10 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts +1 -0
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +3 -3
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +2 -2
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +2 -2
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +1 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts +34 -3
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +280 -25
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +1 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts +19 -0
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-entry.js +52 -0
- package/dist/modes/interactive/components/custom-entry.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +4 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +4 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +9 -2
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +3 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +17 -6
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +12 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +2 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +5 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +49 -12
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +16 -5
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +368 -97
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +1 -0
- package/dist/modes/interactive/theme/light.json +1 -0
- package/dist/modes/interactive/theme/theme-schema.json +6 -2
- package/dist/modes/interactive/theme/theme.d.ts +3 -2
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +10 -3
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +1 -1
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +6 -6
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +3 -3
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +4 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/package-manager-cli.d.ts +2 -2
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +71 -17
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +1 -1
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard-native.d.ts +1 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -1
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +13 -0
- package/dist/utils/clipboard.js.map +1 -1
- package/docs/custom-provider.md +6 -3
- package/docs/extensions.md +213 -18
- package/docs/keybindings.md +1 -0
- package/docs/models.md +51 -8
- package/docs/packages.md +2 -2
- package/docs/providers.md +3 -0
- package/docs/quickstart.md +1 -1
- package/docs/rpc.md +15 -5
- package/docs/sdk.md +51 -1
- package/docs/session-format.md +18 -8
- package/docs/settings.md +3 -2
- package/docs/themes.md +5 -3
- package/docs/tui.md +1 -1
- package/docs/usage.md +3 -2
- package/examples/extensions/README.md +1 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/entry-renderer.ts +41 -0
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/preset.ts +2 -2
- package/examples/extensions/question.ts +1 -0
- package/examples/extensions/reload-runtime.ts +2 -2
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/sdk/12-full-control.ts +1 -1
- package/examples/sdk/README.md +1 -1
- package/package.json +8 -4
|
@@ -151,6 +151,9 @@ export class AgentSession {
|
|
|
151
151
|
// Event subscription state
|
|
152
152
|
_unsubscribeAgent;
|
|
153
153
|
_eventListeners = [];
|
|
154
|
+
_isAgentRunActive = false;
|
|
155
|
+
_idleWaitPromise;
|
|
156
|
+
_resolveIdleWait;
|
|
154
157
|
/** Tracks pending steering messages for UI display. Removed when delivered. */
|
|
155
158
|
_steeringMessages = [];
|
|
156
159
|
/** Tracks pending follow-up messages for UI display. Removed when delivered. */
|
|
@@ -265,7 +268,7 @@ export class AgentSession {
|
|
|
265
268
|
}
|
|
266
269
|
throw new Error(formatNoApiKeyFoundMessage(model.provider));
|
|
267
270
|
}
|
|
268
|
-
async
|
|
271
|
+
async _getSummarizationRequestAuth(model) {
|
|
269
272
|
if (this.agent.streamFn === streamSimple) {
|
|
270
273
|
return this._getRequiredRequestAuth(model);
|
|
271
274
|
}
|
|
@@ -430,6 +433,33 @@ export class AgentSession {
|
|
|
430
433
|
followUp: [...this._followUpMessages],
|
|
431
434
|
});
|
|
432
435
|
}
|
|
436
|
+
_getIdleWaitPromise() {
|
|
437
|
+
if (!this._idleWaitPromise) {
|
|
438
|
+
this._idleWaitPromise = new Promise((resolve) => {
|
|
439
|
+
this._resolveIdleWait = resolve;
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
return this._idleWaitPromise;
|
|
443
|
+
}
|
|
444
|
+
_resolveIdleWaitIfIdle() {
|
|
445
|
+
if (this._isAgentRunActive || !this._resolveIdleWait) {
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
const resolve = this._resolveIdleWait;
|
|
449
|
+
this._idleWaitPromise = undefined;
|
|
450
|
+
this._resolveIdleWait = undefined;
|
|
451
|
+
resolve();
|
|
452
|
+
}
|
|
453
|
+
async _emitAgentSettled() {
|
|
454
|
+
this._isAgentRunActive = false;
|
|
455
|
+
try {
|
|
456
|
+
await this._extensionRunner.emit({ type: "agent_settled" });
|
|
457
|
+
this._emit({ type: "agent_settled" });
|
|
458
|
+
}
|
|
459
|
+
finally {
|
|
460
|
+
this._resolveIdleWaitIfIdle();
|
|
461
|
+
}
|
|
462
|
+
}
|
|
433
463
|
// Track last assistant message for auto-compaction check
|
|
434
464
|
_lastAssistantMessage = undefined;
|
|
435
465
|
/** Internal handler for agent events - shared by subscribe and reconnect */
|
|
@@ -654,7 +684,16 @@ export class AgentSession {
|
|
|
654
684
|
};
|
|
655
685
|
const replacement = await this._extensionRunner.emitMessageEnd(extensionEvent);
|
|
656
686
|
if (replacement) {
|
|
657
|
-
|
|
687
|
+
// Untyped extension handlers can return messages with null/missing content;
|
|
688
|
+
// normalize so it never enters agent state or session history.
|
|
689
|
+
const normalized = (replacement.role === "user" ||
|
|
690
|
+
replacement.role === "assistant" ||
|
|
691
|
+
replacement.role === "toolResult" ||
|
|
692
|
+
replacement.role === "custom") &&
|
|
693
|
+
replacement.content == null
|
|
694
|
+
? { ...replacement, content: [] }
|
|
695
|
+
: replacement;
|
|
696
|
+
this._replaceMessageInPlace(event.message, normalized);
|
|
658
697
|
}
|
|
659
698
|
}
|
|
660
699
|
else if (event.type === "tool_execution_start") {
|
|
@@ -757,9 +796,13 @@ export class AgentSession {
|
|
|
757
796
|
get thinkingLevel() {
|
|
758
797
|
return this.agent.state.thinkingLevel;
|
|
759
798
|
}
|
|
760
|
-
/** Whether
|
|
799
|
+
/** Whether the session is currently processing an agent run or post-run continuation. */
|
|
761
800
|
get isStreaming() {
|
|
762
|
-
return this.
|
|
801
|
+
return this._isAgentRunActive;
|
|
802
|
+
}
|
|
803
|
+
/** Whether the session has no active agent run, retry, auto-compaction, or queued continuation. */
|
|
804
|
+
get isIdle() {
|
|
805
|
+
return !this._isAgentRunActive;
|
|
763
806
|
}
|
|
764
807
|
/** Current effective system prompt (includes any per-turn extension modifications) */
|
|
765
808
|
get systemPrompt() {
|
|
@@ -912,6 +955,7 @@ export class AgentSession {
|
|
|
912
955
|
// =========================================================================
|
|
913
956
|
async _runAgentPrompt(messages) {
|
|
914
957
|
this._resetValidationHintState();
|
|
958
|
+
this._isAgentRunActive = true;
|
|
915
959
|
try {
|
|
916
960
|
await this.agent.prompt(messages);
|
|
917
961
|
while (await this._handlePostAgentRun()) {
|
|
@@ -937,6 +981,7 @@ export class AgentSession {
|
|
|
937
981
|
finally {
|
|
938
982
|
this._systemPromptOverride = undefined;
|
|
939
983
|
this._flushPendingBashMessages();
|
|
984
|
+
await this._emitAgentSettled();
|
|
940
985
|
}
|
|
941
986
|
}
|
|
942
987
|
_sessionHasInfoEntry() {
|
|
@@ -1140,7 +1185,8 @@ export class AgentSession {
|
|
|
1140
1185
|
messages.push({
|
|
1141
1186
|
role: "custom",
|
|
1142
1187
|
customType: msg.customType,
|
|
1143
|
-
content
|
|
1188
|
+
// Untyped extensions can pass null/missing content; normalize at ingestion.
|
|
1189
|
+
content: msg.content ?? [],
|
|
1144
1190
|
display: msg.display,
|
|
1145
1191
|
details: msg.details,
|
|
1146
1192
|
timestamp: Date.now(),
|
|
@@ -1319,7 +1365,8 @@ export class AgentSession {
|
|
|
1319
1365
|
const appMessage = {
|
|
1320
1366
|
role: "custom",
|
|
1321
1367
|
customType: message.customType,
|
|
1322
|
-
content
|
|
1368
|
+
// Untyped extensions can pass null/missing content; normalize at ingestion.
|
|
1369
|
+
content: message.content ?? [],
|
|
1323
1370
|
display: message.display,
|
|
1324
1371
|
details: message.details,
|
|
1325
1372
|
timestamp: Date.now(),
|
|
@@ -1417,7 +1464,13 @@ export class AgentSession {
|
|
|
1417
1464
|
async abort() {
|
|
1418
1465
|
this.abortRetry();
|
|
1419
1466
|
this.agent.abort();
|
|
1420
|
-
await this.
|
|
1467
|
+
await this.waitForIdle();
|
|
1468
|
+
}
|
|
1469
|
+
async waitForIdle() {
|
|
1470
|
+
if (this.isIdle) {
|
|
1471
|
+
return;
|
|
1472
|
+
}
|
|
1473
|
+
await this._getIdleWaitPromise();
|
|
1421
1474
|
}
|
|
1422
1475
|
// =========================================================================
|
|
1423
1476
|
// Model Management
|
|
@@ -1638,7 +1691,7 @@ export class AgentSession {
|
|
|
1638
1691
|
if (!this.model) {
|
|
1639
1692
|
throw new Error(formatNoModelSelectedMessage());
|
|
1640
1693
|
}
|
|
1641
|
-
const { apiKey, headers, env } = await this.
|
|
1694
|
+
const { apiKey, headers, env } = await this._getSummarizationRequestAuth(this.model);
|
|
1642
1695
|
if (isPiServerMode()) {
|
|
1643
1696
|
this._detachPiServerTerminalAssistantFailure();
|
|
1644
1697
|
const piServerResult = await compactPiServer(this.model, {
|
|
@@ -1907,7 +1960,7 @@ export class AgentSession {
|
|
|
1907
1960
|
env = authResult.env;
|
|
1908
1961
|
}
|
|
1909
1962
|
else {
|
|
1910
|
-
({ apiKey, headers, env } = await this.
|
|
1963
|
+
({ apiKey, headers, env } = await this._getSummarizationRequestAuth(this.model));
|
|
1911
1964
|
}
|
|
1912
1965
|
if (isPiServerMode()) {
|
|
1913
1966
|
this._emit({ type: "compaction_start", reason });
|
|
@@ -2072,10 +2125,7 @@ export class AgentSession {
|
|
|
2072
2125
|
if (contextWindow <= 0)
|
|
2073
2126
|
return false;
|
|
2074
2127
|
const projectedTokens = estimateContextTokens(turn.context.messages).tokens;
|
|
2075
|
-
|
|
2076
|
-
return true;
|
|
2077
|
-
const toolResultTokens = estimateMessagesTokens(turn.toolResults);
|
|
2078
|
-
return toolResultTokens >= settings.keepRecentTokens;
|
|
2128
|
+
return projectedTokens >= contextWindow - settings.reserveTokens;
|
|
2079
2129
|
}
|
|
2080
2130
|
_appendIntraTurnCompactionMarker() {
|
|
2081
2131
|
const marker = {
|
|
@@ -2245,7 +2295,11 @@ export class AgentSession {
|
|
|
2245
2295
|
});
|
|
2246
2296
|
},
|
|
2247
2297
|
appendEntry: (customType, data) => {
|
|
2248
|
-
this.sessionManager.appendCustomEntry(customType, data);
|
|
2298
|
+
const entryId = this.sessionManager.appendCustomEntry(customType, data);
|
|
2299
|
+
const entry = this.sessionManager.getEntry(entryId);
|
|
2300
|
+
if (entry) {
|
|
2301
|
+
this._emit({ type: "entry_appended", entry });
|
|
2302
|
+
}
|
|
2249
2303
|
},
|
|
2250
2304
|
setSessionName: (name) => {
|
|
2251
2305
|
this.setSessionName(name);
|
|
@@ -2271,7 +2325,7 @@ export class AgentSession {
|
|
|
2271
2325
|
setThinkingLevel: (level) => this.setThinkingLevel(level),
|
|
2272
2326
|
}, {
|
|
2273
2327
|
getModel: () => this.model,
|
|
2274
|
-
isIdle: () =>
|
|
2328
|
+
isIdle: () => this.isIdle,
|
|
2275
2329
|
isProjectTrusted: () => this.settingsManager.isProjectTrusted(),
|
|
2276
2330
|
getSignal: () => this.agent.signal,
|
|
2277
2331
|
abort: () => {
|
|
@@ -2732,7 +2786,7 @@ export class AgentSession {
|
|
|
2732
2786
|
let summaryDetails;
|
|
2733
2787
|
if (options.summarize && entriesToSummarize.length > 0 && !extensionSummary) {
|
|
2734
2788
|
const model = this.model;
|
|
2735
|
-
const { apiKey, headers, env } = await this.
|
|
2789
|
+
const { apiKey, headers, env } = await this._getSummarizationRequestAuth(model);
|
|
2736
2790
|
const branchSummarySettings = this.settingsManager.getBranchSummarySettings();
|
|
2737
2791
|
const result = await generateBranchSummary(entriesToSummarize, {
|
|
2738
2792
|
model,
|
|
@@ -2863,28 +2917,44 @@ export class AgentSession {
|
|
|
2863
2917
|
return "";
|
|
2864
2918
|
}
|
|
2865
2919
|
/**
|
|
2866
|
-
* Get session statistics.
|
|
2920
|
+
* Get session statistics. Aggregates over ALL session entries (including
|
|
2921
|
+
* history that was compacted away), so token/cost totals reflect what was
|
|
2922
|
+
* actually billed across the session.
|
|
2867
2923
|
*/
|
|
2868
2924
|
getSessionStats() {
|
|
2869
|
-
|
|
2870
|
-
|
|
2871
|
-
|
|
2872
|
-
|
|
2925
|
+
let userMessages = 0;
|
|
2926
|
+
let assistantMessages = 0;
|
|
2927
|
+
let toolResults = 0;
|
|
2928
|
+
let totalMessages = 0;
|
|
2873
2929
|
let toolCalls = 0;
|
|
2874
2930
|
let totalInput = 0;
|
|
2875
2931
|
let totalOutput = 0;
|
|
2876
2932
|
let totalCacheRead = 0;
|
|
2877
2933
|
let totalCacheWrite = 0;
|
|
2878
2934
|
let totalCost = 0;
|
|
2879
|
-
for (const
|
|
2880
|
-
if (
|
|
2935
|
+
for (const entry of this.sessionManager.getEntries()) {
|
|
2936
|
+
if (entry.type !== "message")
|
|
2937
|
+
continue;
|
|
2938
|
+
totalMessages++;
|
|
2939
|
+
const message = entry.message;
|
|
2940
|
+
if (message.role === "user") {
|
|
2941
|
+
userMessages++;
|
|
2942
|
+
}
|
|
2943
|
+
else if (message.role === "toolResult") {
|
|
2944
|
+
toolResults++;
|
|
2945
|
+
}
|
|
2946
|
+
else if (message.role === "assistant") {
|
|
2947
|
+
assistantMessages++;
|
|
2881
2948
|
const assistantMsg = message;
|
|
2882
|
-
|
|
2883
|
-
|
|
2884
|
-
|
|
2885
|
-
|
|
2886
|
-
|
|
2887
|
-
|
|
2949
|
+
if (Array.isArray(assistantMsg.content)) {
|
|
2950
|
+
toolCalls += assistantMsg.content.filter((c) => c.type === "toolCall").length;
|
|
2951
|
+
}
|
|
2952
|
+
const usage = assistantMsg.usage;
|
|
2953
|
+
totalInput += usage.input;
|
|
2954
|
+
totalOutput += usage.output;
|
|
2955
|
+
totalCacheRead += usage.cacheRead;
|
|
2956
|
+
totalCacheWrite += usage.cacheWrite;
|
|
2957
|
+
totalCost += usage.cost.total;
|
|
2888
2958
|
}
|
|
2889
2959
|
}
|
|
2890
2960
|
return {
|
|
@@ -2894,7 +2964,7 @@ export class AgentSession {
|
|
|
2894
2964
|
assistantMessages,
|
|
2895
2965
|
toolCalls,
|
|
2896
2966
|
toolResults,
|
|
2897
|
-
totalMessages
|
|
2967
|
+
totalMessages,
|
|
2898
2968
|
tokens: {
|
|
2899
2969
|
input: totalInput,
|
|
2900
2970
|
output: totalOutput,
|