@runfusion/fusion 0.74.0-beta.3 → 0.74.0-beta.4
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 +4663 -2605
- package/dist/child-process-worker.js +3149 -1448
- package/dist/client/.vite/manifest.json +265 -265
- package/dist/client/assets/AgentDetailView-BGXTnuBR.js +13 -0
- package/dist/client/assets/AgentDetailView-CH11Ydji.css +1 -0
- package/dist/client/assets/{AgentPermissionPolicyEditor-BBAwprvO.js → AgentPermissionPolicyEditor-DswM202p.js} +1 -1
- package/dist/client/assets/AgentsView-CEpZDrmC.js +24 -0
- package/dist/client/assets/{ChatView-CRoW2tRJ.js → ChatView-BXXX0q6G.js} +3 -3
- package/dist/client/assets/CommandCenter-CqjN1-9X.js +97 -0
- package/dist/client/assets/DevServerView-BUO7JRi6.js +1 -0
- package/dist/client/assets/{DirectoryPicker-B-olNAvT.js → DirectoryPicker-CiP4h5C7.js} +1 -1
- package/dist/client/assets/{DocumentsView-CG_-pnXU.js → DocumentsView-DwLD0h2S.js} +1 -1
- package/dist/client/assets/EvalsView-C9juKffD.js +1 -0
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-z8m5V5yv.js → ExperimentalAgentOnboardingModal-DYvw9TEh.js} +1 -1
- package/dist/client/assets/{GoalsView-Bd-4g949.js → GoalsView-BD1AkfVN.js} +1 -1
- package/dist/client/assets/{InsightsView-tCgg66wJ.js → InsightsView-Q0mu759R.js} +1 -1
- package/dist/client/assets/{MemoryView-Dqgsd_0E.js → MemoryView-DCTqPpCG.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-GzGoWgb5.js → PiExtensionsManager-CSe_uGfa.js} +1 -1
- package/dist/client/assets/{PluginManager-BWdqEqr9.js → PluginManager-DPm8YQC0.js} +1 -1
- package/dist/client/assets/{PullRequestView-CQq1G1kY.js → PullRequestView-BpJgNDLH.js} +2 -2
- package/dist/client/assets/{ReportModal-C-3rBFhw.js → ReportModal-iGmTZqiF.js} +1 -1
- package/dist/client/assets/ResearchView-BfgKB-6z.js +2 -0
- package/dist/client/assets/{SecretsView-C6RP9Rkw.js → SecretsView-CqvQLK7z.js} +1 -1
- package/dist/client/assets/SessionTerminal-A9di8GAo.js +2 -0
- package/dist/client/assets/SettingsModal-BsCUsAXe.js +21 -0
- package/dist/client/assets/{SettingsModal-D3DCvCfP.js → SettingsModal-D-iyPGZE.js} +1 -1
- package/dist/client/assets/SettingsModal-DmfMotcd.css +1 -0
- package/dist/client/assets/{SettingsTextareaRow-zBVXQbcC.js → SettingsTextareaRow-DwgHxMMY.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-C9r1dd-h.js → SetupWizardModal-CrSnLN44.js} +2 -2
- package/dist/client/assets/{SkillsView-DFyUBWd8.js → SkillsView-C_STy7KI.js} +1 -1
- package/dist/client/assets/{TodoView-BC8f952m.js → TodoView-BJJNGNLq.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-UTX757WH.js → WorkflowNodeEditor-Jp5i_Vxu.js} +3 -3
- package/dist/client/assets/{WorkflowNodeEditor-nCx4nqoL.css → WorkflowNodeEditor-sZ96V3Kd.css} +1 -1
- package/dist/client/assets/{agent-import-generation-DN0q1xEo.js → agent-import-generation-DbVrl8ou.js} +1 -1
- package/dist/client/assets/{app-sLOwmHAE.js → app-BYs5Cx-j.js} +1 -1
- package/dist/client/assets/{app-niWDkeV8.js → app-CTV8PCYh.js} +1 -1
- package/dist/client/assets/{app-BP57l_5h.js → app-CwdZxrJI.js} +1 -1
- package/dist/client/assets/{app-D4frL0Ka.js → app-DE-MPJxA.js} +1 -1
- package/dist/client/assets/{app-zPyey_fg.js → app-e8c4wb5t.js} +1 -1
- package/dist/client/assets/{app-vRWwM-aD.js → app-yKugq_Ld.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-D-nqJ95-.js → architectureDiagram-3BPJPVTR-Ctz8GX1N.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM--OlkXlyS.js → blockDiagram-GPEHLZMM-WI_YPphw.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-CH7PaWgs.js → c4Diagram-AAUBKEIU-BLwS5Zfh.js} +1 -1
- package/dist/client/assets/channel-CMMrQrQu.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-CpHDwqg2.js → chunk-2J33WTMH-DeXlX12-.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-BdW4tdnc.js → chunk-4BX2VUAB-zvCEraJR.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-b3tBFiuH.js → chunk-55IACEB6-BgZq96DR.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-DifknEtv.js → chunk-727SXJPM-CayoVGXL.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-DHIZNZ4Z.js → chunk-AQP2D5EJ-BmaktpVP.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-BLRLYW2y.js → chunk-FMBD7UC4-qYWgZPF8.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-Dh8f06Ld.js → chunk-ND2GUHAM-DIovauCc.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-CpzUiemt.js → chunk-QZHKN3VN-DXWnr9LE.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-CqxyehbN.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CqxyehbN.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-CE2RJ_k0.js → cose-bilkent-S5V4N54A-Dee9mTjK.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-CCs_xlYw.js → dagre-BM42HDAG-CU-v2zoi.js} +1 -1
- package/dist/client/assets/{dashboard-view-Z6H-k0uR.js → dashboard-view-BM790i02.js} +1 -1
- package/dist/client/assets/{dashboard-view-Eg7Jyvnm.js → dashboard-view-CG4rzThC.js} +1 -1
- package/dist/client/assets/{dashboard-view-D5qv61fP.js → dashboard-view-COary9sK.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-CF60Q-de.js → diagram-2AECGRRQ-DIqdnJ5B.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-DDcGMlua.js → diagram-5GNKFQAL-ChpdUlpb.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-YgvJ4DQf.js → diagram-KO2AKTUF-BxmzOp-c.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-Bi-j9nGw.js → diagram-LMA3HP47-DLEx-0rl.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-DEmMqnwc.js → diagram-OG6HWLK6-DEpkJ3cG.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-DwmZwhiW.js → erDiagram-TEJ5UH35-C3Rjr78a.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-B5ITa_HJ.js → flowDiagram-I6XJVG4X-aPbBbeiH.js} +1 -1
- package/dist/client/assets/{folder-open-BVxA7YtM.js → folder-open-BnNbfyzc.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-BgAPwh9w.js → ganttDiagram-6RSMTGT7-BEzAwvJ4.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DTtGzZFj.js → gitGraphDiagram-PVQCEYII-Y4hB2swQ.js} +1 -1
- package/dist/client/assets/index-8wtfjIkg.js +2675 -0
- package/dist/client/assets/index-Bp3UBLOz.css +1 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-CkSnTje1.js → infoDiagram-5YYISTIA-pd3J7fRT.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-jn5VNpMh.js → ishikawaDiagram-YF4QCWOH-B968vfOH.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-BpaqoXaI.js → journeyDiagram-JHISSGLW-V4crhYKX.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-CpfjJoBN.js → kanban-definition-UN3LZRKU-Cl8LxR6k.js} +1 -1
- package/dist/client/assets/{mermaid.core-DZNGPQzF.js → mermaid.core-rb_bKdHH.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-BdbX1EJa.js → mindmap-definition-RKZ34NQL-Cnu-LPHz.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-Xn0322tJ.js → pieDiagram-4H26LBE5-C6hPYepr.js} +1 -1
- package/dist/client/assets/{puzzle-CPx1RP2g.js → puzzle-C8AvcmuM.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-OOHqqw5y.js → quadrantDiagram-W4KKPZXB-CUImgAi-.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-Dvj6zvaB.js → requirementDiagram-4Y6WPE33-DzDLxIYz.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-DEkEqthK.js → sankeyDiagram-5OEKKPKP-DSr_oIy8.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BPc9ncPj.js → sequenceDiagram-3UESZ5HK-DO2E98Hv.js} +1 -1
- package/dist/client/assets/{shield-alert-baoKRyU6.js → shield-alert-Byjz1VmT.js} +1 -1
- package/dist/client/assets/{standing-instructions-template-CkqsGC1L.js → standing-instructions-template-Cf9fZ8bv.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-DywhjHIx.js → stateDiagram-AJRCARHV-BYPlDS4u.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-D7t7x4uT.js → stateDiagram-v2-BHNVJYJU-Ce_6vh1Q.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-BH3CKgrg.js → timeline-definition-PNZ67QCA-CG1FeaKV.js} +1 -1
- package/dist/client/assets/{upload-DtIvOGwM.js → upload-yPsE_DRN.js} +1 -1
- package/dist/client/assets/{users-DcxsxPlj.js → users-C_YmWx9d.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-CCDllBgJ.js → vennDiagram-CIIHVFJN-JLUXqFyb.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-C43hFLXh.js → wardley-L42UT6IY-D_UBzrZ2.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-__f9rI8w.js → wardleyDiagram-YWT4CUSO-BzwMrdpL.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-DY-fpQ_x.js → xychartDiagram-2RQKCTM6-C5TjbAcZ.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/sw.js +633 -13
- package/dist/client/version.json +1 -1
- package/dist/extension.js +3490 -1682
- package/package.json +1 -1
- package/dist/client/assets/AgentDetailView-CoeSgMXS.css +0 -1
- package/dist/client/assets/AgentDetailView-D0J_GDct.js +0 -13
- package/dist/client/assets/AgentsView-DTY5DIav.js +0 -24
- package/dist/client/assets/CommandCenter-BieyKvKb.js +0 -97
- package/dist/client/assets/DevServerView-CLR1LmhK.js +0 -1
- package/dist/client/assets/EvalsView-Xp0zCUlr.js +0 -1
- package/dist/client/assets/ResearchView-CS1HwDg_.js +0 -2
- package/dist/client/assets/SessionTerminal-C9nCSefk.js +0 -2
- package/dist/client/assets/SettingsModal-C1oEklYy.css +0 -1
- package/dist/client/assets/SettingsModal-D4mjT8hw.js +0 -21
- package/dist/client/assets/channel-FJNMzlkv.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-BOenhjVP.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BOenhjVP.js +0 -1
- package/dist/client/assets/index-Dv-95s50.css +0 -1
- package/dist/client/assets/index-idkERMsE.js +0 -2671
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as a,j as r}from"./vendor-react-SZ_qB27O.js";import{a as $,w as O,cX as tr,bc as sr,cN as ie,L as pe,aH as _r,cY as Ar,cZ as Tr,c_ as Or,C as Fr,aZ as nr,c$ as $r,V as zr,d0 as Hr,c2 as Ir,c4 as Br,d1 as Vr,p as He,X as Wr,aQ as qr,R as Xr}from"./index-idkERMsE.js";import{u as fe}from"./vendor-i18n-GF3RlKbq.js";import{S as ar}from"./shield-alert-baoKRyU6.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";function Ie(e){const s=typeof e.source=="string"&&e.source.trim().length>0?e.source.trim():"root",n=s==="root"?".":s,t=e.name,v=typeof e.packagePath=="string"&&e.packagePath.trim().length>0?e.packagePath.trim():n,d=typeof e.confidence=="number"?e.confidence:1,b=s==="root"?"root":s,m=typeof e.packageName=="string"&&e.packageName.trim().length>0?e.packageName.trim():"project";return{name:e.name,command:e.command,scriptName:t,packagePath:v,confidence:d,cwd:n,source:s,workspaceName:typeof e.packageName=="string"?e.packageName:void 0,label:`${m} · ${t} (${b})`}}function te(e){const s=e.status,n=s==="starting"||s==="running"||s==="failed"||s==="stopped"?s:"stopped",t=typeof e.previewUrl=="string"?e.previewUrl:e.detectedUrl,v=typeof e.manualPreviewUrl=="string"?e.manualPreviewUrl:e.manualUrl;return{id:typeof e.id=="string"?e.id:"",name:typeof e.name=="string"&&e.name.length>0?e.name:"default",status:n,command:typeof e.command=="string"?e.command:"",scriptName:typeof e.scriptId=="string"?e.scriptId:"",cwd:typeof e.cwd=="string"?e.cwd:"",pid:e.pid,startedAt:e.startedAt,previewUrl:t,detectedUrl:typeof e.detectedUrl=="string"?e.detectedUrl:t,detectedPort:e.detectedPort,manualPreviewUrl:v,manualUrl:typeof e.manualUrl=="string"?e.manualUrl:v,logs:Array.isArray(e.logHistory)?e.logHistory:[],exitCode:e.exitCode}}function Jr(e,s){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:s,text:typeof e.text=="string"?e.text:typeof e.line=="string"?e.line:"",stream:e.stream==="stderr"?"stderr":"stdout",timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function Kr(e){const n=(Array.isArray(e.lines)?e.lines:[]).map((t,v)=>Jr(t,v+1));return{lines:n,totalLines:typeof e.totalLines=="number"&&Number.isFinite(e.totalLines)?e.totalLines:n.length}}function Yr(e,s){const n=typeof s.maxLines=="number"&&Number.isFinite(s.maxLines)?Math.max(1,Math.floor(s.maxLines)):100,t=typeof s.offset=="number"&&Number.isFinite(s.offset)?Math.max(0,Math.floor(s.offset)):0,v=typeof s.lastEventId=="number"&&Number.isFinite(s.lastEventId)?Math.max(0,Math.floor(s.lastEventId)):null,d=e.length,b=e.map((N,z)=>({id:z+1,text:N,stream:"stdout",timestamp:""}));if(v!==null)return{lines:b.filter(N=>N.id>v).slice(0,n),totalLines:d};const m=Math.max(d-t,0),k=Math.max(m-n,0);return{lines:b.slice(k,m),totalLines:d}}function Be(e){return Array.isArray(e)?e.map(Ie):(e.candidates??[]).map(Ie)}async function ir(e){try{const s=await $(O("/dev-server/candidates",e));return Be(s)}catch(s){if(s instanceof Error&&/\/dev-server\/candidates/.test(s.message)){const n=await $(O("/dev-server/detect",e));return Be(n)}throw s}}function he(e){return $(O("/dev-server/status",e)).then(te)}async function Ne(e={},s){const n=new URLSearchParams;typeof e.maxLines=="number"&&Number.isFinite(e.maxLines)&&n.set("maxLines",String(Math.max(1,Math.floor(e.maxLines)))),typeof e.offset=="number"&&Number.isFinite(e.offset)&&n.set("offset",String(Math.max(0,Math.floor(e.offset)))),typeof e.lastEventId=="number"&&Number.isFinite(e.lastEventId)&&n.set("lastEventId",String(Math.max(0,Math.floor(e.lastEventId))));const t=n.size>0?`?${n.toString()}`:"";try{const v=await $(O(`/dev-server/logs/history${t}`,s));return Kr(v)}catch(v){if(v instanceof Error&&/\/dev-server\/logs\/history/.test(v.message)){const d=await he(s);return Yr(d.logs,e)}throw v}}function or(e,s){const n=e.cwd??e.packagePath??".",t=e.scriptName;return $(O("/dev-server/start",s),{method:"POST",body:JSON.stringify({command:e.command,scriptName:t,scriptId:t,cwd:n,packagePath:e.packagePath})}).then(te)}function lr(e){return $(O("/dev-server/stop",e),{method:"POST"}).then(te)}function cr(e){return $(O("/dev-server/restart",e),{method:"POST"}).then(te)}async function dr(e,s){const n=typeof e=="string"?{url:e}:e;try{const t=await $(O("/dev-server/preview-url",s),{method:"POST",body:JSON.stringify(n)});return te(t)}catch(t){if(t instanceof Error&&/\/dev-server\/preview-url/.test(t.message)){const v=await $(O("/dev-server/preview-url",s),{method:"PUT",body:JSON.stringify(n)});return te(v)}throw t}}function Re(e){return tr(O("/dev-server/logs/stream",e))}async function Ue(e){try{return(await $(O("/devserver",e))).sessions??[]}catch{try{const s=await he(e);return[{config:{id:s.id??"default",name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}]}catch{return[]}}}async function vr(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}`,s))}catch{try{const n=await he(s);return!e||e==="default"||e===n.id?{config:{id:n.id??"default",name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}:null}catch{return null}}}async function Ve(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/start`,s),{method:"POST"})}catch{const n=await or({command:""},s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function We(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/stop`,s),{method:"POST"})}catch{const n=await lr(s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function qe(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/restart`,s),{method:"POST"})}catch{const n=await cr(s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function Xe(e,s,n){try{const t=await $(O(`/devserver/${encodeURIComponent(e)}/preview`,n),{method:"POST",body:JSON.stringify({url:s})});return{url:t.url??null,source:t.source??null}}catch{const t=await dr({url:s},n);return{url:t.previewUrl??t.manualUrl??null,source:"manual"}}}async function ke(e){try{return(await $(O("/devserver/detect",e))).candidates??[]}catch{try{return(await ir(e)).map(n=>({name:n.name,command:n.command,cwd:n.cwd,scriptName:n.scriptName,packagePath:n.packagePath}))}catch{return[]}}}function Gr(e,s){return tr(O(`/devserver/${encodeURIComponent(e)}/logs/stream`,s))}const De=500,Qr=3e3;function q(e){return e instanceof Error?e.message:String(e)}function ur(e){return e.length<=De?e:e.slice(-De)}function Ce(e,s){return ur([...e,s])}function re(e){try{return JSON.parse(e)}catch{return null}}function ve(e){const s=e.text??"";return e.stream==="stderr"?`[stderr] ${s}`:s}function Zr(e){return e?.previewUrl??null}async function Je(e){return he(e)}async function Ke(e,s){return or(e,s)}async function et(e){return lr(e)}async function rt(e){return cr(e)}async function Ye(e){return ir(e)}function K(e){try{return e()}catch{return null}}function je(){return typeof K(()=>Ue)=="function"&&typeof K(()=>vr)=="function"}function Z(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(s=>({timestamp:new Date().toISOString(),stream:s.startsWith("[stderr]")?"stderr":"stdout",text:s.replace(/^\[stderr\]\s*/,"")}))}}function tt(e){const{t:s}=fe("app"),[n,t]=a.useState(null),[v,d]=a.useState([]),[b,m]=a.useState([]),[k,N]=a.useState([]),[z,E]=a.useState(!0),[j,h]=a.useState(null),c=a.useRef(0),[p,D]=a.useState(null),F=a.useCallback(o=>{if(t(o),o?.logHistory){const i=o.logHistory.slice(-De).map(ve);m(i)}},[]),L=a.useCallback(async()=>{const o=c.current;try{if(je())if(p){const i=await vr(p,e);if(c.current!==o)return;F(i)}else{const i=await Ue(e);if(c.current!==o)return;d(i),i.length>0&&(D(i[0].config.id),F(i[0]))}else{const i=await Je(e);if(c.current!==o)return;const g=Z(i);d([g]),F(g)}h(null)}catch(i){if(c.current!==o)return;h(q(i))}},[F,e,p]);a.useEffect(()=>{c.current+=1;const o=c.current;t(null),d([]),m([]),N([]),E(!0),h(null),D(null),(async()=>{try{const[g,u]=await Promise.allSettled([je()?Ue(e):Je(e).then(y=>[Z(y)]),typeof K(()=>ke)=="function"?ke(e):Ye(e).then(y=>y.map(U=>({name:U.name,command:U.command,cwd:U.cwd,scriptName:U.scriptName,packagePath:U.packagePath})))]);if(c.current!==o)return;let w=null;if(g.status==="fulfilled"){const y=g.value;if(d(y),y.length>0){const U=y[0];je()&&D(U.config.id),F(U)}}else w=q(g.reason);u.status==="fulfilled"&&N(u.value),w&&h(w)}catch(g){if(c.current!==o)return;h(q(g))}finally{c.current===o&&E(!1)}})()},[F,e]),a.useEffect(()=>{const o=p?Gr(p,e):typeof K(()=>Re)=="function"?Re(e):null;if(!o)return;const i=c.current,g=sr(o,{events:{history:u=>{if(c.current!==i)return;const w=re(u.data);if(w?.lines){const y=w.lines.map(ve);m(ur(y))}},log:u=>{if(c.current!==i)return;const w=re(u.data);if(w){const y=typeof w.line=="string"?w.line:ve(w);m(U=>Ce(U,y))}},"dev-server:log":u=>{if(c.current!==i)return;const w=re(u.data);if(w){const y=typeof w.line=="string"?w.line:ve(w);m(U=>Ce(U,y))}},"dev-server:output":u=>{if(c.current!==i)return;const w=re(u.data);w?.line&&m(y=>Ce(y,w.line))},status:u=>{if(c.current!==i)return;const w=re(u.data),y=w?.status;y&&t(U=>U&&{...U,status:y,runtime:w.pid?{...U.runtime??{startedAt:new Date().toISOString()},pid:w.pid}:U.runtime})},"dev-server:status":u=>{if(c.current!==i)return;const w=re(u.data);if(w?.status){const y=Z(w);t(y),d([y])}},stopped:()=>{c.current},failed:()=>{c.current}},onReconnect:()=>{c.current===i&&L()},onError:()=>{c.current===i&&h(u=>u??s("devserver.lostConnection","Lost log stream connection."))}});return()=>{g()}},[e,L,p]),a.useEffect(()=>{if(n?.status!=="running"&&n?.status!=="starting")return;const o=setInterval(()=>{L()},Qr);return()=>{clearInterval(o)}},[L,n?.status]);const _=a.useCallback(async(o,i)=>{c.current+=1;const g=c.current;try{let u;const w=typeof i=="string"&&i.length>0,y=n?.config?.cwd??".";if(!(w&&i!==y)&&p&&typeof K(()=>Ve)=="function")u=await Ve(p,e);else{const W=await Ke({command:o,cwd:i},e);u=Z(W)}if(c.current!==g)return;t(u),h(null)}catch(u){if(c.current!==g)return;throw h(q(u)),u}},[e,n?.config?.cwd,p]),R=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;if(p&&typeof K(()=>We)=="function")i=await We(p,e);else{const g=await et(e);i=Z(g)}if(c.current!==o)return;t(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e,p]),I=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;if(p&&typeof K(()=>qe)=="function")i=await qe(p,e);else{const g=await rt(e);i=Z(g)}if(c.current!==o)return;t(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e,p]),B=a.useCallback(async o=>{c.current+=1;const i=c.current;try{let g;if(p&&typeof K(()=>Xe)=="function")g=await Xe(p,o,e);else{const u=await dr({url:o},e);g={url:u.manualUrl??u.previewUrl??u.detectedUrl??null,source:u.manualUrl?"manual":"auto"}}if(c.current!==i)return;t(u=>u?{...u,previewUrl:g.url??void 0}:null),h(null)}catch(g){if(c.current!==i)return;throw h(q(g)),g}},[e,p]),H=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;try{i=await ke(e)}catch{i=(await Ye(e)).map(u=>({name:u.name,command:u.command,cwd:u.cwd,scriptName:u.scriptName,packagePath:u.packagePath}))}if(c.current!==o)return;N(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e]),P=a.useCallback(async(o,i)=>{if(typeof o!="string"&&!p)try{const w=o,y=await Ke({command:w.command,cwd:w.cwd,scriptName:w.scriptName,packagePath:w.packagePath??w.cwd},e),U=Z(y);t(U),d([U]),h(null);return}catch(w){throw h(q(w)),w}const g=typeof o=="string"?o:o.command,u=typeof o=="string"?i:o.cwd;await _(g,u)},[e,_,p]),x=a.useCallback(async()=>{await R()},[R]),f=a.useCallback(async()=>{await I()},[I]),A=a.useCallback(async o=>{await B(o)},[B]),T=a.useCallback(async()=>{await H()},[H]),X=a.useCallback(async()=>{await L()},[L]),C=Zr(n),S=n?{...n,pid:n.runtime?.pid}:null;return{session:n,sessions:v,logs:b,detectedCommands:k,previewUrl:C,isLoading:z,error:j,startServer:_,stopServer:R,restartServer:I,setPreviewUrl:B,detectCommands:H,refresh:L,candidates:k,serverState:S,loading:z,start:P,stop:x,restart:f,setManualUrl:A,detect:T,refreshStatus:X}}const Ge=500,Qe=100;function mr(e){return e.length>Ge?e.slice(-Ge):e}function pr(e){return e==="stderr"?"stderr":"stdout"}function ue(e){try{return JSON.parse(e.data)}catch{return null}}function me(e,s){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:s,text:typeof e.text=="string"?e.text:"",stream:pr(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function st(e,s){return{id:s,text:e,stream:"stdout",timestamp:""}}function Ee(e,s){if(s.length===0)return e;const n=[...e],t=new Set(e.map(v=>v.id));for(const v of s)t.has(v.id)||(t.add(v.id),n.push(v));return n.sort((v,d)=>v.id-d.id),mr(n)}function nt(e,s){const[n,t]=a.useState([]),[v,d]=a.useState(!1),[b,m]=a.useState(!1),[k,N]=a.useState(!1),[z,E]=a.useState(null),j=a.useRef(null),h=a.useRef(!1),c=a.useRef(0),p=a.useRef(0),D=a.useRef(e),F=a.useRef(s),L=a.useRef(0),_=a.useRef(1);(D.current!==e||F.current!==s)&&(D.current=e,F.current=s,c.current++,ie({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),h.current=!0,L.current=0,_.current=1,t([]),d(!1),m(!1),N(!1),E(null),j.current&&(j.current(),j.current=null)),a.useEffect(()=>{if(!s){j.current&&(j.current(),j.current=null);return}const P=c.current,x=++p.current;h.current=!1,d(!0);const f=(C,S)=>{const o=mr(C);t(o),E(S),N(S!==null?S>o.length:!1);const i=o.length>0?o[o.length-1].id:0;L.current=i,_.current=i+1},A=C=>{if(h.current||c.current!==P||!C||typeof C!="object")return;const S=C.lines;if(!Array.isArray(S))return;if(S.length>0&&typeof S[0]=="string"){const i=S.filter(g=>typeof g=="string").map((g,u)=>st(g,u+1));f(i,i.length);return}const o=S.filter(i=>!!i&&typeof i=="object").map((i,g)=>me(i,g+1));f(o,o.length)},T=C=>{if(h.current||c.current!==P)return;const S=typeof C.text=="string"?C.text:typeof C.line=="string"?C.line:null;if(!S)return;const o=_.current,i=typeof C.id=="number"&&Number.isFinite(C.id)?C.id:o,g={id:i,text:S,stream:pr(C.stream),timestamp:typeof C.timestamp=="string"?C.timestamp:""};L.current=Math.max(L.current,i),_.current=Math.max(_.current,i+1),t(u=>Ee(u,[g])),E(u=>u===null?u:Math.max(u+1,g.id))};async function X(){try{const S=await Ne({maxLines:Qe},e);if(h.current||c.current!==P||p.current!==x)return;const o=S.lines.map((i,g)=>me(i,g+1));f(o,S.totalLines)}catch{if(h.current||c.current!==P||p.current!==x)return;f([],null)}finally{!h.current&&c.current===P&&p.current===x&&d(!1)}const C=Re(e);j.current=sr(C,{events:{"dev-server:log":S=>{const o=ue(S);o&&T(o)},log:S=>{const o=ue(S);o&&T(o)},history:S=>{const o=ue(S);A(o)},"dev-server:history":S=>{const o=ue(S);A(o)}},onReconnect:()=>{ie({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:L.current??null,sseChannel:C,reason:"history-replay"}),!(h.current||c.current!==P)&&Ne({lastEventId:L.current,maxLines:50},e).then(S=>{if(h.current||c.current!==P)return;const o=S.lines.map((i,g)=>me(i,_.current+g));if(o.length>0){const i=o[o.length-1].id;L.current=Math.max(L.current,i),_.current=Math.max(_.current,i+1)}t(i=>Ee(i,o)),E(S.totalLines)}).catch(()=>{})}}),ie({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:C})}return X(),()=>{h.current=!0,j.current&&(j.current(),j.current=null)}},[s,e]);const I=a.useCallback(async()=>{if(!s||b)return;const P=c.current,x=n.length;m(!0);try{const f=await Ne({maxLines:Qe,offset:x},e);if(h.current||c.current!==P)return;const A=f.lines.map((T,X)=>me(T,X+1));t(T=>Ee(A,T)),N(f.totalLines>x+A.length),E(f.totalLines)}catch{}finally{m(!1)}},[s,n.length,b,e]),B=a.useCallback(()=>{t([])},[]),H=j.current!==null&&!v&&!h.current;return{entries:n,loading:v,loadingMore:b,hasMore:k,total:z,loadMore:I,clear:B,logs:n,isStreaming:H,clearLogs:B}}const at="This preview appears to block iframe embedding. Open it in a new tab instead.",it="The preview URL could not be loaded. Verify the server is running and the URL is correct.",ot="Preview is taking longer than expected and may block iframe embedding.";function lt(e){return e==="blocked"?at:e==="error"?it:null}function ct(e,s={}){const{loadTimeoutMs:n=1e4,detectionMethod:t=null}=s,v=a.useRef(null),d=a.useRef(null),[b,m]=a.useState("unknown"),[k,N]=a.useState(null),[z]=a.useState(t),E=a.useCallback(()=>{d.current!==null&&(window.clearTimeout(d.current),d.current=null)},[]),j=a.useCallback(R=>{m(R),N(lt(R))},[]),h=a.useCallback(()=>{m("blocked"),N(ot)},[]);a.useEffect(()=>{if(E(),!e){m("unknown"),N(null);return}m("unknown"),N(null);let R=!1;return queueMicrotask(()=>{R||(m("loading"),N(null))}),()=>{R=!0,E()}},[E,e]),a.useEffect(()=>{if(b!=="loading"){E();return}const R=setTimeout(()=>{d.current=null,h()},n);return d.current=R,()=>{clearTimeout(R),d.current===R&&(d.current=null)}},[E,b,n,h]);const c=a.useCallback(()=>{const R=v.current;if(!R){j("embedded");return}try{if(R.contentWindow?.location?.href==="about:blank"&&R.src!=="about:blank"){j("blocked");return}}catch{}j("embedded")},[j]),p=a.useCallback(()=>{j("error")},[j]);a.useEffect(()=>{if(E(),!e){m("unknown"),N(null);return}m("unknown"),N(null)},[E]);const D=a.useCallback(()=>{E(),m("unknown"),N(null)},[E]),F=D,L=a.useMemo(()=>b==="embedded",[b]),_=a.useMemo(()=>b==="blocked"||b==="error",[b]);return{embedStatus:b,isEmbedded:L,isBlocked:_,blockReason:k,detectionMethod:z,iframeRef:v,resetEmbedStatus:D,setEmbedStatus:j,retry:F,embedContext:k,handleIframeLoad:c,handleIframeError:p}}const dt=/\x1b\[[0-9;]*m/g,vt=50;function ut(e){return e.scrollHeight-(e.scrollTop+e.clientHeight)<=vt}function Pe(e){return e.replace(dt,"")}function mt(e){if(!e)return"";const s=new Date(e);return Number.isNaN(s.getTime())?"":s.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function pt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ft(e){if(e.stream==="stderr")return"error";const s=Pe(e.text).toLowerCase();return/\b(warn|warning)\b/.test(s)?"warn":/\b(error|fatal)\b/.test(s)?"error":"info"}function ht(e,s){if(!s)return e;const n=new RegExp(`(${pt(s)})`,"ig"),t=e.split(n),v=s.toLowerCase();return r.jsx(r.Fragment,{children:t.map((d,b)=>d.toLowerCase()===v?r.jsx("mark",{children:d},`${d}-${b}`):r.jsx("span",{children:d},`${d}-${b}`))})}function gt({entries:e,loading:s,loadingMore:n,hasMore:t,total:v,onLoadMore:d,isRunning:b}){const{t:m}=fe("app"),k=a.useRef(null),N=a.useRef(e.length),z=a.useRef(b),[E,j]=a.useState(!1),[h,c]=a.useState(!1),p=a.useRef(!1),[D,F]=a.useState(""),[L,_]=a.useState("all"),R=a.useMemo(()=>L==="all"?e:e.filter(f=>ft(f)===L),[e,L]),I=a.useMemo(()=>{const f=D.trim().toLowerCase();return f?R.filter(A=>Pe(A.text).toLowerCase().includes(f)):R},[R,D]),B=I.length,H=a.useCallback(f=>{p.current=f,c(f)},[]),P=a.useCallback(()=>{const f=k.current;f&&(f.scrollTop=f.scrollHeight,H(!1))},[H]);a.useEffect(()=>{const f=z.current,A=N.current,T=e.length>A;b&&(!f||!h&&T)&&P(),z.current=b,N.current=e.length},[e.length,b,h,P]);const x=a.useCallback(()=>{const f=k.current;f&&H(!ut(f))},[H]);return a.useEffect(()=>{s||e.length===0||!h&&b&&P()},[e,b,h,s,P]),a.useEffect(()=>{const f=k.current;if(!f||!b||typeof MutationObserver>"u")return;const A=new MutationObserver(()=>{p.current||P()});return A.observe(f,{childList:!0,characterData:!0,subtree:!0}),()=>A.disconnect()},[b,P]),s&&e.length===0?r.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:r.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[r.jsx(pe,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:m("devserver.loadingLogs","Loading logs…")})]})}):r.jsxs("section",{className:`devserver-log-viewer${E?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[r.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[r.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[r.jsx("span",{className:"devserver-log-viewer__title",children:m("devserver.logs","Logs")}),r.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[v!==null?`${e.length}/${v}`:`${e.length}`," ",m("devserver.lines","lines")]})]}),r.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[r.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[r.jsx("span",{className:"visually-hidden",children:m("devserver.filterBySeverity","Filter logs by severity")}),r.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:L,onChange:f=>_(f.target.value),"data-testid":"devserver-log-severity-filter","aria-label":m("devserver.filterBySeverity","Filter logs by severity"),children:[r.jsx("option",{value:"all",children:m("devserver.allSeverities","All severities")}),r.jsx("option",{value:"info",children:m("devserver.info","Info")}),r.jsx("option",{value:"warn",children:m("devserver.warn","Warn")}),r.jsx("option",{value:"error",children:m("devserver.error","Error")})]})]}),r.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[r.jsx("span",{className:"visually-hidden",children:m("devserver.searchLogs","Search logs")}),r.jsx(_r,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:D,onChange:f=>F(f.target.value),placeholder:m("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":m("devserver.searchLogs","Search logs")})]}),D.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:m("devserver.matchCount",{count:B,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>j(f=>!f),"data-testid":"devserver-log-fullscreen-toggle","aria-label":E?m("devserver.exitFullscreen","Exit fullscreen logs"):m("devserver.enterFullscreen","Enter fullscreen logs"),children:E?r.jsx(Ar,{size:14}):r.jsx(Tr,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[t&&r.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:r.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:d,disabled:n,"data-testid":"devserver-log-load-more-button",children:n?r.jsxs(r.Fragment,{children:[r.jsx(pe,{size:14,className:"devserver-log-viewer__spinner"}),m("devserver.loadingOlderLogs","Loading older logs…")]}):m("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:k,className:"devserver-log-viewer__content",onScroll:x,"data-testid":"devserver-log-content",children:[!s&&I.length===0&&r.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?m("devserver.noLogsYet","No logs yet. Start the dev server to see output."):R.length===0?m("devserver.noMatchesSeverity","No log lines match the selected severity."):m("devserver.noMatchesSearch","No log lines match your search.")}),I.map(f=>{const A=Pe(f.text),T=mt(f.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[T&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:T}),f.stream==="stderr"&&r.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:m("devserver.errBadge","ERR")}),r.jsx("span",{className:"devserver-log-text",children:Or(ht(A,D.trim()))})]},f.id)})]}),h&&b&&r.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:P,"data-testid":"devserver-log-jump-button",children:[r.jsx(Fr,{size:14}),m("devserver.newLogs","New logs")]})]})]})}const wt="devserver-preview-iframe";function bt({url:e,embedStatus:s,onEmbedStatusChange:n,iframeRef:t,blockReason:v,onRetry:d,className:b=wt,embedContext:m}){const{t:k}=fe("app"),N=v??m??null,[z,E]=a.useState(0);a.useEffect(()=>{!e||s!=="unknown"||(E(p=>p+1),n("loading"))},[s,n,e]);const j=a.useCallback(()=>{const p=t.current;if(!p){n("embedded");return}try{if(p.contentWindow?.location?.href==="about:blank"&&p.src!=="about:blank"){n("blocked");return}}catch{}n("embedded")},[t,n]),h=a.useCallback(p=>{p.stopPropagation(),n("error")},[n]),c=a.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?r.jsxs("div",{className:"devserver-preview-iframe-shell",children:[r.jsx("iframe",{src:e,ref:t,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:b,title:"Dev server preview",onLoad:j,onError:h,onErrorCapture:h,"data-testid":"devserver-preview-iframe"},`${e}-${z}`),s==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(pe,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:k("preview.loading","Loading preview...")})]}),s==="blocked"&&r.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[r.jsx(ar,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:k("preview.blockedTitle","Preview cannot be embedded")}),N&&r.jsx("p",{className:"devserver-preview-blocked-context",children:N})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:k("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:c,children:k("preview.openInNewTab","Open in new tab")}),d&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:d,children:k("actions.retry","Retry")})]})]}),s==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(nr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:k("preview.errorTitle","Unable to load preview")}),N&&r.jsx("p",{className:"devserver-preview-blocked-context",children:N})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:k("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:c,children:k("preview.openInNewTab","Open in new tab")}),d&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:d,children:k("actions.retry","Retry")})]})]})]}):null}function xt(e){return{stopped:{className:"dev-server-status-badge--stopped",label:e("devserver.status.stopped","Stopped")},starting:{className:"dev-server-status-badge--starting",label:e("devserver.status.starting","Starting...")},running:{className:"dev-server-status-badge--running",label:e("devserver.status.running","Running")},stopping:{className:"dev-server-status-badge--starting",label:e("devserver.status.stopping","Stopping...")},failed:{className:"dev-server-status-badge--failed",label:e("devserver.status.failed","Failed")}}}const yt=480;function St(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(max-width: 768px)").matches}function fr(e){if(e.closest(".right-dock-expand-modal__body"))return null;const s=e.parentElement;return s?.classList.contains("right-dock__body")?s:null}function Nt(e){return e.clientWidth>0?e.clientWidth:e.getBoundingClientRect().width}function kt(e){if(!e||St())return!1;const s=fr(e);return s?Nt(s)<=yt:!1}function Ct(e){const[s,n]=a.useState(!1);return a.useEffect(()=>{const t=e.current;if(!t){n(!1);return}const v=fr(t),d=()=>n(kt(t));if(d(),!v||typeof ResizeObserver>"u")return window.addEventListener("resize",d),()=>window.removeEventListener("resize",d);const b=new ResizeObserver(d);return b.observe(v),window.addEventListener("resize",d),()=>{b.disconnect(),window.removeEventListener("resize",d)}},[e]),s}let Le=!1;function Ze(e){return e instanceof Error?e.message:String(e)}function hr(e){return e==="."?"root":e}function er(e){return e?e==="root"?".":e:null}function rr(e,s,n){return!s||e.scriptName!==s?!1:n?hr(e.cwd)===n:!0}function jt(e){return e.cwd==="."?"root":e.cwd}function Et(e){return e.length<=60?e:`${e.slice(0,60)}…`}function At({addToast:e,projectId:s,tasks:n}){const{t}=fe("app");a.useEffect(()=>(ie({view:"DevServerView",trigger:Le?"route-active":"remount",projectId:s,replayAttempted:!1}),Le=!1,()=>{Le=!0,ie({view:"DevServerView",trigger:"route-inactive",projectId:s,replayAttempted:!1})}),[s]);const{session:v,detectedCommands:d,previewUrl:b,isLoading:m,error:k,startServer:N,stopServer:z,restartServer:E,setPreviewUrl:j,detectCommands:h,refresh:c}=tt(s),p=v?.status??"stopped",D=p==="running"||p==="starting",F=xt(t),L=F[p]??F.stopped,{entries:_,loading:R,loadingMore:I,hasMore:B,total:H,loadMore:P}=nt(s,!!s),x=b,f=v?.config?.cwd??null,A=a.useRef(null),T=Ct(A),[X,C]=a.useState(!0),[S,o]=a.useState(""),[i,g]=a.useState(""),[u,w]=a.useState(null),[y,U]=a.useState(null),[W,Me]=a.useState(null),Y=a.useMemo(()=>(n??[]).filter(l=>l.column==="in-progress"&&typeof l.worktree=="string"&&l.worktree.length>0),[n]),J=a.useMemo(()=>Y.find(l=>l.id===y)??null,[Y,y]);a.useEffect(()=>{y&&!Y.some(l=>l.id===y)&&U(null)},[Y,y]);const[se,gr]=a.useState("embedded"),[ne,ge]=a.useState(!1),_e=a.useRef(null),we=a.useRef(null),wr=se==="embedded"?x:null,{embedStatus:V,setEmbedStatus:br,resetEmbedStatus:oe,iframeRef:ee,isEmbedded:xr,isBlocked:be,blockReason:xe,retry:Ae}=ct(wr),[Te,G]=a.useState(!1),Oe=a.useRef(V);a.useEffect(()=>{const l=Oe.current!==V;be&&l&&G(!0),V==="embedded"&&G(!1),Oe.current=V},[V,be]),a.useEffect(()=>{G(!1)},[x]);const le=a.useMemo(()=>{if(!u)return null;const l=er(f);return d.find(M=>!(M.scriptName!==u||l&&M.cwd!==l||v?.config?.command&&M.command!==v.config.command))??d.find(M=>rr(M,u,f))??null},[d,v?.config?.command,u,f]);a.useEffect(()=>{typeof h=="function"&&h().catch(l=>{e(Ze(l),"error")})},[e,h]),a.useEffect(()=>{if(u){C(!1);return}C(!0)},[u]),a.useEffect(()=>{if(v?.status==="running"||v?.status==="starting"){v.config?.command?.trim().length>0&&o(v.config.command);return}if(le){o(le.command);return}d.length>0&&o(l=>l.trim().length>0?l:d[0]?.command??"")},[d,le,v?.config?.command,v?.status]),a.useEffect(()=>{g(x??"")},[x]);const ce=a.useCallback(()=>{ge(!1),window.requestAnimationFrame(()=>_e.current?.focus())},[]),yr=$r(ce);a.useEffect(()=>{if(!ne)return;we.current?.focus();const l=M=>{if(M.key==="Escape"){ce();return}if(M.key!=="Tab")return;const ae=Array.from(we.current?.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')??[]).filter(ze=>!ze.hasAttribute("disabled")&&ze.getAttribute("aria-hidden")!=="true"),Q=ae[0],Se=ae.at(-1);!Q||!Se||(M.shiftKey&&document.activeElement===Q?(M.preventDefault(),Se.focus()):!M.shiftKey&&document.activeElement===Se&&(M.preventDefault(),Q.focus()))};return document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)},[ce,ne]),a.useEffect(()=>{!T&&ne&&ge(!1)},[T,ne]);const ye=a.useCallback(()=>{x&&window.open(x,"_blank","noopener,noreferrer")},[x]),Fe=a.useCallback(()=>{G(!1),Ae()},[Ae]),Sr=a.useCallback(()=>{try{const l=ee.current;if(l?.contentWindow){l.contentWindow.location.reload(),G(!1),oe();return}}catch{}if(!(!x||!ee.current))try{const l=new URL(x);l.searchParams.set("_t",Date.now().toString()),ee.current.src=l.toString(),G(!1),oe()}catch{ee.current.src=x,G(!1),oe()}},[x,ee,oe]),de=a.useCallback(async(l,M,ae)=>{Me(l);try{await M(),e(ae,"success")}catch(Q){e(Ze(Q),"error")}finally{Me(null)}},[e]),Nr=a.useCallback(l=>{w(l.scriptName),C(!1),o(l.command),e(t("devserver.toast.selectedScript","Selected {{name}} script.",{name:l.scriptName}),"success")},[e]),kr=a.useCallback(()=>{w(null),C(!0),e(t("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),Cr=a.useCallback(l=>{D&&l&&l!==y&&e(t("devserver.restartToApplyTask","Restart the dev server to apply the selected task's worktree."),"info"),U(l)},[e,D,y,t]),jr=()=>{const l=S.trim();if(l.length===0){e(t("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const M=er(f)??".",Q=J?.worktree??null??le?.cwd??M;de("start",()=>N(l,Q),t("devserver.toast.started","Dev server started."))},Er=()=>{de("stop",z,t("devserver.toast.stopped","Dev server stopped."))},Lr=()=>{de("restart",E,t("devserver.toast.restarted","Dev server restarted."))},Rr=()=>{const l=i.trim(),M=l.length>0?l:null;de("preview",()=>j(M),M?t("devserver.toast.previewUpdated","Preview URL updated."):t("devserver.toast.previewCleared","Preview URL override cleared."))},Ur=a.useCallback(()=>{k&&c()},[k,c]),Dr=p==="starting"||p==="running"||W!==null,Pr=p==="stopped"||W!==null,Mr=p==="stopped"||p==="starting"||W!==null,$e=()=>r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(He,{size:14}),r.jsx("span",{children:t("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:x??t("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[t("devserver.auto","Auto"),x?` · ${x}`:t("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>gr(l=>l==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:se==="embedded"?t("devserver.externalOnly","External only"):t("devserver.embedded","Embedded")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:t("devserver.openInNewTab","Open in new tab"),onClick:ye,disabled:!x,"data-testid":"devserver-preview-open-tab",children:r.jsx(qr,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:t("devserver.refreshPreview","Refresh preview"),onClick:Sr,disabled:!x,"data-testid":"devserver-preview-refresh",children:r.jsx(Xr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":V,"data-embedded":xr?"true":"false",children:[!x&&!D&&r.jsx("p",{className:"devserver-preview-empty",children:t("devserver.startDevServer","Start a dev server to see a live preview here.")}),!x&&D&&r.jsx("p",{className:"devserver-preview-empty",children:t("devserver.noPreviewDetected","No preview URL detected. Start the dev server or set a manual URL to preview your app.")}),x&&se==="external"&&r.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[r.jsx("p",{children:t("devserver.embeddedPreviewDisabled","Embedded preview is disabled. Open your app in a separate browser tab.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:ye,"data-testid":"devserver-preview-external-open-tab",children:t("devserver.openInNewTab","Open in new tab")})]}),x&&se==="embedded"&&Te&&be&&r.jsxs("div",{className:V==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[V==="error"?r.jsx(nr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):r.jsx(ar,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:V==="error"?t("devserver.previewFailed","Preview failed"):t("devserver.previewBlocked","Preview blocked")}),xe&&r.jsx("p",{className:"devserver-preview-blocked-context",children:xe})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:t("devserver.openPreviewOrRetry","Open the preview in a new tab, or retry embedded mode after checking your server settings.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:ye,"data-testid":"devserver-preview-fallback-open-tab",children:t("devserver.openPreviewInNewTab","Open preview in new tab")}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Fe,"data-testid":"devserver-preview-fallback-retry",children:t("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),x&&se==="embedded"&&!Te&&r.jsx(bt,{url:x,embedStatus:V,onEmbedStatusChange:br,iframeRef:ee,blockReason:xe,onRetry:Fe})]})]});return r.jsxs("div",{ref:A,className:"dev-server-view","data-testid":"dev-server-view","data-narrow-right-dock-preview":T?"true":"false",children:[r.jsx(zr,{icon:Hr,title:t("devserver.title","Dev Server"),actions:r.jsxs(r.Fragment,{children:[r.jsx("span",{className:"dev-server-header-title",children:r.jsx("span",{className:`dev-server-status-badge ${L.className}`,"data-testid":"dev-server-status-badge",children:L.label})}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:jr,disabled:Dr,"data-testid":"dev-server-start-button",children:[r.jsx(Ir,{size:14}),r.jsx("span",{children:W==="start"?t("devserver.starting","Starting..."):t("devserver.start","Start")})]}),r.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Er,disabled:Pr,"data-testid":"dev-server-stop-button",children:[r.jsx(Br,{size:14}),r.jsx("span",{children:W==="stop"?t("devserver.stopping","Stopping..."):t("devserver.stop","Stop")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Lr,disabled:Mr,"data-testid":"dev-server-restart-button",children:[r.jsx(Vr,{size:14}),r.jsx("span",{children:W==="restart"?t("devserver.restarting","Restarting..."):t("devserver.restart","Restart")})]})]})]})}),r.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":t("devserver.configurationLabel","Dev server configuration"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:t("devserver.configuration","Configuration")}),m&&r.jsx("span",{className:"dev-server-muted",children:t("devserver.loading","Loading...")})]}),m&&!v&&d.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(pe,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:t("devserver.loadingConfig","Loading dev server configuration...")})]}),k&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:k}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ur,children:t("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:t("devserver.scriptSelection","Script Selection")}),u&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:u}),r.jsx("span",{className:"dev-server-candidate-source",children:f??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>C(!0),"data-testid":"dev-server-change-selection",children:t("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:kr,"data-testid":"dev-server-clear-selection",children:t("devserver.clear","Clear")})]}),X&&d.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:t("devserver.noScriptsDetected","No dev server scripts detected. Check that your project has a package.json with a dev, start, or similar script.")}),X&&d.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:d.map(l=>{const M=rr(l,u,f);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${M?"dev-server-candidate--selected":""}`,onClick:()=>Nr(l),"data-testid":`dev-server-candidate-${l.scriptName}-${hr(l.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:l.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:Et(l.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:jt(l)})]},`${l.cwd}::${l.scriptName}::${l.command}`)})})]}),r.jsxs("div",{className:"dev-server-section dev-server-executing-task-section",children:[r.jsx("h3",{children:t("devserver.executingTask","Executing Task")}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-task-picker",className:"dev-server-label",children:t("devserver.executingTask","Executing Task")}),r.jsxs("select",{id:"dev-server-task-picker",className:"input dev-server-task-picker",value:y??"",onChange:l=>Cr(l.target.value.length>0?l.target.value:null),disabled:Y.length===0,"aria-label":t("devserver.executingTask","Executing Task"),"data-testid":"dev-server-task-picker",children:[r.jsx("option",{value:"",children:t("devserver.projectRootNoTask","Project root (no task)")}),Y.map(l=>r.jsx("option",{value:l.id,children:l.title?`${l.id} — ${l.title}`:l.id},l.id))]}),Y.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-no-executing-tasks",children:t("devserver.noExecutingTasks","No executing tasks with a worktree available. Start a task to target its worktree.")}),J&&r.jsxs("div",{className:"dev-server-task-descriptor","data-testid":"dev-server-task-descriptor",children:[r.jsx("div",{className:"dev-server-task-descriptor-header",children:r.jsx("span",{className:"dev-server-candidate-name",children:J.title?`${J.id} — ${J.title}`:J.id})}),r.jsx("p",{className:"dev-server-task-description",children:J.description}),r.jsxs("div",{className:"dev-server-task-worktree",children:[r.jsx("span",{className:"dev-server-label",children:t("devserver.targetWorktree","Target worktree")}),r.jsx("code",{children:J.worktree})]})]})]})]}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:t("devserver.command","Command")}),r.jsx("input",{id:"dev-server-command",className:"input",value:S,onChange:l=>o(l.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:p==="running"||p==="starting"})]}),(p==="running"||p==="starting")&&v&&r.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[r.jsx("span",{className:"dev-server-label",children:t("devserver.runningCommand","Running command")}),r.jsx("code",{children:v.config?.command??S})]}),r.jsxs("div",{className:"dev-server-preview-override",children:[r.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:t("devserver.previewUrlOverride","Preview URL Override")}),r.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:i,onChange:l=>g(l.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Rr,disabled:W==="preview","data-testid":"dev-server-set-preview",children:t("devserver.save","Save")})]}),x&&r.jsx("p",{className:"dev-server-preview-hint",children:t("devserver.autoDetected","Auto-detected: {{url}}",{url:x})})]}),r.jsx("div",{className:"dev-server-content",children:r.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":t("devserver.logsLabel","Dev server logs"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:t("devserver.logs","Logs")}),r.jsx("span",{className:"dev-server-muted",children:t("devserver.lines","{{count}} lines",{count:H??_.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(gt,{entries:_,loading:R,loadingMore:I,hasMore:B,total:H,onLoadMore:P,isRunning:D})})]})}),T?r.jsxs("section",{className:"dev-server-panel devserver-preview-modal-launcher","data-testid":"devserver-preview-modal-launcher","aria-label":t("devserver.previewLabel","Dev server preview"),children:[r.jsxs("div",{className:"devserver-preview-modal-launcher__copy",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(He,{size:14}),r.jsx("span",{children:t("devserver.preview","Preview")})]}),r.jsx("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:x??t("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:x||t("devserver.notAvailable","Not available")})]}),r.jsx("p",{className:"devserver-preview-modal-launcher__description",children:x?t("devserver.previewModalLauncherDescription","Open the live preview in a modal so logs and configuration stay usable in this narrow dock."):t("devserver.previewModalLauncherUnavailable","Start the dev server or set a preview URL to open the preview modal.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",ref:_e,onClick:()=>ge(!0),"data-testid":"devserver-preview-modal-open",children:t("devserver.openPreview","Open preview")})]}):r.jsx("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":t("devserver.previewLabel","Dev server preview"),children:$e()}),T&&ne&&r.jsx("div",{className:"modal-overlay open devserver-preview-modal-overlay",...yr,children:r.jsxs("div",{className:"modal devserver-preview-modal",role:"dialog","aria-modal":"true","aria-labelledby":"devserver-preview-modal-title",tabIndex:-1,ref:we,"data-testid":"devserver-preview-modal",children:[r.jsxs("div",{className:"devserver-preview-modal__titlebar",children:[r.jsx("h2",{id:"devserver-preview-modal-title",children:t("devserver.preview","Preview")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:ce,"aria-label":t("devserver.closePreviewModal","Close preview modal"),"data-testid":"devserver-preview-modal-close",children:r.jsx(Wr,{})})]}),r.jsx("div",{className:"devserver-preview-modal__body",children:$e()})]})})]})}export{At as DevServerView};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as l,j as e}from"./vendor-react-SZ_qB27O.js";import{ao as L,ap as P,aq as $,aS as G,aT as Q,au as O,aU as J,aV as Z,V as H,T as B,Y as ee,R as se,aI as ae,s as te,l as le,aQ as re}from"./index-idkERMsE.js";import{u as ne}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";const ie=300,ce=15e3;function K(r){if(!r.trim())return;const a=Number(r);return Number.isFinite(a)?a:void 0}function k(...r){for(const a of r)if(Array.isArray(a))return a;return[]}function p(r){return typeof r=="object"&&r!==null?r:{}}function X(r){const a=p(r),m=p(a.taskSnapshot);return{id:String(a.id??a.evalId??""),runId:String(a.runId??a.batchId??""),taskId:String(a.taskId??m.taskId??""),taskTitle:String(m.title??a.taskTitle??a.title??"Untitled task"),createdAt:String(a.createdAt??a.timestamp??a.updatedAt??new Date(0).toISOString()),overallScore:typeof a.overallScore=="number"?a.overallScore:null,maxScore:typeof a.maxScore=="number"?a.maxScore:null,categoryScores:k(a.categoryScores,p(a.scores).categories)}}function oe(r){const a=p(r);return{...X(a),rationale:String(a.rationale??a.summary??""),evidence:k(a.evidence,p(a.details).evidence),followUps:k(a.followUps,p(a.recommendations).followUps)}}function de(r){const a=r?.projectId,m=a??"",t=`${$.EVALS_RUNS_PREFIX}${m}`,h=`${$.EVALS_RESULTS_PREFIX}${m}`,f=L(t,{maxAgeMs:P}),v=L(h,{maxAgeMs:P}),S=l.useRef(Array.isArray(f)&&f.length>0||Array.isArray(v)&&v.length>0),[o,g]=l.useState({q:"",runId:"",scoreMin:"",scoreMax:""}),[b,w]=l.useState(()=>Array.isArray(f)?f:[]),[d,M]=l.useState(()=>Array.isArray(v)?v:[]),[u,R]=l.useState(null),[F,A]=l.useState(null),[s,c]=l.useState(0),[y,j]=l.useState(!S.current),[W,q]=l.useState(null),C=l.useRef(0),z=l.useRef(a),T=l.useRef(u);T.current=u;const I=l.useCallback(async()=>{const n=++C.current;S.current||j(!0),q(null);try{const[i,x]=await Promise.all([G({q:o.q||void 0,runId:o.runId||void 0,scoreMin:K(o.scoreMin),scoreMax:K(o.scoreMax),limit:100,offset:0},a),Q(a)]);if(n!==C.current)return;const E=k(i.results,i.evals,i.items).map(X);M(E),O(h,E.length>500?E.slice(0,500):E,{maxBytes:5e5}),c(typeof i.count=="number"?i.count:E.length);const V=k(x.runs,x.items).map(U=>{const N=p(U),D=p(N.counts);return{id:String(N.id??""),createdAt:String(N.createdAt??""),completedAt:typeof N.completedAt=="string"?N.completedAt:void 0,status:String(N.status??"pending"),evaluatedTaskCount:typeof D.totalTasks=="number"?D.totalTasks:0}});w(V),O(t,V,{maxBytes:5e5}),S.current=!0,T.current&&!E.some(U=>U.id===T.current)&&(R(null),A(null))}catch(i){if(n!==C.current)return;q(i instanceof Error?i.message:"Failed to load evals")}finally{n===C.current&&j(!1)}},[o.q,o.runId,o.scoreMax,o.scoreMin,a,h,t]),_=l.useCallback(async n=>{const i=await J(n,a),x=i.result??i;A(oe(x))},[a]);l.useEffect(()=>{if(z.current===a)return;z.current=a;const n=L(t,{maxAgeMs:P}),i=L(h,{maxAgeMs:P}),x=Array.isArray(n)&&n.length>0||Array.isArray(i)&&i.length>0;w(Array.isArray(n)?n:[]),M(Array.isArray(i)?i:[]),j(!x),S.current=x},[a,h,t]),l.useEffect(()=>{const n=window.setTimeout(()=>{I()},ie);return()=>window.clearTimeout(n)},[I]),l.useEffect(()=>{if(!u){A(null);return}_(u)},[_,u]),l.useEffect(()=>{const n=window.setInterval(()=>{I(),u&&_(u)},ce);return()=>window.clearInterval(n)},[_,I,u]);const Y=l.useCallback(n=>{T.current=n,R(n)},[]);return{loading:y,error:W,results:d,count:s,runs:b,filters:o,setFilters:g,refresh:I,selectedEvalId:u,setSelectedEvalId:Y,selectedEval:F}}function ge({projectId:r,onOpenSettings:a,onOpenTaskDetail:m}){const{t}=ne("app"),{loading:h,error:f,results:v,runs:S,filters:o,setFilters:g,selectedEvalId:b,setSelectedEvalId:w,selectedEval:d,refresh:M}=de({projectId:r}),[u,R]=l.useState(!0);l.useEffect(()=>{let s=!1;return Z(r).then(c=>{if(s)return;const y=c.evalSettings?.enabled;R(y??!1)}).catch(()=>{s||R(!1)}),()=>{s=!0}},[r]);const F=v.length>0,A=l.useMemo(()=>v.find(s=>s.id===b)??null,[v,b]);return u?e.jsxs("section",{className:"evals-view","data-testid":"evals-view",children:[e.jsx(H,{icon:B,title:t("evals.title","Evals")}),e.jsxs("div",{className:"evals-view__body",children:[e.jsxs("div",{className:"evals-list card",children:[e.jsxs("div",{className:"evals-toolbar",children:[e.jsx("input",{className:"input",placeholder:t("evals.searchPlaceholder","Search task or rationale"),value:o.q,onChange:s=>g(c=>({...c,q:s.target.value}))}),e.jsxs("select",{className:"select",value:o.runId,onChange:s=>g(c=>({...c,runId:s.target.value})),children:[e.jsx("option",{value:"",children:t("evals.allRuns","All runs")}),S.map(s=>e.jsx("option",{value:s.id,children:s.id},s.id))]}),e.jsx("input",{className:"input",placeholder:t("evals.minScorePlaceholder","Min score"),value:o.scoreMin,onChange:s=>g(c=>({...c,scoreMin:s.target.value}))}),e.jsx("input",{className:"input",placeholder:t("evals.maxScorePlaceholder","Max score"),value:o.scoreMax,onChange:s=>g(c=>({...c,scoreMax:s.target.value}))}),e.jsx("button",{className:"btn btn-icon",type:"button",onClick:()=>void M(),"aria-label":t("evals.refreshAria","Refresh evals"),children:e.jsx(se,{size:16})})]}),h&&e.jsx("p",{className:"evals-state","data-testid":"evals-loading",children:e.jsx(ae,{label:t("evals.loading","Loading evals…")})}),f&&e.jsx("p",{className:"evals-state evals-state--error",children:f}),!h&&!f&&!F&&e.jsx("p",{className:"evals-state",children:t("evals.empty","No evals yet. Scheduled evals review tasks completed since the last run.")}),e.jsx("ul",{className:"evals-results","data-testid":"evals-results",children:v.map(s=>e.jsx("li",{children:e.jsxs("button",{className:`evals-result ${s.id===b?"evals-result--active":""}`,type:"button",onClick:()=>w(s.id),draggable:le(),onDragStart:c=>{te(c.dataTransfer,{kind:"eval-result",id:s.id,projectId:r})},children:[e.jsx("span",{className:"evals-result-title",children:s.taskTitle}),e.jsxs("span",{className:"evals-result-meta",children:[s.taskId," · ",s.runId," · ",s.overallScore??t("evals.naPlaceholder","n/a")]})]})},s.id))})]}),e.jsxs("div",{className:"evals-detail card","data-testid":"evals-detail",children:[!d&&e.jsx("p",{className:"evals-state",children:t("evals.selectPrompt","Select an evaluation to inspect scores, rationale, and evidence.")}),d&&e.jsxs(e.Fragment,{children:[e.jsx("h3",{className:"evals-detail-title",children:A?.taskTitle??d.taskTitle}),e.jsxs("p",{className:"evals-result-meta",children:[d.taskId," · ",d.runId]}),e.jsx("p",{className:"evals-score",children:t("evals.overallScore","Overall score: {{score}}",{score:d.overallScore??t("evals.naPlaceholder","n/a")})}),e.jsx("ul",{className:"evals-categories",children:d.categoryScores.map(s=>e.jsxs("li",{children:[s.category,": ",s.finalScore]},s.category))}),e.jsx("p",{className:"evals-rationale",children:d.rationale||t("evals.noRationale","No rationale recorded.")}),e.jsxs("div",{children:[e.jsx("h4",{children:t("evals.evidenceHeading","Evidence")}),e.jsx("ul",{className:"evals-links",children:d.evidence.map((s,c)=>{const y=typeof s.metadata?.taskId=="string"?s.metadata.taskId:void 0,j=typeof s.metadata?.url=="string"?s.metadata.url:void 0;return e.jsx("li",{children:y?e.jsx("button",{type:"button",className:"btn",onClick:()=>m?.(y),children:s.ref}):j?e.jsxs("a",{href:j,target:"_blank",rel:"noreferrer",className:"evals-external-link",children:[s.ref,e.jsx(re,{size:14})]}):e.jsx("span",{children:s.ref})},`${s.ref}-${c}`)})})]}),e.jsxs("div",{children:[e.jsx("h4",{children:t("evals.suggestedFollowupsHeading","Suggested follow-up tasks")}),e.jsxs("ul",{className:"evals-follow-ups",children:[d.followUps.length===0&&e.jsx("li",{children:t("evals.noFollowups","None")}),d.followUps.map(s=>e.jsxs("li",{children:[e.jsx("strong",{children:s.title}),e.jsx("p",{children:s.rationale})]},s.suggestionId))]})]})]})]})]})]}):e.jsxs("section",{className:"evals-view","data-testid":"evals-disabled",children:[e.jsx(H,{icon:B,title:t("evals.title","Evals")}),e.jsxs("div",{className:"evals-view__empty",children:[e.jsx("h2",{className:"evals-title",children:t("evals.disabledTitle","Scheduled evals are disabled")}),e.jsx("p",{className:"evals-empty-copy",children:t("evals.enablePrompt","Enable Scheduled Evals to review scored tasks, evidence, and follow-up recommendations.")}),e.jsxs("button",{className:"btn btn-primary",type:"button",onClick:()=>a?.("scheduled-evals"),children:[e.jsx(ee,{size:16}),t("evals.openSettings","Open Scheduled Evals Settings")]})]})]})}export{ge as EvalsView};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as c,j as e}from"./vendor-react-SZ_qB27O.js";import{ao as Q,ap as ue,aq as he,bx as me,cL as Se,au as ce,cM as _e,bc as je,cN as Y,cO as we,cP as Ne,cQ as ke,cR as Ee,cS as Ce,cT as Ae,cU as Te,bB as Pe,cV as Le,cW as Ie,aV as Fe,af as Me,V as De,aH as pe,L as He,aI as qe}from"./index-idkERMsE.js";import{u as ve}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";const Ue="builtin",X={pageFetch:!0,github:!1,localDocs:!0,llmSynthesis:!0};function ie(a){const n=a?.researchGlobalDefaults,i=a?.researchSettings;return{enabled:i?.enabled??a?.researchEnabled??a?.researchGlobalEnabled??!0,searchProvider:i?.searchProvider??n?.searchProvider??a?.researchGlobalWebSearchProvider??Ue,synthesisProvider:i?.synthesisProvider??n?.synthesisProvider,synthesisModelId:i?.synthesisModelId??n?.synthesisModelId,enabledSources:{webSearch:!0,pageFetch:i?.enabledSources?.pageFetch??n?.enabledSources?.pageFetch??X.pageFetch,github:i?.enabledSources?.github??n?.enabledSources?.github??X.github,localDocs:i?.enabledSources?.localDocs??n?.enabledSources?.localDocs??X.localDocs,llmSynthesis:i?.enabledSources?.llmSynthesis??n?.enabledSources?.llmSynthesis??X.llmSynthesis},limits:{maxConcurrentRuns:i?.limits?.maxConcurrentRuns??a?.researchMaxConcurrentRuns??a?.researchGlobalMaxConcurrentRuns??3,maxSourcesPerRun:i?.limits?.maxSourcesPerRun??n?.maxSourcesPerRun??a?.researchMaxSourcesPerRun??a?.researchGlobalMaxSourcesPerRun??20,maxDurationMs:i?.limits?.maxDurationMs??a?.researchDefaultTimeout??a?.researchGlobalDefaultTimeout??3e5,requestTimeoutMs:i?.limits?.requestTimeoutMs??a?.researchGlobalFetchTimeoutMs??3e4},defaultExportFormat:n?.defaultExportFormat??"markdown"}}function be(a){const n=typeof a.id=="string"?a.id.trim():"";if(n)return n;const i=b=>b.trim().replace(/\s+/g," ").toLowerCase(),m=[i(a.heading??""),i(a.content??""),...[...a.sources??[]].map(i).filter(Boolean).sort()].join(`
|
|
2
|
-
`);let s=2166136261;for(let b=0;b<m.length;b+=1)s^=m.charCodeAt(b),s=Math.imul(s,16777619);return`finding-${(s>>>0).toString(16).padStart(8,"0")}`}const Oe=300,Ve=4e3,$e=["queued","running","cancelling","retry_waiting"];function le(a,n){if(a instanceof Pe){const i=a;return{message:a.message,status:a.status,code:i.researchCode??"INTERNAL_ERROR",setupHint:i.setupHint,retryable:i.retryable}}return a instanceof Error?{message:a.message,code:"INTERNAL_ERROR"}:{message:n,code:"INTERNAL_ERROR"}}function Ge(a){if(!a)return{cancelable:!1,retryable:!1,isTransitioning:!1,blockingReason:"No run selected"};const n=$e.includes(a.status),i=a.status==="queued"||a.status==="running",m=a.lifecycle?.retryable,s=a.status==="failed"||a.status==="timed_out",b=!!(s&&m);let R;return!i&&n?R="Run is already transitioning":!i&&a.status==="completed"?R="Completed runs cannot be cancelled":!i&&a.status==="cancelled"?R="Run is already cancelled":!i&&a.status==="retry_exhausted"?R="Retry attempts exhausted":!i&&a.status==="failed"?R="Failed runs cannot be cancelled":!i&&a.status==="timed_out"&&(R="Timed out runs cannot be cancelled"),!b&&s&&m===!1&&(R=a.lifecycle?.errorCode==="RETRY_EXHAUSTED"?"Retry attempts exhausted":"Run is not retryable"),{cancelable:i,retryable:b,isTransitioning:n,blockingReason:R}}function Be(a){const n=a?.projectId,i=n??"",m=`${he.RESEARCH_RUNS_PREFIX}${i}`,s=`${he.RESEARCH_SELECTED_ID_PREFIX}${i}`,b=Q(m,{maxAgeMs:ue}),R=Q(s,{maxAgeMs:me}),r=c.useRef(Array.isArray(b)&&b.length>0),[M,I]=c.useState(()=>Array.isArray(b)?b:[]),[h,N]=c.useState(R??null),[C,_]=c.useState(null),[U,D]=c.useState({available:!0}),[H,A]=c.useState(!(Array.isArray(b)&&b.length>0)),[$,O]=c.useState(null),[G,j]=c.useState(null),[w,T]=c.useState(""),S=c.useRef(0),d=c.useRef(0),P=c.useRef(n);c.useEffect(()=>{P.current!==n&&(P.current=n,d.current++);const l=Q(m,{maxAgeMs:ue}),o=Q(s,{maxAgeMs:me}),v=Array.isArray(l)&&l.length>0;I(Array.isArray(l)?l:[]),N(o??null),_(null),A(!v),r.current=v},[n,m,s]);const k=c.useCallback(async(l=w)=>{const o=++S.current,v=n;r.current||A(!0),O(null),j(null);try{const y=await Se({q:l||void 0,limit:100},v);if(o!==S.current||v!==n)return;I(y.runs),ce(m,y.runs,{maxBytes:5e5}),r.current=!0,D(y.availability),h&&!y.runs.some(g=>g.id===h)&&(N(null),ce(s,null,{maxBytes:5e5}),_(null))}catch(y){if(o!==S.current||v!==n)return;const g=le(y,"Failed to load research runs");O(g.message),j(g)}finally{o===S.current&&A(!1)}},[n,m,w,s,h]),f=c.useCallback(async l=>{const o=await _e(l,n);return _(o.run),D(o.availability),o.run},[n]);c.useEffect(()=>{r.current||A(!0);const l=window.setTimeout(()=>{k(w)},Oe);return()=>window.clearTimeout(l)},[k,w]),c.useEffect(()=>{if(!h){_(null);return}f(h)},[f,h]),c.useEffect(()=>{const l=d.current,o=()=>d.current!==l,v=n?`?projectId=${encodeURIComponent(n)}`:"";let y=!0;const g=()=>{!y||o()||(k(),h&&f(h))},F=`/api/events${v}`,E=je(F,{events:{"research:run:created":g,"research:run:updated":g,"research:run:completed":g,"research:run:failed":g,"research:run:cancelled":g},onReconnect:()=>{Y({view:"useResearch",trigger:"sse-reconnect",projectId:n,replayAttempted:!1,sseChannel:F}),g()}});Y({view:"useResearch",trigger:"sse-open",projectId:n,replayAttempted:!1,sseChannel:F});const V=window.setInterval(g,Ve);return()=>{y=!1,E(),window.clearInterval(V)}},[n,k,h,f]);const z=c.useCallback(l=>{N(l),ce(s,l,{maxBytes:5e5})},[s]);return{runs:M,selectedRun:C,selectedRunId:h,setSelectedRunId:z,availability:U,loading:H,error:$,searchQuery:w,setSearchQuery:T,refresh:k,createRun:l=>Te(l,n),cancelRun:async l=>{try{j(null);const o=await Ae(l,n);return h===l&&_(o.run),await k(),o}catch(o){const v=le(o,"Failed to cancel run");throw j(v),v}},retryRun:async l=>{try{j(null);const o=await Ce(l,n);return h===l&&_(o.run),await k(),o}catch(o){const v=le(o,"Failed to retry run");throw j(v),v}},exportRun:(l,o)=>Ee(l,o,n),createTaskFromRun:(l,o,v,y,g,F)=>ke(l,{title:o,findingId:v,description:y,priority:g,attachExport:F},n),attachRunToTask:(l,o,v,y)=>Ne(l,{taskId:o,findingId:v,attachExport:y},n),promoteFinding:(l,o)=>we(l,o,n),uiError:G,runActionState:Ge(C),statusCounts:M.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 We({open:a,mode:n,run:i,finding:m,projectId:s,onClose:b,onConfirm:R}){const{t:r}=ve("app");Le(a);const[M,I]=c.useState(!1),[h,N]=c.useState(""),[C,_]=c.useState(""),[U,D]=c.useState("normal"),[H,A]=c.useState(""),[$,O]=c.useState([]),[G,j]=c.useState(!1),[w,T]=c.useState(!1),S=c.useMemo(()=>{const d=(m.content??"").split(/(?<=[.!?])\s+/)[0]??"";return`${m.heading||r("research.defaultFindingHeading","Research finding")} — ${d}`.trim()},[m.content,m.heading,r]);return c.useEffect(()=>{a&&(I(!1),N(`Research: ${m.heading||i.title}`),_(S),D("normal"),A(""),n==="enrich"&&(j(!0),Ie(50,0,s).then(d=>O(d.filter(P=>P.column!=="archived"))).finally(()=>j(!1))))},[a,n,s,m.heading,S,i.title]),a?e.jsx("div",{className:"modal-overlay open",role:"presentation",onClick:b,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:n==="create"?r("research.createTaskTitle","Create task from finding"):r("research.enrichTaskTitle","Enrich existing task")}),e.jsx("button",{className:"modal-close",type:"button","aria-label":r("actions.close","Close"),onClick:b,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:[r("research.runLabel","Run:")," "]})," ",i.id]}),e.jsxs("p",{children:[e.jsxs("strong",{children:[r("research.findingLabel","Finding:")," "]})," ",m.id,m.heading?` — ${m.heading}`:""]}),e.jsx("p",{children:S||r("research.noPreview","No preview available.")})]}),n==="create"?e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"research-task-action-modal__field",children:[r("research.titleLabel","Title"),e.jsx("input",{className:"input",value:h,onChange:d=>N(d.target.value)})]}),e.jsxs("label",{className:"research-task-action-modal__field",children:[r("research.descriptionLabel","Description"),e.jsx("textarea",{className:"input research-task-action-modal__textarea",value:C,onChange:d=>_(d.target.value)})]}),e.jsxs("label",{className:"research-task-action-modal__field",children:[r("research.priorityLabel","Priority"),e.jsxs("select",{className:"select",value:U,onChange:d=>D(d.target.value),children:[e.jsx("option",{value:"low",children:r("research.priorityLow","Low")}),e.jsx("option",{value:"normal",children:r("research.priorityNormal","Normal")}),e.jsx("option",{value:"high",children:r("research.priorityHigh","High")}),e.jsx("option",{value:"urgent",children:r("research.priorityUrgent","Urgent")})]})]})]}):e.jsxs("label",{className:"research-task-action-modal__field",children:[r("research.targetTaskLabel","Target task"),e.jsx("input",{className:"input",list:"research-task-action-task-list",value:H,placeholder:G?r("research.loadingTasks","Loading tasks…"):r("research.enterTaskId","Enter task ID"),onChange:d=>A(d.target.value)}),e.jsx("datalist",{id:"research-task-action-task-list",children:$.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:M,onChange:d=>I(d.target.checked)}),e.jsx("span",{children:r("research.attachExport","Attach markdown export artifact")})]})]}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("button",{className:"btn",type:"button",onClick:b,children:r("actions.cancel","Cancel")}),e.jsx("button",{className:"btn btn-primary",type:"button",disabled:w||n==="enrich"&&!H,onClick:()=>{T(!0),R({taskId:n==="enrich"?H:void 0,title:n==="create"?h.trim():void 0,description:n==="create"?C.trim():void 0,priority:n==="create"?U:void 0,attachExport:M}).finally(()=>T(!1))},children:n==="create"?r("research.createTaskButton","Create Task"):r("research.enrichTaskButton","Enrich Task")})]})]})}):null}const ze=["web-search","page-fetch","github","local-docs","llm-synthesis"],Ke={"web-search":"webSearch","page-fetch":"pageFetch",github:"github","local-docs":"localDocs","llm-synthesis":"llmSynthesis"};function Qe(a){return{"web-search":a("research.providerWebSearch","Web Search"),"page-fetch":a("research.providerPageFetch","Page Fetch"),github:a("research.providerGitHub","GitHub"),"local-docs":a("research.providerLocalDocs","Local Docs"),"llm-synthesis":a("research.providerLlmSynthesis","LLM Synthesis")}}let oe=!1;function ts({projectId:a,addToast:n,onOpenSettings:i,readinessVersion:m=0}){const{t:s}=ve("app"),b=Qe(s);c.useEffect(()=>(Y({view:"ResearchView",trigger:oe?"route-active":"remount",projectId:a,replayAttempted:!1}),oe=!1,()=>{oe=!0,Y({view:"ResearchView",trigger:"route-inactive",projectId:a,replayAttempted:!1})}),[a]);const{runs:R,selectedRun:r,selectedRunId:M,setSelectedRunId:I,availability:h,loading:N,error:C,searchQuery:_,setSearchQuery:U,createRun:D,cancelRun:H,retryRun:A,exportRun:$,createTaskFromRun:O,attachRunToTask:G,promoteFinding:j,statusCounts:w,refresh:T,uiError:S,runActionState:d}=Be({projectId:a}),[P,k]=c.useState(""),[f,z]=c.useState(()=>ie(void 0)),[l,o]=c.useState([]),[v,y]=c.useState(!1),[g,F]=c.useState([]),[E,V]=c.useState(null),[q,K]=c.useState(null),[J,fe]=c.useState(""),Z=h.supportedProviders??ze,ee=f.searchProvider,se=t=>t==="web-search"?!0:f.enabledSources[Ke[t]];c.useEffect(()=>{const t=Z.filter(u=>se(u));F(u=>{const p=u.filter(x=>t.includes(x));return p.length>0?p:t})},[f.enabledSources,Z]),c.useEffect(()=>{let t=!1;return Promise.all([Fe(a),Me().catch(()=>({providers:[]}))]).then(([u,p])=>{t||(z(ie(u)),o(p.providers.filter(x=>x.type==="api_key").map(x=>({id:x.id,authenticated:x.authenticated}))))}).catch(()=>{t||z(ie(void 0))}),()=>{t=!0}},[a,m]);const xe=c.useMemo(()=>r?r.status:s("research.noRunSelected","No run selected"),[r,s]),ye=c.useMemo(()=>r?r.status==="queued"||r.status==="retry_waiting"?"status-dot status-dot--pending":r.status==="running"?"status-dot status-dot--connecting":r.status==="completed"?"status-dot status-dot--online":r.status==="failed"||r.status==="cancelled"?"status-dot status-dot--error":"status-dot":"status-dot",[r]),re=h.supportedExportFormats??["markdown","json","html"],te=c.useMemo(()=>new Map(l.map(t=>[t.id,t.authenticated])),[l]),ae=c.useMemo(()=>{const t=new Set;return f.enabledSources.webSearch&&ee&&t.add(ee),f.enabledSources.llmSynthesis&&f.synthesisProvider&&t.add(f.synthesisProvider),[...t].filter(u=>te.has(u))},[f.enabledSources.llmSynthesis,f.enabledSources.webSearch,f.synthesisProvider,ee,te]).find(t=>te.get(t)!==!0),B=c.useMemo(()=>h.available?f.enabled?ae?{reason:s("research.missingApiKey","Missing API key for {{provider}}.",{provider:ae}),details:s("research.addCredentialsHint","Add provider credentials in Authentication settings."),settingsSection:"authentication"}:null:{reason:s("research.disabled","Research is disabled for this project."),details:s("research.enableResearchHint","Enable project research settings to create runs."),settingsSection:"research-project"}:{reason:h.reason??s("research.unavailable","Research is unavailable for this project."),details:h.setupInstructions,settingsSection:"research-project"},[h.available,h.reason,h.setupInstructions,f.enabled,ae,s]),W=async(t,u,p)=>{V(t);try{await u(),n?.(p,"success"),await T()}catch(x){n?.(x instanceof Error?x.message:s("research.actionFailed","Action failed"),"error")}finally{V(null)}},ne=async t=>{if(r){V(`export-${t}`);try{const u=await $(r.id,t),p=new Blob([u.content],{type:"text/plain;charset=utf-8"}),x=URL.createObjectURL(p),L=document.createElement("a");L.href=x,L.download=u.filename,document.body.appendChild(L),L.click(),L.remove(),URL.revokeObjectURL(x),n?.(s("research.exportedFile","Exported {{filename}}",{filename:u.filename}),"success")}catch(u){n?.(u instanceof Error?u.message:s("research.exportFailed","Export failed"),"error")}finally{V(null)}}},ge=async()=>{if(P.trim()){y(!0);try{const t=g.filter(p=>se(p));if(t.length===0){y(!1),n?.(s("research.noSourcesAvailable","No enabled research sources are available for this project."),"error");return}const u=await D({query:P.trim(),providers:t});I(u.run.id),k(""),n?.(s("research.runCreated","Research run created"),"success"),await T()}catch(t){n?.(t instanceof Error?t.message:s("research.createRunFailed","Failed to create run"),"error")}finally{y(!1)}}};return e.jsxs("section",{className:"research-view","aria-label":s("research.viewLabel","Research view"),children:[e.jsx(De,{icon:pe,title:s("research.title","Research"),actions:e.jsx("button",{className:"btn",type:"button",onClick:()=>void T(),children:s("actions.refresh","Refresh")})}),e.jsx("p",{className:"research-view__subtitle",children:s("research.subtitle","Cited search and synthesis runs: gather sources, fetch content, and synthesize findings.")}),B?e.jsxs("div",{className:"research-view__state research-view__state--error card","data-testid":"research-state-unavailable",children:[e.jsx("p",{children:B.reason}),B.details&&e.jsx("p",{children:B.details}),e.jsx("p",{children:s("research.currentDefaults","Current defaults: provider {{provider}}, max sources {{maxSources}}",{provider:f.searchProvider??s("research.notSet","(not set)"),maxSources:f.limits.maxSourcesPerRun})}),e.jsxs("div",{className:"research-view__actions",children:[e.jsx("button",{className:"btn",type:"button",onClick:()=>void T(),children:s("actions.refresh","Refresh")}),e.jsx("button",{className:"btn btn-primary",type:"button",onClick:()=>i?.(B.settingsSection),children:s("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:s("research.queryLabel","Query")}),e.jsx("textarea",{id:"research-query",className:"input research-view__textarea",value:P,onChange:t=>k(t.target.value)})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:s("research.providersLabel","Providers")}),e.jsx("div",{className:"research-view__providers",children:Z.map(t=>{const u=se(t),p=t==="web-search";return e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:p||g.includes(t),disabled:p||!u,onChange:()=>{p||!u||F(x=>x.includes(t)?x.filter(L=>L!==t):[...x,t])}}),e.jsxs("span",{children:[b[t]??t,p?e.jsx("span",{className:"research-view__provider-lock",children:s("research.alwaysOn","Always on")}):null]})]},t)})})]}),e.jsxs("button",{className:"btn btn-primary",type:"button",disabled:!P.trim()||v,onClick:()=>void ge(),children:[v?e.jsx(He,{className:"animate-spin",size:14}):null,s("research.createRun","Create Run")]})]}),e.jsxs("div",{className:"research-view__history-header form-group",children:[e.jsx("label",{htmlFor:"research-run-search",children:s("actions.search","Search")}),e.jsxs("div",{className:"research-view__history-search-row",children:[e.jsx(pe,{size:14}),e.jsx("input",{id:"research-run-search",className:"input",placeholder:s("research.searchRunsPlaceholder","Search runs"),value:_,onChange:t=>U(t.target.value)})]})]}),e.jsx("div",{className:"research-view__history","data-testid":"research-state-running",children:R.map(t=>e.jsxs("button",{type:"button",className:`research-view__history-item card${M===t.id?" research-view__history-item--active":""}`,onClick:()=>I(t.id),children:[e.jsx("span",{className:"card-id",children:t.id}),e.jsx("span",{children:t.title})]},t.id))})]})}),e.jsxs("div",{className:"research-view__reader card",children:[N&&e.jsx("p",{"data-testid":"research-state-loading",children:e.jsx(qe,{label:s("research.loadingRuns","Loading research runs…")})}),!N&&C&&e.jsx("p",{"data-testid":"research-state-error",children:C}),!N&&!C&&R.length===0&&e.jsx("p",{"data-testid":"research-state-empty",children:s("research.noRunsYet","No research runs yet")}),e.jsxs("div",{className:"research-view__reader-content",children:[r&&e.jsxs("div",{className:"research-view__run-detail",children:[e.jsxs("div",{className:"research-view__status-row",children:[e.jsx("span",{className:ye}),e.jsx("strong",{children:xe})]}),e.jsx("h3",{className:"research-view__run-title",children:r.title}),e.jsx("p",{className:"research-view__run-query",children:r.query}),e.jsx("p",{className:"research-view__run-summary","data-testid":"research-state-results",children:r.results?.summary??s("research.noSummaryYet","No summary yet.")}),e.jsxs("div",{className:"research-view__actions",children:[e.jsx("button",{className:"btn",type:"button",title:d.cancelable?void 0:d.blockingReason,disabled:E==="cancel"||E==="retry"||!d.cancelable,onClick:()=>void W("cancel",()=>H(r.id),s("research.runCancelled","Run cancelled")),children:s("actions.cancel","Cancel")}),e.jsx("button",{className:"btn",type:"button",title:d.retryable?void 0:d.blockingReason,disabled:E==="cancel"||E==="retry"||!d.retryable,onClick:()=>void W("retry",()=>A(r.id),s("research.runRetried","Run retried")),children:s("actions.retry","Retry")}),re.includes("markdown")&&e.jsx("button",{className:"btn",type:"button",disabled:E==="export-markdown",onClick:()=>void ne("markdown"),children:s("research.exportMd","Export MD")}),re.includes("json")&&e.jsx("button",{className:"btn",type:"button",disabled:E==="export-json",onClick:()=>void ne("json"),children:s("research.exportJson","Export JSON")}),re.includes("html")&&e.jsx("button",{className:"btn",type:"button",disabled:E==="export-html",onClick:()=>void ne("html"),children:s("research.exportHtml","Export HTML")})]}),r.error&&e.jsx("p",{className:"research-view__error",children:r.error}),S&&e.jsxs("div",{className:"form-error",role:"alert",children:[e.jsx("p",{children:S.message}),S.setupHint&&e.jsx("p",{children:S.setupHint}),S.code==="MISSING_CREDENTIALS"&&e.jsx("button",{className:"btn btn-sm",type:"button",onClick:()=>i?.("authentication"),children:s("research.openAuthSettings","Open Authentication Settings")}),S.code==="FEATURE_DISABLED"&&e.jsx("button",{className:"btn btn-sm",type:"button",onClick:()=>i?.("research-project"),children:s("research.openResearchSettings","Open Research Settings")})]}),d.blockingReason&&e.jsx("p",{className:"research-view__run-query",children:d.blockingReason}),Array.isArray(r.results?.findings)&&r.results.findings.length>0&&e.jsx("div",{className:"research-view__findings",children:r.results.findings.map(t=>{const u=be(t);return e.jsxs("article",{className:"research-view__finding card",children:[e.jsx("h4",{children:t.heading}),e.jsx("p",{children:t.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:u}),children:s("research.createTask","Create Task")}),e.jsx("button",{className:"btn btn-sm",type:"button",onClick:()=>K({mode:"enrich",findingId:u}),children:s("research.enrichTask","Enrich Task")}),e.jsx("input",{className:"input","aria-label":s("research.destinationSlice","Destination slice ID"),value:J,onChange:p=>fe(p.target.value),placeholder:s("research.destinationSlice","Destination slice ID")}),e.jsx("button",{className:"btn btn-sm",type:"button",disabled:r.status!=="completed"||!J.trim()||E===`promote-${u}`,onClick:()=>void W(`promote-${u}`,()=>j(r.id,{findingId:u,sliceId:J.trim()}),s("research.findingPromoted","Finding promoted to roadmap")),children:s("research.promoteFinding","Promote to roadmap")})]})]},u)})}),Array.isArray(r.results?.citations)&&r.results.citations.length>0&&e.jsx("ul",{className:"research-view__citations",children:r.results.citations.map(t=>e.jsx("li",{children:e.jsx("a",{href:t,target:"_blank",rel:"noreferrer",children:t})},t))}),r.events.length>0&&e.jsxs("details",{children:[e.jsx("summary",{children:s("research.runHistory","Run history")}),e.jsx("ul",{className:"research-view__events",children:r.events.map(t=>e.jsx("li",{children:t.message},t.id))})]})]}),!r&&R.length>0&&e.jsx("p",{children:s("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:s("research.statRunning","Running")}),e.jsx("div",{className:"research-view__stat-value",children:w.running})]}),e.jsxs("div",{className:"research-view__stat-card",children:[e.jsx("div",{className:"research-view__stat-label",children:s("research.statCompleted","Completed")}),e.jsx("div",{className:"research-view__stat-value",children:w.completed})]}),e.jsxs("div",{className:"research-view__stat-card",children:[e.jsx("div",{className:"research-view__stat-label",children:s("research.statFailed","Failed")}),e.jsx("div",{className:"research-view__stat-value",children:w.failed})]})]})]})]})]})}),r&&q&&(()=>{const t=r.results?.findings?.findIndex(p=>be(p)===q.findingId)??-1,u=t>=0?r.results.findings[t]:null;return u?e.jsx(We,{open:!0,mode:q.mode,run:r,finding:{id:q.findingId,heading:u.heading,content:u.content},projectId:a,onClose:()=>K(null),onConfirm:async({taskId:p,title:x,description:L,priority:Re,attachExport:de})=>{q.mode==="create"?await W("create-task",()=>O(r.id,x,q.findingId,L,Re,de),s("research.taskCreatedFromResearch","Task created from research")):p&&await W("attach-task",()=>G(r.id,p,q.findingId,de),s("research.taskEnrichedFromResearch","Task enriched from research")),K(null)}}):null})()]})}export{ts as ResearchView};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-xterm-BNq00GSj.js","assets/vendor-react-SZ_qB27O.js","assets/vendor-xterm-LZoznX6r.css","assets/addon-fit-C1WQXRvu.js","assets/addon-unicode11-BVmNDUBM.js","assets/addon-webgl-uLc0RKcC.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{J as ge,K as A,N as le,O as V,Q as ce,U as B,W as xe,Y as Ne,p as Re,_ as Pe,$ as J,a0 as je,a1 as Me,a as De,a2 as I,a3 as Le,a4 as Oe}from"./index-idkERMsE.js";import{r as s,j as t}from"./vendor-react-SZ_qB27O.js";import"./vendor-xterm-BNq00GSj.js";import{u as Ae}from"./vendor-i18n-GF3RlKbq.js";import{S as ze}from"./shield-alert-baoKRyU6.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";const Fe=32*1024,Be=100,Ie="\x1B",Ke=" ",We="",$e="\x1B[A",Ue="\x1B[B",Qe="\x1B[C",Ve="\x1B[D",K={ctrl:"Ctrl",escape:"Esc",tab:"Tab",ctrlC:"^C"};function de(u){if(u.length!==1)return null;const o=u.toUpperCase().charCodeAt(0);return o>=64&&o<=95?String.fromCharCode(o&31):null}function Je(){const[u,f]=s.useState(()=>J());return s.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const o=window.matchMedia(je),a=window.visualViewport,y=()=>f(J());return y(),typeof a?.addEventListener=="function"&&a.addEventListener("resize",y),typeof o.addEventListener=="function"?(o.addEventListener("change",y),()=>{o.removeEventListener("change",y),typeof a?.removeEventListener=="function"&&a.removeEventListener("resize",y)}):(o.addListener(y),()=>{o.removeListener(y),typeof a?.removeEventListener=="function"&&a.removeEventListener("resize",y)})},[]),u}function Ye(u,f){if(typeof window>"u")return"";const a=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/api/cli-sessions/ws?sessionId=${encodeURIComponent(u)}&ticket=${encodeURIComponent(f)}`;return Oe(a)}function He(){return/Mac|iPhone|iPad|iPod/i.test(navigator.platform)}function Ge(u){if(typeof window<"u"&&typeof window.atob=="function"){const f=window.atob(u),o=new Uint8Array(f.length);for(let a=0;a<f.length;a++)o[a]=f.charCodeAt(a);return new TextDecoder("utf-8").decode(o)}return Buffer.from(u,"base64").toString("utf8")}function at({sessionId:u,readOnly:f=!1,posture:o,mode:a="live",projectId:y,onConfirmAdvance:E,showConfirmAdvance:W=!1,onOpenAdapterSettings:Y}){const{t:r}=Ae("app"),C=s.useRef(null),T=s.useRef(null),j=s.useRef(null),S=s.useRef(null),[H,G]=s.useState(!1),[ue,$]=s.useState(!1),[q,Z]=s.useState(!1),g=Je(),{keyboardOpen:z,keyboardOverlap:me}=ge({enabled:g}),fe=s.useRef(null),[_,X]=s.useState(""),[x,M]=s.useState(!1),[pe,ye]=s.useState(()=>A().customShortcuts),[ee,te]=s.useState(null),ne=f||ee===!0,D=!f&&ee===!1&&a==="live",b=s.useCallback(e=>{if(!e||!D)return;const n=S.current;n?.readyState===WebSocket.OPEN&&n.send(JSON.stringify({type:"input",data:e}))},[D]),N=s.useCallback(e=>{if(x){const n=de(e);if(M(!1),n){b(n);return}}b(e)},[x,b]),l=s.useCallback(e=>{e.preventDefault()},[]),be=s.useCallback(e=>{e?.preventDefault?.(),_&&b(_),b("\r"),X("")},[_,b]),he=s.useCallback(e=>{if(x&&e.length>_.length){const n=e.slice(_.length,_.length+1),d=de(n);if(M(!1),d){b(d);return}}X(e)},[x,_,b]);s.useEffect(()=>{W&&$(!1)},[W,u]);const L=s.useCallback((e,n)=>{const d=S.current;d?.readyState===WebSocket.OPEN&&d.send(JSON.stringify({type:"resize",cols:e,rows:n}))},[]),ie=s.useCallback(()=>{const e=T.current;if(!e)return;const n=A(),d=le(n.fontFamily);e.options.fontFamily=d,C.current?.style.setProperty("--terminal-glyph-font-family",V(n.fontFamily)),e.options.fontSize=n.fontSize,e.options.cursorStyle=n.cursorStyle,e.options.cursorBlink=n.cursorBlink&&D;try{j.current?.fit?.(),L(e.cols,e.rows)}catch{}ce(n.fontSize,d).then(R=>{if(!(!R||T.current!==e||e.options.fontSize!==n.fontSize||e.options.fontFamily!==d)){B(e,d),e.options.fontSize=n.fontSize;try{j.current?.fit?.(),L(e.cols,e.rows),B(e,d),e.refresh(0,Math.max(0,e.rows-1))}catch{}}},()=>{})},[D,L]);s.useEffect(()=>{if(typeof window>"u")return;const e=n=>{n.key===Me&&(ie(),ye(A().customShortcuts))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[ie]),s.useEffect(()=>{if(!u||typeof window>"u")return;let e=!1,n=null,d=null,R=0;te(null);const U=L,ke=p=>{if(R+=p,R<Fe)return;const h=S.current;h?.readyState===WebSocket.OPEN&&h.send(JSON.stringify({type:"ack",bytes:R})),R=0};return(async()=>{let p;try{p=await De(`/cli-sessions/${encodeURIComponent(u)}/attach-ticket`,{method:"POST",body:JSON.stringify(y?{projectId:y}:{})})}catch{return}if(e)return;te(p.readOnly);const h=!f&&!p.readOnly&&a==="live",[{Terminal:ve},{FitAddon:Ee},{Unicode11Addon:Ce}]=await Promise.all([I(()=>import("./vendor-xterm-BNq00GSj.js").then(c=>c.x),__vite__mapDeps([0,1,2])),I(()=>import("./addon-fit-C1WQXRvu.js").then(c=>c.a),__vite__mapDeps([3,1])),I(()=>import("./addon-unicode11-BVmNDUBM.js").then(c=>c.a),__vite__mapDeps([4,1]))]);if(e||!C.current)return;const w=A(),O=le(w.fontFamily);C.current.style.setProperty("--terminal-glyph-font-family",V(w.fontFamily));const i=new ve({convertEol:!1,cursorBlink:w.cursorBlink&&h,cursorStyle:w.cursorStyle,disableStdin:!h,scrollback:1e4,fontFamily:O,fontSize:w.fontSize}),P=new Ee;i.loadAddon(P);const Te=new Ce;if(i.loadAddon(Te),i.unicode.activeVersion="11",Le(()=>{i.open(C.current)}),T.current=i,j.current=P,w.renderer==="auto"&&!J())try{const{WebglAddon:c}=await I(async()=>{const{WebglAddon:m}=await import("./addon-webgl-uLc0RKcC.js").then(k=>k.a);return{WebglAddon:m}},__vite__mapDeps([5,1]));if(!e){const m=new c;m.onContextLoss(()=>{try{m.dispose()}catch{}}),i.loadAddon(m)}}catch{}try{P.fit()}catch{}(async()=>{if(!(!await ce(w.fontSize,O)||e||T.current!==i||j.current!==P||i.options.fontSize!==w.fontSize||i.options.fontFamily!==O))try{B(i,O),i.options.fontSize=w.fontSize,P.fit(),U(i.cols,i.rows),B(i,O),i.refresh(0,Math.max(0,i.rows-1))}catch{}})(),h&&(i.onData(c=>{const m=S.current;m?.readyState===WebSocket.OPEN&&m.send(JSON.stringify({type:"input",data:c}))}),i.attachCustomKeyEventHandler(c=>{if(c.type!=="keydown"||!(He()?c.metaKey:c.ctrlKey)||c.altKey||c.shiftKey)return!0;const k=c.key.toLowerCase();if(k==="c"){const v=i.hasSelection()?i.getSelection():"";return v?(navigator.clipboard?.writeText(v).catch(()=>{}),!1):!0}if(k==="v"){const v=navigator.clipboard?.readText;return v&&v.call(navigator.clipboard).then(ae=>{if(!ae)return;const re=S.current;re?.readyState===WebSocket.OPEN&&re.send(JSON.stringify({type:"input",data:ae}))}).catch(()=>{}),!1}return!0})),n=new ResizeObserver(()=>{d&&clearTimeout(d),d=setTimeout(()=>{try{P.fit(),U(i.cols,i.rows),i.refresh(0,Math.max(0,i.rows-1))}catch{}},Be)}),n.observe(C.current);const Q=new WebSocket(Ye(u,p.ticket));S.current=Q,Q.onopen=()=>{U(i.cols,i.rows)},Q.onmessage=c=>{let m;try{m=JSON.parse(typeof c.data=="string"?c.data:"")}catch{return}switch(m.type){case"scrollback":case"data":{if(typeof m.data!="string")return;const k=Ge(m.data),v=k.length;i.write(k,()=>ke(v));break}}}})(),()=>{e=!0,d&&clearTimeout(d),n&&n.disconnect();const p=S.current;if(p){p.onopen=null,p.onmessage=null,p.onclose=null,p.onerror=null;try{p.close()}catch{}S.current=null}const h=T.current;if(h){try{h.dispose()}catch{}T.current=null}j.current=null}},[u,f,a,y,L]);const se=s.useMemo(()=>a==="idle"?r("cliTerminal.replayIdle","Session idle"):a==="ended"?r("cliTerminal.replayEnded","Session ended"):null,[a,r]),we=s.useCallback(async()=>{if(E){Z(!0);try{await E("advance"),$(!0)}finally{Z(!1)}}},[E]),Se=s.useCallback(async()=>{E&&await E("not-yet"),$(!0)},[E]),F=!!o?.elevated,oe=o?.elevatedFlags?.join(", "),_e={"--terminal-glyph-font-family":V(A().fontFamily)};return t.jsxs("div",{className:`cli-session-terminal${g?" cli-session-terminal--mobile":""}${g&&z?" cli-session-terminal--keyboard-open":""}`,"data-mode":a,"data-read-only":ne,"data-mobile":g,"data-keyboard-open":g&&z,children:[t.jsxs("header",{className:"cli-session-terminal__header",children:[o&&t.jsxs("div",{className:"cli-session-terminal__posture-wrap",children:[t.jsxs("button",{type:"button",className:`cli-posture-chip${F?" cli-posture-chip--elevated":""}`,"data-elevated":F,"aria-expanded":H,onClick:()=>G(e=>!e),children:[F?t.jsx(ze,{size:13,"aria-hidden":"true"}):t.jsx(xe,{size:13,"aria-hidden":"true"}),t.jsx("span",{className:"cli-posture-chip__name",children:o.adapterName}),o.mode&&t.jsx("span",{className:"cli-posture-chip__mode",children:o.mode}),F&&oe&&t.jsx("span",{className:"cli-posture-chip__flag",children:oe})]}),H&&t.jsxs("div",{className:"cli-posture-tooltip",role:"tooltip",children:[t.jsx("p",{className:"cli-posture-tooltip__title",children:r("cliTerminal.postureResolved","Resolved posture")}),t.jsxs("ul",{className:"cli-posture-tooltip__list",children:[(o.resolved??[]).map((e,n)=>t.jsx("li",{children:e},n)),(o.resolved??[]).length===0&&t.jsx("li",{children:o.mode??r("cliTerminal.postureBaseline","Baseline")})]}),Y&&t.jsxs("button",{type:"button",className:"cli-posture-tooltip__settings",onClick:()=>{G(!1),Y()},children:[t.jsx(Ne,{size:12,"aria-hidden":"true"}),r("cliTerminal.adapterSettings","Adapter settings")]})]})]}),ne&&t.jsxs("span",{className:"cli-session-terminal__readonly-badge",children:[t.jsx(Re,{size:12,"aria-hidden":"true"}),r("cliTerminal.readOnly","Read-only")]}),se&&t.jsx("span",{className:"cli-session-terminal__replay-badge","data-replay-mode":a,children:se})]}),t.jsx("div",{className:"cli-session-terminal__viewport",ref:C,"data-testid":"cli-terminal-viewport",style:_e}),W&&!ue&&t.jsxs("div",{className:"cli-session-terminal__advance-strip",role:"region",children:[t.jsx("span",{className:"cli-session-terminal__advance-copy",children:r("cliTerminal.advancePrompt","This session looks idle — advance to review?")}),t.jsxs("div",{className:"cli-session-terminal__advance-actions",children:[t.jsx("button",{type:"button",className:"cli-session-terminal__advance-btn",disabled:q,onClick:we,children:r("cliTerminal.advance","Advance")}),t.jsx("button",{type:"button",className:"cli-session-terminal__advance-btn cli-session-terminal__advance-btn--secondary",disabled:q,onClick:Se,children:r("cliTerminal.notYet","Not yet")})]})]}),g&&D&&t.jsxs("div",{className:`cli-session-terminal__mobile-bar${z?" cli-session-terminal__mobile-bar--keyboard-open":""}`,"data-testid":"cli-terminal-mobile-bar",style:z?{bottom:`${me}px`}:void 0,children:[t.jsxs("div",{className:"cli-session-terminal__key-row","data-testid":"cli-terminal-key-bar",children:[t.jsx("button",{type:"button",className:`cli-terminal-key cli-terminal-key--ctrl${x?" cli-terminal-key--active":""}`,"data-testid":"cli-key-ctrl","aria-label":r("cliTerminal.mobileKeyCtrl","Sticky Ctrl modifier"),"aria-pressed":x,onPointerDown:l,onMouseDown:l,onClick:()=>M(e=>!e),children:K.ctrl}),t.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-esc","aria-label":r("cliTerminal.mobileKeyEsc","Send Escape"),onPointerDown:l,onMouseDown:l,onClick:()=>N(Ie),children:K.escape}),t.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-tab","aria-label":r("cliTerminal.mobileKeyTab","Send Tab"),onPointerDown:l,onMouseDown:l,onClick:()=>N(Ke),children:K.tab}),t.jsx("button",{type:"button",className:"cli-terminal-key cli-terminal-key--ctrlc","data-testid":"cli-key-ctrl-c","aria-label":r("cliTerminal.mobileKeyCtrlC","Send Ctrl-C"),onPointerDown:l,onMouseDown:l,onClick:()=>{M(!1),b(We)},children:K.ctrlC}),t.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-up","aria-label":r("cliTerminal.mobileKeyArrowUp","Cursor up"),onPointerDown:l,onMouseDown:l,onClick:()=>N($e),children:"↑"}),t.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-down","aria-label":r("cliTerminal.mobileKeyArrowDown","Cursor down"),onPointerDown:l,onMouseDown:l,onClick:()=>N(Ue),children:"↓"}),t.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-left","aria-label":r("cliTerminal.mobileKeyArrowLeft","Cursor left"),onPointerDown:l,onMouseDown:l,onClick:()=>N(Ve),children:"←"}),t.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-right","aria-label":r("cliTerminal.mobileKeyArrowRight","Cursor right"),onPointerDown:l,onMouseDown:l,onClick:()=>N(Qe),children:"→"}),pe.map(e=>t.jsx("button",{type:"button",className:"cli-terminal-key cli-terminal-key--custom","data-testid":`cli-terminal-custom-shortcut-${e.id}`,title:e.label,"aria-label":e.label,onPointerDown:l,onMouseDown:l,onClick:()=>{M(!1),b(Pe(e.value))},children:e.label},e.id))]}),t.jsxs("form",{className:"cli-session-terminal__input-row",onSubmit:be,children:[t.jsx("input",{ref:fe,type:"text",className:"cli-session-terminal__mobile-input","data-testid":"cli-terminal-mobile-input",value:_,placeholder:r("cliTerminal.mobileInputPlaceholder","Type to send to the session…"),autoCapitalize:"off",autoCorrect:"off",autoComplete:"off",spellCheck:!1,onChange:e=>he(e.target.value)}),t.jsx("button",{type:"submit",className:"cli-session-terminal__mobile-send","data-testid":"cli-terminal-mobile-send","aria-label":r("cliTerminal.mobileSend","Send"),onPointerDown:l,onMouseDown:l,children:r("cliTerminal.mobileSend","Send")})]})]})]})}export{at as SessionTerminal};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.settings-header-actions{--settings-header-action-height: calc(var(--space-md) * 2 + var(--space-xs) / 2);display:flex;align-items:stretch;gap:var(--space-xs);margin-left:auto;margin-right:var(--space-sm)}.settings-header-actions>.settings-github-star-btn,.settings-header-actions>.settings-header-discord-btn{height:var(--settings-header-action-height);box-sizing:border-box}.settings-header-discord-btn,.settings-footer-help-btn{display:inline-flex;align-items:center;text-decoration:none}@media(max-width:768px){.settings-modal .modal-header{flex-wrap:nowrap;align-items:center;column-gap:var(--space-sm)}.settings-modal-heading{flex:1 1 0;min-width:0}.settings-header-actions{margin-left:auto;margin-right:var(--space-sm)}.settings-header-actions .settings-github-star-btn__action,.settings-header-actions .settings-header-discord-btn{width:40px;min-width:40px;padding:0;justify-content:center;font-size:0}.settings-header-actions .settings-github-star-btn__action{gap:0}}.settings-github-star-btn{display:inline-flex;align-items:stretch;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-pill);background:var(--card);color:var(--text);font-size:var(--font-size-xs);font-weight:500;text-decoration:none;overflow:hidden;transition:border-color var(--transition-fast),background var(--transition-fast)}.settings-github-star-btn:hover{border-color:var(--text-muted);background:var(--card-hover)}.settings-github-star-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-color:var(--todo)}.settings-github-star-btn__action{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) calc(var(--space-sm) + var(--space-xs) / 2)}.settings-github-star-btn__count{display:inline-flex;align-items:center;padding:var(--space-xs) calc(var(--space-sm) + var(--space-xs) / 4);border-left:var(--btn-border-width) solid var(--border);background:color-mix(in srgb,var(--surface) 60%,var(--card));color:var(--text-muted);font-variant-numeric:tabular-nums}.settings-modal{width:min(95vw,1100px);max-width:95vw;min-width:520px;height:80vh;min-height:480px;max-height:calc(100dvh - var(--overlay-padding-top, 10vh) - 16px);overflow:hidden;resize:both}.settings-embedded.right-dock-embedded-view{display:flex;flex:1;width:100%;height:100%;min-height:0;padding:0;overflow:hidden}.settings-embedded .settings-modal--embedded{flex:1;width:100%;max-width:none;min-width:0;height:100%;min-height:0;max-height:none;resize:none;box-shadow:none;border:none;border-radius:0;background:transparent;position:static}.settings-modal--embedded .modal-header--embedded{box-sizing:border-box;display:flex;align-items:center;gap:var(--space-sm);min-height:var(--view-header-min-height);padding:var(--space-lg) var(--space-xl);background:var(--surface);border-bottom:none;flex-shrink:0}.settings-modal--embedded .modal-header--embedded .settings-header-actions{margin-left:auto}.settings-modal--embedded .modal-header--embedded .settings-modal-heading h3{display:flex;align-items:center;gap:var(--space-sm);font-size:var(--font-size-md);font-weight:600;color:var(--text);letter-spacing:normal}.settings-modal--embedded .modal-header--embedded .settings-modal-heading svg{color:var(--todo);flex-shrink:0}.settings-modal--embedded .modal-actions{background:transparent;flex-shrink:0;padding-bottom:var(--space-sm)}@media(max-width:768px){.modal-overlay.settings-modal-overlay,.modal-overlay:has(.settings-modal:not(.settings-modal--embedded)){padding:0;inset:0;align-items:stretch;justify-content:stretch}.modal.settings-modal:not(.settings-modal--embedded){width:100vw;min-width:0;max-width:100vw;height:100dvh;min-height:100dvh;max-height:100dvh;margin:0;border:none;border-radius:0;resize:none;flex:1 1 auto}.modal.settings-modal:not(.settings-modal--embedded)[style*=--keyboard-overlap]{height:var(--vv-height, 100dvh);min-height:var(--vv-height, 100dvh);max-height:var(--vv-height, 100dvh);transform:translateY(var(--vv-offset-top, 0px));will-change:transform}.settings-embedded.right-dock-embedded-view{padding:var(--space-sm)}.settings-embedded .settings-modal--embedded{width:100%;height:100%}.settings-modal .modal-header{padding-block:var(--space-sm);padding-inline:var(--space-md)}.settings-modal .modal-actions{padding-block:var(--space-xs);padding-inline:var(--space-md)}.settings-modal--embedded .modal-header--embedded{min-height:0}.settings-modal--embedded .modal-header--embedded .settings-embedded-mobile-close{--settings-embedded-mobile-close-touch-target: calc(var(--space-lg) + var(--space-lg) + var(--space-xs));flex-shrink:0;margin-left:var(--space-xs);min-height:var(--settings-embedded-mobile-close-touch-target);min-width:var(--settings-embedded-mobile-close-touch-target)}}.settings-modal-heading{display:flex;flex-direction:column;gap:var(--space-xs)}.settings-modal-heading h3{margin:0}.settings-modal-version{margin:0;font-size:var(--font-size-sm);color:var(--text-muted);font-weight:500}.settings-modal-footer-version{display:flex;align-items:center;gap:var(--space-xs);margin-right:var(--space-sm);min-width:0}.settings-update-check{display:flex;align-items:center;gap:var(--space-sm);min-width:0}.settings-modal .modal-actions{flex-wrap:wrap;align-items:center;row-gap:var(--space-xs);min-width:0}@media(max-width:768px),(max-height:480px){.settings-modal .modal-actions{flex-wrap:nowrap;align-items:center;justify-content:center;justify-content:safe center;gap:var(--space-sm);overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;touch-action:pan-x pan-y;-webkit-overflow-scrolling:touch;min-width:0;max-width:100%}.settings-modal .modal-actions *{touch-action:pan-x pan-y}.settings-modal .modal-actions-left{align-items:center;flex-shrink:0;gap:var(--space-xs);margin-right:0;max-width:none}.settings-modal .modal-actions-right{align-items:center;flex-shrink:0;gap:var(--space-xs);margin-left:0;max-width:none}.settings-modal .settings-modal-footer-version{align-items:center;align-self:center;flex:0 0 auto;margin-right:0;min-width:max-content;max-width:none}.settings-modal .settings-update-check{align-items:center;flex-wrap:wrap;row-gap:var(--space-xs)}.settings-modal .settings-update-result{align-self:center;flex:0 1 auto;line-height:normal;white-space:normal}.settings-modal .settings-modal-footer-update-row{display:flex;flex-shrink:0;justify-content:center;text-align:center;padding:var(--space-sm) var(--modal-padding) 0;border-top:1px solid var(--border);background:color-mix(in srgb,var(--text) 5%,transparent)}.settings-modal .settings-modal-footer-update-row+.modal-actions{border-top:none}.settings-modal .settings-modal-footer-update-row .settings-update-result{justify-content:center;white-space:normal}.settings-modal .settings-footer-help-btn{align-items:center;flex-shrink:0}.settings-modal .settings-version-check-btn{align-items:center;flex-shrink:0;line-height:1;white-space:nowrap}.settings-modal .settings-modal-version{align-items:center;display:inline-flex;flex-shrink:0;line-height:1;white-space:nowrap}.settings-modal .modal-actions-left .btn-sm,.settings-modal .modal-actions-right .btn-sm,.settings-modal .settings-footer-help-btn{min-height:36px}}.settings-version-check-btn{--settings-inline-touch-target: calc(var(--space-lg) + var(--space-lg) + var(--space-xs));display:inline-flex;align-items:center;gap:var(--space-xs);margin:0;min-height:var(--settings-inline-touch-target);padding:var(--space-xs) var(--space-sm);border:none;background:transparent;color:var(--text-muted);cursor:pointer;transition:opacity var(--transition-fast),box-shadow var(--transition-fast)}.settings-version-check-btn:hover:not(:disabled){opacity:.85}.settings-version-check-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.settings-version-check-btn:disabled{cursor:default;opacity:.7}.settings-version-check-btn svg{color:var(--text-muted)}.settings-version-check-btn svg.spinning{animation:settings-update-spin 1s linear infinite}.settings-update-result{display:inline-flex;align-items:center;flex-wrap:wrap;gap:var(--space-xs);font-size:var(--font-size-sm);font-weight:500}.settings-update-result--up-to-date{color:var(--color-success)}.settings-update-result--available{color:var(--color-info)}.settings-update-result--error{color:var(--color-error)}.settings-update-result-link{color:var(--color-info);text-decoration:underline;transition:color var(--transition-fast),box-shadow var(--transition-fast)}.settings-update-result-link:hover{color:color-mix(in srgb,var(--color-info) 80%,var(--text))}.settings-update-result-link:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.settings-update-now-btn{display:inline-flex;align-items:center;gap:var(--space-xs);min-height:calc(var(--space-lg) + var(--space-sm));color:var(--text)}.settings-update-now-btn:disabled{color:var(--color-warning)}.settings-update-now-btn svg.spinning{animation:settings-update-spin 1s linear infinite}.settings-update-install-succeeded{display:inline-flex;align-items:center;flex-wrap:wrap;gap:var(--space-xs)}.settings-update-install-status{color:var(--text-muted)}.settings-update-install-status--success{color:var(--color-success)}.settings-update-install-status--error{color:var(--color-error)}@keyframes settings-update-spin{to{transform:rotate(360deg)}}.backup-stats{display:flex;align-items:center;gap:var(--space-lg);padding:var(--space-sm) var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 85%,transparent)}.backup-stat{display:flex;flex:1 1 0;flex-direction:column;align-items:center;gap:var(--space-xs);min-width:0}.backup-stat-value{color:var(--text);font-size:var(--font-size-base);font-weight:600;font-variant-numeric:tabular-nums}.backup-stat-label{color:var(--text-muted);font-size:var(--font-size-xs);font-weight:600;letter-spacing:.04em;text-transform:uppercase}.backup-list{margin-top:var(--space-sm)}.backup-list summary{padding:var(--space-sm) 0;color:var(--text-muted);cursor:pointer;transition:color var(--transition-fast)}.backup-list summary:hover{color:var(--text)}.backup-list summary:focus-visible{outline:none;border-radius:var(--radius-sm);box-shadow:var(--focus-ring-strong)}.backup-list ul{display:flex;flex-direction:column;gap:var(--space-xs);margin:0;margin-top:var(--space-sm);padding:0;list-style:none}.backup-list li{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm) 0;border-top:var(--btn-border-width) solid color-mix(in srgb,var(--border) 80%,transparent)}.backup-list li code{min-width:0;color:var(--text);font-family:var(--font-mono);font-size:var(--font-size-xs);white-space:nowrap;overflow-x:auto}.backup-size{color:var(--text-muted);font-family:var(--font-mono);font-size:var(--font-size-xs);text-align:right;white-space:nowrap}@media(max-width:768px){.backup-stats{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.backup-stat{align-items:flex-start}.backup-list ul{max-height:calc(var(--space-xl) * 9 + var(--space-md));overflow-y:auto;-webkit-overflow-scrolling:touch}.backup-list li code{white-space:normal;overflow-wrap:anywhere;word-break:normal}}.settings-layout{display:flex;flex:1;flex-direction:row;min-height:0;overflow:hidden}.settings-navigation{--settings-nav-width: calc(var(--space-xl) * 10 + var(--space-sm));width:var(--settings-nav-width);min-width:var(--settings-nav-width);display:flex;flex-direction:column;min-height:0;background:var(--surface)}.settings-navigation .settings-sidebar{background:transparent}.settings-nav-resize-handle{flex:0 0 var(--space-xs);margin-inline:calc(var(--space-xs) * -.5);cursor:col-resize;background:transparent;border:0;outline:none;position:relative;z-index:1}.settings-nav-resize-handle:before{content:"";position:absolute;inset-block:var(--space-sm);inset-inline:calc(50% - (var(--btn-border-width) / 2));width:var(--btn-border-width);border-radius:var(--radius-pill);background:transparent;transition:background var(--transition-fast)}.settings-nav-resize-handle:hover:before,.settings-nav-resize-handle:focus-visible:before{background:var(--border)}.settings-nav-resize-handle:focus-visible{box-shadow:var(--focus-ring-strong)}.settings-search{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm);border-bottom:var(--btn-border-width) solid var(--border)}.settings-advanced-toggle{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm);border-bottom:var(--btn-border-width) solid var(--border);color:var(--text);font-size:var(--font-size-xs);font-weight:600;cursor:pointer}.settings-advanced-toggle input{margin:0;cursor:pointer}.settings-search-row{display:flex;flex-direction:column;gap:var(--space-xs)}.settings-search-toggle{display:none}.settings-search-label{color:var(--text-muted);font-size:var(--font-size-xs);font-weight:700;text-transform:uppercase;letter-spacing:.05em}.settings-search-input-wrap{display:flex;align-items:center;gap:var(--space-xs);min-width:0}.settings-search-input{min-width:0;width:100%}.settings-search-clear{flex-shrink:0}.settings-search-results,.settings-search-empty-hint{color:var(--text-muted);font-size:var(--font-size-xs);margin:0}.settings-search-hits{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1px;max-height:calc(var(--space-2xl) * 6);overflow-y:auto}.settings-search-hit{display:flex;flex-direction:column;align-items:flex-start;gap:1px;width:100%;padding:var(--space-xs) var(--space-sm);background:none;border:none;border-radius:var(--radius-sm);text-align:left;cursor:pointer;color:var(--text)}.settings-search-hit:hover,.settings-search-hit:focus-visible{background:var(--bg)}.settings-search-hit-label{font-size:var(--font-size-xs);line-height:var(--line-height-tight)}.settings-search-hit-section{font-size:var(--font-size-2xs);color:var(--text-muted)}.settings-search-hits-more{padding:var(--space-xs) var(--space-sm);font-size:var(--font-size-2xs);color:var(--text-muted)}.settings-search-empty{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-md);color:var(--text-muted)}.settings-search-empty p,.settings-search-content-empty p{margin:0}.settings-search-content-empty{gap:var(--space-md)}.settings-mobile-section-picker{display:none}.settings-sidebar{display:flex;flex:1;flex-direction:column;min-height:0;overflow-y:auto;padding:var(--space-sm) var(--space-sm);gap:calc(var(--space-xs) / 2);scrollbar-color:var(--border) transparent;scrollbar-width:thin}.settings-sidebar::-webkit-scrollbar{width:6px}.settings-sidebar::-webkit-scrollbar-track{background:transparent}.settings-sidebar::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-sm)}.settings-sidebar::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.settings-research-source-locked{cursor:default;color:var(--text-muted)!important}.settings-research-source-locked input[type=checkbox]{cursor:not-allowed}.settings-research-source-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm);min-width:0}.settings-research-source-grid>*{min-width:0}.settings-research-source-option{display:flex;flex-direction:column;gap:calc(var(--space-xs) / 2);min-width:0}.settings-research-limits-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm);min-width:0}.settings-research-limits-grid>*{min-width:0}.settings-research-limit-field{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.settings-research-limits-error{grid-column:1 / -1}@media(max-width:768px){.settings-research-source-grid,.settings-research-limits-grid{grid-template-columns:1fr}}.settings-nav-item{display:block;width:100%;padding:var(--space-sm) var(--space-md);font-size:var(--font-size-sm);font-weight:500;color:var(--text-muted);background:none;border:none;border-left:3px solid transparent;border-radius:0 var(--radius-md) var(--radius-md) 0;cursor:pointer;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.settings-sidebar{padding-block:var(--space-md)}.settings-nav-item{min-height:36px;display:flex;align-items:center;gap:var(--space-xs);line-height:1.25}.settings-content{padding:var(--space-lg) calc(var(--space-xl) + var(--space-sm)) calc(var(--space-xl) + var(--space-md))}.settings-content>.settings-gitlab-disclosure{margin-inline:0}.settings-content .settings-section-heading{padding-inline:0;color:var(--text);line-height:1.3;text-wrap:balance}.settings-content h4.settings-section-heading{font-size:var(--font-size-base);margin-bottom:var(--space-md)}.settings-content h5.settings-section-heading{font-size:var(--font-size-sm)}.settings-content .form-group{padding-inline:0;margin-top:0;padding-block:var(--space-sm)}.settings-content .form-group label:not(.checkbox-label){font-size:var(--font-size-sm);font-weight:500;line-height:var(--line-height-tight);color:var(--text);text-transform:none;letter-spacing:normal;margin-bottom:var(--space-xs)}.settings-content .form-group small,.settings-content .form-group .form-text{font-size:var(--font-size-xs);line-height:1.5;color:var(--text-muted)}.settings-field-label-row{display:flex;align-items:center;gap:var(--space-xs);flex-wrap:wrap}.settings-content .form-group .settings-field-label-row label{display:inline-flex;align-items:center;margin-bottom:0}.settings-content .checkbox-label{min-height:32px;line-height:1.35}.settings-modal input[type=checkbox]{width:16px;height:16px;flex-shrink:0;padding:0;margin:0;accent-color:var(--todo);cursor:pointer;border-radius:var(--radius-sm);transition:box-shadow var(--transition-fast)}.settings-modal input[type=checkbox]:focus-visible{box-shadow:var(--focus-ring-strong);outline:none}.settings-modal input[type=checkbox]:disabled{cursor:default}.settings-content .form-group :is(input:not([type=checkbox]),select,textarea),.settings-content :is(.input,.select,.form-input){min-height:38px;box-sizing:border-box;padding:6px 10px;font-size:13px}.settings-content :is(.form-group small,.settings-description,.settings-section-description){max-width:78ch;line-height:1.5;text-wrap:pretty}.settings-nav-item:hover{background:var(--bg);color:var(--text);border-left-color:var(--border)}.settings-nav-item:focus-visible{box-shadow:var(--focus-ring-strong);outline:none}.settings-nav-item.active{background:var(--bg);color:var(--todo);font-weight:600;border-left-color:var(--todo)}.settings-group-header{font-size:var(--font-size-2xs);font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);padding:var(--space-md) var(--space-md) var(--space-xs);margin-top:var(--space-sm);user-select:none}.settings-group-header:first-child{margin-top:0}.settings-content{flex:1;overflow-x:hidden;overflow-y:auto;padding:var(--space-md) var(--space-xl) var(--space-lg);scrollbar-color:var(--border) transparent;scrollbar-width:thin}.settings-content[data-show-advanced=false] :is(.form-group:has(#globalGitlabApiBaseUrl),.form-group:has(#persistAgentToolOutput),.form-group:has(#persistAgentThinkingLogPermanent),.form-group:has(#fnBinaryCheckEnabled),.form-group:has(#updateCheckFrequency),.form-group:has(#autoReloadOnVersionChange),.form-group:has(#taskDetailChatFirst),.form-group:has(#sessionBannersHidden),.form-group:has(#failureNotificationDelayMs),.form-group:has(#webhookFormat),.form-group:has(#allowAbsoluteFileBrowserPaths),.form-group:has(#operationalLogRetentionDays),.form-group:has(#chatRoomRecentVerbatimMessages),.form-group:has(#chatRoomCompactionFetchLimit),.form-group:has(#chatRoomSummaryMaxChars),.form-group:has(#capacityRiskTodoThresholdGeneral),.form-group:has(#githubTrackingDedupEnabled),.form-group:has(#gitlabApiBaseUrl),.form-group:has(#worktreeInitCommand),.form-group:has(#recycleWorktrees),.form-group:has(#showWorktreeGrouping),.form-group:has(#worktree-copy-files-list),.form-group:has(#executorAllowSiblingBranchRename),.form-group:has(#worktreeNaming),.form-group:has(#worktreesDir),.form-group:has(#worktreeRebaseRemote),.form-group:has(#worktreeRebaseLocalBase),.form-group:has(#worktrunkBinaryPath),.form-group:has(#worktrunkOnFailure),.form-group:has(#pollIntervalMs),.form-group:has(#heartbeatScopeDiscipline),.form-group:has(#taskStuckTimeoutMs),.form-group:has(#buildTimeoutMs),.form-group:has(#staleHighFanoutBlockerAgeThresholdMs),.form-group:has(#preserveProgressOnStuckRequeue),.form-group:has(#specStalenessEnabled),.form-group:has(#specStalenessMaxAgeMs),.form-group:has(#autoArchiveDoneAfterMs),.form-group:has(#archiveAgentLogMode),.form-group:has(#autoArchiveDuplicateTasksEnabled),.form-group:has(#maxStuckKills),.form-group:has(#ignoreHiddenOverlapPaths),.form-group:has(.settings-overlap-ignore-row),.form-group:has(#maxAutoMergeRetries),#legacy-automerge-stamp-cleanup-panel,.form-group:has(#mergerMaxReviewPasses),.form-group:has(#mergerAllowDirtyLocalCheckoutSync),.form-group:has(#testMode),.form-group:has(#directMergeCommitStrategy),.form-group:has(#mergeIntegrationWorktree),.form-group:has(#mergeAdvanceAutoSync),.form-group:has(#commitAuthorEnabled),.form-group:has(#commitAuthorName),.form-group:has(#commitAuthorEmail),.form-group:has(#autoResolveConflicts),.form-group:has(#smartConflictResolution),.form-group:has(#mergeConflictStrategy),.form-group:has(#mergeStrategyOverlapBehavior),.form-group:has(#postMergeAuditMode),.form-group:has(#pushAfterMerge),.form-group:has(#pushRemote),.form-group:has(#project-model-lane-title-summarizer-fallback),.form-group:has(#autoSelectModelPreset),.form-group:has(#autoSummarizeTitles),.form-group:has(#useAiMergeCommitSummary),.form-group:has(#prTitlePromptInstructions),.form-group:has(#prDescriptionPromptInstructions),.model-pricing-section,details:has(#openrouterAppAttributionReferer),.form-group:has(#openrouterModelSync),.form-group:has(#opencodeGoModelSync)){display:none}.settings-content::-webkit-scrollbar{width:6px}.settings-content::-webkit-scrollbar-track{background:transparent}.settings-content::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-sm)}.settings-content::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.settings-content>*{animation:settingsFadeIn var(--duration-normal) ease}@keyframes settingsFadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.settings-section-heading{font-size:var(--font-size-sm);font-weight:600;padding:var(--space-lg) 0 var(--space-md);margin:0 0 var(--space-md);color:var(--text)}.settings-content>.settings-section-heading:first-child,.settings-modal-section>.settings-section-heading:first-child{padding-top:var(--space-md)}.settings-section-heading--spaced{margin-top:var(--space-lg)}.settings-section-description{margin:0;margin-bottom:var(--space-sm);color:var(--text-muted);font-size:var(--font-size-sm);line-height:1.5}.settings-plugins-subsection-toggle{display:inline-flex;gap:var(--space-xs);margin:var(--space-md) 0}.settings-plugins-subsection-btn{display:inline-flex;align-items:center;justify-content:center;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-pill);background:var(--surface);color:var(--text-muted);font-size:var(--font-size-sm);font-weight:600;padding:var(--space-xs) var(--space-md);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast),box-shadow var(--transition-fast)}.settings-plugins-subsection-btn:hover{background:var(--surface-hover, color-mix(in srgb, var(--text) 6%, transparent));color:var(--text)}.settings-plugins-subsection-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.settings-plugins-subsection-btn.active{background:color-mix(in srgb,var(--todo) 14%,transparent);border-color:color-mix(in srgb,var(--todo) 45%,var(--border));color:var(--todo)}.settings-plugins-subsection-panel{padding-bottom:var(--space-md)}.settings-scope-icon{inline-size:var(--space-md);block-size:var(--space-md);flex:0 0 var(--space-md);margin-right:var(--space-xs);color:var(--text-muted)}.settings-note{display:block;padding:0 var(--space-xl);margin-top:var(--space-xs);font-size:var(--font-size-xs);color:var(--text-muted)}.form-inline-group{display:flex;align-items:center;gap:var(--space-sm)}.form-inline-group .input{flex:1;min-width:0}.btn-link{background:none;border:none;padding:0;font-size:var(--font-size-xs);color:var(--accent, #4a90e2);cursor:pointer;text-decoration:underline;white-space:nowrap}.btn-link:hover{text-decoration:none}.settings-overlap-ignore-group code{font-family:var(--font-mono);font-size:var(--font-size-sm)}.settings-button-row{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin-top:var(--space-sm)}.settings-raw-output{margin:var(--space-sm) 0 0;padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text-muted);max-height:calc(var(--space-2xl) * 7);overflow:auto;font-family:var(--font-mono);font-size:var(--font-size-xs)}.settings-url-output{display:block;margin-top:var(--space-xs);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text-muted);font-family:var(--font-mono);font-size:var(--font-size-xs);overflow-wrap:anywhere;word-break:break-word;overflow-x:auto;max-width:100%}.settings-qr-preview{margin-top:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-sm)}.settings-qr-preview-label{margin:0;font-size:var(--font-size-xs);color:var(--text-muted)}.settings-qr-preview-image-wrap{width:fit-content;max-width:100%;padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--card)}.settings-qr-preview-image{display:block;width:min(calc(var(--space-2xl) * 6),100%);height:auto;aspect-ratio:1 / 1}.remote-provider-selector{display:flex;gap:var(--space-xs);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);padding:var(--space-xs);background:var(--surface)}.remote-provider-option{position:relative;flex:1;cursor:pointer}.remote-provider-option input{position:absolute;opacity:0;width:0;height:0}.remote-provider-option span{display:block;padding:var(--space-sm) var(--space-md);text-align:center;border-radius:var(--radius-sm);border:var(--btn-border-width) solid transparent;color:var(--text-muted);transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.remote-provider-option-content{display:inline-flex;align-items:center;gap:var(--space-xs)}.remote-provider-option input:checked+span{background:var(--card);color:var(--text);border-color:var(--border)}.remote-provider-option input:focus-visible+span{box-shadow:var(--focus-ring-strong)}.remote-status-bar{--status-color: var(--text-muted);display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-md);margin:0 var(--space-xl) var(--space-md);background:color-mix(in srgb,var(--status-color) 10%,transparent)}.remote-status-bar--running{--status-color: var(--color-success)}.remote-status-bar--starting{--status-color: var(--color-warning)}.remote-status-bar--error{--status-color: var(--color-error)}.remote-status-bar--stopped{--status-color: var(--text-muted)}.remote-share-block{display:flex;flex-direction:column;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--text-muted) 5%,transparent)}.remote-share-row{display:flex;flex-direction:column;gap:var(--space-xs)}.remote-share-row .settings-qr-preview-image{margin-top:var(--space-xs)}.remote-status-dot{width:var(--space-sm);height:var(--space-sm);border-radius:50%;display:inline-block;flex-shrink:0}.remote-status-dot--running{background:var(--color-success)}.remote-status-dot--starting{background:var(--color-warning)}.remote-status-dot--error{background:var(--color-error)}.remote-status-dot--stopped{background:var(--text-muted)}.remote-status-url{margin-left:auto;font-family:var(--font-mono);overflow-wrap:anywhere;word-break:break-word;user-select:all}.remote-provider-settings{display:flex;flex-direction:column;gap:var(--space-sm)}.remote-cli-detection{display:flex;align-items:flex-start;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm)}.remote-cli-detection--available{background:color-mix(in srgb,var(--color-success) 10%,transparent);color:var(--color-success)}.remote-cli-detection--missing{background:color-mix(in srgb,var(--color-warning) 10%,transparent);color:var(--color-warning)}.remote-cli-detection-content{display:flex;flex-direction:column;gap:var(--space-xs);color:var(--text)}.remote-cli-detection .btn{align-self:flex-start}.remote-cli-install-error{color:var(--color-error)}.remote-cli-manual{color:var(--text-dim)}.remote-external-tunnel-panel{display:flex;flex-direction:column;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--color-info) 10%,transparent)}.remote-external-tunnel-header{display:flex;align-items:center;gap:var(--space-sm);color:var(--color-info)}.remote-external-tunnel-qr{display:flex;flex-direction:column;gap:var(--space-xs)}.remote-external-tunnel-actions{display:flex;flex-direction:column;gap:var(--space-sm)}.remote-advanced-details{margin:var(--space-lg) var(--space-xl) 0;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);background:var(--surface)}.remote-advanced-details>summary{cursor:pointer;color:var(--text-muted);font-size:var(--font-size-xs);list-style:none}.remote-advanced-details>summary::-webkit-details-marker{display:none}.remote-advanced-details>summary:before{content:"▸";margin-right:var(--space-xs)}.remote-advanced-details[open]>summary:before{content:"▾"}.settings-option-details{margin-top:var(--space-xs)}.settings-research-provider-group{display:flex;flex-direction:column;gap:var(--space-sm);min-width:0}.settings-research-provider-advanced-details{min-width:0;padding-inline-start:var(--space-md)}.settings-research-provider-advanced-body{display:flex;flex-direction:column;gap:var(--space-sm);min-width:0;padding-top:var(--space-sm)}.settings-research-provider-advanced-body>.form-group{margin-top:0;padding:0;min-width:0}.settings-research-provider-advanced-body .input{width:100%;min-width:0}.settings-research-empty-state{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm);min-width:0}@media(max-width:768px){.settings-research-provider-advanced-details{padding-inline-start:0}}.settings-option-details>summary{cursor:pointer;color:var(--text-muted);font-size:var(--font-size-xs);list-style:none}.settings-option-details>summary::-webkit-details-marker{display:none}.settings-option-details>summary:before{content:"▸";margin-right:var(--space-xs)}.settings-option-details[open]>summary:before{content:"▾"}.settings-gitlab-disclosure{display:flex;flex-direction:column;gap:var(--space-sm);margin:var(--space-md) var(--space-xl) 0;padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--surface-secondary)}.settings-gitlab-disclosure>summary{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md);cursor:pointer;list-style:none;color:var(--text-primary)}.settings-gitlab-disclosure>summary::-webkit-details-marker{display:none}.settings-gitlab-disclosure>summary:before{content:"▸";color:var(--text-muted)}.settings-gitlab-disclosure[open]>summary:before{content:"▾"}.settings-gitlab-disclosure__title{flex:1 1 auto;font-weight:var(--font-weight-semibold);min-width:0}.settings-gitlab-disclosure__toggle{flex:0 0 auto}.settings-gitlab-disclosure__body{display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-sm);min-width:0}.settings-gitlab-disclosure__body>.form-group{margin-top:0;padding:0}@media(max-width:768px){.settings-gitlab-disclosure{margin-inline:var(--space-sm);padding:var(--space-sm)}.settings-gitlab-disclosure>summary{align-items:flex-start;flex-wrap:wrap;gap:var(--space-sm)}.settings-gitlab-disclosure__toggle{flex-basis:100%}}.remote-cf-advanced-details{margin-top:var(--space-xs)}.remote-cf-advanced-details>summary{cursor:pointer;color:var(--text-muted);font-size:var(--font-size-xs);list-style:none}.remote-cf-advanced-details>summary::-webkit-details-marker{display:none}.remote-cf-advanced-details>summary:before{content:"▸";margin-right:var(--space-xs)}.remote-cf-advanced-details[open]>summary:before{content:"▾"}.remote-cf-advanced-fields{display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-sm)}.remote-tunnel-actions{margin-top:var(--space-md)}.remote-tunnel-actions .btn{width:100%}.settings-overlap-ignore-list{display:flex;flex-direction:column;gap:var(--space-sm);margin:var(--space-sm) 0}.settings-overlap-ignore-row,.settings-overlap-ignore-path-controls{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--space-sm);align-items:center}.settings-overlap-path-picker-modal{max-width:min(960px,calc(100vw - var(--space-2xl)))}.settings-overlap-path-picker-body{display:flex;flex-direction:column;gap:var(--space-sm);max-height:min(70vh,720px)}.settings-overlap-path-picker-note{margin:0;font-size:var(--font-size-xs);color:var(--text-muted)}.settings-section-divider{border-top:1px solid var(--border);margin:var(--space-lg) var(--space-xl)}.settings-reset-dialog__choice{display:flex;flex-direction:column;gap:var(--space-xs);margin-block-end:var(--space-md)}.settings-reset-dialog__choice-btn{align-self:flex-start;width:100%}.settings-reset-dialog__ineligible-reason{color:var(--text-muted)}@media(max-width:768px){.settings-reset-dialog{max-width:calc(100vw - var(--space-md))}.settings-reset-dialog__choice-btn{width:100%}}@media(max-width:768px){.settings-note{padding:0 var(--space-sm)}.settings-overlap-ignore-row,.settings-overlap-ignore-path-controls{grid-template-columns:minmax(0,1fr)}.settings-overlap-ignore-row>.btn{justify-self:start}.settings-overlap-path-picker-modal{max-width:calc(100vw - var(--space-md))}.remote-provider-selector{flex-direction:column}.remote-status-bar{flex-wrap:wrap;margin:0 var(--space-sm) var(--space-sm)}.remote-share-block{margin:0 var(--space-sm) var(--space-sm)}.remote-status-url{width:100%;margin-left:0;font-size:var(--font-size-xs)}.remote-provider-option,.remote-tunnel-actions .btn{min-height:36px}.remote-cli-detection,.remote-external-tunnel-panel{margin:0 var(--space-sm) var(--space-sm)}}.ntfy-advanced-disclosure{margin-top:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.ntfy-advanced-disclosure>summary{cursor:pointer;list-style:none;padding:var(--space-sm) var(--space-md);font-size:var(--font-size-xs);font-weight:600;color:var(--text)}.ntfy-advanced-disclosure>summary::-webkit-details-marker{display:none}.ntfy-advanced-content{padding:0 var(--space-md) var(--space-md);display:flex;flex-direction:column;gap:var(--space-sm)}.settings-inline-link{color:var(--todo);text-decoration:none;transition:text-decoration var(--transition-fast)}.settings-inline-link:hover{text-decoration:underline}.settings-inline-link:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.notification-provider-card{border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-lg);background:var(--surface);margin:0 var(--space-xl) var(--space-lg);overflow:hidden}.notification-provider-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);border-bottom:var(--btn-border-width) solid var(--border)}.notification-provider-body{padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-lg)}.notification-provider-actions{display:flex;flex-wrap:wrap;gap:var(--space-sm);padding-top:var(--space-md);border-top:var(--btn-border-width) solid var(--border);margin-top:var(--space-md)}.notification-test-feedback{display:flex;flex-direction:column;gap:var(--space-xs);margin-top:var(--space-sm)}.notification-test-feedback-item{border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-sm);padding:var(--space-xs) var(--space-sm)}.notification-test-feedback-item--success{border-color:color-mix(in srgb,var(--color-success) 45%,var(--border));background:color-mix(in srgb,var(--color-success) 8%,transparent);color:var(--color-success)}.notification-test-feedback-item--error{border-color:color-mix(in srgb,var(--color-error) 45%,var(--border));background:color-mix(in srgb,var(--color-error) 8%,transparent);color:var(--color-error)}@media(max-width:768px){.notification-provider-actions{flex-direction:column}.notification-provider-actions .btn{width:100%}}.memory-status-message{display:flex;gap:var(--space-md);align-items:center;justify-content:space-between;margin-bottom:var(--space-md)}.memory-status-message span{min-width:0}.memory-retrieval-test{margin-top:var(--space-lg)}.memory-test-result{margin:0 var(--space-xl) var(--space-lg);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.memory-test-result strong,.memory-test-result span{color:var(--text);font-size:var(--font-size-xs)}.memory-test-result small{display:block;margin-top:var(--space-xs);color:var(--text-muted);font-size:var(--font-size-xs)}.memory-test-result ul{margin:var(--space-md) 0 0;padding:0;list-style:none}.memory-test-result li{padding-top:var(--space-sm);border-top:var(--btn-border-width) solid var(--border)}.memory-test-result li+li{margin-top:var(--space-sm)}.memory-test-result p{margin:var(--space-xs) 0 0;color:var(--text-muted);font-size:var(--font-size-xs);line-height:1.5;overflow-wrap:anywhere}.memory-editor-section{margin-top:var(--space-lg);display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.memory-editor-form-group{display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.memory-file-summary{display:grid;grid-template-columns:auto minmax(0,1fr);gap:var(--space-xs) var(--space-md);align-items:center;margin:0 var(--space-xl) var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.memory-file-summary span{display:inline-flex;align-items:center;justify-content:center;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-pill);color:var(--color-info);background:color-mix(in srgb,var(--color-info) 12%,transparent);font-size:var(--font-size-2xs);font-weight:600}.memory-file-summary strong{min-width:0;overflow-wrap:anywhere;color:var(--text);font-family:var(--font-mono);font-size:var(--font-size-xs)}.memory-file-summary small{grid-column:2;color:var(--text-muted);font-size:var(--font-size-xs)}.memory-editor-frame{min-height:50vh;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);overflow:hidden;display:flex;flex:1 1 auto;flex-direction:column;min-width:0}.auth-panel-body{padding-inline:var(--space-md)}.auth-section-hint{padding:var(--space-md) var(--space-lg);margin-bottom:var(--space-md);background:var(--bg-tertiary);border-radius:var(--radius-md);font-size:var(--font-size-sm);color:var(--text-muted);border-left:3px solid var(--text-muted)}.auth-provider-group{margin-bottom:calc(var(--space-sm) + var(--space-xs) / 2)}.auth-group-label{font-size:var(--font-size-2xs);font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-muted);margin-bottom:var(--space-xs);padding:0 4px}.auth-provider-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-xs);overflow:hidden;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.auth-provider-card:hover{border-color:var(--text-dim)}.auth-provider-card--authenticated{border-color:color-mix(in srgb,var(--color-success) 40%,var(--border));background:color-mix(in srgb,var(--color-success) 5%,var(--surface))}.auth-provider-card--authenticated:hover{border-color:color-mix(in srgb,var(--color-success) 60%,var(--border))}.auth-provider-header{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--space-sm) var(--space-md);gap:12px}.auth-provider-info{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}.auth-provider-info strong{font-weight:500;color:var(--text)}.auth-provider-icon-slot{display:inline-flex;align-items:center;justify-content:center;inline-size:calc(var(--space-md) + var(--space-xs) * 2);block-size:calc(var(--space-md) + var(--space-xs) * 2);flex-shrink:0}.auth-provider-icon-slot .provider-icon{display:inline-flex}.auth-hint{display:block;padding:12px 4px 0;font-size:var(--font-size-xs);color:var(--text-muted);border-top:1px solid var(--border);margin-top:8px}.auth-apikey-section{display:flex;flex-direction:column;gap:var(--space-xs);align-items:flex-end;flex-shrink:0}.auth-apikey-input-row{display:flex;gap:6px;align-items:center}.auth-apikey-input{background:var(--surface-1);border:1px solid var(--border);border-radius:6px;color:var(--text);padding:6px 10px;font-size:var(--font-size-sm);width:180px;font-family:monospace}.auth-apikey-input:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.auth-apikey-input:disabled{opacity:.6}.auth-apikey-progress{font-size:var(--font-size-xs);color:var(--text-muted);padding-right:4px}.auth-apikey-error{font-size:var(--font-size-2xs);color:var(--color-error);padding-right:4px}.auth-provider-actions-row{display:flex;width:100%;align-items:center;gap:var(--space-sm)}.auth-device-code-panel{width:100%;margin-top:var(--space-sm);padding:var(--space-sm);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 85%,transparent);display:flex;flex-direction:column;gap:var(--space-sm)}.auth-device-code-pill{font-family:var(--font-mono);font-size:var(--font-size-sm);letter-spacing:var(--space-xs);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-pill);border:var(--btn-border-width) solid var(--border);background:var(--card);color:var(--text);display:flex;align-self:stretch}.auth-key-hint{font-family:var(--font-mono);font-size:var(--font-size-xs);color:var(--text-muted);display:inline-block;margin-top:var(--space-xs);user-select:none}.settings-lane-badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:var(--font-size-2xs);font-weight:500;white-space:nowrap}.settings-lane-badge--override{background-color:color-mix(in srgb,var(--todo) 20%,transparent);color:var(--todo)}.settings-lane-badge--inherited{background-color:color-mix(in srgb,var(--text-muted) 15%,transparent);color:var(--text-muted)}.settings-scope-group{margin-top:var(--space-md)}.settings-scope-group-header{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm)}.settings-scope-group-header .settings-section-heading{padding-bottom:0;margin-bottom:0}.settings-scope-badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:var(--font-size-2xs);font-weight:500;white-space:nowrap}.settings-scope-badge--global{background-color:color-mix(in srgb,var(--accent, #4a90e2) 18%,transparent);color:var(--accent, #4a90e2)}.settings-scope-badge--project{background-color:color-mix(in srgb,var(--text-muted) 15%,transparent);color:var(--text-muted)}.settings-scope-caption{display:block;margin:var(--space-xs) 0 var(--space-md);color:var(--text-muted);font-size:var(--font-size-xs);line-height:1.4}.settings-description{font-size:var(--font-size-sm);color:var(--text-dim);padding-inline:var(--space-xl);margin-block:0 var(--space-md);line-height:1.5}.settings-token-cap-row{display:flex;align-items:center;gap:var(--space-sm)}.settings-model-lane-label-row{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-xs)}.settings-model-lane-control-row{display:flex;align-items:center;gap:var(--space-sm)}.settings-model-lane-control-main{flex:1}.settings-model-lane-actions{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm);padding:var(--space-md) var(--space-xl) var(--space-lg);margin-block:var(--space-sm) var(--space-lg);border-bottom:var(--btn-border-width) solid var(--border)}.settings-error{color:var(--color-error)}.settings-summarization-actions{justify-content:flex-start}.settings-model-presets{display:flex;flex-direction:column;gap:var(--space-md)}.settings-preset-list{display:flex;flex-direction:column;gap:var(--space-sm)}.settings-preset-item{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.settings-preset-item-meta{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.settings-preset-item-meta strong{color:var(--text);overflow-wrap:anywhere}.settings-preset-summary{font-size:var(--font-size-xs);overflow-wrap:anywhere}.settings-preset-item-actions{display:flex;gap:var(--space-xs);flex-wrap:wrap;justify-content:flex-end}.settings-preset-actions{display:flex;justify-content:flex-start}.settings-preset-editor{display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 85%,var(--card))}.settings-preset-editor-fields{display:flex;flex-direction:column;gap:var(--space-sm)}.settings-preset-editor .form-group{padding:0}.settings-preset-editor-actions{justify-content:flex-start;margin-top:0;padding:0}.settings-preset-auto-select{margin-top:var(--space-sm)}.settings-preset-size-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--space-sm)}.settings-preset-size-row{padding:0}@media(max-width:768px){.settings-layout{flex-direction:column;min-height:0}.settings-navigation{width:100%;min-width:0;flex:0 0 auto;border-right:none;border-bottom:var(--btn-border-width) solid var(--border);background:var(--surface)}.settings-nav-resize-handle{display:none}.settings-search{padding:var(--space-sm) var(--space-md) var(--space-sm)}.settings-advanced-toggle{padding:0 var(--space-md) var(--space-sm);border-bottom:none}.settings-search-toggle{--settings-search-toggle-touch-target: calc(var(--space-lg) + var(--space-lg) + var(--space-xs));display:inline-flex;align-items:center;justify-content:center;width:var(--settings-search-toggle-touch-target);height:var(--settings-search-toggle-touch-target);flex-shrink:0}.settings-search-row{margin-top:var(--space-xs)}.settings-search-input-wrap{align-items:stretch}.settings-search-input{font-size:16px}.settings-mobile-section-picker{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm) var(--space-md) var(--space-md);border-bottom:none;background:var(--surface)}.settings-mobile-section-picker-control-row{display:flex;align-items:center;gap:var(--space-xs);min-width:0}.settings-mobile-section-picker select,.settings-mobile-section-picker .settings-search-empty-hint{flex:1 1 auto;min-width:0;width:100%}.settings-mobile-section-picker select:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.settings-sidebar{display:none}.settings-nav-item{display:flex;align-items:center;justify-content:center;gap:var(--space-xs);border-left:none;border-bottom:2px solid transparent;border-radius:var(--radius-md) var(--radius-md) 0 0;padding:calc(var(--space-xs) + var(--space-xs) / 2) var(--space-md);white-space:nowrap}.settings-nav-item:hover{border-left-color:transparent;border-bottom-color:var(--border)}.settings-nav-item.active{border-left-color:transparent;border-bottom-color:var(--todo)}.settings-group-header{display:none}.notification-provider-card{margin:0 var(--space-sm) var(--space-sm)}.notification-provider-header{padding:var(--space-sm) var(--space-md)}.notification-provider-body{padding:var(--space-md)}.settings-scope-icon{margin-right:0}.settings-content{flex:1;min-height:0;overflow-x:hidden;overflow-y:auto;padding:var(--space-md) var(--space-md) var(--space-lg)}.settings-content .form-group small{overflow-wrap:break-word;word-break:normal}.settings-content input,.settings-content select,.settings-content textarea{font-size:16px}.settings-section-heading{padding:var(--space-md) 0 var(--space-sm);margin:0 0 var(--space-sm)}.settings-plugins-subsection-toggle{display:flex;width:100%;padding:0 var(--space-sm)}.settings-plugins-subsection-btn{flex:1;min-height:36px}.settings-plugins-subsection-panel{padding-left:var(--space-sm);padding-right:var(--space-sm)}.form-group{padding:0}.memory-editor-frame{min-height:65vh}.memory-file-summary{grid-template-columns:1fr;margin:0 var(--space-sm) var(--space-sm);padding:var(--space-sm)}.memory-status-message{align-items:stretch;flex-direction:column}.memory-file-summary span{justify-content:flex-start}.memory-file-summary small{grid-column:auto}.settings-description{padding:0}.settings-empty-state{padding:var(--space-sm)}.theme-selector{padding:0 var(--space-sm) var(--space-sm)}.settings-model-lane-actions{align-items:stretch;flex-direction:column;margin-block:var(--space-xs) var(--space-md);padding:var(--space-sm) var(--space-sm) var(--space-md)}.settings-content .btn,.settings-preset-item-actions .btn{min-height:36px}.auth-provider-row{flex-wrap:wrap;padding:var(--space-sm);gap:var(--space-sm)}.auth-section-hint{margin:0 var(--space-sm) var(--space-sm);padding:var(--space-sm)}.auth-provider-group{margin-bottom:var(--space-sm)}.auth-group-label{padding:0 var(--space-sm)}.auth-provider-card{margin:0 var(--space-sm) var(--space-sm)}.auth-panel-body{padding-inline:0}.auth-panel-body .auth-section-hint{margin:0 0 var(--space-sm)}.auth-panel-body .auth-group-label{padding:0}.auth-panel-body .auth-provider-card{margin:0 0 var(--space-sm)}.auth-provider-header{flex-wrap:wrap;padding:var(--space-sm);gap:var(--space-sm)}.auth-provider-header>div:not(.auth-provider-info):not(.auth-apikey-section){margin-left:auto}.auth-provider-actions-row{width:100%;justify-content:flex-end}.auth-device-code-panel{width:100%}.auth-device-code-pill{max-width:100%;overflow-wrap:anywhere}.auth-provider-info{width:100%;flex-basis:100%}.auth-apikey-section{width:100%;flex-basis:100%;align-items:flex-end}.auth-apikey-input-row{width:100%;flex-wrap:wrap;justify-content:flex-end}.auth-apikey-input{flex:1;min-width:120px;width:auto}.auth-apikey-input-row .btn{flex-shrink:0;margin-left:auto}.auth-hint{padding:var(--space-sm) var(--space-sm) 0}.settings-model-presets{gap:var(--space-sm)}.settings-preset-item{flex-direction:column;align-items:stretch;padding:var(--space-sm)}.settings-preset-item-actions{justify-content:flex-start}.settings-preset-editor{padding:var(--space-sm)}.settings-preset-editor-actions{flex-wrap:wrap}.settings-preset-size-grid{grid-template-columns:1fr;gap:var(--space-xs)}.settings-node-routing-note{padding:var(--space-sm);font-size:var(--font-size-xs)}}.settings-node-routing-note{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md) var(--space-lg);margin-top:var(--space-sm);color:var(--text-muted);font-size:var(--font-size-sm);line-height:1.5}.settings-node-status{display:inline-flex;align-items:center;gap:var(--space-xs);margin-top:var(--space-sm);font-size:var(--font-size-xs);color:var(--text-muted)}.auth-advanced-disclosure{margin-top:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.auth-advanced-disclosure>summary{cursor:pointer;padding:var(--space-sm) var(--space-md)}.auth-advanced-content{display:flex;flex-direction:column;gap:var(--space-sm);padding:0 var(--space-md) var(--space-md)}.auth-custom-provider-item{display:flex;justify-content:space-between;align-items:center;gap:var(--space-sm)}.auth-custom-provider-actions{display:flex;gap:var(--space-sm)}.settings-warning-banner{margin-top:var(--space-sm);padding:var(--space-sm) var(--space-md);border:1px solid var(--color-warning);border-radius:var(--radius-md);background:color-mix(in srgb,var(--color-warning) 12%,transparent);color:var(--text);font-size:var(--font-size-sm);line-height:1.4}.settings-warning-banner strong{color:var(--color-warning);margin-right:var(--space-xs)}.settings-sync-workflow-note{margin-top:var(--space-md);font-size:var(--font-size-sm);color:var(--text-muted)}@media(max-width:768px){.auth-custom-provider-item{flex-direction:column;align-items:flex-start}.settings-warning-banner{padding:var(--space-sm)}}.shortcut-category{margin-top:var(--space-lg)}.shortcut-category:first-of-type{margin-top:0}.shortcut-row{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm) 0;border-bottom:1px solid var(--color-border)}.shortcut-row:last-child{border-bottom:0}.shortcut-capture{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap}.shortcut-capture__input{flex:1 1 auto;min-width:0}.shortcut-capture__input--invalid{border-color:var(--color-error)}.shortcut-capture__record,.shortcut-capture__clear{flex-shrink:0;white-space:nowrap}.shortcut-capture__record--active{color:var(--color-warning)}.shortcut-conflict-banner{color:var(--color-error)}@media(max-width:768px){.shortcut-capture{flex-direction:column;align-items:stretch}.shortcut-capture__input{width:100%}}
|