Files
openchamber/packages/ui/src/stores/utils/messageUtils.ts
T
Bohdan Triapitsyn f2507d58cf feat: migrate to OpenCode SDK v2
Update all import statements to use @opencode-ai/sdk/v2
Modify Vite configurations to alias new SDK path
Update API client method signatures for SDK v2 compatibility
2026-01-03 13:39:59 +02:00

68 lines
2.8 KiB
TypeScript

import type { Part } from "@opencode-ai/sdk/v2";
const extractTextFromDelta = (delta: unknown): string => {
if (!delta) return '';
if (typeof delta === 'string') return delta;
if (Array.isArray(delta)) {
return delta.map((item) => extractTextFromDelta(item)).join('');
}
if (typeof delta === 'object') {
if (typeof (delta as { text?: unknown }).text === 'string') {
return (delta as { text: string }).text;
}
if (Array.isArray((delta as { content?: unknown[] }).content)) {
return (delta as { content: unknown[] }).content.map((item: unknown) => extractTextFromDelta(item)).join('');
}
}
return '';
};
export const extractTextFromPart = (part: unknown): string => {
if (!part) return '';
const typedPart = part as { text?: string | unknown[]; delta?: unknown; content?: string | unknown[] };
if (typeof typedPart.text === 'string') return typedPart.text;
if (Array.isArray(typedPart.text)) {
return typedPart.text.map((item: unknown) => (typeof item === 'string' ? item : extractTextFromPart(item))).join('');
}
const deltaText = extractTextFromDelta(typedPart.delta);
if (deltaText) return deltaText;
if (typeof typedPart.content === 'string') return typedPart.content;
if (Array.isArray(typedPart.content)) {
return typedPart.content
.map((item: unknown) => {
if (typeof item === 'string') return item;
if (item && typeof item === 'object') {
const typedItem = item as { text?: string; delta?: unknown };
return typedItem.text || extractTextFromDelta(typedItem.delta) || '';
}
return '';
})
.join('');
}
return '';
};
export const normalizeStreamingPart = (incoming: Part, existing?: Part): Part => {
const normalized: { type?: string; text?: string; delta?: unknown; [key: string]: unknown } = { ...incoming } as { type?: string; text?: string; delta?: unknown; [key: string]: unknown };
normalized.type = normalized.type || 'text';
if (normalized.type === 'text') {
const existingText = existing && typeof (existing as { text?: string }).text === 'string' ? (existing as { text: string }).text : '';
const directText = typeof normalized.text === 'string' ? normalized.text : '';
const deltaText = extractTextFromDelta((incoming as { delta?: unknown }).delta);
if (directText) {
normalized.text = directText;
} else if (deltaText) {
normalized.text = existingText ? `${existingText}${deltaText}` : deltaText;
} else if (existingText) {
normalized.text = existingText;
} else {
normalized.text = '';
}
delete normalized.delta;
}
return normalized as Part;
};