Skip to content

Commit dcbf11f

Browse files
authored
refactor(session): remove summary async facades (#22337)
1 parent 14ccff4 commit dcbf11f

File tree

8 files changed

+68
-26
lines changed

8 files changed

+68
-26
lines changed

packages/opencode/src/server/instance/session.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -474,10 +474,14 @@ export const SessionRoutes = lazy(() =>
474474
async (c) => {
475475
const query = c.req.valid("query")
476476
const params = c.req.valid("param")
477-
const result = await SessionSummary.diff({
478-
sessionID: params.sessionID,
479-
messageID: query.messageID,
480-
})
477+
const result = await AppRuntime.runPromise(
478+
SessionSummary.Service.use((summary) =>
479+
summary.diff({
480+
sessionID: params.sessionID,
481+
messageID: query.messageID,
482+
}),
483+
),
484+
)
481485
return c.json(result)
482486
},
483487
)

packages/opencode/src/session/processor.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Cause, Deferred, Effect, Layer, Context } from "effect"
1+
import { Cause, Deferred, Effect, Layer, Context, Scope } from "effect"
22
import * as Stream from "effect/Stream"
33
import { Agent } from "@/agent/agent"
44
import { Bus } from "@/bus"
@@ -89,6 +89,7 @@ export namespace SessionProcessor {
8989
| LLM.Service
9090
| Permission.Service
9191
| Plugin.Service
92+
| SessionSummary.Service
9293
| SessionStatus.Service
9394
> = Layer.effect(
9495
Service,
@@ -101,6 +102,8 @@ export namespace SessionProcessor {
101102
const llm = yield* LLM.Service
102103
const permission = yield* Permission.Service
103104
const plugin = yield* Plugin.Service
105+
const summary = yield* SessionSummary.Service
106+
const scope = yield* Scope.Scope
104107
const status = yield* SessionStatus.Service
105108

106109
const create = Effect.fn("SessionProcessor.create")(function* (input: Input) {
@@ -385,10 +388,12 @@ export namespace SessionProcessor {
385388
}
386389
ctx.snapshot = undefined
387390
}
388-
SessionSummary.summarize({
389-
sessionID: ctx.sessionID,
390-
messageID: ctx.assistantMessage.parentID,
391-
})
391+
yield* summary
392+
.summarize({
393+
sessionID: ctx.sessionID,
394+
messageID: ctx.assistantMessage.parentID,
395+
})
396+
.pipe(Effect.ignore, Effect.forkIn(scope))
392397
if (
393398
!ctx.assistantMessage.summary &&
394399
isOverflow({ cfg: yield* config.get(), tokens: usage.tokens, model: ctx.model })
@@ -603,6 +608,7 @@ export namespace SessionProcessor {
603608
Layer.provide(LLM.defaultLayer),
604609
Layer.provide(Permission.defaultLayer),
605610
Layer.provide(Plugin.defaultLayer),
611+
Layer.provide(SessionSummary.defaultLayer),
606612
Layer.provide(SessionStatus.defaultLayer),
607613
Layer.provide(Bus.layer),
608614
Layer.provide(Config.defaultLayer),

packages/opencode/src/session/prompt.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ export namespace SessionPrompt {
102102
const instruction = yield* Instruction.Service
103103
const state = yield* SessionRunState.Service
104104
const revert = yield* SessionRevert.Service
105+
const summary = yield* SessionSummary.Service
105106
const sys = yield* SystemPrompt.Service
106107
const llm = yield* LLM.Service
107108

@@ -1444,7 +1445,10 @@ NOTE: At any point in time through this workflow you should feel free to ask the
14441445
})
14451446
}
14461447

1447-
if (step === 1) SessionSummary.summarize({ sessionID, messageID: lastUser.id })
1448+
if (step === 1)
1449+
yield* summary
1450+
.summarize({ sessionID, messageID: lastUser.id })
1451+
.pipe(Effect.ignore, Effect.forkIn(scope))
14481452

14491453
if (step > 1 && lastFinished) {
14501454
for (const m of msgs) {
@@ -1692,6 +1696,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the
16921696
Layer.provide(Plugin.defaultLayer),
16931697
Layer.provide(Session.defaultLayer),
16941698
Layer.provide(SessionRevert.defaultLayer),
1699+
Layer.provide(SessionSummary.defaultLayer),
16951700
Layer.provide(
16961701
Layer.mergeAll(
16971702
Agent.defaultLayer,

packages/opencode/src/session/summary.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import z from "zod"
22
import { Effect, Layer, Context } from "effect"
3-
import { makeRuntime } from "@/effect/run-service"
43
import { Bus } from "@/bus"
54
import { Snapshot } from "@/snapshot"
65
import { Storage } from "@/storage/storage"
@@ -159,17 +158,8 @@ export namespace SessionSummary {
159158
),
160159
)
161160

162-
const { runPromise } = makeRuntime(Service, defaultLayer)
163-
164-
export const summarize = (input: { sessionID: SessionID; messageID: MessageID }) =>
165-
void runPromise((svc) => svc.summarize(input)).catch(() => {})
166-
167161
export const DiffInput = z.object({
168162
sessionID: SessionID.zod,
169163
messageID: MessageID.zod.optional(),
170164
})
171-
172-
export async function diff(input: z.infer<typeof DiffInput>) {
173-
return runPromise((svc) => svc.diff(input))
174-
}
175165
}

packages/opencode/test/session/compaction.test.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { Session } from "../../src/session"
1818
import { MessageV2 } from "../../src/session/message-v2"
1919
import { MessageID, PartID, SessionID } from "../../src/session/schema"
2020
import { SessionStatus } from "../../src/session/status"
21+
import { SessionSummary } from "../../src/session/summary"
2122
import { ModelID, ProviderID } from "../../src/provider/schema"
2223
import type { Provider } from "../../src/provider/provider"
2324
import * as SessionProcessorModule from "../../src/session/processor"
@@ -26,6 +27,15 @@ import { ProviderTest } from "../fake/provider"
2627

2728
Log.init({ print: false })
2829

30+
const summary = Layer.succeed(
31+
SessionSummary.Service,
32+
SessionSummary.Service.of({
33+
summarize: () => Effect.void,
34+
diff: () => Effect.succeed([]),
35+
computeDiff: () => Effect.succeed([]),
36+
}),
37+
)
38+
2939
const ref = {
3040
providerID: ProviderID.make("test"),
3141
modelID: ModelID.make("test-model"),
@@ -194,7 +204,7 @@ function llm() {
194204
function liveRuntime(layer: Layer.Layer<LLM.Service>, provider = ProviderTest.fake()) {
195205
const bus = Bus.layer
196206
const status = SessionStatus.layer.pipe(Layer.provide(bus))
197-
const processor = SessionProcessorModule.SessionProcessor.layer
207+
const processor = SessionProcessorModule.SessionProcessor.layer.pipe(Layer.provide(summary))
198208
return ManagedRuntime.make(
199209
Layer.mergeAll(SessionCompaction.layer.pipe(Layer.provide(processor)), processor, bus, status).pipe(
200210
Layer.provide(provider.layer),

packages/opencode/test/session/processor-effect.test.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { MessageV2 } from "../../src/session/message-v2"
1616
import { SessionProcessor } from "../../src/session/processor"
1717
import { MessageID, PartID, SessionID } from "../../src/session/schema"
1818
import { SessionStatus } from "../../src/session/status"
19+
import { SessionSummary } from "../../src/session/summary"
1920
import { Snapshot } from "../../src/snapshot"
2021
import { Log } from "../../src/util/log"
2122
import * as CrossSpawnSpawner from "../../src/effect/cross-spawn-spawner"
@@ -25,6 +26,15 @@ import { raw, reply, TestLLMServer } from "../lib/llm-server"
2526

2627
Log.init({ print: false })
2728

29+
const summary = Layer.succeed(
30+
SessionSummary.Service,
31+
SessionSummary.Service.of({
32+
summarize: () => Effect.void,
33+
diff: () => Effect.succeed([]),
34+
computeDiff: () => Effect.succeed([]),
35+
}),
36+
)
37+
2838
const ref = {
2939
providerID: ProviderID.make("test"),
3040
modelID: ModelID.make("test-model"),
@@ -156,7 +166,10 @@ const deps = Layer.mergeAll(
156166
Provider.defaultLayer,
157167
status,
158168
).pipe(Layer.provideMerge(infra))
159-
const env = Layer.mergeAll(TestLLMServer.layer, SessionProcessor.layer.pipe(Layer.provideMerge(deps)))
169+
const env = Layer.mergeAll(
170+
TestLLMServer.layer,
171+
SessionProcessor.layer.pipe(Layer.provide(summary), Layer.provideMerge(deps)),
172+
)
160173

161174
const it = testEffect(env)
162175

packages/opencode/test/session/prompt-effect.test.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { LLM } from "../../src/session/llm"
2323
import { MessageV2 } from "../../src/session/message-v2"
2424
import { AppFileSystem } from "../../src/filesystem"
2525
import { SessionCompaction } from "../../src/session/compaction"
26+
import { SessionSummary } from "../../src/session/summary"
2627
import { Instruction } from "../../src/session/instruction"
2728
import { SessionProcessor } from "../../src/session/processor"
2829
import { SessionPrompt } from "../../src/session/prompt"
@@ -46,6 +47,15 @@ import { reply, TestLLMServer } from "../lib/llm-server"
4647

4748
Log.init({ print: false })
4849

50+
const summary = Layer.succeed(
51+
SessionSummary.Service,
52+
SessionSummary.Service.of({
53+
summarize: () => Effect.void,
54+
diff: () => Effect.succeed([]),
55+
computeDiff: () => Effect.succeed([]),
56+
}),
57+
)
58+
4959
const ref = {
5060
providerID: ProviderID.make("test"),
5161
modelID: ModelID.make("test-model"),
@@ -182,12 +192,13 @@ function makeHttp() {
182192
Layer.provideMerge(deps),
183193
)
184194
const trunc = Truncate.layer.pipe(Layer.provideMerge(deps))
185-
const proc = SessionProcessor.layer.pipe(Layer.provideMerge(deps))
195+
const proc = SessionProcessor.layer.pipe(Layer.provide(summary), Layer.provideMerge(deps))
186196
const compact = SessionCompaction.layer.pipe(Layer.provideMerge(proc), Layer.provideMerge(deps))
187197
return Layer.mergeAll(
188198
TestLLMServer.layer,
189199
SessionPrompt.layer.pipe(
190200
Layer.provide(SessionRevert.defaultLayer),
201+
Layer.provide(summary),
191202
Layer.provideMerge(run),
192203
Layer.provideMerge(compact),
193204
Layer.provideMerge(proc),

packages/opencode/test/session/snapshot-tool-race.test.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,14 @@ function makeHttp() {
146146
Layer.provideMerge(deps),
147147
)
148148
const trunc = Truncate.layer.pipe(Layer.provideMerge(deps))
149-
const proc = SessionProcessor.layer.pipe(Layer.provideMerge(deps))
149+
const proc = SessionProcessor.layer.pipe(Layer.provide(SessionSummary.defaultLayer), Layer.provideMerge(deps))
150150
const compact = SessionCompaction.layer.pipe(Layer.provideMerge(proc), Layer.provideMerge(deps))
151151
return Layer.mergeAll(
152152
TestLLMServer.layer,
153+
SessionSummary.defaultLayer,
153154
SessionPrompt.layer.pipe(
154155
Layer.provide(SessionRevert.defaultLayer),
156+
Layer.provide(SessionSummary.defaultLayer),
155157
Layer.provideMerge(run),
156158
Layer.provideMerge(compact),
157159
Layer.provideMerge(proc),
@@ -200,6 +202,7 @@ it.live("tool execution produces non-empty session diff (snapshot race)", () =>
200202
Effect.fnUntraced(function* ({ dir, llm }) {
201203
const prompt = yield* SessionPrompt.Service
202204
const sessions = yield* Session.Service
205+
const summary = yield* SessionSummary.Service
203206

204207
const session = yield* sessions.create({
205208
title: "snapshot race test",
@@ -244,9 +247,9 @@ it.live("tool execution produces non-empty session diff (snapshot race)", () =>
244247
expect(tool?.state.status).toBe("completed")
245248

246249
// Poll for diff — summarize() is fire-and-forget
247-
let diff: Awaited<ReturnType<typeof SessionSummary.diff>> = []
250+
let diff: Array<{ file: string }> = []
248251
for (let i = 0; i < 50; i++) {
249-
diff = yield* Effect.promise(() => SessionSummary.diff({ sessionID: session.id }))
252+
diff = yield* summary.diff({ sessionID: session.id })
250253
if (diff.length > 0) break
251254
yield* Effect.sleep("100 millis")
252255
}

0 commit comments

Comments
 (0)