@runfusion/fusion 0.18.1 → 0.20.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 (60) hide show
  1. package/dist/bin.js +6533 -2558
  2. package/dist/client/assets/AgentDetailView-C6BG7O7i.js +18 -0
  3. package/dist/client/assets/AgentDetailView-CUtWvXBn.css +1 -0
  4. package/dist/client/assets/ChatView-DeXUYwSY.js +1 -0
  5. package/dist/client/assets/{DevServerView-r6V3FqkY.js → DevServerView-Dariyxt_.js} +1 -1
  6. package/dist/client/assets/{DirectoryPicker-CTZE95Fk.js → DirectoryPicker-SchiK-Aq.js} +1 -1
  7. package/dist/client/assets/{DocumentsView-DSEf1Lmg.js → DocumentsView-C6v-tBhG.js} +1 -1
  8. package/dist/client/assets/InsightsView-AWo5o_81.css +1 -0
  9. package/dist/client/assets/InsightsView-Cqim12az.js +11 -0
  10. package/dist/client/assets/{MemoryView-DicXjec9.js → MemoryView-CakLoJtY.js} +2 -2
  11. package/dist/client/assets/NodesView-BxGm3poT.js +14 -0
  12. package/dist/client/assets/{NodesView-sJgPLTzz.css → NodesView-fXqDk9ur.css} +1 -1
  13. package/dist/client/assets/PiExtensionsManager-lJbmskyZ.js +6 -0
  14. package/dist/client/assets/PluginManager-BZjNNf9m.js +1 -0
  15. package/dist/client/assets/ResearchView-Bzsr9V0y.js +1 -0
  16. package/dist/client/assets/{RoadmapsView-DfEF3mql.js → RoadmapsView-CeKks_OI.js} +2 -2
  17. package/dist/client/assets/SettingsModal-BWe0KrGY.css +1 -0
  18. package/dist/client/assets/SettingsModal-D-9CLguN.js +31 -0
  19. package/dist/client/assets/{SettingsModal-YcScdFiG.js → SettingsModal-YdeVPhRJ.js} +1 -1
  20. package/dist/client/assets/{SetupWizardModal-DRF5fOoR.css → SetupWizardModal-CGYGKurR.css} +1 -1
  21. package/dist/client/assets/SetupWizardModal-DAC04LlA.js +1 -0
  22. package/dist/client/assets/{SkillsView-Dkq2CQla.js → SkillsView-CClC_5RN.js} +1 -1
  23. package/dist/client/assets/index-CrHLf3pB.js +1222 -0
  24. package/dist/client/assets/index-Df1bHDY4.css +1 -0
  25. package/dist/client/assets/star-DxVRh9VT.js +6 -0
  26. package/dist/client/assets/{users-Cp5TSxVm.js → users-3SD3oNMQ.js} +1 -1
  27. package/dist/client/index.html +2 -2
  28. package/dist/client/version.json +1 -1
  29. package/dist/droid-cli/index.ts +3 -5
  30. package/dist/droid-cli/package.json +1 -1
  31. package/dist/droid-cli/src/__tests__/event-bridge.test.ts +6 -1315
  32. package/dist/droid-cli/src/__tests__/provider.test.ts +6 -1927
  33. package/dist/droid-cli/src/control-handler.ts +1 -82
  34. package/dist/droid-cli/src/event-bridge.ts +1 -397
  35. package/dist/droid-cli/src/mcp-config.ts +1 -144
  36. package/dist/droid-cli/src/process-manager.ts +1 -358
  37. package/dist/droid-cli/src/prompt-builder.ts +1 -629
  38. package/dist/droid-cli/src/provider.ts +1 -447
  39. package/dist/droid-cli/src/stream-parser.ts +1 -37
  40. package/dist/droid-cli/src/thinking-config.ts +1 -83
  41. package/dist/droid-cli/src/tool-mapping.ts +1 -147
  42. package/dist/droid-cli/src/types.ts +1 -87
  43. package/dist/extension.js +4674 -1748
  44. package/dist/pi-claude-cli/package.json +1 -1
  45. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  46. package/package.json +5 -4
  47. package/skill/fusion/references/engine-tools.md +5 -1
  48. package/skill/fusion/references/extension-tools.md +3 -1
  49. package/dist/client/assets/ChatView-3Sqm6teN.js +0 -1
  50. package/dist/client/assets/InsightsView-4KiUKzbz.css +0 -1
  51. package/dist/client/assets/InsightsView-F5PZsX5u.js +0 -11
  52. package/dist/client/assets/NodesView-DddCS7zB.js +0 -14
  53. package/dist/client/assets/PiExtensionsManager-Ch7si-v8.js +0 -11
  54. package/dist/client/assets/PluginManager-LcTh_fHP.js +0 -1
  55. package/dist/client/assets/ResearchView-D0TY1VcX.js +0 -1
  56. package/dist/client/assets/SettingsModal-SOADcCNJ.js +0 -31
  57. package/dist/client/assets/SettingsModal-oOnIed5O.css +0 -1
  58. package/dist/client/assets/SetupWizardModal-EDYuf9Yc.js +0 -1
  59. package/dist/client/assets/index-4hC8zoTD.css +0 -1
  60. package/dist/client/assets/index-DNzA4aZ7.js +0 -1229
