From cc955098cd8714bcf1cc91e6a4a6625e38710b05 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 26 Sep 2025 11:41:15 -0500 Subject: wip: desktop work --- packages/app/src/pages/index.tsx | 636 +++++++-------------------------------- 1 file changed, 103 insertions(+), 533 deletions(-) (limited to 'packages/app/src/pages') diff --git a/packages/app/src/pages/index.tsx b/packages/app/src/pages/index.tsx index 08c2a4a39..128c6adfd 100644 --- a/packages/app/src/pages/index.tsx +++ b/packages/app/src/pages/index.tsx @@ -1,21 +1,11 @@ -import { Button, FileIcon, Icon, IconButton, Logo, Tooltip } from "@/ui" +import { FileIcon, Icon, IconButton, Tooltip } from "@/ui" import { Tabs } from "@/ui/tabs" -import { Select } from "@/components/select" import FileTree from "@/components/file-tree" +import EditorPane from "@/components/editor-pane" import { For, Match, onCleanup, onMount, Show, Switch } from "solid-js" import { SelectDialog } from "@/components/select-dialog" -import { useLocal, useSDK } from "@/context" -import { Code } from "@/components/code" -import { - DragDropProvider, - DragDropSensors, - DragOverlay, - SortableProvider, - createSortable, - closestCenter, - useDragDropContext, -} from "@thisbeyond/solid-dnd" -import type { DragEvent, Transformer } from "@thisbeyond/solid-dnd" +import { useLocal } from "@/context" +import { ResizeableLayout, ResizeablePane } from "@/components/resizeable-pane" import type { LocalFile } from "@/context/local" import SessionList from "@/components/session-list" import SessionTimeline from "@/components/session-timeline" @@ -23,18 +13,17 @@ import { createStore } from "solid-js/store" import { getDirectory, getFilename } from "@/utils" export default function Page() { - const sdk = useSDK() const local = useLocal() const [store, setStore] = createStore({ clickTimer: undefined as number | undefined, - activeItem: undefined as string | undefined, - prompt: "", - dragging: undefined as "left" | "right" | undefined, modelSelectOpen: false, fileSelectOpen: false, }) - let inputRef: HTMLInputElement | undefined = undefined + const layoutKey = "workspace" + const timelinePane = "timeline" + + let inputRef: HTMLTextAreaElement | undefined = undefined const MOD = typeof navigator === "object" && /(Mac|iPod|iPhone|iPad)/.test(navigator.platform) ? "Meta" : "Control" @@ -46,54 +35,52 @@ export default function Page() { document.removeEventListener("keydown", handleKeyDown) }) - const handleKeyDown = (e: KeyboardEvent) => { - if (e.getModifierState(MOD) && e.shiftKey && e.key.toLowerCase() === "p") { - e.preventDefault() + const handleKeyDown = (event: KeyboardEvent) => { + if (event.getModifierState(MOD) && event.shiftKey && event.key.toLowerCase() === "p") { + event.preventDefault() // TODO: command palette return } - if (e.getModifierState(MOD) && e.key.toLowerCase() === "p") { - e.preventDefault() + if (event.getModifierState(MOD) && event.key.toLowerCase() === "p") { + event.preventDefault() setStore("fileSelectOpen", true) return } - const inputFocused = document.activeElement === inputRef - if (inputFocused) { - if (e.key === "Escape") { + const focused = document.activeElement === inputRef + if (focused) { + if (event.key === "Escape") { inputRef?.blur() } return } - if (document.activeElement?.id === "select-filter") { - return - } - if (local.file.active()) { - if (e.getModifierState(MOD)) { - if (e.key.toLowerCase() === "a") { + const active = local.file.active()! + if (event.key === "Enter" && active.selection) { + local.context.add({ + type: "file", + path: active.path, + selection: { ...active.selection }, + }) + return + } + + if (event.getModifierState(MOD)) { + if (event.key.toLowerCase() === "a") { return } - if (e.key.toLowerCase() === "c") { + if (event.key.toLowerCase() === "c") { return } } } - if (e.key.length === 1 && e.key !== "Unidentified") { + if (event.key.length === 1 && event.key !== "Unidentified") { inputRef?.focus() } } - const navigateChange = (dir: 1 | -1) => { - const active = local.file.active() - if (!active) return - const current = local.file.changeIndex(active.path) - const next = current == undefined ? (dir === 1 ? 0 : -1) : current + dir - local.file.setChangeIndex(active.path, next) - } - const resetClickTimer = () => { if (!store.clickTimer) return clearTimeout(store.clickTimer) @@ -117,190 +104,80 @@ export default function Page() { } } - const handleTabChange = (path: string) => { - local.file.open(path) - } - - const handleTabClose = (file: LocalFile) => { - local.file.close(file.path) - } - - const onDragStart = (event: any) => { - setStore("activeItem", event.draggable.id as string) - } - - const onDragOver = (event: DragEvent) => { - const { draggable, droppable } = event - if (draggable && droppable) { - const currentFiles = local.file.opened().map((f) => f.path) - const fromIndex = currentFiles.indexOf(draggable.id.toString()) - const toIndex = currentFiles.indexOf(droppable.id.toString()) - if (fromIndex !== toIndex) { - local.file.move(draggable.id.toString(), toIndex) - } - } - } - - const onDragEnd = () => { - setStore("activeItem", undefined) - } - - const handleLeftDragStart = (e: MouseEvent) => { - e.preventDefault() - setStore("dragging", "left") - const startX = e.clientX - const startWidth = local.layout.leftWidth() - - const handleMouseMove = (e: MouseEvent) => { - const deltaX = e.clientX - startX - const newWidth = startWidth + deltaX - local.layout.setLeftWidth(newWidth) - } - - const handleMouseUp = () => { - setStore("dragging", undefined) - document.removeEventListener("mousemove", handleMouseMove) - document.removeEventListener("mouseup", handleMouseUp) - } - - document.addEventListener("mousemove", handleMouseMove) - document.addEventListener("mouseup", handleMouseUp) - } - - const handleRightDragStart = (e: MouseEvent) => { - e.preventDefault() - setStore("dragging", "right") - const startX = e.clientX - const startWidth = local.layout.rightWidth() - - const handleMouseMove = (e: MouseEvent) => { - const deltaX = startX - e.clientX - const newWidth = startWidth + deltaX - local.layout.setRightWidth(newWidth) - } - - const handleMouseUp = () => { - setStore("dragging", undefined) - document.removeEventListener("mousemove", handleMouseMove) - document.removeEventListener("mouseup", handleMouseUp) - } - - document.addEventListener("mousemove", handleMouseMove) - document.addEventListener("mouseup", handleMouseUp) - } - - const handleSubmit = async (e: SubmitEvent) => { - e.preventDefault() - const prompt = store.prompt - setStore("prompt", "") - inputRef?.blur() - - const session = - (local.layout.rightPane() ? local.session.active() : undefined) ?? - (await sdk.session.create().then((x) => x.data!)) - local.session.setActive(session!.id) - local.layout.openRightPane() - - const response = await sdk.session.prompt({ - path: { id: session!.id }, - body: { - agent: local.agent.current()!.name, - model: { modelID: local.model.current()!.id, providerID: local.model.current()!.provider.id }, - parts: [ - { - type: "text", - text: prompt, - }, - ...local.file - .opened() - .filter((f) => f.selection || local.file.active()?.path === f.path) - .flatMap((f) => [ - { - type: "file" as const, - mime: "text/plain", - url: `file://${f.absolute}${f.selection ? `?start=${f.selection.startLine}&end=${f.selection.endLine}` : ""}`, - filename: f.name, - source: { - type: "file" as const, - text: { - value: "@" + f.name, - start: 0, // f.start, - end: 0, // f.end, - }, - path: f.absolute, - }, - }, - ]), - ], - }, - }) - - console.log("response", response) - } - return (
- })()}
-