Buckets:
| import { HttpRecorder } from "@opencode-ai/http-recorder" | |
| import { HttpRecorderInternal } from "@opencode-ai/http-recorder/internal" | |
| import * as OpenAIChat from "@opencode-ai/llm/protocols/openai-chat" | |
| import { Auth, LLMClient, RequestExecutor } from "@opencode-ai/llm/route" | |
| import { Database } from "@opencode-ai/core/database/database" | |
| import { EventV2 } from "@opencode-ai/core/event" | |
| import { EventTable } from "@opencode-ai/core/event/sql" | |
| import { PermissionV2 } from "@opencode-ai/core/permission" | |
| import { AgentV2 } from "@opencode-ai/core/agent" | |
| import { Config } from "@opencode-ai/core/config" | |
| import { Project } from "@opencode-ai/core/project" | |
| import { ProjectTable } from "@opencode-ai/core/project/sql" | |
| import { AbsolutePath } from "@opencode-ai/core/schema" | |
| import { SessionV2 } from "@opencode-ai/core/session" | |
| import { Prompt } from "@opencode-ai/core/session/prompt" | |
| import { SessionProjector } from "@opencode-ai/core/session/projector" | |
| import { SessionExecution } from "@opencode-ai/core/session/execution" | |
| import { SessionRunCoordinator } from "@opencode-ai/core/session/run-coordinator" | |
| import * as SessionRunnerLLM from "@opencode-ai/core/session/runner/llm" | |
| import { SessionRunnerModel } from "@opencode-ai/core/session/runner/model" | |
| import { ToolRegistry } from "@opencode-ai/core/tool/registry" | |
| import { SessionTable } from "@opencode-ai/core/session/sql" | |
| import { SessionStore } from "@opencode-ai/core/session/store" | |
| import { Location } from "@opencode-ai/core/location" | |
| import { SystemContextRegistry } from "@opencode-ai/core/system-context/registry" | |
| import { SystemContext } from "@opencode-ai/core/system-context" | |
| import { SkillGuidance } from "@opencode-ai/core/skill/guidance" | |
| import { ReferenceGuidance } from "@opencode-ai/core/reference/guidance" | |
| import { describe, expect } from "bun:test" | |
| import { eq } from "drizzle-orm" | |
| import { Effect, Layer } from "effect" | |
| import path from "node:path" | |
| import { testEffect } from "./lib/effect" | |
| const database = Database.layerFromPath(":memory:") | |
| const events = EventV2.layer.pipe(Layer.provide(database)) | |
| const projector = SessionProjector.layer.pipe(Layer.provide(events), Layer.provide(database)) | |
| const store = SessionStore.layer.pipe(Layer.provide(database)) | |
| const cassette = | |
| process.env.RECORD === "true" | |
| ? HttpRecorderInternal.cassetteLayer("session-runner/openai-chat-streams-text", { | |
| directory: path.resolve(import.meta.dir, "fixtures/recordings"), | |
| mode: "record", | |
| }) | |
| : HttpRecorder.http("session-runner/openai-chat-streams-text", { | |
| directory: path.resolve(import.meta.dir, "fixtures/recordings"), | |
| }) | |
| const executor = RequestExecutor.layer.pipe(Layer.provide(cassette)) | |
| const client = LLMClient.layer.pipe(Layer.provide(executor)) | |
| const permission = Layer.succeed( | |
| PermissionV2.Service, | |
| PermissionV2.Service.of({ | |
| assert: () => Effect.die("unused"), | |
| ask: () => Effect.die("unused"), | |
| reply: () => Effect.die("unused"), | |
| get: () => Effect.die("unused"), | |
| forSession: () => Effect.die("unused"), | |
| list: () => Effect.die("unused"), | |
| }), | |
| ) | |
| const registry = ToolRegistry.defaultLayer.pipe(Layer.provide(permission)) | |
| const agents = AgentV2.layer | |
| const model = OpenAIChat.route | |
| .with({ | |
| endpoint: { baseURL: "https://api.openai.com/v1" }, | |
| auth: Auth.bearer(process.env.OPENAI_API_KEY ?? "fixture"), | |
| generation: { maxTokens: 20, temperature: 0 }, | |
| }) | |
| .model({ id: "gpt-4o-mini" }) | |
| const models = SessionRunnerModel.layerWith(() => Effect.succeed(model)) | |
| const systemContext = SystemContextRegistry.layer | |
| const location = Location.layer({ directory: AbsolutePath.make("/project") }).pipe(Layer.provide(Project.defaultLayer)) | |
| const skillGuidance = Layer.mock(SkillGuidance.Service, { load: () => Effect.succeed(SystemContext.empty) }) | |
| const referenceGuidance = Layer.mock(ReferenceGuidance.Service, { load: () => Effect.succeed(SystemContext.empty) }) | |
| const config = Layer.succeed(Config.Service, Config.Service.of({ entries: () => Effect.succeed([]) })) | |
| const runner = SessionRunnerLLM.defaultLayer.pipe( | |
| Layer.provide(database), | |
| Layer.provide(store), | |
| Layer.provide(events), | |
| Layer.provide(client), | |
| Layer.provide(registry), | |
| Layer.provide(models), | |
| Layer.provide(systemContext), | |
| Layer.provide(location), | |
| Layer.provide(agents), | |
| Layer.provide(skillGuidance), | |
| Layer.provide(referenceGuidance), | |
| Layer.provide(config), | |
| ) | |
| const coordinator = SessionRunCoordinator.layer.pipe(Layer.provide(runner)) | |
| const execution = Layer.effect( | |
| SessionExecution.Service, | |
| SessionRunCoordinator.Service.pipe( | |
| Effect.map((coordinator) => | |
| SessionExecution.Service.of({ | |
| resume: coordinator.run, | |
| wake: coordinator.wake, | |
| interrupt: coordinator.interrupt, | |
| }), | |
| ), | |
| ), | |
| ).pipe(Layer.provide(coordinator)) | |
| const sessions = SessionV2.layer.pipe( | |
| Layer.provide(events), | |
| Layer.provide(database), | |
| Layer.provide(store), | |
| Layer.provide(Project.defaultLayer), | |
| Layer.provide(execution), | |
| ) | |
| const it = testEffect( | |
| Layer.mergeAll( | |
| database, | |
| events, | |
| projector, | |
| store, | |
| executor, | |
| client, | |
| permission, | |
| agents, | |
| registry, | |
| models, | |
| systemContext, | |
| location, | |
| skillGuidance, | |
| config, | |
| runner, | |
| coordinator, | |
| execution, | |
| sessions, | |
| ), | |
| ) | |
| const sessionID = SessionV2.ID.make("ses_runner_recorded") | |
| describe("SessionRunnerLLM recorded", () => { | |
| it.effect("executes one recorded V2 prompt through the recorded HTTP transport", () => | |
| Effect.gen(function* () { | |
| const { db } = yield* Database.Service | |
| yield* db | |
| .insert(ProjectTable) | |
| .values({ id: Project.ID.global, worktree: AbsolutePath.make("/project"), sandboxes: [] }) | |
| .onConflictDoNothing() | |
| .run() | |
| .pipe(Effect.orDie) | |
| yield* db | |
| .insert(SessionTable) | |
| .values({ | |
| id: sessionID, | |
| project_id: Project.ID.global, | |
| slug: "test", | |
| directory: "/project", | |
| title: "test", | |
| version: "test", | |
| }) | |
| .onConflictDoNothing() | |
| .run() | |
| .pipe(Effect.orDie) | |
| const session = yield* SessionV2.Service | |
| const prompt = yield* session.prompt({ | |
| sessionID, | |
| prompt: new Prompt({ text: "Say hello in one short sentence." }), | |
| resume: false, | |
| }) | |
| yield* session.resume(sessionID) | |
| const messages = yield* session.context(sessionID) | |
| expect(messages).toHaveLength(2) | |
| expect(messages[0]).toMatchObject({ id: prompt.id, type: "user", text: "Say hello in one short sentence." }) | |
| expect(messages[1]).toMatchObject({ type: "assistant", agent: "build", finish: "stop" }) | |
| expect(messages[1]?.type === "assistant" ? messages[1].content : []).toMatchObject([ | |
| { type: "text", text: "Hello!" }, | |
| ]) | |
| expect( | |
| (yield* db | |
| .select({ type: EventTable.type }) | |
| .from(EventTable) | |
| .where(eq(EventTable.aggregate_id, sessionID)) | |
| .orderBy(EventTable.seq) | |
| .all()).map((event) => event.type), | |
| ).toEqual([ | |
| "session.next.prompt.admitted.1", | |
| "session.next.prompt.promoted.1", | |
| "session.next.step.started.1", | |
| "session.next.text.started.1", | |
| "session.next.text.ended.1", | |
| "session.next.step.ended.2", | |
| ]) | |
| }), | |
| ) | |
| }) | |
Xet Storage Details
- Size:
- 7.33 kB
- Xet hash:
- 5df1b0502e0d5ac475bb9a0984ed44ea8315d10e5c42194eebce855cd5182c48
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.