|
|
@@ -1,6 +1,6 @@
|
|
|
-import { NodeFileSystem } from "@effect/platform-node"
|
|
|
import { SessionV1 } from "@opencode-ai/core/v1/session"
|
|
|
import { Database } from "@opencode-ai/core/database/database"
|
|
|
+import { LayerNode } from "@opencode-ai/core/effect/layer-node"
|
|
|
import { EventV2Bridge } from "@/event-v2-bridge"
|
|
|
import { expect } from "bun:test"
|
|
|
import { tool } from "ai"
|
|
|
@@ -8,11 +8,6 @@ import { Cause, Effect, Exit, Fiber, Layer, Stream } from "effect"
|
|
|
import path from "path"
|
|
|
import z from "zod"
|
|
|
import type { Agent } from "../../src/agent/agent"
|
|
|
-import { Agent as AgentSvc } from "../../src/agent/agent"
|
|
|
-import { Config } from "@/config/config"
|
|
|
-import { Image } from "@/image/image"
|
|
|
-import { Permission } from "../../src/permission"
|
|
|
-import { Plugin } from "../../src/plugin"
|
|
|
import { Provider } from "@/provider/provider"
|
|
|
|
|
|
import { Session } from "@/session/session"
|
|
|
@@ -22,7 +17,6 @@ import { SessionProcessor } from "../../src/session/processor"
|
|
|
import { MessageID, PartID, SessionID } from "../../src/session/schema"
|
|
|
import { SessionStatus } from "../../src/session/status"
|
|
|
import { SessionSummary } from "../../src/session/summary"
|
|
|
-import { Snapshot } from "../../src/snapshot"
|
|
|
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
|
|
|
import { provideTmpdirInstance, provideTmpdirServer } from "../fixture/fixture"
|
|
|
import { testEffect } from "../lib/effect"
|
|
|
@@ -31,6 +25,7 @@ import { RuntimeFlags } from "@/effect/runtime-flags"
|
|
|
import { ProviderV2 } from "@opencode-ai/core/provider"
|
|
|
import { ModelV2 } from "@opencode-ai/core/model"
|
|
|
import { SessionEvent } from "@opencode-ai/core/session/event"
|
|
|
+import { SessionProjector } from "@opencode-ai/core/session/projector"
|
|
|
import { LLMEvent } from "@opencode-ai/llm"
|
|
|
|
|
|
const summary = Layer.succeed(
|
|
|
@@ -171,29 +166,23 @@ const assistant = Effect.fn("TestSession.assistant")(function* (
|
|
|
return msg
|
|
|
})
|
|
|
|
|
|
-const status = SessionStatus.layer.pipe(Layer.provideMerge(EventV2Bridge.defaultLayer))
|
|
|
-const infra = Layer.mergeAll(NodeFileSystem.layer, CrossSpawnSpawner.defaultLayer)
|
|
|
-const deps = Layer.mergeAll(
|
|
|
- Session.defaultLayer,
|
|
|
- Snapshot.defaultLayer,
|
|
|
- AgentSvc.defaultLayer,
|
|
|
- Permission.defaultLayer,
|
|
|
- Plugin.defaultLayer,
|
|
|
- Config.defaultLayer,
|
|
|
- LLM.defaultLayer,
|
|
|
- Provider.defaultLayer,
|
|
|
- status,
|
|
|
- Database.defaultLayer,
|
|
|
- EventV2Bridge.defaultLayer,
|
|
|
-).pipe(Layer.provideMerge(infra))
|
|
|
-const env = Layer.mergeAll(
|
|
|
- TestLLMServer.layer,
|
|
|
- SessionProcessor.layer.pipe(
|
|
|
- Layer.provide(summary),
|
|
|
- Layer.provide(Image.defaultLayer),
|
|
|
- Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })),
|
|
|
- Layer.provideMerge(deps),
|
|
|
- ),
|
|
|
+const root = LayerNode.group([
|
|
|
+ SessionProcessor.node,
|
|
|
+ Session.node,
|
|
|
+ SessionProjector.node,
|
|
|
+ Provider.node,
|
|
|
+ Database.node,
|
|
|
+ EventV2Bridge.node,
|
|
|
+ SessionStatus.node,
|
|
|
+ CrossSpawnSpawner.node,
|
|
|
+])
|
|
|
+const replacements = [
|
|
|
+ LayerNode.replace(SessionSummary.node, summary),
|
|
|
+ LayerNode.replace(RuntimeFlags.node, RuntimeFlags.layer({ experimentalEventSystem: true })),
|
|
|
+]
|
|
|
+const env = LayerNode.buildLayer(
|
|
|
+ LayerNode.group([root, LayerNode.make(TestLLMServer.layer, [])]),
|
|
|
+ { replacements },
|
|
|
)
|
|
|
|
|
|
const it = testEffect(env)
|
|
|
@@ -218,13 +207,9 @@ const providerErrorLLM = Layer.succeed(
|
|
|
),
|
|
|
}),
|
|
|
)
|
|
|
-const providerErrorEnv = SessionProcessor.layer.pipe(
|
|
|
- Layer.provide(summary),
|
|
|
- Layer.provide(Image.defaultLayer),
|
|
|
- Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })),
|
|
|
- Layer.provide(providerErrorLLM),
|
|
|
- Layer.provideMerge(deps),
|
|
|
-)
|
|
|
+const providerErrorEnv = LayerNode.buildLayer(root, {
|
|
|
+ replacements: [...replacements, LayerNode.replace(LLM.node, providerErrorLLM)],
|
|
|
+})
|
|
|
const itProviderError = testEffect(providerErrorEnv)
|
|
|
|
|
|
const fragmentFailureLLM = Layer.succeed(
|
|
|
@@ -241,13 +226,9 @@ const fragmentFailureLLM = Layer.succeed(
|
|
|
),
|
|
|
}),
|
|
|
)
|
|
|
-const fragmentFailureEnv = SessionProcessor.layer.pipe(
|
|
|
- Layer.provide(summary),
|
|
|
- Layer.provide(Image.defaultLayer),
|
|
|
- Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })),
|
|
|
- Layer.provide(fragmentFailureLLM),
|
|
|
- Layer.provideMerge(deps),
|
|
|
-)
|
|
|
+const fragmentFailureEnv = LayerNode.buildLayer(root, {
|
|
|
+ replacements: [...replacements, LayerNode.replace(LLM.node, fragmentFailureLLM)],
|
|
|
+})
|
|
|
const itFragmentFailure = testEffect(fragmentFailureEnv)
|
|
|
|
|
|
const boot = Effect.fn("test.boot")(function* () {
|