specrails-desktop 2.64.2 → 2.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/cli/dist/status.js +3 -0
- package/client/dist/assets/ActivityFeedPage-ByVKYII-.js +1 -0
- package/client/dist/assets/AgentBrowserCapture-BGUTjhUr.js +1 -0
- package/client/dist/assets/AgentModeAnalyticsPane-CtOLDDjB.js +2 -0
- package/client/dist/assets/AgentModeCodePane-CDhUKarT.js +2 -0
- package/client/dist/assets/AgentModeJobsPane-BAa_oEHJ.js +1 -0
- package/client/dist/assets/AgentsPage-D32hG4Ve.js +120 -0
- package/client/dist/assets/AnalyticsPage-BU50zeG6.js +5 -0
- package/client/dist/assets/BudgetCard-DP_jxwaD.js +55 -0
- package/client/dist/assets/CodePage-jiYnKGpp.js +3 -0
- package/client/dist/assets/CostValue-Bvn8674q.js +1 -0
- package/client/dist/assets/DesktopAnalyticsPage-CF__H4e3.js +1 -0
- package/client/dist/assets/DocView-RrAp70zp.js +11 -0
- package/client/dist/assets/DocsDialog-DkqHU-JF.js +1 -0
- package/client/dist/assets/DocsPage-C6X089zC.js +1 -0
- package/client/dist/assets/ExportDropdown-C5-o8y3K.js +1 -0
- package/client/dist/assets/HelpHint-Crf9_uoR.js +1 -0
- package/client/dist/assets/IntegrationsPage-aflU3KHK.js +1 -0
- package/client/dist/assets/InteractiveJobComposer-CEMMhyyJ.js +19 -0
- package/client/dist/assets/JobDetailModal-BVJ6hyRs.js +1 -0
- package/client/dist/assets/JobDetailPage-DHzBUmox.js +1 -0
- package/client/dist/assets/JobsPage-o-LAqkwC.js +1 -0
- package/client/dist/assets/LoopBuilderPage-DbSVmXBM.js +1 -0
- package/client/dist/assets/LoopPreviewModal-DbJcVyN1.js +1 -0
- package/client/dist/assets/{LoopWindowSurface-DE0v2K1p.js → LoopWindowSurface-Co1ZK26V.js} +1 -1
- package/client/dist/assets/LoopsPage-C4lgkPXB.js +2 -0
- package/client/dist/assets/MinimizedChatsContext-742ypO8n.js +1 -0
- package/client/dist/assets/PluginsPage-Acks9ges.js +2 -0
- package/client/dist/assets/RailTrack-BfLmBzBh.js +1 -0
- package/client/dist/assets/{RepositoryScopeSelector-2eSqR9WK.js → RepositoryScopeSelector-DcxbKI9w.js} +1 -1
- package/client/dist/assets/ReviewPacketPage-CAVSIOAJ.js +7 -0
- package/client/dist/assets/TemplatePreviewModal-C23SYCTm.js +1 -0
- package/client/dist/assets/TicketDetailModalContext-B-Gtm6Ob.js +23 -0
- package/client/dist/assets/Trans-C6J0cLyh.js +1 -0
- package/client/dist/assets/a11y-prefs-BqoP5goK.js +1 -0
- package/client/dist/assets/activity-BBWfoUOG.js +1 -0
- package/client/dist/assets/activity-BM_skann.js +1 -0
- package/client/dist/assets/activity-Cevl82ke.js +1 -0
- package/client/dist/assets/activity-CmACk5W5.js +1 -0
- package/client/dist/assets/activity-D9LBw3PQ.js +1 -0
- package/client/dist/assets/activity-Dspbb9lz.js +1 -0
- package/client/dist/assets/activity-FPjYIjv9.js +1 -0
- package/client/dist/assets/activity-nLCKMUKt.js +1 -0
- package/client/dist/assets/addspec-BI4jDMhA.js +1 -0
- package/client/dist/assets/addspec-BldTv7Tl.js +1 -0
- package/client/dist/assets/addspec-Cdq-2EcC.js +1 -0
- package/client/dist/assets/addspec-DH5M16BQ.js +1 -0
- package/client/dist/assets/addspec-DOFo9pD5.js +1 -0
- package/client/dist/assets/addspec-DPkwhdmL.js +1 -0
- package/client/dist/assets/addspec-Dzy12Pv3.js +1 -0
- package/client/dist/assets/addspec-skTs6EEW.js +1 -0
- package/client/dist/assets/agent-B_UEUy7Y.js +1 -0
- package/client/dist/assets/agent-BarjlhTA.js +1 -0
- package/client/dist/assets/agent-BfqIITo5.js +1 -0
- package/client/dist/assets/agent-Bt9a7Kyj.js +1 -0
- package/client/dist/assets/agent-C3689RwP.js +1 -0
- package/client/dist/assets/agent-CrmboTAi.js +1 -0
- package/client/dist/assets/agent-DcsoTnuE.js +1 -0
- package/client/dist/assets/agent-GDZoYwd4.js +1 -0
- package/client/dist/assets/{agentRuntime-es2ymSl-.js → agentRuntime-BYH70bKY.js} +1 -1
- package/client/dist/assets/agentRuntime-BijLh8I9.js +1 -0
- package/client/dist/assets/{agentRuntime-BzuwQQgn.js → agentRuntime-BvyuETPe.js} +1 -1
- package/client/dist/assets/{agentRuntime-BDvbJMmS.js → agentRuntime-C2WI6HQh.js} +1 -1
- package/client/dist/assets/{agentRuntime-BKJfv5YD.js → agentRuntime-CZPIlQsr.js} +1 -1
- package/client/dist/assets/{agentRuntime-DiCldqGG.js → agentRuntime-D2dDvCyJ.js} +1 -1
- package/client/dist/assets/agentRuntime-DWZedEbn.js +1 -0
- package/client/dist/assets/agentRuntime-DkIruUNw.js +1 -0
- package/client/dist/assets/agents-35_PDKx9.js +1 -0
- package/client/dist/assets/agents-8fZnHhEQ.js +1 -0
- package/client/dist/assets/agents-Bgimtw8z.js +1 -0
- package/client/dist/assets/agents-C4P160Us.js +1 -0
- package/client/dist/assets/agents-Clg67zbp.js +1 -0
- package/client/dist/assets/agents-DJfF4o6G.js +1 -0
- package/client/dist/assets/agents-Dc9-Y5cw.js +1 -0
- package/client/dist/assets/agents-EN1Zl4YZ.js +1 -0
- package/client/dist/assets/agentstudio-Bm4-NYaG.js +1 -0
- package/client/dist/assets/agentstudio-CD1fuj2o.js +1 -0
- package/client/dist/assets/agentstudio-CQGWFSst.js +1 -0
- package/client/dist/assets/agentstudio-CqVSb65S.js +1 -0
- package/client/dist/assets/agentstudio-DIE_HjsX.js +1 -0
- package/client/dist/assets/agentstudio-D_OmQK-k.js +1 -0
- package/client/dist/assets/agentstudio-Djz9aUfb.js +1 -0
- package/client/dist/assets/agentstudio-Qa3v9o5J.js +1 -0
- package/client/dist/assets/{aiedit-DNXxq_Dr.js → aiedit-1VzLs37W.js} +1 -1
- package/client/dist/assets/{aiedit-DCjA7jLJ.js → aiedit-BNp6GSik.js} +1 -1
- package/client/dist/assets/{aiedit-BoG24nlg.js → aiedit-BOY5xRPi.js} +1 -1
- package/client/dist/assets/{aiedit-iIjz2_Qk.js → aiedit-BrqMZvbc.js} +1 -1
- package/client/dist/assets/{aiedit-CjlSRQVP.js → aiedit-CVgtl7hm.js} +1 -1
- package/client/dist/assets/{aiedit-DQ-0_pvE.js → aiedit-CrFW9Jd2.js} +1 -1
- package/client/dist/assets/{aiedit-olnv3QSt.js → aiedit-YE2lILp7.js} +1 -1
- package/client/dist/assets/{aiedit-B0KUbpB6.js → aiedit-iA_R1AVQ.js} +1 -1
- package/client/dist/assets/analytics-3w0t-4ic.js +1 -0
- package/client/dist/assets/analytics-BRi4KQD6.js +1 -0
- package/client/dist/assets/analytics-BtjAqzke.js +1 -0
- package/client/dist/assets/analytics-COSQ1h47.js +1 -0
- package/client/dist/assets/analytics-CP2HjESk.js +1 -0
- package/client/dist/assets/analytics-DY65TC62.js +1 -0
- package/client/dist/assets/analytics-Den_vvxn.js +1 -0
- package/client/dist/assets/analytics-LmBS96O8.js +1 -0
- package/client/dist/assets/api-DOGbyfTO.js +2 -0
- package/client/dist/assets/builder-BMVvSr4v.js +1 -0
- package/client/dist/assets/builder-BN-MuLZt.js +1 -0
- package/client/dist/assets/builder-BQOZi4CF.js +1 -0
- package/client/dist/assets/builder-BjUPjsyu.js +1 -0
- package/client/dist/assets/builder-BoBtN18T.js +1 -0
- package/client/dist/assets/builder-C5g5NhxL.js +1 -0
- package/client/dist/assets/builder-RUHXw3yx.js +1 -0
- package/client/dist/assets/builder-fyS_AiyC.js +1 -0
- package/client/dist/assets/button-CHPkroew.js +1 -0
- package/client/dist/assets/chat-C9L5T7KI.js +1 -0
- package/client/dist/assets/chevron-right-CwMAj0w_.js +1 -0
- package/client/dist/assets/chevron-up-BAMuP0XD.js +1 -0
- package/client/dist/assets/chunk-OB3PAWPO-BBaq6pUk.js +3 -0
- package/client/dist/assets/code-4le5IIbf.js +1 -0
- package/client/dist/assets/code-B-jCVIbm.js +1 -0
- package/client/dist/assets/code-BRfrn5ix.js +1 -0
- package/client/dist/assets/code-CC9NCrDM.js +1 -0
- package/client/dist/assets/code-CK6pm8wY.js +1 -0
- package/client/dist/assets/code-DDiOzd6c.js +1 -0
- package/client/dist/assets/code-tGifiyf5.js +1 -0
- package/client/dist/assets/code-xkn8kQTg.js +1 -0
- package/client/dist/assets/commands-Bv1QshHR.js +1 -0
- package/client/dist/assets/commands-BvxTxboW.js +1 -0
- package/client/dist/assets/commands-C5ORR0fO.js +1 -0
- package/client/dist/assets/commands-CBKMFSTV.js +1 -0
- package/client/dist/assets/commands-CFJIRsJv.js +1 -0
- package/client/dist/assets/commands-D9o3ZcXl.js +1 -0
- package/client/dist/assets/commands-DNox0Edk.js +1 -0
- package/client/dist/assets/commands-DmIUMLdV.js +1 -0
- package/client/dist/assets/common-5H4TkaoI.js +1 -0
- package/client/dist/assets/common-9S3OdPjx.js +1 -0
- package/client/dist/assets/common-BqnwIcjs.js +1 -0
- package/client/dist/assets/common-CQP3VafS.js +1 -0
- package/client/dist/assets/common-CZnAfkB2.js +1 -0
- package/client/dist/assets/common-D5sNttV4.js +1 -0
- package/client/dist/assets/common-k_qX9nlv.js +1 -0
- package/client/dist/assets/common-s4HIi9XI.js +1 -0
- package/client/dist/assets/compass-B7guwBlY.js +1 -0
- package/client/dist/assets/confirm-dialog-ChZdHL3Q.js +1 -0
- package/client/dist/assets/copy-DOPlLymH.js +1 -0
- package/client/dist/assets/core-BozBzB6Y.js +1 -0
- package/client/dist/assets/dashboard-6zGLGcEz.js +1 -0
- package/client/dist/assets/dashboard-8Gi0FBDq.js +1 -0
- package/client/dist/assets/dashboard-B7E5YrSy.js +1 -0
- package/client/dist/assets/dashboard-BhdKV8xK.js +1 -0
- package/client/dist/assets/dashboard-Bu3zzH_s.js +1 -0
- package/client/dist/assets/dashboard-Ce_6rELA.js +1 -0
- package/client/dist/assets/dashboard-DWY-oz8P.js +1 -0
- package/client/dist/assets/dashboard-gUzlWk0o.js +1 -0
- package/client/dist/assets/date-input-Cdlr8kHz.js +1 -0
- package/client/dist/assets/dialog-C23lB2iP.js +5 -0
- package/client/dist/assets/dist-Di-oOFkX.js +1 -0
- package/client/dist/assets/dist-js-CBmS6MsJ.js +1 -0
- package/client/dist/assets/{dist-js-Rlh4FLH5.js → dist-js-DaJmKapi.js} +1 -1
- package/client/dist/assets/dropdown-menu-Bfp2CK6H.js +1 -0
- package/client/dist/assets/empty-state-D5w9OWj-.js +1 -0
- package/client/dist/assets/es2015-DfnECntk.js +41 -0
- package/client/dist/assets/esm-BKF6CE7v.js +1 -0
- package/client/dist/assets/event-BEnMLqAi.js +1 -0
- package/client/dist/assets/explore--NOz9LCN.js +1 -0
- package/client/dist/assets/explore-B2ulH6dO.js +1 -0
- package/client/dist/assets/explore-BD-QiLdg.js +1 -0
- package/client/dist/assets/explore-BOqd4_1j.js +1 -0
- package/client/dist/assets/explore-Be_Zh5zu.js +1 -0
- package/client/dist/assets/explore-CLjzPSKo.js +1 -0
- package/client/dist/assets/explore-D_-vHm29.js +1 -0
- package/client/dist/assets/explore-yEQTF6ro.js +1 -0
- package/client/dist/assets/file-text-CNXzL3wj.js +1 -0
- package/client/dist/assets/format-BODoFIw6.js +1 -0
- package/client/dist/assets/formatDistanceToNow-DLMIOS0N.js +1 -0
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-O61feXch.js +1 -0
- package/client/dist/assets/git-compare-arrows-Cu6tICCq.js +1 -0
- package/client/dist/assets/humanise-command-CB4ybLwq.js +1 -0
- package/client/dist/assets/inbox-BLZ8cm6_.js +1 -0
- package/client/dist/assets/inbox-BQ3VmNYY.js +1 -0
- package/client/dist/assets/inbox-BdcXWCuT.js +1 -0
- package/client/dist/assets/inbox-CF1PHjns.js +1 -0
- package/client/dist/assets/inbox-CFNPDhso.js +1 -0
- package/client/dist/assets/inbox-DIttK_NW.js +1 -0
- package/client/dist/assets/inbox-Dfdv1Ykl.js +1 -0
- package/client/dist/assets/inbox-JS1inmeO.js +1 -0
- package/client/dist/assets/index-4UWY7Xyz.css +2 -0
- package/client/dist/assets/index-DHzB0T26.js +120 -0
- package/client/dist/assets/integrations-BcKgzgPD.js +1 -0
- package/client/dist/assets/integrations-BmX_XyJq.js +1 -0
- package/client/dist/assets/integrations-CHpwMjlY.js +1 -0
- package/client/dist/assets/integrations-CT3kr8e-.js +1 -0
- package/client/dist/assets/integrations-C_5XAkgz.js +1 -0
- package/client/dist/assets/integrations-Ct9zLX7N.js +1 -0
- package/client/dist/assets/integrations-DEYemxUv.js +1 -0
- package/client/dist/assets/integrations-DWvsB_WB.js +1 -0
- package/client/dist/assets/{jira-Cq6yvN4q.js → jira-B_ERkFRv.js} +1 -1
- package/client/dist/assets/jira-Bn-A5lwD.js +1 -0
- package/client/dist/assets/jira-C71Ybnhp.js +1 -0
- package/client/dist/assets/jira-CkwjeJz6.js +1 -0
- package/client/dist/assets/jira-D9pSLXjI.js +1 -0
- package/client/dist/assets/jira-DBRS_lcp.js +1 -0
- package/client/dist/assets/jira-DHS6CsKh.js +1 -0
- package/client/dist/assets/jira-MInHRUb1.js +1 -0
- package/client/dist/assets/jira-api-DHme7Upx.js +1 -0
- package/client/dist/assets/jobs-BMLTDo63.js +1 -0
- package/client/dist/assets/jobs-BO8q4Mi1.js +1 -0
- package/client/dist/assets/jobs-Ck8uOWMM.js +1 -0
- package/client/dist/assets/jobs-CyFfPCpg.js +1 -0
- package/client/dist/assets/jobs-DT5s4fZ6.js +1 -0
- package/client/dist/assets/jobs-DZAgVPcD.js +1 -0
- package/client/dist/assets/jobs-b5gPYaKr.js +1 -0
- package/client/dist/assets/jobs-xsZK1440.js +1 -0
- package/client/dist/assets/launch-forecast-BTa-p3RP.js +1 -0
- package/client/dist/assets/{loop-layout-DtxX27Jz.css → loop-layout-DLioOiRN.css} +1 -1
- package/client/dist/assets/loop-layout-Sl9cfTvs.js +7 -0
- package/client/dist/assets/loops-BEEOVJDR.js +1 -0
- package/client/dist/assets/loops-BcrQ2vk7.js +1 -0
- package/client/dist/assets/loops-BjWxzJIZ.js +1 -0
- package/client/dist/assets/loops-BogV595N.js +1 -0
- package/client/dist/assets/loops-CU0BLZiz.js +1 -0
- package/client/dist/assets/loops-CrNBgi1G.js +1 -0
- package/client/dist/assets/loops-CwalwS_i.js +1 -0
- package/client/dist/assets/loops-_TDVN-fX.js +1 -0
- package/client/dist/assets/mcp-BNs8gxoL.js +1 -0
- package/client/dist/assets/mcp-BvRh_xO5.js +1 -0
- package/client/dist/assets/mcp-C2F1pghi.js +1 -0
- package/client/dist/assets/mcp-D9RLKAs2.js +1 -0
- package/client/dist/assets/mcp-DAghcsR0.js +1 -0
- package/client/dist/assets/mcp-DWWAPi1G.js +1 -0
- package/client/dist/assets/mcp-DbGSFC3f.js +1 -0
- package/client/dist/assets/mcp-FelCicrv.js +1 -0
- package/client/dist/assets/narration-C3NBkAR4.js +1 -0
- package/client/dist/assets/narration-CkoJq-Lf.js +1 -0
- package/client/dist/assets/narration-Cr0NeW9K.js +1 -0
- package/client/dist/assets/narration-DJUXOs-W.js +1 -0
- package/client/dist/assets/narration-DgL8TMvN.js +1 -0
- package/client/dist/assets/narration-DjBafgv0.js +1 -0
- package/client/dist/assets/narration-Dle6Iv0c.js +1 -0
- package/client/dist/assets/narration-MYlfktga.js +1 -0
- package/client/dist/assets/nav-BSQ8KW1c.js +1 -0
- package/client/dist/assets/nav-BauVof8Z.js +1 -0
- package/client/dist/assets/nav-BfOAH1se.js +1 -0
- package/client/dist/assets/nav-D3bOsipX.js +1 -0
- package/client/dist/assets/nav-DOMMhlLx.js +1 -0
- package/client/dist/assets/nav-DPzVlgZU.js +1 -0
- package/client/dist/assets/nav-DZJbFbah.js +1 -0
- package/client/dist/assets/nav-D_5aojd2.js +1 -0
- package/client/dist/assets/notify-error-BsWANx1T.js +1 -0
- package/client/dist/assets/onboarding-BdZQnNm3.js +1 -0
- package/client/dist/assets/onboarding-CJQEv1vp.js +1 -0
- package/client/dist/assets/onboarding-CWJGYUW3.js +1 -0
- package/client/dist/assets/onboarding-ChfYN7dA.js +1 -0
- package/client/dist/assets/onboarding-CjvDUR3V.js +1 -0
- package/client/dist/assets/onboarding-I6vS-zTB.js +1 -0
- package/client/dist/assets/onboarding-dgC_9dTB.js +1 -0
- package/client/dist/assets/onboarding-mlXSyKzX.js +1 -0
- package/client/dist/assets/origin-03nTuaOb.js +1 -0
- package/client/dist/assets/packet-BjpyRnZr.js +1 -0
- package/client/dist/assets/packet-BwgG5mBt.js +1 -0
- package/client/dist/assets/packet-C3eAUFkV.js +1 -0
- package/client/dist/assets/packet-C8wZuSld.js +1 -0
- package/client/dist/assets/packet-CNXEy_85.js +1 -0
- package/client/dist/assets/packet-DsV5Aa_8.js +1 -0
- package/client/dist/assets/packet-aasskOE7.js +1 -0
- package/client/dist/assets/packet-phxCc2gJ.js +1 -0
- package/client/dist/assets/page-header-BStSHkP8.js +1 -0
- package/client/dist/assets/project-repositories-DJPeAVBK.js +1 -0
- package/client/dist/assets/{provider-capabilities-lePfeT_Y.js → provider-capabilities-DtwcTme4.js} +1 -1
- package/client/dist/assets/recovery-BPDOsC92.js +1 -0
- package/client/dist/assets/recovery-BluNHoXM.js +1 -0
- package/client/dist/assets/recovery-CRvEmB0C.js +1 -0
- package/client/dist/assets/recovery-CeIoRnkR.js +1 -0
- package/client/dist/assets/recovery-DHCo8KGi.js +1 -0
- package/client/dist/assets/recovery-OxAIpbBF.js +1 -0
- package/client/dist/assets/recovery-XXexYGOJ.js +1 -0
- package/client/dist/assets/recovery-pITlc--v.js +1 -0
- package/client/dist/assets/refresh-cw-DfyTkbsf.js +1 -0
- package/client/dist/assets/select-xA3pSmqE.js +1 -0
- package/client/dist/assets/settings--yzDbX9r.js +1 -0
- package/client/dist/assets/settings-5_heTv8s.js +1 -0
- package/client/dist/assets/settings-BSf27MDg.js +1 -0
- package/client/dist/assets/settings-BSj6FakR.js +1 -0
- package/client/dist/assets/settings-BZDo_8Nn.js +1 -0
- package/client/dist/assets/settings-BdWgmNc0.js +1 -0
- package/client/dist/assets/settings-DRouxKqb.js +1 -0
- package/client/dist/assets/settings-DnWFoY-F.js +1 -0
- package/client/dist/assets/setup-BJWy62ri.js +1 -0
- package/client/dist/assets/setup-BgKOIuzc.js +1 -0
- package/client/dist/assets/setup-BvVIyUlz.js +1 -0
- package/client/dist/assets/setup-BxCk2pe1.js +1 -0
- package/client/dist/assets/setup-C-xQTL7R.js +1 -0
- package/client/dist/assets/setup-CbaVoiwV.js +1 -0
- package/client/dist/assets/setup-DxTBkX3P.js +1 -0
- package/client/dist/assets/setup-oGoVAzOD.js +1 -0
- package/client/dist/assets/specs-7tAb4IKr.js +1 -0
- package/client/dist/assets/specs-BUcY4s5v.js +1 -0
- package/client/dist/assets/specs-Bk5LeBAA.js +1 -0
- package/client/dist/assets/specs-CAA4Lrlg.js +1 -0
- package/client/dist/assets/specs-CS091AnA.js +1 -0
- package/client/dist/assets/specs-DJ6gmFcK.js +1 -0
- package/client/dist/assets/specs-GfCcrBSC.js +1 -0
- package/client/dist/assets/specs-xQgyc7WL.js +1 -0
- package/client/dist/assets/spending-CVH8VREb.js +1 -0
- package/client/dist/assets/square-Co6h5vZg.js +1 -0
- package/client/dist/assets/tauri-shell-43ixPGfa.js +2 -0
- package/client/dist/assets/terminal-0v9sBylD.js +1 -0
- package/client/dist/assets/terminal-AbUAmCxE.js +1 -0
- package/client/dist/assets/terminal-BJayIbIP.js +1 -0
- package/client/dist/assets/terminal-C2RUlXyi.js +1 -0
- package/client/dist/assets/terminal-CMmSb_Nj.js +1 -0
- package/client/dist/assets/terminal-DKWjj7HJ.js +1 -0
- package/client/dist/assets/terminal-KlFu7_pV.js +1 -0
- package/client/dist/assets/terminal-i99yqFvm.js +1 -0
- package/client/dist/assets/tickets-846Oq3i3.js +1 -0
- package/client/dist/assets/tickets-B5LJTe_b.js +1 -0
- package/client/dist/assets/tickets-Bfo2GGmH.js +1 -0
- package/client/dist/assets/tickets-BhdZ1yY2.js +1 -0
- package/client/dist/assets/tickets-CgjWJHAW.js +1 -0
- package/client/dist/assets/tickets-Ct9DbDUR.js +1 -0
- package/client/dist/assets/tickets-rptLEJB1.js +1 -0
- package/client/dist/assets/tickets-xQ6DpYdu.js +1 -0
- package/client/dist/assets/trending-up-BGvb4zZt.js +1 -0
- package/client/dist/assets/undo-6zuS4-sL.js +1 -0
- package/client/dist/assets/undo-BeM4gDOP.js +1 -0
- package/client/dist/assets/undo-BeppX8xS.js +1 -0
- package/client/dist/assets/undo-BqvNZ5MG.js +1 -0
- package/client/dist/assets/undo-BzwEPf_k.js +1 -0
- package/client/dist/assets/undo-CJ9Cu1NN.js +1 -0
- package/client/dist/assets/undo-ds8nMFbX.js +1 -0
- package/client/dist/assets/undo-x_gA-knG.js +1 -0
- package/client/dist/assets/useDesktop-BuOp2-MR.js +1 -0
- package/client/dist/assets/useRuntimeRuns-BRS6ncnO.js +1 -0
- package/client/dist/assets/utils-ELimjS2Y.js +1 -0
- package/client/dist/assets/wrench-Br2n1Lxd.js +1 -0
- package/client/dist/index.html +75 -60
- package/docs/ci-cd.md +29 -1
- package/docs/cli.md +10 -31
- package/docs/codex.md +1 -1
- package/docs/creating-specs.md +15 -12
- package/docs/customizing.md +16 -13
- package/docs/getting-started.md +12 -11
- package/docs/guide/de/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/de/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/de/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/de/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/de/getting-started/6-universal-search.md +34 -0
- package/docs/guide/de/insights/1-analytics-and-cost-tracking.md +20 -6
- package/docs/guide/de/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/de/insights/3-code-explorer.md +1 -1
- package/docs/guide/de/integrations/1-ai-providers.md +1 -1
- package/docs/guide/de/integrations/2-plugins.md +1 -1
- package/docs/guide/de/integrations/3-jira-integration.md +3 -3
- package/docs/guide/de/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/de/integrations/5-mcp-server.md +1 -1
- package/docs/guide/de/integrations/6-agent-chat.md +12 -5
- package/docs/guide/de/integrations/8-flow-mode.md +69 -0
- package/docs/guide/de/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/de/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/de/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/de/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/de/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/de/settings/1-themes.md +1 -1
- package/docs/guide/de/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/de/settings/5-project-environment.md +1 -1
- package/docs/guide/de/settings/6-updates.md +24 -0
- package/docs/guide/de/settings/7-existing-projects.md +33 -0
- package/docs/guide/de/settings/8-accessibility.md +23 -0
- package/docs/guide/de/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/de/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/de/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/en/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/en/getting-started/1-what-is-specrails.md +1 -1
- package/docs/guide/en/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/en/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/en/getting-started/5-the-dashboard-tour.md +52 -0
- package/docs/guide/en/getting-started/6-universal-search.md +34 -0
- package/docs/guide/en/insights/1-analytics-and-cost-tracking.md +24 -10
- package/docs/guide/en/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/en/insights/3-code-explorer.md +5 -5
- package/docs/guide/en/integrations/1-ai-providers.md +1 -1
- package/docs/guide/en/integrations/2-plugins.md +1 -1
- package/docs/guide/en/integrations/3-jira-integration.md +4 -4
- package/docs/guide/en/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/en/integrations/5-mcp-server.md +4 -4
- package/docs/guide/en/integrations/6-agent-chat.md +12 -5
- package/docs/guide/en/integrations/8-flow-mode.md +69 -0
- package/docs/guide/en/pipeline/1-rails-and-jobs.md +22 -3
- package/docs/guide/en/pipeline/2-the-job-detail-view.md +19 -7
- package/docs/guide/en/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/en/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/en/pipeline/5-the-loop-builder.md +2 -2
- package/docs/guide/en/settings/1-themes.md +1 -1
- package/docs/guide/en/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/en/settings/5-project-environment.md +1 -1
- package/docs/guide/en/settings/6-updates.md +24 -0
- package/docs/guide/en/settings/7-existing-projects.md +33 -0
- package/docs/guide/en/settings/8-accessibility.md +23 -0
- package/docs/guide/en/specs/1-specs-and-the-backlog.md +42 -6
- package/docs/guide/en/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/en/specs/3-add-spec-explore-mode.md +2 -2
- package/docs/guide/es/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/es/agents/2-profiles-and-the-balanced-default.md +1 -1
- package/docs/guide/es/agents/3-customizing-models-per-agent.md +2 -2
- package/docs/guide/es/agents/4-custom-agents-catalog.md +1 -1
- package/docs/guide/es/getting-started/1-what-is-specrails.md +3 -3
- package/docs/guide/es/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/es/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/es/getting-started/5-the-dashboard-tour.md +52 -0
- package/docs/guide/es/getting-started/6-universal-search.md +34 -0
- package/docs/guide/es/insights/1-analytics-and-cost-tracking.md +26 -12
- package/docs/guide/es/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/es/insights/3-code-explorer.md +5 -5
- package/docs/guide/es/integrations/1-ai-providers.md +1 -1
- package/docs/guide/es/integrations/2-plugins.md +1 -1
- package/docs/guide/es/integrations/3-jira-integration.md +4 -4
- package/docs/guide/es/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/es/integrations/5-mcp-server.md +4 -4
- package/docs/guide/es/integrations/6-agent-chat.md +14 -7
- package/docs/guide/es/integrations/7-local-engines.md +1 -1
- package/docs/guide/es/integrations/8-flow-mode.md +69 -0
- package/docs/guide/es/pipeline/1-rails-and-jobs.md +33 -13
- package/docs/guide/es/pipeline/2-the-job-detail-view.md +38 -26
- package/docs/guide/es/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/es/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/es/pipeline/5-the-loop-builder.md +4 -4
- package/docs/guide/es/settings/1-themes.md +1 -1
- package/docs/guide/es/settings/3-pipeline-telemetry-and-diagnostics.md +10 -10
- package/docs/guide/es/settings/5-project-environment.md +1 -1
- package/docs/guide/es/settings/6-updates.md +24 -0
- package/docs/guide/es/settings/7-existing-projects.md +33 -0
- package/docs/guide/es/settings/8-accessibility.md +23 -0
- package/docs/guide/es/specs/1-specs-and-the-backlog.md +43 -7
- package/docs/guide/es/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/es/specs/3-add-spec-explore-mode.md +3 -3
- package/docs/guide/fr/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/fr/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/fr/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/fr/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/fr/getting-started/6-universal-search.md +34 -0
- package/docs/guide/fr/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/fr/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/fr/insights/3-code-explorer.md +1 -1
- package/docs/guide/fr/integrations/1-ai-providers.md +1 -1
- package/docs/guide/fr/integrations/2-plugins.md +1 -1
- package/docs/guide/fr/integrations/3-jira-integration.md +3 -3
- package/docs/guide/fr/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/fr/integrations/5-mcp-server.md +1 -1
- package/docs/guide/fr/integrations/6-agent-chat.md +11 -4
- package/docs/guide/fr/integrations/8-flow-mode.md +69 -0
- package/docs/guide/fr/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/fr/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/fr/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/fr/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/fr/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/fr/settings/1-themes.md +1 -1
- package/docs/guide/fr/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/fr/settings/5-project-environment.md +1 -1
- package/docs/guide/fr/settings/6-updates.md +24 -0
- package/docs/guide/fr/settings/7-existing-projects.md +33 -0
- package/docs/guide/fr/settings/8-accessibility.md +23 -0
- package/docs/guide/fr/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/fr/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/fr/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/it/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/it/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/it/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/it/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/it/getting-started/6-universal-search.md +34 -0
- package/docs/guide/it/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/it/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/it/insights/3-code-explorer.md +1 -1
- package/docs/guide/it/integrations/1-ai-providers.md +1 -1
- package/docs/guide/it/integrations/2-plugins.md +1 -1
- package/docs/guide/it/integrations/3-jira-integration.md +3 -3
- package/docs/guide/it/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/it/integrations/5-mcp-server.md +1 -1
- package/docs/guide/it/integrations/6-agent-chat.md +11 -4
- package/docs/guide/it/integrations/8-flow-mode.md +69 -0
- package/docs/guide/it/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/it/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/it/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/it/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/it/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/it/settings/1-themes.md +1 -1
- package/docs/guide/it/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/it/settings/5-project-environment.md +1 -1
- package/docs/guide/it/settings/6-updates.md +24 -0
- package/docs/guide/it/settings/7-existing-projects.md +33 -0
- package/docs/guide/it/settings/8-accessibility.md +23 -0
- package/docs/guide/it/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/it/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/it/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/ja/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/ja/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/ja/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/ja/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/ja/getting-started/6-universal-search.md +34 -0
- package/docs/guide/ja/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/ja/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/ja/insights/3-code-explorer.md +1 -1
- package/docs/guide/ja/integrations/1-ai-providers.md +1 -1
- package/docs/guide/ja/integrations/2-plugins.md +1 -1
- package/docs/guide/ja/integrations/3-jira-integration.md +3 -3
- package/docs/guide/ja/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/ja/integrations/5-mcp-server.md +1 -1
- package/docs/guide/ja/integrations/6-agent-chat.md +11 -4
- package/docs/guide/ja/integrations/8-flow-mode.md +69 -0
- package/docs/guide/ja/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/ja/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/ja/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/ja/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/ja/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/ja/settings/1-themes.md +1 -1
- package/docs/guide/ja/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/ja/settings/5-project-environment.md +1 -1
- package/docs/guide/ja/settings/6-updates.md +24 -0
- package/docs/guide/ja/settings/7-existing-projects.md +33 -0
- package/docs/guide/ja/settings/8-accessibility.md +23 -0
- package/docs/guide/ja/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/ja/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/ja/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/pt/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/pt/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/pt/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/pt/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/pt/getting-started/6-universal-search.md +34 -0
- package/docs/guide/pt/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/pt/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/pt/insights/3-code-explorer.md +1 -1
- package/docs/guide/pt/integrations/1-ai-providers.md +1 -1
- package/docs/guide/pt/integrations/2-plugins.md +1 -1
- package/docs/guide/pt/integrations/3-jira-integration.md +3 -3
- package/docs/guide/pt/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/pt/integrations/5-mcp-server.md +1 -1
- package/docs/guide/pt/integrations/6-agent-chat.md +12 -5
- package/docs/guide/pt/integrations/8-flow-mode.md +69 -0
- package/docs/guide/pt/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/pt/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/pt/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/pt/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/pt/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/pt/settings/1-themes.md +1 -1
- package/docs/guide/pt/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/pt/settings/5-project-environment.md +1 -1
- package/docs/guide/pt/settings/6-updates.md +24 -0
- package/docs/guide/pt/settings/7-existing-projects.md +33 -0
- package/docs/guide/pt/settings/8-accessibility.md +23 -0
- package/docs/guide/pt/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/pt/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/pt/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/zh/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/zh/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/zh/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/zh/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/zh/getting-started/6-universal-search.md +34 -0
- package/docs/guide/zh/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/zh/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/zh/insights/3-code-explorer.md +1 -1
- package/docs/guide/zh/integrations/1-ai-providers.md +1 -1
- package/docs/guide/zh/integrations/2-plugins.md +1 -1
- package/docs/guide/zh/integrations/3-jira-integration.md +3 -3
- package/docs/guide/zh/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/zh/integrations/5-mcp-server.md +1 -1
- package/docs/guide/zh/integrations/6-agent-chat.md +11 -4
- package/docs/guide/zh/integrations/8-flow-mode.md +69 -0
- package/docs/guide/zh/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/zh/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/zh/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/zh/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/zh/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/zh/settings/1-themes.md +1 -1
- package/docs/guide/zh/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/zh/settings/5-project-environment.md +1 -1
- package/docs/guide/zh/settings/6-updates.md +24 -0
- package/docs/guide/zh/settings/7-existing-projects.md +33 -0
- package/docs/guide/zh/settings/8-accessibility.md +23 -0
- package/docs/guide/zh/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/zh/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/zh/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/internals/README.md +8 -0
- package/docs/internals/adding-a-provider.md +19 -2
- package/docs/internals/agent-actions-audit.md +101 -0
- package/docs/internals/agent-sessions.md +36 -1
- package/docs/internals/api-reference.md +190 -45
- package/docs/internals/architecture.md +53 -47
- package/docs/internals/companion-inbox-decisions.md +42 -0
- package/docs/internals/companion-rails-as-loops-contract.md +17 -6
- package/docs/internals/configuration.md +140 -9
- package/docs/internals/core-runtime-updates.md +4 -4
- package/docs/internals/existing-project-anchoring.md +168 -0
- package/docs/internals/flow-mode.md +668 -0
- package/docs/internals/legacy-implementation-notes.md +13 -0
- package/docs/internals/local-testing-feedback-2026-10.md +210 -0
- package/docs/internals/mcp-mission-audit.md +4 -0
- package/docs/internals/mission-rail-cards.md +10 -5
- package/docs/internals/mission-read-only-policy.md +152 -0
- package/docs/internals/modal-standard.md +181 -0
- package/docs/internals/openspec-workflow.md +32 -0
- package/docs/internals/operations-runbook.md +30 -0
- package/docs/internals/profiles.md +6 -3
- package/docs/internals/programmatic-agent-runtime.md +8 -0
- package/docs/internals/project-builder.md +1 -1
- package/docs/internals/review-packet.md +161 -9
- package/docs/internals/safe-pr-review-flow.md +135 -6
- package/docs/internals/source-map.md +413 -18
- package/docs/internals/spec-addenda.md +10 -0
- package/docs/internals/spec-triage.md +140 -0
- package/docs/internals/visual-design-audit.md +15 -2
- package/docs/local-providers.md +3 -0
- package/docs/mcp.md +21 -3
- package/docs/platforms/macos.md +1 -1
- package/docs/platforms/windows.md +2 -2
- package/docs/running-pipelines.md +22 -6
- package/docs/tracking-cost.md +54 -10
- package/local-runner/dist/specrails-local-runner.js +3851 -1178
- package/mcp-bridge/dist/specrails-mcp.js +3864 -1143
- package/package.json +10 -9
- package/server/dist/agent-mcp-config.js +37 -1
- package/server/dist/api-version.js +19 -0
- package/server/dist/command-resolver.js +4 -2
- package/server/dist/core-compat.js +1 -1
- package/server/dist/core-execution.js +2 -1
- package/server/dist/core-update-manager.js +71 -13
- package/server/dist/db/job-search.js +248 -0
- package/server/dist/db/jobs.js +6 -0
- package/server/dist/db/migrations.js +239 -0
- package/server/dist/db.js +9 -2
- package/server/dist/desktop-db.js +99 -5
- package/server/dist/desktop-router.js +126 -13
- package/server/dist/docs-router.js +67 -1
- package/server/dist/feature-flags.js +22 -0
- package/server/dist/index.js +30 -15
- package/server/dist/jira/jira-adf.js +13 -1
- package/server/dist/jira/jira-clarifications.js +146 -0
- package/server/dist/jira/jira-client.js +8 -1
- package/server/dist/jira/jira-db.js +41 -0
- package/server/dist/jira/jira-sync-manager.js +328 -25
- package/server/dist/mcp/guide.js +17 -7
- package/server/dist/mcp/tools/agents.js +1 -1
- package/server/dist/mcp/tools/analytics.js +15 -3
- package/server/dist/mcp/tools/app-settings.js +14 -1
- package/server/dist/mcp/tools/chat.js +1 -1
- package/server/dist/mcp/tools/env.js +4 -2
- package/server/dist/mcp/tools/jobs.js +96 -7
- package/server/dist/mcp/tools/loops.js +1 -1
- package/server/dist/mcp/tools/meta.js +10 -13
- package/server/dist/mcp/tools/rails.js +15 -1
- package/server/dist/mcp/tools/setup.js +1 -1
- package/server/dist/mcp/tools/specs.js +8 -5
- package/server/dist/mcp/tools/support.js +6 -3
- package/server/dist/mcp/tools/types.js +38 -1
- package/server/dist/mobile/mobile-admin-router.js +0 -16
- package/server/dist/mobile/mobile-gateway.js +0 -18
- package/server/dist/mobile/mobile-inbox.js +240 -0
- package/server/dist/mobile/mobile-missions.js +6 -8
- package/server/dist/mobile/mobile-router.js +9 -9
- package/server/dist/mobile/mobile-webrtc-peer.js +4 -54
- package/server/dist/mobile/mobile-ws.js +27 -4
- package/server/dist/modules/accounting/runtime/ai-invocations.js +4 -0
- package/server/dist/modules/accounting/runtime/decision-times.js +102 -0
- package/server/dist/modules/accounting/runtime/loop-economics.js +284 -0
- package/server/dist/modules/accounting/runtime/spending.js +7 -2
- package/server/dist/modules/accounting/runtime/what-if.js +87 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-bridge.js +86 -5
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-controls.js +28 -2
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-metrics.js +15 -2
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-settings-router.js +21 -2
- package/server/dist/modules/agent-runtime/runtime/core-capabilities.js +55 -0
- package/server/dist/modules/agent-sessions/adapters/host-process.js +1 -1
- package/server/dist/modules/agent-sessions/domain/availability.js +16 -0
- package/server/dist/modules/agent-sessions/domain/protocol.js +8 -1
- package/server/dist/modules/agent-sessions/index.js +3 -1
- package/server/dist/modules/agent-sessions/runtime/core-sessions-availability.js +16 -0
- package/server/dist/modules/agents/runtime/agent-refine-manager.js +3 -1
- package/server/dist/modules/agents/runtime/agent-store.js +60 -73
- package/server/dist/modules/audit/adapters/http.js +66 -0
- package/server/dist/modules/audit/adapters/runtime.js +60 -0
- package/server/dist/modules/audit/adapters/sqlite.js +73 -0
- package/server/dist/modules/audit/application.js +190 -0
- package/server/dist/modules/audit/domain.js +434 -0
- package/server/dist/modules/audit/index.js +27 -0
- package/server/dist/modules/audit/ports.js +2 -0
- package/server/dist/modules/browser/runtime/browser-capture-manager.js +18 -141
- package/server/dist/modules/browser/runtime/browser-capture-types.js +1 -10
- package/server/dist/modules/browser/runtime/browser-playwright.js +0 -19
- package/server/dist/modules/code/runtime/file-provenance.js +23 -0
- package/server/dist/modules/conversations/runtime/chat-manager.js +5 -2
- package/server/dist/modules/delivery/adapters/decisions/chains.js +1 -0
- package/server/dist/modules/delivery/adapters/decisions/create.js +19 -1
- package/server/dist/modules/delivery/adapters/decisions/discard.js +2 -0
- package/server/dist/modules/delivery/adapters/decisions/local-changes.js +427 -0
- package/server/dist/modules/delivery/adapters/decisions/merge-local.js +80 -6
- package/server/dist/modules/delivery/adapters/decisions/observations.js +5 -0
- package/server/dist/modules/delivery/adapters/decisions/ownership.js +2 -1
- package/server/dist/modules/delivery/adapters/decisions/transitions.js +9 -0
- package/server/dist/modules/delivery/adapters/review-wip-store.js +37 -0
- package/server/dist/modules/delivery/domain/review-wip.js +71 -0
- package/server/dist/modules/delivery/index.js +9 -1
- package/server/dist/modules/delivery/runtime/delivery-changes.js +355 -0
- package/server/dist/modules/delivery/runtime/delivery-evidence.js +249 -8
- package/server/dist/modules/delivery/runtime/flow-review-legacy.js +99 -0
- package/server/dist/modules/delivery/runtime/flow-review-outcome.js +107 -0
- package/server/dist/modules/delivery/runtime/flow-worktree-handoff.js +32 -0
- package/server/dist/modules/delivery/runtime/flow-worktree-return.js +87 -0
- package/server/dist/modules/delivery/runtime/isolated-worktree.js +380 -0
- package/server/dist/modules/delivery/runtime/local-restore-branch.js +325 -0
- package/server/dist/modules/delivery/runtime/local-restore-resolver.js +48 -0
- package/server/dist/modules/delivery/runtime/local-stash.js +423 -0
- package/server/dist/modules/delivery/runtime/multi-repo-execution.js +27 -1
- package/server/dist/modules/delivery/runtime/phase3-harvest.js +40 -0
- package/server/dist/modules/delivery/runtime/pr-body.js +50 -0
- package/server/dist/modules/delivery/runtime/rail-isolated-launch.js +169 -166
- package/server/dist/modules/delivery/runtime/rail-launch-parser.js +5 -2
- package/server/dist/modules/delivery/runtime/rail-pr-decision.js +7 -1
- package/server/dist/modules/delivery/runtime/rail-pr-store.js +193 -12
- package/server/dist/modules/delivery/runtime/rails-router.js +267 -5
- package/server/dist/modules/delivery/runtime/review-brief.js +208 -0
- package/server/dist/modules/delivery/runtime/review-packet.js +41 -2
- package/server/dist/modules/delivery/runtime/review-wip-gate.js +67 -0
- package/server/dist/modules/delivery/runtime/run-records.js +267 -0
- package/server/dist/modules/delivery/runtime/run-review-diagnosis.js +102 -0
- package/server/dist/modules/execution/adapters/budget-storage.js +76 -0
- package/server/dist/modules/execution/application/enforce-budget.js +17 -2
- package/server/dist/modules/execution/domain/agent-env.js +98 -0
- package/server/dist/modules/execution/domain/daily-budget.js +36 -0
- package/server/dist/modules/execution/domain/spend-caps.js +166 -0
- package/server/dist/modules/execution/index.js +34 -1
- package/server/dist/modules/execution/runtime/budget-overview.js +76 -0
- package/server/dist/modules/execution/runtime/daily-budget-gate.js +86 -0
- package/server/dist/modules/execution/runtime/interactive-job-session.js +8 -0
- package/server/dist/modules/execution/runtime/launch-forecast.js +33 -0
- package/server/dist/modules/execution/runtime/queue-manager.js +54 -15
- package/server/dist/modules/execution/runtime/run-duration-stats.js +31 -13
- package/server/dist/modules/flow/adapters/bindings.js +1089 -0
- package/server/dist/modules/flow/adapters/http.js +147 -0
- package/server/dist/modules/flow/adapters/sqlite.js +121 -0
- package/server/dist/modules/flow/application.js +805 -0
- package/server/dist/modules/flow/domain.js +790 -0
- package/server/dist/modules/flow/index.js +34 -0
- package/server/dist/modules/flow/ports.js +2 -0
- package/server/dist/modules/inbox/adapters/http.js +21 -0
- package/server/dist/modules/inbox/adapters/project-source.js +233 -0
- package/server/dist/modules/inbox/application.js +28 -0
- package/server/dist/modules/inbox/domain.js +43 -0
- package/server/dist/modules/inbox/index.js +10 -0
- package/server/dist/modules/inbox/ports.js +2 -0
- package/server/dist/modules/loops/runtime/loop-definition-run.js +9 -0
- package/server/dist/modules/loops/runtime/loop-definition.js +5 -2
- package/server/dist/modules/loops/runtime/loop-executors.js +90 -9
- package/server/dist/modules/loops/runtime/loop-factory.js +30 -2
- package/server/dist/modules/loops/runtime/loop-flow-spec-recipe.js +166 -0
- package/server/dist/modules/loops/runtime/loop-graph.js +1 -1
- package/server/dist/modules/loops/runtime/loop-role-engines.js +4 -1
- package/server/dist/modules/loops/runtime/loop-run-manager.js +267 -10
- package/server/dist/modules/loops/runtime/loop-runs-store.js +21 -5
- package/server/dist/modules/loops/runtime/loop-templates.js +55 -12
- package/server/dist/modules/missions/runtime/agent-chat-manager.js +283 -20
- package/server/dist/modules/missions/runtime/agent-chat-router.js +96 -21
- package/server/dist/modules/missions/runtime/agent-failure-briefing.js +11 -3
- package/server/dist/modules/missions/runtime/agent-fence-promotion.js +9 -1
- package/server/dist/modules/missions/runtime/agent-flow-prompt.js +64 -0
- package/server/dist/modules/missions/runtime/agent-input-store.js +9 -4
- package/server/dist/modules/missions/runtime/agent-operator-prompt.js +100 -14
- package/server/dist/modules/missions/runtime/agent-session-store.js +88 -27
- package/server/dist/modules/missions/runtime/core-session-runner.js +89 -9
- package/server/dist/modules/missions/runtime/flow-turn-context.js +17 -0
- package/server/dist/modules/missions/runtime/mission-core-sessions.js +295 -55
- package/server/dist/modules/missions/runtime/mission-run-notify.js +2 -0
- package/server/dist/modules/missions/runtime/mission-session-projector.js +56 -19
- package/server/dist/modules/missions/runtime/mission-tool-policy.js +47 -0
- package/server/dist/modules/onboarding/adapters/http.js +78 -0
- package/server/dist/modules/onboarding/adapters/providers.js +41 -0
- package/server/dist/modules/onboarding/adapters/runtime.js +130 -0
- package/server/dist/modules/onboarding/application.js +133 -0
- package/server/dist/modules/onboarding/catalog.js +217 -0
- package/server/dist/modules/onboarding/domain.js +102 -0
- package/server/dist/modules/onboarding/index.js +20 -0
- package/server/dist/modules/onboarding/ports.js +2 -0
- package/server/dist/modules/project-rules/adapters/http.js +91 -0
- package/server/dist/modules/project-rules/domain.js +122 -0
- package/server/dist/modules/project-rules/runtime/rules-inventory-runs.js +97 -0
- package/server/dist/modules/project-rules/runtime/rules-store.js +109 -0
- package/server/dist/modules/project-settings/adapters/http.js +13 -0
- package/server/dist/modules/project-settings/adapters/sqlite.js +78 -8
- package/server/dist/modules/project-settings/domain.js +47 -1
- package/server/dist/modules/project-settings/index.js +7 -1
- package/server/dist/modules/recovery/adapters/sqlite.js +28 -0
- package/server/dist/modules/recovery/domain.js +162 -0
- package/server/dist/modules/recovery/index.js +16 -0
- package/server/dist/modules/specs/adapters/timeline-http.js +101 -0
- package/server/dist/modules/specs/domain/handoff-labels.js +371 -0
- package/server/dist/modules/specs/domain/handoff.js +260 -0
- package/server/dist/modules/specs/domain/non-goals.js +101 -0
- package/server/dist/modules/specs/domain/timeline.js +164 -0
- package/server/dist/modules/specs/domain/triage.js +320 -0
- package/server/dist/modules/specs/runtime/contract-refine-runner.js +3 -2
- package/server/dist/modules/specs/runtime/generated-spec-parser.js +75 -0
- package/server/dist/modules/specs/runtime/proposal-manager.js +4 -3
- package/server/dist/modules/specs/runtime/smash-runner.js +2 -1
- package/server/dist/modules/specs/runtime/spec-addenda.js +31 -0
- package/server/dist/modules/specs/runtime/spec-draft-parser.js +6 -1
- package/server/dist/modules/specs/runtime/spec-generation.js +431 -0
- package/server/dist/modules/specs/runtime/spec-handoff.js +103 -0
- package/server/dist/modules/specs/runtime/spec-history.js +376 -0
- package/server/dist/modules/specs/runtime/spec-launcher-manager.js +4 -3
- package/server/dist/modules/specs/runtime/spec-search.js +117 -0
- package/server/dist/modules/specs/runtime/ticket-store.js +47 -2
- package/server/dist/modules/specs/runtime/ticket-trash-service.js +62 -0
- package/server/dist/modules/specs/runtime/ticket-trash.js +193 -0
- package/server/dist/modules/specs/runtime/triage-runner.js +171 -0
- package/server/dist/modules/specs/runtime/triage.js +365 -0
- package/server/dist/modules/terminals/domain/app-urls.js +96 -0
- package/server/dist/modules/terminals/runtime/app-urls.js +77 -0
- package/server/dist/modules/terminals/runtime/background-process-service.js +25 -28
- package/server/dist/project-env.js +60 -0
- package/server/dist/project-git.js +65 -0
- package/server/dist/project-registry.js +264 -27
- package/server/dist/project-router-background-processes.js +27 -3
- package/server/dist/project-router-git.js +30 -0
- package/server/dist/project-router-helpers.js +5 -30
- package/server/dist/project-router-jobs.js +49 -1
- package/server/dist/project-router-loop-runs.js +72 -2
- package/server/dist/project-router-rules.js +54 -0
- package/server/dist/project-router-search.js +52 -0
- package/server/dist/project-router-settings.js +6 -0
- package/server/dist/project-router-setup.js +1 -1
- package/server/dist/project-router-spending.js +138 -0
- package/server/dist/project-router-tickets.js +246 -427
- package/server/dist/project-router.js +7 -0
- package/server/dist/providers/claude-adapter.js +25 -3
- package/server/dist/providers/codex-adapter.js +9 -1
- package/server/dist/providers/gemini-adapter.js +6 -1
- package/server/dist/providers/kimi-adapter.js +2 -0
- package/server/dist/providers/local-adapter.js +2 -0
- package/server/dist/providers/runtime.js +8 -0
- package/server/dist/schemas/agent-runtime.schema.json +3 -1
- package/server/dist/schemas/workflow-definition.schema.json +1 -0
- package/server/dist/setup-manager.js +19 -1
- package/server/dist/transient-children.js +25 -8
- package/server/dist/update-channel.js +21 -0
- package/server/dist/util/search-snippet.js +74 -0
- package/server/dist/worktree-manager.js +19 -8
- package/client/dist/assets/ActivityFeedPage-Dtp7EyHc.js +0 -1
- package/client/dist/assets/AgentBrowserCapture-CLqlEFw8.js +0 -1
- package/client/dist/assets/AgentModeAnalyticsPane-B8_hM3Tw.js +0 -2
- package/client/dist/assets/AgentModeCodePane-CNF8ZNjE.js +0 -2
- package/client/dist/assets/AgentModeJobsPane-CJpJbO9m.js +0 -1
- package/client/dist/assets/AgentsPage-BC8XSR79.js +0 -120
- package/client/dist/assets/AnalyticsPage-Cdv4jLtW.js +0 -1
- package/client/dist/assets/BarChart-BDMqVFJy.js +0 -55
- package/client/dist/assets/CodePage-DI1kegAr.js +0 -3
- package/client/dist/assets/DesktopAnalyticsPage-Bdp8E8U6.js +0 -1
- package/client/dist/assets/DocsDialog-Bm4RS7FX.js +0 -11
- package/client/dist/assets/DocsPage-DihYcU8r.js +0 -11
- package/client/dist/assets/ExportDropdown-Bb1lHx3r.js +0 -1
- package/client/dist/assets/IntegrationsPage-EAipiDWm.js +0 -1
- package/client/dist/assets/InteractiveJobComposer-BO6ASN-2.js +0 -19
- package/client/dist/assets/JobDetailModal-CuPYq7tP.js +0 -1
- package/client/dist/assets/JobDetailPage-BusMjJi9.js +0 -1
- package/client/dist/assets/JobsPage-C0QbsF2d.js +0 -1
- package/client/dist/assets/LoopBuilderPage-B7TlU4iS.js +0 -1
- package/client/dist/assets/LoopPreviewModal-BRWtXOD2.js +0 -1
- package/client/dist/assets/LoopsPage-C4q1DmCE.js +0 -2
- package/client/dist/assets/MinimizedChatsContext-DHfigjHS.js +0 -1
- package/client/dist/assets/PluginsPage-Z1JHSMdR.js +0 -2
- package/client/dist/assets/ProjectSettingsDialog-BUNj0tvN.js +0 -1
- package/client/dist/assets/RepositoryDeliveries-B4ybHOyB.js +0 -5
- package/client/dist/assets/ReviewPacketPage-hwfPNjyy.js +0 -4
- package/client/dist/assets/TemplatePreviewModal-V7FpMWuw.js +0 -1
- package/client/dist/assets/TicketDetailModalContext-Dkwo2cDs.js +0 -16
- package/client/dist/assets/Trans-BbFxRFtR.js +0 -1
- package/client/dist/assets/activity-B-rp4h_v.js +0 -1
- package/client/dist/assets/activity-C6kJpm9q.js +0 -1
- package/client/dist/assets/activity-CGx4kb_j.js +0 -1
- package/client/dist/assets/activity-CnoX2bH7.js +0 -1
- package/client/dist/assets/activity-DAyekdlt.js +0 -1
- package/client/dist/assets/activity-DCxtpT7j.js +0 -1
- package/client/dist/assets/activity-DiyjsgQV.js +0 -1
- package/client/dist/assets/activity-JzwRaWPD.js +0 -1
- package/client/dist/assets/addspec-BOvgmcgk.js +0 -1
- package/client/dist/assets/addspec-Clmyfn_R.js +0 -1
- package/client/dist/assets/addspec-CsNaBpHp.js +0 -1
- package/client/dist/assets/addspec-D2tvWmmV.js +0 -1
- package/client/dist/assets/addspec-D3nFwvD0.js +0 -1
- package/client/dist/assets/addspec-DVLEhK3w.js +0 -1
- package/client/dist/assets/addspec-DXbK-tb0.js +0 -1
- package/client/dist/assets/addspec-OHG8DFEn.js +0 -1
- package/client/dist/assets/agent-5bSixVzz.js +0 -1
- package/client/dist/assets/agent-BR4EHfhq.js +0 -1
- package/client/dist/assets/agent-C0IKkJP8.js +0 -1
- package/client/dist/assets/agent-C7li9ayC.js +0 -1
- package/client/dist/assets/agent-D0dRmEen.js +0 -1
- package/client/dist/assets/agent-DZVGHm7H.js +0 -1
- package/client/dist/assets/agent-Dip4h2YE.js +0 -1
- package/client/dist/assets/agent-Pp-P-n1p.js +0 -1
- package/client/dist/assets/agentRuntime-BxF81z52.js +0 -1
- package/client/dist/assets/agentRuntime-BxYS5V7u.js +0 -1
- package/client/dist/assets/agentRuntime-Dc9HG3BA.js +0 -1
- package/client/dist/assets/agents-B6ZsnARo.js +0 -1
- package/client/dist/assets/agents-BORdhe0K.js +0 -1
- package/client/dist/assets/agents-C6aq9Oqs.js +0 -1
- package/client/dist/assets/agents-Cbsc4bcX.js +0 -1
- package/client/dist/assets/agents-D0uYR6hq.js +0 -1
- package/client/dist/assets/agents-Doe1sHY5.js +0 -1
- package/client/dist/assets/agents-DyNi_I9m.js +0 -1
- package/client/dist/assets/agents-StKxiTg0.js +0 -1
- package/client/dist/assets/agentstudio-7cYCXn-L.js +0 -1
- package/client/dist/assets/agentstudio-BHWQh8G3.js +0 -1
- package/client/dist/assets/agentstudio-BjnWHyRs.js +0 -1
- package/client/dist/assets/agentstudio-BkV8vcK4.js +0 -1
- package/client/dist/assets/agentstudio-BzugqB_N.js +0 -1
- package/client/dist/assets/agentstudio-CWbp7KvH.js +0 -1
- package/client/dist/assets/agentstudio-DG6plf5o.js +0 -1
- package/client/dist/assets/agentstudio-DkZVF-Cc.js +0 -1
- package/client/dist/assets/analytics-B1DIQd4m.js +0 -1
- package/client/dist/assets/analytics-BAIZ9vE_.js +0 -1
- package/client/dist/assets/analytics-BTqgmgBd.js +0 -1
- package/client/dist/assets/analytics-BWynXPEm.js +0 -1
- package/client/dist/assets/analytics-DGcUsQ44.js +0 -1
- package/client/dist/assets/analytics-GnSnpJ4W.js +0 -1
- package/client/dist/assets/analytics-TWgYaoO0.js +0 -1
- package/client/dist/assets/analytics-kJy6Tuko.js +0 -1
- package/client/dist/assets/atom-one-dark-qiGhVQxg.js +0 -1
- package/client/dist/assets/builder-B9gorTnT.js +0 -1
- package/client/dist/assets/builder-Bvw5s3Mi.js +0 -1
- package/client/dist/assets/builder-CL5l4dU3.js +0 -1
- package/client/dist/assets/builder-CVDTVrQX.js +0 -1
- package/client/dist/assets/builder-CpS9liE9.js +0 -1
- package/client/dist/assets/builder-DNctIL9Q.js +0 -1
- package/client/dist/assets/builder-De2NxX6o.js +0 -1
- package/client/dist/assets/builder-DeYT7Y-m.js +0 -1
- package/client/dist/assets/button-4FS1ZDTp.js +0 -1
- package/client/dist/assets/chat-D_I7nU5K.js +0 -1
- package/client/dist/assets/chevron-up-6EFqEHBj.js +0 -1
- package/client/dist/assets/chunk-OB3PAWPO-B1EMk45A.js +0 -3
- package/client/dist/assets/clsx-CjueKrWZ.js +0 -1
- package/client/dist/assets/code-B37GRg9C.js +0 -1
- package/client/dist/assets/code-BBOEZbf9.js +0 -1
- package/client/dist/assets/code-BRm-jcyx.js +0 -1
- package/client/dist/assets/code-CF7w62CR.js +0 -1
- package/client/dist/assets/code-CLuvJt2r.js +0 -1
- package/client/dist/assets/code-D0RCm59f.js +0 -1
- package/client/dist/assets/code-DaZ-ZwCT.js +0 -1
- package/client/dist/assets/code-iIHkGaCL.js +0 -1
- package/client/dist/assets/commands-0XjAftla.js +0 -1
- package/client/dist/assets/commands-BAWSYHjQ.js +0 -1
- package/client/dist/assets/commands-BBwowgiE.js +0 -1
- package/client/dist/assets/commands-BacjIZLN.js +0 -1
- package/client/dist/assets/commands-Bs62IAZ3.js +0 -1
- package/client/dist/assets/commands-CLPdh-Hh.js +0 -1
- package/client/dist/assets/commands-DlbFzgrp.js +0 -1
- package/client/dist/assets/commands-LjPSsi5F.js +0 -1
- package/client/dist/assets/common-Bdi0qN4S.js +0 -1
- package/client/dist/assets/common-Bhb9zN1P.js +0 -1
- package/client/dist/assets/common-BykKlZg1.js +0 -1
- package/client/dist/assets/common-CvnNNSJA.js +0 -1
- package/client/dist/assets/common-D5zk_mqq.js +0 -1
- package/client/dist/assets/common-DQNO_al5.js +0 -1
- package/client/dist/assets/common-Dax30Vmp.js +0 -1
- package/client/dist/assets/common-DkllpVSb.js +0 -1
- package/client/dist/assets/core-B3mKBIh5.js +0 -1
- package/client/dist/assets/dashboard-B1ndRHuC.js +0 -1
- package/client/dist/assets/dashboard-BX7KXiqA.js +0 -1
- package/client/dist/assets/dashboard-B_BSNxcN.js +0 -1
- package/client/dist/assets/dashboard-CCeFN7-V.js +0 -1
- package/client/dist/assets/dashboard-CRl0WtFJ.js +0 -1
- package/client/dist/assets/dashboard-XGdQ5mjw.js +0 -1
- package/client/dist/assets/dashboard-_oltA6Jd.js +0 -1
- package/client/dist/assets/dashboard-bAuf5KVk.js +0 -1
- package/client/dist/assets/dialog-DtdR05v1.js +0 -45
- package/client/dist/assets/dist-js-CJ_2XX1Y.js +0 -1
- package/client/dist/assets/event-Bt7f3wXe.js +0 -1
- package/client/dist/assets/explore-BG99VGpL.js +0 -1
- package/client/dist/assets/explore-C0TjprJW.js +0 -1
- package/client/dist/assets/explore-C2dgEo7q.js +0 -1
- package/client/dist/assets/explore-C8NDHbob.js +0 -1
- package/client/dist/assets/explore-CWWgzQGR.js +0 -1
- package/client/dist/assets/explore-CcQXpdtS.js +0 -1
- package/client/dist/assets/explore-DgBACn39.js +0 -1
- package/client/dist/assets/explore-DsXAgnmJ.js +0 -1
- package/client/dist/assets/file-text-C0blZHLh.js +0 -1
- package/client/dist/assets/formatDistanceToNow-NjPHBLfB.js +0 -1
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-vJ7qUoqN.js +0 -1
- package/client/dist/assets/git-branch-yf6LE1Bw.js +0 -1
- package/client/dist/assets/index-BgbCbIua.css +0 -2
- package/client/dist/assets/index-Ce4yZtKf.js +0 -83
- package/client/dist/assets/integrations-BkpRUbvp.js +0 -1
- package/client/dist/assets/integrations-Bo8qbJf4.js +0 -1
- package/client/dist/assets/integrations-CmSrKzZb.js +0 -1
- package/client/dist/assets/integrations-DGtq26Rr.js +0 -1
- package/client/dist/assets/integrations-De38GFnQ.js +0 -1
- package/client/dist/assets/integrations-Dw6zdtb-.js +0 -1
- package/client/dist/assets/integrations-Dwl9KQp0.js +0 -1
- package/client/dist/assets/integrations-Refg_d2I.js +0 -1
- package/client/dist/assets/jira-B6OYw4CJ.js +0 -1
- package/client/dist/assets/jira-BTF6RaOe.js +0 -1
- package/client/dist/assets/jira-CEetIB2q.js +0 -1
- package/client/dist/assets/jira-CIzsZLw5.js +0 -1
- package/client/dist/assets/jira-Daw9tmpI.js +0 -1
- package/client/dist/assets/jira-FXr7u2lh.js +0 -1
- package/client/dist/assets/jira-LaNQn7yl.js +0 -1
- package/client/dist/assets/jira-api-Cabj-H0J.js +0 -1
- package/client/dist/assets/job-time-BCL7wee9.js +0 -1
- package/client/dist/assets/jobs-ARwD85B9.js +0 -1
- package/client/dist/assets/jobs-BMF1w4WT.js +0 -1
- package/client/dist/assets/jobs-CBfzGLwm.js +0 -1
- package/client/dist/assets/jobs-CPjiluBY.js +0 -1
- package/client/dist/assets/jobs-CQQd58pY.js +0 -1
- package/client/dist/assets/jobs-De3EqaO0.js +0 -1
- package/client/dist/assets/jobs-Du9-Ei9a.js +0 -1
- package/client/dist/assets/jobs-qMHbnxwC.js +0 -1
- package/client/dist/assets/layers-BCLTgHXO.js +0 -1
- package/client/dist/assets/loader-circle-BqV9xYGf.js +0 -1
- package/client/dist/assets/loop-layout-CyXj9223.js +0 -7
- package/client/dist/assets/loops-B2PhQLKR.js +0 -1
- package/client/dist/assets/loops-BqbF46st.js +0 -1
- package/client/dist/assets/loops-CINnHbfI.js +0 -1
- package/client/dist/assets/loops-D-3XhH04.js +0 -1
- package/client/dist/assets/loops-DKkEEjZ_.js +0 -1
- package/client/dist/assets/loops-DzWR5-v6.js +0 -1
- package/client/dist/assets/loops-WyWDkhok.js +0 -1
- package/client/dist/assets/loops-scD5fIBf.js +0 -1
- package/client/dist/assets/mcp-6rMoZfEO.js +0 -1
- package/client/dist/assets/mcp-BD8sL5mP.js +0 -1
- package/client/dist/assets/mcp-BkcA3I5s.js +0 -1
- package/client/dist/assets/mcp-CCpSelOh.js +0 -1
- package/client/dist/assets/mcp-CUAN6ORK.js +0 -1
- package/client/dist/assets/mcp-CqbRxRTE.js +0 -1
- package/client/dist/assets/mcp-DP2YfVhO.js +0 -1
- package/client/dist/assets/mcp-DUVQamDz.js +0 -1
- package/client/dist/assets/narration-BEKMVxGm.js +0 -1
- package/client/dist/assets/narration-CjLwGKap.js +0 -1
- package/client/dist/assets/narration-DANWuGsW.js +0 -1
- package/client/dist/assets/narration-DGeEDWiT.js +0 -1
- package/client/dist/assets/narration-DJgpGwIP.js +0 -1
- package/client/dist/assets/narration-DbHnz0qV.js +0 -1
- package/client/dist/assets/narration-bZSsTZG8.js +0 -1
- package/client/dist/assets/narration-i6aKJKEc.js +0 -1
- package/client/dist/assets/nav--u7iPYlS.js +0 -1
- package/client/dist/assets/nav-C5Jgfaby.js +0 -1
- package/client/dist/assets/nav-CAna_Wpt.js +0 -1
- package/client/dist/assets/nav-CCLqeyHo.js +0 -1
- package/client/dist/assets/nav-Cf3c90Jk.js +0 -1
- package/client/dist/assets/nav-DMYQaQjR.js +0 -1
- package/client/dist/assets/nav-Df_PkZ9F.js +0 -1
- package/client/dist/assets/nav-VyNGBJwj.js +0 -1
- package/client/dist/assets/packet-8nn9RsU7.js +0 -1
- package/client/dist/assets/packet-B0H15elv.js +0 -1
- package/client/dist/assets/packet-BQvBgrwh.js +0 -1
- package/client/dist/assets/packet-BR7mO0-a.js +0 -1
- package/client/dist/assets/packet-BgcQ6q_K.js +0 -1
- package/client/dist/assets/packet-D2s92Jnn.js +0 -1
- package/client/dist/assets/packet-YbtcD1HS.js +0 -1
- package/client/dist/assets/packet-c0Qj_9eX.js +0 -1
- package/client/dist/assets/project-repositories-Cnnuj9Ia.js +0 -1
- package/client/dist/assets/rotate-ccw-DalJAQQX.js +0 -1
- package/client/dist/assets/settings-B1NV8Ow9.js +0 -1
- package/client/dist/assets/settings-BQ8XFZeE.js +0 -1
- package/client/dist/assets/settings-BRkxfBbO.js +0 -1
- package/client/dist/assets/settings-C_CcU1dP.js +0 -1
- package/client/dist/assets/settings-Cto9n0eL.js +0 -1
- package/client/dist/assets/settings-Pyw8uYtL.js +0 -1
- package/client/dist/assets/settings-b3HVCNNd.js +0 -1
- package/client/dist/assets/settings-hdive4u6.js +0 -1
- package/client/dist/assets/setup-Be485n2u.js +0 -1
- package/client/dist/assets/setup-CKGUxKr-.js +0 -1
- package/client/dist/assets/setup-Ck1Uwd7_.js +0 -1
- package/client/dist/assets/setup-Cm774a6v.js +0 -1
- package/client/dist/assets/setup-DIqMQpxt.js +0 -1
- package/client/dist/assets/setup-DfCsoNFL.js +0 -1
- package/client/dist/assets/setup-DkeE8mP0.js +0 -1
- package/client/dist/assets/setup-xVntVaz1.js +0 -1
- package/client/dist/assets/specs-Bqvtz2kz.js +0 -1
- package/client/dist/assets/specs-CKes-kz6.js +0 -1
- package/client/dist/assets/specs-CfXxPDNB.js +0 -1
- package/client/dist/assets/specs-CyF9HuTI.js +0 -1
- package/client/dist/assets/specs-DMj035Mt.js +0 -1
- package/client/dist/assets/specs-DfIdoU5L.js +0 -1
- package/client/dist/assets/specs-j5pGLQeU.js +0 -1
- package/client/dist/assets/specs-xW5pkkB7.js +0 -1
- package/client/dist/assets/spending-CQnrWiR3.js +0 -1
- package/client/dist/assets/square-D0JTbRSR.js +0 -1
- package/client/dist/assets/tauri-shell-DE6LfGPw.js +0 -2
- package/client/dist/assets/terminal-BAzpHtpY.js +0 -1
- package/client/dist/assets/terminal-C7dHeR3x.js +0 -1
- package/client/dist/assets/terminal-CMla5Qsz.js +0 -1
- package/client/dist/assets/terminal-CdNXH-n9.js +0 -1
- package/client/dist/assets/terminal-Cw5bZsmV.js +0 -1
- package/client/dist/assets/terminal-DFUP4eNv.js +0 -1
- package/client/dist/assets/terminal-DGqljeK_.js +0 -1
- package/client/dist/assets/terminal-cU70NodO.js +0 -1
- package/client/dist/assets/tickets--tiSOCcn.js +0 -1
- package/client/dist/assets/tickets-BUJ3DMWU.js +0 -1
- package/client/dist/assets/tickets-C1WNPODq.js +0 -1
- package/client/dist/assets/tickets-CDjhWmiE.js +0 -1
- package/client/dist/assets/tickets-CLgPC3uO.js +0 -1
- package/client/dist/assets/tickets-D41ZMQpf.js +0 -1
- package/client/dist/assets/tickets-DEaQC06P.js +0 -1
- package/client/dist/assets/tickets-kcMzbLCp.js +0 -1
- package/client/dist/assets/trash-D8zYUmTg.js +0 -1
- package/client/dist/assets/useDesktop-BjLT0_EE.js +0 -1
- package/client/dist/assets/useRuntimeRuns-C97qEqMg.js +0 -1
- package/client/dist/assets/useSharedWebSocket-Bj4LMp7b.js +0 -2
- package/client/dist/assets/utils-BC4DHlz2.js +0 -1
- package/docs/guide/en/getting-started/4-the-dashboard-tour.md +0 -48
- package/docs/guide/es/getting-started/4-the-dashboard-tour.md +0 -48
- package/server/dist/mobile/mobile-preview-channel.js +0 -179
- package/server/dist/mobile/mobile-preview.js +0 -366
- package/server/dist/modules/browser/domain/preview-origins.js +0 -117
- package/server/dist/modules/browser/runtime/preview-targets.js +0 -80
- /package/client/dist/assets/{atom-one-dark-B-oHczHB.css → DocView-B-oHczHB.css} +0 -0
- /package/docs/guide/de/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/en/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/es/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/fr/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/it/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/ja/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/pt/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/zh/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
|
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.FLOW_SPEC_LOOP_ID = void 0;
|
|
6
7
|
exports.normalizeRailMode = normalizeRailMode;
|
|
7
8
|
exports.prDeliveryRevisionAllowed = prDeliveryRevisionAllowed;
|
|
8
9
|
exports.createRailsRouter = createRailsRouter;
|
|
@@ -28,6 +29,7 @@ const spec_models_1 = require("../../specs/runtime/spec-models");
|
|
|
28
29
|
const workspace_resolution_1 = require("../../../workspace-resolution");
|
|
29
30
|
const agent_runtime_loader_1 = require("../../agent-runtime/runtime/agent-runtime-loader");
|
|
30
31
|
const loop_factory_1 = require("../../loops/runtime/loop-factory");
|
|
32
|
+
Object.defineProperty(exports, "FLOW_SPEC_LOOP_ID", { enumerable: true, get: function () { return loop_factory_1.FLOW_SPEC_LOOP_ID; } });
|
|
31
33
|
const builtin_loops_1 = require("../../loops/runtime/builtin-loops");
|
|
32
34
|
const loop_constants_1 = require("../../loops/runtime/loop-constants");
|
|
33
35
|
const loop_command_catalog_1 = require("../../loops/runtime/loop-command-catalog");
|
|
@@ -36,12 +38,15 @@ const rail_isolation_1 = require("./rail-isolation");
|
|
|
36
38
|
const rail_pr_store_1 = require("./rail-pr-store");
|
|
37
39
|
const loop_effect_1 = require("../../loops/runtime/loop-effect");
|
|
38
40
|
const review_packet_1 = require("./review-packet");
|
|
41
|
+
const delivery_changes_1 = require("./delivery-changes");
|
|
39
42
|
const delivery_evidence_1 = require("./delivery-evidence");
|
|
40
43
|
const loop_definition_recovery_1 = require("../../loops/runtime/loop-definition-recovery");
|
|
41
44
|
const accept_ladder_1 = require("../../execution/runtime/accept-ladder");
|
|
42
45
|
const rail_pr_decision_1 = require("./rail-pr-decision");
|
|
43
46
|
const active_pr_continuation_1 = require("./active-pr-continuation");
|
|
44
47
|
const rail_isolated_launch_1 = require("./rail-isolated-launch");
|
|
48
|
+
const isolated_worktree_1 = require("./isolated-worktree");
|
|
49
|
+
const flow_worktree_handoff_1 = require("./flow-worktree-handoff");
|
|
45
50
|
const rail_relaunch_1 = require("./rail-relaunch");
|
|
46
51
|
const worktree_manager_1 = require("../../../worktree-manager");
|
|
47
52
|
const integration_branch_1 = require("../../../integration-branch");
|
|
@@ -58,6 +63,7 @@ const repo_lock_1 = require("../../../repo-lock");
|
|
|
58
63
|
const agent_chat_registry_1 = require("../../missions/runtime/agent-chat-registry");
|
|
59
64
|
const mission_run_notify_1 = require("../../missions/runtime/mission-run-notify");
|
|
60
65
|
const agent_runtime_controls_router_1 = require("../../agent-runtime/runtime/agent-runtime-controls-router");
|
|
66
|
+
const triage_1 = require("../../specs/domain/triage");
|
|
61
67
|
const ticket_store_1 = require("../../specs/runtime/ticket-store");
|
|
62
68
|
const spec_addenda_1 = require("../../specs/runtime/spec-addenda");
|
|
63
69
|
const process_admission_1 = require("../../../process-admission");
|
|
@@ -66,8 +72,19 @@ const VALID_MODES = new Set(['implement', 'freestyle', 'loop']);
|
|
|
66
72
|
* ticket in one aggregate run, so stored/agent/mobile `batch-implement` (or
|
|
67
73
|
* `batch`) requests are normalized to it at the HTTP boundary. */
|
|
68
74
|
const REMOVED_BATCH_MODES = new Set(['batch-implement', 'batch']);
|
|
75
|
+
/** Pre-rename name of Freestyle. Older Companion builds still send
|
|
76
|
+
* `mode: 'ultracode'`; accept it so un-updated phones keep launching. */
|
|
77
|
+
const LEGACY_FREESTYLE_MODE = 'ultracode';
|
|
69
78
|
function normalizeRailMode(mode) {
|
|
70
|
-
|
|
79
|
+
if (typeof mode !== 'string')
|
|
80
|
+
return mode;
|
|
81
|
+
if (REMOVED_BATCH_MODES.has(mode))
|
|
82
|
+
return 'implement';
|
|
83
|
+
if (mode === LEGACY_FREESTYLE_MODE) {
|
|
84
|
+
console.info(`[rails-router] legacy mode "${LEGACY_FREESTYLE_MODE}" accepted as "freestyle"`);
|
|
85
|
+
return 'freestyle';
|
|
86
|
+
}
|
|
87
|
+
return mode;
|
|
71
88
|
}
|
|
72
89
|
function prDeliveryContinuesTickets(delivery, ticketIds) {
|
|
73
90
|
if (delivery.decision !== 'pr_draft' && delivery.decision !== 'pr_ready')
|
|
@@ -155,6 +172,18 @@ function onReviewTicketIds(c) {
|
|
|
155
172
|
return new Set();
|
|
156
173
|
}
|
|
157
174
|
}
|
|
175
|
+
/** Spec triage (launch-triage): the loop recommended by the first triaged spec
|
|
176
|
+
* of the rail, in rail order (best-effort: an unreadable store ⇒ null). */
|
|
177
|
+
function recommendedLoopForRail(c, ticketIds) {
|
|
178
|
+
try {
|
|
179
|
+
const execution = (0, workspace_resolution_1.resolveProjectExecution)({ slug: c.project.slug, path: c.project.path });
|
|
180
|
+
const store = (0, ticket_store_1.readStore)(execution.relocated ? execution.ticketsPath : (0, ticket_store_1.resolveTicketStoragePath)(c.project.path));
|
|
181
|
+
return (0, triage_1.recommendedLoopForTickets)(ticketIds.map((id) => store.tickets[String(id)]));
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
158
187
|
/** Map an engine-availability refusal to the launch's 409 body; rethrow others. */
|
|
159
188
|
async function engineSupportRejection(manager, graph, loopId) {
|
|
160
189
|
try {
|
|
@@ -250,7 +279,11 @@ function createRailsRouter() {
|
|
|
250
279
|
? 'on_review'
|
|
251
280
|
: 'free',
|
|
252
281
|
}));
|
|
253
|
-
|
|
282
|
+
// review-wip-limit: the project's limit and the deliveries counting
|
|
283
|
+
// against it (absent in bare contexts without the gate).
|
|
284
|
+
const wip = c.reviewWipGate?.status();
|
|
285
|
+
const reviewWip = wip ? { limit: wip.limit, pending: wip.pending, reached: wip.limit !== null && wip.pending.length + wip.reserved >= wip.limit } : undefined;
|
|
286
|
+
res.json({ rails: railsWithAvailability, activeJobs, activeLoopRuns, prDeliveries, ...(reviewWip ? { reviewWip } : {}) });
|
|
254
287
|
}
|
|
255
288
|
catch (err) {
|
|
256
289
|
console.error('[rails-router] get rails error:', err);
|
|
@@ -553,6 +586,10 @@ function createRailsRouter() {
|
|
|
553
586
|
// Non-string values fail the VALID_MODES check below.
|
|
554
587
|
let mode = normalizeRailMode(req.body?.mode ?? 'implement');
|
|
555
588
|
const { repositoryIds: rawRepositoryIds, workspaceSelection: rawWorkspaceSelection, baseDeliveryIds, profileName, aiEngine, model, loopId: rawLoopId, reasoning_effort, originConversationId, originSurface, targetPrNumber, revisionOfDeliveryId, revisionNote, baseBranch: rawBaseBranch, followUp: rawFollowUp } = req.body ?? {};
|
|
589
|
+
// Per-launch soft cap (USD): > 0 caps this run, 0 waives the default. The
|
|
590
|
+
// sample-project first run sends it so a newcomer's first run is cost-bounded.
|
|
591
|
+
const rawRunCap = req.body?.runCapUsd;
|
|
592
|
+
const runCapUsd = typeof rawRunCap === 'number' && Number.isFinite(rawRunCap) && rawRunCap >= 0 ? rawRunCap : undefined;
|
|
556
593
|
// PR review follow-up (pr-follow-up-fixes): a typed, bounded, FROZEN scope
|
|
557
594
|
// for "resolve these review comments". It rides the delivery row and every
|
|
558
595
|
// ai-step prompt — never the spec, whose description Jira-linked projects
|
|
@@ -614,6 +651,43 @@ function createRailsRouter() {
|
|
|
614
651
|
}
|
|
615
652
|
const explicitLoop = (typeof rawLoopId === 'string' && rawLoopId.length > 0) || req.body?.mode != null;
|
|
616
653
|
let loopId = rawLoopId;
|
|
654
|
+
// Flow hand-off (Flow mode): the launch adopts the Flow's own worktree.
|
|
655
|
+
// Only the Flow module starts it, after freezing HEAD; it never combines
|
|
656
|
+
// with relaunch, revision, PR targets, follow-ups or stacked bases.
|
|
657
|
+
const rawFlowId = req.body?.flowId;
|
|
658
|
+
let flowWorktree = null;
|
|
659
|
+
if (rawFlowId !== undefined && rawFlowId !== null) {
|
|
660
|
+
if (typeof rawFlowId !== 'string' || !/^[A-Za-z0-9-]{1,64}$/.test(rawFlowId)) {
|
|
661
|
+
res.status(400).json({ error: 'invalid_flow_id' });
|
|
662
|
+
return;
|
|
663
|
+
}
|
|
664
|
+
if (relaunchSource || revisionOfDeliveryId || targetPrNumber !== undefined && targetPrNumber !== null || followUp || baseBranch || baseDeliveryIds !== undefined) {
|
|
665
|
+
res.status(400).json({ error: 'flow_handoff_incompatible', detail: 'A Flow hand-off launches the Flow spec on its own worktree only' });
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
if (!(0, feature_flags_1.isLoopsEnabled)()) {
|
|
669
|
+
res.status(409).json({ error: 'flow_requires_isolation', detail: 'A Flow hand-off needs Loops and worktree isolation' });
|
|
670
|
+
return;
|
|
671
|
+
}
|
|
672
|
+
if (!c.flowHandOff) {
|
|
673
|
+
res.status(409).json({ error: 'feature_unavailable', detail: 'Flow is not available in this project' });
|
|
674
|
+
return;
|
|
675
|
+
}
|
|
676
|
+
try {
|
|
677
|
+
flowWorktree = c.flowHandOff.resolve(rawFlowId);
|
|
678
|
+
}
|
|
679
|
+
catch (err) {
|
|
680
|
+
if (err instanceof flow_worktree_handoff_1.FlowHandOffNotReadyError) {
|
|
681
|
+
res.status(409).json({ error: err.code, detail: err.message });
|
|
682
|
+
return;
|
|
683
|
+
}
|
|
684
|
+
throw err;
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
else if (rawLoopId === loop_factory_1.FLOW_SPEC_LOOP_ID) {
|
|
688
|
+
res.status(400).json({ error: 'flow_id_required', detail: 'The Flow -> Spec loop is launched from a Flow hand-off' });
|
|
689
|
+
return;
|
|
690
|
+
}
|
|
617
691
|
// Origin link (safe-pr-review-flow): an agent-chat/MCP launch tags itself so
|
|
618
692
|
// the PR decision can later be posted back into the launching conversation.
|
|
619
693
|
// Both fields are optional; malformed values are rejected outright.
|
|
@@ -636,7 +710,7 @@ function createRailsRouter() {
|
|
|
636
710
|
res.status(404).json({ error: 'Factory loop not found' });
|
|
637
711
|
return;
|
|
638
712
|
}
|
|
639
|
-
loopId = (0, loop_factory_1.
|
|
713
|
+
loopId = (0, loop_factory_1.canonicalFactoryLoopId)(loopId); // canonicalize saved legacy aliases
|
|
640
714
|
mode = fmode;
|
|
641
715
|
}
|
|
642
716
|
if (relaunchSource)
|
|
@@ -688,6 +762,33 @@ function createRailsRouter() {
|
|
|
688
762
|
}
|
|
689
763
|
throw err;
|
|
690
764
|
}
|
|
765
|
+
// Daily budget (rail-loop-budget-guard): the same project/app-wide budget
|
|
766
|
+
// state the queue auto-pause enforces. Every launch door (dashboard Play,
|
|
767
|
+
// Launch all, mission cards, MCP launch/launch_all, mobile, milestone
|
|
768
|
+
// chains, relaunch) reaches this route, so one check spawns nothing.
|
|
769
|
+
const budgetRejection = c.dailyBudgetRejection?.() ?? null;
|
|
770
|
+
if (budgetRejection) {
|
|
771
|
+
res.status(409).json(budgetRejection);
|
|
772
|
+
return;
|
|
773
|
+
}
|
|
774
|
+
// Review WIP limit (review-wip-limit): same doors, same "spawn nothing"
|
|
775
|
+
// contract. Continuations of an existing delivery add no review work and
|
|
776
|
+
// pass; a new delivery holds a slot until this request has answered (its
|
|
777
|
+
// delivery row then exists), so parallel launches cannot overshoot.
|
|
778
|
+
const reviewWip = c.reviewWipGate?.admit(railIndex, {
|
|
779
|
+
revisionOfDeliveryId: typeof revisionOfDeliveryId === 'string' ? revisionOfDeliveryId : null,
|
|
780
|
+
relaunchOfDelivery: Boolean(relaunchSource?.delivery),
|
|
781
|
+
targetsExistingPr: typeof targetPrNumber === 'number' || Boolean(followUp),
|
|
782
|
+
railHasActiveDelivery: Boolean((0, rail_pr_store_1.getActivePrDeliveryByRail)(c.db, railIndex)),
|
|
783
|
+
});
|
|
784
|
+
if (reviewWip && !reviewWip.ok) {
|
|
785
|
+
res.status(409).json(reviewWip.rejection);
|
|
786
|
+
return;
|
|
787
|
+
}
|
|
788
|
+
if (reviewWip) {
|
|
789
|
+
res.once('finish', reviewWip.release);
|
|
790
|
+
res.once('close', reviewWip.release);
|
|
791
|
+
}
|
|
691
792
|
const storedRail = (0, rails_store_1.getRail)(c.db, railIndex);
|
|
692
793
|
const rail = relaunchSource ? { ...storedRail, ticketIds: [...relaunchSource.ticketIds],
|
|
693
794
|
profileName: typeof profileName === 'string' ? profileName : null,
|
|
@@ -701,6 +802,10 @@ function createRailsRouter() {
|
|
|
701
802
|
res.status(400).json({ error: 'Rail has no tickets assigned' });
|
|
702
803
|
return;
|
|
703
804
|
}
|
|
805
|
+
if (flowWorktree && (rail.ticketIds.length !== 1 || rail.ticketIds[0] !== flowWorktree.ticketId)) {
|
|
806
|
+
res.status(409).json({ error: 'flow_rail_mismatch', detail: 'The rail must carry exactly the Flow spec' });
|
|
807
|
+
return;
|
|
808
|
+
}
|
|
704
809
|
// A durable delta defaults to Quick SDD when the caller has not chosen a workflow.
|
|
705
810
|
// Revision is a delivery-continuation mechanism, not the implementation loop.
|
|
706
811
|
const launchAddenda = (0, spec_addenda_1.planSpecAddendaAt)((0, spec_addenda_1.ticketStorePathForProject)(c.project), rail.ticketIds);
|
|
@@ -910,6 +1015,11 @@ function createRailsRouter() {
|
|
|
910
1015
|
// last Published snapshot while an edit is Draft); otherwise the
|
|
911
1016
|
// current code default for this Core.
|
|
912
1017
|
const f = builtinSelection;
|
|
1018
|
+
// Flow -> Spec exists only on a Core that advertises `deriveChange`.
|
|
1019
|
+
if (!f && loopId === loop_factory_1.FLOW_SPEC_LOOP_ID) {
|
|
1020
|
+
res.status(409).json({ error: 'engine_unsupported', detail: 'Update Core to run the Flow → Spec loop (derive-change).' });
|
|
1021
|
+
return;
|
|
1022
|
+
}
|
|
913
1023
|
if (!f) {
|
|
914
1024
|
res.status(404).json({ error: 'Factory loop not found' });
|
|
915
1025
|
return;
|
|
@@ -1159,6 +1269,15 @@ function createRailsRouter() {
|
|
|
1159
1269
|
res.status(409).json({ error: 'repository_isolation_required', detail: 'Selected repositories require worktree isolation for this loop.' });
|
|
1160
1270
|
return;
|
|
1161
1271
|
}
|
|
1272
|
+
// A Flow runs in exactly its own repository: the primary (no group), or
|
|
1273
|
+
// the one non-primary member its worktree belongs to.
|
|
1274
|
+
const flowRepositoryScope = !flowWorktree ? true : flowWorktree.repositoryId
|
|
1275
|
+
? repositoryIds.length === 1 && repositoryIds[0] === flowWorktree.repositoryId
|
|
1276
|
+
: !requiresRepositoryIsolation;
|
|
1277
|
+
if (flowWorktree && (!useIsolation || !flowRepositoryScope)) {
|
|
1278
|
+
res.status(409).json({ error: 'flow_requires_isolation', detail: 'A Flow hand-off runs only on its own worktree, in the repository it belongs to.' });
|
|
1279
|
+
return;
|
|
1280
|
+
}
|
|
1162
1281
|
if (relaunchSource?.delivery && !useIsolation) {
|
|
1163
1282
|
res.status(409).json({ error: 'relaunch_isolation_required', detail: 'The original attempt was isolated; its retry must also use an isolated worktree.',
|
|
1164
1283
|
action: 'Restore worktree isolation and the original workflow before retrying.' });
|
|
@@ -1185,6 +1304,10 @@ function createRailsRouter() {
|
|
|
1185
1304
|
// unborn HEAD can't be branched). Fall back (with a message) otherwise.
|
|
1186
1305
|
const status = requiresRepositoryIsolation ? 'ok' : await (0, worktree_manager_1.repoIsolationStatus)(worktree_manager_1.defaultGitRunner, c.project.path);
|
|
1187
1306
|
if (status !== 'ok') {
|
|
1307
|
+
if (flowWorktree) {
|
|
1308
|
+
res.status(409).json({ error: 'flow_requires_isolation', detail: `worktree isolation is unavailable (${status})` });
|
|
1309
|
+
return;
|
|
1310
|
+
}
|
|
1188
1311
|
if (baseBranch) {
|
|
1189
1312
|
res.status(400).json({ error: 'base_branch_requires_isolation', detail: `baseBranch requires worktree isolation, which is unavailable (${status})` });
|
|
1190
1313
|
return;
|
|
@@ -1221,11 +1344,13 @@ function createRailsRouter() {
|
|
|
1221
1344
|
broadcastRailUpdated(c, railIndex, 'tickets');
|
|
1222
1345
|
const ids = await (0, rail_isolated_launch_1.launchIsolatedRail)({
|
|
1223
1346
|
launchConfig,
|
|
1347
|
+
loopChoice: { recommendedLoop: recommendedLoopForRail(c, rail.ticketIds), chosenLoop: loopId },
|
|
1224
1348
|
runtimeProviderOverride,
|
|
1225
1349
|
ctx: c, railIndex, ticketIds: [...rail.ticketIds], repositoryIds, workspaceSelection, ...repositoryBases, loopId, loopName, loopGraph,
|
|
1226
1350
|
provider: loopProvider, model: loopModel, effort, scope,
|
|
1227
1351
|
...(deciderEngine ? { deciderEngine } : {}),
|
|
1228
1352
|
profileName: resolvedProfile,
|
|
1353
|
+
...(runCapUsd !== undefined ? { runCapUsd } : {}),
|
|
1229
1354
|
originSurface: originSurface ?? 'dashboard',
|
|
1230
1355
|
originConversationId: originConversationId ?? null,
|
|
1231
1356
|
...(baseBranch ? { baseBranch } : {}),
|
|
@@ -1252,6 +1377,7 @@ function createRailsRouter() {
|
|
|
1252
1377
|
...(revisionRequest ? { revision: revisionRequest } : {}),
|
|
1253
1378
|
...(retryOfDelivery ? { retryOfDelivery } : {}),
|
|
1254
1379
|
...(followUp ? { followUp } : {}),
|
|
1380
|
+
...(flowWorktree ? { requiredFlowWorktree: flowWorktree } : {}),
|
|
1255
1381
|
});
|
|
1256
1382
|
res.status(202).json({ loopRunIds: ids, railIndex, mode, loopId, prDeliveryId: (0, rail_pr_store_1.getActivePrDeliveryByRail)(c.db, railIndex)?.id ?? null, isolated: true, ...(followUp ? { followUp: { id: followUp.id, version: followUp.version, hash: followUp.hash } } : {}) });
|
|
1257
1383
|
return;
|
|
@@ -1271,6 +1397,14 @@ function createRailsRouter() {
|
|
|
1271
1397
|
// Explicit-target validation failures are the USER's answer being
|
|
1272
1398
|
// unusable — fail closed with the machine-readable code; never
|
|
1273
1399
|
// fall back to a fresh shared-cwd run next to the designated PR.
|
|
1400
|
+
if (err instanceof isolated_worktree_1.RepositoryHasNoCommitsError) {
|
|
1401
|
+
res.status(409).json({ error: err.code, detail: err.message });
|
|
1402
|
+
return;
|
|
1403
|
+
}
|
|
1404
|
+
if (err instanceof flow_worktree_handoff_1.FlowWorktreeMismatchError) {
|
|
1405
|
+
res.status(409).json({ error: err.code, detail: err.message });
|
|
1406
|
+
return;
|
|
1407
|
+
}
|
|
1274
1408
|
if (err instanceof active_pr_continuation_1.ExplicitPrTargetError) {
|
|
1275
1409
|
res.status(err.code === 'target_pr_not_found' ? 404 : 409).json({
|
|
1276
1410
|
error: err.code,
|
|
@@ -1394,6 +1528,7 @@ function createRailsRouter() {
|
|
|
1394
1528
|
effort,
|
|
1395
1529
|
...(deciderEngine ? { deciderEngine } : {}),
|
|
1396
1530
|
profileName: resolvedProfile,
|
|
1531
|
+
...(runCapUsd !== undefined ? { runCapUsd } : {}),
|
|
1397
1532
|
...(claimedAddenda.briefing ? { addenda: { ids: claimedAddenda.snapshot.map((e) => e.id), briefing: claimedAddenda.briefing } } : {}),
|
|
1398
1533
|
})
|
|
1399
1534
|
.then((r) => {
|
|
@@ -1647,7 +1782,7 @@ function createRailsRouter() {
|
|
|
1647
1782
|
if (existing) {
|
|
1648
1783
|
const pipelineDir = path_1.default.join((0, workspace_resolution_1.resolveProjectExecution)({ slug: c.project.slug, path: c.project.path }).specrailsDir, 'pipeline');
|
|
1649
1784
|
const definitionStatuses = await (0, loop_definition_recovery_1.probeDefinitionRuns)({ db: c.db, cwd: c.project.path, env: process.env }, existing.units.filter(unit => !unit.runtime && unit.runId && (0, loop_runs_store_1.getLoopRun)(c.db, unit.runId)?.engine_version === 2).map(unit => unit.runId), true);
|
|
1650
|
-
const healed = (0, delivery_evidence_1.healRuntimeEvidence)(existing, pipelineDir, {}, definitionStatuses);
|
|
1785
|
+
const healed = (0, delivery_evidence_1.healRuntimeEvidence)(existing, pipelineDir, {}, definitionStatuses, { reviewBrief: await (0, delivery_evidence_1.coreAnnouncesReviewBrief)() });
|
|
1651
1786
|
if (healed) {
|
|
1652
1787
|
(0, rail_pr_store_1.updatePrDeliverySettleEvidence)(c.db, row.id, healed);
|
|
1653
1788
|
row = { ...row, settle_evidence: JSON.stringify(healed) };
|
|
@@ -1657,7 +1792,7 @@ function createRailsRouter() {
|
|
|
1657
1792
|
catch (err) {
|
|
1658
1793
|
console.warn('[rails-router] packet evidence heal skipped:', err instanceof Error ? err.message : String(err));
|
|
1659
1794
|
}
|
|
1660
|
-
const packet = (0, review_packet_1.composeReviewPacket)({ db: c.db, row, ...(frozenRepository ? { repositoryId: frozenRepository.repositoryId, includeLegacyProvenance: frozenRepository.repositoryId === manifest?.primaryRepositoryId } : {}) });
|
|
1795
|
+
const packet = (0, review_packet_1.composeReviewPacket)({ db: c.db, row, flowSettlement: c.flow?.settlementForDelivery(row.id) ?? null, ...(frozenRepository ? { repositoryId: frozenRepository.repositoryId, includeLegacyProvenance: frozenRepository.repositoryId === manifest?.primaryRepositoryId } : {}) });
|
|
1661
1796
|
// Capability probes are read-only and offline; a failure degrades to the
|
|
1662
1797
|
// confirm-gated local path rather than blocking the packet.
|
|
1663
1798
|
const acceptCapability = await (0, accept_ladder_1.resolveAcceptCapability)({ repoDir: frozenRepository?.sourcePath ?? c.project.path, exec: pr_publisher_1.defaultExec });
|
|
@@ -1668,6 +1803,87 @@ function createRailsRouter() {
|
|
|
1668
1803
|
res.status(500).json({ error: 'packet composition failed', detail: err.message });
|
|
1669
1804
|
}
|
|
1670
1805
|
});
|
|
1806
|
+
// GET /rails/pr-deliveries/:id/changes[?repositoryId=&source=] — the review
|
|
1807
|
+
// packet's Changes tab: the delivery's head vs its merge-base with the base
|
|
1808
|
+
// branch (file list + counts + hashes) and the annotations the delivery already
|
|
1809
|
+
// holds. GET .../changes/file?path=&full=1 parses ONE file lazily. Read-only;
|
|
1810
|
+
// `path` is a lookup key against the diff's own listing, never a pathspec.
|
|
1811
|
+
const changesScope = (req, res) => {
|
|
1812
|
+
if (!(0, feature_flags_1.isReviewPacketEnabled)()) {
|
|
1813
|
+
res.status(404).json({ error: 'Not Found' });
|
|
1814
|
+
return null;
|
|
1815
|
+
}
|
|
1816
|
+
const c = ctx(req);
|
|
1817
|
+
let row = (0, rail_pr_store_1.getPrDelivery)(c.db, req.params.prDeliveryId);
|
|
1818
|
+
if (!row) {
|
|
1819
|
+
res.status(404).json({ error: 'Delivery not found' });
|
|
1820
|
+
return null;
|
|
1821
|
+
}
|
|
1822
|
+
const parent = row.parent_delivery_id ? (0, rail_pr_store_1.getPrDelivery)(c.db, row.parent_delivery_id) : row;
|
|
1823
|
+
if (!parent) {
|
|
1824
|
+
res.status(404).json({ error: 'Delivery group not found' });
|
|
1825
|
+
return null;
|
|
1826
|
+
}
|
|
1827
|
+
const repositoryId = req.query.repositoryId;
|
|
1828
|
+
if (repositoryId !== undefined && (typeof repositoryId !== 'string' || !repositoryId)) {
|
|
1829
|
+
res.status(400).json({ error: 'Invalid repositoryId' });
|
|
1830
|
+
return null;
|
|
1831
|
+
}
|
|
1832
|
+
const source = req.query.source;
|
|
1833
|
+
if (source !== undefined && (typeof source !== 'string' || !/^(delivery|ticket:\d+)$/.test(source))) {
|
|
1834
|
+
res.status(400).json({ error: 'Invalid source' });
|
|
1835
|
+
return null;
|
|
1836
|
+
}
|
|
1837
|
+
if (repositoryId) {
|
|
1838
|
+
row = (0, multi_repo_execution_1.listRepositoryDeliveries)(c.db, parent.id).find((child) => child.repository_id === repositoryId);
|
|
1839
|
+
if (!row) {
|
|
1840
|
+
res.status(404).json({ error: 'Repository not in this delivery' });
|
|
1841
|
+
return null;
|
|
1842
|
+
}
|
|
1843
|
+
}
|
|
1844
|
+
const manifest = (0, multi_repo_execution_store_1.readExecutionManifest)(parent.execution_manifest);
|
|
1845
|
+
const frozen = row.repository_id ? manifest?.repositories.find((repository) => repository.repositoryId === row.repository_id && repository.sourcePath === row.repository_path) : undefined;
|
|
1846
|
+
if (row.parent_delivery_id && !frozen) {
|
|
1847
|
+
res.status(409).json({ error: 'Repository delivery has no frozen source path' });
|
|
1848
|
+
return null;
|
|
1849
|
+
}
|
|
1850
|
+
return { c, row, repoDir: frozen?.sourcePath ?? c.project.path, repositoryId: frozen?.repositoryId ?? null, source: source ?? null };
|
|
1851
|
+
};
|
|
1852
|
+
router.get('/pr-deliveries/:prDeliveryId/changes', async (req, res) => {
|
|
1853
|
+
const scope = changesScope(req, res);
|
|
1854
|
+
if (!scope)
|
|
1855
|
+
return;
|
|
1856
|
+
try {
|
|
1857
|
+
const changes = await (0, delivery_changes_1.composeDeliveryChanges)({ row: scope.row, repoDir: scope.repoDir, sourceId: scope.source, repositoryId: scope.repositoryId });
|
|
1858
|
+
res.json({ prDeliveryId: scope.row.id, repositoryId: scope.repositoryId, changes });
|
|
1859
|
+
}
|
|
1860
|
+
catch (err) {
|
|
1861
|
+
console.error('[rails-router] changes composition failed:', err);
|
|
1862
|
+
res.status(500).json({ error: 'changes composition failed' });
|
|
1863
|
+
}
|
|
1864
|
+
});
|
|
1865
|
+
router.get('/pr-deliveries/:prDeliveryId/changes/file', async (req, res) => {
|
|
1866
|
+
const scope = changesScope(req, res);
|
|
1867
|
+
if (!scope)
|
|
1868
|
+
return;
|
|
1869
|
+
const filePath = req.query.path;
|
|
1870
|
+
if (typeof filePath !== 'string' || !filePath || filePath.length > 1000 || filePath.includes('\0')) {
|
|
1871
|
+
res.status(400).json({ error: 'Invalid path' });
|
|
1872
|
+
return;
|
|
1873
|
+
}
|
|
1874
|
+
try {
|
|
1875
|
+
const result = await (0, delivery_changes_1.composeFileDiff)({ row: scope.row, repoDir: scope.repoDir, sourceId: scope.source, repositoryId: scope.repositoryId, path: filePath, full: req.query.full === '1' });
|
|
1876
|
+
if (!result.ok) {
|
|
1877
|
+
res.status(result.status).json({ error: result.error });
|
|
1878
|
+
return;
|
|
1879
|
+
}
|
|
1880
|
+
res.json({ prDeliveryId: scope.row.id, diff: result.diff });
|
|
1881
|
+
}
|
|
1882
|
+
catch (err) {
|
|
1883
|
+
console.error('[rails-router] file diff failed:', err);
|
|
1884
|
+
res.status(500).json({ error: 'file diff failed' });
|
|
1885
|
+
}
|
|
1886
|
+
});
|
|
1671
1887
|
// POST /rails/pr-decision — the ONE decision action (safe-pr-review-flow) both
|
|
1672
1888
|
// surfaces (dashboard rail row + agent-chat card) call on a rail_pr_deliveries
|
|
1673
1889
|
// row: create-pr | publish | discard/dismiss | poll/reopen | merge-local |
|
|
@@ -1764,6 +1980,52 @@ function createRailsRouter() {
|
|
|
1764
1980
|
res.status(500).json({ error: 'pr-decision failed', detail: err.message });
|
|
1765
1981
|
}
|
|
1766
1982
|
});
|
|
1983
|
+
// POST /rails/pr-local-changes/{restore,bring-back,discard-branch} — the
|
|
1984
|
+
// person's uncommitted work "Integrate locally" saved as a stash (by commit
|
|
1985
|
+
// sha). "restore" re-applies it (a clean apply drops it; a conflict keeps it
|
|
1986
|
+
// and Specrails restores it on its own branch + worktree). "bring-back"
|
|
1987
|
+
// fast-forwards the target to the reviewed restore commit and only then
|
|
1988
|
+
// drops the stash; "discard-branch" removes the restore branch, keeping the
|
|
1989
|
+
// stash. Each takes the repository lock and refuses while a decision lease
|
|
1990
|
+
// is held (proactive-local-integration).
|
|
1991
|
+
const localChangesActions = {
|
|
1992
|
+
restore: rail_pr_decision_1.runRestoreLocalChanges,
|
|
1993
|
+
'bring-back': rail_pr_decision_1.runBringBackLocalChanges,
|
|
1994
|
+
'discard-branch': rail_pr_decision_1.runDiscardRestoreBranch,
|
|
1995
|
+
};
|
|
1996
|
+
for (const [action, run] of Object.entries(localChangesActions)) {
|
|
1997
|
+
router.post(`/pr-local-changes/${action}`, async (req, res) => {
|
|
1998
|
+
const c = ctx(req);
|
|
1999
|
+
const { prDeliveryId } = req.body ?? {};
|
|
2000
|
+
if (typeof prDeliveryId !== 'string' || !prDeliveryId) {
|
|
2001
|
+
res.status(400).json({ error: 'prDeliveryId is required' });
|
|
2002
|
+
return;
|
|
2003
|
+
}
|
|
2004
|
+
try {
|
|
2005
|
+
const admission = (0, process_admission_1.captureProcessAdmission)(c.project.id);
|
|
2006
|
+
const result = await run({
|
|
2007
|
+
db: c.db,
|
|
2008
|
+
project: { id: c.project.id, slug: c.project.slug, path: c.project.path },
|
|
2009
|
+
git: worktree_manager_1.defaultGitRunner,
|
|
2010
|
+
exec: pr_publisher_1.defaultExec,
|
|
2011
|
+
broadcast: c.broadcast,
|
|
2012
|
+
jiraSyncManager: c.jiraSyncManager,
|
|
2013
|
+
assertAdmission: () => admission.assertCurrent(),
|
|
2014
|
+
}, prDeliveryId);
|
|
2015
|
+
const current = (0, rail_pr_store_1.getPrDelivery)(c.db, prDeliveryId);
|
|
2016
|
+
const shown = current?.parent_delivery_id ? (0, rail_pr_store_1.getPrDelivery)(c.db, current.parent_delivery_id) : current;
|
|
2017
|
+
res.status(result.status).json({ ...result.body, ...(shown ? { snapshot: (0, rail_pr_store_1.toPrDeliverySnapshot)(shown) } : {}) });
|
|
2018
|
+
}
|
|
2019
|
+
catch (err) {
|
|
2020
|
+
if (err instanceof process_admission_1.ProcessAdmissionClosedError) {
|
|
2021
|
+
res.status(409).json({ error: 'project_recovery_in_progress' });
|
|
2022
|
+
return;
|
|
2023
|
+
}
|
|
2024
|
+
console.error(`[rails-router] local changes ${action} error:`, err);
|
|
2025
|
+
res.status(500).json({ error: `${action} failed`, detail: err.message });
|
|
2026
|
+
}
|
|
2027
|
+
});
|
|
2028
|
+
}
|
|
1767
2029
|
// POST /rails/pr-checkout — move the user's main checkout to the delivered PR
|
|
1768
2030
|
// branch. This is intentionally separate from PR decisions: it does not accept,
|
|
1769
2031
|
// publish, discard, or merge anything. It only releases Specrails-managed
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The reviewer's risk brief (Core capability `reviewBrief: 1`, contract 5.3):
|
|
4
|
+
* an advisory "what to look at" record the runtime reviewer writes next to its
|
|
5
|
+
* verdict. Desktop harvests it at settle into `settle_evidence`, renders it
|
|
6
|
+
* first in the review packet, summarizes it in the PR body and shows the top
|
|
7
|
+
* risk on the mission / delivery cards.
|
|
8
|
+
*
|
|
9
|
+
* Pure module: tolerant normalization and summaries only. Every field is
|
|
10
|
+
* optional on the wire (older reviewers, custom reviewer definitions), so a
|
|
11
|
+
* malformed entry is dropped and counted rather than failing the harvest; the
|
|
12
|
+
* approval gate never reads the brief, and neither does any Desktop decision.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.REVIEW_RISK_SEVERITIES = exports.REVIEW_BRIEF_RISK_LIMIT = exports.REVIEW_BRIEF_FILE = void 0;
|
|
16
|
+
exports.normalizeReviewBrief = normalizeReviewBrief;
|
|
17
|
+
exports.sortRisks = sortRisks;
|
|
18
|
+
exports.isEmptyReviewBrief = isEmptyReviewBrief;
|
|
19
|
+
exports.parseReviewBriefRecord = parseReviewBriefRecord;
|
|
20
|
+
exports.reviewBriefFromReviewerOutput = reviewBriefFromReviewerOutput;
|
|
21
|
+
exports.summarizeReviewBriefs = summarizeReviewBriefs;
|
|
22
|
+
exports.buildWhatToLookAt = buildWhatToLookAt;
|
|
23
|
+
exports.REVIEW_BRIEF_FILE = 'review-brief.json';
|
|
24
|
+
exports.REVIEW_BRIEF_RISK_LIMIT = 5;
|
|
25
|
+
const LIST_LIMIT = 20;
|
|
26
|
+
const TEXT_LIMIT = 2000;
|
|
27
|
+
const DIAGNOSTIC_LIMIT = 600;
|
|
28
|
+
exports.REVIEW_RISK_SEVERITIES = ['high', 'medium', 'low'];
|
|
29
|
+
const INVARIANT_STATUSES = ['kept', 'changed', 'at-risk'];
|
|
30
|
+
const SEVERITY_RANK = { high: 0, medium: 1, low: 2 };
|
|
31
|
+
function isRecord(value) {
|
|
32
|
+
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
33
|
+
}
|
|
34
|
+
function text(value, cap = TEXT_LIMIT) {
|
|
35
|
+
return typeof value === 'string' && value.trim() ? value.trim().slice(0, cap) : null;
|
|
36
|
+
}
|
|
37
|
+
function list(value, parse, counter) {
|
|
38
|
+
if (value === undefined || value === null)
|
|
39
|
+
return [];
|
|
40
|
+
if (!Array.isArray(value)) {
|
|
41
|
+
counter.dropped++;
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
const out = [];
|
|
45
|
+
for (const item of value) {
|
|
46
|
+
const parsed = parse(item);
|
|
47
|
+
if (parsed === null)
|
|
48
|
+
counter.dropped++;
|
|
49
|
+
else if (out.length < LIST_LIMIT)
|
|
50
|
+
out.push(parsed);
|
|
51
|
+
}
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Tolerant normalization of a brief object. Returns null when the value is not
|
|
56
|
+
* an object at all; otherwise a brief with every list present. Entries missing
|
|
57
|
+
* their key text (or carrying an unknown severity) are dropped and counted —
|
|
58
|
+
* a risk without a severity cannot be ordered honestly.
|
|
59
|
+
*/
|
|
60
|
+
function normalizeReviewBrief(value) {
|
|
61
|
+
if (!isRecord(value))
|
|
62
|
+
return null;
|
|
63
|
+
const counter = { dropped: 0 };
|
|
64
|
+
const behaviourChanges = list(value.behaviourChanges, (item) => {
|
|
65
|
+
if (!isRecord(item))
|
|
66
|
+
return null;
|
|
67
|
+
const what = text(item.what);
|
|
68
|
+
return what ? { what, where: text(item.where), userVisible: typeof item.userVisible === 'boolean' ? item.userVisible : null } : null;
|
|
69
|
+
}, counter);
|
|
70
|
+
const invariantsTouched = list(value.invariantsTouched, (item) => {
|
|
71
|
+
if (!isRecord(item))
|
|
72
|
+
return null;
|
|
73
|
+
const invariant = text(item.invariant);
|
|
74
|
+
const status = INVARIANT_STATUSES.includes(item.status) ? item.status : null;
|
|
75
|
+
return invariant ? { invariant, evidence: text(item.evidence), status } : null;
|
|
76
|
+
}, counter);
|
|
77
|
+
const untested = list(value.untested, (item) => {
|
|
78
|
+
if (!isRecord(item))
|
|
79
|
+
return null;
|
|
80
|
+
const filePath = text(item.path);
|
|
81
|
+
return filePath ? { path: filePath, why: text(item.why) } : null;
|
|
82
|
+
}, counter);
|
|
83
|
+
const risks = list(value.risks, (item) => {
|
|
84
|
+
if (!isRecord(item))
|
|
85
|
+
return null;
|
|
86
|
+
const whatToLookAt = text(item.whatToLookAt);
|
|
87
|
+
if (!whatToLookAt || !exports.REVIEW_RISK_SEVERITIES.includes(item.severity))
|
|
88
|
+
return null;
|
|
89
|
+
return { severity: item.severity, area: text(item.area, 40), whatToLookAt, ref: text(item.ref) };
|
|
90
|
+
}, counter);
|
|
91
|
+
const humanChecks = list(value.humanChecks, (item) => text(item), counter);
|
|
92
|
+
const divergences = list(value.divergences, (item) => {
|
|
93
|
+
if (!isRecord(item))
|
|
94
|
+
return null;
|
|
95
|
+
const capability = text(item.capability), requirement = text(item.requirement), observed = text(item.observed);
|
|
96
|
+
return capability && requirement && observed ? { capability, requirement, observed } : null;
|
|
97
|
+
}, counter);
|
|
98
|
+
return {
|
|
99
|
+
brief: { behaviourChanges, invariantsTouched, untested, risks: sortRisks(risks).slice(0, exports.REVIEW_BRIEF_RISK_LIMIT), humanChecks, divergences },
|
|
100
|
+
dropped: counter.dropped,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/** Stable severity order: high, medium, low; original order within a severity. */
|
|
104
|
+
function sortRisks(risks) {
|
|
105
|
+
return risks.map((risk, index) => ({ risk, index }))
|
|
106
|
+
.sort((a, b) => SEVERITY_RANK[a.risk.severity] - SEVERITY_RANK[b.risk.severity] || a.index - b.index)
|
|
107
|
+
.map((entry) => entry.risk);
|
|
108
|
+
}
|
|
109
|
+
function isEmptyReviewBrief(brief) {
|
|
110
|
+
return brief.behaviourChanges.length === 0 && brief.invariantsTouched.length === 0 && brief.untested.length === 0
|
|
111
|
+
&& brief.risks.length === 0 && brief.humanChecks.length === 0 && brief.divergences.length === 0;
|
|
112
|
+
}
|
|
113
|
+
function score(value) {
|
|
114
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Read Core's `review-brief.json` record (`{schemaVersion:1, change, approved,
|
|
118
|
+
* score, recordedAt, brief|null, diagnostic?}`). Returns null when there is no
|
|
119
|
+
* record; an unreadable or unknown-version record becomes a record without a
|
|
120
|
+
* brief whose diagnostic says so, so the packet never silently loses it.
|
|
121
|
+
*/
|
|
122
|
+
function parseReviewBriefRecord(raw) {
|
|
123
|
+
let parsed;
|
|
124
|
+
try {
|
|
125
|
+
parsed = JSON.parse(raw);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return unreadableRecord('pipeline', 'The review brief file is not valid JSON.');
|
|
129
|
+
}
|
|
130
|
+
if (!isRecord(parsed) || parsed.schemaVersion !== 1) {
|
|
131
|
+
return unreadableRecord('pipeline', 'The review brief file has an unsupported schema version.');
|
|
132
|
+
}
|
|
133
|
+
return recordFrom('pipeline', parsed.brief, parsed.diagnostic, {
|
|
134
|
+
approved: typeof parsed.approved === 'boolean' ? parsed.approved : null,
|
|
135
|
+
score: score(parsed.score),
|
|
136
|
+
recordedAt: text(parsed.recordedAt, 64),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
function unreadableRecord(source, diagnostic) {
|
|
140
|
+
return { source, approved: null, score: null, recordedAt: null, brief: null, diagnostic, droppedEntries: 0 };
|
|
141
|
+
}
|
|
142
|
+
function recordFrom(source, rawBrief, rawDiagnostic, verdict) {
|
|
143
|
+
const normalized = rawBrief === null || rawBrief === undefined ? null : normalizeReviewBrief(rawBrief);
|
|
144
|
+
const malformed = rawBrief !== null && rawBrief !== undefined && normalized === null;
|
|
145
|
+
return {
|
|
146
|
+
source,
|
|
147
|
+
...verdict,
|
|
148
|
+
brief: normalized?.brief ?? null,
|
|
149
|
+
diagnostic: text(rawDiagnostic, DIAGNOSTIC_LIMIT) ?? (malformed ? 'The review brief is not an object.' : null),
|
|
150
|
+
droppedEntries: normalized?.dropped ?? 0,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Brief carried by a reviewer output object (engine 2 piece output `review`,
|
|
155
|
+
* a reviewer implementation step, or a reviewer role turn). Returns null when
|
|
156
|
+
* the output carries neither a brief nor a brief diagnostic (older Core).
|
|
157
|
+
*/
|
|
158
|
+
function reviewBriefFromReviewerOutput(output, source = 'definition') {
|
|
159
|
+
if (!isRecord(output))
|
|
160
|
+
return null;
|
|
161
|
+
if (!('brief' in output) && !('briefDiagnostic' in output))
|
|
162
|
+
return null;
|
|
163
|
+
return recordFrom(source, output.brief, output.briefDiagnostic, {
|
|
164
|
+
approved: typeof output.approved === 'boolean' ? output.approved : null,
|
|
165
|
+
score: score(output.score),
|
|
166
|
+
recordedAt: null,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
/** Summarize the brief records of one delivery; null when no unit carries one. */
|
|
170
|
+
function summarizeReviewBriefs(records) {
|
|
171
|
+
const present = records.filter((record) => !!record);
|
|
172
|
+
if (present.length === 0)
|
|
173
|
+
return null;
|
|
174
|
+
const risks = sortRisks(present.flatMap((record) => record.brief?.risks ?? []));
|
|
175
|
+
return {
|
|
176
|
+
highCount: risks.filter((risk) => risk.severity === 'high').length,
|
|
177
|
+
mediumCount: risks.filter((risk) => risk.severity === 'medium').length,
|
|
178
|
+
lowCount: risks.filter((risk) => risk.severity === 'low').length,
|
|
179
|
+
top: risks[0] ?? null,
|
|
180
|
+
diagnostic: present.some((record) => record.diagnostic !== null),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/** Merge every unit's brief into the packet section; null when there is nothing to show. */
|
|
184
|
+
function buildWhatToLookAt(units) {
|
|
185
|
+
const out = { risks: [], behaviourChanges: [], invariantsTouched: [], untested: [], humanChecks: [], divergences: [], diagnostics: [], droppedEntries: 0 };
|
|
186
|
+
for (const unit of units) {
|
|
187
|
+
const record = unit.reviewBrief;
|
|
188
|
+
if (!record)
|
|
189
|
+
continue;
|
|
190
|
+
const ticketId = unit.ticketId;
|
|
191
|
+
if (record.diagnostic)
|
|
192
|
+
out.diagnostics.push({ ticketId, message: record.diagnostic });
|
|
193
|
+
out.droppedEntries += record.droppedEntries || 0;
|
|
194
|
+
const brief = record.brief;
|
|
195
|
+
if (!brief)
|
|
196
|
+
continue;
|
|
197
|
+
out.risks.push(...brief.risks.map((entry) => ({ ...entry, ticketId })));
|
|
198
|
+
out.behaviourChanges.push(...brief.behaviourChanges.map((entry) => ({ ...entry, ticketId })));
|
|
199
|
+
out.invariantsTouched.push(...brief.invariantsTouched.map((entry) => ({ ...entry, ticketId })));
|
|
200
|
+
out.untested.push(...brief.untested.map((entry) => ({ ...entry, ticketId })));
|
|
201
|
+
out.humanChecks.push(...brief.humanChecks.map((entry) => ({ text: entry, ticketId })));
|
|
202
|
+
out.divergences.push(...brief.divergences.map((entry) => ({ ...entry, ticketId })));
|
|
203
|
+
}
|
|
204
|
+
out.risks = sortRisks(out.risks);
|
|
205
|
+
const empty = out.risks.length + out.behaviourChanges.length + out.invariantsTouched.length + out.untested.length
|
|
206
|
+
+ out.humanChecks.length + out.divergences.length + out.diagnostics.length === 0;
|
|
207
|
+
return empty ? null : out;
|
|
208
|
+
}
|