Skip to content

Commit 9ae6b21

Browse files
authored
feat(plugin): add session title hook and request options bag (#47663)
1 parent c7dd0c8 commit 9ae6b21

22 files changed

Lines changed: 377 additions & 324 deletions

‎packages/core/src/session/compaction.ts‎

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
Message,
1212
type ContentPart,
1313
} from "@opencode/ai"
14-
import { Agent } from "@opencode/schema/agent"
1514
import { SessionError } from "@opencode/schema/session-error"
1615
import { Context, Effect, Layer, Stream } from "effect"
1716
import { Bus } from "../bus.js"
@@ -97,7 +96,7 @@ export type Editor = {
9796

9897
export type AutoInput = {
9998
readonly context: SessionContext.Loaded
100-
readonly prepare: SessionModelRequest.Interface["prepare"]
99+
readonly prepare: SessionModelRequest.Interface["compaction"]
101100
/** Known overflow must recover from durable history, not submit the overflowing native window again. */
102101
readonly overflow?: boolean
103102
}
@@ -120,7 +119,7 @@ export type ManualInput = {
120119
SessionContext.Loaded & { readonly instructionUpdate: string },
121120
SessionRunnerModel.Error | AgentNotFoundError | Instructions.InitializationBlocked
122121
>
123-
readonly prepare: SessionModelRequest.Interface["prepare"]
122+
readonly prepare: SessionModelRequest.Interface["compaction"]
124123
}
125124

126125
type ExecuteInput = AutoInput & {
@@ -428,22 +427,16 @@ export const layer = Layer.effect(
428427
messages,
429428
})
430429
return input.prepare({
431-
kind: "compaction",
432-
scope: {
433-
session: context.session,
434-
agentID: Agent.ID.make("compaction"),
435-
contextAgentID: context.agent.id,
436-
model: context.model,
437-
tools: context.tools,
438-
},
439-
transcript: {
440-
system: transcript.system,
441-
messages: [
442-
...transcript.messages,
443-
...(input.instructionUpdate ? [Message.system(input.instructionUpdate)] : []),
444-
...prompt,
445-
],
446-
},
430+
session: context.session,
431+
agent: context.agent.id,
432+
model: context.model,
433+
tools: context.tools,
434+
system: transcript.system,
435+
messages: [
436+
...transcript.messages,
437+
...(input.instructionUpdate ? [Message.system(input.instructionUpdate)] : []),
438+
...prompt,
439+
],
447440
webSocket,
448441
})
449442
}
@@ -478,7 +471,7 @@ export const layer = Layer.effect(
478471
"Provider compaction requires the endpoint in provider/model settings, not a model.request rewrite",
479472
)
480473
const transient = SessionRunnerRetry.transient(yield* SessionRunnerRetry.policy(context.session.id), {
481-
agent: Agent.ID.make("compaction"),
474+
agent: context.agent.id,
482475
model: context.model.ref,
483476
hook: prepared.retry,
484477
})
@@ -580,7 +573,7 @@ export const layer = Layer.effect(
580573
])
581574
// Both requests share the retry allowance; rejected output never enters the reminder request.
582575
const transient = SessionRunnerRetry.transient(yield* SessionRunnerRetry.policy(context.session.id), {
583-
agent: Agent.ID.make("compaction"),
576+
agent: context.agent.id,
584577
model: context.model.ref,
585578
hook: prepared.retry,
586579
})

‎packages/core/src/session/context.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export interface Interface {
6565
}
6666
| undefined
6767
>
68-
readonly prepare: SessionModelRequest.Interface["prepare"]
68+
readonly request: SessionModelRequest.Interface
6969
}
7070

7171
/** Location-scoped model-context loader for durable Session Steps. */
@@ -84,7 +84,7 @@ const layer = Layer.effect(
8484
const mcpInstructions = yield* McpInstructions.Service
8585
const mcpTools = yield* McpTool.Service
8686
const models = yield* SessionRunnerModel.Service
87-
const modelRequests = yield* SessionModelRequest.Service
87+
const request = yield* SessionModelRequest.Service
8888
const referenceInstructions = yield* ReferenceInstructions.Service
8989
const skillInstructions = yield* SkillInstructions.Service
9090
const store = yield* SessionStore.Service
@@ -173,7 +173,7 @@ const layer = Layer.effect(
173173
}
174174
})
175175

176-
return Service.of({ select, load, resolveModel, selectTitle, prepare: modelRequests.prepare })
176+
return Service.of({ select, load, resolveModel, selectTitle, request })
177177
}),
178178
)
179179

‎packages/core/src/session/generate.ts‎

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,17 @@ export const generate = Effect.fn("SessionGenerate.generate")(function* (input:
4343
initial: history.initial,
4444
messages: history.messages,
4545
})
46-
const prepared = yield* context.prepare({
47-
kind: "generate",
48-
scope: { session: selection.session, agentID: selection.agent.id, model, tools: selection.tools },
49-
transcript: {
50-
system: transcript.system,
51-
messages: [
52-
...transcript.messages,
53-
...(history.instructionUpdate ? [Message.system(history.instructionUpdate)] : []),
54-
Message.user(input.prompt),
55-
],
56-
},
46+
const prepared = yield* context.request.generate({
47+
session: selection.session,
48+
agent: selection.agent.id,
49+
model,
50+
tools: selection.tools,
51+
system: transcript.system,
52+
messages: [
53+
...transcript.messages,
54+
...(history.instructionUpdate ? [Message.system(history.instructionUpdate)] : []),
55+
Message.user(input.prompt),
56+
],
5757
})
5858
yield* Effect.logInfo("sending session generation request", {
5959
sessionID: selection.session.id,

0 commit comments

Comments
 (0)