@runfusion/fusion 0.2.7 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/bin.js +55392 -51635
  2. package/dist/client/assets/{AgentDetailView-BMrHuWGs.css → AgentDetailView-C1b9PC5l.css} +1 -1
  3. package/dist/client/assets/{AgentDetailView-B4lRk--v.js → AgentDetailView-DJwWfkpv.js} +1 -1
  4. package/dist/client/assets/{AgentsView-yCYBY2km.js → AgentsView-DegK8aw-.js} +5 -5
  5. package/dist/client/assets/ChatView-CYpEShLS.js +1 -0
  6. package/dist/client/assets/{DevServerView-jXXtoQUx.js → DevServerView-DfCTA9fx.js} +2 -2
  7. package/dist/client/assets/{DirectoryPicker-izgMlS27.js → DirectoryPicker-B0qNpfLW.js} +1 -1
  8. package/dist/client/assets/DirectoryPicker-DzKVmxOf.css +1 -0
  9. package/dist/client/assets/{DocumentsView-DkkoHRwL.js → DocumentsView-CsQxuyz3.js} +1 -1
  10. package/dist/client/assets/{InsightsView-DaRtUPHX.js → InsightsView-Bzs7A2jv.js} +2 -2
  11. package/dist/client/assets/MemoryView-Cl5ASqjW.js +2 -0
  12. package/dist/client/assets/MemoryView-DiajLXby.css +1 -0
  13. package/dist/client/assets/{NodesView-BsUk_oiU.js → NodesView-BpiqRlvc.js} +1 -1
  14. package/dist/client/assets/PiExtensionsManager-Cr6EoC7S.js +11 -0
  15. package/dist/client/assets/PiExtensionsManager-kgTOHPE9.css +1 -0
  16. package/dist/client/assets/PluginManager-DRiIqol2.css +1 -0
  17. package/dist/client/assets/PluginManager-DXtQdfns.js +1 -0
  18. package/dist/client/assets/{RoadmapsView-SQol126Y.js → RoadmapsView-CYPLTTB0.js} +2 -2
  19. package/dist/client/assets/SettingsModal-CDWvhvrd.css +1 -0
  20. package/dist/client/assets/SettingsModal-CNdVTVqD.js +1 -0
  21. package/dist/client/assets/SettingsModal-CyCC7MzL.js +31 -0
  22. package/dist/client/assets/SettingsModal-G0ESQXRD.css +1 -0
  23. package/dist/client/assets/{SetupWizardModal-CQc1uGSq.js → SetupWizardModal-BLiljNn7.js} +1 -1
  24. package/dist/client/assets/SetupWizardModal-BMa6p24b.css +1 -0
  25. package/dist/client/assets/SkillsView-Dlpw5LKI.js +1 -0
  26. package/dist/client/assets/{folder-open-CI4TCD7P.js → folder-open-B_38R5AA.js} +1 -1
  27. package/dist/client/assets/index-DQKtk17v.js +616 -0
  28. package/dist/client/assets/index-DjOxzdj3.css +1 -0
  29. package/dist/client/assets/{upload-CAlKC4qI.js → upload-DNQF7XCK.js} +1 -1
  30. package/dist/client/assets/users-CG2_rCdk.js +6 -0
  31. package/dist/client/index.html +2 -2
  32. package/dist/client/version.json +1 -0
  33. package/dist/extension.js +3222 -937
  34. package/dist/pi-claude-cli/index.ts +72 -28
  35. package/dist/pi-claude-cli/package.json +1 -1
  36. package/dist/pi-claude-cli/src/__tests__/event-bridge.test.ts +34 -0
  37. package/dist/pi-claude-cli/src/__tests__/mcp-config.test.ts +22 -0
  38. package/dist/pi-claude-cli/src/__tests__/prompt-builder.test.ts +72 -10
  39. package/dist/pi-claude-cli/src/__tests__/provider.test.ts +9 -9
  40. package/dist/pi-claude-cli/src/event-bridge.ts +17 -6
  41. package/dist/pi-claude-cli/src/mcp-config.ts +36 -3
  42. package/dist/pi-claude-cli/src/prompt-builder.ts +111 -7
  43. package/dist/pi-claude-cli/src/provider.ts +17 -2
  44. package/package.json +17 -16
  45. package/skill/fusion/SKILL.md +6 -1
  46. package/skill/fusion/references/engine-tools.md +54 -0
  47. package/skill/fusion/references/extension-tools.md +83 -84
  48. package/skill/fusion/references/fusion-capabilities.md +33 -31
  49. package/LICENSE +0 -21
  50. package/dist/client/assets/ChatView-CH9T0dDs.js +0 -1
  51. package/dist/client/assets/MemoryView-85NKuU3h.js +0 -2
  52. package/dist/client/assets/MemoryView-DhinauGs.css +0 -1
  53. package/dist/client/assets/PiExtensionsManager-BF5pxrSE.js +0 -11
  54. package/dist/client/assets/PiExtensionsManager-K7HQ08L4.css +0 -1
  55. package/dist/client/assets/PluginManager-ccq3uK50.css +0 -1
  56. package/dist/client/assets/PluginManager-s6btydh5.js +0 -1
  57. package/dist/client/assets/SkillsView-BtUhs_QW.js +0 -1
  58. package/dist/client/assets/index-Ct-OqLpP.css +0 -1
  59. package/dist/client/assets/index-rNf7s96d.js +0 -649
