5fd28cffc5
Requested by Sebastian Herrlinger (@kommander). Rebased onto current v2 with conflicts resolved and all required checks passing.
70 lines
2.3 KiB
TypeScript
70 lines
2.3 KiB
TypeScript
import { NodeFileSystem } from "@effect/platform-node"
|
|
import { Global } from "@opencode-ai/util/global"
|
|
import { Effect, Option } from "effect"
|
|
import { expect, mock, test } from "bun:test"
|
|
import { mkdir, rm } from "node:fs/promises"
|
|
import path from "node:path"
|
|
import { Config } from "../src/config"
|
|
import type { MiniCommandInput } from "../src/mini"
|
|
import { OPENCODE_VERSION } from "../src/version"
|
|
|
|
test("mini handler passes resolved CLI keybinds to the runtime", async () => {
|
|
const root = await Bun.$`mktemp -d`.text().then((value) => value.trim())
|
|
const configDirectory = path.join(root, "config")
|
|
const stateDirectory = path.join(root, "state")
|
|
await mkdir(configDirectory, { recursive: true })
|
|
await Bun.write(
|
|
path.join(configDirectory, "cli.json"),
|
|
JSON.stringify({
|
|
keybinds: { "composer.subagent.interrupt": "ctrl+i" },
|
|
leader: { timeout: 321 },
|
|
}),
|
|
)
|
|
let received: MiniCommandInput["tuiConfig"]
|
|
const mini = await import("../src/mini")
|
|
mock.module("../src/mini", () => ({
|
|
...mini,
|
|
validateMiniTerminal() {},
|
|
runMini(input: Pick<MiniCommandInput, "tuiConfig">) {
|
|
received = input.tuiConfig
|
|
return Promise.resolve()
|
|
},
|
|
}))
|
|
const handler = (await import("../src/commands/handlers/mini")).default
|
|
const server = Bun.serve({
|
|
port: 0,
|
|
fetch: () => Response.json({ healthy: true, version: OPENCODE_VERSION, pid: process.pid }),
|
|
})
|
|
|
|
try {
|
|
await Effect.runPromise(
|
|
handler({
|
|
server: Option.some(server.url.toString()),
|
|
standalone: false,
|
|
continue: false,
|
|
session: Option.none(),
|
|
fork: false,
|
|
replay: true as never,
|
|
replayLimit: Option.none(),
|
|
model: Option.none(),
|
|
agent: Option.none(),
|
|
prompt: Option.none(),
|
|
demo: false,
|
|
}).pipe(
|
|
Effect.provide(Config.layer),
|
|
Effect.provide(Global.layerWith({ config: configDirectory, state: stateDirectory })),
|
|
Effect.provide(NodeFileSystem.layer),
|
|
Effect.scoped,
|
|
),
|
|
)
|
|
|
|
const config = await received
|
|
expect(config?.leader.timeout).toBe(321)
|
|
expect(config?.keybinds.get("composer.subagent.interrupt")).toMatchObject([{ key: "ctrl+i" }])
|
|
} finally {
|
|
server.stop(true)
|
|
mock.restore()
|
|
await rm(root, { recursive: true, force: true })
|
|
}
|
|
})
|