|
13 | 13 | */ |
14 | 14 | import { expect } from "bun:test" |
15 | 15 | import { Effect, Layer } from "effect" |
16 | | -import { FetchHttpClient } from "effect/unstable/http" |
| 16 | +import { LayerNode } from "@opencode-ai/core/effect/layer-node" |
17 | 17 | import fs from "fs/promises" |
18 | 18 | import path from "path" |
19 | 19 | import { Session } from "@/session/session" |
20 | | -import { LLM } from "../../src/session/llm" |
21 | 20 | import { SessionPrompt } from "../../src/session/prompt" |
22 | | -import { SessionRevert } from "../../src/session/revert" |
23 | 21 | import { SessionSummary } from "../../src/session/summary" |
24 | 22 | import { MessageV2 } from "../../src/session/message-v2" |
25 | 23 | import { SessionV1 } from "@opencode-ai/core/v1/session" |
| 24 | +import { Database } from "@opencode-ai/core/database/database" |
| 25 | +import { SessionProjector } from "@opencode-ai/core/session/projector" |
26 | 26 | import { provideTmpdirServer } from "../fixture/fixture" |
27 | 27 | import { testEffect } from "../lib/effect" |
28 | 28 | import { TestLLMServer } from "../lib/llm-server" |
29 | 29 |
|
30 | | -// Same layer setup as prompt-effect.test.ts |
31 | | -import { NodeFileSystem } from "@effect/platform-node" |
32 | | -import { Database } from "@opencode-ai/core/database/database" |
33 | | -import { EventV2Bridge } from "@/event-v2-bridge" |
34 | | -import { Agent as AgentSvc } from "../../src/agent/agent" |
35 | | -import { BackgroundJob } from "@/background/job" |
36 | | -import { Git } from "../../src/git" |
37 | | -import { Command } from "../../src/command" |
38 | | -import { Config } from "@/config/config" |
39 | 30 | import { LSP } from "@/lsp/lsp" |
40 | 31 | import { MCP } from "../../src/mcp" |
41 | | -import { Permission } from "../../src/permission" |
42 | | -import { Plugin } from "../../src/plugin" |
43 | | -import { Provider as ProviderSvc } from "@/provider/provider" |
44 | | -import { Env } from "../../src/env" |
45 | | -import { Question } from "../../src/question" |
46 | | -import { Image } from "../../src/image/image" |
47 | | -import { Skill } from "../../src/skill" |
48 | | -import { SystemPrompt } from "../../src/session/system" |
49 | | -import { Todo } from "../../src/session/todo" |
50 | | -import { SessionCompaction } from "../../src/session/compaction" |
51 | | -import { Instruction } from "../../src/session/instruction" |
52 | | -import { SessionProcessor } from "../../src/session/processor" |
53 | | -import { SessionRunState } from "../../src/session/run-state" |
54 | | -import { SessionStatus } from "../../src/session/status" |
55 | | -import { Snapshot } from "../../src/snapshot" |
56 | | -import { ToolRegistry } from "@/tool/registry" |
57 | | -import { Truncate } from "@/tool/truncate" |
58 | | -import { FSUtil } from "@opencode-ai/core/fs-util" |
59 | 32 | import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner" |
60 | | -import { Ripgrep } from "@opencode-ai/core/ripgrep" |
61 | | -import { Format } from "../../src/format" |
62 | 33 | import { RuntimeFlags } from "@/effect/runtime-flags" |
63 | 34 |
|
64 | 35 | const mcp = Layer.succeed( |
@@ -104,77 +75,24 @@ const lsp = Layer.succeed( |
104 | 75 | }), |
105 | 76 | ) |
106 | 77 |
|
107 | | -const status = SessionStatus.layer.pipe(Layer.provideMerge(EventV2Bridge.defaultLayer)) |
108 | | -const run = SessionRunState.layer.pipe(Layer.provide(status)) |
109 | | -const infra = Layer.mergeAll(NodeFileSystem.layer, CrossSpawnSpawner.defaultLayer) |
110 | | - |
111 | | -function makeHttp() { |
112 | | - const deps = Layer.mergeAll( |
113 | | - Session.defaultLayer, |
114 | | - Snapshot.defaultLayer, |
115 | | - LLM.defaultLayer, |
116 | | - Env.defaultLayer, |
117 | | - AgentSvc.defaultLayer, |
118 | | - Command.defaultLayer, |
119 | | - Permission.defaultLayer, |
120 | | - Plugin.defaultLayer, |
121 | | - Config.defaultLayer, |
122 | | - ProviderSvc.defaultLayer, |
123 | | - lsp, |
124 | | - mcp, |
125 | | - FSUtil.defaultLayer, |
126 | | - BackgroundJob.defaultLayer, |
127 | | - status, |
128 | | - Database.defaultLayer, |
129 | | - EventV2Bridge.defaultLayer, |
130 | | - ).pipe(Layer.provideMerge(infra)) |
131 | | - const question = Question.layer.pipe(Layer.provideMerge(deps)) |
132 | | - const todo = Todo.layer.pipe(Layer.provideMerge(deps)) |
133 | | - const registry = ToolRegistry.layer.pipe( |
134 | | - Layer.provide(Skill.defaultLayer), |
135 | | - Layer.provide(FetchHttpClient.layer), |
136 | | - Layer.provide(CrossSpawnSpawner.defaultLayer), |
137 | | - Layer.provide(Git.defaultLayer), |
138 | | - Layer.provide(Ripgrep.defaultLayer), |
139 | | - Layer.provide(Format.defaultLayer), |
140 | | - Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })), |
141 | | - Layer.provideMerge(todo), |
142 | | - Layer.provideMerge(question), |
143 | | - Layer.provideMerge(deps), |
144 | | - ) |
145 | | - const trunc = Truncate.layer.pipe(Layer.provideMerge(deps)) |
146 | | - const proc = SessionProcessor.layer.pipe( |
147 | | - Layer.provide(SessionSummary.defaultLayer), |
148 | | - Layer.provide(Image.defaultLayer), |
149 | | - Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })), |
150 | | - Layer.provideMerge(deps), |
151 | | - ) |
152 | | - const compact = SessionCompaction.layer.pipe( |
153 | | - Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })), |
154 | | - Layer.provideMerge(proc), |
155 | | - Layer.provideMerge(deps), |
156 | | - ) |
157 | | - return Layer.mergeAll( |
158 | | - TestLLMServer.layer, |
159 | | - SessionSummary.defaultLayer, |
160 | | - SessionPrompt.layer.pipe( |
161 | | - Layer.provide(SessionRevert.defaultLayer), |
162 | | - Layer.provide(Image.defaultLayer), |
163 | | - Layer.provide(SessionSummary.defaultLayer), |
164 | | - Layer.provideMerge(run), |
165 | | - Layer.provideMerge(compact), |
166 | | - Layer.provideMerge(proc), |
167 | | - Layer.provideMerge(registry), |
168 | | - Layer.provideMerge(trunc), |
169 | | - Layer.provide(Instruction.defaultLayer), |
170 | | - Layer.provide(SystemPrompt.defaultLayer), |
171 | | - Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })), |
172 | | - Layer.provideMerge(deps), |
173 | | - ), |
174 | | - ) |
175 | | -} |
176 | | - |
177 | | -const it = testEffect(makeHttp()) |
| 78 | +const root = LayerNode.group([ |
| 79 | + SessionPrompt.node, |
| 80 | + Session.node, |
| 81 | + SessionProjector.node, |
| 82 | + SessionSummary.node, |
| 83 | + Database.node, |
| 84 | + CrossSpawnSpawner.node, |
| 85 | + LayerNode.make(TestLLMServer.layer, []), |
| 86 | +]) |
| 87 | +const it = testEffect( |
| 88 | + LayerNode.buildLayer(root, { |
| 89 | + replacements: [ |
| 90 | + LayerNode.replace(MCP.node, mcp), |
| 91 | + LayerNode.replace(LSP.node, lsp), |
| 92 | + LayerNode.replace(RuntimeFlags.node, RuntimeFlags.layer({ experimentalEventSystem: true })), |
| 93 | + ], |
| 94 | + }), |
| 95 | +) |
178 | 96 |
|
179 | 97 | const providerCfg = (url: string) => ({ |
180 | 98 | provider: { |
|
0 commit comments