























@@ -12,10 +12,12 @@ import {
1212} from "../../runtime-deps.js";
1313import type { AgentMessage, ThinkingLevel } from "../../types.js";
1414import {
15+asAgentMessage,
1516convertToLlm,
1617createBranchSummaryMessage,
1718createCompactionSummaryMessage,
1819createCustomMessage,
20+type HarnessMessage,
1921} from "../messages.js";
2022import { buildSessionContext } from "../session/session.js";
2123import {
@@ -83,19 +85,23 @@ function getMessageFromEntry(entry: SessionTreeEntry): AgentMessage | undefined
8385return entry.message;
8486}
8587if (entry.type === "custom_message") {
86-return createCustomMessage(
87-entry.customType,
88-entry.content,
89-entry.display,
90-entry.details,
91-entry.timestamp,
88+return asAgentMessage(
89+createCustomMessage(
90+entry.customType,
91+entry.content,
92+entry.display,
93+entry.details,
94+entry.timestamp,
95+),
9296);
9397}
9498if (entry.type === "branch_summary") {
95-return createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp);
99+return asAgentMessage(createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp));
96100}
97101if (entry.type === "compaction") {
98-return createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp);
102+return asAgentMessage(
103+createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp),
104+);
99105}
100106return undefined;
101107}
@@ -238,11 +244,13 @@ export function shouldCompact(
238244/** Estimate token count for one message using a conservative character heuristic. */
239245export function estimateTokens(message: AgentMessage): number {
240246let chars = 0;
247+const harnessMessage = message as HarnessMessage;
241248242-switch (message.role) {
249+switch (harnessMessage.role) {
243250case "user": {
244-const content = (message as { content: string | Array<{ type: string; text?: string }> })
245-.content;
251+const content = (
252+harnessMessage as { content: string | Array<{ type: string; text?: string }> }
253+).content;
246254if (typeof content === "string") {
247255chars = content.length;
248256} else if (Array.isArray(content)) {
@@ -255,7 +263,7 @@ export function estimateTokens(message: AgentMessage): number {
255263return Math.ceil(chars / 4);
256264}
257265case "assistant": {
258-const assistant = message;
266+const assistant = harnessMessage;
259267for (const block of assistant.content) {
260268if (block.type === "text") {
261269chars += block.text.length;
@@ -269,10 +277,10 @@ export function estimateTokens(message: AgentMessage): number {
269277}
270278case "custom":
271279case "toolResult": {
272-if (typeof message.content === "string") {
273-chars = message.content.length;
280+if (typeof harnessMessage.content === "string") {
281+chars = harnessMessage.content.length;
274282} else {
275-for (const block of message.content) {
283+for (const block of harnessMessage.content) {
276284if (block.type === "text" && block.text) {
277285chars += block.text.length;
278286}
@@ -284,12 +292,12 @@ export function estimateTokens(message: AgentMessage): number {
284292return Math.ceil(chars / 4);
285293}
286294case "bashExecution": {
287-chars = message.command.length + message.output.length;
295+chars = harnessMessage.command.length + harnessMessage.output.length;
288296return Math.ceil(chars / 4);
289297}
290298case "branchSummary":
291299case "compactionSummary": {
292-chars = message.summary.length;
300+chars = harnessMessage.summary.length;
293301return Math.ceil(chars / 4);
294302}
295303}
@@ -306,7 +314,7 @@ function findValidCutPoints(
306314const entry = entries[i];
307315switch (entry.type) {
308316case "message": {
309-const role = entry.message.role;
317+const role = (entry.message as HarnessMessage).role;
310318switch (role) {
311319case "bashExecution":
312320case "custom":
@@ -351,7 +359,7 @@ export function findTurnStartIndex(
351359return i;
352360}
353361if (entry.type === "message") {
354-const role = entry.message.role;
362+const role = (entry.message as HarnessMessage).role;
355363if (role === "user" || role === "bashExecution") {
356364return i;
357365}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。