@@ -244,6 +256,7 @@ export function AgentsView() {
onDeletePersona={handleDeletePersona}
onExportPersona={handleExportPersona}
onCreatePersona={() => openPersonaEditor()}
+ onImportFile={handleImportFileBytes}
isLoading={personasLoading}
/>
diff --git a/ui/goose2/src/features/agents/ui/PersonaEditor.tsx b/ui/goose2/src/features/agents/ui/PersonaEditor.tsx
index 06039664c5..09611b4be8 100644
--- a/ui/goose2/src/features/agents/ui/PersonaEditor.tsx
+++ b/ui/goose2/src/features/agents/ui/PersonaEditor.tsx
@@ -112,12 +112,12 @@ export function PersonaEditor({
{/* Header */}
-
+
{isReadOnly
? persona?.displayName
@@ -135,7 +135,11 @@ export function PersonaEditor({
-
);
}
diff --git a/ui/goose2/src/features/skills/ui/CreateSkillDialog.tsx b/ui/goose2/src/features/skills/ui/CreateSkillDialog.tsx
index 76819d6c28..5796d4a3de 100644
--- a/ui/goose2/src/features/skills/ui/CreateSkillDialog.tsx
+++ b/ui/goose2/src/features/skills/ui/CreateSkillDialog.tsx
@@ -107,12 +107,12 @@ export function CreateSkillDialog({
{/* Header */}
-
+
{isEditing ? "Edit Skill" : "New Skill"}
@@ -126,7 +126,12 @@ export function CreateSkillDialog({
-
+
+ {/* Footer */}
+
+
+
+
);
diff --git a/ui/goose2/src/features/skills/ui/SkillsView.tsx b/ui/goose2/src/features/skills/ui/SkillsView.tsx
index 0eb0dcdef0..36245b1c96 100644
--- a/ui/goose2/src/features/skills/ui/SkillsView.tsx
+++ b/ui/goose2/src/features/skills/ui/SkillsView.tsx
@@ -11,6 +11,7 @@ import {
} from "lucide-react";
import { cn } from "@/shared/lib/cn";
import { SearchBar } from "@/shared/ui/SearchBar";
+import { useFileImportZone } from "@/shared/hooks/useFileImportZone";
import { CreateSkillDialog } from "./CreateSkillDialog";
import {
listSkills,
@@ -242,6 +243,25 @@ export function SkillsView() {
setDialogOpen(true);
};
+ const handleDropImport = useCallback(
+ async (fileBytes: number[], fileName: string) => {
+ try {
+ await importSkills(fileBytes, fileName);
+ await loadSkills();
+ } catch (err) {
+ console.error("Failed to import skill:", err);
+ }
+ },
+ [loadSkills],
+ );
+
+ const {
+ fileInputRef: dropFileInputRef,
+ isDragOver,
+ dropHandlers,
+ handleFileChange: handleDropFileChange,
+ } = useFileImportZone({ onImportFile: handleDropImport });
+
const filtered = skills.filter(
(s) =>
s.name.toLowerCase().includes(search.toLowerCase()) ||
@@ -321,12 +341,41 @@ export function SkillsView() {
/>