| import { createMemo, type Setter } from "solid-js" |
| import { useKV } from "./kv" |
|
|
| export type ThinkingMode = "show" | "hide" |
|
|
| const MODES: readonly ThinkingMode[] = ["show", "hide"] as const |
|
|
| |
| |
| |
| |
| export function reasoningSummary(text: string) { |
| const content = text.trim() |
| const match = content.match(/^\*\*([^*\n]+)\*\*(?:\r?\n\r?\n|$)/) |
| if (!match) return { title: null, body: content } |
| return { title: match[1].trim(), body: content.slice(match[0].length).trimEnd() } |
| } |
|
|
| export function isThinkingMode(value: unknown): value is ThinkingMode { |
| return typeof value === "string" && (MODES as readonly string[]).includes(value) |
| } |
|
|
| |
| export function nextThinkingMode(current: ThinkingMode): ThinkingMode { |
| const idx = MODES.indexOf(current) |
| return MODES[(idx + 1) % MODES.length] ?? "show" |
| } |
|
|
| export function useThinkingMode() { |
| const kv = useKV() |
| |
| |
| |
| const hadStored = kv.get("thinking_mode") !== undefined |
| const legacy = kv.get("thinking_visibility") |
| const [stored, setStored] = kv.signal<ThinkingMode>("thinking_mode", "hide") |
|
|
| |
| |
| |
| |
| |
| const set = (next: ThinkingMode | ((prev: ThinkingMode) => ThinkingMode)) => { |
| if (typeof next === "function") setStored(next as Setter<ThinkingMode>) |
| else setStored(() => next) |
| } |
|
|
| |
| |
| |
| if (!hadStored) { |
| if (legacy === true) set("show") |
| else if (legacy === false) set("hide") |
| } |
|
|
| if ((stored() as string) === "minimal") set("hide") |
|
|
| const mode = createMemo<ThinkingMode>(() => { |
| const value = stored() |
| return isThinkingMode(value) ? value : "hide" |
| }) |
|
|
| return { |
| mode, |
| set, |
| } |
| } |
|
|