diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx index 99a90ab46ac..8fefcb20394 100644 --- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx @@ -509,6 +509,14 @@ export function Prompt(props: PromptProps) { command: inputText, }) setStore("mode", "normal") + } else if (inputText.match(/^\/(compact|summarize)(\s|$)/)) { + const args = inputText.replace(/^\/(compact|summarize)\s*/, "") + sdk.client.session.summarize({ + sessionID, + modelID: selectedModel.modelID, + providerID: selectedModel.providerID, + args: args || undefined, + }) } else if ( inputText.startsWith("/") && iife(() => { diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts index 8957228ad41..21826865f87 100644 --- a/packages/opencode/src/server/server.ts +++ b/packages/opencode/src/server/server.ts @@ -1054,6 +1054,7 @@ export namespace Server { z.object({ providerID: z.string(), modelID: z.string(), + args: z.string().optional(), }), ), async (c) => { @@ -1076,6 +1077,7 @@ export namespace Server { modelID: body.modelID, }, auto: false, + args: body.args, }) await SessionPrompt.loop(sessionID) return c.json(true) diff --git a/packages/opencode/src/session/compaction.ts b/packages/opencode/src/session/compaction.ts index 3e4c8020dee..29e475f4e9a 100644 --- a/packages/opencode/src/session/compaction.ts +++ b/packages/opencode/src/session/compaction.ts @@ -91,6 +91,9 @@ export namespace SessionCompaction { auto: boolean }) { const userMessage = input.messages.findLast((m) => m.info.id === input.parentID)!.info as MessageV2.User + const compactionPart = input.messages + .findLast((m) => m.info.id === input.parentID)! + .parts.find((p): p is MessageV2.CompactionPart => p.type === "compaction") const agent = await Agent.get("compaction") const model = agent.model ? await Provider.getModel(agent.model.providerID, agent.model.modelID) @@ -129,7 +132,7 @@ export namespace SessionCompaction { // Allow plugins to inject context for compaction const compacting = await Plugin.trigger( "experimental.session.compacting", - { sessionID: input.sessionID }, + { sessionID: input.sessionID, args: compactionPart?.args }, { context: [] }, ) const result = await processor.process({ @@ -195,6 +198,7 @@ export namespace SessionCompaction { modelID: z.string(), }), auto: z.boolean(), + args: z.string().optional(), }), async (input) => { const msg = await Session.updateMessage({ @@ -213,6 +217,7 @@ export namespace SessionCompaction { sessionID: msg.sessionID, type: "compaction", auto: input.auto, + args: input.args, }) }, ) diff --git a/packages/opencode/src/session/message-v2.ts b/packages/opencode/src/session/message-v2.ts index 4781b0c47b1..76b685674e7 100644 --- a/packages/opencode/src/session/message-v2.ts +++ b/packages/opencode/src/session/message-v2.ts @@ -150,6 +150,7 @@ export namespace MessageV2 { export const CompactionPart = PartBase.extend({ type: z.literal("compaction"), auto: z.boolean(), + args: z.string().optional(), }).meta({ ref: "CompactionPart", }) diff --git a/packages/plugin/src/index.ts b/packages/plugin/src/index.ts index 487e6ed3ee2..d6c365d05da 100644 --- a/packages/plugin/src/index.ts +++ b/packages/plugin/src/index.ts @@ -195,7 +195,10 @@ export interface Hooks { * Called before session compaction starts. Allows plugins to append * additional context to the compaction prompt. */ - "experimental.session.compacting"?: (input: { sessionID: string }, output: { context: string[] }) => Promise + "experimental.session.compacting"?: ( + input: { sessionID: string; args?: string }, + output: { context: string[] }, + ) => Promise "experimental.text.complete"?: ( input: { sessionID: string; messageID: string; partID: string }, output: { text: string }, diff --git a/packages/sdk/js/src/v2/gen/sdk.gen.ts b/packages/sdk/js/src/v2/gen/sdk.gen.ts index 16fe07ae4a8..d935bf811dc 100644 --- a/packages/sdk/js/src/v2/gen/sdk.gen.ts +++ b/packages/sdk/js/src/v2/gen/sdk.gen.ts @@ -1127,6 +1127,7 @@ export class Session extends HeyApiClient { directory?: string providerID?: string modelID?: string + args?: string }, options?: Options, ) { @@ -1139,6 +1140,7 @@ export class Session extends HeyApiClient { { in: "query", key: "directory" }, { in: "body", key: "providerID" }, { in: "body", key: "modelID" }, + { in: "body", key: "args" }, ], }, ], diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index 00f209c6d88..242388c26ce 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -405,6 +405,7 @@ export type CompactionPart = { messageID: string type: "compaction" auto: boolean + args?: string } export type Part = @@ -2733,6 +2734,7 @@ export type SessionSummarizeData = { body?: { providerID: string modelID: string + args?: string } path: { /**