diff --git a/src/apps/officer-web/App.tsx b/src/apps/officer-web/App.tsx index fc6d94b2..340d5c8f 100644 --- a/src/apps/officer-web/App.tsx +++ b/src/apps/officer-web/App.tsx @@ -45,6 +45,7 @@ export function App() { } /> } /> } /> + } /> } /> } /> } /> diff --git a/src/workspaces/plugins/FileBrowser/client/Screen/FileGrid.tsx b/src/apps/officer-web/Screens/Dashboard/Files/Screen/FileGrid.tsx similarity index 97% rename from src/workspaces/plugins/FileBrowser/client/Screen/FileGrid.tsx rename to src/apps/officer-web/Screens/Dashboard/Files/Screen/FileGrid.tsx index addad83e..e90e9067 100644 --- a/src/workspaces/plugins/FileBrowser/client/Screen/FileGrid.tsx +++ b/src/apps/officer-web/Screens/Dashboard/Files/Screen/FileGrid.tsx @@ -1,6 +1,5 @@ import { useRef, useCallback } from 'react'; -import type { DirEntry } from '../state/useFiles'; -import type { TaskSummary } from '../state/useTasks'; +import type { DirEntry, TaskSummary } from 'widgets/FileBrowser'; import { FileItem } from './FileItem'; type ClipboardState = { paths: string[]; mode: 'copy' | 'cut' } | null; diff --git a/src/workspaces/plugins/FileBrowser/client/Screen/FileItem.tsx b/src/apps/officer-web/Screens/Dashboard/Files/Screen/FileItem.tsx similarity index 99% rename from src/workspaces/plugins/FileBrowser/client/Screen/FileItem.tsx rename to src/apps/officer-web/Screens/Dashboard/Files/Screen/FileItem.tsx index c73de689..d103dcdc 100644 --- a/src/workspaces/plugins/FileBrowser/client/Screen/FileItem.tsx +++ b/src/apps/officer-web/Screens/Dashboard/Files/Screen/FileItem.tsx @@ -22,8 +22,7 @@ import { ContextMenuTrigger, } from '@/components/ui/context-menu'; import { cardStyle } from '@/components/Card'; -import type { DirEntry } from '../state/useFiles'; -import type { TaskSummary } from '../state/useTasks'; +import type { DirEntry, TaskSummary } from 'widgets/FileBrowser'; export type FileItemProps = { entry: DirEntry; diff --git a/src/workspaces/plugins/FileBrowser/client/Screen/FileViewer.tsx b/src/apps/officer-web/Screens/Dashboard/Files/Screen/FileViewer.tsx similarity index 99% rename from src/workspaces/plugins/FileBrowser/client/Screen/FileViewer.tsx rename to src/apps/officer-web/Screens/Dashboard/Files/Screen/FileViewer.tsx index 3fe15a8b..a686de71 100644 --- a/src/workspaces/plugins/FileBrowser/client/Screen/FileViewer.tsx +++ b/src/apps/officer-web/Screens/Dashboard/Files/Screen/FileViewer.tsx @@ -25,7 +25,7 @@ import rehypeSlug from 'rehype-slug'; import { Dialog, DialogOverlay, DialogPortal } from '@/components/ui/dialog'; import * as DialogPrimitive from '@radix-ui/react-dialog'; import { cardStyle } from '@/components/Card'; -import { useFiles } from '../state/useFiles'; +import { useFiles } from 'widgets/FileBrowser'; import { getHeaders } from 'hooks/useClient'; import { config } from 'config'; import { getIcon } from 'material-file-icons'; diff --git a/src/workspaces/plugins/FileBrowser/client/Screen/TaskRunnerModal.tsx b/src/apps/officer-web/Screens/Dashboard/Files/Screen/TaskRunnerModal.tsx similarity index 99% rename from src/workspaces/plugins/FileBrowser/client/Screen/TaskRunnerModal.tsx rename to src/apps/officer-web/Screens/Dashboard/Files/Screen/TaskRunnerModal.tsx index b5fa8979..1e82b128 100644 --- a/src/workspaces/plugins/FileBrowser/client/Screen/TaskRunnerModal.tsx +++ b/src/apps/officer-web/Screens/Dashboard/Files/Screen/TaskRunnerModal.tsx @@ -6,7 +6,7 @@ import { cardStyle } from '@/components/Card'; import { useClaude, useOpenCode, EmbeddableChat, type TaskInfo } from 'plugins/Chat/client'; import { useVisibleClaudeModels, useVisibleOpenCodeModels } from '@/state/useModels'; import { useSettings } from '@/state/useSettings'; -import type { TaskSummary } from '../state/useTasks'; +import type { TaskSummary } from 'widgets/FileBrowser'; const playDing = () => { const ctx = new AudioContext(); diff --git a/src/workspaces/plugins/FileBrowser/client/Screen/index.tsx b/src/apps/officer-web/Screens/Dashboard/Files/Screen/index.tsx similarity index 98% rename from src/workspaces/plugins/FileBrowser/client/Screen/index.tsx rename to src/apps/officer-web/Screens/Dashboard/Files/Screen/index.tsx index 25012903..43938566 100644 --- a/src/workspaces/plugins/FileBrowser/client/Screen/index.tsx +++ b/src/apps/officer-web/Screens/Dashboard/Files/Screen/index.tsx @@ -22,15 +22,11 @@ import { } from 'lucide-react'; import { getIcon } from 'material-file-icons'; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger } from '@/components/ui/context-menu'; -import { DashboardLayout } from '@/Screens/Dashboard/Layout'; -import { useFiles, type DirEntry } from '../state/useFiles'; -import { useTasks, type TaskSummary } from '../state/useTasks'; +import { useFiles, type DirEntry, useTasks, type TaskSummary, Breadcrumb, Toolbar } from 'widgets/FileBrowser'; import { useUserState } from '@/state/useUserState'; import { useAuth } from 'hooks/useAuth'; import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Card } from '@/components/Card'; -import { Breadcrumb } from './Breadcrumb'; -import { Toolbar } from './Toolbar'; import { FileGrid } from './FileGrid'; import { FileViewer } from './FileViewer'; import { TaskRunnerModal } from './TaskRunnerModal'; @@ -377,7 +373,7 @@ export const Files = () => { }; return ( - + <>
{ cwd={{ root: homeRoot, path: currentPath.replace(/^\//, '') }} /> )} - + ); }; diff --git a/src/workspaces/plugins/FileBrowser/client/Widget.tsx b/src/apps/officer-web/Screens/Dashboard/Files/Widget.tsx similarity index 99% rename from src/workspaces/plugins/FileBrowser/client/Widget.tsx rename to src/apps/officer-web/Screens/Dashboard/Files/Widget.tsx index 2c225594..f45d220a 100644 --- a/src/workspaces/plugins/FileBrowser/client/Widget.tsx +++ b/src/apps/officer-web/Screens/Dashboard/Files/Widget.tsx @@ -2,12 +2,11 @@ import { useState, useEffect, useRef, useMemo } from 'react'; import { useNavigate, Link } from 'react-router'; import { Folder, Pin, PinOff, Search, Clock, FolderOpen, Loader2, X, ChevronDown, ChevronUp } from 'lucide-react'; import { getIcon } from 'material-file-icons'; -import { useFiles, type DirEntry } from './state/useFiles'; +import { useFiles, type DirEntry, Breadcrumb } from 'widgets/FileBrowser'; import { useRecentFiles } from './state/useRecentFiles'; import { usePinnedFiles } from './state/usePinnedFiles'; import { useUserState } from '@/state/useUserState'; import { Card } from '@/components/Card'; -import { Breadcrumb } from './Screen/Breadcrumb'; type Tab = 'browse' | 'recent' | 'pinned'; diff --git a/src/apps/officer-web/Screens/Dashboard/Files/index.tsx b/src/apps/officer-web/Screens/Dashboard/Files/index.tsx new file mode 100644 index 00000000..fe0caff0 --- /dev/null +++ b/src/apps/officer-web/Screens/Dashboard/Files/index.tsx @@ -0,0 +1,2 @@ +export { Files } from './Screen'; +export { FileBrowser as FileBrowserWidget } from './Widget'; diff --git a/src/workspaces/plugins/FileBrowser/client/state/usePinnedFiles.ts b/src/apps/officer-web/Screens/Dashboard/Files/state/usePinnedFiles.ts similarity index 100% rename from src/workspaces/plugins/FileBrowser/client/state/usePinnedFiles.ts rename to src/apps/officer-web/Screens/Dashboard/Files/state/usePinnedFiles.ts diff --git a/src/workspaces/plugins/FileBrowser/client/state/useRecentFiles.ts b/src/apps/officer-web/Screens/Dashboard/Files/state/useRecentFiles.ts similarity index 100% rename from src/workspaces/plugins/FileBrowser/client/state/useRecentFiles.ts rename to src/apps/officer-web/Screens/Dashboard/Files/state/useRecentFiles.ts diff --git a/src/apps/officer-web/Screens/Dashboard/Home/index.tsx b/src/apps/officer-web/Screens/Dashboard/Home/index.tsx index a3a4109b..46351a48 100644 --- a/src/apps/officer-web/Screens/Dashboard/Home/index.tsx +++ b/src/apps/officer-web/Screens/Dashboard/Home/index.tsx @@ -1,5 +1,5 @@ import { ChatLauncher } from './ChatLauncher'; -import { Widget as FileBrowser } from 'plugins/FileBrowser/client'; +import { FileBrowserWidget as FileBrowser } from '@/Screens/Dashboard/Files'; import { Widget as ChatHistory } from 'plugins/ChatHistory/client'; import { Catalog } from 'sounds'; diff --git a/src/apps/officer-web/Screens/Dashboard/Terminal/index.tsx b/src/apps/officer-web/Screens/Dashboard/Terminal/index.tsx index b5e7f15d..de32955d 100644 --- a/src/apps/officer-web/Screens/Dashboard/Terminal/index.tsx +++ b/src/apps/officer-web/Screens/Dashboard/Terminal/index.tsx @@ -1,4 +1,4 @@ -import { TerminalView } from 'widgets/TerminalView'; +import { TerminalView } from 'widgets/Terminal'; export const Terminal = () => { return ; diff --git a/src/apps/officer-web/Screens/Dashboard/index.tsx b/src/apps/officer-web/Screens/Dashboard/index.tsx index 6af169fd..662215cb 100644 --- a/src/apps/officer-web/Screens/Dashboard/index.tsx +++ b/src/apps/officer-web/Screens/Dashboard/index.tsx @@ -11,3 +11,4 @@ export * from './Skills'; export * from './TaskLogs'; export * from './Tasks'; export * from './Terminal'; +export * from './Files'; diff --git a/src/workspaces/plugins/FileBrowser/server/router.ts b/src/servers/api/file-browser/router.ts similarity index 100% rename from src/workspaces/plugins/FileBrowser/server/router.ts rename to src/servers/api/file-browser/router.ts diff --git a/src/servers/hono.ts b/src/servers/hono.ts index 4ed09325..b68a906c 100644 --- a/src/servers/hono.ts +++ b/src/servers/hono.ts @@ -16,6 +16,7 @@ import { scrapeRouter } from './api/scrape/scrape'; import { uploadRouter } from './api/upload/upload'; import { settingsRouter } from './api/settings/settings'; import { taskLogsRouter } from './api/task-logs/task-logs'; +import { router as fileBrowserRouter } from './api/file-browser/router'; import { readdirSync, existsSync } from 'node:fs'; import { join } from 'node:path'; import { CustomError } from './custom-errors'; @@ -55,6 +56,7 @@ protectedRouter.route('/scrape', scrapeRouter); protectedRouter.route('/upload', uploadRouter); protectedRouter.route('/user', settingsRouter); protectedRouter.route('/task-logs', taskLogsRouter); +protectedRouter.route('/file-browser', fileBrowserRouter); // Auto-discover and mount plugin routers, then mount the protected router. // Hono's .route() copies routes at call time, so plugins must be loaded first. diff --git a/src/workspaces/plugins/FileBrowser/client/index.ts b/src/workspaces/plugins/FileBrowser/client/index.ts deleted file mode 100644 index ebf00d81..00000000 --- a/src/workspaces/plugins/FileBrowser/client/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { FileBrowser as Widget } from './Widget'; -export { Files as Screen } from './Screen'; diff --git a/src/workspaces/plugins/FileBrowser/index.ts b/src/workspaces/plugins/FileBrowser/index.ts deleted file mode 100644 index cf583364..00000000 --- a/src/workspaces/plugins/FileBrowser/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export { Widget, Screen } from './client'; -export { router, apiPath } from './server'; - -export const plugin = { - id: 'FileBrowser', - name: 'File Browser', - description: 'Browse, upload, and manage files', -}; diff --git a/src/workspaces/plugins/FileBrowser/server/index.ts b/src/workspaces/plugins/FileBrowser/server/index.ts deleted file mode 100644 index dcbe713f..00000000 --- a/src/workspaces/plugins/FileBrowser/server/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './router'; - -export const apiPath = 'file-browser'; diff --git a/src/workspaces/plugins/package.json b/src/workspaces/plugins/package.json index 6c39c333..1302524f 100644 --- a/src/workspaces/plugins/package.json +++ b/src/workspaces/plugins/package.json @@ -4,9 +4,6 @@ "private": true, "type": "module", "exports": { - "./FileBrowser": "./FileBrowser/index.ts", - "./FileBrowser/client": "./FileBrowser/client/index.ts", - "./FileBrowser/server": "./FileBrowser/server/index.ts", "./Chat": "./Chat/index.ts", "./Chat/client": "./Chat/client/index.ts", "./ChatHistory": "./ChatHistory/index.ts", diff --git a/src/workspaces/plugins/FileBrowser/client/Screen/Breadcrumb.tsx b/src/workspaces/widgets/FileBrowser/Breadcrumb.tsx similarity index 100% rename from src/workspaces/plugins/FileBrowser/client/Screen/Breadcrumb.tsx rename to src/workspaces/widgets/FileBrowser/Breadcrumb.tsx diff --git a/src/workspaces/plugins/FileBrowser/client/Screen/Toolbar.tsx b/src/workspaces/widgets/FileBrowser/Toolbar.tsx similarity index 100% rename from src/workspaces/plugins/FileBrowser/client/Screen/Toolbar.tsx rename to src/workspaces/widgets/FileBrowser/Toolbar.tsx diff --git a/src/workspaces/widgets/FileBrowser/index.ts b/src/workspaces/widgets/FileBrowser/index.ts new file mode 100644 index 00000000..dfd52576 --- /dev/null +++ b/src/workspaces/widgets/FileBrowser/index.ts @@ -0,0 +1,4 @@ +export { Breadcrumb } from './Breadcrumb'; +export { Toolbar } from './Toolbar'; +export { useFiles, type DirEntry } from './useFiles'; +export { useTasks, type TaskSummary } from './useTasks'; diff --git a/src/workspaces/plugins/FileBrowser/client/state/useFiles.ts b/src/workspaces/widgets/FileBrowser/useFiles.ts similarity index 100% rename from src/workspaces/plugins/FileBrowser/client/state/useFiles.ts rename to src/workspaces/widgets/FileBrowser/useFiles.ts diff --git a/src/workspaces/plugins/FileBrowser/client/state/useTasks.ts b/src/workspaces/widgets/FileBrowser/useTasks.ts similarity index 100% rename from src/workspaces/plugins/FileBrowser/client/state/useTasks.ts rename to src/workspaces/widgets/FileBrowser/useTasks.ts diff --git a/src/workspaces/widgets/TerminalView.tsx b/src/workspaces/widgets/Terminal/Terminal.tsx similarity index 100% rename from src/workspaces/widgets/TerminalView.tsx rename to src/workspaces/widgets/Terminal/Terminal.tsx diff --git a/src/workspaces/widgets/Terminal/index.ts b/src/workspaces/widgets/Terminal/index.ts new file mode 100644 index 00000000..e8f90209 --- /dev/null +++ b/src/workspaces/widgets/Terminal/index.ts @@ -0,0 +1 @@ +export { TerminalView, type TerminalViewProps } from './Terminal'; diff --git a/src/workspaces/widgets/package.json b/src/workspaces/widgets/package.json index 0dbeba53..635f0ca4 100644 --- a/src/workspaces/widgets/package.json +++ b/src/workspaces/widgets/package.json @@ -2,6 +2,7 @@ "name": "widgets", "private": true, "exports": { - "./TerminalView": "./TerminalView.tsx" + "./Terminal": "./Terminal/index.ts", + "./FileBrowser": "./FileBrowser/index.ts" } }