specrails-desktop 2.29.0 → 2.29.2
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/client/dist/assets/ActivityFeedPage-ClpD5CFj.js +1 -0
- package/client/dist/assets/AgentBrowserCapture-CSPs9Ofc.js +1 -0
- package/client/dist/assets/AgentModeCodePane-DwcyklA5.js +2 -0
- package/client/dist/assets/AgentModeJobsPane-C69bqlMa.js +1 -0
- package/client/dist/assets/AgentsPage-pRiRr9-W.js +86 -0
- package/client/dist/assets/AnalyticsPage-C14exKsC.js +1 -0
- package/client/dist/assets/BarChart-nBOMNfiy.js +33 -0
- package/client/dist/assets/CodePage-CK76JKm9.js +2 -0
- package/client/dist/assets/DesktopAnalyticsPage-Cnv0f3XQ.js +1 -0
- package/client/dist/assets/DocsDialog-CHUm_Ym0.js +11 -0
- package/client/dist/assets/DocsPage-COI-oDok.js +11 -0
- package/client/dist/assets/ExportDropdown-BrtfWzEG.js +1 -0
- package/client/dist/assets/IntegrationsPage-Bs00_tl4.js +1 -0
- package/client/dist/assets/InteractiveJobComposer-CypM7R1F.js +19 -0
- package/client/dist/assets/JobDetailModal-B_W0H9dw.js +1 -0
- package/client/dist/assets/JobDetailPage-CeeXOoKS.js +1 -0
- package/client/dist/assets/JobsPage-CwhJG9jw.js +1 -0
- package/client/dist/assets/LoopBuilderPage-C51t1WOM.js +7 -0
- package/client/dist/assets/LoopPreviewModal-Y2HgtIJu.js +1 -0
- package/client/dist/assets/LoopsPage-Bvn1Kw5V.js +1 -0
- package/client/dist/assets/MinimizedChatsContext-DiFvZDPW.js +1 -0
- package/client/dist/assets/PluginsPage-BGPRJpdf.js +2 -0
- package/client/dist/assets/ProjectSettingsDialog-D_GTyGLc.js +1 -0
- package/client/dist/assets/TemplatePreviewModal-szwBhd7h.js +1 -0
- package/client/dist/assets/TicketDetailModal-9UEyK974.js +14 -0
- package/client/dist/assets/Trans-B_vKZ-Hb.js +1 -0
- package/client/dist/assets/activity-DiyjsgQV.js +1 -0
- package/client/dist/assets/addon-image-BRmmRHgQ.js +1 -0
- package/client/dist/assets/addon-ligatures-qIZUPvRV.js +2 -0
- package/client/dist/assets/{addon-webgl-DMbGeI_u.js → addon-webgl-C2d7lriQ.js} +3 -3
- package/client/dist/assets/addspec-Rw8uVBC1.js +1 -0
- package/client/dist/assets/agent-4rmXoo_p.js +1 -0
- package/client/dist/assets/agent-BxZuNGih.js +1 -0
- package/client/dist/assets/agent-C3uXOYv_.js +1 -0
- package/client/dist/assets/agent-CA8Y4wbw.js +1 -0
- package/client/dist/assets/agent-CASKrhG12.js +1 -0
- package/client/dist/assets/agent-Cv-jud5n2.js +1 -0
- package/client/dist/assets/agent-DitUxYh2.js +1 -0
- package/client/dist/assets/agent-Doow4X7o.js +1 -0
- package/client/dist/assets/agents-DhG7mg6-.js +1 -0
- package/client/dist/assets/agentstudio-BIUe1Im2.js +1 -0
- package/client/dist/assets/aiedit-iIjz2_Qk.js +1 -0
- package/client/dist/assets/analytics-DZ8Aoq3I.js +1 -0
- package/client/dist/assets/api-B2M7CtDw.js +1 -0
- package/client/dist/assets/arrow-left-CpIR4j7G.js +1 -0
- package/client/dist/assets/arrow-up-right-9DoMn7fD.js +1 -0
- package/client/dist/assets/attachments-B53PG733.js +1 -0
- package/client/dist/assets/brain-DI9lHkKY.js +1 -0
- package/client/dist/assets/browser-CXUcnTMI.js +1 -0
- package/client/dist/assets/button-BUIIBQPT.js +1 -0
- package/client/dist/assets/chat-BGD7MXAy.js +1 -0
- package/client/dist/assets/chevron-right-CViMxucY.js +1 -0
- package/client/dist/assets/chunk-KS7C4IRE-Cx5sqopX.js +3 -0
- package/client/dist/assets/circle-x-CMYsN4ZH.js +1 -0
- package/client/dist/assets/code-BDXEM4ml.js +1 -0
- package/client/dist/assets/commands-DyUZQ1FI.js +1 -0
- package/client/dist/assets/common-CD1QHriA2.js +1 -0
- package/client/dist/assets/common-CwwPaRxx.js +1 -0
- package/client/dist/assets/common-DVQuhs-m.js +1 -0
- package/client/dist/assets/common-Dg2jaX7d.js +1 -0
- package/client/dist/assets/common-DuBwj6tK.js +1 -0
- package/client/dist/assets/common-MRj9MHcc.js +1 -0
- package/client/dist/assets/common-O4ZpnMLp.js +1 -0
- package/client/dist/assets/common-fyeF0v7C2.js +1 -0
- package/client/dist/assets/createLucideIcon-Bjbbp_KS.js +1 -0
- package/client/dist/assets/{css.worker-Wv5dxAWO.js → css.worker-yKcq13f2.js} +13 -13
- package/client/dist/assets/{cssMode-DBHbkBvI.js → cssMode-BM4z9OX0.js} +1 -1
- package/client/dist/assets/dashboard-B_NkSHYm.js +1 -0
- package/client/dist/assets/dashboard-ClBb_3pq.js +1 -0
- package/client/dist/assets/dashboard-CpCmJvMB.js +1 -0
- package/client/dist/assets/dashboard-Czohu35O2.js +1 -0
- package/client/dist/assets/dashboard-DcjbD0UK.js +1 -0
- package/client/dist/assets/dashboard-Dvx5F3we.js +1 -0
- package/client/dist/assets/dashboard-R1bOPjBh2.js +1 -0
- package/client/dist/assets/dashboard-owcDucDi.js +1 -0
- package/client/dist/assets/dialog-CzIekCw0.js +45 -0
- package/client/dist/assets/dist-Cez5CRkX.js +1 -0
- package/client/dist/assets/dist-bVqfYmby.js +1 -0
- package/client/dist/assets/{dist-js-UjXbEWhN.js → dist-js-CcBCbb32.js} +1 -1
- package/client/dist/assets/{dist-js-BTAcxhPb.js → dist-js-VwztRkGj.js} +1 -1
- package/client/dist/assets/download-CFHyyHcw.js +1 -0
- package/client/dist/assets/editor.api2-4ndOupAA.js +872 -0
- package/client/dist/assets/{editor.main-C9J2ikJK.js → editor.main-DxrmGfoq.js} +2 -2
- package/client/dist/assets/editor.worker-tytyn86m.js +26 -0
- package/client/dist/assets/explore-DgBACn39.js +1 -0
- package/client/dist/assets/external-link-BcU5EWZp.js +1 -0
- package/client/dist/assets/file-text-CFT-xXKN.js +1 -0
- package/client/dist/assets/formatDistanceToNow-ByHIauTQ.js +1 -0
- package/client/dist/assets/{freemarker2-J5iIIIK-.js → freemarker2-CELlTDJ2.js} +1 -1
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-BxHAksaU.js +1 -0
- package/client/dist/assets/git-branch-BRM0F5GN.js +1 -0
- package/client/dist/assets/{handlebars-DSw1l_tw.js → handlebars-NEjHJ7o_.js} +1 -1
- package/client/dist/assets/{html-h2-wE1Lj.js → html-CA10zN5A.js} +1 -1
- package/client/dist/assets/{html.worker-CQP8QQsS.js → html.worker-DSJ9zmd7.js} +12 -12
- package/client/dist/assets/{htmlMode-Cc_ij7lW.js → htmlMode-89rPYiyq.js} +1 -1
- package/client/dist/assets/i18n-CgaRxpII.js +2 -0
- package/client/dist/assets/index-BflYQpWm.css +2 -0
- package/client/dist/assets/index-C1_-BTXy.js +72 -0
- package/client/dist/assets/integrations-mB-7zoyT.js +1 -0
- package/client/dist/assets/{javascript-C1q3xv6N.js → javascript-B1gDmwzS.js} +1 -1
- package/client/dist/assets/jira-CmKWERE0.js +1 -0
- package/client/dist/assets/jira-api-BgFIr8eD.js +1 -0
- package/client/dist/assets/job-time-BCL7wee9.js +1 -0
- package/client/dist/assets/jobs-B-sDHEay2.js +1 -0
- package/client/dist/assets/jobs-BCtGfgUA.js +1 -0
- package/client/dist/assets/jobs-BHR_EnDI.js +1 -0
- package/client/dist/assets/jobs-BMbZJjJJ.js +1 -0
- package/client/dist/assets/jobs-CVFD8rar.js +1 -0
- package/client/dist/assets/jobs-DoSaFzAa.js +1 -0
- package/client/dist/assets/jobs-DzSIR8V62.js +1 -0
- package/client/dist/assets/jobs-lk1_Dq1U.js +1 -0
- package/client/dist/assets/json.worker-Oa9UrkKE.js +58 -0
- package/client/dist/assets/{jsonMode-CeaCdEhr.js → jsonMode-xHLMfzhF.js} +1 -1
- package/client/dist/assets/jsx-runtime-zu2_FqZY.js +1 -0
- package/client/dist/assets/lib-C7Mhm-gT.js +7 -0
- package/client/dist/assets/lib-CGdyxIWg.js +29 -0
- package/client/dist/assets/{liquid-eFsVK0V-.js → liquid-BY6hCUXG.js} +1 -1
- package/client/dist/assets/loader-circle-DcygOQpC.js +1 -0
- package/client/dist/assets/loops-BzfXWEwO.js +1 -0
- package/client/dist/assets/{lspLanguageFeatures-DT3-bbhn.js → lspLanguageFeatures-ira2aEJh.js} +1 -1
- package/client/dist/assets/mcp-uDkXYu4L.js +1 -0
- package/client/dist/assets/{mdx-Fuwnh1cX.js → mdx-BNx0xr3N.js} +1 -1
- package/client/dist/assets/monaco.contribution-Bt92R3Vw.js +2 -0
- package/client/dist/assets/nav-myFaXRHD.js +1 -0
- package/client/dist/assets/pencil-C9RkrIPZ.js +1 -0
- package/client/dist/assets/play-DNlrawbS.js +1 -0
- package/client/dist/assets/plus-CsnjfkmX.js +1 -0
- package/client/dist/assets/preload-helper-Czpn1I53.js +1 -0
- package/client/dist/assets/{python-BgoEs6Cj.js → python-DLdbtmNw.js} +1 -1
- package/client/dist/assets/{razor-CM1sPMMq.js → razor-B9gdhAbR.js} +1 -1
- package/client/dist/assets/react-dom-DiWzBDP9.js +1 -0
- package/client/dist/assets/rolldown-runtime-CNC7AqOf.js +1 -0
- package/client/dist/assets/save-28sIlCdr.js +1 -0
- package/client/dist/assets/search-Cq_gE3Ik.js +1 -0
- package/client/dist/assets/settings-B0ypw9uw.js +1 -0
- package/client/dist/assets/{settings-Bp24JHlv2.js → settings-B9ilOSYO.js} +1 -1
- package/client/dist/assets/{settings-Bx2ObkTR2.js → settings-BqlWHRHA.js} +1 -1
- package/client/dist/assets/{settings-C_T0-j9d.js → settings-D8dlqt4d.js} +1 -1
- package/client/dist/assets/{settings-DhaFKpcw2.js → settings-DAZqjX2a2.js} +1 -1
- package/client/dist/assets/{settings-B_v3zgJf.js → settings-DRh39v1S2.js} +1 -1
- package/client/dist/assets/{settings-BemR_e3F.js → settings-Mj1OJbfd2.js} +1 -1
- package/client/dist/assets/{settings-BvIwQ3A1.js → settings-lRReaSYm.js} +1 -1
- package/client/dist/assets/setup-CmK87LuS.js +1 -0
- package/client/dist/assets/sparkles-DrY8hb0X.js +1 -0
- package/client/dist/assets/specs-DII0C8gw.js +1 -0
- package/client/dist/assets/spending-C4p06nen.js +1 -0
- package/client/dist/assets/terminal-BFRZnMPP.js +1 -0
- package/client/dist/assets/tickets-B8BuAaj5.js +1 -0
- package/client/dist/assets/tickets-B_yh4qQk.js +1 -0
- package/client/dist/assets/tickets-Bs37scwY2.js +1 -0
- package/client/dist/assets/tickets-CFk2n2Or.js +1 -0
- package/client/dist/assets/tickets-DQp7JS2R2.js +1 -0
- package/client/dist/assets/tickets-D_yDquEw.js +1 -0
- package/client/dist/assets/tickets-DpmdE8tv2.js +1 -0
- package/client/dist/assets/tickets-pAUJkDTu.js +1 -0
- package/client/dist/assets/trash-2-BOU3WdZZ.js +1 -0
- package/client/dist/assets/triangle-alert-H9T4jAmh.js +1 -0
- package/client/dist/assets/{ts.worker-METxwbDZ.js → ts.worker-BtjBFNHX.js} +48 -33
- package/client/dist/assets/{tsMode-BmT8WogI.js → tsMode-DEjSThU9.js} +1 -1
- package/client/dist/assets/{typescript-CQrQPsoW.js → typescript-CRRnD2Ts.js} +1 -1
- package/client/dist/assets/upload-DYMjAQ6M.js +1 -0
- package/client/dist/assets/useBrowserCaptureSession-2OqX0vap.js +1 -0
- package/client/dist/assets/useDesktop-X8YB9xzv.js +1 -0
- package/client/dist/assets/useSharedWebSocket-DaPh7QBL.js +1 -0
- package/client/dist/assets/utils-BC4DHlz2.js +1 -0
- package/client/dist/assets/value-s-gzBeyF.js +1 -0
- package/client/dist/assets/{workers-U0UXyLUf.js → workers-uOo7WLaa.js} +1 -1
- package/client/dist/assets/x-CBMI9ejn.js +1 -0
- package/client/dist/assets/{xml-WRxJs8_I.js → xml-EDREH2X7.js} +1 -1
- package/client/dist/assets/{yaml-CjpSTjJU.js → yaml-BjaDVX1E.js} +1 -1
- package/client/dist/assets/zap-CHo3aCD1.js +1 -0
- package/client/dist/index.html +73 -32
- package/docs/guide/en/integrations/5-mcp-server.md +2 -2
- package/docs/internals/safe-pr-review-flow.md +190 -132
- package/docs/mcp.md +15 -5
- package/package.json +11 -7
- package/server/dist/active-pr-continuation.js +16 -1
- package/server/dist/agent-chat-manager.js +360 -181
- package/server/dist/agent-cwd-manager.js +52 -8
- package/server/dist/agent-generator.js +90 -48
- package/server/dist/agent-mcp-config.js +69 -36
- package/server/dist/agent-operator-prompt.js +3 -2
- package/server/dist/agent-refine-manager.js +47 -6
- package/server/dist/agent-tier.js +13 -11
- package/server/dist/artifact-registry.js +33 -2
- package/server/dist/auth.js +5 -4
- package/server/dist/browser-capture-manager.js +92 -29
- package/server/dist/chat-manager.js +302 -46
- package/server/dist/contract-refine-runner.js +19 -6
- package/server/dist/db.js +665 -8
- package/server/dist/desktop-router.js +1 -2
- package/server/dist/headroom-manager.js +1310 -121
- package/server/dist/headroom-routing.js +120 -2
- package/server/dist/index.js +48 -13
- package/server/dist/interactive-job-session.js +237 -82
- package/server/dist/jira/jira-adf.js +10 -0
- package/server/dist/jira/jira-db.js +15 -3
- package/server/dist/jira/jira-sync-manager.js +182 -13
- package/server/dist/job-listing.js +140 -0
- package/server/dist/job-spawn-idempotency.js +67 -0
- package/server/dist/loop-run-manager.js +508 -98
- package/server/dist/loop-runs-store.js +266 -13
- package/server/dist/mcp/agent-capability.js +71 -0
- package/server/dist/mcp/guide.js +5 -2
- package/server/dist/mcp/mcp-server.js +5 -10
- package/server/dist/mcp/mcp-token.js +5 -5
- package/server/dist/mcp/tools/jobs.js +20 -13
- package/server/dist/mcp/tools/types.js +20 -42
- package/server/dist/mobile/mobile-router.js +1 -1
- package/server/dist/pr-lifecycle.js +77 -0
- package/server/dist/pr-publisher.js +94 -27
- package/server/dist/process-admission.js +82 -0
- package/server/dist/project-registry.js +572 -174
- package/server/dist/project-router-git.js +13 -2
- package/server/dist/project-router-jobs.js +111 -55
- package/server/dist/project-router-tickets.js +32 -2
- package/server/dist/providers/claude-adapter.js +21 -13
- package/server/dist/queue-manager.js +2332 -623
- package/server/dist/rail-isolated-launch.js +1141 -280
- package/server/dist/rail-isolation.js +4 -2
- package/server/dist/rail-pr-decision.js +756 -270
- package/server/dist/rail-pr-delivery.js +2 -1
- package/server/dist/rail-pr-store.js +317 -18
- package/server/dist/rail-pr-ticket-effects.js +328 -0
- package/server/dist/rail-worktree-release.js +28 -6
- package/server/dist/rails-router.js +149 -112
- package/server/dist/rails-store.js +106 -3
- package/server/dist/ticket-store.js +23 -1
- package/server/dist/transient-children.js +13 -0
- package/server/dist/util/cli-prompt.js +42 -8
- package/server/dist/util/secure-token-file.js +84 -0
- package/server/dist/worktree-manager.js +70 -21
- package/client/dist/assets/ActivityFeedPage-Be-6L0Ld.js +0 -1
- package/client/dist/assets/AgentBrowserCapture-CpZ-dd8O.js +0 -1
- package/client/dist/assets/AgentIntegrationsModal-DO1pN_Ez.js +0 -1
- package/client/dist/assets/AgentModeCodePane-DLltTOqp.js +0 -2
- package/client/dist/assets/AgentModeJobsPane-Dp5YvmW0.js +0 -1
- package/client/dist/assets/AgentsPage-ehHuVUds.js +0 -86
- package/client/dist/assets/AnalyticsPage-C4Ik95FX.js +0 -1
- package/client/dist/assets/BarChart-DVZgrhJd.js +0 -33
- package/client/dist/assets/CodePage-D4OCMfxL.js +0 -2
- package/client/dist/assets/DesktopAnalyticsPage-2Xf-52x2.js +0 -1
- package/client/dist/assets/DocsDialog-CHihLjWd.js +0 -11
- package/client/dist/assets/DocsPage-1vEk7XbH.js +0 -11
- package/client/dist/assets/ExportDropdown-DLHFQxVn.js +0 -1
- package/client/dist/assets/IntegrationsPage-CCb2YuyJ.js +0 -1
- package/client/dist/assets/InteractiveJobComposer-CxJJEnjw.js +0 -19
- package/client/dist/assets/JobDetailModal-CJI7qRkm.js +0 -1
- package/client/dist/assets/JobDetailPage-DwA9bbwx.js +0 -1
- package/client/dist/assets/JobsPage-BDIyFfd5.js +0 -1
- package/client/dist/assets/LoopBuilderPage-CpBaW59t.js +0 -7
- package/client/dist/assets/LoopPreviewModal-CwpKcv0Y.js +0 -1
- package/client/dist/assets/LoopsPage-BO0Pa8oz.js +0 -1
- package/client/dist/assets/PluginsPage-BBGTBpGh.js +0 -2
- package/client/dist/assets/ProjectSettingsDialog-M9zGQo0l.js +0 -1
- package/client/dist/assets/TemplatePreviewModal-eBI0zL5P.js +0 -1
- package/client/dist/assets/activity-Dbl71S-E.js +0 -1
- package/client/dist/assets/addon-image-CwoZj17F.js +0 -1
- package/client/dist/assets/addon-ligatures-CWDrED80.js +0 -2
- package/client/dist/assets/addspec-DrXqP8ip.js +0 -1
- package/client/dist/assets/agent-BEXYxDbs.js +0 -1
- package/client/dist/assets/agent-BoXSzaBk2.js +0 -1
- package/client/dist/assets/agent-C2-rROL52.js +0 -1
- package/client/dist/assets/agent-CeRTdGT12.js +0 -1
- package/client/dist/assets/agent-DZ8zTrQT.js +0 -1
- package/client/dist/assets/agent-DqyzT33X.js +0 -1
- package/client/dist/assets/agent-fQI_6tsA.js +0 -1
- package/client/dist/assets/agent-tJdAobaM.js +0 -1
- package/client/dist/assets/agents-CGDn_3kB.js +0 -1
- package/client/dist/assets/agentstudio-Dxe_94PK.js +0 -1
- package/client/dist/assets/aiedit-DrfHQnlz.js +0 -1
- package/client/dist/assets/analytics-CxDYcBl9.js +0 -1
- package/client/dist/assets/attachments-DvxQbBTC.js +0 -1
- package/client/dist/assets/brain-DecvjjPU.js +0 -1
- package/client/dist/assets/browser-DM8G151q.js +0 -1
- package/client/dist/assets/chat-0dg5hOo_.js +0 -1
- package/client/dist/assets/chunk-BNv3lrIs.js +0 -1
- package/client/dist/assets/code-B62fClk-.js +0 -1
- package/client/dist/assets/commands-DCJ-R9E4.js +0 -1
- package/client/dist/assets/common-BfQD173j.js +0 -1
- package/client/dist/assets/common-CF8iGXrG.js +0 -1
- package/client/dist/assets/common-Cfmwcrl52.js +0 -1
- package/client/dist/assets/common-D2cimsul.js +0 -1
- package/client/dist/assets/common-DH7fjyL1.js +0 -1
- package/client/dist/assets/common-DXrmj6WD.js +0 -1
- package/client/dist/assets/common-DZbXlmq72.js +0 -1
- package/client/dist/assets/common-DtXmzX2o2.js +0 -1
- package/client/dist/assets/dashboard-5C2FOZQX.js +0 -1
- package/client/dist/assets/dashboard-B6iQ-IL_.js +0 -1
- package/client/dist/assets/dashboard-BFfnCtq52.js +0 -1
- package/client/dist/assets/dashboard-BIC8KtRf2.js +0 -1
- package/client/dist/assets/dashboard-CEgg9NAr.js +0 -1
- package/client/dist/assets/dashboard-CiOyDh9L.js +0 -1
- package/client/dist/assets/dashboard-D6x5OnNj2.js +0 -1
- package/client/dist/assets/dashboard-DBuLfWo9.js +0 -1
- package/client/dist/assets/editor.api2-C3B0tp2x.js +0 -872
- package/client/dist/assets/editor.worker-Bd9IXS8d.js +0 -26
- package/client/dist/assets/explore-_XyU5e7R.js +0 -1
- package/client/dist/assets/index-BVbgKXUu.css +0 -2
- package/client/dist/assets/index-OBDI7bHm.js +0 -158
- package/client/dist/assets/integrations-By80EBkf.js +0 -1
- package/client/dist/assets/jira-DeIjwCK3.js +0 -1
- package/client/dist/assets/jobs-BFIdeDTw.js +0 -1
- package/client/dist/assets/jobs-BJ-Gcao22.js +0 -1
- package/client/dist/assets/jobs-DAGiPVIS2.js +0 -1
- package/client/dist/assets/jobs-DAU8C_tZ.js +0 -1
- package/client/dist/assets/jobs-Da0GaaSc.js +0 -1
- package/client/dist/assets/jobs-DrYmsKy5.js +0 -1
- package/client/dist/assets/jobs-P3unxtxo2.js +0 -1
- package/client/dist/assets/jobs-p360zdf1.js +0 -1
- package/client/dist/assets/json.worker-DzV-CpCQ.js +0 -58
- package/client/dist/assets/lib-C5ZxrPSR.js +0 -7
- package/client/dist/assets/loops-CO6q75W8.js +0 -1
- package/client/dist/assets/mcp-HwBbQDk0.js +0 -1
- package/client/dist/assets/monaco.contribution-Desq7oq4.js +0 -2
- package/client/dist/assets/nav-BTg8s-cD.js +0 -1
- package/client/dist/assets/preload-helper-DSXbuxSR.js +0 -1
- package/client/dist/assets/settings-BYCMtxOz.js +0 -1
- package/client/dist/assets/setup-D2CmgAro.js +0 -1
- package/client/dist/assets/specs-PGIOzMtc.js +0 -1
- package/client/dist/assets/terminal-CFt56A5f.js +0 -1
- package/client/dist/assets/tickets-BHv3ewvq.js +0 -1
- package/client/dist/assets/tickets-BIxU86j12.js +0 -1
- package/client/dist/assets/tickets-C2BhwzwR.js +0 -1
- package/client/dist/assets/tickets-D1IeX2EW.js +0 -1
- package/client/dist/assets/tickets-DZut8Ryt.js +0 -1
- package/client/dist/assets/tickets-LfK6LzKl2.js +0 -1
- package/client/dist/assets/tickets-dQfsc7Ph.js +0 -1
- package/client/dist/assets/tickets-sVun0I6v.js +0 -1
- package/client/dist/assets/upload-lgjKJgrl.js +0 -1
- package/client/dist/assets/value-Bc0_jlJA.js +0 -1
- /package/client/dist/assets/{abap-D0E4FfVW.js → abap-08VXUWAP.js} +0 -0
- /package/client/dist/assets/{activity-BbWiDfn-2.js → activity-B-rp4h_v.js} +0 -0
- /package/client/dist/assets/{activity-DvECTYGt.js → activity-C6kJpm9q2.js} +0 -0
- /package/client/dist/assets/{activity-D3Ic-HTS.js → activity-CGx4kb_j.js} +0 -0
- /package/client/dist/assets/{activity-BZZlEG3a.js → activity-CnoX2bH7.js} +0 -0
- /package/client/dist/assets/{activity-DtzRy92x.js → activity-DAyekdlt2.js} +0 -0
- /package/client/dist/assets/{activity-FleOlK0l2.js → activity-DCxtpT7j.js} +0 -0
- /package/client/dist/assets/{activity-DFbvNqhE2.js → activity-JzwRaWPD.js} +0 -0
- /package/client/dist/assets/{addspec-CFxGvmJR2.js → addspec-BXjvkh5q.js} +0 -0
- /package/client/dist/assets/{addspec-NBbcTbLc.js → addspec-C4bwrmpi.js} +0 -0
- /package/client/dist/assets/{addspec-BKrH2Ucz.js → addspec-CArHXUDM.js} +0 -0
- /package/client/dist/assets/{addspec-CR8MB5Fr2.js → addspec-DTKJcXiR.js} +0 -0
- /package/client/dist/assets/{addspec-B_LQMHW3.js → addspec-DbNBbrha2.js} +0 -0
- /package/client/dist/assets/{addspec-DaA-CbTt.js → addspec-htHGZHOe2.js} +0 -0
- /package/client/dist/assets/{addspec-Bw_YQwo62.js → addspec-lr_LP6jk.js} +0 -0
- /package/client/dist/assets/{agents-BHgn--3j.js → agents-6ZOJXWVk2.js} +0 -0
- /package/client/dist/assets/{agents-VsyFhGOS2.js → agents-BZ0XQKjg.js} +0 -0
- /package/client/dist/assets/{agents-HFCqQH0Z.js → agents-BqWklnHR.js} +0 -0
- /package/client/dist/assets/{agents-B_qGaB0F.js → agents-Bz-thHkB2.js} +0 -0
- /package/client/dist/assets/{agents-CP8_ezYG.js → agents-CJclElx6.js} +0 -0
- /package/client/dist/assets/{agents-B9pFSJQI2.js → agents-D_l9L0VA.js} +0 -0
- /package/client/dist/assets/{agents-CV-_xBvX2.js → agents-u_C0jPB5.js} +0 -0
- /package/client/dist/assets/{agentstudio-BEp7Sb46.js → agentstudio-BF19hbXj.js} +0 -0
- /package/client/dist/assets/{agentstudio-Br3WD7Xs.js → agentstudio-BLGvxWBx2.js} +0 -0
- /package/client/dist/assets/{agentstudio-BOjG6tgJ.js → agentstudio-D9UKiWTj2.js} +0 -0
- /package/client/dist/assets/{agentstudio-D2A5peWV2.js → agentstudio-Drs37nIM.js} +0 -0
- /package/client/dist/assets/{agentstudio-CuTt3ZGe2.js → agentstudio-nEnKkcXM.js} +0 -0
- /package/client/dist/assets/{agentstudio-RsxnZtUA.js → agentstudio-pyFcSBKy.js} +0 -0
- /package/client/dist/assets/{agentstudio-RfZavULt2.js → agentstudio-zfTzQh3U.js} +0 -0
- /package/client/dist/assets/{aiedit-DnBzjlVz2.js → aiedit-B0KUbpB6.js} +0 -0
- /package/client/dist/assets/{aiedit-D0Syl-mC.js → aiedit-BoG24nlg2.js} +0 -0
- /package/client/dist/assets/{aiedit-CcugGPbS.js → aiedit-CjlSRQVP.js} +0 -0
- /package/client/dist/assets/{aiedit-DrIjSojo.js → aiedit-DCjA7jLJ.js} +0 -0
- /package/client/dist/assets/{aiedit-CV520D4W2.js → aiedit-DNXxq_Dr.js} +0 -0
- /package/client/dist/assets/{aiedit-26p5A_HY2.js → aiedit-DQ-0_pvE.js} +0 -0
- /package/client/dist/assets/{aiedit-a-Z-g5iC.js → aiedit-olnv3QSt2.js} +0 -0
- /package/client/dist/assets/{analytics-DEe5BMz8.js → analytics-BC7mwR4s.js} +0 -0
- /package/client/dist/assets/{analytics-4HvXb0Vn2.js → analytics-BiNg8edP.js} +0 -0
- /package/client/dist/assets/{analytics-CpSTNfui.js → analytics-C0s_T2GN.js} +0 -0
- /package/client/dist/assets/{analytics-4-eskbtX.js → analytics-CdsAPAwZ2.js} +0 -0
- /package/client/dist/assets/{analytics-Bpe41fnX2.js → analytics-Cr1_q-lC.js} +0 -0
- /package/client/dist/assets/{analytics-DcOITHla2.js → analytics-IEsKZvpW2.js} +0 -0
- /package/client/dist/assets/{analytics-Bd9rHGjV.js → analytics-SRPf84OT.js} +0 -0
- /package/client/dist/assets/{apex-D_X_8J4d.js → apex-BWPQTe0t.js} +0 -0
- /package/client/dist/assets/{atom-one-dark-BMDPFwRZ.js → atom-one-dark-qiGhVQxg.js} +0 -0
- /package/client/dist/assets/{attachments-CgOQ9K-6.js → attachments-D0wXXt9T2.js} +0 -0
- /package/client/dist/assets/{attachments-DlEQu56g2.js → attachments-DenIjuVI.js} +0 -0
- /package/client/dist/assets/{attachments-CA2f3qL3.js → attachments-DhO7LPfy.js} +0 -0
- /package/client/dist/assets/{attachments-D2jwJXQ42.js → attachments-DoH5w0x4.js} +0 -0
- /package/client/dist/assets/{attachments-CHDbhKeH.js → attachments-Q9yNtiEM.js} +0 -0
- /package/client/dist/assets/{attachments-CKAY5aYG2.js → attachments-V_WZAYXx2.js} +0 -0
- /package/client/dist/assets/{attachments-jVdKzAXn.js → attachments-eaeScpjM.js} +0 -0
- /package/client/dist/assets/{auth-DpZq5p1e.js → auth-D_5bQv5W.js} +0 -0
- /package/client/dist/assets/{azcli-PZLnZ3jH.js → azcli-Bc_sGQ0U.js} +0 -0
- /package/client/dist/assets/{bat-KlBOxpO4.js → bat-i0X4ZdIN.js} +0 -0
- /package/client/dist/assets/{bicep-CgG9oF3V.js → bicep-B5-_aFwp.js} +0 -0
- /package/client/dist/assets/{browser-Cl-FwPXs.js → browser-C25DkQiO.js} +0 -0
- /package/client/dist/assets/{browser-JsiohNmW.js → browser-CiJ7-L32.js} +0 -0
- /package/client/dist/assets/{browser-BbJ_q_OT2.js → browser-CvgDySd9.js} +0 -0
- /package/client/dist/assets/{browser-BQFDxrRq.js → browser-CyR1Kp3m2.js} +0 -0
- /package/client/dist/assets/{browser-Do2jf8_N.js → browser-DwZljcRh2.js} +0 -0
- /package/client/dist/assets/{browser-C4VJ5CW12.js → browser-DxP-alBK.js} +0 -0
- /package/client/dist/assets/{browser-kA31eYhu2.js → browser-rRCwi7Y7.js} +0 -0
- /package/client/dist/assets/{cameligo-6R45j6Ph.js → cameligo-DMUM7wLl.js} +0 -0
- /package/client/dist/assets/{chat-BalviUAD.js → chat-2rIB8HhT.js} +0 -0
- /package/client/dist/assets/{chat-Ds8GvCnv.js → chat-BR8oe53x2.js} +0 -0
- /package/client/dist/assets/{chat-D5xEtsf3.js → chat-Bua03tty.js} +0 -0
- /package/client/dist/assets/{chat-SaG-ng1x2.js → chat-CZpAQan1.js} +0 -0
- /package/client/dist/assets/{chat-CJddjN3D2.js → chat-CdY5SGvS.js} +0 -0
- /package/client/dist/assets/{chat-n43nZGvn.js → chat-DZyu3ImY2.js} +0 -0
- /package/client/dist/assets/{chat-BMWD_Rx12.js → chat-D_I7nU5K.js} +0 -0
- /package/client/dist/assets/{clojure-CLAAMO7J.js → clojure-Cm7r79vr.js} +0 -0
- /package/client/dist/assets/{clsx-CNmW0Nip.js → clsx-CjueKrWZ.js} +0 -0
- /package/client/dist/assets/{code-C9U6M5-e2.js → code-76gS0IdL.js} +0 -0
- /package/client/dist/assets/{code-BotxM43N2.js → code-C1VwxlML.js} +0 -0
- /package/client/dist/assets/{code-HDK4P6Rx.js → code-CnMZyJpr.js} +0 -0
- /package/client/dist/assets/{code-DUe1Bouz.js → code-D20ef9Cf2.js} +0 -0
- /package/client/dist/assets/{code-Bit_z2Xd2.js → code-DdOXaWRY.js} +0 -0
- /package/client/dist/assets/{code-F_KjccGf.js → code-Duohuf9l.js} +0 -0
- /package/client/dist/assets/{code-CIPmDEd0.js → code-geHmknB92.js} +0 -0
- /package/client/dist/assets/{coffee-AruSygo-.js → coffee-Ba7i2nA0.js} +0 -0
- /package/client/dist/assets/{commands-BFQZc9AG.js → commands-B9RZO4qS.js} +0 -0
- /package/client/dist/assets/{commands-BMkC5-ki.js → commands-BEwbAjtD2.js} +0 -0
- /package/client/dist/assets/{commands-KBbhsnw8.js → commands-Bbxu8kLU.js} +0 -0
- /package/client/dist/assets/{commands-CzFSoIiq2.js → commands-CDU3qv68.js} +0 -0
- /package/client/dist/assets/{commands-CWX9WmDX2.js → commands-CzezgtQj.js} +0 -0
- /package/client/dist/assets/{commands-BllkJauO.js → commands-DTQBF_q52.js} +0 -0
- /package/client/dist/assets/{commands-cKTaLwwV2.js → commands-hOtKuOXc.js} +0 -0
- /package/client/dist/assets/{cpp-DEE5r4Pw.js → cpp-C7h46wYY.js} +0 -0
- /package/client/dist/assets/{csharp-BVXJUvbK.js → csharp-BKxtCVv1.js} +0 -0
- /package/client/dist/assets/{csp-cXOF0JoV.js → csp-bTuwJoIa.js} +0 -0
- /package/client/dist/assets/{css-C_zQuAoy.js → css-DIMkf-bt.js} +0 -0
- /package/client/dist/assets/{cypher-t95m_Q-O.js → cypher-CVaqCwHa.js} +0 -0
- /package/client/dist/assets/{dart-B4r1Tg-e.js → dart-onAF5SnQ.js} +0 -0
- /package/client/dist/assets/{dockerfile-6mt7zHQw.js → dockerfile-DZFCIeNp.js} +0 -0
- /package/client/dist/assets/{ecl-DEY_Fz_Q.js → ecl-D05T4iGw.js} +0 -0
- /package/client/dist/assets/{elixir-R6-q1c5t.js → elixir-6RTg0lbw.js} +0 -0
- /package/client/dist/assets/{explore-CAc8Qzu32.js → explore-BG99VGpL.js} +0 -0
- /package/client/dist/assets/{explore-BO_OinBD.js → explore-C0TjprJW2.js} +0 -0
- /package/client/dist/assets/{explore-Bhy7WWXv.js → explore-C2dgEo7q.js} +0 -0
- /package/client/dist/assets/{explore-ELbrSZyQ2.js → explore-C8NDHbob.js} +0 -0
- /package/client/dist/assets/{explore-DW_YTkQh.js → explore-CWWgzQGR.js} +0 -0
- /package/client/dist/assets/{explore-DCZL9gRN2.js → explore-CcQXpdtS.js} +0 -0
- /package/client/dist/assets/{explore-BEpIs343.js → explore-DsXAgnmJ2.js} +0 -0
- /package/client/dist/assets/{flow9-CNQvHBOt.js → flow9-C5_-GSwl.js} +0 -0
- /package/client/dist/assets/{format-command-Db1viey1.js → format-command-Dfa1o2d-.js} +0 -0
- /package/client/dist/assets/{fsharp-vPZkFXwv.js → fsharp-C8Ef5oNN.js} +0 -0
- /package/client/dist/assets/{go-KUzBMYJ_.js → go-C-y9NEjX.js} +0 -0
- /package/client/dist/assets/{graphql-C3W0rCsD.js → graphql-fmXr3nnJ.js} +0 -0
- /package/client/dist/assets/{hcl-BOOMFSNX.js → hcl-CpzslTdj.js} +0 -0
- /package/client/dist/assets/{ini-CFat1WJr.js → ini-sBoK_t0W.js} +0 -0
- /package/client/dist/assets/{integrations-CG2dp3Kd.js → integrations-CH0zy1Mw2.js} +0 -0
- /package/client/dist/assets/{integrations-CUNe3t9l2.js → integrations-CIAjhd7L.js} +0 -0
- /package/client/dist/assets/{integrations-CWjh5VRk.js → integrations-CZdwOe8A.js} +0 -0
- /package/client/dist/assets/{integrations-RJfzXkPx2.js → integrations-Ct7omMld.js} +0 -0
- /package/client/dist/assets/{integrations-CAjq5tdW2.js → integrations-D6MSxy3-.js} +0 -0
- /package/client/dist/assets/{integrations-JOHSCvB3.js → integrations-DbZa-Zyc.js} +0 -0
- /package/client/dist/assets/{integrations-CP_aiV_8.js → integrations-b8pH-vfl2.js} +0 -0
- /package/client/dist/assets/{java-Dee-CNAM.js → java-BEtHBSE6.js} +0 -0
- /package/client/dist/assets/{jira-CQ7mrZde.js → jira-BySfUuQZ.js} +0 -0
- /package/client/dist/assets/{jira-DIRkZk9U.js → jira-Byw2C0F8.js} +0 -0
- /package/client/dist/assets/{jira-C5UjxHE4.js → jira-CNeYi06w2.js} +0 -0
- /package/client/dist/assets/{jira-ZdKb-50F2.js → jira-D11gPhxz.js} +0 -0
- /package/client/dist/assets/{jira-DTYu3hJi2.js → jira-D38Gj7AT.js} +0 -0
- /package/client/dist/assets/{jira-B5wszJ1-2.js → jira-gAvOyije.js} +0 -0
- /package/client/dist/assets/{jira-DtZpokjJ.js → jira-pRaL7JQo2.js} +0 -0
- /package/client/dist/assets/{julia-CGNlLYuU.js → julia-Bri6UV-V.js} +0 -0
- /package/client/dist/assets/{kotlin-CY7lhknJ.js → kotlin-BOotOW0E.js} +0 -0
- /package/client/dist/assets/{less-D0KN7hfJ.js → less-B9JPFI3C.js} +0 -0
- /package/client/dist/assets/{lexon-CuRJufPs.js → lexon-CfSJPG6W.js} +0 -0
- /package/client/dist/assets/{loops-DKzYFcq6.js → loops-CPpgMapU.js} +0 -0
- /package/client/dist/assets/{loops-Du-bNVpc2.js → loops-CWWbKuVL.js} +0 -0
- /package/client/dist/assets/{loops-DDs4KPu_.js → loops-Crc9It8o2.js} +0 -0
- /package/client/dist/assets/{loops-Bi4ywYGn.js → loops-DH2hZcbK2.js} +0 -0
- /package/client/dist/assets/{loops-DvGbSfxw2.js → loops-DS5TmvIU2.js} +0 -0
- /package/client/dist/assets/{loops-D3wdUkZV.js → loops-P2f0cN8-.js} +0 -0
- /package/client/dist/assets/{loops-BjK8lmoZ2.js → loops-fJV-9hH7.js} +0 -0
- /package/client/dist/assets/{lua-DHvH62Zf.js → lua-CsQS60Ue.js} +0 -0
- /package/client/dist/assets/{m3-tlthQ8Fo.js → m3-D-oSqn_W.js} +0 -0
- /package/client/dist/assets/{markdown-Dbx1LgUZ.js → markdown-Cimd5fb3.js} +0 -0
- /package/client/dist/assets/{mcp-DfmzoT5t.js → mcp-Czd_iyp02.js} +0 -0
- /package/client/dist/assets/{mcp-BG-OCJca2.js → mcp-D2pc5GGx.js} +0 -0
- /package/client/dist/assets/{mcp-CrWdq5db.js → mcp-D4ZjtIx32.js} +0 -0
- /package/client/dist/assets/{mcp-CbJ04oFS2.js → mcp-DIfBUv2D2.js} +0 -0
- /package/client/dist/assets/{mcp-Dd844F5_.js → mcp-DsTwmjST.js} +0 -0
- /package/client/dist/assets/{mcp-zSJ2TsJj.js → mcp-SMkn8boG.js} +0 -0
- /package/client/dist/assets/{mcp-DyULurYS2.js → mcp-fSfiVYAc.js} +0 -0
- /package/client/dist/assets/{mips-D_O3IUz_.js → mips-CIPQ_RoX.js} +0 -0
- /package/client/dist/assets/{msdax-C_ZmCnRt.js → msdax-DauUninz.js} +0 -0
- /package/client/dist/assets/{mysql-C-dCEYSX.js → mysql-SOo6toE5.js} +0 -0
- /package/client/dist/assets/{nav-DUuw9VIU2.js → nav-BRJBxaGt2.js} +0 -0
- /package/client/dist/assets/{nav-D0Erv9ZJ2.js → nav-CAGKv3_F.js} +0 -0
- /package/client/dist/assets/{nav-BY_4EWRv.js → nav-CNskRJKQ2.js} +0 -0
- /package/client/dist/assets/{nav-CVXtv0wX2.js → nav-DY93irBL.js} +0 -0
- /package/client/dist/assets/{nav-B2_ToNqS.js → nav-DhjvYgqt.js} +0 -0
- /package/client/dist/assets/{nav-S4HM94vW.js → nav-Gb-r4wop.js} +0 -0
- /package/client/dist/assets/{nav-BAMkVEId.js → nav-TvumAFD22.js} +0 -0
- /package/client/dist/assets/{objective-c-DZY9Aqxd.js → objective-c-FvmIjYaQ.js} +0 -0
- /package/client/dist/assets/{pascal-BVHLXoor.js → pascal-DrH0SRf2.js} +0 -0
- /package/client/dist/assets/{pascaligo-XdG_6u3k.js → pascaligo-D-ptJ9y-.js} +0 -0
- /package/client/dist/assets/{perl-b9QV0BcD.js → perl-oz_6vUea.js} +0 -0
- /package/client/dist/assets/{pgsql-Du5FDOgT.js → pgsql-DTj74zXo.js} +0 -0
- /package/client/dist/assets/{php-WJD0z2Z_.js → php-nr791fC2.js} +0 -0
- /package/client/dist/assets/{pla-CbciTf2w.js → pla-CopQ2nXW.js} +0 -0
- /package/client/dist/assets/{postiats-C1QxmvVq.js → postiats-43DmfD33.js} +0 -0
- /package/client/dist/assets/{powerquery-BEYDhPLZ.js → powerquery-D3hlyOfw.js} +0 -0
- /package/client/dist/assets/{powershell-CfaYw4XL.js → powershell-DmHpPYUd.js} +0 -0
- /package/client/dist/assets/{protobuf-pwZEDOYa.js → protobuf-C531GsRP.js} +0 -0
- /package/client/dist/assets/{pug-5ftqSPVe.js → pug-Z5eAx3Zn.js} +0 -0
- /package/client/dist/assets/{qsharp-uI6qZMq4.js → qsharp-DkqhCAOL.js} +0 -0
- /package/client/dist/assets/{r-BK54P1EG.js → r-BwWrilGY.js} +0 -0
- /package/client/dist/assets/{redis-DI0yd7kN.js → redis-ClamHrr6.js} +0 -0
- /package/client/dist/assets/{redshift-Dov26eyI.js → redshift-DT7zqm-g.js} +0 -0
- /package/client/dist/assets/{restructuredtext-QqJ_1dC-.js → restructuredtext-BYgofb2h.js} +0 -0
- /package/client/dist/assets/{ruby-5WjveeVb.js → ruby-DezsRK8O.js} +0 -0
- /package/client/dist/assets/{rust-BzVSfqFH.js → rust-DdL9SqIa.js} +0 -0
- /package/client/dist/assets/{sb-DMIUfT-3.js → sb-CcwsVR0C.js} +0 -0
- /package/client/dist/assets/{scala-CSKA7lqt.js → scala-DHpiXF5c.js} +0 -0
- /package/client/dist/assets/{scheme-CojOP2Qc.js → scheme-BeGwcela.js} +0 -0
- /package/client/dist/assets/{scss-DoBZGJG6.js → scss-gp-XZpBa.js} +0 -0
- /package/client/dist/assets/{setup-JeBwoXoM.js → setup-CGZjy2IF2.js} +0 -0
- /package/client/dist/assets/{setup-1vN48B-m2.js → setup-CXa0Sx16.js} +0 -0
- /package/client/dist/assets/{setup-BmJ0Kx16.js → setup-D2ktKKMF2.js} +0 -0
- /package/client/dist/assets/{setup-T_ApeQDV2.js → setup-DG2H7ha5.js} +0 -0
- /package/client/dist/assets/{setup-DQWsu2TR.js → setup-DK5bHDUq2.js} +0 -0
- /package/client/dist/assets/{setup-q0wRHUp1.js → setup-DrWlIQTZ.js} +0 -0
- /package/client/dist/assets/{setup-mXnzww4f.js → setup-rzHUVgAu.js} +0 -0
- /package/client/dist/assets/{shell-YOaE4udl.js → shell-CC2rA5mh.js} +0 -0
- /package/client/dist/assets/{solidity-l3jSyVLu.js → solidity-BEEn4gHE.js} +0 -0
- /package/client/dist/assets/{sophia-BhSGTaQJ.js → sophia-CRfGWb83.js} +0 -0
- /package/client/dist/assets/{sparql-qhk6QD9w.js → sparql-D_Lu-MrJ.js} +0 -0
- /package/client/dist/assets/{specs-BGRKhM8t.js → specs-BcyxaCwf2.js} +0 -0
- /package/client/dist/assets/{specs-GkiL-snY.js → specs-C1q9geAi.js} +0 -0
- /package/client/dist/assets/{specs-DbtIzV8a.js → specs-CLZKysq-2.js} +0 -0
- /package/client/dist/assets/{specs-Ce5y2iFc2.js → specs-DZMS9o54.js} +0 -0
- /package/client/dist/assets/{specs-CT8exGOy2.js → specs-Dm6zUI-R.js} +0 -0
- /package/client/dist/assets/{specs-C6J2zrLM.js → specs-V3TvhKLX.js} +0 -0
- /package/client/dist/assets/{specs-DZDoZsDq.js → specs-dV3Mq5Mu2.js} +0 -0
- /package/client/dist/assets/{sql-DoO3y21-.js → sql-NEE52Syq.js} +0 -0
- /package/client/dist/assets/{st-ChZAY8oG.js → st-DbInun42.js} +0 -0
- /package/client/dist/assets/{swift-D290Tr7_.js → swift-Bxkupp3x.js} +0 -0
- /package/client/dist/assets/{systemverilog-DsxzgJ-o.js → systemverilog-Bz4Y3fRF.js} +0 -0
- /package/client/dist/assets/{tcl-BKDUHAAR.js → tcl-DISqw1ZD.js} +0 -0
- /package/client/dist/assets/{terminal-BTpE7iki.js → terminal-BZiIu3rf.js} +0 -0
- /package/client/dist/assets/{terminal-DEyt0prF.js → terminal-C2NAd7BW2.js} +0 -0
- /package/client/dist/assets/{terminal-a6Uq8B0p.js → terminal-IahE4LW92.js} +0 -0
- /package/client/dist/assets/{terminal-DDk_bTw0.js → terminal-QpXZU2Bn2.js} +0 -0
- /package/client/dist/assets/{terminal-BNSg2lR7.js → terminal-ScjyXNxQ.js} +0 -0
- /package/client/dist/assets/{terminal-Cvabyzm42.js → terminal-d7GadXbN.js} +0 -0
- /package/client/dist/assets/{terminal-D0z12_sJ2.js → terminal-tITa81iz.js} +0 -0
- /package/client/dist/assets/{twig-UpZQaM8G.js → twig-De2hgUGE.js} +0 -0
- /package/client/dist/assets/{typespec-DzaKvN8i.js → typespec-B8J7ngcE.js} +0 -0
- /package/client/dist/assets/{vb-CZpbb7tk.js → vb-DV3o63ZY.js} +0 -0
- /package/client/dist/assets/{wgsl-CNt3OIvl.js → wgsl-DpFanUEy.js} +0 -0
|
@@ -9,84 +9,93 @@
|
|
|
9
9
|
|
|
10
10
|
## The single source of truth
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
`
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
12
|
+
`rail_pr_deliveries` (per-project `jobs.sqlite`, migrations 36/38/48–50; CRUD in
|
|
13
|
+
`server/rail-pr-store.ts`) stores one durable **generation** per implementation launch. A partial
|
|
14
|
+
unique index enforces one non-terminal generation per rail. Reimplementing an attached PR creates
|
|
15
|
+
generation B and atomically moves generation A to terminal `superseded`; A can never reappear after
|
|
16
|
+
B closes. `supersedes_delivery_id` preserves that lineage and `is_continuation` records that the
|
|
17
|
+
PR/head branch is borrowed review state rather than a resource this generation owns.
|
|
18
|
+
|
|
19
|
+
The important rule is that no single enum carries all truth. The row has orthogonal axes:
|
|
20
|
+
|
|
21
|
+
- `implementation_outcome`: `running | succeeded | partially_succeeded | failed | unknown` —
|
|
22
|
+
derived **only** from loop terminal outcomes.
|
|
23
|
+
- `delivery_outcome`: `pending | ready | delivered | partial | no_changes |
|
|
24
|
+
retryable_failure | blocked | not_started | unknown` — commit/ref/push readiness.
|
|
25
|
+
- `decision`: the user/action lifecycle (`building`, `on_review`, `no_changes`, `pr_draft`,
|
|
26
|
+
`pr_ready`, `pr_closed`, `pr_failed`, `implementation_failed`, plus terminal `completed`,
|
|
27
|
+
`merged`, `discarded`, `superseded`).
|
|
28
|
+
- `status_code` + bounded `status_detail`: localized stage/reason and secondary diagnostics.
|
|
29
|
+
- `delivery_sha`: the exact verified object used by an existing-PR push or retry.
|
|
30
|
+
- `pr_state`: `none | local-only | pushed | pr-created`, independent of all three axes.
|
|
31
|
+
|
|
32
|
+
`branches` is the durable per-unit record: ticket/run, branch, actual implementation result,
|
|
33
|
+
delivery eligibility, initial/final SHA, changed/no-change evidence, and failure code. Together
|
|
34
|
+
with `worktree_ids` it lets deferred decisions and both cards reconstruct full/partial outcomes
|
|
35
|
+
after refresh. `cleanup_warnings` reports best-effort cleanup honestly. `operation*` columns form
|
|
36
|
+
a leased single-winner claim around decision-side Git/GitHub effects.
|
|
37
|
+
|
|
38
|
+
## Outcome and decision matrix
|
|
31
39
|
|
|
32
40
|
```
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
engine failed (all units) → implementation_failed / not_started
|
|
42
|
+
engine succeeded + clean verified diff→ on_review (fresh) or pr_draft|pr_ready (continuation)
|
|
43
|
+
engine succeeded + no branch delta → no_changes
|
|
44
|
+
mixed clean units → on_review / partial (explicit subset)
|
|
45
|
+
engine succeeded + commit/ref unsafe → pr_failed / blocked (worktree preserved)
|
|
46
|
+
verified existing-PR push failed → pr_failed / retryable_failure (exact SHA retained)
|
|
47
|
+
GitHub reports CLOSED, not merged → pr_closed
|
|
48
|
+
new generation replaces prior one → prior generation superseded (terminal)
|
|
49
|
+
fresh no-change accepted → completed (terminal; no merge claimed)
|
|
40
50
|
```
|
|
41
51
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
legacy local merge-back exactly as before.
|
|
52
|
+
Only a real engine failure uses `implementation_failed`. A successful log can therefore coexist
|
|
53
|
+
truthfully with “delivery needs attention”. A fresh no-op never offers Create PR. A continuation
|
|
54
|
+
no-op leaves the existing PR untouched. Partial cards name the included and failed units before
|
|
55
|
+
delivery.
|
|
56
|
+
|
|
57
|
+
Continuation cleanup is ownership-aware: **Dismiss** clears the follow-up card/worktree but never
|
|
58
|
+
closes the pre-existing PR, deletes its head branch, or returns its tickets from review. A blocked
|
|
59
|
+
dirty follow-up requires an explicit destructive “Discard local result” confirmation, while still
|
|
60
|
+
preserving the external PR/branch. Fresh deliveries keep the full discard semantics.
|
|
61
|
+
|
|
62
|
+
Fresh no-change cards offer explicit **Mark done** and **Refine** outcomes. Mark done uses terminal
|
|
63
|
+
`completed` and moves review tickets to Done without claiming a merge; Refine explicitly returns
|
|
64
|
+
them to the backlog. Existing-PR no-change cards only dismiss their borrowed follow-up state.
|
|
65
|
+
|
|
66
|
+
**`merge-local` (remote-less acceptance).** Legal only without a real PR. Both surfaces confirm
|
|
67
|
+
because it changes the user's checkout. Source branches are first assembled away from the user's
|
|
68
|
+
checkout; only a complete conflict-free result may advance a still-clean, still-at-the-original-
|
|
69
|
+
HEAD integration branch. A conflict leaves the user's checkout byte-identical and the delivery
|
|
70
|
+
actionable.
|
|
71
|
+
|
|
72
|
+
## Launch and recovery wiring (`server/rail-isolated-launch.ts`)
|
|
73
|
+
|
|
74
|
+
- `prMode` is captured once. Admission is rechecked inside the per-repository allocation lock;
|
|
75
|
+
two requests cannot both create a generation or reuse the ticket-keyed worktree.
|
|
76
|
+
- A continuation supersedes its prior generation and creates the new `building` row in one DB
|
|
77
|
+
transaction. Allocation failure closes the new row and restores the prior generation atomically.
|
|
78
|
+
- Isolation units remain `per-ticket` or one `all`-scope batch unit. Initial/final SHAs plus commit
|
|
79
|
+
verification distinguish changed, resumed, and no-change results.
|
|
80
|
+
- Per-unit settlement returns structured execution + delivery results. `onLoopRunFinished` receives
|
|
81
|
+
the engine outcome only; commit/status/ref/provenance/push failures cannot rewrite it.
|
|
82
|
+
- Clean, committed worktrees may be released. Dirty, unknown, or ref-mismatched worktrees become
|
|
83
|
+
`needs-review` and are never force-removed automatically. Push failure retains the exact SHA.
|
|
84
|
+
- Project admission remains closed while startup reconciliation runs under the repo lock. Every
|
|
85
|
+
stale `building` shape becomes actionable; successful interrupted work is preserved and labelled
|
|
86
|
+
`settlement_interrupted`, while only all-failed runs become `implementation_failed`.
|
|
87
|
+
- Operation leases are process capabilities. Startup clears every prior-process lease before card
|
|
88
|
+
projection, marks the still-active delivery `operation_interrupted`, and leaves its durable SHA,
|
|
89
|
+
PR and unit evidence intact so the user can safely retry.
|
|
90
|
+
- `GET /rails` is hydration-only and never invokes crash recovery. This avoids misclassifying the
|
|
91
|
+
normal live window between durable loop completion and commit/ref/push settlement.
|
|
92
|
+
- Startup retries pending terminal ticket effects in-process and re-projects active and terminal
|
|
93
|
+
origin-linked rows into Agent Chat before admission opens, repairing cards left stale by a crash
|
|
94
|
+
or migration. Admission remains closed and cards show `cleanup_incomplete` until every JSON/Jira
|
|
95
|
+
phase is durably settled.
|
|
96
|
+
An already-identical card is neither rewritten nor broadcast, so old terminal history does not
|
|
97
|
+
create fake unread activity on every launch.
|
|
98
|
+
- PR mode never invokes legacy merge-back. Kill-switch-off behavior remains the legacy path.
|
|
90
99
|
|
|
91
100
|
## Per-run worktree overlay (`server/worktree-overlay.ts`)
|
|
92
101
|
|
|
@@ -133,29 +142,59 @@ v1 `POST /rails/pr-review`). The route validates and delegates to
|
|
|
133
142
|
`server/rail-pr-decision.ts` `executePrDecision` (deps injected — db/git/exec/broadcast/jira/
|
|
134
143
|
agent-chat — so the whole matrix unit-tests without git/gh/network).
|
|
135
144
|
|
|
145
|
+
Before any Git, GitHub, cleanup or ticket effect, the endpoint atomically claims the row's leased
|
|
146
|
+
`operation_token`. A second window loses **before** it can perform an effect. The token is cleared
|
|
147
|
+
before the new snapshot is persisted to the agent card/broadcast; a dead-process lease is bounded
|
|
148
|
+
and reclaimable, and the final CAS verifies that the caller still owns it. Every response also
|
|
149
|
+
contains the authoritative post-action snapshot, so losing a WebSocket frame cannot leave the
|
|
150
|
+
initiating card stale. While startup recovery owns the project, decision and checkout endpoints
|
|
151
|
+
return a specific retry-later conflict. Every decision that can mutate refs/worktrees shares the
|
|
152
|
+
same repository lock as recovery, launch allocation and checkout, revalidates its admission epoch
|
|
153
|
+
after waiting for that lock, and uses bounded Git/GitHub command timeouts so a wedged child cannot
|
|
154
|
+
block the repository forever.
|
|
155
|
+
|
|
136
156
|
- **create-pr** — deferred `deliverRailAsPr` (`server/rail-pr-delivery.ts`: 1 unit → its
|
|
137
157
|
branch; N → assembled onto the conventional batch branch off the integration branch, one PR
|
|
138
158
|
covering every ticket). The PR **title and canonical body are composed here** (see "Branch
|
|
139
159
|
naming & PR content" below) from the ticket store + `jira_links` + the branch diffs — all
|
|
140
|
-
failure-tolerant.
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
(+`pr_url`/`pr_number` when `pr-created`; null when degraded)
|
|
145
|
-
|
|
146
|
-
|
|
160
|
+
failure-tolerant. Each unit is pushed/merged from its immutable settled `finalSha`, never from a
|
|
161
|
+
later mutable or historical ticket branch. A degraded multi-unit retry reuses its owned assembled
|
|
162
|
+
head, preserving exact head/base PR identity; unrelated name collisions suffix `-2`… and are never
|
|
163
|
+
pre-deleted. Delivered → `pr_draft`
|
|
164
|
+
(+`pr_url`/`pr_number` when `pr-created`; null when degraded). `publishDraftPr` adopts an exact
|
|
165
|
+
existing head/base PR when `gh pr create` returns no URL, says it already exists, or a retry
|
|
166
|
+
follows an ambiguous interruption. Assembly/ref failures are blocked; only safe stages are
|
|
167
|
+
labelled retryable. Tickets stay `on_review`.
|
|
147
168
|
- **publish** — `gh pr ready <url>` → `pr_ready` (the draft opens for the team's normal review).
|
|
148
169
|
Requires a real `pr_url`.
|
|
149
|
-
- **discard** — best-effort `gh pr close <url> --delete-branch`; remove the launch's worktrees
|
|
150
|
-
(ledger rows closed as `failed`); delete
|
|
151
|
-
|
|
152
|
-
|
|
170
|
+
- **discard** — for a fresh delivery, best-effort `gh pr close <url> --delete-branch`; remove the launch's worktrees
|
|
171
|
+
(ledger rows closed as `failed`); delete only branches durably recorded as created by this
|
|
172
|
+
delivery (owned per-unit sources plus its exact assembled head; preferred names are never
|
|
173
|
+
recomputed, and the integration branch is NEVER deleted); → `discarded`; revert
|
|
153
174
|
still-`on_review` tickets → `todo` (a manually re-triaged spec is respected) + Jira
|
|
154
|
-
`onRailDiscard`.
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
175
|
+
`onRailDiscard`. Failures are retained in `cleanup_warnings` and disclosed. For a continuation,
|
|
176
|
+
discard can remove only the explicitly confirmed blocked local iteration: it preserves the
|
|
177
|
+
borrowed PR/head and review ticket state.
|
|
178
|
+
- **dismiss** — continuation acknowledgement. Clears the generation and owned clean
|
|
179
|
+
worktree while preserving the existing PR, head branch and `on_review` tickets.
|
|
180
|
+
- **acknowledge-no-changes** — fresh no-change acceptance → terminal `completed`, tickets Done,
|
|
181
|
+
with no PR/merge claim. Jira receives its own no-PR completion comment. Refine remains the
|
|
182
|
+
explicitly backlog-returning path and always uses Jira `todo`; it never inherits the configured
|
|
183
|
+
discard/cancellation status.
|
|
184
|
+
- **poll-merge** — observes state, exact head/base/head OID, merge commit and PR commit set;
|
|
185
|
+
`MERGED` becomes `merged` only when that immutable evidence contains `delivery_sha`, then tickets
|
|
186
|
+
→ `done` + Jira `onRailMerged`. `OPEN` is observation-only; `CLOSED` without merge → `pr_closed`.
|
|
187
|
+
- **reopen** — `gh pr reopen` from `pr_closed`, returning to draft or ready according to GitHub.
|
|
188
|
+
- **merge-local** — builds the complete merge in an isolated temporary checkout and advances the
|
|
189
|
+
user's revalidated clean base only after all branches succeed.
|
|
190
|
+
|
|
191
|
+
Terminal discard/merge/completion inserts `rail_pr_ticket_effects` in the same SQLite transaction
|
|
192
|
+
as its decision and snapshots each ticket's non-null outcome owner. Before crossing into ticket JSON
|
|
193
|
+
the worker durably freezes only IDs still `on_review` whose owner still matches that snapshot, then
|
|
194
|
+
checkpoints the JSON phase and Jira-outbox handoff separately. An old terminal row therefore cannot
|
|
195
|
+
change or enqueue Jira work for a newer iteration. Jira's idempotency keys make a crash after enqueue
|
|
196
|
+
safe to repeat; the effect becomes complete only after that durable handoff. Startup retries every
|
|
197
|
+
unfinished phase, including causally provable migrated terminal rows, before admission opens.
|
|
159
198
|
|
|
160
199
|
`gh` failures return 502 `gh_failed` with **no transition**. Illegal action for the current
|
|
161
200
|
state → 409 (`stale_decision` + `reason: 'illegal_action'`).
|
|
@@ -204,8 +243,8 @@ diff collection), fully unit-tested.
|
|
|
204
243
|
|
|
205
244
|
## The sync contract (two surfaces, zero desync)
|
|
206
245
|
|
|
207
|
-
|
|
208
|
-
the
|
|
246
|
+
SQLite remains authoritative. Both surfaces render a full snapshot and POST the same endpoint with
|
|
247
|
+
the `expectedDecision` they rendered.
|
|
209
248
|
|
|
210
249
|
- **Durable WS event `rail.pr_state`** (project-scoped, full snapshot — replaces the retired
|
|
211
250
|
one-shot `rail.pr_delivered`): broadcast at row INSERT (`building`), build-settle, and every
|
|
@@ -214,8 +253,9 @@ the same endpoint with the `expectedDecision` they rendered.
|
|
|
214
253
|
- **Option A — dashboard.** `client/src/context/RailPrDecisionContext.tsx` (registerHandler on
|
|
215
254
|
the shared socket + `GET /rails` seed) feeds `RailPrDecisionStrip` on `RailRow` (both density
|
|
216
255
|
branches): on_review → Create PR / Discard; pr_draft → Open PR + Publish / Discard (degraded →
|
|
217
|
-
retry); pr_ready → Check merge
|
|
218
|
-
|
|
256
|
+
retry); pr_ready → Check merge; no_changes → Done/refine; pr_closed → Reopen; pr_failed derives
|
|
257
|
+
retry-vs-blocked actions from `delivery_outcome`. Logs remain available after settle. Buttons
|
|
258
|
+
disable in flight and apply the authoritative HTTP snapshot immediately.
|
|
219
259
|
- **Option B — agent chat.** When the row carries `origin_conversation_id`, settle posts a
|
|
220
260
|
**persisted inline card**: a `'system'`-role `agent_messages` row (role is unconstrained TEXT —
|
|
221
261
|
no migration; TS unions widened) whose content is the `PrDecisionCardEnvelope` JSON.
|
|
@@ -224,15 +264,18 @@ the same endpoint with the `expectedDecision` they rendered.
|
|
|
224
264
|
process-wide `server/agent-chat-registry.ts` singleton (null-safe: tests/disabled builds).
|
|
225
265
|
Live updates ride the app-global `agent_pr_decision` WS event; the client renders
|
|
226
266
|
`AgentPrDecisionCard` and POSTs the same project-scoped `/rails/pr-decision`.
|
|
227
|
-
- **Race:**
|
|
228
|
-
|
|
267
|
+
- **Race:** a stale generation or occupied operation lease returns 409 before effects. Clients
|
|
268
|
+
distinguish `operation_in_progress` from a stale decision, show the active operation, disable
|
|
269
|
+
actions, apply the response snapshot, ignore terminal events for an older delivery id, and
|
|
270
|
+
hydrate again on focus/reconnect.
|
|
229
271
|
|
|
230
272
|
## Relaunch guard
|
|
231
273
|
|
|
232
|
-
`POST /rails/:i/launch` returns **409 `{ error: 'pr_decision_pending', prDeliveryId }`**
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
274
|
+
`POST /rails/:i/launch` returns **409 `{ error: 'pr_decision_pending', prDeliveryId }`** for an
|
|
275
|
+
unresolved fresh delivery. An active `pr_draft`/`pr_ready` generation covering the same tickets is
|
|
276
|
+
a verified continuation contract instead: launch revalidates it again under the repo lock,
|
|
277
|
+
supersedes it atomically and runs only on that PR head. A stale concurrent request receives 409
|
|
278
|
+
before it can allocate or claim anything. Legacy / non-isolated launches are unaffected.
|
|
236
279
|
|
|
237
280
|
## Ticket lifecycle — `on_review`
|
|
238
281
|
|
|
@@ -297,33 +340,30 @@ the launch INSERT. As-built:
|
|
|
297
340
|
- `POST /rails/:i/launch` accepts `originConversationId` (validated `/^[A-Za-z0-9-]{1,64}$/`) and
|
|
298
341
|
`originSurface` (`'dashboard' | 'agent-chat'`), threaded into `launchIsolatedRail`.
|
|
299
342
|
Dashboard launches default to `origin_surface='dashboard'`, `origin_conversation_id=NULL`.
|
|
300
|
-
- **The MCP auto-attach chain (shipped)** —
|
|
301
|
-
end-to-end
|
|
302
|
-
`
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
`ctx.originConversationId` next to the project pin (same per-call ctx-copy discipline;
|
|
317
|
-
malformed ⇒ `null`, never throws — the launch degrades to untagged).
|
|
318
|
-
4. `specrails_rails(launch)` (`server/mcp/tools/rails.ts`) adds
|
|
343
|
+
- **The authenticated MCP auto-attach chain (shipped)** — an agent-launched rail tags itself
|
|
344
|
+
end-to-end without trusting caller-controlled context headers:
|
|
345
|
+
1. `AgentChatManager` mints an unguessable, turn-scoped capability. The server stores only
|
|
346
|
+
its hash and binds it to the actual conversation, pinned project and permission level.
|
|
347
|
+
2. `prepareAgentMcp` writes the bearer to an app-owned `0600` capability file. Claude,
|
|
348
|
+
Codex and Gemini MCP configs carry only `SPECRAILS_AGENT_CAPABILITY_FILE`, so the raw
|
|
349
|
+
bearer never appears in command-line arguments. Workspace MCP wiring deliberately carries
|
|
350
|
+
no capability.
|
|
351
|
+
3. `mcp-bridge` reads that file and forwards the bearer as
|
|
352
|
+
`x-specrails-agent-capability`. Legacy tier/project/conversation env vars and headers are
|
|
353
|
+
ignored. The staged bundle `src-tauri/binaries/specrails-mcp.js` must be regenerated via
|
|
354
|
+
`npm run build:mcp-bridge` whenever the bridge source changes.
|
|
355
|
+
4. `registerTieredTool` (`server/mcp/tools/types.ts`) verifies the bearer and derives the
|
|
356
|
+
per-call tier, project and `ctx.originConversationId` from its server-side binding. The
|
|
357
|
+
manager revokes the capability and removes its file when the turn settles.
|
|
358
|
+
5. `specrails_rails(launch)` (`server/mcp/tools/rails.ts`) adds
|
|
319
359
|
`originConversationId` + `originSurface:'agent-chat'` to the POST body when the ctx
|
|
320
360
|
carries an id (`apiCall` forwards no custom headers, so the id rides the JSON body).
|
|
321
|
-
External MCP clients (Claude Desktop, Cursor, …)
|
|
322
|
-
|
|
323
|
-
`server/mcp/tools/rails-origin.test.ts` (
|
|
361
|
+
External MCP clients (Claude Desktop, Cursor, …) have no capability, so launches remain
|
|
362
|
+
untagged and Settings tiers govern them. Covered end-to-end by
|
|
363
|
+
`server/mcp/tools/rails-origin.test.ts` (capability → ctx → body → route → persisted row →
|
|
324
364
|
settle fires `postPrDecisionCard` for that conversation).
|
|
325
365
|
|
|
326
|
-
## Decisions (D1–
|
|
366
|
+
## Decisions (D1–D17, condensed)
|
|
327
367
|
|
|
328
368
|
- **D1 — three extra columns** (`branches`, `loop_name`, `worktree_ids`) on migration 36:
|
|
329
369
|
deferred create-pr/discard must be reconstructible from the row; nothing survives in memory
|
|
@@ -336,13 +376,14 @@ the launch INSERT. As-built:
|
|
|
336
376
|
receives the spawn-captured flag from QueueManager — see "Ticket lifecycle" above. The opt-in
|
|
337
377
|
option shape survives unchanged; only its defaults moved from hardcoded `'done'` to
|
|
338
378
|
flag-derived.
|
|
339
|
-
- **D3 —
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
- **D4 — create-pr reconstructs deliverRailAsPr inputs from the row**
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
- **D5 — relaunch
|
|
379
|
+
- **D3 — orthogonal outcomes**: only loop outcomes determine implementation success; delivery,
|
|
380
|
+
decision and PR lifecycle are independent. Zero actual successes becomes
|
|
381
|
+
`implementation_failed`; successful blocked/no-change runs retain their truth.
|
|
382
|
+
- **D4 — create-pr reconstructs deliverRailAsPr inputs from the row** using each unit's exact
|
|
383
|
+
settled object. It reuses an owned degraded batch head and never deletes a merely name-matching
|
|
384
|
+
branch.
|
|
385
|
+
- **D5 — relaunch admission**: unresolved fresh work returns 409; a matching open-PR generation
|
|
386
|
+
is superseded atomically and continued on its exact verified head.
|
|
346
387
|
- **D6 — `rail.pr_delivered` retired**, replaced by the durable `rail.pr_state` + the
|
|
347
388
|
`GET /rails` `prDeliveries` hydration; `Map<railIndex, …>` on the client keyed to the newest
|
|
348
389
|
active row.
|
|
@@ -356,9 +397,26 @@ the launch INSERT. As-built:
|
|
|
356
397
|
inbound preservation and the three outbox hooks.
|
|
357
398
|
- **D10 — on_review everywhere**: server union + every client `Record<TicketStatus, …>` map,
|
|
358
399
|
board bucketing (ToDo tab), drag/launch guards, context-menu out-only, pill, i18n ×8.
|
|
359
|
-
- **D11 — premium decision UI**: disable-on-click reconciled to
|
|
360
|
-
branch, PR url), designed degraded/failed states,
|
|
400
|
+
- **D11 — premium decision UI**: disable-on-click reconciled to authoritative snapshots, tooltips
|
|
401
|
+
(base branch, PR url), designed degraded/failed states, distinct stale-vs-operation-busy 409 UX;
|
|
361
402
|
English source strings, all 8 locales, locale-parity green.
|
|
403
|
+
- **D12 — no automatic data loss**: dirty, unknown and ref-mismatched worktrees are
|
|
404
|
+
`needs-review`; only explicit consequence-specific cleanup may force-remove them.
|
|
405
|
+
- **D13 — one active generation**: migration 48 supersedes historical duplicates and a partial
|
|
406
|
+
unique index enforces one active row per rail.
|
|
407
|
+
- **D14 — operation lease before effects**: a decision claims before Git/GitHub/ticket work;
|
|
408
|
+
the loser has no external side effects and HTTP returns the authoritative snapshot.
|
|
409
|
+
- **D15 — exact/idempotent delivery**: continuation retry pushes `delivery_sha`; ambiguous PR
|
|
410
|
+
creation resolves exact open head/base identity; CLOSED is distinct and reopenable.
|
|
411
|
+
- **D16 — crash recovery before admission**: startup preserves successful interrupted work and
|
|
412
|
+
makes every stale `building` generation actionable before another launch can reuse its path.
|
|
413
|
+
- **D17 — ownership-aware continuation cleanup**: dismiss/discard never closes or deletes the
|
|
414
|
+
pre-existing PR/head and never reverts its review tickets.
|
|
415
|
+
- **D18 — terminal ticket outbox**: terminal decision + ticket intent commit atomically; startup
|
|
416
|
+
replay closes the SQLite/JSON crash window, exact causal ownership prevents old generations from
|
|
417
|
+
mutating newer work, and terminal Agent cards are re-projected.
|
|
418
|
+
- **D19 — truthful no-change completion**: fresh no-change has Mark done (`completed`) and Refine;
|
|
419
|
+
a continuation only dismisses its borrowed follow-up.
|
|
362
420
|
|
|
363
421
|
## Kill-switch
|
|
364
422
|
|
package/docs/mcp.md
CHANGED
|
@@ -207,6 +207,12 @@ codex mcp add specrails -- <bridge command from Settings ▸ MCP>
|
|
|
207
207
|
network ingress; an MCP client must run on the same machine.
|
|
208
208
|
- **Tiers, not blanket access.** Even with a valid token, an agent can only do
|
|
209
209
|
what the enabled tiers allow (read by default). High-risk actions stay opt-in.
|
|
210
|
+
- **Loopback is not identity.** The scoped MCP token identifies an external local
|
|
211
|
+
client; it cannot impersonate the embedded Agent Mode by adding tier, project,
|
|
212
|
+
or conversation headers. For each Agent Mode turn, Specrails mints a private,
|
|
213
|
+
short-lived capability bound server-side to that conversation, pinned project,
|
|
214
|
+
and permission level, transports it through an app-owned `0600` file, and
|
|
215
|
+
revokes it when the turn ends.
|
|
210
216
|
- **The app must be running.** The MCP server is embedded in the desktop app's
|
|
211
217
|
process — there is no standalone daemon. The Tauri shell keeps it alive even
|
|
212
218
|
when you close the main window: closing the window **minimizes to the system
|
|
@@ -217,12 +223,16 @@ codex mcp add specrails -- <bridge command from Settings ▸ MCP>
|
|
|
217
223
|
|
|
218
224
|
## v1 limitations — what is *not* exposed
|
|
219
225
|
|
|
220
|
-
The tool catalog deliberately leaves the highest-risk execution vectors
|
|
221
|
-
v1. None of these are reachable
|
|
226
|
+
The public tool catalog deliberately leaves the highest-risk execution vectors
|
|
227
|
+
out of v1. None of these are reachable by an external MCP client authenticated
|
|
228
|
+
only with the scoped MCP token:
|
|
222
229
|
|
|
223
|
-
- **
|
|
224
|
-
|
|
225
|
-
|
|
230
|
+
- **Raw terminal shell execution.** The built-in terminal panel is not exposed
|
|
231
|
+
to external MCP clients. `background_start` and `background_kill` are a
|
|
232
|
+
private Agent Mode path: they require a live server-minted capability,
|
|
233
|
+
Autonomous permission, and explicit confirmation for the exact command.
|
|
234
|
+
Supplying legacy context headers or enabling the external Destructive tier
|
|
235
|
+
does not grant access to that path.
|
|
226
236
|
- **Browser capture.** No browser navigation / screenshot / capture tool.
|
|
227
237
|
- **In-app file write.** The code explorer is **read-only** over MCP — there is
|
|
228
238
|
no source-file overwrite tool (`code_write_file`). An agent can read files and
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specrails-desktop",
|
|
3
|
-
"version": "2.29.
|
|
3
|
+
"version": "2.29.2",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"cross-spawn": "^7.0.6",
|
|
52
52
|
"diff": "^9.0.0",
|
|
53
53
|
"express": "^5.2.1",
|
|
54
|
-
"multer": "^2.
|
|
54
|
+
"multer": "^2.2.0",
|
|
55
55
|
"node-pty": "^1.0.0",
|
|
56
56
|
"pdf-parse": "^2.4.5",
|
|
57
57
|
"playwright": "^1.60.0",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"selfsigned": "^5.5.0",
|
|
60
60
|
"tree-kill": "^1.2.2",
|
|
61
61
|
"werift": "^0.23.0",
|
|
62
|
-
"ws": "^8.
|
|
62
|
+
"ws": "^8.21.0",
|
|
63
63
|
"zod": "^3.25.76"
|
|
64
64
|
},
|
|
65
65
|
"devDependencies": {
|
|
@@ -74,12 +74,16 @@
|
|
|
74
74
|
"@types/pdf-parse": "^1.1.5",
|
|
75
75
|
"@types/supertest": "^7.2.0",
|
|
76
76
|
"@types/ws": "^8.5.0",
|
|
77
|
-
"@vitest/coverage-v8": "^4.1.
|
|
77
|
+
"@vitest/coverage-v8": "^4.1.10",
|
|
78
78
|
"concurrently": "^9.2.1",
|
|
79
|
-
"esbuild": "^0.28.
|
|
79
|
+
"esbuild": "^0.28.1",
|
|
80
80
|
"supertest": "^7.2.2",
|
|
81
|
-
"tsx": "^4.
|
|
81
|
+
"tsx": "^4.23.0",
|
|
82
82
|
"typescript": "^5.4.0",
|
|
83
|
-
"vitest": "^4.1.
|
|
83
|
+
"vitest": "^4.1.10"
|
|
84
|
+
},
|
|
85
|
+
"overrides": {
|
|
86
|
+
"ip": "npm:@eggjs/ip@2.1.0",
|
|
87
|
+
"shell-quote": "1.9.0"
|
|
84
88
|
}
|
|
85
89
|
}
|
|
@@ -4,6 +4,7 @@ exports.resolveActivePrContinuationTargets = resolveActivePrContinuationTargets;
|
|
|
4
4
|
const jira_db_1 = require("./jira/jira-db");
|
|
5
5
|
const rail_pr_store_1 = require("./rail-pr-store");
|
|
6
6
|
const integration_branch_1 = require("./integration-branch");
|
|
7
|
+
const pr_lifecycle_1 = require("./pr-lifecycle");
|
|
7
8
|
const PR_MATCH_RANK = {
|
|
8
9
|
'title-similarity': 1,
|
|
9
10
|
'ticket-ref': 2,
|
|
@@ -203,8 +204,22 @@ function mergeOpenPrs(prs) {
|
|
|
203
204
|
async function resolveActivePrContinuationTargets(input) {
|
|
204
205
|
const out = new Map();
|
|
205
206
|
const internal = internalDeliveryTargets(input.db, input.ticketIds);
|
|
207
|
+
const lifecycleByUrl = new Map();
|
|
206
208
|
for (const [ticketId, target] of internal) {
|
|
207
|
-
|
|
209
|
+
if (!target.prUrl)
|
|
210
|
+
continue;
|
|
211
|
+
let lifecycle = lifecycleByUrl.get(target.prUrl);
|
|
212
|
+
if (!lifecycle) {
|
|
213
|
+
lifecycle = (0, pr_lifecycle_1.observePrLifecycle)(input.exec, input.repoDir, target.prUrl);
|
|
214
|
+
lifecycleByUrl.set(target.prUrl, lifecycle);
|
|
215
|
+
}
|
|
216
|
+
const observed = await lifecycle;
|
|
217
|
+
// A ledger row is only a hint. GitHub remains lifecycle authority: a stale
|
|
218
|
+
// draft/ready row for a CLOSED/MERGED or different head/base PR must not be
|
|
219
|
+
// superseded and must not lend its branch to another implementation run.
|
|
220
|
+
if (!observed.ok || !(0, pr_lifecycle_1.isExactOpenPr)(observed, target.branch, target.baseBranch))
|
|
221
|
+
continue;
|
|
222
|
+
const materialized = await materializeTarget(input.git, input.repoDir, input.fetchOk, ticketId, target.branch, target.baseBranch, target.prUrl, target.prNumber, observed.isDraft, 'rail-pr-delivery');
|
|
208
223
|
if (materialized)
|
|
209
224
|
out.set(ticketId, materialized);
|
|
210
225
|
}
|