specrails-desktop 2.64.2 → 2.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/cli/dist/status.js +3 -0
- package/client/dist/assets/ActivityFeedPage-ByVKYII-.js +1 -0
- package/client/dist/assets/AgentBrowserCapture-BGUTjhUr.js +1 -0
- package/client/dist/assets/AgentModeAnalyticsPane-CtOLDDjB.js +2 -0
- package/client/dist/assets/AgentModeCodePane-CDhUKarT.js +2 -0
- package/client/dist/assets/AgentModeJobsPane-BAa_oEHJ.js +1 -0
- package/client/dist/assets/AgentsPage-D32hG4Ve.js +120 -0
- package/client/dist/assets/AnalyticsPage-BU50zeG6.js +5 -0
- package/client/dist/assets/BudgetCard-DP_jxwaD.js +55 -0
- package/client/dist/assets/CodePage-jiYnKGpp.js +3 -0
- package/client/dist/assets/CostValue-Bvn8674q.js +1 -0
- package/client/dist/assets/DesktopAnalyticsPage-CF__H4e3.js +1 -0
- package/client/dist/assets/DocView-RrAp70zp.js +11 -0
- package/client/dist/assets/DocsDialog-DkqHU-JF.js +1 -0
- package/client/dist/assets/DocsPage-C6X089zC.js +1 -0
- package/client/dist/assets/ExportDropdown-C5-o8y3K.js +1 -0
- package/client/dist/assets/HelpHint-Crf9_uoR.js +1 -0
- package/client/dist/assets/IntegrationsPage-aflU3KHK.js +1 -0
- package/client/dist/assets/InteractiveJobComposer-CEMMhyyJ.js +19 -0
- package/client/dist/assets/JobDetailModal-BVJ6hyRs.js +1 -0
- package/client/dist/assets/JobDetailPage-DHzBUmox.js +1 -0
- package/client/dist/assets/JobsPage-o-LAqkwC.js +1 -0
- package/client/dist/assets/LoopBuilderPage-DbSVmXBM.js +1 -0
- package/client/dist/assets/LoopPreviewModal-DbJcVyN1.js +1 -0
- package/client/dist/assets/{LoopWindowSurface-DE0v2K1p.js → LoopWindowSurface-Co1ZK26V.js} +1 -1
- package/client/dist/assets/LoopsPage-C4lgkPXB.js +2 -0
- package/client/dist/assets/MinimizedChatsContext-742ypO8n.js +1 -0
- package/client/dist/assets/PluginsPage-Acks9ges.js +2 -0
- package/client/dist/assets/RailTrack-BfLmBzBh.js +1 -0
- package/client/dist/assets/{RepositoryScopeSelector-2eSqR9WK.js → RepositoryScopeSelector-DcxbKI9w.js} +1 -1
- package/client/dist/assets/ReviewPacketPage-CAVSIOAJ.js +7 -0
- package/client/dist/assets/TemplatePreviewModal-C23SYCTm.js +1 -0
- package/client/dist/assets/TicketDetailModalContext-B-Gtm6Ob.js +23 -0
- package/client/dist/assets/Trans-C6J0cLyh.js +1 -0
- package/client/dist/assets/a11y-prefs-BqoP5goK.js +1 -0
- package/client/dist/assets/activity-BBWfoUOG.js +1 -0
- package/client/dist/assets/activity-BM_skann.js +1 -0
- package/client/dist/assets/activity-Cevl82ke.js +1 -0
- package/client/dist/assets/activity-CmACk5W5.js +1 -0
- package/client/dist/assets/activity-D9LBw3PQ.js +1 -0
- package/client/dist/assets/activity-Dspbb9lz.js +1 -0
- package/client/dist/assets/activity-FPjYIjv9.js +1 -0
- package/client/dist/assets/activity-nLCKMUKt.js +1 -0
- package/client/dist/assets/addspec-BI4jDMhA.js +1 -0
- package/client/dist/assets/addspec-BldTv7Tl.js +1 -0
- package/client/dist/assets/addspec-Cdq-2EcC.js +1 -0
- package/client/dist/assets/addspec-DH5M16BQ.js +1 -0
- package/client/dist/assets/addspec-DOFo9pD5.js +1 -0
- package/client/dist/assets/addspec-DPkwhdmL.js +1 -0
- package/client/dist/assets/addspec-Dzy12Pv3.js +1 -0
- package/client/dist/assets/addspec-skTs6EEW.js +1 -0
- package/client/dist/assets/agent-B_UEUy7Y.js +1 -0
- package/client/dist/assets/agent-BarjlhTA.js +1 -0
- package/client/dist/assets/agent-BfqIITo5.js +1 -0
- package/client/dist/assets/agent-Bt9a7Kyj.js +1 -0
- package/client/dist/assets/agent-C3689RwP.js +1 -0
- package/client/dist/assets/agent-CrmboTAi.js +1 -0
- package/client/dist/assets/agent-DcsoTnuE.js +1 -0
- package/client/dist/assets/agent-GDZoYwd4.js +1 -0
- package/client/dist/assets/{agentRuntime-es2ymSl-.js → agentRuntime-BYH70bKY.js} +1 -1
- package/client/dist/assets/agentRuntime-BijLh8I9.js +1 -0
- package/client/dist/assets/{agentRuntime-BzuwQQgn.js → agentRuntime-BvyuETPe.js} +1 -1
- package/client/dist/assets/{agentRuntime-BDvbJMmS.js → agentRuntime-C2WI6HQh.js} +1 -1
- package/client/dist/assets/{agentRuntime-BKJfv5YD.js → agentRuntime-CZPIlQsr.js} +1 -1
- package/client/dist/assets/{agentRuntime-DiCldqGG.js → agentRuntime-D2dDvCyJ.js} +1 -1
- package/client/dist/assets/agentRuntime-DWZedEbn.js +1 -0
- package/client/dist/assets/agentRuntime-DkIruUNw.js +1 -0
- package/client/dist/assets/agents-35_PDKx9.js +1 -0
- package/client/dist/assets/agents-8fZnHhEQ.js +1 -0
- package/client/dist/assets/agents-Bgimtw8z.js +1 -0
- package/client/dist/assets/agents-C4P160Us.js +1 -0
- package/client/dist/assets/agents-Clg67zbp.js +1 -0
- package/client/dist/assets/agents-DJfF4o6G.js +1 -0
- package/client/dist/assets/agents-Dc9-Y5cw.js +1 -0
- package/client/dist/assets/agents-EN1Zl4YZ.js +1 -0
- package/client/dist/assets/agentstudio-Bm4-NYaG.js +1 -0
- package/client/dist/assets/agentstudio-CD1fuj2o.js +1 -0
- package/client/dist/assets/agentstudio-CQGWFSst.js +1 -0
- package/client/dist/assets/agentstudio-CqVSb65S.js +1 -0
- package/client/dist/assets/agentstudio-DIE_HjsX.js +1 -0
- package/client/dist/assets/agentstudio-D_OmQK-k.js +1 -0
- package/client/dist/assets/agentstudio-Djz9aUfb.js +1 -0
- package/client/dist/assets/agentstudio-Qa3v9o5J.js +1 -0
- package/client/dist/assets/{aiedit-DNXxq_Dr.js → aiedit-1VzLs37W.js} +1 -1
- package/client/dist/assets/{aiedit-DCjA7jLJ.js → aiedit-BNp6GSik.js} +1 -1
- package/client/dist/assets/{aiedit-BoG24nlg.js → aiedit-BOY5xRPi.js} +1 -1
- package/client/dist/assets/{aiedit-iIjz2_Qk.js → aiedit-BrqMZvbc.js} +1 -1
- package/client/dist/assets/{aiedit-CjlSRQVP.js → aiedit-CVgtl7hm.js} +1 -1
- package/client/dist/assets/{aiedit-DQ-0_pvE.js → aiedit-CrFW9Jd2.js} +1 -1
- package/client/dist/assets/{aiedit-olnv3QSt.js → aiedit-YE2lILp7.js} +1 -1
- package/client/dist/assets/{aiedit-B0KUbpB6.js → aiedit-iA_R1AVQ.js} +1 -1
- package/client/dist/assets/analytics-3w0t-4ic.js +1 -0
- package/client/dist/assets/analytics-BRi4KQD6.js +1 -0
- package/client/dist/assets/analytics-BtjAqzke.js +1 -0
- package/client/dist/assets/analytics-COSQ1h47.js +1 -0
- package/client/dist/assets/analytics-CP2HjESk.js +1 -0
- package/client/dist/assets/analytics-DY65TC62.js +1 -0
- package/client/dist/assets/analytics-Den_vvxn.js +1 -0
- package/client/dist/assets/analytics-LmBS96O8.js +1 -0
- package/client/dist/assets/api-DOGbyfTO.js +2 -0
- package/client/dist/assets/builder-BMVvSr4v.js +1 -0
- package/client/dist/assets/builder-BN-MuLZt.js +1 -0
- package/client/dist/assets/builder-BQOZi4CF.js +1 -0
- package/client/dist/assets/builder-BjUPjsyu.js +1 -0
- package/client/dist/assets/builder-BoBtN18T.js +1 -0
- package/client/dist/assets/builder-C5g5NhxL.js +1 -0
- package/client/dist/assets/builder-RUHXw3yx.js +1 -0
- package/client/dist/assets/builder-fyS_AiyC.js +1 -0
- package/client/dist/assets/button-CHPkroew.js +1 -0
- package/client/dist/assets/chat-C9L5T7KI.js +1 -0
- package/client/dist/assets/chevron-right-CwMAj0w_.js +1 -0
- package/client/dist/assets/chevron-up-BAMuP0XD.js +1 -0
- package/client/dist/assets/chunk-OB3PAWPO-BBaq6pUk.js +3 -0
- package/client/dist/assets/code-4le5IIbf.js +1 -0
- package/client/dist/assets/code-B-jCVIbm.js +1 -0
- package/client/dist/assets/code-BRfrn5ix.js +1 -0
- package/client/dist/assets/code-CC9NCrDM.js +1 -0
- package/client/dist/assets/code-CK6pm8wY.js +1 -0
- package/client/dist/assets/code-DDiOzd6c.js +1 -0
- package/client/dist/assets/code-tGifiyf5.js +1 -0
- package/client/dist/assets/code-xkn8kQTg.js +1 -0
- package/client/dist/assets/commands-Bv1QshHR.js +1 -0
- package/client/dist/assets/commands-BvxTxboW.js +1 -0
- package/client/dist/assets/commands-C5ORR0fO.js +1 -0
- package/client/dist/assets/commands-CBKMFSTV.js +1 -0
- package/client/dist/assets/commands-CFJIRsJv.js +1 -0
- package/client/dist/assets/commands-D9o3ZcXl.js +1 -0
- package/client/dist/assets/commands-DNox0Edk.js +1 -0
- package/client/dist/assets/commands-DmIUMLdV.js +1 -0
- package/client/dist/assets/common-5H4TkaoI.js +1 -0
- package/client/dist/assets/common-9S3OdPjx.js +1 -0
- package/client/dist/assets/common-BqnwIcjs.js +1 -0
- package/client/dist/assets/common-CQP3VafS.js +1 -0
- package/client/dist/assets/common-CZnAfkB2.js +1 -0
- package/client/dist/assets/common-D5sNttV4.js +1 -0
- package/client/dist/assets/common-k_qX9nlv.js +1 -0
- package/client/dist/assets/common-s4HIi9XI.js +1 -0
- package/client/dist/assets/compass-B7guwBlY.js +1 -0
- package/client/dist/assets/confirm-dialog-ChZdHL3Q.js +1 -0
- package/client/dist/assets/copy-DOPlLymH.js +1 -0
- package/client/dist/assets/core-BozBzB6Y.js +1 -0
- package/client/dist/assets/dashboard-6zGLGcEz.js +1 -0
- package/client/dist/assets/dashboard-8Gi0FBDq.js +1 -0
- package/client/dist/assets/dashboard-B7E5YrSy.js +1 -0
- package/client/dist/assets/dashboard-BhdKV8xK.js +1 -0
- package/client/dist/assets/dashboard-Bu3zzH_s.js +1 -0
- package/client/dist/assets/dashboard-Ce_6rELA.js +1 -0
- package/client/dist/assets/dashboard-DWY-oz8P.js +1 -0
- package/client/dist/assets/dashboard-gUzlWk0o.js +1 -0
- package/client/dist/assets/date-input-Cdlr8kHz.js +1 -0
- package/client/dist/assets/dialog-C23lB2iP.js +5 -0
- package/client/dist/assets/dist-Di-oOFkX.js +1 -0
- package/client/dist/assets/dist-js-CBmS6MsJ.js +1 -0
- package/client/dist/assets/{dist-js-Rlh4FLH5.js → dist-js-DaJmKapi.js} +1 -1
- package/client/dist/assets/dropdown-menu-Bfp2CK6H.js +1 -0
- package/client/dist/assets/empty-state-D5w9OWj-.js +1 -0
- package/client/dist/assets/es2015-DfnECntk.js +41 -0
- package/client/dist/assets/esm-BKF6CE7v.js +1 -0
- package/client/dist/assets/event-BEnMLqAi.js +1 -0
- package/client/dist/assets/explore--NOz9LCN.js +1 -0
- package/client/dist/assets/explore-B2ulH6dO.js +1 -0
- package/client/dist/assets/explore-BD-QiLdg.js +1 -0
- package/client/dist/assets/explore-BOqd4_1j.js +1 -0
- package/client/dist/assets/explore-Be_Zh5zu.js +1 -0
- package/client/dist/assets/explore-CLjzPSKo.js +1 -0
- package/client/dist/assets/explore-D_-vHm29.js +1 -0
- package/client/dist/assets/explore-yEQTF6ro.js +1 -0
- package/client/dist/assets/file-text-CNXzL3wj.js +1 -0
- package/client/dist/assets/format-BODoFIw6.js +1 -0
- package/client/dist/assets/formatDistanceToNow-DLMIOS0N.js +1 -0
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-O61feXch.js +1 -0
- package/client/dist/assets/git-compare-arrows-Cu6tICCq.js +1 -0
- package/client/dist/assets/humanise-command-CB4ybLwq.js +1 -0
- package/client/dist/assets/inbox-BLZ8cm6_.js +1 -0
- package/client/dist/assets/inbox-BQ3VmNYY.js +1 -0
- package/client/dist/assets/inbox-BdcXWCuT.js +1 -0
- package/client/dist/assets/inbox-CF1PHjns.js +1 -0
- package/client/dist/assets/inbox-CFNPDhso.js +1 -0
- package/client/dist/assets/inbox-DIttK_NW.js +1 -0
- package/client/dist/assets/inbox-Dfdv1Ykl.js +1 -0
- package/client/dist/assets/inbox-JS1inmeO.js +1 -0
- package/client/dist/assets/index-4UWY7Xyz.css +2 -0
- package/client/dist/assets/index-DHzB0T26.js +120 -0
- package/client/dist/assets/integrations-BcKgzgPD.js +1 -0
- package/client/dist/assets/integrations-BmX_XyJq.js +1 -0
- package/client/dist/assets/integrations-CHpwMjlY.js +1 -0
- package/client/dist/assets/integrations-CT3kr8e-.js +1 -0
- package/client/dist/assets/integrations-C_5XAkgz.js +1 -0
- package/client/dist/assets/integrations-Ct9zLX7N.js +1 -0
- package/client/dist/assets/integrations-DEYemxUv.js +1 -0
- package/client/dist/assets/integrations-DWvsB_WB.js +1 -0
- package/client/dist/assets/{jira-Cq6yvN4q.js → jira-B_ERkFRv.js} +1 -1
- package/client/dist/assets/jira-Bn-A5lwD.js +1 -0
- package/client/dist/assets/jira-C71Ybnhp.js +1 -0
- package/client/dist/assets/jira-CkwjeJz6.js +1 -0
- package/client/dist/assets/jira-D9pSLXjI.js +1 -0
- package/client/dist/assets/jira-DBRS_lcp.js +1 -0
- package/client/dist/assets/jira-DHS6CsKh.js +1 -0
- package/client/dist/assets/jira-MInHRUb1.js +1 -0
- package/client/dist/assets/jira-api-DHme7Upx.js +1 -0
- package/client/dist/assets/jobs-BMLTDo63.js +1 -0
- package/client/dist/assets/jobs-BO8q4Mi1.js +1 -0
- package/client/dist/assets/jobs-Ck8uOWMM.js +1 -0
- package/client/dist/assets/jobs-CyFfPCpg.js +1 -0
- package/client/dist/assets/jobs-DT5s4fZ6.js +1 -0
- package/client/dist/assets/jobs-DZAgVPcD.js +1 -0
- package/client/dist/assets/jobs-b5gPYaKr.js +1 -0
- package/client/dist/assets/jobs-xsZK1440.js +1 -0
- package/client/dist/assets/launch-forecast-BTa-p3RP.js +1 -0
- package/client/dist/assets/{loop-layout-DtxX27Jz.css → loop-layout-DLioOiRN.css} +1 -1
- package/client/dist/assets/loop-layout-Sl9cfTvs.js +7 -0
- package/client/dist/assets/loops-BEEOVJDR.js +1 -0
- package/client/dist/assets/loops-BcrQ2vk7.js +1 -0
- package/client/dist/assets/loops-BjWxzJIZ.js +1 -0
- package/client/dist/assets/loops-BogV595N.js +1 -0
- package/client/dist/assets/loops-CU0BLZiz.js +1 -0
- package/client/dist/assets/loops-CrNBgi1G.js +1 -0
- package/client/dist/assets/loops-CwalwS_i.js +1 -0
- package/client/dist/assets/loops-_TDVN-fX.js +1 -0
- package/client/dist/assets/mcp-BNs8gxoL.js +1 -0
- package/client/dist/assets/mcp-BvRh_xO5.js +1 -0
- package/client/dist/assets/mcp-C2F1pghi.js +1 -0
- package/client/dist/assets/mcp-D9RLKAs2.js +1 -0
- package/client/dist/assets/mcp-DAghcsR0.js +1 -0
- package/client/dist/assets/mcp-DWWAPi1G.js +1 -0
- package/client/dist/assets/mcp-DbGSFC3f.js +1 -0
- package/client/dist/assets/mcp-FelCicrv.js +1 -0
- package/client/dist/assets/narration-C3NBkAR4.js +1 -0
- package/client/dist/assets/narration-CkoJq-Lf.js +1 -0
- package/client/dist/assets/narration-Cr0NeW9K.js +1 -0
- package/client/dist/assets/narration-DJUXOs-W.js +1 -0
- package/client/dist/assets/narration-DgL8TMvN.js +1 -0
- package/client/dist/assets/narration-DjBafgv0.js +1 -0
- package/client/dist/assets/narration-Dle6Iv0c.js +1 -0
- package/client/dist/assets/narration-MYlfktga.js +1 -0
- package/client/dist/assets/nav-BSQ8KW1c.js +1 -0
- package/client/dist/assets/nav-BauVof8Z.js +1 -0
- package/client/dist/assets/nav-BfOAH1se.js +1 -0
- package/client/dist/assets/nav-D3bOsipX.js +1 -0
- package/client/dist/assets/nav-DOMMhlLx.js +1 -0
- package/client/dist/assets/nav-DPzVlgZU.js +1 -0
- package/client/dist/assets/nav-DZJbFbah.js +1 -0
- package/client/dist/assets/nav-D_5aojd2.js +1 -0
- package/client/dist/assets/notify-error-BsWANx1T.js +1 -0
- package/client/dist/assets/onboarding-BdZQnNm3.js +1 -0
- package/client/dist/assets/onboarding-CJQEv1vp.js +1 -0
- package/client/dist/assets/onboarding-CWJGYUW3.js +1 -0
- package/client/dist/assets/onboarding-ChfYN7dA.js +1 -0
- package/client/dist/assets/onboarding-CjvDUR3V.js +1 -0
- package/client/dist/assets/onboarding-I6vS-zTB.js +1 -0
- package/client/dist/assets/onboarding-dgC_9dTB.js +1 -0
- package/client/dist/assets/onboarding-mlXSyKzX.js +1 -0
- package/client/dist/assets/origin-03nTuaOb.js +1 -0
- package/client/dist/assets/packet-BjpyRnZr.js +1 -0
- package/client/dist/assets/packet-BwgG5mBt.js +1 -0
- package/client/dist/assets/packet-C3eAUFkV.js +1 -0
- package/client/dist/assets/packet-C8wZuSld.js +1 -0
- package/client/dist/assets/packet-CNXEy_85.js +1 -0
- package/client/dist/assets/packet-DsV5Aa_8.js +1 -0
- package/client/dist/assets/packet-aasskOE7.js +1 -0
- package/client/dist/assets/packet-phxCc2gJ.js +1 -0
- package/client/dist/assets/page-header-BStSHkP8.js +1 -0
- package/client/dist/assets/project-repositories-DJPeAVBK.js +1 -0
- package/client/dist/assets/{provider-capabilities-lePfeT_Y.js → provider-capabilities-DtwcTme4.js} +1 -1
- package/client/dist/assets/recovery-BPDOsC92.js +1 -0
- package/client/dist/assets/recovery-BluNHoXM.js +1 -0
- package/client/dist/assets/recovery-CRvEmB0C.js +1 -0
- package/client/dist/assets/recovery-CeIoRnkR.js +1 -0
- package/client/dist/assets/recovery-DHCo8KGi.js +1 -0
- package/client/dist/assets/recovery-OxAIpbBF.js +1 -0
- package/client/dist/assets/recovery-XXexYGOJ.js +1 -0
- package/client/dist/assets/recovery-pITlc--v.js +1 -0
- package/client/dist/assets/refresh-cw-DfyTkbsf.js +1 -0
- package/client/dist/assets/select-xA3pSmqE.js +1 -0
- package/client/dist/assets/settings--yzDbX9r.js +1 -0
- package/client/dist/assets/settings-5_heTv8s.js +1 -0
- package/client/dist/assets/settings-BSf27MDg.js +1 -0
- package/client/dist/assets/settings-BSj6FakR.js +1 -0
- package/client/dist/assets/settings-BZDo_8Nn.js +1 -0
- package/client/dist/assets/settings-BdWgmNc0.js +1 -0
- package/client/dist/assets/settings-DRouxKqb.js +1 -0
- package/client/dist/assets/settings-DnWFoY-F.js +1 -0
- package/client/dist/assets/setup-BJWy62ri.js +1 -0
- package/client/dist/assets/setup-BgKOIuzc.js +1 -0
- package/client/dist/assets/setup-BvVIyUlz.js +1 -0
- package/client/dist/assets/setup-BxCk2pe1.js +1 -0
- package/client/dist/assets/setup-C-xQTL7R.js +1 -0
- package/client/dist/assets/setup-CbaVoiwV.js +1 -0
- package/client/dist/assets/setup-DxTBkX3P.js +1 -0
- package/client/dist/assets/setup-oGoVAzOD.js +1 -0
- package/client/dist/assets/specs-7tAb4IKr.js +1 -0
- package/client/dist/assets/specs-BUcY4s5v.js +1 -0
- package/client/dist/assets/specs-Bk5LeBAA.js +1 -0
- package/client/dist/assets/specs-CAA4Lrlg.js +1 -0
- package/client/dist/assets/specs-CS091AnA.js +1 -0
- package/client/dist/assets/specs-DJ6gmFcK.js +1 -0
- package/client/dist/assets/specs-GfCcrBSC.js +1 -0
- package/client/dist/assets/specs-xQgyc7WL.js +1 -0
- package/client/dist/assets/spending-CVH8VREb.js +1 -0
- package/client/dist/assets/square-Co6h5vZg.js +1 -0
- package/client/dist/assets/tauri-shell-43ixPGfa.js +2 -0
- package/client/dist/assets/terminal-0v9sBylD.js +1 -0
- package/client/dist/assets/terminal-AbUAmCxE.js +1 -0
- package/client/dist/assets/terminal-BJayIbIP.js +1 -0
- package/client/dist/assets/terminal-C2RUlXyi.js +1 -0
- package/client/dist/assets/terminal-CMmSb_Nj.js +1 -0
- package/client/dist/assets/terminal-DKWjj7HJ.js +1 -0
- package/client/dist/assets/terminal-KlFu7_pV.js +1 -0
- package/client/dist/assets/terminal-i99yqFvm.js +1 -0
- package/client/dist/assets/tickets-846Oq3i3.js +1 -0
- package/client/dist/assets/tickets-B5LJTe_b.js +1 -0
- package/client/dist/assets/tickets-Bfo2GGmH.js +1 -0
- package/client/dist/assets/tickets-BhdZ1yY2.js +1 -0
- package/client/dist/assets/tickets-CgjWJHAW.js +1 -0
- package/client/dist/assets/tickets-Ct9DbDUR.js +1 -0
- package/client/dist/assets/tickets-rptLEJB1.js +1 -0
- package/client/dist/assets/tickets-xQ6DpYdu.js +1 -0
- package/client/dist/assets/trending-up-BGvb4zZt.js +1 -0
- package/client/dist/assets/undo-6zuS4-sL.js +1 -0
- package/client/dist/assets/undo-BeM4gDOP.js +1 -0
- package/client/dist/assets/undo-BeppX8xS.js +1 -0
- package/client/dist/assets/undo-BqvNZ5MG.js +1 -0
- package/client/dist/assets/undo-BzwEPf_k.js +1 -0
- package/client/dist/assets/undo-CJ9Cu1NN.js +1 -0
- package/client/dist/assets/undo-ds8nMFbX.js +1 -0
- package/client/dist/assets/undo-x_gA-knG.js +1 -0
- package/client/dist/assets/useDesktop-BuOp2-MR.js +1 -0
- package/client/dist/assets/useRuntimeRuns-BRS6ncnO.js +1 -0
- package/client/dist/assets/utils-ELimjS2Y.js +1 -0
- package/client/dist/assets/wrench-Br2n1Lxd.js +1 -0
- package/client/dist/index.html +75 -60
- package/docs/ci-cd.md +29 -1
- package/docs/cli.md +10 -31
- package/docs/codex.md +1 -1
- package/docs/creating-specs.md +15 -12
- package/docs/customizing.md +16 -13
- package/docs/getting-started.md +12 -11
- package/docs/guide/de/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/de/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/de/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/de/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/de/getting-started/6-universal-search.md +34 -0
- package/docs/guide/de/insights/1-analytics-and-cost-tracking.md +20 -6
- package/docs/guide/de/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/de/insights/3-code-explorer.md +1 -1
- package/docs/guide/de/integrations/1-ai-providers.md +1 -1
- package/docs/guide/de/integrations/2-plugins.md +1 -1
- package/docs/guide/de/integrations/3-jira-integration.md +3 -3
- package/docs/guide/de/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/de/integrations/5-mcp-server.md +1 -1
- package/docs/guide/de/integrations/6-agent-chat.md +12 -5
- package/docs/guide/de/integrations/8-flow-mode.md +69 -0
- package/docs/guide/de/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/de/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/de/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/de/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/de/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/de/settings/1-themes.md +1 -1
- package/docs/guide/de/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/de/settings/5-project-environment.md +1 -1
- package/docs/guide/de/settings/6-updates.md +24 -0
- package/docs/guide/de/settings/7-existing-projects.md +33 -0
- package/docs/guide/de/settings/8-accessibility.md +23 -0
- package/docs/guide/de/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/de/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/de/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/en/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/en/getting-started/1-what-is-specrails.md +1 -1
- package/docs/guide/en/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/en/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/en/getting-started/5-the-dashboard-tour.md +52 -0
- package/docs/guide/en/getting-started/6-universal-search.md +34 -0
- package/docs/guide/en/insights/1-analytics-and-cost-tracking.md +24 -10
- package/docs/guide/en/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/en/insights/3-code-explorer.md +5 -5
- package/docs/guide/en/integrations/1-ai-providers.md +1 -1
- package/docs/guide/en/integrations/2-plugins.md +1 -1
- package/docs/guide/en/integrations/3-jira-integration.md +4 -4
- package/docs/guide/en/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/en/integrations/5-mcp-server.md +4 -4
- package/docs/guide/en/integrations/6-agent-chat.md +12 -5
- package/docs/guide/en/integrations/8-flow-mode.md +69 -0
- package/docs/guide/en/pipeline/1-rails-and-jobs.md +22 -3
- package/docs/guide/en/pipeline/2-the-job-detail-view.md +19 -7
- package/docs/guide/en/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/en/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/en/pipeline/5-the-loop-builder.md +2 -2
- package/docs/guide/en/settings/1-themes.md +1 -1
- package/docs/guide/en/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/en/settings/5-project-environment.md +1 -1
- package/docs/guide/en/settings/6-updates.md +24 -0
- package/docs/guide/en/settings/7-existing-projects.md +33 -0
- package/docs/guide/en/settings/8-accessibility.md +23 -0
- package/docs/guide/en/specs/1-specs-and-the-backlog.md +42 -6
- package/docs/guide/en/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/en/specs/3-add-spec-explore-mode.md +2 -2
- package/docs/guide/es/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/es/agents/2-profiles-and-the-balanced-default.md +1 -1
- package/docs/guide/es/agents/3-customizing-models-per-agent.md +2 -2
- package/docs/guide/es/agents/4-custom-agents-catalog.md +1 -1
- package/docs/guide/es/getting-started/1-what-is-specrails.md +3 -3
- package/docs/guide/es/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/es/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/es/getting-started/5-the-dashboard-tour.md +52 -0
- package/docs/guide/es/getting-started/6-universal-search.md +34 -0
- package/docs/guide/es/insights/1-analytics-and-cost-tracking.md +26 -12
- package/docs/guide/es/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/es/insights/3-code-explorer.md +5 -5
- package/docs/guide/es/integrations/1-ai-providers.md +1 -1
- package/docs/guide/es/integrations/2-plugins.md +1 -1
- package/docs/guide/es/integrations/3-jira-integration.md +4 -4
- package/docs/guide/es/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/es/integrations/5-mcp-server.md +4 -4
- package/docs/guide/es/integrations/6-agent-chat.md +14 -7
- package/docs/guide/es/integrations/7-local-engines.md +1 -1
- package/docs/guide/es/integrations/8-flow-mode.md +69 -0
- package/docs/guide/es/pipeline/1-rails-and-jobs.md +33 -13
- package/docs/guide/es/pipeline/2-the-job-detail-view.md +38 -26
- package/docs/guide/es/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/es/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/es/pipeline/5-the-loop-builder.md +4 -4
- package/docs/guide/es/settings/1-themes.md +1 -1
- package/docs/guide/es/settings/3-pipeline-telemetry-and-diagnostics.md +10 -10
- package/docs/guide/es/settings/5-project-environment.md +1 -1
- package/docs/guide/es/settings/6-updates.md +24 -0
- package/docs/guide/es/settings/7-existing-projects.md +33 -0
- package/docs/guide/es/settings/8-accessibility.md +23 -0
- package/docs/guide/es/specs/1-specs-and-the-backlog.md +43 -7
- package/docs/guide/es/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/es/specs/3-add-spec-explore-mode.md +3 -3
- package/docs/guide/fr/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/fr/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/fr/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/fr/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/fr/getting-started/6-universal-search.md +34 -0
- package/docs/guide/fr/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/fr/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/fr/insights/3-code-explorer.md +1 -1
- package/docs/guide/fr/integrations/1-ai-providers.md +1 -1
- package/docs/guide/fr/integrations/2-plugins.md +1 -1
- package/docs/guide/fr/integrations/3-jira-integration.md +3 -3
- package/docs/guide/fr/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/fr/integrations/5-mcp-server.md +1 -1
- package/docs/guide/fr/integrations/6-agent-chat.md +11 -4
- package/docs/guide/fr/integrations/8-flow-mode.md +69 -0
- package/docs/guide/fr/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/fr/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/fr/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/fr/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/fr/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/fr/settings/1-themes.md +1 -1
- package/docs/guide/fr/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/fr/settings/5-project-environment.md +1 -1
- package/docs/guide/fr/settings/6-updates.md +24 -0
- package/docs/guide/fr/settings/7-existing-projects.md +33 -0
- package/docs/guide/fr/settings/8-accessibility.md +23 -0
- package/docs/guide/fr/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/fr/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/fr/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/it/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/it/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/it/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/it/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/it/getting-started/6-universal-search.md +34 -0
- package/docs/guide/it/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/it/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/it/insights/3-code-explorer.md +1 -1
- package/docs/guide/it/integrations/1-ai-providers.md +1 -1
- package/docs/guide/it/integrations/2-plugins.md +1 -1
- package/docs/guide/it/integrations/3-jira-integration.md +3 -3
- package/docs/guide/it/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/it/integrations/5-mcp-server.md +1 -1
- package/docs/guide/it/integrations/6-agent-chat.md +11 -4
- package/docs/guide/it/integrations/8-flow-mode.md +69 -0
- package/docs/guide/it/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/it/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/it/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/it/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/it/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/it/settings/1-themes.md +1 -1
- package/docs/guide/it/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/it/settings/5-project-environment.md +1 -1
- package/docs/guide/it/settings/6-updates.md +24 -0
- package/docs/guide/it/settings/7-existing-projects.md +33 -0
- package/docs/guide/it/settings/8-accessibility.md +23 -0
- package/docs/guide/it/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/it/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/it/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/ja/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/ja/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/ja/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/ja/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/ja/getting-started/6-universal-search.md +34 -0
- package/docs/guide/ja/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/ja/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/ja/insights/3-code-explorer.md +1 -1
- package/docs/guide/ja/integrations/1-ai-providers.md +1 -1
- package/docs/guide/ja/integrations/2-plugins.md +1 -1
- package/docs/guide/ja/integrations/3-jira-integration.md +3 -3
- package/docs/guide/ja/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/ja/integrations/5-mcp-server.md +1 -1
- package/docs/guide/ja/integrations/6-agent-chat.md +11 -4
- package/docs/guide/ja/integrations/8-flow-mode.md +69 -0
- package/docs/guide/ja/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/ja/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/ja/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/ja/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/ja/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/ja/settings/1-themes.md +1 -1
- package/docs/guide/ja/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/ja/settings/5-project-environment.md +1 -1
- package/docs/guide/ja/settings/6-updates.md +24 -0
- package/docs/guide/ja/settings/7-existing-projects.md +33 -0
- package/docs/guide/ja/settings/8-accessibility.md +23 -0
- package/docs/guide/ja/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/ja/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/ja/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/pt/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/pt/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/pt/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/pt/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/pt/getting-started/6-universal-search.md +34 -0
- package/docs/guide/pt/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/pt/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/pt/insights/3-code-explorer.md +1 -1
- package/docs/guide/pt/integrations/1-ai-providers.md +1 -1
- package/docs/guide/pt/integrations/2-plugins.md +1 -1
- package/docs/guide/pt/integrations/3-jira-integration.md +3 -3
- package/docs/guide/pt/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/pt/integrations/5-mcp-server.md +1 -1
- package/docs/guide/pt/integrations/6-agent-chat.md +12 -5
- package/docs/guide/pt/integrations/8-flow-mode.md +69 -0
- package/docs/guide/pt/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/pt/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/pt/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/pt/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/pt/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/pt/settings/1-themes.md +1 -1
- package/docs/guide/pt/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/pt/settings/5-project-environment.md +1 -1
- package/docs/guide/pt/settings/6-updates.md +24 -0
- package/docs/guide/pt/settings/7-existing-projects.md +33 -0
- package/docs/guide/pt/settings/8-accessibility.md +23 -0
- package/docs/guide/pt/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/pt/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/pt/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/guide/zh/agents/1-meet-the-agents.md +1 -1
- package/docs/guide/zh/getting-started/2-installing-and-first-run.md +2 -0
- package/docs/guide/zh/getting-started/3-try-the-sample-project.md +35 -0
- package/docs/guide/zh/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
- package/docs/guide/zh/getting-started/6-universal-search.md +34 -0
- package/docs/guide/zh/insights/1-analytics-and-cost-tracking.md +18 -4
- package/docs/guide/zh/insights/2-the-integrated-terminal.md +1 -1
- package/docs/guide/zh/insights/3-code-explorer.md +1 -1
- package/docs/guide/zh/integrations/1-ai-providers.md +1 -1
- package/docs/guide/zh/integrations/2-plugins.md +1 -1
- package/docs/guide/zh/integrations/3-jira-integration.md +3 -3
- package/docs/guide/zh/integrations/4-mobile-companion.md +1 -1
- package/docs/guide/zh/integrations/5-mcp-server.md +1 -1
- package/docs/guide/zh/integrations/6-agent-chat.md +11 -4
- package/docs/guide/zh/integrations/8-flow-mode.md +69 -0
- package/docs/guide/zh/pipeline/1-rails-and-jobs.md +21 -1
- package/docs/guide/zh/pipeline/2-the-job-detail-view.md +12 -0
- package/docs/guide/zh/pipeline/3-reviewing-a-delivery.md +43 -0
- package/docs/guide/zh/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/zh/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/zh/settings/1-themes.md +1 -1
- package/docs/guide/zh/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
- package/docs/guide/zh/settings/5-project-environment.md +1 -1
- package/docs/guide/zh/settings/6-updates.md +24 -0
- package/docs/guide/zh/settings/7-existing-projects.md +33 -0
- package/docs/guide/zh/settings/8-accessibility.md +23 -0
- package/docs/guide/zh/specs/1-specs-and-the-backlog.md +41 -3
- package/docs/guide/zh/specs/2-add-spec-quick-mode.md +1 -1
- package/docs/guide/zh/specs/3-add-spec-explore-mode.md +1 -1
- package/docs/internals/README.md +8 -0
- package/docs/internals/adding-a-provider.md +19 -2
- package/docs/internals/agent-actions-audit.md +101 -0
- package/docs/internals/agent-sessions.md +36 -1
- package/docs/internals/api-reference.md +190 -45
- package/docs/internals/architecture.md +53 -47
- package/docs/internals/companion-inbox-decisions.md +42 -0
- package/docs/internals/companion-rails-as-loops-contract.md +17 -6
- package/docs/internals/configuration.md +140 -9
- package/docs/internals/core-runtime-updates.md +4 -4
- package/docs/internals/existing-project-anchoring.md +168 -0
- package/docs/internals/flow-mode.md +668 -0
- package/docs/internals/legacy-implementation-notes.md +13 -0
- package/docs/internals/local-testing-feedback-2026-10.md +210 -0
- package/docs/internals/mcp-mission-audit.md +4 -0
- package/docs/internals/mission-rail-cards.md +10 -5
- package/docs/internals/mission-read-only-policy.md +152 -0
- package/docs/internals/modal-standard.md +181 -0
- package/docs/internals/openspec-workflow.md +32 -0
- package/docs/internals/operations-runbook.md +30 -0
- package/docs/internals/profiles.md +6 -3
- package/docs/internals/programmatic-agent-runtime.md +8 -0
- package/docs/internals/project-builder.md +1 -1
- package/docs/internals/review-packet.md +161 -9
- package/docs/internals/safe-pr-review-flow.md +135 -6
- package/docs/internals/source-map.md +413 -18
- package/docs/internals/spec-addenda.md +10 -0
- package/docs/internals/spec-triage.md +140 -0
- package/docs/internals/visual-design-audit.md +15 -2
- package/docs/local-providers.md +3 -0
- package/docs/mcp.md +21 -3
- package/docs/platforms/macos.md +1 -1
- package/docs/platforms/windows.md +2 -2
- package/docs/running-pipelines.md +22 -6
- package/docs/tracking-cost.md +54 -10
- package/local-runner/dist/specrails-local-runner.js +3851 -1178
- package/mcp-bridge/dist/specrails-mcp.js +3864 -1143
- package/package.json +10 -9
- package/server/dist/agent-mcp-config.js +37 -1
- package/server/dist/api-version.js +19 -0
- package/server/dist/command-resolver.js +4 -2
- package/server/dist/core-compat.js +1 -1
- package/server/dist/core-execution.js +2 -1
- package/server/dist/core-update-manager.js +71 -13
- package/server/dist/db/job-search.js +248 -0
- package/server/dist/db/jobs.js +6 -0
- package/server/dist/db/migrations.js +239 -0
- package/server/dist/db.js +9 -2
- package/server/dist/desktop-db.js +99 -5
- package/server/dist/desktop-router.js +126 -13
- package/server/dist/docs-router.js +67 -1
- package/server/dist/feature-flags.js +22 -0
- package/server/dist/index.js +30 -15
- package/server/dist/jira/jira-adf.js +13 -1
- package/server/dist/jira/jira-clarifications.js +146 -0
- package/server/dist/jira/jira-client.js +8 -1
- package/server/dist/jira/jira-db.js +41 -0
- package/server/dist/jira/jira-sync-manager.js +328 -25
- package/server/dist/mcp/guide.js +17 -7
- package/server/dist/mcp/tools/agents.js +1 -1
- package/server/dist/mcp/tools/analytics.js +15 -3
- package/server/dist/mcp/tools/app-settings.js +14 -1
- package/server/dist/mcp/tools/chat.js +1 -1
- package/server/dist/mcp/tools/env.js +4 -2
- package/server/dist/mcp/tools/jobs.js +96 -7
- package/server/dist/mcp/tools/loops.js +1 -1
- package/server/dist/mcp/tools/meta.js +10 -13
- package/server/dist/mcp/tools/rails.js +15 -1
- package/server/dist/mcp/tools/setup.js +1 -1
- package/server/dist/mcp/tools/specs.js +8 -5
- package/server/dist/mcp/tools/support.js +6 -3
- package/server/dist/mcp/tools/types.js +38 -1
- package/server/dist/mobile/mobile-admin-router.js +0 -16
- package/server/dist/mobile/mobile-gateway.js +0 -18
- package/server/dist/mobile/mobile-inbox.js +240 -0
- package/server/dist/mobile/mobile-missions.js +6 -8
- package/server/dist/mobile/mobile-router.js +9 -9
- package/server/dist/mobile/mobile-webrtc-peer.js +4 -54
- package/server/dist/mobile/mobile-ws.js +27 -4
- package/server/dist/modules/accounting/runtime/ai-invocations.js +4 -0
- package/server/dist/modules/accounting/runtime/decision-times.js +102 -0
- package/server/dist/modules/accounting/runtime/loop-economics.js +284 -0
- package/server/dist/modules/accounting/runtime/spending.js +7 -2
- package/server/dist/modules/accounting/runtime/what-if.js +87 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-bridge.js +86 -5
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-controls.js +28 -2
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-metrics.js +15 -2
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-settings-router.js +21 -2
- package/server/dist/modules/agent-runtime/runtime/core-capabilities.js +55 -0
- package/server/dist/modules/agent-sessions/adapters/host-process.js +1 -1
- package/server/dist/modules/agent-sessions/domain/availability.js +16 -0
- package/server/dist/modules/agent-sessions/domain/protocol.js +8 -1
- package/server/dist/modules/agent-sessions/index.js +3 -1
- package/server/dist/modules/agent-sessions/runtime/core-sessions-availability.js +16 -0
- package/server/dist/modules/agents/runtime/agent-refine-manager.js +3 -1
- package/server/dist/modules/agents/runtime/agent-store.js +60 -73
- package/server/dist/modules/audit/adapters/http.js +66 -0
- package/server/dist/modules/audit/adapters/runtime.js +60 -0
- package/server/dist/modules/audit/adapters/sqlite.js +73 -0
- package/server/dist/modules/audit/application.js +190 -0
- package/server/dist/modules/audit/domain.js +434 -0
- package/server/dist/modules/audit/index.js +27 -0
- package/server/dist/modules/audit/ports.js +2 -0
- package/server/dist/modules/browser/runtime/browser-capture-manager.js +18 -141
- package/server/dist/modules/browser/runtime/browser-capture-types.js +1 -10
- package/server/dist/modules/browser/runtime/browser-playwright.js +0 -19
- package/server/dist/modules/code/runtime/file-provenance.js +23 -0
- package/server/dist/modules/conversations/runtime/chat-manager.js +5 -2
- package/server/dist/modules/delivery/adapters/decisions/chains.js +1 -0
- package/server/dist/modules/delivery/adapters/decisions/create.js +19 -1
- package/server/dist/modules/delivery/adapters/decisions/discard.js +2 -0
- package/server/dist/modules/delivery/adapters/decisions/local-changes.js +427 -0
- package/server/dist/modules/delivery/adapters/decisions/merge-local.js +80 -6
- package/server/dist/modules/delivery/adapters/decisions/observations.js +5 -0
- package/server/dist/modules/delivery/adapters/decisions/ownership.js +2 -1
- package/server/dist/modules/delivery/adapters/decisions/transitions.js +9 -0
- package/server/dist/modules/delivery/adapters/review-wip-store.js +37 -0
- package/server/dist/modules/delivery/domain/review-wip.js +71 -0
- package/server/dist/modules/delivery/index.js +9 -1
- package/server/dist/modules/delivery/runtime/delivery-changes.js +355 -0
- package/server/dist/modules/delivery/runtime/delivery-evidence.js +249 -8
- package/server/dist/modules/delivery/runtime/flow-review-legacy.js +99 -0
- package/server/dist/modules/delivery/runtime/flow-review-outcome.js +107 -0
- package/server/dist/modules/delivery/runtime/flow-worktree-handoff.js +32 -0
- package/server/dist/modules/delivery/runtime/flow-worktree-return.js +87 -0
- package/server/dist/modules/delivery/runtime/isolated-worktree.js +380 -0
- package/server/dist/modules/delivery/runtime/local-restore-branch.js +325 -0
- package/server/dist/modules/delivery/runtime/local-restore-resolver.js +48 -0
- package/server/dist/modules/delivery/runtime/local-stash.js +423 -0
- package/server/dist/modules/delivery/runtime/multi-repo-execution.js +27 -1
- package/server/dist/modules/delivery/runtime/phase3-harvest.js +40 -0
- package/server/dist/modules/delivery/runtime/pr-body.js +50 -0
- package/server/dist/modules/delivery/runtime/rail-isolated-launch.js +169 -166
- package/server/dist/modules/delivery/runtime/rail-launch-parser.js +5 -2
- package/server/dist/modules/delivery/runtime/rail-pr-decision.js +7 -1
- package/server/dist/modules/delivery/runtime/rail-pr-store.js +193 -12
- package/server/dist/modules/delivery/runtime/rails-router.js +267 -5
- package/server/dist/modules/delivery/runtime/review-brief.js +208 -0
- package/server/dist/modules/delivery/runtime/review-packet.js +41 -2
- package/server/dist/modules/delivery/runtime/review-wip-gate.js +67 -0
- package/server/dist/modules/delivery/runtime/run-records.js +267 -0
- package/server/dist/modules/delivery/runtime/run-review-diagnosis.js +102 -0
- package/server/dist/modules/execution/adapters/budget-storage.js +76 -0
- package/server/dist/modules/execution/application/enforce-budget.js +17 -2
- package/server/dist/modules/execution/domain/agent-env.js +98 -0
- package/server/dist/modules/execution/domain/daily-budget.js +36 -0
- package/server/dist/modules/execution/domain/spend-caps.js +166 -0
- package/server/dist/modules/execution/index.js +34 -1
- package/server/dist/modules/execution/runtime/budget-overview.js +76 -0
- package/server/dist/modules/execution/runtime/daily-budget-gate.js +86 -0
- package/server/dist/modules/execution/runtime/interactive-job-session.js +8 -0
- package/server/dist/modules/execution/runtime/launch-forecast.js +33 -0
- package/server/dist/modules/execution/runtime/queue-manager.js +54 -15
- package/server/dist/modules/execution/runtime/run-duration-stats.js +31 -13
- package/server/dist/modules/flow/adapters/bindings.js +1089 -0
- package/server/dist/modules/flow/adapters/http.js +147 -0
- package/server/dist/modules/flow/adapters/sqlite.js +121 -0
- package/server/dist/modules/flow/application.js +805 -0
- package/server/dist/modules/flow/domain.js +790 -0
- package/server/dist/modules/flow/index.js +34 -0
- package/server/dist/modules/flow/ports.js +2 -0
- package/server/dist/modules/inbox/adapters/http.js +21 -0
- package/server/dist/modules/inbox/adapters/project-source.js +233 -0
- package/server/dist/modules/inbox/application.js +28 -0
- package/server/dist/modules/inbox/domain.js +43 -0
- package/server/dist/modules/inbox/index.js +10 -0
- package/server/dist/modules/inbox/ports.js +2 -0
- package/server/dist/modules/loops/runtime/loop-definition-run.js +9 -0
- package/server/dist/modules/loops/runtime/loop-definition.js +5 -2
- package/server/dist/modules/loops/runtime/loop-executors.js +90 -9
- package/server/dist/modules/loops/runtime/loop-factory.js +30 -2
- package/server/dist/modules/loops/runtime/loop-flow-spec-recipe.js +166 -0
- package/server/dist/modules/loops/runtime/loop-graph.js +1 -1
- package/server/dist/modules/loops/runtime/loop-role-engines.js +4 -1
- package/server/dist/modules/loops/runtime/loop-run-manager.js +267 -10
- package/server/dist/modules/loops/runtime/loop-runs-store.js +21 -5
- package/server/dist/modules/loops/runtime/loop-templates.js +55 -12
- package/server/dist/modules/missions/runtime/agent-chat-manager.js +283 -20
- package/server/dist/modules/missions/runtime/agent-chat-router.js +96 -21
- package/server/dist/modules/missions/runtime/agent-failure-briefing.js +11 -3
- package/server/dist/modules/missions/runtime/agent-fence-promotion.js +9 -1
- package/server/dist/modules/missions/runtime/agent-flow-prompt.js +64 -0
- package/server/dist/modules/missions/runtime/agent-input-store.js +9 -4
- package/server/dist/modules/missions/runtime/agent-operator-prompt.js +100 -14
- package/server/dist/modules/missions/runtime/agent-session-store.js +88 -27
- package/server/dist/modules/missions/runtime/core-session-runner.js +89 -9
- package/server/dist/modules/missions/runtime/flow-turn-context.js +17 -0
- package/server/dist/modules/missions/runtime/mission-core-sessions.js +295 -55
- package/server/dist/modules/missions/runtime/mission-run-notify.js +2 -0
- package/server/dist/modules/missions/runtime/mission-session-projector.js +56 -19
- package/server/dist/modules/missions/runtime/mission-tool-policy.js +47 -0
- package/server/dist/modules/onboarding/adapters/http.js +78 -0
- package/server/dist/modules/onboarding/adapters/providers.js +41 -0
- package/server/dist/modules/onboarding/adapters/runtime.js +130 -0
- package/server/dist/modules/onboarding/application.js +133 -0
- package/server/dist/modules/onboarding/catalog.js +217 -0
- package/server/dist/modules/onboarding/domain.js +102 -0
- package/server/dist/modules/onboarding/index.js +20 -0
- package/server/dist/modules/onboarding/ports.js +2 -0
- package/server/dist/modules/project-rules/adapters/http.js +91 -0
- package/server/dist/modules/project-rules/domain.js +122 -0
- package/server/dist/modules/project-rules/runtime/rules-inventory-runs.js +97 -0
- package/server/dist/modules/project-rules/runtime/rules-store.js +109 -0
- package/server/dist/modules/project-settings/adapters/http.js +13 -0
- package/server/dist/modules/project-settings/adapters/sqlite.js +78 -8
- package/server/dist/modules/project-settings/domain.js +47 -1
- package/server/dist/modules/project-settings/index.js +7 -1
- package/server/dist/modules/recovery/adapters/sqlite.js +28 -0
- package/server/dist/modules/recovery/domain.js +162 -0
- package/server/dist/modules/recovery/index.js +16 -0
- package/server/dist/modules/specs/adapters/timeline-http.js +101 -0
- package/server/dist/modules/specs/domain/handoff-labels.js +371 -0
- package/server/dist/modules/specs/domain/handoff.js +260 -0
- package/server/dist/modules/specs/domain/non-goals.js +101 -0
- package/server/dist/modules/specs/domain/timeline.js +164 -0
- package/server/dist/modules/specs/domain/triage.js +320 -0
- package/server/dist/modules/specs/runtime/contract-refine-runner.js +3 -2
- package/server/dist/modules/specs/runtime/generated-spec-parser.js +75 -0
- package/server/dist/modules/specs/runtime/proposal-manager.js +4 -3
- package/server/dist/modules/specs/runtime/smash-runner.js +2 -1
- package/server/dist/modules/specs/runtime/spec-addenda.js +31 -0
- package/server/dist/modules/specs/runtime/spec-draft-parser.js +6 -1
- package/server/dist/modules/specs/runtime/spec-generation.js +431 -0
- package/server/dist/modules/specs/runtime/spec-handoff.js +103 -0
- package/server/dist/modules/specs/runtime/spec-history.js +376 -0
- package/server/dist/modules/specs/runtime/spec-launcher-manager.js +4 -3
- package/server/dist/modules/specs/runtime/spec-search.js +117 -0
- package/server/dist/modules/specs/runtime/ticket-store.js +47 -2
- package/server/dist/modules/specs/runtime/ticket-trash-service.js +62 -0
- package/server/dist/modules/specs/runtime/ticket-trash.js +193 -0
- package/server/dist/modules/specs/runtime/triage-runner.js +171 -0
- package/server/dist/modules/specs/runtime/triage.js +365 -0
- package/server/dist/modules/terminals/domain/app-urls.js +96 -0
- package/server/dist/modules/terminals/runtime/app-urls.js +77 -0
- package/server/dist/modules/terminals/runtime/background-process-service.js +25 -28
- package/server/dist/project-env.js +60 -0
- package/server/dist/project-git.js +65 -0
- package/server/dist/project-registry.js +264 -27
- package/server/dist/project-router-background-processes.js +27 -3
- package/server/dist/project-router-git.js +30 -0
- package/server/dist/project-router-helpers.js +5 -30
- package/server/dist/project-router-jobs.js +49 -1
- package/server/dist/project-router-loop-runs.js +72 -2
- package/server/dist/project-router-rules.js +54 -0
- package/server/dist/project-router-search.js +52 -0
- package/server/dist/project-router-settings.js +6 -0
- package/server/dist/project-router-setup.js +1 -1
- package/server/dist/project-router-spending.js +138 -0
- package/server/dist/project-router-tickets.js +246 -427
- package/server/dist/project-router.js +7 -0
- package/server/dist/providers/claude-adapter.js +25 -3
- package/server/dist/providers/codex-adapter.js +9 -1
- package/server/dist/providers/gemini-adapter.js +6 -1
- package/server/dist/providers/kimi-adapter.js +2 -0
- package/server/dist/providers/local-adapter.js +2 -0
- package/server/dist/providers/runtime.js +8 -0
- package/server/dist/schemas/agent-runtime.schema.json +3 -1
- package/server/dist/schemas/workflow-definition.schema.json +1 -0
- package/server/dist/setup-manager.js +19 -1
- package/server/dist/transient-children.js +25 -8
- package/server/dist/update-channel.js +21 -0
- package/server/dist/util/search-snippet.js +74 -0
- package/server/dist/worktree-manager.js +19 -8
- package/client/dist/assets/ActivityFeedPage-Dtp7EyHc.js +0 -1
- package/client/dist/assets/AgentBrowserCapture-CLqlEFw8.js +0 -1
- package/client/dist/assets/AgentModeAnalyticsPane-B8_hM3Tw.js +0 -2
- package/client/dist/assets/AgentModeCodePane-CNF8ZNjE.js +0 -2
- package/client/dist/assets/AgentModeJobsPane-CJpJbO9m.js +0 -1
- package/client/dist/assets/AgentsPage-BC8XSR79.js +0 -120
- package/client/dist/assets/AnalyticsPage-Cdv4jLtW.js +0 -1
- package/client/dist/assets/BarChart-BDMqVFJy.js +0 -55
- package/client/dist/assets/CodePage-DI1kegAr.js +0 -3
- package/client/dist/assets/DesktopAnalyticsPage-Bdp8E8U6.js +0 -1
- package/client/dist/assets/DocsDialog-Bm4RS7FX.js +0 -11
- package/client/dist/assets/DocsPage-DihYcU8r.js +0 -11
- package/client/dist/assets/ExportDropdown-Bb1lHx3r.js +0 -1
- package/client/dist/assets/IntegrationsPage-EAipiDWm.js +0 -1
- package/client/dist/assets/InteractiveJobComposer-BO6ASN-2.js +0 -19
- package/client/dist/assets/JobDetailModal-CuPYq7tP.js +0 -1
- package/client/dist/assets/JobDetailPage-BusMjJi9.js +0 -1
- package/client/dist/assets/JobsPage-C0QbsF2d.js +0 -1
- package/client/dist/assets/LoopBuilderPage-B7TlU4iS.js +0 -1
- package/client/dist/assets/LoopPreviewModal-BRWtXOD2.js +0 -1
- package/client/dist/assets/LoopsPage-C4q1DmCE.js +0 -2
- package/client/dist/assets/MinimizedChatsContext-DHfigjHS.js +0 -1
- package/client/dist/assets/PluginsPage-Z1JHSMdR.js +0 -2
- package/client/dist/assets/ProjectSettingsDialog-BUNj0tvN.js +0 -1
- package/client/dist/assets/RepositoryDeliveries-B4ybHOyB.js +0 -5
- package/client/dist/assets/ReviewPacketPage-hwfPNjyy.js +0 -4
- package/client/dist/assets/TemplatePreviewModal-V7FpMWuw.js +0 -1
- package/client/dist/assets/TicketDetailModalContext-Dkwo2cDs.js +0 -16
- package/client/dist/assets/Trans-BbFxRFtR.js +0 -1
- package/client/dist/assets/activity-B-rp4h_v.js +0 -1
- package/client/dist/assets/activity-C6kJpm9q.js +0 -1
- package/client/dist/assets/activity-CGx4kb_j.js +0 -1
- package/client/dist/assets/activity-CnoX2bH7.js +0 -1
- package/client/dist/assets/activity-DAyekdlt.js +0 -1
- package/client/dist/assets/activity-DCxtpT7j.js +0 -1
- package/client/dist/assets/activity-DiyjsgQV.js +0 -1
- package/client/dist/assets/activity-JzwRaWPD.js +0 -1
- package/client/dist/assets/addspec-BOvgmcgk.js +0 -1
- package/client/dist/assets/addspec-Clmyfn_R.js +0 -1
- package/client/dist/assets/addspec-CsNaBpHp.js +0 -1
- package/client/dist/assets/addspec-D2tvWmmV.js +0 -1
- package/client/dist/assets/addspec-D3nFwvD0.js +0 -1
- package/client/dist/assets/addspec-DVLEhK3w.js +0 -1
- package/client/dist/assets/addspec-DXbK-tb0.js +0 -1
- package/client/dist/assets/addspec-OHG8DFEn.js +0 -1
- package/client/dist/assets/agent-5bSixVzz.js +0 -1
- package/client/dist/assets/agent-BR4EHfhq.js +0 -1
- package/client/dist/assets/agent-C0IKkJP8.js +0 -1
- package/client/dist/assets/agent-C7li9ayC.js +0 -1
- package/client/dist/assets/agent-D0dRmEen.js +0 -1
- package/client/dist/assets/agent-DZVGHm7H.js +0 -1
- package/client/dist/assets/agent-Dip4h2YE.js +0 -1
- package/client/dist/assets/agent-Pp-P-n1p.js +0 -1
- package/client/dist/assets/agentRuntime-BxF81z52.js +0 -1
- package/client/dist/assets/agentRuntime-BxYS5V7u.js +0 -1
- package/client/dist/assets/agentRuntime-Dc9HG3BA.js +0 -1
- package/client/dist/assets/agents-B6ZsnARo.js +0 -1
- package/client/dist/assets/agents-BORdhe0K.js +0 -1
- package/client/dist/assets/agents-C6aq9Oqs.js +0 -1
- package/client/dist/assets/agents-Cbsc4bcX.js +0 -1
- package/client/dist/assets/agents-D0uYR6hq.js +0 -1
- package/client/dist/assets/agents-Doe1sHY5.js +0 -1
- package/client/dist/assets/agents-DyNi_I9m.js +0 -1
- package/client/dist/assets/agents-StKxiTg0.js +0 -1
- package/client/dist/assets/agentstudio-7cYCXn-L.js +0 -1
- package/client/dist/assets/agentstudio-BHWQh8G3.js +0 -1
- package/client/dist/assets/agentstudio-BjnWHyRs.js +0 -1
- package/client/dist/assets/agentstudio-BkV8vcK4.js +0 -1
- package/client/dist/assets/agentstudio-BzugqB_N.js +0 -1
- package/client/dist/assets/agentstudio-CWbp7KvH.js +0 -1
- package/client/dist/assets/agentstudio-DG6plf5o.js +0 -1
- package/client/dist/assets/agentstudio-DkZVF-Cc.js +0 -1
- package/client/dist/assets/analytics-B1DIQd4m.js +0 -1
- package/client/dist/assets/analytics-BAIZ9vE_.js +0 -1
- package/client/dist/assets/analytics-BTqgmgBd.js +0 -1
- package/client/dist/assets/analytics-BWynXPEm.js +0 -1
- package/client/dist/assets/analytics-DGcUsQ44.js +0 -1
- package/client/dist/assets/analytics-GnSnpJ4W.js +0 -1
- package/client/dist/assets/analytics-TWgYaoO0.js +0 -1
- package/client/dist/assets/analytics-kJy6Tuko.js +0 -1
- package/client/dist/assets/atom-one-dark-qiGhVQxg.js +0 -1
- package/client/dist/assets/builder-B9gorTnT.js +0 -1
- package/client/dist/assets/builder-Bvw5s3Mi.js +0 -1
- package/client/dist/assets/builder-CL5l4dU3.js +0 -1
- package/client/dist/assets/builder-CVDTVrQX.js +0 -1
- package/client/dist/assets/builder-CpS9liE9.js +0 -1
- package/client/dist/assets/builder-DNctIL9Q.js +0 -1
- package/client/dist/assets/builder-De2NxX6o.js +0 -1
- package/client/dist/assets/builder-DeYT7Y-m.js +0 -1
- package/client/dist/assets/button-4FS1ZDTp.js +0 -1
- package/client/dist/assets/chat-D_I7nU5K.js +0 -1
- package/client/dist/assets/chevron-up-6EFqEHBj.js +0 -1
- package/client/dist/assets/chunk-OB3PAWPO-B1EMk45A.js +0 -3
- package/client/dist/assets/clsx-CjueKrWZ.js +0 -1
- package/client/dist/assets/code-B37GRg9C.js +0 -1
- package/client/dist/assets/code-BBOEZbf9.js +0 -1
- package/client/dist/assets/code-BRm-jcyx.js +0 -1
- package/client/dist/assets/code-CF7w62CR.js +0 -1
- package/client/dist/assets/code-CLuvJt2r.js +0 -1
- package/client/dist/assets/code-D0RCm59f.js +0 -1
- package/client/dist/assets/code-DaZ-ZwCT.js +0 -1
- package/client/dist/assets/code-iIHkGaCL.js +0 -1
- package/client/dist/assets/commands-0XjAftla.js +0 -1
- package/client/dist/assets/commands-BAWSYHjQ.js +0 -1
- package/client/dist/assets/commands-BBwowgiE.js +0 -1
- package/client/dist/assets/commands-BacjIZLN.js +0 -1
- package/client/dist/assets/commands-Bs62IAZ3.js +0 -1
- package/client/dist/assets/commands-CLPdh-Hh.js +0 -1
- package/client/dist/assets/commands-DlbFzgrp.js +0 -1
- package/client/dist/assets/commands-LjPSsi5F.js +0 -1
- package/client/dist/assets/common-Bdi0qN4S.js +0 -1
- package/client/dist/assets/common-Bhb9zN1P.js +0 -1
- package/client/dist/assets/common-BykKlZg1.js +0 -1
- package/client/dist/assets/common-CvnNNSJA.js +0 -1
- package/client/dist/assets/common-D5zk_mqq.js +0 -1
- package/client/dist/assets/common-DQNO_al5.js +0 -1
- package/client/dist/assets/common-Dax30Vmp.js +0 -1
- package/client/dist/assets/common-DkllpVSb.js +0 -1
- package/client/dist/assets/core-B3mKBIh5.js +0 -1
- package/client/dist/assets/dashboard-B1ndRHuC.js +0 -1
- package/client/dist/assets/dashboard-BX7KXiqA.js +0 -1
- package/client/dist/assets/dashboard-B_BSNxcN.js +0 -1
- package/client/dist/assets/dashboard-CCeFN7-V.js +0 -1
- package/client/dist/assets/dashboard-CRl0WtFJ.js +0 -1
- package/client/dist/assets/dashboard-XGdQ5mjw.js +0 -1
- package/client/dist/assets/dashboard-_oltA6Jd.js +0 -1
- package/client/dist/assets/dashboard-bAuf5KVk.js +0 -1
- package/client/dist/assets/dialog-DtdR05v1.js +0 -45
- package/client/dist/assets/dist-js-CJ_2XX1Y.js +0 -1
- package/client/dist/assets/event-Bt7f3wXe.js +0 -1
- package/client/dist/assets/explore-BG99VGpL.js +0 -1
- package/client/dist/assets/explore-C0TjprJW.js +0 -1
- package/client/dist/assets/explore-C2dgEo7q.js +0 -1
- package/client/dist/assets/explore-C8NDHbob.js +0 -1
- package/client/dist/assets/explore-CWWgzQGR.js +0 -1
- package/client/dist/assets/explore-CcQXpdtS.js +0 -1
- package/client/dist/assets/explore-DgBACn39.js +0 -1
- package/client/dist/assets/explore-DsXAgnmJ.js +0 -1
- package/client/dist/assets/file-text-C0blZHLh.js +0 -1
- package/client/dist/assets/formatDistanceToNow-NjPHBLfB.js +0 -1
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-vJ7qUoqN.js +0 -1
- package/client/dist/assets/git-branch-yf6LE1Bw.js +0 -1
- package/client/dist/assets/index-BgbCbIua.css +0 -2
- package/client/dist/assets/index-Ce4yZtKf.js +0 -83
- package/client/dist/assets/integrations-BkpRUbvp.js +0 -1
- package/client/dist/assets/integrations-Bo8qbJf4.js +0 -1
- package/client/dist/assets/integrations-CmSrKzZb.js +0 -1
- package/client/dist/assets/integrations-DGtq26Rr.js +0 -1
- package/client/dist/assets/integrations-De38GFnQ.js +0 -1
- package/client/dist/assets/integrations-Dw6zdtb-.js +0 -1
- package/client/dist/assets/integrations-Dwl9KQp0.js +0 -1
- package/client/dist/assets/integrations-Refg_d2I.js +0 -1
- package/client/dist/assets/jira-B6OYw4CJ.js +0 -1
- package/client/dist/assets/jira-BTF6RaOe.js +0 -1
- package/client/dist/assets/jira-CEetIB2q.js +0 -1
- package/client/dist/assets/jira-CIzsZLw5.js +0 -1
- package/client/dist/assets/jira-Daw9tmpI.js +0 -1
- package/client/dist/assets/jira-FXr7u2lh.js +0 -1
- package/client/dist/assets/jira-LaNQn7yl.js +0 -1
- package/client/dist/assets/jira-api-Cabj-H0J.js +0 -1
- package/client/dist/assets/job-time-BCL7wee9.js +0 -1
- package/client/dist/assets/jobs-ARwD85B9.js +0 -1
- package/client/dist/assets/jobs-BMF1w4WT.js +0 -1
- package/client/dist/assets/jobs-CBfzGLwm.js +0 -1
- package/client/dist/assets/jobs-CPjiluBY.js +0 -1
- package/client/dist/assets/jobs-CQQd58pY.js +0 -1
- package/client/dist/assets/jobs-De3EqaO0.js +0 -1
- package/client/dist/assets/jobs-Du9-Ei9a.js +0 -1
- package/client/dist/assets/jobs-qMHbnxwC.js +0 -1
- package/client/dist/assets/layers-BCLTgHXO.js +0 -1
- package/client/dist/assets/loader-circle-BqV9xYGf.js +0 -1
- package/client/dist/assets/loop-layout-CyXj9223.js +0 -7
- package/client/dist/assets/loops-B2PhQLKR.js +0 -1
- package/client/dist/assets/loops-BqbF46st.js +0 -1
- package/client/dist/assets/loops-CINnHbfI.js +0 -1
- package/client/dist/assets/loops-D-3XhH04.js +0 -1
- package/client/dist/assets/loops-DKkEEjZ_.js +0 -1
- package/client/dist/assets/loops-DzWR5-v6.js +0 -1
- package/client/dist/assets/loops-WyWDkhok.js +0 -1
- package/client/dist/assets/loops-scD5fIBf.js +0 -1
- package/client/dist/assets/mcp-6rMoZfEO.js +0 -1
- package/client/dist/assets/mcp-BD8sL5mP.js +0 -1
- package/client/dist/assets/mcp-BkcA3I5s.js +0 -1
- package/client/dist/assets/mcp-CCpSelOh.js +0 -1
- package/client/dist/assets/mcp-CUAN6ORK.js +0 -1
- package/client/dist/assets/mcp-CqbRxRTE.js +0 -1
- package/client/dist/assets/mcp-DP2YfVhO.js +0 -1
- package/client/dist/assets/mcp-DUVQamDz.js +0 -1
- package/client/dist/assets/narration-BEKMVxGm.js +0 -1
- package/client/dist/assets/narration-CjLwGKap.js +0 -1
- package/client/dist/assets/narration-DANWuGsW.js +0 -1
- package/client/dist/assets/narration-DGeEDWiT.js +0 -1
- package/client/dist/assets/narration-DJgpGwIP.js +0 -1
- package/client/dist/assets/narration-DbHnz0qV.js +0 -1
- package/client/dist/assets/narration-bZSsTZG8.js +0 -1
- package/client/dist/assets/narration-i6aKJKEc.js +0 -1
- package/client/dist/assets/nav--u7iPYlS.js +0 -1
- package/client/dist/assets/nav-C5Jgfaby.js +0 -1
- package/client/dist/assets/nav-CAna_Wpt.js +0 -1
- package/client/dist/assets/nav-CCLqeyHo.js +0 -1
- package/client/dist/assets/nav-Cf3c90Jk.js +0 -1
- package/client/dist/assets/nav-DMYQaQjR.js +0 -1
- package/client/dist/assets/nav-Df_PkZ9F.js +0 -1
- package/client/dist/assets/nav-VyNGBJwj.js +0 -1
- package/client/dist/assets/packet-8nn9RsU7.js +0 -1
- package/client/dist/assets/packet-B0H15elv.js +0 -1
- package/client/dist/assets/packet-BQvBgrwh.js +0 -1
- package/client/dist/assets/packet-BR7mO0-a.js +0 -1
- package/client/dist/assets/packet-BgcQ6q_K.js +0 -1
- package/client/dist/assets/packet-D2s92Jnn.js +0 -1
- package/client/dist/assets/packet-YbtcD1HS.js +0 -1
- package/client/dist/assets/packet-c0Qj_9eX.js +0 -1
- package/client/dist/assets/project-repositories-Cnnuj9Ia.js +0 -1
- package/client/dist/assets/rotate-ccw-DalJAQQX.js +0 -1
- package/client/dist/assets/settings-B1NV8Ow9.js +0 -1
- package/client/dist/assets/settings-BQ8XFZeE.js +0 -1
- package/client/dist/assets/settings-BRkxfBbO.js +0 -1
- package/client/dist/assets/settings-C_CcU1dP.js +0 -1
- package/client/dist/assets/settings-Cto9n0eL.js +0 -1
- package/client/dist/assets/settings-Pyw8uYtL.js +0 -1
- package/client/dist/assets/settings-b3HVCNNd.js +0 -1
- package/client/dist/assets/settings-hdive4u6.js +0 -1
- package/client/dist/assets/setup-Be485n2u.js +0 -1
- package/client/dist/assets/setup-CKGUxKr-.js +0 -1
- package/client/dist/assets/setup-Ck1Uwd7_.js +0 -1
- package/client/dist/assets/setup-Cm774a6v.js +0 -1
- package/client/dist/assets/setup-DIqMQpxt.js +0 -1
- package/client/dist/assets/setup-DfCsoNFL.js +0 -1
- package/client/dist/assets/setup-DkeE8mP0.js +0 -1
- package/client/dist/assets/setup-xVntVaz1.js +0 -1
- package/client/dist/assets/specs-Bqvtz2kz.js +0 -1
- package/client/dist/assets/specs-CKes-kz6.js +0 -1
- package/client/dist/assets/specs-CfXxPDNB.js +0 -1
- package/client/dist/assets/specs-CyF9HuTI.js +0 -1
- package/client/dist/assets/specs-DMj035Mt.js +0 -1
- package/client/dist/assets/specs-DfIdoU5L.js +0 -1
- package/client/dist/assets/specs-j5pGLQeU.js +0 -1
- package/client/dist/assets/specs-xW5pkkB7.js +0 -1
- package/client/dist/assets/spending-CQnrWiR3.js +0 -1
- package/client/dist/assets/square-D0JTbRSR.js +0 -1
- package/client/dist/assets/tauri-shell-DE6LfGPw.js +0 -2
- package/client/dist/assets/terminal-BAzpHtpY.js +0 -1
- package/client/dist/assets/terminal-C7dHeR3x.js +0 -1
- package/client/dist/assets/terminal-CMla5Qsz.js +0 -1
- package/client/dist/assets/terminal-CdNXH-n9.js +0 -1
- package/client/dist/assets/terminal-Cw5bZsmV.js +0 -1
- package/client/dist/assets/terminal-DFUP4eNv.js +0 -1
- package/client/dist/assets/terminal-DGqljeK_.js +0 -1
- package/client/dist/assets/terminal-cU70NodO.js +0 -1
- package/client/dist/assets/tickets--tiSOCcn.js +0 -1
- package/client/dist/assets/tickets-BUJ3DMWU.js +0 -1
- package/client/dist/assets/tickets-C1WNPODq.js +0 -1
- package/client/dist/assets/tickets-CDjhWmiE.js +0 -1
- package/client/dist/assets/tickets-CLgPC3uO.js +0 -1
- package/client/dist/assets/tickets-D41ZMQpf.js +0 -1
- package/client/dist/assets/tickets-DEaQC06P.js +0 -1
- package/client/dist/assets/tickets-kcMzbLCp.js +0 -1
- package/client/dist/assets/trash-D8zYUmTg.js +0 -1
- package/client/dist/assets/useDesktop-BjLT0_EE.js +0 -1
- package/client/dist/assets/useRuntimeRuns-C97qEqMg.js +0 -1
- package/client/dist/assets/useSharedWebSocket-Bj4LMp7b.js +0 -2
- package/client/dist/assets/utils-BC4DHlz2.js +0 -1
- package/docs/guide/en/getting-started/4-the-dashboard-tour.md +0 -48
- package/docs/guide/es/getting-started/4-the-dashboard-tour.md +0 -48
- package/server/dist/mobile/mobile-preview-channel.js +0 -179
- package/server/dist/mobile/mobile-preview.js +0 -366
- package/server/dist/modules/browser/domain/preview-origins.js +0 -117
- package/server/dist/modules/browser/runtime/preview-targets.js +0 -80
- /package/client/dist/assets/{atom-one-dark-B-oHczHB.css → DocView-B-oHczHB.css} +0 -0
- /package/docs/guide/de/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/en/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/es/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/fr/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/it/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/ja/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/pt/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
- /package/docs/guide/zh/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
|
@@ -30,7 +30,7 @@ function supportTools() {
|
|
|
30
30
|
name: 'specrails_support',
|
|
31
31
|
title: 'Support & troubleshooting',
|
|
32
32
|
description: 'Support and troubleshooting for Specrails installation and usage problems. Use this when the user needs help setting up Specrails, adding/provisioning a project, fixing missing agents/skills/commands from the global specrails-core framework, provider CLI/MCP/agent-chat issues, rails/jobs/specs, or GitHub/PR/cost/plugin questions. ' +
|
|
33
|
-
'Actions: triage (read-only support playbook + diagnostics), core_update_status/check/apply (global specrails-core framework update). ' +
|
|
33
|
+
'Actions: triage (read-only support playbook + diagnostics), core_update_status/check/apply (global specrails-core framework update; follows the app update channel latest|stable), api_meta (API/app/Core/contract versions and update channel). ' +
|
|
34
34
|
'This tool never creates specs; repair actions require the normal permission tier and explicit user confirmation.',
|
|
35
35
|
tier: (a) => (String(a.action) === 'core_update_apply' ? 'ai-spawn' : 'read'),
|
|
36
36
|
hintTier: 'read',
|
|
@@ -41,6 +41,7 @@ function supportTools() {
|
|
|
41
41
|
'core_update_status',
|
|
42
42
|
'core_update_check',
|
|
43
43
|
'core_update_apply',
|
|
44
|
+
'api_meta',
|
|
44
45
|
])
|
|
45
46
|
.describe('Support operation to perform'),
|
|
46
47
|
question: zod_1.z
|
|
@@ -69,6 +70,8 @@ function supportTools() {
|
|
|
69
70
|
switch (action) {
|
|
70
71
|
case 'core_update_status':
|
|
71
72
|
return (0, types_1.apiCall)(ctx, 'GET', '/core-update/status');
|
|
73
|
+
case 'api_meta':
|
|
74
|
+
return (0, types_1.apiCall)(ctx, 'GET', '/meta');
|
|
72
75
|
case 'core_update_check':
|
|
73
76
|
return (0, types_1.apiCall)(ctx, 'POST', '/core-update/check', {});
|
|
74
77
|
case 'core_update_apply': {
|
|
@@ -239,7 +242,7 @@ function nextSteps(topic) {
|
|
|
239
242
|
'For specrails-core installation questions, evaluate only global core status and prerequisites. Do not treat project setup checkpoints as evidence of a core problem.',
|
|
240
243
|
'If global core status is current/healthy and the user has not provided an actual job error, say the core installation looks healthy and ask for the concrete failing job/error before recommending repair.',
|
|
241
244
|
'If a job explicitly reports missing agents, missing skills, unresolved slash commands, or missing /specrails:* commands, explain that those definitions come from the app-global specrails-core framework.',
|
|
242
|
-
'If an update is available, offer core_update_check followed by core_update_apply with confirmation. If no update is available but the job still fails with missing core definitions,
|
|
245
|
+
'If an update is available, offer core_update_check followed by core_update_apply with confirmation. If no update is available but the job still fails with missing core definitions, do not suggest a CLI command (Core 6 has no standalone `update`): collect the job diagnostic (specrails_jobs diagnostic) and report it as a framework-loading bug. A human can re-check and apply Core updates from Settings → Updates in the app.',
|
|
243
246
|
'Never recommend specrails_setup(install) or a project reinstall solely because setup/checkpoints show pending or 0 agents/commands.',
|
|
244
247
|
];
|
|
245
248
|
case 'rails_jobs':
|
|
@@ -315,7 +318,7 @@ function repairActions(topic) {
|
|
|
315
318
|
if (topic === 'framework_install') {
|
|
316
319
|
return [
|
|
317
320
|
'specrails_support(core_update_check) then specrails_support(core_update_apply) - apply requires operate/ai-spawn and only makes sense when a newer global specrails-core framework is available.',
|
|
318
|
-
'
|
|
321
|
+
'When no update is available but a real job still cannot load core definitions: collect a job diagnostic (specrails_jobs diagnostic) and report a framework-loading bug. Humans use Settings → Updates in the app; Core 6 has no standalone `update` command.',
|
|
319
322
|
];
|
|
320
323
|
}
|
|
321
324
|
if (topic !== 'project_setup' && topic !== 'installation')
|
|
@@ -10,6 +10,7 @@ exports.requireProject = requireProject;
|
|
|
10
10
|
exports.setActiveProject = setActiveProject;
|
|
11
11
|
exports.getActiveProject = getActiveProject;
|
|
12
12
|
exports.toolTierAllowed = toolTierAllowed;
|
|
13
|
+
exports.recordMissionMcpAction = recordMissionMcpAction;
|
|
13
14
|
exports.registerTieredTool = registerTieredTool;
|
|
14
15
|
const mcp_tiers_1 = require("../mcp-tiers");
|
|
15
16
|
const internal_api_1 = require("../../internal-api");
|
|
@@ -197,6 +198,40 @@ function emitMcpActivity(ctx, spec, args, tier) {
|
|
|
197
198
|
/* a notification failure must never fail the tool */
|
|
198
199
|
}
|
|
199
200
|
}
|
|
201
|
+
/**
|
|
202
|
+
* Agent actions audit for first-party mission agents: one `mcp` row per
|
|
203
|
+
* admitted tool call, in the capability's project, run id = the mission
|
|
204
|
+
* conversation. Only the tool and its action are stored — never arguments.
|
|
205
|
+
* Observing only: a missing project or a failing sink never affects the call.
|
|
206
|
+
*/
|
|
207
|
+
function recordMissionMcpAction(ctx, toolName, args) {
|
|
208
|
+
try {
|
|
209
|
+
const projectId = ctx.requestProjectId;
|
|
210
|
+
const conversationId = ctx.originConversationId;
|
|
211
|
+
if (!projectId || !conversationId)
|
|
212
|
+
return;
|
|
213
|
+
const recorder = ctx.registry.getContext(projectId)?.agentAudit?.recorder;
|
|
214
|
+
if (!recorder)
|
|
215
|
+
return;
|
|
216
|
+
const action = typeof args.action === 'string' && /^[a-z0-9_.-]{1,64}$/i.test(args.action) ? args.action : null;
|
|
217
|
+
recorder.record({
|
|
218
|
+
runId: conversationId,
|
|
219
|
+
role: 'mission',
|
|
220
|
+
kind: 'mcp',
|
|
221
|
+
target: action ? `${toolName}:${action}` : toolName,
|
|
222
|
+
source: 'mcp-wrapper',
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
catch { /* audit is observing only */ }
|
|
226
|
+
}
|
|
227
|
+
function admittedByException(spec, ctx, args) {
|
|
228
|
+
try {
|
|
229
|
+
return spec.tierException?.(ctx, args) === true;
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
200
235
|
/**
|
|
201
236
|
* Registers a tool on the McpServer, wrapping the handler with (1) tier
|
|
202
237
|
* enforcement and (2) uniform success/error result shaping. No tool can forget
|
|
@@ -236,9 +271,11 @@ function registerTieredTool(server, ctx, spec) {
|
|
|
236
271
|
: { ...ctx };
|
|
237
272
|
callCtx.signal = extra?.signal;
|
|
238
273
|
const tier = typeof spec.tier === 'function' ? spec.tier(args ?? {}) : spec.tier;
|
|
239
|
-
if (!toolTierAllowed(callCtx, tier)) {
|
|
274
|
+
if (!toolTierAllowed(callCtx, tier) && !(callCtx.firstPartyAgent && admittedByException(spec, callCtx, args ?? {}))) {
|
|
240
275
|
return errorResult((0, mcp_tiers_1.tierRefusalMessage)(tier));
|
|
241
276
|
}
|
|
277
|
+
if (capability)
|
|
278
|
+
recordMissionMcpAction(callCtx, spec.name, args ?? {});
|
|
242
279
|
const operation = async () => {
|
|
243
280
|
try {
|
|
244
281
|
const data = await spec.handler(callCtx, args ?? {});
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createMobileAdminRouter = createMobileAdminRouter;
|
|
4
4
|
const express_1 = require("express");
|
|
5
5
|
const mobile_devices_1 = require("./mobile-devices");
|
|
6
|
-
const desktop_db_1 = require("../desktop-db");
|
|
7
6
|
const DEVICE_ID_RE = /^[A-Za-z0-9-]{1,64}$/;
|
|
8
7
|
function createMobileAdminRouter(deps) {
|
|
9
8
|
const router = (0, express_1.Router)();
|
|
@@ -38,25 +37,10 @@ function createMobileAdminRouter(deps) {
|
|
|
38
37
|
const changed = (0, mobile_devices_1.revokeDevice)(desktopDb, id);
|
|
39
38
|
if (changed) {
|
|
40
39
|
gateway.bridge?.closeForDevice(id);
|
|
41
|
-
void gateway.closePreviewsForDevice(id).catch(() => { });
|
|
42
40
|
deps.broadcast({ type: 'mobile.device_revoked', deviceId: id, timestamp: new Date().toISOString() });
|
|
43
41
|
}
|
|
44
42
|
res.json({ ok: changed });
|
|
45
43
|
});
|
|
46
|
-
// —— Companion app previews (Desktop indicator) ——
|
|
47
|
-
router.get('/previews', (_req, res) => {
|
|
48
|
-
const previews = gateway.preview?.listDeviceSessions() ?? [];
|
|
49
|
-
res.json({ previews: previews.map((p) => ({ ...p, projectName: (0, desktop_db_1.getProject)(desktopDb, p.projectId)?.name ?? p.projectId })) });
|
|
50
|
-
});
|
|
51
|
-
router.delete('/previews/:projectId/:sessionId', async (req, res) => {
|
|
52
|
-
const projectId = typeof req.params.projectId === 'string' ? req.params.projectId : '';
|
|
53
|
-
const sessionId = typeof req.params.sessionId === 'string' ? req.params.sessionId : '';
|
|
54
|
-
if (!/^[A-Za-z0-9_-]{1,160}$/.test(projectId) || !/^[A-Za-z0-9_-]{1,160}$/.test(sessionId)) {
|
|
55
|
-
res.status(400).json({ error: 'Invalid parameter' });
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
res.json({ ok: (await gateway.preview?.endFromDesktop(projectId, sessionId)) ?? false });
|
|
59
|
-
});
|
|
60
44
|
router.post('/cert/rotate', async (_req, res) => {
|
|
61
45
|
const status = await gateway.rotateCert();
|
|
62
46
|
res.json(status);
|
|
@@ -17,7 +17,6 @@ const mobile_webrtc_peer_1 = require("./mobile-webrtc-peer");
|
|
|
17
17
|
const mobile_signal_reconnect_1 = require("./mobile-signal-reconnect");
|
|
18
18
|
const mobile_webrtc_1 = require("./mobile-webrtc");
|
|
19
19
|
const agent_store_1 = require("../modules/agents/runtime/agent-store");
|
|
20
|
-
const mobile_preview_1 = require("./mobile-preview");
|
|
21
20
|
// Lifecycle owner of the second HTTPS+WSS listener (default :4202), hard-isolated
|
|
22
21
|
// from the main server. Off by default; started on enable or boot-if-enabled.
|
|
23
22
|
const DEFAULT_PORT = 4202;
|
|
@@ -48,28 +47,12 @@ class MobileGateway {
|
|
|
48
47
|
_running = false;
|
|
49
48
|
_boundPort = DEFAULT_PORT;
|
|
50
49
|
_portOverride;
|
|
51
|
-
_preview;
|
|
52
50
|
constructor(deps) {
|
|
53
51
|
this._db = deps.desktopDb;
|
|
54
52
|
this._desktopPort = deps.desktopPort;
|
|
55
53
|
this._broadcast = deps.broadcast;
|
|
56
54
|
this._bindHost = deps.bindHost ?? '0.0.0.0';
|
|
57
55
|
this._portOverride = deps.port;
|
|
58
|
-
this._preview = deps.preview
|
|
59
|
-
? new mobile_preview_1.MobilePreviewService({
|
|
60
|
-
...deps.preview,
|
|
61
|
-
openChannel: (deviceId, label) => this._webrtc?.openChannel(deviceId, label) ?? null,
|
|
62
|
-
onChange: () => this._broadcast({ type: 'mobile.previews_changed', timestamp: new Date().toISOString() }),
|
|
63
|
-
})
|
|
64
|
-
: null;
|
|
65
|
-
}
|
|
66
|
-
get preview() {
|
|
67
|
-
return this._preview;
|
|
68
|
-
}
|
|
69
|
-
/** A revoked device loses its peer mapping and every preview it owns. */
|
|
70
|
-
async closePreviewsForDevice(deviceId) {
|
|
71
|
-
this._webrtc?.forgetDevice(deviceId);
|
|
72
|
-
await this._preview?.closeForDevice(deviceId);
|
|
73
56
|
}
|
|
74
57
|
get bridge() {
|
|
75
58
|
return this._bridge;
|
|
@@ -156,7 +139,6 @@ class MobileGateway {
|
|
|
156
139
|
db: this._db,
|
|
157
140
|
desktopPort: this._desktopPort,
|
|
158
141
|
currentFingerprint: () => this._cert.fingerprint,
|
|
159
|
-
...(this._preview ? { preview: this._preview } : {}),
|
|
160
142
|
}));
|
|
161
143
|
const server = https_1.default.createServer({ cert: this._cert.certPem, key: this._cert.keyPem }, app);
|
|
162
144
|
// BUG-MOBILE-02: scope each socket's subscribe to the device's granted
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.COMPANION_ACTION_TIERS = exports.COMPANION_ACTIONS = void 0;
|
|
4
|
+
exports.companionTargetsFor = companionTargetsFor;
|
|
5
|
+
exports.companionView = companionView;
|
|
6
|
+
exports.createMobileInboxRouter = createMobileInboxRouter;
|
|
7
|
+
const express_1 = require("express");
|
|
8
|
+
const mcp_tiers_1 = require("../mcp/mcp-tiers");
|
|
9
|
+
const mobile_devices_1 = require("./mobile-devices");
|
|
10
|
+
const mobile_redact_1 = require("./mobile-redact");
|
|
11
|
+
/**
|
|
12
|
+
* The paired companion as a decision remote for the "Needs you" inbox.
|
|
13
|
+
*
|
|
14
|
+
* Read: `GET /v1/inbox` is the desktop read-model, narrowed to the device's
|
|
15
|
+
* project grant, with the SAFE actions each row offers right now.
|
|
16
|
+
*
|
|
17
|
+
* Act: a closed set of four actions, each forwarded to the very route the
|
|
18
|
+
* desktop UI uses, addressed to ONE project and tier-checked with the MCP
|
|
19
|
+
* permission tiers (so turning a tier off in Settings ▸ MCP also turns the
|
|
20
|
+
* action off on the phone). Everything else (merge, discard, force-push,
|
|
21
|
+
* settings, delete) has no route here and the catch-all refuses it.
|
|
22
|
+
*/
|
|
23
|
+
/** Actions a companion may run. Anything else is desktop-only. */
|
|
24
|
+
exports.COMPANION_ACTIONS = ['answer', 'resume', 'retry', 'create-pr'];
|
|
25
|
+
/**
|
|
26
|
+
* Tier per action. Answering only continues work the person already started
|
|
27
|
+
* (write); resume and retry spend tokens (ai-spawn); a draft PR pushes a branch
|
|
28
|
+
* to the remote, an external-system mutation (destructive, as in the MCP tiers).
|
|
29
|
+
*/
|
|
30
|
+
exports.COMPANION_ACTION_TIERS = {
|
|
31
|
+
answer: 'write',
|
|
32
|
+
resume: 'ai-spawn',
|
|
33
|
+
retry: 'ai-spawn',
|
|
34
|
+
'create-pr': 'destructive',
|
|
35
|
+
};
|
|
36
|
+
const NOT_PRIMARY = new Set(['open-logs', 'edit-spec']);
|
|
37
|
+
/** The first remedy a phone can act on, mirroring the desktop's ranking (open-logs / edit-spec need the desk). */
|
|
38
|
+
function primaryRemedy(item) {
|
|
39
|
+
const remedies = item.diagnosis?.remedies ?? [];
|
|
40
|
+
return remedies.find((remedy) => !NOT_PRIMARY.has(remedy)) ?? null;
|
|
41
|
+
}
|
|
42
|
+
/** Which safe actions an item offers, and the identities the phone posts back. Pure. */
|
|
43
|
+
function companionTargetsFor(item) {
|
|
44
|
+
const none = { ids: [], target: {} };
|
|
45
|
+
if (item.action === 'raise-cap' || item.action === 'retry-jira')
|
|
46
|
+
return none;
|
|
47
|
+
if (item.kind === 'question')
|
|
48
|
+
return { ids: ['answer'], target: { runId: item.subjectId } };
|
|
49
|
+
if (item.action === 'resume-run')
|
|
50
|
+
return { ids: ['resume'], target: { runId: item.subjectId } };
|
|
51
|
+
if (item.kind === 'review') {
|
|
52
|
+
return item.decision === 'on_review'
|
|
53
|
+
? { ids: ['create-pr'], target: { expectedDecision: 'on_review' } }
|
|
54
|
+
: none;
|
|
55
|
+
}
|
|
56
|
+
if (item.kind === 'failed' || item.kind === 'blocked') {
|
|
57
|
+
const primary = primaryRemedy(item);
|
|
58
|
+
const isRun = item.action === 'open-run';
|
|
59
|
+
if (primary === 'resume' && isRun)
|
|
60
|
+
return { ids: ['resume'], target: { runId: item.subjectId } };
|
|
61
|
+
if (primary === 'retry' && typeof item.railIndex === 'number') {
|
|
62
|
+
return { ids: ['retry'], target: { sourceId: isRun ? `run:${item.subjectId}` : item.subjectId, railIndex: item.railIndex } };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return none;
|
|
66
|
+
}
|
|
67
|
+
function companionView(db, item) {
|
|
68
|
+
const { ids, target } = companionTargetsFor(item);
|
|
69
|
+
return {
|
|
70
|
+
actions: ids.map((id) => ({ id, tier: exports.COMPANION_ACTION_TIERS[id], enabled: (0, mcp_tiers_1.isTierEnabled)(db, exports.COMPANION_ACTION_TIERS[id]) })),
|
|
71
|
+
...target,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const PID = /^[A-Za-z0-9_-]{1,64}$/;
|
|
75
|
+
const RUN_ID = /^[A-Za-z0-9-]{1,128}$/;
|
|
76
|
+
const SOURCE_ID = /^(?:run:)?[A-Za-z0-9-]{1,128}$/;
|
|
77
|
+
const MAX_ANSWER = 20_000;
|
|
78
|
+
const MAX_RUN_CAP_USD = 10_000;
|
|
79
|
+
const record = (value) => value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
80
|
+
const pick = (value, keys) => Object.fromEntries(Object.entries(record(value)).filter(([key]) => keys.includes(key)));
|
|
81
|
+
function createMobileInboxRouter({ db, upstream }) {
|
|
82
|
+
const router = (0, express_1.Router)();
|
|
83
|
+
const seg = (value) => (typeof value === 'string' ? value : '');
|
|
84
|
+
const send = async (res, method, path, body, shape) => {
|
|
85
|
+
try {
|
|
86
|
+
const result = await upstream(method, path, body);
|
|
87
|
+
const ok = result.status >= 200 && result.status < 300;
|
|
88
|
+
res.status(result.status).json((0, mobile_redact_1.redact)(ok && shape ? shape(result.json) : result.json));
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
res.status(502).json({ error: 'Desktop is unreachable. Retry when connected.' });
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
/** 403 unless the action's permission tier is on. */
|
|
95
|
+
const tierGate = (res, action) => {
|
|
96
|
+
const tier = exports.COMPANION_ACTION_TIERS[action];
|
|
97
|
+
if ((0, mcp_tiers_1.isTierEnabled)(db, tier))
|
|
98
|
+
return true;
|
|
99
|
+
res.status(403).json({ error: 'tier_disabled', tier, action });
|
|
100
|
+
return false;
|
|
101
|
+
};
|
|
102
|
+
const base = (pid) => `/api/projects/${encodeURIComponent(pid)}`;
|
|
103
|
+
router.get('/inbox', async (req, res) => {
|
|
104
|
+
const allowed = (0, mobile_devices_1.getAllowedProjects)(db, req.mobileDevice.id);
|
|
105
|
+
try {
|
|
106
|
+
const result = await upstream('GET', '/api/inbox');
|
|
107
|
+
if (result.status !== 200) {
|
|
108
|
+
res.status(result.status).json((0, mobile_redact_1.redact)(result.json));
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const snapshot = record(result.json);
|
|
112
|
+
const visible = (projectId) => typeof projectId === 'string' && (allowed === null || allowed.has(projectId));
|
|
113
|
+
const items = (Array.isArray(snapshot.items) ? snapshot.items : [])
|
|
114
|
+
.filter((item) => visible(record(item).projectId))
|
|
115
|
+
.map((item) => ({ ...item, companion: companionView(db, item) }));
|
|
116
|
+
const projects = (Array.isArray(snapshot.projects) ? snapshot.projects : []).filter((p) => visible(record(p).projectId));
|
|
117
|
+
res.json((0, mobile_redact_1.redact)({ items, projects, generatedAt: snapshot.generatedAt }));
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
res.status(502).json({ error: 'Desktop is unreachable. Retry when connected.' });
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
// The question a paused run is waiting on (the Answer sheet shows it verbatim).
|
|
124
|
+
router.get('/projects/:pid/inbox/runs/:runId/question', async (req, res) => {
|
|
125
|
+
const pid = seg(req.params.pid), runId = seg(req.params.runId);
|
|
126
|
+
if (!PID.test(pid) || !RUN_ID.test(runId)) {
|
|
127
|
+
res.status(400).json({ error: 'Invalid parameter' });
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
await send(res, 'GET', `${base(pid)}/agent-runtime/runs/${encodeURIComponent(runId)}`, undefined, (json) => {
|
|
131
|
+
const run = record((Array.isArray(record(json).runs) ? record(json).runs : [])[0]);
|
|
132
|
+
const question = record(run.pendingQuestion);
|
|
133
|
+
return typeof question.question === 'string'
|
|
134
|
+
? { pending: true, question: question.question, requestedAt: question.requestedAt ?? null }
|
|
135
|
+
: { pending: false };
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
// Answer agent question: the desktop's run "Answer" (runtime resume with an answer).
|
|
139
|
+
router.post('/projects/:pid/inbox/answer', async (req, res) => {
|
|
140
|
+
const pid = seg(req.params.pid), body = record(req.body), runId = seg(body.runId), answer = body.answer;
|
|
141
|
+
if (!PID.test(pid) || !RUN_ID.test(runId)) {
|
|
142
|
+
res.status(400).json({ error: 'Invalid parameter' });
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (typeof answer !== 'string' || !answer.trim() || answer.length > MAX_ANSWER) {
|
|
146
|
+
res.status(400).json({ error: `An answer of 1–${MAX_ANSWER} characters is required` });
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (!tierGate(res, 'answer'))
|
|
150
|
+
return;
|
|
151
|
+
let run;
|
|
152
|
+
try {
|
|
153
|
+
const status = await upstream('GET', `${base(pid)}/agent-runtime/runs/${encodeURIComponent(runId)}`);
|
|
154
|
+
if (status.status !== 200) {
|
|
155
|
+
res.status(status.status).json((0, mobile_redact_1.redact)(status.json));
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
run = record((Array.isArray(record(status.json).runs) ? record(status.json).runs : [])[0]);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
res.status(502).json({ error: 'Desktop is unreachable. Retry when connected.' });
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const question = record(run.pendingQuestion);
|
|
165
|
+
if (typeof question.question !== 'string' || question.answeredAt !== undefined) {
|
|
166
|
+
res.status(409).json({ error: 'no_pending_question' });
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const definition = run.engineVersion === 2;
|
|
170
|
+
const path = definition
|
|
171
|
+
? `${base(pid)}/loop-runs/${encodeURIComponent(runId)}/resume`
|
|
172
|
+
: `${base(pid)}/agent-runtime/runs/${encodeURIComponent(runId)}/resume`;
|
|
173
|
+
await send(res, 'POST', path, { answer: answer.trim(), ...(definition && typeof question.stepId === 'string' ? { interruptId: question.stepId } : {}) });
|
|
174
|
+
});
|
|
175
|
+
// Resume a budget/limit-paused or interrupted run; a run paused at its per-run cap takes the person's choice.
|
|
176
|
+
router.post('/projects/:pid/inbox/resume', async (req, res) => {
|
|
177
|
+
const pid = seg(req.params.pid), body = record(req.body), runId = seg(body.runId);
|
|
178
|
+
if (!PID.test(pid) || !RUN_ID.test(runId)) {
|
|
179
|
+
res.status(400).json({ error: 'Invalid parameter' });
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const narrowed = {};
|
|
183
|
+
if (body.runCap !== undefined) {
|
|
184
|
+
if (body.runCap !== 'ignore') {
|
|
185
|
+
res.status(400).json({ error: 'runCap must be "ignore"' });
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
narrowed.runCap = 'ignore';
|
|
189
|
+
}
|
|
190
|
+
if (body.runCapUsd !== undefined) {
|
|
191
|
+
if (typeof body.runCapUsd !== 'number' || !Number.isFinite(body.runCapUsd) || body.runCapUsd <= 0 || body.runCapUsd > MAX_RUN_CAP_USD) {
|
|
192
|
+
res.status(400).json({ error: 'runCapUsd must be a positive amount' });
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (narrowed.runCap) {
|
|
196
|
+
res.status(400).json({ error: 'Choose ignore or raise, not both' });
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
narrowed.runCapUsd = body.runCapUsd;
|
|
200
|
+
}
|
|
201
|
+
if (!tierGate(res, 'resume'))
|
|
202
|
+
return;
|
|
203
|
+
await send(res, 'POST', `${base(pid)}/loop-runs/${encodeURIComponent(runId)}/resume`, narrowed);
|
|
204
|
+
});
|
|
205
|
+
// Retry the failed attempt: the cockpit's relaunch of the same rail, same source.
|
|
206
|
+
router.post('/projects/:pid/inbox/retry', async (req, res) => {
|
|
207
|
+
const pid = seg(req.params.pid), body = record(req.body), sourceId = seg(body.sourceId), railIndex = body.railIndex;
|
|
208
|
+
if (!PID.test(pid) || !SOURCE_ID.test(sourceId)) {
|
|
209
|
+
res.status(400).json({ error: 'Invalid parameter' });
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (typeof railIndex !== 'number' || !Number.isSafeInteger(railIndex) || railIndex < 0 || railIndex > 1000) {
|
|
213
|
+
res.status(400).json({ error: 'Invalid rail' });
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
if (!tierGate(res, 'retry'))
|
|
217
|
+
return;
|
|
218
|
+
await send(res, 'POST', `${base(pid)}/rails/${railIndex}/relaunch`, { sourceId });
|
|
219
|
+
});
|
|
220
|
+
// Create draft PR: the PR decision, narrowed to create-pr on a delivery that is still on review.
|
|
221
|
+
router.post('/projects/:pid/inbox/create-pr', async (req, res) => {
|
|
222
|
+
const pid = seg(req.params.pid), body = record(req.body), prDeliveryId = seg(body.prDeliveryId);
|
|
223
|
+
if (!PID.test(pid) || !RUN_ID.test(prDeliveryId)) {
|
|
224
|
+
res.status(400).json({ error: 'Invalid parameter' });
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
if (body.expectedDecision !== 'on_review') {
|
|
228
|
+
res.status(400).json({ error: 'expectedDecision must be on_review' });
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (!tierGate(res, 'create-pr'))
|
|
232
|
+
return;
|
|
233
|
+
await send(res, 'POST', `${base(pid)}/rails/pr-decision`, { prDeliveryId, action: 'create-pr', expectedDecision: 'on_review' }, (json) => pick(json, ['ok', 'decision', 'prUrl', 'prState', 'detail']));
|
|
234
|
+
});
|
|
235
|
+
// Deny by name, not by silence: merge, discard, publish, force-push, settings, delete.
|
|
236
|
+
router.all('/projects/:pid/inbox/:action', (_req, res) => {
|
|
237
|
+
res.status(403).json({ error: 'action_not_allowed_for_companion', detail: 'This decision stays on Desktop.' });
|
|
238
|
+
});
|
|
239
|
+
return router;
|
|
240
|
+
}
|
|
@@ -16,11 +16,9 @@ const record = (value) => value && typeof value === 'object' && !Array.isArray(v
|
|
|
16
16
|
const pick = (value, keys) => Object.fromEntries(Object.entries(record(value)).filter(([key]) => keys.includes(key)));
|
|
17
17
|
exports.MOBILE_PROTOCOL_VERSION = 2;
|
|
18
18
|
exports.MISSION_ACCESS_REASON = 'Mission agents can access more than their pinned project. Missions require an all-projects device grant; your permitted Specs and Rails remain available.';
|
|
19
|
-
function mobileCapabilities(db, deviceId
|
|
19
|
+
function mobileCapabilities(db, deviceId) {
|
|
20
20
|
const missions = process.env.SPECRAILS_AGENT_CHAT !== 'false' && (0, mobile_devices_1.getAllowedProjects)(db, deviceId) === null;
|
|
21
|
-
|
|
22
|
-
// mission grant and additionally needs Desktop's browser capture.
|
|
23
|
-
return { protocolVersion: exports.MOBILE_PROTOCOL_VERSION, features: { missions, missionControl: missions, missionQueue: missions, missionProcesses: missions, repositories: true, codeExplorer: (0, feature_flags_1.isCodeExplorerEnabled)(), missionRailCards: missions && (0, feature_flags_1.isMissionRailCardsEnabled)(), appPreview: missions && opts.appPreview === true },
|
|
21
|
+
return { protocolVersion: exports.MOBILE_PROTOCOL_VERSION, features: { missions, missionControl: missions, missionQueue: missions, missionProcesses: missions, repositories: true, codeExplorer: (0, feature_flags_1.isCodeExplorerEnabled)(), missionRailCards: missions && (0, feature_flags_1.isMissionRailCardsEnabled)() },
|
|
24
22
|
...(!missions ? { missionsUnavailableReason: process.env.SPECRAILS_AGENT_CHAT === 'false' ? 'Missions are disabled on Desktop.' : exports.MISSION_ACCESS_REASON } : {}) };
|
|
25
23
|
}
|
|
26
24
|
function conversationView(value) {
|
|
@@ -74,7 +72,7 @@ function missionSnapshot(value) {
|
|
|
74
72
|
pendingMessages, pendingTruncated: pending.length > 50,
|
|
75
73
|
live: { ...pick(live, ['isStreaming', 'startedAt']), streamingText, textTruncated: streamingText.length < liveRaw.length } };
|
|
76
74
|
}
|
|
77
|
-
function createMobileMissionsRouter({ db, upstream
|
|
75
|
+
function createMobileMissionsRouter({ db, upstream }) {
|
|
78
76
|
const router = (0, express_1.Router)();
|
|
79
77
|
const segment = (value) => typeof value === 'string' ? value : '';
|
|
80
78
|
const send = async (res, method, path, body, shape) => {
|
|
@@ -86,7 +84,7 @@ function createMobileMissionsRouter({ db, upstream, appPreview }) {
|
|
|
86
84
|
res.status(502).json({ error: 'Desktop is unreachable. Retry when connected.' });
|
|
87
85
|
}
|
|
88
86
|
};
|
|
89
|
-
router.get('/capabilities', (req, res) => res.json(mobileCapabilities(db, req.mobileDevice.id
|
|
87
|
+
router.get('/capabilities', (req, res) => res.json(mobileCapabilities(db, req.mobileDevice.id)));
|
|
90
88
|
router.get('/mission-models', (req, res) => {
|
|
91
89
|
const provider = segment(req.query.provider);
|
|
92
90
|
if (!/^[a-z0-9_-]{1,40}$/.test(provider)) {
|
|
@@ -129,7 +127,7 @@ function createMobileMissionsRouter({ db, upstream, appPreview }) {
|
|
|
129
127
|
return null;
|
|
130
128
|
}
|
|
131
129
|
const conversation = (0, agent_store_1.getAgentConversation)(db, cid);
|
|
132
|
-
if (!conversation || conversation.pinned_project_id !== pid) {
|
|
130
|
+
if (!conversation || conversation.deleted_at || conversation.pinned_project_id !== pid) {
|
|
133
131
|
res.status(404).json({ error: 'Mission not found in this project' });
|
|
134
132
|
return null;
|
|
135
133
|
}
|
|
@@ -144,7 +142,7 @@ function createMobileMissionsRouter({ db, upstream, appPreview }) {
|
|
|
144
142
|
}
|
|
145
143
|
// Query the project before applying the limit: active projects must not
|
|
146
144
|
// disappear behind another project's most recent conversations.
|
|
147
|
-
const rows = db.prepare('SELECT id FROM agent_conversations WHERE pinned_project_id = ? ORDER BY updated_at DESC, id DESC LIMIT ?').all(pid, rawLimit + 1);
|
|
145
|
+
const rows = db.prepare('SELECT id FROM agent_conversations WHERE pinned_project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC, id DESC LIMIT ?').all(pid, rawLimit + 1);
|
|
148
146
|
try {
|
|
149
147
|
const active = await upstream('GET', '/api/agent/active-turns');
|
|
150
148
|
if (active.status !== 200) {
|
|
@@ -9,7 +9,7 @@ const mobile_auth_1 = require("./mobile-auth");
|
|
|
9
9
|
const mobile_devices_1 = require("./mobile-devices");
|
|
10
10
|
const mobile_missions_1 = require("./mobile-missions");
|
|
11
11
|
const mobile_code_1 = require("./mobile-code");
|
|
12
|
-
const
|
|
12
|
+
const mobile_inbox_1 = require("./mobile-inbox");
|
|
13
13
|
// The gateway's authenticated REST surface: the `/v1/*` allow-list. Each route
|
|
14
14
|
// forwards, in-process, via a REAL loopback HTTP request to
|
|
15
15
|
// http://127.0.0.1:<desktopPort> with the master token injected server-side as
|
|
@@ -456,10 +456,9 @@ function createMobileRouter(deps) {
|
|
|
456
456
|
...(body !== undefined ? { body: JSON.stringify(body) } : {}) });
|
|
457
457
|
return { status: response.status, json: await response.json() };
|
|
458
458
|
};
|
|
459
|
-
v1.use((0, mobile_missions_1.createMobileMissionsRouter)({ db: deps.db, upstream: mobileUpstream
|
|
460
|
-
if (deps.preview)
|
|
461
|
-
v1.use((0, mobile_preview_1.createMobilePreviewRouter)({ db: deps.db, preview: deps.preview }));
|
|
459
|
+
v1.use((0, mobile_missions_1.createMobileMissionsRouter)({ db: deps.db, upstream: mobileUpstream }));
|
|
462
460
|
v1.use((0, mobile_code_1.createMobileCodeRouter)(mobileUpstream));
|
|
461
|
+
v1.use((0, mobile_inbox_1.createMobileInboxRouter)({ db: deps.db, upstream: mobileUpstream }));
|
|
463
462
|
router.use('/v1', v1);
|
|
464
463
|
// Any unmatched gateway path → 404 JSON (NEVER falls through to a SPA handler;
|
|
465
464
|
// the gateway serves JSON/WS only, no static client).
|
|
@@ -471,15 +470,16 @@ function createMobileRouter(deps) {
|
|
|
471
470
|
/** The allow-list, exported for the CI drift test (asserts each entry resolves
|
|
472
471
|
* against a real internal route, and that no traversal param is accepted). */
|
|
473
472
|
exports.MOBILE_ALLOWLIST = [
|
|
473
|
+
{ method: 'GET', path: '/v1/inbox' },
|
|
474
|
+
{ method: 'GET', path: '/v1/projects/:pid/inbox/runs/:runId/question' },
|
|
475
|
+
{ method: 'POST', path: '/v1/projects/:pid/inbox/answer' },
|
|
476
|
+
{ method: 'POST', path: '/v1/projects/:pid/inbox/resume' },
|
|
477
|
+
{ method: 'POST', path: '/v1/projects/:pid/inbox/retry' },
|
|
478
|
+
{ method: 'POST', path: '/v1/projects/:pid/inbox/create-pr' },
|
|
474
479
|
{ method: 'GET', path: '/v1/projects/:pid/repositories/:rid/code/tree' },
|
|
475
480
|
{ method: 'GET', path: '/v1/projects/:pid/repositories/:rid/code/find' },
|
|
476
481
|
{ method: 'GET', path: '/v1/projects/:pid/repositories/:rid/code/file' },
|
|
477
482
|
{ method: 'GET', path: '/v1/capabilities' },
|
|
478
|
-
{ method: 'GET', path: '/v1/projects/:pid/missions/:cid/preview-targets' },
|
|
479
|
-
{ method: 'POST', path: '/v1/projects/:pid/preview-sessions' },
|
|
480
|
-
{ method: 'POST', path: '/v1/projects/:pid/preview-sessions/:sid/attach' },
|
|
481
|
-
{ method: 'POST', path: '/v1/projects/:pid/preview-sessions/:sid/navigate' },
|
|
482
|
-
{ method: 'DELETE', path: '/v1/projects/:pid/preview-sessions/:sid' },
|
|
483
483
|
{ method: 'GET', path: '/v1/mission-models' },
|
|
484
484
|
{ method: 'PATCH', path: '/v1/projects/:pid/missions/:cid/messages/:mid/intent' },
|
|
485
485
|
{ method: 'GET', path: '/v1/projects/:pid/repositories' },
|
|
@@ -14,9 +14,6 @@ class MobileWebrtcGateway {
|
|
|
14
14
|
// answer to whatever happened to be pending. Per-room keying isolates them.
|
|
15
15
|
_pending = new Map();
|
|
16
16
|
_active = new Set();
|
|
17
|
-
/** The live peer of each authenticated device (latest wins), so Desktop can
|
|
18
|
-
* open extra DataChannels (app preview) on the connection it already has. */
|
|
19
|
-
_byDevice = new Map();
|
|
20
17
|
constructor(_deps) {
|
|
21
18
|
this._deps = _deps;
|
|
22
19
|
}
|
|
@@ -51,23 +48,17 @@ class MobileWebrtcGateway {
|
|
|
51
48
|
// require a valid existing device token instead, and never mint.
|
|
52
49
|
new mobile_datachannel_1.DataChannelPeer(toChannelLike(dc), {
|
|
53
50
|
registerDevice: async (input) => {
|
|
54
|
-
let result;
|
|
55
51
|
if (isReconnect) {
|
|
56
|
-
|
|
52
|
+
return this._deps.registerDevice({
|
|
57
53
|
deviceName: input.deviceName,
|
|
58
54
|
platform: input.platform,
|
|
59
55
|
token: input.token,
|
|
60
56
|
requireExistingToken: true,
|
|
61
57
|
});
|
|
62
58
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
: { ok: false };
|
|
67
|
-
}
|
|
68
|
-
if (result.ok)
|
|
69
|
-
this._byDevice.set(result.deviceId, pc);
|
|
70
|
-
return result;
|
|
59
|
+
return input.secret && (0, auth_1.safeEqual)(input.secret, secret)
|
|
60
|
+
? this._deps.registerDevice({ deviceName: input.deviceName, platform: input.platform, token: input.token })
|
|
61
|
+
: { ok: false };
|
|
71
62
|
},
|
|
72
63
|
rpcDispatch: this._deps.rpcDispatch,
|
|
73
64
|
bridge: this._deps.bridge,
|
|
@@ -76,9 +67,6 @@ class MobileWebrtcGateway {
|
|
|
76
67
|
console.log('[webrtc] pc connectionState:', s);
|
|
77
68
|
if (s === 'failed' || s === 'closed' || s === 'disconnected') {
|
|
78
69
|
this._active.delete(pc);
|
|
79
|
-
for (const [deviceId, owned] of this._byDevice)
|
|
80
|
-
if (owned === pc)
|
|
81
|
-
this._byDevice.delete(deviceId);
|
|
82
70
|
// Drop this pc from whichever room slot still holds it.
|
|
83
71
|
if (this._pending.get(key)?.pc === pc)
|
|
84
72
|
this._pending.delete(key);
|
|
@@ -113,24 +101,6 @@ class MobileWebrtcGateway {
|
|
|
113
101
|
return { ok: false };
|
|
114
102
|
}
|
|
115
103
|
}
|
|
116
|
-
/** Open an ordered, reliable DataChannel on the device's live peer (no SDP
|
|
117
|
-
* renegotiation: the SCTP association already exists). Null when the
|
|
118
|
-
* device has no connected WebRTC peer. */
|
|
119
|
-
openChannel(deviceId, label) {
|
|
120
|
-
const pc = this._byDevice.get(deviceId);
|
|
121
|
-
if (!pc || pc.connectionState !== 'connected')
|
|
122
|
-
return null;
|
|
123
|
-
try {
|
|
124
|
-
return toPreviewChannel(pc.createDataChannel(label, { ordered: true }));
|
|
125
|
-
}
|
|
126
|
-
catch {
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
/** Forget a device's peer (revoked). Its channels close with the peer. */
|
|
131
|
-
forgetDevice(deviceId) {
|
|
132
|
-
this._byDevice.delete(deviceId);
|
|
133
|
-
}
|
|
134
104
|
/** Tear down every peer (gateway stopping / disabled). */
|
|
135
105
|
stop() {
|
|
136
106
|
for (const key of [...this._pending.keys()])
|
|
@@ -138,7 +108,6 @@ class MobileWebrtcGateway {
|
|
|
138
108
|
for (const pc of this._active)
|
|
139
109
|
this._close(pc);
|
|
140
110
|
this._active.clear();
|
|
141
|
-
this._byDevice.clear();
|
|
142
111
|
}
|
|
143
112
|
_close(pc) {
|
|
144
113
|
try {
|
|
@@ -168,25 +137,6 @@ function toChannelLike(dc) {
|
|
|
168
137
|
},
|
|
169
138
|
};
|
|
170
139
|
}
|
|
171
|
-
function toPreviewChannel(dc) {
|
|
172
|
-
return {
|
|
173
|
-
get label() { return dc.label; },
|
|
174
|
-
get readyState() { return dc.readyState; },
|
|
175
|
-
get bufferedAmount() { return dc.bufferedAmount; },
|
|
176
|
-
send: (data) => dc.send(data),
|
|
177
|
-
close: () => dc.close(),
|
|
178
|
-
onOpen: (cb) => {
|
|
179
|
-
if (dc.readyState === 'open')
|
|
180
|
-
queueMicrotask(cb);
|
|
181
|
-
else
|
|
182
|
-
dc.stateChanged.subscribe((s) => { if (s === 'open')
|
|
183
|
-
cb(); });
|
|
184
|
-
},
|
|
185
|
-
onMessage: (cb) => { dc.onMessage.subscribe((d) => cb(d)); },
|
|
186
|
-
onClose: (cb) => { dc.stateChanged.subscribe((s) => { if (s === 'closed')
|
|
187
|
-
cb(); }); },
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
140
|
/** Vanilla ICE: resolve once gathering completes so the offer SDP carries all
|
|
191
141
|
* candidates (there's no trickle channel — the SDP travels by QR). */
|
|
192
142
|
function waitIceComplete(pc) {
|