feat(chat): add local-first conversation workspace

This commit is contained in:
2026-08-13 15:55:15 +08:00
parent d1d50d722c
commit 8991f78f9f
43 changed files with 5450 additions and 592 deletions
+18 -4
View File
@@ -1,10 +1,24 @@
import type {ResponseMetadata} from "./conversation-types";
export function responseMetadata(providerId: string, model: string, startedAt: number, outputTokens: number | undefined | null): ResponseMetadata {
function normalizeTokenCount(value: unknown): number | null {
if (typeof value === "number" && Number.isFinite(value) && value >= 0) return Math.round(value);
if (typeof value === "bigint" && value >= 0n) return Number(value);
if (typeof value === "string") {
const parsed = Number(value);
if (Number.isFinite(parsed) && parsed >= 0) return Math.round(parsed);
}
return null;
}
export function responseMetadata(
providerId: string,
model: string,
startedAt: number,
outputTokens: number | undefined | null,
fallbackOutputTokens?: number | undefined | null
): ResponseMetadata {
const durationMs = Math.max(1, Math.round(performance.now() - startedAt));
const normalizedTokens = typeof outputTokens === "number" && Number.isFinite(outputTokens) && outputTokens >= 0
? Math.round(outputTokens)
: null;
const normalizedTokens = normalizeTokenCount(outputTokens) ?? normalizeTokenCount(fallbackOutputTokens);
const tokensPerSecond = normalizedTokens === null
? null
: Math.round((normalizedTokens / (durationMs / 1000)) * 10) / 10;