specrails-desktop 2.64.2 → 2.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/cli/dist/status.js +3 -0
- package/client/dist/assets/ActivityFeedPage-ByVKYII-.js +1 -0
- package/client/dist/assets/AgentBrowserCapture-BGUTjhUr.js +1 -0
- package/client/dist/assets/AgentModeAnalyticsPane-CtOLDDjB.js +2 -0
- package/client/dist/assets/AgentModeCodePane-CDhUKarT.js +2 -0
- package/client/dist/assets/AgentModeJobsPane-BAa_oEHJ.js +1 -0
- package/client/dist/assets/AgentsPage-D32hG4Ve.js +120 -0
- package/client/dist/assets/AnalyticsPage-BU50zeG6.js +5 -0
- package/client/dist/assets/BudgetCard-DP_jxwaD.js +55 -0
- package/client/dist/assets/CodePage-jiYnKGpp.js +3 -0
- package/client/dist/assets/CostValue-Bvn8674q.js +1 -0
- package/client/dist/assets/DesktopAnalyticsPage-CF__H4e3.js +1 -0
- package/client/dist/assets/DocView-RrAp70zp.js +11 -0
- package/client/dist/assets/DocsDialog-DkqHU-JF.js +1 -0
- package/client/dist/assets/DocsPage-C6X089zC.js +1 -0
- package/client/dist/assets/ExportDropdown-C5-o8y3K.js +1 -0
- package/client/dist/assets/HelpHint-Crf9_uoR.js +1 -0
- package/client/dist/assets/IntegrationsPage-aflU3KHK.js +1 -0
- package/client/dist/assets/InteractiveJobComposer-CEMMhyyJ.js +19 -0
- package/client/dist/assets/JobDetailModal-BVJ6hyRs.js +1 -0
- package/client/dist/assets/JobDetailPage-DHzBUmox.js +1 -0
- package/client/dist/assets/JobsPage-o-LAqkwC.js +1 -0
- package/client/dist/assets/LoopBuilderPage-DbSVmXBM.js +1 -0
- package/client/dist/assets/LoopPreviewModal-DbJcVyN1.js +1 -0
- package/client/dist/assets/{LoopWindowSurface-DE0v2K1p.js → LoopWindowSurface-Co1ZK26V.js} +1 -1
- package/client/dist/assets/LoopsPage-C4lgkPXB.js +2 -0
- package/client/dist/assets/MinimizedChatsContext-742ypO8n.js +1 -0
- package/client/dist/assets/PluginsPage-Acks9ges.js +2 -0
- package/client/dist/assets/RailTrack-BfLmBzBh.js +1 -0
- package/client/dist/assets/{RepositoryScopeSelector-2eSqR9WK.js → RepositoryScopeSelector-DcxbKI9w.js} +1 -1
- package/client/dist/assets/ReviewPacketPage-CAVSIOAJ.js +7 -0
- package/client/dist/assets/TemplatePreviewModal-C23SYCTm.js +1 -0
- package/client/dist/assets/TicketDetailModalContext-B-Gtm6Ob.js +23 -0
- package/client/dist/assets/Trans-C6J0cLyh.js +1 -0
- package/client/dist/assets/a11y-prefs-BqoP5goK.js +1 -0
- package/client/dist/assets/activity-BBWfoUOG.js +1 -0
- package/client/dist/assets/activity-BM_skann.js +1 -0
- package/client/dist/assets/activity-Cevl82ke.js +1 -0
- package/client/dist/assets/activity-CmACk5W5.js +1 -0
- package/client/dist/assets/activity-D9LBw3PQ.js +1 -0
- package/client/dist/assets/activity-Dspbb9lz.js +1 -0
- package/client/dist/assets/activity-FPjYIjv9.js +1 -0
- package/client/dist/assets/activity-nLCKMUKt.js +1 -0
- package/client/dist/assets/addspec-BI4jDMhA.js +1 -0
- package/client/dist/assets/addspec-BldTv7Tl.js +1 -0
- package/client/dist/assets/addspec-Cdq-2EcC.js +1 -0
- package/client/dist/assets/addspec-DH5M16BQ.js +1 -0
- package/client/dist/assets/addspec-DOFo9pD5.js +1 -0
- package/client/dist/assets/addspec-DPkwhdmL.js +1 -0
- package/client/dist/assets/addspec-Dzy12Pv3.js +1 -0
- package/client/dist/assets/addspec-skTs6EEW.js +1 -0
- package/client/dist/assets/agent-B_UEUy7Y.js +1 -0
- package/client/dist/assets/agent-BarjlhTA.js +1 -0
- package/client/dist/assets/agent-BfqIITo5.js +1 -0
- package/client/dist/assets/agent-Bt9a7Kyj.js +1 -0
- package/client/dist/assets/agent-C3689RwP.js +1 -0
- package/client/dist/assets/agent-CrmboTAi.js +1 -0
- package/client/dist/assets/agent-DcsoTnuE.js +1 -0
- package/client/dist/assets/agent-GDZoYwd4.js +1 -0
- package/client/dist/assets/{agentRuntime-es2ymSl-.js → agentRuntime-BYH70bKY.js} +1 -1
- package/client/dist/assets/agentRuntime-BijLh8I9.js +1 -0
- package/client/dist/assets/{agentRuntime-BzuwQQgn.js → agentRuntime-BvyuETPe.js} +1 -1
- package/client/dist/assets/{agentRuntime-BDvbJMmS.js → agentRuntime-C2WI6HQh.js} +1 -1
- package/client/dist/assets/{agentRuntime-BKJfv5YD.js → agentRuntime-CZPIlQsr.js} +1 -1
- package/client/dist/assets/{agentRuntime-DiCldqGG.js → agentRuntime-D2dDvCyJ.js} +1 -1
- package/client/dist/assets/agentRuntime-DWZedEbn.js +1 -0
- package/client/dist/assets/agentRuntime-DkIruUNw.js +1 -0
- package/client/dist/assets/agents-35_PDKx9.js +1 -0
- package/client/dist/assets/agents-8fZnHhEQ.js +1 -0
- package/client/dist/assets/agents-Bgimtw8z.js +1 -0
- package/client/dist/assets/agents-C4P160Us.js +1 -0
- package/client/dist/assets/agents-Clg67zbp.js +1 -0
- package/client/dist/assets/agents-DJfF4o6G.js +1 -0
- package/client/dist/assets/agents-Dc9-Y5cw.js +1 -0
- package/client/dist/assets/agents-EN1Zl4YZ.js +1 -0
- package/client/dist/assets/agentstudio-Bm4-NYaG.js +1 -0
- package/client/dist/assets/agentstudio-CD1fuj2o.js +1 -0
- package/client/dist/assets/agentstudio-CQGWFSst.js +1 -0
- package/client/dist/assets/agentstudio-CqVSb65S.js +1 -0
- package/client/dist/assets/agentstudio-DIE_HjsX.js +1 -0
- package/client/dist/assets/agentstudio-D_OmQK-k.js +1 -0
- package/client/dist/assets/agentstudio-Djz9aUfb.js +1 -0
- package/client/dist/assets/agentstudio-Qa3v9o5J.js +1 -0
- package/client/dist/assets/{aiedit-DNXxq_Dr.js → aiedit-1VzLs37W.js} +1 -1
- package/client/dist/assets/{aiedit-DCjA7jLJ.js → aiedit-BNp6GSik.js} +1 -1
- package/client/dist/assets/{aiedit-BoG24nlg.js → aiedit-BOY5xRPi.js} +1 -1
- package/client/dist/assets/{aiedit-iIjz2_Qk.js → aiedit-BrqMZvbc.js} +1 -1
- package/client/dist/assets/{aiedit-CjlSRQVP.js → aiedit-CVgtl7hm.js} +1 -1
- package/client/dist/assets/{aiedit-DQ-0_pvE.js → aiedit-CrFW9Jd2.js} +1 -1
- package/client/dist/assets/{aiedit-olnv3QSt.js → aiedit-YE2lILp7.js} +1 -1
- package/client/dist/assets/{aiedit-B0KUbpB6.js → aiedit-iA_R1AVQ.js} +1 -1
- package/client/dist/assets/analytics-3w0t-4ic.js +1 -0
- package/client/dist/assets/analytics-BRi4KQD6.js +1 -0
- package/client/dist/assets/analytics-BtjAqzke.js +1 -0
- package/client/dist/assets/analytics-COSQ1h47.js +1 -0
- package/client/dist/assets/analytics-CP2HjESk.js +1 -0
- package/client/dist/assets/analytics-DY65TC62.js +1 -0
- package/client/dist/assets/analytics-Den_vvxn.js +1 -0
- package/client/dist/assets/analytics-LmBS96O8.js +1 -0
- package/client/dist/assets/api-DOGbyfTO.js +2 -0
- package/client/dist/assets/builder-BMVvSr4v.js +1 -0
- package/client/dist/assets/builder-BN-MuLZt.js +1 -0
- package/client/dist/assets/builder-BQOZi4CF.js +1 -0
- package/client/dist/assets/builder-BjUPjsyu.js +1 -0
- package/client/dist/assets/builder-BoBtN18T.js +1 -0
- package/client/dist/assets/builder-C5g5NhxL.js +1 -0
- package/client/dist/assets/builder-RUHXw3yx.js +1 -0
- package/client/dist/assets/builder-fyS_AiyC.js +1 -0
- package/client/dist/assets/button-CHPkroew.js +1 -0
- package/client/dist/assets/chat-C9L5T7KI.js +1 -0
- package/client/dist/assets/chevron-right-CwMAj0w_.js +1 -0
- package/client/dist/assets/chevron-up-BAMuP0XD.js +1 -0
- package/client/dist/assets/chunk-OB3PAWPO-BBaq6pUk.js +3 -0
- package/client/dist/assets/code-4le5IIbf.js +1 -0
- package/client/dist/assets/code-B-jCVIbm.js +1 -0
- package/client/dist/assets/code-BRfrn5ix.js +1 -0
- package/client/dist/assets/code-CC9NCrDM.js +1 -0
- package/client/dist/assets/code-CK6pm8wY.js +1 -0
- package/client/dist/assets/code-DDiOzd6c.js +1 -0
- package/client/dist/assets/code-tGifiyf5.js +1 -0
- package/client/dist/assets/code-xkn8kQTg.js +1 -0
- package/client/dist/assets/commands-Bv1QshHR.js +1 -0
- package/client/dist/assets/commands-BvxTxboW.js +1 -0
- package/client/dist/assets/commands-C5ORR0fO.js +1 -0
- package/client/dist/assets/commands-CBKMFSTV.js +1 -0
- package/client/dist/assets/commands-CFJIRsJv.js +1 -0
- package/client/dist/assets/commands-D9o3ZcXl.js +1 -0
- package/client/dist/assets/commands-DNox0Edk.js +1 -0
- package/client/dist/assets/commands-DmIUMLdV.js +1 -0
- package/client/dist/assets/common-5H4TkaoI.js +1 -0
- package/client/dist/assets/common-9S3OdPjx.js +1 -0
- package/client/dist/assets/common-BqnwIcjs.js +1 -0
- package/client/dist/assets/common-CQP3VafS.js +1 -0
- package/client/dist/assets/common-CZnAfkB2.js +1 -0
- package/client/dist/assets/common-D5sNttV4.js +1 -0
- package/client/dist/assets/common-k_qX9nlv.js +1 -0
- package/client/dist/assets/common-s4HIi9XI.js +1 -0
- package/client/dist/assets/compass-B7guwBlY.js +1 -0
- package/client/dist/assets/confirm-dialog-ChZdHL3Q.js +1 -0
- package/client/dist/assets/copy-DOPlLymH.js +1 -0
- package/client/dist/assets/core-BozBzB6Y.js +1 -0
- package/client/dist/assets/dashboard-6zGLGcEz.js +1 -0
- package/client/dist/assets/dashboard-8Gi0FBDq.js +1 -0
- package/client/dist/assets/dashboard-B7E5YrSy.js +1 -0
- package/client/dist/assets/dashboard-BhdKV8xK.js +1 -0
- package/client/dist/assets/dashboard-Bu3zzH_s.js +1 -0
- package/client/dist/assets/dashboard-Ce_6rELA.js +1 -0
- package/client/dist/assets/dashboard-DWY-oz8P.js +1 -0
- package/client/dist/assets/dashboard-gUzlWk0o.js +1 -0
- package/client/dist/assets/date-input-Cdlr8kHz.js +1 -0
- package/client/dist/assets/dialog-C23lB2iP.js +5 -0
- package/client/dist/assets/dist-Di-oOFkX.js +1 -0
- package/client/dist/assets/dist-js-CBmS6MsJ.js +1 -0
- package/client/dist/assets/{dist-js-Rlh4FLH5.js → dist-js-DaJmKapi.js} +1 -1
- package/client/dist/assets/dropdown-menu-Bfp2CK6H.js +1 -0
- package/client/dist/assets/empty-state-D5w9OWj-.js +1 -0
- package/client/dist/assets/es2015-DfnECntk.js +41 -0
- package/client/dist/assets/esm-BKF6CE7v.js +1 -0
- package/client/dist/assets/event-BEnMLqAi.js +1 -0
- package/client/dist/assets/explore--NOz9LCN.js +1 -0
- package/client/dist/assets/explore-B2ulH6dO.js +1 -0
- package/client/dist/assets/explore-BD-QiLdg.js +1 -0
- package/client/dist/assets/explore-BOqd4_1j.js +1 -0
- package/client/dist/assets/explore-Be_Zh5zu.js +1 -0
- package/client/dist/assets/explore-CLjzPSKo.js +1 -0
- package/client/dist/assets/explore-D_-vHm29.js +1 -0
- package/client/dist/assets/explore-yEQTF6ro.js +1 -0
- package/client/dist/assets/file-text-CNXzL3wj.js +1 -0
- package/client/dist/assets/format-BODoFIw6.js +1 -0
- package/client/dist/assets/formatDistanceToNow-DLMIOS0N.js +1 -0
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-O61feXch.js +1 -0
- package/client/dist/assets/git-compare-arrows-Cu6tICCq.js +1 -0
- package/client/dist/assets/humanise-command-CB4ybLwq.js +1 -0
- package/client/dist/assets/inbox-BLZ8cm6_.js +1 -0
- package/client/dist/assets/inbox-BQ3VmNYY.js +1 -0
- package/client/dist/assets/inbox-BdcXWCuT.js +1 -0
- package/client/dist/assets/inbox-CF1PHjns.js +1 -0
- package/client/dist/assets/inbox-CFNPDhso.js +1 -0
- package/client/dist/assets/inbox-DIttK_NW.js +1 -0
- package/client/dist/assets/inbox-Dfdv1Ykl.js +1 -0
- package/client/dist/assets/inbox-JS1inmeO.js +1 -0
- package/client/dist/assets/index-4UWY7Xyz.css +2 -0
- package/client/dist/assets/index-DHzB0T26.js +120 -0
- package/client/dist/assets/integrations-BcKgzgPD.js +1 -0
- package/client/dist/assets/integrations-BmX_XyJq.js +1 -0
- package/client/dist/assets/integrations-CHpwMjlY.js +1 -0
- package/client/dist/assets/integrations-CT3kr8e-.js +1 -0
- package/client/dist/assets/integrations-C_5XAkgz.js +1 -0
- package/client/dist/assets/integrations-Ct9zLX7N.js +1 -0
- package/client/dist/assets/integrations-DEYemxUv.js +1 -0
- package/client/dist/assets/integrations-DWvsB_WB.js +1 -0
- package/client/dist/assets/{jira-Cq6yvN4q.js → jira-B_ERkFRv.js} +1 -1
- package/client/dist/assets/jira-Bn-A5lwD.js +1 -0
- package/client/dist/assets/jira-C71Ybnhp.js +1 -0
- package/client/dist/assets/jira-CkwjeJz6.js +1 -0
- package/client/dist/assets/jira-D9pSLXjI.js +1 -0
- package/client/dist/assets/jira-DBRS_lcp.js +1 -0
- package/client/dist/assets/jira-DHS6CsKh.js +1 -0
- package/client/dist/assets/jira-MInHRUb1.js +1 -0
- package/client/dist/assets/jira-api-DHme7Upx.js +1 -0
- package/client/dist/assets/jobs-BMLTDo63.js +1 -0
- package/client/dist/assets/jobs-BO8q4Mi1.js +1 -0
- package/client/dist/assets/jobs-Ck8uOWMM.js +1 -0
- package/client/dist/assets/jobs-CyFfPCpg.js +1 -0
- package/client/dist/assets/jobs-DT5s4fZ6.js +1 -0
- package/client/dist/assets/jobs-DZAgVPcD.js +1 -0
- package/client/dist/assets/jobs-b5gPYaKr.js +1 -0
- package/client/dist/assets/jobs-xsZK1440.js +1 -0
- package/client/dist/assets/launch-forecast-BTa-p3RP.js +1 -0
- package/client/dist/assets/{loop-layout-DtxX27Jz.css → loop-layout-DLioOiRN.css} +1 -1
- package/client/dist/assets/loop-layout-Sl9cfTvs.js +7 -0
- package/client/dist/assets/loops-BEEOVJDR.js +1 -0
- package/client/dist/assets/loops-BcrQ2vk7.js +1 -0
- package/client/dist/assets/loops-BjWxzJIZ.js +1 -0
- package/client/dist/assets/loops-BogV595N.js +1 -0
- package/client/dist/assets/loops-CU0BLZiz.js +1 -0
- package/client/dist/assets/loops-CrNBgi1G.js +1 -0
- package/client/dist/assets/loops-CwalwS_i.js +1 -0
- package/client/dist/assets/loops-_TDVN-fX.js +1 -0
- package/client/dist/assets/mcp-BNs8gxoL.js +1 -0
- package/client/dist/assets/mcp-BvRh_xO5.js +1 -0
- package/client/dist/assets/mcp-C2F1pghi.js +1 -0
- package/client/dist/assets/mcp-D9RLKAs2.js +1 -0
- package/client/dist/assets/mcp-DAghcsR0.js +1 -0
- package/client/dist/assets/mcp-DWWAPi1G.js +1 -0
- package/client/dist/assets/mcp-DbGSFC3f.js +1 -0
- package/client/dist/assets/mcp-FelCicrv.js +1 -0
- package/client/dist/assets/narration-C3NBkAR4.js +1 -0
- package/client/dist/assets/narration-CkoJq-Lf.js +1 -0
- package/client/dist/assets/narration-Cr0NeW9K.js +1 -0
- package/client/dist/assets/narration-DJUXOs-W.js +1 -0
- package/client/dist/assets/narration-DgL8TMvN.js +1 -0
- package/client/dist/assets/narration-DjBafgv0.js +1 -0
- package/client/dist/assets/narration-Dle6Iv0c.js +1 -0
- package/client/dist/assets/narration-MYlfktga.js +1 -0
- package/client/dist/assets/nav-BSQ8KW1c.js +1 -0
- package/client/dist/assets/nav-BauVof8Z.js +1 -0
- package/client/dist/assets/nav-BfOAH1se.js +1 -0
- package/client/dist/assets/nav-D3bOsipX.js +1 -0
- package/client/dist/assets/nav-DOMMhlLx.js +1 -0
- package/client/dist/assets/nav-DPzVlgZU.js +1 -0
- package/client/dist/assets/nav-DZJbFbah.js +1 -0
- package/client/dist/assets/nav-D_5aojd2.js +1 -0
- package/client/dist/assets/notify-error-BsWANx1T.js +1 -0
- package/client/dist/assets/onboarding-BdZQnNm3.js +1 -0
- package/client/dist/assets/onboarding-CJQEv1vp.js +1 -0
- package/client/dist/assets/onboarding-CWJGYUW3.js +1 -0
- package/client/dist/assets/onboarding-ChfYN7dA.js +1 -0
- package/client/dist/assets/onboarding-CjvDUR3V.js +1 -0
- package/client/dist/assets/onboarding-I6vS-zTB.js +1 -0
- package/client/dist/assets/onboarding-dgC_9dTB.js +1 -0
- package/client/dist/assets/onboarding-mlXSyKzX.js +1 -0
- package/client/dist/assets/origin-03nTuaOb.js +1 -0
- package/client/dist/assets/packet-BjpyRnZr.js +1 -0
- package/client/dist/assets/packet-BwgG5mBt.js +1 -0
- package/client/dist/assets/packet-C3eAUFkV.js +1 -0
- package/client/dist/assets/packet-C8wZuSld.js +1 -0
- package/client/dist/assets/packet-CNXEy_85.js +1 -0
- package/client/dist/assets/packet-DsV5Aa_8.js +1 -0
- package/client/dist/assets/packet-aasskOE7.js +1 -0
- package/client/dist/assets/packet-phxCc2gJ.js +1 -0
- package/client/dist/assets/page-header-BStSHkP8.js +1 -0
- package/client/dist/assets/project-repositories-DJPeAVBK.js +1 -0
- package/client/dist/assets/{provider-capabilities-lePfeT_Y.js → provider-capabilities-DtwcTme4.js} +1 -1
- package/client/dist/assets/recovery-BPDOsC92.js +1 -0
- package/client/dist/assets/recovery-BluNHoXM.js +1 -0
- package/client/dist/assets/recovery-CRvEmB0C.js +1 -0
- package/client/dist/assets/recovery-CeIoRnkR.js +1 -0
- package/client/dist/assets/recovery-DHCo8KGi.js +1 -0
- package/client/dist/assets/recovery-OxAIpbBF.js +1 -0
- package/client/dist/assets/recovery-XXexYGOJ.js +1 -0
- package/client/dist/assets/recovery-pITlc--v.js +1 -0
- package/client/dist/assets/refresh-cw-DfyTkbsf.js +1 -0
- package/client/dist/assets/select-xA3pSmqE.js +1 -0
- package/client/dist/assets/settings--yzDbX9r.js +1 -0
- package/client/dist/assets/settings-5_heTv8s.js +1 -0
- package/client/dist/assets/settings-BSf27MDg.js +1 -0
- package/client/dist/assets/settings-BSj6FakR.js +1 -0
- package/client/dist/assets/settings-BZDo_8Nn.js +1 -0
- package/client/dist/assets/settings-BdWgmNc0.js +1 -0
- package/client/dist/assets/settings-DRouxKqb.js +1 -0
- package/client/dist/assets/settings-DnWFoY-F.js +1 -0
- package/client/dist/assets/setup-BJWy62ri.js +1 -0
- package/client/dist/assets/setup-BgKOIuzc.js +1 -0
- package/client/dist/assets/setup-BvVIyUlz.js +1 -0
- package/client/dist/assets/setup-BxCk2pe1.js +1 -0
- package/client/dist/assets/setup-C-xQTL7R.js +1 -0
- package/client/dist/assets/setup-CbaVoiwV.js +1 -0
- package/client/dist/assets/setup-DxTBkX3P.js +1 -0
- package/client/dist/assets/setup-oGoVAzOD.js +1 -0
- package/client/dist/assets/specs-7tAb4IKr.js +1 -0
- package/client/dist/assets/specs-BUcY4s5v.js +1 -0
- package/client/dist/assets/specs-Bk5LeBAA.js +1 -0
- package/client/dist/assets/specs-CAA4Lrlg.js +1 -0
- package/client/dist/assets/specs-CS091AnA.js +1 -0
- package/client/dist/assets/specs-DJ6gmFcK.js +1 -0
- package/client/dist/assets/specs-GfCcrBSC.js +1 -0
- package/client/dist/assets/specs-xQgyc7WL.js +1 -0
- package/client/dist/assets/spending-CVH8VREb.js +1 -0
- package/client/dist/assets/square-Co6h5vZg.js +1 -0
- package/client/dist/assets/tauri-shell-43ixPGfa.js +2 -0
- package/client/dist/assets/terminal-0v9sBylD.js +1 -0
- package/client/dist/assets/terminal-AbUAmCxE.js +1 -0
- package/client/dist/assets/terminal-BJayIbIP.js +1 -0
- package/client/dist/assets/terminal-C2RUlXyi.js +1 -0
- package/client/dist/assets/terminal-CMmSb_Nj.js +1 -0
- package/client/dist/assets/terminal-DKWjj7HJ.js +1 -0
- package/client/dist/assets/terminal-KlFu7_pV.js +1 -0
- package/client/dist/assets/terminal-i99yqFvm.js +1 -0
- package/client/dist/assets/tickets-846Oq3i3.js +1 -0
- package/client/dist/assets/tickets-B5LJTe_b.js +1 -0
- package/client/dist/assets/tickets-Bfo2GGmH.js +1 -0
- package/client/dist/assets/tickets-BhdZ1yY2.js +1 -0
- package/client/dist/assets/tickets-CgjWJHAW.js +1 -0
- package/client/dist/assets/tickets-Ct9DbDUR.js +1 -0
- package/client/dist/assets/tickets-rptLEJB1.js +1 -0
- package/client/dist/assets/tickets-xQ6DpYdu.js +1 -0
- package/client/dist/assets/trending-up-BGvb4zZt.js +1 -0
- package/client/dist/assets/undo-6zuS4-sL.js +1 -0
- package/client/dist/assets/undo-BeM4gDOP.js +1 -0
- package/client/dist/assets/undo-BeppX8xS.js +1 -0
- package/client/dist/assets/undo-BqvNZ5MG.js +1 -0
- package/client/dist/assets/undo-BzwEPf_k.js +1 -0
- package/client/dist/assets/undo-CJ9Cu1NN.js +1 -0
- package/client/dist/assets/undo-ds8nMFbX.js +1 -0
- package/client/dist/assets/undo-x_gA-knG.js +1 -0
- package/client/dist/assets/useDesktop-BuOp2-MR.js +1 -0
- package/client/dist/assets/useRuntimeRuns-BRS6ncnO.js +1 -0
- package/client/dist/assets/utils-ELimjS2Y.js +1 -0
- package/client/dist/assets/wrench-Br2n1Lxd.js +1 -0
- package/client/dist/index.html +75 -60
- package/docs/ci-cd.md +29 -1
- package/docs/cli.md +10 -31
- package/docs/codex.md +1 -1
- package/docs/creating-specs.md +15 -12
- package/docs/customizing.md +16 -13
- package/docs/getting-started.md +12 -11
- package/docs/guide/de/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/de/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/de/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/de/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/de/getting-started/6-universal-search.md +34 -0
- package/docs/guide/de/insights/1-analytics-and-cost-tracking.md +20 -6
- package/docs/guide/de/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/de/insights/3-code-explorer.md +1 -1
- package/docs/guide/de/integrations/1-ai-providers.md +1 -1
- package/docs/guide/de/integrations/2-plugins.md +1 -1
- package/docs/guide/de/integrations/3-jira-integration.md +3 -3
- package/docs/guide/de/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/de/integrations/5-mcp-server.md +1 -1
- package/docs/guide/de/integrations/6-agent-chat.md +12 -5
- package/docs/guide/de/integrations/8-flow-mode.md +69 -0
- package/docs/guide/de/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/de/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/de/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/de/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/de/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/de/settings/1-themes.md +1 -1
- package/docs/guide/de/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/de/settings/5-project-environment.md +1 -1
- package/docs/guide/de/settings/6-updates.md +24 -0
- package/docs/guide/de/settings/7-existing-projects.md +33 -0
- package/docs/guide/de/settings/8-accessibility.md +23 -0
- package/docs/guide/de/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/de/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/de/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/en/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/en/getting-started/1-what-is-specrails.md +1 -1
- package/docs/guide/en/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/en/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/en/getting-started/5-the-dashboard-tour.md +52 -0
- package/docs/guide/en/getting-started/6-universal-search.md +34 -0
- package/docs/guide/en/insights/1-analytics-and-cost-tracking.md +24 -10
- package/docs/guide/en/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/en/insights/3-code-explorer.md +5 -5
- package/docs/guide/en/integrations/1-ai-providers.md +1 -1
- package/docs/guide/en/integrations/2-plugins.md +1 -1
- package/docs/guide/en/integrations/3-jira-integration.md +4 -4
- package/docs/guide/en/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/en/integrations/5-mcp-server.md +4 -4
- package/docs/guide/en/integrations/6-agent-chat.md +12 -5
- package/docs/guide/en/integrations/8-flow-mode.md +69 -0
- package/docs/guide/en/pipeline/1-rails-and-jobs.md +22 -3
- package/docs/guide/en/pipeline/2-the-job-detail-view.md +19 -7
- package/docs/guide/en/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/en/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/en/pipeline/5-the-loop-builder.md +2 -2
- package/docs/guide/en/settings/1-themes.md +1 -1
- package/docs/guide/en/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/en/settings/5-project-environment.md +1 -1
- package/docs/guide/en/settings/6-updates.md +24 -0
- package/docs/guide/en/settings/7-existing-projects.md +33 -0
- package/docs/guide/en/settings/8-accessibility.md +23 -0
- package/docs/guide/en/specs/1-specs-and-the-backlog.md +42 -6
- package/docs/guide/en/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/en/specs/3-add-spec-explore-mode.md +2 -2
- package/docs/guide/es/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/es/agents/2-profiles-and-the-balanced-default.md +1 -1
- package/docs/guide/es/agents/3-customizing-models-per-agent.md +2 -2
- package/docs/guide/es/agents/4-custom-agents-catalog.md +1 -1
- package/docs/guide/es/getting-started/1-what-is-specrails.md +3 -3
- package/docs/guide/es/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/es/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/es/getting-started/5-the-dashboard-tour.md +52 -0
- package/docs/guide/es/getting-started/6-universal-search.md +34 -0
- package/docs/guide/es/insights/1-analytics-and-cost-tracking.md +26 -12
- package/docs/guide/es/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/es/insights/3-code-explorer.md +5 -5
- package/docs/guide/es/integrations/1-ai-providers.md +1 -1
- package/docs/guide/es/integrations/2-plugins.md +1 -1
- package/docs/guide/es/integrations/3-jira-integration.md +4 -4
- package/docs/guide/es/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/es/integrations/5-mcp-server.md +4 -4
- package/docs/guide/es/integrations/6-agent-chat.md +14 -7
- package/docs/guide/es/integrations/7-local-engines.md +1 -1
- package/docs/guide/es/integrations/8-flow-mode.md +69 -0
- package/docs/guide/es/pipeline/1-rails-and-jobs.md +33 -13
- package/docs/guide/es/pipeline/2-the-job-detail-view.md +38 -26
- package/docs/guide/es/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/es/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/es/pipeline/5-the-loop-builder.md +4 -4
- package/docs/guide/es/settings/1-themes.md +1 -1
- package/docs/guide/es/settings/3-pipeline-telemetry-and-diagnostics.md +10 -10
- package/docs/guide/es/settings/5-project-environment.md +1 -1
- package/docs/guide/es/settings/6-updates.md +24 -0
- package/docs/guide/es/settings/7-existing-projects.md +33 -0
- package/docs/guide/es/settings/8-accessibility.md +23 -0
- package/docs/guide/es/specs/1-specs-and-the-backlog.md +43 -7
- package/docs/guide/es/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/es/specs/3-add-spec-explore-mode.md +3 -3
- package/docs/guide/fr/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/fr/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/fr/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/fr/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/fr/getting-started/6-universal-search.md +34 -0
- package/docs/guide/fr/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/fr/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/fr/insights/3-code-explorer.md +1 -1
- package/docs/guide/fr/integrations/1-ai-providers.md +1 -1
- package/docs/guide/fr/integrations/2-plugins.md +1 -1
- package/docs/guide/fr/integrations/3-jira-integration.md +3 -3
- package/docs/guide/fr/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/fr/integrations/5-mcp-server.md +1 -1
- package/docs/guide/fr/integrations/6-agent-chat.md +11 -4
- package/docs/guide/fr/integrations/8-flow-mode.md +69 -0
- package/docs/guide/fr/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/fr/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/fr/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/fr/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/fr/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/fr/settings/1-themes.md +1 -1
- package/docs/guide/fr/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/fr/settings/5-project-environment.md +1 -1
- package/docs/guide/fr/settings/6-updates.md +24 -0
- package/docs/guide/fr/settings/7-existing-projects.md +33 -0
- package/docs/guide/fr/settings/8-accessibility.md +23 -0
- package/docs/guide/fr/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/fr/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/fr/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/it/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/it/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/it/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/it/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/it/getting-started/6-universal-search.md +34 -0
- package/docs/guide/it/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/it/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/it/insights/3-code-explorer.md +1 -1
- package/docs/guide/it/integrations/1-ai-providers.md +1 -1
- package/docs/guide/it/integrations/2-plugins.md +1 -1
- package/docs/guide/it/integrations/3-jira-integration.md +3 -3
- package/docs/guide/it/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/it/integrations/5-mcp-server.md +1 -1
- package/docs/guide/it/integrations/6-agent-chat.md +11 -4
- package/docs/guide/it/integrations/8-flow-mode.md +69 -0
- package/docs/guide/it/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/it/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/it/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/it/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/it/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/it/settings/1-themes.md +1 -1
- package/docs/guide/it/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/it/settings/5-project-environment.md +1 -1
- package/docs/guide/it/settings/6-updates.md +24 -0
- package/docs/guide/it/settings/7-existing-projects.md +33 -0
- package/docs/guide/it/settings/8-accessibility.md +23 -0
- package/docs/guide/it/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/it/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/it/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/ja/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/ja/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/ja/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/ja/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/ja/getting-started/6-universal-search.md +34 -0
- package/docs/guide/ja/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/ja/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/ja/insights/3-code-explorer.md +1 -1
- package/docs/guide/ja/integrations/1-ai-providers.md +1 -1
- package/docs/guide/ja/integrations/2-plugins.md +1 -1
- package/docs/guide/ja/integrations/3-jira-integration.md +3 -3
- package/docs/guide/ja/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/ja/integrations/5-mcp-server.md +1 -1
- package/docs/guide/ja/integrations/6-agent-chat.md +11 -4
- package/docs/guide/ja/integrations/8-flow-mode.md +69 -0
- package/docs/guide/ja/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/ja/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/ja/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/ja/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/ja/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/ja/settings/1-themes.md +1 -1
- package/docs/guide/ja/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/ja/settings/5-project-environment.md +1 -1
- package/docs/guide/ja/settings/6-updates.md +24 -0
- package/docs/guide/ja/settings/7-existing-projects.md +33 -0
- package/docs/guide/ja/settings/8-accessibility.md +23 -0
- package/docs/guide/ja/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/ja/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/ja/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/pt/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/pt/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/pt/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/pt/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/pt/getting-started/6-universal-search.md +34 -0
- package/docs/guide/pt/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/pt/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/pt/insights/3-code-explorer.md +1 -1
- package/docs/guide/pt/integrations/1-ai-providers.md +1 -1
- package/docs/guide/pt/integrations/2-plugins.md +1 -1
- package/docs/guide/pt/integrations/3-jira-integration.md +3 -3
- package/docs/guide/pt/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/pt/integrations/5-mcp-server.md +1 -1
- package/docs/guide/pt/integrations/6-agent-chat.md +12 -5
- package/docs/guide/pt/integrations/8-flow-mode.md +69 -0
- package/docs/guide/pt/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/pt/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/pt/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/pt/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/pt/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/pt/settings/1-themes.md +1 -1
- package/docs/guide/pt/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/pt/settings/5-project-environment.md +1 -1
- package/docs/guide/pt/settings/6-updates.md +24 -0
- package/docs/guide/pt/settings/7-existing-projects.md +33 -0
- package/docs/guide/pt/settings/8-accessibility.md +23 -0
- package/docs/guide/pt/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/pt/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/pt/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/zh/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/zh/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/zh/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/zh/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/zh/getting-started/6-universal-search.md +34 -0
- package/docs/guide/zh/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/zh/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/zh/insights/3-code-explorer.md +1 -1
- package/docs/guide/zh/integrations/1-ai-providers.md +1 -1
- package/docs/guide/zh/integrations/2-plugins.md +1 -1
- package/docs/guide/zh/integrations/3-jira-integration.md +3 -3
- package/docs/guide/zh/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/zh/integrations/5-mcp-server.md +1 -1
- package/docs/guide/zh/integrations/6-agent-chat.md +11 -4
- package/docs/guide/zh/integrations/8-flow-mode.md +69 -0
- package/docs/guide/zh/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/zh/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/zh/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/zh/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/zh/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/zh/settings/1-themes.md +1 -1
- package/docs/guide/zh/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/zh/settings/5-project-environment.md +1 -1
- package/docs/guide/zh/settings/6-updates.md +24 -0
- package/docs/guide/zh/settings/7-existing-projects.md +33 -0
- package/docs/guide/zh/settings/8-accessibility.md +23 -0
- package/docs/guide/zh/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/zh/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/zh/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/internals/README.md +8 -0
- package/docs/internals/adding-a-provider.md +19 -2
- package/docs/internals/agent-actions-audit.md +101 -0
- package/docs/internals/agent-sessions.md +36 -1
- package/docs/internals/api-reference.md +190 -45
- package/docs/internals/architecture.md +53 -47
- package/docs/internals/companion-inbox-decisions.md +42 -0
- package/docs/internals/companion-rails-as-loops-contract.md +17 -6
- package/docs/internals/configuration.md +140 -9
- package/docs/internals/core-runtime-updates.md +4 -4
- package/docs/internals/existing-project-anchoring.md +168 -0
- package/docs/internals/flow-mode.md +668 -0
- package/docs/internals/legacy-implementation-notes.md +13 -0
- package/docs/internals/local-testing-feedback-2026-10.md +210 -0
- package/docs/internals/mcp-mission-audit.md +4 -0
- package/docs/internals/mission-rail-cards.md +10 -5
- package/docs/internals/mission-read-only-policy.md +152 -0
- package/docs/internals/modal-standard.md +181 -0
- package/docs/internals/openspec-workflow.md +32 -0
- package/docs/internals/operations-runbook.md +30 -0
- package/docs/internals/profiles.md +6 -3
- package/docs/internals/programmatic-agent-runtime.md +8 -0
- package/docs/internals/project-builder.md +1 -1
- package/docs/internals/review-packet.md +161 -9
- package/docs/internals/safe-pr-review-flow.md +135 -6
- package/docs/internals/source-map.md +413 -18
- package/docs/internals/spec-addenda.md +10 -0
- package/docs/internals/spec-triage.md +140 -0
- package/docs/internals/visual-design-audit.md +15 -2
- package/docs/local-providers.md +3 -0
- package/docs/mcp.md +21 -3
- package/docs/platforms/macos.md +1 -1
- package/docs/platforms/windows.md +2 -2
- package/docs/running-pipelines.md +22 -6
- package/docs/tracking-cost.md +54 -10
- package/local-runner/dist/specrails-local-runner.js +3851 -1178
- package/mcp-bridge/dist/specrails-mcp.js +3864 -1143
- package/package.json +10 -9
- package/server/dist/agent-mcp-config.js +37 -1
- package/server/dist/api-version.js +19 -0
- package/server/dist/command-resolver.js +4 -2
- package/server/dist/core-compat.js +1 -1
- package/server/dist/core-execution.js +2 -1
- package/server/dist/core-update-manager.js +71 -13
- package/server/dist/db/job-search.js +248 -0
- package/server/dist/db/jobs.js +6 -0
- package/server/dist/db/migrations.js +239 -0
- package/server/dist/db.js +9 -2
- package/server/dist/desktop-db.js +99 -5
- package/server/dist/desktop-router.js +126 -13
- package/server/dist/docs-router.js +67 -1
- package/server/dist/feature-flags.js +22 -0
- package/server/dist/index.js +30 -15
- package/server/dist/jira/jira-adf.js +13 -1
- package/server/dist/jira/jira-clarifications.js +146 -0
- package/server/dist/jira/jira-client.js +8 -1
- package/server/dist/jira/jira-db.js +41 -0
- package/server/dist/jira/jira-sync-manager.js +328 -25
- package/server/dist/mcp/guide.js +17 -7
- package/server/dist/mcp/tools/agents.js +1 -1
- package/server/dist/mcp/tools/analytics.js +15 -3
- package/server/dist/mcp/tools/app-settings.js +14 -1
- package/server/dist/mcp/tools/chat.js +1 -1
- package/server/dist/mcp/tools/env.js +4 -2
- package/server/dist/mcp/tools/jobs.js +96 -7
- package/server/dist/mcp/tools/loops.js +1 -1
- package/server/dist/mcp/tools/meta.js +10 -13
- package/server/dist/mcp/tools/rails.js +15 -1
- package/server/dist/mcp/tools/setup.js +1 -1
- package/server/dist/mcp/tools/specs.js +8 -5
- package/server/dist/mcp/tools/support.js +6 -3
- package/server/dist/mcp/tools/types.js +38 -1
- package/server/dist/mobile/mobile-admin-router.js +0 -16
- package/server/dist/mobile/mobile-gateway.js +0 -18
- package/server/dist/mobile/mobile-inbox.js +240 -0
- package/server/dist/mobile/mobile-missions.js +6 -8
- package/server/dist/mobile/mobile-router.js +9 -9
- package/server/dist/mobile/mobile-webrtc-peer.js +4 -54
- package/server/dist/mobile/mobile-ws.js +27 -4
- package/server/dist/modules/accounting/runtime/ai-invocations.js +4 -0
- package/server/dist/modules/accounting/runtime/decision-times.js +102 -0
- package/server/dist/modules/accounting/runtime/loop-economics.js +284 -0
- package/server/dist/modules/accounting/runtime/spending.js +7 -2
- package/server/dist/modules/accounting/runtime/what-if.js +87 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-bridge.js +86 -5
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-controls.js +28 -2
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-metrics.js +15 -2
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-settings-router.js +21 -2
- package/server/dist/modules/agent-runtime/runtime/core-capabilities.js +55 -0
- package/server/dist/modules/agent-sessions/adapters/host-process.js +1 -1
- package/server/dist/modules/agent-sessions/domain/availability.js +16 -0
- package/server/dist/modules/agent-sessions/domain/protocol.js +8 -1
- package/server/dist/modules/agent-sessions/index.js +3 -1
- package/server/dist/modules/agent-sessions/runtime/core-sessions-availability.js +16 -0
- package/server/dist/modules/agents/runtime/agent-refine-manager.js +3 -1
- package/server/dist/modules/agents/runtime/agent-store.js +60 -73
- package/server/dist/modules/audit/adapters/http.js +66 -0
- package/server/dist/modules/audit/adapters/runtime.js +60 -0
- package/server/dist/modules/audit/adapters/sqlite.js +73 -0
- package/server/dist/modules/audit/application.js +190 -0
- package/server/dist/modules/audit/domain.js +434 -0
- package/server/dist/modules/audit/index.js +27 -0
- package/server/dist/modules/audit/ports.js +2 -0
- package/server/dist/modules/browser/runtime/browser-capture-manager.js +18 -141
- package/server/dist/modules/browser/runtime/browser-capture-types.js +1 -10
- package/server/dist/modules/browser/runtime/browser-playwright.js +0 -19
- package/server/dist/modules/code/runtime/file-provenance.js +23 -0
- package/server/dist/modules/conversations/runtime/chat-manager.js +5 -2
- package/server/dist/modules/delivery/adapters/decisions/chains.js +1 -0
- package/server/dist/modules/delivery/adapters/decisions/create.js +19 -1
- package/server/dist/modules/delivery/adapters/decisions/discard.js +2 -0
- package/server/dist/modules/delivery/adapters/decisions/local-changes.js +427 -0
- package/server/dist/modules/delivery/adapters/decisions/merge-local.js +80 -6
- package/server/dist/modules/delivery/adapters/decisions/observations.js +5 -0
- package/server/dist/modules/delivery/adapters/decisions/ownership.js +2 -1
- package/server/dist/modules/delivery/adapters/decisions/transitions.js +9 -0
- package/server/dist/modules/delivery/adapters/review-wip-store.js +37 -0
- package/server/dist/modules/delivery/domain/review-wip.js +71 -0
- package/server/dist/modules/delivery/index.js +9 -1
- package/server/dist/modules/delivery/runtime/delivery-changes.js +355 -0
- package/server/dist/modules/delivery/runtime/delivery-evidence.js +249 -8
- package/server/dist/modules/delivery/runtime/flow-review-legacy.js +99 -0
- package/server/dist/modules/delivery/runtime/flow-review-outcome.js +107 -0
- package/server/dist/modules/delivery/runtime/flow-worktree-handoff.js +32 -0
- package/server/dist/modules/delivery/runtime/flow-worktree-return.js +87 -0
- package/server/dist/modules/delivery/runtime/isolated-worktree.js +380 -0
- package/server/dist/modules/delivery/runtime/local-restore-branch.js +325 -0
- package/server/dist/modules/delivery/runtime/local-restore-resolver.js +48 -0
- package/server/dist/modules/delivery/runtime/local-stash.js +423 -0
- package/server/dist/modules/delivery/runtime/multi-repo-execution.js +27 -1
- package/server/dist/modules/delivery/runtime/phase3-harvest.js +40 -0
- package/server/dist/modules/delivery/runtime/pr-body.js +50 -0
- package/server/dist/modules/delivery/runtime/rail-isolated-launch.js +169 -166
- package/server/dist/modules/delivery/runtime/rail-launch-parser.js +5 -2
- package/server/dist/modules/delivery/runtime/rail-pr-decision.js +7 -1
- package/server/dist/modules/delivery/runtime/rail-pr-store.js +193 -12
- package/server/dist/modules/delivery/runtime/rails-router.js +267 -5
- package/server/dist/modules/delivery/runtime/review-brief.js +208 -0
- package/server/dist/modules/delivery/runtime/review-packet.js +41 -2
- package/server/dist/modules/delivery/runtime/review-wip-gate.js +67 -0
- package/server/dist/modules/delivery/runtime/run-records.js +267 -0
- package/server/dist/modules/delivery/runtime/run-review-diagnosis.js +102 -0
- package/server/dist/modules/execution/adapters/budget-storage.js +76 -0
- package/server/dist/modules/execution/application/enforce-budget.js +17 -2
- package/server/dist/modules/execution/domain/agent-env.js +98 -0
- package/server/dist/modules/execution/domain/daily-budget.js +36 -0
- package/server/dist/modules/execution/domain/spend-caps.js +166 -0
- package/server/dist/modules/execution/index.js +34 -1
- package/server/dist/modules/execution/runtime/budget-overview.js +76 -0
- package/server/dist/modules/execution/runtime/daily-budget-gate.js +86 -0
- package/server/dist/modules/execution/runtime/interactive-job-session.js +8 -0
- package/server/dist/modules/execution/runtime/launch-forecast.js +33 -0
- package/server/dist/modules/execution/runtime/queue-manager.js +54 -15
- package/server/dist/modules/execution/runtime/run-duration-stats.js +31 -13
- package/server/dist/modules/flow/adapters/bindings.js +1089 -0
- package/server/dist/modules/flow/adapters/http.js +147 -0
- package/server/dist/modules/flow/adapters/sqlite.js +121 -0
- package/server/dist/modules/flow/application.js +805 -0
- package/server/dist/modules/flow/domain.js +790 -0
- package/server/dist/modules/flow/index.js +34 -0
- package/server/dist/modules/flow/ports.js +2 -0
- package/server/dist/modules/inbox/adapters/http.js +21 -0
- package/server/dist/modules/inbox/adapters/project-source.js +233 -0
- package/server/dist/modules/inbox/application.js +28 -0
- package/server/dist/modules/inbox/domain.js +43 -0
- package/server/dist/modules/inbox/index.js +10 -0
- package/server/dist/modules/inbox/ports.js +2 -0
- package/server/dist/modules/loops/runtime/loop-definition-run.js +9 -0
- package/server/dist/modules/loops/runtime/loop-definition.js +5 -2
- package/server/dist/modules/loops/runtime/loop-executors.js +90 -9
- package/server/dist/modules/loops/runtime/loop-factory.js +30 -2
- package/server/dist/modules/loops/runtime/loop-flow-spec-recipe.js +166 -0
- package/server/dist/modules/loops/runtime/loop-graph.js +1 -1
- package/server/dist/modules/loops/runtime/loop-role-engines.js +4 -1
- package/server/dist/modules/loops/runtime/loop-run-manager.js +267 -10
- package/server/dist/modules/loops/runtime/loop-runs-store.js +21 -5
- package/server/dist/modules/loops/runtime/loop-templates.js +55 -12
- package/server/dist/modules/missions/runtime/agent-chat-manager.js +283 -20
- package/server/dist/modules/missions/runtime/agent-chat-router.js +96 -21
- package/server/dist/modules/missions/runtime/agent-failure-briefing.js +11 -3
- package/server/dist/modules/missions/runtime/agent-fence-promotion.js +9 -1
- package/server/dist/modules/missions/runtime/agent-flow-prompt.js +64 -0
- package/server/dist/modules/missions/runtime/agent-input-store.js +9 -4
- package/server/dist/modules/missions/runtime/agent-operator-prompt.js +100 -14
- package/server/dist/modules/missions/runtime/agent-session-store.js +88 -27
- package/server/dist/modules/missions/runtime/core-session-runner.js +89 -9
- package/server/dist/modules/missions/runtime/flow-turn-context.js +17 -0
- package/server/dist/modules/missions/runtime/mission-core-sessions.js +295 -55
- package/server/dist/modules/missions/runtime/mission-run-notify.js +2 -0
- package/server/dist/modules/missions/runtime/mission-session-projector.js +56 -19
- package/server/dist/modules/missions/runtime/mission-tool-policy.js +47 -0
- package/server/dist/modules/onboarding/adapters/http.js +78 -0
- package/server/dist/modules/onboarding/adapters/providers.js +41 -0
- package/server/dist/modules/onboarding/adapters/runtime.js +130 -0
- package/server/dist/modules/onboarding/application.js +133 -0
- package/server/dist/modules/onboarding/catalog.js +217 -0
- package/server/dist/modules/onboarding/domain.js +102 -0
- package/server/dist/modules/onboarding/index.js +20 -0
- package/server/dist/modules/onboarding/ports.js +2 -0
- package/server/dist/modules/project-rules/adapters/http.js +91 -0
- package/server/dist/modules/project-rules/domain.js +122 -0
- package/server/dist/modules/project-rules/runtime/rules-inventory-runs.js +97 -0
- package/server/dist/modules/project-rules/runtime/rules-store.js +109 -0
- package/server/dist/modules/project-settings/adapters/http.js +13 -0
- package/server/dist/modules/project-settings/adapters/sqlite.js +78 -8
- package/server/dist/modules/project-settings/domain.js +47 -1
- package/server/dist/modules/project-settings/index.js +7 -1
- package/server/dist/modules/recovery/adapters/sqlite.js +28 -0
- package/server/dist/modules/recovery/domain.js +162 -0
- package/server/dist/modules/recovery/index.js +16 -0
- package/server/dist/modules/specs/adapters/timeline-http.js +101 -0
- package/server/dist/modules/specs/domain/handoff-labels.js +371 -0
- package/server/dist/modules/specs/domain/handoff.js +260 -0
- package/server/dist/modules/specs/domain/non-goals.js +101 -0
- package/server/dist/modules/specs/domain/timeline.js +164 -0
- package/server/dist/modules/specs/domain/triage.js +320 -0
- package/server/dist/modules/specs/runtime/contract-refine-runner.js +3 -2
- package/server/dist/modules/specs/runtime/generated-spec-parser.js +75 -0
- package/server/dist/modules/specs/runtime/proposal-manager.js +4 -3
- package/server/dist/modules/specs/runtime/smash-runner.js +2 -1
- package/server/dist/modules/specs/runtime/spec-addenda.js +31 -0
- package/server/dist/modules/specs/runtime/spec-draft-parser.js +6 -1
- package/server/dist/modules/specs/runtime/spec-generation.js +431 -0
- package/server/dist/modules/specs/runtime/spec-handoff.js +103 -0
- package/server/dist/modules/specs/runtime/spec-history.js +376 -0
- package/server/dist/modules/specs/runtime/spec-launcher-manager.js +4 -3
- package/server/dist/modules/specs/runtime/spec-search.js +117 -0
- package/server/dist/modules/specs/runtime/ticket-store.js +47 -2
- package/server/dist/modules/specs/runtime/ticket-trash-service.js +62 -0
- package/server/dist/modules/specs/runtime/ticket-trash.js +193 -0
- package/server/dist/modules/specs/runtime/triage-runner.js +171 -0
- package/server/dist/modules/specs/runtime/triage.js +365 -0
- package/server/dist/modules/terminals/domain/app-urls.js +96 -0
- package/server/dist/modules/terminals/runtime/app-urls.js +77 -0
- package/server/dist/modules/terminals/runtime/background-process-service.js +25 -28
- package/server/dist/project-env.js +60 -0
- package/server/dist/project-git.js +65 -0
- package/server/dist/project-registry.js +264 -27
- package/server/dist/project-router-background-processes.js +27 -3
- package/server/dist/project-router-git.js +30 -0
- package/server/dist/project-router-helpers.js +5 -30
- package/server/dist/project-router-jobs.js +49 -1
- package/server/dist/project-router-loop-runs.js +72 -2
- package/server/dist/project-router-rules.js +54 -0
- package/server/dist/project-router-search.js +52 -0
- package/server/dist/project-router-settings.js +6 -0
- package/server/dist/project-router-setup.js +1 -1
- package/server/dist/project-router-spending.js +138 -0
- package/server/dist/project-router-tickets.js +246 -427
- package/server/dist/project-router.js +7 -0
- package/server/dist/providers/claude-adapter.js +25 -3
- package/server/dist/providers/codex-adapter.js +9 -1
- package/server/dist/providers/gemini-adapter.js +6 -1
- package/server/dist/providers/kimi-adapter.js +2 -0
- package/server/dist/providers/local-adapter.js +2 -0
- package/server/dist/providers/runtime.js +8 -0
- package/server/dist/schemas/agent-runtime.schema.json +3 -1
- package/server/dist/schemas/workflow-definition.schema.json +1 -0
- package/server/dist/setup-manager.js +19 -1
- package/server/dist/transient-children.js +25 -8
- package/server/dist/update-channel.js +21 -0
- package/server/dist/util/search-snippet.js +74 -0
- package/server/dist/worktree-manager.js +19 -8
- package/client/dist/assets/ActivityFeedPage-Dtp7EyHc.js +0 -1
- package/client/dist/assets/AgentBrowserCapture-CLqlEFw8.js +0 -1
- package/client/dist/assets/AgentModeAnalyticsPane-B8_hM3Tw.js +0 -2
- package/client/dist/assets/AgentModeCodePane-CNF8ZNjE.js +0 -2
- package/client/dist/assets/AgentModeJobsPane-CJpJbO9m.js +0 -1
- package/client/dist/assets/AgentsPage-BC8XSR79.js +0 -120
- package/client/dist/assets/AnalyticsPage-Cdv4jLtW.js +0 -1
- package/client/dist/assets/BarChart-BDMqVFJy.js +0 -55
- package/client/dist/assets/CodePage-DI1kegAr.js +0 -3
- package/client/dist/assets/DesktopAnalyticsPage-Bdp8E8U6.js +0 -1
- package/client/dist/assets/DocsDialog-Bm4RS7FX.js +0 -11
- package/client/dist/assets/DocsPage-DihYcU8r.js +0 -11
- package/client/dist/assets/ExportDropdown-Bb1lHx3r.js +0 -1
- package/client/dist/assets/IntegrationsPage-EAipiDWm.js +0 -1
- package/client/dist/assets/InteractiveJobComposer-BO6ASN-2.js +0 -19
- package/client/dist/assets/JobDetailModal-CuPYq7tP.js +0 -1
- package/client/dist/assets/JobDetailPage-BusMjJi9.js +0 -1
- package/client/dist/assets/JobsPage-C0QbsF2d.js +0 -1
- package/client/dist/assets/LoopBuilderPage-B7TlU4iS.js +0 -1
- package/client/dist/assets/LoopPreviewModal-BRWtXOD2.js +0 -1
- package/client/dist/assets/LoopsPage-C4q1DmCE.js +0 -2
- package/client/dist/assets/MinimizedChatsContext-DHfigjHS.js +0 -1
- package/client/dist/assets/PluginsPage-Z1JHSMdR.js +0 -2
- package/client/dist/assets/ProjectSettingsDialog-BUNj0tvN.js +0 -1
- package/client/dist/assets/RepositoryDeliveries-B4ybHOyB.js +0 -5
- package/client/dist/assets/ReviewPacketPage-hwfPNjyy.js +0 -4
- package/client/dist/assets/TemplatePreviewModal-V7FpMWuw.js +0 -1
- package/client/dist/assets/TicketDetailModalContext-Dkwo2cDs.js +0 -16
- package/client/dist/assets/Trans-BbFxRFtR.js +0 -1
- package/client/dist/assets/activity-B-rp4h_v.js +0 -1
- package/client/dist/assets/activity-C6kJpm9q.js +0 -1
- package/client/dist/assets/activity-CGx4kb_j.js +0 -1
- package/client/dist/assets/activity-CnoX2bH7.js +0 -1
- package/client/dist/assets/activity-DAyekdlt.js +0 -1
- package/client/dist/assets/activity-DCxtpT7j.js +0 -1
- package/client/dist/assets/activity-DiyjsgQV.js +0 -1
- package/client/dist/assets/activity-JzwRaWPD.js +0 -1
- package/client/dist/assets/addspec-BOvgmcgk.js +0 -1
- package/client/dist/assets/addspec-Clmyfn_R.js +0 -1
- package/client/dist/assets/addspec-CsNaBpHp.js +0 -1
- package/client/dist/assets/addspec-D2tvWmmV.js +0 -1
- package/client/dist/assets/addspec-D3nFwvD0.js +0 -1
- package/client/dist/assets/addspec-DVLEhK3w.js +0 -1
- package/client/dist/assets/addspec-DXbK-tb0.js +0 -1
- package/client/dist/assets/addspec-OHG8DFEn.js +0 -1
- package/client/dist/assets/agent-5bSixVzz.js +0 -1
- package/client/dist/assets/agent-BR4EHfhq.js +0 -1
- package/client/dist/assets/agent-C0IKkJP8.js +0 -1
- package/client/dist/assets/agent-C7li9ayC.js +0 -1
- package/client/dist/assets/agent-D0dRmEen.js +0 -1
- package/client/dist/assets/agent-DZVGHm7H.js +0 -1
- package/client/dist/assets/agent-Dip4h2YE.js +0 -1
- package/client/dist/assets/agent-Pp-P-n1p.js +0 -1
- package/client/dist/assets/agentRuntime-BxF81z52.js +0 -1
- package/client/dist/assets/agentRuntime-BxYS5V7u.js +0 -1
- package/client/dist/assets/agentRuntime-Dc9HG3BA.js +0 -1
- package/client/dist/assets/agents-B6ZsnARo.js +0 -1
- package/client/dist/assets/agents-BORdhe0K.js +0 -1
- package/client/dist/assets/agents-C6aq9Oqs.js +0 -1
- package/client/dist/assets/agents-Cbsc4bcX.js +0 -1
- package/client/dist/assets/agents-D0uYR6hq.js +0 -1
- package/client/dist/assets/agents-Doe1sHY5.js +0 -1
- package/client/dist/assets/agents-DyNi_I9m.js +0 -1
- package/client/dist/assets/agents-StKxiTg0.js +0 -1
- package/client/dist/assets/agentstudio-7cYCXn-L.js +0 -1
- package/client/dist/assets/agentstudio-BHWQh8G3.js +0 -1
- package/client/dist/assets/agentstudio-BjnWHyRs.js +0 -1
- package/client/dist/assets/agentstudio-BkV8vcK4.js +0 -1
- package/client/dist/assets/agentstudio-BzugqB_N.js +0 -1
- package/client/dist/assets/agentstudio-CWbp7KvH.js +0 -1
- package/client/dist/assets/agentstudio-DG6plf5o.js +0 -1
- package/client/dist/assets/agentstudio-DkZVF-Cc.js +0 -1
- package/client/dist/assets/analytics-B1DIQd4m.js +0 -1
- package/client/dist/assets/analytics-BAIZ9vE_.js +0 -1
- package/client/dist/assets/analytics-BTqgmgBd.js +0 -1
- package/client/dist/assets/analytics-BWynXPEm.js +0 -1
- package/client/dist/assets/analytics-DGcUsQ44.js +0 -1
- package/client/dist/assets/analytics-GnSnpJ4W.js +0 -1
- package/client/dist/assets/analytics-TWgYaoO0.js +0 -1
- package/client/dist/assets/analytics-kJy6Tuko.js +0 -1
- package/client/dist/assets/atom-one-dark-qiGhVQxg.js +0 -1
- package/client/dist/assets/builder-B9gorTnT.js +0 -1
- package/client/dist/assets/builder-Bvw5s3Mi.js +0 -1
- package/client/dist/assets/builder-CL5l4dU3.js +0 -1
- package/client/dist/assets/builder-CVDTVrQX.js +0 -1
- package/client/dist/assets/builder-CpS9liE9.js +0 -1
- package/client/dist/assets/builder-DNctIL9Q.js +0 -1
- package/client/dist/assets/builder-De2NxX6o.js +0 -1
- package/client/dist/assets/builder-DeYT7Y-m.js +0 -1
- package/client/dist/assets/button-4FS1ZDTp.js +0 -1
- package/client/dist/assets/chat-D_I7nU5K.js +0 -1
- package/client/dist/assets/chevron-up-6EFqEHBj.js +0 -1
- package/client/dist/assets/chunk-OB3PAWPO-B1EMk45A.js +0 -3
- package/client/dist/assets/clsx-CjueKrWZ.js +0 -1
- package/client/dist/assets/code-B37GRg9C.js +0 -1
- package/client/dist/assets/code-BBOEZbf9.js +0 -1
- package/client/dist/assets/code-BRm-jcyx.js +0 -1
- package/client/dist/assets/code-CF7w62CR.js +0 -1
- package/client/dist/assets/code-CLuvJt2r.js +0 -1
- package/client/dist/assets/code-D0RCm59f.js +0 -1
- package/client/dist/assets/code-DaZ-ZwCT.js +0 -1
- package/client/dist/assets/code-iIHkGaCL.js +0 -1
- package/client/dist/assets/commands-0XjAftla.js +0 -1
- package/client/dist/assets/commands-BAWSYHjQ.js +0 -1
- package/client/dist/assets/commands-BBwowgiE.js +0 -1
- package/client/dist/assets/commands-BacjIZLN.js +0 -1
- package/client/dist/assets/commands-Bs62IAZ3.js +0 -1
- package/client/dist/assets/commands-CLPdh-Hh.js +0 -1
- package/client/dist/assets/commands-DlbFzgrp.js +0 -1
- package/client/dist/assets/commands-LjPSsi5F.js +0 -1
- package/client/dist/assets/common-Bdi0qN4S.js +0 -1
- package/client/dist/assets/common-Bhb9zN1P.js +0 -1
- package/client/dist/assets/common-BykKlZg1.js +0 -1
- package/client/dist/assets/common-CvnNNSJA.js +0 -1
- package/client/dist/assets/common-D5zk_mqq.js +0 -1
- package/client/dist/assets/common-DQNO_al5.js +0 -1
- package/client/dist/assets/common-Dax30Vmp.js +0 -1
- package/client/dist/assets/common-DkllpVSb.js +0 -1
- package/client/dist/assets/core-B3mKBIh5.js +0 -1
- package/client/dist/assets/dashboard-B1ndRHuC.js +0 -1
- package/client/dist/assets/dashboard-BX7KXiqA.js +0 -1
- package/client/dist/assets/dashboard-B_BSNxcN.js +0 -1
- package/client/dist/assets/dashboard-CCeFN7-V.js +0 -1
- package/client/dist/assets/dashboard-CRl0WtFJ.js +0 -1
- package/client/dist/assets/dashboard-XGdQ5mjw.js +0 -1
- package/client/dist/assets/dashboard-_oltA6Jd.js +0 -1
- package/client/dist/assets/dashboard-bAuf5KVk.js +0 -1
- package/client/dist/assets/dialog-DtdR05v1.js +0 -45
- package/client/dist/assets/dist-js-CJ_2XX1Y.js +0 -1
- package/client/dist/assets/event-Bt7f3wXe.js +0 -1
- package/client/dist/assets/explore-BG99VGpL.js +0 -1
- package/client/dist/assets/explore-C0TjprJW.js +0 -1
- package/client/dist/assets/explore-C2dgEo7q.js +0 -1
- package/client/dist/assets/explore-C8NDHbob.js +0 -1
- package/client/dist/assets/explore-CWWgzQGR.js +0 -1
- package/client/dist/assets/explore-CcQXpdtS.js +0 -1
- package/client/dist/assets/explore-DgBACn39.js +0 -1
- package/client/dist/assets/explore-DsXAgnmJ.js +0 -1
- package/client/dist/assets/file-text-C0blZHLh.js +0 -1
- package/client/dist/assets/formatDistanceToNow-NjPHBLfB.js +0 -1
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-vJ7qUoqN.js +0 -1
- package/client/dist/assets/git-branch-yf6LE1Bw.js +0 -1
- package/client/dist/assets/index-BgbCbIua.css +0 -2
- package/client/dist/assets/index-Ce4yZtKf.js +0 -83
- package/client/dist/assets/integrations-BkpRUbvp.js +0 -1
- package/client/dist/assets/integrations-Bo8qbJf4.js +0 -1
- package/client/dist/assets/integrations-CmSrKzZb.js +0 -1
- package/client/dist/assets/integrations-DGtq26Rr.js +0 -1
- package/client/dist/assets/integrations-De38GFnQ.js +0 -1
- package/client/dist/assets/integrations-Dw6zdtb-.js +0 -1
- package/client/dist/assets/integrations-Dwl9KQp0.js +0 -1
- package/client/dist/assets/integrations-Refg_d2I.js +0 -1
- package/client/dist/assets/jira-B6OYw4CJ.js +0 -1
- package/client/dist/assets/jira-BTF6RaOe.js +0 -1
- package/client/dist/assets/jira-CEetIB2q.js +0 -1
- package/client/dist/assets/jira-CIzsZLw5.js +0 -1
- package/client/dist/assets/jira-Daw9tmpI.js +0 -1
- package/client/dist/assets/jira-FXr7u2lh.js +0 -1
- package/client/dist/assets/jira-LaNQn7yl.js +0 -1
- package/client/dist/assets/jira-api-Cabj-H0J.js +0 -1
- package/client/dist/assets/job-time-BCL7wee9.js +0 -1
- package/client/dist/assets/jobs-ARwD85B9.js +0 -1
- package/client/dist/assets/jobs-BMF1w4WT.js +0 -1
- package/client/dist/assets/jobs-CBfzGLwm.js +0 -1
- package/client/dist/assets/jobs-CPjiluBY.js +0 -1
- package/client/dist/assets/jobs-CQQd58pY.js +0 -1
- package/client/dist/assets/jobs-De3EqaO0.js +0 -1
- package/client/dist/assets/jobs-Du9-Ei9a.js +0 -1
- package/client/dist/assets/jobs-qMHbnxwC.js +0 -1
- package/client/dist/assets/layers-BCLTgHXO.js +0 -1
- package/client/dist/assets/loader-circle-BqV9xYGf.js +0 -1
- package/client/dist/assets/loop-layout-CyXj9223.js +0 -7
- package/client/dist/assets/loops-B2PhQLKR.js +0 -1
- package/client/dist/assets/loops-BqbF46st.js +0 -1
- package/client/dist/assets/loops-CINnHbfI.js +0 -1
- package/client/dist/assets/loops-D-3XhH04.js +0 -1
- package/client/dist/assets/loops-DKkEEjZ_.js +0 -1
- package/client/dist/assets/loops-DzWR5-v6.js +0 -1
- package/client/dist/assets/loops-WyWDkhok.js +0 -1
- package/client/dist/assets/loops-scD5fIBf.js +0 -1
- package/client/dist/assets/mcp-6rMoZfEO.js +0 -1
- package/client/dist/assets/mcp-BD8sL5mP.js +0 -1
- package/client/dist/assets/mcp-BkcA3I5s.js +0 -1
- package/client/dist/assets/mcp-CCpSelOh.js +0 -1
- package/client/dist/assets/mcp-CUAN6ORK.js +0 -1
- package/client/dist/assets/mcp-CqbRxRTE.js +0 -1
- package/client/dist/assets/mcp-DP2YfVhO.js +0 -1
- package/client/dist/assets/mcp-DUVQamDz.js +0 -1
- package/client/dist/assets/narration-BEKMVxGm.js +0 -1
- package/client/dist/assets/narration-CjLwGKap.js +0 -1
- package/client/dist/assets/narration-DANWuGsW.js +0 -1
- package/client/dist/assets/narration-DGeEDWiT.js +0 -1
- package/client/dist/assets/narration-DJgpGwIP.js +0 -1
- package/client/dist/assets/narration-DbHnz0qV.js +0 -1
- package/client/dist/assets/narration-bZSsTZG8.js +0 -1
- package/client/dist/assets/narration-i6aKJKEc.js +0 -1
- package/client/dist/assets/nav--u7iPYlS.js +0 -1
- package/client/dist/assets/nav-C5Jgfaby.js +0 -1
- package/client/dist/assets/nav-CAna_Wpt.js +0 -1
- package/client/dist/assets/nav-CCLqeyHo.js +0 -1
- package/client/dist/assets/nav-Cf3c90Jk.js +0 -1
- package/client/dist/assets/nav-DMYQaQjR.js +0 -1
- package/client/dist/assets/nav-Df_PkZ9F.js +0 -1
- package/client/dist/assets/nav-VyNGBJwj.js +0 -1
- package/client/dist/assets/packet-8nn9RsU7.js +0 -1
- package/client/dist/assets/packet-B0H15elv.js +0 -1
- package/client/dist/assets/packet-BQvBgrwh.js +0 -1
- package/client/dist/assets/packet-BR7mO0-a.js +0 -1
- package/client/dist/assets/packet-BgcQ6q_K.js +0 -1
- package/client/dist/assets/packet-D2s92Jnn.js +0 -1
- package/client/dist/assets/packet-YbtcD1HS.js +0 -1
- package/client/dist/assets/packet-c0Qj_9eX.js +0 -1
- package/client/dist/assets/project-repositories-Cnnuj9Ia.js +0 -1
- package/client/dist/assets/rotate-ccw-DalJAQQX.js +0 -1
- package/client/dist/assets/settings-B1NV8Ow9.js +0 -1
- package/client/dist/assets/settings-BQ8XFZeE.js +0 -1
- package/client/dist/assets/settings-BRkxfBbO.js +0 -1
- package/client/dist/assets/settings-C_CcU1dP.js +0 -1
- package/client/dist/assets/settings-Cto9n0eL.js +0 -1
- package/client/dist/assets/settings-Pyw8uYtL.js +0 -1
- package/client/dist/assets/settings-b3HVCNNd.js +0 -1
- package/client/dist/assets/settings-hdive4u6.js +0 -1
- package/client/dist/assets/setup-Be485n2u.js +0 -1
- package/client/dist/assets/setup-CKGUxKr-.js +0 -1
- package/client/dist/assets/setup-Ck1Uwd7_.js +0 -1
- package/client/dist/assets/setup-Cm774a6v.js +0 -1
- package/client/dist/assets/setup-DIqMQpxt.js +0 -1
- package/client/dist/assets/setup-DfCsoNFL.js +0 -1
- package/client/dist/assets/setup-DkeE8mP0.js +0 -1
- package/client/dist/assets/setup-xVntVaz1.js +0 -1
- package/client/dist/assets/specs-Bqvtz2kz.js +0 -1
- package/client/dist/assets/specs-CKes-kz6.js +0 -1
- package/client/dist/assets/specs-CfXxPDNB.js +0 -1
- package/client/dist/assets/specs-CyF9HuTI.js +0 -1
- package/client/dist/assets/specs-DMj035Mt.js +0 -1
- package/client/dist/assets/specs-DfIdoU5L.js +0 -1
- package/client/dist/assets/specs-j5pGLQeU.js +0 -1
- package/client/dist/assets/specs-xW5pkkB7.js +0 -1
- package/client/dist/assets/spending-CQnrWiR3.js +0 -1
- package/client/dist/assets/square-D0JTbRSR.js +0 -1
- package/client/dist/assets/tauri-shell-DE6LfGPw.js +0 -2
- package/client/dist/assets/terminal-BAzpHtpY.js +0 -1
- package/client/dist/assets/terminal-C7dHeR3x.js +0 -1
- package/client/dist/assets/terminal-CMla5Qsz.js +0 -1
- package/client/dist/assets/terminal-CdNXH-n9.js +0 -1
- package/client/dist/assets/terminal-Cw5bZsmV.js +0 -1
- package/client/dist/assets/terminal-DFUP4eNv.js +0 -1
- package/client/dist/assets/terminal-DGqljeK_.js +0 -1
- package/client/dist/assets/terminal-cU70NodO.js +0 -1
- package/client/dist/assets/tickets--tiSOCcn.js +0 -1
- package/client/dist/assets/tickets-BUJ3DMWU.js +0 -1
- package/client/dist/assets/tickets-C1WNPODq.js +0 -1
- package/client/dist/assets/tickets-CDjhWmiE.js +0 -1
- package/client/dist/assets/tickets-CLgPC3uO.js +0 -1
- package/client/dist/assets/tickets-D41ZMQpf.js +0 -1
- package/client/dist/assets/tickets-DEaQC06P.js +0 -1
- package/client/dist/assets/tickets-kcMzbLCp.js +0 -1
- package/client/dist/assets/trash-D8zYUmTg.js +0 -1
- package/client/dist/assets/useDesktop-BjLT0_EE.js +0 -1
- package/client/dist/assets/useRuntimeRuns-C97qEqMg.js +0 -1
- package/client/dist/assets/useSharedWebSocket-Bj4LMp7b.js +0 -2
- package/client/dist/assets/utils-BC4DHlz2.js +0 -1
- package/docs/guide/en/getting-started/4-the-dashboard-tour.md +0 -48
- package/docs/guide/es/getting-started/4-the-dashboard-tour.md +0 -48
- package/server/dist/mobile/mobile-preview-channel.js +0 -179
- package/server/dist/mobile/mobile-preview.js +0 -366
- package/server/dist/modules/browser/domain/preview-origins.js +0 -117
- package/server/dist/modules/browser/runtime/preview-targets.js +0 -80
- /package/client/dist/assets/{atom-one-dark-B-oHczHB.css → DocView-B-oHczHB.css} +0 -0
- /package/docs/guide/de/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/en/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/es/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/fr/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/it/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/ja/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/pt/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/zh/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.LoopRunManager = void 0;
|
|
6
|
+
exports.LoopRunManager = exports.BUDGET_PAUSED = void 0;
|
|
7
7
|
exports.truncate = truncate;
|
|
8
8
|
exports.resolveRunVars = resolveRunVars;
|
|
9
9
|
exports.seedChangeId = seedChangeId;
|
|
@@ -11,6 +11,7 @@ exports.openspecChangeState = openspecChangeState;
|
|
|
11
11
|
exports.extractChangeId = extractChangeId;
|
|
12
12
|
exports.recoverOrphanLoopStepAccounting = recoverOrphanLoopStepAccounting;
|
|
13
13
|
const crypto_1 = require("crypto");
|
|
14
|
+
const audit_1 = require("../../audit");
|
|
14
15
|
const loop_definition_events_1 = require("./loop-definition-events");
|
|
15
16
|
const legacy_launch_telemetry_1 = require("./legacy-launch-telemetry");
|
|
16
17
|
const loop_definition_run_1 = require("./loop-definition-run");
|
|
@@ -30,7 +31,9 @@ const loop_step_idle_1 = require("./loop-step-idle");
|
|
|
30
31
|
const loop_decider_1 = require("./loop-decider");
|
|
31
32
|
const loop_runs_store_1 = require("./loop-runs-store");
|
|
32
33
|
const ai_invocations_1 = require("../../accounting/runtime/ai-invocations");
|
|
34
|
+
const execution_1 = require("../../execution");
|
|
33
35
|
const provider_limit_1 = require("../../../provider-limit");
|
|
36
|
+
const recovery_1 = require("../../recovery");
|
|
34
37
|
const ids_1 = require("../../../ids");
|
|
35
38
|
const providers_1 = require("../../../providers");
|
|
36
39
|
const agent_runtime_accounting_1 = require("../../agent-runtime/runtime/agent-runtime-accounting");
|
|
@@ -205,6 +208,9 @@ function extractChangeId(text) {
|
|
|
205
208
|
const m = CHANGE_ID_RE.exec(text);
|
|
206
209
|
return m ? m[1] : undefined;
|
|
207
210
|
}
|
|
211
|
+
/** Pause kind recorded on `loop_runs.restart_reason` and the paused event for a
|
|
212
|
+
* run stopped between AI steps by the daily budget. Resumable in place. */
|
|
213
|
+
exports.BUDGET_PAUSED = 'budget_paused';
|
|
208
214
|
function programmaticUsageAvailability(db, runId) {
|
|
209
215
|
const row = db.prepare(`SELECT COUNT(*) AS count,
|
|
210
216
|
MAX(total_cost_usd IS NULL) AS cost_unknown,
|
|
@@ -467,7 +473,9 @@ class LoopRunManager {
|
|
|
467
473
|
_pausedHumanDecisions = new Map();
|
|
468
474
|
constructor(db, broadcast, executors, now = () => Date.now(),
|
|
469
475
|
/** `idleTimeoutMs`: override the env-resolved loop-step idle watchdog
|
|
470
|
-
* (tests). Undefined ⇒ resolveLoopStepIdleTimeoutMs() per run.
|
|
476
|
+
* (tests). Undefined ⇒ resolveLoopStepIdleTimeoutMs() per run.
|
|
477
|
+
* `dailyBudget`: the project/app-wide daily budget gate (null = within
|
|
478
|
+
* budget). Consulted between AI steps; absent ⇒ no budget guard. */
|
|
471
479
|
options = {}) {
|
|
472
480
|
this.db = db;
|
|
473
481
|
this.broadcast = broadcast;
|
|
@@ -475,6 +483,57 @@ class LoopRunManager {
|
|
|
475
483
|
this.now = now;
|
|
476
484
|
this.options = options;
|
|
477
485
|
}
|
|
486
|
+
/** Live per-run soft cap state of the runs this manager is executing. */
|
|
487
|
+
_runCaps = new Map();
|
|
488
|
+
/** Best-effort budget read: an unreadable budget never stops a run. */
|
|
489
|
+
_dailyBudgetBreach() {
|
|
490
|
+
try {
|
|
491
|
+
return this.options.dailyBudget?.() ?? null;
|
|
492
|
+
}
|
|
493
|
+
catch {
|
|
494
|
+
return null;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
/** The per-run soft cap, when this run's provider-reported cost has reached it. */
|
|
498
|
+
_runCapBreach(runId) {
|
|
499
|
+
const state = this._runCaps.get(runId);
|
|
500
|
+
if (!state || !(0, execution_1.isRunCapCrossed)(state.capUsd, state.cost()))
|
|
501
|
+
return null;
|
|
502
|
+
return (0, execution_1.runCapRejection)(state.capUsd, state.cost());
|
|
503
|
+
}
|
|
504
|
+
/** Daily/weekly/monthly cap first (refuses outright), then the run's soft cap. */
|
|
505
|
+
_budgetBreach(runId) {
|
|
506
|
+
return this._dailyBudgetBreach() ?? this._runCapBreach(runId);
|
|
507
|
+
}
|
|
508
|
+
/** The budget a run is paused on (`budget_paused`), else null. */
|
|
509
|
+
budgetPause(runId) {
|
|
510
|
+
const budget = this._pausedHumanDecisions.get(runId)?.budget;
|
|
511
|
+
return budget ? structuredClone(budget) : null;
|
|
512
|
+
}
|
|
513
|
+
/** Resume a `budget_paused` run once the budget allows the next step. While
|
|
514
|
+
* still exhausted the run stays paused and the caller gets the 409 body. */
|
|
515
|
+
resumeBudgetPause(runId, choice) {
|
|
516
|
+
const paused = this._pausedHumanDecisions.get(runId);
|
|
517
|
+
if (!paused?.budget)
|
|
518
|
+
return { status: 'not_budget_paused' };
|
|
519
|
+
// The person's answer to a per-run soft cap: waive it for this run, or move it up.
|
|
520
|
+
const state = this._runCaps.get(runId);
|
|
521
|
+
if (state && choice) {
|
|
522
|
+
state.capUsd = 'ignore' in choice ? null : choice.raiseTo;
|
|
523
|
+
try {
|
|
524
|
+
(0, loop_runs_store_1.writeLoopRunCap)(this.db, runId, state.capUsd ?? 0);
|
|
525
|
+
}
|
|
526
|
+
catch { /* the in-memory choice still applies */ }
|
|
527
|
+
}
|
|
528
|
+
const rejection = this._budgetBreach(runId);
|
|
529
|
+
if (rejection) {
|
|
530
|
+
paused.budget = rejection;
|
|
531
|
+
return { status: 'over_budget', rejection: structuredClone(rejection) };
|
|
532
|
+
}
|
|
533
|
+
this._pausedHumanDecisions.delete(runId);
|
|
534
|
+
paused.resolve({ action: 'resume', text: '' });
|
|
535
|
+
return { status: 'resumed' };
|
|
536
|
+
}
|
|
478
537
|
/** WebSocket delivery is advisory. A disconnected/misbehaving listener must
|
|
479
538
|
* never change launch, accounting, traversal, or terminal outcomes. */
|
|
480
539
|
_emit(msg) {
|
|
@@ -585,6 +644,8 @@ class LoopRunManager {
|
|
|
585
644
|
if (this.definitionForkOwnsRun(jobId))
|
|
586
645
|
return false;
|
|
587
646
|
const paused = this._pausedHumanDecisions.get(jobId);
|
|
647
|
+
if (paused?.budget)
|
|
648
|
+
return this.resumeBudgetPause(jobId).status === 'resumed';
|
|
588
649
|
if (paused) {
|
|
589
650
|
if (paused.pending?.length) {
|
|
590
651
|
const selected = control?.interruptId ? paused.pending.find(item => item.id === control.interruptId) : paused.pending.length === 1 ? paused.pending[0] : undefined;
|
|
@@ -811,7 +872,7 @@ class LoopRunManager {
|
|
|
811
872
|
const maxIterations = req.graph.config.maxIterations;
|
|
812
873
|
// 0 ⇒ no whole-run deadline (built-in pipeline loops opt out of the wall
|
|
813
874
|
// clock; maxIterations / maxCostUsd remain the runaway guards).
|
|
814
|
-
|
|
875
|
+
let deadline = req.graph.config.timeoutMinutes > 0
|
|
815
876
|
? this.now() + req.graph.config.timeoutMinutes * 60_000
|
|
816
877
|
: Infinity;
|
|
817
878
|
// Per-step AI timeout (ms) — undefined falls back to the executor default,
|
|
@@ -941,6 +1002,8 @@ class LoopRunManager {
|
|
|
941
1002
|
const emitStepEnd = (input) => {
|
|
942
1003
|
if (!openStep)
|
|
943
1004
|
return;
|
|
1005
|
+
if (input.status === 'failed')
|
|
1006
|
+
failedStepId = openStep.nodeId;
|
|
944
1007
|
const payload = {
|
|
945
1008
|
index: openStep.index,
|
|
946
1009
|
nodeId: openStep.nodeId,
|
|
@@ -968,6 +1031,9 @@ class LoopRunManager {
|
|
|
968
1031
|
// identical to QueueManager — so JobStatusPanel parses real activity
|
|
969
1032
|
// (thinking/reading/editing/tool steps) instead of staying on "Connecting…".
|
|
970
1033
|
// Non-JSON lines fall back to a plain log line.
|
|
1034
|
+
// Agent actions audit for one-shot AI steps (provider JSONL) and Core
|
|
1035
|
+
// agent-event tool lines. Observing only: a tap failure never reaches the run.
|
|
1036
|
+
const auditTap = this.options.agentAudit ? (0, audit_1.createStreamAuditTap)(this.options.agentAudit, { runId, jobId: runId, role: 'loop' }) : null;
|
|
971
1037
|
const onRawLine = (line) => {
|
|
972
1038
|
if (!line)
|
|
973
1039
|
return;
|
|
@@ -978,6 +1044,7 @@ class LoopRunManager {
|
|
|
978
1044
|
eventType = parsed.type;
|
|
979
1045
|
else if (typeof parsed.role === 'string')
|
|
980
1046
|
eventType = parsed.role;
|
|
1047
|
+
auditTap?.(parsed);
|
|
981
1048
|
}
|
|
982
1049
|
catch { /* not JSON */ }
|
|
983
1050
|
if (!eventType) {
|
|
@@ -1040,10 +1107,38 @@ class LoopRunManager {
|
|
|
1040
1107
|
let outcome = 'failed';
|
|
1041
1108
|
let stallReason;
|
|
1042
1109
|
let providerLimitHit;
|
|
1110
|
+
// Failure diagnosis inputs (recovery module): the last failing step, its error text, Core's own record.
|
|
1111
|
+
let failedStepId;
|
|
1112
|
+
let failureText;
|
|
1113
|
+
let coreFailure;
|
|
1043
1114
|
let iteration = 0;
|
|
1044
1115
|
let totalCost = 0;
|
|
1045
1116
|
let totalTokens = 0;
|
|
1046
1117
|
let totalDuration = 0;
|
|
1118
|
+
// Per-run soft cap ("pause and ask at $X"): this launch's override, else what
|
|
1119
|
+
// the run was already given (a restart keeps the person's choice), else the
|
|
1120
|
+
// project/app default. The cost read is the run's provider-reported total.
|
|
1121
|
+
{
|
|
1122
|
+
let cap = null;
|
|
1123
|
+
try {
|
|
1124
|
+
const stored = (0, loop_runs_store_1.readLoopRunCap)(this.db, runId);
|
|
1125
|
+
// A resumed run keeps what it was given (and what the person decided
|
|
1126
|
+
// since): the frozen request's override applies to a FRESH launch only.
|
|
1127
|
+
const override = !continuation && req.runCapUsd !== undefined ? req.runCapUsd : undefined;
|
|
1128
|
+
if (override !== undefined)
|
|
1129
|
+
cap = override > 0 ? override : null;
|
|
1130
|
+
else if (stored !== undefined)
|
|
1131
|
+
cap = stored > 0 ? stored : null;
|
|
1132
|
+
else
|
|
1133
|
+
cap = this.options.runCapDefault?.() ?? null;
|
|
1134
|
+
if (override !== undefined || stored === undefined)
|
|
1135
|
+
(0, loop_runs_store_1.writeLoopRunCap)(this.db, runId, cap ?? 0);
|
|
1136
|
+
}
|
|
1137
|
+
catch {
|
|
1138
|
+
cap = null;
|
|
1139
|
+
}
|
|
1140
|
+
this._runCaps.set(runId, { capUsd: cap, cost: () => totalCost });
|
|
1141
|
+
}
|
|
1047
1142
|
let finalJobUsage = {
|
|
1048
1143
|
tokensIn: usageTelemetryAvailable ? 0 : null,
|
|
1049
1144
|
tokensOut: usageTelemetryAvailable ? 0 : null,
|
|
@@ -1286,6 +1381,81 @@ class LoopRunManager {
|
|
|
1286
1381
|
});
|
|
1287
1382
|
return decision;
|
|
1288
1383
|
};
|
|
1384
|
+
// rail-loop-budget-guard: the daily budget ran out between AI steps. The run
|
|
1385
|
+
// parks as `paused` (restart_reason `budget_paused`) on the same in-process
|
|
1386
|
+
// pause the human-decision path uses — no new lifecycle. Resume re-checks the
|
|
1387
|
+
// budget and continues from the next step; Stop settles 'stopped'. The pause
|
|
1388
|
+
// does not consume the run's wall-clock deadline.
|
|
1389
|
+
const awaitBudget = async (breach) => {
|
|
1390
|
+
let current = breach;
|
|
1391
|
+
for (;;) {
|
|
1392
|
+
const reason = `${current.detail} ${current.action}`;
|
|
1393
|
+
const decisionPromise = new Promise((resolve) => {
|
|
1394
|
+
this._pausedHumanDecisions.set(runId, { reason, budget: current, resolve });
|
|
1395
|
+
});
|
|
1396
|
+
logLine(`\n■ Loop paused (${exports.BUDGET_PAUSED}) — ${current.detail} Raise the budget, then resume: the run continues from the next step.`, 'stderr');
|
|
1397
|
+
const pausedAtMs = this.now();
|
|
1398
|
+
(0, loop_runs_store_1.pauseLoopRun)(this.db, runId, {
|
|
1399
|
+
iterationCount: iteration,
|
|
1400
|
+
totalCostUsd: totalCost,
|
|
1401
|
+
totalTokens,
|
|
1402
|
+
totalDurationMs: totalDuration,
|
|
1403
|
+
}, exports.BUDGET_PAUSED);
|
|
1404
|
+
this._emit({
|
|
1405
|
+
type: 'loop.run_paused',
|
|
1406
|
+
projectId: req.projectId,
|
|
1407
|
+
loopRunId: runId,
|
|
1408
|
+
railIndex: req.railIndex ?? null,
|
|
1409
|
+
reason,
|
|
1410
|
+
ticketIds: exactTicketIds,
|
|
1411
|
+
pauseKind: exports.BUDGET_PAUSED,
|
|
1412
|
+
budget: { scope: current.scope, ...(current.period ? { period: current.period } : {}), budgetUsd: current.budgetUsd, spentUsd: current.spentUsd, resetsAt: current.resetsAt },
|
|
1413
|
+
});
|
|
1414
|
+
this._emit({
|
|
1415
|
+
type: 'job.interactive',
|
|
1416
|
+
projectId: req.projectId,
|
|
1417
|
+
jobId: runId,
|
|
1418
|
+
acceptingTurns: true,
|
|
1419
|
+
pendingInterrupts: [],
|
|
1420
|
+
settleMode: 'auto',
|
|
1421
|
+
timestamp: new Date(pausedAtMs).toISOString(),
|
|
1422
|
+
});
|
|
1423
|
+
const decision = await decisionPromise;
|
|
1424
|
+
if (this._disposed)
|
|
1425
|
+
return new Promise(() => { });
|
|
1426
|
+
if (decision.action === 'stop' || this._cancelled.has(runId)) {
|
|
1427
|
+
logLine(`\n■ Loop stop requested while paused on the daily budget.`, 'stderr');
|
|
1428
|
+
return 'stop';
|
|
1429
|
+
}
|
|
1430
|
+
if (Number.isFinite(deadline))
|
|
1431
|
+
deadline += Math.max(0, this.now() - pausedAtMs);
|
|
1432
|
+
const still = this._budgetBreach(runId);
|
|
1433
|
+
if (still) {
|
|
1434
|
+
current = still;
|
|
1435
|
+
continue;
|
|
1436
|
+
}
|
|
1437
|
+
(0, loop_runs_store_1.resumeLoopRun)(this.db, runId);
|
|
1438
|
+
const resumedAt = new Date(this.now()).toISOString();
|
|
1439
|
+
logLine(`\n▶ Loop resumed — the daily budget allows the next step.`);
|
|
1440
|
+
this._emit({
|
|
1441
|
+
type: 'loop.run_resumed',
|
|
1442
|
+
projectId: req.projectId,
|
|
1443
|
+
loopRunId: runId,
|
|
1444
|
+
railIndex: req.railIndex ?? null,
|
|
1445
|
+
ticketIds: exactTicketIds,
|
|
1446
|
+
});
|
|
1447
|
+
this._emit({
|
|
1448
|
+
type: 'job.interactive',
|
|
1449
|
+
projectId: req.projectId,
|
|
1450
|
+
jobId: runId,
|
|
1451
|
+
acceptingTurns: false,
|
|
1452
|
+
pendingInterrupts: [],
|
|
1453
|
+
settleMode: 'auto',
|
|
1454
|
+
timestamp: resumedAt,
|
|
1455
|
+
});
|
|
1456
|
+
return 'continue';
|
|
1457
|
+
}
|
|
1458
|
+
};
|
|
1289
1459
|
const recoveryCounts = new Map();
|
|
1290
1460
|
let phaseRecovery;
|
|
1291
1461
|
const recoverPhase = (node, detail, previousFailure) => {
|
|
@@ -1316,26 +1486,96 @@ class LoopRunManager {
|
|
|
1316
1486
|
outcome = 'failed';
|
|
1317
1487
|
if (definitionEngine) {
|
|
1318
1488
|
settled = true;
|
|
1489
|
+
// rail-loop-budget-guard (mid-run): Core schedules every step inside one
|
|
1490
|
+
// invocation, so a budget crossed by a role's spend is enforced with
|
|
1491
|
+
// Core's cooperative pause (`pauseRuns`): the current step finishes, Core
|
|
1492
|
+
// records `paused` (reason `budget`) and exits 2, and the run parks on
|
|
1493
|
+
// the same resumable `budget_paused` pause. One request per invocation;
|
|
1494
|
+
// a Core without the capability keeps the between-invocation guard.
|
|
1495
|
+
let budgetPauseRequested = false, budgetPauseUnsupported = false, budgetPauseEpisode = 0, budgetCheckedCost = totalCost;
|
|
1496
|
+
const requestBudgetPause = () => {
|
|
1497
|
+
if (budgetPauseRequested || budgetPauseUnsupported || !this.executors.pauseDefinition || this._cancelled.has(runId) || this._disposed)
|
|
1498
|
+
return;
|
|
1499
|
+
const breach = this._budgetBreach(runId);
|
|
1500
|
+
const contextPath = breach ? (0, loop_runs_store_1.readDefinitionRun)(this.db, runId)?.metadata.contextPath : undefined;
|
|
1501
|
+
if (!breach || !contextPath)
|
|
1502
|
+
return;
|
|
1503
|
+
budgetPauseRequested = true;
|
|
1504
|
+
const requestId = `desktop-budget-pause:${runId}:${++budgetPauseEpisode}`;
|
|
1505
|
+
logLine(`\n■ Daily budget reached mid-run — ${breach.detail} Pausing the workflow after its current step.`, 'stderr');
|
|
1506
|
+
void this.executors.pauseDefinition({ runId, contextPath, requestId, reason: 'budget' }).catch((error) => {
|
|
1507
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1508
|
+
if (message.startsWith('engine_unsupported')) {
|
|
1509
|
+
budgetPauseUnsupported = true;
|
|
1510
|
+
logLine(`\n■ This run's Core cannot pause mid-run; the daily budget applies before its next continuation.`, 'stderr');
|
|
1511
|
+
}
|
|
1512
|
+
else {
|
|
1513
|
+
budgetPauseRequested = false;
|
|
1514
|
+
console.error(`[loop-run] budget pause request failed for ${runId}: ${message}`);
|
|
1515
|
+
}
|
|
1516
|
+
});
|
|
1517
|
+
};
|
|
1319
1518
|
const projectEvent = (0, loop_definition_events_1.createDefinitionEventProjection)({ db: this.db, runId, projectId: req.projectId, ticketIds: exactTicketIds, nextSequence: takeSeq,
|
|
1320
1519
|
broadcast: event => this._emit({ type: 'event', jobId: runId, event_type: event.eventType, source: 'stdout', payload: event.payload, seq: event.seq, timestamp: event.timestamp }),
|
|
1321
|
-
onProgress: (count, usage) => {
|
|
1520
|
+
onProgress: (count, usage) => {
|
|
1521
|
+
stepNum = count;
|
|
1522
|
+
totalCost = usage.cost;
|
|
1523
|
+
totalTokens = usage.tokensIn + usage.tokensOut;
|
|
1524
|
+
totalDuration = usage.duration;
|
|
1525
|
+
costUncertain = usage.costUnknown;
|
|
1526
|
+
usageTelemetryAvailable = usage.present;
|
|
1527
|
+
// Only new recorded spend can cross the budget: check on a cost change.
|
|
1528
|
+
if (totalCost > budgetCheckedCost) {
|
|
1529
|
+
budgetCheckedCost = totalCost;
|
|
1530
|
+
requestBudgetPause();
|
|
1531
|
+
}
|
|
1532
|
+
},
|
|
1322
1533
|
});
|
|
1323
1534
|
let activeDurationMs = continuation ? (0, loop_runs_store_1.getLoopRun)(this.db, runId)?.total_duration_ms ?? 0 : 0;
|
|
1324
1535
|
const result = await (0, loop_definition_run_1.runDefinitionLoop)(req, runId, { continuation, contextPath: () => (0, loop_runs_store_1.readDefinitionRun)(this.db, runId)?.metadata.contextPath,
|
|
1325
1536
|
onPrepared: metadata => { (0, loop_runs_store_1.saveDefinitionRun)(this.db, runId, metadata); },
|
|
1326
1537
|
invoke: input => { this.claimDefinition({ ...req, runId }); return this.executors.runDefinition(input); }, isCancelled: () => this._cancelled.has(runId),
|
|
1327
1538
|
remainingMs: () => req.graph.config.timeoutMinutes > 0 ? Math.max(1, req.graph.config.timeoutMinutes * 60_000 - activeDurationMs) : undefined,
|
|
1328
|
-
onLine: logLine, onRuntimeEvent: projectEvent, onSpawn: child => {
|
|
1539
|
+
onLine: logLine, onRuntimeEvent: auditTap ? event => { auditTap(event); return projectEvent(event); } : projectEvent, onSpawn: child => {
|
|
1329
1540
|
this._activeChild.set(runId, child);
|
|
1330
1541
|
if (this._cancelled.has(runId))
|
|
1331
1542
|
this.cancelResident(runId, false);
|
|
1332
1543
|
},
|
|
1333
|
-
onInvocationEnd: result => {
|
|
1334
|
-
this.
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1544
|
+
onInvocationEnd: result => {
|
|
1545
|
+
this._activeChild.delete(runId);
|
|
1546
|
+
budgetPauseRequested = false;
|
|
1547
|
+
if (result.runtimeStatus === 'paused')
|
|
1548
|
+
this.releaseDefinition(runId);
|
|
1549
|
+
if (result.durationMs !== undefined) {
|
|
1550
|
+
activeDurationMs = result.durationMs;
|
|
1551
|
+
totalDuration = result.durationMs;
|
|
1552
|
+
}
|
|
1553
|
+
try {
|
|
1554
|
+
this.options.onDefinitionInvocationEnd?.(runId, exactTicketIds, result.runtimeStatus);
|
|
1555
|
+
}
|
|
1556
|
+
catch { /* advisory observer */ }
|
|
1557
|
+
}, awaitHumanDecision,
|
|
1558
|
+
// Core schedules every step inside one invocation; the only boundary
|
|
1559
|
+
// Desktop owns is the re-invocation after a human decision.
|
|
1560
|
+
beforeContinuation: async () => {
|
|
1561
|
+
const breach = this._budgetBreach(runId);
|
|
1562
|
+
return breach ? awaitBudget(breach) : 'continue';
|
|
1563
|
+
},
|
|
1564
|
+
// Core exited 2 on the budget pause requested above. A budget raised
|
|
1565
|
+
// meanwhile resumes at once; otherwise the run waits like any budget pause.
|
|
1566
|
+
awaitHostPause: async (pause) => {
|
|
1567
|
+
if (pause.reason !== 'budget')
|
|
1568
|
+
throw new Error(`Core paused (${pause.reason}) without an addressable interrupt`);
|
|
1569
|
+
const breach = this._budgetBreach(runId);
|
|
1570
|
+
if (breach)
|
|
1571
|
+
return awaitBudget(breach);
|
|
1572
|
+
logLine(`\n▶ The daily budget allows the next step — resuming the workflow.`);
|
|
1573
|
+
return 'continue';
|
|
1574
|
+
}, });
|
|
1338
1575
|
definitionCompletion = result.completion;
|
|
1576
|
+
coreFailure = result.failure;
|
|
1577
|
+
if (result.errorText)
|
|
1578
|
+
failureText = result.errorText;
|
|
1339
1579
|
if (result.durationMs !== undefined)
|
|
1340
1580
|
totalDuration = result.durationMs;
|
|
1341
1581
|
if (result.errorText)
|
|
@@ -1366,6 +1606,16 @@ class LoopRunManager {
|
|
|
1366
1606
|
outcome = 'failed';
|
|
1367
1607
|
break;
|
|
1368
1608
|
}
|
|
1609
|
+
// Daily budget: checked BETWEEN AI steps (the launch gate covered the
|
|
1610
|
+
// first one). The current step always finishes; the next AI-bearing
|
|
1611
|
+
// node waits on a resumable `budget_paused` pause.
|
|
1612
|
+
if ((node.type === 'ai-step' || node.type === 'decider') && stepNum > 0) {
|
|
1613
|
+
const breach = this._budgetBreach(runId);
|
|
1614
|
+
if (breach && (await awaitBudget(breach)) === 'stop') {
|
|
1615
|
+
outcome = 'stopped';
|
|
1616
|
+
break;
|
|
1617
|
+
}
|
|
1618
|
+
}
|
|
1369
1619
|
const succs = (0, loop_graph_1.successors)(req.graph, node.id);
|
|
1370
1620
|
// The RAIL governs provider/model/effort for the whole run — nodes do
|
|
1371
1621
|
// NOT override (decided in design: "lo que pongamos en el rail manda").
|
|
@@ -1610,6 +1860,7 @@ class LoopRunManager {
|
|
|
1610
1860
|
logLine(`✖ Zero work performed — the command never ran${res.text.trim() ? `: ${res.text.trim()}` : ''}`, 'stderr');
|
|
1611
1861
|
}
|
|
1612
1862
|
else if (stepFailed && stepErrorText) {
|
|
1863
|
+
failureText = stepErrorText;
|
|
1613
1864
|
// Executors can return a structured failure without streaming any
|
|
1614
1865
|
// text (configuration rejection, missing CLI, provider startup).
|
|
1615
1866
|
// Persist its reason before the step closes, including early stops.
|
|
@@ -2068,6 +2319,7 @@ class LoopRunManager {
|
|
|
2068
2319
|
if (coreCompletion)
|
|
2069
2320
|
logLine(`Core result: implementation=${coreCompletion.completion.implementation}; validation=${coreCompletion.completion.validation}; archive=${coreCompletion.completion.archive}; delivery=${coreCompletion.completion.delivery}`);
|
|
2070
2321
|
const finishedAt = new Date(this.now()).toISOString();
|
|
2322
|
+
this._runCaps.delete(runId);
|
|
2071
2323
|
(0, loop_runs_store_1.finishLoopRunAndJob)(this.db, runId, {
|
|
2072
2324
|
outcome,
|
|
2073
2325
|
finishedAt,
|
|
@@ -2092,6 +2344,10 @@ class LoopRunManager {
|
|
|
2092
2344
|
},
|
|
2093
2345
|
callbackOutcome: req.deferTerminalOutcome ? 'failed' : outcome,
|
|
2094
2346
|
outcomeFinalized: !req.deferTerminalOutcome,
|
|
2347
|
+
failureDiagnosis: (0, recovery_1.isDiagnosableOutcome)(outcome)
|
|
2348
|
+
? (0, recovery_1.serializeDiagnosis)((0, recovery_1.deriveFailureDiagnosis)({ outcome, stallReason: stallReason ?? null, providerLimit: providerLimitHit ?? null, errorText: failureText ?? null, stepId: failedStepId ?? null, core: coreFailure, hostBlocker: definitionCompletion?.blocker ?? null,
|
|
2349
|
+
blockedReason: definitionCompletion && !definitionCompletion.ok ? definitionCompletion.reasons.join('; ') : coreCompletion && outcome === 'blocked' ? `validation ${coreCompletion.completion.validation}, implementation ${coreCompletion.completion.implementation}` : null }))
|
|
2350
|
+
: null,
|
|
2095
2351
|
});
|
|
2096
2352
|
this._emit({
|
|
2097
2353
|
type: 'job.finalized',
|
|
@@ -2172,6 +2428,7 @@ class LoopRunManager {
|
|
|
2172
2428
|
zombieTimeoutMs: input.plan.idleTimeoutMs ?? input.plan.inactivityTimeoutMs ?? 0,
|
|
2173
2429
|
onZombieTimeout: () => { stalled = true; },
|
|
2174
2430
|
nextEventSeq: input.nextEventSeq,
|
|
2431
|
+
...(this.options.agentAudit ? { onProviderEvent: (0, audit_1.createStreamAuditTap)(this.options.agentAudit, { runId: input.runId, jobId: input.runId, role: 'loop' }) } : {}),
|
|
2175
2432
|
persistTurnUsage: (usage, completedEventSeq, checkpoint) => {
|
|
2176
2433
|
const checkpointTurn = this.db.transaction(() => {
|
|
2177
2434
|
(0, db_1.accumulateInteractiveTurn)(this.db, input.runId, usage);
|
|
@@ -33,6 +33,8 @@ exports.finishLoopRun = finishLoopRun;
|
|
|
33
33
|
exports.pauseLoopRun = pauseLoopRun;
|
|
34
34
|
exports.resumeLoopRun = resumeLoopRun;
|
|
35
35
|
exports.getLoopRun = getLoopRun;
|
|
36
|
+
exports.readLoopRunCap = readLoopRunCap;
|
|
37
|
+
exports.writeLoopRunCap = writeLoopRunCap;
|
|
36
38
|
exports.getRunEventCounts = getRunEventCounts;
|
|
37
39
|
exports.listRunningLoopRuns = listRunningLoopRuns;
|
|
38
40
|
exports.listActiveLoopRuns = listActiveLoopRuns;
|
|
@@ -49,6 +51,7 @@ const agent_runtime_retention_records_1 = require("../../agent-runtime/runtime/a
|
|
|
49
51
|
*/
|
|
50
52
|
const path_1 = __importDefault(require("path"));
|
|
51
53
|
const node_fs_1 = require("node:fs");
|
|
54
|
+
const job_search_1 = require("../../../db/job-search");
|
|
52
55
|
function frozenJson(value) {
|
|
53
56
|
const serialized = JSON.stringify(value, (_key, item) => {
|
|
54
57
|
if (typeof item === 'function' || typeof item === 'symbol' || typeof item === 'bigint' || typeof item === 'number' && !Number.isFinite(item))
|
|
@@ -260,6 +263,7 @@ function createLoopRun(db, input) {
|
|
|
260
263
|
iteration_limit, started_at
|
|
261
264
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?)
|
|
262
265
|
`).run(input.id, input.projectId, input.loopId, input.loopName ?? null, input.railIndex ?? null, input.ticketId ?? null, input.provider ?? null, input.model ?? null, input.reasoningEffort ?? null, JSON.stringify([...new Set(input.ticketIds ?? (input.ticketId == null ? [] : [input.ticketId]))]), input.ticketCompletionStatus ?? 'done', input.causalOwnership ? 1 : 0, input.iterationLimit, input.startedAt);
|
|
266
|
+
(0, job_search_1.safeIndexJob)(db, input.id);
|
|
263
267
|
return getLoopRun(db, input.id);
|
|
264
268
|
}
|
|
265
269
|
function parseTicketIdsJson(raw) {
|
|
@@ -284,9 +288,9 @@ function finishLoopRunAndJob(db, id, opts) {
|
|
|
284
288
|
updateLoopRunCounters(db, id, opts.counters);
|
|
285
289
|
db.prepare(`
|
|
286
290
|
UPDATE loop_runs
|
|
287
|
-
SET status = 'completed', final_outcome = ?, finished_at = ?
|
|
291
|
+
SET status = 'completed', final_outcome = ?, finished_at = ?, failure_diagnosis = ?
|
|
288
292
|
WHERE id = ?
|
|
289
|
-
`).run(opts.outcome, opts.finishedAt, id);
|
|
293
|
+
`).run(opts.outcome, opts.finishedAt, opts.failureDiagnosis ?? null, id);
|
|
290
294
|
db.prepare(`
|
|
291
295
|
UPDATE jobs
|
|
292
296
|
SET exit_code = ?, status = ?, finished_at = ?,
|
|
@@ -313,6 +317,7 @@ function finishLoopRunAndJob(db, id, opts) {
|
|
|
313
317
|
) THEN num_turns ELSE ? END
|
|
314
318
|
WHERE id = ? AND owner = 'loop'
|
|
315
319
|
`).run(opts.job.exitCode, opts.job.status, opts.finishedAt, id, opts.job.totalCostUsd, id, opts.job.tokensIn, id, opts.job.tokensOut, id, opts.job.tokensCacheRead, id, opts.job.tokensCacheCreate, id, opts.job.durationMs, id, opts.job.numTurns, id);
|
|
320
|
+
(0, job_search_1.safeIndexJob)(db, id);
|
|
316
321
|
const payload = {
|
|
317
322
|
version: 1,
|
|
318
323
|
runId: id,
|
|
@@ -471,13 +476,16 @@ function updateLoopRunCounters(db, id, counters) {
|
|
|
471
476
|
function finishLoopRun(db, id, opts) {
|
|
472
477
|
if (opts.counters)
|
|
473
478
|
updateLoopRunCounters(db, id, opts.counters);
|
|
474
|
-
db.prepare(`UPDATE loop_runs SET status = 'completed', final_outcome = ?, finished_at = ? WHERE id = ?`).run(opts.outcome, opts.finishedAt, id);
|
|
479
|
+
db.prepare(`UPDATE loop_runs SET status = 'completed', final_outcome = ?, finished_at = ?, failure_diagnosis = ? WHERE id = ?`).run(opts.outcome, opts.finishedAt, opts.failureDiagnosis ?? null, id);
|
|
480
|
+
(0, job_search_1.safeIndexJob)(db, id);
|
|
475
481
|
return getLoopRun(db, id);
|
|
476
482
|
}
|
|
477
|
-
|
|
483
|
+
/** `reason` marks a non-decision pause on `restart_reason` (e.g. `budget_paused`);
|
|
484
|
+
* resumeLoopRun clears it. A human-decision pause leaves it untouched. */
|
|
485
|
+
function pauseLoopRun(db, id, counters, reason) {
|
|
478
486
|
if (counters)
|
|
479
487
|
updateLoopRunCounters(db, id, counters);
|
|
480
|
-
db.prepare(`UPDATE loop_runs SET status = 'paused' WHERE id = ? AND status = 'running'`).run(id);
|
|
488
|
+
db.prepare(`UPDATE loop_runs SET status = 'paused', restart_reason = COALESCE(?, restart_reason) WHERE id = ? AND status = 'running'`).run(reason ?? null, id);
|
|
481
489
|
return getLoopRun(db, id);
|
|
482
490
|
}
|
|
483
491
|
function resumeLoopRun(db, id) {
|
|
@@ -487,6 +495,14 @@ function resumeLoopRun(db, id) {
|
|
|
487
495
|
function getLoopRun(db, id) {
|
|
488
496
|
return db.prepare('SELECT * FROM loop_runs WHERE id = ?').get(id);
|
|
489
497
|
}
|
|
498
|
+
/** The run's own per-run soft cap: undefined = never set, 0 = waived, > 0 = the cap. */
|
|
499
|
+
function readLoopRunCap(db, id) {
|
|
500
|
+
const row = db.prepare('SELECT run_cap_usd FROM loop_runs WHERE id = ?').get(id);
|
|
501
|
+
return row?.run_cap_usd == null ? undefined : row.run_cap_usd;
|
|
502
|
+
}
|
|
503
|
+
function writeLoopRunCap(db, id, capUsd) {
|
|
504
|
+
db.prepare('UPDATE loop_runs SET run_cap_usd = ? WHERE id = ?').run(capUsd, id);
|
|
505
|
+
}
|
|
490
506
|
/** Activity-step count for one event, mirroring the client's deriveFrameActivity
|
|
491
507
|
* (../../client/src/features/browser/lib/frame-activity.ts) so the seeded count matches the live
|
|
492
508
|
* "pasos" the Job panel shows. A single assistant frame may carry several
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.LEGACY_LOOP_TEMPLATES = exports.LOOP_TEMPLATES = exports.CORE_STARTER_TEMPLATE_IDS = exports.LOOP_CATEGORIES = void 0;
|
|
3
|
+
exports.DRIFT_SWEEP_TEMPLATE = exports.DRIFT_SWEEP_TEMPLATE_ID = exports.LEGACY_LOOP_TEMPLATES = exports.LOOP_TEMPLATES = exports.CORE_STARTER_TEMPLATE_IDS = exports.LOOP_CATEGORIES = void 0;
|
|
4
4
|
exports.aiLoopGraph = aiLoopGraph;
|
|
5
5
|
exports.fixLoopGraph = fixLoopGraph;
|
|
6
6
|
exports.opsxLifecycleGraph = opsxLifecycleGraph;
|
|
7
7
|
exports.coreStarterGraph = coreStarterGraph;
|
|
8
8
|
exports.supportsCoreTemplates = supportsCoreTemplates;
|
|
9
9
|
exports.loopTemplatesForCapabilities = loopTemplatesForCapabilities;
|
|
10
|
+
exports.driftSweepGraph = driftSweepGraph;
|
|
10
11
|
exports.getLoopTemplate = getLoopTemplate;
|
|
11
12
|
const loop_core_factory_1 = require("./loop-core-factory");
|
|
12
13
|
const loop_agents_1 = require("./loop-agents");
|
|
@@ -430,17 +431,59 @@ function supportsCoreTemplates(capabilities) {
|
|
|
430
431
|
function loopTemplatesForCapabilities(capabilities) {
|
|
431
432
|
if (!supportsCoreTemplates(capabilities))
|
|
432
433
|
return exports.LOOP_TEMPLATES;
|
|
433
|
-
return exports.LOOP_TEMPLATES.map((template) => {
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
434
|
+
return [...exports.LOOP_TEMPLATES.map((template) => {
|
|
435
|
+
if (!isCoreStarterId(template.id))
|
|
436
|
+
return template;
|
|
437
|
+
const readOnly = CORE_STARTER_SHAPES[template.id] === 'watch';
|
|
438
|
+
return {
|
|
439
|
+
...template,
|
|
440
|
+
description: CORE_STARTER_DESCRIPTIONS[template.id],
|
|
441
|
+
...(readOnly ? { readOnly: true } : {}),
|
|
442
|
+
graph: coreStarterGraph(template.id, capabilities?.implementationSteps === 1, capabilities?.workflowAgentSteps === 1, capabilities),
|
|
443
|
+
};
|
|
444
|
+
}), ...phase3Templates(capabilities)];
|
|
445
|
+
}
|
|
446
|
+
/** Drift sweep (feedback-2026-10 task 3.3): the reviewer's check 9 ("the spec
|
|
447
|
+
* of a capability against its code") run on demand across every capability.
|
|
448
|
+
* Read-only; listed only when Core announces `specTrace: 1`. */
|
|
449
|
+
exports.DRIFT_SWEEP_TEMPLATE_ID = 'drift-sweep';
|
|
450
|
+
const DRIFT_SWEEP_PROMPT = [
|
|
451
|
+
'Drift sweep. Read-only: do not modify any file, branch, pull request or ticket.',
|
|
452
|
+
'For every capability under `openspec/specs/<capability>/spec.md`, read each `### Requirement:` and its scenarios, then read the code that implements it. A requirement id is `<capability>/<slug>` (the heading, lowercased, every run of non-alphanumerics one `-`).',
|
|
453
|
+
'Report every claim the code contradicts as a divergence: the requirement id, what the spec says and what the code does instead, with `file:line`. Do not report style, missing tests or wishes: only behaviour the spec states and the code does not have. List the capabilities you could not check and why.',
|
|
454
|
+
'End with a short table: capability, requirements checked, divergences.',
|
|
455
|
+
'Finish with exactly `{{const:VERIFICATION_PASS}}` when no divergence was found, otherwise `{{const:VERIFICATION_FAIL}} — <n> divergences in <capabilities>`.',
|
|
456
|
+
].join('\n\n');
|
|
457
|
+
/** One read-only pass; both verdicts end the run (the report is the output). */
|
|
458
|
+
function driftSweepGraph() {
|
|
459
|
+
return {
|
|
460
|
+
nodes: [
|
|
461
|
+
{ id: 'start', type: 'start', position: { x: COL_X, y: 0 } },
|
|
462
|
+
{ id: 'sweep', type: 'core', position: { x: COL_X, y: ROW_GAP }, data: { kind: 'prompt', params: { text: DRIFT_SWEEP_PROMPT, access: 'read', sentinel: 'verification' } } },
|
|
463
|
+
{ id: 'done', type: 'end', position: { x: COL_X, y: ROW_GAP * 2 }, data: { outcome: 'success', requiresVerified: false } },
|
|
464
|
+
{ id: 'failed', type: 'end', position: { x: COL_RIGHT_X, y: ROW_GAP * 2 }, data: { outcome: 'failure' } },
|
|
465
|
+
],
|
|
466
|
+
edges: [
|
|
467
|
+
{ id: 'e-start', source: 'start', target: 'sweep' },
|
|
468
|
+
{ id: 'e-sweep-pass', source: 'sweep', target: 'done', label: 'pass' },
|
|
469
|
+
{ id: 'e-sweep-fail', source: 'sweep', target: 'done', label: 'fail' },
|
|
470
|
+
{ id: 'e-sweep-failed', source: 'sweep', target: 'failed', label: 'failed' },
|
|
471
|
+
],
|
|
472
|
+
config: { maxIterations: 1, timeoutMinutes: STARTER_TIMEOUT_MIN, journal: 'ledger-only', change: 'none' },
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
exports.DRIFT_SWEEP_TEMPLATE = {
|
|
476
|
+
id: exports.DRIFT_SWEEP_TEMPLATE_ID,
|
|
477
|
+
name: 'Drift sweep',
|
|
478
|
+
description: 'Read-only: compares what every capability\'s spec claims with what the code does and lists each contradiction with file:line. Changes nothing; run it on demand.',
|
|
479
|
+
category: 'Quality',
|
|
480
|
+
tags: ['specs', 'drift', 'read-only'],
|
|
481
|
+
readOnly: true,
|
|
482
|
+
graph: driftSweepGraph(),
|
|
483
|
+
};
|
|
484
|
+
/** Templates gated on phase-3 Core capabilities (appended after the catalog). */
|
|
485
|
+
function phase3Templates(capabilities) {
|
|
486
|
+
return supportsCoreTemplates(capabilities) && capabilities?.specTrace === 1 ? [{ ...exports.DRIFT_SWEEP_TEMPLATE, graph: driftSweepGraph() }] : [];
|
|
444
487
|
}
|
|
445
488
|
function getLoopTemplate(id, capabilities) {
|
|
446
489
|
return loopTemplatesForCapabilities(capabilities).find((t) => t.id === id);
|