@runfusion/fusion 0.42.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 +2454 -1618
- package/dist/client/.vite/manifest.json +74 -74
- package/dist/client/assets/AgentDetailView-BGN03dyz.css +1 -0
- package/dist/client/assets/{AgentDetailView-C5Lb3fd3.js → AgentDetailView-DKMz3r04.js} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor-DtRcvE6M.js → AgentPermissionPolicyEditor-BiY1a4KR.js} +2 -2
- package/dist/client/assets/{AgentsView-BVW-NOYD.js → AgentsView-Co-k4vjh.js} +3 -3
- package/dist/client/assets/ChatView-BkAG99bj.js +6 -0
- package/dist/client/assets/{DevServerView-DLsFSP4s.js → DevServerView-C6DC0URX.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-_QawX-uL.js → DirectoryPicker-CkcGjyv0.js} +1 -1
- package/dist/client/assets/{DocumentsView-DierUJsj.js → DocumentsView-OCK1Vsw_.js} +1 -1
- package/dist/client/assets/{EvalsView-B83lYKQl.js → EvalsView-CUfyj5GW.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-CTctYTPU.js → ExperimentalAgentOnboardingModal-Dau9RTU_.js} +1 -1
- package/dist/client/assets/{GoalsView-CKn8i0i0.js → GoalsView-CNLTn0rX.js} +1 -1
- package/dist/client/assets/{InsightsView-EpRHCD8G.js → InsightsView-BQPxHxKI.js} +1 -1
- package/dist/client/assets/{MemoryView-Df_ocTc5.js → MemoryView-D3xQIFjj.js} +1 -1
- package/dist/client/assets/{NodesView-DF7xJ_3z.js → NodesView-CSMvGwDU.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-BOooOEDx.js → PiExtensionsManager-BtqXF3fl.js} +1 -1
- package/dist/client/assets/{PluginManager-CHrDAzK6.js → PluginManager-CSSDb3VO.js} +1 -1
- package/dist/client/assets/{PullRequestView-CJU21OZ6.js → PullRequestView-Bjyfffdu.js} +1 -1
- package/dist/client/assets/{ReliabilityView-uHkW1Qeu.js → ReliabilityView-QKMUDebT.js} +1 -1
- package/dist/client/assets/{ResearchView-oZ2-vbjL.js → ResearchView-CRU_NPho.js} +1 -1
- package/dist/client/assets/{SecretsView-BpkqSV_E.js → SecretsView-Bs8ySyC5.js} +1 -1
- package/dist/client/assets/SecretsView-Djo1rahi.css +1 -0
- package/dist/client/assets/{SessionTerminal-D9IW4cDj.js → SessionTerminal-Dk1NgmN2.js} +1 -1
- package/dist/client/assets/SettingsModal-DpAxDq6M.css +1 -0
- package/dist/client/assets/{SettingsModal-C8gsAazm.js → SettingsModal-JCaNvdAb.js} +6 -6
- package/dist/client/assets/{SettingsModal-BmB5l2bA.js → SettingsModal-Nw5cTKAK.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-BYLEU_7o.js → SetupWizardModal-CE79myEy.js} +1 -1
- package/dist/client/assets/{SkillsView-8GgQ8Z_Z.js → SkillsView-Dc8YskAX.js} +1 -1
- package/dist/client/assets/{StashRecoveryView-CT1t1Uf2.js → StashRecoveryView-CqKOFiXT.js} +1 -1
- package/dist/client/assets/{TodoView-BUj6ITAb.js → TodoView-BqIRwcZw.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-CN7GPmvV.js → WorkflowNodeEditor-2jDuk2FR.js} +1 -1
- package/dist/client/assets/WorkflowNodeEditor-BokhW3de.css +1 -0
- package/dist/client/assets/{app-DCot4oXA.js → app-CUu1sm3x.js} +2 -2
- package/dist/client/assets/{dashboard-view-CrYwb0oQ.js → dashboard-view-BhbN8LPh.js} +1 -1
- package/dist/client/assets/{folder-open-CREXTATY.js → folder-open-Bw1mxVfa.js} +1 -1
- package/dist/client/assets/index-CpTBp1RG.js +793 -0
- package/dist/client/assets/index-DqhCiU35.css +1 -0
- package/dist/client/assets/{upload-BvLUlwaH.js → upload-BCmd-1I0.js} +1 -1
- package/dist/client/assets/{users-CjhbU-sF.js → users-DO_t3V1p.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +1892 -1107
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugin-sdk/index.d.ts +6260 -86
- 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/bundled.js +177 -18
- 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 -9
- 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/ChatView-Dy-oIkrK.js +0 -6
- package/dist/client/assets/SecretsView-D5bHZ-wM.css +0 -1
- package/dist/client/assets/SettingsModal-bJvc9aHl.css +0 -1
- package/dist/client/assets/WorkflowNodeEditor-aPj8cv81.css +0 -1
- package/dist/client/assets/index-2kYpdJrx.js +0 -793
- package/dist/client/assets/index-CJUfvGdC.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 d,j as e}from"./vendor-react-D37HfzIf.js";import{v as _e,g0 as He,g1 as Me,g2 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,g3 as Te,ax as We,g4 as Ke,g5 as Qe,dD as Je,g6 as Ye,g7 as Xe,g8 as Ze,g9 as es,ga as O,dA as ss,gb as ns}from"./index-2kYpdJrx.js";import{D as is}from"./DirectoryPicker-_QawX-uL.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-CREXTATY.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};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as c,j as e}from"./vendor-react-D37HfzIf.js";import{a7 as z,a8 as de,a9 as ue,ak as he,aE as ve,ac as te,aF as xe,s as ye,aG as X,aH as ge,aI as Re,aJ as _e,aK as je,aL as Se,aM as we,ao as Ne,u as ke,aN as Ee,x as Ce,aO as Ae,L as Te,S as Le}from"./index-2kYpdJrx.js";import{u as me}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";const Pe="builtin",Q={pageFetch:!0,github:!1,localDocs:!0,llmSynthesis:!0};function ne(n){const t=n?.researchGlobalDefaults,i=n?.researchSettings;return{enabled:i?.enabled??n?.researchEnabled??n?.researchGlobalEnabled??!0,searchProvider:i?.searchProvider??t?.searchProvider??n?.researchGlobalWebSearchProvider??Pe,synthesisProvider:i?.synthesisProvider??t?.synthesisProvider,synthesisModelId:i?.synthesisModelId??t?.synthesisModelId,enabledSources:{webSearch:!0,pageFetch:i?.enabledSources?.pageFetch??t?.enabledSources?.pageFetch??Q.pageFetch,github:i?.enabledSources?.github??t?.enabledSources?.github??Q.github,localDocs:i?.enabledSources?.localDocs??t?.enabledSources?.localDocs??Q.localDocs,llmSynthesis:i?.enabledSources?.llmSynthesis??t?.enabledSources?.llmSynthesis??Q.llmSynthesis},limits:{maxConcurrentRuns:i?.limits?.maxConcurrentRuns??n?.researchMaxConcurrentRuns??n?.researchGlobalMaxConcurrentRuns??3,maxSourcesPerRun:i?.limits?.maxSourcesPerRun??t?.maxSourcesPerRun??n?.researchMaxSourcesPerRun??n?.researchGlobalMaxSourcesPerRun??20,maxDurationMs:i?.limits?.maxDurationMs??n?.researchDefaultTimeout??n?.researchGlobalDefaultTimeout??3e5,requestTimeoutMs:i?.limits?.requestTimeoutMs??n?.researchGlobalFetchTimeoutMs??3e4},defaultExportFormat:t?.defaultExportFormat??"markdown"}}const Fe=300,Ie=4e3,Me=["queued","running","cancelling","retry_waiting"];function ce(n,t){if(n instanceof Ne){const i=n;return{message:n.message,status:n.status,code:i.researchCode??"INTERNAL_ERROR",setupHint:i.setupHint,retryable:i.retryable}}return n instanceof Error?{message:n.message,code:"INTERNAL_ERROR"}:{message:t,code:"INTERNAL_ERROR"}}function De(n){if(!n)return{cancelable:!1,retryable:!1,isTransitioning:!1,blockingReason:"No run selected"};const t=Me.includes(n.status),i=n.status==="queued"||n.status==="running",v=n.lifecycle?.retryable,a=n.status==="failed"||n.status==="timed_out",_=!!(a&&v);let g;return!i&&t?g="Run is already transitioning":!i&&n.status==="completed"?g="Completed runs cannot be cancelled":!i&&n.status==="cancelled"?g="Run is already cancelled":!i&&n.status==="retry_exhausted"?g="Retry attempts exhausted":!i&&n.status==="failed"?g="Failed runs cannot be cancelled":!i&&n.status==="timed_out"&&(g="Timed out runs cannot be cancelled"),!_&&a&&v===!1&&(g=n.lifecycle?.errorCode==="RETRY_EXHAUSTED"?"Retry attempts exhausted":"Run is not retryable"),{cancelable:i,retryable:_,isTransitioning:t,blockingReason:g}}function He(n){const t=n?.projectId,i=t??"",v=`${ue.RESEARCH_RUNS_PREFIX}${i}`,a=`${ue.RESEARCH_SELECTED_ID_PREFIX}${i}`,_=z(v,{maxAgeMs:de}),g=z(a,{maxAgeMs:he}),s=c.useRef(Array.isArray(_)&&_.length>0),[F,P]=c.useState(()=>Array.isArray(_)?_:[]),[h,E]=c.useState(g??null),[A,N]=c.useState(null),[q,I]=c.useState({available:!0}),[M,T]=c.useState(!(Array.isArray(_)&&_.length>0)),[G,O]=c.useState(null),[$,j]=c.useState(null),[w,k]=c.useState(""),x=c.useRef(0),d=c.useRef(0),D=c.useRef(t);c.useEffect(()=>{D.current!==t&&(D.current=t,d.current++);const l=z(v,{maxAgeMs:de}),o=z(a,{maxAgeMs:he}),p=Array.isArray(l)&&l.length>0;P(Array.isArray(l)?l:[]),E(o??null),N(null),T(!p),s.current=p},[t,v,a]);const b=c.useCallback(async(l=w)=>{const o=++x.current,p=t;s.current||T(!0),O(null),j(null);try{const R=await ve({q:l||void 0,limit:100},p);if(o!==x.current||p!==t)return;P(R.runs),te(v,R.runs,{maxBytes:5e5}),s.current=!0,I(R.availability),h&&!R.runs.some(y=>y.id===h)&&(E(null),te(a,null,{maxBytes:5e5}),N(null))}catch(R){if(o!==x.current||p!==t)return;const y=ce(R,"Failed to load research runs");O(y.message),j(y)}finally{o===x.current&&T(!1)}},[t,v,w,a,h]),H=c.useCallback(async l=>{const o=await xe(l,t);return N(o.run),I(o.availability),o.run},[t]);c.useEffect(()=>{s.current||T(!0);const l=window.setTimeout(()=>{b(w)},Fe);return()=>window.clearTimeout(l)},[b,w]),c.useEffect(()=>{if(!h){N(null);return}H(h)},[H,h]),c.useEffect(()=>{const l=d.current,o=()=>d.current!==l,p=t?`?projectId=${encodeURIComponent(t)}`:"";let R=!0;const y=()=>{!R||o()||(b(),h&&H(h))},S=`/api/events${p}`,U=ye(S,{events:{"research:run:created":y,"research:run:updated":y,"research:run:completed":y,"research:run:failed":y,"research:run:cancelled":y},onReconnect:()=>{X({view:"useResearch",trigger:"sse-reconnect",projectId:t,replayAttempted:!1,sseChannel:S}),y()}});X({view:"useResearch",trigger:"sse-open",projectId:t,replayAttempted:!1,sseChannel:S});const L=window.setInterval(y,Ie);return()=>{R=!1,U(),window.clearInterval(L)}},[t,b,h,H]);const B=c.useCallback(l=>{E(l),te(a,l,{maxBytes:5e5})},[a]);return{runs:F,selectedRun:A,selectedRunId:h,setSelectedRunId:B,availability:q,loading:M,error:G,searchQuery:w,setSearchQuery:k,refresh:b,createRun:l=>we(l,t),cancelRun:async l=>{try{j(null);const o=await Se(l,t);return h===l&&N(o.run),await b(),o}catch(o){const p=ce(o,"Failed to cancel run");throw j(p),p}},retryRun:async l=>{try{j(null);const o=await je(l,t);return h===l&&N(o.run),await b(),o}catch(o){const p=ce(o,"Failed to retry run");throw j(p),p}},exportRun:(l,o)=>_e(l,o,t),createTaskFromRun:(l,o,p,R,y,S)=>Re(l,{title:o,findingId:p,description:R,priority:y,attachExport:S},t),attachRunToTask:(l,o,p,R)=>ge(l,{taskId:o,findingId:p,attachExport:R},t),uiError:$,runActionState:De(A),statusCounts:F.reduce((l,o)=>(l[o.status]+=1,l),{queued:0,running:0,cancelling:0,retry_waiting:0,completed:0,failed:0,cancelled:0,timed_out:0,retry_exhausted:0})}}function qe({open:n,mode:t,run:i,finding:v,projectId:a,onClose:_,onConfirm:g}){const{t:s}=me("app");ke(n);const[F,P]=c.useState(!1),[h,E]=c.useState(""),[A,N]=c.useState(""),[q,I]=c.useState("normal"),[M,T]=c.useState(""),[G,O]=c.useState([]),[$,j]=c.useState(!1),[w,k]=c.useState(!1),x=c.useMemo(()=>{const d=(v.content??"").split(/(?<=[.!?])\s+/)[0]??"";return`${v.heading||s("research.defaultFindingHeading","Research finding")} — ${d}`.trim()},[v.content,v.heading,s]);return c.useEffect(()=>{n&&(P(!1),E(`Research: ${v.heading||i.title}`),N(x),I("normal"),T(""),t==="enrich"&&(j(!0),Ee(50,0,a).then(d=>O(d.filter(D=>D.column!=="archived"))).finally(()=>j(!1))))},[n,t,a,v.heading,x,i.title]),n?e.jsx("div",{className:"modal-overlay open",role:"presentation",onClick:_,children:e.jsxs("div",{className:"modal modal-lg research-task-action-modal",role:"dialog","aria-modal":"true",onClick:d=>d.stopPropagation(),children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h3",{children:t==="create"?s("research.createTaskTitle","Create task from finding"):s("research.enrichTaskTitle","Enrich existing task")}),e.jsx("button",{className:"modal-close",type:"button","aria-label":s("actions.close","Close"),onClick:_,children:"×"})]}),e.jsxs("div",{className:"research-task-action-modal__body",children:[e.jsxs("div",{className:"card research-task-action-modal__preview",children:[e.jsxs("p",{children:[e.jsxs("strong",{children:[s("research.runLabel","Run:")," "]})," ",i.id]}),e.jsxs("p",{children:[e.jsxs("strong",{children:[s("research.findingLabel","Finding:")," "]})," ",v.id,v.heading?` — ${v.heading}`:""]}),e.jsx("p",{children:x||s("research.noPreview","No preview available.")})]}),t==="create"?e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"research-task-action-modal__field",children:[s("research.titleLabel","Title"),e.jsx("input",{className:"input",value:h,onChange:d=>E(d.target.value)})]}),e.jsxs("label",{className:"research-task-action-modal__field",children:[s("research.descriptionLabel","Description"),e.jsx("textarea",{className:"input research-task-action-modal__textarea",value:A,onChange:d=>N(d.target.value)})]}),e.jsxs("label",{className:"research-task-action-modal__field",children:[s("research.priorityLabel","Priority"),e.jsxs("select",{className:"select",value:q,onChange:d=>I(d.target.value),children:[e.jsx("option",{value:"low",children:s("research.priorityLow","Low")}),e.jsx("option",{value:"normal",children:s("research.priorityNormal","Normal")}),e.jsx("option",{value:"high",children:s("research.priorityHigh","High")}),e.jsx("option",{value:"urgent",children:s("research.priorityUrgent","Urgent")})]})]})]}):e.jsxs("label",{className:"research-task-action-modal__field",children:[s("research.targetTaskLabel","Target task"),e.jsx("input",{className:"input",list:"research-task-action-task-list",value:M,placeholder:$?s("research.loadingTasks","Loading tasks…"):s("research.enterTaskId","Enter task ID"),onChange:d=>T(d.target.value)}),e.jsx("datalist",{id:"research-task-action-task-list",children:G.map(d=>e.jsx("option",{value:d.id,children:d.title},d.id))})]}),e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:F,onChange:d=>P(d.target.checked)}),e.jsx("span",{children:s("research.attachExport","Attach markdown export artifact")})]})]}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("button",{className:"btn",type:"button",onClick:_,children:s("actions.cancel","Cancel")}),e.jsx("button",{className:"btn btn-primary",type:"button",disabled:w||t==="enrich"&&!M,onClick:()=>{k(!0),g({taskId:t==="enrich"?M:void 0,title:t==="create"?h.trim():void 0,description:t==="create"?A.trim():void 0,priority:t==="create"?q:void 0,attachExport:F}).finally(()=>k(!1))},children:t==="create"?s("research.createTaskButton","Create Task"):s("research.enrichTaskButton","Enrich Task")})]})]})}):null}const Oe=["web-search","page-fetch","github","local-docs","llm-synthesis"],Ue={"web-search":"webSearch","page-fetch":"pageFetch",github:"github","local-docs":"localDocs","llm-synthesis":"llmSynthesis"};function Ge(n){return{"web-search":n("research.providerWebSearch","Web Search"),"page-fetch":n("research.providerPageFetch","Page Fetch"),github:n("research.providerGitHub","GitHub"),"local-docs":n("research.providerLocalDocs","Local Docs"),"llm-synthesis":n("research.providerLlmSynthesis","LLM Synthesis")}}let ie=!1;function Xe({projectId:n,addToast:t,onOpenSettings:i,readinessVersion:v=0}){const{t:a}=me("app"),_=Ge(a);c.useEffect(()=>(X({view:"ResearchView",trigger:ie?"route-active":"remount",projectId:n,replayAttempted:!1}),ie=!1,()=>{ie=!0,X({view:"ResearchView",trigger:"route-inactive",projectId:n,replayAttempted:!1})}),[n]);const{runs:g,selectedRun:s,selectedRunId:F,setSelectedRunId:P,availability:h,loading:E,error:A,searchQuery:N,setSearchQuery:q,createRun:I,cancelRun:M,retryRun:T,exportRun:G,createTaskFromRun:O,attachRunToTask:$,statusCounts:j,refresh:w,uiError:k,runActionState:x}=He({projectId:n}),[d,D]=c.useState(""),[b,H]=c.useState(()=>ne(void 0)),[B,l]=c.useState([]),[o,p]=c.useState(!1),[R,y]=c.useState([]),[S,U]=c.useState(null),[L,K]=c.useState(null),Y=h.supportedProviders??Oe,J=b.searchProvider,Z=r=>r==="web-search"?!0:b.enabledSources[Ue[r]];c.useEffect(()=>{const r=Y.filter(u=>Z(u));y(u=>{const f=u.filter(m=>r.includes(m));return f.length>0?f:r})},[b.enabledSources,Y]),c.useEffect(()=>{let r=!1;return Promise.all([Ce(n),Ae().catch(()=>({providers:[]}))]).then(([u,f])=>{r||(H(ne(u)),l(f.providers.filter(m=>m.type==="api_key").map(m=>({id:m.id,authenticated:m.authenticated}))))}).catch(()=>{r||H(ne(void 0))}),()=>{r=!0}},[n,v]);const be=c.useMemo(()=>s?s.status:a("research.noRunSelected","No run selected"),[s,a]),pe=c.useMemo(()=>s?s.status==="queued"||s.status==="retry_waiting"?"status-dot status-dot--pending":s.status==="running"?"status-dot status-dot--connecting":s.status==="completed"?"status-dot status-dot--online":s.status==="failed"||s.status==="cancelled"?"status-dot status-dot--error":"status-dot":"status-dot",[s]),ee=h.supportedExportFormats??["markdown","json","html"],se=c.useMemo(()=>new Map(B.map(r=>[r.id,r.authenticated])),[B]),re=c.useMemo(()=>{const r=new Set;return b.enabledSources.webSearch&&J&&r.add(J),b.enabledSources.llmSynthesis&&b.synthesisProvider&&r.add(b.synthesisProvider),[...r].filter(u=>se.has(u))},[b.enabledSources.llmSynthesis,b.enabledSources.webSearch,b.synthesisProvider,J,se]).find(r=>se.get(r)!==!0),V=c.useMemo(()=>h.available?b.enabled?re?{reason:a("research.missingApiKey","Missing API key for {{provider}}.",{provider:re}),details:a("research.addCredentialsHint","Add provider credentials in Authentication settings."),settingsSection:"authentication"}:null:{reason:a("research.disabled","Research is disabled for this project."),details:a("research.enableResearchHint","Enable project research settings to create runs."),settingsSection:"research-project"}:{reason:h.reason??a("research.unavailable","Research is unavailable for this project."),details:h.setupInstructions,settingsSection:"research-project"},[h.available,h.reason,h.setupInstructions,b.enabled,re,a]),W=async(r,u,f)=>{U(r);try{await u(),t?.(f,"success"),await w()}catch(m){t?.(m instanceof Error?m.message:a("research.actionFailed","Action failed"),"error")}finally{U(null)}},ae=async r=>{if(s){U(`export-${r}`);try{const u=await G(s.id,r),f=new Blob([u.content],{type:"text/plain;charset=utf-8"}),m=URL.createObjectURL(f),C=document.createElement("a");C.href=m,C.download=u.filename,document.body.appendChild(C),C.click(),C.remove(),URL.revokeObjectURL(m),t?.(a("research.exportedFile","Exported {{filename}}",{filename:u.filename}),"success")}catch(u){t?.(u instanceof Error?u.message:a("research.exportFailed","Export failed"),"error")}finally{U(null)}}},fe=async()=>{if(d.trim()){p(!0);try{const r=R.filter(f=>Z(f));if(r.length===0){p(!1),t?.(a("research.noSourcesAvailable","No enabled research sources are available for this project."),"error");return}const u=await I({query:d.trim(),providers:r});P(u.run.id),D(""),t?.(a("research.runCreated","Research run created"),"success"),await w()}catch(r){t?.(r instanceof Error?r.message:a("research.createRunFailed","Failed to create run"),"error")}finally{p(!1)}}};return e.jsxs("section",{className:"research-view","aria-label":a("research.viewLabel","Research view"),children:[e.jsxs("header",{className:"research-view__header",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"research-view__title",children:a("research.title","Research")}),e.jsx("p",{className:"research-view__subtitle",children:a("research.subtitle","Cited search and synthesis runs: gather sources, fetch content, and synthesize findings.")})]}),e.jsx("div",{className:"research-view__header-actions",children:e.jsx("button",{className:"btn",type:"button",onClick:()=>void w(),children:a("actions.refresh","Refresh")})})]}),V?e.jsxs("div",{className:"research-view__state research-view__state--error card","data-testid":"research-state-unavailable",children:[e.jsx("p",{children:V.reason}),V.details&&e.jsx("p",{children:V.details}),e.jsxs("p",{children:["Current defaults: provider ",b.searchProvider??"(not set)",", max sources ",b.limits.maxSourcesPerRun]}),e.jsxs("div",{className:"research-view__actions",children:[e.jsx("button",{className:"btn",type:"button",onClick:()=>void w(),children:a("actions.refresh","Refresh")}),e.jsx("button",{className:"btn btn-primary",type:"button",onClick:()=>i?.(V.settingsSection),children:a("actions.openSettings","Open Settings")})]})]}):e.jsx(e.Fragment,{children:e.jsxs("div",{className:"research-view__layout",children:[e.jsx("aside",{className:"research-view__sidebar card",children:e.jsxs("div",{className:"research-view__sidebar-content",children:[e.jsxs("div",{className:"research-view__form",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"research-query",children:a("research.queryLabel","Query")}),e.jsx("textarea",{id:"research-query",className:"input research-view__textarea",value:d,onChange:r=>D(r.target.value)})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("research.providersLabel","Providers")}),e.jsx("div",{className:"research-view__providers",children:Y.map(r=>{const u=Z(r),f=r==="web-search";return e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:f||R.includes(r),disabled:f||!u,onChange:()=>{f||!u||y(m=>m.includes(r)?m.filter(C=>C!==r):[...m,r])}}),e.jsxs("span",{children:[_[r]??r,f?e.jsx("span",{className:"research-view__provider-lock",children:a("research.alwaysOn","Always on")}):null]})]},r)})})]}),e.jsxs("button",{className:"btn btn-primary",type:"button",disabled:!d.trim()||o,onClick:()=>void fe(),children:[o?e.jsx(Te,{className:"animate-spin",size:14}):null,a("research.createRun","Create Run")]})]}),e.jsxs("div",{className:"research-view__history-header form-group",children:[e.jsx("label",{htmlFor:"research-run-search",children:a("actions.search","Search")}),e.jsxs("div",{className:"research-view__history-search-row",children:[e.jsx(Le,{size:14}),e.jsx("input",{id:"research-run-search",className:"input",placeholder:a("research.searchRunsPlaceholder","Search runs"),value:N,onChange:r=>q(r.target.value)})]})]}),e.jsx("div",{className:"research-view__history","data-testid":"research-state-running",children:g.map(r=>e.jsxs("button",{type:"button",className:`research-view__history-item card${F===r.id?" research-view__history-item--active":""}`,onClick:()=>P(r.id),children:[e.jsx("span",{className:"card-id",children:r.id}),e.jsx("span",{children:r.title})]},r.id))})]})}),e.jsxs("div",{className:"research-view__reader card",children:[E&&e.jsx("p",{"data-testid":"research-state-loading",children:a("research.loadingRuns","Loading research runs…")}),!E&&A&&e.jsx("p",{"data-testid":"research-state-error",children:A}),!E&&!A&&g.length===0&&e.jsx("p",{"data-testid":"research-state-empty",children:a("research.noRunsYet","No research runs yet")}),e.jsxs("div",{className:"research-view__reader-content",children:[s&&e.jsxs("div",{className:"research-view__run-detail",children:[e.jsxs("div",{className:"research-view__status-row",children:[e.jsx("span",{className:pe}),e.jsx("strong",{children:be})]}),e.jsx("h3",{className:"research-view__run-title",children:s.title}),e.jsx("p",{className:"research-view__run-query",children:s.query}),e.jsx("p",{className:"research-view__run-summary","data-testid":"research-state-results",children:s.results?.summary??a("research.noSummaryYet","No summary yet.")}),e.jsxs("div",{className:"research-view__actions",children:[e.jsx("button",{className:"btn",type:"button",title:x.cancelable?void 0:x.blockingReason,disabled:S==="cancel"||S==="retry"||!x.cancelable,onClick:()=>void W("cancel",()=>M(s.id),a("research.runCancelled","Run cancelled")),children:a("actions.cancel","Cancel")}),e.jsx("button",{className:"btn",type:"button",title:x.retryable?void 0:x.blockingReason,disabled:S==="cancel"||S==="retry"||!x.retryable,onClick:()=>void W("retry",()=>T(s.id),a("research.runRetried","Run retried")),children:a("actions.retry","Retry")}),ee.includes("markdown")&&e.jsx("button",{className:"btn",type:"button",disabled:S==="export-markdown",onClick:()=>void ae("markdown"),children:a("research.exportMd","Export MD")}),ee.includes("json")&&e.jsx("button",{className:"btn",type:"button",disabled:S==="export-json",onClick:()=>void ae("json"),children:a("research.exportJson","Export JSON")}),ee.includes("html")&&e.jsx("button",{className:"btn",type:"button",disabled:S==="export-html",onClick:()=>void ae("html"),children:a("research.exportHtml","Export HTML")})]}),s.error&&e.jsx("p",{className:"research-view__error",children:s.error}),k&&e.jsxs("div",{className:"form-error",role:"alert",children:[e.jsx("p",{children:k.message}),k.setupHint&&e.jsx("p",{children:k.setupHint}),k.code==="MISSING_CREDENTIALS"&&e.jsx("button",{className:"btn btn-sm",type:"button",onClick:()=>i?.("authentication"),children:a("research.openAuthSettings","Open Authentication Settings")}),k.code==="FEATURE_DISABLED"&&e.jsx("button",{className:"btn btn-sm",type:"button",onClick:()=>i?.("research-project"),children:a("research.openResearchSettings","Open Research Settings")})]}),x.blockingReason&&e.jsx("p",{className:"research-view__run-query",children:x.blockingReason}),Array.isArray(s.results?.findings)&&s.results.findings.length>0&&e.jsx("div",{className:"research-view__findings",children:s.results.findings.map((r,u)=>{const m=r.id?.trim()||`finding-${u+1}`;return e.jsxs("article",{className:"research-view__finding card",children:[e.jsx("h4",{children:r.heading}),e.jsx("p",{children:r.content}),e.jsxs("div",{className:"research-view__actions research-view__finding-actions",children:[e.jsx("button",{className:"btn btn-primary btn-sm",type:"button",onClick:()=>K({mode:"create",findingId:m}),children:a("research.createTask","Create Task")}),e.jsx("button",{className:"btn btn-sm",type:"button",onClick:()=>K({mode:"enrich",findingId:m}),children:a("research.enrichTask","Enrich Task")})]})]},m)})}),Array.isArray(s.results?.citations)&&s.results.citations.length>0&&e.jsx("ul",{className:"research-view__citations",children:s.results.citations.map(r=>e.jsx("li",{children:e.jsx("a",{href:r,target:"_blank",rel:"noreferrer",children:r})},r))}),s.events.length>0&&e.jsxs("details",{children:[e.jsx("summary",{children:a("research.runHistory","Run history")}),e.jsx("ul",{className:"research-view__events",children:s.events.map(r=>e.jsx("li",{children:r.message},r.id))})]})]}),!s&&g.length>0&&e.jsx("p",{children:a("research.selectRunToViewDetails","Select a run to view details.")}),e.jsxs("div",{className:"research-view__stats",children:[e.jsxs("div",{className:"research-view__stat-card",children:[e.jsx("div",{className:"research-view__stat-label",children:a("research.statRunning","Running")}),e.jsx("div",{className:"research-view__stat-value",children:j.running})]}),e.jsxs("div",{className:"research-view__stat-card",children:[e.jsx("div",{className:"research-view__stat-label",children:a("research.statCompleted","Completed")}),e.jsx("div",{className:"research-view__stat-value",children:j.completed})]}),e.jsxs("div",{className:"research-view__stat-card",children:[e.jsx("div",{className:"research-view__stat-label",children:a("research.statFailed","Failed")}),e.jsx("div",{className:"research-view__stat-value",children:j.failed})]})]})]})]})]})}),s&&L&&(()=>{const r=s.results?.findings?.findIndex((f,m)=>(f.id?.trim()||`finding-${m+1}`)===L.findingId)??-1,u=r>=0?s.results.findings[r]:null;return u?e.jsx(qe,{open:!0,mode:L.mode,run:s,finding:{id:L.findingId,heading:u.heading,content:u.content},projectId:n,onClose:()=>K(null),onConfirm:async({taskId:f,title:m,description:C,priority:le,attachExport:oe})=>{L.mode==="create"?await W("create-task",()=>O(s.id,m,L.findingId,C,le,oe),a("research.taskCreatedFromResearch","Task created from research")):f&&await W("attach-task",()=>$(s.id,f,L.findingId,oe),a("research.taskEnrichedFromResearch","Task enriched from research")),K(null)}}):null})()]})}export{Xe as ResearchView};
|
|
1
|
+
import{r as c,j as e}from"./vendor-react-D37HfzIf.js";import{a7 as z,a8 as de,a9 as ue,ak as he,aE as ve,ac as te,aF as xe,s as ye,aG as X,aH as ge,aI as Re,aJ as _e,aK as je,aL as Se,aM as we,ao as Ne,u as ke,aN as Ee,x as Ce,aO as Ae,L as Te,S as Le}from"./index-CpTBp1RG.js";import{u as me}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";const Pe="builtin",Q={pageFetch:!0,github:!1,localDocs:!0,llmSynthesis:!0};function ne(n){const t=n?.researchGlobalDefaults,i=n?.researchSettings;return{enabled:i?.enabled??n?.researchEnabled??n?.researchGlobalEnabled??!0,searchProvider:i?.searchProvider??t?.searchProvider??n?.researchGlobalWebSearchProvider??Pe,synthesisProvider:i?.synthesisProvider??t?.synthesisProvider,synthesisModelId:i?.synthesisModelId??t?.synthesisModelId,enabledSources:{webSearch:!0,pageFetch:i?.enabledSources?.pageFetch??t?.enabledSources?.pageFetch??Q.pageFetch,github:i?.enabledSources?.github??t?.enabledSources?.github??Q.github,localDocs:i?.enabledSources?.localDocs??t?.enabledSources?.localDocs??Q.localDocs,llmSynthesis:i?.enabledSources?.llmSynthesis??t?.enabledSources?.llmSynthesis??Q.llmSynthesis},limits:{maxConcurrentRuns:i?.limits?.maxConcurrentRuns??n?.researchMaxConcurrentRuns??n?.researchGlobalMaxConcurrentRuns??3,maxSourcesPerRun:i?.limits?.maxSourcesPerRun??t?.maxSourcesPerRun??n?.researchMaxSourcesPerRun??n?.researchGlobalMaxSourcesPerRun??20,maxDurationMs:i?.limits?.maxDurationMs??n?.researchDefaultTimeout??n?.researchGlobalDefaultTimeout??3e5,requestTimeoutMs:i?.limits?.requestTimeoutMs??n?.researchGlobalFetchTimeoutMs??3e4},defaultExportFormat:t?.defaultExportFormat??"markdown"}}const Fe=300,Ie=4e3,Me=["queued","running","cancelling","retry_waiting"];function ce(n,t){if(n instanceof Ne){const i=n;return{message:n.message,status:n.status,code:i.researchCode??"INTERNAL_ERROR",setupHint:i.setupHint,retryable:i.retryable}}return n instanceof Error?{message:n.message,code:"INTERNAL_ERROR"}:{message:t,code:"INTERNAL_ERROR"}}function De(n){if(!n)return{cancelable:!1,retryable:!1,isTransitioning:!1,blockingReason:"No run selected"};const t=Me.includes(n.status),i=n.status==="queued"||n.status==="running",v=n.lifecycle?.retryable,a=n.status==="failed"||n.status==="timed_out",_=!!(a&&v);let g;return!i&&t?g="Run is already transitioning":!i&&n.status==="completed"?g="Completed runs cannot be cancelled":!i&&n.status==="cancelled"?g="Run is already cancelled":!i&&n.status==="retry_exhausted"?g="Retry attempts exhausted":!i&&n.status==="failed"?g="Failed runs cannot be cancelled":!i&&n.status==="timed_out"&&(g="Timed out runs cannot be cancelled"),!_&&a&&v===!1&&(g=n.lifecycle?.errorCode==="RETRY_EXHAUSTED"?"Retry attempts exhausted":"Run is not retryable"),{cancelable:i,retryable:_,isTransitioning:t,blockingReason:g}}function He(n){const t=n?.projectId,i=t??"",v=`${ue.RESEARCH_RUNS_PREFIX}${i}`,a=`${ue.RESEARCH_SELECTED_ID_PREFIX}${i}`,_=z(v,{maxAgeMs:de}),g=z(a,{maxAgeMs:he}),s=c.useRef(Array.isArray(_)&&_.length>0),[F,P]=c.useState(()=>Array.isArray(_)?_:[]),[h,E]=c.useState(g??null),[A,N]=c.useState(null),[q,I]=c.useState({available:!0}),[M,T]=c.useState(!(Array.isArray(_)&&_.length>0)),[G,O]=c.useState(null),[$,j]=c.useState(null),[w,k]=c.useState(""),x=c.useRef(0),d=c.useRef(0),D=c.useRef(t);c.useEffect(()=>{D.current!==t&&(D.current=t,d.current++);const l=z(v,{maxAgeMs:de}),o=z(a,{maxAgeMs:he}),p=Array.isArray(l)&&l.length>0;P(Array.isArray(l)?l:[]),E(o??null),N(null),T(!p),s.current=p},[t,v,a]);const b=c.useCallback(async(l=w)=>{const o=++x.current,p=t;s.current||T(!0),O(null),j(null);try{const R=await ve({q:l||void 0,limit:100},p);if(o!==x.current||p!==t)return;P(R.runs),te(v,R.runs,{maxBytes:5e5}),s.current=!0,I(R.availability),h&&!R.runs.some(y=>y.id===h)&&(E(null),te(a,null,{maxBytes:5e5}),N(null))}catch(R){if(o!==x.current||p!==t)return;const y=ce(R,"Failed to load research runs");O(y.message),j(y)}finally{o===x.current&&T(!1)}},[t,v,w,a,h]),H=c.useCallback(async l=>{const o=await xe(l,t);return N(o.run),I(o.availability),o.run},[t]);c.useEffect(()=>{s.current||T(!0);const l=window.setTimeout(()=>{b(w)},Fe);return()=>window.clearTimeout(l)},[b,w]),c.useEffect(()=>{if(!h){N(null);return}H(h)},[H,h]),c.useEffect(()=>{const l=d.current,o=()=>d.current!==l,p=t?`?projectId=${encodeURIComponent(t)}`:"";let R=!0;const y=()=>{!R||o()||(b(),h&&H(h))},S=`/api/events${p}`,U=ye(S,{events:{"research:run:created":y,"research:run:updated":y,"research:run:completed":y,"research:run:failed":y,"research:run:cancelled":y},onReconnect:()=>{X({view:"useResearch",trigger:"sse-reconnect",projectId:t,replayAttempted:!1,sseChannel:S}),y()}});X({view:"useResearch",trigger:"sse-open",projectId:t,replayAttempted:!1,sseChannel:S});const L=window.setInterval(y,Ie);return()=>{R=!1,U(),window.clearInterval(L)}},[t,b,h,H]);const B=c.useCallback(l=>{E(l),te(a,l,{maxBytes:5e5})},[a]);return{runs:F,selectedRun:A,selectedRunId:h,setSelectedRunId:B,availability:q,loading:M,error:G,searchQuery:w,setSearchQuery:k,refresh:b,createRun:l=>we(l,t),cancelRun:async l=>{try{j(null);const o=await Se(l,t);return h===l&&N(o.run),await b(),o}catch(o){const p=ce(o,"Failed to cancel run");throw j(p),p}},retryRun:async l=>{try{j(null);const o=await je(l,t);return h===l&&N(o.run),await b(),o}catch(o){const p=ce(o,"Failed to retry run");throw j(p),p}},exportRun:(l,o)=>_e(l,o,t),createTaskFromRun:(l,o,p,R,y,S)=>Re(l,{title:o,findingId:p,description:R,priority:y,attachExport:S},t),attachRunToTask:(l,o,p,R)=>ge(l,{taskId:o,findingId:p,attachExport:R},t),uiError:$,runActionState:De(A),statusCounts:F.reduce((l,o)=>(l[o.status]+=1,l),{queued:0,running:0,cancelling:0,retry_waiting:0,completed:0,failed:0,cancelled:0,timed_out:0,retry_exhausted:0})}}function qe({open:n,mode:t,run:i,finding:v,projectId:a,onClose:_,onConfirm:g}){const{t:s}=me("app");ke(n);const[F,P]=c.useState(!1),[h,E]=c.useState(""),[A,N]=c.useState(""),[q,I]=c.useState("normal"),[M,T]=c.useState(""),[G,O]=c.useState([]),[$,j]=c.useState(!1),[w,k]=c.useState(!1),x=c.useMemo(()=>{const d=(v.content??"").split(/(?<=[.!?])\s+/)[0]??"";return`${v.heading||s("research.defaultFindingHeading","Research finding")} — ${d}`.trim()},[v.content,v.heading,s]);return c.useEffect(()=>{n&&(P(!1),E(`Research: ${v.heading||i.title}`),N(x),I("normal"),T(""),t==="enrich"&&(j(!0),Ee(50,0,a).then(d=>O(d.filter(D=>D.column!=="archived"))).finally(()=>j(!1))))},[n,t,a,v.heading,x,i.title]),n?e.jsx("div",{className:"modal-overlay open",role:"presentation",onClick:_,children:e.jsxs("div",{className:"modal modal-lg research-task-action-modal",role:"dialog","aria-modal":"true",onClick:d=>d.stopPropagation(),children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h3",{children:t==="create"?s("research.createTaskTitle","Create task from finding"):s("research.enrichTaskTitle","Enrich existing task")}),e.jsx("button",{className:"modal-close",type:"button","aria-label":s("actions.close","Close"),onClick:_,children:"×"})]}),e.jsxs("div",{className:"research-task-action-modal__body",children:[e.jsxs("div",{className:"card research-task-action-modal__preview",children:[e.jsxs("p",{children:[e.jsxs("strong",{children:[s("research.runLabel","Run:")," "]})," ",i.id]}),e.jsxs("p",{children:[e.jsxs("strong",{children:[s("research.findingLabel","Finding:")," "]})," ",v.id,v.heading?` — ${v.heading}`:""]}),e.jsx("p",{children:x||s("research.noPreview","No preview available.")})]}),t==="create"?e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"research-task-action-modal__field",children:[s("research.titleLabel","Title"),e.jsx("input",{className:"input",value:h,onChange:d=>E(d.target.value)})]}),e.jsxs("label",{className:"research-task-action-modal__field",children:[s("research.descriptionLabel","Description"),e.jsx("textarea",{className:"input research-task-action-modal__textarea",value:A,onChange:d=>N(d.target.value)})]}),e.jsxs("label",{className:"research-task-action-modal__field",children:[s("research.priorityLabel","Priority"),e.jsxs("select",{className:"select",value:q,onChange:d=>I(d.target.value),children:[e.jsx("option",{value:"low",children:s("research.priorityLow","Low")}),e.jsx("option",{value:"normal",children:s("research.priorityNormal","Normal")}),e.jsx("option",{value:"high",children:s("research.priorityHigh","High")}),e.jsx("option",{value:"urgent",children:s("research.priorityUrgent","Urgent")})]})]})]}):e.jsxs("label",{className:"research-task-action-modal__field",children:[s("research.targetTaskLabel","Target task"),e.jsx("input",{className:"input",list:"research-task-action-task-list",value:M,placeholder:$?s("research.loadingTasks","Loading tasks…"):s("research.enterTaskId","Enter task ID"),onChange:d=>T(d.target.value)}),e.jsx("datalist",{id:"research-task-action-task-list",children:G.map(d=>e.jsx("option",{value:d.id,children:d.title},d.id))})]}),e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:F,onChange:d=>P(d.target.checked)}),e.jsx("span",{children:s("research.attachExport","Attach markdown export artifact")})]})]}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("button",{className:"btn",type:"button",onClick:_,children:s("actions.cancel","Cancel")}),e.jsx("button",{className:"btn btn-primary",type:"button",disabled:w||t==="enrich"&&!M,onClick:()=>{k(!0),g({taskId:t==="enrich"?M:void 0,title:t==="create"?h.trim():void 0,description:t==="create"?A.trim():void 0,priority:t==="create"?q:void 0,attachExport:F}).finally(()=>k(!1))},children:t==="create"?s("research.createTaskButton","Create Task"):s("research.enrichTaskButton","Enrich Task")})]})]})}):null}const Oe=["web-search","page-fetch","github","local-docs","llm-synthesis"],Ue={"web-search":"webSearch","page-fetch":"pageFetch",github:"github","local-docs":"localDocs","llm-synthesis":"llmSynthesis"};function Ge(n){return{"web-search":n("research.providerWebSearch","Web Search"),"page-fetch":n("research.providerPageFetch","Page Fetch"),github:n("research.providerGitHub","GitHub"),"local-docs":n("research.providerLocalDocs","Local Docs"),"llm-synthesis":n("research.providerLlmSynthesis","LLM Synthesis")}}let ie=!1;function Xe({projectId:n,addToast:t,onOpenSettings:i,readinessVersion:v=0}){const{t:a}=me("app"),_=Ge(a);c.useEffect(()=>(X({view:"ResearchView",trigger:ie?"route-active":"remount",projectId:n,replayAttempted:!1}),ie=!1,()=>{ie=!0,X({view:"ResearchView",trigger:"route-inactive",projectId:n,replayAttempted:!1})}),[n]);const{runs:g,selectedRun:s,selectedRunId:F,setSelectedRunId:P,availability:h,loading:E,error:A,searchQuery:N,setSearchQuery:q,createRun:I,cancelRun:M,retryRun:T,exportRun:G,createTaskFromRun:O,attachRunToTask:$,statusCounts:j,refresh:w,uiError:k,runActionState:x}=He({projectId:n}),[d,D]=c.useState(""),[b,H]=c.useState(()=>ne(void 0)),[B,l]=c.useState([]),[o,p]=c.useState(!1),[R,y]=c.useState([]),[S,U]=c.useState(null),[L,K]=c.useState(null),Y=h.supportedProviders??Oe,J=b.searchProvider,Z=r=>r==="web-search"?!0:b.enabledSources[Ue[r]];c.useEffect(()=>{const r=Y.filter(u=>Z(u));y(u=>{const f=u.filter(m=>r.includes(m));return f.length>0?f:r})},[b.enabledSources,Y]),c.useEffect(()=>{let r=!1;return Promise.all([Ce(n),Ae().catch(()=>({providers:[]}))]).then(([u,f])=>{r||(H(ne(u)),l(f.providers.filter(m=>m.type==="api_key").map(m=>({id:m.id,authenticated:m.authenticated}))))}).catch(()=>{r||H(ne(void 0))}),()=>{r=!0}},[n,v]);const be=c.useMemo(()=>s?s.status:a("research.noRunSelected","No run selected"),[s,a]),pe=c.useMemo(()=>s?s.status==="queued"||s.status==="retry_waiting"?"status-dot status-dot--pending":s.status==="running"?"status-dot status-dot--connecting":s.status==="completed"?"status-dot status-dot--online":s.status==="failed"||s.status==="cancelled"?"status-dot status-dot--error":"status-dot":"status-dot",[s]),ee=h.supportedExportFormats??["markdown","json","html"],se=c.useMemo(()=>new Map(B.map(r=>[r.id,r.authenticated])),[B]),re=c.useMemo(()=>{const r=new Set;return b.enabledSources.webSearch&&J&&r.add(J),b.enabledSources.llmSynthesis&&b.synthesisProvider&&r.add(b.synthesisProvider),[...r].filter(u=>se.has(u))},[b.enabledSources.llmSynthesis,b.enabledSources.webSearch,b.synthesisProvider,J,se]).find(r=>se.get(r)!==!0),V=c.useMemo(()=>h.available?b.enabled?re?{reason:a("research.missingApiKey","Missing API key for {{provider}}.",{provider:re}),details:a("research.addCredentialsHint","Add provider credentials in Authentication settings."),settingsSection:"authentication"}:null:{reason:a("research.disabled","Research is disabled for this project."),details:a("research.enableResearchHint","Enable project research settings to create runs."),settingsSection:"research-project"}:{reason:h.reason??a("research.unavailable","Research is unavailable for this project."),details:h.setupInstructions,settingsSection:"research-project"},[h.available,h.reason,h.setupInstructions,b.enabled,re,a]),W=async(r,u,f)=>{U(r);try{await u(),t?.(f,"success"),await w()}catch(m){t?.(m instanceof Error?m.message:a("research.actionFailed","Action failed"),"error")}finally{U(null)}},ae=async r=>{if(s){U(`export-${r}`);try{const u=await G(s.id,r),f=new Blob([u.content],{type:"text/plain;charset=utf-8"}),m=URL.createObjectURL(f),C=document.createElement("a");C.href=m,C.download=u.filename,document.body.appendChild(C),C.click(),C.remove(),URL.revokeObjectURL(m),t?.(a("research.exportedFile","Exported {{filename}}",{filename:u.filename}),"success")}catch(u){t?.(u instanceof Error?u.message:a("research.exportFailed","Export failed"),"error")}finally{U(null)}}},fe=async()=>{if(d.trim()){p(!0);try{const r=R.filter(f=>Z(f));if(r.length===0){p(!1),t?.(a("research.noSourcesAvailable","No enabled research sources are available for this project."),"error");return}const u=await I({query:d.trim(),providers:r});P(u.run.id),D(""),t?.(a("research.runCreated","Research run created"),"success"),await w()}catch(r){t?.(r instanceof Error?r.message:a("research.createRunFailed","Failed to create run"),"error")}finally{p(!1)}}};return e.jsxs("section",{className:"research-view","aria-label":a("research.viewLabel","Research view"),children:[e.jsxs("header",{className:"research-view__header",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"research-view__title",children:a("research.title","Research")}),e.jsx("p",{className:"research-view__subtitle",children:a("research.subtitle","Cited search and synthesis runs: gather sources, fetch content, and synthesize findings.")})]}),e.jsx("div",{className:"research-view__header-actions",children:e.jsx("button",{className:"btn",type:"button",onClick:()=>void w(),children:a("actions.refresh","Refresh")})})]}),V?e.jsxs("div",{className:"research-view__state research-view__state--error card","data-testid":"research-state-unavailable",children:[e.jsx("p",{children:V.reason}),V.details&&e.jsx("p",{children:V.details}),e.jsxs("p",{children:["Current defaults: provider ",b.searchProvider??"(not set)",", max sources ",b.limits.maxSourcesPerRun]}),e.jsxs("div",{className:"research-view__actions",children:[e.jsx("button",{className:"btn",type:"button",onClick:()=>void w(),children:a("actions.refresh","Refresh")}),e.jsx("button",{className:"btn btn-primary",type:"button",onClick:()=>i?.(V.settingsSection),children:a("actions.openSettings","Open Settings")})]})]}):e.jsx(e.Fragment,{children:e.jsxs("div",{className:"research-view__layout",children:[e.jsx("aside",{className:"research-view__sidebar card",children:e.jsxs("div",{className:"research-view__sidebar-content",children:[e.jsxs("div",{className:"research-view__form",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"research-query",children:a("research.queryLabel","Query")}),e.jsx("textarea",{id:"research-query",className:"input research-view__textarea",value:d,onChange:r=>D(r.target.value)})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("research.providersLabel","Providers")}),e.jsx("div",{className:"research-view__providers",children:Y.map(r=>{const u=Z(r),f=r==="web-search";return e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:f||R.includes(r),disabled:f||!u,onChange:()=>{f||!u||y(m=>m.includes(r)?m.filter(C=>C!==r):[...m,r])}}),e.jsxs("span",{children:[_[r]??r,f?e.jsx("span",{className:"research-view__provider-lock",children:a("research.alwaysOn","Always on")}):null]})]},r)})})]}),e.jsxs("button",{className:"btn btn-primary",type:"button",disabled:!d.trim()||o,onClick:()=>void fe(),children:[o?e.jsx(Te,{className:"animate-spin",size:14}):null,a("research.createRun","Create Run")]})]}),e.jsxs("div",{className:"research-view__history-header form-group",children:[e.jsx("label",{htmlFor:"research-run-search",children:a("actions.search","Search")}),e.jsxs("div",{className:"research-view__history-search-row",children:[e.jsx(Le,{size:14}),e.jsx("input",{id:"research-run-search",className:"input",placeholder:a("research.searchRunsPlaceholder","Search runs"),value:N,onChange:r=>q(r.target.value)})]})]}),e.jsx("div",{className:"research-view__history","data-testid":"research-state-running",children:g.map(r=>e.jsxs("button",{type:"button",className:`research-view__history-item card${F===r.id?" research-view__history-item--active":""}`,onClick:()=>P(r.id),children:[e.jsx("span",{className:"card-id",children:r.id}),e.jsx("span",{children:r.title})]},r.id))})]})}),e.jsxs("div",{className:"research-view__reader card",children:[E&&e.jsx("p",{"data-testid":"research-state-loading",children:a("research.loadingRuns","Loading research runs…")}),!E&&A&&e.jsx("p",{"data-testid":"research-state-error",children:A}),!E&&!A&&g.length===0&&e.jsx("p",{"data-testid":"research-state-empty",children:a("research.noRunsYet","No research runs yet")}),e.jsxs("div",{className:"research-view__reader-content",children:[s&&e.jsxs("div",{className:"research-view__run-detail",children:[e.jsxs("div",{className:"research-view__status-row",children:[e.jsx("span",{className:pe}),e.jsx("strong",{children:be})]}),e.jsx("h3",{className:"research-view__run-title",children:s.title}),e.jsx("p",{className:"research-view__run-query",children:s.query}),e.jsx("p",{className:"research-view__run-summary","data-testid":"research-state-results",children:s.results?.summary??a("research.noSummaryYet","No summary yet.")}),e.jsxs("div",{className:"research-view__actions",children:[e.jsx("button",{className:"btn",type:"button",title:x.cancelable?void 0:x.blockingReason,disabled:S==="cancel"||S==="retry"||!x.cancelable,onClick:()=>void W("cancel",()=>M(s.id),a("research.runCancelled","Run cancelled")),children:a("actions.cancel","Cancel")}),e.jsx("button",{className:"btn",type:"button",title:x.retryable?void 0:x.blockingReason,disabled:S==="cancel"||S==="retry"||!x.retryable,onClick:()=>void W("retry",()=>T(s.id),a("research.runRetried","Run retried")),children:a("actions.retry","Retry")}),ee.includes("markdown")&&e.jsx("button",{className:"btn",type:"button",disabled:S==="export-markdown",onClick:()=>void ae("markdown"),children:a("research.exportMd","Export MD")}),ee.includes("json")&&e.jsx("button",{className:"btn",type:"button",disabled:S==="export-json",onClick:()=>void ae("json"),children:a("research.exportJson","Export JSON")}),ee.includes("html")&&e.jsx("button",{className:"btn",type:"button",disabled:S==="export-html",onClick:()=>void ae("html"),children:a("research.exportHtml","Export HTML")})]}),s.error&&e.jsx("p",{className:"research-view__error",children:s.error}),k&&e.jsxs("div",{className:"form-error",role:"alert",children:[e.jsx("p",{children:k.message}),k.setupHint&&e.jsx("p",{children:k.setupHint}),k.code==="MISSING_CREDENTIALS"&&e.jsx("button",{className:"btn btn-sm",type:"button",onClick:()=>i?.("authentication"),children:a("research.openAuthSettings","Open Authentication Settings")}),k.code==="FEATURE_DISABLED"&&e.jsx("button",{className:"btn btn-sm",type:"button",onClick:()=>i?.("research-project"),children:a("research.openResearchSettings","Open Research Settings")})]}),x.blockingReason&&e.jsx("p",{className:"research-view__run-query",children:x.blockingReason}),Array.isArray(s.results?.findings)&&s.results.findings.length>0&&e.jsx("div",{className:"research-view__findings",children:s.results.findings.map((r,u)=>{const m=r.id?.trim()||`finding-${u+1}`;return e.jsxs("article",{className:"research-view__finding card",children:[e.jsx("h4",{children:r.heading}),e.jsx("p",{children:r.content}),e.jsxs("div",{className:"research-view__actions research-view__finding-actions",children:[e.jsx("button",{className:"btn btn-primary btn-sm",type:"button",onClick:()=>K({mode:"create",findingId:m}),children:a("research.createTask","Create Task")}),e.jsx("button",{className:"btn btn-sm",type:"button",onClick:()=>K({mode:"enrich",findingId:m}),children:a("research.enrichTask","Enrich Task")})]})]},m)})}),Array.isArray(s.results?.citations)&&s.results.citations.length>0&&e.jsx("ul",{className:"research-view__citations",children:s.results.citations.map(r=>e.jsx("li",{children:e.jsx("a",{href:r,target:"_blank",rel:"noreferrer",children:r})},r))}),s.events.length>0&&e.jsxs("details",{children:[e.jsx("summary",{children:a("research.runHistory","Run history")}),e.jsx("ul",{className:"research-view__events",children:s.events.map(r=>e.jsx("li",{children:r.message},r.id))})]})]}),!s&&g.length>0&&e.jsx("p",{children:a("research.selectRunToViewDetails","Select a run to view details.")}),e.jsxs("div",{className:"research-view__stats",children:[e.jsxs("div",{className:"research-view__stat-card",children:[e.jsx("div",{className:"research-view__stat-label",children:a("research.statRunning","Running")}),e.jsx("div",{className:"research-view__stat-value",children:j.running})]}),e.jsxs("div",{className:"research-view__stat-card",children:[e.jsx("div",{className:"research-view__stat-label",children:a("research.statCompleted","Completed")}),e.jsx("div",{className:"research-view__stat-value",children:j.completed})]}),e.jsxs("div",{className:"research-view__stat-card",children:[e.jsx("div",{className:"research-view__stat-label",children:a("research.statFailed","Failed")}),e.jsx("div",{className:"research-view__stat-value",children:j.failed})]})]})]})]})]})}),s&&L&&(()=>{const r=s.results?.findings?.findIndex((f,m)=>(f.id?.trim()||`finding-${m+1}`)===L.findingId)??-1,u=r>=0?s.results.findings[r]:null;return u?e.jsx(qe,{open:!0,mode:L.mode,run:s,finding:{id:L.findingId,heading:u.heading,content:u.content},projectId:n,onClose:()=>K(null),onConfirm:async({taskId:f,title:m,description:C,priority:le,attachExport:oe})=>{L.mode==="create"?await W("create-task",()=>O(s.id,m,L.findingId,C,le,oe),a("research.taskCreatedFromResearch","Task created from research")):f&&await W("attach-task",()=>$(s.id,f,L.findingId,oe),a("research.taskEnrichedFromResearch","Task enriched from research")),K(null)}}):null})()]})}export{Xe as ResearchView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as c,j as e}from"./vendor-react-D37HfzIf.js";import{u as de}from"./vendor-i18n-CV0mwX_-.js";import{R as J,J as pe,ae as q,af as Y,bJ as he,bK as ue,b6 as me,U as ye}from"./index-2kYpdJrx.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";const xe="__sync_passphrase__",k={key:"",value:"",description:"",scope:"project",accessPolicy:"prompt",envExportable:!1,envExportKey:""},n={className:"secrets-action-icon","aria-hidden":!0,style:{width:"1em",height:"1em"}},ve={...n,className:"secrets-action-icon spin"},Ce=({addToast:d})=>{const{t:a}=de("app"),[L,G]=c.useState([]),[R,T]=c.useState(!0),[M,A]=c.useState(null),[K,b]=c.useState(null),[p,D]=c.useState(null),[U,y]=c.useState(!1),[z,g]=c.useState(null),[t,l]=c.useState(k),[N,C]=c.useState(!1),[O,j]=c.useState({}),[Q,V]=c.useState(null),[h,W]=c.useState(!1),[X,_]=c.useState(!1),[f,B]=c.useState(""),[P,$]=c.useState(""),[Z,F]=c.useState(!1),m=c.useRef(new Map),E=c.useRef(new Map),o=c.useCallback(async(s,r)=>{const i=await fetch(s,{...r,headers:{"Content-Type":"application/json",...r?.headers??{}}});if(!i.ok){const u=await i.json().catch(()=>({error:"Request failed"}));throw new Error(String(u?.error??"Request failed"))}if(i.status!==204)return i.json()},[]),x=c.useCallback(async()=>{T(!0),A(null);try{const s=await o("/api/secrets");G(s.secrets)}catch(s){A(s instanceof Error?s.message:String(s))}finally{T(!1)}},[o]),S=c.useCallback(async()=>{try{const s=await o("/api/secrets/sync-passphrase");W(!!s.configured)}catch(s){d?.(a("secrets.errorLoadSyncStatus","Failed to load sync passphrase status: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}},[d,o]);c.useEffect(()=>(x(),S(),()=>{m.current.forEach(s=>clearTimeout(s)),E.current.forEach(s=>clearTimeout(s))}),[x,S]);const w=()=>{_(!1),B(""),$("")},ee=async s=>{await o("/api/secrets/sync-passphrase",{method:"PUT",body:JSON.stringify({passphrase:s})})},se=async()=>{F(!0);try{await ee(f),d?.(h?a("secrets.syncPassphraseRotated","Sync passphrase rotated"):a("secrets.syncPassphraseSet","Sync passphrase set"),"success"),w(),await S()}catch(s){d?.(a("secrets.errorSaveSyncPassphrase","Failed to save sync passphrase: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}finally{F(!1)}},ae=async()=>{if(window.confirm(a("secrets.confirmClearSyncPassphrase","Clear the cross-node sync passphrase? Existing sync pairs will stop working until you set a new passphrase.")))try{await o("/api/secrets/sync-passphrase",{method:"DELETE"}),d?.(a("secrets.syncPassphraseCleared","Sync passphrase cleared"),"success"),await S()}catch(r){d?.(a("secrets.errorClearSyncPassphrase","Failed to clear sync passphrase: {{error}}",{error:r instanceof Error?r.message:String(r)}),"error")}},re=()=>{D(null),l(k),y(!0),C(!1),b(null)},te=s=>{D(s),l({key:s.key,value:"",description:s.description??"",scope:s.scope,accessPolicy:s.accessPolicy,envExportable:s.envExportable,envExportKey:s.envExportKey??""}),y(!0),C(!1),b(null)},ce=async()=>{b(null);try{if(p){const s={key:t.key,description:t.description||null,accessPolicy:t.accessPolicy,envExportable:t.envExportable,envExportKey:t.envExportable&&t.envExportKey||null};t.value&&(s.value=t.value),await o(`/api/secrets/${p.scope}/${p.id}`,{method:"PATCH",body:JSON.stringify(s)})}else await o("/api/secrets",{method:"POST",body:JSON.stringify({scope:t.scope,key:t.key,value:t.value,description:t.description||null,accessPolicy:t.accessPolicy,envExportable:t.envExportable,envExportKey:t.envExportable&&t.envExportKey||null})});y(!1),l(k),await x()}catch(s){b(s instanceof Error?s.message:String(s))}},le=s=>{const r=m.current.get(s.id);r&&(clearTimeout(r),m.current.delete(s.id)),j(i=>({...i,[s.id]:null}))},ne=async s=>{const r=await o(`/api/secrets/${s.scope}/${s.id}/reveal`,{method:"POST"});j(v=>({...v,[s.id]:r.value})),d?.(a("secrets.revealed","Revealed"),"success");const i=setTimeout(()=>{j(v=>({...v,[s.id]:null})),m.current.delete(s.id)},3e4),u=m.current.get(s.id);u&&clearTimeout(u),m.current.set(s.id,i)},oe=async s=>{const r=O[s.id];if(!r)return;await navigator.clipboard.writeText(r),V(s.id),d?.(a("secrets.copied","Copied"),"success");const i=setTimeout(()=>{V(null),j(v=>({...v,[s.id]:null}))},1500),u=E.current.get(s.id);u&&clearTimeout(u),E.current.set(s.id,i)},ie=async s=>{await o(`/api/secrets/${s.scope}/${s.id}`,{method:"DELETE"}),g(null),await x()},I=c.useMemo(()=>[...L].filter(s=>!(s.scope==="global"&&s.key===xe)).sort((s,r)=>s.key.localeCompare(r.key)),[L]),H=f.length>0&&f===P;return e.jsxs("section",{className:"secrets-view",children:[e.jsxs("div",{className:"secrets-header",children:[e.jsx("h2",{children:a("secrets.title","Secrets")}),e.jsxs("div",{className:"secrets-header-actions",children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>void x(),children:[e.jsx(J,{...n})," ",a("secrets.refresh","Refresh")]}),e.jsxs("button",{className:"btn btn-primary btn-sm",onClick:re,children:[e.jsx(pe,{...n})," ",a("secrets.addSecret","Add Secret")]})]})]}),e.jsxs("article",{className:"card secrets-sync-card",children:[e.jsxs("div",{className:"secrets-sync-header",children:[e.jsxs("div",{children:[e.jsx("h3",{children:a("secrets.syncPassphraseTitle","Cross-Node Sync Passphrase")}),e.jsxs("p",{className:"secrets-sync-status",children:[e.jsx("span",{className:`status-dot ${h?"status-dot--online":"status-dot--pending"}`,"aria-hidden":"true"})," ",h?a("secrets.syncConfigured","Configured"):a("secrets.syncNotConfigured","Not configured")]})]}),e.jsxs("div",{className:"secrets-sync-actions",children:[e.jsx("button",{className:"btn",onClick:()=>_(!0),children:h?a("secrets.rotateSyncPassphrase","Rotate"):a("secrets.setPassphrase","Set passphrase")}),h?e.jsx("button",{className:"btn btn-danger",onClick:()=>void ae(),children:a("secrets.clearSyncPassphrase","Clear")}):null]})]}),e.jsx("p",{className:"secrets-sync-copy",children:a("secrets.syncPassphraseDescription","Shared passphrase used to wrap cross-node secret bundles. Both nodes in a sync pair must share the same value. Stored locally only; never transmitted.")})]}),M?e.jsx("div",{className:"form-error",children:M}):null,R?e.jsxs("div",{className:"secrets-loading",children:[e.jsx(J,{...ve})," ",a("secrets.loading","Loading…")]}):null,!R&&I.length===0?e.jsx("div",{className:"secrets-empty",children:a("secrets.empty","No secrets found.")}):null,e.jsx("div",{className:"secrets-list",children:I.map(s=>{const r=O[s.id];return e.jsxs("article",{className:"card secrets-row",children:[e.jsxs("div",{className:"secrets-row-main",children:[e.jsx("div",{className:"secrets-row-key",children:s.key}),e.jsxs("div",{className:"secrets-row-meta",children:[e.jsx("span",{className:"secrets-chip",children:s.scope}),e.jsx("span",{className:"secrets-chip",children:s.accessPolicy}),s.envExportable?e.jsx("span",{className:"secrets-chip",children:a("secrets.envExportableChip","env exportable")}):null]}),r?e.jsx("pre",{className:"secrets-revealed",children:r}):null]}),e.jsxs("div",{className:"secrets-row-side",children:[e.jsx("span",{className:"secrets-row-read",children:s.lastReadAt?new Date(s.lastReadAt).toLocaleString():a("secrets.neverRead","Never read")}),e.jsxs("div",{className:"secrets-row-actions",children:[e.jsx("button",{type:"button",className:"btn btn-icon secrets-visibility-toggle",onClick:()=>{if(r){le(s);return}ne(s)},"aria-label":r?a("secrets.hideAriaLabel","Hide"):a("secrets.revealAriaLabel","Reveal"),children:r?e.jsx(q,{...n}):e.jsx(Y,{...n})}),e.jsx("button",{className:"btn btn-icon",onClick:()=>void oe(s),"aria-label":a("secrets.copyAriaLabel","Copy"),disabled:!r,children:Q===s.id?e.jsx(he,{...n}):e.jsx(ue,{...n})}),e.jsx("button",{className:"btn btn-icon",onClick:()=>te(s),"aria-label":a("secrets.editAriaLabel","Edit"),children:e.jsx(me,{...n})}),e.jsx("button",{className:"btn btn-icon btn-danger",onClick:()=>g(s.id),"aria-label":a("secrets.deleteAriaLabel","Delete"),children:e.jsx(ye,{...n})})]}),z===s.id?e.jsxs("div",{className:"secrets-confirm",children:[e.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void ie(s),children:a("secrets.confirmDelete","Confirm")}),e.jsx("button",{className:"btn btn-sm",onClick:()=>g(null),children:a("secrets.cancelDelete","Cancel")})]}):null]})]},s.id)})}),X?e.jsx("div",{className:"modal-overlay open",role:"presentation",children:e.jsxs("div",{className:"modal",role:"dialog","aria-modal":"true","aria-label":h?a("secrets.rotateSyncPassphraseModalTitle","Rotate sync passphrase"):a("secrets.setSyncPassphraseModalTitle","Set sync passphrase"),children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h3",{children:h?a("secrets.rotateSyncPassphraseModalTitle","Rotate sync passphrase"):a("secrets.setSyncPassphraseModalTitle","Set sync passphrase")}),e.jsx("button",{className:"modal-close",onClick:w,"aria-label":a("secrets.closeAriaLabel","Close"),children:"×"})]}),e.jsxs("div",{className:"secrets-modal-body",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.passphraseLabel","Passphrase")}),e.jsx("input",{"aria-label":a("secrets.passphraseLabel","Passphrase"),className:"input",type:"password",autoComplete:"new-password",value:f,onChange:s=>B(s.target.value)})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.confirmPassphraseLabel","Confirm passphrase")}),e.jsx("input",{"aria-label":a("secrets.confirmPassphraseLabel","Confirm passphrase"),className:"input",type:"password",autoComplete:"new-password",value:P,onChange:s=>$(s.target.value)})]}),!H&&P.length>0?e.jsx("div",{className:"form-error",children:a("secrets.passphraseMustMatch","Passphrases must match.")}):null]}),e.jsx("div",{className:"modal-actions",children:e.jsxs("div",{className:"modal-actions-right",children:[e.jsx("button",{className:"btn",onClick:w,children:a("secrets.cancelBtn","Cancel")}),e.jsx("button",{className:"btn btn-primary",onClick:()=>void se(),disabled:!H||Z,children:h?a("secrets.rotateSyncPassphrase","Rotate"):a("secrets.setPassphrase","Set passphrase")})]})})]})}):null,U?e.jsx("div",{className:"modal-overlay open",role:"presentation",children:e.jsxs("div",{className:"modal",role:"dialog","aria-modal":"true","aria-label":p?a("secrets.editSecretModalTitle","Edit secret"):a("secrets.addSecretModalTitle","Add secret"),children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h3",{children:p?a("secrets.editSecretModalTitle","Edit secret"):a("secrets.addSecretModalTitle","Add secret")}),e.jsx("button",{className:"modal-close",onClick:()=>y(!1),"aria-label":a("secrets.closeAriaLabel","Close"),children:"×"})]}),e.jsxs("div",{className:"secrets-modal-body",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.keyLabel","Key")}),e.jsx("input",{className:"input",value:t.key,onChange:s=>l(r=>({...r,key:s.target.value}))})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.valueLabel","Value")}),e.jsxs("div",{className:"secrets-value-row",children:[e.jsx("input",{className:"input",type:N?"text":"password",autoComplete:"off",spellCheck:!1,value:t.value,onChange:s=>l(r=>({...r,value:s.target.value}))}),e.jsx("button",{type:"button",className:"btn btn-icon secrets-visibility-toggle",onClick:()=>C(s=>!s),"aria-label":N?a("secrets.hideValueAriaLabel","Hide value"):a("secrets.showValueAriaLabel","Show value"),children:N?e.jsx(q,{...n}):e.jsx(Y,{...n})})]})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.descriptionLabel","Description")}),e.jsx("textarea",{className:"input",value:t.description,onChange:s=>l(r=>({...r,description:s.target.value}))})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.scopeLabel","Scope")}),e.jsxs("div",{className:"secrets-radio-row",children:[e.jsxs("label",{children:[e.jsx("input",{type:"radio",checked:t.scope==="project",onChange:()=>l(s=>({...s,scope:"project"})),disabled:!!p})," ",a("secrets.scopeProject","Project")]}),e.jsxs("label",{children:[e.jsx("input",{type:"radio",checked:t.scope==="global",onChange:()=>l(s=>({...s,scope:"global"})),disabled:!!p})," ",a("secrets.scopeGlobal","Global")]})]})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.accessPolicyLabel","Access policy")}),e.jsxs("select",{className:"select",value:t.accessPolicy,onChange:s=>l(r=>({...r,accessPolicy:s.target.value})),children:[e.jsx("option",{value:"auto",children:a("secrets.accessPolicyAuto","auto")}),e.jsx("option",{value:"prompt",children:a("secrets.accessPolicyPrompt","prompt")}),e.jsx("option",{value:"deny",children:a("secrets.accessPolicyDeny","deny")})]})]}),e.jsx("div",{className:"form-group",children:e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:t.envExportable,onChange:s=>l(r=>({...r,envExportable:s.target.checked}))})," ",a("secrets.exportToEnvLabel","Export to env")]})}),t.envExportable?e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.envKeyLabel","Env key")}),e.jsx("input",{className:"input",value:t.envExportKey,onChange:s=>l(r=>({...r,envExportKey:s.target.value}))})]}):null,K?e.jsx("div",{className:"form-error",children:K}):null]}),e.jsx("div",{className:"modal-actions",children:e.jsxs("div",{className:"modal-actions-right",children:[e.jsx("button",{className:"btn",onClick:()=>y(!1),children:a("secrets.cancelBtn","Cancel")}),e.jsx("button",{className:"btn btn-primary",onClick:()=>void ce(),children:p?a("secrets.saveBtn","Save"):a("secrets.createBtn","Create")})]})})]})}):null]})};export{Ce as SecretsView};
|
|
1
|
+
import{r as c,j as e}from"./vendor-react-D37HfzIf.js";import{u as de}from"./vendor-i18n-CV0mwX_-.js";import{R as J,J as pe,ae as q,af as Y,bJ as he,bK as ue,b6 as me,U as ye}from"./index-CpTBp1RG.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";const xe="__sync_passphrase__",k={key:"",value:"",description:"",scope:"project",accessPolicy:"prompt",envExportable:!1,envExportKey:""},n={className:"secrets-action-icon","aria-hidden":!0,style:{width:"1em",height:"1em"}},ve={...n,className:"secrets-action-icon spin"},Ce=({addToast:d})=>{const{t:a}=de("app"),[L,G]=c.useState([]),[R,T]=c.useState(!0),[M,A]=c.useState(null),[K,b]=c.useState(null),[p,D]=c.useState(null),[U,y]=c.useState(!1),[z,g]=c.useState(null),[t,l]=c.useState(k),[N,C]=c.useState(!1),[O,j]=c.useState({}),[Q,V]=c.useState(null),[h,W]=c.useState(!1),[X,_]=c.useState(!1),[f,B]=c.useState(""),[P,$]=c.useState(""),[Z,F]=c.useState(!1),m=c.useRef(new Map),E=c.useRef(new Map),o=c.useCallback(async(s,r)=>{const i=await fetch(s,{...r,headers:{"Content-Type":"application/json",...r?.headers??{}}});if(!i.ok){const u=await i.json().catch(()=>({error:"Request failed"}));throw new Error(String(u?.error??"Request failed"))}if(i.status!==204)return i.json()},[]),x=c.useCallback(async()=>{T(!0),A(null);try{const s=await o("/api/secrets");G(s.secrets)}catch(s){A(s instanceof Error?s.message:String(s))}finally{T(!1)}},[o]),S=c.useCallback(async()=>{try{const s=await o("/api/secrets/sync-passphrase");W(!!s.configured)}catch(s){d?.(a("secrets.errorLoadSyncStatus","Failed to load sync passphrase status: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}},[d,o]);c.useEffect(()=>(x(),S(),()=>{m.current.forEach(s=>clearTimeout(s)),E.current.forEach(s=>clearTimeout(s))}),[x,S]);const w=()=>{_(!1),B(""),$("")},ee=async s=>{await o("/api/secrets/sync-passphrase",{method:"PUT",body:JSON.stringify({passphrase:s})})},se=async()=>{F(!0);try{await ee(f),d?.(h?a("secrets.syncPassphraseRotated","Sync passphrase rotated"):a("secrets.syncPassphraseSet","Sync passphrase set"),"success"),w(),await S()}catch(s){d?.(a("secrets.errorSaveSyncPassphrase","Failed to save sync passphrase: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}finally{F(!1)}},ae=async()=>{if(window.confirm(a("secrets.confirmClearSyncPassphrase","Clear the cross-node sync passphrase? Existing sync pairs will stop working until you set a new passphrase.")))try{await o("/api/secrets/sync-passphrase",{method:"DELETE"}),d?.(a("secrets.syncPassphraseCleared","Sync passphrase cleared"),"success"),await S()}catch(r){d?.(a("secrets.errorClearSyncPassphrase","Failed to clear sync passphrase: {{error}}",{error:r instanceof Error?r.message:String(r)}),"error")}},re=()=>{D(null),l(k),y(!0),C(!1),b(null)},te=s=>{D(s),l({key:s.key,value:"",description:s.description??"",scope:s.scope,accessPolicy:s.accessPolicy,envExportable:s.envExportable,envExportKey:s.envExportKey??""}),y(!0),C(!1),b(null)},ce=async()=>{b(null);try{if(p){const s={key:t.key,description:t.description||null,accessPolicy:t.accessPolicy,envExportable:t.envExportable,envExportKey:t.envExportable&&t.envExportKey||null};t.value&&(s.value=t.value),await o(`/api/secrets/${p.scope}/${p.id}`,{method:"PATCH",body:JSON.stringify(s)})}else await o("/api/secrets",{method:"POST",body:JSON.stringify({scope:t.scope,key:t.key,value:t.value,description:t.description||null,accessPolicy:t.accessPolicy,envExportable:t.envExportable,envExportKey:t.envExportable&&t.envExportKey||null})});y(!1),l(k),await x()}catch(s){b(s instanceof Error?s.message:String(s))}},le=s=>{const r=m.current.get(s.id);r&&(clearTimeout(r),m.current.delete(s.id)),j(i=>({...i,[s.id]:null}))},ne=async s=>{const r=await o(`/api/secrets/${s.scope}/${s.id}/reveal`,{method:"POST"});j(v=>({...v,[s.id]:r.value})),d?.(a("secrets.revealed","Revealed"),"success");const i=setTimeout(()=>{j(v=>({...v,[s.id]:null})),m.current.delete(s.id)},3e4),u=m.current.get(s.id);u&&clearTimeout(u),m.current.set(s.id,i)},oe=async s=>{const r=O[s.id];if(!r)return;await navigator.clipboard.writeText(r),V(s.id),d?.(a("secrets.copied","Copied"),"success");const i=setTimeout(()=>{V(null),j(v=>({...v,[s.id]:null}))},1500),u=E.current.get(s.id);u&&clearTimeout(u),E.current.set(s.id,i)},ie=async s=>{await o(`/api/secrets/${s.scope}/${s.id}`,{method:"DELETE"}),g(null),await x()},I=c.useMemo(()=>[...L].filter(s=>!(s.scope==="global"&&s.key===xe)).sort((s,r)=>s.key.localeCompare(r.key)),[L]),H=f.length>0&&f===P;return e.jsxs("section",{className:"secrets-view",children:[e.jsxs("div",{className:"secrets-header",children:[e.jsx("h2",{children:a("secrets.title","Secrets")}),e.jsxs("div",{className:"secrets-header-actions",children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>void x(),children:[e.jsx(J,{...n})," ",a("secrets.refresh","Refresh")]}),e.jsxs("button",{className:"btn btn-primary btn-sm",onClick:re,children:[e.jsx(pe,{...n})," ",a("secrets.addSecret","Add Secret")]})]})]}),e.jsxs("article",{className:"card secrets-sync-card",children:[e.jsxs("div",{className:"secrets-sync-header",children:[e.jsxs("div",{children:[e.jsx("h3",{children:a("secrets.syncPassphraseTitle","Cross-Node Sync Passphrase")}),e.jsxs("p",{className:"secrets-sync-status",children:[e.jsx("span",{className:`status-dot ${h?"status-dot--online":"status-dot--pending"}`,"aria-hidden":"true"})," ",h?a("secrets.syncConfigured","Configured"):a("secrets.syncNotConfigured","Not configured")]})]}),e.jsxs("div",{className:"secrets-sync-actions",children:[e.jsx("button",{className:"btn",onClick:()=>_(!0),children:h?a("secrets.rotateSyncPassphrase","Rotate"):a("secrets.setPassphrase","Set passphrase")}),h?e.jsx("button",{className:"btn btn-danger",onClick:()=>void ae(),children:a("secrets.clearSyncPassphrase","Clear")}):null]})]}),e.jsx("p",{className:"secrets-sync-copy",children:a("secrets.syncPassphraseDescription","Shared passphrase used to wrap cross-node secret bundles. Both nodes in a sync pair must share the same value. Stored locally only; never transmitted.")})]}),M?e.jsx("div",{className:"form-error",children:M}):null,R?e.jsxs("div",{className:"secrets-loading",children:[e.jsx(J,{...ve})," ",a("secrets.loading","Loading…")]}):null,!R&&I.length===0?e.jsx("div",{className:"secrets-empty",children:a("secrets.empty","No secrets found.")}):null,e.jsx("div",{className:"secrets-list",children:I.map(s=>{const r=O[s.id];return e.jsxs("article",{className:"card secrets-row",children:[e.jsxs("div",{className:"secrets-row-main",children:[e.jsx("div",{className:"secrets-row-key",children:s.key}),e.jsxs("div",{className:"secrets-row-meta",children:[e.jsx("span",{className:"secrets-chip",children:s.scope}),e.jsx("span",{className:"secrets-chip",children:s.accessPolicy}),s.envExportable?e.jsx("span",{className:"secrets-chip",children:a("secrets.envExportableChip","env exportable")}):null]}),r?e.jsx("pre",{className:"secrets-revealed",children:r}):null]}),e.jsxs("div",{className:"secrets-row-side",children:[e.jsx("span",{className:"secrets-row-read",children:s.lastReadAt?new Date(s.lastReadAt).toLocaleString():a("secrets.neverRead","Never read")}),e.jsxs("div",{className:"secrets-row-actions",children:[e.jsx("button",{type:"button",className:"btn btn-icon secrets-visibility-toggle",onClick:()=>{if(r){le(s);return}ne(s)},"aria-label":r?a("secrets.hideAriaLabel","Hide"):a("secrets.revealAriaLabel","Reveal"),children:r?e.jsx(q,{...n}):e.jsx(Y,{...n})}),e.jsx("button",{className:"btn btn-icon",onClick:()=>void oe(s),"aria-label":a("secrets.copyAriaLabel","Copy"),disabled:!r,children:Q===s.id?e.jsx(he,{...n}):e.jsx(ue,{...n})}),e.jsx("button",{className:"btn btn-icon",onClick:()=>te(s),"aria-label":a("secrets.editAriaLabel","Edit"),children:e.jsx(me,{...n})}),e.jsx("button",{className:"btn btn-icon btn-danger",onClick:()=>g(s.id),"aria-label":a("secrets.deleteAriaLabel","Delete"),children:e.jsx(ye,{...n})})]}),z===s.id?e.jsxs("div",{className:"secrets-confirm",children:[e.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void ie(s),children:a("secrets.confirmDelete","Confirm")}),e.jsx("button",{className:"btn btn-sm",onClick:()=>g(null),children:a("secrets.cancelDelete","Cancel")})]}):null]})]},s.id)})}),X?e.jsx("div",{className:"modal-overlay open",role:"presentation",children:e.jsxs("div",{className:"modal",role:"dialog","aria-modal":"true","aria-label":h?a("secrets.rotateSyncPassphraseModalTitle","Rotate sync passphrase"):a("secrets.setSyncPassphraseModalTitle","Set sync passphrase"),children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h3",{children:h?a("secrets.rotateSyncPassphraseModalTitle","Rotate sync passphrase"):a("secrets.setSyncPassphraseModalTitle","Set sync passphrase")}),e.jsx("button",{className:"modal-close",onClick:w,"aria-label":a("secrets.closeAriaLabel","Close"),children:"×"})]}),e.jsxs("div",{className:"secrets-modal-body",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.passphraseLabel","Passphrase")}),e.jsx("input",{"aria-label":a("secrets.passphraseLabel","Passphrase"),className:"input",type:"password",autoComplete:"new-password",value:f,onChange:s=>B(s.target.value)})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.confirmPassphraseLabel","Confirm passphrase")}),e.jsx("input",{"aria-label":a("secrets.confirmPassphraseLabel","Confirm passphrase"),className:"input",type:"password",autoComplete:"new-password",value:P,onChange:s=>$(s.target.value)})]}),!H&&P.length>0?e.jsx("div",{className:"form-error",children:a("secrets.passphraseMustMatch","Passphrases must match.")}):null]}),e.jsx("div",{className:"modal-actions",children:e.jsxs("div",{className:"modal-actions-right",children:[e.jsx("button",{className:"btn",onClick:w,children:a("secrets.cancelBtn","Cancel")}),e.jsx("button",{className:"btn btn-primary",onClick:()=>void se(),disabled:!H||Z,children:h?a("secrets.rotateSyncPassphrase","Rotate"):a("secrets.setPassphrase","Set passphrase")})]})})]})}):null,U?e.jsx("div",{className:"modal-overlay open",role:"presentation",children:e.jsxs("div",{className:"modal",role:"dialog","aria-modal":"true","aria-label":p?a("secrets.editSecretModalTitle","Edit secret"):a("secrets.addSecretModalTitle","Add secret"),children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h3",{children:p?a("secrets.editSecretModalTitle","Edit secret"):a("secrets.addSecretModalTitle","Add secret")}),e.jsx("button",{className:"modal-close",onClick:()=>y(!1),"aria-label":a("secrets.closeAriaLabel","Close"),children:"×"})]}),e.jsxs("div",{className:"secrets-modal-body",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.keyLabel","Key")}),e.jsx("input",{className:"input",value:t.key,onChange:s=>l(r=>({...r,key:s.target.value}))})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.valueLabel","Value")}),e.jsxs("div",{className:"secrets-value-row",children:[e.jsx("input",{className:"input",type:N?"text":"password",autoComplete:"off",spellCheck:!1,value:t.value,onChange:s=>l(r=>({...r,value:s.target.value}))}),e.jsx("button",{type:"button",className:"btn btn-icon secrets-visibility-toggle",onClick:()=>C(s=>!s),"aria-label":N?a("secrets.hideValueAriaLabel","Hide value"):a("secrets.showValueAriaLabel","Show value"),children:N?e.jsx(q,{...n}):e.jsx(Y,{...n})})]})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.descriptionLabel","Description")}),e.jsx("textarea",{className:"input",value:t.description,onChange:s=>l(r=>({...r,description:s.target.value}))})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.scopeLabel","Scope")}),e.jsxs("div",{className:"secrets-radio-row",children:[e.jsxs("label",{children:[e.jsx("input",{type:"radio",checked:t.scope==="project",onChange:()=>l(s=>({...s,scope:"project"})),disabled:!!p})," ",a("secrets.scopeProject","Project")]}),e.jsxs("label",{children:[e.jsx("input",{type:"radio",checked:t.scope==="global",onChange:()=>l(s=>({...s,scope:"global"})),disabled:!!p})," ",a("secrets.scopeGlobal","Global")]})]})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.accessPolicyLabel","Access policy")}),e.jsxs("select",{className:"select",value:t.accessPolicy,onChange:s=>l(r=>({...r,accessPolicy:s.target.value})),children:[e.jsx("option",{value:"auto",children:a("secrets.accessPolicyAuto","auto")}),e.jsx("option",{value:"prompt",children:a("secrets.accessPolicyPrompt","prompt")}),e.jsx("option",{value:"deny",children:a("secrets.accessPolicyDeny","deny")})]})]}),e.jsx("div",{className:"form-group",children:e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:t.envExportable,onChange:s=>l(r=>({...r,envExportable:s.target.checked}))})," ",a("secrets.exportToEnvLabel","Export to env")]})}),t.envExportable?e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.envKeyLabel","Env key")}),e.jsx("input",{className:"input",value:t.envExportKey,onChange:s=>l(r=>({...r,envExportKey:s.target.value}))})]}):null,K?e.jsx("div",{className:"form-error",children:K}):null]}),e.jsx("div",{className:"modal-actions",children:e.jsxs("div",{className:"modal-actions-right",children:[e.jsx("button",{className:"btn",onClick:()=>y(!1),children:a("secrets.cancelBtn","Cancel")}),e.jsx("button",{className:"btn btn-primary",onClick:()=>void ce(),children:p?a("secrets.saveBtn","Save"):a("secrets.createBtn","Create")})]})})]})}):null]})};export{Ce as SecretsView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.secrets-view{display:flex;flex:1 1 auto;flex-direction:column;gap:var(--space-lg);min-width:0;width:100%;padding-block:var(--space-md);padding-inline:var(--space-xl)}.secrets-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md)}.secrets-header h2{margin:0}.secrets-header-actions{display:flex;gap:var(--space-sm)}.secrets-loading,.secrets-empty{color:var(--text-muted);display:flex;align-items:center;gap:var(--space-sm);padding-block:var(--space-sm)}.secrets-sync-card{display:flex;flex-direction:column;gap:var(--space-md)}.secrets-sync-header{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:var(--space-md)}.secrets-sync-status{display:inline-flex;align-items:center;gap:var(--space-xs);margin:0;color:var(--text-muted)}.secrets-sync-copy{margin:0;max-width:60ch;color:var(--text-muted);line-height:1.5}.secrets-sync-actions{display:flex;gap:var(--space-sm)}.secrets-list{display:flex;flex-direction:column;gap:var(--space-md)}.secrets-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--space-md);align-items:start}.secrets-row-main{display:flex;flex-direction:column;gap:var(--space-sm)}.secrets-row-key{font-family:var(--font-mono);font-size:1em;overflow-wrap:anywhere}.secrets-row-meta{display:flex;flex-wrap:wrap;gap:var(--space-sm);row-gap:var(--space-xs)}.secrets-chip{border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-pill);padding:var(--space-xs) var(--space-sm);color:var(--text-muted)}.secrets-revealed{margin:0;max-width:100%;overflow-x:auto;white-space:pre-wrap;word-break:break-all;font-family:var(--font-mono);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-sm);padding:var(--space-sm);background:var(--surface)}.secrets-row-side{display:flex;flex-direction:column;gap:var(--space-sm);align-items:flex-end}.secrets-row-read{color:var(--text-muted);font-size:.95em;font-weight:400}.secrets-row-actions,.secrets-confirm,.secrets-value-row,.secrets-radio-row{display:flex;gap:var(--space-sm);align-items:center}.secrets-radio-row{flex-wrap:wrap;row-gap:var(--space-xs)}.secrets-modal-body{display:flex;flex-direction:column;gap:var(--space-md);padding:0 var(--space-xl) var(--space-lg)}.secrets-modal-body .form-group{margin:0;padding:0}.secrets-value-row .input{flex:1}.secrets-action-icon{width:1em;height:1em;min-width:1em;min-height:1em;flex-shrink:0;display:block;stroke:currentColor;font-size:var(--icon-size-sm)}.secrets-header-actions .btn,.secrets-row-actions .btn,.secrets-value-row .btn-icon{color:var(--text)}.secrets-header-actions .btn-primary,.secrets-row-actions .btn-danger{color:var(--cta-text)}.secrets-row-actions .btn:disabled{color:var(--text-muted)}@media(max-width:768px){.secrets-view{padding-inline:var(--space-md);padding-bottom:calc(var(--space-md) + var(--mobile-nav-height) + env(safe-area-inset-bottom,0px) + var(--standalone-bottom-gap, 0px))}.secrets-header,.secrets-row,.secrets-sync-header{grid-template-columns:minmax(0,1fr);display:flex;flex-direction:column;align-items:stretch;gap:var(--space-sm)}.secrets-sync-header{flex-wrap:wrap}.secrets-sync-copy{max-width:none}.secrets-sync-actions{flex-direction:column}.secrets-row-key{font-size:.95em}.secrets-row-side{width:100%;align-items:flex-start;gap:var(--space-sm)}}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-xterm-tcedd2Jt.js","assets/vendor-react-D37HfzIf.js","assets/vendor-xterm-LZoznX6r.css","assets/addon-fit-B4jkcKk4.js","assets/addon-unicode11-Cdne2Sj4.js","assets/addon-webgl-CeCSULF1.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{bF as oe,ct as le,by as re,ax as ce,af as de,cS as H,cT as ue,cH as me,a0 as D,cU as pe}from"./index-2kYpdJrx.js";import{r as i,j as e}from"./vendor-react-D37HfzIf.js";import"./vendor-xterm-tcedd2Jt.js";import{u as be}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-codemirror-jBKmHyH0.js";const fe=32*1024,ye=100,he="\x1B",_e=" ",we="",ke="\x1B[A",Se="\x1B[B",xe="\x1B[C",ve="\x1B[D";function Y(r){if(r.length!==1)return null;const n=r.toUpperCase().charCodeAt(0);return n>=64&&n<=95?String.fromCharCode(n&31):null}function Ce(){const[r,l]=i.useState(()=>H());return i.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const n=window.matchMedia(ue),a=()=>l(H());return a(),typeof n.addEventListener=="function"?(n.addEventListener("change",a),()=>n.removeEventListener("change",a)):(n.addListener(a),()=>n.removeListener(a))},[]),r}function Te(r,l){if(typeof window>"u")return"";const a=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/api/cli-sessions/ws?sessionId=${encodeURIComponent(r)}&ticket=${encodeURIComponent(l)}`;return pe(a)}function Ne(r){if(typeof window<"u"&&typeof window.atob=="function"){const l=window.atob(r),n=new Uint8Array(l.length);for(let a=0;a<l.length;a++)n[a]=l.charCodeAt(a);return new TextDecoder("utf-8").decode(n)}return Buffer.from(r,"base64").toString("utf8")}function Pe({sessionId:r,readOnly:l=!1,posture:n,mode:a="live",projectId:M,onConfirmAdvance:w,showConfirmAdvance:A=!1,onOpenAdapterSettings:L}){const{t:s}=be("app"),v=i.useRef(null),P=i.useRef(null),I=i.useRef(null),_=i.useRef(null),[W,U]=i.useState(!1),[G,O]=i.useState(!1),[z,K]=i.useState(!1),k=Ce(),{keyboardOpen:C,keyboardOverlap:Z}=oe({enabled:k}),q=i.useRef(null),[y,$]=i.useState(""),[S,T]=i.useState(!1),b=i.useCallback(t=>{if(!t)return;const c=_.current;c?.readyState===WebSocket.OPEN&&c.send(JSON.stringify({type:"input",data:t}))},[]),x=i.useCallback(t=>{if(S){const c=Y(t);if(T(!1),c){b(c);return}}b(t)},[S,b]),o=i.useCallback(t=>{t.preventDefault()},[]),Q=i.useCallback(t=>{t?.preventDefault?.(),y&&b(y),b("\r"),$("")},[y,b]),X=i.useCallback(t=>{if(S&&t.length>y.length){const c=t.slice(y.length,y.length+1),h=Y(c);if(T(!1),h){b(h);return}}$(t)},[S,y,b]);i.useEffect(()=>{A&&O(!1)},[A,r]),i.useEffect(()=>{if(!r||typeof window>"u")return;let t=!1,c=null,h=null,g=0;const J=(d,f)=>{const E=_.current;E?.readyState===WebSocket.OPEN&&E.send(JSON.stringify({type:"resize",cols:d,rows:f}))},ne=d=>{if(g+=d,g<fe)return;const f=_.current;f?.readyState===WebSocket.OPEN&&f.send(JSON.stringify({type:"ack",bytes:g})),g=0};return(async()=>{let d;try{d=await me(`/cli-sessions/${encodeURIComponent(r)}/attach-ticket`,{method:"POST",body:JSON.stringify(M?{projectId:M}:{})})}catch{return}if(t)return;const[{Terminal:f},{FitAddon:E},{Unicode11Addon:ie}]=await Promise.all([D(()=>import("./vendor-xterm-tcedd2Jt.js").then(p=>p.x),__vite__mapDeps([0,1,2])),D(()=>import("./addon-fit-B4jkcKk4.js").then(p=>p.a),__vite__mapDeps([3,1])),D(()=>import("./addon-unicode11-Cdne2Sj4.js").then(p=>p.a),__vite__mapDeps([4,1]))]);if(t||!v.current)return;const m=new f({convertEol:!1,cursorBlink:!l&&a==="live",disableStdin:l,scrollback:1e4,fontFamily:'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace',fontSize:13}),j=new E;m.loadAddon(j);const se=new ie;m.loadAddon(se),m.unicode.activeVersion="11",m.open(v.current),P.current=m,I.current=j;try{const{WebglAddon:p}=await D(async()=>{const{WebglAddon:u}=await import("./addon-webgl-CeCSULF1.js").then(R=>R.a);return{WebglAddon:u}},__vite__mapDeps([5,1]));if(!t){const u=new p;u.onContextLoss(()=>{try{u.dispose()}catch{}}),m.loadAddon(u)}}catch{}try{j.fit()}catch{}l||m.onData(p=>{const u=_.current;u?.readyState===WebSocket.OPEN&&u.send(JSON.stringify({type:"input",data:p}))}),c=new ResizeObserver(()=>{h&&clearTimeout(h),h=setTimeout(()=>{try{j.fit(),J(m.cols,m.rows)}catch{}},ye)}),c.observe(v.current);const B=new WebSocket(Te(r,d.ticket));_.current=B,B.onopen=()=>{J(m.cols,m.rows)},B.onmessage=p=>{let u;try{u=JSON.parse(typeof p.data=="string"?p.data:"")}catch{return}switch(u.type){case"scrollback":case"data":{if(typeof u.data!="string")return;const R=Ne(u.data),ae=R.length;m.write(R,()=>ne(ae));break}}}})(),()=>{t=!0,h&&clearTimeout(h),c&&c.disconnect();const d=_.current;if(d){d.onopen=null,d.onmessage=null,d.onclose=null,d.onerror=null;try{d.close()}catch{}_.current=null}const f=P.current;if(f){try{f.dispose()}catch{}P.current=null}I.current=null}},[r,l,a,M]);const F=i.useMemo(()=>a==="idle"?s("cliTerminal.replayIdle","Session idle"):a==="ended"?s("cliTerminal.replayEnded","Session ended"):null,[a,s]),ee=i.useCallback(async()=>{if(w){K(!0);try{await w("advance"),O(!0)}finally{K(!1)}}},[w]),te=i.useCallback(async()=>{w&&await w("not-yet"),O(!0)},[w]),N=!!n?.elevated,V=n?.elevatedFlags?.join(", ");return e.jsxs("div",{className:`cli-session-terminal${k?" cli-session-terminal--mobile":""}${k&&C?" cli-session-terminal--keyboard-open":""}`,"data-mode":a,"data-read-only":l,"data-mobile":k,"data-keyboard-open":k&&C,children:[e.jsxs("header",{className:"cli-session-terminal__header",children:[n&&e.jsxs("div",{className:"cli-session-terminal__posture-wrap",children:[e.jsxs("button",{type:"button",className:`cli-posture-chip${N?" cli-posture-chip--elevated":""}`,"data-elevated":N,"aria-expanded":W,onClick:()=>U(t=>!t),children:[N?e.jsx(le,{size:13,"aria-hidden":"true"}):e.jsx(re,{size:13,"aria-hidden":"true"}),e.jsx("span",{className:"cli-posture-chip__name",children:n.adapterName}),n.mode&&e.jsx("span",{className:"cli-posture-chip__mode",children:n.mode}),N&&V&&e.jsx("span",{className:"cli-posture-chip__flag",children:V})]}),W&&e.jsxs("div",{className:"cli-posture-tooltip",role:"tooltip",children:[e.jsx("p",{className:"cli-posture-tooltip__title",children:s("cliTerminal.postureResolved","Resolved posture")}),e.jsxs("ul",{className:"cli-posture-tooltip__list",children:[(n.resolved??[]).map((t,c)=>e.jsx("li",{children:t},c)),(n.resolved??[]).length===0&&e.jsx("li",{children:n.mode??s("cliTerminal.postureBaseline","Baseline")})]}),L&&e.jsxs("button",{type:"button",className:"cli-posture-tooltip__settings",onClick:()=>{U(!1),L()},children:[e.jsx(ce,{size:12,"aria-hidden":"true"}),s("cliTerminal.adapterSettings","Adapter settings")]})]})]}),l&&e.jsxs("span",{className:"cli-session-terminal__readonly-badge",children:[e.jsx(de,{size:12,"aria-hidden":"true"}),s("cliTerminal.readOnly","Read-only")]}),F&&e.jsx("span",{className:"cli-session-terminal__replay-badge","data-replay-mode":a,children:F})]}),e.jsx("div",{className:"cli-session-terminal__viewport",ref:v,"data-testid":"cli-terminal-viewport"}),A&&!G&&e.jsxs("div",{className:"cli-session-terminal__advance-strip",role:"region",children:[e.jsx("span",{className:"cli-session-terminal__advance-copy",children:s("cliTerminal.advancePrompt","This session looks idle — advance to review?")}),e.jsxs("div",{className:"cli-session-terminal__advance-actions",children:[e.jsx("button",{type:"button",className:"cli-session-terminal__advance-btn",disabled:z,onClick:ee,children:s("cliTerminal.advance","Advance")}),e.jsx("button",{type:"button",className:"cli-session-terminal__advance-btn cli-session-terminal__advance-btn--secondary",disabled:z,onClick:te,children:s("cliTerminal.notYet","Not yet")})]})]}),k&&!l&&e.jsxs("div",{className:`cli-session-terminal__mobile-bar${C?" cli-session-terminal__mobile-bar--keyboard-open":""}`,"data-testid":"cli-terminal-mobile-bar",style:C?{bottom:`${Z}px`}:void 0,children:[e.jsxs("div",{className:"cli-session-terminal__key-row","data-testid":"cli-terminal-key-bar",children:[e.jsx("button",{type:"button",className:`cli-terminal-key cli-terminal-key--ctrl${S?" cli-terminal-key--active":""}`,"data-testid":"cli-key-ctrl","aria-label":s("cliTerminal.mobileKeyCtrl","Sticky Ctrl modifier"),"aria-pressed":S,onPointerDown:o,onMouseDown:o,onClick:()=>T(t=>!t),children:"Ctrl"}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-esc","aria-label":s("cliTerminal.mobileKeyEsc","Send Escape"),onPointerDown:o,onMouseDown:o,onClick:()=>x(he),children:"Esc"}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-tab","aria-label":s("cliTerminal.mobileKeyTab","Send Tab"),onPointerDown:o,onMouseDown:o,onClick:()=>x(_e),children:"Tab"}),e.jsx("button",{type:"button",className:"cli-terminal-key cli-terminal-key--ctrlc","data-testid":"cli-key-ctrl-c","aria-label":s("cliTerminal.mobileKeyCtrlC","Send Ctrl-C"),onPointerDown:o,onMouseDown:o,onClick:()=>{T(!1),b(we)},children:"^C"}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-up","aria-label":s("cliTerminal.mobileKeyArrowUp","Cursor up"),onPointerDown:o,onMouseDown:o,onClick:()=>x(ke),children:"↑"}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-down","aria-label":s("cliTerminal.mobileKeyArrowDown","Cursor down"),onPointerDown:o,onMouseDown:o,onClick:()=>x(Se),children:"↓"}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-left","aria-label":s("cliTerminal.mobileKeyArrowLeft","Cursor left"),onPointerDown:o,onMouseDown:o,onClick:()=>x(ve),children:"←"}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-right","aria-label":s("cliTerminal.mobileKeyArrowRight","Cursor right"),onPointerDown:o,onMouseDown:o,onClick:()=>x(xe),children:"→"})]}),e.jsxs("form",{className:"cli-session-terminal__input-row",onSubmit:Q,children:[e.jsx("input",{ref:q,type:"text",className:"cli-session-terminal__mobile-input","data-testid":"cli-terminal-mobile-input",value:y,placeholder:s("cliTerminal.mobileInputPlaceholder","Type to send to the session…"),autoCapitalize:"off",autoCorrect:"off",autoComplete:"off",spellCheck:!1,onChange:t=>X(t.target.value)}),e.jsx("button",{type:"submit",className:"cli-session-terminal__mobile-send","data-testid":"cli-terminal-mobile-send","aria-label":s("cliTerminal.mobileSend","Send"),onPointerDown:o,onMouseDown:o,onClick:()=>Q(),children:s("cliTerminal.mobileSend","Send")})]})]})]})}export{Pe as SessionTerminal};
|
|
2
|
+
import{bF as oe,ct as le,by as re,ax as ce,af as de,cS as H,cT as ue,cH as me,a0 as D,cU as pe}from"./index-CpTBp1RG.js";import{r as i,j as e}from"./vendor-react-D37HfzIf.js";import"./vendor-xterm-tcedd2Jt.js";import{u as be}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-codemirror-jBKmHyH0.js";const fe=32*1024,ye=100,he="\x1B",_e=" ",we="",ke="\x1B[A",Se="\x1B[B",xe="\x1B[C",ve="\x1B[D";function Y(r){if(r.length!==1)return null;const n=r.toUpperCase().charCodeAt(0);return n>=64&&n<=95?String.fromCharCode(n&31):null}function Ce(){const[r,l]=i.useState(()=>H());return i.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const n=window.matchMedia(ue),a=()=>l(H());return a(),typeof n.addEventListener=="function"?(n.addEventListener("change",a),()=>n.removeEventListener("change",a)):(n.addListener(a),()=>n.removeListener(a))},[]),r}function Te(r,l){if(typeof window>"u")return"";const a=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/api/cli-sessions/ws?sessionId=${encodeURIComponent(r)}&ticket=${encodeURIComponent(l)}`;return pe(a)}function Ne(r){if(typeof window<"u"&&typeof window.atob=="function"){const l=window.atob(r),n=new Uint8Array(l.length);for(let a=0;a<l.length;a++)n[a]=l.charCodeAt(a);return new TextDecoder("utf-8").decode(n)}return Buffer.from(r,"base64").toString("utf8")}function Pe({sessionId:r,readOnly:l=!1,posture:n,mode:a="live",projectId:M,onConfirmAdvance:w,showConfirmAdvance:A=!1,onOpenAdapterSettings:L}){const{t:s}=be("app"),v=i.useRef(null),P=i.useRef(null),I=i.useRef(null),_=i.useRef(null),[W,U]=i.useState(!1),[G,O]=i.useState(!1),[z,K]=i.useState(!1),k=Ce(),{keyboardOpen:C,keyboardOverlap:Z}=oe({enabled:k}),q=i.useRef(null),[y,$]=i.useState(""),[S,T]=i.useState(!1),b=i.useCallback(t=>{if(!t)return;const c=_.current;c?.readyState===WebSocket.OPEN&&c.send(JSON.stringify({type:"input",data:t}))},[]),x=i.useCallback(t=>{if(S){const c=Y(t);if(T(!1),c){b(c);return}}b(t)},[S,b]),o=i.useCallback(t=>{t.preventDefault()},[]),Q=i.useCallback(t=>{t?.preventDefault?.(),y&&b(y),b("\r"),$("")},[y,b]),X=i.useCallback(t=>{if(S&&t.length>y.length){const c=t.slice(y.length,y.length+1),h=Y(c);if(T(!1),h){b(h);return}}$(t)},[S,y,b]);i.useEffect(()=>{A&&O(!1)},[A,r]),i.useEffect(()=>{if(!r||typeof window>"u")return;let t=!1,c=null,h=null,g=0;const J=(d,f)=>{const E=_.current;E?.readyState===WebSocket.OPEN&&E.send(JSON.stringify({type:"resize",cols:d,rows:f}))},ne=d=>{if(g+=d,g<fe)return;const f=_.current;f?.readyState===WebSocket.OPEN&&f.send(JSON.stringify({type:"ack",bytes:g})),g=0};return(async()=>{let d;try{d=await me(`/cli-sessions/${encodeURIComponent(r)}/attach-ticket`,{method:"POST",body:JSON.stringify(M?{projectId:M}:{})})}catch{return}if(t)return;const[{Terminal:f},{FitAddon:E},{Unicode11Addon:ie}]=await Promise.all([D(()=>import("./vendor-xterm-tcedd2Jt.js").then(p=>p.x),__vite__mapDeps([0,1,2])),D(()=>import("./addon-fit-B4jkcKk4.js").then(p=>p.a),__vite__mapDeps([3,1])),D(()=>import("./addon-unicode11-Cdne2Sj4.js").then(p=>p.a),__vite__mapDeps([4,1]))]);if(t||!v.current)return;const m=new f({convertEol:!1,cursorBlink:!l&&a==="live",disableStdin:l,scrollback:1e4,fontFamily:'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace',fontSize:13}),j=new E;m.loadAddon(j);const se=new ie;m.loadAddon(se),m.unicode.activeVersion="11",m.open(v.current),P.current=m,I.current=j;try{const{WebglAddon:p}=await D(async()=>{const{WebglAddon:u}=await import("./addon-webgl-CeCSULF1.js").then(R=>R.a);return{WebglAddon:u}},__vite__mapDeps([5,1]));if(!t){const u=new p;u.onContextLoss(()=>{try{u.dispose()}catch{}}),m.loadAddon(u)}}catch{}try{j.fit()}catch{}l||m.onData(p=>{const u=_.current;u?.readyState===WebSocket.OPEN&&u.send(JSON.stringify({type:"input",data:p}))}),c=new ResizeObserver(()=>{h&&clearTimeout(h),h=setTimeout(()=>{try{j.fit(),J(m.cols,m.rows)}catch{}},ye)}),c.observe(v.current);const B=new WebSocket(Te(r,d.ticket));_.current=B,B.onopen=()=>{J(m.cols,m.rows)},B.onmessage=p=>{let u;try{u=JSON.parse(typeof p.data=="string"?p.data:"")}catch{return}switch(u.type){case"scrollback":case"data":{if(typeof u.data!="string")return;const R=Ne(u.data),ae=R.length;m.write(R,()=>ne(ae));break}}}})(),()=>{t=!0,h&&clearTimeout(h),c&&c.disconnect();const d=_.current;if(d){d.onopen=null,d.onmessage=null,d.onclose=null,d.onerror=null;try{d.close()}catch{}_.current=null}const f=P.current;if(f){try{f.dispose()}catch{}P.current=null}I.current=null}},[r,l,a,M]);const F=i.useMemo(()=>a==="idle"?s("cliTerminal.replayIdle","Session idle"):a==="ended"?s("cliTerminal.replayEnded","Session ended"):null,[a,s]),ee=i.useCallback(async()=>{if(w){K(!0);try{await w("advance"),O(!0)}finally{K(!1)}}},[w]),te=i.useCallback(async()=>{w&&await w("not-yet"),O(!0)},[w]),N=!!n?.elevated,V=n?.elevatedFlags?.join(", ");return e.jsxs("div",{className:`cli-session-terminal${k?" cli-session-terminal--mobile":""}${k&&C?" cli-session-terminal--keyboard-open":""}`,"data-mode":a,"data-read-only":l,"data-mobile":k,"data-keyboard-open":k&&C,children:[e.jsxs("header",{className:"cli-session-terminal__header",children:[n&&e.jsxs("div",{className:"cli-session-terminal__posture-wrap",children:[e.jsxs("button",{type:"button",className:`cli-posture-chip${N?" cli-posture-chip--elevated":""}`,"data-elevated":N,"aria-expanded":W,onClick:()=>U(t=>!t),children:[N?e.jsx(le,{size:13,"aria-hidden":"true"}):e.jsx(re,{size:13,"aria-hidden":"true"}),e.jsx("span",{className:"cli-posture-chip__name",children:n.adapterName}),n.mode&&e.jsx("span",{className:"cli-posture-chip__mode",children:n.mode}),N&&V&&e.jsx("span",{className:"cli-posture-chip__flag",children:V})]}),W&&e.jsxs("div",{className:"cli-posture-tooltip",role:"tooltip",children:[e.jsx("p",{className:"cli-posture-tooltip__title",children:s("cliTerminal.postureResolved","Resolved posture")}),e.jsxs("ul",{className:"cli-posture-tooltip__list",children:[(n.resolved??[]).map((t,c)=>e.jsx("li",{children:t},c)),(n.resolved??[]).length===0&&e.jsx("li",{children:n.mode??s("cliTerminal.postureBaseline","Baseline")})]}),L&&e.jsxs("button",{type:"button",className:"cli-posture-tooltip__settings",onClick:()=>{U(!1),L()},children:[e.jsx(ce,{size:12,"aria-hidden":"true"}),s("cliTerminal.adapterSettings","Adapter settings")]})]})]}),l&&e.jsxs("span",{className:"cli-session-terminal__readonly-badge",children:[e.jsx(de,{size:12,"aria-hidden":"true"}),s("cliTerminal.readOnly","Read-only")]}),F&&e.jsx("span",{className:"cli-session-terminal__replay-badge","data-replay-mode":a,children:F})]}),e.jsx("div",{className:"cli-session-terminal__viewport",ref:v,"data-testid":"cli-terminal-viewport"}),A&&!G&&e.jsxs("div",{className:"cli-session-terminal__advance-strip",role:"region",children:[e.jsx("span",{className:"cli-session-terminal__advance-copy",children:s("cliTerminal.advancePrompt","This session looks idle — advance to review?")}),e.jsxs("div",{className:"cli-session-terminal__advance-actions",children:[e.jsx("button",{type:"button",className:"cli-session-terminal__advance-btn",disabled:z,onClick:ee,children:s("cliTerminal.advance","Advance")}),e.jsx("button",{type:"button",className:"cli-session-terminal__advance-btn cli-session-terminal__advance-btn--secondary",disabled:z,onClick:te,children:s("cliTerminal.notYet","Not yet")})]})]}),k&&!l&&e.jsxs("div",{className:`cli-session-terminal__mobile-bar${C?" cli-session-terminal__mobile-bar--keyboard-open":""}`,"data-testid":"cli-terminal-mobile-bar",style:C?{bottom:`${Z}px`}:void 0,children:[e.jsxs("div",{className:"cli-session-terminal__key-row","data-testid":"cli-terminal-key-bar",children:[e.jsx("button",{type:"button",className:`cli-terminal-key cli-terminal-key--ctrl${S?" cli-terminal-key--active":""}`,"data-testid":"cli-key-ctrl","aria-label":s("cliTerminal.mobileKeyCtrl","Sticky Ctrl modifier"),"aria-pressed":S,onPointerDown:o,onMouseDown:o,onClick:()=>T(t=>!t),children:"Ctrl"}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-esc","aria-label":s("cliTerminal.mobileKeyEsc","Send Escape"),onPointerDown:o,onMouseDown:o,onClick:()=>x(he),children:"Esc"}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-tab","aria-label":s("cliTerminal.mobileKeyTab","Send Tab"),onPointerDown:o,onMouseDown:o,onClick:()=>x(_e),children:"Tab"}),e.jsx("button",{type:"button",className:"cli-terminal-key cli-terminal-key--ctrlc","data-testid":"cli-key-ctrl-c","aria-label":s("cliTerminal.mobileKeyCtrlC","Send Ctrl-C"),onPointerDown:o,onMouseDown:o,onClick:()=>{T(!1),b(we)},children:"^C"}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-up","aria-label":s("cliTerminal.mobileKeyArrowUp","Cursor up"),onPointerDown:o,onMouseDown:o,onClick:()=>x(ke),children:"↑"}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-down","aria-label":s("cliTerminal.mobileKeyArrowDown","Cursor down"),onPointerDown:o,onMouseDown:o,onClick:()=>x(Se),children:"↓"}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-left","aria-label":s("cliTerminal.mobileKeyArrowLeft","Cursor left"),onPointerDown:o,onMouseDown:o,onClick:()=>x(ve),children:"←"}),e.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-right","aria-label":s("cliTerminal.mobileKeyArrowRight","Cursor right"),onPointerDown:o,onMouseDown:o,onClick:()=>x(xe),children:"→"})]}),e.jsxs("form",{className:"cli-session-terminal__input-row",onSubmit:Q,children:[e.jsx("input",{ref:q,type:"text",className:"cli-session-terminal__mobile-input","data-testid":"cli-terminal-mobile-input",value:y,placeholder:s("cliTerminal.mobileInputPlaceholder","Type to send to the session…"),autoCapitalize:"off",autoCorrect:"off",autoComplete:"off",spellCheck:!1,onChange:t=>X(t.target.value)}),e.jsx("button",{type:"submit",className:"cli-session-terminal__mobile-send","data-testid":"cli-terminal-mobile-send","aria-label":s("cliTerminal.mobileSend","Send"),onPointerDown:o,onMouseDown:o,onClick:()=>Q(),children:s("cliTerminal.mobileSend","Send")})]})]})]})}export{Pe as SessionTerminal};
|