utils.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { createOpencodeClient } from "@opencode-ai/sdk/v2/client"
  2. import { base64Encode, checksum } from "@opencode-ai/util/encode"
  3. export const serverHost = process.env.PLAYWRIGHT_SERVER_HOST ?? "127.0.0.1"
  4. export const serverPort = process.env.PLAYWRIGHT_SERVER_PORT ?? "4096"
  5. export const serverUrl = `http://${serverHost}:${serverPort}`
  6. export const serverName = `${serverHost}:${serverPort}`
  7. export const modKey = process.platform === "darwin" ? "Meta" : "Control"
  8. export const terminalToggleKey = "Control+Backquote"
  9. export function createSdk(directory?: string) {
  10. return createOpencodeClient({ baseUrl: serverUrl, directory, throwOnError: true })
  11. }
  12. export async function resolveDirectory(directory: string) {
  13. return createSdk(directory)
  14. .path.get()
  15. .then((x) => x.data?.directory ?? directory)
  16. }
  17. export async function getWorktree() {
  18. const sdk = createSdk()
  19. const result = await sdk.path.get()
  20. const data = result.data
  21. if (!data?.worktree) throw new Error(`Failed to resolve a worktree from ${serverUrl}/path`)
  22. return data.worktree
  23. }
  24. export function dirSlug(directory: string) {
  25. return base64Encode(directory)
  26. }
  27. export function dirPath(directory: string) {
  28. return `/${dirSlug(directory)}`
  29. }
  30. export function sessionPath(directory: string, sessionID?: string) {
  31. return `${dirPath(directory)}/session${sessionID ? `/${sessionID}` : ""}`
  32. }
  33. export function workspacePersistKey(directory: string, key: string) {
  34. const head = directory.slice(0, 12) || "workspace"
  35. const sum = checksum(directory) ?? "0"
  36. return `opencode.workspace.${head}.${sum}.dat:workspace:${key}`
  37. }