Something went wrong. Try again.
opencode v2 mirror
Something went wrong. Try again.
TypeScript
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970import { createMemo } from "solid-js"import { useDirectoryPicker } from "@/workspaces/selection/picker"import { useGlobal, useServerCtx } from "@/runtime/server/runtime"import { useServerSDK } from "@/runtime/server/client"import { serverName, ServerConnection, useServers } from "@/runtime/server/registry"import { useWorkspaceLocation } from "@/workspaces/location"import { workspaceSelectionDestination } from "@/workspaces/paths"import { useTabs } from "@/shell/tabs/tabs"import type { PromptProjectControls } from "./selector"
export function createComposerProjectControls(props: { draftId: string; worktree: () => string }) { const servers = useServers() const serverSDK = useServerSDK() const location = useWorkspaceLocation() const tabs = useTabs() const global = useGlobal() const pickDirectory = useDirectoryPicker() const projectServer = () => serverSDK.server const projectServerCtx = useServerCtx(projectServer) const projects = createMemo(() => { if (servers.list.length <= 1) return projectServerCtx().projects.list() return servers.list.flatMap((connection) => { const server = { key: ServerConnection.key(connection), name: serverName(connection) } return global .ensureServerCtx(connection) .projects.list() .map((project) => ({ ...project, server })) }) }) const selectProject = (worktree: string, serverKey?: string) => { const connection = serverKey ? servers.list.find((connection) => ServerConnection.key(connection) === serverKey) : projectServer() if (!connection) return
const target = global.ensureServerCtx(connection) target.projects.open(worktree) target.projects.touch(worktree) tabs.updateDraft(props.draftId, { server: ServerConnection.key(connection), directory: worktree, worktree: workspaceSelectionDestination(props.worktree(), location().directory), branch: undefined, }) } const addProject = (title: string, serverKey?: string) => { const connection = serverKey ? servers.list.find((connection) => ServerConnection.key(connection) === serverKey) : projectServer() if (!connection) return pickDirectory({ server: connection, location: ServerConnection.key(connection) === ServerConnection.key(projectServer()) ? location().ref : undefined, title, onSelect: (result) => { const directory = Array.isArray(result) ? result[0] : result if (directory) selectProject(directory, serverKey) }, }) }
return createMemo<PromptProjectControls>(() => ({ available: projects(), directory: location().directory, server: servers.list.length > 1 ? ServerConnection.key(projectServer()) : undefined, select: selectProject, add: addProject, }))}