summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorKit Langton <[email protected]>2026-04-09 22:28:11 -0400
committerGitHub <[email protected]>2026-04-09 22:28:11 -0400
commiteca11ca71ab34d5818a18754981c97bc03b62bc1 (patch)
tree0cd5df618f39ced07e6fd0da962442e441927d4e
parent17bd16667c9706c1f210bb36e01a0d23bcdddb02 (diff)
downloadopencode-eca11ca71ab34d5818a18754981c97bc03b62bc1.tar.gz
opencode-eca11ca71ab34d5818a18754981c97bc03b62bc1.zip
refactor(effect): use SessionRevert service in prompt (#21796)
-rw-r--r--packages/opencode/src/session/compaction.ts20
-rw-r--r--packages/opencode/src/session/processor.ts24
-rw-r--r--packages/opencode/src/session/prompt.ts50
-rw-r--r--packages/opencode/src/session/revert.ts19
-rw-r--r--packages/opencode/src/session/summary.ts14
-rw-r--r--packages/opencode/src/tool/registry.ts27
-rw-r--r--packages/opencode/test/session/prompt-effect.test.ts2
-rw-r--r--packages/opencode/test/session/snapshot-tool-race.test.ts2
8 files changed, 75 insertions, 83 deletions
diff --git a/packages/opencode/src/session/compaction.ts b/packages/opencode/src/session/compaction.ts
index 975327198..937aa7132 100644
--- a/packages/opencode/src/session/compaction.ts
+++ b/packages/opencode/src/session/compaction.ts
@@ -377,17 +377,15 @@ When constructing the summary, try to stick to this template:
}),
)
- export const defaultLayer = Layer.unwrap(
- Effect.sync(() =>
- layer.pipe(
- Layer.provide(Provider.defaultLayer),
- Layer.provide(Session.defaultLayer),
- Layer.provide(SessionProcessor.defaultLayer),
- Layer.provide(Agent.defaultLayer),
- Layer.provide(Plugin.defaultLayer),
- Layer.provide(Bus.layer),
- Layer.provide(Config.defaultLayer),
- ),
+ export const defaultLayer = Layer.suspend(() =>
+ layer.pipe(
+ Layer.provide(Provider.defaultLayer),
+ Layer.provide(Session.defaultLayer),
+ Layer.provide(SessionProcessor.defaultLayer),
+ Layer.provide(Agent.defaultLayer),
+ Layer.provide(Plugin.defaultLayer),
+ Layer.provide(Bus.layer),
+ Layer.provide(Config.defaultLayer),
),
)
diff --git a/packages/opencode/src/session/processor.ts b/packages/opencode/src/session/processor.ts
index 2e4d34bfc..99389de1e 100644
--- a/packages/opencode/src/session/processor.ts
+++ b/packages/opencode/src/session/processor.ts
@@ -594,19 +594,17 @@ export namespace SessionProcessor {
}),
)
- export const defaultLayer = Layer.unwrap(
- Effect.sync(() =>
- layer.pipe(
- Layer.provide(Session.defaultLayer),
- Layer.provide(Snapshot.defaultLayer),
- Layer.provide(Agent.defaultLayer),
- Layer.provide(LLM.defaultLayer),
- Layer.provide(Permission.defaultLayer),
- Layer.provide(Plugin.defaultLayer),
- Layer.provide(SessionStatus.layer.pipe(Layer.provide(Bus.layer))),
- Layer.provide(Bus.layer),
- Layer.provide(Config.defaultLayer),
- ),
+ export const defaultLayer = Layer.suspend(() =>
+ layer.pipe(
+ Layer.provide(Session.defaultLayer),
+ Layer.provide(Snapshot.defaultLayer),
+ Layer.provide(Agent.defaultLayer),
+ Layer.provide(LLM.defaultLayer),
+ Layer.provide(Permission.defaultLayer),
+ Layer.provide(Plugin.defaultLayer),
+ Layer.provide(SessionStatus.defaultLayer),
+ Layer.provide(Bus.layer),
+ Layer.provide(Config.defaultLayer),
),
)
}
diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts
index 7f0a014ab..33be6b9c5 100644
--- a/packages/opencode/src/session/prompt.ts
+++ b/packages/opencode/src/session/prompt.ts
@@ -99,6 +99,7 @@ export namespace SessionPrompt {
const scope = yield* Scope.Scope
const instruction = yield* Instruction.Service
const state = yield* SessionRunState.Service
+ const revert = yield* SessionRevert.Service
const cancel = Effect.fn("SessionPrompt.cancel")(function* (sessionID: SessionID) {
log.info("cancel", { sessionID })
@@ -708,7 +709,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the
const ctx = yield* InstanceState.context
const session = yield* sessions.get(input.sessionID)
if (session.revert) {
- yield* Effect.promise(() => SessionRevert.cleanup(session))
+ yield* revert.cleanup(session)
}
const agent = yield* agents.get(input.agent)
if (!agent) {
@@ -1269,7 +1270,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the
const prompt: (input: PromptInput) => Effect.Effect<MessageV2.WithParts> = Effect.fn("SessionPrompt.prompt")(
function* (input: PromptInput) {
const session = yield* sessions.get(input.sessionID)
- yield* Effect.promise(() => SessionRevert.cleanup(session))
+ yield* revert.cleanup(session)
const message = yield* createUserMessage(input)
yield* sessions.touch(input.sessionID)
@@ -1665,29 +1666,28 @@ NOTE: At any point in time through this workflow you should feel free to ask the
}),
)
- const defaultLayer = Layer.unwrap(
- Effect.sync(() =>
- layer.pipe(
- Layer.provide(SessionRunState.layer),
- Layer.provide(SessionStatus.layer),
- Layer.provide(SessionCompaction.defaultLayer),
- Layer.provide(SessionProcessor.defaultLayer),
- Layer.provide(Command.defaultLayer),
- Layer.provide(Permission.defaultLayer),
- Layer.provide(MCP.defaultLayer),
- Layer.provide(LSP.defaultLayer),
- Layer.provide(FileTime.defaultLayer),
- Layer.provide(ToolRegistry.defaultLayer),
- Layer.provide(Truncate.layer),
- Layer.provide(Provider.defaultLayer),
- Layer.provide(Instruction.defaultLayer),
- Layer.provide(AppFileSystem.defaultLayer),
- Layer.provide(Plugin.defaultLayer),
- Layer.provide(Session.defaultLayer),
- Layer.provide(Agent.defaultLayer),
- Layer.provide(Bus.layer),
- Layer.provide(CrossSpawnSpawner.defaultLayer),
- ),
+ const defaultLayer = Layer.suspend(() =>
+ layer.pipe(
+ Layer.provide(SessionRunState.defaultLayer),
+ Layer.provide(SessionStatus.defaultLayer),
+ Layer.provide(SessionCompaction.defaultLayer),
+ Layer.provide(SessionProcessor.defaultLayer),
+ Layer.provide(Command.defaultLayer),
+ Layer.provide(Permission.defaultLayer),
+ Layer.provide(MCP.defaultLayer),
+ Layer.provide(LSP.defaultLayer),
+ Layer.provide(FileTime.defaultLayer),
+ Layer.provide(ToolRegistry.defaultLayer),
+ Layer.provide(Truncate.defaultLayer),
+ Layer.provide(Provider.defaultLayer),
+ Layer.provide(Instruction.defaultLayer),
+ Layer.provide(AppFileSystem.defaultLayer),
+ Layer.provide(Plugin.defaultLayer),
+ Layer.provide(Session.defaultLayer),
+ Layer.provide(SessionRevert.defaultLayer),
+ Layer.provide(Agent.defaultLayer),
+ Layer.provide(Bus.layer),
+ Layer.provide(CrossSpawnSpawner.defaultLayer),
),
)
const { runPromise } = makeRuntime(Service, defaultLayer)
diff --git a/packages/opencode/src/session/revert.ts b/packages/opencode/src/session/revert.ts
index a2d517f77..1216362ca 100644
--- a/packages/opencode/src/session/revert.ts
+++ b/packages/opencode/src/session/revert.ts
@@ -150,17 +150,14 @@ export namespace SessionRevert {
}),
)
- export const defaultLayer = Layer.unwrap(
- Effect.sync(() =>
- layer.pipe(
- Layer.provide(SessionRunState.layer),
- Layer.provide(SessionStatus.layer),
- Layer.provide(Session.defaultLayer),
- Layer.provide(Snapshot.defaultLayer),
- Layer.provide(Storage.defaultLayer),
- Layer.provide(Bus.layer),
- Layer.provide(SessionSummary.defaultLayer),
- ),
+ export const defaultLayer = Layer.suspend(() =>
+ layer.pipe(
+ Layer.provide(SessionRunState.defaultLayer),
+ Layer.provide(Session.defaultLayer),
+ Layer.provide(Snapshot.defaultLayer),
+ Layer.provide(Storage.defaultLayer),
+ Layer.provide(Bus.layer),
+ Layer.provide(SessionSummary.defaultLayer),
),
)
diff --git a/packages/opencode/src/session/summary.ts b/packages/opencode/src/session/summary.ts
index f2b53f3ba..2f07a0f5d 100644
--- a/packages/opencode/src/session/summary.ts
+++ b/packages/opencode/src/session/summary.ts
@@ -150,14 +150,12 @@ export namespace SessionSummary {
}),
)
- export const defaultLayer = Layer.unwrap(
- Effect.sync(() =>
- layer.pipe(
- Layer.provide(Session.defaultLayer),
- Layer.provide(Snapshot.defaultLayer),
- Layer.provide(Storage.defaultLayer),
- Layer.provide(Bus.layer),
- ),
+ export const defaultLayer = Layer.suspend(() =>
+ layer.pipe(
+ Layer.provide(Session.defaultLayer),
+ Layer.provide(Snapshot.defaultLayer),
+ Layer.provide(Storage.defaultLayer),
+ Layer.provide(Bus.layer),
),
)
diff --git a/packages/opencode/src/tool/registry.ts b/packages/opencode/src/tool/registry.ts
index dbb8fb286..9c0771b8d 100644
--- a/packages/opencode/src/tool/registry.ts
+++ b/packages/opencode/src/tool/registry.ts
@@ -289,21 +289,18 @@ export namespace ToolRegistry {
}),
)
- export const defaultLayer = Layer.unwrap(
- Effect.sync(() =>
- layer.pipe(
- Layer.provide(Config.defaultLayer),
- Layer.provide(Plugin.defaultLayer),
- Layer.provide(Question.defaultLayer),
- Layer.provide(Todo.defaultLayer),
- Layer.provide(Skill.defaultLayer),
- Layer.provide(Agent.defaultLayer),
- Layer.provide(Skill.defaultLayer),
- Layer.provide(LSP.defaultLayer),
- Layer.provide(FileTime.defaultLayer),
- Layer.provide(Instruction.defaultLayer),
- Layer.provide(AppFileSystem.defaultLayer),
- ),
+ export const defaultLayer = Layer.suspend(() =>
+ layer.pipe(
+ Layer.provide(Config.defaultLayer),
+ Layer.provide(Plugin.defaultLayer),
+ Layer.provide(Question.defaultLayer),
+ Layer.provide(Todo.defaultLayer),
+ Layer.provide(Skill.defaultLayer),
+ Layer.provide(Agent.defaultLayer),
+ Layer.provide(LSP.defaultLayer),
+ Layer.provide(FileTime.defaultLayer),
+ Layer.provide(Instruction.defaultLayer),
+ Layer.provide(AppFileSystem.defaultLayer),
),
)
diff --git a/packages/opencode/test/session/prompt-effect.test.ts b/packages/opencode/test/session/prompt-effect.test.ts
index e9893760c..215f6668c 100644
--- a/packages/opencode/test/session/prompt-effect.test.ts
+++ b/packages/opencode/test/session/prompt-effect.test.ts
@@ -25,6 +25,7 @@ import { SessionCompaction } from "../../src/session/compaction"
import { Instruction } from "../../src/session/instruction"
import { SessionProcessor } from "../../src/session/processor"
import { SessionPrompt } from "../../src/session/prompt"
+import { SessionRevert } from "../../src/session/revert"
import { SessionRunState } from "../../src/session/run-state"
import { MessageID, PartID, SessionID } from "../../src/session/schema"
import { SessionStatus } from "../../src/session/status"
@@ -178,6 +179,7 @@ function makeHttp() {
return Layer.mergeAll(
TestLLMServer.layer,
SessionPrompt.layer.pipe(
+ Layer.provide(SessionRevert.defaultLayer),
Layer.provideMerge(run),
Layer.provideMerge(compact),
Layer.provideMerge(proc),
diff --git a/packages/opencode/test/session/snapshot-tool-race.test.ts b/packages/opencode/test/session/snapshot-tool-race.test.ts
index 75ba8ef16..ae67983bf 100644
--- a/packages/opencode/test/session/snapshot-tool-race.test.ts
+++ b/packages/opencode/test/session/snapshot-tool-race.test.ts
@@ -18,6 +18,7 @@ import path from "path"
import { Session } from "../../src/session"
import { LLM } from "../../src/session/llm"
import { SessionPrompt } from "../../src/session/prompt"
+import { SessionRevert } from "../../src/session/revert"
import { SessionSummary } from "../../src/session/summary"
import { MessageV2 } from "../../src/session/message-v2"
import { Log } from "../../src/util/log"
@@ -143,6 +144,7 @@ function makeHttp() {
return Layer.mergeAll(
TestLLMServer.layer,
SessionPrompt.layer.pipe(
+ Layer.provide(SessionRevert.defaultLayer),
Layer.provideMerge(run),
Layer.provideMerge(compact),
Layer.provideMerge(proc),