summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-12-26 19:31:42 -0500
committerDax Raad <[email protected]>2025-12-26 19:31:48 -0500
commited06de5e307c386f6aaf6294ea614deb64ddad30 (patch)
tree52216db6d2f4f789236d2b919519c111aaf54b9e
parent52b99622ad0c01d11a5f8a5826ed955f6aa13dca (diff)
downloadopencode-ed06de5e307c386f6aaf6294ea614deb64ddad30.tar.gz
opencode-ed06de5e307c386f6aaf6294ea614deb64ddad30.zip
core: add configurable compaction settings to allow users to disable auto-compaction and pruning via config instead of flags
-rw-r--r--packages/opencode/src/config/config.ts14
-rw-r--r--packages/opencode/src/session/compaction.ts10
-rw-r--r--packages/opencode/src/session/prompt.ts2
3 files changed, 21 insertions, 5 deletions
diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts
index 3350cf8f6..c94a34be0 100644
--- a/packages/opencode/src/config/config.ts
+++ b/packages/opencode/src/config/config.ts
@@ -141,6 +141,14 @@ export namespace Config {
if (!result.keybinds) result.keybinds = Info.shape.keybinds.parse({})
+ // Apply flag overrides for compaction settings
+ if (Flag.OPENCODE_DISABLE_AUTOCOMPACT) {
+ result.compaction = { ...result.compaction, auto: false }
+ }
+ if (Flag.OPENCODE_DISABLE_PRUNE) {
+ result.compaction = { ...result.compaction, prune: false }
+ }
+
return {
config: result,
directories,
@@ -791,6 +799,12 @@ export namespace Config {
url: z.string().optional().describe("Enterprise URL"),
})
.optional(),
+ compaction: z
+ .object({
+ auto: z.boolean().optional().describe("Enable automatic compaction when context is full (default: true)"),
+ prune: z.boolean().optional().describe("Enable pruning of old tool outputs (default: true)"),
+ })
+ .optional(),
experimental: z
.object({
hook: z
diff --git a/packages/opencode/src/session/compaction.ts b/packages/opencode/src/session/compaction.ts
index 339ba2f42..b3d17794b 100644
--- a/packages/opencode/src/session/compaction.ts
+++ b/packages/opencode/src/session/compaction.ts
@@ -7,13 +7,13 @@ import { Provider } from "../provider/provider"
import { MessageV2 } from "./message-v2"
import z from "zod"
import { SessionPrompt } from "./prompt"
-import { Flag } from "../flag/flag"
import { Token } from "../util/token"
import { Log } from "../util/log"
import { SessionProcessor } from "./processor"
import { fn } from "@/util/fn"
import { Agent } from "@/agent/agent"
import { Plugin } from "@/plugin"
+import { Config } from "@/config/config"
export namespace SessionCompaction {
const log = Log.create({ service: "session.compaction" })
@@ -27,8 +27,9 @@ export namespace SessionCompaction {
),
}
- export function isOverflow(input: { tokens: MessageV2.Assistant["tokens"]; model: Provider.Model }) {
- if (Flag.OPENCODE_DISABLE_AUTOCOMPACT) return false
+ export async function isOverflow(input: { tokens: MessageV2.Assistant["tokens"]; model: Provider.Model }) {
+ const config = await Config.get()
+ if ((config.compaction?.auto ?? true) === false) return false
const context = input.model.limit.context
if (context === 0) return false
const count = input.tokens.input + input.tokens.cache.read + input.tokens.output
@@ -46,7 +47,8 @@ export namespace SessionCompaction {
// calls. then erases output of previous tool calls. idea is to throw away old
// tool calls that are no longer relevant.
export async function prune(input: { sessionID: string }) {
- if (Flag.OPENCODE_DISABLE_PRUNE) return
+ const config = await Config.get()
+ if ((config.compaction?.prune ?? true) === false) return
log.info("pruning")
const msgs = await Session.messages({ sessionID: input.sessionID })
let total = 0
diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts
index fabe3fa51..19dc90b3b 100644
--- a/packages/opencode/src/session/prompt.ts
+++ b/packages/opencode/src/session/prompt.ts
@@ -459,7 +459,7 @@ export namespace SessionPrompt {
if (
lastFinished &&
lastFinished.summary !== true &&
- SessionCompaction.isOverflow({ tokens: lastFinished.tokens, model })
+ (await SessionCompaction.isOverflow({ tokens: lastFinished.tokens, model }))
) {
await SessionCompaction.create({
sessionID,