Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
154afc7
chat messages transform hook and chat messages type
jorgenwh Dec 7, 2025
f93b0ff
fix typecheck errors
jorgenwh Dec 7, 2025
1f2ac0d
Update packages/opencode/src/session/prompt.ts
jorgenwh Dec 7, 2025
ce47e3c
fix github-actions bot bug
jorgenwh Dec 7, 2025
81efaf5
add removed filter for messages
jorgenwh Dec 7, 2025
5cedfa9
Merge branch 'dev' of https://github.com/sst/opencode into chat-messa…
jorgenwh Dec 8, 2025
22b0cab
Merge branch 'dev' of https://github.com/sst/opencode into chat-messa…
jorgenwh Dec 8, 2025
1b1ea7d
make hook experimental for now
jorgenwh Dec 8, 2025
12de5ec
make hook experimental for now
jorgenwh Dec 8, 2025
e9e96d3
Merge branch 'dev' into chat-messages-transform-hook
jorgenwh Dec 8, 2025
5e4b9cc
Merge branch 'dev' into chat-messages-transform-hook
jorgenwh Dec 8, 2025
b7e5b5b
Merge branch 'dev' into chat-messages-transform-hook
jorgenwh Dec 9, 2025
c770f75
Merge branch 'dev' into chat-messages-transform-hook
jorgenwh Dec 9, 2025
877b9ec
pull dev
jorgenwh Dec 10, 2025
183b8de
mimic messagev2 instead of vercel ai's model message
jorgenwh Dec 10, 2025
e90ff06
Merge branch 'dev' into chat-messages-transform-hook
jorgenwh Dec 10, 2025
268f47d
pulled dev
jorgenwh Dec 10, 2025
6e06cee
pulled dev
jorgenwh Dec 11, 2025
f5b009b
Merge branch 'chat-messages-transform-hook' of github.com:jorgenwh/op…
jorgenwh Dec 11, 2025
5441400
cleanup
jorgenwh Dec 11, 2025
7d9b083
cleanup
jorgenwh Dec 11, 2025
65078de
cleanup
jorgenwh Dec 11, 2025
9e52984
use MessageV2.WithParts directly
jorgenwh Dec 11, 2025
3c5089e
remove unnecessary import
jorgenwh Dec 11, 2025
ee7ad25
Merge branch 'dev' into chat-messages-transform-hook
jorgenwh Dec 11, 2025
c52baf7
Merge branch 'dev' into chat-messages-transform-hook
jorgenwh Dec 11, 2025
0a73c56
Merge branch 'dev' into chat-messages-transform-hook
jorgenwh Dec 11, 2025
4f4f65b
Merge branch 'dev' into chat-messages-transform-hook
jorgenwh Dec 11, 2025
743870c
use remeda copy instead of ugly JSON trick
jorgenwh Dec 11, 2025
47acc80
Merge branch 'dev' into chat-messages-transform-hook
jorgenwh Dec 11, 2025
388a442
Merge branch 'dev' into chat-messages-transform-hook
jorgenwh Dec 11, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 23 additions & 17 deletions packages/opencode/src/session/prompt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ 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 { mergeDeep, pipe } from "remeda"
import { clone, mergeDeep, pipe } from "remeda"
import { ToolRegistry } from "../tool/registry"
import { Wildcard } from "../util/wildcard"
import { MCP } from "../mcp"
Expand Down Expand Up @@ -520,28 +520,33 @@ export namespace SessionPrompt {
})
}

const messages = [
// Deep copy message history so that modifications made by plugins do not
// affect the original messages
const sessionMessages = clone(
msgs.filter((m) => {
if (m.info.role !== "assistant" || m.info.error === undefined) {
return true
}
if (
MessageV2.AbortedError.isInstance(m.info.error) &&
m.parts.some((part) => part.type !== "step-start" && part.type !== "reasoning")
) {
return true
}
return false
}),
)

await Plugin.trigger("experimental.chat.messages.transform", {}, { messages: sessionMessages })

const messages: ModelMessage[] = [
...system.map(
(x): ModelMessage => ({
role: "system",
content: x,
}),
),
...MessageV2.toModelMessage(
msgs.filter((m) => {
if (m.info.role !== "assistant" || m.info.error === undefined) {
return true
}
if (
MessageV2.AbortedError.isInstance(m.info.error) &&
m.parts.some((part) => part.type !== "step-start" && part.type !== "reasoning")
) {
return true
}

return false
}),
),
...MessageV2.toModelMessage(sessionMessages),
...(isLastStep
? [
{
Expand All @@ -551,6 +556,7 @@ export namespace SessionPrompt {
]
: []),
]

const result = await processor.process({
onError(error) {
log.error("stream error", {
Expand Down
10 changes: 10 additions & 0 deletions packages/plugin/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import type {
Provider,
Permission,
UserMessage,
Message,
Part,
Auth,
Config,
Expand Down Expand Up @@ -175,6 +176,15 @@ export interface Hooks {
metadata: any
},
) => Promise<void>
"experimental.chat.messages.transform"?: (
input: {},
output: {
messages: {
info: Message
parts: Part[]
}[]
},
) => Promise<void>
"experimental.text.complete"?: (
input: { sessionID: string; messageID: string; partID: string },
output: { text: string },
Expand Down