31 lines
1.2 KiB
TypeScript
31 lines
1.2 KiB
TypeScript
import type { SessionV1 } from "@opencode-ai/core/v1/session"
|
|
|
|
export { parseGitHubRemote } from "@/util/repository"
|
|
|
|
/**
|
|
* Extracts displayable text from assistant response parts.
|
|
* Returns null for non-text responses (signals summary needed).
|
|
* Throws only for truly empty responses.
|
|
*/
|
|
export function extractResponseText(parts: SessionV1.Part[]): string | null {
|
|
const textPart = parts.findLast((p) => p.type === "text")
|
|
if (textPart) return textPart.text
|
|
|
|
// Non-text parts (tools, reasoning, step-start/step-finish, etc.) - signal summary needed
|
|
if (parts.length > 0) return null
|
|
|
|
throw new Error("Failed to parse response: no parts returned")
|
|
}
|
|
|
|
/**
|
|
* Formats a PROMPT_TOO_LARGE error message with details about files in the prompt.
|
|
* Content is base64 encoded, so we calculate original size by multiplying by 0.75.
|
|
*/
|
|
export function formatPromptTooLargeError(files: { filename: string; content: string }[]): string {
|
|
const fileDetails =
|
|
files.length > 0
|
|
? `\n\nFiles in prompt:\n${files.map((f) => ` - ${f.filename} (${((f.content.length * 0.75) / 1024).toFixed(0)} KB)`).join("\n")}`
|
|
: ""
|
|
return `PROMPT_TOO_LARGE: The prompt exceeds the model's context limit.${fileDetails}`
|
|
}
|