Use structuredClone instead of remeda's clone

Avoids pathological cases when cloning large objects

Fixes #14344
This commit is contained in:
Michael Hart 2026-02-20 10:53:52 +11:00
commit c1217a9861
No known key found for this signature in database
GPG key ID: 081B1F0DEBFB575B
4 changed files with 5 additions and 8 deletions

View file

@ -3,7 +3,6 @@ import { Global } from "@/global"
import { Filesystem } from "@/util/filesystem"
import { onMount } from "solid-js"
import { createStore, produce } from "solid-js/store"
import { clone } from "remeda"
import { createSimpleContext } from "../../context/helper"
import { appendFile, writeFile } from "fs/promises"
import type { AgentPart, FilePart, TextPart } from "@opencode-ai/sdk/v2"
@ -83,7 +82,7 @@ export const { use: usePromptHistory, provider: PromptHistoryProvider } = create
return store.history.at(store.index)
},
append(item: PromptInfo) {
const entry = clone(item)
const entry = structuredClone(item)
let trimmed = false
setStore(
produce((draft) => {

View file

@ -3,7 +3,6 @@ import { Global } from "@/global"
import { Filesystem } from "@/util/filesystem"
import { onMount } from "solid-js"
import { createStore, produce } from "solid-js/store"
import { clone } from "remeda"
import { createSimpleContext } from "../../context/helper"
import { appendFile, writeFile } from "fs/promises"
import type { PromptInfo } from "./history"
@ -53,7 +52,7 @@ export const { use: usePromptStash, provider: PromptStashProvider } = createSimp
return store.entries
},
push(entry: Omit<StashEntry, "timestamp">) {
const stash = clone({ ...entry, timestamp: Date.now() })
const stash = structuredClone({ ...entry, timestamp: Date.now() })
let trimmed = false
setStore(
produce((draft) => {

View file

@ -11,7 +11,7 @@ import {
tool,
jsonSchema,
} from "ai"
import { clone, mergeDeep, pipe } from "remeda"
import { mergeDeep, pipe } from "remeda"
import { ProviderTransform } from "@/provider/transform"
import { Config } from "@/config/config"
import { Instance } from "@/project/instance"
@ -80,7 +80,7 @@ export namespace LLM {
)
const header = system[0]
const original = clone(system)
const original = structuredClone(system)
await Plugin.trigger(
"experimental.chat.system.transform",
{ sessionID: input.sessionID, model: input.model },

View file

@ -22,7 +22,6 @@ import PROMPT_PLAN from "../session/prompt/plan.txt"
import BUILD_SWITCH from "../session/prompt/build-switch.txt"
import MAX_STEPS from "../session/prompt/max-steps.txt"
import { defer } from "../util/defer"
import { clone } from "remeda"
import { ToolRegistry } from "../tool/registry"
import { MCP } from "../mcp"
import { LSP } from "../lsp"
@ -627,7 +626,7 @@ export namespace SessionPrompt {
})
}
const sessionMessages = clone(msgs)
const sessionMessages = structuredClone(msgs)
// Ephemerally wrap queued user messages with a reminder to stay on track
if (step > 1 && lastFinished) {