summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax <[email protected]>2026-02-19 19:19:53 -0500
committerAiden Cline <[email protected]>2026-02-19 18:37:55 -0600
commit01d518708ac86368463712568e84ef8995d99578 (patch)
treed3476c68e22893be33da1b19add524027851a80c
parentae50f24c0678c58b4e5e796b3ff5b86eeaa3f7fd (diff)
downloadopencode-01d518708ac86368463712568e84ef8995d99578.tar.gz
opencode-01d518708ac86368463712568e84ef8995d99578.zip
remove unnecessary deep clones from session loop and LLM stream (#14354)
-rw-r--r--packages/opencode/src/session/llm.ts6
-rw-r--r--packages/opencode/src/session/prompt.ts9
2 files changed, 4 insertions, 11 deletions
diff --git a/packages/opencode/src/session/llm.ts b/packages/opencode/src/session/llm.ts
index fa8803912..4e42fb0d2 100644
--- a/packages/opencode/src/session/llm.ts
+++ b/packages/opencode/src/session/llm.ts
@@ -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,15 +80,11 @@ export namespace LLM {
)
const header = system[0]
- const original = clone(system)
await Plugin.trigger(
"experimental.chat.system.transform",
{ sessionID: input.sessionID, model: input.model },
{ system },
)
- if (system.length === 0) {
- system.push(...original)
- }
// rejoin to maintain 2-part structure for caching if header unchanged
if (system.length > 2 && system[0] === header) {
const rest = system.slice(1)
diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts
index 6ca93979e..f9229de88 100644
--- a/packages/opencode/src/session/prompt.ts
+++ b/packages/opencode/src/session/prompt.ts
@@ -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,11 +626,9 @@ export namespace SessionPrompt {
})
}
- const sessionMessages = clone(msgs)
-
// Ephemerally wrap queued user messages with a reminder to stay on track
if (step > 1 && lastFinished) {
- for (const msg of sessionMessages) {
+ for (const msg of msgs) {
if (msg.info.role !== "user" || msg.info.id <= lastFinished.id) continue
for (const part of msg.parts) {
if (part.type !== "text" || part.ignored || part.synthetic) continue
@@ -648,7 +645,7 @@ export namespace SessionPrompt {
}
}
- await Plugin.trigger("experimental.chat.messages.transform", {}, { messages: sessionMessages })
+ await Plugin.trigger("experimental.chat.messages.transform", {}, { messages: msgs })
// Build system prompt, adding structured output instruction if needed
const system = [...(await SystemPrompt.environment(model)), ...(await InstructionPrompt.system())]
@@ -664,7 +661,7 @@ export namespace SessionPrompt {
sessionID,
system,
messages: [
- ...MessageV2.toModelMessages(sessionMessages, model),
+ ...MessageV2.toModelMessages(msgs, model),
...(isLastStep
? [
{