@@ -1 +0,0 @@
1
- .memory-view{display:flex;flex-direction:column;height:100%;padding:var(--space-lg);overflow:hidden}.memory-view-header{display:flex;flex-direction:row;justify-content:space-between;align-items:flex-start;margin-bottom:var(--space-lg)}.memory-view-header h2{font-size:18px;color:var(--text);margin:0}.memory-view-description{color:var(--text-muted);font-size:13px;margin:var(--space-xs) 0 0 0}.memory-view-tabs{display:flex;flex-direction:row;gap:var(--space-xs);border-bottom:1px solid var(--border);margin-bottom:var(--space-lg)}.memory-view-tab{padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm) var(--radius-sm) 0 0;color:var(--text-muted);background:transparent;border:none;cursor:pointer;font-size:13px;transition:background var(--transition-fast),color var(--transition-fast)}.memory-view-tab:hover{background:var(--card-hover);color:var(--text)}.memory-view-tab:focus-visible{outline:none;box-shadow:var(--focus-ring)}.memory-view-tab--active{color:var(--text);border-bottom:2px solid var(--todo);font-weight:500}.memory-view-content{flex:1;overflow-y:auto}.memory-editor-container{border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden;display:flex;flex-direction:column;height:calc(100vh - var(--header-height) - 180px)}.memory-category-section{margin-bottom:var(--space-lg)}.memory-category-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;cursor:pointer;padding:var(--space-sm) 0;border-bottom:1px solid var(--border);transition:opacity var(--transition-fast)}.memory-category-header:hover{opacity:.8}.memory-category-header h4{font-size:14px;font-weight:500;margin:0;color:var(--text)}.memory-category-count{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);background:color-mix(in srgb,var(--text-muted) 15%,transparent);padding:2px 8px;border-radius:var(--radius-pill)}.memory-category-items{padding-top:var(--space-sm)}.memory-insight-item{padding:var(--space-xs) var(--space-sm);margin-bottom:var(--space-xs);border-left:3px solid var(--border);font-size:13px;color:var(--text);line-height:1.5}.memory-engine-card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:var(--space-xl);margin-bottom:var(--space-lg)}.memory-engine-card h3{font-size:14px;font-weight:500;margin:0 0 var(--space-md) 0;color:var(--text)}.memory-engine-status{display:flex;flex-direction:row;align-items:center;gap:var(--space-sm)}.memory-health-badge{display:inline-block;padding:2px 10px;border-radius:var(--radius-pill);font-size:12px}.memory-health-badge--healthy{background:color-mix(in srgb,var(--color-success) 15%,transparent);color:var(--color-success)}.memory-health-badge--warning{background:color-mix(in srgb,var(--color-warning) 15%,transparent);color:var(--color-warning)}.memory-health-badge--issues{background:color-mix(in srgb,var(--color-error) 15%,transparent);color:var(--color-error)}.memory-action-bar{display:flex;flex-direction:row;gap:var(--space-sm);margin-top:var(--space-md);align-items:center}.memory-empty-state{color:var(--text-muted);padding:var(--space-2xl);text-align:center;display:flex;flex-direction:column;align-items:center;gap:var(--space-sm)}.memory-stats-row{display:flex;flex-direction:row;gap:var(--space-lg);margin-bottom:var(--space-lg)}.memory-stat-card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md) var(--space-lg);flex:1}.memory-stat-value{font-size:24px;font-weight:600;color:var(--text);margin-bottom:var(--space-xs)}.memory-stat-label{font-size:12px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px}.memory-audit-check{display:flex;flex-direction:row;padding:var(--space-sm) 0;border-bottom:1px solid var(--border);gap:var(--space-sm)}.memory-audit-check:last-child{border-bottom:none}.memory-audit-check-passed{color:var(--color-success);font-weight:600}.memory-audit-check-failed{color:var(--color-error);font-weight:600}.memory-capability-badge{font-size:11px;padding:2px 8px;border-radius:var(--radius-pill);background:color-mix(in srgb,var(--todo) 15%,transparent);color:var(--text-muted)}.memory-readonly-banner{background:color-mix(in srgb,var(--color-warning) 10%,transparent);border:1px solid color-mix(in srgb,var(--color-warning) 30%,transparent);border-radius:var(--radius-md);padding:var(--space-md);color:var(--color-warning);font-size:13px;margin-bottom:var(--space-md)}.memory-char-count{font-size:12px;color:var(--text-muted)}.memory-categories-list{margin-top:var(--space-lg)}.memory-config-section{margin-top:var(--space-lg);padding-top:var(--space-lg);border-top:1px solid var(--border);display:flex;flex-direction:column;gap:var(--space-md)}.memory-settings-group{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);padding:var(--space-sm) 0}.memory-qmd-card{border-style:solid}.memory-retrieval-card{display:flex;flex-direction:column;gap:var(--space-sm)}.memory-retrieval-input-row{display:flex;align-items:center;gap:var(--space-sm)}.memory-retrieval-input-row .input{flex:1}.memory-retrieval-card .memory-test-result{margin-top:var(--space-sm)}@media(max-width:768px){.memory-view{padding:var(--space-md)}.memory-view-header{flex-direction:column;gap:var(--space-sm)}.memory-editor-container{height:calc(100vh - var(--header-height) - var(--mobile-nav-height) - 200px)}.memory-stats-row{flex-wrap:wrap}.memory-stat-card{min-width:calc(50% - var(--space-sm))}.memory-view-tab{min-height:36px;padding:var(--space-sm)}.memory-engine-card{padding:var(--space-md)}.memory-retrieval-input-row{flex-direction:column;align-items:stretch}.memory-settings-group{padding:var(--space-xs) 0}.memory-config-section{margin-top:var(--space-md);padding-top:var(--space-md)}}
@@ -1,11 +0,0 @@
1
- import{r as l,j as e}from"./vendor-react-K0fH_qHe.js";import{c as A,bX as H,bY as J,bZ as Q,R as $,bN as y,w as V,K as T,D as ee,I as se,b_ as L,F as D,b$ as ae,c0 as te,c1 as _,X as ie}from"./index-rNf7s96d.js";import"./vendor-xterm-DzcZoU0P.js";/**
2
- * @license lucide-react v1.7.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const ne=[["path",{d:"M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z",key:"e79jfc"}],["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}]],I=A("palette",ne);/**
7
- * @license lucide-react v1.7.0 - ISC
8
- *
9
- * This source code is licensed under the ISC license.
10
- * See the LICENSE file in the root directory of this source tree.
11
- */const le=[["path",{d:"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z",key:"w46dr5"}]],M=A("puzzle",le);function ce(t){return t.replace(/-/g,"-")}function re(t){return{"fusion-global":"Fusion Global","pi-global":"Pi Global","fusion-project":"Fusion Project","pi-project":"Pi Project",package:"Package"}[t]??t}function oe(t){return t.startsWith("npm:")?"npm":t.startsWith("git:")?"git":"local"}function de(t){return t.replace(/^(npm:|git:)/,"")}function he({addToast:t,projectId:x}){const[c,G]=l.useState(null),[f,P]=l.useState(!0),[N,S]=l.useState(!1),[E,w]=l.useState(!1),[h,F]=l.useState(""),[K,O]=l.useState(new Set),[p,W]=l.useState([]),[b,z]=l.useState(!0),[X,C]=l.useState(!1),r=l.useCallback(async()=>{try{P(!0);const s=await H();G(s)}catch(s){t(`Failed to load Pi settings: ${s instanceof Error?s.message:String(s)}`,"error")}finally{P(!1)}},[t]),m=l.useCallback(async()=>{try{z(!0);const s=await J(x);W(s.extensions)}catch(s){t(`Failed to load extensions: ${s instanceof Error?s.message:String(s)}`,"error")}finally{z(!1)}},[t,x]),q=l.useCallback(async s=>{try{C(!0);const i=s.enabled?[...p.filter(a=>a.enabled&&a.id!==s.id).map(a=>a.id),s.id]:p.filter(a=>a.enabled&&a.id!==s.id).map(a=>a.id);await Q(i,x),await m(),t(s.enabled?"Extension disabled":"Extension enabled","success")}catch(i){t(`Failed to update extension: ${i instanceof Error?i.message:String(i)}`,"error")}finally{C(!1)}},[p,x,m,t]);l.useEffect(()=>{r()},[r]),l.useEffect(()=>{m()},[m]);const B=s=>{O(i=>{const a=new Set(i);return a.has(s)?a.delete(s):a.add(s),a})},R=async()=>{if(!h.trim()){t("Please enter a package source","error");return}try{S(!0),await ae(h.trim()),t("Package installed successfully","success"),F(""),await r()}catch(s){t(`Failed to install package: ${s instanceof Error?s.message:String(s)}`,"error")}finally{S(!1)}},U=async()=>{try{w(!0),await te(x),await Promise.all([r(),m()]),t("Fusion skill reinstalled successfully","success")}catch(s){t(`Failed to reinstall Fusion skill: ${s instanceof Error?s.message:String(s)}`,"error")}finally{w(!1)}},Y=async s=>{if(!c)return;const i=c.packages.filter(a=>(typeof a=="string"?a:a.source)!==s);try{await _({packages:i}),t("Package removed","success"),await r()}catch(a){t(`Failed to remove package: ${a instanceof Error?a.message:String(a)}`,"error")}},Z=async(s,i)=>{if(!c)return;const a=c[s].filter(n=>n!==i);try{await _({[s]:a}),t(`${s.slice(0,-1)} removed`,"success"),await r()}catch(n){t(`Failed to update settings: ${n instanceof Error?n.message:String(n)}`,"error")}},u=(s,i,a)=>!c||c[a].length===0?null:e.jsxs("div",{className:"pi-ext-section",children:[e.jsxs("div",{className:"pi-ext-section-header",children:[e.jsx(i,{size:14}),e.jsx("span",{children:s}),e.jsx("span",{className:"pi-ext-count",children:c[a].length})]}),e.jsx("div",{className:"pi-ext-resource-list",children:c[a].map((n,g)=>e.jsxs("span",{className:"pi-ext-resource-tag",children:[e.jsx("span",{className:"pi-ext-resource-path",children:n}),e.jsx("button",{className:"btn-icon touch-target pi-ext-resource-remove",onClick:()=>Z(a,n),title:`Remove ${n}`,"aria-label":`Remove ${n}`,children:e.jsx(ie,{size:12})})]},g))})]});return e.jsxs("div",{className:"pi-ext-manager",children:[e.jsxs("div",{className:"pi-ext-manager-header",children:[e.jsx("h4",{className:"settings-section-heading",children:"Pi Extensions"}),e.jsx("div",{className:"pi-ext-manager-actions",children:e.jsx("button",{className:"btn-icon",onClick:r,title:"Refresh",disabled:f,children:e.jsx($,{size:16,className:f?"spin":""})})})]}),f?e.jsx("div",{className:"loading-state",children:"Loading Pi settings…"}):c?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"pi-ext-add-form",children:[e.jsxs("div",{className:"pi-ext-add-form-row",children:[e.jsx("input",{type:"text",className:"input",placeholder:"npm:pi-extension-name or git:https://github.com/...",value:h,onChange:s=>F(s.target.value),onKeyDown:s=>{s.key==="Enter"&&(s.preventDefault(),R())},disabled:N}),e.jsxs("button",{className:"btn btn-primary",onClick:R,disabled:N||!h.trim(),children:[e.jsx(V,{size:14}),N?"Installing…":"Add"]})]}),e.jsx("div",{className:"pi-ext-add-form-row",children:e.jsx("button",{className:"btn",onClick:U,disabled:E,children:E?"Reinstalling Fusion…":"Reinstall Fusion skill"})})]}),c.packages.length>0?e.jsx("div",{className:"pi-ext-package-list",children:c.packages.map((s,i)=>{const a=typeof s=="string"?s:s.source,n=oe(a),g=de(a),j=typeof s=="object"&&s!==null,v=j&&(s.extensions?.length??0)>0||(s.skills?.length??0)>0||(s.prompts?.length??0)>0||(s.themes?.length??0)>0,k=K.has(i);return e.jsxs("div",{className:"pi-ext-package-card",children:[e.jsxs("div",{className:"pi-ext-package-header",children:[j&&v?e.jsx("button",{className:"pi-ext-expand-btn",onClick:()=>B(i),"aria-expanded":k,children:k?e.jsx(T,{size:14}):e.jsx(ee,{size:14})}):e.jsx("span",{className:"pi-ext-expand-placeholder"}),e.jsx("span",{className:`pi-ext-source-badge pi-ext-source-badge--${n}`,children:n}),e.jsx("span",{className:"pi-ext-package-source",children:g}),e.jsxs("div",{className:"pi-ext-package-actions",children:[j&&v&&e.jsxs("span",{className:"pi-ext-filter-hint",children:[s.extensions?.length??0," ext,"," ",s.skills?.length??0," skill,"," ",s.prompts?.length??0," prompt,"," ",s.themes?.length??0," theme"]}),e.jsx("button",{className:"btn-icon touch-target pi-ext-remove-btn",onClick:()=>Y(a),title:"Remove package","aria-label":`Remove package ${g}`,children:e.jsx(se,{size:14})})]})]}),j&&v&&k&&e.jsxs("div",{className:"pi-ext-filter-list",children:[s.extensions?.length?e.jsxs("div",{className:"pi-ext-filter-section",children:[e.jsx(M,{size:12}),e.jsx("span",{className:"pi-ext-filter-label",children:"Extensions:"}),s.extensions.map((o,d)=>e.jsx("span",{className:"pi-ext-filter-tag",children:o},d))]}):null,s.skills?.length?e.jsxs("div",{className:"pi-ext-filter-section",children:[e.jsx(L,{size:12}),e.jsx("span",{className:"pi-ext-filter-label",children:"Skills:"}),s.skills.map((o,d)=>e.jsx("span",{className:"pi-ext-filter-tag",children:o},d))]}):null,s.prompts?.length?e.jsxs("div",{className:"pi-ext-filter-section",children:[e.jsx(D,{size:12}),e.jsx("span",{className:"pi-ext-filter-label",children:"Prompts:"}),s.prompts.map((o,d)=>e.jsx("span",{className:"pi-ext-filter-tag",children:o},d))]}):null,s.themes?.length?e.jsxs("div",{className:"pi-ext-filter-section",children:[e.jsx(I,{size:12}),e.jsx("span",{className:"pi-ext-filter-label",children:"Themes:"}),s.themes.map((o,d)=>e.jsx("span",{className:"pi-ext-filter-tag",children:o},d))]}):null]})]},i)})}):e.jsxs("div",{className:"empty-state",children:[e.jsx(y,{size:32,className:"text-muted"}),e.jsx("p",{children:"No packages configured."}),e.jsx("p",{className:"text-muted",children:"Add a package source above to get started."})]}),e.jsxs("div",{className:"pi-ext-top-level",children:[u("Extensions",M,"extensions"),u("Skills",L,"skills"),u("Prompts",D,"prompts"),u("Themes",I,"themes")]})]}):e.jsxs("div",{className:"empty-state",children:[e.jsx(y,{size:32,className:"text-muted"}),e.jsx("p",{children:"Failed to load Pi settings."})]}),e.jsxs("div",{className:"pi-ext-discovered-section",children:[e.jsxs("div",{className:"pi-ext-discovered-header",children:[e.jsx("h4",{children:"Discovered Extensions"}),e.jsx("button",{className:"btn-icon",onClick:m,disabled:b,title:"Refresh extensions",children:e.jsx($,{size:14,className:b?"spin":""})})]}),e.jsx("p",{className:"pi-ext-description",children:"Installed extensions resolved from packages and configured paths."}),b?e.jsx("div",{className:"loading-state",children:"Loading extensions…"}):p.length===0?e.jsxs("div",{className:"empty-state",children:[e.jsx(y,{size:32,className:"text-muted"}),e.jsx("p",{children:"No extensions discovered."})]}):e.jsx("div",{className:"pi-ext-list",children:p.map(s=>e.jsxs("div",{className:"pi-ext-item",children:[e.jsxs("div",{className:"pi-ext-item-content",children:[e.jsxs("div",{className:"pi-ext-info",children:[e.jsx("span",{className:"pi-ext-name",children:s.name}),e.jsx("span",{className:`pi-ext-source-badge pi-ext-source-badge--${ce(s.source)}`,children:re(s.source)})]}),e.jsx("span",{className:"pi-ext-path",children:s.path})]}),e.jsx("div",{className:"pi-ext-actions",children:e.jsxs("label",{className:"toggle-switch",children:[e.jsx("input",{type:"checkbox",checked:s.enabled,onChange:()=>void q(s),disabled:X,"aria-label":`Toggle ${s.name}`}),e.jsx("span",{className:"toggle-slider"})]})})]},s.id))})]})]})}export{he as PiExtensionsManager};
@@ -1 +0,0 @@
1
- .pi-ext-manager{display:flex;flex-direction:column;gap:var(--space-lg)}.pi-ext-manager-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:var(--space-sm);border-bottom:1px solid var(--border)}.pi-ext-manager-header .settings-section-heading{margin:0}.pi-ext-manager-actions{display:flex;gap:var(--space-sm);align-items:center}.pi-ext-description{font-size:.82rem;color:var(--text-muted);line-height:1.45;margin:0}.pi-ext-item{display:flex;align-items:flex-start;justify-content:space-between;padding:var(--space-sm) var(--space-md);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);transition:border-color var(--transition-fast);flex-wrap:wrap;gap:var(--space-sm)}.pi-ext-item:hover{border-color:var(--text-dim)}.pi-ext-item-content{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0;flex:1}.pi-ext-info{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap}.pi-ext-name{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pi-ext-source-badge{display:inline-flex;align-items:center;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-pill);font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;background:color-mix(in srgb,currentColor 12%,transparent)}.pi-ext-source-badge--global{color:var(--color-info)}.pi-ext-source-badge--project{color:var(--color-success)}.pi-ext-path{font-size:.75rem;font-family:var(--font-mono);color:var(--text-dim);word-break:break-all;line-height:1.4}.pi-ext-actions{display:flex;align-items:center;gap:var(--space-xs);flex-shrink:0}.pi-ext-manager .empty-state,.pi-ext-manager .loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-2xl);text-align:center;color:var(--text-muted)}.pi-ext-list{display:flex;flex-direction:column;gap:var(--space-sm)}.pi-ext-item{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-md);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md)}.pi-ext-add-form{display:flex;flex-direction:column;gap:var(--space-sm);margin-bottom:var(--space-md)}.pi-ext-add-form-row{display:flex;gap:var(--space-sm);align-items:center}.pi-ext-add-form-row .input{flex:1;min-width:0}.pi-ext-package-list{display:flex;flex-direction:column;gap:var(--space-sm)}.pi-ext-package-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden}.pi-ext-package-header{display:flex;align-items:center;gap:var(--space-sm);padding:calc(var(--space-sm) + 2px) var(--space-md);flex-wrap:wrap}.pi-ext-expand-btn{background:none;border:none;padding:var(--space-xs);cursor:pointer;color:var(--text-muted);display:flex;align-items:center;border-radius:var(--radius-sm);transition:color var(--transition-fast)}.pi-ext-expand-btn:hover{color:var(--text)}.pi-ext-expand-btn:focus-visible{box-shadow:var(--focus-ring-strong);outline:none}.pi-ext-expand-placeholder{width:18px;height:18px;flex-shrink:0}.pi-ext-source-badge--npm{color:var(--color-info);background:color-mix(in srgb,var(--color-info) 12%,transparent)}.pi-ext-source-badge--git{color:var(--color-success);background:color-mix(in srgb,var(--color-success) 12%,transparent)}.pi-ext-source-badge--local{color:var(--text-muted);background:color-mix(in srgb,var(--text-muted) 12%,transparent)}.pi-ext-package-source{font-family:var(--font-mono);font-size:.82rem;flex:1;min-width:0;word-break:break-all}.pi-ext-filter-hint{font-size:.72rem;color:var(--text-muted);flex-shrink:0}.pi-ext-package-actions{display:flex;align-items:center;gap:var(--space-xs);flex-shrink:0}.pi-ext-remove-btn{background:none;border:none;padding:var(--space-xs);min-width:var(--space-2xl);min-height:var(--space-2xl);cursor:pointer;color:var(--text-muted);display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius-sm);transition:color var(--transition-fast),background-color var(--transition-fast)}.pi-ext-remove-btn:hover{color:var(--color-error);background:color-mix(in srgb,var(--color-error) 10%,transparent)}.pi-ext-remove-btn:focus-visible{box-shadow:var(--focus-ring-strong);outline:none}.pi-ext-filter-list{padding:var(--space-sm) var(--space-md);border-top:1px solid var(--border);background:var(--bg);display:flex;flex-direction:column;gap:var(--space-sm)}.pi-ext-filter-section{display:flex;align-items:center;gap:var(--space-xs);flex-wrap:wrap;color:var(--text-muted)}.pi-ext-filter-label{font-size:.72rem;font-weight:500}.pi-ext-filter-tag{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:.72rem;font-family:var(--font-mono);color:var(--text-muted)}.pi-ext-top-level{display:flex;flex-direction:column;gap:var(--space-md);margin-top:var(--space-md);padding-top:var(--space-md);border-top:1px solid var(--border)}.pi-ext-section{display:flex;flex-direction:column;gap:var(--space-sm)}.pi-ext-section-header{display:flex;align-items:center;gap:var(--space-xs);color:var(--text-muted);font-size:.82rem}.pi-ext-section-header span:first-of-type{font-weight:500}.pi-ext-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 var(--space-xs);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-pill);font-size:.68rem;color:var(--text-dim)}.pi-ext-resource-list{display:flex;flex-wrap:wrap;gap:var(--space-xs)}.pi-ext-resource-tag{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm)}.pi-ext-resource-path{font-size:.75rem;font-family:var(--font-mono);color:var(--text-muted);max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pi-ext-resource-remove{background:none;border:none;padding:var(--space-xs);min-width:var(--space-2xl);min-height:var(--space-2xl);cursor:pointer;color:var(--text-dim);display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius-sm);transition:color var(--transition-fast),background-color var(--transition-fast)}.pi-ext-resource-remove:hover{color:var(--color-error);background:color-mix(in srgb,var(--color-error) 10%,transparent)}.pi-ext-resource-remove:focus-visible{box-shadow:var(--focus-ring-strong);outline:none}@media(max-width:768px){.pi-ext-list{gap:var(--space-xs)}.pi-ext-item{padding:var(--space-sm)}.pi-ext-add-form-row{flex-direction:column;align-items:stretch}.pi-ext-add-form-row .btn,.pi-ext-add-form-row .btn-primary{width:100%}.pi-ext-package-header{padding:var(--space-sm) var(--space-md)}.pi-ext-resource-path{max-width:120px}}.pi-ext-discovered-section{margin-top:var(--space-lg);padding-top:var(--space-lg);border-top:1px solid var(--border)}.pi-ext-discovered-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-sm)}.pi-ext-discovered-header h4{margin:0;font-size:.9rem;font-weight:600}.pi-ext-source-badge--fusion-global{color:var(--color-info);background:color-mix(in srgb,var(--color-info) 12%,transparent)}.pi-ext-source-badge--pi-global{color:var(--color-warning);background:color-mix(in srgb,var(--color-warning) 12%,transparent)}.pi-ext-source-badge--fusion-project{color:var(--color-success);background:color-mix(in srgb,var(--color-success) 12%,transparent)}.pi-ext-source-badge--pi-project{color:var(--color-muted);background:color-mix(in srgb,var(--color-muted) 12%,transparent)}.pi-ext-source-badge--package{color:var(--in-progress);background:color-mix(in srgb,var(--in-progress) 12%,transparent)}
@@ -1 +0,0 @@
1
- .plugin-manager,.plugin-manager-detail{display:flex;flex-direction:column;gap:var(--space-lg)}.plugin-manager-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:var(--space-sm);border-bottom:1px solid var(--border)}.plugin-manager-actions{display:flex;gap:var(--space-sm);align-items:center}.plugin-install-form{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-lg);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.plugin-install-hint{margin:0;font-size:.85rem;color:var(--text-secondary, var(--text-muted));line-height:1.45}.plugin-install-hint code{padding:1px var(--space-xs);border-radius:var(--radius-sm);background:color-mix(in srgb,var(--text-muted) 12%,transparent);font-size:.85em}.plugin-install-actions{display:flex;gap:var(--space-sm);justify-content:flex-end}.plugin-list{display:flex;flex-direction:column;gap:var(--space-sm)}.plugin-item{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);transition:border-color var(--transition-fast)}.plugin-item:hover{border-color:var(--text-dim)}.plugin-info{display:flex;align-items:center;gap:var(--space-sm);min-width:0}.plugin-name{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.plugin-version{font-size:.85rem}.plugin-state-badge{display:inline-flex;align-items:center;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-pill);font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;background:color-mix(in srgb,currentColor 12%,transparent)}.plugin-actions{display:flex;align-items:center;gap:var(--space-xs);flex-shrink:0}.plugin-manager-detail-header,.plugin-detail-title{display:flex;align-items:center;gap:var(--space-md);flex-wrap:wrap}.plugin-detail-title h3{margin:0}.plugin-detail-content{display:flex;flex-direction:column;gap:var(--space-lg)}.plugin-detail-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-md)}.plugin-description{font-size:.95rem;color:var(--text-secondary, var(--text-muted));line-height:1.5}.plugin-detail-meta-row{display:flex;align-items:center;gap:var(--space-xs);font-size:.9rem;color:var(--text-muted)}.plugin-homepage a{display:inline-flex;align-items:center;gap:var(--space-xs);color:var(--color-info);font-size:.85rem}.plugin-settings-form .settings-section-heading{margin:0}.plugin-settings-form{display:flex;flex-direction:column;gap:var(--space-lg);margin-top:var(--space-xs)}.plugin-settings-form .form-group{padding:0;margin-bottom:0}.plugin-settings-array{display:flex;flex-direction:column;gap:var(--space-sm)}.plugin-settings-array-item{display:flex;align-items:center;gap:var(--space-sm)}.plugin-settings-array-item input{flex:1}.plugin-detail-actions{display:flex;gap:var(--space-sm);padding-top:var(--space-md);border-top:1px solid var(--border);justify-content:flex-end}.plugin-manager .empty-state,.plugin-manager .loading-state,.plugin-manager .settings-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-2xl);text-align:center;color:var(--text-muted)}@media(max-width:768px){.plugin-manager-detail-header{gap:var(--space-sm)}.plugin-detail-title{gap:var(--space-xs)}.plugin-detail-card{padding:var(--space-md);gap:var(--space-sm)}.plugin-list{gap:var(--space-xs)}.plugin-item{padding:var(--space-md)}.plugin-actions{gap:var(--space-xs)}.plugin-detail-actions{flex-wrap:wrap;justify-content:stretch}.plugin-detail-actions button{flex:1 1 auto;min-height:36px}}
@@ -1 +0,0 @@
1
- import{r as o,j as e}from"./vendor-react-K0fH_qHe.js";import{bL as H,s as J,X as k,ai as K,w as D,bM as O,I as A,R as Q,bN as X,ar as G,bO as W,bP as Y,bQ as Z,bR as T,bS as ee,bT as se,bU as te}from"./index-rNf7s96d.js";import{D as ne}from"./DirectoryPicker-izgMlS27.js";import"./vendor-xterm-DzcZoU0P.js";import"./folder-open-CI4TCD7P.js";const j={started:"var(--color-success)",loaded:"var(--color-warning)",error:"var(--color-error)",stopped:"var(--color-muted)",installed:"var(--color-info)"};function oe({addToast:r,projectId:d}){const[N,x]=o.useState([]),[S,w]=o.useState(!0),[U,f]=o.useState(!1),[h,v]=o.useState(""),[C,P]=o.useState(!1),[b,$]=o.useState(null),[a,y]=o.useState(null),[i,g]=o.useState({}),[V,R]=o.useState(!1),p=o.useCallback(async()=>{try{w(!0);const s=await H(d);x(s)}catch(s){r(`Failed to load plugins: ${s instanceof Error?s.message:String(s)}`,"error")}finally{w(!1)}},[d,r]);o.useEffect(()=>{p()},[p]);const B=o.useRef([]);B.current=N,o.useEffect(()=>{const s=d?`?projectId=${encodeURIComponent(d)}`:"",t=m=>{try{const n=JSON.parse(m.data);if(d&&n.projectId&&n.projectId!==d)return;switch(n.transition){case"installing":case"enabled":case"disabled":case"settings-updated":x(c=>{const u=c.findIndex(l=>l.id===n.pluginId);if(u>=0){const l=[...c];return l[u]={...l[u],enabled:n.enabled,state:n.state,settings:n.settings,error:n.error},l}else return p(),c});break;case"uninstalled":x(c=>c.filter(u=>u.id!==n.pluginId));break;case"error":x(c=>{const u=c.findIndex(l=>l.id===n.pluginId);if(u>=0){const l=[...c];return l[u]={...l[u],state:n.state,error:n.error},l}return c});break}}catch{}};return J(`/api/events${s}`,{events:{"plugin:lifecycle":t},onReconnect:()=>{p()}})},[d,p]);const E=async()=>{if(!h.trim()){r("Please enter a plugin path","error");return}try{P(!0),await se({path:h},d),r("Plugin installed successfully","success"),f(!1),v(""),await p()}catch(s){r(`Failed to install plugin: ${s instanceof Error?s.message:String(s)}`,"error")}finally{P(!1)}},I=async s=>{try{await T(s.id,d),r(`${s.name} enabled`,"success"),await p()}catch(t){r(`Failed to enable plugin: ${t instanceof Error?t.message:String(t)}`,"error")}},z=async s=>{try{await Z(s.id,d),r(`${s.name} disabled`,"success"),await p()}catch(t){r(`Failed to disable plugin: ${t instanceof Error?t.message:String(t)}`,"error")}},L=async s=>{try{$(s.id),await Y(s.id,d),r(`${s.name} reloaded`,"success"),await p()}catch(t){r(`Failed to reload plugin: ${t instanceof Error?t.message:String(t)}`,"error")}finally{$(null)}},q=async s=>{if(confirm(`Are you sure you want to uninstall "${s.name}"?`))try{await ee(s.id,d),r(`${s.name} uninstalled`,"success"),await p(),y(null)}catch(t){r(`Failed to uninstall plugin: ${t instanceof Error?t.message:String(t)}`,"error")}},M=async s=>{y(s);try{R(!0);const t=await te(s.id,d);g(t)}catch{g({})}finally{R(!1)}},_=async()=>{if(a)try{await W(a.id,i,d),r("Settings saved","success")}catch(s){r(`Failed to save settings: ${s instanceof Error?s.message:String(s)}`,"error")}};return a?e.jsxs("div",{className:"plugin-manager-detail","data-testid":"plugin-manager-detail",children:[e.jsxs("div",{className:"plugin-manager-detail-header",children:[e.jsx("button",{className:"btn-icon",onClick:()=>y(null),"aria-label":"Back to plugin list",children:e.jsx(k,{size:16})}),e.jsxs("div",{className:"plugin-detail-title",children:[e.jsx("h3",{children:a.name}),e.jsx("span",{className:"plugin-state-badge",style:{color:j[a.state]||j.installed},children:a.state})]})]}),e.jsxs("div",{className:"plugin-detail-content",children:[e.jsxs("div",{className:"plugin-detail-card",children:[a.description&&e.jsx("p",{className:"plugin-description",children:a.description}),a.author&&e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:"Author:"}),a.author]}),a.homepage&&e.jsxs("p",{className:"plugin-detail-meta-row plugin-homepage",children:[e.jsx("span",{className:"text-muted",children:"Homepage:"}),e.jsxs("a",{href:a.homepage,target:"_blank",rel:"noopener noreferrer",children:[a.homepage,e.jsx(K,{size:12})]})]}),e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:"Version:"}),a.version]})]}),e.jsxs("div",{className:"plugin-detail-card",children:[e.jsx("h4",{className:"settings-section-heading",children:"Settings"}),V?e.jsx("p",{className:"text-muted",children:"Loading..."}):a.settingsSchema&&Object.keys(a.settingsSchema).length>0?e.jsxs("div",{className:"plugin-settings-form",children:[Object.entries(a.settingsSchema).map(([s,t])=>{const m=`setting-${s}-help`;return e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:`setting-${s}`,children:[t.label||s,t.required&&" *"]}),t.type==="string"&&!t.multiline&&e.jsx("input",{type:"text",id:`setting-${s}`,value:i[s]??"",onChange:n=>g({...i,[s]:n.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?m:void 0}),t.type==="string"&&t.multiline&&e.jsx("textarea",{id:`setting-${s}`,rows:4,value:i[s]??"",onChange:n=>g({...i,[s]:n.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?m:void 0}),t.type==="password"&&e.jsx("input",{type:"password",id:`setting-${s}`,value:i[s]??"",onChange:n=>g({...i,[s]:n.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?m:void 0}),t.type==="number"&&e.jsx("input",{type:"number",id:`setting-${s}`,value:i[s]??"",onChange:n=>g({...i,[s]:Number(n.target.value)}),"aria-describedby":t.description&&!t.required?m:void 0}),t.type==="boolean"&&e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:i[s]??!1,onChange:n=>g({...i,[s]:n.target.checked})}),t.description]}),t.type==="enum"&&e.jsxs("select",{id:`setting-${s}`,value:i[s]??"",onChange:n=>g({...i,[s]:n.target.value}),"aria-describedby":t.description&&!t.required?m:void 0,children:[e.jsx("option",{value:"",children:"Select..."}),t.enumValues?.map(n=>e.jsx("option",{value:n,children:n},n))]}),t.type==="array"&&e.jsxs("div",{className:"plugin-settings-array",children:[i[s]?.map((n,c)=>e.jsxs("div",{className:"plugin-settings-array-item",children:[e.jsx("input",{type:t.itemType==="number"?"number":"text",value:n??"",onChange:u=>{const l=u.target.value,F=[...i[s]||[]];F[c]=t.itemType==="number"?Number(l):l,g({...i,[s]:F})}}),e.jsx("button",{className:"btn-icon",onClick:()=>{const l=[...i[s]||[]];l.splice(c,1),g({...i,[s]:l})},"aria-label":"Remove item",children:e.jsx(k,{size:14})})]},c)),e.jsxs("button",{className:"btn btn-secondary",onClick:()=>{const n=i[s]||[],c=t.itemType==="number"?0:"";g({...i,[s]:[...n,c]})},children:[e.jsx(D,{size:14})," Add Item"]})]}),t.description&&!t.required&&!t.multiline&&e.jsx("span",{id:m,className:"form-help",children:t.description})]},s)}),e.jsx("button",{className:"btn btn-primary",onClick:_,children:"Save Settings"})]}):e.jsx("p",{className:"text-muted",children:"No configurable settings."})]}),e.jsxs("div",{className:"plugin-detail-actions",children:[a.state==="started"&&e.jsxs("button",{className:"btn btn-secondary",onClick:()=>L(a),disabled:b===a.id,children:[e.jsx(O,{size:14,className:b===a.id?"spin":""}),b===a.id?"Reloading...":"Reload"]}),a.enabled?e.jsx("button",{className:"btn btn-secondary",onClick:()=>z(a),children:"Disable"}):e.jsx("button",{className:"btn btn-primary",onClick:()=>I(a),children:"Enable"}),e.jsxs("button",{className:"btn-danger",onClick:()=>q(a),children:[e.jsx(A,{size:14})," Uninstall"]})]})]})]}):e.jsxs("div",{className:"plugin-manager","data-testid":"plugin-manager",children:[e.jsx("div",{className:"plugin-manager-header",children:e.jsxs("div",{className:"plugin-manager-actions",children:[e.jsx("button",{className:"btn-icon",onClick:p,title:"Refresh",children:e.jsx(Q,{size:16,className:S?"spin":""})}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>f(!0),children:[e.jsx(D,{size:14})," Install"]})]})}),U&&e.jsxs("div",{className:"plugin-install-form",children:[e.jsxs("p",{className:"plugin-install-hint",children:["Browse to a plugin package root (contains ",e.jsx("code",{children:"manifest.json"}),") or a built ",e.jsx("code",{children:"dist"})," directory."]}),e.jsx(ne,{value:h,onChange:v,placeholder:"Absolute path to plugin directory or dist folder",onInputKeyDown:s=>{s.key==="Enter"&&(s.preventDefault(),E())}}),e.jsxs("div",{className:"plugin-install-actions",children:[e.jsx("button",{className:"btn btn-primary",onClick:E,disabled:C||!h.trim(),children:C?"Installing...":"Install Plugin"}),e.jsx("button",{className:"btn btn-secondary",onClick:()=>{f(!1),v("")},children:"Cancel"})]})]}),S?e.jsx("div",{className:"settings-empty-state",children:"Loading plugins..."}):N.length===0?e.jsxs("div",{className:"settings-empty-state",children:[e.jsx(X,{size:32,className:"text-muted"}),e.jsx("p",{children:"No plugins installed."}),e.jsx("p",{className:"text-muted",children:"Install a plugin to get started."})]}):e.jsx("div",{className:"plugin-list",children:N.map(s=>e.jsxs("div",{className:"plugin-item",children:[e.jsxs("div",{className:"plugin-info",children:[e.jsx("span",{className:"plugin-name",children:s.name}),e.jsxs("span",{className:"plugin-version text-muted",children:["v",s.version]}),e.jsx("span",{className:"plugin-state-badge",style:{color:j[s.state]||j.installed},children:s.state})]}),e.jsxs("div",{className:"plugin-actions",children:[s.state==="started"&&e.jsx("button",{className:"btn-icon",onClick:()=>L(s),disabled:b===s.id,title:"Reload",children:e.jsx(O,{size:14,className:b===s.id?"spin":""})}),e.jsxs("label",{className:"toggle-switch",children:[e.jsx("input",{type:"checkbox",checked:s.enabled,onChange:()=>s.enabled?z(s):I(s)}),e.jsx("span",{className:"toggle-slider"})]}),e.jsx("button",{className:"btn-icon",onClick:()=>M(s),title:"Settings",children:e.jsx(G,{size:14})}),e.jsx("button",{className:"btn-icon",onClick:()=>q(s),title:"Uninstall",children:e.jsx(A,{size:14})})]})]},s.id))})]})}export{oe as PluginManager,j as STATE_COLORS};
@@ -1 +0,0 @@
1
- import{r as i,j as e}from"./vendor-react-K0fH_qHe.js";import{f as B,b6 as G,b7 as H,b8 as J,aN as O,X as $,R as U,K as Y,D as Z,L as _,ae as I}from"./index-rNf7s96d.js";import"./vendor-xterm-DzcZoU0P.js";function ie({projectId:n,addToast:o,onClose:P}){const[d,u]=i.useState([]),[w,S]=i.useState(!0),[Q,y]=i.useState(!1),[E,N]=i.useState(null),[L,K]=i.useState([]),[h,A]=i.useState(""),[m,g]=i.useState(null),[k,x]=i.useState(null),[V,D]=i.useState(!1),[R,j]=i.useState(null),r=i.useRef(null),[p,M]=i.useState(""),z=h.trim()?d.filter(s=>s.name.toLowerCase().includes(h.toLowerCase())||s.relativePath.toLowerCase().includes(h.toLowerCase())):d,f=i.useCallback(async()=>{S(!0);try{const s=await B(n);u(s)}catch(s){const l=s instanceof Error?s.message:"Failed to load discovered skills";o(l,"error")}finally{S(!1)}},[n,o]),v=i.useCallback(async s=>{y(!0),N(null);try{const l=await G(s,20,n);K(l.entries)}catch(l){const a=l;if(a.error&&a.code)N("Catalog is temporarily unavailable. Please try again later.");else{const c=l instanceof Error?l.message:"Failed to load catalog";N(c)}}finally{y(!1)}},[n]);i.useEffect(()=>{f(),v("")},[f,v]);const T=i.useCallback(s=>{A(s),r.current&&clearTimeout(r.current),r.current=setTimeout(()=>{M(s),r.current=null},300)},[]);i.useEffect(()=>()=>{r.current&&(clearTimeout(r.current),r.current=null)},[]),i.useEffect(()=>{v(p)},[p,v]);const W=i.useCallback(async(s,l)=>{const a=!l;u(c=>c.map(t=>t.id===s?{...t,toggling:!0}:t));try{await H(s,a,n),u(c=>c.map(t=>t.id===s?{...t,enabled:a,toggling:!1}:t)),o(`Skill ${a?"enabled":"disabled"}`,"success")}catch(c){u(q=>q.map(C=>C.id===s?{...C,toggling:!1}:C));const t=c instanceof Error?c.message:"Failed to toggle skill";o(`Failed to toggle skill: ${t}`,"error")}},[n,o]),b=i.useCallback(async s=>{D(!0),j(null),x(null);try{const l=await J(s,n);x(l)}catch(l){const a=l instanceof Error?l.message:"Failed to load skill content";j(a)}finally{D(!1)}},[n]),F=i.useCallback((s,l)=>{if(!(l&&l.target.closest(".skills-view-item-toggle"))){if(m===s){g(null),x(null),j(null);return}g(s),b(s)}},[m,b]),X=i.useCallback(s=>{m!==s&&g(s),b(s)},[b,m]);return e.jsxs("div",{className:"skills-view","data-testid":"skills-view",children:[e.jsxs("div",{className:"skills-view-header",children:[e.jsxs("div",{className:"skills-view-title",children:[e.jsxs("h2",{children:[e.jsx(O,{size:20}),"Skills"]}),e.jsxs("span",{className:"skills-view-count","aria-label":`${d.length} discovered skills`,children:[d.length," discovered"]})]}),e.jsxs("div",{className:"skills-view-actions",children:[e.jsx("button",{className:"btn-icon skills-view-close touch-target",onClick:P,"aria-label":"Close skills view",children:e.jsx($,{size:16})}),e.jsxs("button",{className:"btn btn-sm touch-target",onClick:()=>void f(),disabled:w,children:[e.jsx(U,{size:14,className:w?"spin":""}),"Refresh"]})]})]}),e.jsxs("div",{className:"skills-view-content",children:[e.jsx("div",{className:"skills-view-search",children:e.jsx("input",{type:"text",className:"form-input",placeholder:"Search skills...",value:h,onChange:s=>T(s.target.value),"aria-label":"Search skills"})}),e.jsxs("section",{className:"skills-view-section","aria-labelledby":"discovered-skills-title",children:[e.jsx("h3",{id:"discovered-skills-title",className:"skills-view-section-title",children:"Discovered Skills"}),w?e.jsxs("div",{className:"skills-view-loading",children:[e.jsx("span",{className:"spinner"}),"Loading discovered skills..."]}):d.length===0?e.jsx("div",{className:"skills-view-empty",children:e.jsx("p",{children:"No skills discovered in this project."})}):z.length===0?e.jsx("div",{className:"skills-view-empty",children:e.jsx("p",{children:"No discovered skills match your search."})}):e.jsx("div",{className:"skills-view-list",children:z.map(s=>{const l=m===s.id;return e.jsxs("div",{children:[e.jsxs("div",{className:`skills-view-item${l?" skills-view-item--selected":""}`,onClick:a=>F(s.id,a),role:"button",tabIndex:0,onKeyDown:a=>{(a.key==="Enter"||a.key===" ")&&(a.preventDefault(),F(s.id))},"aria-expanded":l,"aria-label":`View details for ${s.name}`,children:[e.jsxs("div",{className:"skills-view-item-info",children:[e.jsxs("span",{className:"skills-view-item-name",children:[l?e.jsx(Y,{size:14}):e.jsx(Z,{size:14}),s.name]}),e.jsx("span",{className:"skills-view-item-path",children:s.relativePath}),e.jsx("span",{className:"skills-view-item-source",children:s.metadata.source})]}),e.jsxs("label",{className:"skills-view-item-toggle",onClick:a=>a.stopPropagation(),children:[e.jsx("input",{type:"checkbox",checked:s.enabled,disabled:s.toggling,onChange:()=>void W(s.id,s.enabled),"aria-label":`${s.enabled?"Disable":"Enable"} ${s.name}`}),e.jsx("span",{className:"skills-view-toggle-slider"})]})]}),l&&e.jsxs("div",{className:"skills-view-detail","data-testid":"skill-detail",children:[e.jsxs("div",{className:"skills-view-detail-header",children:[e.jsx("span",{className:"skills-view-detail-title",children:s.name}),e.jsxs("button",{className:"btn btn-sm skills-view-detail-close",onClick:()=>{g(null),x(null),j(null)},"aria-label":"Close skill detail",children:[e.jsx($,{size:14}),"Close"]})]}),V?e.jsxs("div",{className:"skills-view-detail-loading",children:[e.jsx(_,{size:16,className:"spin"}),"Loading skill content..."]}):R?e.jsxs("div",{className:"skills-view-detail-error",children:[e.jsx(I,{size:14}),e.jsx("span",{children:R}),e.jsx("button",{className:"btn btn-sm",onClick:()=>X(s.id),children:"Retry"})]}):k?e.jsxs(e.Fragment,{children:[e.jsx("pre",{className:"skills-view-detail-content",children:k.skillMd||"(No SKILL.md found)"}),k.files.length>0&&e.jsxs("div",{className:"skills-view-detail-files",children:[e.jsx("span",{className:"skills-view-detail-files-label",children:"Files:"}),k.files.map(a=>e.jsxs("span",{className:"badge badge--sm",children:[a.name,a.type==="directory"&&"/"]},a.relativePath))]})]}):null]})]},s.id)})})]}),e.jsxs("section",{className:"skills-view-section","aria-labelledby":"catalog-title",children:[e.jsx("h3",{id:"catalog-title",className:"skills-view-section-title",children:"Skills Catalog"}),E?e.jsxs("div",{className:"skills-view-error",children:[e.jsx("p",{children:E}),e.jsx("button",{className:"btn btn-sm",onClick:()=>void v(p),children:"Try Again"})]}):Q?e.jsxs("div",{className:"skills-view-loading",children:[e.jsx("span",{className:"spinner"}),"Loading catalog..."]}):L.length===0?e.jsx("div",{className:"skills-view-empty",children:h?e.jsx("p",{children:"No skills match your search."}):e.jsx("p",{children:"No skills available in the catalog."})}):e.jsx("div",{className:"skills-view-grid",children:L.map(s=>e.jsxs("div",{className:"skills-view-card",children:[e.jsx("h4",{className:"skills-view-card-title",children:s.name}),s.description&&e.jsx("p",{className:"skills-view-card-description",children:s.description}),s.tags&&s.tags.length>0&&e.jsx("div",{className:"skills-view-card-tags",children:s.tags.map(l=>e.jsx("span",{className:"badge badge--sm",children:l},l))}),s.installs!==void 0&&e.jsxs("span",{className:"skills-view-card-installs",children:[s.installs.toLocaleString()," installs"]})]},s.id))})]})]})]})}export{ie as SkillsView};