diff --git a/src/lib/components/workspace/Skills.svelte b/src/lib/components/workspace/Skills.svelte index 2563ad33a..63956f3cf 100644 --- a/src/lib/components/workspace/Skills.svelte +++ b/src/lib/components/workspace/Skills.svelte @@ -13,6 +13,7 @@ getSkillById, getSkillItems, exportSkills, + createNewSkill, deleteSkillById, toggleSkillById } from '$lib/apis/skills'; @@ -198,30 +199,66 @@ bind:this={importInputElement} bind:files={importFiles} type="file" - accept=".md" + accept=".md,.json" hidden on:change={() => { if (importFiles && importFiles.length > 0) { - const reader = new FileReader(); - reader.onload = (event) => { - const mdContent = event.target?.result; - if (typeof mdContent === 'string') { - const fm = parseFrontmatter(mdContent); - const fileName = importFiles[0].name.replace(/\.md$/, ''); - const rawName = fm.name || fileName; - const displayName = formatSkillName(rawName); - sessionStorage.skill = JSON.stringify({ - name: displayName, - id: fm.name || '', // Use raw frontmatter name as ID if available - description: fm.description || '', - content: mdContent, - is_active: true, - access_grants: [] - }); - goto('/workspace/skills/create'); - } - }; - reader.readAsText(importFiles[0]); + const file = importFiles[0]; + const ext = file.name.split('.').pop()?.toLowerCase(); + + if (ext === 'json') { + // JSON import: create skills via API + const reader = new FileReader(); + reader.onload = async (event) => { + try { + const content = event.target?.result; + if (typeof content !== 'string') return; + + const parsedSkills = JSON.parse(content); + const items = Array.isArray(parsedSkills) ? parsedSkills : [parsedSkills]; + + for (const skill of items) { + await createNewSkill(localStorage.token, skill).catch( + (error) => { + toast.error(`${error}`); + } + ); + } + + toast.success($i18n.t('Skill imported successfully')); + page = 1; + loadSkillItems(); + _skills.set(await getSkills(localStorage.token)); + } catch (e) { + toast.error($i18n.t('Invalid JSON file')); + } + }; + reader.readAsText(file); + } else { + // Markdown import: parse frontmatter and open in editor + const reader = new FileReader(); + reader.onload = (event) => { + const mdContent = event.target?.result; + if (typeof mdContent === 'string') { + const fm = parseFrontmatter(mdContent); + const fileName = file.name.replace(/\.md$/, ''); + const rawName = fm.name || fileName; + const displayName = formatSkillName(rawName); + sessionStorage.skill = JSON.stringify({ + name: displayName, + id: fm.name || '', + description: fm.description || '', + content: mdContent, + is_active: true, + access_grants: [] + }); + goto('/workspace/skills/create'); + } + }; + reader.readAsText(file); + } + + importInputElement.value = ''; } }} />