specrails-desktop 2.64.2 → 2.65.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/cli/dist/status.js +3 -0
- package/client/dist/assets/ActivityFeedPage-ByVKYII-.js +1 -0
- package/client/dist/assets/AgentBrowserCapture-BGUTjhUr.js +1 -0
- package/client/dist/assets/AgentModeAnalyticsPane-CtOLDDjB.js +2 -0
- package/client/dist/assets/AgentModeCodePane-CDhUKarT.js +2 -0
- package/client/dist/assets/AgentModeJobsPane-BAa_oEHJ.js +1 -0
- package/client/dist/assets/AgentsPage-D32hG4Ve.js +120 -0
- package/client/dist/assets/AnalyticsPage-BU50zeG6.js +5 -0
- package/client/dist/assets/BudgetCard-DP_jxwaD.js +55 -0
- package/client/dist/assets/CodePage-jiYnKGpp.js +3 -0
- package/client/dist/assets/CostValue-Bvn8674q.js +1 -0
- package/client/dist/assets/DesktopAnalyticsPage-CF__H4e3.js +1 -0
- package/client/dist/assets/DocView-RrAp70zp.js +11 -0
- package/client/dist/assets/DocsDialog-DkqHU-JF.js +1 -0
- package/client/dist/assets/DocsPage-C6X089zC.js +1 -0
- package/client/dist/assets/ExportDropdown-C5-o8y3K.js +1 -0
- package/client/dist/assets/HelpHint-Crf9_uoR.js +1 -0
- package/client/dist/assets/IntegrationsPage-aflU3KHK.js +1 -0
- package/client/dist/assets/InteractiveJobComposer-CEMMhyyJ.js +19 -0
- package/client/dist/assets/JobDetailModal-BVJ6hyRs.js +1 -0
- package/client/dist/assets/JobDetailPage-DHzBUmox.js +1 -0
- package/client/dist/assets/JobsPage-o-LAqkwC.js +1 -0
- package/client/dist/assets/LoopBuilderPage-DbSVmXBM.js +1 -0
- package/client/dist/assets/LoopPreviewModal-DbJcVyN1.js +1 -0
- package/client/dist/assets/{LoopWindowSurface-DE0v2K1p.js → LoopWindowSurface-Co1ZK26V.js} +1 -1
- package/client/dist/assets/LoopsPage-C4lgkPXB.js +2 -0
- package/client/dist/assets/MinimizedChatsContext-742ypO8n.js +1 -0
- package/client/dist/assets/PluginsPage-Acks9ges.js +2 -0
- package/client/dist/assets/RailTrack-BfLmBzBh.js +1 -0
- package/client/dist/assets/{RepositoryScopeSelector-2eSqR9WK.js → RepositoryScopeSelector-DcxbKI9w.js} +1 -1
- package/client/dist/assets/ReviewPacketPage-CAVSIOAJ.js +7 -0
- package/client/dist/assets/TemplatePreviewModal-C23SYCTm.js +1 -0
- package/client/dist/assets/TicketDetailModalContext-B-Gtm6Ob.js +23 -0
- package/client/dist/assets/Trans-C6J0cLyh.js +1 -0
- package/client/dist/assets/a11y-prefs-BqoP5goK.js +1 -0
- package/client/dist/assets/activity-BBWfoUOG.js +1 -0
- package/client/dist/assets/activity-BM_skann.js +1 -0
- package/client/dist/assets/activity-Cevl82ke.js +1 -0
- package/client/dist/assets/activity-CmACk5W5.js +1 -0
- package/client/dist/assets/activity-D9LBw3PQ.js +1 -0
- package/client/dist/assets/activity-Dspbb9lz.js +1 -0
- package/client/dist/assets/activity-FPjYIjv9.js +1 -0
- package/client/dist/assets/activity-nLCKMUKt.js +1 -0
- package/client/dist/assets/addspec-BI4jDMhA.js +1 -0
- package/client/dist/assets/addspec-BldTv7Tl.js +1 -0
- package/client/dist/assets/addspec-Cdq-2EcC.js +1 -0
- package/client/dist/assets/addspec-DH5M16BQ.js +1 -0
- package/client/dist/assets/addspec-DOFo9pD5.js +1 -0
- package/client/dist/assets/addspec-DPkwhdmL.js +1 -0
- package/client/dist/assets/addspec-Dzy12Pv3.js +1 -0
- package/client/dist/assets/addspec-skTs6EEW.js +1 -0
- package/client/dist/assets/agent-B_UEUy7Y.js +1 -0
- package/client/dist/assets/agent-BarjlhTA.js +1 -0
- package/client/dist/assets/agent-BfqIITo5.js +1 -0
- package/client/dist/assets/agent-Bt9a7Kyj.js +1 -0
- package/client/dist/assets/agent-C3689RwP.js +1 -0
- package/client/dist/assets/agent-CrmboTAi.js +1 -0
- package/client/dist/assets/agent-DcsoTnuE.js +1 -0
- package/client/dist/assets/agent-GDZoYwd4.js +1 -0
- package/client/dist/assets/{agentRuntime-es2ymSl-.js → agentRuntime-BYH70bKY.js} +1 -1
- package/client/dist/assets/agentRuntime-BijLh8I9.js +1 -0
- package/client/dist/assets/{agentRuntime-BzuwQQgn.js → agentRuntime-BvyuETPe.js} +1 -1
- package/client/dist/assets/{agentRuntime-BDvbJMmS.js → agentRuntime-C2WI6HQh.js} +1 -1
- package/client/dist/assets/{agentRuntime-BKJfv5YD.js → agentRuntime-CZPIlQsr.js} +1 -1
- package/client/dist/assets/{agentRuntime-DiCldqGG.js → agentRuntime-D2dDvCyJ.js} +1 -1
- package/client/dist/assets/agentRuntime-DWZedEbn.js +1 -0
- package/client/dist/assets/agentRuntime-DkIruUNw.js +1 -0
- package/client/dist/assets/agents-35_PDKx9.js +1 -0
- package/client/dist/assets/agents-8fZnHhEQ.js +1 -0
- package/client/dist/assets/agents-Bgimtw8z.js +1 -0
- package/client/dist/assets/agents-C4P160Us.js +1 -0
- package/client/dist/assets/agents-Clg67zbp.js +1 -0
- package/client/dist/assets/agents-DJfF4o6G.js +1 -0
- package/client/dist/assets/agents-Dc9-Y5cw.js +1 -0
- package/client/dist/assets/agents-EN1Zl4YZ.js +1 -0
- package/client/dist/assets/agentstudio-Bm4-NYaG.js +1 -0
- package/client/dist/assets/agentstudio-CD1fuj2o.js +1 -0
- package/client/dist/assets/agentstudio-CQGWFSst.js +1 -0
- package/client/dist/assets/agentstudio-CqVSb65S.js +1 -0
- package/client/dist/assets/agentstudio-DIE_HjsX.js +1 -0
- package/client/dist/assets/agentstudio-D_OmQK-k.js +1 -0
- package/client/dist/assets/agentstudio-Djz9aUfb.js +1 -0
- package/client/dist/assets/agentstudio-Qa3v9o5J.js +1 -0
- package/client/dist/assets/{aiedit-DNXxq_Dr.js → aiedit-1VzLs37W.js} +1 -1
- package/client/dist/assets/{aiedit-DCjA7jLJ.js → aiedit-BNp6GSik.js} +1 -1
- package/client/dist/assets/{aiedit-BoG24nlg.js → aiedit-BOY5xRPi.js} +1 -1
- package/client/dist/assets/{aiedit-iIjz2_Qk.js → aiedit-BrqMZvbc.js} +1 -1
- package/client/dist/assets/{aiedit-CjlSRQVP.js → aiedit-CVgtl7hm.js} +1 -1
- package/client/dist/assets/{aiedit-DQ-0_pvE.js → aiedit-CrFW9Jd2.js} +1 -1
- package/client/dist/assets/{aiedit-olnv3QSt.js → aiedit-YE2lILp7.js} +1 -1
- package/client/dist/assets/{aiedit-B0KUbpB6.js → aiedit-iA_R1AVQ.js} +1 -1
- package/client/dist/assets/analytics-3w0t-4ic.js +1 -0
- package/client/dist/assets/analytics-BRi4KQD6.js +1 -0
- package/client/dist/assets/analytics-BtjAqzke.js +1 -0
- package/client/dist/assets/analytics-COSQ1h47.js +1 -0
- package/client/dist/assets/analytics-CP2HjESk.js +1 -0
- package/client/dist/assets/analytics-DY65TC62.js +1 -0
- package/client/dist/assets/analytics-Den_vvxn.js +1 -0
- package/client/dist/assets/analytics-LmBS96O8.js +1 -0
- package/client/dist/assets/api-DOGbyfTO.js +2 -0
- package/client/dist/assets/builder-BMVvSr4v.js +1 -0
- package/client/dist/assets/builder-BN-MuLZt.js +1 -0
- package/client/dist/assets/builder-BQOZi4CF.js +1 -0
- package/client/dist/assets/builder-BjUPjsyu.js +1 -0
- package/client/dist/assets/builder-BoBtN18T.js +1 -0
- package/client/dist/assets/builder-C5g5NhxL.js +1 -0
- package/client/dist/assets/builder-RUHXw3yx.js +1 -0
- package/client/dist/assets/builder-fyS_AiyC.js +1 -0
- package/client/dist/assets/button-CHPkroew.js +1 -0
- package/client/dist/assets/chat-C9L5T7KI.js +1 -0
- package/client/dist/assets/chevron-right-CwMAj0w_.js +1 -0
- package/client/dist/assets/chevron-up-BAMuP0XD.js +1 -0
- package/client/dist/assets/chunk-OB3PAWPO-BBaq6pUk.js +3 -0
- package/client/dist/assets/code-4le5IIbf.js +1 -0
- package/client/dist/assets/code-B-jCVIbm.js +1 -0
- package/client/dist/assets/code-BRfrn5ix.js +1 -0
- package/client/dist/assets/code-CC9NCrDM.js +1 -0
- package/client/dist/assets/code-CK6pm8wY.js +1 -0
- package/client/dist/assets/code-DDiOzd6c.js +1 -0
- package/client/dist/assets/code-tGifiyf5.js +1 -0
- package/client/dist/assets/code-xkn8kQTg.js +1 -0
- package/client/dist/assets/commands-Bv1QshHR.js +1 -0
- package/client/dist/assets/commands-BvxTxboW.js +1 -0
- package/client/dist/assets/commands-C5ORR0fO.js +1 -0
- package/client/dist/assets/commands-CBKMFSTV.js +1 -0
- package/client/dist/assets/commands-CFJIRsJv.js +1 -0
- package/client/dist/assets/commands-D9o3ZcXl.js +1 -0
- package/client/dist/assets/commands-DNox0Edk.js +1 -0
- package/client/dist/assets/commands-DmIUMLdV.js +1 -0
- package/client/dist/assets/common-5H4TkaoI.js +1 -0
- package/client/dist/assets/common-9S3OdPjx.js +1 -0
- package/client/dist/assets/common-BqnwIcjs.js +1 -0
- package/client/dist/assets/common-CQP3VafS.js +1 -0
- package/client/dist/assets/common-CZnAfkB2.js +1 -0
- package/client/dist/assets/common-D5sNttV4.js +1 -0
- package/client/dist/assets/common-k_qX9nlv.js +1 -0
- package/client/dist/assets/common-s4HIi9XI.js +1 -0
- package/client/dist/assets/compass-B7guwBlY.js +1 -0
- package/client/dist/assets/confirm-dialog-ChZdHL3Q.js +1 -0
- package/client/dist/assets/copy-DOPlLymH.js +1 -0
- package/client/dist/assets/core-BozBzB6Y.js +1 -0
- package/client/dist/assets/dashboard-6zGLGcEz.js +1 -0
- package/client/dist/assets/dashboard-8Gi0FBDq.js +1 -0
- package/client/dist/assets/dashboard-B7E5YrSy.js +1 -0
- package/client/dist/assets/dashboard-BhdKV8xK.js +1 -0
- package/client/dist/assets/dashboard-Bu3zzH_s.js +1 -0
- package/client/dist/assets/dashboard-Ce_6rELA.js +1 -0
- package/client/dist/assets/dashboard-DWY-oz8P.js +1 -0
- package/client/dist/assets/dashboard-gUzlWk0o.js +1 -0
- package/client/dist/assets/date-input-Cdlr8kHz.js +1 -0
- package/client/dist/assets/dialog-C23lB2iP.js +5 -0
- package/client/dist/assets/dist-Di-oOFkX.js +1 -0
- package/client/dist/assets/dist-js-CBmS6MsJ.js +1 -0
- package/client/dist/assets/{dist-js-Rlh4FLH5.js → dist-js-DaJmKapi.js} +1 -1
- package/client/dist/assets/dropdown-menu-Bfp2CK6H.js +1 -0
- package/client/dist/assets/empty-state-D5w9OWj-.js +1 -0
- package/client/dist/assets/es2015-DfnECntk.js +41 -0
- package/client/dist/assets/esm-BKF6CE7v.js +1 -0
- package/client/dist/assets/event-BEnMLqAi.js +1 -0
- package/client/dist/assets/explore--NOz9LCN.js +1 -0
- package/client/dist/assets/explore-B2ulH6dO.js +1 -0
- package/client/dist/assets/explore-BD-QiLdg.js +1 -0
- package/client/dist/assets/explore-BOqd4_1j.js +1 -0
- package/client/dist/assets/explore-Be_Zh5zu.js +1 -0
- package/client/dist/assets/explore-CLjzPSKo.js +1 -0
- package/client/dist/assets/explore-D_-vHm29.js +1 -0
- package/client/dist/assets/explore-yEQTF6ro.js +1 -0
- package/client/dist/assets/file-text-CNXzL3wj.js +1 -0
- package/client/dist/assets/format-BODoFIw6.js +1 -0
- package/client/dist/assets/formatDistanceToNow-DLMIOS0N.js +1 -0
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-O61feXch.js +1 -0
- package/client/dist/assets/git-compare-arrows-Cu6tICCq.js +1 -0
- package/client/dist/assets/humanise-command-CB4ybLwq.js +1 -0
- package/client/dist/assets/inbox-BLZ8cm6_.js +1 -0
- package/client/dist/assets/inbox-BQ3VmNYY.js +1 -0
- package/client/dist/assets/inbox-BdcXWCuT.js +1 -0
- package/client/dist/assets/inbox-CF1PHjns.js +1 -0
- package/client/dist/assets/inbox-CFNPDhso.js +1 -0
- package/client/dist/assets/inbox-DIttK_NW.js +1 -0
- package/client/dist/assets/inbox-Dfdv1Ykl.js +1 -0
- package/client/dist/assets/inbox-JS1inmeO.js +1 -0
- package/client/dist/assets/index-4UWY7Xyz.css +2 -0
- package/client/dist/assets/index-DHzB0T26.js +120 -0
- package/client/dist/assets/integrations-BcKgzgPD.js +1 -0
- package/client/dist/assets/integrations-BmX_XyJq.js +1 -0
- package/client/dist/assets/integrations-CHpwMjlY.js +1 -0
- package/client/dist/assets/integrations-CT3kr8e-.js +1 -0
- package/client/dist/assets/integrations-C_5XAkgz.js +1 -0
- package/client/dist/assets/integrations-Ct9zLX7N.js +1 -0
- package/client/dist/assets/integrations-DEYemxUv.js +1 -0
- package/client/dist/assets/integrations-DWvsB_WB.js +1 -0
- package/client/dist/assets/{jira-Cq6yvN4q.js → jira-B_ERkFRv.js} +1 -1
- package/client/dist/assets/jira-Bn-A5lwD.js +1 -0
- package/client/dist/assets/jira-C71Ybnhp.js +1 -0
- package/client/dist/assets/jira-CkwjeJz6.js +1 -0
- package/client/dist/assets/jira-D9pSLXjI.js +1 -0
- package/client/dist/assets/jira-DBRS_lcp.js +1 -0
- package/client/dist/assets/jira-DHS6CsKh.js +1 -0
- package/client/dist/assets/jira-MInHRUb1.js +1 -0
- package/client/dist/assets/jira-api-DHme7Upx.js +1 -0
- package/client/dist/assets/jobs-BMLTDo63.js +1 -0
- package/client/dist/assets/jobs-BO8q4Mi1.js +1 -0
- package/client/dist/assets/jobs-Ck8uOWMM.js +1 -0
- package/client/dist/assets/jobs-CyFfPCpg.js +1 -0
- package/client/dist/assets/jobs-DT5s4fZ6.js +1 -0
- package/client/dist/assets/jobs-DZAgVPcD.js +1 -0
- package/client/dist/assets/jobs-b5gPYaKr.js +1 -0
- package/client/dist/assets/jobs-xsZK1440.js +1 -0
- package/client/dist/assets/launch-forecast-BTa-p3RP.js +1 -0
- package/client/dist/assets/{loop-layout-DtxX27Jz.css → loop-layout-DLioOiRN.css} +1 -1
- package/client/dist/assets/loop-layout-Sl9cfTvs.js +7 -0
- package/client/dist/assets/loops-BEEOVJDR.js +1 -0
- package/client/dist/assets/loops-BcrQ2vk7.js +1 -0
- package/client/dist/assets/loops-BjWxzJIZ.js +1 -0
- package/client/dist/assets/loops-BogV595N.js +1 -0
- package/client/dist/assets/loops-CU0BLZiz.js +1 -0
- package/client/dist/assets/loops-CrNBgi1G.js +1 -0
- package/client/dist/assets/loops-CwalwS_i.js +1 -0
- package/client/dist/assets/loops-_TDVN-fX.js +1 -0
- package/client/dist/assets/mcp-BNs8gxoL.js +1 -0
- package/client/dist/assets/mcp-BvRh_xO5.js +1 -0
- package/client/dist/assets/mcp-C2F1pghi.js +1 -0
- package/client/dist/assets/mcp-D9RLKAs2.js +1 -0
- package/client/dist/assets/mcp-DAghcsR0.js +1 -0
- package/client/dist/assets/mcp-DWWAPi1G.js +1 -0
- package/client/dist/assets/mcp-DbGSFC3f.js +1 -0
- package/client/dist/assets/mcp-FelCicrv.js +1 -0
- package/client/dist/assets/narration-C3NBkAR4.js +1 -0
- package/client/dist/assets/narration-CkoJq-Lf.js +1 -0
- package/client/dist/assets/narration-Cr0NeW9K.js +1 -0
- package/client/dist/assets/narration-DJUXOs-W.js +1 -0
- package/client/dist/assets/narration-DgL8TMvN.js +1 -0
- package/client/dist/assets/narration-DjBafgv0.js +1 -0
- package/client/dist/assets/narration-Dle6Iv0c.js +1 -0
- package/client/dist/assets/narration-MYlfktga.js +1 -0
- package/client/dist/assets/nav-BSQ8KW1c.js +1 -0
- package/client/dist/assets/nav-BauVof8Z.js +1 -0
- package/client/dist/assets/nav-BfOAH1se.js +1 -0
- package/client/dist/assets/nav-D3bOsipX.js +1 -0
- package/client/dist/assets/nav-DOMMhlLx.js +1 -0
- package/client/dist/assets/nav-DPzVlgZU.js +1 -0
- package/client/dist/assets/nav-DZJbFbah.js +1 -0
- package/client/dist/assets/nav-D_5aojd2.js +1 -0
- package/client/dist/assets/notify-error-BsWANx1T.js +1 -0
- package/client/dist/assets/onboarding-BdZQnNm3.js +1 -0
- package/client/dist/assets/onboarding-CJQEv1vp.js +1 -0
- package/client/dist/assets/onboarding-CWJGYUW3.js +1 -0
- package/client/dist/assets/onboarding-ChfYN7dA.js +1 -0
- package/client/dist/assets/onboarding-CjvDUR3V.js +1 -0
- package/client/dist/assets/onboarding-I6vS-zTB.js +1 -0
- package/client/dist/assets/onboarding-dgC_9dTB.js +1 -0
- package/client/dist/assets/onboarding-mlXSyKzX.js +1 -0
- package/client/dist/assets/origin-03nTuaOb.js +1 -0
- package/client/dist/assets/packet-BjpyRnZr.js +1 -0
- package/client/dist/assets/packet-BwgG5mBt.js +1 -0
- package/client/dist/assets/packet-C3eAUFkV.js +1 -0
- package/client/dist/assets/packet-C8wZuSld.js +1 -0
- package/client/dist/assets/packet-CNXEy_85.js +1 -0
- package/client/dist/assets/packet-DsV5Aa_8.js +1 -0
- package/client/dist/assets/packet-aasskOE7.js +1 -0
- package/client/dist/assets/packet-phxCc2gJ.js +1 -0
- package/client/dist/assets/page-header-BStSHkP8.js +1 -0
- package/client/dist/assets/project-repositories-DJPeAVBK.js +1 -0
- package/client/dist/assets/{provider-capabilities-lePfeT_Y.js → provider-capabilities-DtwcTme4.js} +1 -1
- package/client/dist/assets/recovery-BPDOsC92.js +1 -0
- package/client/dist/assets/recovery-BluNHoXM.js +1 -0
- package/client/dist/assets/recovery-CRvEmB0C.js +1 -0
- package/client/dist/assets/recovery-CeIoRnkR.js +1 -0
- package/client/dist/assets/recovery-DHCo8KGi.js +1 -0
- package/client/dist/assets/recovery-OxAIpbBF.js +1 -0
- package/client/dist/assets/recovery-XXexYGOJ.js +1 -0
- package/client/dist/assets/recovery-pITlc--v.js +1 -0
- package/client/dist/assets/refresh-cw-DfyTkbsf.js +1 -0
- package/client/dist/assets/select-xA3pSmqE.js +1 -0
- package/client/dist/assets/settings--yzDbX9r.js +1 -0
- package/client/dist/assets/settings-5_heTv8s.js +1 -0
- package/client/dist/assets/settings-BSf27MDg.js +1 -0
- package/client/dist/assets/settings-BSj6FakR.js +1 -0
- package/client/dist/assets/settings-BZDo_8Nn.js +1 -0
- package/client/dist/assets/settings-BdWgmNc0.js +1 -0
- package/client/dist/assets/settings-DRouxKqb.js +1 -0
- package/client/dist/assets/settings-DnWFoY-F.js +1 -0
- package/client/dist/assets/setup-BJWy62ri.js +1 -0
- package/client/dist/assets/setup-BgKOIuzc.js +1 -0
- package/client/dist/assets/setup-BvVIyUlz.js +1 -0
- package/client/dist/assets/setup-BxCk2pe1.js +1 -0
- package/client/dist/assets/setup-C-xQTL7R.js +1 -0
- package/client/dist/assets/setup-CbaVoiwV.js +1 -0
- package/client/dist/assets/setup-DxTBkX3P.js +1 -0
- package/client/dist/assets/setup-oGoVAzOD.js +1 -0
- package/client/dist/assets/specs-7tAb4IKr.js +1 -0
- package/client/dist/assets/specs-BUcY4s5v.js +1 -0
- package/client/dist/assets/specs-Bk5LeBAA.js +1 -0
- package/client/dist/assets/specs-CAA4Lrlg.js +1 -0
- package/client/dist/assets/specs-CS091AnA.js +1 -0
- package/client/dist/assets/specs-DJ6gmFcK.js +1 -0
- package/client/dist/assets/specs-GfCcrBSC.js +1 -0
- package/client/dist/assets/specs-xQgyc7WL.js +1 -0
- package/client/dist/assets/spending-CVH8VREb.js +1 -0
- package/client/dist/assets/square-Co6h5vZg.js +1 -0
- package/client/dist/assets/tauri-shell-43ixPGfa.js +2 -0
- package/client/dist/assets/terminal-0v9sBylD.js +1 -0
- package/client/dist/assets/terminal-AbUAmCxE.js +1 -0
- package/client/dist/assets/terminal-BJayIbIP.js +1 -0
- package/client/dist/assets/terminal-C2RUlXyi.js +1 -0
- package/client/dist/assets/terminal-CMmSb_Nj.js +1 -0
- package/client/dist/assets/terminal-DKWjj7HJ.js +1 -0
- package/client/dist/assets/terminal-KlFu7_pV.js +1 -0
- package/client/dist/assets/terminal-i99yqFvm.js +1 -0
- package/client/dist/assets/tickets-846Oq3i3.js +1 -0
- package/client/dist/assets/tickets-B5LJTe_b.js +1 -0
- package/client/dist/assets/tickets-Bfo2GGmH.js +1 -0
- package/client/dist/assets/tickets-BhdZ1yY2.js +1 -0
- package/client/dist/assets/tickets-CgjWJHAW.js +1 -0
- package/client/dist/assets/tickets-Ct9DbDUR.js +1 -0
- package/client/dist/assets/tickets-rptLEJB1.js +1 -0
- package/client/dist/assets/tickets-xQ6DpYdu.js +1 -0
- package/client/dist/assets/trending-up-BGvb4zZt.js +1 -0
- package/client/dist/assets/undo-6zuS4-sL.js +1 -0
- package/client/dist/assets/undo-BeM4gDOP.js +1 -0
- package/client/dist/assets/undo-BeppX8xS.js +1 -0
- package/client/dist/assets/undo-BqvNZ5MG.js +1 -0
- package/client/dist/assets/undo-BzwEPf_k.js +1 -0
- package/client/dist/assets/undo-CJ9Cu1NN.js +1 -0
- package/client/dist/assets/undo-ds8nMFbX.js +1 -0
- package/client/dist/assets/undo-x_gA-knG.js +1 -0
- package/client/dist/assets/useDesktop-BuOp2-MR.js +1 -0
- package/client/dist/assets/useRuntimeRuns-BRS6ncnO.js +1 -0
- package/client/dist/assets/utils-ELimjS2Y.js +1 -0
- package/client/dist/assets/wrench-Br2n1Lxd.js +1 -0
- package/client/dist/index.html +75 -60
- package/docs/ci-cd.md +29 -1
- package/docs/cli.md +10 -31
- package/docs/codex.md +1 -1
- package/docs/creating-specs.md +15 -12
- package/docs/customizing.md +16 -13
- package/docs/getting-started.md +12 -11
- package/docs/guide/de/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/de/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/de/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/de/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/de/getting-started/6-universal-search.md +34 -0
- package/docs/guide/de/insights/1-analytics-and-cost-tracking.md +20 -6
- package/docs/guide/de/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/de/insights/3-code-explorer.md +1 -1
- package/docs/guide/de/integrations/1-ai-providers.md +1 -1
- package/docs/guide/de/integrations/2-plugins.md +1 -1
- package/docs/guide/de/integrations/3-jira-integration.md +3 -3
- package/docs/guide/de/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/de/integrations/5-mcp-server.md +1 -1
- package/docs/guide/de/integrations/6-agent-chat.md +12 -5
- package/docs/guide/de/integrations/8-flow-mode.md +69 -0
- package/docs/guide/de/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/de/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/de/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/de/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/de/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/de/settings/1-themes.md +1 -1
- package/docs/guide/de/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/de/settings/5-project-environment.md +1 -1
- package/docs/guide/de/settings/6-updates.md +24 -0
- package/docs/guide/de/settings/7-existing-projects.md +33 -0
- package/docs/guide/de/settings/8-accessibility.md +23 -0
- package/docs/guide/de/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/de/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/de/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/en/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/en/getting-started/1-what-is-specrails.md +1 -1
- package/docs/guide/en/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/en/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/en/getting-started/5-the-dashboard-tour.md +52 -0
- package/docs/guide/en/getting-started/6-universal-search.md +34 -0
- package/docs/guide/en/insights/1-analytics-and-cost-tracking.md +24 -10
- package/docs/guide/en/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/en/insights/3-code-explorer.md +5 -5
- package/docs/guide/en/integrations/1-ai-providers.md +1 -1
- package/docs/guide/en/integrations/2-plugins.md +1 -1
- package/docs/guide/en/integrations/3-jira-integration.md +4 -4
- package/docs/guide/en/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/en/integrations/5-mcp-server.md +4 -4
- package/docs/guide/en/integrations/6-agent-chat.md +12 -5
- package/docs/guide/en/integrations/8-flow-mode.md +69 -0
- package/docs/guide/en/pipeline/1-rails-and-jobs.md +22 -3
- package/docs/guide/en/pipeline/2-the-job-detail-view.md +19 -7
- package/docs/guide/en/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/en/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/en/pipeline/5-the-loop-builder.md +2 -2
- package/docs/guide/en/settings/1-themes.md +1 -1
- package/docs/guide/en/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/en/settings/5-project-environment.md +1 -1
- package/docs/guide/en/settings/6-updates.md +24 -0
- package/docs/guide/en/settings/7-existing-projects.md +33 -0
- package/docs/guide/en/settings/8-accessibility.md +23 -0
- package/docs/guide/en/specs/1-specs-and-the-backlog.md +42 -6
- package/docs/guide/en/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/en/specs/3-add-spec-explore-mode.md +2 -2
- package/docs/guide/es/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/es/agents/2-profiles-and-the-balanced-default.md +1 -1
- package/docs/guide/es/agents/3-customizing-models-per-agent.md +2 -2
- package/docs/guide/es/agents/4-custom-agents-catalog.md +1 -1
- package/docs/guide/es/getting-started/1-what-is-specrails.md +3 -3
- package/docs/guide/es/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/es/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/es/getting-started/5-the-dashboard-tour.md +52 -0
- package/docs/guide/es/getting-started/6-universal-search.md +34 -0
- package/docs/guide/es/insights/1-analytics-and-cost-tracking.md +26 -12
- package/docs/guide/es/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/es/insights/3-code-explorer.md +5 -5
- package/docs/guide/es/integrations/1-ai-providers.md +1 -1
- package/docs/guide/es/integrations/2-plugins.md +1 -1
- package/docs/guide/es/integrations/3-jira-integration.md +4 -4
- package/docs/guide/es/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/es/integrations/5-mcp-server.md +4 -4
- package/docs/guide/es/integrations/6-agent-chat.md +14 -7
- package/docs/guide/es/integrations/7-local-engines.md +1 -1
- package/docs/guide/es/integrations/8-flow-mode.md +69 -0
- package/docs/guide/es/pipeline/1-rails-and-jobs.md +33 -13
- package/docs/guide/es/pipeline/2-the-job-detail-view.md +38 -26
- package/docs/guide/es/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/es/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/es/pipeline/5-the-loop-builder.md +4 -4
- package/docs/guide/es/settings/1-themes.md +1 -1
- package/docs/guide/es/settings/3-pipeline-telemetry-and-diagnostics.md +10 -10
- package/docs/guide/es/settings/5-project-environment.md +1 -1
- package/docs/guide/es/settings/6-updates.md +24 -0
- package/docs/guide/es/settings/7-existing-projects.md +33 -0
- package/docs/guide/es/settings/8-accessibility.md +23 -0
- package/docs/guide/es/specs/1-specs-and-the-backlog.md +43 -7
- package/docs/guide/es/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/es/specs/3-add-spec-explore-mode.md +3 -3
- package/docs/guide/fr/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/fr/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/fr/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/fr/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/fr/getting-started/6-universal-search.md +34 -0
- package/docs/guide/fr/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/fr/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/fr/insights/3-code-explorer.md +1 -1
- package/docs/guide/fr/integrations/1-ai-providers.md +1 -1
- package/docs/guide/fr/integrations/2-plugins.md +1 -1
- package/docs/guide/fr/integrations/3-jira-integration.md +3 -3
- package/docs/guide/fr/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/fr/integrations/5-mcp-server.md +1 -1
- package/docs/guide/fr/integrations/6-agent-chat.md +11 -4
- package/docs/guide/fr/integrations/8-flow-mode.md +69 -0
- package/docs/guide/fr/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/fr/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/fr/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/fr/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/fr/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/fr/settings/1-themes.md +1 -1
- package/docs/guide/fr/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/fr/settings/5-project-environment.md +1 -1
- package/docs/guide/fr/settings/6-updates.md +24 -0
- package/docs/guide/fr/settings/7-existing-projects.md +33 -0
- package/docs/guide/fr/settings/8-accessibility.md +23 -0
- package/docs/guide/fr/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/fr/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/fr/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/it/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/it/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/it/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/it/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/it/getting-started/6-universal-search.md +34 -0
- package/docs/guide/it/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/it/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/it/insights/3-code-explorer.md +1 -1
- package/docs/guide/it/integrations/1-ai-providers.md +1 -1
- package/docs/guide/it/integrations/2-plugins.md +1 -1
- package/docs/guide/it/integrations/3-jira-integration.md +3 -3
- package/docs/guide/it/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/it/integrations/5-mcp-server.md +1 -1
- package/docs/guide/it/integrations/6-agent-chat.md +11 -4
- package/docs/guide/it/integrations/8-flow-mode.md +69 -0
- package/docs/guide/it/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/it/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/it/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/it/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/it/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/it/settings/1-themes.md +1 -1
- package/docs/guide/it/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/it/settings/5-project-environment.md +1 -1
- package/docs/guide/it/settings/6-updates.md +24 -0
- package/docs/guide/it/settings/7-existing-projects.md +33 -0
- package/docs/guide/it/settings/8-accessibility.md +23 -0
- package/docs/guide/it/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/it/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/it/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/ja/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/ja/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/ja/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/ja/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/ja/getting-started/6-universal-search.md +34 -0
- package/docs/guide/ja/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/ja/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/ja/insights/3-code-explorer.md +1 -1
- package/docs/guide/ja/integrations/1-ai-providers.md +1 -1
- package/docs/guide/ja/integrations/2-plugins.md +1 -1
- package/docs/guide/ja/integrations/3-jira-integration.md +3 -3
- package/docs/guide/ja/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/ja/integrations/5-mcp-server.md +1 -1
- package/docs/guide/ja/integrations/6-agent-chat.md +11 -4
- package/docs/guide/ja/integrations/8-flow-mode.md +69 -0
- package/docs/guide/ja/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/ja/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/ja/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/ja/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/ja/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/ja/settings/1-themes.md +1 -1
- package/docs/guide/ja/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/ja/settings/5-project-environment.md +1 -1
- package/docs/guide/ja/settings/6-updates.md +24 -0
- package/docs/guide/ja/settings/7-existing-projects.md +33 -0
- package/docs/guide/ja/settings/8-accessibility.md +23 -0
- package/docs/guide/ja/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/ja/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/ja/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/pt/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/pt/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/pt/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/pt/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/pt/getting-started/6-universal-search.md +34 -0
- package/docs/guide/pt/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/pt/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/pt/insights/3-code-explorer.md +1 -1
- package/docs/guide/pt/integrations/1-ai-providers.md +1 -1
- package/docs/guide/pt/integrations/2-plugins.md +1 -1
- package/docs/guide/pt/integrations/3-jira-integration.md +3 -3
- package/docs/guide/pt/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/pt/integrations/5-mcp-server.md +1 -1
- package/docs/guide/pt/integrations/6-agent-chat.md +12 -5
- package/docs/guide/pt/integrations/8-flow-mode.md +69 -0
- package/docs/guide/pt/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/pt/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/pt/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/pt/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/pt/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/pt/settings/1-themes.md +1 -1
- package/docs/guide/pt/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/pt/settings/5-project-environment.md +1 -1
- package/docs/guide/pt/settings/6-updates.md +24 -0
- package/docs/guide/pt/settings/7-existing-projects.md +33 -0
- package/docs/guide/pt/settings/8-accessibility.md +23 -0
- package/docs/guide/pt/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/pt/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/pt/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/zh/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/zh/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/zh/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/zh/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/zh/getting-started/6-universal-search.md +34 -0
- package/docs/guide/zh/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/zh/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/zh/insights/3-code-explorer.md +1 -1
- package/docs/guide/zh/integrations/1-ai-providers.md +1 -1
- package/docs/guide/zh/integrations/2-plugins.md +1 -1
- package/docs/guide/zh/integrations/3-jira-integration.md +3 -3
- package/docs/guide/zh/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/zh/integrations/5-mcp-server.md +1 -1
- package/docs/guide/zh/integrations/6-agent-chat.md +11 -4
- package/docs/guide/zh/integrations/8-flow-mode.md +69 -0
- package/docs/guide/zh/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/zh/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/zh/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/zh/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/zh/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/zh/settings/1-themes.md +1 -1
- package/docs/guide/zh/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/zh/settings/5-project-environment.md +1 -1
- package/docs/guide/zh/settings/6-updates.md +24 -0
- package/docs/guide/zh/settings/7-existing-projects.md +33 -0
- package/docs/guide/zh/settings/8-accessibility.md +23 -0
- package/docs/guide/zh/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/zh/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/zh/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/internals/README.md +8 -0
- package/docs/internals/adding-a-provider.md +19 -2
- package/docs/internals/agent-actions-audit.md +101 -0
- package/docs/internals/agent-sessions.md +36 -1
- package/docs/internals/api-reference.md +190 -45
- package/docs/internals/architecture.md +53 -47
- package/docs/internals/companion-inbox-decisions.md +42 -0
- package/docs/internals/companion-rails-as-loops-contract.md +17 -6
- package/docs/internals/configuration.md +140 -9
- package/docs/internals/core-runtime-updates.md +4 -4
- package/docs/internals/existing-project-anchoring.md +168 -0
- package/docs/internals/flow-mode.md +668 -0
- package/docs/internals/legacy-implementation-notes.md +13 -0
- package/docs/internals/local-testing-feedback-2026-10.md +210 -0
- package/docs/internals/mcp-mission-audit.md +4 -0
- package/docs/internals/mission-rail-cards.md +10 -5
- package/docs/internals/mission-read-only-policy.md +152 -0
- package/docs/internals/modal-standard.md +181 -0
- package/docs/internals/openspec-workflow.md +32 -0
- package/docs/internals/operations-runbook.md +30 -0
- package/docs/internals/profiles.md +6 -3
- package/docs/internals/programmatic-agent-runtime.md +8 -0
- package/docs/internals/project-builder.md +1 -1
- package/docs/internals/review-packet.md +161 -9
- package/docs/internals/safe-pr-review-flow.md +135 -6
- package/docs/internals/source-map.md +413 -18
- package/docs/internals/spec-addenda.md +10 -0
- package/docs/internals/spec-triage.md +140 -0
- package/docs/internals/visual-design-audit.md +15 -2
- package/docs/local-providers.md +3 -0
- package/docs/mcp.md +21 -3
- package/docs/platforms/macos.md +1 -1
- package/docs/platforms/windows.md +2 -2
- package/docs/running-pipelines.md +22 -6
- package/docs/tracking-cost.md +54 -10
- package/local-runner/dist/specrails-local-runner.js +3851 -1178
- package/mcp-bridge/dist/specrails-mcp.js +3864 -1143
- package/package.json +10 -9
- package/server/dist/agent-mcp-config.js +37 -1
- package/server/dist/api-version.js +19 -0
- package/server/dist/command-resolver.js +4 -2
- package/server/dist/core-compat.js +1 -1
- package/server/dist/core-execution.js +2 -1
- package/server/dist/core-update-manager.js +71 -13
- package/server/dist/db/job-search.js +248 -0
- package/server/dist/db/jobs.js +6 -0
- package/server/dist/db/migrations.js +239 -0
- package/server/dist/db.js +9 -2
- package/server/dist/desktop-db.js +99 -5
- package/server/dist/desktop-router.js +126 -13
- package/server/dist/docs-router.js +67 -1
- package/server/dist/feature-flags.js +22 -0
- package/server/dist/index.js +30 -15
- package/server/dist/jira/jira-adf.js +13 -1
- package/server/dist/jira/jira-clarifications.js +146 -0
- package/server/dist/jira/jira-client.js +8 -1
- package/server/dist/jira/jira-db.js +41 -0
- package/server/dist/jira/jira-sync-manager.js +328 -25
- package/server/dist/mcp/guide.js +17 -7
- package/server/dist/mcp/tools/agents.js +1 -1
- package/server/dist/mcp/tools/analytics.js +15 -3
- package/server/dist/mcp/tools/app-settings.js +14 -1
- package/server/dist/mcp/tools/chat.js +1 -1
- package/server/dist/mcp/tools/env.js +4 -2
- package/server/dist/mcp/tools/jobs.js +96 -7
- package/server/dist/mcp/tools/loops.js +1 -1
- package/server/dist/mcp/tools/meta.js +10 -13
- package/server/dist/mcp/tools/rails.js +15 -1
- package/server/dist/mcp/tools/setup.js +1 -1
- package/server/dist/mcp/tools/specs.js +8 -5
- package/server/dist/mcp/tools/support.js +6 -3
- package/server/dist/mcp/tools/types.js +38 -1
- package/server/dist/mobile/mobile-admin-router.js +0 -16
- package/server/dist/mobile/mobile-gateway.js +0 -18
- package/server/dist/mobile/mobile-inbox.js +240 -0
- package/server/dist/mobile/mobile-missions.js +6 -8
- package/server/dist/mobile/mobile-router.js +9 -9
- package/server/dist/mobile/mobile-webrtc-peer.js +4 -54
- package/server/dist/mobile/mobile-ws.js +27 -4
- package/server/dist/modules/accounting/runtime/ai-invocations.js +4 -0
- package/server/dist/modules/accounting/runtime/decision-times.js +102 -0
- package/server/dist/modules/accounting/runtime/loop-economics.js +284 -0
- package/server/dist/modules/accounting/runtime/spending.js +7 -2
- package/server/dist/modules/accounting/runtime/what-if.js +87 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-bridge.js +86 -5
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-controls.js +28 -2
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-metrics.js +15 -2
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-settings-router.js +21 -2
- package/server/dist/modules/agent-runtime/runtime/core-capabilities.js +55 -0
- package/server/dist/modules/agent-sessions/adapters/host-process.js +1 -1
- package/server/dist/modules/agent-sessions/domain/availability.js +16 -0
- package/server/dist/modules/agent-sessions/domain/protocol.js +8 -1
- package/server/dist/modules/agent-sessions/index.js +3 -1
- package/server/dist/modules/agent-sessions/runtime/core-sessions-availability.js +16 -0
- package/server/dist/modules/agents/runtime/agent-refine-manager.js +3 -1
- package/server/dist/modules/agents/runtime/agent-store.js +60 -73
- package/server/dist/modules/audit/adapters/http.js +66 -0
- package/server/dist/modules/audit/adapters/runtime.js +60 -0
- package/server/dist/modules/audit/adapters/sqlite.js +73 -0
- package/server/dist/modules/audit/application.js +190 -0
- package/server/dist/modules/audit/domain.js +434 -0
- package/server/dist/modules/audit/index.js +27 -0
- package/server/dist/modules/audit/ports.js +2 -0
- package/server/dist/modules/browser/runtime/browser-capture-manager.js +18 -141
- package/server/dist/modules/browser/runtime/browser-capture-types.js +1 -10
- package/server/dist/modules/browser/runtime/browser-playwright.js +0 -19
- package/server/dist/modules/code/runtime/file-provenance.js +23 -0
- package/server/dist/modules/conversations/runtime/chat-manager.js +5 -2
- package/server/dist/modules/delivery/adapters/decisions/chains.js +1 -0
- package/server/dist/modules/delivery/adapters/decisions/create.js +19 -1
- package/server/dist/modules/delivery/adapters/decisions/discard.js +2 -0
- package/server/dist/modules/delivery/adapters/decisions/local-changes.js +427 -0
- package/server/dist/modules/delivery/adapters/decisions/merge-local.js +80 -6
- package/server/dist/modules/delivery/adapters/decisions/observations.js +5 -0
- package/server/dist/modules/delivery/adapters/decisions/ownership.js +2 -1
- package/server/dist/modules/delivery/adapters/decisions/transitions.js +9 -0
- package/server/dist/modules/delivery/adapters/review-wip-store.js +37 -0
- package/server/dist/modules/delivery/domain/review-wip.js +71 -0
- package/server/dist/modules/delivery/index.js +9 -1
- package/server/dist/modules/delivery/runtime/delivery-changes.js +355 -0
- package/server/dist/modules/delivery/runtime/delivery-evidence.js +249 -8
- package/server/dist/modules/delivery/runtime/flow-review-legacy.js +99 -0
- package/server/dist/modules/delivery/runtime/flow-review-outcome.js +107 -0
- package/server/dist/modules/delivery/runtime/flow-worktree-handoff.js +32 -0
- package/server/dist/modules/delivery/runtime/flow-worktree-return.js +87 -0
- package/server/dist/modules/delivery/runtime/isolated-worktree.js +380 -0
- package/server/dist/modules/delivery/runtime/local-restore-branch.js +325 -0
- package/server/dist/modules/delivery/runtime/local-restore-resolver.js +48 -0
- package/server/dist/modules/delivery/runtime/local-stash.js +423 -0
- package/server/dist/modules/delivery/runtime/multi-repo-execution.js +27 -1
- package/server/dist/modules/delivery/runtime/phase3-harvest.js +40 -0
- package/server/dist/modules/delivery/runtime/pr-body.js +50 -0
- package/server/dist/modules/delivery/runtime/rail-isolated-launch.js +169 -166
- package/server/dist/modules/delivery/runtime/rail-launch-parser.js +5 -2
- package/server/dist/modules/delivery/runtime/rail-pr-decision.js +7 -1
- package/server/dist/modules/delivery/runtime/rail-pr-store.js +193 -12
- package/server/dist/modules/delivery/runtime/rails-router.js +267 -5
- package/server/dist/modules/delivery/runtime/review-brief.js +208 -0
- package/server/dist/modules/delivery/runtime/review-packet.js +41 -2
- package/server/dist/modules/delivery/runtime/review-wip-gate.js +67 -0
- package/server/dist/modules/delivery/runtime/run-records.js +267 -0
- package/server/dist/modules/delivery/runtime/run-review-diagnosis.js +102 -0
- package/server/dist/modules/execution/adapters/budget-storage.js +76 -0
- package/server/dist/modules/execution/application/enforce-budget.js +17 -2
- package/server/dist/modules/execution/domain/agent-env.js +98 -0
- package/server/dist/modules/execution/domain/daily-budget.js +36 -0
- package/server/dist/modules/execution/domain/spend-caps.js +166 -0
- package/server/dist/modules/execution/index.js +34 -1
- package/server/dist/modules/execution/runtime/budget-overview.js +76 -0
- package/server/dist/modules/execution/runtime/daily-budget-gate.js +86 -0
- package/server/dist/modules/execution/runtime/interactive-job-session.js +8 -0
- package/server/dist/modules/execution/runtime/launch-forecast.js +33 -0
- package/server/dist/modules/execution/runtime/queue-manager.js +54 -15
- package/server/dist/modules/execution/runtime/run-duration-stats.js +31 -13
- package/server/dist/modules/flow/adapters/bindings.js +1089 -0
- package/server/dist/modules/flow/adapters/http.js +147 -0
- package/server/dist/modules/flow/adapters/sqlite.js +121 -0
- package/server/dist/modules/flow/application.js +805 -0
- package/server/dist/modules/flow/domain.js +790 -0
- package/server/dist/modules/flow/index.js +34 -0
- package/server/dist/modules/flow/ports.js +2 -0
- package/server/dist/modules/inbox/adapters/http.js +21 -0
- package/server/dist/modules/inbox/adapters/project-source.js +233 -0
- package/server/dist/modules/inbox/application.js +28 -0
- package/server/dist/modules/inbox/domain.js +43 -0
- package/server/dist/modules/inbox/index.js +10 -0
- package/server/dist/modules/inbox/ports.js +2 -0
- package/server/dist/modules/loops/runtime/loop-definition-run.js +9 -0
- package/server/dist/modules/loops/runtime/loop-definition.js +5 -2
- package/server/dist/modules/loops/runtime/loop-executors.js +90 -9
- package/server/dist/modules/loops/runtime/loop-factory.js +30 -2
- package/server/dist/modules/loops/runtime/loop-flow-spec-recipe.js +166 -0
- package/server/dist/modules/loops/runtime/loop-graph.js +1 -1
- package/server/dist/modules/loops/runtime/loop-role-engines.js +4 -1
- package/server/dist/modules/loops/runtime/loop-run-manager.js +267 -10
- package/server/dist/modules/loops/runtime/loop-runs-store.js +21 -5
- package/server/dist/modules/loops/runtime/loop-templates.js +55 -12
- package/server/dist/modules/missions/runtime/agent-chat-manager.js +283 -20
- package/server/dist/modules/missions/runtime/agent-chat-router.js +96 -21
- package/server/dist/modules/missions/runtime/agent-failure-briefing.js +11 -3
- package/server/dist/modules/missions/runtime/agent-fence-promotion.js +9 -1
- package/server/dist/modules/missions/runtime/agent-flow-prompt.js +64 -0
- package/server/dist/modules/missions/runtime/agent-input-store.js +9 -4
- package/server/dist/modules/missions/runtime/agent-operator-prompt.js +100 -14
- package/server/dist/modules/missions/runtime/agent-session-store.js +88 -27
- package/server/dist/modules/missions/runtime/core-session-runner.js +89 -9
- package/server/dist/modules/missions/runtime/flow-turn-context.js +17 -0
- package/server/dist/modules/missions/runtime/mission-core-sessions.js +295 -55
- package/server/dist/modules/missions/runtime/mission-run-notify.js +2 -0
- package/server/dist/modules/missions/runtime/mission-session-projector.js +56 -19
- package/server/dist/modules/missions/runtime/mission-tool-policy.js +47 -0
- package/server/dist/modules/onboarding/adapters/http.js +78 -0
- package/server/dist/modules/onboarding/adapters/providers.js +41 -0
- package/server/dist/modules/onboarding/adapters/runtime.js +130 -0
- package/server/dist/modules/onboarding/application.js +133 -0
- package/server/dist/modules/onboarding/catalog.js +217 -0
- package/server/dist/modules/onboarding/domain.js +102 -0
- package/server/dist/modules/onboarding/index.js +20 -0
- package/server/dist/modules/onboarding/ports.js +2 -0
- package/server/dist/modules/project-rules/adapters/http.js +91 -0
- package/server/dist/modules/project-rules/domain.js +122 -0
- package/server/dist/modules/project-rules/runtime/rules-inventory-runs.js +97 -0
- package/server/dist/modules/project-rules/runtime/rules-store.js +109 -0
- package/server/dist/modules/project-settings/adapters/http.js +13 -0
- package/server/dist/modules/project-settings/adapters/sqlite.js +78 -8
- package/server/dist/modules/project-settings/domain.js +47 -1
- package/server/dist/modules/project-settings/index.js +7 -1
- package/server/dist/modules/recovery/adapters/sqlite.js +28 -0
- package/server/dist/modules/recovery/domain.js +162 -0
- package/server/dist/modules/recovery/index.js +16 -0
- package/server/dist/modules/specs/adapters/timeline-http.js +101 -0
- package/server/dist/modules/specs/domain/handoff-labels.js +371 -0
- package/server/dist/modules/specs/domain/handoff.js +260 -0
- package/server/dist/modules/specs/domain/non-goals.js +101 -0
- package/server/dist/modules/specs/domain/timeline.js +164 -0
- package/server/dist/modules/specs/domain/triage.js +320 -0
- package/server/dist/modules/specs/runtime/contract-refine-runner.js +3 -2
- package/server/dist/modules/specs/runtime/generated-spec-parser.js +75 -0
- package/server/dist/modules/specs/runtime/proposal-manager.js +4 -3
- package/server/dist/modules/specs/runtime/smash-runner.js +2 -1
- package/server/dist/modules/specs/runtime/spec-addenda.js +31 -0
- package/server/dist/modules/specs/runtime/spec-draft-parser.js +6 -1
- package/server/dist/modules/specs/runtime/spec-generation.js +431 -0
- package/server/dist/modules/specs/runtime/spec-handoff.js +103 -0
- package/server/dist/modules/specs/runtime/spec-history.js +376 -0
- package/server/dist/modules/specs/runtime/spec-launcher-manager.js +4 -3
- package/server/dist/modules/specs/runtime/spec-search.js +117 -0
- package/server/dist/modules/specs/runtime/ticket-store.js +47 -2
- package/server/dist/modules/specs/runtime/ticket-trash-service.js +62 -0
- package/server/dist/modules/specs/runtime/ticket-trash.js +193 -0
- package/server/dist/modules/specs/runtime/triage-runner.js +171 -0
- package/server/dist/modules/specs/runtime/triage.js +365 -0
- package/server/dist/modules/terminals/domain/app-urls.js +96 -0
- package/server/dist/modules/terminals/runtime/app-urls.js +77 -0
- package/server/dist/modules/terminals/runtime/background-process-service.js +25 -28
- package/server/dist/project-env.js +60 -0
- package/server/dist/project-git.js +65 -0
- package/server/dist/project-registry.js +264 -27
- package/server/dist/project-router-background-processes.js +27 -3
- package/server/dist/project-router-git.js +30 -0
- package/server/dist/project-router-helpers.js +5 -30
- package/server/dist/project-router-jobs.js +49 -1
- package/server/dist/project-router-loop-runs.js +72 -2
- package/server/dist/project-router-rules.js +54 -0
- package/server/dist/project-router-search.js +52 -0
- package/server/dist/project-router-settings.js +6 -0
- package/server/dist/project-router-setup.js +1 -1
- package/server/dist/project-router-spending.js +138 -0
- package/server/dist/project-router-tickets.js +246 -427
- package/server/dist/project-router.js +7 -0
- package/server/dist/providers/claude-adapter.js +25 -3
- package/server/dist/providers/codex-adapter.js +9 -1
- package/server/dist/providers/gemini-adapter.js +6 -1
- package/server/dist/providers/kimi-adapter.js +2 -0
- package/server/dist/providers/local-adapter.js +2 -0
- package/server/dist/providers/runtime.js +8 -0
- package/server/dist/schemas/agent-runtime.schema.json +3 -1
- package/server/dist/schemas/workflow-definition.schema.json +1 -0
- package/server/dist/setup-manager.js +19 -1
- package/server/dist/transient-children.js +25 -8
- package/server/dist/update-channel.js +21 -0
- package/server/dist/util/search-snippet.js +74 -0
- package/server/dist/worktree-manager.js +19 -8
- package/client/dist/assets/ActivityFeedPage-Dtp7EyHc.js +0 -1
- package/client/dist/assets/AgentBrowserCapture-CLqlEFw8.js +0 -1
- package/client/dist/assets/AgentModeAnalyticsPane-B8_hM3Tw.js +0 -2
- package/client/dist/assets/AgentModeCodePane-CNF8ZNjE.js +0 -2
- package/client/dist/assets/AgentModeJobsPane-CJpJbO9m.js +0 -1
- package/client/dist/assets/AgentsPage-BC8XSR79.js +0 -120
- package/client/dist/assets/AnalyticsPage-Cdv4jLtW.js +0 -1
- package/client/dist/assets/BarChart-BDMqVFJy.js +0 -55
- package/client/dist/assets/CodePage-DI1kegAr.js +0 -3
- package/client/dist/assets/DesktopAnalyticsPage-Bdp8E8U6.js +0 -1
- package/client/dist/assets/DocsDialog-Bm4RS7FX.js +0 -11
- package/client/dist/assets/DocsPage-DihYcU8r.js +0 -11
- package/client/dist/assets/ExportDropdown-Bb1lHx3r.js +0 -1
- package/client/dist/assets/IntegrationsPage-EAipiDWm.js +0 -1
- package/client/dist/assets/InteractiveJobComposer-BO6ASN-2.js +0 -19
- package/client/dist/assets/JobDetailModal-CuPYq7tP.js +0 -1
- package/client/dist/assets/JobDetailPage-BusMjJi9.js +0 -1
- package/client/dist/assets/JobsPage-C0QbsF2d.js +0 -1
- package/client/dist/assets/LoopBuilderPage-B7TlU4iS.js +0 -1
- package/client/dist/assets/LoopPreviewModal-BRWtXOD2.js +0 -1
- package/client/dist/assets/LoopsPage-C4q1DmCE.js +0 -2
- package/client/dist/assets/MinimizedChatsContext-DHfigjHS.js +0 -1
- package/client/dist/assets/PluginsPage-Z1JHSMdR.js +0 -2
- package/client/dist/assets/ProjectSettingsDialog-BUNj0tvN.js +0 -1
- package/client/dist/assets/RepositoryDeliveries-B4ybHOyB.js +0 -5
- package/client/dist/assets/ReviewPacketPage-hwfPNjyy.js +0 -4
- package/client/dist/assets/TemplatePreviewModal-V7FpMWuw.js +0 -1
- package/client/dist/assets/TicketDetailModalContext-Dkwo2cDs.js +0 -16
- package/client/dist/assets/Trans-BbFxRFtR.js +0 -1
- package/client/dist/assets/activity-B-rp4h_v.js +0 -1
- package/client/dist/assets/activity-C6kJpm9q.js +0 -1
- package/client/dist/assets/activity-CGx4kb_j.js +0 -1
- package/client/dist/assets/activity-CnoX2bH7.js +0 -1
- package/client/dist/assets/activity-DAyekdlt.js +0 -1
- package/client/dist/assets/activity-DCxtpT7j.js +0 -1
- package/client/dist/assets/activity-DiyjsgQV.js +0 -1
- package/client/dist/assets/activity-JzwRaWPD.js +0 -1
- package/client/dist/assets/addspec-BOvgmcgk.js +0 -1
- package/client/dist/assets/addspec-Clmyfn_R.js +0 -1
- package/client/dist/assets/addspec-CsNaBpHp.js +0 -1
- package/client/dist/assets/addspec-D2tvWmmV.js +0 -1
- package/client/dist/assets/addspec-D3nFwvD0.js +0 -1
- package/client/dist/assets/addspec-DVLEhK3w.js +0 -1
- package/client/dist/assets/addspec-DXbK-tb0.js +0 -1
- package/client/dist/assets/addspec-OHG8DFEn.js +0 -1
- package/client/dist/assets/agent-5bSixVzz.js +0 -1
- package/client/dist/assets/agent-BR4EHfhq.js +0 -1
- package/client/dist/assets/agent-C0IKkJP8.js +0 -1
- package/client/dist/assets/agent-C7li9ayC.js +0 -1
- package/client/dist/assets/agent-D0dRmEen.js +0 -1
- package/client/dist/assets/agent-DZVGHm7H.js +0 -1
- package/client/dist/assets/agent-Dip4h2YE.js +0 -1
- package/client/dist/assets/agent-Pp-P-n1p.js +0 -1
- package/client/dist/assets/agentRuntime-BxF81z52.js +0 -1
- package/client/dist/assets/agentRuntime-BxYS5V7u.js +0 -1
- package/client/dist/assets/agentRuntime-Dc9HG3BA.js +0 -1
- package/client/dist/assets/agents-B6ZsnARo.js +0 -1
- package/client/dist/assets/agents-BORdhe0K.js +0 -1
- package/client/dist/assets/agents-C6aq9Oqs.js +0 -1
- package/client/dist/assets/agents-Cbsc4bcX.js +0 -1
- package/client/dist/assets/agents-D0uYR6hq.js +0 -1
- package/client/dist/assets/agents-Doe1sHY5.js +0 -1
- package/client/dist/assets/agents-DyNi_I9m.js +0 -1
- package/client/dist/assets/agents-StKxiTg0.js +0 -1
- package/client/dist/assets/agentstudio-7cYCXn-L.js +0 -1
- package/client/dist/assets/agentstudio-BHWQh8G3.js +0 -1
- package/client/dist/assets/agentstudio-BjnWHyRs.js +0 -1
- package/client/dist/assets/agentstudio-BkV8vcK4.js +0 -1
- package/client/dist/assets/agentstudio-BzugqB_N.js +0 -1
- package/client/dist/assets/agentstudio-CWbp7KvH.js +0 -1
- package/client/dist/assets/agentstudio-DG6plf5o.js +0 -1
- package/client/dist/assets/agentstudio-DkZVF-Cc.js +0 -1
- package/client/dist/assets/analytics-B1DIQd4m.js +0 -1
- package/client/dist/assets/analytics-BAIZ9vE_.js +0 -1
- package/client/dist/assets/analytics-BTqgmgBd.js +0 -1
- package/client/dist/assets/analytics-BWynXPEm.js +0 -1
- package/client/dist/assets/analytics-DGcUsQ44.js +0 -1
- package/client/dist/assets/analytics-GnSnpJ4W.js +0 -1
- package/client/dist/assets/analytics-TWgYaoO0.js +0 -1
- package/client/dist/assets/analytics-kJy6Tuko.js +0 -1
- package/client/dist/assets/atom-one-dark-qiGhVQxg.js +0 -1
- package/client/dist/assets/builder-B9gorTnT.js +0 -1
- package/client/dist/assets/builder-Bvw5s3Mi.js +0 -1
- package/client/dist/assets/builder-CL5l4dU3.js +0 -1
- package/client/dist/assets/builder-CVDTVrQX.js +0 -1
- package/client/dist/assets/builder-CpS9liE9.js +0 -1
- package/client/dist/assets/builder-DNctIL9Q.js +0 -1
- package/client/dist/assets/builder-De2NxX6o.js +0 -1
- package/client/dist/assets/builder-DeYT7Y-m.js +0 -1
- package/client/dist/assets/button-4FS1ZDTp.js +0 -1
- package/client/dist/assets/chat-D_I7nU5K.js +0 -1
- package/client/dist/assets/chevron-up-6EFqEHBj.js +0 -1
- package/client/dist/assets/chunk-OB3PAWPO-B1EMk45A.js +0 -3
- package/client/dist/assets/clsx-CjueKrWZ.js +0 -1
- package/client/dist/assets/code-B37GRg9C.js +0 -1
- package/client/dist/assets/code-BBOEZbf9.js +0 -1
- package/client/dist/assets/code-BRm-jcyx.js +0 -1
- package/client/dist/assets/code-CF7w62CR.js +0 -1
- package/client/dist/assets/code-CLuvJt2r.js +0 -1
- package/client/dist/assets/code-D0RCm59f.js +0 -1
- package/client/dist/assets/code-DaZ-ZwCT.js +0 -1
- package/client/dist/assets/code-iIHkGaCL.js +0 -1
- package/client/dist/assets/commands-0XjAftla.js +0 -1
- package/client/dist/assets/commands-BAWSYHjQ.js +0 -1
- package/client/dist/assets/commands-BBwowgiE.js +0 -1
- package/client/dist/assets/commands-BacjIZLN.js +0 -1
- package/client/dist/assets/commands-Bs62IAZ3.js +0 -1
- package/client/dist/assets/commands-CLPdh-Hh.js +0 -1
- package/client/dist/assets/commands-DlbFzgrp.js +0 -1
- package/client/dist/assets/commands-LjPSsi5F.js +0 -1
- package/client/dist/assets/common-Bdi0qN4S.js +0 -1
- package/client/dist/assets/common-Bhb9zN1P.js +0 -1
- package/client/dist/assets/common-BykKlZg1.js +0 -1
- package/client/dist/assets/common-CvnNNSJA.js +0 -1
- package/client/dist/assets/common-D5zk_mqq.js +0 -1
- package/client/dist/assets/common-DQNO_al5.js +0 -1
- package/client/dist/assets/common-Dax30Vmp.js +0 -1
- package/client/dist/assets/common-DkllpVSb.js +0 -1
- package/client/dist/assets/core-B3mKBIh5.js +0 -1
- package/client/dist/assets/dashboard-B1ndRHuC.js +0 -1
- package/client/dist/assets/dashboard-BX7KXiqA.js +0 -1
- package/client/dist/assets/dashboard-B_BSNxcN.js +0 -1
- package/client/dist/assets/dashboard-CCeFN7-V.js +0 -1
- package/client/dist/assets/dashboard-CRl0WtFJ.js +0 -1
- package/client/dist/assets/dashboard-XGdQ5mjw.js +0 -1
- package/client/dist/assets/dashboard-_oltA6Jd.js +0 -1
- package/client/dist/assets/dashboard-bAuf5KVk.js +0 -1
- package/client/dist/assets/dialog-DtdR05v1.js +0 -45
- package/client/dist/assets/dist-js-CJ_2XX1Y.js +0 -1
- package/client/dist/assets/event-Bt7f3wXe.js +0 -1
- package/client/dist/assets/explore-BG99VGpL.js +0 -1
- package/client/dist/assets/explore-C0TjprJW.js +0 -1
- package/client/dist/assets/explore-C2dgEo7q.js +0 -1
- package/client/dist/assets/explore-C8NDHbob.js +0 -1
- package/client/dist/assets/explore-CWWgzQGR.js +0 -1
- package/client/dist/assets/explore-CcQXpdtS.js +0 -1
- package/client/dist/assets/explore-DgBACn39.js +0 -1
- package/client/dist/assets/explore-DsXAgnmJ.js +0 -1
- package/client/dist/assets/file-text-C0blZHLh.js +0 -1
- package/client/dist/assets/formatDistanceToNow-NjPHBLfB.js +0 -1
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-vJ7qUoqN.js +0 -1
- package/client/dist/assets/git-branch-yf6LE1Bw.js +0 -1
- package/client/dist/assets/index-BgbCbIua.css +0 -2
- package/client/dist/assets/index-Ce4yZtKf.js +0 -83
- package/client/dist/assets/integrations-BkpRUbvp.js +0 -1
- package/client/dist/assets/integrations-Bo8qbJf4.js +0 -1
- package/client/dist/assets/integrations-CmSrKzZb.js +0 -1
- package/client/dist/assets/integrations-DGtq26Rr.js +0 -1
- package/client/dist/assets/integrations-De38GFnQ.js +0 -1
- package/client/dist/assets/integrations-Dw6zdtb-.js +0 -1
- package/client/dist/assets/integrations-Dwl9KQp0.js +0 -1
- package/client/dist/assets/integrations-Refg_d2I.js +0 -1
- package/client/dist/assets/jira-B6OYw4CJ.js +0 -1
- package/client/dist/assets/jira-BTF6RaOe.js +0 -1
- package/client/dist/assets/jira-CEetIB2q.js +0 -1
- package/client/dist/assets/jira-CIzsZLw5.js +0 -1
- package/client/dist/assets/jira-Daw9tmpI.js +0 -1
- package/client/dist/assets/jira-FXr7u2lh.js +0 -1
- package/client/dist/assets/jira-LaNQn7yl.js +0 -1
- package/client/dist/assets/jira-api-Cabj-H0J.js +0 -1
- package/client/dist/assets/job-time-BCL7wee9.js +0 -1
- package/client/dist/assets/jobs-ARwD85B9.js +0 -1
- package/client/dist/assets/jobs-BMF1w4WT.js +0 -1
- package/client/dist/assets/jobs-CBfzGLwm.js +0 -1
- package/client/dist/assets/jobs-CPjiluBY.js +0 -1
- package/client/dist/assets/jobs-CQQd58pY.js +0 -1
- package/client/dist/assets/jobs-De3EqaO0.js +0 -1
- package/client/dist/assets/jobs-Du9-Ei9a.js +0 -1
- package/client/dist/assets/jobs-qMHbnxwC.js +0 -1
- package/client/dist/assets/layers-BCLTgHXO.js +0 -1
- package/client/dist/assets/loader-circle-BqV9xYGf.js +0 -1
- package/client/dist/assets/loop-layout-CyXj9223.js +0 -7
- package/client/dist/assets/loops-B2PhQLKR.js +0 -1
- package/client/dist/assets/loops-BqbF46st.js +0 -1
- package/client/dist/assets/loops-CINnHbfI.js +0 -1
- package/client/dist/assets/loops-D-3XhH04.js +0 -1
- package/client/dist/assets/loops-DKkEEjZ_.js +0 -1
- package/client/dist/assets/loops-DzWR5-v6.js +0 -1
- package/client/dist/assets/loops-WyWDkhok.js +0 -1
- package/client/dist/assets/loops-scD5fIBf.js +0 -1
- package/client/dist/assets/mcp-6rMoZfEO.js +0 -1
- package/client/dist/assets/mcp-BD8sL5mP.js +0 -1
- package/client/dist/assets/mcp-BkcA3I5s.js +0 -1
- package/client/dist/assets/mcp-CCpSelOh.js +0 -1
- package/client/dist/assets/mcp-CUAN6ORK.js +0 -1
- package/client/dist/assets/mcp-CqbRxRTE.js +0 -1
- package/client/dist/assets/mcp-DP2YfVhO.js +0 -1
- package/client/dist/assets/mcp-DUVQamDz.js +0 -1
- package/client/dist/assets/narration-BEKMVxGm.js +0 -1
- package/client/dist/assets/narration-CjLwGKap.js +0 -1
- package/client/dist/assets/narration-DANWuGsW.js +0 -1
- package/client/dist/assets/narration-DGeEDWiT.js +0 -1
- package/client/dist/assets/narration-DJgpGwIP.js +0 -1
- package/client/dist/assets/narration-DbHnz0qV.js +0 -1
- package/client/dist/assets/narration-bZSsTZG8.js +0 -1
- package/client/dist/assets/narration-i6aKJKEc.js +0 -1
- package/client/dist/assets/nav--u7iPYlS.js +0 -1
- package/client/dist/assets/nav-C5Jgfaby.js +0 -1
- package/client/dist/assets/nav-CAna_Wpt.js +0 -1
- package/client/dist/assets/nav-CCLqeyHo.js +0 -1
- package/client/dist/assets/nav-Cf3c90Jk.js +0 -1
- package/client/dist/assets/nav-DMYQaQjR.js +0 -1
- package/client/dist/assets/nav-Df_PkZ9F.js +0 -1
- package/client/dist/assets/nav-VyNGBJwj.js +0 -1
- package/client/dist/assets/packet-8nn9RsU7.js +0 -1
- package/client/dist/assets/packet-B0H15elv.js +0 -1
- package/client/dist/assets/packet-BQvBgrwh.js +0 -1
- package/client/dist/assets/packet-BR7mO0-a.js +0 -1
- package/client/dist/assets/packet-BgcQ6q_K.js +0 -1
- package/client/dist/assets/packet-D2s92Jnn.js +0 -1
- package/client/dist/assets/packet-YbtcD1HS.js +0 -1
- package/client/dist/assets/packet-c0Qj_9eX.js +0 -1
- package/client/dist/assets/project-repositories-Cnnuj9Ia.js +0 -1
- package/client/dist/assets/rotate-ccw-DalJAQQX.js +0 -1
- package/client/dist/assets/settings-B1NV8Ow9.js +0 -1
- package/client/dist/assets/settings-BQ8XFZeE.js +0 -1
- package/client/dist/assets/settings-BRkxfBbO.js +0 -1
- package/client/dist/assets/settings-C_CcU1dP.js +0 -1
- package/client/dist/assets/settings-Cto9n0eL.js +0 -1
- package/client/dist/assets/settings-Pyw8uYtL.js +0 -1
- package/client/dist/assets/settings-b3HVCNNd.js +0 -1
- package/client/dist/assets/settings-hdive4u6.js +0 -1
- package/client/dist/assets/setup-Be485n2u.js +0 -1
- package/client/dist/assets/setup-CKGUxKr-.js +0 -1
- package/client/dist/assets/setup-Ck1Uwd7_.js +0 -1
- package/client/dist/assets/setup-Cm774a6v.js +0 -1
- package/client/dist/assets/setup-DIqMQpxt.js +0 -1
- package/client/dist/assets/setup-DfCsoNFL.js +0 -1
- package/client/dist/assets/setup-DkeE8mP0.js +0 -1
- package/client/dist/assets/setup-xVntVaz1.js +0 -1
- package/client/dist/assets/specs-Bqvtz2kz.js +0 -1
- package/client/dist/assets/specs-CKes-kz6.js +0 -1
- package/client/dist/assets/specs-CfXxPDNB.js +0 -1
- package/client/dist/assets/specs-CyF9HuTI.js +0 -1
- package/client/dist/assets/specs-DMj035Mt.js +0 -1
- package/client/dist/assets/specs-DfIdoU5L.js +0 -1
- package/client/dist/assets/specs-j5pGLQeU.js +0 -1
- package/client/dist/assets/specs-xW5pkkB7.js +0 -1
- package/client/dist/assets/spending-CQnrWiR3.js +0 -1
- package/client/dist/assets/square-D0JTbRSR.js +0 -1
- package/client/dist/assets/tauri-shell-DE6LfGPw.js +0 -2
- package/client/dist/assets/terminal-BAzpHtpY.js +0 -1
- package/client/dist/assets/terminal-C7dHeR3x.js +0 -1
- package/client/dist/assets/terminal-CMla5Qsz.js +0 -1
- package/client/dist/assets/terminal-CdNXH-n9.js +0 -1
- package/client/dist/assets/terminal-Cw5bZsmV.js +0 -1
- package/client/dist/assets/terminal-DFUP4eNv.js +0 -1
- package/client/dist/assets/terminal-DGqljeK_.js +0 -1
- package/client/dist/assets/terminal-cU70NodO.js +0 -1
- package/client/dist/assets/tickets--tiSOCcn.js +0 -1
- package/client/dist/assets/tickets-BUJ3DMWU.js +0 -1
- package/client/dist/assets/tickets-C1WNPODq.js +0 -1
- package/client/dist/assets/tickets-CDjhWmiE.js +0 -1
- package/client/dist/assets/tickets-CLgPC3uO.js +0 -1
- package/client/dist/assets/tickets-D41ZMQpf.js +0 -1
- package/client/dist/assets/tickets-DEaQC06P.js +0 -1
- package/client/dist/assets/tickets-kcMzbLCp.js +0 -1
- package/client/dist/assets/trash-D8zYUmTg.js +0 -1
- package/client/dist/assets/useDesktop-BjLT0_EE.js +0 -1
- package/client/dist/assets/useRuntimeRuns-C97qEqMg.js +0 -1
- package/client/dist/assets/useSharedWebSocket-Bj4LMp7b.js +0 -2
- package/client/dist/assets/utils-BC4DHlz2.js +0 -1
- package/docs/guide/en/getting-started/4-the-dashboard-tour.md +0 -48
- package/docs/guide/es/getting-started/4-the-dashboard-tour.md +0 -48
- package/server/dist/mobile/mobile-preview-channel.js +0 -179
- package/server/dist/mobile/mobile-preview.js +0 -366
- package/server/dist/modules/browser/domain/preview-origins.js +0 -117
- package/server/dist/modules/browser/runtime/preview-targets.js +0 -80
- /package/client/dist/assets/{atom-one-dark-B-oHczHB.css → DocView-B-oHczHB.css} +0 -0
- /package/docs/guide/de/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/en/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/es/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/fr/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/it/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/ja/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/pt/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/zh/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.transition = exports.resolveFlowRepository = exports.placeholderTitle = exports.isTerminalFlow = exports.isOpenFlow = exports.nextFlowCoreSessionId = exports.flowCoreSessionId = exports.summarizeSettlement = exports.nextDueEffect = exports.flowJiraCreateKey = exports.flowEffectKey = exports.extractFlowDecisions = exports.buildSpecRewriteText = exports.firstErrorLine = exports.buildReturnBriefing = exports.buildFlowSummary = exports.OPEN_FLOW_STATES = exports.FLOW_SUMMARY_LIMIT_BYTES = exports.FLOW_SPEC_LOOP_ID = exports.FLOW_SETTLEMENT_ORDER = exports.FlowValidationError = exports.FlowUnavailableError = exports.FlowTransitionError = exports.FlowNotFoundError = exports.FlowLaunchRejectedError = exports.FlowConflictError = exports.createFlowService = void 0;
|
|
4
|
+
// Public application API of the Flow module. Adapters (SQLite, HTTP, port
|
|
5
|
+
// bindings) are wired only at composition roots through their subpaths.
|
|
6
|
+
var application_1 = require("./application");
|
|
7
|
+
Object.defineProperty(exports, "createFlowService", { enumerable: true, get: function () { return application_1.createFlowService; } });
|
|
8
|
+
var domain_1 = require("./domain");
|
|
9
|
+
Object.defineProperty(exports, "FlowConflictError", { enumerable: true, get: function () { return domain_1.FlowConflictError; } });
|
|
10
|
+
Object.defineProperty(exports, "FlowLaunchRejectedError", { enumerable: true, get: function () { return domain_1.FlowLaunchRejectedError; } });
|
|
11
|
+
Object.defineProperty(exports, "FlowNotFoundError", { enumerable: true, get: function () { return domain_1.FlowNotFoundError; } });
|
|
12
|
+
Object.defineProperty(exports, "FlowTransitionError", { enumerable: true, get: function () { return domain_1.FlowTransitionError; } });
|
|
13
|
+
Object.defineProperty(exports, "FlowUnavailableError", { enumerable: true, get: function () { return domain_1.FlowUnavailableError; } });
|
|
14
|
+
Object.defineProperty(exports, "FlowValidationError", { enumerable: true, get: function () { return domain_1.FlowValidationError; } });
|
|
15
|
+
Object.defineProperty(exports, "FLOW_SETTLEMENT_ORDER", { enumerable: true, get: function () { return domain_1.FLOW_SETTLEMENT_ORDER; } });
|
|
16
|
+
Object.defineProperty(exports, "FLOW_SPEC_LOOP_ID", { enumerable: true, get: function () { return domain_1.FLOW_SPEC_LOOP_ID; } });
|
|
17
|
+
Object.defineProperty(exports, "FLOW_SUMMARY_LIMIT_BYTES", { enumerable: true, get: function () { return domain_1.FLOW_SUMMARY_LIMIT_BYTES; } });
|
|
18
|
+
Object.defineProperty(exports, "OPEN_FLOW_STATES", { enumerable: true, get: function () { return domain_1.OPEN_FLOW_STATES; } });
|
|
19
|
+
Object.defineProperty(exports, "buildFlowSummary", { enumerable: true, get: function () { return domain_1.buildFlowSummary; } });
|
|
20
|
+
Object.defineProperty(exports, "buildReturnBriefing", { enumerable: true, get: function () { return domain_1.buildReturnBriefing; } });
|
|
21
|
+
Object.defineProperty(exports, "firstErrorLine", { enumerable: true, get: function () { return domain_1.firstErrorLine; } });
|
|
22
|
+
Object.defineProperty(exports, "buildSpecRewriteText", { enumerable: true, get: function () { return domain_1.buildSpecRewriteText; } });
|
|
23
|
+
Object.defineProperty(exports, "extractFlowDecisions", { enumerable: true, get: function () { return domain_1.extractFlowDecisions; } });
|
|
24
|
+
Object.defineProperty(exports, "flowEffectKey", { enumerable: true, get: function () { return domain_1.flowEffectKey; } });
|
|
25
|
+
Object.defineProperty(exports, "flowJiraCreateKey", { enumerable: true, get: function () { return domain_1.flowJiraCreateKey; } });
|
|
26
|
+
Object.defineProperty(exports, "nextDueEffect", { enumerable: true, get: function () { return domain_1.nextDueEffect; } });
|
|
27
|
+
Object.defineProperty(exports, "summarizeSettlement", { enumerable: true, get: function () { return domain_1.summarizeSettlement; } });
|
|
28
|
+
Object.defineProperty(exports, "flowCoreSessionId", { enumerable: true, get: function () { return domain_1.flowCoreSessionId; } });
|
|
29
|
+
Object.defineProperty(exports, "nextFlowCoreSessionId", { enumerable: true, get: function () { return domain_1.nextFlowCoreSessionId; } });
|
|
30
|
+
Object.defineProperty(exports, "isOpenFlow", { enumerable: true, get: function () { return domain_1.isOpenFlow; } });
|
|
31
|
+
Object.defineProperty(exports, "isTerminalFlow", { enumerable: true, get: function () { return domain_1.isTerminalFlow; } });
|
|
32
|
+
Object.defineProperty(exports, "placeholderTitle", { enumerable: true, get: function () { return domain_1.placeholderTitle; } });
|
|
33
|
+
Object.defineProperty(exports, "resolveFlowRepository", { enumerable: true, get: function () { return domain_1.resolveFlowRepository; } });
|
|
34
|
+
Object.defineProperty(exports, "transition", { enumerable: true, get: function () { return domain_1.transition; } });
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerInboxRoutes = registerInboxRoutes;
|
|
4
|
+
const application_1 = require("../application");
|
|
5
|
+
const project_source_1 = require("./project-source");
|
|
6
|
+
/**
|
|
7
|
+
* GET /api/inbox — the "Needs you" read-model across projects. Each registered
|
|
8
|
+
* project is read through its own context and database; nothing is cached or
|
|
9
|
+
* shared between projects, and the response is a pure projection.
|
|
10
|
+
*/
|
|
11
|
+
function registerInboxRoutes(router, registry) {
|
|
12
|
+
router.get('/inbox', (_req, res) => {
|
|
13
|
+
// An app-wide cap belongs to no project: the first project speaks for it so it appears once.
|
|
14
|
+
const sources = registry.listContexts().map((ctx, index) => (0, project_source_1.createProjectInboxSource)({
|
|
15
|
+
project: { id: ctx.project.id, name: ctx.project.name },
|
|
16
|
+
db: ctx.db,
|
|
17
|
+
caps: () => (ctx.budgetCaps?.() ?? []).filter((cap) => cap.scope === 'project' || index === 0),
|
|
18
|
+
}));
|
|
19
|
+
res.json((0, application_1.collectInbox)(sources));
|
|
20
|
+
});
|
|
21
|
+
}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FAILED_RUN_WINDOW_MS = void 0;
|
|
4
|
+
exports.createProjectInboxSource = createProjectInboxSource;
|
|
5
|
+
const jira_db_1 = require("../../../jira/jira-db");
|
|
6
|
+
const rail_pr_store_1 = require("../../delivery/runtime/rail-pr-store");
|
|
7
|
+
const sqlite_1 = require("../../recovery/adapters/sqlite");
|
|
8
|
+
const domain_1 = require("../domain");
|
|
9
|
+
/** Finished runs older than this are history, not something that waits for the person. */
|
|
10
|
+
exports.FAILED_RUN_WINDOW_MS = 3 * 24 * 60 * 60 * 1000;
|
|
11
|
+
const MAX_DEAD_JIRA_OPS = 20;
|
|
12
|
+
function parseJsonArray(raw) {
|
|
13
|
+
if (!raw)
|
|
14
|
+
return [];
|
|
15
|
+
try {
|
|
16
|
+
const parsed = JSON.parse(raw);
|
|
17
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function deliveryTitle(row) {
|
|
24
|
+
const specs = (0, rail_pr_store_1.readSpecSnapshot)(row.spec_snapshot) ?? [];
|
|
25
|
+
const first = specs.find((s) => s.title)?.title;
|
|
26
|
+
if (first)
|
|
27
|
+
return specs.length > 1 ? `${first} +${specs.length - 1}` : first;
|
|
28
|
+
return row.loop_name || row.rail_key;
|
|
29
|
+
}
|
|
30
|
+
function ticketLabel(raw) {
|
|
31
|
+
const ids = parseJsonArray(raw).filter((v) => typeof v === 'number');
|
|
32
|
+
if (ids.length === 0)
|
|
33
|
+
return '';
|
|
34
|
+
return ` · ${ids.slice(0, 3).map((id) => `#${id}`).join(', ')}${ids.length > 3 ? ` +${ids.length - 3}` : ''}`;
|
|
35
|
+
}
|
|
36
|
+
/** Provider limits and environment problems wait for the person; they are not defects of the change. */
|
|
37
|
+
function needsHost(diagnosis) {
|
|
38
|
+
return diagnosis?.confidence === 'high' && (diagnosis.kind === 'provider_limit' || diagnosis.kind === 'environment');
|
|
39
|
+
}
|
|
40
|
+
function deliveryDiagnosis(handle, row) {
|
|
41
|
+
const runIds = parseJsonArray(row.run_ids).filter((v) => typeof v === 'string');
|
|
42
|
+
for (const runId of [...runIds].reverse()) {
|
|
43
|
+
try {
|
|
44
|
+
const diagnosis = (0, sqlite_1.readRunDiagnosis)(handle.db, runId);
|
|
45
|
+
if (diagnosis)
|
|
46
|
+
return diagnosis;
|
|
47
|
+
}
|
|
48
|
+
catch { /* the delivery still shows without a diagnosis */ }
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
/** Deliveries that wait for a decision or ended badly, mirroring the client's `deliveryAttention`. */
|
|
53
|
+
function deliveryItems(handle, rows, nowIso) {
|
|
54
|
+
const out = [];
|
|
55
|
+
for (const row of rows) {
|
|
56
|
+
const decision = row.decision;
|
|
57
|
+
const changesRequested = decision === 'implementation_failed' && row.status_code === 'review_changes_requested';
|
|
58
|
+
const waiting = decision === 'on_review' || decision === 'pr_draft' || decision === 'pr_ready' || changesRequested;
|
|
59
|
+
const failed = !changesRequested && (decision === 'implementation_failed' || decision === 'pr_failed');
|
|
60
|
+
if (!waiting && !failed)
|
|
61
|
+
continue;
|
|
62
|
+
// A failed delivery is explained by its last run's diagnosis.
|
|
63
|
+
const diagnosis = failed ? deliveryDiagnosis(handle, row) : null;
|
|
64
|
+
const kind = waiting ? 'review' : needsHost(diagnosis) ? 'blocked' : 'failed';
|
|
65
|
+
out.push({
|
|
66
|
+
id: (0, domain_1.inboxItemId)(handle.project.id, kind, row.id),
|
|
67
|
+
projectId: handle.project.id,
|
|
68
|
+
projectName: handle.project.name,
|
|
69
|
+
kind,
|
|
70
|
+
title: deliveryTitle(row),
|
|
71
|
+
detail: (0, domain_1.oneLine)(row.status_detail) ?? (failed ? (0, domain_1.oneLine)(diagnosis?.detail) ?? row.status_code : null),
|
|
72
|
+
diagnosis,
|
|
73
|
+
at: (0, domain_1.toIso)((waiting ? row.on_review_at : null) ?? row.updated_at, nowIso),
|
|
74
|
+
version: `${decision}:${row.status_code ?? ''}:${row.pr_state}`,
|
|
75
|
+
action: 'open-review',
|
|
76
|
+
subjectId: row.id,
|
|
77
|
+
conversationId: row.origin_conversation_id,
|
|
78
|
+
decision,
|
|
79
|
+
...(Number.isInteger(row.rail_index) ? { railIndex: row.rail_index } : {}),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Runs that stopped on something the person must resolve: paused on a budget or
|
|
86
|
+
* a human decision, interrupted by a restart, blocked, or ended badly (and not
|
|
87
|
+
* superseded by a later run of the same loop on the same rail). Runs a
|
|
88
|
+
* delivery already represents are left to the delivery.
|
|
89
|
+
*/
|
|
90
|
+
function runItems(handle, representedRunIds, nowIso, nowMs) {
|
|
91
|
+
const since = new Date(nowMs - exports.FAILED_RUN_WINDOW_MS).toISOString();
|
|
92
|
+
const rows = handle.db.prepare(`
|
|
93
|
+
SELECT r.id, r.loop_name, r.status, r.final_outcome, r.restart_reason, r.started_at, r.finished_at, r.ticket_ids_json, r.rail_index, r.failure_diagnosis
|
|
94
|
+
FROM loop_runs r
|
|
95
|
+
WHERE r.project_id = ?
|
|
96
|
+
AND NOT EXISTS (SELECT 1 FROM definition_fork_operations f WHERE f.source_run_id = r.id AND f.adopted = 1)
|
|
97
|
+
AND (
|
|
98
|
+
(r.status = 'paused' AND COALESCE(r.restart_reason, '') != 'fork')
|
|
99
|
+
OR (r.status = 'completed' AND r.final_outcome IN ('failed','blocked','stalled') AND r.finished_at >= ?
|
|
100
|
+
AND NOT EXISTS (
|
|
101
|
+
SELECT 1 FROM loop_runs n
|
|
102
|
+
WHERE n.project_id = r.project_id AND n.loop_id = r.loop_id
|
|
103
|
+
AND COALESCE(n.rail_index, -1) = COALESCE(r.rail_index, -1)
|
|
104
|
+
AND n.started_at > r.started_at))
|
|
105
|
+
)
|
|
106
|
+
ORDER BY r.started_at DESC
|
|
107
|
+
LIMIT 100
|
|
108
|
+
`).all(handle.project.id, since);
|
|
109
|
+
const out = [];
|
|
110
|
+
for (const run of rows) {
|
|
111
|
+
if (representedRunIds.has(run.id))
|
|
112
|
+
continue;
|
|
113
|
+
const title = `${run.loop_name || 'Run'}${ticketLabel(run.ticket_ids_json)}`;
|
|
114
|
+
const version = `${run.status}:${run.final_outcome ?? ''}:${run.restart_reason ?? ''}`;
|
|
115
|
+
const base = {
|
|
116
|
+
projectId: handle.project.id,
|
|
117
|
+
projectName: handle.project.name,
|
|
118
|
+
title,
|
|
119
|
+
version,
|
|
120
|
+
subjectId: run.id,
|
|
121
|
+
conversationId: null,
|
|
122
|
+
diagnosis: null,
|
|
123
|
+
...(typeof run.rail_index === 'number' ? { railIndex: run.rail_index } : {}),
|
|
124
|
+
};
|
|
125
|
+
if (run.status === 'paused') {
|
|
126
|
+
if (run.restart_reason === 'budget_paused') {
|
|
127
|
+
out.push({ ...base, id: (0, domain_1.inboxItemId)(handle.project.id, 'budget', run.id), kind: 'budget', detail: null, at: (0, domain_1.toIso)(run.started_at, nowIso), action: 'resume-run' });
|
|
128
|
+
}
|
|
129
|
+
else if (run.restart_reason === 'restart') {
|
|
130
|
+
out.push({ ...base, id: (0, domain_1.inboxItemId)(handle.project.id, 'blocked', run.id), kind: 'blocked', detail: 'interrupted', at: (0, domain_1.toIso)(run.started_at, nowIso), action: 'resume-run' });
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
out.push({ ...base, id: (0, domain_1.inboxItemId)(handle.project.id, 'question', run.id), kind: 'question', detail: null, at: (0, domain_1.toIso)(run.started_at, nowIso), action: 'open-run' });
|
|
134
|
+
}
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const diagnosis = (0, sqlite_1.readRunDiagnosis)(handle.db, run.id);
|
|
138
|
+
const kind = run.final_outcome === 'blocked' || needsHost(diagnosis) ? 'blocked' : 'failed';
|
|
139
|
+
// The version moves with the cause, so a run re-diagnosed differently comes back.
|
|
140
|
+
out.push({
|
|
141
|
+
...base, id: (0, domain_1.inboxItemId)(handle.project.id, kind, run.id), kind, diagnosis,
|
|
142
|
+
version: `${version}:${diagnosis?.kind ?? ''}:${diagnosis?.confidence ?? ''}`,
|
|
143
|
+
detail: (0, domain_1.oneLine)(diagnosis?.detail) ?? run.final_outcome, at: (0, domain_1.toIso)(run.finished_at, nowIso), action: 'open-run',
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return out;
|
|
147
|
+
}
|
|
148
|
+
function jiraItems(handle, nowIso) {
|
|
149
|
+
return (0, jira_db_1.listOutbox)(handle.db, { state: 'dead', limit: MAX_DEAD_JIRA_OPS }).map((op) => {
|
|
150
|
+
const key = (0, jira_db_1.getLinkByIssueId)(handle.db, op.jiraIssueId)?.jiraKey ?? op.jiraIssueId;
|
|
151
|
+
return {
|
|
152
|
+
id: (0, domain_1.inboxItemId)(handle.project.id, 'jira', String(op.id)),
|
|
153
|
+
projectId: handle.project.id,
|
|
154
|
+
projectName: handle.project.name,
|
|
155
|
+
kind: 'jira',
|
|
156
|
+
title: `${key} · ${op.opType}`,
|
|
157
|
+
detail: (0, domain_1.oneLine)(op.deadReason ?? op.lastError),
|
|
158
|
+
at: (0, domain_1.toIso)(op.updatedAt, nowIso),
|
|
159
|
+
version: `dead:${op.attempts}:${op.updatedAt}`,
|
|
160
|
+
action: 'retry-jira',
|
|
161
|
+
subjectId: String(op.id),
|
|
162
|
+
conversationId: null,
|
|
163
|
+
diagnosis: null,
|
|
164
|
+
};
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* A spend cap that is reached right now (daily, weekly or monthly; project or
|
|
169
|
+
* app-wide). The item stays while the cap is exhausted and leaves on its own
|
|
170
|
+
* once it is raised or the period rolls over; its version includes both, so a
|
|
171
|
+
* dismissal never hides the next period's crossing.
|
|
172
|
+
*/
|
|
173
|
+
function capItems(handle, nowIso) {
|
|
174
|
+
const caps = handle.caps?.() ?? [];
|
|
175
|
+
return caps.filter((cap) => cap.exhausted).map((cap) => ({
|
|
176
|
+
id: (0, domain_1.inboxItemId)(handle.project.id, 'budget', `cap-${cap.scope}-${cap.period}`),
|
|
177
|
+
projectId: handle.project.id,
|
|
178
|
+
projectName: handle.project.name,
|
|
179
|
+
kind: 'budget',
|
|
180
|
+
title: `${cap.scope === 'project' ? 'Project' : 'App-wide'} ${cap.period === 'day' ? 'daily' : cap.period === 'week' ? 'weekly' : 'monthly'} budget reached`,
|
|
181
|
+
detail: null,
|
|
182
|
+
at: nowIso,
|
|
183
|
+
version: `cap:${cap.budgetUsd}:${cap.resetsAt}`,
|
|
184
|
+
action: 'raise-cap',
|
|
185
|
+
subjectId: `${cap.scope}:${cap.period}`,
|
|
186
|
+
conversationId: null,
|
|
187
|
+
diagnosis: null,
|
|
188
|
+
cap: { scope: cap.scope, period: cap.period, budgetUsd: cap.budgetUsd, spentUsd: cap.spentUsd, resetsAt: cap.resetsAt },
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
/** Run ids that recent deliveries already account for (the delivery speaks for them). */
|
|
192
|
+
function representedRuns(db) {
|
|
193
|
+
const ids = new Set();
|
|
194
|
+
const rows = db.prepare(`SELECT run_ids FROM rail_pr_deliveries WHERE run_ids != '[]' ORDER BY created_at DESC LIMIT 500`).all();
|
|
195
|
+
for (const row of rows)
|
|
196
|
+
for (const id of parseJsonArray(row.run_ids))
|
|
197
|
+
if (typeof id === 'string')
|
|
198
|
+
ids.add(id);
|
|
199
|
+
return ids;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Bind the inbox sources to ONE project's own database. Each source is
|
|
203
|
+
* isolated: a missing table or a corrupt row costs that source, not the rest.
|
|
204
|
+
*/
|
|
205
|
+
function createProjectInboxSource(handle, now = Date.now) {
|
|
206
|
+
return {
|
|
207
|
+
projectId: handle.project.id,
|
|
208
|
+
projectName: handle.project.name,
|
|
209
|
+
collect() {
|
|
210
|
+
const nowMs = now();
|
|
211
|
+
const nowIso = new Date(nowMs).toISOString();
|
|
212
|
+
const items = [];
|
|
213
|
+
const guard = (label, fn) => {
|
|
214
|
+
try {
|
|
215
|
+
items.push(...fn());
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
console.warn(`[inbox] ${handle.project.id} ${label} unavailable:`, err instanceof Error ? err.message : err);
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
let represented = new Set();
|
|
222
|
+
guard('deliveries', () => deliveryItems(handle, (0, rail_pr_store_1.listActivePrDeliveries)(handle.db), nowIso));
|
|
223
|
+
try {
|
|
224
|
+
represented = representedRuns(handle.db);
|
|
225
|
+
}
|
|
226
|
+
catch { /* runs then show without a delivery link */ }
|
|
227
|
+
guard('runs', () => runItems(handle, represented, nowIso, nowMs));
|
|
228
|
+
guard('jira', () => jiraItems(handle, nowIso));
|
|
229
|
+
guard('caps', () => capItems(handle, nowIso));
|
|
230
|
+
return items;
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.collectInbox = collectInbox;
|
|
4
|
+
const domain_1 = require("./domain");
|
|
5
|
+
/**
|
|
6
|
+
* Project the inbox: ask each project's own source, isolate failures (one
|
|
7
|
+
* broken project never hides the others), cap each project and order newest
|
|
8
|
+
* first. Nothing is cached; every call reads current state.
|
|
9
|
+
*/
|
|
10
|
+
function collectInbox(sources, now = () => new Date()) {
|
|
11
|
+
const items = [];
|
|
12
|
+
const projects = [];
|
|
13
|
+
for (const source of sources) {
|
|
14
|
+
let own = [];
|
|
15
|
+
try {
|
|
16
|
+
own = source.collect();
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
console.warn(`[inbox] ${source.projectId} unavailable (skipped):`, err instanceof Error ? err.message : err);
|
|
20
|
+
}
|
|
21
|
+
// A source can only speak for its own project.
|
|
22
|
+
const scoped = own.filter((item) => item.projectId === source.projectId).sort(domain_1.compareInboxItems).slice(0, domain_1.MAX_ITEMS_PER_PROJECT);
|
|
23
|
+
items.push(...scoped);
|
|
24
|
+
projects.push({ projectId: source.projectId, projectName: source.projectName, count: scoped.length });
|
|
25
|
+
}
|
|
26
|
+
items.sort(domain_1.compareInboxItems);
|
|
27
|
+
return { items, projects, generatedAt: now().toISOString() };
|
|
28
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* "Needs you" inbox: pure vocabulary. The inbox is a read-model projected from
|
|
4
|
+
* state other capabilities already own (deliveries, loop runs, the Jira
|
|
5
|
+
* outbox); it has no store of its own. Dismissal (Snooze / Done) is a
|
|
6
|
+
* per-viewer concern of the client and never reaches the server.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MAX_ITEMS_PER_PROJECT = exports.INBOX_ACTIONS = exports.INBOX_KINDS = void 0;
|
|
10
|
+
exports.inboxItemId = inboxItemId;
|
|
11
|
+
exports.compareInboxItems = compareInboxItems;
|
|
12
|
+
exports.oneLine = oneLine;
|
|
13
|
+
exports.toIso = toIso;
|
|
14
|
+
exports.INBOX_KINDS = ['review', 'question', 'failed', 'blocked', 'budget', 'jira'];
|
|
15
|
+
/** What the primary inline action does (the client maps each to the existing handler/route). */
|
|
16
|
+
exports.INBOX_ACTIONS = ['open-review', 'open-run', 'resume-run', 'retry-jira', 'raise-cap'];
|
|
17
|
+
exports.MAX_ITEMS_PER_PROJECT = 50;
|
|
18
|
+
function inboxItemId(projectId, kind, sourceId) {
|
|
19
|
+
return `${projectId}:${kind}:${sourceId}`;
|
|
20
|
+
}
|
|
21
|
+
/** Newest first; ties broken by id so the order is deterministic. */
|
|
22
|
+
function compareInboxItems(a, b) {
|
|
23
|
+
const delta = Date.parse(b.at) - Date.parse(a.at);
|
|
24
|
+
if (Number.isFinite(delta) && delta !== 0)
|
|
25
|
+
return delta;
|
|
26
|
+
return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
|
|
27
|
+
}
|
|
28
|
+
/** Bound a free-text fragment to a single short line. */
|
|
29
|
+
function oneLine(value, max = 140) {
|
|
30
|
+
if (!value)
|
|
31
|
+
return null;
|
|
32
|
+
const flat = value.replace(/\s+/g, ' ').trim();
|
|
33
|
+
if (!flat)
|
|
34
|
+
return null;
|
|
35
|
+
return flat.length > max ? `${flat.slice(0, max - 1)}…` : flat;
|
|
36
|
+
}
|
|
37
|
+
/** SQLite `datetime('now')` is UTC without a zone: make it ISO so clients parse it right. */
|
|
38
|
+
function toIso(value, fallback) {
|
|
39
|
+
if (!value)
|
|
40
|
+
return fallback;
|
|
41
|
+
const normalized = /[zZ]|[+-]\d{2}:?\d{2}$/.test(value) ? value : `${value.replace(' ', 'T')}Z`;
|
|
42
|
+
return Number.isNaN(Date.parse(normalized)) ? fallback : new Date(normalized).toISOString();
|
|
43
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.inboxItemId = exports.compareInboxItems = exports.INBOX_KINDS = exports.INBOX_ACTIONS = exports.collectInbox = void 0;
|
|
4
|
+
var application_1 = require("./application");
|
|
5
|
+
Object.defineProperty(exports, "collectInbox", { enumerable: true, get: function () { return application_1.collectInbox; } });
|
|
6
|
+
var domain_1 = require("./domain");
|
|
7
|
+
Object.defineProperty(exports, "INBOX_ACTIONS", { enumerable: true, get: function () { return domain_1.INBOX_ACTIONS; } });
|
|
8
|
+
Object.defineProperty(exports, "INBOX_KINDS", { enumerable: true, get: function () { return domain_1.INBOX_KINDS; } });
|
|
9
|
+
Object.defineProperty(exports, "compareInboxItems", { enumerable: true, get: function () { return domain_1.compareInboxItems; } });
|
|
10
|
+
Object.defineProperty(exports, "inboxItemId", { enumerable: true, get: function () { return domain_1.inboxItemId; } });
|
|
@@ -15,6 +15,12 @@ async function runDefinitionLoop(request, runId, ports) {
|
|
|
15
15
|
if (result.runtimeStatus !== 'paused')
|
|
16
16
|
return result;
|
|
17
17
|
const pending = result.pendingInterrupts ?? [];
|
|
18
|
+
if (!pending.length && result.pause && ports.awaitHostPause) {
|
|
19
|
+
if ((await ports.awaitHostPause(result.pause)) === 'stop' || ports.isCancelled())
|
|
20
|
+
return { ...result, runtimeStatus: 'cancelled', failed: true };
|
|
21
|
+
continuation = { resume: true };
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
18
24
|
const reason = result.pendingQuestion?.question ?? result.pendingApproval?.reason ?? pending.map(item => {
|
|
19
25
|
const value = item.value;
|
|
20
26
|
return `${item.nodePath}: ${typeof value?.prompt === 'string' ? value.prompt : item.kind}`;
|
|
@@ -32,5 +38,8 @@ async function runDefinitionLoop(request, runId, ports) {
|
|
|
32
38
|
continuation = selected.kind === 'question'
|
|
33
39
|
? { resume: true, answer: decision.text, interruptId: selected.id }
|
|
34
40
|
: { resume: true, approve: [selected.id], interruptId: selected.id };
|
|
41
|
+
if (ports.beforeContinuation && (await ports.beforeContinuation()) === 'stop' || ports.isCancelled()) {
|
|
42
|
+
return { ...result, runtimeStatus: 'cancelled', failed: true };
|
|
43
|
+
}
|
|
35
44
|
}
|
|
36
45
|
}
|
|
@@ -4,7 +4,7 @@ exports.compileLoopToDefinition = compileLoopToDefinition;
|
|
|
4
4
|
const loop_command_catalog_1 = require("./loop-command-catalog");
|
|
5
5
|
const loop_constants_1 = require("./loop-constants");
|
|
6
6
|
const loop_graph_1 = require("./loop-graph");
|
|
7
|
-
const AI_KINDS = new Set(['prompt', 'role-turn', 'decider', 'implementation', 'implementation-step']);
|
|
7
|
+
const AI_KINDS = new Set(['prompt', 'role-turn', 'decider', 'implementation', 'implementation-step', 'derive-change']);
|
|
8
8
|
const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
9
9
|
/** No I/O, model call, hash implementation or scheduling belongs in this adapter. */
|
|
10
10
|
function compileLoopToDefinition(graph, launch) {
|
|
@@ -98,6 +98,9 @@ function compileLoopToDefinition(graph, launch) {
|
|
|
98
98
|
roleIds.add(role);
|
|
99
99
|
if ((kind === 'role-turn' || kind === 'decider') && typeof params.roleId === 'string')
|
|
100
100
|
roleIds.add(params.roleId);
|
|
101
|
+
// Core's derive-change piece always invokes the built-in `deriver` role.
|
|
102
|
+
if (kind === 'derive-change')
|
|
103
|
+
roleIds.add('deriver');
|
|
101
104
|
if (kind === 'end' && params.outcome === 'success' && params.requiresVerified === undefined)
|
|
102
105
|
params.requiresVerified = writes;
|
|
103
106
|
const ends = Object.fromEntries(body.edges.filter((edge) => edge.source === node.id).map((edge) => [edge.label, edge.target]));
|
|
@@ -208,7 +211,7 @@ function pieceWrites(node, roles) {
|
|
|
208
211
|
return params.access !== 'read';
|
|
209
212
|
if (kind === 'role-turn')
|
|
210
213
|
return (roles ?? {})[String(params.roleId)]?.access !== 'read';
|
|
211
|
-
return ['verify', 'shell', 'openspec-archive', 'implementation', 'implementation-step'].includes(kind ?? '');
|
|
214
|
+
return ['verify', 'shell', 'openspec-archive', 'implementation', 'implementation-step', 'derive-change'].includes(kind ?? '');
|
|
212
215
|
}
|
|
213
216
|
/** Expand templates once. Text inserted by spec/constants cannot introduce another token. */
|
|
214
217
|
function resolveValue(value, launch, provider) {
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.flowChangeHolder = flowChangeHolder;
|
|
4
|
+
exports.flowDerivationChangeId = flowDerivationChangeId;
|
|
5
|
+
exports.writeFlowSummary = writeFlowSummary;
|
|
3
6
|
exports.createLoopExecutors = createLoopExecutors;
|
|
4
7
|
/**
|
|
5
8
|
* Production executors for the LoopRunManager. Thin glue that wires the engine's
|
|
@@ -23,6 +26,7 @@ const node_path_1 = require("node:path");
|
|
|
23
26
|
const win_spawn_1 = require("../../../util/win-spawn");
|
|
24
27
|
const providers_1 = require("../../../providers");
|
|
25
28
|
const registry_1 = require("../../../providers/registry");
|
|
29
|
+
const registry_2 = require("../../../providers/registry");
|
|
26
30
|
const workspace_manager_1 = require("../../../workspace-manager");
|
|
27
31
|
const claude_trust_1 = require("../../../claude-trust");
|
|
28
32
|
const spawn_lifecycle_1 = require("../../execution/runtime/spawn-lifecycle");
|
|
@@ -30,6 +34,7 @@ const result_event_1 = require("../../accounting/runtime/result-event");
|
|
|
30
34
|
const terminal_result_1 = require("../../../providers/terminal-result");
|
|
31
35
|
const claude_background_tasks_1 = require("../../../providers/claude-background-tasks");
|
|
32
36
|
const loop_constants_1 = require("./loop-constants");
|
|
37
|
+
const loop_flow_spec_recipe_1 = require("./loop-flow-spec-recipe");
|
|
33
38
|
const loop_decider_1 = require("./loop-decider");
|
|
34
39
|
const rail_isolation_1 = require("../../delivery/runtime/rail-isolation");
|
|
35
40
|
const repo_map_1 = require("../../../repo-map");
|
|
@@ -150,8 +155,66 @@ function aiStepExtraArgs(adapter, cwd, repoDir, manifest) {
|
|
|
150
155
|
const args = (0, runtime_1.buildProviderRepoAccessArgs)(adapter, [...new Set([repoDir, ...(manifest?.repositories.map((repo) => repo.worktreePath) ?? []), ...(adapter.id === 'codex' ? [cwd] : [])])]);
|
|
151
156
|
return args.length > 0 ? args : undefined;
|
|
152
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Flow -> Spec: the bounded conversation summary Core's derive-change piece
|
|
160
|
+
* reads (`summaryPath`, relative to `.specrails/pipeline/<runId>/`). Written
|
|
161
|
+
* once, atomically, never through a symlink; a retry of the same run keeps
|
|
162
|
+
* the first file. Oversized input is truncated at the byte bound (the builder
|
|
163
|
+
* already bounds it; this is the last line of defence).
|
|
164
|
+
*/
|
|
165
|
+
/** Who holds `openspec/changes/<id>` in a Flow worktree (see FlowChangeIdHolder). Read-only. */
|
|
166
|
+
function flowChangeHolder(cwd, baseSha, id) {
|
|
167
|
+
const changes = (0, node_path_1.join)(cwd, 'openspec', 'changes');
|
|
168
|
+
try {
|
|
169
|
+
const archive = (0, node_path_1.join)(changes, 'archive');
|
|
170
|
+
if ((0, node_fs_1.existsSync)(archive) && (0, node_fs_1.readdirSync)(archive).some((name) => name === id || name.endsWith(`-${id}`)))
|
|
171
|
+
return 'taken';
|
|
172
|
+
if (!(0, node_fs_1.existsSync)((0, node_path_1.join)(changes, id)))
|
|
173
|
+
return 'free';
|
|
174
|
+
if (!baseSha)
|
|
175
|
+
return 'taken';
|
|
176
|
+
// Present at the Flow base: someone else's change. Absent there: this Flow's own earlier derivation.
|
|
177
|
+
(0, node_child_process_1.execFileSync)('git', ['cat-file', '-e', `${baseSha}:openspec/changes/${id}`], { cwd, stdio: 'ignore', timeout: 5_000, windowsHide: true });
|
|
178
|
+
return 'taken';
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return (0, node_fs_1.existsSync)((0, node_path_1.join)(changes, id)) ? 'own' : 'free';
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* The change a Flow -> Spec run derives: the Flow's own earlier change when it
|
|
186
|
+
* is still active in the worktree and absent at the Flow base (re-derived in
|
|
187
|
+
* place, whatever its name — legacy `ticket-<n>-addenda-…` included);
|
|
188
|
+
* otherwise a new one named after the spec title.
|
|
189
|
+
*/
|
|
190
|
+
function flowDerivationChangeId(cwd, flow, title) {
|
|
191
|
+
const own = flow.changeId;
|
|
192
|
+
if (own && /^[a-z0-9][a-z0-9._-]{0,127}$/i.test(own) && !own.includes('..') && own !== 'archive' && flowChangeHolder(cwd, flow.baseSha, own) === 'own')
|
|
193
|
+
return own;
|
|
194
|
+
return (0, loop_flow_spec_recipe_1.flowChangeId)(title, (id) => flowChangeHolder(cwd, flow.baseSha, id));
|
|
195
|
+
}
|
|
196
|
+
function writeFlowSummary(pipelineDir, summary) {
|
|
197
|
+
const file = (0, node_path_1.join)(pipelineDir, loop_flow_spec_recipe_1.FLOW_SUMMARY_FILE);
|
|
198
|
+
if ((0, node_fs_1.lstatSync)(file, { throwIfNoEntry: false }))
|
|
199
|
+
return;
|
|
200
|
+
let body = Buffer.from(summary, 'utf8');
|
|
201
|
+
if (body.length > loop_flow_spec_recipe_1.FLOW_SUMMARY_LIMIT_BYTES)
|
|
202
|
+
body = Buffer.from(body.subarray(0, loop_flow_spec_recipe_1.FLOW_SUMMARY_LIMIT_BYTES).toString('utf8').replace(/\uFFFD+$/, ''), 'utf8');
|
|
203
|
+
const temp = `${file}.${process.pid}.${Date.now()}.tmp`;
|
|
204
|
+
try {
|
|
205
|
+
(0, node_fs_1.writeFileSync)(temp, body, { flag: 'wx', mode: 0o600 });
|
|
206
|
+
(0, node_fs_1.renameSync)(temp, file);
|
|
207
|
+
}
|
|
208
|
+
finally {
|
|
209
|
+
(0, node_fs_1.rmSync)(temp, { force: true });
|
|
210
|
+
}
|
|
211
|
+
}
|
|
153
212
|
function createLoopExecutors(opts = {}) {
|
|
154
|
-
|
|
213
|
+
// Core-hosted work may launch any configured role provider, so it receives
|
|
214
|
+
// every registered adapter's names; plain AI steps and deciders receive only
|
|
215
|
+
// their provider's; shell steps receive none.
|
|
216
|
+
const coreProviderAllowlist = () => (0, runtime_1.providerEnvAllowlist)((0, registry_1.listAdapters)());
|
|
217
|
+
const resolveEnv = (providerAllowlist) => typeof opts.env === 'function' ? opts.env(providerAllowlist ?? coreProviderAllowlist()) : opts.env ?? process.env;
|
|
155
218
|
const inactivityTimeoutMs = () => {
|
|
156
219
|
const env = resolveEnv();
|
|
157
220
|
const configuredIdle = env.SPECRAILS_LOOP_STEP_IDLE_TIMEOUT_MS ?? process.env.SPECRAILS_LOOP_STEP_IDLE_TIMEOUT_MS;
|
|
@@ -186,6 +249,11 @@ function createLoopExecutors(opts = {}) {
|
|
|
186
249
|
const host = (0, agent_runtime_bridge_1.readFrozenRuntimeHost)(contextPath, resolveEnv(), runId);
|
|
187
250
|
await (0, agent_runtime_bridge_1.runAgentRuntimeControl)({ kind: 'cancel', runId, contextPath, requestId, ...host });
|
|
188
251
|
},
|
|
252
|
+
async pauseDefinition({ runId, contextPath, requestId, reason }) {
|
|
253
|
+
const host = (0, agent_runtime_bridge_1.readFrozenRuntimeHost)(contextPath, resolveEnv(), runId);
|
|
254
|
+
const paused = await (0, agent_runtime_bridge_1.runAgentRuntimeControl)({ kind: 'pause', runId, contextPath, requestId, reason, ...host });
|
|
255
|
+
return { outcome: paused.outcome };
|
|
256
|
+
},
|
|
189
257
|
async assertDefinitionSupport(graph) {
|
|
190
258
|
const runtime = await (0, agent_runtime_loader_1.loadCoreAgentRuntime)();
|
|
191
259
|
if (runtime.api?.capabilities?.engineV2 !== 1 || runtime.api?.capabilities?.workflowDefinitions !== 1)
|
|
@@ -194,6 +262,10 @@ function createLoopExecutors(opts = {}) {
|
|
|
194
262
|
if (runtime.api?.capabilities?.workflowAgentSteps !== 1)
|
|
195
263
|
throw new Error('engine_unsupported: Update Core to run configurable workflow agent steps');
|
|
196
264
|
}
|
|
265
|
+
if (graph && [graph, ...Object.values(graph.components ?? {})].some(body => body.nodes.some(node => node.data?.kind === 'derive-change'))) {
|
|
266
|
+
if (runtime.api?.capabilities?.deriveChange !== 1)
|
|
267
|
+
throw new Error('engine_unsupported: Update Core to run the Flow → Spec derive-change step');
|
|
268
|
+
}
|
|
197
269
|
if (graph && [graph, ...Object.values(graph.components ?? {})].some(body => body.nodes.some(node => node.data?.kind === 'implementation-step'))) {
|
|
198
270
|
if (runtime.api?.capabilities?.implementationSteps !== 1)
|
|
199
271
|
throw new Error('engine_unsupported: Update Core to run independent implementation steps');
|
|
@@ -221,17 +293,26 @@ function createLoopExecutors(opts = {}) {
|
|
|
221
293
|
const result = await (0, agent_runtime_bridge_1.runAgentRuntimeInvocation)({ contextPath, ...host, engineVersion: 2, resume: true, answer: input.answer, approve: input.approve, recover: input.recover, interruptId: input.interruptId, onLine: input.onLine, onRuntimeEvent: input.onRuntimeEvent, onSpawn: input.onSpawn, timeoutMs: input.timeoutMs });
|
|
222
294
|
return { ...result, runtimeStatus: result.runtimeStatus ?? 'failed' };
|
|
223
295
|
}
|
|
224
|
-
|
|
296
|
+
// Flow -> Spec derives ONE change for code that already exists: it is named
|
|
297
|
+
// after the spec title (never addenda), and no delta briefing applies.
|
|
298
|
+
const seeded = request.flowDerivation
|
|
299
|
+
? { id: flowDerivationChangeId(request.cwd, request.flowDerivation, request.spec?.title), source: 'flow' }
|
|
300
|
+
: (0, loop_run_manager_1.seedChangeId)({ ...request, runId });
|
|
225
301
|
const delta = seeded && (seeded.source === 'addenda' || seeded.source === 'revision')
|
|
226
302
|
? `DELTA OPENSPEC TARGET: ${seeded.id}. Use ONLY openspec/changes/${seeded.id}/; create it if missing. Inspect the current branch before planning. For delivered work, plan and implement ONLY the attached addenda or delivery change request, preserving existing behavior outside the delta. For work not yet implemented, implement the full spec together with its addenda. Map each requested change to acceptance checks. Do not redo or archive the original proposal. Report each addendum id with concrete files and test evidence.`
|
|
227
303
|
: undefined;
|
|
228
304
|
const briefing = [delta, request.constants?.REVISION_REQUEST, request.followUp?.briefing, request.addenda?.briefing].filter(Boolean).join('\n\n');
|
|
229
305
|
const spec = request.spec && briefing ? { ...request.spec, description: [request.spec.description, briefing].filter(Boolean).join('\n\n'), ...(request.spec.tickets ? { tickets: request.spec.tickets.map(ticket => ({ ...ticket, description: [ticket.description, briefing].filter(Boolean).join('\n\n') })) } : {}) } : request.spec;
|
|
230
306
|
const env = { ...programmaticStepEnv(resolveEnv(), request.repoDir, request.executionManifest), SPECRAILS_GIT_AUTO: 'false' };
|
|
231
|
-
const core = (0, core_execution_1.prepareCoreExecution)({ run: { runId, projectId: request.projectId, repositoryId: request.repositoryId, spec, goal: request.spec?.title ?? request.loopName }, cwd: request.cwd, repoDir: request.repoDir, manifest: request.executionManifest, env, sourcePath: request.executionManifest ? undefined : opts.sourcePath?.(), workspacePaths: request.executionManifest ? undefined : opts.workspacePaths?.(), selectedWorkspacePaths: request.workspacePaths
|
|
307
|
+
const core = (0, core_execution_1.prepareCoreExecution)({ run: { runId, projectId: request.projectId, repositoryId: request.repositoryId, spec, goal: request.spec?.title ?? request.loopName }, cwd: request.cwd, repoDir: request.repoDir, manifest: request.executionManifest, env, sourcePath: request.executionManifest ? undefined : opts.sourcePath?.(), workspacePaths: request.executionManifest ? undefined : opts.workspacePaths?.(), selectedWorkspacePaths: request.workspacePaths,
|
|
308
|
+
// Flow -> Spec: Core measures the change from the Flow's reservation commit.
|
|
309
|
+
...(request.flowDerivation?.baseSha ? { repositoryBaseSha: request.flowDerivation.baseSha } : {}) });
|
|
310
|
+
if (request.flowDerivation)
|
|
311
|
+
writeFlowSummary((0, node_path_1.dirname)(core.contextPath), request.flowDerivation.summary);
|
|
232
312
|
const result = await (0, agent_runtime_bridge_1.runAgentRuntimeInvocation)({
|
|
233
313
|
contextPath: core.contextPath, cwd: request.cwd, env: core.env,
|
|
234
314
|
configPath: runtimeConfigPath(request.cwd), engineVersion: 2,
|
|
315
|
+
projectRuntime: opts.projectRuntime?.(),
|
|
235
316
|
loopConfig: request.graph.config.agents,
|
|
236
317
|
change: seeded?.id ?? (0, agent_runtime_bridge_1.runtimeChangeName)(runId),
|
|
237
318
|
resume: input.resume, answer: input.answer, approve: input.approve, interruptId: input.interruptId,
|
|
@@ -309,7 +390,7 @@ function createLoopExecutors(opts = {}) {
|
|
|
309
390
|
// for the pipeline's I/O exactly like QueueManager: SPECRAILS_REPO_DIR +
|
|
310
391
|
// claude `--add-dir <repoDir>` (see the shared helpers above). Best-effort
|
|
311
392
|
// agent self-heal on Windows.
|
|
312
|
-
const baseEnv = resolveEnv();
|
|
393
|
+
const baseEnv = resolveEnv(coreRun ? undefined : (0, runtime_1.providerEnvAllowlist)(adapter));
|
|
313
394
|
const existingContext = coreRun ? runtimeContextPath(cwd, coreRun.runId, baseEnv) : undefined;
|
|
314
395
|
const programmatic = coreRun && existingContext && (coreRun.implementation || (coreRun.verificationStep && existsRuntimeRequest(existingContext)));
|
|
315
396
|
const baseStepEnv = programmatic ? programmaticStepEnv(baseEnv, repoDir, executionManifest) : withProfileEnv(aiStepEnv(baseEnv, repoDir, executionManifest), provider, profileName);
|
|
@@ -322,7 +403,7 @@ function createLoopExecutors(opts = {}) {
|
|
|
322
403
|
// never silently replay an interrupted mutating phase.
|
|
323
404
|
return (0, agent_runtime_bridge_1.runAgentRuntimeInvocation)({
|
|
324
405
|
contextPath: core.contextPath, cwd, env: { ...programmaticStepEnv(resolveEnv(), repoDir, executionManifest), SPECRAILS_EXECUTION_CONTEXT: core.contextPath }, configPath: runtimeConfigPath(cwd),
|
|
325
|
-
change: (0, agent_runtime_bridge_1.runtimeChangeName)(coreRun.runId), resume: admitted,
|
|
406
|
+
change: (0, agent_runtime_bridge_1.runtimeChangeName)(coreRun.runId), resume: admitted, projectRuntime: opts.projectRuntime?.(),
|
|
326
407
|
defaultProvider: provider, providerOverride: runtimeProviderOverride,
|
|
327
408
|
onLine, onRawLine, onSpawn, timeoutMs: aiStepTimeoutMs,
|
|
328
409
|
});
|
|
@@ -339,7 +420,7 @@ function createLoopExecutors(opts = {}) {
|
|
|
339
420
|
const effectivePrompt = (0, runtime_1.formatProviderCommand)(adapter, [core?.promptPrefix, prompt].filter(Boolean).join('\n\n'), cwd, sessionId ?? undefined);
|
|
340
421
|
const buildOpts = {
|
|
341
422
|
prompt: effectivePrompt,
|
|
342
|
-
...(adapter.id === 'claude' || (0,
|
|
423
|
+
...(adapter.id === 'claude' || (0, registry_2.isLocalAdapterId)(adapter.id) ? { systemPrompt: loop_constants_1.FOREGROUND_RULE } : {}),
|
|
343
424
|
model,
|
|
344
425
|
sessionId: sessionId ?? undefined,
|
|
345
426
|
reasoning_effort: effort,
|
|
@@ -550,7 +631,7 @@ function createLoopExecutors(opts = {}) {
|
|
|
550
631
|
const adapter = (0, providers_1.getAdapter)(provider);
|
|
551
632
|
if (!adapter.capabilities.persistentStdin)
|
|
552
633
|
return null;
|
|
553
|
-
const baseStepEnv = withProfileEnv(aiStepEnv(resolveEnv(), repoDir, executionManifest), provider, profileName);
|
|
634
|
+
const baseStepEnv = withProfileEnv(aiStepEnv(resolveEnv(coreRun ? undefined : (0, runtime_1.providerEnvAllowlist)(adapter)), repoDir, executionManifest), provider, profileName);
|
|
554
635
|
const core = coreRun ? (0, core_execution_1.prepareCoreExecution)({ run: coreRun, cwd, repoDir, manifest: executionManifest, env: baseStepEnv, sourcePath: executionManifest ? undefined : opts.sourcePath?.(), workspacePaths: executionManifest ? undefined : opts.workspacePaths?.(), selectedWorkspacePaths: coreRun?.workspacePaths }) : undefined;
|
|
555
636
|
const stepEnv = core?.env ?? baseStepEnv;
|
|
556
637
|
const extraArgs = aiStepExtraArgs(adapter, cwd, repoDir, executionManifest);
|
|
@@ -613,14 +694,14 @@ function createLoopExecutors(opts = {}) {
|
|
|
613
694
|
return (0, core_execution_1.checkCoreCompletion)(core.contextPath, cwd, env, coreRun.runId);
|
|
614
695
|
},
|
|
615
696
|
async runShell({ command, cwd, repoDir, onLine, onSpawn, timeoutMs }) {
|
|
616
|
-
const env = resolveEnv();
|
|
697
|
+
const env = resolveEnv([]);
|
|
617
698
|
return runShellCommand(command, repoDir ?? cwd, repoDir ? { ...env, SPECRAILS_REPO_DIR: repoDir } : env, timeoutMs ?? SHELL_TIMEOUT_MS, onLine, onSpawn);
|
|
618
699
|
},
|
|
619
700
|
async runDecider({ systemPrompt, userPrompt, provider, model, effort, cwd, repoDir, executionManifest, onRawLine, onSpawn, timeoutMs }) {
|
|
620
701
|
const adapter = (0, providers_1.getAdapter)(provider);
|
|
621
702
|
let text = '';
|
|
622
703
|
let errorText;
|
|
623
|
-
const baseEnv = resolveEnv();
|
|
704
|
+
const baseEnv = resolveEnv((0, runtime_1.providerEnvAllowlist)(adapter));
|
|
624
705
|
const decEnv = aiStepEnv(baseEnv, repoDir, executionManifest);
|
|
625
706
|
// spec-gen is a one-shot, system-prompted invocation (workspace-write on
|
|
626
707
|
// codex, not full-access) — appropriate for a read-only judgment.
|