Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions packages/opencode/test/kilocode/server/httpapi-exercise-ready.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { Effect } from "effect"
import { AgentV2 } from "@opencode-ai/core/agent"
import { isRecord } from "../../server/httpapi-exercise/assertions"
import { request } from "../../server/httpapi-exercise/backend"
import { pollWithTimeout } from "../../lib/effect"
import type { ScenarioContext } from "../../server/httpapi-exercise/types"

export function sessionAfterDefaultAgent(ctx: ScenarioContext, title: string) {
return Effect.gen(function* () {
const session = yield* ctx.session({ title })
// GET /api/agent and POST /permission share this directory today; a workspace/worktree
// session would boot a different AgentV2 and this wait would not cover it.
yield* pollWithTimeout(
request("GET", { path: "/api/agent", headers: ctx.headers() }).pipe(
Effect.map((result) => {
const body = result.body
if (!isRecord(body) || !Array.isArray(body.data)) return undefined
return body.data.some((item) => isRecord(item) && item.id === AgentV2.defaultID) ? (true as const) : undefined
}),
),
"default agent never loaded before permission create",
)
return session
}).pipe(Effect.orDie)
}
18 changes: 18 additions & 0 deletions packages/opencode/test/server/httpapi-exercise/backend.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { HttpRouter } from "effect/unstable/http"
import { parse } from "./assertions"
import { runtime, type Runtime } from "./runtime"
import type { ActiveScenario, BackendApp, CallResult, CaptureMode, SeededContext } from "./types"
import type { Method, RequestSpec } from "./types" // kilocode_change

type CallOptions = {
auth?: {
Expand All @@ -17,6 +18,23 @@ export function call(scenario: ActiveScenario, ctx: SeededContext<unknown>, opti
)
}

// kilocode_change start
export function request(method: Method, spec: RequestSpec) {
return Effect.promise(async () =>
capture(
await app(await runtime(), {}).request(
new Request(new URL(spec.path, "http://localhost"), {
method,
headers: spec.body === undefined ? spec.headers : { "content-type": "application/json", ...spec.headers },
body: spec.body === undefined ? undefined : JSON.stringify(spec.body),
}),
),
"full",
),
)
}
// kilocode_change end

export function callAuthProbe(scenario: ActiveScenario, credentials: "missing" | "valid" = "missing") {
return Effect.promise(async () => {
const controller = new AbortController()
Expand Down
5 changes: 3 additions & 2 deletions packages/opencode/test/server/httpapi-exercise/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import { disposeApps } from "./backend"
import { publicApi, runtime } from "./runtime" // kilocode_change
import { type Scenario, type Result } from "./types"
import { kiloScenarios } from "../../kilocode/server/httpapi-exercise-scenarios" // kilocode_change
import { sessionAfterDefaultAgent } from "../../kilocode/server/httpapi-exercise-ready" // kilocode_change

function cursor(input: Record<string, unknown>) {
return Buffer.from(JSON.stringify(input)).toString("base64url")
Expand Down Expand Up @@ -872,7 +873,7 @@ const scenarios: Scenario[] = [
}),
http.protected
.post("/api/session/{sessionID}/permission", "v2.session.permission.create")
.seeded((ctx) => ctx.session({ title: "Permission create owner" }))
.seeded((ctx) => sessionAfterDefaultAgent(ctx, "Permission create owner")) // kilocode_change
.at((ctx) => ({
path: route("/api/session/{sessionID}/permission", { sessionID: ctx.state.id }),
headers: ctx.headers(),
Expand All @@ -885,7 +886,7 @@ const scenarios: Scenario[] = [
object(body)
object(body.data)
check(typeof body.data.id === "string", "permission create should return an ID")
check(body.data.effect === "ask", "permission create should create a pending request")
check(body.data.effect === "ask", `permission create should create a pending request, got ${JSON.stringify(body.data.effect)}`) // kilocode_change
}),
http.protected
.get("/api/session/{sessionID}/permission", "v2.session.permission.list")
Expand Down
Loading