@runfusion/fusion 0.73.0-beta.4 → 0.73.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/bin.js +3542 -1624
  2. package/dist/child-process-worker.js +2021 -789
  3. package/dist/client/.vite/manifest.json +261 -261
  4. package/dist/client/assets/{AgentDetailView-BBOL6AgZ.js → AgentDetailView-BksUqG3-.js} +4 -4
  5. package/dist/client/assets/AgentDetailView-CoeSgMXS.css +1 -0
  6. package/dist/client/assets/AgentPermissionPolicyEditor-CXib-igK.css +1 -0
  7. package/dist/client/assets/{AgentPermissionPolicyEditor-DV7OPUhR.js → AgentPermissionPolicyEditor-uXItB9Br.js} +1 -1
  8. package/dist/client/assets/AgentsView-m8J2hu5I.js +24 -0
  9. package/dist/client/assets/{ChatView-DwVjnxM8.js → ChatView-DsAg47W3.js} +3 -3
  10. package/dist/client/assets/{CommandCenter-DYWaoYFD.js → CommandCenter-DHt4n__j.js} +1 -1
  11. package/dist/client/assets/{DevServerView-BY5up-NA.js → DevServerView-D7miVumP.js} +1 -1
  12. package/dist/client/assets/{DirectoryPicker-fM8MJa2r.js → DirectoryPicker-C0jXctyL.js} +1 -1
  13. package/dist/client/assets/{DocumentsView-D2KxsPG_.js → DocumentsView-CghLIkD9.js} +1 -1
  14. package/dist/client/assets/{EvalsView-U8dOvTRM.js → EvalsView-MIoF_8pc.js} +1 -1
  15. package/dist/client/assets/{ExperimentalAgentOnboardingModal-C27y8Y-1.js → ExperimentalAgentOnboardingModal-Dz4H4H2a.js} +1 -1
  16. package/dist/client/assets/{GoalsView-D-2wmy-O.js → GoalsView-yPwwGY-D.js} +1 -1
  17. package/dist/client/assets/{InsightsView-zLyuQL_l.js → InsightsView-DP4X2uEa.js} +1 -1
  18. package/dist/client/assets/{MemoryView-D-tSn48u.js → MemoryView-m3ceUV-6.js} +1 -1
  19. package/dist/client/assets/{PiExtensionsManager-DvwmvGEY.js → PiExtensionsManager-KuBkruy9.js} +1 -1
  20. package/dist/client/assets/{PluginManager-BACOwQAN.js → PluginManager-CaQ-dg5n.js} +1 -1
  21. package/dist/client/assets/{PullRequestView-DULyv21u.js → PullRequestView-BPIlRW8u.js} +1 -1
  22. package/dist/client/assets/{ReportModal-CUlKMFWa.js → ReportModal-DanKtCSD.js} +5 -5
  23. package/dist/client/assets/{ResearchView-DM_O3IFc.js → ResearchView-Ch6GjDZD.js} +2 -2
  24. package/dist/client/assets/{SecretsView-Bq3u_nAf.js → SecretsView-DkxXeLAr.js} +1 -1
  25. package/dist/client/assets/{SessionTerminal-D00ByR6U.js → SessionTerminal-BxxAyQqQ.js} +1 -1
  26. package/dist/client/assets/SettingsModal-C2rdGmkE.js +21 -0
  27. package/dist/client/assets/{SettingsModal-QRaBE1ds.js → SettingsModal-Cflm-bXE.js} +1 -1
  28. package/dist/client/assets/{SettingsTextareaRow-CHOJ-qHz.js → SettingsTextareaRow-DPet7lKz.js} +1 -1
  29. package/dist/client/assets/{SetupWizardModal-DriQyd81.js → SetupWizardModal-Bf0WCI07.js} +2 -2
  30. package/dist/client/assets/{SkillsView-BtDyujiZ.js → SkillsView-BDSG7mTv.js} +1 -1
  31. package/dist/client/assets/{TodoView-BNHUnz50.js → TodoView-5nnuGetx.js} +1 -1
  32. package/dist/client/assets/{WorkflowNodeEditor-BXikFpra.js → WorkflowNodeEditor-BwCbQtIT.js} +1 -1
  33. package/dist/client/assets/{agent-import-generation-B2kYEm1O.js → agent-import-generation-DtGkjYSm.js} +1 -1
  34. package/dist/client/assets/app-B1lWYECC.js +13 -0
  35. package/dist/client/assets/{app-B_HrdDXZ.js → app-B5SToHBH.js} +2 -2
  36. package/dist/client/assets/app-C4OYRIp7.js +13 -0
  37. package/dist/client/assets/app-Da8ENc4F.js +13 -0
  38. package/dist/client/assets/app-DlxXzx0y.js +13 -0
  39. package/dist/client/assets/app-yfHAC4cX.js +13 -0
  40. package/dist/client/assets/{architectureDiagram-3BPJPVTR-B-Efjj4Z.js → architectureDiagram-3BPJPVTR-D1K8DpAy.js} +1 -1
  41. package/dist/client/assets/{blockDiagram-GPEHLZMM-CaOVxrlM.js → blockDiagram-GPEHLZMM-CX1y35p9.js} +1 -1
  42. package/dist/client/assets/{c4Diagram-AAUBKEIU-D8aYt5F1.js → c4Diagram-AAUBKEIU-BcbbCnmZ.js} +1 -1
  43. package/dist/client/assets/channel-DU48uM5V.js +1 -0
  44. package/dist/client/assets/{chunk-2J33WTMH-VSDT0J0r.js → chunk-2J33WTMH-Wp3zyvV2.js} +1 -1
  45. package/dist/client/assets/{chunk-4BX2VUAB-Chx1wQgD.js → chunk-4BX2VUAB-BuVwTDYq.js} +1 -1
  46. package/dist/client/assets/{chunk-55IACEB6-MlqjhIJg.js → chunk-55IACEB6-CzvhQEXs.js} +1 -1
  47. package/dist/client/assets/{chunk-727SXJPM-BheQNUi8.js → chunk-727SXJPM-D-MIVOud.js} +1 -1
  48. package/dist/client/assets/{chunk-AQP2D5EJ-C5EoJhfJ.js → chunk-AQP2D5EJ-DbuidBn6.js} +1 -1
  49. package/dist/client/assets/{chunk-FMBD7UC4-B8_8qP3j.js → chunk-FMBD7UC4-uWKtFzDS.js} +1 -1
  50. package/dist/client/assets/{chunk-ND2GUHAM-BuglCGRx.js → chunk-ND2GUHAM-CeSIlejj.js} +1 -1
  51. package/dist/client/assets/{chunk-QZHKN3VN-B7_06dxp.js → chunk-QZHKN3VN-BePmVND-.js} +1 -1
  52. package/dist/client/assets/classDiagram-4FO5ZUOK-BunN9MnY.js +1 -0
  53. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BunN9MnY.js +1 -0
  54. package/dist/client/assets/{cose-bilkent-S5V4N54A-Cm-ZOycx.js → cose-bilkent-S5V4N54A-De9Bj_SA.js} +1 -1
  55. package/dist/client/assets/{dagre-BM42HDAG-Dj_Gwjpv.js → dagre-BM42HDAG-C5CmCySG.js} +1 -1
  56. package/dist/client/assets/{dashboard-view-B4CRL5Fy.js → dashboard-view-CaUSpwyV.js} +1 -1
  57. package/dist/client/assets/{dashboard-view-noD9p0Zs.js → dashboard-view-DsfVW3-8.js} +1 -1
  58. package/dist/client/assets/{dashboard-view-pXXSUxG9.js → dashboard-view-j5rWyrQJ.js} +1 -1
  59. package/dist/client/assets/{diagram-2AECGRRQ-C_9BfShy.js → diagram-2AECGRRQ-DaZNoDA8.js} +1 -1
  60. package/dist/client/assets/{diagram-5GNKFQAL-Cmg2qpCj.js → diagram-5GNKFQAL-BLSbdVaK.js} +1 -1
  61. package/dist/client/assets/{diagram-KO2AKTUF-2FNo2HXb.js → diagram-KO2AKTUF-BSzU_Az3.js} +1 -1
  62. package/dist/client/assets/{diagram-LMA3HP47-DgnVeCp-.js → diagram-LMA3HP47-RsRkbaSM.js} +1 -1
  63. package/dist/client/assets/{diagram-OG6HWLK6-iAIR50HH.js → diagram-OG6HWLK6-ChiWoR2j.js} +1 -1
  64. package/dist/client/assets/{erDiagram-TEJ5UH35-Da4I04eN.js → erDiagram-TEJ5UH35-tJJ6w1wS.js} +1 -1
  65. package/dist/client/assets/{flowDiagram-I6XJVG4X-Bv9r2T0m.js → flowDiagram-I6XJVG4X-BswRtnqd.js} +1 -1
  66. package/dist/client/assets/{folder-open-CwWtrDh6.js → folder-open-DzTYX9Fp.js} +1 -1
  67. package/dist/client/assets/{ganttDiagram-6RSMTGT7-BMeO84U_.js → ganttDiagram-6RSMTGT7-QrrkFyh_.js} +1 -1
  68. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CWDh_RIb.js → gitGraphDiagram-PVQCEYII-4kdeySLk.js} +1 -1
  69. package/dist/client/assets/index-C77ORgtm.css +1 -0
  70. package/dist/client/assets/index-DReijQe4.js +2661 -0
  71. package/dist/client/assets/{infoDiagram-5YYISTIA-BAE4KtCL.js → infoDiagram-5YYISTIA-B8jwktA0.js} +1 -1
  72. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-C_iXAuOy.js → ishikawaDiagram-YF4QCWOH-uZUucrZK.js} +1 -1
  73. package/dist/client/assets/{journeyDiagram-JHISSGLW-BnxSHwDo.js → journeyDiagram-JHISSGLW-CtT0-QvG.js} +1 -1
  74. package/dist/client/assets/{kanban-definition-UN3LZRKU-DYNRm3Nu.js → kanban-definition-UN3LZRKU-BHEP6Q_z.js} +1 -1
  75. package/dist/client/assets/{mermaid.core-B3hvDDep.js → mermaid.core-CyUOdPCI.js} +4 -4
  76. package/dist/client/assets/{mindmap-definition-RKZ34NQL-s7KBEuPD.js → mindmap-definition-RKZ34NQL-BnKIdn6I.js} +1 -1
  77. package/dist/client/assets/{pieDiagram-4H26LBE5-Cy1_IPUD.js → pieDiagram-4H26LBE5-CLlvgGA1.js} +1 -1
  78. package/dist/client/assets/{puzzle-DWc6gFQ7.js → puzzle-Dz37Zb-E.js} +1 -1
  79. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-DqgVGp41.js → quadrantDiagram-W4KKPZXB-D9JMXqPE.js} +1 -1
  80. package/dist/client/assets/{requirementDiagram-4Y6WPE33-CA5-TDeF.js → requirementDiagram-4Y6WPE33-DlA5s0oV.js} +1 -1
  81. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-Cuvi3RgE.js → sankeyDiagram-5OEKKPKP-jZ9qX2PX.js} +1 -1
  82. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-Da3GfmGP.js → sequenceDiagram-3UESZ5HK-PtwRRZmQ.js} +1 -1
  83. package/dist/client/assets/{shield-alert-_iY63ED4.js → shield-alert-BjiTG99h.js} +1 -1
  84. package/dist/client/assets/{standing-instructions-template-CCd2YY9c.js → standing-instructions-template-DJCF_18R.js} +1 -1
  85. package/dist/client/assets/standing-instructions-template-Ddi_4TIk.css +1 -0
  86. package/dist/client/assets/{stateDiagram-AJRCARHV-CZ_I9ENR.js → stateDiagram-AJRCARHV-CUxFPOtf.js} +1 -1
  87. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-BomoRVhY.js → stateDiagram-v2-BHNVJYJU-BZquUTBi.js} +1 -1
  88. package/dist/client/assets/{timeline-definition-PNZ67QCA-C3CYvIuR.js → timeline-definition-PNZ67QCA-HZQcinlS.js} +1 -1
  89. package/dist/client/assets/{upload-D0RrO65v.js → upload-C3LesDmE.js} +1 -1
  90. package/dist/client/assets/{users-CGszBY2v.js → users-DGiK8Vco.js} +1 -1
  91. package/dist/client/assets/{vennDiagram-CIIHVFJN-By9fi8NW.js → vennDiagram-CIIHVFJN-DRSTmg6N.js} +1 -1
  92. package/dist/client/assets/{wardley-L42UT6IY-DErnXPkI.js → wardley-L42UT6IY-DXS5Hs7x.js} +1 -1
  93. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DFfXZVPk.js → wardleyDiagram-YWT4CUSO-CBPGDv2m.js} +1 -1
  94. package/dist/client/assets/{xychartDiagram-2RQKCTM6-9Y5oZ5mi.js → xychartDiagram-2RQKCTM6-Bflc25BH.js} +1 -1
  95. package/dist/client/index.html +2 -2
  96. package/dist/client/version.json +1 -1
  97. package/dist/extension.js +3172 -1073
  98. package/dist/migrations/0000_initial.sql +2 -0
  99. package/dist/migrations/0034_milestone_assertion_provenance.sql +30 -0
  100. package/dist/migrations/0035_fn_8543_mission_lineage_stop.sql +31 -0
  101. package/dist/plugin-sdk/index.js +16 -0
  102. package/package.json +1 -1
  103. package/skill/fusion/references/extension-tools.md +1 -1
  104. package/skill/fusion/references/fusion-capabilities.md +1 -1
  105. package/dist/client/assets/AgentDetailView-C4vItBCo.css +0 -1
  106. package/dist/client/assets/AgentPermissionPolicyEditor-TpdlOWZW.css +0 -1
  107. package/dist/client/assets/AgentsView-B6xoAHyV.js +0 -24
  108. package/dist/client/assets/SettingsModal-Bb3pIxiX.js +0 -21
  109. package/dist/client/assets/app-C6yo-M_n.js +0 -13
  110. package/dist/client/assets/app-CH8ZgPm4.js +0 -13
  111. package/dist/client/assets/app-D4DpgDss.js +0 -13
  112. package/dist/client/assets/app-Qv0blCyY.js +0 -13
  113. package/dist/client/assets/app-kFdtajPy.js +0 -13
  114. package/dist/client/assets/channel-5bPK6pTS.js +0 -1
  115. package/dist/client/assets/classDiagram-4FO5ZUOK-Dv9RQDqG.js +0 -1
  116. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Dv9RQDqG.js +0 -1
  117. package/dist/client/assets/index-CB3mYxAB.css +0 -1
  118. package/dist/client/assets/index-CE7C_XsS.js +0 -2661
  119. package/dist/client/assets/standing-instructions-template-bQJ4X1gH.css +0 -1
