specrails-desktop 2.46.0 → 2.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/README.md +2 -0
  2. package/client/dist/assets/{ActivityFeedPage-CsHQPpvl.js → ActivityFeedPage-CGq6QhP5.js} +1 -1
  3. package/client/dist/assets/AgentBrowserCapture-C4GZ-kdf.js +1 -0
  4. package/client/dist/assets/AgentModeAnalyticsPane-_IPmL0ZS.js +2 -0
  5. package/client/dist/assets/AgentModeCodePane-B5WG5DOP.js +2 -0
  6. package/client/dist/assets/{AgentModeJobsPane-rnD-EPMd.js → AgentModeJobsPane-w1N_HIXh.js} +1 -1
  7. package/client/dist/assets/AgentsPage-CmwnnT46.js +87 -0
  8. package/client/dist/assets/AnalyticsPage-BUMsKtsJ.js +1 -0
  9. package/client/dist/assets/CodePage-PjgywJPS.js +3 -0
  10. package/client/dist/assets/DesktopAnalyticsPage-BXY1pH4y.js +1 -0
  11. package/client/dist/assets/DocsDialog-ccQETHKB.js +11 -0
  12. package/client/dist/assets/DocsPage-DzEgplB3.js +11 -0
  13. package/client/dist/assets/{ExportDropdown-pWZGYCv3.js → ExportDropdown-B8bBGopr.js} +1 -1
  14. package/client/dist/assets/InteractiveJobComposer-CEwGkJ8F.js +19 -0
  15. package/client/dist/assets/JobDetailModal-BYXmuTDe.js +1 -0
  16. package/client/dist/assets/JobDetailPage-CWp6MwJj.js +1 -0
  17. package/client/dist/assets/JobsPage-D1O1uyG8.js +1 -0
  18. package/client/dist/assets/{LoopBuilderPage-CtmOE4-b.js → LoopBuilderPage-DQE-7Vby.js} +2 -2
  19. package/client/dist/assets/{LoopPreviewModal-BYeLjQbr.js → LoopPreviewModal-Bk7zIXD5.js} +1 -1
  20. package/client/dist/assets/LoopsPage-CqG7mx56.js +1 -0
  21. package/client/dist/assets/MinimizedChatsContext-UpnqccPx.js +1 -0
  22. package/client/dist/assets/PluginsPage-CjgVvmpW.js +2 -0
  23. package/client/dist/assets/{ProjectSettingsDialog-DsCRIc4v.js → ProjectSettingsDialog-D6vBCoay.js} +1 -1
  24. package/client/dist/assets/{RepositoryDeliveries-BQm_3TO8.js → RepositoryDeliveries-C36ipKp_.js} +1 -1
  25. package/client/dist/assets/{RepositoryScopeSelector-DnAFtjTz.js → RepositoryScopeSelector-0Gz_fR1E.js} +1 -1
  26. package/client/dist/assets/ReviewPacketPage-Dr9RYs7q.js +1 -0
  27. package/client/dist/assets/TemplatePreviewModal-sCMHYFJo.js +1 -0
  28. package/client/dist/assets/TicketDetailModalContext-C5GgJlEt.js +14 -0
  29. package/client/dist/assets/{Trans-BwLgX6n7.js → Trans-9pHTy2fH.js} +1 -1
  30. package/client/dist/assets/{addspec-D2YIQ0GU.js → addspec-BOvgmcgk.js} +1 -1
  31. package/client/dist/assets/{addspec-B_TPJt-R.js → addspec-Clmyfn_R.js} +1 -1
  32. package/client/dist/assets/{addspec-A1lDQa4M.js → addspec-CsNaBpHp.js} +1 -1
  33. package/client/dist/assets/{addspec-CQBjzt24.js → addspec-D2tvWmmV.js} +1 -1
  34. package/client/dist/assets/{addspec-CLYLvaVP.js → addspec-D3nFwvD0.js} +1 -1
  35. package/client/dist/assets/{addspec-BPpZ_olp.js → addspec-DVLEhK3w.js} +1 -1
  36. package/client/dist/assets/{addspec-iFdQ6D99.js → addspec-DXbK-tb0.js} +1 -1
  37. package/client/dist/assets/{addspec-BHZd0N5F.js → addspec-OHG8DFEn.js} +1 -1
  38. package/client/dist/assets/agentRuntime-BUimiX__.js +1 -0
  39. package/client/dist/assets/agentRuntime-BcN97sAB.js +1 -0
  40. package/client/dist/assets/agentRuntime-Ckyg-ahT.js +1 -0
  41. package/client/dist/assets/agentRuntime-DJCwyX4t.js +1 -0
  42. package/client/dist/assets/agentRuntime-DVzPJOl0.js +1 -0
  43. package/client/dist/assets/agentRuntime-V9AZTG3c.js +1 -0
  44. package/client/dist/assets/agentRuntime-bAAjw1vw.js +1 -0
  45. package/client/dist/assets/agentRuntime-v4qKAYH-.js +1 -0
  46. package/client/dist/assets/{agents-45GbINfh.js → agents-CA5eT1d0.js} +1 -1
  47. package/client/dist/assets/{agents-DMKFStHL.js → agents-CAgy-5uS.js} +1 -1
  48. package/client/dist/assets/{agents-IUOgqT5t.js → agents-CNm6Qzlv.js} +1 -1
  49. package/client/dist/assets/{agents-ms7TwG16.js → agents-CTwbx-fb.js} +1 -1
  50. package/client/dist/assets/{agents-DaYcxAr1.js → agents-DEGV1Vao.js} +1 -1
  51. package/client/dist/assets/{agents-BHp0_FQt.js → agents-HsDF1aQU.js} +1 -1
  52. package/client/dist/assets/{agents-Bvyi3y6R.js → agents-IQjdA-z9.js} +1 -1
  53. package/client/dist/assets/{agents-rzPnqoBR.js → agents-RkGoteXh.js} +1 -1
  54. package/client/dist/assets/analytics-BNgZ1Nj7.js +1 -0
  55. package/client/dist/assets/analytics-BlypLLR6.js +1 -0
  56. package/client/dist/assets/analytics-CoEzWPx4.js +1 -0
  57. package/client/dist/assets/analytics-DFh5lSOl.js +1 -0
  58. package/client/dist/assets/analytics-DZp-DS2U.js +1 -0
  59. package/client/dist/assets/analytics-DjLlE7jS.js +1 -0
  60. package/client/dist/assets/analytics-jzCkOec3.js +1 -0
  61. package/client/dist/assets/analytics-nZIjjtCc.js +1 -0
  62. package/client/dist/assets/{dashboard-BK_mez-z.js → dashboard-C29Qwa-L.js} +1 -1
  63. package/client/dist/assets/{dashboard-BwkjxI6H.js → dashboard-CSJzf5OT.js} +1 -1
  64. package/client/dist/assets/{dashboard-C3bDKf7s.js → dashboard-CTfEtkqX.js} +1 -1
  65. package/client/dist/assets/{dashboard-Bt0cCzeG.js → dashboard-Cr4D8oMn.js} +1 -1
  66. package/client/dist/assets/{dashboard-fRrP0Kv0.js → dashboard-Csf1yGSN.js} +1 -1
  67. package/client/dist/assets/{dashboard-CdvjGfog.js → dashboard-D40HP2ks.js} +1 -1
  68. package/client/dist/assets/dashboard-DBAP2_SQ.js +1 -0
  69. package/client/dist/assets/{dashboard-B14uYXkG.js → dashboard-DMklepmz.js} +1 -1
  70. package/client/dist/assets/file-text-CFT-xXKN.js +1 -0
  71. package/client/dist/assets/{formatDistanceToNow-CeZv93iR.js → formatDistanceToNow-w_2U5pm0.js} +1 -1
  72. package/client/dist/assets/{getTimezoneOffsetInMilliseconds-DxAkjvJb.js → getTimezoneOffsetInMilliseconds-BRymg1Kk.js} +1 -1
  73. package/client/dist/assets/index-D0ScFZvR.css +2 -0
  74. package/client/dist/assets/index-DORCrgbI.js +77 -0
  75. package/client/dist/assets/jira-api-BqHbSdxK.js +1 -0
  76. package/client/dist/assets/jobs-C6qmvUAi.js +1 -0
  77. package/client/dist/assets/jobs-C9j2PuwW.js +1 -0
  78. package/client/dist/assets/jobs-DLHdDkHc.js +1 -0
  79. package/client/dist/assets/jobs-DSp9DoD_.js +1 -0
  80. package/client/dist/assets/jobs-DTQO08nJ.js +1 -0
  81. package/client/dist/assets/jobs-DoFaEl9g.js +1 -0
  82. package/client/dist/assets/jobs-Dpw6AEOP.js +1 -0
  83. package/client/dist/assets/jobs-DrF8Do8s.js +1 -0
  84. package/client/dist/assets/{narration-BSldQfjd.js → narration--hUhjM5v.js} +1 -1
  85. package/client/dist/assets/{narration-DKLjXIFI.js → narration-CHI06czm.js} +1 -1
  86. package/client/dist/assets/{narration-4OSg0b5-.js → narration-DjKB3pQZ.js} +1 -1
  87. package/client/dist/assets/{narration-BPMOQPFe.js → narration-DtCYvRLM.js} +1 -1
  88. package/client/dist/assets/{narration-D-e9ssxA.js → narration-DvLQBW9U.js} +1 -1
  89. package/client/dist/assets/{narration-DnrKC3mF.js → narration-eSx3gR0W.js} +1 -1
  90. package/client/dist/assets/{narration-Dypjxeel.js → narration-n3hOA7LY.js} +1 -1
  91. package/client/dist/assets/{narration-CvQdWdR5.js → narration-thJOeT2-.js} +1 -1
  92. package/client/dist/assets/packet-BNW8ODQw.js +1 -0
  93. package/client/dist/assets/packet-CXYvfdjy.js +1 -0
  94. package/client/dist/assets/packet-CtIlB8YE.js +1 -0
  95. package/client/dist/assets/packet-DA1SJkMH.js +1 -0
  96. package/client/dist/assets/packet-DYcWfBip.js +1 -0
  97. package/client/dist/assets/packet-DseX9yKC.js +1 -0
  98. package/client/dist/assets/packet-_m5aOy_d.js +1 -0
  99. package/client/dist/assets/packet-qOemUAm3.js +1 -0
  100. package/client/dist/assets/{project-repositories-BvBj9XH9.js → project-repositories-BsCs1PPA.js} +1 -1
  101. package/client/dist/assets/provider-capabilities-Vi1ZGvAK.js +1 -0
  102. package/client/dist/assets/settings-BsehKpty.js +1 -0
  103. package/client/dist/assets/settings-CQWob3SB.js +1 -0
  104. package/client/dist/assets/settings-CgCl0hzy.js +1 -0
  105. package/client/dist/assets/settings-DLRLd22L.js +1 -0
  106. package/client/dist/assets/settings-Dn5prAFl.js +1 -0
  107. package/client/dist/assets/settings-HZSu-K4l.js +1 -0
  108. package/client/dist/assets/{settings-DEgcA0jd.js → settings-p4OVIyRh.js} +1 -1
  109. package/client/dist/assets/settings-rddaldUp.js +1 -0
  110. package/client/dist/assets/setup-B5FHuxvB.js +1 -0
  111. package/client/dist/assets/setup-BihzXadx.js +1 -0
  112. package/client/dist/assets/setup-BtC6Hg4K.js +1 -0
  113. package/client/dist/assets/setup-C9Fy9PKQ.js +1 -0
  114. package/client/dist/assets/setup-CROyqD5N.js +1 -0
  115. package/client/dist/assets/setup-DpqzaEEA.js +1 -0
  116. package/client/dist/assets/setup-Dwzt5nO1.js +1 -0
  117. package/client/dist/assets/setup-zLEDnG7N.js +1 -0
  118. package/client/dist/assets/{spending-DNM6NAoA.js → spending-hcgxHP4O.js} +1 -1
  119. package/client/dist/assets/{useDesktop-mxHVQOdx.js → useDesktop-CAisjKWC.js} +1 -1
  120. package/client/dist/assets/{useSharedWebSocket-DnxHj8jP.js → useSharedWebSocket-BHIfW4QT.js} +2 -2
  121. package/client/dist/assets/wrench-BfmNO9Vw.js +1 -0
  122. package/client/dist/index.html +27 -26
  123. package/docs/guide/de/integrations/7-local-engines.md +37 -0
  124. package/docs/guide/en/integrations/7-local-engines.md +37 -0
  125. package/docs/guide/es/integrations/7-local-engines.md +37 -0
  126. package/docs/guide/fr/integrations/7-local-engines.md +37 -0
  127. package/docs/guide/it/integrations/7-local-engines.md +37 -0
  128. package/docs/guide/ja/integrations/7-local-engines.md +37 -0
  129. package/docs/guide/pt/integrations/7-local-engines.md +37 -0
  130. package/docs/guide/zh/integrations/7-local-engines.md +37 -0
  131. package/docs/internals/adding-a-provider.md +12 -0
  132. package/docs/internals/local-agent-runner.md +153 -0
  133. package/docs/internals/review-packet.md +8 -0
  134. package/docs/local-providers.md +215 -0
  135. package/docs/plans/implementation-efficiency-artifact.json +18 -0
  136. package/docs/plans/implementation-efficiency-evaluation.json +1817 -0
  137. package/docs/plans/implementation-efficiency-evaluation.md +41 -0
  138. package/docs/plans/implementation-efficiency-progress.md +48 -0
  139. package/docs/plans/implementation-efficiency-release.md +41 -0
  140. package/docs/plans/implementation-efficiency.md +124 -0
  141. package/local-runner/dist/specrails-local-runner.js +15815 -0
  142. package/package.json +7 -5
  143. package/server/dist/agent-chat-manager.js +8 -1
  144. package/server/dist/agent-chat-router.js +5 -2
  145. package/server/dist/agent-fence-promotion.js +53 -0
  146. package/server/dist/agent-mcp-config.js +4 -1
  147. package/server/dist/agent-runtime-bridge.js +35 -26
  148. package/server/dist/agent-runtime-controls-router.js +20 -1
  149. package/server/dist/agent-runtime-controls.js +94 -12
  150. package/server/dist/agent-runtime-effective-config.js +53 -0
  151. package/server/dist/agent-runtime-events.js +46 -0
  152. package/server/dist/agent-runtime-history.js +47 -0
  153. package/server/dist/agent-runtime-loader.js +84 -5
  154. package/server/dist/agent-runtime-metrics.js +77 -1
  155. package/server/dist/agent-runtime-package.js +205 -0
  156. package/server/dist/agent-runtime-settings-router.js +96 -5
  157. package/server/dist/agent-runtime-settings.js +163 -7
  158. package/server/dist/agent-spec-framing.js +10 -4
  159. package/server/dist/binary-probe.js +12 -0
  160. package/server/dist/blueprint-router.js +3 -2
  161. package/server/dist/chat-manager.js +5 -1
  162. package/server/dist/desktop-router.js +87 -4
  163. package/server/dist/index.js +13 -0
  164. package/server/dist/interactive-job-session.js +3 -1
  165. package/server/dist/local-engine-detection.js +118 -0
  166. package/server/dist/loop-executors.js +4 -3
  167. package/server/dist/loop-role-engines.js +129 -0
  168. package/server/dist/loop-run-manager.js +14 -6
  169. package/server/dist/mcp/tools/app-settings.js +30 -4
  170. package/server/dist/mcp/tools/rails.js +2 -1
  171. package/server/dist/pr-body.js +11 -2
  172. package/server/dist/pricing.js +15 -0
  173. package/server/dist/provider-detection.js +63 -1
  174. package/server/dist/provider-selection.js +26 -1
  175. package/server/dist/providers/index.js +4 -1
  176. package/server/dist/providers/local-adapter-registry.js +56 -0
  177. package/server/dist/providers/local-adapter.js +426 -0
  178. package/server/dist/providers/registry.js +39 -4
  179. package/server/dist/rail-isolated-launch.js +4 -3
  180. package/server/dist/rails-router.js +90 -8
  181. package/server/dist/result-event.js +17 -0
  182. package/server/dist/review-packet.js +1 -0
  183. package/server/dist/schemas/agent-runtime.schema.json +28 -3
  184. package/server/dist/schemas/fixtures/runtime-efficiency-summary.v1.json +790 -0
  185. package/server/dist/setup-manager.js +5 -1
  186. package/server/dist/spec-models.js +14 -2
  187. package/server/dist/worktree-node-modules.js +97 -65
  188. package/client/dist/assets/AgentBrowserCapture-BVcCK7x0.js +0 -1
  189. package/client/dist/assets/AgentModeAnalyticsPane-C5F3m29G.js +0 -2
  190. package/client/dist/assets/AgentModeCodePane-C5QuKsu0.js +0 -2
  191. package/client/dist/assets/AgentsPage-DiyJWZcU.js +0 -87
  192. package/client/dist/assets/AnalyticsPage-Dkmb0dnd.js +0 -1
  193. package/client/dist/assets/CodePage-C0dH99-t.js +0 -3
  194. package/client/dist/assets/DesktopAnalyticsPage-DuTjr2n8.js +0 -1
  195. package/client/dist/assets/DocsDialog-BVZJZHVR.js +0 -11
  196. package/client/dist/assets/DocsPage-D6KHTv8V.js +0 -11
  197. package/client/dist/assets/InteractiveJobComposer-Ck3PQxjN.js +0 -19
  198. package/client/dist/assets/JobDetailModal-DkoMH3ie.js +0 -1
  199. package/client/dist/assets/JobDetailPage-CBVivcl2.js +0 -1
  200. package/client/dist/assets/JobsPage-CzxEeca9.js +0 -1
  201. package/client/dist/assets/LoopsPage-6iW7g25k.js +0 -1
  202. package/client/dist/assets/MinimizedChatsContext-B6wVevPq.js +0 -1
  203. package/client/dist/assets/PluginsPage-Bf1z3WPF.js +0 -2
  204. package/client/dist/assets/ReviewPacketPage-CaXAwtR7.js +0 -1
  205. package/client/dist/assets/TemplatePreviewModal-9aRFpJ_J.js +0 -1
  206. package/client/dist/assets/TicketDetailModalContext-B1X5glzV.js +0 -14
  207. package/client/dist/assets/agentRuntime-BUagD2I_.js +0 -1
  208. package/client/dist/assets/agentRuntime-BkL70WtX.js +0 -1
  209. package/client/dist/assets/agentRuntime-CWXVqgqE.js +0 -1
  210. package/client/dist/assets/agentRuntime-CvNBdUAe.js +0 -1
  211. package/client/dist/assets/agentRuntime-D4RmeuNY.js +0 -1
  212. package/client/dist/assets/agentRuntime-DTidBWKg.js +0 -1
  213. package/client/dist/assets/agentRuntime-DhKYfyaU.js +0 -1
  214. package/client/dist/assets/agentRuntime-LL8_GLx9.js +0 -1
  215. package/client/dist/assets/analytics-47pYygtV.js +0 -1
  216. package/client/dist/assets/analytics-B0vt1g5U.js +0 -1
  217. package/client/dist/assets/analytics-BMzCvrCU.js +0 -1
  218. package/client/dist/assets/analytics-BlFN3Zwx.js +0 -1
  219. package/client/dist/assets/analytics-CZYzL-nR.js +0 -1
  220. package/client/dist/assets/analytics-DAsb9MJ8.js +0 -1
  221. package/client/dist/assets/analytics-FXQlQ2Yt.js +0 -1
  222. package/client/dist/assets/analytics-RnFCNkah.js +0 -1
  223. package/client/dist/assets/dashboard-BfBir_6o.js +0 -1
  224. package/client/dist/assets/file-text-BcLCfcWZ.js +0 -1
  225. package/client/dist/assets/index-Cfh9aaep.css +0 -2
  226. package/client/dist/assets/index-DYoyDWim.js +0 -76
  227. package/client/dist/assets/jira-api-ChjVGJx_.js +0 -1
  228. package/client/dist/assets/jobs-5PQJbdOf.js +0 -1
  229. package/client/dist/assets/jobs-B2B08Oy9.js +0 -1
  230. package/client/dist/assets/jobs-BJZtBbwb.js +0 -1
  231. package/client/dist/assets/jobs-BlWEsQb7.js +0 -1
  232. package/client/dist/assets/jobs-ConfD8xD.js +0 -1
  233. package/client/dist/assets/jobs-DMPU64ms.js +0 -1
  234. package/client/dist/assets/jobs-DojASiTp.js +0 -1
  235. package/client/dist/assets/jobs-kVHkNpB-.js +0 -1
  236. package/client/dist/assets/packet-BQ2tXfJI.js +0 -1
  237. package/client/dist/assets/packet-BdpOJ1Cy.js +0 -1
  238. package/client/dist/assets/packet-C3Ievb9R.js +0 -1
  239. package/client/dist/assets/packet-C4zJIG0Y.js +0 -1
  240. package/client/dist/assets/packet-Cx-zRuWn.js +0 -1
  241. package/client/dist/assets/packet-DUTGX52M.js +0 -1
  242. package/client/dist/assets/packet-DhsKtUPB.js +0 -1
  243. package/client/dist/assets/packet-z3LJ8Zyy.js +0 -1
  244. package/client/dist/assets/provider-capabilities-CXipwrXJ.js +0 -1
  245. package/client/dist/assets/settings-B3rWEwOx.js +0 -1
  246. package/client/dist/assets/settings-BcVoiMyw.js +0 -1
  247. package/client/dist/assets/settings-BlYvaQ7w.js +0 -1
  248. package/client/dist/assets/settings-CD5uEBiL.js +0 -1
  249. package/client/dist/assets/settings-CyhS0DLJ.js +0 -1
  250. package/client/dist/assets/settings-DCMFUGDs.js +0 -1
  251. package/client/dist/assets/settings-DmbYKyMJ.js +0 -1
  252. package/client/dist/assets/setup-2xGgu4Sk.js +0 -1
  253. package/client/dist/assets/setup-Ba11l2JA.js +0 -1
  254. package/client/dist/assets/setup-BzW4kMok.js +0 -1
  255. package/client/dist/assets/setup-COzwYhkJ.js +0 -1
  256. package/client/dist/assets/setup-CRVULhtF.js +0 -1
  257. package/client/dist/assets/setup-DgvlxwpE.js +0 -1
  258. package/client/dist/assets/setup-Dw_wYeEY.js +0 -1
  259. package/client/dist/assets/setup-ZPtEeJPW.js +0 -1
