specrails-desktop 2.64.1 → 2.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/cli/dist/status.js +3 -0
- package/client/dist/assets/ActivityFeedPage-ByVKYII-.js +1 -0
- package/client/dist/assets/AgentBrowserCapture-BGUTjhUr.js +1 -0
- package/client/dist/assets/AgentModeAnalyticsPane-CtOLDDjB.js +2 -0
- package/client/dist/assets/AgentModeCodePane-CDhUKarT.js +2 -0
- package/client/dist/assets/AgentModeJobsPane-BAa_oEHJ.js +1 -0
- package/client/dist/assets/AgentsPage-D32hG4Ve.js +120 -0
- package/client/dist/assets/AnalyticsPage-BU50zeG6.js +5 -0
- package/client/dist/assets/BudgetCard-DP_jxwaD.js +55 -0
- package/client/dist/assets/CodePage-jiYnKGpp.js +3 -0
- package/client/dist/assets/CostValue-Bvn8674q.js +1 -0
- package/client/dist/assets/DesktopAnalyticsPage-CF__H4e3.js +1 -0
- package/client/dist/assets/DocView-RrAp70zp.js +11 -0
- package/client/dist/assets/DocsDialog-DkqHU-JF.js +1 -0
- package/client/dist/assets/DocsPage-C6X089zC.js +1 -0
- package/client/dist/assets/ExportDropdown-C5-o8y3K.js +1 -0
- package/client/dist/assets/HelpHint-Crf9_uoR.js +1 -0
- package/client/dist/assets/IntegrationsPage-aflU3KHK.js +1 -0
- package/client/dist/assets/InteractiveJobComposer-CEMMhyyJ.js +19 -0
- package/client/dist/assets/JobDetailModal-BVJ6hyRs.js +1 -0
- package/client/dist/assets/JobDetailPage-DHzBUmox.js +1 -0
- package/client/dist/assets/JobsPage-o-LAqkwC.js +1 -0
- package/client/dist/assets/LoopBuilderPage-DbSVmXBM.js +1 -0
- package/client/dist/assets/LoopPreviewModal-DbJcVyN1.js +1 -0
- package/client/dist/assets/{LoopWindowSurface-DE0v2K1p.js → LoopWindowSurface-Co1ZK26V.js} +1 -1
- package/client/dist/assets/LoopsPage-C4lgkPXB.js +2 -0
- package/client/dist/assets/MinimizedChatsContext-742ypO8n.js +1 -0
- package/client/dist/assets/PluginsPage-Acks9ges.js +2 -0
- package/client/dist/assets/RailTrack-BfLmBzBh.js +1 -0
- package/client/dist/assets/{RepositoryScopeSelector-2eSqR9WK.js → RepositoryScopeSelector-DcxbKI9w.js} +1 -1
- package/client/dist/assets/ReviewPacketPage-CAVSIOAJ.js +7 -0
- package/client/dist/assets/TemplatePreviewModal-C23SYCTm.js +1 -0
- package/client/dist/assets/TicketDetailModalContext-B-Gtm6Ob.js +23 -0
- package/client/dist/assets/Trans-C6J0cLyh.js +1 -0
- package/client/dist/assets/a11y-prefs-BqoP5goK.js +1 -0
- package/client/dist/assets/activity-BBWfoUOG.js +1 -0
- package/client/dist/assets/activity-BM_skann.js +1 -0
- package/client/dist/assets/activity-Cevl82ke.js +1 -0
- package/client/dist/assets/activity-CmACk5W5.js +1 -0
- package/client/dist/assets/activity-D9LBw3PQ.js +1 -0
- package/client/dist/assets/activity-Dspbb9lz.js +1 -0
- package/client/dist/assets/activity-FPjYIjv9.js +1 -0
- package/client/dist/assets/activity-nLCKMUKt.js +1 -0
- package/client/dist/assets/addspec-BI4jDMhA.js +1 -0
- package/client/dist/assets/addspec-BldTv7Tl.js +1 -0
- package/client/dist/assets/addspec-Cdq-2EcC.js +1 -0
- package/client/dist/assets/addspec-DH5M16BQ.js +1 -0
- package/client/dist/assets/addspec-DOFo9pD5.js +1 -0
- package/client/dist/assets/addspec-DPkwhdmL.js +1 -0
- package/client/dist/assets/addspec-Dzy12Pv3.js +1 -0
- package/client/dist/assets/addspec-skTs6EEW.js +1 -0
- package/client/dist/assets/agent-B_UEUy7Y.js +1 -0
- package/client/dist/assets/agent-BarjlhTA.js +1 -0
- package/client/dist/assets/agent-BfqIITo5.js +1 -0
- package/client/dist/assets/agent-Bt9a7Kyj.js +1 -0
- package/client/dist/assets/agent-C3689RwP.js +1 -0
- package/client/dist/assets/agent-CrmboTAi.js +1 -0
- package/client/dist/assets/agent-DcsoTnuE.js +1 -0
- package/client/dist/assets/agent-GDZoYwd4.js +1 -0
- package/client/dist/assets/{agentRuntime-es2ymSl-.js → agentRuntime-BYH70bKY.js} +1 -1
- package/client/dist/assets/agentRuntime-BijLh8I9.js +1 -0
- package/client/dist/assets/{agentRuntime-BzuwQQgn.js → agentRuntime-BvyuETPe.js} +1 -1
- package/client/dist/assets/{agentRuntime-BDvbJMmS.js → agentRuntime-C2WI6HQh.js} +1 -1
- package/client/dist/assets/{agentRuntime-BKJfv5YD.js → agentRuntime-CZPIlQsr.js} +1 -1
- package/client/dist/assets/{agentRuntime-DiCldqGG.js → agentRuntime-D2dDvCyJ.js} +1 -1
- package/client/dist/assets/agentRuntime-DWZedEbn.js +1 -0
- package/client/dist/assets/agentRuntime-DkIruUNw.js +1 -0
- package/client/dist/assets/agents-35_PDKx9.js +1 -0
- package/client/dist/assets/agents-8fZnHhEQ.js +1 -0
- package/client/dist/assets/agents-Bgimtw8z.js +1 -0
- package/client/dist/assets/agents-C4P160Us.js +1 -0
- package/client/dist/assets/agents-Clg67zbp.js +1 -0
- package/client/dist/assets/agents-DJfF4o6G.js +1 -0
- package/client/dist/assets/agents-Dc9-Y5cw.js +1 -0
- package/client/dist/assets/agents-EN1Zl4YZ.js +1 -0
- package/client/dist/assets/agentstudio-Bm4-NYaG.js +1 -0
- package/client/dist/assets/agentstudio-CD1fuj2o.js +1 -0
- package/client/dist/assets/agentstudio-CQGWFSst.js +1 -0
- package/client/dist/assets/agentstudio-CqVSb65S.js +1 -0
- package/client/dist/assets/agentstudio-DIE_HjsX.js +1 -0
- package/client/dist/assets/agentstudio-D_OmQK-k.js +1 -0
- package/client/dist/assets/agentstudio-Djz9aUfb.js +1 -0
- package/client/dist/assets/agentstudio-Qa3v9o5J.js +1 -0
- package/client/dist/assets/{aiedit-DNXxq_Dr.js → aiedit-1VzLs37W.js} +1 -1
- package/client/dist/assets/{aiedit-DCjA7jLJ.js → aiedit-BNp6GSik.js} +1 -1
- package/client/dist/assets/{aiedit-BoG24nlg.js → aiedit-BOY5xRPi.js} +1 -1
- package/client/dist/assets/{aiedit-iIjz2_Qk.js → aiedit-BrqMZvbc.js} +1 -1
- package/client/dist/assets/{aiedit-CjlSRQVP.js → aiedit-CVgtl7hm.js} +1 -1
- package/client/dist/assets/{aiedit-DQ-0_pvE.js → aiedit-CrFW9Jd2.js} +1 -1
- package/client/dist/assets/{aiedit-olnv3QSt.js → aiedit-YE2lILp7.js} +1 -1
- package/client/dist/assets/{aiedit-B0KUbpB6.js → aiedit-iA_R1AVQ.js} +1 -1
- package/client/dist/assets/analytics-3w0t-4ic.js +1 -0
- package/client/dist/assets/analytics-BRi4KQD6.js +1 -0
- package/client/dist/assets/analytics-BtjAqzke.js +1 -0
- package/client/dist/assets/analytics-COSQ1h47.js +1 -0
- package/client/dist/assets/analytics-CP2HjESk.js +1 -0
- package/client/dist/assets/analytics-DY65TC62.js +1 -0
- package/client/dist/assets/analytics-Den_vvxn.js +1 -0
- package/client/dist/assets/analytics-LmBS96O8.js +1 -0
- package/client/dist/assets/api-DOGbyfTO.js +2 -0
- package/client/dist/assets/builder-BMVvSr4v.js +1 -0
- package/client/dist/assets/builder-BN-MuLZt.js +1 -0
- package/client/dist/assets/builder-BQOZi4CF.js +1 -0
- package/client/dist/assets/builder-BjUPjsyu.js +1 -0
- package/client/dist/assets/builder-BoBtN18T.js +1 -0
- package/client/dist/assets/builder-C5g5NhxL.js +1 -0
- package/client/dist/assets/builder-RUHXw3yx.js +1 -0
- package/client/dist/assets/builder-fyS_AiyC.js +1 -0
- package/client/dist/assets/button-CHPkroew.js +1 -0
- package/client/dist/assets/chat-C9L5T7KI.js +1 -0
- package/client/dist/assets/chevron-right-CwMAj0w_.js +1 -0
- package/client/dist/assets/chevron-up-BAMuP0XD.js +1 -0
- package/client/dist/assets/chunk-OB3PAWPO-BBaq6pUk.js +3 -0
- package/client/dist/assets/code-4le5IIbf.js +1 -0
- package/client/dist/assets/code-B-jCVIbm.js +1 -0
- package/client/dist/assets/code-BRfrn5ix.js +1 -0
- package/client/dist/assets/code-CC9NCrDM.js +1 -0
- package/client/dist/assets/code-CK6pm8wY.js +1 -0
- package/client/dist/assets/code-DDiOzd6c.js +1 -0
- package/client/dist/assets/code-tGifiyf5.js +1 -0
- package/client/dist/assets/code-xkn8kQTg.js +1 -0
- package/client/dist/assets/commands-Bv1QshHR.js +1 -0
- package/client/dist/assets/commands-BvxTxboW.js +1 -0
- package/client/dist/assets/commands-C5ORR0fO.js +1 -0
- package/client/dist/assets/commands-CBKMFSTV.js +1 -0
- package/client/dist/assets/commands-CFJIRsJv.js +1 -0
- package/client/dist/assets/commands-D9o3ZcXl.js +1 -0
- package/client/dist/assets/commands-DNox0Edk.js +1 -0
- package/client/dist/assets/commands-DmIUMLdV.js +1 -0
- package/client/dist/assets/common-5H4TkaoI.js +1 -0
- package/client/dist/assets/common-9S3OdPjx.js +1 -0
- package/client/dist/assets/common-BqnwIcjs.js +1 -0
- package/client/dist/assets/common-CQP3VafS.js +1 -0
- package/client/dist/assets/common-CZnAfkB2.js +1 -0
- package/client/dist/assets/common-D5sNttV4.js +1 -0
- package/client/dist/assets/common-k_qX9nlv.js +1 -0
- package/client/dist/assets/common-s4HIi9XI.js +1 -0
- package/client/dist/assets/compass-B7guwBlY.js +1 -0
- package/client/dist/assets/confirm-dialog-ChZdHL3Q.js +1 -0
- package/client/dist/assets/copy-DOPlLymH.js +1 -0
- package/client/dist/assets/core-BozBzB6Y.js +1 -0
- package/client/dist/assets/dashboard-6zGLGcEz.js +1 -0
- package/client/dist/assets/dashboard-8Gi0FBDq.js +1 -0
- package/client/dist/assets/dashboard-B7E5YrSy.js +1 -0
- package/client/dist/assets/dashboard-BhdKV8xK.js +1 -0
- package/client/dist/assets/dashboard-Bu3zzH_s.js +1 -0
- package/client/dist/assets/dashboard-Ce_6rELA.js +1 -0
- package/client/dist/assets/dashboard-DWY-oz8P.js +1 -0
- package/client/dist/assets/dashboard-gUzlWk0o.js +1 -0
- package/client/dist/assets/date-input-Cdlr8kHz.js +1 -0
- package/client/dist/assets/dialog-C23lB2iP.js +5 -0
- package/client/dist/assets/dist-Di-oOFkX.js +1 -0
- package/client/dist/assets/dist-js-CBmS6MsJ.js +1 -0
- package/client/dist/assets/{dist-js-Rlh4FLH5.js → dist-js-DaJmKapi.js} +1 -1
- package/client/dist/assets/dropdown-menu-Bfp2CK6H.js +1 -0
- package/client/dist/assets/empty-state-D5w9OWj-.js +1 -0
- package/client/dist/assets/es2015-DfnECntk.js +41 -0
- package/client/dist/assets/esm-BKF6CE7v.js +1 -0
- package/client/dist/assets/event-BEnMLqAi.js +1 -0
- package/client/dist/assets/explore--NOz9LCN.js +1 -0
- package/client/dist/assets/explore-B2ulH6dO.js +1 -0
- package/client/dist/assets/explore-BD-QiLdg.js +1 -0
- package/client/dist/assets/explore-BOqd4_1j.js +1 -0
- package/client/dist/assets/explore-Be_Zh5zu.js +1 -0
- package/client/dist/assets/explore-CLjzPSKo.js +1 -0
- package/client/dist/assets/explore-D_-vHm29.js +1 -0
- package/client/dist/assets/explore-yEQTF6ro.js +1 -0
- package/client/dist/assets/file-text-CNXzL3wj.js +1 -0
- package/client/dist/assets/format-BODoFIw6.js +1 -0
- package/client/dist/assets/formatDistanceToNow-DLMIOS0N.js +1 -0
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-O61feXch.js +1 -0
- package/client/dist/assets/git-compare-arrows-Cu6tICCq.js +1 -0
- package/client/dist/assets/humanise-command-CB4ybLwq.js +1 -0
- package/client/dist/assets/inbox-BLZ8cm6_.js +1 -0
- package/client/dist/assets/inbox-BQ3VmNYY.js +1 -0
- package/client/dist/assets/inbox-BdcXWCuT.js +1 -0
- package/client/dist/assets/inbox-CF1PHjns.js +1 -0
- package/client/dist/assets/inbox-CFNPDhso.js +1 -0
- package/client/dist/assets/inbox-DIttK_NW.js +1 -0
- package/client/dist/assets/inbox-Dfdv1Ykl.js +1 -0
- package/client/dist/assets/inbox-JS1inmeO.js +1 -0
- package/client/dist/assets/index-4UWY7Xyz.css +2 -0
- package/client/dist/assets/index-DHzB0T26.js +120 -0
- package/client/dist/assets/integrations-BcKgzgPD.js +1 -0
- package/client/dist/assets/integrations-BmX_XyJq.js +1 -0
- package/client/dist/assets/integrations-CHpwMjlY.js +1 -0
- package/client/dist/assets/integrations-CT3kr8e-.js +1 -0
- package/client/dist/assets/integrations-C_5XAkgz.js +1 -0
- package/client/dist/assets/integrations-Ct9zLX7N.js +1 -0
- package/client/dist/assets/integrations-DEYemxUv.js +1 -0
- package/client/dist/assets/integrations-DWvsB_WB.js +1 -0
- package/client/dist/assets/{jira-Cq6yvN4q.js → jira-B_ERkFRv.js} +1 -1
- package/client/dist/assets/jira-Bn-A5lwD.js +1 -0
- package/client/dist/assets/jira-C71Ybnhp.js +1 -0
- package/client/dist/assets/jira-CkwjeJz6.js +1 -0
- package/client/dist/assets/jira-D9pSLXjI.js +1 -0
- package/client/dist/assets/jira-DBRS_lcp.js +1 -0
- package/client/dist/assets/jira-DHS6CsKh.js +1 -0
- package/client/dist/assets/jira-MInHRUb1.js +1 -0
- package/client/dist/assets/jira-api-DHme7Upx.js +1 -0
- package/client/dist/assets/jobs-BMLTDo63.js +1 -0
- package/client/dist/assets/jobs-BO8q4Mi1.js +1 -0
- package/client/dist/assets/jobs-Ck8uOWMM.js +1 -0
- package/client/dist/assets/jobs-CyFfPCpg.js +1 -0
- package/client/dist/assets/jobs-DT5s4fZ6.js +1 -0
- package/client/dist/assets/jobs-DZAgVPcD.js +1 -0
- package/client/dist/assets/jobs-b5gPYaKr.js +1 -0
- package/client/dist/assets/jobs-xsZK1440.js +1 -0
- package/client/dist/assets/launch-forecast-BTa-p3RP.js +1 -0
- package/client/dist/assets/{loop-layout-DtxX27Jz.css → loop-layout-DLioOiRN.css} +1 -1
- package/client/dist/assets/loop-layout-Sl9cfTvs.js +7 -0
- package/client/dist/assets/loops-BEEOVJDR.js +1 -0
- package/client/dist/assets/loops-BcrQ2vk7.js +1 -0
- package/client/dist/assets/loops-BjWxzJIZ.js +1 -0
- package/client/dist/assets/loops-BogV595N.js +1 -0
- package/client/dist/assets/loops-CU0BLZiz.js +1 -0
- package/client/dist/assets/loops-CrNBgi1G.js +1 -0
- package/client/dist/assets/loops-CwalwS_i.js +1 -0
- package/client/dist/assets/loops-_TDVN-fX.js +1 -0
- package/client/dist/assets/mcp-BNs8gxoL.js +1 -0
- package/client/dist/assets/mcp-BvRh_xO5.js +1 -0
- package/client/dist/assets/mcp-C2F1pghi.js +1 -0
- package/client/dist/assets/mcp-D9RLKAs2.js +1 -0
- package/client/dist/assets/mcp-DAghcsR0.js +1 -0
- package/client/dist/assets/mcp-DWWAPi1G.js +1 -0
- package/client/dist/assets/mcp-DbGSFC3f.js +1 -0
- package/client/dist/assets/mcp-FelCicrv.js +1 -0
- package/client/dist/assets/narration-C3NBkAR4.js +1 -0
- package/client/dist/assets/narration-CkoJq-Lf.js +1 -0
- package/client/dist/assets/narration-Cr0NeW9K.js +1 -0
- package/client/dist/assets/narration-DJUXOs-W.js +1 -0
- package/client/dist/assets/narration-DgL8TMvN.js +1 -0
- package/client/dist/assets/narration-DjBafgv0.js +1 -0
- package/client/dist/assets/narration-Dle6Iv0c.js +1 -0
- package/client/dist/assets/narration-MYlfktga.js +1 -0
- package/client/dist/assets/nav-BSQ8KW1c.js +1 -0
- package/client/dist/assets/nav-BauVof8Z.js +1 -0
- package/client/dist/assets/nav-BfOAH1se.js +1 -0
- package/client/dist/assets/nav-D3bOsipX.js +1 -0
- package/client/dist/assets/nav-DOMMhlLx.js +1 -0
- package/client/dist/assets/nav-DPzVlgZU.js +1 -0
- package/client/dist/assets/nav-DZJbFbah.js +1 -0
- package/client/dist/assets/nav-D_5aojd2.js +1 -0
- package/client/dist/assets/notify-error-BsWANx1T.js +1 -0
- package/client/dist/assets/onboarding-BdZQnNm3.js +1 -0
- package/client/dist/assets/onboarding-CJQEv1vp.js +1 -0
- package/client/dist/assets/onboarding-CWJGYUW3.js +1 -0
- package/client/dist/assets/onboarding-ChfYN7dA.js +1 -0
- package/client/dist/assets/onboarding-CjvDUR3V.js +1 -0
- package/client/dist/assets/onboarding-I6vS-zTB.js +1 -0
- package/client/dist/assets/onboarding-dgC_9dTB.js +1 -0
- package/client/dist/assets/onboarding-mlXSyKzX.js +1 -0
- package/client/dist/assets/origin-03nTuaOb.js +1 -0
- package/client/dist/assets/packet-BjpyRnZr.js +1 -0
- package/client/dist/assets/packet-BwgG5mBt.js +1 -0
- package/client/dist/assets/packet-C3eAUFkV.js +1 -0
- package/client/dist/assets/packet-C8wZuSld.js +1 -0
- package/client/dist/assets/packet-CNXEy_85.js +1 -0
- package/client/dist/assets/packet-DsV5Aa_8.js +1 -0
- package/client/dist/assets/packet-aasskOE7.js +1 -0
- package/client/dist/assets/packet-phxCc2gJ.js +1 -0
- package/client/dist/assets/page-header-BStSHkP8.js +1 -0
- package/client/dist/assets/project-repositories-DJPeAVBK.js +1 -0
- package/client/dist/assets/{provider-capabilities-lePfeT_Y.js → provider-capabilities-DtwcTme4.js} +1 -1
- package/client/dist/assets/recovery-BPDOsC92.js +1 -0
- package/client/dist/assets/recovery-BluNHoXM.js +1 -0
- package/client/dist/assets/recovery-CRvEmB0C.js +1 -0
- package/client/dist/assets/recovery-CeIoRnkR.js +1 -0
- package/client/dist/assets/recovery-DHCo8KGi.js +1 -0
- package/client/dist/assets/recovery-OxAIpbBF.js +1 -0
- package/client/dist/assets/recovery-XXexYGOJ.js +1 -0
- package/client/dist/assets/recovery-pITlc--v.js +1 -0
- package/client/dist/assets/refresh-cw-DfyTkbsf.js +1 -0
- package/client/dist/assets/select-xA3pSmqE.js +1 -0
- package/client/dist/assets/settings--yzDbX9r.js +1 -0
- package/client/dist/assets/settings-5_heTv8s.js +1 -0
- package/client/dist/assets/settings-BSf27MDg.js +1 -0
- package/client/dist/assets/settings-BSj6FakR.js +1 -0
- package/client/dist/assets/settings-BZDo_8Nn.js +1 -0
- package/client/dist/assets/settings-BdWgmNc0.js +1 -0
- package/client/dist/assets/settings-DRouxKqb.js +1 -0
- package/client/dist/assets/settings-DnWFoY-F.js +1 -0
- package/client/dist/assets/setup-BJWy62ri.js +1 -0
- package/client/dist/assets/setup-BgKOIuzc.js +1 -0
- package/client/dist/assets/setup-BvVIyUlz.js +1 -0
- package/client/dist/assets/setup-BxCk2pe1.js +1 -0
- package/client/dist/assets/setup-C-xQTL7R.js +1 -0
- package/client/dist/assets/setup-CbaVoiwV.js +1 -0
- package/client/dist/assets/setup-DxTBkX3P.js +1 -0
- package/client/dist/assets/setup-oGoVAzOD.js +1 -0
- package/client/dist/assets/specs-7tAb4IKr.js +1 -0
- package/client/dist/assets/specs-BUcY4s5v.js +1 -0
- package/client/dist/assets/specs-Bk5LeBAA.js +1 -0
- package/client/dist/assets/specs-CAA4Lrlg.js +1 -0
- package/client/dist/assets/specs-CS091AnA.js +1 -0
- package/client/dist/assets/specs-DJ6gmFcK.js +1 -0
- package/client/dist/assets/specs-GfCcrBSC.js +1 -0
- package/client/dist/assets/specs-xQgyc7WL.js +1 -0
- package/client/dist/assets/spending-CVH8VREb.js +1 -0
- package/client/dist/assets/square-Co6h5vZg.js +1 -0
- package/client/dist/assets/tauri-shell-43ixPGfa.js +2 -0
- package/client/dist/assets/terminal-0v9sBylD.js +1 -0
- package/client/dist/assets/terminal-AbUAmCxE.js +1 -0
- package/client/dist/assets/terminal-BJayIbIP.js +1 -0
- package/client/dist/assets/terminal-C2RUlXyi.js +1 -0
- package/client/dist/assets/terminal-CMmSb_Nj.js +1 -0
- package/client/dist/assets/terminal-DKWjj7HJ.js +1 -0
- package/client/dist/assets/terminal-KlFu7_pV.js +1 -0
- package/client/dist/assets/terminal-i99yqFvm.js +1 -0
- package/client/dist/assets/tickets-846Oq3i3.js +1 -0
- package/client/dist/assets/tickets-B5LJTe_b.js +1 -0
- package/client/dist/assets/tickets-Bfo2GGmH.js +1 -0
- package/client/dist/assets/tickets-BhdZ1yY2.js +1 -0
- package/client/dist/assets/tickets-CgjWJHAW.js +1 -0
- package/client/dist/assets/tickets-Ct9DbDUR.js +1 -0
- package/client/dist/assets/tickets-rptLEJB1.js +1 -0
- package/client/dist/assets/tickets-xQ6DpYdu.js +1 -0
- package/client/dist/assets/trending-up-BGvb4zZt.js +1 -0
- package/client/dist/assets/undo-6zuS4-sL.js +1 -0
- package/client/dist/assets/undo-BeM4gDOP.js +1 -0
- package/client/dist/assets/undo-BeppX8xS.js +1 -0
- package/client/dist/assets/undo-BqvNZ5MG.js +1 -0
- package/client/dist/assets/undo-BzwEPf_k.js +1 -0
- package/client/dist/assets/undo-CJ9Cu1NN.js +1 -0
- package/client/dist/assets/undo-ds8nMFbX.js +1 -0
- package/client/dist/assets/undo-x_gA-knG.js +1 -0
- package/client/dist/assets/useDesktop-BuOp2-MR.js +1 -0
- package/client/dist/assets/useRuntimeRuns-BRS6ncnO.js +1 -0
- package/client/dist/assets/utils-ELimjS2Y.js +1 -0
- package/client/dist/assets/wrench-Br2n1Lxd.js +1 -0
- package/client/dist/index.html +75 -60
- package/docs/ci-cd.md +29 -1
- package/docs/cli.md +10 -31
- package/docs/codex.md +1 -1
- package/docs/creating-specs.md +15 -12
- package/docs/customizing.md +16 -13
- package/docs/getting-started.md +12 -11
- package/docs/guide/de/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/de/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/de/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/de/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/de/getting-started/6-universal-search.md +34 -0
- package/docs/guide/de/insights/1-analytics-and-cost-tracking.md +20 -6
- package/docs/guide/de/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/de/insights/3-code-explorer.md +1 -1
- package/docs/guide/de/integrations/1-ai-providers.md +1 -1
- package/docs/guide/de/integrations/2-plugins.md +1 -1
- package/docs/guide/de/integrations/3-jira-integration.md +3 -3
- package/docs/guide/de/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/de/integrations/5-mcp-server.md +1 -1
- package/docs/guide/de/integrations/6-agent-chat.md +12 -5
- package/docs/guide/de/integrations/8-flow-mode.md +69 -0
- package/docs/guide/de/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/de/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/de/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/de/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/de/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/de/settings/1-themes.md +1 -1
- package/docs/guide/de/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/de/settings/5-project-environment.md +1 -1
- package/docs/guide/de/settings/6-updates.md +24 -0
- package/docs/guide/de/settings/7-existing-projects.md +33 -0
- package/docs/guide/de/settings/8-accessibility.md +23 -0
- package/docs/guide/de/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/de/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/de/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/en/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/en/getting-started/1-what-is-specrails.md +1 -1
- package/docs/guide/en/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/en/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/en/getting-started/5-the-dashboard-tour.md +52 -0
- package/docs/guide/en/getting-started/6-universal-search.md +34 -0
- package/docs/guide/en/insights/1-analytics-and-cost-tracking.md +24 -10
- package/docs/guide/en/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/en/insights/3-code-explorer.md +5 -5
- package/docs/guide/en/integrations/1-ai-providers.md +1 -1
- package/docs/guide/en/integrations/2-plugins.md +1 -1
- package/docs/guide/en/integrations/3-jira-integration.md +4 -4
- package/docs/guide/en/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/en/integrations/5-mcp-server.md +4 -4
- package/docs/guide/en/integrations/6-agent-chat.md +12 -5
- package/docs/guide/en/integrations/8-flow-mode.md +69 -0
- package/docs/guide/en/pipeline/1-rails-and-jobs.md +22 -3
- package/docs/guide/en/pipeline/2-the-job-detail-view.md +19 -7
- package/docs/guide/en/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/en/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/en/pipeline/5-the-loop-builder.md +2 -2
- package/docs/guide/en/settings/1-themes.md +1 -1
- package/docs/guide/en/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/en/settings/5-project-environment.md +1 -1
- package/docs/guide/en/settings/6-updates.md +24 -0
- package/docs/guide/en/settings/7-existing-projects.md +33 -0
- package/docs/guide/en/settings/8-accessibility.md +23 -0
- package/docs/guide/en/specs/1-specs-and-the-backlog.md +42 -6
- package/docs/guide/en/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/en/specs/3-add-spec-explore-mode.md +2 -2
- package/docs/guide/es/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/es/agents/2-profiles-and-the-balanced-default.md +1 -1
- package/docs/guide/es/agents/3-customizing-models-per-agent.md +2 -2
- package/docs/guide/es/agents/4-custom-agents-catalog.md +1 -1
- package/docs/guide/es/getting-started/1-what-is-specrails.md +3 -3
- package/docs/guide/es/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/es/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/es/getting-started/5-the-dashboard-tour.md +52 -0
- package/docs/guide/es/getting-started/6-universal-search.md +34 -0
- package/docs/guide/es/insights/1-analytics-and-cost-tracking.md +26 -12
- package/docs/guide/es/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/es/insights/3-code-explorer.md +5 -5
- package/docs/guide/es/integrations/1-ai-providers.md +1 -1
- package/docs/guide/es/integrations/2-plugins.md +1 -1
- package/docs/guide/es/integrations/3-jira-integration.md +4 -4
- package/docs/guide/es/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/es/integrations/5-mcp-server.md +4 -4
- package/docs/guide/es/integrations/6-agent-chat.md +14 -7
- package/docs/guide/es/integrations/7-local-engines.md +1 -1
- package/docs/guide/es/integrations/8-flow-mode.md +69 -0
- package/docs/guide/es/pipeline/1-rails-and-jobs.md +33 -13
- package/docs/guide/es/pipeline/2-the-job-detail-view.md +38 -26
- package/docs/guide/es/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/es/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/es/pipeline/5-the-loop-builder.md +4 -4
- package/docs/guide/es/settings/1-themes.md +1 -1
- package/docs/guide/es/settings/3-pipeline-telemetry-and-diagnostics.md +10 -10
- package/docs/guide/es/settings/5-project-environment.md +1 -1
- package/docs/guide/es/settings/6-updates.md +24 -0
- package/docs/guide/es/settings/7-existing-projects.md +33 -0
- package/docs/guide/es/settings/8-accessibility.md +23 -0
- package/docs/guide/es/specs/1-specs-and-the-backlog.md +43 -7
- package/docs/guide/es/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/es/specs/3-add-spec-explore-mode.md +3 -3
- package/docs/guide/fr/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/fr/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/fr/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/fr/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/fr/getting-started/6-universal-search.md +34 -0
- package/docs/guide/fr/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/fr/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/fr/insights/3-code-explorer.md +1 -1
- package/docs/guide/fr/integrations/1-ai-providers.md +1 -1
- package/docs/guide/fr/integrations/2-plugins.md +1 -1
- package/docs/guide/fr/integrations/3-jira-integration.md +3 -3
- package/docs/guide/fr/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/fr/integrations/5-mcp-server.md +1 -1
- package/docs/guide/fr/integrations/6-agent-chat.md +11 -4
- package/docs/guide/fr/integrations/8-flow-mode.md +69 -0
- package/docs/guide/fr/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/fr/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/fr/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/fr/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/fr/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/fr/settings/1-themes.md +1 -1
- package/docs/guide/fr/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/fr/settings/5-project-environment.md +1 -1
- package/docs/guide/fr/settings/6-updates.md +24 -0
- package/docs/guide/fr/settings/7-existing-projects.md +33 -0
- package/docs/guide/fr/settings/8-accessibility.md +23 -0
- package/docs/guide/fr/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/fr/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/fr/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/it/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/it/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/it/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/it/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/it/getting-started/6-universal-search.md +34 -0
- package/docs/guide/it/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/it/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/it/insights/3-code-explorer.md +1 -1
- package/docs/guide/it/integrations/1-ai-providers.md +1 -1
- package/docs/guide/it/integrations/2-plugins.md +1 -1
- package/docs/guide/it/integrations/3-jira-integration.md +3 -3
- package/docs/guide/it/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/it/integrations/5-mcp-server.md +1 -1
- package/docs/guide/it/integrations/6-agent-chat.md +11 -4
- package/docs/guide/it/integrations/8-flow-mode.md +69 -0
- package/docs/guide/it/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/it/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/it/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/it/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/it/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/it/settings/1-themes.md +1 -1
- package/docs/guide/it/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/it/settings/5-project-environment.md +1 -1
- package/docs/guide/it/settings/6-updates.md +24 -0
- package/docs/guide/it/settings/7-existing-projects.md +33 -0
- package/docs/guide/it/settings/8-accessibility.md +23 -0
- package/docs/guide/it/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/it/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/it/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/ja/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/ja/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/ja/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/ja/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/ja/getting-started/6-universal-search.md +34 -0
- package/docs/guide/ja/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/ja/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/ja/insights/3-code-explorer.md +1 -1
- package/docs/guide/ja/integrations/1-ai-providers.md +1 -1
- package/docs/guide/ja/integrations/2-plugins.md +1 -1
- package/docs/guide/ja/integrations/3-jira-integration.md +3 -3
- package/docs/guide/ja/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/ja/integrations/5-mcp-server.md +1 -1
- package/docs/guide/ja/integrations/6-agent-chat.md +11 -4
- package/docs/guide/ja/integrations/8-flow-mode.md +69 -0
- package/docs/guide/ja/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/ja/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/ja/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/ja/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/ja/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/ja/settings/1-themes.md +1 -1
- package/docs/guide/ja/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/ja/settings/5-project-environment.md +1 -1
- package/docs/guide/ja/settings/6-updates.md +24 -0
- package/docs/guide/ja/settings/7-existing-projects.md +33 -0
- package/docs/guide/ja/settings/8-accessibility.md +23 -0
- package/docs/guide/ja/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/ja/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/ja/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/pt/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/pt/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/pt/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/pt/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/pt/getting-started/6-universal-search.md +34 -0
- package/docs/guide/pt/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/pt/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/pt/insights/3-code-explorer.md +1 -1
- package/docs/guide/pt/integrations/1-ai-providers.md +1 -1
- package/docs/guide/pt/integrations/2-plugins.md +1 -1
- package/docs/guide/pt/integrations/3-jira-integration.md +3 -3
- package/docs/guide/pt/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/pt/integrations/5-mcp-server.md +1 -1
- package/docs/guide/pt/integrations/6-agent-chat.md +12 -5
- package/docs/guide/pt/integrations/8-flow-mode.md +69 -0
- package/docs/guide/pt/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/pt/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/pt/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/pt/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/pt/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/pt/settings/1-themes.md +1 -1
- package/docs/guide/pt/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/pt/settings/5-project-environment.md +1 -1
- package/docs/guide/pt/settings/6-updates.md +24 -0
- package/docs/guide/pt/settings/7-existing-projects.md +33 -0
- package/docs/guide/pt/settings/8-accessibility.md +23 -0
- package/docs/guide/pt/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/pt/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/pt/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/zh/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/zh/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/zh/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/zh/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/zh/getting-started/6-universal-search.md +34 -0
- package/docs/guide/zh/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/zh/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/zh/insights/3-code-explorer.md +1 -1
- package/docs/guide/zh/integrations/1-ai-providers.md +1 -1
- package/docs/guide/zh/integrations/2-plugins.md +1 -1
- package/docs/guide/zh/integrations/3-jira-integration.md +3 -3
- package/docs/guide/zh/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/zh/integrations/5-mcp-server.md +1 -1
- package/docs/guide/zh/integrations/6-agent-chat.md +11 -4
- package/docs/guide/zh/integrations/8-flow-mode.md +69 -0
- package/docs/guide/zh/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/zh/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/zh/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/zh/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/zh/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/zh/settings/1-themes.md +1 -1
- package/docs/guide/zh/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/zh/settings/5-project-environment.md +1 -1
- package/docs/guide/zh/settings/6-updates.md +24 -0
- package/docs/guide/zh/settings/7-existing-projects.md +33 -0
- package/docs/guide/zh/settings/8-accessibility.md +23 -0
- package/docs/guide/zh/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/zh/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/zh/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/internals/README.md +8 -0
- package/docs/internals/adding-a-provider.md +19 -2
- package/docs/internals/agent-actions-audit.md +101 -0
- package/docs/internals/agent-sessions.md +36 -1
- package/docs/internals/api-reference.md +190 -45
- package/docs/internals/architecture.md +53 -47
- package/docs/internals/companion-inbox-decisions.md +42 -0
- package/docs/internals/companion-rails-as-loops-contract.md +17 -6
- package/docs/internals/configuration.md +140 -9
- package/docs/internals/core-runtime-updates.md +4 -4
- package/docs/internals/existing-project-anchoring.md +168 -0
- package/docs/internals/flow-mode.md +668 -0
- package/docs/internals/legacy-implementation-notes.md +13 -0
- package/docs/internals/local-testing-feedback-2026-10.md +210 -0
- package/docs/internals/mcp-mission-audit.md +4 -0
- package/docs/internals/mission-rail-cards.md +10 -5
- package/docs/internals/mission-read-only-policy.md +152 -0
- package/docs/internals/modal-standard.md +181 -0
- package/docs/internals/openspec-workflow.md +32 -0
- package/docs/internals/operations-runbook.md +30 -0
- package/docs/internals/profiles.md +6 -3
- package/docs/internals/programmatic-agent-runtime.md +8 -0
- package/docs/internals/project-builder.md +1 -1
- package/docs/internals/review-packet.md +161 -9
- package/docs/internals/safe-pr-review-flow.md +135 -6
- package/docs/internals/source-map.md +413 -18
- package/docs/internals/spec-addenda.md +10 -0
- package/docs/internals/spec-triage.md +140 -0
- package/docs/internals/visual-design-audit.md +15 -2
- package/docs/local-providers.md +3 -0
- package/docs/mcp.md +21 -3
- package/docs/platforms/macos.md +1 -1
- package/docs/platforms/windows.md +2 -2
- package/docs/running-pipelines.md +22 -6
- package/docs/tracking-cost.md +54 -10
- package/local-runner/dist/specrails-local-runner.js +3851 -1178
- package/mcp-bridge/dist/specrails-mcp.js +3864 -1143
- package/package.json +10 -9
- package/server/dist/agent-mcp-config.js +37 -1
- package/server/dist/api-version.js +19 -0
- package/server/dist/command-resolver.js +4 -2
- package/server/dist/core-compat.js +1 -1
- package/server/dist/core-execution.js +2 -1
- package/server/dist/core-update-manager.js +71 -13
- package/server/dist/db/job-search.js +248 -0
- package/server/dist/db/jobs.js +6 -0
- package/server/dist/db/migrations.js +239 -0
- package/server/dist/db.js +9 -2
- package/server/dist/desktop-db.js +99 -5
- package/server/dist/desktop-router.js +126 -13
- package/server/dist/docs-router.js +67 -1
- package/server/dist/feature-flags.js +22 -0
- package/server/dist/index.js +30 -15
- package/server/dist/jira/jira-adf.js +13 -1
- package/server/dist/jira/jira-clarifications.js +146 -0
- package/server/dist/jira/jira-client.js +8 -1
- package/server/dist/jira/jira-db.js +41 -0
- package/server/dist/jira/jira-sync-manager.js +328 -25
- package/server/dist/mcp/guide.js +17 -7
- package/server/dist/mcp/tools/agents.js +1 -1
- package/server/dist/mcp/tools/analytics.js +15 -3
- package/server/dist/mcp/tools/app-settings.js +14 -1
- package/server/dist/mcp/tools/chat.js +1 -1
- package/server/dist/mcp/tools/env.js +4 -2
- package/server/dist/mcp/tools/jobs.js +96 -7
- package/server/dist/mcp/tools/loops.js +1 -1
- package/server/dist/mcp/tools/meta.js +10 -13
- package/server/dist/mcp/tools/rails.js +15 -1
- package/server/dist/mcp/tools/setup.js +1 -1
- package/server/dist/mcp/tools/specs.js +8 -5
- package/server/dist/mcp/tools/support.js +6 -3
- package/server/dist/mcp/tools/types.js +38 -1
- package/server/dist/mobile/mobile-admin-router.js +0 -16
- package/server/dist/mobile/mobile-gateway.js +0 -18
- package/server/dist/mobile/mobile-inbox.js +240 -0
- package/server/dist/mobile/mobile-missions.js +6 -8
- package/server/dist/mobile/mobile-router.js +9 -9
- package/server/dist/mobile/mobile-webrtc-peer.js +4 -54
- package/server/dist/mobile/mobile-ws.js +27 -4
- package/server/dist/modules/accounting/runtime/ai-invocations.js +4 -0
- package/server/dist/modules/accounting/runtime/decision-times.js +102 -0
- package/server/dist/modules/accounting/runtime/loop-economics.js +284 -0
- package/server/dist/modules/accounting/runtime/spending.js +7 -2
- package/server/dist/modules/accounting/runtime/what-if.js +87 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-bridge.js +86 -5
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-controls.js +28 -2
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-metrics.js +15 -2
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-settings-router.js +21 -2
- package/server/dist/modules/agent-runtime/runtime/core-capabilities.js +55 -0
- package/server/dist/modules/agent-sessions/adapters/host-process.js +1 -1
- package/server/dist/modules/agent-sessions/domain/availability.js +16 -0
- package/server/dist/modules/agent-sessions/domain/protocol.js +8 -1
- package/server/dist/modules/agent-sessions/index.js +3 -1
- package/server/dist/modules/agent-sessions/runtime/core-sessions-availability.js +16 -0
- package/server/dist/modules/agents/runtime/agent-refine-manager.js +3 -1
- package/server/dist/modules/agents/runtime/agent-store.js +60 -73
- package/server/dist/modules/audit/adapters/http.js +66 -0
- package/server/dist/modules/audit/adapters/runtime.js +60 -0
- package/server/dist/modules/audit/adapters/sqlite.js +73 -0
- package/server/dist/modules/audit/application.js +190 -0
- package/server/dist/modules/audit/domain.js +434 -0
- package/server/dist/modules/audit/index.js +27 -0
- package/server/dist/modules/audit/ports.js +2 -0
- package/server/dist/modules/browser/runtime/browser-capture-manager.js +18 -141
- package/server/dist/modules/browser/runtime/browser-capture-types.js +1 -10
- package/server/dist/modules/browser/runtime/browser-playwright.js +0 -19
- package/server/dist/modules/code/runtime/file-provenance.js +23 -0
- package/server/dist/modules/conversations/runtime/chat-manager.js +5 -2
- package/server/dist/modules/delivery/adapters/decisions/chains.js +1 -0
- package/server/dist/modules/delivery/adapters/decisions/create.js +19 -1
- package/server/dist/modules/delivery/adapters/decisions/discard.js +2 -0
- package/server/dist/modules/delivery/adapters/decisions/local-changes.js +427 -0
- package/server/dist/modules/delivery/adapters/decisions/merge-local.js +80 -6
- package/server/dist/modules/delivery/adapters/decisions/observations.js +5 -0
- package/server/dist/modules/delivery/adapters/decisions/ownership.js +2 -1
- package/server/dist/modules/delivery/adapters/decisions/transitions.js +9 -0
- package/server/dist/modules/delivery/adapters/review-wip-store.js +37 -0
- package/server/dist/modules/delivery/domain/review-wip.js +71 -0
- package/server/dist/modules/delivery/index.js +9 -1
- package/server/dist/modules/delivery/runtime/delivery-changes.js +355 -0
- package/server/dist/modules/delivery/runtime/delivery-evidence.js +249 -8
- package/server/dist/modules/delivery/runtime/flow-review-legacy.js +99 -0
- package/server/dist/modules/delivery/runtime/flow-review-outcome.js +107 -0
- package/server/dist/modules/delivery/runtime/flow-worktree-handoff.js +32 -0
- package/server/dist/modules/delivery/runtime/flow-worktree-return.js +87 -0
- package/server/dist/modules/delivery/runtime/isolated-worktree.js +380 -0
- package/server/dist/modules/delivery/runtime/local-restore-branch.js +325 -0
- package/server/dist/modules/delivery/runtime/local-restore-resolver.js +48 -0
- package/server/dist/modules/delivery/runtime/local-stash.js +423 -0
- package/server/dist/modules/delivery/runtime/multi-repo-execution.js +27 -1
- package/server/dist/modules/delivery/runtime/phase3-harvest.js +40 -0
- package/server/dist/modules/delivery/runtime/pr-body.js +50 -0
- package/server/dist/modules/delivery/runtime/rail-isolated-launch.js +169 -166
- package/server/dist/modules/delivery/runtime/rail-launch-parser.js +5 -2
- package/server/dist/modules/delivery/runtime/rail-pr-decision.js +7 -1
- package/server/dist/modules/delivery/runtime/rail-pr-store.js +193 -12
- package/server/dist/modules/delivery/runtime/rails-router.js +267 -5
- package/server/dist/modules/delivery/runtime/review-brief.js +208 -0
- package/server/dist/modules/delivery/runtime/review-packet.js +41 -2
- package/server/dist/modules/delivery/runtime/review-wip-gate.js +67 -0
- package/server/dist/modules/delivery/runtime/run-records.js +267 -0
- package/server/dist/modules/delivery/runtime/run-review-diagnosis.js +102 -0
- package/server/dist/modules/execution/adapters/budget-storage.js +76 -0
- package/server/dist/modules/execution/application/enforce-budget.js +17 -2
- package/server/dist/modules/execution/domain/agent-env.js +98 -0
- package/server/dist/modules/execution/domain/daily-budget.js +36 -0
- package/server/dist/modules/execution/domain/spend-caps.js +166 -0
- package/server/dist/modules/execution/index.js +34 -1
- package/server/dist/modules/execution/runtime/budget-overview.js +76 -0
- package/server/dist/modules/execution/runtime/daily-budget-gate.js +86 -0
- package/server/dist/modules/execution/runtime/interactive-job-session.js +8 -0
- package/server/dist/modules/execution/runtime/launch-forecast.js +33 -0
- package/server/dist/modules/execution/runtime/queue-manager.js +54 -15
- package/server/dist/modules/execution/runtime/run-duration-stats.js +31 -13
- package/server/dist/modules/flow/adapters/bindings.js +1089 -0
- package/server/dist/modules/flow/adapters/http.js +147 -0
- package/server/dist/modules/flow/adapters/sqlite.js +121 -0
- package/server/dist/modules/flow/application.js +805 -0
- package/server/dist/modules/flow/domain.js +790 -0
- package/server/dist/modules/flow/index.js +34 -0
- package/server/dist/modules/flow/ports.js +2 -0
- package/server/dist/modules/inbox/adapters/http.js +21 -0
- package/server/dist/modules/inbox/adapters/project-source.js +233 -0
- package/server/dist/modules/inbox/application.js +28 -0
- package/server/dist/modules/inbox/domain.js +43 -0
- package/server/dist/modules/inbox/index.js +10 -0
- package/server/dist/modules/inbox/ports.js +2 -0
- package/server/dist/modules/loops/runtime/loop-definition-run.js +9 -0
- package/server/dist/modules/loops/runtime/loop-definition.js +5 -2
- package/server/dist/modules/loops/runtime/loop-executors.js +90 -9
- package/server/dist/modules/loops/runtime/loop-factory.js +30 -2
- package/server/dist/modules/loops/runtime/loop-flow-spec-recipe.js +166 -0
- package/server/dist/modules/loops/runtime/loop-graph.js +1 -1
- package/server/dist/modules/loops/runtime/loop-role-engines.js +4 -1
- package/server/dist/modules/loops/runtime/loop-run-manager.js +267 -10
- package/server/dist/modules/loops/runtime/loop-runs-store.js +21 -5
- package/server/dist/modules/loops/runtime/loop-templates.js +55 -12
- package/server/dist/modules/missions/runtime/agent-chat-manager.js +283 -20
- package/server/dist/modules/missions/runtime/agent-chat-router.js +96 -21
- package/server/dist/modules/missions/runtime/agent-failure-briefing.js +11 -3
- package/server/dist/modules/missions/runtime/agent-fence-promotion.js +9 -1
- package/server/dist/modules/missions/runtime/agent-flow-prompt.js +64 -0
- package/server/dist/modules/missions/runtime/agent-input-store.js +9 -4
- package/server/dist/modules/missions/runtime/agent-operator-prompt.js +100 -14
- package/server/dist/modules/missions/runtime/agent-session-store.js +88 -27
- package/server/dist/modules/missions/runtime/core-session-runner.js +89 -9
- package/server/dist/modules/missions/runtime/flow-turn-context.js +17 -0
- package/server/dist/modules/missions/runtime/mission-core-sessions.js +295 -55
- package/server/dist/modules/missions/runtime/mission-run-notify.js +2 -0
- package/server/dist/modules/missions/runtime/mission-session-projector.js +56 -19
- package/server/dist/modules/missions/runtime/mission-tool-policy.js +47 -0
- package/server/dist/modules/onboarding/adapters/http.js +78 -0
- package/server/dist/modules/onboarding/adapters/providers.js +41 -0
- package/server/dist/modules/onboarding/adapters/runtime.js +130 -0
- package/server/dist/modules/onboarding/application.js +133 -0
- package/server/dist/modules/onboarding/catalog.js +217 -0
- package/server/dist/modules/onboarding/domain.js +102 -0
- package/server/dist/modules/onboarding/index.js +20 -0
- package/server/dist/modules/onboarding/ports.js +2 -0
- package/server/dist/modules/project-rules/adapters/http.js +91 -0
- package/server/dist/modules/project-rules/domain.js +122 -0
- package/server/dist/modules/project-rules/runtime/rules-inventory-runs.js +97 -0
- package/server/dist/modules/project-rules/runtime/rules-store.js +109 -0
- package/server/dist/modules/project-settings/adapters/http.js +13 -0
- package/server/dist/modules/project-settings/adapters/sqlite.js +78 -8
- package/server/dist/modules/project-settings/domain.js +47 -1
- package/server/dist/modules/project-settings/index.js +7 -1
- package/server/dist/modules/recovery/adapters/sqlite.js +28 -0
- package/server/dist/modules/recovery/domain.js +162 -0
- package/server/dist/modules/recovery/index.js +16 -0
- package/server/dist/modules/specs/adapters/timeline-http.js +101 -0
- package/server/dist/modules/specs/domain/handoff-labels.js +371 -0
- package/server/dist/modules/specs/domain/handoff.js +260 -0
- package/server/dist/modules/specs/domain/non-goals.js +101 -0
- package/server/dist/modules/specs/domain/timeline.js +164 -0
- package/server/dist/modules/specs/domain/triage.js +320 -0
- package/server/dist/modules/specs/runtime/contract-refine-runner.js +3 -2
- package/server/dist/modules/specs/runtime/generated-spec-parser.js +75 -0
- package/server/dist/modules/specs/runtime/proposal-manager.js +4 -3
- package/server/dist/modules/specs/runtime/smash-runner.js +2 -1
- package/server/dist/modules/specs/runtime/spec-addenda.js +31 -0
- package/server/dist/modules/specs/runtime/spec-draft-parser.js +6 -1
- package/server/dist/modules/specs/runtime/spec-generation.js +431 -0
- package/server/dist/modules/specs/runtime/spec-handoff.js +103 -0
- package/server/dist/modules/specs/runtime/spec-history.js +376 -0
- package/server/dist/modules/specs/runtime/spec-launcher-manager.js +4 -3
- package/server/dist/modules/specs/runtime/spec-search.js +117 -0
- package/server/dist/modules/specs/runtime/ticket-store.js +47 -2
- package/server/dist/modules/specs/runtime/ticket-trash-service.js +62 -0
- package/server/dist/modules/specs/runtime/ticket-trash.js +193 -0
- package/server/dist/modules/specs/runtime/triage-runner.js +171 -0
- package/server/dist/modules/specs/runtime/triage.js +365 -0
- package/server/dist/modules/terminals/domain/app-urls.js +96 -0
- package/server/dist/modules/terminals/runtime/app-urls.js +77 -0
- package/server/dist/modules/terminals/runtime/background-process-service.js +25 -28
- package/server/dist/openspec-shim.js +1 -1
- package/server/dist/project-env.js +60 -0
- package/server/dist/project-git.js +65 -0
- package/server/dist/project-registry.js +264 -27
- package/server/dist/project-router-background-processes.js +27 -3
- package/server/dist/project-router-git.js +30 -0
- package/server/dist/project-router-helpers.js +5 -30
- package/server/dist/project-router-jobs.js +49 -1
- package/server/dist/project-router-loop-runs.js +72 -2
- package/server/dist/project-router-rules.js +54 -0
- package/server/dist/project-router-search.js +52 -0
- package/server/dist/project-router-settings.js +6 -0
- package/server/dist/project-router-setup.js +1 -1
- package/server/dist/project-router-spending.js +138 -0
- package/server/dist/project-router-tickets.js +246 -427
- package/server/dist/project-router.js +7 -0
- package/server/dist/providers/claude-adapter.js +25 -3
- package/server/dist/providers/codex-adapter.js +9 -1
- package/server/dist/providers/gemini-adapter.js +6 -1
- package/server/dist/providers/kimi-adapter.js +2 -0
- package/server/dist/providers/local-adapter.js +2 -0
- package/server/dist/providers/runtime.js +8 -0
- package/server/dist/schemas/agent-runtime.schema.json +3 -1
- package/server/dist/schemas/workflow-definition.schema.json +1 -0
- package/server/dist/setup-manager.js +19 -1
- package/server/dist/transient-children.js +25 -8
- package/server/dist/update-channel.js +21 -0
- package/server/dist/util/search-snippet.js +74 -0
- package/server/dist/worktree-manager.js +19 -8
- package/client/dist/assets/ActivityFeedPage-Dtp7EyHc.js +0 -1
- package/client/dist/assets/AgentBrowserCapture-CLqlEFw8.js +0 -1
- package/client/dist/assets/AgentModeAnalyticsPane-B8_hM3Tw.js +0 -2
- package/client/dist/assets/AgentModeCodePane-CNF8ZNjE.js +0 -2
- package/client/dist/assets/AgentModeJobsPane-CJpJbO9m.js +0 -1
- package/client/dist/assets/AgentsPage-BC8XSR79.js +0 -120
- package/client/dist/assets/AnalyticsPage-Cdv4jLtW.js +0 -1
- package/client/dist/assets/BarChart-BDMqVFJy.js +0 -55
- package/client/dist/assets/CodePage-DI1kegAr.js +0 -3
- package/client/dist/assets/DesktopAnalyticsPage-Bdp8E8U6.js +0 -1
- package/client/dist/assets/DocsDialog-Bm4RS7FX.js +0 -11
- package/client/dist/assets/DocsPage-DihYcU8r.js +0 -11
- package/client/dist/assets/ExportDropdown-Bb1lHx3r.js +0 -1
- package/client/dist/assets/IntegrationsPage-EAipiDWm.js +0 -1
- package/client/dist/assets/InteractiveJobComposer-BO6ASN-2.js +0 -19
- package/client/dist/assets/JobDetailModal-CuPYq7tP.js +0 -1
- package/client/dist/assets/JobDetailPage-BusMjJi9.js +0 -1
- package/client/dist/assets/JobsPage-C0QbsF2d.js +0 -1
- package/client/dist/assets/LoopBuilderPage-B7TlU4iS.js +0 -1
- package/client/dist/assets/LoopPreviewModal-BRWtXOD2.js +0 -1
- package/client/dist/assets/LoopsPage-C4q1DmCE.js +0 -2
- package/client/dist/assets/MinimizedChatsContext-DHfigjHS.js +0 -1
- package/client/dist/assets/PluginsPage-Z1JHSMdR.js +0 -2
- package/client/dist/assets/ProjectSettingsDialog-BUNj0tvN.js +0 -1
- package/client/dist/assets/RepositoryDeliveries-B4ybHOyB.js +0 -5
- package/client/dist/assets/ReviewPacketPage-hwfPNjyy.js +0 -4
- package/client/dist/assets/TemplatePreviewModal-V7FpMWuw.js +0 -1
- package/client/dist/assets/TicketDetailModalContext-Dkwo2cDs.js +0 -16
- package/client/dist/assets/Trans-BbFxRFtR.js +0 -1
- package/client/dist/assets/activity-B-rp4h_v.js +0 -1
- package/client/dist/assets/activity-C6kJpm9q.js +0 -1
- package/client/dist/assets/activity-CGx4kb_j.js +0 -1
- package/client/dist/assets/activity-CnoX2bH7.js +0 -1
- package/client/dist/assets/activity-DAyekdlt.js +0 -1
- package/client/dist/assets/activity-DCxtpT7j.js +0 -1
- package/client/dist/assets/activity-DiyjsgQV.js +0 -1
- package/client/dist/assets/activity-JzwRaWPD.js +0 -1
- package/client/dist/assets/addspec-BOvgmcgk.js +0 -1
- package/client/dist/assets/addspec-Clmyfn_R.js +0 -1
- package/client/dist/assets/addspec-CsNaBpHp.js +0 -1
- package/client/dist/assets/addspec-D2tvWmmV.js +0 -1
- package/client/dist/assets/addspec-D3nFwvD0.js +0 -1
- package/client/dist/assets/addspec-DVLEhK3w.js +0 -1
- package/client/dist/assets/addspec-DXbK-tb0.js +0 -1
- package/client/dist/assets/addspec-OHG8DFEn.js +0 -1
- package/client/dist/assets/agent-5bSixVzz.js +0 -1
- package/client/dist/assets/agent-BR4EHfhq.js +0 -1
- package/client/dist/assets/agent-C0IKkJP8.js +0 -1
- package/client/dist/assets/agent-C7li9ayC.js +0 -1
- package/client/dist/assets/agent-D0dRmEen.js +0 -1
- package/client/dist/assets/agent-DZVGHm7H.js +0 -1
- package/client/dist/assets/agent-Dip4h2YE.js +0 -1
- package/client/dist/assets/agent-Pp-P-n1p.js +0 -1
- package/client/dist/assets/agentRuntime-BxF81z52.js +0 -1
- package/client/dist/assets/agentRuntime-BxYS5V7u.js +0 -1
- package/client/dist/assets/agentRuntime-Dc9HG3BA.js +0 -1
- package/client/dist/assets/agents-B6ZsnARo.js +0 -1
- package/client/dist/assets/agents-BORdhe0K.js +0 -1
- package/client/dist/assets/agents-C6aq9Oqs.js +0 -1
- package/client/dist/assets/agents-Cbsc4bcX.js +0 -1
- package/client/dist/assets/agents-D0uYR6hq.js +0 -1
- package/client/dist/assets/agents-Doe1sHY5.js +0 -1
- package/client/dist/assets/agents-DyNi_I9m.js +0 -1
- package/client/dist/assets/agents-StKxiTg0.js +0 -1
- package/client/dist/assets/agentstudio-7cYCXn-L.js +0 -1
- package/client/dist/assets/agentstudio-BHWQh8G3.js +0 -1
- package/client/dist/assets/agentstudio-BjnWHyRs.js +0 -1
- package/client/dist/assets/agentstudio-BkV8vcK4.js +0 -1
- package/client/dist/assets/agentstudio-BzugqB_N.js +0 -1
- package/client/dist/assets/agentstudio-CWbp7KvH.js +0 -1
- package/client/dist/assets/agentstudio-DG6plf5o.js +0 -1
- package/client/dist/assets/agentstudio-DkZVF-Cc.js +0 -1
- package/client/dist/assets/analytics-B1DIQd4m.js +0 -1
- package/client/dist/assets/analytics-BAIZ9vE_.js +0 -1
- package/client/dist/assets/analytics-BTqgmgBd.js +0 -1
- package/client/dist/assets/analytics-BWynXPEm.js +0 -1
- package/client/dist/assets/analytics-DGcUsQ44.js +0 -1
- package/client/dist/assets/analytics-GnSnpJ4W.js +0 -1
- package/client/dist/assets/analytics-TWgYaoO0.js +0 -1
- package/client/dist/assets/analytics-kJy6Tuko.js +0 -1
- package/client/dist/assets/atom-one-dark-qiGhVQxg.js +0 -1
- package/client/dist/assets/builder-B9gorTnT.js +0 -1
- package/client/dist/assets/builder-Bvw5s3Mi.js +0 -1
- package/client/dist/assets/builder-CL5l4dU3.js +0 -1
- package/client/dist/assets/builder-CVDTVrQX.js +0 -1
- package/client/dist/assets/builder-CpS9liE9.js +0 -1
- package/client/dist/assets/builder-DNctIL9Q.js +0 -1
- package/client/dist/assets/builder-De2NxX6o.js +0 -1
- package/client/dist/assets/builder-DeYT7Y-m.js +0 -1
- package/client/dist/assets/button-4FS1ZDTp.js +0 -1
- package/client/dist/assets/chat-D_I7nU5K.js +0 -1
- package/client/dist/assets/chevron-up-6EFqEHBj.js +0 -1
- package/client/dist/assets/chunk-OB3PAWPO-B1EMk45A.js +0 -3
- package/client/dist/assets/clsx-CjueKrWZ.js +0 -1
- package/client/dist/assets/code-B37GRg9C.js +0 -1
- package/client/dist/assets/code-BBOEZbf9.js +0 -1
- package/client/dist/assets/code-BRm-jcyx.js +0 -1
- package/client/dist/assets/code-CF7w62CR.js +0 -1
- package/client/dist/assets/code-CLuvJt2r.js +0 -1
- package/client/dist/assets/code-D0RCm59f.js +0 -1
- package/client/dist/assets/code-DaZ-ZwCT.js +0 -1
- package/client/dist/assets/code-iIHkGaCL.js +0 -1
- package/client/dist/assets/commands-0XjAftla.js +0 -1
- package/client/dist/assets/commands-BAWSYHjQ.js +0 -1
- package/client/dist/assets/commands-BBwowgiE.js +0 -1
- package/client/dist/assets/commands-BacjIZLN.js +0 -1
- package/client/dist/assets/commands-Bs62IAZ3.js +0 -1
- package/client/dist/assets/commands-CLPdh-Hh.js +0 -1
- package/client/dist/assets/commands-DlbFzgrp.js +0 -1
- package/client/dist/assets/commands-LjPSsi5F.js +0 -1
- package/client/dist/assets/common-Bdi0qN4S.js +0 -1
- package/client/dist/assets/common-Bhb9zN1P.js +0 -1
- package/client/dist/assets/common-BykKlZg1.js +0 -1
- package/client/dist/assets/common-CvnNNSJA.js +0 -1
- package/client/dist/assets/common-D5zk_mqq.js +0 -1
- package/client/dist/assets/common-DQNO_al5.js +0 -1
- package/client/dist/assets/common-Dax30Vmp.js +0 -1
- package/client/dist/assets/common-DkllpVSb.js +0 -1
- package/client/dist/assets/core-B3mKBIh5.js +0 -1
- package/client/dist/assets/dashboard-B1ndRHuC.js +0 -1
- package/client/dist/assets/dashboard-BX7KXiqA.js +0 -1
- package/client/dist/assets/dashboard-B_BSNxcN.js +0 -1
- package/client/dist/assets/dashboard-CCeFN7-V.js +0 -1
- package/client/dist/assets/dashboard-CRl0WtFJ.js +0 -1
- package/client/dist/assets/dashboard-XGdQ5mjw.js +0 -1
- package/client/dist/assets/dashboard-_oltA6Jd.js +0 -1
- package/client/dist/assets/dashboard-bAuf5KVk.js +0 -1
- package/client/dist/assets/dialog-DtdR05v1.js +0 -45
- package/client/dist/assets/dist-js-CJ_2XX1Y.js +0 -1
- package/client/dist/assets/event-Bt7f3wXe.js +0 -1
- package/client/dist/assets/explore-BG99VGpL.js +0 -1
- package/client/dist/assets/explore-C0TjprJW.js +0 -1
- package/client/dist/assets/explore-C2dgEo7q.js +0 -1
- package/client/dist/assets/explore-C8NDHbob.js +0 -1
- package/client/dist/assets/explore-CWWgzQGR.js +0 -1
- package/client/dist/assets/explore-CcQXpdtS.js +0 -1
- package/client/dist/assets/explore-DgBACn39.js +0 -1
- package/client/dist/assets/explore-DsXAgnmJ.js +0 -1
- package/client/dist/assets/file-text-C0blZHLh.js +0 -1
- package/client/dist/assets/formatDistanceToNow-NjPHBLfB.js +0 -1
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-vJ7qUoqN.js +0 -1
- package/client/dist/assets/git-branch-yf6LE1Bw.js +0 -1
- package/client/dist/assets/index-BgbCbIua.css +0 -2
- package/client/dist/assets/index-Ce4yZtKf.js +0 -83
- package/client/dist/assets/integrations-BkpRUbvp.js +0 -1
- package/client/dist/assets/integrations-Bo8qbJf4.js +0 -1
- package/client/dist/assets/integrations-CmSrKzZb.js +0 -1
- package/client/dist/assets/integrations-DGtq26Rr.js +0 -1
- package/client/dist/assets/integrations-De38GFnQ.js +0 -1
- package/client/dist/assets/integrations-Dw6zdtb-.js +0 -1
- package/client/dist/assets/integrations-Dwl9KQp0.js +0 -1
- package/client/dist/assets/integrations-Refg_d2I.js +0 -1
- package/client/dist/assets/jira-B6OYw4CJ.js +0 -1
- package/client/dist/assets/jira-BTF6RaOe.js +0 -1
- package/client/dist/assets/jira-CEetIB2q.js +0 -1
- package/client/dist/assets/jira-CIzsZLw5.js +0 -1
- package/client/dist/assets/jira-Daw9tmpI.js +0 -1
- package/client/dist/assets/jira-FXr7u2lh.js +0 -1
- package/client/dist/assets/jira-LaNQn7yl.js +0 -1
- package/client/dist/assets/jira-api-Cabj-H0J.js +0 -1
- package/client/dist/assets/job-time-BCL7wee9.js +0 -1
- package/client/dist/assets/jobs-ARwD85B9.js +0 -1
- package/client/dist/assets/jobs-BMF1w4WT.js +0 -1
- package/client/dist/assets/jobs-CBfzGLwm.js +0 -1
- package/client/dist/assets/jobs-CPjiluBY.js +0 -1
- package/client/dist/assets/jobs-CQQd58pY.js +0 -1
- package/client/dist/assets/jobs-De3EqaO0.js +0 -1
- package/client/dist/assets/jobs-Du9-Ei9a.js +0 -1
- package/client/dist/assets/jobs-qMHbnxwC.js +0 -1
- package/client/dist/assets/layers-BCLTgHXO.js +0 -1
- package/client/dist/assets/loader-circle-BqV9xYGf.js +0 -1
- package/client/dist/assets/loop-layout-CyXj9223.js +0 -7
- package/client/dist/assets/loops-B2PhQLKR.js +0 -1
- package/client/dist/assets/loops-BqbF46st.js +0 -1
- package/client/dist/assets/loops-CINnHbfI.js +0 -1
- package/client/dist/assets/loops-D-3XhH04.js +0 -1
- package/client/dist/assets/loops-DKkEEjZ_.js +0 -1
- package/client/dist/assets/loops-DzWR5-v6.js +0 -1
- package/client/dist/assets/loops-WyWDkhok.js +0 -1
- package/client/dist/assets/loops-scD5fIBf.js +0 -1
- package/client/dist/assets/mcp-6rMoZfEO.js +0 -1
- package/client/dist/assets/mcp-BD8sL5mP.js +0 -1
- package/client/dist/assets/mcp-BkcA3I5s.js +0 -1
- package/client/dist/assets/mcp-CCpSelOh.js +0 -1
- package/client/dist/assets/mcp-CUAN6ORK.js +0 -1
- package/client/dist/assets/mcp-CqbRxRTE.js +0 -1
- package/client/dist/assets/mcp-DP2YfVhO.js +0 -1
- package/client/dist/assets/mcp-DUVQamDz.js +0 -1
- package/client/dist/assets/narration-BEKMVxGm.js +0 -1
- package/client/dist/assets/narration-CjLwGKap.js +0 -1
- package/client/dist/assets/narration-DANWuGsW.js +0 -1
- package/client/dist/assets/narration-DGeEDWiT.js +0 -1
- package/client/dist/assets/narration-DJgpGwIP.js +0 -1
- package/client/dist/assets/narration-DbHnz0qV.js +0 -1
- package/client/dist/assets/narration-bZSsTZG8.js +0 -1
- package/client/dist/assets/narration-i6aKJKEc.js +0 -1
- package/client/dist/assets/nav--u7iPYlS.js +0 -1
- package/client/dist/assets/nav-C5Jgfaby.js +0 -1
- package/client/dist/assets/nav-CAna_Wpt.js +0 -1
- package/client/dist/assets/nav-CCLqeyHo.js +0 -1
- package/client/dist/assets/nav-Cf3c90Jk.js +0 -1
- package/client/dist/assets/nav-DMYQaQjR.js +0 -1
- package/client/dist/assets/nav-Df_PkZ9F.js +0 -1
- package/client/dist/assets/nav-VyNGBJwj.js +0 -1
- package/client/dist/assets/packet-8nn9RsU7.js +0 -1
- package/client/dist/assets/packet-B0H15elv.js +0 -1
- package/client/dist/assets/packet-BQvBgrwh.js +0 -1
- package/client/dist/assets/packet-BR7mO0-a.js +0 -1
- package/client/dist/assets/packet-BgcQ6q_K.js +0 -1
- package/client/dist/assets/packet-D2s92Jnn.js +0 -1
- package/client/dist/assets/packet-YbtcD1HS.js +0 -1
- package/client/dist/assets/packet-c0Qj_9eX.js +0 -1
- package/client/dist/assets/project-repositories-Cnnuj9Ia.js +0 -1
- package/client/dist/assets/rotate-ccw-DalJAQQX.js +0 -1
- package/client/dist/assets/settings-B1NV8Ow9.js +0 -1
- package/client/dist/assets/settings-BQ8XFZeE.js +0 -1
- package/client/dist/assets/settings-BRkxfBbO.js +0 -1
- package/client/dist/assets/settings-C_CcU1dP.js +0 -1
- package/client/dist/assets/settings-Cto9n0eL.js +0 -1
- package/client/dist/assets/settings-Pyw8uYtL.js +0 -1
- package/client/dist/assets/settings-b3HVCNNd.js +0 -1
- package/client/dist/assets/settings-hdive4u6.js +0 -1
- package/client/dist/assets/setup-Be485n2u.js +0 -1
- package/client/dist/assets/setup-CKGUxKr-.js +0 -1
- package/client/dist/assets/setup-Ck1Uwd7_.js +0 -1
- package/client/dist/assets/setup-Cm774a6v.js +0 -1
- package/client/dist/assets/setup-DIqMQpxt.js +0 -1
- package/client/dist/assets/setup-DfCsoNFL.js +0 -1
- package/client/dist/assets/setup-DkeE8mP0.js +0 -1
- package/client/dist/assets/setup-xVntVaz1.js +0 -1
- package/client/dist/assets/specs-Bqvtz2kz.js +0 -1
- package/client/dist/assets/specs-CKes-kz6.js +0 -1
- package/client/dist/assets/specs-CfXxPDNB.js +0 -1
- package/client/dist/assets/specs-CyF9HuTI.js +0 -1
- package/client/dist/assets/specs-DMj035Mt.js +0 -1
- package/client/dist/assets/specs-DfIdoU5L.js +0 -1
- package/client/dist/assets/specs-j5pGLQeU.js +0 -1
- package/client/dist/assets/specs-xW5pkkB7.js +0 -1
- package/client/dist/assets/spending-CQnrWiR3.js +0 -1
- package/client/dist/assets/square-D0JTbRSR.js +0 -1
- package/client/dist/assets/tauri-shell-DE6LfGPw.js +0 -2
- package/client/dist/assets/terminal-BAzpHtpY.js +0 -1
- package/client/dist/assets/terminal-C7dHeR3x.js +0 -1
- package/client/dist/assets/terminal-CMla5Qsz.js +0 -1
- package/client/dist/assets/terminal-CdNXH-n9.js +0 -1
- package/client/dist/assets/terminal-Cw5bZsmV.js +0 -1
- package/client/dist/assets/terminal-DFUP4eNv.js +0 -1
- package/client/dist/assets/terminal-DGqljeK_.js +0 -1
- package/client/dist/assets/terminal-cU70NodO.js +0 -1
- package/client/dist/assets/tickets--tiSOCcn.js +0 -1
- package/client/dist/assets/tickets-BUJ3DMWU.js +0 -1
- package/client/dist/assets/tickets-C1WNPODq.js +0 -1
- package/client/dist/assets/tickets-CDjhWmiE.js +0 -1
- package/client/dist/assets/tickets-CLgPC3uO.js +0 -1
- package/client/dist/assets/tickets-D41ZMQpf.js +0 -1
- package/client/dist/assets/tickets-DEaQC06P.js +0 -1
- package/client/dist/assets/tickets-kcMzbLCp.js +0 -1
- package/client/dist/assets/trash-D8zYUmTg.js +0 -1
- package/client/dist/assets/useDesktop-BjLT0_EE.js +0 -1
- package/client/dist/assets/useRuntimeRuns-C97qEqMg.js +0 -1
- package/client/dist/assets/useSharedWebSocket-Bj4LMp7b.js +0 -2
- package/client/dist/assets/utils-BC4DHlz2.js +0 -1
- package/docs/guide/en/getting-started/4-the-dashboard-tour.md +0 -48
- package/docs/guide/es/getting-started/4-the-dashboard-tour.md +0 -48
- package/server/dist/mobile/mobile-preview-channel.js +0 -179
- package/server/dist/mobile/mobile-preview.js +0 -366
- package/server/dist/modules/browser/domain/preview-origins.js +0 -117
- package/server/dist/modules/browser/runtime/preview-targets.js +0 -80
- /package/client/dist/assets/{atom-one-dark-B-oHczHB.css → DocView-B-oHczHB.css} +0 -0
- /package/docs/guide/de/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/en/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/es/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/fr/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/it/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/ja/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/pt/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/zh/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
|
@@ -0,0 +1,668 @@
|
|
|
1
|
+
# Flow mode
|
|
2
|
+
|
|
3
|
+
Flow is a mode complementary to Implement: the user builds working code with
|
|
4
|
+
an agent in an isolated worktree, by conversation and without a spec. When
|
|
5
|
+
the user decides the result is right, a rail adopts the worktree and derives
|
|
6
|
+
the spec (the Flow → Spec loop). Implement is for delegating; Flow is for
|
|
7
|
+
discovering.
|
|
8
|
+
|
|
9
|
+
This guide covers the server and the client: the Flow lifecycle, the
|
|
10
|
+
`factory:flow-spec` loop, the delivery settlement (spec rewrite, Jira create
|
|
11
|
+
and review transition) and the client (Flow strip, cards, composer, board
|
|
12
|
+
label). User guide: [Flow](../guide/en/integrations/8-flow-mode.md).
|
|
13
|
+
OpenSpec change: [`flow-mode`](../../openspec/changes/flow-mode/).
|
|
14
|
+
|
|
15
|
+
## Where each responsibility lives
|
|
16
|
+
|
|
17
|
+
| Concern | Owner |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| Lifecycle, sagas, reconciliation, routes | [Flow module](../../server/modules/flow/README.md) (hexagonal, like project settings) |
|
|
20
|
+
| Worktree machinery | delivery: `prepareIsolatedWorktree` (reservation), `launchIsolatedRail` with `requiredFlowWorktree` (adoption) |
|
|
21
|
+
| Flow turn (cwd, persona, permissions, interrupt) | missions, through the injected `FlowTurnContext` port |
|
|
22
|
+
| Interrupting a running turn | Core sessions (`session.send { delivery: 'interrupt' }`) |
|
|
23
|
+
| Placeholder spec | specs ticket store (`source: 'flow'`, schema 1.5) |
|
|
24
|
+
| Accounting | `agent_invocations.surface = 'flow'` |
|
|
25
|
+
|
|
26
|
+
Core is the engine and Desktop the product: Desktop never branches by
|
|
27
|
+
provider for Flow. Flow turns run only on Core agent sessions; there is no
|
|
28
|
+
legacy transport.
|
|
29
|
+
|
|
30
|
+
## Capability gating
|
|
31
|
+
|
|
32
|
+
`GET /api/projects/:id/flow/availability` is the client's switch. Flow is
|
|
33
|
+
available only when Core sessions are usable and the selected Core runtime
|
|
34
|
+
advertises `flowSessions` (interrupt delivery, Core PR #435) and
|
|
35
|
+
`deriveChange` (the derive-change node). Starting also requires a session
|
|
36
|
+
host whose `initialize.capabilities.flowSessions` is 1 and a Core session
|
|
37
|
+
driver for the mission's provider. Otherwise the routes answer
|
|
38
|
+
`409 feature_unavailable` with the missing capabilities and nothing changes
|
|
39
|
+
for missions. The anti-corruption layer (`agent-sessions/domain/protocol.ts`)
|
|
40
|
+
reads the new `deliveries`/`capabilities` contract fields additively;
|
|
41
|
+
`checkSessionContract` stays compatible with older Cores.
|
|
42
|
+
|
|
43
|
+
## Lifecycle
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
start pause hand-off delivered
|
|
47
|
+
(none) ─────────► active ◄─────► paused ───────────► handed_off ─────────► delivered
|
|
48
|
+
│ resume ▲ │
|
|
49
|
+
│ discard │ returned │ launch failed
|
|
50
|
+
▼ │ (Back to Flow) ▼
|
|
51
|
+
discarded └────────────── paused
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
`needs-review` is set only by startup reconciliation, when the Flow's
|
|
55
|
+
worktree disappeared (or a compensation could not remove it). It cannot be
|
|
56
|
+
discarded (nothing there is provably Flow's to delete); **Close this Flow**
|
|
57
|
+
(`close`, `POST /flow/:flowId/close`) ends it in the terminal `closed` state
|
|
58
|
+
(migration 81; Flows closed before it read `discarded`) WITHOUT releasing
|
|
59
|
+
anything: the branch and any surviving worktree stay, the spec's Flow label
|
|
60
|
+
becomes `closed` (hidden) and the history says "Left Flow · closed, branch
|
|
61
|
+
kept". The state machine (`flow/domain.ts`) is pure; it returns
|
|
62
|
+
effects that the use cases execute through ports.
|
|
63
|
+
|
|
64
|
+
### Start (saga)
|
|
65
|
+
|
|
66
|
+
1. Insert the `flow_sessions` row (`active`, step `start:ticket`). The partial
|
|
67
|
+
unique index allows one active/paused Flow per conversation.
|
|
68
|
+
2. Create the placeholder spec through the non-promoting path:
|
|
69
|
+
`status: in_progress`, `source: 'flow'`, title and description from the
|
|
70
|
+
idea, `metadata.flow = { conversationId, flowId, worktreeId, startedAt,
|
|
71
|
+
state: 'active', chosenMode: 'flow' }`.
|
|
72
|
+
3. Reserve the worktree with `prepareIsolatedWorktree` (branch from the
|
|
73
|
+
ticket; mount `~/.specrails/projects/<slug>/worktrees/<flowId>/ticket-<id>`).
|
|
74
|
+
`flow_sessions` owns it; `rail_worktrees` does not see it.
|
|
75
|
+
4. Record the Core session id `flow:<flowId>`. The Core session opens lazily
|
|
76
|
+
on the first Flow turn, with the worktree as cwd.
|
|
77
|
+
|
|
78
|
+
A failure compensates in reverse order (release the worktree, delete the
|
|
79
|
+
spec) and marks the Flow `discarded`; when compensation itself fails the row
|
|
80
|
+
stays `needs-review`.
|
|
81
|
+
|
|
82
|
+
### Start from an existing spec
|
|
83
|
+
|
|
84
|
+
`POST /flow { conversationId, ticketId }` starts a Flow on a spec the person
|
|
85
|
+
already has (Flow and Implement are offered with equal weight for any spec):
|
|
86
|
+
|
|
87
|
+
- **Doors.** The board's spec context menu and the spec detail header
|
|
88
|
+
(**Start in Flow**, next to drag-to-rail / **Move to Rail**,
|
|
89
|
+
[`StartInFlow`](../../client/src/features/flow/components/StartInFlow.tsx),
|
|
90
|
+
provided by App.tsx through the specs seam `SpecExtensionsContext`: specs
|
|
91
|
+
never import Flow),
|
|
92
|
+
the mission's `flow-offer` card when the block carries `ticketId` (the agent
|
|
93
|
+
emits it when the person asks to implement an existing spec without naming a
|
|
94
|
+
rail; the card shows "Spec #N · title" and spec-specific hints; Implement
|
|
95
|
+
replies "Let's implement spec #N on a rail." so the agent continues with the
|
|
96
|
+
rail-launch card) and the rail-launch card of ONE spec (missions'
|
|
97
|
+
`RailLaunchAlternative` slot; starting the Flow dismisses the card). From
|
|
98
|
+
the board the Flow opens in the spec's `origin_conversation_id` mission when
|
|
99
|
+
it can take it (else `flow_already_open` / `conversation_not_pinned` /
|
|
100
|
+
`conversation_not_found` ⇒ a new mission pinned to the project, titled after
|
|
101
|
+
the spec) and the mission panel opens on it. In a project with several Git
|
|
102
|
+
repositories (`flowRepositoryChoice` shows a choice and lists two or more Git
|
|
103
|
+
members) a spec that does not name exactly one Git member first asks where
|
|
104
|
+
the Flow runs (`chooseSpecRepository` →
|
|
105
|
+
[`FlowRepositoryPrompt`](../../client/src/features/flow/components/FlowRepositoryPrompt.tsx),
|
|
106
|
+
a dialog mounted once by `FlowMissionsBridge` so it survives the board menu
|
|
107
|
+
closing). It uses the entry card's
|
|
108
|
+
[`FlowRepositoryPicker`](../../client/src/features/flow/components/FlowRepositoryPicker.tsx)
|
|
109
|
+
(Git members of `GET /repositories`, arrow-key radio group), preselects the
|
|
110
|
+
spec's first Git member, else the Git primary (a folder primary preselects
|
|
111
|
+
nothing), and sends the pick as `repositoryId`; Cancel starts nothing.
|
|
112
|
+
Otherwise (one repository, a spec naming exactly one Git member, the list
|
|
113
|
+
failing to load) no dialog shows and the server triages as below.
|
|
114
|
+
The rail-launch card's door asks the same way: the card passes its spec's
|
|
115
|
+
`ticketTitle` / `ticketRepositoryIds` through `RailLaunchAlternative`.
|
|
116
|
+
- **Eligibility** (before any write; `FlowTickets.inspectExisting`, re-checked
|
|
117
|
+
atomically by `adoptExisting`): the spec exists, is not done/cancelled, is
|
|
118
|
+
not held by another Flow and is on no rail (`spec_on_rail`, or
|
|
119
|
+
`spec_running` when that rail has a live delivery). The client mirrors it
|
|
120
|
+
(`startInFlowBlock`) and disables the action with the reason as tooltip;
|
|
121
|
+
it also needs Flow availability.
|
|
122
|
+
- **Saga.** `start` carries `ticketId`: `specOrigin = 'existing'`
|
|
123
|
+
(`flow_sessions.spec_origin`, migration 82) and the first effect is
|
|
124
|
+
`adoptTicket` instead of `createPlaceholderTicket`. The spec keeps its
|
|
125
|
+
`source` and gets `metadata.flow = { …, origin: 'existing', previousStatus }`
|
|
126
|
+
and status `in_progress` (the same "In Flow" label). A spec that targets
|
|
127
|
+
exactly one repository runs there.
|
|
128
|
+
- **First turn.** `ticket-created` carries `buildSpecSeedBriefing` (title,
|
|
129
|
+
body with acceptance criteria and Contract Layer, non-goals, open addenda;
|
|
130
|
+
≤ 24 KB) in the pending briefing, delivered once on the user turn like a
|
|
131
|
+
Back to Flow briefing.
|
|
132
|
+
- **Discard / failed start / restart compensation** emit `restoreTicket`
|
|
133
|
+
instead of `deletePlaceholderTicket`: the label goes and `previousStatus`
|
|
134
|
+
comes back (unless the spec moved on). An existing spec is never deleted;
|
|
135
|
+
`deletePlaceholder` also refuses any spec with `origin: 'existing'`.
|
|
136
|
+
- **Settlement.** `rewrite-spec` first keeps the spec's current content as
|
|
137
|
+
ONE comment "Original spec before Flow" (`preserveOriginal`, idempotent via
|
|
138
|
+
`metadata.flow.originalCommentId`), then rewrites the spec ENTIRELY from what
|
|
139
|
+
was built (current format + awaited Contract Layer), quoting the original as
|
|
140
|
+
context only. After a successful rewrite the spec's live addenda (open — the
|
|
141
|
+
ones the first turn showed, or added since — or in flight on the hand-off
|
|
142
|
+
run) become `applied` like a completed rail run's (`applyAddenda` →
|
|
143
|
+
`applyFlowSpecAddenda`; an open one records the Flow's delivery id as
|
|
144
|
+
`run_id`). A failed rewrite leaves them untouched; a replay is a no-op. `jira-create` of a spec already linked to an issue enqueues an
|
|
145
|
+
idempotent outbox `update` of THAT issue (`flow:<flowId>:update`,
|
|
146
|
+
`JiraSyncManager.enqueueSpecUpdate`: summary, description, labels,
|
|
147
|
+
priority; note `updated`), never a create; `jira-review` then moves it to the
|
|
148
|
+
status mapped for `on_review`. An unlinked spec keeps create-at-settlement.
|
|
149
|
+
|
|
150
|
+
### Workspaces and multi-repository projects
|
|
151
|
+
|
|
152
|
+
A project can be a workspace (a plain folder primary holding several Git
|
|
153
|
+
repositories) or list several Git repositories. Flow then runs in ONE Git
|
|
154
|
+
member, chosen before any effect (`resolveFlowRepository`, pure domain):
|
|
155
|
+
|
|
156
|
+
| Request | Result |
|
|
157
|
+
| --- | --- |
|
|
158
|
+
| Single-repository project | Never triaged; the Flow runs at the project root exactly as before. |
|
|
159
|
+
| Explicit `repositoryId` | Must be a listed, available `kind: 'git'` member, else `400 flow_repository_not_git` / `flow_repository_unknown`. Choosing the primary keeps the pre-workspace behaviour. |
|
|
160
|
+
| No `repositoryId` | The primary when it is Git, else the only Git member; several candidates ⇒ `400 flow_repository_required`, none ⇒ `flow_repository_not_git`. |
|
|
161
|
+
|
|
162
|
+
The mission agent triages it: the `flow-offer` block carries `repositoryId`
|
|
163
|
+
(required when `project.repositories` lists more than one Git repository or the
|
|
164
|
+
primary is a folder; never a folder, never invented). `FlowEntryCard` shows the
|
|
165
|
+
target with a picker of the Git members (`GET /repositories`), preselected from
|
|
166
|
+
the offer, only for such projects. "Start in Flow" from the board or the spec detail uses the same picker
|
|
167
|
+
in a dialog (see [Start from an existing spec](#start-from-an-existing-spec)).
|
|
168
|
+
|
|
169
|
+
A non-primary choice is persisted on `flow_sessions.repository_id`
|
|
170
|
+
(migration 80; NULL ⇒ primary) and on the placeholder spec
|
|
171
|
+
(`repositoryIds: [id]`). Reserve, freeze, diff and release use that member's
|
|
172
|
+
checkout, its own integration branch and the per-repository mount root
|
|
173
|
+
`~/.specrails/projects/<slug>/worktrees/<repositoryId>/<flowId>/…`
|
|
174
|
+
(`isolatedRepositoryTarget`, shared with `prepareIsolatedWorktree`); the
|
|
175
|
+
overlay comes from the project's framework surface, as for a multi-repository
|
|
176
|
+
rail child. A dev server started inside such a Flow (MCP `background_start`, or
|
|
177
|
+
`POST /background-processes` without `repositoryId`) runs in the Flow worktree,
|
|
178
|
+
tagged with the Flow and its repository.
|
|
179
|
+
|
|
180
|
+
### Turns
|
|
181
|
+
|
|
182
|
+
While the Flow is `active`, `FlowTurnContext.forConversation` returns
|
|
183
|
+
`{ cwd, coreSessionId, systemPrompt, policy }` and the mission turn becomes a
|
|
184
|
+
Flow turn:
|
|
185
|
+
|
|
186
|
+
- its own Core session `flow:<flowId>` (cwd is fixed at open, so the
|
|
187
|
+
mission's session stays intact and resumes after the Flow);
|
|
188
|
+
- `permissions: 'bypass'`, `tools: { mode: 'default' }` (see
|
|
189
|
+
[Permissions](#permissions)), the same Specrails MCP the mission presents;
|
|
190
|
+
- sub-agents follow the mission's project policy: "Allow sub-agents" off (the
|
|
191
|
+
default) keeps them disabled; on, the session runs them natively or, with
|
|
192
|
+
"Run sub-agents with" another provider, Core-delegated
|
|
193
|
+
(`resolveSubagentRuntime`). Native sub-agents run inside the provider
|
|
194
|
+
process (the worktree cwd); Core opens delegated children with the parent
|
|
195
|
+
session's cwd and permissions (`DelegationCoordinator.delegate`), so they
|
|
196
|
+
also write only in the worktree. The sub-agent tools of `specrails_mission`
|
|
197
|
+
act on the Flow session while a Flow turn ran last. When enabled, the static
|
|
198
|
+
`FLOW_SUBAGENTS_ADDENDUM` (plus the delegation guidance when delegated) is
|
|
199
|
+
appended to the persona: split truly independent work, then integrate and
|
|
200
|
+
verify it. The Flow session has its own projection and bills `flow` (see
|
|
201
|
+
[agent sessions](agent-sessions.md));
|
|
202
|
+
- the static Flow persona ([agent-flow-prompt.ts](../../server/modules/missions/runtime/agent-flow-prompt.ts))
|
|
203
|
+
as the session `systemPrompt`, never a file in the worktree; per-turn facts
|
|
204
|
+
(worktree path, branch) ride the user turn. Its **Choices** rule ends every
|
|
205
|
+
reply that offers a choice with the mission's fenced `options` block (2-6
|
|
206
|
+
short, actionable labels; never otherwise), rendered as chips;
|
|
207
|
+
- the conversation history is sent once, on the first turn of the Flow
|
|
208
|
+
session; Core's journal keeps the rest;
|
|
209
|
+
- every mid-turn input is delivered as `delivery: 'interrupt'` (the send
|
|
210
|
+
route accepts `deliveryMode: 'interrupt'` only in an active Flow). Desktop
|
|
211
|
+
never calls `session.interrupt` first. The runner follows the correction's
|
|
212
|
+
turn and records ONE invocation with the usage of both turns;
|
|
213
|
+
- the provider session reference never overwrites the mission's
|
|
214
|
+
`session_id`; usage is recorded with `surface: 'flow'`.
|
|
215
|
+
|
|
216
|
+
When the Flow is paused or ended the port returns null and turns are normal
|
|
217
|
+
read-only mission turns again.
|
|
218
|
+
|
|
219
|
+
### Permissions
|
|
220
|
+
|
|
221
|
+
A Flow session runs with the same permission level as a rail's write roles:
|
|
222
|
+
`FLOW_SESSION_BOUNDARY` is `permissions: 'bypass'`, which Core's drivers map
|
|
223
|
+
to Claude `--dangerously-skip-permissions` and Codex
|
|
224
|
+
`--sandbox danger-full-access`. Rails pick the same level for every provider
|
|
225
|
+
(Core's CLI executor); no adapter declares a narrower write-role mapping.
|
|
226
|
+
|
|
227
|
+
The previous `workspace-write` boundary mapped Claude to
|
|
228
|
+
`--permission-mode acceptEdits`: every shell command then waited for an
|
|
229
|
+
interactive approval that a headless Core session cannot get, so the agent
|
|
230
|
+
could not run the typecheck, the tests, an install or the app. That was the
|
|
231
|
+
"you can't run or preview the app while in Flow" report.
|
|
232
|
+
|
|
233
|
+
Containment is the same as a rail's, not an operating-system sandbox:
|
|
234
|
+
|
|
235
|
+
- the session cwd is the Flow worktree (fixed when the Core session opens;
|
|
236
|
+
delegated sub-agents inherit it);
|
|
237
|
+
- the static persona forbids editing, creating or deleting anything outside
|
|
238
|
+
the worktree, switching branches, rewriting history and pushing;
|
|
239
|
+
- the worktree has its own branch, and Flow commits and delivers only that
|
|
240
|
+
worktree (hand-off freeze), so the main checkout is not involved;
|
|
241
|
+
- long-lived processes go through Specrails background processes (below),
|
|
242
|
+
which are confined to the worktree and stopped with the Flow.
|
|
243
|
+
|
|
244
|
+
A command the agent runs can technically reach outside the worktree, as in
|
|
245
|
+
a rail. Normal (non-Flow) mission turns keep their read-only boundary
|
|
246
|
+
([read-only missions](mission-read-only-policy.md)).
|
|
247
|
+
|
|
248
|
+
### Running the app
|
|
249
|
+
|
|
250
|
+
The persona tells the agent to verify its work with its own shell
|
|
251
|
+
(typecheck, tests) and to run every long-lived process (dev server, watcher)
|
|
252
|
+
through `specrails_jobs background_start`, never from its shell. It offers it
|
|
253
|
+
first with the option chips **Start the app** / **Start and expose on the
|
|
254
|
+
local network** / **Not now**. LAN exposure follows the operator rule: the
|
|
255
|
+
framework's own host flag and a warning that anyone on that network can reach
|
|
256
|
+
the app. Once the app is listening it gives the `appUrls` (local, then
|
|
257
|
+
network) as links.
|
|
258
|
+
|
|
259
|
+
`background_start` resolves the conversation's ACTIVE Flow through the
|
|
260
|
+
project's Flow use cases (`ProjectContext.flow.getByConversation`, bound at
|
|
261
|
+
composition; the authenticated capability supplies the conversation). Inside
|
|
262
|
+
an active Flow:
|
|
263
|
+
|
|
264
|
+
- the process runs in the Flow worktree (`cwd` may only name a folder inside
|
|
265
|
+
it; `repositoryId` is ignored) and carries `flowId`;
|
|
266
|
+
- the project's busy guard (a running job or loop) does not apply: the
|
|
267
|
+
worktree is isolated from the checkout those runs use;
|
|
268
|
+
- the call is admitted below the Autonomous level when the user confirmed it
|
|
269
|
+
(`confirmed: true` after picking a start chip). Entering Flow already
|
|
270
|
+
granted write and execution in that worktree, so asking for Autonomous
|
|
271
|
+
would only push the agent back to a raw shell. `background_kill` is admitted
|
|
272
|
+
the same way for a process tagged with that Flow. The exception is the
|
|
273
|
+
tool's `tierException` (`server/mcp/tools/types.ts`), consulted only for
|
|
274
|
+
in-app agent turns; external MCP clients keep the Settings ▸ MCP tiers.
|
|
275
|
+
Outside an active Flow, or without confirmation, the ladder applies as before.
|
|
276
|
+
|
|
277
|
+
The `stopProcesses` effect runs first on pause, discard and hand-off
|
|
278
|
+
(`FlowProcesses.stop` → `stopBackgroundProcessesForFlow`, which requests stop
|
|
279
|
+
and waits up to 4 s for exit) because the worktree is about to be frozen,
|
|
280
|
+
removed or handed to a rail. It is best effort: a failure is logged and never
|
|
281
|
+
blocks the user's decision. Processes never survive a restart (their history
|
|
282
|
+
is marked `interrupted`), so startup reconciliation needs no extra step.
|
|
283
|
+
|
|
284
|
+
### Pause, resume, discard
|
|
285
|
+
|
|
286
|
+
Pause stops the Flow's apps, closes the Core session (stopping a running
|
|
287
|
+
Flow turn) and labels the spec `paused`. A closed Core session never takes
|
|
288
|
+
another turn, so resume (also after Back to Flow and after a restart) opens a
|
|
289
|
+
NEW session `flow:<flowId>:<generation>` lazily; its first turn carries the
|
|
290
|
+
conversation history (and any pending return briefing), so the agent keeps the
|
|
291
|
+
context. A turn also renews the session when the conversation switched provider
|
|
292
|
+
(a Core session is bound to the driver it was opened with) and, if Core still
|
|
293
|
+
answers "session … is closed", reopens and retries once instead of failing
|
|
294
|
+
(`FlowService.renewSession`, `MissionCoreSessions.flowSessionUsable`).
|
|
295
|
+
Projection and accounting follow each session id. Discard stops the apps, closes the
|
|
296
|
+
session, removes the Flow-owned worktree and branch and deletes the
|
|
297
|
+
placeholder spec. Discard after a hand-off is illegal.
|
|
298
|
+
|
|
299
|
+
### Hand-off
|
|
300
|
+
|
|
301
|
+
`POST /flow/:flowId/hand-off { railIndex, loopId?… }`:
|
|
302
|
+
|
|
303
|
+
1. Stop the Flow's apps and close the session; step `handoff:freeze`.
|
|
304
|
+
2. Commit the worktree (overlay and warm `node_modules` excluded) and record
|
|
305
|
+
the frozen HEAD; step `handoff:launch`.
|
|
306
|
+
3. Assign the spec to the free rail and call the rails launch route over
|
|
307
|
+
loopback with `flowId` (the single launch authority keeps every guard).
|
|
308
|
+
4. The launch passes `requiredFlowWorktree` to `launchIsolatedRail`, which
|
|
309
|
+
reuses the exact mount (`reuseBranchWorktree: true`, `fresh: false`) and
|
|
310
|
+
verifies path, branch and `HEAD == headSha` (else
|
|
311
|
+
`FlowWorktreeMismatchError`, 409). Ownership becomes `adopted` (released
|
|
312
|
+
like `created` once the rail owns it, never removed by an allocation
|
|
313
|
+
rollback). The `rail_worktrees` row and `flow_sessions.state = handed_off`
|
|
314
|
+
commit in one transaction; a rollback after adoption returns ownership.
|
|
315
|
+
5. Any failure before that commit reverts the Flow to `paused`.
|
|
316
|
+
|
|
317
|
+
A Flow in a non-primary repository launches with `repositoryIds: [id]`
|
|
318
|
+
(`RequiredFlowWorktree.repositoryId`). The rails route accepts it only when the
|
|
319
|
+
scope is exactly that repository; `launchIsolatedRail` diverts to the
|
|
320
|
+
multi-repository launcher, which accepts the Flow contract only for that single
|
|
321
|
+
selected repository (`FlowWorktreeMismatchError` otherwise) and seeds the
|
|
322
|
+
manifest base with the Flow reservation commit. The repository leg adopts the
|
|
323
|
+
worktree and reports the **parent** (group) delivery to the Flow, because only
|
|
324
|
+
the parent's `rail.pr_state` is broadcast and settles the Flow. A
|
|
325
|
+
one-repository Flow → Spec group copies its child's `review_changes_requested`
|
|
326
|
+
status and settle evidence onto the parent, so the card offers Back to Flow /
|
|
327
|
+
Relaunch and `stoppedDelivery` reads the findings; Back to Flow closes parent
|
|
328
|
+
and child in the same transaction. The settlement reads the derived change
|
|
329
|
+
from the Flow repository.
|
|
330
|
+
|
|
331
|
+
See [Flow → Spec loop](#flow--spec-loop) and [Settlement](#settlement) for
|
|
332
|
+
what happens after the hand-off, and [Back to Flow](#back-to-flow-and-relaunch)
|
|
333
|
+
for a run that stopped with requested changes.
|
|
334
|
+
|
|
335
|
+
### Mode boundaries
|
|
336
|
+
|
|
337
|
+
The service posts one `flow-boundary` system row through the optional
|
|
338
|
+
`FlowConversation.postBoundary` port when the conversation enters Flow (start
|
|
339
|
+
completed: `entered/started`; Back to Flow: `entered/returned`) or leaves it
|
|
340
|
+
(hand-off adopted: `left/handed_off`; discard of an open Flow:
|
|
341
|
+
`left/discarded`; close of a needs-review Flow: `left/closed`), with the branch. Idempotent repeats (the same hand-off
|
|
342
|
+
again) post nothing; a failed start or hand-off posts nothing; a throwing port
|
|
343
|
+
never fails the transition. The client renders the lines and marks the agent
|
|
344
|
+
turns in between as Flow turns.
|
|
345
|
+
|
|
346
|
+
### Restart
|
|
347
|
+
|
|
348
|
+
At project startup, after rail worktree reconciliation and before admission
|
|
349
|
+
opens: `active` Flows become `paused` (sessions never survive a restart);
|
|
350
|
+
`start:ticket`/`start:worktree` are compensated; `start:session` and
|
|
351
|
+
`handoff:*` complete as `paused`; a missing worktree becomes `needs-review`
|
|
352
|
+
(nothing is deleted). Handed-off and terminal Flows are untouched.
|
|
353
|
+
|
|
354
|
+
## Flow → Spec loop
|
|
355
|
+
|
|
356
|
+
`factory:flow-spec` ([recipe](../../server/modules/loops/runtime/loop-flow-spec-recipe.ts))
|
|
357
|
+
is a built-in `mode: 'loop'` factory that exists only when Core advertises
|
|
358
|
+
`engineV2`, `workflowDefinitions` and `deriveChange: 1`. It is listed by
|
|
359
|
+
`GET /api/loops/factory` with `launchable: false`, is not an editable built-in
|
|
360
|
+
(not in `EDITABLE_BUILTIN_LOOP_IDS`, never seeded into the loop library) and
|
|
361
|
+
runs only from a Flow hand-off: the rails route answers `400 flow_id_required`
|
|
362
|
+
without `flowId` and `409 engine_unsupported` when the selected Core lacks
|
|
363
|
+
`deriveChange` (the run itself re-checks in `assertDefinitionSupport`).
|
|
364
|
+
|
|
365
|
+
The graph mirrors Core's reference definition (`flow-spec.json`); a parity
|
|
366
|
+
test compares node kinds, routing and the closed params:
|
|
367
|
+
|
|
368
|
+
```
|
|
369
|
+
init → derive (derive-change) ─pass→ check (verify) ─pass→ review → review-policy ─true→ archive → verify → done
|
|
370
|
+
│fail │fail │false
|
|
371
|
+
└→ repair-guard (1 repair) └──→ check-findings review-findings ←┘
|
|
372
|
+
└──→ correction-budget ─exhausted→ changes-requested
|
|
373
|
+
│ (2 rounds)
|
|
374
|
+
begin-correction → fix (developer, fixer stance, WRITE)
|
|
375
|
+
→ fix-progress ─no change→ changes-requested
|
|
376
|
+
└→ derive (the change is updated in place)
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
- Strict `openspec validate` and the archive preflight run inside the
|
|
380
|
+
`derive-change` piece; its `fail` outcome is the one-visit repair loop, so
|
|
381
|
+
there is no separate `openspec-validate` node. Each correction round resets
|
|
382
|
+
that repair budget.
|
|
383
|
+
- A rejected review or a failing `check` is not a dead end. Their findings
|
|
384
|
+
(`{{outputs.review.structured}}`, or the failing host verification) become
|
|
385
|
+
`$vars.latestFindings` and a bounded correction round runs: `fix` is a
|
|
386
|
+
`role-turn` of the built-in `developer` role with `stance: 'fixer'` (Core's
|
|
387
|
+
fixer instructions, the configured fixer engine when there is one, WRITE
|
|
388
|
+
access in the worktree). It fixes the named defects, adds the tests the
|
|
389
|
+
review asks for (tagged `[spec:<capability>/<slug>]` for the ADDED/MODIFIED
|
|
390
|
+
requirement they prove) and never expands scope or edits `openspec/`.
|
|
391
|
+
`derive` then runs again with `feedback: {{run.latestFindings}}`: the
|
|
392
|
+
deriver updates the existing change in place so the artifacts describe the
|
|
393
|
+
code (including behaviour the review said the spec omitted). A round that
|
|
394
|
+
changes nothing (`fix-progress`) or an exhausted budget
|
|
395
|
+
(`FLOW_CORRECTION_ROUNDS = 2`) ends at `changes-requested`, a `failure` end
|
|
396
|
+
whose reason carries the latest findings.
|
|
397
|
+
- Roles: `deriver` (always added for a `derive-change` node), `developer`
|
|
398
|
+
(the fixer) and `reviewer`. The reviewer receives
|
|
399
|
+
`{{outputs.derive.derivation}}` and treats every unexplained file as an
|
|
400
|
+
issue; the policy gate is `approved == true`.
|
|
401
|
+
- Config: `change: 'new'`, `journal: 'ledger-only'`, `reviewerStepId: 'review'`.
|
|
402
|
+
|
|
403
|
+
Before the run, Desktop prepares the derivation inputs:
|
|
404
|
+
|
|
405
|
+
- **Change id.** Named after the spec title, never after addenda or the run:
|
|
406
|
+
kebab-case, diacritics folded, at most 64 characters cut at a word
|
|
407
|
+
(`flowChangeId`). A name another change holds (present at the Flow base, or
|
|
408
|
+
archived) gets `-2`, `-3`…; an active change that is absent at the base is
|
|
409
|
+
this Flow's own earlier derivation and is reused, so a relaunch re-derives
|
|
410
|
+
it in place. No addenda "delta" briefing applies to Flow.
|
|
411
|
+
- **Base.** `requiredFlowWorktree.baseSha` (the Flow reservation commit)
|
|
412
|
+
travels as `LoopRunRequest.flowDerivation.baseSha` and becomes
|
|
413
|
+
`repositories[].baseSha` in the frozen Core context, so Core measures the
|
|
414
|
+
change from the reservation, not from the frozen hand-off commit (which
|
|
415
|
+
would be an empty change set).
|
|
416
|
+
- **Summary.** The hand-off authority builds a bounded summary of the Flow
|
|
417
|
+
conversation (`buildFlowSummary`): the idea, every message the person typed
|
|
418
|
+
since the Flow started (automatic briefings excluded), the first line of
|
|
419
|
+
the agent's final reply to each (`↳ Agent: …`) and the persona's
|
|
420
|
+
`Decision:` lines; ≤ 32 KB of UTF-8, the oldest messages (with their reply)
|
|
421
|
+
dropped first, then the oldest decisions; front matter
|
|
422
|
+
`transcriptTurns: <n>` counts the messages kept. Message times are SQLite
|
|
423
|
+
`datetime('now')` stamps and the Flow start is ISO 8601: the window compares
|
|
424
|
+
them as instants (`inFlowWindow`, the start floored to its second). Comparing
|
|
425
|
+
the strings once put every message of the Flow's own day before its start
|
|
426
|
+
and produced an empty summary. The executor writes the summary once,
|
|
427
|
+
`0600`, to `.specrails/pipeline/<runId>/flow-summary.md`, which the node
|
|
428
|
+
reads as `summaryPath`. A summary failure never blocks the hand-off: Core
|
|
429
|
+
then derives from the diff alone.
|
|
430
|
+
|
|
431
|
+
## Back to Flow and Relaunch
|
|
432
|
+
|
|
433
|
+
When the run ends at `changes-requested` (or the latest review rejected, or
|
|
434
|
+
the latest checks fail), settlement reads the settle evidence
|
|
435
|
+
(`flowReviewOutcome`, delivery) and records `status_code =
|
|
436
|
+
review_changes_requested` with the reviewer's first issue as `statusDetail`
|
|
437
|
+
instead of the generic "Programmatic workflow stopped" failure. The
|
|
438
|
+
snapshot, the `rail.pr_state` message and the mission card envelope carry
|
|
439
|
+
`flowReview` (`reason` review|check, summary, ≤ 20 issues, score, failing
|
|
440
|
+
host checks). The mission card shows "The reviewer requested changes" with
|
|
441
|
+
those issues and two actions (the Flow extension's `RunCardActions` slot);
|
|
442
|
+
the rail strip shows a "Changes requested" pill and never offers Discard
|
|
443
|
+
(the Flow worktree must survive). The run-failure briefing offers the same
|
|
444
|
+
two actions.
|
|
445
|
+
|
|
446
|
+
- **Back to Flow** — `POST /flow/by-delivery/:deliveryId/return`. Delivery
|
|
447
|
+
owns ONE transaction (`returnFlowWorktree`): it deletes the adopted
|
|
448
|
+
`rail_worktrees` row, closes the delivery as `discarded` /
|
|
449
|
+
`returned_to_flow` (the rail is free again) and, inside it, the Flow saves
|
|
450
|
+
`handed_off → paused` (`returned`: `deliveryId` kept for idempotency,
|
|
451
|
+
`railIndex` cleared). Any failure rolls both back. The worktree, its branch
|
|
452
|
+
and the run's changes (the derived change included) are never touched. The
|
|
453
|
+
spec goes back to in progress, "In Flow" (`reopenTicket`), the agent
|
|
454
|
+
session reopens (a session that cannot open leaves the Flow paused; the
|
|
455
|
+
Flow strip resumes it) and `flow_sessions.return_briefing` (migration 78)
|
|
456
|
+
holds the review: the next Flow turn carries it on the USER turn (never
|
|
457
|
+
the system prompt) and the Flow clears it once that turn completes
|
|
458
|
+
(`briefingDelivered`); a new hand-off drops an undelivered one. The return
|
|
459
|
+
is also announced (`FlowConversation` port, idempotent by delivery): a
|
|
460
|
+
visible system card "What the reviewer asked for" (`flow-return-briefing`
|
|
461
|
+
row: issues, score, failing checks, spec coverage with unexplained files)
|
|
462
|
+
and, when the session opened, ONE automatic Flow turn (durable queue id
|
|
463
|
+
`flow-return:<deliveryId>`, rendered as an automatic briefing) through the
|
|
464
|
+
normal Flow turn path — accounted, interruptible — in which the agent says
|
|
465
|
+
in two lines what it will fix and starts, offering an `options` block first
|
|
466
|
+
when a finding leaves a genuine decision. A paused return only shows the
|
|
467
|
+
card; the briefing waits for the person's next turn.
|
|
468
|
+
- **Relaunch** — `POST /flow/by-delivery/:deliveryId/relaunch`: the same
|
|
469
|
+
return, then the ordinary hand-off (freeze, launch) on the same rail with
|
|
470
|
+
the stopped launch's engine choices. The new run re-derives the existing
|
|
471
|
+
change in place.
|
|
472
|
+
|
|
473
|
+
### A run that failed outright: automatic return
|
|
474
|
+
|
|
475
|
+
A Flow → Spec run can also fail for a technical reason — no review verdict:
|
|
476
|
+
the derivation, a check, the archive or the tooling broke (for example an
|
|
477
|
+
OpenSpec version mismatch). The delivery settles `implementation_failed`
|
|
478
|
+
without `review_changes_requested`. Then the work goes back to its Flow on its
|
|
479
|
+
own (user decision "Volver a Flow solo"):
|
|
480
|
+
|
|
481
|
+
- **Detection** — the `rail.pr_state` observer (`observeDelivery`) asks the
|
|
482
|
+
publication port for `deliveryState(deliveryId).crashed`: a Flow → Spec
|
|
483
|
+
delivery, `implementation_failed`, no `flowReview`, not
|
|
484
|
+
`review_changes_requested`/`returned_to_flow`, no operation in flight. Only
|
|
485
|
+
a Flow still `handed_off` to THAT delivery reacts, so a returned,
|
|
486
|
+
relaunched, delivered or discarded Flow never does and repeated broadcasts
|
|
487
|
+
are no-ops. Startup replay (`replaySettlement`) returns a Flow whose run
|
|
488
|
+
failed while the app was down.
|
|
489
|
+
- **Return** — exactly Back to Flow (`returnToFlow`: delivery's one
|
|
490
|
+
transaction, idempotent by delivery, the session reopens). Before the
|
|
491
|
+
delivery closes, the Flow reads the failure (`FlowRunFailure`): the
|
|
492
|
+
delivery codes (`stoppedDelivery.failure`: status code, first unit failure
|
|
493
|
+
code, status detail) and the runtime's own record (`rails.runFailure`: the
|
|
494
|
+
step it stopped at and the first line of its error, from the run's runtime
|
|
495
|
+
summary). The return briefing names the step, quotes the error, lists the
|
|
496
|
+
codes and sets the conduct: say what failed in two lines; fix it in the
|
|
497
|
+
worktree, or — when the cause is outside (a tool version, the environment,
|
|
498
|
+
credentials) — tell the person exactly what to change instead of working
|
|
499
|
+
around it.
|
|
500
|
+
- **Announcement** — the `flow-return-briefing` row carries `failure` (no
|
|
501
|
+
review fields) and the automatic Flow turn uses the failure text
|
|
502
|
+
(`FLOW_FAILURE_RETURN_TURN_TEXT`, same durable key `flow-return:<deliveryId>`).
|
|
503
|
+
The mission's own run-failure trace row and briefing turn are skipped for
|
|
504
|
+
such runs (`notifyMissionRunFailure({ cardOnly: true })`): the Flow owns the
|
|
505
|
+
explanation. The card update re-reads the delivery after its runtime
|
|
506
|
+
summary, so it never regresses a returned card to the failure.
|
|
507
|
+
- **Failure of the return** — a refusal (worktree gone, delivery busy) only
|
|
508
|
+
logs; the card still offers Back to Flow and Relaunch by hand.
|
|
509
|
+
- **Card** — the mission card renders the Flow extension's
|
|
510
|
+
`RunFailureOutcome` (`FlowRunFailure`): one localized headline per failing
|
|
511
|
+
step group (derive, verify, review, fix, archive, settle, unknown), the
|
|
512
|
+
runtime's error as the cause, "Your work is intact. Back in Flow, the agent
|
|
513
|
+
has the error.", Back to Flow (first) and Relaunch — or "Returned to Flow"
|
|
514
|
+
once returned — and the codes and English detail only under a collapsed
|
|
515
|
+
**Technical details** (with the repository of a multi-repository run). The
|
|
516
|
+
generic failure block, note, status label and failed unit chip are hidden.
|
|
517
|
+
A returned card keeps the `runtime` failure snapshot it stopped with
|
|
518
|
+
(`updatePrDecisionCard` carries it over for `returned_to_flow`).
|
|
519
|
+
|
|
520
|
+
## Settlement
|
|
521
|
+
|
|
522
|
+
When the Flow's delivery reaches review, the Flow settles. Triggers:
|
|
523
|
+
|
|
524
|
+
- a `rail.pr_state` broadcast for the Flow's `deliveryId` whose decision is
|
|
525
|
+
`on_review`, `pr_draft`, `pr_ready`, `completed` or `merged` with a
|
|
526
|
+
succeeded implementation (`observeDelivery`);
|
|
527
|
+
- without a PR delivery row (PR delivery disabled), the completed run itself
|
|
528
|
+
(`onRailRunCompleted`, keyed by the run id);
|
|
529
|
+
- at startup, `replaySettlement` settles handed-off Flows whose delivery
|
|
530
|
+
reached review while the app was down and resumes pending effects; a 30 s
|
|
531
|
+
scheduler retries due effects.
|
|
532
|
+
|
|
533
|
+
`onFlowDelivered` records `delivered`, labels the spec `delivered` and
|
|
534
|
+
enqueues three durable effects in `flow_effects` (migration 75, project
|
|
535
|
+
database) with keys `flow:<flowId>:rewrite-spec`, `:jira-create`,
|
|
536
|
+
`:jira-review`. They run in `seq` order with attempts and exponential backoff
|
|
537
|
+
(15 s doubling, capped at 5 min); a pending effect that is not due blocks the
|
|
538
|
+
ones after it, and a failure never reverts the delivery.
|
|
539
|
+
|
|
540
|
+
| Effect | Does | Gives up |
|
|
541
|
+
| --- | --- | --- |
|
|
542
|
+
| `rewrite-spec` | (Flow from an existing spec: first keeps the original as an "Original spec before Flow" comment.) Reads the derived change from the delivered commit (`proposal.md`, `design.md` of the archived change, diffstat), sets `metadata.flow.state = 'delivered'`, `metadata.openspecChangeName` and status `on_review`, then rewrites the spec in place with `generateSpecFromText({ ticketId })` (current format, surface `flow`) and an awaited Contract Layer; once rewritten, the spec's open/in-flight addenda become `applied` | 3 attempts → `failed`: the spec keeps its Flow draft and the packet says so |
|
|
543
|
+
| `jira-create` | Projects with an active Jira connection only: `enqueuePromote(ticketId, 'flow:<flowId>:create')` (durable outbox create with marker recovery); a Flow from an existing spec already linked to an issue enqueues `enqueueSpecUpdate(ticketId, 'flow:<flowId>:update')` instead (note `updated`) | 8 attempts; `skipped` when not connected |
|
|
544
|
+
| `jira-review` | Once the issue link exists: `onRailReview([ticketId], deliveryId)` → the status mapped for `on_review` | 60 polls while the outbox creates the issue; `skipped` when no issue was created |
|
|
545
|
+
|
|
546
|
+
Why a dedicated table instead of the Jira outbox or `rail_pr_ticket_effects`:
|
|
547
|
+
the spec rewrite is not a Jira operation, the three effects are ordered across
|
|
548
|
+
two systems (specs, then Jira) and keyed by the Flow rather than the delivery
|
|
549
|
+
decision. The Jira writes still go through the Jira outbox, so retry, marker
|
|
550
|
+
recovery and dead-lettering stay where they are.
|
|
551
|
+
|
|
552
|
+
Nothing reaches Jira during Flow or on discard: `isFlowHeldTicket` blocks every
|
|
553
|
+
create while the Flow is `active`/`paused`, and the run settlement in
|
|
554
|
+
`project-registry` excludes Flow-held specs from its own `onRailReview`, so a
|
|
555
|
+
Flow spec is never transitioned before its issue exists nor transitioned twice.
|
|
556
|
+
|
|
557
|
+
Once the spec rewrite and the Jira create settled, the conversation gets the
|
|
558
|
+
Flow's closing summary (`flow-delivered` row, once per Flow; see
|
|
559
|
+
[Client](#client)).
|
|
560
|
+
|
|
561
|
+
## Jira
|
|
562
|
+
|
|
563
|
+
`isFlowHeldTicket` (metadata.flow state `active` or `paused`) blocks every
|
|
564
|
+
Jira create: promote returns an error and a durable `create` outbox op is
|
|
565
|
+
retried until the Flow settles (dead-lettered after the normal attempt
|
|
566
|
+
limit). Unlinked tickets never receive outbound writes otherwise.
|
|
567
|
+
|
|
568
|
+
## Events and cost
|
|
569
|
+
|
|
570
|
+
`flow.state { projectId, conversationId, flowId, flow, timestamp }` is
|
|
571
|
+
broadcast on every committed change (and when a settlement effect finishes).
|
|
572
|
+
`GET /flow/:flowId/cost` sums only provider-billed Flow turns in the Flow's
|
|
573
|
+
lifetime (user turns, continuation turns after sub-agents and delegated
|
|
574
|
+
sub-agents' own spend, all recorded with surface `flow`) and reports
|
|
575
|
+
`unpricedTurns` separately; project spending exposes
|
|
576
|
+
`flowCostUsd` and `flowTurns` inside the agent-mission summary. The spec
|
|
577
|
+
rewrite is recorded with surface `flow`.
|
|
578
|
+
|
|
579
|
+
## Review packet
|
|
580
|
+
|
|
581
|
+
A Flow → Spec delivery adds a **Derivation** section before "What to watch
|
|
582
|
+
out for": coverage (`explained/files`, Core's measurement from git), the
|
|
583
|
+
unexplained files, requirements added/modified and the deriver's confidence
|
|
584
|
+
(AI-reported). It comes from the derive-change scope in `runtime status`
|
|
585
|
+
(`output.derivation`, or `derivation.json` at `output.derivationPath`),
|
|
586
|
+
harvested into the settle evidence. A missing report renders as unavailable,
|
|
587
|
+
never silently. The draft PR body gets one derivation line. See
|
|
588
|
+
[review packet](review-packet.md).
|
|
589
|
+
|
|
590
|
+
## Client
|
|
591
|
+
|
|
592
|
+
Feature [`client/src/features/flow`](../../client/src/features/flow/README.md).
|
|
593
|
+
Missions never import it: the composition root mounts `FlowMissionsBridge`
|
|
594
|
+
around the mission chat and fills the missions extension seam
|
|
595
|
+
([MissionExtensionsContext](../../client/src/features/missions/context/MissionExtensionsContext.tsx)):
|
|
596
|
+
a `flow-offer` fence card, a conversation mode (while a Flow is open: the
|
|
597
|
+
composer's **Flow** chip and placeholder, "In Flow" next to the
|
|
598
|
+
mission title, `hideGitStrip` — the run strip shows and copies the worktree
|
|
599
|
+
branch; only an active Flow adds `data-flow="active"` and interrupting sends),
|
|
600
|
+
its runs in the mission's run strip (`useLiveRuns`) with the words for the
|
|
601
|
+
steps of Flow → Spec (`describeRun`), the mission list's "In Flow" mark
|
|
602
|
+
(`useConversationMarks`), its state announcements (`ConversationDock`, mounted by the run strip and speaking through the strip's ONE polite live region via `announce`), the
|
|
603
|
+
run card's Back to Flow / Relaunch and the `RunFailureOutcome` of a failed
|
|
604
|
+
Flow → Spec run.
|
|
605
|
+
|
|
606
|
+
| Piece | Behaviour |
|
|
607
|
+
| --- | --- |
|
|
608
|
+
| Offer | The operator classifies pre-launch work as Freestyle / SDD Quick / Implement / Flow. The user turn carries `Flow: offerable` only when `FlowTurnContext.offerable` says so (Flow available, conversation pinned, no open Flow), so the static prompts stay byte-stable. The `flow-offer` block ({idea, reason, repositoryId?}) renders `FlowOfferCard`: Flow and spec + Implement with equal weight, always in that order, and the reason as neutral context ("Why the agent asked"). Flow and Implement never compete: the prompt forbids recommending or ranking either; a legacy `recommended` still parses (and still drives fence promotion) but the card ignores it. Fence promotion re-tags {idea, reason} (or a legacy {idea, recommended}) from generic JSON on both sides. While a reply streams the choices are disabled with a visible hint. |
|
|
609
|
+
| Entry | `FlowEntryCard` explains the isolated worktree and starts `POST /flow`. In a workspace or a project with several Git repositories it shows the target repository (radio list of Git members, the agent's triage marked "Suggested by the agent") and sends `repositoryId`; `flow_repository_*` refusals read in plain words. Unavailable ⇒ disabled with the missing capabilities in plain words. A `409 repository_has_no_commits` shows a localized message and **Create initial commit** (`POST /git/initial-commit`, an empty commit); on success Start is retried. |
|
|
610
|
+
| Decision record | `agent_messages.intent` kinds `flow-offer` (`accepted`/`dismissed`, `chosenMode`, `config.flowId`; a legacy `recommendedMode` is still accepted and stored, never sent by the client) and `flow-hand-off`; unique per (kind, proposalIndex). Flow kinds are accepted even with mission rail cards off. |
|
|
611
|
+
| Mode signals | Recognition over recall, never color alone, no screen tint. Flow has its OWN color token, `--color-accent-flow` (globals.css, every theme, ≥4.5:1 on cards and backgrounds; `FLOW_ACCENT` in `lib/flow-accent.ts`), passed through the seam as `MissionModeBadge.accent` — running stays `accent-info`, browsing the composer history uses a dashed neutral border. The composer is the main signal (a **Flow** chip with its icon next to the tier chip — no accent line along the composer: the chip names the mode — the placeholder "Tell the agent what to change in this Flow…"; the switch fades in/out in 200 ms, instant under reduced motion), "In Flow" (the board's wording) next to the mission title, and the same icon + "In Flow" on the mission list row (`GET /flow/open` per project, kept current by `flow.state`). The same app-wide watch feeds the mission list's attention dot for Flow runs (`useRunAttention` → `useFlowRunAttention`), so it is live and clears whether or not the mission is open; the strip no longer reports Flow runs itself. One rule (`lib/flow-run-tone.ts`) gives the strip tone and the dot: active is running, paused is paused, needs-review is `info`, so no open Flow state waits for the person on its own; a Flow → Spec run that fails or waits for review is a delivery and feeds the dot through its envelope. The history marks the boundaries with one line each — "Entered Flow · <branch>" and "Left Flow · handed off to a rail / discarded" — from server `flow-boundary` rows (`FlowConversation.postBoundary`, posted on start, hand-off, return and discard; the return is told by the Back to Flow line, so its boundary only marks turns); the agent turns between an entered and the next left boundary carry a discreet "Flow" mark next to their time (icon, color and words from the seam's `useTurnMark`; missions never hard-codes the Flow icon). While the Flow runs, the strip mark is the Flow icon in the Flow color (`MissionLiveRun.mode`). |
|
|
612
|
+
| Active | The Flow is ONE entry of the mission's run strip (`useFlowLiveRuns`, key `flow:<id>` so the strip morphs in place). Its row stays short: the status mark and "Flow · 7 files" (`flowStripHeadline`, inside the expand toggle), then `FlowStripControls` — Pause Flow (Resume Flow when paused) and the primary **Hand off**; a disabled control carries its reason (tooltip + `aria-describedby`: saving, another action, no spec yet). The chevron opens `FlowPanel`, the same expand pattern as any run: the copyable Flow branch, the files ± (a button that opens the changes dialog), the provider-billed cost so far or `—` (a `*` plus a visible note with the number of unpriced turns), Preview while the Flow's app runs and **Discard** set apart at the end. The diff and cost are measured ONCE per Flow (`useFlowLiveStats` in `useFlowLiveRuns`, shared by row and panel), refreshed on state changes and when a turn settles, and polled every 8 s only while the agent works and the page is visible; the returned runs are memoized. The discard confirmation lists what is lost (changed files with +/−, branch, placeholder spec). The Flow's state changes are announced through the strip's one polite live region; the strip's state word gives the mark a text equivalent and the dot pulses only while the agent works. Keyboard: Pause/Resume claims **P** and Hand off **H** (`FlowBarControl.shortcut` → `data-strip-key`, shown as "Pause Flow (P)" and `aria-keyshortcuts`); they act ONLY while the mission's run strip has focus (reach it with ⌥R), never globally, so nothing fires from the composer or another mission. The strip-level keys (⌥R, ⌥[ / ⌥], Esc) are missions' (`run-strip-keys.ts`, see [mission rail cards](mission-rail-cards.md)). Busy sends use `deliveryMode: 'interrupt'`; a 409 `interrupt_requires_flow` is resent normally. Option chips on the newest settled reply stay clickable while the agent is busy; a pick then interrupts (idle picks send normally). |
|
|
613
|
+
| Preview | In the Flow's panel, while an app the agent started for this Flow (a background process tagged `flowId`, from the mission's `BackgroundProcessesContext`) announces `appUrls`, `FlowAppPreview` shows **Preview** with a live dot: it opens the local address in the system browser, like the mission's app chips (Desktop has no embedded preview for mission apps). Its menu has the network address (or says the app only listens on this computer) and **Stop app**. Hidden when nothing runs and on a paused Flow. |
|
|
614
|
+
| Paused / needs-review | Paused: the same row with the paused mark and Resume Flow as the primary; the panel adds "Paused. Your changes and the spec are kept…". Needs review (the Flow's copy of the project is missing) is INFORMATIONAL (`info` tone: an info mark, no decision bell, no primary, not urgent); its panel keeps the copyable branch, the cost so far and the changes (only when a surviving worktree still holds some), explains the state and offers only the non-destructive **Close this Flow**: `FlowCloseDialog` names what is KEPT (the branch, the spec without its label) and confirms with "Close Flow, keep branch". |
|
|
615
|
+
| Hand off | Color decision (deliberate): **Hand off** ("Pasar a un rail") and **Launch** keep the shared `accent-primary` primary recipe (`RUN_STRIP_PRIMARY`), NOT the Flow color. They are the controls that LEAVE Flow for a rail, so they speak the app's launch color; the Flow color marks being in Flow (mark, chip, badges, Back to Flow). Client-only: the strip morphs into "Ready to turn into a PR" (a calm `info` tone: no bell, no attention dot) and its panel opens on its own with `FlowHandOffCard` — the rail launch card in hand-off mode reduced to ONE confirmation line ("Rail 2 will turn your 7 changed files into a reviewed PR. If it fails, your work is safe.", the rail's words follow the chosen rail, "A new rail" when none is free) with **Launch** and **Not yet**. The rail, engine, model and effort (a free empty rail and the conversation's selection, prefilled) sit collapsed under **Change how**, with the files ± and cost so far (the cost so far also ends the main line; a partial cost's `*` is said in words for screen readers and explained by a short visible note under the line); only when the conversation's provider cannot run the loop here, the engine fallback note shows right under the line (it changes what launches); the loop is fixed to `factory:flow-spec` (no selector). The region is named "Turn this Flow into a reviewed PR". **Launch** (the card's Play) calls `POST /flow/:id/hand-off`; it is declared as an outward primary; while the request runs and until the run's own entry shows, the strip is a launching skeleton (`FlowContext.launching`, then the hand-off receipt; the entry `yieldsTo` its delivery), so there is no gap. After 45 s (`HAND_OFF_SHOW_TIMEOUT_MS`) without the run the skeleton stops: "Still handing off to Rail N…" with **Refresh**, which only re-reads (the run cards and the Flow, `FlowContext.refreshFlow`): the entry stays until the delivery shows or the Flow state moves on. Refusals render inline in the panel; "Not yet" returns to the Flow, and so does Esc (`onPanelClose('escape')` of `MissionLiveRun`). A click in the conversation, the toggle or another run only folds the panel (`collapse`): the strip keeps "Ready to turn into a PR" with **Launch** as its primary (`wantsPrimary`, outward: it opens the card focused on Launch). The choices under **Change how** (rail, engine, model, effort) are kept per Flow id in `FlowContext.handOffDrafts` (`RailLaunchHandOff.draft` / `onDraftChange`) and restored when the hand-off reopens; a successful launch clears them. The offer's "Flow handed off to Rail N" record has **View run**, which opens the run in the strip through the shared focus bus. |
|
|
616
|
+
| Flow → Spec run | The run strip names its steps in the person's words ("Writing the spec from your changes", "Verifying your changes", "Reviewing the change", …) and a failure by its step (`flow.failure.step.*`); Back to Flow is the primary of a failed run. The building card drops the generic PR hint. Once settled, the history keeps one outcome line ("Delivered: PR #812", "… went back to Flow") that expands the card; "Back to Flow" with what the reviewer asked for is one expandable line too. |
|
|
617
|
+
| Closing summary | Once a delivered Flow's spec rewrite and Jira create settled (done, skipped or failed for good — the Jira review transition may still wait for the issue link), `runSettlement` posts ONE `flow-delivered` system row (`FlowConversation.postDeliveredSummary`, dedupe `flow-delivered:<flowId>`): the PR link, the spec-rewrite outcome, the archived OpenSpec change and the Jira key when linked. Missions renders it as `AgentFlowDeliveredCard`. |
|
|
618
|
+
| Board | `metadata.flow.state` `active`/`paused` ⇒ "In Flow" label linking to the conversation; the spec cannot be dragged to a rail; inside a rail (handed off) or `delivered` ⇒ no label. |
|
|
619
|
+
| Analytics | `flow` surface label; agent missions show the Flow share (`flowCostUsd`, `flowTurns`). |
|
|
620
|
+
|
|
621
|
+
`flow.state` events are applied only for projects a mounted view watches; a
|
|
622
|
+
reconnect refetches the watched Flows.
|
|
623
|
+
|
|
624
|
+
**Copy layer.** Flow surfaces never show raw English server text outside a
|
|
625
|
+
collapsed **Technical details**: failures map by step and code
|
|
626
|
+
(`flow-failure.ts`: `flowFailureStep`, `flowErrorMessage`), Flow API refusals
|
|
627
|
+
read by `flow.errors.<code>` (the server detail is at most a secondary line,
|
|
628
|
+
e.g. a toast description), and the mission chat maps Core's known turn
|
|
629
|
+
failures — "No provider activity before the inactivity limit" and "A tool
|
|
630
|
+
call produced no provider activity before the tool inactivity limit" — to
|
|
631
|
+
`agent:turnErrors.*` (`describeAgentError`). The hand-off button reads "Hand
|
|
632
|
+
off" (es "Pasar a un rail", de "Übergeben", fr "Remettre", it "Affida", ja "引き渡す",
|
|
633
|
+
pt "Passar a um rail", zh "交给 Rail"); the hand-off region is named "Turn this Flow into a
|
|
634
|
+
reviewed PR" and the strip headline before launch reads "Ready to turn into a
|
|
635
|
+
PR". Glossary for user copy: never "worktree" in headlines or primary copy
|
|
636
|
+
(say "Flow branch" / es "rama de Flow", or "the Flow's copy" of the project);
|
|
637
|
+
"rail" only as the board's noun ("Rail 2"), never as a verb; "spec change"
|
|
638
|
+
instead of "OpenSpec change"; the loop reads "Flow hand-off" in user copy
|
|
639
|
+
(`common:loopChip.flowSpec`, `flow.handOff.loop`), while "Flow → Spec" and the
|
|
640
|
+
exact OpenSpec names stay in **Technical details** and internal docs. Every
|
|
641
|
+
locale uses ONE verb family for the hand-off across button, progress, state
|
|
642
|
+
and failure, kept apart from the PR-delivered state: es "Pasar a un rail" /
|
|
643
|
+
"Pasando a un rail…" / "Pasado a un rail" / "El paso a un rail se detuvo"
|
|
644
|
+
(delivered "Entregado"); fr "Remettre"/"remis" (delivered "Livré"); it
|
|
645
|
+
"Affida"/"affidamento" (delivered "Consegnato"); pt "Passar a um rail"/
|
|
646
|
+
"passagem" (delivered "entregue"/"Concluído"); zh "交给 Rail"/"移交" (delivered
|
|
647
|
+
"已交付"/"已完成"); de "Übergeben"/"Übergabe" (delivered "Ausgeliefert"); ja
|
|
648
|
+
"引き渡す" (delivered "完了"). Copy never names the "Flow bar" (it no longer
|
|
649
|
+
exists): say the Flow strip, or the Hand off action.
|
|
650
|
+
New strings avoid em-dash constructions ("Paused. Waiting for you").
|
|
651
|
+
|
|
652
|
+
## Known limitations
|
|
653
|
+
|
|
654
|
+
- A conversation re-pinned to another project while a Flow is open stops
|
|
655
|
+
resolving the Flow (turns become normal mission turns).
|
|
656
|
+
- Flow's containment is the cwd, the persona and the worktree's own branch,
|
|
657
|
+
as for rails; it is not an operating-system sandbox.
|
|
658
|
+
- The Preview control follows the mission whose processes the app tracks:
|
|
659
|
+
in a split view it shows the Flow apps of the active conversation.
|
|
660
|
+
- Without PR delivery, the derived change is read from the run's branch,
|
|
661
|
+
which the legacy merge-back may already have removed; the rewrite then
|
|
662
|
+
fails and the spec keeps its draft.
|
|
663
|
+
- End-to-end coverage uses unit and integration tests with fakes; the paired
|
|
664
|
+
Core harness does not exercise `derive-change` until Core ships it.
|
|
665
|
+
- The diff dialog lists files and line counts; the server does not return
|
|
666
|
+
patch bodies yet.
|
|
667
|
+
- "Hand off" is session-local: after a reload an open Flow shows its strip
|
|
668
|
+
row again (nothing was sent to the server).
|