@runfusion/fusion 0.43.0 → 0.43.1
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.
- package/dist/bin.js +167 -27
- package/dist/client/.vite/manifest.json +70 -70
- package/dist/client/assets/AgentDetailView-BGN03dyz.css +1 -0
- package/dist/client/assets/{AgentDetailView-FUKwQxBP.js → AgentDetailView-DKMz3r04.js} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor-DMDUhF1n.js → AgentPermissionPolicyEditor-BiY1a4KR.js} +1 -1
- package/dist/client/assets/{AgentsView-BrQLd-yI.js → AgentsView-Co-k4vjh.js} +3 -3
- package/dist/client/assets/{ChatView-Wz_0goif.js → ChatView-BkAG99bj.js} +1 -1
- package/dist/client/assets/{DevServerView-DRqQpHsc.js → DevServerView-C6DC0URX.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-BFot4CVM.js → DirectoryPicker-CkcGjyv0.js} +1 -1
- package/dist/client/assets/{DocumentsView-hamhUcvL.js → DocumentsView-OCK1Vsw_.js} +1 -1
- package/dist/client/assets/{EvalsView-DAXqDqn2.js → EvalsView-CUfyj5GW.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-B4aZ1y0n.js → ExperimentalAgentOnboardingModal-Dau9RTU_.js} +1 -1
- package/dist/client/assets/{GoalsView-2QOp9DA0.js → GoalsView-CNLTn0rX.js} +1 -1
- package/dist/client/assets/{InsightsView-D5fzFy-F.js → InsightsView-BQPxHxKI.js} +1 -1
- package/dist/client/assets/{MemoryView-B082KoR-.js → MemoryView-D3xQIFjj.js} +1 -1
- package/dist/client/assets/{NodesView-BA3pKMZu.js → NodesView-CSMvGwDU.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-C4I11iKm.js → PiExtensionsManager-BtqXF3fl.js} +1 -1
- package/dist/client/assets/{PluginManager-BzTzTMXZ.js → PluginManager-CSSDb3VO.js} +1 -1
- package/dist/client/assets/{PullRequestView-11xJ565q.js → PullRequestView-Bjyfffdu.js} +1 -1
- package/dist/client/assets/{ReliabilityView-CpELpGqw.js → ReliabilityView-QKMUDebT.js} +1 -1
- package/dist/client/assets/{ResearchView-BHiXfjzE.js → ResearchView-CRU_NPho.js} +1 -1
- package/dist/client/assets/{SecretsView-CC5OYoCn.js → SecretsView-Bs8ySyC5.js} +1 -1
- package/dist/client/assets/SecretsView-Djo1rahi.css +1 -0
- package/dist/client/assets/{SessionTerminal-G70Jwkzs.js → SessionTerminal-Dk1NgmN2.js} +1 -1
- package/dist/client/assets/{SettingsModal-C0M1CqOu.js → SettingsModal-JCaNvdAb.js} +3 -3
- package/dist/client/assets/{SettingsModal-BKEbtdqR.js → SettingsModal-Nw5cTKAK.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-CBfItlP6.js → SetupWizardModal-CE79myEy.js} +1 -1
- package/dist/client/assets/{SkillsView-DbcW87-E.js → SkillsView-Dc8YskAX.js} +1 -1
- package/dist/client/assets/{StashRecoveryView-CH9RPtzX.js → StashRecoveryView-CqKOFiXT.js} +1 -1
- package/dist/client/assets/{TodoView-ToviJ0SV.js → TodoView-BqIRwcZw.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-BTu0D9c5.js → WorkflowNodeEditor-2jDuk2FR.js} +1 -1
- package/dist/client/assets/{dashboard-view-DtgLZ_LM.js → dashboard-view-BhbN8LPh.js} +1 -1
- package/dist/client/assets/{folder-open-BlPyIWyf.js → folder-open-Bw1mxVfa.js} +1 -1
- package/dist/client/assets/{index-bZCpHtGq.js → index-CpTBp1RG.js} +192 -192
- package/dist/client/assets/{upload-B-qmm1NH.js → upload-BCmd-1I0.js} +1 -1
- package/dist/client/assets/{users-D6C5TXf2.js → users-DO_t3V1p.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +166 -27
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugin-sdk/index.d.ts +2 -0
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/dist/automation-store-EKXXEE2S.js +0 -10
- package/dist/automation-store-PLNG3X72.js +0 -10
- package/dist/automation-store-RDDYZFUJ.js +0 -10
- package/dist/chunk-2JI3F6MG.js +0 -948
- package/dist/chunk-4L6CLWJC.js +0 -8345
- package/dist/chunk-4VNS5WPM.js +0 -42
- package/dist/chunk-5RGECGQL.js +0 -1139
- package/dist/chunk-6JDLN7IL.js +0 -409
- package/dist/chunk-AICJATVW.js +0 -948
- package/dist/chunk-AWKNRUOR.js +0 -1148
- package/dist/chunk-BHM3UYWS.js +0 -4651
- package/dist/chunk-BMUXDSBF.js +0 -4647
- package/dist/chunk-GETECT6V.js +0 -353
- package/dist/chunk-GUV4QQT3.js +0 -1143
- package/dist/chunk-JKQO7YYZ.js +0 -8369
- package/dist/chunk-LYZVU6UV.js +0 -409
- package/dist/chunk-MAN4WYHO.js +0 -353
- package/dist/chunk-MCUG2Z7M.js +0 -4651
- package/dist/chunk-PSDYB45U.js +0 -948
- package/dist/chunk-RR2HM46R.js +0 -8345
- package/dist/chunk-RXMQ5OMY.js +0 -9226
- package/dist/chunk-S2EVJUY3.js +0 -353
- package/dist/chunk-UXR5XZFZ.js +0 -409
- package/dist/client/assets/AgentDetailView-DiWELtb1.css +0 -1
- package/dist/client/assets/SecretsView-D5bHZ-wM.css +0 -1
- package/dist/extract-zip-WL55Z3AU.js +0 -2497
- package/dist/index.min-CHQ3ABYJ.js +0 -2926
- package/dist/memory-dreams-7USISKVE.js +0 -32
- package/dist/memory-dreams-PBPISUDD.js +0 -32
- package/dist/memory-dreams-XNO2B2QF.js +0 -32
- package/dist/migration-EH2YOCYQ.js +0 -15
- package/dist/migration-PLGTTKL5.js +0 -15
- package/dist/migration-WZEZK22R.js +0 -15
- package/dist/routine-store-GIJ6MXWY.js +0 -10
- package/dist/routine-store-HTVC2PUQ.js +0 -10
- package/dist/routine-store-KGHZBPDF.js +0 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as s,j as e}from"./vendor-react-D37HfzIf.js";import{a7 as G,a8 as X,a9 as ue,aa as me,ab as V,ac as he,f as pe,ad as fe,F as L,ae as je,af as xe,S as we,X as ke,R as ge,ag as be,ah as Y,ai as J,a as Z,b as ve,aj as Ne}from"./index-bZCpHtGq.js";import{u as B}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";function Ce(a){const{projectId:l,searchQuery:f,includeProjectFiles:t=!0}=a??{},c=l?`${ue.DOCUMENTS_PREFIX}${l}`:null,[j,o]=s.useState(()=>{if(!c)return[];const w=G(c,{maxAgeMs:X});return Array.isArray(w)?w:[]}),[x,i]=s.useState([]),[u,m]=s.useState(()=>j.length===0),[C,F]=s.useState(null),p=s.useRef(null),g=s.useRef(j.length>0),h=s.useRef(null),y=s.useCallback(async()=>{p.current&&p.current.abort();const w=new AbortController;p.current=w;const T=!g.current;T&&m(!0),F(null);const D=me(f?{q:f}:void 0,l),E=t?V(l):Promise.resolve({files:[]}),[k,S]=await Promise.allSettled([D,E]);if(w.signal.aborted)return;let R=null;if(k.status==="fulfilled"){if(o(k.value),c){const P=k.value.length>500?k.value.slice(0,500):k.value;he(c,P,{maxBytes:5e5})}g.current=!0}else R=k.reason instanceof Error?k.reason.message:String(k.reason);if(S.status==="fulfilled"){const P=S.value.files,M=f?.trim().toLowerCase(),z=M?P.filter(v=>v.name.toLowerCase().includes(M)||v.path.toLowerCase().includes(M)):P;i(z)}F(R),T&&m(!1)},[c,t,l,f]);return s.useEffect(()=>{if(!c){g.current=!1,o([]),m(!0);return}const w=G(c,{maxAgeMs:X});Array.isArray(w)?(o(w),g.current=!0,m(!1)):(g.current=!1,o([]),m(!0))},[c]),s.useEffect(()=>(h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{y()},300),()=>{h.current&&clearTimeout(h.current)}),[y]),s.useEffect(()=>(y(),()=>{p.current&&p.current.abort()}),[]),{documents:j,projectFiles:x,loading:u,error:C,refresh:y}}function Se(a,l){const[f,t]=s.useState([]),[c,j]=s.useState(!0),[o,x]=s.useState(null),i=s.useRef(null),u=s.useRef(!1),m=l?.showHidden??!1,C=s.useCallback(async F=>{i.current&&i.current.abort();const p=new AbortController;i.current=p;const g=!u.current;g&&j(!0),x(null);try{const h=await V(a,{showHidden:F?.showHidden??m});if(p.signal.aborted)return;t(h.files),u.current=!0}catch(h){if(p.signal.aborted)return;x(h instanceof Error?h.message:String(h))}finally{!p.signal.aborted&&g&&j(!1)}},[a,m]);return s.useEffect(()=>(u.current=!1,C({showHidden:m}),()=>{i.current&&i.current.abort()}),[C,m]),{files:f,loading:c,error:o,refresh:C}}const Fe=768;function I(a){return a?new Date(a).toLocaleString():""}function ye(a){return a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(a>=10*1024?0:1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`}function Te(a,l=200){return a.length<=l?a:`${a.substring(0,l)}…`}function Ee({document:a,renderMarkdown:l,onToggleMarkdown:f}){const{t}=B("app"),[c,j]=s.useState(!1),o=Te(a.content),x=a.content.length>200;return e.jsxs("div",{className:"document-card",children:[e.jsxs("div",{className:"document-card-header",children:[e.jsxs("div",{className:"document-card-key",children:[e.jsx(L,{size:14}),e.jsx("span",{className:"document-card-key-text",children:a.key}),e.jsxs("span",{className:"document-card-revision-badge",children:["v",a.revision]})]}),e.jsx("div",{className:"document-card-actions",children:e.jsx("button",{className:"btn btn-sm document-card-expand-btn",onClick:()=>j(i=>!i),title:c?t("documents.collapse","Collapse"):t("documents.expand","Expand"),"aria-label":c?t("documents.collapseContent","Collapse content"):t("documents.expandContent","Expand content"),children:c?e.jsx(Ne,{size:14}):e.jsx(Z,{size:14})})})]}),e.jsxs("div",{className:"document-card-meta",children:[e.jsx("span",{className:"document-card-author",children:a.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:I(a.updatedAt)})]}),e.jsxs("div",{className:`document-card-content${c?" document-card-content--expanded":""}`,children:[c?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"document-card-content-header",children:e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:f,"aria-label":l?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":l,title:l?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:l?t("documents.markdown","Markdown"):t("documents.plain","Plain")})}),l?e.jsx("div",{className:"document-card-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(Y,{remarkPlugins:[J],children:a.content})})}):e.jsx("pre",{className:"document-card-content-text",children:a.content})]}):e.jsx("p",{className:"document-card-preview",children:o}),x&&!c&&e.jsx("p",{className:"document-card-preview-truncated",children:"…"})]})]})}function Pe({taskId:a,taskTitle:l,documents:f,onOpenTask:t,renderMarkdownStates:c,onToggleMarkdown:j}){const{t:o}=B("app"),[x,i]=s.useState(!1);return e.jsxs("div",{className:"documents-group",children:[e.jsxs("div",{className:"documents-group-header",children:[e.jsxs("button",{className:"documents-group-toggle-btn",onClick:()=>i(u=>!u),"aria-expanded":x,"aria-label":`${x?o("documents.collapse","Collapse"):o("documents.expand","Expand")} documents for task ${a}`,children:[e.jsx("span",{className:"documents-group-toggle","aria-hidden":"true",children:x?e.jsx(Z,{size:16}):e.jsx(ve,{size:16})}),e.jsx("span",{className:"documents-group-task-id",children:a}),e.jsx("span",{className:"documents-group-task-title",children:l||o("documents.untitled","Untitled")})]}),e.jsx("span",{className:"documents-group-count",children:o("documents.docCount","{{count}} doc{{plural}}",{count:f.length,plural:f.length!==1?"s":""})}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>t(a),"aria-label":`Open task ${a}: ${l||o("documents.untitled","Untitled")}`,children:o("documents.openTask","Open task")})]}),x&&e.jsx("div",{className:"documents-group-content",children:f.map(u=>e.jsx(Ee,{document:u,renderMarkdown:c.get(u.id)??!1,onToggleMarkdown:()=>j(u.id)},u.id))})]})}function He({projectId:a,addToast:l,onOpenDetail:f}){const{t}=B("app"),[c,j]=s.useState("project"),[o,x]=s.useState(""),[i,u]=s.useState(null),[m,C]=s.useState(!1),[F,p]=s.useState(null),[g,h]=s.useState(!1),[y,w]=s.useState(null),[T,D]=s.useState(!1),E=s.useRef(0),k=s.useRef(!1),[S,R]=s.useState(!1),[P,M]=s.useState(new Map),z=c==="tasks"?o.trim():"",{documents:v,loading:A,error:ee,refresh:O}=Ce({projectId:a,searchQuery:z||void 0,includeProjectFiles:!1}),{files:N,loading:H,error:te,refresh:U}=Se(a,{showHidden:m});s.useEffect(()=>{const n=()=>{D(window.innerWidth<=Fe)};return n(),window.addEventListener("resize",n),()=>{window.removeEventListener("resize",n)}},[]),s.useEffect(()=>{k.current=!1,j("project"),u(null),C(!1),p(null),w(null),h(!1),R(!1),M(new Map)},[a]),s.useEffect(()=>{k.current||A||H||(N.length>0?j("project"):v.length>0&&j("tasks"),k.current=!0)},[v.length,A,N.length,H]);const $=s.useMemo(()=>{const n=new Map;for(const r of v){const d=n.get(r.taskId)||[];n.set(r.taskId,[...d,r])}return Array.from(n.entries()).map(([r,d])=>{const b=[...d].sort((ie,de)=>de.updatedAt.localeCompare(ie.updatedAt));return{taskId:r,taskTitle:b[0]?.taskTitle,documents:b,latestUpdated:b[0]?.updatedAt??""}}).sort((r,d)=>d.latestUpdated.localeCompare(r.latestUpdated))},[v]),q=s.useMemo(()=>{const n=o.trim().toLowerCase();return n?N.filter(r=>{const d=r.path.toLowerCase(),b=r.name.toLowerCase();return d.includes(n)||b.includes(n)}):N},[N,o]);s.useEffect(()=>{if(!i)return;N.some(r=>r.path===i.path)||(u(null),p(null),w(null),h(!1))},[N,i]);const se=s.useCallback(n=>{x(n.target.value)},[]),ne=s.useCallback(()=>{x("")},[]),_=s.useCallback(n=>{j(n)},[]),ae=s.useCallback(async n=>{try{const r=await pe(n,a);f(r)}catch{l(`Failed to open task ${n}`,"error")}},[a,f,l]),ce=s.useCallback(async n=>{u(n),h(!0),w(null),p(null);const r=E.current+1;E.current=r;try{const d=await fe("project",n.path,a);if(E.current!==r)return;p(d.content)}catch(d){if(E.current!==r)return;const b=d instanceof Error?d.message:`Failed to open ${n.path}`;w(b),l(b,"error")}finally{E.current===r&&h(!1)}},[a,l]),re=s.useCallback(()=>{u(null),p(null),w(null),h(!1)},[]),oe=s.useCallback(n=>{M(r=>{const d=new Map(r),b=d.get(n)??!1;return d.set(n,!b),d})},[]),Q=c==="project"?te:ee,le=s.useCallback(async()=>{if(c==="project"){await U();return}await O()},[c,U,O]),K=c==="project"?q.length:v.length,W=c==="project"?t("documents.searchProjectFiles","Search project markdown files…"):t("documents.searchTaskDocuments","Search task documents…");return e.jsxs("div",{className:"documents-view",children:[e.jsxs("div",{className:"documents-view-header",children:[e.jsxs("div",{className:"documents-view-title-row",children:[e.jsxs("h2",{className:"documents-view-title",children:[e.jsx(L,{size:20}),t("documents.title","Documents")]}),e.jsx("span",{className:"documents-view-count",children:t("documents.resultCount","{{count}} result{{plural}}",{count:K,plural:K!==1?"s":""})})]}),e.jsxs("div",{className:"documents-controls-row",children:[e.jsxs("div",{className:"documents-tab-bar",role:"tablist","aria-label":"Documents sections",children:[e.jsxs("button",{className:`btn documents-tab${c==="project"?" active":""}`,role:"tab","aria-selected":c==="project","aria-label":t("documents.showProjectFiles","Show project markdown files"),onClick:()=>_("project"),children:[t("documents.projectFilesTab","Project Files"),e.jsx("span",{className:"documents-tab-count",children:N.length})]}),e.jsxs("button",{className:`btn documents-tab${c==="tasks"?" active":""}`,role:"tab","aria-selected":c==="tasks","aria-label":t("documents.showTaskDocuments","Show task documents"),onClick:()=>_("tasks"),children:[t("documents.taskDocumentsTab","Task Documents"),e.jsx("span",{className:"documents-tab-count",children:$.length})]})]}),c==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>C(n=>!n),"aria-pressed":m,"aria-label":m?t("documents.hideHidden","Hide hidden project files"):t("documents.showHidden","Show hidden project files"),title:m?t("documents.hideHiddenFiles","Hide hidden files"):t("documents.showHiddenFiles","Show hidden files"),children:[m?e.jsx(je,{size:14}):e.jsx(xe,{size:14}),m?t("documents.hideHiddenLabel","Hide Hidden"):t("documents.showHiddenLabel","Show Hidden")]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(we,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:W,value:o,onChange:se,"aria-label":W}),o&&e.jsx("button",{className:"documents-search-clear",onClick:ne,"aria-label":t("documents.clearSearch","Clear search"),children:e.jsx(ke,{size:16})})]})]})]}),e.jsx("div",{className:"documents-view-content",children:Q?e.jsxs("div",{className:"documents-view-error",children:[e.jsx("p",{children:t("documents.failedToLoad","Failed to load {{type}}: {{error}}",{type:c==="project"?t("documents.projectFiles","project files"):t("documents.taskDocuments","task documents"),error:Q})}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void le(),"aria-label":t("documents.retryLoading","Retry loading documents"),children:[e.jsx(ge,{size:16}),t("documents.retry","Retry")]})]}):c==="project"?H&&N.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:t("documents.loadingProjectFiles","Loading project markdown files…")})}):q.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsx("p",{children:t("documents.noMatchProject",'No project markdown files match "{{query}}".',{query:o.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(L,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noMarkdownFiles","No Markdown files found in this project.")})]})}):e.jsxs("div",{className:`documents-project-layout${T?" documents-project-layout--mobile":""}`,children:[(!T||!i)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":"Project markdown files",children:e.jsx("ul",{className:"markdown-file-list",children:q.map(n=>{const r=i?.path===n.path;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item${r?" markdown-file-item--selected":""}`,onClick:()=>void ce(n),"aria-label":`Open ${n.path}`,"aria-current":r?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:n.name}),e.jsx("span",{className:"markdown-file-item-path",children:n.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[ye(n.size)," · ",I(n.mtime)]})]})},n.path)})})}),(!T||i)&&e.jsxs("section",{className:"documents-view-main","aria-label":"Project file content preview",children:[T&&i&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:re,"aria-label":t("documents.backToFilesList","Back to project files list"),children:[e.jsx(be,{size:14}),t("documents.backToFiles","Back to files")]}),i?e.jsxs("div",{className:"documents-content-viewer",children:[e.jsxs("div",{className:"documents-content-header",children:[e.jsx("p",{className:"documents-file-path-header",children:i.path}),e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>R(n=>!n),"aria-label":S?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":S,title:S?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:S?t("documents.markdown","Markdown"):t("documents.plain","Plain")})]}),g?e.jsx("p",{className:"documents-content-state",children:t("documents.loadingFileContent","Loading file content…")}):y?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:y}):S?e.jsx("div",{className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(Y,{remarkPlugins:[J],children:F??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text",children:F??""})]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:t("documents.selectFile","Select a Markdown file to view its content.")})})]})]}):A&&v.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:t("documents.loadingTaskDocuments","Loading task documents…")})}):$.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsx("p",{children:t("documents.noMatchTask",'No task documents match "{{query}}".',{query:o.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(L,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noTaskDocuments","No task documents yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:t("documents.documentsCreatedIn","Documents are created in task detail tabs.")})]})}):e.jsx("div",{className:"documents-task-list-wrap",children:e.jsx("div",{className:"documents-view-list",children:$.map(({taskId:n,taskTitle:r,documents:d})=>e.jsx(Pe,{taskId:n,taskTitle:r,documents:d,onOpenTask:ae,renderMarkdownStates:P,onToggleMarkdown:oe},n))})})})]})}export{He as DocumentsView};
|
|
1
|
+
import{r as s,j as e}from"./vendor-react-D37HfzIf.js";import{a7 as G,a8 as X,a9 as ue,aa as me,ab as V,ac as he,f as pe,ad as fe,F as L,ae as je,af as xe,S as we,X as ke,R as ge,ag as be,ah as Y,ai as J,a as Z,b as ve,aj as Ne}from"./index-CpTBp1RG.js";import{u as B}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";function Ce(a){const{projectId:l,searchQuery:f,includeProjectFiles:t=!0}=a??{},c=l?`${ue.DOCUMENTS_PREFIX}${l}`:null,[j,o]=s.useState(()=>{if(!c)return[];const w=G(c,{maxAgeMs:X});return Array.isArray(w)?w:[]}),[x,i]=s.useState([]),[u,m]=s.useState(()=>j.length===0),[C,F]=s.useState(null),p=s.useRef(null),g=s.useRef(j.length>0),h=s.useRef(null),y=s.useCallback(async()=>{p.current&&p.current.abort();const w=new AbortController;p.current=w;const T=!g.current;T&&m(!0),F(null);const D=me(f?{q:f}:void 0,l),E=t?V(l):Promise.resolve({files:[]}),[k,S]=await Promise.allSettled([D,E]);if(w.signal.aborted)return;let R=null;if(k.status==="fulfilled"){if(o(k.value),c){const P=k.value.length>500?k.value.slice(0,500):k.value;he(c,P,{maxBytes:5e5})}g.current=!0}else R=k.reason instanceof Error?k.reason.message:String(k.reason);if(S.status==="fulfilled"){const P=S.value.files,M=f?.trim().toLowerCase(),z=M?P.filter(v=>v.name.toLowerCase().includes(M)||v.path.toLowerCase().includes(M)):P;i(z)}F(R),T&&m(!1)},[c,t,l,f]);return s.useEffect(()=>{if(!c){g.current=!1,o([]),m(!0);return}const w=G(c,{maxAgeMs:X});Array.isArray(w)?(o(w),g.current=!0,m(!1)):(g.current=!1,o([]),m(!0))},[c]),s.useEffect(()=>(h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{y()},300),()=>{h.current&&clearTimeout(h.current)}),[y]),s.useEffect(()=>(y(),()=>{p.current&&p.current.abort()}),[]),{documents:j,projectFiles:x,loading:u,error:C,refresh:y}}function Se(a,l){const[f,t]=s.useState([]),[c,j]=s.useState(!0),[o,x]=s.useState(null),i=s.useRef(null),u=s.useRef(!1),m=l?.showHidden??!1,C=s.useCallback(async F=>{i.current&&i.current.abort();const p=new AbortController;i.current=p;const g=!u.current;g&&j(!0),x(null);try{const h=await V(a,{showHidden:F?.showHidden??m});if(p.signal.aborted)return;t(h.files),u.current=!0}catch(h){if(p.signal.aborted)return;x(h instanceof Error?h.message:String(h))}finally{!p.signal.aborted&&g&&j(!1)}},[a,m]);return s.useEffect(()=>(u.current=!1,C({showHidden:m}),()=>{i.current&&i.current.abort()}),[C,m]),{files:f,loading:c,error:o,refresh:C}}const Fe=768;function I(a){return a?new Date(a).toLocaleString():""}function ye(a){return a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(a>=10*1024?0:1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`}function Te(a,l=200){return a.length<=l?a:`${a.substring(0,l)}…`}function Ee({document:a,renderMarkdown:l,onToggleMarkdown:f}){const{t}=B("app"),[c,j]=s.useState(!1),o=Te(a.content),x=a.content.length>200;return e.jsxs("div",{className:"document-card",children:[e.jsxs("div",{className:"document-card-header",children:[e.jsxs("div",{className:"document-card-key",children:[e.jsx(L,{size:14}),e.jsx("span",{className:"document-card-key-text",children:a.key}),e.jsxs("span",{className:"document-card-revision-badge",children:["v",a.revision]})]}),e.jsx("div",{className:"document-card-actions",children:e.jsx("button",{className:"btn btn-sm document-card-expand-btn",onClick:()=>j(i=>!i),title:c?t("documents.collapse","Collapse"):t("documents.expand","Expand"),"aria-label":c?t("documents.collapseContent","Collapse content"):t("documents.expandContent","Expand content"),children:c?e.jsx(Ne,{size:14}):e.jsx(Z,{size:14})})})]}),e.jsxs("div",{className:"document-card-meta",children:[e.jsx("span",{className:"document-card-author",children:a.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:I(a.updatedAt)})]}),e.jsxs("div",{className:`document-card-content${c?" document-card-content--expanded":""}`,children:[c?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"document-card-content-header",children:e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:f,"aria-label":l?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":l,title:l?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:l?t("documents.markdown","Markdown"):t("documents.plain","Plain")})}),l?e.jsx("div",{className:"document-card-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(Y,{remarkPlugins:[J],children:a.content})})}):e.jsx("pre",{className:"document-card-content-text",children:a.content})]}):e.jsx("p",{className:"document-card-preview",children:o}),x&&!c&&e.jsx("p",{className:"document-card-preview-truncated",children:"…"})]})]})}function Pe({taskId:a,taskTitle:l,documents:f,onOpenTask:t,renderMarkdownStates:c,onToggleMarkdown:j}){const{t:o}=B("app"),[x,i]=s.useState(!1);return e.jsxs("div",{className:"documents-group",children:[e.jsxs("div",{className:"documents-group-header",children:[e.jsxs("button",{className:"documents-group-toggle-btn",onClick:()=>i(u=>!u),"aria-expanded":x,"aria-label":`${x?o("documents.collapse","Collapse"):o("documents.expand","Expand")} documents for task ${a}`,children:[e.jsx("span",{className:"documents-group-toggle","aria-hidden":"true",children:x?e.jsx(Z,{size:16}):e.jsx(ve,{size:16})}),e.jsx("span",{className:"documents-group-task-id",children:a}),e.jsx("span",{className:"documents-group-task-title",children:l||o("documents.untitled","Untitled")})]}),e.jsx("span",{className:"documents-group-count",children:o("documents.docCount","{{count}} doc{{plural}}",{count:f.length,plural:f.length!==1?"s":""})}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>t(a),"aria-label":`Open task ${a}: ${l||o("documents.untitled","Untitled")}`,children:o("documents.openTask","Open task")})]}),x&&e.jsx("div",{className:"documents-group-content",children:f.map(u=>e.jsx(Ee,{document:u,renderMarkdown:c.get(u.id)??!1,onToggleMarkdown:()=>j(u.id)},u.id))})]})}function He({projectId:a,addToast:l,onOpenDetail:f}){const{t}=B("app"),[c,j]=s.useState("project"),[o,x]=s.useState(""),[i,u]=s.useState(null),[m,C]=s.useState(!1),[F,p]=s.useState(null),[g,h]=s.useState(!1),[y,w]=s.useState(null),[T,D]=s.useState(!1),E=s.useRef(0),k=s.useRef(!1),[S,R]=s.useState(!1),[P,M]=s.useState(new Map),z=c==="tasks"?o.trim():"",{documents:v,loading:A,error:ee,refresh:O}=Ce({projectId:a,searchQuery:z||void 0,includeProjectFiles:!1}),{files:N,loading:H,error:te,refresh:U}=Se(a,{showHidden:m});s.useEffect(()=>{const n=()=>{D(window.innerWidth<=Fe)};return n(),window.addEventListener("resize",n),()=>{window.removeEventListener("resize",n)}},[]),s.useEffect(()=>{k.current=!1,j("project"),u(null),C(!1),p(null),w(null),h(!1),R(!1),M(new Map)},[a]),s.useEffect(()=>{k.current||A||H||(N.length>0?j("project"):v.length>0&&j("tasks"),k.current=!0)},[v.length,A,N.length,H]);const $=s.useMemo(()=>{const n=new Map;for(const r of v){const d=n.get(r.taskId)||[];n.set(r.taskId,[...d,r])}return Array.from(n.entries()).map(([r,d])=>{const b=[...d].sort((ie,de)=>de.updatedAt.localeCompare(ie.updatedAt));return{taskId:r,taskTitle:b[0]?.taskTitle,documents:b,latestUpdated:b[0]?.updatedAt??""}}).sort((r,d)=>d.latestUpdated.localeCompare(r.latestUpdated))},[v]),q=s.useMemo(()=>{const n=o.trim().toLowerCase();return n?N.filter(r=>{const d=r.path.toLowerCase(),b=r.name.toLowerCase();return d.includes(n)||b.includes(n)}):N},[N,o]);s.useEffect(()=>{if(!i)return;N.some(r=>r.path===i.path)||(u(null),p(null),w(null),h(!1))},[N,i]);const se=s.useCallback(n=>{x(n.target.value)},[]),ne=s.useCallback(()=>{x("")},[]),_=s.useCallback(n=>{j(n)},[]),ae=s.useCallback(async n=>{try{const r=await pe(n,a);f(r)}catch{l(`Failed to open task ${n}`,"error")}},[a,f,l]),ce=s.useCallback(async n=>{u(n),h(!0),w(null),p(null);const r=E.current+1;E.current=r;try{const d=await fe("project",n.path,a);if(E.current!==r)return;p(d.content)}catch(d){if(E.current!==r)return;const b=d instanceof Error?d.message:`Failed to open ${n.path}`;w(b),l(b,"error")}finally{E.current===r&&h(!1)}},[a,l]),re=s.useCallback(()=>{u(null),p(null),w(null),h(!1)},[]),oe=s.useCallback(n=>{M(r=>{const d=new Map(r),b=d.get(n)??!1;return d.set(n,!b),d})},[]),Q=c==="project"?te:ee,le=s.useCallback(async()=>{if(c==="project"){await U();return}await O()},[c,U,O]),K=c==="project"?q.length:v.length,W=c==="project"?t("documents.searchProjectFiles","Search project markdown files…"):t("documents.searchTaskDocuments","Search task documents…");return e.jsxs("div",{className:"documents-view",children:[e.jsxs("div",{className:"documents-view-header",children:[e.jsxs("div",{className:"documents-view-title-row",children:[e.jsxs("h2",{className:"documents-view-title",children:[e.jsx(L,{size:20}),t("documents.title","Documents")]}),e.jsx("span",{className:"documents-view-count",children:t("documents.resultCount","{{count}} result{{plural}}",{count:K,plural:K!==1?"s":""})})]}),e.jsxs("div",{className:"documents-controls-row",children:[e.jsxs("div",{className:"documents-tab-bar",role:"tablist","aria-label":"Documents sections",children:[e.jsxs("button",{className:`btn documents-tab${c==="project"?" active":""}`,role:"tab","aria-selected":c==="project","aria-label":t("documents.showProjectFiles","Show project markdown files"),onClick:()=>_("project"),children:[t("documents.projectFilesTab","Project Files"),e.jsx("span",{className:"documents-tab-count",children:N.length})]}),e.jsxs("button",{className:`btn documents-tab${c==="tasks"?" active":""}`,role:"tab","aria-selected":c==="tasks","aria-label":t("documents.showTaskDocuments","Show task documents"),onClick:()=>_("tasks"),children:[t("documents.taskDocumentsTab","Task Documents"),e.jsx("span",{className:"documents-tab-count",children:$.length})]})]}),c==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>C(n=>!n),"aria-pressed":m,"aria-label":m?t("documents.hideHidden","Hide hidden project files"):t("documents.showHidden","Show hidden project files"),title:m?t("documents.hideHiddenFiles","Hide hidden files"):t("documents.showHiddenFiles","Show hidden files"),children:[m?e.jsx(je,{size:14}):e.jsx(xe,{size:14}),m?t("documents.hideHiddenLabel","Hide Hidden"):t("documents.showHiddenLabel","Show Hidden")]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(we,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:W,value:o,onChange:se,"aria-label":W}),o&&e.jsx("button",{className:"documents-search-clear",onClick:ne,"aria-label":t("documents.clearSearch","Clear search"),children:e.jsx(ke,{size:16})})]})]})]}),e.jsx("div",{className:"documents-view-content",children:Q?e.jsxs("div",{className:"documents-view-error",children:[e.jsx("p",{children:t("documents.failedToLoad","Failed to load {{type}}: {{error}}",{type:c==="project"?t("documents.projectFiles","project files"):t("documents.taskDocuments","task documents"),error:Q})}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void le(),"aria-label":t("documents.retryLoading","Retry loading documents"),children:[e.jsx(ge,{size:16}),t("documents.retry","Retry")]})]}):c==="project"?H&&N.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:t("documents.loadingProjectFiles","Loading project markdown files…")})}):q.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsx("p",{children:t("documents.noMatchProject",'No project markdown files match "{{query}}".',{query:o.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(L,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noMarkdownFiles","No Markdown files found in this project.")})]})}):e.jsxs("div",{className:`documents-project-layout${T?" documents-project-layout--mobile":""}`,children:[(!T||!i)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":"Project markdown files",children:e.jsx("ul",{className:"markdown-file-list",children:q.map(n=>{const r=i?.path===n.path;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item${r?" markdown-file-item--selected":""}`,onClick:()=>void ce(n),"aria-label":`Open ${n.path}`,"aria-current":r?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:n.name}),e.jsx("span",{className:"markdown-file-item-path",children:n.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[ye(n.size)," · ",I(n.mtime)]})]})},n.path)})})}),(!T||i)&&e.jsxs("section",{className:"documents-view-main","aria-label":"Project file content preview",children:[T&&i&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:re,"aria-label":t("documents.backToFilesList","Back to project files list"),children:[e.jsx(be,{size:14}),t("documents.backToFiles","Back to files")]}),i?e.jsxs("div",{className:"documents-content-viewer",children:[e.jsxs("div",{className:"documents-content-header",children:[e.jsx("p",{className:"documents-file-path-header",children:i.path}),e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>R(n=>!n),"aria-label":S?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":S,title:S?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:S?t("documents.markdown","Markdown"):t("documents.plain","Plain")})]}),g?e.jsx("p",{className:"documents-content-state",children:t("documents.loadingFileContent","Loading file content…")}):y?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:y}):S?e.jsx("div",{className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(Y,{remarkPlugins:[J],children:F??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text",children:F??""})]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:t("documents.selectFile","Select a Markdown file to view its content.")})})]})]}):A&&v.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:t("documents.loadingTaskDocuments","Loading task documents…")})}):$.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsx("p",{children:t("documents.noMatchTask",'No task documents match "{{query}}".',{query:o.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(L,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noTaskDocuments","No task documents yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:t("documents.documentsCreatedIn","Documents are created in task detail tabs.")})]})}):e.jsx("div",{className:"documents-task-list-wrap",children:e.jsx("div",{className:"documents-view-list",children:$.map(({taskId:n,taskTitle:r,documents:d})=>e.jsx(Pe,{taskId:n,taskTitle:r,documents:d,onOpenTask:ae,renderMarkdownStates:P,onToggleMarkdown:oe},n))})})})]})}export{He as DocumentsView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as l,j as e}from"./vendor-react-D37HfzIf.js";import{a7 as P,a8 as F,a9 as D,aP as W,aQ as G,ac as V,aR as Q,x as Y,ax as J,R as Z,aB as ee}from"./index-
|
|
1
|
+
import{r as l,j as e}from"./vendor-react-D37HfzIf.js";import{a7 as P,a8 as F,a9 as D,aP as W,aQ as G,ac as V,aR as Q,x as Y,ax as J,R as Z,aB as ee}from"./index-CpTBp1RG.js";import{u as se}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";const ae=300,te=15e3;function B(r){if(!r.trim())return;const s=Number(r);return Number.isFinite(s)?s:void 0}function k(...r){for(const s of r)if(Array.isArray(s))return s;return[]}function p(r){return typeof r=="object"&&r!==null?r:{}}function H(r){const s=p(r),m=p(s.taskSnapshot);return{id:String(s.id??s.evalId??""),runId:String(s.runId??s.batchId??""),taskId:String(s.taskId??m.taskId??""),taskTitle:String(m.title??s.taskTitle??s.title??"Untitled task"),createdAt:String(s.createdAt??s.timestamp??s.updatedAt??new Date(0).toISOString()),overallScore:typeof s.overallScore=="number"?s.overallScore:null,maxScore:typeof s.maxScore=="number"?s.maxScore:null,categoryScores:k(s.categoryScores,p(s.scores).categories)}}function le(r){const s=p(r);return{...H(s),rationale:String(s.rationale??s.summary??""),evidence:k(s.evidence,p(s.details).evidence),followUps:k(s.followUps,p(s.recommendations).followUps)}}function re(r){const s=r?.projectId,m=s??"",t=`${D.EVALS_RUNS_PREFIX}${m}`,h=`${D.EVALS_RESULTS_PREFIX}${m}`,f=P(t,{maxAgeMs:F}),v=P(h,{maxAgeMs:F}),S=l.useRef(Array.isArray(f)&&f.length>0||Array.isArray(v)&&v.length>0),[o,g]=l.useState({q:"",runId:"",scoreMin:"",scoreMax:""}),[A,w]=l.useState(()=>Array.isArray(f)?f:[]),[i,M]=l.useState(()=>Array.isArray(v)?v:[]),[u,N]=l.useState(null),[L,b]=l.useState(null),[a,d]=l.useState(0),[y,j]=l.useState(!S.current),[K,q]=l.useState(null),C=l.useRef(0),z=l.useRef(s),T=l.useRef(u);T.current=u;const I=l.useCallback(async()=>{const n=++C.current;S.current||j(!0),q(null);try{const[c,x]=await Promise.all([W({q:o.q||void 0,runId:o.runId||void 0,scoreMin:B(o.scoreMin),scoreMax:B(o.scoreMax),limit:100,offset:0},s),G(s)]);if(n!==C.current)return;const E=k(c.results,c.evals,c.items).map(H);M(E),V(h,E.length>500?E.slice(0,500):E,{maxBytes:5e5}),d(typeof c.count=="number"?c.count:E.length);const $=k(x.runs,x.items).map(U=>{const R=p(U),O=p(R.counts);return{id:String(R.id??""),createdAt:String(R.createdAt??""),completedAt:typeof R.completedAt=="string"?R.completedAt:void 0,status:String(R.status??"pending"),evaluatedTaskCount:typeof O.totalTasks=="number"?O.totalTasks:0}});w($),V(t,$,{maxBytes:5e5}),S.current=!0,T.current&&!E.some(U=>U.id===T.current)&&(N(null),b(null))}catch(c){if(n!==C.current)return;q(c instanceof Error?c.message:"Failed to load evals")}finally{n===C.current&&j(!1)}},[o.q,o.runId,o.scoreMax,o.scoreMin,s,h,t]),_=l.useCallback(async n=>{const c=await Q(n,s),x=c.result??c;b(le(x))},[s]);l.useEffect(()=>{if(z.current===s)return;z.current=s;const n=P(t,{maxAgeMs:F}),c=P(h,{maxAgeMs:F}),x=Array.isArray(n)&&n.length>0||Array.isArray(c)&&c.length>0;w(Array.isArray(n)?n:[]),M(Array.isArray(c)?c:[]),j(!x),S.current=x},[s,h,t]),l.useEffect(()=>{const n=window.setTimeout(()=>{I()},ae);return()=>window.clearTimeout(n)},[I]),l.useEffect(()=>{if(!u){b(null);return}_(u)},[_,u]),l.useEffect(()=>{const n=window.setInterval(()=>{I(),u&&_(u)},te);return()=>window.clearInterval(n)},[_,I,u]);const X=l.useCallback(n=>{T.current=n,N(n)},[]);return{loading:y,error:K,results:i,count:a,runs:A,filters:o,setFilters:g,refresh:I,selectedEvalId:u,setSelectedEvalId:X,selectedEval:L}}function he({projectId:r,onOpenSettings:s,onOpenTaskDetail:m}){const{t}=se("app"),{loading:h,error:f,results:v,runs:S,filters:o,setFilters:g,selectedEvalId:A,setSelectedEvalId:w,selectedEval:i,refresh:M}=re({projectId:r}),[u,N]=l.useState(!0);l.useEffect(()=>{let a=!1;return Y(r).then(d=>{if(a)return;const y=d.evalSettings?.enabled;N(y??!1)}).catch(()=>{a||N(!1)}),()=>{a=!0}},[r]);const L=v.length>0,b=l.useMemo(()=>v.find(a=>a.id===A)??null,[v,A]);return u?e.jsxs("section",{className:"evals-view","data-testid":"evals-view",children:[e.jsxs("div",{className:"evals-list card",children:[e.jsxs("div",{className:"evals-toolbar",children:[e.jsx("input",{className:"input",placeholder:t("evals.searchPlaceholder","Search task or rationale"),value:o.q,onChange:a=>g(d=>({...d,q:a.target.value}))}),e.jsxs("select",{className:"select",value:o.runId,onChange:a=>g(d=>({...d,runId:a.target.value})),children:[e.jsx("option",{value:"",children:t("evals.allRuns","All runs")}),S.map(a=>e.jsx("option",{value:a.id,children:a.id},a.id))]}),e.jsx("input",{className:"input",placeholder:t("evals.minScorePlaceholder","Min score"),value:o.scoreMin,onChange:a=>g(d=>({...d,scoreMin:a.target.value}))}),e.jsx("input",{className:"input",placeholder:t("evals.maxScorePlaceholder","Max score"),value:o.scoreMax,onChange:a=>g(d=>({...d,scoreMax:a.target.value}))}),e.jsx("button",{className:"btn btn-icon",type:"button",onClick:()=>void M(),"aria-label":t("evals.refreshAria","Refresh evals"),children:e.jsx(Z,{size:16})})]}),h&&e.jsx("p",{className:"evals-state","data-testid":"evals-loading",children:t("evals.loading","Loading evals…")}),f&&e.jsx("p",{className:"evals-state evals-state--error",children:f}),!h&&!f&&!L&&e.jsx("p",{className:"evals-state",children:t("evals.empty","No evals yet. Scheduled evals review tasks completed since the last run.")}),e.jsx("ul",{className:"evals-results","data-testid":"evals-results",children:v.map(a=>e.jsx("li",{children:e.jsxs("button",{className:`evals-result ${a.id===A?"evals-result--active":""}`,type:"button",onClick:()=>w(a.id),children:[e.jsx("span",{className:"evals-result-title",children:a.taskTitle}),e.jsxs("span",{className:"evals-result-meta",children:[a.taskId," · ",a.runId," · ",a.overallScore??t("evals.naPlaceholder","n/a")]})]})},a.id))})]}),e.jsxs("div",{className:"evals-detail card","data-testid":"evals-detail",children:[!i&&e.jsx("p",{className:"evals-state",children:t("evals.selectPrompt","Select an evaluation to inspect scores, rationale, and evidence.")}),i&&e.jsxs(e.Fragment,{children:[e.jsx("h3",{className:"evals-detail-title",children:b?.taskTitle??i.taskTitle}),e.jsxs("p",{className:"evals-result-meta",children:[i.taskId," · ",i.runId]}),e.jsx("p",{className:"evals-score",children:t("evals.overallScore","Overall score: {{score}}",{score:i.overallScore??t("evals.naPlaceholder","n/a")})}),e.jsx("ul",{className:"evals-categories",children:i.categoryScores.map(a=>e.jsxs("li",{children:[a.category,": ",a.finalScore]},a.category))}),e.jsx("p",{className:"evals-rationale",children:i.rationale||t("evals.noRationale","No rationale recorded.")}),e.jsxs("div",{children:[e.jsx("h4",{children:t("evals.evidenceHeading","Evidence")}),e.jsx("ul",{className:"evals-links",children:i.evidence.map((a,d)=>{const y=typeof a.metadata?.taskId=="string"?a.metadata.taskId:void 0,j=typeof a.metadata?.url=="string"?a.metadata.url:void 0;return e.jsx("li",{children:y?e.jsx("button",{type:"button",className:"btn",onClick:()=>m?.(y),children:a.ref}):j?e.jsxs("a",{href:j,target:"_blank",rel:"noreferrer",className:"evals-external-link",children:[a.ref,e.jsx(ee,{size:14})]}):e.jsx("span",{children:a.ref})},`${a.ref}-${d}`)})})]}),e.jsxs("div",{children:[e.jsx("h4",{children:t("evals.suggestedFollowupsHeading","Suggested follow-up tasks")}),e.jsxs("ul",{className:"evals-follow-ups",children:[i.followUps.length===0&&e.jsx("li",{children:t("evals.noFollowups","None")}),i.followUps.map(a=>e.jsxs("li",{children:[e.jsx("strong",{children:a.title}),e.jsx("p",{children:a.rationale})]},a.suggestionId))]})]})]})]})]}):e.jsxs("section",{className:"evals-view card","data-testid":"evals-disabled",children:[e.jsx("h2",{className:"evals-title",children:t("evals.disabledTitle","Scheduled evals are disabled")}),e.jsx("p",{className:"evals-empty-copy",children:t("evals.enablePrompt","Enable Scheduled Evals to review scored tasks, evidence, and follow-up recommendations.")}),e.jsxs("button",{className:"btn btn-primary",type:"button",onClick:()=>s?.("scheduled-evals"),children:[e.jsx(J,{size:16}),t("evals.openSettings","Open Scheduled Evals Settings")]})]})}export{he as EvalsView};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r,j as e}from"./vendor-react-D37HfzIf.js";import{bU as F,cN as V,cO as U,cP as K,cQ as B,cR as Q}from"./index-
|
|
1
|
+
import{r,j as e}from"./vendor-react-D37HfzIf.js";import{bU as F,cN as V,cO as U,cP as K,cQ as B,cR as Q}from"./index-CpTBp1RG.js";import{u as R}from"./vendor-i18n-CV0mwX_-.js";function ve({value:c,onChange:m,projectId:p,disabled:h=!1,id:y,label:x="Skills"}){const{t:g}=R("app"),[n,d]=r.useState([]),[l,b]=r.useState(!0);r.useEffect(()=>{let t=!1;return b(!0),F(p).then(f=>{t||d(f)}).catch(()=>{t||d([])}).finally(()=>{t||b(!1)}),()=>{t=!0}},[p]);const S=t=>{c.includes(t)||m([...c,t])},u=t=>{m(c.filter(f=>f!==t))},k=t=>n.find(E=>E.id===t)?.name??t,j=n.filter(t=>!c.includes(t.id));return e.jsxs("div",{className:"skill-multiselect","data-testid":"skill-multiselect",children:[x&&e.jsx("label",{htmlFor:y?`${y}-select`:void 0,className:"skill-multiselect-label",children:x}),c.length>0&&e.jsx("div",{className:"skill-multiselect-chips","data-testid":"skill-chips",children:c.map(t=>e.jsxs("span",{className:"skill-chip","data-testid":`skill-chip-${t}`,children:[e.jsx("span",{className:"skill-chip-name",children:k(t)}),e.jsx("button",{type:"button",className:"skill-chip-remove",onClick:()=>u(t),disabled:h,"aria-label":g("skills.removeSkill","Remove {{name}}",{name:k(t)}),"data-testid":`remove-skill-${t}`,children:"×"})]},t))}),e.jsx("div",{className:"skill-multiselect-add",children:l?e.jsx("span",{className:"skill-multiselect-loading","data-testid":"skills-loading",children:g("skills.loading","Loading skills…")}):j.length===0?e.jsx("span",{className:"skill-multiselect-empty","data-testid":"skills-empty",children:c.length===0?g("skills.noSkillsDiscovered","No skills discovered"):g("skills.allSkillsSelected","All skills selected")}):e.jsxs("select",{id:y?`${y}-select`:void 0,className:"select skill-multiselect-dropdown",value:"",onChange:t=>{t.target.value&&(S(t.target.value),t.target.value="")},disabled:h,"data-testid":"skill-dropdown",children:[e.jsx("option",{value:"",children:g("skills.addSkill","Add a skill…")}),j.map(t=>e.jsx("option",{value:t.id,children:t.name},t.id))]})})]})}const $=/(?:^|\/)skills\/([^/]+)\/SKILL\.md$/i;function we(c){const m=c.trim();if(!m)return c;const p=m.match($);return p?.[1]?p[1]:m}const G=`# Soul: Chief Executive Officer
|
|
2
2
|
|
|
3
3
|
I am a strategic leader who connects every decision to business outcomes.
|
|
4
4
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as o,j as e}from"./vendor-react-D37HfzIf.js";import{J as it,av as ot,ah as lt,ai as nt,cF as rt,cG as ct}from"./index-
|
|
1
|
+
import{r as o,j as e}from"./vendor-react-D37HfzIf.js";import{J as it,av as ot,ah as lt,ai as nt,cF as rt,cG as ct}from"./index-CpTBp1RG.js";import{u as dt}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";const ut=5,gt=3,mt=280;function H(n){return!!(n&&typeof n=="object"&&"code"in n&&n.code==="ACTIVE_GOAL_LIMIT_EXCEEDED")}function jt({initialGoals:n,anchorGoalId:m}){const{t:a}=dt("app"),[g,h]=o.useState(()=>n??[]),[W,v]=o.useState(null),d=o.useRef(null),[x,C]=o.useState(n===void 0),[T,r]=o.useState(null),[J,A]=o.useState(!1),[f,D]=o.useState(""),[G,j]=o.useState(""),[$,c]=o.useState(null),[k,L]=o.useState(!1),[b,y]=o.useState(!1),[N,F]=o.useState(null),[I,E]=o.useState(""),[O,w]=o.useState(""),[P,p]=o.useState(null),[R,_]=o.useState(!1),[B,X]=o.useState(()=>new Set);o.useEffect(()=>{if(n!==void 0)return;let t=!0;return(async()=>{try{C(!0),r(null);const i=await fetch("/api/goals");if(!i.ok)throw new Error(`Failed to load goals (${i.status})`);const l=await i.json();if(!t)return;h(Array.isArray(l.goals)?l.goals:[])}catch{if(!t)return;r(a("goals.loadError","Unable to load goals right now. Please try again."))}finally{t&&C(!1)}})(),()=>{t=!1}},[n]);const S=o.useMemo(()=>g.filter(t=>t.status==="active").length,[g]),K=S>=gt&&S<=ut;o.useEffect(()=>{if(!m){v(null);return}const t=document.getElementById(`goal-card-${m}`);if(t)return v(m),typeof t.scrollIntoView=="function"&&t.scrollIntoView({behavior:"smooth",block:"center"}),d.current&&clearTimeout(d.current),d.current=setTimeout(()=>{v(s=>s===m?null:s),d.current=null},1600),()=>{d.current&&(clearTimeout(d.current),d.current=null)}},[m,g]);function z(){r(null),c(null),A(!0)}function Q(t){F(t.id),E(t.title),w(t.description??""),p(null)}function M(){F(null),E(""),w(""),p(null)}function U(){A(!1),D(""),j(""),c(null),y(!1)}async function Y(){const t=f.trim();if(!t){c(a("goals.titleRequired","Title is required."));return}try{y(!0),c(null);const s=await rt(t);j(s)}catch(s){c(ct(s))}finally{y(!1)}}async function Z(){const t=f.trim();if(!t){c(a("goals.titleRequired","Title is required."));return}try{L(!0),c(null),r(null);const s=await fetch("/api/goals",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:t,description:G})});if(s.ok){const l=await s.json();h(u=>[...u,l]),U();return}let i=null;try{i=await s.json()}catch{i=null}if(s.status===409&&H(i)){r(a("goals.capError","Cannot activate more than 5 goals. Resolve an active goal before activating another."));return}c(a("goals.createError","Unable to create goal right now. Please try again."))}catch{c(a("goals.createError","Unable to create goal right now. Please try again."))}finally{L(!1)}}async function tt(){if(!N)return;const t=I.trim();if(!t){p(a("goals.titleRequired","Title is required."));return}try{_(!0),p(null);const s=await fetch(`/api/goals/${N}`,{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({title:t,description:O})});if(!s.ok)throw new Error(`Failed to update goal (${s.status})`);const i=await s.json();h(l=>l.map(u=>u.id===i.id?i:u)),M()}catch{p(a("goals.saveError","Unable to save goal right now. Please try again."))}finally{_(!1)}}function et(t){return t.length>mt||t.includes(`
|
|
2
2
|
`)}function at(t){X(s=>{const i=new Set(s);return i.has(t)?i.delete(t):i.add(t),i})}async function q(t){const s=t.status==="active"?`/api/goals/${t.id}/archive`:`/api/goals/${t.id}/unarchive`;try{r(null);const i=await fetch(s,{method:"POST"});if(i.ok){const u=await i.json();h(st=>st.map(V=>V.id===u.id?u:V));return}let l=null;try{l=await i.json()}catch{l=null}if(i.status===409&&H(l)){r(a("goals.capError","Cannot activate more than 5 goals. Resolve an active goal before activating another."));return}r(a("goals.updateError","Unable to update goal status right now. Please try again."))}catch{r(a("goals.updateError","Unable to update goal status right now. Please try again."))}}return e.jsxs("section",{className:"goals-view","data-testid":"goals-view",children:[e.jsxs("header",{className:"goals-header",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"goals-title",children:a("goals.title","Goals")}),e.jsx("p",{className:"goals-count","data-testid":"goals-active-count",children:a("goals.activeCount","{{count}} active goals",{count:S})})]}),e.jsxs("button",{type:"button",className:"btn btn-primary goals-add-button",onClick:z,"data-testid":"goals-add-button",children:[e.jsx(it,{"aria-hidden":"true"}),a("goals.addGoal","Add Goal")]})]}),J?e.jsxs("div",{className:"card goals-form","data-testid":"goals-form",children:[e.jsx("label",{className:"goals-form-label",htmlFor:"goals-form-title",children:a("goals.labelTitle","Title")}),e.jsx("input",{id:"goals-form-title",className:"input",type:"text",value:f,maxLength:200,onChange:t=>D(t.target.value),"data-testid":"goals-form-title"}),e.jsxs("div",{className:"goals-form-label-row",children:[e.jsx("label",{className:"goals-form-label",htmlFor:"goals-form-description",children:a("goals.labelDescription","Description")}),e.jsxs("button",{type:"button",className:"btn goals-form-draft-button",onClick:()=>void Y(),disabled:!f.trim()||b,"data-testid":"goals-form-draft-ai",children:[e.jsx(ot,{"aria-hidden":"true"}),b?a("goals.drafting","Drafting…"):a("goals.draftWithAi","Draft with AI")]})]}),e.jsx("textarea",{id:"goals-form-description",className:"input",value:G,maxLength:5e3,onChange:t=>j(t.target.value),"data-testid":"goals-form-description"}),$?e.jsx("p",{className:"form-error goals-error",role:"alert",children:$}):null,e.jsxs("div",{className:"goals-form-actions",children:[e.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void Z(),disabled:k||b,"data-testid":"goals-form-submit",children:a("actions.save","Save")}),e.jsx("button",{type:"button",className:"btn",onClick:U,disabled:k||b,"data-testid":"goals-form-cancel",children:a("actions.cancel","Cancel")})]})]}):null,K?e.jsx("p",{className:"goals-warning",role:"status",children:a("goals.capWarning","Approaching the 5-active goal cap. Keep active goals focused.")}):null,T?e.jsx("p",{className:"form-error goals-error",role:"alert","data-testid":"goals-error",children:T}):null,x?e.jsx("p",{className:"goals-loading",role:"status","data-testid":"goals-loading",children:a("goals.loading","Loading goals…")}):null,!x&&g.length===0?e.jsx("div",{className:"goals-empty card","data-testid":"goals-empty-state",children:a("goals.emptyState","No goals yet. Add one to begin tracking strategic outcomes.")}):null,!x&&g.length>0?e.jsx("div",{className:"goals-list","data-testid":"goals-list",children:g.map(t=>e.jsx("article",{id:`goal-card-${t.id}`,className:`card goals-card ${t.status==="archived"?"goals-card-archived":""} ${W===t.id?"goals-card--anchored":""}`.trim(),"data-testid":`goal-card-${t.id}`,children:N===t.id?e.jsxs("div",{className:"goals-card-main goals-card-edit",children:[e.jsx("label",{className:"goals-form-label",htmlFor:`goal-edit-title-${t.id}`,children:a("goals.labelTitle","Title")}),e.jsx("input",{id:`goal-edit-title-${t.id}`,className:"input",type:"text",value:I,maxLength:200,onChange:s=>E(s.target.value),"data-testid":`goal-edit-title-${t.id}`}),e.jsx("label",{className:"goals-form-label",htmlFor:`goal-edit-description-${t.id}`,children:a("goals.labelDescription","Description")}),e.jsx("textarea",{id:`goal-edit-description-${t.id}`,className:"input",value:O,maxLength:5e3,onChange:s=>w(s.target.value),"data-testid":`goal-edit-description-${t.id}`}),P?e.jsx("p",{className:"form-error goals-error",role:"alert",children:P}):null,e.jsxs("div",{className:"goals-card-actions",children:[e.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void tt(),disabled:R,"data-testid":`goal-edit-save-${t.id}`,children:a("actions.save","Save")}),e.jsx("button",{type:"button",className:"btn",onClick:M,disabled:R,"data-testid":`goal-edit-cancel-${t.id}`,children:a("actions.cancel","Cancel")})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"goals-card-main",children:[e.jsx("h3",{className:"goals-card-title",children:t.title}),t.description?(()=>{const s=et(t.description),i=B.has(t.id);return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:`markdown-body goals-card-description ${s&&!i?"goals-card-description-collapsed":""}`.trim(),children:e.jsx(lt,{remarkPlugins:[nt],children:t.description})}),s?e.jsx("button",{type:"button",className:"btn goals-card-description-toggle","aria-expanded":i,"data-testid":`goal-description-toggle-${t.id}`,onClick:()=>at(t.id),children:i?a("actions.showLess","Show less"):a("actions.showMore","Show more")}):null]})})():null,e.jsxs("p",{className:"goals-card-status",children:[a("goals.status","Status"),": ",t.status]})]}),e.jsxs("div",{className:"goals-card-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:()=>Q(t),"data-testid":`goal-edit-${t.id}`,children:a("actions.edit","Edit")}),t.status==="active"?e.jsx("button",{type:"button",className:"btn goals-activate-button",onClick:()=>void q(t),"data-testid":`goal-archive-${t.id}`,children:a("goals.archive","Archive")}):e.jsx("button",{type:"button",className:"btn goals-activate-button",onClick:()=>void q(t),"data-testid":`goal-unarchive-${t.id}`,children:a("goals.unarchive","Unarchive")})]})]})},t.id))}):null]})}export{jt as GoalsView};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as c,j as e}from"./vendor-react-D37HfzIf.js";import{c as ze,a7 as ce,a8 as Se,a9 as ke,ak as Ce,al as We,ac as je,am as Ke,an as Ye,ao as Ve,ap as Je,aq as Qe,ar as Ze,as as Me,at as es,i as ss,au as Ae,av as I,A as ts,X as Ie,aw as me,R as N,ax as is,m as ns,C as _e,ay as le,az as Ne,aA as as,J as Le,aB as rs,aC as De,aD as cs}from"./index-
|
|
1
|
+
import{r as c,j as e}from"./vendor-react-D37HfzIf.js";import{c as ze,a7 as ce,a8 as Se,a9 as ke,ak as Ce,al as We,ac as je,am as Ke,an as Ye,ao as Ve,ap as Je,aq as Qe,ar as Ze,as as Me,at as es,i as ss,au as Ae,av as I,A as ts,X as Ie,aw as me,R as N,ax as is,m as ns,C as _e,ay as le,az as Ne,aA as as,J as Le,aB as rs,aC as De,aD as cs}from"./index-CpTBp1RG.js";import{u as Pe}from"./vendor-i18n-CV0mwX_-.js";import{U as Ee}from"./users-DO_t3V1p.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.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,2 +1,2 @@
|
|
|
1
|
-
import{r,j as e}from"./vendor-react-D37HfzIf.js";import{u as Ie}from"./SettingsModal-
|
|
1
|
+
import{r,j as e}from"./vendor-react-D37HfzIf.js";import{u as Ie}from"./SettingsModal-Nw5cTKAK.js";import{bZ as Ee,b_ as Me,b$ as Re,y as qe,c0 as Te,c1 as Pe,c2 as We,c3 as we,c4 as Ae,c5 as He,c6 as _e,c7 as Oe,c8 as Fe,c9 as Ue,x as Qe,ca as $e,L as A,cb as De}from"./index-CpTBp1RG.js";import{u as Be}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";const Q=".fusion/memory/MEMORY.md",Ve=5e4,Ye="0 3 * * *",Ge="0 4 * * *";function ue(i){return{memoryEnabled:i.memoryEnabled!==!1,memoryAutoSummarizeEnabled:i.memoryAutoSummarizeEnabled??!1,memoryAutoSummarizeThresholdChars:i.memoryAutoSummarizeThresholdChars??Ve,memoryAutoSummarizeSchedule:i.memoryAutoSummarizeSchedule??Ye,memoryDreamsEnabled:i.memoryDreamsEnabled??!1,memoryDreamsSchedule:i.memoryDreamsSchedule??Ge}}function ze(i,t){return i.some(s=>s.path===t)?t:i.find(s=>s.path===Q)?.path??i[0]?.path??Q}function Ze(i={}){const{projectId:t}=i,[s,h]=r.useState(""),[x,F]=r.useState(!0),[M,L]=r.useState(!1),[N,p]=r.useState(!1),[g,n]=r.useState(null),[D,T]=r.useState(!0),[ge,I]=r.useState(!1),[X,f]=r.useState(()=>ue({})),[J,w]=r.useState(!0),[be,ee]=r.useState(!1),[se,d]=r.useState([]),[z,R]=r.useState(!0),[S,l]=r.useState(Q),[P,C]=r.useState(""),[W,y]=r.useState(!1),[$,k]=r.useState(!1),[te,B]=r.useState(!1),[ae,V]=r.useState(!1),[re,H]=r.useState(!1),[xe,j]=r.useState(null),[Y,me]=r.useState(!0),[_,ne]=r.useState(!1),[ie,G]=r.useState(!1),[le,Z]=r.useState(null),{status:oe,loading:ce,refresh:O}=Ie({projectId:t}),b=r.useCallback(m=>{C(m),k(!0)},[]),U=r.useCallback(async m=>{y(!0);try{const{content:o}=await Ee(m,t);l(m),C(o),k(!1)}finally{y(!1)}},[t]),v=r.useCallback(async()=>{R(!0);try{const{files:m}=await Me(t);if(d(m),m.length===0){l(Q),C(""),k(!1);return}const o=ze(m,S);o!==S&&await U(o)}finally{R(!1)}},[t,S,U]);r.useEffect(()=>{let m=!1;async function o(){try{const c=await Ue(t);m||(h(c.content),F(!1))}catch{m||(h(""),F(!1))}}return o(),()=>{m=!0}},[t]),r.useEffect(()=>{let m=!1;async function o(){try{const c=await Ae(t);m||(n(c.content),I(c.exists),T(!1))}catch{m||(n(null),I(!1),T(!1))}}return o(),()=>{m=!0}},[t]),r.useEffect(()=>{let m=!1;async function o(){w(!0);try{const c=await Qe(t);m||f(ue(c))}catch{m||f(ue({}))}finally{m||w(!1)}}return o(),()=>{m=!0}},[t]),r.useEffect(()=>{let m=!1;async function o(){R(!0);try{const{files:c}=await Me(t);if(m)return;if(d(c),c.length===0){l(Q),C(""),k(!1);return}const a=ze(c,S),{content:u}=await Ee(a,t);if(m)return;l(a),C(u),k(!1)}catch{m||(d([]),l(Q),C(""),k(!1))}finally{m||R(!1)}}return o(),()=>{m=!0}},[t,S]),r.useEffect(()=>{let m=!1;async function o(){try{const c=await we(t);m||(j(c),me(!1))}catch{m||(j(null),me(!1))}}return o(),()=>{m=!0}},[t]),r.useEffect(()=>{let m=!1;async function o(){try{const c=await $e(t);m||Z(c)}catch{m||Z(null)}}return o(),()=>{m=!0}},[t]);const pe=r.useCallback(m=>{h(m),L(!0)},[]),de=r.useCallback(async()=>{if(M){p(!0);try{await Re(s,t),L(!1)}finally{p(!1)}}},[s,M,t]),ye=r.useCallback(async m=>{ee(!0);try{const o=await qe(m,t);f(ue(o))}finally{ee(!1)}},[t]),fe=r.useCallback(async m=>{await U(m)},[U]),Se=r.useCallback(async()=>{if($){B(!0);try{await Te(S,P,t),k(!1),await v()}finally{B(!1)}}},[P,$,S,t,v]),je=r.useCallback(async()=>{G(!0);try{const m=await Pe(t);return await O(),m}finally{G(!1)}},[t,O]),ve=r.useCallback(async m=>We(m,t),[t]),K=r.useCallback(async()=>{try{const m=await we(t);j(m)}catch{j(null)}},[t]),q=r.useCallback(async()=>{try{const m=await Ae(t);n(m.content),I(m.exists)}catch{n(null),I(!1)}},[t]),Ne=r.useCallback(async m=>{await He(m,t),await q()},[t,q]),he=r.useCallback(async()=>{V(!0);try{const m=await _e(t);return await Promise.all([q(),K()]),{success:m.success,summary:m.summary}}finally{V(!1)}},[t,q,K]),Ce=r.useCallback(async()=>{H(!0);try{return await Oe(t)}finally{H(!1)}},[t]),ke=r.useCallback(async m=>{ne(!0);try{const o=m?await Fe(m,t):await Fe(t);if(m){const c=o.path??m;l(c),C(o.content),k(!1),await v();return}h(o.content),L(!0)}finally{ne(!1)}},[t,v]);return{workingMemory:s,workingMemoryLoading:x,workingMemoryDirty:M,setWorkingMemory:pe,saveWorkingMemory:de,savingWorkingMemory:N,insightsContent:g,insightsLoading:D,insightsExists:ge,refreshInsights:q,saveInsights:Ne,memorySettings:X,settingsLoading:J,savingMemorySettings:be,saveMemorySettings:ye,memoryFiles:se,memoryFilesLoading:z,selectedFilePath:S,selectedFileContent:P,selectedFileLoading:W,selectedFileDirty:$,setSelectedFileContent:b,selectFile:fe,saveSelectedFile:Se,savingSelectedFile:te,reloadMemoryFiles:v,backendStatus:oe,backendLoading:ce,extractInsights:he,extracting:ae,triggerDreamNow:Ce,dreamRunning:re,auditReport:xe,auditLoading:Y,refreshAudit:K,compactMemory:ke,compacting:_,installQmdAction:je,installingQmd:ie,testRetrieval:ve,stats:le}}const Ke={Patterns:"pattern",Principles:"principle",Conventions:"convention",Pitfalls:"pitfall",Context:"context"},Xe=72;function Je(i,t){if(i.length<=t)return i;const s=Math.max(1,t-1),h=Math.ceil(s/2),x=Math.floor(s/2);return`${i.slice(0,h)}…${i.slice(i.length-x)}`}function es(i){const t=`${i.label} — ${i.path}`;return Je(t,Xe)}function ss(i){if(!i)return[];const t=[],s=i.split(/(?=^## )/m);for(const h of s){const x=h.trim();if(!x)continue;const F=x.match(/^##\s+(.+?)(\n|$)/);if(F){const M=F[1].trim(),L=Ke[M]??M.toLowerCase(),N=x.slice(F[0].length).trim(),p=N.split(`
|
|
2
2
|
`).map(g=>g.replace(/^-\s+/,"").trim()).filter(g=>g.length>0&&(g.startsWith("- ")||g.startsWith("* ")));(p.length>0||N.length>0)&&t.push({name:M,key:L,items:p.length>0?p:N.length>0?[N]:[],expanded:!0})}}return t}function ts(i){if(!i)return null;const t=i.match(/##\s+Last\s+Updated:\s*(\d{4}-\d{2}-\d{2})/i);return t?t[1]:null}function as(i){return i.reduce((t,s)=>t+s.items.length,0)}function ds({projectId:i,addToast:t}){const{t:s}=Be("app"),[h,x]=r.useState("working"),[F,M]=r.useState(new Set),[L,N]=r.useState(!1),[p,g]=r.useState(null),[n,D]=r.useState({memoryEnabled:!0,memoryAutoSummarizeEnabled:!1,memoryAutoSummarizeThresholdChars:5e4,memoryAutoSummarizeSchedule:"0 3 * * *",memoryDreamsEnabled:!1,memoryDreamsSchedule:"0 4 * * *"}),[T,ge]=r.useState(""),[I,X]=r.useState(!1),[f,J]=r.useState(null),{insightsContent:w,insightsLoading:be,insightsExists:ee,saveInsights:se,memorySettings:d,settingsLoading:z,saveMemorySettings:R,savingMemorySettings:S,backendStatus:l,backendLoading:P,extractInsights:C,extracting:W,auditReport:y,auditLoading:$,refreshAudit:k,compactMemory:te,compacting:B,installQmdAction:ae,installingQmd:V,testRetrieval:re,memoryFiles:H,memoryFilesLoading:xe,selectedFilePath:j,selectedFileContent:Y,selectedFileLoading:me,selectedFileDirty:_,setSelectedFileContent:ne,selectFile:ie,saveSelectedFile:G,savingSelectedFile:le,reloadMemoryFiles:Z,triggerDreamNow:oe,dreamRunning:ce}=Ze({projectId:i});r.useEffect(()=>{D(d)},[d]);const O=r.useMemo(()=>n.memoryEnabled!==d.memoryEnabled||n.memoryAutoSummarizeEnabled!==d.memoryAutoSummarizeEnabled||n.memoryAutoSummarizeThresholdChars!==d.memoryAutoSummarizeThresholdChars||n.memoryAutoSummarizeSchedule!==d.memoryAutoSummarizeSchedule||n.memoryDreamsEnabled!==d.memoryDreamsEnabled||n.memoryDreamsSchedule!==d.memoryDreamsSchedule,[n,d]),b=r.useMemo(()=>H.find(a=>a.path===j),[H,j]),U=b?b.layer==="long-term"?s("memory.layerDescLongTerm","Curated durable decisions, conventions, constraints, and pitfalls promoted from dreams."):b.layer==="daily"?s("memory.layerDescDaily","Raw daily observations, open loops, and running context for dream processing."):s("memory.layerDescDreams","Synthesized patterns and open loops promoted from daily memory."):s("memory.editorDefaultDescription","Edits the selected memory file."),v=r.useMemo(()=>ss(w),[w]),pe=r.useMemo(()=>as(v),[v]),de=r.useMemo(()=>ts(w),[w]),ye=r.useCallback(a=>{M(u=>{const E=new Set(u);return E.has(a)?E.delete(a):E.add(a),E})},[]),fe=r.useCallback(async a=>{try{await ie(a)}catch{t(s("memory.loadFileFailed","Failed to load memory file"),"error")}},[ie,t]),Se=r.useCallback(async()=>{try{await G(),t(s("memory.memorySaved","Memory saved"),"success")}catch{t(s("memory.saveMemoryFailed","Failed to save memory"),"error")}},[G,t]),je=r.useCallback(async()=>{if(!O)return;const a={};n.memoryEnabled!==d.memoryEnabled&&(a.memoryEnabled=n.memoryEnabled),n.memoryAutoSummarizeEnabled!==d.memoryAutoSummarizeEnabled&&(a.memoryAutoSummarizeEnabled=n.memoryAutoSummarizeEnabled),n.memoryAutoSummarizeThresholdChars!==d.memoryAutoSummarizeThresholdChars&&(a.memoryAutoSummarizeThresholdChars=n.memoryAutoSummarizeThresholdChars),n.memoryAutoSummarizeSchedule!==d.memoryAutoSummarizeSchedule&&(a.memoryAutoSummarizeSchedule=n.memoryAutoSummarizeSchedule),n.memoryDreamsEnabled!==d.memoryDreamsEnabled&&(a.memoryDreamsEnabled=n.memoryDreamsEnabled),n.memoryDreamsSchedule!==d.memoryDreamsSchedule&&(a.memoryDreamsSchedule=n.memoryDreamsSchedule);try{await R(a),t(s("memory.settingsSaved","Memory settings saved"),"success")}catch{t(s("memory.saveSettingsFailed","Failed to save memory settings"),"error")}},[O,n,d,R,t]),ve=r.useCallback(async()=>{try{const a=await ae();t(a.qmdAvailable?s("memory.qmdInstallSuccess","qmd installed successfully"):s("memory.qmdInstallUnavailable","qmd install finished, but qmd is still unavailable"),a.qmdAvailable?"success":"info")}catch{t(s("memory.installQmdFailed","Failed to install qmd"),"error")}},[ae,t]),K=r.useCallback(async()=>{X(!0),J(null);try{const a=await re(T);J(a),t(a.qmdAvailable?s("memory.retrievalTestComplete","Memory retrieval test complete"):s("memory.retrievalTestFallback","qmd is not installed; local fallback was used"),a.qmdAvailable?"success":"info")}catch{t(s("memory.retrievalTestFailed","Failed to test memory retrieval"),"error")}finally{X(!1)}},[T,re,t]),q=r.useCallback(async()=>{try{await oe(),t(s("memory.dreamProcessingComplete","Dream processing completed"),"success"),await Z()}catch(a){t(a instanceof Error?a.message:s("memory.dreamProcessingFailed","Failed to run dream processing"),"error")}},[oe,Z,t]),Ne=r.useCallback(async()=>{try{await te(j),t(s("memory.fileCompacted","Memory file compacted"),"success")}catch{t(s("memory.compactFailed","Failed to compact memory"),"error")}},[te,j,t]),he=r.useCallback(async()=>{try{const a=await C();t(a.summary,"success")}catch(a){t(a instanceof Error?a.message:s("memory.extractInsightsFailed","Failed to extract insights"),"error")}},[C,t]),Ce=r.useCallback(async()=>{if(p!==null)try{await se(p),N(!1),g(null),t(s("memory.insightsSaved","Insights saved"),"success")}catch{t(s("memory.saveInsightsFailed","Failed to save insights"),"error")}},[p,se,t]),ke=r.useCallback(()=>{g(w??""),N(!0)},[w]),m=r.useCallback(()=>{N(!1),g(null)},[]),o=!P&&l!==null,c=l?.capabilities?.writable??!1;return e.jsxs("div",{className:"memory-view",children:[e.jsx("div",{className:"memory-view-header",children:e.jsxs("div",{children:[e.jsx("h2",{children:s("memory.title","Memory")}),e.jsx("p",{className:"memory-view-description",children:s("memory.description","Working memory, long-term insights, and engine status")})]})}),e.jsxs("div",{className:"memory-view-tabs",role:"tablist",children:[e.jsx("button",{type:"button",role:"tab","aria-selected":h==="working",className:`memory-view-tab${h==="working"?" memory-view-tab--active":""}`,onClick:()=>x("working"),"data-testid":"memory-tab-working",children:s("memory.tabWorking","Working Memory")}),e.jsx("button",{type:"button",role:"tab","aria-selected":h==="insights",className:`memory-view-tab${h==="insights"?" memory-view-tab--active":""}`,onClick:()=>x("insights"),"data-testid":"memory-tab-insights",children:s("memory.tabInsights","Insights")}),e.jsx("button",{type:"button",role:"tab","aria-selected":h==="engines",className:`memory-view-tab${h==="engines"?" memory-view-tab--active":""}`,onClick:()=>x("engines"),"data-testid":"memory-tab-engines",children:s("memory.tabEngines","Engines")})]}),e.jsxs("div",{className:"memory-view-content",children:[h==="working"&&e.jsxs("div",{className:"memory-working-tab",children:[o&&!c&&e.jsx("div",{className:"memory-readonly-banner",children:s("memory.readOnlyBanner","This memory backend is read-only. Changes cannot be saved.")}),xe||me?e.jsxs("div",{className:"memory-empty-state",children:[e.jsx(A,{size:20,className:"animate-spin"}),e.jsx("span",{children:s("memory.loadingFile","Loading memory file…")})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"memory-editor-section",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"memoryViewFilePath",children:s("memory.fileLabel","Memory File")}),e.jsx("select",{id:"memoryViewFilePath",className:"select",value:j,onChange:a=>{fe(a.target.value)},disabled:_,children:H.map(a=>e.jsx("option",{value:a.path,title:`${a.label} — ${a.path}`,children:es(a)},a.path))}),e.jsx("small",{children:_?s("memory.fileSwitchDirtyHint","Save or discard the current edits before switching files."):s("memory.fileSwitchHint","Choose any project memory file to view or edit.")})]}),b&&e.jsxs("div",{className:"memory-file-summary",children:[e.jsx("span",{children:b.layer==="long-term"?s("memory.layerLongTerm","Long-term"):b.layer==="daily"?s("memory.layerDaily","Daily"):s("memory.layerDreams","Dreams")}),e.jsx("strong",{children:b.path}),e.jsx("small",{children:s("memory.fileSummary","{{size}} bytes · updated {{updatedAt}}",{size:b.size.toLocaleString(),updatedAt:new Date(b.updatedAt).toLocaleString()})})]}),e.jsxs("div",{className:"form-group memory-editor-form-group",children:[e.jsx("label",{children:b?.label||s("memory.editorLabel","Memory Editor")}),e.jsx("small",{children:U}),e.jsx("div",{className:"memory-editor-container",children:e.jsx(De,{content:Y,onChange:ne,readOnly:!c,filePath:j})})]})]}),e.jsxs("div",{className:"memory-action-bar",children:[e.jsx("span",{className:"memory-char-count",children:s("memory.charCount","{{count}} characters",{count:Y.length})}),e.jsx("div",{className:"memory-flex-spacer"}),c&&Y.length>0&&e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:Ne,disabled:B||_,children:B?e.jsxs(e.Fragment,{children:[e.jsx(A,{size:14,className:"animate-spin"}),s("memory.compacting","Compacting…")]}):s("memory.compactSelectedFile","Compact Selected File")}),_&&c&&e.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Se,disabled:le,children:le?e.jsxs(e.Fragment,{children:[e.jsx(A,{size:14,className:"animate-spin"}),s("memory.saving","Saving…")]}):s("memory.save","Save")})]}),e.jsxs("div",{className:"memory-config-section",children:[e.jsxs("div",{className:"memory-settings-group",children:[e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:"memoryDreamsEnabled",className:"checkbox-label",children:[e.jsx("input",{id:"memoryDreamsEnabled",type:"checkbox",checked:n.memoryDreamsEnabled,onChange:a=>{D(u=>({...u,memoryDreamsEnabled:a.target.checked}))},disabled:!n.memoryEnabled||z}),s("memory.dreamsEnabledLabel","Process dreams from daily memory")]}),e.jsx("small",{children:s("memory.dreamsEnabledHint","Turns daily notes into DREAMS.md and promotes reusable lessons into MEMORY.md.")})]}),n.memoryEnabled&&n.memoryDreamsEnabled&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"memoryDreamsSchedule",children:s("memory.dreamsScheduleLabel","Dream Schedule")}),e.jsx("input",{id:"memoryDreamsSchedule",type:"text",className:"input",value:n.memoryDreamsSchedule,onChange:a=>{D(u=>({...u,memoryDreamsSchedule:a.target.value}))},placeholder:"0 4 * * *",disabled:z}),e.jsx("small",{children:s("memory.dreamsScheduleHint","Cron expression for dream processing.")})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:q,disabled:ce||!n.memoryDreamsEnabled,children:ce?e.jsxs(e.Fragment,{children:[e.jsx(A,{size:14,className:"animate-spin"}),s("memory.dreaming","Dreaming…")]}):s("memory.dreamNow","Dream Now")}),e.jsx("small",{children:s("memory.dreamNowHint","Manually trigger dream processing now.")})]})]})]}),e.jsxs("div",{className:"memory-settings-group",children:[e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:"memoryAutoSummarizeEnabled",className:"checkbox-label",children:[e.jsx("input",{id:"memoryAutoSummarizeEnabled",type:"checkbox",checked:n.memoryAutoSummarizeEnabled,onChange:a=>{D(u=>({...u,memoryAutoSummarizeEnabled:a.target.checked}))},disabled:!n.memoryEnabled||z}),s("memory.autoSummarizeLabel","Auto-Summarize Memory")]}),e.jsx("small",{children:s("memory.autoSummarizeHint","Automatically compact memory when it exceeds the threshold on a schedule")})]}),n.memoryEnabled&&n.memoryAutoSummarizeEnabled&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"memoryAutoSummarizeThresholdChars",children:s("memory.compactionThresholdLabel","Compaction Threshold (chars)")}),e.jsx("input",{id:"memoryAutoSummarizeThresholdChars",type:"number",className:"input",value:n.memoryAutoSummarizeThresholdChars,onChange:a=>{D(u=>({...u,memoryAutoSummarizeThresholdChars:parseInt(a.target.value,10)||5e4}))},min:1e3,disabled:z}),e.jsx("small",{children:s("memory.compactionThresholdHint","Memory will be compacted when it exceeds this character count")})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"memoryAutoSummarizeSchedule",children:s("memory.autoSummarizeScheduleLabel","Schedule (cron)")}),e.jsx("input",{id:"memoryAutoSummarizeSchedule",type:"text",className:"input",value:n.memoryAutoSummarizeSchedule,onChange:a=>{D(u=>({...u,memoryAutoSummarizeSchedule:a.target.value}))},placeholder:"0 3 * * *",disabled:z}),e.jsx("small",{children:s("memory.autoSummarizeScheduleHint","Cron expression for auto-summarize schedule (default: daily at 3 AM)")})]})]})]}),!n.memoryEnabled&&e.jsx("div",{className:"settings-empty-state memory-status-message",children:s("memory.disabledMessage","Memory is currently disabled. Enable memory tools in Settings to edit these automations.")}),O&&e.jsx("div",{className:"memory-action-bar",children:e.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:je,disabled:S||z,children:S?e.jsxs(e.Fragment,{children:[e.jsx(A,{size:14,className:"animate-spin"}),s("memory.saving","Saving…")]}):s("memory.saveSettings","Save Settings")})})]})]})]}),h==="insights"&&e.jsx("div",{className:"memory-insights-tab",children:be?e.jsxs("div",{className:"memory-empty-state",children:[e.jsx(A,{size:20,className:"animate-spin"}),e.jsx("span",{children:s("memory.loadingInsights","Loading insights…")})]}):L?e.jsxs("div",{className:"memory-insights-editor-layout",children:[e.jsx("div",{className:"memory-editor-container",children:e.jsx(De,{content:p??"",onChange:g,readOnly:!1,filePath:".fusion/memory/INSIGHTS.md"})}),e.jsxs("div",{className:"memory-action-bar",children:[e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:m,children:s("memory.cancel","Cancel")}),e.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Ce,children:s("memory.saveInsights","Save Insights")})]})]}):!ee||v.length===0?e.jsxs("div",{className:"memory-empty-state",children:[e.jsx("p",{children:s("memory.noInsights","No insights extracted yet.")}),e.jsx("p",{children:s("memory.noInsightsHint",'Insights are automatically extracted from working memory. Click "Extract Now" to trigger extraction manually.')}),e.jsx("button",{type:"button",className:"btn btn-primary btn-sm memory-empty-extract-button",onClick:he,disabled:W,children:W?e.jsxs(e.Fragment,{children:[e.jsx(A,{size:14,className:"animate-spin"}),s("memory.extracting","Extracting…")]}):s("memory.extractNow","Extract Now")})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"memory-stats-row",children:[e.jsxs("div",{className:"memory-stat-card",children:[e.jsx("div",{className:"memory-stat-value",children:pe}),e.jsx("div",{className:"memory-stat-label",children:s("memory.totalInsights","Total Insights")})]}),e.jsxs("div",{className:"memory-stat-card",children:[e.jsx("div",{className:"memory-stat-value",children:v.length}),e.jsx("div",{className:"memory-stat-label",children:s("memory.categories","Categories")})]}),de&&e.jsxs("div",{className:"memory-stat-card",children:[e.jsx("div",{className:"memory-stat-value memory-stat-value--updated",children:de}),e.jsx("div",{className:"memory-stat-label",children:s("memory.lastUpdated","Last Updated")})]})]}),e.jsxs("div",{className:"memory-action-bar",children:[e.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:he,disabled:W,children:W?e.jsxs(e.Fragment,{children:[e.jsx(A,{size:14,className:"animate-spin"}),s("memory.extracting","Extracting…")]}):s("memory.extractNow","Extract Now")}),e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:ke,children:s("memory.editRaw","Edit Raw")})]}),e.jsx("div",{className:"memory-categories-list",children:v.map(a=>{const u=!F.has(a.key);return e.jsxs("div",{className:"memory-category-section",children:[e.jsxs("div",{className:"memory-category-header",onClick:()=>ye(a.key),role:"button",tabIndex:0,onKeyDown:E=>{(E.key==="Enter"||E.key===" ")&&(E.preventDefault(),ye(a.key))},children:[e.jsx("h4",{children:a.name}),e.jsx("span",{className:"memory-category-count",children:a.items.length})]}),u&&e.jsx("div",{className:"memory-category-items",children:a.items.map((E,Le)=>e.jsx("div",{className:"memory-insight-item",children:E.replace(/^-\s+/,"").replace(/^\*\s+/,"")},Le))})]},a.key)})})]})}),h==="engines"&&e.jsx("div",{className:"memory-engines-tab",children:P||$?e.jsxs("div",{className:"memory-empty-state",children:[e.jsx(A,{size:20,className:"animate-spin"}),e.jsx("span",{children:s("memory.loadingEngineStatus","Loading engine status…")})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"memory-engine-card memory-qmd-card",children:[e.jsx("h3",{children:s("memory.qmdIntegrationTitle","QMD Integration")}),l?.qmdAvailable===!0?e.jsxs("div",{className:"memory-engine-status",children:[e.jsx("span",{className:"memory-health-badge memory-health-badge--healthy",children:s("memory.qmdInstalled","Installed")}),e.jsx("span",{className:"memory-char-count",children:s("memory.qmdAvailableOnPath","qmd is available on PATH.")})]}):l?.qmdAvailable===!1?e.jsxs("div",{className:"settings-empty-state memory-status-message",children:[e.jsxs("span",{children:[s("memory.qmdNotInstalled","qmd is not installed. Search will use local files. Install indexed retrieval:")," ",e.jsx("code",{children:l.qmdInstallCommand||"bun install -g @tobilu/qmd"})]}),e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:ve,disabled:V,children:V?s("memory.installing","Installing…"):s("memory.installQmd","Install qmd")})]}):e.jsxs("div",{className:"memory-engine-status",children:[e.jsx("span",{className:"memory-health-badge",children:s("memory.qmdChecking","Checking")}),e.jsx("span",{className:"memory-char-count",children:s("memory.qmdCheckingAvailability","Checking qmd availability…")})]}),e.jsxs("div",{className:"memory-capability-row",children:[l?.capabilities?.readable&&e.jsx("span",{className:"memory-capability-badge",children:s("memory.capReadable","Readable")}),l?.capabilities?.writable&&e.jsx("span",{className:"memory-capability-badge",children:s("memory.capWritable","Writable")}),l?.capabilities?.supportsAtomicWrite&&e.jsx("span",{className:"memory-capability-badge",children:s("memory.capAtomicWrites","Atomic Writes")}),l?.capabilities?.persistent&&e.jsx("span",{className:"memory-capability-badge",children:s("memory.capPersistent","Persistent")})]})]}),e.jsxs("div",{className:"memory-engine-card memory-retrieval-card",children:[e.jsx("h3",{children:s("memory.testMemorySearchTitle","Test Memory Search")}),e.jsxs("div",{className:"memory-retrieval-input-row",children:[e.jsx("input",{type:"text",className:"input",value:T,onChange:a=>ge(a.target.value),placeholder:s("memory.searchPlaceholder","Search memory with qmd")}),e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:K,disabled:I,children:I?s("memory.testing","Testing…"):s("memory.testRetrieval","Test Retrieval")})]}),e.jsx("small",{className:"settings-muted",children:s("memory.testSearchHint","Runs the same qmd-backed memory_search path agents use.")}),f&&e.jsxs("div",{className:"memory-test-result",children:[e.jsx("strong",{children:s("memory.testResultCount",'{{count}} result for "{{query}}"',{count:f.results.length,query:f.query,defaultValue_one:'{{count}} result for "{{query}}"',defaultValue_other:'{{count}} results for "{{query}}"'})}),e.jsx("small",{children:s("memory.testResultStatus","qmd {{qmdStatus}} · {{fallbackStatus}}",{qmdStatus:f.qmdAvailable?s("memory.qmdStatusAvailable","available"):s("memory.qmdStatusMissing","missing"),fallbackStatus:f.usedFallback?s("memory.localFallbackUsed","local fallback used"):s("memory.qmdPathUsed","qmd path used")})}),f.results.length>0?e.jsx("ul",{children:f.results.map((a,u)=>e.jsxs("li",{children:[e.jsxs("span",{children:[a.path,":",a.lineStart]}),e.jsx("p",{children:a.snippet})]},`${a.path}-${a.lineStart}-${u}`))}):e.jsx("small",{children:s("memory.noMatchingMemory","No matching memory found.")})]})]}),e.jsxs("div",{className:"memory-engine-card",children:[e.jsx("h3",{children:s("memory.currentBackendTitle","Current Backend")}),e.jsx("div",{className:"memory-engine-status",children:e.jsx("span",{className:"memory-emphasis-text",children:l?.currentBackend==="file"?s("memory.backendFile","File (.fusion/memory/, agent/<agent-name>/memory/)"):l?.currentBackend==="readonly"?s("memory.backendReadonly","Read-Only"):l?.currentBackend==="qmd"?s("memory.backendQmd","QMD (Quantized Memory Distillation)"):l?.currentBackend??"unknown"})}),e.jsxs("div",{className:"memory-capability-row",children:[l?.capabilities?.readable&&e.jsx("span",{className:"memory-capability-badge",children:s("memory.capReadable","Readable")}),l?.capabilities?.writable&&e.jsx("span",{className:"memory-capability-badge",children:s("memory.capWritable","Writable")}),l?.capabilities?.supportsAtomicWrite&&e.jsx("span",{className:"memory-capability-badge",children:s("memory.capAtomicWrites","Atomic Writes")}),l?.capabilities?.persistent&&e.jsx("span",{className:"memory-capability-badge",children:s("memory.capPersistent","Persistent")})]})]}),y&&e.jsxs("div",{className:"memory-engine-card",children:[e.jsxs("div",{className:"memory-health-header",children:[e.jsx("h3",{children:s("memory.healthStatusTitle","Health Status")}),e.jsx("span",{className:`memory-health-badge memory-health-badge--${y.health}`,children:y.health==="healthy"?s("memory.healthHealthy","Healthy"):y.health==="warning"?s("memory.healthWarning","Warning"):s("memory.healthIssues","Issues Found")})]}),e.jsxs("div",{className:"memory-health-grid",children:[e.jsxs("div",{children:[e.jsx("div",{className:"memory-health-label",children:s("memory.workingMemoryLabel","Working Memory")}),e.jsx("div",{className:"memory-emphasis-text",children:s("memory.sizeChars","{{size}} chars",{size:y.workingMemory.size})}),e.jsx("div",{className:"memory-health-detail",children:s("memory.sectionCount","{{count}} sections",{count:y.workingMemory.sectionCount})})]}),e.jsxs("div",{children:[e.jsx("div",{className:"memory-health-label",children:s("memory.insightsMemoryLabel","Insights Memory")}),e.jsx("div",{className:"memory-emphasis-text",children:s("memory.sizeChars","{{size}} chars",{size:y.insightsMemory.size})}),e.jsx("div",{className:"memory-health-detail",children:s("memory.insightCount","{{count}} insights",{count:y.insightsMemory.insightCount})})]})]}),e.jsxs("div",{className:"memory-health-section",children:[e.jsx("div",{className:"memory-health-label",children:s("memory.lastExtractionLabel","Last Extraction")}),e.jsx("div",{className:"memory-emphasis-text",children:y.extraction.success?e.jsx("span",{className:"memory-status-text memory-status-text--success",children:s("memory.extractionSuccess","Success")}):e.jsx("span",{className:"memory-status-text memory-status-text--error",children:s("memory.extractionFailed","Failed")})}),e.jsx("div",{className:"memory-health-detail",children:y.extraction.summary||s("memory.insightsExtracted","{{count}} insights extracted",{count:y.extraction.insightCount})})]}),e.jsxs("div",{className:"memory-health-section",children:[e.jsx("div",{className:"memory-health-label",children:s("memory.pruningLabel","Pruning")}),e.jsx("div",{className:"memory-emphasis-text",children:y.pruning.applied?e.jsx("span",{className:"memory-status-text memory-status-text--warning",children:s("memory.pruningApplied","Applied")}):e.jsx("span",{className:"memory-status-text memory-status-text--muted",children:s("memory.pruningNotNeeded","Not needed")})}),y.pruning.applied&&e.jsx("div",{className:"memory-health-detail",children:y.pruning.reason})]})]}),y&&y.checks.length>0&&e.jsxs("div",{className:"memory-engine-card",children:[e.jsx("h3",{children:s("memory.auditChecksTitle","Audit Checks")}),e.jsx("div",{children:y.checks.map(a=>e.jsxs("div",{className:"memory-audit-check",children:[e.jsx("span",{className:a.passed?"memory-audit-check-passed":"memory-audit-check-failed",children:a.passed?"✓":"✗"}),e.jsxs("div",{className:"memory-audit-check-content",children:[e.jsx("div",{className:"memory-emphasis-text",children:a.name}),e.jsx("div",{className:"memory-health-detail",children:a.details})]})]},a.id))})]}),e.jsx("div",{className:"memory-action-bar",children:e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:()=>k(),children:s("memory.runAudit","Run Audit")})}),e.jsxs("div",{className:"memory-settings-note",children:[e.jsx("span",{children:s("memory.settingsNote","Note: Change backend type in")}),e.jsx("button",{type:"button",className:"memory-settings-note-button",onClick:()=>{t(s("memory.settingsNoteToast","Open Settings → Memory to change backend type"),"info")},children:s("memory.settingsNoteLink","Settings → Memory")})]})]})})]})]})}export{ds as MemoryView};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as s,j as e}from"./vendor-react-D37HfzIf.js";import{c as ze,aS as ds,aT as us,aU as ms,aV as hs,aW as Ke,aX as Ue,aY as Ie,aG as fe,aZ as ke,a_ as Oe,a$ as _e,b0 as Be,A as Te,ax as fs,Q as He,b1 as qe,b2 as gs,U as Ne,u as ps,R as Ce,a as we,J as ge,b3 as Ye,b4 as xs,b5 as vs,b6 as bs,b7 as Fe,X as he,ae as ys,af as js,b8 as Ve,F as ks,b9 as $e,ba as _s,bb as Ns,bc as Cs,bd as Ss,be as Ms,G as Ps}from"./index-
|
|
1
|
+
import{r as s,j as e}from"./vendor-react-D37HfzIf.js";import{c as ze,aS as ds,aT as us,aU as ms,aV as hs,aW as Ke,aX as Ue,aY as Ie,aG as fe,aZ as ke,a_ as Oe,a$ as _e,b0 as Be,A as Te,ax as fs,Q as He,b1 as qe,b2 as gs,U as Ne,u as ps,R as Ce,a as we,J as ge,b3 as Ye,b4 as xs,b5 as vs,b6 as bs,b7 as Fe,X as he,ae as ys,af as js,b8 as Ve,F as ks,b9 as $e,ba as _s,bb as Ns,bc as Cs,bd as Ss,be as Ms,G as Ps}from"./index-CpTBp1RG.js";import{u as ne}from"./vendor-i18n-CV0mwX_-.js";import{v as ws}from"./projectDetection-G3XuxD2X.js";import{U as Xe}from"./upload-BCmd-1I0.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.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.
|
package/dist/client/assets/{PiExtensionsManager-C4I11iKm.js → PiExtensionsManager-BtqXF3fl.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as l,j as e}from"./vendor-react-D37HfzIf.js";import{c as G,gd as V,ge as Y,gf as Z,R as L,g4 as y,J as T,a as ee,b as se,U as ae,F as D,gg as ie,gh as ne,gi as B,X as te}from"./index-
|
|
1
|
+
import{r as l,j as e}from"./vendor-react-D37HfzIf.js";import{c as G,gd as V,ge as Y,gf as Z,R as L,g4 as y,J as T,a as ee,b as se,U as ae,F as D,gg as ie,gh as ne,gi as B,X as te}from"./index-CpTBp1RG.js";import{u as re}from"./vendor-i18n-CV0mwX_-.js";import{B as _}from"./AgentPermissionPolicyEditor-BiY1a4KR.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.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 e}from"./vendor-react-D37HfzIf.js";import{v as _e,g1 as He,g2 as Me,g3 as ce,s as $e,X as ge,aB as Ve,b0 as qe,J as de,b8 as pe,U as me,R as he,g4 as Te,ax as We,g5 as Ke,g6 as Qe,dD as Je,g7 as Ye,g8 as Xe,g9 as Ze,ga as es,gb as O,dA as ss,gc as ns}from"./index-bZCpHtGq.js";import{D as is}from"./DirectoryPicker-BFot4CVM.js";import{u as ts}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";import"./folder-open-BlPyIWyf.js";const je="fusion-plugin-agent-browser",be={enabled:{type:"boolean",label:"Enable Agent Browser",group:"General"},installChannel:{type:"enum",label:"Install Channel",enumValues:["stable","beta","nightly"],defaultValue:"stable",group:"General"},commandTimeoutMs:{type:"number",label:"Command Timeout (ms)",defaultValue:12e4,group:"General"},headlessMode:{type:"boolean",label:"Headless Mode",defaultValue:!0,group:"Browser"},allowedDomains:{type:"array",label:"Allowed Domains",itemType:"string",group:"Browser"},promptExecutorSystem:{type:"string",label:"Executor System Prompt",multiline:!0,group:"Prompt Contributions"},promptExecutorTask:{type:"string",label:"Executor Task Prompt",multiline:!0,group:"Prompt Contributions"},promptTriage:{type:"string",label:"Triage Prompt",multiline:!0,group:"Prompt Contributions"},promptReviewer:{type:"string",label:"Reviewer Prompt",multiline:!0,group:"Prompt Contributions"},promptHeartbeat:{type:"string",label:"Heartbeat Prompt",multiline:!0,group:"Prompt Contributions"},skillExposure:{type:"enum",label:"Skill Exposure",enumValues:["none","selected","all"],defaultValue:"selected",group:"Skills"}},ye={General:"plugins.agentBrowser.groupGeneral",Browser:"plugins.agentBrowser.groupBrowser","Prompt Contributions":"plugins.agentBrowser.groupPromptContributions",Skills:"plugins.agentBrowser.groupSkills"},xe={"Enable Agent Browser":"plugins.agentBrowser.labelEnabled","Install Channel":"plugins.agentBrowser.labelInstallChannel","Command Timeout (ms)":"plugins.agentBrowser.labelCommandTimeoutMs","Headless Mode":"plugins.agentBrowser.labelHeadlessMode","Allowed Domains":"plugins.agentBrowser.labelAllowedDomains","Executor System Prompt":"plugins.agentBrowser.labelPromptExecutorSystem","Executor Task Prompt":"plugins.agentBrowser.labelPromptExecutorTask","Triage Prompt":"plugins.agentBrowser.labelPromptTriage","Reviewer Prompt":"plugins.agentBrowser.labelPromptReviewer","Heartbeat Prompt":"plugins.agentBrowser.labelPromptHeartbeat","Skill Exposure":"plugins.agentBrowser.labelSkillExposure"},fe=[{id:"fusion-plugin-hermes-runtime",name:"Hermes Runtime",description:"Runtime provider for Hermes CLI-backed execution.",category:"runtime",path:"./plugins/fusion-plugin-hermes-runtime",experimental:!0},{id:"fusion-plugin-paperclip-runtime",name:"Paperclip Runtime",description:"Runtime provider for Paperclip agent connections.",category:"runtime",path:"./plugins/fusion-plugin-paperclip-runtime"},{id:"fusion-plugin-openclaw-runtime",name:"OpenClaw Runtime",description:"Runtime provider for OpenClaw execution.",category:"runtime",path:"./plugins/fusion-plugin-openclaw-runtime",experimental:!0},{id:"fusion-plugin-droid-runtime",name:"Droid Runtime",description:"Runtime provider for Droid CLI execution.",category:"runtime",path:"./plugins/fusion-plugin-droid-runtime",experimental:!0},{id:"fusion-plugin-dependency-graph",name:"Dependency Graph",description:"Dashboard plugin for task dependency graph visualization.",category:"integration",path:"./plugins/fusion-plugin-dependency-graph"},{id:"fusion-plugin-reports",name:"Reports",description:"View report history, compare runs side-by-side, and export standalone HTML summaries.",category:"integration",path:"./plugins/fusion-plugin-reports"},{id:"fusion-plugin-whatsapp-chat",name:"WhatsApp Chat",description:"Pairs to WhatsApp Web (multi-device) with QR or pairing code, then bridges direct chats to a Fusion agent.",category:"integration",path:"./plugins/fusion-plugin-whatsapp-chat"},{id:"fusion-plugin-cli-printing-press",name:"CLI Printing Press",description:"Guided wizard for drafting external service CLI definitions.",category:"integration",path:"./plugins/fusion-plugin-cli-printing-press"},{id:"fusion-plugin-compound-engineering",name:"Compound Engineering",description:"A dedicated dashboard surface for compound-engineering artifacts and interactive ce-* sessions.",category:"integration",path:"./plugins/fusion-plugin-compound-engineering"},{id:"fusion-plugin-roadmap",name:"Roadmaps",description:"Standalone roadmap planning plugin.",category:"integration",path:"./plugins/fusion-plugin-roadmap"},{id:je,name:"Agent Browser",description:"Built-in integration metadata. Package install support lands in FN-3101.",category:"integration",hasSetup:!0}],F={started:"var(--color-success)",loaded:"var(--color-warning)",error:"var(--color-error)",stopped:"var(--color-muted)",installed:"var(--color-info)"};function as(r){const o=r.settingsSchema,n=o&&Object.keys(o).length>0;return r.id!==je?n?o:void 0:n?{...be,...o}:be}function ls(r){const o=new Map,n=[];for(const[S,y]of Object.entries(r))if(y.group){const v=o.get(y.group)??[];v.push([S,y]),o.set(y.group,v)}else n.push([S,y]);return{grouped:o,ungrouped:n}}function Se(r,o="plugin-error-text"){return r.state!=="error"||!r.error?null:e.jsx("p",{className:o,title:r.error,children:r.error})}function bs({addToast:r,projectId:o}){const{t:n}=ts("app"),[S,y]=d.useState([]),[v,z]=d.useState(!0),[Ne,A]=d.useState(!1),[E,L]=d.useState(""),[U,_]=d.useState(!1),[H,M]=d.useState(!1),[w,$]=d.useState(null),[c,D]=d.useState(null),[m,x]=d.useState({}),[ve,V]=d.useState(!1),[q,T]=d.useState(null),[W,we]=d.useState([]),[Ce,K]=d.useState(!0),[Q,J]=d.useState(null),[b,Pe]=d.useState(""),[f,Re]=d.useState(""),[Ie,Y]=d.useState(null),C=d.useRef(null),[Ee,G]=d.useState({}),[Be,X]=d.useState(null),[B,Z]=d.useState(null),{confirm:ke}=_e(),h=d.useCallback(async()=>{try{z(!0);const s=await He(o);y(s)}catch(s){r(n("plugins.loadFailed","Failed to load plugins: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}finally{z(!1)}},[o,r]),j=d.useCallback(async(s=b,i=f)=>{try{K(!0),J(null);const l=await Me(s,i||void 0,o);we(l)}catch(l){const u=l instanceof Error?l.message:String(l);J(u)}finally{K(!1)}},[o,f,b]);d.useEffect(()=>{h()},[h]),d.useEffect(()=>(C.current&&clearTimeout(C.current),C.current=setTimeout(()=>{j(b,f)},300),()=>{C.current&&clearTimeout(C.current)}),[j,f,b]),d.useEffect(()=>{const s=fe.filter(l=>l.hasSetup&&S.some(u=>u.id===l.id));if(s.length===0)return;let i=!1;return Promise.all(s.map(async l=>{try{const u=await ce(l.id,o);if(i)return;G(g=>({...g,[l.id]:u}))}catch{if(i)return;G(u=>({...u,[l.id]:{hasSetup:!0,setupCheckDeferred:!0,deferredReason:"plugin-not-started",pluginState:"installed"}}))}})),()=>{i=!0}},[S,o]);const Fe=d.useRef([]);Fe.current=S,d.useEffect(()=>{const s=o?`?projectId=${encodeURIComponent(o)}`:"",i=l=>{try{const u=JSON.parse(l.data);if(u.scope==="project"&&(u.projectId??o)!==o)return;switch(u.transition){case"installing":case"enabled":case"disabled":case"settings-updated":j(b,f),y(g=>{const a=g.findIndex(t=>t.id===u.pluginId);if(a>=0){const t=[...g];return t[a]={...t[a],enabled:u.enabled,state:u.state,settings:u.settings,error:u.error},t}else return h(),g});break;case"state-changed":y(g=>{const a=g.findIndex(t=>t.id===u.pluginId);if(a>=0){const t=[...g];return t[a]={...t[a],state:u.state,error:u.error},t}return g});break;case"uninstalled":y(g=>g.filter(a=>a.id!==u.pluginId)),j(b,f);break;case"error":y(g=>{const a=g.findIndex(t=>t.id===u.pluginId);if(a>=0){const t=[...g];return t[a]={...t[a],state:u.state,error:u.error},t}return g});break}}catch{}};return $e(`/api/events${s}`,{events:{"plugin:lifecycle":i},onReconnect:()=>{h(),j(b,f)}})},[o,h,j,f,b]);const ee=async()=>{if(!E.trim()){r(n("plugins.installPathRequired","Please enter a plugin path"),"error");return}try{_(!0),await O({path:E,...H?{aiScanOnLoad:!0}:{}},o),r(n("plugins.installedGlobally","Plugin installed globally"),"success"),A(!1),L(""),M(!1),await h()}catch(s){r(n("plugins.installFailed","Failed to install plugin: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}finally{_(!1)}},Ae=async s=>{if(!s.path){r(n("plugins.builtinNoPackage","{{name}} is built in and does not have an installable package yet",{name:s.name}),"warning");return}try{T(s.id),await O({path:s.path},o),r(n("plugins.builtinInstalledGlobally","{{name}} installed globally",{name:s.name}),"success"),await h()}catch(i){r(n("plugins.builtinInstallFailed","Failed to install {{name}}: {{error}}",{name:s.name,error:i instanceof Error?i.message:String(i)}),"error")}finally{T(null)}},Le=async s=>{if(!s.path){r(n("plugins.registryNotInstallable","{{name}} is not available for one-click install yet",{name:s.name}),"warning");return}try{Y(s.id),await O({path:s.path},o),r(n("plugins.registryInstalled","{{name}} installed and enabled",{name:s.name}),"success"),await h(),await j(b,f)}catch(i){r(n("plugins.registryInstallFailed","Failed to install {{name}}: {{error}}",{name:s.name,error:i instanceof Error?i.message:String(i)}),"error")}finally{Y(null)}},se=async s=>{try{Z(s.id);const i=await ns(s.id,o);if(!i.success){r(n("plugins.setupInstallFailed","Failed to install {{name}} setup: {{error}}",{name:s.name,error:i.error??n("plugins.unknownError","unknown error")}),"error");return}r(n("plugins.setupInstalled","{{name}} setup installed",{name:s.name}),"success"),X(s.id);const l=await ce(s.id,o);G(u=>({...u,[s.id]:l}))}catch(i){r(n("plugins.setupInstallFailed","Failed to install {{name}} setup: {{error}}",{name:s.name,error:i instanceof Error?i.message:String(i)}),"error")}finally{Z(null),X(null)}},ne=async s=>{try{const i=await Ze(s.id,o);if(i.state==="error"){r(n("plugins.enableFailed","Failed to enable {{name}}: {{error}}",{name:s.name,error:i.error??n("plugins.unknownError","unknown error")}),"error"),await h();return}r(n("plugins.enabledForProject","{{name}} enabled for this project",{name:s.name}),"success"),await h()}catch(i){r(n("plugins.enablePluginFailed","Failed to enable plugin: {{error}}",{error:i instanceof Error?i.message:String(i)}),"error")}},ie=async s=>{try{await Xe(s.id,o),r(n("plugins.disabledForProject","{{name}} disabled for this project",{name:s.name}),"success"),await h()}catch(i){r(n("plugins.disablePluginFailed","Failed to disable plugin: {{error}}",{error:i instanceof Error?i.message:String(i)}),"error")}},te=async s=>{try{$(s.id),await Ye(s.id,o),r(n("plugins.reloaded","{{name}} reloaded",{name:s.name}),"success"),await h()}catch(i){r(n("plugins.reloadFailed","Failed to reload plugin: {{error}}",{error:i instanceof Error?i.message:String(i)}),"error")}finally{$(null)}},ae=async s=>{if(await ke({title:n("plugins.uninstallTitle","Uninstall Plugin Globally"),message:n("plugins.uninstallConfirm",'Are you sure you want to uninstall "{{name}}" globally (all projects)?',{name:s.name}),danger:!0}))try{await es(s.id,o),r(n("plugins.uninstalledGlobally","{{name}} uninstalled globally",{name:s.name}),"success"),await h(),D(null)}catch(l){r(n("plugins.uninstallFailed","Failed to uninstall plugin: {{error}}",{error:l instanceof Error?l.message:String(l)}),"error")}},De=async(s,i)=>{try{await Ke(s.id,{aiScanOnLoad:i},o),r(i?n("plugins.aiScanEnabled","AI scan on load enabled"):n("plugins.aiScanDisabled","AI scan on load disabled"),"success"),await h()}catch(l){r(n("plugins.updateFailed","Failed to update plugin: {{error}}",{error:l instanceof Error?l.message:String(l)}),"error")}},Ge=async s=>{try{await Qe(s.id,o),r(n("plugins.rescanned","{{name}} rescanned",{name:s.name}),"success"),await h()}catch(i){r(n("plugins.rescanFailed","Failed to rescan plugin: {{error}}",{error:i instanceof Error?i.message:String(i)}),"error")}},k=async s=>{D(s);try{V(!0);const i=await ss(s.id,o);x(i)}catch{x({})}finally{V(!1)}},Oe=async()=>{if(c)try{await Je(c.id,m,o),r(n("plugins.settingsSaved","Settings saved"),"success")}catch(s){r(n("plugins.saveSettingsFailed","Failed to save settings: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}};if(c)return e.jsxs("div",{className:"plugin-manager-detail","data-testid":"plugin-manager-detail",children:[e.jsxs("div",{className:"plugin-manager-detail-header",children:[e.jsx("button",{className:"btn-icon",onClick:()=>D(null),"aria-label":n("plugins.backToList","Back to plugin list"),children:e.jsx(ge,{size:16})}),e.jsxs("div",{className:"plugin-detail-title",children:[e.jsxs("div",{className:"plugin-detail-title-copy",children:[e.jsx("h4",{className:"plugin-detail-name",children:c.name}),Se(c,"plugin-error-text plugin-error-text--detail")]}),e.jsx("span",{className:"plugin-state-badge",style:{color:F[c.state]||F.installed},children:c.state})]})]}),e.jsxs("div",{className:"plugin-detail-content",children:[e.jsxs("div",{className:"plugin-detail-card",children:[c.description&&e.jsx("p",{className:"plugin-description",children:c.description}),c.author&&e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:n("plugins.author","Author:")}),c.author]}),c.homepage&&e.jsxs("p",{className:"plugin-detail-meta-row plugin-homepage",children:[e.jsx("span",{className:"text-muted",children:n("plugins.homepage","Homepage:")}),e.jsxs("a",{href:c.homepage,target:"_blank",rel:"noopener noreferrer",children:[c.homepage,e.jsx(Ve,{size:12})]})]}),e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:n("plugins.version","Version:")}),c.version]})]}),e.jsxs("div",{className:"plugin-detail-card",children:[e.jsx("h5",{className:"plugin-detail-section-heading",children:n("plugins.securityScan","Security Scan")}),e.jsxs("div",{className:"plugin-security-row",children:[e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:!!c.aiScanOnLoad,onChange:s=>void De(c,s.target.checked)}),n("plugins.enableAiScanBeforeLoad","Enable AI scan before load/reload")]}),e.jsxs("button",{className:"btn btn-secondary btn-sm",onClick:()=>void Ge(c),children:[e.jsx(qe,{size:14})," ",n("plugins.rescanAndReload","Rescan and Reload")]})]}),e.jsx("p",{className:"text-muted",children:n("plugins.aiScanHint","Turning this on only updates configuration. Use Rescan and Reload to run it now.")}),c.lastSecurityScan?e.jsxs("div",{className:"plugin-security-results",children:[e.jsxs("div",{className:"plugin-security-header",children:[e.jsx("span",{className:`plugin-state-badge plugin-security-badge plugin-security-badge--${c.lastSecurityScan.verdict}`,children:c.lastSecurityScan.verdict}),e.jsx("span",{className:"text-muted",children:c.lastSecurityScan.scannedAt})]}),e.jsx("p",{className:"plugin-security-summary",children:c.lastSecurityScan.summary}),e.jsxs("details",{children:[e.jsx("summary",{children:n("plugins.findings","Findings ({{count}})",{count:c.lastSecurityScan.findings.length})}),e.jsx("ul",{className:"plugin-security-findings",children:c.lastSecurityScan.findings.map((s,i)=>e.jsxs("li",{children:[e.jsx("strong",{children:s.severity})," ",s.category," — ",s.file,": ",s.reason]},`${s.file}-${i}`))})]})]}):e.jsx("p",{className:"text-muted",children:n("plugins.noSecurityScan","No security scan has been run yet.")})]}),e.jsxs("div",{className:"plugin-detail-card",children:[e.jsx("h5",{className:"plugin-detail-section-heading",children:n("plugins.settings","Settings")}),ve?e.jsx("p",{className:"text-muted",children:n("plugins.loading","Loading...")}):(()=>{const s=as(c);return s&&Object.keys(s).length>0?e.jsxs("div",{className:"plugin-settings-form",children:[(()=>{const{grouped:i,ungrouped:l}=ls(s),u=[];l.length>0&&u.push({title:null,entries:l});for(const[g,a]of i.entries())u.push({title:g,entries:a});return u.map(g=>e.jsxs("div",{className:g.title?"plugin-settings-group":void 0,children:[g.title&&e.jsx("h6",{className:"plugin-settings-group-heading",children:ye[g.title]?n(ye[g.title],g.title):g.title}),g.entries.map(([a,t])=>{const N=`setting-${a}-help`,P=t.label?xe[t.label]?n(xe[t.label],t.label):t.label:a;return e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:`setting-${a}`,children:[P,t.required&&" *"]}),t.type==="string"&&!t.multiline&&e.jsx("input",{className:"input",type:"text",id:`setting-${a}`,value:m[a]??"",onChange:p=>x({...m,[a]:p.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?N:void 0}),t.type==="string"&&t.multiline&&e.jsx("textarea",{className:"input",id:`setting-${a}`,rows:4,value:m[a]??"",onChange:p=>x({...m,[a]:p.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?N:void 0}),t.type==="password"&&e.jsx("input",{className:"input",type:"password",id:`setting-${a}`,value:m[a]??"",onChange:p=>x({...m,[a]:p.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?N:void 0}),t.type==="number"&&e.jsx("input",{className:"input",type:"number",id:`setting-${a}`,value:m[a]??"",onChange:p=>x({...m,[a]:Number(p.target.value)}),"aria-describedby":t.description&&!t.required?N:void 0}),t.type==="boolean"&&e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:m[a]??!1,onChange:p=>x({...m,[a]:p.target.checked})}),t.description]}),t.type==="enum"&&e.jsxs("select",{className:"select",id:`setting-${a}`,value:m[a]??"",onChange:p=>x({...m,[a]:p.target.value}),"aria-describedby":t.description&&!t.required?N:void 0,children:[e.jsx("option",{value:"",children:n("plugins.selectOption","Select...")}),t.enumValues?.map(p=>e.jsx("option",{value:p,children:p},p))]}),t.type==="array"&&e.jsxs("div",{className:"plugin-settings-array",children:[m[a]?.map((p,R)=>e.jsxs("div",{className:"plugin-settings-array-item",children:[e.jsx("input",{className:"input",type:t.itemType==="number"?"number":"text",value:p??"",onChange:ue=>{const I=ue.target.value,oe=[...m[a]||[]];oe[R]=t.itemType==="number"?Number(I):I,x({...m,[a]:oe})}}),e.jsx("button",{className:"btn-icon",onClick:()=>{const I=[...m[a]||[]];I.splice(R,1),x({...m,[a]:I})},"aria-label":n("plugins.removeItem","Remove item"),children:e.jsx(ge,{size:14})})]},R)),e.jsxs("button",{className:"btn btn-secondary",onClick:()=>{const p=m[a]||[],R=t.itemType==="number"?0:"";x({...m,[a]:[...p,R]})},children:[e.jsx(de,{size:14})," ",n("plugins.addItem","Add Item")]})]}),t.description&&!t.required&&!t.multiline&&e.jsx("span",{id:N,className:"form-help",children:t.description})]},a)})]},g.title??"ungrouped"))})(),e.jsx("button",{className:"btn btn-primary",onClick:Oe,children:n("plugins.saveSettings","Save Settings")})]}):e.jsx("p",{className:"text-muted",children:n("plugins.noConfigurableSettings","No configurable settings.")})})()]}),e.jsxs("div",{className:"plugin-detail-actions",children:[c.state==="started"&&e.jsxs("button",{className:"btn btn-secondary",onClick:()=>te(c),disabled:w===c.id,children:[e.jsx(pe,{size:14,className:w===c.id?"spin":""}),w===c.id?n("plugins.reloading","Reloading..."):n("plugins.reload","Reload")]}),c.enabled?e.jsx("button",{className:"btn btn-secondary",onClick:()=>ie(c),children:n("plugins.disableInProject","Disable in Project")}):e.jsx("button",{className:"btn btn-primary",onClick:()=>ne(c),children:n("plugins.enableInProject","Enable in Project")}),e.jsxs("button",{className:"btn btn-danger",onClick:()=>ae(c),children:[e.jsx(me,{size:14})," ",n("plugins.uninstallGlobally","Uninstall Globally")]})]})]})]});const le=new Map(S.map(s=>[s.id,s])),re=S,ze=()=>e.jsxs("section",{className:"plugin-registry-section","aria-label":n("plugins.browseRegistry","Browse Registry"),children:[e.jsxs("div",{className:"plugin-registry-header",children:[e.jsxs("div",{className:"plugin-registry-heading-copy",children:[e.jsx("h4",{className:"plugin-registry-heading",children:n("plugins.browseRegistry","Browse Registry")}),e.jsx("p",{className:"plugin-registry-description",children:n("plugins.registryDescription","Discover curated runtimes and integrations that can be added to this Fusion workspace.")})]}),e.jsxs("div",{className:"plugin-registry-controls",children:[e.jsxs("label",{className:"plugin-registry-category-label",children:[e.jsx("span",{className:"sr-only",children:n("plugins.registryCategory","Registry category")}),e.jsxs("select",{className:"select plugin-registry-category-select",value:f,onChange:s=>Re(s.target.value),"aria-label":n("plugins.registryCategory","Registry category"),children:[e.jsx("option",{value:"",children:n("plugins.registryCategoryAll","All Categories")}),e.jsx("option",{value:"runtime",children:n("plugins.registryCategoryRuntime","Runtime")}),e.jsx("option",{value:"integration",children:n("plugins.registryCategoryIntegration","Integration")})]})]}),e.jsxs("label",{className:"plugin-registry-search-label",children:[e.jsx("span",{className:"sr-only",children:n("plugins.searchRegistry","Search registry")}),e.jsx("input",{className:"input plugin-registry-search-input",type:"search",value:b,onChange:s=>Pe(s.target.value),placeholder:n("plugins.searchRegistryPlaceholder","Search registry plugins")})]})]})]}),Ce?e.jsxs("div",{className:"plugin-registry-state",role:"status",children:[e.jsx(he,{size:14,className:"spin"}),n("plugins.registryLoading","Loading registry...")]}):Q?e.jsxs("div",{className:"plugin-registry-state plugin-registry-state--error",role:"alert",children:[e.jsx("span",{children:n("plugins.registryLoadFailed","Failed to load registry: {{error}}",{error:Q})}),e.jsx("button",{className:"btn btn-secondary btn-sm plugin-registry-retry",onClick:()=>void j(b,f),children:n("plugins.retry","Retry")})]}):W.length===0?e.jsx("div",{className:"plugin-registry-state",children:b.trim()?n("plugins.registryEmptySearch","No registry plugins match your search."):n("plugins.registryEmpty","No registry plugins are available.")}):e.jsx("div",{className:"plugin-registry-list","aria-label":n("plugins.registryPluginResults","Registry plugin results"),children:W.map(s=>{const i=le.get(s.id),l=Ie===s.id;return e.jsxs("div",{className:"plugin-registry-item",children:[e.jsxs("div",{className:"plugin-registry-meta",children:[e.jsxs("div",{className:"plugin-registry-title-row",children:[e.jsx("span",{className:"plugin-registry-name",children:s.name}),e.jsxs("span",{className:"plugin-registry-version",children:["v",s.version]}),e.jsx("span",{className:"plugin-registry-badge",children:s.category}),s.installed&&e.jsxs("span",{className:"plugin-registry-status plugin-registry-status--installed",children:[n("plugins.statusInstalled","Installed"),s.installedVersion&&s.installedVersion!==s.version?` · v${s.installedVersion}`:""]})]}),e.jsx("span",{className:"plugin-registry-description-text",children:s.description}),e.jsx("span",{className:"plugin-registry-author",children:n("plugins.registryByAuthor","By {{author}}",{author:s.author})})]}),e.jsx("div",{className:"plugin-registry-actions",children:s.installed?e.jsx("button",{className:"btn btn-secondary btn-sm plugin-registry-action",onClick:()=>{i?k(i):h()},children:n("plugins.manage","Manage")}):s.canInstall?e.jsx("button",{className:"btn btn-primary btn-sm plugin-registry-action",onClick:()=>void Le(s),disabled:l,children:l?n("plugins.installing","Installing..."):n("plugins.installFromRegistry","Install")}):e.jsx("span",{className:"plugin-registry-coming-soon",children:n("plugins.registryComingSoon","Coming Soon")})})]},s.id)})})]}),Ue=()=>e.jsxs("section",{className:"plugin-builtins-section","aria-label":n("plugins.builtinPlugins","Built-in Plugins"),children:[e.jsxs("div",{className:"plugin-builtins-header",children:[e.jsx("h4",{className:"plugin-builtins-heading",children:n("plugins.builtinPlugins","Built-in Plugins")}),e.jsx("p",{className:"plugin-builtins-description",children:n("plugins.builtinPluginsCatalog","Built-in plugin catalog for runtimes and integrations.")})]}),e.jsx("div",{className:"plugin-builtins-list","aria-label":n("plugins.builtinPluginRecommendations","Built-in plugin recommendations"),children:fe.map(s=>{const i=le.get(s.id),l=!!i,u=Ee[s.id],g=!!(u&&"setupCheckDeferred"in u&&u.setupCheckDeferred),a=u&&"status"in u?u.status:void 0,t=l&&s.hasSetup&&u?.hasSetup&&!g&&i?.state==="started"&&(a==="not-installed"||a==="error"),N=l&&u?.hasSetup&&a==="installed",P=Be===s.id,p=!s.path;return e.jsxs("div",{className:"plugin-builtins-item",children:[e.jsxs("div",{className:"plugin-builtins-meta",children:[e.jsx("span",{className:"plugin-builtins-name",children:s.name}),s.experimental&&e.jsx("span",{className:"plugin-builtins-runtime-badge",children:n("plugins.experimental","Experimental")}),e.jsx("span",{className:"plugin-builtins-runtime-badge",children:s.category}),e.jsx("span",{className:`plugin-builtins-status ${l?"plugin-builtins-status--installed":"plugin-builtins-status--available"}`,children:l?n("plugins.statusInstalled","Installed"):p?n("plugins.statusBuiltIn","Built in"):n("plugins.statusNotInstalled","Not installed")}),t&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--warning",children:n("plugins.setupRequired","Setup required")}),N&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--ready",children:n("plugins.setupReady","Setup ready")}),P&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--pending",children:n("plugins.checkingSetup","Checking setup...")}),g&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--deferred",children:n("plugins.startPluginToCheckSetup","Start plugin to check setup")}),e.jsx("span",{className:"plugin-builtins-description-text",children:s.description})]}),p?l&&t?e.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>void se(s),disabled:B===s.id||P,children:B===s.id?n("plugins.settingUp","Setting up..."):n("plugins.installSetup","Install Setup")}):l&&i?e.jsx("button",{className:"btn btn-secondary btn-sm",onClick:()=>void k(i),children:n("plugins.manage","Manage")}):e.jsx("span",{className:"plugin-builtins-metadata-only",children:n("plugins.builtinMetadataOnly","Built-in metadata only")}):e.jsx("button",{className:`btn ${l&&!t?"btn-secondary":"btn-primary"} btn-sm`,onClick:()=>{if(!l){Ae(s);return}if(t){se(s);return}i&&k(i)},disabled:q===s.id||B===s.id||P,children:l?t?B===s.id?n("plugins.settingUp","Setting up..."):n("plugins.installSetup","Install Setup"):n("plugins.manage","Manage"):q===s.id?n("plugins.installing","Installing..."):n("plugins.installNamed","Install {{name}}",{name:s.name})})]},s.id)})})]});return e.jsxs("div",{className:"plugin-manager","data-testid":"plugin-manager",children:[e.jsxs("div",{className:"plugin-manager-header",children:[e.jsx("span",{className:"plugin-manager-header-title",children:n("plugins.installedPlugins","Installed Plugins")}),e.jsxs("div",{className:"plugin-manager-actions",children:[e.jsxs("button",{className:"btn btn-sm",onClick:h,title:n("plugins.refresh","Refresh"),"aria-label":n("plugins.refreshPluginList","Refresh plugin list"),children:[e.jsx(he,{size:14,className:v?"spin":""}),n("plugins.refresh","Refresh")]}),e.jsxs("button",{className:"btn btn-primary btn-sm",onClick:()=>A(!0),children:[e.jsx(de,{size:14})," ",n("plugins.install","Install")]})]})]}),Ne&&e.jsxs("div",{className:"plugin-install-form",children:[e.jsx("p",{className:"plugin-install-hint",children:n("plugins.installHint","Browse to a plugin package root (contains manifest.json) or a built dist directory.")}),e.jsx(is,{value:E,onChange:L,placeholder:n("plugins.installPathPlaceholder","Absolute path to plugin directory or dist folder"),onInputKeyDown:s=>{s.key==="Enter"&&(s.preventDefault(),ee())}}),e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:H,onChange:s=>M(s.target.checked)}),n("plugins.enableAiSecurityScan","Enable AI security scan on load")]}),e.jsxs("div",{className:"plugin-install-actions",children:[e.jsx("button",{className:"btn btn-primary",onClick:ee,disabled:U||!E.trim(),children:U?n("plugins.installing","Installing..."):n("plugins.installPluginGlobally","Install Plugin Globally")}),e.jsx("button",{className:"btn btn-secondary",onClick:()=>{A(!1),L("")},children:n("plugins.cancel","Cancel")})]})]}),v?e.jsx("div",{className:"settings-empty-state",children:n("plugins.loadingPlugins","Loading plugins...")}):e.jsxs(e.Fragment,{children:[re.length===0?e.jsxs("div",{className:"settings-empty-state",children:[e.jsx(Te,{size:32,className:"text-muted"}),e.jsx("p",{children:n("plugins.noPluginsInstalled","No plugins installed.")}),e.jsx("p",{className:"text-muted",children:n("plugins.noPluginsHint","Install a plugin to get started, or use the built-in catalog below.")})]}):e.jsx("div",{className:"plugin-list",children:re.map(s=>e.jsxs("div",{className:"plugin-item",children:[e.jsx("div",{className:"plugin-info",children:e.jsxs("div",{className:"plugin-copy",children:[e.jsxs("div",{className:"plugin-copy-header",children:[e.jsx("span",{className:"plugin-name",children:s.name}),e.jsxs("span",{className:"plugin-version text-muted",children:["v",s.version]}),e.jsx("span",{className:"plugin-state-badge",style:{color:F[s.state]||F.installed},children:s.state})]}),Se(s)]})}),e.jsxs("div",{className:"plugin-actions",children:[s.state==="started"&&e.jsx("button",{className:"btn-icon",onClick:()=>te(s),disabled:w===s.id,title:n("plugins.reload","Reload"),children:e.jsx(pe,{size:14,className:w===s.id?"spin":""})}),e.jsxs("label",{className:"toggle-switch",children:[e.jsx("input",{type:"checkbox",checked:s.enabled,onChange:()=>s.enabled?ie(s):ne(s),"aria-label":s.enabled?n("plugins.disablePlugin","Disable {{name}}",{name:s.name}):n("plugins.enablePlugin","Enable {{name}}",{name:s.name})}),e.jsx("span",{className:"toggle-slider"})]}),e.jsx("button",{className:"btn-icon",onClick:()=>k(s),title:n("plugins.settings","Settings"),children:e.jsx(We,{size:14})}),e.jsx("button",{className:"btn-icon",onClick:()=>ae(s),title:n("plugins.uninstallGloballyTitle","Uninstall globally"),children:e.jsx(me,{size:14})})]})]},s.id))}),Ue(),ze()]})]})}export{be as AGENT_BROWSER_SETTINGS_SCHEMA,je as BUILTIN_AGENT_BROWSER_PLUGIN_ID,fe as BUILTIN_PLUGINS,bs as PluginManager,F as STATE_COLORS};
|
|
1
|
+
import{r as d,j as e}from"./vendor-react-D37HfzIf.js";import{v as _e,g1 as He,g2 as Me,g3 as ce,s as $e,X as ge,aB as Ve,b0 as qe,J as de,b8 as pe,U as me,R as he,g4 as Te,ax as We,g5 as Ke,g6 as Qe,dD as Je,g7 as Ye,g8 as Xe,g9 as Ze,ga as es,gb as O,dA as ss,gc as ns}from"./index-CpTBp1RG.js";import{D as is}from"./DirectoryPicker-CkcGjyv0.js";import{u as ts}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";import"./folder-open-Bw1mxVfa.js";const je="fusion-plugin-agent-browser",be={enabled:{type:"boolean",label:"Enable Agent Browser",group:"General"},installChannel:{type:"enum",label:"Install Channel",enumValues:["stable","beta","nightly"],defaultValue:"stable",group:"General"},commandTimeoutMs:{type:"number",label:"Command Timeout (ms)",defaultValue:12e4,group:"General"},headlessMode:{type:"boolean",label:"Headless Mode",defaultValue:!0,group:"Browser"},allowedDomains:{type:"array",label:"Allowed Domains",itemType:"string",group:"Browser"},promptExecutorSystem:{type:"string",label:"Executor System Prompt",multiline:!0,group:"Prompt Contributions"},promptExecutorTask:{type:"string",label:"Executor Task Prompt",multiline:!0,group:"Prompt Contributions"},promptTriage:{type:"string",label:"Triage Prompt",multiline:!0,group:"Prompt Contributions"},promptReviewer:{type:"string",label:"Reviewer Prompt",multiline:!0,group:"Prompt Contributions"},promptHeartbeat:{type:"string",label:"Heartbeat Prompt",multiline:!0,group:"Prompt Contributions"},skillExposure:{type:"enum",label:"Skill Exposure",enumValues:["none","selected","all"],defaultValue:"selected",group:"Skills"}},ye={General:"plugins.agentBrowser.groupGeneral",Browser:"plugins.agentBrowser.groupBrowser","Prompt Contributions":"plugins.agentBrowser.groupPromptContributions",Skills:"plugins.agentBrowser.groupSkills"},xe={"Enable Agent Browser":"plugins.agentBrowser.labelEnabled","Install Channel":"plugins.agentBrowser.labelInstallChannel","Command Timeout (ms)":"plugins.agentBrowser.labelCommandTimeoutMs","Headless Mode":"plugins.agentBrowser.labelHeadlessMode","Allowed Domains":"plugins.agentBrowser.labelAllowedDomains","Executor System Prompt":"plugins.agentBrowser.labelPromptExecutorSystem","Executor Task Prompt":"plugins.agentBrowser.labelPromptExecutorTask","Triage Prompt":"plugins.agentBrowser.labelPromptTriage","Reviewer Prompt":"plugins.agentBrowser.labelPromptReviewer","Heartbeat Prompt":"plugins.agentBrowser.labelPromptHeartbeat","Skill Exposure":"plugins.agentBrowser.labelSkillExposure"},fe=[{id:"fusion-plugin-hermes-runtime",name:"Hermes Runtime",description:"Runtime provider for Hermes CLI-backed execution.",category:"runtime",path:"./plugins/fusion-plugin-hermes-runtime",experimental:!0},{id:"fusion-plugin-paperclip-runtime",name:"Paperclip Runtime",description:"Runtime provider for Paperclip agent connections.",category:"runtime",path:"./plugins/fusion-plugin-paperclip-runtime"},{id:"fusion-plugin-openclaw-runtime",name:"OpenClaw Runtime",description:"Runtime provider for OpenClaw execution.",category:"runtime",path:"./plugins/fusion-plugin-openclaw-runtime",experimental:!0},{id:"fusion-plugin-droid-runtime",name:"Droid Runtime",description:"Runtime provider for Droid CLI execution.",category:"runtime",path:"./plugins/fusion-plugin-droid-runtime",experimental:!0},{id:"fusion-plugin-dependency-graph",name:"Dependency Graph",description:"Dashboard plugin for task dependency graph visualization.",category:"integration",path:"./plugins/fusion-plugin-dependency-graph"},{id:"fusion-plugin-reports",name:"Reports",description:"View report history, compare runs side-by-side, and export standalone HTML summaries.",category:"integration",path:"./plugins/fusion-plugin-reports"},{id:"fusion-plugin-whatsapp-chat",name:"WhatsApp Chat",description:"Pairs to WhatsApp Web (multi-device) with QR or pairing code, then bridges direct chats to a Fusion agent.",category:"integration",path:"./plugins/fusion-plugin-whatsapp-chat"},{id:"fusion-plugin-cli-printing-press",name:"CLI Printing Press",description:"Guided wizard for drafting external service CLI definitions.",category:"integration",path:"./plugins/fusion-plugin-cli-printing-press"},{id:"fusion-plugin-compound-engineering",name:"Compound Engineering",description:"A dedicated dashboard surface for compound-engineering artifacts and interactive ce-* sessions.",category:"integration",path:"./plugins/fusion-plugin-compound-engineering"},{id:"fusion-plugin-roadmap",name:"Roadmaps",description:"Standalone roadmap planning plugin.",category:"integration",path:"./plugins/fusion-plugin-roadmap"},{id:je,name:"Agent Browser",description:"Built-in integration metadata. Package install support lands in FN-3101.",category:"integration",hasSetup:!0}],F={started:"var(--color-success)",loaded:"var(--color-warning)",error:"var(--color-error)",stopped:"var(--color-muted)",installed:"var(--color-info)"};function as(r){const o=r.settingsSchema,n=o&&Object.keys(o).length>0;return r.id!==je?n?o:void 0:n?{...be,...o}:be}function ls(r){const o=new Map,n=[];for(const[S,y]of Object.entries(r))if(y.group){const v=o.get(y.group)??[];v.push([S,y]),o.set(y.group,v)}else n.push([S,y]);return{grouped:o,ungrouped:n}}function Se(r,o="plugin-error-text"){return r.state!=="error"||!r.error?null:e.jsx("p",{className:o,title:r.error,children:r.error})}function bs({addToast:r,projectId:o}){const{t:n}=ts("app"),[S,y]=d.useState([]),[v,z]=d.useState(!0),[Ne,A]=d.useState(!1),[E,L]=d.useState(""),[U,_]=d.useState(!1),[H,M]=d.useState(!1),[w,$]=d.useState(null),[c,D]=d.useState(null),[m,x]=d.useState({}),[ve,V]=d.useState(!1),[q,T]=d.useState(null),[W,we]=d.useState([]),[Ce,K]=d.useState(!0),[Q,J]=d.useState(null),[b,Pe]=d.useState(""),[f,Re]=d.useState(""),[Ie,Y]=d.useState(null),C=d.useRef(null),[Ee,G]=d.useState({}),[Be,X]=d.useState(null),[B,Z]=d.useState(null),{confirm:ke}=_e(),h=d.useCallback(async()=>{try{z(!0);const s=await He(o);y(s)}catch(s){r(n("plugins.loadFailed","Failed to load plugins: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}finally{z(!1)}},[o,r]),j=d.useCallback(async(s=b,i=f)=>{try{K(!0),J(null);const l=await Me(s,i||void 0,o);we(l)}catch(l){const u=l instanceof Error?l.message:String(l);J(u)}finally{K(!1)}},[o,f,b]);d.useEffect(()=>{h()},[h]),d.useEffect(()=>(C.current&&clearTimeout(C.current),C.current=setTimeout(()=>{j(b,f)},300),()=>{C.current&&clearTimeout(C.current)}),[j,f,b]),d.useEffect(()=>{const s=fe.filter(l=>l.hasSetup&&S.some(u=>u.id===l.id));if(s.length===0)return;let i=!1;return Promise.all(s.map(async l=>{try{const u=await ce(l.id,o);if(i)return;G(g=>({...g,[l.id]:u}))}catch{if(i)return;G(u=>({...u,[l.id]:{hasSetup:!0,setupCheckDeferred:!0,deferredReason:"plugin-not-started",pluginState:"installed"}}))}})),()=>{i=!0}},[S,o]);const Fe=d.useRef([]);Fe.current=S,d.useEffect(()=>{const s=o?`?projectId=${encodeURIComponent(o)}`:"",i=l=>{try{const u=JSON.parse(l.data);if(u.scope==="project"&&(u.projectId??o)!==o)return;switch(u.transition){case"installing":case"enabled":case"disabled":case"settings-updated":j(b,f),y(g=>{const a=g.findIndex(t=>t.id===u.pluginId);if(a>=0){const t=[...g];return t[a]={...t[a],enabled:u.enabled,state:u.state,settings:u.settings,error:u.error},t}else return h(),g});break;case"state-changed":y(g=>{const a=g.findIndex(t=>t.id===u.pluginId);if(a>=0){const t=[...g];return t[a]={...t[a],state:u.state,error:u.error},t}return g});break;case"uninstalled":y(g=>g.filter(a=>a.id!==u.pluginId)),j(b,f);break;case"error":y(g=>{const a=g.findIndex(t=>t.id===u.pluginId);if(a>=0){const t=[...g];return t[a]={...t[a],state:u.state,error:u.error},t}return g});break}}catch{}};return $e(`/api/events${s}`,{events:{"plugin:lifecycle":i},onReconnect:()=>{h(),j(b,f)}})},[o,h,j,f,b]);const ee=async()=>{if(!E.trim()){r(n("plugins.installPathRequired","Please enter a plugin path"),"error");return}try{_(!0),await O({path:E,...H?{aiScanOnLoad:!0}:{}},o),r(n("plugins.installedGlobally","Plugin installed globally"),"success"),A(!1),L(""),M(!1),await h()}catch(s){r(n("plugins.installFailed","Failed to install plugin: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}finally{_(!1)}},Ae=async s=>{if(!s.path){r(n("plugins.builtinNoPackage","{{name}} is built in and does not have an installable package yet",{name:s.name}),"warning");return}try{T(s.id),await O({path:s.path},o),r(n("plugins.builtinInstalledGlobally","{{name}} installed globally",{name:s.name}),"success"),await h()}catch(i){r(n("plugins.builtinInstallFailed","Failed to install {{name}}: {{error}}",{name:s.name,error:i instanceof Error?i.message:String(i)}),"error")}finally{T(null)}},Le=async s=>{if(!s.path){r(n("plugins.registryNotInstallable","{{name}} is not available for one-click install yet",{name:s.name}),"warning");return}try{Y(s.id),await O({path:s.path},o),r(n("plugins.registryInstalled","{{name}} installed and enabled",{name:s.name}),"success"),await h(),await j(b,f)}catch(i){r(n("plugins.registryInstallFailed","Failed to install {{name}}: {{error}}",{name:s.name,error:i instanceof Error?i.message:String(i)}),"error")}finally{Y(null)}},se=async s=>{try{Z(s.id);const i=await ns(s.id,o);if(!i.success){r(n("plugins.setupInstallFailed","Failed to install {{name}} setup: {{error}}",{name:s.name,error:i.error??n("plugins.unknownError","unknown error")}),"error");return}r(n("plugins.setupInstalled","{{name}} setup installed",{name:s.name}),"success"),X(s.id);const l=await ce(s.id,o);G(u=>({...u,[s.id]:l}))}catch(i){r(n("plugins.setupInstallFailed","Failed to install {{name}} setup: {{error}}",{name:s.name,error:i instanceof Error?i.message:String(i)}),"error")}finally{Z(null),X(null)}},ne=async s=>{try{const i=await Ze(s.id,o);if(i.state==="error"){r(n("plugins.enableFailed","Failed to enable {{name}}: {{error}}",{name:s.name,error:i.error??n("plugins.unknownError","unknown error")}),"error"),await h();return}r(n("plugins.enabledForProject","{{name}} enabled for this project",{name:s.name}),"success"),await h()}catch(i){r(n("plugins.enablePluginFailed","Failed to enable plugin: {{error}}",{error:i instanceof Error?i.message:String(i)}),"error")}},ie=async s=>{try{await Xe(s.id,o),r(n("plugins.disabledForProject","{{name}} disabled for this project",{name:s.name}),"success"),await h()}catch(i){r(n("plugins.disablePluginFailed","Failed to disable plugin: {{error}}",{error:i instanceof Error?i.message:String(i)}),"error")}},te=async s=>{try{$(s.id),await Ye(s.id,o),r(n("plugins.reloaded","{{name}} reloaded",{name:s.name}),"success"),await h()}catch(i){r(n("plugins.reloadFailed","Failed to reload plugin: {{error}}",{error:i instanceof Error?i.message:String(i)}),"error")}finally{$(null)}},ae=async s=>{if(await ke({title:n("plugins.uninstallTitle","Uninstall Plugin Globally"),message:n("plugins.uninstallConfirm",'Are you sure you want to uninstall "{{name}}" globally (all projects)?',{name:s.name}),danger:!0}))try{await es(s.id,o),r(n("plugins.uninstalledGlobally","{{name}} uninstalled globally",{name:s.name}),"success"),await h(),D(null)}catch(l){r(n("plugins.uninstallFailed","Failed to uninstall plugin: {{error}}",{error:l instanceof Error?l.message:String(l)}),"error")}},De=async(s,i)=>{try{await Ke(s.id,{aiScanOnLoad:i},o),r(i?n("plugins.aiScanEnabled","AI scan on load enabled"):n("plugins.aiScanDisabled","AI scan on load disabled"),"success"),await h()}catch(l){r(n("plugins.updateFailed","Failed to update plugin: {{error}}",{error:l instanceof Error?l.message:String(l)}),"error")}},Ge=async s=>{try{await Qe(s.id,o),r(n("plugins.rescanned","{{name}} rescanned",{name:s.name}),"success"),await h()}catch(i){r(n("plugins.rescanFailed","Failed to rescan plugin: {{error}}",{error:i instanceof Error?i.message:String(i)}),"error")}},k=async s=>{D(s);try{V(!0);const i=await ss(s.id,o);x(i)}catch{x({})}finally{V(!1)}},Oe=async()=>{if(c)try{await Je(c.id,m,o),r(n("plugins.settingsSaved","Settings saved"),"success")}catch(s){r(n("plugins.saveSettingsFailed","Failed to save settings: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}};if(c)return e.jsxs("div",{className:"plugin-manager-detail","data-testid":"plugin-manager-detail",children:[e.jsxs("div",{className:"plugin-manager-detail-header",children:[e.jsx("button",{className:"btn-icon",onClick:()=>D(null),"aria-label":n("plugins.backToList","Back to plugin list"),children:e.jsx(ge,{size:16})}),e.jsxs("div",{className:"plugin-detail-title",children:[e.jsxs("div",{className:"plugin-detail-title-copy",children:[e.jsx("h4",{className:"plugin-detail-name",children:c.name}),Se(c,"plugin-error-text plugin-error-text--detail")]}),e.jsx("span",{className:"plugin-state-badge",style:{color:F[c.state]||F.installed},children:c.state})]})]}),e.jsxs("div",{className:"plugin-detail-content",children:[e.jsxs("div",{className:"plugin-detail-card",children:[c.description&&e.jsx("p",{className:"plugin-description",children:c.description}),c.author&&e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:n("plugins.author","Author:")}),c.author]}),c.homepage&&e.jsxs("p",{className:"plugin-detail-meta-row plugin-homepage",children:[e.jsx("span",{className:"text-muted",children:n("plugins.homepage","Homepage:")}),e.jsxs("a",{href:c.homepage,target:"_blank",rel:"noopener noreferrer",children:[c.homepage,e.jsx(Ve,{size:12})]})]}),e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:n("plugins.version","Version:")}),c.version]})]}),e.jsxs("div",{className:"plugin-detail-card",children:[e.jsx("h5",{className:"plugin-detail-section-heading",children:n("plugins.securityScan","Security Scan")}),e.jsxs("div",{className:"plugin-security-row",children:[e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:!!c.aiScanOnLoad,onChange:s=>void De(c,s.target.checked)}),n("plugins.enableAiScanBeforeLoad","Enable AI scan before load/reload")]}),e.jsxs("button",{className:"btn btn-secondary btn-sm",onClick:()=>void Ge(c),children:[e.jsx(qe,{size:14})," ",n("plugins.rescanAndReload","Rescan and Reload")]})]}),e.jsx("p",{className:"text-muted",children:n("plugins.aiScanHint","Turning this on only updates configuration. Use Rescan and Reload to run it now.")}),c.lastSecurityScan?e.jsxs("div",{className:"plugin-security-results",children:[e.jsxs("div",{className:"plugin-security-header",children:[e.jsx("span",{className:`plugin-state-badge plugin-security-badge plugin-security-badge--${c.lastSecurityScan.verdict}`,children:c.lastSecurityScan.verdict}),e.jsx("span",{className:"text-muted",children:c.lastSecurityScan.scannedAt})]}),e.jsx("p",{className:"plugin-security-summary",children:c.lastSecurityScan.summary}),e.jsxs("details",{children:[e.jsx("summary",{children:n("plugins.findings","Findings ({{count}})",{count:c.lastSecurityScan.findings.length})}),e.jsx("ul",{className:"plugin-security-findings",children:c.lastSecurityScan.findings.map((s,i)=>e.jsxs("li",{children:[e.jsx("strong",{children:s.severity})," ",s.category," — ",s.file,": ",s.reason]},`${s.file}-${i}`))})]})]}):e.jsx("p",{className:"text-muted",children:n("plugins.noSecurityScan","No security scan has been run yet.")})]}),e.jsxs("div",{className:"plugin-detail-card",children:[e.jsx("h5",{className:"plugin-detail-section-heading",children:n("plugins.settings","Settings")}),ve?e.jsx("p",{className:"text-muted",children:n("plugins.loading","Loading...")}):(()=>{const s=as(c);return s&&Object.keys(s).length>0?e.jsxs("div",{className:"plugin-settings-form",children:[(()=>{const{grouped:i,ungrouped:l}=ls(s),u=[];l.length>0&&u.push({title:null,entries:l});for(const[g,a]of i.entries())u.push({title:g,entries:a});return u.map(g=>e.jsxs("div",{className:g.title?"plugin-settings-group":void 0,children:[g.title&&e.jsx("h6",{className:"plugin-settings-group-heading",children:ye[g.title]?n(ye[g.title],g.title):g.title}),g.entries.map(([a,t])=>{const N=`setting-${a}-help`,P=t.label?xe[t.label]?n(xe[t.label],t.label):t.label:a;return e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:`setting-${a}`,children:[P,t.required&&" *"]}),t.type==="string"&&!t.multiline&&e.jsx("input",{className:"input",type:"text",id:`setting-${a}`,value:m[a]??"",onChange:p=>x({...m,[a]:p.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?N:void 0}),t.type==="string"&&t.multiline&&e.jsx("textarea",{className:"input",id:`setting-${a}`,rows:4,value:m[a]??"",onChange:p=>x({...m,[a]:p.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?N:void 0}),t.type==="password"&&e.jsx("input",{className:"input",type:"password",id:`setting-${a}`,value:m[a]??"",onChange:p=>x({...m,[a]:p.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?N:void 0}),t.type==="number"&&e.jsx("input",{className:"input",type:"number",id:`setting-${a}`,value:m[a]??"",onChange:p=>x({...m,[a]:Number(p.target.value)}),"aria-describedby":t.description&&!t.required?N:void 0}),t.type==="boolean"&&e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:m[a]??!1,onChange:p=>x({...m,[a]:p.target.checked})}),t.description]}),t.type==="enum"&&e.jsxs("select",{className:"select",id:`setting-${a}`,value:m[a]??"",onChange:p=>x({...m,[a]:p.target.value}),"aria-describedby":t.description&&!t.required?N:void 0,children:[e.jsx("option",{value:"",children:n("plugins.selectOption","Select...")}),t.enumValues?.map(p=>e.jsx("option",{value:p,children:p},p))]}),t.type==="array"&&e.jsxs("div",{className:"plugin-settings-array",children:[m[a]?.map((p,R)=>e.jsxs("div",{className:"plugin-settings-array-item",children:[e.jsx("input",{className:"input",type:t.itemType==="number"?"number":"text",value:p??"",onChange:ue=>{const I=ue.target.value,oe=[...m[a]||[]];oe[R]=t.itemType==="number"?Number(I):I,x({...m,[a]:oe})}}),e.jsx("button",{className:"btn-icon",onClick:()=>{const I=[...m[a]||[]];I.splice(R,1),x({...m,[a]:I})},"aria-label":n("plugins.removeItem","Remove item"),children:e.jsx(ge,{size:14})})]},R)),e.jsxs("button",{className:"btn btn-secondary",onClick:()=>{const p=m[a]||[],R=t.itemType==="number"?0:"";x({...m,[a]:[...p,R]})},children:[e.jsx(de,{size:14})," ",n("plugins.addItem","Add Item")]})]}),t.description&&!t.required&&!t.multiline&&e.jsx("span",{id:N,className:"form-help",children:t.description})]},a)})]},g.title??"ungrouped"))})(),e.jsx("button",{className:"btn btn-primary",onClick:Oe,children:n("plugins.saveSettings","Save Settings")})]}):e.jsx("p",{className:"text-muted",children:n("plugins.noConfigurableSettings","No configurable settings.")})})()]}),e.jsxs("div",{className:"plugin-detail-actions",children:[c.state==="started"&&e.jsxs("button",{className:"btn btn-secondary",onClick:()=>te(c),disabled:w===c.id,children:[e.jsx(pe,{size:14,className:w===c.id?"spin":""}),w===c.id?n("plugins.reloading","Reloading..."):n("plugins.reload","Reload")]}),c.enabled?e.jsx("button",{className:"btn btn-secondary",onClick:()=>ie(c),children:n("plugins.disableInProject","Disable in Project")}):e.jsx("button",{className:"btn btn-primary",onClick:()=>ne(c),children:n("plugins.enableInProject","Enable in Project")}),e.jsxs("button",{className:"btn btn-danger",onClick:()=>ae(c),children:[e.jsx(me,{size:14})," ",n("plugins.uninstallGlobally","Uninstall Globally")]})]})]})]});const le=new Map(S.map(s=>[s.id,s])),re=S,ze=()=>e.jsxs("section",{className:"plugin-registry-section","aria-label":n("plugins.browseRegistry","Browse Registry"),children:[e.jsxs("div",{className:"plugin-registry-header",children:[e.jsxs("div",{className:"plugin-registry-heading-copy",children:[e.jsx("h4",{className:"plugin-registry-heading",children:n("plugins.browseRegistry","Browse Registry")}),e.jsx("p",{className:"plugin-registry-description",children:n("plugins.registryDescription","Discover curated runtimes and integrations that can be added to this Fusion workspace.")})]}),e.jsxs("div",{className:"plugin-registry-controls",children:[e.jsxs("label",{className:"plugin-registry-category-label",children:[e.jsx("span",{className:"sr-only",children:n("plugins.registryCategory","Registry category")}),e.jsxs("select",{className:"select plugin-registry-category-select",value:f,onChange:s=>Re(s.target.value),"aria-label":n("plugins.registryCategory","Registry category"),children:[e.jsx("option",{value:"",children:n("plugins.registryCategoryAll","All Categories")}),e.jsx("option",{value:"runtime",children:n("plugins.registryCategoryRuntime","Runtime")}),e.jsx("option",{value:"integration",children:n("plugins.registryCategoryIntegration","Integration")})]})]}),e.jsxs("label",{className:"plugin-registry-search-label",children:[e.jsx("span",{className:"sr-only",children:n("plugins.searchRegistry","Search registry")}),e.jsx("input",{className:"input plugin-registry-search-input",type:"search",value:b,onChange:s=>Pe(s.target.value),placeholder:n("plugins.searchRegistryPlaceholder","Search registry plugins")})]})]})]}),Ce?e.jsxs("div",{className:"plugin-registry-state",role:"status",children:[e.jsx(he,{size:14,className:"spin"}),n("plugins.registryLoading","Loading registry...")]}):Q?e.jsxs("div",{className:"plugin-registry-state plugin-registry-state--error",role:"alert",children:[e.jsx("span",{children:n("plugins.registryLoadFailed","Failed to load registry: {{error}}",{error:Q})}),e.jsx("button",{className:"btn btn-secondary btn-sm plugin-registry-retry",onClick:()=>void j(b,f),children:n("plugins.retry","Retry")})]}):W.length===0?e.jsx("div",{className:"plugin-registry-state",children:b.trim()?n("plugins.registryEmptySearch","No registry plugins match your search."):n("plugins.registryEmpty","No registry plugins are available.")}):e.jsx("div",{className:"plugin-registry-list","aria-label":n("plugins.registryPluginResults","Registry plugin results"),children:W.map(s=>{const i=le.get(s.id),l=Ie===s.id;return e.jsxs("div",{className:"plugin-registry-item",children:[e.jsxs("div",{className:"plugin-registry-meta",children:[e.jsxs("div",{className:"plugin-registry-title-row",children:[e.jsx("span",{className:"plugin-registry-name",children:s.name}),e.jsxs("span",{className:"plugin-registry-version",children:["v",s.version]}),e.jsx("span",{className:"plugin-registry-badge",children:s.category}),s.installed&&e.jsxs("span",{className:"plugin-registry-status plugin-registry-status--installed",children:[n("plugins.statusInstalled","Installed"),s.installedVersion&&s.installedVersion!==s.version?` · v${s.installedVersion}`:""]})]}),e.jsx("span",{className:"plugin-registry-description-text",children:s.description}),e.jsx("span",{className:"plugin-registry-author",children:n("plugins.registryByAuthor","By {{author}}",{author:s.author})})]}),e.jsx("div",{className:"plugin-registry-actions",children:s.installed?e.jsx("button",{className:"btn btn-secondary btn-sm plugin-registry-action",onClick:()=>{i?k(i):h()},children:n("plugins.manage","Manage")}):s.canInstall?e.jsx("button",{className:"btn btn-primary btn-sm plugin-registry-action",onClick:()=>void Le(s),disabled:l,children:l?n("plugins.installing","Installing..."):n("plugins.installFromRegistry","Install")}):e.jsx("span",{className:"plugin-registry-coming-soon",children:n("plugins.registryComingSoon","Coming Soon")})})]},s.id)})})]}),Ue=()=>e.jsxs("section",{className:"plugin-builtins-section","aria-label":n("plugins.builtinPlugins","Built-in Plugins"),children:[e.jsxs("div",{className:"plugin-builtins-header",children:[e.jsx("h4",{className:"plugin-builtins-heading",children:n("plugins.builtinPlugins","Built-in Plugins")}),e.jsx("p",{className:"plugin-builtins-description",children:n("plugins.builtinPluginsCatalog","Built-in plugin catalog for runtimes and integrations.")})]}),e.jsx("div",{className:"plugin-builtins-list","aria-label":n("plugins.builtinPluginRecommendations","Built-in plugin recommendations"),children:fe.map(s=>{const i=le.get(s.id),l=!!i,u=Ee[s.id],g=!!(u&&"setupCheckDeferred"in u&&u.setupCheckDeferred),a=u&&"status"in u?u.status:void 0,t=l&&s.hasSetup&&u?.hasSetup&&!g&&i?.state==="started"&&(a==="not-installed"||a==="error"),N=l&&u?.hasSetup&&a==="installed",P=Be===s.id,p=!s.path;return e.jsxs("div",{className:"plugin-builtins-item",children:[e.jsxs("div",{className:"plugin-builtins-meta",children:[e.jsx("span",{className:"plugin-builtins-name",children:s.name}),s.experimental&&e.jsx("span",{className:"plugin-builtins-runtime-badge",children:n("plugins.experimental","Experimental")}),e.jsx("span",{className:"plugin-builtins-runtime-badge",children:s.category}),e.jsx("span",{className:`plugin-builtins-status ${l?"plugin-builtins-status--installed":"plugin-builtins-status--available"}`,children:l?n("plugins.statusInstalled","Installed"):p?n("plugins.statusBuiltIn","Built in"):n("plugins.statusNotInstalled","Not installed")}),t&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--warning",children:n("plugins.setupRequired","Setup required")}),N&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--ready",children:n("plugins.setupReady","Setup ready")}),P&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--pending",children:n("plugins.checkingSetup","Checking setup...")}),g&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--deferred",children:n("plugins.startPluginToCheckSetup","Start plugin to check setup")}),e.jsx("span",{className:"plugin-builtins-description-text",children:s.description})]}),p?l&&t?e.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>void se(s),disabled:B===s.id||P,children:B===s.id?n("plugins.settingUp","Setting up..."):n("plugins.installSetup","Install Setup")}):l&&i?e.jsx("button",{className:"btn btn-secondary btn-sm",onClick:()=>void k(i),children:n("plugins.manage","Manage")}):e.jsx("span",{className:"plugin-builtins-metadata-only",children:n("plugins.builtinMetadataOnly","Built-in metadata only")}):e.jsx("button",{className:`btn ${l&&!t?"btn-secondary":"btn-primary"} btn-sm`,onClick:()=>{if(!l){Ae(s);return}if(t){se(s);return}i&&k(i)},disabled:q===s.id||B===s.id||P,children:l?t?B===s.id?n("plugins.settingUp","Setting up..."):n("plugins.installSetup","Install Setup"):n("plugins.manage","Manage"):q===s.id?n("plugins.installing","Installing..."):n("plugins.installNamed","Install {{name}}",{name:s.name})})]},s.id)})})]});return e.jsxs("div",{className:"plugin-manager","data-testid":"plugin-manager",children:[e.jsxs("div",{className:"plugin-manager-header",children:[e.jsx("span",{className:"plugin-manager-header-title",children:n("plugins.installedPlugins","Installed Plugins")}),e.jsxs("div",{className:"plugin-manager-actions",children:[e.jsxs("button",{className:"btn btn-sm",onClick:h,title:n("plugins.refresh","Refresh"),"aria-label":n("plugins.refreshPluginList","Refresh plugin list"),children:[e.jsx(he,{size:14,className:v?"spin":""}),n("plugins.refresh","Refresh")]}),e.jsxs("button",{className:"btn btn-primary btn-sm",onClick:()=>A(!0),children:[e.jsx(de,{size:14})," ",n("plugins.install","Install")]})]})]}),Ne&&e.jsxs("div",{className:"plugin-install-form",children:[e.jsx("p",{className:"plugin-install-hint",children:n("plugins.installHint","Browse to a plugin package root (contains manifest.json) or a built dist directory.")}),e.jsx(is,{value:E,onChange:L,placeholder:n("plugins.installPathPlaceholder","Absolute path to plugin directory or dist folder"),onInputKeyDown:s=>{s.key==="Enter"&&(s.preventDefault(),ee())}}),e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:H,onChange:s=>M(s.target.checked)}),n("plugins.enableAiSecurityScan","Enable AI security scan on load")]}),e.jsxs("div",{className:"plugin-install-actions",children:[e.jsx("button",{className:"btn btn-primary",onClick:ee,disabled:U||!E.trim(),children:U?n("plugins.installing","Installing..."):n("plugins.installPluginGlobally","Install Plugin Globally")}),e.jsx("button",{className:"btn btn-secondary",onClick:()=>{A(!1),L("")},children:n("plugins.cancel","Cancel")})]})]}),v?e.jsx("div",{className:"settings-empty-state",children:n("plugins.loadingPlugins","Loading plugins...")}):e.jsxs(e.Fragment,{children:[re.length===0?e.jsxs("div",{className:"settings-empty-state",children:[e.jsx(Te,{size:32,className:"text-muted"}),e.jsx("p",{children:n("plugins.noPluginsInstalled","No plugins installed.")}),e.jsx("p",{className:"text-muted",children:n("plugins.noPluginsHint","Install a plugin to get started, or use the built-in catalog below.")})]}):e.jsx("div",{className:"plugin-list",children:re.map(s=>e.jsxs("div",{className:"plugin-item",children:[e.jsx("div",{className:"plugin-info",children:e.jsxs("div",{className:"plugin-copy",children:[e.jsxs("div",{className:"plugin-copy-header",children:[e.jsx("span",{className:"plugin-name",children:s.name}),e.jsxs("span",{className:"plugin-version text-muted",children:["v",s.version]}),e.jsx("span",{className:"plugin-state-badge",style:{color:F[s.state]||F.installed},children:s.state})]}),Se(s)]})}),e.jsxs("div",{className:"plugin-actions",children:[s.state==="started"&&e.jsx("button",{className:"btn-icon",onClick:()=>te(s),disabled:w===s.id,title:n("plugins.reload","Reload"),children:e.jsx(pe,{size:14,className:w===s.id?"spin":""})}),e.jsxs("label",{className:"toggle-switch",children:[e.jsx("input",{type:"checkbox",checked:s.enabled,onChange:()=>s.enabled?ie(s):ne(s),"aria-label":s.enabled?n("plugins.disablePlugin","Disable {{name}}",{name:s.name}):n("plugins.enablePlugin","Enable {{name}}",{name:s.name})}),e.jsx("span",{className:"toggle-slider"})]}),e.jsx("button",{className:"btn-icon",onClick:()=>k(s),title:n("plugins.settings","Settings"),children:e.jsx(We,{size:14})}),e.jsx("button",{className:"btn-icon",onClick:()=>ae(s),title:n("plugins.uninstallGloballyTitle","Uninstall globally"),children:e.jsx(me,{size:14})})]})]},s.id))}),Ue(),ze()]})]})}export{be as AGENT_BROWSER_SETTINGS_SCHEMA,je as BUILTIN_AGENT_BROWSER_PLUGIN_ID,fe as BUILTIN_PLUGINS,bs as PluginManager,F as STATE_COLORS};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as d,j as e}from"./vendor-react-D37HfzIf.js";import{c as I,T as b,aC as j,b8 as q,cI as y,bx as H,cJ as M,aB as P,C as $,cK as L,cH as A}from"./index-
|
|
1
|
+
import{r as d,j as e}from"./vendor-react-D37HfzIf.js";import{c as I,T as b,aC as j,b8 as q,cI as y,bx as H,cJ as M,aB as P,C as $,cK as L,cH as A}from"./index-CpTBp1RG.js";import"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.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 s,j as e}from"./vendor-react-D37HfzIf.js";import{u as C}from"./vendor-i18n-CV0mwX_-.js";import{L as k,ay as I}from"./index-
|
|
1
|
+
import{r as s,j as e}from"./vendor-react-D37HfzIf.js";import{u as C}from"./vendor-i18n-CV0mwX_-.js";import{L as k,ay as I}from"./index-CpTBp1RG.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";function p(i){return`${(i*100).toFixed(1)}%`}function v(i){return i===null?"—":`${(i/6e4).toFixed(1)}m`}function o(i){if(!i)return"—";const t=new Date(i);return Number.isNaN(t.getTime())?i:t.toLocaleString()}function O(){const{t:i}=C("app"),[t,g]=s.useState(null),[f,u]=s.useState(!0),[h,y]=s.useState(null),[c,w]=s.useState(!1),[N,m]=s.useState(!1),[b,x]=s.useState(null),d=s.useCallback(async()=>{u(!0),y(null);try{const a=await fetch("/api/health/reliability");if(!a.ok)throw new Error(`Failed to load reliability metrics (${a.status})`);const r=await a.json();g(r)}catch(a){y(a instanceof Error?a.message:i("reliability.failedToLoad","Failed to load reliability metrics"))}finally{u(!1)}},[i]),D=s.useCallback(async()=>{x(null);const a=await fetch("/api/health/reliability/reset",{method:"POST"});if(!a.ok)throw new Error(`Failed to reset reliability metrics (${a.status})`);await d(),m(!1)},[d]);s.useEffect(()=>{d();const a=setInterval(()=>{d()},6e4);return()=>clearInterval(a)},[d]);const l=t?.headline.inReviewFailureRate7d,n=s.useMemo(()=>l==null?null:Math.max(0,Math.min(1,1-l)),[l]),R=s.useMemo(()=>n===null?"var(--text-muted)":n>=.95?"var(--color-success)":n>=.9?"var(--color-warning)":"var(--color-error)",[n]),A=s.useMemo(()=>(t?.perDay??[]).reduce((a,r)=>a+r.tasksEnteredInReview,0),[t?.perDay]),M=s.useMemo(()=>(t?.perDay??[]).reduce((a,r)=>a+r.tasksBouncedToInProgress,0),[t?.perDay]),S=s.useMemo(()=>t?.perDay?c?t.perDay:t.perDay.filter(a=>a.hasSamples!==!1):[],[t?.perDay,c]),j=s.useMemo(()=>Object.values(t?.mergeAttempts.histogram??{}).reduce((a,r)=>a+r,0),[t?.mergeAttempts.histogram]),E=t?o(t.resetAt??new Date(Date.parse(t.generatedAt)-t.windowDays*864e5).toISOString()):"—";return f&&t===null?e.jsxs("div",{className:"reliability-loading","data-testid":"reliability-loading",children:[e.jsx(k,{size:24,className:"spin"}),e.jsx("p",{children:i("reliability.loading","Loading reliability data...")})]}):h!==null&&t===null?e.jsxs("div",{className:"reliability-error","data-testid":"reliability-error",role:"alert",children:[e.jsx(I,{size:24}),e.jsx("p",{children:h})]}):e.jsxs("section",{className:"reliability-view",children:[e.jsxs("div",{className:"card reliability-card reliability-headline-card",children:[e.jsxs("div",{className:"reliability-section-header",children:[e.jsx("h2",{children:i("reliability.heading","Reliability")}),e.jsx("button",{className:"btn btn-danger btn-sm",onClick:()=>m(!0),children:i("reliability.resetStats","Reset stats")})]}),e.jsx("div",{className:"reliability-headline",style:{color:R},children:l==null?i("reliability.insufficientData","Insufficient data — {{reason}}",{reason:t?.headline.reason??"unknown"}):p(n??0)}),n!==null?e.jsx("div",{className:"reliability-muted",children:i("reliability.successRateLabel","In-review success rate (last 7d)")}):null,t?.resetAt?e.jsx("div",{className:"reliability-muted",children:i("reliability.countingSince","Counting since {{date}}",{date:o(t.resetAt)})}):null,e.jsxs("details",{className:"reliability-details",children:[e.jsx("summary",{children:i("reliability.details","Details")}),e.jsxs("div",{className:"reliability-details-content",children:[e.jsx("div",{children:i("reliability.bouncedEntered","{{bounced}} bounced / {{entered}} entered (last {{days}}d)",{bounced:M,entered:A,days:t?.windowDays??7})}),l!=null?e.jsx("div",{children:i("reliability.failureRate","Failure rate: {{rate}}",{rate:p(l)})}):null,e.jsx("div",{children:i("reliability.window","Window: {{start}} → {{end}}",{start:E,end:o(t?.generatedAt)})}),t?.resetAt?e.jsx("div",{children:i("reliability.resetBaseline","Reset baseline: {{date}}",{date:o(t.resetAt)})}):null,t?.headline.reason?e.jsx("div",{children:i("reliability.reason","Reason: {{reason}}",{reason:t.headline.reason})}):null]})]})]}),e.jsxs("div",{className:"reliability-grid",children:[e.jsxs("div",{className:"card reliability-card",children:[e.jsxs("div",{className:"reliability-section-header",children:[e.jsx("h3",{children:i("reliability.inReviewFlow","In-review flow")}),e.jsx("button",{className:"btn btn-sm",onClick:()=>w(a=>!a),children:c?i("reliability.hideEmptyDays","Hide empty days"):i("reliability.showEmptyDays","Show empty days")})]}),e.jsxs("table",{className:"reliability-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:i("reliability.table.date","Date")}),e.jsx("th",{children:i("reliability.table.entered","Entered")}),e.jsx("th",{children:i("reliability.table.bounced","Bounced")})]})}),e.jsx("tbody",{children:S.map(a=>e.jsxs("tr",{children:[e.jsx("td",{children:a.date}),e.jsx("td",{children:a.tasksEnteredInReview}),e.jsx("td",{children:a.tasksBouncedToInProgress})]},a.date))})]})]}),e.jsxs("div",{className:"card reliability-card",children:[e.jsx("h3",{children:i("reliability.duration.heading","Duration")}),e.jsxs("div",{className:"reliability-stat-row",children:[e.jsx("span",{children:i("reliability.duration.p50","P50")}),e.jsx("strong",{children:v(t?.duration.p50Ms??null)})]}),e.jsxs("div",{className:"reliability-stat-row",children:[e.jsx("span",{children:i("reliability.duration.p95","P95")}),e.jsx("strong",{children:v(t?.duration.p95Ms??null)})]}),e.jsx("div",{className:"reliability-muted",children:i("reliability.duration.samples","Samples: {{count}}",{count:t?.duration.sampleCount??0})}),e.jsxs("details",{className:"reliability-details",children:[e.jsx("summary",{children:i("reliability.duration.moreStats","More stats")}),e.jsxs("div",{className:"reliability-details-content",children:[e.jsx("div",{children:i("reliability.duration.p50Raw","P50 raw: {{value}} ms",{value:t?.duration.p50Ms??"—"})}),e.jsx("div",{children:i("reliability.duration.p95Raw","P95 raw: {{value}} ms",{value:t?.duration.p95Ms??"—"})}),e.jsx("div",{children:i("reliability.duration.sampleCount","Sample count: {{count}}",{count:t?.duration.sampleCount??0})}),t?.duration.reason?e.jsx("div",{children:i("reliability.duration.reason","Reason: {{reason}}",{reason:t.duration.reason})}):null]})]})]}),e.jsxs("div",{className:"card reliability-card",children:[e.jsx("h3",{children:i("reliability.mergeAttempts.heading","Merge attempts")}),e.jsxs("div",{className:"reliability-stat-row",children:[e.jsx("span",{children:i("reliability.mergeAttempts.mean","Mean")}),e.jsx("strong",{children:t?.mergeAttempts.mean?.toFixed(2)??"—"})]}),e.jsxs("div",{className:"reliability-stat-row",children:[e.jsx("span",{children:i("reliability.mergeAttempts.max","Max")}),e.jsx("strong",{children:t?.mergeAttempts.max??"—"})]}),e.jsx("ul",{className:"reliability-histogram",children:Object.entries(t?.mergeAttempts.histogram??{}).map(([a,r])=>e.jsxs("li",{children:[e.jsx("span",{children:a}),e.jsx("div",{className:"reliability-histogram-bar-wrap",children:e.jsx("div",{className:"reliability-histogram-bar",style:{width:`${Math.min(r*20,100)}%`}})}),e.jsx("strong",{children:r})]},a))}),e.jsxs("details",{className:"reliability-details",children:[e.jsx("summary",{children:i("reliability.mergeAttempts.moreStats","More stats")}),e.jsxs("div",{className:"reliability-details-content",children:[e.jsx("div",{children:i("reliability.mergeAttempts.tasksCounted","Tasks counted: {{count}}",{count:j})}),e.jsx("div",{children:i("reliability.mergeAttempts.histogramTotal","Histogram total: {{count}}",{count:j})}),t?.mergeAttempts.reason?e.jsx("div",{children:i("reliability.mergeAttempts.reason","Reason: {{reason}}",{reason:t.mergeAttempts.reason})}):null]})]})]})]}),N?e.jsx("div",{className:"modal-overlay open",role:"presentation",children:e.jsxs("div",{className:"modal",role:"dialog","aria-modal":"true","aria-labelledby":"reliability-reset-title",children:[e.jsx("div",{className:"modal-header",children:e.jsx("h2",{id:"reliability-reset-title",children:i("reliability.resetModal.title","Reset reliability stats?")})}),e.jsx("p",{children:i("reliability.resetModal.description","This sets a new baseline for reliability statistics. Historical events older than the reset time are excluded from counts but are not deleted.")}),b?e.jsx("div",{className:"form-error",children:b}):null,e.jsxs("div",{className:"modal-actions",children:[e.jsx("button",{className:"btn",onClick:()=>m(!1),children:i("common.cancel","Cancel")}),e.jsx("button",{className:"btn btn-danger",onClick:()=>{D().catch(a=>{x(a instanceof Error?a.message:i("reliability.resetModal.failedError","Failed to reset reliability stats"))})},children:i("reliability.resetModal.confirm","Confirm reset")})]})]})}):null]})}export{O as ReliabilityView};
|