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
|
@@ -4,6 +4,8 @@ exports.registerGitRoutes = registerGitRoutes;
|
|
|
4
4
|
const project_git_1 = require("./project-git");
|
|
5
5
|
const git_diagnostics_1 = require("./git-diagnostics");
|
|
6
6
|
const pr_publisher_1 = require("./pr-publisher");
|
|
7
|
+
const repo_lock_1 = require("./repo-lock");
|
|
8
|
+
const process_admission_1 = require("./process-admission");
|
|
7
9
|
// ─── Git domain routes (/api/projects/:projectId/git) ─────────────────────────
|
|
8
10
|
//
|
|
9
11
|
// Backs the Agent-Mode git bar: current branch + last commit + local branches,
|
|
@@ -70,9 +72,14 @@ function registerGitRoutes(deps) {
|
|
|
70
72
|
res.status(400).json({ error: 'branch is required' });
|
|
71
73
|
return;
|
|
72
74
|
}
|
|
73
|
-
const
|
|
75
|
+
const project = ctx(req).project;
|
|
76
|
+
const repoDir = project.path;
|
|
74
77
|
try {
|
|
75
|
-
const
|
|
78
|
+
const admission = (0, process_admission_1.captureProcessAdmission)(project.id);
|
|
79
|
+
const result = await (0, repo_lock_1.withRepoLock)(repoDir, () => {
|
|
80
|
+
admission.assertCurrent();
|
|
81
|
+
return (0, project_git_1.checkoutProjectBranch)(repoDir, branch);
|
|
82
|
+
});
|
|
76
83
|
if (!result.ok) {
|
|
77
84
|
// 409: the working tree state (or an unknown branch) refused the switch.
|
|
78
85
|
res.status(409).json({ error: result.error });
|
|
@@ -81,6 +88,10 @@ function registerGitRoutes(deps) {
|
|
|
81
88
|
res.json(await (0, project_git_1.getProjectGitInfo)(repoDir));
|
|
82
89
|
}
|
|
83
90
|
catch (err) {
|
|
91
|
+
if (err instanceof process_admission_1.ProcessAdmissionClosedError) {
|
|
92
|
+
res.status(409).json({ error: 'project_recovery_in_progress' });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
84
95
|
console.error('[project-git] checkout failed:', err);
|
|
85
96
|
res.status(500).json({ error: 'Checkout failed' });
|
|
86
97
|
}
|
|
@@ -5,16 +5,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.registerJobsRoutes = registerJobsRoutes;
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const ids_1 = require("./ids");
|
|
8
9
|
const db_1 = require("./db");
|
|
9
10
|
const queue_manager_1 = require("./queue-manager");
|
|
10
11
|
const feature_flags_1 = require("./feature-flags");
|
|
11
12
|
const types_1 = require("./types");
|
|
12
13
|
const hooks_1 = require("./hooks");
|
|
13
14
|
const explore_smash_1 = require("./explore-smash");
|
|
15
|
+
const job_spawn_idempotency_1 = require("./job-spawn-idempotency");
|
|
14
16
|
const spec_models_1 = require("./spec-models");
|
|
15
17
|
const provider_selection_1 = require("./provider-selection");
|
|
16
18
|
const loop_runs_store_1 = require("./loop-runs-store");
|
|
17
19
|
const metrics_1 = require("./metrics");
|
|
20
|
+
const job_listing_1 = require("./job-listing");
|
|
18
21
|
const ticket_store_1 = require("./ticket-store");
|
|
19
22
|
const transient_children_1 = require("./transient-children");
|
|
20
23
|
const project_router_helpers_1 = require("./project-router-helpers");
|
|
@@ -45,10 +48,23 @@ function registerJobsRoutes(deps) {
|
|
|
45
48
|
res.status(400).json({ error: 'priority must be one of: low, normal, high, critical' });
|
|
46
49
|
return;
|
|
47
50
|
}
|
|
51
|
+
if (dependsOnJobId !== undefined &&
|
|
52
|
+
(typeof dependsOnJobId !== 'string' || !dependsOnJobId.trim())) {
|
|
53
|
+
res.status(400).json({ error: 'dependsOnJobId must be a non-empty string' });
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const normalizedDependsOnJobId = typeof dependsOnJobId === 'string'
|
|
57
|
+
? dependsOnJobId.trim()
|
|
58
|
+
: undefined;
|
|
48
59
|
// profileName accepts: undefined (default resolution), null (force legacy), string (explicit)
|
|
49
60
|
const normalizedProfileName = profileName === null ? null
|
|
50
61
|
: typeof profileName === 'string' && profileName.trim() ? profileName.trim()
|
|
51
62
|
: undefined;
|
|
63
|
+
const idempotencyKey = req.get('Idempotency-Key');
|
|
64
|
+
if (idempotencyKey !== undefined && !/^[A-Za-z0-9._:-]{1,128}$/.test(idempotencyKey)) {
|
|
65
|
+
res.status(400).json({ error: 'Idempotency-Key must be 1-128 URL-safe characters' });
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
52
68
|
// aiEngine: optional per-job provider override; must be installed on the
|
|
53
69
|
// project. Omitting it runs on the project's primary provider.
|
|
54
70
|
const engineCheck = (0, provider_selection_1.validateRequestedProvider)(ctx(req).project, aiEngine);
|
|
@@ -57,12 +73,42 @@ function registerJobsRoutes(deps) {
|
|
|
57
73
|
return;
|
|
58
74
|
}
|
|
59
75
|
try {
|
|
60
|
-
const
|
|
61
|
-
|
|
76
|
+
const c = ctx(req);
|
|
77
|
+
const normalizedPriority = priority ?? 'normal';
|
|
78
|
+
const spawnFingerprint = idempotencyKey ? (0, job_spawn_idempotency_1.fingerprintJobSpawn)({
|
|
79
|
+
command,
|
|
80
|
+
priority: normalizedPriority,
|
|
81
|
+
dependsOnJobId: normalizedDependsOnJobId ?? null,
|
|
82
|
+
pipelineId: pipelineId || null,
|
|
83
|
+
profileName: normalizedProfileName === undefined ? '__project_default__' : normalizedProfileName,
|
|
84
|
+
provider: aiEngine ? engineCheck.provider : null,
|
|
85
|
+
}) : null;
|
|
86
|
+
if (idempotencyKey && spawnFingerprint) {
|
|
87
|
+
const existingJobId = (0, job_spawn_idempotency_1.findIdempotentJob)(c.db, idempotencyKey, spawnFingerprint);
|
|
88
|
+
if (existingJobId) {
|
|
89
|
+
res.status(202).json({ jobId: existingJobId, position: null, idempotentReplay: true });
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Preassign the id and commit queued_jobs + the idempotency claim in
|
|
94
|
+
// QueueManager's ONE outer transaction. QueueManager broadcasts/drains
|
|
95
|
+
// only after that commit, so a crash can expose neither an unclaimed job
|
|
96
|
+
// nor a ledger entry whose job was never admitted.
|
|
97
|
+
const preparedJobId = idempotencyKey ? (0, ids_1.newId)() : null;
|
|
98
|
+
const enqueueOptions = {
|
|
99
|
+
dependsOnJobId: normalizedDependsOnJobId,
|
|
62
100
|
pipelineId: pipelineId || undefined,
|
|
63
|
-
|
|
101
|
+
...(normalizedProfileName !== undefined
|
|
102
|
+
? { profileName: normalizedProfileName }
|
|
103
|
+
: {}),
|
|
64
104
|
provider: aiEngine ? engineCheck.provider : undefined,
|
|
65
|
-
}
|
|
105
|
+
};
|
|
106
|
+
const job = idempotencyKey && spawnFingerprint && preparedJobId
|
|
107
|
+
? c.queueManager.enqueue(command, normalizedPriority, enqueueOptions, {
|
|
108
|
+
jobId: preparedJobId,
|
|
109
|
+
commit: (db) => (0, job_spawn_idempotency_1.claimIdempotentJob)(db, idempotencyKey, spawnFingerprint, preparedJobId),
|
|
110
|
+
})
|
|
111
|
+
: c.queueManager.enqueue(command, normalizedPriority, enqueueOptions);
|
|
66
112
|
const position = job.queuePosition ?? 0;
|
|
67
113
|
res.status(202).json({ jobId: job.id, position });
|
|
68
114
|
}
|
|
@@ -70,6 +116,15 @@ function registerJobsRoutes(deps) {
|
|
|
70
116
|
if (err instanceof queue_manager_1.ClaudeNotFoundError) {
|
|
71
117
|
res.status(400).json({ error: err.message });
|
|
72
118
|
}
|
|
119
|
+
else if (err instanceof queue_manager_1.InvalidJobDependencyError) {
|
|
120
|
+
res.status(409).json({ error: err.message });
|
|
121
|
+
}
|
|
122
|
+
else if (err instanceof job_spawn_idempotency_1.JobSpawnIdempotencyReplayError) {
|
|
123
|
+
res.status(202).json({ jobId: err.jobId, position: null, idempotentReplay: true });
|
|
124
|
+
}
|
|
125
|
+
else if (err instanceof job_spawn_idempotency_1.JobSpawnIdempotencyConflictError) {
|
|
126
|
+
res.status(409).json({ error: err.message });
|
|
127
|
+
}
|
|
73
128
|
else {
|
|
74
129
|
console.error('[project-router] spawn error:', err);
|
|
75
130
|
res.status(500).json({ error: 'Internal server error' });
|
|
@@ -227,7 +282,10 @@ function registerJobsRoutes(deps) {
|
|
|
227
282
|
const allowed = (0, spec_models_1.getModelsForProvider)(provider);
|
|
228
283
|
res.json({ model, provider, allowed, providers: project.providers });
|
|
229
284
|
});
|
|
230
|
-
|
|
285
|
+
// Cancellation is idempotent and intentionally separate from history
|
|
286
|
+
// deletion. A stale UI request that races with natural completion must never
|
|
287
|
+
// erase the just-finished job and its telemetry.
|
|
288
|
+
router.post('/:projectId/jobs/:id/cancel', (req, res) => {
|
|
231
289
|
const id = req.params.id;
|
|
232
290
|
const c = ctx(req);
|
|
233
291
|
// A loop run is backed by a job row but is NOT a QueueManager job — it is
|
|
@@ -249,17 +307,21 @@ function registerJobsRoutes(deps) {
|
|
|
249
307
|
// the loop is still executing — cancel through the engine instead of
|
|
250
308
|
// 404ing with a live child (the mission-modal "cancel did nothing" bug).
|
|
251
309
|
const loopRun = (0, loop_runs_store_1.getLoopRun)(c.db, id);
|
|
252
|
-
if (loopRun
|
|
253
|
-
c.loopRunManager
|
|
254
|
-
|
|
255
|
-
|
|
310
|
+
if (loopRun) {
|
|
311
|
+
if ((loopRun.status === 'running' || loopRun.status === 'paused') && c.loopRunManager) {
|
|
312
|
+
c.loopRunManager.cancel(id);
|
|
313
|
+
res.json({ ok: true, status: 'canceling' });
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
if (loopRun.status === 'completed') {
|
|
317
|
+
res.json({ ok: true, status: 'already_terminal' });
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
256
320
|
}
|
|
257
321
|
res.status(404).json({ error: 'Job not found' });
|
|
258
322
|
}
|
|
259
323
|
else if (err instanceof queue_manager_1.JobAlreadyTerminalError) {
|
|
260
|
-
|
|
261
|
-
(0, db_1.deleteJob)(ctx(req).db, req.params.id);
|
|
262
|
-
res.json({ ok: true, status: 'deleted' });
|
|
324
|
+
res.json({ ok: true, status: 'already_terminal' });
|
|
263
325
|
}
|
|
264
326
|
else {
|
|
265
327
|
// Surface the real error (name/message/stack) so an unexpected cancel
|
|
@@ -271,6 +333,33 @@ function registerJobsRoutes(deps) {
|
|
|
271
333
|
}
|
|
272
334
|
}
|
|
273
335
|
});
|
|
336
|
+
// Explicit history deletion. Active work must be canceled through the
|
|
337
|
+
// idempotent endpoint above and can only be deleted after it is terminal.
|
|
338
|
+
router.delete('/:projectId/jobs/:id', (req, res) => {
|
|
339
|
+
const id = req.params.id;
|
|
340
|
+
const c = ctx(req);
|
|
341
|
+
const job = (0, db_1.getJob)(c.db, id);
|
|
342
|
+
if (!job) {
|
|
343
|
+
res.status(404).json({ error: 'Job not found' });
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
if (job.status === 'running' || job.status === 'queued') {
|
|
347
|
+
res.status(409).json({ error: 'Active jobs must be canceled before deletion' });
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
try {
|
|
351
|
+
(0, db_1.deleteJob)(c.db, id);
|
|
352
|
+
res.json({ ok: true, status: 'deleted' });
|
|
353
|
+
}
|
|
354
|
+
catch (err) {
|
|
355
|
+
if (err instanceof db_1.JobRecoveryPendingError) {
|
|
356
|
+
res.status(409).json({ error: err.message, code: 'job_recovery_pending' });
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
console.error(`[jobs] delete ${id} failed:`, err);
|
|
360
|
+
res.status(500).json({ error: 'Failed to delete job' });
|
|
361
|
+
}
|
|
362
|
+
});
|
|
274
363
|
// ─── Interactive jobs (manager-agnostic) ───────────────────────────────────
|
|
275
364
|
// Send one more user prompt to a running interactive job (queued behind the
|
|
276
365
|
// active turn — see InteractiveJobSession). The job row may be owned by
|
|
@@ -374,46 +463,12 @@ function registerJobsRoutes(deps) {
|
|
|
374
463
|
// Clamp to [1, 200] (H-11): a negative limit is LIMIT -1 in SQLite, which
|
|
375
464
|
// means UNLIMITED — without the lower bound `?limit=-1` dumps the whole table.
|
|
376
465
|
const limit = Math.max(1, Math.min(parseInt(String(req.query.limit ?? '50'), 10) || 50, 200));
|
|
377
|
-
const offset = parseInt(String(req.query.offset ?? '0'), 10) || 0;
|
|
466
|
+
const offset = Math.max(0, parseInt(String(req.query.offset ?? '0'), 10) || 0);
|
|
378
467
|
const status = req.query.status;
|
|
379
468
|
const from = req.query.from;
|
|
380
469
|
const to = req.query.to;
|
|
381
470
|
const { db } = ctx(req);
|
|
382
|
-
const result = (0,
|
|
383
|
-
// Merge in-memory queued jobs that haven't been persisted to DB yet
|
|
384
|
-
const { queueManager } = ctx(req);
|
|
385
|
-
const dbIds = new Set(result.jobs.map((j) => j.id));
|
|
386
|
-
const queuedRows = queueManager
|
|
387
|
-
.getJobs()
|
|
388
|
-
.filter((j) => j.status === 'queued' && !dbIds.has(j.id))
|
|
389
|
-
.filter((j) => !status || j.status === status)
|
|
390
|
-
.map((j) => ({
|
|
391
|
-
id: j.id,
|
|
392
|
-
command: j.command,
|
|
393
|
-
started_at: j.startedAt ?? new Date().toISOString(),
|
|
394
|
-
finished_at: j.finishedAt,
|
|
395
|
-
status: j.status,
|
|
396
|
-
exit_code: j.exitCode,
|
|
397
|
-
queue_position: j.queuePosition,
|
|
398
|
-
priority: j.priority,
|
|
399
|
-
tokens_in: null,
|
|
400
|
-
tokens_out: null,
|
|
401
|
-
tokens_cache_read: null,
|
|
402
|
-
tokens_cache_create: null,
|
|
403
|
-
total_cost_usd: null,
|
|
404
|
-
num_turns: null,
|
|
405
|
-
model: null,
|
|
406
|
-
duration_ms: null,
|
|
407
|
-
duration_api_ms: null,
|
|
408
|
-
session_id: null,
|
|
409
|
-
depends_on_job_id: j.dependsOnJobId,
|
|
410
|
-
pipeline_id: j.pipelineId,
|
|
411
|
-
skip_reason: j.skipReason,
|
|
412
|
-
}));
|
|
413
|
-
if (queuedRows.length > 0) {
|
|
414
|
-
result.jobs = [...queuedRows, ...result.jobs];
|
|
415
|
-
result.total += queuedRows.length;
|
|
416
|
-
}
|
|
471
|
+
const result = (0, job_listing_1.listUnifiedJobs)(db, { limit, offset, status, from, to });
|
|
417
472
|
// Annotate each job with hasTelemetry so the client can show the
|
|
418
473
|
// Export diagnostic button without an extra round trip.
|
|
419
474
|
const jobsWithTelemetry = (0, db_1.getJobsWithTelemetry)(db);
|
|
@@ -518,19 +573,20 @@ function registerJobsRoutes(deps) {
|
|
|
518
573
|
const jobId = req.params.id;
|
|
519
574
|
const job = (0, db_1.getJob)(db, jobId);
|
|
520
575
|
if (!job) {
|
|
521
|
-
// Queued jobs
|
|
522
|
-
//
|
|
523
|
-
//
|
|
524
|
-
|
|
576
|
+
// Queued jobs have a durable admission timestamp but no execution start.
|
|
577
|
+
// Prefer SQLite so repeated detail reads return the same enqueued_at;
|
|
578
|
+
// retain the in-memory fallback only for non-project/test managers.
|
|
579
|
+
const durableQueued = (0, job_listing_1.getQueuedJobForListing)(db, jobId);
|
|
525
580
|
const inMemory = queueManager.getJobs().find((j) => j.id === jobId);
|
|
526
|
-
if (!inMemory) {
|
|
581
|
+
if (!durableQueued && !inMemory) {
|
|
527
582
|
res.status(404).json({ error: 'Job not found' });
|
|
528
583
|
return;
|
|
529
584
|
}
|
|
530
|
-
const synthetic = {
|
|
585
|
+
const synthetic = durableQueued ?? {
|
|
531
586
|
id: inMemory.id,
|
|
532
587
|
command: inMemory.command,
|
|
533
|
-
started_at:
|
|
588
|
+
started_at: null,
|
|
589
|
+
enqueued_at: null,
|
|
534
590
|
finished_at: inMemory.finishedAt,
|
|
535
591
|
status: inMemory.status,
|
|
536
592
|
exit_code: inMemory.exitCode,
|
|
@@ -57,6 +57,7 @@ const ticket_store_1 = require("./ticket-store");
|
|
|
57
57
|
const explore_draft_title_1 = require("./explore-draft-title");
|
|
58
58
|
const cli_prompt_1 = require("./util/cli-prompt");
|
|
59
59
|
const transient_children_1 = require("./transient-children");
|
|
60
|
+
const process_admission_1 = require("./process-admission");
|
|
60
61
|
const readline_1 = require("readline");
|
|
61
62
|
const tree_kill_1 = __importDefault(require("tree-kill"));
|
|
62
63
|
const workspace_resolution_1 = require("./workspace-resolution");
|
|
@@ -176,6 +177,7 @@ function registerTicketsRoutes(deps) {
|
|
|
176
177
|
}
|
|
177
178
|
const requestId = (0, ids_1.newId)();
|
|
178
179
|
const projectId = project.id;
|
|
180
|
+
const admission = (0, process_admission_1.captureProcessAdmission)(projectId);
|
|
179
181
|
const filePath = ticketPath(req);
|
|
180
182
|
let hasAttachments = false;
|
|
181
183
|
let baseUserPrompt = `Generate a spec for the following idea:\n\n${idea.trim()}`;
|
|
@@ -193,6 +195,10 @@ function registerTicketsRoutes(deps) {
|
|
|
193
195
|
console.error('[project-router] generate-spec attachment extraction error:', err);
|
|
194
196
|
}
|
|
195
197
|
}
|
|
198
|
+
if (!admission.isCurrent()) {
|
|
199
|
+
res.status(409).json({ error: 'Project is being removed' });
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
196
202
|
// Parse contextScope from body. Quick and Explore share the same Context
|
|
197
203
|
// Awareness controls; Quick still keeps Contract Refine as a top-level
|
|
198
204
|
// field for the refine scheduler.
|
|
@@ -325,6 +331,8 @@ function registerTicketsRoutes(deps) {
|
|
|
325
331
|
}
|
|
326
332
|
catch { /* best-effort */ }
|
|
327
333
|
}
|
|
334
|
+
if (!admission.isCurrent())
|
|
335
|
+
return;
|
|
328
336
|
broadcast({
|
|
329
337
|
type: 'spec_gen_error', projectId, requestId,
|
|
330
338
|
error: `Spec generation timed out after ${Math.round(GENERATE_SPEC_TIMEOUT_MS / 1000)}s`,
|
|
@@ -355,6 +363,8 @@ function registerTicketsRoutes(deps) {
|
|
|
355
363
|
child.on('error', (err) => {
|
|
356
364
|
clearSpecGenWatchdog();
|
|
357
365
|
console.error(`[project-router] spec-gen spawn failed (${binary}): ${err.message}`);
|
|
366
|
+
if (!admission.isCurrent())
|
|
367
|
+
return;
|
|
358
368
|
const errMsg = {
|
|
359
369
|
type: 'spec_gen_error', projectId, requestId,
|
|
360
370
|
error: `Failed to launch ${binary}: ${err.message}`,
|
|
@@ -374,6 +384,8 @@ function registerTicketsRoutes(deps) {
|
|
|
374
384
|
const turnStartedAt = new Date().toISOString();
|
|
375
385
|
const stdoutReader = (0, readline_1.createInterface)({ input: child.stdout, crlfDelay: Infinity });
|
|
376
386
|
stdoutReader.on('line', (line) => {
|
|
387
|
+
if (!admission.isCurrent())
|
|
388
|
+
return;
|
|
377
389
|
const adapterEv = adapter.parseStreamLine(line);
|
|
378
390
|
if (adapterEv)
|
|
379
391
|
adapterEvents.push(adapterEv);
|
|
@@ -454,6 +466,8 @@ function registerTicketsRoutes(deps) {
|
|
|
454
466
|
});
|
|
455
467
|
child.on('close', async (code) => {
|
|
456
468
|
clearSpecGenWatchdog();
|
|
469
|
+
if (!admission.isCurrent())
|
|
470
|
+
return;
|
|
457
471
|
let createdTicketId = null;
|
|
458
472
|
// When claude burns its whole --max-turns budget it exits non-zero with
|
|
459
473
|
// a result event of subtype:error_max_turns — but it may already have
|
|
@@ -539,6 +553,8 @@ function registerTicketsRoutes(deps) {
|
|
|
539
553
|
catch (err) {
|
|
540
554
|
console.error('[project-router] generate-spec attachment migration error:', err);
|
|
541
555
|
}
|
|
556
|
+
if (!admission.isCurrent())
|
|
557
|
+
return;
|
|
542
558
|
}
|
|
543
559
|
const ticketMsg = {
|
|
544
560
|
type: 'ticket_created', ticket: created,
|
|
@@ -566,6 +582,8 @@ function registerTicketsRoutes(deps) {
|
|
|
566
582
|
const refineDescription = created.description;
|
|
567
583
|
const refineModel = req.body?.model ?? null;
|
|
568
584
|
process.nextTick(() => {
|
|
585
|
+
if (!admission.isCurrent())
|
|
586
|
+
return;
|
|
569
587
|
void (0, contract_refine_runner_1.runContractRefineForQuick)({
|
|
570
588
|
db: ctx(req).db,
|
|
571
589
|
projectId: project.id,
|
|
@@ -1576,6 +1594,7 @@ function registerTicketsRoutes(deps) {
|
|
|
1576
1594
|
const adapter = (0, providers_1.getAdapter)(provider);
|
|
1577
1595
|
const requestId = (0, ids_1.newId)();
|
|
1578
1596
|
const projectId = project.id;
|
|
1597
|
+
const admission = (0, process_admission_1.captureProcessAdmission)(projectId);
|
|
1579
1598
|
// Model used for the spawn (claude runs its CLI default, codex is pinned to
|
|
1580
1599
|
// gpt-5.5, other providers use the adapter default). Used only as the
|
|
1581
1600
|
// fallback model for cost accounting when the stream carries none.
|
|
@@ -1594,7 +1613,7 @@ function registerTicketsRoutes(deps) {
|
|
|
1594
1613
|
`- The SHORT-SUMMARY line MUST always be present. If the user's refinement does not change what the spec is about, keep the previous summary verbatim. Never omit the line.\n` +
|
|
1595
1614
|
`- After the SHORT-SUMMARY line and blank line, output ONLY the modified description in markdown. No preamble, no explanation, no wrapping.\n` +
|
|
1596
1615
|
`- Preserve the existing markdown structure and section headings in the description.\n` +
|
|
1597
|
-
`- If the user asks to add technical details, briefly check CLAUDE.md and the project directory structure
|
|
1616
|
+
`- If the user asks to add technical details, briefly check CLAUDE.md and the project directory structure with Read, Grep, or Glob (not deep reads) to ground your edits.\n` +
|
|
1598
1617
|
`- Keep it concise and actionable.\n` +
|
|
1599
1618
|
`- Do NOT create files, tickets, or issues. Only output text.`;
|
|
1600
1619
|
const refinementRule = isRefinement
|
|
@@ -1629,6 +1648,10 @@ function registerTicketsRoutes(deps) {
|
|
|
1629
1648
|
console.error('[project-router] ai-edit attachment extraction error:', err);
|
|
1630
1649
|
}
|
|
1631
1650
|
}
|
|
1651
|
+
if (!admission.isCurrent()) {
|
|
1652
|
+
res.status(409).json({ error: 'Project is being removed' });
|
|
1653
|
+
return;
|
|
1654
|
+
}
|
|
1632
1655
|
let binary;
|
|
1633
1656
|
let args;
|
|
1634
1657
|
if (provider === 'codex') {
|
|
@@ -1640,7 +1663,9 @@ function registerTicketsRoutes(deps) {
|
|
|
1640
1663
|
binary = 'claude';
|
|
1641
1664
|
args = [
|
|
1642
1665
|
'--dangerously-skip-permissions',
|
|
1643
|
-
|
|
1666
|
+
// AI Edit may ground prose in the repo, but it never needs shell,
|
|
1667
|
+
// network, MCP, or filesystem mutation authority.
|
|
1668
|
+
'--tools', 'Read,Grep,Glob',
|
|
1644
1669
|
'--output-format', 'stream-json',
|
|
1645
1670
|
'--verbose',
|
|
1646
1671
|
'--max-turns', '4',
|
|
@@ -1667,6 +1692,7 @@ function registerTicketsRoutes(deps) {
|
|
|
1667
1692
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
1668
1693
|
cwd: project.path,
|
|
1669
1694
|
});
|
|
1695
|
+
(0, transient_children_1.trackTransientChild)(projectId, child);
|
|
1670
1696
|
_aiEditProcesses.set(requestId, child);
|
|
1671
1697
|
// Pipe stderr to server log so failures surface for debugging.
|
|
1672
1698
|
let aiEditStderrBuf = '';
|
|
@@ -1683,6 +1709,8 @@ function registerTicketsRoutes(deps) {
|
|
|
1683
1709
|
child.on('error', (err) => {
|
|
1684
1710
|
console.error(`[project-router] ai-edit spawn failed (${binary}): ${err.message}`);
|
|
1685
1711
|
_aiEditProcesses.delete(requestId);
|
|
1712
|
+
if (!admission.isCurrent())
|
|
1713
|
+
return;
|
|
1686
1714
|
const errMsg = {
|
|
1687
1715
|
type: 'ticket_ai_edit_error', projectId, ticketId: Number(ticketId),
|
|
1688
1716
|
requestId, error: `Failed to launch ${binary}: ${err.message}`,
|
|
@@ -1755,6 +1783,8 @@ function registerTicketsRoutes(deps) {
|
|
|
1755
1783
|
});
|
|
1756
1784
|
child.on('close', (code) => {
|
|
1757
1785
|
_aiEditProcesses.delete(requestId);
|
|
1786
|
+
if (!admission.isCurrent())
|
|
1787
|
+
return;
|
|
1758
1788
|
const delivered = code === 0 && buffer.trim().length > 0;
|
|
1759
1789
|
if (delivered) {
|
|
1760
1790
|
const msg = {
|
|
@@ -42,17 +42,8 @@ function normaliseModel(model) {
|
|
|
42
42
|
return model || 'sonnet';
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
|
-
/** Default arg block every claude spawn shares. `--setting-sources` is appended
|
|
46
|
-
* separately per-spawn (see `commonFlagsFor`) because its value depends on
|
|
47
|
-
* whether the caller opted into loading the user's full Claude environment. */
|
|
48
|
-
const COMMON_FLAGS = [
|
|
49
|
-
'--dangerously-skip-permissions',
|
|
50
|
-
'--tools', 'default',
|
|
51
|
-
'--output-format', 'stream-json',
|
|
52
|
-
'--verbose',
|
|
53
|
-
];
|
|
54
45
|
/**
|
|
55
|
-
*
|
|
46
|
+
* Common flags + the effective tool boundary for this spawn.
|
|
56
47
|
*
|
|
57
48
|
* Default (`project,local`) isolates app-spawned claude from the *user's*
|
|
58
49
|
* global Claude config. Without this, the child loads ~/.claude (user CLAUDE.md
|
|
@@ -68,8 +59,23 @@ const COMMON_FLAGS = [
|
|
|
68
59
|
* CLAUDE.md + hooks, which is the user's explicit opt-in via the toggle.
|
|
69
60
|
*/
|
|
70
61
|
function commonFlagsFor(opts) {
|
|
62
|
+
const toolPolicy = opts.toolPolicy ?? 'default';
|
|
63
|
+
const toolArgs = toolPolicy === 'none'
|
|
64
|
+
// Claude silently drops an empty tool list on some versions and falls back
|
|
65
|
+
// to the default toolkit. A non-existent sentinel is the established,
|
|
66
|
+
// tested way this repo disables every tool (see context-scope.ts).
|
|
67
|
+
? ['--tools', '__none__']
|
|
68
|
+
: toolPolicy === 'read-only'
|
|
69
|
+
? ['--tools', 'Read,Grep,Glob']
|
|
70
|
+
: ['--tools', 'default'];
|
|
71
71
|
return [
|
|
72
|
-
|
|
72
|
+
// No approval bypass is necessary when no tool can be invoked. Keeping it
|
|
73
|
+
// off also makes the pure-output boundary fail closed if Claude ever
|
|
74
|
+
// changes how it interprets the sentinel.
|
|
75
|
+
...(toolPolicy === 'none' ? [] : ['--dangerously-skip-permissions']),
|
|
76
|
+
...toolArgs,
|
|
77
|
+
'--output-format', 'stream-json',
|
|
78
|
+
'--verbose',
|
|
73
79
|
'--setting-sources',
|
|
74
80
|
opts.loadUserEnv ? 'user,project,local' : 'project,local',
|
|
75
81
|
// Native reasoning-effort flag (claude CLI accepts low|medium|high|xhigh|max).
|
|
@@ -80,7 +86,9 @@ function commonFlagsFor(opts) {
|
|
|
80
86
|
function buildClaudeArgs(action, opts) {
|
|
81
87
|
const args = [];
|
|
82
88
|
const model = normaliseModel(opts.model);
|
|
83
|
-
|
|
89
|
+
// Titles are unconditionally pure-output. Centralising the policy here keeps
|
|
90
|
+
// both ChatManager and AgentChatManager from accidentally regaining tools.
|
|
91
|
+
const commonFlags = commonFlagsFor(action === 'auto-title' ? { ...opts, toolPolicy: 'none' } : opts);
|
|
84
92
|
switch (action) {
|
|
85
93
|
case 'chat-turn': {
|
|
86
94
|
args.push('--model', model);
|
|
@@ -151,7 +159,7 @@ function buildClaudeArgs(action, opts) {
|
|
|
151
159
|
if (opts.maxTurns != null)
|
|
152
160
|
args.push('--max-turns', String(opts.maxTurns));
|
|
153
161
|
// Caller passes --tools override via extraArgs when scoped; otherwise
|
|
154
|
-
//
|
|
162
|
+
// the default policy from commonFlagsFor applies.
|
|
155
163
|
if (opts.systemPrompt)
|
|
156
164
|
args.push('--system-prompt', opts.systemPrompt);
|
|
157
165
|
args.push('-p', opts.prompt);
|