kimi-code/apps/vscode/shared/fork-turn-index.ts
qer d1ca65e1de
feat(vscode): migrate extension to Node SDK (#1769)
* feat(vscode): migrate extension to Node SDK

* fix(vscode): address CI failures

* fix(vis): handle token count records

* fix(vscode): keep chat toolbar and header readable at narrow widths

* fix(vscode): map yolo to core yolo permission and honor the global yolo setting

* docs(vscode): record Node SDK migration design

* docs(vscode): split breaking changes out of the 0.6.0 changelog

* fix(vscode): keep a resumed session's thinking effort instead of reapplying the default

* fix(vscode): announce session status when a view attaches so the display matches it

* fix(vscode): align webview thinking effort handling with the TUI
2026-07-16 17:27:21 +08:00

43 lines
1.1 KiB
TypeScript

interface ForkTurnItem {
readonly type: string;
}
interface ForkTurnMessage {
readonly role: "user" | "assistant";
readonly forkable?: boolean;
readonly steps?: readonly {
readonly items: readonly ForkTurnItem[];
}[];
}
/** Return the core's zero-based user-visible turn index for an assistant bubble. */
export function getForkTurnIndex(
messages: readonly ForkTurnMessage[],
messageIndex: number,
): number | undefined {
const target = messages[messageIndex];
if (target?.role !== "assistant" || target.forkable === false) return undefined;
let visibleTurns = 0;
for (let index = 0; index <= messageIndex; index += 1) {
const message = messages[index];
if (message === undefined) continue;
if (message.role === "user" && message.forkable !== false) {
visibleTurns += 1;
continue;
}
if (message.role === "assistant") {
visibleTurns += countSteers(message);
}
}
return visibleTurns - 1;
}
function countSteers(message: ForkTurnMessage): number {
return (
message.steps?.reduce(
(count, step) => count + step.items.filter((item) => item.type === "steer").length,
0,
) ?? 0
);
}