@@ -1,21 +1,21 @@
1
- import{r as o,j as e,b as se}from"./vendor-react-SZ_qB27O.js";import{c as L,c_ as re,d1 as Q,a9 as le,C as X,d2 as ne,d3 as oe,q as ce,b1 as ie,bu as he,d4 as A,d5 as de,d6 as Y}from"./index-CE7C_XsS.js";import{u as V}from"./vendor-i18n-GF3RlKbq.js";/**
1
+ import{r as o,j as e,b as se}from"./vendor-react-SZ_qB27O.js";import{c as _,d0 as re,d3 as Q,a9 as le,C as X,d4 as ne,d5 as oe,q as ce,b1 as ie,bu as he,d6 as A,d7 as de,d8 as Y}from"./index-DReijQe4.js";import{u as V}from"./vendor-i18n-GF3RlKbq.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
- */const ue=[["path",{d:"M12 20v-9",key:"1qisl0"}],["path",{d:"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z",key:"uouzyp"}],["path",{d:"M14.12 3.88 16 2",key:"qol33r"}],["path",{d:"M21 21a4 4 0 0 0-3.81-4",key:"1b0z45"}],["path",{d:"M21 5a4 4 0 0 1-3.55 3.97",key:"5cxbf6"}],["path",{d:"M22 13h-4",key:"1jl80f"}],["path",{d:"M3 21a4 4 0 0 1 3.81-4",key:"1fjd4g"}],["path",{d:"M3 5a4 4 0 0 0 3.55 3.97",key:"1d7oge"}],["path",{d:"M6 13H2",key:"82j7cp"}],["path",{d:"m8 2 1.88 1.88",key:"fmnt4t"}],["path",{d:"M9 7.13V6a3 3 0 1 1 6 0v1.13",key:"1vgav8"}]],me=L("bug",ue);/**
6
+ */const ue=[["path",{d:"M12 20v-9",key:"1qisl0"}],["path",{d:"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z",key:"uouzyp"}],["path",{d:"M14.12 3.88 16 2",key:"qol33r"}],["path",{d:"M21 21a4 4 0 0 0-3.81-4",key:"1b0z45"}],["path",{d:"M21 5a4 4 0 0 1-3.55 3.97",key:"5cxbf6"}],["path",{d:"M22 13h-4",key:"1jl80f"}],["path",{d:"M3 21a4 4 0 0 1 3.81-4",key:"1fjd4g"}],["path",{d:"M3 5a4 4 0 0 0 3.55 3.97",key:"1d7oge"}],["path",{d:"M6 13H2",key:"82j7cp"}],["path",{d:"m8 2 1.88 1.88",key:"fmnt4t"}],["path",{d:"M9 7.13V6a3 3 0 1 1 6 0v1.13",key:"1vgav8"}]],me=_("bug",ue);/**
7
7
  * @license lucide-react v1.7.0 - ISC
8
8
  *
9
9
  * This source code is licensed under the ISC license.
10
10
  * See the LICENSE file in the root directory of this source tree.
11
- */const pe=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m4.93 4.93 4.24 4.24",key:"1ymg45"}],["path",{d:"m14.83 9.17 4.24-4.24",key:"1cb5xl"}],["path",{d:"m14.83 14.83 4.24 4.24",key:"q42g0n"}],["path",{d:"m9.17 14.83-4.24 4.24",key:"bqpfvv"}],["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}]],be=L("life-buoy",pe);/**
11
+ */const pe=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m4.93 4.93 4.24 4.24",key:"1ymg45"}],["path",{d:"m14.83 9.17 4.24-4.24",key:"1cb5xl"}],["path",{d:"m14.83 14.83 4.24 4.24",key:"q42g0n"}],["path",{d:"m9.17 14.83-4.24 4.24",key:"bqpfvv"}],["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}]],be=_("life-buoy",pe);/**
12
12
  * @license lucide-react v1.7.0 - ISC
13
13
  *
14
14
  * This source code is licensed under the ISC license.
15
15
  * See the LICENSE file in the root directory of this source tree.
16
- */const we=[["path",{d:"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401",key:"kfwtm"}]],fe=L("moon",we);/**
16
+ */const we=[["path",{d:"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401",key:"kfwtm"}]],fe=_("moon",we);/**
17
17
  * @license lucide-react v1.7.0 - ISC
18
18
  *
19
19
  * This source code is licensed under the ISC license.
20
20
  * See the LICENSE file in the root directory of this source tree.
21
- */const ve=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]],ye=L("sun",ve);async function G(t,i){const l=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!l.ok)throw new Error((await l.json().catch(()=>({error:l.statusText}))).error??l.statusText);return l.json()}function ge(t){return G("/api/report/draft",t)}function Ne(t){return G("/api/report/file",t)}function xe(t){return G("/api/report/help",{question:t})}async function ke(t){const i=new FormData;i.append("screenshot",t,"report-screenshot.png");const l=await fetch("/api/report/attachment",{method:"POST",body:i});if(!l.ok)throw new Error((await l.json().catch(()=>({error:l.statusText}))).error??l.statusText);return l.json()}async function Me(){const t=await fetch("/api/report/discussion-categories");if(!t.ok)throw new Error((await t.json().catch(()=>({error:t.statusText}))).error??t.statusText);return t.json()}function $e(t){const i=new URLSearchParams(t.search),l=t.hash.match(/^#\/tasks\/([^/?#]+)/),h=l?.[1]?decodeURIComponent(l[1]):i.get("taskId")??void 0,u=i.get("agentId")??void 0;return h||u?{taskId:h,agentId:u}:void 0}const J=[{value:"light",label:"Light",icon:ye},{value:"dark",label:"Dark",icon:fe},{value:"system",label:"System",icon:re}],P=[{value:"default",label:"Fusion Legacy",className:"theme-swatch-default"},{value:"ocean",label:"Ocean",className:"theme-swatch-ocean"},{value:"forest",label:"Forest",className:"theme-swatch-forest"},{value:"sunset",label:"Sunset",className:"theme-swatch-sunset"},{value:"zen",label:"Zen",className:"theme-swatch-zen"},{value:"berry",label:"Berry",className:"theme-swatch-berry"},{value:"high-contrast",label:"High Contrast",className:"theme-swatch-high-contrast"},{value:"industrial",label:"Industrial",className:"theme-swatch-industrial"},{value:"monochrome",label:"Mono",className:"theme-swatch-monochrome"},{value:"slate",label:"Slate",className:"theme-swatch-slate"},{value:"ash",label:"Ash",className:"theme-swatch-ash"},{value:"air",label:"Air",className:"theme-swatch-air"},{value:"graphite",label:"Graphite",className:"theme-swatch-graphite"},{value:"silver",label:"Silver",className:"theme-swatch-silver"},{value:"solarized",label:"Solarized",className:"theme-swatch-solarized"},{value:"factory",label:"Factory",className:"theme-swatch-factory"},{value:"factory-mono",label:"Factory Mono",className:"theme-swatch-factory-mono"},{value:"ayu",label:"Ayu",className:"theme-swatch-ayu"},{value:"one-dark",label:"One Dark",className:"theme-swatch-one-dark"},{value:"nord",label:"Nord",className:"theme-swatch-nord"},{value:"dracula",label:"Dracula",className:"theme-swatch-dracula"},{value:"gruvbox",label:"Gruvbox",className:"theme-swatch-gruvbox"},{value:"tokyo-night",label:"Tokyo Night",className:"theme-swatch-tokyo-night"},{value:"catppuccin-mocha",label:"Catppuccin Mocha",className:"theme-swatch-catppuccin-mocha"},{value:"github-dark",label:"GitHub Dark",className:"theme-swatch-github-dark"},{value:"everforest",label:"Everforest",className:"theme-swatch-everforest"},{value:"rose-pine",label:"Rosé Pine",className:"theme-swatch-rose-pine"},{value:"kanagawa",label:"Kanagawa",className:"theme-swatch-kanagawa"},{value:"night-owl",label:"Night Owl",className:"theme-swatch-night-owl"},{value:"palenight",label:"Palenight",className:"theme-swatch-palenight"},{value:"monokai-pro",label:"Monokai Pro",className:"theme-swatch-monokai-pro"},{value:"slime",label:"Slime",className:"theme-swatch-slime"},{value:"brutalist",label:"Brutalist",className:"theme-swatch-brutalist"},{value:"neon-city",label:"Neon City",className:"theme-swatch-neon-city"},{value:"parchment",label:"Parchment",className:"theme-swatch-parchment"},{value:"terminal",label:"Terminal",className:"theme-swatch-terminal"},{value:"glass",label:"Glass",className:"theme-swatch-glass"},{value:"glass-silver",label:"Glass Silver",className:"theme-swatch-glass-silver"},{value:"horizon",label:"Horizon",className:"theme-swatch-horizon"},{value:"vitesse",label:"Vitesse",className:"theme-swatch-vitesse"},{value:"outrun",label:"Outrun",className:"theme-swatch-outrun"},{value:"snazzy",label:"Snazzy",className:"theme-swatch-snazzy"},{value:"porple",label:"Porple",className:"theme-swatch-porple"},{value:"espresso",label:"Espresso",className:"theme-swatch-espresso"},{value:"mars",label:"Mars",className:"theme-swatch-mars"},{value:"poimandres",label:"Poimandres",className:"theme-swatch-poimandres"},{value:"ember",label:"Ember",className:"theme-swatch-ember"},{value:"rust",label:"Rust",className:"theme-swatch-rust"},{value:"copper",label:"Copper",className:"theme-swatch-copper"},{value:"foundry",label:"Foundry",className:"theme-swatch-foundry"},{value:"carbon",label:"Carbon",className:"theme-swatch-carbon"},{value:"sandstone",label:"Sandstone",className:"theme-swatch-sandstone"},{value:"lagoon",label:"Lagoon",className:"theme-swatch-lagoon"},{value:"frost",label:"Frost",className:"theme-swatch-frost"},{value:"lavender",label:"Lavender",className:"theme-swatch-lavender"},{value:"neon-bloom",label:"Neon Bloom",className:"theme-swatch-neon-bloom"},{value:"sepia",label:"Sepia",className:"theme-swatch-sepia"},{value:"cobalt",label:"Cobalt",className:"theme-swatch-cobalt"},{value:"clay",label:"Clay",className:"theme-swatch-clay"},{value:"moss",label:"Moss",className:"theme-swatch-moss"},{value:"aurora",label:"Aurora",className:"theme-swatch-aurora"},{value:"calm",label:"Calm",className:"theme-swatch-calm"},{value:"dawn",label:"Dawn",className:"theme-swatch-dawn"},{value:"shadcn",label:"Shadcn",className:"theme-swatch-shadcn"},{value:"shadcn-ember",label:"Shadcn Ember (Default)",className:"theme-swatch-shadcn-ember"},{value:"shadcn-custom",label:"Shadcn Custom",className:"theme-swatch-shadcn-custom"},{value:"shadcn-blue",label:"Shadcn Blue",className:"theme-swatch-shadcn-blue"},{value:"shadcn-green",label:"Shadcn Green",className:"theme-swatch-shadcn-green"},{value:"shadcn-red",label:"Shadcn Red",className:"theme-swatch-shadcn-red"},{value:"shadcn-purple",label:"Shadcn Purple",className:"theme-swatch-shadcn-purple"},{value:"shadcn-pink",label:"Shadcn Pink",className:"theme-swatch-shadcn-pink"},{value:"shadcn-orange",label:"Shadcn Orange",className:"theme-swatch-shadcn-orange"},{value:"shadcn-yellow",label:"Shadcn Yellow",className:"theme-swatch-shadcn-yellow"},{value:"shadcn-mono",label:"Shadcn Mono",className:"theme-swatch-shadcn-mono"},{value:"shadcn-mono-red",label:"Shadcn Mono Red",className:"theme-swatch-shadcn-mono-red"},{value:"shadcn-mono-blue",label:"Shadcn Mono Blue",className:"theme-swatch-shadcn-mono-blue"},{value:"shadcn-mono-green",label:"Shadcn Mono Green",className:"theme-swatch-shadcn-mono-green"},{value:"shadcn-mono-purple",label:"Shadcn Mono Purple",className:"theme-swatch-shadcn-mono-purple"},{value:"shadcn-mono-pink",label:"Shadcn Mono Pink",className:"theme-swatch-shadcn-mono-pink"},{value:"shadcn-mono-orange",label:"Shadcn Mono Orange",className:"theme-swatch-shadcn-mono-orange"},{value:"shadcn-mono-yellow",label:"Shadcn Mono Yellow",className:"theme-swatch-shadcn-mono-yellow"},{value:"shadcn-black",label:"Shadcn Black",className:"theme-swatch-shadcn-black"},{value:"shadcn-gray",label:"Shadcn Gray",className:"theme-swatch-shadcn-gray"},{value:"shadcn-gray-blue",label:"Shadcn Gray Blue",className:"theme-swatch-shadcn-gray-blue"}];function je(t){const i=t.trim();if(/^#[\da-f]{6}$/i.test(i))return i;if(/^#[\da-f]{3}$/i.test(i)){const[,l,h,u]=i;return`#${l}${l}${h}${h}${u}${u}`}return"#000000"}function Ce({value:t={},onChange:i,resolvedThemeMode:l="dark"}){const{t:h}=V("app"),[u,N]=o.useState(!1),s=o.useId(),p=o.useMemo(()=>Q(t),[t]),d=(n,f)=>{i(Q({...p,[n]:f}))},r=u?h("theme.shadcnCustom.collapse","Collapse custom colors"):h("theme.shadcnCustom.show","Show custom colors"),y=u?le:X;return e.jsxs("section",{className:"shadcn-color-picker card","data-testid":"shadcn-color-picker","aria-labelledby":"shadcn-color-picker-title",children:[e.jsxs("div",{className:"shadcn-color-picker-header",children:[e.jsxs("div",{className:"shadcn-color-picker-heading",children:[e.jsx("h3",{id:"shadcn-color-picker-title",className:"shadcn-color-picker-title",children:h("theme.shadcnCustom.title","Custom shadcn colors")}),e.jsx("p",{className:"shadcn-color-picker-description",children:h("theme.shadcnCustom.description","Override shadcn design tokens with hex colors. Blank tokens use the theme defaults.")})]}),e.jsx("button",{type:"button",className:"btn btn-icon btn-sm shadcn-color-picker-toggle","aria-expanded":u,"aria-controls":s,"aria-label":r,title:r,onClick:()=>N(n=>!n),children:e.jsx(y,{size:16,"aria-hidden":"true"})})]}),u?e.jsxs("div",{id:s,className:"shadcn-color-picker-controls-panel","data-testid":"shadcn-color-picker-controls",children:[e.jsx("div",{className:"shadcn-color-picker-actions",children:e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>i({}),children:h("theme.shadcnCustom.reset","Reset custom colors")})}),e.jsx("div",{className:"shadcn-color-picker-grid",children:ne.map(n=>{const f=oe(n,l),x=p[n.cssVar]??f,v=`shadcn-color-${n.cssVar.replace(/^--/,"").replace(/[^a-z0-9]+/gi,"-")}`;return e.jsxs("div",{className:"shadcn-color-picker-row","data-testid":`shadcn-color-${n.cssVar}`,children:[e.jsxs("label",{className:"shadcn-color-picker-label",htmlFor:v,children:[e.jsx("span",{children:h(`theme.shadcnCustom.token.${n.cssVar}`,n.label)}),e.jsx("code",{children:n.cssVar})]}),e.jsxs("div",{className:"shadcn-color-picker-controls",children:[e.jsx("input",{"aria-label":h("theme.shadcnCustom.colorInput","Pick {{label}} color",{label:n.label}),className:"shadcn-color-picker-native",type:"color",value:je(x),onChange:j=>d(n.cssVar,j.currentTarget.value)}),e.jsx("input",{id:v,"aria-label":h("theme.shadcnCustom.hexInput","{{label}} hex color",{label:n.label}),className:"input shadcn-color-picker-hex",type:"text",inputMode:"text",spellCheck:!1,value:x,onChange:j=>d(n.cssVar,j.currentTarget.value)})]})]},n.cssVar)})})]}):null]})}function Se(t){return P.find(i=>i.value===t)??P[0]}function Z(t){return t.trim().normalize("NFD").replace(/\p{Diacritic}/gu,"").toLocaleLowerCase()}function O({className:t}){return e.jsxs("span",{className:`theme-option-swatch ${t}`,"aria-hidden":"true",children:[e.jsx("span",{className:"theme-option-swatch-sample theme-option-swatch-sample-1"}),e.jsx("span",{className:"theme-option-swatch-sample theme-option-swatch-sample-2"}),e.jsx("span",{className:"theme-option-swatch-sample theme-option-swatch-sample-3"}),e.jsx("span",{className:"theme-option-swatch-sample theme-option-swatch-sample-4"})]})}function _e({colorTheme:t,onColorThemeChange:i,themeMode:l,shadcnCustomColors:h={},resolvedThemeMode:u=l==="light"?"light":"dark",onThemeModeChange:N,onShadcnCustomColorsChange:s=()=>{},triggerVariant:p="compact"}){const{t:d}=V("app"),[r,y]=o.useState(!1),[n,f]=o.useState(""),[x,v]=o.useState(t),[j,S]=o.useState(null),F=o.useRef(null),E=o.useRef(null),R=o.useRef(!1),g=o.useRef([]),M=o.useMemo(()=>Se(t),[t]),z=l==="system"?u:l,$=J.find(a=>a.value===z)?.icon,c=l==="system"?d("theme.system","System"):d(`theme.${l}`,l?`${l.charAt(0).toUpperCase()}${l.slice(1)}`:"Dark"),b=d(`theme.colorTheme.${M.value}`,M.label),D=`${d("theme.currentTheme","Current theme")} ${c} / ${b}`,B="theme-dropdown-listbox",H=o.useMemo(()=>P.map(a=>({...a,displayLabel:d(`theme.colorTheme.${a.value}`,a.label)})),[d]),U=Z(n),m=o.useMemo(()=>H.filter(a=>Z(a.displayLabel).includes(U)),[U,H]),W=m.findIndex(a=>a.value===x),_=()=>{y(!1),f(""),v(t),S(null),R.current=!1,g.current=[]};o.useEffect(()=>{if(!r)return;const a=w=>{F.current&&!F.current.contains(w.target)&&_()};return document.addEventListener("pointerdown",a),()=>document.removeEventListener("pointerdown",a)},[r,t]),o.useEffect(()=>{r&&(m.some(a=>a.value===x)||v(m[0]?.value??null))},[x,m,r]),o.useEffect(()=>{if(r){if(j==="pointer"&&R.current)E.current?.focus(),R.current=!1;else if(j==="keyboard"){const a=m.findIndex(w=>w.value===x);g.current[a]?.focus()}}},[x,m,r,j]);const q=a=>{i(a),_()},K=(a,w)=>{if(a==="pointer")R.current=!0,v(t);else{const I=m.some(C=>C.value===t),k=w==="ArrowUp"?m.at(-1)?.value??null:w==="ArrowDown"?m[0]?.value??null:I?t:m[0]?.value??null;v(k)}S(a),y(!0)},ee=a=>{(a.key==="ArrowDown"||a.key==="ArrowUp"||a.key==="Enter"||a.key===" ")&&(a.preventDefault(),K("keyboard",a.key))},ae=a=>{if(a.key==="Escape"){a.preventDefault(),_();return}if(a.key!=="ArrowDown"&&a.key!=="ArrowUp")return;const w=a.key==="ArrowUp"?m.length-1:Math.max(0,W);w<0||!m[w]||(a.preventDefault(),v(m[w].value),g.current[w]?.focus())},te=(a,w,I)=>{if(a.key==="Escape"){a.preventDefault(),_();return}if(a.key==="ArrowDown"||a.key==="ArrowUp"){a.preventDefault();const k=a.key==="ArrowDown"?1:-1,C=(w+k+m.length)%m.length;v(m[C]?.value??null),g.current[C]?.focus();return}if(a.key==="Home"){a.preventDefault(),v(m[0]?.value??null),g.current[0]?.focus();return}if(a.key==="End"){a.preventDefault();const k=m.length-1;v(m[k]?.value??null),g.current[k]?.focus();return}(a.key==="Enter"||a.key===" ")&&(a.preventDefault(),q(I))};return e.jsxs("div",{className:`theme-dropdown${p==="current-row"?" theme-dropdown--current-row":""}${r?" open":""}`,ref:F,children:[e.jsxs("button",{type:"button",className:`theme-dropdown-trigger btn${p==="current-row"?" theme-dropdown-trigger--current-row":""}`,"aria-label":p==="current-row"?D:void 0,"aria-haspopup":"listbox","aria-expanded":r,"aria-controls":r?B:void 0,onClick:()=>r?_():K("pointer"),onKeyDown:ee,children:[p==="current-row"?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"theme-dropdown-current-row-icon","aria-hidden":"true",children:$?e.jsx($,{size:20}):null}),e.jsxs("span",{className:"theme-dropdown-current-row-info",children:[e.jsx("span",{className:"theme-dropdown-current-row-label",children:d("theme.currentTheme","Current theme")}),e.jsxs("span",{className:"theme-dropdown-current-row-value",children:[c," / ",b]})]}),e.jsx(O,{className:M.className})]}):e.jsxs(e.Fragment,{children:[e.jsx(O,{className:M.className}),e.jsx("span",{className:"theme-dropdown-trigger-label",children:b})]}),e.jsx(X,{size:16,"aria-hidden":"true"})]}),l&&N?e.jsx("div",{className:"theme-dropdown-modes",role:"radiogroup","aria-label":d("theme.modeLabel","Theme mode"),children:J.map(({value:a,label:w,icon:I})=>e.jsxs("button",{type:"button",className:`theme-dropdown-mode-btn btn btn-sm${l===a?" active":""}`,"aria-pressed":l===a,onClick:()=>N(a),title:d(`theme.${a}Mode`,`${w} mode`),children:[e.jsx(I,{size:16,"aria-hidden":"true"}),e.jsx("span",{children:d(`theme.${a}`,w)})]},a))}):null,t==="shadcn-custom"?e.jsx(Ce,{value:h,onChange:s,resolvedThemeMode:u}):null,r?e.jsxs("div",{className:"theme-dropdown-popover",role:"presentation",children:[e.jsxs("label",{className:"theme-dropdown-filter",children:[e.jsx("span",{className:"sr-only",children:d("theme.filterColorThemes","Filter color themes")}),e.jsx("input",{ref:E,type:"search",className:"input",value:n,placeholder:d("theme.filterColorThemesPlaceholder","Filter color themes"),"aria-label":d("theme.filterColorThemes","Filter color themes"),onChange:a=>f(a.target.value),onKeyDown:ae})]}),m.length?e.jsx("div",{id:B,className:"theme-dropdown-list",role:"listbox","aria-label":d("theme.colorThemeLabel","Color theme"),children:m.map(({value:a,displayLabel:w,className:I},k)=>{const C=t===a;return e.jsxs("button",{ref:T=>{g.current[k]=T},type:"button",className:`theme-dropdown-option${C?" active":""}`,role:"option","aria-selected":C,tabIndex:k===W?0:-1,onClick:()=>q(a),onKeyDown:T=>te(T,k,a),children:[e.jsx(O,{className:I}),e.jsx("span",{className:"theme-dropdown-option-label",children:w}),C?e.jsx(ce,{size:16,"aria-hidden":"true"}):null]},a)})}):e.jsx("p",{className:"theme-dropdown-no-results",children:d("theme.noColorThemes","No color themes found")})]}):null]})}const Ee=[{type:"bug",label:"Report bug",Icon:me},{type:"feedback",label:"Send feedback",Icon:ie},{type:"idea",label:"Share idea",Icon:he},{type:"help",label:"Get help",Icon:be}];function Le({onSelect:t}){const[i,l]=o.useState(!1),[h,u]=o.useState(),N=o.useRef(null),s=o.useRef(null),p=o.useCallback(()=>{const r=N.current?.getBoundingClientRect();r&&u({top:r.bottom,left:r.left,right:window.innerWidth-r.right})},[]);o.useEffect(()=>{if(!i)return;p();const r=()=>p();return window.addEventListener("resize",r),window.addEventListener("scroll",r,!0),()=>{window.removeEventListener("resize",r),window.removeEventListener("scroll",r,!0)}},[i,p]),o.useEffect(()=>{if(!i)return;const r=n=>{const f=n.target;N.current?.contains(f)||s.current?.contains(f)||l(!1)},y=n=>{n.key==="Escape"&&(l(!1),N.current?.focus())};return document.addEventListener("mousedown",r),document.addEventListener("keydown",y),()=>{document.removeEventListener("mousedown",r),document.removeEventListener("keydown",y)}},[i]);const d=i&&h&&typeof document<"u"?se.createPortal(e.jsx("div",{ref:s,className:"report-action-menu__list report-action-menu__list--portal",role:"menu",style:{top:h.top,left:h.left,right:h.right},children:Ee.map(({type:r,label:y,Icon:n})=>e.jsxs("button",{className:"report-action-menu__item",type:"button",role:"menuitem",onClick:()=>{l(!1),t(r)},children:[e.jsx(n,{"aria-hidden":"true"}),y]},r))}),document.body):null;return e.jsxs("div",{className:"report-action-menu",children:[e.jsx("button",{ref:N,className:"btn btn-secondary",type:"button","aria-haspopup":"menu","aria-expanded":i,onClick:()=>l(r=>!r),children:"Report"}),d]})}const Re={bug:"What went wrong?",feedback:"What would you like to share?",idea:"What would you like Fusion to do?",help:"What would you like help with?"};function ze({actionType:t,onClose:i,contextRefs:l}){const{t:h}=V("app"),[u,N]=o.useState(""),[s,p]=o.useState(),[d,r]=o.useState(!1),[y,n]=o.useState(),[f,x]=o.useState(!1),[v,j]=o.useState(),[S,F]=o.useState(),[E,R]=o.useState(!1),g=o.useRef(0),M=async c=>{r(!0),n(void 0);try{const b=await de();if(!b)throw new Error("Screen capture was unavailable or denied.");const{artifactId:D}=await ke(b);if(g.current!==c)return;F(D)}catch(b){if(g.current!==c)return;x(!1),n(b instanceof Error?b.message:"We could not capture the current screen.")}finally{g.current===c&&r(!1)}},z=async()=>{if(u.trim()){if(f&&(!S||!E)){n("Capture and confirm local screenshot retention before continuing, or turn attachment off.");return}r(!0),n(void 0);try{if(Y("report"),t==="help"){const c=await xe(u);if(c.answered){p({kind:"help",answer:c.answer});return}}p(await ge({actionType:t,targetType:v,userPrompt:u,contextRefs:l,activityTrace:A(),screenshotArtifactId:f&&E?S:void 0}))}catch{n("We could not prepare your report. Check your connection and try again.")}finally{r(!1)}}},$=async(c,b,D)=>{if(s?.report){r(!0),n(void 0);try{Y("report"),p(await Ne({actionType:t,targetType:v,report:s.report,endorseIssueNumber:c,endorseDiscussionId:b,endorseRoadmapIssueNumber:D,activityTrace:A(),screenshotArtifactId:f&&E?S:void 0}))}catch{n("We could not send your report. Your draft is still here; try again.")}finally{r(!1)}}};return e.jsx("div",{className:"report-modal-backdrop",role:"presentation",children:e.jsxs("section",{className:"card report-modal",role:"dialog","aria-modal":"true","aria-label":`${t} report`,children:[e.jsx("button",{className:"btn-icon report-modal__close",type:"button","aria-label":"Close report",onClick:i,children:"×"}),y&&e.jsx("p",{className:"report-modal__error",role:"alert",children:y}),!s&&e.jsxs(e.Fragment,{children:[e.jsx("h2",{children:t[0].toUpperCase()+t.slice(1)}),e.jsx("label",{htmlFor:"report-prompt",children:Re[t]}),e.jsx("textarea",{id:"report-prompt",className:"input",value:u,onChange:c=>N(c.target.value),maxLength:4e3}),e.jsxs("label",{className:"report-modal__screenshot-option",children:[e.jsx("input",{type:"checkbox",checked:f,onChange:c=>{const b=c.target.checked,D=++g.current;x(b),F(void 0),R(!1),b?M(D):r(!1)}})," Store a screenshot locally"]}),f&&e.jsx("div",{className:"report-modal__screenshot-preview",children:S?e.jsxs("label",{className:"report-modal__screenshot-option",children:[e.jsx("input",{type:"checkbox",checked:E,onChange:c=>R(c.target.checked)})," I confirm Fusion may retain this screenshot locally for this report."]}):e.jsx("p",{children:"Capturing and storing locally…"})}),e.jsx("label",{htmlFor:"report-target",children:h("report.targetLabel","Filing target")}),e.jsxs("select",{id:"report-target",className:"input",value:v??"",onChange:c=>j(c.target.value||void 0),children:[e.jsx("option",{value:"",children:h("report.targetInherit","Use configured action target")}),e.jsx("option",{value:"issue",children:h("report.targetIssue","GitHub Issue")}),e.jsx("option",{value:"discussion",children:h("report.targetDiscussion","GitHub Discussion")})]}),e.jsxs("details",{className:"report-modal__activity-trace",children:[e.jsx("summary",{children:"Activity trace to send"}),e.jsx("ul",{children:A().map((c,b)=>e.jsx("li",{children:c},`${c}-${b}`))})]}),e.jsx("button",{className:"btn btn-primary",type:"button",disabled:!u.trim()||d,onClick:()=>void z(),children:y?"Retry":"Continue"})]}),s?.kind==="draft-ready"&&s.report&&e.jsxs(e.Fragment,{children:[e.jsx("h2",{children:"Review your report"}),e.jsx("label",{htmlFor:"report-review-prompt",children:"Report summary"}),e.jsx("textarea",{id:"report-review-prompt",className:"input",value:s.report.userPrompt,onChange:c=>{const b=c.target.value;p({...s,report:{...s.report,userPrompt:b}})}}),e.jsx("label",{htmlFor:"report-review-body",children:"Structured report"}),e.jsx("textarea",{id:"report-review-body",className:"input",value:s.report.body??"",onChange:c=>p({...s,report:{...s.report,body:c.target.value}})}),e.jsx("button",{className:"btn btn-primary",type:"button",disabled:d,onClick:()=>void $(),children:"File report"})]}),s?.kind==="duplicate-found"&&s.issue&&s.report&&e.jsxs(e.Fragment,{children:[e.jsx("h2",{children:s.issue.roadmap?h("report.roadmapDuplicate.title","Already on the roadmap — add your data point?"):"Review data point for a similar open issue"}),e.jsx("a",{href:s.issue.url,target:"_blank",rel:"noreferrer",children:s.issue.title}),e.jsx("label",{htmlFor:"report-duplicate-prompt",children:"Report summary"}),e.jsx("textarea",{id:"report-duplicate-prompt",className:"input",value:s.report.userPrompt,onChange:c=>{const b=c.target.value;p({...s,report:{...s.report,userPrompt:b}})}}),e.jsx("label",{htmlFor:"report-duplicate-body",children:"Structured data point"}),e.jsx("textarea",{id:"report-duplicate-body",className:"input",value:s.report.body??"",onChange:c=>p({...s,report:{...s.report,body:c.target.value}})}),e.jsx("button",{className:"btn btn-primary",type:"button",disabled:d,onClick:()=>void $(s.issue.discussionId||s.issue.roadmap?void 0:s.issue.number,s.issue.discussionId,s.issue.roadmap?s.issue.number:void 0),children:"Confirm and add data point"})]}),(s?.kind==="filed"||s?.kind==="endorsed")&&e.jsxs(e.Fragment,{children:[e.jsx("h2",{children:s.kind==="filed"&&s.destination==="issue"?"Report filed as an Issue":"Report sent"}),e.jsx("a",{href:s.url,target:"_blank",rel:"noreferrer",children:"View on GitHub"}),s.report?.body&&e.jsxs(e.Fragment,{children:[e.jsx("label",{htmlFor:"filed-report",children:"Final report"}),e.jsx("textarea",{id:"filed-report",className:"input",value:s.report.body,readOnly:!0})]})]}),s?.kind==="help"&&e.jsxs(e.Fragment,{children:[e.jsx("h2",{children:"Suggested help"}),e.jsx("p",{children:s.answer?.summary??s.answer?.content})]}),s?.kind==="unavailable"&&e.jsxs(e.Fragment,{children:[e.jsx("p",{role:"alert",children:s.message}),e.jsx("button",{className:"btn btn-secondary",type:"button",onClick:()=>{p(void 0),n(void 0)},children:"Return to prompt"})]})]})})}export{me as B,Le as R,J as T,_e as a,ze as b,Me as l,$e as r};
21
+ */const ve=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]],ye=_("sun",ve);async function G(t,i){const l=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!l.ok)throw new Error((await l.json().catch(()=>({error:l.statusText}))).error??l.statusText);return l.json()}function ge(t){return G("/api/report/draft",t)}function Ne(t){return G("/api/report/file",t)}function xe(t){return G("/api/report/help",{question:t})}async function ke(t){const i=new FormData;i.append("screenshot",t,"report-screenshot.png");const l=await fetch("/api/report/attachment",{method:"POST",body:i});if(!l.ok)throw new Error((await l.json().catch(()=>({error:l.statusText}))).error??l.statusText);return l.json()}async function Me(){const t=await fetch("/api/report/discussion-categories");if(!t.ok)throw new Error((await t.json().catch(()=>({error:t.statusText}))).error??t.statusText);return t.json()}function $e(t){const i=new URLSearchParams(t.search),l=t.hash.match(/^#\/tasks\/([^/?#]+)/),h=l?.[1]?decodeURIComponent(l[1]):i.get("taskId")??void 0,u=i.get("agentId")??void 0;return h||u?{taskId:h,agentId:u}:void 0}const J=[{value:"light",label:"Light",icon:ye},{value:"dark",label:"Dark",icon:fe},{value:"system",label:"System",icon:re}],P=[{value:"default",label:"Fusion Legacy",className:"theme-swatch-default"},{value:"ocean",label:"Ocean",className:"theme-swatch-ocean"},{value:"forest",label:"Forest",className:"theme-swatch-forest"},{value:"sunset",label:"Sunset",className:"theme-swatch-sunset"},{value:"zen",label:"Zen",className:"theme-swatch-zen"},{value:"berry",label:"Berry",className:"theme-swatch-berry"},{value:"high-contrast",label:"High Contrast",className:"theme-swatch-high-contrast"},{value:"industrial",label:"Industrial",className:"theme-swatch-industrial"},{value:"monochrome",label:"Mono",className:"theme-swatch-monochrome"},{value:"slate",label:"Slate",className:"theme-swatch-slate"},{value:"ash",label:"Ash",className:"theme-swatch-ash"},{value:"air",label:"Air",className:"theme-swatch-air"},{value:"graphite",label:"Graphite",className:"theme-swatch-graphite"},{value:"silver",label:"Silver",className:"theme-swatch-silver"},{value:"solarized",label:"Solarized",className:"theme-swatch-solarized"},{value:"factory",label:"Factory",className:"theme-swatch-factory"},{value:"factory-mono",label:"Factory Mono",className:"theme-swatch-factory-mono"},{value:"ayu",label:"Ayu",className:"theme-swatch-ayu"},{value:"one-dark",label:"One Dark",className:"theme-swatch-one-dark"},{value:"nord",label:"Nord",className:"theme-swatch-nord"},{value:"dracula",label:"Dracula",className:"theme-swatch-dracula"},{value:"gruvbox",label:"Gruvbox",className:"theme-swatch-gruvbox"},{value:"tokyo-night",label:"Tokyo Night",className:"theme-swatch-tokyo-night"},{value:"catppuccin-mocha",label:"Catppuccin Mocha",className:"theme-swatch-catppuccin-mocha"},{value:"github-dark",label:"GitHub Dark",className:"theme-swatch-github-dark"},{value:"everforest",label:"Everforest",className:"theme-swatch-everforest"},{value:"rose-pine",label:"Rosé Pine",className:"theme-swatch-rose-pine"},{value:"kanagawa",label:"Kanagawa",className:"theme-swatch-kanagawa"},{value:"night-owl",label:"Night Owl",className:"theme-swatch-night-owl"},{value:"palenight",label:"Palenight",className:"theme-swatch-palenight"},{value:"monokai-pro",label:"Monokai Pro",className:"theme-swatch-monokai-pro"},{value:"slime",label:"Slime",className:"theme-swatch-slime"},{value:"brutalist",label:"Brutalist",className:"theme-swatch-brutalist"},{value:"neon-city",label:"Neon City",className:"theme-swatch-neon-city"},{value:"parchment",label:"Parchment",className:"theme-swatch-parchment"},{value:"terminal",label:"Terminal",className:"theme-swatch-terminal"},{value:"glass",label:"Glass",className:"theme-swatch-glass"},{value:"glass-silver",label:"Glass Silver",className:"theme-swatch-glass-silver"},{value:"horizon",label:"Horizon",className:"theme-swatch-horizon"},{value:"vitesse",label:"Vitesse",className:"theme-swatch-vitesse"},{value:"outrun",label:"Outrun",className:"theme-swatch-outrun"},{value:"snazzy",label:"Snazzy",className:"theme-swatch-snazzy"},{value:"porple",label:"Porple",className:"theme-swatch-porple"},{value:"espresso",label:"Espresso",className:"theme-swatch-espresso"},{value:"mars",label:"Mars",className:"theme-swatch-mars"},{value:"poimandres",label:"Poimandres",className:"theme-swatch-poimandres"},{value:"ember",label:"Ember",className:"theme-swatch-ember"},{value:"rust",label:"Rust",className:"theme-swatch-rust"},{value:"copper",label:"Copper",className:"theme-swatch-copper"},{value:"foundry",label:"Foundry",className:"theme-swatch-foundry"},{value:"carbon",label:"Carbon",className:"theme-swatch-carbon"},{value:"sandstone",label:"Sandstone",className:"theme-swatch-sandstone"},{value:"lagoon",label:"Lagoon",className:"theme-swatch-lagoon"},{value:"frost",label:"Frost",className:"theme-swatch-frost"},{value:"lavender",label:"Lavender",className:"theme-swatch-lavender"},{value:"neon-bloom",label:"Neon Bloom",className:"theme-swatch-neon-bloom"},{value:"sepia",label:"Sepia",className:"theme-swatch-sepia"},{value:"cobalt",label:"Cobalt",className:"theme-swatch-cobalt"},{value:"clay",label:"Clay",className:"theme-swatch-clay"},{value:"moss",label:"Moss",className:"theme-swatch-moss"},{value:"aurora",label:"Aurora",className:"theme-swatch-aurora"},{value:"calm",label:"Calm",className:"theme-swatch-calm"},{value:"dawn",label:"Dawn",className:"theme-swatch-dawn"},{value:"shadcn",label:"Shadcn",className:"theme-swatch-shadcn"},{value:"shadcn-ember",label:"Shadcn Ember (Default)",className:"theme-swatch-shadcn-ember"},{value:"shadcn-custom",label:"Shadcn Custom",className:"theme-swatch-shadcn-custom"},{value:"shadcn-blue",label:"Shadcn Blue",className:"theme-swatch-shadcn-blue"},{value:"shadcn-green",label:"Shadcn Green",className:"theme-swatch-shadcn-green"},{value:"shadcn-red",label:"Shadcn Red",className:"theme-swatch-shadcn-red"},{value:"shadcn-purple",label:"Shadcn Purple",className:"theme-swatch-shadcn-purple"},{value:"shadcn-pink",label:"Shadcn Pink",className:"theme-swatch-shadcn-pink"},{value:"shadcn-orange",label:"Shadcn Orange",className:"theme-swatch-shadcn-orange"},{value:"shadcn-yellow",label:"Shadcn Yellow",className:"theme-swatch-shadcn-yellow"},{value:"shadcn-mono",label:"Shadcn Mono",className:"theme-swatch-shadcn-mono"},{value:"shadcn-mono-red",label:"Shadcn Mono Red",className:"theme-swatch-shadcn-mono-red"},{value:"shadcn-mono-blue",label:"Shadcn Mono Blue",className:"theme-swatch-shadcn-mono-blue"},{value:"shadcn-mono-green",label:"Shadcn Mono Green",className:"theme-swatch-shadcn-mono-green"},{value:"shadcn-mono-purple",label:"Shadcn Mono Purple",className:"theme-swatch-shadcn-mono-purple"},{value:"shadcn-mono-pink",label:"Shadcn Mono Pink",className:"theme-swatch-shadcn-mono-pink"},{value:"shadcn-mono-orange",label:"Shadcn Mono Orange",className:"theme-swatch-shadcn-mono-orange"},{value:"shadcn-mono-yellow",label:"Shadcn Mono Yellow",className:"theme-swatch-shadcn-mono-yellow"},{value:"shadcn-black",label:"Shadcn Black",className:"theme-swatch-shadcn-black"},{value:"shadcn-gray",label:"Shadcn Gray",className:"theme-swatch-shadcn-gray"},{value:"shadcn-gray-blue",label:"Shadcn Gray Blue",className:"theme-swatch-shadcn-gray-blue"}];function je(t){const i=t.trim();if(/^#[\da-f]{6}$/i.test(i))return i;if(/^#[\da-f]{3}$/i.test(i)){const[,l,h,u]=i;return`#${l}${l}${h}${h}${u}${u}`}return"#000000"}function Ce({value:t={},onChange:i,resolvedThemeMode:l="dark"}){const{t:h}=V("app"),[u,N]=o.useState(!1),s=o.useId(),p=o.useMemo(()=>Q(t),[t]),d=(n,f)=>{i(Q({...p,[n]:f}))},r=u?h("theme.shadcnCustom.collapse","Collapse custom colors"):h("theme.shadcnCustom.show","Show custom colors"),y=u?le:X;return e.jsxs("section",{className:"shadcn-color-picker card","data-testid":"shadcn-color-picker","aria-labelledby":"shadcn-color-picker-title",children:[e.jsxs("div",{className:"shadcn-color-picker-header",children:[e.jsxs("div",{className:"shadcn-color-picker-heading",children:[e.jsx("h3",{id:"shadcn-color-picker-title",className:"shadcn-color-picker-title",children:h("theme.shadcnCustom.title","Custom shadcn colors")}),e.jsx("p",{className:"shadcn-color-picker-description",children:h("theme.shadcnCustom.description","Override shadcn design tokens with hex colors. Blank tokens use the theme defaults.")})]}),e.jsx("button",{type:"button",className:"btn btn-icon btn-sm shadcn-color-picker-toggle","aria-expanded":u,"aria-controls":s,"aria-label":r,title:r,onClick:()=>N(n=>!n),children:e.jsx(y,{size:16,"aria-hidden":"true"})})]}),u?e.jsxs("div",{id:s,className:"shadcn-color-picker-controls-panel","data-testid":"shadcn-color-picker-controls",children:[e.jsx("div",{className:"shadcn-color-picker-actions",children:e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>i({}),children:h("theme.shadcnCustom.reset","Reset custom colors")})}),e.jsx("div",{className:"shadcn-color-picker-grid",children:ne.map(n=>{const f=oe(n,l),x=p[n.cssVar]??f,v=`shadcn-color-${n.cssVar.replace(/^--/,"").replace(/[^a-z0-9]+/gi,"-")}`;return e.jsxs("div",{className:"shadcn-color-picker-row","data-testid":`shadcn-color-${n.cssVar}`,children:[e.jsxs("label",{className:"shadcn-color-picker-label",htmlFor:v,children:[e.jsx("span",{children:h(`theme.shadcnCustom.token.${n.cssVar}`,n.label)}),e.jsx("code",{children:n.cssVar})]}),e.jsxs("div",{className:"shadcn-color-picker-controls",children:[e.jsx("input",{"aria-label":h("theme.shadcnCustom.colorInput","Pick {{label}} color",{label:n.label}),className:"shadcn-color-picker-native",type:"color",value:je(x),onChange:j=>d(n.cssVar,j.currentTarget.value)}),e.jsx("input",{id:v,"aria-label":h("theme.shadcnCustom.hexInput","{{label}} hex color",{label:n.label}),className:"input shadcn-color-picker-hex",type:"text",inputMode:"text",spellCheck:!1,value:x,onChange:j=>d(n.cssVar,j.currentTarget.value)})]})]},n.cssVar)})})]}):null]})}function Se(t){return P.find(i=>i.value===t)??P[0]}function Z(t){return t.trim().normalize("NFD").replace(/\p{Diacritic}/gu,"").toLocaleLowerCase()}function O({className:t}){return e.jsxs("span",{className:`theme-option-swatch ${t}`,"aria-hidden":"true",children:[e.jsx("span",{className:"theme-option-swatch-sample theme-option-swatch-sample-1"}),e.jsx("span",{className:"theme-option-swatch-sample theme-option-swatch-sample-2"}),e.jsx("span",{className:"theme-option-swatch-sample theme-option-swatch-sample-3"}),e.jsx("span",{className:"theme-option-swatch-sample theme-option-swatch-sample-4"})]})}function Le({colorTheme:t,onColorThemeChange:i,themeMode:l,shadcnCustomColors:h={},resolvedThemeMode:u=l==="light"?"light":"dark",onThemeModeChange:N,onShadcnCustomColorsChange:s=()=>{},triggerVariant:p="compact"}){const{t:d}=V("app"),[r,y]=o.useState(!1),[n,f]=o.useState(""),[x,v]=o.useState(t),[j,S]=o.useState(null),F=o.useRef(null),E=o.useRef(null),R=o.useRef(!1),g=o.useRef([]),M=o.useMemo(()=>Se(t),[t]),z=l==="system"?u:l,$=J.find(a=>a.value===z)?.icon,c=l==="system"?d("theme.system","System"):d(`theme.${l}`,l?`${l.charAt(0).toUpperCase()}${l.slice(1)}`:"Dark"),b=d(`theme.colorTheme.${M.value}`,M.label),D=`${d("theme.currentTheme","Current theme")} ${c} / ${b}`,B="theme-dropdown-listbox",H=o.useMemo(()=>P.map(a=>({...a,displayLabel:d(`theme.colorTheme.${a.value}`,a.label)})),[d]),U=Z(n),m=o.useMemo(()=>H.filter(a=>Z(a.displayLabel).includes(U)),[U,H]),W=m.findIndex(a=>a.value===x),L=()=>{y(!1),f(""),v(t),S(null),R.current=!1,g.current=[]};o.useEffect(()=>{if(!r)return;const a=w=>{F.current&&!F.current.contains(w.target)&&L()};return document.addEventListener("pointerdown",a),()=>document.removeEventListener("pointerdown",a)},[r,t]),o.useEffect(()=>{r&&(m.some(a=>a.value===x)||v(m[0]?.value??null))},[x,m,r]),o.useEffect(()=>{if(r){if(j==="pointer"&&R.current)E.current?.focus(),R.current=!1;else if(j==="keyboard"){const a=m.findIndex(w=>w.value===x);g.current[a]?.focus()}}},[x,m,r,j]);const q=a=>{i(a),L()},K=(a,w)=>{if(a==="pointer")R.current=!0,v(t);else{const I=m.some(C=>C.value===t),k=w==="ArrowUp"?m.at(-1)?.value??null:w==="ArrowDown"?m[0]?.value??null:I?t:m[0]?.value??null;v(k)}S(a),y(!0)},ee=a=>{(a.key==="ArrowDown"||a.key==="ArrowUp"||a.key==="Enter"||a.key===" ")&&(a.preventDefault(),K("keyboard",a.key))},ae=a=>{if(a.key==="Escape"){a.preventDefault(),L();return}if(a.key!=="ArrowDown"&&a.key!=="ArrowUp")return;const w=a.key==="ArrowUp"?m.length-1:Math.max(0,W);w<0||!m[w]||(a.preventDefault(),v(m[w].value),g.current[w]?.focus())},te=(a,w,I)=>{if(a.key==="Escape"){a.preventDefault(),L();return}if(a.key==="ArrowDown"||a.key==="ArrowUp"){a.preventDefault();const k=a.key==="ArrowDown"?1:-1,C=(w+k+m.length)%m.length;v(m[C]?.value??null),g.current[C]?.focus();return}if(a.key==="Home"){a.preventDefault(),v(m[0]?.value??null),g.current[0]?.focus();return}if(a.key==="End"){a.preventDefault();const k=m.length-1;v(m[k]?.value??null),g.current[k]?.focus();return}(a.key==="Enter"||a.key===" ")&&(a.preventDefault(),q(I))};return e.jsxs("div",{className:`theme-dropdown${p==="current-row"?" theme-dropdown--current-row":""}${r?" open":""}`,ref:F,children:[e.jsxs("button",{type:"button",className:`theme-dropdown-trigger btn${p==="current-row"?" theme-dropdown-trigger--current-row":""}`,"aria-label":p==="current-row"?D:void 0,"aria-haspopup":"listbox","aria-expanded":r,"aria-controls":r?B:void 0,onClick:()=>r?L():K("pointer"),onKeyDown:ee,children:[p==="current-row"?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"theme-dropdown-current-row-icon","aria-hidden":"true",children:$?e.jsx($,{size:20}):null}),e.jsxs("span",{className:"theme-dropdown-current-row-info",children:[e.jsx("span",{className:"theme-dropdown-current-row-label",children:d("theme.currentTheme","Current theme")}),e.jsxs("span",{className:"theme-dropdown-current-row-value",children:[c," / ",b]})]}),e.jsx(O,{className:M.className})]}):e.jsxs(e.Fragment,{children:[e.jsx(O,{className:M.className}),e.jsx("span",{className:"theme-dropdown-trigger-label",children:b})]}),e.jsx(X,{size:16,"aria-hidden":"true"})]}),l&&N?e.jsx("div",{className:"theme-dropdown-modes",role:"radiogroup","aria-label":d("theme.modeLabel","Theme mode"),children:J.map(({value:a,label:w,icon:I})=>e.jsxs("button",{type:"button",className:`theme-dropdown-mode-btn btn btn-sm${l===a?" active":""}`,"aria-pressed":l===a,onClick:()=>N(a),title:d(`theme.${a}Mode`,`${w} mode`),children:[e.jsx(I,{size:16,"aria-hidden":"true"}),e.jsx("span",{children:d(`theme.${a}`,w)})]},a))}):null,t==="shadcn-custom"?e.jsx(Ce,{value:h,onChange:s,resolvedThemeMode:u}):null,r?e.jsxs("div",{className:"theme-dropdown-popover",role:"presentation",children:[e.jsxs("label",{className:"theme-dropdown-filter",children:[e.jsx("span",{className:"sr-only",children:d("theme.filterColorThemes","Filter color themes")}),e.jsx("input",{ref:E,type:"search",className:"input",value:n,placeholder:d("theme.filterColorThemesPlaceholder","Filter color themes"),"aria-label":d("theme.filterColorThemes","Filter color themes"),onChange:a=>f(a.target.value),onKeyDown:ae})]}),m.length?e.jsx("div",{id:B,className:"theme-dropdown-list",role:"listbox","aria-label":d("theme.colorThemeLabel","Color theme"),children:m.map(({value:a,displayLabel:w,className:I},k)=>{const C=t===a;return e.jsxs("button",{ref:T=>{g.current[k]=T},type:"button",className:`theme-dropdown-option${C?" active":""}`,role:"option","aria-selected":C,tabIndex:k===W?0:-1,onClick:()=>q(a),onKeyDown:T=>te(T,k,a),children:[e.jsx(O,{className:I}),e.jsx("span",{className:"theme-dropdown-option-label",children:w}),C?e.jsx(ce,{size:16,"aria-hidden":"true"}):null]},a)})}):e.jsx("p",{className:"theme-dropdown-no-results",children:d("theme.noColorThemes","No color themes found")})]}):null]})}const Ee=[{type:"bug",label:"Report bug",Icon:me},{type:"feedback",label:"Send feedback",Icon:ie},{type:"idea",label:"Share idea",Icon:he},{type:"help",label:"Get help",Icon:be}];function _e({onSelect:t}){const[i,l]=o.useState(!1),[h,u]=o.useState(),N=o.useRef(null),s=o.useRef(null),p=o.useCallback(()=>{const r=N.current?.getBoundingClientRect();r&&u({top:r.bottom,left:r.left,right:window.innerWidth-r.right})},[]);o.useEffect(()=>{if(!i)return;p();const r=()=>p();return window.addEventListener("resize",r),window.addEventListener("scroll",r,!0),()=>{window.removeEventListener("resize",r),window.removeEventListener("scroll",r,!0)}},[i,p]),o.useEffect(()=>{if(!i)return;const r=n=>{const f=n.target;N.current?.contains(f)||s.current?.contains(f)||l(!1)},y=n=>{n.key==="Escape"&&(l(!1),N.current?.focus())};return document.addEventListener("mousedown",r),document.addEventListener("keydown",y),()=>{document.removeEventListener("mousedown",r),document.removeEventListener("keydown",y)}},[i]);const d=i&&h&&typeof document<"u"?se.createPortal(e.jsx("div",{ref:s,className:"report-action-menu__list report-action-menu__list--portal",role:"menu",style:{top:h.top,left:h.left,right:h.right},children:Ee.map(({type:r,label:y,Icon:n})=>e.jsxs("button",{className:"report-action-menu__item",type:"button",role:"menuitem",onClick:()=>{l(!1),t(r)},children:[e.jsx(n,{"aria-hidden":"true"}),y]},r))}),document.body):null;return e.jsxs("div",{className:"report-action-menu",children:[e.jsx("button",{ref:N,className:"btn btn-secondary",type:"button","aria-haspopup":"menu","aria-expanded":i,onClick:()=>l(r=>!r),children:"Report"}),d]})}const Re={bug:"What went wrong?",feedback:"What would you like to share?",idea:"What would you like Fusion to do?",help:"What would you like help with?"};function ze({actionType:t,onClose:i,contextRefs:l}){const{t:h}=V("app"),[u,N]=o.useState(""),[s,p]=o.useState(),[d,r]=o.useState(!1),[y,n]=o.useState(),[f,x]=o.useState(!1),[v,j]=o.useState(),[S,F]=o.useState(),[E,R]=o.useState(!1),g=o.useRef(0),M=async c=>{r(!0),n(void 0);try{const b=await de();if(!b)throw new Error("Screen capture was unavailable or denied.");const{artifactId:D}=await ke(b);if(g.current!==c)return;F(D)}catch(b){if(g.current!==c)return;x(!1),n(b instanceof Error?b.message:"We could not capture the current screen.")}finally{g.current===c&&r(!1)}},z=async()=>{if(u.trim()){if(f&&(!S||!E)){n("Capture and confirm local screenshot retention before continuing, or turn attachment off.");return}r(!0),n(void 0);try{if(Y("report"),t==="help"){const c=await xe(u);if(c.answered){p({kind:"help",answer:c.answer});return}}p(await ge({actionType:t,targetType:v,userPrompt:u,contextRefs:l,activityTrace:A(),screenshotArtifactId:f&&E?S:void 0}))}catch{n("We could not prepare your report. Check your connection and try again.")}finally{r(!1)}}},$=async(c,b,D)=>{if(s?.report){r(!0),n(void 0);try{Y("report"),p(await Ne({actionType:t,targetType:v,report:s.report,endorseIssueNumber:c,endorseDiscussionId:b,endorseRoadmapIssueNumber:D,activityTrace:A(),screenshotArtifactId:f&&E?S:void 0}))}catch{n("We could not send your report. Your draft is still here; try again.")}finally{r(!1)}}};return e.jsx("div",{className:"report-modal-backdrop",role:"presentation",children:e.jsxs("section",{className:"card report-modal",role:"dialog","aria-modal":"true","aria-label":`${t} report`,children:[e.jsx("button",{className:"btn-icon report-modal__close",type:"button","aria-label":"Close report",onClick:i,children:"×"}),y&&e.jsx("p",{className:"report-modal__error",role:"alert",children:y}),!s&&e.jsxs(e.Fragment,{children:[e.jsx("h2",{children:t[0].toUpperCase()+t.slice(1)}),e.jsx("label",{htmlFor:"report-prompt",children:Re[t]}),e.jsx("textarea",{id:"report-prompt",className:"input",value:u,onChange:c=>N(c.target.value),maxLength:4e3}),e.jsxs("label",{className:"report-modal__screenshot-option",children:[e.jsx("input",{type:"checkbox",checked:f,onChange:c=>{const b=c.target.checked,D=++g.current;x(b),F(void 0),R(!1),b?M(D):r(!1)}})," Store a screenshot locally"]}),f&&e.jsx("div",{className:"report-modal__screenshot-preview",children:S?e.jsxs("label",{className:"report-modal__screenshot-option",children:[e.jsx("input",{type:"checkbox",checked:E,onChange:c=>R(c.target.checked)})," I confirm Fusion may retain this screenshot locally for this report."]}):e.jsx("p",{children:"Capturing and storing locally…"})}),e.jsx("label",{htmlFor:"report-target",children:h("report.targetLabel","Filing target")}),e.jsxs("select",{id:"report-target",className:"input",value:v??"",onChange:c=>j(c.target.value||void 0),children:[e.jsx("option",{value:"",children:h("report.targetInherit","Use configured action target")}),e.jsx("option",{value:"issue",children:h("report.targetIssue","GitHub Issue")}),e.jsx("option",{value:"discussion",children:h("report.targetDiscussion","GitHub Discussion")})]}),e.jsxs("details",{className:"report-modal__activity-trace",children:[e.jsx("summary",{children:"Activity trace to send"}),e.jsx("ul",{children:A().map((c,b)=>e.jsx("li",{children:c},`${c}-${b}`))})]}),e.jsx("button",{className:"btn btn-primary",type:"button",disabled:!u.trim()||d,onClick:()=>void z(),children:y?"Retry":"Continue"})]}),s?.kind==="draft-ready"&&s.report&&e.jsxs(e.Fragment,{children:[e.jsx("h2",{children:"Review your report"}),e.jsx("label",{htmlFor:"report-review-prompt",children:"Report summary"}),e.jsx("textarea",{id:"report-review-prompt",className:"input",value:s.report.userPrompt,onChange:c=>{const b=c.target.value;p({...s,report:{...s.report,userPrompt:b}})}}),e.jsx("label",{htmlFor:"report-review-body",children:"Structured report"}),e.jsx("textarea",{id:"report-review-body",className:"input",value:s.report.body??"",onChange:c=>p({...s,report:{...s.report,body:c.target.value}})}),e.jsx("button",{className:"btn btn-primary",type:"button",disabled:d,onClick:()=>void $(),children:"File report"})]}),s?.kind==="duplicate-found"&&s.issue&&s.report&&e.jsxs(e.Fragment,{children:[e.jsx("h2",{children:s.issue.roadmap?h("report.roadmapDuplicate.title","Already on the roadmap — add your data point?"):"Review data point for a similar open issue"}),e.jsx("a",{href:s.issue.url,target:"_blank",rel:"noreferrer",children:s.issue.title}),e.jsx("label",{htmlFor:"report-duplicate-prompt",children:"Report summary"}),e.jsx("textarea",{id:"report-duplicate-prompt",className:"input",value:s.report.userPrompt,onChange:c=>{const b=c.target.value;p({...s,report:{...s.report,userPrompt:b}})}}),e.jsx("label",{htmlFor:"report-duplicate-body",children:"Structured data point"}),e.jsx("textarea",{id:"report-duplicate-body",className:"input",value:s.report.body??"",onChange:c=>p({...s,report:{...s.report,body:c.target.value}})}),e.jsx("button",{className:"btn btn-primary",type:"button",disabled:d,onClick:()=>void $(s.issue.discussionId||s.issue.roadmap?void 0:s.issue.number,s.issue.discussionId,s.issue.roadmap?s.issue.number:void 0),children:"Confirm and add data point"})]}),(s?.kind==="filed"||s?.kind==="endorsed")&&e.jsxs(e.Fragment,{children:[e.jsx("h2",{children:s.kind==="filed"&&s.destination==="issue"?"Report filed as an Issue":"Report sent"}),e.jsx("a",{href:s.url,target:"_blank",rel:"noreferrer",children:"View on GitHub"}),s.report?.body&&e.jsxs(e.Fragment,{children:[e.jsx("label",{htmlFor:"filed-report",children:"Final report"}),e.jsx("textarea",{id:"filed-report",className:"input",value:s.report.body,readOnly:!0})]})]}),s?.kind==="help"&&e.jsxs(e.Fragment,{children:[e.jsx("h2",{children:"Suggested help"}),e.jsx("p",{children:s.answer?.summary??s.answer?.content})]}),s?.kind==="unavailable"&&e.jsxs(e.Fragment,{children:[e.jsx("p",{role:"alert",children:s.message}),e.jsx("button",{className:"btn btn-secondary",type:"button",onClick:()=>{p(void 0),n(void 0)},children:"Return to prompt"})]})]})})}export{me as B,_e as R,J as T,Le as a,ze as b,Me as l,$e as r};
@@ -1,2 +1,2 @@
1
- import{r as c,j as e}from"./vendor-react-SZ_qB27O.js";import{ao as W,ap as ue,aq as he,bx as me,cJ as Se,au as ce,cK as _e,bc as je,cL as Y,cM as we,cN as Ne,cO as ke,cP as Ee,cQ as Ce,cR as Ae,cS as Te,bB as Pe,cT as Le,cU as Ie,aV as Fe,af as Me,V as De,aH as pe,L as He,aI as qe}from"./index-CE7C_XsS.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=W(m,{maxAgeMs:ue}),R=W(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=W(m,{maxAgeMs:ue}),o=W(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 Ke({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"],Qe={"web-search":"webSearch","page-fetch":"pageFetch",github:"github","local-docs":"localDocs","llm-synthesis":"llmSynthesis"};function We(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=We(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,Q]=c.useState(null),[J,fe]=c.useState(""),Z=h.supportedProviders??ze,ee=f.searchProvider,se=t=>t==="web-search"?!0:f.enabledSources[Qe[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]),K=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 K("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 K("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:()=>Q({mode:"create",findingId:u}),children:s("research.createTask","Create Task")}),e.jsx("button",{className:"btn btn-sm",type:"button",onClick:()=>Q({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 K(`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(Ke,{open:!0,mode:q.mode,run:r,finding:{id:q.findingId,heading:u.heading,content:u.content},projectId:a,onClose:()=>Q(null),onConfirm:async({taskId:p,title:x,description:L,priority:Re,attachExport:de})=>{q.mode==="create"?await K("create-task",()=>O(r.id,x,q.findingId,L,Re,de),s("research.taskCreatedFromResearch","Task created from research")):p&&await K("attach-task",()=>G(r.id,p,q.findingId,de),s("research.taskEnrichedFromResearch","Task enriched from research")),Q(null)}}):null})()]})}export{ts as ResearchView};
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-DReijQe4.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 +1 @@
1
- import{r as c,j as e}from"./vendor-react-SZ_qB27O.js";import{V as he,o as me,R as J,P as ye,E as Y,p as z,q as xe,u as ve,v as be,x as je,C as fe,g as Se,y as ge}from"./index-CE7C_XsS.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 Ce="__sync_passphrase__",L={key:"",value:"",description:"",scope:"project",accessPolicy:"prompt",envExportable:!1,envExportKey:""},n={className:"secrets-action-icon","aria-hidden":!0,style:{width:"1em",height:"1em"}},Pe={...n,className:"secrets-action-icon spin"},Me=({addToast:i})=>{const{t:a}=Ne("app"),[R,G]=c.useState([]),[T,M]=c.useState(!0),[A,D]=c.useState(null),[K,b]=c.useState(null),[p,O]=c.useState(null),[U,x]=c.useState(!1),[Q,g]=c.useState(null),[t,l]=c.useState(L),[N,C]=c.useState(!1),[V,j]=c.useState({}),[W,F]=c.useState(null),[u,X]=c.useState(!1),[Z,_]=c.useState(!1),[f,B]=c.useState(""),[P,$]=c.useState(""),[ee,H]=c.useState(!1),[E,se]=c.useState(!1),h=c.useRef(new Map),w=c.useRef(new Map),o=c.useCallback(async(s,r)=>{const d=await fetch(s,{...r,headers:{"Content-Type":"application/json",...r?.headers??{}}});if(!d.ok){const m=await d.json().catch(()=>({error:"Request failed"}));throw new Error(String(m?.error??"Request failed"))}if(d.status!==204)return d.json()},[]),v=c.useCallback(async()=>{M(!0),D(null);try{const s=await o("/api/secrets");G(s.secrets)}catch(s){D(s instanceof Error?s.message:String(s))}finally{M(!1)}},[o]),S=c.useCallback(async()=>{try{const s=await o("/api/secrets/sync-passphrase");X(!!s.configured)}catch(s){i?.(a("secrets.errorLoadSyncStatus","Failed to load sync passphrase status: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}},[i,o]);c.useEffect(()=>(v(),S(),()=>{h.current.forEach(s=>clearTimeout(s)),w.current.forEach(s=>clearTimeout(s))}),[v,S]);const k=()=>{_(!1),B(""),$("")},ae=async s=>{await o("/api/secrets/sync-passphrase",{method:"PUT",body:JSON.stringify({passphrase:s})})},re=async()=>{H(!0);try{await ae(f),i?.(u?a("secrets.syncPassphraseRotated","Sync passphrase rotated"):a("secrets.syncPassphraseSet","Sync passphrase set"),"success"),k(),await S()}catch(s){i?.(a("secrets.errorSaveSyncPassphrase","Failed to save sync passphrase: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}finally{H(!1)}},te=async()=>{if(window.confirm(a("secrets.confirmClearSyncPassphrase","Clear the cross-node sync passphrase? Existing sync pairs will stop working until you set a new passphrase.")))try{await o("/api/secrets/sync-passphrase",{method:"DELETE"}),i?.(a("secrets.syncPassphraseCleared","Sync passphrase cleared"),"success"),await S()}catch(r){i?.(a("secrets.errorClearSyncPassphrase","Failed to clear sync passphrase: {{error}}",{error:r instanceof Error?r.message:String(r)}),"error")}},ce=()=>{O(null),l(L),x(!0),C(!1),b(null)},le=s=>{O(s),l({key:s.key,value:"",description:s.description??"",scope:s.scope,accessPolicy:s.accessPolicy,envExportable:s.envExportable,envExportKey:s.envExportKey??""}),x(!0),C(!1),b(null)},ne=async()=>{b(null);try{if(p){const s={key:t.key,description:t.description||null,accessPolicy:t.accessPolicy,envExportable:t.envExportable,envExportKey:t.envExportable&&t.envExportKey||null};t.value&&(s.value=t.value),await o(`/api/secrets/${p.scope}/${p.id}`,{method:"PATCH",body:JSON.stringify(s)})}else await o("/api/secrets",{method:"POST",body:JSON.stringify({scope:t.scope,key:t.key,value:t.value,description:t.description||null,accessPolicy:t.accessPolicy,envExportable:t.envExportable,envExportKey:t.envExportable&&t.envExportKey||null})});x(!1),l(L),await v()}catch(s){b(s instanceof Error?s.message:String(s))}},oe=s=>{const r=h.current.get(s.id);r&&(clearTimeout(r),h.current.delete(s.id)),j(d=>({...d,[s.id]:null}))},ie=async s=>{const r=await o(`/api/secrets/${s.scope}/${s.id}/reveal`,{method:"POST"});j(y=>({...y,[s.id]:r.value})),i?.(a("secrets.revealed","Revealed"),"success");const d=setTimeout(()=>{j(y=>({...y,[s.id]:null})),h.current.delete(s.id)},3e4),m=h.current.get(s.id);m&&clearTimeout(m),h.current.set(s.id,d)},de=async s=>{const r=V[s.id];if(!r)return;if(!await ge(r)){i?.(a("secrets.copyFailed","Failed to copy secret"),"error");return}F(s.id),i?.(a("secrets.copied","Copied"),"success");const m=setTimeout(()=>{F(null),j(ue=>({...ue,[s.id]:null}))},1500),y=w.current.get(s.id);y&&clearTimeout(y),w.current.set(s.id,m)},pe=async s=>{await o(`/api/secrets/${s.scope}/${s.id}`,{method:"DELETE"}),g(null),await v()},I=c.useMemo(()=>[...R].filter(s=>!(s.scope==="global"&&s.key===Ce)).sort((s,r)=>s.key.localeCompare(r.key)),[R]),q=f.length>0&&f===P;return e.jsxs("section",{className:"secrets-view",children:[e.jsx(he,{icon:me,title:a("secrets.title","Secrets"),actions:e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>void v(),children:[e.jsx(J,{...n})," ",a("secrets.refresh","Refresh")]}),e.jsxs("button",{className:"btn btn-primary btn-sm",onClick:ce,children:[e.jsx(ye,{...n})," ",a("secrets.addSecret","Add Secret")]})]})}),A?e.jsx("div",{className:"form-error",children:A}):null,T?e.jsxs("div",{className:"secrets-loading",children:[e.jsx(J,{...Pe})," ",a("secrets.loading","Loading…")]}):null,!T&&I.length===0?e.jsx("div",{className:"secrets-empty",children:a("secrets.empty","No secrets found.")}):null,e.jsx("div",{className:"secrets-list",children:I.map(s=>{const r=V[s.id];return e.jsxs("article",{className:"card secrets-row",children:[e.jsxs("div",{className:"secrets-row-main",children:[e.jsx("div",{className:"secrets-row-key",children:s.key}),e.jsxs("div",{className:"secrets-row-meta",children:[e.jsx("span",{className:"secrets-chip",children:s.scope}),e.jsx("span",{className:"secrets-chip",children:s.accessPolicy}),s.envExportable?e.jsx("span",{className:"secrets-chip",children:a("secrets.envExportableChip","env exportable")}):null]}),r?e.jsx("pre",{className:"secrets-revealed",children:r}):null]}),e.jsxs("div",{className:"secrets-row-side",children:[e.jsx("span",{className:"secrets-row-read",children:s.lastReadAt?new Date(s.lastReadAt).toLocaleString():a("secrets.neverRead","Never read")}),e.jsxs("div",{className:"secrets-row-actions",children:[e.jsx("button",{type:"button",className:"btn btn-icon secrets-visibility-toggle",onClick:()=>{if(r){oe(s);return}ie(s)},"aria-label":r?a("secrets.hideAriaLabel","Hide"):a("secrets.revealAriaLabel","Reveal"),children:r?e.jsx(Y,{...n}):e.jsx(z,{...n})}),e.jsx("button",{className:"btn btn-icon",onClick:()=>void de(s),"aria-label":a("secrets.copyAriaLabel","Copy"),disabled:!r,children:W===s.id?e.jsx(xe,{...n}):e.jsx(ve,{...n})}),e.jsx("button",{className:"btn btn-icon",onClick:()=>le(s),"aria-label":a("secrets.editAriaLabel","Edit"),children:e.jsx(be,{...n})}),e.jsx("button",{className:"btn btn-icon btn-danger",onClick:()=>g(s.id),"aria-label":a("secrets.deleteAriaLabel","Delete"),children:e.jsx(je,{...n})})]}),Q===s.id?e.jsxs("div",{className:"secrets-confirm",children:[e.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void pe(s),children:a("secrets.confirmDelete","Confirm")}),e.jsx("button",{className:"btn btn-sm",onClick:()=>g(null),children:a("secrets.cancelDelete","Cancel")})]}):null]})]},s.id)})}),e.jsxs("article",{className:"card secrets-sync-card secrets-sync-disclosure",children:[e.jsxs("button",{type:"button",className:"secrets-sync-disclosure-toggle","data-testid":"secrets-passphrase-disclosure","aria-expanded":E,"aria-controls":"secrets-sync-disclosure-panel",onClick:()=>se(s=>!s),children:[E?e.jsx(fe,{size:16,"aria-hidden":"true"}):e.jsx(Se,{size:16,"aria-hidden":"true"}),e.jsx("span",{children:a("secrets.syncPassphraseTitle","Cross-Node Sync Passphrase")})]}),E?e.jsxs("div",{id:"secrets-sync-disclosure-panel",className:"secrets-sync-disclosure-panel",children:[e.jsxs("div",{className:"secrets-sync-header",children:[e.jsxs("p",{className:"secrets-sync-status",children:[e.jsx("span",{className:`status-dot ${u?"status-dot--online":"status-dot--pending"}`,"aria-hidden":"true"})," ",u?a("secrets.syncConfigured","Configured"):a("secrets.syncNotConfigured","Not configured")]}),e.jsxs("div",{className:"secrets-sync-actions",children:[e.jsx("button",{className:"btn",onClick:()=>_(!0),children:u?a("secrets.rotateSyncPassphrase","Rotate"):a("secrets.setPassphrase","Set passphrase")}),u?e.jsx("button",{className:"btn btn-danger",onClick:()=>void te(),children:a("secrets.clearSyncPassphrase","Clear")}):null]})]}),e.jsx("p",{className:"secrets-sync-copy",children:a("secrets.syncPassphraseDescription","Shared passphrase used to wrap cross-node secret bundles. Both nodes in a sync pair must share the same value. Stored locally only; never transmitted.")})]}):null]}),Z?e.jsx("div",{className:"modal-overlay open",role:"presentation",children:e.jsxs("div",{className:"modal",role:"dialog","aria-modal":"true","aria-label":u?a("secrets.rotateSyncPassphraseModalTitle","Rotate sync passphrase"):a("secrets.setSyncPassphraseModalTitle","Set sync passphrase"),children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h3",{children:u?a("secrets.rotateSyncPassphraseModalTitle","Rotate sync passphrase"):a("secrets.setSyncPassphraseModalTitle","Set sync passphrase")}),e.jsx("button",{className:"modal-close",onClick:k,"aria-label":a("secrets.closeAriaLabel","Close"),children:"×"})]}),e.jsxs("div",{className:"secrets-modal-body",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.passphraseLabel","Passphrase")}),e.jsx("input",{"aria-label":a("secrets.passphraseLabel","Passphrase"),className:"input",type:"password",autoComplete:"new-password",value:f,onChange:s=>B(s.target.value)})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.confirmPassphraseLabel","Confirm passphrase")}),e.jsx("input",{"aria-label":a("secrets.confirmPassphraseLabel","Confirm passphrase"),className:"input",type:"password",autoComplete:"new-password",value:P,onChange:s=>$(s.target.value)})]}),!q&&P.length>0?e.jsx("div",{className:"form-error",children:a("secrets.passphraseMustMatch","Passphrases must match.")}):null]}),e.jsx("div",{className:"modal-actions",children:e.jsxs("div",{className:"modal-actions-right",children:[e.jsx("button",{className:"btn",onClick:k,children:a("secrets.cancelBtn","Cancel")}),e.jsx("button",{className:"btn btn-primary",onClick:()=>void re(),disabled:!q||ee,children:u?a("secrets.rotateSyncPassphrase","Rotate"):a("secrets.setPassphrase","Set passphrase")})]})})]})}):null,U?e.jsx("div",{className:"modal-overlay open",role:"presentation",children:e.jsxs("div",{className:"modal",role:"dialog","aria-modal":"true","aria-label":p?a("secrets.editSecretModalTitle","Edit secret"):a("secrets.addSecretModalTitle","Add secret"),children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h3",{children:p?a("secrets.editSecretModalTitle","Edit secret"):a("secrets.addSecretModalTitle","Add secret")}),e.jsx("button",{className:"modal-close",onClick:()=>x(!1),"aria-label":a("secrets.closeAriaLabel","Close"),children:"×"})]}),e.jsxs("div",{className:"secrets-modal-body",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.keyLabel","Key")}),e.jsx("input",{className:"input",value:t.key,onChange:s=>l(r=>({...r,key:s.target.value}))})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.valueLabel","Value")}),e.jsxs("div",{className:"secrets-value-row",children:[e.jsx("input",{className:"input",type:N?"text":"password",autoComplete:"off",spellCheck:!1,value:t.value,onChange:s=>l(r=>({...r,value:s.target.value}))}),e.jsx("button",{type:"button",className:"btn btn-icon secrets-visibility-toggle",onClick:()=>C(s=>!s),"aria-label":N?a("secrets.hideValueAriaLabel","Hide value"):a("secrets.showValueAriaLabel","Show value"),children:N?e.jsx(Y,{...n}):e.jsx(z,{...n})})]})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.descriptionLabel","Description")}),e.jsx("textarea",{className:"input",value:t.description,onChange:s=>l(r=>({...r,description:s.target.value}))})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.scopeLabel","Scope")}),e.jsxs("div",{className:"secrets-radio-row",children:[e.jsxs("label",{children:[e.jsx("input",{type:"radio",checked:t.scope==="project",onChange:()=>l(s=>({...s,scope:"project"})),disabled:!!p})," ",a("secrets.scopeProject","Project")]}),e.jsxs("label",{children:[e.jsx("input",{type:"radio",checked:t.scope==="global",onChange:()=>l(s=>({...s,scope:"global"})),disabled:!!p})," ",a("secrets.scopeGlobal","Global")]})]})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.accessPolicyLabel","Access policy")}),e.jsxs("select",{className:"select",value:t.accessPolicy,onChange:s=>l(r=>({...r,accessPolicy:s.target.value})),children:[e.jsx("option",{value:"auto",children:a("secrets.accessPolicyAuto","auto")}),e.jsx("option",{value:"prompt",children:a("secrets.accessPolicyPrompt","prompt")}),e.jsx("option",{value:"deny",children:a("secrets.accessPolicyDeny","deny")})]})]}),e.jsx("div",{className:"form-group",children:e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:t.envExportable,onChange:s=>l(r=>({...r,envExportable:s.target.checked}))})," ",a("secrets.exportToEnvLabel","Export to env")]})}),t.envExportable?e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.envKeyLabel","Env key")}),e.jsx("input",{className:"input",value:t.envExportKey,onChange:s=>l(r=>({...r,envExportKey:s.target.value}))})]}):null,K?e.jsx("div",{className:"form-error",children:K}):null]}),e.jsx("div",{className:"modal-actions",children:e.jsxs("div",{className:"modal-actions-right",children:[e.jsx("button",{className:"btn",onClick:()=>x(!1),children:a("secrets.cancelBtn","Cancel")}),e.jsx("button",{className:"btn btn-primary",onClick:()=>void ne(),children:p?a("secrets.saveBtn","Save"):a("secrets.createBtn","Create")})]})})]})}):null]})};export{Me as SecretsView};
1
+ import{r as c,j as e}from"./vendor-react-SZ_qB27O.js";import{V as he,o as me,R as J,P as ye,E as Y,p as z,q as xe,u as ve,v as be,x as je,C as fe,g as Se,y as ge}from"./index-DReijQe4.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 Ce="__sync_passphrase__",L={key:"",value:"",description:"",scope:"project",accessPolicy:"prompt",envExportable:!1,envExportKey:""},n={className:"secrets-action-icon","aria-hidden":!0,style:{width:"1em",height:"1em"}},Pe={...n,className:"secrets-action-icon spin"},Me=({addToast:i})=>{const{t:a}=Ne("app"),[R,G]=c.useState([]),[T,M]=c.useState(!0),[A,D]=c.useState(null),[K,b]=c.useState(null),[p,O]=c.useState(null),[U,x]=c.useState(!1),[Q,g]=c.useState(null),[t,l]=c.useState(L),[N,C]=c.useState(!1),[V,j]=c.useState({}),[W,F]=c.useState(null),[u,X]=c.useState(!1),[Z,_]=c.useState(!1),[f,B]=c.useState(""),[P,$]=c.useState(""),[ee,H]=c.useState(!1),[E,se]=c.useState(!1),h=c.useRef(new Map),w=c.useRef(new Map),o=c.useCallback(async(s,r)=>{const d=await fetch(s,{...r,headers:{"Content-Type":"application/json",...r?.headers??{}}});if(!d.ok){const m=await d.json().catch(()=>({error:"Request failed"}));throw new Error(String(m?.error??"Request failed"))}if(d.status!==204)return d.json()},[]),v=c.useCallback(async()=>{M(!0),D(null);try{const s=await o("/api/secrets");G(s.secrets)}catch(s){D(s instanceof Error?s.message:String(s))}finally{M(!1)}},[o]),S=c.useCallback(async()=>{try{const s=await o("/api/secrets/sync-passphrase");X(!!s.configured)}catch(s){i?.(a("secrets.errorLoadSyncStatus","Failed to load sync passphrase status: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}},[i,o]);c.useEffect(()=>(v(),S(),()=>{h.current.forEach(s=>clearTimeout(s)),w.current.forEach(s=>clearTimeout(s))}),[v,S]);const k=()=>{_(!1),B(""),$("")},ae=async s=>{await o("/api/secrets/sync-passphrase",{method:"PUT",body:JSON.stringify({passphrase:s})})},re=async()=>{H(!0);try{await ae(f),i?.(u?a("secrets.syncPassphraseRotated","Sync passphrase rotated"):a("secrets.syncPassphraseSet","Sync passphrase set"),"success"),k(),await S()}catch(s){i?.(a("secrets.errorSaveSyncPassphrase","Failed to save sync passphrase: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}finally{H(!1)}},te=async()=>{if(window.confirm(a("secrets.confirmClearSyncPassphrase","Clear the cross-node sync passphrase? Existing sync pairs will stop working until you set a new passphrase.")))try{await o("/api/secrets/sync-passphrase",{method:"DELETE"}),i?.(a("secrets.syncPassphraseCleared","Sync passphrase cleared"),"success"),await S()}catch(r){i?.(a("secrets.errorClearSyncPassphrase","Failed to clear sync passphrase: {{error}}",{error:r instanceof Error?r.message:String(r)}),"error")}},ce=()=>{O(null),l(L),x(!0),C(!1),b(null)},le=s=>{O(s),l({key:s.key,value:"",description:s.description??"",scope:s.scope,accessPolicy:s.accessPolicy,envExportable:s.envExportable,envExportKey:s.envExportKey??""}),x(!0),C(!1),b(null)},ne=async()=>{b(null);try{if(p){const s={key:t.key,description:t.description||null,accessPolicy:t.accessPolicy,envExportable:t.envExportable,envExportKey:t.envExportable&&t.envExportKey||null};t.value&&(s.value=t.value),await o(`/api/secrets/${p.scope}/${p.id}`,{method:"PATCH",body:JSON.stringify(s)})}else await o("/api/secrets",{method:"POST",body:JSON.stringify({scope:t.scope,key:t.key,value:t.value,description:t.description||null,accessPolicy:t.accessPolicy,envExportable:t.envExportable,envExportKey:t.envExportable&&t.envExportKey||null})});x(!1),l(L),await v()}catch(s){b(s instanceof Error?s.message:String(s))}},oe=s=>{const r=h.current.get(s.id);r&&(clearTimeout(r),h.current.delete(s.id)),j(d=>({...d,[s.id]:null}))},ie=async s=>{const r=await o(`/api/secrets/${s.scope}/${s.id}/reveal`,{method:"POST"});j(y=>({...y,[s.id]:r.value})),i?.(a("secrets.revealed","Revealed"),"success");const d=setTimeout(()=>{j(y=>({...y,[s.id]:null})),h.current.delete(s.id)},3e4),m=h.current.get(s.id);m&&clearTimeout(m),h.current.set(s.id,d)},de=async s=>{const r=V[s.id];if(!r)return;if(!await ge(r)){i?.(a("secrets.copyFailed","Failed to copy secret"),"error");return}F(s.id),i?.(a("secrets.copied","Copied"),"success");const m=setTimeout(()=>{F(null),j(ue=>({...ue,[s.id]:null}))},1500),y=w.current.get(s.id);y&&clearTimeout(y),w.current.set(s.id,m)},pe=async s=>{await o(`/api/secrets/${s.scope}/${s.id}`,{method:"DELETE"}),g(null),await v()},I=c.useMemo(()=>[...R].filter(s=>!(s.scope==="global"&&s.key===Ce)).sort((s,r)=>s.key.localeCompare(r.key)),[R]),q=f.length>0&&f===P;return e.jsxs("section",{className:"secrets-view",children:[e.jsx(he,{icon:me,title:a("secrets.title","Secrets"),actions:e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>void v(),children:[e.jsx(J,{...n})," ",a("secrets.refresh","Refresh")]}),e.jsxs("button",{className:"btn btn-primary btn-sm",onClick:ce,children:[e.jsx(ye,{...n})," ",a("secrets.addSecret","Add Secret")]})]})}),A?e.jsx("div",{className:"form-error",children:A}):null,T?e.jsxs("div",{className:"secrets-loading",children:[e.jsx(J,{...Pe})," ",a("secrets.loading","Loading…")]}):null,!T&&I.length===0?e.jsx("div",{className:"secrets-empty",children:a("secrets.empty","No secrets found.")}):null,e.jsx("div",{className:"secrets-list",children:I.map(s=>{const r=V[s.id];return e.jsxs("article",{className:"card secrets-row",children:[e.jsxs("div",{className:"secrets-row-main",children:[e.jsx("div",{className:"secrets-row-key",children:s.key}),e.jsxs("div",{className:"secrets-row-meta",children:[e.jsx("span",{className:"secrets-chip",children:s.scope}),e.jsx("span",{className:"secrets-chip",children:s.accessPolicy}),s.envExportable?e.jsx("span",{className:"secrets-chip",children:a("secrets.envExportableChip","env exportable")}):null]}),r?e.jsx("pre",{className:"secrets-revealed",children:r}):null]}),e.jsxs("div",{className:"secrets-row-side",children:[e.jsx("span",{className:"secrets-row-read",children:s.lastReadAt?new Date(s.lastReadAt).toLocaleString():a("secrets.neverRead","Never read")}),e.jsxs("div",{className:"secrets-row-actions",children:[e.jsx("button",{type:"button",className:"btn btn-icon secrets-visibility-toggle",onClick:()=>{if(r){oe(s);return}ie(s)},"aria-label":r?a("secrets.hideAriaLabel","Hide"):a("secrets.revealAriaLabel","Reveal"),children:r?e.jsx(Y,{...n}):e.jsx(z,{...n})}),e.jsx("button",{className:"btn btn-icon",onClick:()=>void de(s),"aria-label":a("secrets.copyAriaLabel","Copy"),disabled:!r,children:W===s.id?e.jsx(xe,{...n}):e.jsx(ve,{...n})}),e.jsx("button",{className:"btn btn-icon",onClick:()=>le(s),"aria-label":a("secrets.editAriaLabel","Edit"),children:e.jsx(be,{...n})}),e.jsx("button",{className:"btn btn-icon btn-danger",onClick:()=>g(s.id),"aria-label":a("secrets.deleteAriaLabel","Delete"),children:e.jsx(je,{...n})})]}),Q===s.id?e.jsxs("div",{className:"secrets-confirm",children:[e.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void pe(s),children:a("secrets.confirmDelete","Confirm")}),e.jsx("button",{className:"btn btn-sm",onClick:()=>g(null),children:a("secrets.cancelDelete","Cancel")})]}):null]})]},s.id)})}),e.jsxs("article",{className:"card secrets-sync-card secrets-sync-disclosure",children:[e.jsxs("button",{type:"button",className:"secrets-sync-disclosure-toggle","data-testid":"secrets-passphrase-disclosure","aria-expanded":E,"aria-controls":"secrets-sync-disclosure-panel",onClick:()=>se(s=>!s),children:[E?e.jsx(fe,{size:16,"aria-hidden":"true"}):e.jsx(Se,{size:16,"aria-hidden":"true"}),e.jsx("span",{children:a("secrets.syncPassphraseTitle","Cross-Node Sync Passphrase")})]}),E?e.jsxs("div",{id:"secrets-sync-disclosure-panel",className:"secrets-sync-disclosure-panel",children:[e.jsxs("div",{className:"secrets-sync-header",children:[e.jsxs("p",{className:"secrets-sync-status",children:[e.jsx("span",{className:`status-dot ${u?"status-dot--online":"status-dot--pending"}`,"aria-hidden":"true"})," ",u?a("secrets.syncConfigured","Configured"):a("secrets.syncNotConfigured","Not configured")]}),e.jsxs("div",{className:"secrets-sync-actions",children:[e.jsx("button",{className:"btn",onClick:()=>_(!0),children:u?a("secrets.rotateSyncPassphrase","Rotate"):a("secrets.setPassphrase","Set passphrase")}),u?e.jsx("button",{className:"btn btn-danger",onClick:()=>void te(),children:a("secrets.clearSyncPassphrase","Clear")}):null]})]}),e.jsx("p",{className:"secrets-sync-copy",children:a("secrets.syncPassphraseDescription","Shared passphrase used to wrap cross-node secret bundles. Both nodes in a sync pair must share the same value. Stored locally only; never transmitted.")})]}):null]}),Z?e.jsx("div",{className:"modal-overlay open",role:"presentation",children:e.jsxs("div",{className:"modal",role:"dialog","aria-modal":"true","aria-label":u?a("secrets.rotateSyncPassphraseModalTitle","Rotate sync passphrase"):a("secrets.setSyncPassphraseModalTitle","Set sync passphrase"),children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h3",{children:u?a("secrets.rotateSyncPassphraseModalTitle","Rotate sync passphrase"):a("secrets.setSyncPassphraseModalTitle","Set sync passphrase")}),e.jsx("button",{className:"modal-close",onClick:k,"aria-label":a("secrets.closeAriaLabel","Close"),children:"×"})]}),e.jsxs("div",{className:"secrets-modal-body",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.passphraseLabel","Passphrase")}),e.jsx("input",{"aria-label":a("secrets.passphraseLabel","Passphrase"),className:"input",type:"password",autoComplete:"new-password",value:f,onChange:s=>B(s.target.value)})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.confirmPassphraseLabel","Confirm passphrase")}),e.jsx("input",{"aria-label":a("secrets.confirmPassphraseLabel","Confirm passphrase"),className:"input",type:"password",autoComplete:"new-password",value:P,onChange:s=>$(s.target.value)})]}),!q&&P.length>0?e.jsx("div",{className:"form-error",children:a("secrets.passphraseMustMatch","Passphrases must match.")}):null]}),e.jsx("div",{className:"modal-actions",children:e.jsxs("div",{className:"modal-actions-right",children:[e.jsx("button",{className:"btn",onClick:k,children:a("secrets.cancelBtn","Cancel")}),e.jsx("button",{className:"btn btn-primary",onClick:()=>void re(),disabled:!q||ee,children:u?a("secrets.rotateSyncPassphrase","Rotate"):a("secrets.setPassphrase","Set passphrase")})]})})]})}):null,U?e.jsx("div",{className:"modal-overlay open",role:"presentation",children:e.jsxs("div",{className:"modal",role:"dialog","aria-modal":"true","aria-label":p?a("secrets.editSecretModalTitle","Edit secret"):a("secrets.addSecretModalTitle","Add secret"),children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h3",{children:p?a("secrets.editSecretModalTitle","Edit secret"):a("secrets.addSecretModalTitle","Add secret")}),e.jsx("button",{className:"modal-close",onClick:()=>x(!1),"aria-label":a("secrets.closeAriaLabel","Close"),children:"×"})]}),e.jsxs("div",{className:"secrets-modal-body",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.keyLabel","Key")}),e.jsx("input",{className:"input",value:t.key,onChange:s=>l(r=>({...r,key:s.target.value}))})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.valueLabel","Value")}),e.jsxs("div",{className:"secrets-value-row",children:[e.jsx("input",{className:"input",type:N?"text":"password",autoComplete:"off",spellCheck:!1,value:t.value,onChange:s=>l(r=>({...r,value:s.target.value}))}),e.jsx("button",{type:"button",className:"btn btn-icon secrets-visibility-toggle",onClick:()=>C(s=>!s),"aria-label":N?a("secrets.hideValueAriaLabel","Hide value"):a("secrets.showValueAriaLabel","Show value"),children:N?e.jsx(Y,{...n}):e.jsx(z,{...n})})]})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.descriptionLabel","Description")}),e.jsx("textarea",{className:"input",value:t.description,onChange:s=>l(r=>({...r,description:s.target.value}))})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.scopeLabel","Scope")}),e.jsxs("div",{className:"secrets-radio-row",children:[e.jsxs("label",{children:[e.jsx("input",{type:"radio",checked:t.scope==="project",onChange:()=>l(s=>({...s,scope:"project"})),disabled:!!p})," ",a("secrets.scopeProject","Project")]}),e.jsxs("label",{children:[e.jsx("input",{type:"radio",checked:t.scope==="global",onChange:()=>l(s=>({...s,scope:"global"})),disabled:!!p})," ",a("secrets.scopeGlobal","Global")]})]})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.accessPolicyLabel","Access policy")}),e.jsxs("select",{className:"select",value:t.accessPolicy,onChange:s=>l(r=>({...r,accessPolicy:s.target.value})),children:[e.jsx("option",{value:"auto",children:a("secrets.accessPolicyAuto","auto")}),e.jsx("option",{value:"prompt",children:a("secrets.accessPolicyPrompt","prompt")}),e.jsx("option",{value:"deny",children:a("secrets.accessPolicyDeny","deny")})]})]}),e.jsx("div",{className:"form-group",children:e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:t.envExportable,onChange:s=>l(r=>({...r,envExportable:s.target.checked}))})," ",a("secrets.exportToEnvLabel","Export to env")]})}),t.envExportable?e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:a("secrets.envKeyLabel","Env key")}),e.jsx("input",{className:"input",value:t.envExportKey,onChange:s=>l(r=>({...r,envExportKey:s.target.value}))})]}):null,K?e.jsx("div",{className:"form-error",children:K}):null]}),e.jsx("div",{className:"modal-actions",children:e.jsxs("div",{className:"modal-actions-right",children:[e.jsx("button",{className:"btn",onClick:()=>x(!1),children:a("secrets.cancelBtn","Cancel")}),e.jsx("button",{className:"btn btn-primary",onClick:()=>void ne(),children:p?a("secrets.saveBtn","Save"):a("secrets.createBtn","Create")})]})})]})}):null]})};export{Me as SecretsView};
@@ -1,2 +1,2 @@
1
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-CE7C_XsS.js";import{r as i,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-_iY63ED4.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]=i.useState(()=>J());return i.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=i.useRef(null),T=i.useRef(null),j=i.useRef(null),S=i.useRef(null),[H,G]=i.useState(!1),[ue,$]=i.useState(!1),[q,Z]=i.useState(!1),g=Je(),{keyboardOpen:z,keyboardOverlap:me}=ge({enabled:g}),fe=i.useRef(null),[_,X]=i.useState(""),[x,M]=i.useState(!1),[pe,ye]=i.useState(()=>A().customShortcuts),[ee,te]=i.useState(null),ne=f||ee===!0,D=!f&&ee===!1&&a==="live",b=i.useCallback(e=>{if(!e||!D)return;const n=S.current;n?.readyState===WebSocket.OPEN&&n.send(JSON.stringify({type:"input",data:e}))},[D]),N=i.useCallback(e=>{if(x){const n=de(e);if(M(!1),n){b(n);return}}b(e)},[x,b]),l=i.useCallback(e=>{e.preventDefault()},[]),be=i.useCallback(e=>{e?.preventDefault?.(),_&&b(_),b("\r"),X("")},[_,b]),he=i.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]);i.useEffect(()=>{W&&$(!1)},[W,u]);const L=i.useCallback((e,n)=>{const d=S.current;d?.readyState===WebSocket.OPEN&&d.send(JSON.stringify({type:"resize",cols:e,rows:n}))},[]),ie=i.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]);i.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]),i.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 s=new ve({convertEol:!1,cursorBlink:w.cursorBlink&&h,cursorStyle:w.cursorStyle,disableStdin:!h,scrollback:1e4,fontFamily:O,fontSize:w.fontSize}),P=new Ee;s.loadAddon(P);const Te=new Ce;if(s.loadAddon(Te),s.unicode.activeVersion="11",Le(()=>{s.open(C.current)}),T.current=s,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{}}),s.loadAddon(m)}}catch{}try{P.fit()}catch{}(async()=>{if(!(!await ce(w.fontSize,O)||e||T.current!==s||j.current!==P||s.options.fontSize!==w.fontSize||s.options.fontFamily!==O))try{B(s,O),s.options.fontSize=w.fontSize,P.fit(),U(s.cols,s.rows),B(s,O),s.refresh(0,Math.max(0,s.rows-1))}catch{}})(),h&&(s.onData(c=>{const m=S.current;m?.readyState===WebSocket.OPEN&&m.send(JSON.stringify({type:"input",data:c}))}),s.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=s.hasSelection()?s.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(s.cols,s.rows)}catch{}},Be)}),n.observe(C.current);const Q=new WebSocket(Ye(u,p.ticket));S.current=Q,Q.onopen=()=>{U(s.cols,s.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;s.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=i.useMemo(()=>a==="idle"?r("cliTerminal.replayIdle","Session idle"):a==="ended"?r("cliTerminal.replayEnded","Session ended"):null,[a,r]),we=i.useCallback(async()=>{if(E){Z(!0);try{await E("advance"),$(!0)}finally{Z(!1)}}},[E]),Se=i.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};
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-DReijQe4.js";import{r as i,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-BjiTG99h.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]=i.useState(()=>J());return i.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=i.useRef(null),T=i.useRef(null),j=i.useRef(null),S=i.useRef(null),[H,G]=i.useState(!1),[ue,$]=i.useState(!1),[q,Z]=i.useState(!1),g=Je(),{keyboardOpen:z,keyboardOverlap:me}=ge({enabled:g}),fe=i.useRef(null),[_,X]=i.useState(""),[x,M]=i.useState(!1),[pe,ye]=i.useState(()=>A().customShortcuts),[ee,te]=i.useState(null),ne=f||ee===!0,D=!f&&ee===!1&&a==="live",b=i.useCallback(e=>{if(!e||!D)return;const n=S.current;n?.readyState===WebSocket.OPEN&&n.send(JSON.stringify({type:"input",data:e}))},[D]),N=i.useCallback(e=>{if(x){const n=de(e);if(M(!1),n){b(n);return}}b(e)},[x,b]),l=i.useCallback(e=>{e.preventDefault()},[]),be=i.useCallback(e=>{e?.preventDefault?.(),_&&b(_),b("\r"),X("")},[_,b]),he=i.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]);i.useEffect(()=>{W&&$(!1)},[W,u]);const L=i.useCallback((e,n)=>{const d=S.current;d?.readyState===WebSocket.OPEN&&d.send(JSON.stringify({type:"resize",cols:e,rows:n}))},[]),ie=i.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]);i.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]),i.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 s=new ve({convertEol:!1,cursorBlink:w.cursorBlink&&h,cursorStyle:w.cursorStyle,disableStdin:!h,scrollback:1e4,fontFamily:O,fontSize:w.fontSize}),P=new Ee;s.loadAddon(P);const Te=new Ce;if(s.loadAddon(Te),s.unicode.activeVersion="11",Le(()=>{s.open(C.current)}),T.current=s,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{}}),s.loadAddon(m)}}catch{}try{P.fit()}catch{}(async()=>{if(!(!await ce(w.fontSize,O)||e||T.current!==s||j.current!==P||s.options.fontSize!==w.fontSize||s.options.fontFamily!==O))try{B(s,O),s.options.fontSize=w.fontSize,P.fit(),U(s.cols,s.rows),B(s,O),s.refresh(0,Math.max(0,s.rows-1))}catch{}})(),h&&(s.onData(c=>{const m=S.current;m?.readyState===WebSocket.OPEN&&m.send(JSON.stringify({type:"input",data:c}))}),s.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=s.hasSelection()?s.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(s.cols,s.rows)}catch{}},Be)}),n.observe(C.current);const Q=new WebSocket(Ye(u,p.ticket));S.current=Q,Q.onopen=()=>{U(s.cols,s.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;s.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=i.useMemo(()=>a==="idle"?r("cliTerminal.replayIdle","Session idle"):a==="ended"?r("cliTerminal.replayEnded","Session ended"):null,[a,r]),we=i.useCallback(async()=>{if(E){Z(!0);try{await E("advance"),$(!0)}finally{Z(!1)}}},[E]),Se=i.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};