specrails-desktop 2.32.0 → 2.34.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.
- package/client/dist/assets/{ActivityFeedPage-DvnFkjVG.js → ActivityFeedPage-DIDxNsDj.js} +1 -1
- package/client/dist/assets/{AgentBrowserCapture-CBjcliD7.js → AgentBrowserCapture-7pJ2G5VY.js} +1 -1
- package/client/dist/assets/AgentModeAnalyticsPane-BSSyTnTM.js +2 -0
- package/client/dist/assets/{AgentModeCodePane-CokuFVdV.js → AgentModeCodePane-DzW6gvDw.js} +2 -2
- package/client/dist/assets/{AgentModeJobsPane-rf_DlWNo.js → AgentModeJobsPane-9wJff15f.js} +1 -1
- package/client/dist/assets/AgentsPage-CIA67psb.js +87 -0
- package/client/dist/assets/AnalyticsPage-C0LwYELz.js +1 -0
- package/client/dist/assets/CodePage-RtKvHmAO.js +2 -0
- package/client/dist/assets/{DesktopAnalyticsPage-gBRVqiw6.js → DesktopAnalyticsPage-BU8Y_Ts1.js} +1 -1
- package/client/dist/assets/{DocsDialog-BzO5dg2B.js → DocsDialog-DIpoaGlQ.js} +1 -1
- package/client/dist/assets/{DocsPage-Db_uxr1j.js → DocsPage-ME47KZpK.js} +1 -1
- package/client/dist/assets/InteractiveJobComposer-BGjIe9R6.js +19 -0
- package/client/dist/assets/{JobDetailModal-DPHh2WOS.js → JobDetailModal-1UZkqH4I.js} +1 -1
- package/client/dist/assets/JobDetailPage-CN65sAf1.js +1 -0
- package/client/dist/assets/JobsPage-f-4dqys7.js +1 -0
- package/client/dist/assets/LoopBuilderPage-WeiofeL6.js +7 -0
- package/client/dist/assets/LoopPreviewModal-DDTnTyH0.js +1 -0
- package/client/dist/assets/LoopsPage-BVNchIex.js +1 -0
- package/client/dist/assets/MinimizedChatsContext-CHsu3NCX.js +1 -0
- package/client/dist/assets/PluginsPage-CdFzGEfQ.js +2 -0
- package/client/dist/assets/ProjectSettingsDialog-BkCXBQWk.js +1 -0
- package/client/dist/assets/TemplatePreviewModal-RDi0khFG.js +1 -0
- package/client/dist/assets/TicketDetailModal-MhJzrqbi.js +14 -0
- package/client/dist/assets/{Trans-B2i5HVcM.js → Trans-CTqw6rr9.js} +1 -1
- package/client/dist/assets/{addspec-DhmnXER8.js → addspec-A1lDQa4M.js} +1 -1
- package/client/dist/assets/{addspec-BRlk8jON.js → addspec-BHZd0N5F.js} +1 -1
- package/client/dist/assets/{addspec-CHW9xf_X.js → addspec-BPpZ_olp.js} +1 -1
- package/client/dist/assets/{addspec-Di41DpYV.js → addspec-B_TPJt-R.js} +1 -1
- package/client/dist/assets/{addspec-4WmLJmBG.js → addspec-CLYLvaVP.js} +1 -1
- package/client/dist/assets/{addspec-C7XRejU4.js → addspec-CQBjzt24.js} +1 -1
- package/client/dist/assets/{addspec-x3mizDxc.js → addspec-D2YIQ0GU.js} +1 -1
- package/client/dist/assets/{addspec-DTmRrWrF.js → addspec-iFdQ6D99.js} +1 -1
- package/client/dist/assets/agent-Bd-q3Wqp.js +1 -0
- package/client/dist/assets/agent-BlvdW4Hv.js +1 -0
- package/client/dist/assets/agent-C-KQhxeM.js +1 -0
- package/client/dist/assets/agent-Ca15w5eu.js +1 -0
- package/client/dist/assets/agent-D6fKaoMd.js +1 -0
- package/client/dist/assets/agent-HFMYMTbB.js +1 -0
- package/client/dist/assets/agent-QIEbkBjg.js +1 -0
- package/client/dist/assets/agent-mTCsAbCl.js +1 -0
- package/client/dist/assets/agentstudio-BNUth0uj.js +1 -0
- package/client/dist/assets/agentstudio-BNdB5hkr.js +1 -0
- package/client/dist/assets/agentstudio-C7-bt8FO.js +1 -0
- package/client/dist/assets/agentstudio-C8uNchpV.js +1 -0
- package/client/dist/assets/agentstudio-CKabyMlg.js +1 -0
- package/client/dist/assets/agentstudio-CN2pokQu.js +1 -0
- package/client/dist/assets/agentstudio-DR7doNBV.js +1 -0
- package/client/dist/assets/agentstudio-y2dVDXeM.js +1 -0
- package/client/dist/assets/{analytics-C9RaQcE3.js → analytics-47pYygtV.js} +1 -1
- package/client/dist/assets/{analytics-B8Qtptbl.js → analytics-B0vt1g5U.js} +1 -1
- package/client/dist/assets/analytics-BMzCvrCU.js +1 -0
- package/client/dist/assets/{analytics-BPptRY4f.js → analytics-BlFN3Zwx.js} +1 -1
- package/client/dist/assets/{analytics-BxDGOIwf.js → analytics-CZYzL-nR.js} +1 -1
- package/client/dist/assets/{analytics-D_OZdQ9O.js → analytics-DAsb9MJ8.js} +1 -1
- package/client/dist/assets/{analytics-CJIwqrEl.js → analytics-FXQlQ2Yt.js} +1 -1
- package/client/dist/assets/{analytics-We6lUMI8.js → analytics-RnFCNkah.js} +1 -1
- package/client/dist/assets/{builder-CWYPw7Cw.js → builder-0IWtosUm.js} +1 -1
- package/client/dist/assets/{builder-CX1437hF.js → builder-Bf2N6XWn.js} +1 -1
- package/client/dist/assets/{builder-BiUG9Z5K.js → builder-BnqaaBkT.js} +1 -1
- package/client/dist/assets/{builder-CGRz_-zP.js → builder-BxxfGgAO.js} +1 -1
- package/client/dist/assets/{builder-DwDexYRE.js → builder-C5IIgWsq.js} +1 -1
- package/client/dist/assets/builder-CHuahItu.js +1 -0
- package/client/dist/assets/{builder-Cowk9jtL.js → builder-CjWosXL_.js} +1 -1
- package/client/dist/assets/{builder-3bygQtZi.js → builder-CpCIOoKj.js} +1 -1
- package/client/dist/assets/dashboard-BHRqsGCV.js +1 -0
- package/client/dist/assets/dashboard-Bfr90vOl.js +1 -0
- package/client/dist/assets/dashboard-CTsM8x3m.js +1 -0
- package/client/dist/assets/dashboard-CqC6wX0h.js +1 -0
- package/client/dist/assets/dashboard-CuZtAszc.js +1 -0
- package/client/dist/assets/dashboard-DAcqIc-n.js +1 -0
- package/client/dist/assets/dashboard-DekiV-86.js +1 -0
- package/client/dist/assets/dashboard-DoDczc5S.js +1 -0
- package/client/dist/assets/{dist-js-CkTZKBF9.js → dist-js-BmsFWRly.js} +1 -1
- package/client/dist/assets/{dist-js-ClShHcGa.js → dist-js-J5W_N5ng.js} +1 -1
- package/client/dist/assets/{formatDistanceToNow-BjGwPf6I.js → formatDistanceToNow-BOuXgebD.js} +1 -1
- package/client/dist/assets/{getTimezoneOffsetInMilliseconds-CSCbUI4W.js → getTimezoneOffsetInMilliseconds-EjGOpn4b.js} +1 -1
- package/client/dist/assets/{i18n-Ch-Db_x2.js → i18n-nJQvD5zJ.js} +2 -2
- package/client/dist/assets/index-C_sdsSZt.js +63 -0
- package/client/dist/assets/index-DCN5QbDm.css +2 -0
- package/client/dist/assets/{jira-BySfUuQZ.js → jira-BNZu8f9O.js} +1 -1
- package/client/dist/assets/{jira-gAvOyije.js → jira-BOoaUXbb.js} +1 -1
- package/client/dist/assets/{jira-pRaL7JQo.js → jira-BYVN4L2u.js} +1 -1
- package/client/dist/assets/jira-CKJg3HZd.js +1 -0
- package/client/dist/assets/{jira-Byw2C0F8.js → jira-DDDsZ4ub.js} +1 -1
- package/client/dist/assets/{jira-D38Gj7AT.js → jira-DXwYjVE4.js} +1 -1
- package/client/dist/assets/{jira-D11gPhxz.js → jira-Dn6U2nRW.js} +1 -1
- package/client/dist/assets/{jira-api-BgFIr8eD.js → jira-api-Bhixwn-d.js} +1 -1
- package/client/dist/assets/{jira-CNeYi06w.js → jira-j7hVolR5.js} +1 -1
- package/client/dist/assets/nav-ApJVg3xu.js +1 -0
- package/client/dist/assets/nav-BKNky1Bg.js +1 -0
- package/client/dist/assets/nav-C6vWWKYx.js +1 -0
- package/client/dist/assets/nav-CXJ6Aw89.js +1 -0
- package/client/dist/assets/nav-CsmFBIDf.js +1 -0
- package/client/dist/assets/nav-DjkmQJjd.js +1 -0
- package/client/dist/assets/nav-iwjCg5FR.js +1 -0
- package/client/dist/assets/nav-pYuXq7sf.js +1 -0
- package/client/dist/assets/{provider-capabilities-BvoExILy.js → provider-capabilities-Doej9lfa.js} +1 -1
- package/client/dist/assets/setup-3jWaoVUO.js +1 -0
- package/client/dist/assets/setup-BjgRneb2.js +1 -0
- package/client/dist/assets/setup-BzFIjv-f.js +1 -0
- package/client/dist/assets/setup-C4VfQsxE.js +1 -0
- package/client/dist/assets/setup-DfUkpDbN.js +1 -0
- package/client/dist/assets/setup-ECe90Pmu.js +1 -0
- package/client/dist/assets/setup-dlqC4Jmm.js +1 -0
- package/client/dist/assets/setup-jwfLMiM2.js +1 -0
- package/client/dist/assets/{spending-Dq43JYmD.js → spending-BpYPsevQ.js} +1 -1
- package/client/dist/assets/tickets-B4rjuSYi.js +1 -0
- package/client/dist/assets/tickets-Bc71ce1C.js +1 -0
- package/client/dist/assets/tickets-CLg7VTJ8.js +1 -0
- package/client/dist/assets/tickets-CP9U1GJt.js +1 -0
- package/client/dist/assets/tickets-CZNBiHbq.js +1 -0
- package/client/dist/assets/tickets-DlX2mEkD.js +1 -0
- package/client/dist/assets/tickets-W6pBmbrX.js +1 -0
- package/client/dist/assets/tickets-_yKvCt4Y.js +1 -0
- package/client/dist/assets/{useBrowserCaptureSession-TTO8vHtd.js → useBrowserCaptureSession-BBXBN0Na.js} +1 -1
- package/client/dist/assets/useDesktop-B6Du2N83.js +1 -0
- package/client/dist/assets/{useSharedWebSocket-DaPh7QBL.js → useSharedWebSocket-DK96ctb7.js} +1 -1
- package/client/dist/index.html +24 -24
- package/docs/guide/de/getting-started/3-adding-your-first-project.md +13 -32
- package/docs/guide/de/integrations/1-ai-providers.md +27 -16
- package/docs/guide/en/getting-started/3-adding-your-first-project.md +8 -27
- package/docs/guide/en/integrations/1-ai-providers.md +21 -18
- package/docs/guide/es/getting-started/3-adding-your-first-project.md +12 -31
- package/docs/guide/es/integrations/1-ai-providers.md +24 -16
- package/docs/guide/fr/getting-started/3-adding-your-first-project.md +15 -34
- package/docs/guide/fr/integrations/1-ai-providers.md +25 -16
- package/docs/guide/it/getting-started/3-adding-your-first-project.md +16 -35
- package/docs/guide/it/integrations/1-ai-providers.md +25 -16
- package/docs/guide/ja/getting-started/3-adding-your-first-project.md +16 -35
- package/docs/guide/ja/integrations/1-ai-providers.md +7 -12
- package/docs/guide/pt/getting-started/3-adding-your-first-project.md +15 -34
- package/docs/guide/pt/integrations/1-ai-providers.md +24 -16
- package/docs/guide/zh/getting-started/3-adding-your-first-project.md +18 -37
- package/docs/guide/zh/integrations/1-ai-providers.md +7 -12
- package/docs/internals/project-builder.md +11 -6
- package/package.json +1 -1
- package/server/dist/ai-invocations.js +35 -0
- package/server/dist/blueprint-commit.js +1 -1
- package/server/dist/desktop-db.js +22 -1
- package/server/dist/desktop-router.js +132 -43
- package/server/dist/framework-reseed.js +144 -0
- package/server/dist/index.js +41 -2
- package/server/dist/jira/jira-sync-manager.js +49 -2
- package/server/dist/jira-router.js +21 -0
- package/server/dist/job-phase-breakdown.js +132 -0
- package/server/dist/legacy-migration.js +395 -0
- package/server/dist/loop-executors.js +5 -1
- package/server/dist/offline-assemble.js +32 -4
- package/server/dist/pr-body.js +13 -0
- package/server/dist/project-router-jobs.js +16 -0
- package/server/dist/project-router-spending.js +11 -1
- package/server/dist/provider-detection.js +222 -0
- package/server/dist/provider-selection.js +71 -19
- package/server/dist/queue-manager.js +4 -0
- package/server/dist/rail-pr-decision.js +10 -0
- package/server/dist/rails-router.js +11 -0
- package/server/dist/rails-store.js +5 -1
- package/server/dist/repo-map.js +293 -0
- package/server/dist/setup-manager.js +57 -0
- package/server/dist/spending.js +45 -0
- package/client/dist/assets/AgentsPage-B648IzGI.js +0 -87
- package/client/dist/assets/AnalyticsPage-0rBoULPX.js +0 -1
- package/client/dist/assets/CodePage-ju302Vl7.js +0 -2
- package/client/dist/assets/InteractiveJobComposer-_jmsE_Az.js +0 -19
- package/client/dist/assets/JobDetailPage-7nwHyHGV.js +0 -1
- package/client/dist/assets/JobsPage-C_6YrcmE.js +0 -1
- package/client/dist/assets/LoopBuilderPage-DJ1UPDwL.js +0 -7
- package/client/dist/assets/LoopPreviewModal-12cUnljK.js +0 -1
- package/client/dist/assets/LoopsPage-CHYK0Xjr.js +0 -1
- package/client/dist/assets/MinimizedChatsContext-Gt6KQySM.js +0 -1
- package/client/dist/assets/PluginsPage-E59oQmwc.js +0 -2
- package/client/dist/assets/ProjectSettingsDialog-DQTLQ7ie.js +0 -1
- package/client/dist/assets/TemplatePreviewModal-nXUcDgfk.js +0 -1
- package/client/dist/assets/TicketDetailModal-C-tHW-2s.js +0 -14
- package/client/dist/assets/agent-BKsuIgIT.js +0 -1
- package/client/dist/assets/agent-Bs9NilfI.js +0 -1
- package/client/dist/assets/agent-C23h684q.js +0 -1
- package/client/dist/assets/agent-CqEjy3Z2.js +0 -1
- package/client/dist/assets/agent-D5DZTks1.js +0 -1
- package/client/dist/assets/agent-DE8hUYPl.js +0 -1
- package/client/dist/assets/agent-DsTuJGSc.js +0 -1
- package/client/dist/assets/agent-DwZM05-x.js +0 -1
- package/client/dist/assets/agentstudio-8TQqBenW.js +0 -1
- package/client/dist/assets/agentstudio-B8Z_mmEX.js +0 -1
- package/client/dist/assets/agentstudio-BZR9YmLs.js +0 -1
- package/client/dist/assets/agentstudio-Bge9pAWb.js +0 -1
- package/client/dist/assets/agentstudio-Bz169Vzt.js +0 -1
- package/client/dist/assets/agentstudio-D6L2jpNi.js +0 -1
- package/client/dist/assets/agentstudio-K2-Z7CL0.js +0 -1
- package/client/dist/assets/agentstudio-Zmgzthv8.js +0 -1
- package/client/dist/assets/analytics-BHqUazhP.js +0 -1
- package/client/dist/assets/builder-skfnZ1uC.js +0 -1
- package/client/dist/assets/dashboard-BVq6kRJe.js +0 -1
- package/client/dist/assets/dashboard-BaKPPmLH.js +0 -1
- package/client/dist/assets/dashboard-Bm8e4zYG.js +0 -1
- package/client/dist/assets/dashboard-Bt6IesnM.js +0 -1
- package/client/dist/assets/dashboard-C_NQZle_.js +0 -1
- package/client/dist/assets/dashboard-CyZKoGoI.js +0 -1
- package/client/dist/assets/dashboard-HIUdUBQ0.js +0 -1
- package/client/dist/assets/dashboard-pm4Mr229.js +0 -1
- package/client/dist/assets/index-Bz0TeGRs.css +0 -2
- package/client/dist/assets/index-kCUcnT8G.js +0 -77
- package/client/dist/assets/jira-CmKWERE0.js +0 -1
- package/client/dist/assets/nav-BHDiSIVu.js +0 -1
- package/client/dist/assets/nav-CMiYAq4i.js +0 -1
- package/client/dist/assets/nav-CqS7NrDW.js +0 -1
- package/client/dist/assets/nav-D-0M7xfv.js +0 -1
- package/client/dist/assets/nav-D65O6u9I.js +0 -1
- package/client/dist/assets/nav-D_LKYvBr.js +0 -1
- package/client/dist/assets/nav-FDTJmU79.js +0 -1
- package/client/dist/assets/nav-VaB-C4k5.js +0 -1
- package/client/dist/assets/setup-BBiHEO7h.js +0 -1
- package/client/dist/assets/setup-BlTWhNIQ.js +0 -1
- package/client/dist/assets/setup-Bp2L_oiP.js +0 -1
- package/client/dist/assets/setup-CInYXp1-.js +0 -1
- package/client/dist/assets/setup-CYH3bP6K.js +0 -1
- package/client/dist/assets/setup-DwcQ921P.js +0 -1
- package/client/dist/assets/setup-PBLjuDSs.js +0 -1
- package/client/dist/assets/setup-bx6FtoBp.js +0 -1
- package/client/dist/assets/tickets-BL9r1G0e.js +0 -1
- package/client/dist/assets/tickets-B_NyHJ8f.js +0 -1
- package/client/dist/assets/tickets-BarF1wuG.js +0 -1
- package/client/dist/assets/tickets-CclVhpQA.js +0 -1
- package/client/dist/assets/tickets-CqqOHbli.js +0 -1
- package/client/dist/assets/tickets-DCkFSiqt.js +0 -1
- package/client/dist/assets/tickets-Djn3ccfT.js +0 -1
- package/client/dist/assets/tickets-MiHBPsy_.js +0 -1
- package/client/dist/assets/useDesktop-DUvS4fuP.js +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t,t as n}from"./jsx-runtime-zu2_FqZY.js";import{n as r,t as i}from"./createLucideIcon-Bjbbp_KS.js";import{n as a}from"./dist-bVqfYmby.js";import{t as o}from"./download-CFHyyHcw.js";import{t as s}from"./loader-circle-DcygOQpC.js";import{t as c}from"./search-Cq_gE3Ik.js";import{t as l}from"./trash-2-BOU3WdZZ.js";import{t as u}from"./triangle-alert-H9T4jAmh.js";import{a as d}from"./auth-D_5bQv5W.js";import{r as f}from"./useSharedWebSocket-DK96ctb7.js";import{n as p,r as m}from"./useDesktop-B6Du2N83.js";import{t as h}from"./button-BUIIBQPT.js";import{t as g}from"./utils-BC4DHlz2.js";import{a as _,n as v,o as y,r as b,t as x}from"./dialog-CzIekCw0.js";import{t as S}from"./jira-api-Bhixwn-d.js";import{r as C}from"./provider-capabilities-Doej9lfa.js";import{Dt as w,ct as T,et as E,kt as D,nt as ee,tt as O,v as k}from"./index-C_sdsSZt.js";var A=i(`earth`,[[`path`,{d:`M21.54 15H17a2 2 0 0 0-2 2v4.54`,key:`1djwo0`}],[`path`,{d:`M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17`,key:`1tzkfa`}],[`path`,{d:`M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05`,key:`14pb5j`}],[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),te=i(`folder-kanban`,[[`path`,{d:`M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z`,key:`1fr9dc`}],[`path`,{d:`M8 10v4`,key:`tgpxqk`}],[`path`,{d:`M12 10v2`,key:`hh53o1`}],[`path`,{d:`M16 10v6`,key:`1d6xys`}]]),j=i(`plug-zap`,[[`path`,{d:`M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z`,key:`goz73y`}],[`path`,{d:`m2 22 3-3`,key:`19mgm9`}],[`path`,{d:`M7.5 13.5 10 11`,key:`7xgeeb`}],[`path`,{d:`M10.5 16.5 13 14`,key:`10btkg`}],[`path`,{d:`m18 3-4 4h6l-4 4`,key:`16psg9`}]]),M=i(`power`,[[`path`,{d:`M12 2v10`,key:`mnfbl`}],[`path`,{d:`M18.4 6.6a9 9 0 1 1-12.77.04`,key:`obofu9`}]]),N=i(`settings-2`,[[`path`,{d:`M14 17H5`,key:`gfn3mx`}],[`path`,{d:`M19 7h-9`,key:`6i9tg`}],[`circle`,{cx:`17`,cy:`17`,r:`3`,key:`18b49y`}],[`circle`,{cx:`7`,cy:`7`,r:`3`,key:`dfmy0x`}]]),P=i(`wrench`,[[`path`,{d:`M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z`,key:`1ngwbx`}]]),F=e(t(),1),I=n(),ne=[`todo`,`in_progress`,`on_review`,`done`,`cancelled`],L={todo:`todo`,in_progress:`inProgress`,on_review:`onReview`,done:`done`,cancelled:`cancelled`};function R({onConnected:e,onSkip:t,apiBase:n}){let{t:i}=r(`jira`),[o,s]=(0,F.useState)(1),[c,l]=(0,F.useState)(``),[u,d]=(0,F.useState)(``),[f,p]=(0,F.useState)(``),[m,g]=(0,F.useState)(`idle`),[_,v]=(0,F.useState)(null),[y,b]=(0,F.useState)(`cloud`),[x,C]=(0,F.useState)([]),[w,T]=(0,F.useState)(``),[E,D]=(0,F.useState)(``),[ee,O]=(0,F.useState)(``),[A,te]=(0,F.useState)(!1),[j,M]=(0,F.useState)([]),[N,P]=(0,F.useState)({}),[R,re]=(0,F.useState)(``),[H,U]=(0,F.useState)(!1),W=()=>({baseUrl:c.trim(),accountEmail:u.trim()||null,token:f});async function G(){g(`testing`);try{let e=await S.test(W(),n);g(`ok`),v(e.displayName),b(e.deployment)}catch(e){g(`error`),a.error(V(e,i))}}async function K(){s(2),te(!0);try{let{projects:e}=await S.discoverProjects({...W(),query:w.trim()||void 0},n);C(e)}catch(e){a.error(V(e,i))}finally{te(!1)}}async function q(){if(s(3),E)try{let{statuses:e}=await S.discoverStatuses({...W(),projectKey:E},n);M(e)}catch{M([])}}async function J(){U(!0);try{let t=Object.fromEntries(Object.entries(N).filter(([,e])=>e));await S.connect({...W(),jiraProjectKey:E.trim(),statusMap:Object.keys(t).length?t:null,discardStatus:R.trim()||null},n),a.success(i(`status.connected`,{key:E.trim()})),e()}catch(e){a.error(V(e,i))}finally{U(!1)}}return(0,I.jsxs)(`div`,{className:`space-y-4`,"data-testid":`jira-wizard`,children:[(0,I.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,I.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:i(`wizard.step`,{current:o,total:4})}),t&&(0,I.jsx)(`button`,{type:`button`,onClick:t,className:`text-xs text-muted-foreground hover:text-foreground hover:underline`,"data-testid":`jira-later`,children:i(`wizard.later`)})]}),o===1&&(0,I.jsxs)(`div`,{className:`space-y-3`,children:[(0,I.jsx)(`h3`,{className:`text-sm font-semibold`,children:i(`wizard.step1Title`)}),(0,I.jsx)(z,{label:i(`creds.baseUrlLabel`),help:i(`creds.baseUrlHelp`),children:(0,I.jsx)(k,{value:c,onChange:e=>{l(e.target.value),g(`idle`)},placeholder:i(`creds.baseUrlPlaceholder`)})}),(0,I.jsx)(z,{label:i(`creds.emailLabel`),help:i(`creds.emailHelp`),children:(0,I.jsx)(k,{value:u,onChange:e=>{d(e.target.value),g(`idle`)},placeholder:i(`creds.emailPlaceholder`)})}),(0,I.jsx)(z,{label:i(`creds.tokenLabel`),help:i(`creds.tokenHelp`),children:(0,I.jsx)(k,{type:`password`,value:f,onChange:e=>{p(e.target.value),g(`idle`)}})}),(0,I.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,I.jsx)(h,{size:`sm`,variant:`outline`,onClick:G,disabled:!c.trim()||!f.trim()||m===`testing`,children:i(m===`testing`?`creds.testing`:m===`ok`?`creds.retest`:`creds.test`)}),m===`ok`&&(0,I.jsxs)(`span`,{className:`text-xs text-accent-success`,"data-testid":`jira-test-ok`,children:[`✓ `,i(`creds.testOk`,{name:_??``}),` · `,i(y===`cloud`?`review.cloud`:`review.dc`)]})]}),(0,I.jsx)(`div`,{className:`flex justify-end`,children:(0,I.jsx)(h,{size:`sm`,onClick:K,disabled:m!==`ok`,children:i(`wizard.next`)})})]}),o===2&&(0,I.jsxs)(`div`,{className:`space-y-3`,children:[(0,I.jsx)(`h3`,{className:`text-sm font-semibold`,children:i(`wizard.step2Title`)}),(0,I.jsxs)(`div`,{className:`flex gap-2`,children:[(0,I.jsx)(k,{value:w,onChange:e=>T(e.target.value),placeholder:i(`project.searchPlaceholder`)}),(0,I.jsx)(h,{size:`sm`,variant:`outline`,onClick:K,children:i(`project.searchPlaceholder`)})]}),A?(0,I.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:i(`project.loading`)}):x.length===0?(0,I.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:i(`project.none`)}):(0,I.jsx)(`div`,{className:`max-h-48 space-y-1 overflow-y-auto`,"data-testid":`jira-project-list`,children:x.map(e=>(0,I.jsxs)(`button`,{type:`button`,onClick:()=>{D(e.key),O(e.name)},className:`flex w-full items-center justify-between rounded px-2 py-1.5 text-left text-sm hover:bg-muted ${E===e.key?`bg-muted`:``}`,children:[(0,I.jsx)(`span`,{className:`font-medium`,children:e.key}),(0,I.jsx)(`span`,{className:`truncate text-xs text-muted-foreground`,children:e.name})]},e.id))}),(0,I.jsx)(z,{label:i(`project.manualLabel`),children:(0,I.jsx)(k,{value:E,onChange:e=>{D(e.target.value.toUpperCase()),O(``)},placeholder:i(`project.manualPlaceholder`)})}),(0,I.jsxs)(`div`,{className:`flex justify-between`,children:[(0,I.jsx)(h,{size:`sm`,variant:`ghost`,onClick:()=>s(1),children:i(`wizard.back`)}),(0,I.jsx)(h,{size:`sm`,onClick:q,disabled:!E.trim(),children:i(`wizard.next`)})]})]}),o===3&&(0,I.jsxs)(`div`,{className:`space-y-3`,children:[(0,I.jsx)(`h3`,{className:`text-sm font-semibold`,children:i(`wizard.step3Title`)}),(0,I.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:i(`mapping.intro`)}),ne.map(e=>(0,I.jsx)(z,{label:i(`mapping.${L[e]}`),children:(0,I.jsxs)(`select`,{value:N[e]??``,onChange:t=>P(n=>({...n,[e]:t.target.value||void 0})),className:`w-full rounded-md border border-border bg-background px-2 py-1.5 text-sm`,children:[(0,I.jsx)(`option`,{value:``,children:i(`mapping.auto`)}),j.map(e=>(0,I.jsx)(`option`,{value:e.name,children:e.name},e.id))]})},e)),(0,I.jsx)(z,{label:i(`discard.configLabel`),help:i(`discard.configHelp`),children:(0,I.jsxs)(`select`,{value:R,onChange:e=>re(e.target.value),className:`w-full rounded-md border border-border bg-background px-2 py-1.5 text-sm`,"data-testid":`jira-discard-status-select`,children:[(0,I.jsx)(`option`,{value:``,children:i(`discard.configNone`)}),j.map(e=>(0,I.jsx)(`option`,{value:e.name,children:e.name},e.id))]})}),(0,I.jsxs)(`div`,{className:`flex justify-between`,children:[(0,I.jsx)(h,{size:`sm`,variant:`ghost`,onClick:()=>s(2),children:i(`wizard.back`)}),(0,I.jsx)(h,{size:`sm`,onClick:()=>s(4),children:i(`wizard.next`)})]})]}),o===4&&(0,I.jsxs)(`div`,{className:`space-y-3`,children:[(0,I.jsx)(`h3`,{className:`text-sm font-semibold`,children:i(`wizard.step4Title`)}),(0,I.jsxs)(`dl`,{className:`space-y-1 text-sm`,children:[(0,I.jsx)(B,{label:i(`review.site`),value:c}),(0,I.jsx)(B,{label:i(`review.project`),value:ee?`${E} — ${ee}`:E}),(0,I.jsx)(B,{label:i(`review.account`),value:_??u}),(0,I.jsx)(B,{label:i(`review.type`),value:i(y===`cloud`?`review.cloud`:`review.dc`)}),(0,I.jsx)(B,{label:i(`discard.reviewLabel`),value:R||i(`discard.configNone`)})]}),(0,I.jsxs)(`div`,{className:`flex justify-between`,children:[(0,I.jsx)(h,{size:`sm`,variant:`ghost`,onClick:()=>s(3),children:i(`wizard.back`)}),(0,I.jsx)(h,{size:`sm`,onClick:J,disabled:H,children:i(H?`wizard.connecting`:`wizard.connect`)})]})]})]})}function z({label:e,help:t,children:n}){return(0,I.jsxs)(`label`,{className:`block space-y-1`,children:[(0,I.jsx)(`span`,{className:`text-xs font-medium text-foreground`,children:e}),n,t&&(0,I.jsx)(`span`,{className:`block text-[11px] text-muted-foreground`,children:t})]})}function B({label:e,value:t}){return(0,I.jsxs)(`div`,{className:`flex justify-between gap-4`,children:[(0,I.jsx)(`dt`,{className:`text-muted-foreground`,children:e}),(0,I.jsx)(`dd`,{className:`truncate text-right font-medium`,children:t})]})}function V(e,t){return e instanceof Error?e.message:t(`errors.generic`)}var re=[`todo`,`in_progress`,`on_review`,`done`,`cancelled`],H={todo:`todo`,in_progress:`inProgress`,on_review:`onReview`,done:`done`,cancelled:`cancelled`};function U({state:e,onChanged:t,apiBase:n}){let{t:i}=r(`jira`),o=e.connection,[s,c]=(0,F.useState)(o.enabled),[l,u]=(0,F.useState)(!1),[d,f]=(0,F.useState)(!1),[p,m]=(0,F.useState)([]),[g,_]=(0,F.useState)([]),[v,y]=(0,F.useState)(o.discardStatus??``),[b,x]=(0,F.useState)(o.statusMap??{}),C=e.outbox??{pending:0,inflight:0,done:0,dead:0},w=(0,F.useCallback)(async()=>{try{let{ops:e}=n?await S.listOutbox(`dead`,n):await S.listOutbox(`dead`);m(e)}catch{m([])}},[n]);(0,F.useEffect)(()=>{w()},[w]),(0,F.useEffect)(()=>{let e=!1;return S.listStatuses(n).then(({statuses:t})=>{e||_(t)}).catch(()=>{e||_([])}),()=>{e=!0}},[n]);async function T(e){let r=v;y(e);try{n?await S.patchConnection({discardStatus:e||null},n):await S.patchConnection({discardStatus:e||null}),t()}catch(e){y(r),a.error(G(e,i))}}async function E(e,r){let o=b,s={...b,[e]:r||void 0};x(s);let c=Object.fromEntries(Object.entries(s).filter(([,e])=>e));try{n?await S.patchConnection({statusMap:Object.keys(c).length?c:null},n):await S.patchConnection({statusMap:Object.keys(c).length?c:null}),t()}catch(e){x(o),a.error(G(e,i))}}async function D(){let e=!s;c(e),f(!0);try{n?await S.setEnabled(e,n):await S.setEnabled(e)}catch(t){c(!e),a.error(G(t,i))}finally{f(!1)}}async function ee(){u(!0);try{let e=n?await S.syncNow(n):await S.syncNow();a.success(i(`status.syncedToast`,{count:e.upserted}))}catch(e){a.error(G(e,i))}finally{u(!1)}}async function O(){if(window.confirm(i(`status.disconnectConfirm`))){f(!0);try{n?await S.disconnect(n):await S.disconnect(),a.success(i(`status.disconnectedToast`)),t()}catch(e){a.error(G(e,i))}finally{f(!1)}}}async function k(e){try{n?await S.retryOutbox(e,n):await S.retryOutbox(e),await w()}catch(e){a.error(G(e,i))}}let A=C.pending+C.inflight;return(0,I.jsxs)(`div`,{className:`space-y-4`,"data-testid":`jira-connected`,children:[(0,I.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`p`,{className:`text-sm font-medium text-foreground`,children:i(`status.connected`,{key:o.jiraProjectKey})}),(0,I.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[o.baseUrl,` · `,o.deployment===`cloud`?i(`review.cloud`):i(`review.dc`)]})]}),(0,I.jsx)(`a`,{href:`${o.baseUrl}/browse/${o.jiraProjectKey}`,target:`_blank`,rel:`noreferrer`,className:`text-xs text-accent-primary hover:underline`,children:i(`badge.openInJira`)})]}),(0,I.jsxs)(`div`,{className:`flex items-center justify-between rounded-md border border-border p-3`,children:[(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`p`,{className:`text-sm font-medium`,children:i(`status.enabledLabel`)}),(0,I.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:i(s?`status.enabledHelp`:`status.pausedHelp`)})]}),(0,I.jsx)(`button`,{type:`button`,role:`switch`,"aria-checked":s,"aria-label":i(`status.enabledLabel`),disabled:d,onClick:D,className:`relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ${s?`bg-accent-success`:`bg-input`}`,children:(0,I.jsx)(`span`,{className:`inline-block h-3.5 w-3.5 rounded-full bg-background shadow-sm transition-transform ${s?`translate-x-4`:`translate-x-0.5`}`})})]}),(0,I.jsxs)(`div`,{className:`rounded-md border border-border p-3`,"data-testid":`jira-status-map`,children:[(0,I.jsx)(`p`,{className:`text-sm font-medium`,children:i(`wizard.step3Title`)}),(0,I.jsx)(`p`,{className:`mt-0.5 mb-2 text-xs text-muted-foreground`,children:i(`mapping.intro`)}),(0,I.jsx)(`div`,{className:`space-y-2`,children:re.map(e=>(0,I.jsxs)(`label`,{className:`flex items-center justify-between gap-3`,children:[(0,I.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:i(`mapping.${H[e]}`)}),(0,I.jsxs)(`select`,{value:b[e]??``,onChange:t=>void E(e,t.target.value),className:`w-44 rounded-md border border-border bg-background px-2 py-1.5 text-sm`,"data-testid":`jira-statusmap-${e}`,children:[(0,I.jsx)(`option`,{value:``,children:i(`mapping.auto`)}),g.map(e=>(0,I.jsx)(`option`,{value:e.name,children:e.name},e.id)),b[e]&&!g.some(t=>t.name===b[e])&&(0,I.jsx)(`option`,{value:b[e],children:b[e]})]})]},e))})]}),(0,I.jsxs)(`div`,{className:`rounded-md border border-border p-3`,children:[(0,I.jsx)(`p`,{className:`text-sm font-medium`,children:i(`discard.configLabel`)}),(0,I.jsx)(`p`,{className:`mt-0.5 mb-2 text-xs text-muted-foreground`,children:i(`discard.configHelp`)}),(0,I.jsxs)(`select`,{value:v,onChange:e=>void T(e.target.value),className:`w-full rounded-md border border-border bg-background px-2 py-1.5 text-sm`,"data-testid":`jira-discard-status-select`,children:[(0,I.jsx)(`option`,{value:``,children:i(`discard.configNone`)}),g.map(e=>(0,I.jsx)(`option`,{value:e.name,children:e.name},e.id)),v&&!g.some(e=>e.name===v)&&(0,I.jsx)(`option`,{value:v,children:v})]})]}),(0,I.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,I.jsx)(h,{variant:`outline`,size:`sm`,onClick:ee,disabled:l,children:i(l?`status.syncing`:`status.syncNow`)}),(0,I.jsx)(h,{variant:`ghost`,size:`sm`,onClick:O,disabled:d,className:`text-destructive`,children:i(`status.disconnect`)})]}),(0,I.jsxs)(`div`,{className:`rounded-md border border-border p-3`,"data-testid":`jira-outbox`,children:[(0,I.jsx)(`p`,{className:`text-sm font-medium`,children:i(`outbox.title`)}),C.dead>0?(0,I.jsx)(`p`,{className:`mt-1 text-xs text-accent-warning`,children:i(`outbox.dead`,{count:C.dead})}):A>0?(0,I.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:i(`outbox.pending`,{count:A})}):(0,I.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:i(`outbox.allSynced`)}),p.length>0&&(0,I.jsxs)(`div`,{className:`mt-2 space-y-2`,children:[(0,I.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:i(`outbox.deadHelp`)}),p.map(e=>(0,I.jsxs)(`div`,{className:`flex items-center justify-between gap-2 rounded border border-border/60 px-2 py-1`,children:[(0,I.jsxs)(`span`,{className:`truncate text-xs`,children:[W(e,i),` · `,e.deadReason??e.lastError??``]}),(0,I.jsx)(h,{variant:`outline`,size:`sm`,onClick:()=>k(e.id),children:i(`outbox.retry`)})]},e.id))]})]})]})}function W(e,t){return e.opType===`transition`?t(`outbox.opTransition`):e.opType===`comment`?t(`outbox.opComment`):t(`outbox.opCreate`)}function G(e,t){return e instanceof Error?e.message:t(`errors.generic`)}var K=new Set([`claude`,`codex`,`kimi`]);function q(e){return{provider:e,label:e===`codex`?`Codex`:`Claude`,active:!1,available:!1,detectedRoute:!1,requests:0,inputTokens:0,inputTokensSaved:0,outputTokens:0,outputTokensSaved:0,outputSavingsPercent:0,outputSavingsMethod:`none`,outputSavingsAllocated:!1}}function J(){return{updatedAt:null,proxyStatsAvailable:!1,durableSavingsAvailable:!1,outputSavingsAvailable:!1,outputSavingsMethod:null,outputConfidence:null,providers:{codex:q(`codex`),claude:q(`claude`)},lastIssue:null}}var Y={installed:!1,installSource:null,version:null,executablePath:null,uvPath:null,port:8787,phase:`idle`,activeProviders:{codex:!1,claude:!1},availableProviders:{codex:!1,claude:!1},detectedRoutes:{codex:!1,claude:!1},proxyRunning:!1,proxyPid:null,learning:{enabled:!1,baselineReady:!1,baselineSamples:0,updatedAt:null,lastIssue:null},metrics:J(),lastIssue:null,updatedAt:null};function ie(e){let t=e?.metrics??J();return{...Y,...e,activeProviders:{...Y.activeProviders,...e?.activeProviders},availableProviders:{...Y.availableProviders,...e?.availableProviders},detectedRoutes:{...Y.detectedRoutes,...e?.detectedRoutes},learning:{...Y.learning,...e?.learning},metrics:{...J(),...t,providers:{codex:{...q(`codex`),...t.providers?.codex},claude:{...q(`claude`),...t.providers?.claude}}}}}async function X(e){let t=await e.text(),n=t?JSON.parse(t):{};if(!e.ok){let t=n.issue;throw Object.assign(Error(t?.title??n.error??`HTTP ${e.status}`),{payload:n})}return n}function Z(e){return`${d}/api/projects/${e}`}function Q(e,t=`en`){if(!Number.isFinite(e))return`0`;try{return Intl.NumberFormat(t,{notation:`compact`,maximumFractionDigits:1}).format(Math.max(0,e))}catch{return Intl.NumberFormat(`en`,{notation:`compact`,maximumFractionDigits:1}).format(Math.max(0,e))}}function $(e,t,n){return`${Q(e,t)} ${n}`}function ae(){let{t:e}=r(`integrations`),{projects:t}=m(),{registerHandler:n,unregisterHandler:i}=f(),[a,o]=(0,F.useState)(``),[s,l]=(0,F.useState)(`all`),[u,p]=(0,F.useState)(Y),[h,S]=(0,F.useState)(!0),[C,w]=(0,F.useState)(null),[D,k]=(0,F.useState)([]),[A,M]=(0,F.useState)(!1),[N,P]=(0,F.useState)(!1),[ne,L]=(0,F.useState)(null),[R,z]=(0,F.useState)({jira:0,serena:0,projects:0}),B=(0,F.useCallback)(async()=>{try{let e=await fetch(`${d}/api/global-plugins/headroom`).then(e=>X(e));p(ie(e.state))}finally{S(!1)}},[]);(0,F.useEffect)(()=>{B()},[B]),(0,F.useEffect)(()=>(n(`plugins-page`,e=>{let t=e;t.type===`plugin.headroom_progress`&&(t.line&&k(e=>[...e.slice(-80),t.line]),B())}),()=>i(`plugins-page`)),[n,i,B]),(0,F.useEffect)(()=>{let e=!1;async function n(){let n=await Promise.all(t.map(async e=>{let[t,n]=await Promise.all([fetch(`${Z(e.id)}/jira/connection`).then(e=>X(e)).catch(()=>({connected:!1})),fetch(`${Z(e.id)}/plugins`).then(e=>X(e)).catch(()=>({plugins:[]}))]),r=n.plugins.find(e=>e.name===`serena`);return{jira:+!!t.connected,serena:r&&r.status!==`not-installed`&&r.status!==`orphan`?1:0}}));e||z({jira:n.reduce((e,t)=>e+t.jira,0),serena:n.reduce((e,t)=>e+t.serena,0),projects:t.length})}return n(),()=>{e=!0}},[t]);async function V(e,t){w(e),k([]);try{let e=(await t()).state;e&&p(ie(e))}catch(e){let t=e.payload;t?.state&&p(ie(t.state))}finally{w(null),B()}}let re=(0,F.useMemo)(()=>[{id:`headroom-ai`,title:`Headroom AI`,scope:`global`,icon:j,description:e(`plugins.catalog.headroom.description`),installed:u.installed,status:u.lastIssue?`attention`:u.installed?u.activeProviders.codex||u.activeProviders.claude?u.installSource===`system`?`external-active`:`active`:u.installSource===`system`?`external`:`installed`:`available`,statusLabel:u.lastIssue?e(`plugins.status.attention`):u.installed?u.activeProviders.codex||u.activeProviders.claude?u.installSource===`system`?e(`plugins.status.externalActive`):e(`plugins.status.active`):u.installSource===`system`?e(`plugins.status.external`):e(`plugins.status.installed`):e(`plugins.status.available`),actionKind:u.lastIssue?`review`:u.installed?`manage`:`install`,actionLabel:u.lastIssue?e(`plugins.actions.review`):u.installed?e(`plugins.actions.manage`):e(`plugins.actions.install`),busy:C===`install`,action:()=>{if(u.lastIssue||u.installed){M(!0);return}V(`install`,()=>fetch(`${d}/api/global-plugins/headroom/install`,{method:`POST`}).then(e=>X(e)))}}],[u,C,e]),H=(0,F.useMemo)(()=>[{id:`jira`,title:`Jira`,scope:`project`,icon:te,description:e(`plugins.catalog.jira.description`),installed:R.jira>0,status:R.jira>0?`configured`:`available`,statusLabel:R.jira>0?e(`plugins.status.configuredCount`,{count:R.jira}):e(`plugins.status.available`),actionKind:R.jira>0?`manage`:`install`,actionLabel:R.jira>0?e(`plugins.actions.manage`):e(`plugins.actions.install`),action:()=>L(`jira`)},{id:`serena`,title:`Serena`,scope:`project`,icon:E,description:e(`plugins.catalog.serena.description`),installed:R.serena>0,status:R.serena>0?`installed`:`available`,statusLabel:R.serena>0?e(`plugins.status.installedCount`,{count:R.serena}):e(`plugins.status.available`),actionKind:R.serena>0?`manage`:`install`,actionLabel:R.serena>0?e(`plugins.actions.manage`):e(`plugins.actions.install`),action:()=>L(`serena`)}],[R,e]),U=a.trim().toLowerCase(),W=t=>`${t.title} ${t.description} ${t.statusLabel} ${e(`plugins.scope.${t.scope}`)}`.toLowerCase().includes(U),G=[...re,...H].filter(e=>s!==`all`&&e.scope!==s?!1:W(e)),K=G.filter(e=>e.scope===`global`&&e.installed),q=G.filter(e=>e.scope===`project`&&e.installed),J=G.filter(e=>e.scope===`global`&&!e.installed),Q=G.filter(e=>e.scope===`project`&&!e.installed),$=K.length>0||q.length>0,ae=J.length>0||Q.length>0,ce=[u.installed,R.jira>0,R.serena>0].filter(Boolean).length;return(0,I.jsxs)(`div`,{className:`flex h-full flex-col bg-background`,children:[(0,I.jsxs)(`div`,{className:`border-b border-border px-6 py-4`,children:[(0,I.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,I.jsx)(`div`,{className:`grid h-9 w-9 place-items-center rounded-lg border border-accent-primary/25 bg-accent-primary/10 text-accent-primary`,children:(0,I.jsx)(T,{className:`h-4 w-4`})}),(0,I.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,I.jsx)(`h1`,{className:`text-lg font-semibold tracking-normal`,children:e(`plugins.page.title`)}),(0,I.jsx)(`p`,{className:`mt-0.5 text-xs text-muted-foreground`,children:e(`plugins.page.subtitle`)})]}),(0,I.jsxs)(`div`,{className:`mr-12 flex items-center gap-2 rounded-lg border border-border bg-card/60 px-3 py-2 text-xs`,children:[(0,I.jsx)(ee,{className:`h-3.5 w-3.5 text-accent-success`}),(0,I.jsx)(`span`,{className:`text-muted-foreground`,children:e(`plugins.page.readyCount`,{count:ce})})]})]}),(0,I.jsxs)(`div`,{className:`mt-4 flex flex-col gap-3 md:flex-row md:items-center`,children:[(0,I.jsxs)(`label`,{className:`relative flex-1`,children:[(0,I.jsx)(c,{className:`pointer-events-none absolute left-3 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground`}),(0,I.jsx)(`input`,{value:a,onChange:e=>o(e.target.value),placeholder:e(`plugins.search.placeholder`),className:`h-9 w-full rounded-lg border border-border bg-background pl-9 pr-3 text-sm outline-none transition-colors focus:border-accent-primary/60`})]}),(0,I.jsx)(`div`,{className:`inline-flex h-9 rounded-lg border border-border bg-card p-1`,children:[`all`,`global`,`project`].map(t=>(0,I.jsx)(`button`,{type:`button`,onClick:()=>l(t),className:g(`rounded-md px-3 text-xs capitalize transition-colors`,s===t?`bg-muted text-foreground`:`text-muted-foreground hover:text-foreground`),children:e(`plugins.filters.${t}`)},t))})]})]}),(0,I.jsxs)(`div`,{className:`flex-1 overflow-auto px-6 py-5`,children:[(0,I.jsxs)(`section`,{className:`mb-6`,children:[(0,I.jsxs)(`div`,{className:`mb-3 flex items-center gap-2 text-xs font-medium text-muted-foreground`,children:[(0,I.jsx)(O,{className:`h-3.5 w-3.5`}),e(`plugins.sections.installed`)]}),$?(0,I.jsx)(oe,{globalPlugins:K,projectPlugins:q}):(0,I.jsx)(se,{text:e(U?`plugins.empty.installedSearch`:`plugins.empty.installed`)})]}),(0,I.jsxs)(`section`,{children:[(0,I.jsxs)(`div`,{className:`mb-3 flex items-center gap-2 text-xs font-medium text-muted-foreground`,children:[(0,I.jsx)(T,{className:`h-3.5 w-3.5`}),e(`plugins.sections.available`)]}),ae?(0,I.jsx)(oe,{globalPlugins:J,projectPlugins:Q}):(0,I.jsx)(se,{text:e(U?`plugins.empty.availableSearch`:`plugins.empty.allInstalled`)})]})]}),(0,I.jsx)(x,{open:A,onOpenChange:M,children:(0,I.jsxs)(v,{className:`w-[calc(100vw-2rem)] max-w-xl overflow-x-hidden p-4 sm:p-6`,children:[(0,I.jsxs)(_,{children:[(0,I.jsx)(y,{children:e(`plugins.headroom.title`)}),(0,I.jsx)(b,{children:e(`plugins.headroom.dialogDescription`)})]}),(0,I.jsx)(de,{state:u,loading:h,busy:C,logs:D,onInstall:()=>V(`install`,()=>fetch(`${d}/api/global-plugins/headroom/install`,{method:`POST`}).then(e=>X(e))),onToggleProvider:(e,t)=>V(`${t?`deactivate`:`activate`}-${e}`,()=>fetch(`${d}/api/global-plugins/headroom/${t?`deactivate`:`activate`}`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({provider:e})}).then(e=>X(e))),onDeactivateAll:()=>V(`deactivate-all`,async()=>{let e={state:u};for(let t of[`codex`,`claude`])u.activeProviders[t]&&(e=await fetch(`${d}/api/global-plugins/headroom/deactivate`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({provider:t})}).then(e=>X(e)));return e}),onUninstall:()=>V(`uninstall`,()=>fetch(`${d}/api/global-plugins/headroom/uninstall`,{method:`POST`}).then(e=>X(e))),onSetPort:e=>V(`port`,()=>fetch(`${d}/api/global-plugins/headroom/port`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({port:e})}).then(e=>X(e))),onOpenDiagnostics:()=>P(!0)})]})}),(0,I.jsx)(ve,{plugin:ne,projects:t,onClose:()=>L(null)}),(0,I.jsx)(xe,{open:N,onClose:()=>P(!1)})]})}function oe({globalPlugins:e,projectPlugins:t}){let{t:n}=r(`integrations`);return(0,I.jsxs)(`div`,{className:g(`grid grid-cols-1 gap-4`,e.length>0&&t.length>0&&`xl:grid-cols-2`),children:[e.length>0&&(0,I.jsxs)(`section`,{children:[(0,I.jsx)(le,{title:n(`plugins.groups.global.title`),detail:n(`plugins.groups.global.detail`),scope:`global`}),(0,I.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fill,minmax(260px,320px))] justify-start gap-3`,children:e.map(e=>(0,I.jsx)(ue,{plugin:e},e.id))})]}),t.length>0&&(0,I.jsxs)(`section`,{children:[(0,I.jsx)(le,{title:n(`plugins.groups.project.title`),detail:n(`plugins.groups.project.detail`),scope:`project`}),(0,I.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fill,minmax(260px,320px))] justify-start gap-3`,children:t.map(e=>(0,I.jsx)(ue,{plugin:e},e.id))})]})]})}function se({text:e}){return(0,I.jsx)(`div`,{className:`flex h-[74px] max-w-[320px] items-center rounded-lg border border-dashed border-border bg-card/35 px-3 text-xs text-muted-foreground`,children:e})}function ce({scope:e}){let{t}=r(`integrations`);return(0,I.jsx)(`span`,{className:g(`rounded px-1.5 py-0.5 text-[10px] uppercase tracking-wide`,e===`global`?`bg-accent-primary/10 text-accent-primary`:`bg-accent-info/10 text-accent-info`),children:t(`plugins.scope.${e}`)})}function le({title:e,detail:t,scope:n}){return(0,I.jsxs)(`div`,{className:`mb-2 flex items-center gap-2`,children:[(0,I.jsx)(`div`,{className:g(`h-px flex-1`,n===`global`?`bg-accent-primary/30`:`bg-accent-info/30`)}),(0,I.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border border-border bg-card/70 px-2 py-1`,children:[(0,I.jsx)(ce,{scope:n}),(0,I.jsx)(`span`,{className:`text-xs font-medium`,children:e}),(0,I.jsx)(`span`,{className:`hidden text-[11px] text-muted-foreground sm:inline`,children:t})]}),(0,I.jsx)(`div`,{className:g(`h-px flex-1`,n===`global`?`bg-accent-primary/30`:`bg-accent-info/30`)})]})}function ue({plugin:e}){let{t}=r(`integrations`),n=e.icon,i=e.scope===`global`,a=e.status===`attention`,c=e.busy?s:e.actionKind===`install`?o:e.actionKind===`review`?u:N,l=g(`shrink-0 rounded border px-1.5 py-0.5 text-[10px] leading-none`,a?`border-accent-warning/30 bg-accent-warning/10 text-accent-warning`:e.installed?`border-accent-success/25 bg-accent-success/10 text-accent-success`:`border-border bg-muted text-muted-foreground`);return(0,I.jsxs)(`article`,{className:`grid h-[88px] w-full grid-cols-[38px_minmax(0,1fr)_auto] items-center gap-3 rounded-lg border border-border bg-card/70 px-3 transition-colors hover:border-accent-primary/35 hover:bg-card`,children:[(0,I.jsx)(`div`,{className:g(`grid h-[38px] w-[38px] shrink-0 place-items-center rounded-lg border`,i?`border-accent-primary/25 bg-accent-primary/10 text-accent-primary`:`border-accent-info/25 bg-accent-info/10 text-accent-info`),children:(0,I.jsx)(n,{className:`h-4 w-4`})}),(0,I.jsxs)(`div`,{className:`min-w-0`,children:[(0,I.jsx)(`h2`,{className:`truncate text-sm font-semibold leading-5`,children:e.title}),(0,I.jsx)(`p`,{className:`mt-1 truncate text-[11px] leading-4 text-muted-foreground`,children:e.description}),(0,I.jsxs)(`div`,{className:`mt-1.5 flex items-center gap-1.5`,children:[(0,I.jsx)(ce,{scope:e.scope}),(0,I.jsx)(`span`,{className:l,children:e.statusLabel})]})]}),(0,I.jsxs)(`button`,{type:`button`,disabled:e.busy,onClick:e.action,className:`flex h-7 shrink-0 items-center gap-1.5 rounded-md border border-border bg-background px-2.5 text-xs font-medium transition-colors hover:bg-muted disabled:opacity-50`,children:[(0,I.jsx)(c,{className:g(`h-3.5 w-3.5`,e.busy&&`animate-spin`)}),e.busy?t(`plugins.actions.installing`):e.actionLabel]})]})}function de({state:e,loading:t,busy:n,logs:i,onInstall:a,onToggleProvider:c,onDeactivateAll:u,onUninstall:d,onSetPort:f,onOpenDiagnostics:p}){let{t:m}=r(`integrations`),[h,g]=(0,F.useState)(String(e.port)),[_,v]=(0,F.useState)(!1);(0,F.useEffect)(()=>g(String(e.port)),[e.port]),(0,F.useEffect)(()=>{e.installed||v(!1)},[e.installed]);let y=e.activeProviders.codex||e.activeProviders.claude,b=e.installSource===`system`;return(0,I.jsxs)(`aside`,{className:`w-full min-w-0 overflow-hidden rounded-lg border border-border bg-card/80 p-4`,children:[(0,I.jsxs)(`div`,{className:`mb-4 flex items-start gap-3`,children:[(0,I.jsx)(`div`,{className:`grid h-10 w-10 place-items-center rounded-lg border border-accent-primary/25 bg-accent-primary/10 text-accent-primary`,children:(0,I.jsx)(j,{className:`h-4 w-4`})}),(0,I.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,I.jsx)(`h2`,{className:`text-sm font-semibold`,children:m(`plugins.headroom.title`)}),(0,I.jsx)(`p`,{className:`mt-1 text-xs leading-relaxed text-muted-foreground`,children:m(`plugins.headroom.panelDescription`)})]})]}),(0,I.jsxs)(`div`,{className:`mb-4 grid grid-cols-3 gap-2 text-xs`,children:[(0,I.jsx)(fe,{label:m(`plugins.headroom.metrics.install`),value:t?m(`plugins.headroom.metrics.checking`):e.installed?m(`plugins.headroom.metrics.ready`):m(`plugins.headroom.metrics.missing`),good:e.installed}),(0,I.jsx)(fe,{label:m(`plugins.headroom.metrics.source`),value:e.installSource===`system`?m(`plugins.headroom.metrics.system`):e.installSource===`managed`?m(`plugins.headroom.metrics.specrails`):m(`plugins.headroom.metrics.none`),good:e.installed}),(0,I.jsx)(fe,{label:m(`plugins.headroom.metrics.proxy`),value:e.proxyRunning?`:${e.port}`:m(y?`plugins.headroom.metrics.starting`:`plugins.headroom.metrics.off`),good:e.proxyRunning||!y})]}),e.lastIssue&&(0,I.jsx)(pe,{issue:e.lastIssue}),e.installed?(0,I.jsxs)(`div`,{className:`mb-4 space-y-2`,children:[(0,I.jsx)(_e,{provider:`codex`,active:e.activeProviders.codex,available:e.availableProviders.codex,detectedRoute:e.detectedRoutes.codex,busy:n===`activate-codex`||n===`deactivate-codex`,onClick:()=>c(`codex`,e.activeProviders.codex)}),(0,I.jsx)(_e,{provider:`claude`,active:e.activeProviders.claude,available:e.availableProviders.claude,detectedRoute:e.detectedRoutes.claude,busy:n===`activate-claude`||n===`deactivate-claude`,onClick:()=>c(`claude`,e.activeProviders.claude)}),y&&(0,I.jsxs)(`button`,{type:`button`,disabled:!!n,onClick:u,className:`flex h-8 w-full items-center justify-center gap-2 rounded-lg border border-border bg-background/45 text-xs hover:bg-muted/50 disabled:opacity-50`,children:[n===`deactivate-all`?(0,I.jsx)(s,{className:`h-3.5 w-3.5 animate-spin`}):(0,I.jsx)(M,{className:`h-3.5 w-3.5`}),m(`plugins.headroom.actions.disableAllRoutes`)]})]}):(0,I.jsxs)(`button`,{type:`button`,disabled:!!n,onClick:a,className:`mb-3 flex h-9 w-full items-center justify-center gap-2 rounded-lg bg-accent-primary px-3 text-xs font-medium text-white disabled:opacity-50`,children:[n===`install`?(0,I.jsx)(s,{className:`h-3.5 w-3.5 animate-spin`}):(0,I.jsx)(o,{className:`h-3.5 w-3.5`}),m(`plugins.headroom.actions.installWithUv`)]}),e.installed&&(0,I.jsx)(me,{state:e}),(0,I.jsxs)(`div`,{className:`mb-4 rounded-lg border border-border bg-background/45 p-3`,children:[(0,I.jsx)(`label`,{className:`mb-1 block text-[11px] font-medium text-muted-foreground`,children:m(`plugins.headroom.port.label`)}),(0,I.jsxs)(`div`,{className:`flex gap-2`,children:[(0,I.jsx)(`input`,{value:h,onChange:e=>g(e.target.value),className:`h-8 min-w-0 flex-1 rounded-md border border-border bg-background px-2 text-sm`}),(0,I.jsx)(`button`,{type:`button`,disabled:!!n||Number(h)===e.port,onClick:()=>f(Number(h)),className:`rounded-md border border-border px-2 text-xs hover:bg-muted disabled:opacity-50`,children:m(`plugins.headroom.port.apply`)})]})]}),i.length>0&&(0,I.jsx)(`pre`,{className:`mb-3 max-h-32 overflow-y-auto overflow-x-hidden whitespace-pre-wrap break-words rounded-lg border border-border bg-background/60 p-2 text-[10px] text-muted-foreground`,children:i.join(`
|
|
2
|
+
`)}),(0,I.jsxs)(`button`,{type:`button`,onClick:p,className:`mb-2 flex h-8 w-full items-center justify-center gap-2 rounded-lg border border-border text-xs hover:bg-muted/50`,children:[(0,I.jsx)(P,{className:`h-3.5 w-3.5`}),m(`plugins.headroom.actions.viewDiagnostics`)]}),e.installed&&(0,I.jsx)(`div`,{className:`rounded-lg border border-destructive/25 bg-destructive/5 p-3`,children:_?(0,I.jsxs)(`div`,{className:`space-y-2`,children:[(0,I.jsx)(`p`,{className:`text-[11px] leading-relaxed text-muted-foreground`,children:m(b?`plugins.headroom.confirmDetach`:`plugins.headroom.confirmUninstall`)}),(0,I.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,I.jsx)(`button`,{type:`button`,disabled:!!n,onClick:()=>v(!1),className:`h-8 rounded-md border border-border text-xs hover:bg-muted/50 disabled:opacity-50`,children:m(`plugins.actions.cancel`)}),(0,I.jsxs)(`button`,{type:`button`,disabled:!!n,onClick:d,className:`flex h-8 items-center justify-center gap-2 rounded-md bg-destructive px-2 text-xs font-medium text-destructive-foreground disabled:opacity-50`,children:[n===`uninstall`?(0,I.jsx)(s,{className:`h-3.5 w-3.5 animate-spin`}):(0,I.jsx)(l,{className:`h-3.5 w-3.5`}),m(b?`plugins.headroom.actions.detach`:`plugins.headroom.actions.uninstall`)]})]})]}):(0,I.jsxs)(`button`,{type:`button`,disabled:!!n,onClick:()=>v(!0),className:`flex h-8 w-full items-center justify-center gap-2 rounded-md text-xs font-medium text-destructive hover:bg-destructive/10 disabled:opacity-50`,children:[(0,I.jsx)(l,{className:`h-3.5 w-3.5`}),m(b?`plugins.headroom.actions.detachHeadroom`:`plugins.headroom.actions.uninstallHeadroom`)]})})]})}function fe({label:e,value:t,good:n}){return(0,I.jsxs)(`div`,{className:`rounded-lg border border-border bg-background/45 p-2`,children:[(0,I.jsx)(`div`,{className:`text-[10px] text-muted-foreground`,children:e}),(0,I.jsx)(`div`,{className:g(`mt-0.5 font-medium`,n?`text-foreground`:`text-accent-warning`),children:t})]})}function pe({issue:e}){let{t}=r(`integrations`),n=`plugins.headroom.issues.${e.code}`,i=t(`${n}.title`,{defaultValue:e.title}),a=t(`${n}.guidance`,{defaultValue:e.guidance});return(0,I.jsx)(`div`,{className:`mb-3 rounded-lg border border-accent-warning/35 bg-accent-warning/10 p-3`,children:(0,I.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,I.jsx)(u,{className:`mt-0.5 h-3.5 w-3.5 shrink-0 text-accent-warning`}),(0,I.jsxs)(`div`,{className:`min-w-0`,children:[(0,I.jsx)(`div`,{className:`text-xs font-medium`,children:i}),(0,I.jsx)(`p`,{className:`mt-1 text-[11px] leading-relaxed text-muted-foreground`,children:a}),(0,I.jsx)(`div`,{className:`mt-1 text-[10px] text-muted-foreground`,children:t(`plugins.headroom.issueCode`,{code:e.code})})]})]})})}function me({state:e}){let{t,i18n:n}=r(`integrations`),i=e.metrics,a=i.outputSavingsAvailable,o=[`codex`,`claude`].map(e=>({provider:e,metric:i.providers[e]})),s=t(`plugins.headroom.savings.tokens`),c=o.reduce((e,{metric:t})=>({inputTokens:e.inputTokens+t.inputTokens,inputTokensSaved:e.inputTokensSaved+t.inputTokensSaved,outputTokens:e.outputTokens+t.outputTokens,outputTokensSaved:e.outputTokensSaved+t.outputTokensSaved}),{inputTokens:0,inputTokensSaved:0,outputTokens:0,outputTokensSaved:0}),l=o.some(({metric:e})=>e.inputTokensSaved>0),u=o.some(({metric:e})=>e.active),d=t(a?`plugins.headroom.savings.statusInputOutput`:l?`plugins.headroom.savings.statusInputOnly`:u?`plugins.headroom.savings.statusRouting`:`plugins.headroom.savings.statusInactive`),f=a||l;return(0,I.jsxs)(`div`,{className:`mb-4 rounded-lg border border-border bg-background/45 p-3`,children:[(0,I.jsxs)(`div`,{className:`mb-2 flex items-center justify-between gap-2`,children:[(0,I.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,I.jsx)(D,{className:`h-3.5 w-3.5 text-accent-primary`}),(0,I.jsx)(`div`,{className:`truncate text-xs font-medium`,children:t(`plugins.headroom.savings.title`)})]}),(0,I.jsx)(`span`,{className:g(`shrink-0 rounded border px-1.5 py-0.5 text-[10px]`,f?`border-accent-success/25 bg-accent-success/10 text-accent-success`:u?`border-accent-primary/25 bg-accent-primary/10 text-accent-primary`:`border-border bg-muted text-muted-foreground`),children:d})]}),(0,I.jsxs)(`div`,{className:`mb-2 rounded-md bg-muted/35 px-2.5 py-2`,children:[(0,I.jsx)(`div`,{className:`mb-1.5 text-[10px] font-medium uppercase text-muted-foreground`,children:t(`plugins.headroom.savings.totals`)}),(0,I.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,I.jsx)(he,{label:t(`plugins.headroom.savings.input`),processed:c.inputTokens>0?$(c.inputTokens,n.language,s):t(`plugins.headroom.savings.noData`),saved:$(c.inputTokensSaved,n.language,s)}),(0,I.jsx)(he,{align:`right`,label:t(`plugins.headroom.savings.output`),processed:c.outputTokens>0?$(c.outputTokens,n.language,s):t(`plugins.headroom.savings.noData`),saved:a?$(c.outputTokensSaved,n.language,s):t(`plugins.headroom.savings.noData`)})]})]}),(0,I.jsx)(`div`,{className:`grid gap-2`,children:o.map(({provider:e,metric:t})=>(0,I.jsx)(ge,{metric:t,outputAvailable:i.outputSavingsAvailable},e))}),(0,I.jsx)(`div`,{className:`mt-2 flex items-center justify-end gap-2 text-[10px] text-muted-foreground`,children:i.updatedAt?t(`plugins.headroom.savings.updatedLive`):t(`plugins.headroom.savings.baselineSamples`,{count:e.learning.baselineSamples})})]})}function he({label:e,processed:t,saved:n,detail:i,align:a=`left`}){let{t:o}=r(`integrations`);return(0,I.jsxs)(`div`,{className:g(`min-w-0`,a===`right`&&`text-right`),children:[(0,I.jsx)(`div`,{className:`text-[10px] font-medium uppercase text-muted-foreground`,children:e}),(0,I.jsxs)(`div`,{className:`mt-1 space-y-0.5 text-[11px]`,children:[(0,I.jsxs)(`div`,{className:`flex min-w-0 items-baseline justify-between gap-2`,children:[(0,I.jsx)(`span`,{className:`shrink-0 text-muted-foreground`,children:o(`plugins.headroom.savings.processed`)}),(0,I.jsx)(`span`,{className:`truncate font-semibold tabular-nums text-foreground`,children:t})]}),(0,I.jsxs)(`div`,{className:`flex min-w-0 items-baseline justify-between gap-2`,children:[(0,I.jsx)(`span`,{className:`shrink-0 text-muted-foreground`,children:o(`plugins.headroom.savings.saved`)}),(0,I.jsx)(`span`,{className:`truncate font-semibold tabular-nums text-foreground`,children:n})]})]}),i&&(0,I.jsx)(`div`,{className:`mt-1 truncate text-[10px] text-muted-foreground`,children:i})]})}function ge({metric:e,outputAvailable:t}){let{t:n,i18n:i}=r(`integrations`),a=!e.available,o=a||!e.active,s=n(`plugins.headroom.savings.tokens`),c=e.inputTokens>0?$(e.inputTokens,i.language,s):n(`plugins.headroom.savings.noData`),l=$(e.inputTokensSaved,i.language,s),u=e.outputTokens>0?$(e.outputTokens,i.language,s):n(`plugins.headroom.savings.noData`),d=t?$(e.outputTokensSaved,i.language,s):e.active?n(`plugins.headroom.savings.noData`):n(`plugins.headroom.savings.off`),f=e.requests>0?n(`plugins.headroom.savings.requestCount`,{count:Q(e.requests,i.language)}):a?n(`plugins.headroom.provider.noProjectUsesProvider`):e.active?n(`plugins.headroom.savings.inputSavingsActive`):n(`plugins.headroom.savings.routeDisabled`);return(0,I.jsxs)(`div`,{className:g(`rounded-md border border-border bg-card/45 px-2.5 py-2`,o&&`opacity-70`),children:[(0,I.jsxs)(`div`,{className:`flex min-w-0 items-center gap-1.5`,children:[(0,I.jsx)(`span`,{className:`text-xs font-medium`,children:e.label}),e.detectedRoute&&(0,I.jsx)(`span`,{className:`rounded bg-accent-primary/10 px-1.5 py-0.5 text-[9px] uppercase text-accent-primary`,children:n(`plugins.headroom.savings.detected`)})]}),(0,I.jsx)(`div`,{className:`mt-0.5 truncate text-[10px] text-muted-foreground`,children:f}),(0,I.jsxs)(`div`,{className:`mt-2 grid grid-cols-2 gap-3`,children:[(0,I.jsx)(he,{label:n(`plugins.headroom.savings.input`),processed:c,saved:l}),(0,I.jsx)(he,{align:`right`,label:n(`plugins.headroom.savings.output`),processed:u,saved:d})]})]})}function _e({provider:e,active:t,available:n,detectedRoute:i,busy:a,onClick:o}){let{t:c}=r(`integrations`),l=c(n?t?`plugins.headroom.provider.routedThroughHeadroom`:i?`plugins.headroom.provider.detectedExternalRoute`:`plugins.headroom.provider.notRouted`:`plugins.headroom.provider.noProjectUsesProvider`);return(0,I.jsxs)(`button`,{type:`button`,onClick:o,disabled:a||!n,className:`flex w-full items-center gap-3 rounded-lg border border-border bg-background/45 p-3 text-left hover:bg-muted/35 disabled:opacity-50`,children:[(0,I.jsx)(`div`,{className:g(`grid h-8 w-8 place-items-center rounded-md`,t?`bg-accent-success/15 text-accent-success`:`bg-muted text-muted-foreground`),children:a?(0,I.jsx)(s,{className:`h-3.5 w-3.5 animate-spin`}):(0,I.jsx)(A,{className:`h-3.5 w-3.5`})}),(0,I.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,I.jsx)(`div`,{className:`text-xs font-medium capitalize`,children:e}),(0,I.jsx)(`div`,{className:`text-[11px] text-muted-foreground`,children:l})]}),(0,I.jsx)(`span`,{className:g(`h-5 w-9 rounded-full p-0.5 transition-colors`,t?`bg-accent-success`:`bg-muted`),children:(0,I.jsx)(`span`,{className:g(`block h-4 w-4 rounded-full bg-white shadow transition-transform`,t&&`translate-x-4`)})})]})}function ve({plugin:e,projects:t,onClose:n}){let{t:i}=r(`integrations`),[a,o]=(0,F.useState)(``);(0,F.useEffect)(()=>o(``),[e]);let s=t.find(e=>e.id===a)??null;return(0,I.jsx)(x,{open:!!e,onOpenChange:e=>{e||n()},children:(0,I.jsxs)(v,{className:`w-[calc(100vw-2rem)] max-w-3xl overflow-x-hidden p-4 sm:p-6`,children:[(0,I.jsxs)(_,{children:[(0,I.jsx)(y,{children:i(e===`jira`?`plugins.projectWizard.configureJira`:`plugins.projectWizard.installSerena`)}),(0,I.jsx)(b,{children:i(`plugins.projectWizard.description`)})]}),(0,I.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-[260px_minmax(0,1fr)]`,children:[(0,I.jsxs)(`div`,{className:`rounded-lg border border-border bg-card/70 p-3`,children:[(0,I.jsx)(`div`,{className:`mb-2 text-xs font-medium text-muted-foreground`,children:i(`plugins.projectWizard.chooseProject`)}),(0,I.jsx)(`div`,{className:`max-h-[52vh] space-y-1 overflow-auto`,children:t.map(t=>{let n=e===`serena`&&!p(t).some(e=>K.has(e));return(0,I.jsxs)(`button`,{type:`button`,disabled:n,onClick:()=>o(t.id),className:g(`w-full rounded-md px-2 py-2 text-left transition-colors`,t.id===a?`bg-muted text-foreground`:`text-muted-foreground hover:bg-muted/45 hover:text-foreground`,n&&`cursor-not-allowed opacity-45`),children:[(0,I.jsx)(`div`,{className:`truncate text-xs font-medium`,children:t.name}),(0,I.jsx)(`div`,{className:`truncate text-[10px]`,children:n?i(`plugins.projectWizard.requiresSupportedProvider`,{defaultValue:`Requires Claude, Codex, or Kimi`}):t.path})]},t.id)})})]}),(0,I.jsx)(`div`,{className:`min-h-[360px] rounded-lg border border-border bg-card/70 p-4`,children:s?e===`jira`?(0,I.jsx)(ye,{project:s,onDone:n}):(0,I.jsx)(be,{project:s,onDone:n}):(0,I.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:i(`plugins.projectWizard.selectProjectToContinue`)})})]})]})})}function ye({project:e,onDone:t}){let{t:n}=r(`integrations`),i=Z(e.id),[a,o]=(0,F.useState)(null),[c,l]=(0,F.useState)(!0),[u,d]=(0,F.useState)(null),f=(0,F.useCallback)(async()=>{l(!0),d(null);try{let e=await fetch(`${i}/jira/connection`).then(e=>X(e));o(e)}catch(e){o({connected:!1}),d(e.message)}finally{l(!1)}},[i]);return(0,F.useEffect)(()=>{f()},[f]),c?(0,I.jsxs)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:[(0,I.jsx)(s,{className:`mr-2 h-4 w-4 animate-spin`}),n(`plugins.jira.loading`,{defaultValue:`Loading Jira...`})]}):a?.connected&&a.connection?(0,I.jsxs)(`div`,{className:`space-y-4`,children:[(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`h3`,{className:`text-sm font-semibold`,children:n(`plugins.jira.titleForProject`,{name:e.name,defaultValue:`Jira for ${e.name}`})}),(0,I.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:n(`plugins.jira.configuredDescription`,{defaultValue:`Manage the Jira project, status mapping, discard status, sync, and connection state.`})})]}),(0,I.jsx)(U,{state:a,apiBase:i,onChanged:()=>{f()}})]}):(0,I.jsxs)(`div`,{className:`space-y-4`,children:[(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`h3`,{className:`text-sm font-semibold`,children:n(`plugins.jira.titleForProject`,{name:e.name,defaultValue:`Jira for ${e.name}`})}),(0,I.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:u?n(`plugins.jira.loadFailed`,{message:u,defaultValue:`Could not load the current Jira configuration: ${u}`}):n(`plugins.jira.notConfiguredDescription`,{defaultValue:`Connect this project to Jira.`})})]}),(0,I.jsx)(R,{apiBase:i,onConnected:()=>{f()},onSkip:t})]})}function be({project:e,onDone:t}){let{t:n}=r(`integrations`),i=(0,F.useMemo)(()=>p(e).filter(e=>K.has(e)),[e]),a=i.includes(e.provider)?e.provider:i[0]??e.provider,[c,l]=(0,F.useState)(a),[d,f]=(0,F.useState)(null),[m,h]=(0,F.useState)(null),[g,_]=(0,F.useState)(!1),[v,y]=(0,F.useState)(null),b=(0,F.useRef)(0);(0,F.useEffect)(()=>{l(a),f(null),h(null)},[e.id,a]);let x=(0,F.useCallback)(async()=>{let t=++b.current;y(null);try{let n=`?provider=${encodeURIComponent(c)}`,r=await fetch(`${Z(e.id)}/plugins${n}`).then(e=>X(e));if(t!==b.current)return;let i=r.plugins.find(e=>e.name===`serena`)??null;if(f(i),h(null),i?.status===`not-installed`){let r=await fetch(`${Z(e.id)}/plugins/serena/preview-install${n}`).then(e=>X(e));t===b.current&&h(r)}}catch(e){t===b.current&&y(e.message)}},[e.id,c]);(0,F.useEffect)(()=>{x()},[x]);async function S(){_(!0),y(null);try{await fetch(`${Z(e.id)}/plugins/serena/install`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({provider:c})}).then(e=>X(e)),await x(),t()}catch(e){y(e.message)}finally{_(!1)}}let T=(m?.requirements??[]).every(e=>e.installed&&e.executable&&e.meetsMinimum),E=d?n(`plugins.projectStatus.${d.status}`,{defaultValue:d.status}):``,D=d?.name===`serena`?n(`plugins.catalog.serena.description`):d?.description;return!d&&!v?(0,I.jsxs)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:[(0,I.jsx)(s,{className:`mr-2 h-4 w-4 animate-spin`}),` `,n(`plugins.serena.loading`)]}):(0,I.jsxs)(`div`,{className:`space-y-4`,children:[(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`h3`,{className:`text-sm font-semibold`,children:n(`plugins.serena.titleForProject`,{name:e.name})}),(0,I.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:n(`plugins.serena.description`)})]}),(0,I.jsxs)(`label`,{className:`block space-y-1`,children:[(0,I.jsx)(`span`,{className:`text-xs font-medium`,children:n(`plugins.serena.provider`,{defaultValue:`AI provider`})}),(0,I.jsx)(`select`,{"aria-label":n(`plugins.serena.provider`,{defaultValue:`AI provider`}),value:c,disabled:g,onChange:e=>{f(null),h(null),l(e.target.value)},className:`w-full rounded-md border border-border bg-background px-2 py-1.5 text-xs`,children:i.map(e=>(0,I.jsx)(`option`,{value:e,children:C(e)},e))})]}),d&&(0,I.jsxs)(`div`,{className:`rounded-lg border border-border bg-background/45 p-3`,children:[(0,I.jsx)(`div`,{className:`text-xs font-medium`,children:n(`plugins.serena.status`,{status:E})}),D&&(0,I.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:D})]}),m&&(0,I.jsxs)(`div`,{className:`space-y-3`,children:[(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`div`,{className:`mb-1 text-xs font-medium`,children:n(`plugins.serena.files`)}),(0,I.jsx)(`ul`,{className:`space-y-1 text-xs font-mono`,children:m.files.map(e=>(0,I.jsxs)(`li`,{className:e.op===`create`?`text-accent-success`:`text-accent-info`,children:[e.op===`create`?`+ `:`~ `,e.path]},e.path))})]}),(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`div`,{className:`mb-1 text-xs font-medium`,children:n(`plugins.serena.prerequisites`)}),(0,I.jsx)(`ul`,{className:`space-y-1 text-xs`,children:m.requirements.map(e=>(0,I.jsxs)(`li`,{className:`flex items-center gap-2`,children:[e.installed&&e.executable&&e.meetsMinimum?(0,I.jsx)(w,{className:`h-3 w-3 text-accent-success`}):(0,I.jsx)(u,{className:`h-3 w-3 text-accent-warning`}),(0,I.jsxs)(`span`,{children:[e.name,e.minVersion?` >= ${e.minVersion}`:``]}),e.version&&(0,I.jsxs)(`span`,{className:`text-muted-foreground`,children:[`(`,e.version,`)`]})]},e.name))})]})]}),v&&(0,I.jsx)(`div`,{className:`rounded-lg border border-destructive/30 bg-destructive/10 p-3 text-xs text-destructive`,children:v}),(0,I.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,I.jsx)(`button`,{type:`button`,onClick:t,className:`rounded-md border border-border px-3 py-1.5 text-xs`,children:n(`plugins.actions.cancel`)}),(0,I.jsxs)(`button`,{type:`button`,disabled:g||d?.status!==`not-installed`||!T,onClick:S,className:`flex items-center gap-2 rounded-md bg-accent-primary px-3 py-1.5 text-xs text-white disabled:opacity-50`,children:[g?(0,I.jsx)(s,{className:`h-3.5 w-3.5 animate-spin`}):(0,I.jsx)(o,{className:`h-3.5 w-3.5`}),n(`plugins.actions.install`)]})]})]})}function xe({open:e,onClose:t}){let{t:n}=r(`integrations`),[i,a]=(0,F.useState)(null);return(0,F.useEffect)(()=>{e&&fetch(`${d}/api/global-plugins/headroom/diagnostics`).then(e=>X(e)).then(a).catch(e=>a({error:e.message}))},[e]),(0,I.jsx)(x,{open:e,onOpenChange:e=>{e||t()},children:(0,I.jsxs)(v,{className:`max-w-3xl`,children:[(0,I.jsxs)(_,{children:[(0,I.jsxs)(y,{className:`flex items-center gap-2`,children:[(0,I.jsx)(N,{className:`h-4 w-4`}),` `,n(`plugins.diagnostics.title`)]}),(0,I.jsx)(b,{children:n(`plugins.diagnostics.description`)})]}),(0,I.jsx)(`pre`,{className:`max-h-[62vh] overflow-y-auto overflow-x-hidden whitespace-pre-wrap break-words rounded-lg border border-border bg-background p-3 text-xs`,children:JSON.stringify(i,null,2)})]})})}export{ae as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t,t as n}from"./jsx-runtime-zu2_FqZY.js";import{n as r,t as i}from"./createLucideIcon-Bjbbp_KS.js";import{t as a}from"./git-branch-BRM0F5GN.js";import{r as o}from"./useDesktop-B6Du2N83.js";import{t as s}from"./utils-BC4DHlz2.js";import{a as c,n as l,o as u,r as d,t as f}from"./dialog-CzIekCw0.js";import{Pt as p,X as m,_ as h,et as g,f as _,g as v,h as y,m as b,p as x,rt as S,tt as C}from"./index-C_sdsSZt.js";var w=i(`key-round`,[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`,key:`1s6t7t`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`w0ekpg`}]]),T=e(t(),1),E=n(),D=[{id:`general`,icon:C,labelKey:`projectDialog.nav.general`},{id:`branch`,icon:a,labelKey:`projectDialog.nav.branch`},{id:`environment`,icon:w,labelKey:`projectDialog.nav.environment`},{id:`budget`,icon:m,labelKey:`projectDialog.nav.budget`},{id:`telemetry`,icon:p,labelKey:`projectDialog.nav.telemetry`},{id:`terminal`,icon:g,labelKey:`projectDialog.nav.terminal`}];function O({open:e,onClose:t}){let{t:n}=r(`settings`),{activeProjectId:i,projects:a}=o(),p=a.find(e=>e.id===i),[m,g]=(0,T.useState)(`general`),C=e=>s(`space-y-5`,m===e?``:`hidden`);return(0,E.jsx)(f,{open:e,onOpenChange:e=>{e||t()},children:(0,E.jsxs)(l,{movableResizable:!0,className:`flex max-w-5xl w-[92vw] h-[82vh] flex-col overflow-hidden`,children:[(0,E.jsxs)(c,{children:[(0,E.jsxs)(u,{className:`flex items-center gap-2`,children:[(0,E.jsx)(S,{className:`w-4 h-4`}),p?n(`projectDialog.title`,{name:p.name}):n(`page.title`)]}),(0,E.jsx)(d,{children:n(`projectDialog.description`)})]}),(0,E.jsxs)(`div`,{className:`flex min-h-0 flex-1 gap-5 py-2`,children:[(0,E.jsx)(`nav`,{className:`w-40 shrink-0 space-y-0.5 overflow-y-auto border-r border-border pr-2`,children:D.map(e=>{let t=e.icon;return(0,E.jsxs)(`button`,{type:`button`,onClick:()=>g(e.id),className:s(`flex w-full items-center gap-2 rounded-lg px-2.5 py-1.5 text-left text-xs transition-colors`,m===e.id?`bg-accent-primary/15 font-medium text-foreground`:`text-muted-foreground hover:bg-muted/40 hover:text-foreground`),children:[(0,E.jsx)(t,{className:`w-3.5 h-3.5 shrink-0`}),(0,E.jsx)(`span`,{className:`truncate`,children:n(e.labelKey)})]},e.id)})}),(0,E.jsxs)(`div`,{className:`min-w-0 flex-1 overflow-y-auto pr-1`,children:[(0,E.jsx)(`div`,{className:C(`general`),children:(0,E.jsx)(b,{})}),(0,E.jsx)(`div`,{className:C(`branch`),children:(0,E.jsx)(x,{})}),(0,E.jsx)(`div`,{className:C(`environment`),children:(0,E.jsx)(v,{})}),(0,E.jsx)(`div`,{className:C(`budget`),children:(0,E.jsx)(_,{})}),(0,E.jsx)(`div`,{className:C(`telemetry`),children:(0,E.jsx)(y,{})}),(0,E.jsx)(`div`,{className:C(`terminal`),children:(0,E.jsx)(h,{mode:`project`})})]})]})]})})}export{O as ProjectSettingsDialog};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./jsx-runtime-zu2_FqZY.js";import{n as t}from"./createLucideIcon-Bjbbp_KS.js";import{t as n}from"./brain-DI9lHkKY.js";import{t as r}from"./download-CFHyyHcw.js";import{t as i}from"./git-branch-BRM0F5GN.js";import{t as a}from"./play-DNlrawbS.js";import{t as o}from"./button-BUIIBQPT.js";import{a as s,i as c,n as l,o as u,r as d,t as f}from"./dialog-CzIekCw0.js";import{$ as p,C as m,Z as h,wt as g}from"./index-C_sdsSZt.js";var _=e(),v={start:a,"ai-step":n,shell:h,decider:i,condition:i,end:p};function y(e){return e.type===`ai-step`?typeof e.data?.prompt==`string`?e.data.prompt:null:e.type===`shell`?typeof e.data?.command==`string`?e.data.command:null:e.type===`decider`?typeof e.data?.goal==`string`?e.data.goal:null:e.type===`end`?e.data?.outcome===`failure`?`failure`:`success`:null}function b({template:e,onClose:i,onUse:a,mode:h=`use`}){let{t:b}=t(`loops`);return(0,_.jsx)(f,{open:e!==null,onOpenChange:e=>{e||i()},children:(0,_.jsx)(l,{movableResizable:!0,className:`max-w-lg`,children:e&&(0,_.jsxs)(_.Fragment,{children:[(0,_.jsxs)(s,{children:[(0,_.jsxs)(u,{className:`flex items-center gap-2`,children:[(0,_.jsx)(n,{className:`w-4 h-4 text-accent-highlight`}),e.name]}),(0,_.jsx)(d,{children:e.description})]}),(0,_.jsxs)(`div`,{className:`flex flex-wrap gap-1.5`,children:[m(e.graph)?(0,_.jsx)(`span`,{title:b(`gallery.needsSpecHint`),className:`px-1.5 py-0.5 rounded text-[10px] bg-accent-secondary/15 text-accent-secondary`,children:b(`gallery.needsSpec`)}):(0,_.jsx)(`span`,{title:b(`gallery.standaloneHint`),className:`px-1.5 py-0.5 rounded text-[10px] bg-accent-success/15 text-accent-success`,children:b(`gallery.standalone`)}),e.category&&(0,_.jsx)(`span`,{className:`px-1.5 py-0.5 rounded text-[10px] bg-accent-info/15 text-accent-info`,children:b(`categories.${e.category}`,{defaultValue:e.category})}),e.tags.map(e=>(0,_.jsx)(`span`,{className:`px-1.5 py-0.5 rounded text-[10px] bg-muted text-muted-foreground`,children:e},e))]}),(0,_.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:e.graph.config.timeoutMinutes>0?b(`preview.limits`,{iterations:e.graph.config.maxIterations,timeout:e.graph.config.timeoutMinutes}):b(`preview.limitsNoTimeout`,{iterations:e.graph.config.maxIterations})}),(0,_.jsxs)(`div`,{className:`max-h-[50vh] overflow-y-auto space-y-1.5 pr-1`,children:[(0,_.jsx)(`span`,{className:`block text-[10px] font-medium uppercase tracking-wide text-muted-foreground`,children:b(`preview.steps`)}),e.graph.nodes.map((e,t)=>{let n=v[e.type]??p,r=y(e);return(0,_.jsxs)(`div`,{className:`rounded border border-border bg-surface/30 p-2`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-medium text-foreground`,children:[(0,_.jsxs)(`span`,{className:`text-[10px] text-muted-foreground tabular-nums`,children:[t+1,`.`]}),(0,_.jsx)(n,{className:`w-3.5 h-3.5 text-accent-primary`}),b(`builder.nodes.${e.type}`)]}),r&&(0,_.jsx)(`pre`,{className:`mt-1 whitespace-pre-wrap break-words text-[11px] text-muted-foreground font-mono`,children:r})]},e.id)})]}),(0,_.jsxs)(c,{children:[(0,_.jsx)(o,{variant:`ghost`,onClick:i,children:b(`common:actions.cancel`)}),(0,_.jsxs)(o,{onClick:()=>a(e.id),children:[h===`fork`?(0,_.jsx)(g,{className:`w-3.5 h-3.5 mr-1.5`}):(0,_.jsx)(r,{className:`w-3.5 h-3.5 mr-1.5`}),b(h===`fork`?`actions.fork`:`actions.use`)]})]})]})})})}export{b as n,y as r,v as t};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/dist-js-BmsFWRly.js","assets/index-C_sdsSZt.js","assets/rolldown-runtime-CNC7AqOf.js","assets/jsx-runtime-zu2_FqZY.js","assets/react-dom-DiWzBDP9.js","assets/preload-helper-Czpn1I53.js","assets/chunk-KS7C4IRE-Cx5sqopX.js","assets/i18n-nJQvD5zJ.js","assets/createLucideIcon-Bjbbp_KS.js","assets/activity-DiyjsgQV.js","assets/addspec-D2YIQ0GU.js","assets/agent-mTCsAbCl.js","assets/agents-ms7TwG16.js","assets/agentstudio-CN2pokQu.js","assets/aiedit-iIjz2_Qk.js","assets/analytics-BMzCvrCU.js","assets/attachments-B53PG733.js","assets/browser-CXUcnTMI.js","assets/builder-CHuahItu.js","assets/chat-BGD7MXAy.js","assets/code-CHPkOkDS.js","assets/commands-DyUZQ1FI.js","assets/common-DHsv9N5d.js","assets/dashboard-CTsM8x3m.js","assets/explore-DgBACn39.js","assets/integrations-mB-7zoyT.js","assets/jira-CKJg3HZd.js","assets/jobs-B_TeSQxb.js","assets/loops-CnxqL8IL.js","assets/mcp-uDkXYu4L.js","assets/nav-DjkmQJjd.js","assets/settings-CuVwOpe0.js","assets/setup-3jWaoVUO.js","assets/specs-DII0C8gw.js","assets/terminal-BFRZnMPP.js","assets/tickets-W6pBmbrX.js","assets/Trans-CTqw6rr9.js","assets/dist-bVqfYmby.js","assets/arrow-left-CpIR4j7G.js","assets/useBrowserCaptureSession-BBXBN0Na.js","assets/auth-D_5bQv5W.js","assets/api-B2M7CtDw.js","assets/arrow-up-right-9DoMn7fD.js","assets/MinimizedChatsContext-CHsu3NCX.js","assets/sparkles-DrY8hb0X.js","assets/x-CBMI9ejn.js","assets/useSharedWebSocket-DK96ctb7.js","assets/useDesktop-B6Du2N83.js","assets/external-link-BcU5EWZp.js","assets/chevron-right-CViMxucY.js","assets/circle-x-CMYsN4ZH.js","assets/download-CFHyyHcw.js","assets/file-text-CFT-xXKN.js","assets/git-branch-BRM0F5GN.js","assets/loader-circle-DcygOQpC.js","assets/pencil-C9RkrIPZ.js","assets/play-DNlrawbS.js","assets/plus-CsnjfkmX.js","assets/save-28sIlCdr.js","assets/search-Cq_gE3Ik.js","assets/trash-2-BOU3WdZZ.js","assets/triangle-alert-H9T4jAmh.js","assets/zap-CHo3aCD1.js","assets/dist-Cez5CRkX.js","assets/button-BUIIBQPT.js","assets/clsx-CjueKrWZ.js","assets/utils-BC4DHlz2.js","assets/dialog-CzIekCw0.js","assets/provider-capabilities-Doej9lfa.js","assets/lib-CGdyxIWg.js","assets/getTimezoneOffsetInMilliseconds-EjGOpn4b.js","assets/index-DCN5QbDm.css"])))=>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{l as a}from"./chunk-KS7C4IRE-Cx5sqopX.js";import{_ as o,a as s,f as c,h as l,o as u,v as d}from"./i18n-nJQvD5zJ.js";import{t as f}from"./Trans-CTqw6rr9.js";import{n as p,t as m}from"./createLucideIcon-Bjbbp_KS.js";import{n as h}from"./dist-bVqfYmby.js";import{t as g}from"./arrow-left-CpIR4j7G.js";import{c as _,g as v,h as y,i as b,m as x,o as S,t as C,u as w}from"./useBrowserCaptureSession-BBXBN0Na.js";import{n as T,u as E}from"./MinimizedChatsContext-CHsu3NCX.js";import{n as D,t as ee}from"./external-link-BcU5EWZp.js";import{t as te}from"./circle-x-CMYsN4ZH.js";import{t as ne}from"./download-CFHyyHcw.js";import{t as O}from"./file-text-CFT-xXKN.js";import{t as re}from"./git-branch-BRM0F5GN.js";import{t as ie}from"./loader-circle-DcygOQpC.js";import{t as ae}from"./pencil-C9RkrIPZ.js";import{t as k}from"./play-DNlrawbS.js";import{t as oe}from"./plus-CsnjfkmX.js";import{t as se}from"./save-28sIlCdr.js";import{t as ce}from"./search-Cq_gE3Ik.js";import{t as le}from"./trash-2-BOU3WdZZ.js";import{t as A}from"./triangle-alert-H9T4jAmh.js";import{t as ue}from"./x-CBMI9ejn.js";import{t as de}from"./zap-CHo3aCD1.js";import{a as j}from"./auth-D_5bQv5W.js";import{r as fe}from"./useSharedWebSocket-DK96ctb7.js";import{t as M}from"./api-B2M7CtDw.js";import{r as N}from"./useDesktop-B6Du2N83.js";import{t as P}from"./button-BUIIBQPT.js";import{t as F}from"./utils-BC4DHlz2.js";import{a as pe,c as me,i as he,n as ge,o as _e,r as ve,s as ye,t as be}from"./dialog-CzIekCw0.js";import{t as xe}from"./jira-api-Bhixwn-d.js";import{n as Se}from"./provider-capabilities-Doej9lfa.js";import{n as I,t as L}from"./lib-CGdyxIWg.js";import{t as R}from"./formatDistanceToNow-BOuXgebD.js";import{n as Ce}from"./spending-BpYPsevQ.js";var we=m(`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`}]]),z=m(`circle`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),Te=m(`columns-2`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M12 3v18`,key:`108xh3`}]]),Ee=m(`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`}]]),De=m(`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`}]]),Oe=m(`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`}]]),ke=m(`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`}]]),Ae=m(`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`}]]),je=m(`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`}]]),B=m(`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`}]]),V=new Map,H=2e3;function Me(e){V.set(e,(V.get(e)??0)+1)}function Ne(e){(V.get(e)??0)<=0||setTimeout(()=>{let t=(V.get(e)??0)-1;t<=0?V.delete(e):V.set(e,t)},H)}function Pe(e){return e?(V.get(e)??0)>0:!1}var U=e(t(),1),Fe=3e3,Ie=`
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Contract Layer
|
|
7
|
+
|
|
8
|
+
`;function W(e){return`${j}/api/projects/${encodeURIComponent(e)}`}function Le(e,t){return JSON.stringify(e)===JSON.stringify(t)}function Re(e,t){let n=new Map(e.map(e=>[e.id,e])),r=t.map(e=>{let t=n.get(e.id);return t&&Le(t,e)?t:e});return r.length===e.length&&r.every((t,n)=>t===e[n])?e:r}function G(){let{t:e}=p(`tickets`),{activeProjectId:t}=N(),[n,r]=(0,U.useState)([]),[i,a]=(0,U.useState)(!1),[o,s]=(0,U.useState)(null),[c,l]=(0,U.useState)(new Set),[u,d]=(0,U.useState)(new Set),f=(0,U.useRef)(t);f.current=t;let m=(0,U.useRef)(0),g=(0,U.useRef)(null),_=(0,U.useRef)(new Set),{registerHandler:v,unregisterHandler:y,connectionStatus:b}=fe(),x=(0,U.useId)(),S=(0,U.useCallback)(async(e,t)=>{let n=W(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??[]},[]),C=(0,U.useCallback)(async(t,n)=>{let i=++m.current;g.current?.abort();let o=new AbortController;g.current=o,f.current===t&&(a(!0),s(null));try{let a=await S(t,o.signal);if(o.signal.aborted||i!==m.current||f.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=>Re(e,a)),c.size>0&&s.size>0&&(l(c),h.success(e(`toasts.newTicketsAdded`,{count:c.size}),{id:`tickets-added-${t}`}),setTimeout(()=>{f.current===t&&l(e=>{let t=new Set(e);for(let e of c)t.delete(e);return t})},Fe))}catch(e){if(o.signal.aborted||i!==m.current||f.current!==t)return;s(e instanceof Error?e.message:String(e))}finally{i===m.current&&(g.current===o&&(g.current=null),f.current===t&&a(!1))}},[S,e]),w=(0,U.useCallback)(async()=>{t&&await C(t,`merge`)},[t,C]);(0,U.useEffect)(()=>{if(m.current+=1,g.current?.abort(),g.current=null,r([]),a(!1),s(null),_.current=new Set,l(new Set),d(new Set),t)return C(t,`replace`),()=>{m.current+=1,g.current?.abort(),g.current=null}},[t,C]);let T=(0,U.useCallback)(t=>{let n=t;if(!n||typeof n.type!=`string`)return;let i=f.current;if(!(n.projectId&&n.projectId!==i))switch(n.type){case`mcp.activity`:n.affectedProjectId&&n.affectedProjectId===i&&w();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])),Pe(i)||h.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})},Fe);break}case`ticket_updated`:{if(!n.ticket)break;if(n.ticket.id===0){w();break}let e=n.ticket;r(t=>t.map(t=>t.id===e.id?e:t)),typeof e.description==`string`&&e.description.includes(Ie)&&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}}},[w,e]);(0,U.useLayoutEffect)(()=>(v(`tickets-${x}`,T),()=>y(`tickets-${x}`)),[T,v,y,x]);let E=(0,U.useRef)(b);return(0,U.useEffect)(()=>{E.current!==`connected`&&b===`connected`&&f.current&&w(),E.current=b},[b,w]),{tickets:n,loading:i,isLoading:i,error:o,newTicketIds:c,contractRefiningIds:u,refetch:w,refresh:w,deleteTicket:(0,U.useCallback)(async e=>{let n=t;if(!n)return!1;try{let t=await fetch(`${W(n)}/tickets/${e}`,{method:`DELETE`});return t.ok&&f.current===n&&await C(n,`merge`),t.ok}catch{return!1}},[t,C]),updateTicketStatus:(0,U.useCallback)(async(e,n)=>{let r=t;if(!r)return!1;try{let t=await fetch(`${W(r)}/tickets/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({status:n})});return t.ok&&f.current===r&&await C(r,`merge`),t.ok}catch{return!1}},[t,C]),updateTicketPriority:(0,U.useCallback)(async(e,n)=>{let r=t;if(!r)return!1;try{let t=await fetch(`${W(r)}/tickets/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({priority:n})});return t.ok&&f.current===r&&await C(r,`merge`),t.ok}catch{return!1}},[t,C]),createTicket:(0,U.useCallback)(async e=>{let n=t;if(!n)return!1;try{let t=await fetch(`${W(n)}/tickets`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});return t.ok&&f.current===n&&await C(n,`merge`),t.ok}catch{return!1}},[t,C]),updateTicket:(0,U.useCallback)(async(e,n)=>{let r=t;if(!r)return!1;try{let t=await fetch(`${W(r)}/tickets/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n)});return t.ok&&f.current===r&&await C(r,`merge`),t.ok}catch{return!1}},[t,C])}}var K=n(),ze=224,Be=8,Ve=8;function He({rails:e,onMoveToRail:t,onClose:n,anchorRect:r}){let{t:i}=p(`tickets`),a=(0,U.useRef)(null),[o,s]=(0,U.useState)(!1);(0,U.useLayoutEffect)(()=>{let e=requestAnimationFrame(()=>s(!0));return()=>cancelAnimationFrame(e)},[]),(0,U.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,U.useMemo)(()=>{let e=r.left+r.width/2,t=e-ze/2,n=window.innerWidth-ze-Be,i=Math.max(Be,Math.min(n,t)),a=e-i,o=Math.max(12,Math.min(ze-12,a));return{top:r.bottom+Ve,left:i,caretLeft:o}},[r]);return(0,K.jsxs)(`div`,{ref:a,role:`dialog`,"aria-label":i(`rail.popoverTitle`),"data-testid":`move-to-rail-popover`,style:{top:c,left:l,width:ze,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,K.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,K.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,K.jsx)(`div`,{className:`px-2 py-2 text-xs text-muted-foreground`,children:i(`rail.noRails`)}):(0,K.jsx)(`ul`,{className:`flex flex-col`,children:e.map(e=>(0,K.jsx)(`li`,{children:(0,K.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,K.jsx)(k,{className:`w-3 h-3 text-accent-success animate-pulse shrink-0`,"aria-hidden":!0}):(0,K.jsx)(z,{className:`w-3 h-3 text-muted-foreground/60 shrink-0`,"aria-hidden":!0}),(0,K.jsx)(`span`,{className:`flex-1 truncate`,children:e.label}),(0,K.jsx)(we,{className:`w-3.5 h-3.5 text-muted-foreground/40 shrink-0`,"aria-hidden":!0})]})},e.id))})]})}var Ue=/\n*##\s*Acceptance Criteria\s*\n([\s\S]*?)(?=\n##\s|\n*$)/i;function We(e){if(!e)return{body:``,criteria:[]};let t=Ue.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 Ge=new Set([`draft`,`todo`]);function Ke(e){return!!(Ge.has(e.status)||e.source===`jira`&&e.jira_key&&e.status!==`cancelled`)}function qe(){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)})}var Je=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_TERMINAL_PANEL;return typeof e!=`string`||e!==`false`})(),Ye=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_AGENTS_SECTION;return typeof e!=`string`||e!==`false`})(),Xe=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_CODE_EXPLORER;return typeof e!=`string`||e!==`false`})(),q=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_JIRA;return typeof e!=`string`||e!==`false`})(),J=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_MCP;return typeof e!=`string`||e!==`false`})(),Ze=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_AGENT_CHAT;return typeof e!=`string`||e!==`false`})(),Qe=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_AGENT_MODE;return Ze&&(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 Y=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_LOOPS_SECTION;return typeof e!=`string`||e!==`false`})(),X=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_PROJECT_BUILDER;return typeof e!=`string`||e!==`false`})();function $e(){let{activeProjectId:e}=N(),[t,n]=(0,U.useState)({connected:!1,key:null,discardStatus:null}),[r,i]=(0,U.useState)(!0);return(0,U.useEffect)(()=>{if(!q||!e){n({connected:!1,key:null,discardStatus:null}),i(!1);return}let t=!1;return i(!0),xe.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 et({open:e,onOpenChange:t,ticket:n,discardStatus:r,onDiscarded:i}){let{t:a}=p(`jira`),[o,s]=(0,U.useState)(``),[c,l]=(0,U.useState)(!1);async function u(){l(!0);try{await xe.discardSpec(n.id,o.trim()||null),h.success(a(`discard.movedToast`,{status:r,key:n.jira_key??`#${n.id}`})),t(!1),s(``),i?.()}catch(e){h.error(e instanceof Error?e.message:a(`errors.generic`))}finally{l(!1)}}return(0,K.jsx)(be,{open:e,onOpenChange:e=>{c||t(e)},children:(0,K.jsxs)(ge,{movableResizable:!0,className:`max-w-md`,"data-testid":`jira-discard-dialog`,children:[(0,K.jsxs)(pe,{children:[(0,K.jsx)(_e,{children:a(`discard.title`,{status:r})}),(0,K.jsx)(ve,{children:a(`discard.body`,{status:r,key:n.jira_key??`#${n.id}`})})]}),(0,K.jsxs)(`label`,{className:`block space-y-1`,children:[(0,K.jsx)(`span`,{className:`text-xs font-medium text-foreground`,children:a(`discard.commentLabel`)}),(0,K.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,K.jsxs)(he,{children:[(0,K.jsx)(P,{variant:`outline`,size:`sm`,onClick:()=>t(!1),disabled:c,children:a(`wizard.cancel`)}),(0,K.jsxs)(P,{size:`sm`,onClick:u,disabled:c,"data-testid":`jira-discard-confirm`,children:[(0,K.jsx)(v,{className:`w-3.5 h-3.5 mr-1.5`}),c?a(`discard.moving`):a(`discard.confirm`,{status:r})]})]})]})})}var Z={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 tt({status:e,className:t}){let{t:n}=p(`specs`),r=Z[e];return e===`done`?(0,K.jsx)(D,{className:F(`w-3.5 h-3.5 shrink-0`,r.dotClass,t),"aria-label":n(`status.done`)}):e===`cancelled`?(0,K.jsx)(ue,{className:F(`w-3.5 h-3.5 shrink-0`,r.dotClass,t),"aria-label":n(`status.cancelled`)}):r.pulsing?(0,K.jsxs)(`span`,{className:F(`relative flex shrink-0 h-2.5 w-2.5`,t),"aria-label":n(`status.inProgress`),children:[(0,K.jsx)(`span`,{className:F(`animate-ping absolute inline-flex h-full w-full rounded-full opacity-60`,r.dotClass)}),(0,K.jsx)(`span`,{className:F(`relative inline-flex rounded-full h-2.5 w-2.5`,r.dotClass)})]}):(0,K.jsx)(`span`,{className:F(`inline-flex rounded-full h-2.5 w-2.5 shrink-0`,r.dotClass,t),"aria-label":n(r.labelKey)})}function nt({status:e,className:t}){let{t:n}=p(`specs`),r=Z[e];return(0,K.jsxs)(`span`,{className:F(`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,K.jsx)(tt,{status:e}),n(r.labelKey)]})}async function rt(e,t,n){let r=new FormData;r.append(`file`,t);let i=await fetch(`${M()}/tickets/${e}/attachments`,{method:`POST`,body:r,signal:n});if(!i.ok){let e=await i.json().catch(()=>({}));throw Error(e.error??u.t(`attachments:errors.uploadFailed`,{status:i.status}))}return(await i.json()).attachment}async function it(e,t){let n=await fetch(`${M()}/tickets/${e}/attachments/${t}`,{method:`DELETE`});if(!n.ok&&n.status!==404)throw Error(u.t(`attachments:errors.deleteFailed`,{status:n.status}))}async function at(e){let t=await fetch(`${M()}/tickets/${e}/attachments`,{method:`DELETE`});if(!t.ok&&t.status!==404)throw Error(u.t(`attachments:errors.bulkDeleteFailed`,{status:t.status}))}async function ot(e){let t=await fetch(`${M()}/tickets/${e}/attachments`);if(!t.ok)throw Error(u.t(`attachments:errors.listFailed`,{status:t.status}));return(await t.json()).attachments}function st(e,t){return`${M()}/tickets/${e}/attachments/${t}`}async function ct(e,t){let n=await fetch(st(e,t));if(!n.ok)throw Error(u.t(`attachments:errors.fetchFailed`,{status:n.status}));return n.blob()}var lt=`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`,ut=new Set(lt.split(`,`).filter(e=>!e.startsWith(`.`))),dt=/\.sql$/i,ft=/\.(png|jpe?g|gif|webp)$/i;function pt(e){return ut.has(e.type)||dt.test(e.name)||ft.test(e.name)}function mt(){return typeof window<`u`&&window.__TAURI_INTERNALS__!==void 0}function ht(e){return Function(`s`,`return import(s)`)(e).catch(()=>null)}async function gt(e){if(mt()){try{let t=await ht(`@tauri-apps/plugin-opener`);if(t?.revealItemInDir){await t.revealItemInDir(e);return}}catch{}try{await(await ht(`@tauri-apps/api/shell`))?.open?.(e)}catch{}}}async function Q(e){if(mt())try{let t=await i(()=>import(`./dist-js-BmsFWRly.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71]));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 _t(e,t){let n=()=>l(t?.in,NaN),r=t?.additionalDigits??2,i=St(e),a;if(i.date){let e=Ct(i.date,r);a=wt(e.restDateString,e.year)}if(!a||isNaN(+a))return n();let o=+a,s=0,u;if(i.time&&(s=Et(i.time),isNaN(s)))return n();if(i.timezone){if(u=Ot(i.timezone),isNaN(u))return n()}else{let e=new Date(o+s),n=c(0,t?.in);return n.setFullYear(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()),n.setHours(e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()),n}return c(o+s+u,t?.in)}var vt={dateTimeDelimiter:/[T ]/,timeZoneDelimiter:/[Z ]/i,timezone:/([Z+-].*)$/},yt=/^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/,bt=/^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/,xt=/^([+-])(\d{2})(?::?(\d{2}))?$/;function St(e){let t={},n=e.split(vt.dateTimeDelimiter),r;if(n.length>2)return t;if(/:/.test(n[0])?r=n[0]:(t.date=n[0],r=n[1],vt.timeZoneDelimiter.test(t.date)&&(t.date=e.split(vt.timeZoneDelimiter)[0],r=e.substr(t.date.length,e.length))),r){let e=vt.timezone.exec(r);e?(t.time=r.replace(e[1],``),t.timezone=e[1]):t.time=r}return t}function Ct(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 wt(e,t){if(t===null)return new Date(NaN);let n=e.match(yt);if(!n)return new Date(NaN);let r=!!n[4],i=Tt(n[1]),a=Tt(n[2])-1,o=Tt(n[3]),s=Tt(n[4]),c=Tt(n[5])-1;if(r)return Pt(t,s,c)?kt(t,s,c):new Date(NaN);{let e=new Date(0);return!Mt(t,a,o)||!Nt(t,i)?new Date(NaN):(e.setUTCFullYear(t,a,Math.max(i,o)),e)}}function Tt(e){return e?parseInt(e):1}function Et(e){let t=e.match(bt);if(!t)return NaN;let n=Dt(t[1]),r=Dt(t[2]),i=Dt(t[3]);return Ft(n,r,i)?n*o+r*d+i*1e3:NaN}function Dt(e){return e&&parseFloat(e.replace(`,`,`.`))||0}function Ot(e){if(e===`Z`)return 0;let t=e.match(xt);if(!t)return 0;let n=t[1]===`+`?-1:1,r=parseInt(t[2]),i=t[3]&&parseInt(t[3])||0;return It(r,i)?n*(r*o+i*d):NaN}function kt(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 At=[31,null,31,30,31,30,31,31,30,31,30,31];function jt(e){return e%400==0||e%4==0&&e%100!=0}function Mt(e,t,n){return t>=0&&t<=11&&n>=1&&n<=(At[t]||(jt(e)?29:28))}function Nt(e,t){return t>=1&&t<=(jt(e)?366:365)}function Pt(e,t,n){return t>=1&&t<=53&&n>=0&&n<=6}function Ft(e,t,n){return e===24?t===0&&n===0:n>=0&&n<60&&t>=0&&t<60&&e>=0&&e<25}function It(e,t){return t>=0&&t<=59}function Lt({ticketKey:e,attachment:t,onClose:n}){let{t:r}=p(`attachments`),[i,a]=(0,U.useState)(null),[o,s]=(0,U.useState)(null);if((0,U.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,U.useEffect)(()=>{if(!t){a(null),s(null);return}let n=!1;return a(null),s(null),ct(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,U.useEffect)(()=>()=>{i&&URL.revokeObjectURL(i)},[i]),!t)return null;let c=t.mimeType.startsWith(`image/`),l=t.mimeType===`application/pdf`;return(0,K.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,K.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,K.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,K.jsx)(g,{className:`w-4 h-4`}),r(`common:actions.back`)]}),(0,K.jsxs)(`div`,{className:`flex-1 text-center min-w-0 px-4`,children:[(0,K.jsx)(`div`,{className:`text-sm font-medium text-white/95 truncate`,children:t.filename}),(0,K.jsx)(`div`,{className:`text-[11px] text-white/50`,children:t.mimeType})]}),(0,K.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,K.jsx)(ne,{className:`w-4 h-4`}),r(`lightbox.download`)]})]}),(0,K.jsx)(`div`,{className:F(`flex-1 flex items-center justify-center overflow-auto p-6`),onClick:n,children:o?(0,K.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,K.jsx)(`p`,{className:`text-sm`,children:r(`lightbox.loadError`,{error:o})})}):i?c?(0,K.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,K.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,K.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,K.jsx)(`p`,{className:`text-sm mb-3`,children:r(`lightbox.previewUnavailable`)}),(0,K.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,K.jsx)(ne,{className:`w-4 h-4`}),r(`lightbox.downloadFile`,{name:t.filename})]})]}):(0,K.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,K.jsx)(`p`,{className:`text-sm`,children:r(`lightbox.loading`)})})})]})}function Rt(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 zt(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function Bt(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 Vt(e){try{return new Date(e).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})}catch{return e}}function Ht({ticketKey:e,attachments:t,onChange:n,className:r}){let{t:i}=p(`attachments`),[a,o]=(0,U.useState)(new Set),[s,c]=(0,U.useState)(null),[l,u]=(0,U.useState)(null);if((0,U.useEffect)(()=>{let r=!1;return ot(e).then(e=>{if(r)return;let i=Rt(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 it(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,K.jsxs)(`section`,{className:F(`mt-4`,r),"aria-label":i(`section.ariaLabel`),children:[(0,K.jsxs)(`header`,{className:`flex items-center justify-between mb-2`,children:[(0,K.jsx)(`h3`,{className:`text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:i(`section.title`)}),(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:i(`section.fileCount`,{count:d.length})})]}),(0,K.jsx)(`ul`,{className:`flex flex-col gap-1`,children:d.map(e=>{let t=a.has(e.id);return(0,K.jsxs)(`li`,{className:F(`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,K.jsx)(`span`,{"aria-hidden":!0,className:`w-6 text-center text-sm shrink-0`,children:Bt(e.mimeType)}),(0,K.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,K.jsx)(`span`,{className:`font-medium truncate text-foreground`,children:e.filename}),(0,K.jsxs)(`span`,{className:`text-[11px] text-muted-foreground`,children:[zt(e.size),` · `,Vt(e.addedAt)]})]}),(0,K.jsx)(`button`,{type:`button`,onClick:()=>u(e),className:`text-[11px] text-primary hover:underline shrink-0`,children:i(`common:actions.open`)}),(0,K.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,K.jsx)(`p`,{className:`mt-2 text-xs text-destructive`,children:s}),(0,K.jsx)(Lt,{ticketKey:e,attachment:l,onClose:()=>u(null)})]})}function Ut({ticketId:e,onClose:t}){let{t:n}=p(`code`),r=a(),{activeProjectId:i}=N(),[o,s]=(0,U.useState)(null);return(0,U.useEffect)(()=>{if(!Xe)return;let t=new AbortController;return s(null),fetch(`${M()}/code/provenance?ticketId=${e}`,{signal:t.signal}).then(e=>e.ok?e.json():[]).then(e=>{s(Array.isArray(e)?e:[])}).catch(e=>{e?.name!==`AbortError`&&s([])}),()=>t.abort()},[e,i]),!Xe||!o||o.length===0?null:(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-1.5`,children:n(`ticketFiles.title`)}),(0,K.jsx)(`ul`,{className:`space-y-1`,children:o.map((e,i)=>(0,K.jsx)(`li`,{children:(0,K.jsxs)(`button`,{type:`button`,onClick:()=>{t(),r(`/code?path=${encodeURIComponent(e.path)}`)},className:`w-full text-left flex items-center gap-2 rounded px-2 py-1 text-xs hover:bg-muted/40`,children:[(0,K.jsx)(e.kind===`created`?De:e.kind===`deleted`?Ee:O,{className:`h-3.5 w-3.5 text-muted-foreground shrink-0`}),(0,K.jsx)(`span`,{className:`font-mono truncate flex-1`,children:e.path}),e.jobId&&(0,K.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,K.jsx)(Oe,{className:`h-3 w-3`}),e.jobId.length>10?e.jobId.slice(0,10):e.jobId]}),(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground uppercase tracking-wider shrink-0`,children:n(`kind.${e.kind}`)})]})},`${e.path}-${i}`))})]})}var Wt={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 Gt(e){try{return R(new Date(e),{addSuffix:!0,locale:s()})}catch{return e}}function Kt({tickets:e,excludeIds:t,onSelect:n}){let{t:r}=p(`tickets`),[i,a]=(0,U.useState)(``),o=(0,U.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,K.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,K.jsxs)(`div`,{className:`px-4 py-3 border-b border-border/30 flex items-center gap-2`,children:[(0,K.jsx)(B,{className:`w-3.5 h-3.5 text-muted-foreground`}),(0,K.jsx)(`span`,{className:`text-xs font-semibold text-foreground`,children:r(`comparePicker.title`)}),(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:r(`comparePicker.count`,{n:o.length})})]}),(0,K.jsx)(`div`,{className:`px-4 py-2 border-b border-border/20`,children:(0,K.jsxs)(`div`,{className:`relative`,children:[(0,K.jsx)(ce,{className:`absolute left-2 top-1/2 -translate-y-1/2 w-3 h-3 text-muted-foreground`}),(0,K.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,K.jsx)(`div`,{className:`flex-1 overflow-y-auto`,"data-testid":`spec-compare-picker-list`,children:o.length===0?(0,K.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full text-center px-4 py-8 gap-2`,children:[(0,K.jsx)(B,{className:`w-6 h-6 text-muted-foreground/40`}),(0,K.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:i.trim()?r(`comparePicker.noMatches`):r(`comparePicker.empty`)})]}):(0,K.jsx)(`ul`,{className:`divide-y divide-border/10`,children:o.map(e=>(0,K.jsx)(`li`,{children:(0,K.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,K.jsx)(tt,{status:e.status}),(0,K.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,K.jsxs)(`span`,{className:`text-[10px] font-mono text-muted-foreground`,children:[`#`,e.id]}),e.priority&&Wt[e.priority]&&(0,K.jsx)(`span`,{className:`inline-flex items-center rounded px-1 py-0.5 text-[9px] font-medium border ${Wt[e.priority]}`,children:r(`priority.${e.priority}`)})]}),(0,K.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,K.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,K.jsxs)(`div`,{className:`mt-1 flex flex-wrap gap-1`,children:[e.labels.slice(0,3).map(e=>(0,K.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,K.jsxs)(`span`,{className:`text-[9px] text-muted-foreground`,children:[`+`,e.labels.length-3]})]}),(0,K.jsx)(`p`,{className:`mt-1 text-[9px] text-muted-foreground`,children:r(`meta.updatedAgo`,{time:Gt(e.updated_at)})})]})]})},e.id))})})]})}var qt=e(r(),1),Jt=.25,Yt=.75;function Xt({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,U.useRef)(null),p=(0,U.useRef)(null),[m,h]=(0,U.useState)(!0);(0,U.useEffect)(()=>{let e=setTimeout(()=>h(!1),320);return()=>clearTimeout(e)},[]);let g=(0,U.useCallback)(e=>{if(!p.current)return;let t=window.innerWidth,n=e.clientX/t;u(Math.min(Yt,Math.max(Jt,n)))},[u]),_=(0,U.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,U.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,U.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,U.useCallback)(t=>{let n=.04;t.key===`ArrowLeft`?(t.preventDefault(),u(Math.max(Jt,e.splitRatio-n))):t.key===`ArrowRight`?(t.preventDefault(),u(Math.min(Yt,e.splitRatio+n))):t.key===`Home`?(t.preventDefault(),u(Jt)):t.key===`End`?(t.preventDefault(),u(Yt)):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,K.jsx)(Kn,{ticket:f,allLabels:i,allTickets:r,onClose:d?c:()=>l(null,u),onOpenTicket:s,onSave:a,onDelete:o,embedded:!0},`${u}-${f.id}`):(0,K.jsx)(Kt,{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,qt.createPortal)((0,K.jsxs)(`div`,{ref:f,"data-testid":`split-view-shell`,className:`fixed inset-0 z-[68] flex`,onClick:b,children:[(0,K.jsx)(`div`,{className:`absolute inset-0 bg-black/70 pointer-events-none`,"aria-hidden":!0}),(0,K.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,K.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,K.jsx)(`div`,{className:`h-full flex items-center justify-center p-2`,children:(0,K.jsx)(`div`,{className:`w-full h-full max-h-[95vh]`,children:x(`left`)})})}),(0,K.jsx)(`div`,{"data-testid":`split-divider`,role:`separator`,"aria-orientation":`vertical`,"aria-valuenow":Math.round(e.splitRatio*100),"aria-valuemin":Math.round(Jt*100),"aria-valuemax":Math.round(Yt*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,K.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,K.jsx)(`div`,{className:`h-full flex items-center justify-center p-2`,children:(0,K.jsx)(`div`,{className:`w-full h-full max-h-[95vh]`,children:x(`right`)})})})]})]}),document.body)}var Zt=.5,Qt=.25,$t=.75,en={leftId:null,rightId:null,originSide:null,splitRatio:Zt};function tn(e){return Number.isFinite(e)?Math.min($t,Math.max(Qt,e)):Zt}function nn(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:Zt}:e.originSide!==null&&(e.leftId===t.id||e.rightId===t.id)?e:{...en,leftId:t.id};case`closeAll`:return en;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:Zt}:{leftId:null,rightId:n,originSide:`right`,splitRatio:Zt}}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{...en,leftId:t}}case`setSplitRatio`:return{...e,splitRatio:tn(t.ratio)};default:return e}}var rn=(0,U.createContext)(null),an=900;function on({children:e}){let[t,n]=(0,U.useReducer)(nn,en),{tickets:r,updateTicket:i,deleteTicket:a}=G(),{activeProjectId:o,setActiveProjectId:s}=N(),c=(0,U.useRef)(null);(0,U.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,U.useCallback)(e=>n({type:`openCentered`,id:e}),[]),u=(0,U.useCallback)((e,t)=>{if(e===o){n({type:`openCentered`,id:t});return}c.current={projectId:e,ticketId:t},s(e)},[o,s]),d=(0,U.useCallback)(()=>n({type:`closeAll`}),[]),f=(0,U.useCallback)((e,t)=>{typeof window<`u`&&window.innerWidth<an||n({type:`enterSplit`,side:e,ticketId:t})},[]),p=(0,U.useCallback)((e,t)=>n({type:`setComparedTicket`,id:e,side:t}),[]),m=(0,U.useCallback)(()=>n({type:`exitSplit`}),[]),h=(0,U.useCallback)(e=>n({type:`setSplitRatio`,ratio:e}),[]);(0,U.useEffect)(()=>{if(typeof window>`u`)return;function e(){window.innerWidth<an&&n({type:`exitSplit`})}return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]);let g=(0,U.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,y=(0,U.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]),b=t.originSide!==null;return(0,K.jsxs)(rn.Provider,{value:y,children:[e,!b&&_&&(0,K.jsx)(Kn,{ticket:_,allLabels:g,allTickets:r,onClose:d,onOpenTicket:l,onSave:i,onDelete:a},_.id),b&&(0,K.jsx)(Xt,{state:t,leftTicket:_,rightTicket:v,allTickets:r,allLabels:g,onSave:i,onDelete:a,onOpenTicket:l,onCloseAll:d,onSetCompared:p,onSetRatio:h,onExitSplit:m})]})}function sn(){return(0,U.useContext)(rn)||{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:en}}function cn(e){return e<.005?`$${e.toFixed(4)}`:e<1?`$${e.toFixed(3)}`:`$${e.toFixed(2)}`}function ln(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 un({ticketId:e}){let{t}=p(`tickets`),[n,r]=(0,U.useState)(null),i=a(),{activeProjectId:o}=N(),{closeTicketDetail:s}=sn();if((0,U.useEffect)(()=>{let t=new AbortController;return r(null),fetch(`${M()}/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:Ce[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,m=n.turnsUnavailableRuns??0,h=n.totalTurns==null||m>0&&(n.turnsReportedRuns??0)===0,g=!h&&m>0;return(0,K.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,K.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?`≥`:``}${cn(n.totalCostUsd)}`}),(0,K.jsx)(`span`,{className:`text-muted-foreground/60`,children:`·`}),(0,K.jsx)(`span`,{className:`tabular-nums`,"data-testid":h?`ticket-turns-unavailable`:void 0,title:h?t(`spendingLine.turnsUnavailableTooltip`):g?t(`spendingLine.turnsPartiallyUnavailableTooltip`):void 0,children:h?`—`:`${g?`≥`:``}${t(`spendingLine.turns`,{count:n.totalTurns})}`}),(0,K.jsx)(`span`,{className:`text-muted-foreground/60`,children:`·`}),(0,K.jsx)(`span`,{className:`tabular-nums`,children:t(`spendingLine.active`,{duration:ln(n.activeDurationMs)})}),c&&(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(`span`,{className:`text-muted-foreground/60`,children:`·`}),(0,K.jsx)(`span`,{children:c})]}),(0,K.jsx)(v,{className:`w-3 h-3 opacity-0 group-hover:opacity-100 transition-opacity`})]})}var dn=/^\d{4}-\d{2}-\d{2}T/;function fn(e){if(dn.test(e))try{return{text:R(_t(e),{addSuffix:!0,locale:s()}),title:e}}catch{}return{text:e}}function pn({localId:e}){let{t}=p(`jira`),{activeProjectId:n}=N(),r=$e(),[i,a]=(0,U.useState)(null);if((0,U.useEffect)(()=>{if(!q||!r.connected)return;let t=!1;return a(null),xe.getSpecDetails(e).then(e=>{t||a(e)}).catch(()=>{t||a(null)}),()=>{t=!0}},[e,n,r.connected]),!q||!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,K.jsxs)(`div`,{className:`space-y-4`,"data-testid":`jira-details-panel`,children:[s&&(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-1.5`,children:t(`detail.detailsTitle`)}),(0,K.jsx)(`div`,{className:`space-y-1.5`,children:i.fields.map((e,t)=>{let n=fn(e.value);return(0,K.jsxs)(`div`,{className:`text-xs`,children:[(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground uppercase tracking-wide block`,children:e.label}),e.href?(0,K.jsxs)(`button`,{type:`button`,onClick:()=>{Q(e.href)},className:`inline-flex items-center gap-1 text-accent-info hover:underline text-left`,children:[(0,K.jsx)(`span`,{className:`truncate`,children:e.value}),(0,K.jsx)(ee,{className:`w-3 h-3 shrink-0`})]}):(0,K.jsx)(`span`,{className:`text-foreground/80 whitespace-pre-line`,title:n.title,children:n.text})]},`${e.label}-${t}`)})})]}),(c||l||u)&&(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-1.5`,children:t(`detail.developmentTitle`)}),c&&(0,K.jsxs)(`div`,{className:`mb-2`,children:[(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground uppercase tracking-wide block mb-1`,children:t(`detail.dev.pullRequests`)}),(0,K.jsx)(`div`,{className:`space-y-1`,children:o.pullRequests.map(e=>(0,K.jsxs)(`button`,{type:`button`,onClick:()=>{Q(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,K.jsx)(ke,{className:`w-3 h-3 mt-0.5 shrink-0 text-accent-info`}),(0,K.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,K.jsx)(`span`,{className:`truncate text-foreground/80 block`,children:e.title}),(0,K.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[e.status,e.sourceBranch?` · ${e.sourceBranch} → ${e.destBranch??``}`:``]})]})]},e.url))})]}),l&&(0,K.jsxs)(`div`,{className:`mb-2`,children:[(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground uppercase tracking-wide block mb-1`,children:t(`detail.dev.branches`)}),(0,K.jsx)(`div`,{className:`space-y-1`,children:o.branches.map(e=>(0,K.jsxs)(`button`,{type:`button`,onClick:()=>{Q(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,K.jsx)(re,{className:`w-3 h-3 shrink-0 text-accent-info`}),(0,K.jsx)(`span`,{className:`truncate font-mono text-foreground/80`,children:e.name}),e.repo&&(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground truncate`,children:e.repo})]},e.url))})]}),u&&(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground uppercase tracking-wide block mb-1`,children:t(`detail.dev.commits`)}),(0,K.jsx)(`div`,{className:`space-y-1`,children:o.commits.map(e=>(0,K.jsxs)(`button`,{type:`button`,onClick:()=>{Q(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,K.jsx)(Oe,{className:`w-3 h-3 shrink-0 text-accent-info`}),(0,K.jsx)(`span`,{className:`font-mono text-[10px] text-muted-foreground shrink-0`,children:e.displayId}),(0,K.jsx)(`span`,{className:`truncate text-foreground/80`,children:e.message})]},e.url))})]})]})]})}function mn({open:e,url:t,projectId:n,onClose:r}){let{t:i}=p(`browser`),a=C({projectId:n,open:e,initialUrl:t}),{canvasRef:o,viewport:s,status:c,errorMsg:l,url:u,title:d,popup:f}=a,[m,h]=(0,U.useState)(t),S=(0,U.useRef)(a.forwardInput);S.current=a.forwardInput;let T=(0,U.useRef)(null),E=(0,U.useCallback)(()=>(T.current??=b(e=>S.current(e)),T.current),[]);(0,U.useEffect)(()=>()=>{T.current?.dispose(),T.current=null},[]),(0,U.useEffect)(()=>{u&&h(u)},[u]),(0,U.useEffect)(()=>{if(!e)return;let t=e=>{e.key===`Escape`&&r()};return window.addEventListener(`keydown`,t),()=>window.removeEventListener(`keydown`,t)},[e,r]);let D=(0,U.useCallback)((e,t)=>{let n=o.current?.getBoundingClientRect();return n?_({x:e,y:t},{left:n.left,top:n.top,width:n.width,height:n.height},s):{x:0,y:0}},[o,s]),te=e=>e===2?`right`:e===1?`middle`:`left`,ne=(0,U.useCallback)(e=>{let t=D(e.clientX,e.clientY);E().move(t.x,t.y)},[D,E]),O=(0,U.useCallback)(e=>{let t=D(e.clientX,e.clientY),n=E();n.move(t.x,t.y),n.flush(),a.forwardInput({type:`mouse`,action:`down`,x:t.x,y:t.y,button:te(e.button),clickCount:e.detail||1})},[D,a,E]),re=(0,U.useCallback)(e=>{let t=D(e.clientX,e.clientY),n=E();n.move(t.x,t.y),n.flush(),a.forwardInput({type:`mouse`,action:`up`,x:t.x,y:t.y,button:te(e.button),clickCount:e.detail||1})},[D,a,E]),ie=(0,U.useCallback)(e=>{let t=D(e.clientX,e.clientY);E().wheel(t.x,t.y,e.deltaX,e.deltaY)},[D,E]),ae=(0,U.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]),k=(0,U.useCallback)(e=>{e.key!==`Escape`&&a.forwardInput({type:`key`,action:`up`,key:e.key,code:e.code})},[a]),oe=(0,U.useCallback)(()=>{a.navigate(`goto`,m)},[a,m]);return!e||typeof document>`u`?null:(0,qt.createPortal)((0,K.jsx)(`div`,{className:`fixed inset-0 z-[80] bg-background-deep/50 backdrop-blur-sm pointer-events-auto`,onClick:e=>{e.target===e.currentTarget&&r()},"data-testid":`webview-modal`,children:(0,K.jsxs)(`div`,{className:`absolute inset-2 flex flex-col border border-border rounded-lg bg-background-deep overflow-hidden`,role:`dialog`,"aria-modal":`true`,"aria-label":i(`modal.dialogLabel`),onClick:e=>e.stopPropagation(),children:[(0,K.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,K.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,K.jsx)(P,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":i(`common:actions.back`),onClick:()=>a.navigate(`back`),children:(0,K.jsx)(g,{className:`w-4 h-4`})}),(0,K.jsx)(P,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":i(`modal.nav.forward`),onClick:()=>a.navigate(`forward`),children:(0,K.jsx)(v,{className:`w-4 h-4`})}),(0,K.jsx)(P,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":i(`modal.nav.reload`),onClick:()=>a.navigate(`reload`),children:(0,K.jsx)(x,{className:`w-4 h-4`})})]}),(0,K.jsxs)(`form`,{className:`flex-1 flex items-center gap-2 min-w-0`,onSubmit:e=>{e.preventDefault(),oe()},children:[(0,K.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,K.jsx)(y,{className:`w-3.5 h-3.5 text-muted-foreground shrink-0`}),(0,K.jsx)(`input`,{value:m,onChange:e=>h(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),oe())},placeholder:i(`modal.address.placeholder`),"aria-label":i(`modal.address.label`),className:`flex-1 min-w-0 bg-transparent outline-none text-sm`})]}),(0,K.jsx)(P,{type:`submit`,size:`sm`,variant:`secondary`,className:`shrink-0`,disabled:c===`error`,children:i(`modal.address.go`)})]}),(0,K.jsx)(P,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":i(`modal.closeBrowser`),onClick:r,children:(0,K.jsx)(ue,{className:`w-4 h-4`})})]}),(0,K.jsxs)(`div`,{className:`px-3 py-1 text-[11px] text-muted-foreground truncate shrink-0 flex items-center gap-2`,children:[(0,K.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,K.jsx)(`span`,{className:`truncate`,children:c===`connecting`?i(`modal.status.connecting`):c===`error`?l??i(`modal.status.unavailable`):d||``})]}),f&&(0,K.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,K.jsx)(ee,{className:`w-3.5 h-3.5 shrink-0`}),f.active?(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(`span`,{className:`truncate font-medium`,children:i(`popup.loginWindow`,{origin:w(f.url)})}),f.count>1&&(0,K.jsx)(`span`,{className:`shrink-0 opacity-70`,children:i(`popup.stacked`,{count:f.count-1})}),(0,K.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,K.jsx)(g,{className:`w-3 h-3`}),i(`popup.backToPage`)]})]}):(0,K.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,K.jsx)(`span`,{className:`opacity-70`,children:i(`popup.stacked`,{count:f.count-1})})]})]}),(0,K.jsx)(`div`,{className:`relative flex-1 min-h-0 overflow-hidden flex items-center justify-center outline-none`,tabIndex:0,onKeyDown:ae,onKeyUp:k,children:c===`error`?(0,K.jsxs)(`div`,{className:`flex flex-col items-center gap-2 text-center max-w-md px-6`,children:[(0,K.jsx)(A,{className:`w-8 h-8 text-accent-warning`}),(0,K.jsx)(`p`,{className:`text-sm text-foreground/90`,children:l??i(`modal.error.unavailable`)})]}):(0,K.jsx)(`canvas`,{ref:o,className:`max-w-full max-h-full block shadow-2xl cursor-default`,onPointerMove:ne,onPointerDown:O,onPointerUp:re,onContextMenu:e=>e.preventDefault(),onWheel:ie})})]})}),document.body)}var hn=(0,U.createContext)(null);function gn({children:e}){let{activeProjectId:t}=N(),[n,r]=(0,U.useState)(null),i=(0,U.useCallback)(e=>r(e),[]),a=S();return(0,K.jsxs)(hn.Provider,{value:{openWebView:i,canOpenWebView:a&&!!t},children:[e,a&&n&&t&&(0,K.jsx)(mn,{open:!0,url:n,projectId:t,onClose:()=>r(null)})]})}function _n(){return(0,U.useContext)(hn)??{openWebView:()=>{},canOpenWebView:!1}}var vn={analyzing:`activity:smash.stage.analyzing`,identifying:`activity:smash.stage.identifying`,ordering:`activity:smash.stage.ordering`},yn=(0,U.createContext)(null);function $(e){return`smash:${e}`}async function bn(e,t){try{let n=await fetch(`${j}/api/projects/${e}/tickets/${t}/smash`,{method:`POST`});if(n.ok)h.loading(u.t(`activity:smash.retrying`),{id:$(t)});else{let e=await n.json().catch(()=>({}));h.error(e.reason?u.t(`activity:smash.couldNotRetryWithReason`,{reason:e.reason}):u.t(`activity:smash.couldNotRetry`),{id:$(t)})}}catch(e){h.error(u.t(`activity:smash.retryFailed`,{message:e.message}),{id:$(t)})}}async function xn(e,t,n){try{let r=await fetch(`${j}/api/projects/${e}/tickets/${t}/smash/undo`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({smashedAt:n})});if(r.ok)h.success(u.t(`activity:smash.undone`),{id:$(t),duration:3e3});else{let e=await r.json().catch(()=>({}));h.error(e.reason?u.t(`activity:smash.undoFailedWithReason`,{reason:e.reason}):u.t(`activity:smash.undoFailed`),{id:$(t)})}}catch(e){h.error(u.t(`activity:smash.undoFailedWithReason`,{reason:e.message}),{id:$(t)})}}function Sn({children:e}){let{registerHandler:t,unregisterHandler:n}=fe(),[r,i]=(0,U.useState)({}),a=(0,U.useRef)(new Map),o=(0,U.useRef)(new Map),s=(0,U.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}})),h.loading(u.t(vn.analyzing),{id:$(n),description:c?u.t(`activity:smash.onTitled`,{title:c}):u.t(`activity:smash.onThisSpec`)}))},[]),c=(0,U.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}),h.loading(u.t(vn[r]),{id:$(n),description:a?u.t(`activity:smash.onTitled`,{title:a}):u.t(`activity:smash.onThisSpec`)})},[]),l=(0,U.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}),h.success(u.t(`activity:smash.split`,{count:c.length}),{id:$(n),duration:1e4,action:{label:u.t(`activity:smash.undoAction`),onClick:()=>void xn(a,n,s)}}))},[]),d=(0,U.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`?u.t(`activity:smash.failReason.invalidOutput`):o===`timeout`?u.t(`activity:smash.failReason.timeout`):o===`model_error`?u.t(`activity:smash.failReason.modelError`):o===`crashed`?u.t(`activity:smash.failReason.crashed`):u.t(`activity:smash.failReason.generic`,{reason:o});h.error(u.t(`activity:smash.couldNotComplete`),{id:$(n),description:s,action:{label:u.t(`common:actions.retry`),onClick:()=>void bn(r,n)},duration:15e3})},[]),f=(0,U.useCallback)(e=>{let t=e;if(!t||t.type!==`smash.undone`)return;let n=t.ticketId;typeof n==`number`&&(h.dismiss($(n)),h.success(u.t(`activity:smash.undone`),{id:$(n),duration:3e3}))},[]);(0,U.useLayoutEffect)(()=>(t(`_smash_started`,s),t(`_smash_progress`,c),t(`_smash_completed`,l),t(`_smash_failed`,d),t(`_smash_undone`,f),()=>{n(`_smash_started`),n(`_smash_progress`),n(`_smash_completed`),n(`_smash_failed`),n(`_smash_undone`)}),[t,n,s,c,l,d,f]),(0,U.useEffect)(()=>()=>{a.current.clear(),o.current.clear()},[]);let p=(0,U.useMemo)(()=>({inflight:r}),[r]);return(0,K.jsx)(yn.Provider,{value:p,children:e})}function Cn(e){let t=(0,U.useContext)(yn);return!t||e==null?null:t.inflight[e]??null}var wn=150,Tn={analyzing:0,identifying:1,ordering:2},En={analyzing:`smash.stage.analyzing`,identifying:`smash.stage.identifying`,ordering:`smash.stage.ordering`};function Dn({stage:e,minDisplayMs:t=wn}){let{t:n}=p(`activity`),[r,i]=(0,U.useState)(e),a=(0,U.useRef)(Date.now()),o=(0,U.useRef)(null);if((0,U.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=Tn[r];return(0,K.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,K.jsx)(ie,{className:`h-4 w-4 animate-spin text-accent-highlight`,"aria-hidden":!0}),(0,K.jsx)(`div`,{className:`flex items-center gap-1.5`,children:[`analyzing`,`identifying`,`ordering`].map(e=>(0,K.jsx)(`span`,{className:[`inline-block w-1.5 h-1.5 rounded-full transition-all`,Tn[e]<=s?`bg-accent-highlight`:`bg-muted`,e===r?`scale-125`:`scale-100`].join(` `),"aria-hidden":!0},e))}),(0,K.jsx)(`span`,{className:`font-medium`,children:n(En[r])})]})}var On={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 kn({open:e,ticketTitle:t,isReSmash:n,childrenCount:r,submitting:i=!1,onCancel:a,onConfirm:o}){let{t:s}=p(`activity`),[c,l]=(0,U.useState)(`simple`),{panelRef:u,panelStyle:d,headerHandleProps:m,resizeHandles:h,isFloating:g,guardBackdrop:_}=me();return e?(0,qt.createPortal)((0,K.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,K.jsx)(`div`,{className:`absolute inset-0 bg-black/60 backdrop-blur-sm`,onClick:_(a)}),(0,K.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,K.jsxs)(`div`,{...m,className:`flex items-start justify-between gap-3 px-5 py-4 border-b border-border/30 ${g?`cursor-grab active:cursor-grabbing`:``}`,children:[(0,K.jsxs)(`div`,{className:`flex items-start gap-2 min-w-0`,children:[(0,K.jsx)(je,{className:`w-5 h-5 text-accent-highlight shrink-0 mt-0.5`,"aria-hidden":!0}),(0,K.jsxs)(`div`,{className:`min-w-0`,children:[(0,K.jsx)(`h2`,{className:`text-sm font-semibold text-foreground`,children:s(`smashModal.title`)}),(0,K.jsx)(`p`,{className:`text-[11px] text-muted-foreground truncate`,title:t,children:t})]})]}),(0,K.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,K.jsx)(ue,{className:`w-4 h-4`})})]}),n&&r>0&&(0,K.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,K.jsx)(f,{t:s,i18nKey:`smashModal.reSmashWarning`,count:r})}),(0,K.jsxs)(`div`,{className:`px-5 py-4 space-y-3`,children:[(0,K.jsx)(`p`,{className:`text-[10px] uppercase tracking-wider text-muted-foreground font-medium`,children:s(`smashModal.modePickerLabel`)}),[`simple`,`full`].map(e=>{let t=On[e],n=c===e;return(0,K.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,K.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,K.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,K.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,K.jsxs)(`div`,{className:`flex items-center justify-between gap-2 mb-1`,children:[(0,K.jsxs)(`span`,{className:`flex items-center gap-1.5 text-sm font-semibold text-foreground`,children:[e===`full`&&(0,K.jsx)(de,{className:`w-3.5 h-3.5 text-accent-highlight`,"aria-hidden":!0}),s(t.titleKey)]}),(0,K.jsx)(`span`,{className:`text-[10px] text-muted-foreground tabular-nums`,children:s(t.etaKey)})]}),(0,K.jsx)(`ul`,{className:`space-y-0.5`,children:t.bulletKeys.map(e=>(0,K.jsxs)(`li`,{className:`text-[11px] text-foreground/70 leading-snug`,children:[`• `,s(e)]},e))})]})]})},e)})]}),(0,K.jsxs)(`div`,{className:`flex items-center justify-end gap-2 px-5 py-3 border-t border-border/30 bg-surface/20`,children:[(0,K.jsx)(P,{variant:`ghost`,size:`sm`,onClick:a,disabled:i,children:s(`common:actions.cancel`)}),(0,K.jsxs)(P,{size:`sm`,onClick:()=>o(c),disabled:i,"data-testid":`smash-confirm-modal-continue`,children:[(0,K.jsx)(je,{className:`w-3.5 h-3.5 mr-1.5`}),s(i?`smashModal.starting`:n?`smashModal.confirmReSmash`:`smashModal.smash`)]})]})]}),(0,K.jsx)(ye,{handles:h})]}),document.body):null}var An=`## Contract Layer`;function jn(e,t){return!(!t||e.status===`draft`||e.parent_epic_id!=null||!e.description?.includes(An))}function Mn({ticket:e,projectId:t,provider:n,featureFlagOn:r,childrenCount:i}){let{t:a}=p(`activity`),o=Cn(e.id),[s,c]=(0,U.useState)(!1),[l,u]=(0,U.useState)(!1),[d,f]=(0,U.useState)(e.origin_conversation_id?void 0:null);(0,U.useEffect)(()=>{let r=e.origin_conversation_id;if(!r){f(null);return}let i=!1;return f(void 0),fetch(`${j}/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||f(t.conversation?.provider??n??null)}).catch(()=>{i||f(null)}),()=>{i=!0}},[t,n,e.origin_conversation_id]);let m=e.origin_conversation_id?d:n,g=r&&Se(m),_=e.is_epic===!0,v=!_&&jn(e,g),y=_&&g,b=_&&i>0,x=(0,U.useCallback)(async n=>{if(g){u(!0);try{let r=await fetch(`${j}/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(()=>({}));h.error(e.reason?a(`smash.couldNotStartWithReason`,{reason:e.reason}):a(`smash.couldNotStart`));return}c(!1)}catch(e){h.error(a(`smash.smashFailed`,{message:e.message}))}finally{u(!1)}}},[t,e.id,a,g]),S=(0,U.useCallback)(async n=>{if(g){if(b){u(!0);try{if(!(await fetch(`${j}/api/projects/${t}/tickets/${e.id}/children`,{method:`DELETE`})).ok){h.error(a(`smash.couldNotDeleteChildren`)),u(!1);return}}catch(e){h.error(a(`smash.deleteFailed`,{message:e.message})),u(!1);return}}await x(n)}},[b,x,t,e.id,a,g]);return!v&&!y?null:o?(0,K.jsx)(`div`,{className:`flex flex-col gap-2`,"data-testid":`smash-actions-streaming`,children:(0,K.jsx)(Dn,{stage:o.stage})}):(0,K.jsxs)(K.Fragment,{children:[(0,K.jsxs)(P,{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,K.jsx)(je,{className:`w-3.5 h-3.5 mr-1.5`}),a(y?`smash.reSmashButton`:`smash.smashButton`)]}),(0,K.jsx)(kn,{open:s,ticketTitle:e.title,isReSmash:b,childrenCount:i,submitting:l,onCancel:()=>c(!1),onConfirm:S})]})}function Nn({epic:e,childExecutionOrder:t,totalChildren:n,onOpenEpic:r}){let{t:i}=p(`activity`);return(0,K.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,K.jsxs)(`button`,{type:`button`,onClick:r,className:`text-accent-secondary hover:underline font-medium`,children:[`← `,e.title]}),t!=null&&n>0&&(0,K.jsx)(`span`,{className:`text-foreground/60`,children:i(`epicChildren.step`,{order:t,total:n})})]})}var Pn={critical:`bg-red-400`,high:`bg-orange-400`,medium:`bg-yellow-400`,low:`bg-slate-400`};function Fn(e){return e?Pn[e]:`bg-muted`}function In(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 Ln({ticket:e,allTickets:t,onOpenTicket:n}){let{t:r}=p(`activity`),i=e.is_epic===!0,a=e.parent_epic_id!=null;if(!i&&!a)return null;if(i){let i=In(t.filter(t=>t.parent_epic_id===e.id));return(0,K.jsx)(Rn,{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=In(t.filter(t=>t.parent_epic_id===e.parent_epic_id)),c=o?[o,...s]:s;return(0,K.jsx)(Rn,{header:r(`family.familyHeader`,{count:s.length}),rows:c,currentId:e.id,onOpenTicket:n,emptyMessage:r(`family.noSiblings`)})}function Rn({header:e,rows:t,currentId:n,onOpenTicket:r,emptyMessage:i}){let{t:a}=p(`activity`);return(0,K.jsxs)(`div`,{"data-testid":`epic-family-sidebar`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 mb-1.5`,children:[(0,K.jsx)(je,{className:`w-3 h-3 text-accent-highlight`,"aria-hidden":!0}),(0,K.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider`,children:e})]}),t.length===0?(0,K.jsx)(`p`,{className:`text-[10px] text-foreground/50 italic`,children:i}):(0,K.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,K.jsx)(`li`,{children:(0,K.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,K.jsx)(E,{className:`w-3 h-3 text-accent-highlight flex-shrink-0`,"aria-hidden":!0}):(0,K.jsx)(`span`,{className:`text-[9px] tabular-nums text-foreground/40 w-3 text-center flex-shrink-0`,children:e.execution_order??`–`}),(0,K.jsx)(`span`,{className:`inline-block w-1.5 h-1.5 rounded-full flex-shrink-0 ${Fn(e.priority)}`,"aria-hidden":!0}),(0,K.jsx)(`span`,{className:`text-[11px] truncate ${t?`text-foreground font-medium`:`text-foreground/80`}`,title:e.title,children:e.title})]})},e.id)})})]})}var zn=900,Bn=.2,Vn=[`todo`,`in_progress`,`done`,`cancelled`],Hn={draft:`ticketStatus.draft`,todo:`ticketStatus.todo`,in_progress:`ticketStatus.inProgress`,on_review:`ticketStatus.onReview`,done:`ticketStatus.done`,cancelled:`ticketStatus.cancelled`},Un=[{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 Wn(e){return e.jira_epic_key&&e.jira_url?e.jira_url.replace(/\/browse\/[^/]+$/,`/browse/${e.jira_epic_key}`):null}var Gn={manual:`source.manual`,"product-backlog":`source.productBacklog`,"propose-spec":`source.proposeSpec`,"get-backlog-specs":`source.getBacklogSpecs`,"free-prompt":`source.freePrompt`};function Kn({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}=p(`tickets`),{t:m}=p(`jira`),{activeProjectId:g,projects:_}=N(),{enterSplit:y,state:b}=sn(),x=b.originSide!==null,S=_.find(e=>e.id===g)?.provider,C=Se(S),w=(0,U.useMemo)(()=>(n??[]).filter(t=>t.parent_epic_id===e.id),[n,e.id]),T=(0,U.useMemo)(()=>e.parent_epic_id==null?null:(n??[]).find(t=>t.id===e.parent_epic_id)??null,[n,e.parent_epic_id]),E=(0,U.useMemo)(()=>T?(n??[]).filter(e=>e.parent_epic_id===T.id).length:0,[n,T]),[D,ne]=(0,U.useState)(e.title),[O,re]=(0,U.useState)(e.description),[k,ce]=(0,U.useState)(e.priority??`medium`),[A,de]=(0,U.useState)([...e.labels??[]]),[j,fe]=(0,U.useState)(!1),[M,F]=(0,U.useState)(!1),[I,L]=(0,U.useState)(``),[R,Ce]=(0,U.useState)(!1),[we,z]=(0,U.useState)(!1),[Ee,De]=(0,U.useState)(!1),[Oe,ke]=(0,U.useState)(!1),[Ae,je]=(0,U.useState)(!1),[B,V]=(0,U.useState)(!1),H=$e(),Me=H.connected&&!!H.discardStatus&&e.source===`jira`&&!!e.jira_key,Ne=H.connected&&e.source===`jira`&&!!e.jira_key,[Pe,Fe]=(0,U.useState)(e.attachments??[]);(0,U.useEffect)(()=>{Fe(e.attachments??[])},[e.attachments,e.id]);let[Ie,W]=(0,U.useState)(!1),[Le,Re]=(0,U.useState)(null);(0,U.useEffect)(()=>{if(!Ne)return;let e=!0;return xe.listStatuses().then(t=>{e&&Re(t.statuses)}).catch(()=>{e&&Re([])}),()=>{e=!1}},[Ne,e.id]);let G=e.jira_status??``,ze=async t=>{if(t!==e.status){W(!0);try{await a(e.id,{status:t})}finally{W(!1)}}},Be=async t=>{if(!(!t||t===G)){W(!0);try{await xe.moveSpecToStatus(e.id,t),h.success(m(`moveToStatus.queued`,{status:t}))}catch{h.error(m(`moveToStatus.failed`))}finally{W(!1)}}},Ve=(0,U.useRef)(null),He=(0,U.useRef)(null),Ue=(0,U.useRef)(null),We=(0,U.useMemo)(()=>D!==e.title||O!==e.description||k!==e.priority||JSON.stringify(A)!==JSON.stringify(e.labels),[D,O,k,A,e]);(0,U.useEffect)(()=>{j&&Ve.current?.focus()},[j]),(0,U.useEffect)(()=>{if(M){let e=He.current;e&&(e.focus(),e.selectionStart=e.value.length)}},[M]),(0,U.useEffect)(()=>{R&&Ue.current?.focus()},[R]),(0,U.useEffect)(()=>{function e(e){e.key===`Escape`&&!j&&!M&&!we&&r()}return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[r,j,M,we]);let Ge=(0,U.useMemo)(()=>{if(!I.trim())return[];let e=I.toLowerCase();return t.filter(t=>t.toLowerCase().includes(e)&&!A.includes(t)).slice(0,5)},[I,t,A]),Ke=(0,U.useCallback)(e=>{let t=e.trim();t&&!A.includes(t)&&de(e=>[...e,t]),L(``)},[A]),qe=(0,U.useCallback)(e=>{de(t=>t.filter(t=>t!==e))},[]),Je=(0,U.useCallback)(async()=>{let t={};if(D!==e.title&&(t.title=D),O!==e.description&&(t.description=O),k!==e.priority&&(t.priority=k),JSON.stringify(A)!==JSON.stringify(e.labels)&&(t.labels=A),Object.keys(t).length===0){r();return}je(!0);let n=await a(e.id,t);je(!1),n?(h.success(d(`detailModal.toast.updated`)),r()):h.error(d(`detailModal.toast.updateFailed`))},[D,O,k,A,e,a,r,d]),Ye=(0,U.useCallback)(async()=>{if(B)return;V(!0);let t=!1;try{t=await o(e.id)}catch{t=!1}if(V(!1),!t){h.error(d(`detailModal.toast.deleteFailed`));return}z(!1),r()},[B,e.id,o,r,d]),[Xe,q]=(0,U.useState)(0),J=(0,U.useRef)(null),[Ze,Qe]=(0,U.useState)(()=>typeof window<`u`&&window.innerWidth>=zn);(0,U.useEffect)(()=>{if(typeof window>`u`)return;let e=()=>Qe(window.innerWidth>=zn);return e(),window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]);let Y=!u&&!x&&Ze,X=(0,U.useCallback)(e=>{J.current&&q(e.clientX-J.current.startX)},[]),Z=(0,U.useCallback)(t=>{if(!J.current)return;let n=t.clientX-J.current.startX,i=window.innerWidth*Bn;if(window.removeEventListener(`pointermove`,X),window.removeEventListener(`pointerup`,Z),window.removeEventListener(`pointercancel`,Z),J.current=null,q(0),Math.abs(n)>=i&&window.innerWidth>=zn){let t=b.leftId===e.id;y(n<0?`left`:`right`,e.id),t||r()}},[y,X,b.leftId,e.id,r]),tt=(0,U.useCallback)(e=>{Y&&e.button===0&&(e.target.closest(`button, input, textarea, select, [contenteditable="true"]`)||(J.current={startX:e.clientX,pointerId:e.pointerId},window.addEventListener(`pointermove`,X),window.addEventListener(`pointerup`,Z),window.addEventListener(`pointercancel`,Z)))},[Y,X,Z]);(0,U.useEffect)(()=>()=>{J.current&&(window.removeEventListener(`pointermove`,X),window.removeEventListener(`pointerup`,Z),window.removeEventListener(`pointercancel`,Z))},[X,Z]);let rt=(0,U.useCallback)(()=>{if(!Y||window.innerWidth<zn)return;let t=b.leftId===e.id;y(`right`,e.id),t||r()},[Y,y,b.leftId,e.id,r]),{panelRef:it,panelStyle:at,resizeHandles:ot,guardBackdrop:st}=me({enabled:!u,allowMove:!1}),ct=(0,K.jsxs)(K.Fragment,{children:[(0,K.jsxs)(`div`,{ref:it,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]`,style:{...Xe===0?{transition:`transform 220ms cubic-bezier(0.34, 1.56, 0.64, 1)`}:{transform:`translateX(${Xe}px)`,transition:`none`},...at},children:[T&&(0,K.jsx)(`div`,{className:`px-5 pt-3`,children:(0,K.jsx)(Nn,{epic:T,childExecutionOrder:e.execution_order??null,totalChildren:E,onOpenEpic:()=>i?.(T.id)})}),(0,K.jsxs)(`div`,{className:`flex items-start justify-between gap-3 px-5 py-4 border-b border-border/30 ${Y?`cursor-grab active:cursor-grabbing`:``}`,onPointerDown:tt,"data-testid":`ticket-modal-header`,children:[(0,K.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[j?(0,K.jsx)(`input`,{ref:Ve,value:D,onChange:e=>ne(e.target.value),onBlur:()=>fe(!1),onKeyDown:t=>{t.key===`Enter`&&fe(!1),t.key===`Escape`&&(ne(e.title),fe(!1))},className:`w-full bg-transparent border-b border-accent-primary/50 text-sm font-semibold text-foreground outline-none pb-0.5`}):(0,K.jsxs)(`button`,{type:`button`,onClick:()=>fe(!0),className:`group flex items-center gap-1.5 text-left w-full`,children:[(0,K.jsx)(`h2`,{className:`text-sm font-semibold text-foreground truncate`,children:D||d(`untitled`)}),(0,K.jsx)(ae,{className:`w-3 h-3 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity shrink-0`})]}),(0,K.jsxs)(`div`,{className:`flex items-center gap-2 mt-1.5`,children:[(0,K.jsxs)(`span`,{className:`text-[10px] text-foreground font-mono`,children:[`#`,e.id]}),e.status===`on_review`&&(0,K.jsx)(`span`,{title:d(`specs:status.onReviewHint`),"data-testid":`ticket-modal-on-review-badge`,children:(0,K.jsx)(nt,{status:`on_review`})})]}),(0,K.jsx)(un,{ticketId:e.id})]}),g&&(0,K.jsx)(`div`,{className:`shrink-0`,children:(0,K.jsx)(Mn,{ticket:e,projectId:g,provider:S,featureFlagOn:C,childrenCount:w.length})}),(0,K.jsx)(Jn,{ticket:e,title:D,description:O,priority:k,labels:A,onClose:r}),s&&(c||l)&&(0,K.jsx)(Yn,{ticket:e,rails:s,onMoveToRail:c,onRemoveFromRail:l}),Y&&(0,K.jsxs)(P,{variant:`outline`,size:`sm`,className:`shrink-0 mr-1 gap-1.5`,"data-testid":`ticket-modal-compare`,onClick:rt,title:d(`detailModal.compareTooltip`),children:[(0,K.jsx)(Te,{className:`w-3.5 h-3.5`}),d(`detailModal.compare`)]}),(0,K.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,K.jsx)(ue,{className:`w-4 h-4`})})]}),(0,K.jsx)(`div`,{className:`flex-1 overflow-y-auto min-h-0`,children:(0,K.jsxs)(`div`,{className:`flex flex-col sm:flex-row h-full`,children:[(0,K.jsxs)(`div`,{className:`flex-1 min-w-0 px-5 py-4 space-y-4 flex flex-col`,children:[(0,K.jsxs)(`div`,{className:`flex-1 flex flex-col`,children:[(0,K.jsxs)(`div`,{className:`flex items-center justify-between mb-1.5`,children:[(0,K.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider flex items-center gap-1.5`,children:d(`fields.description`)}),!M&&(0,K.jsxs)(`button`,{type:`button`,onClick:()=>F(!0),className:`text-[10px] text-muted-foreground hover:text-foreground transition-colors flex items-center gap-1`,children:[(0,K.jsx)(ae,{className:`w-2.5 h-2.5`}),d(`common:actions.edit`)]})]}),M?(0,K.jsxs)(`div`,{className:`space-y-1.5 flex-1 flex flex-col`,children:[(0,K.jsx)(`textarea`,{ref:He,value:O,onChange:e=>re(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,K.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,K.jsx)(P,{variant:`ghost`,size:`sm`,className:`h-6 text-[10px]`,onClick:()=>F(!1),children:d(`detailModal.doneEditing`)}),(0,K.jsx)(`span`,{className:`text-[9px] text-muted-foreground`,children:d(`fields.supportsMarkdown`)})]})]}):O?(0,K.jsx)($n,{description:O,onEdit:()=>F(!0)}):(0,K.jsx)(`button`,{type:`button`,onClick:()=>F(!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,K.jsx)(Ht,{ticketKey:e.id,attachments:Pe,onChange:Fe}),(0,K.jsx)(Ut,{ticketId:e.id,onClose:r}),e.prerequisites&&e.prerequisites.length>0&&(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-1.5`,children:d(`detailModal.prerequisites`)}),(0,K.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:e.prerequisites.map(e=>(0,K.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,K.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,K.jsxs)(`button`,{type:`button`,onClick:()=>{Q(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,K.jsx)(ee,{className:`w-3.5 h-3.5 shrink-0`}),m(`detail.goToTicket`,{key:e.jira_key})]}),e.jira_epic_key&&(0,K.jsxs)(`div`,{"data-testid":`jira-epic`,children:[(0,K.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-1.5`,children:m(`detail.epic`)}),(0,K.jsxs)(`button`,{type:`button`,onClick:()=>{let t=Wn(e);t&&Q(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,K.jsx)(`span`,{className:`font-mono text-accent-highlight shrink-0`,children:e.jira_epic_key}),e.jira_epic_name&&(0,K.jsx)(`span`,{className:`truncate text-foreground/80`,children:e.jira_epic_name})]})]}),(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-1.5`,children:d(`fields.status`)}),Ne?(0,K.jsx)(`select`,{value:G,disabled:Ie||Le===null,onChange:e=>{Be(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:Le===null?(0,K.jsx)(`option`,{value:G,children:G||d(`states.loading`,{ns:`common`})}):(0,K.jsxs)(K.Fragment,{children:[G&&!Le.some(e=>e.name===G)&&(0,K.jsx)(`option`,{value:G,children:G}),Le.map(e=>(0,K.jsx)(`option`,{value:e.name,children:e.name},e.name))]})}):(0,K.jsxs)(`select`,{value:e.status,disabled:Ie,onChange:e=>{ze(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:[!Vn.includes(e.status)&&(0,K.jsx)(`option`,{value:e.status,children:d(Hn[e.status],{ns:`tickets`})}),Vn.map(e=>(0,K.jsx)(`option`,{value:e,children:d(Hn[e],{ns:`tickets`})},e))]})]}),(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-1.5`,children:d(`fields.priority`)}),(0,K.jsx)(`select`,{value:k,onChange:e=>ce(e.target.value),className:`w-full h-7 rounded border border-border bg-input px-2 text-xs text-foreground`,children:Un.map(e=>(0,K.jsx)(`option`,{value:e.value,children:d(e.labelKey)},e.value))})]}),(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-1.5`,children:d(`fields.labels`)}),(0,K.jsx)(`div`,{className:`flex flex-wrap gap-1 mb-1.5`,children:A.map(e=>(0,K.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,K.jsx)(`button`,{type:`button`,onClick:()=>qe(e),className:`text-muted-foreground hover:text-foreground opacity-0 group-hover:opacity-100 transition-opacity`,children:(0,K.jsx)(te,{className:`w-2.5 h-2.5`})})]},e))}),R?(0,K.jsxs)(`div`,{className:`relative`,children:[(0,K.jsx)(`input`,{ref:Ue,value:I,onChange:e=>L(e.target.value),onKeyDown:e=>{e.key===`Enter`&&I.trim()&&(e.preventDefault(),Ke(I)),e.key===`Escape`&&(Ce(!1),L(``))},onBlur:()=>{I.trim()&&Ke(I),Ce(!1),L(``)},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`}),Ge.length>0&&(0,K.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:Ge.map(e=>(0,K.jsx)(`button`,{type:`button`,onMouseDown:t=>{t.preventDefault(),Ke(e)},className:`w-full text-left px-2 py-1 text-[10px] hover:bg-accent/50 text-foreground/80`,children:e},e))})]}):(0,K.jsxs)(`button`,{type:`button`,onClick:()=>Ce(!0),className:`flex items-center gap-1 text-[10px] text-muted-foreground hover:text-foreground transition-colors`,children:[(0,K.jsx)(oe,{className:`w-2.5 h-2.5`}),d(`detailModal.addLabel`)]})]}),(0,K.jsx)(Ln,{ticket:e,allTickets:n??[],onOpenTicket:e=>i?.(e)}),e.source===`jira`&&e.jira_key&&(0,K.jsx)(pn,{localId:e.id}),e.metadata?.effort_level&&(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-0.5`,children:d(`detailModal.effort`)}),(0,K.jsx)(`span`,{className:`text-xs text-foreground/70`,children:e.metadata.effort_level})]}),e.assignee&&(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wider block mb-0.5`,children:d(`detailModal.assignee`)}),(0,K.jsx)(`span`,{className:`text-xs text-foreground/70`,children:e.assignee})]})]})]})}),(0,K.jsxs)(`div`,{className:`flex items-center justify-between px-5 py-3 border-t border-border/30`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-3 text-[10px] text-muted-foreground`,children:[(0,K.jsx)(`span`,{children:d(`meta.createdAgo`,{time:qn(e.created_at)})}),(0,K.jsx)(`span`,{children:d(`meta.updatedAgo`,{time:qn(e.updated_at)})}),e.source&&(0,K.jsx)(`span`,{className:`bg-muted/30 rounded px-1.5 py-0.5`,children:Gn[e.source]?d(Gn[e.source]):e.source})]}),(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[Me?(0,K.jsxs)(P,{variant:`ghost`,size:`sm`,className:`h-7 text-xs text-accent-info hover:bg-accent-info/10`,onClick:()=>De(!0),"data-testid":`jira-move-to-button`,children:[(0,K.jsx)(v,{className:`w-3 h-3 mr-1`}),m(`discard.moveButton`,{status:H.discardStatus})]}):(0,K.jsxs)(P,{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:()=>z(!0),children:[(0,K.jsx)(le,{className:`w-3 h-3 mr-1`}),d(`common:actions.delete`)]}),We&&(0,K.jsxs)(P,{size:`sm`,className:`h-7 text-xs`,onClick:()=>{Ne?ke(!0):Je()},disabled:Ae||!D.trim(),children:[(0,K.jsx)(se,{className:`w-3 h-3 mr-1`}),d(Ae?`common:states.saving`:`common:actions.save`)]})]})]})]}),(0,K.jsx)(be,{open:we,onOpenChange:e=>{B||z(e)},children:(0,K.jsxs)(ge,{className:`max-w-sm`,children:[(0,K.jsxs)(pe,{children:[(0,K.jsx)(_e,{children:d(`deleteDialog.title`)}),(0,K.jsx)(ve,{children:(0,K.jsx)(f,{t:d,i18nKey:`deleteDialog.body`,values:{id:e.id,title:e.title},components:{strong:(0,K.jsx)(`span`,{className:`font-semibold text-foreground`})}})})]}),(0,K.jsxs)(he,{children:[(0,K.jsx)(P,{variant:`outline`,size:`sm`,onClick:()=>z(!1),disabled:B,children:d(`common:actions.cancel`)}),(0,K.jsxs)(P,{variant:`destructive`,size:`sm`,onClick:()=>{Ye()},disabled:B,"aria-busy":B,children:[B?(0,K.jsx)(ie,{className:`w-3.5 h-3.5 mr-1.5 animate-spin`}):(0,K.jsx)(le,{className:`w-3.5 h-3.5 mr-1.5`}),d(`common:actions.delete`)]})]})]})}),Me&&H.discardStatus&&(0,K.jsx)(et,{open:Ee,onOpenChange:De,ticket:{id:e.id,title:e.title,jira_key:e.jira_key},discardStatus:H.discardStatus,onDiscarded:r}),(0,K.jsx)(be,{open:Oe,onOpenChange:ke,children:(0,K.jsxs)(ge,{className:`max-w-md`,"data-testid":`jira-save-confirm`,children:[(0,K.jsxs)(pe,{children:[(0,K.jsx)(_e,{children:m(`detail.saveTitle`)}),(0,K.jsx)(ve,{children:m(`detail.saveBody`,{key:e.jira_key??`#${e.id}`})})]}),(0,K.jsxs)(he,{children:[(0,K.jsx)(P,{variant:`outline`,size:`sm`,onClick:()=>ke(!1),children:d(`common:actions.cancel`)}),(0,K.jsxs)(P,{size:`sm`,onClick:()=>{ke(!1),Je()},disabled:Ae,"data-testid":`jira-save-confirm-btn`,children:[(0,K.jsx)(se,{className:`w-3.5 h-3.5 mr-1.5`}),m(`detail.saveConfirm`)]})]})]})})]});return u?ct:(0,qt.createPortal)((0,K.jsxs)(`div`,{className:`fixed inset-0 z-[68] flex items-center justify-center`,children:[(0,K.jsx)(`div`,{className:`absolute inset-0 bg-black/70`,onClick:st(r)}),ct,(0,K.jsx)(ye,{handles:ot})]}),document.body)}function qn(e){try{return R(new Date(e),{addSuffix:!0,locale:s()})}catch{return e}}function Jn({ticket:e,title:t,description:n,priority:r,labels:i,onClose:a}){let{t:o}=p(`tickets`),{triggerResume:s}=T(),{activeProjectId:c}=N(),{closeTicketDetail:l}=sn();return Ke(e)?(0,K.jsxs)(P,{variant:`default`,size:`sm`,onClick:()=>{if(!c)return;let{body:u,criteria:d}=We(n);s({kind:`explore-spec`,projectId:c,label:t||e.title||o(`detailModal.ticketFallbackLabel`,{id:e.id}),restoreRoute:`/`,params:{initialIdea:``,pendingSpecId:qe(),initialAttachmentIds:[],resumeConversationId:e.origin_conversation_id??void 0,editTicket:{id:e.id,title:t,description:u,labels:i,priority:r,acceptanceCriteria:d,status:e.status}}}),l(),a()},className:`shrink-0 mr-2`,"data-testid":`continue-editing`,children:[(0,K.jsx)(Ae,{className:`w-3.5 h-3.5 mr-1.5`}),o(`detailModal.continueEditing`)]}):null}function Yn({ticket:e,rails:t,onMoveToRail:n,onRemoveFromRail:r}){let{t:i}=p(`tickets`),[a,o]=(0,U.useState)(null),s=(0,U.useRef)(null),c=t.find(t=>t.ticketIds.includes(e.id));return c?r?(0,K.jsxs)(P,{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,K.jsx)(g,{className:`w-3.5 h-3.5`,"aria-hidden":!0}),i(`rail.removeFromRail`)]}):null:n?(0,K.jsxs)(K.Fragment,{children:[(0,K.jsxs)(P,{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,K.jsx)(v,{className:`w-3.5 h-3.5`,"aria-hidden":!0})]}),a&&(0,K.jsx)(He,{rails:t,anchorRect:a,onMoveToRail:t=>n(e.id,t),onClose:()=>o(null)})]}):null}var Xn=`
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Contract Layer
|
|
13
|
+
|
|
14
|
+
`;function Zn(e){let t=e.indexOf(Xn);return t<0?{user:e,contract:null}:{user:e.slice(0,t),contract:e.slice(t+26)}}function Qn(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 $n({description:e,onEdit:t}){let{t:n}=p(`tickets`),{openWebView:r}=_n(),{user:i,contract:a}=Zn(e),o=i||e,s=(0,U.useMemo)(()=>({a:({href:e,children:t})=>(0,K.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,K.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,K.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,K.jsx)(I,{remarkPlugins:[L],components:s,children:o})}),a&&(0,K.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,K.jsxs)(`summary`,{className:`cursor-pointer text-[10px] font-medium text-foreground/80 select-none flex items-center gap-2`,children:[n(`contractLayer.title`),(0,K.jsx)(`span`,{className:`rounded-full bg-muted/40 px-1.5 text-[9px] text-foreground/60`,children:n(`contractLayer.populated`,{n:Qn(a)})})]}),(0,K.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,K.jsx)(I,{remarkPlugins:[L],components:s,children:a})})]})]})}export{He as A,Te as B,Y as C,qe as D,Je as E,Ae as F,ke as I,Oe as L,Me as M,Ne as N,Ke as O,B as P,De as R,q as S,X as T,z as V,$e as _,on as a,Qe as b,mt as c,lt as d,at as f,et as g,tt as h,_n as i,G as j,We as k,Q as l,rt as m,Sn as n,sn as o,pt as p,gn as r,ht as s,Kn as t,gt as u,Ye as v,J as w,Xe as x,Ze as y,Ee as z};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,t}from"./rolldown-runtime-CNC7AqOf.js";import{n}from"./jsx-runtime-zu2_FqZY.js";import{S as r}from"./i18n-
|
|
1
|
+
import{a as e,t}from"./rolldown-runtime-CNC7AqOf.js";import{n}from"./jsx-runtime-zu2_FqZY.js";import{S as r}from"./i18n-nJQvD5zJ.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+=`<`,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
|
-
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
|
|
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 +1 @@
|
|
|
1
|
-
var e={title:`Spec hinzufügen`,dialogDescription:`Erstelle eine neue Spec aus einer kurzen Idee – sofort oder im Explore-Modus.`,engineAriaLabel:`KI-Engine für diese Spec`,modeTablistLabel:`Modus der Spec-Erstellung`,mode:{quick:`Quick`,explore:`Explore`,raw:`Raw`,exploreHint:`interaktiv`,rawHint:`ohne KI`,quickUnavailable:`für Kimi nicht verfügbar`},modeDescription:{quick:`Beschreibe das Feature oder die Änderung. Hänge Mockups, Briefings oder Daten für mehr Kontext an.`,explore:`Beschreibe eine grobe Idee. Der ausgewählte KI-Assistent hilft dir, sie im Gespräch zu formen – du entscheidest, wann committet wird.`,raw:`Dein Prompt, unverändert – als Spec-Ticket gespeichert. Es läuft jetzt keine KI; zieh es auf eine Rail, um es zu bauen.`},editorPlaceholder:{quick:`z. B. Einen Dark-Mode-Toggle auf der Einstellungsseite ergänzen, der die Nutzerpräferenz speichert…`,explore:`z. B. Dark Mode – unklar, wo der Toggle hingehört oder wie die Einstellung gespeichert wird…`,raw:`Beschreibe das Feature, die Änderung oder die Idee. Markdown, Bilder und Dateien werden unterstützt…`},ideaAriaLabel:`Spec-Idee`,raw:{titleLabel:`Titel`,titlePlaceholder:`Wird automatisch aus deinem Prompt befüllt…`,priorityLabel:`Priorität`,labelsLabel:`Labels`,removeLabel:`Label {{label}} entfernen`,addLabelAria:`Label hinzufügen`,labelPlaceholder:`optional…`,bodyAriaLabel:`Raw-Spec-Inhalt`},priority:{critical:`Kritisch`,high:`Hoch`,medium:`Mittel`,low:`Niedrig`},fromWebsite:`Von einer Website`,fromWebsiteTitle:`Öffne eine echte Webseite, wähle einen Bereich aus und mach daraus eine Spec`,capture:{responsiveSizes_one:`Responsive · {{count}} Größe`,responsiveSizes_other:`Responsive · {{count}} Größen`},submit:{quick:`Spec generieren`,explore:`Weiter`,raw:`Erstellen`,disabledTitle:`Schreib zuerst einen Prompt`},toast:{createFailed:`Spec konnte nicht erstellt werden`,rawSavedWithId:`Gespeichert als #{{id}} · Raw-Spec bereit für Rails`,rawCreated:`Raw-Spec erstellt`,exploreNotWired:`Der Explore-Modus ist in dieser Ansicht nicht angebunden`,generating:`Wird generiert…`,failedToStart:`{{projectName}} · Start fehlgeschlagen`,unsupportedFileType:`Nicht unterstützter Dateityp: {{name}}`,uploadFailed:`Upload fehlgeschlagen für {{name}}: {{message}}`}},t={title:`Feature vorschlagen`,ideaIntro:`Beschreibe deine Idee in einfachen Worten. Claude liest die Codebasis und strukturiert sie zu einem vollständigen Vorschlag.`,ideaAriaLabel:`Feature-Idee`,ideaPlaceholder:`z. B. Nutzer sollen einen Budget-Alarm einrichten können, um benachrichtigt zu werden, wenn die API-Kosten einen Schwellwert überschreiten…`,cmdEnterToSubmit:`Cmd+Enter zum Absenden`,exploreIdea:`Idee erkunden`,exploringTitle:`Deine Idee wird erkundet…`,refiningTitle:`Vorschlag wird verfeinert…`,reviewTitle:`Vorschlag prüfen`,readingCodebase_one:`Codebasis wird gelesen… ({{count}} Datei untersucht)`,readingCodebase_other:`Codebasis wird gelesen… ({{count}} Dateien untersucht)`,refinementAriaLabel:`Verfeinerungs-Feedback`,refinementPlaceholder:`Änderungen anfordern, Einschränkungen ergänzen, Umfang schärfen…`,sendRefinementTitle:`Verfeinerung senden (Cmd+Enter)`,cmdEnterToSend:`Cmd+Enter zum Senden`,confirmCreateIssue:`Aus diesem Vorschlag ein GitHub-Issue erstellen?`,yesCreateIssue:`Ja, Issue erstellen`,createGithubIssue:`GitHub-Issue erstellen`,startOver:`Neu beginnen`,creatingIssueTitle:`GitHub-Issue wird erstellt…`,creatingIssueViaCli:`Issue wird über die GitHub CLI erstellt…`,issueCreated:`Issue erstellt`,proposeAnother:`Weiteren Vorschlag erstellen`,errorTitle:`Etwas ist schiefgelaufen`,errorFallback:`Ein Fehler ist aufgetreten`,tryAgain:`Erneut versuchen`,cancelledTitle:`Abgebrochen`,cancelledBody:`Der Vorschlag wurde abgebrochen.`},n={heading:`Kontextbewusstsein`,custom:`Benutzerdefiniert`,customMix:`Eigene Mischung – siehe Feinabstimmung unten`,estimateUnavailable:`{{tier}} · keine Schätzung verfügbar`,preset:{minimal:`Minimal`,light:`Leicht`,standard:`Standard`,rich:`Umfangreich`,max:`Max`,desktop:`Desktop`},presetCost:{minimal:`1× Kosten · schnellstes erstes Token · keine Specs geladen`,light:`1,3× Kosten · Specrails-Specs geladen`,standard:`1,6× Kosten · Specrails- + OpenSpec-Specs geladen`,rich:`2× Kosten · voller Lesezugriff aufs Repo`,max:`4× Kosten · voller Lesezugriff + Contract-Layer-Verfeinerung`,desktop:`4–6× Kosten · alle Features + Projekt-MCPs & deine freigegebenen MCPs`},smashCapable:`SMASH-fähig`,smashHint:`Contract Layer ist aktiv, daher kann diese Spec später in Sub-Specs zerlegt werden.`,fineTune:`Feinabstimmung`,defaultLabel:`Kontextumfang`,summaryMinimal:`minimal`,tags:{specrails:`specrails`,openspec:`openspec`,codebase:`codebase`,mcp:`mcp`,myMcp:`my-mcp`,contract:`contract`},checks:{specrailsLabel:`specrails-Tickets`,openspecLabel:`openspec-Specs`,fullLabel:`Gesamte Codebasis`,mcpLabel:`Projekt-MCPs`,mcpHint:`.mcp.json-Server`,userMcpLabel:`Meine freigegebenen MCPs`,userMcpHint:`~/.claude Server`,userMcpTooltip:`Deine lokal freigegebenen MCP-Server (claude mcp add)`,exploreOnly:`Nur im Explore-Modus`,providerUnsupported:`Für {{provider}} nicht verfügbar`,contractLabel:`Mit Contract Layer anreichern`,contractHint:`Verfeinerung nach dem Commit · aktiviert SMASH`}},r={label:`KI-Engine`},i={presetHeading:`Modell-Preset`,preset:{balanced:{label:`Ausgewogen`,description:`{{model}} für alle Agents (empfohlen)`},budget:{label:`Budget`,description:`{{model}} für alle Agents – 3× günstiger, schneller`},max:{label:`Max`,description:`{{topModel}} für Architect + PM, {{baseModel}} für den Rest`}},overridesHeading:`Modell-Overrides pro Agent`,overriddenCount:`{{count}} überschrieben`,customBadge:`angepasst`,resetToDefault:`Auf Preset-Standard zurücksetzen`},a={alias:`Claude Code-Alias: {{alias}}`,tier:{balanced:`Ausgewogen`,mostCapable:`Leistungsstärkstes`,fastest:`Schnellstes`,frontier:`Frontier`}},o={heading:`Kostenbewusstsein`,meterAriaLabel:`Kostenstufe`,estimateUnavailable:`nur Stufe – keine Schätzung verfügbar`},s={heading:`Vorgeschlagener Befehl`,run:`Ausführen`,dismiss:`Verwerfen`},c={serverError:`Serverfehler ({{status}})`,connectionFailed:`Verbindung fehlgeschlagen: {{message}}`,sendRefinementFailed:`Verfeinerung konnte nicht gesendet werden`,createIssueFailed:`Issue konnte nicht erstellt werden`},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 hinzufügen`,dialogDescription:`Erstelle eine neue Spec aus einer kurzen Idee – sofort oder im Explore-Modus.`,engineAriaLabel:`KI-Engine für diese Spec`,modeTablistLabel:`Modus der Spec-Erstellung`,mode:{quick:`Quick`,explore:`Explore`,raw:`Raw`,exploreHint:`interaktiv`,rawHint:`ohne KI`,quickUnavailable:`für Kimi nicht verfügbar`},modeDescription:{quick:`Beschreibe das Feature oder die Änderung. Hänge Mockups, Briefings oder Daten für mehr Kontext an.`,explore:`Beschreibe eine grobe Idee. Der ausgewählte KI-Assistent hilft dir, sie im Gespräch zu formen – du entscheidest, wann committet wird.`,raw:`Dein Prompt, unverändert – als Spec-Ticket gespeichert. Es läuft jetzt keine KI; zieh es auf eine Rail, um es zu bauen.`},editorPlaceholder:{quick:`z. B. Einen Dark-Mode-Toggle auf der Einstellungsseite ergänzen, der die Nutzerpräferenz speichert…`,explore:`z. B. Dark Mode – unklar, wo der Toggle hingehört oder wie die Einstellung gespeichert wird…`,raw:`Beschreibe das Feature, die Änderung oder die Idee. Markdown, Bilder und Dateien werden unterstützt…`},ideaAriaLabel:`Spec-Idee`,raw:{titleLabel:`Titel`,titlePlaceholder:`Wird automatisch aus deinem Prompt befüllt…`,priorityLabel:`Priorität`,labelsLabel:`Labels`,removeLabel:`Label {{label}} entfernen`,addLabelAria:`Label hinzufügen`,labelPlaceholder:`optional…`,bodyAriaLabel:`Raw-Spec-Inhalt`},priority:{critical:`Kritisch`,high:`Hoch`,medium:`Mittel`,low:`Niedrig`},fromWebsite:`Von einer Website`,fromWebsiteTitle:`Öffne eine echte Webseite, wähle einen Bereich aus und mach daraus eine Spec`,capture:{responsiveSizes_one:`Responsive · {{count}} Größe`,responsiveSizes_other:`Responsive · {{count}} Größen`},submit:{quick:`Spec generieren`,explore:`Weiter`,raw:`Erstellen`,disabledTitle:`Schreib zuerst einen Prompt`},toast:{createFailed:`Spec konnte nicht erstellt werden`,rawSavedWithId:`Gespeichert als #{{id}} · Raw-Spec bereit für Rails`,rawCreated:`Raw-Spec erstellt`,exploreNotWired:`Der Explore-Modus ist in dieser Ansicht nicht angebunden`,generating:`Wird generiert…`,failedToStart:`{{projectName}} · Start fehlgeschlagen`,unsupportedFileType:`Nicht unterstützter Dateityp: {{name}}`,uploadFailed:`Upload fehlgeschlagen für {{name}}: {{message}}`}},t={title:`Feature vorschlagen`,ideaIntro:`Beschreibe deine Idee in einfachen Worten. Claude liest die Codebasis und strukturiert sie zu einem vollständigen Vorschlag.`,ideaAriaLabel:`Feature-Idee`,ideaPlaceholder:`z. B. Nutzer sollen einen Budget-Alarm einrichten können, um benachrichtigt zu werden, wenn die API-Kosten einen Schwellwert überschreiten…`,cmdEnterToSubmit:`Cmd+Enter zum Absenden`,exploreIdea:`Idee erkunden`,exploringTitle:`Deine Idee wird erkundet…`,refiningTitle:`Vorschlag wird verfeinert…`,reviewTitle:`Vorschlag prüfen`,readingCodebase_one:`Codebasis wird gelesen… ({{count}} Datei untersucht)`,readingCodebase_other:`Codebasis wird gelesen… ({{count}} Dateien untersucht)`,refinementAriaLabel:`Verfeinerungs-Feedback`,refinementPlaceholder:`Änderungen anfordern, Einschränkungen ergänzen, Umfang schärfen…`,sendRefinementTitle:`Verfeinerung senden (Cmd+Enter)`,cmdEnterToSend:`Cmd+Enter zum Senden`,confirmCreateIssue:`Aus diesem Vorschlag ein GitHub-Issue erstellen?`,yesCreateIssue:`Ja, Issue erstellen`,createGithubIssue:`GitHub-Issue erstellen`,startOver:`Neu beginnen`,creatingIssueTitle:`GitHub-Issue wird erstellt…`,creatingIssueViaCli:`Issue wird über die GitHub CLI erstellt…`,issueCreated:`Issue erstellt`,proposeAnother:`Weiteren Vorschlag erstellen`,errorTitle:`Etwas ist schiefgelaufen`,errorFallback:`Ein Fehler ist aufgetreten`,tryAgain:`Erneut versuchen`,cancelledTitle:`Abgebrochen`,cancelledBody:`Der Vorschlag wurde abgebrochen.`},n={heading:`Kontextbewusstsein`,custom:`Benutzerdefiniert`,customMix:`Eigene Mischung – siehe Feinabstimmung unten`,estimateUnavailable:`{{tier}} · keine Schätzung verfügbar`,preset:{minimal:`Minimal`,light:`Leicht`,standard:`Standard`,rich:`Umfangreich`,max:`Max`,desktop:`Desktop`},presetCost:{minimal:`1× Kosten · schnellstes erstes Token · keine Specs geladen`,light:`1,3× Kosten · Specrails-Specs geladen`,standard:`1,6× Kosten · Specrails- + OpenSpec-Specs geladen`,rich:`2× Kosten · voller Lesezugriff aufs Repo`,max:`4× Kosten · voller Lesezugriff + Contract-Layer-Verfeinerung`,desktop:`4–6× Kosten · alle Features + Projekt-MCPs & deine freigegebenen MCPs`},smashCapable:`SMASH-fähig`,smashHint:`Contract Layer ist aktiv, daher kann diese Spec später in Sub-Specs zerlegt werden.`,fineTune:`Feinabstimmung`,defaultLabel:`Kontextumfang`,summaryMinimal:`minimal`,tags:{specrails:`specrails`,openspec:`openspec`,codebase:`codebase`,mcp:`mcp`,myMcp:`my-mcp`,contract:`contract`},checks:{specrailsLabel:`specrails-Tickets`,openspecLabel:`openspec-Specs`,fullLabel:`Gesamte Codebasis`,mcpLabel:`Projekt-MCPs`,mcpHint:`.mcp.json-Server`,userMcpLabel:`Meine freigegebenen MCPs`,userMcpHint:`~/.claude Server`,userMcpTooltip:`Deine lokal freigegebenen MCP-Server (claude mcp add)`,exploreOnly:`Nur im Explore-Modus`,providerUnsupported:`Für {{provider}} nicht verfügbar`,contractLabel:`Mit Contract Layer anreichern`,contractHint:`Verfeinerung nach dem Commit · aktiviert SMASH`}},r={label:`KI-Engine`,notSignedIn:`Nicht angemeldet`},i={presetHeading:`Modell-Preset`,preset:{balanced:{label:`Ausgewogen`,description:`{{model}} für alle Agents (empfohlen)`},budget:{label:`Budget`,description:`{{model}} für alle Agents – 3× günstiger, schneller`},max:{label:`Max`,description:`{{topModel}} für Architect + PM, {{baseModel}} für den Rest`}},overridesHeading:`Modell-Overrides pro Agent`,overriddenCount:`{{count}} überschrieben`,customBadge:`angepasst`,resetToDefault:`Auf Preset-Standard zurücksetzen`},a={alias:`Claude Code-Alias: {{alias}}`,tier:{balanced:`Ausgewogen`,mostCapable:`Leistungsstärkstes`,fastest:`Schnellstes`,frontier:`Frontier`}},o={heading:`Kostenbewusstsein`,meterAriaLabel:`Kostenstufe`,estimateUnavailable:`nur Stufe – keine Schätzung verfügbar`},s={heading:`Vorgeschlagener Befehl`,run:`Ausführen`,dismiss:`Verwerfen`},c={serverError:`Serverfehler ({{status}})`,connectionFailed:`Verbindung fehlgeschlagen: {{message}}`,sendRefinementFailed:`Verfeinerung konnte nicht gesendet werden`,createIssueFailed:`Issue konnte nicht erstellt werden`},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:`Adicionar Spec`,dialogDescription:`Crie uma nova spec a partir de uma ideia curta, imediatamente ou através do modo Explore.`,engineAriaLabel:`Motor de IA para esta spec`,modeTablistLabel:`Modo de criação da spec`,mode:{quick:`Quick`,explore:`Explore`,raw:`Raw`,exploreHint:`interativo`,rawHint:`sem IA`,quickUnavailable:`indisponível para Kimi`},modeDescription:{quick:`Descreva a funcionalidade ou alteração. Anexe mockups, briefs ou dados para mais contexto.`,explore:`Descreva uma ideia aproximada. O assistente de IA selecionado vai ajudá-lo a dar-lhe forma através de conversa — você decide quando confirmar.`,raw:`O seu prompt, tal como está — guardado como ticket de spec. Sem IA agora; arraste-o para um rail para o construir.`},editorPlaceholder:{quick:`p. ex. Adicionar um interruptor de modo escuro à página de definições que persista a preferência do utilizador...`,explore:`p. ex. modo escuro — não sei bem onde colocar o interruptor nem como persistir a preferência…`,raw:`Descreva a funcionalidade, alteração ou ideia. Suporta Markdown, imagens e ficheiros…`},ideaAriaLabel:`Ideia da spec`,raw:{titleLabel:`Título`,titlePlaceholder:`Preenchido automaticamente a partir do seu prompt…`,priorityLabel:`Prioridade`,labelsLabel:`Etiquetas`,removeLabel:`Remover etiqueta {{label}}`,addLabelAria:`Adicionar etiqueta`,labelPlaceholder:`opcional…`,bodyAriaLabel:`Corpo da spec Raw`},priority:{critical:`Crítica`,high:`Alta`,medium:`Média`,low:`Baixa`},fromWebsite:`A partir de um website`,fromWebsiteTitle:`Abra uma página web real, selecione uma área e converta-a numa spec`,capture:{responsiveSizes_one:`Responsivo · {{count}} tamanho`,responsiveSizes_other:`Responsivo · {{count}} tamanhos`},submit:{quick:`Gerar Spec`,explore:`Continuar`,raw:`Criar`,disabledTitle:`Escreva primeiro um prompt`},toast:{createFailed:`Falha ao criar a spec`,rawSavedWithId:`Guardada como #{{id}} · Spec Raw pronta para os rails`,rawCreated:`Spec Raw criada`,exploreNotWired:`O modo Explore não está disponível nesta vista`,generating:`A gerar...`,failedToStart:`{{projectName}} · Falha ao iniciar`,unsupportedFileType:`Tipo de ficheiro não suportado: {{name}}`,uploadFailed:`Falha no carregamento de {{name}}: {{message}}`}},t={title:`Propor uma funcionalidade`,ideaIntro:`Descreva a sua ideia em linguagem simples. O Claude vai ler a base de código e estruturá-la numa proposta completa.`,ideaAriaLabel:`Ideia de funcionalidade`,ideaPlaceholder:`p. ex. Quero que os utilizadores possam definir um alerta de orçamento para serem notificados quando os custos de API excederem um limite...`,cmdEnterToSubmit:`Cmd+Enter para submeter`,exploreIdea:`Explorar ideia`,exploringTitle:`A explorar a sua ideia...`,refiningTitle:`A refinar a proposta...`,reviewTitle:`Rever proposta`,readingCodebase_one:`A ler a base de código... ({{count}} ficheiro explorado)`,readingCodebase_other:`A ler a base de código... ({{count}} ficheiros explorados)`,refinementAriaLabel:`Feedback de refinamento`,refinementPlaceholder:`Peça alterações, adicione restrições, ajuste o âmbito...`,sendRefinementTitle:`Enviar refinamento (Cmd+Enter)`,cmdEnterToSend:`Cmd+Enter para enviar`,confirmCreateIssue:`Criar uma Issue do GitHub a partir desta proposta?`,yesCreateIssue:`Sim, criar issue`,createGithubIssue:`Criar Issue do GitHub`,startOver:`Recomeçar`,creatingIssueTitle:`A criar a Issue do GitHub...`,creatingIssueViaCli:`A criar a issue através da CLI do GitHub...`,issueCreated:`Issue criada`,proposeAnother:`Propor outra`,errorTitle:`Algo correu mal`,errorFallback:`Ocorreu um erro`,tryAgain:`Tentar novamente`,cancelledTitle:`Cancelado`,cancelledBody:`A proposta foi cancelada.`},n={heading:`Consciência de contexto`,custom:`Personalizado`,customMix:`Combinação personalizada — ver Ajuste fino abaixo`,estimateUnavailable:`{{tier}} · estimativa indisponível`,preset:{minimal:`Mínimo`,light:`Leve`,standard:`Padrão`,rich:`Rico`,max:`Máx`,desktop:`Desktop`},presetCost:{minimal:`custo 1× · primeiro token mais rápido · sem specs carregadas`,light:`custo 1,3× · specs do Specrails carregadas`,standard:`custo 1,6× · specs do Specrails + OpenSpec carregadas`,rich:`custo 2× · acesso de leitura a todo o repositório`,max:`custo 4× · leitura total + refinamento Contract Layer`,desktop:`custo 4–6× · todas as funcionalidades + MCPs do projeto e os seus MCPs aprovados`},smashCapable:`Compatível com SMASH`,smashHint:`O Contract Layer está ativo, por isso esta spec pode mais tarde ser decomposta em Sub-Specs.`,fineTune:`Ajuste fino`,defaultLabel:`Âmbito de contexto`,summaryMinimal:`mínimo`,tags:{specrails:`specrails`,openspec:`openspec`,codebase:`codebase`,mcp:`mcp`,myMcp:`my-mcp`,contract:`contract`},checks:{specrailsLabel:`tickets specrails`,openspecLabel:`specs openspec`,fullLabel:`Base de código completa`,mcpLabel:`MCPs do projeto`,mcpHint:`servidores .mcp.json`,userMcpLabel:`Os meus MCPs aprovados`,userMcpHint:`servidores ~/.claude`,userMcpTooltip:`Os seus servidores MCP aprovados localmente (claude mcp add)`,exploreOnly:`Apenas no modo Explore`,providerUnsupported:`Indisponível para {{provider}}`,contractLabel:`Enriquecer com Contract Layer`,contractHint:`refinamento pós-commit · ativa o SMASH`}},r={label:`Motor de IA`},i={presetHeading:`Predefinição de modelo`,preset:{balanced:{label:`Equilibrado`,description:`{{model}} para todos os agentes (recomendado)`},budget:{label:`Económico`,description:`{{model}} para todos os agentes — 3x mais barato, mais rápido`},max:{label:`Máx`,description:`{{topModel}} para arquiteto + PM, {{baseModel}} para os restantes`}},overridesHeading:`Substituições de modelo por agente`,overriddenCount:`{{count}} substituídos`,customBadge:`personalizado`,resetToDefault:`Repor a predefinição`},a={alias:`Alias no Claude Code: {{alias}}`,tier:{balanced:`Equilibrado`,mostCapable:`Mais capaz`,fastest:`Mais rápido`,frontier:`Frontier`}},o={heading:`Consciência de custos`,meterAriaLabel:`nível de custo`,estimateUnavailable:`apenas nível — estimativa indisponível`},s={heading:`Comando sugerido`,run:`Executar`,dismiss:`Dispensar`},c={serverError:`Erro do servidor ({{status}})`,connectionFailed:`Falha na ligação: {{message}}`,sendRefinementFailed:`Falha ao enviar o refinamento`,createIssueFailed:`Falha ao criar a 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:`Adicionar Spec`,dialogDescription:`Crie uma nova spec a partir de uma ideia curta, imediatamente ou através do modo Explore.`,engineAriaLabel:`Motor de IA para esta spec`,modeTablistLabel:`Modo de criação da spec`,mode:{quick:`Quick`,explore:`Explore`,raw:`Raw`,exploreHint:`interativo`,rawHint:`sem IA`,quickUnavailable:`indisponível para Kimi`},modeDescription:{quick:`Descreva a funcionalidade ou alteração. Anexe mockups, briefs ou dados para mais contexto.`,explore:`Descreva uma ideia aproximada. O assistente de IA selecionado vai ajudá-lo a dar-lhe forma através de conversa — você decide quando confirmar.`,raw:`O seu prompt, tal como está — guardado como ticket de spec. Sem IA agora; arraste-o para um rail para o construir.`},editorPlaceholder:{quick:`p. ex. Adicionar um interruptor de modo escuro à página de definições que persista a preferência do utilizador...`,explore:`p. ex. modo escuro — não sei bem onde colocar o interruptor nem como persistir a preferência…`,raw:`Descreva a funcionalidade, alteração ou ideia. Suporta Markdown, imagens e ficheiros…`},ideaAriaLabel:`Ideia da spec`,raw:{titleLabel:`Título`,titlePlaceholder:`Preenchido automaticamente a partir do seu prompt…`,priorityLabel:`Prioridade`,labelsLabel:`Etiquetas`,removeLabel:`Remover etiqueta {{label}}`,addLabelAria:`Adicionar etiqueta`,labelPlaceholder:`opcional…`,bodyAriaLabel:`Corpo da spec Raw`},priority:{critical:`Crítica`,high:`Alta`,medium:`Média`,low:`Baixa`},fromWebsite:`A partir de um website`,fromWebsiteTitle:`Abra uma página web real, selecione uma área e converta-a numa spec`,capture:{responsiveSizes_one:`Responsivo · {{count}} tamanho`,responsiveSizes_other:`Responsivo · {{count}} tamanhos`},submit:{quick:`Gerar Spec`,explore:`Continuar`,raw:`Criar`,disabledTitle:`Escreva primeiro um prompt`},toast:{createFailed:`Falha ao criar a spec`,rawSavedWithId:`Guardada como #{{id}} · Spec Raw pronta para os rails`,rawCreated:`Spec Raw criada`,exploreNotWired:`O modo Explore não está disponível nesta vista`,generating:`A gerar...`,failedToStart:`{{projectName}} · Falha ao iniciar`,unsupportedFileType:`Tipo de ficheiro não suportado: {{name}}`,uploadFailed:`Falha no carregamento de {{name}}: {{message}}`}},t={title:`Propor uma funcionalidade`,ideaIntro:`Descreva a sua ideia em linguagem simples. O Claude vai ler a base de código e estruturá-la numa proposta completa.`,ideaAriaLabel:`Ideia de funcionalidade`,ideaPlaceholder:`p. ex. Quero que os utilizadores possam definir um alerta de orçamento para serem notificados quando os custos de API excederem um limite...`,cmdEnterToSubmit:`Cmd+Enter para submeter`,exploreIdea:`Explorar ideia`,exploringTitle:`A explorar a sua ideia...`,refiningTitle:`A refinar a proposta...`,reviewTitle:`Rever proposta`,readingCodebase_one:`A ler a base de código... ({{count}} ficheiro explorado)`,readingCodebase_other:`A ler a base de código... ({{count}} ficheiros explorados)`,refinementAriaLabel:`Feedback de refinamento`,refinementPlaceholder:`Peça alterações, adicione restrições, ajuste o âmbito...`,sendRefinementTitle:`Enviar refinamento (Cmd+Enter)`,cmdEnterToSend:`Cmd+Enter para enviar`,confirmCreateIssue:`Criar uma Issue do GitHub a partir desta proposta?`,yesCreateIssue:`Sim, criar issue`,createGithubIssue:`Criar Issue do GitHub`,startOver:`Recomeçar`,creatingIssueTitle:`A criar a Issue do GitHub...`,creatingIssueViaCli:`A criar a issue através da CLI do GitHub...`,issueCreated:`Issue criada`,proposeAnother:`Propor outra`,errorTitle:`Algo correu mal`,errorFallback:`Ocorreu um erro`,tryAgain:`Tentar novamente`,cancelledTitle:`Cancelado`,cancelledBody:`A proposta foi cancelada.`},n={heading:`Consciência de contexto`,custom:`Personalizado`,customMix:`Combinação personalizada — ver Ajuste fino abaixo`,estimateUnavailable:`{{tier}} · estimativa indisponível`,preset:{minimal:`Mínimo`,light:`Leve`,standard:`Padrão`,rich:`Rico`,max:`Máx`,desktop:`Desktop`},presetCost:{minimal:`custo 1× · primeiro token mais rápido · sem specs carregadas`,light:`custo 1,3× · specs do Specrails carregadas`,standard:`custo 1,6× · specs do Specrails + OpenSpec carregadas`,rich:`custo 2× · acesso de leitura a todo o repositório`,max:`custo 4× · leitura total + refinamento Contract Layer`,desktop:`custo 4–6× · todas as funcionalidades + MCPs do projeto e os seus MCPs aprovados`},smashCapable:`Compatível com SMASH`,smashHint:`O Contract Layer está ativo, por isso esta spec pode mais tarde ser decomposta em Sub-Specs.`,fineTune:`Ajuste fino`,defaultLabel:`Âmbito de contexto`,summaryMinimal:`mínimo`,tags:{specrails:`specrails`,openspec:`openspec`,codebase:`codebase`,mcp:`mcp`,myMcp:`my-mcp`,contract:`contract`},checks:{specrailsLabel:`tickets specrails`,openspecLabel:`specs openspec`,fullLabel:`Base de código completa`,mcpLabel:`MCPs do projeto`,mcpHint:`servidores .mcp.json`,userMcpLabel:`Os meus MCPs aprovados`,userMcpHint:`servidores ~/.claude`,userMcpTooltip:`Os seus servidores MCP aprovados localmente (claude mcp add)`,exploreOnly:`Apenas no modo Explore`,providerUnsupported:`Indisponível para {{provider}}`,contractLabel:`Enriquecer com Contract Layer`,contractHint:`refinamento pós-commit · ativa o SMASH`}},r={label:`Motor de IA`,notSignedIn:`Sem sessão iniciada`},i={presetHeading:`Predefinição de modelo`,preset:{balanced:{label:`Equilibrado`,description:`{{model}} para todos os agentes (recomendado)`},budget:{label:`Económico`,description:`{{model}} para todos os agentes — 3x mais barato, mais rápido`},max:{label:`Máx`,description:`{{topModel}} para arquiteto + PM, {{baseModel}} para os restantes`}},overridesHeading:`Substituições de modelo por agente`,overriddenCount:`{{count}} substituídos`,customBadge:`personalizado`,resetToDefault:`Repor a predefinição`},a={alias:`Alias no Claude Code: {{alias}}`,tier:{balanced:`Equilibrado`,mostCapable:`Mais capaz`,fastest:`Mais rápido`,frontier:`Frontier`}},o={heading:`Consciência de custos`,meterAriaLabel:`nível de custo`,estimateUnavailable:`apenas nível — estimativa indisponível`},s={heading:`Comando sugerido`,run:`Executar`,dismiss:`Dispensar`},c={serverError:`Erro do servidor ({{status}})`,connectionFailed:`Falha na ligação: {{message}}`,sendRefinementFailed:`Falha ao enviar o refinamento`,createIssueFailed:`Falha ao criar a 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:`スペックを追加`,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
|
|
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};
|