|
|
@@ -0,0 +1,45 @@
|
|
|
+import { createOpencodeClient } from "@opencode-ai/sdk/v2/client"
|
|
|
+import { base64Encode } from "@opencode-ai/util/encode"
|
|
|
+import type { Page } from "@playwright/test"
|
|
|
+
|
|
|
+export const serverHost = process.env.PLAYWRIGHT_SERVER_HOST ?? "localhost"
|
|
|
+export const serverPort = process.env.PLAYWRIGHT_SERVER_PORT ?? "4096"
|
|
|
+
|
|
|
+export const serverUrl = `http://${serverHost}:${serverPort}`
|
|
|
+export const serverName = `${serverHost}:${serverPort}`
|
|
|
+
|
|
|
+export const modKey = process.platform === "darwin" ? "Meta" : "Control"
|
|
|
+export const terminalToggleKey = "Control+Backquote"
|
|
|
+
|
|
|
+export const promptSelector = '[data-component="prompt-input"]'
|
|
|
+export const terminalSelector = '[data-component="terminal"]'
|
|
|
+
|
|
|
+export function createSdk(directory?: string) {
|
|
|
+ return createOpencodeClient({ baseUrl: serverUrl, directory, throwOnError: true })
|
|
|
+}
|
|
|
+
|
|
|
+export async function getWorktree() {
|
|
|
+ const sdk = createSdk()
|
|
|
+ const result = await sdk.path.get()
|
|
|
+ const data = result.data
|
|
|
+ if (!data?.worktree) throw new Error(`Failed to resolve a worktree from ${serverUrl}/path`)
|
|
|
+ return data.worktree
|
|
|
+}
|
|
|
+
|
|
|
+export function dirSlug(directory: string) {
|
|
|
+ return base64Encode(directory)
|
|
|
+}
|
|
|
+
|
|
|
+export function dirPath(directory: string) {
|
|
|
+ return `/${dirSlug(directory)}`
|
|
|
+}
|
|
|
+
|
|
|
+export function sessionPath(directory: string, sessionID?: string) {
|
|
|
+ return `${dirPath(directory)}/session${sessionID ? `/${sessionID}` : ""}`
|
|
|
+}
|
|
|
+
|
|
|
+export async function gotoSession(page: Page, sessionID?: string) {
|
|
|
+ const directory = await getWorktree()
|
|
|
+ await page.goto(sessionPath(directory, sessionID))
|
|
|
+ return { directory, slug: dirSlug(directory) }
|
|
|
+}
|