@runfusion/fusion 0.47.0 → 0.48.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 (109) hide show
  1. package/dist/bin.js +153 -85
  2. package/dist/client/.vite/manifest.json +242 -242
  3. package/dist/client/assets/{AgentDetailView-D9lYcdOS.js → AgentDetailView-CF6isJ51.js} +1 -1
  4. package/dist/client/assets/{AgentPermissionPolicyEditor-Bn_PEeQW.js → AgentPermissionPolicyEditor-DFldf6aS.js} +1 -1
  5. package/dist/client/assets/{AgentsView-BRbnFmv3.js → AgentsView-DiGseTuo.js} +3 -3
  6. package/dist/client/assets/{ChatView-Batci7-w.js → ChatView-BjQBbDyo.js} +1 -1
  7. package/dist/client/assets/{CommandCenter-DAUgvVMX.js → CommandCenter-DwpiADSX.js} +1 -1
  8. package/dist/client/assets/{DevServerView-HdEXR5UB.js → DevServerView-D6RFaGPU.js} +1 -1
  9. package/dist/client/assets/{DirectoryPicker-DrCiUJlF.js → DirectoryPicker-DNBB-viz.js} +1 -1
  10. package/dist/client/assets/{DocumentsView-C0KxPWex.js → DocumentsView-DXG-sctG.js} +1 -1
  11. package/dist/client/assets/{EvalsView-wCfi9Rkj.js → EvalsView-Ol6ECKz5.js} +1 -1
  12. package/dist/client/assets/{ExperimentalAgentOnboardingModal-Crck6eJe.js → ExperimentalAgentOnboardingModal-BQc3GaE_.js} +1 -1
  13. package/dist/client/assets/{GoalsView-sFGHX3Wt.js → GoalsView-C_m90anC.js} +1 -1
  14. package/dist/client/assets/{InsightsView-jl0cX1um.js → InsightsView-BbFgPsDH.js} +1 -1
  15. package/dist/client/assets/{MemoryView-Bwv99M_s.js → MemoryView-CRS7AjWK.js} +1 -1
  16. package/dist/client/assets/{PiExtensionsManager-BsA3tCZh.js → PiExtensionsManager-BEj5xu45.js} +1 -1
  17. package/dist/client/assets/{PluginManager-Bgd8Hj0a.js → PluginManager-CzCM3XUY.js} +1 -1
  18. package/dist/client/assets/{PullRequestView-CqO16SNt.js → PullRequestView-9yNYCunb.js} +1 -1
  19. package/dist/client/assets/{ResearchView-CfRsbJWS.js → ResearchView-BKdirpiw.js} +1 -1
  20. package/dist/client/assets/{SecretsView-CHomYGnm.js → SecretsView-qGjo-0Cp.js} +1 -1
  21. package/dist/client/assets/{SessionTerminal-DcYUuwbV.js → SessionTerminal-C7YlkdGJ.js} +1 -1
  22. package/dist/client/assets/{SettingsModal-CX5GLed_.js → SettingsModal-DihNd7g8.js} +1 -1
  23. package/dist/client/assets/{SettingsModal-ybSf6HDn.js → SettingsModal-DpaptT6t.js} +3 -3
  24. package/dist/client/assets/{SetupWizardModal-D2BQL0df.js → SetupWizardModal-MovTj5pY.js} +2 -2
  25. package/dist/client/assets/{ShadcnColorPicker-B-8x0Gci.js → ShadcnColorPicker-Bnf5n5R4.js} +1 -1
  26. package/dist/client/assets/{SkillsView-4iqYHf9N.js → SkillsView-Br2LkA3x.js} +1 -1
  27. package/dist/client/assets/{TodoView-BJsknVS6.js → TodoView-BEdk6FTU.js} +1 -1
  28. package/dist/client/assets/{WorkflowNodeEditor-QdwW4bY5.js → WorkflowNodeEditor-e-eR6yzw.js} +1 -1
  29. package/dist/client/assets/{agentSkills-CwR8s-gl.js → agentSkills-D5nDZPRY.js} +1 -1
  30. package/dist/client/assets/{app-BJGkp7Tt.js → app-BM6bAO0b.js} +1 -1
  31. package/dist/client/assets/{app-CZQ_fFNf.js → app-BglOELbc.js} +1 -1
  32. package/dist/client/assets/{app-BaoNC9zg.js → app-ChkCVQpq.js} +1 -1
  33. package/dist/client/assets/{app-DgezOJub.js → app-DMn7Jt9g.js} +1 -1
  34. package/dist/client/assets/{app-DAu3AzsS.js → app-D_IT9Buz.js} +1 -1
  35. package/dist/client/assets/{app-BKLUvvm8.js → app-S8fehQv8.js} +1 -1
  36. package/dist/client/assets/{architectureDiagram-3BPJPVTR-rav0thhm.js → architectureDiagram-3BPJPVTR-BbkXWBni.js} +1 -1
  37. package/dist/client/assets/{blockDiagram-GPEHLZMM-x9Opikul.js → blockDiagram-GPEHLZMM-DhaqpHqZ.js} +1 -1
  38. package/dist/client/assets/{c4Diagram-AAUBKEIU-BGrWtNPI.js → c4Diagram-AAUBKEIU-qC0WSHMZ.js} +1 -1
  39. package/dist/client/assets/channel-CCKvUami.js +1 -0
  40. package/dist/client/assets/{chunk-2J33WTMH-BMFvL-OW.js → chunk-2J33WTMH-Dah9zMeT.js} +1 -1
  41. package/dist/client/assets/{chunk-4BX2VUAB-CWTOrH7n.js → chunk-4BX2VUAB-epHwnUb_.js} +1 -1
  42. package/dist/client/assets/{chunk-55IACEB6-l48k3a4l.js → chunk-55IACEB6-DpYBy44g.js} +1 -1
  43. package/dist/client/assets/{chunk-727SXJPM-DeynG6ym.js → chunk-727SXJPM-B9b8698e.js} +1 -1
  44. package/dist/client/assets/{chunk-AQP2D5EJ-B9ndyq3h.js → chunk-AQP2D5EJ-DrM8nnhR.js} +1 -1
  45. package/dist/client/assets/{chunk-FMBD7UC4-DV2d1-q1.js → chunk-FMBD7UC4-jyT6Scwe.js} +1 -1
  46. package/dist/client/assets/{chunk-ND2GUHAM-D0Dl37Mc.js → chunk-ND2GUHAM-EoPfF-PK.js} +1 -1
  47. package/dist/client/assets/{chunk-QZHKN3VN-NGiOWxhM.js → chunk-QZHKN3VN-qMwLVfgJ.js} +1 -1
  48. package/dist/client/assets/classDiagram-4FO5ZUOK-C_HqY7AI.js +1 -0
  49. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-C_HqY7AI.js +1 -0
  50. package/dist/client/assets/{cose-bilkent-S5V4N54A-2ojNpRS8.js → cose-bilkent-S5V4N54A-DmPFKoVD.js} +1 -1
  51. package/dist/client/assets/{dagre-BM42HDAG-BaIP71Bo.js → dagre-BM42HDAG-DeHxd-ej.js} +1 -1
  52. package/dist/client/assets/{dashboard-view-hB7ta6sK.js → dashboard-view-Cw5mMJay.js} +1 -1
  53. package/dist/client/assets/{dashboard-view-CC2QtNhx.js → dashboard-view-DXjNQ5IF.js} +1 -1
  54. package/dist/client/assets/{diagram-2AECGRRQ-DQfEScya.js → diagram-2AECGRRQ-C04A2mhr.js} +1 -1
  55. package/dist/client/assets/{diagram-5GNKFQAL-B5iw3WNT.js → diagram-5GNKFQAL-DqtOwADI.js} +1 -1
  56. package/dist/client/assets/{diagram-KO2AKTUF-C5mMn4JH.js → diagram-KO2AKTUF-CH0har-Z.js} +1 -1
  57. package/dist/client/assets/{diagram-LMA3HP47-CaMhdmPl.js → diagram-LMA3HP47-CxN-U-0W.js} +1 -1
  58. package/dist/client/assets/{diagram-OG6HWLK6-D2ed8-Fx.js → diagram-OG6HWLK6-42A7wpwF.js} +1 -1
  59. package/dist/client/assets/{erDiagram-TEJ5UH35-CZl07SyK.js → erDiagram-TEJ5UH35-CnZI5YlN.js} +1 -1
  60. package/dist/client/assets/{flowDiagram-I6XJVG4X-Dz7RLhaG.js → flowDiagram-I6XJVG4X-BKfQhMVF.js} +1 -1
  61. package/dist/client/assets/{folder-open-DCNfEqr1.js → folder-open-STXgbemw.js} +1 -1
  62. package/dist/client/assets/{ganttDiagram-6RSMTGT7-C3ny-S6Q.js → ganttDiagram-6RSMTGT7-BfA0pME8.js} +1 -1
  63. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-BjHF5C7t.js → gitGraphDiagram-PVQCEYII-BgDFB7PS.js} +1 -1
  64. package/dist/client/assets/index-BnfnLXyO.css +1 -0
  65. package/dist/client/assets/index-CHy0WNjH.js +1301 -0
  66. package/dist/client/assets/{infoDiagram-5YYISTIA-BTYecWEx.js → infoDiagram-5YYISTIA-Bb5F155s.js} +1 -1
  67. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-BBNOAxJa.js → ishikawaDiagram-YF4QCWOH-8Oati7l_.js} +1 -1
  68. package/dist/client/assets/{journeyDiagram-JHISSGLW-DrjdbyT5.js → journeyDiagram-JHISSGLW-DhHTHXTM.js} +1 -1
  69. package/dist/client/assets/{kanban-definition-UN3LZRKU-CgTNTfT7.js → kanban-definition-UN3LZRKU-BWB9EtUX.js} +1 -1
  70. package/dist/client/assets/{mermaid.core-CyFmJxTj.js → mermaid.core-BD-L2gUQ.js} +4 -4
  71. package/dist/client/assets/{mindmap-definition-RKZ34NQL-C95r0KZv.js → mindmap-definition-RKZ34NQL-BSKGd7LE.js} +1 -1
  72. package/dist/client/assets/{pieDiagram-4H26LBE5-CmYuIsZ-.js → pieDiagram-4H26LBE5-BtBFPvSW.js} +1 -1
  73. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-BFLFwHMa.js → quadrantDiagram-W4KKPZXB-aWQWYPto.js} +1 -1
  74. package/dist/client/assets/{requirementDiagram-4Y6WPE33-G0s0AfQq.js → requirementDiagram-4Y6WPE33-CprlEpIa.js} +1 -1
  75. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-D8OLAFhm.js → sankeyDiagram-5OEKKPKP-Cw-AcRAV.js} +1 -1
  76. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-6fDSosvV.js → sequenceDiagram-3UESZ5HK-BMW5slyv.js} +1 -1
  77. package/dist/client/assets/{shield-alert-CBAzSycj.js → shield-alert-Bzf8yNOc.js} +1 -1
  78. package/dist/client/assets/{stateDiagram-AJRCARHV-BfNs5lJU.js → stateDiagram-AJRCARHV-CcxvIVwM.js} +1 -1
  79. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Bt0-CBqz.js → stateDiagram-v2-BHNVJYJU-awOfoFOB.js} +1 -1
  80. package/dist/client/assets/{timeline-definition-PNZ67QCA-DmKYLILn.js → timeline-definition-PNZ67QCA-DIEAc2YP.js} +1 -1
  81. package/dist/client/assets/{upload--9MWYfcA.js → upload-DuwyPTKe.js} +1 -1
  82. package/dist/client/assets/{users-vOsWas_i.js → users-D1Qhfyro.js} +1 -1
  83. package/dist/client/assets/{vennDiagram-CIIHVFJN-D3jx9PAk.js → vennDiagram-CIIHVFJN-DOkqg5Wi.js} +1 -1
  84. package/dist/client/assets/{wardley-L42UT6IY-BGRnyThw.js → wardley-L42UT6IY-DoPK1Q6d.js} +1 -1
  85. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-pwLVIgII.js → wardleyDiagram-YWT4CUSO-l1vun-m2.js} +1 -1
  86. package/dist/client/assets/{xychartDiagram-2RQKCTM6-ltxtDdDp.js → xychartDiagram-2RQKCTM6-DcUOUKvl.js} +1 -1
  87. package/dist/client/index.html +2 -2
  88. package/dist/client/version.json +1 -1
  89. package/dist/droid-cli/package.json +1 -1
  90. package/dist/extension.js +104 -77
  91. package/dist/pi-claude-cli/package.json +1 -1
  92. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  93. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  94. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  95. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  96. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  97. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  98. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  99. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  100. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  101. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  102. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  103. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  104. package/package.json +1 -1
  105. package/dist/client/assets/channel-BFVfY8Ks.js +0 -1
  106. package/dist/client/assets/classDiagram-4FO5ZUOK-pfX_P8V9.js +0 -1
  107. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-pfX_P8V9.js +0 -1
  108. package/dist/client/assets/index-CUY6xXXv.js +0 -1292
  109. package/dist/client/assets/index-CXlzJfKU.css +0 -1
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ExperimentalAgentOnboardingModal-Crck6eJe.js","assets/vendor-react-SZ_qB27O.js","assets/index-CUY6xXXv.js","assets/vendor-i18n-GF3RlKbq.js","assets/vendor-reactflow-Bg-Qjzh8.js","assets/vendor-reactflow-C5ap-Sga.css","assets/vendor-xterm-BNq00GSj.js","assets/vendor-xterm-LZoznX6r.css","assets/vendor-codemirror-jBKmHyH0.js","assets/index-CXlzJfKU.css","assets/ExperimentalAgentOnboardingModal-3ZEFv8sr.css"])))=>i.map(i=>d[i]);
2
- import{A as g,g as b,m as R,u as te,d as ae,r as re,a as ne,b as ie,e as le,X as oe,L as v,C as de,f as E,S as ce,h as S,E as ue,_ as pe}from"./index-CUY6xXXv.js";import{r as l,j as e}from"./vendor-react-SZ_qB27O.js";import{D as me}from"./DirectoryPicker-DrCiUJlF.js";import{s as y}from"./projectDetection-G3XuxD2X.js";import{u as ge}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-reactflow-Bg-Qjzh8.js";import"./vendor-xterm-BNq00GSj.js";import"./vendor-codemirror-jBKmHyH0.js";import"./folder-open-DCNfEqr1.js";function C(c){const u=c.replace(/[^a-zA-Z]/g,"").toUpperCase();return u.length>=2&&u.length<=4?u:u.length>4?u.slice(0,4):"FN"}const he=l.lazy(()=>pe(()=>import("./ExperimentalAgentOnboardingModal-Crck6eJe.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10])).then(c=>({default:c.ExperimentalAgentOnboardingModal})));function Ce({onProjectRegistered:c,onClose:u,agentOnboardingEnabled:P=!1,includeAgentStep:z=!0}){const{t:a}=ge("app"),F="https://discord.gg/ksrfuy7WYR",x=l.useMemo(()=>b("ceo")??g[0],[]),[T,U]=l.useState(!0),[s,i]=l.useState(()=>({step:"manual",manualMode:"existing",manualPath:"",manualCloneUrl:"",manualName:"",manualIsolationMode:"in-process",manualNodeId:"",manualTaskPrefix:"",detectedRepos:[],workspaceMode:!1,isDetectingWorkspace:!1,registeredProject:null,selectedPresetId:x.id,agentDraft:R(x),isCreatingAgent:!1,isRegistering:!1,error:null,agentError:null,agentOutcome:null})),[A,W]=l.useState(!1),[I,j]=l.useState(!1),D=l.useRef(null),{nodes:M,loading:L}=te(),O=M.find(t=>t.type==="local")?.id,f=l.useCallback(()=>{U(!1),u?.()},[u]),_=l.useCallback(()=>{if(s.registeredProject){c(s.registeredProject);return}f()},[f,c,s.registeredProject]);l.useEffect(()=>{s.agentError&&D.current?.focus()},[s.agentError]);const N=l.useRef(0),H=l.useCallback(t=>{if(i(r=>{const n={manualPath:t,detectedRepos:[],workspaceMode:!1};t&&(!r.manualName||r.manualName===y(r.manualPath))&&(n.manualName=y(t));const o=n.manualName??r.manualName;return o&&(!r.manualTaskPrefix||r.manualTaskPrefix===C(y(r.manualPath)))&&(n.manualTaskPrefix=C(o)),{...r,...n}}),s.manualMode==="existing"&&t.trim()&&t.trim()!=="/"){const r=++N.current;i(n=>({...n,isDetectingWorkspace:!0})),ae(t.trim()).then(n=>{r===N.current&&i(o=>({...o,isDetectingWorkspace:!1,detectedRepos:n.repos,workspaceMode:n.isWorkspace}))}).catch(()=>{r===N.current&&i(n=>({...n,isDetectingWorkspace:!1}))})}},[s.manualMode]),B=l.useCallback(async()=>{const t=s.manualPath.trim(),r=s.manualName.trim(),n=s.manualCloneUrl.trim();if(!(!t||!r)&&!(s.manualMode==="clone"&&!n)){i(o=>({...o,isRegistering:!0,error:null}));try{const o={name:r,path:t,isolationMode:s.manualIsolationMode,nodeId:s.manualNodeId||void 0,cloneUrl:s.manualMode==="clone"?n:void 0,workspaceMode:s.workspaceMode,taskPrefix:s.manualTaskPrefix.trim()||void 0},d=await re(o);if(!z){i(m=>({...m,isRegistering:!1})),c(d);return}i(m=>({...m,step:"agent",registeredProject:d,isRegistering:!1}))}catch(o){i(d=>({...d,isRegistering:!1,error:o instanceof Error?o.message:"Failed to register project"}))}}},[z,c,s.manualPath,s.manualName,s.manualCloneUrl,s.manualMode,s.manualIsolationMode,s.manualNodeId,s.workspaceMode,s.manualTaskPrefix]),w=l.useCallback(t=>{const r=b(t);r&&i(n=>({...n,selectedPresetId:r.id,agentDraft:R(r),agentError:null}))},[]),$=l.useCallback((t,r)=>{const n=g.findIndex(se=>se.id===r);if(n<0)return;const o=g.length-1;let d=null;if(t.key==="ArrowDown"||t.key==="ArrowRight"?d=n===o?0:n+1:t.key==="ArrowUp"||t.key==="ArrowLeft"?d=n===0?o:n-1:t.key==="Home"?d=0:t.key==="End"&&(d=o),d===null)return;t.preventDefault();const m=g[d];w(m.id),requestAnimationFrame(()=>{document.querySelector(`[data-agent-preset-id="${m.id}"]`)?.focus()})},[w]),Y=l.useCallback(t=>{i(r=>({...r,selectedPresetId:"",agentDraft:ne(t),agentError:null}))},[]),G=l.useCallback(async()=>{if(!(!s.registeredProject||!s.agentDraft.name.trim())){i(t=>({...t,isCreatingAgent:!0,agentError:null}));try{await ie(le(s.agentDraft),s.registeredProject.id),i(t=>({...t,step:"complete",isCreatingAgent:!1,agentOutcome:"created"}))}catch(t){i(r=>({...r,isCreatingAgent:!1,agentError:t instanceof Error?t.message:a("setup.firstAgentCreateError","Failed to create agent")}))}}},[s.agentDraft,s.registeredProject,a]),q=l.useCallback(()=>{i(t=>({...t,step:"complete",agentError:null,agentOutcome:"skipped"}))},[]);if(!T)return null;const k=s.manualMode==="existing",p=s.manualMode==="clone",K=s.manualPath.trim().length>0,Z=s.manualName.trim().length>0,V=s.manualCloneUrl.trim().length>0,X=s.isRegistering||!K||!Z||p&&!V,J=s.selectedPresetId?b(s.selectedPresetId):void 0,h=s.isCreatingAgent,Q=s.selectedPresetId||x.id,ee=`modal setup-wizard-modal${s.step==="agent"?" setup-wizard-modal--agent":""}`;return e.jsxs("div",{className:"modal-overlay open setup-wizard-overlay",role:"dialog","aria-modal":"true","aria-labelledby":"wizard-title",children:[e.jsxs("div",{className:ee,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":a("setup.brandName","Fusion"),children:[e.jsxs("svg",{className:"setup-wizard-brand-logo",width:28,height:28,viewBox:"0 0 128 128",fill:"none","aria-label":a("setup.brandLogo","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:a("setup.brandName","Fusion")})]}),e.jsxs("h2",{id:"wizard-title",className:"setup-wizard-title",children:[s.step==="manual"&&a("setup.welcomeToFusion","Welcome to Fusion"),s.step==="agent"&&a("setup.firstAgentTitle","Create your first agent"),s.step==="complete"&&a("setup.setupCompleteTitle","Setup Complete!")]})]}),s.step!=="complete"&&s.step!=="agent"&&e.jsx("button",{className:"modal-close",onClick:f,"aria-label":a("setup.closeWizard","Close wizard"),children:e.jsx(oe,{size:20})})]}),e.jsxs("div",{className:"setup-wizard-content",children:[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:a("setup.projectName","Project Name")}),e.jsx("input",{id:"project-name",type:"text",value:s.manualName,onChange:t=>i(r=>({...r,manualName:t.target.value})),placeholder:a("setup.projectNamePlaceholder","my-project")}),e.jsx("p",{className:"form-hint",children:p?a("setup.projectNameHintClone","By default this follows the destination folder name unless you edit it."):a("setup.projectNameHintExisting","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:p?a("setup.destinationDirectory","Destination Directory"):a("setup.projectDirectory","Project Directory")}),e.jsx(me,{value:s.manualPath,onChange:H,nodeId:s.manualNodeId||void 0,localNodeId:O,placeholder:p?a("setup.clonePathPlaceholder","/path/for/new-clone"):a("setup.projectPathPlaceholder","/path/to/your/project")}),e.jsx("p",{className:"form-hint",children:p?a("setup.clonePathHint","Select or type an absolute destination path. Fusion will clone into this directory."):a("setup.projectPathHint","Select or type the absolute path to your project")})]}),k&&s.manualPath.trim()&&e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:"workspace-mode",className:"checkbox-label",children:[e.jsx("input",{id:"workspace-mode",type:"checkbox",checked:s.workspaceMode,onChange:t=>i(r=>({...r,workspaceMode:t.target.checked}))}),a("setup.workspaceMode","Workspace mode (multi-repo)")]}),s.isDetectingWorkspace&&e.jsxs("p",{className:"form-hint",children:[e.jsx(v,{size:12,className:"animate-spin",style:{display:"inline-block",verticalAlign:"middle",marginRight:4}}),a("setup.detectingWorkspace","Detecting sub-repositories...")]}),!s.isDetectingWorkspace&&s.detectedRepos.length>0&&e.jsxs("p",{className:"form-hint",children:[a("setup.detectedRepos","Found {{count}} repositories:",{count:s.detectedRepos.length})," ",s.detectedRepos.join(", ")]}),!s.isDetectingWorkspace&&s.detectedRepos.length===0&&s.workspaceMode===!1&&s.manualPath.trim()&&e.jsx("p",{className:"form-hint",children:a("setup.noSubReposDetected","No sub-repositories detected. Enable if this is a multi-repo workspace.")})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"task-prefix",children:a("setup.taskPrefix","Task Prefix")}),e.jsx("input",{id:"task-prefix",type:"text",value:s.manualTaskPrefix,onChange:t=>i(r=>({...r,manualTaskPrefix:t.target.value.toUpperCase()})),placeholder:C(s.manualName||"FN"),maxLength:5}),e.jsx("p",{className:"form-hint",children:a("setup.taskPrefixHint",'Used for task IDs (e.g. "{{prefix}}-1"). Derived from project name.',{prefix:s.manualTaskPrefix||"FN"})})]}),e.jsxs("div",{className:"setup-wizard-advanced",children:[e.jsxs("button",{type:"button",className:"setup-wizard-advanced-toggle","aria-expanded":A,onClick:()=>W(t=>!t),children:[e.jsx(de,{size:16,className:"setup-wizard-advanced-chevron"}),e.jsx("span",{children:a("setup.advancedSettings","Advanced settings")})]}),A&&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:a("setup.setupMode","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:()=>i(t=>({...t,manualMode:"existing",error:null}))}),e.jsx("span",{children:a("setup.useExistingDirectory","Use Existing Directory")})]}),e.jsxs("label",{className:`setup-wizard-mode-option${p?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"setup-mode",value:"clone",checked:p,onChange:()=>i(t=>({...t,manualMode:"clone",error:null}))}),e.jsx("span",{children:a("setup.cloneGitRepository","Clone Git Repository")})]})]}),p&&e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"project-clone-url",children:a("setup.repositoryUrl","Repository URL")}),e.jsx("input",{id:"project-clone-url",type:"text",value:s.manualCloneUrl,onChange:t=>i(r=>({...r,manualCloneUrl:t.target.value})),placeholder:a("setup.repositoryUrlPlaceholder","https://github.com/owner/repo.git")}),e.jsx("p",{className:"form-hint",children:a("setup.cloneGitHint","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:a("setup.runtimeNode","Runtime Node")}),e.jsxs("select",{value:s.manualNodeId,onChange:t=>i(r=>({...r,manualNodeId:t.target.value})),disabled:L||s.isRegistering,children:[e.jsx("option",{value:"",children:a("setup.localNode","Local node")}),M.map(t=>e.jsxs("option",{value:t.id,children:[t.name," (",t.type,")"]},t.id))]})]})}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("setup.isolationMode","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:()=>i(t=>({...t,manualIsolationMode:"in-process"}))}),e.jsxs("div",{className:"setup-wizard-isolation-option-content",children:[e.jsx("strong",{children:a("setup.inProcess","In-Process")}),e.jsx("span",{children:a("setup.inProcessDesc","Lower overhead, shared memory. Best for most projects.")}),e.jsx("span",{className:"wizard-option-recommended",children:a("setup.recommended","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:()=>i(t=>({...t,manualIsolationMode:"child-process"}))}),e.jsxs("div",{className:"setup-wizard-isolation-option-content",children:[e.jsx("strong",{children:a("setup.childProcess","Child-Process")}),e.jsx("span",{children:a("setup.childProcessDesc","Isolated execution with crash containment.")})]})]})]})]})]})]}),s.error&&e.jsx("div",{className:"wizard-error",role:"alert",children:s.error})]}),s.step==="agent"&&e.jsxs("div",{className:"setup-wizard-agent-step",children:[e.jsx("p",{className:"setup-wizard-agent-intro",children:a("setup.firstAgentIntro","Agents are optional. Fusion can build tasks without one by starting temporary agents for planning, coding, review, and merge. Create an agent only if you want help coordinating tasks and direction.")}),e.jsxs("div",{className:"setup-wizard-agent-layout",children:[e.jsxs("section",{className:"setup-wizard-agent-presets","aria-labelledby":"setup-first-agent-presets-heading",children:[e.jsx("div",{className:"setup-wizard-agent-section-heading",id:"setup-first-agent-presets-heading",children:a("setup.firstAgentTemplates","Templates")}),e.jsx("div",{className:"setup-wizard-agent-preset-list",role:"radiogroup","aria-label":a("setup.firstAgentTemplates","Templates"),children:g.map(t=>{const r=s.selectedPresetId===t.id;return e.jsxs("button",{type:"button",className:`setup-wizard-agent-preset${r?" selected":""}`,role:"radio","aria-checked":r,"aria-label":r?a("setup.selectedAgentTemplate","{{name}} selected",{name:t.name}):t.name,tabIndex:t.id===Q?0:-1,"data-agent-preset-id":t.id,disabled:h,onClick:()=>w(t.id),onKeyDown:n=>$(n,t.id),children:[e.jsx(E,{agent:{id:t.id,icon:t.icon,name:t.name},size:28}),e.jsxs("span",{className:"setup-wizard-agent-preset-copy",children:[e.jsxs("span",{className:"setup-wizard-agent-preset-name",children:[t.name,t.id==="ceo"&&e.jsx("span",{className:"wizard-option-recommended",children:a("setup.recommended","Recommended")})]}),e.jsx("span",{className:"setup-wizard-agent-preset-description",children:t.description})]})]},t.id)})})]}),e.jsxs("section",{className:"setup-wizard-agent-preview","aria-labelledby":"setup-first-agent-preview-heading",children:[e.jsx("div",{className:"setup-wizard-agent-section-heading",id:"setup-first-agent-preview-heading",children:a("setup.firstAgentPreview","Preview")}),e.jsxs("div",{className:"setup-wizard-agent-preview-card",children:[e.jsxs("div",{className:"setup-wizard-agent-preview-title-row",children:[e.jsx(E,{agent:{id:s.selectedPresetId||"draft",icon:s.agentDraft.icon,name:s.agentDraft.name},size:36}),e.jsxs("div",{children:[e.jsx("h3",{children:s.agentDraft.name||a("setup.firstAgentDraftName","Draft agent")}),e.jsx("p",{children:s.agentDraft.title||J?.title||a("setup.firstAgentCustomDraft","Custom agent draft")})]})]}),e.jsxs("dl",{className:"setup-wizard-agent-preview-list",children:[e.jsxs("div",{children:[e.jsx("dt",{children:a("agents.fieldRole","Role")}),e.jsx("dd",{children:s.agentDraft.role})]}),e.jsxs("div",{children:[e.jsx("dt",{children:a("agents.fieldInstructionsText","Inline Instructions")}),e.jsx("dd",{children:s.agentDraft.instructionsText||a("setup.firstAgentNoInstructions","No inline instructions yet")})]})]}),P&&e.jsxs("button",{type:"button",className:"btn setup-wizard-agent-ai-btn",onClick:()=>j(!0),disabled:h,children:[e.jsx(ce,{size:16}),e.jsx("span",{children:a("agents.aiInterview","AI Interview")})]})]})]})]}),s.agentError&&e.jsx("div",{className:"wizard-error",role:"alert",tabIndex:-1,ref:D,children:s.agentError})]}),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(S,{size:64,className:"success-icon"}),e.jsx("h3",{children:a("setup.allSet","All Set!")}),e.jsx("p",{children:s.agentOutcome==="created"?a("setup.firstAgentCreatedSuccess","Your project is registered and your first agent is ready."):a("setup.projectRegisteredSuccess","Your project has been registered successfully.")}),e.jsx("p",{children:s.agentOutcome==="skipped"?a("setup.firstAgentSkippedHint","You can create agents later from the Agents view."):a("setup.addMoreProjectsHint","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:F,target:"_blank",rel:"noopener noreferrer",children:a("setup.needHelp","Need help?")}),s.step==="manual"&&e.jsx("button",{className:"btn btn-primary",onClick:B,disabled:X,children:s.isRegistering?e.jsxs(e.Fragment,{children:[e.jsx(v,{size:16,className:"animate-spin"}),e.jsx("span",{children:a("setup.registering","Registering...")})]}):e.jsx("span",{children:a("setup.registerProject","Register Project")})}),s.step==="agent"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn",onClick:q,disabled:h,children:a("setup.skipFirstAgent","Skip for now")}),e.jsx("button",{className:"btn btn-primary",onClick:()=>void G(),disabled:h||!s.agentDraft.name.trim(),"aria-busy":s.isCreatingAgent,children:s.isCreatingAgent?e.jsxs(e.Fragment,{children:[e.jsx(v,{size:16,className:"animate-spin"}),e.jsx("span",{children:a("setup.creatingFirstAgent","Creating agent...")})]}):e.jsx("span",{children:a("setup.createFirstAgent","Create Agent")})})]}),s.step==="complete"&&e.jsxs("button",{className:"btn btn-primary",onClick:_,children:[e.jsx(S,{size:16}),e.jsx("span",{children:a("setup.getStarted","Get Started")})]})]})]}),P&&I&&e.jsx(ue,{level:"modal",fallback:e.jsxs("div",{className:"wizard-error setup-wizard-agent-interview-error",role:"alert",children:[e.jsx("span",{children:a("setup.firstAgentInterviewLoadError","AI interview could not load. You can still create an agent from a template or skip this step.")}),e.jsx("button",{type:"button",className:"btn",onClick:()=>j(!1),children:a("setup.firstAgentContinueWithTemplates","Continue with templates")})]}),children:e.jsx(l.Suspense,{fallback:e.jsx("div",{className:"wizard-error setup-wizard-agent-interview-error",role:"status",children:a("setup.firstAgentInterviewLoading","Loading AI Interview...")}),children:e.jsx(he,{isOpen:I,onClose:()=>j(!1),onUseDraft:Y,projectId:s.registeredProject?.id,existingAgents:[],mode:"create"})})})]})}export{Ce as SetupWizardModal};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ExperimentalAgentOnboardingModal-BQc3GaE_.js","assets/vendor-react-SZ_qB27O.js","assets/index-CHy0WNjH.js","assets/vendor-i18n-GF3RlKbq.js","assets/vendor-reactflow-Bg-Qjzh8.js","assets/vendor-reactflow-C5ap-Sga.css","assets/vendor-xterm-BNq00GSj.js","assets/vendor-xterm-LZoznX6r.css","assets/vendor-codemirror-jBKmHyH0.js","assets/index-BnfnLXyO.css","assets/ExperimentalAgentOnboardingModal-3ZEFv8sr.css"])))=>i.map(i=>d[i]);
2
+ import{A as g,g as b,m as R,u as te,d as ae,r as re,a as ne,b as ie,e as le,X as oe,L as v,C as de,f as E,S as ce,h as S,E as ue,_ as pe}from"./index-CHy0WNjH.js";import{r as l,j as e}from"./vendor-react-SZ_qB27O.js";import{D as me}from"./DirectoryPicker-DNBB-viz.js";import{s as y}from"./projectDetection-G3XuxD2X.js";import{u as ge}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-reactflow-Bg-Qjzh8.js";import"./vendor-xterm-BNq00GSj.js";import"./vendor-codemirror-jBKmHyH0.js";import"./folder-open-STXgbemw.js";function C(c){const u=c.replace(/[^a-zA-Z]/g,"").toUpperCase();return u.length>=2&&u.length<=4?u:u.length>4?u.slice(0,4):"FN"}const he=l.lazy(()=>pe(()=>import("./ExperimentalAgentOnboardingModal-BQc3GaE_.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10])).then(c=>({default:c.ExperimentalAgentOnboardingModal})));function Ce({onProjectRegistered:c,onClose:u,agentOnboardingEnabled:P=!1,includeAgentStep:z=!0}){const{t:a}=ge("app"),F="https://discord.gg/ksrfuy7WYR",x=l.useMemo(()=>b("ceo")??g[0],[]),[T,U]=l.useState(!0),[s,i]=l.useState(()=>({step:"manual",manualMode:"existing",manualPath:"",manualCloneUrl:"",manualName:"",manualIsolationMode:"in-process",manualNodeId:"",manualTaskPrefix:"",detectedRepos:[],workspaceMode:!1,isDetectingWorkspace:!1,registeredProject:null,selectedPresetId:x.id,agentDraft:R(x),isCreatingAgent:!1,isRegistering:!1,error:null,agentError:null,agentOutcome:null})),[A,W]=l.useState(!1),[I,j]=l.useState(!1),D=l.useRef(null),{nodes:M,loading:L}=te(),O=M.find(t=>t.type==="local")?.id,f=l.useCallback(()=>{U(!1),u?.()},[u]),_=l.useCallback(()=>{if(s.registeredProject){c(s.registeredProject);return}f()},[f,c,s.registeredProject]);l.useEffect(()=>{s.agentError&&D.current?.focus()},[s.agentError]);const N=l.useRef(0),H=l.useCallback(t=>{if(i(r=>{const n={manualPath:t,detectedRepos:[],workspaceMode:!1};t&&(!r.manualName||r.manualName===y(r.manualPath))&&(n.manualName=y(t));const o=n.manualName??r.manualName;return o&&(!r.manualTaskPrefix||r.manualTaskPrefix===C(y(r.manualPath)))&&(n.manualTaskPrefix=C(o)),{...r,...n}}),s.manualMode==="existing"&&t.trim()&&t.trim()!=="/"){const r=++N.current;i(n=>({...n,isDetectingWorkspace:!0})),ae(t.trim()).then(n=>{r===N.current&&i(o=>({...o,isDetectingWorkspace:!1,detectedRepos:n.repos,workspaceMode:n.isWorkspace}))}).catch(()=>{r===N.current&&i(n=>({...n,isDetectingWorkspace:!1}))})}},[s.manualMode]),B=l.useCallback(async()=>{const t=s.manualPath.trim(),r=s.manualName.trim(),n=s.manualCloneUrl.trim();if(!(!t||!r)&&!(s.manualMode==="clone"&&!n)){i(o=>({...o,isRegistering:!0,error:null}));try{const o={name:r,path:t,isolationMode:s.manualIsolationMode,nodeId:s.manualNodeId||void 0,cloneUrl:s.manualMode==="clone"?n:void 0,workspaceMode:s.workspaceMode,taskPrefix:s.manualTaskPrefix.trim()||void 0},d=await re(o);if(!z){i(m=>({...m,isRegistering:!1})),c(d);return}i(m=>({...m,step:"agent",registeredProject:d,isRegistering:!1}))}catch(o){i(d=>({...d,isRegistering:!1,error:o instanceof Error?o.message:"Failed to register project"}))}}},[z,c,s.manualPath,s.manualName,s.manualCloneUrl,s.manualMode,s.manualIsolationMode,s.manualNodeId,s.workspaceMode,s.manualTaskPrefix]),w=l.useCallback(t=>{const r=b(t);r&&i(n=>({...n,selectedPresetId:r.id,agentDraft:R(r),agentError:null}))},[]),$=l.useCallback((t,r)=>{const n=g.findIndex(se=>se.id===r);if(n<0)return;const o=g.length-1;let d=null;if(t.key==="ArrowDown"||t.key==="ArrowRight"?d=n===o?0:n+1:t.key==="ArrowUp"||t.key==="ArrowLeft"?d=n===0?o:n-1:t.key==="Home"?d=0:t.key==="End"&&(d=o),d===null)return;t.preventDefault();const m=g[d];w(m.id),requestAnimationFrame(()=>{document.querySelector(`[data-agent-preset-id="${m.id}"]`)?.focus()})},[w]),Y=l.useCallback(t=>{i(r=>({...r,selectedPresetId:"",agentDraft:ne(t),agentError:null}))},[]),G=l.useCallback(async()=>{if(!(!s.registeredProject||!s.agentDraft.name.trim())){i(t=>({...t,isCreatingAgent:!0,agentError:null}));try{await ie(le(s.agentDraft),s.registeredProject.id),i(t=>({...t,step:"complete",isCreatingAgent:!1,agentOutcome:"created"}))}catch(t){i(r=>({...r,isCreatingAgent:!1,agentError:t instanceof Error?t.message:a("setup.firstAgentCreateError","Failed to create agent")}))}}},[s.agentDraft,s.registeredProject,a]),q=l.useCallback(()=>{i(t=>({...t,step:"complete",agentError:null,agentOutcome:"skipped"}))},[]);if(!T)return null;const k=s.manualMode==="existing",p=s.manualMode==="clone",K=s.manualPath.trim().length>0,Z=s.manualName.trim().length>0,V=s.manualCloneUrl.trim().length>0,X=s.isRegistering||!K||!Z||p&&!V,J=s.selectedPresetId?b(s.selectedPresetId):void 0,h=s.isCreatingAgent,Q=s.selectedPresetId||x.id,ee=`modal setup-wizard-modal${s.step==="agent"?" setup-wizard-modal--agent":""}`;return e.jsxs("div",{className:"modal-overlay open setup-wizard-overlay",role:"dialog","aria-modal":"true","aria-labelledby":"wizard-title",children:[e.jsxs("div",{className:ee,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":a("setup.brandName","Fusion"),children:[e.jsxs("svg",{className:"setup-wizard-brand-logo",width:28,height:28,viewBox:"0 0 128 128",fill:"none","aria-label":a("setup.brandLogo","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:a("setup.brandName","Fusion")})]}),e.jsxs("h2",{id:"wizard-title",className:"setup-wizard-title",children:[s.step==="manual"&&a("setup.welcomeToFusion","Welcome to Fusion"),s.step==="agent"&&a("setup.firstAgentTitle","Create your first agent"),s.step==="complete"&&a("setup.setupCompleteTitle","Setup Complete!")]})]}),s.step!=="complete"&&s.step!=="agent"&&e.jsx("button",{className:"modal-close",onClick:f,"aria-label":a("setup.closeWizard","Close wizard"),children:e.jsx(oe,{size:20})})]}),e.jsxs("div",{className:"setup-wizard-content",children:[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:a("setup.projectName","Project Name")}),e.jsx("input",{id:"project-name",type:"text",value:s.manualName,onChange:t=>i(r=>({...r,manualName:t.target.value})),placeholder:a("setup.projectNamePlaceholder","my-project")}),e.jsx("p",{className:"form-hint",children:p?a("setup.projectNameHintClone","By default this follows the destination folder name unless you edit it."):a("setup.projectNameHintExisting","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:p?a("setup.destinationDirectory","Destination Directory"):a("setup.projectDirectory","Project Directory")}),e.jsx(me,{value:s.manualPath,onChange:H,nodeId:s.manualNodeId||void 0,localNodeId:O,placeholder:p?a("setup.clonePathPlaceholder","/path/for/new-clone"):a("setup.projectPathPlaceholder","/path/to/your/project")}),e.jsx("p",{className:"form-hint",children:p?a("setup.clonePathHint","Select or type an absolute destination path. Fusion will clone into this directory."):a("setup.projectPathHint","Select or type the absolute path to your project")})]}),k&&s.manualPath.trim()&&e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:"workspace-mode",className:"checkbox-label",children:[e.jsx("input",{id:"workspace-mode",type:"checkbox",checked:s.workspaceMode,onChange:t=>i(r=>({...r,workspaceMode:t.target.checked}))}),a("setup.workspaceMode","Workspace mode (multi-repo)")]}),s.isDetectingWorkspace&&e.jsxs("p",{className:"form-hint",children:[e.jsx(v,{size:12,className:"animate-spin",style:{display:"inline-block",verticalAlign:"middle",marginRight:4}}),a("setup.detectingWorkspace","Detecting sub-repositories...")]}),!s.isDetectingWorkspace&&s.detectedRepos.length>0&&e.jsxs("p",{className:"form-hint",children:[a("setup.detectedRepos","Found {{count}} repositories:",{count:s.detectedRepos.length})," ",s.detectedRepos.join(", ")]}),!s.isDetectingWorkspace&&s.detectedRepos.length===0&&s.workspaceMode===!1&&s.manualPath.trim()&&e.jsx("p",{className:"form-hint",children:a("setup.noSubReposDetected","No sub-repositories detected. Enable if this is a multi-repo workspace.")})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"task-prefix",children:a("setup.taskPrefix","Task Prefix")}),e.jsx("input",{id:"task-prefix",type:"text",value:s.manualTaskPrefix,onChange:t=>i(r=>({...r,manualTaskPrefix:t.target.value.toUpperCase()})),placeholder:C(s.manualName||"FN"),maxLength:5}),e.jsx("p",{className:"form-hint",children:a("setup.taskPrefixHint",'Used for task IDs (e.g. "{{prefix}}-1"). Derived from project name.',{prefix:s.manualTaskPrefix||"FN"})})]}),e.jsxs("div",{className:"setup-wizard-advanced",children:[e.jsxs("button",{type:"button",className:"setup-wizard-advanced-toggle","aria-expanded":A,onClick:()=>W(t=>!t),children:[e.jsx(de,{size:16,className:"setup-wizard-advanced-chevron"}),e.jsx("span",{children:a("setup.advancedSettings","Advanced settings")})]}),A&&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:a("setup.setupMode","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:()=>i(t=>({...t,manualMode:"existing",error:null}))}),e.jsx("span",{children:a("setup.useExistingDirectory","Use Existing Directory")})]}),e.jsxs("label",{className:`setup-wizard-mode-option${p?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"setup-mode",value:"clone",checked:p,onChange:()=>i(t=>({...t,manualMode:"clone",error:null}))}),e.jsx("span",{children:a("setup.cloneGitRepository","Clone Git Repository")})]})]}),p&&e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"project-clone-url",children:a("setup.repositoryUrl","Repository URL")}),e.jsx("input",{id:"project-clone-url",type:"text",value:s.manualCloneUrl,onChange:t=>i(r=>({...r,manualCloneUrl:t.target.value})),placeholder:a("setup.repositoryUrlPlaceholder","https://github.com/owner/repo.git")}),e.jsx("p",{className:"form-hint",children:a("setup.cloneGitHint","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:a("setup.runtimeNode","Runtime Node")}),e.jsxs("select",{value:s.manualNodeId,onChange:t=>i(r=>({...r,manualNodeId:t.target.value})),disabled:L||s.isRegistering,children:[e.jsx("option",{value:"",children:a("setup.localNode","Local node")}),M.map(t=>e.jsxs("option",{value:t.id,children:[t.name," (",t.type,")"]},t.id))]})]})}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("setup.isolationMode","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:()=>i(t=>({...t,manualIsolationMode:"in-process"}))}),e.jsxs("div",{className:"setup-wizard-isolation-option-content",children:[e.jsx("strong",{children:a("setup.inProcess","In-Process")}),e.jsx("span",{children:a("setup.inProcessDesc","Lower overhead, shared memory. Best for most projects.")}),e.jsx("span",{className:"wizard-option-recommended",children:a("setup.recommended","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:()=>i(t=>({...t,manualIsolationMode:"child-process"}))}),e.jsxs("div",{className:"setup-wizard-isolation-option-content",children:[e.jsx("strong",{children:a("setup.childProcess","Child-Process")}),e.jsx("span",{children:a("setup.childProcessDesc","Isolated execution with crash containment.")})]})]})]})]})]})]}),s.error&&e.jsx("div",{className:"wizard-error",role:"alert",children:s.error})]}),s.step==="agent"&&e.jsxs("div",{className:"setup-wizard-agent-step",children:[e.jsx("p",{className:"setup-wizard-agent-intro",children:a("setup.firstAgentIntro","Agents are optional. Fusion can build tasks without one by starting temporary agents for planning, coding, review, and merge. Create an agent only if you want help coordinating tasks and direction.")}),e.jsxs("div",{className:"setup-wizard-agent-layout",children:[e.jsxs("section",{className:"setup-wizard-agent-presets","aria-labelledby":"setup-first-agent-presets-heading",children:[e.jsx("div",{className:"setup-wizard-agent-section-heading",id:"setup-first-agent-presets-heading",children:a("setup.firstAgentTemplates","Templates")}),e.jsx("div",{className:"setup-wizard-agent-preset-list",role:"radiogroup","aria-label":a("setup.firstAgentTemplates","Templates"),children:g.map(t=>{const r=s.selectedPresetId===t.id;return e.jsxs("button",{type:"button",className:`setup-wizard-agent-preset${r?" selected":""}`,role:"radio","aria-checked":r,"aria-label":r?a("setup.selectedAgentTemplate","{{name}} selected",{name:t.name}):t.name,tabIndex:t.id===Q?0:-1,"data-agent-preset-id":t.id,disabled:h,onClick:()=>w(t.id),onKeyDown:n=>$(n,t.id),children:[e.jsx(E,{agent:{id:t.id,icon:t.icon,name:t.name},size:28}),e.jsxs("span",{className:"setup-wizard-agent-preset-copy",children:[e.jsxs("span",{className:"setup-wizard-agent-preset-name",children:[t.name,t.id==="ceo"&&e.jsx("span",{className:"wizard-option-recommended",children:a("setup.recommended","Recommended")})]}),e.jsx("span",{className:"setup-wizard-agent-preset-description",children:t.description})]})]},t.id)})})]}),e.jsxs("section",{className:"setup-wizard-agent-preview","aria-labelledby":"setup-first-agent-preview-heading",children:[e.jsx("div",{className:"setup-wizard-agent-section-heading",id:"setup-first-agent-preview-heading",children:a("setup.firstAgentPreview","Preview")}),e.jsxs("div",{className:"setup-wizard-agent-preview-card",children:[e.jsxs("div",{className:"setup-wizard-agent-preview-title-row",children:[e.jsx(E,{agent:{id:s.selectedPresetId||"draft",icon:s.agentDraft.icon,name:s.agentDraft.name},size:36}),e.jsxs("div",{children:[e.jsx("h3",{children:s.agentDraft.name||a("setup.firstAgentDraftName","Draft agent")}),e.jsx("p",{children:s.agentDraft.title||J?.title||a("setup.firstAgentCustomDraft","Custom agent draft")})]})]}),e.jsxs("dl",{className:"setup-wizard-agent-preview-list",children:[e.jsxs("div",{children:[e.jsx("dt",{children:a("agents.fieldRole","Role")}),e.jsx("dd",{children:s.agentDraft.role})]}),e.jsxs("div",{children:[e.jsx("dt",{children:a("agents.fieldInstructionsText","Inline Instructions")}),e.jsx("dd",{children:s.agentDraft.instructionsText||a("setup.firstAgentNoInstructions","No inline instructions yet")})]})]}),P&&e.jsxs("button",{type:"button",className:"btn setup-wizard-agent-ai-btn",onClick:()=>j(!0),disabled:h,children:[e.jsx(ce,{size:16}),e.jsx("span",{children:a("agents.aiInterview","AI Interview")})]})]})]})]}),s.agentError&&e.jsx("div",{className:"wizard-error",role:"alert",tabIndex:-1,ref:D,children:s.agentError})]}),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(S,{size:64,className:"success-icon"}),e.jsx("h3",{children:a("setup.allSet","All Set!")}),e.jsx("p",{children:s.agentOutcome==="created"?a("setup.firstAgentCreatedSuccess","Your project is registered and your first agent is ready."):a("setup.projectRegisteredSuccess","Your project has been registered successfully.")}),e.jsx("p",{children:s.agentOutcome==="skipped"?a("setup.firstAgentSkippedHint","You can create agents later from the Agents view."):a("setup.addMoreProjectsHint","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:F,target:"_blank",rel:"noopener noreferrer",children:a("setup.needHelp","Need help?")}),s.step==="manual"&&e.jsx("button",{className:"btn btn-primary",onClick:B,disabled:X,children:s.isRegistering?e.jsxs(e.Fragment,{children:[e.jsx(v,{size:16,className:"animate-spin"}),e.jsx("span",{children:a("setup.registering","Registering...")})]}):e.jsx("span",{children:a("setup.registerProject","Register Project")})}),s.step==="agent"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn",onClick:q,disabled:h,children:a("setup.skipFirstAgent","Skip for now")}),e.jsx("button",{className:"btn btn-primary",onClick:()=>void G(),disabled:h||!s.agentDraft.name.trim(),"aria-busy":s.isCreatingAgent,children:s.isCreatingAgent?e.jsxs(e.Fragment,{children:[e.jsx(v,{size:16,className:"animate-spin"}),e.jsx("span",{children:a("setup.creatingFirstAgent","Creating agent...")})]}):e.jsx("span",{children:a("setup.createFirstAgent","Create Agent")})})]}),s.step==="complete"&&e.jsxs("button",{className:"btn btn-primary",onClick:_,children:[e.jsx(S,{size:16}),e.jsx("span",{children:a("setup.getStarted","Get Started")})]})]})]}),P&&I&&e.jsx(ue,{level:"modal",fallback:e.jsxs("div",{className:"wizard-error setup-wizard-agent-interview-error",role:"alert",children:[e.jsx("span",{children:a("setup.firstAgentInterviewLoadError","AI interview could not load. You can still create an agent from a template or skip this step.")}),e.jsx("button",{type:"button",className:"btn",onClick:()=>j(!1),children:a("setup.firstAgentContinueWithTemplates","Continue with templates")})]}),children:e.jsx(l.Suspense,{fallback:e.jsx("div",{className:"wizard-error setup-wizard-agent-interview-error",role:"status",children:a("setup.firstAgentInterviewLoading","Loading AI Interview...")}),children:e.jsx(he,{isOpen:I,onClose:()=>j(!1),onUseDraft:Y,projectId:s.registeredProject?.id,existingAgents:[],mode:"create"})})})]})}export{Ce as SetupWizardModal};
@@ -1,4 +1,4 @@
1
- import{c as i,c2 as b,c3 as d,c4 as v,c5 as p}from"./index-CUY6xXXv.js";import{r as N,j as e}from"./vendor-react-SZ_qB27O.js";import{u as w}from"./vendor-i18n-GF3RlKbq.js";/**
1
+ import{c as i,c2 as b,c3 as d,c4 as v,c5 as p}from"./index-CHy0WNjH.js";import{r as N,j as e}from"./vendor-react-SZ_qB27O.js";import{u as w}from"./vendor-i18n-GF3RlKbq.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{r as a,j as l}from"./vendor-react-SZ_qB27O.js";import{i as ml,j as ul,t as vl,k as hl,l as gl,n as bl,V as wl,Z as xl,X as q,R as fl,o as jl,C as pl,L as A,p as H,q as G,M as J}from"./index-CUY6xXXv.js";import{u as Nl}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-reactflow-Bg-Qjzh8.js";import"./vendor-xterm-BNq00GSj.js";import"./vendor-codemirror-jBKmHyH0.js";const Sl=new Set([".md",".markdown",".mdx"]);function Cl(r){const d=r.toLowerCase(),j=d.lastIndexOf(".");return j<0?!1:Sl.has(d.slice(j))}function zl({projectId:r,addToast:d,onClose:j}){const{t:e}=Nl("app"),[k,p]=a.useState([]),[F,T]=a.useState(!0),[Y,V]=a.useState(!1),[I,D]=a.useState(null),[_,ll]=a.useState([]),[g,sl]=a.useState(""),[M,B]=a.useState(null),[c,N]=a.useState(null),[b,S]=a.useState(null),[el,K]=a.useState(!1),[Q,C]=a.useState(null),[y,w]=a.useState(null),[u,v]=a.useState(null),[il,z]=a.useState(!1),[$,h]=a.useState(null),m=a.useRef(null),[P,al]=a.useState(""),O=g.trim()?k.filter(s=>s.name.toLowerCase().includes(g.toLowerCase())||s.relativePath.toLowerCase().includes(g.toLowerCase())):k,x=a.useCallback(async()=>{T(!0);try{const s=await ml(r);p(s)}catch(s){const t=s instanceof Error?s.message:e("skills.loadDiscoveredError","Failed to load discovered skills");d(t,"error")}finally{T(!1)}},[r,d]),f=a.useCallback(async s=>{const t=i=>{if(!i||typeof i!="object")return!1;const n=i;if(typeof n.status=="number"&&n.status>=500)return!0;if(n.details&&typeof n.details=="object"){const L=n.details;if(typeof L.code=="string"&&L.code.startsWith("upstream_"))return!0}const o=i;return typeof o.error=="string"&&typeof o.code=="string"};V(!0),D(null);try{const i=await ul(s,20,r);ll(i.entries)}catch(i){if(t(i))D(e("skills.catalogUnavailable","Catalog is temporarily unavailable. Please try again later."));else{const n=i instanceof Error?i.message:e("skills.loadCatalogError","Failed to load catalog");D(n)}}finally{V(!1)}},[r]);a.useEffect(()=>{x(),f("")},[x,f]);const tl=a.useCallback(s=>{sl(s),m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{al(s),m.current=null},300)},[]);a.useEffect(()=>()=>{m.current&&(clearTimeout(m.current),m.current=null)},[]),a.useEffect(()=>{f(P)},[P,f]);const nl=a.useCallback(async(s,t)=>{const i=!t;p(n=>n.map(o=>o.id===s?{...o,toggling:!0}:o));try{await vl(s,i,r),p(n=>n.map(o=>o.id===s?{...o,enabled:i,toggling:!1}:o)),d(e(`skills.${i?"enabled":"disabled"}`,i?"Skill enabled":"Skill disabled"),"success")}catch(n){p(L=>L.map(R=>R.id===s?{...R,toggling:!1}:R));const o=n instanceof Error?n.message:e("skills.toggleError","Failed to toggle skill");d(e("skills.toggleFailed","Failed to toggle skill: {{message}}",{message:o}),"error")}},[r,d]),cl=a.useCallback(async s=>{const t=s.repo?.trim();if(!(!t||M===s.id)){B(s.id);try{await hl(t,s.slug||s.name,r),d(e("skills.installSuccess","Installed {{name}}",{name:s.name}),"success"),await x()}catch(i){const n=i instanceof Error?i.message:e("skills.installError","Failed to install skill");d(e("skills.installFailed","Failed to install {{name}}: {{message}}",{name:s.name,message:n}),"error")}finally{B(i=>i===s.id?null:i)}}},[d,M,x,r]),E=a.useCallback(async s=>{K(!0),C(null),S(null),w(null),v(null),h(null);try{const t=await gl(s,r);S(t)}catch(t){const i=t instanceof Error?t.message:e("skills.loadContentError","Failed to load skill content");C(i)}finally{K(!1)}},[r]),U=a.useCallback((s,t)=>{if(!(t&&t.target.closest(".skills-view-item-toggle"))){if(c===s){N(null),S(null),C(null),w(null),v(null),h(null);return}N(s),E(s)}},[c,E]),ol=a.useCallback(s=>{c!==s&&N(s),E(s)},[E,c]),W=a.useCallback(async(s,t)=>{w(t),v(null),h(null),z(!0);try{const i=await bl(s,t,r);v(i)}catch(i){const n=i instanceof Error?i.message:e("skills.loadFileError","Failed to load file");h(n)}finally{z(!1)}},[r]),rl=a.useCallback(()=>{w(null),v(null),h(null),z(!1)},[]),X=a.useCallback(()=>{N(null),S(null),C(null),w(null),v(null),h(null)},[]),dl=a.useMemo(()=>k.find(s=>s.id===c)??null,[k,c]),Z=()=>!b||b.files.length===0?null:l.jsxs("div",{className:"skills-view-detail-files","data-testid":"skill-files",children:[l.jsxs("span",{className:"skills-view-detail-files-label",children:[e("skills.filesLabel","Files"),":"]}),b.files.map(s=>{if(s.type==="directory")return l.jsxs("span",{className:"badge badge--sm skills-view-detail-file--dir",children:[s.name,"/"]},s.relativePath);const t=y===s.relativePath;return l.jsx("button",{type:"button","data-testid":"skill-file-item",className:`badge badge--sm skills-view-detail-file${t?" skills-view-detail-file--active":""}`,onClick:()=>c&&void W(c,s.relativePath),"aria-pressed":t,"aria-label":e("skills.viewFile","View {{name}}",{name:s.name}),children:s.name},s.relativePath)})]}),kl=()=>c?el?l.jsxs("div",{className:"skills-view-detail-loading",children:[l.jsx(A,{size:16,className:"spin"}),e("skills.loadingContent","Loading skill content...")]}):Q?l.jsxs("div",{className:"skills-view-detail-error",children:[l.jsx(G,{size:14}),l.jsx("span",{children:Q}),l.jsx("button",{className:"btn btn-sm",onClick:()=>ol(c),children:e("common.retry","Retry")})]}):b?y!==null?l.jsxs("div",{className:"skills-view-file-viewer","data-testid":"skill-file-viewer",children:[l.jsxs("div",{className:"skills-view-file-viewer-bar",children:[l.jsxs("button",{type:"button",className:"btn btn-sm skills-view-file-back",onClick:rl,"data-testid":"skill-file-back","aria-label":e("skills.backToSkillMd","Back to SKILL.md"),children:[l.jsx(H,{size:14}),e("skills.backToSkillMd","Back to SKILL.md")]}),l.jsx("span",{className:"skills-view-file-viewer-name",children:y})]}),il?l.jsxs("div",{className:"skills-view-detail-loading",children:[l.jsx(A,{size:16,className:"spin"}),e("skills.loadingFile","Loading file...")]}):$?l.jsxs("div",{className:"skills-view-detail-error",children:[l.jsx(G,{size:14}),l.jsx("span",{children:$}),l.jsx("button",{className:"btn btn-sm",onClick:()=>c&&void W(c,y),children:e("common.retry","Retry")})]}):u&&!u.isText?l.jsx("div",{className:"skills-view-detail-empty",children:e("skills.fileNotPreviewable","This file cannot be previewed.")}):u?Cl(u.relativePath)?l.jsx(J,{content:u.content||e("skills.emptyFile","(Empty file)"),className:"skills-view-detail-markdown",testId:"skills-view-detail-markdown"}):l.jsx("pre",{className:"skills-view-detail-content",children:u.content||e("skills.emptyFile","(Empty file)")}):null,Z()]}):l.jsxs(l.Fragment,{children:[l.jsx(J,{content:b.skillMd||e("skills.noSkillMd","(No SKILL.md found)"),className:"skills-view-detail-markdown",testId:"skills-view-detail-markdown"}),Z()]}):null:l.jsx("div",{className:"skills-view-detail-placeholder","data-testid":"skills-detail-empty",children:e("skills.selectASkill","Select a skill to view its details")});return l.jsxs("div",{className:"skills-view","data-testid":"skills-view","data-selected":c?"true":"false",children:[l.jsx(wl,{icon:xl,title:e("skills.title","Skills"),actions:l.jsxs(l.Fragment,{children:[l.jsxs("span",{className:"skills-view-count","aria-label":e("skills.discoveredCount","{{count}} discovered skills",{count:k.length}),children:[k.length," ",e("skills.discovered","discovered")]}),l.jsx("button",{className:"btn-icon skills-view-close touch-target",onClick:j,"aria-label":e("skills.closeView","Close skills view"),children:l.jsx(q,{size:16})}),l.jsxs("button",{className:"btn btn-sm",onClick:()=>void x(),disabled:F,children:[l.jsx(fl,{size:14,className:F?"spin":""}),e("common.refresh","Refresh")]})]})}),l.jsxs("div",{className:"skills-view-body",children:[l.jsx("div",{className:"skills-view__list","data-testid":"skills-list",children:l.jsxs("div",{className:"skills-view-content",children:[l.jsx("div",{className:"skills-view-search",children:l.jsx("input",{type:"text",className:"form-input",placeholder:e("skills.searchPlaceholder","Search skills..."),value:g,onChange:s=>tl(s.target.value),"aria-label":e("skills.searchLabel","Search skills")})}),l.jsxs("section",{className:"skills-view-section","aria-labelledby":"discovered-skills-title",children:[l.jsx("h3",{id:"discovered-skills-title",className:"skills-view-section-title",children:e("skills.discoveredSection","Discovered Skills")}),F?l.jsxs("div",{className:"skills-view-loading",children:[l.jsx("span",{className:"spinner"}),e("skills.loadingDiscovered","Loading discovered skills...")]}):k.length===0?l.jsx("div",{className:"skills-view-empty",children:l.jsx("p",{children:e("skills.noDiscovered","No skills discovered in this project.")})}):O.length===0?l.jsx("div",{className:"skills-view-empty",children:l.jsx("p",{children:e("skills.noMatchingDiscovered","No discovered skills match your search.")})}):l.jsx("div",{className:"skills-view-list",children:O.map(s=>{const t=c===s.id;return l.jsx("div",{children:l.jsxs("div",{className:`skills-view-item${t?" skills-view-item--selected":""}`,onClick:i=>U(s.id,i),role:"button",tabIndex:0,onKeyDown:i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),U(s.id))},"aria-expanded":t,"aria-label":e("skills.viewDetails","View details for {{name}}",{name:s.name}),children:[l.jsxs("div",{className:"skills-view-item-info",children:[l.jsxs("span",{className:"skills-view-item-name",children:[t?l.jsx(jl,{size:14}):l.jsx(pl,{size:14}),s.name]}),l.jsx("span",{className:"skills-view-item-path",children:s.relativePath}),l.jsx("span",{className:"skills-view-item-source",children:s.metadata.source})]}),l.jsxs("label",{className:"skills-view-item-toggle",onClick:i=>i.stopPropagation(),children:[l.jsx("input",{type:"checkbox",checked:s.enabled,disabled:s.toggling,onChange:()=>void nl(s.id,s.enabled),"aria-label":e(`skills.${s.enabled?"disable":"enable"}Skill`,s.enabled?"Disable {{name}}":"Enable {{name}}",{name:s.name})}),l.jsx("span",{className:"skills-view-toggle-slider"})]})]})},s.id)})})]}),l.jsxs("section",{className:"skills-view-section","aria-labelledby":"catalog-title",children:[l.jsx("h3",{id:"catalog-title",className:"skills-view-section-title",children:e("skills.catalogSection","Skills Catalog")}),I?l.jsxs("div",{className:"skills-view-error",children:[l.jsx("p",{children:I}),l.jsx("button",{className:"btn btn-sm",onClick:()=>void f(P),children:e("common.tryAgain","Try Again")})]}):Y?l.jsxs("div",{className:"skills-view-loading",children:[l.jsx("span",{className:"spinner"}),e("skills.loadingCatalog","Loading catalog...")]}):_.length===0?l.jsx("div",{className:"skills-view-empty",children:g?l.jsx("p",{children:e("skills.noMatchingSearch","No skills match your search.")}):l.jsx("p",{children:e("skills.noCatalogAvailable","No skills available in the catalog.")})}):l.jsx("div",{className:"skills-view-grid",children:_.map(s=>{const i=!!s.repo?.trim(),n=M===s.id;return l.jsxs("div",{className:"skills-view-card",children:[l.jsxs("div",{className:"skills-view-card-header",children:[l.jsx("h4",{className:"skills-view-card-title",children:s.name}),i?l.jsxs("button",{type:"button",className:"btn btn-sm skills-view-card-install",onClick:()=>void cl(s),disabled:n,"aria-label":e("skills.installSkill","Install {{name}}",{name:s.name}),children:[n?l.jsx(A,{size:14,className:"spin"}):null,n?e("skills.installing","Installing…"):e("skills.install","Install")]}):null]}),s.description&&l.jsx("p",{className:"skills-view-card-description",children:s.description}),s.tags&&s.tags.length>0&&l.jsx("div",{className:"skills-view-card-tags",children:s.tags.map(o=>l.jsx("span",{className:"badge badge--sm",children:o},o))}),s.installs!==void 0&&l.jsx("span",{className:"skills-view-card-installs",children:e("skills.installsCount","{{value}} installs",{value:s.installs.toLocaleString()})})]},s.id)})})]})]})}),l.jsxs("div",{className:"skills-view__detail","data-testid":"skill-detail",children:[l.jsxs("div",{className:"skills-view-detail-header",children:[l.jsx("button",{type:"button",className:"btn btn-sm btn-icon skills-view-detail-back",onClick:X,"aria-label":e("skills.backToList","Back to skills"),title:e("skills.backToList","Back to skills"),"data-testid":"skills-detail-back",children:l.jsx(H,{size:14})}),l.jsx("span",{className:"skills-view-detail-title",children:dl?.name??e("skills.detailTitle","Skill")}),l.jsxs("button",{className:"btn btn-sm skills-view-detail-close",onClick:X,disabled:!c,"aria-label":e("skills.closeDetail","Close skill detail"),children:[l.jsx(q,{size:14}),e("common.close","Close")]})]}),l.jsx("div",{className:"skills-view-detail-body",children:kl()})]})]})]})}export{zl as SkillsView};
1
+ import{r as a,j as l}from"./vendor-react-SZ_qB27O.js";import{i as ml,j as ul,t as vl,k as hl,l as gl,n as bl,V as wl,Z as xl,X as q,R as fl,o as jl,C as pl,L as A,p as H,q as G,M as J}from"./index-CHy0WNjH.js";import{u as Nl}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-reactflow-Bg-Qjzh8.js";import"./vendor-xterm-BNq00GSj.js";import"./vendor-codemirror-jBKmHyH0.js";const Sl=new Set([".md",".markdown",".mdx"]);function Cl(r){const d=r.toLowerCase(),j=d.lastIndexOf(".");return j<0?!1:Sl.has(d.slice(j))}function zl({projectId:r,addToast:d,onClose:j}){const{t:e}=Nl("app"),[k,p]=a.useState([]),[F,T]=a.useState(!0),[Y,V]=a.useState(!1),[I,D]=a.useState(null),[_,ll]=a.useState([]),[g,sl]=a.useState(""),[M,B]=a.useState(null),[c,N]=a.useState(null),[b,S]=a.useState(null),[el,K]=a.useState(!1),[Q,C]=a.useState(null),[y,w]=a.useState(null),[u,v]=a.useState(null),[il,z]=a.useState(!1),[$,h]=a.useState(null),m=a.useRef(null),[P,al]=a.useState(""),O=g.trim()?k.filter(s=>s.name.toLowerCase().includes(g.toLowerCase())||s.relativePath.toLowerCase().includes(g.toLowerCase())):k,x=a.useCallback(async()=>{T(!0);try{const s=await ml(r);p(s)}catch(s){const t=s instanceof Error?s.message:e("skills.loadDiscoveredError","Failed to load discovered skills");d(t,"error")}finally{T(!1)}},[r,d]),f=a.useCallback(async s=>{const t=i=>{if(!i||typeof i!="object")return!1;const n=i;if(typeof n.status=="number"&&n.status>=500)return!0;if(n.details&&typeof n.details=="object"){const L=n.details;if(typeof L.code=="string"&&L.code.startsWith("upstream_"))return!0}const o=i;return typeof o.error=="string"&&typeof o.code=="string"};V(!0),D(null);try{const i=await ul(s,20,r);ll(i.entries)}catch(i){if(t(i))D(e("skills.catalogUnavailable","Catalog is temporarily unavailable. Please try again later."));else{const n=i instanceof Error?i.message:e("skills.loadCatalogError","Failed to load catalog");D(n)}}finally{V(!1)}},[r]);a.useEffect(()=>{x(),f("")},[x,f]);const tl=a.useCallback(s=>{sl(s),m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{al(s),m.current=null},300)},[]);a.useEffect(()=>()=>{m.current&&(clearTimeout(m.current),m.current=null)},[]),a.useEffect(()=>{f(P)},[P,f]);const nl=a.useCallback(async(s,t)=>{const i=!t;p(n=>n.map(o=>o.id===s?{...o,toggling:!0}:o));try{await vl(s,i,r),p(n=>n.map(o=>o.id===s?{...o,enabled:i,toggling:!1}:o)),d(e(`skills.${i?"enabled":"disabled"}`,i?"Skill enabled":"Skill disabled"),"success")}catch(n){p(L=>L.map(R=>R.id===s?{...R,toggling:!1}:R));const o=n instanceof Error?n.message:e("skills.toggleError","Failed to toggle skill");d(e("skills.toggleFailed","Failed to toggle skill: {{message}}",{message:o}),"error")}},[r,d]),cl=a.useCallback(async s=>{const t=s.repo?.trim();if(!(!t||M===s.id)){B(s.id);try{await hl(t,s.slug||s.name,r),d(e("skills.installSuccess","Installed {{name}}",{name:s.name}),"success"),await x()}catch(i){const n=i instanceof Error?i.message:e("skills.installError","Failed to install skill");d(e("skills.installFailed","Failed to install {{name}}: {{message}}",{name:s.name,message:n}),"error")}finally{B(i=>i===s.id?null:i)}}},[d,M,x,r]),E=a.useCallback(async s=>{K(!0),C(null),S(null),w(null),v(null),h(null);try{const t=await gl(s,r);S(t)}catch(t){const i=t instanceof Error?t.message:e("skills.loadContentError","Failed to load skill content");C(i)}finally{K(!1)}},[r]),U=a.useCallback((s,t)=>{if(!(t&&t.target.closest(".skills-view-item-toggle"))){if(c===s){N(null),S(null),C(null),w(null),v(null),h(null);return}N(s),E(s)}},[c,E]),ol=a.useCallback(s=>{c!==s&&N(s),E(s)},[E,c]),W=a.useCallback(async(s,t)=>{w(t),v(null),h(null),z(!0);try{const i=await bl(s,t,r);v(i)}catch(i){const n=i instanceof Error?i.message:e("skills.loadFileError","Failed to load file");h(n)}finally{z(!1)}},[r]),rl=a.useCallback(()=>{w(null),v(null),h(null),z(!1)},[]),X=a.useCallback(()=>{N(null),S(null),C(null),w(null),v(null),h(null)},[]),dl=a.useMemo(()=>k.find(s=>s.id===c)??null,[k,c]),Z=()=>!b||b.files.length===0?null:l.jsxs("div",{className:"skills-view-detail-files","data-testid":"skill-files",children:[l.jsxs("span",{className:"skills-view-detail-files-label",children:[e("skills.filesLabel","Files"),":"]}),b.files.map(s=>{if(s.type==="directory")return l.jsxs("span",{className:"badge badge--sm skills-view-detail-file--dir",children:[s.name,"/"]},s.relativePath);const t=y===s.relativePath;return l.jsx("button",{type:"button","data-testid":"skill-file-item",className:`badge badge--sm skills-view-detail-file${t?" skills-view-detail-file--active":""}`,onClick:()=>c&&void W(c,s.relativePath),"aria-pressed":t,"aria-label":e("skills.viewFile","View {{name}}",{name:s.name}),children:s.name},s.relativePath)})]}),kl=()=>c?el?l.jsxs("div",{className:"skills-view-detail-loading",children:[l.jsx(A,{size:16,className:"spin"}),e("skills.loadingContent","Loading skill content...")]}):Q?l.jsxs("div",{className:"skills-view-detail-error",children:[l.jsx(G,{size:14}),l.jsx("span",{children:Q}),l.jsx("button",{className:"btn btn-sm",onClick:()=>ol(c),children:e("common.retry","Retry")})]}):b?y!==null?l.jsxs("div",{className:"skills-view-file-viewer","data-testid":"skill-file-viewer",children:[l.jsxs("div",{className:"skills-view-file-viewer-bar",children:[l.jsxs("button",{type:"button",className:"btn btn-sm skills-view-file-back",onClick:rl,"data-testid":"skill-file-back","aria-label":e("skills.backToSkillMd","Back to SKILL.md"),children:[l.jsx(H,{size:14}),e("skills.backToSkillMd","Back to SKILL.md")]}),l.jsx("span",{className:"skills-view-file-viewer-name",children:y})]}),il?l.jsxs("div",{className:"skills-view-detail-loading",children:[l.jsx(A,{size:16,className:"spin"}),e("skills.loadingFile","Loading file...")]}):$?l.jsxs("div",{className:"skills-view-detail-error",children:[l.jsx(G,{size:14}),l.jsx("span",{children:$}),l.jsx("button",{className:"btn btn-sm",onClick:()=>c&&void W(c,y),children:e("common.retry","Retry")})]}):u&&!u.isText?l.jsx("div",{className:"skills-view-detail-empty",children:e("skills.fileNotPreviewable","This file cannot be previewed.")}):u?Cl(u.relativePath)?l.jsx(J,{content:u.content||e("skills.emptyFile","(Empty file)"),className:"skills-view-detail-markdown",testId:"skills-view-detail-markdown"}):l.jsx("pre",{className:"skills-view-detail-content",children:u.content||e("skills.emptyFile","(Empty file)")}):null,Z()]}):l.jsxs(l.Fragment,{children:[l.jsx(J,{content:b.skillMd||e("skills.noSkillMd","(No SKILL.md found)"),className:"skills-view-detail-markdown",testId:"skills-view-detail-markdown"}),Z()]}):null:l.jsx("div",{className:"skills-view-detail-placeholder","data-testid":"skills-detail-empty",children:e("skills.selectASkill","Select a skill to view its details")});return l.jsxs("div",{className:"skills-view","data-testid":"skills-view","data-selected":c?"true":"false",children:[l.jsx(wl,{icon:xl,title:e("skills.title","Skills"),actions:l.jsxs(l.Fragment,{children:[l.jsxs("span",{className:"skills-view-count","aria-label":e("skills.discoveredCount","{{count}} discovered skills",{count:k.length}),children:[k.length," ",e("skills.discovered","discovered")]}),l.jsx("button",{className:"btn-icon skills-view-close touch-target",onClick:j,"aria-label":e("skills.closeView","Close skills view"),children:l.jsx(q,{size:16})}),l.jsxs("button",{className:"btn btn-sm",onClick:()=>void x(),disabled:F,children:[l.jsx(fl,{size:14,className:F?"spin":""}),e("common.refresh","Refresh")]})]})}),l.jsxs("div",{className:"skills-view-body",children:[l.jsx("div",{className:"skills-view__list","data-testid":"skills-list",children:l.jsxs("div",{className:"skills-view-content",children:[l.jsx("div",{className:"skills-view-search",children:l.jsx("input",{type:"text",className:"form-input",placeholder:e("skills.searchPlaceholder","Search skills..."),value:g,onChange:s=>tl(s.target.value),"aria-label":e("skills.searchLabel","Search skills")})}),l.jsxs("section",{className:"skills-view-section","aria-labelledby":"discovered-skills-title",children:[l.jsx("h3",{id:"discovered-skills-title",className:"skills-view-section-title",children:e("skills.discoveredSection","Discovered Skills")}),F?l.jsxs("div",{className:"skills-view-loading",children:[l.jsx("span",{className:"spinner"}),e("skills.loadingDiscovered","Loading discovered skills...")]}):k.length===0?l.jsx("div",{className:"skills-view-empty",children:l.jsx("p",{children:e("skills.noDiscovered","No skills discovered in this project.")})}):O.length===0?l.jsx("div",{className:"skills-view-empty",children:l.jsx("p",{children:e("skills.noMatchingDiscovered","No discovered skills match your search.")})}):l.jsx("div",{className:"skills-view-list",children:O.map(s=>{const t=c===s.id;return l.jsx("div",{children:l.jsxs("div",{className:`skills-view-item${t?" skills-view-item--selected":""}`,onClick:i=>U(s.id,i),role:"button",tabIndex:0,onKeyDown:i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),U(s.id))},"aria-expanded":t,"aria-label":e("skills.viewDetails","View details for {{name}}",{name:s.name}),children:[l.jsxs("div",{className:"skills-view-item-info",children:[l.jsxs("span",{className:"skills-view-item-name",children:[t?l.jsx(jl,{size:14}):l.jsx(pl,{size:14}),s.name]}),l.jsx("span",{className:"skills-view-item-path",children:s.relativePath}),l.jsx("span",{className:"skills-view-item-source",children:s.metadata.source})]}),l.jsxs("label",{className:"skills-view-item-toggle",onClick:i=>i.stopPropagation(),children:[l.jsx("input",{type:"checkbox",checked:s.enabled,disabled:s.toggling,onChange:()=>void nl(s.id,s.enabled),"aria-label":e(`skills.${s.enabled?"disable":"enable"}Skill`,s.enabled?"Disable {{name}}":"Enable {{name}}",{name:s.name})}),l.jsx("span",{className:"skills-view-toggle-slider"})]})]})},s.id)})})]}),l.jsxs("section",{className:"skills-view-section","aria-labelledby":"catalog-title",children:[l.jsx("h3",{id:"catalog-title",className:"skills-view-section-title",children:e("skills.catalogSection","Skills Catalog")}),I?l.jsxs("div",{className:"skills-view-error",children:[l.jsx("p",{children:I}),l.jsx("button",{className:"btn btn-sm",onClick:()=>void f(P),children:e("common.tryAgain","Try Again")})]}):Y?l.jsxs("div",{className:"skills-view-loading",children:[l.jsx("span",{className:"spinner"}),e("skills.loadingCatalog","Loading catalog...")]}):_.length===0?l.jsx("div",{className:"skills-view-empty",children:g?l.jsx("p",{children:e("skills.noMatchingSearch","No skills match your search.")}):l.jsx("p",{children:e("skills.noCatalogAvailable","No skills available in the catalog.")})}):l.jsx("div",{className:"skills-view-grid",children:_.map(s=>{const i=!!s.repo?.trim(),n=M===s.id;return l.jsxs("div",{className:"skills-view-card",children:[l.jsxs("div",{className:"skills-view-card-header",children:[l.jsx("h4",{className:"skills-view-card-title",children:s.name}),i?l.jsxs("button",{type:"button",className:"btn btn-sm skills-view-card-install",onClick:()=>void cl(s),disabled:n,"aria-label":e("skills.installSkill","Install {{name}}",{name:s.name}),children:[n?l.jsx(A,{size:14,className:"spin"}):null,n?e("skills.installing","Installing…"):e("skills.install","Install")]}):null]}),s.description&&l.jsx("p",{className:"skills-view-card-description",children:s.description}),s.tags&&s.tags.length>0&&l.jsx("div",{className:"skills-view-card-tags",children:s.tags.map(o=>l.jsx("span",{className:"badge badge--sm",children:o},o))}),s.installs!==void 0&&l.jsx("span",{className:"skills-view-card-installs",children:e("skills.installsCount","{{value}} installs",{value:s.installs.toLocaleString()})})]},s.id)})})]})]})}),l.jsxs("div",{className:"skills-view__detail","data-testid":"skill-detail",children:[l.jsxs("div",{className:"skills-view-detail-header",children:[l.jsx("button",{type:"button",className:"btn btn-sm btn-icon skills-view-detail-back",onClick:X,"aria-label":e("skills.backToList","Back to skills"),title:e("skills.backToList","Back to skills"),"data-testid":"skills-detail-back",children:l.jsx(H,{size:14})}),l.jsx("span",{className:"skills-view-detail-title",children:dl?.name??e("skills.detailTitle","Skill")}),l.jsxs("button",{className:"btn btn-sm skills-view-detail-close",onClick:X,disabled:!c,"aria-label":e("skills.closeDetail","Close skill detail"),children:[l.jsx(q,{size:14}),e("common.close","Close")]})]}),l.jsx("div",{className:"skills-view-detail-body",children:kl()})]})]})]})}export{zl as SkillsView};
@@ -1,4 +1,4 @@
1
- import{r as l,j as e}from"./vendor-react-SZ_qB27O.js";import{c as Rt,ay as ft,az as ht,aA as Ot,bg as _t,bh as Pt,bi as Ut,bj as Kt,bk as Bt,bl as Vt,bm as Xt,bn as zt,aD as Gt,ae as Wt,bo as qt,bp as Z,bq as xt,L as Ht,P as gt,G as tt,X as et,br as vt,I as Lt,J as yt,bs as Jt,ad as Yt,o as Qt,bt as Zt,bu as jt,al as te}from"./index-CUY6xXXv.js";import{u as kt}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-reactflow-Bg-Qjzh8.js";import"./vendor-xterm-BNq00GSj.js";import"./vendor-codemirror-jBKmHyH0.js";/**
1
+ import{r as l,j as e}from"./vendor-react-SZ_qB27O.js";import{c as Rt,ay as ft,az as ht,aA as Ot,bg as _t,bh as Pt,bi as Ut,bj as Kt,bk as Bt,bl as Vt,bm as Xt,bn as zt,aD as Gt,ae as Wt,bo as qt,bp as Z,bq as xt,L as Ht,P as gt,G as tt,X as et,br as vt,I as Lt,J as yt,bs as Jt,ad as Yt,o as Qt,bt as Zt,bu as jt,al as te}from"./index-CHy0WNjH.js";import{u as kt}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-reactflow-Bg-Qjzh8.js";import"./vendor-xterm-BNq00GSj.js";import"./vendor-codemirror-jBKmHyH0.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{r as a,j as e,b as Da}from"./vendor-react-SZ_qB27O.js";import{R as Ta,u as La,d as za,e as Wa,f as $a,B as _a,C as Ba,M as Ga}from"./vendor-reactflow-Bg-Qjzh8.js";import{c as qa,ed as ao,ee as we,ef as qs,eg as Va,eh as Ha,ei as Ua,ej as Vs,bp as ne,bo as yt,P as Ee,b7 as Te,bu as Ka,ad as Ya,o as Se,J as Ne,am as Hs,ek as Ja,bL as Ct,el as ts,bF as Us,em as no,al as Xa,C as Re,bP as lo,I as Qa,en as Za,eo as en,cq as os,ep as tn,eq as on,er as sn,ce as an,es as nn,dy as ln,a3 as ss,ae as rn,et as dn,eu as cn,ev as un,ew as fn,ex as pn,ey as mn,ez as wn,eA as hn,eB as gn,eC as as,eD as ns,eE as ls,eF as is,eG as rs,eH as bn,eI as kn,eJ as xn,eK as vn,eL as jn,eM as Nn,eN as yn,eO as Cn,eP as Sn,eQ as ds,eR as En,eS as cs,eT as us,eU as An,eV as fs,eW as ps,eX as Fn,eY as Qt,eZ as Pn,e_ as Ks,e$ as Rn,f0 as ms,f1 as Mn,i as ws,dj as Ys,dg as hs,f2 as gs,X as io,bs,L as Me,f3 as Zt,br as Js,bb as In,f4 as Xs,a1 as On,ak as Dn,ba as Tn,f5 as Ln,f6 as zn,f7 as Wn,f8 as ks,f9 as $n,fa as _n,fb as Bn,fc as Gn,fd as Nt,S as He,fe as qn,ff as Vn,fg as Hn,dh as xs,fh as vs,fi as Un,fj as Kn}from"./index-CUY6xXXv.js";import{u as ye}from"./vendor-i18n-GF3RlKbq.js";import{U as Yn}from"./upload--9MWYfcA.js";import"./vendor-xterm-BNq00GSj.js";import"./vendor-codemirror-jBKmHyH0.js";/**
1
+ import{r as a,j as e,b as Da}from"./vendor-react-SZ_qB27O.js";import{R as Ta,u as La,d as za,e as Wa,f as $a,B as _a,C as Ba,M as Ga}from"./vendor-reactflow-Bg-Qjzh8.js";import{c as qa,ed as ao,ee as we,ef as qs,eg as Va,eh as Ha,ei as Ua,ej as Vs,bp as ne,bo as yt,P as Ee,b7 as Te,bu as Ka,ad as Ya,o as Se,J as Ne,am as Hs,ek as Ja,bL as Ct,el as ts,bF as Us,em as no,al as Xa,C as Re,bP as lo,I as Qa,en as Za,eo as en,cq as os,ep as tn,eq as on,er as sn,ce as an,es as nn,dy as ln,a3 as ss,ae as rn,et as dn,eu as cn,ev as un,ew as fn,ex as pn,ey as mn,ez as wn,eA as hn,eB as gn,eC as as,eD as ns,eE as ls,eF as is,eG as rs,eH as bn,eI as kn,eJ as xn,eK as vn,eL as jn,eM as Nn,eN as yn,eO as Cn,eP as Sn,eQ as ds,eR as En,eS as cs,eT as us,eU as An,eV as fs,eW as ps,eX as Fn,eY as Qt,eZ as Pn,e_ as Ks,e$ as Rn,f0 as ms,f1 as Mn,i as ws,dj as Ys,dg as hs,f2 as gs,X as io,bs,L as Me,f3 as Zt,br as Js,bb as In,f4 as Xs,a1 as On,ak as Dn,ba as Tn,f5 as Ln,f6 as zn,f7 as Wn,f8 as ks,f9 as $n,fa as _n,fb as Bn,fc as Gn,fd as Nt,S as He,fe as qn,ff as Vn,fg as Hn,dh as xs,fh as vs,fi as Un,fj as Kn}from"./index-CHy0WNjH.js";import{u as ye}from"./vendor-i18n-GF3RlKbq.js";import{U as Yn}from"./upload-DuwyPTKe.js";import"./vendor-xterm-BNq00GSj.js";import"./vendor-codemirror-jBKmHyH0.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{r as d,j as s}from"./vendor-react-SZ_qB27O.js";import{i as j,al as v}from"./index-CUY6xXXv.js";import{u as N}from"./vendor-i18n-GF3RlKbq.js";function $({value:e,onChange:i,projectId:t,disabled:r=!1,id:n,label:o="Skills"}){const{t:a}=N("app"),[m,k]=d.useState([]),[f,u]=d.useState(!0);d.useEffect(()=>{let l=!1;return u(!0),j(t).then(c=>{l||k(c)}).catch(()=>{l||k([])}).finally(()=>{l||u(!1)}),()=>{l=!0}},[t]);const S=l=>{e.includes(l)||i([...e,l])},x=l=>{i(e.filter(c=>c!==l))},h=l=>m.find(g=>g.id===l)?.name??l,p=m.filter(l=>!e.includes(l.id));return s.jsxs("div",{className:"skill-multiselect","data-testid":"skill-multiselect",children:[o&&s.jsx("label",{htmlFor:n?`${n}-select`:void 0,className:"skill-multiselect-label",children:o}),e.length>0&&s.jsx("div",{className:"skill-multiselect-chips","data-testid":"skill-chips",children:e.map(l=>s.jsxs("span",{className:"skill-chip","data-testid":`skill-chip-${l}`,children:[s.jsx("span",{className:"skill-chip-name",children:h(l)}),s.jsx("button",{type:"button",className:"skill-chip-remove",onClick:()=>x(l),disabled:r,"aria-label":a("skills.removeSkill","Remove {{name}}",{name:h(l)}),"data-testid":`remove-skill-${l}`,children:"×"})]},l))}),s.jsx("div",{className:"skill-multiselect-add",children:f?s.jsx("span",{className:"skill-multiselect-loading","data-testid":"skills-loading",children:s.jsx(v,{label:a("skills.loading","Loading skills…")})}):p.length===0?s.jsx("span",{className:"skill-multiselect-empty","data-testid":"skills-empty",children:e.length===0?a("skills.noSkillsDiscovered","No skills discovered"):a("skills.allSkillsSelected","All skills selected")}):s.jsxs("select",{id:n?`${n}-select`:void 0,className:"select skill-multiselect-dropdown",value:"",onChange:l=>{l.target.value&&(S(l.target.value),l.target.value="")},disabled:r,"data-testid":"skill-dropdown",children:[s.jsx("option",{value:"",children:a("skills.addSkill","Add a skill…")}),p.map(l=>s.jsx("option",{value:l.id,children:l.name},l.id))]})})]})}const L=/(?:^|\/)skills\/([^/]+)\/SKILL\.md$/i;function y(e){const i=e.trim();if(!i)return e;const t=i.match(L);return t?.[1]?t[1]:i}export{$ as S,y as f};
1
+ import{r as d,j as s}from"./vendor-react-SZ_qB27O.js";import{i as j,al as v}from"./index-CHy0WNjH.js";import{u as N}from"./vendor-i18n-GF3RlKbq.js";function $({value:e,onChange:i,projectId:t,disabled:r=!1,id:n,label:o="Skills"}){const{t:a}=N("app"),[m,k]=d.useState([]),[f,u]=d.useState(!0);d.useEffect(()=>{let l=!1;return u(!0),j(t).then(c=>{l||k(c)}).catch(()=>{l||k([])}).finally(()=>{l||u(!1)}),()=>{l=!0}},[t]);const S=l=>{e.includes(l)||i([...e,l])},x=l=>{i(e.filter(c=>c!==l))},h=l=>m.find(g=>g.id===l)?.name??l,p=m.filter(l=>!e.includes(l.id));return s.jsxs("div",{className:"skill-multiselect","data-testid":"skill-multiselect",children:[o&&s.jsx("label",{htmlFor:n?`${n}-select`:void 0,className:"skill-multiselect-label",children:o}),e.length>0&&s.jsx("div",{className:"skill-multiselect-chips","data-testid":"skill-chips",children:e.map(l=>s.jsxs("span",{className:"skill-chip","data-testid":`skill-chip-${l}`,children:[s.jsx("span",{className:"skill-chip-name",children:h(l)}),s.jsx("button",{type:"button",className:"skill-chip-remove",onClick:()=>x(l),disabled:r,"aria-label":a("skills.removeSkill","Remove {{name}}",{name:h(l)}),"data-testid":`remove-skill-${l}`,children:"×"})]},l))}),s.jsx("div",{className:"skill-multiselect-add",children:f?s.jsx("span",{className:"skill-multiselect-loading","data-testid":"skills-loading",children:s.jsx(v,{label:a("skills.loading","Loading skills…")})}):p.length===0?s.jsx("span",{className:"skill-multiselect-empty","data-testid":"skills-empty",children:e.length===0?a("skills.noSkillsDiscovered","No skills discovered"):a("skills.allSkillsSelected","All skills selected")}):s.jsxs("select",{id:n?`${n}-select`:void 0,className:"select skill-multiselect-dropdown",value:"",onChange:l=>{l.target.value&&(S(l.target.value),l.target.value="")},disabled:r,"data-testid":"skill-dropdown",children:[s.jsx("option",{value:"",children:a("skills.addSkill","Add a skill…")}),p.map(l=>s.jsx("option",{value:l.id,children:l.name},l.id))]})})]})}const L=/(?:^|\/)skills\/([^/]+)\/SKILL\.md$/i;function y(e){const i=e.trim();if(!i)return e;const t=i.match(L);return t?.[1]?t[1]:i}export{$ as S,y as f};
@@ -10,4 +10,4 @@ Delete anyway by removing these dependency references first?`,deps:"Deps",depsCo
10
10
 
11
11
  Delete anyway by unlinking these references first?`,linkedIssueChipAriaLabel:"Linked GitHub issue #{{number}}",linkedIssueChipTitle:"Linked GitHub issue: {{owner}}/{{repo}}#{{number}}",linkedIssueMessage:`Choose what to do with {{issueLabel}} when deleting {{taskId}}.
12
12
 
13
- Close the issue?`,linkedIssueTitle:"Linked GitHub Issue",loadAgentsFailed:"Failed to load agents: {{msg}}",loadAgentsFailedGeneric:"Failed to load agents",loadDependencyFailed:"Failed to load dependency {{depId}}",loadingAgents:"Loading agents...",loadModelsFailed:"Failed to load models",missionBadgeTitle:"Mission: {{name}}",modelExecutor:"Executor",modelPlan:"Plan",modelReviewer:"Reviewer",models:"Models",modelsCount_one:"{{count}} model",modelsCount_other:"{{count}} models",moreOptions:"More Options",move:"Move",moved:"Moved {{taskId}} to {{column}}",moveFailed:"Failed to move {{taskId}}: {{error}}",moveTask:"Move task",nearDuplicateTitle:"Potential near-duplicate of {{id}}",needsInput:"Needs input",noAgentsAvailable:"No agents available",node:"Node",noExistingTasks:"No existing tasks",openRetryBreakdown:"Open retry breakdown",paused:"paused",pausedByAgent:"paused by agent",plan:"Plan",planButtonTitle:"Open planning mode with current description",planModel:"Plan Model",prBadgeTitle:"PR #{{number}}: {{title}}",preserveProgressMessage:"This task has completed steps. Keep progress before moving?",preserveProgressTitle:"Preserve Progress?",prNodeFailed:"PR failed",prNodeFailedTitle:"PR creation failed — open the PR view",prNodeState:"PR · {{state}}",prNodeTitle:"PR {{state}} — open the PR view",prNodeWithNumber:"PR #{{number}} · {{state}}",projectDefaultLocal:"Project default / local",promote:"Promote",promoteTask:"Promote task",promoting:"Promoting…",queued:"Queued",quickEntryHint:"Enter to create · Esc to cancel",refine:"Refine",refineAddDetails:"Add details",refineAddDetailsDesc:"Add implementation details and context",refineButtonTitle:"Refine description with AI",refineClarify:"Clarify",refineClarifyDesc:"Make the description clearer and more specific",refineExpand:"Expand",refineExpandDesc:"Expand into a more comprehensive description",refineSimplify:"Simplify",refineSimplifyDesc:"Simplify and make more concise",refining:"Refining...",removeImage:"Remove image",resetProgress:"Reset Progress",resetProgressMessage:"Reset all step progress before moving this task?",resetProgressTitle:"Reset Progress?",retriesAriaLabel_one:"{{count}} retries",retriesAriaLabel_other:"{{count}} retries",retry:"Retry",retryFailed:"Failed to retry {{taskId}}: {{error}}",retrying:"Retrying…",reviewerModel:"Reviewer Model",save:"Save",saving:"Saving...",searchTasksPlaceholder:"Search tasks…",selectAgent:"Select agent",selectExecutionNode:"Select execution node",selectPriority:"Select priority",sendBack:"Send back",sharedBranch:"Shared",showSteps:"Show steps",stalled:"Stalled",statusMergingFix:"Merging fixes…",stepCount_one:"{{count}} step",stepCount_other:"{{count}} steps",stuck:"Stuck",subtask:"Subtask",subtaskButtonTitle:"Break down into AI-generated subtasks",toggleFastMode:"Toggle fast execution mode",unarchive:"Unarchive",unarchived:"Unarchived {{taskId}}",unarchiveFailed:"Failed to unarchive {{taskId}}: {{error}}",unarchiveTask:"Unarchive task",updated:"Updated {{taskId}}",updateFailed:"Failed to update {{taskId}}: {{error}}",uploadFailed:"Failed to upload: {{files}}",usingDefault:"Using default",viewDependency:"Click to view {{depId}}",workflow:"workflow",workflowCheck:"Workflow check"},yt={arrowKeysLabel:"Terminal arrow keys",clear:"Clear",clearTerminal:"Clear terminal",closeTab:"Close tab",closeTerminal:"Close terminal",createScriptTabError:"Failed to create terminal tab for script: {{message}}",cursorBar:"Bar",cursorBlock:"Block",cursorUnderline:"Underline",decreaseFontSize:"Decrease terminal font size",exitLabel:"Exit: {{code}}",failedToStartTerminal:"Failed to start terminal: {{error}}",helpText:"Ctrl++/- zoom • ⌨ Shortcuts panel • Esc close",increaseFontSize:"Increase terminal font size",initializeError:"Terminal UI failed to initialize: {{error}}",newSession:"New Session",newTerminal:"New terminal",preferenceCursorBlink:"Blink cursor",preferenceCursorStyle:"Cursor style",preferenceFontFamily:"Font family",preferenceFontSize:"Font size",preferenceRenderer:"Renderer",preferences:"Preferences",reconnect:"Reconnect",refreshPage:"Refresh page",reinitialize:"Reinitialize",rendererAuto:"Auto (WebGL on desktop)",rendererCanvas:"Canvas/DOM",rendererReopenNote:"Reopen the terminal to apply renderer changes.",resetPreferences:"Reset to defaults",shortcuts:"Shortcuts",startingTerminal:"Starting terminal...",statusConnected:"Connected",statusConnecting:"Connecting...",statusDisconnected:"Disconnected",statusReconnecting:"Reconnecting..."},wt={colorTheme:"Color Theme",colorThemeLabel:"Color theme",currentTheme:"Current theme",fontSize:"Font Size",fontSizeLabel:"Dashboard font size",modeLabel:"Theme mode",resetButton:"Reset to defaults",resetLabel:"Reset to default theme"},At={addItemPlaceholder:"Add a todo item",addList:"Add list",assignAgent:"Assign {{text}} to agent",cancelItemEdit:"Cancel item edit",cancelList:"Cancel list",cancelListRename:"Cancel list rename",createList:"Create List",createTaskFrom:"Create task from {{text}}",deleteItem:"Delete {{text}}",deleteList:"Delete {{title}}",deleteListConfirm:"Delete this list and all its items?",deleteListTitle:"Delete List",editItem:"Edit {{text}}",failedCreateItem:"Failed to create item",failedCreateItemToast:"Failed to create todo item",failedCreateList:"Failed to create list",failedCreateListToast:"Failed to create todo list",failedDeleteItem:"Failed to delete item",failedDeleteItemToast:"Failed to delete todo item",failedDeleteList:"Failed to delete list",failedDeleteListToast:"Failed to delete todo list",failedLoadLists:"Failed to load todo lists",failedRenameList:"Failed to rename list",failedRenameListToast:"Failed to rename todo list",failedReorderItems:"Failed to reorder items",failedReorderItemsToast:"Failed to reorder todo items",failedToCreateAndAssign:"Failed to create and assign task: {{error}}",failedToCreateTask:"Failed to create task: {{error}}",failedToLoadAgents:"Failed to load agents: {{error}}",failedUpdateItem:"Failed to update item",failedUpdateItemToast:"Failed to update todo item",itemsLabel:"Todo items",lists:"Lists",listsLabel:"Todo lists sidebar",loading:"Loading todos...",loadingAgents:"Loading agents...",manageDescription:"Manage reusable todo lists for your project.",moveItemDown:"Move {{text}} down",moveItemUp:"Move {{text}} up",newListTitle:"New list title",noAgentsAvailable:"No agents available",noItemsEmpty:"No items in this list. Add one above.",noListsEmpty:"No todo lists yet. Create one to get started.",renameList:"Rename {{title}}",saveItemEdit:"Save item edit",saveList:"Save list",saveListRename:"Save list rename",selectList:"Select list {{title}}",selectListEmpty:"Select a list from the sidebar",startPlanning:"Start planning from {{text}}",taskCreatedAndAssigned:"Created {{id}} and assigned to {{agent}}",taskCreatedFromTodo:"Created {{id}} from todo",todoListsLabel:"Todo lists",todos:"Todos"},St={customOption:"Custom…",loadingHint:"Loading detected GitHub remotes…"},Ct={dismissLabel:"Dismiss update notice",learnMore:"Learn more",message:"Update available: v{{latestVersion}} (current: v{{currentVersion}}). Run fn update for an installed CLI, or pull this source checkout.",releaseNotes:"Release notes",updateFailed:"Update failed",updateFailedWithMessage:"Update failed: {{message}}",updateNow:"Update now",updateSuccess:"Updated to v{{version}} — restart Fusion to apply",updating:"Updating…"},Tt={configureAuthHint:"Configure authentication in Settings to see usage data.",failedToLoad:"Failed to load usage data",hideWindow:"Hide {{label}}",lastUpdated:"Last updated: {{time}}",moveProviderDown:"Move {{provider}} down",moveProviderUp:"Move {{provider}} up",noDataAvailable:"No usage data available",noProvidersConfigured:"No AI providers configured",percentLeft:"{{percent}}% left",percentRemaining:"{{percent}}% remaining",percentUsed:"{{percent}}% used",reorderProvider:"Reorder {{provider}}",resetsInDays:"resets in {{days}}d",resetsInDaysHours:"resets in {{days}}d {{hours}}h",resetsInHours:"resets in {{hours}}h",resetsInMinutes:"resets in {{mins}}m",showHidden_one:"Show hidden ({{count}})",showHidden_other:"Show hidden ({{count}})",statusError:"Error",statusNotConfigured:"Not configured",title:"Usage",viewModeLabel:"Usage view mode",viewModeRemaining:"Remaining",viewModeUsed:"Used"},Pt={advisoryExplanation:"Advisory workflow steps flagged non-blocking improvements:",aggregateResult:"Aggregate result",configuredSteps:"Configured Workflow Steps",done:"Done",doneEditingAriaLabel:"Done editing workflow steps",edit:"Edit",editAriaLabel:"Edit workflow steps",editWorkflow:"Edit workflow",executionOrder:"Execution order:",executionPhase:"Execution phase",expandOutput:"Expand output",graph:"Workflow graph",graphUnavailable:"Workflow graph unavailable",hideOutput:"Hide output",loadingGraph:"Loading workflow graph…",loadingResults:"Loading workflow results…",markdown:"Markdown",modelSettings:"Model settings",moveDown:"Move down",moveUp:"Move up",needsReview:"Needs follow-up review.",noStepsConfigured:"No workflow steps configured for this task.",notes:"Notes:",noWorkflowAssigned:"No workflow assigned",output:"Output:",overview:"Workflow overview",plain:"Plain",polishNotes:"Polish notes",remove:"Remove",selectStepsDescription:"Select steps to run after task implementation completes",showOutput:"Show output",started:"Started:",stepCount_one:"{{count}} step",stepCount_other:"{{count}} steps",stepDefinitionNotFound:"Step definition not found.",stepProgress:"Step count",stepProgressValue:"{{completed}} of {{total}} steps completed",steps:"Workflow Steps",stepsExplanation:"Pre-merge steps run after implementation, before merge. Post-merge steps run after merge succeeds.",summaryAdvisory_one:"{{count}} advisory",summaryAdvisory_other:"{{count}} advisory",summaryFailed_one:"{{count}} failed",summaryFailed_other:"{{count}} failed",summaryPassed_one:"{{count}} passed",summaryPassed_other:"{{count}} passed",summaryRunning_one:"{{count}} running",summaryRunning_other:"{{count}} running",summarySeparator:" · ",summarySkipped_one:"{{count}} skipped",summarySkipped_other:"{{count}} skipped",summaryStepCount_one:"{{count}} step",summaryStepCount_other:"{{count}} steps",switchToMarkdown:"Switch to markdown",switchToPlain:"Switch to plain text",thinkingLevel:"Thinking level",workflowName:"Workflow",aggregateAdvisory:"Advisory",aggregateAllPassed:"All passed",aggregateInProgress:"In progress",aggregateNoResults:"No results",approveAndRun:"Approve & run",approveCommandError:"Failed to approve command",approving:"Approving…",awaitingInputTitle:"Waiting for your input",cliApprovalRejectHint:"To reject, keep the task paused and do not approve.",cliApprovalTitle:"Approve CLI command?",cliApprovalWarning:"This command will run in the task worktree. Approving trusts this exact command for future runs.",customWorkflowFallback:"Custom workflow",customWorkflowLabel:"Custom workflow",defaultWorkflow:"Default",executionAwaitingCliApproval:"Awaiting CLI approval",executionAwaitingInput:"Awaiting input",executionCompleted:"Completed",executionNotStarted:"Not started",executionPaused:"Paused",executionPostMerge:"Post-merge steps running",executionPreMerge:"Pre-merge steps running",inputPlaceholder:"Type your reply…",modelDefault:"Default",postMerge:"Post-merge",preMerge:"Pre-merge",replyInComments:"Reply in the comments and unpause the task to continue.",resumeTaskError:"Failed to resume task",resuming:"Resuming…",statusAdvisory:"Advisory failure",statusFailed:"Failed",statusPassed:"Passed",statusRunning:"Running…",statusSkipped:"Skipped",submitAndResume:"Submit & resume",submitting:"Submitting…",waitingForOutput:"Waiting for agent output…"},Rt={add:"Add column",agent:"Column agent",agentBadgeDefer:"Column agent (defer)",agentBadgeOverride:"Column agent (override)",agentFlagHint:"Workflow columns are available by default",agentLabel:"Column agent",agentMode:"Agent mode",agentModeDefer:"Defer",agentModeDeferHint:"Column agent applies only when the work carries no agent/model settings of its own",agentModeOverride:"Override",agentModeOverrideHint:"Column agent supersedes node- and task-level agent/model settings",agentNone:"(none)",agentNotFound:"Agent not found — {{id}}",agentsLoadFailed:"Failed to load agents",compositionBlocked:"Resolve trait conflicts on highlighted columns before saving",confirmPolicyEscalation:"Bind it anyway? The column agent will run with broader permissions than this project's default.",empty:"No columns yet. Add a column to place nodes into board lanes.",escalationDeclined:"Save cancelled — column agent binding not confirmed",moveDown:"Move column down",moveUp:"Move column up",nameLabel:"Column name",newColumnName:"New column",nodeUnplaced:"Not placed in a column",overriddenByColumnAgent:"Overridden by column agent {{name}} — this node's executor settings are superseded.",readOnlyHint:"Built-in workflows are read-only — duplicate to edit",remove:"Remove column",title:"Columns",traits:"Traits",traitsLoadFailed:"Failed to load traits",unplacedCount_one:"{{count}} nodes not placed in a column",unplacedCount_other:"{{count}} nodes not placed in a column"},Ft={cliAgent:{adapterLabel:"CLI adapter",adapterNote:"Drives a CLI coding agent in an engine-owned terminal for this step.",adapterPlaceholder:"— select adapter —",autonomyLabel:"Elevated autonomy (bypass approvals)",autonomyNote:"Elevated autonomy requires a per-project approval before the agent can launch. Until approved, launches with elevated posture fail.",executorOption:"CLI agent",notify:{banner:"In-app banner",bannerNotify:"Banner + push notification"},notifyLabel:"Waiting-on-input notification",notifyNote:"How you are alerted when the agent pauses waiting for input on this step."},collapsePrompt:"Collapse prompt editor",editingPrompt:"Editing Prompt",expandPrompt:"Expand prompt editor",agent:"Agent",agentsLoadFailed:"Failed to load agents",autoApproveRequests:"Auto-approve requests",autoApproveRequestsNote:"Runs without pausing for approval — e.g. a CLI command executes on its first run without waiting for your sign-off.",cliCommandNote:"Runs an arbitrary command in the task worktree. The first time this exact command runs, the task pauses for your approval. The node prompt is passed via FUSION_NODE_PROMPT.",cliMode:"CLI mode",cliScript:"CLI / script",command:"Command",executor:"Executor",maxRetries:"Max retries",model:"Model",modelsLoadFailed:"Failed to load models",namedScript:"Named script",namedScriptNote:"Named script from project settings. The node prompt is passed via FUSION_NODE_PROMPT.",prompt:"Prompt",scriptName:"Script name",selectAgent:"— select agent —",selectSkill:"— select skill —",skill:"Skill",skillsLoadFailed:"Failed to load skills",skipFirstRunApproval:"Skip first-run approval (runs without pausing)",waitForUserInput:"Wait for user input",waitForUserInputNote:"This node pauses the task until you reply in the task's comments and unpause. The Prompt field above is shown to the user as the question.",promptOverrideSaved:"Prompt override saved",promptOverrideSaveFailed:"Failed to save prompt override",promptOverrideReset:"Prompt reset to default",promptOverrideResetFailed:"Failed to reset prompt",promptOverridesLoadFailed:"Failed to load prompt overrides",promptOverridden:"Overridden",promptSaving:"Saving…",resetPromptDefault:"Reset to default"},Lt={add:"Add field",addOption:"Add option",badge:"Render as badge",default:"Default",defaultLabel:"Default value",defaultTrue:"Default on",duplicateId:"A field with that id already exists",editId:"Edit id",empty:"No custom fields yet. Add a field to extend the task form and cards.",idLabel:"Field id",idWarn:"Changing the id discards values stored under the old id (remove + add).",nameLabel:"Field name",newFieldName:"New field",newOptionLabel:"Option 1",noDefault:"— none —",optionColor:"Option color",optionLabel:"Option label",optionN:"Option {{n}}",options:"Options",optionValue:"Option value",placement:"Placement",placementCard:"Card badge",placementDetail:"Detail (inline)",placementSection:"Detail section",readOnlyHint:"Built-in workflows are read-only — duplicate to edit",remove:"Remove field",removeOption:"Remove option",required:"Required",title:"Fields",typeLabel:"Type",widget:"Widget",widgetDefault:"Default"},Dt={advisory:"Advisory",autoLayout:"Auto-layout",codeNote:"Runs sandboxed TypeScript. Syntax is validated at save.",codeSource:"Source (TypeScript)",codeTimeout:"Timeout (ms)",collapseInspector:"Collapse",cycleBlocked:"That connection would create a cycle — only rework edges inside a for-each template may loop back",deleteEdge:"Delete edge",deleteNode:"Delete node",duplicateBlocked:"That connection already exists",edgeCondition:"Condition",edgeConditionLabel:"Condition: {{condition}}",edgeInspector:"Edge",edgeNoVerdict:"— success (no verdict) —",edgeRework:"Rework edge (loop back, bounded)",edgeReworkNote:"Rework edges are the only legal cycles — they loop back within the for-each step instance, bounded by Max rework cycles.",edgeVerdict:"Review verdict",failureCollect:"Collect (wait for all)",failureFailFast:"Fail-fast (cancel siblings)",failurePolicy:"On branch failure",foreachConcurrency:"Concurrency",foreachEmptyHint:"Drag a step-execute node here",foreachIsolation:"Isolation",foreachMaxRework:"Max rework cycles",foreachMode:"Mode",foreachNote:"Expands once per planned step. Drop a step-execute node (and optional step-review) into the region.",foreachParallel:"Parallel",foreachSequential:"Sequential",foreachShared:"Shared worktree",foreachWorktree:"Per-step worktree",gateBadge:"gate",gateBlocks:"Gate (blocks)",gateMode:"Gate mode",insertTemplate:"Insert template {{name}}",interpreterOnly:"This workflow branches, so it runs on the graph interpreter — it can't compile to the linear step engine, but it will still run.",joinAll:"All branches",joinAny:"Any branch",joinMode:"Join mode",joinQuorum:"Quorum (n)",loopEmptyHint:"Drag loop steps here",loopExitType:"Exit condition",loopMaxIterations:"Max iterations",loopNodeId:"Watch node id (optional)",loopNodeIdPlaceholder:"Template exit node",loopNote:"Repeats the template until the selected output matches, an iteration limit is reached, or the timeout expires.",loopOutputContains:"Output contains",loopOutputMatches:"Output matches regex",loopPattern:"Pattern",loopStepLabel:"Loop step",loopTimeoutMs:"Timeout (ms)",loopValue:"Value",mergeBoundaryNote:"Steps before this marker run pre-merge; steps after run post-merge.",mobileActions:"Actions",mobileAdd:"Add",mobileConnect:"Connect",mobileConnectChooseTarget:"Choose a target…",mobileConnectTarget:"Target node",mobileGraph:"Graph",mobileGraphEmpty:"No graph nodes yet.",mobileMoveDown:"Move down",mobileMoveUp:"Move up",mobileNodeKinds:"Node types",notifyCustom:"Custom",notifyCustomEvent:"Custom event",notifyEvent:"Event type",notifyMessage:"Message (optional)",notifyNote:"Templates may use {{taskTitle}}, {{taskId}}, {{workflowName}}, and {{context:key}}.",notifyTitle:"Title (optional)",parseArtifact:"Artifact",parseParser:"Parser",quorumN:"Quorum count (n)",releaseCapacity:"Downstream capacity",releaseCondition:"Release condition",releaseDependency:"Dependency complete",releaseExternal:"External event",releaseManual:"Manual promote",releaseTimer:"Timer",reviewCode:"Code review",reviewModel:"Review model (optional)",reviewNote:"Verdicts route as outcome edges. Click an outgoing edge to set its verdict and rework behavior.",reviewPlan:"Plan review",reviewType:"Review type",showInspector:"Show node details",splitNote:"Branches run concurrently from this node. Execute and merge seams are not allowed inside a branch.",startEntryColumn:"Entry column",startEntryColumnAuto:"— Auto (first column)",startNote:"The start node marks where a task enters the workflow.",stepBadge:"step",stepExecuteLabel:"Step execute",templateFilterLabel:"Filter templates",templateFilterPlaceholder:"Filter templates",templatesBuiltinSteps:"Built-in steps",templateSeamConflict:`This fragment duplicates the "{{seam}}" seam already on the canvas, so it can't be inserted.`,templatesFragments:"Fragments",templatesPluginSteps:"Plugin steps",templatesSection:"Templates",timeoutMs:"{{timeout}}ms",trivialGraphHint:"This workflow only runs start → end. Add steps from the palette above to build it out.",conditionFailure:"failure",conditionSuccess:"success",nodeInspector:"Node",readOnlyDuplicateToEdit:"Built-in structure is read-only — prompts on prompt and gate nodes can be edited here."},Mt={aiEdit:"Design with AI",aiFailed:"Failed to design workflow",aiPromptPlaceholder:"e.g. Run lint and tests before merge, then post a changelog comment after merge",aiPromptRequired:"Describe the workflow you want",aiReplaceConfirm:"Replace the current graph with the AI design? Unsaved changes will be lost.",aiReplaceConfirmLabel:"Replace",aiReplaceTitle:"Replace graph?",aiStaleDiscarded:"Discarded AI design — you switched workflows",aiSubmit:"Design with AI",aiToggle:"Describe it instead",backToWorkflowList:"Back to workflows",clickToEditDescription:"Click to edit description",clickToRename:"Click to rename",created:'Created workflow "{{name}}"',createDescription:"Description (optional)",createFailed:"Failed to create workflow",createName:"Name",createNameRequired:"Enter a workflow name",createSubmit:"Create",createTitle:"New workflow",deleted:"Workflow deleted",deleteFailed:"Failed to delete workflow",deleteMessage:'Delete workflow "{{name}}"? This cannot be undone.',deleteTitle:"Delete workflow?",descriptionLabel:"Workflow description",descriptionPlaceholder:"Add a description",discardConfirm:"Discard",discardMessage:"You have unsaved changes to this workflow. Discard them?",discardTitle:"Discard unsaved changes?",duplicateToCustomize:"Duplicate to customize",emptyDescription:"Workflows orchestrate the steps and gates that run around task execution. Create one to start arranging that flow.",emptyTitle:"No workflow selected",export:"Export",exportDirtyTooltip:"Save before exporting",exportFailed:"Failed to export workflow",exportTooltip:"Download as JSON — contains your full prompt and command text",import:"Import",imported:'Imported workflow "{{name}}"',importFailed:"Import failed",importInvalidJson:"That file isn't valid JSON.",importStripped:"Auto-approval flags were removed from imported nodes",importTooltip:"Import a workflow from a JSON file",migrationNotice:'Your legacy workflow steps were converted — find them as templates in the palette and as the "Migrated steps" workflow.',mobileEditorNav:"Workflow editor sections",mobileSelectNote:"Select a workflow to edit.",nameLabel:"Workflow name",newWorkflow:"New workflow",readOnlyBuiltin:"Built-in workflow: structure is read-only, prompts are editable.",saved:"Workflow saved",savedNotCompilable:"Workflow saved but cannot be compiled",saveFailed:"Failed to save workflow",showCanvasEditor:"Show canvas editor",showSimpleEditor:"Show simple editor",templateBlank:"Blank",templateBlankDescription:"Start from an empty start → end graph.",templateCopyName:"{{name}} copy",templateNodeCount_one:"{{count}} nodes",templateNodeCount_other:"{{count}} nodes",templatePickerLabel:"Start from",templateSectionBuiltin:"Built-in workflows",templateSectionYours:"Your workflows",closeEditor:"Close workflow editor",duplicatedEditable:'Duplicated to "{{name}}" — editable',duplicateFailed:"Failed to duplicate workflow",loadFailed:"Failed to load workflows",loading:"Loading…",noneYet:"No workflows yet.",title:"Workflows"},It={switchActiveMessage:"This task has an active session. Switching workflows aborts it and re-homes the card into the new workflow's entry column. Continue?",switchActiveTitle:"Switch workflow?",switchCancel:"Cancel",switchConfirm:"Switch and abort",applyFailed:"Failed to apply workflow",defaultCleared:"Default workflow cleared",defaultSet:"Default workflow set",defaultWorkflowLabel:"Default workflow for new tasks",loadFailed:"Failed to load workflows",manage:"Manage…",none:"None"},Nt={add:"Add setting",addOption:"Add option",builtinDefinitionsReadOnly:"Built-in workflow — declarations are read-only. Values are editable below.",clearHint:"Use the reset control on a row to clear a value back to its declaration default.",customized:"Customized",default:"Default",defaultLabel:"Default value",defaultTrue:"Default on",definitionsTab:"Definitions",deleteOrphan:"Delete orphaned value",description:"Description",descriptionLabel:"Setting description",duplicateId:"A setting with that id already exists",editId:"Edit id",empty:"No settings declared yet. Add a setting to expose a typed, per-project knob.",idLabel:"Setting id",idWarn:"Changing the id discards values stored under the old id (remove + add).",loadFailed:"Failed to load setting values",loading:"Loading…",modelsLoadFailed:"Failed to load available models",nameLabel:"Setting name",newOptionLabel:"Option 1",newSettingName:"New setting",noDeclarations:"This workflow declares no settings, so there are no values to edit.",noDefault:"— none —",noModelsAvailable:"No models are available. Configure authentication before selecting a workflow model.",optionColor:"Option color",optionLabel:"Option label",optionN:"Option {{n}}",options:"Options",optionValue:"Option value",orphanDeleted:"Orphaned value removed",orphanedNote:"These stored values no longer match a current declaration (the setting was retyped or removed). They are ignored by the engine; delete them to clean up.",orphanedTitle_one:"Orphaned values ({{count}})",orphanedTitle_other:"Orphaned values ({{count}})",readOnlyHint:"Built-in workflows are read-only — duplicate to edit",remove:"Remove setting",removeOption:"Remove option",requiresProject:"Open a project to view and edit per-project setting values.",saveFailed:"Failed to save setting values",saveValues:"Save values",selectModel:"Select a model…",staleContext:"Values shown are for project {{project}} — reopen the editor to edit values for the current project.",title:"Settings",typeLabel:"Type",useInheritedModel:"Use inherited/default model",valuesRejected:"Some values were rejected — see the highlighted fields",valuesSaved:"Setting values saved",valuesTab:"Values",widget:"Widget",widgetDefault:"Default"},xt={countsAria:"{{todoLabel}}: {{todo}}, {{inProgressLabel}}: {{inProgress}}, {{doneLabel}}: {{done}}{{mergingSuffix}}",done:"Done",inProgress:"In Progress",label:"Workflow",merging:"Merging",mergingTitle:"{{count}} merging task{{plural}}",todo:"Todo",triggerAria:"Select workflow. Current workflow: {{name}}",editWorkflow:"Edit workflow",newWorkflow:"New workflow"},Et={projectRoot:"Project Root",selectWorkspace:"Select workspace",taskWorktrees:"Task Worktrees"},Ht={unassigned:"Unassigned",upNext:"Up Next"},Bt={assetUrl:"Asset URL",installPath:"Install path",installRequestTitle:"Worktrunk install request",sha256:"SHA-256",version:"Version"},Ot={activePlaceholder:"Steer the currently executing agent",activeSessionHint:"Message the active agent session. Guidance is delivered to the running session in real time.",agentMessages:"{{label}} messages",arguments:"Arguments",collapseChat:"Collapse chat",donePlaceholder:"Start a refinement task for this completed task",doneSessionHint:"Send a message to start a refinement task for this completed task.",emptyAgentOutput:"No agent output yet. Live messages from Planner, Executor, Reviewer, and Merger agents will appear here.",entryCount_one:"{{count}} entry",entryCount_other:"{{count}} entries",error:"Error",errorCount_one:"{{count}} error",errorCount_other:"{{count}} errors",expandChat:"Expand chat to full modal",idleSessionHint:"No agent is working on this task right now. Your message is saved as guidance and will reach an agent the next time this task runs.",jumpToLatestMessage:"Jump to latest message",latest:"Latest",loadingAgentOutput:"Loading agent output…",loadingEarlierMessages:"Loading earlier messages…",loadPreviousMessages:"Load previous messages",message:"Message",messageActiveAgentSession:"Message active agent session",moreTools_one:", +{{count}} more",moreTools_other:", +{{count}} more",result:"Result",roles:{agent:"Agent",executor:"Executor",merger:"Merger",planner:"Planner",reviewer:"Reviewer"},sending:"Sending",thinking:"Thinking",toolCall:"Tool call",toolCallCount_one:"{{count}} tool call",toolCallCount_other:"{{count}} tool calls",toolCallTo:"Tool call → {{label}}",toolError:"Tool error",toolNames:"Tool names",toolResult:"Tool result",you:"You",youMessage:"You message"},Ut={actions:e,activityFeed:t,activityLog:o,agentError:a,agentLog:i,agentMention:n,agentPolicy:s,agentPrompts:r,agentProvisioning:l,agents:d,app:c,appName:u,approval:p,auth:m,backend:g,backgroundTasks:h,board:f,branchGroup:b,branchGroups:v,capacity:k,changes:y,chat:w,chatRooms:A,cli:S,cliBinary:C,cliChat:T,cliTerminal:P,column:R,commandCenter:F,comments:L,commit:D,commitDiff:M,common:I,composer:N,confirm:x,conversation:E,createRoom:H,dashboard:B,dbBanner:O,deepLink:U,desktop:_,devserver:j,dirPicker:q,docker:W,documents:G,droidCli:V,duplicateWarning:z,editor:K,errorBoundary:Y,evals:Q,executor:J,fileBrowser:Z,fileEditor:X,fileMention:$,git:ee,githubStarPrompt:te,goals:oe,groups:ae,groupTask:ie,header:ne,health:se,hermes:re,inline:le,insights:de,interview:ce,issues:ue,lane:pe,listView:me,mailbox:ge,memory:he,merge:fe,mesh:be,missions:ve,modalManager:ke,model:ye,models:we,modelSelection:Ae,nav:Se,newTaskModal:Ce,nodes:Te,nodeStatus:Pe,nodeSync:Re,onboarding:Fe,openclaw:Le,paperclip:De,piExtensions:Me,piManager:Ie,planning:Ne,plugins:xe,pr:Ee,preview:He,projectCard:Be,projectDetection:Oe,projects:Ue,projectSelector:_e,providers:je,quickChat:qe,reliability:We,research:Ge,rightDock:Ve,routine:ze,routing:Ke,runtimes:Ye,schedule:Qe,scripts:Je,scriptsModal:Ze,secrets:Xe,selectionComment:$e,sessionBanner:et,settings:tt,setup:ot,shell:at,skills:it,specEditor:nt,stash:st,stashRecovery:rt,stepType:lt,subtasks:dt,syncLog:ct,systemStats:ut,taskChanges:pt,taskDetail:mt,taskDocuments:gt,taskFields:ht,taskForm:ft,taskHandlers:bt,taskReview:vt,tasks:kt,terminal:yt,theme:wt,todo:At,trackingRepoSelect:St,updateBanner:Ct,usage:Tt,workflow:Pt,workflowColumns:Rt,workflowEditor:Ft,workflowFields:Lt,workflowNodes:Dt,workflows:Mt,workflowSelector:It,workflowSettings:Nt,workflowSwitcher:xt,workspace:Et,worktree:Ht,worktrunk:Bt,taskChat:Ot};export{e as actions,t as activityFeed,o as activityLog,a as agentError,i as agentLog,n as agentMention,s as agentPolicy,r as agentPrompts,l as agentProvisioning,d as agents,c as app,u as appName,p as approval,m as auth,g as backend,h as backgroundTasks,f as board,b as branchGroup,v as branchGroups,k as capacity,y as changes,w as chat,A as chatRooms,S as cli,C as cliBinary,T as cliChat,P as cliTerminal,R as column,F as commandCenter,L as comments,D as commit,M as commitDiff,I as common,N as composer,x as confirm,E as conversation,H as createRoom,B as dashboard,O as dbBanner,U as deepLink,Ut as default,_ as desktop,j as devserver,q as dirPicker,W as docker,G as documents,V as droidCli,z as duplicateWarning,K as editor,Y as errorBoundary,Q as evals,J as executor,Z as fileBrowser,X as fileEditor,$ as fileMention,ee as git,te as githubStarPrompt,oe as goals,ie as groupTask,ae as groups,ne as header,se as health,re as hermes,le as inline,de as insights,ce as interview,ue as issues,pe as lane,me as listView,ge as mailbox,he as memory,fe as merge,be as mesh,ve as missions,ke as modalManager,ye as model,Ae as modelSelection,we as models,Se as nav,Ce as newTaskModal,Pe as nodeStatus,Re as nodeSync,Te as nodes,Fe as onboarding,Le as openclaw,De as paperclip,Me as piExtensions,Ie as piManager,Ne as planning,xe as plugins,Ee as pr,He as preview,Be as projectCard,Oe as projectDetection,_e as projectSelector,Ue as projects,je as providers,qe as quickChat,We as reliability,Ge as research,Ve as rightDock,ze as routine,Ke as routing,Ye as runtimes,Qe as schedule,Je as scripts,Ze as scriptsModal,Xe as secrets,$e as selectionComment,et as sessionBanner,tt as settings,ot as setup,at as shell,it as skills,nt as specEditor,st as stash,rt as stashRecovery,lt as stepType,dt as subtasks,ct as syncLog,ut as systemStats,pt as taskChanges,Ot as taskChat,mt as taskDetail,gt as taskDocuments,ht as taskFields,ft as taskForm,bt as taskHandlers,vt as taskReview,kt as tasks,yt as terminal,wt as theme,At as todo,St as trackingRepoSelect,Ct as updateBanner,Tt as usage,Pt as workflow,Rt as workflowColumns,Ft as workflowEditor,Lt as workflowFields,Dt as workflowNodes,It as workflowSelector,Nt as workflowSettings,xt as workflowSwitcher,Mt as workflows,Et as workspace,Ht as worktree,Bt as worktrunk};
13
+ Close the issue?`,linkedIssueTitle:"Linked GitHub Issue",loadAgentsFailed:"Failed to load agents: {{msg}}",loadAgentsFailedGeneric:"Failed to load agents",loadDependencyFailed:"Failed to load dependency {{depId}}",loadingAgents:"Loading agents...",loadModelsFailed:"Failed to load models",missionBadgeTitle:"Mission: {{name}}",modelExecutor:"Executor",modelPlan:"Plan",modelReviewer:"Reviewer",models:"Models",modelsCount_one:"{{count}} model",modelsCount_other:"{{count}} models",moreOptions:"More Options",move:"Move",moved:"Moved {{taskId}} to {{column}}",moveFailed:"Failed to move {{taskId}}: {{error}}",moveTask:"Move task",nearDuplicateTitle:"Potential near-duplicate of {{id}}",needsInput:"Needs input",noAgentsAvailable:"No agents available",node:"Node",noExistingTasks:"No existing tasks",openRetryBreakdown:"Open retry breakdown",paused:"paused",pausedByAgent:"paused by agent",plan:"Plan",planButtonTitle:"Open planning mode with current description",planModel:"Plan Model",prBadgeTitle:"PR #{{number}}: {{title}}",preserveProgressMessage:"This task has completed steps. Keep progress before moving?",preserveProgressTitle:"Preserve Progress?",prNodeFailed:"PR failed",prNodeFailedTitle:"PR creation failed — open the PR view",prNodeState:"PR · {{state}}",prNodeTitle:"PR {{state}} — open the PR view",prNodeWithNumber:"PR #{{number}} · {{state}}",projectDefaultLocal:"Project default / local",promote:"Promote",promoteTask:"Promote task",promoting:"Promoting…",queued:"Queued",quickEntryHint:"Enter to create · Esc to cancel",refine:"Refine",refineAddDetails:"Add details",refineAddDetailsDesc:"Add implementation details and context",refineButtonTitle:"Refine description with AI",refineClarify:"Clarify",refineClarifyDesc:"Make the description clearer and more specific",refineExpand:"Expand",refineExpandDesc:"Expand into a more comprehensive description",refineSimplify:"Simplify",refineSimplifyDesc:"Simplify and make more concise",refining:"Refining...",removeImage:"Remove image",resetProgress:"Reset Progress",resetProgressMessage:"Reset all step progress before moving this task?",resetProgressTitle:"Reset Progress?",retriesAriaLabel_one:"{{count}} retries",retriesAriaLabel_other:"{{count}} retries",retry:"Retry",retryFailed:"Failed to retry {{taskId}}: {{error}}",retrying:"Retrying…",reviewerModel:"Reviewer Model",save:"Save",saving:"Saving...",searchTasksPlaceholder:"Search tasks…",selectAgent:"Select agent",selectExecutionNode:"Select execution node",selectPriority:"Select priority",sendBack:"Send back",sharedBranch:"Shared",showSteps:"Show steps",stalled:"Stalled",statusMergingFix:"Merging fixes…",stepCount_one:"{{count}} step",stepCount_other:"{{count}} steps",stuck:"Stuck",subtask:"Subtask",subtaskButtonTitle:"Break down into AI-generated subtasks",toggleFastMode:"Toggle fast execution mode",unarchive:"Unarchive",unarchived:"Unarchived {{taskId}}",unarchiveFailed:"Failed to unarchive {{taskId}}: {{error}}",unarchiveTask:"Unarchive task",updated:"Updated {{taskId}}",updateFailed:"Failed to update {{taskId}}: {{error}}",uploadFailed:"Failed to upload: {{files}}",usingDefault:"Using default",viewDependency:"Click to view {{depId}}",workflow:"workflow",workflowCheck:"Workflow check"},yt={arrowKeysLabel:"Terminal arrow keys",clear:"Clear",clearTerminal:"Clear terminal",closeTab:"Close tab",closeTerminal:"Close terminal",createScriptTabError:"Failed to create terminal tab for script: {{message}}",cursorBar:"Bar",cursorBlock:"Block",cursorUnderline:"Underline",decreaseFontSize:"Decrease terminal font size",exitLabel:"Exit: {{code}}",failedToStartTerminal:"Failed to start terminal: {{error}}",helpText:"Ctrl++/- zoom • ⌨ Shortcuts panel • Esc close",increaseFontSize:"Increase terminal font size",initializeError:"Terminal UI failed to initialize: {{error}}",newSession:"New Session",newTerminal:"New terminal",preferenceCursorBlink:"Blink cursor",preferenceCursorStyle:"Cursor style",preferenceFontFamily:"Font family",preferenceFontSize:"Font size",preferenceRenderer:"Renderer",preferences:"Preferences",reconnect:"Reconnect",refreshPage:"Refresh page",reinitialize:"Reinitialize",rendererAuto:"Auto (WebGL on desktop)",rendererCanvas:"Canvas/DOM",rendererReopenNote:"Reopen the terminal to apply renderer changes.",resetPreferences:"Reset to defaults",shortcuts:"Shortcuts",startingTerminal:"Starting terminal...",statusConnected:"Connected",statusConnecting:"Connecting...",statusDisconnected:"Disconnected",statusReconnecting:"Reconnecting..."},wt={colorTheme:"Color Theme",colorThemeLabel:"Color theme",currentTheme:"Current theme",fontSize:"Font Size",fontSizeLabel:"Dashboard font size",modeLabel:"Theme mode",resetButton:"Reset to defaults",resetLabel:"Reset to default theme"},At={addItemPlaceholder:"Add a todo item",addList:"Add list",assignAgent:"Assign {{text}} to agent",cancelItemEdit:"Cancel item edit",cancelList:"Cancel list",cancelListRename:"Cancel list rename",createList:"Create List",createTaskFrom:"Create task from {{text}}",deleteItem:"Delete {{text}}",deleteList:"Delete {{title}}",deleteListConfirm:"Delete this list and all its items?",deleteListTitle:"Delete List",editItem:"Edit {{text}}",failedCreateItem:"Failed to create item",failedCreateItemToast:"Failed to create todo item",failedCreateList:"Failed to create list",failedCreateListToast:"Failed to create todo list",failedDeleteItem:"Failed to delete item",failedDeleteItemToast:"Failed to delete todo item",failedDeleteList:"Failed to delete list",failedDeleteListToast:"Failed to delete todo list",failedLoadLists:"Failed to load todo lists",failedRenameList:"Failed to rename list",failedRenameListToast:"Failed to rename todo list",failedReorderItems:"Failed to reorder items",failedReorderItemsToast:"Failed to reorder todo items",failedToCreateAndAssign:"Failed to create and assign task: {{error}}",failedToCreateTask:"Failed to create task: {{error}}",failedToLoadAgents:"Failed to load agents: {{error}}",failedUpdateItem:"Failed to update item",failedUpdateItemToast:"Failed to update todo item",itemsLabel:"Todo items",lists:"Lists",listsLabel:"Todo lists sidebar",loading:"Loading todos...",loadingAgents:"Loading agents...",manageDescription:"Manage reusable todo lists for your project.",moveItemDown:"Move {{text}} down",moveItemUp:"Move {{text}} up",newListTitle:"New list title",noAgentsAvailable:"No agents available",noItemsEmpty:"No items in this list. Add one above.",noListsEmpty:"No todo lists yet. Create one to get started.",renameList:"Rename {{title}}",saveItemEdit:"Save item edit",saveList:"Save list",saveListRename:"Save list rename",selectList:"Select list {{title}}",selectListEmpty:"Select a list from the sidebar",startPlanning:"Start planning from {{text}}",taskCreatedAndAssigned:"Created {{id}} and assigned to {{agent}}",taskCreatedFromTodo:"Created {{id}} from todo",todoListsLabel:"Todo lists",todos:"Todos"},St={customOption:"Custom…",loadingHint:"Loading detected GitHub remotes…"},Ct={dismissLabel:"Dismiss update notice",learnMore:"Learn more",message:"Update available: v{{latestVersion}} (current: v{{currentVersion}}). Run fn update for an installed CLI, or pull this source checkout.",releaseNotes:"Release notes",updateFailed:"Update failed",updateFailedWithMessage:"Update failed: {{message}}",updateNow:"Update now",updateSuccess:"Updated to v{{version}} — restart Fusion to apply",updating:"Updating…"},Tt={configureAuthHint:"Configure authentication in Settings to see usage data.",failedToLoad:"Failed to load usage data",hideWindow:"Hide {{label}}",lastUpdated:"Last updated: {{time}}",moveProviderDown:"Move {{provider}} down",moveProviderUp:"Move {{provider}} up",noDataAvailable:"No usage data available",noProvidersConfigured:"No AI providers configured",percentLeft:"{{percent}}% left",percentRemaining:"{{percent}}% remaining",percentUsed:"{{percent}}% used",reorderProvider:"Reorder {{provider}}",resetsInDays:"resets in {{days}}d",resetsInDaysHours:"resets in {{days}}d {{hours}}h",resetsInHours:"resets in {{hours}}h",resetsInMinutes:"resets in {{mins}}m",showHidden_one:"Show hidden ({{count}})",showHidden_other:"Show hidden ({{count}})",statusError:"Error",statusNotConfigured:"Not configured",title:"Usage",viewModeLabel:"Usage view mode",viewModeRemaining:"Remaining",viewModeUsed:"Used"},Pt={advisoryExplanation:"Advisory workflow steps flagged non-blocking improvements:",aggregateResult:"Aggregate result",configuredSteps:"Configured Workflow Steps",done:"Done",doneEditingAriaLabel:"Done editing workflow steps",edit:"Edit",editAriaLabel:"Edit workflow steps",editWorkflow:"Edit workflow",executionOrder:"Execution order:",executionPhase:"Execution phase",expandOutput:"Expand output",graph:"Workflow graph",graphUnavailable:"Workflow graph unavailable",hideOutput:"Hide output",loadingGraph:"Loading workflow graph…",loadingResults:"Loading workflow results…",markdown:"Markdown",modelSettings:"Model settings",moveDown:"Move down",moveUp:"Move up",needsReview:"Needs follow-up review.",noStepsConfigured:"No workflow steps configured for this task.",notes:"Notes:",noWorkflowAssigned:"No workflow assigned",output:"Output:",overview:"Workflow overview",plain:"Plain",polishNotes:"Polish notes",remove:"Remove",selectStepsDescription:"Select steps to run after task implementation completes",showOutput:"Show output",started:"Started:",stepCount_one:"{{count}} step",stepCount_other:"{{count}} steps",stepDefinitionNotFound:"Step definition not found.",stepProgress:"Step count",stepProgressValue:"{{completed}} of {{total}} steps completed",steps:"Workflow Steps",stepsExplanation:"Pre-merge steps run after implementation, before merge. Post-merge steps run after merge succeeds.",summaryAdvisory_one:"{{count}} advisory",summaryAdvisory_other:"{{count}} advisory",summaryFailed_one:"{{count}} failed",summaryFailed_other:"{{count}} failed",summaryPassed_one:"{{count}} passed",summaryPassed_other:"{{count}} passed",summaryRunning_one:"{{count}} running",summaryRunning_other:"{{count}} running",summarySeparator:" · ",summarySkipped_one:"{{count}} skipped",summarySkipped_other:"{{count}} skipped",summaryStepCount_one:"{{count}} step",summaryStepCount_other:"{{count}} steps",switchToMarkdown:"Switch to markdown",switchToPlain:"Switch to plain text",thinkingLevel:"Thinking level",workflowName:"Workflow",aggregateAdvisory:"Advisory",aggregateAllPassed:"All passed",aggregateInProgress:"In progress",aggregateNoResults:"No results",approveAndRun:"Approve & run",approveCommandError:"Failed to approve command",approving:"Approving…",awaitingInputTitle:"Waiting for your input",cliApprovalRejectHint:"To reject, keep the task paused and do not approve.",cliApprovalTitle:"Approve CLI command?",cliApprovalWarning:"This command will run in the task worktree. Approving trusts this exact command for future runs.",customWorkflowFallback:"Custom workflow",customWorkflowLabel:"Custom workflow",defaultWorkflow:"Default",executionAwaitingCliApproval:"Awaiting CLI approval",executionAwaitingInput:"Awaiting input",executionCompleted:"Completed",executionNotStarted:"Not started",executionPaused:"Paused",executionPostMerge:"Post-merge steps running",executionPreMerge:"Pre-merge steps running",inputPlaceholder:"Type your reply…",modelDefault:"Default",postMerge:"Post-merge",preMerge:"Pre-merge",replyInComments:"Reply in the comments and unpause the task to continue.",resumeTaskError:"Failed to resume task",resuming:"Resuming…",statusAdvisory:"Advisory failure",statusFailed:"Failed",statusPassed:"Passed",statusRunning:"Running…",statusSkipped:"Skipped",submitAndResume:"Submit & resume",submitting:"Submitting…",waitingForOutput:"Waiting for agent output…"},Rt={add:"Add column",agent:"Column agent",agentBadgeDefer:"Column agent (defer)",agentBadgeOverride:"Column agent (override)",agentFlagHint:"Workflow columns are available by default",agentLabel:"Column agent",agentMode:"Agent mode",agentModeDefer:"Defer",agentModeDeferHint:"Column agent applies only when the work carries no agent/model settings of its own",agentModeOverride:"Override",agentModeOverrideHint:"Column agent supersedes node- and task-level agent/model settings",agentNone:"(none)",agentNotFound:"Agent not found — {{id}}",agentsLoadFailed:"Failed to load agents",compositionBlocked:"Resolve trait conflicts on highlighted columns before saving",confirmPolicyEscalation:"Bind it anyway? The column agent will run with broader permissions than this project's default.",empty:"No columns yet. Add a column to place nodes into board lanes.",escalationDeclined:"Save cancelled — column agent binding not confirmed",moveDown:"Move column down",moveUp:"Move column up",nameLabel:"Column name",newColumnName:"New column",nodeUnplaced:"Not placed in a column",overriddenByColumnAgent:"Overridden by column agent {{name}} — this node's executor settings are superseded.",readOnlyHint:"Built-in workflows are read-only — duplicate to edit",remove:"Remove column",title:"Columns",traits:"Traits",traitsLoadFailed:"Failed to load traits",unplacedCount_one:"{{count}} nodes not placed in a column",unplacedCount_other:"{{count}} nodes not placed in a column"},Ft={cliAgent:{adapterLabel:"CLI adapter",adapterNote:"Drives a CLI coding agent in an engine-owned terminal for this step.",adapterPlaceholder:"— select adapter —",autonomyLabel:"Elevated autonomy (bypass approvals)",autonomyNote:"Elevated autonomy requires a per-project approval before the agent can launch. Until approved, launches with elevated posture fail.",executorOption:"CLI agent",notify:{banner:"In-app banner",bannerNotify:"Banner + push notification"},notifyLabel:"Waiting-on-input notification",notifyNote:"How you are alerted when the agent pauses waiting for input on this step."},collapsePrompt:"Collapse prompt editor",editingPrompt:"Editing Prompt",expandPrompt:"Expand prompt editor",agent:"Agent",agentsLoadFailed:"Failed to load agents",autoApproveRequests:"Auto-approve requests",autoApproveRequestsNote:"Runs without pausing for approval — e.g. a CLI command executes on its first run without waiting for your sign-off.",cliCommandNote:"Runs an arbitrary command in the task worktree. The first time this exact command runs, the task pauses for your approval. The node prompt is passed via FUSION_NODE_PROMPT.",cliMode:"CLI mode",cliScript:"CLI / script",command:"Command",executor:"Executor",maxRetries:"Max retries",model:"Model",modelsLoadFailed:"Failed to load models",namedScript:"Named script",namedScriptNote:"Named script from project settings. The node prompt is passed via FUSION_NODE_PROMPT.",prompt:"Prompt",scriptName:"Script name",selectAgent:"— select agent —",selectSkill:"— select skill —",skill:"Skill",skillsLoadFailed:"Failed to load skills",skipFirstRunApproval:"Skip first-run approval (runs without pausing)",waitForUserInput:"Wait for user input",waitForUserInputNote:"This node pauses the task until you reply in the task's comments and unpause. The Prompt field above is shown to the user as the question.",promptOverrideSaved:"Prompt override saved",promptOverrideSaveFailed:"Failed to save prompt override",promptOverrideReset:"Prompt reset to default",promptOverrideResetFailed:"Failed to reset prompt",promptOverridesLoadFailed:"Failed to load prompt overrides",promptOverridden:"Overridden",promptSaving:"Saving…",resetPromptDefault:"Reset to default"},Lt={add:"Add field",addOption:"Add option",badge:"Render as badge",default:"Default",defaultLabel:"Default value",defaultTrue:"Default on",duplicateId:"A field with that id already exists",editId:"Edit id",empty:"No custom fields yet. Add a field to extend the task form and cards.",idLabel:"Field id",idWarn:"Changing the id discards values stored under the old id (remove + add).",nameLabel:"Field name",newFieldName:"New field",newOptionLabel:"Option 1",noDefault:"— none —",optionColor:"Option color",optionLabel:"Option label",optionN:"Option {{n}}",options:"Options",optionValue:"Option value",placement:"Placement",placementCard:"Card badge",placementDetail:"Detail (inline)",placementSection:"Detail section",readOnlyHint:"Built-in workflows are read-only — duplicate to edit",remove:"Remove field",removeOption:"Remove option",required:"Required",title:"Fields",typeLabel:"Type",widget:"Widget",widgetDefault:"Default"},Dt={advisory:"Advisory",autoLayout:"Auto-layout",codeNote:"Runs sandboxed TypeScript. Syntax is validated at save.",codeSource:"Source (TypeScript)",codeTimeout:"Timeout (ms)",collapseInspector:"Collapse",cycleBlocked:"That connection would create a cycle — only rework edges inside a for-each template may loop back",deleteEdge:"Delete edge",deleteNode:"Delete node",duplicateBlocked:"That connection already exists",edgeCondition:"Condition",edgeConditionLabel:"Condition: {{condition}}",edgeInspector:"Edge",edgeNoVerdict:"— success (no verdict) —",edgeRework:"Rework edge (loop back, bounded)",edgeReworkNote:"Rework edges are the only legal cycles — they loop back within the for-each step instance, bounded by Max rework cycles.",edgeVerdict:"Review verdict",failureCollect:"Collect (wait for all)",failureFailFast:"Fail-fast (cancel siblings)",failurePolicy:"On branch failure",foreachConcurrency:"Concurrency",foreachEmptyHint:"Drag a step-execute node here",foreachIsolation:"Isolation",foreachMaxRework:"Max rework cycles",foreachMode:"Mode",foreachNote:"Expands once per planned step. Drop a step-execute node (and optional step-review) into the region.",foreachParallel:"Parallel",foreachSequential:"Sequential",foreachShared:"Shared worktree",foreachWorktree:"Per-step worktree",gateBadge:"gate",gateBlocks:"Gate (blocks)",gateMode:"Gate mode",insertTemplate:"Insert template {{name}}",interpreterOnly:"This workflow branches, so it runs on the graph interpreter — it can't compile to the linear step engine, but it will still run.",joinAll:"All branches",joinAny:"Any branch",joinMode:"Join mode",joinQuorum:"Quorum (n)",loopEmptyHint:"Drag loop steps here",loopExitType:"Exit condition",loopMaxIterations:"Max iterations",loopNodeId:"Watch node id (optional)",loopNodeIdPlaceholder:"Template exit node",loopNote:"Repeats the template until the selected output matches, an iteration limit is reached, or the timeout expires.",loopOutputContains:"Output contains",loopOutputMatches:"Output matches regex",loopPattern:"Pattern",loopStepLabel:"Loop step",loopTimeoutMs:"Timeout (ms)",loopValue:"Value",mergeBoundaryNote:"Steps before this marker run pre-merge; steps after run post-merge.",mobileActions:"Actions",mobileAdd:"Add",mobileConnect:"Connect",mobileConnectChooseTarget:"Choose a target…",mobileConnectTarget:"Target node",mobileGraph:"Graph",mobileGraphEmpty:"No graph nodes yet.",mobileMoveDown:"Move down",mobileMoveUp:"Move up",mobileNodeKinds:"Node types",notifyCustom:"Custom",notifyCustomEvent:"Custom event",notifyEvent:"Event type",notifyMessage:"Message (optional)",notifyNote:"Templates may use {{taskTitle}}, {{taskId}}, {{workflowName}}, and {{context:key}}.",notifyTitle:"Title (optional)",parseArtifact:"Artifact",parseParser:"Parser",quorumN:"Quorum count (n)",releaseCapacity:"Downstream capacity",releaseCondition:"Release condition",releaseDependency:"Dependency complete",releaseExternal:"External event",releaseManual:"Manual promote",releaseTimer:"Timer",reviewCode:"Code review",reviewModel:"Review model (optional)",reviewNote:"Verdicts route as outcome edges. Click an outgoing edge to set its verdict and rework behavior.",reviewPlan:"Plan review",reviewType:"Review type",showInspector:"Show node details",splitNote:"Branches run concurrently from this node. Execute and merge seams are not allowed inside a branch.",startEntryColumn:"Entry column",startEntryColumnAuto:"— Auto (first column)",startNote:"The start node marks where a task enters the workflow.",stepBadge:"step",stepExecuteLabel:"Step execute",templateFilterLabel:"Filter templates",templateFilterPlaceholder:"Filter templates",templatesBuiltinSteps:"Built-in steps",templateSeamConflict:`This fragment duplicates the "{{seam}}" seam already on the canvas, so it can't be inserted.`,templatesFragments:"Fragments",templatesPluginSteps:"Plugin steps",templatesSection:"Templates",timeoutMs:"{{timeout}}ms",trivialGraphHint:"This workflow only runs start → end. Add steps from the palette above to build it out.",conditionFailure:"failure",conditionSuccess:"success",nodeInspector:"Node",readOnlyDuplicateToEdit:"Built-in structure is read-only — prompts on prompt and gate nodes can be edited here."},Mt={aiEdit:"Design with AI",aiFailed:"Failed to design workflow",aiPromptPlaceholder:"e.g. Run lint and tests before merge, then post a changelog comment after merge",aiPromptRequired:"Describe the workflow you want",aiReplaceConfirm:"Replace the current graph with the AI design? Unsaved changes will be lost.",aiReplaceConfirmLabel:"Replace",aiReplaceTitle:"Replace graph?",aiStaleDiscarded:"Discarded AI design — you switched workflows",aiSubmit:"Design with AI",aiToggle:"Describe it instead",backToWorkflowList:"Back to workflows",clickToEditDescription:"Click to edit description",clickToRename:"Click to rename",created:'Created workflow "{{name}}"',createDescription:"Description (optional)",createFailed:"Failed to create workflow",createName:"Name",createNameRequired:"Enter a workflow name",createSubmit:"Create",createTitle:"New workflow",deleted:"Workflow deleted",deleteFailed:"Failed to delete workflow",deleteMessage:'Delete workflow "{{name}}"? This cannot be undone.',deleteTitle:"Delete workflow?",descriptionLabel:"Workflow description",descriptionPlaceholder:"Add a description",discardConfirm:"Discard",discardMessage:"You have unsaved changes to this workflow. Discard them?",discardTitle:"Discard unsaved changes?",duplicateToCustomize:"Duplicate to customize",emptyDescription:"Workflows orchestrate the steps and gates that run around task execution. Create one to start arranging that flow.",emptyTitle:"No workflow selected",export:"Export",exportDirtyTooltip:"Save before exporting",exportFailed:"Failed to export workflow",exportTooltip:"Download as JSON — contains your full prompt and command text",import:"Import",imported:'Imported workflow "{{name}}"',importFailed:"Import failed",importInvalidJson:"That file isn't valid JSON.",importStripped:"Auto-approval flags were removed from imported nodes",importTooltip:"Import a workflow from a JSON file",migrationNotice:'Your legacy workflow steps were converted — find them as templates in the palette and as the "Migrated steps" workflow.',mobileEditorNav:"Workflow editor sections",mobileSelectNote:"Select a workflow to edit.",nameLabel:"Workflow name",newWorkflow:"New workflow",readOnlyBuiltin:"Built-in workflow: structure is read-only, prompts are editable.",saved:"Workflow saved",savedNotCompilable:"Workflow saved but cannot be compiled",saveFailed:"Failed to save workflow",showCanvasEditor:"Show canvas editor",showSimpleEditor:"Show simple editor",templateBlank:"Blank",templateBlankDescription:"Start from an empty start → end graph.",templateCopyName:"{{name}} copy",templateNodeCount_one:"{{count}} nodes",templateNodeCount_other:"{{count}} nodes",templatePickerLabel:"Start from",templateSectionBuiltin:"Built-in workflows",templateSectionYours:"Your workflows",closeEditor:"Close workflow editor",duplicatedEditable:'Duplicated to "{{name}}" — editable',duplicateFailed:"Failed to duplicate workflow",loadFailed:"Failed to load workflows",loading:"Loading…",noneYet:"No workflows yet.",title:"Workflows"},It={switchActiveMessage:"This task has an active session. Switching workflows aborts it and re-homes the card into the new workflow's entry column. Continue?",switchActiveTitle:"Switch workflow?",switchCancel:"Cancel",switchConfirm:"Switch and abort",applyFailed:"Failed to apply workflow",defaultCleared:"Default workflow cleared",defaultSet:"Default workflow set",defaultWorkflowLabel:"Default workflow for new tasks",loadFailed:"Failed to load workflows",manage:"Manage…",none:"None"},Nt={add:"Add setting",addOption:"Add option",builtinDefinitionsReadOnly:"Built-in workflow — declarations are read-only. Values are editable below.",clearHint:"Use the reset control on a row to clear a value back to its declaration default.",customized:"Customized",default:"Default",defaultLabel:"Default value",defaultTrue:"Default on",definitionsTab:"Definitions",deleteOrphan:"Delete orphaned value",description:"Description",descriptionLabel:"Setting description",duplicateId:"A setting with that id already exists",editId:"Edit id",empty:"No settings declared yet. Add a setting to expose a typed, per-project knob.",idLabel:"Setting id",idWarn:"Changing the id discards values stored under the old id (remove + add).",loadFailed:"Failed to load setting values",loading:"Loading…",modelsLoadFailed:"Failed to load available models",nameLabel:"Setting name",newOptionLabel:"Option 1",newSettingName:"New setting",noDeclarations:"This workflow declares no settings, so there are no values to edit.",noDefault:"— none —",noModelsAvailable:"No models are available. Configure authentication before selecting a workflow model.",optionColor:"Option color",optionLabel:"Option label",optionN:"Option {{n}}",options:"Options",optionValue:"Option value",orphanDeleted:"Orphaned value removed",orphanedNote:"These stored values no longer match a current declaration (the setting was retyped or removed). They are ignored by the engine; delete them to clean up.",orphanedTitle_one:"Orphaned values ({{count}})",orphanedTitle_other:"Orphaned values ({{count}})",readOnlyHint:"Built-in workflows are read-only — duplicate to edit",remove:"Remove setting",removeOption:"Remove option",requiresProject:"Open a project to view and edit per-project setting values.",saveFailed:"Failed to save setting values",saveValues:"Save values",selectModel:"Select a model…",staleContext:"Values shown are for project {{project}} — reopen the editor to edit values for the current project.",title:"Settings",typeLabel:"Type",useInheritedModel:"Use inherited/default model",valuesRejected:"Some values were rejected — see the highlighted fields",valuesSaved:"Setting values saved",valuesTab:"Values",widget:"Widget",widgetDefault:"Default"},xt={countsAria:"{{todoLabel}}: {{todo}}, {{inProgressLabel}}: {{inProgress}}, {{doneLabel}}: {{done}}{{mergingSuffix}}",done:"Done",inProgress:"In Progress",label:"Workflow",merging:"Merging",mergingTitle:"{{count}} merging task{{plural}}",todo:"Todo",triggerAria:"Select workflow. Current workflow: {{name}}",editWorkflow:"Edit workflow",newWorkflow:"New workflow"},Et={projectRoot:"Project Root",selectWorkspace:"Select workspace",taskWorktrees:"Task Worktrees"},Ht={unassigned:"Unassigned",upNext:"Up Next"},Bt={assetUrl:"Asset URL",installPath:"Install path",installRequestTitle:"Worktrunk install request",sha256:"SHA-256",version:"Version"},Ot={activePlaceholder:"Steer the currently executing agent",agentMessages:"{{label}} messages",arguments:"Arguments",collapseChat:"Collapse chat",donePlaceholder:"Start a refinement task for this completed task",emptyAgentOutput:"No agent output yet. Live messages from Planner, Executor, Reviewer, and Merger agents will appear here.",entryCount_one:"{{count}} entry",entryCount_other:"{{count}} entries",error:"Error",errorCount_one:"{{count}} error",errorCount_other:"{{count}} errors",expandChat:"Expand chat to full modal",idleSessionHint:"No agent is working on this task right now. Your message is saved as guidance and will reach an agent the next time this task runs.",jumpToLatestMessage:"Jump to latest message",latest:"Latest",loadingAgentOutput:"Loading agent output…",loadingEarlierMessages:"Loading earlier messages…",loadPreviousMessages:"Load previous messages",message:"Message",messageActiveAgentSession:"Message active agent session",moreTools_one:", +{{count}} more",moreTools_other:", +{{count}} more",result:"Result",roles:{agent:"Agent",executor:"Executor",merger:"Merger",planner:"Planner",reviewer:"Reviewer"},sending:"Sending",thinking:"Thinking",toolCall:"Tool call",toolCallCount_one:"{{count}} tool call",toolCallCount_other:"{{count}} tool calls",toolCallTo:"Tool call → {{label}}",toolError:"Tool error",toolNames:"Tool names",toolResult:"Tool result",you:"You",youMessage:"You message"},Ut={actions:e,activityFeed:t,activityLog:o,agentError:a,agentLog:i,agentMention:n,agentPolicy:s,agentPrompts:r,agentProvisioning:l,agents:d,app:c,appName:u,approval:p,auth:m,backend:g,backgroundTasks:h,board:f,branchGroup:b,branchGroups:v,capacity:k,changes:y,chat:w,chatRooms:A,cli:S,cliBinary:C,cliChat:T,cliTerminal:P,column:R,commandCenter:F,comments:L,commit:D,commitDiff:M,common:I,composer:N,confirm:x,conversation:E,createRoom:H,dashboard:B,dbBanner:O,deepLink:U,desktop:_,devserver:j,dirPicker:q,docker:W,documents:G,droidCli:V,duplicateWarning:z,editor:K,errorBoundary:Y,evals:Q,executor:J,fileBrowser:Z,fileEditor:X,fileMention:$,git:ee,githubStarPrompt:te,goals:oe,groups:ae,groupTask:ie,header:ne,health:se,hermes:re,inline:le,insights:de,interview:ce,issues:ue,lane:pe,listView:me,mailbox:ge,memory:he,merge:fe,mesh:be,missions:ve,modalManager:ke,model:ye,models:we,modelSelection:Ae,nav:Se,newTaskModal:Ce,nodes:Te,nodeStatus:Pe,nodeSync:Re,onboarding:Fe,openclaw:Le,paperclip:De,piExtensions:Me,piManager:Ie,planning:Ne,plugins:xe,pr:Ee,preview:He,projectCard:Be,projectDetection:Oe,projects:Ue,projectSelector:_e,providers:je,quickChat:qe,reliability:We,research:Ge,rightDock:Ve,routine:ze,routing:Ke,runtimes:Ye,schedule:Qe,scripts:Je,scriptsModal:Ze,secrets:Xe,selectionComment:$e,sessionBanner:et,settings:tt,setup:ot,shell:at,skills:it,specEditor:nt,stash:st,stashRecovery:rt,stepType:lt,subtasks:dt,syncLog:ct,systemStats:ut,taskChanges:pt,taskDetail:mt,taskDocuments:gt,taskFields:ht,taskForm:ft,taskHandlers:bt,taskReview:vt,tasks:kt,terminal:yt,theme:wt,todo:At,trackingRepoSelect:St,updateBanner:Ct,usage:Tt,workflow:Pt,workflowColumns:Rt,workflowEditor:Ft,workflowFields:Lt,workflowNodes:Dt,workflows:Mt,workflowSelector:It,workflowSettings:Nt,workflowSwitcher:xt,workspace:Et,worktree:Ht,worktrunk:Bt,taskChat:Ot};export{e as actions,t as activityFeed,o as activityLog,a as agentError,i as agentLog,n as agentMention,s as agentPolicy,r as agentPrompts,l as agentProvisioning,d as agents,c as app,u as appName,p as approval,m as auth,g as backend,h as backgroundTasks,f as board,b as branchGroup,v as branchGroups,k as capacity,y as changes,w as chat,A as chatRooms,S as cli,C as cliBinary,T as cliChat,P as cliTerminal,R as column,F as commandCenter,L as comments,D as commit,M as commitDiff,I as common,N as composer,x as confirm,E as conversation,H as createRoom,B as dashboard,O as dbBanner,U as deepLink,Ut as default,_ as desktop,j as devserver,q as dirPicker,W as docker,G as documents,V as droidCli,z as duplicateWarning,K as editor,Y as errorBoundary,Q as evals,J as executor,Z as fileBrowser,X as fileEditor,$ as fileMention,ee as git,te as githubStarPrompt,oe as goals,ie as groupTask,ae as groups,ne as header,se as health,re as hermes,le as inline,de as insights,ce as interview,ue as issues,pe as lane,me as listView,ge as mailbox,he as memory,fe as merge,be as mesh,ve as missions,ke as modalManager,ye as model,Ae as modelSelection,we as models,Se as nav,Ce as newTaskModal,Pe as nodeStatus,Re as nodeSync,Te as nodes,Fe as onboarding,Le as openclaw,De as paperclip,Me as piExtensions,Ie as piManager,Ne as planning,xe as plugins,Ee as pr,He as preview,Be as projectCard,Oe as projectDetection,_e as projectSelector,Ue as projects,je as providers,qe as quickChat,We as reliability,Ge as research,Ve as rightDock,ze as routine,Ke as routing,Ye as runtimes,Qe as schedule,Je as scripts,Ze as scriptsModal,Xe as secrets,$e as selectionComment,et as sessionBanner,tt as settings,ot as setup,at as shell,it as skills,nt as specEditor,st as stash,rt as stashRecovery,lt as stepType,dt as subtasks,ct as syncLog,ut as systemStats,pt as taskChanges,Ot as taskChat,mt as taskDetail,gt as taskDocuments,ht as taskFields,ft as taskForm,bt as taskHandlers,vt as taskReview,kt as tasks,yt as terminal,wt as theme,At as todo,St as trackingRepoSelect,Ct as updateBanner,Tt as usage,Pt as workflow,Rt as workflowColumns,Ft as workflowEditor,Lt as workflowFields,Dt as workflowNodes,It as workflowSelector,Nt as workflowSettings,xt as workflowSwitcher,Mt as workflows,Et as workspace,Ht as worktree,Bt as worktrunk};