specrails-desktop 2.64.1 → 2.65.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/README.md +1 -1
- package/cli/dist/status.js +3 -0
- package/client/dist/assets/ActivityFeedPage-ByVKYII-.js +1 -0
- package/client/dist/assets/AgentBrowserCapture-BGUTjhUr.js +1 -0
- package/client/dist/assets/AgentModeAnalyticsPane-CtOLDDjB.js +2 -0
- package/client/dist/assets/AgentModeCodePane-CDhUKarT.js +2 -0
- package/client/dist/assets/AgentModeJobsPane-BAa_oEHJ.js +1 -0
- package/client/dist/assets/AgentsPage-D32hG4Ve.js +120 -0
- package/client/dist/assets/AnalyticsPage-BU50zeG6.js +5 -0
- package/client/dist/assets/BudgetCard-DP_jxwaD.js +55 -0
- package/client/dist/assets/CodePage-jiYnKGpp.js +3 -0
- package/client/dist/assets/CostValue-Bvn8674q.js +1 -0
- package/client/dist/assets/DesktopAnalyticsPage-CF__H4e3.js +1 -0
- package/client/dist/assets/DocView-RrAp70zp.js +11 -0
- package/client/dist/assets/DocsDialog-DkqHU-JF.js +1 -0
- package/client/dist/assets/DocsPage-C6X089zC.js +1 -0
- package/client/dist/assets/ExportDropdown-C5-o8y3K.js +1 -0
- package/client/dist/assets/HelpHint-Crf9_uoR.js +1 -0
- package/client/dist/assets/IntegrationsPage-aflU3KHK.js +1 -0
- package/client/dist/assets/InteractiveJobComposer-CEMMhyyJ.js +19 -0
- package/client/dist/assets/JobDetailModal-BVJ6hyRs.js +1 -0
- package/client/dist/assets/JobDetailPage-DHzBUmox.js +1 -0
- package/client/dist/assets/JobsPage-o-LAqkwC.js +1 -0
- package/client/dist/assets/LoopBuilderPage-DbSVmXBM.js +1 -0
- package/client/dist/assets/LoopPreviewModal-DbJcVyN1.js +1 -0
- package/client/dist/assets/{LoopWindowSurface-DE0v2K1p.js → LoopWindowSurface-Co1ZK26V.js} +1 -1
- package/client/dist/assets/LoopsPage-C4lgkPXB.js +2 -0
- package/client/dist/assets/MinimizedChatsContext-742ypO8n.js +1 -0
- package/client/dist/assets/PluginsPage-Acks9ges.js +2 -0
- package/client/dist/assets/RailTrack-BfLmBzBh.js +1 -0
- package/client/dist/assets/{RepositoryScopeSelector-2eSqR9WK.js → RepositoryScopeSelector-DcxbKI9w.js} +1 -1
- package/client/dist/assets/ReviewPacketPage-CAVSIOAJ.js +7 -0
- package/client/dist/assets/TemplatePreviewModal-C23SYCTm.js +1 -0
- package/client/dist/assets/TicketDetailModalContext-B-Gtm6Ob.js +23 -0
- package/client/dist/assets/Trans-C6J0cLyh.js +1 -0
- package/client/dist/assets/a11y-prefs-BqoP5goK.js +1 -0
- package/client/dist/assets/activity-BBWfoUOG.js +1 -0
- package/client/dist/assets/activity-BM_skann.js +1 -0
- package/client/dist/assets/activity-Cevl82ke.js +1 -0
- package/client/dist/assets/activity-CmACk5W5.js +1 -0
- package/client/dist/assets/activity-D9LBw3PQ.js +1 -0
- package/client/dist/assets/activity-Dspbb9lz.js +1 -0
- package/client/dist/assets/activity-FPjYIjv9.js +1 -0
- package/client/dist/assets/activity-nLCKMUKt.js +1 -0
- package/client/dist/assets/addspec-BI4jDMhA.js +1 -0
- package/client/dist/assets/addspec-BldTv7Tl.js +1 -0
- package/client/dist/assets/addspec-Cdq-2EcC.js +1 -0
- package/client/dist/assets/addspec-DH5M16BQ.js +1 -0
- package/client/dist/assets/addspec-DOFo9pD5.js +1 -0
- package/client/dist/assets/addspec-DPkwhdmL.js +1 -0
- package/client/dist/assets/addspec-Dzy12Pv3.js +1 -0
- package/client/dist/assets/addspec-skTs6EEW.js +1 -0
- package/client/dist/assets/agent-B_UEUy7Y.js +1 -0
- package/client/dist/assets/agent-BarjlhTA.js +1 -0
- package/client/dist/assets/agent-BfqIITo5.js +1 -0
- package/client/dist/assets/agent-Bt9a7Kyj.js +1 -0
- package/client/dist/assets/agent-C3689RwP.js +1 -0
- package/client/dist/assets/agent-CrmboTAi.js +1 -0
- package/client/dist/assets/agent-DcsoTnuE.js +1 -0
- package/client/dist/assets/agent-GDZoYwd4.js +1 -0
- package/client/dist/assets/{agentRuntime-es2ymSl-.js → agentRuntime-BYH70bKY.js} +1 -1
- package/client/dist/assets/agentRuntime-BijLh8I9.js +1 -0
- package/client/dist/assets/{agentRuntime-BzuwQQgn.js → agentRuntime-BvyuETPe.js} +1 -1
- package/client/dist/assets/{agentRuntime-BDvbJMmS.js → agentRuntime-C2WI6HQh.js} +1 -1
- package/client/dist/assets/{agentRuntime-BKJfv5YD.js → agentRuntime-CZPIlQsr.js} +1 -1
- package/client/dist/assets/{agentRuntime-DiCldqGG.js → agentRuntime-D2dDvCyJ.js} +1 -1
- package/client/dist/assets/agentRuntime-DWZedEbn.js +1 -0
- package/client/dist/assets/agentRuntime-DkIruUNw.js +1 -0
- package/client/dist/assets/agents-35_PDKx9.js +1 -0
- package/client/dist/assets/agents-8fZnHhEQ.js +1 -0
- package/client/dist/assets/agents-Bgimtw8z.js +1 -0
- package/client/dist/assets/agents-C4P160Us.js +1 -0
- package/client/dist/assets/agents-Clg67zbp.js +1 -0
- package/client/dist/assets/agents-DJfF4o6G.js +1 -0
- package/client/dist/assets/agents-Dc9-Y5cw.js +1 -0
- package/client/dist/assets/agents-EN1Zl4YZ.js +1 -0
- package/client/dist/assets/agentstudio-Bm4-NYaG.js +1 -0
- package/client/dist/assets/agentstudio-CD1fuj2o.js +1 -0
- package/client/dist/assets/agentstudio-CQGWFSst.js +1 -0
- package/client/dist/assets/agentstudio-CqVSb65S.js +1 -0
- package/client/dist/assets/agentstudio-DIE_HjsX.js +1 -0
- package/client/dist/assets/agentstudio-D_OmQK-k.js +1 -0
- package/client/dist/assets/agentstudio-Djz9aUfb.js +1 -0
- package/client/dist/assets/agentstudio-Qa3v9o5J.js +1 -0
- package/client/dist/assets/{aiedit-DNXxq_Dr.js → aiedit-1VzLs37W.js} +1 -1
- package/client/dist/assets/{aiedit-DCjA7jLJ.js → aiedit-BNp6GSik.js} +1 -1
- package/client/dist/assets/{aiedit-BoG24nlg.js → aiedit-BOY5xRPi.js} +1 -1
- package/client/dist/assets/{aiedit-iIjz2_Qk.js → aiedit-BrqMZvbc.js} +1 -1
- package/client/dist/assets/{aiedit-CjlSRQVP.js → aiedit-CVgtl7hm.js} +1 -1
- package/client/dist/assets/{aiedit-DQ-0_pvE.js → aiedit-CrFW9Jd2.js} +1 -1
- package/client/dist/assets/{aiedit-olnv3QSt.js → aiedit-YE2lILp7.js} +1 -1
- package/client/dist/assets/{aiedit-B0KUbpB6.js → aiedit-iA_R1AVQ.js} +1 -1
- package/client/dist/assets/analytics-3w0t-4ic.js +1 -0
- package/client/dist/assets/analytics-BRi4KQD6.js +1 -0
- package/client/dist/assets/analytics-BtjAqzke.js +1 -0
- package/client/dist/assets/analytics-COSQ1h47.js +1 -0
- package/client/dist/assets/analytics-CP2HjESk.js +1 -0
- package/client/dist/assets/analytics-DY65TC62.js +1 -0
- package/client/dist/assets/analytics-Den_vvxn.js +1 -0
- package/client/dist/assets/analytics-LmBS96O8.js +1 -0
- package/client/dist/assets/api-DOGbyfTO.js +2 -0
- package/client/dist/assets/builder-BMVvSr4v.js +1 -0
- package/client/dist/assets/builder-BN-MuLZt.js +1 -0
- package/client/dist/assets/builder-BQOZi4CF.js +1 -0
- package/client/dist/assets/builder-BjUPjsyu.js +1 -0
- package/client/dist/assets/builder-BoBtN18T.js +1 -0
- package/client/dist/assets/builder-C5g5NhxL.js +1 -0
- package/client/dist/assets/builder-RUHXw3yx.js +1 -0
- package/client/dist/assets/builder-fyS_AiyC.js +1 -0
- package/client/dist/assets/button-CHPkroew.js +1 -0
- package/client/dist/assets/chat-C9L5T7KI.js +1 -0
- package/client/dist/assets/chevron-right-CwMAj0w_.js +1 -0
- package/client/dist/assets/chevron-up-BAMuP0XD.js +1 -0
- package/client/dist/assets/chunk-OB3PAWPO-BBaq6pUk.js +3 -0
- package/client/dist/assets/code-4le5IIbf.js +1 -0
- package/client/dist/assets/code-B-jCVIbm.js +1 -0
- package/client/dist/assets/code-BRfrn5ix.js +1 -0
- package/client/dist/assets/code-CC9NCrDM.js +1 -0
- package/client/dist/assets/code-CK6pm8wY.js +1 -0
- package/client/dist/assets/code-DDiOzd6c.js +1 -0
- package/client/dist/assets/code-tGifiyf5.js +1 -0
- package/client/dist/assets/code-xkn8kQTg.js +1 -0
- package/client/dist/assets/commands-Bv1QshHR.js +1 -0
- package/client/dist/assets/commands-BvxTxboW.js +1 -0
- package/client/dist/assets/commands-C5ORR0fO.js +1 -0
- package/client/dist/assets/commands-CBKMFSTV.js +1 -0
- package/client/dist/assets/commands-CFJIRsJv.js +1 -0
- package/client/dist/assets/commands-D9o3ZcXl.js +1 -0
- package/client/dist/assets/commands-DNox0Edk.js +1 -0
- package/client/dist/assets/commands-DmIUMLdV.js +1 -0
- package/client/dist/assets/common-5H4TkaoI.js +1 -0
- package/client/dist/assets/common-9S3OdPjx.js +1 -0
- package/client/dist/assets/common-BqnwIcjs.js +1 -0
- package/client/dist/assets/common-CQP3VafS.js +1 -0
- package/client/dist/assets/common-CZnAfkB2.js +1 -0
- package/client/dist/assets/common-D5sNttV4.js +1 -0
- package/client/dist/assets/common-k_qX9nlv.js +1 -0
- package/client/dist/assets/common-s4HIi9XI.js +1 -0
- package/client/dist/assets/compass-B7guwBlY.js +1 -0
- package/client/dist/assets/confirm-dialog-ChZdHL3Q.js +1 -0
- package/client/dist/assets/copy-DOPlLymH.js +1 -0
- package/client/dist/assets/core-BozBzB6Y.js +1 -0
- package/client/dist/assets/dashboard-6zGLGcEz.js +1 -0
- package/client/dist/assets/dashboard-8Gi0FBDq.js +1 -0
- package/client/dist/assets/dashboard-B7E5YrSy.js +1 -0
- package/client/dist/assets/dashboard-BhdKV8xK.js +1 -0
- package/client/dist/assets/dashboard-Bu3zzH_s.js +1 -0
- package/client/dist/assets/dashboard-Ce_6rELA.js +1 -0
- package/client/dist/assets/dashboard-DWY-oz8P.js +1 -0
- package/client/dist/assets/dashboard-gUzlWk0o.js +1 -0
- package/client/dist/assets/date-input-Cdlr8kHz.js +1 -0
- package/client/dist/assets/dialog-C23lB2iP.js +5 -0
- package/client/dist/assets/dist-Di-oOFkX.js +1 -0
- package/client/dist/assets/dist-js-CBmS6MsJ.js +1 -0
- package/client/dist/assets/{dist-js-Rlh4FLH5.js → dist-js-DaJmKapi.js} +1 -1
- package/client/dist/assets/dropdown-menu-Bfp2CK6H.js +1 -0
- package/client/dist/assets/empty-state-D5w9OWj-.js +1 -0
- package/client/dist/assets/es2015-DfnECntk.js +41 -0
- package/client/dist/assets/esm-BKF6CE7v.js +1 -0
- package/client/dist/assets/event-BEnMLqAi.js +1 -0
- package/client/dist/assets/explore--NOz9LCN.js +1 -0
- package/client/dist/assets/explore-B2ulH6dO.js +1 -0
- package/client/dist/assets/explore-BD-QiLdg.js +1 -0
- package/client/dist/assets/explore-BOqd4_1j.js +1 -0
- package/client/dist/assets/explore-Be_Zh5zu.js +1 -0
- package/client/dist/assets/explore-CLjzPSKo.js +1 -0
- package/client/dist/assets/explore-D_-vHm29.js +1 -0
- package/client/dist/assets/explore-yEQTF6ro.js +1 -0
- package/client/dist/assets/file-text-CNXzL3wj.js +1 -0
- package/client/dist/assets/format-BODoFIw6.js +1 -0
- package/client/dist/assets/formatDistanceToNow-DLMIOS0N.js +1 -0
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-O61feXch.js +1 -0
- package/client/dist/assets/git-compare-arrows-Cu6tICCq.js +1 -0
- package/client/dist/assets/humanise-command-CB4ybLwq.js +1 -0
- package/client/dist/assets/inbox-BLZ8cm6_.js +1 -0
- package/client/dist/assets/inbox-BQ3VmNYY.js +1 -0
- package/client/dist/assets/inbox-BdcXWCuT.js +1 -0
- package/client/dist/assets/inbox-CF1PHjns.js +1 -0
- package/client/dist/assets/inbox-CFNPDhso.js +1 -0
- package/client/dist/assets/inbox-DIttK_NW.js +1 -0
- package/client/dist/assets/inbox-Dfdv1Ykl.js +1 -0
- package/client/dist/assets/inbox-JS1inmeO.js +1 -0
- package/client/dist/assets/index-4UWY7Xyz.css +2 -0
- package/client/dist/assets/index-DHzB0T26.js +120 -0
- package/client/dist/assets/integrations-BcKgzgPD.js +1 -0
- package/client/dist/assets/integrations-BmX_XyJq.js +1 -0
- package/client/dist/assets/integrations-CHpwMjlY.js +1 -0
- package/client/dist/assets/integrations-CT3kr8e-.js +1 -0
- package/client/dist/assets/integrations-C_5XAkgz.js +1 -0
- package/client/dist/assets/integrations-Ct9zLX7N.js +1 -0
- package/client/dist/assets/integrations-DEYemxUv.js +1 -0
- package/client/dist/assets/integrations-DWvsB_WB.js +1 -0
- package/client/dist/assets/{jira-Cq6yvN4q.js → jira-B_ERkFRv.js} +1 -1
- package/client/dist/assets/jira-Bn-A5lwD.js +1 -0
- package/client/dist/assets/jira-C71Ybnhp.js +1 -0
- package/client/dist/assets/jira-CkwjeJz6.js +1 -0
- package/client/dist/assets/jira-D9pSLXjI.js +1 -0
- package/client/dist/assets/jira-DBRS_lcp.js +1 -0
- package/client/dist/assets/jira-DHS6CsKh.js +1 -0
- package/client/dist/assets/jira-MInHRUb1.js +1 -0
- package/client/dist/assets/jira-api-DHme7Upx.js +1 -0
- package/client/dist/assets/jobs-BMLTDo63.js +1 -0
- package/client/dist/assets/jobs-BO8q4Mi1.js +1 -0
- package/client/dist/assets/jobs-Ck8uOWMM.js +1 -0
- package/client/dist/assets/jobs-CyFfPCpg.js +1 -0
- package/client/dist/assets/jobs-DT5s4fZ6.js +1 -0
- package/client/dist/assets/jobs-DZAgVPcD.js +1 -0
- package/client/dist/assets/jobs-b5gPYaKr.js +1 -0
- package/client/dist/assets/jobs-xsZK1440.js +1 -0
- package/client/dist/assets/launch-forecast-BTa-p3RP.js +1 -0
- package/client/dist/assets/{loop-layout-DtxX27Jz.css → loop-layout-DLioOiRN.css} +1 -1
- package/client/dist/assets/loop-layout-Sl9cfTvs.js +7 -0
- package/client/dist/assets/loops-BEEOVJDR.js +1 -0
- package/client/dist/assets/loops-BcrQ2vk7.js +1 -0
- package/client/dist/assets/loops-BjWxzJIZ.js +1 -0
- package/client/dist/assets/loops-BogV595N.js +1 -0
- package/client/dist/assets/loops-CU0BLZiz.js +1 -0
- package/client/dist/assets/loops-CrNBgi1G.js +1 -0
- package/client/dist/assets/loops-CwalwS_i.js +1 -0
- package/client/dist/assets/loops-_TDVN-fX.js +1 -0
- package/client/dist/assets/mcp-BNs8gxoL.js +1 -0
- package/client/dist/assets/mcp-BvRh_xO5.js +1 -0
- package/client/dist/assets/mcp-C2F1pghi.js +1 -0
- package/client/dist/assets/mcp-D9RLKAs2.js +1 -0
- package/client/dist/assets/mcp-DAghcsR0.js +1 -0
- package/client/dist/assets/mcp-DWWAPi1G.js +1 -0
- package/client/dist/assets/mcp-DbGSFC3f.js +1 -0
- package/client/dist/assets/mcp-FelCicrv.js +1 -0
- package/client/dist/assets/narration-C3NBkAR4.js +1 -0
- package/client/dist/assets/narration-CkoJq-Lf.js +1 -0
- package/client/dist/assets/narration-Cr0NeW9K.js +1 -0
- package/client/dist/assets/narration-DJUXOs-W.js +1 -0
- package/client/dist/assets/narration-DgL8TMvN.js +1 -0
- package/client/dist/assets/narration-DjBafgv0.js +1 -0
- package/client/dist/assets/narration-Dle6Iv0c.js +1 -0
- package/client/dist/assets/narration-MYlfktga.js +1 -0
- package/client/dist/assets/nav-BSQ8KW1c.js +1 -0
- package/client/dist/assets/nav-BauVof8Z.js +1 -0
- package/client/dist/assets/nav-BfOAH1se.js +1 -0
- package/client/dist/assets/nav-D3bOsipX.js +1 -0
- package/client/dist/assets/nav-DOMMhlLx.js +1 -0
- package/client/dist/assets/nav-DPzVlgZU.js +1 -0
- package/client/dist/assets/nav-DZJbFbah.js +1 -0
- package/client/dist/assets/nav-D_5aojd2.js +1 -0
- package/client/dist/assets/notify-error-BsWANx1T.js +1 -0
- package/client/dist/assets/onboarding-BdZQnNm3.js +1 -0
- package/client/dist/assets/onboarding-CJQEv1vp.js +1 -0
- package/client/dist/assets/onboarding-CWJGYUW3.js +1 -0
- package/client/dist/assets/onboarding-ChfYN7dA.js +1 -0
- package/client/dist/assets/onboarding-CjvDUR3V.js +1 -0
- package/client/dist/assets/onboarding-I6vS-zTB.js +1 -0
- package/client/dist/assets/onboarding-dgC_9dTB.js +1 -0
- package/client/dist/assets/onboarding-mlXSyKzX.js +1 -0
- package/client/dist/assets/origin-03nTuaOb.js +1 -0
- package/client/dist/assets/packet-BjpyRnZr.js +1 -0
- package/client/dist/assets/packet-BwgG5mBt.js +1 -0
- package/client/dist/assets/packet-C3eAUFkV.js +1 -0
- package/client/dist/assets/packet-C8wZuSld.js +1 -0
- package/client/dist/assets/packet-CNXEy_85.js +1 -0
- package/client/dist/assets/packet-DsV5Aa_8.js +1 -0
- package/client/dist/assets/packet-aasskOE7.js +1 -0
- package/client/dist/assets/packet-phxCc2gJ.js +1 -0
- package/client/dist/assets/page-header-BStSHkP8.js +1 -0
- package/client/dist/assets/project-repositories-DJPeAVBK.js +1 -0
- package/client/dist/assets/{provider-capabilities-lePfeT_Y.js → provider-capabilities-DtwcTme4.js} +1 -1
- package/client/dist/assets/recovery-BPDOsC92.js +1 -0
- package/client/dist/assets/recovery-BluNHoXM.js +1 -0
- package/client/dist/assets/recovery-CRvEmB0C.js +1 -0
- package/client/dist/assets/recovery-CeIoRnkR.js +1 -0
- package/client/dist/assets/recovery-DHCo8KGi.js +1 -0
- package/client/dist/assets/recovery-OxAIpbBF.js +1 -0
- package/client/dist/assets/recovery-XXexYGOJ.js +1 -0
- package/client/dist/assets/recovery-pITlc--v.js +1 -0
- package/client/dist/assets/refresh-cw-DfyTkbsf.js +1 -0
- package/client/dist/assets/select-xA3pSmqE.js +1 -0
- package/client/dist/assets/settings--yzDbX9r.js +1 -0
- package/client/dist/assets/settings-5_heTv8s.js +1 -0
- package/client/dist/assets/settings-BSf27MDg.js +1 -0
- package/client/dist/assets/settings-BSj6FakR.js +1 -0
- package/client/dist/assets/settings-BZDo_8Nn.js +1 -0
- package/client/dist/assets/settings-BdWgmNc0.js +1 -0
- package/client/dist/assets/settings-DRouxKqb.js +1 -0
- package/client/dist/assets/settings-DnWFoY-F.js +1 -0
- package/client/dist/assets/setup-BJWy62ri.js +1 -0
- package/client/dist/assets/setup-BgKOIuzc.js +1 -0
- package/client/dist/assets/setup-BvVIyUlz.js +1 -0
- package/client/dist/assets/setup-BxCk2pe1.js +1 -0
- package/client/dist/assets/setup-C-xQTL7R.js +1 -0
- package/client/dist/assets/setup-CbaVoiwV.js +1 -0
- package/client/dist/assets/setup-DxTBkX3P.js +1 -0
- package/client/dist/assets/setup-oGoVAzOD.js +1 -0
- package/client/dist/assets/specs-7tAb4IKr.js +1 -0
- package/client/dist/assets/specs-BUcY4s5v.js +1 -0
- package/client/dist/assets/specs-Bk5LeBAA.js +1 -0
- package/client/dist/assets/specs-CAA4Lrlg.js +1 -0
- package/client/dist/assets/specs-CS091AnA.js +1 -0
- package/client/dist/assets/specs-DJ6gmFcK.js +1 -0
- package/client/dist/assets/specs-GfCcrBSC.js +1 -0
- package/client/dist/assets/specs-xQgyc7WL.js +1 -0
- package/client/dist/assets/spending-CVH8VREb.js +1 -0
- package/client/dist/assets/square-Co6h5vZg.js +1 -0
- package/client/dist/assets/tauri-shell-43ixPGfa.js +2 -0
- package/client/dist/assets/terminal-0v9sBylD.js +1 -0
- package/client/dist/assets/terminal-AbUAmCxE.js +1 -0
- package/client/dist/assets/terminal-BJayIbIP.js +1 -0
- package/client/dist/assets/terminal-C2RUlXyi.js +1 -0
- package/client/dist/assets/terminal-CMmSb_Nj.js +1 -0
- package/client/dist/assets/terminal-DKWjj7HJ.js +1 -0
- package/client/dist/assets/terminal-KlFu7_pV.js +1 -0
- package/client/dist/assets/terminal-i99yqFvm.js +1 -0
- package/client/dist/assets/tickets-846Oq3i3.js +1 -0
- package/client/dist/assets/tickets-B5LJTe_b.js +1 -0
- package/client/dist/assets/tickets-Bfo2GGmH.js +1 -0
- package/client/dist/assets/tickets-BhdZ1yY2.js +1 -0
- package/client/dist/assets/tickets-CgjWJHAW.js +1 -0
- package/client/dist/assets/tickets-Ct9DbDUR.js +1 -0
- package/client/dist/assets/tickets-rptLEJB1.js +1 -0
- package/client/dist/assets/tickets-xQ6DpYdu.js +1 -0
- package/client/dist/assets/trending-up-BGvb4zZt.js +1 -0
- package/client/dist/assets/undo-6zuS4-sL.js +1 -0
- package/client/dist/assets/undo-BeM4gDOP.js +1 -0
- package/client/dist/assets/undo-BeppX8xS.js +1 -0
- package/client/dist/assets/undo-BqvNZ5MG.js +1 -0
- package/client/dist/assets/undo-BzwEPf_k.js +1 -0
- package/client/dist/assets/undo-CJ9Cu1NN.js +1 -0
- package/client/dist/assets/undo-ds8nMFbX.js +1 -0
- package/client/dist/assets/undo-x_gA-knG.js +1 -0
- package/client/dist/assets/useDesktop-BuOp2-MR.js +1 -0
- package/client/dist/assets/useRuntimeRuns-BRS6ncnO.js +1 -0
- package/client/dist/assets/utils-ELimjS2Y.js +1 -0
- package/client/dist/assets/wrench-Br2n1Lxd.js +1 -0
- package/client/dist/index.html +75 -60
- package/docs/ci-cd.md +29 -1
- package/docs/cli.md +10 -31
- package/docs/codex.md +1 -1
- package/docs/creating-specs.md +15 -12
- package/docs/customizing.md +16 -13
- package/docs/getting-started.md +12 -11
- package/docs/guide/de/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/de/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/de/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/de/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/de/getting-started/6-universal-search.md +34 -0
- package/docs/guide/de/insights/1-analytics-and-cost-tracking.md +20 -6
- package/docs/guide/de/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/de/insights/3-code-explorer.md +1 -1
- package/docs/guide/de/integrations/1-ai-providers.md +1 -1
- package/docs/guide/de/integrations/2-plugins.md +1 -1
- package/docs/guide/de/integrations/3-jira-integration.md +3 -3
- package/docs/guide/de/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/de/integrations/5-mcp-server.md +1 -1
- package/docs/guide/de/integrations/6-agent-chat.md +12 -5
- package/docs/guide/de/integrations/8-flow-mode.md +69 -0
- package/docs/guide/de/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/de/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/de/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/de/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/de/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/de/settings/1-themes.md +1 -1
- package/docs/guide/de/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/de/settings/5-project-environment.md +1 -1
- package/docs/guide/de/settings/6-updates.md +24 -0
- package/docs/guide/de/settings/7-existing-projects.md +33 -0
- package/docs/guide/de/settings/8-accessibility.md +23 -0
- package/docs/guide/de/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/de/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/de/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/en/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/en/getting-started/1-what-is-specrails.md +1 -1
- package/docs/guide/en/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/en/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/en/getting-started/5-the-dashboard-tour.md +52 -0
- package/docs/guide/en/getting-started/6-universal-search.md +34 -0
- package/docs/guide/en/insights/1-analytics-and-cost-tracking.md +24 -10
- package/docs/guide/en/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/en/insights/3-code-explorer.md +5 -5
- package/docs/guide/en/integrations/1-ai-providers.md +1 -1
- package/docs/guide/en/integrations/2-plugins.md +1 -1
- package/docs/guide/en/integrations/3-jira-integration.md +4 -4
- package/docs/guide/en/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/en/integrations/5-mcp-server.md +4 -4
- package/docs/guide/en/integrations/6-agent-chat.md +12 -5
- package/docs/guide/en/integrations/8-flow-mode.md +69 -0
- package/docs/guide/en/pipeline/1-rails-and-jobs.md +22 -3
- package/docs/guide/en/pipeline/2-the-job-detail-view.md +19 -7
- package/docs/guide/en/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/en/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/en/pipeline/5-the-loop-builder.md +2 -2
- package/docs/guide/en/settings/1-themes.md +1 -1
- package/docs/guide/en/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/en/settings/5-project-environment.md +1 -1
- package/docs/guide/en/settings/6-updates.md +24 -0
- package/docs/guide/en/settings/7-existing-projects.md +33 -0
- package/docs/guide/en/settings/8-accessibility.md +23 -0
- package/docs/guide/en/specs/1-specs-and-the-backlog.md +42 -6
- package/docs/guide/en/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/en/specs/3-add-spec-explore-mode.md +2 -2
- package/docs/guide/es/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/es/agents/2-profiles-and-the-balanced-default.md +1 -1
- package/docs/guide/es/agents/3-customizing-models-per-agent.md +2 -2
- package/docs/guide/es/agents/4-custom-agents-catalog.md +1 -1
- package/docs/guide/es/getting-started/1-what-is-specrails.md +3 -3
- package/docs/guide/es/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/es/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/es/getting-started/5-the-dashboard-tour.md +52 -0
- package/docs/guide/es/getting-started/6-universal-search.md +34 -0
- package/docs/guide/es/insights/1-analytics-and-cost-tracking.md +26 -12
- package/docs/guide/es/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/es/insights/3-code-explorer.md +5 -5
- package/docs/guide/es/integrations/1-ai-providers.md +1 -1
- package/docs/guide/es/integrations/2-plugins.md +1 -1
- package/docs/guide/es/integrations/3-jira-integration.md +4 -4
- package/docs/guide/es/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/es/integrations/5-mcp-server.md +4 -4
- package/docs/guide/es/integrations/6-agent-chat.md +14 -7
- package/docs/guide/es/integrations/7-local-engines.md +1 -1
- package/docs/guide/es/integrations/8-flow-mode.md +69 -0
- package/docs/guide/es/pipeline/1-rails-and-jobs.md +33 -13
- package/docs/guide/es/pipeline/2-the-job-detail-view.md +38 -26
- package/docs/guide/es/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/es/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/es/pipeline/5-the-loop-builder.md +4 -4
- package/docs/guide/es/settings/1-themes.md +1 -1
- package/docs/guide/es/settings/3-pipeline-telemetry-and-diagnostics.md +10 -10
- package/docs/guide/es/settings/5-project-environment.md +1 -1
- package/docs/guide/es/settings/6-updates.md +24 -0
- package/docs/guide/es/settings/7-existing-projects.md +33 -0
- package/docs/guide/es/settings/8-accessibility.md +23 -0
- package/docs/guide/es/specs/1-specs-and-the-backlog.md +43 -7
- package/docs/guide/es/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/es/specs/3-add-spec-explore-mode.md +3 -3
- package/docs/guide/fr/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/fr/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/fr/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/fr/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/fr/getting-started/6-universal-search.md +34 -0
- package/docs/guide/fr/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/fr/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/fr/insights/3-code-explorer.md +1 -1
- package/docs/guide/fr/integrations/1-ai-providers.md +1 -1
- package/docs/guide/fr/integrations/2-plugins.md +1 -1
- package/docs/guide/fr/integrations/3-jira-integration.md +3 -3
- package/docs/guide/fr/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/fr/integrations/5-mcp-server.md +1 -1
- package/docs/guide/fr/integrations/6-agent-chat.md +11 -4
- package/docs/guide/fr/integrations/8-flow-mode.md +69 -0
- package/docs/guide/fr/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/fr/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/fr/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/fr/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/fr/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/fr/settings/1-themes.md +1 -1
- package/docs/guide/fr/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/fr/settings/5-project-environment.md +1 -1
- package/docs/guide/fr/settings/6-updates.md +24 -0
- package/docs/guide/fr/settings/7-existing-projects.md +33 -0
- package/docs/guide/fr/settings/8-accessibility.md +23 -0
- package/docs/guide/fr/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/fr/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/fr/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/it/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/it/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/it/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/it/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/it/getting-started/6-universal-search.md +34 -0
- package/docs/guide/it/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/it/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/it/insights/3-code-explorer.md +1 -1
- package/docs/guide/it/integrations/1-ai-providers.md +1 -1
- package/docs/guide/it/integrations/2-plugins.md +1 -1
- package/docs/guide/it/integrations/3-jira-integration.md +3 -3
- package/docs/guide/it/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/it/integrations/5-mcp-server.md +1 -1
- package/docs/guide/it/integrations/6-agent-chat.md +11 -4
- package/docs/guide/it/integrations/8-flow-mode.md +69 -0
- package/docs/guide/it/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/it/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/it/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/it/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/it/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/it/settings/1-themes.md +1 -1
- package/docs/guide/it/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/it/settings/5-project-environment.md +1 -1
- package/docs/guide/it/settings/6-updates.md +24 -0
- package/docs/guide/it/settings/7-existing-projects.md +33 -0
- package/docs/guide/it/settings/8-accessibility.md +23 -0
- package/docs/guide/it/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/it/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/it/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/ja/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/ja/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/ja/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/ja/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/ja/getting-started/6-universal-search.md +34 -0
- package/docs/guide/ja/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/ja/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/ja/insights/3-code-explorer.md +1 -1
- package/docs/guide/ja/integrations/1-ai-providers.md +1 -1
- package/docs/guide/ja/integrations/2-plugins.md +1 -1
- package/docs/guide/ja/integrations/3-jira-integration.md +3 -3
- package/docs/guide/ja/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/ja/integrations/5-mcp-server.md +1 -1
- package/docs/guide/ja/integrations/6-agent-chat.md +11 -4
- package/docs/guide/ja/integrations/8-flow-mode.md +69 -0
- package/docs/guide/ja/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/ja/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/ja/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/ja/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/ja/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/ja/settings/1-themes.md +1 -1
- package/docs/guide/ja/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/ja/settings/5-project-environment.md +1 -1
- package/docs/guide/ja/settings/6-updates.md +24 -0
- package/docs/guide/ja/settings/7-existing-projects.md +33 -0
- package/docs/guide/ja/settings/8-accessibility.md +23 -0
- package/docs/guide/ja/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/ja/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/ja/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/pt/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/pt/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/pt/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/pt/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/pt/getting-started/6-universal-search.md +34 -0
- package/docs/guide/pt/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/pt/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/pt/insights/3-code-explorer.md +1 -1
- package/docs/guide/pt/integrations/1-ai-providers.md +1 -1
- package/docs/guide/pt/integrations/2-plugins.md +1 -1
- package/docs/guide/pt/integrations/3-jira-integration.md +3 -3
- package/docs/guide/pt/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/pt/integrations/5-mcp-server.md +1 -1
- package/docs/guide/pt/integrations/6-agent-chat.md +12 -5
- package/docs/guide/pt/integrations/8-flow-mode.md +69 -0
- package/docs/guide/pt/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/pt/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/pt/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/pt/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/pt/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/pt/settings/1-themes.md +1 -1
- package/docs/guide/pt/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/pt/settings/5-project-environment.md +1 -1
- package/docs/guide/pt/settings/6-updates.md +24 -0
- package/docs/guide/pt/settings/7-existing-projects.md +33 -0
- package/docs/guide/pt/settings/8-accessibility.md +23 -0
- package/docs/guide/pt/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/pt/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/pt/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/zh/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/zh/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/zh/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/zh/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/zh/getting-started/6-universal-search.md +34 -0
- package/docs/guide/zh/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/zh/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/zh/insights/3-code-explorer.md +1 -1
- package/docs/guide/zh/integrations/1-ai-providers.md +1 -1
- package/docs/guide/zh/integrations/2-plugins.md +1 -1
- package/docs/guide/zh/integrations/3-jira-integration.md +3 -3
- package/docs/guide/zh/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/zh/integrations/5-mcp-server.md +1 -1
- package/docs/guide/zh/integrations/6-agent-chat.md +11 -4
- package/docs/guide/zh/integrations/8-flow-mode.md +69 -0
- package/docs/guide/zh/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/zh/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/zh/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/zh/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/zh/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/zh/settings/1-themes.md +1 -1
- package/docs/guide/zh/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/zh/settings/5-project-environment.md +1 -1
- package/docs/guide/zh/settings/6-updates.md +24 -0
- package/docs/guide/zh/settings/7-existing-projects.md +33 -0
- package/docs/guide/zh/settings/8-accessibility.md +23 -0
- package/docs/guide/zh/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/zh/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/zh/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/internals/README.md +8 -0
- package/docs/internals/adding-a-provider.md +19 -2
- package/docs/internals/agent-actions-audit.md +101 -0
- package/docs/internals/agent-sessions.md +36 -1
- package/docs/internals/api-reference.md +190 -45
- package/docs/internals/architecture.md +53 -47
- package/docs/internals/companion-inbox-decisions.md +42 -0
- package/docs/internals/companion-rails-as-loops-contract.md +17 -6
- package/docs/internals/configuration.md +140 -9
- package/docs/internals/core-runtime-updates.md +4 -4
- package/docs/internals/existing-project-anchoring.md +168 -0
- package/docs/internals/flow-mode.md +668 -0
- package/docs/internals/legacy-implementation-notes.md +13 -0
- package/docs/internals/local-testing-feedback-2026-10.md +210 -0
- package/docs/internals/mcp-mission-audit.md +4 -0
- package/docs/internals/mission-rail-cards.md +10 -5
- package/docs/internals/mission-read-only-policy.md +152 -0
- package/docs/internals/modal-standard.md +181 -0
- package/docs/internals/openspec-workflow.md +32 -0
- package/docs/internals/operations-runbook.md +30 -0
- package/docs/internals/profiles.md +6 -3
- package/docs/internals/programmatic-agent-runtime.md +8 -0
- package/docs/internals/project-builder.md +1 -1
- package/docs/internals/review-packet.md +161 -9
- package/docs/internals/safe-pr-review-flow.md +135 -6
- package/docs/internals/source-map.md +413 -18
- package/docs/internals/spec-addenda.md +10 -0
- package/docs/internals/spec-triage.md +140 -0
- package/docs/internals/visual-design-audit.md +15 -2
- package/docs/local-providers.md +3 -0
- package/docs/mcp.md +21 -3
- package/docs/platforms/macos.md +1 -1
- package/docs/platforms/windows.md +2 -2
- package/docs/running-pipelines.md +22 -6
- package/docs/tracking-cost.md +54 -10
- package/local-runner/dist/specrails-local-runner.js +3851 -1178
- package/mcp-bridge/dist/specrails-mcp.js +3864 -1143
- package/package.json +10 -9
- package/server/dist/agent-mcp-config.js +37 -1
- package/server/dist/api-version.js +19 -0
- package/server/dist/command-resolver.js +4 -2
- package/server/dist/core-compat.js +1 -1
- package/server/dist/core-execution.js +2 -1
- package/server/dist/core-update-manager.js +71 -13
- package/server/dist/db/job-search.js +248 -0
- package/server/dist/db/jobs.js +6 -0
- package/server/dist/db/migrations.js +239 -0
- package/server/dist/db.js +9 -2
- package/server/dist/desktop-db.js +99 -5
- package/server/dist/desktop-router.js +126 -13
- package/server/dist/docs-router.js +67 -1
- package/server/dist/feature-flags.js +22 -0
- package/server/dist/index.js +30 -15
- package/server/dist/jira/jira-adf.js +13 -1
- package/server/dist/jira/jira-clarifications.js +146 -0
- package/server/dist/jira/jira-client.js +8 -1
- package/server/dist/jira/jira-db.js +41 -0
- package/server/dist/jira/jira-sync-manager.js +328 -25
- package/server/dist/mcp/guide.js +17 -7
- package/server/dist/mcp/tools/agents.js +1 -1
- package/server/dist/mcp/tools/analytics.js +15 -3
- package/server/dist/mcp/tools/app-settings.js +14 -1
- package/server/dist/mcp/tools/chat.js +1 -1
- package/server/dist/mcp/tools/env.js +4 -2
- package/server/dist/mcp/tools/jobs.js +96 -7
- package/server/dist/mcp/tools/loops.js +1 -1
- package/server/dist/mcp/tools/meta.js +10 -13
- package/server/dist/mcp/tools/rails.js +15 -1
- package/server/dist/mcp/tools/setup.js +1 -1
- package/server/dist/mcp/tools/specs.js +8 -5
- package/server/dist/mcp/tools/support.js +6 -3
- package/server/dist/mcp/tools/types.js +38 -1
- package/server/dist/mobile/mobile-admin-router.js +0 -16
- package/server/dist/mobile/mobile-gateway.js +0 -18
- package/server/dist/mobile/mobile-inbox.js +240 -0
- package/server/dist/mobile/mobile-missions.js +6 -8
- package/server/dist/mobile/mobile-router.js +9 -9
- package/server/dist/mobile/mobile-webrtc-peer.js +4 -54
- package/server/dist/mobile/mobile-ws.js +27 -4
- package/server/dist/modules/accounting/runtime/ai-invocations.js +4 -0
- package/server/dist/modules/accounting/runtime/decision-times.js +102 -0
- package/server/dist/modules/accounting/runtime/loop-economics.js +284 -0
- package/server/dist/modules/accounting/runtime/spending.js +7 -2
- package/server/dist/modules/accounting/runtime/what-if.js +87 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-bridge.js +86 -5
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-controls.js +28 -2
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-metrics.js +15 -2
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-settings-router.js +21 -2
- package/server/dist/modules/agent-runtime/runtime/core-capabilities.js +55 -0
- package/server/dist/modules/agent-sessions/adapters/host-process.js +1 -1
- package/server/dist/modules/agent-sessions/domain/availability.js +16 -0
- package/server/dist/modules/agent-sessions/domain/protocol.js +8 -1
- package/server/dist/modules/agent-sessions/index.js +3 -1
- package/server/dist/modules/agent-sessions/runtime/core-sessions-availability.js +16 -0
- package/server/dist/modules/agents/runtime/agent-refine-manager.js +3 -1
- package/server/dist/modules/agents/runtime/agent-store.js +60 -73
- package/server/dist/modules/audit/adapters/http.js +66 -0
- package/server/dist/modules/audit/adapters/runtime.js +60 -0
- package/server/dist/modules/audit/adapters/sqlite.js +73 -0
- package/server/dist/modules/audit/application.js +190 -0
- package/server/dist/modules/audit/domain.js +434 -0
- package/server/dist/modules/audit/index.js +27 -0
- package/server/dist/modules/audit/ports.js +2 -0
- package/server/dist/modules/browser/runtime/browser-capture-manager.js +18 -141
- package/server/dist/modules/browser/runtime/browser-capture-types.js +1 -10
- package/server/dist/modules/browser/runtime/browser-playwright.js +0 -19
- package/server/dist/modules/code/runtime/file-provenance.js +23 -0
- package/server/dist/modules/conversations/runtime/chat-manager.js +5 -2
- package/server/dist/modules/delivery/adapters/decisions/chains.js +1 -0
- package/server/dist/modules/delivery/adapters/decisions/create.js +19 -1
- package/server/dist/modules/delivery/adapters/decisions/discard.js +2 -0
- package/server/dist/modules/delivery/adapters/decisions/local-changes.js +427 -0
- package/server/dist/modules/delivery/adapters/decisions/merge-local.js +80 -6
- package/server/dist/modules/delivery/adapters/decisions/observations.js +5 -0
- package/server/dist/modules/delivery/adapters/decisions/ownership.js +2 -1
- package/server/dist/modules/delivery/adapters/decisions/transitions.js +9 -0
- package/server/dist/modules/delivery/adapters/review-wip-store.js +37 -0
- package/server/dist/modules/delivery/domain/review-wip.js +71 -0
- package/server/dist/modules/delivery/index.js +9 -1
- package/server/dist/modules/delivery/runtime/delivery-changes.js +355 -0
- package/server/dist/modules/delivery/runtime/delivery-evidence.js +249 -8
- package/server/dist/modules/delivery/runtime/flow-review-legacy.js +99 -0
- package/server/dist/modules/delivery/runtime/flow-review-outcome.js +107 -0
- package/server/dist/modules/delivery/runtime/flow-worktree-handoff.js +32 -0
- package/server/dist/modules/delivery/runtime/flow-worktree-return.js +87 -0
- package/server/dist/modules/delivery/runtime/isolated-worktree.js +380 -0
- package/server/dist/modules/delivery/runtime/local-restore-branch.js +325 -0
- package/server/dist/modules/delivery/runtime/local-restore-resolver.js +48 -0
- package/server/dist/modules/delivery/runtime/local-stash.js +423 -0
- package/server/dist/modules/delivery/runtime/multi-repo-execution.js +27 -1
- package/server/dist/modules/delivery/runtime/phase3-harvest.js +40 -0
- package/server/dist/modules/delivery/runtime/pr-body.js +50 -0
- package/server/dist/modules/delivery/runtime/rail-isolated-launch.js +169 -166
- package/server/dist/modules/delivery/runtime/rail-launch-parser.js +5 -2
- package/server/dist/modules/delivery/runtime/rail-pr-decision.js +7 -1
- package/server/dist/modules/delivery/runtime/rail-pr-store.js +193 -12
- package/server/dist/modules/delivery/runtime/rails-router.js +267 -5
- package/server/dist/modules/delivery/runtime/review-brief.js +208 -0
- package/server/dist/modules/delivery/runtime/review-packet.js +41 -2
- package/server/dist/modules/delivery/runtime/review-wip-gate.js +67 -0
- package/server/dist/modules/delivery/runtime/run-records.js +267 -0
- package/server/dist/modules/delivery/runtime/run-review-diagnosis.js +102 -0
- package/server/dist/modules/execution/adapters/budget-storage.js +76 -0
- package/server/dist/modules/execution/application/enforce-budget.js +17 -2
- package/server/dist/modules/execution/domain/agent-env.js +98 -0
- package/server/dist/modules/execution/domain/daily-budget.js +36 -0
- package/server/dist/modules/execution/domain/spend-caps.js +166 -0
- package/server/dist/modules/execution/index.js +34 -1
- package/server/dist/modules/execution/runtime/budget-overview.js +76 -0
- package/server/dist/modules/execution/runtime/daily-budget-gate.js +86 -0
- package/server/dist/modules/execution/runtime/interactive-job-session.js +8 -0
- package/server/dist/modules/execution/runtime/launch-forecast.js +33 -0
- package/server/dist/modules/execution/runtime/queue-manager.js +54 -15
- package/server/dist/modules/execution/runtime/run-duration-stats.js +31 -13
- package/server/dist/modules/flow/adapters/bindings.js +1089 -0
- package/server/dist/modules/flow/adapters/http.js +147 -0
- package/server/dist/modules/flow/adapters/sqlite.js +121 -0
- package/server/dist/modules/flow/application.js +805 -0
- package/server/dist/modules/flow/domain.js +790 -0
- package/server/dist/modules/flow/index.js +34 -0
- package/server/dist/modules/flow/ports.js +2 -0
- package/server/dist/modules/inbox/adapters/http.js +21 -0
- package/server/dist/modules/inbox/adapters/project-source.js +233 -0
- package/server/dist/modules/inbox/application.js +28 -0
- package/server/dist/modules/inbox/domain.js +43 -0
- package/server/dist/modules/inbox/index.js +10 -0
- package/server/dist/modules/inbox/ports.js +2 -0
- package/server/dist/modules/loops/runtime/loop-definition-run.js +9 -0
- package/server/dist/modules/loops/runtime/loop-definition.js +5 -2
- package/server/dist/modules/loops/runtime/loop-executors.js +90 -9
- package/server/dist/modules/loops/runtime/loop-factory.js +30 -2
- package/server/dist/modules/loops/runtime/loop-flow-spec-recipe.js +166 -0
- package/server/dist/modules/loops/runtime/loop-graph.js +1 -1
- package/server/dist/modules/loops/runtime/loop-role-engines.js +4 -1
- package/server/dist/modules/loops/runtime/loop-run-manager.js +267 -10
- package/server/dist/modules/loops/runtime/loop-runs-store.js +21 -5
- package/server/dist/modules/loops/runtime/loop-templates.js +55 -12
- package/server/dist/modules/missions/runtime/agent-chat-manager.js +283 -20
- package/server/dist/modules/missions/runtime/agent-chat-router.js +96 -21
- package/server/dist/modules/missions/runtime/agent-failure-briefing.js +11 -3
- package/server/dist/modules/missions/runtime/agent-fence-promotion.js +9 -1
- package/server/dist/modules/missions/runtime/agent-flow-prompt.js +64 -0
- package/server/dist/modules/missions/runtime/agent-input-store.js +9 -4
- package/server/dist/modules/missions/runtime/agent-operator-prompt.js +100 -14
- package/server/dist/modules/missions/runtime/agent-session-store.js +88 -27
- package/server/dist/modules/missions/runtime/core-session-runner.js +89 -9
- package/server/dist/modules/missions/runtime/flow-turn-context.js +17 -0
- package/server/dist/modules/missions/runtime/mission-core-sessions.js +295 -55
- package/server/dist/modules/missions/runtime/mission-run-notify.js +2 -0
- package/server/dist/modules/missions/runtime/mission-session-projector.js +56 -19
- package/server/dist/modules/missions/runtime/mission-tool-policy.js +47 -0
- package/server/dist/modules/onboarding/adapters/http.js +78 -0
- package/server/dist/modules/onboarding/adapters/providers.js +41 -0
- package/server/dist/modules/onboarding/adapters/runtime.js +130 -0
- package/server/dist/modules/onboarding/application.js +133 -0
- package/server/dist/modules/onboarding/catalog.js +217 -0
- package/server/dist/modules/onboarding/domain.js +102 -0
- package/server/dist/modules/onboarding/index.js +20 -0
- package/server/dist/modules/onboarding/ports.js +2 -0
- package/server/dist/modules/project-rules/adapters/http.js +91 -0
- package/server/dist/modules/project-rules/domain.js +122 -0
- package/server/dist/modules/project-rules/runtime/rules-inventory-runs.js +97 -0
- package/server/dist/modules/project-rules/runtime/rules-store.js +109 -0
- package/server/dist/modules/project-settings/adapters/http.js +13 -0
- package/server/dist/modules/project-settings/adapters/sqlite.js +78 -8
- package/server/dist/modules/project-settings/domain.js +47 -1
- package/server/dist/modules/project-settings/index.js +7 -1
- package/server/dist/modules/recovery/adapters/sqlite.js +28 -0
- package/server/dist/modules/recovery/domain.js +162 -0
- package/server/dist/modules/recovery/index.js +16 -0
- package/server/dist/modules/specs/adapters/timeline-http.js +101 -0
- package/server/dist/modules/specs/domain/handoff-labels.js +371 -0
- package/server/dist/modules/specs/domain/handoff.js +260 -0
- package/server/dist/modules/specs/domain/non-goals.js +101 -0
- package/server/dist/modules/specs/domain/timeline.js +164 -0
- package/server/dist/modules/specs/domain/triage.js +320 -0
- package/server/dist/modules/specs/runtime/contract-refine-runner.js +3 -2
- package/server/dist/modules/specs/runtime/generated-spec-parser.js +75 -0
- package/server/dist/modules/specs/runtime/proposal-manager.js +4 -3
- package/server/dist/modules/specs/runtime/smash-runner.js +2 -1
- package/server/dist/modules/specs/runtime/spec-addenda.js +31 -0
- package/server/dist/modules/specs/runtime/spec-draft-parser.js +6 -1
- package/server/dist/modules/specs/runtime/spec-generation.js +431 -0
- package/server/dist/modules/specs/runtime/spec-handoff.js +103 -0
- package/server/dist/modules/specs/runtime/spec-history.js +376 -0
- package/server/dist/modules/specs/runtime/spec-launcher-manager.js +4 -3
- package/server/dist/modules/specs/runtime/spec-search.js +117 -0
- package/server/dist/modules/specs/runtime/ticket-store.js +47 -2
- package/server/dist/modules/specs/runtime/ticket-trash-service.js +62 -0
- package/server/dist/modules/specs/runtime/ticket-trash.js +193 -0
- package/server/dist/modules/specs/runtime/triage-runner.js +171 -0
- package/server/dist/modules/specs/runtime/triage.js +365 -0
- package/server/dist/modules/terminals/domain/app-urls.js +96 -0
- package/server/dist/modules/terminals/runtime/app-urls.js +77 -0
- package/server/dist/modules/terminals/runtime/background-process-service.js +25 -28
- package/server/dist/openspec-shim.js +1 -1
- package/server/dist/project-env.js +60 -0
- package/server/dist/project-git.js +65 -0
- package/server/dist/project-registry.js +264 -27
- package/server/dist/project-router-background-processes.js +27 -3
- package/server/dist/project-router-git.js +30 -0
- package/server/dist/project-router-helpers.js +5 -30
- package/server/dist/project-router-jobs.js +49 -1
- package/server/dist/project-router-loop-runs.js +72 -2
- package/server/dist/project-router-rules.js +54 -0
- package/server/dist/project-router-search.js +52 -0
- package/server/dist/project-router-settings.js +6 -0
- package/server/dist/project-router-setup.js +1 -1
- package/server/dist/project-router-spending.js +138 -0
- package/server/dist/project-router-tickets.js +246 -427
- package/server/dist/project-router.js +7 -0
- package/server/dist/providers/claude-adapter.js +25 -3
- package/server/dist/providers/codex-adapter.js +9 -1
- package/server/dist/providers/gemini-adapter.js +6 -1
- package/server/dist/providers/kimi-adapter.js +2 -0
- package/server/dist/providers/local-adapter.js +2 -0
- package/server/dist/providers/runtime.js +8 -0
- package/server/dist/schemas/agent-runtime.schema.json +3 -1
- package/server/dist/schemas/workflow-definition.schema.json +1 -0
- package/server/dist/setup-manager.js +19 -1
- package/server/dist/transient-children.js +25 -8
- package/server/dist/update-channel.js +21 -0
- package/server/dist/util/search-snippet.js +74 -0
- package/server/dist/worktree-manager.js +19 -8
- package/client/dist/assets/ActivityFeedPage-Dtp7EyHc.js +0 -1
- package/client/dist/assets/AgentBrowserCapture-CLqlEFw8.js +0 -1
- package/client/dist/assets/AgentModeAnalyticsPane-B8_hM3Tw.js +0 -2
- package/client/dist/assets/AgentModeCodePane-CNF8ZNjE.js +0 -2
- package/client/dist/assets/AgentModeJobsPane-CJpJbO9m.js +0 -1
- package/client/dist/assets/AgentsPage-BC8XSR79.js +0 -120
- package/client/dist/assets/AnalyticsPage-Cdv4jLtW.js +0 -1
- package/client/dist/assets/BarChart-BDMqVFJy.js +0 -55
- package/client/dist/assets/CodePage-DI1kegAr.js +0 -3
- package/client/dist/assets/DesktopAnalyticsPage-Bdp8E8U6.js +0 -1
- package/client/dist/assets/DocsDialog-Bm4RS7FX.js +0 -11
- package/client/dist/assets/DocsPage-DihYcU8r.js +0 -11
- package/client/dist/assets/ExportDropdown-Bb1lHx3r.js +0 -1
- package/client/dist/assets/IntegrationsPage-EAipiDWm.js +0 -1
- package/client/dist/assets/InteractiveJobComposer-BO6ASN-2.js +0 -19
- package/client/dist/assets/JobDetailModal-CuPYq7tP.js +0 -1
- package/client/dist/assets/JobDetailPage-BusMjJi9.js +0 -1
- package/client/dist/assets/JobsPage-C0QbsF2d.js +0 -1
- package/client/dist/assets/LoopBuilderPage-B7TlU4iS.js +0 -1
- package/client/dist/assets/LoopPreviewModal-BRWtXOD2.js +0 -1
- package/client/dist/assets/LoopsPage-C4q1DmCE.js +0 -2
- package/client/dist/assets/MinimizedChatsContext-DHfigjHS.js +0 -1
- package/client/dist/assets/PluginsPage-Z1JHSMdR.js +0 -2
- package/client/dist/assets/ProjectSettingsDialog-BUNj0tvN.js +0 -1
- package/client/dist/assets/RepositoryDeliveries-B4ybHOyB.js +0 -5
- package/client/dist/assets/ReviewPacketPage-hwfPNjyy.js +0 -4
- package/client/dist/assets/TemplatePreviewModal-V7FpMWuw.js +0 -1
- package/client/dist/assets/TicketDetailModalContext-Dkwo2cDs.js +0 -16
- package/client/dist/assets/Trans-BbFxRFtR.js +0 -1
- package/client/dist/assets/activity-B-rp4h_v.js +0 -1
- package/client/dist/assets/activity-C6kJpm9q.js +0 -1
- package/client/dist/assets/activity-CGx4kb_j.js +0 -1
- package/client/dist/assets/activity-CnoX2bH7.js +0 -1
- package/client/dist/assets/activity-DAyekdlt.js +0 -1
- package/client/dist/assets/activity-DCxtpT7j.js +0 -1
- package/client/dist/assets/activity-DiyjsgQV.js +0 -1
- package/client/dist/assets/activity-JzwRaWPD.js +0 -1
- package/client/dist/assets/addspec-BOvgmcgk.js +0 -1
- package/client/dist/assets/addspec-Clmyfn_R.js +0 -1
- package/client/dist/assets/addspec-CsNaBpHp.js +0 -1
- package/client/dist/assets/addspec-D2tvWmmV.js +0 -1
- package/client/dist/assets/addspec-D3nFwvD0.js +0 -1
- package/client/dist/assets/addspec-DVLEhK3w.js +0 -1
- package/client/dist/assets/addspec-DXbK-tb0.js +0 -1
- package/client/dist/assets/addspec-OHG8DFEn.js +0 -1
- package/client/dist/assets/agent-5bSixVzz.js +0 -1
- package/client/dist/assets/agent-BR4EHfhq.js +0 -1
- package/client/dist/assets/agent-C0IKkJP8.js +0 -1
- package/client/dist/assets/agent-C7li9ayC.js +0 -1
- package/client/dist/assets/agent-D0dRmEen.js +0 -1
- package/client/dist/assets/agent-DZVGHm7H.js +0 -1
- package/client/dist/assets/agent-Dip4h2YE.js +0 -1
- package/client/dist/assets/agent-Pp-P-n1p.js +0 -1
- package/client/dist/assets/agentRuntime-BxF81z52.js +0 -1
- package/client/dist/assets/agentRuntime-BxYS5V7u.js +0 -1
- package/client/dist/assets/agentRuntime-Dc9HG3BA.js +0 -1
- package/client/dist/assets/agents-B6ZsnARo.js +0 -1
- package/client/dist/assets/agents-BORdhe0K.js +0 -1
- package/client/dist/assets/agents-C6aq9Oqs.js +0 -1
- package/client/dist/assets/agents-Cbsc4bcX.js +0 -1
- package/client/dist/assets/agents-D0uYR6hq.js +0 -1
- package/client/dist/assets/agents-Doe1sHY5.js +0 -1
- package/client/dist/assets/agents-DyNi_I9m.js +0 -1
- package/client/dist/assets/agents-StKxiTg0.js +0 -1
- package/client/dist/assets/agentstudio-7cYCXn-L.js +0 -1
- package/client/dist/assets/agentstudio-BHWQh8G3.js +0 -1
- package/client/dist/assets/agentstudio-BjnWHyRs.js +0 -1
- package/client/dist/assets/agentstudio-BkV8vcK4.js +0 -1
- package/client/dist/assets/agentstudio-BzugqB_N.js +0 -1
- package/client/dist/assets/agentstudio-CWbp7KvH.js +0 -1
- package/client/dist/assets/agentstudio-DG6plf5o.js +0 -1
- package/client/dist/assets/agentstudio-DkZVF-Cc.js +0 -1
- package/client/dist/assets/analytics-B1DIQd4m.js +0 -1
- package/client/dist/assets/analytics-BAIZ9vE_.js +0 -1
- package/client/dist/assets/analytics-BTqgmgBd.js +0 -1
- package/client/dist/assets/analytics-BWynXPEm.js +0 -1
- package/client/dist/assets/analytics-DGcUsQ44.js +0 -1
- package/client/dist/assets/analytics-GnSnpJ4W.js +0 -1
- package/client/dist/assets/analytics-TWgYaoO0.js +0 -1
- package/client/dist/assets/analytics-kJy6Tuko.js +0 -1
- package/client/dist/assets/atom-one-dark-qiGhVQxg.js +0 -1
- package/client/dist/assets/builder-B9gorTnT.js +0 -1
- package/client/dist/assets/builder-Bvw5s3Mi.js +0 -1
- package/client/dist/assets/builder-CL5l4dU3.js +0 -1
- package/client/dist/assets/builder-CVDTVrQX.js +0 -1
- package/client/dist/assets/builder-CpS9liE9.js +0 -1
- package/client/dist/assets/builder-DNctIL9Q.js +0 -1
- package/client/dist/assets/builder-De2NxX6o.js +0 -1
- package/client/dist/assets/builder-DeYT7Y-m.js +0 -1
- package/client/dist/assets/button-4FS1ZDTp.js +0 -1
- package/client/dist/assets/chat-D_I7nU5K.js +0 -1
- package/client/dist/assets/chevron-up-6EFqEHBj.js +0 -1
- package/client/dist/assets/chunk-OB3PAWPO-B1EMk45A.js +0 -3
- package/client/dist/assets/clsx-CjueKrWZ.js +0 -1
- package/client/dist/assets/code-B37GRg9C.js +0 -1
- package/client/dist/assets/code-BBOEZbf9.js +0 -1
- package/client/dist/assets/code-BRm-jcyx.js +0 -1
- package/client/dist/assets/code-CF7w62CR.js +0 -1
- package/client/dist/assets/code-CLuvJt2r.js +0 -1
- package/client/dist/assets/code-D0RCm59f.js +0 -1
- package/client/dist/assets/code-DaZ-ZwCT.js +0 -1
- package/client/dist/assets/code-iIHkGaCL.js +0 -1
- package/client/dist/assets/commands-0XjAftla.js +0 -1
- package/client/dist/assets/commands-BAWSYHjQ.js +0 -1
- package/client/dist/assets/commands-BBwowgiE.js +0 -1
- package/client/dist/assets/commands-BacjIZLN.js +0 -1
- package/client/dist/assets/commands-Bs62IAZ3.js +0 -1
- package/client/dist/assets/commands-CLPdh-Hh.js +0 -1
- package/client/dist/assets/commands-DlbFzgrp.js +0 -1
- package/client/dist/assets/commands-LjPSsi5F.js +0 -1
- package/client/dist/assets/common-Bdi0qN4S.js +0 -1
- package/client/dist/assets/common-Bhb9zN1P.js +0 -1
- package/client/dist/assets/common-BykKlZg1.js +0 -1
- package/client/dist/assets/common-CvnNNSJA.js +0 -1
- package/client/dist/assets/common-D5zk_mqq.js +0 -1
- package/client/dist/assets/common-DQNO_al5.js +0 -1
- package/client/dist/assets/common-Dax30Vmp.js +0 -1
- package/client/dist/assets/common-DkllpVSb.js +0 -1
- package/client/dist/assets/core-B3mKBIh5.js +0 -1
- package/client/dist/assets/dashboard-B1ndRHuC.js +0 -1
- package/client/dist/assets/dashboard-BX7KXiqA.js +0 -1
- package/client/dist/assets/dashboard-B_BSNxcN.js +0 -1
- package/client/dist/assets/dashboard-CCeFN7-V.js +0 -1
- package/client/dist/assets/dashboard-CRl0WtFJ.js +0 -1
- package/client/dist/assets/dashboard-XGdQ5mjw.js +0 -1
- package/client/dist/assets/dashboard-_oltA6Jd.js +0 -1
- package/client/dist/assets/dashboard-bAuf5KVk.js +0 -1
- package/client/dist/assets/dialog-DtdR05v1.js +0 -45
- package/client/dist/assets/dist-js-CJ_2XX1Y.js +0 -1
- package/client/dist/assets/event-Bt7f3wXe.js +0 -1
- package/client/dist/assets/explore-BG99VGpL.js +0 -1
- package/client/dist/assets/explore-C0TjprJW.js +0 -1
- package/client/dist/assets/explore-C2dgEo7q.js +0 -1
- package/client/dist/assets/explore-C8NDHbob.js +0 -1
- package/client/dist/assets/explore-CWWgzQGR.js +0 -1
- package/client/dist/assets/explore-CcQXpdtS.js +0 -1
- package/client/dist/assets/explore-DgBACn39.js +0 -1
- package/client/dist/assets/explore-DsXAgnmJ.js +0 -1
- package/client/dist/assets/file-text-C0blZHLh.js +0 -1
- package/client/dist/assets/formatDistanceToNow-NjPHBLfB.js +0 -1
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-vJ7qUoqN.js +0 -1
- package/client/dist/assets/git-branch-yf6LE1Bw.js +0 -1
- package/client/dist/assets/index-BgbCbIua.css +0 -2
- package/client/dist/assets/index-Ce4yZtKf.js +0 -83
- package/client/dist/assets/integrations-BkpRUbvp.js +0 -1
- package/client/dist/assets/integrations-Bo8qbJf4.js +0 -1
- package/client/dist/assets/integrations-CmSrKzZb.js +0 -1
- package/client/dist/assets/integrations-DGtq26Rr.js +0 -1
- package/client/dist/assets/integrations-De38GFnQ.js +0 -1
- package/client/dist/assets/integrations-Dw6zdtb-.js +0 -1
- package/client/dist/assets/integrations-Dwl9KQp0.js +0 -1
- package/client/dist/assets/integrations-Refg_d2I.js +0 -1
- package/client/dist/assets/jira-B6OYw4CJ.js +0 -1
- package/client/dist/assets/jira-BTF6RaOe.js +0 -1
- package/client/dist/assets/jira-CEetIB2q.js +0 -1
- package/client/dist/assets/jira-CIzsZLw5.js +0 -1
- package/client/dist/assets/jira-Daw9tmpI.js +0 -1
- package/client/dist/assets/jira-FXr7u2lh.js +0 -1
- package/client/dist/assets/jira-LaNQn7yl.js +0 -1
- package/client/dist/assets/jira-api-Cabj-H0J.js +0 -1
- package/client/dist/assets/job-time-BCL7wee9.js +0 -1
- package/client/dist/assets/jobs-ARwD85B9.js +0 -1
- package/client/dist/assets/jobs-BMF1w4WT.js +0 -1
- package/client/dist/assets/jobs-CBfzGLwm.js +0 -1
- package/client/dist/assets/jobs-CPjiluBY.js +0 -1
- package/client/dist/assets/jobs-CQQd58pY.js +0 -1
- package/client/dist/assets/jobs-De3EqaO0.js +0 -1
- package/client/dist/assets/jobs-Du9-Ei9a.js +0 -1
- package/client/dist/assets/jobs-qMHbnxwC.js +0 -1
- package/client/dist/assets/layers-BCLTgHXO.js +0 -1
- package/client/dist/assets/loader-circle-BqV9xYGf.js +0 -1
- package/client/dist/assets/loop-layout-CyXj9223.js +0 -7
- package/client/dist/assets/loops-B2PhQLKR.js +0 -1
- package/client/dist/assets/loops-BqbF46st.js +0 -1
- package/client/dist/assets/loops-CINnHbfI.js +0 -1
- package/client/dist/assets/loops-D-3XhH04.js +0 -1
- package/client/dist/assets/loops-DKkEEjZ_.js +0 -1
- package/client/dist/assets/loops-DzWR5-v6.js +0 -1
- package/client/dist/assets/loops-WyWDkhok.js +0 -1
- package/client/dist/assets/loops-scD5fIBf.js +0 -1
- package/client/dist/assets/mcp-6rMoZfEO.js +0 -1
- package/client/dist/assets/mcp-BD8sL5mP.js +0 -1
- package/client/dist/assets/mcp-BkcA3I5s.js +0 -1
- package/client/dist/assets/mcp-CCpSelOh.js +0 -1
- package/client/dist/assets/mcp-CUAN6ORK.js +0 -1
- package/client/dist/assets/mcp-CqbRxRTE.js +0 -1
- package/client/dist/assets/mcp-DP2YfVhO.js +0 -1
- package/client/dist/assets/mcp-DUVQamDz.js +0 -1
- package/client/dist/assets/narration-BEKMVxGm.js +0 -1
- package/client/dist/assets/narration-CjLwGKap.js +0 -1
- package/client/dist/assets/narration-DANWuGsW.js +0 -1
- package/client/dist/assets/narration-DGeEDWiT.js +0 -1
- package/client/dist/assets/narration-DJgpGwIP.js +0 -1
- package/client/dist/assets/narration-DbHnz0qV.js +0 -1
- package/client/dist/assets/narration-bZSsTZG8.js +0 -1
- package/client/dist/assets/narration-i6aKJKEc.js +0 -1
- package/client/dist/assets/nav--u7iPYlS.js +0 -1
- package/client/dist/assets/nav-C5Jgfaby.js +0 -1
- package/client/dist/assets/nav-CAna_Wpt.js +0 -1
- package/client/dist/assets/nav-CCLqeyHo.js +0 -1
- package/client/dist/assets/nav-Cf3c90Jk.js +0 -1
- package/client/dist/assets/nav-DMYQaQjR.js +0 -1
- package/client/dist/assets/nav-Df_PkZ9F.js +0 -1
- package/client/dist/assets/nav-VyNGBJwj.js +0 -1
- package/client/dist/assets/packet-8nn9RsU7.js +0 -1
- package/client/dist/assets/packet-B0H15elv.js +0 -1
- package/client/dist/assets/packet-BQvBgrwh.js +0 -1
- package/client/dist/assets/packet-BR7mO0-a.js +0 -1
- package/client/dist/assets/packet-BgcQ6q_K.js +0 -1
- package/client/dist/assets/packet-D2s92Jnn.js +0 -1
- package/client/dist/assets/packet-YbtcD1HS.js +0 -1
- package/client/dist/assets/packet-c0Qj_9eX.js +0 -1
- package/client/dist/assets/project-repositories-Cnnuj9Ia.js +0 -1
- package/client/dist/assets/rotate-ccw-DalJAQQX.js +0 -1
- package/client/dist/assets/settings-B1NV8Ow9.js +0 -1
- package/client/dist/assets/settings-BQ8XFZeE.js +0 -1
- package/client/dist/assets/settings-BRkxfBbO.js +0 -1
- package/client/dist/assets/settings-C_CcU1dP.js +0 -1
- package/client/dist/assets/settings-Cto9n0eL.js +0 -1
- package/client/dist/assets/settings-Pyw8uYtL.js +0 -1
- package/client/dist/assets/settings-b3HVCNNd.js +0 -1
- package/client/dist/assets/settings-hdive4u6.js +0 -1
- package/client/dist/assets/setup-Be485n2u.js +0 -1
- package/client/dist/assets/setup-CKGUxKr-.js +0 -1
- package/client/dist/assets/setup-Ck1Uwd7_.js +0 -1
- package/client/dist/assets/setup-Cm774a6v.js +0 -1
- package/client/dist/assets/setup-DIqMQpxt.js +0 -1
- package/client/dist/assets/setup-DfCsoNFL.js +0 -1
- package/client/dist/assets/setup-DkeE8mP0.js +0 -1
- package/client/dist/assets/setup-xVntVaz1.js +0 -1
- package/client/dist/assets/specs-Bqvtz2kz.js +0 -1
- package/client/dist/assets/specs-CKes-kz6.js +0 -1
- package/client/dist/assets/specs-CfXxPDNB.js +0 -1
- package/client/dist/assets/specs-CyF9HuTI.js +0 -1
- package/client/dist/assets/specs-DMj035Mt.js +0 -1
- package/client/dist/assets/specs-DfIdoU5L.js +0 -1
- package/client/dist/assets/specs-j5pGLQeU.js +0 -1
- package/client/dist/assets/specs-xW5pkkB7.js +0 -1
- package/client/dist/assets/spending-CQnrWiR3.js +0 -1
- package/client/dist/assets/square-D0JTbRSR.js +0 -1
- package/client/dist/assets/tauri-shell-DE6LfGPw.js +0 -2
- package/client/dist/assets/terminal-BAzpHtpY.js +0 -1
- package/client/dist/assets/terminal-C7dHeR3x.js +0 -1
- package/client/dist/assets/terminal-CMla5Qsz.js +0 -1
- package/client/dist/assets/terminal-CdNXH-n9.js +0 -1
- package/client/dist/assets/terminal-Cw5bZsmV.js +0 -1
- package/client/dist/assets/terminal-DFUP4eNv.js +0 -1
- package/client/dist/assets/terminal-DGqljeK_.js +0 -1
- package/client/dist/assets/terminal-cU70NodO.js +0 -1
- package/client/dist/assets/tickets--tiSOCcn.js +0 -1
- package/client/dist/assets/tickets-BUJ3DMWU.js +0 -1
- package/client/dist/assets/tickets-C1WNPODq.js +0 -1
- package/client/dist/assets/tickets-CDjhWmiE.js +0 -1
- package/client/dist/assets/tickets-CLgPC3uO.js +0 -1
- package/client/dist/assets/tickets-D41ZMQpf.js +0 -1
- package/client/dist/assets/tickets-DEaQC06P.js +0 -1
- package/client/dist/assets/tickets-kcMzbLCp.js +0 -1
- package/client/dist/assets/trash-D8zYUmTg.js +0 -1
- package/client/dist/assets/useDesktop-BjLT0_EE.js +0 -1
- package/client/dist/assets/useRuntimeRuns-C97qEqMg.js +0 -1
- package/client/dist/assets/useSharedWebSocket-Bj4LMp7b.js +0 -2
- package/client/dist/assets/utils-BC4DHlz2.js +0 -1
- package/docs/guide/en/getting-started/4-the-dashboard-tour.md +0 -48
- package/docs/guide/es/getting-started/4-the-dashboard-tour.md +0 -48
- package/server/dist/mobile/mobile-preview-channel.js +0 -179
- package/server/dist/mobile/mobile-preview.js +0 -366
- package/server/dist/modules/browser/domain/preview-origins.js +0 -117
- package/server/dist/modules/browser/runtime/preview-targets.js +0 -80
- /package/client/dist/assets/{atom-one-dark-B-oHczHB.css → DocView-B-oHczHB.css} +0 -0
- /package/docs/guide/de/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/en/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/es/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/fr/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/it/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/ja/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/pt/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/zh/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/core-BozBzB6Y.js","assets/rolldown-runtime-CNC7AqOf.js","assets/event-BEnMLqAi.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t,t as n}from"./jsx-runtime-BbYvbtY8.js";import{t as r}from"./preload-helper-Czpn1I53.js";import{c as i,l as a,s as o,u as s}from"./chunk-OB3PAWPO-BBaq6pUk.js";import{n as c,t as l}from"./tauri-shell-43ixPGfa.js";import{_ as u,a as d,g as f,l as p,s as m,t as h,v as g}from"./api-DOGbyfTO.js";import{t as _}from"./Trans-C6J0cLyh.js";import{n as v,t as y}from"./createLucideIcon-DtODIU64.js";import{t as b}from"./origin-03nTuaOb.js";import{a as x,n as S}from"./core-BozBzB6Y.js";import{n as C}from"./notify-error-BsWANx1T.js";import{a as w}from"./provider-capabilities-DtwcTme4.js";import{n as T,t as E}from"./save-LmPSfsvZ.js";import{a as D}from"./HelpHint-Crf9_uoR.js";import{a as O,i as k,n as A,r as j}from"./spending-CVH8VREb.js";import{d as M,f as N,g as P,h as F,l as I,m as L,n as R,p as z}from"./MinimizedChatsContext-742ypO8n.js";import{t as B}from"./ban-wqfdzoXt.js";import{n as V,r as H}from"./chevron-up-BAMuP0XD.js";import{t as U}from"./chevron-right-CwMAj0w_.js";import{t as ee}from"./circle-x-D2ttKotB.js";import{t as te}from"./download-C9wP_42h.js";import{a as ne,n as W,o as re,r as ie,s as ae,t as oe}from"./dropdown-menu-Bfp2CK6H.js";import{t as se}from"./external-link-CZ6Q-v1-.js";import{t as ce}from"./file-text-CNXzL3wj.js";import{n as le,r as ue,t as G}from"./square-Co6h5vZg.js";import{n as de,r as fe,t as pe}from"./confirm-dialog-ChZdHL3Q.js";import{t as me}from"./pencil-CxrRbDwb.js";import{t as he}from"./plus-fHDdjBk1.js";import{t as ge}from"./refresh-cw-DfyTkbsf.js";import{t as _e}from"./search-BDVp3fkH.js";import{t as ve}from"./triangle-alert-Cxpn8bqr.js";import{t as ye}from"./wrench-Br2n1Lxd.js";import{t as be}from"./x-Bu7X_eR2.js";import{t as xe}from"./zap-bugHyWzQ.js";import{C as Se,O as Ce,S as we,T as Te,a as Ee,b as De,c as Oe,d as ke,f as Ae,g as je,i as Me,j as Ne,k as Pe,l as Fe,n as Ie,p as Le,u as Re,w as ze,x as Be,y as Ve}from"./dialog-C23lB2iP.js";import{t as K}from"./utils-ELimjS2Y.js";import{o as He,r as Ue}from"./a11y-prefs-BqoP5goK.js";import{i as We,o as Ge,r as q}from"./useDesktop-BuOp2-MR.js";import{n as Ke,t as qe}from"./lib-DWJfei6y.js";import{t as Je}from"./formatDistanceToNow-DLMIOS0N.js";import{t as J}from"./button-CHPkroew.js";import{a as Ye,i as Xe,n as Ze,r as Qe,t as $e}from"./select-xA3pSmqE.js";import{t as et}from"./empty-state-D5w9OWj-.js";import{r as tt,u as nt}from"./launch-forecast-BTa-p3RP.js";import{t as rt}from"./format-BODoFIw6.js";import{t as it}from"./RailTrack-BfLmBzBh.js";import{t as at}from"./jira-api-DHme7Upx.js";import{t as ot}from"./RepositoryScopeSelector-DcxbKI9w.js";function st(e=``){return e||(typeof window<`u`&&(`__TAURI_INTERNALS__`in window||window.location.hostname===`tauri.localhost`)||typeof window<`u`&&window.location.protocol!==`http:`&&window.location.protocol!==`https:`?`ws://127.0.0.1:4200`:`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.host}`)}var ct=st(),lt=class e extends S{constructor(e){super(e)}static async new(t,n,r){return x(`plugin:image|new`,{rgba:t,width:n,height:r}).then(t=>new e(t))}static async fromBytes(t){return x(`plugin:image|from_bytes`,{bytes:t}).then(t=>new e(t))}static async fromPath(t){return x(`plugin:image|from_path`,{path:t}).then(t=>new e(t))}async rgba(){return x(`plugin:image|rgba`,{rid:this.rid}).then(e=>new Uint8Array(e))}async size(){return x(`plugin:image|size`,{rid:this.rid})}};function ut(e){return e==null?null:typeof e==`string`?e:e instanceof lt?e.rid:e}async function dt(e,t){await x(`plugin:clipboard-manager|write_text`,{label:t?.label,text:e})}async function ft(){return await x(`plugin:clipboard-manager|read_text`)}async function pt(){if(l())try{let e=await ft();return typeof e==`string`?e:null}catch{return null}try{if(typeof navigator<`u`&&navigator.clipboard?.readText)return await navigator.clipboard.readText()||null}catch{}return null}async function mt(e){if(l())try{return await dt(e),!0}catch{return!1}try{if(typeof navigator<`u`&&navigator.clipboard?.writeText)return await navigator.clipboard.writeText(e),!0}catch{}return!1}var ht=new Set([`building`,`on_review`,`pr_draft`,`pr_ready`,`no_changes`,`completed`,`pr_closed`,`superseded`,`merged`,`discarded`,`implementation_failed`,`pr_failed`]),gt=new Set([`none`,`local-only`,`pushed`,`pr-created`]),_t=new Set([`running`,`succeeded`,`partially_succeeded`,`failed`,`unknown`]),vt=new Set([`pending`,`ready`,`delivered`,`partial`,`no_changes`,`retryable_failure`,`blocked`,`not_started`,`unknown`]),yt=new Set([`create-pr`,`publish`,`discard`,`poll-merge`,`merge-local`,`dismiss`,`reopen`,`acknowledge-no-changes`,`recover-and-retry`,`checkout`]),bt=new Set(`implementation_running.implementation_failed.ready_for_review.restart_pending.partial_success.partial_delivery.existing_pr_updated.no_changes.commit_failed.branch_verification_failed.push_failed.settlement_interrupted.recovery_unavailable.operation_interrupted.delivery_failed.pr_draft_ready.pr_ready.pr_closed.merged.discarded.superseded.cleanup_incomplete.review_changes_requested.returned_to_flow.local_changes_attention.status_failed.ref_mismatch`.split(`.`));function xt(e){return typeof e==`string`&&bt.has(e)}var St=`previous delivery action was interrupted by restart`;function Ct(e,t){return e===`operation_interrupted`||typeof t==`string`&&t.toLowerCase().includes(St)}var wt=e=>typeof e==`string`&&e.length>0?e:null,Y=e=>typeof e==`string`&&e.length>0?e:null;function Tt(e){if(!e)return null;let t=/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(e)?`${e.replace(` `,`T`)}Z`:e,n=Date.parse(t);return Number.isFinite(n)?n:null}function Et(e,t){let n=Tt(e),r=Tt(t);return n==null||r==null?null:r<n?-1:+(r>n)}function Dt(e){if(!e||typeof e!=`object`)return null;let t=e;if(typeof t.ticketId!=`number`||!Number.isFinite(t.ticketId)||typeof t.branch!=`string`)return null;let n=typeof t.implementationOutcome==`string`&&_t.has(t.implementationOutcome)?t.implementationOutcome:void 0,r=typeof t.deliveryOutcome==`string`&&vt.has(t.deliveryOutcome)?t.deliveryOutcome:void 0;return{ticketId:t.ticketId,branch:t.branch,succeeded:t.succeeded===!0,...wt(t.runId)?{runId:wt(t.runId)}:{},...n?{implementationOutcome:n}:{},...r?{deliveryOutcome:r}:{},initialSha:Y(t.initialSha),finalSha:Y(t.finalSha),...typeof t.changed==`boolean`?{changed:t.changed}:{},failureCode:Y(t.failureCode),...t.branchOwnership===`created`||t.branchOwnership===`preexisting`||t.branchOwnership===`borrowed-pr`?{branchOwnership:t.branchOwnership}:{},worktreePath:Y(t.worktreePath)}}var Ot=new Set([`high`,`medium`,`low`]);function kt(e){if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e,n=e=>typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0,r=t.top&&typeof t.top==`object`?t.top:null;return{highCount:n(t.highCount),mediumCount:n(t.mediumCount),lowCount:n(t.lowCount),top:r&&typeof r.severity==`string`&&Ot.has(r.severity)&&typeof r.whatToLookAt==`string`&&r.whatToLookAt?{severity:r.severity,area:Y(r.area),whatToLookAt:r.whatToLookAt,ref:Y(r.ref)}:null,diagnostic:t.diagnostic===!0}}var At=50;function jt(e){if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e;return t.reason!==`review`&&t.reason!==`check`?null:{reason:t.reason,summary:Y(t.summary),issues:Array.isArray(t.issues)?t.issues.filter(e=>typeof e==`string`&&e.trim().length>0).slice(0,At):[],issuesOmitted:(e=>typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0)(t.issuesOmitted),score:typeof t.score==`number`&&Number.isFinite(t.score)?t.score:null,failingChecks:Array.isArray(t.failingChecks)?t.failingChecks.flatMap(e=>{if(!e||typeof e!=`object`)return[];let t=e;return typeof t.command==`string`&&t.command?[{command:t.command,exitCode:typeof t.exitCode==`number`&&Number.isInteger(t.exitCode)?t.exitCode:null}]:[]}).slice(0,10):[]}}var Mt=new Set([`saved`,`restored`,`needs_attention`,`released`]);function Nt(e){if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e;return typeof t.sha!=`string`||!/^[0-9a-f]{40,64}$/i.test(t.sha)||typeof t.state!=`string`||!Mt.has(t.state)?null:{sha:t.sha,name:typeof t.name==`string`?t.name:``,branch:typeof t.branch==`string`?t.branch:``,state:t.state,restoreBranch:Y(t.restoreBranch),conflictPaths:Array.isArray(t.conflictPaths)?t.conflictPaths.filter(e=>typeof e==`string`&&e.length>0).slice(0,20):[],...(()=>{let e=Rt(t.restore);return e?{restore:e}:{}})(),savedAt:typeof t.savedAt==`string`?t.savedAt:``,updatedAt:typeof t.updatedAt==`string`?t.updatedAt:``}}var Pt=new Set([`resolving`,`ready`,`failed`,`brought_back`,`discarded`]),Ft=/^[0-9a-f]{40,64}$/i,It=(e,t)=>Array.isArray(e)?e.filter(e=>typeof e==`string`&&e.length>0).slice(0,t):[],Lt=e=>typeof e==`number`&&Number.isFinite(e)?e:null;function Rt(e){if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e;return typeof t.status!=`string`||!Pt.has(t.status)||typeof t.branch!=`string`||!t.branch?null:{status:t.status,branch:t.branch,baseSha:typeof t.baseSha==`string`&&Ft.test(t.baseSha)?t.baseSha:null,commitSha:typeof t.commitSha==`string`&&Ft.test(t.commitSha)?t.commitSha:null,resolvedBy:t.resolvedBy===`clean`||t.resolvedBy===`resolver`?t.resolvedBy:null,managedPaths:It(t.managedPaths,50),conflictPaths:It(t.conflictPaths,20),files:Array.isArray(t.files)?t.files.flatMap(e=>{if(!e||typeof e!=`object`)return[];let t=e;return typeof t.path==`string`&&t.path?[{path:t.path,added:Lt(t.added),removed:Lt(t.removed)}]:[]}).slice(0,50):[],detail:typeof t.detail==`string`?t.detail:null,updatedAt:typeof t.updatedAt==`string`?t.updatedAt:``}}function zt(e){let t=e?.restore?.status;return t===`resolving`||t===`ready`||t===`failed`}function Bt(e){return!!e&&(e.state===`saved`||e.state===`needs_attention`)}function Vt(e,t){if(!e||typeof e!=`object`)return null;let n=e,r=wt(n.prDeliveryId)??wt(n.id),i=typeof n.railIndex==`number`&&Number.isFinite(n.railIndex)?n.railIndex:t;if(!r||i==null||typeof n.decision!=`string`||!ht.has(n.decision))return null;let a=typeof n.implementationOutcome==`string`&&_t.has(n.implementationOutcome)?n.implementationOutcome:void 0,o=typeof n.deliveryOutcome==`string`&&vt.has(n.deliveryOutcome)?n.deliveryOutcome:void 0,s=(Array.isArray(n.units)?n.units:Array.isArray(n.branches)?n.branches:[]).map(Dt).filter(e=>e!==null);return{prDeliveryId:r,railIndex:i,railKey:typeof n.railKey==`string`?n.railKey:``,ticketIds:Array.isArray(n.ticketIds)?n.ticketIds.filter(e=>typeof e==`number`&&Number.isFinite(e)):[],baseBranch:typeof n.baseBranch==`string`?n.baseBranch:``,branch:Y(n.branch),prUrl:Y(n.prUrl),prNumber:typeof n.prNumber==`number`&&Number.isInteger(n.prNumber)&&n.prNumber>0?n.prNumber:null,prState:typeof n.prState==`string`&>.has(n.prState)?n.prState:`none`,decision:n.decision,runIds:Array.isArray(n.runIds)?n.runIds.filter(e=>typeof e==`string`&&e.length>0):s.map(e=>e.runId).filter(e=>typeof e==`string`&&e.length>0),originConversationId:Y(n.originConversationId),...(()=>{let e=kt(n.riskSummary);return e?{riskSummary:e}:{}})(),...(()=>{let e=jt(n.flowReview);return e?{flowReview:e}:{}})(),...(()=>{let e=Nt(n.localStash);return e?{localStash:e}:{}})(),...wt(n.loopId)?{loopId:wt(n.loopId)}:{},...wt(n.loopName)?{loopName:wt(n.loopName)}:{},createdAt:typeof n.createdAt==`string`?n.createdAt:void 0,updatedAt:typeof n.updatedAt==`string`?n.updatedAt:void 0,...a?{implementationOutcome:a}:{},...o?{deliveryOutcome:o}:{},statusCode:Y(n.statusCode),statusDetail:Y(n.statusDetail),deliverySha:Y(n.deliverySha),isContinuation:n.isContinuation===!0,supersedesDeliveryId:Y(n.supersedesDeliveryId),restoredFromDeliveryId:Y(n.restoredFromDeliveryId),operation:typeof n.operation==`string`&&yt.has(n.operation)?n.operation:null,cleanupWarnings:Array.isArray(n.cleanupWarnings)?n.cleanupWarnings.filter(e=>typeof e==`string`&&e.length>0):[],safetyArchives:Array.isArray(n.safetyArchives)?n.safetyArchives.filter(e=>typeof e==`string`&&e.length>0):[],units:s,executionManifest:n.executionManifest&&typeof n.executionManifest==`object`&&n.executionManifest.version===1?n.executionManifest:void 0,repositoryDeliveries:Array.isArray(n.repositoryDeliveries)?n.repositoryDeliveries.slice(0,100).flatMap(e=>{if(!e||typeof e!=`object`)return[];let t=e;if(typeof t.repositoryId!=`string`||typeof t.deliveryId!=`string`||typeof t.name!=`string`||typeof t.path!=`string`)return[];let n=Vt({...t,prDeliveryId:t.deliveryId,repositoryDeliveries:void 0},i);return n?[{repositoryId:t.repositoryId,deliveryId:t.deliveryId,name:t.name,path:t.path,baseBranch:n.baseBranch,...wt(t.integrationBranch)?{integrationBranch:wt(t.integrationBranch)}:{},branch:n.branch,deliverySha:n.deliverySha??null,decision:n.decision,implementationOutcome:n.implementationOutcome??`unknown`,deliveryOutcome:n.deliveryOutcome??`unknown`,statusCode:n.statusCode??null,statusDetail:n.statusDetail??null,prUrl:n.prUrl,prNumber:n.prNumber,runIds:n.runIds,worktreeIds:Array.isArray(t.worktreeIds)?t.worktreeIds.filter(e=>typeof e==`string`):[]}]:[]}):void 0}}function Ht(e){let t=Ut(e);if(t.terminal||t.deliveryBlocked||t.implementationFailed||t.noChanges||e.decision===`building`||e.decision===`implementation_failed`)return null;if(e.branch||e.deliverySha)return e.branch&&/^[0-9a-f]{40,64}$/i.test(e.deliverySha??``)?e.branch:null;let n=e.units??[];if(n.length!==1)return null;let r=n[0];return!r.succeeded||r.implementationOutcome===`failed`||r.deliveryOutcome===`blocked`||r.deliveryOutcome===`no_changes`||r.changed===!1?null:r.branch&&/^[0-9a-f]{40,64}$/i.test(r.finalSha??``)?r.branch:null}function Ut(e){let t=e.units??[],n=t.length>0?t.filter(e=>e.implementationOutcome===`succeeded`||e.implementationOutcome==null&&e.succeeded).length:e.implementationOutcome===`failed`?0:e.ticketIds.length,r=t.length>0?t.filter(e=>e.implementationOutcome===`failed`||e.implementationOutcome==null&&!e.succeeded).length:e.implementationOutcome===`failed`?e.ticketIds.length:0,i=e.decision===`no_changes`||e.decision===`completed`||e.deliveryOutcome===`no_changes`||e.statusCode===`no_changes`,a=e.implementationOutcome===`partially_succeeded`||e.deliveryOutcome===`partial`||n>0&&r>0,o=t.length>0?t.filter(e=>e.deliveryOutcome===`ready`||e.deliveryOutcome===`delivered`||e.deliveryOutcome==null&&e.succeeded).length:a?0:n,s=a&&o===0,c=e.implementationOutcome===`failed`||e.implementationOutcome==null&&e.decision===`implementation_failed`,l=e.deliveryOutcome===`retryable_failure`,u=!c&&!l&&(s||e.deliveryOutcome===`blocked`||[`commit_failed`,`branch_verification_failed`,`settlement_interrupted`,`recovery_unavailable`,`status_failed`,`ref_mismatch`,`delivery_failed`].includes(e.statusCode??``)),d=e.isContinuation===!0,f=[...new Set((e.runIds??[]).filter(e=>typeof e==`string`&&e.length>0))],p=f.length===1?f[0]:null,m=p&&e.branch?t.filter(t=>t.runId===p&&t.branch===e.branch):[],h=[...new Set(m.map(e=>e.worktreePath).filter(e=>!!e))],g=(e.statusCode===`settlement_interrupted`||e.statusCode===`recovery_unavailable`)&&d?h:[...new Set(t.map(e=>e.worktreePath).filter(e=>!!e))],_=e.decision===`pr_failed`&&e.deliveryOutcome===`blocked`&&u&&d&&!!e.prUrl&&!!e.branch&&f.length===1&&m.length>0&&h.length<=1&&e.statusCode===`settlement_interrupted`&&(e.implementationOutcome===`succeeded`||e.implementationOutcome===`partially_succeeded`),v=e.decision===`pr_failed`&&e.deliveryOutcome===`blocked`&&u&&d&&e.statusCode===`recovery_unavailable`,y=v&&!!e.prUrl&&!!e.branch&&f.length===1&&m.length>0&&h.length<=1&&(e.implementationOutcome===`succeeded`||e.implementationOutcome===`partially_succeeded`),b=g.length>0||v&&!!e.deliverySha,x=!c&&l&&(e.statusCode===`push_failed`||d||!!e.prUrl),S=!c&&l&&!x,C=e.decision===`pr_closed`,w=e.decision===`superseded`;return{noChanges:i,partial:a,partialUndeliverable:s,implementationFailed:c,deliveryBlocked:u,retryablePush:x,retryablePrCreation:S,manualRecovery:_,recoveryUnavailable:v,recoveryRecheck:y,hasDiscardableRecoveryResult:b,continuation:d,localOnly:e.prState===`local-only`,closed:C,superseded:w,terminal:e.decision===`merged`||e.decision===`discarded`||e.decision===`completed`||w,succeededCount:n,deliverableCount:o,failedCount:r,totalCount:t.length>0?t.length:e.ticketIds.length,units:t,cleanupWarnings:e.cleanupWarnings??[],safetyArchives:e.safetyArchives??[],recoveryWorktreePaths:g}}var Wt=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_TERMINAL_PANEL;return typeof e!=`string`||e!==`false`})(),Gt=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_AGENTS_SECTION;return typeof e!=`string`||e!==`false`})(),Kt=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_CODE_EXPLORER;return typeof e!=`string`||e!==`false`})(),qt=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_JIRA;return typeof e!=`string`||e!==`false`})(),Jt=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_MCP;return typeof e!=`string`||e!==`false`})(),Yt=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_AGENT_CHAT;return typeof e!=`string`||e!==`false`})(),Xt=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_AGENT_MODE;return Yt&&(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 Zt=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_LOOPS_SECTION;return typeof e!=`string`||e!==`false`})(),Qt=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_NATIVE_BROWSER;return typeof e!=`string`||e!==`false`})(),$t=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_PROJECT_BUILDER;return typeof e!=`string`||e!==`false`})(),en=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_REVIEW_PACKET;return typeof e!=`string`||e!==`false`})(),tn=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_NARRATED_PROGRESS;return typeof e!=`string`||e!==`false`})(),nn=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_LOCAL_ENGINES;return typeof e!=`string`||e!==`false`})();function rn(){return nn}var an=(()=>{let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_MISSION_RAIL_CARDS;return typeof e!=`string`||e!==`false`})(),on={name:`camera`,size:24,node:[[`path`,{d:`M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z`,key:`18u6gg`}],[`circle`,{cx:`12`,cy:`13`,r:`3`,key:`1vg3eu`}]]};on.node;var sn=y(on),cn={name:`circle-arrow-right`,size:24,node:[[`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`}]],aliases:[`arrow-right-circle`]};cn.node;var ln=y(cn),un={name:`circle-question-mark`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3`,key:`1u773s`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]],aliases:[`help-circle`,`circle-help`]};un.node;var dn=y(un),fn={name:`clipboard-check`,size:24,node:[[`rect`,{width:`8`,height:`4`,x:`8`,y:`2`,rx:`1`,ry:`1`,key:`tgr4d6`}],[`path`,{d:`M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2`,key:`116196`}],[`path`,{d:`m9 14 2 2 4-4`,key:`df797q`}]]};fn.node;var pn=y(fn),mn={name:`clipboard-copy`,size:24,node:[[`rect`,{width:`8`,height:`4`,x:`8`,y:`2`,rx:`1`,ry:`1`,key:`tgr4d6`}],[`path`,{d:`M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2`,key:`4jdomd`}],[`path`,{d:`M16 4h2a2 2 0 0 1 2 2v4`,key:`3hqy98`}],[`path`,{d:`M21 14H11`,key:`1bme5i`}],[`path`,{d:`m15 10-4 4 4 4`,key:`5dvupr`}]]};mn.node;var hn=y(mn),gn={name:`columns-2`,size:24,node:[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M12 3v18`,key:`108xh3`}]],aliases:[`columns`]};gn.node;var _n=y(gn),vn={name:`droplet`,size:24,node:[[`path`,{d:`M12 22a7 7 0 0 0 7-7c0-2-1-3.9-3-5.5s-3.5-4-4-6.5c-.5 2.5-2 4.9-4 6.5C6 11.1 5 13 5 15a7 7 0 0 0 7 7z`,key:`c7niix`}]]};vn.node;var yn=y(vn),bn={name:`file-code`,size:24,node:[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 12.5 8 15l2 2.5`,key:`1tg20x`}],[`path`,{d:`m14 12.5 2 2.5-2 2.5`,key:`yinavb`}]]};bn.node;var xn=y(bn),Sn={name:`file-minus-corner`,size:24,node:[[`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`}]],aliases:[`file-minus-2`]};Sn.node;var Cn=y(Sn),wn={name:`file-plus-corner`,size:24,node:[[`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`}]],aliases:[`file-plus-2`]};wn.node;var Tn=y(wn),En={name:`git-commit-horizontal`,size:24,node:[[`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`}]],aliases:[`git-commit`]};En.node;var Dn=y(En),On={name:`git-pull-request-arrow`,size:24,node:[[`circle`,{cx:`5`,cy:`6`,r:`3`,key:`1qnov2`}],[`path`,{d:`M5 9v12`,key:`ih889a`}],[`circle`,{cx:`19`,cy:`18`,r:`3`,key:`1qljk2`}],[`path`,{d:`m15 9-3-3 3-3`,key:`1lwv8l`}],[`path`,{d:`M12 6h5a2 2 0 0 1 2 2v7`,key:`1yj91y`}]]};On.node;var kn=y(On),An={name:`git-pull-request`,size:24,node:[[`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`}]]};An.node;var jn=y(An),Mn={name:`hash`,size:24,node:[[`line`,{x1:`4`,x2:`20`,y1:`9`,y2:`9`,key:`4lhtct`}],[`line`,{x1:`4`,x2:`20`,y1:`15`,y2:`15`,key:`vyu0kd`}],[`line`,{x1:`10`,x2:`8`,y1:`3`,y2:`21`,key:`1ggp8o`}],[`line`,{x1:`16`,x2:`14`,y1:`3`,y2:`21`,key:`weycgp`}]]};Mn.node;var Nn=y(Mn),Pn={name:`layers`,size:24,node:[[`path`,{d:`M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z`,key:`zw3jo`}],[`path`,{d:`M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12`,key:`1wduqc`}],[`path`,{d:`M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17`,key:`kqbvx6`}]],aliases:[`layers-3`]};Pn.node;var Fn=y(Pn),In={name:`message-square-text`,size:24,node:[[`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`}],[`path`,{d:`M7 11h10`,key:`1twpyw`}],[`path`,{d:`M7 15h6`,key:`d9of3u`}],[`path`,{d:`M7 7h8`,key:`af5zfr`}]]};In.node;var Ln=y(In),Rn={name:`mouse-pointer-2`,size:24,node:[[`path`,{d:`M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z`,key:`edeuup`}]]};Rn.node;var zn=y(Rn),Bn={name:`redo-2`,size:24,node:[[`path`,{d:`m15 14 5-5-5-5`,key:`12vg1m`}],[`path`,{d:`M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13`,key:`6uklza`}]]};Bn.node;var Vn=y(Bn),Hn={name:`rotate-cw`,size:24,node:[[`path`,{d:`M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8`,key:`1p45f6`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}]]};Hn.node;var Un=y(Hn),Wn={name:`shield-alert`,size:24,node:[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`M12 8v4`,key:`1got3b`}],[`path`,{d:`M12 16h.01`,key:`1drbdi`}]]};Wn.node;var Gn=y(Wn),Kn={name:`split`,size:24,node:[[`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`}]]};Kn.node;var qn=y(Kn),Jn={name:`sticky-note`,size:24,node:[[`path`,{d:`M21 9a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 15 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2z`,key:`1dfntj`}],[`path`,{d:`M15 3v5a1 1 0 0 0 1 1h5`,key:`6s6qgf`}]]};Jn.node;var Yn=y(Jn),Xn={name:`ticket`,size:24,node:[[`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`}]]};Xn.node;var Zn=y(Xn),Qn={name:`type`,size:24,node:[[`path`,{d:`M12 4v16`,key:`1654pz`}],[`path`,{d:`M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2`,key:`e0r10z`}],[`path`,{d:`M9 20h6`,key:`s66wpe`}]]};Qn.node;var $n=y(Qn),er={name:`undo-2`,size:24,node:[[`path`,{d:`M9 14 4 9l5-5`,key:`102s5s`}],[`path`,{d:`M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11`,key:`f3b9sd`}]]};er.node;var tr=y(er),nr={name:`zoom-in`,size:24,node:[[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}],[`line`,{x1:`21`,x2:`16.65`,y1:`21`,y2:`16.65`,key:`13gj7c`}],[`line`,{x1:`11`,x2:`11`,y1:`8`,y2:`14`,key:`1vmskp`}],[`line`,{x1:`8`,x2:`14`,y1:`11`,y2:`11`,key:`durymu`}]]};nr.node;var rr=y(nr),ir={name:`zoom-out`,size:24,node:[[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}],[`line`,{x1:`21`,x2:`16.65`,y1:`21`,y2:`16.65`,key:`13gj7c`}],[`line`,{x1:`8`,x2:`14`,y1:`11`,y2:`11`,key:`durymu`}]]};ir.node;var ar=y(ir),X=e(t(),1),or=`(prefers-reduced-motion: reduce)`;function sr(e){let t;try{t=window.matchMedia?.(or)}catch{}return t?.addEventListener?.(`change`,e),()=>t?.removeEventListener?.(`change`,e)}function cr(e,t){return e===`reduce`||e!==`full`&&t}function lr(){let{motion:e}=He();return cr(e,(0,X.useSyncExternalStore)(sr,Ue,()=>!1))}var Z=n(),ur=8e3,dr=(0,X.createContext)({pushUndo:()=>!1,undoLast:async()=>!1,peekUndo:()=>null});function fr(){return(0,X.useContext)(dr)}function pr(e){let t=e;if(!t||typeof t.closest!=`function`)return!1;let n=t.tagName;return n===`INPUT`||n===`TEXTAREA`||n===`SELECT`||t.isContentEditable?!0:!!t.closest(`.monaco-editor, .cm-editor, [data-code-editor], .specrails-xterm-container, .xterm, [contenteditable="true"]`)}var mr=class extends Error{},hr=0;function gr({children:e}){let{t}=v(`undo`),{activeProjectId:n}=q(),r=(0,X.useRef)(n);r.current=n;let i=(0,X.useRef)(t);i.current=t;let a=(0,X.useRef)([]),o=(0,X.useRef)(new Map),s=(0,X.useCallback)(e=>{a.current=a.current.filter(t=>t.id!==e);let t=o.current.get(e);t&&clearTimeout(t),o.current.delete(e)},[]),c=(0,X.useCallback)(async e=>{if(e.done)return!1;e.done=!0,s(e.id);try{return await e.undo(),m.success(i.current(`undone`,{label:e.label}),{id:e.id,duration:2500}),!0}catch(t){return C(i.current(`failed`),{id:e.id,...t instanceof mr?{detail:t.message}:{}}),!1}},[s]),l=(0,X.useCallback)(e=>{let t=e.projectId??r.current;if(!t)return!1;let n={id:`undo-${++hr}`,projectId:t,label:e.label,undo:e.undo,expiresAt:Date.now()+ur,done:!1};return a.current.push(n),o.current.set(n.id,setTimeout(()=>s(n.id),ur)),m(e.label,{id:n.id,duration:ur,description:e.recoverableDays?i.current(`hintRecoverable`,{keys:I()?`⌘Z`:`Ctrl+Z`,days:e.recoverableDays}):i.current(`hint`,{keys:I()?`⌘Z`:`Ctrl+Z`}),action:{label:i.current(`action`),onClick:()=>{c(n)}},onDismiss:()=>s(n.id),onAutoClose:()=>s(n.id)}),!0},[s,c]),u=(0,X.useCallback)(async()=>{let e=Date.now(),t=a.current.filter(t=>t.projectId===r.current&&t.expiresAt>e),n=t[t.length-1];return n?c(n):!1},[c]),d=(0,X.useCallback)(()=>{let e=Date.now(),t=a.current.filter(t=>t.projectId===r.current&&t.expiresAt>e);return t.length>0?t[t.length-1].label:null},[]);(0,X.useEffect)(()=>{for(let e of[...a.current])e.projectId!==n&&(m.dismiss(e.id),s(e.id))},[n,s]),(0,X.useEffect)(()=>{let e=e=>{if(e.defaultPrevented||!(e.metaKey||e.ctrlKey)||e.altKey||e.shiftKey||e.code!==`KeyZ`||pr(e.target))return;let t=Date.now();a.current.some(e=>e.projectId===r.current&&e.expiresAt>t)&&(e.preventDefault(),u())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[u]),(0,X.useEffect)(()=>()=>{for(let e of o.current.values())clearTimeout(e);o.current.clear()},[]);let f=(0,X.useMemo)(()=>({pushUndo:l,undoLast:u,peekUndo:d}),[l,u,d]);return(0,Z.jsx)(dr.Provider,{value:f,children:e})}var _r=new Map,vr=2e3;function yr(e){_r.set(e,(_r.get(e)??0)+1)}function br(e){(_r.get(e)??0)<=0||setTimeout(()=>{let t=(_r.get(e)??0)-1;t<=0?_r.delete(e):_r.set(e,t)},vr)}function xr(e){return e?(_r.get(e)??0)>0:!1}var Sr=3e3,Cr=`tickets`,wr=`
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Contract Layer
|
|
7
|
+
|
|
8
|
+
`;function Tr(e){return`${b}/api/projects/${encodeURIComponent(e)}`}function Er(e,t){return JSON.stringify(e)===JSON.stringify(t)}function Dr(e,t){let n=new Map(e.map(e=>[e.id,e])),r=t.map(e=>{let t=n.get(e.id);return t&&Er(t,e)?t:e});return r.length===e.length&&r.every((t,n)=>t===e[n])?e:r}function Or(){let{t:e}=v(`tickets`),{t}=v(`undo`),{pushUndo:n}=fr(),{activeProjectId:r}=q(),[i,a]=(0,X.useState)(()=>We(r,Cr)??[]),o=(0,X.useRef)(r),[s,c]=(0,X.useState)(!1),[l,u]=(0,X.useState)(null),[f,p]=(0,X.useState)(new Set),[h,g]=(0,X.useState)(new Set),_=(0,X.useRef)(r);_.current=r;let y=(0,X.useRef)(0),b=(0,X.useRef)(null),x=(0,X.useRef)(new Set),{registerHandler:S,unregisterHandler:C,connectionStatus:w}=d(),T=(0,X.useId)(),E=(0,X.useCallback)(async(e,t)=>{let n=Tr(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??[]},[]),D=(0,X.useCallback)(async(t,n)=>{let r=++y.current;b.current?.abort();let i=new AbortController;b.current=i,_.current===t&&(c(!0),u(null));try{let o=await E(t,i.signal);if(i.signal.aborted||r!==y.current||_.current!==t)return;let s=x.current,c=new Set;if(n===`merge`)for(let e of o)s.size>0&&!s.has(e.id)&&c.add(e.id);x.current=new Set(o.map(e=>e.id)),a(e=>Dr(e,o)),c.size>0&&s.size>0&&(p(c),m.success(e(`toasts.newTicketsAdded`,{count:c.size}),{id:`tickets-added-${t}`}),setTimeout(()=>{_.current===t&&p(e=>{let t=new Set(e);for(let e of c)t.delete(e);return t})},Sr))}catch(e){if(i.signal.aborted||r!==y.current||_.current!==t)return;u(e instanceof Error?e.message:String(e))}finally{r===y.current&&(b.current===i&&(b.current=null),_.current===t&&c(!1))}},[E,e]),O=(0,X.useCallback)(async()=>{r&&await D(r,`merge`)},[r,D]);(0,X.useEffect)(()=>{r&&o.current===r&&Ge(r,Cr,i)},[i,r]),(0,X.useEffect)(()=>{y.current+=1,b.current?.abort(),b.current=null;let e=We(r,Cr)??[];if(o.current=r,a(e),c(!1),u(null),x.current=new Set(e.map(e=>e.id)),p(new Set),g(new Set),r)return D(r,`replace`),()=>{y.current+=1,b.current?.abort(),b.current=null}},[r,D]);let k=(0,X.useCallback)(t=>{let n=t;if(!n||typeof n.type!=`string`)return;let r=_.current;if(!(n.projectId&&n.projectId!==r))switch(n.type){case`desktop.project_recovered`:n.projectId===r&&O();break;case`mcp.activity`:n.affectedProjectId&&n.affectedProjectId===r&&O();break;case`ticket_created`:{if(!n.ticket)break;let t=n.ticket;a(e=>e.some(e=>e.id===t.id)?e:[...e,t]),x.current.add(t.id),p(e=>new Set([...e,t.id])),xr(r)||m.success(e(`toasts.newTicket`,{title:t.title}),{id:`new-ticket-${t.id}`}),setTimeout(()=>{p(e=>{let n=new Set(e);return n.delete(t.id),n})},Sr);break}case`ticket_updated`:{if(!n.ticket)break;if(n.ticket.id===0){O();break}let e=n.ticket;a(t=>t.map(t=>t.id===e.id?e:t)),typeof e.description==`string`&&e.description.includes(wr)&&g(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;a(t=>t.filter(t=>t.id!==e)),x.current.delete(e);break}case`explore.contract_refine_started`:if(n.ticketId==null)break;g(e=>new Set([...e,n.ticketId]));break;case`explore.contract_refine_failed`:{if(n.ticketId==null)break;let e=n.ticketId;g(t=>{if(!t.has(e))return t;let n=new Set(t);return n.delete(e),n});break}}},[O,e]);(0,X.useLayoutEffect)(()=>(S(`tickets-${T}`,k),()=>C(`tickets-${T}`)),[k,S,C,T]);let A=(0,X.useRef)(w);(0,X.useEffect)(()=>{A.current!==`connected`&&w===`connected`&&_.current&&O(),A.current=w},[w,O]);let j=(0,X.useRef)(i);j.current=i;let M=(0,X.useCallback)(async(e,t,n,r=!0)=>{let i=await fetch(`${Tr(e)}/tickets/${t}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n)});return i.ok&&r&&_.current===e&&await D(e,`merge`),i.ok},[D]),N=(0,X.useCallback)(async(e,i)=>{let a=r;if(!a)return!1;let o=j.current.find(t=>t.id===e)?.title??`#${e}`;try{let r=await fetch(`${Tr(a)}/tickets/${e}`,{method:`DELETE`});if(r.ok&&i?.refresh!==!1&&_.current===a&&await D(a,`merge`),r.ok){let r=async()=>{let t=await fetch(`${Tr(a)}/tickets/${e}/restore`,{method:`POST`});if(!t.ok)throw Error(`restore failed: ${t.status}`)};i?.collect?i.collect(r):n({projectId:a,label:t(`specDeleted`,{title:o}),recoverableDays:30,undo:async()=>{await r(),_.current===a&&await D(a,`merge`)}})}return r.ok}catch{return!1}},[r,D,n,t]),P=(0,X.useCallback)(async(i,a,o)=>{let s=r;if(!s)return!1;let c=j.current.find(e=>e.id===i);try{let r=await M(s,i,{status:a},o?.refresh!==!1);if(r&&c&&c.status!==a){let r=c.status;o?.collect?o.collect(async()=>{if(!await M(s,i,{status:r},!1))throw Error(`status undo failed`)}):n({projectId:s,label:t(`statusMoved`,{id:i,status:e(`ticketStatus.${a}`)}),undo:async()=>{if(!await M(s,i,{status:r}))throw Error(`status undo failed`)}})}return r}catch{return!1}},[r,M,n,e,t]),F=(0,X.useCallback)(async(e,t,n)=>{let i=r;if(!i)return!1;let a=j.current.find(t=>t.id===e);try{let r=await fetch(`${Tr(i)}/tickets/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({priority:t})});if(r.ok&&n?.refresh!==!1&&_.current===i&&await D(i,`merge`),r.ok&&n?.collect&&a&&a.priority!==t){let t=a.priority;n.collect(async()=>{if(!await M(i,e,{priority:t},!1))throw Error(`priority undo failed`)})}return r.ok}catch{return!1}},[r,D,M]),I=(0,X.useCallback)(async e=>{let t=r;if(!t)return!1;try{let n=await fetch(`${Tr(t)}/tickets`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});return n.ok&&_.current===t&&await D(t,`merge`),n.ok}catch{return!1}},[r,D]),L=(0,X.useCallback)(async(e,i,a)=>{let o=r;if(!o)return!1;let s=j.current.find(t=>t.id===e);try{let r=await M(o,e,i,a?.refresh!==!1);if(r&&s&&i.labels!==void 0&&JSON.stringify(i.labels)!==JSON.stringify(s.labels)){let r=s.labels??[];a?.collect?a.collect(async()=>{if(!await M(o,e,{labels:r},!1))throw Error(`labels undo failed`)}):n({projectId:o,label:t(`labelsUpdated`,{id:e}),undo:async()=>{if(!await M(o,e,{labels:r}))throw Error(`labels undo failed`)}})}return r}catch{return!1}},[r,M,n,t]),R=(0,X.useCallback)(async(e,t,i,a)=>{let o=r,s=[],c=[];if(!o)return{ok:s,failed:[...e],undoable:!1};let l=[];for(let t of e){let e=!1;try{e=await i(t,{collect:e=>{l.push(e)},refresh:!1})}catch{e=!1}e?s.push(t):c.push(t)}return _.current===o&&await D(o,`merge`),l.length>0&&n({projectId:o,label:t(s.length),recoverableDays:a,undo:async()=>{let e=!1;for(let t of[...l].reverse())try{await t()}catch{e=!0}if(_.current===o&&await D(o,`merge`),e)throw Error(`bulk undo incomplete`)}}),{ok:s,failed:c,undoable:l.length>0}},[r,D,n]);return{tickets:i,loading:s,isLoading:s,error:l,newTicketIds:f,contractRefiningIds:h,refetch:O,refresh:O,deleteTicket:N,updateTicketStatus:P,updateTicketPriority:F,createTicket:I,updateTicket:L,bulkDelete:(0,X.useCallback)(e=>R(e,e=>t(`bulkDeleted`,{count:e}),(e,t)=>N(e,t),30),[R,N,t]),bulkUpdateStatus:(0,X.useCallback)((n,r)=>R(n,n=>t(`bulkStatusMoved`,{count:n,status:e(`ticketStatus.${r}`)}),(e,t)=>P(e,r,t)),[R,P,t,e]),bulkUpdatePriority:(0,X.useCallback)((e,n)=>R(e,e=>t(`bulkPriorityChanged`,{count:e}),(e,t)=>F(e,n,t)),[R,F,t]),bulkUpdateLabels:(0,X.useCallback)((e,n)=>R(e,e=>t(`bulkLabelsUpdated`,{count:e}),async(e,t)=>{let r=j.current.find(t=>t.id===e)?.labels??[],i=[...r.filter(e=>!(n.remove??[]).includes(e))];for(let e of n.add??[])i.includes(e)||i.push(e);return JSON.stringify(i)===JSON.stringify(r)||L(e,{labels:i},t)}),[R,L,t])}}var kr=`specrails-desktop:uiMode`;function Ar(){if(!Xt)return`kanban`;try{return localStorage.getItem(kr)===`kanban`?`kanban`:`agent`}catch{return`agent`}}function jr(e){try{localStorage.setItem(kr,e)}catch{}}var Mr=(0,X.createContext)(null);function Nr({children:e,initialMode:t,persist:n=!0}){let[r]=(0,X.useState)(()=>t??Ar()),[i,a]=(0,X.useState)(r),[o,s]=(0,X.useState)(r),c=(0,X.useRef)(r),l=(0,X.useCallback)((e,t)=>{Xt&&(c.current=e,s(e),t?.immediate?a(e):(0,X.startTransition)(()=>a(e)),n&&jr(e))},[n]),u=(0,X.useCallback)(()=>{Xt&&l(c.current===`kanban`?`agent`:`kanban`)},[l]),d=(0,X.useMemo)(()=>({uiMode:i,requestedMode:o,isPending:o!==i,setUiMode:l,toggleUiMode:u}),[i,o,l,u]);return(0,Z.jsx)(Mr.Provider,{value:d,children:e})}var Pr={uiMode:`kanban`,requestedMode:`kanban`,isPending:!1,setUiMode:()=>{},toggleUiMode:()=>{}};function Fr(){return(0,X.useContext)(Mr)??Pr}var Ir=`spec`,Lr=`review`,Rr=`mission`,zr=`inbox`,Br=`overlay`,Vr=`view`,Hr=[`loops`,`plugins`,`docs`,`analytics`];function Ur(e){return Hr.includes(e??``)?e:null}var Wr=`placePush`;function Gr(e){let t=/^\/review\/([^/]+)\/?$/.exec(e);return t?decodeURIComponent(t[1]):null}function Kr(e){let t=/^\/jobs\/([^/]+)\/?$/.exec(e);return t?decodeURIComponent(t[1]):null}function qr(e,t){let n=new URLSearchParams(e.search),r=e.pathname,i=n.get(`spec`)??``,a=n.get(`review`)??Gr(r)??``,o=n.get(`job`)??Kr(r)??``,s=Ur(n.get(`overlay`))??``;r.startsWith(`/loops`)?s=`loops`:r.startsWith(`/plugins`)&&(s=`plugins`);let c=e.projectId??``,l=n.get(`inbox`)===`1`?`|i=1`:``;if(t===`kanban`)return`k|${c}|${a?`/review/${a}`:o?`/jobs/${o}`:s===`loops`&&!r.startsWith(`/loops`)?`/loops`:s===`plugins`&&!r.startsWith(`/plugins`)?`/plugins`:r}|s=${i}|o=${s===`docs`||s===`analytics`?s:``}${l}`;let u=n.get(`mission`)??``;return`a|${c}|${r.startsWith(`/docs`)?r:`/`}|m=${u}|s=${i}|r=${a}|j=${o}|o=${s}${l}`}function Jr(e){return e!==null&&e.startsWith(`a|`)&&e.includes(`|/|m=|`)}var Yr=0,Xr=1e4;function Zr(){Yr=Date.now()}function Qr(){let e=Yr>0&&Date.now()-Yr<Xr;return Yr=0,e}var $r=50,ei=class{idx=0;entries=new Map;byKey=new Map;dead=new Set;started=!1;record(e,t,n,r){if(!this.started)return this.started=!0,this.idx=typeof r==`number`?r:0,this.put(this.idx,{...t,projectId:n});if(e===`PUSH`){let e=typeof r==`number`&&r>this.idx?r:this.idx+1;for(let t of[...this.entries.keys()])t>=e&&this.drop(t);return this.idx=e,this.put(e,{...t,projectId:n})}if(e===`REPLACE`){let e=this.entries.get(this.idx);return this.put(this.idx,{...t,projectId:e?.projectId??n})}let i=this.byKey.get(t.key)??(typeof r==`number`?r:this.idx);this.idx=i;let a=this.entries.get(i);return a&&a.key===t.key?a:this.put(i,{...t,projectId:a?.projectId??n})}drop(e){let t=this.entries.get(e);t&&this.byKey.delete(t.key),this.entries.delete(e),this.dead.delete(e)}put(e,t){let n=this.entries.get(e);return n&&this.byKey.delete(n.key),this.dead.delete(e),this.entries.set(e,t),this.byKey.set(t.key,e),t}current(){return this.entries.get(this.idx)}at(e){return this.entries.get(e)}adoptProject(e){let t=this.entries.get(this.idx);t&&t.projectId===null&&e&&(t.projectId=e)}markDead(e){this.dead.add(e)}get maxIdx(){let e=this.idx;for(let t of this.entries.keys())t>e&&(e=t);return e}findTarget(e,t){let n=this.entries.get(this.idx),r=n?t(n):null,i=e===-1?Math.max(0,this.idx-$r):this.maxIdx;for(let n=this.idx+e;e===-1?n>=i:n<=i;n+=e){let i=this.entries.get(n);if(!i){if(e===-1)return n;continue}if(this.dead.has(n))continue;let a=t(i);if(a!==null&&a!==r&&!(Jr(a)&&!Jr(r)))return n}return null}recent(e,t=5){let n=this.entries.get(this.idx),r=new Set,i=n?e(n):null;i&&r.add(i);let a=[],o=[...this.entries.keys()].sort((e,t)=>t-e);for(let n of o){if(n===this.idx||this.dead.has(n))continue;let i=this.entries.get(n);if(!i)continue;let o=e(i);if(!(o===null||r.has(o)||Jr(o))&&(r.add(o),a.push({idx:n,entry:i}),a.length>=t))break}return a}list(e,t,n=10){let r=[],i=this.entries.get(this.idx),a=i?t(i):null,o=a,s=e===-1?Math.max(0,this.idx-$r):this.maxIdx;for(let i=this.idx+e;e===-1?i>=s:i<=s;i+=e){let e=this.entries.get(i);if(!e||this.dead.has(i))continue;let s=t(e);if(!(s===null||s===o)&&!(Jr(s)&&!Jr(a))&&(o=s,r.push({idx:i,entry:e}),r.length>=n))break}return r}},ti=(0,X.createContext)(null);function ni(){return(0,X.useContext)(ti)}var ri={spec:[Ir],mission:[Rr],job:[`job`],review:[Lr]};function ii(){try{let e=window.history.state?.idx;return typeof e==`number`?e:void 0}catch{return}}function ai({children:e}){let{t}=v(`nav`),n=i(),r=s(),o=a(),{projects:c,activeProjectId:l,setActiveProjectId:u}=q(),{uiMode:d}=Fr(),[,f]=(0,X.useReducer)(e=>e+1,0),p=(0,X.useRef)(null);p.current||=new ei;let h=p.current,g=(0,X.useRef)(d);g.current=d===`agent`?`agent`:`kanban`;let _=(0,X.useRef)(c);_.current=c;let y=(0,X.useRef)(l);y.current=l;let b=(0,X.useRef)(u);b.current=u;let x=(0,X.useRef)(o);x.current=o;let S=(0,X.useRef)(n);S.current=n;let C=(0,X.useRef)(t);C.current=t;let w=(0,X.useRef)(null),T=(0,X.useRef)(null),E=(0,X.useRef)(null),D=(0,X.useRef)(new Set),O=(0,X.useCallback)(e=>qr(e,g.current),[]);(0,X.useLayoutEffect)(()=>{let e=h.record(r,{key:n.key,pathname:n.pathname,search:n.search},y.current,ii()),t=w.current;if(r===`POP`&&t?T.current={...t,idx:h.idx}:T.current=null,w.current=null,r===`POP`){let t=new URLSearchParams(e.search).get(`p`),n=e.projectId??t;if(n&&n!==y.current){if(_.current.some(e=>e.id===n))E.current=n,b.current(n);else if(_.current.length>0){h.markDead(h.idx);let e=T.current;if(e){let t=h.findTarget(e.dir,O);x.current((t??e.fromIdx)-h.idx)}}}}f()},[n.key]),(0,X.useEffect)(()=>{h.adoptProject(l)},[l,h]),(0,X.useEffect)(()=>{f()},[d]);let k=(0,X.useCallback)(e=>{let t=h.findTarget(e,O);t!==null&&(w.current={dir:e,fromIdx:h.idx},x.current(t-h.idx))},[h,O]),A=(0,X.useCallback)(()=>k(-1),[k]),j=(0,X.useCallback)(()=>k(1),[k]),M=(0,X.useCallback)(e=>{e!==h.idx&&(w.current={dir:e<h.idx?-1:1,fromIdx:h.idx},x.current(e-h.idx))},[h]),N=(0,X.useCallback)(e=>{let t=T.current;if(m(C.current(`places.skipped.${e}`),{duration:3500}),t&&t.idx===h.idx){h.markDead(h.idx),T.current=null;let e=h.findTarget(t.dir,O);w.current={dir:t.dir,fromIdx:t.fromIdx},x.current((e??t.fromIdx)-h.idx);return}let n=S.current,r=new URLSearchParams(n.search);for(let t of ri[e])r.delete(t);let i=r.toString();x.current({pathname:n.pathname,search:i?`?${i}`:``},{replace:!0,state:n.state})},[h,O]),P=(0,X.useCallback)(e=>(D.current.add(e),()=>{D.current.delete(e)}),[]),F=(0,X.useCallback)(e=>{if(e.label)return e.label;let t=C.current,n=new URLSearchParams(e.search),r=(t,n)=>{for(let r of D.current){let i=r(t,n,e.projectId);if(i)return i}return null},i,a=!1,o=n.get(Ir),s=n.get(`review`)??Gr(e.pathname),c=n.get(`job`)??Kr(e.pathname),l=Ur(n.get(Br)),u=n.get(Rr),d=e.pathname;if(n.get(`inbox`)===`1`)i=t(`places.inbox`);else if(o){let e=r(`spec`,o);a=!!e,i=e?t(`places.specTitled`,{id:o,title:e}):t(`places.spec`,{id:o})}else if(s)i=t(`places.review`);else if(c)i=t(`places.job`,{id:c.slice(0,8)});else if(l)i=t(`places.overlays.${l}`);else if(g.current===`agent`&&u&&!d.startsWith(`/docs`)){let e=r(`mission`,u);a=!!e,i=e?t(`places.missionTitled`,{title:e}):t(`places.mission`)}else i=d.startsWith(`/docs`)?t(`places.routes.docs`):d.startsWith(`/loops`)?t(`places.routes.loops`):d.startsWith(`/plugins`)?t(`places.routes.plugins`):d===`/jobs`?t(`places.routes.jobs`):d===`/analytics`?t(`places.routes.analytics`):d===`/activity`?t(`places.routes.activity`):d===`/agents`?t(`places.routes.agents`):d===`/code`?t(`places.routes.code`):d===`/integrations`?t(`places.routes.integrations`):d===`/settings`?t(`places.routes.settings`):g.current===`agent`?t(`places.mission`):t(`places.routes.dashboard`);if(e.projectId&&e.projectId!==y.current){let n=_.current.find(t=>t.id===e.projectId)?.name;n&&(i=t(`places.inProject`,{place:i,project:n}))}return a&&(e.label=i),i},[]),I=(0,X.useCallback)(e=>({idx:e.idx,label:F(e.entry)}),[F]),L=(0,X.useCallback)((e,t=10)=>h.list(e===`back`?-1:1,O,t).map(I),[h,O,I]),R=(0,X.useCallback)((e=5)=>h.recent(O,e*3).filter(({entry:e})=>!e.projectId||e.projectId===y.current).slice(0,e).map(({entry:e})=>{let t=new URLSearchParams(e.search);t.delete(`p`);let n=t.toString();return{to:{pathname:e.pathname,search:n?`?${n}`:``},label:F(e),key:O(e)??e.key}}),[h,O,F]),z=(0,X.useCallback)(e=>E.current===e?(E.current=null,!0):!1,[]);(0,X.useEffect)(()=>{let e=e=>{e.button!==3&&e.button!==4||(e.preventDefault(),e.stopPropagation(),e.button===3?A():j())},t=e=>{(e.button===3||e.button===4)&&e.preventDefault()};return window.addEventListener(`mouseup`,e,!0),window.addEventListener(`mousedown`,t,!0),window.addEventListener(`auxclick`,t,!0),()=>{window.removeEventListener(`mouseup`,e,!0),window.removeEventListener(`mousedown`,t,!0),window.removeEventListener(`auxclick`,t,!0)}},[A,j]);let B=h.list(-1,O,1),V=h.list(1,O,1),H=B[0]?I(B[0]):null,U=V[0]?I(V[0]):null,ee=h.findTarget(-1,O)!==null,te=h.findTarget(1,O)!==null,ne=(0,X.useCallback)(()=>h.current()?.projectId??null,[h]),W=(0,X.useMemo)(()=>({canBack:ee,canForward:te,back:A,forward:j,goTo:M,backTarget:H,forwardTarget:U,list:L,recent:R,reportMissing:N,registerLabelResolver:P,consumeProjectRestore:z,getCurrentEntryProjectId:ne}),[H?.idx,H?.label,U?.idx,U?.label,ee,te,ne,A,j,M,L,R,N,P,z,n.key,d]);return(0,Z.jsx)(ti.Provider,{value:W,children:e})}function oi(e){let t=i(),n=a(),r=(0,X.useRef)(t);r.current=t;let o=(0,X.useRef)(n);o.current=n;let s=(0,X.useCallback)((t,n)=>{let i=r.current,a=new URLSearchParams(i.search);if(a.get(e)===t)return;a.set(e,t);let s=a.toString(),c=i.state&&typeof i.state==`object`?i.state:{};o.current({pathname:i.pathname,search:s?`?${s}`:``},n?.replace?{replace:!0,state:c}:{state:{...c,[Wr]:e}})},[e]),c=(0,X.useCallback)(()=>{let t=r.current,n=new URLSearchParams(t.search);if(!n.has(e))return;let i=t.state&&typeof t.state==`object`?t.state:{};if(i.placePush===e){o.current(-1);return}n.delete(e);let a=n.toString();o.current({pathname:t.pathname,search:a?`?${a}`:``},{replace:!0,state:i})},[e]);return{value:new URLSearchParams(t.search).get(e),open:s,close:c}}var si=(0,X.createContext)({decisions:new Map,hydrated:!0,act:async()=>({status:0,ok:!1,error:`no_provider`}),checkout:async()=>({status:0,ok:!1,error:`no_provider`})});function ci(){return(0,X.useContext)(si)}function li(e,t){return Vt(e,t)}var ui=new Set([`merged`,`discarded`,`completed`,`superseded`]),di=new Set([`create-pr`,`publish`,`discard`,`poll-merge`,`merge-local`,`dismiss`,`reopen`,`acknowledge-no-changes`,`recover-and-retry`]);function fi(e,t){return JSON.stringify(e)===JSON.stringify(t)}function pi({activeProjectId:e,children:t}){let{t:n}=v(`dashboard`),[r,i]=(0,X.useState)(new Map),[a,o]=(0,X.useState)(!1),{registerHandler:s,unregisterHandler:c,connectionStatus:l}=d(),u=(0,X.useRef)(e);(0,X.useEffect)(()=>{u.current=e},[e]);let f=(0,X.useRef)(r),p=(0,X.useRef)(new Map),h=(0,X.useRef)(0),g=(0,X.useRef)(new Set),_=(0,X.useRef)(new Map),y=(0,X.useRef)(new Set),b=(0,X.useRef)(new Map),x=(0,X.useCallback)((e,t=!0)=>{let r=f.current,a=r.get(e.railIndex),o=ui.has(e.decision),s=e.restoredFromDeliveryId??null,c=_.current.get(e.prDeliveryId),l=a?.supersedesDeliveryId===e.prDeliveryId?a.prDeliveryId:null,u=!!(s&&b.current.get(e.prDeliveryId)!==s&&(!c||c===s)&&(!l||l===s));if(a?.prDeliveryId===e.prDeliveryId){let t=Et(a.updatedAt,e.updatedAt);if(t===-1||t===0&&!fi(a,e))return`stale`;if(t===0&&fi(a,e))return`accepted`}if(!o&&(y.current.has(e.prDeliveryId)||g.current.has(e.prDeliveryId))&&!u)return`stale`;let d=!1;if(a&&a.prDeliveryId!==e.prDeliveryId)if(u&&a.prDeliveryId===s)d=!0;else{let t=e.supersedesDeliveryId===a.prDeliveryId,n=a.supersedesDeliveryId===e.prDeliveryId||g.current.has(e.prDeliveryId),r=e.createdAt?Date.parse(e.createdAt):NaN,i=a.createdAt?Date.parse(a.createdAt):NaN;if(n||!t&&!(Number.isFinite(r)&&Number.isFinite(i)&&r>i))return o&&y.current.add(e.prDeliveryId),e.decision===`superseded`&&g.current.add(e.prDeliveryId),o?`untracked`:`stale`;d=!0}if(u&&s&&(y.current.delete(e.prDeliveryId),g.current.delete(e.prDeliveryId),y.current.add(s),b.current.set(e.prDeliveryId,s),_.current.set(e.prDeliveryId,s)),o){if(y.current.add(e.prDeliveryId),e.decision===`superseded`&&g.current.add(e.prDeliveryId),!a||a.prDeliveryId!==e.prDeliveryId)return`untracked`;if(t){if(e.safetyArchives?.length){let t=e.safetyArchives.join(`
|
|
9
|
+
`);m.warning(n(`railPr.safetyArchiveTitle`,{count:e.safetyArchives.length}),{description:`${n(`railPr.safetyArchiveHint`)}\n${t}`,duration:1/0,action:{label:n(`railPr.copySafetyArchive`),onClick:()=>{navigator.clipboard?.writeText(t)}}})}if(e.cleanupWarnings?.length){let t=e.cleanupWarnings.join(`
|
|
10
|
+
`);m.warning(n(`railPr.cleanupIncomplete`,{count:e.cleanupWarnings.length}),{description:`${n(`railPr.cleanupIncompleteHint`)}\n${t}`,duration:1/0,action:{label:n(`railPr.copyCleanupDetails`),onClick:()=>{navigator.clipboard?.writeText(t)}}})}else e.decision===`merged`?m.success(n(`railPr.mergedToast`)):e.decision===`discarded`?m.info(n(`railPr.discardedToast`)):e.decision===`completed`&&m.success(n(`railPr.completedToast`))}}else e.supersedesDeliveryId&&(g.current.add(e.supersedesDeliveryId),_.current.set(e.supersedesDeliveryId,e.prDeliveryId)),d&&a&&g.current.add(a.prDeliveryId);let h=new Map(r);return o?h.delete(e.railIndex):h.set(e.railIndex,e),p.current.set(e.railIndex,(p.current.get(e.railIndex)??0)+1),f.current=h,i(h),`accepted`},[n]),S=(0,X.useCallback)(async(e,t)=>{let n=++h.current,r=new Map(p.current);try{let t=await fetch(`/api/projects/${e}/rails`);if(!t.ok)return;let a=await t.json();if(n!==h.current||u.current!==e)return;let o=new Map;for(let[e,t]of Object.entries(a.prDeliveries??{})){let n=li(t,Number(e)),r=f.current.get(n?.railIndex??Number(e)),i=n?.restoredFromDeliveryId??null,a=n?_.current.get(n.prDeliveryId):void 0,s=n&&r?.supersedesDeliveryId===n.prDeliveryId?r.prDeliveryId:null,c=!!(n&&i&&b.current.get(n.prDeliveryId)!==i&&(!a||a===i)&&(!s||s===i));n&&!ui.has(n.decision)&&(c||!y.current.has(n.prDeliveryId)&&!g.current.has(n.prDeliveryId))&&o.set(Number(e),n)}let s=f.current,c=new Map(o);for(let[e,t]of p.current){if(t===(r.get(e)??0))continue;let n=s.get(e);n?c.set(e,n):c.delete(e)}for(let e of c.values()){e.supersedesDeliveryId&&(g.current.add(e.supersedesDeliveryId),_.current.set(e.supersedesDeliveryId,e.prDeliveryId));let t=e.restoredFromDeliveryId;t&&b.current.get(e.prDeliveryId)!==t&&(!_.current.get(e.prDeliveryId)||_.current.get(e.prDeliveryId)===t)&&(y.current.delete(e.prDeliveryId),g.current.delete(e.prDeliveryId),y.current.add(t),b.current.set(e.prDeliveryId,t),_.current.set(e.prDeliveryId,t))}f.current=c,i(c)}catch{}finally{t&&n===h.current&&u.current===e&&o(!0)}},[]);(0,X.useEffect)(()=>{u.current=e,h.current++;let t=new Map;if(f.current=t,i(t),o(!1),p.current=new Map,g.current=new Set,_.current=new Map,y.current=new Set,b.current=new Map,!e){o(!0);return}S(e,!0)},[e,S]);let C=(0,X.useCallback)(e=>{let t=e;if(!t||t.type!==`rail.pr_state`||t.projectId!==u.current||typeof t.railIndex!=`number`||typeof t.prDeliveryId!=`string`||!t.decision)return;let n=Vt(t,t.railIndex);n&&x(n)},[x]);(0,X.useLayoutEffect)(()=>(s(`rail-pr-decision`,C),()=>c(`rail-pr-decision`)),[C,s,c]),(0,X.useEffect)(()=>{let e=()=>{let e=u.current;e&&S(e,!1)};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[S]);let w=(0,X.useRef)(l);(0,X.useEffect)(()=>{let e=w.current;w.current=l;let t=u.current;t&&l===`connected`&&e!==`connected`&&S(t,!1)},[l,S]);let T=(0,X.useCallback)(async(e,t,n,r,i)=>{let a=f.current.get(e),o=u.current;if(!a||!o)return{status:0,ok:!1,error:`no_delivery`};if(a.prDeliveryId!==r)return{status:409,ok:!1,error:`stale_decision`,current:a.decision,snapshotApplication:`stale`};try{let e=await fetch(`/api/projects/${o}/rails/pr-decision`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({prDeliveryId:a.prDeliveryId,action:t,expectedDecision:n,...i?{repositoryId:i}:{}})}),r=await e.json().catch(()=>({})),s=Vt(r.snapshot),c;return s&&u.current===o?c=x(s):e.status===409&&r.error===`stale_decision`&&u.current===o&&S(o,!1),{...r,snapshot:s,snapshotApplication:c,busy:e.status===409&&r.error===`operation_in_progress`,operation:s?.operation??(typeof r.operation==`string`&&di.has(r.operation)?r.operation:null),status:e.status,ok:e.ok&&r.ok===!0}}catch(e){return{status:0,ok:!1,error:`network`,detail:e.message}}},[x,S]),E=(0,X.useCallback)(async(e,t,n)=>{let r=f.current.get(e),i=u.current;if(!r||!i)return{status:0,ok:!1,error:`no_delivery`};if(r.prDeliveryId!==t)return{status:409,ok:!1,error:`stale_decision`,detail:`The delivery generation changed before checkout.`};try{let e=await fetch(`/api/projects/${i}/rails/pr-checkout`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({prDeliveryId:r.prDeliveryId,...n?{repositoryId:n}:{}})}),t=await e.json().catch(()=>({}));return{...t,status:e.status,ok:e.ok&&t.ok===!0}}catch(e){return{status:0,ok:!1,error:`network`,detail:e.message}}},[]),D=(0,X.useMemo)(()=>({decisions:r,hydrated:a,act:T,checkout:E}),[r,a,T,E]);return(0,Z.jsx)(si.Provider,{value:D,children:t})}async function mi(e,t,n){let r=new FormData;r.append(`file`,t);let i=await fetch(`${h()}/tickets/${e}/attachments`,{method:`POST`,body:r,signal:n});if(!i.ok){let e=await i.json().catch(()=>({}));throw Error(e.error??g.t(`attachments:errors.uploadFailed`,{status:i.status}))}return(await i.json()).attachment}async function hi(e,t){let n=await fetch(`${h()}/tickets/${e}/attachments/${t}`,{method:`DELETE`});if(!n.ok&&n.status!==404)throw Error(g.t(`attachments:errors.deleteFailed`,{status:n.status}))}async function gi(e){let t=await fetch(`${h()}/tickets/${e}/attachments`,{method:`DELETE`});if(!t.ok&&t.status!==404)throw Error(g.t(`attachments:errors.bulkDeleteFailed`,{status:t.status}))}async function _i(e){let t=await fetch(`${h()}/tickets/${e}/attachments`);if(!t.ok)throw Error(g.t(`attachments:errors.listFailed`,{status:t.status}));return(await t.json()).attachments}function vi(e,t){return`${h()}/tickets/${e}/attachments/${t}`}async function yi(e,t){let n=await fetch(vi(e,t));if(!n.ok)throw Error(g.t(`attachments:errors.fetchFailed`,{status:n.status}));return n.blob()}var bi=`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`,xi=new Set(bi.split(`,`).filter(e=>!e.startsWith(`.`))),Si=/\.sql$/i,Ci=/\.(png|jpe?g|gif|webp)$/i;function wi(e){return xi.has(e.type)||Si.test(e.name)||Ci.test(e.name)}function Ti({open:e,onClose:t,filename:n,subtitle:r,src:i,mimeType:a=`image/*`,error:o=null,download:s}){let{t:c}=v(`attachments`),l=a.startsWith(`image/`),u=a===`application/pdf`,d=s===!1?null:s??n,f=(0,X.useRef)(null),p=(0,X.useCallback)(e=>{if(!e)return;let t=document.activeElement;t instanceof HTMLElement&&t!==document.body&&!e.contains(t)&&(f.current=t)},[]);return(0,Z.jsx)(ze,{open:e,onOpenChange:e=>{e||t()},children:(0,Z.jsxs)(Se,{children:[(0,Z.jsx)(we,{className:K(`modal-scrim fixed inset-0 bg-scrim-media backdrop-blur-sm`,je.media)}),(0,Z.jsx)(De,{ref:p,"data-dialog-layer":`media`,onCloseAutoFocus:e=>{let t=f.current;f.current=null,t?.isConnected&&(e.preventDefault(),t.focus())},className:K(`modal-scrim fixed inset-0 flex flex-col outline-none`,je.media),onClick:t,children:(0,Z.jsxs)(Ae,{layer:`media`,children:[(0,Z.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,Z.jsxs)(Ve,{"aria-label":c(`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 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/60`,children:[(0,Z.jsx)(T,{className:`w-4 h-4`,"aria-hidden":!0}),c(`common:actions.back`)]}),(0,Z.jsxs)(`div`,{className:`flex-1 text-center min-w-0 px-4`,children:[(0,Z.jsx)(Te,{className:`text-sm font-medium text-white/95 truncate`,children:n}),r?(0,Z.jsx)(Be,{className:`text-xs text-white/70`,children:r}):(0,Z.jsx)(Be,{className:`sr-only`,children:c(`lightbox.preview`,{name:n})})]}),d===null?(0,Z.jsx)(`span`,{className:`w-px`,"aria-hidden":!0}):(0,Z.jsxs)(`a`,{href:i??`#`,download:d,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 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/60`,"aria-label":c(`lightbox.download`),children:[(0,Z.jsx)(te,{className:`w-4 h-4`,"aria-hidden":!0}),c(`lightbox.download`)]})]}),(0,Z.jsx)(`div`,{className:`flex-1 flex items-center justify-center overflow-auto p-6`,children:o?(0,Z.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,Z.jsx)(`p`,{className:`text-sm`,children:c(`lightbox.loadError`,{error:o})})}):i?l?(0,Z.jsx)(`img`,{src:i,alt:n,onClick:e=>e.stopPropagation(),className:`modal-enter max-h-full max-w-full rounded-lg object-contain shadow-xl`}):u?(0,Z.jsx)(`iframe`,{src:i,title:n,onClick:e=>e.stopPropagation(),className:`w-full h-full max-w-5xl bg-white rounded-lg shadow-xl`}):(0,Z.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,Z.jsx)(`p`,{className:`text-sm mb-3`,children:c(`lightbox.previewUnavailable`)}),(0,Z.jsxs)(`a`,{href:i,download:d??n,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,Z.jsx)(te,{className:`w-4 h-4`,"aria-hidden":!0}),c(`lightbox.downloadFile`,{name:n})]})]}):(0,Z.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,Z.jsx)(`p`,{className:`text-sm`,children:c(`lightbox.loading`)})})})]})})]})})}function Ei({ticketKey:e,attachment:t,onClose:n}){let{t:r}=v(`attachments`),[i,a]=(0,X.useState)(null),[o,s]=(0,X.useState)(null);return(0,X.useEffect)(()=>{if(!t){a(null),s(null);return}let n=!1;return a(null),s(null),yi(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,X.useEffect)(()=>()=>{i&&URL.revokeObjectURL(i)},[i]),(0,Z.jsx)(Ti,{open:t!==null,onClose:n,filename:t?.filename??``,subtitle:t?.mimeType,mimeType:t?.mimeType,src:i,error:o})}function Di(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 Oi(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function ki(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 Ai(e){try{return new Date(e).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})}catch{return e}}function ji({ticketKey:e,attachments:t,onChange:n,className:r}){let{t:i}=v(`attachments`),[a,o]=(0,X.useState)(new Set),[s,c]=(0,X.useState)(null),[l,u]=(0,X.useState)(null);if((0,X.useEffect)(()=>{let r=!1;return _i(e).then(e=>{if(r)return;let i=Di(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 hi(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,Z.jsxs)(`section`,{className:K(`mt-4`,r),"aria-label":i(`section.ariaLabel`),children:[(0,Z.jsxs)(`header`,{className:`flex items-center justify-between mb-2`,children:[(0,Z.jsx)(`h3`,{className:`text-label font-semibold text-muted-foreground`,children:i(`section.title`)}),(0,Z.jsx)(`span`,{className:`text-caption text-muted-foreground`,children:i(`section.fileCount`,{count:d.length})})]}),(0,Z.jsx)(`ul`,{className:`flex flex-col gap-1`,children:d.map(e=>{let t=a.has(e.id);return(0,Z.jsxs)(`li`,{className:K(`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,Z.jsx)(`span`,{"aria-hidden":!0,className:`w-6 text-center text-sm shrink-0`,children:ki(e.mimeType)}),(0,Z.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,Z.jsx)(`span`,{className:`font-medium truncate text-foreground`,children:e.filename}),(0,Z.jsxs)(`span`,{className:`text-caption text-muted-foreground`,children:[Oi(e.size),` · `,Ai(e.addedAt)]})]}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>u(e),className:`text-caption text-primary hover:underline shrink-0`,children:i(`common:actions.open`)}),(0,Z.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,Z.jsx)(`p`,{className:`mt-2 text-xs text-destructive`,children:s}),(0,Z.jsx)(Ei,{ticketKey:e,attachment:l,onClose:()=>u(null)})]})}function Mi({ticketId:e,onClose:t}){let{t:n}=v(`code`),r=a(),{activeProjectId:i}=q(),o=`${i}:${e}`,s=(0,X.useRef)(o);s.current=o;let c=(0,X.useRef)(0),l=(0,X.useRef)(null),[u,d]=(0,X.useState)(null),[f,p]=(0,X.useState)(!1),[m,g]=(0,X.useState)(!1),[_,y]=(0,X.useState)(null),b=(0,X.useCallback)(async(t=null)=>{l.current?.abort();let n=new AbortController;l.current=n;let r=++c.current,i=()=>!n.signal.aborted&&c.current===r&&s.current===o;p(!0),g(!1),y(t);try{let r=new URLSearchParams({ticketId:String(e),limit:`50`});t&&r.set(`cursor`,t);let a=await fetch(`${h()}/code/activity?${r}`,{signal:n.signal});if(!a.ok)throw Error(`activity unavailable`);let s=await a.json();if(!Array.isArray(s.entries))throw Error(`invalid activity response`);if(!i())return;d(e=>{let n=t&&e?.scope===o?[...e.rows]:[],r=new Set(n.map(e=>`${e.repositoryId}\0${e.path}`));for(let e of s.entries){let t=`${e.repositoryId}\0${e.path}`;r.has(t)||(r.add(t),n.push(e))}return{scope:o,rows:n,nextCursor:s.nextCursor,truncated:!!s.truncated||!!t&&!!e?.truncated}})}catch{i()&&g(!0)}finally{i()&&p(!1)}},[o,e]);if((0,X.useEffect)(()=>{if(Kt)return d(null),b(),()=>{l.current?.abort(),c.current++}},[b]),!Kt)return null;let x=u?.scope===o?u:null;return!f&&!m&&x&&!x.rows.length&&!x.truncated&&!x.nextCursor?null:(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-caption font-medium text-muted-foreground block mb-1.5`,children:n(`ticketFiles.title`)}),f&&!x&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,role:`status`,children:n(`ticketFiles.loading`)}),m&&(0,Z.jsxs)(`div`,{className:`text-xs`,role:`alert`,children:[(0,Z.jsx)(`span`,{children:n(`ticketFiles.loadFailed`)}),` `,(0,Z.jsx)(`button`,{type:`button`,onClick:()=>{b(_)},className:`underline`,children:n(`ticketFiles.retry`)})]}),x?.truncated&&(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[n(`ticketFiles.partial`),` `,(0,Z.jsx)(`button`,{type:`button`,disabled:f,onClick:()=>{b()},className:`underline`,children:n(`ticketFiles.retry`)})]}),(0,Z.jsx)(`ul`,{className:`space-y-1`,children:x?.rows.map(e=>(0,Z.jsx)(`li`,{children:(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>{let n=new URLSearchParams({repositoryId:e.repositoryId,path:e.path});e.jobId&&n.set(`changeJobId`,e.jobId),t(),r(`/code?${n}`)},className:`w-full text-left flex items-center gap-2 rounded px-2 py-1 text-xs hover:bg-muted/40`,children:[(0,Z.jsx)(e.kind===`created`?Tn:e.kind===`deleted`?Cn:ce,{className:`h-3.5 w-3.5 text-muted-foreground shrink-0`}),(0,Z.jsx)(`span`,{className:`text-caption text-muted-foreground truncate max-w-24`,title:e.repositoryName,children:e.repositoryName}),(0,Z.jsx)(`span`,{className:`font-mono truncate flex-1`,children:e.path}),e.jobId&&(0,Z.jsxs)(`span`,{className:`inline-flex items-center gap-1 text-caption text-muted-foreground font-mono shrink-0`,title:n(`ticketFiles.jobTitle`,{jobId:e.jobId}),children:[(0,Z.jsx)(Dn,{className:`h-3 w-3`}),e.jobId.length>10?e.jobId.slice(0,10):e.jobId,(0,Z.jsxs)(`span`,{className:`sr-only`,children:[` (`,n(`ticketFiles.jobTitle`,{jobId:e.jobId}),`)`]})]}),(0,Z.jsx)(`span`,{className:`text-caption text-muted-foreground shrink-0`,children:n(`kind.${e.kind}`)})]})},`${e.repositoryId}:${e.path}`))}),x?.nextCursor&&(0,Z.jsx)(`button`,{type:`button`,disabled:f,onClick:()=>{b(x.nextCursor)},className:`text-xs underline mt-2`,children:n(f?`ticketFiles.loading`:`ticketFiles.loadMore`)})]})}var Ni=8e3,Pi=[`change-request`,`review-feedback`,`clarification`,`constraint`],Fi=[`open`,`in_flight`,`applied`,`dismissed`],Ii=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`SpecAddendumValidationError`}};function Li(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ri(e){return typeof e==`string`&&Pi.includes(e)}function zi(e){return typeof e==`string`&&Fi.includes(e)}function Bi(e){if(!Li(e))throw new Ii(`not_object`,`addendum must be an object`);if((e.version===void 0?1:e.version)!==1)throw new Ii(`unsupported_version`,`addendum.version must be 1`);let t=e.kind===void 0||e.kind===null?`change-request`:e.kind;if(!Ri(t))throw new Ii(`invalid_kind`,`addendum.kind must be one of ${Pi.join(`, `)}`);if(e.body!==void 0&&e.body!==null&&typeof e.body!=`string`)throw new Ii(`body_required`,`addendum.body must be a string`);let n=typeof e.body==`string`?e.body.replace(/\r\n?/g,`
|
|
11
|
+
`).trim():``;if(!n)throw new Ii(`body_required`,`addendum.body is required`);if(n.length>8e3)throw new Ii(`body_too_long`,`addendum.body exceeds ${Ni} characters`);if(e.title!==void 0&&e.title!==null&&typeof e.title!=`string`)throw new Ii(`title_required`,`addendum.title must be a string`);let r=typeof e.title==`string`?e.title.replace(/\s+/g,` `).trim():``;if(r||=Vi(n),r.length>200)throw new Ii(`title_too_long`,`addendum.title exceeds 200 characters`);return{kind:t,title:r,body:n}}function Vi(e){let t=e.split(`
|
|
12
|
+
`).map(e=>e.replace(/^[\s#>*-]+/,``).trim()).find(e=>e.length>0)??`Addendum`;return t.length>120?`${t.slice(0,117).trimEnd()}…`:t}function Hi(e){if(!Li(e)||typeof e.id!=`string`||!e.id||typeof e.hash!=`string`||!e.hash)return null;let t;try{t=Bi({version:e.version,kind:e.kind,title:e.title,body:e.body})}catch{return null}let n=zi(e.status)?e.status:`open`,r=e=>typeof e==`string`&&e?e:null;return{id:e.id,version:1,...t,status:n,hash:e.hash,created_at:r(e.created_at)??``,updated_at:r(e.updated_at)??r(e.created_at)??``,created_by:r(e.created_by)??`user`,origin_conversation_id:r(e.origin_conversation_id),run_id:r(e.run_id),applied_at:r(e.applied_at)}}function Ui(e){if(!Array.isArray(e))return[];let t=[],n=new Set;for(let r of e){let e=Hi(r);!e||n.has(e.id)||(n.add(e.id),t.push(e))}return t}function Wi(e){return(e??[]).filter(e=>e.status===`open`)}var Gi={"change-request":kn,"review-feedback":Ln,clarification:dn,constraint:Gn},Ki={open:`border-accent-primary/50 bg-accent-primary/10 text-accent-primary`,in_flight:`border-accent-info/50 bg-accent-info/10 text-accent-info motion-safe:animate-pulse`,applied:`border-accent-success/50 bg-accent-success/10 text-accent-success`,dismissed:`border-border bg-muted/30 text-muted-foreground`},qi=`prose prose-invert prose-xs max-w-none prose-p:my-1 prose-headings:mt-2 prose-headings:mb-1 prose-headings:text-xs prose-headings:font-semibold prose-ul:my-1 prose-ol:my-1 prose-li:my-0 prose-code:text-accent-info prose-code:text-caption prose-code:bg-muted/40 prose-code:px-1 prose-code:py-0.5 prose-code:rounded text-foreground text-xs`,Ji={kind:`change-request`,title:``,body:``};function Yi({ticket:e,onChanged:t}){let{t:n}=v(`tickets`),[r,i]=(0,X.useState)(()=>Ui(e.addenda)),[a,o]=(0,X.useState)(null),[s,c]=(0,X.useState)(null),[l,d]=(0,X.useState)(!1),[f,p]=(0,X.useState)(null),[g,_]=(0,X.useState)(()=>new Set),y=(0,X.useRef)(null);(0,X.useEffect)(()=>{i(Ui(e.addenda))},[e.id,e.updated_at,e.addenda]),(0,X.useEffect)(()=>{a&&y.current?.focus()},[a]);let b=(0,X.useMemo)(()=>Wi(r).length,[r]),x=`${h()}/tickets/${e.id}/addenda`,S=(0,X.useCallback)(e=>{let n=e.ticket?Ui(e.ticket.addenda):null;n&&(i(n),t?.(n))},[t]),w=(0,X.useCallback)(async(e,t,r)=>{d(!0);try{let i=await fetch(t,{method:e,headers:r===void 0?void 0:{"Content-Type":`application/json`},body:r===void 0?void 0:JSON.stringify(r)}),a=await i.json().catch(()=>({}));return i.ok?(S(a),!0):(a.error===`addendum_in_flight`?m.info(n(`addenda.toast.inFlight`)):C(n(`addenda.toast.failed`),{detail:a.detail}),!1)}catch{return C(n(`addenda.toast.failed`)),!1}finally{d(!1)}},[S,n]),T=()=>{c(null),o({...Ji}),p(null)},E=e=>{c(e.id),o({kind:e.kind,title:e.title,body:e.body}),p(null)},D=()=>{o(null),c(null)},O=async()=>{if(!a||!a.body.trim())return;let e={kind:a.kind,title:a.title.trim()||void 0,body:a.body};(s?await w(`PATCH`,`${x}/${encodeURIComponent(s)}`,e):await w(`POST`,x,e))&&(m.success(n(s?`addenda.toast.updated`:`addenda.toast.added`)),D())},k=async(e,t,r=!1)=>{await w(`PATCH`,`${x}/${encodeURIComponent(e.id)}`,r?{status:t,force:!0}:{status:t})&&m.success(n(`addenda.toast.updated`))},A=async e=>{if(f!==e.id){p(e.id);return}p(null),await w(`DELETE`,`${x}/${encodeURIComponent(e.id)}`)&&m.success(n(`addenda.toast.removed`))},j=e=>_(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),M=e=>n(`addenda.who.${e===`agent`||e===`mcp`?e:`user`}`),N=e=>{let t=new Date(e);return Number.isNaN(t.getTime())?``:Je(t,{addSuffix:!0,locale:u()})},P=()=>a&&(0,Z.jsxs)(`div`,{"data-testid":`spec-addenda-form`,className:`rounded-lg border border-accent-primary/30 bg-accent-primary/[0.04] px-3 py-2.5 space-y-2`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsxs)(`label`,{className:`flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,Z.jsx)(`span`,{className:`font-medium`,children:n(`addenda.form.kind`)}),(0,Z.jsx)(`select`,{value:a.kind,onChange:e=>o({...a,kind:e.target.value}),className:`h-6 rounded-md border border-border/60 bg-input px-1.5 text-caption text-foreground outline-none focus:border-accent-primary/50`,"data-testid":`spec-addenda-kind`,children:Pi.map(e=>(0,Z.jsx)(`option`,{value:e,children:n(`addenda.kind.${e}`)},e))})]}),(0,Z.jsx)(`input`,{value:a.title,onChange:e=>o({...a,title:e.target.value}),placeholder:n(`addenda.form.titlePlaceholder`),className:`h-6 min-w-0 flex-1 rounded-md border border-border/60 bg-input px-2 text-caption text-foreground outline-none placeholder:text-muted-foreground focus:border-accent-primary/50`,"data-testid":`spec-addenda-title`})]}),(0,Z.jsx)(`textarea`,{ref:y,value:a.body,maxLength:8e3,onChange:e=>o({...a,body:e.target.value}),onKeyDown:e=>{(e.metaKey||e.ctrlKey)&&e.key===`Enter`&&(e.preventDefault(),O()),e.key===`Escape`&&(e.preventDefault(),D())},placeholder:n(`addenda.form.bodyPlaceholder`),className:`w-full min-h-[96px] rounded-md border border-border/60 bg-input px-2.5 py-1.5 text-xs text-foreground outline-none placeholder:text-muted-foreground focus:border-accent-primary/50 resize-y`,"data-testid":`spec-addenda-body`}),(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Z.jsx)(`span`,{className:`text-caption text-muted-foreground`,children:n(`addenda.form.hint`)}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,Z.jsx)(J,{variant:`ghost`,size:`sm`,className:`h-6 text-caption`,onClick:D,disabled:l,children:n(`addenda.form.cancel`)}),(0,Z.jsxs)(J,{size:`sm`,className:`h-6 text-caption`,onClick:()=>void O(),disabled:l||!a.body.trim(),"data-testid":`spec-addenda-save`,children:[l?(0,Z.jsx)(fe,{className:`mr-1 h-3 w-3 animate-spin`}):(0,Z.jsx)(H,{className:`mr-1 h-3 w-3`}),n(l?`addenda.form.saving`:`addenda.form.save`)]})]})]})]});return(0,Z.jsxs)(`section`,{"data-testid":`spec-addenda-section`,className:`space-y-2`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Z.jsxs)(`span`,{className:`flex items-center gap-1.5 text-label text-muted-foreground`,title:n(`addenda.hint`),children:[(0,Z.jsx)(Fn,{className:`h-3 w-3`}),n(`addenda.title`),r.length>0&&(0,Z.jsx)(`span`,{"data-testid":`spec-addenda-open-count`,className:`rounded-full border px-1.5 py-px text-caption font-semibold normal-case tracking-normal ${b>0?Ki.open:`border-border text-muted-foreground`}`,children:b>0?n(`addenda.openCount`,{count:b}):r.length}),(0,Z.jsxs)(`span`,{className:`sr-only`,children:[` (`,n(`addenda.hint`),`)`]})]}),!a&&(0,Z.jsxs)(`button`,{type:`button`,onClick:T,className:`flex items-center gap-1 text-caption text-muted-foreground transition-colors hover:text-foreground`,"data-testid":`spec-addenda-add`,children:[(0,Z.jsx)(he,{className:`h-2.5 w-2.5`}),n(`addenda.add`)]})]}),a&&!s&&P(),r.length===0&&!a?(0,Z.jsx)(`button`,{type:`button`,onClick:T,className:`w-full rounded-lg border border-dashed border-border/40 bg-muted/10 px-3 py-3 text-left text-caption leading-relaxed text-muted-foreground transition-colors hover:bg-muted/20 hover:text-foreground`,"data-testid":`spec-addenda-empty`,children:n(`addenda.emptyCta`)}):(0,Z.jsx)(`ul`,{className:`space-y-1.5`,children:r.map(e=>{let t=Gi[e.kind],r=g.has(e.id),i=s===e.id&&a,o=e.status===`open`||e.status===`dismissed`,c=e.status===`open`||e.status===`applied`,u=e.status===`dismissed`||e.status===`applied`,d=e.status!==`in_flight`;return(0,Z.jsx)(`li`,{"data-testid":`spec-addendum-${e.id}`,"data-status":e.status,className:`rounded-lg border px-3 py-2 transition-colors ${e.status===`dismissed`?`border-border/30 bg-muted/5 opacity-70`:`border-border/50 bg-muted/15`}`,children:i?P():(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(t,{className:`mt-0.5 h-3.5 w-3.5 shrink-0 text-accent-primary`}),(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>j(e.id),className:`min-w-0 flex-1 text-left`,"aria-expanded":r,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5`,children:[(0,Z.jsx)(`span`,{className:`text-label text-foreground ${e.status===`dismissed`?`line-through`:``}`,children:e.title}),(0,Z.jsx)(`span`,{className:`rounded-full border border-border/50 px-1.5 py-px text-caption text-muted-foreground`,children:n(`addenda.kind.${e.kind}`)}),(0,Z.jsxs)(`span`,{className:`rounded-full border px-1.5 py-px text-caption font-medium ${Ki[e.status]}`,title:n(`addenda.statusHint.${e.status}`),"data-testid":`spec-addendum-status`,children:[n(`addenda.status.${e.status}`),(0,Z.jsxs)(`span`,{className:`sr-only`,children:[` (`,n(`addenda.statusHint.${e.status}`),`)`]})]})]}),!r&&(0,Z.jsx)(`p`,{className:`mt-0.5 line-clamp-2 text-caption leading-snug text-muted-foreground`,children:e.body})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-0.5`,children:[o&&(0,Z.jsx)(`button`,{type:`button`,title:n(`addenda.actions.edit`),"aria-label":n(`addenda.actions.edit`),onClick:()=>E(e),disabled:l,className:`rounded p-1 text-muted-foreground transition-colors hover:bg-muted/40 hover:text-foreground`,children:(0,Z.jsx)(me,{className:`h-3 w-3`})}),e.status===`in_flight`&&(0,Z.jsx)(`button`,{type:`button`,title:n(`addenda.actions.releaseHint`),"aria-label":n(`addenda.actions.release`),onClick:()=>void k(e,`open`,!0),disabled:l,className:`rounded p-1 text-muted-foreground transition-colors hover:bg-muted/40 hover:text-foreground`,"data-testid":`spec-addendum-release`,children:(0,Z.jsx)(re,{className:`h-3 w-3`})}),u&&(0,Z.jsx)(`button`,{type:`button`,title:n(`addenda.actions.reopen`),"aria-label":n(`addenda.actions.reopen`),onClick:()=>void k(e,`open`),disabled:l,className:`rounded p-1 text-muted-foreground transition-colors hover:bg-muted/40 hover:text-foreground`,children:(0,Z.jsx)(re,{className:`h-3 w-3`})}),c&&(0,Z.jsx)(`button`,{type:`button`,title:n(`addenda.actions.dismiss`),"aria-label":n(`addenda.actions.dismiss`),onClick:()=>void k(e,`dismissed`),disabled:l,className:`rounded p-1 text-muted-foreground transition-colors hover:bg-muted/40 hover:text-foreground`,children:(0,Z.jsx)(B,{className:`h-3 w-3`})}),d&&(f===e.id?(0,Z.jsxs)(`span`,{className:`flex items-center gap-0.5`,children:[(0,Z.jsx)(`button`,{type:`button`,title:n(`addenda.actions.confirmDelete`),"aria-label":n(`addenda.actions.confirmDelete`),onClick:()=>void A(e),disabled:l,className:`rounded p-1 text-destructive transition-colors hover:bg-destructive/10`,children:(0,Z.jsx)(H,{className:`h-3 w-3`})}),(0,Z.jsx)(`button`,{type:`button`,"aria-label":n(`addenda.form.cancel`),onClick:()=>p(null),className:`rounded p-1 text-muted-foreground transition-colors hover:bg-muted/40`,children:(0,Z.jsx)(be,{className:`h-3 w-3`})})]}):(0,Z.jsx)(`button`,{type:`button`,title:n(`addenda.actions.delete`),"aria-label":n(`addenda.actions.delete`),onClick:()=>void A(e),disabled:l,className:`rounded p-1 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive`,children:(0,Z.jsx)(de,{className:`h-3 w-3`})}))]})]}),r&&(0,Z.jsxs)(`div`,{className:`mt-2 space-y-1.5 pl-5`,children:[(0,Z.jsx)(`div`,{className:qi,"data-testid":`spec-addendum-body`,children:(0,Z.jsx)(Ke,{remarkPlugins:[qe],children:e.body})}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-2 gap-y-0.5 text-caption text-muted-foreground`,children:[(0,Z.jsxs)(`span`,{children:[N(e.created_at),` · `,n(`addenda.meta.by`,{who:M(e.created_by)})]}),e.run_id&&(0,Z.jsx)(`span`,{className:`font-mono`,children:n(`addenda.meta.run`,{id:e.run_id.slice(0,8)})}),e.applied_at&&(0,Z.jsx)(`span`,{children:n(`addenda.meta.applied`,{when:N(e.applied_at)})}),(0,Z.jsx)(`span`,{className:`font-mono`,children:n(`addenda.meta.hash`,{hash:e.hash.slice(0,12)})})]})]})]})},e.id)})})]})}var Xi=[`spec_edit`,`addendum`,`mission_turn`,`job`,`phase`,`audit`,`pr_event`,`review`];async function Zi(e,t={}){let n=new URLSearchParams;t.kinds&&t.kinds.length>0&&n.set(`kinds`,t.kinds.join(`,`)),t.cursor&&n.set(`cursor`,t.cursor),t.limit&&n.set(`limit`,String(t.limit));let r=n.toString(),i=await fetch(`${h()}/tickets/${e}/timeline${r?`?${r}`:``}`,{signal:t.signal});if(!i.ok)throw Error(`timeline ${i.status}`);return await i.json()}function Qi(e){let t=new Date(e);return Number.isNaN(t.getTime())?`unknown`:`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`}function $i(e){let t=[];for(let n of e){let e=Qi(n.at),r=t[t.length-1];r&&r.key===e?r.entries.push(n):t.push({key:e,at:n.at,entries:[n]})}return t}function ea(e){return e.event===`review.verdict`?`timeline.events.review_${String(e.params.verdict??`recorded`)}`:`timeline.events.${e.event.replace(/\./g,`_`)}`}function ta(e){if(e.event===`mission.turns`)return Number(e.params.turns??e.count??0);if(e.event===`phase.group`||e.event===`audit.group`)return Number(e.params.count??e.count??0)}function na(e,t){return e.provider&&t.has(e.provider)?typeof e.turns==`number`&&e.turns>0?{kind:`turns`,turns:e.turns}:null:typeof e.costUsd==`number`?{kind:e.costKind===`estimated`?`estimated`:`billed`,usd:e.costUsd}:null}function ra(e,t,n){if(!e||e.place===`spec`)return null;let r=new URLSearchParams(n);return r.delete(Ir),e.place===`mission`?{pathname:`/`,search:`?${new URLSearchParams({[Rr]:e.id}).toString()}`,needsAgentMode:t!==`agent`,place:`mission`}:t===`kanban`?{pathname:e.place===`review`?`/review/${encodeURIComponent(e.id)}`:`/jobs/${encodeURIComponent(e.id)}`,search:``,needsAgentMode:!1,place:e.place}:(r.delete(e.place===`review`?`job`:Lr),r.set(e.place===`review`?Lr:`job`,e.id),{pathname:`/`,search:`?${r.toString()}`,needsAgentMode:!1,place:e.place})}var ia={spec_edit:me,addendum:Yn,mission_turn:N,job:le,phase:L,audit:M,pr_event:jn,review:pn},aa={neutral:`text-muted-foreground border-border/60`,ok:`text-accent-success border-accent-success/40`,failure:`text-destructive border-destructive/40`,review:`text-accent-review border-accent-review/40`},oa=40,sa=new Set([`job`,`mission_turn`,`addendum`]);function ca(){let[e,t]=(0,X.useState)(()=>new Set);return(0,X.useEffect)(()=>{let e=!1,n=tt(),r=n=>{e||t(new Set(nt(n)))};return n.fresh?r(n.fresh):n.load().then(r).catch(()=>{}),()=>{e=!0}},[]),e}function la(e,t,n){let r=new Date,i=e=>String(e).padStart(2,`0`),a=e=>`${e.getFullYear()}-${i(e.getMonth()+1)}-${i(e.getDate())}`;if(e===a(r))return n(`timeline.today`);let o=new Date(r);if(o.setDate(r.getDate()-1),e===a(o))return n(`timeline.yesterday`);let s=new Date(t);if(Number.isNaN(s.getTime()))return e;try{return new Intl.DateTimeFormat(f(),{weekday:`short`,day:`numeric`,month:`short`,year:s.getFullYear()===r.getFullYear()?void 0:`numeric`}).format(s)}catch{return e}}function ua(e){let t=new Date(e);if(Number.isNaN(t.getTime()))return``;try{return new Intl.DateTimeFormat(f(),{hour:`2-digit`,minute:`2-digit`}).format(t)}catch{return``}}function da({ticketId:e,refreshKey:t,onNavigate:n,uiMode:r,currentSearch:i,onOpenExternal:a}){let{t:o}=v(`tickets`),{activeProjectId:s}=q(),c=ca(),[l,u]=(0,X.useState)(()=>new Set),[d,f]=(0,X.useState)([]),[p,m]=(0,X.useState)(null),[h,g]=(0,X.useState)(null),[_,y]=(0,X.useState)(`loading`),[b,x]=(0,X.useState)(!1),[S,C]=(0,X.useState)(()=>new Set),[w,T]=(0,X.useState)(0),E=(0,X.useMemo)(()=>Xi.filter(e=>l.has(e)).join(`,`),[l]),D=(0,X.useRef)(0);(0,X.useEffect)(()=>{if(!s)return;let t=new AbortController,n=++D.current;return y(e=>e===`ready`?e:`loading`),Zi(e,{kinds:E?E.split(`,`):[],limit:oa,signal:t.signal}).then(e=>{n===D.current&&(f(e.entries),m(e.counts),g(e.nextCursor),y(`ready`))}).catch(e=>{t.signal.aborted||n!==D.current||y(`error`)}),()=>t.abort()},[e,s,E,t,w]);let O=(0,X.useCallback)(()=>{!h||b||(x(!0),Zi(e,{kinds:E?E.split(`,`):[],cursor:h,limit:oa}).then(e=>{f(t=>{let n=new Set(t.map(e=>e.id));return[...t,...e.entries.filter(e=>!n.has(e.id))]}),g(e.nextCursor)}).catch(()=>y(`error`)).finally(()=>x(!1)))},[e,E,h,b]),k=e=>{u(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},A=e=>{C(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},j=(0,X.useMemo)(()=>$i(d),[d]),N=p?Xi.reduce((e,t)=>e+p[t],0):0,P=Xi.filter(e=>(p?p[e]>0:!1)||l.has(e));return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4`,"data-testid":`spec-timeline`,children:[P.length>0&&(0,Z.jsx)(`div`,{role:`group`,"aria-label":o(`timeline.filters.aria`),className:`flex flex-wrap items-center gap-1.5`,"data-testid":`spec-timeline-filters`,children:P.map(e=>{let t=l.has(e);return(0,Z.jsxs)(`button`,{type:`button`,"aria-pressed":t,"data-chip":``,"data-testid":`spec-timeline-filter-${e}`,onClick:()=>k(e),className:K(`inline-flex items-center gap-1 rounded-full border px-2 py-0.5 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,t?`border-accent-primary/60 bg-accent-primary/15 text-foreground`:`border-border/60 text-muted-foreground hover:text-foreground hover:bg-surface/50`),children:[o(`timeline.kinds.${e}`),(0,Z.jsx)(`span`,{className:`tabular-nums text-muted-foreground`,children:p?.[e]??0})]},e)})}),_===`loading`&&d.length===0&&(0,Z.jsxs)(`div`,{className:`space-y-2`,"data-testid":`timeline-loading`,children:[(0,Z.jsx)(it,{running:!0,"aria-label":o(`timeline.loading`)}),(0,Z.jsx)(`p`,{className:`text-body text-muted-foreground`,children:o(`timeline.loading`)})]}),_===`error`&&(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded-card border border-destructive/40 px-3 py-2`,role:`alert`,children:[(0,Z.jsx)(`p`,{className:`text-body text-destructive`,children:o(`timeline.error`)}),(0,Z.jsx)(J,{variant:`outline`,size:`sm`,onClick:()=>T(e=>e+1),children:o(`timeline.retry`)})]}),_===`ready`&&d.length===0&&(N===0?(0,Z.jsx)(et,{"data-testid":`spec-timeline-empty`,icon:(0,Z.jsx)(M,{className:`h-5 w-5`}),title:o(`timeline.empty.title`),description:o(`timeline.empty.description`),action:(0,Z.jsxs)(J,{variant:`outline`,size:`sm`,onClick:()=>T(e=>e+1),children:[(0,Z.jsx)(ge,{className:`mr-1.5 h-3.5 w-3.5`,"aria-hidden":!0}),o(`timeline.empty.refresh`)]}),learnMore:`specTimeline`}):(0,Z.jsx)(`p`,{className:`text-body text-muted-foreground`,"data-testid":`spec-timeline-filtered-empty`,children:o(`timeline.empty.filtered`)})),j.map(e=>(0,Z.jsxs)(`section`,{"aria-label":la(e.key,e.at,o),"data-testid":`spec-timeline-day`,children:[(0,Z.jsx)(`h3`,{className:`mb-2 text-label text-muted-foreground`,children:la(e.key,e.at,o)}),(0,Z.jsx)(`ol`,{className:`relative ml-3 space-y-3 border-l border-border/50 pl-5`,children:e.entries.map(e=>(0,Z.jsx)(fa,{entry:e,plan:c,open:S.has(e.id),onToggle:()=>A(e.id),onNavigate:n,uiMode:r,currentSearch:i,onOpenExternal:a},e.id))})]},e.key)),h&&(0,Z.jsx)(`div`,{children:(0,Z.jsxs)(J,{variant:`outline`,size:`sm`,onClick:O,disabled:b,"data-testid":`spec-timeline-more`,children:[b&&(0,Z.jsx)(fe,{className:`mr-1.5 h-3.5 w-3.5 animate-spin`,"aria-hidden":!0}),o(`timeline.loadMore`)]})})]})}function fa({entry:e,plan:t,open:n,onToggle:r,onNavigate:i,uiMode:a,currentSearch:o,onOpenExternal:s}){let{t:c}=v(`tickets`),l=ia[e.kind],u=ta(e),d=c(ea(e),{count:u,defaultValue:e.title}),f=sa.has(e.kind),p=f?e.title:d,m=f?d:e.summary,h=ra(e.link,a,o),g=na(e,t),_=e.actor?e.actor.type===`agent`&&e.actor.label&&e.actor.label!==`agent`?c(`timeline.agentRoles.${e.actor.label}`,{defaultValue:e.actor.label}):c(`timeline.actors.${e.actor.type}`):null,y=e.items??[],b=f&&e.tone===`failure`&&!!e.summary,x=y.length>0||f&&!b&&!!e.summary,S=e.event===`phase.group`?Number(e.params.failed??0):0,C=e.event===`review.verdict`?Number(e.params.findings??0):0,w=h?c(`timeline.links.${h.place}`):null;return(0,Z.jsxs)(`li`,{className:`relative`,"data-testid":`spec-timeline-entry`,"data-kind":e.kind,"data-tone":e.tone,"data-entry-id":e.id,children:[(0,Z.jsx)(`span`,{className:K(`absolute -left-[1.85rem] top-0.5 grid h-5 w-5 place-items-center rounded-full border bg-popover`,aa[e.tone]),"aria-hidden":!0,children:(0,Z.jsx)(l,{className:`h-3 w-3`})}),(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsxs)(`p`,{className:`break-words text-body text-foreground`,children:[e.tone!==`neutral`&&(0,Z.jsxs)(`span`,{className:`sr-only`,children:[c(`timeline.tone.${e.tone}`),`: `]}),p]}),(0,Z.jsxs)(`p`,{className:`flex flex-wrap items-center gap-x-2 text-label text-muted-foreground`,children:[(0,Z.jsx)(`time`,{dateTime:e.at,children:ua(e.at)}),_&&(0,Z.jsx)(`span`,{children:_}),m&&(0,Z.jsx)(`span`,{className:K(`min-w-0 break-words`,e.tone===`failure`&&!f&&`text-destructive`),children:m}),b&&(0,Z.jsx)(`span`,{className:`min-w-0 break-words text-destructive`,children:e.summary}),S>0&&(0,Z.jsx)(`span`,{className:`text-destructive`,children:c(`timeline.phaseFailed`,{count:S})}),C>0&&(0,Z.jsx)(`span`,{className:`text-accent-review`,children:c(`timeline.findings`,{count:C})}),g?.kind===`billed`&&(0,Z.jsxs)(`span`,{title:c(`timeline.cost.billedTitle`),children:[c(`timeline.cost.billed`,{amount:rt(g.usd)}),(0,Z.jsxs)(`span`,{className:`sr-only`,children:[` (`,c(`timeline.cost.billedTitle`),`)`]})]}),g?.kind===`estimated`&&(0,Z.jsxs)(`span`,{title:c(`timeline.cost.estimatedTitle`),children:[c(`timeline.cost.estimated`,{amount:rt(g.usd)}),(0,Z.jsxs)(`span`,{className:`sr-only`,children:[` (`,c(`timeline.cost.estimatedTitle`),`)`]})]}),g?.kind===`turns`&&(0,Z.jsx)(`span`,{children:c(`timeline.cost.turns`,{count:g.turns})})]})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1`,children:[e.url&&s&&/^https?:\/\//i.test(e.url)&&(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>s(e.url),className:`inline-flex items-center gap-1 rounded-md px-1.5 py-0.5 text-label text-muted-foreground hover:bg-surface/50 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,"aria-label":c(`timeline.links.pr`),"data-testid":`spec-timeline-pr-link`,children:[(0,Z.jsx)(O,{className:`h-3.5 w-3.5`,"aria-hidden":!0}),`PR`]}),h&&w&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>i(h),className:`inline-flex items-center gap-1 rounded-md px-1.5 py-0.5 text-label text-muted-foreground hover:bg-surface/50 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,"aria-label":w,title:w,"data-testid":`spec-timeline-link`,"data-place":h.place,children:(0,Z.jsx)(O,{className:`h-3.5 w-3.5`,"aria-hidden":!0})}),x&&(0,Z.jsx)(`button`,{type:`button`,onClick:r,"aria-expanded":n,"aria-label":c(n?`timeline.collapse`:`timeline.expand`),title:c(n?`timeline.collapse`:`timeline.expand`),className:`rounded-md p-0.5 text-muted-foreground hover:bg-surface/50 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,"data-testid":`spec-timeline-expand`,children:n?(0,Z.jsx)(V,{className:`h-4 w-4`,"aria-hidden":!0}):(0,Z.jsx)(U,{className:`h-4 w-4`,"aria-hidden":!0})})]})]}),n&&(0,Z.jsxs)(`div`,{className:`mt-1.5 space-y-1 rounded-card border border-border/40 bg-card/40 px-3 py-2`,"data-testid":`spec-timeline-details`,children:[f&&!b&&e.summary&&(0,Z.jsx)(`p`,{className:`break-words text-label text-muted-foreground`,children:e.summary}),(0,Z.jsx)(`ul`,{className:`space-y-0.5`,children:y.map((e,t)=>(0,Z.jsxs)(`li`,{className:`flex flex-wrap items-baseline gap-x-2 text-label`,children:[e.at&&(0,Z.jsx)(`time`,{dateTime:e.at,className:`tabular-nums text-muted-foreground`,children:ua(e.at)}),(0,Z.jsx)(`span`,{className:K(`break-words`,e.tone===`failure`?`text-destructive`:e.tone===`review`?`text-accent-review`:`text-foreground`),children:e.label}),e.detail&&(0,Z.jsx)(`code`,{className:`break-all text-muted-foreground`,children:e.detail})]},`${e.label}-${t}`))}),e.kind!==`audit`&&typeof e.count==`number`&&e.count>y.length&&(0,Z.jsxs)(`p`,{className:`text-label text-muted-foreground`,children:[`+`,e.count-y.length]})]})]})}async function pa(e,t,n=`text/plain;charset=utf-8`){if(l())try{let{invoke:n}=await r(async()=>{let{invoke:e}=await import(`./core-BozBzB6Y.js`).then(e=>e.i);return{invoke:e}},__vite__mapDeps([0,1]));return await n(`desktop_save_text`,{suggestedName:e,text:t})===!1?`cancelled`:`saved`}catch{return`failed`}try{let r=URL.createObjectURL(new Blob([t],{type:n})),i=document.createElement(`a`);return i.href=r,i.download=e,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r),`saved`}catch{return`failed`}}async function ma(){try{let e=tt();return nt(e.fresh??await e.load())}catch{return[]}}async function ha(e,t){let n=new URLSearchParams({format:t,locale:f()}),r=await ma();r.length>0&&n.set(`planProviders`,r.join(`,`));let i=await fetch(`${h()}/tickets/${e}/handoff?${n.toString()}`);if(!i.ok)throw Error(`handoff ${i.status}`);return await i.json()}function ga(e,t){return t>0?e(`timeline.export.redacted`,{count:t}):void 0}async function _a(e,t,n){try{let r=await ha(e,t),i=await pa(r.filename,r.body,r.contentType);i===`saved`?m.success(n(`timeline.export.saved`,{id:e}),{description:ga(n,r.redactions)}):i===`failed`&&C(n(`timeline.export.failed`))}catch{C(n(`timeline.export.failed`))}}async function va(e,t){let n;try{n=await ha(e,`pr`)}catch{C(t(`timeline.export.failed`));return}await mt(n.body)?m.success(t(`timeline.export.copied`,{id:e}),{description:ga(t,n.redactions)}):C(t(`timeline.export.copyFailed`))}var ya=new Map,ba=new Set,xa=0;function Sa(){xa+=1;for(let e of ba)e()}function Ca(e){return ba.add(e),()=>{ba.delete(e)}}function wa(e,t){return ya.set(e,t),Sa(),()=>{ya.get(e)===t&&(ya.delete(e),Sa())}}function Ta(){let e=(0,X.useSyncExternalStore)(Ca,()=>xa,()=>0),t=(0,X.useRef)({v:-1,value:{}});return t.current.v!==e&&(t.current={v:e,value:Object.fromEntries(ya)}),t.current.value}function Ea(e,t){let n=(0,X.useRef)(t);n.current=t;let r=t!==null;(0,X.useEffect)(()=>{if(!r)return;let t={};for(let e of Object.keys(n.current))t[e]=(...t)=>n.current[e](...t);return wa(e,t)},[e,r])}function Da(e){return rt(e)}function Oa(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 ka({ticketId:e}){let{t}=v(`tickets`),[n,r]=(0,X.useState)(null),i=a(),{activeProjectId:o}=q(),{closeTicketDetail:s}=Tc();if((0,X.useEffect)(()=>{let t=new AbortController;return r(null),fetch(`${h()}/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:A[e].toLowerCase()})).join(`, `),l=n.unpricedRuns??0,u=n.pricedRuns??Math.max(0,n.totalRuns-l),d=l>0&&u===0,f=l>0&&u>0,p=n.turnsUnavailableRuns??0,m=n.totalTurns==null||p>0&&(n.turnsReportedRuns??0)===0,g=!m&&p>0;return(0,Z.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-xs text-muted-foreground hover:text-foreground transition-colors cursor-pointer`,"aria-label":t(`spendingLine.ariaLabel`),children:[(0,Z.jsxs)(`span`,{className:`num 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?`≥`:``}${Da(n.totalCostUsd)}`,(d?t(`spendingLine.costUnavailableTooltip`):f?t(`spendingLine.costPartiallyUnavailableTooltip`):(n.estimatedCostUsd??0)>0&&t(`spendingLine.estimatedTooltip`))?(0,Z.jsxs)(`span`,{className:`sr-only`,children:[` (`,d?t(`spendingLine.costUnavailableTooltip`):f?t(`spendingLine.costPartiallyUnavailableTooltip`):(n.estimatedCostUsd??0)>0?t(`spendingLine.estimatedTooltip`):void 0,`)`]}):null]}),(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`·`}),(0,Z.jsxs)(`span`,{className:`num`,"data-testid":m?`ticket-turns-unavailable`:void 0,title:m?t(`spendingLine.turnsUnavailableTooltip`):g?t(`spendingLine.turnsPartiallyUnavailableTooltip`):void 0,children:[m?`—`:t(g?`spendingLine.turnsAtLeast`:`spendingLine.turns`,{count:n.totalTurns}),(m?t(`spendingLine.turnsUnavailableTooltip`):g&&t(`spendingLine.turnsPartiallyUnavailableTooltip`))?(0,Z.jsxs)(`span`,{className:`sr-only`,children:[` (`,m?t(`spendingLine.turnsUnavailableTooltip`):g?t(`spendingLine.turnsPartiallyUnavailableTooltip`):void 0,`)`]}):null]}),(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`·`}),(0,Z.jsx)(`span`,{className:`num`,children:t(`spendingLine.active`,{duration:Oa(n.activeDurationMs)})}),c&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`·`}),(0,Z.jsx)(`span`,{children:c})]}),(0,Z.jsx)(D,{className:`w-3 h-3 opacity-0 group-hover:opacity-100 transition-opacity`})]})}var Aa={primary:`bg-accent-primary`,success:`bg-accent-success`,info:`bg-accent-info`,warning:`bg-accent-warning`,destructive:`bg-destructive`,muted:`bg-muted-foreground`},ja={xs:`h-1.5 w-1.5`,sm:`h-2 w-2`,md:`h-2.5 w-2.5`};function Ma({tone:e=`primary`,pulsing:t=!0,size:n=`sm`,dotClassName:r,className:i,...a}){let o=lr(),s=r??Aa[e],c=ja[n];return(0,Z.jsxs)(`span`,{className:K(`relative flex shrink-0`,c,i),...a,children:[t&&!o&&(0,Z.jsx)(`span`,{"data-live-ring":``,"aria-hidden":`true`,className:K(`u-lamp-ring absolute inline-flex h-full w-full rounded-full`,s)}),(0,Z.jsx)(`span`,{className:K(`relative inline-flex rounded-full`,c,s)})]})}var Na={draft:{dotClass:`bg-accent-secondary/60`,textClass:`text-accent-secondary`,labelKey:`common:status.draft`,pulsing:!1},todo:{dotClass:`bg-muted-foreground/70`,textClass:`text-muted-foreground`,labelKey:`status.todo`,pulsing:!1},in_progress:{dotClass:`bg-accent-info`,textClass:`text-foreground font-semibold`,labelKey:`status.inProgress`,pulsing:!0},on_review:{dotClass:`bg-accent-review`,textClass:`text-accent-review`,labelKey:`status.onReview`,pulsing:!1},done:{dotClass:`text-accent-success`,textClass:`text-accent-success`,labelKey:`status.done`,pulsing:!1},cancelled:{dotClass:`text-destructive`,textClass:`text-muted-foreground`,labelKey:`status.cancelled`,pulsing:!1}};function Pa({status:e,className:t,pulsing:n=!0}){let{t:r}=v(`specs`),i=Na[e];return e===`done`?(0,Z.jsx)(H,{className:K(`w-3.5 h-3.5 shrink-0`,i.dotClass,t),"aria-label":r(`status.done`)}):e===`cancelled`?(0,Z.jsx)(be,{className:K(`w-3.5 h-3.5 shrink-0`,i.dotClass,t),"aria-label":r(`status.cancelled`)}):i.pulsing&&n?(0,Z.jsx)(Ma,{size:`md`,dotClassName:i.dotClass,className:t,"aria-label":r(`status.inProgress`)}):(0,Z.jsx)(`span`,{className:K(`inline-flex rounded-full h-2.5 w-2.5 shrink-0`,i.dotClass,t),"aria-label":r(i.labelKey)})}function Fa({status:e,className:t}){let{t:n}=v(`specs`),r=Na[e];return(0,Z.jsxs)(`span`,{className:K(`inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full text-caption font-medium border`,e===`todo`&&`bg-muted border-border text-muted-foreground`,e===`in_progress`&&`bg-accent-info/10 border-accent-info/30 text-accent-info`,e===`on_review`&&`bg-accent-review/10 border-accent-review/30 text-accent-review`,e===`done`&&`bg-accent-success/10 border-accent-success/30 text-accent-success`,e===`cancelled`&&`bg-destructive/10 border-destructive/30 text-destructive`,t),children:[(0,Z.jsx)(Pa,{status:e}),n(r.labelKey)]})}function Ia(){let{activeProjectId:e}=q(),[t,n]=(0,X.useState)({connected:!1,key:null,discardStatus:null}),[r,i]=(0,X.useState)(!0);return(0,X.useEffect)(()=>{if(!qt||!e){n({connected:!1,key:null,discardStatus:null}),i(!1);return}let t=!1;return i(!0),at.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}}var La=[`todo`,`in_progress`,`done`,`cancelled`],Ra={draft:`ticketStatus.draft`,todo:`ticketStatus.todo`,in_progress:`ticketStatus.inProgress`,on_review:`ticketStatus.onReview`,done:`ticketStatus.done`,cancelled:`ticketStatus.cancelled`};function za(e,t){return t&&e.source===`jira`&&!!e.jira_key}async function Ba(e,t,n,r){try{return await at.moveSpecToStatus(e,t),r?.quiet||m.success(n(`moveToStatus.queued`,{status:t})),!0}catch{return r?.quiet||C(n(`moveToStatus.failed`)),!1}}function Va({open:e,onOpenChange:t,ticket:n,discardStatus:r,onDiscarded:i}){let{t:a}=v(`jira`),[o,s]=(0,X.useState)(``),[c,l]=(0,X.useState)(!1);async function u(){l(!0);try{await at.discardSpec(n.id,o.trim()||null),m.success(a(`discard.movedToast`,{status:r,key:n.jira_key??`#${n.id}`})),t(!1),s(``),i?.()}catch(e){C(a(`errors.generic`),{detail:e instanceof Error?e.message:void 0})}finally{l(!1)}}return(0,Z.jsx)(pe,{open:e,onOpenChange:t,tone:`default`,busy:c,testId:`jira-discard-dialog`,confirmTestId:`jira-discard-confirm`,title:a(`discard.title`,{status:r}),description:a(`discard.body`,{status:r,key:n.jira_key??`#${n.id}`}),cancelLabel:a(`wizard.cancel`),confirmLabel:c?a(`discard.moving`):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(D,{className:`mr-1.5 h-3.5 w-3.5`,"aria-hidden":!0}),a(`discard.confirm`,{status:r})]}),onConfirm:u,children:(0,Z.jsxs)(`label`,{className:`block space-y-1`,children:[(0,Z.jsx)(`span`,{className:`text-xs font-medium text-foreground`,children:a(`discard.commentLabel`)}),(0,Z.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`})]})})}var Ha=/^\d{4}-\d{2}-\d{2}T/;function Ua(e){if(Ha.test(e))try{return{text:Je(j(e),{addSuffix:!0,locale:u()}),title:e}}catch{}return{text:e}}function Wa({localId:e}){let{t}=v(`jira`),{activeProjectId:n}=q(),r=Ia(),[i,a]=(0,X.useState)(null);if((0,X.useEffect)(()=>{if(!qt||!r.connected)return;let t=!1;return a(null),at.getSpecDetails(e).then(e=>{t||a(e)}).catch(()=>{t||a(null)}),()=>{t=!0}},[e,n,r.connected]),!qt||!r.connected||!i)return null;let o=i.development,s=i.fields.length>0,l=o.pullRequests.length>0,u=o.branches.length>0,d=(o.commits?.length??0)>0;return!s&&!l&&!u&&!d?null:(0,Z.jsxs)(`div`,{className:`space-y-4`,"data-testid":`jira-details-panel`,children:[s&&(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground block mb-1.5`,children:t(`detail.detailsTitle`)}),(0,Z.jsx)(`div`,{className:`space-y-1.5`,children:i.fields.map((e,t)=>{let n=Ua(e.value);return(0,Z.jsxs)(`div`,{className:`text-xs`,children:[(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground block`,children:e.label}),e.href?(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>{c(e.href)},className:`inline-flex items-center gap-1 text-accent-info hover:underline text-left`,children:[(0,Z.jsx)(`span`,{className:`truncate`,children:e.value}),(0,Z.jsx)(se,{className:`w-3 h-3 shrink-0`})]}):(0,Z.jsx)(`span`,{className:`text-foreground whitespace-pre-line`,title:n.title,children:n.text})]},`${e.label}-${t}`)})})]}),(l||u||d)&&(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground block mb-1.5`,children:t(`detail.developmentTitle`)}),l&&(0,Z.jsxs)(`div`,{className:`mb-2`,children:[(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground block mb-1`,children:t(`detail.dev.pullRequests`)}),(0,Z.jsx)(`div`,{className:`space-y-1`,children:o.pullRequests.map(e=>(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>{c(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,Z.jsx)(jn,{className:`w-3 h-3 mt-0.5 shrink-0 text-accent-info`}),(0,Z.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,Z.jsx)(`span`,{className:`truncate text-foreground block`,children:e.title}),(0,Z.jsxs)(`span`,{className:`text-caption text-muted-foreground`,children:[e.status,e.sourceBranch?` · ${e.sourceBranch} → ${e.destBranch??``}`:``]})]})]},e.url))})]}),u&&(0,Z.jsxs)(`div`,{className:`mb-2`,children:[(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground block mb-1`,children:t(`detail.dev.branches`)}),(0,Z.jsx)(`div`,{className:`space-y-1`,children:o.branches.map(e=>(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>{c(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,Z.jsx)(ue,{className:`w-3 h-3 shrink-0 text-accent-info`}),(0,Z.jsx)(`span`,{className:`truncate font-mono text-foreground`,children:e.name}),e.repo&&(0,Z.jsx)(`span`,{className:`text-caption text-muted-foreground truncate`,children:e.repo})]},e.url))})]}),d&&(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground block mb-1`,children:t(`detail.dev.commits`)}),(0,Z.jsx)(`div`,{className:`space-y-1`,children:o.commits.map(e=>(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>{c(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,Z.jsx)(Dn,{className:`w-3 h-3 shrink-0 text-accent-info`}),(0,Z.jsx)(`span`,{className:`font-mono text-caption text-muted-foreground shrink-0`,children:e.displayId}),(0,Z.jsx)(`span`,{className:`truncate text-foreground`,children:e.message})]},e.url))})]})]})]})}var Ga=/\n*##\s*Acceptance Criteria\s*\n([\s\S]*?)(?=\n##\s|\n*$)/i;function Ka(e){if(!e)return{body:``,criteria:[]};let t=Ga.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 qa=new Set([`draft`,`todo`]);function Ja(e){return!!(qa.has(e.status)||e.source===`jira`&&e.jira_key&&e.status!==`cancelled`)}function Ya(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function Xa(){let e={BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}.VITE_FEATURE_BROWSER_CAPTURE;return typeof e!=`string`||e!==`false`}var Za={desktop:{width:1280,height:800},tablet:{width:768,height:1024},mobile:{width:375,height:667}},Qa=class extends Error{},$a=class extends Error{};function eo(e){if(!e)throw Error(`A project owner is required for browser sessions`);return`${b}/api/projects/${encodeURIComponent(e)}`}async function to(e,t){let n=await fetch(`${eo(e)}/browser/sessions`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({initialUrl:t})});if(n.status===409)throw new Qa(`Too many open browser sessions`);if(n.status===502)throw new $a(`The browser failed to launch`);if(!n.ok)throw Error(`Failed to open browser (${n.status})`);return(await n.json()).session}async function no(e,t,n,r){let i=await fetch(`${eo(e)}/browser/sessions/${t}/navigate`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:n,url:r})});if(!i.ok)throw Error(`Navigation failed (${i.status})`);return await i.json()}async function ro(e,t,n,r,i){let a=await fetch(`${eo(e)}/browser/sessions/${t}/capture`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({rect:n,pendingSpecId:r,captureNetwork:i?.captureNetwork??!0})});if(!a.ok)throw Error(await io(a));return await a.json()}async function io(e){let t=await e.json().then(e=>e.error).catch(()=>void 0);return t?`Capture failed (${e.status}): ${t}`:`Capture failed (${e.status})`}async function ao(e,t,n,r,i,a=Za){let o=await fetch(`${eo(e)}/browser/sessions/${t}/capture-breakpoints`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({rect:n,anchorPoint:r,pendingSpecId:i,breakpoints:a})});if(!o.ok)throw Error(await io(o));return await o.json()}async function oo(e,t,n){let r=new FormData;r.append(`file`,t,n);let i=await fetch(`${h()}/tickets/${e}/attachments`,{method:`POST`,body:r});if(!i.ok)throw Error(`Upload failed (${i.status})`);return(await i.json()).attachment}async function so(e,t,n,r){let i=await fetch(`${eo(e)}/browser/sessions/${t}/clipboard`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:n,text:r})});if(!i.ok)throw Error(`Clipboard failed (${i.status})`);return await i.json()}async function co(e,t,n,r){let i=await fetch(`${eo(e)}/browser/sessions/${t}/element`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({selector:n,direction:r})});if(!i.ok)throw Error(`Element navigate failed (${i.status})`);return(await i.json()).probe}async function lo(e,t,n){let r=await fetch(`${eo(e)}/browser/sessions/${t}/popup-view`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({target:n})});if(!r.ok)throw Error(`Could not switch browser view (${r.status})`)}function uo(e){if(!e||e===`about:blank`)return`…`;try{return new URL(e).hostname||`…`}catch{return`…`}}async function fo(e,t){try{await fetch(`${eo(e)}/browser/sessions/${t}`,{method:`DELETE`})}catch{}}function po(e,t){return`${ct||(typeof window<`u`?`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.host}`:`ws://localhost:4200`)}/ws/browser/${e}?projectId=${encodeURIComponent(t)}`}function mo(e,t){let n=po(e,t),r=p(),i=r?new WebSocket(n,[`specrails-desktop`,r]):new WebSocket(n);return i.binaryType=`arraybuffer`,i}function ho(e,t=e=>requestAnimationFrame(e),n=e=>cancelAnimationFrame(e)){let r=null,i=null,a=null,o=!1,s=()=>{a!=null&&(n(a),a=null);let t=r,o=i;r=null,i=null,t&&(!o||t.x!==o.x||t.y!==o.y)&&e({type:`mouse`,action:`move`,x:t.x,y:t.y}),o&&e({type:`wheel`,x:o.x,y:o.y,deltaX:o.deltaX,deltaY:o.deltaY})},c=()=>{a==null&&!o&&(a=t(()=>{a=null,s()}))};return{move(e,t){o||(r={x:e,y:t},c())},wheel(e,t,n,r){o||(i?(i.x=e,i.y=t,i.deltaX+=n,i.deltaY+=r):i={x:e,y:t,deltaX:n,deltaY:r},c())},flush(){o||s()},dispose(){o||(o=!0,a!=null&&(n(a),a=null),r=null,i=null)}}}function go(e,t,n){let r=t.width>0?(e.x-t.left)/t.width:0,i=t.height>0?(e.y-t.top)/t.height:0,a=Math.min(Math.max(r,0),1)*n.width,o=Math.min(Math.max(i,0),1)*n.height;return{x:Math.round(a),y:Math.round(o)}}function _o(e,t,n){let r=n.width>0?t.width/n.width:0,i=n.height>0?t.height/n.height:0;return{left:t.left+e.x*r,top:t.top+e.y*i,width:e.width*r,height:e.height*i}}function vo(e,t){return{x:Math.min(e.x,t.x),y:Math.min(e.y,t.y),width:Math.abs(e.x-t.x),height:Math.abs(e.y-t.y)}}function yo(e,t=8){return e.width>=t&&e.height>=t}function bo(e,t){let n=Math.max(1,t.width),r=Math.max(1,t.height),i=Math.max(0,Math.min(e.x,n-1)),a=Math.max(0,Math.min(e.y,r-1)),o=Math.min(n,Math.max(i+1,e.x+e.width)),s=Math.min(r,Math.max(a+1,e.y+e.height));return{x:Math.round(i),y:Math.round(a),width:Math.round(o-i),height:Math.round(s-a)}}function xo(e){return{nodeCount:e.nodes.length,htmlBytes:e.html.length,truncated:e.htmlTruncated,networkCount:e.networkRequests?.length??0}}function So(e,t){let n=e.indexOf(`,`);if(!e.startsWith(`data:`)||n===-1)throw Error(`dataUrlToFile: not a data URL`);let r=e.slice(0,n),i=/^data:([^;,]+)/.exec(r)?.[1]||`application/octet-stream`,a=e.slice(n+1);if(/;base64$/i.test(r)){let e=atob(a),n=new Uint8Array(e.length);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t);return new File([n],t,{type:i})}return new File([decodeURIComponent(a)],t,{type:i})}var Co={objects:[],past:[],future:[]};function wo(e,t){switch(t.type){case`add`:return{objects:[...e.objects,t.obj],past:[...e.past,e.objects],future:[]};case`delete`:return e.objects.some(e=>e.id===t.id)?{objects:e.objects.filter(e=>e.id!==t.id),past:[...e.past,e.objects],future:[]}:e;case`undo`:return e.past.length===0?e:{objects:e.past[e.past.length-1],past:e.past.slice(0,-1),future:[e.objects,...e.future]};case`redo`:return e.future.length===0?e:{objects:e.future[0],past:[...e.past,e.objects],future:e.future.slice(1)};case`clear`:return e.objects.length===0?e:{objects:[],past:[...e.past,e.objects],future:[]};default:return e}}function To(e){let t=e.filter(e=>e.kind===`step`).map(e=>e.n);return t.length===0?1:Math.max(...t)+1}function Eo(e,t){return{x:Math.min(e.x,t.x),y:Math.min(e.y,t.y),w:Math.abs(e.x-t.x),h:Math.abs(e.y-t.y)}}function Do(e,t,n=.04){let r=Math.atan2(t.y-e.y,t.x-e.x),i=r-Math.PI/7,a=r+Math.PI/7;return{left:{x:t.x-n*Math.cos(i),y:t.y-n*Math.sin(i)},right:{x:t.x-n*Math.cos(a),y:t.y-n*Math.sin(a)}}}function Oo(e,t,n=.01){return Math.abs(e.x-t.x)>=n||Math.abs(e.y-t.y)>=n}function ko(e,t=.05){let n=e=>Math.min(1+t,Math.max(-t,e));return{x:n(e.x),y:n(e.y)}}function Ao(e,t,n){return{schemaVersion:1,objects:e,baseWidth:t,baseHeight:n}}function jo({result:e,pendingSpecId:t,onConfirm:n,...r}){let i=(0,X.useCallback)(async r=>{if(!r.annotations){await n(e);return}let i=`screen-annotated-${Date.now()}.png`,a=await oo(t,So(r.screenshotDataUrl,i),i);await n({...e,rawScreenshot:e.screenshot,screenshot:a,screenshotDataUrl:r.screenshotDataUrl,annotations:r.annotations,...e.breakpoints?{breakpoints:Object.fromEntries(Object.entries(e.breakpoints).map(([t,n])=>[t,n.attachment.id===e.screenshot.id?{...n,attachment:a,dataUrl:r.screenshotDataUrl}:n]))}:{}})},[n,t,e]);return(0,Z.jsx)(Lo,{...r,responsive:Object.keys(e.breakpoints??{}).length>1,screenshotDataUrl:e.screenshotDataUrl,onConfirm:i})}var Mo=[`#ef4444`,`#f59e0b`,`#3b82f6`,`#22c55e`,`#ffffff`],No=`#111827`,Po=[{tool:`arrow`,icon:O,labelKey:`editor.tools.arrow`,key:`a`},{tool:`box`,icon:G,labelKey:`editor.tools.box`,key:`r`},{tool:`text`,icon:$n,labelKey:`editor.tools.text`,key:`t`},{tool:`blur`,icon:yn,labelKey:`editor.tools.blur`,key:`b`},{tool:`step`,icon:Nn,labelKey:`editor.tools.step`,key:`n`}],Fo=0,Io=()=>`a${++Fo}-${Date.now().toString(36)}`;function Lo({screenshotDataUrl:e,responsive:t,macOverlay:n,confirmLabel:r,onConfirm:i,onReselect:a,onCancel:o}){let{t:s}=v(`browser`),[c,l]=(0,X.useReducer)(wo,Co),[u,d]=(0,X.useState)(`arrow`),[f,p]=(0,X.useState)(Mo[0]),[m,h]=(0,X.useState)(null),[g,_]=(0,X.useState)({w:1,h:1}),[y,b]=(0,X.useState)(!1),[x,S]=(0,X.useState)(!1),C=(0,X.useRef)(!1),w=(0,X.useRef)(null),E=(0,X.useRef)(null),D=c.objects,O=(0,X.useCallback)(()=>{let e=w.current;if(!e)return;let t=E.current?.getBoundingClientRect();if(!t||t.width<=0||t.height<=0||e.naturalWidth<=0||e.naturalHeight<=0)return;let n=Math.min(1,t.width/e.naturalWidth,t.height/e.naturalHeight),r=e.naturalWidth*n,i=e.naturalHeight*n;_(e=>e.w===r&&e.h===i?e:{w:r,h:i})},[]);(0,X.useEffect)(()=>{O();let e=typeof ResizeObserver>`u`?null:new ResizeObserver(O);return E.current&&e?.observe(E.current),window.addEventListener(`resize`,O),()=>{e?.disconnect(),window.removeEventListener(`resize`,O)}},[O]);let k=(0,X.useCallback)((e,t)=>{let n=w.current;if(!n)return{x:0,y:0};let r=n.getBoundingClientRect();return ko({x:r.width>0?(e-r.left)/r.width:0,y:r.height>0?(t-r.top)/r.height:0})},[]),A=(0,X.useCallback)(e=>{if(y)return;e.target.setPointerCapture?.(e.pointerId);let t=k(e.clientX,e.clientY);if(u===`text`){let e=window.prompt(s(`editor.notePrompt`))?.trim();e&&l({type:`add`,obj:{id:Io(),kind:`text`,x:t.x,y:t.y,text:e,color:f}});return}if(u===`step`){l({type:`add`,obj:{id:Io(),kind:`step`,x:t.x,y:t.y,n:To(D),color:f}});return}h({start:t,cur:t})},[y,u,f,D,k,s]),j=(0,X.useCallback)(e=>{m&&h(t=>t&&{...t,cur:k(e.clientX,e.clientY)})},[m,k]),M=(0,X.useCallback)(()=>{if(!m)return;let{start:e,cur:t}=m;if(h(null),Oo(e,t)){if(u===`arrow`)l({type:`add`,obj:{id:Io(),kind:`arrow`,from:e,to:t,color:f}});else if(u===`box`){let n=Eo(e,t);l({type:`add`,obj:{id:Io(),kind:`box`,...n,color:f}})}else if(u===`blur`){let n=Eo(e,t);l({type:`add`,obj:{id:Io(),kind:`blur`,...n}})}}},[m,u,f]),N=(0,X.useCallback)(()=>{let e=w.current;if(!e||!e.naturalWidth||!e.naturalHeight)throw Error(`Capture image is not loaded`);let t=e.naturalWidth,n=e.naturalHeight,r=document.createElement(`canvas`);r.width=t,r.height=n;let i=r.getContext(`2d`);if(!i)throw Error(`Image rendering is unavailable`);i.drawImage(e,0,0,t,n);for(let e of D)e.kind===`blur`&&(i.fillStyle=No,i.fillRect(e.x*t,e.y*n,e.w*t,e.h*n));let a=Math.max(2,t*.004);for(let e of D)if(e.kind===`box`)i.strokeStyle=e.color,i.lineWidth=a,i.strokeRect(e.x*t,e.y*n,e.w*t,e.h*n);else if(e.kind===`arrow`){let r={x:e.from.x*t,y:e.from.y*n},o={x:e.to.x*t,y:e.to.y*n},s=Do(e.from,e.to,.035);i.strokeStyle=e.color,i.lineWidth=a,i.lineCap=`round`,i.beginPath(),i.moveTo(r.x,r.y),i.lineTo(o.x,o.y),i.moveTo(s.left.x*t,s.left.y*n),i.lineTo(o.x,o.y),i.lineTo(s.right.x*t,s.right.y*n),i.stroke()}else if(e.kind===`text`){let r=Math.max(12,n*.03);i.font=`600 ${r}px sans-serif`,i.textBaseline=`top`,i.lineWidth=Math.max(2,r*.18),i.strokeStyle=`rgba(0,0,0,0.55)`,i.strokeText(e.text,e.x*t,e.y*n),i.fillStyle=e.color,i.fillText(e.text,e.x*t,e.y*n)}else if(e.kind===`step`){let r=Math.max(10,n*.025);i.beginPath(),i.arc(e.x*t,e.y*n,r,0,Math.PI*2),i.fillStyle=e.color,i.fill(),i.fillStyle=`#000`,i.font=`700 ${r*1.1}px sans-serif`,i.textAlign=`center`,i.textBaseline=`middle`,i.fillText(String(e.n),e.x*t,e.y*n),i.textAlign=`start`}let o=r.toDataURL(`image/png`);if(!o.startsWith(`data:image/png;base64,`))throw Error(`Image encoding failed`);return{screenshotDataUrl:o,annotations:Ao(D,t,n)}},[D]),P=(0,X.useCallback)(async()=>{if(!C.current){C.current=!0,b(!0),S(!1);try{await i(D.length===0?{screenshotDataUrl:e}:N())}catch{S(!0)}finally{C.current=!1,b(!1)}}},[D,N,e,i]),[F,I]=(0,X.useState)(!1),L=(0,X.useCallback)(()=>{if(D.length>0){I(!0);return}o()},[D.length,o]);(0,X.useEffect)(()=>{let e=e=>{if(y||F)return;let t=e.metaKey||e.ctrlKey;if(t&&e.key.toLowerCase()===`z`){e.preventDefault(),l({type:e.shiftKey?`redo`:`undo`});return}if(t&&e.key===`Enter`){e.preventDefault(),P();return}if(t)return;let n=Po.find(t=>t.key===e.key.toLowerCase());if(n){d(n.tool);return}e.key===`Escape`&&(e.preventDefault(),L())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[y,F,P,L]);let R=(e,t)=>e*(t===`w`?g.w:g.h),z=m?Eo(m.start,m.cur):null;return(0,Z.jsxs)(`div`,{className:`flex-1 min-h-0 min-w-0 flex flex-col items-center overflow-hidden p-3 gap-2`,children:[(0,Z.jsxs)(`div`,{className:`flex shrink-0 max-w-full items-center gap-1 overflow-x-auto rounded-lg border border-border/60 bg-surface/90 px-1.5 py-1 shadow-xl ${n?`ml-[80px]`:``}`,children:[Po.map(({tool:e,icon:t,labelKey:n})=>(0,Z.jsx)(`button`,{type:`button`,title:s(n),"aria-label":s(n),"aria-pressed":u===e,onClick:()=>d(e),className:`h-7 w-7 inline-flex items-center justify-center rounded transition-colors ${u===e?`bg-primary/15 text-primary`:`text-muted-foreground hover:text-foreground hover:bg-card/60`}`,children:(0,Z.jsx)(t,{className:`w-3.5 h-3.5`})},e)),(0,Z.jsx)(`span`,{className:`w-px h-5 bg-border/60 mx-0.5`}),Mo.map(e=>(0,Z.jsx)(`button`,{type:`button`,"aria-label":s(`editor.colorLabel`,{color:e}),onClick:()=>p(e),className:`h-5 w-5 rounded-full border transition-transform ${f===e?`scale-110 border-foreground`:`border-border/60`}`,style:{background:e}},e)),(0,Z.jsx)(`span`,{className:`w-px h-5 bg-border/60 mx-0.5`}),(0,Z.jsx)(`button`,{type:`button`,"aria-label":s(`editor.undo`),title:s(`editor.undoTitle`),disabled:c.past.length===0,onClick:()=>l({type:`undo`}),className:`h-7 w-7 inline-flex items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-card/60 disabled:opacity-40`,children:(0,Z.jsx)(tr,{className:`w-3.5 h-3.5`})}),(0,Z.jsx)(`button`,{type:`button`,"aria-label":s(`editor.redo`),title:s(`editor.redoTitle`),disabled:c.future.length===0,onClick:()=>l({type:`redo`}),className:`h-7 w-7 inline-flex items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-card/60 disabled:opacity-40`,children:(0,Z.jsx)(Vn,{className:`w-3.5 h-3.5`})})]}),t&&(0,Z.jsx)(`p`,{className:`shrink-0 max-w-prose text-center text-xs text-muted-foreground`,children:s(`editor.responsiveHint`)}),(0,Z.jsx)(`div`,{ref:E,className:`relative flex-1 min-h-0 w-full flex items-center justify-center`,children:(0,Z.jsxs)(`div`,{className:`relative shrink-0`,style:{width:g.w,height:g.h},children:[(0,Z.jsx)(`img`,{ref:w,src:e,alt:s(`editor.capturedAlt`),onLoad:O,draggable:!1,className:`block w-full h-full select-none rounded shadow-2xl`}),D.map(e=>e.kind===`blur`?(0,Z.jsx)(`div`,{className:`absolute pointer-events-none`,style:{backgroundColor:No,left:`${e.x*100}%`,top:`${e.y*100}%`,width:`${e.w*100}%`,height:`${e.h*100}%`}},e.id):null),m&&u===`blur`&&z&&(0,Z.jsx)(`div`,{className:`absolute border border-accent-info pointer-events-none`,style:{backgroundColor:No,left:`${z.x*100}%`,top:`${z.y*100}%`,width:`${z.w*100}%`,height:`${z.h*100}%`}}),(0,Z.jsxs)(`svg`,{className:`absolute inset-0 w-full h-full ${u===`text`||u===`step`?`cursor-pointer`:`cursor-crosshair`}`,viewBox:`0 0 ${g.w} ${g.h}`,preserveAspectRatio:`none`,onPointerDown:A,onPointerMove:j,onPointerUp:M,children:[D.map(e=>{if(e.kind===`box`)return(0,Z.jsx)(`rect`,{x:R(e.x,`w`),y:R(e.y,`h`),width:R(e.w,`w`),height:R(e.h,`h`),fill:`none`,stroke:e.color,strokeWidth:Math.max(2,g.w*.004)},e.id);if(e.kind===`arrow`){let t=Do(e.from,e.to,.035),n=Math.max(2,g.w*.004);return(0,Z.jsxs)(`g`,{stroke:e.color,strokeWidth:n,strokeLinecap:`round`,fill:`none`,children:[(0,Z.jsx)(`line`,{x1:R(e.from.x,`w`),y1:R(e.from.y,`h`),x2:R(e.to.x,`w`),y2:R(e.to.y,`h`)}),(0,Z.jsx)(`polyline`,{points:`${R(t.left.x,`w`)},${R(t.left.y,`h`)} ${R(e.to.x,`w`)},${R(e.to.y,`h`)} ${R(t.right.x,`w`)},${R(t.right.y,`h`)}`})]},e.id)}if(e.kind===`text`)return(0,Z.jsx)(`text`,{x:R(e.x,`w`),y:R(e.y,`h`),dominantBaseline:`hanging`,fontSize:Math.max(12,g.h*.03),fontWeight:600,fill:e.color,stroke:`rgba(0,0,0,0.55)`,strokeWidth:1,paintOrder:`stroke`,children:e.text},e.id);if(e.kind===`step`){let t=Math.max(10,g.h*.025);return(0,Z.jsxs)(`g`,{children:[(0,Z.jsx)(`circle`,{cx:R(e.x,`w`),cy:R(e.y,`h`),r:t,fill:e.color}),(0,Z.jsx)(`text`,{x:R(e.x,`w`),y:R(e.y,`h`),textAnchor:`middle`,dominantBaseline:`central`,fontSize:t*1.1,fontWeight:700,fill:`#000`,children:e.n})]},e.id)}return null}),m&&u===`box`&&z&&(0,Z.jsx)(`rect`,{x:R(z.x,`w`),y:R(z.y,`h`),width:R(z.w,`w`),height:R(z.h,`h`),fill:`none`,stroke:f,strokeDasharray:`4 3`,strokeWidth:Math.max(2,g.w*.004)}),m&&u===`arrow`&&(0,Z.jsx)(`line`,{x1:R(m.start.x,`w`),y1:R(m.start.y,`h`),x2:R(m.cur.x,`w`),y2:R(m.cur.y,`h`),stroke:f,strokeWidth:Math.max(2,g.w*.004),strokeLinecap:`round`})]}),y&&(0,Z.jsxs)(`div`,{className:`absolute inset-0 flex items-center justify-center gap-2 bg-background-deep/50 text-sm text-foreground`,children:[(0,Z.jsx)(fe,{className:`w-4 h-4 animate-spin`}),` `,s(`common:states.saving`)]})]})}),x&&(0,Z.jsx)(`p`,{role:`alert`,className:`shrink-0 text-sm text-destructive`,children:s(`modal.toast.captureFailed`)}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[(0,Z.jsxs)(J,{size:`sm`,variant:`ghost`,className:`gap-1.5`,onClick:a,disabled:y,children:[(0,Z.jsx)(T,{className:`w-3.5 h-3.5`}),` `,s(`editor.reselect`)]}),(0,Z.jsxs)(J,{size:`sm`,variant:`ghost`,className:`gap-1.5`,onClick:L,disabled:y,children:[(0,Z.jsx)(be,{className:`w-3.5 h-3.5`}),` `,s(`common:actions.cancel`)]}),(0,Z.jsxs)(J,{size:`sm`,className:`gap-1.5`,onClick:()=>void P(),disabled:y,"data-testid":`annotation-confirm`,children:[(0,Z.jsx)(H,{className:`w-3.5 h-3.5`}),` `,D.length>0?r??s(`editor.createSpec`):s(`editor.skipContinue`)]})]}),(0,Z.jsx)(pe,{open:F,onOpenChange:I,title:s(`editor.discardConfirm`),confirmLabel:s(`common:actions.discard`),testId:`annotation-discard-confirm`,confirmTestId:`annotation-discard-confirm-btn`,onConfirm:()=>{I(!1),o()}})]})}var Ro=`native-browser:event`;function zo(e){let t=(e??``).trim();if(!t)return null;if(t===`about:blank`)return t;let n=Bo(t);if(n){if(n.protocol===`http:`||n.protocol===`https:`)return n.toString();let e=`${n.pathname}${n.search}${n.hash}`;if(!/^\d+([/?#].*)?$/.test(e))return null}let r=Bo(`https://${t}`);if(r&&r.protocol===`https:`){let e=r.hostname.toLowerCase();return(e===`localhost`||e.endsWith(`.localhost`)||e===`[::1]`||/^127\./.test(e))&&(r.protocol=`http:`),r.toString()}return null}function Bo(e){try{return new URL(e)}catch{return null}}function Vo(e){let t=(e,t)=>Number.isFinite(e)?e:t;return{x:Math.max(0,Math.round(t(e.left,0))),y:Math.max(0,Math.round(t(e.top,0))),width:Math.max(1,Math.round(t(e.width,1))),height:Math.max(1,Math.round(t(e.height,1)))}}var Ho=null,Uo=null,Wo=Promise.resolve();async function Go(){return(await r(()=>import(`./core-BozBzB6Y.js`).then(e=>e.i),__vite__mapDeps([0,1]))).invoke}function Ko(e){let t=e?.flag??Qt,n=e?.tauri??l();return!t||!n?Promise.resolve(!1):(Ho||=(async()=>{try{return await(await Go())(`browser_supported`)===!0}catch{return Ho=null,!1}})(),Ho)}async function qo(e){return await Ko(e)?(Uo||=Q(`browser_capture_supported`).then(e=>e===!0).catch(()=>(Uo=null,!1)),Uo):!1}async function Q(e,t){return(await Go())(e,t)}function Jo(e){let t=Wo.then(e,e);return Wo=t.catch(()=>{}),t}var $={open:(e,t,n)=>Jo(()=>Q(`browser_open`,{ownerId:e,url:t,bounds:n})),navigate:(e,t)=>Q(`browser_navigate`,{ownerId:e,url:t}),back:e=>Q(`browser_back`,{ownerId:e}),forward:e=>Q(`browser_forward`,{ownerId:e}),reload:e=>Q(`browser_reload`,{ownerId:e}),setBounds:(e,t)=>Q(`browser_set_bounds`,{ownerId:e,bounds:t}),show:e=>Q(`browser_show`,{ownerId:e}),hide:e=>Q(`browser_hide`,{ownerId:e}),close:e=>Jo(()=>Q(`browser_close`,{ownerId:e})),devtools:e=>Q(`browser_devtools`,{ownerId:e}),zoom:(e,t)=>Q(`browser_zoom`,{ownerId:e,factor:t}),setSelectMode:(e,t)=>Q(`browser_set_select_mode`,{ownerId:e,enabled:t}),selection:e=>Q(`browser_selection`,{ownerId:e}),capture:(e,t)=>Q(`browser_capture`,{ownerId:e,selectionOnly:t}),onEvent:async(e,t)=>{let n=n=>{n.payload.ownerId===e&&t(n.payload)},{listen:i}=await r(async()=>{let{listen:e}=await import(`./event-BEnMLqAi.js`).then(e=>e.i);return{listen:e}},__vite__mapDeps([2,1,0]));return i(Ro,n)}},Yo=new Map,Xo=new Map;function Zo(e,t){let n=(Xo.get(e)??Promise.resolve()).catch(()=>{}).then(t);return Xo.set(e,n),n.finally(()=>{Xo.get(e)===n&&Xo.delete(e)}).catch(()=>{}),n}function Qo({label:e,onClose:t,onEscape:n,scrimDismisses:r=!0,animated:i=!0,testId:a,children:o}){let[s]=(0,X.useState)(()=>typeof document<`u`&&document.activeElement instanceof HTMLElement&&document.activeElement!==document.body?document.activeElement:null);return(0,Z.jsx)(ze,{open:!0,onOpenChange:e=>{e||t()},children:(0,Z.jsxs)(Se,{children:[(0,Z.jsx)(we,{"data-capture-scrim":``,className:K(Ie,je.capture)}),(0,Z.jsxs)(De,{"data-testid":a,"aria-describedby":void 0,className:K(`fixed inset-x-[4%] inset-y-[3.5%] flex flex-col overflow-hidden rounded-2xl border border-border/70 bg-background-deep shadow-xl ring-1 ring-black/20 outline-none`,i&&`modal-panel`,je.capture),onEscapeKeyDown:e=>{n&&n()===!1&&e.preventDefault()},onPointerDownOutside:e=>{let t=e.target;(!r||!t?.hasAttribute?.(`data-capture-scrim`))&&e.preventDefault()},onCloseAutoFocus:e=>{s?.isConnected&&(e.preventDefault(),s.focus())},children:[(0,Z.jsx)(Te,{className:`sr-only`,children:e}),(0,Z.jsx)(Ae,{layer:`capture`,children:o})]})]})})}function $o(e){return e===`Tab`||e===` `||e.startsWith(`Arrow`)}function es({ownerId:e,leaseRevision:t=0,onBusyChange:n,transferError:r,url:i,onClose:a,onFallback:o,onUrlChange:s,onCaptured:l,confirmLabel:u,selectLabel:d}){let{t:f}=v(`browser`),p=(0,X.useRef)(null),m=(0,X.useRef)(!1),[h,g]=(0,X.useState)(i),[_,y]=(0,X.useState)(i),[b,x]=(0,X.useState)(null),[S,C]=(0,X.useState)(!0),[w,E]=(0,X.useState)(!1),[O,k]=(0,X.useState)(null),[A,j]=(0,X.useState)(!1),[M,N]=(0,X.useState)(null),[P,I]=(0,X.useState)(!1),[L,R]=(0,X.useState)(null);(0,X.useEffect)(()=>(n?.(A||M!==null||P||L!==null),()=>{n?.(!1)}),[n,A,M,P,L]);let z=(0,X.useRef)(1),B=(0,X.useRef)(null),V=(0,X.useRef)(!1),H=(0,X.useRef)(!1),U=(0,X.useRef)(!1),ee=(0,X.useRef)(null),te=(0,X.useRef)(i),ne=(0,X.useRef)({url:i,onFallback:o,onUrlChange:s});ne.current={url:i,onFallback:o,onUrlChange:s},U.current=L!==null;let W=(0,X.useCallback)(async e=>{let t=B.current;if(!(!t||!V.current)){k(null);try{await e(t)}catch(e){B.current===t&&k(e instanceof Error?e.message:String(e))}}},[]);(0,X.useEffect)(()=>{let t=!1,n=null,r=0,i=null,a=e??crypto.randomUUID(),o=Symbol(a);Yo.set(a,o);let s=()=>{Zo(a,async()=>{Yo.get(a)===o&&(Yo.delete(a),await $.close(a))}).catch(()=>{})};B.current=a,V.current=!1,E(!1);let c=()=>{t||r||(r=requestAnimationFrame(()=>{if(r=0,!V.current||U.current||H.current)return;let e=p.current?.getBoundingClientRect();if(!e||e.width<=0||e.height<=0)return;let t=Vo(e);JSON.stringify(t)!==JSON.stringify(ee.current)&&(ee.current=t,$.setBounds(a,t).catch(()=>{ee.current=null}))}))};return(async()=>{try{let e=await $.onEvent(a,e=>{if(!t){if(e.kind===`resume`){!U.current&&!H.current&&Zo(a,async()=>{if(t||Yo.get(a)!==o||U.current||H.current)return;let n=p.current?.getBoundingClientRect();n&&await $.open(a,e.url??te.current,Vo(n))}).catch(e=>{t||k(String(e))});return}e.kind===`nav`&&e.url?(y(e.url),ne.current.onUrlChange?.(e.url),N(null),j(!1),m.current||g(e.url)):e.kind===`title`?x(e.title??null):e.kind===`load-started`?C(!0):e.kind===`load-finished`?(C(!1),e.url&&!m.current&&g(e.url)):e.kind===`popup-error`?k(f(`popup.openFailed`)):e.kind===`popup-opened`&&k(null)}});if(t){e();return}n=e;let r=p.current?.getBoundingClientRect();if(!r)throw Error(`hole not measurable`);te.current=zo(ne.current.url)??`about:blank`,ee.current=Vo(r);let l=ee.current;if(!await Zo(a,async()=>t||Yo.get(a)!==o?!1:(await $.open(a,te.current,l),!0)))return;if(t){s();return}V.current=!0,E(!0),i=new ResizeObserver(c),p.current&&i.observe(p.current),window.addEventListener(`resize`,c),window.addEventListener(`scroll`,c,!0),window.visualViewport?.addEventListener(`resize`,c),window.visualViewport?.addEventListener(`scroll`,c),c()}catch{t||ne.current.onFallback()}})(),()=>{t=!0,cancelAnimationFrame(r),i?.disconnect(),window.removeEventListener(`resize`,c),window.removeEventListener(`scroll`,c,!0),window.visualViewport?.removeEventListener(`resize`,c),window.visualViewport?.removeEventListener(`scroll`,c),n?.(),B.current===a&&(B.current=null,V.current=!1),s()}},[e,t]),(0,X.useEffect)(()=>{let e=zo(i)??`about:blank`;!w||e===te.current||(te.current=e,g(e),W(t=>$.navigate(t,e)))},[i,w,W]);let re=(0,X.useCallback)(async e=>{let t=B.current;if(!(!t||!V.current||H.current)){H.current=!0,I(!0),k(null);try{let n=await $.capture(t,e);if(B.current!==t||(await $.hide(t),B.current!==t))return;U.current=!0,j(!1),R(n)}catch(e){B.current===t&&k(e instanceof Error?e.message:String(e))}finally{H.current=!1,B.current===t&&I(!1)}}},[]);(0,X.useEffect)(()=>{if(!A||!w)return;let e=B.current,t=!1,n,r=async()=>{try{let n=await $.selection(e);if(t||B.current!==e)return;if(n){if(await $.setSelectMode(e,!1),t||B.current!==e)return;N(n),j(!1),await re(!0);return}}catch(n){if(t||B.current!==e)return;k(String(n));try{await $.setSelectMode(e,!1),!t&&B.current===e&&j(!1)}catch(n){!t&&B.current===e&&k(String(n))}return}t||(n=setTimeout(r,200))};return r(),()=>{t=!0,clearTimeout(n)}},[A,w,re]);let ie=async()=>{await W(async e=>{await $.setSelectMode(e,!A),N(null),j(!A)})},ae=async()=>{R(null),await W(async e=>{await new Promise(e=>requestAnimationFrame(()=>e()));let t=p.current?.getBoundingClientRect();t&&t.width>0&&t.height>0&&(ee.current=Vo(t),await $.setBounds(e,ee.current)),await $.show(e)})},oe=(0,X.useCallback)(()=>{let e=zo(h);e&&(g(e),W(t=>$.navigate(t,e)))},[h,W]),ce=(0,X.useCallback)(e=>{z.current=Math.min(3,Math.max(.25,e)),W(e=>$.zoom(e,z.current))},[W]);return typeof document>`u`?null:(0,Z.jsxs)(Qo,{label:f(`modal.dialogLabel`),onClose:a,onEscape:()=>!U.current,scrimDismisses:!L,animated:!1,testId:`native-browser-modal`,children:[!L&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.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,Z.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,Z.jsx)(J,{disabled:!w,variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":f(`common:actions.back`),onClick:()=>void W($.back),children:(0,Z.jsx)(T,{className:`w-4 h-4`})}),(0,Z.jsx)(J,{disabled:!w,variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":f(`modal.nav.forward`),onClick:()=>void W($.forward),children:(0,Z.jsx)(D,{className:`w-4 h-4`})}),(0,Z.jsx)(J,{disabled:!w,variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":f(`modal.nav.reload`),onClick:()=>void W($.reload),children:(0,Z.jsx)(Un,{className:`w-4 h-4`})})]}),(0,Z.jsxs)(`form`,{className:`flex-1 flex items-center gap-2 min-w-0`,onSubmit:e=>{e.preventDefault(),oe()},children:[(0,Z.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 focus-within:ring-2 focus-within:ring-ring`,children:[(0,Z.jsx)(F,{className:`w-3.5 h-3.5 text-muted-foreground shrink-0`}),(0,Z.jsx)(`input`,{value:h,onChange:e=>g(e.target.value),onFocus:()=>{m.current=!0},onBlur:()=>{m.current=!1},onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),oe())},placeholder:f(`modal.address.placeholder`),"aria-label":f(`modal.address.label`),className:`flex-1 min-w-0 bg-transparent outline-none focus-visible:ring-2 focus-visible:ring-ring text-sm`})]}),(0,Z.jsx)(J,{type:`submit`,size:`sm`,variant:`secondary`,className:`shrink-0`,children:f(`modal.address.go`)})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,Z.jsx)(J,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":f(`native.zoomOut`),title:f(`native.zoomOut`),onClick:()=>ce(z.current-.1),children:(0,Z.jsx)(ar,{className:`w-4 h-4`})}),(0,Z.jsx)(J,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":f(`native.zoomIn`),title:f(`native.zoomIn`),onClick:()=>ce(z.current+.1),children:(0,Z.jsx)(rr,{className:`w-4 h-4`})}),(0,Z.jsx)(J,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":f(`native.devtools`),title:f(`native.devtools`),onClick:()=>void W($.devtools),children:(0,Z.jsx)(ye,{className:`w-4 h-4`})}),(0,Z.jsx)(J,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":f(`native.openExternal`),title:f(`native.openExternal`),onClick:()=>void c(_),children:(0,Z.jsx)(se,{className:`w-4 h-4`})}),(0,Z.jsx)(J,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":f(`modal.closeBrowser`),onClick:a,children:(0,Z.jsx)(be,{className:`w-4 h-4`})})]})]}),(0,Z.jsxs)(`div`,{className:`px-3 py-1 text-xs text-muted-foreground truncate shrink-0 flex items-center gap-2`,children:[(0,Z.jsx)(Ma,{tone:S?`warning`:`success`,pulsing:S,"aria-hidden":!0}),(0,Z.jsx)(`span`,{className:`truncate`,children:b||_}),(0,Z.jsx)(`span`,{"data-chip":``,className:`ml-auto inline-flex h-5 shrink-0 items-center rounded-full border border-accent-success/30 bg-accent-success/10 text-accent-success px-2 text-caption font-medium`,children:f(`native.badge`)})]}),l&&(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 border-b border-border/50 px-3 py-2 shrink-0`,children:[(0,Z.jsxs)(J,{variant:A?`secondary`:`ghost`,size:`sm`,disabled:!w||P,"aria-pressed":A,onClick:()=>void ie(),children:[(0,Z.jsx)(zn,{className:`mr-1.5 h-3.5 w-3.5`}),d??f(`native.selectElement`)]}),(0,Z.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-xs text-muted-foreground`,children:A?f(`native.selectHint`):M?.selector}),(0,Z.jsxs)(J,{variant:`secondary`,size:`sm`,disabled:!w||P||A||_===`about:blank`,onClick:()=>void re(M!==null),children:[(0,Z.jsx)(sn,{className:`mr-1.5 h-3.5 w-3.5`}),f(P?`native.capturing`:M?`native.captureSelection`:`native.capturePage`)]})]})]}),(O||r)&&(0,Z.jsx)(`div`,{role:`alert`,className:`border-b border-destructive/30 bg-destructive/10 px-3 py-2 text-xs text-destructive shrink-0`,children:O||r}),L&&l&&(0,Z.jsx)(Lo,{screenshotDataUrl:L.screenshotDataUrl,confirmLabel:u,onConfirm:async e=>{await l({...L,screenshotDataUrl:e.screenshotDataUrl})},onReselect:()=>{ae()},onCancel:a}),(0,Z.jsx)(`div`,{ref:p,className:L?`hidden`:`relative flex-1 min-h-0 overflow-hidden`,children:S&&(0,Z.jsx)(`div`,{className:`absolute inset-0 flex items-center justify-center text-sm text-muted-foreground`,children:f(`modal.status.opening`)})})]})}function ts(e){let t=e.schedule??(e=>requestAnimationFrame(e)),n=e.cancel??(e=>cancelAnimationFrame(e)),r=e.now??(()=>typeof performance<`u`?performance.now():Date.now()),i=e.release??(()=>{}),a={received:0,decoded:0,drawn:0,droppedStale:0,droppedUndrawn:0,decodeMsTotal:0,drawMsTotal:0},o=!1,s=!1,c=null,l=null,u=null,d=()=>{u=null;let t=l;if(l=null,t==null||o){t!=null&&f(t);return}let n=r();try{e.draw(t),a.drawn++,a.drawMsTotal+=r()-n}catch{}finally{f(t)}},f=e=>{try{i(e)}catch{}},p=()=>{u==null&&!o&&(u=t(d))},m=t=>{s=!0;let n=r();e.decode(t).then(e=>{if(o){f(e);return}a.decoded++,a.decodeMsTotal+=r()-n,l!=null&&(a.droppedUndrawn++,f(l)),l=e,p(),h()},()=>{h()})},h=()=>{if(o){s=!1;return}let e=c;c=null,e==null?s=!1:m(e)};return{push(e){if(!o){if(a.received++,s){c!=null&&a.droppedStale++,c=e;return}m(e)}},stats(){return{...a}},dispose(){if(!o){if(o=!0,c=null,u!=null){try{n(u)}catch{}u=null}l!=null&&(f(l),l=null)}}}}var ns=`specrails-desktop:browser-capture-debug`;function rs(){try{return typeof localStorage<`u`&&localStorage.getItem(ns)===`1`}catch{return!1}}function is(e,t,n){let r=Math.max(1,n),i=t.decoded-e.decoded,a=t.drawn-e.drawn,o=e=>Math.round(e*10)/10;return{fpsReceived:o((t.received-e.received)*1e3/r),fpsDrawn:o(a*1e3/r),droppedStale:t.droppedStale-e.droppedStale,droppedUndrawn:t.droppedUndrawn-e.droppedUndrawn,avgDecodeMs:i>0?o((t.decodeMsTotal-e.decodeMsTotal)/i):0,avgDrawMs:a>0?o((t.drawMsTotal-e.drawMsTotal)/a):0}}function as(e,t=e=>console.table([e]),n=2e3,r=()=>Date.now()){let i=e(),a=r(),o=setInterval(()=>{let n=e(),o=r();t(is(i,n,o-a)),i=n,a=o},n);return()=>clearInterval(o)}function os(e){let{projectId:t,open:n,initialUrl:r}=e,i=(0,X.useRef)(null),a=(0,X.useRef)(null),o=(0,X.useRef)(null),s=(0,X.useRef)(0),c=(0,X.useRef)(0),l=(0,X.useRef)(null),u=(0,X.useRef)(null),d=(0,X.useCallback)(()=>{let e=l.current,t=u.current,n=a.current;if(!(!e||!n||n.readyState!==WebSocket.OPEN)&&!(t&&t.width===e.width&&t.height===e.height&&t.deviceScaleFactor===e.deviceScaleFactor))try{n.send(JSON.stringify({type:`input`,event:{type:`resize`,...e}})),u.current=e}catch{}},[]),f=(0,X.useRef)(0),p=(0,X.useRef)(new Map),m=(0,X.useCallback)(()=>{if(f.current!==0||p.current.size===0)return;let e=[...p.current.values()];p.current.clear();for(let t of e)fo(t.projectId,t.sessionId)},[]),[h,_]=(0,X.useState)({status:`connecting`,errorMsg:null,url:null,title:null,viewport:{width:1280,height:800},hoverRect:null,hoverSelector:null,hoverPath:null,popup:null,popupError:null});(0,X.useEffect)(()=>{if(!n||!t)return;let e=!1,c=null;u.current=null,_(e=>({...e,status:`connecting`,errorMsg:null,popup:null,popupError:null}));let m=ts({decode:e=>createImageBitmap(new Blob([e],{type:`image/jpeg`})),draw:e=>{let t=i.current;t&&(t.width!==e.width&&(t.width=e.width),t.height!==e.height&&(t.height=e.height),t.getContext(`2d`)?.drawImage(e,0,0))},release:e=>e.close()}),h=rs()?as(()=>m.stats()):null;return(async()=>{try{let n=await to(t,r);if(e){fo(t,n.id);return}c=n.id,o.current={id:n.id,projectId:t},_(e=>({...e,url:n.url,title:n.title,viewport:l.current??{width:n.viewportWidth,height:n.viewportHeight}}));let i=mo(n.id,t);a.current=i,i.onmessage=e=>{if(typeof e.data==`string`){try{let t=JSON.parse(e.data);if(t.type===`ready`)_(e=>({...e,status:`ready`,url:t.url??e.url,title:t.title??e.title,viewport:l.current??t.viewport??e.viewport})),d();else if(t.type===`nav`)_(e=>({...e,url:t.url??e.url,title:t.title??e.title}));else if(t.type===`hover`)_(e=>({...e,hoverRect:t.rect??null,hoverSelector:t.selector??null,hoverPath:t.path??null}));else if(t.type===`popup`){let e=typeof t.count==`number`?t.count:0;s.current+=1,_(n=>({...n,popup:e>0?{count:e,active:t.active===!0,url:t.url??null}:null,popupError:null}))}}catch{}return}m.push(e.data)},i.onopen=()=>{e||(d(),_(e=>({...e,status:`ready`})))},i.onerror=()=>{e||_(e=>({...e,status:`error`,errorMsg:g.t(`browser:session.connectionError`)}))},i.onclose=()=>{e||_(e=>({...e,status:`error`,errorMsg:g.t(`browser:session.lostConnection`)}))}}catch(t){if(e)return;let n=t instanceof Qa?g.t(`browser:session.tooManySessions`):t instanceof $a?g.t(`browser:session.launchFailed`):g.t(`browser:session.openFailed`);_(e=>({...e,status:`error`,errorMsg:n}))}})(),()=>{e=!0,h?.(),m.dispose();let n=a.current;if(n){n.onmessage=null,n.onopen=null,n.onerror=null,n.onclose=null;try{n.close()}catch{}}a.current=null;let r=c;r&&o.current?.id===r&&o.current.projectId===t&&(o.current=null),r&&(f.current>0?p.current.set(`${t}\0${r}`,{sessionId:r,projectId:t}):fo(t,r))}},[n,t,r,m,d]);let v=(0,X.useCallback)(e=>{let t=a.current;if(t&&t.readyState===WebSocket.OPEN)try{t.send(JSON.stringify({type:`input`,event:e}))}catch{}},[]),y=(0,X.useCallback)(async(e,t)=>{let n=o.current;if(n)try{let r=await no(n.projectId,n.id,e,t);if(o.current!==n)return;r.target!==`popup`&&_(e=>({...e,url:r.url,title:r.title}))}catch{}},[]),b=(0,X.useCallback)(async(e,t,n)=>{let r=o.current;if(!r)throw Error(`No active browser session`);f.current+=1;try{return await ro(r.projectId,r.id,e,t,n)}finally{f.current=Math.max(0,f.current-1),m()}},[m]),x=(0,X.useCallback)(async(e,t,n,r)=>{let i=o.current;if(!i)throw Error(`No active browser session`);f.current+=1;try{return await ao(i.projectId,i.id,e,t,n,r)}finally{f.current=Math.max(0,f.current-1),m()}},[m]),S=(0,X.useCallback)(async(e,t)=>{let n=o.current;return n?so(n.projectId,n.id,e,t):{text:``}},[]),C=(0,X.useCallback)((e,t,n=window.devicePixelRatio||1)=>{if(!Number.isFinite(e)||!Number.isFinite(t)||e<=0||t<=0)return;let r=Math.max(1,Math.round(e)),i=Math.max(1,Math.round(t));l.current={width:r,height:i,deviceScaleFactor:Number.isFinite(n)?Math.min(2,Math.max(1,n)):1},_(e=>e.viewport.width===r&&e.viewport.height===i?e:{...e,viewport:{width:r,height:i}}),d()},[d]),w=(0,X.useCallback)(e=>{let t=a.current;if(t&&t.readyState===WebSocket.OPEN)try{t.send(JSON.stringify({type:`probe`,x:e.x,y:e.y}))}catch{}},[]),T=(0,X.useCallback)(()=>{_(e=>e.hoverRect||e.hoverPath?{...e,hoverRect:null,hoverSelector:null,hoverPath:null}:e)},[]),E=(0,X.useCallback)(async(e,t)=>{let n=o.current;return n?co(n.projectId,n.id,e,t):null},[]),D=(0,X.useCallback)(async e=>{let t=o.current;if(!t)return;let n=s.current,r=++c.current,i=()=>o.current===t&&s.current===n&&c.current===r;try{await lo(t.projectId,t.id,e),i()&&_(e=>({...e,popupError:null}))}catch{i()&&_(e=>({...e,popupError:g.t(`browser:session.connectionError`)}))}},[]);return{...h,canvasRef:i,forwardInput:v,navigate:y,capture:b,captureBreakpoints:x,clipboard:S,navigateElement:E,setViewport:C,probe:w,clearHover:T,setPopupView:D}}function ss(e,t,n,r){let i=(0,X.useRef)(t);i.current=t,(0,X.useEffect)(()=>{let t=e.current;if(!n||!t)return;let a=!1,o=null,s=0,c=0,l=0,u=null,d=()=>{if(o=null,a)return;let e=r??t.getBoundingClientRect();if(!Number.isFinite(e.width)||!Number.isFinite(e.height)||e.width<=0||e.height<=0)return;let n=Math.max(1,Math.round(e.width)),u=Math.max(1,Math.round(e.height)),d=window.devicePixelRatio,f=Number.isFinite(d)?Math.min(2,Math.max(1,d)):1;n===s&&u===c&&f===l||(s=n,c=u,l=f,i.current(n,u,f))},f=()=>{a||o===null&&(o=requestAnimationFrame(d))},p=()=>{u?.removeEventListener(`change`,m),u=typeof window.matchMedia==`function`?window.matchMedia(`(resolution: ${window.devicePixelRatio||1}dppx)`):null,u?.addEventListener(`change`,m)},m=()=>{f(),p()};d();let h=typeof ResizeObserver>`u`?null:new ResizeObserver(f);return h?.observe(t),window.addEventListener(`resize`,f),p(),()=>{a=!0,o!==null&&cancelAnimationFrame(o),h?.disconnect(),u?.removeEventListener(`change`,m),window.removeEventListener(`resize`,f)}},[e,n,r?.width,r?.height])}function cs({open:e,url:t,projectId:n,onClose:r}){let[i,a]=(0,X.useState)(`probing`);(0,X.useEffect)(()=>{if(!e||i!==`probing`)return;let t=!0;return Ko().then(e=>{t&&a(e?`native`:`screencast`)}),()=>{t=!1}},[e,i]);let o=(0,X.useCallback)(()=>a(`screencast`),[]);return!e||i===`probing`?null:i===`native`?(0,Z.jsx)(es,{url:t,onClose:r,onFallback:o}):(0,Z.jsx)(ls,{open:e,url:t,projectId:n,onClose:r})}function ls({open:e,url:t,projectId:n,onClose:r}){let{t:i}=v(`browser`),a=os({projectId:n,open:e,initialUrl:t}),{canvasRef:o,viewport:s,status:c,errorMsg:l,url:u,title:d,popup:f,popupError:p,setViewport:m}=a,[h,g]=(0,X.useState)(t),_=(0,X.useRef)(null),[y,b]=(0,X.useState)(null),x=(0,X.useCallback)(e=>{_.current=e,b(e)},[]);ss(_,m,e&&y!==null);let S=(0,X.useRef)(a.forwardInput);S.current=a.forwardInput;let C=(0,X.useRef)(null),w=(0,X.useCallback)(()=>(C.current??=ho(e=>S.current(e)),C.current),[]);(0,X.useEffect)(()=>()=>{C.current?.dispose(),C.current=null},[]);let E=f?.active?f.url??`about:blank`:u??``;(0,X.useEffect)(()=>{g(E)},[E,f?.active]);let O=(0,X.useCallback)((e,t)=>{let n=o.current?.getBoundingClientRect();return n?go({x:e,y:t},{left:n.left,top:n.top,width:n.width,height:n.height},s):{x:0,y:0}},[o,s]),k=e=>e===2?`right`:e===1?`middle`:`left`,A=(0,X.useCallback)(e=>{let t=O(e.clientX,e.clientY);w().move(t.x,t.y)},[O,w]),j=(0,X.useCallback)(e=>{let t=O(e.clientX,e.clientY),n=w();n.move(t.x,t.y),n.flush(),a.forwardInput({type:`mouse`,action:`down`,x:t.x,y:t.y,button:k(e.button),clickCount:e.detail||1})},[O,a,w]),M=(0,X.useCallback)(e=>{let t=O(e.clientX,e.clientY),n=w();n.move(t.x,t.y),n.flush(),a.forwardInput({type:`mouse`,action:`up`,x:t.x,y:t.y,button:k(e.button),clickCount:e.detail||1})},[O,a,w]),N=(0,X.useCallback)(e=>{let t=O(e.clientX,e.clientY);w().wheel(t.x,t.y,e.deltaX,e.deltaY)},[O,w]),P=(0,X.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),$o(e.key)&&(e.preventDefault(),e.stopPropagation())},[a]),I=(0,X.useCallback)(e=>{e.key!==`Escape`&&a.forwardInput({type:`key`,action:`up`,key:e.key,code:e.code})},[a]),L=(0,X.useCallback)(()=>{a.navigate(`goto`,h)},[a,h]);return!e||typeof document>`u`?null:(0,Z.jsxs)(Qo,{label:i(`modal.dialogLabel`),onClose:r,testId:`webview-modal`,children:[(0,Z.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,Z.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,Z.jsx)(J,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":i(`common:actions.back`),onClick:()=>a.navigate(`back`),children:(0,Z.jsx)(T,{className:`w-4 h-4`})}),(0,Z.jsx)(J,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":i(`modal.nav.forward`),onClick:()=>a.navigate(`forward`),children:(0,Z.jsx)(D,{className:`w-4 h-4`})}),(0,Z.jsx)(J,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":i(`modal.nav.reload`),onClick:()=>a.navigate(`reload`),children:(0,Z.jsx)(Un,{className:`w-4 h-4`})})]}),(0,Z.jsxs)(`form`,{className:`flex-1 flex items-center gap-2 min-w-0`,onSubmit:e=>{e.preventDefault(),L()},children:[(0,Z.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 focus-within:ring-2 focus-within:ring-ring`,children:[(0,Z.jsx)(F,{className:`w-3.5 h-3.5 text-muted-foreground shrink-0`}),(0,Z.jsx)(`input`,{value:h,onChange:e=>g(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),L())},placeholder:i(`modal.address.placeholder`),"aria-label":i(`modal.address.label`),className:`flex-1 min-w-0 bg-transparent outline-none focus-visible:ring-2 focus-visible:ring-ring text-sm`})]}),(0,Z.jsx)(J,{type:`submit`,size:`sm`,variant:`secondary`,className:`shrink-0`,disabled:c===`error`,children:i(`modal.address.go`)})]}),(0,Z.jsx)(J,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":i(`modal.closeBrowser`),onClick:r,children:(0,Z.jsx)(be,{className:`w-4 h-4`})})]}),(0,Z.jsxs)(`div`,{className:`px-3 py-1 text-xs text-muted-foreground truncate shrink-0 flex items-center gap-2`,children:[(0,Z.jsx)(Ma,{tone:c===`ready`?`success`:c===`error`?`destructive`:`warning`,pulsing:c!==`ready`&&c!==`error`,"aria-hidden":!0}),(0,Z.jsx)(`span`,{className:`truncate`,children:c===`connecting`?i(`modal.status.connecting`):c===`error`?l??i(`modal.status.unavailable`):f?.active?i(`popup.loginWindow`,{origin:uo(f.url)}):d||``})]}),p&&(0,Z.jsx)(`div`,{role:`alert`,className:`px-3 py-1.5 text-xs text-destructive border-b border-border/40 shrink-0`,children:p}),f&&(0,Z.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,Z.jsx)(se,{className:`w-3.5 h-3.5 shrink-0`}),f.active?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`span`,{className:`truncate font-medium`,children:i(`popup.loginWindow`,{origin:uo(f.url)})}),f.count>1&&(0,Z.jsx)(`span`,{className:`shrink-0 opacity-70`,children:i(`popup.stacked`,{count:f.count-1})}),(0,Z.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,Z.jsx)(T,{className:`w-3 h-3`}),i(`popup.backToPage`)]})]}):(0,Z.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,Z.jsx)(`span`,{className:`opacity-70`,children:i(`popup.stacked`,{count:f.count-1})})]})]}),(0,Z.jsx)(`div`,{ref:x,className:`relative flex-1 min-h-0 overflow-hidden flex items-center justify-center outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring`,tabIndex:0,onKeyDown:P,onKeyUp:I,children:c===`error`?(0,Z.jsxs)(`div`,{className:`flex flex-col items-center gap-2 text-center max-w-md px-6`,children:[(0,Z.jsx)(ve,{className:`w-8 h-8 text-accent-warning`}),(0,Z.jsx)(`p`,{className:`text-sm text-foreground`,children:l??i(`modal.error.unavailable`)})]}):(0,Z.jsx)(`canvas`,{ref:o,style:{maxWidth:`min(100%, ${s.width}px)`,maxHeight:`min(100%, ${s.height}px)`},className:`max-w-full max-h-full block shadow-2xl cursor-default`,onPointerMove:A,onPointerDown:j,onPointerUp:M,onContextMenu:e=>e.preventDefault(),onWheel:N})})]})}var us=(0,X.createContext)(null);function ds({children:e}){let{activeProjectId:t}=q(),[n,r]=(0,X.useState)(null),i=(0,X.useCallback)(e=>r(e),[]),a=Xa();return(0,Z.jsxs)(us.Provider,{value:{openWebView:i,canOpenWebView:a&&!!t},children:[e,a&&n&&t&&(0,Z.jsx)(cs,{open:!0,url:n,projectId:t,onClose:()=>r(null)})]})}var fs={openWebView:()=>{},canOpenWebView:!1};function ps(){return(0,X.useContext)(us)??fs}function ms(e){return e.some(e=>e.trim().toLowerCase()===`bug`)}function hs({value:e,onChange:t,disabled:n}){let{t:r}=v(`tickets`),[i,a]=(0,X.useState)({loading:!0,error:!1,deliveries:[]});(0,X.useEffect)(()=>{let e=!0,t=new AbortController;return(async()=>{try{let n=await fetch(`${h()}/analytics/loop-economics/deliveries?limit=50`,{signal:t.signal});if(!n.ok)throw Error(`deliveries unavailable`);let r=await n.json(),i=Array.isArray(r.deliveries)?r.deliveries.filter(e=>e&&typeof e.id==`string`):[];e&&a({loading:!1,error:!1,deliveries:i})}catch{e&&a({loading:!1,error:!0,deliveries:[]})}})(),()=>{e=!1,t.abort()}},[]);let o=e=>{let t=e.createdAt?new Date(e.createdAt.includes(`T`)?e.createdAt:`${e.createdAt.replace(` `,`T`)}Z`).toLocaleDateString():``,n=r(`regressionOf.option`,{loop:e.loopName||e.loopId||e.id,date:t});return e.ticketIds.length>0?`${n} · ${r(`regressionOf.tickets`,{ids:e.ticketIds.join(`, #`)})}`:n},s=e===null||i.deliveries.some(t=>t.id===e);return(0,Z.jsxs)(`div`,{"data-testid":`regression-of-picker`,children:[(0,Z.jsx)(`label`,{htmlFor:`regression-of-select`,className:`text-label text-muted-foreground block mb-1`,children:r(`regressionOf.label`)}),(0,Z.jsxs)(`select`,{id:`regression-of-select`,value:e??``,disabled:n||i.loading,onChange:e=>t(e.target.value||null),className:`w-full h-7 rounded border border-border bg-input px-2 text-xs text-foreground`,children:[(0,Z.jsx)(`option`,{value:``,children:i.loading?r(`regressionOf.loading`):r(`regressionOf.none`)}),!s&&e!==null&&(0,Z.jsx)(`option`,{value:e,children:r(`regressionOf.missing`,{id:e})}),i.deliveries.map(e=>(0,Z.jsx)(`option`,{value:e.id,children:o(e)},e.id))]}),(0,Z.jsx)(`span`,{className:`text-caption text-muted-foreground mt-0.5 block`,children:i.error?r(`regressionOf.unavailable`):!i.loading&&i.deliveries.length===0?r(`regressionOf.empty`):r(`regressionOf.hint`)})]})}function gs(e){let t=[];for(let n of e.replace(/\r\n?/g,`
|
|
13
|
+
`).split(`
|
|
14
|
+
`)){let e=n.replace(/^\s*(?:[-*+•]|\d+[.)])\s+/,``).replace(/\s+/g,` `).trim();e&&!t.includes(e)&&t.push(e)}return t}function _s({value:e,onChange:t,disabled:n}){let{t:r}=v(`tickets`),[i,a]=(0,X.useState)(!1),[o,s]=(0,X.useState)(e.join(`
|
|
15
|
+
`)),c=(0,X.useRef)(null);(0,X.useEffect)(()=>{i||s(e.join(`
|
|
16
|
+
`))},[e,i]),(0,X.useEffect)(()=>{i&&c.current?.focus()},[i]);let l=()=>{t(gs(o)),a(!1)};return(0,Z.jsxs)(`section`,{"data-testid":`ticket-non-goals`,"aria-labelledby":`ticket-non-goals-heading`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between mb-1.5`,children:[(0,Z.jsxs)(`span`,{id:`ticket-non-goals-heading`,className:`text-label text-muted-foreground flex items-center gap-1.5`,children:[(0,Z.jsx)(B,{className:`w-3 h-3`,"aria-hidden":`true`}),r(`nonGoals.title`)]}),!i&&e.length>0&&(0,Z.jsxs)(`button`,{type:`button`,disabled:n,onClick:()=>a(!0),className:`text-caption text-muted-foreground hover:text-foreground transition-colors flex items-center gap-1 disabled:opacity-50`,children:[(0,Z.jsx)(me,{className:`w-2.5 h-2.5`}),r(`common:actions.edit`)]})]}),i?(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(`textarea`,{ref:c,value:o,onChange:e=>s(e.target.value),onKeyDown:e=>{e.key===`Escape`&&(e.stopPropagation(),l())},rows:Math.min(8,Math.max(3,o.split(`
|
|
17
|
+
`).length+1)),"aria-label":r(`nonGoals.ariaLabel`),placeholder:r(`nonGoals.placeholder`),className:`w-full rounded-lg border border-border bg-input px-3 py-2 text-xs text-foreground placeholder:text-muted-foreground resize-y`}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Z.jsx)(J,{variant:`ghost`,size:`sm`,className:`h-6 text-caption`,onClick:l,children:r(`detailModal.doneEditing`)}),(0,Z.jsx)(`span`,{className:`text-caption text-muted-foreground`,children:r(`nonGoals.onePerLine`)})]})]}):e.length>0?(0,Z.jsx)(`ul`,{className:`rounded-lg border border-border/40 bg-muted/10 px-3 py-2 space-y-1`,children:e.map(e=>(0,Z.jsxs)(`li`,{className:`flex items-start gap-2 text-xs text-foreground`,children:[(0,Z.jsx)(`span`,{"aria-hidden":`true`,className:`mt-[5px] h-1 w-1 shrink-0 rounded-full bg-muted-foreground/60`}),(0,Z.jsx)(`span`,{className:`min-w-0 break-words`,children:e})]},e))}):(0,Z.jsx)(`button`,{type:`button`,disabled:n,onClick:()=>a(!0),className:`w-full rounded-lg border border-dashed border-border/40 bg-muted/10 px-3 py-2 text-xs text-muted-foreground hover:text-foreground hover:bg-muted/20 transition-colors text-left disabled:opacity-50`,children:r(`nonGoals.add`)})]})}var vs={analyzing:`activity:smash.stage.analyzing`,identifying:`activity:smash.stage.identifying`,ordering:`activity:smash.stage.ordering`},ys=(0,X.createContext)(null);function bs(e){return`smash:${e}`}async function xs(e,t){try{let n=await fetch(`${b}/api/projects/${e}/tickets/${t}/smash`,{method:`POST`});if(n.ok)m.loading(g.t(`activity:smash.retrying`),{id:bs(t)});else{let e=await n.json().catch(()=>({}));C(g.t(`activity:smash.couldNotRetry`),{detail:e.reason,id:bs(t)})}}catch(e){C(g.t(`activity:smash.retryFailed`),{detail:e.message,id:bs(t)})}}async function Ss(e,t,n){try{let r=await fetch(`${b}/api/projects/${e}/tickets/${t}/smash/undo`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({smashedAt:n})});if(r.ok)m.success(g.t(`activity:smash.undone`),{id:bs(t),duration:3e3});else{let e=await r.json().catch(()=>({}));C(g.t(`activity:smash.undoFailed`),{detail:e.reason,id:bs(t)})}}catch(e){C(g.t(`activity:smash.undoFailed`),{detail:e.message,id:bs(t)})}}function Cs({children:e}){let{registerHandler:t,unregisterHandler:n}=d(),[r,i]=(0,X.useState)({}),a=(0,X.useRef)(new Map),o=(0,X.useRef)(new Map),s=(0,X.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}})),m.loading(g.t(vs.analyzing),{id:bs(n),description:c?g.t(`activity:smash.onTitled`,{title:c}):g.t(`activity:smash.onThisSpec`)}))},[]),c=(0,X.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}),m.loading(g.t(vs[r]),{id:bs(n),description:a?g.t(`activity:smash.onTitled`,{title:a}):g.t(`activity:smash.onThisSpec`)})},[]),l=(0,X.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}),m.success(g.t(`activity:smash.split`,{count:c.length}),{id:bs(n),duration:1e4,action:{label:g.t(`activity:smash.undoAction`),onClick:()=>void Ss(a,n,s)}}))},[]),u=(0,X.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`?g.t(`activity:smash.failReason.invalidOutput`):o===`timeout`?g.t(`activity:smash.failReason.timeout`):o===`model_error`?g.t(`activity:smash.failReason.modelError`):o===`crashed`?g.t(`activity:smash.failReason.crashed`):g.t(`activity:smash.failReason.generic`,{reason:o});C(g.t(`activity:smash.couldNotComplete`),{id:bs(n),detail:s,action:{label:g.t(`common:actions.retry`),onClick:()=>void xs(r,n)},duration:15e3})},[]),f=(0,X.useCallback)(e=>{let t=e;if(!t||t.type!==`smash.undone`)return;let n=t.ticketId;typeof n==`number`&&(m.dismiss(bs(n)),m.success(g.t(`activity:smash.undone`),{id:bs(n),duration:3e3}))},[]);(0,X.useLayoutEffect)(()=>(t(`_smash_started`,s),t(`_smash_progress`,c),t(`_smash_completed`,l),t(`_smash_failed`,u),t(`_smash_undone`,f),()=>{n(`_smash_started`),n(`_smash_progress`),n(`_smash_completed`),n(`_smash_failed`),n(`_smash_undone`)}),[t,n,s,c,l,u,f]),(0,X.useEffect)(()=>()=>{a.current.clear(),o.current.clear()},[]);let p=(0,X.useMemo)(()=>({inflight:r}),[r]);return(0,Z.jsx)(ys.Provider,{value:p,children:e})}function ws(e){let t=(0,X.useContext)(ys);return!t||e==null?null:t.inflight[e]??null}var Ts=150,Es={analyzing:0,identifying:1,ordering:2},Ds={analyzing:`smash.stage.analyzing`,identifying:`smash.stage.identifying`,ordering:`smash.stage.ordering`};function Os({stage:e,minDisplayMs:t=Ts}){let{t:n}=v(`activity`),[r,i]=(0,X.useState)(e),a=(0,X.useRef)(Date.now()),o=(0,X.useRef)(null);if((0,X.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=Es[r];return(0,Z.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,Z.jsx)(Ma,{dotClassName:`bg-accent-highlight`,size:`sm`,"aria-hidden":!0}),(0,Z.jsx)(`div`,{className:`flex items-center gap-1.5`,children:[`analyzing`,`identifying`,`ordering`].map(e=>(0,Z.jsx)(`span`,{className:[`inline-block w-1.5 h-1.5 rounded-full transition-all`,Es[e]<=s?`bg-accent-highlight`:`bg-muted`,e===r?`scale-125`:`scale-100`].join(` `),"aria-hidden":!0},e))}),(0,Z.jsx)(`span`,{className:`font-medium`,children:n(Ds[r])})]})}var ks={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 As({open:e,ticketTitle:t,isReSmash:n,childrenCount:r,submitting:i=!1,onCancel:a,onConfirm:o}){let{t:s}=v(`activity`),[c,l]=(0,X.useState)(`simple`);return(0,Z.jsx)(Me,{open:e,onOpenChange:e=>{!e&&!i&&a()},children:(0,Z.jsxs)(Oe,{size:`form`,layer:`stacked`,showCloseButton:!1,"data-testid":`smash-confirm-modal`,children:[(0,Z.jsxs)(ke,{icon:(0,Z.jsx)(qn,{}),children:[(0,Z.jsx)(Le,{children:s(`smashModal.title`)}),(0,Z.jsx)(`p`,{className:`truncate text-label text-foreground`,title:t,"data-testid":`smash-confirm-modal-ticket`,children:t}),(0,Z.jsx)(Fe,{children:s(`smashModal.description`)})]}),(0,Z.jsxs)(Ee,{className:`space-y-3`,children:[n&&r>0&&(0,Z.jsx)(`div`,{className:`rounded-md border border-accent-warning/40 bg-accent-warning/10 px-3 py-2 text-xs text-foreground`,children:(0,Z.jsx)(_,{t:s,i18nKey:`smashModal.reSmashWarning`,count:r})}),(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsx)(`p`,{className:`text-label text-muted-foreground`,children:s(`smashModal.modePickerLabel`)}),[`simple`,`full`].map(e=>{let t=ks[e],n=c===e;return(0,Z.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,Z.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Z.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,Z.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-2 mb-1`,children:[(0,Z.jsxs)(`span`,{className:`flex items-center gap-1.5 text-strong text-foreground`,children:[e===`full`&&(0,Z.jsx)(xe,{className:`w-3.5 h-3.5 text-accent-highlight`,"aria-hidden":!0}),s(t.titleKey)]}),(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground tabular-nums`,children:s(t.etaKey)})]}),(0,Z.jsx)(`ul`,{className:`space-y-0.5`,children:t.bulletKeys.map(e=>(0,Z.jsxs)(`li`,{className:`text-xs text-muted-foreground leading-snug`,children:[`• `,s(e)]},e))})]})]})},e)})]})]}),(0,Z.jsxs)(Re,{children:[(0,Z.jsx)(J,{variant:`ghost`,onClick:a,disabled:i,children:s(`common:actions.cancel`)}),(0,Z.jsxs)(J,{onClick:()=>o(c),disabled:i,"data-testid":`smash-confirm-modal-continue`,children:[(0,Z.jsx)(qn,{className:`w-3.5 h-3.5 mr-1.5`}),s(i?`smashModal.starting`:n?`smashModal.confirmReSmash`:`smashModal.smash`)]})]})]})})}var js=`## Contract Layer`;function Ms(e,t){return!(!t||e.status===`draft`||e.parent_epic_id!=null||!e.description?.includes(js))}function Ns({ticket:e,projectId:t,provider:n,featureFlagOn:r,childrenCount:i,hideButton:a=!1,openRequest:o=0,onAvailableChange:s}){let{t:c}=v(`activity`),l=ws(e.id),[u,d]=(0,X.useState)(!1),[f,p]=(0,X.useState)(!1),[m,h]=(0,X.useState)(e.origin_conversation_id?void 0:null);(0,X.useEffect)(()=>{let r=e.origin_conversation_id;if(!r){h(null);return}let i=!1;return h(void 0),fetch(`${b}/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||h(t.conversation?.provider??n??null)}).catch(()=>{i||h(null)}),()=>{i=!0}},[t,n,e.origin_conversation_id]);let g=e.origin_conversation_id?m:n,_=r&&w(g),y=e.is_epic===!0,x=!y&&Ms(e,_),S=y&&_,T=y&&i>0,E=x||S;(0,X.useEffect)(()=>{s?.(E)},[E,s]),(0,X.useEffect)(()=>{o>0&&E&&d(!0)},[o,E]);let D=(0,X.useCallback)(async n=>{if(_){p(!0);try{let r=await fetch(`${b}/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(()=>({}));C(e.reason?c(`smash.couldNotStartWithReason`,{reason:e.reason}):c(`smash.couldNotStart`));return}d(!1)}catch(e){C(c(`smash.smashFailed`),{detail:e.message})}finally{p(!1)}}},[t,e.id,c,_]),O=(0,X.useCallback)(async n=>{if(_){if(T){p(!0);try{if(!(await fetch(`${b}/api/projects/${t}/tickets/${e.id}/children`,{method:`DELETE`})).ok){C(c(`smash.couldNotDeleteChildren`)),p(!1);return}}catch(e){C(c(`smash.deleteFailed`),{detail:e.message}),p(!1);return}}await D(n)}},[T,D,t,e.id,c,_]);return!x&&!S?null:l?(0,Z.jsx)(`div`,{className:`flex flex-col gap-2`,"data-testid":`smash-actions-streaming`,children:(0,Z.jsx)(Os,{stage:l.stage})}):(0,Z.jsxs)(Z.Fragment,{children:[!a&&(0,Z.jsxs)(J,{size:`sm`,variant:`outline`,onClick:()=>d(!0),className:`border-accent-highlight/40 text-accent-highlight hover:bg-accent-highlight/10`,"data-testid":S?`resmash-button`:`smash-button`,children:[(0,Z.jsx)(qn,{className:`w-3.5 h-3.5 mr-1.5`}),c(S?`smash.reSmashButton`:`smash.smashButton`)]}),(0,Z.jsx)(As,{open:u,ticketTitle:e.title,isReSmash:T,childrenCount:i,submitting:f,onCancel:()=>d(!1),onConfirm:O})]})}function Ps({epic:e,childExecutionOrder:t,totalChildren:n,onOpenEpic:r}){let{t:i}=v(`activity`);return(0,Z.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,Z.jsxs)(`button`,{type:`button`,onClick:r,className:`text-accent-secondary hover:underline font-medium`,children:[`← `,e.title]}),t!=null&&n>0&&(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:i(`epicChildren.step`,{order:t,total:n})})]})}var Fs={critical:`bg-destructive`,high:`bg-accent-warning`,medium:`bg-accent-warning/60`,low:`bg-muted-foreground/60`};function Is(e){return e?Fs[e]:`bg-muted`}function Ls(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 Rs({ticket:e,allTickets:t,onOpenTicket:n}){let{t:r}=v(`activity`),i=e.is_epic===!0,a=e.parent_epic_id!=null;if(!i&&!a)return null;if(i){let i=Ls(t.filter(t=>t.parent_epic_id===e.id));return(0,Z.jsx)(zs,{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=Ls(t.filter(t=>t.parent_epic_id===e.parent_epic_id)),c=o?[o,...s]:s;return(0,Z.jsx)(zs,{header:r(`family.familyHeader`,{count:s.length}),rows:c,currentId:e.id,onOpenTicket:n,emptyMessage:r(`family.noSiblings`)})}function zs({header:e,rows:t,currentId:n,onOpenTicket:r,emptyMessage:i}){let{t:a}=v(`activity`);return(0,Z.jsxs)(`div`,{"data-testid":`epic-family-sidebar`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-1.5 mb-1.5`,children:[(0,Z.jsx)(qn,{className:`w-3 h-3 text-accent-highlight`,"aria-hidden":!0}),(0,Z.jsx)(`span`,{className:`text-label text-muted-foreground`,children:e})]}),t.length===0?(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground italic`,children:i}):(0,Z.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,Z.jsx)(`li`,{children:(0,Z.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/50 cursor-pointer`].join(` `),"data-testid":`epic-family-row-${e.id}`,children:[i?(0,Z.jsx)(P,{className:`w-3 h-3 text-accent-highlight flex-shrink-0`,"aria-hidden":!0}):(0,Z.jsx)(`span`,{className:`text-caption tabular-nums text-muted-foreground w-3 text-center flex-shrink-0`,children:e.execution_order??`–`}),(0,Z.jsx)(`span`,{className:`inline-block w-1.5 h-1.5 rounded-full flex-shrink-0 ${Is(e.priority)}`,"aria-hidden":!0}),e.priority&&(0,Z.jsx)(`span`,{className:`sr-only`,children:a(`family.priority`,{p:e.priority})}),(0,Z.jsx)(`span`,{className:`text-caption truncate ${t?`text-foreground font-medium`:`text-foreground`}`,title:e.title,children:e.title})]})},e.id)})})]})}var Bs=224,Vs=8,Hs=8;function Us({rails:e,onMoveToRail:t,onClose:n,anchorRect:r}){let{t:i}=v(`tickets`),a=(0,X.useRef)(null),[o,s]=(0,X.useState)(!1);(0,X.useLayoutEffect)(()=>{let e=requestAnimationFrame(()=>s(!0));return()=>cancelAnimationFrame(e)},[]),(0,X.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,X.useMemo)(()=>{let e=r.left+r.width/2,t=e-Bs/2,n=window.innerWidth-Bs-Vs,i=Math.max(Vs,Math.min(n,t)),a=e-i,o=Math.max(12,Math.min(Bs-12,a));return{top:r.bottom+Hs,left:i,caretLeft:o}},[r]);return(0,Z.jsxs)(`div`,{ref:a,role:`dialog`,"aria-label":i(`rail.popoverTitle`),"data-testid":`move-to-rail-popover`,style:{top:c,left:l,width:Bs,opacity:+!!o,transform:o?`translateY(0) scale(1)`:`translateY(-4px) scale(0.97)`,transformOrigin:`${u}px top`,transition:`opacity 150ms ease-out, transform 160ms cubic-bezier(0.22, 1, 0.36, 1)`},className:`fixed z-50 rounded-xl border border-border/60 bg-popover shadow-xl shadow-black/40 p-1`,children:[(0,Z.jsx)(`div`,{"aria-hidden":!0,className:`absolute w-2 h-2 rotate-45 bg-popover border-l border-t border-border/60`,style:{top:-5,left:u-4}}),(0,Z.jsx)(`div`,{className:`px-2 py-1.5 text-label text-muted-foreground`,children:i(`rail.popoverTitle`)}),e.length===0?(0,Z.jsx)(`div`,{className:`px-2 py-2 text-xs text-muted-foreground`,children:i(`rail.noRails`)}):(0,Z.jsx)(`ul`,{className:`flex flex-col`,children:e.map(e=>(0,Z.jsx)(`li`,{children:(0,Z.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,Z.jsx)(le,{className:`w-3 h-3 text-accent-success motion-safe:animate-pulse shrink-0`,"aria-hidden":!0}):(0,Z.jsx)(k,{className:`w-3 h-3 text-muted-foreground shrink-0`,"aria-hidden":!0}),(0,Z.jsx)(`span`,{className:`flex-1 truncate`,children:e.label}),(0,Z.jsx)(ln,{className:`w-3.5 h-3.5 text-muted-foreground shrink-0`,"aria-hidden":!0})]})},e.id))})]})}var Ws=(0,X.createContext)(Object.freeze({}));function Gs({value:e,children:t}){return(0,Z.jsx)(Ws.Provider,{value:e,children:t})}function Ks(){return(0,X.useContext)(Ws)}var qs=900,Js=.2,Ys=[{value:`critical`,labelKey:`priority.critical`,className:`text-destructive`},{value:`high`,labelKey:`priority.high`,className:`text-accent-warning`},{value:`medium`,labelKey:`priority.medium`,className:`text-accent-highlight`},{value:`low`,labelKey:`priority.low`,className:`text-muted-foreground`}];function Xs(e){return e.jira_epic_key&&e.jira_url?e.jira_url.replace(/\/browse\/[^/]+$/,`/browse/${e.jira_epic_key}`):null}var Zs={manual:`source.manual`,"product-backlog":`source.productBacklog`,"propose-spec":`source.proposeSpec`,"get-backlog-specs":`source.getBacklogSpecs`,"free-prompt":`source.freePrompt`};function Qs({ticket:e,allLabels:t,allTickets:n,onClose:r,onOpenTicket:i,onSave:a,onDelete:o,rails:s,onMoveToRail:l,onRemoveFromRail:u,embedded:d=!1}){let{t:f}=v(`tickets`),{t:p}=v(`jira`),{t:h}=v(`activity`),{StartAlternative:g}=Ks(),{activeProjectId:_,projects:y}=q(),{enterSplit:b,state:x}=Tc(),S=x.originSide!==null,{t:T}=v(`tickets`);Ea(`handoff`,{ticketId:()=>e.id,exportHandoff:e=>{_a(e,`md`,T)},copyPrDescription:e=>{va(e,T)}});let O=y.find(e=>e.id===_)?.provider,k=w(O),[A,j]=(0,X.useState)(`details`);(0,X.useEffect)(()=>{j(`details`)},[e.id]);let[M,N]=(0,X.useState)(!1),[P,F]=(0,X.useState)(!1),[I,L]=(0,X.useState)(0),R=(0,X.useMemo)(()=>(n??[]).filter(t=>t.parent_epic_id===e.id),[n,e.id]),z=(0,X.useMemo)(()=>e.parent_epic_id==null?null:(n??[]).find(t=>t.id===e.parent_epic_id)??null,[n,e.parent_epic_id]),B=(0,X.useMemo)(()=>z?(n??[]).filter(e=>e.parent_epic_id===z.id).length:0,[n,z]),[V,H]=(0,X.useState)(e.title),[U,re]=(0,X.useState)(e.description),[le,ue]=(0,X.useState)(e.priority??`medium`),[G,fe]=(0,X.useState)([...e.labels??[]]),[ge,_e]=(0,X.useState)(e.repositoryIds),[ve,ye]=(0,X.useState)(e.metadata?.regressionOf??null),[xe,Ee]=(0,X.useState)([...e.nonGoals??[]]),[Oe,ke]=(0,X.useState)(!1),[Me,Fe]=(0,X.useState)(!1),[Le,Re]=(0,X.useState)(``),[Ve,He]=(0,X.useState)(!1),[Ue,We]=(0,X.useState)(!1),[Ge,Ke]=(0,X.useState)(!1),[qe,Je]=(0,X.useState)(!1),[et,tt]=(0,X.useState)(!1),nt=Ia(),rt=nt.connected&&!!nt.discardStatus&&e.source===`jira`&&!!e.jira_key,it=nt.connected&&e.source===`jira`&&!!e.jira_key,[st,ct]=(0,X.useState)(e.attachments??[]);(0,X.useEffect)(()=>{ct(e.attachments??[])},[e.attachments,e.id]);let[lt,ut]=(0,X.useState)(!1),[dt,ft]=(0,X.useState)(null);(0,X.useEffect)(()=>{if(!it)return;let e=!0;return at.listStatuses().then(t=>{e&&ft(t.statuses)}).catch(()=>{e&&ft([])}),()=>{e=!1}},[it,e.id]);let pt=e.jira_status??``,mt=async t=>{if(t!==e.status){ut(!0);try{await a(e.id,{status:t})}finally{ut(!1)}}},ht=async t=>{if(!(!t||t===pt)){ut(!0);try{await Ba(e.id,t,p)}finally{ut(!1)}}},gt=(0,X.useRef)(null),_t=(0,X.useRef)(null),vt=(0,X.useRef)(null),yt=(0,X.useMemo)(()=>V!==e.title||U!==e.description||le!==e.priority||JSON.stringify(G)!==JSON.stringify(e.labels)||JSON.stringify(ge)!==JSON.stringify(e.repositoryIds)||ve!==(e.metadata?.regressionOf??null)||JSON.stringify(xe)!==JSON.stringify(e.nonGoals??[]),[V,U,le,G,ge,ve,xe,e]);(0,X.useEffect)(()=>{Oe&>.current?.focus()},[Oe]),(0,X.useEffect)(()=>{if(Me){let e=_t.current;e&&(e.focus(),e.selectionStart=e.value.length)}},[Me]),(0,X.useEffect)(()=>{Ve&&vt.current?.focus()},[Ve]);let bt=(0,X.useCallback)(e=>{let t=e.target instanceof HTMLElement?e.target:null;(Oe||Me||t?.closest(`input, textarea, select, [contenteditable="true"]`)||document.querySelector(`[data-testid="move-to-rail-popover"]`))&&e.preventDefault()},[Oe,Me]),xt=(0,X.useMemo)(()=>{if(!Le.trim())return[];let e=Le.toLowerCase();return t.filter(t=>t.toLowerCase().includes(e)&&!G.includes(t)).slice(0,5)},[Le,t,G]),St=(0,X.useCallback)(e=>{let t=e.trim();t&&!G.includes(t)&&fe(e=>[...e,t]),Re(``)},[G]),Ct=(0,X.useCallback)(e=>{fe(t=>t.filter(t=>t!==e))},[]),wt=(0,X.useCallback)(async()=>{let t={};if(V!==e.title&&(t.title=V),U!==e.description&&(t.description=U),le!==e.priority&&(t.priority=le),JSON.stringify(G)!==JSON.stringify(e.labels)&&(t.labels=G),JSON.stringify(ge)!==JSON.stringify(e.repositoryIds)&&(t.repositoryIds=ge),ve!==(e.metadata?.regressionOf??null)&&(t.metadata={regressionOf:ve}),JSON.stringify(xe)!==JSON.stringify(e.nonGoals??[])&&(t.nonGoals=xe),Object.keys(t).length===0){r();return}Je(!0);let n=await a(e.id,t);Je(!1),n?(m.success(f(`detailModal.toast.updated`)),r()):C(f(`detailModal.toast.updateFailed`))},[V,U,le,G,ge,ve,xe,e,a,r,f]),Y=(0,X.useCallback)(async()=>{if(et)return;tt(!0);let t=!1;try{t=await o(e.id)}catch{t=!1}if(tt(!1),!t){C(f(`detailModal.toast.deleteFailed`));return}r()},[et,e.id,o,r,f]),[Tt,Et]=(0,X.useState)(0),Dt=(0,X.useRef)(null),[Ot,kt]=(0,X.useState)(()=>typeof window<`u`&&window.innerWidth>=qs);(0,X.useEffect)(()=>{if(typeof window>`u`)return;let e=()=>kt(window.innerWidth>=qs);return e(),window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]);let At=!d&&!S&&Ot,jt=(0,X.useCallback)(e=>{Dt.current&&Et(e.clientX-Dt.current.startX)},[]),Mt=(0,X.useCallback)(t=>{if(!Dt.current)return;let n=t.clientX-Dt.current.startX,i=window.innerWidth*Js;if(window.removeEventListener(`pointermove`,jt),window.removeEventListener(`pointerup`,Mt),window.removeEventListener(`pointercancel`,Mt),Dt.current=null,Et(0),Math.abs(n)>=i&&window.innerWidth>=qs){let t=x.leftId===e.id;b(n<0?`left`:`right`,e.id),t||r()}},[b,jt,x.leftId,e.id,r]),Nt=(0,X.useCallback)(e=>{At&&e.button===0&&(e.target.closest(`button, input, textarea, select, [contenteditable="true"]`)||(Dt.current={startX:e.clientX,pointerId:e.pointerId},window.addEventListener(`pointermove`,jt),window.addEventListener(`pointerup`,Mt),window.addEventListener(`pointercancel`,Mt)))},[At,jt,Mt]);(0,X.useEffect)(()=>()=>{Dt.current&&(window.removeEventListener(`pointermove`,jt),window.removeEventListener(`pointerup`,Mt),window.removeEventListener(`pointercancel`,Mt))},[jt,Mt]);let Pt=(0,X.useCallback)(()=>{if(!At||window.innerWidth<qs)return;let t=x.leftId===e.id;b(`right`,e.id),t||r()},[At,b,x.leftId,e.id,r]),Ft=`ticket-detail-title-${(0,X.useId)()}`,{panelRef:It,panelStyle:Lt,resizeHandles:Rt,guardBackdrop:zt}=Pe({enabled:!d,allowMove:!1,persistKey:`specrails.modal.spec-detail`}),Bt=e.status===`done`||e.status===`cancelled`,Vt=n===void 0||n.some(t=>t.id!==e.id),[Ht]=(0,X.useState)(()=>{if(d||typeof document>`u`)return null;let e=document.activeElement;if(!(e instanceof HTMLElement)||e===document.body)return null;let t=e.getAttribute(`data-testid`);return{el:e,selector:e.id?`#${CSS.escape(e.id)}`:t?`[data-testid="${CSS.escape(t)}"]`:null}}),Ut=(0,X.useCallback)(e=>{e.preventDefault(),Ht&&(Ht.el.isConnected?Ht.el:Ht.selector?document.querySelector(Ht.selector):null)?.focus()},[Ht]),Wt=d?`relative w-full h-full rounded-panel bg-popover border border-border/40 shadow-3 flex flex-col overflow-hidden`:`modal-enter relative w-full max-w-[67rem] m-4 rounded-panel bg-popover border border-border/40 shadow-3 flex flex-col h-[90vh] max-h-[calc(100%-2rem)] outline-none`,Gt={...Tt===0?{transition:`transform 220ms cubic-bezier(0.22, 1, 0.36, 1)`}:{transform:`translateX(${Tt}px)`,transition:`none`},...Lt},Kt=f(Ra[e.status],{ns:`tickets`}),qt=(0,Z.jsx)(`h2`,{...d?{id:Ft}:{},className:`text-headline text-foreground line-clamp-2 break-words`,children:V||f(`untitled`)}),Jt=(0,Z.jsxs)(Z.Fragment,{children:[z&&(0,Z.jsx)(`div`,{className:`px-5 pt-3`,children:(0,Z.jsx)(Ps,{epic:z,childExecutionOrder:e.execution_order??null,totalChildren:B,onOpenEpic:()=>i?.(z.id)})}),(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-3 px-5 py-4 border-b border-border/30 ${At?`cursor-grab active:cursor-grabbing`:``}`,onPointerDown:Nt,"data-testid":`ticket-modal-header`,children:[(0,Z.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[Oe?(0,Z.jsx)(`input`,{ref:gt,value:V,onChange:e=>H(e.target.value),onBlur:()=>ke(!1),onKeyDown:t=>{t.key===`Enter`&&ke(!1),t.key===`Escape`&&(H(e.title),ke(!1))},className:`w-full bg-transparent border-b border-accent-primary/50 text-title text-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring pb-0.5`}):(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>ke(!0),className:`group flex items-center gap-1.5 text-left w-full`,children:[d?qt:(0,Z.jsx)(Te,{asChild:!0,children:qt}),(0,Z.jsx)(me,{className:`w-3 h-3 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity shrink-0`})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 mt-1.5`,children:[(0,Z.jsxs)(`span`,{className:`text-xs text-foreground font-mono`,children:[`#`,e.id]}),e.status===`on_review`&&(0,Z.jsxs)(`span`,{title:f(`specs:status.onReviewHint`),"data-testid":`ticket-modal-on-review-badge`,children:[(0,Z.jsx)(Fa,{status:`on_review`}),(0,Z.jsxs)(`span`,{className:`sr-only`,children:[` (`,f(`specs:status.onReviewHint`),`)`]})]})]}),(0,Z.jsx)(`div`,{title:f(`detailModal.spendingLineHint`),"data-testid":`ticket-spending-line`,children:(0,Z.jsx)(ka,{ticketId:e.id})})]}),_&&e.status!==`done`&&(0,Z.jsx)(`div`,{className:`shrink-0`,children:(0,Z.jsx)(Ns,{ticket:e,projectId:_,provider:O,featureFlagOn:k,childrenCount:R.length,hideButton:!0,openRequest:I,onAvailableChange:F})}),(0,Z.jsx)(ec,{ticket:e,title:V,description:U,priority:le,labels:G,repositoryIds:ge,onClose:r}),!Bt&&(e.status===`on_review`||e.status===`in_progress`)&&(0,Z.jsx)(ic,{ticket:e,rails:s,onClose:r,onShownChange:N}),s&&(l||u)&&(0,Z.jsx)(tc,{ticket:e,rails:s,onMoveToRail:Bt?void 0:l,onRemoveFromRail:u,secondary:M}),s&&l&&g&&!Bt&&(0,Z.jsx)(g,{variant:`button`,className:`shrink-0 mr-1`,spec:e,rail:(()=>{let t=s.find(t=>t.ticketIds.includes(e.id));return t?{running:t.status===`running`}:null})()}),(_&&e.status!==`done`&&P||At&&Vt)&&(0,Z.jsxs)(oe,{children:[(0,Z.jsx)(ne,{"aria-label":f(`detailModal.moreActions`),title:f(`detailModal.moreActions`),"data-testid":`ticket-modal-more`,className:`h-7 w-7 mr-1 flex items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-surface/50 transition-colors cursor-pointer shrink-0`,children:(0,Z.jsx)(ae,{className:`w-4 h-4`,"aria-hidden":!0})}),(0,Z.jsxs)(W,{className:je.stacked,children:[_&&e.status!==`done`&&P&&(0,Z.jsxs)(ie,{"data-testid":`ticket-modal-smash`,onSelect:()=>L(e=>e+1),children:[(0,Z.jsx)(qn,{className:`w-3.5 h-3.5`,"aria-hidden":!0}),e.is_epic?h(`smash.reSmashButton`):h(`smash.smashButton`)]}),At&&Vt&&(0,Z.jsxs)(ie,{"data-testid":`ticket-modal-compare`,onSelect:Pt,title:f(`detailModal.compareTooltip`),children:[(0,Z.jsx)(_n,{className:`w-3.5 h-3.5`,"aria-hidden":!0}),f(`detailModal.compare`)]})]})]}),(0,Z.jsx)(`button`,{type:`button`,onClick:r,"aria-label":f(`common:actions.close`),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,Z.jsx)(be,{className:`w-4 h-4`})})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-2 border-b border-border/30 px-5`,"data-testid":`ticket-modal-tabs`,children:[(0,Z.jsx)(`div`,{role:`tablist`,"aria-label":f(`timeline.tabs.aria`),className:`flex items-center gap-1`,children:[`details`,`timeline`].map(e=>(0,Z.jsx)(`button`,{type:`button`,role:`tab`,id:`ticket-tab-${e}`,"aria-selected":A===e,"aria-controls":`ticket-panel-${e}`,tabIndex:A===e?0:-1,"data-testid":`ticket-tab-${e}`,onClick:()=>j(e),onKeyDown:t=>{(t.key===`ArrowRight`||t.key===`ArrowLeft`)&&(t.preventDefault(),j(e===`details`?`timeline`:`details`))},className:K(`-mb-px border-b-2 px-2.5 py-2 text-label transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,A===e?`border-accent-primary text-foreground`:`border-transparent text-muted-foreground hover:text-foreground`),children:f(`timeline.tabs.${e}`)},e))}),(0,Z.jsxs)(oe,{children:[(0,Z.jsxs)(ne,{"data-testid":`ticket-export-menu`,className:`my-1 inline-flex h-7 items-center gap-1.5 rounded-md px-2 text-label text-muted-foreground transition-colors hover:bg-surface/50 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring cursor-pointer`,children:[(0,Z.jsx)(te,{className:`h-3.5 w-3.5`,"aria-hidden":!0}),f(`timeline.export.menu`)]}),(0,Z.jsxs)(W,{align:`end`,className:je.stacked,children:[(0,Z.jsxs)(ie,{"data-testid":`ticket-export-md`,onSelect:()=>{_a(e.id,`md`,f)},children:[(0,Z.jsx)(ce,{className:`h-3.5 w-3.5`,"aria-hidden":!0}),f(`timeline.export.markdown`)]}),(0,Z.jsxs)(ie,{"data-testid":`ticket-export-html`,onSelect:()=>{_a(e.id,`html`,f)},children:[(0,Z.jsx)(xn,{className:`h-3.5 w-3.5`,"aria-hidden":!0}),f(`timeline.export.html`)]}),(0,Z.jsxs)(ie,{"data-testid":`ticket-copy-pr`,onSelect:()=>{va(e.id,f)},children:[(0,Z.jsx)(hn,{className:`h-3.5 w-3.5`,"aria-hidden":!0}),f(`timeline.export.copyPr`)]})]})]})]}),A===`timeline`?(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto min-h-0 px-5 py-4`,role:`tabpanel`,id:`ticket-panel-timeline`,"aria-labelledby":`ticket-tab-timeline`,children:(0,Z.jsx)(nc,{ticketId:e.id,refreshKey:e.updated_at,onClose:r})}):(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto min-h-0`,role:`tabpanel`,id:`ticket-panel-details`,"aria-labelledby":`ticket-tab-details`,children:(0,Z.jsxs)(`div`,{className:`flex flex-col sm:flex-row h-full`,children:[(0,Z.jsxs)(`div`,{className:`flex-1 min-w-0 px-5 py-4 space-y-4 flex flex-col`,children:[(0,Z.jsxs)(`div`,{className:`flex-1 flex flex-col`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between mb-1.5`,children:[(0,Z.jsx)(`span`,{className:`text-label text-muted-foreground flex items-center gap-1.5`,children:f(`fields.description`)}),!Me&&(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>Fe(!0),className:`text-xs text-muted-foreground hover:text-foreground transition-colors flex items-center gap-1`,children:[(0,Z.jsx)(me,{className:`w-2.5 h-2.5`}),f(`common:actions.edit`)]})]}),Me?(0,Z.jsxs)(`div`,{className:`space-y-1.5 flex-1 flex flex-col`,children:[(0,Z.jsx)(`textarea`,{ref:_t,value:U,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:f(`fields.markdownPlaceholder`)}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Z.jsx)(J,{variant:`ghost`,size:`sm`,className:`h-6 text-xs`,onClick:()=>Fe(!1),children:f(`detailModal.doneEditing`)}),(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:f(`fields.supportsMarkdown`)})]})]}):U?(0,Z.jsx)(lc,{description:U,onEdit:()=>Fe(!0)}):(0,Z.jsx)(`button`,{type:`button`,onClick:()=>Fe(!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:f(`detailModal.addDescription`)})]}),(0,Z.jsx)(_s,{value:xe,onChange:Ee,disabled:qe}),(0,Z.jsx)(Yi,{ticket:e}),(0,Z.jsx)(ji,{ticketKey:e.id,attachments:st,onChange:ct}),(0,Z.jsx)(Mi,{ticketId:e.id,onClose:r}),e.prerequisites&&e.prerequisites.length>0&&(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-label text-muted-foreground block mb-1.5`,children:f(`detailModal.prerequisites`)}),(0,Z.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:e.prerequisites.map(e=>(0,Z.jsxs)(`span`,{"data-chip":``,className:`inline-flex h-5 items-center rounded px-1.5 text-caption font-mono bg-accent/60 text-muted-foreground`,children:[`#`,e]},e))})]})]}),(0,Z.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,Z.jsxs)(`button`,{type:`button`,onClick:()=>{c(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-label text-accent-info hover:bg-accent-info/20 transition-colors`,children:[(0,Z.jsx)(se,{className:`w-3.5 h-3.5 shrink-0`}),p(`detail.goToTicket`,{key:e.jira_key})]}),e.jira_epic_key&&(0,Z.jsxs)(`div`,{"data-testid":`jira-epic`,children:[(0,Z.jsx)(`span`,{className:`text-label text-muted-foreground block mb-1.5`,children:p(`detail.epic`)}),(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>{let t=Xs(e);t&&c(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,Z.jsx)(`span`,{className:`font-mono text-accent-highlight shrink-0`,children:e.jira_epic_key}),e.jira_epic_name&&(0,Z.jsx)(`span`,{className:`truncate text-foreground`,children:e.jira_epic_name})]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-label text-muted-foreground block mb-1.5`,children:f(`fields.status`)}),it?(0,Z.jsxs)($e,{value:pt||void 0,disabled:lt||dt===null,onValueChange:e=>{ht(e)},children:[(0,Z.jsx)(Xe,{className:`h-7 w-full text-xs`,"aria-label":f(`fields.status`),"data-testid":`ticket-jira-status-select`,children:(0,Z.jsx)(Ye,{placeholder:f(`states.loading`,{ns:`common`})})}),(0,Z.jsxs)(Ze,{children:[pt&&!(dt??[]).some(e=>e.name===pt)&&(0,Z.jsx)(Qe,{value:pt,className:`text-xs`,children:pt}),(dt??[]).map(e=>(0,Z.jsx)(Qe,{value:e.name,className:`text-xs`,children:e.name},e.name))]})]}):(0,Z.jsxs)($e,{value:e.status,disabled:lt,onValueChange:e=>{mt(e)},children:[(0,Z.jsx)(Xe,{className:`h-7 w-full text-xs`,"aria-label":f(`fields.status`),"data-testid":`ticket-status-select`,children:(0,Z.jsx)(Ye,{})}),(0,Z.jsxs)(Ze,{children:[!La.includes(e.status)&&(0,Z.jsx)(Qe,{value:e.status,className:`text-xs`,children:f(Ra[e.status],{ns:`tickets`})}),La.map(e=>(0,Z.jsx)(Qe,{value:e,className:`text-xs`,children:f(Ra[e],{ns:`tickets`})},e))]})]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-label text-muted-foreground block mb-1.5`,children:f(`fields.priority`)}),(0,Z.jsxs)($e,{value:le,onValueChange:e=>ue(e),children:[(0,Z.jsx)(Xe,{className:`h-7 w-full text-xs`,"aria-label":f(`fields.priority`),"data-testid":`ticket-priority-select`,children:(0,Z.jsx)(Ye,{})}),(0,Z.jsx)(Ze,{children:Ys.map(e=>(0,Z.jsx)(Qe,{value:e.value,className:`text-xs`,children:f(e.labelKey)},e.value))})]})]}),(0,Z.jsx)(ot,{value:ge,onChange:_e,disabled:qe}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-label text-muted-foreground block mb-1.5`,children:f(`fields.labels`)}),(0,Z.jsx)(`div`,{className:`flex flex-wrap gap-1 mb-1.5`,children:G.map(e=>(0,Z.jsxs)(`span`,{"data-chip":``,className:`inline-flex h-5 items-center gap-0.5 rounded px-1.5 text-caption font-medium bg-accent/60 text-muted-foreground group`,children:[e,(0,Z.jsx)(`button`,{type:`button`,onClick:()=>Ct(e),"aria-label":f(`fields.removeLabel`,{label:e}),className:`text-muted-foreground hover:text-foreground opacity-0 group-hover:opacity-100 focus-visible:opacity-100 transition-opacity`,children:(0,Z.jsx)(ee,{className:`w-2.5 h-2.5`})})]},e))}),Ve?(0,Z.jsxs)(`div`,{className:`relative`,children:[(0,Z.jsx)(`input`,{ref:vt,value:Le,onChange:e=>Re(e.target.value),onKeyDown:e=>{e.key===`Enter`&&Le.trim()&&(e.preventDefault(),St(Le)),e.key===`Escape`&&(He(!1),Re(``))},onBlur:()=>{Le.trim()&&St(Le),He(!1),Re(``)},placeholder:f(`detailModal.addLabelPlaceholder`),className:`w-full h-7 rounded border border-border bg-input px-2 text-xs text-foreground placeholder:text-muted-foreground`}),xt.length>0&&(0,Z.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:xt.map(e=>(0,Z.jsx)(`button`,{type:`button`,onMouseDown:t=>{t.preventDefault(),St(e)},className:`w-full text-left px-2 py-1 text-xs hover:bg-accent/50 text-foreground`,children:e},e))})]}):(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>He(!0),className:`flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors`,children:[(0,Z.jsx)(he,{className:`w-2.5 h-2.5`}),f(`detailModal.addLabel`)]})]}),(ms(G)||ve!==null)&&(0,Z.jsx)(hs,{value:ve,onChange:ye,disabled:qe}),(0,Z.jsx)(Rs,{ticket:e,allTickets:n??[],onOpenTicket:e=>i?.(e)}),e.source===`jira`&&e.jira_key&&(0,Z.jsx)(Wa,{localId:e.id}),e.metadata?.effort_level&&(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-label text-muted-foreground block mb-0.5`,children:f(`detailModal.effort`)}),(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.metadata.effort_level})]}),e.assignee&&(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-label text-muted-foreground block mb-0.5`,children:f(`detailModal.assignee`)}),(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.assignee})]})]})]})}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-3 px-5 py-3 border-t border-border/40`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 items-center gap-3 text-xs text-muted-foreground`,children:[rt?(0,Z.jsxs)(J,{variant:`ghost`,className:`text-accent-info hover:bg-accent-info/10`,onClick:()=>We(!0),"data-testid":`jira-move-to-button`,children:[(0,Z.jsx)(D,{className:`w-3.5 h-3.5 mr-1`}),p(`discard.moveButton`,{status:nt.discardStatus})]}):(0,Z.jsxs)(J,{variant:`ghost`,className:`text-destructive hover:text-destructive hover:bg-destructive/10`,onClick:()=>{Y()},disabled:et,children:[(0,Z.jsx)(de,{className:`w-3.5 h-3.5 mr-1`}),f(`common:actions.delete`)]}),(0,Z.jsx)(`span`,{children:f(`meta.createdAgo`,{time:$s(e.created_at)})}),(0,Z.jsx)(`span`,{children:f(`meta.updatedAgo`,{time:$s(e.updated_at)})}),e.source&&(0,Z.jsx)(`span`,{className:`bg-muted/30 rounded px-1.5 py-0.5`,children:Zs[e.source]?f(Zs[e.source]):e.source})]}),yt&&(0,Z.jsxs)(J,{onClick:()=>{it?Ke(!0):wt()},disabled:qe||!V.trim(),children:[(0,Z.jsx)(E,{className:`w-3.5 h-3.5 mr-1`}),f(qe?`common:states.saving`:`common:actions.save`)]})]}),!d&&(0,Z.jsx)(Ce,{handles:Rt,placement:`inset`})]}),Yt=(0,Z.jsxs)(Z.Fragment,{children:[rt&&nt.discardStatus&&(0,Z.jsx)(Va,{open:Ue,onOpenChange:We,ticket:{id:e.id,title:e.title,jira_key:e.jira_key},discardStatus:nt.discardStatus,onDiscarded:r}),(0,Z.jsx)(pe,{open:Ge,onOpenChange:Ke,tone:`default`,title:p(`detail.saveTitle`),description:p(`detail.saveBody`,{key:e.jira_key??`#${e.id}`}),confirmLabel:p(`detail.saveConfirm`),confirmDisabled:qe,onConfirm:()=>{Ke(!1),wt()},testId:`jira-save-confirm`,confirmTestId:`jira-save-confirm-btn`})]});return d?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{ref:It,role:`region`,"aria-labelledby":Ft,className:Wt,style:Gt,children:Jt}),Yt]}):(0,Z.jsx)(ze,{open:!0,onOpenChange:e=>{e||r()},children:(0,Z.jsxs)(Se,{children:[(0,Z.jsx)(we,{style:Ne(),className:K(Ie,je.entity),"data-testid":`ticket-modal-overlay`}),(0,Z.jsx)(`div`,{style:Ne(),className:K(`pointer-events-none fixed inset-0 flex items-center justify-center`,je.entity),children:(0,Z.jsxs)(De,{ref:It,"data-testid":`ticket-detail-modal`,"data-dialog-layer":`entity`,className:K(Wt,`pointer-events-auto`),style:Gt,onEscapeKeyDown:bt,onPointerDownOutside:e=>{let t=!1;zt(()=>{t=!0})(),t||e.preventDefault()},onCloseAutoFocus:Ut,children:[(0,Z.jsxs)(Be,{className:`sr-only`,children:[`#`,e.id,` · `,Kt]}),(0,Z.jsxs)(Ae,{layer:`entity`,children:[Jt,Yt]})]})})]})})}function $s(e){try{return Je(new Date(e),{addSuffix:!0,locale:u()})}catch{return e}}function ec({ticket:e,title:t,description:n,priority:r,labels:i,repositoryIds:a,onClose:o}){let{t:s}=v(`tickets`),{triggerResume:c}=R(),{activeProjectId:l}=q(),{closeTicketDetail:u}=Tc();return Ja(e)?(0,Z.jsxs)(J,{variant:`default`,size:`sm`,onClick:()=>{if(!l)return;let{body:d,criteria:f}=Ka(n);c({kind:`explore-spec`,projectId:l,label:t||e.title||s(`detailModal.ticketFallbackLabel`,{id:e.id}),restoreRoute:`/`,params:{initialIdea:``,pendingSpecId:Ya(),initialAttachmentIds:[],resumeConversationId:e.origin_conversation_id??void 0,editTicket:{id:e.id,title:t,description:d,labels:i,priority:r,repositoryIds:a,acceptanceCriteria:f,nonGoals:e.nonGoals??[],status:e.status}}}),u(),o()},className:`shrink-0 mr-2`,"data-testid":`continue-editing`,children:[(0,Z.jsx)(z,{className:`w-3.5 h-3.5 mr-1.5`}),s(`detailModal.continueEditing`)]}):null}function tc({ticket:e,rails:t,onMoveToRail:n,onRemoveFromRail:r,secondary:i}){let{t:a}=v(`tickets`),[o,s]=(0,X.useState)(null),c=(0,X.useRef)(null),l=t.find(t=>t.ticketIds.includes(e.id));return l?r?(0,Z.jsxs)(J,{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:a(`rail.currentlyOn`,{rail:l.label}),children:[(0,Z.jsx)(T,{className:`w-3.5 h-3.5`,"aria-hidden":!0}),a(`rail.removeFromRail`)]}):null:n?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(J,{ref:c,size:`sm`,variant:i?`outline`:`default`,className:`shrink-0 mr-2 gap-1.5`,"data-testid":`modal-move-to-rail`,onClick:()=>{c.current&&s(c.current.getBoundingClientRect())},children:[a(`rail.moveToRail`),(0,Z.jsx)(D,{className:`w-3.5 h-3.5`,"aria-hidden":!0})]}),o&&(0,Z.jsx)(Us,{rails:t,anchorRect:o,onMoveToRail:t=>n(e.id,t),onClose:()=>s(null)})]}):null}function nc(e){return o()?(0,Z.jsx)(rc,{...e}):(0,Z.jsx)(da,{ticketId:e.ticketId,refreshKey:e.refreshKey,uiMode:`kanban`,currentSearch:``,onNavigate:()=>{}})}function rc({ticketId:e,refreshKey:t,onClose:n}){let r=a(),o=i(),{uiMode:s,setUiMode:l}=Fr(),u=(0,X.useCallback)(e=>{n();let t=()=>{r({pathname:e.pathname,search:e.search},{state:{[Wr]:e.place}})};e.needsAgentMode?(l(`agent`,{immediate:!0}),setTimeout(t,0)):t()},[r,n,l]);return(0,Z.jsx)(da,{ticketId:e,refreshKey:t,uiMode:s,currentSearch:o.search,onNavigate:u,onOpenExternal:e=>{c(e)}})}function ic(e){return o()?(0,Z.jsx)(ac,{...e}):null}function ac({ticket:e,rails:t,onClose:n,onShownChange:r}){let{t:i}=v(`tickets`),o=a(),{decisions:s}=ci(),c=null,l=``;if(e.status===`on_review`){for(let t of s.values())if(t.ticketIds.includes(e.id)){c=`/review/${encodeURIComponent(t.prDeliveryId)}`;break}l=i(`detailModal.openReview`)}else{let n=t?.find(t=>t.ticketIds.includes(e.id))?.activeJobId;n&&(c=`/jobs/${encodeURIComponent(n)}`),l=i(`detailModal.viewJob`)}let u=!!c;if((0,X.useEffect)(()=>(r?.(u),()=>r?.(!1)),[u,r]),!c)return null;let d=c;return(0,Z.jsxs)(J,{size:`sm`,className:`shrink-0 mr-2 gap-1.5`,"data-testid":`modal-primary-action`,onClick:()=>{n(),o(d)},children:[l,(0,Z.jsx)(D,{className:`w-3.5 h-3.5`,"aria-hidden":!0})]})}var oc=`
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Contract Layer
|
|
22
|
+
|
|
23
|
+
`;function sc(e){let t=e.indexOf(oc);return t<0?{user:e,contract:null}:{user:e.slice(0,t),contract:e.slice(t+26)}}function cc(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 lc({description:e,onEdit:t}){let{t:n}=v(`tickets`),{openWebView:r}=ps(),{user:i,contract:a}=sc(e),o=i||e,s=(0,X.useMemo)(()=>({a:({href:e,children:t})=>(0,Z.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,Z.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,Z.jsx)(`div`,{className:`prose prose-invert prose-sm text-body leading-relaxed max-w-[75ch] prose-p:my-2.5 prose-headings:text-title prose-headings:mt-5 prose-headings:mb-2 prose-headings:font-semibold prose-ul:my-2 prose-ol:my-2 prose-li:my-0.5 prose-code:text-foreground prose-code:text-label [&_code]:!text-label [&_pre]:!text-label prose-code:bg-muted prose-code:px-1 prose-code:py-0.5 prose-code:rounded-control text-foreground`,children:(0,Z.jsx)(Ke,{remarkPlugins:[qe],components:s,children:o})}),a&&(0,Z.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,Z.jsxs)(`summary`,{className:`cursor-pointer text-label text-foreground select-none flex items-center gap-2`,children:[n(`contractLayer.title`),(0,Z.jsx)(`span`,{"data-chip":``,className:`inline-flex h-5 items-center rounded-full bg-muted/40 px-1.5 text-caption text-muted-foreground`,children:n(`contractLayer.populated`,{n:cc(a)})})]}),(0,Z.jsx)(`div`,{className:`mt-2 prose prose-invert prose-sm text-body leading-relaxed max-w-[75ch] prose-p:my-2.5 prose-headings:text-title prose-headings:mt-5 prose-headings:mb-2 prose-headings:font-semibold prose-ul:my-2 prose-ol:my-2 prose-li:my-0.5 prose-code:text-foreground prose-code:text-label [&_code]:!text-label [&_pre]:!text-label prose-code:bg-muted prose-code:px-1 prose-code:py-0.5 prose-code:rounded-control text-foreground`,children:(0,Z.jsx)(Ke,{remarkPlugins:[qe],components:s,children:a})})]})]})}var uc={critical:`bg-destructive/10 text-destructive border-destructive/30`,high:`bg-accent-warning/10 text-accent-warning border-accent-warning/30`,medium:``,low:`bg-muted text-muted-foreground border-border`};function dc(e){try{return Je(new Date(e),{addSuffix:!0,locale:u()})}catch{return e}}function fc({tickets:e,excludeIds:t,onSelect:n}){let{t:r}=v(`tickets`),[i,a]=(0,X.useState)(``),o=(0,X.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,Z.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,Z.jsxs)(`div`,{className:`px-4 py-3 border-b border-border/30 flex items-center gap-2`,children:[(0,Z.jsx)(Zn,{className:`w-3.5 h-3.5 text-muted-foreground`}),(0,Z.jsx)(`span`,{className:`text-xs font-semibold text-foreground`,children:r(`comparePicker.title`)}),(0,Z.jsx)(`span`,{className:`text-caption text-muted-foreground`,children:r(`comparePicker.count`,{n:o.length})})]}),(0,Z.jsx)(`div`,{className:`px-4 py-2 border-b border-border/20`,children:(0,Z.jsxs)(`div`,{className:`relative`,children:[(0,Z.jsx)(_e,{className:`absolute left-2 top-1/2 -translate-y-1/2 w-3 h-3 text-muted-foreground`}),(0,Z.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-caption text-foreground placeholder:text-muted-foreground outline-none focus:border-accent-primary/60`})]})}),(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto`,"data-testid":`spec-compare-picker-list`,children:o.length===0?(0,Z.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full text-center px-4 py-8 gap-2`,children:[(0,Z.jsx)(Zn,{className:`w-6 h-6 text-muted-foreground`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:i.trim()?r(`comparePicker.noMatches`):r(`comparePicker.empty`)})]}):(0,Z.jsx)(`ul`,{className:`divide-y divide-border/10`,children:o.map(e=>(0,Z.jsx)(`li`,{children:(0,Z.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,Z.jsx)(Pa,{status:e.status}),(0,Z.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsxs)(`span`,{className:`text-caption font-mono text-muted-foreground`,children:[`#`,e.id]}),e.priority&&uc[e.priority]&&(0,Z.jsx)(`span`,{className:`inline-flex items-center rounded px-1 py-0.5 text-caption font-medium border ${uc[e.priority]}`,children:r(`priority.${e.priority}`)})]}),(0,Z.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,Z.jsx)(`p`,{className:`mt-0.5 text-caption text-muted-foreground line-clamp-1`,children:e.description.slice(0,120)}),e.labels&&e.labels.length>0&&(0,Z.jsxs)(`div`,{className:`mt-1 flex flex-wrap gap-1`,children:[e.labels.slice(0,3).map(e=>(0,Z.jsx)(`span`,{className:`inline-flex items-center rounded px-1 py-0.5 text-caption bg-accent/40 text-muted-foreground`,children:e},e)),e.labels.length>3&&(0,Z.jsxs)(`span`,{className:`text-caption text-muted-foreground`,children:[`+`,e.labels.length-3]})]}),(0,Z.jsx)(`p`,{className:`mt-1 text-caption text-muted-foreground`,children:r(`meta.updatedAgo`,{time:dc(e.updated_at)})})]})]})},e.id))})})]})}var pc=.25,mc=.75;function hc({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{t:f}=v(`tickets`),p=(0,X.useRef)(null),m=(0,X.useRef)(null),[h,g]=(0,X.useState)(!0);(0,X.useEffect)(()=>{let e=setTimeout(()=>g(!1),320);return()=>clearTimeout(e)},[]);let _=(0,X.useCallback)(e=>{if(!m.current)return;let t=window.innerWidth,n=e.clientX/t;u(Math.min(mc,Math.max(pc,n)))},[u]),y=(0,X.useCallback)(e=>{if(!m.current)return;let{pointerId:t,element:n}=m.current;try{n.releasePointerCapture(t)}catch{}m.current=null,window.removeEventListener(`pointermove`,_),window.removeEventListener(`pointerup`,y),window.removeEventListener(`pointercancel`,y)},[_]),b=(0,X.useCallback)(e=>{let t=e.currentTarget;try{t.setPointerCapture(e.pointerId)}catch{}m.current={pointerId:e.pointerId,element:t},window.addEventListener(`pointermove`,_),window.addEventListener(`pointerup`,y),window.addEventListener(`pointercancel`,y)},[_,y]);(0,X.useEffect)(()=>()=>{window.removeEventListener(`pointermove`,_),window.removeEventListener(`pointerup`,y),window.removeEventListener(`pointercancel`,y);let e=m.current;if(e){try{e.element.releasePointerCapture(e.pointerId)}catch{}m.current=null}},[_,y]);let x=(0,X.useCallback)(t=>{let n=.04;t.key===`ArrowLeft`?(t.preventDefault(),u(Math.max(pc,e.splitRatio-n))):t.key===`ArrowRight`?(t.preventDefault(),u(Math.min(mc,e.splitRatio+n))):t.key===`Home`?(t.preventDefault(),u(pc)):t.key===`End`?(t.preventDefault(),u(mc)):t.key===`0`&&(t.preventDefault(),u(.5))},[u,e.splitRatio]),S=e=>{e.target===e.currentTarget&&c()},C=u=>{let d=u===e.originSide,f=u===`left`?t:n;return f?(0,Z.jsx)(Qs,{ticket:f,allLabels:i,allTickets:r,onClose:d?c:()=>l(null,u),onOpenTicket:s,onSave:a,onDelete:o,embedded:!0},`${u}-${f.id}`):(0,Z.jsx)(fc,{tickets:r,excludeIds:[t?.id,n?.id].filter(e=>e!=null),onSelect:e=>l(e,u)})},w=(0,X.useCallback)(e=>{(e.target instanceof HTMLElement?e.target:null)?.closest(`input, textarea, select, [contenteditable="true"]`)&&e.preventDefault()},[]),[T]=(0,X.useState)(()=>{if(typeof document>`u`)return null;let e=document.activeElement;return e instanceof HTMLElement&&e!==document.body?e:null}),E=(0,X.useCallback)(e=>{e.preventDefault(),T?.isConnected&&T.focus()},[T]),D=(e.splitRatio*100).toFixed(2),O=((1-e.splitRatio)*100).toFixed(2);return(0,Z.jsx)(ze,{open:!0,onOpenChange:e=>{e||c()},children:(0,Z.jsxs)(Se,{children:[(0,Z.jsx)(we,{style:Ne(),className:K(Ie,je.entity)}),(0,Z.jsxs)(De,{ref:p,"data-testid":`split-view-shell`,"data-dialog-layer":`entity`,"aria-describedby":void 0,style:Ne(),className:K(`fixed inset-0 flex outline-none`,je.entity),onClick:S,onEscapeKeyDown:w,onCloseAutoFocus:E,children:[(0,Z.jsx)(Te,{className:`sr-only`,children:f(`split.label`)}),(0,Z.jsx)(Ae,{layer:`entity`,children:(0,Z.jsxs)(`div`,{className:`relative flex w-full h-full`,style:{transition:h?`opacity 280ms cubic-bezier(0.16, 1, 0.3, 1)`:void 0},children:[(0,Z.jsx)(`div`,{"data-testid":`split-panel-left`,className:`relative h-full overflow-hidden`,style:{width:`${D}%`,transition:h?`width 280ms cubic-bezier(0.16, 1, 0.3, 1)`:void 0},children:(0,Z.jsx)(`div`,{className:`h-full flex items-center justify-center p-2`,children:(0,Z.jsx)(`div`,{className:`w-full h-full max-h-[95vh]`,children:C(`left`)})})}),(0,Z.jsx)(`div`,{"data-testid":`split-divider`,role:`separator`,"aria-orientation":`vertical`,"aria-label":f(`split.resize`),"aria-valuenow":Math.round(e.splitRatio*100),"aria-valuemin":Math.round(pc*100),"aria-valuemax":Math.round(mc*100),tabIndex:0,onPointerDown:b,onKeyDown:x,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,Z.jsx)(`div`,{"data-testid":`split-panel-right`,className:`relative h-full overflow-hidden`,style:{width:`${O}%`,transition:h?`width 280ms cubic-bezier(0.16, 1, 0.3, 1)`:void 0},children:(0,Z.jsx)(`div`,{className:`h-full flex items-center justify-center p-2`,children:(0,Z.jsx)(`div`,{className:`w-full h-full max-h-[95vh]`,children:C(`right`)})})})]})})]})]})})}var gc=.5,_c=.25,vc=.75,yc={leftId:null,rightId:null,originSide:null,splitRatio:gc};function bc(e){return Number.isFinite(e)?Math.min(vc,Math.max(_c,e)):gc}function xc(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:gc}:e.originSide!==null&&(e.leftId===t.id||e.rightId===t.id)?e:{...yc,leftId:t.id};case`closeAll`:return yc;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:gc}:{leftId:null,rightId:n,originSide:`right`,splitRatio:gc}}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{...yc,leftId:t}}case`setSplitRatio`:return{...e,splitRatio:bc(t.ratio)};default:return e}}var Sc=(0,X.createContext)(null),Cc=900;function wc({children:e}){let[t,n]=(0,X.useReducer)(xc,yc),r=(0,X.useRef)(t);r.current=t;let{tickets:a,updateTicket:o,deleteTicket:s,isLoading:c,error:l}=Or(),{activeProjectId:u,setActiveProjectId:d}=q(),f=ni(),p=oi(Ir),m=p.value!==null&&/^\d+$/.test(p.value)?Number(p.value):null,[h,g]=(0,X.useState)(0),_=(0,X.useCallback)(()=>(g(e=>e+1),()=>g(e=>e-1)),[]),v=(0,X.useRef)(null),y=(0,X.useRef)(``),b=i();y.current=b.key;let x=e=>{let t=v.current;!t||!e&&y.current===t.key||(v.current=null,w.current(String(t.id)))},S=(0,X.useRef)(null),C=(0,X.useRef)(null);C.current=m,(0,X.useEffect)(()=>{n({type:`closeAll`});let e=S.current;if(e)S.current=null,e.projectId===u&&(n({type:`openCentered`,id:e.ticketId}),v.current={id:e.ticketId,key:y.current},setTimeout(()=>x(!0),400));else if(C.current!==null&&f){let e=f.getCurrentEntryProjectId();e&&e===u&&n({type:`openCentered`,id:C.current})}},[u]);let w=(0,X.useRef)(p.open);w.current=p.open;let T=(0,X.useRef)(p.close);T.current=p.close;let E=(0,X.useRef)(null);(0,X.useEffect)(()=>{x(!1)},[b.key]),(0,X.useEffect)(()=>{E.current!==m&&(E.current=m,r.current.originSide===null&&n(m===null?{type:`closeAll`}:{type:`openCentered`,id:m}))},[m]);let D=(0,X.useRef)(a);D.current=a;let O=f?.reportMissing,k=f?.getCurrentEntryProjectId;(0,X.useEffect)(()=>{if(m===null||!O||c||l||a.some(e=>e.id===m))return;let e=k?.()??null;if(e&&e!==u)return;let t=setTimeout(()=>{D.current.some(e=>e.id===m)||O(`spec`)},1200);return()=>clearTimeout(t)},[m,a,c,l,u,O,k]);let A=f?.registerLabelResolver,j=(0,X.useRef)(u);j.current=u,(0,X.useEffect)(()=>{if(A)return A((e,t,n)=>{if(e!==`spec`||n&&n!==j.current)return null;let r=D.current.find(e=>String(e.id)===t);return r?.title?.trim()?r.title:null})},[A]);let M=(0,X.useCallback)(e=>{n({type:`openCentered`,id:e}),w.current(String(e))},[]),N=(0,X.useCallback)((e,t)=>{if(e===u){M(t);return}S.current={projectId:e,ticketId:t},d(e)},[u,d,M]),P=(0,X.useCallback)(()=>{n({type:`closeAll`}),T.current()},[]),F=(0,X.useCallback)((e,t)=>{typeof window<`u`&&window.innerWidth<Cc||n({type:`enterSplit`,side:e,ticketId:t})},[]),I=(0,X.useCallback)((e,t)=>n({type:`setComparedTicket`,id:e,side:t}),[]),L=(0,X.useCallback)(()=>n({type:`exitSplit`}),[]),R=(0,X.useCallback)(e=>n({type:`setSplitRatio`,ratio:e}),[]);(0,X.useEffect)(()=>{if(typeof window>`u`)return;function e(){window.innerWidth<Cc&&n({type:`exitSplit`})}return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]);let z=(0,X.useMemo)(()=>{let e=new Set;for(let t of a)for(let n of t.labels??[])e.add(n);return Array.from(e).sort()},[a]),B=t.leftId==null?null:a.find(e=>e.id===t.leftId)??null,V=t.rightId==null?null:a.find(e=>e.id===t.rightId)??null,H=(0,X.useMemo)(()=>({openTicketDetail:M,openTicketDetailInProject:N,closeTicketDetail:P,claimSpecHost:_,enterSplit:F,setComparedTicket:I,exitSplit:L,setSplitRatio:R,state:t}),[M,N,P,_,F,I,L,R,t]),U=t.originSide!==null;return(0,Z.jsxs)(Sc.Provider,{value:H,children:[e,!U&&B&&h===0&&(0,Z.jsx)(Qs,{ticket:B,allLabels:z,allTickets:a,onClose:P,onOpenTicket:M,onSave:o,onDelete:s},B.id),U&&(0,Z.jsx)(hc,{state:t,leftTicket:B,rightTicket:V,allTickets:a,allLabels:z,onSave:o,onDelete:s,onOpenTicket:M,onCloseAll:P,onSetCompared:I,onSetRatio:R,onExitSplit:L})]})}function Tc(){return(0,X.useContext)(Sc)||{openTicketDetail:()=>{typeof console<`u`&&console.warn(`[TicketDetailModalContext] openTicketDetail called without provider`)},openTicketDetailInProject:()=>{typeof console<`u`&&console.warn(`[TicketDetailModalContext] openTicketDetailInProject called without provider`)},closeTicketDetail:()=>{},claimSpecHost:()=>()=>{},enterSplit:()=>{},setComparedTicket:()=>{},exitSplit:()=>{},setSplitRatio:()=>{},state:yc}}export{ai as $,Et as $t,vo as A,Tn as At,Pa as B,Xt as Bt,ho as C,Gn as Ct,go as D,Nn as Dt,yo as E,Fn as Et,La as F,pn as Ft,Ti as G,Jt as Gt,Ta as H,qt as Ht,Ra as I,dn as It,wi as J,$t as Jt,bi as K,an as Kt,za as L,sn as Lt,Ja as M,xn as Mt,Ka as N,_n as Nt,_o as O,jn as Ot,Va as P,hn as Pt,oi as Q,Vt as Qt,Ba as R,Gt as Rt,bo as S,Yn as St,Xa as T,Ln as Tt,Ea as U,nn as Ut,Ma as V,Kt as Vt,Wi as W,Zt as Wt,pi as X,Wt as Xt,mi as Y,en as Yt,ci as Z,rn as Zt,qo as _,gr as _t,Ks as a,Ht as an,Lr as at,So as b,tr as bt,hs as c,ut as cn,Qr as ct,ps as d,Nr as dt,Ut as en,ni as et,ss as f,Fr as ft,$o as g,mr as gt,es as h,br as ht,Gs as i,Bt as in,Wr as it,Ya as j,Cn as jt,uo as k,Dn as kt,ms as l,ct as ln,Kr as lt,Qo as m,yr as mt,Tc as n,xt as nn,Rr as nt,Us as o,pt as on,Ir as ot,os as p,Or as pt,gi as q,tn as qt,Qs as r,zt as rn,Br as rt,Cs as s,mt as sn,Vr as st,wc as t,Ct as tn,zr as tt,ds as u,Zr as ut,zo as v,fr as vt,xo as w,Un as wt,Za as x,Zn as xt,jo as y,lr as yt,Ia as z,Yt as zt};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t}from"./jsx-runtime-BbYvbtY8.js";import{F as n}from"./api-DOGbyfTO.js";import{a as r,d as i,f as a,i as o,l as s,p as c,s as l,u}from"./createLucideIcon-DtODIU64.js";var d=e(t()),f={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,"!doctype":!0,"!DOCTYPE":!0},p=/\s([^'"/\s><]+?)[\s/>]|([^\s=]+)=\s?("[^"]*"|'[^']*')/g;function m(e){let t={type:`tag`,name:``,voidElement:!1,attrs:{},children:[]},n=e.match(/<\/?([^\s]+?)[/\s>]/);if(n&&(t.name=n[1],(f[n[1]]||e.charAt(e.length-2)===`/`)&&(t.voidElement=!0),t.name.startsWith(`!--`))){let t=e.indexOf(`-->`);return{type:`comment`,comment:t===-1?``:e.slice(4,t)}}let r=new RegExp(p),i=null;for(;i=r.exec(e),i!==null;)if(i[0].trim())if(i[1]){let e=i[1].trim(),n=[e,null],a=e.indexOf(`=`);a>-1&&(n=[e.slice(0,a),e.slice(a+1)]),t.attrs[n[0]]=n[1],r.lastIndex--}else i[2]&&(t.attrs[i[2]]=i[3].trim().substring(1,i[3].length-1));return t}var h=/<!--[\s\S]*?-->|<[a-zA-Z0-9\-!/](?:"[^"]*"|'[^']*'|[^'">])*>/g,g=/<\/?([^\s]+?)[/\s>]/,_=/^\s*$/,v=/^(script|style)$/i,y=`\0`,b=Object.create(null);function x(e){e.forEach(function(e){if(e.type===`text`){e.content=e.content.split(y).join(`<`);return}if(e.type===`comment`){e.comment=e.comment.split(y).join(`<`);return}for(let t in e.attrs){let n=e.attrs[t];typeof n==`string`&&n.indexOf(y)>-1&&(e.attrs[t]=n.split(y).join(`<`))}e.children.length&&x(e.children)})}function S(e,t){let n=t&&t.components||b,r=t&&t.allowedTags,i=!1;if(r){let t=typeof r==`function`?r:function(e){return r.indexOf(e)>-1},n=``,a=0;h.lastIndex=0;let o;for(;o=h.exec(e);){let r=o[0];n+=e.slice(a,o.index);let s=r.match(g);r.startsWith(`<!--`)||s&&t(s[1])?(n+=r,a=o.index+r.length):(i=!0,n+=y,a=o.index+1,h.lastIndex=a)}e=n+e.slice(a)}let a=[],o=[],s,c=-1,l=!1,u=0,d;if(e.indexOf(`<`)!==0){let t=e.indexOf(`<`);a.push({type:`text`,content:t===-1?e:e.substring(0,t)})}let f=[],p;for(;p=h.exec(e);)f.push(p);return f.forEach(function(e,t){let n=e[0];if(!n||n.startsWith(`<!--`))return;let r=0,i=0,a=-1,o=null;for(let e=0;e<n.length;e++){let t=n.charAt(e);o?t===o&&(o=null):t===`"`||t===`'`?o=t:t===`<`?(r++,r===2&&(a=e)):t===`>`&&i++}let s=a>-1&&/[a-zA-Z0-9\-!/]/.test(n.charAt(a+1));if(r>i&&s){let e=n.substring(0,a),r=n.substring(e.length);f[t][0]=r,f[t].index+=e.length}}),f.forEach(function(t,r){let i=t[0];if(!i)return;let p=t.index;if(p<u)return;if(l){if(i!==`</`+s.name+`>`)return;l=!1}let h=i.charAt(1)!==`/`,g=i.startsWith(`<!--`),y=p+i.length,b=e.charAt(y),x=f[r+1],S;if(b===`<`&&x){let t=e.substring(y,x.index);S=t.split(`<`).length>t.split(`>`).length}let C;if(g){let t=m(i);if(c<0)return a.push(t),a;C=o[c],C.children.push(t);let n=e.slice(y,x?x.index:void 0);return n.length>0&&C.children.push({type:`text`,content:n}),a}if(h){c++,s=m(i),s.type===`tag`&&n[s.name]&&(s.type=`component`,l=!0);let t=!1;if(!l&&!s.voidElement&&v.test(s.name)){t=!0,d||=e.toLowerCase();let n=d.indexOf(`</`+s.name.toLowerCase()+`>`,y),r=n===-1?e.length:n,i=e.slice(y,r);i&&s.children.push({type:`text`,content:i}),u=r}!s.voidElement&&!l&&!t&&b&&b!==`<`&&s.children.push({type:`text`,content:e.slice(y,x?x.index:void 0)}),c===0&&a.push(s),C=o[c-1],C&&C.children.push(s),o[c]=s}if((!h||s.voidElement)&&(c>-1&&(s.voidElement||s.name===i.slice(2,-1))&&(c--,s=c===-1?a:o[c]),!l&&(b!==`<`||S)&&b)){C=c===-1?a:o[c].children;let t=x?x.index:-1,n=e.slice(y,t===-1?void 0:t);_.test(n)&&(n=` `),(t>-1&&c+C.length>=0||n!==` `)&&C.push({type:`text`,content:n})}}),i&&x(a),a}function C(e){let t=[];for(let n in e)e[n]===null?t.push(n):t.push(n+`="`+String(e[n]).replace(/"/g,`"`)+`"`);return t.length?` `+t.join(` `):``}function w(e,t){switch(t.type){case`text`:return e+t.content;case`tag`:{let n=t.voidElement&&t.name.toLowerCase()!==`!doctype`?`/>`:`>`;return e+=`<`+t.name+(t.attrs?C(t.attrs):``)+n,t.voidElement?e:e+t.children.reduce(w,``)+`</`+t.name+`>`}case`comment`:return e+=`<!--`+t.comment+`-->`,e}}function T(e){return e.reduce(function(e,t){return e+w(``,t)},``)}var E={parse:S,stringify:T},D=(e,t)=>{if(!e)return!1;let n=e.props?.children??e.children;return t?n.length>0:!!n},O=e=>{if(!e)return[];let t=e.props?.children??e.children;return e.props?.i18nIsDynamicList?A(t):t},k=e=>A(e).every(d.isValidElement),A=e=>Array.isArray(e)?e:[e],j=(e,t)=>{let n={...t};return n.props={...t.props,...e.props},n},M=e=>{let t={};if(!e)return t;let n=e=>{A(e).forEach(e=>{i(e)||(D(e)?n(O(e)):u(e)&&!(0,d.isValidElement)(e)&&Object.assign(t,e))})};return n(e),t},N=(e,t,n,r)=>{if(!e)return``;let o=``,s=A(e),c=t?.transSupportBasicHtmlNodes?t.transKeepBasicHtmlNodesFor??[]:[];return s.forEach((e,s)=>{if(i(e)){o+=`${e}`;return}if((0,d.isValidElement)(e)){let{props:a,type:l}=e,u=Object.keys(a).length,d=c.indexOf(l)>-1,f=a.children;if(!f&&d&&!u){o+=`<${l}/>`;return}if(!f&&(!d||u)||a.i18nIsDynamicList){o+=`<${s}></${s}>`;return}if(d&&u<=1){let e=i(f)?f:N(f,t,n,r);o+=`<${l}>${e}</${l}>`;return}let p=N(f,t,n,r);o+=`<${s}>${p}</${s}>`;return}if(e===null){a(n,`TRANS_NULL_VALUE`,`Passed in a null value as child`,{i18nKey:r});return}if(u(e)){let{format:t,...i}=e,s=Object.keys(i);if(s.length===1){let e=t?`${s[0]}, ${t}`:s[0];o+=`{{${e}}}`;return}a(n,`TRANS_INVALID_OBJ`,`Invalid child - Object should only have keys {{ value, format }} (format is optional).`,{i18nKey:r,child:e});return}a(n,`TRANS_INVALID_VAR`,`Passed in a variable like {number} - pass variables for interpolation as full objects like {{number}}.`,{i18nKey:r,child:e})}),o},P=(e,t,n,r,a,o,c)=>{if(n===``)return[];let f=a.transKeepBasicHtmlNodesFor||[],p=n&&new RegExp(f.map(e=>`<${e}`).join(`|`)).test(n);if(!e&&!t&&!p&&!c)return[n];let m=t??{},h=e=>{A(e).forEach(e=>{i(e)||(D(e)?h(O(e)):u(e)&&!(0,d.isValidElement)(e)&&Object.assign(m,e))})};h(e);let g=Object.keys(m),_=E.parse(`<0>${n}</0>`,{allowedTags:e=>/^\d+$/.test(e)||f.indexOf(e)>-1||g.indexOf(e)>-1}),v={...m,...o},y=(e,t,n)=>{let r=O(e),i=x(r,t.children,n);return k(r)&&i.length===0||e.props?.i18nIsDynamicList?r:i},b=(e,t,n,r,i)=>{e.dummy?(e.children=t,n.push((0,d.cloneElement)(e,{key:r},i?void 0:t))):n.push(...d.Children.map([e],e=>{if(e.type===d.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,d.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,d.cloneElement)(e,n,i?null:t)}))},x=(e,n,o)=>{let m=A(e),h=A(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 l=m[parseInt(n.name,10)];!l&&t&&(l=t[n.name]),o.length===1&&!l&&(l=o[0][n.name]),l||={};let S={...n.attrs};c&&Object.keys(S).forEach(e=>{let t=S[e];i(t)&&(S[e]=s(t))});let C=Object.keys(S).length===0?l:j({props:S},l),w=(0,d.isValidElement)(C),T=w&&D(n,!0)&&!n.voidElement,E=p&&u(C)&&C.dummy&&!w,k=u(t)&&Object.hasOwnProperty.call(t,n.name);if(i(C)){let t=r.services.interpolator.interpolate(C,v,r.language);e.push(t)}else if(D(C)||T){let t=y(C,n,o);b(C,t,e,h)}else if(E){let t=x(m,n.children,o);b(C,t,e,h)}else if(Number.isNaN(parseFloat(n.name)))if(k){let t=y(C,n,o);b(C,t,e,h,n.voidElement)}else if(a.transSupportBasicHtmlNodes&&f.indexOf(n.name)>-1)if(n.voidElement)e.push((0,d.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,d.isValidElement)(a)&&a.type===n.name){if(i===t){r=a;break}i+=1}}let a=r?A(O(r)):m,s=x(a,n.children,o);e.push((0,d.createElement)(n.name,{key:`${n.name}-${h}`},s))}else if(n.voidElement)e.push(`<${n.name} />`);else{let t=x(m,n.children,o);e.push(`<${n.name}>${t}</${n.name}>`)}else if(u(C)&&!w){let t=n.children[0]?_:null;t&&e.push(t)}else b(C,_,e,h,n.children.length!==1||!_)}else if(n.type===`text`){let t=a.transWrapTextNodes,i=typeof a.unescape==`function`?a.unescape:l().unescape,o=c?i(r.services.interpolator.interpolate(n.content,v,r.language)):r.services.interpolator.interpolate(n.content,v,r.language);t?e.push((0,d.createElement)(t,{key:`${n.name}-${h}`},o)):e.push(o)}return e},[])};return O(x([{dummy:!0,children:e||[]}],_,A(e||[]))[0])},F=(e,t,n)=>{let r=e.key||t,i=(0,d.cloneElement)(e,{key:r});if(!i.props||!i.props.children||n.indexOf(`${t}/>`)<0&&n.indexOf(`${t} />`)<0)return i;function a(){return(0,d.createElement)(d.Fragment,null,i)}return(0,d.createElement)(a,{key:r})},I=(e,t)=>e.map((e,n)=>F(e,n,t)),L=(e,t)=>{let n={};return Object.keys(e).forEach(r=>{Object.assign(n,{[r]:F(e[r],r,t)})}),n},R=(e,t,n,r)=>e?Array.isArray(e)?I(e,t):u(e)?L(e,t):(c(n,`TRANS_INVALID_COMPONENTS`,`<Trans /> "components" prop expects an object or array`,{i18nKey:r}),null):null,z=e=>!u(e)||Array.isArray(e)?!1:Object.keys(e).reduce((e,t)=>e&&Number.isNaN(Number.parseFloat(t)),!0);function B({children:e,count:t,parent:a,i18nKey:o,context:s,tOptions:u={},values:f,defaults:p,components:m,ns:h,i18n:g,t:_,shouldUnescape:v,...y}){let b=g||r();if(!b)return c(b,`NO_I18NEXT_INSTANCE`,`Trans: You need to pass in an i18next instance using initReactI18next or by passing it via props or context. In monorepo setups, make sure there is only one instance of react-i18next.`,{i18nKey:o}),e;let x=_||b.t.bind(b)||(e=>e),S={...l(),...b.options?.react},C=h||(x.ns?void 0:b.options?.defaultNS||`translation`);i(C)&&(C=[C]);let{transDefaultProps:w}=S,T=w?.tOptions?{...w.tOptions,...u}:u,E=v??w?.shouldUnescape,D=w?.values?{...w.values,...f}:f,O=w?.components?{...w.components,...m}:m,k=N(e,S,b,o),A=p||T?.defaultValue||k||S.transEmptyNodeValue||(typeof o==`function`?n(o):o),{hashTransKey:j}=S,F=o||(j?j(k||A):k||A);f=b.options?.interpolation?.defaultVariables?D&&Object.keys(D).length>0?{...D,...b.options.interpolation.defaultVariables}:{...b.options.interpolation.defaultVariables}:D;let I=M(e);I&&typeof I.count==`number`&&t===void 0&&(t=I.count);let L=f||t!==void 0&&!b.options?.interpolation?.alwaysFormat||!e?T.interpolation:{interpolation:{...T.interpolation,prefix:`#$?`,suffix:`?$#`}},B={...T,context:s||T.context,count:t,...f,...L,defaultValue:A,ns:C},V=F?x(F,B):A;V===F&&A&&(V=A);let H=R(O,V,b,o),U=H||e,W=null;z(H)&&(W=H,U=e);let G=P(U,W,V,b,S,B,E),K=a??S.defaultTransParent;return K?(0,d.createElement)(K,y,G):G}function V({children:e,count:t,parent:n,i18nKey:i,context:a,tOptions:s={},values:c,defaults:l,components:u,ns:f,i18n:p,t:m,shouldUnescape:h,...g}){let{i18n:_,defaultNS:v}=(0,d.useContext)(o)||{},y=p||_||r(),b=m||y?.t.bind(y);return B({children:e,count:t,parent:n,i18nKey:i,context:a,tOptions:s,values:c,defaults:l,components:u,ns:f||(b?.ns?void 0:v||y?.options?.defaultNS),i18n:y,t:m,shouldUnescape:h,...g})}export{V as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t}from"./jsx-runtime-BbYvbtY8.js";var n=e(t(),1),r=`specrails-desktop:a11y`,i=`specrails:a11y-changed`,a={density:`comfortable`,motion:`system`};function o(e){return e===`comfortable`||e===`compact`}function s(e){return e===`system`||e===`reduce`||e===`full`}var c=null;function l(){try{let e=localStorage.getItem(r);if(!e)return a;let t=JSON.parse(e);return{density:o(t.density)?t.density:a.density,motion:s(t.motion)?t.motion:a.motion}}catch{return a}}function u(){return c||=l(),c}function d(e){let t={...u(),...e};c=t;try{localStorage.setItem(r,JSON.stringify(t))}catch{}f(t);try{window.dispatchEvent(new CustomEvent(i))}catch{}return t}function f(e=u()){if(typeof document>`u`)return;let t=document.documentElement;t.setAttribute(`data-density`,e.density),e.motion===`system`?t.removeAttribute(`data-motion`):t.setAttribute(`data-motion`,e.motion)}function p(e){let t=()=>{c=null,f(),e()};return window.addEventListener(i,t),window.addEventListener(`storage`,t),()=>{window.removeEventListener(i,t),window.removeEventListener(`storage`,t)}}function m(){return(0,n.useSyncExternalStore)(p,u,()=>a)}function h(){try{return!!window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches}catch{return!1}}function g(){let{motion:e}=u();return e===`reduce`||e!==`full`&&h()}export{d as a,g as i,u as n,m as o,h as r,f as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={title:`Activité`,emptyTitle:`Aucune activité pour l'instant`,emptyHint:`Les événements des jobs apparaîtront ici quand des jobs s'exécuteront`,allLoaded:`Toute l'activité est chargée`,typeStarted:`Démarré`,phaseCommand:`Phase : {{phase}} → {{state}}`,relativeTime:{seconds:`il y a {{value}} s`,minutes:`il y a {{value}} min`,hours:`il y a {{value}} h`,days:`il y a {{value}} j`}},t={generating:`Génération... {{elapsed}}`,generatedIn:`Générée en {{elapsed}}`,specCreated:`Spec créée`,view:`Voir`,errorGenerating:`Erreur lors de la génération de la spec`,couldNotFind:`Impossible de trouver la spec générée`,couldNotConfirm:`Impossible de confirmer la création de la spec`},n={refining:`Affinage du contrat…`,retryRejected:`Nouvelle tentative rejetée`,retryRejectedWithError:`Nouvelle tentative rejetée : {{error}}`,retryFailed:`Échec de la nouvelle tentative`,skipped:`Couche de contrat ignorée — spec enregistrée sans elle`,reason:`Raison : {{reason}}`,added:`Couche de contrat ajoutée · {{title}}`},r={stage:{analyzing:`Analyse de la spec…`,identifying:`Identification des sous-tâches…`,ordering:`Ordonnancement de l'exécution…`},onTitled:`SMASH sur « {{title}} »`,onThisSpec:`SMASH sur cette spec`,split_one:`Spec divisée en {{count}} Sous-Spec`,split_other:`Spec divisée en {{count}} Sous-Specs`,undoAction:`Annuler`,undone:`SMASH annulé`,undoFailed:`Échec de l'annulation`,undoFailedWithReason:`Échec de l'annulation`,retrying:`Nouvelle tentative de SMASH…`,couldNotRetry:`Impossible de réessayer`,couldNotRetryWithReason:`Impossible de réessayer : {{reason}}`,retryFailed:`Échec de la nouvelle tentative`,couldNotComplete:`SMASH n'a pas pu aboutir`,failReason:{invalidOutput:`L'agent a renvoyé une sortie invalide`,timeout:`L'agent a mis trop de temps`,modelError:`Le modèle a renvoyé une erreur`,crashed:`Le processus de l'agent a planté`,generic:`Raison : {{reason}}`},couldNotStart:`Impossible de démarrer SMASH`,couldNotStartWithReason:`Impossible de démarrer SMASH : {{reason}}`,smashFailed:`Échec de SMASH`,couldNotDeleteChildren:`Impossible de supprimer les Sous-Specs actuelles`,deleteFailed:`Échec de la suppression`,smashButton:`Diviser en sous-specs`,reSmashButton:`Re-diviser en sous-specs`},i={title:`SMASH : diviser la spec en Sous-Specs`,modePickerLabel:`Mode de décomposition`,reSmashWarning_one:`⚠️ Cela supprimera la <strong>{{count}}</strong> Sous-Spec actuelle et en créera de nouvelles.`,reSmashWarning_other:`⚠️ Cela supprimera les <strong>{{count}}</strong> Sous-Specs actuelles et en créera de nouvelles.`,modes:{simple:{title:`Simple`,eta:`~10-30s`,bullet1:`Décomposition en un seul passage, basée uniquement sur le titre et la description de la spec.`,bullet2:`Aucun accès à la base de code — rapide et déterministe.`,bullet3:`Idéal pour des specs propres avec une couche de contrat solide.`},full:{title:`Complet`,eta:`~3-10 min`,bullet1:`Décomposition approfondie multi-tours avec accès en lecture seule à la base de code — lit de manière intensive.`,bullet2:`Chaque Sous-Spec est une super-spec : contexte, plan, fichiers, cas limites, hors périmètre, tests.`,bullet3:`4 à 10 critères d'acceptation par Sous-Spec, ancrés dans de vrais chemins de fichiers.`,bullet4:`Les tokens sont dépensés sans compter — la qualité avant la vitesse.`}},starting:`Démarrage…`,confirmReSmash:`Confirmer le Re-SMASH`,smash:`SMASH`,description:`SMASH découpe cette spec en Sous-Specs plus petites, à implémenter et relire une par une. La spec d’origine devient leur Epic.`},a={subSpecsHeader:`Sous-Specs ({{count}})`,emptySubSpecs:`Aucune Sous-Spec. Utilisez Re-SMASH pour régénérer.`,familyHeader_one:`Famille ({{count}} Sous-Spec)`,familyHeader_other:`Famille ({{count}} Sous-Specs)`,noSiblings:`Aucune spec sœur.`,openParentEpic:`Ouvrir l'Epic parent {{title}}`,openSubSpec:`Ouvrir la Sous-Spec {{title}}`,priority:`Priorité : {{p}}`},o={header:`Sous-Specs ({{count}})`,empty:`Aucune Sous-Spec. Cet Epic a été vidé — utilisez Re-SMASH pour régénérer.`,step:`· étape {{order}} sur {{total}}`},s={feed:e,specGen:t,contractRefine:n,smash:r,smashModal:i,family:a,epicChildren:o};export{n as contractRefine,s as default,o as epicChildren,a as family,e as feed,r as smash,i as smashModal,t as specGen};
|