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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specrails-desktop",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.65.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -51,6 +51,7 @@
|
|
|
51
51
|
"ci": "npm run typecheck && npm run check-core-compat && npm run test:scripts && npm run test:coverage && npm run test:coverage --prefix client && npm run build && npm run check:package",
|
|
52
52
|
"audit:source": "node scripts/audit-source.mjs",
|
|
53
53
|
"docs:source-map": "node scripts/generate-source-map.mjs",
|
|
54
|
+
"metrics:baseline": "node scripts/metrics-baseline.mjs",
|
|
54
55
|
"audit:architecture": "node scripts/audit-server-modules.mjs --check && node scripts/audit-client-features.mjs --check"
|
|
55
56
|
},
|
|
56
57
|
"dependencies": {
|
|
@@ -61,22 +62,22 @@
|
|
|
61
62
|
"chokidar": "^5.0.0",
|
|
62
63
|
"cross-spawn": "^7.0.6",
|
|
63
64
|
"diff": "^9.0.0",
|
|
64
|
-
"express": "^5.
|
|
65
|
-
"js-yaml": "
|
|
65
|
+
"express": "^5.3.0",
|
|
66
|
+
"js-yaml": "5.5.0",
|
|
66
67
|
"multer": "^2.2.0",
|
|
67
68
|
"node-pty": "^1.0.0",
|
|
68
69
|
"pdf-parse": "^2.4.5",
|
|
69
|
-
"playwright": "^1.
|
|
70
|
-
"read-excel-file": "^9.
|
|
70
|
+
"playwright": "^1.64.1",
|
|
71
|
+
"read-excel-file": "^9.3.12",
|
|
71
72
|
"selfsigned": "^5.5.0",
|
|
72
73
|
"tree-kill": "^1.2.2",
|
|
73
74
|
"werift": "^0.23.0",
|
|
74
75
|
"ws": "^8.22.0",
|
|
75
|
-
"zod": "^
|
|
76
|
+
"zod": "^4.6.7"
|
|
76
77
|
},
|
|
77
78
|
"devDependencies": {
|
|
78
|
-
"@babel/parser": "^
|
|
79
|
-
"@tauri-apps/cli": "^2.
|
|
79
|
+
"@babel/parser": "^8.0.7",
|
|
80
|
+
"@tauri-apps/cli": "^2.12.3",
|
|
80
81
|
"@types/better-sqlite3": "^7.6.0",
|
|
81
82
|
"@types/cross-spawn": "^6.0.6",
|
|
82
83
|
"@types/express": "^5.0.6",
|
|
@@ -87,7 +88,7 @@
|
|
|
87
88
|
"@types/supertest": "^7.2.0",
|
|
88
89
|
"@types/ws": "^8.5.0",
|
|
89
90
|
"@vitest/coverage-v8": "^5.0.3",
|
|
90
|
-
"concurrently": "^
|
|
91
|
+
"concurrently": "^10.0.6",
|
|
91
92
|
"esbuild": "^0.28.1",
|
|
92
93
|
"supertest": "^7.2.2",
|
|
93
94
|
"tsx": "^4.23.0",
|
|
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.GEMINI_PLAN_MCP_POLICY_FILE = void 0;
|
|
6
7
|
exports.resolveBridgeScript = resolveBridgeScript;
|
|
7
8
|
exports.resolveNodeCommand = resolveNodeCommand;
|
|
8
9
|
exports.buildSpecrailsMcpEntry = buildSpecrailsMcpEntry;
|
|
@@ -12,6 +13,7 @@ exports.prepareAgentMcpSpec = prepareAgentMcpSpec;
|
|
|
12
13
|
exports.rotateAgentSessionCapability = rotateAgentSessionCapability;
|
|
13
14
|
exports.removeAgentCapabilityFile = removeAgentCapabilityFile;
|
|
14
15
|
exports.prepareAgentMcp = prepareAgentMcp;
|
|
16
|
+
exports.writeGeminiPlanMcpPolicy = writeGeminiPlanMcpPolicy;
|
|
15
17
|
exports.syncExternalServersIntoJsonFile = syncExternalServersIntoJsonFile;
|
|
16
18
|
const fs_1 = __importDefault(require("fs"));
|
|
17
19
|
const path_1 = __importDefault(require("path"));
|
|
@@ -378,10 +380,44 @@ function prepareAgentMcp(opts) {
|
|
|
378
380
|
// via env — the same pattern every other gemini spawn path already uses
|
|
379
381
|
// (chat-manager / queue-manager / cli-prompt). Verified empirically against
|
|
380
382
|
// gemini-cli 0.49.0 (see docs/internals note on FQN tool prefixing).
|
|
381
|
-
|
|
383
|
+
// Read-only missions run in Gemini's native plan mode, which removes every
|
|
384
|
+
// MCP tool from the session. A plan-mode-scoped policy allows exactly the
|
|
385
|
+
// servers registered above (verified on gemini-cli 0.49.0); every built-in
|
|
386
|
+
// write/shell tool stays denied by plan mode itself.
|
|
387
|
+
const extraArgs = opts.readOnly
|
|
388
|
+
? ['--policy', writeGeminiPlanMcpPolicy(path_1.default.dirname(file), ['specrails', ...external.map((server) => server.name)])]
|
|
389
|
+
: [];
|
|
390
|
+
return { extraArgs, env: { GEMINI_CLI_TRUST_WORKSPACE: 'true' } };
|
|
382
391
|
}
|
|
383
392
|
return { extraArgs: [], env: {} };
|
|
384
393
|
}
|
|
394
|
+
/** Names Gemini's policy engine can match without TOML escaping concerns. */
|
|
395
|
+
const GEMINI_POLICY_SERVER_NAME = /^[A-Za-z0-9_-]{1,64}$/;
|
|
396
|
+
exports.GEMINI_PLAN_MCP_POLICY_FILE = 'specrails-plan-mcp-policy.toml';
|
|
397
|
+
/**
|
|
398
|
+
* Write the plan-mode policy that keeps the named MCP servers callable in a
|
|
399
|
+
* read-only Gemini turn. Rules apply only in plan mode (`modes = ["plan"]`), at
|
|
400
|
+
* user tier, so they cannot widen a default/yolo session. Returns the file path.
|
|
401
|
+
*/
|
|
402
|
+
function writeGeminiPlanMcpPolicy(dir, serverNames) {
|
|
403
|
+
const names = [...new Set(serverNames)].filter((name) => GEMINI_POLICY_SERVER_NAME.test(name));
|
|
404
|
+
const rules = names.map((name) => [
|
|
405
|
+
'[[rule]]',
|
|
406
|
+
'toolName = "*"',
|
|
407
|
+
`mcpName = ${JSON.stringify(name)}`,
|
|
408
|
+
'decision = "allow"',
|
|
409
|
+
'priority = 100',
|
|
410
|
+
'modes = ["plan"]',
|
|
411
|
+
].join('\n'));
|
|
412
|
+
const file = path_1.default.join(dir, exports.GEMINI_PLAN_MCP_POLICY_FILE);
|
|
413
|
+
fs_1.default.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
414
|
+
fs_1.default.writeFileSync(file, `# Written by Specrails for read-only missions. Plan mode only.\n${rules.join('\n\n')}\n`, { mode: 0o600 });
|
|
415
|
+
try {
|
|
416
|
+
fs_1.default.chmodSync(file, 0o600);
|
|
417
|
+
}
|
|
418
|
+
catch { /* best-effort */ }
|
|
419
|
+
return file;
|
|
420
|
+
}
|
|
385
421
|
/** Merge `mcpServers.specrails` into a JSON config file (read-if-exists,
|
|
386
422
|
* preserve every other key, corrupt file → start fresh, chmod 600). Shape is
|
|
387
423
|
* shared by claude-style `.mcp.json` and gemini `.gemini/settings.json` —
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.API_VERSION_HEADER = exports.API_VERSION = void 0;
|
|
4
|
+
exports.apiVersionHeader = apiVersionHeader;
|
|
5
|
+
/**
|
|
6
|
+
* Version of the local HTTP API contract (`/api/**`).
|
|
7
|
+
*
|
|
8
|
+
* Bump ONLY on a breaking change (a removed route or field, or a changed
|
|
9
|
+
* meaning). Additive changes keep the version. Deprecated routes/fields are
|
|
10
|
+
* announced in CHANGELOG under "Deprecations" and kept for at least two minor
|
|
11
|
+
* releases — see docs/internals/api-reference.md#versioning-and-deprecation-policy.
|
|
12
|
+
*/
|
|
13
|
+
exports.API_VERSION = 1;
|
|
14
|
+
exports.API_VERSION_HEADER = 'X-Specrails-Api-Version';
|
|
15
|
+
/** Stamps every `/api` response (including errors and auth rejections). */
|
|
16
|
+
function apiVersionHeader(_req, res, next) {
|
|
17
|
+
res.setHeader(exports.API_VERSION_HEADER, String(exports.API_VERSION));
|
|
18
|
+
next();
|
|
19
|
+
}
|
|
@@ -32,7 +32,8 @@ Use this draft schema. Omit fields you do not want to update:
|
|
|
32
32
|
\`\`\`spec-draft
|
|
33
33
|
{
|
|
34
34
|
"title": "Concise, action-oriented title",
|
|
35
|
-
"description": "## Problem Statement\\n2-3 sentences.\\n\\n## Proposed Solution\\n3-5 sentences.\\n\\n##
|
|
35
|
+
"description": "## Problem Statement\\n2-3 sentences.\\n\\n## Proposed Solution\\n3-5 sentences.\\n\\n## Technical Considerations\\n- bullet\\n\\n## Estimated Complexity\\nMedium - one sentence justification.",
|
|
36
|
+
"nonGoals": ["What this spec deliberately does NOT change or deliver"],
|
|
36
37
|
"labels": ["short-label"],
|
|
37
38
|
"priority": "low | medium | high | critical",
|
|
38
39
|
"acceptanceCriteria": ["Short, testable criterion"],
|
|
@@ -44,7 +45,8 @@ Use this draft schema. Omit fields you do not want to update:
|
|
|
44
45
|
Rules:
|
|
45
46
|
- Ask only the clarifying questions genuinely needed to make the spec concrete.
|
|
46
47
|
- Keep visible replies brief.
|
|
47
|
-
-
|
|
48
|
+
- \`nonGoals\` lists 1-5 things the spec deliberately leaves out (shown as \"Out of scope\" under the description); keep them out of \`description\`.
|
|
49
|
+
- Set \`ready: true\` only when the draft has a title, description, acceptance criteria, at least one non-goal, and no outstanding clarifying question.
|
|
48
50
|
- Never call \`/specrails:propose-spec\`, \`/specrails:implement\`, or any slash command with side effects.
|
|
49
51
|
|
|
50
52
|
The user's idea follows below. Begin the Explore Spec conversation.
|
|
@@ -21,7 +21,7 @@ const core_runtime_1 = require("./core-runtime");
|
|
|
21
21
|
// Windows has no `which`; probe PATH via `where` instead.
|
|
22
22
|
const WHICH_CMD = process.platform === 'win32' ? 'where' : 'which';
|
|
23
23
|
/** Paired development target; older supported contracts (5.1) remain compatible. */
|
|
24
|
-
exports.EXPECTED_CORE_CONTRACT_SCHEMA_VERSION = '5.
|
|
24
|
+
exports.EXPECTED_CORE_CONTRACT_SCHEMA_VERSION = '5.9';
|
|
25
25
|
// These must mirror KNOWN_VERBS in cli/specrails-desktop.ts
|
|
26
26
|
const DESKTOP_KNOWN_COMMANDS = new Set([
|
|
27
27
|
'implement',
|
|
@@ -70,7 +70,8 @@ function prepareCoreExecution(input) {
|
|
|
70
70
|
};
|
|
71
71
|
const repositories = manifest
|
|
72
72
|
? manifest.repositories.map(repo => scoped({ id: repo.repositoryId, name: repo.name, path: (0, node_fs_1.realpathSync)(repo.worktreePath), baseSha: repo.baseSha }, repo.workspacePath ?? repo.sourcePath, repo.workspacePaths, repo.selectedWorkspacePaths))
|
|
73
|
-
: [scoped({ id: run.repositoryId ?? (run.spec?.repositoryIds?.length === 1 ? run.spec.repositoryIds[0] : run.projectId ? `primary-${run.projectId}` : 'primary'), name: (0, node_path_1.basename)(input.repoDir ?? cwd), path: (0, node_fs_1.realpathSync)(input.repoDir ?? cwd)
|
|
73
|
+
: [scoped({ id: run.repositoryId ?? (run.spec?.repositoryIds?.length === 1 ? run.spec.repositoryIds[0] : run.projectId ? `primary-${run.projectId}` : 'primary'), name: (0, node_path_1.basename)(input.repoDir ?? cwd), path: (0, node_fs_1.realpathSync)(input.repoDir ?? cwd),
|
|
74
|
+
...(input.repositoryBaseSha && /^[a-f0-9]{40,64}$/.test(input.repositoryBaseSha) ? { baseSha: input.repositoryBaseSha } : {}) }, input.sourcePath, input.workspacePaths, input.selectedWorkspacePaths)];
|
|
74
75
|
if (!repositories.length || repositories.some(repo => !SAFE_ID.test(repo.id)))
|
|
75
76
|
throw new Error('Invalid Core repository scope');
|
|
76
77
|
const artifactRepositoryId = manifest?.artifactRepositoryId ?? repositories[0].id;
|
|
@@ -4,6 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.CoreUpdateManager = exports.CORE_PACKAGE = void 0;
|
|
7
|
+
exports.coreDistTagFor = coreDistTagFor;
|
|
8
|
+
exports.fetchChannelFromRegistry = fetchChannelFromRegistry;
|
|
7
9
|
const child_process_1 = require("child_process");
|
|
8
10
|
const fs_1 = __importDefault(require("fs"));
|
|
9
11
|
const os_1 = __importDefault(require("os"));
|
|
@@ -15,12 +17,13 @@ const bundled_core_1 = require("./bundled-core");
|
|
|
15
17
|
const core_runtime_1 = require("./core-runtime");
|
|
16
18
|
const core_package_1 = require("./core-package");
|
|
17
19
|
const artifact_registry_1 = require("./artifact-registry");
|
|
20
|
+
const update_channel_1 = require("./update-channel");
|
|
18
21
|
/** Voluntary Core updates retain the complete npm package and dependencies,
|
|
19
22
|
* publish its framework, then await every project refresh. Partial refreshes
|
|
20
23
|
* remain explicitly pending across restart and can retry without the network.
|
|
21
24
|
* Older packages/frameworks remain available for diagnosis and recovery. */
|
|
22
25
|
exports.CORE_PACKAGE = 'specrails-core';
|
|
23
|
-
const
|
|
26
|
+
const REGISTRY_BASE = `https://registry.npmjs.org/${exports.CORE_PACKAGE}`;
|
|
24
27
|
const CHECK_TIMEOUT_MS = 10_000;
|
|
25
28
|
const INSTALL_TIMEOUT_MS = 180_000;
|
|
26
29
|
class CoreUpdateManager {
|
|
@@ -28,9 +31,13 @@ class CoreUpdateManager {
|
|
|
28
31
|
broadcast;
|
|
29
32
|
providersFn;
|
|
30
33
|
fetchLatestFn;
|
|
34
|
+
channelFn;
|
|
31
35
|
npmInstallFn;
|
|
32
36
|
makeFrameworkFn;
|
|
33
37
|
latestVersion = null;
|
|
38
|
+
/** Channel the cached `latestVersion` was resolved for (legacy caches: latest). */
|
|
39
|
+
latestChannel = update_channel_1.DEFAULT_UPDATE_CHANNEL;
|
|
40
|
+
latestDistTag = null;
|
|
34
41
|
lastCheckedAt = null;
|
|
35
42
|
updating = false;
|
|
36
43
|
pendingVersion = null;
|
|
@@ -40,7 +47,8 @@ class CoreUpdateManager {
|
|
|
40
47
|
this.home = opts.home;
|
|
41
48
|
this.broadcast = opts.broadcast;
|
|
42
49
|
this.providersFn = opts.providers ?? (() => ['claude']);
|
|
43
|
-
this.fetchLatestFn = opts.fetchLatest ?? (() =>
|
|
50
|
+
this.fetchLatestFn = opts.fetchLatest ?? ((channel) => fetchChannelFromRegistry(channel));
|
|
51
|
+
this.channelFn = opts.channel ?? (() => update_channel_1.DEFAULT_UPDATE_CHANNEL);
|
|
44
52
|
this.npmInstallFn = opts.npmInstall ?? defaultNpmInstall;
|
|
45
53
|
this.makeFrameworkFn =
|
|
46
54
|
opts.makeFramework ??
|
|
@@ -51,6 +59,8 @@ class CoreUpdateManager {
|
|
|
51
59
|
if (typeof cached.latestVersion === 'string' && (0, semver_lite_1.isValidVersion)(cached.latestVersion) && Number.isFinite(cached.lastCheckedAt)) {
|
|
52
60
|
this.latestVersion = cached.latestVersion;
|
|
53
61
|
this.lastCheckedAt = cached.lastCheckedAt;
|
|
62
|
+
this.latestChannel = (0, update_channel_1.isUpdateChannel)(cached.channel) ? cached.channel : update_channel_1.DEFAULT_UPDATE_CHANNEL;
|
|
63
|
+
this.latestDistTag = cached.distTag === 'stable' || cached.distTag === 'latest' ? cached.distTag : this.latestChannel;
|
|
54
64
|
}
|
|
55
65
|
if (typeof cached.pendingVersion === 'string' && (0, semver_lite_1.isValidVersion)(cached.pendingVersion)) {
|
|
56
66
|
this.pendingVersion = cached.pendingVersion;
|
|
@@ -63,22 +73,38 @@ class CoreUpdateManager {
|
|
|
63
73
|
isAvailable() {
|
|
64
74
|
return (0, core_runtime_1.getCoreRuntimeStatus)(this.home).runtime !== null || (0, framework_manager_1.readCurrentFrameworkVersion)(this.home) !== null;
|
|
65
75
|
}
|
|
76
|
+
currentChannel() {
|
|
77
|
+
try {
|
|
78
|
+
const channel = this.channelFn();
|
|
79
|
+
return (0, update_channel_1.isUpdateChannel)(channel) ? channel : update_channel_1.DEFAULT_UPDATE_CHANNEL;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return update_channel_1.DEFAULT_UPDATE_CHANNEL;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** Cached target for the CURRENT channel; a check made for another channel never offers its version. */
|
|
86
|
+
channelLatest() {
|
|
87
|
+
return this.latestChannel === this.currentChannel() ? this.latestVersion : null;
|
|
88
|
+
}
|
|
66
89
|
/** Current status — no network (uses the cached latest from the last check). */
|
|
67
90
|
getStatus() {
|
|
91
|
+
const channel = this.currentChannel();
|
|
92
|
+
const latestVersion = this.channelLatest();
|
|
93
|
+
const resolvedDistTag = latestVersion === null ? null : this.latestDistTag;
|
|
68
94
|
const selected = (0, core_runtime_1.getCoreRuntimeStatus)(this.home);
|
|
69
95
|
const bundledVersion = (0, bundled_core_1.getBundledCoreVersion)();
|
|
70
96
|
const frameworkVersion = (0, framework_manager_1.readCurrentFrameworkVersion)(this.home);
|
|
71
97
|
const currentVersion = frameworkVersion ?? selected.runtime?.version ?? null;
|
|
72
98
|
const updateAvailable = this.pendingVersion !== null ||
|
|
73
|
-
|
|
99
|
+
latestVersion != null &&
|
|
74
100
|
currentVersion != null &&
|
|
75
|
-
((0, semver_lite_1.isNewer)(
|
|
76
|
-
(0, core_package_1.isSupportedCoreVersion)(
|
|
101
|
+
((0, semver_lite_1.isNewer)(latestVersion, currentVersion) || selected.error !== null && latestVersion === currentVersion) &&
|
|
102
|
+
(0, core_package_1.isSupportedCoreVersion)(latestVersion);
|
|
77
103
|
return {
|
|
78
104
|
available: this.isAvailable(),
|
|
79
105
|
currentVersion,
|
|
80
106
|
bundledVersion,
|
|
81
|
-
latestVersion
|
|
107
|
+
latestVersion,
|
|
82
108
|
updateAvailable,
|
|
83
109
|
updating: this.updating,
|
|
84
110
|
lastCheckedAt: this.lastCheckedAt,
|
|
@@ -88,15 +114,23 @@ class CoreUpdateManager {
|
|
|
88
114
|
runtimeError: selected.error,
|
|
89
115
|
pendingVersion: this.pendingVersion,
|
|
90
116
|
migrationError: this.migrationError,
|
|
117
|
+
channel,
|
|
118
|
+
resolvedDistTag,
|
|
119
|
+
channelFallback: channel === 'stable' && resolvedDistTag === 'latest',
|
|
91
120
|
};
|
|
92
121
|
}
|
|
93
|
-
/** Hit npm for the
|
|
122
|
+
/** Hit npm for the selected channel's dist-tag, cache it, return refreshed status. */
|
|
94
123
|
async checkForUpdate() {
|
|
95
|
-
const
|
|
124
|
+
const channel = this.currentChannel();
|
|
125
|
+
const fetched = await this.fetchLatestFn(channel);
|
|
126
|
+
const release = typeof fetched === 'string' ? { version: fetched, distTag: 'latest' } : fetched;
|
|
127
|
+
const latest = release.version;
|
|
96
128
|
if (!(0, semver_lite_1.isValidVersion)(latest)) {
|
|
97
129
|
throw new Error(`core-update: npm returned an unparseable version "${latest}"`);
|
|
98
130
|
}
|
|
99
131
|
this.latestVersion = latest.trim().replace(/^[v=]+/, '');
|
|
132
|
+
this.latestChannel = channel;
|
|
133
|
+
this.latestDistTag = release.distTag === 'stable' ? 'stable' : 'latest';
|
|
100
134
|
this.lastCheckedAt = Date.now();
|
|
101
135
|
this.persistStatus();
|
|
102
136
|
return this.getStatus();
|
|
@@ -114,7 +148,7 @@ class CoreUpdateManager {
|
|
|
114
148
|
if (!this.isAvailable()) {
|
|
115
149
|
return { ok: false, error: 'Core updates are unavailable in this build.' };
|
|
116
150
|
}
|
|
117
|
-
const requested = (targetVersion ?? this.pendingVersion ?? this.
|
|
151
|
+
const requested = (targetVersion ?? this.pendingVersion ?? this.channelLatest() ?? '').trim().replace(/^[v=]+/, '');
|
|
118
152
|
if (!requested || !(0, semver_lite_1.isValidVersion)(requested)) {
|
|
119
153
|
return { ok: false, error: 'No valid target version to update to. Check for updates first.' };
|
|
120
154
|
}
|
|
@@ -270,7 +304,7 @@ class CoreUpdateManager {
|
|
|
270
304
|
try {
|
|
271
305
|
const root = (0, core_runtime_1.managedCoreRoot)(this.home);
|
|
272
306
|
fs_1.default.mkdirSync(root, { recursive: true, mode: 0o700 });
|
|
273
|
-
(0, artifact_registry_1.atomicWrite)(path_1.default.join(root, 'update-status.json'), JSON.stringify({ latestVersion: this.latestVersion, lastCheckedAt: this.lastCheckedAt, pendingVersion: this.pendingVersion, migrationError: this.migrationError }));
|
|
307
|
+
(0, artifact_registry_1.atomicWrite)(path_1.default.join(root, 'update-status.json'), JSON.stringify({ latestVersion: this.latestVersion, channel: this.latestChannel, distTag: this.latestDistTag, lastCheckedAt: this.lastCheckedAt, pendingVersion: this.pendingVersion, migrationError: this.migrationError }));
|
|
274
308
|
}
|
|
275
309
|
catch (error) {
|
|
276
310
|
if (required)
|
|
@@ -305,15 +339,39 @@ function realTmpDir() {
|
|
|
305
339
|
return dir;
|
|
306
340
|
}
|
|
307
341
|
}
|
|
308
|
-
/**
|
|
309
|
-
|
|
342
|
+
/** npm dist-tag a channel reads. Exported for tests and docs parity. */
|
|
343
|
+
function coreDistTagFor(channel) {
|
|
344
|
+
return channel === 'stable' ? 'stable' : 'latest';
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Resolve a channel against the npm registry (no npm binary needed). `stable`
|
|
348
|
+
* reads the `stable` dist-tag; only a 404 for that tag (Core has not published
|
|
349
|
+
* one yet) falls back to `latest`, reported as `distTag: 'latest'`. Any other
|
|
350
|
+
* failure fails the check instead of silently changing channel.
|
|
351
|
+
*/
|
|
352
|
+
async function fetchChannelFromRegistry(channel, fetchImpl = fetch) {
|
|
353
|
+
const distTag = coreDistTagFor(channel);
|
|
354
|
+
const version = await fetchDistTag(distTag, fetchImpl);
|
|
355
|
+
if (version !== null)
|
|
356
|
+
return { version, distTag };
|
|
357
|
+
if (distTag === 'latest')
|
|
358
|
+
throw new Error('npm registry returned 404');
|
|
359
|
+
const fallback = await fetchDistTag('latest', fetchImpl);
|
|
360
|
+
if (fallback === null)
|
|
361
|
+
throw new Error('npm registry returned 404');
|
|
362
|
+
return { version: fallback, distTag: 'latest' };
|
|
363
|
+
}
|
|
364
|
+
/** Version for a dist-tag, or null when the registry has no such tag (404). */
|
|
365
|
+
async function fetchDistTag(distTag, fetchImpl) {
|
|
310
366
|
const controller = new AbortController();
|
|
311
367
|
const timer = setTimeout(() => controller.abort(), CHECK_TIMEOUT_MS);
|
|
312
368
|
try {
|
|
313
|
-
const res = await
|
|
369
|
+
const res = await fetchImpl(`${REGISTRY_BASE}/${distTag}`, {
|
|
314
370
|
signal: controller.signal,
|
|
315
371
|
headers: { accept: 'application/json' },
|
|
316
372
|
});
|
|
373
|
+
if (res.status === 404)
|
|
374
|
+
return null;
|
|
317
375
|
if (!res.ok) {
|
|
318
376
|
throw new Error(`npm registry returned ${res.status}`);
|
|
319
377
|
}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.JOB_SEARCH_MAX_LIMIT = exports.JOB_SEARCH_DEFAULT_LIMIT = exports.JOB_SEARCH_BACKFILL_JOBS = exports.JOB_SEARCH_MAX_DOCS = exports.JOB_SEARCH_MAX_PHASES = exports.JOB_SEARCH_MAX_TEXT = void 0;
|
|
4
|
+
exports.createJobSearchSchema = createJobSearchSchema;
|
|
5
|
+
exports.pruneJobSearch = pruneJobSearch;
|
|
6
|
+
exports.indexJob = indexJob;
|
|
7
|
+
exports.indexJobPhase = indexJobPhase;
|
|
8
|
+
exports.safeIndexJob = safeIndexJob;
|
|
9
|
+
exports.safeIndexJobPhase = safeIndexJobPhase;
|
|
10
|
+
exports.safeRemoveJobSearch = safeRemoveJobSearch;
|
|
11
|
+
exports.rebuildJobSearchIndex = rebuildJobSearchIndex;
|
|
12
|
+
exports.searchJobs = searchJobs;
|
|
13
|
+
const search_snippet_1 = require("../util/search-snippet");
|
|
14
|
+
/** Longest text kept per document. */
|
|
15
|
+
exports.JOB_SEARCH_MAX_TEXT = 300;
|
|
16
|
+
/** Phase documents kept per job. */
|
|
17
|
+
exports.JOB_SEARCH_MAX_PHASES = 30;
|
|
18
|
+
/** Documents kept per project; beyond it the oldest tenth is dropped. */
|
|
19
|
+
exports.JOB_SEARCH_MAX_DOCS = 30_000;
|
|
20
|
+
/** Jobs the backfill indexes (newest first). */
|
|
21
|
+
exports.JOB_SEARCH_BACKFILL_JOBS = 5_000;
|
|
22
|
+
exports.JOB_SEARCH_DEFAULT_LIMIT = 8;
|
|
23
|
+
exports.JOB_SEARCH_MAX_LIMIT = 30;
|
|
24
|
+
function createJobSearchSchema(db) {
|
|
25
|
+
db.exec(`
|
|
26
|
+
CREATE TABLE IF NOT EXISTS job_search_docs (
|
|
27
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
28
|
+
job_id TEXT NOT NULL,
|
|
29
|
+
field TEXT NOT NULL,
|
|
30
|
+
text TEXT NOT NULL
|
|
31
|
+
);
|
|
32
|
+
CREATE INDEX IF NOT EXISTS idx_job_search_docs_job ON job_search_docs(job_id);
|
|
33
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS job_search_fts USING fts5(
|
|
34
|
+
text,
|
|
35
|
+
content='job_search_docs',
|
|
36
|
+
content_rowid='id',
|
|
37
|
+
tokenize='trigram remove_diacritics 1'
|
|
38
|
+
);
|
|
39
|
+
CREATE TRIGGER IF NOT EXISTS job_search_docs_ai AFTER INSERT ON job_search_docs BEGIN
|
|
40
|
+
INSERT INTO job_search_fts(rowid, text) VALUES (new.id, new.text);
|
|
41
|
+
END;
|
|
42
|
+
CREATE TRIGGER IF NOT EXISTS job_search_docs_ad AFTER DELETE ON job_search_docs BEGIN
|
|
43
|
+
INSERT INTO job_search_fts(job_search_fts, rowid, text) VALUES ('delete', old.id, old.text);
|
|
44
|
+
END;
|
|
45
|
+
CREATE TRIGGER IF NOT EXISTS job_search_docs_au AFTER UPDATE ON job_search_docs BEGIN
|
|
46
|
+
INSERT INTO job_search_fts(job_search_fts, rowid, text) VALUES ('delete', old.id, old.text);
|
|
47
|
+
INSERT INTO job_search_fts(rowid, text) VALUES (new.id, new.text);
|
|
48
|
+
END;
|
|
49
|
+
`);
|
|
50
|
+
}
|
|
51
|
+
function clip(value) {
|
|
52
|
+
if (typeof value !== 'string')
|
|
53
|
+
return null;
|
|
54
|
+
const flat = value.replace(/\s+/g, ' ').trim();
|
|
55
|
+
if (!flat)
|
|
56
|
+
return null;
|
|
57
|
+
return flat.length > exports.JOB_SEARCH_MAX_TEXT ? `${flat.slice(0, exports.JOB_SEARCH_MAX_TEXT - 1)}…` : flat;
|
|
58
|
+
}
|
|
59
|
+
function diagnosisDocs(raw) {
|
|
60
|
+
if (typeof raw !== 'string' || !raw)
|
|
61
|
+
return [];
|
|
62
|
+
let parsed;
|
|
63
|
+
try {
|
|
64
|
+
parsed = JSON.parse(raw);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
if (!parsed || typeof parsed !== 'object')
|
|
70
|
+
return [];
|
|
71
|
+
const d = parsed;
|
|
72
|
+
const docs = [];
|
|
73
|
+
const kind = clip(typeof d.kind === 'string' ? d.kind.replace(/_/g, ' ') : null);
|
|
74
|
+
if (kind)
|
|
75
|
+
docs.push(['failure', kind]);
|
|
76
|
+
const phase = clip(d.phase);
|
|
77
|
+
if (phase)
|
|
78
|
+
docs.push(['phase', phase]);
|
|
79
|
+
const detail = clip(d.detail);
|
|
80
|
+
if (detail)
|
|
81
|
+
docs.push(['detail', detail]);
|
|
82
|
+
const blocker = d.blocker;
|
|
83
|
+
if (blocker && typeof blocker === 'object') {
|
|
84
|
+
const b = blocker;
|
|
85
|
+
const reason = clip(b.reason);
|
|
86
|
+
if (reason)
|
|
87
|
+
docs.push(['detail', reason]);
|
|
88
|
+
const action = clip(b.requiredAction);
|
|
89
|
+
if (action)
|
|
90
|
+
docs.push(['detail', action]);
|
|
91
|
+
}
|
|
92
|
+
return docs;
|
|
93
|
+
}
|
|
94
|
+
function collectDocs(db, jobId) {
|
|
95
|
+
const job = db.prepare('SELECT command FROM jobs WHERE id = ?').get(jobId);
|
|
96
|
+
if (!job)
|
|
97
|
+
return null;
|
|
98
|
+
const docs = [];
|
|
99
|
+
const command = clip(job.command);
|
|
100
|
+
if (command)
|
|
101
|
+
docs.push(['command', command]);
|
|
102
|
+
const run = db.prepare('SELECT loop_name, failure_diagnosis FROM loop_runs WHERE id = ?').get(jobId);
|
|
103
|
+
const loop = clip(run?.loop_name);
|
|
104
|
+
if (loop)
|
|
105
|
+
docs.push(['loop', loop]);
|
|
106
|
+
const seen = new Set();
|
|
107
|
+
const phases = db.prepare('SELECT phase FROM job_phases WHERE job_id = ? ORDER BY updated_at LIMIT ?').all(jobId, exports.JOB_SEARCH_MAX_PHASES);
|
|
108
|
+
for (const { phase } of phases) {
|
|
109
|
+
const text = clip(phase);
|
|
110
|
+
if (text && !seen.has(text)) {
|
|
111
|
+
seen.add(text);
|
|
112
|
+
docs.push(['phase', text]);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
for (const doc of diagnosisDocs(run?.failure_diagnosis)) {
|
|
116
|
+
if (doc[0] === 'phase') {
|
|
117
|
+
if (seen.has(doc[1]))
|
|
118
|
+
continue;
|
|
119
|
+
seen.add(doc[1]);
|
|
120
|
+
}
|
|
121
|
+
docs.push(doc);
|
|
122
|
+
}
|
|
123
|
+
return docs;
|
|
124
|
+
}
|
|
125
|
+
/** Drop the oldest tenth when the project is over budget; forget deleted jobs. */
|
|
126
|
+
function pruneJobSearch(db) {
|
|
127
|
+
db.prepare('DELETE FROM job_search_docs WHERE job_id NOT IN (SELECT id FROM jobs)').run();
|
|
128
|
+
const { n } = db.prepare('SELECT COUNT(*) AS n FROM job_search_docs').get();
|
|
129
|
+
if (n <= exports.JOB_SEARCH_MAX_DOCS)
|
|
130
|
+
return;
|
|
131
|
+
const drop = Math.ceil(exports.JOB_SEARCH_MAX_DOCS / 10);
|
|
132
|
+
db.prepare('DELETE FROM job_search_docs WHERE id IN (SELECT id FROM job_search_docs ORDER BY id LIMIT ?)').run(drop);
|
|
133
|
+
}
|
|
134
|
+
/** Replace every document of one job with what the database knows now. Idempotent. */
|
|
135
|
+
function indexJob(db, jobId, opts = {}) {
|
|
136
|
+
const docs = collectDocs(db, jobId);
|
|
137
|
+
const tx = db.transaction(() => {
|
|
138
|
+
db.prepare('DELETE FROM job_search_docs WHERE job_id = ?').run(jobId);
|
|
139
|
+
if (docs) {
|
|
140
|
+
const insert = db.prepare('INSERT INTO job_search_docs (job_id, field, text) VALUES (?, ?, ?)');
|
|
141
|
+
for (const [field, text] of docs)
|
|
142
|
+
insert.run(jobId, field, text);
|
|
143
|
+
}
|
|
144
|
+
if (opts.prune !== false)
|
|
145
|
+
pruneJobSearch(db);
|
|
146
|
+
});
|
|
147
|
+
tx();
|
|
148
|
+
}
|
|
149
|
+
/** Add one phase title (a phase event) without rebuilding the job's documents. */
|
|
150
|
+
function indexJobPhase(db, jobId, phase) {
|
|
151
|
+
const text = clip(phase);
|
|
152
|
+
if (!text)
|
|
153
|
+
return;
|
|
154
|
+
const existing = db.prepare("SELECT COUNT(*) AS n, SUM(text = ?) AS same FROM job_search_docs WHERE job_id = ? AND field = 'phase'").get(text, jobId);
|
|
155
|
+
if ((existing.same ?? 0) > 0 || existing.n >= exports.JOB_SEARCH_MAX_PHASES)
|
|
156
|
+
return;
|
|
157
|
+
db.prepare("INSERT INTO job_search_docs (job_id, field, text) VALUES (?, 'phase', ?)").run(jobId, text);
|
|
158
|
+
}
|
|
159
|
+
/** Best-effort hook: indexing never fails the write that triggered it. */
|
|
160
|
+
function safeIndexJob(db, jobId) {
|
|
161
|
+
try {
|
|
162
|
+
indexJob(db, jobId);
|
|
163
|
+
}
|
|
164
|
+
catch { /* index is derived data; the backfill repairs it */ }
|
|
165
|
+
}
|
|
166
|
+
function safeIndexJobPhase(db, jobId, phase) {
|
|
167
|
+
try {
|
|
168
|
+
indexJobPhase(db, jobId, phase);
|
|
169
|
+
}
|
|
170
|
+
catch { /* see safeIndexJob */ }
|
|
171
|
+
}
|
|
172
|
+
/** Forget the documents of jobs about to be deleted. */
|
|
173
|
+
function safeRemoveJobSearch(db, where) {
|
|
174
|
+
try {
|
|
175
|
+
if ('jobId' in where)
|
|
176
|
+
db.prepare('DELETE FROM job_search_docs WHERE job_id = ?').run(where.jobId);
|
|
177
|
+
else
|
|
178
|
+
db.prepare(`DELETE FROM job_search_docs WHERE job_id IN (${where.selectIds})`).run(...where.params);
|
|
179
|
+
}
|
|
180
|
+
catch { /* table absent on a hand-built database */ }
|
|
181
|
+
}
|
|
182
|
+
/** One-time (re-runnable) backfill: rebuild the whole index from jobs, phases and loop runs. */
|
|
183
|
+
function rebuildJobSearchIndex(db) {
|
|
184
|
+
const tx = db.transaction(() => {
|
|
185
|
+
db.prepare('DELETE FROM job_search_docs').run();
|
|
186
|
+
const ids = db.prepare('SELECT id FROM jobs ORDER BY started_at DESC LIMIT ?').all(exports.JOB_SEARCH_BACKFILL_JOBS);
|
|
187
|
+
for (const { id } of ids)
|
|
188
|
+
indexJob(db, id, { prune: false });
|
|
189
|
+
return ids.length;
|
|
190
|
+
});
|
|
191
|
+
return tx();
|
|
192
|
+
}
|
|
193
|
+
function searchJobs(db, rawQuery, limit = exports.JOB_SEARCH_DEFAULT_LIMIT) {
|
|
194
|
+
const query = rawQuery.trim();
|
|
195
|
+
if (!query)
|
|
196
|
+
return [];
|
|
197
|
+
const cap = Math.max(1, Math.min(exports.JOB_SEARCH_MAX_LIMIT, Math.floor(limit)));
|
|
198
|
+
let rows;
|
|
199
|
+
if ([...query].length >= search_snippet_1.TRIGRAM_MIN_CHARS) {
|
|
200
|
+
rows = db.prepare(`WITH hits AS (
|
|
201
|
+
SELECT d.job_id AS job_id, d.field AS field,
|
|
202
|
+
bm25(job_search_fts) AS rank,
|
|
203
|
+
highlight(job_search_fts, 0, ?, ?) AS marked
|
|
204
|
+
FROM job_search_fts JOIN job_search_docs d ON d.id = job_search_fts.rowid
|
|
205
|
+
WHERE job_search_fts MATCH ?
|
|
206
|
+
),
|
|
207
|
+
ranked AS (
|
|
208
|
+
SELECT job_id, field, rank, marked,
|
|
209
|
+
row_number() OVER (PARTITION BY job_id ORDER BY rank, field) AS rn
|
|
210
|
+
FROM hits
|
|
211
|
+
)
|
|
212
|
+
SELECT r.job_id, r.field, r.marked, j.command, j.status, j.started_at
|
|
213
|
+
FROM ranked r JOIN jobs j ON j.id = r.job_id
|
|
214
|
+
WHERE r.rn = 1
|
|
215
|
+
ORDER BY r.rank, j.started_at DESC
|
|
216
|
+
LIMIT ?`).all(search_snippet_1.MARK_START, search_snippet_1.MARK_END, (0, search_snippet_1.ftsPhrase)(query), cap);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
const escaped = query.replace(/[\\%_]/g, (c) => `\\${c}`);
|
|
220
|
+
const scan = db.prepare(`SELECT d.job_id AS job_id, d.field AS field, d.text AS text, j.command, j.status, j.started_at
|
|
221
|
+
FROM job_search_docs d JOIN jobs j ON j.id = d.job_id
|
|
222
|
+
WHERE d.text LIKE ? ESCAPE '\\'
|
|
223
|
+
ORDER BY d.id DESC LIMIT ?`).all(`%${escaped}%`, search_snippet_1.FALLBACK_SCAN_ROWS);
|
|
224
|
+
const needle = query.toLowerCase();
|
|
225
|
+
const seen = new Set();
|
|
226
|
+
rows = [];
|
|
227
|
+
for (const row of scan) {
|
|
228
|
+
if (seen.has(row.job_id))
|
|
229
|
+
continue;
|
|
230
|
+
seen.add(row.job_id);
|
|
231
|
+
const at = row.text.toLowerCase().indexOf(needle);
|
|
232
|
+
const marked = at < 0
|
|
233
|
+
? row.text
|
|
234
|
+
: row.text.slice(0, at) + search_snippet_1.MARK_START + row.text.slice(at, at + needle.length) + search_snippet_1.MARK_END + row.text.slice(at + needle.length);
|
|
235
|
+
rows.push({ ...row, marked });
|
|
236
|
+
if (rows.length >= cap)
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return rows.map((r) => ({
|
|
241
|
+
jobId: r.job_id,
|
|
242
|
+
command: r.command,
|
|
243
|
+
status: r.status,
|
|
244
|
+
startedAt: r.started_at,
|
|
245
|
+
field: r.field,
|
|
246
|
+
snippet: (0, search_snippet_1.parseMarkedSnippet)((0, search_snippet_1.windowMarked)(r.marked)),
|
|
247
|
+
}));
|
|
248
|
+
}
|
package/server/dist/db/jobs.js
CHANGED
|
@@ -17,6 +17,7 @@ exports.deleteJob = deleteJob;
|
|
|
17
17
|
exports.purgeJobs = purgeJobs;
|
|
18
18
|
exports.skipJob = skipJob;
|
|
19
19
|
exports.getPipelineJobs = getPipelineJobs;
|
|
20
|
+
const job_search_1 = require("./job-search");
|
|
20
21
|
function createJob(db, job) {
|
|
21
22
|
// Promotion is atomic: after a crash the job is either still replayable in
|
|
22
23
|
// queued_jobs or is a running jobs row, never absent from both. INSERT OR
|
|
@@ -27,6 +28,7 @@ function createJob(db, job) {
|
|
|
27
28
|
db.prepare('DELETE FROM queued_jobs WHERE id = ?').run(job.id);
|
|
28
29
|
});
|
|
29
30
|
promote();
|
|
31
|
+
(0, job_search_1.safeIndexJob)(db, job.id);
|
|
30
32
|
}
|
|
31
33
|
/** Idempotently persist a job that has been admitted but has not started. */
|
|
32
34
|
function upsertQueuedJob(db, job) {
|
|
@@ -121,12 +123,14 @@ function finishJob(db, jobId, result) {
|
|
|
121
123
|
session_id = ?
|
|
122
124
|
WHERE id = ?
|
|
123
125
|
`).run(result.status, result.exit_code, new Date().toISOString(), result.tokens_in ?? null, result.tokens_out ?? null, result.tokens_cache_read ?? null, result.tokens_cache_create ?? null, result.total_cost_usd ?? null, result.total_cost_usd_estimated ? 1 : 0, result.num_turns ?? null, result.model ?? null, result.duration_ms ?? null, result.duration_api_ms ?? null, result.session_id ?? null, jobId);
|
|
126
|
+
(0, job_search_1.safeIndexJob)(db, jobId);
|
|
124
127
|
}
|
|
125
128
|
function appendEvent(db, jobId, seq, event) {
|
|
126
129
|
db.prepare('INSERT INTO events (job_id, seq, event_type, source, payload) VALUES (?, ?, ?, ?, ?)').run(jobId, seq, event.event_type, event.source ?? null, event.payload);
|
|
127
130
|
}
|
|
128
131
|
function upsertPhase(db, jobId, phase, state) {
|
|
129
132
|
db.prepare('INSERT OR REPLACE INTO job_phases (job_id, phase, state, updated_at) VALUES (?, ?, ?, ?)').run(jobId, phase, state, new Date().toISOString());
|
|
133
|
+
(0, job_search_1.safeIndexJobPhase)(db, jobId, phase);
|
|
130
134
|
}
|
|
131
135
|
function listJobs(db, opts) {
|
|
132
136
|
const limit = Math.min(opts.limit ?? 50, 200);
|
|
@@ -202,6 +206,7 @@ function deleteJob(db, jobId) {
|
|
|
202
206
|
db.prepare('DELETE FROM telemetry_summaries WHERE jobId = ?').run(id);
|
|
203
207
|
db.prepare('DELETE FROM job_profiles WHERE job_id = ?').run(id);
|
|
204
208
|
db.prepare('DELETE FROM file_provenance WHERE job_id = ?').run(id);
|
|
209
|
+
(0, job_search_1.safeRemoveJobSearch)(db, { jobId: id });
|
|
205
210
|
db.prepare('DELETE FROM jobs WHERE id = ?').run(id);
|
|
206
211
|
});
|
|
207
212
|
tx(jobId);
|
|
@@ -237,6 +242,7 @@ function purgeJobs(db, opts) {
|
|
|
237
242
|
db.prepare(`DELETE FROM telemetry_summaries WHERE jobId IN (${sel})`).run(...params);
|
|
238
243
|
db.prepare(`DELETE FROM job_profiles WHERE job_id IN (${sel})`).run(...params);
|
|
239
244
|
db.prepare(`DELETE FROM file_provenance WHERE job_id IN (${sel})`).run(...params);
|
|
245
|
+
(0, job_search_1.safeRemoveJobSearch)(db, { selectIds: sel, params });
|
|
240
246
|
// Clear inbound FK references from NON-purged jobs to purged jobs.
|
|
241
247
|
db.prepare(`UPDATE jobs SET depends_on_job_id = NULL WHERE depends_on_job_id IN (${sel})`).run(...params);
|
|
242
248
|
return db.prepare(`DELETE FROM jobs WHERE ${where}`).run(...params).changes;
|