@@ -1 +1 @@
1
- import{r as e}from"./vendor-react-K0fH_qHe.js";import{cX as C}from"./index-DNzA4aZ7.js";function L(k={}){const{projectId:d,pollInterval:b=6e4,autoRefresh:p=!1,enabled:t=!0}=k,[S,o]=e.useState(null),[m,l]=e.useState(t),[E,c]=e.useState(null),[R,v]=e.useState(null),r=e.useRef(null),n=e.useRef(null),a=e.useRef(!0),s=e.useCallback(async()=>{if(!t){l(!1),c(null),o(null);return}r.current&&r.current.abort(),r.current=new AbortController,l(!0),c(null),o(null);try{const u=await C(d);if(!a.current)return;o(u),c(null),v(new Date),l(!1)}catch(u){if(u instanceof Error&&u.name==="AbortError"||!a.current)return;const A=u instanceof Error?u.message:"Failed to fetch memory backend status";c(A),l(!1)}},[t,d]);e.useEffect(()=>(a.current=!0,t?(s(),()=>{a.current=!1}):(r.current&&r.current.abort(),o(null),c(null),l(!1),()=>{a.current=!1})),[t,s]),e.useEffect(()=>{if(!(!t||!p))return n.current=setInterval(()=>{s()},b),()=>{n.current&&(clearInterval(n.current),n.current=null)}},[t,p,b,s]),e.useEffect(()=>()=>{a.current=!1,r.current&&r.current.abort(),n.current&&(clearInterval(n.current),n.current=null)},[]);const h=e.useCallback(()=>s(),[s]),f=m?null:S,B=f?.currentBackend??null,i=f?.capabilities??null,y=f?.availableBackends??[],I=i?.readable??!1,g=i?.writable??!1,w=i?.supportsAtomicWrite??!1;return{status:f,currentBackend:B,capabilities:i,availableBackends:y,isReadable:I,isWritable:g,supportsAtomicWrite:w,loading:m,error:E,lastUpdated:R,refresh:h}}export{L as u};
1
+ import{r as e}from"./vendor-react-K0fH_qHe.js";import{cZ as C}from"./index-CrHLf3pB.js";function L(k={}){const{projectId:d,pollInterval:b=6e4,autoRefresh:p=!1,enabled:t=!0}=k,[S,o]=e.useState(null),[m,l]=e.useState(t),[E,c]=e.useState(null),[R,v]=e.useState(null),r=e.useRef(null),n=e.useRef(null),a=e.useRef(!0),s=e.useCallback(async()=>{if(!t){l(!1),c(null),o(null);return}r.current&&r.current.abort(),r.current=new AbortController,l(!0),c(null),o(null);try{const u=await C(d);if(!a.current)return;o(u),c(null),v(new Date),l(!1)}catch(u){if(u instanceof Error&&u.name==="AbortError"||!a.current)return;const A=u instanceof Error?u.message:"Failed to fetch memory backend status";c(A),l(!1)}},[t,d]);e.useEffect(()=>(a.current=!0,t?(s(),()=>{a.current=!1}):(r.current&&r.current.abort(),o(null),c(null),l(!1),()=>{a.current=!1})),[t,s]),e.useEffect(()=>{if(!(!t||!p))return n.current=setInterval(()=>{s()},b),()=>{n.current&&(clearInterval(n.current),n.current=null)}},[t,p,b,s]),e.useEffect(()=>()=>{a.current=!1,r.current&&r.current.abort(),n.current&&(clearInterval(n.current),n.current=null)},[]);const h=e.useCallback(()=>s(),[s]),f=m?null:S,B=f?.currentBackend??null,i=f?.capabilities??null,y=f?.availableBackends??[],I=i?.readable??!1,g=i?.writable??!1,w=i?.supportsAtomicWrite??!1;return{status:f,currentBackend:B,capabilities:i,availableBackends:y,isReadable:I,isWritable:g,supportsAtomicWrite:w,loading:m,error:E,lastUpdated:R,refresh:h}}export{L as u};
@@ -1 +1 @@
1
- .wizard-option-recommended{display:inline-flex;align-items:center;width:fit-content;padding:calc(var(--space-xs) / 2) var(--space-sm);background:color-mix(in srgb,var(--color-success) 10%,transparent);color:var(--color-success)!important;border-radius:var(--radius-sm);font-size:calc(var(--space-md) - (var(--space-xs) / 4))!important;font-weight:600;text-transform:uppercase;letter-spacing:.5px}.wizard-error{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-md);background:color-mix(in srgb,var(--color-error) 10%,transparent);border:1px solid color-mix(in srgb,var(--color-error) 35%,transparent);border-radius:var(--radius-md);color:var(--color-error);font-size:calc(var(--space-md) + (var(--space-xs) / 4))}.setup-wizard-overlay{overflow-y:auto;overscroll-behavior:contain}.setup-wizard-modal{display:flex;flex-direction:column;max-width:880px;width:90vw;max-height:min(720px,calc(100vh - var(--overlay-padding-top, 10vh) - var(--space-lg)));max-height:min(720px,calc(100dvh - var(--overlay-padding-top, 10vh) - var(--space-lg)));animation:slideUp var(--transition-normal) ease-out;overflow:hidden;flex-shrink:0}@keyframes slideUp{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}.setup-wizard-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-xl) var(--space-xl) 0;gap:var(--space-md);flex-shrink:0}.setup-wizard-heading{display:flex;flex-direction:column;gap:var(--space-xs);flex:1 1 auto;min-width:0}.setup-wizard-brand{display:inline-flex;align-items:center;gap:var(--space-sm);color:var(--logo-accent)}.setup-wizard-brand-logo{width:28px;height:28px;flex-shrink:0}.setup-wizard-brand-name{font-size:22px;font-weight:800;letter-spacing:-.02em;line-height:1}.setup-wizard-title{font-size:24px;font-weight:800;color:var(--text);margin:0;line-height:1.1}.setup-wizard-content{padding:var(--space-md) var(--space-xl);flex:1 1 auto;min-height:0;overflow-y:auto}.setup-wizard-manual{display:flex;flex-direction:column}.setup-wizard-manual .welcome-icon{display:flex;align-items:center;justify-content:center;width:64px;height:64px;background:color-mix(in srgb,var(--todo) 10%,transparent);border-radius:var(--radius-lg);color:var(--todo);margin-bottom:var(--space-lg)}.setup-wizard-manual .welcome-text{font-size:14px;color:var(--text-muted);line-height:1.6;margin:0 0 var(--space-xl)}.setup-wizard-mode-switch{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm);margin:0 0 var(--space-lg);padding:0;border:0}.setup-wizard-mode-switch legend{font-size:13px;font-weight:600;color:var(--text);margin-bottom:var(--space-xs)}.setup-wizard-mode-option{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);color:var(--text);cursor:pointer;transition:border-color var(--transition-fast),background-color var(--transition-fast),box-shadow var(--transition-fast)}.setup-wizard-mode-option input{accent-color:var(--todo)}.setup-wizard-mode-option:hover{border-color:var(--text-dim)}.setup-wizard-mode-option.selected{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 10%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--todo) 25%,transparent)}.setup-wizard-manual .form-group{margin-bottom:var(--space-lg)}.setup-wizard-manual .form-group label{display:block;font-size:13px;font-weight:600;color:var(--text);margin-bottom:var(--space-xs)}.setup-wizard-manual .form-group input,.setup-wizard-manual .form-group select{width:100%;padding:10px 12px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:14px;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.setup-wizard-manual .form-group input:focus,.setup-wizard-manual .form-group select:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.setup-wizard-manual .form-hint{margin:4px 0 0;font-size:12px;color:var(--text-dim)}.setup-wizard-isolation-options{display:flex;flex-direction:column;gap:var(--space-sm)}.setup-wizard-advanced{margin-top:var(--space-sm);border-top:1px solid var(--border);padding-top:var(--space-lg)}.setup-wizard-advanced-toggle{width:100%;display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) 0;background:transparent;border:none;color:var(--text);font-size:14px;font-weight:600;text-align:left;cursor:pointer}.setup-wizard-advanced-toggle:hover{color:var(--logo-accent)}.setup-wizard-advanced-toggle:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.setup-wizard-advanced-toggle[aria-expanded=true] .setup-wizard-advanced-chevron{transform:rotate(90deg)}.setup-wizard-advanced-chevron{flex-shrink:0;transition:transform var(--transition-fast)}.setup-wizard-advanced-panel{display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-sm);padding:var(--space-md);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg)}.setup-wizard-advanced-panel .form-group:last-child{margin-bottom:0}.setup-wizard-auth-token{display:flex;flex-direction:column;gap:var(--space-sm)}.setup-wizard-auth-token-actions{display:flex;flex-wrap:wrap;gap:var(--space-sm)}.setup-wizard-auth-token-actions .btn{min-height:36px}.setup-wizard-isolation-option{display:flex;align-items:flex-start;gap:var(--space-md);padding:var(--space-md) var(--space-lg);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);cursor:pointer;transition:background-color var(--transition-fast),border-color var(--transition-fast)}.setup-wizard-isolation-option:hover{background:var(--card-hover);border-color:var(--text-dim)}.setup-wizard-isolation-option.selected{background:color-mix(in srgb,var(--todo) 5%,transparent);border-color:var(--todo);box-shadow:0 0 0 1px var(--todo)}.setup-wizard-isolation-option input[type=radio]{margin-top:2px;accent-color:var(--todo)}.setup-wizard-isolation-option-content{display:flex;flex-direction:column;gap:2px}.setup-wizard-isolation-option-content strong{font-size:14px;font-weight:600;color:var(--text)}.setup-wizard-isolation-option-content span{font-size:12px;color:var(--text-muted)}.setup-wizard-isolation-option .wizard-option-recommended{margin-top:2px}.setup-wizard-complete{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--space-sm);padding:var(--space-lg) 0}.setup-wizard-complete .success-icon{color:var(--color-success)}.setup-wizard-complete h3{font-size:20px;font-weight:700;color:var(--text);margin:0}.setup-wizard-complete p{font-size:14px;color:var(--text-muted);margin:0;line-height:1.5}.setup-wizard-footer{display:flex;align-items:center;gap:var(--space-sm);justify-content:flex-end;padding:var(--space-md) var(--space-xl) var(--space-lg);flex-shrink:0;border-top:1px solid var(--border);background:var(--surface)}.setup-wizard-footer .btn-primary{display:inline-flex;align-items:center;gap:var(--space-sm);padding:10px 24px;font-size:14px;font-weight:600}.setup-wizard-help-link{margin-right:auto;text-decoration:none}.setup-wizard-footer .btn-primary:disabled{opacity:.5;cursor:not-allowed}@media(max-width:768px){.setup-wizard-overlay{padding:max(var(--space-md),env(safe-area-inset-top,0px)) max(var(--space-md),env(safe-area-inset-right,0px)) max(var(--space-md),env(safe-area-inset-bottom,0px)) max(var(--space-md),env(safe-area-inset-left,0px))}.setup-wizard-modal{display:flex;flex-direction:column;max-width:100%;width:100%;max-height:calc(100vh - max(var(--space-2xl),env(safe-area-inset-top,0px)) - max(var(--space-2xl),env(safe-area-inset-bottom,0px)));max-height:calc(100dvh - max(var(--space-2xl),env(safe-area-inset-top,0px)) - max(var(--space-2xl),env(safe-area-inset-bottom,0px)));border-radius:var(--radius-lg)}.setup-wizard-header{padding:var(--space-md) var(--space-md) 0}.setup-wizard-brand-name{font-size:20px}.setup-wizard-title{font-size:21px}.setup-wizard-content{padding:var(--space-md)}.setup-wizard-mode-switch{grid-template-columns:1fr}.setup-wizard-isolation-options{gap:var(--space-xs)}.setup-wizard-isolation-option{padding:var(--space-sm) var(--space-md)}.setup-wizard-advanced-panel{padding:var(--space-sm)}.setup-wizard-auth-token-actions .btn{width:100%;justify-content:center}.setup-wizard-footer{flex-direction:column;align-items:stretch;padding:var(--space-sm) var(--space-md) max(var(--space-md),env(safe-area-inset-bottom,0px))}.setup-wizard-footer .btn-primary{width:100%;justify-content:center}.setup-wizard-help-link{margin-right:0;width:100%;justify-content:center}.setup-wizard-complete{padding:var(--space-lg) 0}}
1
+ .wizard-option-recommended{display:inline-flex;align-items:center;width:fit-content;padding:calc(var(--space-xs) / 2) var(--space-sm);background:color-mix(in srgb,var(--color-success) 10%,transparent);color:var(--color-success)!important;border-radius:var(--radius-sm);font-size:calc(var(--space-md) - (var(--space-xs) / 4))!important;font-weight:600;text-transform:uppercase;letter-spacing:.5px}.wizard-error{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-md);background:color-mix(in srgb,var(--color-error) 10%,transparent);border:1px solid color-mix(in srgb,var(--color-error) 35%,transparent);border-radius:var(--radius-md);color:var(--color-error);font-size:calc(var(--space-md) + (var(--space-xs) / 4))}.setup-wizard-overlay{overflow-y:auto;overscroll-behavior:contain}.setup-wizard-modal{display:flex;flex-direction:column;max-width:880px;width:90vw;max-height:min(720px,calc(100vh - var(--overlay-padding-top, 10vh) - var(--space-lg)));max-height:min(720px,calc(100dvh - var(--overlay-padding-top, 10vh) - var(--space-lg)));animation:slideUp var(--transition-normal) ease-out;overflow:hidden;flex-shrink:0}@keyframes slideUp{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}.setup-wizard-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-xl) var(--space-xl) 0;gap:var(--space-md);flex-shrink:0}.setup-wizard-heading{display:flex;flex-direction:column;gap:var(--space-xs);flex:1 1 auto;min-width:0}.setup-wizard-brand{display:inline-flex;align-items:center;gap:var(--space-sm);color:var(--logo-accent)}.setup-wizard-brand-logo{width:28px;height:28px;flex-shrink:0}.setup-wizard-brand-name{font-size:22px;font-weight:800;letter-spacing:-.02em;line-height:1}.setup-wizard-title{font-size:24px;font-weight:800;color:var(--text);margin:0;line-height:1.1}.setup-wizard-content{padding:var(--space-md) var(--space-xl);flex:1 1 auto;min-height:0;overflow-y:auto}.setup-wizard-manual{display:flex;flex-direction:column}.setup-wizard-manual .welcome-icon{display:flex;align-items:center;justify-content:center;width:64px;height:64px;background:color-mix(in srgb,var(--todo) 10%,transparent);border-radius:var(--radius-lg);color:var(--todo);margin-bottom:var(--space-lg)}.setup-wizard-manual .welcome-text{font-size:14px;color:var(--text-muted);line-height:1.6;margin:0 0 var(--space-xl)}.setup-wizard-mode-switch{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm);margin:0 0 var(--space-lg);padding:0;border:0}.setup-wizard-mode-switch legend{font-size:13px;font-weight:600;color:var(--text);margin-bottom:var(--space-xs)}.setup-wizard-mode-option{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);color:var(--text);cursor:pointer;transition:border-color var(--transition-fast),background-color var(--transition-fast),box-shadow var(--transition-fast)}.setup-wizard-mode-option input{accent-color:var(--todo)}.setup-wizard-mode-option:hover{border-color:var(--text-dim)}.setup-wizard-mode-option.selected{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 10%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--todo) 25%,transparent)}.setup-wizard-manual .form-group{margin-bottom:var(--space-lg)}.setup-wizard-manual .form-group label{display:block;font-size:13px;font-weight:600;color:var(--text);margin-bottom:var(--space-xs)}.setup-wizard-manual .form-group input,.setup-wizard-manual .form-group select{width:100%;padding:10px 12px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:14px;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.setup-wizard-manual .form-group input:focus,.setup-wizard-manual .form-group select:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.setup-wizard-manual .form-hint{margin:4px 0 0;font-size:12px;color:var(--text-dim)}.setup-wizard-isolation-options{display:flex;flex-direction:column;gap:var(--space-sm)}.setup-wizard-advanced{margin-top:var(--space-sm);border-top:1px solid var(--border);padding-top:var(--space-lg)}.setup-wizard-advanced-toggle{width:100%;display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) 0;background:transparent;border:none;color:var(--text);font-size:14px;font-weight:600;text-align:left;cursor:pointer}.setup-wizard-advanced-toggle:hover{color:var(--logo-accent)}.setup-wizard-advanced-toggle:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.setup-wizard-advanced-toggle[aria-expanded=true] .setup-wizard-advanced-chevron{transform:rotate(90deg)}.setup-wizard-advanced-chevron{flex-shrink:0;transition:transform var(--transition-fast)}.setup-wizard-advanced-panel{display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-sm);padding:var(--space-md);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg)}.setup-wizard-advanced-panel .form-group:last-child{margin-bottom:0}.setup-wizard-auth-token{display:flex;flex-direction:column;gap:var(--space-sm)}.setup-wizard-auth-token-actions{display:flex;flex-wrap:wrap;gap:var(--space-sm)}.setup-wizard-auth-token-actions .btn{min-height:36px}.setup-wizard-auth-step{display:flex;flex-direction:column;gap:var(--space-lg)}.setup-wizard-auth-step-description{font-size:14px;color:var(--text-muted);line-height:1.6;margin:0}.setup-wizard-auth-step code{font-family:var(--font-mono);font-size:12px;padding:2px 6px;background:var(--card);border:1px solid var(--border);border-radius:var(--radius-sm)}.setup-wizard-isolation-option{display:flex;align-items:flex-start;gap:var(--space-md);padding:var(--space-md) var(--space-lg);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);cursor:pointer;transition:background-color var(--transition-fast),border-color var(--transition-fast)}.setup-wizard-isolation-option:hover{background:var(--card-hover);border-color:var(--text-dim)}.setup-wizard-isolation-option.selected{background:color-mix(in srgb,var(--todo) 5%,transparent);border-color:var(--todo);box-shadow:0 0 0 1px var(--todo)}.setup-wizard-isolation-option input[type=radio]{margin-top:2px;accent-color:var(--todo)}.setup-wizard-isolation-option-content{display:flex;flex-direction:column;gap:2px}.setup-wizard-isolation-option-content strong{font-size:14px;font-weight:600;color:var(--text)}.setup-wizard-isolation-option-content span{font-size:12px;color:var(--text-muted)}.setup-wizard-isolation-option .wizard-option-recommended{margin-top:2px}.setup-wizard-complete{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--space-sm);padding:var(--space-lg) 0}.setup-wizard-complete .success-icon{color:var(--color-success)}.setup-wizard-complete h3{font-size:20px;font-weight:700;color:var(--text);margin:0}.setup-wizard-complete p{font-size:14px;color:var(--text-muted);margin:0;line-height:1.5}.setup-wizard-footer{display:flex;align-items:center;gap:var(--space-sm);justify-content:flex-end;padding:var(--space-md) var(--space-xl) var(--space-lg);flex-shrink:0;border-top:1px solid var(--border);background:var(--surface)}.setup-wizard-footer .btn-primary{display:inline-flex;align-items:center;gap:var(--space-sm);padding:10px 24px;font-size:14px;font-weight:600}.setup-wizard-help-link{margin-right:auto;text-decoration:none}.setup-wizard-footer .btn-primary:disabled{opacity:.5;cursor:not-allowed}@media(max-width:768px){.setup-wizard-overlay{padding:max(var(--space-md),env(safe-area-inset-top,0px)) max(var(--space-md),env(safe-area-inset-right,0px)) max(var(--space-md),env(safe-area-inset-bottom,0px)) max(var(--space-md),env(safe-area-inset-left,0px))}.setup-wizard-modal{display:flex;flex-direction:column;max-width:100%;width:100%;max-height:calc(100vh - max(var(--space-2xl),env(safe-area-inset-top,0px)) - max(var(--space-2xl),env(safe-area-inset-bottom,0px)));max-height:calc(100dvh - max(var(--space-2xl),env(safe-area-inset-top,0px)) - max(var(--space-2xl),env(safe-area-inset-bottom,0px)));border-radius:var(--radius-lg)}.setup-wizard-header{padding:var(--space-md) var(--space-md) 0}.setup-wizard-brand-name{font-size:20px}.setup-wizard-title{font-size:21px}.setup-wizard-content{padding:var(--space-md)}.setup-wizard-mode-switch{grid-template-columns:1fr}.setup-wizard-isolation-options{gap:var(--space-xs)}.setup-wizard-isolation-option{padding:var(--space-sm) var(--space-md)}.setup-wizard-advanced-panel{padding:var(--space-sm)}.setup-wizard-auth-token-actions .btn{width:100%;justify-content:center}.setup-wizard-footer{flex-direction:column;align-items:stretch;padding:var(--space-sm) var(--space-md) max(var(--space-md),env(safe-area-inset-bottom,0px))}.setup-wizard-footer .btn-primary{width:100%;justify-content:center}.setup-wizard-help-link{margin-right:0;width:100%;justify-content:center}.setup-wizard-complete{padding:var(--space-lg) 0}}
@@ -0,0 +1 @@
1
+ import{r as l,j as e}from"./vendor-react-K0fH_qHe.js";import{bJ as f,ah as L,bK as _,bL as O,bM as $,X as W,e as Y,p as C,V as G}from"./index-CrHLf3pB.js";import{D as K}from"./DirectoryPicker-SchiK-Aq.js";import"./vendor-xterm-DzcZoU0P.js";function y(u){const d=u.split(/[/\\]/).filter(p=>p.length>0);return(d[d.length-1]||"My Project").replace(/[^a-zA-Z0-9-_]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")||"My Project"}function X({onProjectRegistered:u,onClose:d}){const x="https://github.com/runfusion/fusion/discussions",[p,z]=l.useState(!0),[s,n]=l.useState(()=>({step:f()?"manual":"auth",manualMode:"existing",manualPath:"",manualCloneUrl:"",manualName:"",manualIsolationMode:"in-process",manualNodeId:"",isRegistering:!1,error:null})),[g,M]=l.useState(!1),[r,h]=l.useState(""),[m,N]=l.useState(()=>f()),{nodes:b,loading:I}=L(),S=b.find(a=>a.type==="local")?.id,v=l.useCallback(()=>{z(!1),d?.()},[d]),P=l.useCallback(a=>{n(t=>{const c={manualPath:a};return a&&(!t.manualName||t.manualName===y(t.manualPath))&&(c.manualName=y(a)),{...t,...c}})},[]),A=l.useCallback(async()=>{const a=s.manualPath.trim(),t=s.manualName.trim(),c=s.manualCloneUrl.trim();if(!(!a||!t)&&!(s.manualMode==="clone"&&!c)){n(i=>({...i,isRegistering:!0,error:null}));try{const i={name:t,path:a,isolationMode:s.manualIsolationMode,nodeId:s.manualNodeId||void 0,cloneUrl:s.manualMode==="clone"?c:void 0},j=await _(i);u(j),n(B=>({...B,step:"complete",isRegistering:!1}))}catch(i){n(j=>({...j,isRegistering:!1,error:i instanceof Error?i.message:"Failed to register project"}))}}},[s.manualPath,s.manualName,s.manualCloneUrl,s.manualMode,s.manualIsolationMode,s.manualNodeId,u]),w=l.useCallback(()=>{const a=r.trim();a&&(O(a),N(a),h(""),n(t=>t.step==="auth"?{...t,step:"manual"}:t))},[r]),R=l.useCallback(()=>{$(),N(void 0),h("")},[]),F=l.useCallback(()=>{n(a=>({...a,step:"manual"}))},[]);if(!p)return null;const k=s.manualMode==="existing",o=s.manualMode==="clone",T=s.manualPath.trim().length>0,U=s.manualName.trim().length>0,D=s.manualCloneUrl.trim().length>0,E=s.isRegistering||!T||!U||o&&!D;return e.jsx("div",{className:"modal-overlay open setup-wizard-overlay",role:"dialog","aria-modal":"true","aria-labelledby":"wizard-title",children:e.jsxs("div",{className:"modal setup-wizard-modal",children:[e.jsxs("div",{className:"setup-wizard-header",children:[e.jsxs("div",{className:"setup-wizard-heading",children:[e.jsxs("div",{className:"setup-wizard-brand","aria-label":"Fusion",children:[e.jsxs("svg",{className:"setup-wizard-brand-logo",width:28,height:28,viewBox:"0 0 128 128",fill:"none","aria-label":"Fusion logo",role:"img",children:[e.jsx("circle",{cx:"64",cy:"64",r:"52",stroke:"currentColor",strokeWidth:"8"}),e.jsx("path",{d:"M26 101C44 82 62 64 82 45C90 37 98 30 104 24C96 35 89 47 81 60C70 79 57 95 43 108C38 112 32 108 26 101Z",fill:"currentColor"})]}),e.jsx("span",{className:"setup-wizard-brand-name",children:"Fusion"})]}),e.jsxs("h2",{id:"wizard-title",className:"setup-wizard-title",children:[s.step==="auth"&&"Set Auth Token",s.step==="manual"&&"Welcome to Fusion",s.step==="complete"&&"Setup Complete!"]})]}),s.step!=="complete"&&e.jsx("button",{className:"modal-close",onClick:v,"aria-label":"Close wizard",children:e.jsx(W,{size:20})})]}),e.jsxs("div",{className:"setup-wizard-content",children:[s.step==="auth"&&e.jsxs("div",{className:"setup-wizard-auth-step",children:[e.jsx("p",{className:"setup-wizard-auth-step-description",children:"This dashboard requires an auth token to communicate with the Fusion daemon. Paste the token below to continue."}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"setup-auth-token",children:"Auth Token"}),e.jsx("input",{id:"setup-auth-token",type:"password",value:r,onChange:a=>h(a.target.value),placeholder:"Paste the daemon auth token",autoComplete:"off",spellCheck:!1,autoFocus:!0}),e.jsxs("p",{className:"form-hint",children:["The token was set via the ",e.jsx("code",{children:"FUSION_DAEMON_TOKEN"})," environment variable when starting the dashboard."]})]}),s.error&&e.jsx("div",{className:"wizard-error",role:"alert",children:s.error})]}),s.step==="manual"&&e.jsxs("div",{className:"setup-wizard-manual",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"project-name",children:"Project Name"}),e.jsx("input",{id:"project-name",type:"text",value:s.manualName,onChange:a=>n(t=>({...t,manualName:a.target.value})),placeholder:"my-project"}),e.jsx("p",{className:"form-hint",children:o?"By default this follows the destination folder name unless you edit it.":"By default this follows the selected directory name unless you edit it."})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"project-path",children:o?"Destination Directory":"Project Directory"}),e.jsx(K,{value:s.manualPath,onChange:P,nodeId:s.manualNodeId||void 0,localNodeId:S,placeholder:o?"/path/for/new-clone":"/path/to/your/project"}),e.jsx("p",{className:"form-hint",children:o?"Select or type an absolute destination path. Fusion will clone into this directory.":"Select or type the absolute path to your project"})]}),e.jsxs("div",{className:"setup-wizard-advanced",children:[e.jsxs("button",{type:"button",className:"setup-wizard-advanced-toggle","aria-expanded":g,onClick:()=>M(a=>!a),children:[e.jsx(Y,{size:16,className:"setup-wizard-advanced-chevron"}),e.jsx("span",{children:"Advanced settings"})]}),g&&e.jsxs("div",{className:"setup-wizard-advanced-panel",children:[e.jsxs("fieldset",{className:"setup-wizard-mode-switch","aria-label":"Project setup mode",children:[e.jsx("legend",{children:"Setup Mode"}),e.jsxs("label",{className:`setup-wizard-mode-option${k?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"setup-mode",value:"existing",checked:k,onChange:()=>n(a=>({...a,manualMode:"existing",error:null}))}),e.jsx("span",{children:"Use Existing Directory"})]}),e.jsxs("label",{className:`setup-wizard-mode-option${o?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"setup-mode",value:"clone",checked:o,onChange:()=>n(a=>({...a,manualMode:"clone",error:null}))}),e.jsx("span",{children:"Clone Git Repository"})]})]}),o&&e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"project-clone-url",children:"Repository URL"}),e.jsx("input",{id:"project-clone-url",type:"text",value:s.manualCloneUrl,onChange:a=>n(t=>({...t,manualCloneUrl:a.target.value})),placeholder:"https://github.com/owner/repo.git"}),e.jsx("p",{className:"form-hint",children:"Fusion will run git clone into the destination directory, then register that cloned folder."})]}),e.jsx("div",{className:"form-group",children:e.jsxs("div",{className:"project-node-selector",children:[e.jsx("span",{className:"project-node-selector__label",children:"Runtime Node"}),e.jsxs("select",{value:s.manualNodeId,onChange:a=>n(t=>({...t,manualNodeId:a.target.value})),disabled:I||s.isRegistering,children:[e.jsx("option",{value:"",children:"Local node"}),b.map(a=>e.jsxs("option",{value:a.id,children:[a.name," (",a.type,")"]},a.id))]})]})}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:"Isolation Mode"}),e.jsxs("div",{className:"setup-wizard-isolation-options",children:[e.jsxs("label",{className:`setup-wizard-isolation-option${s.manualIsolationMode==="in-process"?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"isolation-mode",value:"in-process",checked:s.manualIsolationMode==="in-process",onChange:()=>n(a=>({...a,manualIsolationMode:"in-process"}))}),e.jsxs("div",{className:"setup-wizard-isolation-option-content",children:[e.jsx("strong",{children:"In-Process"}),e.jsx("span",{children:"Lower overhead, shared memory. Best for most projects."}),e.jsx("span",{className:"wizard-option-recommended",children:"Recommended"})]})]}),e.jsxs("label",{className:`setup-wizard-isolation-option${s.manualIsolationMode==="child-process"?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"isolation-mode",value:"child-process",checked:s.manualIsolationMode==="child-process",onChange:()=>n(a=>({...a,manualIsolationMode:"child-process"}))}),e.jsxs("div",{className:"setup-wizard-isolation-option-content",children:[e.jsx("strong",{children:"Child-Process"}),e.jsx("span",{children:"Isolated execution with crash containment."})]})]})]})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"advanced-auth-token",children:"Browser Auth Token"}),e.jsxs("div",{className:"setup-wizard-auth-token",children:[e.jsx("input",{id:"advanced-auth-token",type:"password",value:r,onChange:a=>h(a.target.value),placeholder:m?"Enter a new token to replace the stored one":"Paste the auth token for this browser",autoComplete:"off",spellCheck:!1}),e.jsxs("div",{className:"setup-wizard-auth-token-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:w,disabled:r.trim().length===0,children:m?"Update token":"Set token"}),m&&e.jsx("button",{type:"button",className:"btn",onClick:R,children:"Reset token"})]})]}),e.jsx("p",{className:"form-hint",children:m?"A token is already stored in this browser. You can update or reset it below.":"No token is stored. Use the auth prompt at the top of the wizard, or set one here."})]})]})]}),s.error&&e.jsx("div",{className:"wizard-error",role:"alert",children:s.error})]}),s.step==="complete"&&e.jsxs("div",{className:"setup-wizard-complete",children:[e.jsxs("div",{className:"setup-wizard-success-streak","aria-hidden":"true",children:[e.jsx("div",{className:"setup-wizard-success-streak-core"}),e.jsx("div",{className:"setup-wizard-success-streak-glow"})]}),e.jsx(C,{size:64,className:"success-icon"}),e.jsx("h3",{children:"All Set!"}),e.jsx("p",{children:"Your project has been registered successfully."}),e.jsx("p",{children:"You can add more projects anytime from the project overview."})]})]}),e.jsxs("div",{className:"setup-wizard-footer",children:[e.jsx("a",{className:"btn setup-wizard-help-link",href:x,target:"_blank",rel:"noreferrer",children:"Need help?"}),s.step==="auth"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn",onClick:F,children:"Skip"}),e.jsx("button",{className:"btn btn-primary",onClick:w,disabled:r.trim().length===0,children:e.jsx("span",{children:"Set Token & Continue"})})]}),s.step==="manual"&&e.jsx("button",{className:"btn btn-primary",onClick:A,disabled:E,children:s.isRegistering?e.jsxs(e.Fragment,{children:[e.jsx(G,{size:16,className:"animate-spin"}),e.jsx("span",{children:"Registering..."})]}):e.jsx("span",{children:"Register Project"})}),s.step==="complete"&&e.jsxs("button",{className:"btn btn-primary",onClick:v,children:[e.jsx(C,{size:16}),e.jsx("span",{children:"Get Started"})]})]})]})})}export{X as SetupWizardModal};
@@ -1 +1 @@
1
- import{r as i,j as e}from"./vendor-react-K0fH_qHe.js";import{av as X,b1 as _,b2 as q,b3 as B,aD as G,X as P,R as H,C as J,e as Y,O as Z,o as I}from"./index-DNzA4aZ7.js";import"./vendor-xterm-DzcZoU0P.js";function ie({projectId:c,addToast:o,onClose:Q}){const[d,v]=i.useState([]),[f,y]=i.useState(!0),[A,E]=i.useState(!1),[L,p]=i.useState(null),[D,K]=i.useState([]),[h,V]=i.useState(""),[m,g]=i.useState(null),[k,x]=i.useState(null),[W,R]=i.useState(!1),[z,j]=i.useState(null),r=i.useRef(null),[N,M]=i.useState(""),F=h.trim()?d.filter(s=>s.name.toLowerCase().includes(h.toLowerCase())||s.relativePath.toLowerCase().includes(h.toLowerCase())):d,C=i.useCallback(async()=>{y(!0);try{const s=await X(c);v(s)}catch(s){const a=s instanceof Error?s.message:"Failed to load discovered skills";o(a,"error")}finally{y(!1)}},[c,o]),u=i.useCallback(async s=>{const a=l=>{if(!l||typeof l!="object")return!1;const t=l;if(typeof t.status=="number"&&t.status>=500)return!0;if(t.details&&typeof t.details=="object"){const w=t.details;if(typeof w.code=="string"&&w.code.startsWith("upstream_"))return!0}const n=l;return typeof n.error=="string"&&typeof n.code=="string"};E(!0),p(null);try{const l=await _(s,20,c);K(l.entries)}catch(l){if(a(l))p("Catalog is temporarily unavailable. Please try again later.");else{const t=l instanceof Error?l.message:"Failed to load catalog";p(t)}}finally{E(!1)}},[c]);i.useEffect(()=>{C(),u("")},[C,u]);const O=i.useCallback(s=>{V(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(()=>{u(N)},[N,u]);const T=i.useCallback(async(s,a)=>{const l=!a;v(t=>t.map(n=>n.id===s?{...n,toggling:!0}:n));try{await q(s,l,c),v(t=>t.map(n=>n.id===s?{...n,enabled:l,toggling:!1}:n)),o(`Skill ${l?"enabled":"disabled"}`,"success")}catch(t){v(w=>w.map(S=>S.id===s?{...S,toggling:!1}:S));const n=t instanceof Error?t.message:"Failed to toggle skill";o(`Failed to toggle skill: ${n}`,"error")}},[c,o]),b=i.useCallback(async s=>{R(!0),j(null),x(null);try{const a=await B(s,c);x(a)}catch(a){const l=a instanceof Error?a.message:"Failed to load skill content";j(l)}finally{R(!1)}},[c]),$=i.useCallback((s,a)=>{if(!(a&&a.target.closest(".skills-view-item-toggle"))){if(m===s){g(null),x(null),j(null);return}g(s),b(s)}},[m,b]),U=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(G,{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:Q,"aria-label":"Close skills view",children:e.jsx(P,{size:16})}),e.jsxs("button",{className:"btn btn-sm touch-target",onClick:()=>void C(),disabled:f,children:[e.jsx(H,{size:14,className:f?"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=>O(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"}),f?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."})}):F.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:F.map(s=>{const a=m===s.id;return e.jsxs("div",{children:[e.jsxs("div",{className:`skills-view-item${a?" skills-view-item--selected":""}`,onClick:l=>$(s.id,l),role:"button",tabIndex:0,onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),$(s.id))},"aria-expanded":a,"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:[a?e.jsx(J,{size:14}):e.jsx(Y,{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:l=>l.stopPropagation(),children:[e.jsx("input",{type:"checkbox",checked:s.enabled,disabled:s.toggling,onChange:()=>void T(s.id,s.enabled),"aria-label":`${s.enabled?"Disable":"Enable"} ${s.name}`}),e.jsx("span",{className:"skills-view-toggle-slider"})]})]}),a&&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(P,{size:14}),"Close"]})]}),W?e.jsxs("div",{className:"skills-view-detail-loading",children:[e.jsx(Z,{size:16,className:"spin"}),"Loading skill content..."]}):z?e.jsxs("div",{className:"skills-view-detail-error",children:[e.jsx(I,{size:14}),e.jsx("span",{children:z}),e.jsx("button",{className:"btn btn-sm",onClick:()=>U(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(l=>e.jsxs("span",{className:"badge badge--sm",children:[l.name,l.type==="directory"&&"/"]},l.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"}),L?e.jsxs("div",{className:"skills-view-error",children:[e.jsx("p",{children:L}),e.jsx("button",{className:"btn btn-sm",onClick:()=>void u(N),children:"Try Again"})]}):A?e.jsxs("div",{className:"skills-view-loading",children:[e.jsx("span",{className:"spinner"}),"Loading catalog..."]}):D.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:D.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(a=>e.jsx("span",{className:"badge badge--sm",children:a},a))}),s.installs!==void 0&&e.jsxs("span",{className:"skills-view-card-installs",children:[s.installs.toLocaleString()," installs"]})]},s.id))})]})]})]})}export{ie as SkillsView};
1
+ import{r as i,j as e}from"./vendor-react-K0fH_qHe.js";import{az as U,b5 as X,b6 as _,b7 as B,aH as G,X as P,R as J,C as O,e as Y,V as Z,q as I}from"./index-CrHLf3pB.js";import"./vendor-xterm-DzcZoU0P.js";function ie({projectId:c,addToast:o,onClose:Q}){const[d,v]=i.useState([]),[f,y]=i.useState(!0),[V,E]=i.useState(!1),[L,p]=i.useState(null),[D,A]=i.useState([]),[h,K]=i.useState(""),[m,g]=i.useState(null),[k,x]=i.useState(null),[W,z]=i.useState(!1),[R,j]=i.useState(null),r=i.useRef(null),[N,q]=i.useState(""),F=h.trim()?d.filter(s=>s.name.toLowerCase().includes(h.toLowerCase())||s.relativePath.toLowerCase().includes(h.toLowerCase())):d,C=i.useCallback(async()=>{y(!0);try{const s=await U(c);v(s)}catch(s){const a=s instanceof Error?s.message:"Failed to load discovered skills";o(a,"error")}finally{y(!1)}},[c,o]),u=i.useCallback(async s=>{const a=l=>{if(!l||typeof l!="object")return!1;const t=l;if(typeof t.status=="number"&&t.status>=500)return!0;if(t.details&&typeof t.details=="object"){const w=t.details;if(typeof w.code=="string"&&w.code.startsWith("upstream_"))return!0}const n=l;return typeof n.error=="string"&&typeof n.code=="string"};E(!0),p(null);try{const l=await X(s,20,c);A(l.entries)}catch(l){if(a(l))p("Catalog is temporarily unavailable. Please try again later.");else{const t=l instanceof Error?l.message:"Failed to load catalog";p(t)}}finally{E(!1)}},[c]);i.useEffect(()=>{C(),u("")},[C,u]);const H=i.useCallback(s=>{K(s),r.current&&clearTimeout(r.current),r.current=setTimeout(()=>{q(s),r.current=null},300)},[]);i.useEffect(()=>()=>{r.current&&(clearTimeout(r.current),r.current=null)},[]),i.useEffect(()=>{u(N)},[N,u]);const M=i.useCallback(async(s,a)=>{const l=!a;v(t=>t.map(n=>n.id===s?{...n,toggling:!0}:n));try{await _(s,l,c),v(t=>t.map(n=>n.id===s?{...n,enabled:l,toggling:!1}:n)),o(`Skill ${l?"enabled":"disabled"}`,"success")}catch(t){v(w=>w.map(S=>S.id===s?{...S,toggling:!1}:S));const n=t instanceof Error?t.message:"Failed to toggle skill";o(`Failed to toggle skill: ${n}`,"error")}},[c,o]),b=i.useCallback(async s=>{z(!0),j(null),x(null);try{const a=await B(s,c);x(a)}catch(a){const l=a instanceof Error?a.message:"Failed to load skill content";j(l)}finally{z(!1)}},[c]),$=i.useCallback((s,a)=>{if(!(a&&a.target.closest(".skills-view-item-toggle"))){if(m===s){g(null),x(null),j(null);return}g(s),b(s)}},[m,b]),T=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(G,{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:Q,"aria-label":"Close skills view",children:e.jsx(P,{size:16})}),e.jsxs("button",{className:"btn btn-sm touch-target",onClick:()=>void C(),disabled:f,children:[e.jsx(J,{size:14,className:f?"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=>H(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"}),f?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."})}):F.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:F.map(s=>{const a=m===s.id;return e.jsxs("div",{children:[e.jsxs("div",{className:`skills-view-item${a?" skills-view-item--selected":""}`,onClick:l=>$(s.id,l),role:"button",tabIndex:0,onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),$(s.id))},"aria-expanded":a,"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:[a?e.jsx(O,{size:14}):e.jsx(Y,{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:l=>l.stopPropagation(),children:[e.jsx("input",{type:"checkbox",checked:s.enabled,disabled:s.toggling,onChange:()=>void M(s.id,s.enabled),"aria-label":`${s.enabled?"Disable":"Enable"} ${s.name}`}),e.jsx("span",{className:"skills-view-toggle-slider"})]})]}),a&&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(P,{size:14}),"Close"]})]}),W?e.jsxs("div",{className:"skills-view-detail-loading",children:[e.jsx(Z,{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:()=>T(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(l=>e.jsxs("span",{className:"badge badge--sm",children:[l.name,l.type==="directory"&&"/"]},l.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"}),L?e.jsxs("div",{className:"skills-view-error",children:[e.jsx("p",{children:L}),e.jsx("button",{className:"btn btn-sm",onClick:()=>void u(N),children:"Try Again"})]}):V?e.jsxs("div",{className:"skills-view-loading",children:[e.jsx("span",{className:"spinner"}),"Loading catalog..."]}):D.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:D.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(a=>e.jsx("span",{className:"badge badge--sm",children:a},a))}),s.installs!==void 0&&e.jsxs("span",{className:"skills-view-card-installs",children:[s.installs.toLocaleString()," installs"]})]},s.id))})]})]})]})}export{ie as SkillsView};