specrails-desktop 2.64.1 → 2.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/cli/dist/status.js +3 -0
- package/client/dist/assets/ActivityFeedPage-ByVKYII-.js +1 -0
- package/client/dist/assets/AgentBrowserCapture-BGUTjhUr.js +1 -0
- package/client/dist/assets/AgentModeAnalyticsPane-CtOLDDjB.js +2 -0
- package/client/dist/assets/AgentModeCodePane-CDhUKarT.js +2 -0
- package/client/dist/assets/AgentModeJobsPane-BAa_oEHJ.js +1 -0
- package/client/dist/assets/AgentsPage-D32hG4Ve.js +120 -0
- package/client/dist/assets/AnalyticsPage-BU50zeG6.js +5 -0
- package/client/dist/assets/BudgetCard-DP_jxwaD.js +55 -0
- package/client/dist/assets/CodePage-jiYnKGpp.js +3 -0
- package/client/dist/assets/CostValue-Bvn8674q.js +1 -0
- package/client/dist/assets/DesktopAnalyticsPage-CF__H4e3.js +1 -0
- package/client/dist/assets/DocView-RrAp70zp.js +11 -0
- package/client/dist/assets/DocsDialog-DkqHU-JF.js +1 -0
- package/client/dist/assets/DocsPage-C6X089zC.js +1 -0
- package/client/dist/assets/ExportDropdown-C5-o8y3K.js +1 -0
- package/client/dist/assets/HelpHint-Crf9_uoR.js +1 -0
- package/client/dist/assets/IntegrationsPage-aflU3KHK.js +1 -0
- package/client/dist/assets/InteractiveJobComposer-CEMMhyyJ.js +19 -0
- package/client/dist/assets/JobDetailModal-BVJ6hyRs.js +1 -0
- package/client/dist/assets/JobDetailPage-DHzBUmox.js +1 -0
- package/client/dist/assets/JobsPage-o-LAqkwC.js +1 -0
- package/client/dist/assets/LoopBuilderPage-DbSVmXBM.js +1 -0
- package/client/dist/assets/LoopPreviewModal-DbJcVyN1.js +1 -0
- package/client/dist/assets/{LoopWindowSurface-DE0v2K1p.js → LoopWindowSurface-Co1ZK26V.js} +1 -1
- package/client/dist/assets/LoopsPage-C4lgkPXB.js +2 -0
- package/client/dist/assets/MinimizedChatsContext-742ypO8n.js +1 -0
- package/client/dist/assets/PluginsPage-Acks9ges.js +2 -0
- package/client/dist/assets/RailTrack-BfLmBzBh.js +1 -0
- package/client/dist/assets/{RepositoryScopeSelector-2eSqR9WK.js → RepositoryScopeSelector-DcxbKI9w.js} +1 -1
- package/client/dist/assets/ReviewPacketPage-CAVSIOAJ.js +7 -0
- package/client/dist/assets/TemplatePreviewModal-C23SYCTm.js +1 -0
- package/client/dist/assets/TicketDetailModalContext-B-Gtm6Ob.js +23 -0
- package/client/dist/assets/Trans-C6J0cLyh.js +1 -0
- package/client/dist/assets/a11y-prefs-BqoP5goK.js +1 -0
- package/client/dist/assets/activity-BBWfoUOG.js +1 -0
- package/client/dist/assets/activity-BM_skann.js +1 -0
- package/client/dist/assets/activity-Cevl82ke.js +1 -0
- package/client/dist/assets/activity-CmACk5W5.js +1 -0
- package/client/dist/assets/activity-D9LBw3PQ.js +1 -0
- package/client/dist/assets/activity-Dspbb9lz.js +1 -0
- package/client/dist/assets/activity-FPjYIjv9.js +1 -0
- package/client/dist/assets/activity-nLCKMUKt.js +1 -0
- package/client/dist/assets/addspec-BI4jDMhA.js +1 -0
- package/client/dist/assets/addspec-BldTv7Tl.js +1 -0
- package/client/dist/assets/addspec-Cdq-2EcC.js +1 -0
- package/client/dist/assets/addspec-DH5M16BQ.js +1 -0
- package/client/dist/assets/addspec-DOFo9pD5.js +1 -0
- package/client/dist/assets/addspec-DPkwhdmL.js +1 -0
- package/client/dist/assets/addspec-Dzy12Pv3.js +1 -0
- package/client/dist/assets/addspec-skTs6EEW.js +1 -0
- package/client/dist/assets/agent-B_UEUy7Y.js +1 -0
- package/client/dist/assets/agent-BarjlhTA.js +1 -0
- package/client/dist/assets/agent-BfqIITo5.js +1 -0
- package/client/dist/assets/agent-Bt9a7Kyj.js +1 -0
- package/client/dist/assets/agent-C3689RwP.js +1 -0
- package/client/dist/assets/agent-CrmboTAi.js +1 -0
- package/client/dist/assets/agent-DcsoTnuE.js +1 -0
- package/client/dist/assets/agent-GDZoYwd4.js +1 -0
- package/client/dist/assets/{agentRuntime-es2ymSl-.js → agentRuntime-BYH70bKY.js} +1 -1
- package/client/dist/assets/agentRuntime-BijLh8I9.js +1 -0
- package/client/dist/assets/{agentRuntime-BzuwQQgn.js → agentRuntime-BvyuETPe.js} +1 -1
- package/client/dist/assets/{agentRuntime-BDvbJMmS.js → agentRuntime-C2WI6HQh.js} +1 -1
- package/client/dist/assets/{agentRuntime-BKJfv5YD.js → agentRuntime-CZPIlQsr.js} +1 -1
- package/client/dist/assets/{agentRuntime-DiCldqGG.js → agentRuntime-D2dDvCyJ.js} +1 -1
- package/client/dist/assets/agentRuntime-DWZedEbn.js +1 -0
- package/client/dist/assets/agentRuntime-DkIruUNw.js +1 -0
- package/client/dist/assets/agents-35_PDKx9.js +1 -0
- package/client/dist/assets/agents-8fZnHhEQ.js +1 -0
- package/client/dist/assets/agents-Bgimtw8z.js +1 -0
- package/client/dist/assets/agents-C4P160Us.js +1 -0
- package/client/dist/assets/agents-Clg67zbp.js +1 -0
- package/client/dist/assets/agents-DJfF4o6G.js +1 -0
- package/client/dist/assets/agents-Dc9-Y5cw.js +1 -0
- package/client/dist/assets/agents-EN1Zl4YZ.js +1 -0
- package/client/dist/assets/agentstudio-Bm4-NYaG.js +1 -0
- package/client/dist/assets/agentstudio-CD1fuj2o.js +1 -0
- package/client/dist/assets/agentstudio-CQGWFSst.js +1 -0
- package/client/dist/assets/agentstudio-CqVSb65S.js +1 -0
- package/client/dist/assets/agentstudio-DIE_HjsX.js +1 -0
- package/client/dist/assets/agentstudio-D_OmQK-k.js +1 -0
- package/client/dist/assets/agentstudio-Djz9aUfb.js +1 -0
- package/client/dist/assets/agentstudio-Qa3v9o5J.js +1 -0
- package/client/dist/assets/{aiedit-DNXxq_Dr.js → aiedit-1VzLs37W.js} +1 -1
- package/client/dist/assets/{aiedit-DCjA7jLJ.js → aiedit-BNp6GSik.js} +1 -1
- package/client/dist/assets/{aiedit-BoG24nlg.js → aiedit-BOY5xRPi.js} +1 -1
- package/client/dist/assets/{aiedit-iIjz2_Qk.js → aiedit-BrqMZvbc.js} +1 -1
- package/client/dist/assets/{aiedit-CjlSRQVP.js → aiedit-CVgtl7hm.js} +1 -1
- package/client/dist/assets/{aiedit-DQ-0_pvE.js → aiedit-CrFW9Jd2.js} +1 -1
- package/client/dist/assets/{aiedit-olnv3QSt.js → aiedit-YE2lILp7.js} +1 -1
- package/client/dist/assets/{aiedit-B0KUbpB6.js → aiedit-iA_R1AVQ.js} +1 -1
- package/client/dist/assets/analytics-3w0t-4ic.js +1 -0
- package/client/dist/assets/analytics-BRi4KQD6.js +1 -0
- package/client/dist/assets/analytics-BtjAqzke.js +1 -0
- package/client/dist/assets/analytics-COSQ1h47.js +1 -0
- package/client/dist/assets/analytics-CP2HjESk.js +1 -0
- package/client/dist/assets/analytics-DY65TC62.js +1 -0
- package/client/dist/assets/analytics-Den_vvxn.js +1 -0
- package/client/dist/assets/analytics-LmBS96O8.js +1 -0
- package/client/dist/assets/api-DOGbyfTO.js +2 -0
- package/client/dist/assets/builder-BMVvSr4v.js +1 -0
- package/client/dist/assets/builder-BN-MuLZt.js +1 -0
- package/client/dist/assets/builder-BQOZi4CF.js +1 -0
- package/client/dist/assets/builder-BjUPjsyu.js +1 -0
- package/client/dist/assets/builder-BoBtN18T.js +1 -0
- package/client/dist/assets/builder-C5g5NhxL.js +1 -0
- package/client/dist/assets/builder-RUHXw3yx.js +1 -0
- package/client/dist/assets/builder-fyS_AiyC.js +1 -0
- package/client/dist/assets/button-CHPkroew.js +1 -0
- package/client/dist/assets/chat-C9L5T7KI.js +1 -0
- package/client/dist/assets/chevron-right-CwMAj0w_.js +1 -0
- package/client/dist/assets/chevron-up-BAMuP0XD.js +1 -0
- package/client/dist/assets/chunk-OB3PAWPO-BBaq6pUk.js +3 -0
- package/client/dist/assets/code-4le5IIbf.js +1 -0
- package/client/dist/assets/code-B-jCVIbm.js +1 -0
- package/client/dist/assets/code-BRfrn5ix.js +1 -0
- package/client/dist/assets/code-CC9NCrDM.js +1 -0
- package/client/dist/assets/code-CK6pm8wY.js +1 -0
- package/client/dist/assets/code-DDiOzd6c.js +1 -0
- package/client/dist/assets/code-tGifiyf5.js +1 -0
- package/client/dist/assets/code-xkn8kQTg.js +1 -0
- package/client/dist/assets/commands-Bv1QshHR.js +1 -0
- package/client/dist/assets/commands-BvxTxboW.js +1 -0
- package/client/dist/assets/commands-C5ORR0fO.js +1 -0
- package/client/dist/assets/commands-CBKMFSTV.js +1 -0
- package/client/dist/assets/commands-CFJIRsJv.js +1 -0
- package/client/dist/assets/commands-D9o3ZcXl.js +1 -0
- package/client/dist/assets/commands-DNox0Edk.js +1 -0
- package/client/dist/assets/commands-DmIUMLdV.js +1 -0
- package/client/dist/assets/common-5H4TkaoI.js +1 -0
- package/client/dist/assets/common-9S3OdPjx.js +1 -0
- package/client/dist/assets/common-BqnwIcjs.js +1 -0
- package/client/dist/assets/common-CQP3VafS.js +1 -0
- package/client/dist/assets/common-CZnAfkB2.js +1 -0
- package/client/dist/assets/common-D5sNttV4.js +1 -0
- package/client/dist/assets/common-k_qX9nlv.js +1 -0
- package/client/dist/assets/common-s4HIi9XI.js +1 -0
- package/client/dist/assets/compass-B7guwBlY.js +1 -0
- package/client/dist/assets/confirm-dialog-ChZdHL3Q.js +1 -0
- package/client/dist/assets/copy-DOPlLymH.js +1 -0
- package/client/dist/assets/core-BozBzB6Y.js +1 -0
- package/client/dist/assets/dashboard-6zGLGcEz.js +1 -0
- package/client/dist/assets/dashboard-8Gi0FBDq.js +1 -0
- package/client/dist/assets/dashboard-B7E5YrSy.js +1 -0
- package/client/dist/assets/dashboard-BhdKV8xK.js +1 -0
- package/client/dist/assets/dashboard-Bu3zzH_s.js +1 -0
- package/client/dist/assets/dashboard-Ce_6rELA.js +1 -0
- package/client/dist/assets/dashboard-DWY-oz8P.js +1 -0
- package/client/dist/assets/dashboard-gUzlWk0o.js +1 -0
- package/client/dist/assets/date-input-Cdlr8kHz.js +1 -0
- package/client/dist/assets/dialog-C23lB2iP.js +5 -0
- package/client/dist/assets/dist-Di-oOFkX.js +1 -0
- package/client/dist/assets/dist-js-CBmS6MsJ.js +1 -0
- package/client/dist/assets/{dist-js-Rlh4FLH5.js → dist-js-DaJmKapi.js} +1 -1
- package/client/dist/assets/dropdown-menu-Bfp2CK6H.js +1 -0
- package/client/dist/assets/empty-state-D5w9OWj-.js +1 -0
- package/client/dist/assets/es2015-DfnECntk.js +41 -0
- package/client/dist/assets/esm-BKF6CE7v.js +1 -0
- package/client/dist/assets/event-BEnMLqAi.js +1 -0
- package/client/dist/assets/explore--NOz9LCN.js +1 -0
- package/client/dist/assets/explore-B2ulH6dO.js +1 -0
- package/client/dist/assets/explore-BD-QiLdg.js +1 -0
- package/client/dist/assets/explore-BOqd4_1j.js +1 -0
- package/client/dist/assets/explore-Be_Zh5zu.js +1 -0
- package/client/dist/assets/explore-CLjzPSKo.js +1 -0
- package/client/dist/assets/explore-D_-vHm29.js +1 -0
- package/client/dist/assets/explore-yEQTF6ro.js +1 -0
- package/client/dist/assets/file-text-CNXzL3wj.js +1 -0
- package/client/dist/assets/format-BODoFIw6.js +1 -0
- package/client/dist/assets/formatDistanceToNow-DLMIOS0N.js +1 -0
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-O61feXch.js +1 -0
- package/client/dist/assets/git-compare-arrows-Cu6tICCq.js +1 -0
- package/client/dist/assets/humanise-command-CB4ybLwq.js +1 -0
- package/client/dist/assets/inbox-BLZ8cm6_.js +1 -0
- package/client/dist/assets/inbox-BQ3VmNYY.js +1 -0
- package/client/dist/assets/inbox-BdcXWCuT.js +1 -0
- package/client/dist/assets/inbox-CF1PHjns.js +1 -0
- package/client/dist/assets/inbox-CFNPDhso.js +1 -0
- package/client/dist/assets/inbox-DIttK_NW.js +1 -0
- package/client/dist/assets/inbox-Dfdv1Ykl.js +1 -0
- package/client/dist/assets/inbox-JS1inmeO.js +1 -0
- package/client/dist/assets/index-4UWY7Xyz.css +2 -0
- package/client/dist/assets/index-DHzB0T26.js +120 -0
- package/client/dist/assets/integrations-BcKgzgPD.js +1 -0
- package/client/dist/assets/integrations-BmX_XyJq.js +1 -0
- package/client/dist/assets/integrations-CHpwMjlY.js +1 -0
- package/client/dist/assets/integrations-CT3kr8e-.js +1 -0
- package/client/dist/assets/integrations-C_5XAkgz.js +1 -0
- package/client/dist/assets/integrations-Ct9zLX7N.js +1 -0
- package/client/dist/assets/integrations-DEYemxUv.js +1 -0
- package/client/dist/assets/integrations-DWvsB_WB.js +1 -0
- package/client/dist/assets/{jira-Cq6yvN4q.js → jira-B_ERkFRv.js} +1 -1
- package/client/dist/assets/jira-Bn-A5lwD.js +1 -0
- package/client/dist/assets/jira-C71Ybnhp.js +1 -0
- package/client/dist/assets/jira-CkwjeJz6.js +1 -0
- package/client/dist/assets/jira-D9pSLXjI.js +1 -0
- package/client/dist/assets/jira-DBRS_lcp.js +1 -0
- package/client/dist/assets/jira-DHS6CsKh.js +1 -0
- package/client/dist/assets/jira-MInHRUb1.js +1 -0
- package/client/dist/assets/jira-api-DHme7Upx.js +1 -0
- package/client/dist/assets/jobs-BMLTDo63.js +1 -0
- package/client/dist/assets/jobs-BO8q4Mi1.js +1 -0
- package/client/dist/assets/jobs-Ck8uOWMM.js +1 -0
- package/client/dist/assets/jobs-CyFfPCpg.js +1 -0
- package/client/dist/assets/jobs-DT5s4fZ6.js +1 -0
- package/client/dist/assets/jobs-DZAgVPcD.js +1 -0
- package/client/dist/assets/jobs-b5gPYaKr.js +1 -0
- package/client/dist/assets/jobs-xsZK1440.js +1 -0
- package/client/dist/assets/launch-forecast-BTa-p3RP.js +1 -0
- package/client/dist/assets/{loop-layout-DtxX27Jz.css → loop-layout-DLioOiRN.css} +1 -1
- package/client/dist/assets/loop-layout-Sl9cfTvs.js +7 -0
- package/client/dist/assets/loops-BEEOVJDR.js +1 -0
- package/client/dist/assets/loops-BcrQ2vk7.js +1 -0
- package/client/dist/assets/loops-BjWxzJIZ.js +1 -0
- package/client/dist/assets/loops-BogV595N.js +1 -0
- package/client/dist/assets/loops-CU0BLZiz.js +1 -0
- package/client/dist/assets/loops-CrNBgi1G.js +1 -0
- package/client/dist/assets/loops-CwalwS_i.js +1 -0
- package/client/dist/assets/loops-_TDVN-fX.js +1 -0
- package/client/dist/assets/mcp-BNs8gxoL.js +1 -0
- package/client/dist/assets/mcp-BvRh_xO5.js +1 -0
- package/client/dist/assets/mcp-C2F1pghi.js +1 -0
- package/client/dist/assets/mcp-D9RLKAs2.js +1 -0
- package/client/dist/assets/mcp-DAghcsR0.js +1 -0
- package/client/dist/assets/mcp-DWWAPi1G.js +1 -0
- package/client/dist/assets/mcp-DbGSFC3f.js +1 -0
- package/client/dist/assets/mcp-FelCicrv.js +1 -0
- package/client/dist/assets/narration-C3NBkAR4.js +1 -0
- package/client/dist/assets/narration-CkoJq-Lf.js +1 -0
- package/client/dist/assets/narration-Cr0NeW9K.js +1 -0
- package/client/dist/assets/narration-DJUXOs-W.js +1 -0
- package/client/dist/assets/narration-DgL8TMvN.js +1 -0
- package/client/dist/assets/narration-DjBafgv0.js +1 -0
- package/client/dist/assets/narration-Dle6Iv0c.js +1 -0
- package/client/dist/assets/narration-MYlfktga.js +1 -0
- package/client/dist/assets/nav-BSQ8KW1c.js +1 -0
- package/client/dist/assets/nav-BauVof8Z.js +1 -0
- package/client/dist/assets/nav-BfOAH1se.js +1 -0
- package/client/dist/assets/nav-D3bOsipX.js +1 -0
- package/client/dist/assets/nav-DOMMhlLx.js +1 -0
- package/client/dist/assets/nav-DPzVlgZU.js +1 -0
- package/client/dist/assets/nav-DZJbFbah.js +1 -0
- package/client/dist/assets/nav-D_5aojd2.js +1 -0
- package/client/dist/assets/notify-error-BsWANx1T.js +1 -0
- package/client/dist/assets/onboarding-BdZQnNm3.js +1 -0
- package/client/dist/assets/onboarding-CJQEv1vp.js +1 -0
- package/client/dist/assets/onboarding-CWJGYUW3.js +1 -0
- package/client/dist/assets/onboarding-ChfYN7dA.js +1 -0
- package/client/dist/assets/onboarding-CjvDUR3V.js +1 -0
- package/client/dist/assets/onboarding-I6vS-zTB.js +1 -0
- package/client/dist/assets/onboarding-dgC_9dTB.js +1 -0
- package/client/dist/assets/onboarding-mlXSyKzX.js +1 -0
- package/client/dist/assets/origin-03nTuaOb.js +1 -0
- package/client/dist/assets/packet-BjpyRnZr.js +1 -0
- package/client/dist/assets/packet-BwgG5mBt.js +1 -0
- package/client/dist/assets/packet-C3eAUFkV.js +1 -0
- package/client/dist/assets/packet-C8wZuSld.js +1 -0
- package/client/dist/assets/packet-CNXEy_85.js +1 -0
- package/client/dist/assets/packet-DsV5Aa_8.js +1 -0
- package/client/dist/assets/packet-aasskOE7.js +1 -0
- package/client/dist/assets/packet-phxCc2gJ.js +1 -0
- package/client/dist/assets/page-header-BStSHkP8.js +1 -0
- package/client/dist/assets/project-repositories-DJPeAVBK.js +1 -0
- package/client/dist/assets/{provider-capabilities-lePfeT_Y.js → provider-capabilities-DtwcTme4.js} +1 -1
- package/client/dist/assets/recovery-BPDOsC92.js +1 -0
- package/client/dist/assets/recovery-BluNHoXM.js +1 -0
- package/client/dist/assets/recovery-CRvEmB0C.js +1 -0
- package/client/dist/assets/recovery-CeIoRnkR.js +1 -0
- package/client/dist/assets/recovery-DHCo8KGi.js +1 -0
- package/client/dist/assets/recovery-OxAIpbBF.js +1 -0
- package/client/dist/assets/recovery-XXexYGOJ.js +1 -0
- package/client/dist/assets/recovery-pITlc--v.js +1 -0
- package/client/dist/assets/refresh-cw-DfyTkbsf.js +1 -0
- package/client/dist/assets/select-xA3pSmqE.js +1 -0
- package/client/dist/assets/settings--yzDbX9r.js +1 -0
- package/client/dist/assets/settings-5_heTv8s.js +1 -0
- package/client/dist/assets/settings-BSf27MDg.js +1 -0
- package/client/dist/assets/settings-BSj6FakR.js +1 -0
- package/client/dist/assets/settings-BZDo_8Nn.js +1 -0
- package/client/dist/assets/settings-BdWgmNc0.js +1 -0
- package/client/dist/assets/settings-DRouxKqb.js +1 -0
- package/client/dist/assets/settings-DnWFoY-F.js +1 -0
- package/client/dist/assets/setup-BJWy62ri.js +1 -0
- package/client/dist/assets/setup-BgKOIuzc.js +1 -0
- package/client/dist/assets/setup-BvVIyUlz.js +1 -0
- package/client/dist/assets/setup-BxCk2pe1.js +1 -0
- package/client/dist/assets/setup-C-xQTL7R.js +1 -0
- package/client/dist/assets/setup-CbaVoiwV.js +1 -0
- package/client/dist/assets/setup-DxTBkX3P.js +1 -0
- package/client/dist/assets/setup-oGoVAzOD.js +1 -0
- package/client/dist/assets/specs-7tAb4IKr.js +1 -0
- package/client/dist/assets/specs-BUcY4s5v.js +1 -0
- package/client/dist/assets/specs-Bk5LeBAA.js +1 -0
- package/client/dist/assets/specs-CAA4Lrlg.js +1 -0
- package/client/dist/assets/specs-CS091AnA.js +1 -0
- package/client/dist/assets/specs-DJ6gmFcK.js +1 -0
- package/client/dist/assets/specs-GfCcrBSC.js +1 -0
- package/client/dist/assets/specs-xQgyc7WL.js +1 -0
- package/client/dist/assets/spending-CVH8VREb.js +1 -0
- package/client/dist/assets/square-Co6h5vZg.js +1 -0
- package/client/dist/assets/tauri-shell-43ixPGfa.js +2 -0
- package/client/dist/assets/terminal-0v9sBylD.js +1 -0
- package/client/dist/assets/terminal-AbUAmCxE.js +1 -0
- package/client/dist/assets/terminal-BJayIbIP.js +1 -0
- package/client/dist/assets/terminal-C2RUlXyi.js +1 -0
- package/client/dist/assets/terminal-CMmSb_Nj.js +1 -0
- package/client/dist/assets/terminal-DKWjj7HJ.js +1 -0
- package/client/dist/assets/terminal-KlFu7_pV.js +1 -0
- package/client/dist/assets/terminal-i99yqFvm.js +1 -0
- package/client/dist/assets/tickets-846Oq3i3.js +1 -0
- package/client/dist/assets/tickets-B5LJTe_b.js +1 -0
- package/client/dist/assets/tickets-Bfo2GGmH.js +1 -0
- package/client/dist/assets/tickets-BhdZ1yY2.js +1 -0
- package/client/dist/assets/tickets-CgjWJHAW.js +1 -0
- package/client/dist/assets/tickets-Ct9DbDUR.js +1 -0
- package/client/dist/assets/tickets-rptLEJB1.js +1 -0
- package/client/dist/assets/tickets-xQ6DpYdu.js +1 -0
- package/client/dist/assets/trending-up-BGvb4zZt.js +1 -0
- package/client/dist/assets/undo-6zuS4-sL.js +1 -0
- package/client/dist/assets/undo-BeM4gDOP.js +1 -0
- package/client/dist/assets/undo-BeppX8xS.js +1 -0
- package/client/dist/assets/undo-BqvNZ5MG.js +1 -0
- package/client/dist/assets/undo-BzwEPf_k.js +1 -0
- package/client/dist/assets/undo-CJ9Cu1NN.js +1 -0
- package/client/dist/assets/undo-ds8nMFbX.js +1 -0
- package/client/dist/assets/undo-x_gA-knG.js +1 -0
- package/client/dist/assets/useDesktop-BuOp2-MR.js +1 -0
- package/client/dist/assets/useRuntimeRuns-BRS6ncnO.js +1 -0
- package/client/dist/assets/utils-ELimjS2Y.js +1 -0
- package/client/dist/assets/wrench-Br2n1Lxd.js +1 -0
- package/client/dist/index.html +75 -60
- package/docs/ci-cd.md +29 -1
- package/docs/cli.md +10 -31
- package/docs/codex.md +1 -1
- package/docs/creating-specs.md +15 -12
- package/docs/customizing.md +16 -13
- package/docs/getting-started.md +12 -11
- package/docs/guide/de/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/de/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/de/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/de/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/de/getting-started/6-universal-search.md +34 -0
- package/docs/guide/de/insights/1-analytics-and-cost-tracking.md +20 -6
- package/docs/guide/de/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/de/insights/3-code-explorer.md +1 -1
- package/docs/guide/de/integrations/1-ai-providers.md +1 -1
- package/docs/guide/de/integrations/2-plugins.md +1 -1
- package/docs/guide/de/integrations/3-jira-integration.md +3 -3
- package/docs/guide/de/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/de/integrations/5-mcp-server.md +1 -1
- package/docs/guide/de/integrations/6-agent-chat.md +12 -5
- package/docs/guide/de/integrations/8-flow-mode.md +69 -0
- package/docs/guide/de/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/de/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/de/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/de/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/de/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/de/settings/1-themes.md +1 -1
- package/docs/guide/de/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/de/settings/5-project-environment.md +1 -1
- package/docs/guide/de/settings/6-updates.md +24 -0
- package/docs/guide/de/settings/7-existing-projects.md +33 -0
- package/docs/guide/de/settings/8-accessibility.md +23 -0
- package/docs/guide/de/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/de/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/de/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/en/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/en/getting-started/1-what-is-specrails.md +1 -1
- package/docs/guide/en/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/en/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/en/getting-started/5-the-dashboard-tour.md +52 -0
- package/docs/guide/en/getting-started/6-universal-search.md +34 -0
- package/docs/guide/en/insights/1-analytics-and-cost-tracking.md +24 -10
- package/docs/guide/en/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/en/insights/3-code-explorer.md +5 -5
- package/docs/guide/en/integrations/1-ai-providers.md +1 -1
- package/docs/guide/en/integrations/2-plugins.md +1 -1
- package/docs/guide/en/integrations/3-jira-integration.md +4 -4
- package/docs/guide/en/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/en/integrations/5-mcp-server.md +4 -4
- package/docs/guide/en/integrations/6-agent-chat.md +12 -5
- package/docs/guide/en/integrations/8-flow-mode.md +69 -0
- package/docs/guide/en/pipeline/1-rails-and-jobs.md +22 -3
- package/docs/guide/en/pipeline/2-the-job-detail-view.md +19 -7
- package/docs/guide/en/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/en/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/en/pipeline/5-the-loop-builder.md +2 -2
- package/docs/guide/en/settings/1-themes.md +1 -1
- package/docs/guide/en/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/en/settings/5-project-environment.md +1 -1
- package/docs/guide/en/settings/6-updates.md +24 -0
- package/docs/guide/en/settings/7-existing-projects.md +33 -0
- package/docs/guide/en/settings/8-accessibility.md +23 -0
- package/docs/guide/en/specs/1-specs-and-the-backlog.md +42 -6
- package/docs/guide/en/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/en/specs/3-add-spec-explore-mode.md +2 -2
- package/docs/guide/es/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/es/agents/2-profiles-and-the-balanced-default.md +1 -1
- package/docs/guide/es/agents/3-customizing-models-per-agent.md +2 -2
- package/docs/guide/es/agents/4-custom-agents-catalog.md +1 -1
- package/docs/guide/es/getting-started/1-what-is-specrails.md +3 -3
- package/docs/guide/es/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/es/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/es/getting-started/5-the-dashboard-tour.md +52 -0
- package/docs/guide/es/getting-started/6-universal-search.md +34 -0
- package/docs/guide/es/insights/1-analytics-and-cost-tracking.md +26 -12
- package/docs/guide/es/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/es/insights/3-code-explorer.md +5 -5
- package/docs/guide/es/integrations/1-ai-providers.md +1 -1
- package/docs/guide/es/integrations/2-plugins.md +1 -1
- package/docs/guide/es/integrations/3-jira-integration.md +4 -4
- package/docs/guide/es/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/es/integrations/5-mcp-server.md +4 -4
- package/docs/guide/es/integrations/6-agent-chat.md +14 -7
- package/docs/guide/es/integrations/7-local-engines.md +1 -1
- package/docs/guide/es/integrations/8-flow-mode.md +69 -0
- package/docs/guide/es/pipeline/1-rails-and-jobs.md +33 -13
- package/docs/guide/es/pipeline/2-the-job-detail-view.md +38 -26
- package/docs/guide/es/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/es/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/es/pipeline/5-the-loop-builder.md +4 -4
- package/docs/guide/es/settings/1-themes.md +1 -1
- package/docs/guide/es/settings/3-pipeline-telemetry-and-diagnostics.md +10 -10
- package/docs/guide/es/settings/5-project-environment.md +1 -1
- package/docs/guide/es/settings/6-updates.md +24 -0
- package/docs/guide/es/settings/7-existing-projects.md +33 -0
- package/docs/guide/es/settings/8-accessibility.md +23 -0
- package/docs/guide/es/specs/1-specs-and-the-backlog.md +43 -7
- package/docs/guide/es/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/es/specs/3-add-spec-explore-mode.md +3 -3
- package/docs/guide/fr/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/fr/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/fr/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/fr/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/fr/getting-started/6-universal-search.md +34 -0
- package/docs/guide/fr/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/fr/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/fr/insights/3-code-explorer.md +1 -1
- package/docs/guide/fr/integrations/1-ai-providers.md +1 -1
- package/docs/guide/fr/integrations/2-plugins.md +1 -1
- package/docs/guide/fr/integrations/3-jira-integration.md +3 -3
- package/docs/guide/fr/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/fr/integrations/5-mcp-server.md +1 -1
- package/docs/guide/fr/integrations/6-agent-chat.md +11 -4
- package/docs/guide/fr/integrations/8-flow-mode.md +69 -0
- package/docs/guide/fr/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/fr/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/fr/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/fr/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/fr/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/fr/settings/1-themes.md +1 -1
- package/docs/guide/fr/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/fr/settings/5-project-environment.md +1 -1
- package/docs/guide/fr/settings/6-updates.md +24 -0
- package/docs/guide/fr/settings/7-existing-projects.md +33 -0
- package/docs/guide/fr/settings/8-accessibility.md +23 -0
- package/docs/guide/fr/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/fr/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/fr/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/it/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/it/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/it/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/it/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/it/getting-started/6-universal-search.md +34 -0
- package/docs/guide/it/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/it/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/it/insights/3-code-explorer.md +1 -1
- package/docs/guide/it/integrations/1-ai-providers.md +1 -1
- package/docs/guide/it/integrations/2-plugins.md +1 -1
- package/docs/guide/it/integrations/3-jira-integration.md +3 -3
- package/docs/guide/it/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/it/integrations/5-mcp-server.md +1 -1
- package/docs/guide/it/integrations/6-agent-chat.md +11 -4
- package/docs/guide/it/integrations/8-flow-mode.md +69 -0
- package/docs/guide/it/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/it/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/it/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/it/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/it/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/it/settings/1-themes.md +1 -1
- package/docs/guide/it/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/it/settings/5-project-environment.md +1 -1
- package/docs/guide/it/settings/6-updates.md +24 -0
- package/docs/guide/it/settings/7-existing-projects.md +33 -0
- package/docs/guide/it/settings/8-accessibility.md +23 -0
- package/docs/guide/it/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/it/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/it/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/ja/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/ja/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/ja/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/ja/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/ja/getting-started/6-universal-search.md +34 -0
- package/docs/guide/ja/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/ja/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/ja/insights/3-code-explorer.md +1 -1
- package/docs/guide/ja/integrations/1-ai-providers.md +1 -1
- package/docs/guide/ja/integrations/2-plugins.md +1 -1
- package/docs/guide/ja/integrations/3-jira-integration.md +3 -3
- package/docs/guide/ja/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/ja/integrations/5-mcp-server.md +1 -1
- package/docs/guide/ja/integrations/6-agent-chat.md +11 -4
- package/docs/guide/ja/integrations/8-flow-mode.md +69 -0
- package/docs/guide/ja/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/ja/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/ja/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/ja/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/ja/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/ja/settings/1-themes.md +1 -1
- package/docs/guide/ja/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/ja/settings/5-project-environment.md +1 -1
- package/docs/guide/ja/settings/6-updates.md +24 -0
- package/docs/guide/ja/settings/7-existing-projects.md +33 -0
- package/docs/guide/ja/settings/8-accessibility.md +23 -0
- package/docs/guide/ja/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/ja/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/ja/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/pt/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/pt/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/pt/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/pt/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/pt/getting-started/6-universal-search.md +34 -0
- package/docs/guide/pt/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/pt/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/pt/insights/3-code-explorer.md +1 -1
- package/docs/guide/pt/integrations/1-ai-providers.md +1 -1
- package/docs/guide/pt/integrations/2-plugins.md +1 -1
- package/docs/guide/pt/integrations/3-jira-integration.md +3 -3
- package/docs/guide/pt/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/pt/integrations/5-mcp-server.md +1 -1
- package/docs/guide/pt/integrations/6-agent-chat.md +12 -5
- package/docs/guide/pt/integrations/8-flow-mode.md +69 -0
- package/docs/guide/pt/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/pt/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/pt/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/pt/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/pt/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/pt/settings/1-themes.md +1 -1
- package/docs/guide/pt/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/pt/settings/5-project-environment.md +1 -1
- package/docs/guide/pt/settings/6-updates.md +24 -0
- package/docs/guide/pt/settings/7-existing-projects.md +33 -0
- package/docs/guide/pt/settings/8-accessibility.md +23 -0
- package/docs/guide/pt/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/pt/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/pt/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/zh/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/zh/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/zh/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/zh/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/zh/getting-started/6-universal-search.md +34 -0
- package/docs/guide/zh/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/zh/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/zh/insights/3-code-explorer.md +1 -1
- package/docs/guide/zh/integrations/1-ai-providers.md +1 -1
- package/docs/guide/zh/integrations/2-plugins.md +1 -1
- package/docs/guide/zh/integrations/3-jira-integration.md +3 -3
- package/docs/guide/zh/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/zh/integrations/5-mcp-server.md +1 -1
- package/docs/guide/zh/integrations/6-agent-chat.md +11 -4
- package/docs/guide/zh/integrations/8-flow-mode.md +69 -0
- package/docs/guide/zh/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/zh/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/zh/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/zh/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/zh/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/zh/settings/1-themes.md +1 -1
- package/docs/guide/zh/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/zh/settings/5-project-environment.md +1 -1
- package/docs/guide/zh/settings/6-updates.md +24 -0
- package/docs/guide/zh/settings/7-existing-projects.md +33 -0
- package/docs/guide/zh/settings/8-accessibility.md +23 -0
- package/docs/guide/zh/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/zh/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/zh/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/internals/README.md +8 -0
- package/docs/internals/adding-a-provider.md +19 -2
- package/docs/internals/agent-actions-audit.md +101 -0
- package/docs/internals/agent-sessions.md +36 -1
- package/docs/internals/api-reference.md +190 -45
- package/docs/internals/architecture.md +53 -47
- package/docs/internals/companion-inbox-decisions.md +42 -0
- package/docs/internals/companion-rails-as-loops-contract.md +17 -6
- package/docs/internals/configuration.md +140 -9
- package/docs/internals/core-runtime-updates.md +4 -4
- package/docs/internals/existing-project-anchoring.md +168 -0
- package/docs/internals/flow-mode.md +668 -0
- package/docs/internals/legacy-implementation-notes.md +13 -0
- package/docs/internals/local-testing-feedback-2026-10.md +210 -0
- package/docs/internals/mcp-mission-audit.md +4 -0
- package/docs/internals/mission-rail-cards.md +10 -5
- package/docs/internals/mission-read-only-policy.md +152 -0
- package/docs/internals/modal-standard.md +181 -0
- package/docs/internals/openspec-workflow.md +32 -0
- package/docs/internals/operations-runbook.md +30 -0
- package/docs/internals/profiles.md +6 -3
- package/docs/internals/programmatic-agent-runtime.md +8 -0
- package/docs/internals/project-builder.md +1 -1
- package/docs/internals/review-packet.md +161 -9
- package/docs/internals/safe-pr-review-flow.md +135 -6
- package/docs/internals/source-map.md +413 -18
- package/docs/internals/spec-addenda.md +10 -0
- package/docs/internals/spec-triage.md +140 -0
- package/docs/internals/visual-design-audit.md +15 -2
- package/docs/local-providers.md +3 -0
- package/docs/mcp.md +21 -3
- package/docs/platforms/macos.md +1 -1
- package/docs/platforms/windows.md +2 -2
- package/docs/running-pipelines.md +22 -6
- package/docs/tracking-cost.md +54 -10
- package/local-runner/dist/specrails-local-runner.js +3851 -1178
- package/mcp-bridge/dist/specrails-mcp.js +3864 -1143
- package/package.json +10 -9
- package/server/dist/agent-mcp-config.js +37 -1
- package/server/dist/api-version.js +19 -0
- package/server/dist/command-resolver.js +4 -2
- package/server/dist/core-compat.js +1 -1
- package/server/dist/core-execution.js +2 -1
- package/server/dist/core-update-manager.js +71 -13
- package/server/dist/db/job-search.js +248 -0
- package/server/dist/db/jobs.js +6 -0
- package/server/dist/db/migrations.js +239 -0
- package/server/dist/db.js +9 -2
- package/server/dist/desktop-db.js +99 -5
- package/server/dist/desktop-router.js +126 -13
- package/server/dist/docs-router.js +67 -1
- package/server/dist/feature-flags.js +22 -0
- package/server/dist/index.js +30 -15
- package/server/dist/jira/jira-adf.js +13 -1
- package/server/dist/jira/jira-clarifications.js +146 -0
- package/server/dist/jira/jira-client.js +8 -1
- package/server/dist/jira/jira-db.js +41 -0
- package/server/dist/jira/jira-sync-manager.js +328 -25
- package/server/dist/mcp/guide.js +17 -7
- package/server/dist/mcp/tools/agents.js +1 -1
- package/server/dist/mcp/tools/analytics.js +15 -3
- package/server/dist/mcp/tools/app-settings.js +14 -1
- package/server/dist/mcp/tools/chat.js +1 -1
- package/server/dist/mcp/tools/env.js +4 -2
- package/server/dist/mcp/tools/jobs.js +96 -7
- package/server/dist/mcp/tools/loops.js +1 -1
- package/server/dist/mcp/tools/meta.js +10 -13
- package/server/dist/mcp/tools/rails.js +15 -1
- package/server/dist/mcp/tools/setup.js +1 -1
- package/server/dist/mcp/tools/specs.js +8 -5
- package/server/dist/mcp/tools/support.js +6 -3
- package/server/dist/mcp/tools/types.js +38 -1
- package/server/dist/mobile/mobile-admin-router.js +0 -16
- package/server/dist/mobile/mobile-gateway.js +0 -18
- package/server/dist/mobile/mobile-inbox.js +240 -0
- package/server/dist/mobile/mobile-missions.js +6 -8
- package/server/dist/mobile/mobile-router.js +9 -9
- package/server/dist/mobile/mobile-webrtc-peer.js +4 -54
- package/server/dist/mobile/mobile-ws.js +27 -4
- package/server/dist/modules/accounting/runtime/ai-invocations.js +4 -0
- package/server/dist/modules/accounting/runtime/decision-times.js +102 -0
- package/server/dist/modules/accounting/runtime/loop-economics.js +284 -0
- package/server/dist/modules/accounting/runtime/spending.js +7 -2
- package/server/dist/modules/accounting/runtime/what-if.js +87 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-bridge.js +86 -5
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-controls.js +28 -2
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-metrics.js +15 -2
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-settings-router.js +21 -2
- package/server/dist/modules/agent-runtime/runtime/core-capabilities.js +55 -0
- package/server/dist/modules/agent-sessions/adapters/host-process.js +1 -1
- package/server/dist/modules/agent-sessions/domain/availability.js +16 -0
- package/server/dist/modules/agent-sessions/domain/protocol.js +8 -1
- package/server/dist/modules/agent-sessions/index.js +3 -1
- package/server/dist/modules/agent-sessions/runtime/core-sessions-availability.js +16 -0
- package/server/dist/modules/agents/runtime/agent-refine-manager.js +3 -1
- package/server/dist/modules/agents/runtime/agent-store.js +60 -73
- package/server/dist/modules/audit/adapters/http.js +66 -0
- package/server/dist/modules/audit/adapters/runtime.js +60 -0
- package/server/dist/modules/audit/adapters/sqlite.js +73 -0
- package/server/dist/modules/audit/application.js +190 -0
- package/server/dist/modules/audit/domain.js +434 -0
- package/server/dist/modules/audit/index.js +27 -0
- package/server/dist/modules/audit/ports.js +2 -0
- package/server/dist/modules/browser/runtime/browser-capture-manager.js +18 -141
- package/server/dist/modules/browser/runtime/browser-capture-types.js +1 -10
- package/server/dist/modules/browser/runtime/browser-playwright.js +0 -19
- package/server/dist/modules/code/runtime/file-provenance.js +23 -0
- package/server/dist/modules/conversations/runtime/chat-manager.js +5 -2
- package/server/dist/modules/delivery/adapters/decisions/chains.js +1 -0
- package/server/dist/modules/delivery/adapters/decisions/create.js +19 -1
- package/server/dist/modules/delivery/adapters/decisions/discard.js +2 -0
- package/server/dist/modules/delivery/adapters/decisions/local-changes.js +427 -0
- package/server/dist/modules/delivery/adapters/decisions/merge-local.js +80 -6
- package/server/dist/modules/delivery/adapters/decisions/observations.js +5 -0
- package/server/dist/modules/delivery/adapters/decisions/ownership.js +2 -1
- package/server/dist/modules/delivery/adapters/decisions/transitions.js +9 -0
- package/server/dist/modules/delivery/adapters/review-wip-store.js +37 -0
- package/server/dist/modules/delivery/domain/review-wip.js +71 -0
- package/server/dist/modules/delivery/index.js +9 -1
- package/server/dist/modules/delivery/runtime/delivery-changes.js +355 -0
- package/server/dist/modules/delivery/runtime/delivery-evidence.js +249 -8
- package/server/dist/modules/delivery/runtime/flow-review-legacy.js +99 -0
- package/server/dist/modules/delivery/runtime/flow-review-outcome.js +107 -0
- package/server/dist/modules/delivery/runtime/flow-worktree-handoff.js +32 -0
- package/server/dist/modules/delivery/runtime/flow-worktree-return.js +87 -0
- package/server/dist/modules/delivery/runtime/isolated-worktree.js +380 -0
- package/server/dist/modules/delivery/runtime/local-restore-branch.js +325 -0
- package/server/dist/modules/delivery/runtime/local-restore-resolver.js +48 -0
- package/server/dist/modules/delivery/runtime/local-stash.js +423 -0
- package/server/dist/modules/delivery/runtime/multi-repo-execution.js +27 -1
- package/server/dist/modules/delivery/runtime/phase3-harvest.js +40 -0
- package/server/dist/modules/delivery/runtime/pr-body.js +50 -0
- package/server/dist/modules/delivery/runtime/rail-isolated-launch.js +169 -166
- package/server/dist/modules/delivery/runtime/rail-launch-parser.js +5 -2
- package/server/dist/modules/delivery/runtime/rail-pr-decision.js +7 -1
- package/server/dist/modules/delivery/runtime/rail-pr-store.js +193 -12
- package/server/dist/modules/delivery/runtime/rails-router.js +267 -5
- package/server/dist/modules/delivery/runtime/review-brief.js +208 -0
- package/server/dist/modules/delivery/runtime/review-packet.js +41 -2
- package/server/dist/modules/delivery/runtime/review-wip-gate.js +67 -0
- package/server/dist/modules/delivery/runtime/run-records.js +267 -0
- package/server/dist/modules/delivery/runtime/run-review-diagnosis.js +102 -0
- package/server/dist/modules/execution/adapters/budget-storage.js +76 -0
- package/server/dist/modules/execution/application/enforce-budget.js +17 -2
- package/server/dist/modules/execution/domain/agent-env.js +98 -0
- package/server/dist/modules/execution/domain/daily-budget.js +36 -0
- package/server/dist/modules/execution/domain/spend-caps.js +166 -0
- package/server/dist/modules/execution/index.js +34 -1
- package/server/dist/modules/execution/runtime/budget-overview.js +76 -0
- package/server/dist/modules/execution/runtime/daily-budget-gate.js +86 -0
- package/server/dist/modules/execution/runtime/interactive-job-session.js +8 -0
- package/server/dist/modules/execution/runtime/launch-forecast.js +33 -0
- package/server/dist/modules/execution/runtime/queue-manager.js +54 -15
- package/server/dist/modules/execution/runtime/run-duration-stats.js +31 -13
- package/server/dist/modules/flow/adapters/bindings.js +1089 -0
- package/server/dist/modules/flow/adapters/http.js +147 -0
- package/server/dist/modules/flow/adapters/sqlite.js +121 -0
- package/server/dist/modules/flow/application.js +805 -0
- package/server/dist/modules/flow/domain.js +790 -0
- package/server/dist/modules/flow/index.js +34 -0
- package/server/dist/modules/flow/ports.js +2 -0
- package/server/dist/modules/inbox/adapters/http.js +21 -0
- package/server/dist/modules/inbox/adapters/project-source.js +233 -0
- package/server/dist/modules/inbox/application.js +28 -0
- package/server/dist/modules/inbox/domain.js +43 -0
- package/server/dist/modules/inbox/index.js +10 -0
- package/server/dist/modules/inbox/ports.js +2 -0
- package/server/dist/modules/loops/runtime/loop-definition-run.js +9 -0
- package/server/dist/modules/loops/runtime/loop-definition.js +5 -2
- package/server/dist/modules/loops/runtime/loop-executors.js +90 -9
- package/server/dist/modules/loops/runtime/loop-factory.js +30 -2
- package/server/dist/modules/loops/runtime/loop-flow-spec-recipe.js +166 -0
- package/server/dist/modules/loops/runtime/loop-graph.js +1 -1
- package/server/dist/modules/loops/runtime/loop-role-engines.js +4 -1
- package/server/dist/modules/loops/runtime/loop-run-manager.js +267 -10
- package/server/dist/modules/loops/runtime/loop-runs-store.js +21 -5
- package/server/dist/modules/loops/runtime/loop-templates.js +55 -12
- package/server/dist/modules/missions/runtime/agent-chat-manager.js +283 -20
- package/server/dist/modules/missions/runtime/agent-chat-router.js +96 -21
- package/server/dist/modules/missions/runtime/agent-failure-briefing.js +11 -3
- package/server/dist/modules/missions/runtime/agent-fence-promotion.js +9 -1
- package/server/dist/modules/missions/runtime/agent-flow-prompt.js +64 -0
- package/server/dist/modules/missions/runtime/agent-input-store.js +9 -4
- package/server/dist/modules/missions/runtime/agent-operator-prompt.js +100 -14
- package/server/dist/modules/missions/runtime/agent-session-store.js +88 -27
- package/server/dist/modules/missions/runtime/core-session-runner.js +89 -9
- package/server/dist/modules/missions/runtime/flow-turn-context.js +17 -0
- package/server/dist/modules/missions/runtime/mission-core-sessions.js +295 -55
- package/server/dist/modules/missions/runtime/mission-run-notify.js +2 -0
- package/server/dist/modules/missions/runtime/mission-session-projector.js +56 -19
- package/server/dist/modules/missions/runtime/mission-tool-policy.js +47 -0
- package/server/dist/modules/onboarding/adapters/http.js +78 -0
- package/server/dist/modules/onboarding/adapters/providers.js +41 -0
- package/server/dist/modules/onboarding/adapters/runtime.js +130 -0
- package/server/dist/modules/onboarding/application.js +133 -0
- package/server/dist/modules/onboarding/catalog.js +217 -0
- package/server/dist/modules/onboarding/domain.js +102 -0
- package/server/dist/modules/onboarding/index.js +20 -0
- package/server/dist/modules/onboarding/ports.js +2 -0
- package/server/dist/modules/project-rules/adapters/http.js +91 -0
- package/server/dist/modules/project-rules/domain.js +122 -0
- package/server/dist/modules/project-rules/runtime/rules-inventory-runs.js +97 -0
- package/server/dist/modules/project-rules/runtime/rules-store.js +109 -0
- package/server/dist/modules/project-settings/adapters/http.js +13 -0
- package/server/dist/modules/project-settings/adapters/sqlite.js +78 -8
- package/server/dist/modules/project-settings/domain.js +47 -1
- package/server/dist/modules/project-settings/index.js +7 -1
- package/server/dist/modules/recovery/adapters/sqlite.js +28 -0
- package/server/dist/modules/recovery/domain.js +162 -0
- package/server/dist/modules/recovery/index.js +16 -0
- package/server/dist/modules/specs/adapters/timeline-http.js +101 -0
- package/server/dist/modules/specs/domain/handoff-labels.js +371 -0
- package/server/dist/modules/specs/domain/handoff.js +260 -0
- package/server/dist/modules/specs/domain/non-goals.js +101 -0
- package/server/dist/modules/specs/domain/timeline.js +164 -0
- package/server/dist/modules/specs/domain/triage.js +320 -0
- package/server/dist/modules/specs/runtime/contract-refine-runner.js +3 -2
- package/server/dist/modules/specs/runtime/generated-spec-parser.js +75 -0
- package/server/dist/modules/specs/runtime/proposal-manager.js +4 -3
- package/server/dist/modules/specs/runtime/smash-runner.js +2 -1
- package/server/dist/modules/specs/runtime/spec-addenda.js +31 -0
- package/server/dist/modules/specs/runtime/spec-draft-parser.js +6 -1
- package/server/dist/modules/specs/runtime/spec-generation.js +431 -0
- package/server/dist/modules/specs/runtime/spec-handoff.js +103 -0
- package/server/dist/modules/specs/runtime/spec-history.js +376 -0
- package/server/dist/modules/specs/runtime/spec-launcher-manager.js +4 -3
- package/server/dist/modules/specs/runtime/spec-search.js +117 -0
- package/server/dist/modules/specs/runtime/ticket-store.js +47 -2
- package/server/dist/modules/specs/runtime/ticket-trash-service.js +62 -0
- package/server/dist/modules/specs/runtime/ticket-trash.js +193 -0
- package/server/dist/modules/specs/runtime/triage-runner.js +171 -0
- package/server/dist/modules/specs/runtime/triage.js +365 -0
- package/server/dist/modules/terminals/domain/app-urls.js +96 -0
- package/server/dist/modules/terminals/runtime/app-urls.js +77 -0
- package/server/dist/modules/terminals/runtime/background-process-service.js +25 -28
- package/server/dist/openspec-shim.js +1 -1
- package/server/dist/project-env.js +60 -0
- package/server/dist/project-git.js +65 -0
- package/server/dist/project-registry.js +264 -27
- package/server/dist/project-router-background-processes.js +27 -3
- package/server/dist/project-router-git.js +30 -0
- package/server/dist/project-router-helpers.js +5 -30
- package/server/dist/project-router-jobs.js +49 -1
- package/server/dist/project-router-loop-runs.js +72 -2
- package/server/dist/project-router-rules.js +54 -0
- package/server/dist/project-router-search.js +52 -0
- package/server/dist/project-router-settings.js +6 -0
- package/server/dist/project-router-setup.js +1 -1
- package/server/dist/project-router-spending.js +138 -0
- package/server/dist/project-router-tickets.js +246 -427
- package/server/dist/project-router.js +7 -0
- package/server/dist/providers/claude-adapter.js +25 -3
- package/server/dist/providers/codex-adapter.js +9 -1
- package/server/dist/providers/gemini-adapter.js +6 -1
- package/server/dist/providers/kimi-adapter.js +2 -0
- package/server/dist/providers/local-adapter.js +2 -0
- package/server/dist/providers/runtime.js +8 -0
- package/server/dist/schemas/agent-runtime.schema.json +3 -1
- package/server/dist/schemas/workflow-definition.schema.json +1 -0
- package/server/dist/setup-manager.js +19 -1
- package/server/dist/transient-children.js +25 -8
- package/server/dist/update-channel.js +21 -0
- package/server/dist/util/search-snippet.js +74 -0
- package/server/dist/worktree-manager.js +19 -8
- package/client/dist/assets/ActivityFeedPage-Dtp7EyHc.js +0 -1
- package/client/dist/assets/AgentBrowserCapture-CLqlEFw8.js +0 -1
- package/client/dist/assets/AgentModeAnalyticsPane-B8_hM3Tw.js +0 -2
- package/client/dist/assets/AgentModeCodePane-CNF8ZNjE.js +0 -2
- package/client/dist/assets/AgentModeJobsPane-CJpJbO9m.js +0 -1
- package/client/dist/assets/AgentsPage-BC8XSR79.js +0 -120
- package/client/dist/assets/AnalyticsPage-Cdv4jLtW.js +0 -1
- package/client/dist/assets/BarChart-BDMqVFJy.js +0 -55
- package/client/dist/assets/CodePage-DI1kegAr.js +0 -3
- package/client/dist/assets/DesktopAnalyticsPage-Bdp8E8U6.js +0 -1
- package/client/dist/assets/DocsDialog-Bm4RS7FX.js +0 -11
- package/client/dist/assets/DocsPage-DihYcU8r.js +0 -11
- package/client/dist/assets/ExportDropdown-Bb1lHx3r.js +0 -1
- package/client/dist/assets/IntegrationsPage-EAipiDWm.js +0 -1
- package/client/dist/assets/InteractiveJobComposer-BO6ASN-2.js +0 -19
- package/client/dist/assets/JobDetailModal-CuPYq7tP.js +0 -1
- package/client/dist/assets/JobDetailPage-BusMjJi9.js +0 -1
- package/client/dist/assets/JobsPage-C0QbsF2d.js +0 -1
- package/client/dist/assets/LoopBuilderPage-B7TlU4iS.js +0 -1
- package/client/dist/assets/LoopPreviewModal-BRWtXOD2.js +0 -1
- package/client/dist/assets/LoopsPage-C4q1DmCE.js +0 -2
- package/client/dist/assets/MinimizedChatsContext-DHfigjHS.js +0 -1
- package/client/dist/assets/PluginsPage-Z1JHSMdR.js +0 -2
- package/client/dist/assets/ProjectSettingsDialog-BUNj0tvN.js +0 -1
- package/client/dist/assets/RepositoryDeliveries-B4ybHOyB.js +0 -5
- package/client/dist/assets/ReviewPacketPage-hwfPNjyy.js +0 -4
- package/client/dist/assets/TemplatePreviewModal-V7FpMWuw.js +0 -1
- package/client/dist/assets/TicketDetailModalContext-Dkwo2cDs.js +0 -16
- package/client/dist/assets/Trans-BbFxRFtR.js +0 -1
- package/client/dist/assets/activity-B-rp4h_v.js +0 -1
- package/client/dist/assets/activity-C6kJpm9q.js +0 -1
- package/client/dist/assets/activity-CGx4kb_j.js +0 -1
- package/client/dist/assets/activity-CnoX2bH7.js +0 -1
- package/client/dist/assets/activity-DAyekdlt.js +0 -1
- package/client/dist/assets/activity-DCxtpT7j.js +0 -1
- package/client/dist/assets/activity-DiyjsgQV.js +0 -1
- package/client/dist/assets/activity-JzwRaWPD.js +0 -1
- package/client/dist/assets/addspec-BOvgmcgk.js +0 -1
- package/client/dist/assets/addspec-Clmyfn_R.js +0 -1
- package/client/dist/assets/addspec-CsNaBpHp.js +0 -1
- package/client/dist/assets/addspec-D2tvWmmV.js +0 -1
- package/client/dist/assets/addspec-D3nFwvD0.js +0 -1
- package/client/dist/assets/addspec-DVLEhK3w.js +0 -1
- package/client/dist/assets/addspec-DXbK-tb0.js +0 -1
- package/client/dist/assets/addspec-OHG8DFEn.js +0 -1
- package/client/dist/assets/agent-5bSixVzz.js +0 -1
- package/client/dist/assets/agent-BR4EHfhq.js +0 -1
- package/client/dist/assets/agent-C0IKkJP8.js +0 -1
- package/client/dist/assets/agent-C7li9ayC.js +0 -1
- package/client/dist/assets/agent-D0dRmEen.js +0 -1
- package/client/dist/assets/agent-DZVGHm7H.js +0 -1
- package/client/dist/assets/agent-Dip4h2YE.js +0 -1
- package/client/dist/assets/agent-Pp-P-n1p.js +0 -1
- package/client/dist/assets/agentRuntime-BxF81z52.js +0 -1
- package/client/dist/assets/agentRuntime-BxYS5V7u.js +0 -1
- package/client/dist/assets/agentRuntime-Dc9HG3BA.js +0 -1
- package/client/dist/assets/agents-B6ZsnARo.js +0 -1
- package/client/dist/assets/agents-BORdhe0K.js +0 -1
- package/client/dist/assets/agents-C6aq9Oqs.js +0 -1
- package/client/dist/assets/agents-Cbsc4bcX.js +0 -1
- package/client/dist/assets/agents-D0uYR6hq.js +0 -1
- package/client/dist/assets/agents-Doe1sHY5.js +0 -1
- package/client/dist/assets/agents-DyNi_I9m.js +0 -1
- package/client/dist/assets/agents-StKxiTg0.js +0 -1
- package/client/dist/assets/agentstudio-7cYCXn-L.js +0 -1
- package/client/dist/assets/agentstudio-BHWQh8G3.js +0 -1
- package/client/dist/assets/agentstudio-BjnWHyRs.js +0 -1
- package/client/dist/assets/agentstudio-BkV8vcK4.js +0 -1
- package/client/dist/assets/agentstudio-BzugqB_N.js +0 -1
- package/client/dist/assets/agentstudio-CWbp7KvH.js +0 -1
- package/client/dist/assets/agentstudio-DG6plf5o.js +0 -1
- package/client/dist/assets/agentstudio-DkZVF-Cc.js +0 -1
- package/client/dist/assets/analytics-B1DIQd4m.js +0 -1
- package/client/dist/assets/analytics-BAIZ9vE_.js +0 -1
- package/client/dist/assets/analytics-BTqgmgBd.js +0 -1
- package/client/dist/assets/analytics-BWynXPEm.js +0 -1
- package/client/dist/assets/analytics-DGcUsQ44.js +0 -1
- package/client/dist/assets/analytics-GnSnpJ4W.js +0 -1
- package/client/dist/assets/analytics-TWgYaoO0.js +0 -1
- package/client/dist/assets/analytics-kJy6Tuko.js +0 -1
- package/client/dist/assets/atom-one-dark-qiGhVQxg.js +0 -1
- package/client/dist/assets/builder-B9gorTnT.js +0 -1
- package/client/dist/assets/builder-Bvw5s3Mi.js +0 -1
- package/client/dist/assets/builder-CL5l4dU3.js +0 -1
- package/client/dist/assets/builder-CVDTVrQX.js +0 -1
- package/client/dist/assets/builder-CpS9liE9.js +0 -1
- package/client/dist/assets/builder-DNctIL9Q.js +0 -1
- package/client/dist/assets/builder-De2NxX6o.js +0 -1
- package/client/dist/assets/builder-DeYT7Y-m.js +0 -1
- package/client/dist/assets/button-4FS1ZDTp.js +0 -1
- package/client/dist/assets/chat-D_I7nU5K.js +0 -1
- package/client/dist/assets/chevron-up-6EFqEHBj.js +0 -1
- package/client/dist/assets/chunk-OB3PAWPO-B1EMk45A.js +0 -3
- package/client/dist/assets/clsx-CjueKrWZ.js +0 -1
- package/client/dist/assets/code-B37GRg9C.js +0 -1
- package/client/dist/assets/code-BBOEZbf9.js +0 -1
- package/client/dist/assets/code-BRm-jcyx.js +0 -1
- package/client/dist/assets/code-CF7w62CR.js +0 -1
- package/client/dist/assets/code-CLuvJt2r.js +0 -1
- package/client/dist/assets/code-D0RCm59f.js +0 -1
- package/client/dist/assets/code-DaZ-ZwCT.js +0 -1
- package/client/dist/assets/code-iIHkGaCL.js +0 -1
- package/client/dist/assets/commands-0XjAftla.js +0 -1
- package/client/dist/assets/commands-BAWSYHjQ.js +0 -1
- package/client/dist/assets/commands-BBwowgiE.js +0 -1
- package/client/dist/assets/commands-BacjIZLN.js +0 -1
- package/client/dist/assets/commands-Bs62IAZ3.js +0 -1
- package/client/dist/assets/commands-CLPdh-Hh.js +0 -1
- package/client/dist/assets/commands-DlbFzgrp.js +0 -1
- package/client/dist/assets/commands-LjPSsi5F.js +0 -1
- package/client/dist/assets/common-Bdi0qN4S.js +0 -1
- package/client/dist/assets/common-Bhb9zN1P.js +0 -1
- package/client/dist/assets/common-BykKlZg1.js +0 -1
- package/client/dist/assets/common-CvnNNSJA.js +0 -1
- package/client/dist/assets/common-D5zk_mqq.js +0 -1
- package/client/dist/assets/common-DQNO_al5.js +0 -1
- package/client/dist/assets/common-Dax30Vmp.js +0 -1
- package/client/dist/assets/common-DkllpVSb.js +0 -1
- package/client/dist/assets/core-B3mKBIh5.js +0 -1
- package/client/dist/assets/dashboard-B1ndRHuC.js +0 -1
- package/client/dist/assets/dashboard-BX7KXiqA.js +0 -1
- package/client/dist/assets/dashboard-B_BSNxcN.js +0 -1
- package/client/dist/assets/dashboard-CCeFN7-V.js +0 -1
- package/client/dist/assets/dashboard-CRl0WtFJ.js +0 -1
- package/client/dist/assets/dashboard-XGdQ5mjw.js +0 -1
- package/client/dist/assets/dashboard-_oltA6Jd.js +0 -1
- package/client/dist/assets/dashboard-bAuf5KVk.js +0 -1
- package/client/dist/assets/dialog-DtdR05v1.js +0 -45
- package/client/dist/assets/dist-js-CJ_2XX1Y.js +0 -1
- package/client/dist/assets/event-Bt7f3wXe.js +0 -1
- package/client/dist/assets/explore-BG99VGpL.js +0 -1
- package/client/dist/assets/explore-C0TjprJW.js +0 -1
- package/client/dist/assets/explore-C2dgEo7q.js +0 -1
- package/client/dist/assets/explore-C8NDHbob.js +0 -1
- package/client/dist/assets/explore-CWWgzQGR.js +0 -1
- package/client/dist/assets/explore-CcQXpdtS.js +0 -1
- package/client/dist/assets/explore-DgBACn39.js +0 -1
- package/client/dist/assets/explore-DsXAgnmJ.js +0 -1
- package/client/dist/assets/file-text-C0blZHLh.js +0 -1
- package/client/dist/assets/formatDistanceToNow-NjPHBLfB.js +0 -1
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-vJ7qUoqN.js +0 -1
- package/client/dist/assets/git-branch-yf6LE1Bw.js +0 -1
- package/client/dist/assets/index-BgbCbIua.css +0 -2
- package/client/dist/assets/index-Ce4yZtKf.js +0 -83
- package/client/dist/assets/integrations-BkpRUbvp.js +0 -1
- package/client/dist/assets/integrations-Bo8qbJf4.js +0 -1
- package/client/dist/assets/integrations-CmSrKzZb.js +0 -1
- package/client/dist/assets/integrations-DGtq26Rr.js +0 -1
- package/client/dist/assets/integrations-De38GFnQ.js +0 -1
- package/client/dist/assets/integrations-Dw6zdtb-.js +0 -1
- package/client/dist/assets/integrations-Dwl9KQp0.js +0 -1
- package/client/dist/assets/integrations-Refg_d2I.js +0 -1
- package/client/dist/assets/jira-B6OYw4CJ.js +0 -1
- package/client/dist/assets/jira-BTF6RaOe.js +0 -1
- package/client/dist/assets/jira-CEetIB2q.js +0 -1
- package/client/dist/assets/jira-CIzsZLw5.js +0 -1
- package/client/dist/assets/jira-Daw9tmpI.js +0 -1
- package/client/dist/assets/jira-FXr7u2lh.js +0 -1
- package/client/dist/assets/jira-LaNQn7yl.js +0 -1
- package/client/dist/assets/jira-api-Cabj-H0J.js +0 -1
- package/client/dist/assets/job-time-BCL7wee9.js +0 -1
- package/client/dist/assets/jobs-ARwD85B9.js +0 -1
- package/client/dist/assets/jobs-BMF1w4WT.js +0 -1
- package/client/dist/assets/jobs-CBfzGLwm.js +0 -1
- package/client/dist/assets/jobs-CPjiluBY.js +0 -1
- package/client/dist/assets/jobs-CQQd58pY.js +0 -1
- package/client/dist/assets/jobs-De3EqaO0.js +0 -1
- package/client/dist/assets/jobs-Du9-Ei9a.js +0 -1
- package/client/dist/assets/jobs-qMHbnxwC.js +0 -1
- package/client/dist/assets/layers-BCLTgHXO.js +0 -1
- package/client/dist/assets/loader-circle-BqV9xYGf.js +0 -1
- package/client/dist/assets/loop-layout-CyXj9223.js +0 -7
- package/client/dist/assets/loops-B2PhQLKR.js +0 -1
- package/client/dist/assets/loops-BqbF46st.js +0 -1
- package/client/dist/assets/loops-CINnHbfI.js +0 -1
- package/client/dist/assets/loops-D-3XhH04.js +0 -1
- package/client/dist/assets/loops-DKkEEjZ_.js +0 -1
- package/client/dist/assets/loops-DzWR5-v6.js +0 -1
- package/client/dist/assets/loops-WyWDkhok.js +0 -1
- package/client/dist/assets/loops-scD5fIBf.js +0 -1
- package/client/dist/assets/mcp-6rMoZfEO.js +0 -1
- package/client/dist/assets/mcp-BD8sL5mP.js +0 -1
- package/client/dist/assets/mcp-BkcA3I5s.js +0 -1
- package/client/dist/assets/mcp-CCpSelOh.js +0 -1
- package/client/dist/assets/mcp-CUAN6ORK.js +0 -1
- package/client/dist/assets/mcp-CqbRxRTE.js +0 -1
- package/client/dist/assets/mcp-DP2YfVhO.js +0 -1
- package/client/dist/assets/mcp-DUVQamDz.js +0 -1
- package/client/dist/assets/narration-BEKMVxGm.js +0 -1
- package/client/dist/assets/narration-CjLwGKap.js +0 -1
- package/client/dist/assets/narration-DANWuGsW.js +0 -1
- package/client/dist/assets/narration-DGeEDWiT.js +0 -1
- package/client/dist/assets/narration-DJgpGwIP.js +0 -1
- package/client/dist/assets/narration-DbHnz0qV.js +0 -1
- package/client/dist/assets/narration-bZSsTZG8.js +0 -1
- package/client/dist/assets/narration-i6aKJKEc.js +0 -1
- package/client/dist/assets/nav--u7iPYlS.js +0 -1
- package/client/dist/assets/nav-C5Jgfaby.js +0 -1
- package/client/dist/assets/nav-CAna_Wpt.js +0 -1
- package/client/dist/assets/nav-CCLqeyHo.js +0 -1
- package/client/dist/assets/nav-Cf3c90Jk.js +0 -1
- package/client/dist/assets/nav-DMYQaQjR.js +0 -1
- package/client/dist/assets/nav-Df_PkZ9F.js +0 -1
- package/client/dist/assets/nav-VyNGBJwj.js +0 -1
- package/client/dist/assets/packet-8nn9RsU7.js +0 -1
- package/client/dist/assets/packet-B0H15elv.js +0 -1
- package/client/dist/assets/packet-BQvBgrwh.js +0 -1
- package/client/dist/assets/packet-BR7mO0-a.js +0 -1
- package/client/dist/assets/packet-BgcQ6q_K.js +0 -1
- package/client/dist/assets/packet-D2s92Jnn.js +0 -1
- package/client/dist/assets/packet-YbtcD1HS.js +0 -1
- package/client/dist/assets/packet-c0Qj_9eX.js +0 -1
- package/client/dist/assets/project-repositories-Cnnuj9Ia.js +0 -1
- package/client/dist/assets/rotate-ccw-DalJAQQX.js +0 -1
- package/client/dist/assets/settings-B1NV8Ow9.js +0 -1
- package/client/dist/assets/settings-BQ8XFZeE.js +0 -1
- package/client/dist/assets/settings-BRkxfBbO.js +0 -1
- package/client/dist/assets/settings-C_CcU1dP.js +0 -1
- package/client/dist/assets/settings-Cto9n0eL.js +0 -1
- package/client/dist/assets/settings-Pyw8uYtL.js +0 -1
- package/client/dist/assets/settings-b3HVCNNd.js +0 -1
- package/client/dist/assets/settings-hdive4u6.js +0 -1
- package/client/dist/assets/setup-Be485n2u.js +0 -1
- package/client/dist/assets/setup-CKGUxKr-.js +0 -1
- package/client/dist/assets/setup-Ck1Uwd7_.js +0 -1
- package/client/dist/assets/setup-Cm774a6v.js +0 -1
- package/client/dist/assets/setup-DIqMQpxt.js +0 -1
- package/client/dist/assets/setup-DfCsoNFL.js +0 -1
- package/client/dist/assets/setup-DkeE8mP0.js +0 -1
- package/client/dist/assets/setup-xVntVaz1.js +0 -1
- package/client/dist/assets/specs-Bqvtz2kz.js +0 -1
- package/client/dist/assets/specs-CKes-kz6.js +0 -1
- package/client/dist/assets/specs-CfXxPDNB.js +0 -1
- package/client/dist/assets/specs-CyF9HuTI.js +0 -1
- package/client/dist/assets/specs-DMj035Mt.js +0 -1
- package/client/dist/assets/specs-DfIdoU5L.js +0 -1
- package/client/dist/assets/specs-j5pGLQeU.js +0 -1
- package/client/dist/assets/specs-xW5pkkB7.js +0 -1
- package/client/dist/assets/spending-CQnrWiR3.js +0 -1
- package/client/dist/assets/square-D0JTbRSR.js +0 -1
- package/client/dist/assets/tauri-shell-DE6LfGPw.js +0 -2
- package/client/dist/assets/terminal-BAzpHtpY.js +0 -1
- package/client/dist/assets/terminal-C7dHeR3x.js +0 -1
- package/client/dist/assets/terminal-CMla5Qsz.js +0 -1
- package/client/dist/assets/terminal-CdNXH-n9.js +0 -1
- package/client/dist/assets/terminal-Cw5bZsmV.js +0 -1
- package/client/dist/assets/terminal-DFUP4eNv.js +0 -1
- package/client/dist/assets/terminal-DGqljeK_.js +0 -1
- package/client/dist/assets/terminal-cU70NodO.js +0 -1
- package/client/dist/assets/tickets--tiSOCcn.js +0 -1
- package/client/dist/assets/tickets-BUJ3DMWU.js +0 -1
- package/client/dist/assets/tickets-C1WNPODq.js +0 -1
- package/client/dist/assets/tickets-CDjhWmiE.js +0 -1
- package/client/dist/assets/tickets-CLgPC3uO.js +0 -1
- package/client/dist/assets/tickets-D41ZMQpf.js +0 -1
- package/client/dist/assets/tickets-DEaQC06P.js +0 -1
- package/client/dist/assets/tickets-kcMzbLCp.js +0 -1
- package/client/dist/assets/trash-D8zYUmTg.js +0 -1
- package/client/dist/assets/useDesktop-BjLT0_EE.js +0 -1
- package/client/dist/assets/useRuntimeRuns-C97qEqMg.js +0 -1
- package/client/dist/assets/useSharedWebSocket-Bj4LMp7b.js +0 -2
- package/client/dist/assets/utils-BC4DHlz2.js +0 -1
- package/docs/guide/en/getting-started/4-the-dashboard-tour.md +0 -48
- package/docs/guide/es/getting-started/4-the-dashboard-tour.md +0 -48
- package/server/dist/mobile/mobile-preview-channel.js +0 -179
- package/server/dist/mobile/mobile-preview.js +0 -366
- package/server/dist/modules/browser/domain/preview-origins.js +0 -117
- package/server/dist/modules/browser/runtime/preview-targets.js +0 -80
- /package/client/dist/assets/{atom-one-dark-B-oHczHB.css → DocView-B-oHczHB.css} +0 -0
- /package/docs/guide/de/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/en/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/es/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/fr/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/it/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/ja/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/pt/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/zh/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
|
@@ -6,9 +6,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
6
6
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
7
|
};
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.VALID_MODEL_ALIASES = exports.TERMINAL_PANEL_ENABLED = void 0;
|
|
10
|
-
exports.stripSpecMetadataSections = stripSpecMetadataSections;
|
|
11
|
-
exports.extractShortSummary = extractShortSummary;
|
|
9
|
+
exports.VALID_MODEL_ALIASES = exports.TERMINAL_PANEL_ENABLED = exports.extractShortSummary = exports.stripSpecMetadataSections = void 0;
|
|
12
10
|
exports.deriveFallbackShortSummary = deriveFallbackShortSummary;
|
|
13
11
|
exports.lightlyStructurePrompt = lightlyStructurePrompt;
|
|
14
12
|
exports.formatDescriptionWithCriteria = formatDescriptionWithCriteria;
|
|
@@ -259,33 +257,10 @@ function applyModelConfig(project) {
|
|
|
259
257
|
}
|
|
260
258
|
}
|
|
261
259
|
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
* dedicated fields and re-rendered by the UI.
|
|
267
|
-
*/
|
|
268
|
-
function stripSpecMetadataSections(buffer) {
|
|
269
|
-
return buffer
|
|
270
|
-
.replace(/##\s*Spec Title\s*\n+[^\n]*\n*/i, '')
|
|
271
|
-
.replace(/##\s*Labels\s*\n+(?:[^\n]+(?:\n(?!##)[^\n]+)*)\n*/i, '')
|
|
272
|
-
.replace(/##\s*Estimated Complexity\s*\n+(?:[^\n]+(?:\n(?!##)[^\n]+)*)\n*/i, '')
|
|
273
|
-
.replace(/##\s*Short Summary\s*\n+(?:[^\n]+(?:\n(?!##)[^\n]+)*)\n*/i, '')
|
|
274
|
-
.trim();
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Extract the `## Short Summary` section body from a generate-spec response.
|
|
278
|
-
* Returns the raw multi-line string (the ticket-store `clampShortSummary`
|
|
279
|
-
* helper applies trim, control-strip, and the 240-char hard cap before
|
|
280
|
-
* persistence). Returns `null` when the section is missing or empty.
|
|
281
|
-
*/
|
|
282
|
-
function extractShortSummary(buffer) {
|
|
283
|
-
const m = buffer.match(/##\s*Short Summary\s*\n+((?:(?!##)[^\n]+(?:\n(?!##)[^\n]+)*))/i);
|
|
284
|
-
if (!m)
|
|
285
|
-
return null;
|
|
286
|
-
const body = m[1].trim();
|
|
287
|
-
return body.length > 0 ? body : null;
|
|
288
|
-
}
|
|
260
|
+
// Generated-spec parsing lives with the specs capability (spec-generation use case).
|
|
261
|
+
var generated_spec_parser_1 = require("./modules/specs/runtime/generated-spec-parser");
|
|
262
|
+
Object.defineProperty(exports, "stripSpecMetadataSections", { enumerable: true, get: function () { return generated_spec_parser_1.stripSpecMetadataSections; } });
|
|
263
|
+
Object.defineProperty(exports, "extractShortSummary", { enumerable: true, get: function () { return generated_spec_parser_1.extractShortSummary; } });
|
|
289
264
|
function deriveFallbackShortSummary(title, description) {
|
|
290
265
|
const plain = description
|
|
291
266
|
.replace(/```[\s\S]*?```/g, ' ')
|
|
@@ -21,6 +21,10 @@ const metrics_1 = require("./modules/accounting/runtime/metrics");
|
|
|
21
21
|
const job_listing_1 = require("./modules/execution/runtime/job-listing");
|
|
22
22
|
const ticket_store_1 = require("./modules/specs/runtime/ticket-store");
|
|
23
23
|
const project_router_background_processes_1 = require("./project-router-background-processes");
|
|
24
|
+
const audit_1 = require("./modules/audit");
|
|
25
|
+
const sqlite_1 = require("./modules/recovery/adapters/sqlite");
|
|
26
|
+
const http_1 = require("./modules/audit/adapters/http");
|
|
27
|
+
const sqlite_2 = require("./modules/audit/adapters/sqlite");
|
|
24
28
|
const project_router_helpers_1 = require("./project-router-helpers");
|
|
25
29
|
function registerJobsRoutes(deps) {
|
|
26
30
|
const { router, ctx, ticketPath } = deps;
|
|
@@ -320,6 +324,19 @@ function registerJobsRoutes(deps) {
|
|
|
320
324
|
const c = ctx(req);
|
|
321
325
|
const jobId = req.params.id;
|
|
322
326
|
const loopPaused = c.loopRunManager?.isPaused?.(jobId) ?? false;
|
|
327
|
+
// A budget_paused loop resumes through its turn door too (any text): still
|
|
328
|
+
// over budget ⇒ the shared daily_budget_exceeded 409 body.
|
|
329
|
+
if (loopPaused && c.loopRunManager?.budgetPause?.(jobId)) {
|
|
330
|
+
const resumed = c.loopRunManager.resumeBudgetPause(jobId);
|
|
331
|
+
if (resumed.status === 'over_budget') {
|
|
332
|
+
res.status(409).json(resumed.rejection);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
if (resumed.status === 'resumed') {
|
|
336
|
+
res.status(202).json({ ok: true });
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
323
340
|
if (!(0, feature_flags_1.isInteractiveJobsEnabled)() && !loopPaused) {
|
|
324
341
|
res.status(403).json({ error: 'Interactive jobs are disabled on this server' });
|
|
325
342
|
return;
|
|
@@ -430,10 +447,30 @@ function registerJobsRoutes(deps) {
|
|
|
430
447
|
// Annotate each job with hasTelemetry so the client can show the
|
|
431
448
|
// Export diagnostic button without an extra round trip.
|
|
432
449
|
const jobsWithTelemetry = (0, db_1.getJobsWithTelemetry)(db);
|
|
450
|
+
// The first spec a job refers to names it in lists (palette, tables):
|
|
451
|
+
// `#14` alone says nothing. Resolved best-effort; an unreadable store
|
|
452
|
+
// never fails the listing.
|
|
453
|
+
let store;
|
|
454
|
+
const specOf = (command) => {
|
|
455
|
+
const [id] = (0, ticket_store_1.extractTicketIdsFromCommand)(command);
|
|
456
|
+
if (id === undefined)
|
|
457
|
+
return null;
|
|
458
|
+
if (store === undefined) {
|
|
459
|
+
try {
|
|
460
|
+
store = (0, ticket_store_1.readStore)(ticketPath(req) ?? (0, ticket_store_1.resolveTicketStoragePath)(ctx(req).project.path));
|
|
461
|
+
}
|
|
462
|
+
catch {
|
|
463
|
+
store = null;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
const title = store?.tickets[String(id)]?.title;
|
|
467
|
+
return title ? { ticketId: id, ticketTitle: title } : null;
|
|
468
|
+
};
|
|
433
469
|
const annotatedJobs = result.jobs.map((j) => ({
|
|
434
470
|
...j,
|
|
435
471
|
...((0, agent_runtime_controls_router_1.isRuntimeContinuationActive)(ctx(req), j.id) ? { status: 'running', finished_at: null } : {}),
|
|
436
472
|
hasTelemetry: jobsWithTelemetry.has(j.id),
|
|
473
|
+
...(specOf(j.command) ?? {}),
|
|
437
474
|
}));
|
|
438
475
|
res.json({ jobs: annotatedJobs, total: result.total });
|
|
439
476
|
});
|
|
@@ -450,6 +487,11 @@ function registerJobsRoutes(deps) {
|
|
|
450
487
|
return lines.join('\n');
|
|
451
488
|
};
|
|
452
489
|
// ─── Jobs export (must be before /:projectId/jobs/:id) ─────────────────────
|
|
490
|
+
// Agent actions audit exports (JSONL/CSV): one run, or a project-wide window.
|
|
491
|
+
(0, http_1.registerAgentAuditHttp)(router, (req) => {
|
|
492
|
+
const context = ctx(req);
|
|
493
|
+
return context.agentAudit?.service ?? (0, audit_1.createAgentAuditService)({ store: (0, sqlite_2.createSqliteAgentActionStore)(context.db) });
|
|
494
|
+
});
|
|
453
495
|
router.get('/:projectId/jobs/export', (req, res) => {
|
|
454
496
|
const format = req.query.format || 'json';
|
|
455
497
|
if (format !== 'json' && format !== 'csv') {
|
|
@@ -605,6 +647,7 @@ function registerJobsRoutes(deps) {
|
|
|
605
647
|
const loopRun = (0, loop_runs_store_1.getLoopRun)(db, jobId);
|
|
606
648
|
const loopPaused = loopRun?.status === 'paused' || (c.loopRunManager?.isPaused?.(jobId) ?? false);
|
|
607
649
|
const loopPauseReason = c.loopRunManager?.pausedReason?.(jobId) ?? null;
|
|
650
|
+
const loopPauseBudget = c.loopRunManager?.budgetPause?.(jobId) ?? null;
|
|
608
651
|
const pendingInterrupts = c.loopRunManager?.pendingInterrupts?.(jobId) ?? [];
|
|
609
652
|
if (job.status === 'running' && (((0, feature_flags_1.isInteractiveJobsEnabled)() && job.interactive) || loopPaused)) {
|
|
610
653
|
const qmMode = queueManager.getInteractiveSettleMode?.(jobId) ?? null;
|
|
@@ -612,7 +655,12 @@ function registerJobsRoutes(deps) {
|
|
|
612
655
|
interactiveAcceptingTurns = qmMode !== null || loopStepActive || loopPaused;
|
|
613
656
|
interactiveSettleMode = qmMode ?? ((loopStepActive || loopPaused || loopRun) ? 'auto' : null);
|
|
614
657
|
}
|
|
615
|
-
const annotated = { ...job, ...((0, agent_runtime_controls_router_1.isRuntimeContinuationActive)(c, jobId) ? { status: 'running', finished_at: null } : {}), hasTelemetry: (0, db_1.hasJobTelemetry)(db, jobId), tickets, interactiveSettleMode, interactiveAcceptingTurns, loopPaused, loopPauseReason, pendingInterrupts
|
|
658
|
+
const annotated = { ...job, ...((0, agent_runtime_controls_router_1.isRuntimeContinuationActive)(c, jobId) ? { status: 'running', finished_at: null } : {}), hasTelemetry: (0, db_1.hasJobTelemetry)(db, jobId), tickets, interactiveSettleMode, interactiveAcceptingTurns, loopPaused, loopPauseReason, ...(loopPauseBudget ? { loopPauseKind: 'budget_paused', loopPauseBudget: { scope: loopPauseBudget.scope, ...(loopPauseBudget.period ? { period: loopPauseBudget.period } : {}), budgetUsd: loopPauseBudget.budgetUsd, spentUsd: loopPauseBudget.spentUsd, resetsAt: loopPauseBudget.resetsAt } } : {}), pendingInterrupts, failureDiagnosis: (() => { try {
|
|
659
|
+
return (0, sqlite_1.readJobDiagnosis)(db, jobId, job.status);
|
|
660
|
+
}
|
|
661
|
+
catch {
|
|
662
|
+
return null;
|
|
663
|
+
} })() };
|
|
616
664
|
res.json({ job: annotated, events, phaseDefinitions });
|
|
617
665
|
});
|
|
618
666
|
router.delete('/:projectId/jobs', (req, res) => {
|
|
@@ -13,6 +13,7 @@ const db_1 = require("./db");
|
|
|
13
13
|
const loop_definition_controls_1 = require("./modules/loops/runtime/loop-definition-controls");
|
|
14
14
|
const loop_definition_recovery_1 = require("./modules/loops/runtime/loop-definition-recovery");
|
|
15
15
|
const run_duration_stats_1 = require("./modules/execution/runtime/run-duration-stats");
|
|
16
|
+
const launch_forecast_1 = require("./modules/execution/runtime/launch-forecast");
|
|
16
17
|
const loop_constants_1 = require("./modules/loops/runtime/loop-constants");
|
|
17
18
|
const providers_1 = require("./providers");
|
|
18
19
|
const runtime_1 = require("./providers/runtime");
|
|
@@ -22,6 +23,7 @@ const spec_models_1 = require("./modules/specs/runtime/spec-models");
|
|
|
22
23
|
const workspace_resolution_1 = require("./workspace-resolution");
|
|
23
24
|
const loop_command_catalog_1 = require("./modules/loops/runtime/loop-command-catalog");
|
|
24
25
|
const ids_1 = require("./ids");
|
|
26
|
+
const sqlite_1 = require("./modules/recovery/adapters/sqlite");
|
|
25
27
|
const project_repositories_1 = require("./project-repositories");
|
|
26
28
|
const multi_repo_execution_1 = require("./modules/delivery/runtime/multi-repo-execution");
|
|
27
29
|
const rails_store_1 = require("./modules/delivery/runtime/rails-store");
|
|
@@ -51,12 +53,36 @@ function registerLoopRunRoutes(deps) {
|
|
|
51
53
|
return;
|
|
52
54
|
}
|
|
53
55
|
const c = ctx(req), runId = String(req.params.id), run = (0, loop_runs_store_1.getLoopRun)(c.db, runId);
|
|
56
|
+
// rail-loop-budget-guard: a resident run paused on the daily budget (either
|
|
57
|
+
// engine) resumes in place once the budget allows the next step.
|
|
58
|
+
if (run && run.project_id === c.project.id && c.loopRunManager.budgetPause?.(runId)) {
|
|
59
|
+
// A per-run soft cap is answered explicitly: `{ runCap: 'ignore' }` continues
|
|
60
|
+
// without it, `{ runCapUsd: n }` raises it. Anything else leaves it standing.
|
|
61
|
+
const body = (req.body ?? {});
|
|
62
|
+
const choice = body.runCap === 'ignore' ? { ignore: true }
|
|
63
|
+
: typeof body.runCapUsd === 'number' && Number.isFinite(body.runCapUsd) && body.runCapUsd > 0 ? { raiseTo: body.runCapUsd } : undefined;
|
|
64
|
+
const resumed = c.loopRunManager.resumeBudgetPause(runId, choice);
|
|
65
|
+
if (resumed.status === 'over_budget') {
|
|
66
|
+
res.status(409).json(resumed.rejection);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (resumed.status === 'resumed') {
|
|
70
|
+
res.status(202).json({ loopRunId: runId, resumed: true });
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
54
74
|
if (!run || run.project_id !== c.project.id || run.engine_version !== 2) {
|
|
55
75
|
res.status(404).json({ error: 'Definition run not found' });
|
|
56
76
|
return;
|
|
57
77
|
}
|
|
58
78
|
try {
|
|
59
79
|
(0, process_admission_1.assertProcessAdmission)(c.project.id);
|
|
80
|
+
// Continuing a workflow is cost-incurring: same gate as a rail launch.
|
|
81
|
+
const budgetRejection = c.dailyBudgetRejection?.() ?? null;
|
|
82
|
+
if (budgetRejection) {
|
|
83
|
+
res.status(409).json(budgetRejection);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
60
86
|
const successor = (0, loop_runs_store_1.readDefinitionSuccessor)(c.db, runId);
|
|
61
87
|
if (successor) {
|
|
62
88
|
res.status(409).json({ error: 'runtime_fork_owns_worktree', loopRunId: successor });
|
|
@@ -239,11 +265,19 @@ function registerLoopRunRoutes(deps) {
|
|
|
239
265
|
const usageAvailable = !run.provider
|
|
240
266
|
|| !(0, providers_1.hasAdapter)(run.provider)
|
|
241
267
|
|| (0, providers_1.getAdapter)(run.provider).capabilities.reportsUsage !== false;
|
|
268
|
+
const { failure_diagnosis: _stored, ...publicRun } = run;
|
|
269
|
+
const failureDiagnosis = (() => { try {
|
|
270
|
+
return (0, sqlite_1.readRunDiagnosis)(c.db, run.id);
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
return null;
|
|
274
|
+
} })();
|
|
242
275
|
res.json({
|
|
243
276
|
loopRun: usageAvailable
|
|
244
|
-
? { ...
|
|
277
|
+
? { ...publicRun, failureDiagnosis, usage_available: true }
|
|
245
278
|
: {
|
|
246
|
-
...
|
|
279
|
+
...publicRun,
|
|
280
|
+
failureDiagnosis,
|
|
247
281
|
total_cost_usd: null,
|
|
248
282
|
total_tokens: null,
|
|
249
283
|
usage_available: false,
|
|
@@ -266,6 +300,33 @@ function registerLoopRunRoutes(deps) {
|
|
|
266
300
|
: (0, run_duration_stats_1.getJobCommandDurationRange)(c.db, (0, run_duration_stats_1.jobCommandShape)(command));
|
|
267
301
|
res.json({ range, minSamples: run_duration_stats_1.MIN_DURATION_SAMPLES });
|
|
268
302
|
});
|
|
303
|
+
// Launch forecast ("Usually 6-9 min · $2-4 for runs like this"): the same
|
|
304
|
+
// measured samples as run-duration-range, narrowed to the provider about to
|
|
305
|
+
// run, plus a provider-reported cost band and the tightest daily budget's
|
|
306
|
+
// headroom. Read-only. `time`/`cost` are null below the sample floor — the
|
|
307
|
+
// caller MUST say "Not enough history yet", never guess. Costs here are an
|
|
308
|
+
// estimate from past runs, never a billed figure.
|
|
309
|
+
router.get('/:projectId/launch-forecast', (req, res) => {
|
|
310
|
+
const c = ctx(req);
|
|
311
|
+
const text = (value) => (typeof value === 'string' && value.length > 0 && value.length <= 200 ? value : null);
|
|
312
|
+
const loopId = text(req.query.loopId);
|
|
313
|
+
const command = text(req.query.command);
|
|
314
|
+
const provider = text(req.query.provider);
|
|
315
|
+
if (!loopId && !command) {
|
|
316
|
+
res.status(400).json({ error: 'loopId or command is required' });
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
if (provider && !/^[a-z0-9][a-z0-9_-]{0,63}$/i.test(provider)) {
|
|
320
|
+
res.status(400).json({ error: 'provider is invalid' });
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
const forecast = (0, launch_forecast_1.getLaunchForecast)(c.db, c.project.id, {
|
|
324
|
+
loopId,
|
|
325
|
+
commandShape: command ? (0, run_duration_stats_1.jobCommandShape)(command) : null,
|
|
326
|
+
provider,
|
|
327
|
+
});
|
|
328
|
+
res.json({ ...forecast, budget: c.dailyBudgetHeadroom?.() ?? null });
|
|
329
|
+
});
|
|
269
330
|
router.post('/:projectId/loop-runs', async (req, res) => {
|
|
270
331
|
if (!(0, feature_flags_1.isLoopsEnabled)()) {
|
|
271
332
|
res.status(404).json({ error: 'Not Found' });
|
|
@@ -274,6 +335,8 @@ function registerLoopRunRoutes(deps) {
|
|
|
274
335
|
const c = ctx(req);
|
|
275
336
|
const body = req.body ?? {};
|
|
276
337
|
const { loopId, aiEngine, provider: providerAlias, reasoning_effort, model: requestedModel } = body;
|
|
338
|
+
// Per-launch override of the per-run soft cap: a number > 0 caps this run, 0 waives the default.
|
|
339
|
+
const runCapUsd = typeof body.runCapUsd === 'number' && Number.isFinite(body.runCapUsd) && body.runCapUsd >= 0 ? body.runCapUsd : undefined;
|
|
277
340
|
if (typeof loopId !== 'string' || !loopId) {
|
|
278
341
|
res.status(400).json({ error: 'loopId is required' });
|
|
279
342
|
return;
|
|
@@ -364,6 +427,12 @@ function registerLoopRunRoutes(deps) {
|
|
|
364
427
|
res.status(error instanceof project_repositories_1.RepositoryValidationError ? error.status : error instanceof process_admission_1.ProcessAdmissionClosedError ? 409 : 400).json({ error: error instanceof Error ? error.message : 'Invalid repository scope' });
|
|
365
428
|
return;
|
|
366
429
|
}
|
|
430
|
+
// Standalone loop runs are cost-incurring launches too (rail-loop-budget-guard).
|
|
431
|
+
const budgetRejection = c.dailyBudgetRejection?.() ?? null;
|
|
432
|
+
if (budgetRejection) {
|
|
433
|
+
res.status(409).json(budgetRejection);
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
367
436
|
if (repositoryIds.length !== 1 || repositoryIds[0] !== primary.id) {
|
|
368
437
|
if (!(0, rail_isolation_1.isolationApplies)({ loopsEnabled: true, scope: 'all', ticketCount: 1, readOnly: false })) {
|
|
369
438
|
res.status(409).json({ error: 'repository_isolation_required' });
|
|
@@ -430,6 +499,7 @@ function registerLoopRunRoutes(deps) {
|
|
|
430
499
|
provider,
|
|
431
500
|
model,
|
|
432
501
|
effort,
|
|
502
|
+
...(runCapUsd !== undefined ? { runCapUsd } : {}),
|
|
433
503
|
})
|
|
434
504
|
.then((r) => c.onLoopRunFinished(r.runId, r.outcome, r.stallReason ? { stallReason: r.stallReason } : undefined))
|
|
435
505
|
.catch((err) => {
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerRulesRoutes = registerRulesRoutes;
|
|
4
|
+
const core_capabilities_1 = require("./modules/agent-runtime/runtime/core-capabilities");
|
|
5
|
+
const http_1 = require("./modules/project-rules/adapters/http");
|
|
6
|
+
const rules_inventory_runs_1 = require("./modules/project-rules/runtime/rules-inventory-runs");
|
|
7
|
+
const ticket_store_1 = require("./modules/specs/runtime/ticket-store");
|
|
8
|
+
function registerRulesRoutes({ router, ctx, ticketPath }) {
|
|
9
|
+
// Phase-3 Core capabilities for the settings UI (each surface gates on its own flag).
|
|
10
|
+
router.get('/:projectId/core/phase3-capabilities', async (_req, res) => {
|
|
11
|
+
res.json(await (0, core_capabilities_1.corePhase3Capabilities)());
|
|
12
|
+
});
|
|
13
|
+
(0, http_1.registerProjectRulesHttp)(router, (req) => {
|
|
14
|
+
const context = ctx(req);
|
|
15
|
+
return {
|
|
16
|
+
project: { id: context.project.id, slug: context.project.slug, path: context.project.path },
|
|
17
|
+
supported: async () => (await (0, core_capabilities_1.corePhase3Capabilities)()).rulesInventory,
|
|
18
|
+
createRuleSpec: (fields) => {
|
|
19
|
+
const now = new Date().toISOString();
|
|
20
|
+
let created;
|
|
21
|
+
const store = (0, ticket_store_1.mutateStore)(ticketPath(req), (s) => {
|
|
22
|
+
const id = s.next_id++;
|
|
23
|
+
created = {
|
|
24
|
+
id,
|
|
25
|
+
title: fields.title,
|
|
26
|
+
description: fields.description,
|
|
27
|
+
status: 'todo',
|
|
28
|
+
priority: 'medium',
|
|
29
|
+
labels: fields.labels,
|
|
30
|
+
assignee: null,
|
|
31
|
+
prerequisites: [],
|
|
32
|
+
metadata: {},
|
|
33
|
+
comments: [],
|
|
34
|
+
origin_conversation_id: null,
|
|
35
|
+
is_epic: false,
|
|
36
|
+
parent_epic_id: null,
|
|
37
|
+
execution_order: null,
|
|
38
|
+
short_summary: null,
|
|
39
|
+
nonGoals: fields.nonGoals,
|
|
40
|
+
created_at: now,
|
|
41
|
+
updated_at: now,
|
|
42
|
+
created_by: 'rules-inventory',
|
|
43
|
+
source: 'rules',
|
|
44
|
+
};
|
|
45
|
+
s.tickets[String(id)] = created;
|
|
46
|
+
});
|
|
47
|
+
context.ticketWatcher.notifyDesktopWrite(store.revision);
|
|
48
|
+
const message = { type: 'ticket_created', ticket: created, projectId: context.project.id, timestamp: now };
|
|
49
|
+
context.broadcast(message);
|
|
50
|
+
return created;
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}, rules_inventory_runs_1.rulesInventoryRuns);
|
|
54
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerSearchRoutes = registerSearchRoutes;
|
|
4
|
+
const db_1 = require("./db");
|
|
5
|
+
const ticket_store_1 = require("./modules/specs/runtime/ticket-store");
|
|
6
|
+
const spec_search_1 = require("./modules/specs/runtime/spec-search");
|
|
7
|
+
const MAX_QUERY_LENGTH = 200;
|
|
8
|
+
function parseQuery(req, res) {
|
|
9
|
+
const q = typeof req.query.q === 'string' ? req.query.q.trim() : '';
|
|
10
|
+
if (!q) {
|
|
11
|
+
res.status(400).json({ error: 'q is required' });
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
if (q.length > MAX_QUERY_LENGTH || /[\r\n]/.test(q)) {
|
|
15
|
+
res.status(400).json({ error: `q must be a single line of at most ${MAX_QUERY_LENGTH} characters` });
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return q;
|
|
19
|
+
}
|
|
20
|
+
function parseLimit(raw, fallback, max) {
|
|
21
|
+
const n = typeof raw === 'string' ? Number.parseInt(raw, 10) : NaN;
|
|
22
|
+
return Number.isFinite(n) && n > 0 ? Math.min(n, max) : fallback;
|
|
23
|
+
}
|
|
24
|
+
function registerSearchRoutes({ router, ctx, ticketPath }) {
|
|
25
|
+
router.get('/:projectId/search/specs', (req, res) => {
|
|
26
|
+
const q = parseQuery(req, res);
|
|
27
|
+
if (q === null)
|
|
28
|
+
return;
|
|
29
|
+
try {
|
|
30
|
+
const store = (0, ticket_store_1.readStore)(ticketPath(req));
|
|
31
|
+
const limit = parseLimit(req.query.limit, spec_search_1.SPEC_SEARCH_DEFAULT_LIMIT, spec_search_1.SPEC_SEARCH_MAX_LIMIT);
|
|
32
|
+
res.json({ results: (0, spec_search_1.searchSpecs)(Object.values(store.tickets), q, limit) });
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
console.error('[project-router] spec search error:', err);
|
|
36
|
+
res.status(500).json({ error: 'Failed to search specs' });
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
router.get('/:projectId/search/jobs', (req, res) => {
|
|
40
|
+
const q = parseQuery(req, res);
|
|
41
|
+
if (q === null)
|
|
42
|
+
return;
|
|
43
|
+
try {
|
|
44
|
+
const limit = parseLimit(req.query.limit, db_1.JOB_SEARCH_DEFAULT_LIMIT, db_1.JOB_SEARCH_MAX_LIMIT);
|
|
45
|
+
res.json({ results: (0, db_1.searchJobs)(ctx(req).db, q, limit) });
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
console.error('[project-router] job search error:', err);
|
|
49
|
+
res.status(500).json({ error: 'Failed to search job logs' });
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
@@ -10,6 +10,8 @@ const project_settings_1 = require("./modules/project-settings");
|
|
|
10
10
|
const sqlite_1 = require("./modules/project-settings/adapters/sqlite");
|
|
11
11
|
const http_1 = require("./modules/project-settings/adapters/http");
|
|
12
12
|
const project_env_1 = require("./project-env");
|
|
13
|
+
const registry_1 = require("./providers/registry");
|
|
14
|
+
const runtime_1 = require("./providers/runtime");
|
|
13
15
|
const fs_1 = __importDefault(require("fs"));
|
|
14
16
|
const path_1 = __importDefault(require("path"));
|
|
15
17
|
const db_1 = require("./db");
|
|
@@ -53,6 +55,10 @@ function registerSettingsRoutes(deps) {
|
|
|
53
55
|
return (0, project_env_1.getProjectEnvStatus)(db);
|
|
54
56
|
},
|
|
55
57
|
});
|
|
58
|
+
// Value-free minimal agent environment report (names, never values).
|
|
59
|
+
(0, http_1.registerAgentEnvStatusHttp)(router, {
|
|
60
|
+
read: req => (0, project_env_1.getProjectAgentEnvStatus)(ctx(req).db, (0, registry_1.listAdapters)().map(adapter => ({ id: adapter.id, displayName: adapter.displayName, allowlist: (0, runtime_1.providerEnvAllowlist)(adapter) }))),
|
|
61
|
+
});
|
|
56
62
|
// ─── Per-project Quick mode Contract Refine last-used value ─────────────────
|
|
57
63
|
router.get('/:projectId/add-spec-quick-contract-refine-last', (req, res) => {
|
|
58
64
|
res.json({
|
|
@@ -175,7 +175,7 @@ function registerSetupRoutes(deps) {
|
|
|
175
175
|
// execution cwd (including relocated workspaces) and understands Kimi's
|
|
176
176
|
// materialized headless skills rather than probing only Claude markdown.
|
|
177
177
|
if (!ctx(req).proposalManager.canStartExploration()) {
|
|
178
|
-
res.status(400).json({ error: 'This project does not have the /specrails:propose-feature command installed.
|
|
178
|
+
res.status(400).json({ error: 'This project does not have the /specrails:propose-feature command installed. Update Specrails Core from Settings → Updates.' });
|
|
179
179
|
return;
|
|
180
180
|
}
|
|
181
181
|
const id = (0, ids_1.newId)();
|
|
@@ -8,7 +8,14 @@ const config_1 = require("./config");
|
|
|
8
8
|
const workspace_resolution_1 = require("./workspace-resolution");
|
|
9
9
|
const ai_invocations_1 = require("./modules/accounting/runtime/ai-invocations");
|
|
10
10
|
const spending_1 = require("./modules/accounting/runtime/spending");
|
|
11
|
+
const decision_times_1 = require("./modules/accounting/runtime/decision-times");
|
|
12
|
+
const what_if_1 = require("./modules/accounting/runtime/what-if");
|
|
13
|
+
const budget_overview_1 = require("./modules/execution/runtime/budget-overview");
|
|
14
|
+
const budget_storage_1 = require("./modules/execution/adapters/budget-storage");
|
|
15
|
+
const desktop_db_1 = require("./desktop-db");
|
|
16
|
+
const loop_economics_1 = require("./modules/accounting/runtime/loop-economics");
|
|
11
17
|
const ticket_store_1 = require("./modules/specs/runtime/ticket-store");
|
|
18
|
+
const loops_store_1 = require("./modules/loops/runtime/loops-store");
|
|
12
19
|
const legacy_launch_telemetry_1 = require("./modules/loops/runtime/legacy-launch-telemetry");
|
|
13
20
|
/**
|
|
14
21
|
* Parse + clamp a `tzOffsetMinutes` query param (minutes east of UTC, the value
|
|
@@ -56,6 +63,73 @@ function registerSpendingRoutes(deps) {
|
|
|
56
63
|
res.status(503).json({ error: 'legacy_telemetry_unavailable' });
|
|
57
64
|
}
|
|
58
65
|
});
|
|
66
|
+
// Time to decision / merge per delivery (delivery-decision-times). Unknown
|
|
67
|
+
// instants stay counted as unknown — never folded into a zero duration.
|
|
68
|
+
router.get('/:projectId/analytics/decision-times', (req, res) => {
|
|
69
|
+
const filters = (0, spending_1.parseSpendingFilters)(req.query);
|
|
70
|
+
if (filters.period && !['7d', '30d', '90d', 'all', 'custom'].includes(filters.period)) {
|
|
71
|
+
res.status(400).json({ error: 'invalid_period' });
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (filters.period === 'custom' && (!filters.from || !filters.to)) {
|
|
75
|
+
res.status(400).json({ error: 'from and to are required for custom period' });
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
res.json((0, decision_times_1.getDecisionTimes)(ctx(req).db, filters));
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
console.error('[decision-times] query failed:', err);
|
|
83
|
+
res.status(500).json({ error: 'decision_times_unavailable' });
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// Loop economics per loop (loop-economics-analytics). Unknown values stay
|
|
87
|
+
// null — no data — never a manufactured zero.
|
|
88
|
+
router.get('/:projectId/analytics/loop-economics', (req, res) => {
|
|
89
|
+
const filters = (0, spending_1.parseSpendingFilters)(req.query);
|
|
90
|
+
if (filters.period && !['7d', '30d', '90d', 'all', 'custom'].includes(filters.period)) {
|
|
91
|
+
res.status(400).json({ error: 'invalid_period' });
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (filters.period === 'custom' && (!filters.from || !filters.to)) {
|
|
95
|
+
res.status(400).json({ error: 'from and to are required for custom period' });
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// Escaped-defect links come from the ticket store; an unreadable store
|
|
99
|
+
// leaves the metric untracked (null) rather than zero.
|
|
100
|
+
let regressionLinks = [];
|
|
101
|
+
try {
|
|
102
|
+
regressionLinks = (0, ticket_store_1.listRegressionLinks)((0, ticket_store_1.readStore)(ticketPath(req)));
|
|
103
|
+
}
|
|
104
|
+
catch { /* untracked */ }
|
|
105
|
+
// Saved loops are global (desktop DB). Only published ones are listed as
|
|
106
|
+
// "no data" rows; an unavailable registry just omits them.
|
|
107
|
+
let knownLoops = [];
|
|
108
|
+
try {
|
|
109
|
+
const desktopDb = registry?.desktopDb;
|
|
110
|
+
if (desktopDb)
|
|
111
|
+
knownLoops = (0, loops_store_1.listLoops)(desktopDb).filter((loop) => loop.status === 'published').map((loop) => ({ id: loop.id, name: loop.name }));
|
|
112
|
+
}
|
|
113
|
+
catch { /* no saved loops */ }
|
|
114
|
+
try {
|
|
115
|
+
res.json((0, loop_economics_1.getLoopEconomics)(ctx(req).db, filters, { regressionLinks, knownLoops }));
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
console.error('[loop-economics] query failed:', err);
|
|
119
|
+
res.status(500).json({ error: 'loop_economics_unavailable' });
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
// Recent delivered deliveries — source of the ticket "Regression of" picker.
|
|
123
|
+
router.get('/:projectId/analytics/loop-economics/deliveries', (req, res) => {
|
|
124
|
+
const limit = typeof req.query.limit === 'string' ? parseInt(req.query.limit, 10) : 50;
|
|
125
|
+
try {
|
|
126
|
+
res.json({ deliveries: (0, loop_economics_1.listRecentDeliveries)(ctx(req).db, Number.isFinite(limit) ? limit : 50) });
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
console.error('[loop-economics] deliveries query failed:', err);
|
|
130
|
+
res.status(500).json({ error: 'deliveries_unavailable' });
|
|
131
|
+
}
|
|
132
|
+
});
|
|
59
133
|
// Build a YAML-store-backed title resolver for getSpending's 4th arg
|
|
60
134
|
// (BUG-ANALYTICS-18/36). Without it, topTickets keeps ticketTitle:null and the
|
|
61
135
|
// client mislabels every live ticket "Deleted ticket #N". Returns undefined
|
|
@@ -398,8 +472,12 @@ function registerSpendingRoutes(deps) {
|
|
|
398
472
|
const budgetUtilizationPct = dailyBudgetUsd != null && dailyBudgetUsd > 0 && unpricedRuns === 0
|
|
399
473
|
? (costToday / dailyBudgetUsd) * 100
|
|
400
474
|
: null;
|
|
475
|
+
const caps = (0, budget_storage_1.readProjectCaps)(db);
|
|
401
476
|
res.json({
|
|
402
477
|
dailyBudgetUsd,
|
|
478
|
+
weeklyBudgetUsd: caps.week,
|
|
479
|
+
monthlyBudgetUsd: caps.month,
|
|
480
|
+
runCapUsd: caps.run,
|
|
403
481
|
jobCostThresholdUsd,
|
|
404
482
|
costToday,
|
|
405
483
|
pricedRuns: costRow.pricedRuns,
|
|
@@ -412,9 +490,19 @@ function registerSpendingRoutes(deps) {
|
|
|
412
490
|
res.status(500).json({ error: 'Failed to read budget' });
|
|
413
491
|
}
|
|
414
492
|
});
|
|
493
|
+
// Caps beyond the daily budget (CD5). `null` clears, a number > 0 sets; anything
|
|
494
|
+
// else is a 400 (the historical daily/job fields keep their silent-ignore).
|
|
495
|
+
const NEW_CAP_FIELDS = [['weeklyBudgetUsd', 'week'], ['monthlyBudgetUsd', 'month'], ['runCapUsd', 'run']];
|
|
415
496
|
router.patch('/:projectId/budget', (req, res) => {
|
|
416
497
|
const { dailyBudgetUsd, jobCostThresholdUsd } = req.body ?? {};
|
|
417
498
|
const { db } = ctx(req);
|
|
499
|
+
for (const [field] of NEW_CAP_FIELDS) {
|
|
500
|
+
const value = (req.body ?? {})[field];
|
|
501
|
+
if (value !== undefined && value !== null && !(typeof value === 'number' && Number.isFinite(value) && value > 0)) {
|
|
502
|
+
res.status(400).json({ error: 'invalid_cap', field });
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
418
506
|
try {
|
|
419
507
|
if (dailyBudgetUsd !== undefined) {
|
|
420
508
|
if (dailyBudgetUsd === null) {
|
|
@@ -424,6 +512,11 @@ function registerSpendingRoutes(deps) {
|
|
|
424
512
|
db.prepare(`INSERT OR REPLACE INTO queue_state (key, value) VALUES ('config.daily_budget_usd', ?)`).run(String(dailyBudgetUsd));
|
|
425
513
|
}
|
|
426
514
|
}
|
|
515
|
+
for (const [field, key] of NEW_CAP_FIELDS) {
|
|
516
|
+
const value = (req.body ?? {})[field];
|
|
517
|
+
if (value !== undefined)
|
|
518
|
+
(0, budget_storage_1.writeProjectCap)(db, key, value);
|
|
519
|
+
}
|
|
427
520
|
if (jobCostThresholdUsd !== undefined) {
|
|
428
521
|
if (jobCostThresholdUsd === null) {
|
|
429
522
|
db.prepare(`DELETE FROM queue_state WHERE key = 'config.job_cost_threshold_usd'`).run();
|
|
@@ -439,6 +532,51 @@ function registerSpendingRoutes(deps) {
|
|
|
439
532
|
res.status(500).json({ error: 'Failed to update budget' });
|
|
440
533
|
}
|
|
441
534
|
});
|
|
535
|
+
// Budget panel read model: every cap with its spend (project and app-wide, the
|
|
536
|
+
// same read the gate uses), spend per period split by provider, and the
|
|
537
|
+
// month-end projection (an estimate from the trailing burn).
|
|
538
|
+
router.get('/:projectId/budget/caps', (req, res) => {
|
|
539
|
+
const c = ctx(req);
|
|
540
|
+
try {
|
|
541
|
+
const at = new Date();
|
|
542
|
+
res.json({
|
|
543
|
+
...(0, budget_overview_1.readSpendOverview)([{ db: c.db, projectId: c.project.id }], at),
|
|
544
|
+
config: (0, budget_storage_1.readProjectCaps)(c.db),
|
|
545
|
+
appConfig: (0, budget_storage_1.readDesktopCaps)((key) => (0, desktop_db_1.getDesktopSetting)(registry.desktopDb, key)),
|
|
546
|
+
caps: c.budgetCaps?.(at) ?? [],
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
catch (err) {
|
|
550
|
+
console.error('[project-router] budget caps error:', err);
|
|
551
|
+
res.status(500).json({ error: 'budget_caps_unavailable' });
|
|
552
|
+
}
|
|
553
|
+
});
|
|
554
|
+
// What-if pricing: re-price this project's recorded usage of one model as if
|
|
555
|
+
// another model had run it. Estimate only; a model without a rate card is
|
|
556
|
+
// reported (`noPricing`), never guessed.
|
|
557
|
+
router.get('/:projectId/budget/what-if', (req, res) => {
|
|
558
|
+
const c = ctx(req);
|
|
559
|
+
const text = (value) => (typeof value === 'string' && value.length > 0 && value.length <= 200 ? value : null);
|
|
560
|
+
const ref = (spec) => {
|
|
561
|
+
if (!spec)
|
|
562
|
+
return null;
|
|
563
|
+
const at = spec.indexOf(':');
|
|
564
|
+
return at > 0 && at < spec.length - 1 ? { provider: spec.slice(0, at), model: spec.slice(at + 1) } : null;
|
|
565
|
+
};
|
|
566
|
+
const fromSpec = text(req.query.from), toSpec = text(req.query.to);
|
|
567
|
+
const from = ref(fromSpec), to = ref(toSpec);
|
|
568
|
+
if ((fromSpec || toSpec) && (!from || !to)) {
|
|
569
|
+
res.status(400).json({ error: 'invalid_model_ref' });
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
try {
|
|
573
|
+
res.json((0, what_if_1.computeWhatIf)(c.db, c.project.id, (0, what_if_1.clampDays)(req.query.days), from && to ? { from, to } : null));
|
|
574
|
+
}
|
|
575
|
+
catch (err) {
|
|
576
|
+
console.error('[project-router] what-if error:', err);
|
|
577
|
+
res.status(500).json({ error: 'what_if_unavailable' });
|
|
578
|
+
}
|
|
579
|
+
});
|
|
442
580
|
router.get('/:projectId/issues', (req, res) => {
|
|
443
581
|
const { project, db } = ctx(req);
|
|
444
582
|
try {
|