utils.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. const localHosts = ["127.0.0.1", "localhost"]
  8. const serverLabels = (() => {
  9. const url = new URL(serverUrl)
  10. if (!localHosts.includes(url.hostname)) return [serverName]
  11. return localHosts.map((host) => `${host}:${url.port}`)
  12. })()
  13. export const serverNames = [...new Set(serverLabels)]
  14. export const serverUrls = serverNames.map((name) => `http://${name}`)
  15. const escape = (value: string) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
  16. export const serverNamePattern = new RegExp(`(?:${serverNames.map(escape).join("|")})`)
  17. export const modKey = process.platform === "darwin" ? "Meta" : "Control"
  18. export const terminalToggleKey = "Control+Backquote"
  19. export function createSdk(directory?: string, baseUrl = serverUrl) {
  20. return createOpencodeClient({ baseUrl, directory, throwOnError: true })
  21. }
  22. export async function resolveDirectory(directory: string, baseUrl = serverUrl) {
  23. return createSdk(directory, baseUrl)
  24. .path.get()
  25. .then((x) => x.data?.directory ?? directory)
  26. }
  27. export async function getWorktree(baseUrl = serverUrl) {
  28. const sdk = createSdk(undefined, baseUrl)
  29. const result = await sdk.path.get()
  30. const data = result.data
  31. if (!data?.worktree) throw new Error(`Failed to resolve a worktree from ${baseUrl}/path`)
  32. return data.worktree
  33. }
  34. export function dirSlug(directory: string) {
  35. return base64Encode(directory)
  36. }
  37. export function dirPath(directory: string) {
  38. return `/${dirSlug(directory)}`
  39. }
  40. export function sessionPath(directory: string, sessionID?: string) {
  41. return `${dirPath(directory)}/session${sessionID ? `/${sessionID}` : ""}`
  42. }
  43. export function workspacePersistKey(directory: string, key: string) {
  44. const head = (directory.slice(0, 12) || "workspace").replace(/[^a-zA-Z0-9._-]/g, "-")
  45. const sum = checksum(directory) ?? "0"
  46. return `opencode.workspace.${head}.${sum}.dat:workspace:${key}`
  47. }