refactor(session): inline init route orchestration (#21754)

This commit is contained in:
Kit Langton
2026-04-09 16:28:42 -04:00
committed by GitHub
parent 7202b3a325
commit b2f621b897
2 changed files with 18 additions and 35 deletions
+17 -2
View File
@@ -14,6 +14,7 @@ import { SessionSummary } from "@/session/summary"
import { Todo } from "../../session/todo" import { Todo } from "../../session/todo"
import { Agent } from "../../agent/agent" import { Agent } from "../../agent/agent"
import { Snapshot } from "@/snapshot" import { Snapshot } from "@/snapshot"
import { Command } from "../../command"
import { Log } from "../../util/log" import { Log } from "../../util/log"
import { Permission } from "@/permission" import { Permission } from "@/permission"
import { PermissionID } from "@/permission/schema" import { PermissionID } from "@/permission/schema"
@@ -292,6 +293,7 @@ export const SessionRoutes = lazy(() =>
return c.json(session) return c.json(session)
}, },
) )
// TODO(v2): remove this dedicated route and rely on the normal `/init` command flow.
.post( .post(
"/:sessionID/init", "/:sessionID/init",
describeRoute({ describeRoute({
@@ -317,11 +319,24 @@ export const SessionRoutes = lazy(() =>
sessionID: SessionID.zod, sessionID: SessionID.zod,
}), }),
), ),
validator("json", Session.initialize.schema.omit({ sessionID: true })), validator(
"json",
z.object({
modelID: ModelID.zod,
providerID: ProviderID.zod,
messageID: MessageID.zod,
}),
),
async (c) => { async (c) => {
const sessionID = c.req.valid("param").sessionID const sessionID = c.req.valid("param").sessionID
const body = c.req.valid("json") const body = c.req.valid("json")
await Session.initialize({ ...body, sessionID }) await SessionPrompt.command({
sessionID,
messageID: body.messageID,
model: body.providerID + "/" + body.modelID,
command: Command.Default.INIT,
arguments: "",
})
return c.json(true) return c.json(true)
}, },
) )
+1 -33
View File
@@ -20,16 +20,13 @@ import { updateSchema } from "../util/update-schema"
import { MessageV2 } from "./message-v2" import { MessageV2 } from "./message-v2"
import { Instance } from "../project/instance" import { Instance } from "../project/instance"
import { InstanceState } from "@/effect/instance-state" import { InstanceState } from "@/effect/instance-state"
import { SessionPrompt } from "./prompt"
import { fn } from "@/util/fn" import { fn } from "@/util/fn"
import { Command } from "../command"
import { Snapshot } from "@/snapshot" import { Snapshot } from "@/snapshot"
import { ProjectID } from "../project/schema" import { ProjectID } from "../project/schema"
import { WorkspaceID } from "../control-plane/schema" import { WorkspaceID } from "../control-plane/schema"
import { SessionID, MessageID, PartID } from "./schema" import { SessionID, MessageID, PartID } from "./schema"
import type { Provider } from "@/provider/provider" import type { Provider } from "@/provider/provider"
import { ModelID, ProviderID } from "@/provider/schema"
import { Permission } from "@/permission" import { Permission } from "@/permission"
import { Global } from "@/global" import { Global } from "@/global"
import type { LanguageModelV2Usage } from "@ai-sdk/provider" import type { LanguageModelV2Usage } from "@ai-sdk/provider"
@@ -358,12 +355,6 @@ export namespace Session {
field: string field: string
delta: string delta: string
}) => Effect.Effect<void> }) => Effect.Effect<void>
readonly initialize: (input: {
sessionID: SessionID
modelID: ModelID
providerID: ProviderID
messageID: MessageID
}) => Effect.Effect<void>
} }
export class Service extends ServiceMap.Service<Service, Interface>()("@opencode/Session") {} export class Service extends ServiceMap.Service<Service, Interface>()("@opencode/Session") {}
@@ -616,7 +607,7 @@ export namespace Session {
const diff = Effect.fn("Session.diff")(function* (sessionID: SessionID) { const diff = Effect.fn("Session.diff")(function* (sessionID: SessionID) {
return yield* Effect.tryPromise(() => Storage.read<Snapshot.FileDiff[]>(["session_diff", sessionID])).pipe( return yield* Effect.tryPromise(() => Storage.read<Snapshot.FileDiff[]>(["session_diff", sessionID])).pipe(
Effect.orElseSucceed(() => [] as Snapshot.FileDiff[]), Effect.orElseSucceed((): Snapshot.FileDiff[] => []),
) )
}) })
@@ -665,23 +656,6 @@ export namespace Session {
yield* bus.publish(MessageV2.Event.PartDelta, input) yield* bus.publish(MessageV2.Event.PartDelta, input)
}) })
const initialize = Effect.fn("Session.initialize")(function* (input: {
sessionID: SessionID
modelID: ModelID
providerID: ProviderID
messageID: MessageID
}) {
yield* Effect.promise(() =>
SessionPrompt.command({
sessionID: input.sessionID,
messageID: input.messageID,
model: input.providerID + "/" + input.modelID,
command: Command.Default.INIT,
arguments: "",
}),
)
})
return Service.of({ return Service.of({
create, create,
fork, fork,
@@ -705,7 +679,6 @@ export namespace Session {
updatePart, updatePart,
getPart, getPart,
updatePartDelta, updatePartDelta,
initialize,
}) })
}), }),
) )
@@ -895,9 +868,4 @@ export namespace Session {
}), }),
(input) => runPromise((svc) => svc.updatePartDelta(input)), (input) => runPromise((svc) => svc.updatePartDelta(input)),
) )
export const initialize = fn(
z.object({ sessionID: SessionID.zod, modelID: ModelID.zod, providerID: ProviderID.zod, messageID: MessageID.zod }),
(input) => runPromise((svc) => svc.initialize(input)),
)
} }