specrails-desktop 2.64.1 → 2.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/cli/dist/status.js +3 -0
- package/client/dist/assets/ActivityFeedPage-ByVKYII-.js +1 -0
- package/client/dist/assets/AgentBrowserCapture-BGUTjhUr.js +1 -0
- package/client/dist/assets/AgentModeAnalyticsPane-CtOLDDjB.js +2 -0
- package/client/dist/assets/AgentModeCodePane-CDhUKarT.js +2 -0
- package/client/dist/assets/AgentModeJobsPane-BAa_oEHJ.js +1 -0
- package/client/dist/assets/AgentsPage-D32hG4Ve.js +120 -0
- package/client/dist/assets/AnalyticsPage-BU50zeG6.js +5 -0
- package/client/dist/assets/BudgetCard-DP_jxwaD.js +55 -0
- package/client/dist/assets/CodePage-jiYnKGpp.js +3 -0
- package/client/dist/assets/CostValue-Bvn8674q.js +1 -0
- package/client/dist/assets/DesktopAnalyticsPage-CF__H4e3.js +1 -0
- package/client/dist/assets/DocView-RrAp70zp.js +11 -0
- package/client/dist/assets/DocsDialog-DkqHU-JF.js +1 -0
- package/client/dist/assets/DocsPage-C6X089zC.js +1 -0
- package/client/dist/assets/ExportDropdown-C5-o8y3K.js +1 -0
- package/client/dist/assets/HelpHint-Crf9_uoR.js +1 -0
- package/client/dist/assets/IntegrationsPage-aflU3KHK.js +1 -0
- package/client/dist/assets/InteractiveJobComposer-CEMMhyyJ.js +19 -0
- package/client/dist/assets/JobDetailModal-BVJ6hyRs.js +1 -0
- package/client/dist/assets/JobDetailPage-DHzBUmox.js +1 -0
- package/client/dist/assets/JobsPage-o-LAqkwC.js +1 -0
- package/client/dist/assets/LoopBuilderPage-DbSVmXBM.js +1 -0
- package/client/dist/assets/LoopPreviewModal-DbJcVyN1.js +1 -0
- package/client/dist/assets/{LoopWindowSurface-DE0v2K1p.js → LoopWindowSurface-Co1ZK26V.js} +1 -1
- package/client/dist/assets/LoopsPage-C4lgkPXB.js +2 -0
- package/client/dist/assets/MinimizedChatsContext-742ypO8n.js +1 -0
- package/client/dist/assets/PluginsPage-Acks9ges.js +2 -0
- package/client/dist/assets/RailTrack-BfLmBzBh.js +1 -0
- package/client/dist/assets/{RepositoryScopeSelector-2eSqR9WK.js → RepositoryScopeSelector-DcxbKI9w.js} +1 -1
- package/client/dist/assets/ReviewPacketPage-CAVSIOAJ.js +7 -0
- package/client/dist/assets/TemplatePreviewModal-C23SYCTm.js +1 -0
- package/client/dist/assets/TicketDetailModalContext-B-Gtm6Ob.js +23 -0
- package/client/dist/assets/Trans-C6J0cLyh.js +1 -0
- package/client/dist/assets/a11y-prefs-BqoP5goK.js +1 -0
- package/client/dist/assets/activity-BBWfoUOG.js +1 -0
- package/client/dist/assets/activity-BM_skann.js +1 -0
- package/client/dist/assets/activity-Cevl82ke.js +1 -0
- package/client/dist/assets/activity-CmACk5W5.js +1 -0
- package/client/dist/assets/activity-D9LBw3PQ.js +1 -0
- package/client/dist/assets/activity-Dspbb9lz.js +1 -0
- package/client/dist/assets/activity-FPjYIjv9.js +1 -0
- package/client/dist/assets/activity-nLCKMUKt.js +1 -0
- package/client/dist/assets/addspec-BI4jDMhA.js +1 -0
- package/client/dist/assets/addspec-BldTv7Tl.js +1 -0
- package/client/dist/assets/addspec-Cdq-2EcC.js +1 -0
- package/client/dist/assets/addspec-DH5M16BQ.js +1 -0
- package/client/dist/assets/addspec-DOFo9pD5.js +1 -0
- package/client/dist/assets/addspec-DPkwhdmL.js +1 -0
- package/client/dist/assets/addspec-Dzy12Pv3.js +1 -0
- package/client/dist/assets/addspec-skTs6EEW.js +1 -0
- package/client/dist/assets/agent-B_UEUy7Y.js +1 -0
- package/client/dist/assets/agent-BarjlhTA.js +1 -0
- package/client/dist/assets/agent-BfqIITo5.js +1 -0
- package/client/dist/assets/agent-Bt9a7Kyj.js +1 -0
- package/client/dist/assets/agent-C3689RwP.js +1 -0
- package/client/dist/assets/agent-CrmboTAi.js +1 -0
- package/client/dist/assets/agent-DcsoTnuE.js +1 -0
- package/client/dist/assets/agent-GDZoYwd4.js +1 -0
- package/client/dist/assets/{agentRuntime-es2ymSl-.js → agentRuntime-BYH70bKY.js} +1 -1
- package/client/dist/assets/agentRuntime-BijLh8I9.js +1 -0
- package/client/dist/assets/{agentRuntime-BzuwQQgn.js → agentRuntime-BvyuETPe.js} +1 -1
- package/client/dist/assets/{agentRuntime-BDvbJMmS.js → agentRuntime-C2WI6HQh.js} +1 -1
- package/client/dist/assets/{agentRuntime-BKJfv5YD.js → agentRuntime-CZPIlQsr.js} +1 -1
- package/client/dist/assets/{agentRuntime-DiCldqGG.js → agentRuntime-D2dDvCyJ.js} +1 -1
- package/client/dist/assets/agentRuntime-DWZedEbn.js +1 -0
- package/client/dist/assets/agentRuntime-DkIruUNw.js +1 -0
- package/client/dist/assets/agents-35_PDKx9.js +1 -0
- package/client/dist/assets/agents-8fZnHhEQ.js +1 -0
- package/client/dist/assets/agents-Bgimtw8z.js +1 -0
- package/client/dist/assets/agents-C4P160Us.js +1 -0
- package/client/dist/assets/agents-Clg67zbp.js +1 -0
- package/client/dist/assets/agents-DJfF4o6G.js +1 -0
- package/client/dist/assets/agents-Dc9-Y5cw.js +1 -0
- package/client/dist/assets/agents-EN1Zl4YZ.js +1 -0
- package/client/dist/assets/agentstudio-Bm4-NYaG.js +1 -0
- package/client/dist/assets/agentstudio-CD1fuj2o.js +1 -0
- package/client/dist/assets/agentstudio-CQGWFSst.js +1 -0
- package/client/dist/assets/agentstudio-CqVSb65S.js +1 -0
- package/client/dist/assets/agentstudio-DIE_HjsX.js +1 -0
- package/client/dist/assets/agentstudio-D_OmQK-k.js +1 -0
- package/client/dist/assets/agentstudio-Djz9aUfb.js +1 -0
- package/client/dist/assets/agentstudio-Qa3v9o5J.js +1 -0
- package/client/dist/assets/{aiedit-DNXxq_Dr.js → aiedit-1VzLs37W.js} +1 -1
- package/client/dist/assets/{aiedit-DCjA7jLJ.js → aiedit-BNp6GSik.js} +1 -1
- package/client/dist/assets/{aiedit-BoG24nlg.js → aiedit-BOY5xRPi.js} +1 -1
- package/client/dist/assets/{aiedit-iIjz2_Qk.js → aiedit-BrqMZvbc.js} +1 -1
- package/client/dist/assets/{aiedit-CjlSRQVP.js → aiedit-CVgtl7hm.js} +1 -1
- package/client/dist/assets/{aiedit-DQ-0_pvE.js → aiedit-CrFW9Jd2.js} +1 -1
- package/client/dist/assets/{aiedit-olnv3QSt.js → aiedit-YE2lILp7.js} +1 -1
- package/client/dist/assets/{aiedit-B0KUbpB6.js → aiedit-iA_R1AVQ.js} +1 -1
- package/client/dist/assets/analytics-3w0t-4ic.js +1 -0
- package/client/dist/assets/analytics-BRi4KQD6.js +1 -0
- package/client/dist/assets/analytics-BtjAqzke.js +1 -0
- package/client/dist/assets/analytics-COSQ1h47.js +1 -0
- package/client/dist/assets/analytics-CP2HjESk.js +1 -0
- package/client/dist/assets/analytics-DY65TC62.js +1 -0
- package/client/dist/assets/analytics-Den_vvxn.js +1 -0
- package/client/dist/assets/analytics-LmBS96O8.js +1 -0
- package/client/dist/assets/api-DOGbyfTO.js +2 -0
- package/client/dist/assets/builder-BMVvSr4v.js +1 -0
- package/client/dist/assets/builder-BN-MuLZt.js +1 -0
- package/client/dist/assets/builder-BQOZi4CF.js +1 -0
- package/client/dist/assets/builder-BjUPjsyu.js +1 -0
- package/client/dist/assets/builder-BoBtN18T.js +1 -0
- package/client/dist/assets/builder-C5g5NhxL.js +1 -0
- package/client/dist/assets/builder-RUHXw3yx.js +1 -0
- package/client/dist/assets/builder-fyS_AiyC.js +1 -0
- package/client/dist/assets/button-CHPkroew.js +1 -0
- package/client/dist/assets/chat-C9L5T7KI.js +1 -0
- package/client/dist/assets/chevron-right-CwMAj0w_.js +1 -0
- package/client/dist/assets/chevron-up-BAMuP0XD.js +1 -0
- package/client/dist/assets/chunk-OB3PAWPO-BBaq6pUk.js +3 -0
- package/client/dist/assets/code-4le5IIbf.js +1 -0
- package/client/dist/assets/code-B-jCVIbm.js +1 -0
- package/client/dist/assets/code-BRfrn5ix.js +1 -0
- package/client/dist/assets/code-CC9NCrDM.js +1 -0
- package/client/dist/assets/code-CK6pm8wY.js +1 -0
- package/client/dist/assets/code-DDiOzd6c.js +1 -0
- package/client/dist/assets/code-tGifiyf5.js +1 -0
- package/client/dist/assets/code-xkn8kQTg.js +1 -0
- package/client/dist/assets/commands-Bv1QshHR.js +1 -0
- package/client/dist/assets/commands-BvxTxboW.js +1 -0
- package/client/dist/assets/commands-C5ORR0fO.js +1 -0
- package/client/dist/assets/commands-CBKMFSTV.js +1 -0
- package/client/dist/assets/commands-CFJIRsJv.js +1 -0
- package/client/dist/assets/commands-D9o3ZcXl.js +1 -0
- package/client/dist/assets/commands-DNox0Edk.js +1 -0
- package/client/dist/assets/commands-DmIUMLdV.js +1 -0
- package/client/dist/assets/common-5H4TkaoI.js +1 -0
- package/client/dist/assets/common-9S3OdPjx.js +1 -0
- package/client/dist/assets/common-BqnwIcjs.js +1 -0
- package/client/dist/assets/common-CQP3VafS.js +1 -0
- package/client/dist/assets/common-CZnAfkB2.js +1 -0
- package/client/dist/assets/common-D5sNttV4.js +1 -0
- package/client/dist/assets/common-k_qX9nlv.js +1 -0
- package/client/dist/assets/common-s4HIi9XI.js +1 -0
- package/client/dist/assets/compass-B7guwBlY.js +1 -0
- package/client/dist/assets/confirm-dialog-ChZdHL3Q.js +1 -0
- package/client/dist/assets/copy-DOPlLymH.js +1 -0
- package/client/dist/assets/core-BozBzB6Y.js +1 -0
- package/client/dist/assets/dashboard-6zGLGcEz.js +1 -0
- package/client/dist/assets/dashboard-8Gi0FBDq.js +1 -0
- package/client/dist/assets/dashboard-B7E5YrSy.js +1 -0
- package/client/dist/assets/dashboard-BhdKV8xK.js +1 -0
- package/client/dist/assets/dashboard-Bu3zzH_s.js +1 -0
- package/client/dist/assets/dashboard-Ce_6rELA.js +1 -0
- package/client/dist/assets/dashboard-DWY-oz8P.js +1 -0
- package/client/dist/assets/dashboard-gUzlWk0o.js +1 -0
- package/client/dist/assets/date-input-Cdlr8kHz.js +1 -0
- package/client/dist/assets/dialog-C23lB2iP.js +5 -0
- package/client/dist/assets/dist-Di-oOFkX.js +1 -0
- package/client/dist/assets/dist-js-CBmS6MsJ.js +1 -0
- package/client/dist/assets/{dist-js-Rlh4FLH5.js → dist-js-DaJmKapi.js} +1 -1
- package/client/dist/assets/dropdown-menu-Bfp2CK6H.js +1 -0
- package/client/dist/assets/empty-state-D5w9OWj-.js +1 -0
- package/client/dist/assets/es2015-DfnECntk.js +41 -0
- package/client/dist/assets/esm-BKF6CE7v.js +1 -0
- package/client/dist/assets/event-BEnMLqAi.js +1 -0
- package/client/dist/assets/explore--NOz9LCN.js +1 -0
- package/client/dist/assets/explore-B2ulH6dO.js +1 -0
- package/client/dist/assets/explore-BD-QiLdg.js +1 -0
- package/client/dist/assets/explore-BOqd4_1j.js +1 -0
- package/client/dist/assets/explore-Be_Zh5zu.js +1 -0
- package/client/dist/assets/explore-CLjzPSKo.js +1 -0
- package/client/dist/assets/explore-D_-vHm29.js +1 -0
- package/client/dist/assets/explore-yEQTF6ro.js +1 -0
- package/client/dist/assets/file-text-CNXzL3wj.js +1 -0
- package/client/dist/assets/format-BODoFIw6.js +1 -0
- package/client/dist/assets/formatDistanceToNow-DLMIOS0N.js +1 -0
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-O61feXch.js +1 -0
- package/client/dist/assets/git-compare-arrows-Cu6tICCq.js +1 -0
- package/client/dist/assets/humanise-command-CB4ybLwq.js +1 -0
- package/client/dist/assets/inbox-BLZ8cm6_.js +1 -0
- package/client/dist/assets/inbox-BQ3VmNYY.js +1 -0
- package/client/dist/assets/inbox-BdcXWCuT.js +1 -0
- package/client/dist/assets/inbox-CF1PHjns.js +1 -0
- package/client/dist/assets/inbox-CFNPDhso.js +1 -0
- package/client/dist/assets/inbox-DIttK_NW.js +1 -0
- package/client/dist/assets/inbox-Dfdv1Ykl.js +1 -0
- package/client/dist/assets/inbox-JS1inmeO.js +1 -0
- package/client/dist/assets/index-4UWY7Xyz.css +2 -0
- package/client/dist/assets/index-DHzB0T26.js +120 -0
- package/client/dist/assets/integrations-BcKgzgPD.js +1 -0
- package/client/dist/assets/integrations-BmX_XyJq.js +1 -0
- package/client/dist/assets/integrations-CHpwMjlY.js +1 -0
- package/client/dist/assets/integrations-CT3kr8e-.js +1 -0
- package/client/dist/assets/integrations-C_5XAkgz.js +1 -0
- package/client/dist/assets/integrations-Ct9zLX7N.js +1 -0
- package/client/dist/assets/integrations-DEYemxUv.js +1 -0
- package/client/dist/assets/integrations-DWvsB_WB.js +1 -0
- package/client/dist/assets/{jira-Cq6yvN4q.js → jira-B_ERkFRv.js} +1 -1
- package/client/dist/assets/jira-Bn-A5lwD.js +1 -0
- package/client/dist/assets/jira-C71Ybnhp.js +1 -0
- package/client/dist/assets/jira-CkwjeJz6.js +1 -0
- package/client/dist/assets/jira-D9pSLXjI.js +1 -0
- package/client/dist/assets/jira-DBRS_lcp.js +1 -0
- package/client/dist/assets/jira-DHS6CsKh.js +1 -0
- package/client/dist/assets/jira-MInHRUb1.js +1 -0
- package/client/dist/assets/jira-api-DHme7Upx.js +1 -0
- package/client/dist/assets/jobs-BMLTDo63.js +1 -0
- package/client/dist/assets/jobs-BO8q4Mi1.js +1 -0
- package/client/dist/assets/jobs-Ck8uOWMM.js +1 -0
- package/client/dist/assets/jobs-CyFfPCpg.js +1 -0
- package/client/dist/assets/jobs-DT5s4fZ6.js +1 -0
- package/client/dist/assets/jobs-DZAgVPcD.js +1 -0
- package/client/dist/assets/jobs-b5gPYaKr.js +1 -0
- package/client/dist/assets/jobs-xsZK1440.js +1 -0
- package/client/dist/assets/launch-forecast-BTa-p3RP.js +1 -0
- package/client/dist/assets/{loop-layout-DtxX27Jz.css → loop-layout-DLioOiRN.css} +1 -1
- package/client/dist/assets/loop-layout-Sl9cfTvs.js +7 -0
- package/client/dist/assets/loops-BEEOVJDR.js +1 -0
- package/client/dist/assets/loops-BcrQ2vk7.js +1 -0
- package/client/dist/assets/loops-BjWxzJIZ.js +1 -0
- package/client/dist/assets/loops-BogV595N.js +1 -0
- package/client/dist/assets/loops-CU0BLZiz.js +1 -0
- package/client/dist/assets/loops-CrNBgi1G.js +1 -0
- package/client/dist/assets/loops-CwalwS_i.js +1 -0
- package/client/dist/assets/loops-_TDVN-fX.js +1 -0
- package/client/dist/assets/mcp-BNs8gxoL.js +1 -0
- package/client/dist/assets/mcp-BvRh_xO5.js +1 -0
- package/client/dist/assets/mcp-C2F1pghi.js +1 -0
- package/client/dist/assets/mcp-D9RLKAs2.js +1 -0
- package/client/dist/assets/mcp-DAghcsR0.js +1 -0
- package/client/dist/assets/mcp-DWWAPi1G.js +1 -0
- package/client/dist/assets/mcp-DbGSFC3f.js +1 -0
- package/client/dist/assets/mcp-FelCicrv.js +1 -0
- package/client/dist/assets/narration-C3NBkAR4.js +1 -0
- package/client/dist/assets/narration-CkoJq-Lf.js +1 -0
- package/client/dist/assets/narration-Cr0NeW9K.js +1 -0
- package/client/dist/assets/narration-DJUXOs-W.js +1 -0
- package/client/dist/assets/narration-DgL8TMvN.js +1 -0
- package/client/dist/assets/narration-DjBafgv0.js +1 -0
- package/client/dist/assets/narration-Dle6Iv0c.js +1 -0
- package/client/dist/assets/narration-MYlfktga.js +1 -0
- package/client/dist/assets/nav-BSQ8KW1c.js +1 -0
- package/client/dist/assets/nav-BauVof8Z.js +1 -0
- package/client/dist/assets/nav-BfOAH1se.js +1 -0
- package/client/dist/assets/nav-D3bOsipX.js +1 -0
- package/client/dist/assets/nav-DOMMhlLx.js +1 -0
- package/client/dist/assets/nav-DPzVlgZU.js +1 -0
- package/client/dist/assets/nav-DZJbFbah.js +1 -0
- package/client/dist/assets/nav-D_5aojd2.js +1 -0
- package/client/dist/assets/notify-error-BsWANx1T.js +1 -0
- package/client/dist/assets/onboarding-BdZQnNm3.js +1 -0
- package/client/dist/assets/onboarding-CJQEv1vp.js +1 -0
- package/client/dist/assets/onboarding-CWJGYUW3.js +1 -0
- package/client/dist/assets/onboarding-ChfYN7dA.js +1 -0
- package/client/dist/assets/onboarding-CjvDUR3V.js +1 -0
- package/client/dist/assets/onboarding-I6vS-zTB.js +1 -0
- package/client/dist/assets/onboarding-dgC_9dTB.js +1 -0
- package/client/dist/assets/onboarding-mlXSyKzX.js +1 -0
- package/client/dist/assets/origin-03nTuaOb.js +1 -0
- package/client/dist/assets/packet-BjpyRnZr.js +1 -0
- package/client/dist/assets/packet-BwgG5mBt.js +1 -0
- package/client/dist/assets/packet-C3eAUFkV.js +1 -0
- package/client/dist/assets/packet-C8wZuSld.js +1 -0
- package/client/dist/assets/packet-CNXEy_85.js +1 -0
- package/client/dist/assets/packet-DsV5Aa_8.js +1 -0
- package/client/dist/assets/packet-aasskOE7.js +1 -0
- package/client/dist/assets/packet-phxCc2gJ.js +1 -0
- package/client/dist/assets/page-header-BStSHkP8.js +1 -0
- package/client/dist/assets/project-repositories-DJPeAVBK.js +1 -0
- package/client/dist/assets/{provider-capabilities-lePfeT_Y.js → provider-capabilities-DtwcTme4.js} +1 -1
- package/client/dist/assets/recovery-BPDOsC92.js +1 -0
- package/client/dist/assets/recovery-BluNHoXM.js +1 -0
- package/client/dist/assets/recovery-CRvEmB0C.js +1 -0
- package/client/dist/assets/recovery-CeIoRnkR.js +1 -0
- package/client/dist/assets/recovery-DHCo8KGi.js +1 -0
- package/client/dist/assets/recovery-OxAIpbBF.js +1 -0
- package/client/dist/assets/recovery-XXexYGOJ.js +1 -0
- package/client/dist/assets/recovery-pITlc--v.js +1 -0
- package/client/dist/assets/refresh-cw-DfyTkbsf.js +1 -0
- package/client/dist/assets/select-xA3pSmqE.js +1 -0
- package/client/dist/assets/settings--yzDbX9r.js +1 -0
- package/client/dist/assets/settings-5_heTv8s.js +1 -0
- package/client/dist/assets/settings-BSf27MDg.js +1 -0
- package/client/dist/assets/settings-BSj6FakR.js +1 -0
- package/client/dist/assets/settings-BZDo_8Nn.js +1 -0
- package/client/dist/assets/settings-BdWgmNc0.js +1 -0
- package/client/dist/assets/settings-DRouxKqb.js +1 -0
- package/client/dist/assets/settings-DnWFoY-F.js +1 -0
- package/client/dist/assets/setup-BJWy62ri.js +1 -0
- package/client/dist/assets/setup-BgKOIuzc.js +1 -0
- package/client/dist/assets/setup-BvVIyUlz.js +1 -0
- package/client/dist/assets/setup-BxCk2pe1.js +1 -0
- package/client/dist/assets/setup-C-xQTL7R.js +1 -0
- package/client/dist/assets/setup-CbaVoiwV.js +1 -0
- package/client/dist/assets/setup-DxTBkX3P.js +1 -0
- package/client/dist/assets/setup-oGoVAzOD.js +1 -0
- package/client/dist/assets/specs-7tAb4IKr.js +1 -0
- package/client/dist/assets/specs-BUcY4s5v.js +1 -0
- package/client/dist/assets/specs-Bk5LeBAA.js +1 -0
- package/client/dist/assets/specs-CAA4Lrlg.js +1 -0
- package/client/dist/assets/specs-CS091AnA.js +1 -0
- package/client/dist/assets/specs-DJ6gmFcK.js +1 -0
- package/client/dist/assets/specs-GfCcrBSC.js +1 -0
- package/client/dist/assets/specs-xQgyc7WL.js +1 -0
- package/client/dist/assets/spending-CVH8VREb.js +1 -0
- package/client/dist/assets/square-Co6h5vZg.js +1 -0
- package/client/dist/assets/tauri-shell-43ixPGfa.js +2 -0
- package/client/dist/assets/terminal-0v9sBylD.js +1 -0
- package/client/dist/assets/terminal-AbUAmCxE.js +1 -0
- package/client/dist/assets/terminal-BJayIbIP.js +1 -0
- package/client/dist/assets/terminal-C2RUlXyi.js +1 -0
- package/client/dist/assets/terminal-CMmSb_Nj.js +1 -0
- package/client/dist/assets/terminal-DKWjj7HJ.js +1 -0
- package/client/dist/assets/terminal-KlFu7_pV.js +1 -0
- package/client/dist/assets/terminal-i99yqFvm.js +1 -0
- package/client/dist/assets/tickets-846Oq3i3.js +1 -0
- package/client/dist/assets/tickets-B5LJTe_b.js +1 -0
- package/client/dist/assets/tickets-Bfo2GGmH.js +1 -0
- package/client/dist/assets/tickets-BhdZ1yY2.js +1 -0
- package/client/dist/assets/tickets-CgjWJHAW.js +1 -0
- package/client/dist/assets/tickets-Ct9DbDUR.js +1 -0
- package/client/dist/assets/tickets-rptLEJB1.js +1 -0
- package/client/dist/assets/tickets-xQ6DpYdu.js +1 -0
- package/client/dist/assets/trending-up-BGvb4zZt.js +1 -0
- package/client/dist/assets/undo-6zuS4-sL.js +1 -0
- package/client/dist/assets/undo-BeM4gDOP.js +1 -0
- package/client/dist/assets/undo-BeppX8xS.js +1 -0
- package/client/dist/assets/undo-BqvNZ5MG.js +1 -0
- package/client/dist/assets/undo-BzwEPf_k.js +1 -0
- package/client/dist/assets/undo-CJ9Cu1NN.js +1 -0
- package/client/dist/assets/undo-ds8nMFbX.js +1 -0
- package/client/dist/assets/undo-x_gA-knG.js +1 -0
- package/client/dist/assets/useDesktop-BuOp2-MR.js +1 -0
- package/client/dist/assets/useRuntimeRuns-BRS6ncnO.js +1 -0
- package/client/dist/assets/utils-ELimjS2Y.js +1 -0
- package/client/dist/assets/wrench-Br2n1Lxd.js +1 -0
- package/client/dist/index.html +75 -60
- package/docs/ci-cd.md +29 -1
- package/docs/cli.md +10 -31
- package/docs/codex.md +1 -1
- package/docs/creating-specs.md +15 -12
- package/docs/customizing.md +16 -13
- package/docs/getting-started.md +12 -11
- package/docs/guide/de/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/de/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/de/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/de/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/de/getting-started/6-universal-search.md +34 -0
- package/docs/guide/de/insights/1-analytics-and-cost-tracking.md +20 -6
- package/docs/guide/de/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/de/insights/3-code-explorer.md +1 -1
- package/docs/guide/de/integrations/1-ai-providers.md +1 -1
- package/docs/guide/de/integrations/2-plugins.md +1 -1
- package/docs/guide/de/integrations/3-jira-integration.md +3 -3
- package/docs/guide/de/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/de/integrations/5-mcp-server.md +1 -1
- package/docs/guide/de/integrations/6-agent-chat.md +12 -5
- package/docs/guide/de/integrations/8-flow-mode.md +69 -0
- package/docs/guide/de/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/de/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/de/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/de/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/de/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/de/settings/1-themes.md +1 -1
- package/docs/guide/de/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/de/settings/5-project-environment.md +1 -1
- package/docs/guide/de/settings/6-updates.md +24 -0
- package/docs/guide/de/settings/7-existing-projects.md +33 -0
- package/docs/guide/de/settings/8-accessibility.md +23 -0
- package/docs/guide/de/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/de/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/de/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/en/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/en/getting-started/1-what-is-specrails.md +1 -1
- package/docs/guide/en/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/en/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/en/getting-started/5-the-dashboard-tour.md +52 -0
- package/docs/guide/en/getting-started/6-universal-search.md +34 -0
- package/docs/guide/en/insights/1-analytics-and-cost-tracking.md +24 -10
- package/docs/guide/en/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/en/insights/3-code-explorer.md +5 -5
- package/docs/guide/en/integrations/1-ai-providers.md +1 -1
- package/docs/guide/en/integrations/2-plugins.md +1 -1
- package/docs/guide/en/integrations/3-jira-integration.md +4 -4
- package/docs/guide/en/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/en/integrations/5-mcp-server.md +4 -4
- package/docs/guide/en/integrations/6-agent-chat.md +12 -5
- package/docs/guide/en/integrations/8-flow-mode.md +69 -0
- package/docs/guide/en/pipeline/1-rails-and-jobs.md +22 -3
- package/docs/guide/en/pipeline/2-the-job-detail-view.md +19 -7
- package/docs/guide/en/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/en/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/en/pipeline/5-the-loop-builder.md +2 -2
- package/docs/guide/en/settings/1-themes.md +1 -1
- package/docs/guide/en/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/en/settings/5-project-environment.md +1 -1
- package/docs/guide/en/settings/6-updates.md +24 -0
- package/docs/guide/en/settings/7-existing-projects.md +33 -0
- package/docs/guide/en/settings/8-accessibility.md +23 -0
- package/docs/guide/en/specs/1-specs-and-the-backlog.md +42 -6
- package/docs/guide/en/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/en/specs/3-add-spec-explore-mode.md +2 -2
- package/docs/guide/es/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/es/agents/2-profiles-and-the-balanced-default.md +1 -1
- package/docs/guide/es/agents/3-customizing-models-per-agent.md +2 -2
- package/docs/guide/es/agents/4-custom-agents-catalog.md +1 -1
- package/docs/guide/es/getting-started/1-what-is-specrails.md +3 -3
- package/docs/guide/es/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/es/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/es/getting-started/5-the-dashboard-tour.md +52 -0
- package/docs/guide/es/getting-started/6-universal-search.md +34 -0
- package/docs/guide/es/insights/1-analytics-and-cost-tracking.md +26 -12
- package/docs/guide/es/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/es/insights/3-code-explorer.md +5 -5
- package/docs/guide/es/integrations/1-ai-providers.md +1 -1
- package/docs/guide/es/integrations/2-plugins.md +1 -1
- package/docs/guide/es/integrations/3-jira-integration.md +4 -4
- package/docs/guide/es/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/es/integrations/5-mcp-server.md +4 -4
- package/docs/guide/es/integrations/6-agent-chat.md +14 -7
- package/docs/guide/es/integrations/7-local-engines.md +1 -1
- package/docs/guide/es/integrations/8-flow-mode.md +69 -0
- package/docs/guide/es/pipeline/1-rails-and-jobs.md +33 -13
- package/docs/guide/es/pipeline/2-the-job-detail-view.md +38 -26
- package/docs/guide/es/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/es/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/es/pipeline/5-the-loop-builder.md +4 -4
- package/docs/guide/es/settings/1-themes.md +1 -1
- package/docs/guide/es/settings/3-pipeline-telemetry-and-diagnostics.md +10 -10
- package/docs/guide/es/settings/5-project-environment.md +1 -1
- package/docs/guide/es/settings/6-updates.md +24 -0
- package/docs/guide/es/settings/7-existing-projects.md +33 -0
- package/docs/guide/es/settings/8-accessibility.md +23 -0
- package/docs/guide/es/specs/1-specs-and-the-backlog.md +43 -7
- package/docs/guide/es/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/es/specs/3-add-spec-explore-mode.md +3 -3
- package/docs/guide/fr/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/fr/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/fr/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/fr/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/fr/getting-started/6-universal-search.md +34 -0
- package/docs/guide/fr/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/fr/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/fr/insights/3-code-explorer.md +1 -1
- package/docs/guide/fr/integrations/1-ai-providers.md +1 -1
- package/docs/guide/fr/integrations/2-plugins.md +1 -1
- package/docs/guide/fr/integrations/3-jira-integration.md +3 -3
- package/docs/guide/fr/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/fr/integrations/5-mcp-server.md +1 -1
- package/docs/guide/fr/integrations/6-agent-chat.md +11 -4
- package/docs/guide/fr/integrations/8-flow-mode.md +69 -0
- package/docs/guide/fr/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/fr/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/fr/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/fr/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/fr/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/fr/settings/1-themes.md +1 -1
- package/docs/guide/fr/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/fr/settings/5-project-environment.md +1 -1
- package/docs/guide/fr/settings/6-updates.md +24 -0
- package/docs/guide/fr/settings/7-existing-projects.md +33 -0
- package/docs/guide/fr/settings/8-accessibility.md +23 -0
- package/docs/guide/fr/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/fr/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/fr/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/it/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/it/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/it/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/it/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/it/getting-started/6-universal-search.md +34 -0
- package/docs/guide/it/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/it/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/it/insights/3-code-explorer.md +1 -1
- package/docs/guide/it/integrations/1-ai-providers.md +1 -1
- package/docs/guide/it/integrations/2-plugins.md +1 -1
- package/docs/guide/it/integrations/3-jira-integration.md +3 -3
- package/docs/guide/it/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/it/integrations/5-mcp-server.md +1 -1
- package/docs/guide/it/integrations/6-agent-chat.md +11 -4
- package/docs/guide/it/integrations/8-flow-mode.md +69 -0
- package/docs/guide/it/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/it/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/it/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/it/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/it/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/it/settings/1-themes.md +1 -1
- package/docs/guide/it/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/it/settings/5-project-environment.md +1 -1
- package/docs/guide/it/settings/6-updates.md +24 -0
- package/docs/guide/it/settings/7-existing-projects.md +33 -0
- package/docs/guide/it/settings/8-accessibility.md +23 -0
- package/docs/guide/it/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/it/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/it/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/ja/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/ja/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/ja/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/ja/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/ja/getting-started/6-universal-search.md +34 -0
- package/docs/guide/ja/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/ja/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/ja/insights/3-code-explorer.md +1 -1
- package/docs/guide/ja/integrations/1-ai-providers.md +1 -1
- package/docs/guide/ja/integrations/2-plugins.md +1 -1
- package/docs/guide/ja/integrations/3-jira-integration.md +3 -3
- package/docs/guide/ja/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/ja/integrations/5-mcp-server.md +1 -1
- package/docs/guide/ja/integrations/6-agent-chat.md +11 -4
- package/docs/guide/ja/integrations/8-flow-mode.md +69 -0
- package/docs/guide/ja/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/ja/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/ja/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/ja/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/ja/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/ja/settings/1-themes.md +1 -1
- package/docs/guide/ja/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/ja/settings/5-project-environment.md +1 -1
- package/docs/guide/ja/settings/6-updates.md +24 -0
- package/docs/guide/ja/settings/7-existing-projects.md +33 -0
- package/docs/guide/ja/settings/8-accessibility.md +23 -0
- package/docs/guide/ja/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/ja/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/ja/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/pt/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/pt/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/pt/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/pt/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/pt/getting-started/6-universal-search.md +34 -0
- package/docs/guide/pt/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/pt/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/pt/insights/3-code-explorer.md +1 -1
- package/docs/guide/pt/integrations/1-ai-providers.md +1 -1
- package/docs/guide/pt/integrations/2-plugins.md +1 -1
- package/docs/guide/pt/integrations/3-jira-integration.md +3 -3
- package/docs/guide/pt/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/pt/integrations/5-mcp-server.md +1 -1
- package/docs/guide/pt/integrations/6-agent-chat.md +12 -5
- package/docs/guide/pt/integrations/8-flow-mode.md +69 -0
- package/docs/guide/pt/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/pt/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/pt/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/pt/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/pt/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/pt/settings/1-themes.md +1 -1
- package/docs/guide/pt/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/pt/settings/5-project-environment.md +1 -1
- package/docs/guide/pt/settings/6-updates.md +24 -0
- package/docs/guide/pt/settings/7-existing-projects.md +33 -0
- package/docs/guide/pt/settings/8-accessibility.md +23 -0
- package/docs/guide/pt/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/pt/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/pt/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/zh/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/zh/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/zh/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/zh/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/zh/getting-started/6-universal-search.md +34 -0
- package/docs/guide/zh/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/zh/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/zh/insights/3-code-explorer.md +1 -1
- package/docs/guide/zh/integrations/1-ai-providers.md +1 -1
- package/docs/guide/zh/integrations/2-plugins.md +1 -1
- package/docs/guide/zh/integrations/3-jira-integration.md +3 -3
- package/docs/guide/zh/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/zh/integrations/5-mcp-server.md +1 -1
- package/docs/guide/zh/integrations/6-agent-chat.md +11 -4
- package/docs/guide/zh/integrations/8-flow-mode.md +69 -0
- package/docs/guide/zh/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/zh/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/zh/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/zh/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/zh/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/zh/settings/1-themes.md +1 -1
- package/docs/guide/zh/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/zh/settings/5-project-environment.md +1 -1
- package/docs/guide/zh/settings/6-updates.md +24 -0
- package/docs/guide/zh/settings/7-existing-projects.md +33 -0
- package/docs/guide/zh/settings/8-accessibility.md +23 -0
- package/docs/guide/zh/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/zh/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/zh/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/internals/README.md +8 -0
- package/docs/internals/adding-a-provider.md +19 -2
- package/docs/internals/agent-actions-audit.md +101 -0
- package/docs/internals/agent-sessions.md +36 -1
- package/docs/internals/api-reference.md +190 -45
- package/docs/internals/architecture.md +53 -47
- package/docs/internals/companion-inbox-decisions.md +42 -0
- package/docs/internals/companion-rails-as-loops-contract.md +17 -6
- package/docs/internals/configuration.md +140 -9
- package/docs/internals/core-runtime-updates.md +4 -4
- package/docs/internals/existing-project-anchoring.md +168 -0
- package/docs/internals/flow-mode.md +668 -0
- package/docs/internals/legacy-implementation-notes.md +13 -0
- package/docs/internals/local-testing-feedback-2026-10.md +210 -0
- package/docs/internals/mcp-mission-audit.md +4 -0
- package/docs/internals/mission-rail-cards.md +10 -5
- package/docs/internals/mission-read-only-policy.md +152 -0
- package/docs/internals/modal-standard.md +181 -0
- package/docs/internals/openspec-workflow.md +32 -0
- package/docs/internals/operations-runbook.md +30 -0
- package/docs/internals/profiles.md +6 -3
- package/docs/internals/programmatic-agent-runtime.md +8 -0
- package/docs/internals/project-builder.md +1 -1
- package/docs/internals/review-packet.md +161 -9
- package/docs/internals/safe-pr-review-flow.md +135 -6
- package/docs/internals/source-map.md +413 -18
- package/docs/internals/spec-addenda.md +10 -0
- package/docs/internals/spec-triage.md +140 -0
- package/docs/internals/visual-design-audit.md +15 -2
- package/docs/local-providers.md +3 -0
- package/docs/mcp.md +21 -3
- package/docs/platforms/macos.md +1 -1
- package/docs/platforms/windows.md +2 -2
- package/docs/running-pipelines.md +22 -6
- package/docs/tracking-cost.md +54 -10
- package/local-runner/dist/specrails-local-runner.js +3851 -1178
- package/mcp-bridge/dist/specrails-mcp.js +3864 -1143
- package/package.json +10 -9
- package/server/dist/agent-mcp-config.js +37 -1
- package/server/dist/api-version.js +19 -0
- package/server/dist/command-resolver.js +4 -2
- package/server/dist/core-compat.js +1 -1
- package/server/dist/core-execution.js +2 -1
- package/server/dist/core-update-manager.js +71 -13
- package/server/dist/db/job-search.js +248 -0
- package/server/dist/db/jobs.js +6 -0
- package/server/dist/db/migrations.js +239 -0
- package/server/dist/db.js +9 -2
- package/server/dist/desktop-db.js +99 -5
- package/server/dist/desktop-router.js +126 -13
- package/server/dist/docs-router.js +67 -1
- package/server/dist/feature-flags.js +22 -0
- package/server/dist/index.js +30 -15
- package/server/dist/jira/jira-adf.js +13 -1
- package/server/dist/jira/jira-clarifications.js +146 -0
- package/server/dist/jira/jira-client.js +8 -1
- package/server/dist/jira/jira-db.js +41 -0
- package/server/dist/jira/jira-sync-manager.js +328 -25
- package/server/dist/mcp/guide.js +17 -7
- package/server/dist/mcp/tools/agents.js +1 -1
- package/server/dist/mcp/tools/analytics.js +15 -3
- package/server/dist/mcp/tools/app-settings.js +14 -1
- package/server/dist/mcp/tools/chat.js +1 -1
- package/server/dist/mcp/tools/env.js +4 -2
- package/server/dist/mcp/tools/jobs.js +96 -7
- package/server/dist/mcp/tools/loops.js +1 -1
- package/server/dist/mcp/tools/meta.js +10 -13
- package/server/dist/mcp/tools/rails.js +15 -1
- package/server/dist/mcp/tools/setup.js +1 -1
- package/server/dist/mcp/tools/specs.js +8 -5
- package/server/dist/mcp/tools/support.js +6 -3
- package/server/dist/mcp/tools/types.js +38 -1
- package/server/dist/mobile/mobile-admin-router.js +0 -16
- package/server/dist/mobile/mobile-gateway.js +0 -18
- package/server/dist/mobile/mobile-inbox.js +240 -0
- package/server/dist/mobile/mobile-missions.js +6 -8
- package/server/dist/mobile/mobile-router.js +9 -9
- package/server/dist/mobile/mobile-webrtc-peer.js +4 -54
- package/server/dist/mobile/mobile-ws.js +27 -4
- package/server/dist/modules/accounting/runtime/ai-invocations.js +4 -0
- package/server/dist/modules/accounting/runtime/decision-times.js +102 -0
- package/server/dist/modules/accounting/runtime/loop-economics.js +284 -0
- package/server/dist/modules/accounting/runtime/spending.js +7 -2
- package/server/dist/modules/accounting/runtime/what-if.js +87 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-bridge.js +86 -5
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-controls.js +28 -2
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-metrics.js +15 -2
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-settings-router.js +21 -2
- package/server/dist/modules/agent-runtime/runtime/core-capabilities.js +55 -0
- package/server/dist/modules/agent-sessions/adapters/host-process.js +1 -1
- package/server/dist/modules/agent-sessions/domain/availability.js +16 -0
- package/server/dist/modules/agent-sessions/domain/protocol.js +8 -1
- package/server/dist/modules/agent-sessions/index.js +3 -1
- package/server/dist/modules/agent-sessions/runtime/core-sessions-availability.js +16 -0
- package/server/dist/modules/agents/runtime/agent-refine-manager.js +3 -1
- package/server/dist/modules/agents/runtime/agent-store.js +60 -73
- package/server/dist/modules/audit/adapters/http.js +66 -0
- package/server/dist/modules/audit/adapters/runtime.js +60 -0
- package/server/dist/modules/audit/adapters/sqlite.js +73 -0
- package/server/dist/modules/audit/application.js +190 -0
- package/server/dist/modules/audit/domain.js +434 -0
- package/server/dist/modules/audit/index.js +27 -0
- package/server/dist/modules/audit/ports.js +2 -0
- package/server/dist/modules/browser/runtime/browser-capture-manager.js +18 -141
- package/server/dist/modules/browser/runtime/browser-capture-types.js +1 -10
- package/server/dist/modules/browser/runtime/browser-playwright.js +0 -19
- package/server/dist/modules/code/runtime/file-provenance.js +23 -0
- package/server/dist/modules/conversations/runtime/chat-manager.js +5 -2
- package/server/dist/modules/delivery/adapters/decisions/chains.js +1 -0
- package/server/dist/modules/delivery/adapters/decisions/create.js +19 -1
- package/server/dist/modules/delivery/adapters/decisions/discard.js +2 -0
- package/server/dist/modules/delivery/adapters/decisions/local-changes.js +427 -0
- package/server/dist/modules/delivery/adapters/decisions/merge-local.js +80 -6
- package/server/dist/modules/delivery/adapters/decisions/observations.js +5 -0
- package/server/dist/modules/delivery/adapters/decisions/ownership.js +2 -1
- package/server/dist/modules/delivery/adapters/decisions/transitions.js +9 -0
- package/server/dist/modules/delivery/adapters/review-wip-store.js +37 -0
- package/server/dist/modules/delivery/domain/review-wip.js +71 -0
- package/server/dist/modules/delivery/index.js +9 -1
- package/server/dist/modules/delivery/runtime/delivery-changes.js +355 -0
- package/server/dist/modules/delivery/runtime/delivery-evidence.js +249 -8
- package/server/dist/modules/delivery/runtime/flow-review-legacy.js +99 -0
- package/server/dist/modules/delivery/runtime/flow-review-outcome.js +107 -0
- package/server/dist/modules/delivery/runtime/flow-worktree-handoff.js +32 -0
- package/server/dist/modules/delivery/runtime/flow-worktree-return.js +87 -0
- package/server/dist/modules/delivery/runtime/isolated-worktree.js +380 -0
- package/server/dist/modules/delivery/runtime/local-restore-branch.js +325 -0
- package/server/dist/modules/delivery/runtime/local-restore-resolver.js +48 -0
- package/server/dist/modules/delivery/runtime/local-stash.js +423 -0
- package/server/dist/modules/delivery/runtime/multi-repo-execution.js +27 -1
- package/server/dist/modules/delivery/runtime/phase3-harvest.js +40 -0
- package/server/dist/modules/delivery/runtime/pr-body.js +50 -0
- package/server/dist/modules/delivery/runtime/rail-isolated-launch.js +169 -166
- package/server/dist/modules/delivery/runtime/rail-launch-parser.js +5 -2
- package/server/dist/modules/delivery/runtime/rail-pr-decision.js +7 -1
- package/server/dist/modules/delivery/runtime/rail-pr-store.js +193 -12
- package/server/dist/modules/delivery/runtime/rails-router.js +267 -5
- package/server/dist/modules/delivery/runtime/review-brief.js +208 -0
- package/server/dist/modules/delivery/runtime/review-packet.js +41 -2
- package/server/dist/modules/delivery/runtime/review-wip-gate.js +67 -0
- package/server/dist/modules/delivery/runtime/run-records.js +267 -0
- package/server/dist/modules/delivery/runtime/run-review-diagnosis.js +102 -0
- package/server/dist/modules/execution/adapters/budget-storage.js +76 -0
- package/server/dist/modules/execution/application/enforce-budget.js +17 -2
- package/server/dist/modules/execution/domain/agent-env.js +98 -0
- package/server/dist/modules/execution/domain/daily-budget.js +36 -0
- package/server/dist/modules/execution/domain/spend-caps.js +166 -0
- package/server/dist/modules/execution/index.js +34 -1
- package/server/dist/modules/execution/runtime/budget-overview.js +76 -0
- package/server/dist/modules/execution/runtime/daily-budget-gate.js +86 -0
- package/server/dist/modules/execution/runtime/interactive-job-session.js +8 -0
- package/server/dist/modules/execution/runtime/launch-forecast.js +33 -0
- package/server/dist/modules/execution/runtime/queue-manager.js +54 -15
- package/server/dist/modules/execution/runtime/run-duration-stats.js +31 -13
- package/server/dist/modules/flow/adapters/bindings.js +1089 -0
- package/server/dist/modules/flow/adapters/http.js +147 -0
- package/server/dist/modules/flow/adapters/sqlite.js +121 -0
- package/server/dist/modules/flow/application.js +805 -0
- package/server/dist/modules/flow/domain.js +790 -0
- package/server/dist/modules/flow/index.js +34 -0
- package/server/dist/modules/flow/ports.js +2 -0
- package/server/dist/modules/inbox/adapters/http.js +21 -0
- package/server/dist/modules/inbox/adapters/project-source.js +233 -0
- package/server/dist/modules/inbox/application.js +28 -0
- package/server/dist/modules/inbox/domain.js +43 -0
- package/server/dist/modules/inbox/index.js +10 -0
- package/server/dist/modules/inbox/ports.js +2 -0
- package/server/dist/modules/loops/runtime/loop-definition-run.js +9 -0
- package/server/dist/modules/loops/runtime/loop-definition.js +5 -2
- package/server/dist/modules/loops/runtime/loop-executors.js +90 -9
- package/server/dist/modules/loops/runtime/loop-factory.js +30 -2
- package/server/dist/modules/loops/runtime/loop-flow-spec-recipe.js +166 -0
- package/server/dist/modules/loops/runtime/loop-graph.js +1 -1
- package/server/dist/modules/loops/runtime/loop-role-engines.js +4 -1
- package/server/dist/modules/loops/runtime/loop-run-manager.js +267 -10
- package/server/dist/modules/loops/runtime/loop-runs-store.js +21 -5
- package/server/dist/modules/loops/runtime/loop-templates.js +55 -12
- package/server/dist/modules/missions/runtime/agent-chat-manager.js +283 -20
- package/server/dist/modules/missions/runtime/agent-chat-router.js +96 -21
- package/server/dist/modules/missions/runtime/agent-failure-briefing.js +11 -3
- package/server/dist/modules/missions/runtime/agent-fence-promotion.js +9 -1
- package/server/dist/modules/missions/runtime/agent-flow-prompt.js +64 -0
- package/server/dist/modules/missions/runtime/agent-input-store.js +9 -4
- package/server/dist/modules/missions/runtime/agent-operator-prompt.js +100 -14
- package/server/dist/modules/missions/runtime/agent-session-store.js +88 -27
- package/server/dist/modules/missions/runtime/core-session-runner.js +89 -9
- package/server/dist/modules/missions/runtime/flow-turn-context.js +17 -0
- package/server/dist/modules/missions/runtime/mission-core-sessions.js +295 -55
- package/server/dist/modules/missions/runtime/mission-run-notify.js +2 -0
- package/server/dist/modules/missions/runtime/mission-session-projector.js +56 -19
- package/server/dist/modules/missions/runtime/mission-tool-policy.js +47 -0
- package/server/dist/modules/onboarding/adapters/http.js +78 -0
- package/server/dist/modules/onboarding/adapters/providers.js +41 -0
- package/server/dist/modules/onboarding/adapters/runtime.js +130 -0
- package/server/dist/modules/onboarding/application.js +133 -0
- package/server/dist/modules/onboarding/catalog.js +217 -0
- package/server/dist/modules/onboarding/domain.js +102 -0
- package/server/dist/modules/onboarding/index.js +20 -0
- package/server/dist/modules/onboarding/ports.js +2 -0
- package/server/dist/modules/project-rules/adapters/http.js +91 -0
- package/server/dist/modules/project-rules/domain.js +122 -0
- package/server/dist/modules/project-rules/runtime/rules-inventory-runs.js +97 -0
- package/server/dist/modules/project-rules/runtime/rules-store.js +109 -0
- package/server/dist/modules/project-settings/adapters/http.js +13 -0
- package/server/dist/modules/project-settings/adapters/sqlite.js +78 -8
- package/server/dist/modules/project-settings/domain.js +47 -1
- package/server/dist/modules/project-settings/index.js +7 -1
- package/server/dist/modules/recovery/adapters/sqlite.js +28 -0
- package/server/dist/modules/recovery/domain.js +162 -0
- package/server/dist/modules/recovery/index.js +16 -0
- package/server/dist/modules/specs/adapters/timeline-http.js +101 -0
- package/server/dist/modules/specs/domain/handoff-labels.js +371 -0
- package/server/dist/modules/specs/domain/handoff.js +260 -0
- package/server/dist/modules/specs/domain/non-goals.js +101 -0
- package/server/dist/modules/specs/domain/timeline.js +164 -0
- package/server/dist/modules/specs/domain/triage.js +320 -0
- package/server/dist/modules/specs/runtime/contract-refine-runner.js +3 -2
- package/server/dist/modules/specs/runtime/generated-spec-parser.js +75 -0
- package/server/dist/modules/specs/runtime/proposal-manager.js +4 -3
- package/server/dist/modules/specs/runtime/smash-runner.js +2 -1
- package/server/dist/modules/specs/runtime/spec-addenda.js +31 -0
- package/server/dist/modules/specs/runtime/spec-draft-parser.js +6 -1
- package/server/dist/modules/specs/runtime/spec-generation.js +431 -0
- package/server/dist/modules/specs/runtime/spec-handoff.js +103 -0
- package/server/dist/modules/specs/runtime/spec-history.js +376 -0
- package/server/dist/modules/specs/runtime/spec-launcher-manager.js +4 -3
- package/server/dist/modules/specs/runtime/spec-search.js +117 -0
- package/server/dist/modules/specs/runtime/ticket-store.js +47 -2
- package/server/dist/modules/specs/runtime/ticket-trash-service.js +62 -0
- package/server/dist/modules/specs/runtime/ticket-trash.js +193 -0
- package/server/dist/modules/specs/runtime/triage-runner.js +171 -0
- package/server/dist/modules/specs/runtime/triage.js +365 -0
- package/server/dist/modules/terminals/domain/app-urls.js +96 -0
- package/server/dist/modules/terminals/runtime/app-urls.js +77 -0
- package/server/dist/modules/terminals/runtime/background-process-service.js +25 -28
- package/server/dist/openspec-shim.js +1 -1
- package/server/dist/project-env.js +60 -0
- package/server/dist/project-git.js +65 -0
- package/server/dist/project-registry.js +264 -27
- package/server/dist/project-router-background-processes.js +27 -3
- package/server/dist/project-router-git.js +30 -0
- package/server/dist/project-router-helpers.js +5 -30
- package/server/dist/project-router-jobs.js +49 -1
- package/server/dist/project-router-loop-runs.js +72 -2
- package/server/dist/project-router-rules.js +54 -0
- package/server/dist/project-router-search.js +52 -0
- package/server/dist/project-router-settings.js +6 -0
- package/server/dist/project-router-setup.js +1 -1
- package/server/dist/project-router-spending.js +138 -0
- package/server/dist/project-router-tickets.js +246 -427
- package/server/dist/project-router.js +7 -0
- package/server/dist/providers/claude-adapter.js +25 -3
- package/server/dist/providers/codex-adapter.js +9 -1
- package/server/dist/providers/gemini-adapter.js +6 -1
- package/server/dist/providers/kimi-adapter.js +2 -0
- package/server/dist/providers/local-adapter.js +2 -0
- package/server/dist/providers/runtime.js +8 -0
- package/server/dist/schemas/agent-runtime.schema.json +3 -1
- package/server/dist/schemas/workflow-definition.schema.json +1 -0
- package/server/dist/setup-manager.js +19 -1
- package/server/dist/transient-children.js +25 -8
- package/server/dist/update-channel.js +21 -0
- package/server/dist/util/search-snippet.js +74 -0
- package/server/dist/worktree-manager.js +19 -8
- package/client/dist/assets/ActivityFeedPage-Dtp7EyHc.js +0 -1
- package/client/dist/assets/AgentBrowserCapture-CLqlEFw8.js +0 -1
- package/client/dist/assets/AgentModeAnalyticsPane-B8_hM3Tw.js +0 -2
- package/client/dist/assets/AgentModeCodePane-CNF8ZNjE.js +0 -2
- package/client/dist/assets/AgentModeJobsPane-CJpJbO9m.js +0 -1
- package/client/dist/assets/AgentsPage-BC8XSR79.js +0 -120
- package/client/dist/assets/AnalyticsPage-Cdv4jLtW.js +0 -1
- package/client/dist/assets/BarChart-BDMqVFJy.js +0 -55
- package/client/dist/assets/CodePage-DI1kegAr.js +0 -3
- package/client/dist/assets/DesktopAnalyticsPage-Bdp8E8U6.js +0 -1
- package/client/dist/assets/DocsDialog-Bm4RS7FX.js +0 -11
- package/client/dist/assets/DocsPage-DihYcU8r.js +0 -11
- package/client/dist/assets/ExportDropdown-Bb1lHx3r.js +0 -1
- package/client/dist/assets/IntegrationsPage-EAipiDWm.js +0 -1
- package/client/dist/assets/InteractiveJobComposer-BO6ASN-2.js +0 -19
- package/client/dist/assets/JobDetailModal-CuPYq7tP.js +0 -1
- package/client/dist/assets/JobDetailPage-BusMjJi9.js +0 -1
- package/client/dist/assets/JobsPage-C0QbsF2d.js +0 -1
- package/client/dist/assets/LoopBuilderPage-B7TlU4iS.js +0 -1
- package/client/dist/assets/LoopPreviewModal-BRWtXOD2.js +0 -1
- package/client/dist/assets/LoopsPage-C4q1DmCE.js +0 -2
- package/client/dist/assets/MinimizedChatsContext-DHfigjHS.js +0 -1
- package/client/dist/assets/PluginsPage-Z1JHSMdR.js +0 -2
- package/client/dist/assets/ProjectSettingsDialog-BUNj0tvN.js +0 -1
- package/client/dist/assets/RepositoryDeliveries-B4ybHOyB.js +0 -5
- package/client/dist/assets/ReviewPacketPage-hwfPNjyy.js +0 -4
- package/client/dist/assets/TemplatePreviewModal-V7FpMWuw.js +0 -1
- package/client/dist/assets/TicketDetailModalContext-Dkwo2cDs.js +0 -16
- package/client/dist/assets/Trans-BbFxRFtR.js +0 -1
- package/client/dist/assets/activity-B-rp4h_v.js +0 -1
- package/client/dist/assets/activity-C6kJpm9q.js +0 -1
- package/client/dist/assets/activity-CGx4kb_j.js +0 -1
- package/client/dist/assets/activity-CnoX2bH7.js +0 -1
- package/client/dist/assets/activity-DAyekdlt.js +0 -1
- package/client/dist/assets/activity-DCxtpT7j.js +0 -1
- package/client/dist/assets/activity-DiyjsgQV.js +0 -1
- package/client/dist/assets/activity-JzwRaWPD.js +0 -1
- package/client/dist/assets/addspec-BOvgmcgk.js +0 -1
- package/client/dist/assets/addspec-Clmyfn_R.js +0 -1
- package/client/dist/assets/addspec-CsNaBpHp.js +0 -1
- package/client/dist/assets/addspec-D2tvWmmV.js +0 -1
- package/client/dist/assets/addspec-D3nFwvD0.js +0 -1
- package/client/dist/assets/addspec-DVLEhK3w.js +0 -1
- package/client/dist/assets/addspec-DXbK-tb0.js +0 -1
- package/client/dist/assets/addspec-OHG8DFEn.js +0 -1
- package/client/dist/assets/agent-5bSixVzz.js +0 -1
- package/client/dist/assets/agent-BR4EHfhq.js +0 -1
- package/client/dist/assets/agent-C0IKkJP8.js +0 -1
- package/client/dist/assets/agent-C7li9ayC.js +0 -1
- package/client/dist/assets/agent-D0dRmEen.js +0 -1
- package/client/dist/assets/agent-DZVGHm7H.js +0 -1
- package/client/dist/assets/agent-Dip4h2YE.js +0 -1
- package/client/dist/assets/agent-Pp-P-n1p.js +0 -1
- package/client/dist/assets/agentRuntime-BxF81z52.js +0 -1
- package/client/dist/assets/agentRuntime-BxYS5V7u.js +0 -1
- package/client/dist/assets/agentRuntime-Dc9HG3BA.js +0 -1
- package/client/dist/assets/agents-B6ZsnARo.js +0 -1
- package/client/dist/assets/agents-BORdhe0K.js +0 -1
- package/client/dist/assets/agents-C6aq9Oqs.js +0 -1
- package/client/dist/assets/agents-Cbsc4bcX.js +0 -1
- package/client/dist/assets/agents-D0uYR6hq.js +0 -1
- package/client/dist/assets/agents-Doe1sHY5.js +0 -1
- package/client/dist/assets/agents-DyNi_I9m.js +0 -1
- package/client/dist/assets/agents-StKxiTg0.js +0 -1
- package/client/dist/assets/agentstudio-7cYCXn-L.js +0 -1
- package/client/dist/assets/agentstudio-BHWQh8G3.js +0 -1
- package/client/dist/assets/agentstudio-BjnWHyRs.js +0 -1
- package/client/dist/assets/agentstudio-BkV8vcK4.js +0 -1
- package/client/dist/assets/agentstudio-BzugqB_N.js +0 -1
- package/client/dist/assets/agentstudio-CWbp7KvH.js +0 -1
- package/client/dist/assets/agentstudio-DG6plf5o.js +0 -1
- package/client/dist/assets/agentstudio-DkZVF-Cc.js +0 -1
- package/client/dist/assets/analytics-B1DIQd4m.js +0 -1
- package/client/dist/assets/analytics-BAIZ9vE_.js +0 -1
- package/client/dist/assets/analytics-BTqgmgBd.js +0 -1
- package/client/dist/assets/analytics-BWynXPEm.js +0 -1
- package/client/dist/assets/analytics-DGcUsQ44.js +0 -1
- package/client/dist/assets/analytics-GnSnpJ4W.js +0 -1
- package/client/dist/assets/analytics-TWgYaoO0.js +0 -1
- package/client/dist/assets/analytics-kJy6Tuko.js +0 -1
- package/client/dist/assets/atom-one-dark-qiGhVQxg.js +0 -1
- package/client/dist/assets/builder-B9gorTnT.js +0 -1
- package/client/dist/assets/builder-Bvw5s3Mi.js +0 -1
- package/client/dist/assets/builder-CL5l4dU3.js +0 -1
- package/client/dist/assets/builder-CVDTVrQX.js +0 -1
- package/client/dist/assets/builder-CpS9liE9.js +0 -1
- package/client/dist/assets/builder-DNctIL9Q.js +0 -1
- package/client/dist/assets/builder-De2NxX6o.js +0 -1
- package/client/dist/assets/builder-DeYT7Y-m.js +0 -1
- package/client/dist/assets/button-4FS1ZDTp.js +0 -1
- package/client/dist/assets/chat-D_I7nU5K.js +0 -1
- package/client/dist/assets/chevron-up-6EFqEHBj.js +0 -1
- package/client/dist/assets/chunk-OB3PAWPO-B1EMk45A.js +0 -3
- package/client/dist/assets/clsx-CjueKrWZ.js +0 -1
- package/client/dist/assets/code-B37GRg9C.js +0 -1
- package/client/dist/assets/code-BBOEZbf9.js +0 -1
- package/client/dist/assets/code-BRm-jcyx.js +0 -1
- package/client/dist/assets/code-CF7w62CR.js +0 -1
- package/client/dist/assets/code-CLuvJt2r.js +0 -1
- package/client/dist/assets/code-D0RCm59f.js +0 -1
- package/client/dist/assets/code-DaZ-ZwCT.js +0 -1
- package/client/dist/assets/code-iIHkGaCL.js +0 -1
- package/client/dist/assets/commands-0XjAftla.js +0 -1
- package/client/dist/assets/commands-BAWSYHjQ.js +0 -1
- package/client/dist/assets/commands-BBwowgiE.js +0 -1
- package/client/dist/assets/commands-BacjIZLN.js +0 -1
- package/client/dist/assets/commands-Bs62IAZ3.js +0 -1
- package/client/dist/assets/commands-CLPdh-Hh.js +0 -1
- package/client/dist/assets/commands-DlbFzgrp.js +0 -1
- package/client/dist/assets/commands-LjPSsi5F.js +0 -1
- package/client/dist/assets/common-Bdi0qN4S.js +0 -1
- package/client/dist/assets/common-Bhb9zN1P.js +0 -1
- package/client/dist/assets/common-BykKlZg1.js +0 -1
- package/client/dist/assets/common-CvnNNSJA.js +0 -1
- package/client/dist/assets/common-D5zk_mqq.js +0 -1
- package/client/dist/assets/common-DQNO_al5.js +0 -1
- package/client/dist/assets/common-Dax30Vmp.js +0 -1
- package/client/dist/assets/common-DkllpVSb.js +0 -1
- package/client/dist/assets/core-B3mKBIh5.js +0 -1
- package/client/dist/assets/dashboard-B1ndRHuC.js +0 -1
- package/client/dist/assets/dashboard-BX7KXiqA.js +0 -1
- package/client/dist/assets/dashboard-B_BSNxcN.js +0 -1
- package/client/dist/assets/dashboard-CCeFN7-V.js +0 -1
- package/client/dist/assets/dashboard-CRl0WtFJ.js +0 -1
- package/client/dist/assets/dashboard-XGdQ5mjw.js +0 -1
- package/client/dist/assets/dashboard-_oltA6Jd.js +0 -1
- package/client/dist/assets/dashboard-bAuf5KVk.js +0 -1
- package/client/dist/assets/dialog-DtdR05v1.js +0 -45
- package/client/dist/assets/dist-js-CJ_2XX1Y.js +0 -1
- package/client/dist/assets/event-Bt7f3wXe.js +0 -1
- package/client/dist/assets/explore-BG99VGpL.js +0 -1
- package/client/dist/assets/explore-C0TjprJW.js +0 -1
- package/client/dist/assets/explore-C2dgEo7q.js +0 -1
- package/client/dist/assets/explore-C8NDHbob.js +0 -1
- package/client/dist/assets/explore-CWWgzQGR.js +0 -1
- package/client/dist/assets/explore-CcQXpdtS.js +0 -1
- package/client/dist/assets/explore-DgBACn39.js +0 -1
- package/client/dist/assets/explore-DsXAgnmJ.js +0 -1
- package/client/dist/assets/file-text-C0blZHLh.js +0 -1
- package/client/dist/assets/formatDistanceToNow-NjPHBLfB.js +0 -1
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-vJ7qUoqN.js +0 -1
- package/client/dist/assets/git-branch-yf6LE1Bw.js +0 -1
- package/client/dist/assets/index-BgbCbIua.css +0 -2
- package/client/dist/assets/index-Ce4yZtKf.js +0 -83
- package/client/dist/assets/integrations-BkpRUbvp.js +0 -1
- package/client/dist/assets/integrations-Bo8qbJf4.js +0 -1
- package/client/dist/assets/integrations-CmSrKzZb.js +0 -1
- package/client/dist/assets/integrations-DGtq26Rr.js +0 -1
- package/client/dist/assets/integrations-De38GFnQ.js +0 -1
- package/client/dist/assets/integrations-Dw6zdtb-.js +0 -1
- package/client/dist/assets/integrations-Dwl9KQp0.js +0 -1
- package/client/dist/assets/integrations-Refg_d2I.js +0 -1
- package/client/dist/assets/jira-B6OYw4CJ.js +0 -1
- package/client/dist/assets/jira-BTF6RaOe.js +0 -1
- package/client/dist/assets/jira-CEetIB2q.js +0 -1
- package/client/dist/assets/jira-CIzsZLw5.js +0 -1
- package/client/dist/assets/jira-Daw9tmpI.js +0 -1
- package/client/dist/assets/jira-FXr7u2lh.js +0 -1
- package/client/dist/assets/jira-LaNQn7yl.js +0 -1
- package/client/dist/assets/jira-api-Cabj-H0J.js +0 -1
- package/client/dist/assets/job-time-BCL7wee9.js +0 -1
- package/client/dist/assets/jobs-ARwD85B9.js +0 -1
- package/client/dist/assets/jobs-BMF1w4WT.js +0 -1
- package/client/dist/assets/jobs-CBfzGLwm.js +0 -1
- package/client/dist/assets/jobs-CPjiluBY.js +0 -1
- package/client/dist/assets/jobs-CQQd58pY.js +0 -1
- package/client/dist/assets/jobs-De3EqaO0.js +0 -1
- package/client/dist/assets/jobs-Du9-Ei9a.js +0 -1
- package/client/dist/assets/jobs-qMHbnxwC.js +0 -1
- package/client/dist/assets/layers-BCLTgHXO.js +0 -1
- package/client/dist/assets/loader-circle-BqV9xYGf.js +0 -1
- package/client/dist/assets/loop-layout-CyXj9223.js +0 -7
- package/client/dist/assets/loops-B2PhQLKR.js +0 -1
- package/client/dist/assets/loops-BqbF46st.js +0 -1
- package/client/dist/assets/loops-CINnHbfI.js +0 -1
- package/client/dist/assets/loops-D-3XhH04.js +0 -1
- package/client/dist/assets/loops-DKkEEjZ_.js +0 -1
- package/client/dist/assets/loops-DzWR5-v6.js +0 -1
- package/client/dist/assets/loops-WyWDkhok.js +0 -1
- package/client/dist/assets/loops-scD5fIBf.js +0 -1
- package/client/dist/assets/mcp-6rMoZfEO.js +0 -1
- package/client/dist/assets/mcp-BD8sL5mP.js +0 -1
- package/client/dist/assets/mcp-BkcA3I5s.js +0 -1
- package/client/dist/assets/mcp-CCpSelOh.js +0 -1
- package/client/dist/assets/mcp-CUAN6ORK.js +0 -1
- package/client/dist/assets/mcp-CqbRxRTE.js +0 -1
- package/client/dist/assets/mcp-DP2YfVhO.js +0 -1
- package/client/dist/assets/mcp-DUVQamDz.js +0 -1
- package/client/dist/assets/narration-BEKMVxGm.js +0 -1
- package/client/dist/assets/narration-CjLwGKap.js +0 -1
- package/client/dist/assets/narration-DANWuGsW.js +0 -1
- package/client/dist/assets/narration-DGeEDWiT.js +0 -1
- package/client/dist/assets/narration-DJgpGwIP.js +0 -1
- package/client/dist/assets/narration-DbHnz0qV.js +0 -1
- package/client/dist/assets/narration-bZSsTZG8.js +0 -1
- package/client/dist/assets/narration-i6aKJKEc.js +0 -1
- package/client/dist/assets/nav--u7iPYlS.js +0 -1
- package/client/dist/assets/nav-C5Jgfaby.js +0 -1
- package/client/dist/assets/nav-CAna_Wpt.js +0 -1
- package/client/dist/assets/nav-CCLqeyHo.js +0 -1
- package/client/dist/assets/nav-Cf3c90Jk.js +0 -1
- package/client/dist/assets/nav-DMYQaQjR.js +0 -1
- package/client/dist/assets/nav-Df_PkZ9F.js +0 -1
- package/client/dist/assets/nav-VyNGBJwj.js +0 -1
- package/client/dist/assets/packet-8nn9RsU7.js +0 -1
- package/client/dist/assets/packet-B0H15elv.js +0 -1
- package/client/dist/assets/packet-BQvBgrwh.js +0 -1
- package/client/dist/assets/packet-BR7mO0-a.js +0 -1
- package/client/dist/assets/packet-BgcQ6q_K.js +0 -1
- package/client/dist/assets/packet-D2s92Jnn.js +0 -1
- package/client/dist/assets/packet-YbtcD1HS.js +0 -1
- package/client/dist/assets/packet-c0Qj_9eX.js +0 -1
- package/client/dist/assets/project-repositories-Cnnuj9Ia.js +0 -1
- package/client/dist/assets/rotate-ccw-DalJAQQX.js +0 -1
- package/client/dist/assets/settings-B1NV8Ow9.js +0 -1
- package/client/dist/assets/settings-BQ8XFZeE.js +0 -1
- package/client/dist/assets/settings-BRkxfBbO.js +0 -1
- package/client/dist/assets/settings-C_CcU1dP.js +0 -1
- package/client/dist/assets/settings-Cto9n0eL.js +0 -1
- package/client/dist/assets/settings-Pyw8uYtL.js +0 -1
- package/client/dist/assets/settings-b3HVCNNd.js +0 -1
- package/client/dist/assets/settings-hdive4u6.js +0 -1
- package/client/dist/assets/setup-Be485n2u.js +0 -1
- package/client/dist/assets/setup-CKGUxKr-.js +0 -1
- package/client/dist/assets/setup-Ck1Uwd7_.js +0 -1
- package/client/dist/assets/setup-Cm774a6v.js +0 -1
- package/client/dist/assets/setup-DIqMQpxt.js +0 -1
- package/client/dist/assets/setup-DfCsoNFL.js +0 -1
- package/client/dist/assets/setup-DkeE8mP0.js +0 -1
- package/client/dist/assets/setup-xVntVaz1.js +0 -1
- package/client/dist/assets/specs-Bqvtz2kz.js +0 -1
- package/client/dist/assets/specs-CKes-kz6.js +0 -1
- package/client/dist/assets/specs-CfXxPDNB.js +0 -1
- package/client/dist/assets/specs-CyF9HuTI.js +0 -1
- package/client/dist/assets/specs-DMj035Mt.js +0 -1
- package/client/dist/assets/specs-DfIdoU5L.js +0 -1
- package/client/dist/assets/specs-j5pGLQeU.js +0 -1
- package/client/dist/assets/specs-xW5pkkB7.js +0 -1
- package/client/dist/assets/spending-CQnrWiR3.js +0 -1
- package/client/dist/assets/square-D0JTbRSR.js +0 -1
- package/client/dist/assets/tauri-shell-DE6LfGPw.js +0 -2
- package/client/dist/assets/terminal-BAzpHtpY.js +0 -1
- package/client/dist/assets/terminal-C7dHeR3x.js +0 -1
- package/client/dist/assets/terminal-CMla5Qsz.js +0 -1
- package/client/dist/assets/terminal-CdNXH-n9.js +0 -1
- package/client/dist/assets/terminal-Cw5bZsmV.js +0 -1
- package/client/dist/assets/terminal-DFUP4eNv.js +0 -1
- package/client/dist/assets/terminal-DGqljeK_.js +0 -1
- package/client/dist/assets/terminal-cU70NodO.js +0 -1
- package/client/dist/assets/tickets--tiSOCcn.js +0 -1
- package/client/dist/assets/tickets-BUJ3DMWU.js +0 -1
- package/client/dist/assets/tickets-C1WNPODq.js +0 -1
- package/client/dist/assets/tickets-CDjhWmiE.js +0 -1
- package/client/dist/assets/tickets-CLgPC3uO.js +0 -1
- package/client/dist/assets/tickets-D41ZMQpf.js +0 -1
- package/client/dist/assets/tickets-DEaQC06P.js +0 -1
- package/client/dist/assets/tickets-kcMzbLCp.js +0 -1
- package/client/dist/assets/trash-D8zYUmTg.js +0 -1
- package/client/dist/assets/useDesktop-BjLT0_EE.js +0 -1
- package/client/dist/assets/useRuntimeRuns-C97qEqMg.js +0 -1
- package/client/dist/assets/useSharedWebSocket-Bj4LMp7b.js +0 -2
- package/client/dist/assets/utils-BC4DHlz2.js +0 -1
- package/docs/guide/en/getting-started/4-the-dashboard-tour.md +0 -48
- package/docs/guide/es/getting-started/4-the-dashboard-tour.md +0 -48
- package/server/dist/mobile/mobile-preview-channel.js +0 -179
- package/server/dist/mobile/mobile-preview.js +0 -366
- package/server/dist/modules/browser/domain/preview-origins.js +0 -117
- package/server/dist/modules/browser/runtime/preview-targets.js +0 -80
- /package/client/dist/assets/{atom-one-dark-B-oHczHB.css → DocView-B-oHczHB.css} +0 -0
- /package/docs/guide/de/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/en/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/es/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/fr/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/it/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/ja/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/pt/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/zh/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
|
@@ -15,6 +15,10 @@ const db_1 = require("./db");
|
|
|
15
15
|
const project_repositories_1 = require("./project-repositories");
|
|
16
16
|
const multi_repo_execution_store_1 = require("./modules/delivery/runtime/multi-repo-execution-store");
|
|
17
17
|
const queue_manager_1 = require("./modules/execution/runtime/queue-manager");
|
|
18
|
+
const daily_budget_gate_1 = require("./modules/execution/runtime/daily-budget-gate");
|
|
19
|
+
const budget_storage_1 = require("./modules/execution/adapters/budget-storage");
|
|
20
|
+
const execution_1 = require("./modules/execution");
|
|
21
|
+
const review_wip_gate_1 = require("./modules/delivery/runtime/review-wip-gate");
|
|
18
22
|
const agent_defaults_1 = require("./modules/agents/runtime/agent-defaults");
|
|
19
23
|
const chat_manager_1 = require("./modules/conversations/runtime/chat-manager");
|
|
20
24
|
const setup_manager_1 = require("./setup-manager");
|
|
@@ -30,7 +34,6 @@ const ticket_watcher_1 = require("./modules/specs/runtime/ticket-watcher");
|
|
|
30
34
|
const terminal_manager_1 = require("./modules/terminals/runtime/terminal-manager");
|
|
31
35
|
const browser_capture_manager_1 = require("./modules/browser/runtime/browser-capture-manager");
|
|
32
36
|
const browser_context_pool_1 = require("./modules/browser/runtime/browser-context-pool");
|
|
33
|
-
const preview_targets_1 = require("./modules/browser/runtime/preview-targets");
|
|
34
37
|
const explore_cwd_manager_1 = require("./modules/conversations/runtime/explore-cwd-manager");
|
|
35
38
|
const hooks_1 = require("./hooks");
|
|
36
39
|
const transient_children_1 = require("./transient-children");
|
|
@@ -40,6 +43,8 @@ const workspace_resolution_1 = require("./workspace-resolution");
|
|
|
40
43
|
const project_env_1 = require("./project-env");
|
|
41
44
|
const workspace_manager_1 = require("./workspace-manager");
|
|
42
45
|
const ticket_store_1 = require("./modules/specs/runtime/ticket-store");
|
|
46
|
+
const non_goals_1 = require("./modules/specs/domain/non-goals");
|
|
47
|
+
const run_records_1 = require("./modules/delivery/runtime/run-records");
|
|
43
48
|
const spec_addenda_1 = require("./modules/specs/runtime/spec-addenda");
|
|
44
49
|
const jira_sync_manager_1 = require("./jira/jira-sync-manager");
|
|
45
50
|
const stuck_run_detector_1 = require("./modules/execution/runtime/stuck-run-detector");
|
|
@@ -50,18 +55,31 @@ const blueprint_render_1 = require("./modules/builder/runtime/blueprint-render")
|
|
|
50
55
|
const worktree_manager_1 = require("./worktree-manager");
|
|
51
56
|
const integration_branch_1 = require("./integration-branch");
|
|
52
57
|
const db_2 = require("./db");
|
|
58
|
+
const runtime_1 = require("./modules/audit/adapters/runtime");
|
|
53
59
|
const loop_run_manager_1 = require("./modules/loops/runtime/loop-run-manager");
|
|
54
60
|
const loop_executors_1 = require("./modules/loops/runtime/loop-executors");
|
|
61
|
+
const flow_review_legacy_1 = require("./modules/delivery/runtime/flow-review-legacy");
|
|
55
62
|
const loop_definition_recovery_1 = require("./modules/loops/runtime/loop-definition-recovery");
|
|
56
63
|
const rail_isolated_launch_1 = require("./modules/delivery/runtime/rail-isolated-launch");
|
|
57
64
|
const rail_isolation_1 = require("./modules/delivery/runtime/rail-isolation");
|
|
58
65
|
const rail_pr_store_1 = require("./modules/delivery/runtime/rail-pr-store");
|
|
59
66
|
const agent_chat_registry_1 = require("./modules/missions/runtime/agent-chat-registry");
|
|
60
67
|
const rail_pr_ticket_effects_1 = require("./modules/delivery/runtime/rail-pr-ticket-effects");
|
|
68
|
+
const rail_pr_decision_1 = require("./modules/delivery/runtime/rail-pr-decision");
|
|
69
|
+
const pr_publisher_1 = require("./modules/delivery/runtime/pr-publisher");
|
|
61
70
|
const loop_runs_store_1 = require("./modules/loops/runtime/loop-runs-store");
|
|
62
71
|
const rails_store_1 = require("./modules/delivery/runtime/rails-store");
|
|
63
72
|
const desktop_db_1 = require("./desktop-db");
|
|
64
73
|
const config_1 = require("./config");
|
|
74
|
+
const flow_1 = require("./modules/flow");
|
|
75
|
+
const sqlite_1 = require("./modules/flow/adapters/sqlite");
|
|
76
|
+
const bindings_1 = require("./modules/flow/adapters/bindings");
|
|
77
|
+
const triage_1 = require("./modules/specs/runtime/triage");
|
|
78
|
+
const ticket_trash_service_1 = require("./modules/specs/runtime/ticket-trash-service");
|
|
79
|
+
const attachment_manager_1 = require("./attachment-manager");
|
|
80
|
+
const rules_inventory_runs_1 = require("./modules/project-rules/runtime/rules-inventory-runs");
|
|
81
|
+
const core_capabilities_1 = require("./modules/agent-runtime/runtime/core-capabilities");
|
|
82
|
+
const core_sessions_availability_1 = require("./modules/agent-sessions/runtime/core-sessions-availability");
|
|
65
83
|
const process_admission_1 = require("./process-admission");
|
|
66
84
|
// ─── Types ────────────────────────────────────────────────────────────────────
|
|
67
85
|
/** The two live queue states are the only non-terminal members of JobStatus.
|
|
@@ -120,9 +138,6 @@ class ProjectRegistry {
|
|
|
120
138
|
// Chromium profile under ~/.specrails/browser-profile, so cookies/logins are
|
|
121
139
|
// shared across every project. Launched lazily, disposed once at shutdown().
|
|
122
140
|
_browserContextPool;
|
|
123
|
-
// Companion app preview: URLs announced by running mission processes,
|
|
124
|
-
// derived on demand from their logs (shared by every project's browser).
|
|
125
|
-
_previewTargets = (0, preview_targets_1.createPreviewTargetSource)();
|
|
126
141
|
constructor(broadcast, desktopDbPath, desktopPort) {
|
|
127
142
|
this._broadcast = broadcast;
|
|
128
143
|
this._desktopDb = (0, desktop_db_1.initDesktopDb)(desktopDbPath ?? (0, desktop_db_1.getDesktopDbPath)());
|
|
@@ -132,9 +147,6 @@ class ProjectRegistry {
|
|
|
132
147
|
this._failedProjects = new Map();
|
|
133
148
|
this._browserContextPool = new browser_context_pool_1.SharedBrowserContextPool();
|
|
134
149
|
}
|
|
135
|
-
get previewTargets() {
|
|
136
|
-
return this._previewTargets;
|
|
137
|
-
}
|
|
138
150
|
get desktopDb() {
|
|
139
151
|
return this._desktopDb;
|
|
140
152
|
}
|
|
@@ -277,6 +289,7 @@ class ProjectRegistry {
|
|
|
277
289
|
}
|
|
278
290
|
removeProject(id) {
|
|
279
291
|
this._clearLoadRetry(id);
|
|
292
|
+
rules_inventory_runs_1.rulesInventoryRuns.forget(id);
|
|
280
293
|
// Resolve the repo path BEFORE the DB row is deleted below so we can drop the
|
|
281
294
|
// shared artifact-registry entry. Prefer the live context, fall back to the
|
|
282
295
|
// desktop DB row (project may be registered-but-not-loaded, e.g. M9 failure).
|
|
@@ -368,6 +381,10 @@ class ProjectRegistry {
|
|
|
368
381
|
ctx.milestoneProgress?.dispose();
|
|
369
382
|
}
|
|
370
383
|
catch { /* ignore */ }
|
|
384
|
+
try {
|
|
385
|
+
ctx.flowSettlement?.stop();
|
|
386
|
+
}
|
|
387
|
+
catch { /* ignore */ }
|
|
371
388
|
// Kill any terminal sessions belonging to this project
|
|
372
389
|
try {
|
|
373
390
|
(0, terminal_manager_1.getTerminalManager)().killAllForProject(id);
|
|
@@ -382,6 +399,14 @@ class ProjectRegistry {
|
|
|
382
399
|
ctx.fileSummaryManager.dispose();
|
|
383
400
|
}
|
|
384
401
|
catch { /* ignore */ }
|
|
402
|
+
try {
|
|
403
|
+
ctx.specTriage?.dispose();
|
|
404
|
+
}
|
|
405
|
+
catch { /* ignore */ }
|
|
406
|
+
try {
|
|
407
|
+
ctx.trashPurge?.stop();
|
|
408
|
+
}
|
|
409
|
+
catch { /* ignore */ }
|
|
385
410
|
// Drop the app-managed Explore Spec cwd (CLAUDE.md + symlink to project)
|
|
386
411
|
try {
|
|
387
412
|
(0, explore_cwd_manager_1.removeExploreCwd)(ctx.project.slug);
|
|
@@ -402,6 +427,11 @@ class ProjectRegistry {
|
|
|
402
427
|
(0, project_env_1.stopProjectEnvWarmup)(ctx.db);
|
|
403
428
|
}
|
|
404
429
|
catch { /* ignore */ }
|
|
430
|
+
// Flush pending audit rows and stop retention BEFORE the connection closes.
|
|
431
|
+
try {
|
|
432
|
+
ctx.agentAudit?.dispose();
|
|
433
|
+
}
|
|
434
|
+
catch { /* ignore */ }
|
|
405
435
|
// Close the DB connection BEFORE removing the project's data dir below.
|
|
406
436
|
try {
|
|
407
437
|
ctx.db.close();
|
|
@@ -645,16 +675,32 @@ class ProjectRegistry {
|
|
|
645
675
|
ctx.milestoneProgress?.dispose();
|
|
646
676
|
}
|
|
647
677
|
catch { /* ignore */ }
|
|
678
|
+
try {
|
|
679
|
+
ctx.flowSettlement?.stop();
|
|
680
|
+
}
|
|
681
|
+
catch { /* ignore */ }
|
|
648
682
|
// Release chokidar watchers + abort in-flight generations so a restart
|
|
649
683
|
// does not leak handles/children — mirror removeProject()'s per-project teardown.
|
|
650
684
|
try {
|
|
651
685
|
ctx.fileSummaryManager.dispose();
|
|
652
686
|
}
|
|
653
687
|
catch { /* ignore */ }
|
|
688
|
+
try {
|
|
689
|
+
ctx.specTriage?.dispose();
|
|
690
|
+
}
|
|
691
|
+
catch { /* ignore */ }
|
|
692
|
+
try {
|
|
693
|
+
ctx.trashPurge?.stop();
|
|
694
|
+
}
|
|
695
|
+
catch { /* ignore */ }
|
|
654
696
|
try {
|
|
655
697
|
(0, project_env_1.stopProjectEnvWarmup)(ctx.db);
|
|
656
698
|
}
|
|
657
699
|
catch { /* ignore */ }
|
|
700
|
+
try {
|
|
701
|
+
ctx.agentAudit?.dispose();
|
|
702
|
+
}
|
|
703
|
+
catch { /* ignore */ }
|
|
658
704
|
ctx.ticketWatcher.close().catch(() => { });
|
|
659
705
|
}
|
|
660
706
|
// Close the shared browser context once, after every per-project manager has
|
|
@@ -695,6 +741,8 @@ class ProjectRegistry {
|
|
|
695
741
|
// once the rail maps exist; null until then (startup messages are few).
|
|
696
742
|
let milestoneProgress = null;
|
|
697
743
|
let milestoneChains = null;
|
|
744
|
+
let flowService = null;
|
|
745
|
+
let specTriage = null;
|
|
698
746
|
const boundBroadcast = (msg) => {
|
|
699
747
|
const enriched = { ...msg, projectId: project.id };
|
|
700
748
|
this._broadcast(enriched);
|
|
@@ -702,6 +750,14 @@ class ProjectRegistry {
|
|
|
702
750
|
// emit its own `milestone.chain_changed`; the progress tap then coalesces.
|
|
703
751
|
milestoneChains?.observe(msg);
|
|
704
752
|
milestoneProgress?.observe(msg);
|
|
753
|
+
// Spec triage: a created/edited spec schedules a debounced triage scan.
|
|
754
|
+
specTriage?.observe(msg);
|
|
755
|
+
// Flow settlement: a Flow delivery that reached review settles its Flow.
|
|
756
|
+
if (msg.type === 'rail.pr_state' && flowService) {
|
|
757
|
+
const deliveryId = msg.prDeliveryId;
|
|
758
|
+
if (typeof deliveryId === 'string')
|
|
759
|
+
void flowService.observeDelivery(deliveryId).catch((err) => console.error('[flow] delivery settlement failed:', err));
|
|
760
|
+
}
|
|
705
761
|
if (msg.type === 'queue') {
|
|
706
762
|
for (const job of msg.jobs) {
|
|
707
763
|
if (isTerminalJobStatus(job.status)) {
|
|
@@ -735,8 +791,15 @@ class ProjectRegistry {
|
|
|
735
791
|
projectPath: project.path,
|
|
736
792
|
broadcast: boundBroadcast,
|
|
737
793
|
});
|
|
794
|
+
// Agent actions audit (one batched writer per project connection). Retention
|
|
795
|
+
// runs shortly after startup and daily, reading the project setting each time.
|
|
796
|
+
const agentAudit = (0, runtime_1.createProjectAgentAudit)(db, {
|
|
797
|
+
label: project.slug,
|
|
798
|
+
retentionDays: () => (0, db_2.getProjectSettings)(db).agentAuditRetentionDays,
|
|
799
|
+
});
|
|
738
800
|
const queueManager = new queue_manager_1.QueueManager(boundBroadcast, db, undefined, project.path, {
|
|
739
801
|
zombieTimeoutMs: projectZombieTimeout,
|
|
802
|
+
agentAudit: agentAudit.recorder,
|
|
740
803
|
provider: project.provider ?? 'claude',
|
|
741
804
|
projectId: project.id,
|
|
742
805
|
projectSlug: project.slug,
|
|
@@ -769,16 +832,8 @@ class ProjectRegistry {
|
|
|
769
832
|
const val = (0, desktop_db_1.getDesktopSetting)(this._desktopDb, 'cost_alert_threshold_usd');
|
|
770
833
|
return val != null ? parseFloat(val) : null;
|
|
771
834
|
},
|
|
772
|
-
getDesktopDailyBudget: () =>
|
|
773
|
-
|
|
774
|
-
const budget = val != null ? parseFloat(val) : null;
|
|
775
|
-
let totalSpend = 0;
|
|
776
|
-
for (const c of this.listContexts()) {
|
|
777
|
-
const row = c.db.prepare(`SELECT COALESCE(SUM(total_cost_usd), 0) as total FROM jobs WHERE status = 'completed' AND total_cost_usd IS NOT NULL AND started_at >= date('now')`).get();
|
|
778
|
-
totalSpend += row.total;
|
|
779
|
-
}
|
|
780
|
-
return { budget, totalSpend };
|
|
781
|
-
},
|
|
835
|
+
getDesktopDailyBudget: () => this._desktopDailyBudgetSnapshot(),
|
|
836
|
+
getPeriodCapBreaches: () => this._capStatuses(db, project.id).filter((cap) => cap.exhausted && cap.period !== 'day'),
|
|
782
837
|
onBudgetExceeded: (event, data) => {
|
|
783
838
|
if (event === 'desktop_daily_budget_exceeded') {
|
|
784
839
|
this._pauseAllQueuesForDesktopBudget();
|
|
@@ -1009,7 +1064,9 @@ class ProjectRegistry {
|
|
|
1009
1064
|
// On a replay after the ticket mutation committed but a later rail
|
|
1010
1065
|
// mutation failed, changedTicketIds is empty. Derive the intended
|
|
1011
1066
|
// review set from the converged store so Jira still receives it.
|
|
1012
|
-
|
|
1067
|
+
// A Flow spec reaches Jira only through its Flow settlement
|
|
1068
|
+
// (create, then the review transition), never from here.
|
|
1069
|
+
const reviewIds = effectTicketIds.filter((tid) => outcomeStore?.tickets[String(tid)]?.status === 'on_review' && !(0, ticket_store_1.isFlowHeldTicket)(outcomeStore?.tickets[String(tid)]));
|
|
1013
1070
|
jiraSyncManager.onRailReview(reviewIds, jobId);
|
|
1014
1071
|
}
|
|
1015
1072
|
else {
|
|
@@ -1067,7 +1124,16 @@ class ProjectRegistry {
|
|
|
1067
1124
|
// LOW-2: resolve the per-project DB so phase-4 setup-chat AI turns record
|
|
1068
1125
|
// an `ai_invocations` row (surface='setup'). Returns null until the project
|
|
1069
1126
|
// context exists, in which case nothing is recorded (best-effort).
|
|
1070
|
-
(pid) => this._contexts.get(pid)?.db ?? null
|
|
1127
|
+
(pid) => this._contexts.get(pid)?.db ?? null,
|
|
1128
|
+
// After a setup succeeded, run Core's rules inventory once in the
|
|
1129
|
+
// background (gated on Core `rulesInventory`; idempotent; a failure is
|
|
1130
|
+
// logged and shown in the project's rules panel). Never blocks setup.
|
|
1131
|
+
(pid) => {
|
|
1132
|
+
const target = this._contexts.get(pid)?.project;
|
|
1133
|
+
if (!target)
|
|
1134
|
+
return;
|
|
1135
|
+
void rules_inventory_runs_1.rulesInventoryRuns.runAfterSetup({ id: target.id, slug: target.slug, path: target.path }, async () => (await (0, core_capabilities_1.corePhase3Capabilities)()).rulesInventory);
|
|
1136
|
+
});
|
|
1071
1137
|
const proposalManager = new proposal_manager_1.ProposalManager(boundBroadcast, db, project.path, project.id, project.provider ?? 'claude', project.slug);
|
|
1072
1138
|
const agentRefineManager = new agent_refine_manager_1.AgentRefineManager(boundBroadcast, db, project.path, project.id, project.provider ?? 'claude');
|
|
1073
1139
|
// Retention prune: drop stale/abandoned refine sessions on project load.
|
|
@@ -1143,9 +1209,6 @@ class ProjectRegistry {
|
|
|
1143
1209
|
// Share ONE persistent Chromium profile (global cookies/logins) across all
|
|
1144
1210
|
// projects instead of a per-project profile.
|
|
1145
1211
|
contextPool: this._browserContextPool,
|
|
1146
|
-
// Only device-owned (Companion preview) sessions may load these loopback
|
|
1147
|
-
// origins; Desktop sessions keep the regular SSRF guard.
|
|
1148
|
-
previewOrigins: () => this._previewTargets.announcedOrigins(project.id),
|
|
1149
1212
|
});
|
|
1150
1213
|
// ── Loops engine (the Loops feature) ──────────────────────────────────────
|
|
1151
1214
|
const railLoopRuns = new Map();
|
|
@@ -1165,14 +1228,45 @@ class ProjectRegistry {
|
|
|
1165
1228
|
// per-run (the worktree for isolated runs). Legacy projects keep process.env
|
|
1166
1229
|
// byte-identical except for the explicit per-project passthrough overlay.
|
|
1167
1230
|
// See resolveLoopBaseEnv.
|
|
1231
|
+
// Same budget state the queue auto-pause enforces; bound to THIS project's
|
|
1232
|
+
// connection (project budget) plus the app-wide snapshot.
|
|
1233
|
+
const capOptions = { db, projectId: project.id, desktop: () => this._desktopDailyBudgetSnapshot(), desktopPeriod: (period, at) => this._desktopPeriodSnapshot(period, at) };
|
|
1234
|
+
const dailyBudgetRejection = (0, daily_budget_gate_1.createDailyBudgetGate)(capOptions);
|
|
1235
|
+
const dailyBudgetHeadroom = (0, daily_budget_gate_1.createDailyBudgetHeadroom)(capOptions);
|
|
1236
|
+
// Every configured cap with its spend (Budget panel, inbox, mid-run pause).
|
|
1237
|
+
const budgetCaps = (at = new Date()) => (0, daily_budget_gate_1.readCapStatuses)(capOptions, at);
|
|
1238
|
+
// The per-run soft cap that applies to a new run: the tighter of the
|
|
1239
|
+
// project's and the app-wide default (null = none).
|
|
1240
|
+
const runCapDefault = () => (0, execution_1.effectiveRunCap)((0, budget_storage_1.readProjectCaps)(db).run, this._desktopCapConfig().run);
|
|
1241
|
+
const reviewWipGate = (0, review_wip_gate_1.createReviewWipGate)({ db, readLimit: () => (0, db_2.getProjectSettings)(db).reviewWipLimit });
|
|
1242
|
+
// Architect clarifications (feedback-2026-10 task 3.2): after a Core
|
|
1243
|
+
// invocation pauses or ends, post the run's clarifications record to the
|
|
1244
|
+
// linked Jira issues when the project opted in. Core writes no record
|
|
1245
|
+
// without `architectClarifications: 1`, so older Cores never post.
|
|
1246
|
+
const publishRunClarifications = (runId, ticketIds) => {
|
|
1247
|
+
if (ticketIds.length === 0 || !(0, db_2.getProjectSettings)(db).jiraPostClarifications || !jiraSyncManager.isActive())
|
|
1248
|
+
return;
|
|
1249
|
+
try {
|
|
1250
|
+
const runtimeDir = path_1.default.join((0, workspace_resolution_1.resolveProjectExecution)(project).specrailsDir, 'pipeline', runId);
|
|
1251
|
+
const record = (0, run_records_1.readClarifications)(runtimeDir, run_records_1.nodeRunRecordFs);
|
|
1252
|
+
if (record)
|
|
1253
|
+
jiraSyncManager.onRunClarifications(runId, ticketIds, record);
|
|
1254
|
+
}
|
|
1255
|
+
catch (err) {
|
|
1256
|
+
console.error(`[jira-sync] clarifications for ${runId} failed:`, err);
|
|
1257
|
+
}
|
|
1258
|
+
};
|
|
1168
1259
|
const loopRunManager = new loop_run_manager_1.LoopRunManager(db, boundBroadcast, (0, loop_executors_1.createLoopExecutors)({
|
|
1169
1260
|
pluginScope: () => ({ stateRoot: (0, workspace_resolution_1.resolveProjectExecution)(project).cwd, legacyProviderId: project.provider }),
|
|
1170
1261
|
// A project registered as a package of a larger checkout scopes Core to that package in isolated worktrees.
|
|
1171
1262
|
sourcePath: () => (0, project_repositories_1.resolveProjectRepository)(project).path,
|
|
1172
1263
|
workspacePaths: () => { const primary = (0, project_repositories_1.resolveProjectRepository)(project); return primary.workspacePaths ?? (primary.workspacePath ? [primary.workspacePath] : undefined); },
|
|
1173
|
-
|
|
1264
|
+
// `minimal` agent environment: the step's provider names ride along.
|
|
1265
|
+
env: (providerAllowlist) => (0, workspace_resolution_1.resolveLoopBaseEnv)({ slug: project.slug, path: project.path }, undefined, (0, project_env_1.resolveProjectAgentEnv)(db, { providerAllowlist })),
|
|
1174
1266
|
// One value-free run-log line when configured names are unresolved.
|
|
1175
1267
|
environmentNotice: () => (0, project_env_1.worktreeEnvPassthroughWarning)(db, (0, project_env_1.applyWorktreeEnvPassthrough)(db, process.env)),
|
|
1268
|
+
// Phase-3 project switches Core reads from its config (capability-gated in the bridge).
|
|
1269
|
+
projectRuntime: () => ({ baselineOnTouch: (0, db_2.getProjectSettings)(db).baselineOnTouch }),
|
|
1176
1270
|
// Named rail profiles and global per-agent defaults ride the same
|
|
1177
1271
|
// SPECRAILS_PROFILE_PATH snapshot in both AI transports. An explicit null
|
|
1178
1272
|
// rail selection opts out; omitted selections keep Core's default rules.
|
|
@@ -1181,7 +1275,7 @@ class ProjectRegistry {
|
|
|
1181
1275
|
profileRoot: () => (0, workspace_resolution_1.resolveProjectExecution)({ slug: project.slug, path: project.path }).cwd,
|
|
1182
1276
|
supportsProfiles: project_profile_support_1.projectSupportsProfiles,
|
|
1183
1277
|
}),
|
|
1184
|
-
}));
|
|
1278
|
+
}), undefined, { dailyBudget: dailyBudgetRejection, runCapDefault, agentAudit: agentAudit.recorder, onDefinitionInvocationEnd: (runId, ticketIds) => publishRunClarifications(runId, ticketIds) });
|
|
1185
1279
|
const getTicketSpec = (ticketId) => {
|
|
1186
1280
|
try {
|
|
1187
1281
|
const exec = (0, workspace_resolution_1.resolveProjectExecution)({ slug: project.slug, path: project.path });
|
|
@@ -1193,7 +1287,8 @@ class ProjectRegistry {
|
|
|
1193
1287
|
return {
|
|
1194
1288
|
id: t.id,
|
|
1195
1289
|
title: t.title,
|
|
1196
|
-
description
|
|
1290
|
+
// Non-goals (3.2) ride in the description every loop prompt sees.
|
|
1291
|
+
description: (0, non_goals_1.descriptionWithNonGoals)(t.description, t.nonGoals),
|
|
1197
1292
|
status: t.status,
|
|
1198
1293
|
priority: t.priority,
|
|
1199
1294
|
labels: t.labels,
|
|
@@ -1264,6 +1359,8 @@ class ProjectRegistry {
|
|
|
1264
1359
|
}
|
|
1265
1360
|
}
|
|
1266
1361
|
const ticketIds = payload?.ticketIds ?? meta?.ticketIds ?? [];
|
|
1362
|
+
// Idempotent per record: a pause already posted is not posted again.
|
|
1363
|
+
publishRunClarifications(runId, ticketIds);
|
|
1267
1364
|
const railIndex = payload?.railIndex ?? meta?.railIndex ?? null;
|
|
1268
1365
|
const effectiveOutcome = payload?.outcome ?? outcome;
|
|
1269
1366
|
const status = effectiveOutcome === 'success' ? 'completed'
|
|
@@ -1325,7 +1422,10 @@ class ProjectRegistry {
|
|
|
1325
1422
|
if (store && effectTicketIds.length > 0) {
|
|
1326
1423
|
try {
|
|
1327
1424
|
if (status === 'completed' && completedStatus === 'on_review') {
|
|
1328
|
-
|
|
1425
|
+
// Flow specs: the Flow settlement creates the Jira issue first and
|
|
1426
|
+
// then transitions it; an early review here would be a no-op at
|
|
1427
|
+
// best and a double transition at worst.
|
|
1428
|
+
const reviewIds = effectTicketIds.filter((ticketId) => store?.tickets[String(ticketId)]?.status === 'on_review' && !(0, ticket_store_1.isFlowHeldTicket)(store?.tickets[String(ticketId)]));
|
|
1329
1429
|
jiraSyncManager.onRailReview(reviewIds, runId);
|
|
1330
1430
|
}
|
|
1331
1431
|
else {
|
|
@@ -1350,6 +1450,15 @@ class ProjectRegistry {
|
|
|
1350
1450
|
});
|
|
1351
1451
|
const delivered = deliver();
|
|
1352
1452
|
railLoopRuns.delete(runId);
|
|
1453
|
+
// Flow hand-off without a PR delivery row: the completed run settles the
|
|
1454
|
+
// Flow (with a delivery row, the `rail.pr_state` observer does).
|
|
1455
|
+
if (status === 'completed' && flowService) {
|
|
1456
|
+
for (const ticketId of ticketIds) {
|
|
1457
|
+
const flowId = delivered.store?.tickets[String(ticketId)]?.metadata?.flow?.flowId;
|
|
1458
|
+
if (flowId)
|
|
1459
|
+
void flowService.onRailRunCompleted({ flowId, runId }).catch((err) => console.error('[flow] run settlement failed:', err));
|
|
1460
|
+
}
|
|
1461
|
+
}
|
|
1353
1462
|
// Milestone chain fallback hook: records the engine outcome (names the
|
|
1354
1463
|
// pause reason) and settles delivery-less chunks. Isolated chunks
|
|
1355
1464
|
// advance from the later `rail.pr_state` settle instead.
|
|
@@ -1504,8 +1613,51 @@ class ProjectRegistry {
|
|
|
1504
1613
|
persistDone: (milestoneId) => (0, milestone_progress_1.markMilestoneDone)(blueprintWorkspace(), milestoneId) !== null,
|
|
1505
1614
|
broadcast: boundBroadcast,
|
|
1506
1615
|
});
|
|
1507
|
-
const ctx = { project, db, queueManager, chatManager, setupManager, proposalManager, agentRefineManager, fileSummaryManager, specLauncherManager, ticketWatcher, browserCaptureManager, jiraSyncManager, stuckRunDetector, broadcast: boundBroadcast, railJobs, loopRunManager, railLoopRuns, onLoopRunFinished, getTicketSpec, desktopDb: this._desktopDb, milestoneProgress };
|
|
1616
|
+
const ctx = { project, db, queueManager, chatManager, setupManager, proposalManager, agentRefineManager, fileSummaryManager, specLauncherManager, ticketWatcher, browserCaptureManager, jiraSyncManager, stuckRunDetector, broadcast: boundBroadcast, railJobs, loopRunManager, railLoopRuns, onLoopRunFinished, getTicketSpec, desktopDb: this._desktopDb, milestoneProgress, dailyBudgetRejection, dailyBudgetHeadroom, budgetCaps, runCapDefault, reviewWipGate, agentAudit };
|
|
1508
1617
|
ctx.milestoneChains = milestoneChains;
|
|
1618
|
+
// Spec triage (launch-triage): cheap per-spec loop recommendation. Seeded
|
|
1619
|
+
// now so the existing backlog is only triaged on edit or on demand.
|
|
1620
|
+
specTriage = new triage_1.SpecTriageService({
|
|
1621
|
+
project, db, ticketsPath: ticketStorePath, broadcast: boundBroadcast,
|
|
1622
|
+
notifyDesktopWrite: (revision) => ticketWatcher.notifyDesktopWrite(revision),
|
|
1623
|
+
});
|
|
1624
|
+
specTriage.start();
|
|
1625
|
+
ctx.specTriage = specTriage;
|
|
1626
|
+
// Recently deleted specs: purge past the 30-day window at startup and on a timer.
|
|
1627
|
+
ctx.trashPurge = (0, ticket_trash_service_1.startProjectTrashPurge)({
|
|
1628
|
+
ticketStorePath,
|
|
1629
|
+
db,
|
|
1630
|
+
deleteAttachments: (ticketKey) => attachment_manager_1.attachmentManager.deleteAll(project.slug, ticketKey),
|
|
1631
|
+
forgetExploreConversation: (conversationId) => {
|
|
1632
|
+
chatManager?.forgetSpecDraft(conversationId);
|
|
1633
|
+
chatManager?.forgetExploreLifecycle(conversationId);
|
|
1634
|
+
},
|
|
1635
|
+
});
|
|
1636
|
+
// Flow mode: use cases bound to THIS project's connection; the mission host
|
|
1637
|
+
// is app-global and late-bound (agent chat starts after the registry).
|
|
1638
|
+
const flowRepository = (0, sqlite_1.createSqliteFlowRepository)(db);
|
|
1639
|
+
const flowPorts = (0, bindings_1.createFlowPorts)({
|
|
1640
|
+
ctx, repository: flowRepository, effects: (0, sqlite_1.createSqliteFlowEffectsStore)(db), internalApi, availability: () => (0, core_sessions_availability_1.flowAvailability)(),
|
|
1641
|
+
agentHost: () => (0, agent_chat_registry_1.getAgentChatManager)(),
|
|
1642
|
+
// Dev servers the Flow agent started in the worktree stop with the Flow.
|
|
1643
|
+
processes: {
|
|
1644
|
+
async stop({ flowId }) {
|
|
1645
|
+
const { unresolved } = await (0, transient_children_1.stopBackgroundProcessesForFlow)(flowId, project.id);
|
|
1646
|
+
if (unresolved.length)
|
|
1647
|
+
console.warn(`[flow] ${unresolved.length} background process(es) of Flow ${flowId} did not confirm exit`);
|
|
1648
|
+
},
|
|
1649
|
+
},
|
|
1650
|
+
});
|
|
1651
|
+
ctx.flow = (0, flow_1.createFlowService)(flowPorts);
|
|
1652
|
+
flowService = ctx.flow;
|
|
1653
|
+
ctx.flowHandOff = (0, bindings_1.createFlowHandOffAuthority)(flowRepository, bindings_1.systemClock, (session) => flowPorts.notifier.changed(session),
|
|
1654
|
+
// Flow -> Spec: the bounded conversation summary Core's derive-change reads.
|
|
1655
|
+
(session) => (0, bindings_1.flowConversationSummary)(this._desktopDb, {
|
|
1656
|
+
conversationId: session.conversationId,
|
|
1657
|
+
idea: session.ticketId !== null ? getTicketSpec(session.ticketId)?.description ?? null : null,
|
|
1658
|
+
from: session.createdAt,
|
|
1659
|
+
to: null,
|
|
1660
|
+
}));
|
|
1509
1661
|
this._contexts.set(project.id, ctx);
|
|
1510
1662
|
// Warm the project's login-shell env cache off the event loop so the first
|
|
1511
1663
|
// rail/loop spawn reads recovered credentials instead of a cold 1.5 s probe.
|
|
@@ -1529,6 +1681,20 @@ class ProjectRegistry {
|
|
|
1529
1681
|
.then(async (n) => {
|
|
1530
1682
|
if (n > 0)
|
|
1531
1683
|
console.log(`[loops] reconciled ${n} orphan worktree(s) for ${project.slug}`);
|
|
1684
|
+
// Flow sessions never survive a restart; unfinished sagas complete
|
|
1685
|
+
// or compensate before admission opens (never throws).
|
|
1686
|
+
if (this._contexts.get(project.id) === ctx && ctx.flow) {
|
|
1687
|
+
const flows = await ctx.flow.reconcile();
|
|
1688
|
+
if (flows.length > 0)
|
|
1689
|
+
console.log(`[flow] reconciled ${flows.length} Flow session(s) for ${project.slug}`);
|
|
1690
|
+
// Settlement effects survive restarts: deliveries that reached
|
|
1691
|
+
// review while the app was down settle now; pending effects resume.
|
|
1692
|
+
const settled = await ctx.flow.replaySettlement();
|
|
1693
|
+
if (settled > 0)
|
|
1694
|
+
console.log(`[flow] resumed settlement of ${settled} Flow(s) for ${project.slug}`);
|
|
1695
|
+
if (this._contexts.get(project.id) === ctx && !ctx.flowSettlement)
|
|
1696
|
+
ctx.flowSettlement = (0, bindings_1.startFlowSettlementScheduler)(ctx.flow);
|
|
1697
|
+
}
|
|
1532
1698
|
if (this._contexts.get(project.id) === ctx) {
|
|
1533
1699
|
const effectDeps = {
|
|
1534
1700
|
db,
|
|
@@ -1552,8 +1718,30 @@ class ProjectRegistry {
|
|
|
1552
1718
|
});
|
|
1553
1719
|
if (!ticketEffects.settled || this._contexts.get(project.id) !== ctx)
|
|
1554
1720
|
return;
|
|
1721
|
+
// "Integrate locally" saved the person's uncommitted work as a
|
|
1722
|
+
// stash and the app stopped before restoring it: re-apply now,
|
|
1723
|
+
// before admission opens (never throws; conflicts keep the stash).
|
|
1724
|
+
const restoredLocalChanges = await (0, rail_pr_decision_1.recoverLocalStashes)({ ...effectDeps, git: worktree_manager_1.defaultGitRunner, exec: pr_publisher_1.defaultExec });
|
|
1725
|
+
for (const deliveryId of restoredLocalChanges)
|
|
1726
|
+
emitRecoveredPrDelivery(ctx, deliveryId);
|
|
1727
|
+
if (this._contexts.get(project.id) !== ctx)
|
|
1728
|
+
return;
|
|
1555
1729
|
reprojectActivePrDeliveries(ctx);
|
|
1556
1730
|
(0, process_admission_1.openProjectProcessAdmission)(project.id);
|
|
1731
|
+
// Flow -> Spec deliveries settled as a generic failure before the
|
|
1732
|
+
// review outcome existed: persist the reclassification once (the
|
|
1733
|
+
// retained ledger is read-only here) and refresh their cards.
|
|
1734
|
+
void (0, flow_review_legacy_1.healLegacyFlowReviews)({
|
|
1735
|
+
db,
|
|
1736
|
+
pipelineDir: path_1.default.join((0, workspace_resolution_1.resolveProjectExecution)({ slug: project.slug, path: project.path }).specrailsDir, 'pipeline'),
|
|
1737
|
+
probe: (runIds) => (0, loop_definition_recovery_1.probeDefinitionRuns)({ db, cwd: project.path, env: process.env }, runIds, true),
|
|
1738
|
+
isDefinitionRun: (runId) => (0, loop_runs_store_1.getLoopRun)(db, runId)?.engine_version === 2,
|
|
1739
|
+
}).then((ids) => {
|
|
1740
|
+
if (this._contexts.get(project.id) !== ctx)
|
|
1741
|
+
return;
|
|
1742
|
+
for (const deliveryId of ids)
|
|
1743
|
+
emitRecoveredPrDelivery(ctx, deliveryId);
|
|
1744
|
+
});
|
|
1557
1745
|
}
|
|
1558
1746
|
})
|
|
1559
1747
|
.catch((err) => {
|
|
@@ -1637,6 +1825,55 @@ class ProjectRegistry {
|
|
|
1637
1825
|
return false;
|
|
1638
1826
|
}
|
|
1639
1827
|
}
|
|
1828
|
+
/** App-wide daily budget state. The queue auto-pause and the rail/loop
|
|
1829
|
+
* admission gate read this same snapshot, so both doors agree. */
|
|
1830
|
+
_desktopDailyBudgetSnapshot() {
|
|
1831
|
+
const val = (0, desktop_db_1.getDesktopSetting)(this._desktopDb, 'desktop_daily_budget_usd');
|
|
1832
|
+
const budget = val != null ? parseFloat(val) : null;
|
|
1833
|
+
let totalSpend = 0;
|
|
1834
|
+
for (const c of this.listContexts()) {
|
|
1835
|
+
const row = c.db.prepare(`SELECT COALESCE(SUM(total_cost_usd), 0) as total FROM jobs WHERE status = 'completed' AND total_cost_usd IS NOT NULL AND started_at >= date('now')`).get();
|
|
1836
|
+
totalSpend += row.total;
|
|
1837
|
+
}
|
|
1838
|
+
return { budget, totalSpend };
|
|
1839
|
+
}
|
|
1840
|
+
/** App-wide caps (all projects combined) as configured in desktop settings. */
|
|
1841
|
+
_desktopCapConfig() {
|
|
1842
|
+
return (0, budget_storage_1.readDesktopCaps)((key) => (0, desktop_db_1.getDesktopSetting)(this._desktopDb, key));
|
|
1843
|
+
}
|
|
1844
|
+
/** App-wide weekly/monthly cap with the spend of EVERY project in the local period containing `at`. */
|
|
1845
|
+
_desktopPeriodSnapshot(period, at) {
|
|
1846
|
+
const budget = this._desktopCapConfig()[period];
|
|
1847
|
+
if (budget === null)
|
|
1848
|
+
return { budget: null, totalSpend: 0 };
|
|
1849
|
+
const since = (0, execution_1.periodStartIso)(period, at);
|
|
1850
|
+
let totalSpend = 0;
|
|
1851
|
+
for (const c of this.listContexts()) {
|
|
1852
|
+
try {
|
|
1853
|
+
totalSpend += (0, budget_storage_1.projectSpendSince)(c.db, c.project.id, since);
|
|
1854
|
+
}
|
|
1855
|
+
catch { /* an unreadable project adds nothing (fail-open) */ }
|
|
1856
|
+
}
|
|
1857
|
+
return { budget, totalSpend };
|
|
1858
|
+
}
|
|
1859
|
+
/** The app-wide caps with their spend (all projects combined), for the Budget panel. */
|
|
1860
|
+
desktopCapStatuses(at = new Date()) {
|
|
1861
|
+
const out = [];
|
|
1862
|
+
const day = this._desktopDailyBudgetSnapshot();
|
|
1863
|
+
const push = (period, snapshot, resetsAt) => {
|
|
1864
|
+
if (snapshot.budget == null || !(snapshot.budget > 0))
|
|
1865
|
+
return;
|
|
1866
|
+
out.push({ scope: 'desktop', period, budgetUsd: snapshot.budget, spentUsd: snapshot.totalSpend, exhausted: (0, execution_1.isCapExceeded)(snapshot.budget, snapshot.totalSpend), resetsAt });
|
|
1867
|
+
};
|
|
1868
|
+
push('day', day, (0, execution_1.dailyBudgetResetsAt)('desktop', at));
|
|
1869
|
+
push('week', this._desktopPeriodSnapshot('week', at), (0, execution_1.periodResetsAtIso)('week', at));
|
|
1870
|
+
push('month', this._desktopPeriodSnapshot('month', at), (0, execution_1.periodResetsAtIso)('month', at));
|
|
1871
|
+
return out;
|
|
1872
|
+
}
|
|
1873
|
+
/** Every cap of one project plus the app-wide ones, with spend. */
|
|
1874
|
+
_capStatuses(db, projectId, at = new Date()) {
|
|
1875
|
+
return (0, daily_budget_gate_1.readCapStatuses)({ db, projectId, desktop: () => this._desktopDailyBudgetSnapshot(), desktopPeriod: (period, when) => this._desktopPeriodSnapshot(period, when) }, at);
|
|
1876
|
+
}
|
|
1640
1877
|
/** Enforce the app-wide budget through every per-project queue authority. */
|
|
1641
1878
|
_pauseAllQueuesForDesktopBudget() {
|
|
1642
1879
|
for (const context of this.listContexts()) {
|
|
@@ -4,6 +4,19 @@ exports.registerBackgroundProcessRoutes = registerBackgroundProcessRoutes;
|
|
|
4
4
|
const transient_children_1 = require("./transient-children");
|
|
5
5
|
const project_repositories_1 = require("./project-repositories");
|
|
6
6
|
const background_process_service_1 = require("./modules/terminals/runtime/background-process-service");
|
|
7
|
+
const app_urls_1 = require("./modules/terminals/runtime/app-urls");
|
|
8
|
+
/** The chat's ACTIVE Flow with a worktree (null when none or the lookup fails). */
|
|
9
|
+
function activeFlow(c, chatId) {
|
|
10
|
+
try {
|
|
11
|
+
const flow = c.flow?.getByConversation(chatId);
|
|
12
|
+
if (!flow || flow.state !== 'active' || flow.step !== null || !flow.worktreePath)
|
|
13
|
+
return null;
|
|
14
|
+
return { flowId: flow.id, worktreePath: flow.worktreePath, ...(flow.repositoryId ? { repositoryId: flow.repositoryId } : {}) };
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
7
20
|
function processQuery(req, res) {
|
|
8
21
|
const pid = Number(req.params.pid);
|
|
9
22
|
if (!Number.isSafeInteger(pid) || pid <= 0) {
|
|
@@ -27,7 +40,7 @@ function registerBackgroundProcessRoutes({ router, ctx }) {
|
|
|
27
40
|
const c = ctx(req);
|
|
28
41
|
const chatId = typeof req.query.chatId === 'string' && req.query.chatId.trim() ? req.query.chatId.trim() : undefined;
|
|
29
42
|
res.json({ processes: (0, transient_children_1.listBackgroundProcesses)({ projectId: c.project.id,
|
|
30
|
-
...(chatId ? { chatId } : {}), ...(req.query.includeFinished === 'true' ? { includeFinished: true } : {}) }) });
|
|
43
|
+
...(chatId ? { chatId } : {}), ...(req.query.includeFinished === 'true' ? { includeFinished: true } : {}) }).map(app_urls_1.withAppUrls) });
|
|
31
44
|
});
|
|
32
45
|
router.get('/:projectId/background-processes/:pid/logs', (req, res) => {
|
|
33
46
|
const c = ctx(req);
|
|
@@ -45,7 +58,7 @@ function registerBackgroundProcessRoutes({ router, ctx }) {
|
|
|
45
58
|
res.status(404).json({ error: 'background process logs not found for project/chat or execution has expired' });
|
|
46
59
|
return;
|
|
47
60
|
}
|
|
48
|
-
res.json(logs);
|
|
61
|
+
res.json({ ...logs, process: (0, app_urls_1.withAppUrls)(logs.process) });
|
|
49
62
|
});
|
|
50
63
|
router.post('/:projectId/background-processes', (req, res) => {
|
|
51
64
|
const { command, cwd, chatId, repositoryId, confirmed, allowWhileBusy } = req.body ?? {};
|
|
@@ -70,7 +83,18 @@ function registerBackgroundProcessRoutes({ router, ctx }) {
|
|
|
70
83
|
}
|
|
71
84
|
if (repositoryId !== undefined && (typeof repositoryId !== 'string' || !repositoryId.trim()))
|
|
72
85
|
throw new project_repositories_1.RepositoryValidationError('repositoryId must be a nonempty string');
|
|
73
|
-
|
|
86
|
+
const multiRepository = (0, project_repositories_1.getProjectRepositories)(c.project).length > 1;
|
|
87
|
+
// Inside an ACTIVE Flow of a multi-repository project the repository is
|
|
88
|
+
// the Flow's own: the process runs in the Flow worktree, tagged with the
|
|
89
|
+
// Flow so it stops with it (as the in-app agent's background_start does).
|
|
90
|
+
const flow = multiRepository && repositoryId === undefined ? activeFlow(c, chatId.trim()) : null;
|
|
91
|
+
if (flow) {
|
|
92
|
+
const repository = (0, project_repositories_1.resolveProjectRepository)(c.project, flow.repositoryId);
|
|
93
|
+
const process = (0, transient_children_1.startBackgroundProcess)(command.trim(), (0, background_process_service_1.resolveBackgroundCwd)(flow.worktreePath, cwd, 'the Flow worktree'), chatId.trim(), c.project.id, (0, background_process_service_1.backgroundProcessHooks)(c.broadcast), { repositoryId: repository.id, repositoryName: repository.name, flowId: flow.flowId });
|
|
94
|
+
res.status(202).json({ ok: true, repositoryId: repository.id, flowId: flow.flowId, process });
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (multiRepository && repositoryId === undefined)
|
|
74
98
|
throw new project_repositories_1.RepositoryValidationError('repositoryId is required for multi-repository projects', 'repository_required');
|
|
75
99
|
const repository = (0, project_repositories_1.resolveProjectRepository)(c.project, repositoryId);
|
|
76
100
|
const process = (0, transient_children_1.startBackgroundProcess)(command.trim(), (0, background_process_service_1.resolveBackgroundCwd)(repository.path, cwd), chatId.trim(), c.project.id, (0, background_process_service_1.backgroundProcessHooks)(c.broadcast), { repositoryId: repository.id, repositoryName: repository.name });
|
|
@@ -155,4 +155,34 @@ function registerGitRoutes(deps) {
|
|
|
155
155
|
res.status(500).json({ error: 'Checkout failed' });
|
|
156
156
|
}
|
|
157
157
|
});
|
|
158
|
+
// "Create initial commit" for a repository with an unborn HEAD (shown next to
|
|
159
|
+
// `repository_has_no_commits`). Primary repository only; an empty commit with
|
|
160
|
+
// zero files, under the repository lock. 409 when it already has commits or
|
|
161
|
+
// Git has no author identity.
|
|
162
|
+
router.post('/:projectId/git/initial-commit', async (req, res) => {
|
|
163
|
+
const repository = requireGit(req, res, undefined);
|
|
164
|
+
if (!repository)
|
|
165
|
+
return;
|
|
166
|
+
const project = ctx(req).project;
|
|
167
|
+
try {
|
|
168
|
+
const admission = (0, process_admission_1.captureProcessAdmission)(project.id);
|
|
169
|
+
const result = await (0, repo_lock_1.withRepoLock)(repository.path, async () => {
|
|
170
|
+
admission.assertCurrent();
|
|
171
|
+
return (0, project_git_1.createInitialCommit)(repository.path);
|
|
172
|
+
});
|
|
173
|
+
if (!result.ok) {
|
|
174
|
+
res.status(result.code === 'initial_commit_failed' ? 500 : 409).json({ error: result.code, detail: result.detail, repositoryId: repository.id });
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
res.status(201).json({ sha: result.sha, repositoryId: repository.id });
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
if (err instanceof process_admission_1.ProcessAdmissionClosedError) {
|
|
181
|
+
res.status(409).json({ error: 'project_recovery_in_progress' });
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
console.error('[project-git] initial commit failed:', err);
|
|
185
|
+
res.status(500).json({ error: 'initial_commit_failed', detail: err instanceof Error ? err.message : String(err) });
|
|
186
|
+
}
|
|
187
|
+
});
|
|
158
188
|
}
|