specrails-desktop 2.64.2 → 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/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
|
@@ -5,7 +5,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.createDesktopRouter = createDesktopRouter;
|
|
7
7
|
const project_settings_1 = require("./modules/project-settings");
|
|
8
|
-
const http_1 = require("./modules/
|
|
8
|
+
const http_1 = require("./modules/inbox/adapters/http");
|
|
9
|
+
const http_2 = require("./modules/onboarding/adapters/http");
|
|
10
|
+
const providers_1 = require("./modules/onboarding/adapters/providers");
|
|
11
|
+
const runtime_1 = require("./modules/onboarding/adapters/runtime");
|
|
12
|
+
const catalog_1 = require("./modules/onboarding/catalog");
|
|
13
|
+
const http_3 = require("./modules/subscription-usage/adapters/http");
|
|
9
14
|
const runtime_role_prompts_router_1 = require("./runtime-role-prompts-router");
|
|
10
15
|
const express_1 = require("express");
|
|
11
16
|
const agent_runtime_settings_1 = require("./modules/agent-runtime/runtime/agent-runtime-settings");
|
|
@@ -16,12 +21,16 @@ const net_1 = __importDefault(require("net"));
|
|
|
16
21
|
const dns_1 = __importDefault(require("dns"));
|
|
17
22
|
const project_repositories_1 = require("./project-repositories");
|
|
18
23
|
const desktop_db_1 = require("./desktop-db");
|
|
24
|
+
const budget_storage_1 = require("./modules/execution/adapters/budget-storage");
|
|
25
|
+
const budget_overview_1 = require("./modules/execution/runtime/budget-overview");
|
|
19
26
|
const webhook_manager_1 = require("./webhook-manager");
|
|
20
27
|
const core_update_manager_1 = require("./core-update-manager");
|
|
28
|
+
const api_version_1 = require("./api-version");
|
|
29
|
+
const update_channel_1 = require("./update-channel");
|
|
21
30
|
const framework_reseed_1 = require("./framework-reseed");
|
|
22
31
|
const specrails_tech_client_1 = require("./specrails-tech-client");
|
|
23
32
|
const core_compat_1 = require("./core-compat");
|
|
24
|
-
const
|
|
33
|
+
const providers_2 = require("./providers");
|
|
25
34
|
const provider_detection_1 = require("./provider-detection");
|
|
26
35
|
const local_engine_detection_1 = require("./local-engine-detection");
|
|
27
36
|
const local_adapter_registry_1 = require("./providers/local-adapter-registry");
|
|
@@ -324,7 +333,52 @@ function publicWebhook(row) {
|
|
|
324
333
|
function createDesktopRouter(registry, broadcast, usageService) {
|
|
325
334
|
const router = (0, express_1.Router)();
|
|
326
335
|
if (usageService)
|
|
327
|
-
(0,
|
|
336
|
+
(0, http_3.registerUsageRoutes)(router, usageService);
|
|
337
|
+
// "Needs you" inbox: read-only projection across projects (modules/inbox).
|
|
338
|
+
(0, http_1.registerInboxRoutes)(router, registry);
|
|
339
|
+
// Sample-project first run (modules/onboarding): create/remove the bundled
|
|
340
|
+
// sample project and report launch readiness. Registered before the
|
|
341
|
+
// `/projects` routes below; it shares their registration side effects.
|
|
342
|
+
(0, http_2.registerOnboardingRoutes)(router, {
|
|
343
|
+
samples: catalog_1.SAMPLE_CATALOG,
|
|
344
|
+
files: (0, runtime_1.createSampleFiles)(),
|
|
345
|
+
git: (0, runtime_1.createSampleGit)(),
|
|
346
|
+
specs: (0, runtime_1.createSampleSpecs)(),
|
|
347
|
+
state: (0, runtime_1.createSampleState)({
|
|
348
|
+
get: (key) => (0, desktop_db_1.getDesktopSetting)(registry.desktopDb, key),
|
|
349
|
+
set: (key, value) => (0, desktop_db_1.setDesktopSetting)(registry.desktopDb, key, value),
|
|
350
|
+
}),
|
|
351
|
+
providers: ({ refresh }) => (0, providers_1.loadPresetCandidates)(refresh),
|
|
352
|
+
projects: {
|
|
353
|
+
register: ({ path: projectPath, name }) => {
|
|
354
|
+
const canonicalPath = canonicalizePath(path_1.default.resolve(projectPath));
|
|
355
|
+
const detectedNow = (0, provider_detection_1.getDetectedIdsSync)() ?? [];
|
|
356
|
+
const providers = detectedNow.length > 0 ? [...detectedNow] : ['claude'];
|
|
357
|
+
const slug = allocateSlug(name, new Set((0, desktop_db_1.listProjects)(registry.desktopDb).map((p) => p.slug)));
|
|
358
|
+
const id = (0, crypto_1.randomUUID)();
|
|
359
|
+
const ctx = registry.addProject({ id, slug, name, path: canonicalPath, provider: providers[0], providers, repositories: [], workspacePaths: undefined });
|
|
360
|
+
broadcast({ type: 'desktop.project_added', project: ctx.project, timestamp: new Date().toISOString() });
|
|
361
|
+
// Same silent, non-blocking workspace assembly as POST /projects.
|
|
362
|
+
try {
|
|
363
|
+
if (!(0, workspace_resolution_1.isWorkspacePopulated)((0, workspace_manager_1.workspacePathFor)(slug)))
|
|
364
|
+
ctx.setupManager.startSilentAssemble(id, canonicalPath, slug, providers);
|
|
365
|
+
}
|
|
366
|
+
catch (err) {
|
|
367
|
+
console.warn('[desktop] sample silent assemble launch failed (non-fatal):', err);
|
|
368
|
+
}
|
|
369
|
+
return { id, name: ctx.project.name, path: canonicalPath };
|
|
370
|
+
},
|
|
371
|
+
unregister: (projectId) => {
|
|
372
|
+
registry.removeProject(projectId);
|
|
373
|
+
broadcast({ type: 'desktop.project_removed', projectId, timestamp: new Date().toISOString() });
|
|
374
|
+
},
|
|
375
|
+
isRegistered: (projectId) => registry.getProjectRow(projectId) !== undefined,
|
|
376
|
+
get: (projectId) => {
|
|
377
|
+
const row = registry.getProjectRow(projectId);
|
|
378
|
+
return row ? { id: row.id, name: row.name, path: row.path } : null;
|
|
379
|
+
},
|
|
380
|
+
},
|
|
381
|
+
});
|
|
328
382
|
// Loops (global, cross-project library) — /api/loops*. Registered here so the
|
|
329
383
|
// routes live on the global `/api` router (loops are NOT project-scoped). The
|
|
330
384
|
// A loop is "running" iff any project's per-project DB has an in-flight
|
|
@@ -347,7 +401,7 @@ function createDesktopRouter(registry, broadcast, usageService) {
|
|
|
347
401
|
continue; // legacy → migration owns it
|
|
348
402
|
const missing = detected.filter((p) => {
|
|
349
403
|
try {
|
|
350
|
-
return (0,
|
|
404
|
+
return (0, providers_2.hasAdapter)(p) && !fs_1.default.existsSync(path_1.default.join(workspace, (0, providers_2.getAdapter)(p).projectDirName));
|
|
351
405
|
}
|
|
352
406
|
catch {
|
|
353
407
|
return false;
|
|
@@ -411,7 +465,7 @@ function createDesktopRouter(registry, broadcast, usageService) {
|
|
|
411
465
|
// when the endpoint is down. Their availability is the bounded HTTP probe
|
|
412
466
|
// from the detection cycle (refreshed here so a first call after boot is
|
|
413
467
|
// not blind); an id the snapshot does not know stays unavailable.
|
|
414
|
-
const localIds = (0,
|
|
468
|
+
const localIds = (0, providers_2.listAdapters)().filter(local_adapter_1.isLocalAdapter).map((adapter) => adapter.id);
|
|
415
469
|
if (localIds.length > 0) {
|
|
416
470
|
const snapshot = await (0, provider_detection_1.getDetectionSnapshot)();
|
|
417
471
|
for (const id of localIds)
|
|
@@ -425,7 +479,7 @@ function createDesktopRouter(registry, broadcast, usageService) {
|
|
|
425
479
|
gated.gemini = false;
|
|
426
480
|
const providerIssues = {};
|
|
427
481
|
if (gated.kimi) {
|
|
428
|
-
const readiness = await detectProviderReadiness((0,
|
|
482
|
+
const readiness = await detectProviderReadiness((0, providers_2.getAdapter)('kimi'));
|
|
429
483
|
if (readiness.issue) {
|
|
430
484
|
gated.kimi = false;
|
|
431
485
|
providerIssues.kimi = readiness.issue;
|
|
@@ -446,13 +500,13 @@ function createDesktopRouter(registry, broadcast, usageService) {
|
|
|
446
500
|
const tiers = ['quick'];
|
|
447
501
|
if (Object.values(gated).some(Boolean))
|
|
448
502
|
tiers.push('full');
|
|
449
|
-
const launchDescriptors = Object.fromEntries((0,
|
|
503
|
+
const launchDescriptors = Object.fromEntries((0, providers_2.listAdapters)().map((adapter) => [
|
|
450
504
|
adapter.id,
|
|
451
505
|
{ command: adapter.binary, args: [] },
|
|
452
506
|
]));
|
|
453
507
|
// Display names so app-level selectors (Agent composer, Builder) can label
|
|
454
508
|
// a local engine with its connection label instead of its raw id.
|
|
455
|
-
const labels = Object.fromEntries((0,
|
|
509
|
+
const labels = Object.fromEntries((0, providers_2.listAdapters)().map((adapter) => [adapter.id, adapter.displayName]));
|
|
456
510
|
res.json({ ...gated, tiers, providerIssues, launchDescriptors, labels });
|
|
457
511
|
});
|
|
458
512
|
router.get('/setup-prerequisites', (req, res) => {
|
|
@@ -523,9 +577,9 @@ function createDesktopRouter(registry, broadcast, usageService) {
|
|
|
523
577
|
// both accepted as of Stage C; future providers register one adapter
|
|
524
578
|
// file and become acceptable here without further changes.
|
|
525
579
|
for (const p of providers) {
|
|
526
|
-
if (!(0,
|
|
580
|
+
if (!(0, providers_2.hasAdapter)(p)) {
|
|
527
581
|
res.status(400).json({
|
|
528
|
-
error: `provider must be one of: ${[...(0,
|
|
582
|
+
error: `provider must be one of: ${[...(0, providers_2.listAdapters)().map((a) => a.id)].join(', ')}`,
|
|
529
583
|
});
|
|
530
584
|
return;
|
|
531
585
|
}
|
|
@@ -545,7 +599,7 @@ function createDesktopRouter(registry, broadcast, usageService) {
|
|
|
545
599
|
return;
|
|
546
600
|
}
|
|
547
601
|
if (providers.includes('kimi')) {
|
|
548
|
-
const readiness = await detectProviderReadiness((0,
|
|
602
|
+
const readiness = await detectProviderReadiness((0, providers_2.getAdapter)('kimi'));
|
|
549
603
|
if (readiness.issue) {
|
|
550
604
|
res.status(409).json({
|
|
551
605
|
code: readiness.issue.code,
|
|
@@ -818,15 +872,19 @@ function createDesktopRouter(registry, broadcast, usageService) {
|
|
|
818
872
|
const costAlertThresholdRaw = (0, desktop_db_1.getDesktopSetting)(registry.desktopDb, 'cost_alert_threshold_usd');
|
|
819
873
|
const costAlertThresholdUsd = costAlertThresholdRaw != null ? parseFloat(costAlertThresholdRaw) : null;
|
|
820
874
|
const allowSubagents = (0, desktop_db_1.getGlobalAllowSubagents)(registry.desktopDb);
|
|
821
|
-
res.json({ port: parseInt(port, 10), specrailsTechUrl, costAlertThresholdUsd, allowSubagents, subagentRuntime: (0, desktop_db_1.getGlobalSubagentRuntime)(registry.desktopDb) });
|
|
875
|
+
res.json({ port: parseInt(port, 10), specrailsTechUrl, costAlertThresholdUsd, allowSubagents, subagentRuntime: (0, desktop_db_1.getGlobalSubagentRuntime)(registry.desktopDb), updateChannel: (0, desktop_db_1.getUpdateChannel)(registry.desktopDb) });
|
|
822
876
|
});
|
|
823
877
|
// PUT /api/settings — update app-level settings
|
|
824
878
|
router.put('/settings', (req, res) => {
|
|
825
|
-
const { port, specrailsTechUrl, costAlertThresholdUsd, allowSubagents } = req.body ?? {};
|
|
879
|
+
const { port, specrailsTechUrl, costAlertThresholdUsd, allowSubagents, updateChannel } = req.body ?? {};
|
|
826
880
|
if (allowSubagents !== undefined && typeof allowSubagents !== 'boolean') {
|
|
827
881
|
res.status(400).json({ error: 'allowSubagents must be a boolean' });
|
|
828
882
|
return;
|
|
829
883
|
}
|
|
884
|
+
if (updateChannel !== undefined && !(0, update_channel_1.isUpdateChannel)(updateChannel)) {
|
|
885
|
+
res.status(400).json({ error: 'updateChannel must be "latest" or "stable"' });
|
|
886
|
+
return;
|
|
887
|
+
}
|
|
830
888
|
let subagentRuntime;
|
|
831
889
|
if (req.body?.subagentRuntime !== undefined) {
|
|
832
890
|
try {
|
|
@@ -877,6 +935,8 @@ function createDesktopRouter(registry, broadcast, usageService) {
|
|
|
877
935
|
if (previous !== JSON.stringify(subagentRuntime))
|
|
878
936
|
registry.notifySettingsChanged({ projectId: null });
|
|
879
937
|
}
|
|
938
|
+
if (updateChannel !== undefined)
|
|
939
|
+
(0, desktop_db_1.setUpdateChannel)(registry.desktopDb, updateChannel);
|
|
880
940
|
res.json({ ok: true });
|
|
881
941
|
});
|
|
882
942
|
// ─── Budget routes ────────────────────────────────────────────────────────────
|
|
@@ -890,8 +950,12 @@ function createDesktopRouter(registry, broadcast, usageService) {
|
|
|
890
950
|
const budgetUtilizationPct = desktopDailyBudgetUsd != null && desktopDailyBudgetUsd > 0 && unpricedRuns === 0
|
|
891
951
|
? (costToday / desktopDailyBudgetUsd) * 100
|
|
892
952
|
: null;
|
|
953
|
+
const caps = (0, budget_storage_1.readDesktopCaps)((key) => (0, desktop_db_1.getDesktopSetting)(registry.desktopDb, key));
|
|
893
954
|
res.json({
|
|
894
955
|
desktopDailyBudgetUsd,
|
|
956
|
+
desktopWeeklyBudgetUsd: caps.week,
|
|
957
|
+
desktopMonthlyBudgetUsd: caps.month,
|
|
958
|
+
runCapUsd: caps.run,
|
|
895
959
|
costAlertThresholdUsd,
|
|
896
960
|
costToday,
|
|
897
961
|
pricedRuns,
|
|
@@ -902,6 +966,22 @@ function createDesktopRouter(registry, broadcast, usageService) {
|
|
|
902
966
|
// PATCH /api/budget — update app-level budget settings
|
|
903
967
|
router.patch('/budget', (req, res) => {
|
|
904
968
|
const { desktopDailyBudgetUsd, costAlertThresholdUsd } = req.body ?? {};
|
|
969
|
+
// Caps beyond the daily budget (CD5): null clears, a number > 0 sets, anything else is a 400.
|
|
970
|
+
const capFields = [['desktopWeeklyBudgetUsd', budget_storage_1.DESKTOP_CAP_KEYS.week], ['desktopMonthlyBudgetUsd', budget_storage_1.DESKTOP_CAP_KEYS.month], ['runCapUsd', budget_storage_1.DESKTOP_CAP_KEYS.run]];
|
|
971
|
+
for (const [field] of capFields) {
|
|
972
|
+
const value = (req.body ?? {})[field];
|
|
973
|
+
if (value !== undefined && value !== null && !(typeof value === 'number' && Number.isFinite(value) && value > 0)) {
|
|
974
|
+
res.status(400).json({ error: 'invalid_cap', field });
|
|
975
|
+
return;
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
for (const [field, key] of capFields) {
|
|
979
|
+
const value = (req.body ?? {})[field];
|
|
980
|
+
if (value === null)
|
|
981
|
+
registry.desktopDb.prepare('DELETE FROM desktop_settings WHERE key = ?').run(key);
|
|
982
|
+
else if (typeof value === 'number')
|
|
983
|
+
(0, desktop_db_1.setDesktopSetting)(registry.desktopDb, key, String(value));
|
|
984
|
+
}
|
|
905
985
|
if (desktopDailyBudgetUsd !== undefined) {
|
|
906
986
|
if (desktopDailyBudgetUsd === null) {
|
|
907
987
|
registry.desktopDb.prepare('DELETE FROM desktop_settings WHERE key = ?').run('desktop_daily_budget_usd');
|
|
@@ -920,6 +1000,23 @@ function createDesktopRouter(registry, broadcast, usageService) {
|
|
|
920
1000
|
}
|
|
921
1001
|
res.json({ ok: true });
|
|
922
1002
|
});
|
|
1003
|
+
// GET /api/budget/caps — app-wide Budget panel read model: the app-wide caps
|
|
1004
|
+
// with their spend (all projects combined), spend per period split by
|
|
1005
|
+
// provider and the month-end projection (an estimate).
|
|
1006
|
+
router.get('/budget/caps', (_req, res) => {
|
|
1007
|
+
try {
|
|
1008
|
+
const at = new Date();
|
|
1009
|
+
res.json({
|
|
1010
|
+
...(0, budget_overview_1.readSpendOverview)(registry.listContexts().map((c) => ({ db: c.db, projectId: c.project.id })), at),
|
|
1011
|
+
config: (0, budget_storage_1.readDesktopCaps)((key) => (0, desktop_db_1.getDesktopSetting)(registry.desktopDb, key)),
|
|
1012
|
+
caps: registry.desktopCapStatuses(at),
|
|
1013
|
+
});
|
|
1014
|
+
}
|
|
1015
|
+
catch (err) {
|
|
1016
|
+
console.error('[desktop-router] budget caps error:', err);
|
|
1017
|
+
res.status(500).json({ error: 'budget_caps_unavailable' });
|
|
1018
|
+
}
|
|
1019
|
+
});
|
|
923
1020
|
// ─── Agent routes ────────────────────────────────────────────────────────────
|
|
924
1021
|
// GET /api/agents — list all registered agents
|
|
925
1022
|
router.get('/agents', (_req, res) => {
|
|
@@ -1423,12 +1520,28 @@ function createDesktopRouter(registry, broadcast, usageService) {
|
|
|
1423
1520
|
// and not members of the WsMessage union; cast at this single boundary.
|
|
1424
1521
|
broadcast: (msg) => broadcast(msg),
|
|
1425
1522
|
providers: () => registry.installedProvidersUnion(),
|
|
1523
|
+
channel: () => (0, desktop_db_1.getUpdateChannel)(registry.desktopDb),
|
|
1426
1524
|
reseed: version => (0, framework_reseed_1.reseedStaleWorkspaces)(registry.listContexts().map(context => ({
|
|
1427
1525
|
id: context.project.id,
|
|
1428
1526
|
slug: context.project.slug,
|
|
1429
1527
|
path: context.project.path,
|
|
1430
1528
|
})), version),
|
|
1431
1529
|
});
|
|
1530
|
+
// GET /api/meta — versions a client needs to negotiate with this server.
|
|
1531
|
+
// Additive-only shape; see docs/internals/api-reference.md (versioning policy).
|
|
1532
|
+
router.get('/meta', async (_req, res) => {
|
|
1533
|
+
const channel = (0, desktop_db_1.getUpdateChannel)(registry.desktopDb);
|
|
1534
|
+
const compat = await (0, core_compat_1.checkCoreCompat)().catch(() => null);
|
|
1535
|
+
const core = coreUpdate.getStatus();
|
|
1536
|
+
res.json({
|
|
1537
|
+
apiVersion: api_version_1.API_VERSION,
|
|
1538
|
+
appVersion: compat?.desktopVersion ?? null,
|
|
1539
|
+
coreVersion: core.currentVersion ?? compat?.coreVersion ?? core.bundledVersion ?? null,
|
|
1540
|
+
contractSchemaVersion: compat?.contractSchemaVersion ?? null,
|
|
1541
|
+
channel,
|
|
1542
|
+
updateManifestUrl: (0, update_channel_1.appUpdaterManifestUrl)(channel),
|
|
1543
|
+
});
|
|
1544
|
+
});
|
|
1432
1545
|
// GET /api/core-update/status — current/bundled/latest versions, no network.
|
|
1433
1546
|
router.get('/core-update/status', (_req, res) => {
|
|
1434
1547
|
res.json(coreUpdate.getStatus());
|
|
@@ -187,9 +187,37 @@ function slugToTitle(slug) {
|
|
|
187
187
|
function categoryLabel(slug, lang) {
|
|
188
188
|
return CATEGORY_LABELS[lang]?.[slug] ?? CATEGORY_LABELS[DEFAULT_LANG]?.[slug] ?? slugToTitle(slug);
|
|
189
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* Headings may carry an explicit, locale-independent anchor: `## Title {#anchor}`.
|
|
192
|
+
* The anchor is a link target for in-app "Learn more" hints, never part of the
|
|
193
|
+
* visible title.
|
|
194
|
+
*/
|
|
195
|
+
const HEADING_ANCHOR = /\s*\{#([a-z0-9][a-z0-9-]*)\}\s*$/i;
|
|
196
|
+
function stripHeadingAnchor(text) {
|
|
197
|
+
return text.replace(HEADING_ANCHOR, '').trim();
|
|
198
|
+
}
|
|
190
199
|
function extractTitle(content, slug) {
|
|
191
200
|
const match = content.match(/^#\s+(.+)$/m);
|
|
192
|
-
return match ? match[1]
|
|
201
|
+
return match ? stripHeadingAnchor(match[1]) || slugToTitle(slug) : slugToTitle(slug);
|
|
202
|
+
}
|
|
203
|
+
/** Headings outside code fences, with their optional explicit anchors. */
|
|
204
|
+
function extractHeadings(content) {
|
|
205
|
+
const out = [];
|
|
206
|
+
let fenced = false;
|
|
207
|
+
for (const line of content.split('\n')) {
|
|
208
|
+
if (/^```/.test(line))
|
|
209
|
+
fenced = !fenced;
|
|
210
|
+
if (fenced)
|
|
211
|
+
continue;
|
|
212
|
+
const m = /^(#{1,4})\s+(.+?)\s*$/.exec(line);
|
|
213
|
+
if (!m)
|
|
214
|
+
continue;
|
|
215
|
+
const anchor = HEADING_ANCHOR.exec(m[2])?.[1]?.toLowerCase() ?? null;
|
|
216
|
+
const text = stripHeadingAnchor(m[2]);
|
|
217
|
+
if (text)
|
|
218
|
+
out.push({ level: m[1].length, text, anchor });
|
|
219
|
+
}
|
|
220
|
+
return out;
|
|
193
221
|
}
|
|
194
222
|
/** Parse an `<order>-<slug>.md` filename into { order, slug }. */
|
|
195
223
|
function parseGuideFile(file) {
|
|
@@ -202,6 +230,7 @@ function categoryRank(slug) {
|
|
|
202
230
|
const i = CATEGORY_ORDER.indexOf(slug);
|
|
203
231
|
return i === -1 ? Number.MAX_SAFE_INTEGER : i;
|
|
204
232
|
}
|
|
233
|
+
const MAX_SEARCH_RESULTS = 8;
|
|
205
234
|
/** List the category subdirectories of a localized lang dir (existence-safe). */
|
|
206
235
|
function listCategories(dir) {
|
|
207
236
|
try {
|
|
@@ -314,6 +343,43 @@ function createDocsRouter() {
|
|
|
314
343
|
const categories = guideRoot ? buildCategories(guideRoot, lang) : [];
|
|
315
344
|
res.json({ categories });
|
|
316
345
|
});
|
|
346
|
+
// Search the guide's page titles and headings in one language (the in-app
|
|
347
|
+
// `?` cheatsheet lists the matches next to the shortcuts). A page that is
|
|
348
|
+
// not translated falls back to English, like the index.
|
|
349
|
+
router.get('/search', (req, res) => {
|
|
350
|
+
const lang = normalizeLang(req.query.lang);
|
|
351
|
+
const query = typeof req.query.q === 'string' ? req.query.q.trim().toLocaleLowerCase(lang) : '';
|
|
352
|
+
const guideRoot = resolveGuideRoot();
|
|
353
|
+
if (!query || query.length > 80 || !guideRoot) {
|
|
354
|
+
res.json({ results: [] });
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
const results = [];
|
|
358
|
+
for (const cat of buildCategories(guideRoot, lang)) {
|
|
359
|
+
for (const doc of cat.docs) {
|
|
360
|
+
const resolved = resolveDocFile(guideRoot, lang, cat.slug, doc.slug);
|
|
361
|
+
if (!resolved)
|
|
362
|
+
continue;
|
|
363
|
+
let content = '';
|
|
364
|
+
try {
|
|
365
|
+
content = fs_1.default.readFileSync(resolved.filePath, 'utf-8');
|
|
366
|
+
}
|
|
367
|
+
catch {
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
const titleHit = doc.title.toLocaleLowerCase(lang).includes(query);
|
|
371
|
+
const headings = extractHeadings(content).filter((h) => h.level > 1 && h.text.toLocaleLowerCase(lang).includes(query));
|
|
372
|
+
if (titleHit) {
|
|
373
|
+
results.push({ category: cat.slug, categoryName: cat.name, slug: doc.slug, title: doc.title, heading: null, anchor: null, rank: 0 });
|
|
374
|
+
}
|
|
375
|
+
for (const h of headings.slice(0, 3)) {
|
|
376
|
+
results.push({ category: cat.slug, categoryName: cat.name, slug: doc.slug, title: doc.title, heading: h.text, anchor: h.anchor, rank: 1 });
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
results.sort((a, b) => a.rank - b.rank);
|
|
381
|
+
res.json({ results: results.slice(0, MAX_SEARCH_RESULTS).map(({ rank: _rank, ...rest }) => rest) });
|
|
382
|
+
});
|
|
317
383
|
router.get('/:category/:slug', (req, res) => {
|
|
318
384
|
const { category, slug } = req.params;
|
|
319
385
|
const lang = normalizeLang(req.query.lang);
|
|
@@ -9,6 +9,8 @@ exports.isReviewPacketEnabled = isReviewPacketEnabled;
|
|
|
9
9
|
exports.areDeliveryRevisionsEnabled = areDeliveryRevisionsEnabled;
|
|
10
10
|
exports.isMissionRailCardsEnabled = isMissionRailCardsEnabled;
|
|
11
11
|
exports.isMissionFailureTurnEnabled = isMissionFailureTurnEnabled;
|
|
12
|
+
exports.isMissionReadOnlyEnabled = isMissionReadOnlyEnabled;
|
|
13
|
+
exports.isSpecTriageAutoEnabled = isSpecTriageAutoEnabled;
|
|
12
14
|
function isCodeExplorerEnabled() {
|
|
13
15
|
return process.env.SPECRAILS_CODE_EXPLORER !== 'false';
|
|
14
16
|
}
|
|
@@ -97,3 +99,23 @@ function isMissionRailCardsEnabled() {
|
|
|
97
99
|
function isMissionFailureTurnEnabled() {
|
|
98
100
|
return isMissionRailCardsEnabled() && process.env.SPECRAILS_MISSION_FAILURE_TURN !== 'false';
|
|
99
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Read-only mission agents (mission-read-only-policy). Mission turns spawn with
|
|
104
|
+
* the provider's native read-only boundary (Claude: no write/exec built-in
|
|
105
|
+
* tools; Codex: read-only sandbox; Gemini: plan mode; local engines: read-only
|
|
106
|
+
* tool set) and Core mission sessions get the matching read-only policy, while
|
|
107
|
+
* the `specrails_*` MCP tools stay callable. Default ON; set
|
|
108
|
+
* SPECRAILS_MISSION_READ_ONLY="false" to restore the previous write-capable
|
|
109
|
+
* mission argv and session policy (emergency rollback, no release needed).
|
|
110
|
+
*/
|
|
111
|
+
function isMissionReadOnlyEnabled() {
|
|
112
|
+
return process.env.SPECRAILS_MISSION_READ_ONLY !== 'false';
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Spec triage (launch-triage): automatic triage of specs on create/edit.
|
|
116
|
+
* Default ON; set SPECRAILS_SPEC_TRIAGE="false" to stop the automatic triggers
|
|
117
|
+
* (on-demand `POST /tickets/:id/triage` keeps working).
|
|
118
|
+
*/
|
|
119
|
+
function isSpecTriageAutoEnabled() {
|
|
120
|
+
return process.env.SPECRAILS_SPEC_TRIAGE !== 'false';
|
|
121
|
+
}
|
package/server/dist/index.js
CHANGED
|
@@ -16,6 +16,7 @@ const express_1 = __importDefault(require("express"));
|
|
|
16
16
|
const ws_1 = require("ws");
|
|
17
17
|
const project_registry_1 = require("./project-registry");
|
|
18
18
|
const desktop_router_1 = require("./desktop-router");
|
|
19
|
+
const api_version_1 = require("./api-version");
|
|
19
20
|
const provider_detection_1 = require("./provider-detection");
|
|
20
21
|
const provider_selection_1 = require("./provider-selection");
|
|
21
22
|
const desktop_db_1 = require("./desktop-db");
|
|
@@ -34,11 +35,15 @@ const mobile_1 = require("./mobile");
|
|
|
34
35
|
const mcp_1 = require("./mcp");
|
|
35
36
|
const agent_chat_manager_1 = require("./modules/missions/runtime/agent-chat-manager");
|
|
36
37
|
const mission_core_sessions_1 = require("./modules/missions/runtime/mission-core-sessions");
|
|
38
|
+
const bindings_1 = require("./modules/flow/adapters/bindings");
|
|
39
|
+
const agent_store_1 = require("./modules/agents/runtime/agent-store");
|
|
37
40
|
const session_host_registry_1 = require("./modules/agent-sessions/runtime/session-host-registry");
|
|
38
41
|
const http_2 = require("./modules/agent-sessions/adapters/http");
|
|
39
42
|
const host_process_1 = require("./modules/agent-sessions/adapters/host-process");
|
|
40
43
|
const core_sessions_availability_1 = require("./modules/agent-sessions/runtime/core-sessions-availability");
|
|
41
44
|
const registry_1 = require("./providers/registry");
|
|
45
|
+
const runtime_1 = require("./providers/runtime");
|
|
46
|
+
const project_env_1 = require("./project-env");
|
|
42
47
|
const agent_capability_1 = require("./mcp/agent-capability");
|
|
43
48
|
const agent_chat_router_1 = require("./modules/missions/runtime/agent-chat-router");
|
|
44
49
|
const blueprint_chat_manager_1 = require("./modules/builder/runtime/blueprint-chat-manager");
|
|
@@ -165,6 +170,7 @@ function corsMiddleware(req, res, next) {
|
|
|
165
170
|
if (ALLOWED_ORIGIN_PATTERN.test(origin)) {
|
|
166
171
|
res.setHeader('Access-Control-Allow-Origin', origin);
|
|
167
172
|
res.setHeader('Vary', 'Origin');
|
|
173
|
+
res.setHeader('Access-Control-Expose-Headers', api_version_1.API_VERSION_HEADER);
|
|
168
174
|
}
|
|
169
175
|
else {
|
|
170
176
|
// Non-localhost origin — reject with 403
|
|
@@ -182,6 +188,9 @@ function corsMiddleware(req, res, next) {
|
|
|
182
188
|
next();
|
|
183
189
|
}
|
|
184
190
|
app.use(corsMiddleware);
|
|
191
|
+
// Every /api response (desktop, project-scoped, auth failures, 404s) carries the
|
|
192
|
+
// API contract version. Mounted before any /api router so nothing bypasses it.
|
|
193
|
+
app.use('/api', api_version_1.apiVersionHeader);
|
|
185
194
|
app.use('/api/host', (0, host_control_1.createHostControlRouter)({ token: hostControlToken, onShutdown: shutdown }));
|
|
186
195
|
// Provider traffic uses the desktop listener as a stable relay. Mount before
|
|
187
196
|
// every body parser so large/streaming request bodies and Codex event streams
|
|
@@ -481,6 +490,7 @@ app.get('/api/health', (_req, res) => {
|
|
|
481
490
|
res.json({
|
|
482
491
|
status: 'ok',
|
|
483
492
|
version: PKG_VERSION,
|
|
493
|
+
apiVersion: api_version_1.API_VERSION,
|
|
484
494
|
uptime: Math.floor(process.uptime()),
|
|
485
495
|
projects: _getProjectCount(),
|
|
486
496
|
mode: 'super',
|
|
@@ -623,20 +633,7 @@ function applyPtyWsRateLimiting(ws) {
|
|
|
623
633
|
// Second HTTPS+WSS listener in THIS process; the main server stays loopback.
|
|
624
634
|
// The control plane is desktop-only: loopback + (via /api below) requireAuth.
|
|
625
635
|
// Mounted before the /api desktop router so its sub-path is unambiguous.
|
|
626
|
-
const mobileGateway = new mobile_1.MobileGateway({
|
|
627
|
-
desktopDb: registry.desktopDb,
|
|
628
|
-
desktopPort: port,
|
|
629
|
-
broadcast,
|
|
630
|
-
// Companion app preview: each project's browser + the process-log targets.
|
|
631
|
-
preview: {
|
|
632
|
-
enabled: () => BROWSER_CAPTURE_ENABLED,
|
|
633
|
-
browserFor: (projectId) => registry.getContext(projectId)?.browserCaptureManager ?? null,
|
|
634
|
-
allBrowsers: () => registry.listProjects()
|
|
635
|
-
.map((project) => registry.getContext(project.id)?.browserCaptureManager)
|
|
636
|
-
.filter((manager) => manager != null),
|
|
637
|
-
targets: registry.previewTargets,
|
|
638
|
-
},
|
|
639
|
-
});
|
|
636
|
+
const mobileGateway = new mobile_1.MobileGateway({ desktopDb: registry.desktopDb, desktopPort: port, broadcast });
|
|
640
637
|
_mobileGateway = mobileGateway;
|
|
641
638
|
app.use('/api/mobile', auth_1.requireLoopback, (0, mobile_1.createMobileAdminRouter)({
|
|
642
639
|
gateway: mobileGateway,
|
|
@@ -681,7 +678,15 @@ function applyPtyWsRateLimiting(ws) {
|
|
|
681
678
|
// project scope; missions use it when SPECRAILS_CORE_SESSIONS allows and the
|
|
682
679
|
// selected Core advertises `sessions`. Otherwise missions keep legacy runners.
|
|
683
680
|
const sessionHosts = new session_host_registry_1.SessionHostRegistry({
|
|
684
|
-
launcher: new host_process_1.CoreHostLauncher({
|
|
681
|
+
launcher: new host_process_1.CoreHostLauncher({
|
|
682
|
+
host: { name: 'specrails-desktop', version: process.env.npm_package_version ?? 'unknown' },
|
|
683
|
+
// A project scope's host follows that project's agent environment mode
|
|
684
|
+
// (Core may launch any configured provider, so every adapter's names pass).
|
|
685
|
+
env: (scope) => {
|
|
686
|
+
const context = registry.listContexts().find(item => item.project.slug === scope);
|
|
687
|
+
return (0, project_env_1.projectAgentSourceEnv)(context?.db, (0, runtime_1.providerEnvAllowlist)((0, registry_1.listAdapters)()));
|
|
688
|
+
},
|
|
689
|
+
}),
|
|
685
690
|
clock: { now: () => Date.now(), after: (ms, callback) => { const timer = setTimeout(callback, ms); timer.unref?.(); return { cancel: () => clearTimeout(timer) }; } },
|
|
686
691
|
onStatus: (scope, status, detail, code) => {
|
|
687
692
|
console.log(`[agent-sessions] ${scope}: ${status}${detail ? ` (${detail})` : ''}`);
|
|
@@ -717,8 +722,18 @@ function applyPtyWsRateLimiting(ws) {
|
|
|
717
722
|
const context = registry.getContext(conversation.pinned_project_id);
|
|
718
723
|
return context ? (0, sqlite_1.getProjectSettings)(context.db).subagentRuntime : null;
|
|
719
724
|
},
|
|
725
|
+
// Agent actions audit: mission tool calls land in the pinned project's log.
|
|
726
|
+
agentAudit: (projectId) => registry.getContext(projectId)?.agentAudit?.recorder ?? null,
|
|
720
727
|
});
|
|
721
728
|
agentChatManager.setCoreSessions(missionCoreSessions);
|
|
729
|
+
agentChatManager.setAgentAudit((projectId) => registry.getContext(projectId)?.agentAudit?.recorder ?? null);
|
|
730
|
+
// Flow mode: an active Flow turns a mission turn into a Flow turn. Missions
|
|
731
|
+
// see only this port; the Flow state lives in each project's database.
|
|
732
|
+
agentChatManager.setFlowTurnContext((0, bindings_1.createFlowTurnContext)({
|
|
733
|
+
conversationProject: (conversationId) => (0, agent_store_1.getAgentConversation)(registry.desktopDb, conversationId)?.pinned_project_id ?? null,
|
|
734
|
+
flowServiceFor: (projectId) => registry.getContext(projectId)?.flow ?? null,
|
|
735
|
+
availability: () => (0, core_sessions_availability_1.flowAvailability)(),
|
|
736
|
+
}));
|
|
722
737
|
registry.onSettingsChanged((scope) => { void missionCoreSessions.refreshSubagentPolicy(scope); });
|
|
723
738
|
registry.onProjectRemoved(({ slug }) => { void sessionHosts.stop(slug); });
|
|
724
739
|
// Publish the instance to the process-wide registry so the rails layer can
|
|
@@ -6,9 +6,10 @@
|
|
|
6
6
|
// single internal "text" model and render it to either format at the client
|
|
7
7
|
// boundary (see jira-client.ts `bodyForDeployment`).
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.SPECRAILS_COMMENT_PROP_KEY = void 0;
|
|
9
|
+
exports.SPECRAILS_ISSUE_CREATE_PROP_KEY = exports.SPECRAILS_COMMENT_PROP_KEY = void 0;
|
|
10
10
|
exports.textToAdf = textToAdf;
|
|
11
11
|
exports.bodyForDeployment = bodyForDeployment;
|
|
12
|
+
exports.issueCreateMarker = issueCreateMarker;
|
|
12
13
|
exports.commentMarker = commentMarker;
|
|
13
14
|
exports.discardCommentMarker = discardCommentMarker;
|
|
14
15
|
exports.prMergedCommentMarker = prMergedCommentMarker;
|
|
@@ -220,6 +221,17 @@ function bodyForDeployment(text, deployment) {
|
|
|
220
221
|
* both Cloud (v3) and Data Center (v2).
|
|
221
222
|
*/
|
|
222
223
|
exports.SPECRAILS_COMMENT_PROP_KEY = 'sh.specrails.marker';
|
|
224
|
+
/**
|
|
225
|
+
* Jira ISSUE-property key carrying the creation marker of an issue Specrails
|
|
226
|
+
* created from a local ticket. Entity properties never render, so the marker is
|
|
227
|
+
* invisible; it lets a retried durable `create` recover an issue whose create
|
|
228
|
+
* response was lost instead of creating a duplicate.
|
|
229
|
+
*/
|
|
230
|
+
exports.SPECRAILS_ISSUE_CREATE_PROP_KEY = 'sh.specrails.created-from';
|
|
231
|
+
/** Stable creation marker for (project, local ticket). */
|
|
232
|
+
function issueCreateMarker(projectId, localTicketId) {
|
|
233
|
+
return `[specrails:project=${projectId}:ticket=${localTicketId}]`;
|
|
234
|
+
}
|
|
223
235
|
/**
|
|
224
236
|
* Deterministic idempotency marker. Jira has no native comment idempotency, so
|
|
225
237
|
* before re-posting on retry we GET the issue comments and skip if one already
|