@@ -0,0 +1,14 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/core-B3mKBIh5.js","assets/rolldown-runtime-CNC7AqOf.js","assets/dist-js-Rlh4FLH5.js","assets/event-Bt7f3wXe.js"])))=>i.map(i=>d[i]);
2
+ import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t,t as n}from"./jsx-runtime-zu2_FqZY.js";import{t as r}from"./react-dom-DiWzBDP9.js";import{t as i}from"./preload-helper-Czpn1I53.js";import{u as a}from"./chunk-KS7C4IRE-DEKu087k.js";import{D as o,E as s,a as c,h as l,l as u,m as d,r as f,w as p,x as m}from"./useSharedWebSocket-BHIfW4QT.js";import{t as h}from"./Trans-9pHTy2fH.js";import{n as g,t as _}from"./createLucideIcon-Bjbbp_KS.js";import{a as v,r as y,s as b}from"./useDesktop-CAisjKWC.js";import{a as x}from"./provider-capabilities-Vi1ZGvAK.js";import{n as S,t as C}from"./save-B6wGWwBR.js";import{n as w,r as T}from"./spending-hcgxHP4O.js";import{c as E,d as D,n as O,u as k}from"./MinimizedChatsContext-UpnqccPx.js";import{t as A}from"./circle-x-CMYsN4ZH.js";import{t as j}from"./download-CFHyyHcw.js";import{t as M}from"./file-text-CFT-xXKN.js";import{t as N}from"./git-branch-BRM0F5GN.js";import{t as ee}from"./loader-circle-DcygOQpC.js";import{t as P}from"./pencil-C9RkrIPZ.js";import{n as te,t as F}from"./square-Ci-PFcFe.js";import{t as I}from"./plus-CsnjfkmX.js";import{t as L}from"./search-Cq_gE3Ik.js";import{t as ne}from"./trash-2-BOU3WdZZ.js";import{t as R}from"./triangle-alert-H9T4jAmh.js";import{t as re}from"./wrench-BfmNO9Vw.js";import{t as ie}from"./x-CBMI9ejn.js";import{t as z}from"./zap-CHo3aCD1.js";import{M as ae,N as oe,a as B,i as se,j as ce,l as le,o as ue,r as de,t as fe}from"./dialog-xXB2q5HJ.js";import{t as V}from"./utils-BC4DHlz2.js";import{n as pe,t as me}from"./lib-CGdyxIWg.js";import{t as H}from"./formatDistanceToNow-w_2U5pm0.js";import{t as U}from"./button-Ccc9Dc-D.js";import{t as he}from"./jira-api-BqHbSdxK.js";import{t as ge}from"./RepositoryScopeSelector-0Gz_fR1E.js";function _e(){return typeof window<`u`&&window.__TAURI_INTERNALS__!==void 0}async function W(e){if(!_e())return;let{invoke:t}=await i(async()=>{let{invoke:e}=await import(`./core-B3mKBIh5.js`).then(e=>e.i);return{invoke:e}},__vite__mapDeps([0,1]));await t(`desktop_reveal_path`,{path:e})}async function ve(e){if(_e())try{let t=await i(()=>import(`./dist-js-Rlh4FLH5.js`),__vite__mapDeps([2,0,1]));if(typeof t.open==`function`){await t.open(e);return}}catch(e){console.warn(`[openExternalUrl] tauri shell open failed:`,e)}try{window.open(e,`_blank`,`noopener,noreferrer`)}catch{}}function ye(e=``){return e||(typeof window<`u`&&(`__TAURI_INTERNALS__`in window||window.location.hostname===`tauri.localhost`)||typeof window<`u`&&window.location.protocol!==`http:`&&window.location.protocol!==`https:`?`ws://127.0.0.1:4200`:`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.host}`)}var be=ye(),xe=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_TERMINAL_PANEL;return typeof e!=`string`||e!==`false`})(),Se=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_AGENTS_SECTION;return typeof e!=`string`||e!==`false`})(),Ce=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_CODE_EXPLORER;return typeof e!=`string`||e!==`false`})(),we=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_JIRA;return typeof e!=`string`||e!==`false`})(),Te=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_MCP;return typeof e!=`string`||e!==`false`})(),Ee=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_AGENT_CHAT;return typeof e!=`string`||e!==`false`})(),De=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_AGENT_MODE;return Ee&&(typeof e!=`string`||e!==`false`)})();(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_INTERACTIVE_JOBS;return typeof e!=`string`||e!==`false`})();var Oe=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_LOOPS_SECTION;return typeof e!=`string`||e!==`false`})(),ke=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_NATIVE_BROWSER;return typeof e!=`string`||e!==`false`})(),G=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_PROJECT_BUILDER;return typeof e!=`string`||e!==`false`})(),Ae=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_REVIEW_PACKET;return typeof e!=`string`||e!==`false`})(),je=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_NARRATED_PROGRESS;return typeof e!=`string`||e!==`false`})(),Me=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_LOCAL_ENGINES;return typeof e!=`string`||e!==`false`})();function Ne(){return Me}var Pe=_(`arrow-right`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`m12 5 7 7-7 7`,key:`xquz4c`}]]),Fe=_(`camera`,[[`path`,{d:`M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z`,key:`18u6gg`}],[`circle`,{cx:`12`,cy:`13`,r:`3`,key:`1vg3eu`}]]),Ie=_(`circle-arrow-right`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m12 16 4-4-4-4`,key:`1i9zcv`}],[`path`,{d:`M8 12h8`,key:`1wcyev`}]]),Le=_(`circle`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),Re=_(`columns-2`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M12 3v18`,key:`108xh3`}]]),ze=_(`droplet`,[[`path`,{d:`M12 22a7 7 0 0 0 7-7c0-2-1-3.9-3-5.5s-3.5-4-4-6.5c-.5 2.5-2 4.9-4 6.5C6 11.1 5 13 5 15a7 7 0 0 0 7 7z`,key:`c7niix`}]]),Be=_(`file-minus-corner`,[[`path`,{d:`M20 14V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12`,key:`l9p8hp`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M14 18h6`,key:`1m8k6r`}]]),Ve=_(`file-plus-corner`,[[`path`,{d:`M11.35 22H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v5.35`,key:`17jvcc`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M14 19h6`,key:`bvotb8`}],[`path`,{d:`M17 16v6`,key:`18yu1i`}]]),K=_(`git-commit-horizontal`,[[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}],[`line`,{x1:`3`,x2:`9`,y1:`12`,y2:`12`,key:`1dyftd`}],[`line`,{x1:`15`,x2:`21`,y1:`12`,y2:`12`,key:`oup4p8`}]]),He=_(`git-pull-request`,[[`circle`,{cx:`18`,cy:`18`,r:`3`,key:`1xkwt0`}],[`circle`,{cx:`6`,cy:`6`,r:`3`,key:`1lh9wr`}],[`path`,{d:`M13 6h3a2 2 0 0 1 2 2v7`,key:`1yeb86`}],[`line`,{x1:`6`,x2:`6`,y1:`9`,y2:`21`,key:`rroup`}]]),Ue=_(`globe`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20`,key:`13o1zl`}],[`path`,{d:`M2 12h20`,key:`9i4pu4`}]]),We=_(`hash`,[[`line`,{x1:`4`,x2:`20`,y1:`9`,y2:`9`,key:`4lhtct`}],[`line`,{x1:`4`,x2:`20`,y1:`15`,y2:`15`,key:`vyu0kd`}],[`line`,{x1:`10`,x2:`8`,y1:`3`,y2:`21`,key:`1ggp8o`}],[`line`,{x1:`16`,x2:`14`,y1:`3`,y2:`21`,key:`weycgp`}]]),Ge=_(`message-square`,[[`path`,{d:`M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z`,key:`18887p`}]]),Ke=_(`mouse-pointer-2`,[[`path`,{d:`M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z`,key:`edeuup`}]]),qe=_(`redo-2`,[[`path`,{d:`m15 14 5-5-5-5`,key:`12vg1m`}],[`path`,{d:`M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13`,key:`6uklza`}]]),Je=_(`rotate-cw`,[[`path`,{d:`M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8`,key:`1p45f6`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}]]),Ye=_(`split`,[[`path`,{d:`M16 3h5v5`,key:`1806ms`}],[`path`,{d:`M8 3H3v5`,key:`15dfkv`}],[`path`,{d:`M12 22v-8.3a4 4 0 0 0-1.172-2.872L3 3`,key:`1qrqzj`}],[`path`,{d:`m15 9 6-6`,key:`ko1vev`}]]),Xe=_(`ticket`,[[`path`,{d:`M2 9a3 3 0 0 1 0 6v2a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-2a3 3 0 0 1 0-6V7a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z`,key:`qn84l0`}],[`path`,{d:`M13 5v2`,key:`dyzc3o`}],[`path`,{d:`M13 17v2`,key:`1ont0d`}],[`path`,{d:`M13 11v2`,key:`1wjjxi`}]]),Ze=_(`type`,[[`path`,{d:`M12 4v16`,key:`1654pz`}],[`path`,{d:`M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2`,key:`e0r10z`}],[`path`,{d:`M9 20h6`,key:`s66wpe`}]]),Qe=_(`undo-2`,[[`path`,{d:`M9 14 4 9l5-5`,key:`102s5s`}],[`path`,{d:`M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11`,key:`f3b9sd`}]]),$e=_(`zoom-in`,[[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}],[`line`,{x1:`21`,x2:`16.65`,y1:`21`,y2:`16.65`,key:`13gj7c`}],[`line`,{x1:`11`,x2:`11`,y1:`8`,y2:`14`,key:`1vmskp`}],[`line`,{x1:`8`,x2:`14`,y1:`11`,y2:`11`,key:`durymu`}]]),et=_(`zoom-out`,[[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}],[`line`,{x1:`21`,x2:`16.65`,y1:`21`,y2:`16.65`,key:`13gj7c`}],[`line`,{x1:`8`,x2:`14`,y1:`11`,y2:`11`,key:`durymu`}]]),q=new Map,tt=2e3;function nt(e){q.set(e,(q.get(e)??0)+1)}function rt(e){(q.get(e)??0)<=0||setTimeout(()=>{let t=(q.get(e)??0)-1;t<=0?q.delete(e):q.set(e,t)},tt)}function it(e){return e?(q.get(e)??0)>0:!1}var J=e(t(),1),Y=3e3,at=`
3
+
4
+ ---
5
+
6
+ ## Contract Layer
7
+
8
+ `;function ot(e){return`${u}/api/projects/${encodeURIComponent(e)}`}function st(e,t){return JSON.stringify(e)===JSON.stringify(t)}function ct(e,t){let n=new Map(e.map(e=>[e.id,e])),r=t.map(e=>{let t=n.get(e.id);return t&&st(t,e)?t:e});return r.length===e.length&&r.every((t,n)=>t===e[n])?e:r}function lt(){let{t:e}=g(`tickets`),{activeProjectId:t}=y(),[n,r]=(0,J.useState)([]),[i,a]=(0,J.useState)(!1),[o,s]=(0,J.useState)(null),[c,l]=(0,J.useState)(new Set),[u,d]=(0,J.useState)(new Set),p=(0,J.useRef)(t);p.current=t;let m=(0,J.useRef)(0),h=(0,J.useRef)(null),_=(0,J.useRef)(new Set),{registerHandler:v,unregisterHandler:x,connectionStatus:S}=f(),C=(0,J.useId)(),w=(0,J.useCallback)(async(e,t)=>{let n=ot(e),r=await fetch(`${n}/tickets`,{signal:t,cache:`no-store`});if(!r.ok)throw Error(`Failed to fetch tickets: ${r.status}`);let i=await r.json();return Array.isArray(i)?i:i.tickets??[]},[]),T=(0,J.useCallback)(async(t,n)=>{let i=++m.current;h.current?.abort();let o=new AbortController;h.current=o,p.current===t&&(a(!0),s(null));try{let a=await w(t,o.signal);if(o.signal.aborted||i!==m.current||p.current!==t)return;let s=_.current,c=new Set;if(n===`merge`)for(let e of a)s.size>0&&!s.has(e.id)&&c.add(e.id);_.current=new Set(a.map(e=>e.id)),r(n===`replace`?a:e=>ct(e,a)),c.size>0&&s.size>0&&(l(c),b.success(e(`toasts.newTicketsAdded`,{count:c.size}),{id:`tickets-added-${t}`}),setTimeout(()=>{p.current===t&&l(e=>{let t=new Set(e);for(let e of c)t.delete(e);return t})},Y))}catch(e){if(o.signal.aborted||i!==m.current||p.current!==t)return;s(e instanceof Error?e.message:String(e))}finally{i===m.current&&(h.current===o&&(h.current=null),p.current===t&&a(!1))}},[w,e]),E=(0,J.useCallback)(async()=>{t&&await T(t,`merge`)},[t,T]);(0,J.useEffect)(()=>{if(m.current+=1,h.current?.abort(),h.current=null,r([]),a(!1),s(null),_.current=new Set,l(new Set),d(new Set),t)return T(t,`replace`),()=>{m.current+=1,h.current?.abort(),h.current=null}},[t,T]);let D=(0,J.useCallback)(t=>{let n=t;if(!n||typeof n.type!=`string`)return;let i=p.current;if(!(n.projectId&&n.projectId!==i))switch(n.type){case`desktop.project_recovered`:n.projectId===i&&E();break;case`mcp.activity`:n.affectedProjectId&&n.affectedProjectId===i&&E();break;case`ticket_created`:{if(!n.ticket)break;let t=n.ticket;r(e=>e.some(e=>e.id===t.id)?e:[...e,t]),_.current.add(t.id),l(e=>new Set([...e,t.id])),it(i)||b.success(e(`toasts.newTicket`,{title:t.title}),{id:`new-ticket-${t.id}`}),setTimeout(()=>{l(e=>{let n=new Set(e);return n.delete(t.id),n})},Y);break}case`ticket_updated`:{if(!n.ticket)break;if(n.ticket.id===0){E();break}let e=n.ticket;r(t=>t.map(t=>t.id===e.id?e:t)),typeof e.description==`string`&&e.description.includes(at)&&d(t=>{if(!t.has(e.id))return t;let n=new Set(t);return n.delete(e.id),n});break}case`ticket_deleted`:{if(n.ticketId==null)break;let e=n.ticketId;r(t=>t.filter(t=>t.id!==e)),_.current.delete(e);break}case`explore.contract_refine_started`:if(n.ticketId==null)break;d(e=>new Set([...e,n.ticketId]));break;case`explore.contract_refine_failed`:{if(n.ticketId==null)break;let e=n.ticketId;d(t=>{if(!t.has(e))return t;let n=new Set(t);return n.delete(e),n});break}}},[E,e]);(0,J.useLayoutEffect)(()=>(v(`tickets-${C}`,D),()=>x(`tickets-${C}`)),[D,v,x,C]);let O=(0,J.useRef)(S);return(0,J.useEffect)(()=>{O.current!==`connected`&&S===`connected`&&p.current&&E(),O.current=S},[S,E]),{tickets:n,loading:i,isLoading:i,error:o,newTicketIds:c,contractRefiningIds:u,refetch:E,refresh:E,deleteTicket:(0,J.useCallback)(async e=>{let n=t;if(!n)return!1;try{let t=await fetch(`${ot(n)}/tickets/${e}`,{method:`DELETE`});return t.ok&&p.current===n&&await T(n,`merge`),t.ok}catch{return!1}},[t,T]),updateTicketStatus:(0,J.useCallback)(async(e,n)=>{let r=t;if(!r)return!1;try{let t=await fetch(`${ot(r)}/tickets/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({status:n})});return t.ok&&p.current===r&&await T(r,`merge`),t.ok}catch{return!1}},[t,T]),updateTicketPriority:(0,J.useCallback)(async(e,n)=>{let r=t;if(!r)return!1;try{let t=await fetch(`${ot(r)}/tickets/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({priority:n})});return t.ok&&p.current===r&&await T(r,`merge`),t.ok}catch{return!1}},[t,T]),createTicket:(0,J.useCallback)(async e=>{let n=t;if(!n)return!1;try{let t=await fetch(`${ot(n)}/tickets`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});return t.ok&&p.current===n&&await T(n,`merge`),t.ok}catch{return!1}},[t,T]),updateTicket:(0,J.useCallback)(async(e,n)=>{let r=t;if(!r)return!1;try{let t=await fetch(`${ot(r)}/tickets/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n)});return t.ok&&p.current===r&&await T(r,`merge`),t.ok}catch{return!1}},[t,T])}}function ut(e,t){let n=()=>p(t?.in,NaN),r=t?.additionalDigits??2,i=ht(e),a;if(i.date){let e=gt(i.date,r);a=_t(e.restDateString,e.year)}if(!a||isNaN(+a))return n();let o=+a,s=0,c;if(i.time&&(s=yt(i.time),isNaN(s)))return n();if(i.timezone){if(c=xt(i.timezone),isNaN(c))return n()}else{let e=new Date(o+s),n=m(0,t?.in);return n.setFullYear(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()),n.setHours(e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()),n}return m(o+s+c,t?.in)}var dt={dateTimeDelimiter:/[T ]/,timeZoneDelimiter:/[Z ]/i,timezone:/([Z+-].*)$/},ft=/^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/,pt=/^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/,mt=/^([+-])(\d{2})(?::?(\d{2}))?$/;function ht(e){let t={},n=e.split(dt.dateTimeDelimiter),r;if(n.length>2)return t;if(/:/.test(n[0])?r=n[0]:(t.date=n[0],r=n[1],dt.timeZoneDelimiter.test(t.date)&&(t.date=e.split(dt.timeZoneDelimiter)[0],r=e.substr(t.date.length,e.length))),r){let e=dt.timezone.exec(r);e?(t.time=r.replace(e[1],``),t.timezone=e[1]):t.time=r}return t}function gt(e,t){let n=RegExp(`^(?:(\\d{4}|[+-]\\d{`+(4+t)+`})|(\\d{2}|[+-]\\d{`+(2+t)+`})$)`),r=e.match(n);if(!r)return{year:NaN,restDateString:``};let i=r[1]?parseInt(r[1]):null,a=r[2]?parseInt(r[2]):null;return{year:a===null?i:a*100,restDateString:e.slice((r[1]||r[2]).length)}}function _t(e,t){if(t===null)return new Date(NaN);let n=e.match(ft);if(!n)return new Date(NaN);let r=!!n[4],i=vt(n[1]),a=vt(n[2])-1,o=vt(n[3]),s=vt(n[4]),c=vt(n[5])-1;if(r)return Dt(t,s,c)?St(t,s,c):new Date(NaN);{let e=new Date(0);return!Tt(t,a,o)||!Et(t,i)?new Date(NaN):(e.setUTCFullYear(t,a,Math.max(i,o)),e)}}function vt(e){return e?parseInt(e):1}function yt(e){let t=e.match(pt);if(!t)return NaN;let n=bt(t[1]),r=bt(t[2]),i=bt(t[3]);return Ot(n,r,i)?n*s+r*o+i*1e3:NaN}function bt(e){return e&&parseFloat(e.replace(`,`,`.`))||0}function xt(e){if(e===`Z`)return 0;let t=e.match(mt);if(!t)return 0;let n=t[1]===`+`?-1:1,r=parseInt(t[2]),i=t[3]&&parseInt(t[3])||0;return kt(r,i)?n*(r*s+i*o):NaN}function St(e,t,n){let r=new Date(0);r.setUTCFullYear(e,0,4);let i=r.getUTCDay()||7,a=(t-1)*7+n+1-i;return r.setUTCDate(r.getUTCDate()+a),r}var Ct=[31,null,31,30,31,30,31,31,30,31,30,31];function wt(e){return e%400==0||e%4==0&&e%100!=0}function Tt(e,t,n){return t>=0&&t<=11&&n>=1&&n<=(Ct[t]||(wt(e)?29:28))}function Et(e,t){return t>=1&&t<=(wt(e)?366:365)}function Dt(e,t,n){return t>=1&&t<=53&&n>=0&&n<=6}function Ot(e,t,n){return e===24?t===0&&n===0:n>=0&&n<60&&t>=0&&t<60&&e>=0&&e<25}function kt(e,t){return t>=0&&t<=59}async function At(e,t,n){let r=new FormData;r.append(`file`,t);let i=await fetch(`${v()}/tickets/${e}/attachments`,{method:`POST`,body:r,signal:n});if(!i.ok){let e=await i.json().catch(()=>({}));throw Error(e.error??l.t(`attachments:errors.uploadFailed`,{status:i.status}))}return(await i.json()).attachment}async function jt(e,t){let n=await fetch(`${v()}/tickets/${e}/attachments/${t}`,{method:`DELETE`});if(!n.ok&&n.status!==404)throw Error(l.t(`attachments:errors.deleteFailed`,{status:n.status}))}async function Mt(e){let t=await fetch(`${v()}/tickets/${e}/attachments`,{method:`DELETE`});if(!t.ok&&t.status!==404)throw Error(l.t(`attachments:errors.bulkDeleteFailed`,{status:t.status}))}async function Nt(e){let t=await fetch(`${v()}/tickets/${e}/attachments`);if(!t.ok)throw Error(l.t(`attachments:errors.listFailed`,{status:t.status}));return(await t.json()).attachments}function Pt(e,t){return`${v()}/tickets/${e}/attachments/${t}`}async function Ft(e,t){let n=await fetch(Pt(e,t));if(!n.ok)throw Error(l.t(`attachments:errors.fetchFailed`,{status:n.status}));return n.blob()}var It=`image/jpeg,image/png,image/gif,image/webp,application/pdf,text/csv,text/plain,application/json,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel,application/sql,application/x-sql,text/sql,text/x-sql,.sql`,Lt=new Set(It.split(`,`).filter(e=>!e.startsWith(`.`))),Rt=/\.sql$/i,zt=/\.(png|jpe?g|gif|webp)$/i;function Bt(e){return Lt.has(e.type)||Rt.test(e.name)||zt.test(e.name)}var X=n();function Vt({ticketKey:e,attachment:t,onClose:n}){let{t:r}=g(`attachments`),[i,a]=(0,J.useState)(null),[o,s]=(0,J.useState)(null);if((0,J.useEffect)(()=>{if(!t)return;function e(e){e.key===`Escape`&&n()}document.addEventListener(`keydown`,e);let r=document.body.style.overflow;return document.body.style.overflow=`hidden`,()=>{document.removeEventListener(`keydown`,e),document.body.style.overflow=r}},[t,n]),(0,J.useEffect)(()=>{if(!t){a(null),s(null);return}let n=!1;return a(null),s(null),Ft(e,t.id).then(e=>{n||a(URL.createObjectURL(e))}).catch(e=>{n||s(e instanceof Error?e.message:r(`errors.loadFailed`))}),()=>{n=!0}},[t,e]),(0,J.useEffect)(()=>()=>{i&&URL.revokeObjectURL(i)},[i]),!t)return null;let c=t.mimeType.startsWith(`image/`),l=t.mimeType===`application/pdf`;return(0,X.jsxs)(`div`,{role:`dialog`,"aria-modal":`true`,"aria-label":r(`lightbox.preview`,{name:t.filename}),className:`fixed inset-0 z-[100] flex flex-col bg-black/85 backdrop-blur-sm animate-in fade-in-0 duration-200`,onClick:n,children:[(0,X.jsxs)(`div`,{className:`flex items-center justify-between px-4 py-3 border-b border-white/10 bg-black/40`,onClick:e=>e.stopPropagation(),children:[(0,X.jsxs)(`button`,{type:`button`,onClick:n,"aria-label":r(`lightbox.backToDesktop`),className:`inline-flex items-center gap-2 px-3 py-1.5 rounded-md text-sm text-white/85 hover:bg-white/10 hover:text-white transition-colors`,children:[(0,X.jsx)(S,{className:`w-4 h-4`}),r(`common:actions.back`)]}),(0,X.jsxs)(`div`,{className:`flex-1 text-center min-w-0 px-4`,children:[(0,X.jsx)(`div`,{className:`text-sm font-medium text-white/95 truncate`,children:t.filename}),(0,X.jsx)(`div`,{className:`text-[11px] text-white/50`,children:t.mimeType})]}),(0,X.jsxs)(`a`,{href:i??`#`,download:t.filename,onClick:e=>{e.stopPropagation(),i||e.preventDefault()},className:`inline-flex items-center gap-2 px-3 py-1.5 rounded-md text-sm text-white/85 hover:bg-white/10 hover:text-white transition-colors`,"aria-label":r(`lightbox.download`),children:[(0,X.jsx)(j,{className:`w-4 h-4`}),r(`lightbox.download`)]})]}),(0,X.jsx)(`div`,{className:V(`flex-1 flex items-center justify-center overflow-auto p-6`),onClick:n,children:o?(0,X.jsx)(`div`,{onClick:e=>e.stopPropagation(),className:`text-center text-white/80 px-8 py-10 rounded-lg bg-white/5 border border-white/10`,children:(0,X.jsx)(`p`,{className:`text-sm`,children:r(`lightbox.loadError`,{error:o})})}):i?c?(0,X.jsx)(`img`,{src:i,alt:t.filename,onClick:e=>e.stopPropagation(),className:`max-h-full max-w-full rounded-lg shadow-2xl animate-in zoom-in-95 duration-200`}):l?(0,X.jsx)(`iframe`,{src:i,title:t.filename,onClick:e=>e.stopPropagation(),className:`w-full h-full max-w-5xl bg-white rounded-lg shadow-2xl`}):(0,X.jsxs)(`div`,{onClick:e=>e.stopPropagation(),className:`text-center text-white/80 px-8 py-10 rounded-lg bg-white/5 border border-white/10`,children:[(0,X.jsx)(`p`,{className:`text-sm mb-3`,children:r(`lightbox.previewUnavailable`)}),(0,X.jsxs)(`a`,{href:i,download:t.filename,className:`inline-flex items-center gap-2 px-4 py-2 rounded-md bg-white/10 hover:bg-white/20 text-white transition-colors`,children:[(0,X.jsx)(j,{className:`w-4 h-4`}),r(`lightbox.downloadFile`,{name:t.filename})]})]}):(0,X.jsx)(`div`,{onClick:e=>e.stopPropagation(),className:`text-center text-white/70 px-8 py-10 rounded-lg bg-white/5 border border-white/10`,children:(0,X.jsx)(`p`,{className:`text-sm`,children:r(`lightbox.loading`)})})})]})}function Ht(e,t){let n=new Set,r=[];for(let i of[...e,...t])n.has(i.id)||(n.add(i.id),r.push(i));return r}function Ut(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function Wt(e){return e.startsWith(`image/`)?`🖼`:e===`application/pdf`?`📄`:e===`text/csv`||e.includes(`spreadsheetml`)||e===`application/vnd.ms-excel`?`📊`:e===`application/json`?`{ }`:e===`text/plain`||e.includes(`sql`)?`📝`:`📎`}function Gt(e){try{return new Date(e).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})}catch{return e}}function Kt({ticketKey:e,attachments:t,onChange:n,className:r}){let{t:i}=g(`attachments`),[a,o]=(0,J.useState)(new Set),[s,c]=(0,J.useState)(null),[l,u]=(0,J.useState)(null);if((0,J.useEffect)(()=>{let r=!1;return Nt(e).then(e=>{if(r)return;let i=Ht(t,e);i.length!==t.length&&n?.(i)}).catch(()=>{}),()=>{r=!0}},[e]),!t||t.length===0)return null;let d=[...t].sort((e,t)=>e.addedAt<t.addedAt?1:-1);async function f(r){c(null),o(e=>{let t=new Set(e);return t.add(r.id),t});try{await jt(e,r.id),await new Promise(e=>setTimeout(e,160)),n?.(t.filter(e=>e.id!==r.id))}catch(e){c(e instanceof Error?e.message:i(`errors.removeFailed`)),o(e=>{let t=new Set(e);return t.delete(r.id),t})}}return(0,X.jsxs)(`section`,{className:V(`mt-4`,r),"aria-label":i(`section.ariaLabel`),children:[(0,X.jsxs)(`header`,{className:`flex items-center justify-between mb-2`,children:[(0,X.jsx)(`h3`,{className:`text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:i(`section.title`)}),(0,X.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:i(`section.fileCount`,{count:d.length})})]}),(0,X.jsx)(`ul`,{className:`flex flex-col gap-1`,children:d.map(e=>{let t=a.has(e.id);return(0,X.jsxs)(`li`,{className:V(`flex items-center gap-3 px-2.5 py-2 rounded-md border border-border bg-card/60 hover:bg-card transition-all duration-200`,t&&`opacity-0 scale-95 max-h-0 py-0 border-transparent overflow-hidden`),children:[(0,X.jsx)(`span`,{"aria-hidden":!0,className:`w-6 text-center text-sm shrink-0`,children:Wt(e.mimeType)}),(0,X.jsxs)(`button`,{type:`button`,onClick:()=>u(e),className:`flex-1 min-w-0 flex flex-col text-sm text-left hover:text-primary transition-colors`,children:[(0,X.jsx)(`span`,{className:`font-medium truncate text-foreground`,children:e.filename}),(0,X.jsxs)(`span`,{className:`text-[11px] text-muted-foreground`,children:[Ut(e.size),` · `,Gt(e.addedAt)]})]}),(0,X.jsx)(`button`,{type:`button`,onClick:()=>u(e),className:`text-[11px] text-primary hover:underline shrink-0`,children:i(`common:actions.open`)}),(0,X.jsx)(`button`,{type:`button`,onClick:()=>f(e),"aria-label":i(`removeFile`,{name:e.filename}),disabled:t,className:`w-6 h-6 inline-flex items-center justify-center rounded text-muted-foreground hover:text-destructive hover:bg-destructive/10 transition-colors disabled:opacity-50`,children:`×`})]},e.id)})}),s&&(0,X.jsx)(`p`,{className:`mt-2 text-xs text-destructive`,children:s}),(0,X.jsx)(Vt,{ticketKey:e,attachment:l,onClose:()=>u(null)})]})}function qt({ticketId:e,onClose:t}){let{t:n}=g(`code`),r=a(),{activeProjectId:i}=y(),o=`${i}:${e}`,s=(0,J.useRef)(o);s.current=o;let c=(0,J.useRef)(0),l=(0,J.useRef)(null),[u,d]=(0,J.useState)(null),[f,p]=(0,J.useState)(!1),[m,h]=(0,J.useState)(!1),[_,b]=(0,J.useState)(null),x=(0,J.useCallback)(async(t=null)=>{l.current?.abort();let n=new AbortController;l.current=n;let r=++c.current,i=()=>!n.signal.aborted&&c.current===r&&s.current===o;p(!0),h(!1),b(t);try{let r=new URLSearchParams({ticketId:String(e),limit:`50`});t&&r.set(`cursor`,t);let a=await fetch(`${v()}/code/activity?${r}`,{signal:n.signal});if(!a.ok)throw Error(`activity unavailable`);let s=await a.json();if(!Array.isArray(s.entries))throw Error(`invalid activity response`);if(!i())return;d(e=>{let n=t&&e?.scope===o?[...e.rows]:[],r=new Set(n.map(e=>`${e.repositoryId}\0${e.path}`));for(let e of s.entries){let t=`${e.repositoryId}\0${e.path}`;r.has(t)||(r.add(t),n.push(e))}return{scope:o,rows:n,nextCursor:s.nextCursor,truncated:!!s.truncated||!!t&&!!e?.truncated}})}catch{i()&&h(!0)}finally{i()&&p(!1)}},[o,e]);if((0,J.useEffect)(()=>{if(Ce)return d(null),x(),()=>{l.current?.abort(),c.current++}},[x]),!Ce)return null;let S=u?.scope===o?u:null;return!f&&!m&&S&&!S.rows.length&&!S.truncated&&!S.nextCursor?null:(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-1.5`,children:n(`ticketFiles.title`)}),f&&!S&&(0,X.jsx)(`p`,{className:`text-xs text-muted-foreground`,role:`status`,children:n(`ticketFiles.loading`)}),m&&(0,X.jsxs)(`div`,{className:`text-xs`,role:`alert`,children:[(0,X.jsx)(`span`,{children:n(`ticketFiles.loadFailed`)}),` `,(0,X.jsx)(`button`,{type:`button`,onClick:()=>{x(_)},className:`underline`,children:n(`ticketFiles.retry`)})]}),S?.truncated&&(0,X.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[n(`ticketFiles.partial`),` `,(0,X.jsx)(`button`,{type:`button`,disabled:f,onClick:()=>{x()},className:`underline`,children:n(`ticketFiles.retry`)})]}),(0,X.jsx)(`ul`,{className:`space-y-1`,children:S?.rows.map(e=>(0,X.jsx)(`li`,{children:(0,X.jsxs)(`button`,{type:`button`,onClick:()=>{let n=new URLSearchParams({repositoryId:e.repositoryId,path:e.path});e.jobId&&n.set(`changeJobId`,e.jobId),t(),r(`/code?${n}`)},className:`w-full text-left flex items-center gap-2 rounded px-2 py-1 text-xs hover:bg-muted/40`,children:[(0,X.jsx)(e.kind===`created`?Ve:e.kind===`deleted`?Be:M,{className:`h-3.5 w-3.5 text-muted-foreground shrink-0`}),(0,X.jsx)(`span`,{className:`text-[10px] text-muted-foreground truncate max-w-24`,title:e.repositoryName,children:e.repositoryName}),(0,X.jsx)(`span`,{className:`font-mono truncate flex-1`,children:e.path}),e.jobId&&(0,X.jsxs)(`span`,{className:`inline-flex items-center gap-1 text-[10px] text-muted-foreground font-mono shrink-0`,title:n(`ticketFiles.jobTitle`,{jobId:e.jobId}),children:[(0,X.jsx)(K,{className:`h-3 w-3`}),e.jobId.length>10?e.jobId.slice(0,10):e.jobId]}),(0,X.jsx)(`span`,{className:`text-[10px] text-muted-foreground uppercase tracking-wider shrink-0`,children:n(`kind.${e.kind}`)})]})},`${e.repositoryId}:${e.path}`))}),S?.nextCursor&&(0,X.jsx)(`button`,{type:`button`,disabled:f,onClick:()=>{x(S.nextCursor)},className:`text-xs underline mt-2`,children:n(f?`ticketFiles.loading`:`ticketFiles.loadMore`)})]})}function Jt(e){return e<.005?`$${e.toFixed(4)}`:e<1?`$${e.toFixed(3)}`:`$${e.toFixed(2)}`}function Yt(e){return e<1e3?`${e} ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m ${Math.floor(e%6e4/1e3)}s`}function Xt({ticketId:e}){let{t}=g(`tickets`),[n,r]=(0,J.useState)(null),i=a(),{activeProjectId:o}=y(),{closeTicketDetail:s}=Di();if((0,J.useEffect)(()=>{let t=new AbortController;return r(null),fetch(`${v()}/tickets/${e}/spending-summary`,{signal:t.signal}).then(e=>e.ok?e.json():null).then(e=>{e&&r(e)}).catch(()=>{}),()=>t.abort()},[e,o]),!n||!n.bySurface||!n.totalRuns||n.totalRuns===0)return null;let c=Object.entries(n.bySurface).filter(([,e])=>e.count>0).map(([e,n])=>t(`spendingLine.breakdownItem`,{n:n.count,label:w[e].toLowerCase()})).join(` + `),l=n.unpricedRuns??0,u=n.pricedRuns??Math.max(0,n.totalRuns-l),d=l>0&&u===0,f=l>0&&u>0,p=n.turnsUnavailableRuns??0,m=n.totalTurns==null||p>0&&(n.turnsReportedRuns??0)===0,h=!m&&p>0;return(0,X.jsxs)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),s(),i(`/analytics?ticketId=${e}`)},className:`mt-1.5 group inline-flex items-center gap-1.5 text-[11px] text-muted-foreground hover:text-foreground transition-colors cursor-pointer`,"aria-label":t(`spendingLine.ariaLabel`),children:[(0,X.jsx)(`span`,{className:`tabular-nums font-medium text-foreground`,"data-testid":d?`ticket-cost-unavailable`:void 0,title:d?t(`spendingLine.costUnavailableTooltip`):f?t(`spendingLine.costPartiallyUnavailableTooltip`):(n.estimatedCostUsd??0)>0?t(`spendingLine.estimatedTooltip`):void 0,children:d?`—`:`${(n.estimatedCostUsd??0)>0?`~`:``}${f?`≥`:``}${Jt(n.totalCostUsd)}`}),(0,X.jsx)(`span`,{className:`text-muted-foreground/60`,children:`·`}),(0,X.jsx)(`span`,{className:`tabular-nums`,"data-testid":m?`ticket-turns-unavailable`:void 0,title:m?t(`spendingLine.turnsUnavailableTooltip`):h?t(`spendingLine.turnsPartiallyUnavailableTooltip`):void 0,children:m?`—`:`${h?`≥`:``}${t(`spendingLine.turns`,{count:n.totalTurns})}`}),(0,X.jsx)(`span`,{className:`text-muted-foreground/60`,children:`·`}),(0,X.jsx)(`span`,{className:`tabular-nums`,children:t(`spendingLine.active`,{duration:Yt(n.activeDurationMs)})}),c&&(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`span`,{className:`text-muted-foreground/60`,children:`·`}),(0,X.jsx)(`span`,{children:c})]}),(0,X.jsx)(Pe,{className:`w-3 h-3 opacity-0 group-hover:opacity-100 transition-opacity`})]})}var Zt={draft:{dotClass:`bg-accent-secondary/60`,textClass:`text-accent-secondary`,borderClass:`border-l-[3px] border-dashed border-accent-secondary/50 pl-3`,labelKey:`common:status.draft`,pulsing:!1},todo:{dotClass:`bg-slate-500/70`,textClass:`text-muted-foreground`,borderClass:`border-l-[3px] border-dashed border-slate-500/40 pl-3`,labelKey:`status.todo`,pulsing:!1},in_progress:{dotClass:`bg-blue-400 aurora-light:bg-accent-info`,textClass:`text-foreground font-semibold`,borderClass:`border-l-[3px] border-solid border-blue-500 pl-3`,labelKey:`status.inProgress`,pulsing:!0},on_review:{dotClass:`bg-accent-warning/80`,textClass:`text-accent-warning`,borderClass:`border-l-[3px] border-solid border-accent-warning/60 pl-3`,labelKey:`status.onReview`,pulsing:!1},done:{dotClass:`text-emerald-400 aurora-light:text-accent-success`,textClass:`text-emerald-400/80 aurora-light:text-accent-success`,borderClass:`border-l-[3px] border-solid border-emerald-500 pl-3`,labelKey:`status.done`,pulsing:!1},cancelled:{dotClass:`text-red-400/60 aurora-light:text-destructive/70`,textClass:`text-muted-foreground/50`,borderClass:`pl-3`,labelKey:`status.cancelled`,pulsing:!1}};function Qt({status:e,className:t}){let{t:n}=g(`specs`),r=Zt[e];return e===`done`?(0,X.jsx)(k,{className:V(`w-3.5 h-3.5 shrink-0`,r.dotClass,t),"aria-label":n(`status.done`)}):e===`cancelled`?(0,X.jsx)(ie,{className:V(`w-3.5 h-3.5 shrink-0`,r.dotClass,t),"aria-label":n(`status.cancelled`)}):r.pulsing?(0,X.jsxs)(`span`,{className:V(`relative flex shrink-0 h-2.5 w-2.5`,t),"aria-label":n(`status.inProgress`),children:[(0,X.jsx)(`span`,{className:V(`animate-ping absolute inline-flex h-full w-full rounded-full opacity-60`,r.dotClass)}),(0,X.jsx)(`span`,{className:V(`relative inline-flex rounded-full h-2.5 w-2.5`,r.dotClass)})]}):(0,X.jsx)(`span`,{className:V(`inline-flex rounded-full h-2.5 w-2.5 shrink-0`,r.dotClass,t),"aria-label":n(r.labelKey)})}function $t({status:e,className:t}){let{t:n}=g(`specs`),r=Zt[e];return(0,X.jsxs)(`span`,{className:V(`inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full text-[11px] font-medium border`,e===`todo`&&`bg-slate-500/10 border-slate-500/30 text-slate-400 aurora-light:bg-muted aurora-light:border-border aurora-light:text-muted-foreground`,e===`in_progress`&&`bg-blue-500/10 border-blue-500/30 text-blue-400 aurora-light:bg-accent-info/10 aurora-light:border-accent-info/30 aurora-light:text-accent-info`,e===`on_review`&&`bg-accent-warning/10 border-accent-warning/30 text-accent-warning`,e===`done`&&`bg-emerald-500/10 border-emerald-500/30 text-emerald-400 aurora-light:bg-accent-success/10 aurora-light:border-accent-success/30 aurora-light:text-accent-success`,e===`cancelled`&&`bg-red-500/10 border-red-500/30 text-red-400/60 aurora-light:bg-destructive/10 aurora-light:border-destructive/30 aurora-light:text-destructive/70`,t),children:[(0,X.jsx)(Qt,{status:e}),n(r.labelKey)]})}function en(){let{activeProjectId:e}=y(),[t,n]=(0,J.useState)({connected:!1,key:null,discardStatus:null}),[r,i]=(0,J.useState)(!0);return(0,J.useEffect)(()=>{if(!we||!e){n({connected:!1,key:null,discardStatus:null}),i(!1);return}let t=!1;return i(!0),he.getConnection().then(e=>{if(t)return;let r=!!(e.connected&&e.connection?.enabled);n({connected:r,key:e.connection?.jiraProjectKey??null,discardStatus:r?e.connection?.discardStatus??null:null})}).catch(()=>{t||n({connected:!1,key:null,discardStatus:null})}).finally(()=>{t||i(!1)}),()=>{t=!0}},[e]),{connected:t.connected,jiraProjectKey:t.key,discardStatus:t.discardStatus,loading:r}}function tn({open:e,onOpenChange:t,ticket:n,discardStatus:r,onDiscarded:i}){let{t:a}=g(`jira`),[o,s]=(0,J.useState)(``),[c,l]=(0,J.useState)(!1);async function u(){l(!0);try{await he.discardSpec(n.id,o.trim()||null),b.success(a(`discard.movedToast`,{status:r,key:n.jira_key??`#${n.id}`})),t(!1),s(``),i?.()}catch(e){b.error(e instanceof Error?e.message:a(`errors.generic`))}finally{l(!1)}}return(0,X.jsx)(fe,{open:e,onOpenChange:e=>{c||t(e)},children:(0,X.jsxs)(de,{movableResizable:!0,className:`max-w-md`,"data-testid":`jira-discard-dialog`,children:[(0,X.jsxs)(ue,{children:[(0,X.jsx)(le,{children:a(`discard.title`,{status:r})}),(0,X.jsx)(se,{children:a(`discard.body`,{status:r,key:n.jira_key??`#${n.id}`})})]}),(0,X.jsxs)(`label`,{className:`block space-y-1`,children:[(0,X.jsx)(`span`,{className:`text-xs font-medium text-foreground`,children:a(`discard.commentLabel`)}),(0,X.jsx)(`textarea`,{value:o,onChange:e=>s(e.target.value),placeholder:a(`discard.commentPlaceholder`),rows:3,className:`w-full rounded-md border border-border bg-input px-3 py-2 text-xs text-foreground placeholder:text-muted-foreground resize-none`,"data-testid":`jira-discard-comment`})]}),(0,X.jsxs)(B,{children:[(0,X.jsx)(U,{variant:`outline`,size:`sm`,onClick:()=>t(!1),disabled:c,children:a(`wizard.cancel`)}),(0,X.jsxs)(U,{size:`sm`,onClick:u,disabled:c,"data-testid":`jira-discard-confirm`,children:[(0,X.jsx)(Pe,{className:`w-3.5 h-3.5 mr-1.5`}),c?a(`discard.moving`):a(`discard.confirm`,{status:r})]})]})]})})}var nn=/^\d{4}-\d{2}-\d{2}T/;function rn(e){if(nn.test(e))try{return{text:H(ut(e),{addSuffix:!0,locale:d()}),title:e}}catch{}return{text:e}}function an({localId:e}){let{t}=g(`jira`),{activeProjectId:n}=y(),r=en(),[i,a]=(0,J.useState)(null);if((0,J.useEffect)(()=>{if(!we||!r.connected)return;let t=!1;return a(null),he.getSpecDetails(e).then(e=>{t||a(e)}).catch(()=>{t||a(null)}),()=>{t=!0}},[e,n,r.connected]),!we||!r.connected||!i)return null;let o=i.development,s=i.fields.length>0,c=o.pullRequests.length>0,l=o.branches.length>0,u=(o.commits?.length??0)>0;return!s&&!c&&!l&&!u?null:(0,X.jsxs)(`div`,{className:`space-y-4`,"data-testid":`jira-details-panel`,children:[s&&(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-1.5`,children:t(`detail.detailsTitle`)}),(0,X.jsx)(`div`,{className:`space-y-1.5`,children:i.fields.map((e,t)=>{let n=rn(e.value);return(0,X.jsxs)(`div`,{className:`text-xs`,children:[(0,X.jsx)(`span`,{className:`text-[10px] text-muted-foreground uppercase tracking-wide block`,children:e.label}),e.href?(0,X.jsxs)(`button`,{type:`button`,onClick:()=>{ve(e.href)},className:`inline-flex items-center gap-1 text-accent-info hover:underline text-left`,children:[(0,X.jsx)(`span`,{className:`truncate`,children:e.value}),(0,X.jsx)(E,{className:`w-3 h-3 shrink-0`})]}):(0,X.jsx)(`span`,{className:`text-foreground/80 whitespace-pre-line`,title:n.title,children:n.text})]},`${e.label}-${t}`)})})]}),(c||l||u)&&(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-1.5`,children:t(`detail.developmentTitle`)}),c&&(0,X.jsxs)(`div`,{className:`mb-2`,children:[(0,X.jsx)(`span`,{className:`text-[10px] text-muted-foreground uppercase tracking-wide block mb-1`,children:t(`detail.dev.pullRequests`)}),(0,X.jsx)(`div`,{className:`space-y-1`,children:o.pullRequests.map(e=>(0,X.jsxs)(`button`,{type:`button`,onClick:()=>{ve(e.url)},className:`w-full flex items-start gap-1.5 text-left text-xs hover:bg-accent-info/10 rounded px-1 py-0.5`,"data-testid":`jira-dev-pr`,children:[(0,X.jsx)(He,{className:`w-3 h-3 mt-0.5 shrink-0 text-accent-info`}),(0,X.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,X.jsx)(`span`,{className:`truncate text-foreground/80 block`,children:e.title}),(0,X.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[e.status,e.sourceBranch?` · ${e.sourceBranch} → ${e.destBranch??``}`:``]})]})]},e.url))})]}),l&&(0,X.jsxs)(`div`,{className:`mb-2`,children:[(0,X.jsx)(`span`,{className:`text-[10px] text-muted-foreground uppercase tracking-wide block mb-1`,children:t(`detail.dev.branches`)}),(0,X.jsx)(`div`,{className:`space-y-1`,children:o.branches.map(e=>(0,X.jsxs)(`button`,{type:`button`,onClick:()=>{ve(e.url)},className:`w-full flex items-center gap-1.5 text-left text-xs hover:bg-accent-info/10 rounded px-1 py-0.5`,"data-testid":`jira-dev-branch`,children:[(0,X.jsx)(N,{className:`w-3 h-3 shrink-0 text-accent-info`}),(0,X.jsx)(`span`,{className:`truncate font-mono text-foreground/80`,children:e.name}),e.repo&&(0,X.jsx)(`span`,{className:`text-[10px] text-muted-foreground truncate`,children:e.repo})]},e.url))})]}),u&&(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`span`,{className:`text-[10px] text-muted-foreground uppercase tracking-wide block mb-1`,children:t(`detail.dev.commits`)}),(0,X.jsx)(`div`,{className:`space-y-1`,children:o.commits.map(e=>(0,X.jsxs)(`button`,{type:`button`,onClick:()=>{ve(e.url)},className:`w-full flex items-center gap-1.5 text-left text-xs hover:bg-accent-info/10 rounded px-1 py-0.5`,"data-testid":`jira-dev-commit`,children:[(0,X.jsx)(K,{className:`w-3 h-3 shrink-0 text-accent-info`}),(0,X.jsx)(`span`,{className:`font-mono text-[10px] text-muted-foreground shrink-0`,children:e.displayId}),(0,X.jsx)(`span`,{className:`truncate text-foreground/80`,children:e.message})]},e.url))})]})]})]})}var on=/\n*##\s*Acceptance Criteria\s*\n([\s\S]*?)(?=\n##\s|\n*$)/i;function sn(e){if(!e)return{body:``,criteria:[]};let t=on.exec(e);if(!t)return{body:e.replace(/\s+$/,``),criteria:[]};let n=t[1],r=e.slice(0,t.index),i=e.slice(t.index+t[0].length),a=`${r.replace(/\s+$/,``)}${i?`\n\n${i.replace(/^\s+/,``)}`:``}`,o=n.split(/\r?\n/).map(e=>e.replace(/^\s*[-*+]\s+/,``).trim()).filter(e=>e.length>0);return{body:a.replace(/\s+$/,``),criteria:o}}var cn=new Set([`draft`,`todo`]);function ln(e){return!!(cn.has(e.status)||e.source===`jira`&&e.jira_key&&e.status!==`cancelled`)}function un(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function dn(){let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_BROWSER_CAPTURE;return typeof e!=`string`||e!==`false`}var fn={desktop:{width:1280,height:800},tablet:{width:768,height:1024},mobile:{width:375,height:667}},pn=class extends Error{},mn=class extends Error{};function hn(e){if(!e)throw Error(`A project owner is required for browser sessions`);return`${u}/api/projects/${encodeURIComponent(e)}`}async function gn(e,t){let n=await fetch(`${hn(e)}/browser/sessions`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({initialUrl:t})});if(n.status===409)throw new pn(`Too many open browser sessions`);if(n.status===502)throw new mn(`The browser failed to launch`);if(!n.ok)throw Error(`Failed to open browser (${n.status})`);return(await n.json()).session}async function _n(e,t,n,r){let i=await fetch(`${hn(e)}/browser/sessions/${t}/navigate`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:n,url:r})});if(!i.ok)throw Error(`Navigation failed (${i.status})`);return await i.json()}async function vn(e,t,n,r,i){let a=await fetch(`${hn(e)}/browser/sessions/${t}/capture`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({rect:n,pendingSpecId:r,captureNetwork:i?.captureNetwork??!0})});if(!a.ok)throw Error(await yn(a));return await a.json()}async function yn(e){let t=await e.json().then(e=>e.error).catch(()=>void 0);return t?`Capture failed (${e.status}): ${t}`:`Capture failed (${e.status})`}async function bn(e,t,n,r,i,a=fn){let o=await fetch(`${hn(e)}/browser/sessions/${t}/capture-breakpoints`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({rect:n,anchorPoint:r,pendingSpecId:i,breakpoints:a})});if(!o.ok)throw Error(await yn(o));return await o.json()}async function xn(e,t,n){let r=new FormData;r.append(`file`,t,n);let i=await fetch(`${v()}/tickets/${e}/attachments`,{method:`POST`,body:r});if(!i.ok)throw Error(`Upload failed (${i.status})`);return(await i.json()).attachment}async function Sn(e,t,n,r){let i=await fetch(`${hn(e)}/browser/sessions/${t}/clipboard`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:n,text:r})});if(!i.ok)throw Error(`Clipboard failed (${i.status})`);return await i.json()}async function Cn(e,t,n,r){let i=await fetch(`${hn(e)}/browser/sessions/${t}/element`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({selector:n,direction:r})});if(!i.ok)throw Error(`Element navigate failed (${i.status})`);return(await i.json()).probe}async function wn(e,t,n){let r=await fetch(`${hn(e)}/browser/sessions/${t}/popup-view`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({target:n})});if(!r.ok)throw Error(`Could not switch browser view (${r.status})`)}function Tn(e){if(!e||e===`about:blank`)return`…`;try{return new URL(e).hostname||`…`}catch{return`…`}}async function En(e,t){try{await fetch(`${hn(e)}/browser/sessions/${t}`,{method:`DELETE`})}catch{}}function Dn(e,t){return`${be||(typeof window<`u`?`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.host}`:`ws://localhost:4200`)}/ws/browser/${e}?projectId=${encodeURIComponent(t)}`}function On(e,t){let n=Dn(e,t),r=c(),i=r?new WebSocket(n,[`specrails-desktop`,r]):new WebSocket(n);return i.binaryType=`arraybuffer`,i}function kn(e,t=e=>requestAnimationFrame(e),n=e=>cancelAnimationFrame(e)){let r=null,i=null,a=null,o=!1,s=()=>{a!=null&&(n(a),a=null);let t=r,o=i;r=null,i=null,t&&(!o||t.x!==o.x||t.y!==o.y)&&e({type:`mouse`,action:`move`,x:t.x,y:t.y}),o&&e({type:`wheel`,x:o.x,y:o.y,deltaX:o.deltaX,deltaY:o.deltaY})},c=()=>{a==null&&!o&&(a=t(()=>{a=null,s()}))};return{move(e,t){o||(r={x:e,y:t},c())},wheel(e,t,n,r){o||(i?(i.x=e,i.y=t,i.deltaX+=n,i.deltaY+=r):i={x:e,y:t,deltaX:n,deltaY:r},c())},flush(){o||s()},dispose(){o||(o=!0,a!=null&&(n(a),a=null),r=null,i=null)}}}function An(e,t,n){let r=t.width>0?(e.x-t.left)/t.width:0,i=t.height>0?(e.y-t.top)/t.height:0,a=Math.min(Math.max(r,0),1)*n.width,o=Math.min(Math.max(i,0),1)*n.height;return{x:Math.round(a),y:Math.round(o)}}function jn(e,t,n){let r=n.width>0?t.width/n.width:0,i=n.height>0?t.height/n.height:0;return{left:t.left+e.x*r,top:t.top+e.y*i,width:e.width*r,height:e.height*i}}function Mn(e,t){return{x:Math.min(e.x,t.x),y:Math.min(e.y,t.y),width:Math.abs(e.x-t.x),height:Math.abs(e.y-t.y)}}function Nn(e,t=8){return e.width>=t&&e.height>=t}function Pn(e,t){let n=Math.max(1,t.width),r=Math.max(1,t.height),i=Math.max(0,Math.min(e.x,n-1)),a=Math.max(0,Math.min(e.y,r-1)),o=Math.min(n,Math.max(i+1,e.x+e.width)),s=Math.min(r,Math.max(a+1,e.y+e.height));return{x:Math.round(i),y:Math.round(a),width:Math.round(o-i),height:Math.round(s-a)}}function Fn(e){return{nodeCount:e.nodes.length,htmlBytes:e.html.length,truncated:e.htmlTruncated,networkCount:e.networkRequests?.length??0}}function In(e,t){let n=e.indexOf(`,`);if(!e.startsWith(`data:`)||n===-1)throw Error(`dataUrlToFile: not a data URL`);let r=e.slice(0,n),i=/^data:([^;,]+)/.exec(r)?.[1]||`application/octet-stream`,a=e.slice(n+1);if(/;base64$/i.test(r)){let e=atob(a),n=new Uint8Array(e.length);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t);return new File([n],t,{type:i})}return new File([decodeURIComponent(a)],t,{type:i})}var Ln={objects:[],past:[],future:[]};function Rn(e,t){switch(t.type){case`add`:return{objects:[...e.objects,t.obj],past:[...e.past,e.objects],future:[]};case`delete`:return e.objects.some(e=>e.id===t.id)?{objects:e.objects.filter(e=>e.id!==t.id),past:[...e.past,e.objects],future:[]}:e;case`undo`:return e.past.length===0?e:{objects:e.past[e.past.length-1],past:e.past.slice(0,-1),future:[e.objects,...e.future]};case`redo`:return e.future.length===0?e:{objects:e.future[0],past:[...e.past,e.objects],future:e.future.slice(1)};case`clear`:return e.objects.length===0?e:{objects:[],past:[...e.past,e.objects],future:[]};default:return e}}function zn(e){let t=e.filter(e=>e.kind===`step`).map(e=>e.n);return t.length===0?1:Math.max(...t)+1}function Bn(e,t){return{x:Math.min(e.x,t.x),y:Math.min(e.y,t.y),w:Math.abs(e.x-t.x),h:Math.abs(e.y-t.y)}}function Vn(e,t,n=.04){let r=Math.atan2(t.y-e.y,t.x-e.x),i=r-Math.PI/7,a=r+Math.PI/7;return{left:{x:t.x-n*Math.cos(i),y:t.y-n*Math.sin(i)},right:{x:t.x-n*Math.cos(a),y:t.y-n*Math.sin(a)}}}function Hn(e,t,n=.01){return Math.abs(e.x-t.x)>=n||Math.abs(e.y-t.y)>=n}function Un(e,t=.05){let n=e=>Math.min(1+t,Math.max(-t,e));return{x:n(e.x),y:n(e.y)}}function Wn(e,t,n){return{schemaVersion:1,objects:e,baseWidth:t,baseHeight:n}}function Gn({result:e,pendingSpecId:t,onConfirm:n,...r}){let i=(0,J.useCallback)(async r=>{if(!r.annotations){await n(e);return}let i=`screen-annotated-${Date.now()}.png`,a=await xn(t,In(r.screenshotDataUrl,i),i);await n({...e,rawScreenshot:e.screenshot,screenshot:a,screenshotDataUrl:r.screenshotDataUrl,annotations:r.annotations,...e.breakpoints?{breakpoints:Object.fromEntries(Object.entries(e.breakpoints).map(([t,n])=>[t,n.attachment.id===e.screenshot.id?{...n,attachment:a,dataUrl:r.screenshotDataUrl}:n]))}:{}})},[n,t,e]);return(0,X.jsx)(Zn,{...r,responsive:Object.keys(e.breakpoints??{}).length>1,screenshotDataUrl:e.screenshotDataUrl,onConfirm:i})}var Kn=[`#ef4444`,`#f59e0b`,`#3b82f6`,`#22c55e`,`#ffffff`],qn=`#111827`,Jn=[{tool:`arrow`,icon:T,labelKey:`editor.tools.arrow`,key:`a`},{tool:`box`,icon:F,labelKey:`editor.tools.box`,key:`r`},{tool:`text`,icon:Ze,labelKey:`editor.tools.text`,key:`t`},{tool:`blur`,icon:ze,labelKey:`editor.tools.blur`,key:`b`},{tool:`step`,icon:We,labelKey:`editor.tools.step`,key:`n`}],Yn=0,Xn=()=>`a${++Yn}-${Date.now().toString(36)}`;function Zn({screenshotDataUrl:e,responsive:t,macOverlay:n,confirmLabel:r,onConfirm:i,onReselect:a,onCancel:o}){let{t:s}=g(`browser`),[c,l]=(0,J.useReducer)(Rn,Ln),[u,d]=(0,J.useState)(`arrow`),[f,p]=(0,J.useState)(Kn[0]),[m,h]=(0,J.useState)(null),[_,v]=(0,J.useState)({w:1,h:1}),[y,b]=(0,J.useState)(!1),[x,C]=(0,J.useState)(!1),w=(0,J.useRef)(!1),T=(0,J.useRef)(null),E=(0,J.useRef)(null),D=c.objects,O=(0,J.useCallback)(()=>{let e=T.current;if(!e)return;let t=E.current?.getBoundingClientRect();if(!t||t.width<=0||t.height<=0||e.naturalWidth<=0||e.naturalHeight<=0)return;let n=Math.min(1,t.width/e.naturalWidth,t.height/e.naturalHeight),r=e.naturalWidth*n,i=e.naturalHeight*n;v(e=>e.w===r&&e.h===i?e:{w:r,h:i})},[]);(0,J.useEffect)(()=>{O();let e=typeof ResizeObserver>`u`?null:new ResizeObserver(O);return E.current&&e?.observe(E.current),window.addEventListener(`resize`,O),()=>{e?.disconnect(),window.removeEventListener(`resize`,O)}},[O]);let A=(0,J.useCallback)((e,t)=>{let n=T.current;if(!n)return{x:0,y:0};let r=n.getBoundingClientRect();return Un({x:r.width>0?(e-r.left)/r.width:0,y:r.height>0?(t-r.top)/r.height:0})},[]),j=(0,J.useCallback)(e=>{if(y)return;e.target.setPointerCapture?.(e.pointerId);let t=A(e.clientX,e.clientY);if(u===`text`){let e=window.prompt(s(`editor.notePrompt`))?.trim();e&&l({type:`add`,obj:{id:Xn(),kind:`text`,x:t.x,y:t.y,text:e,color:f}});return}if(u===`step`){l({type:`add`,obj:{id:Xn(),kind:`step`,x:t.x,y:t.y,n:zn(D),color:f}});return}h({start:t,cur:t})},[y,u,f,D,A,s]),M=(0,J.useCallback)(e=>{m&&h(t=>t&&{...t,cur:A(e.clientX,e.clientY)})},[m,A]),N=(0,J.useCallback)(()=>{if(!m)return;let{start:e,cur:t}=m;if(h(null),Hn(e,t)){if(u===`arrow`)l({type:`add`,obj:{id:Xn(),kind:`arrow`,from:e,to:t,color:f}});else if(u===`box`){let n=Bn(e,t);l({type:`add`,obj:{id:Xn(),kind:`box`,...n,color:f}})}else if(u===`blur`){let n=Bn(e,t);l({type:`add`,obj:{id:Xn(),kind:`blur`,...n}})}}},[m,u,f]),P=(0,J.useCallback)(()=>{let e=T.current;if(!e||!e.naturalWidth||!e.naturalHeight)throw Error(`Capture image is not loaded`);let t=e.naturalWidth,n=e.naturalHeight,r=document.createElement(`canvas`);r.width=t,r.height=n;let i=r.getContext(`2d`);if(!i)throw Error(`Image rendering is unavailable`);i.drawImage(e,0,0,t,n);for(let e of D)e.kind===`blur`&&(i.fillStyle=qn,i.fillRect(e.x*t,e.y*n,e.w*t,e.h*n));let a=Math.max(2,t*.004);for(let e of D)if(e.kind===`box`)i.strokeStyle=e.color,i.lineWidth=a,i.strokeRect(e.x*t,e.y*n,e.w*t,e.h*n);else if(e.kind===`arrow`){let r={x:e.from.x*t,y:e.from.y*n},o={x:e.to.x*t,y:e.to.y*n},s=Vn(e.from,e.to,.035);i.strokeStyle=e.color,i.lineWidth=a,i.lineCap=`round`,i.beginPath(),i.moveTo(r.x,r.y),i.lineTo(o.x,o.y),i.moveTo(s.left.x*t,s.left.y*n),i.lineTo(o.x,o.y),i.lineTo(s.right.x*t,s.right.y*n),i.stroke()}else if(e.kind===`text`){let r=Math.max(12,n*.03);i.font=`600 ${r}px sans-serif`,i.textBaseline=`top`,i.lineWidth=Math.max(2,r*.18),i.strokeStyle=`rgba(0,0,0,0.55)`,i.strokeText(e.text,e.x*t,e.y*n),i.fillStyle=e.color,i.fillText(e.text,e.x*t,e.y*n)}else if(e.kind===`step`){let r=Math.max(10,n*.025);i.beginPath(),i.arc(e.x*t,e.y*n,r,0,Math.PI*2),i.fillStyle=e.color,i.fill(),i.fillStyle=`#000`,i.font=`700 ${r*1.1}px sans-serif`,i.textAlign=`center`,i.textBaseline=`middle`,i.fillText(String(e.n),e.x*t,e.y*n),i.textAlign=`start`}let o=r.toDataURL(`image/png`);if(!o.startsWith(`data:image/png;base64,`))throw Error(`Image encoding failed`);return{screenshotDataUrl:o,annotations:Wn(D,t,n)}},[D]),te=(0,J.useCallback)(async()=>{if(!w.current){w.current=!0,b(!0),C(!1);try{await i(D.length===0?{screenshotDataUrl:e}:P())}catch{C(!0)}finally{w.current=!1,b(!1)}}},[D,P,e,i]),F=(0,J.useCallback)(()=>{D.length>0&&!window.confirm(s(`editor.discardConfirm`))||o()},[D.length,o,s]);(0,J.useEffect)(()=>{let e=e=>{if(y)return;let t=e.metaKey||e.ctrlKey;if(t&&e.key.toLowerCase()===`z`){e.preventDefault(),l({type:e.shiftKey?`redo`:`undo`});return}if(t&&e.key===`Enter`){e.preventDefault(),te();return}if(t)return;let n=Jn.find(t=>t.key===e.key.toLowerCase());if(n){d(n.tool);return}e.key===`Escape`&&(e.preventDefault(),F())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[y,te,F]);let I=(e,t)=>e*(t===`w`?_.w:_.h),L=m?Bn(m.start,m.cur):null;return(0,X.jsxs)(`div`,{className:`flex-1 min-h-0 min-w-0 flex flex-col items-center overflow-hidden p-3 gap-2`,children:[(0,X.jsxs)(`div`,{className:`flex shrink-0 max-w-full items-center gap-1 overflow-x-auto rounded-lg border border-border/60 bg-surface/90 px-1.5 py-1 shadow-xl ${n?`ml-[80px]`:``}`,children:[Jn.map(({tool:e,icon:t,labelKey:n})=>(0,X.jsx)(`button`,{type:`button`,title:s(n),"aria-label":s(n),"aria-pressed":u===e,onClick:()=>d(e),className:`h-7 w-7 inline-flex items-center justify-center rounded transition-colors ${u===e?`bg-primary/15 text-primary`:`text-muted-foreground hover:text-foreground hover:bg-card/60`}`,children:(0,X.jsx)(t,{className:`w-3.5 h-3.5`})},e)),(0,X.jsx)(`span`,{className:`w-px h-5 bg-border/60 mx-0.5`}),Kn.map(e=>(0,X.jsx)(`button`,{type:`button`,"aria-label":s(`editor.colorLabel`,{color:e}),onClick:()=>p(e),className:`h-5 w-5 rounded-full border transition-transform ${f===e?`scale-110 border-foreground`:`border-border/60`}`,style:{background:e}},e)),(0,X.jsx)(`span`,{className:`w-px h-5 bg-border/60 mx-0.5`}),(0,X.jsx)(`button`,{type:`button`,"aria-label":s(`editor.undo`),title:s(`editor.undoTitle`),disabled:c.past.length===0,onClick:()=>l({type:`undo`}),className:`h-7 w-7 inline-flex items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-card/60 disabled:opacity-40`,children:(0,X.jsx)(Qe,{className:`w-3.5 h-3.5`})}),(0,X.jsx)(`button`,{type:`button`,"aria-label":s(`editor.redo`),title:s(`editor.redoTitle`),disabled:c.future.length===0,onClick:()=>l({type:`redo`}),className:`h-7 w-7 inline-flex items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-card/60 disabled:opacity-40`,children:(0,X.jsx)(qe,{className:`w-3.5 h-3.5`})})]}),t&&(0,X.jsx)(`p`,{className:`shrink-0 max-w-prose text-center text-xs text-muted-foreground`,children:s(`editor.responsiveHint`)}),(0,X.jsx)(`div`,{ref:E,className:`relative flex-1 min-h-0 w-full flex items-center justify-center`,children:(0,X.jsxs)(`div`,{className:`relative shrink-0`,style:{width:_.w,height:_.h},children:[(0,X.jsx)(`img`,{ref:T,src:e,alt:s(`editor.capturedAlt`),onLoad:O,draggable:!1,className:`block w-full h-full select-none rounded shadow-2xl`}),D.map(e=>e.kind===`blur`?(0,X.jsx)(`div`,{className:`absolute pointer-events-none`,style:{backgroundColor:qn,left:`${e.x*100}%`,top:`${e.y*100}%`,width:`${e.w*100}%`,height:`${e.h*100}%`}},e.id):null),m&&u===`blur`&&L&&(0,X.jsx)(`div`,{className:`absolute border border-accent-info pointer-events-none`,style:{backgroundColor:qn,left:`${L.x*100}%`,top:`${L.y*100}%`,width:`${L.w*100}%`,height:`${L.h*100}%`}}),(0,X.jsxs)(`svg`,{className:`absolute inset-0 w-full h-full ${u===`text`||u===`step`?`cursor-pointer`:`cursor-crosshair`}`,viewBox:`0 0 ${_.w} ${_.h}`,preserveAspectRatio:`none`,onPointerDown:j,onPointerMove:M,onPointerUp:N,children:[D.map(e=>{if(e.kind===`box`)return(0,X.jsx)(`rect`,{x:I(e.x,`w`),y:I(e.y,`h`),width:I(e.w,`w`),height:I(e.h,`h`),fill:`none`,stroke:e.color,strokeWidth:Math.max(2,_.w*.004)},e.id);if(e.kind===`arrow`){let t=Vn(e.from,e.to,.035),n=Math.max(2,_.w*.004);return(0,X.jsxs)(`g`,{stroke:e.color,strokeWidth:n,strokeLinecap:`round`,fill:`none`,children:[(0,X.jsx)(`line`,{x1:I(e.from.x,`w`),y1:I(e.from.y,`h`),x2:I(e.to.x,`w`),y2:I(e.to.y,`h`)}),(0,X.jsx)(`polyline`,{points:`${I(t.left.x,`w`)},${I(t.left.y,`h`)} ${I(e.to.x,`w`)},${I(e.to.y,`h`)} ${I(t.right.x,`w`)},${I(t.right.y,`h`)}`})]},e.id)}if(e.kind===`text`)return(0,X.jsx)(`text`,{x:I(e.x,`w`),y:I(e.y,`h`),dominantBaseline:`hanging`,fontSize:Math.max(12,_.h*.03),fontWeight:600,fill:e.color,stroke:`rgba(0,0,0,0.55)`,strokeWidth:1,paintOrder:`stroke`,children:e.text},e.id);if(e.kind===`step`){let t=Math.max(10,_.h*.025);return(0,X.jsxs)(`g`,{children:[(0,X.jsx)(`circle`,{cx:I(e.x,`w`),cy:I(e.y,`h`),r:t,fill:e.color}),(0,X.jsx)(`text`,{x:I(e.x,`w`),y:I(e.y,`h`),textAnchor:`middle`,dominantBaseline:`central`,fontSize:t*1.1,fontWeight:700,fill:`#000`,children:e.n})]},e.id)}return null}),m&&u===`box`&&L&&(0,X.jsx)(`rect`,{x:I(L.x,`w`),y:I(L.y,`h`),width:I(L.w,`w`),height:I(L.h,`h`),fill:`none`,stroke:f,strokeDasharray:`4 3`,strokeWidth:Math.max(2,_.w*.004)}),m&&u===`arrow`&&(0,X.jsx)(`line`,{x1:I(m.start.x,`w`),y1:I(m.start.y,`h`),x2:I(m.cur.x,`w`),y2:I(m.cur.y,`h`),stroke:f,strokeWidth:Math.max(2,_.w*.004),strokeLinecap:`round`})]}),y&&(0,X.jsxs)(`div`,{className:`absolute inset-0 flex items-center justify-center gap-2 bg-background-deep/50 text-sm text-foreground`,children:[(0,X.jsx)(ee,{className:`w-4 h-4 animate-spin`}),` `,s(`common:states.saving`)]})]})}),x&&(0,X.jsx)(`p`,{role:`alert`,className:`shrink-0 text-sm text-destructive`,children:s(`modal.toast.captureFailed`)}),(0,X.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[(0,X.jsxs)(U,{size:`sm`,variant:`ghost`,className:`gap-1.5`,onClick:a,disabled:y,children:[(0,X.jsx)(S,{className:`w-3.5 h-3.5`}),` `,s(`editor.reselect`)]}),(0,X.jsxs)(U,{size:`sm`,variant:`ghost`,className:`gap-1.5`,onClick:F,disabled:y,children:[(0,X.jsx)(ie,{className:`w-3.5 h-3.5`}),` `,s(`common:actions.cancel`)]}),(0,X.jsxs)(U,{size:`sm`,className:`gap-1.5`,onClick:()=>void te(),disabled:y,"data-testid":`annotation-confirm`,children:[(0,X.jsx)(k,{className:`w-3.5 h-3.5`}),` `,D.length>0?r??s(`editor.createSpec`):s(`editor.skipContinue`)]})]})]})}var Qn=`native-browser:event`;function $n(e){let t=(e??``).trim();if(!t)return null;if(t===`about:blank`)return t;let n=er(t);if(n){if(n.protocol===`http:`||n.protocol===`https:`)return n.toString();let e=`${n.pathname}${n.search}${n.hash}`;if(!/^\d+([/?#].*)?$/.test(e))return null}let r=er(`https://${t}`);if(r&&r.protocol===`https:`){let e=r.hostname.toLowerCase();return(e===`localhost`||e.endsWith(`.localhost`)||e===`[::1]`||/^127\./.test(e))&&(r.protocol=`http:`),r.toString()}return null}function er(e){try{return new URL(e)}catch{return null}}function tr(e){let t=(e,t)=>Number.isFinite(e)?e:t;return{x:Math.max(0,Math.round(t(e.left,0))),y:Math.max(0,Math.round(t(e.top,0))),width:Math.max(1,Math.round(t(e.width,1))),height:Math.max(1,Math.round(t(e.height,1)))}}var nr=null,rr=null,ir=Promise.resolve();async function ar(){return(await i(()=>import(`./core-B3mKBIh5.js`).then(e=>e.i),__vite__mapDeps([0,1]))).invoke}function or(e){let t=e?.flag??ke,n=e?.tauri??_e();return!t||!n?Promise.resolve(!1):(nr||=(async()=>{try{return await(await ar())(`browser_supported`)===!0}catch{return nr=null,!1}})(),nr)}async function sr(e){return await or(e)?(rr||=Z(`browser_capture_supported`).then(e=>e===!0).catch(()=>(rr=null,!1)),rr):!1}async function Z(e,t){return(await ar())(e,t)}function cr(e){let t=ir.then(e,e);return ir=t.catch(()=>{}),t}var Q={open:(e,t,n)=>cr(()=>Z(`browser_open`,{ownerId:e,url:t,bounds:n})),navigate:(e,t)=>Z(`browser_navigate`,{ownerId:e,url:t}),back:e=>Z(`browser_back`,{ownerId:e}),forward:e=>Z(`browser_forward`,{ownerId:e}),reload:e=>Z(`browser_reload`,{ownerId:e}),setBounds:(e,t)=>Z(`browser_set_bounds`,{ownerId:e,bounds:t}),show:e=>Z(`browser_show`,{ownerId:e}),hide:e=>Z(`browser_hide`,{ownerId:e}),close:e=>cr(()=>Z(`browser_close`,{ownerId:e})),devtools:e=>Z(`browser_devtools`,{ownerId:e}),zoom:(e,t)=>Z(`browser_zoom`,{ownerId:e,factor:t}),setSelectMode:(e,t)=>Z(`browser_set_select_mode`,{ownerId:e,enabled:t}),selection:e=>Z(`browser_selection`,{ownerId:e}),capture:(e,t)=>Z(`browser_capture`,{ownerId:e,selectionOnly:t}),onEvent:async(e,t)=>{let n=n=>{n.payload.ownerId===e&&t(n.payload)},{listen:r}=await i(async()=>{let{listen:e}=await import(`./event-Bt7f3wXe.js`).then(e=>e.i);return{listen:e}},__vite__mapDeps([3,1,0]));return r(Qn,n)}},lr=e(r(),1),ur=new Map,dr=new Map;function fr(e,t){let n=(dr.get(e)??Promise.resolve()).catch(()=>{}).then(t);return dr.set(e,n),n.finally(()=>{dr.get(e)===n&&dr.delete(e)}).catch(()=>{}),n}function pr({ownerId:e,leaseRevision:t=0,onBusyChange:n,transferError:r,url:i,onClose:a,onFallback:o,onUrlChange:s,onCaptured:c,confirmLabel:l,selectLabel:u}){let{t:d}=g(`browser`),f=(0,J.useRef)(null),p=(0,J.useRef)(!1),[m,h]=(0,J.useState)(i),[_,v]=(0,J.useState)(i),[y,b]=(0,J.useState)(null),[x,C]=(0,J.useState)(!0),[w,T]=(0,J.useState)(!1),[D,O]=(0,J.useState)(null),[k,A]=(0,J.useState)(!1),[j,M]=(0,J.useState)(null),[N,ee]=(0,J.useState)(!1),[P,te]=(0,J.useState)(null);(0,J.useEffect)(()=>(n?.(k||j!==null||N||P!==null),()=>{n?.(!1)}),[n,k,j,N,P]);let F=(0,J.useRef)(1),I=(0,J.useRef)(null),L=(0,J.useRef)(!1),ne=(0,J.useRef)(!1),R=(0,J.useRef)(!1),z=(0,J.useRef)(null),ae=(0,J.useRef)(i),oe=(0,J.useRef)({url:i,onFallback:o,onUrlChange:s});oe.current={url:i,onFallback:o,onUrlChange:s},R.current=P!==null;let B=(0,J.useCallback)(async e=>{let t=I.current;if(!(!t||!L.current)){O(null);try{await e(t)}catch(e){I.current===t&&O(e instanceof Error?e.message:String(e))}}},[]);(0,J.useEffect)(()=>{let t=!1,n=null,r=0,i=null,a=e??crypto.randomUUID(),o=Symbol(a);ur.set(a,o);let s=()=>{fr(a,async()=>{ur.get(a)===o&&(ur.delete(a),await Q.close(a))}).catch(()=>{})};I.current=a,L.current=!1,T(!1);let c=()=>{t||r||(r=requestAnimationFrame(()=>{if(r=0,!L.current||R.current||ne.current)return;let e=f.current?.getBoundingClientRect();if(!e||e.width<=0||e.height<=0)return;let t=tr(e);JSON.stringify(t)!==JSON.stringify(z.current)&&(z.current=t,Q.setBounds(a,t).catch(()=>{z.current=null}))}))};return(async()=>{try{let e=await Q.onEvent(a,e=>{if(!t){if(e.kind===`resume`){!R.current&&!ne.current&&fr(a,async()=>{if(t||ur.get(a)!==o||R.current||ne.current)return;let n=f.current?.getBoundingClientRect();n&&await Q.open(a,e.url??ae.current,tr(n))}).catch(e=>{t||O(String(e))});return}e.kind===`nav`&&e.url?(v(e.url),oe.current.onUrlChange?.(e.url),M(null),A(!1),p.current||h(e.url)):e.kind===`title`?b(e.title??null):e.kind===`load-started`?C(!0):e.kind===`load-finished`?(C(!1),e.url&&!p.current&&h(e.url)):e.kind===`popup-error`?O(d(`popup.openFailed`)):e.kind===`popup-opened`&&O(null)}});if(t){e();return}n=e;let r=f.current?.getBoundingClientRect();if(!r)throw Error(`hole not measurable`);ae.current=$n(oe.current.url)??`about:blank`,z.current=tr(r);let l=z.current;if(!await fr(a,async()=>t||ur.get(a)!==o?!1:(await Q.open(a,ae.current,l),!0)))return;if(t){s();return}L.current=!0,T(!0),i=new ResizeObserver(c),f.current&&i.observe(f.current),window.addEventListener(`resize`,c),window.addEventListener(`scroll`,c,!0),window.visualViewport?.addEventListener(`resize`,c),window.visualViewport?.addEventListener(`scroll`,c),c()}catch{t||oe.current.onFallback()}})(),()=>{t=!0,cancelAnimationFrame(r),i?.disconnect(),window.removeEventListener(`resize`,c),window.removeEventListener(`scroll`,c,!0),window.visualViewport?.removeEventListener(`resize`,c),window.visualViewport?.removeEventListener(`scroll`,c),n?.(),I.current===a&&(I.current=null,L.current=!1),s()}},[e,t]),(0,J.useEffect)(()=>{let e=$n(i)??`about:blank`;!w||e===ae.current||(ae.current=e,h(e),B(t=>Q.navigate(t,e)))},[i,w,B]);let se=(0,J.useCallback)(async e=>{let t=I.current;if(!(!t||!L.current||ne.current)){ne.current=!0,ee(!0),O(null);try{let n=await Q.capture(t,e);if(I.current!==t||(await Q.hide(t),I.current!==t))return;R.current=!0,A(!1),te(n)}catch(e){I.current===t&&O(e instanceof Error?e.message:String(e))}finally{ne.current=!1,I.current===t&&ee(!1)}}},[]);(0,J.useEffect)(()=>{if(!k||!w)return;let e=I.current,t=!1,n,r=async()=>{try{let n=await Q.selection(e);if(t||I.current!==e)return;if(n){if(await Q.setSelectMode(e,!1),t||I.current!==e)return;M(n),A(!1),await se(!0);return}}catch(n){if(t||I.current!==e)return;O(String(n));try{await Q.setSelectMode(e,!1),!t&&I.current===e&&A(!1)}catch(n){!t&&I.current===e&&O(String(n))}return}t||(n=setTimeout(r,200))};return r(),()=>{t=!0,clearTimeout(n)}},[k,w,se]);let ce=async()=>{await B(async e=>{await Q.setSelectMode(e,!k),M(null),A(!k)})},le=async()=>{te(null),await B(async e=>{await new Promise(e=>requestAnimationFrame(()=>e()));let t=f.current?.getBoundingClientRect();t&&t.width>0&&t.height>0&&(z.current=tr(t),await Q.setBounds(e,z.current)),await Q.show(e)})};(0,J.useEffect)(()=>{let e=e=>{e.key===`Escape`&&!R.current&&a()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[a]);let ue=(0,J.useCallback)(()=>{let e=$n(m);e&&(h(e),B(t=>Q.navigate(t,e)))},[m,B]),de=(0,J.useCallback)(e=>{F.current=Math.min(3,Math.max(.25,e)),B(e=>Q.zoom(e,F.current))},[B]);return typeof document>`u`?null:(0,lr.createPortal)((0,X.jsx)(`div`,{className:`fixed inset-0 z-[80] bg-background-deep/60 backdrop-blur-md pointer-events-auto`,onClick:e=>{e.target===e.currentTarget&&!P&&a()},"data-testid":`native-browser-modal`,children:(0,X.jsxs)(`div`,{className:`absolute inset-x-[4%] inset-y-[3.5%] flex flex-col border border-border/70 rounded-2xl bg-background-deep overflow-hidden shadow-2xl ring-1 ring-black/20`,role:`dialog`,"aria-modal":`true`,"aria-label":d(`modal.dialogLabel`),onClick:e=>e.stopPropagation(),children:[!P&&(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5 border-b border-border/50 bg-surface/80 shrink-0`,children:[(0,X.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,X.jsx)(U,{disabled:!w,variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":d(`common:actions.back`),onClick:()=>void B(Q.back),children:(0,X.jsx)(S,{className:`w-4 h-4`})}),(0,X.jsx)(U,{disabled:!w,variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":d(`modal.nav.forward`),onClick:()=>void B(Q.forward),children:(0,X.jsx)(Pe,{className:`w-4 h-4`})}),(0,X.jsx)(U,{disabled:!w,variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":d(`modal.nav.reload`),onClick:()=>void B(Q.reload),children:(0,X.jsx)(Je,{className:`w-4 h-4`})})]}),(0,X.jsxs)(`form`,{className:`flex-1 flex items-center gap-2 min-w-0`,onSubmit:e=>{e.preventDefault(),ue()},children:[(0,X.jsxs)(`div`,{className:`flex items-center gap-2 flex-1 min-w-0 rounded-md border border-border bg-background px-2.5 py-1`,children:[(0,X.jsx)(Ue,{className:`w-3.5 h-3.5 text-muted-foreground shrink-0`}),(0,X.jsx)(`input`,{value:m,onChange:e=>h(e.target.value),onFocus:()=>{p.current=!0},onBlur:()=>{p.current=!1},onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),ue())},placeholder:d(`modal.address.placeholder`),"aria-label":d(`modal.address.label`),className:`flex-1 min-w-0 bg-transparent outline-none text-sm`})]}),(0,X.jsx)(U,{type:`submit`,size:`sm`,variant:`secondary`,className:`shrink-0`,children:d(`modal.address.go`)})]}),(0,X.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,X.jsx)(U,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":d(`native.zoomOut`),title:d(`native.zoomOut`),onClick:()=>de(F.current-.1),children:(0,X.jsx)(et,{className:`w-4 h-4`})}),(0,X.jsx)(U,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":d(`native.zoomIn`),title:d(`native.zoomIn`),onClick:()=>de(F.current+.1),children:(0,X.jsx)($e,{className:`w-4 h-4`})}),(0,X.jsx)(U,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":d(`native.devtools`),title:d(`native.devtools`),onClick:()=>void B(Q.devtools),children:(0,X.jsx)(re,{className:`w-4 h-4`})}),(0,X.jsx)(U,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":d(`native.openExternal`),title:d(`native.openExternal`),onClick:()=>void ve(_),children:(0,X.jsx)(E,{className:`w-4 h-4`})}),(0,X.jsx)(U,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":d(`modal.closeBrowser`),onClick:a,children:(0,X.jsx)(ie,{className:`w-4 h-4`})})]})]}),(0,X.jsxs)(`div`,{className:`px-3 py-1 text-[11px] text-muted-foreground truncate shrink-0 flex items-center gap-2`,children:[(0,X.jsx)(`span`,{className:`inline-block w-2 h-2 rounded-full shrink-0 ${x?`bg-accent-warning animate-pulse`:`bg-accent-success`}`,"aria-hidden":!0}),(0,X.jsx)(`span`,{className:`truncate`,children:y||_}),(0,X.jsx)(`span`,{className:`ml-auto shrink-0 rounded-full border border-accent-success/30 bg-accent-success/10 text-accent-success px-2 py-px text-[10px] font-medium`,children:d(`native.badge`)})]}),c&&(0,X.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 border-b border-border/50 px-3 py-2 shrink-0`,children:[(0,X.jsxs)(U,{variant:k?`secondary`:`ghost`,size:`sm`,disabled:!w||N,"aria-pressed":k,onClick:()=>void ce(),children:[(0,X.jsx)(Ke,{className:`mr-1.5 h-3.5 w-3.5`}),u??d(`native.selectElement`)]}),(0,X.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-xs text-muted-foreground`,children:k?d(`native.selectHint`):j?.selector}),(0,X.jsxs)(U,{variant:`secondary`,size:`sm`,disabled:!w||N||k||_===`about:blank`,onClick:()=>void se(j!==null),children:[(0,X.jsx)(Fe,{className:`mr-1.5 h-3.5 w-3.5`}),d(N?`native.capturing`:j?`native.captureSelection`:`native.capturePage`)]})]})]}),(D||r)&&(0,X.jsx)(`div`,{role:`alert`,className:`border-b border-destructive/30 bg-destructive/10 px-3 py-2 text-xs text-destructive shrink-0`,children:D||r}),P&&c&&(0,X.jsx)(Zn,{screenshotDataUrl:P.screenshotDataUrl,confirmLabel:l,onConfirm:async e=>{await c({...P,screenshotDataUrl:e.screenshotDataUrl})},onReselect:()=>{le()},onCancel:a}),(0,X.jsx)(`div`,{ref:f,className:P?`hidden`:`relative flex-1 min-h-0 overflow-hidden`,children:x&&(0,X.jsx)(`div`,{className:`absolute inset-0 flex items-center justify-center text-sm text-muted-foreground`,children:d(`modal.status.opening`)})})]})}),document.body)}function mr(e){let t=e.schedule??(e=>requestAnimationFrame(e)),n=e.cancel??(e=>cancelAnimationFrame(e)),r=e.now??(()=>typeof performance<`u`?performance.now():Date.now()),i=e.release??(()=>{}),a={received:0,decoded:0,drawn:0,droppedStale:0,droppedUndrawn:0,decodeMsTotal:0,drawMsTotal:0},o=!1,s=!1,c=null,l=null,u=null,d=()=>{u=null;let t=l;if(l=null,t==null||o){t!=null&&f(t);return}let n=r();try{e.draw(t),a.drawn++,a.drawMsTotal+=r()-n}catch{}finally{f(t)}},f=e=>{try{i(e)}catch{}},p=()=>{u==null&&!o&&(u=t(d))},m=t=>{s=!0;let n=r();e.decode(t).then(e=>{if(o){f(e);return}a.decoded++,a.decodeMsTotal+=r()-n,l!=null&&(a.droppedUndrawn++,f(l)),l=e,p(),h()},()=>{h()})},h=()=>{if(o){s=!1;return}let e=c;c=null,e==null?s=!1:m(e)};return{push(e){if(!o){if(a.received++,s){c!=null&&a.droppedStale++,c=e;return}m(e)}},stats(){return{...a}},dispose(){if(!o){if(o=!0,c=null,u!=null){try{n(u)}catch{}u=null}l!=null&&(f(l),l=null)}}}}var hr=`specrails-desktop:browser-capture-debug`;function gr(){try{return typeof localStorage<`u`&&localStorage.getItem(hr)===`1`}catch{return!1}}function _r(e,t,n){let r=Math.max(1,n),i=t.decoded-e.decoded,a=t.drawn-e.drawn,o=e=>Math.round(e*10)/10;return{fpsReceived:o((t.received-e.received)*1e3/r),fpsDrawn:o(a*1e3/r),droppedStale:t.droppedStale-e.droppedStale,droppedUndrawn:t.droppedUndrawn-e.droppedUndrawn,avgDecodeMs:i>0?o((t.decodeMsTotal-e.decodeMsTotal)/i):0,avgDrawMs:a>0?o((t.drawMsTotal-e.drawMsTotal)/a):0}}function vr(e,t=e=>console.table([e]),n=2e3,r=()=>Date.now()){let i=e(),a=r(),o=setInterval(()=>{let n=e(),o=r();t(_r(i,n,o-a)),i=n,a=o},n);return()=>clearInterval(o)}function yr(e){let{projectId:t,open:n,initialUrl:r}=e,i=(0,J.useRef)(null),a=(0,J.useRef)(null),o=(0,J.useRef)(null),s=(0,J.useRef)(0),c=(0,J.useRef)(0),u=(0,J.useRef)(null),d=(0,J.useRef)(null),f=(0,J.useCallback)(()=>{let e=u.current,t=d.current,n=a.current;if(!(!e||!n||n.readyState!==WebSocket.OPEN)&&!(t&&t.width===e.width&&t.height===e.height&&t.deviceScaleFactor===e.deviceScaleFactor))try{n.send(JSON.stringify({type:`input`,event:{type:`resize`,...e}})),d.current=e}catch{}},[]),p=(0,J.useRef)(0),m=(0,J.useRef)(new Map),h=(0,J.useCallback)(()=>{if(p.current!==0||m.current.size===0)return;let e=[...m.current.values()];m.current.clear();for(let t of e)En(t.projectId,t.sessionId)},[]),[g,_]=(0,J.useState)({status:`connecting`,errorMsg:null,url:null,title:null,viewport:{width:1280,height:800},hoverRect:null,hoverSelector:null,hoverPath:null,popup:null,popupError:null});(0,J.useEffect)(()=>{if(!n||!t)return;let e=!1,c=null;d.current=null,_(e=>({...e,status:`connecting`,errorMsg:null,popup:null,popupError:null}));let h=mr({decode:e=>createImageBitmap(new Blob([e],{type:`image/jpeg`})),draw:e=>{let t=i.current;t&&(t.width!==e.width&&(t.width=e.width),t.height!==e.height&&(t.height=e.height),t.getContext(`2d`)?.drawImage(e,0,0))},release:e=>e.close()}),g=gr()?vr(()=>h.stats()):null;return(async()=>{try{let n=await gn(t,r);if(e){En(t,n.id);return}c=n.id,o.current={id:n.id,projectId:t},_(e=>({...e,url:n.url,title:n.title,viewport:u.current??{width:n.viewportWidth,height:n.viewportHeight}}));let i=On(n.id,t);a.current=i,i.onmessage=e=>{if(typeof e.data==`string`){try{let t=JSON.parse(e.data);if(t.type===`ready`)_(e=>({...e,status:`ready`,url:t.url??e.url,title:t.title??e.title,viewport:u.current??t.viewport??e.viewport})),f();else if(t.type===`nav`)_(e=>({...e,url:t.url??e.url,title:t.title??e.title}));else if(t.type===`hover`)_(e=>({...e,hoverRect:t.rect??null,hoverSelector:t.selector??null,hoverPath:t.path??null}));else if(t.type===`popup`){let e=typeof t.count==`number`?t.count:0;s.current+=1,_(n=>({...n,popup:e>0?{count:e,active:t.active===!0,url:t.url??null}:null,popupError:null}))}}catch{}return}h.push(e.data)},i.onopen=()=>{e||(f(),_(e=>({...e,status:`ready`})))},i.onerror=()=>{e||_(e=>({...e,status:`error`,errorMsg:l.t(`browser:session.connectionError`)}))},i.onclose=()=>{e||_(e=>({...e,status:`error`,errorMsg:l.t(`browser:session.lostConnection`)}))}}catch(t){if(e)return;let n=t instanceof pn?l.t(`browser:session.tooManySessions`):t instanceof mn?l.t(`browser:session.launchFailed`):l.t(`browser:session.openFailed`);_(e=>({...e,status:`error`,errorMsg:n}))}})(),()=>{e=!0,g?.(),h.dispose();let n=a.current;if(n){n.onmessage=null,n.onopen=null,n.onerror=null,n.onclose=null;try{n.close()}catch{}}a.current=null;let r=c;r&&o.current?.id===r&&o.current.projectId===t&&(o.current=null),r&&(p.current>0?m.current.set(`${t}\0${r}`,{sessionId:r,projectId:t}):En(t,r))}},[n,t,r,h,f]);let v=(0,J.useCallback)(e=>{let t=a.current;if(t&&t.readyState===WebSocket.OPEN)try{t.send(JSON.stringify({type:`input`,event:e}))}catch{}},[]),y=(0,J.useCallback)(async(e,t)=>{let n=o.current;if(n)try{let r=await _n(n.projectId,n.id,e,t);if(o.current!==n)return;r.target!==`popup`&&_(e=>({...e,url:r.url,title:r.title}))}catch{}},[]),b=(0,J.useCallback)(async(e,t,n)=>{let r=o.current;if(!r)throw Error(`No active browser session`);p.current+=1;try{return await vn(r.projectId,r.id,e,t,n)}finally{p.current=Math.max(0,p.current-1),h()}},[h]),x=(0,J.useCallback)(async(e,t,n,r)=>{let i=o.current;if(!i)throw Error(`No active browser session`);p.current+=1;try{return await bn(i.projectId,i.id,e,t,n,r)}finally{p.current=Math.max(0,p.current-1),h()}},[h]),S=(0,J.useCallback)(async(e,t)=>{let n=o.current;return n?Sn(n.projectId,n.id,e,t):{text:``}},[]),C=(0,J.useCallback)((e,t,n=window.devicePixelRatio||1)=>{if(!Number.isFinite(e)||!Number.isFinite(t)||e<=0||t<=0)return;let r=Math.max(1,Math.round(e)),i=Math.max(1,Math.round(t));u.current={width:r,height:i,deviceScaleFactor:Number.isFinite(n)?Math.min(2,Math.max(1,n)):1},_(e=>e.viewport.width===r&&e.viewport.height===i?e:{...e,viewport:{width:r,height:i}}),f()},[f]),w=(0,J.useCallback)(e=>{let t=a.current;if(t&&t.readyState===WebSocket.OPEN)try{t.send(JSON.stringify({type:`probe`,x:e.x,y:e.y}))}catch{}},[]),T=(0,J.useCallback)(()=>{_(e=>e.hoverRect||e.hoverPath?{...e,hoverRect:null,hoverSelector:null,hoverPath:null}:e)},[]),E=(0,J.useCallback)(async(e,t)=>{let n=o.current;return n?Cn(n.projectId,n.id,e,t):null},[]),D=(0,J.useCallback)(async e=>{let t=o.current;if(!t)return;let n=s.current,r=++c.current,i=()=>o.current===t&&s.current===n&&c.current===r;try{await wn(t.projectId,t.id,e),i()&&_(e=>({...e,popupError:null}))}catch{i()&&_(e=>({...e,popupError:l.t(`browser:session.connectionError`)}))}},[]);return{...g,canvasRef:i,forwardInput:v,navigate:y,capture:b,captureBreakpoints:x,clipboard:S,navigateElement:E,setViewport:C,probe:w,clearHover:T,setPopupView:D}}function br(e,t,n,r){let i=(0,J.useRef)(t);i.current=t,(0,J.useEffect)(()=>{let t=e.current;if(!n||!t)return;let a=!1,o=null,s=0,c=0,l=0,u=null,d=()=>{if(o=null,a)return;let e=r??t.getBoundingClientRect();if(!Number.isFinite(e.width)||!Number.isFinite(e.height)||e.width<=0||e.height<=0)return;let n=Math.max(1,Math.round(e.width)),u=Math.max(1,Math.round(e.height)),d=window.devicePixelRatio,f=Number.isFinite(d)?Math.min(2,Math.max(1,d)):1;n===s&&u===c&&f===l||(s=n,c=u,l=f,i.current(n,u,f))},f=()=>{a||o===null&&(o=requestAnimationFrame(d))},p=()=>{u?.removeEventListener(`change`,m),u=typeof window.matchMedia==`function`?window.matchMedia(`(resolution: ${window.devicePixelRatio||1}dppx)`):null,u?.addEventListener(`change`,m)},m=()=>{f(),p()};d();let h=typeof ResizeObserver>`u`?null:new ResizeObserver(f);return h?.observe(t),window.addEventListener(`resize`,f),p(),()=>{a=!0,o!==null&&cancelAnimationFrame(o),h?.disconnect(),u?.removeEventListener(`change`,m),window.removeEventListener(`resize`,f)}},[e,n,r?.width,r?.height])}function xr({open:e,url:t,projectId:n,onClose:r}){let[i,a]=(0,J.useState)(`probing`);(0,J.useEffect)(()=>{if(!e||i!==`probing`)return;let t=!0;return or().then(e=>{t&&a(e?`native`:`screencast`)}),()=>{t=!1}},[e,i]);let o=(0,J.useCallback)(()=>a(`screencast`),[]);return!e||i===`probing`?null:i===`native`?(0,X.jsx)(pr,{url:t,onClose:r,onFallback:o}):(0,X.jsx)(Sr,{open:e,url:t,projectId:n,onClose:r})}function Sr({open:e,url:t,projectId:n,onClose:r}){let{t:i}=g(`browser`),a=yr({projectId:n,open:e,initialUrl:t}),{canvasRef:o,viewport:s,status:c,errorMsg:l,url:u,title:d,popup:f,popupError:p,setViewport:m}=a,[h,_]=(0,J.useState)(t),v=(0,J.useRef)(null);br(v,m,e);let y=(0,J.useRef)(a.forwardInput);y.current=a.forwardInput;let b=(0,J.useRef)(null),x=(0,J.useCallback)(()=>(b.current??=kn(e=>y.current(e)),b.current),[]);(0,J.useEffect)(()=>()=>{b.current?.dispose(),b.current=null},[]);let C=f?.active?f.url??`about:blank`:u??``;(0,J.useEffect)(()=>{_(C)},[C,f?.active]),(0,J.useEffect)(()=>{if(!e)return;let t=e=>{e.key===`Escape`&&r()};return window.addEventListener(`keydown`,t),()=>window.removeEventListener(`keydown`,t)},[e,r]);let w=(0,J.useCallback)((e,t)=>{let n=o.current?.getBoundingClientRect();return n?An({x:e,y:t},{left:n.left,top:n.top,width:n.width,height:n.height},s):{x:0,y:0}},[o,s]),T=e=>e===2?`right`:e===1?`middle`:`left`,D=(0,J.useCallback)(e=>{let t=w(e.clientX,e.clientY);x().move(t.x,t.y)},[w,x]),O=(0,J.useCallback)(e=>{let t=w(e.clientX,e.clientY),n=x();n.move(t.x,t.y),n.flush(),a.forwardInput({type:`mouse`,action:`down`,x:t.x,y:t.y,button:T(e.button),clickCount:e.detail||1})},[w,a,x]),k=(0,J.useCallback)(e=>{let t=w(e.clientX,e.clientY),n=x();n.move(t.x,t.y),n.flush(),a.forwardInput({type:`mouse`,action:`up`,x:t.x,y:t.y,button:T(e.button),clickCount:e.detail||1})},[w,a,x]),A=(0,J.useCallback)(e=>{let t=w(e.clientX,e.clientY);x().wheel(t.x,t.y,e.deltaX,e.deltaY)},[w,x]),j=(0,J.useCallback)(e=>{if(e.key===`Escape`)return;let t=e.metaKey||e.ctrlKey;if(t&&(e.key===`c`||e.key===`v`||e.key===`x`)){e.preventDefault();let t=e.key;(async()=>{try{if(t===`v`){let e=await navigator.clipboard.readText();e&&await a.clipboard(`paste`,e)}else{let{text:e}=await a.clipboard(t===`x`?`cut`:`copy`);e&&await navigator.clipboard.writeText(e)}}catch{}})();return}let n={type:`key`,action:`down`,key:e.key,code:e.code,text:!t&&e.key.length===1?e.key:void 0};a.forwardInput(n),(e.key===`Tab`||e.key===` `||e.key.startsWith(`Arrow`))&&e.preventDefault()},[a]),M=(0,J.useCallback)(e=>{e.key!==`Escape`&&a.forwardInput({type:`key`,action:`up`,key:e.key,code:e.code})},[a]),N=(0,J.useCallback)(()=>{a.navigate(`goto`,h)},[a,h]);return!e||typeof document>`u`?null:(0,lr.createPortal)((0,X.jsx)(`div`,{className:`fixed inset-0 z-[80] bg-background-deep/60 backdrop-blur-md pointer-events-auto`,onClick:e=>{e.target===e.currentTarget&&r()},"data-testid":`webview-modal`,children:(0,X.jsxs)(`div`,{className:`absolute inset-x-[4%] inset-y-[3.5%] flex flex-col border border-border/70 rounded-2xl bg-background-deep overflow-hidden shadow-2xl ring-1 ring-black/20`,role:`dialog`,"aria-modal":`true`,"aria-label":i(`modal.dialogLabel`),onClick:e=>e.stopPropagation(),children:[(0,X.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5 border-b border-border/50 bg-surface/80 shrink-0`,children:[(0,X.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,X.jsx)(U,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":i(`common:actions.back`),onClick:()=>a.navigate(`back`),children:(0,X.jsx)(S,{className:`w-4 h-4`})}),(0,X.jsx)(U,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":i(`modal.nav.forward`),onClick:()=>a.navigate(`forward`),children:(0,X.jsx)(Pe,{className:`w-4 h-4`})}),(0,X.jsx)(U,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":i(`modal.nav.reload`),onClick:()=>a.navigate(`reload`),children:(0,X.jsx)(Je,{className:`w-4 h-4`})})]}),(0,X.jsxs)(`form`,{className:`flex-1 flex items-center gap-2 min-w-0`,onSubmit:e=>{e.preventDefault(),N()},children:[(0,X.jsxs)(`div`,{className:`flex items-center gap-2 flex-1 min-w-0 rounded-md border border-border bg-background px-2.5 py-1`,children:[(0,X.jsx)(Ue,{className:`w-3.5 h-3.5 text-muted-foreground shrink-0`}),(0,X.jsx)(`input`,{value:h,onChange:e=>_(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),N())},placeholder:i(`modal.address.placeholder`),"aria-label":i(`modal.address.label`),className:`flex-1 min-w-0 bg-transparent outline-none text-sm`})]}),(0,X.jsx)(U,{type:`submit`,size:`sm`,variant:`secondary`,className:`shrink-0`,disabled:c===`error`,children:i(`modal.address.go`)})]}),(0,X.jsx)(U,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":i(`modal.closeBrowser`),onClick:r,children:(0,X.jsx)(ie,{className:`w-4 h-4`})})]}),(0,X.jsxs)(`div`,{className:`px-3 py-1 text-[11px] text-muted-foreground truncate shrink-0 flex items-center gap-2`,children:[(0,X.jsx)(`span`,{className:`inline-block w-2 h-2 rounded-full shrink-0 ${c===`ready`?`bg-accent-success`:c===`error`?`bg-destructive`:`bg-accent-warning animate-pulse`}`,"aria-hidden":!0}),(0,X.jsx)(`span`,{className:`truncate`,children:c===`connecting`?i(`modal.status.connecting`):c===`error`?l??i(`modal.status.unavailable`):f?.active?i(`popup.loginWindow`,{origin:Tn(f.url)}):d||``})]}),p&&(0,X.jsx)(`div`,{role:`alert`,className:`px-3 py-1.5 text-xs text-destructive border-b border-border/40 shrink-0`,children:p}),f&&(0,X.jsxs)(`div`,{"data-testid":`webview-popup-bar`,className:`flex items-center gap-2 px-3 py-1.5 text-xs border-b shrink-0 ${f.active?`bg-accent-info/10 border-accent-info/30 text-accent-info`:`bg-surface/70 border-border/40 text-muted-foreground`}`,children:[(0,X.jsx)(E,{className:`w-3.5 h-3.5 shrink-0`}),f.active?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`span`,{className:`truncate font-medium`,children:i(`popup.loginWindow`,{origin:Tn(f.url)})}),f.count>1&&(0,X.jsx)(`span`,{className:`shrink-0 opacity-70`,children:i(`popup.stacked`,{count:f.count-1})}),(0,X.jsxs)(`button`,{type:`button`,onClick:()=>a.setPopupView(`root`),className:`ml-auto shrink-0 inline-flex items-center gap-1 h-6 px-2 rounded-md border border-current/30 hover:bg-card/60 transition-colors`,children:[(0,X.jsx)(S,{className:`w-3 h-3`}),i(`popup.backToPage`)]})]}):(0,X.jsxs)(`button`,{type:`button`,onClick:()=>a.setPopupView(`popup`),className:`inline-flex items-center gap-1 h-6 px-2 rounded-md border border-border/50 hover:bg-card/60 hover:text-foreground transition-colors`,children:[i(`popup.show`),f.count>1&&(0,X.jsx)(`span`,{className:`opacity-70`,children:i(`popup.stacked`,{count:f.count-1})})]})]}),(0,X.jsx)(`div`,{ref:v,className:`relative flex-1 min-h-0 overflow-hidden flex items-center justify-center outline-none`,tabIndex:0,onKeyDown:j,onKeyUp:M,children:c===`error`?(0,X.jsxs)(`div`,{className:`flex flex-col items-center gap-2 text-center max-w-md px-6`,children:[(0,X.jsx)(R,{className:`w-8 h-8 text-accent-warning`}),(0,X.jsx)(`p`,{className:`text-sm text-foreground/90`,children:l??i(`modal.error.unavailable`)})]}):(0,X.jsx)(`canvas`,{ref:o,style:{maxWidth:`min(100%, ${s.width}px)`,maxHeight:`min(100%, ${s.height}px)`},className:`max-w-full max-h-full block shadow-2xl cursor-default`,onPointerMove:D,onPointerDown:O,onPointerUp:k,onContextMenu:e=>e.preventDefault(),onWheel:A})})]})}),document.body)}var Cr=(0,J.createContext)(null);function wr({children:e}){let{activeProjectId:t}=y(),[n,r]=(0,J.useState)(null),i=(0,J.useCallback)(e=>r(e),[]),a=dn();return(0,X.jsxs)(Cr.Provider,{value:{openWebView:i,canOpenWebView:a&&!!t},children:[e,a&&n&&t&&(0,X.jsx)(xr,{open:!0,url:n,projectId:t,onClose:()=>r(null)})]})}function Tr(){return(0,J.useContext)(Cr)??{openWebView:()=>{},canOpenWebView:!1}}var Er={analyzing:`activity:smash.stage.analyzing`,identifying:`activity:smash.stage.identifying`,ordering:`activity:smash.stage.ordering`},Dr=(0,J.createContext)(null);function $(e){return`smash:${e}`}async function Or(e,t){try{let n=await fetch(`${u}/api/projects/${e}/tickets/${t}/smash`,{method:`POST`});if(n.ok)b.loading(l.t(`activity:smash.retrying`),{id:$(t)});else{let e=await n.json().catch(()=>({}));b.error(e.reason?l.t(`activity:smash.couldNotRetryWithReason`,{reason:e.reason}):l.t(`activity:smash.couldNotRetry`),{id:$(t)})}}catch(e){b.error(l.t(`activity:smash.retryFailed`,{message:e.message}),{id:$(t)})}}async function kr(e,t,n){try{let r=await fetch(`${u}/api/projects/${e}/tickets/${t}/smash/undo`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({smashedAt:n})});if(r.ok)b.success(l.t(`activity:smash.undone`),{id:$(t),duration:3e3});else{let e=await r.json().catch(()=>({}));b.error(e.reason?l.t(`activity:smash.undoFailedWithReason`,{reason:e.reason}):l.t(`activity:smash.undoFailed`),{id:$(t)})}}catch(e){b.error(l.t(`activity:smash.undoFailedWithReason`,{reason:e.message}),{id:$(t)})}}function Ar({children:e}){let{registerHandler:t,unregisterHandler:n}=f(),[r,i]=(0,J.useState)({}),a=(0,J.useRef)(new Map),o=(0,J.useRef)(new Map),s=(0,J.useCallback)(e=>{let t=e;if(!t||t.type!==`smash.started`)return;let n=t.ticketId,r=t.runId,o=t.projectId,s=t.timestamp,c=t.ticketTitle;typeof n!=`number`||!r||!o||(a.current.set(n,o),i(e=>({...e,[n]:{ticketId:n,runId:r,stage:`analyzing`,startedAt:s??new Date().toISOString(),ticketTitle:c}})),b.loading(l.t(Er.analyzing),{id:$(n),description:c?l.t(`activity:smash.onTitled`,{title:c}):l.t(`activity:smash.onThisSpec`)}))},[]),c=(0,J.useCallback)(e=>{let t=e;if(!t||t.type!==`smash.progress`)return;let n=t.ticketId,r=t.stage;if(typeof n!=`number`||!r)return;let a;i(e=>{let t=e[n];return t?(a=t.ticketTitle,{...e,[n]:{...t,stage:r}}):e}),b.loading(l.t(Er[r]),{id:$(n),description:a?l.t(`activity:smash.onTitled`,{title:a}):l.t(`activity:smash.onThisSpec`)})},[]),u=(0,J.useCallback)(e=>{let t=e;if(!t||t.type!==`smash.completed`)return;let n=t.ticketId,r=t.runId,a=t.projectId,s=t.smashedAt,c=t.childrenIds;typeof n!=`number`||!r||!a||!s||!c||(o.current.set(r,s),i(e=>{let t={...e};return delete t[n],t}),b.success(l.t(`activity:smash.split`,{count:c.length}),{id:$(n),duration:1e4,action:{label:l.t(`activity:smash.undoAction`),onClick:()=>void kr(a,n,s)}}))},[]),d=(0,J.useCallback)(e=>{let t=e;if(!t||t.type!==`smash.failed`)return;let n=t.ticketId,r=t.projectId,o=t.reason??`unknown`;if(typeof n!=`number`||!r)return;a.current.set(n,r),i(e=>{let t={...e};return delete t[n],t});let s=o===`invalid-output`?l.t(`activity:smash.failReason.invalidOutput`):o===`timeout`?l.t(`activity:smash.failReason.timeout`):o===`model_error`?l.t(`activity:smash.failReason.modelError`):o===`crashed`?l.t(`activity:smash.failReason.crashed`):l.t(`activity:smash.failReason.generic`,{reason:o});b.error(l.t(`activity:smash.couldNotComplete`),{id:$(n),description:s,action:{label:l.t(`common:actions.retry`),onClick:()=>void Or(r,n)},duration:15e3})},[]),p=(0,J.useCallback)(e=>{let t=e;if(!t||t.type!==`smash.undone`)return;let n=t.ticketId;typeof n==`number`&&(b.dismiss($(n)),b.success(l.t(`activity:smash.undone`),{id:$(n),duration:3e3}))},[]);(0,J.useLayoutEffect)(()=>(t(`_smash_started`,s),t(`_smash_progress`,c),t(`_smash_completed`,u),t(`_smash_failed`,d),t(`_smash_undone`,p),()=>{n(`_smash_started`),n(`_smash_progress`),n(`_smash_completed`),n(`_smash_failed`),n(`_smash_undone`)}),[t,n,s,c,u,d,p]),(0,J.useEffect)(()=>()=>{a.current.clear(),o.current.clear()},[]);let m=(0,J.useMemo)(()=>({inflight:r}),[r]);return(0,X.jsx)(Dr.Provider,{value:m,children:e})}function jr(e){let t=(0,J.useContext)(Dr);return!t||e==null?null:t.inflight[e]??null}var Mr=150,Nr={analyzing:0,identifying:1,ordering:2},Pr={analyzing:`smash.stage.analyzing`,identifying:`smash.stage.identifying`,ordering:`smash.stage.ordering`};function Fr({stage:e,minDisplayMs:t=Mr}){let{t:n}=g(`activity`),[r,i]=(0,J.useState)(e),a=(0,J.useRef)(Date.now()),o=(0,J.useRef)(null);if((0,J.useEffect)(()=>{if(e===r)return;let n=Date.now()-a.current,s=Math.max(0,t-n);return o.current&&clearTimeout(o.current),o.current=setTimeout(()=>{i(e),a.current=Date.now(),o.current=null},s),()=>{o.current&&clearTimeout(o.current)}},[e,r,t]),!r)return null;let s=Nr[r];return(0,X.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-2 rounded-md border border-accent-highlight/40 bg-accent-highlight/10 text-sm text-foreground`,role:`status`,"aria-live":`polite`,"data-testid":`smash-status-pills`,children:[(0,X.jsx)(ee,{className:`h-4 w-4 animate-spin text-accent-highlight`,"aria-hidden":!0}),(0,X.jsx)(`div`,{className:`flex items-center gap-1.5`,children:[`analyzing`,`identifying`,`ordering`].map(e=>(0,X.jsx)(`span`,{className:[`inline-block w-1.5 h-1.5 rounded-full transition-all`,Nr[e]<=s?`bg-accent-highlight`:`bg-muted`,e===r?`scale-125`:`scale-100`].join(` `),"aria-hidden":!0},e))}),(0,X.jsx)(`span`,{className:`font-medium`,children:n(Pr[r])})]})}var Ir={simple:{titleKey:`smashModal.modes.simple.title`,bulletKeys:[`smashModal.modes.simple.bullet1`,`smashModal.modes.simple.bullet2`,`smashModal.modes.simple.bullet3`],etaKey:`smashModal.modes.simple.eta`},full:{titleKey:`smashModal.modes.full.title`,bulletKeys:[`smashModal.modes.full.bullet1`,`smashModal.modes.full.bullet2`,`smashModal.modes.full.bullet3`,`smashModal.modes.full.bullet4`],etaKey:`smashModal.modes.full.eta`}};function Lr({open:e,ticketTitle:t,isReSmash:n,childrenCount:r,submitting:i=!1,onCancel:a,onConfirm:o}){let{t:s}=g(`activity`),[c,l]=(0,J.useState)(`simple`),{panelRef:u,panelStyle:d,headerHandleProps:f,resizeHandles:p,isFloating:m,guardBackdrop:_}=ae();return e?(0,lr.createPortal)((0,X.jsxs)(`div`,{className:`fixed inset-0 z-[60] flex items-center justify-center`,role:`dialog`,"aria-modal":`true`,"data-testid":`smash-confirm-modal`,children:[(0,X.jsx)(`div`,{className:`absolute inset-0 bg-black/60 backdrop-blur-sm`,onClick:_(a)}),(0,X.jsxs)(`div`,{ref:u,className:`relative w-full max-w-lg m-4 rounded-xl glass-card border border-border/30 animate-in fade-in zoom-in-95 duration-150`,style:d,children:[(0,X.jsxs)(`div`,{...f,className:`flex items-start justify-between gap-3 px-5 py-4 border-b border-border/30 ${m?`cursor-grab active:cursor-grabbing`:``}`,children:[(0,X.jsxs)(`div`,{className:`flex items-start gap-2 min-w-0`,children:[(0,X.jsx)(Ye,{className:`w-5 h-5 text-accent-highlight shrink-0 mt-0.5`,"aria-hidden":!0}),(0,X.jsxs)(`div`,{className:`min-w-0`,children:[(0,X.jsx)(`h2`,{className:`text-sm font-semibold text-foreground`,children:s(`smashModal.title`)}),(0,X.jsx)(`p`,{className:`text-[11px] text-muted-foreground truncate`,title:t,children:t})]})]}),(0,X.jsx)(`button`,{type:`button`,onClick:a,className:`h-7 w-7 flex items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-surface/50 transition-colors shrink-0`,"aria-label":s(`common:actions.close`),children:(0,X.jsx)(ie,{className:`w-4 h-4`})})]}),n&&r>0&&(0,X.jsx)(`div`,{className:`mx-5 mt-4 rounded-md border border-accent-warning/40 bg-accent-warning/10 px-3 py-2 text-xs text-foreground`,children:(0,X.jsx)(h,{t:s,i18nKey:`smashModal.reSmashWarning`,count:r})}),(0,X.jsxs)(`div`,{className:`px-5 py-4 space-y-3`,children:[(0,X.jsx)(`p`,{className:`text-[10px] uppercase tracking-wider text-muted-foreground font-medium`,children:s(`smashModal.modePickerLabel`)}),[`simple`,`full`].map(e=>{let t=Ir[e],n=c===e;return(0,X.jsx)(`button`,{type:`button`,onClick:()=>l(e),disabled:i,className:`w-full text-left rounded-lg border px-3 py-3 transition-colors ${n?`border-accent-highlight/60 bg-accent-highlight/10`:`border-border/40 bg-card/40 hover:bg-card/60 hover:border-border/60`}`,"data-testid":`smash-mode-${e}`,children:(0,X.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,X.jsx)(`div`,{className:`mt-0.5 h-3.5 w-3.5 rounded-full border-2 shrink-0 ${n?`border-accent-highlight bg-accent-highlight`:`border-muted-foreground/60`}`,"aria-hidden":!0}),(0,X.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,X.jsxs)(`div`,{className:`flex items-center justify-between gap-2 mb-1`,children:[(0,X.jsxs)(`span`,{className:`flex items-center gap-1.5 text-sm font-semibold text-foreground`,children:[e===`full`&&(0,X.jsx)(z,{className:`w-3.5 h-3.5 text-accent-highlight`,"aria-hidden":!0}),s(t.titleKey)]}),(0,X.jsx)(`span`,{className:`text-[10px] text-muted-foreground tabular-nums`,children:s(t.etaKey)})]}),(0,X.jsx)(`ul`,{className:`space-y-0.5`,children:t.bulletKeys.map(e=>(0,X.jsxs)(`li`,{className:`text-[11px] text-foreground/70 leading-snug`,children:[`• `,s(e)]},e))})]})]})},e)})]}),(0,X.jsxs)(`div`,{className:`flex items-center justify-end gap-2 px-5 py-3 border-t border-border/30 bg-surface/20`,children:[(0,X.jsx)(U,{variant:`ghost`,size:`sm`,onClick:a,disabled:i,children:s(`common:actions.cancel`)}),(0,X.jsxs)(U,{size:`sm`,onClick:()=>o(c),disabled:i,"data-testid":`smash-confirm-modal-continue`,children:[(0,X.jsx)(Ye,{className:`w-3.5 h-3.5 mr-1.5`}),s(i?`smashModal.starting`:n?`smashModal.confirmReSmash`:`smashModal.smash`)]})]})]}),(0,X.jsx)(ce,{handles:p})]}),document.body):null}var Rr=`## Contract Layer`;function zr(e,t){return!(!t||e.status===`draft`||e.parent_epic_id!=null||!e.description?.includes(Rr))}function Br({ticket:e,projectId:t,provider:n,featureFlagOn:r,childrenCount:i}){let{t:a}=g(`activity`),o=jr(e.id),[s,c]=(0,J.useState)(!1),[l,d]=(0,J.useState)(!1),[f,p]=(0,J.useState)(e.origin_conversation_id?void 0:null);(0,J.useEffect)(()=>{let r=e.origin_conversation_id;if(!r){p(null);return}let i=!1;return p(void 0),fetch(`${u}/api/projects/${t}/chat/conversations/${encodeURIComponent(r)}`).then(async e=>{if(!e.ok)throw Error(`origin conversation lookup failed (${e.status})`);let t=await e.json();i||p(t.conversation?.provider??n??null)}).catch(()=>{i||p(null)}),()=>{i=!0}},[t,n,e.origin_conversation_id]);let m=e.origin_conversation_id?f:n,h=r&&x(m),_=e.is_epic===!0,v=!_&&zr(e,h),y=_&&h,S=_&&i>0,C=(0,J.useCallback)(async n=>{if(h){d(!0);try{let r=await fetch(`${u}/api/projects/${t}/tickets/${e.id}/smash`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({mode:n})});if(!r.ok){let e=await r.json().catch(()=>({}));b.error(e.reason?a(`smash.couldNotStartWithReason`,{reason:e.reason}):a(`smash.couldNotStart`));return}c(!1)}catch(e){b.error(a(`smash.smashFailed`,{message:e.message}))}finally{d(!1)}}},[t,e.id,a,h]),w=(0,J.useCallback)(async n=>{if(h){if(S){d(!0);try{if(!(await fetch(`${u}/api/projects/${t}/tickets/${e.id}/children`,{method:`DELETE`})).ok){b.error(a(`smash.couldNotDeleteChildren`)),d(!1);return}}catch(e){b.error(a(`smash.deleteFailed`,{message:e.message})),d(!1);return}}await C(n)}},[S,C,t,e.id,a,h]);return!v&&!y?null:o?(0,X.jsx)(`div`,{className:`flex flex-col gap-2`,"data-testid":`smash-actions-streaming`,children:(0,X.jsx)(Fr,{stage:o.stage})}):(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(U,{size:`sm`,variant:`outline`,onClick:()=>c(!0),className:`border-accent-highlight/40 text-accent-highlight hover:bg-accent-highlight/10`,"data-testid":y?`resmash-button`:`smash-button`,children:[(0,X.jsx)(Ye,{className:`w-3.5 h-3.5 mr-1.5`}),a(y?`smash.reSmashButton`:`smash.smashButton`)]}),(0,X.jsx)(Lr,{open:s,ticketTitle:e.title,isReSmash:S,childrenCount:i,submitting:l,onCancel:()=>c(!1),onConfirm:w})]})}function Vr({epic:e,childExecutionOrder:t,totalChildren:n,onOpenEpic:r}){let{t:i}=g(`activity`);return(0,X.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border border-accent-secondary/30 bg-accent-secondary/10 px-3 py-1.5 text-xs`,"data-testid":`epic-breadcrumb`,children:[(0,X.jsxs)(`button`,{type:`button`,onClick:r,className:`text-accent-secondary hover:underline font-medium`,children:[`← `,e.title]}),t!=null&&n>0&&(0,X.jsx)(`span`,{className:`text-foreground/60`,children:i(`epicChildren.step`,{order:t,total:n})})]})}var Hr={critical:`bg-red-400`,high:`bg-orange-400`,medium:`bg-yellow-400`,low:`bg-slate-400`};function Ur(e){return e?Hr[e]:`bg-muted`}function Wr(e){return[...e].sort((e,t)=>{let n=e.execution_order??1/0,r=t.execution_order??1/0;return n===r?e.id-t.id:n-r})}function Gr({ticket:e,allTickets:t,onOpenTicket:n}){let{t:r}=g(`activity`),i=e.is_epic===!0,a=e.parent_epic_id!=null;if(!i&&!a)return null;if(i){let i=Wr(t.filter(t=>t.parent_epic_id===e.id));return(0,X.jsx)(Kr,{header:r(`family.subSpecsHeader`,{count:i.length}),rows:i,currentId:e.id,onOpenTicket:n,emptyMessage:r(`family.emptySubSpecs`)})}let o=t.find(t=>t.id===e.parent_epic_id)??null,s=Wr(t.filter(t=>t.parent_epic_id===e.parent_epic_id)),c=o?[o,...s]:s;return(0,X.jsx)(Kr,{header:r(`family.familyHeader`,{count:s.length}),rows:c,currentId:e.id,onOpenTicket:n,emptyMessage:r(`family.noSiblings`)})}function Kr({header:e,rows:t,currentId:n,onOpenTicket:r,emptyMessage:i}){let{t:a}=g(`activity`);return(0,X.jsxs)(`div`,{"data-testid":`epic-family-sidebar`,children:[(0,X.jsxs)(`div`,{className:`flex items-center gap-1.5 mb-1.5`,children:[(0,X.jsx)(Ye,{className:`w-3 h-3 text-accent-highlight`,"aria-hidden":!0}),(0,X.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider`,children:e})]}),t.length===0?(0,X.jsx)(`p`,{className:`text-[10px] text-foreground/50 italic`,children:i}):(0,X.jsx)(`ul`,{className:`flex flex-col gap-0.5`,children:t.map(e=>{let t=e.id===n,i=e.is_epic===!0;return(0,X.jsx)(`li`,{children:(0,X.jsxs)(`button`,{type:`button`,onClick:()=>{t||r(e.id)},disabled:t,"aria-label":a(i?`family.openParentEpic`:`family.openSubSpec`,{title:e.title}),"aria-current":t?`page`:void 0,className:[`w-full flex items-center gap-1.5 rounded px-1.5 py-1 text-left transition-colors`,t?`bg-accent-highlight/15 cursor-default`:`hover:bg-muted/30 cursor-pointer`].join(` `),"data-testid":`epic-family-row-${e.id}`,children:[i?(0,X.jsx)(D,{className:`w-3 h-3 text-accent-highlight flex-shrink-0`,"aria-hidden":!0}):(0,X.jsx)(`span`,{className:`text-[9px] tabular-nums text-foreground/40 w-3 text-center flex-shrink-0`,children:e.execution_order??`–`}),(0,X.jsx)(`span`,{className:`inline-block w-1.5 h-1.5 rounded-full flex-shrink-0 ${Ur(e.priority)}`,"aria-hidden":!0}),(0,X.jsx)(`span`,{className:`text-[11px] truncate ${t?`text-foreground font-medium`:`text-foreground/80`}`,title:e.title,children:e.title})]})},e.id)})})]})}var qr=224,Jr=8,Yr=8;function Xr({rails:e,onMoveToRail:t,onClose:n,anchorRect:r}){let{t:i}=g(`tickets`),a=(0,J.useRef)(null),[o,s]=(0,J.useState)(!1);(0,J.useLayoutEffect)(()=>{let e=requestAnimationFrame(()=>s(!0));return()=>cancelAnimationFrame(e)},[]),(0,J.useEffect)(()=>{function e(e){a.current&&(a.current.contains(e.target)||n())}function t(e){e.key===`Escape`&&n()}return document.addEventListener(`pointerdown`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`pointerdown`,e),document.removeEventListener(`keydown`,t)}},[n]);let{top:c,left:l,caretLeft:u}=(0,J.useMemo)(()=>{let e=r.left+r.width/2,t=e-qr/2,n=window.innerWidth-qr-Jr,i=Math.max(Jr,Math.min(n,t)),a=e-i,o=Math.max(12,Math.min(qr-12,a));return{top:r.bottom+Yr,left:i,caretLeft:o}},[r]);return(0,X.jsxs)(`div`,{ref:a,role:`dialog`,"aria-label":i(`rail.popoverTitle`),"data-testid":`move-to-rail-popover`,style:{top:c,left:l,width:qr,opacity:+!!o,transform:o?`translateY(0) scale(1)`:`translateY(-4px) scale(0.97)`,transformOrigin:`${u}px top`,transition:`opacity 140ms ease-out, transform 160ms cubic-bezier(0.2, 0.9, 0.3, 1)`},className:`fixed z-50 rounded-xl border border-border/60 bg-card/95 backdrop-blur shadow-xl shadow-black/40 p-1`,children:[(0,X.jsx)(`div`,{"aria-hidden":!0,className:`absolute w-2 h-2 rotate-45 bg-card/95 border-l border-t border-border/60`,style:{top:-5,left:u-4}}),(0,X.jsx)(`div`,{className:`px-2 py-1.5 text-[10px] uppercase tracking-wider text-muted-foreground/70 font-medium`,children:i(`rail.popoverTitle`)}),e.length===0?(0,X.jsx)(`div`,{className:`px-2 py-2 text-xs text-muted-foreground`,children:i(`rail.noRails`)}):(0,X.jsx)(`ul`,{className:`flex flex-col`,children:e.map(e=>(0,X.jsx)(`li`,{children:(0,X.jsxs)(`button`,{type:`button`,onClick:()=>{t(e.id),n()},className:`w-full flex items-center gap-2 px-2 py-1.5 rounded-lg text-left text-sm hover:bg-accent-info/10 hover:text-accent-info transition-colors`,children:[e.status===`running`?(0,X.jsx)(te,{className:`w-3 h-3 text-accent-success animate-pulse shrink-0`,"aria-hidden":!0}):(0,X.jsx)(Le,{className:`w-3 h-3 text-muted-foreground/60 shrink-0`,"aria-hidden":!0}),(0,X.jsx)(`span`,{className:`flex-1 truncate`,children:e.label}),(0,X.jsx)(Ie,{className:`w-3.5 h-3.5 text-muted-foreground/40 shrink-0`,"aria-hidden":!0})]})},e.id))})]})}var Zr=900,Qr=.2,$r=[`todo`,`in_progress`,`done`,`cancelled`],ei={draft:`ticketStatus.draft`,todo:`ticketStatus.todo`,in_progress:`ticketStatus.inProgress`,on_review:`ticketStatus.onReview`,done:`ticketStatus.done`,cancelled:`ticketStatus.cancelled`},ti=[{value:`critical`,labelKey:`priority.critical`,className:`text-red-400`},{value:`high`,labelKey:`priority.high`,className:`text-orange-400`},{value:`medium`,labelKey:`priority.medium`,className:`text-yellow-400`},{value:`low`,labelKey:`priority.low`,className:`text-slate-400`}];function ni(e){return e.jira_epic_key&&e.jira_url?e.jira_url.replace(/\/browse\/[^/]+$/,`/browse/${e.jira_epic_key}`):null}var ri={manual:`source.manual`,"product-backlog":`source.productBacklog`,"propose-spec":`source.proposeSpec`,"get-backlog-specs":`source.getBacklogSpecs`,"free-prompt":`source.freePrompt`};function ii({ticket:e,allLabels:t,allTickets:n,onClose:r,onOpenTicket:i,onSave:a,onDelete:o,rails:s,onMoveToRail:c,onRemoveFromRail:l,embedded:u=!1}){let{t:d}=g(`tickets`),{t:f}=g(`jira`),{activeProjectId:p,projects:m}=y(),{enterSplit:_,state:v}=Di(),S=v.originSide!==null,w=m.find(e=>e.id===p)?.provider,T=x(w),D=(0,J.useMemo)(()=>(n??[]).filter(t=>t.parent_epic_id===e.id),[n,e.id]),O=(0,J.useMemo)(()=>e.parent_epic_id==null?null:(n??[]).find(t=>t.id===e.parent_epic_id)??null,[n,e.parent_epic_id]),k=(0,J.useMemo)(()=>O?(n??[]).filter(e=>e.parent_epic_id===O.id).length:0,[n,O]),[j,M]=(0,J.useState)(e.title),[N,te]=(0,J.useState)(e.description),[F,L]=(0,J.useState)(e.priority??`medium`),[R,re]=(0,J.useState)([...e.labels??[]]),[z,V]=(0,J.useState)(e.repositoryIds),[pe,me]=(0,J.useState)(!1),[H,_e]=(0,J.useState)(!1),[W,ye]=(0,J.useState)(``),[be,xe]=(0,J.useState)(!1),[Se,Ce]=(0,J.useState)(!1),[we,Te]=(0,J.useState)(!1),[Ee,De]=(0,J.useState)(!1),[Oe,ke]=(0,J.useState)(!1),[G,Ae]=(0,J.useState)(!1),je=en(),Me=je.connected&&!!je.discardStatus&&e.source===`jira`&&!!e.jira_key,Ne=je.connected&&e.source===`jira`&&!!e.jira_key,[Fe,Ie]=(0,J.useState)(e.attachments??[]);(0,J.useEffect)(()=>{Ie(e.attachments??[])},[e.attachments,e.id]);let[Le,ze]=(0,J.useState)(!1),[Be,Ve]=(0,J.useState)(null);(0,J.useEffect)(()=>{if(!Ne)return;let e=!0;return he.listStatuses().then(t=>{e&&Ve(t.statuses)}).catch(()=>{e&&Ve([])}),()=>{e=!1}},[Ne,e.id]);let K=e.jira_status??``,He=async t=>{if(t!==e.status){ze(!0);try{await a(e.id,{status:t})}finally{ze(!1)}}},Ue=async t=>{if(!(!t||t===K)){ze(!0);try{await he.moveSpecToStatus(e.id,t),b.success(f(`moveToStatus.queued`,{status:t}))}catch{b.error(f(`moveToStatus.failed`))}finally{ze(!1)}}},We=(0,J.useRef)(null),Ge=(0,J.useRef)(null),Ke=(0,J.useRef)(null),qe=(0,J.useMemo)(()=>j!==e.title||N!==e.description||F!==e.priority||JSON.stringify(R)!==JSON.stringify(e.labels)||JSON.stringify(z)!==JSON.stringify(e.repositoryIds),[j,N,F,R,z,e]);(0,J.useEffect)(()=>{pe&&We.current?.focus()},[pe]),(0,J.useEffect)(()=>{if(H){let e=Ge.current;e&&(e.focus(),e.selectionStart=e.value.length)}},[H]),(0,J.useEffect)(()=>{be&&Ke.current?.focus()},[be]),(0,J.useEffect)(()=>{function e(e){e.key===`Escape`&&!pe&&!H&&!Se&&r()}return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[r,pe,H,Se]);let Je=(0,J.useMemo)(()=>{if(!W.trim())return[];let e=W.toLowerCase();return t.filter(t=>t.toLowerCase().includes(e)&&!R.includes(t)).slice(0,5)},[W,t,R]),Ye=(0,J.useCallback)(e=>{let t=e.trim();t&&!R.includes(t)&&re(e=>[...e,t]),ye(``)},[R]),Xe=(0,J.useCallback)(e=>{re(t=>t.filter(t=>t!==e))},[]),Ze=(0,J.useCallback)(async()=>{let t={};if(j!==e.title&&(t.title=j),N!==e.description&&(t.description=N),F!==e.priority&&(t.priority=F),JSON.stringify(R)!==JSON.stringify(e.labels)&&(t.labels=R),JSON.stringify(z)!==JSON.stringify(e.repositoryIds)&&(t.repositoryIds=z),Object.keys(t).length===0){r();return}ke(!0);let n=await a(e.id,t);ke(!1),n?(b.success(d(`detailModal.toast.updated`)),r()):b.error(d(`detailModal.toast.updateFailed`))},[j,N,F,R,z,e,a,r,d]),Qe=(0,J.useCallback)(async()=>{if(G)return;Ae(!0);let t=!1;try{t=await o(e.id)}catch{t=!1}if(Ae(!1),!t){b.error(d(`detailModal.toast.deleteFailed`));return}Ce(!1),r()},[G,e.id,o,r,d]),[$e,et]=(0,J.useState)(0),q=(0,J.useRef)(null),[tt,nt]=(0,J.useState)(()=>typeof window<`u`&&window.innerWidth>=Zr);(0,J.useEffect)(()=>{if(typeof window>`u`)return;let e=()=>nt(window.innerWidth>=Zr);return e(),window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]);let rt=!u&&!S&&tt,it=(0,J.useCallback)(e=>{q.current&&et(e.clientX-q.current.startX)},[]),Y=(0,J.useCallback)(t=>{if(!q.current)return;let n=t.clientX-q.current.startX,i=window.innerWidth*Qr;if(window.removeEventListener(`pointermove`,it),window.removeEventListener(`pointerup`,Y),window.removeEventListener(`pointercancel`,Y),q.current=null,et(0),Math.abs(n)>=i&&window.innerWidth>=Zr){let t=v.leftId===e.id;_(n<0?`left`:`right`,e.id),t||r()}},[_,it,v.leftId,e.id,r]),at=(0,J.useCallback)(e=>{rt&&e.button===0&&(e.target.closest(`button, input, textarea, select, [contenteditable="true"]`)||(q.current={startX:e.clientX,pointerId:e.pointerId},window.addEventListener(`pointermove`,it),window.addEventListener(`pointerup`,Y),window.addEventListener(`pointercancel`,Y)))},[rt,it,Y]);(0,J.useEffect)(()=>()=>{q.current&&(window.removeEventListener(`pointermove`,it),window.removeEventListener(`pointerup`,Y),window.removeEventListener(`pointercancel`,Y))},[it,Y]);let ot=(0,J.useCallback)(()=>{if(!rt||window.innerWidth<Zr)return;let t=v.leftId===e.id;_(`right`,e.id),t||r()},[rt,_,v.leftId,e.id,r]),{panelRef:st,panelStyle:ct,resizeHandles:lt,guardBackdrop:ut}=ae({enabled:!u,allowMove:!1}),dt=(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(`div`,{ref:st,className:u?`relative w-full h-full rounded-xl bg-card border border-border/40 shadow-2xl shadow-black/50 flex flex-col overflow-hidden`:`relative w-full max-w-[67rem] m-4 rounded-xl bg-card border border-border/40 shadow-2xl shadow-black/50 flex flex-col animate-in fade-in zoom-in-95 duration-200 h-[90vh] max-h-[calc(100%-2rem)]`,style:{...$e===0?{transition:`transform 220ms cubic-bezier(0.34, 1.56, 0.64, 1)`}:{transform:`translateX(${$e}px)`,transition:`none`},...ct},children:[O&&(0,X.jsx)(`div`,{className:`px-5 pt-3`,children:(0,X.jsx)(Vr,{epic:O,childExecutionOrder:e.execution_order??null,totalChildren:k,onOpenEpic:()=>i?.(O.id)})}),(0,X.jsxs)(`div`,{className:`flex items-start justify-between gap-3 px-5 py-4 border-b border-border/30 ${rt?`cursor-grab active:cursor-grabbing`:``}`,onPointerDown:at,"data-testid":`ticket-modal-header`,children:[(0,X.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[pe?(0,X.jsx)(`input`,{ref:We,value:j,onChange:e=>M(e.target.value),onBlur:()=>me(!1),onKeyDown:t=>{t.key===`Enter`&&me(!1),t.key===`Escape`&&(M(e.title),me(!1))},className:`w-full bg-transparent border-b border-accent-primary/50 text-sm font-semibold text-foreground outline-none pb-0.5`}):(0,X.jsxs)(`button`,{type:`button`,onClick:()=>me(!0),className:`group flex items-center gap-1.5 text-left w-full`,children:[(0,X.jsx)(`h2`,{className:`text-sm font-semibold text-foreground truncate`,children:j||d(`untitled`)}),(0,X.jsx)(P,{className:`w-3 h-3 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity shrink-0`})]}),(0,X.jsxs)(`div`,{className:`flex items-center gap-2 mt-1.5`,children:[(0,X.jsxs)(`span`,{className:`text-[10px] text-foreground font-mono`,children:[`#`,e.id]}),e.status===`on_review`&&(0,X.jsx)(`span`,{title:d(`specs:status.onReviewHint`),"data-testid":`ticket-modal-on-review-badge`,children:(0,X.jsx)($t,{status:`on_review`})})]}),(0,X.jsx)(Xt,{ticketId:e.id})]}),p&&(0,X.jsx)(`div`,{className:`shrink-0`,children:(0,X.jsx)(Br,{ticket:e,projectId:p,provider:w,featureFlagOn:T,childrenCount:D.length})}),(0,X.jsx)(oi,{ticket:e,title:j,description:N,priority:F,labels:R,repositoryIds:z,onClose:r}),s&&(c||l)&&(0,X.jsx)(si,{ticket:e,rails:s,onMoveToRail:c,onRemoveFromRail:l}),rt&&(0,X.jsxs)(U,{variant:`outline`,size:`sm`,className:`shrink-0 mr-1 gap-1.5`,"data-testid":`ticket-modal-compare`,onClick:ot,title:d(`detailModal.compareTooltip`),children:[(0,X.jsx)(Re,{className:`w-3.5 h-3.5`}),d(`detailModal.compare`)]}),(0,X.jsx)(`button`,{onClick:r,className:`h-7 w-7 flex items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-surface/50 transition-colors cursor-pointer shrink-0`,"data-testid":`ticket-modal-close`,children:(0,X.jsx)(ie,{className:`w-4 h-4`})})]}),(0,X.jsx)(`div`,{className:`flex-1 overflow-y-auto min-h-0`,children:(0,X.jsxs)(`div`,{className:`flex flex-col sm:flex-row h-full`,children:[(0,X.jsxs)(`div`,{className:`flex-1 min-w-0 px-5 py-4 space-y-4 flex flex-col`,children:[(0,X.jsxs)(`div`,{className:`flex-1 flex flex-col`,children:[(0,X.jsxs)(`div`,{className:`flex items-center justify-between mb-1.5`,children:[(0,X.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider flex items-center gap-1.5`,children:d(`fields.description`)}),!H&&(0,X.jsxs)(`button`,{type:`button`,onClick:()=>_e(!0),className:`text-[10px] text-muted-foreground hover:text-foreground transition-colors flex items-center gap-1`,children:[(0,X.jsx)(P,{className:`w-2.5 h-2.5`}),d(`common:actions.edit`)]})]}),H?(0,X.jsxs)(`div`,{className:`space-y-1.5 flex-1 flex flex-col`,children:[(0,X.jsx)(`textarea`,{ref:Ge,value:N,onChange:e=>te(e.target.value),className:`w-full flex-1 rounded-lg border border-border bg-input px-3 py-2 text-xs text-foreground placeholder:text-muted-foreground resize-none min-h-[300px]`,placeholder:d(`fields.markdownPlaceholder`)}),(0,X.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,X.jsx)(U,{variant:`ghost`,size:`sm`,className:`h-6 text-[10px]`,onClick:()=>_e(!1),children:d(`detailModal.doneEditing`)}),(0,X.jsx)(`span`,{className:`text-[9px] text-muted-foreground`,children:d(`fields.supportsMarkdown`)})]})]}):N?(0,X.jsx)(di,{description:N,onEdit:()=>_e(!0)}):(0,X.jsx)(`button`,{type:`button`,onClick:()=>_e(!0),className:`w-full rounded-lg border border-dashed border-border/40 bg-muted/10 px-3 py-4 text-xs text-muted-foreground hover:text-foreground hover:bg-muted/20 transition-colors text-center`,children:d(`detailModal.addDescription`)})]}),(0,X.jsx)(Kt,{ticketKey:e.id,attachments:Fe,onChange:Ie}),(0,X.jsx)(qt,{ticketId:e.id,onClose:r}),e.prerequisites&&e.prerequisites.length>0&&(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-1.5`,children:d(`detailModal.prerequisites`)}),(0,X.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:e.prerequisites.map(e=>(0,X.jsxs)(`span`,{className:`inline-flex items-center rounded px-1.5 py-0.5 text-[10px] font-mono bg-accent/60 text-foreground/70`,children:[`#`,e]},e))})]})]}),(0,X.jsxs)(`div`,{className:`sm:w-56 sm:border-l border-t sm:border-t-0 border-border/30 px-4 py-4 space-y-4 bg-muted/5`,children:[e.jira_url&&e.jira_key&&(0,X.jsxs)(`button`,{type:`button`,onClick:()=>{ve(e.jira_url)},"data-testid":`jira-go-to-ticket`,className:`w-full inline-flex items-center justify-center gap-1.5 h-7 rounded border border-accent-info/50 bg-accent-info/10 px-2 text-xs font-medium text-accent-info hover:bg-accent-info/20 transition-colors`,children:[(0,X.jsx)(E,{className:`w-3.5 h-3.5 shrink-0`}),f(`detail.goToTicket`,{key:e.jira_key})]}),e.jira_epic_key&&(0,X.jsxs)(`div`,{"data-testid":`jira-epic`,children:[(0,X.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-1.5`,children:f(`detail.epic`)}),(0,X.jsxs)(`button`,{type:`button`,onClick:()=>{let t=ni(e);t&&ve(t)},title:e.jira_epic_name??e.jira_epic_key,className:`w-full inline-flex items-center gap-1.5 rounded border border-accent-highlight/40 bg-accent-highlight/5 px-2 py-1.5 text-left text-xs hover:bg-accent-highlight/10 transition-colors`,children:[(0,X.jsx)(`span`,{className:`font-mono text-accent-highlight shrink-0`,children:e.jira_epic_key}),e.jira_epic_name&&(0,X.jsx)(`span`,{className:`truncate text-foreground/80`,children:e.jira_epic_name})]})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-1.5`,children:d(`fields.status`)}),Ne?(0,X.jsx)(`select`,{value:K,disabled:Le||Be===null,onChange:e=>{Ue(e.target.value)},className:`w-full h-7 rounded border border-border bg-input px-2 text-xs text-foreground disabled:opacity-60`,"data-testid":`ticket-jira-status-select`,children:Be===null?(0,X.jsx)(`option`,{value:K,children:K||d(`states.loading`,{ns:`common`})}):(0,X.jsxs)(X.Fragment,{children:[K&&!Be.some(e=>e.name===K)&&(0,X.jsx)(`option`,{value:K,children:K}),Be.map(e=>(0,X.jsx)(`option`,{value:e.name,children:e.name},e.name))]})}):(0,X.jsxs)(`select`,{value:e.status,disabled:Le,onChange:e=>{He(e.target.value)},className:`w-full h-7 rounded border border-border bg-input px-2 text-xs text-foreground disabled:opacity-60`,"data-testid":`ticket-status-select`,children:[!$r.includes(e.status)&&(0,X.jsx)(`option`,{value:e.status,children:d(ei[e.status],{ns:`tickets`})}),$r.map(e=>(0,X.jsx)(`option`,{value:e,children:d(ei[e],{ns:`tickets`})},e))]})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-1.5`,children:d(`fields.priority`)}),(0,X.jsx)(`select`,{value:F,onChange:e=>L(e.target.value),className:`w-full h-7 rounded border border-border bg-input px-2 text-xs text-foreground`,children:ti.map(e=>(0,X.jsx)(`option`,{value:e.value,children:d(e.labelKey)},e.value))})]}),(0,X.jsx)(ge,{value:z,onChange:V,disabled:Oe}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-1.5`,children:d(`fields.labels`)}),(0,X.jsx)(`div`,{className:`flex flex-wrap gap-1 mb-1.5`,children:R.map(e=>(0,X.jsxs)(`span`,{className:`inline-flex items-center gap-0.5 rounded px-1.5 py-0.5 text-[10px] font-medium bg-accent/60 text-foreground/70 group`,children:[e,(0,X.jsx)(`button`,{type:`button`,onClick:()=>Xe(e),className:`text-muted-foreground hover:text-foreground opacity-0 group-hover:opacity-100 transition-opacity`,children:(0,X.jsx)(A,{className:`w-2.5 h-2.5`})})]},e))}),be?(0,X.jsxs)(`div`,{className:`relative`,children:[(0,X.jsx)(`input`,{ref:Ke,value:W,onChange:e=>ye(e.target.value),onKeyDown:e=>{e.key===`Enter`&&W.trim()&&(e.preventDefault(),Ye(W)),e.key===`Escape`&&(xe(!1),ye(``))},onBlur:()=>{W.trim()&&Ye(W),xe(!1),ye(``)},placeholder:d(`detailModal.addLabelPlaceholder`),className:`w-full h-6 rounded border border-border bg-input px-2 text-[10px] text-foreground placeholder:text-muted-foreground`}),Je.length>0&&(0,X.jsx)(`div`,{className:`absolute left-0 right-0 top-full mt-0.5 rounded border border-border/50 bg-popover shadow-lg z-10 py-0.5`,children:Je.map(e=>(0,X.jsx)(`button`,{type:`button`,onMouseDown:t=>{t.preventDefault(),Ye(e)},className:`w-full text-left px-2 py-1 text-[10px] hover:bg-accent/50 text-foreground/80`,children:e},e))})]}):(0,X.jsxs)(`button`,{type:`button`,onClick:()=>xe(!0),className:`flex items-center gap-1 text-[10px] text-muted-foreground hover:text-foreground transition-colors`,children:[(0,X.jsx)(I,{className:`w-2.5 h-2.5`}),d(`detailModal.addLabel`)]})]}),(0,X.jsx)(Gr,{ticket:e,allTickets:n??[],onOpenTicket:e=>i?.(e)}),e.source===`jira`&&e.jira_key&&(0,X.jsx)(an,{localId:e.id}),e.metadata?.effort_level&&(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-0.5`,children:d(`detailModal.effort`)}),(0,X.jsx)(`span`,{className:`text-xs text-foreground/70`,children:e.metadata.effort_level})]}),e.assignee&&(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-0.5`,children:d(`detailModal.assignee`)}),(0,X.jsx)(`span`,{className:`text-xs text-foreground/70`,children:e.assignee})]})]})]})}),(0,X.jsxs)(`div`,{className:`flex items-center justify-between px-5 py-3 border-t border-border/30`,children:[(0,X.jsxs)(`div`,{className:`flex items-center gap-3 text-[10px] text-muted-foreground`,children:[(0,X.jsx)(`span`,{children:d(`meta.createdAgo`,{time:ai(e.created_at)})}),(0,X.jsx)(`span`,{children:d(`meta.updatedAgo`,{time:ai(e.updated_at)})}),e.source&&(0,X.jsx)(`span`,{className:`bg-muted/30 rounded px-1.5 py-0.5`,children:ri[e.source]?d(ri[e.source]):e.source})]}),(0,X.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[Me?(0,X.jsxs)(U,{variant:`ghost`,size:`sm`,className:`h-7 text-xs text-accent-info hover:bg-accent-info/10`,onClick:()=>Te(!0),"data-testid":`jira-move-to-button`,children:[(0,X.jsx)(Pe,{className:`w-3 h-3 mr-1`}),f(`discard.moveButton`,{status:je.discardStatus})]}):(0,X.jsxs)(U,{variant:`ghost`,size:`sm`,className:`h-7 text-xs text-red-400 aurora-light:text-destructive hover:text-red-300 aurora-light:hover:text-destructive hover:bg-red-500/10 aurora-light:hover:bg-destructive/10`,onClick:()=>Ce(!0),children:[(0,X.jsx)(ne,{className:`w-3 h-3 mr-1`}),d(`common:actions.delete`)]}),qe&&(0,X.jsxs)(U,{size:`sm`,className:`h-7 text-xs`,onClick:()=>{Ne?De(!0):Ze()},disabled:Oe||!j.trim(),children:[(0,X.jsx)(C,{className:`w-3 h-3 mr-1`}),d(Oe?`common:states.saving`:`common:actions.save`)]})]})]})]}),(0,X.jsx)(fe,{open:Se,onOpenChange:e=>{G||Ce(e)},children:(0,X.jsxs)(de,{className:`max-w-sm`,children:[(0,X.jsxs)(ue,{children:[(0,X.jsx)(le,{children:d(`deleteDialog.title`)}),(0,X.jsx)(se,{children:(0,X.jsx)(h,{t:d,i18nKey:`deleteDialog.body`,values:{id:e.id,title:e.title},components:{strong:(0,X.jsx)(`span`,{className:`font-semibold text-foreground`})}})})]}),(0,X.jsxs)(B,{children:[(0,X.jsx)(U,{variant:`outline`,size:`sm`,onClick:()=>Ce(!1),disabled:G,children:d(`common:actions.cancel`)}),(0,X.jsxs)(U,{variant:`destructive`,size:`sm`,onClick:()=>{Qe()},disabled:G,"aria-busy":G,children:[G?(0,X.jsx)(ee,{className:`w-3.5 h-3.5 mr-1.5 animate-spin`}):(0,X.jsx)(ne,{className:`w-3.5 h-3.5 mr-1.5`}),d(`common:actions.delete`)]})]})]})}),Me&&je.discardStatus&&(0,X.jsx)(tn,{open:we,onOpenChange:Te,ticket:{id:e.id,title:e.title,jira_key:e.jira_key},discardStatus:je.discardStatus,onDiscarded:r}),(0,X.jsx)(fe,{open:Ee,onOpenChange:De,children:(0,X.jsxs)(de,{className:`max-w-md`,"data-testid":`jira-save-confirm`,children:[(0,X.jsxs)(ue,{children:[(0,X.jsx)(le,{children:f(`detail.saveTitle`)}),(0,X.jsx)(se,{children:f(`detail.saveBody`,{key:e.jira_key??`#${e.id}`})})]}),(0,X.jsxs)(B,{children:[(0,X.jsx)(U,{variant:`outline`,size:`sm`,onClick:()=>De(!1),children:d(`common:actions.cancel`)}),(0,X.jsxs)(U,{size:`sm`,onClick:()=>{De(!1),Ze()},disabled:Oe,"data-testid":`jira-save-confirm-btn`,children:[(0,X.jsx)(C,{className:`w-3.5 h-3.5 mr-1.5`}),f(`detail.saveConfirm`)]})]})]})})]});return u?dt:(0,lr.createPortal)((0,X.jsxs)(`div`,{style:oe(),className:`fixed inset-0 z-[68] flex items-center justify-center`,children:[(0,X.jsx)(`div`,{className:`absolute inset-0 bg-black/70`,onClick:ut(r)}),dt,(0,X.jsx)(ce,{handles:lt})]}),document.body)}function ai(e){try{return H(new Date(e),{addSuffix:!0,locale:d()})}catch{return e}}function oi({ticket:e,title:t,description:n,priority:r,labels:i,repositoryIds:a,onClose:o}){let{t:s}=g(`tickets`),{triggerResume:c}=O(),{activeProjectId:l}=y(),{closeTicketDetail:u}=Di();return ln(e)?(0,X.jsxs)(U,{variant:`default`,size:`sm`,onClick:()=>{if(!l)return;let{body:d,criteria:f}=sn(n);c({kind:`explore-spec`,projectId:l,label:t||e.title||s(`detailModal.ticketFallbackLabel`,{id:e.id}),restoreRoute:`/`,params:{initialIdea:``,pendingSpecId:un(),initialAttachmentIds:[],resumeConversationId:e.origin_conversation_id??void 0,editTicket:{id:e.id,title:t,description:d,labels:i,priority:r,repositoryIds:a,acceptanceCriteria:f,status:e.status}}}),u(),o()},className:`shrink-0 mr-2`,"data-testid":`continue-editing`,children:[(0,X.jsx)(Ge,{className:`w-3.5 h-3.5 mr-1.5`}),s(`detailModal.continueEditing`)]}):null}function si({ticket:e,rails:t,onMoveToRail:n,onRemoveFromRail:r}){let{t:i}=g(`tickets`),[a,o]=(0,J.useState)(null),s=(0,J.useRef)(null),c=t.find(t=>t.ticketIds.includes(e.id));return c?r?(0,X.jsxs)(U,{variant:`outline`,size:`sm`,className:`shrink-0 mr-2 gap-1.5 border-accent-warning/30 text-accent-warning hover:bg-accent-warning/10 hover:text-accent-warning`,"data-testid":`modal-remove-from-rail`,onClick:()=>r(e.id),title:i(`rail.currentlyOn`,{rail:c.label}),children:[(0,X.jsx)(S,{className:`w-3.5 h-3.5`,"aria-hidden":!0}),i(`rail.removeFromRail`)]}):null:n?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(U,{ref:s,variant:`outline`,size:`sm`,className:`shrink-0 mr-2 gap-1.5 border-accent-info/30 text-accent-info hover:bg-accent-info/10 hover:text-accent-info`,"data-testid":`modal-move-to-rail`,onClick:()=>{s.current&&o(s.current.getBoundingClientRect())},children:[i(`rail.moveToRail`),(0,X.jsx)(Pe,{className:`w-3.5 h-3.5`,"aria-hidden":!0})]}),a&&(0,X.jsx)(Xr,{rails:t,anchorRect:a,onMoveToRail:t=>n(e.id,t),onClose:()=>o(null)})]}):null}var ci=`
9
+
10
+ ---
11
+
12
+ ## Contract Layer
13
+
14
+ `;function li(e){let t=e.indexOf(ci);return t<0?{user:e,contract:null}:{user:e.slice(0,t),contract:e.slice(t+26)}}function ui(e){let t=[`### Naming Contract`,`### Data Shapes`,`### State Machine`,`### Invariants`,`### File Touch List`],n=0;for(let r of t){let t=e.indexOf(r);if(t<0)continue;let i=e.slice(t+r.length),a=i.indexOf(`N/A — model did not produce items`),o=i.indexOf(`### `);a>=0&&(o<0||a<o)||n++}return n}function di({description:e,onEdit:t}){let{t:n}=g(`tickets`),{openWebView:r}=Tr(),{user:i,contract:a}=li(e),o=i||e,s=(0,J.useMemo)(()=>({a:({href:e,children:t})=>(0,X.jsx)(`a`,{href:e,target:`_blank`,rel:`noreferrer`,onClick:t=>{typeof e==`string`&&/^https?:\/\//i.test(e)&&(t.preventDefault(),t.stopPropagation(),r(e))},children:t})}),[r]);return(0,X.jsxs)(`div`,{className:`flex-1 rounded-lg bg-muted/20 px-3 py-2 overflow-y-auto transition-colors`,onClick:e=>{e.target.closest(`details, summary`)||t()},role:`button`,style:{cursor:`pointer`},children:[(0,X.jsx)(`div`,{className:`prose prose-invert prose-xs max-w-none prose-p:my-1 prose-headings:mt-2 prose-headings:mb-1 prose-headings:text-sm prose-headings:font-semibold prose-ul:my-1 prose-ol:my-1 prose-li:my-0 prose-code:text-cyan-300 prose-code:text-[10px] prose-code:bg-muted/40 prose-code:px-1 prose-code:py-0.5 prose-code:rounded text-foreground/80 text-xs`,children:(0,X.jsx)(pe,{remarkPlugins:[me],components:s,children:o})}),a&&(0,X.jsxs)(`details`,{"data-testid":`contract-layer-disclosure`,className:`mt-3 rounded-md border border-border/40 bg-muted/10 px-2 py-1`,onClick:e=>e.stopPropagation(),children:[(0,X.jsxs)(`summary`,{className:`cursor-pointer text-[10px] font-medium text-foreground/80 select-none flex items-center gap-2`,children:[n(`contractLayer.title`),(0,X.jsx)(`span`,{className:`rounded-full bg-muted/40 px-1.5 text-[9px] text-foreground/60`,children:n(`contractLayer.populated`,{n:ui(a)})})]}),(0,X.jsx)(`div`,{className:`mt-2 prose prose-invert prose-xs max-w-none prose-p:my-1 prose-headings:mt-2 prose-headings:mb-1 prose-headings:text-sm prose-headings:font-semibold prose-ul:my-1 prose-ol:my-1 prose-li:my-0 prose-code:text-cyan-300 prose-code:text-[10px] prose-code:bg-muted/40 prose-code:px-1 prose-code:py-0.5 prose-code:rounded text-foreground/80 text-xs`,children:(0,X.jsx)(pe,{remarkPlugins:[me],components:s,children:a})})]})]})}var fi={critical:`bg-red-500/15 aurora-light:bg-destructive/10 text-red-400 aurora-light:text-destructive border-red-500/30 aurora-light:border-destructive/30`,high:`bg-orange-500/15 aurora-light:bg-accent-warning/10 text-orange-400 aurora-light:text-accent-warning border-orange-500/30 aurora-light:border-accent-warning/30`,medium:``,low:`bg-gray-500/15 aurora-light:bg-muted text-gray-400 aurora-light:text-muted-foreground border-gray-500/30 aurora-light:border-border`};function pi(e){try{return H(new Date(e),{addSuffix:!0,locale:d()})}catch{return e}}function mi({tickets:e,excludeIds:t,onSelect:n}){let{t:r}=g(`tickets`),[i,a]=(0,J.useState)(``),o=(0,J.useMemo)(()=>{let n=new Set(t),r=e.filter(e=>e.status!==`cancelled`&&!n.has(e.id));if(!i.trim())return r;let a=i.toLowerCase();return r.filter(e=>e.title.toLowerCase().includes(a)||e.description.toLowerCase().includes(a))},[e,t,i]);return(0,X.jsxs)(`div`,{"data-testid":`spec-compare-picker`,className:`h-full flex flex-col rounded-xl bg-card border border-border/40 shadow-2xl shadow-black/50 overflow-hidden`,children:[(0,X.jsxs)(`div`,{className:`px-4 py-3 border-b border-border/30 flex items-center gap-2`,children:[(0,X.jsx)(Xe,{className:`w-3.5 h-3.5 text-muted-foreground`}),(0,X.jsx)(`span`,{className:`text-xs font-semibold text-foreground`,children:r(`comparePicker.title`)}),(0,X.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:r(`comparePicker.count`,{n:o.length})})]}),(0,X.jsx)(`div`,{className:`px-4 py-2 border-b border-border/20`,children:(0,X.jsxs)(`div`,{className:`relative`,children:[(0,X.jsx)(L,{className:`absolute left-2 top-1/2 -translate-y-1/2 w-3 h-3 text-muted-foreground`}),(0,X.jsx)(`input`,{type:`text`,value:i,onChange:e=>a(e.target.value),placeholder:r(`comparePicker.searchPlaceholder`),className:`w-full h-7 rounded border border-border bg-input pl-7 pr-2 text-[11px] text-foreground placeholder:text-muted-foreground outline-none focus:border-accent-primary/60`})]})}),(0,X.jsx)(`div`,{className:`flex-1 overflow-y-auto`,"data-testid":`spec-compare-picker-list`,children:o.length===0?(0,X.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full text-center px-4 py-8 gap-2`,children:[(0,X.jsx)(Xe,{className:`w-6 h-6 text-muted-foreground/40`}),(0,X.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:i.trim()?r(`comparePicker.noMatches`):r(`comparePicker.empty`)})]}):(0,X.jsx)(`ul`,{className:`divide-y divide-border/10`,children:o.map(e=>(0,X.jsx)(`li`,{children:(0,X.jsxs)(`button`,{type:`button`,"data-testid":`spec-compare-card-${e.id}`,onClick:()=>n(e.id),className:`w-full text-left px-4 py-2.5 hover:bg-accent/30 transition-colors flex items-start gap-2 group`,children:[(0,X.jsx)(Qt,{status:e.status}),(0,X.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,X.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,X.jsxs)(`span`,{className:`text-[10px] font-mono text-muted-foreground`,children:[`#`,e.id]}),e.priority&&fi[e.priority]&&(0,X.jsx)(`span`,{className:`inline-flex items-center rounded px-1 py-0.5 text-[9px] font-medium border ${fi[e.priority]}`,children:r(`priority.${e.priority}`)})]}),(0,X.jsx)(`p`,{className:`mt-0.5 text-xs text-foreground truncate group-hover:text-accent-primary transition-colors`,children:e.title||r(`untitled`)}),e.description&&(0,X.jsx)(`p`,{className:`mt-0.5 text-[10px] text-muted-foreground line-clamp-1`,children:e.description.slice(0,120)}),e.labels&&e.labels.length>0&&(0,X.jsxs)(`div`,{className:`mt-1 flex flex-wrap gap-1`,children:[e.labels.slice(0,3).map(e=>(0,X.jsx)(`span`,{className:`inline-flex items-center rounded px-1 py-0.5 text-[9px] bg-accent/40 text-foreground/60`,children:e},e)),e.labels.length>3&&(0,X.jsxs)(`span`,{className:`text-[9px] text-muted-foreground`,children:[`+`,e.labels.length-3]})]}),(0,X.jsx)(`p`,{className:`mt-1 text-[9px] text-muted-foreground`,children:r(`meta.updatedAgo`,{time:pi(e.updated_at)})})]})]})},e.id))})})]})}var hi=.25,gi=.75;function _i({state:e,leftTicket:t,rightTicket:n,allTickets:r,allLabels:i,onSave:a,onDelete:o,onOpenTicket:s,onCloseAll:c,onSetCompared:l,onSetRatio:u,onExitSplit:d}){let f=(0,J.useRef)(null),p=(0,J.useRef)(null),[m,h]=(0,J.useState)(!0);(0,J.useEffect)(()=>{let e=setTimeout(()=>h(!1),320);return()=>clearTimeout(e)},[]);let g=(0,J.useCallback)(e=>{if(!p.current)return;let t=window.innerWidth,n=e.clientX/t;u(Math.min(gi,Math.max(hi,n)))},[u]),_=(0,J.useCallback)(e=>{if(!p.current)return;let{pointerId:t,element:n}=p.current;try{n.releasePointerCapture(t)}catch{}p.current=null,window.removeEventListener(`pointermove`,g),window.removeEventListener(`pointerup`,_),window.removeEventListener(`pointercancel`,_)},[g]),v=(0,J.useCallback)(e=>{let t=e.currentTarget;try{t.setPointerCapture(e.pointerId)}catch{}p.current={pointerId:e.pointerId,element:t},window.addEventListener(`pointermove`,g),window.addEventListener(`pointerup`,_),window.addEventListener(`pointercancel`,_)},[g,_]);(0,J.useEffect)(()=>()=>{window.removeEventListener(`pointermove`,g),window.removeEventListener(`pointerup`,_),window.removeEventListener(`pointercancel`,_);let e=p.current;if(e){try{e.element.releasePointerCapture(e.pointerId)}catch{}p.current=null}},[g,_]);let y=(0,J.useCallback)(t=>{let n=.04;t.key===`ArrowLeft`?(t.preventDefault(),u(Math.max(hi,e.splitRatio-n))):t.key===`ArrowRight`?(t.preventDefault(),u(Math.min(gi,e.splitRatio+n))):t.key===`Home`?(t.preventDefault(),u(hi)):t.key===`End`?(t.preventDefault(),u(gi)):t.key===`0`&&(t.preventDefault(),u(.5))},[u,e.splitRatio]),b=e=>{e.target===e.currentTarget&&c()},x=u=>{let d=u===e.originSide,f=u===`left`?t:n;return f?(0,X.jsx)(ii,{ticket:f,allLabels:i,allTickets:r,onClose:d?c:()=>l(null,u),onOpenTicket:s,onSave:a,onDelete:o,embedded:!0},`${u}-${f.id}`):(0,X.jsx)(mi,{tickets:r,excludeIds:[t?.id,n?.id].filter(e=>e!=null),onSelect:e=>l(e,u)})},S=(e.splitRatio*100).toFixed(2),C=((1-e.splitRatio)*100).toFixed(2);return(0,lr.createPortal)((0,X.jsxs)(`div`,{ref:f,"data-testid":`split-view-shell`,style:oe(),className:`fixed inset-0 z-[68] flex`,onClick:b,children:[(0,X.jsx)(`div`,{className:`absolute inset-0 bg-black/70 pointer-events-none`,"aria-hidden":!0}),(0,X.jsxs)(`div`,{className:`relative flex w-full h-full`,style:{transition:m?`opacity 280ms cubic-bezier(0.34, 1.56, 0.64, 1)`:void 0},children:[(0,X.jsx)(`div`,{"data-testid":`split-panel-left`,className:`relative h-full overflow-hidden`,style:{width:`${S}%`,transition:m?`width 280ms cubic-bezier(0.34, 1.56, 0.64, 1)`:void 0},children:(0,X.jsx)(`div`,{className:`h-full flex items-center justify-center p-2`,children:(0,X.jsx)(`div`,{className:`w-full h-full max-h-[95vh]`,children:x(`left`)})})}),(0,X.jsx)(`div`,{"data-testid":`split-divider`,role:`separator`,"aria-orientation":`vertical`,"aria-valuenow":Math.round(e.splitRatio*100),"aria-valuemin":Math.round(hi*100),"aria-valuemax":Math.round(gi*100),tabIndex:0,onPointerDown:v,onKeyDown:y,className:`relative z-10 w-2 cursor-col-resize bg-border/40 hover:bg-accent-primary/40 transition-colors focus:outline-none focus:bg-accent-primary/60`}),(0,X.jsx)(`div`,{"data-testid":`split-panel-right`,className:`relative h-full overflow-hidden`,style:{width:`${C}%`,transition:m?`width 280ms cubic-bezier(0.34, 1.56, 0.64, 1)`:void 0},children:(0,X.jsx)(`div`,{className:`h-full flex items-center justify-center p-2`,children:(0,X.jsx)(`div`,{className:`w-full h-full max-h-[95vh]`,children:x(`right`)})})})]})]}),document.body)}var vi=.5,yi=.25,bi=.75,xi={leftId:null,rightId:null,originSide:null,splitRatio:vi};function Si(e){return Number.isFinite(e)?Math.min(bi,Math.max(yi,e)):vi}function Ci(e,t){switch(t.type){case`openCentered`:return e.originSide!==null&&e.leftId!==t.id&&e.rightId!==t.id?{leftId:t.id,rightId:null,originSide:null,splitRatio:vi}:e.originSide!==null&&(e.leftId===t.id||e.rightId===t.id)?e:{...xi,leftId:t.id};case`closeAll`:return xi;case`enterSplit`:{let n=t.ticketId??e.leftId;return n===null||e.originSide!==null?e:t.side===`left`?{leftId:n,rightId:null,originSide:`left`,splitRatio:vi}:{leftId:null,rightId:n,originSide:`right`,splitRatio:vi}}case`setComparedTicket`:{if(e.originSide===null)return e;let n=e.originSide===`left`?`right`:`left`;return t.side===n?t.side===`left`?{...e,leftId:t.id}:{...e,rightId:t.id}:e}case`exitSplit`:{if(e.originSide===null)return e;let t=e.originSide===`left`?e.leftId:e.rightId;return{...xi,leftId:t}}case`setSplitRatio`:return{...e,splitRatio:Si(t.ratio)};default:return e}}var wi=(0,J.createContext)(null),Ti=900;function Ei({children:e}){let[t,n]=(0,J.useReducer)(Ci,xi),{tickets:r,updateTicket:i,deleteTicket:a}=lt(),{activeProjectId:o,setActiveProjectId:s}=y(),c=(0,J.useRef)(null);(0,J.useEffect)(()=>{n({type:`closeAll`});let e=c.current;e&&(c.current=null,e.projectId===o&&n({type:`openCentered`,id:e.ticketId}))},[o]);let l=(0,J.useCallback)(e=>n({type:`openCentered`,id:e}),[]),u=(0,J.useCallback)((e,t)=>{if(e===o){n({type:`openCentered`,id:t});return}c.current={projectId:e,ticketId:t},s(e)},[o,s]),d=(0,J.useCallback)(()=>n({type:`closeAll`}),[]),f=(0,J.useCallback)((e,t)=>{typeof window<`u`&&window.innerWidth<Ti||n({type:`enterSplit`,side:e,ticketId:t})},[]),p=(0,J.useCallback)((e,t)=>n({type:`setComparedTicket`,id:e,side:t}),[]),m=(0,J.useCallback)(()=>n({type:`exitSplit`}),[]),h=(0,J.useCallback)(e=>n({type:`setSplitRatio`,ratio:e}),[]);(0,J.useEffect)(()=>{if(typeof window>`u`)return;function e(){window.innerWidth<Ti&&n({type:`exitSplit`})}return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]);let g=(0,J.useMemo)(()=>{let e=new Set;for(let t of r)for(let n of t.labels??[])e.add(n);return Array.from(e).sort()},[r]),_=t.leftId==null?null:r.find(e=>e.id===t.leftId)??null,v=t.rightId==null?null:r.find(e=>e.id===t.rightId)??null,b=(0,J.useMemo)(()=>({openTicketDetail:l,openTicketDetailInProject:u,closeTicketDetail:d,enterSplit:f,setComparedTicket:p,exitSplit:m,setSplitRatio:h,state:t}),[l,u,d,f,p,m,h,t]),x=t.originSide!==null;return(0,X.jsxs)(wi.Provider,{value:b,children:[e,!x&&_&&(0,X.jsx)(ii,{ticket:_,allLabels:g,allTickets:r,onClose:d,onOpenTicket:l,onSave:i,onDelete:a},_.id),x&&(0,X.jsx)(_i,{state:t,leftTicket:_,rightTicket:v,allTickets:r,allLabels:g,onSave:i,onDelete:a,onOpenTicket:l,onCloseAll:d,onSetCompared:p,onSetRatio:h,onExitSplit:m})]})}function Di(){return(0,J.useContext)(wi)||{openTicketDetail:()=>{typeof console<`u`&&console.warn(`[TicketDetailModalContext] openTicketDetail called without provider`)},openTicketDetailInProject:()=>{typeof console<`u`&&console.warn(`[TicketDetailModalContext] openTicketDetailInProject called without provider`)},closeTicketDetail:()=>{},enterSplit:()=>{},setComparedTicket:()=>{},exitSplit:()=>{},setSplitRatio:()=>{},state:xi}}export{De as $,Qt as A,Ge as B,Tn as C,sn as D,ln as E,lt as F,Ve as G,Ue as H,nt as I,Le as J,Be as K,rt as L,Mt as M,Bt as N,tn as O,At as P,Ee as Q,Xe as R,jn as S,un as T,He as U,We as V,K as W,Pe as X,Fe as Y,Se as Z,kn as _,Ar as a,je as at,Nn as b,br as c,xe as ct,sr as d,_e as dt,Ce as et,$n as f,ve as ft,Pn as g,fn as h,Xr as i,Te as it,It as j,en as k,yr as l,Ne as lt,In as m,Di as n,Me as nt,wr as o,G as ot,Gn as p,W as pt,Re as q,ii as r,Oe as rt,Tr as s,Ae as st,Ei as t,we as tt,pr as u,be as ut,Fn as v,Mn as w,An as x,dn as y,Je as z};
@@ -1 +1 @@
1
- import{a as e,t}from"./rolldown-runtime-CNC7AqOf.js";import{n}from"./jsx-runtime-zu2_FqZY.js";import{j as r}from"./useSharedWebSocket-DnxHj8jP.js";import{a as i,d as a,f as o,i as s,l as c,p as l,s as u,u as d}from"./createLucideIcon-Bjbbp_KS.js";var f=t(((e,t)=>{t.exports={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}})),p=e(n()),m=e(f()),h=/\s([^'"/\s><]+?)[\s/>]|([^\s=]+)=\s?(".*?"|'.*?')/g;function g(e){var t={type:`tag`,name:``,voidElement:!1,attrs:{},children:[]},n=e.match(/<\/?([^\s]+?)[/\s>]/);if(n&&(t.name=n[1],(m.default[n[1]]||e.charAt(e.length-2)===`/`)&&(t.voidElement=!0),t.name.startsWith(`!--`))){var r=e.indexOf(`-->`);return{type:`comment`,comment:r===-1?``:e.slice(4,r)}}for(var i=new RegExp(h),a=null;(a=i.exec(e))!==null;)if(a[0].trim())if(a[1]){var o=a[1].trim(),s=[o,``];o.indexOf(`=`)>-1&&(s=o.split(`=`)),t.attrs[s[0]]=s[1],i.lastIndex--}else a[2]&&(t.attrs[a[2]]=a[3].trim().substring(1,a[3].length-1));return t}var _=/<[a-zA-Z0-9\-\!\/](?:"[^"]*"|'[^']*'|[^'">])*>/g,v=/^\s*$/,y=Object.create(null);function b(e,t){switch(t.type){case`text`:return e+t.content;case`tag`:return e+=`<`+t.name+(t.attrs?function(e){var t=[];for(var n in e)t.push(n+`="`+e[n]+`"`);return t.length?` `+t.join(` `):``}(t.attrs):``)+(t.voidElement?`/>`:`>`),t.voidElement?e:e+t.children.reduce(b,``)+`</`+t.name+`>`;case`comment`:return e+`<!--`+t.comment+`-->`}}var x={parse:function(e,t){t||={},t.components||=y;var n,r=[],i=[],a=-1,o=!1;if(e.indexOf(`<`)!==0){var s=e.indexOf(`<`);r.push({type:`text`,content:s===-1?e:e.substring(0,s)})}return e.replace(_,function(s,c){if(o){if(s!==`</`+n.name+`>`)return;o=!1}var l,u=s.charAt(1)!==`/`,d=s.startsWith(`<!--`),f=c+s.length,p=e.charAt(f);if(d){var m=g(s);return a<0?(r.push(m),r):((l=i[a]).children.push(m),r)}if(u&&(a++,(n=g(s)).type===`tag`&&t.components[n.name]&&(n.type=`component`,o=!0),n.voidElement||o||!p||p===`<`||n.children.push({type:`text`,content:e.slice(f,e.indexOf(`<`,f))}),a===0&&r.push(n),(l=i[a-1])&&l.children.push(n),i[a]=n),(!u||n.voidElement)&&(a>-1&&(n.voidElement||n.name===s.slice(2,-1))&&(a--,n=a===-1?r:i[a]),!o&&p!==`<`&&p)){l=a===-1?r:i[a].children;var h=e.indexOf(`<`,f),_=e.slice(f,h===-1?void 0:h);v.test(_)&&(_=` `),(h>-1&&a+l.length>=0||_!==` `)&&l.push({type:`text`,content:_})}}),r},stringify:function(e){return e.reduce(function(e,t){return e+b(``,t)},``)}},S=(e,t)=>{if(!e)return!1;let n=e.props?.children??e.children;return t?n.length>0:!!n},C=e=>{if(!e)return[];let t=e.props?.children??e.children;return e.props?.i18nIsDynamicList?T(t):t},w=e=>Array.isArray(e)&&e.every(p.isValidElement),T=e=>Array.isArray(e)?e:[e],E=(e,t)=>{let n={...t};return n.props={...t.props,...e.props},n},D=e=>{let t={};if(!e)return t;let n=e=>{T(e).forEach(e=>{a(e)||(S(e)?n(C(e)):d(e)&&!(0,p.isValidElement)(e)&&Object.assign(t,e))})};return n(e),t},O=(e,t,n,r)=>{if(!e)return``;let i=``,s=T(e),c=t?.transSupportBasicHtmlNodes?t.transKeepBasicHtmlNodesFor??[]:[];return s.forEach((e,s)=>{if(a(e)){i+=`${e}`;return}if((0,p.isValidElement)(e)){let{props:o,type:l}=e,u=Object.keys(o).length,d=c.indexOf(l)>-1,f=o.children;if(!f&&d&&!u){i+=`<${l}/>`;return}if(!f&&(!d||u)||o.i18nIsDynamicList){i+=`<${s}></${s}>`;return}if(d&&u<=1){let e=a(f)?f:O(f,t,n,r);i+=`<${l}>${e}</${l}>`;return}let p=O(f,t,n,r);i+=`<${s}>${p}</${s}>`;return}if(e===null){o(n,`TRANS_NULL_VALUE`,`Passed in a null value as child`,{i18nKey:r});return}if(d(e)){let{format:t,...a}=e,s=Object.keys(a);if(s.length===1){let e=t?`${s[0]}, ${t}`:s[0];i+=`{{${e}}}`;return}o(n,`TRANS_INVALID_OBJ`,`Invalid child - Object should only have keys {{ value, format }} (format is optional).`,{i18nKey:r,child:e});return}o(n,`TRANS_INVALID_VAR`,`Passed in a variable like {number} - pass variables for interpolation as full objects like {{number}}.`,{i18nKey:r,child:e})}),i},k=(e,t=[],n={})=>{if(!e)return e;let r=Object.keys(n),i=[...t,...r],a=``,o=0;for(;o<e.length;)if(e[o]===`<`){let t=!1,n=e.slice(o).match(/^<\/(\d+|[a-zA-Z][a-zA-Z0-9_-]*)>/);if(n){let e=n[1];(/^\d+$/.test(e)||i.includes(e))&&(t=!0,a+=n[0],o+=n[0].length)}if(!t){let n=e.slice(o).match(/^<(\d+|[a-zA-Z][a-zA-Z0-9_-]*)(\s+[\w-]+(?:=(?:"[^"]*"|'[^']*'|[^\s>]+))?)*\s*(\/)?>/);if(n){let e=n[1];(/^\d+$/.test(e)||i.includes(e))&&(t=!0,a+=n[0],o+=n[0].length)}}t||(a+=`&lt;`,o+=1)}else a+=e[o],o+=1;return a},A=(e,t,n,r,i,o,s)=>{if(n===``)return[];let l=i.transKeepBasicHtmlNodesFor||[],f=n&&new RegExp(l.map(e=>`<${e}`).join(`|`)).test(n);if(!e&&!t&&!f&&!s)return[n];let m=t??{},h=e=>{T(e).forEach(e=>{a(e)||(S(e)?h(C(e)):d(e)&&!(0,p.isValidElement)(e)&&Object.assign(m,e))})};h(e);let g=k(n,l,m),_=x.parse(`<0>${g}</0>`),v={...m,...o},y=(e,t,n)=>{let r=C(e),i=D(r,t.children,n);return w(r)&&i.length===0||e.props?.i18nIsDynamicList?r:i},b=(e,t,n,r,i)=>{e.dummy?(e.children=t,n.push((0,p.cloneElement)(e,{key:r},i?void 0:t))):n.push(...p.Children.map([e],e=>{if(e.type===p.Fragment||e.props?.i18nIsDynamicList!==void 0){let n={key:r};return e&&e.props&&Object.keys(e.props).forEach(t=>{t===`children`||t===`i18nIsDynamicList`||(n[t]=e.props[t])}),(0,p.createElement)(e.type,n,i?null:t)}let n={key:r};return e&&e.props&&Object.keys(e.props).forEach(t=>{t===`ref`||t===`children`||(n[t]=e.props[t])}),(0,p.cloneElement)(e,n,i?null:t)}))},D=(e,n,o)=>{let m=T(e),h=T(n),g={};return h.reduce((e,n,h)=>{let _=n.children?.[0]?.content&&r.services.interpolator.interpolate(n.children[0].content,v,r.language);if(n.type===`tag`){let u=m[parseInt(n.name,10)];!u&&t&&(u=t[n.name]),o.length===1&&!u&&(u=o[0][n.name]),u||={};let x={...n.attrs};s&&Object.keys(x).forEach(e=>{let t=x[e];a(t)&&(x[e]=c(t))});let w=Object.keys(x).length===0?u:E({props:x},u),O=(0,p.isValidElement)(w),k=O&&S(n,!0)&&!n.voidElement,A=f&&d(w)&&w.dummy&&!O,j=d(t)&&Object.hasOwnProperty.call(t,n.name);if(a(w)){let t=r.services.interpolator.interpolate(w,v,r.language);e.push(t)}else if(S(w)||k){let t=y(w,n,o);b(w,t,e,h)}else if(A){let t=D(m,n.children,o);b(w,t,e,h)}else if(Number.isNaN(parseFloat(n.name)))if(j){let t=y(w,n,o);b(w,t,e,h,n.voidElement)}else if(i.transSupportBasicHtmlNodes&&l.indexOf(n.name)>-1)if(n.voidElement)e.push((0,p.createElement)(n.name,{key:`${n.name}-${h}`}));else{let t=g[n.name]||0;g[n.name]=t+1;let r,i=0;for(let e=0;e<m.length;e+=1){let a=m[e];if((0,p.isValidElement)(a)&&a.type===n.name){if(i===t){r=a;break}i+=1}}let a=r?T(C(r)):m,s=D(a,n.children,o);e.push((0,p.createElement)(n.name,{key:`${n.name}-${h}`},s))}else if(n.voidElement)e.push(`<${n.name} />`);else{let t=D(m,n.children,o);e.push(`<${n.name}>${t}</${n.name}>`)}else if(d(w)&&!O){let t=n.children[0]?_:null;t&&e.push(t)}else b(w,_,e,h,n.children.length!==1||!_)}else if(n.type===`text`){let t=i.transWrapTextNodes,a=typeof i.unescape==`function`?i.unescape:u().unescape,o=s?a(r.services.interpolator.interpolate(n.content,v,r.language)):r.services.interpolator.interpolate(n.content,v,r.language);t?e.push((0,p.createElement)(t,{key:`${n.name}-${h}`},o)):e.push(o)}return e},[])};return C(D([{dummy:!0,children:e||[]}],_,T(e||[]))[0])},j=(e,t,n)=>{let r=e.key||t,i=(0,p.cloneElement)(e,{key:r});if(!i.props||!i.props.children||n.indexOf(`${t}/>`)<0&&n.indexOf(`${t} />`)<0)return i;function a(){return(0,p.createElement)(p.Fragment,null,i)}return(0,p.createElement)(a,{key:r})},M=(e,t)=>e.map((e,n)=>j(e,n,t)),N=(e,t)=>{let n={};return Object.keys(e).forEach(r=>{Object.assign(n,{[r]:j(e[r],r,t)})}),n},P=(e,t,n,r)=>e?Array.isArray(e)?M(e,t):d(e)?N(e,t):(l(n,`TRANS_INVALID_COMPONENTS`,`<Trans /> "components" prop expects an object or array`,{i18nKey:r}),null):null,F=e=>!d(e)||Array.isArray(e)?!1:Object.keys(e).reduce((e,t)=>e&&Number.isNaN(Number.parseFloat(t)),!0);function I({children:e,count:t,parent:n,i18nKey:o,context:s,tOptions:c={},values:d,defaults:f,components:m,ns:h,i18n:g,t:_,shouldUnescape:v,...y}){let b=g||i();if(!b)return l(b,`NO_I18NEXT_INSTANCE`,`Trans: You need to pass in an i18next instance using i18nextReactModule`,{i18nKey:o}),e;let x=_||b.t.bind(b)||(e=>e),S={...u(),...b.options?.react},C=h||x.ns||b.options?.defaultNS;C=a(C)?[C]:C||[`translation`];let{transDefaultProps:w}=S,T=w?.tOptions?{...w.tOptions,...c}:c,E=v??w?.shouldUnescape,k=w?.values?{...w.values,...d}:d,j=w?.components?{...w.components,...m}:m,M=O(e,S,b,o),N=f||T?.defaultValue||M||S.transEmptyNodeValue||(typeof o==`function`?r(o):o),{hashTransKey:I}=S,L=o||(I?I(M||N):M||N);d=b.options?.interpolation?.defaultVariables?k&&Object.keys(k).length>0?{...k,...b.options.interpolation.defaultVariables}:{...b.options.interpolation.defaultVariables}:k;let R=D(e);R&&typeof R.count==`number`&&t===void 0&&(t=R.count);let z=d||t!==void 0&&!b.options?.interpolation?.alwaysFormat||!e?T.interpolation:{interpolation:{...T.interpolation,prefix:`#$?`,suffix:`?$#`}},B={...T,context:s||T.context,count:t,...d,...z,defaultValue:N,ns:C},V=L?x(L,B):N;V===L&&N&&(V=N);let H=P(j,V,b,o),U=H||e,W=null;F(H)&&(W=H,U=e);let G=A(U,W,V,b,S,B,E),K=n??S.defaultTransParent;return K?(0,p.createElement)(K,y,G):G}function L({children:e,count:t,parent:n,i18nKey:r,context:a,tOptions:o={},values:c,defaults:l,components:u,ns:d,i18n:f,t:m,shouldUnescape:h,...g}){let{i18n:_,defaultNS:v}=(0,p.useContext)(s)||{},y=f||_||i(),b=m||y?.t.bind(y);return I({children:e,count:t,parent:n,i18nKey:r,context:a,tOptions:o,values:c,defaults:l,components:u,ns:d||b?.ns||v||y?.options?.defaultNS,i18n:y,t:m,shouldUnescape:h,...g})}export{L as t};
1
+ import{a as e,t}from"./rolldown-runtime-CNC7AqOf.js";import{n}from"./jsx-runtime-zu2_FqZY.js";import{j as r}from"./useSharedWebSocket-BHIfW4QT.js";import{a as i,d as a,f as o,i as s,l as c,p as l,s as u,u as d}from"./createLucideIcon-Bjbbp_KS.js";var f=t(((e,t)=>{t.exports={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}})),p=e(n()),m=e(f()),h=/\s([^'"/\s><]+?)[\s/>]|([^\s=]+)=\s?(".*?"|'.*?')/g;function g(e){var t={type:`tag`,name:``,voidElement:!1,attrs:{},children:[]},n=e.match(/<\/?([^\s]+?)[/\s>]/);if(n&&(t.name=n[1],(m.default[n[1]]||e.charAt(e.length-2)===`/`)&&(t.voidElement=!0),t.name.startsWith(`!--`))){var r=e.indexOf(`-->`);return{type:`comment`,comment:r===-1?``:e.slice(4,r)}}for(var i=new RegExp(h),a=null;(a=i.exec(e))!==null;)if(a[0].trim())if(a[1]){var o=a[1].trim(),s=[o,``];o.indexOf(`=`)>-1&&(s=o.split(`=`)),t.attrs[s[0]]=s[1],i.lastIndex--}else a[2]&&(t.attrs[a[2]]=a[3].trim().substring(1,a[3].length-1));return t}var _=/<[a-zA-Z0-9\-\!\/](?:"[^"]*"|'[^']*'|[^'">])*>/g,v=/^\s*$/,y=Object.create(null);function b(e,t){switch(t.type){case`text`:return e+t.content;case`tag`:return e+=`<`+t.name+(t.attrs?function(e){var t=[];for(var n in e)t.push(n+`="`+e[n]+`"`);return t.length?` `+t.join(` `):``}(t.attrs):``)+(t.voidElement?`/>`:`>`),t.voidElement?e:e+t.children.reduce(b,``)+`</`+t.name+`>`;case`comment`:return e+`<!--`+t.comment+`-->`}}var x={parse:function(e,t){t||={},t.components||=y;var n,r=[],i=[],a=-1,o=!1;if(e.indexOf(`<`)!==0){var s=e.indexOf(`<`);r.push({type:`text`,content:s===-1?e:e.substring(0,s)})}return e.replace(_,function(s,c){if(o){if(s!==`</`+n.name+`>`)return;o=!1}var l,u=s.charAt(1)!==`/`,d=s.startsWith(`<!--`),f=c+s.length,p=e.charAt(f);if(d){var m=g(s);return a<0?(r.push(m),r):((l=i[a]).children.push(m),r)}if(u&&(a++,(n=g(s)).type===`tag`&&t.components[n.name]&&(n.type=`component`,o=!0),n.voidElement||o||!p||p===`<`||n.children.push({type:`text`,content:e.slice(f,e.indexOf(`<`,f))}),a===0&&r.push(n),(l=i[a-1])&&l.children.push(n),i[a]=n),(!u||n.voidElement)&&(a>-1&&(n.voidElement||n.name===s.slice(2,-1))&&(a--,n=a===-1?r:i[a]),!o&&p!==`<`&&p)){l=a===-1?r:i[a].children;var h=e.indexOf(`<`,f),_=e.slice(f,h===-1?void 0:h);v.test(_)&&(_=` `),(h>-1&&a+l.length>=0||_!==` `)&&l.push({type:`text`,content:_})}}),r},stringify:function(e){return e.reduce(function(e,t){return e+b(``,t)},``)}},S=(e,t)=>{if(!e)return!1;let n=e.props?.children??e.children;return t?n.length>0:!!n},C=e=>{if(!e)return[];let t=e.props?.children??e.children;return e.props?.i18nIsDynamicList?T(t):t},w=e=>Array.isArray(e)&&e.every(p.isValidElement),T=e=>Array.isArray(e)?e:[e],E=(e,t)=>{let n={...t};return n.props={...t.props,...e.props},n},D=e=>{let t={};if(!e)return t;let n=e=>{T(e).forEach(e=>{a(e)||(S(e)?n(C(e)):d(e)&&!(0,p.isValidElement)(e)&&Object.assign(t,e))})};return n(e),t},O=(e,t,n,r)=>{if(!e)return``;let i=``,s=T(e),c=t?.transSupportBasicHtmlNodes?t.transKeepBasicHtmlNodesFor??[]:[];return s.forEach((e,s)=>{if(a(e)){i+=`${e}`;return}if((0,p.isValidElement)(e)){let{props:o,type:l}=e,u=Object.keys(o).length,d=c.indexOf(l)>-1,f=o.children;if(!f&&d&&!u){i+=`<${l}/>`;return}if(!f&&(!d||u)||o.i18nIsDynamicList){i+=`<${s}></${s}>`;return}if(d&&u<=1){let e=a(f)?f:O(f,t,n,r);i+=`<${l}>${e}</${l}>`;return}let p=O(f,t,n,r);i+=`<${s}>${p}</${s}>`;return}if(e===null){o(n,`TRANS_NULL_VALUE`,`Passed in a null value as child`,{i18nKey:r});return}if(d(e)){let{format:t,...a}=e,s=Object.keys(a);if(s.length===1){let e=t?`${s[0]}, ${t}`:s[0];i+=`{{${e}}}`;return}o(n,`TRANS_INVALID_OBJ`,`Invalid child - Object should only have keys {{ value, format }} (format is optional).`,{i18nKey:r,child:e});return}o(n,`TRANS_INVALID_VAR`,`Passed in a variable like {number} - pass variables for interpolation as full objects like {{number}}.`,{i18nKey:r,child:e})}),i},k=(e,t=[],n={})=>{if(!e)return e;let r=Object.keys(n),i=[...t,...r],a=``,o=0;for(;o<e.length;)if(e[o]===`<`){let t=!1,n=e.slice(o).match(/^<\/(\d+|[a-zA-Z][a-zA-Z0-9_-]*)>/);if(n){let e=n[1];(/^\d+$/.test(e)||i.includes(e))&&(t=!0,a+=n[0],o+=n[0].length)}if(!t){let n=e.slice(o).match(/^<(\d+|[a-zA-Z][a-zA-Z0-9_-]*)(\s+[\w-]+(?:=(?:"[^"]*"|'[^']*'|[^\s>]+))?)*\s*(\/)?>/);if(n){let e=n[1];(/^\d+$/.test(e)||i.includes(e))&&(t=!0,a+=n[0],o+=n[0].length)}}t||(a+=`&lt;`,o+=1)}else a+=e[o],o+=1;return a},A=(e,t,n,r,i,o,s)=>{if(n===``)return[];let l=i.transKeepBasicHtmlNodesFor||[],f=n&&new RegExp(l.map(e=>`<${e}`).join(`|`)).test(n);if(!e&&!t&&!f&&!s)return[n];let m=t??{},h=e=>{T(e).forEach(e=>{a(e)||(S(e)?h(C(e)):d(e)&&!(0,p.isValidElement)(e)&&Object.assign(m,e))})};h(e);let g=k(n,l,m),_=x.parse(`<0>${g}</0>`),v={...m,...o},y=(e,t,n)=>{let r=C(e),i=D(r,t.children,n);return w(r)&&i.length===0||e.props?.i18nIsDynamicList?r:i},b=(e,t,n,r,i)=>{e.dummy?(e.children=t,n.push((0,p.cloneElement)(e,{key:r},i?void 0:t))):n.push(...p.Children.map([e],e=>{if(e.type===p.Fragment||e.props?.i18nIsDynamicList!==void 0){let n={key:r};return e&&e.props&&Object.keys(e.props).forEach(t=>{t===`children`||t===`i18nIsDynamicList`||(n[t]=e.props[t])}),(0,p.createElement)(e.type,n,i?null:t)}let n={key:r};return e&&e.props&&Object.keys(e.props).forEach(t=>{t===`ref`||t===`children`||(n[t]=e.props[t])}),(0,p.cloneElement)(e,n,i?null:t)}))},D=(e,n,o)=>{let m=T(e),h=T(n),g={};return h.reduce((e,n,h)=>{let _=n.children?.[0]?.content&&r.services.interpolator.interpolate(n.children[0].content,v,r.language);if(n.type===`tag`){let u=m[parseInt(n.name,10)];!u&&t&&(u=t[n.name]),o.length===1&&!u&&(u=o[0][n.name]),u||={};let x={...n.attrs};s&&Object.keys(x).forEach(e=>{let t=x[e];a(t)&&(x[e]=c(t))});let w=Object.keys(x).length===0?u:E({props:x},u),O=(0,p.isValidElement)(w),k=O&&S(n,!0)&&!n.voidElement,A=f&&d(w)&&w.dummy&&!O,j=d(t)&&Object.hasOwnProperty.call(t,n.name);if(a(w)){let t=r.services.interpolator.interpolate(w,v,r.language);e.push(t)}else if(S(w)||k){let t=y(w,n,o);b(w,t,e,h)}else if(A){let t=D(m,n.children,o);b(w,t,e,h)}else if(Number.isNaN(parseFloat(n.name)))if(j){let t=y(w,n,o);b(w,t,e,h,n.voidElement)}else if(i.transSupportBasicHtmlNodes&&l.indexOf(n.name)>-1)if(n.voidElement)e.push((0,p.createElement)(n.name,{key:`${n.name}-${h}`}));else{let t=g[n.name]||0;g[n.name]=t+1;let r,i=0;for(let e=0;e<m.length;e+=1){let a=m[e];if((0,p.isValidElement)(a)&&a.type===n.name){if(i===t){r=a;break}i+=1}}let a=r?T(C(r)):m,s=D(a,n.children,o);e.push((0,p.createElement)(n.name,{key:`${n.name}-${h}`},s))}else if(n.voidElement)e.push(`<${n.name} />`);else{let t=D(m,n.children,o);e.push(`<${n.name}>${t}</${n.name}>`)}else if(d(w)&&!O){let t=n.children[0]?_:null;t&&e.push(t)}else b(w,_,e,h,n.children.length!==1||!_)}else if(n.type===`text`){let t=i.transWrapTextNodes,a=typeof i.unescape==`function`?i.unescape:u().unescape,o=s?a(r.services.interpolator.interpolate(n.content,v,r.language)):r.services.interpolator.interpolate(n.content,v,r.language);t?e.push((0,p.createElement)(t,{key:`${n.name}-${h}`},o)):e.push(o)}return e},[])};return C(D([{dummy:!0,children:e||[]}],_,T(e||[]))[0])},j=(e,t,n)=>{let r=e.key||t,i=(0,p.cloneElement)(e,{key:r});if(!i.props||!i.props.children||n.indexOf(`${t}/>`)<0&&n.indexOf(`${t} />`)<0)return i;function a(){return(0,p.createElement)(p.Fragment,null,i)}return(0,p.createElement)(a,{key:r})},M=(e,t)=>e.map((e,n)=>j(e,n,t)),N=(e,t)=>{let n={};return Object.keys(e).forEach(r=>{Object.assign(n,{[r]:j(e[r],r,t)})}),n},P=(e,t,n,r)=>e?Array.isArray(e)?M(e,t):d(e)?N(e,t):(l(n,`TRANS_INVALID_COMPONENTS`,`<Trans /> "components" prop expects an object or array`,{i18nKey:r}),null):null,F=e=>!d(e)||Array.isArray(e)?!1:Object.keys(e).reduce((e,t)=>e&&Number.isNaN(Number.parseFloat(t)),!0);function I({children:e,count:t,parent:n,i18nKey:o,context:s,tOptions:c={},values:d,defaults:f,components:m,ns:h,i18n:g,t:_,shouldUnescape:v,...y}){let b=g||i();if(!b)return l(b,`NO_I18NEXT_INSTANCE`,`Trans: You need to pass in an i18next instance using i18nextReactModule`,{i18nKey:o}),e;let x=_||b.t.bind(b)||(e=>e),S={...u(),...b.options?.react},C=h||x.ns||b.options?.defaultNS;C=a(C)?[C]:C||[`translation`];let{transDefaultProps:w}=S,T=w?.tOptions?{...w.tOptions,...c}:c,E=v??w?.shouldUnescape,k=w?.values?{...w.values,...d}:d,j=w?.components?{...w.components,...m}:m,M=O(e,S,b,o),N=f||T?.defaultValue||M||S.transEmptyNodeValue||(typeof o==`function`?r(o):o),{hashTransKey:I}=S,L=o||(I?I(M||N):M||N);d=b.options?.interpolation?.defaultVariables?k&&Object.keys(k).length>0?{...k,...b.options.interpolation.defaultVariables}:{...b.options.interpolation.defaultVariables}:k;let R=D(e);R&&typeof R.count==`number`&&t===void 0&&(t=R.count);let z=d||t!==void 0&&!b.options?.interpolation?.alwaysFormat||!e?T.interpolation:{interpolation:{...T.interpolation,prefix:`#$?`,suffix:`?$#`}},B={...T,context:s||T.context,count:t,...d,...z,defaultValue:N,ns:C},V=L?x(L,B):N;V===L&&N&&(V=N);let H=P(j,V,b,o),U=H||e,W=null;F(H)&&(W=H,U=e);let G=A(U,W,V,b,S,B,E),K=n??S.defaultTransParent;return K?(0,p.createElement)(K,y,G):G}function L({children:e,count:t,parent:n,i18nKey:r,context:a,tOptions:o={},values:c,defaults:l,components:u,ns:d,i18n:f,t:m,shouldUnescape:h,...g}){let{i18n:_,defaultNS:v}=(0,p.useContext)(s)||{},y=f||_||i(),b=m||y?.t.bind(y);return I({children:e,count:t,parent:n,i18nKey:r,context:a,tOptions:o,values:c,defaults:l,components:u,ns:d||b?.ns||v||y?.options?.defaultNS,i18n:y,t:m,shouldUnescape:h,...g})}export{L as t};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-CNC7AqOf.js";var t=e({aiEngine:()=>a,commandProposal:()=>l,contextScope:()=>i,costMeter:()=>c,default:()=>d,errors:()=>u,featureProposal:()=>r,modelCombobox:()=>s,modelSelector:()=>o,proposeModal:()=>n}),n={title:`Add Spec`,dialogDescription:`Create a new spec from a short idea, either immediately or through Explore mode.`,engineAriaLabel:`AI engine for this spec`,modeTablistLabel:`Spec creation mode`,mode:{quick:`Quick`,explore:`Explore`,raw:`Raw`,exploreHint:`interactive`,rawHint:`no AI`,quickUnavailable:`unavailable for Kimi`},modeDescription:{quick:`Describe the feature or change. Attach mockups, briefs, or data for more context.`,explore:`Describe a rough idea. The selected AI assistant will help you shape it through conversation — you decide when to commit.`,raw:`Your prompt, as-is — saved as a spec ticket. No AI runs now; drag it to a rail to build it.`},editorPlaceholder:{quick:`e.g. Add a dark mode toggle to the settings page that persists the user's preference...`,explore:`e.g. dark mode — not sure where the toggle should live or how to persist it…`,raw:`Describe the feature, change, or idea. Markdown, images, and files supported…`},ideaAriaLabel:`Spec idea`,raw:{titleLabel:`Title`,titlePlaceholder:`Auto-filled from your prompt…`,priorityLabel:`Priority`,labelsLabel:`Labels`,removeLabel:`Remove label {{label}}`,addLabelAria:`Add label`,labelPlaceholder:`optional…`,bodyAriaLabel:`Raw spec body`},priority:{critical:`Critical`,high:`High`,medium:`Medium`,low:`Low`},fromWebsite:`From a website`,fromWebsiteTitle:`Open a real web page, select an area, and turn it into a spec`,capture:{responsiveSizes_one:`Responsive · {{count}} size`,responsiveSizes_other:`Responsive · {{count}} sizes`},submit:{quick:`Generate Spec`,explore:`Continue`,raw:`Create`,disabledTitle:`Write a prompt first`},toast:{createFailed:`Failed to create spec`,rawSavedWithId:`Saved as #{{id}} · Raw spec ready for rails`,rawCreated:`Raw spec created`,exploreNotWired:`Explore mode is not wired in this view`,generating:`Generating...`,failedToStart:`{{projectName}} · Failed to start`,unsupportedFileType:`Unsupported file type: {{name}}`,uploadFailed:`Upload failed for {{name}}: {{message}}`}},r={title:`Propose a Feature`,ideaIntro:`Describe your idea in plain language. Claude will read the codebase and structure it into a full proposal.`,ideaAriaLabel:`Feature idea`,ideaPlaceholder:`e.g. I want users to be able to set a budget alert so they get notified when API costs exceed a threshold...`,cmdEnterToSubmit:`Cmd+Enter to submit`,exploreIdea:`Explore Idea`,exploringTitle:`Exploring your idea...`,refiningTitle:`Refining proposal...`,reviewTitle:`Review Proposal`,readingCodebase_one:`Reading codebase... ({{count}} file explored)`,readingCodebase_other:`Reading codebase... ({{count}} files explored)`,refinementAriaLabel:`Refinement feedback`,refinementPlaceholder:`Ask for changes, add constraints, refine scope...`,sendRefinementTitle:`Send refinement (Cmd+Enter)`,cmdEnterToSend:`Cmd+Enter to send`,confirmCreateIssue:`Create a GitHub Issue from this proposal?`,yesCreateIssue:`Yes, create issue`,createGithubIssue:`Create GitHub Issue`,startOver:`Start Over`,creatingIssueTitle:`Creating GitHub Issue...`,creatingIssueViaCli:`Creating issue via GitHub CLI...`,issueCreated:`Issue Created`,proposeAnother:`Propose Another`,errorTitle:`Something went wrong`,errorFallback:`An error occurred`,tryAgain:`Try Again`,cancelledTitle:`Cancelled`,cancelledBody:`The proposal was cancelled.`},i={heading:`Context Awareness`,custom:`Custom`,customMix:`Custom mix — see Fine-tune below`,estimateUnavailable:`{{tier}} · estimate unavailable`,preset:{minimal:`Minimal`,light:`Light`,standard:`Standard`,rich:`Rich`,max:`Max`,desktop:`Desktop`},presetCost:{minimal:`1× cost · fastest first-token · no specs loaded`,light:`1.3× cost · Specrails specs loaded`,standard:`1.6× cost · Specrails + OpenSpec specs loaded`,rich:`2× cost · full repo read access`,max:`4× cost · full read + Contract Layer refinement`,desktop:`4–6× cost · all features + project & your approved MCPs`},smashCapable:`SMASH-capable`,smashHint:`Contract Layer is on, so this spec can later be decomposed into Sub-Specs.`,fineTune:`Fine-tune`,defaultLabel:`Context scope`,summaryMinimal:`minimal`,tags:{specrails:`specrails`,openspec:`openspec`,codebase:`codebase`,mcp:`mcp`,myMcp:`my-mcp`,contract:`contract`},checks:{specrailsLabel:`specrails tickets`,openspecLabel:`openspec specs`,fullLabel:`Full codebase`,mcpLabel:`Project MCPs`,mcpHint:`.mcp.json servers`,userMcpLabel:`My approved MCPs`,userMcpHint:`~/.claude servers`,userMcpTooltip:`Your locally-approved MCP servers (claude mcp add)`,exploreOnly:`Explore mode only`,providerUnsupported:`Unavailable for {{provider}}`,contractLabel:`Enrich with Contract Layer`,contractHint:`post-commit refinement · enables SMASH`}},a={label:`AI engine`,notSignedIn:`Not signed in`},o={presetHeading:`Model preset`,preset:{balanced:{label:`Balanced`,description:`{{model}} for all agents (recommended)`},budget:{label:`Budget`,description:`{{model}} for all agents — 3x cheaper, faster`},max:{label:`Max`,description:`{{topModel}} for architect + PM, {{baseModel}} for rest`}},overridesHeading:`Per-agent model overrides`,overriddenCount:`{{count}} overridden`,customBadge:`custom`,resetToDefault:`Reset to preset default`},s={alias:`Claude Code alias: {{alias}}`,tier:{balanced:`Balanced`,mostCapable:`Most capable`,fastest:`Fastest`,frontier:`Frontier`}},c={heading:`Cost awareness`,meterAriaLabel:`cost tier`,estimateUnavailable:`tier-only — estimate unavailable`},l={heading:`Suggested command`,run:`Run`,dismiss:`Dismiss`},u={serverError:`Server error ({{status}})`,connectionFailed:`Connection failed: {{message}}`,sendRefinementFailed:`Failed to send refinement`,createIssueFailed:`Failed to create issue`},d={proposeModal:n,featureProposal:r,contextScope:i,aiEngine:a,modelSelector:o,modelCombobox:s,costMeter:c,commandProposal:l,errors:u};export{t};
1
+ import{r as e}from"./rolldown-runtime-CNC7AqOf.js";var t=e({aiEngine:()=>a,commandProposal:()=>l,contextScope:()=>i,costMeter:()=>c,default:()=>d,errors:()=>u,featureProposal:()=>r,modelCombobox:()=>s,modelSelector:()=>o,proposeModal:()=>n}),n={title:`Add Spec`,dialogDescription:`Create a new spec from a short idea, either immediately or through Explore mode.`,engineAriaLabel:`AI engine for this spec`,modeTablistLabel:`Spec creation mode`,mode:{quick:`Quick`,explore:`Explore`,raw:`Raw`,exploreHint:`interactive`,rawHint:`no AI`,quickUnavailable:`unavailable for Kimi`},modeDescription:{quick:`Describe the feature or change. Attach mockups, briefs, or data for more context.`,explore:`Describe a rough idea. The selected AI assistant will help you shape it through conversation — you decide when to commit.`,raw:`Your prompt, as-is — saved as a spec ticket. No AI runs now; drag it to a rail to build it.`},editorPlaceholder:{quick:`e.g. Add a dark mode toggle to the settings page that persists the user's preference...`,explore:`e.g. dark mode — not sure where the toggle should live or how to persist it…`,raw:`Describe the feature, change, or idea. Markdown, images, and files supported…`},ideaAriaLabel:`Spec idea`,raw:{titleLabel:`Title`,titlePlaceholder:`Auto-filled from your prompt…`,priorityLabel:`Priority`,labelsLabel:`Labels`,removeLabel:`Remove label {{label}}`,addLabelAria:`Add label`,labelPlaceholder:`optional…`,bodyAriaLabel:`Raw spec body`},priority:{critical:`Critical`,high:`High`,medium:`Medium`,low:`Low`},fromWebsite:`From a website`,fromWebsiteTitle:`Open a real web page, select an area, and turn it into a spec`,capture:{responsiveSizes_one:`Responsive · {{count}} size`,responsiveSizes_other:`Responsive · {{count}} sizes`},submit:{quick:`Generate Spec`,explore:`Continue`,raw:`Create`,disabledTitle:`Write a prompt first`},toast:{createFailed:`Failed to create spec`,rawSavedWithId:`Saved as #{{id}} · Raw spec ready for rails`,rawCreated:`Raw spec created`,exploreNotWired:`Explore mode is not wired in this view`,generating:`Generating...`,failedToStart:`{{projectName}} · Failed to start`,unsupportedFileType:`Unsupported file type: {{name}}`,uploadFailed:`Upload failed for {{name}}: {{message}}`}},r={title:`Propose a Feature`,ideaIntro:`Describe your idea in plain language. Claude will read the codebase and structure it into a full proposal.`,ideaAriaLabel:`Feature idea`,ideaPlaceholder:`e.g. I want users to be able to set a budget alert so they get notified when API costs exceed a threshold...`,cmdEnterToSubmit:`Cmd+Enter to submit`,exploreIdea:`Explore Idea`,exploringTitle:`Exploring your idea...`,refiningTitle:`Refining proposal...`,reviewTitle:`Review Proposal`,readingCodebase_one:`Reading codebase... ({{count}} file explored)`,readingCodebase_other:`Reading codebase... ({{count}} files explored)`,refinementAriaLabel:`Refinement feedback`,refinementPlaceholder:`Ask for changes, add constraints, refine scope...`,sendRefinementTitle:`Send refinement (Cmd+Enter)`,cmdEnterToSend:`Cmd+Enter to send`,confirmCreateIssue:`Create a GitHub Issue from this proposal?`,yesCreateIssue:`Yes, create issue`,createGithubIssue:`Create GitHub Issue`,startOver:`Start Over`,creatingIssueTitle:`Creating GitHub Issue...`,creatingIssueViaCli:`Creating issue via GitHub CLI...`,issueCreated:`Issue Created`,proposeAnother:`Propose Another`,errorTitle:`Something went wrong`,errorFallback:`An error occurred`,tryAgain:`Try Again`,cancelledTitle:`Cancelled`,cancelledBody:`The proposal was cancelled.`},i={heading:`Context Awareness`,custom:`Custom`,customMix:`Custom mix — see Fine-tune below`,estimateUnavailable:`{{tier}} · estimate unavailable`,preset:{minimal:`Minimal`,light:`Light`,standard:`Standard`,rich:`Rich`,max:`Max`,desktop:`Desktop`},presetCost:{minimal:`1× cost · fastest first-token · no specs loaded`,light:`1.3× cost · Specrails specs loaded`,standard:`1.6× cost · Specrails + OpenSpec specs loaded`,rich:`2× cost · full repo read access`,max:`4× cost · full read + Contract Layer refinement`,desktop:`4–6× cost · all features + project & your approved MCPs`},smashCapable:`SMASH-capable`,smashHint:`Contract Layer is on, so this spec can later be decomposed into Sub-Specs.`,fineTune:`Fine-tune`,defaultLabel:`Context scope`,summaryMinimal:`minimal`,tags:{specrails:`specrails`,openspec:`openspec`,codebase:`codebase`,mcp:`mcp`,myMcp:`my-mcp`,contract:`contract`},checks:{specrailsLabel:`specrails tickets`,openspecLabel:`openspec specs`,fullLabel:`Full codebase`,mcpLabel:`Project MCPs`,mcpHint:`.mcp.json servers`,userMcpLabel:`My approved MCPs`,userMcpHint:`~/.claude servers`,userMcpTooltip:`Your locally-approved MCP servers (claude mcp add)`,exploreOnly:`Explore mode only`,providerUnsupported:`Unavailable for {{provider}}`,contractLabel:`Enrich with Contract Layer`,contractHint:`post-commit refinement · enables SMASH`}},a={label:`AI engine`,notSignedIn:`Not signed in`,localEngine:`Local engine`},o={presetHeading:`Model preset`,preset:{balanced:{label:`Balanced`,description:`{{model}} for all agents (recommended)`},budget:{label:`Budget`,description:`{{model}} for all agents — 3x cheaper, faster`},max:{label:`Max`,description:`{{topModel}} for architect + PM, {{baseModel}} for rest`}},overridesHeading:`Per-agent model overrides`,overriddenCount:`{{count}} overridden`,customBadge:`custom`,resetToDefault:`Reset to preset default`},s={alias:`Claude Code alias: {{alias}}`,tier:{balanced:`Balanced`,mostCapable:`Most capable`,fastest:`Fastest`,frontier:`Frontier`}},c={heading:`Cost awareness`,meterAriaLabel:`cost tier`,estimateUnavailable:`tier-only — estimate unavailable`},l={heading:`Suggested command`,run:`Run`,dismiss:`Dismiss`},u={serverError:`Server error ({{status}})`,connectionFailed:`Connection failed: {{message}}`,sendRefinementFailed:`Failed to send refinement`,createIssueFailed:`Failed to create issue`},d={proposeModal:n,featureProposal:r,contextScope:i,aiEngine:a,modelSelector:o,modelCombobox:s,costMeter:c,commandProposal:l,errors:u};export{t};
@@ -1 +1 @@
1
- var e={title:`スペックを追加`,dialogDescription:`短いアイデアから、即時または Explore モードで新しいスペックを作成します。`,engineAriaLabel:`このスペックの AI エンジン`,modeTablistLabel:`スペック作成モード`,mode:{quick:`クイック`,explore:`Explore`,raw:`Raw`,exploreHint:`対話型`,rawHint:`AIなし`,quickUnavailable:`Kimiでは利用不可`},modeDescription:{quick:`機能や変更内容を記述してください。モックアップ、ブリーフ、データを添付するとコンテキストが充実します。`,explore:`大まかなアイデアを記述してください。選択した AI アシスタントが対話を通じて形にするのを手伝います — コミットのタイミングはあなたが決めます。`,raw:`プロンプトをそのままスペックチケットとして保存します。今は AI を実行しません。レールにドラッグするとビルドされます。`},editorPlaceholder:{quick:`例: 設定ページにダークモードの切り替えを追加し、ユーザーの設定を永続化する...`,explore:`例: ダークモード — トグルの配置や永続化の方法はまだ未定…`,raw:`機能、変更、アイデアを記述してください。Markdown、画像、ファイルに対応…`},ideaAriaLabel:`スペックのアイデア`,raw:{titleLabel:`タイトル`,titlePlaceholder:`プロンプトから自動入力…`,priorityLabel:`優先度`,labelsLabel:`ラベル`,removeLabel:`ラベル {{label}} を削除`,addLabelAria:`ラベルを追加`,labelPlaceholder:`任意…`,bodyAriaLabel:`Raw スペック本文`},priority:{critical:`クリティカル`,high:`高`,medium:`中`,low:`低`},fromWebsite:`ウェブサイトから`,fromWebsiteTitle:`実際のウェブページを開き、範囲を選択してスペックに変換`,capture:{responsiveSizes_one:`レスポンシブ · {{count}} サイズ`,responsiveSizes_other:`レスポンシブ · {{count}} サイズ`},submit:{quick:`スペックを生成`,explore:`続行`,raw:`作成`,disabledTitle:`先にプロンプトを入力してください`},toast:{createFailed:`スペックの作成に失敗しました`,rawSavedWithId:`#{{id}} として保存 · Raw スペックはレールで使用可能`,rawCreated:`Raw スペックを作成しました`,exploreNotWired:`このビューでは Explore モードは利用できません`,generating:`生成中...`,failedToStart:`{{projectName}} · 開始に失敗しました`,unsupportedFileType:`未対応のファイル形式: {{name}}`,uploadFailed:`{{name}} のアップロードに失敗しました: {{message}}`}},t={title:`機能を提案`,ideaIntro:`アイデアを平易な言葉で記述してください。Claude がコードベースを読み取り、完全な提案として構造化します。`,ideaAriaLabel:`機能のアイデア`,ideaPlaceholder:`例: API コストがしきい値を超えたときに通知される予算アラートをユーザーが設定できるようにしたい...`,cmdEnterToSubmit:`Cmd+Enter で送信`,exploreIdea:`アイデアを探索`,exploringTitle:`アイデアを探索中...`,refiningTitle:`提案を改良中...`,reviewTitle:`提案をレビュー`,readingCodebase_one:`コードベースを読み取り中...({{count}} ファイル探索済み)`,readingCodebase_other:`コードベースを読み取り中...({{count}} ファイル探索済み)`,refinementAriaLabel:`改良フィードバック`,refinementPlaceholder:`変更を依頼、制約を追加、スコープを調整...`,sendRefinementTitle:`改良を送信 (Cmd+Enter)`,cmdEnterToSend:`Cmd+Enter で送信`,confirmCreateIssue:`この提案から GitHub Issue を作成しますか?`,yesCreateIssue:`はい、作成します`,createGithubIssue:`GitHub Issue を作成`,startOver:`最初からやり直す`,creatingIssueTitle:`GitHub Issue を作成中...`,creatingIssueViaCli:`GitHub CLI で Issue を作成中...`,issueCreated:`Issue を作成しました`,proposeAnother:`別の提案をする`,errorTitle:`問題が発生しました`,errorFallback:`エラーが発生しました`,tryAgain:`再試行`,cancelledTitle:`キャンセルされました`,cancelledBody:`提案はキャンセルされました。`},n={heading:`コンテキスト認識`,custom:`カスタム`,customMix:`カスタム構成 — 下の「微調整」を参照`,estimateUnavailable:`{{tier}} · 見積もり不可`,preset:{minimal:`最小`,light:`ライト`,standard:`標準`,rich:`リッチ`,max:`最大`,desktop:`Desktop`},presetCost:{minimal:`1× コスト · 最速の初回トークン · スペック読み込みなし`,light:`1.3× コスト · Specrails スペックを読み込み`,standard:`1.6× コスト · Specrails + OpenSpec スペックを読み込み`,rich:`2× コスト · リポジトリ全体の読み取りアクセス`,max:`4× コスト · 全読み取り + Contract Layer 改良`,desktop:`4–6× コスト · 全機能 + プロジェクトおよび承認済み MCP`},smashCapable:`SMASH 対応`,smashHint:`Contract Layer が有効なため、このスペックは後で Sub-Spec に分解できます。`,fineTune:`微調整`,defaultLabel:`コンテキストスコープ`,summaryMinimal:`最小`,tags:{specrails:`specrails`,openspec:`openspec`,codebase:`codebase`,mcp:`mcp`,myMcp:`my-mcp`,contract:`contract`},checks:{specrailsLabel:`specrails チケット`,openspecLabel:`openspec スペック`,fullLabel:`コードベース全体`,mcpLabel:`プロジェクト MCP`,mcpHint:`.mcp.json のサーバー`,userMcpLabel:`承認済みの MCP`,userMcpHint:`~/.claude のサーバー`,userMcpTooltip:`ローカルで承認済みの MCP サーバー(claude mcp add)`,exploreOnly:`Explore モードのみ`,providerUnsupported:`{{provider}} では利用できません`,contractLabel:`Contract Layer で強化`,contractHint:`コミット後の改良 · SMASH を有効化`}},r={label:`AI エンジン`,notSignedIn:`未ログイン`},i={presetHeading:`モデルプリセット`,preset:{balanced:{label:`バランス`,description:`全エージェントに {{model}}(推奨)`},budget:{label:`節約`,description:`全エージェントに {{model}} — 3倍安く、高速`},max:{label:`最大`,description:`アーキテクトと PM に {{topModel}}、その他に {{baseModel}}`}},overridesHeading:`エージェント別モデルオーバーライド`,overriddenCount:`{{count}} 件オーバーライド`,customBadge:`カスタム`,resetToDefault:`プリセットのデフォルトに戻す`},a={alias:`Claude Code エイリアス: {{alias}}`,tier:{balanced:`バランス`,mostCapable:`最高性能`,fastest:`最速`,frontier:`フロンティア`}},o={heading:`コスト認識`,meterAriaLabel:`コストティア`,estimateUnavailable:`ティアのみ — 見積もり不可`},s={heading:`推奨コマンド`,run:`実行`,dismiss:`閉じる`},c={serverError:`サーバーエラー ({{status}})`,connectionFailed:`接続に失敗しました: {{message}}`,sendRefinementFailed:`改良の送信に失敗しました`,createIssueFailed:`Issue の作成に失敗しました`},l={proposeModal:e,featureProposal:t,contextScope:n,aiEngine:r,modelSelector:i,modelCombobox:a,costMeter:o,commandProposal:s,errors:c};export{r as aiEngine,s as commandProposal,n as contextScope,o as costMeter,l as default,c as errors,t as featureProposal,a as modelCombobox,i as modelSelector,e as proposeModal};
1
+ var e={title:`スペックを追加`,dialogDescription:`短いアイデアから、即時または Explore モードで新しいスペックを作成します。`,engineAriaLabel:`このスペックの AI エンジン`,modeTablistLabel:`スペック作成モード`,mode:{quick:`クイック`,explore:`Explore`,raw:`Raw`,exploreHint:`対話型`,rawHint:`AIなし`,quickUnavailable:`Kimiでは利用不可`},modeDescription:{quick:`機能や変更内容を記述してください。モックアップ、ブリーフ、データを添付するとコンテキストが充実します。`,explore:`大まかなアイデアを記述してください。選択した AI アシスタントが対話を通じて形にするのを手伝います — コミットのタイミングはあなたが決めます。`,raw:`プロンプトをそのままスペックチケットとして保存します。今は AI を実行しません。レールにドラッグするとビルドされます。`},editorPlaceholder:{quick:`例: 設定ページにダークモードの切り替えを追加し、ユーザーの設定を永続化する...`,explore:`例: ダークモード — トグルの配置や永続化の方法はまだ未定…`,raw:`機能、変更、アイデアを記述してください。Markdown、画像、ファイルに対応…`},ideaAriaLabel:`スペックのアイデア`,raw:{titleLabel:`タイトル`,titlePlaceholder:`プロンプトから自動入力…`,priorityLabel:`優先度`,labelsLabel:`ラベル`,removeLabel:`ラベル {{label}} を削除`,addLabelAria:`ラベルを追加`,labelPlaceholder:`任意…`,bodyAriaLabel:`Raw スペック本文`},priority:{critical:`クリティカル`,high:`高`,medium:`中`,low:`低`},fromWebsite:`ウェブサイトから`,fromWebsiteTitle:`実際のウェブページを開き、範囲を選択してスペックに変換`,capture:{responsiveSizes_one:`レスポンシブ · {{count}} サイズ`,responsiveSizes_other:`レスポンシブ · {{count}} サイズ`},submit:{quick:`スペックを生成`,explore:`続行`,raw:`作成`,disabledTitle:`先にプロンプトを入力してください`},toast:{createFailed:`スペックの作成に失敗しました`,rawSavedWithId:`#{{id}} として保存 · Raw スペックはレールで使用可能`,rawCreated:`Raw スペックを作成しました`,exploreNotWired:`このビューでは Explore モードは利用できません`,generating:`生成中...`,failedToStart:`{{projectName}} · 開始に失敗しました`,unsupportedFileType:`未対応のファイル形式: {{name}}`,uploadFailed:`{{name}} のアップロードに失敗しました: {{message}}`}},t={title:`機能を提案`,ideaIntro:`アイデアを平易な言葉で記述してください。Claude がコードベースを読み取り、完全な提案として構造化します。`,ideaAriaLabel:`機能のアイデア`,ideaPlaceholder:`例: API コストがしきい値を超えたときに通知される予算アラートをユーザーが設定できるようにしたい...`,cmdEnterToSubmit:`Cmd+Enter で送信`,exploreIdea:`アイデアを探索`,exploringTitle:`アイデアを探索中...`,refiningTitle:`提案を改良中...`,reviewTitle:`提案をレビュー`,readingCodebase_one:`コードベースを読み取り中...({{count}} ファイル探索済み)`,readingCodebase_other:`コードベースを読み取り中...({{count}} ファイル探索済み)`,refinementAriaLabel:`改良フィードバック`,refinementPlaceholder:`変更を依頼、制約を追加、スコープを調整...`,sendRefinementTitle:`改良を送信 (Cmd+Enter)`,cmdEnterToSend:`Cmd+Enter で送信`,confirmCreateIssue:`この提案から GitHub Issue を作成しますか?`,yesCreateIssue:`はい、作成します`,createGithubIssue:`GitHub Issue を作成`,startOver:`最初からやり直す`,creatingIssueTitle:`GitHub Issue を作成中...`,creatingIssueViaCli:`GitHub CLI で Issue を作成中...`,issueCreated:`Issue を作成しました`,proposeAnother:`別の提案をする`,errorTitle:`問題が発生しました`,errorFallback:`エラーが発生しました`,tryAgain:`再試行`,cancelledTitle:`キャンセルされました`,cancelledBody:`提案はキャンセルされました。`},n={heading:`コンテキスト認識`,custom:`カスタム`,customMix:`カスタム構成 — 下の「微調整」を参照`,estimateUnavailable:`{{tier}} · 見積もり不可`,preset:{minimal:`最小`,light:`ライト`,standard:`標準`,rich:`リッチ`,max:`最大`,desktop:`Desktop`},presetCost:{minimal:`1× コスト · 最速の初回トークン · スペック読み込みなし`,light:`1.3× コスト · Specrails スペックを読み込み`,standard:`1.6× コスト · Specrails + OpenSpec スペックを読み込み`,rich:`2× コスト · リポジトリ全体の読み取りアクセス`,max:`4× コスト · 全読み取り + Contract Layer 改良`,desktop:`4–6× コスト · 全機能 + プロジェクトおよび承認済み MCP`},smashCapable:`SMASH 対応`,smashHint:`Contract Layer が有効なため、このスペックは後で Sub-Spec に分解できます。`,fineTune:`微調整`,defaultLabel:`コンテキストスコープ`,summaryMinimal:`最小`,tags:{specrails:`specrails`,openspec:`openspec`,codebase:`codebase`,mcp:`mcp`,myMcp:`my-mcp`,contract:`contract`},checks:{specrailsLabel:`specrails チケット`,openspecLabel:`openspec スペック`,fullLabel:`コードベース全体`,mcpLabel:`プロジェクト MCP`,mcpHint:`.mcp.json のサーバー`,userMcpLabel:`承認済みの MCP`,userMcpHint:`~/.claude のサーバー`,userMcpTooltip:`ローカルで承認済みの MCP サーバー(claude mcp add)`,exploreOnly:`Explore モードのみ`,providerUnsupported:`{{provider}} では利用できません`,contractLabel:`Contract Layer で強化`,contractHint:`コミット後の改良 · SMASH を有効化`}},r={label:`AI エンジン`,notSignedIn:`未ログイン`,localEngine:`ローカルエンジン`},i={presetHeading:`モデルプリセット`,preset:{balanced:{label:`バランス`,description:`全エージェントに {{model}}(推奨)`},budget:{label:`節約`,description:`全エージェントに {{model}} — 3倍安く、高速`},max:{label:`最大`,description:`アーキテクトと PM に {{topModel}}、その他に {{baseModel}}`}},overridesHeading:`エージェント別モデルオーバーライド`,overriddenCount:`{{count}} 件オーバーライド`,customBadge:`カスタム`,resetToDefault:`プリセットのデフォルトに戻す`},a={alias:`Claude Code エイリアス: {{alias}}`,tier:{balanced:`バランス`,mostCapable:`最高性能`,fastest:`最速`,frontier:`フロンティア`}},o={heading:`コスト認識`,meterAriaLabel:`コストティア`,estimateUnavailable:`ティアのみ — 見積もり不可`},s={heading:`推奨コマンド`,run:`実行`,dismiss:`閉じる`},c={serverError:`サーバーエラー ({{status}})`,connectionFailed:`接続に失敗しました: {{message}}`,sendRefinementFailed:`改良の送信に失敗しました`,createIssueFailed:`Issue の作成に失敗しました`},l={proposeModal:e,featureProposal:t,contextScope:n,aiEngine:r,modelSelector:i,modelCombobox:a,costMeter:o,commandProposal:s,errors:c};export{r as aiEngine,s as commandProposal,n as contextScope,o as costMeter,l as default,c as errors,t as featureProposal,a as modelCombobox,i as modelSelector,e as proposeModal};
@@ -1 +1 @@
1
- var e={title:`添加 Spec`,dialogDescription:`用一句简短想法创建新 spec——可立即生成,也可通过 Explore 模式打磨。`,engineAriaLabel:`此 spec 使用的 AI 引擎`,modeTablistLabel:`Spec 创建模式`,mode:{quick:`Quick`,explore:`Explore`,raw:`Raw`,exploreHint:`交互式`,rawHint:`无 AI`,quickUnavailable:`Kimi 不可用`},modeDescription:{quick:`描述功能或改动。可附上原型图、简报或数据以提供更多上下文。`,explore:`描述一个粗略的想法。所选 AI 助手会通过对话帮你打磨——由你决定何时提交。`,raw:`你的 prompt 原样保存为 spec 工单。现在不运行 AI;拖到 rail 上即可开始构建。`},editorPlaceholder:{quick:`例如:在设置页添加深色模式开关,并持久化用户偏好…`,explore:`例如:深色模式——还不确定开关放在哪里、偏好如何持久化…`,raw:`描述功能、改动或想法。支持 Markdown、图片和文件…`},ideaAriaLabel:`Spec 想法`,raw:{titleLabel:`标题`,titlePlaceholder:`将根据你的 prompt 自动填充…`,priorityLabel:`优先级`,labelsLabel:`标签`,removeLabel:`移除标签 {{label}}`,addLabelAria:`添加标签`,labelPlaceholder:`可选…`,bodyAriaLabel:`Raw spec 正文`},priority:{critical:`紧急`,high:`高`,medium:`中`,low:`低`},fromWebsite:`从网站创建`,fromWebsiteTitle:`打开真实网页,框选一块区域,把它变成 spec`,capture:{responsiveSizes_one:`响应式 · {{count}} 个尺寸`,responsiveSizes_other:`响应式 · {{count}} 个尺寸`},submit:{quick:`生成 Spec`,explore:`继续`,raw:`创建`,disabledTitle:`请先输入 prompt`},toast:{createFailed:`创建 spec 失败`,rawSavedWithId:`已保存为 #{{id}} · Raw spec 可放入 rail`,rawCreated:`Raw spec 已创建`,exploreNotWired:`此视图未接入 Explore 模式`,generating:`正在生成…`,failedToStart:`{{projectName}} · 启动失败`,unsupportedFileType:`不支持的文件类型:{{name}}`,uploadFailed:`{{name}} 上传失败:{{message}}`}},t={title:`提议一个功能`,ideaIntro:`用自然语言描述你的想法。Claude 会阅读代码库并将其整理成完整提案。`,ideaAriaLabel:`功能想法`,ideaPlaceholder:`例如:我希望用户可以设置预算提醒,当 API 成本超过阈值时收到通知…`,cmdEnterToSubmit:`Cmd+Enter 提交`,exploreIdea:`探索想法`,exploringTitle:`正在探索你的想法…`,refiningTitle:`正在完善提案…`,reviewTitle:`审阅提案`,readingCodebase_one:`正在阅读代码库…(已浏览 {{count}} 个文件)`,readingCodebase_other:`正在阅读代码库…(已浏览 {{count}} 个文件)`,refinementAriaLabel:`完善反馈`,refinementPlaceholder:`提出修改、添加约束、调整范围…`,sendRefinementTitle:`发送完善意见(Cmd+Enter)`,cmdEnterToSend:`Cmd+Enter 发送`,confirmCreateIssue:`根据此提案创建 GitHub Issue?`,yesCreateIssue:`是,创建 Issue`,createGithubIssue:`创建 GitHub Issue`,startOver:`重新开始`,creatingIssueTitle:`正在创建 GitHub Issue…`,creatingIssueViaCli:`正在通过 GitHub CLI 创建 Issue…`,issueCreated:`Issue 已创建`,proposeAnother:`再提一个`,errorTitle:`出错了`,errorFallback:`发生错误`,tryAgain:`重试`,cancelledTitle:`已取消`,cancelledBody:`提案已取消。`},n={heading:`上下文感知`,custom:`自定义`,customMix:`自定义组合——见下方“微调”`,estimateUnavailable:`{{tier}} · 无法估算`,preset:{minimal:`极简`,light:`轻量`,standard:`标准`,rich:`丰富`,max:`最大`,desktop:`Desktop`},presetCost:{minimal:`1× 成本 · 首 token 最快 · 不加载 spec`,light:`1.3× 成本 · 加载 Specrails spec`,standard:`1.6× 成本 · 加载 Specrails + OpenSpec spec`,rich:`2× 成本 · 完整仓库读取权限`,max:`4× 成本 · 完整读取 + Contract Layer 增强`,desktop:`4–6× 成本 · 全部功能 + 项目及你已批准的 MCP`},smashCapable:`支持 SMASH`,smashHint:`已启用 Contract Layer,此 spec 之后可以被拆解为子 spec。`,fineTune:`微调`,defaultLabel:`上下文范围`,summaryMinimal:`极简`,tags:{specrails:`specrails`,openspec:`openspec`,codebase:`codebase`,mcp:`mcp`,myMcp:`my-mcp`,contract:`contract`},checks:{specrailsLabel:`specrails 工单`,openspecLabel:`openspec spec`,fullLabel:`完整代码库`,mcpLabel:`项目 MCP`,mcpHint:`.mcp.json 服务器`,userMcpLabel:`我已批准的 MCP`,userMcpHint:`~/.claude 服务器`,userMcpTooltip:`你在本地批准的 MCP 服务器(claude mcp add)`,exploreOnly:`仅限 Explore 模式`,providerUnsupported:`{{provider}} 不支持此功能`,contractLabel:`用 Contract Layer 增强`,contractHint:`提交后增强 · 启用 SMASH`}},r={label:`AI 引擎`,notSignedIn:`未登录`},i={presetHeading:`模型预设`,preset:{balanced:{label:`均衡`,description:`所有 Agent 使用 {{model}}(推荐)`},budget:{label:`经济`,description:`所有 Agent 使用 {{model}}——便宜 3 倍、更快`},max:{label:`最强`,description:`架构师 + PM 使用 {{topModel}},其余使用 {{baseModel}}`}},overridesHeading:`按 Agent 覆写模型`,overriddenCount:`已覆写 {{count}} 个`,customBadge:`自定义`,resetToDefault:`重置为预设默认值`},a={alias:`Claude Code 别名:{{alias}}`,tier:{balanced:`均衡`,mostCapable:`能力最强`,fastest:`最快`,frontier:`前沿`}},o={heading:`成本感知`,meterAriaLabel:`成本级别`,estimateUnavailable:`仅显示级别——无法估算`},s={heading:`建议的命令`,run:`运行`,dismiss:`忽略`},c={serverError:`服务器错误({{status}})`,connectionFailed:`连接失败:{{message}}`,sendRefinementFailed:`发送完善意见失败`,createIssueFailed:`创建 Issue 失败`},l={proposeModal:e,featureProposal:t,contextScope:n,aiEngine:r,modelSelector:i,modelCombobox:a,costMeter:o,commandProposal:s,errors:c};export{r as aiEngine,s as commandProposal,n as contextScope,o as costMeter,l as default,c as errors,t as featureProposal,a as modelCombobox,i as modelSelector,e as proposeModal};
1
+ var e={title:`添加 Spec`,dialogDescription:`用一句简短想法创建新 spec——可立即生成,也可通过 Explore 模式打磨。`,engineAriaLabel:`此 spec 使用的 AI 引擎`,modeTablistLabel:`Spec 创建模式`,mode:{quick:`Quick`,explore:`Explore`,raw:`Raw`,exploreHint:`交互式`,rawHint:`无 AI`,quickUnavailable:`Kimi 不可用`},modeDescription:{quick:`描述功能或改动。可附上原型图、简报或数据以提供更多上下文。`,explore:`描述一个粗略的想法。所选 AI 助手会通过对话帮你打磨——由你决定何时提交。`,raw:`你的 prompt 原样保存为 spec 工单。现在不运行 AI;拖到 rail 上即可开始构建。`},editorPlaceholder:{quick:`例如:在设置页添加深色模式开关,并持久化用户偏好…`,explore:`例如:深色模式——还不确定开关放在哪里、偏好如何持久化…`,raw:`描述功能、改动或想法。支持 Markdown、图片和文件…`},ideaAriaLabel:`Spec 想法`,raw:{titleLabel:`标题`,titlePlaceholder:`将根据你的 prompt 自动填充…`,priorityLabel:`优先级`,labelsLabel:`标签`,removeLabel:`移除标签 {{label}}`,addLabelAria:`添加标签`,labelPlaceholder:`可选…`,bodyAriaLabel:`Raw spec 正文`},priority:{critical:`紧急`,high:`高`,medium:`中`,low:`低`},fromWebsite:`从网站创建`,fromWebsiteTitle:`打开真实网页,框选一块区域,把它变成 spec`,capture:{responsiveSizes_one:`响应式 · {{count}} 个尺寸`,responsiveSizes_other:`响应式 · {{count}} 个尺寸`},submit:{quick:`生成 Spec`,explore:`继续`,raw:`创建`,disabledTitle:`请先输入 prompt`},toast:{createFailed:`创建 spec 失败`,rawSavedWithId:`已保存为 #{{id}} · Raw spec 可放入 rail`,rawCreated:`Raw spec 已创建`,exploreNotWired:`此视图未接入 Explore 模式`,generating:`正在生成…`,failedToStart:`{{projectName}} · 启动失败`,unsupportedFileType:`不支持的文件类型:{{name}}`,uploadFailed:`{{name}} 上传失败:{{message}}`}},t={title:`提议一个功能`,ideaIntro:`用自然语言描述你的想法。Claude 会阅读代码库并将其整理成完整提案。`,ideaAriaLabel:`功能想法`,ideaPlaceholder:`例如:我希望用户可以设置预算提醒,当 API 成本超过阈值时收到通知…`,cmdEnterToSubmit:`Cmd+Enter 提交`,exploreIdea:`探索想法`,exploringTitle:`正在探索你的想法…`,refiningTitle:`正在完善提案…`,reviewTitle:`审阅提案`,readingCodebase_one:`正在阅读代码库…(已浏览 {{count}} 个文件)`,readingCodebase_other:`正在阅读代码库…(已浏览 {{count}} 个文件)`,refinementAriaLabel:`完善反馈`,refinementPlaceholder:`提出修改、添加约束、调整范围…`,sendRefinementTitle:`发送完善意见(Cmd+Enter)`,cmdEnterToSend:`Cmd+Enter 发送`,confirmCreateIssue:`根据此提案创建 GitHub Issue?`,yesCreateIssue:`是,创建 Issue`,createGithubIssue:`创建 GitHub Issue`,startOver:`重新开始`,creatingIssueTitle:`正在创建 GitHub Issue…`,creatingIssueViaCli:`正在通过 GitHub CLI 创建 Issue…`,issueCreated:`Issue 已创建`,proposeAnother:`再提一个`,errorTitle:`出错了`,errorFallback:`发生错误`,tryAgain:`重试`,cancelledTitle:`已取消`,cancelledBody:`提案已取消。`},n={heading:`上下文感知`,custom:`自定义`,customMix:`自定义组合——见下方“微调”`,estimateUnavailable:`{{tier}} · 无法估算`,preset:{minimal:`极简`,light:`轻量`,standard:`标准`,rich:`丰富`,max:`最大`,desktop:`Desktop`},presetCost:{minimal:`1× 成本 · 首 token 最快 · 不加载 spec`,light:`1.3× 成本 · 加载 Specrails spec`,standard:`1.6× 成本 · 加载 Specrails + OpenSpec spec`,rich:`2× 成本 · 完整仓库读取权限`,max:`4× 成本 · 完整读取 + Contract Layer 增强`,desktop:`4–6× 成本 · 全部功能 + 项目及你已批准的 MCP`},smashCapable:`支持 SMASH`,smashHint:`已启用 Contract Layer,此 spec 之后可以被拆解为子 spec。`,fineTune:`微调`,defaultLabel:`上下文范围`,summaryMinimal:`极简`,tags:{specrails:`specrails`,openspec:`openspec`,codebase:`codebase`,mcp:`mcp`,myMcp:`my-mcp`,contract:`contract`},checks:{specrailsLabel:`specrails 工单`,openspecLabel:`openspec spec`,fullLabel:`完整代码库`,mcpLabel:`项目 MCP`,mcpHint:`.mcp.json 服务器`,userMcpLabel:`我已批准的 MCP`,userMcpHint:`~/.claude 服务器`,userMcpTooltip:`你在本地批准的 MCP 服务器(claude mcp add)`,exploreOnly:`仅限 Explore 模式`,providerUnsupported:`{{provider}} 不支持此功能`,contractLabel:`用 Contract Layer 增强`,contractHint:`提交后增强 · 启用 SMASH`}},r={label:`AI 引擎`,notSignedIn:`未登录`,localEngine:`本地引擎`},i={presetHeading:`模型预设`,preset:{balanced:{label:`均衡`,description:`所有 Agent 使用 {{model}}(推荐)`},budget:{label:`经济`,description:`所有 Agent 使用 {{model}}——便宜 3 倍、更快`},max:{label:`最强`,description:`架构师 + PM 使用 {{topModel}},其余使用 {{baseModel}}`}},overridesHeading:`按 Agent 覆写模型`,overriddenCount:`已覆写 {{count}} 个`,customBadge:`自定义`,resetToDefault:`重置为预设默认值`},a={alias:`Claude Code 别名:{{alias}}`,tier:{balanced:`均衡`,mostCapable:`能力最强`,fastest:`最快`,frontier:`前沿`}},o={heading:`成本感知`,meterAriaLabel:`成本级别`,estimateUnavailable:`仅显示级别——无法估算`},s={heading:`建议的命令`,run:`运行`,dismiss:`忽略`},c={serverError:`服务器错误({{status}})`,connectionFailed:`连接失败:{{message}}`,sendRefinementFailed:`发送完善意见失败`,createIssueFailed:`创建 Issue 失败`},l={proposeModal:e,featureProposal:t,contextScope:n,aiEngine:r,modelSelector:i,modelCombobox:a,costMeter:o,commandProposal:s,errors:c};export{r as aiEngine,s as commandProposal,n as contextScope,o as costMeter,l as default,c as errors,t as featureProposal,a as modelCombobox,i as modelSelector,e as proposeModal};
@@ -1 +1 @@
1
- var e={title:`Añadir spec`,dialogDescription:`Crea una nueva spec a partir de una idea breve, ya sea al instante o mediante el modo Explore.`,engineAriaLabel:`Motor de IA para esta spec`,modeTablistLabel:`Modo de creación de la spec`,mode:{quick:`Quick`,explore:`Explore`,raw:`Raw`,exploreHint:`interactivo`,rawHint:`sin IA`,quickUnavailable:`no disponible para Kimi`},modeDescription:{quick:`Describe la funcionalidad o el cambio. Adjunta mockups, briefs o datos para dar más contexto.`,explore:`Describe una idea aproximada. El asistente de IA seleccionado te ayudará a darle forma conversando — tú decides cuándo confirmarla.`,raw:`Tu prompt, tal cual — guardado como ticket de spec. No se ejecuta IA ahora; arrástralo a un rail para construirlo.`},editorPlaceholder:{quick:`p. ej. Añade un interruptor de modo oscuro a la página de ajustes que recuerde la preferencia del usuario...`,explore:`p. ej. modo oscuro — no tengo claro dónde colocar el interruptor ni cómo persistirlo…`,raw:`Describe la funcionalidad, el cambio o la idea. Admite Markdown, imágenes y archivos…`},ideaAriaLabel:`Idea de la spec`,raw:{titleLabel:`Título`,titlePlaceholder:`Se autocompleta a partir de tu prompt…`,priorityLabel:`Prioridad`,labelsLabel:`Etiquetas`,removeLabel:`Quitar etiqueta {{label}}`,addLabelAria:`Añadir etiqueta`,labelPlaceholder:`opcional…`,bodyAriaLabel:`Cuerpo de la spec Raw`},priority:{critical:`Crítica`,high:`Alta`,medium:`Media`,low:`Baja`},fromWebsite:`Desde una web`,fromWebsiteTitle:`Abre una página web real, selecciona un área y conviértela en una spec`,capture:{responsiveSizes_one:`Responsive · {{count}} tamaño`,responsiveSizes_other:`Responsive · {{count}} tamaños`},submit:{quick:`Generar spec`,explore:`Continuar`,raw:`Crear`,disabledTitle:`Escribe primero un prompt`},toast:{createFailed:`No se pudo crear la spec`,rawSavedWithId:`Guardada como #{{id}} · Spec Raw lista para los rails`,rawCreated:`Spec Raw creada`,exploreNotWired:`El modo Explore no está disponible en esta vista`,generating:`Generando...`,failedToStart:`{{projectName}} · Error al iniciar`,unsupportedFileType:`Tipo de archivo no compatible: {{name}}`,uploadFailed:`Error al subir {{name}}: {{message}}`}},t={title:`Proponer una funcionalidad`,ideaIntro:`Describe tu idea en lenguaje natural. Claude leerá el código y la estructurará en una propuesta completa.`,ideaAriaLabel:`Idea de funcionalidad`,ideaPlaceholder:`p. ej. Quiero que los usuarios puedan configurar una alerta de presupuesto para recibir un aviso cuando los costes de la API superen un umbral...`,cmdEnterToSubmit:`Cmd+Enter para enviar`,exploreIdea:`Explorar idea`,exploringTitle:`Explorando tu idea...`,refiningTitle:`Refinando la propuesta...`,reviewTitle:`Revisar propuesta`,readingCodebase_one:`Leyendo el código... ({{count}} archivo explorado)`,readingCodebase_other:`Leyendo el código... ({{count}} archivos explorados)`,refinementAriaLabel:`Comentarios de refinamiento`,refinementPlaceholder:`Pide cambios, añade restricciones, ajusta el alcance...`,sendRefinementTitle:`Enviar refinamiento (Cmd+Enter)`,cmdEnterToSend:`Cmd+Enter para enviar`,confirmCreateIssue:`¿Crear un issue de GitHub a partir de esta propuesta?`,yesCreateIssue:`Sí, crear issue`,createGithubIssue:`Crear issue de GitHub`,startOver:`Empezar de nuevo`,creatingIssueTitle:`Creando issue de GitHub...`,creatingIssueViaCli:`Creando el issue con la CLI de GitHub...`,issueCreated:`Issue creado`,proposeAnother:`Proponer otra`,errorTitle:`Algo ha ido mal`,errorFallback:`Se ha producido un error`,tryAgain:`Reintentar`,cancelledTitle:`Cancelado`,cancelledBody:`La propuesta se ha cancelado.`},n={heading:`Conocimiento del contexto`,custom:`Personalizado`,customMix:`Combinación personalizada — ver Ajuste fino abajo`,estimateUnavailable:`{{tier}} · estimación no disponible`,preset:{minimal:`Mínimo`,light:`Ligero`,standard:`Estándar`,rich:`Amplio`,max:`Max`,desktop:`Desktop`},presetCost:{minimal:`Coste 1× · primer token más rápido · sin specs cargadas`,light:`Coste 1,3× · specs de Specrails cargadas`,standard:`Coste 1,6× · specs de Specrails + OpenSpec cargadas`,rich:`Coste 2× · acceso de lectura a todo el repo`,max:`Coste 4× · lectura completa + refinamiento de Contract Layer`,desktop:`Coste 4–6× · todas las funciones + MCP del proyecto y tus MCP aprobados`},smashCapable:`Compatible con SMASH`,smashHint:`La Contract Layer está activada, así que esta spec podrá descomponerse después en Sub-Specs.`,fineTune:`Ajuste fino`,defaultLabel:`Alcance del contexto`,summaryMinimal:`mínimo`,tags:{specrails:`specrails`,openspec:`openspec`,codebase:`codebase`,mcp:`mcp`,myMcp:`my-mcp`,contract:`contract`},checks:{specrailsLabel:`tickets de specrails`,openspecLabel:`specs de openspec`,fullLabel:`Código completo`,mcpLabel:`MCP del proyecto`,mcpHint:`servidores de .mcp.json`,userMcpLabel:`Mis MCP aprobados`,userMcpHint:`servidores de ~/.claude`,userMcpTooltip:`Tus servidores MCP aprobados en local (claude mcp add)`,exploreOnly:`Solo en modo Explore`,providerUnsupported:`No disponible para {{provider}}`,contractLabel:`Enriquecer con Contract Layer`,contractHint:`refinamiento post-commit · habilita SMASH`}},r={label:`Motor de IA`,notSignedIn:`Sin iniciar sesión`},i={presetHeading:`Preset de modelo`,preset:{balanced:{label:`Equilibrado`,description:`{{model}} para todos los agentes (recomendado)`},budget:{label:`Económico`,description:`{{model}} para todos los agentes — 3× más barato y rápido`},max:{label:`Max`,description:`{{topModel}} para arquitecto + PM, {{baseModel}} para el resto`}},overridesHeading:`Modelo por agente`,overriddenCount:`{{count}} modificados`,customBadge:`personalizado`,resetToDefault:`Restablecer al valor del preset`},a={alias:`Alias en Claude Code: {{alias}}`,tier:{balanced:`Equilibrado`,mostCapable:`Más capaz`,fastest:`Más rápido`,frontier:`Frontier`}},o={heading:`Indicador de coste`,meterAriaLabel:`nivel de coste`,estimateUnavailable:`solo nivel — estimación no disponible`},s={heading:`Comando sugerido`,run:`Ejecutar`,dismiss:`Descartar`},c={serverError:`Error del servidor ({{status}})`,connectionFailed:`Error de conexión: {{message}}`,sendRefinementFailed:`No se pudo enviar el refinamiento`,createIssueFailed:`No se pudo crear el issue`},l={proposeModal:e,featureProposal:t,contextScope:n,aiEngine:r,modelSelector:i,modelCombobox:a,costMeter:o,commandProposal:s,errors:c};export{r as aiEngine,s as commandProposal,n as contextScope,o as costMeter,l as default,c as errors,t as featureProposal,a as modelCombobox,i as modelSelector,e as proposeModal};
1
+ var e={title:`Añadir spec`,dialogDescription:`Crea una nueva spec a partir de una idea breve, ya sea al instante o mediante el modo Explore.`,engineAriaLabel:`Motor de IA para esta spec`,modeTablistLabel:`Modo de creación de la spec`,mode:{quick:`Quick`,explore:`Explore`,raw:`Raw`,exploreHint:`interactivo`,rawHint:`sin IA`,quickUnavailable:`no disponible para Kimi`},modeDescription:{quick:`Describe la funcionalidad o el cambio. Adjunta mockups, briefs o datos para dar más contexto.`,explore:`Describe una idea aproximada. El asistente de IA seleccionado te ayudará a darle forma conversando — tú decides cuándo confirmarla.`,raw:`Tu prompt, tal cual — guardado como ticket de spec. No se ejecuta IA ahora; arrástralo a un rail para construirlo.`},editorPlaceholder:{quick:`p. ej. Añade un interruptor de modo oscuro a la página de ajustes que recuerde la preferencia del usuario...`,explore:`p. ej. modo oscuro — no tengo claro dónde colocar el interruptor ni cómo persistirlo…`,raw:`Describe la funcionalidad, el cambio o la idea. Admite Markdown, imágenes y archivos…`},ideaAriaLabel:`Idea de la spec`,raw:{titleLabel:`Título`,titlePlaceholder:`Se autocompleta a partir de tu prompt…`,priorityLabel:`Prioridad`,labelsLabel:`Etiquetas`,removeLabel:`Quitar etiqueta {{label}}`,addLabelAria:`Añadir etiqueta`,labelPlaceholder:`opcional…`,bodyAriaLabel:`Cuerpo de la spec Raw`},priority:{critical:`Crítica`,high:`Alta`,medium:`Media`,low:`Baja`},fromWebsite:`Desde una web`,fromWebsiteTitle:`Abre una página web real, selecciona un área y conviértela en una spec`,capture:{responsiveSizes_one:`Responsive · {{count}} tamaño`,responsiveSizes_other:`Responsive · {{count}} tamaños`},submit:{quick:`Generar spec`,explore:`Continuar`,raw:`Crear`,disabledTitle:`Escribe primero un prompt`},toast:{createFailed:`No se pudo crear la spec`,rawSavedWithId:`Guardada como #{{id}} · Spec Raw lista para los rails`,rawCreated:`Spec Raw creada`,exploreNotWired:`El modo Explore no está disponible en esta vista`,generating:`Generando...`,failedToStart:`{{projectName}} · Error al iniciar`,unsupportedFileType:`Tipo de archivo no compatible: {{name}}`,uploadFailed:`Error al subir {{name}}: {{message}}`}},t={title:`Proponer una funcionalidad`,ideaIntro:`Describe tu idea en lenguaje natural. Claude leerá el código y la estructurará en una propuesta completa.`,ideaAriaLabel:`Idea de funcionalidad`,ideaPlaceholder:`p. ej. Quiero que los usuarios puedan configurar una alerta de presupuesto para recibir un aviso cuando los costes de la API superen un umbral...`,cmdEnterToSubmit:`Cmd+Enter para enviar`,exploreIdea:`Explorar idea`,exploringTitle:`Explorando tu idea...`,refiningTitle:`Refinando la propuesta...`,reviewTitle:`Revisar propuesta`,readingCodebase_one:`Leyendo el código... ({{count}} archivo explorado)`,readingCodebase_other:`Leyendo el código... ({{count}} archivos explorados)`,refinementAriaLabel:`Comentarios de refinamiento`,refinementPlaceholder:`Pide cambios, añade restricciones, ajusta el alcance...`,sendRefinementTitle:`Enviar refinamiento (Cmd+Enter)`,cmdEnterToSend:`Cmd+Enter para enviar`,confirmCreateIssue:`¿Crear un issue de GitHub a partir de esta propuesta?`,yesCreateIssue:`Sí, crear issue`,createGithubIssue:`Crear issue de GitHub`,startOver:`Empezar de nuevo`,creatingIssueTitle:`Creando issue de GitHub...`,creatingIssueViaCli:`Creando el issue con la CLI de GitHub...`,issueCreated:`Issue creado`,proposeAnother:`Proponer otra`,errorTitle:`Algo ha ido mal`,errorFallback:`Se ha producido un error`,tryAgain:`Reintentar`,cancelledTitle:`Cancelado`,cancelledBody:`La propuesta se ha cancelado.`},n={heading:`Conocimiento del contexto`,custom:`Personalizado`,customMix:`Combinación personalizada — ver Ajuste fino abajo`,estimateUnavailable:`{{tier}} · estimación no disponible`,preset:{minimal:`Mínimo`,light:`Ligero`,standard:`Estándar`,rich:`Amplio`,max:`Max`,desktop:`Desktop`},presetCost:{minimal:`Coste 1× · primer token más rápido · sin specs cargadas`,light:`Coste 1,3× · specs de Specrails cargadas`,standard:`Coste 1,6× · specs de Specrails + OpenSpec cargadas`,rich:`Coste 2× · acceso de lectura a todo el repo`,max:`Coste 4× · lectura completa + refinamiento de Contract Layer`,desktop:`Coste 4–6× · todas las funciones + MCP del proyecto y tus MCP aprobados`},smashCapable:`Compatible con SMASH`,smashHint:`La Contract Layer está activada, así que esta spec podrá descomponerse después en Sub-Specs.`,fineTune:`Ajuste fino`,defaultLabel:`Alcance del contexto`,summaryMinimal:`mínimo`,tags:{specrails:`specrails`,openspec:`openspec`,codebase:`codebase`,mcp:`mcp`,myMcp:`my-mcp`,contract:`contract`},checks:{specrailsLabel:`tickets de specrails`,openspecLabel:`specs de openspec`,fullLabel:`Código completo`,mcpLabel:`MCP del proyecto`,mcpHint:`servidores de .mcp.json`,userMcpLabel:`Mis MCP aprobados`,userMcpHint:`servidores de ~/.claude`,userMcpTooltip:`Tus servidores MCP aprobados en local (claude mcp add)`,exploreOnly:`Solo en modo Explore`,providerUnsupported:`No disponible para {{provider}}`,contractLabel:`Enriquecer con Contract Layer`,contractHint:`refinamiento post-commit · habilita SMASH`}},r={label:`Motor de IA`,notSignedIn:`Sin iniciar sesión`,localEngine:`Motor local`},i={presetHeading:`Preset de modelo`,preset:{balanced:{label:`Equilibrado`,description:`{{model}} para todos los agentes (recomendado)`},budget:{label:`Económico`,description:`{{model}} para todos los agentes — 3× más barato y rápido`},max:{label:`Max`,description:`{{topModel}} para arquitecto + PM, {{baseModel}} para el resto`}},overridesHeading:`Modelo por agente`,overriddenCount:`{{count}} modificados`,customBadge:`personalizado`,resetToDefault:`Restablecer al valor del preset`},a={alias:`Alias en Claude Code: {{alias}}`,tier:{balanced:`Equilibrado`,mostCapable:`Más capaz`,fastest:`Más rápido`,frontier:`Frontier`}},o={heading:`Indicador de coste`,meterAriaLabel:`nivel de coste`,estimateUnavailable:`solo nivel — estimación no disponible`},s={heading:`Comando sugerido`,run:`Ejecutar`,dismiss:`Descartar`},c={serverError:`Error del servidor ({{status}})`,connectionFailed:`Error de conexión: {{message}}`,sendRefinementFailed:`No se pudo enviar el refinamiento`,createIssueFailed:`No se pudo crear el issue`},l={proposeModal:e,featureProposal:t,contextScope:n,aiEngine:r,modelSelector:i,modelCombobox:a,costMeter:o,commandProposal:s,errors:c};export{r as aiEngine,s as commandProposal,n as contextScope,o as costMeter,l as default,c as errors,t as featureProposal,a as modelCombobox,i as modelSelector,e as proposeModal};
@@ -1 +1 @@
1
- var e={title:`Aggiungi spec`,dialogDescription:`Crea una nuova spec da un'idea breve, subito oppure tramite la modalità Explore.`,engineAriaLabel:`Engine AI per questa spec`,modeTablistLabel:`Modalità di creazione della spec`,mode:{quick:`Quick`,explore:`Explore`,raw:`Raw`,exploreHint:`interattiva`,rawHint:`senza AI`,quickUnavailable:`non disponibile per Kimi`},modeDescription:{quick:`Descrivi la funzionalità o la modifica. Allega mockup, brief o dati per più contesto.`,explore:`Descrivi un'idea abbozzata. L'assistente IA selezionato ti aiuterà a darle forma attraverso la conversazione — decidi tu quando confermare.`,raw:`Il tuo prompt, così com'è — salvato come ticket spec. Nessuna AI per ora; trascinalo su un rail per realizzarlo.`},editorPlaceholder:{quick:`es. Aggiungi un toggle per la dark mode nella pagina impostazioni che memorizzi la preferenza dell'utente...`,explore:`es. dark mode — non so bene dove mettere il toggle né come salvare la preferenza…`,raw:`Descrivi la funzionalità, la modifica o l'idea. Supporta Markdown, immagini e file…`},ideaAriaLabel:`Idea della spec`,raw:{titleLabel:`Titolo`,titlePlaceholder:`Compilato automaticamente dal tuo prompt…`,priorityLabel:`Priorità`,labelsLabel:`Etichette`,removeLabel:`Rimuovi etichetta {{label}}`,addLabelAria:`Aggiungi etichetta`,labelPlaceholder:`facoltativa…`,bodyAriaLabel:`Corpo della spec Raw`},priority:{critical:`Critica`,high:`Alta`,medium:`Media`,low:`Bassa`},fromWebsite:`Da un sito web`,fromWebsiteTitle:`Apri una pagina web reale, seleziona un'area e trasformala in una spec`,capture:{responsiveSizes_one:`Responsive · {{count}} dimensione`,responsiveSizes_other:`Responsive · {{count}} dimensioni`},submit:{quick:`Genera spec`,explore:`Continua`,raw:`Crea`,disabledTitle:`Scrivi prima un prompt`},toast:{createFailed:`Impossibile creare la spec`,rawSavedWithId:`Salvata come #{{id}} · Spec Raw pronta per i rail`,rawCreated:`Spec Raw creata`,exploreNotWired:`La modalità Explore non è collegata in questa vista`,generating:`Generazione...`,failedToStart:`{{projectName}} · Avvio non riuscito`,unsupportedFileType:`Tipo di file non supportato: {{name}}`,uploadFailed:`Caricamento non riuscito per {{name}}: {{message}}`}},t={title:`Proponi una funzionalità`,ideaIntro:`Descrivi la tua idea in linguaggio semplice. Claude leggerà il codebase e la strutturerà in una proposta completa.`,ideaAriaLabel:`Idea di funzionalità`,ideaPlaceholder:`es. Voglio che gli utenti possano impostare un avviso di budget per ricevere una notifica quando i costi API superano una soglia...`,cmdEnterToSubmit:`Cmd+Invio per inviare`,exploreIdea:`Esplora l'idea`,exploringTitle:`Esplorazione dell'idea...`,refiningTitle:`Raffinamento della proposta...`,reviewTitle:`Rivedi la proposta`,readingCodebase_one:`Lettura del codebase... ({{count}} file esplorato)`,readingCodebase_other:`Lettura del codebase... ({{count}} file esplorati)`,refinementAriaLabel:`Feedback di raffinamento`,refinementPlaceholder:`Chiedi modifiche, aggiungi vincoli, affina lo scope...`,sendRefinementTitle:`Invia raffinamento (Cmd+Invio)`,cmdEnterToSend:`Cmd+Invio per inviare`,confirmCreateIssue:`Creare una Issue GitHub da questa proposta?`,yesCreateIssue:`Sì, crea la issue`,createGithubIssue:`Crea Issue GitHub`,startOver:`Ricomincia`,creatingIssueTitle:`Creazione della Issue GitHub...`,creatingIssueViaCli:`Creazione della issue tramite GitHub CLI...`,issueCreated:`Issue creata`,proposeAnother:`Proponi un'altra`,errorTitle:`Qualcosa è andato storto`,errorFallback:`Si è verificato un errore`,tryAgain:`Riprova`,cancelledTitle:`Annullata`,cancelledBody:`La proposta è stata annullata.`},n={heading:`Consapevolezza del contesto`,custom:`Personalizzato`,customMix:`Mix personalizzato — vedi Fine-tune qui sotto`,estimateUnavailable:`{{tier}} · stima non disponibile`,preset:{minimal:`Minimo`,light:`Leggero`,standard:`Standard`,rich:`Ricco`,max:`Max`,desktop:`Desktop`},presetCost:{minimal:`costo 1× · primo token più veloce · nessuna spec caricata`,light:`costo 1,3× · spec Specrails caricate`,standard:`costo 1,6× · spec Specrails + OpenSpec caricate`,rich:`costo 2× · accesso in lettura all'intero repo`,max:`costo 4× · lettura completa + raffinamento Contract Layer`,desktop:`costo 4–6× · tutte le funzionalità + MCP del progetto e i tuoi MCP approvati`},smashCapable:`Compatibile con SMASH`,smashHint:`Il Contract Layer è attivo, quindi questa spec potrà poi essere scomposta in Sub-Spec.`,fineTune:`Fine-tune`,defaultLabel:`Ambito del contesto`,summaryMinimal:`minimo`,tags:{specrails:`specrails`,openspec:`openspec`,codebase:`codebase`,mcp:`mcp`,myMcp:`my-mcp`,contract:`contract`},checks:{specrailsLabel:`ticket specrails`,openspecLabel:`spec openspec`,fullLabel:`Codebase completo`,mcpLabel:`MCP del progetto`,mcpHint:`server .mcp.json`,userMcpLabel:`I miei MCP approvati`,userMcpHint:`server ~/.claude`,userMcpTooltip:`I tuoi server MCP approvati localmente (claude mcp add)`,exploreOnly:`Solo modalità Explore`,providerUnsupported:`Non disponibile per {{provider}}`,contractLabel:`Arricchisci con Contract Layer`,contractHint:`raffinamento post-commit · abilita SMASH`}},r={label:`Engine AI`,notSignedIn:`Non connesso`},i={presetHeading:`Preset modello`,preset:{balanced:{label:`Bilanciato`,description:`{{model}} per tutti gli agenti (consigliato)`},budget:{label:`Budget`,description:`{{model}} per tutti gli agenti — 3× più economico, più veloce`},max:{label:`Max`,description:`{{topModel}} per architect + PM, {{baseModel}} per il resto`}},overridesHeading:`Override del modello per agente`,overriddenCount:`{{count}} sovrascritti`,customBadge:`custom`,resetToDefault:`Ripristina il default del preset`},a={alias:`Alias Claude Code: {{alias}}`,tier:{balanced:`Bilanciato`,mostCapable:`Più capace`,fastest:`Più veloce`,frontier:`Frontier`}},o={heading:`Consapevolezza dei costi`,meterAriaLabel:`livello di costo`,estimateUnavailable:`solo livello — stima non disponibile`},s={heading:`Comando suggerito`,run:`Esegui`,dismiss:`Ignora`},c={serverError:`Errore del server ({{status}})`,connectionFailed:`Connessione non riuscita: {{message}}`,sendRefinementFailed:`Impossibile inviare il raffinamento`,createIssueFailed:`Impossibile creare la issue`},l={proposeModal:e,featureProposal:t,contextScope:n,aiEngine:r,modelSelector:i,modelCombobox:a,costMeter:o,commandProposal:s,errors:c};export{r as aiEngine,s as commandProposal,n as contextScope,o as costMeter,l as default,c as errors,t as featureProposal,a as modelCombobox,i as modelSelector,e as proposeModal};
1
+ var e={title:`Aggiungi spec`,dialogDescription:`Crea una nuova spec da un'idea breve, subito oppure tramite la modalità Explore.`,engineAriaLabel:`Engine AI per questa spec`,modeTablistLabel:`Modalità di creazione della spec`,mode:{quick:`Quick`,explore:`Explore`,raw:`Raw`,exploreHint:`interattiva`,rawHint:`senza AI`,quickUnavailable:`non disponibile per Kimi`},modeDescription:{quick:`Descrivi la funzionalità o la modifica. Allega mockup, brief o dati per più contesto.`,explore:`Descrivi un'idea abbozzata. L'assistente IA selezionato ti aiuterà a darle forma attraverso la conversazione — decidi tu quando confermare.`,raw:`Il tuo prompt, così com'è — salvato come ticket spec. Nessuna AI per ora; trascinalo su un rail per realizzarlo.`},editorPlaceholder:{quick:`es. Aggiungi un toggle per la dark mode nella pagina impostazioni che memorizzi la preferenza dell'utente...`,explore:`es. dark mode — non so bene dove mettere il toggle né come salvare la preferenza…`,raw:`Descrivi la funzionalità, la modifica o l'idea. Supporta Markdown, immagini e file…`},ideaAriaLabel:`Idea della spec`,raw:{titleLabel:`Titolo`,titlePlaceholder:`Compilato automaticamente dal tuo prompt…`,priorityLabel:`Priorità`,labelsLabel:`Etichette`,removeLabel:`Rimuovi etichetta {{label}}`,addLabelAria:`Aggiungi etichetta`,labelPlaceholder:`facoltativa…`,bodyAriaLabel:`Corpo della spec Raw`},priority:{critical:`Critica`,high:`Alta`,medium:`Media`,low:`Bassa`},fromWebsite:`Da un sito web`,fromWebsiteTitle:`Apri una pagina web reale, seleziona un'area e trasformala in una spec`,capture:{responsiveSizes_one:`Responsive · {{count}} dimensione`,responsiveSizes_other:`Responsive · {{count}} dimensioni`},submit:{quick:`Genera spec`,explore:`Continua`,raw:`Crea`,disabledTitle:`Scrivi prima un prompt`},toast:{createFailed:`Impossibile creare la spec`,rawSavedWithId:`Salvata come #{{id}} · Spec Raw pronta per i rail`,rawCreated:`Spec Raw creata`,exploreNotWired:`La modalità Explore non è collegata in questa vista`,generating:`Generazione...`,failedToStart:`{{projectName}} · Avvio non riuscito`,unsupportedFileType:`Tipo di file non supportato: {{name}}`,uploadFailed:`Caricamento non riuscito per {{name}}: {{message}}`}},t={title:`Proponi una funzionalità`,ideaIntro:`Descrivi la tua idea in linguaggio semplice. Claude leggerà il codebase e la strutturerà in una proposta completa.`,ideaAriaLabel:`Idea di funzionalità`,ideaPlaceholder:`es. Voglio che gli utenti possano impostare un avviso di budget per ricevere una notifica quando i costi API superano una soglia...`,cmdEnterToSubmit:`Cmd+Invio per inviare`,exploreIdea:`Esplora l'idea`,exploringTitle:`Esplorazione dell'idea...`,refiningTitle:`Raffinamento della proposta...`,reviewTitle:`Rivedi la proposta`,readingCodebase_one:`Lettura del codebase... ({{count}} file esplorato)`,readingCodebase_other:`Lettura del codebase... ({{count}} file esplorati)`,refinementAriaLabel:`Feedback di raffinamento`,refinementPlaceholder:`Chiedi modifiche, aggiungi vincoli, affina lo scope...`,sendRefinementTitle:`Invia raffinamento (Cmd+Invio)`,cmdEnterToSend:`Cmd+Invio per inviare`,confirmCreateIssue:`Creare una Issue GitHub da questa proposta?`,yesCreateIssue:`Sì, crea la issue`,createGithubIssue:`Crea Issue GitHub`,startOver:`Ricomincia`,creatingIssueTitle:`Creazione della Issue GitHub...`,creatingIssueViaCli:`Creazione della issue tramite GitHub CLI...`,issueCreated:`Issue creata`,proposeAnother:`Proponi un'altra`,errorTitle:`Qualcosa è andato storto`,errorFallback:`Si è verificato un errore`,tryAgain:`Riprova`,cancelledTitle:`Annullata`,cancelledBody:`La proposta è stata annullata.`},n={heading:`Consapevolezza del contesto`,custom:`Personalizzato`,customMix:`Mix personalizzato — vedi Fine-tune qui sotto`,estimateUnavailable:`{{tier}} · stima non disponibile`,preset:{minimal:`Minimo`,light:`Leggero`,standard:`Standard`,rich:`Ricco`,max:`Max`,desktop:`Desktop`},presetCost:{minimal:`costo 1× · primo token più veloce · nessuna spec caricata`,light:`costo 1,3× · spec Specrails caricate`,standard:`costo 1,6× · spec Specrails + OpenSpec caricate`,rich:`costo 2× · accesso in lettura all'intero repo`,max:`costo 4× · lettura completa + raffinamento Contract Layer`,desktop:`costo 4–6× · tutte le funzionalità + MCP del progetto e i tuoi MCP approvati`},smashCapable:`Compatibile con SMASH`,smashHint:`Il Contract Layer è attivo, quindi questa spec potrà poi essere scomposta in Sub-Spec.`,fineTune:`Fine-tune`,defaultLabel:`Ambito del contesto`,summaryMinimal:`minimo`,tags:{specrails:`specrails`,openspec:`openspec`,codebase:`codebase`,mcp:`mcp`,myMcp:`my-mcp`,contract:`contract`},checks:{specrailsLabel:`ticket specrails`,openspecLabel:`spec openspec`,fullLabel:`Codebase completo`,mcpLabel:`MCP del progetto`,mcpHint:`server .mcp.json`,userMcpLabel:`I miei MCP approvati`,userMcpHint:`server ~/.claude`,userMcpTooltip:`I tuoi server MCP approvati localmente (claude mcp add)`,exploreOnly:`Solo modalità Explore`,providerUnsupported:`Non disponibile per {{provider}}`,contractLabel:`Arricchisci con Contract Layer`,contractHint:`raffinamento post-commit · abilita SMASH`}},r={label:`Engine AI`,notSignedIn:`Non connesso`,localEngine:`Motore locale`},i={presetHeading:`Preset modello`,preset:{balanced:{label:`Bilanciato`,description:`{{model}} per tutti gli agenti (consigliato)`},budget:{label:`Budget`,description:`{{model}} per tutti gli agenti — 3× più economico, più veloce`},max:{label:`Max`,description:`{{topModel}} per architect + PM, {{baseModel}} per il resto`}},overridesHeading:`Override del modello per agente`,overriddenCount:`{{count}} sovrascritti`,customBadge:`custom`,resetToDefault:`Ripristina il default del preset`},a={alias:`Alias Claude Code: {{alias}}`,tier:{balanced:`Bilanciato`,mostCapable:`Più capace`,fastest:`Più veloce`,frontier:`Frontier`}},o={heading:`Consapevolezza dei costi`,meterAriaLabel:`livello di costo`,estimateUnavailable:`solo livello — stima non disponibile`},s={heading:`Comando suggerito`,run:`Esegui`,dismiss:`Ignora`},c={serverError:`Errore del server ({{status}})`,connectionFailed:`Connessione non riuscita: {{message}}`,sendRefinementFailed:`Impossibile inviare il raffinamento`,createIssueFailed:`Impossibile creare la issue`},l={proposeModal:e,featureProposal:t,contextScope:n,aiEngine:r,modelSelector:i,modelCombobox:a,costMeter:o,commandProposal:s,errors:c};export{r as aiEngine,s as commandProposal,n as contextScope,o as costMeter,l as default,c as errors,t as featureProposal,a as modelCombobox,i as modelSelector,e as proposeModal};