specrails-desktop 2.29.1 → 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-CgpP6tKI.js → dist-js-CcBCbb32.js} +1 -1
- package/client/dist/assets/{dist-js-DHiN-A_E.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/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 +1137 -290
- package/server/dist/rail-isolation.js +4 -2
- package/server/dist/rail-pr-decision.js +740 -266
- 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 +18 -2
- package/server/dist/rails-router.js +149 -119
- 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 +6 -5
- package/client/dist/assets/ActivityFeedPage-D8RKRRoM.js +0 -1
- package/client/dist/assets/AgentBrowserCapture-BUHPHNSN.js +0 -1
- package/client/dist/assets/AgentModeCodePane-GZc8bNGT.js +0 -2
- package/client/dist/assets/AgentModeJobsPane-DWtQqj3k.js +0 -1
- package/client/dist/assets/AgentsPage-CKPtHkRP.js +0 -86
- package/client/dist/assets/AnalyticsPage-CZW8c77k.js +0 -1
- package/client/dist/assets/BarChart-DugEoe2q.js +0 -33
- package/client/dist/assets/CodePage-CQ-uKETG.js +0 -2
- package/client/dist/assets/DesktopAnalyticsPage-Bgo4SyCH.js +0 -1
- package/client/dist/assets/DocsDialog-DxpWw_La.js +0 -11
- package/client/dist/assets/DocsPage-CmcOkK19.js +0 -11
- package/client/dist/assets/ExportDropdown-DvTS2wc7.js +0 -1
- package/client/dist/assets/IntegrationsPage-B72WxJ3Z.js +0 -1
- package/client/dist/assets/InteractiveJobComposer-B5gh4Qoy.js +0 -19
- package/client/dist/assets/JobDetailModal-D-BeqsJ6.js +0 -1
- package/client/dist/assets/JobDetailPage-DwdozwLO.js +0 -1
- package/client/dist/assets/JobsPage-BDkinklt.js +0 -1
- package/client/dist/assets/LoopBuilderPage-CclJ3VZA.js +0 -7
- package/client/dist/assets/LoopPreviewModal-Dw4UgoLu.js +0 -1
- package/client/dist/assets/LoopsPage-D7ac4M24.js +0 -1
- package/client/dist/assets/PluginsPage-wdC-qa40.js +0 -2
- package/client/dist/assets/ProjectSettingsDialog-BlTlRtGI.js +0 -1
- package/client/dist/assets/TemplatePreviewModal-CeMx2Red.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-B8BXmlUQ2.js +0 -1
- package/client/dist/assets/agent-BEXYxDbs.js +0 -1
- package/client/dist/assets/agent-BYc3-6Ln2.js +0 -1
- package/client/dist/assets/agent-BbJorPdT.js +0 -1
- package/client/dist/assets/agent-CewFImgL.js +0 -1
- package/client/dist/assets/agent-DfhYoUmp.js +0 -1
- package/client/dist/assets/agent-TK_rrK4d.js +0 -1
- package/client/dist/assets/agent-bHjA9R_j2.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-C92rjjYP.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-BM3LFLCE2.js +0 -1
- package/client/dist/assets/common-Bwafujnc2.js +0 -1
- package/client/dist/assets/common-C-vU-j-I.js +0 -1
- package/client/dist/assets/common-C5HKSbbz.js +0 -1
- package/client/dist/assets/common-DXrmj6WD.js +0 -1
- package/client/dist/assets/common-DhWTkocg.js +0 -1
- package/client/dist/assets/common-DiPTT7V_2.js +0 -1
- package/client/dist/assets/common-DmqBPwZG.js +0 -1
- package/client/dist/assets/dashboard-B5ang-ZS.js +0 -1
- package/client/dist/assets/dashboard-CHHcOWVL2.js +0 -1
- package/client/dist/assets/dashboard-DBD4wPGY2.js +0 -1
- package/client/dist/assets/dashboard-DBuLfWo9.js +0 -1
- package/client/dist/assets/dashboard-DSnztwWH.js +0 -1
- package/client/dist/assets/dashboard-D_aP_InU.js +0 -1
- package/client/dist/assets/dashboard-DmBcdl1B.js +0 -1
- package/client/dist/assets/dashboard-RIcUKY1Y2.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-DyY1QyIn.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-1GV2-4zd2.js +0 -1
- package/client/dist/assets/jobs-26F9gGcE.js +0 -1
- package/client/dist/assets/jobs-BgQzB0Sx2.js +0 -1
- package/client/dist/assets/jobs-BqWui9_f.js +0 -1
- package/client/dist/assets/jobs-CE8qeIYj.js +0 -1
- package/client/dist/assets/jobs-DrYmsKy5.js +0 -1
- package/client/dist/assets/jobs-DzeuASRf.js +0 -1
- package/client/dist/assets/jobs-Wh7dn28q2.js +0 -1
- package/client/dist/assets/json.worker-DzV-CpCQ.js +0 -58
- package/client/dist/assets/lib-0PFDyMxJ.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-cJNynGIZ.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-B7zT4IRf.js +0 -1
- package/client/dist/assets/tickets-BHv3ewvq.js +0 -1
- package/client/dist/assets/tickets-BoXom7l8.js +0 -1
- package/client/dist/assets/tickets-C3b8cHhd2.js +0 -1
- package/client/dist/assets/tickets-CFXnJsYF.js +0 -1
- package/client/dist/assets/tickets-CWYFvx1W2.js +0 -1
- package/client/dist/assets/tickets-DTHo9c3C.js +0 -1
- package/client/dist/assets/tickets-SuX_HkK4.js +0 -1
- package/client/dist/assets/upload-CmR4h9H1.js +0 -1
- package/client/dist/assets/value-JA3bf47v.js +0 -1
- /package/client/dist/assets/{abap-D0E4FfVW.js → abap-08VXUWAP.js} +0 -0
- /package/client/dist/assets/{activity--iN4Ad2R2.js → activity-B-rp4h_v.js} +0 -0
- /package/client/dist/assets/{activity-6hM_ZSg9.js → activity-C6kJpm9q2.js} +0 -0
- /package/client/dist/assets/{activity-CIOLxGvh.js → activity-CGx4kb_j.js} +0 -0
- /package/client/dist/assets/{activity-BZNfOdiS.js → activity-CnoX2bH7.js} +0 -0
- /package/client/dist/assets/{activity-BuVo5sPB.js → activity-DAyekdlt2.js} +0 -0
- /package/client/dist/assets/{activity-D2r2h3SE2.js → activity-DCxtpT7j.js} +0 -0
- /package/client/dist/assets/{activity-DtxrAUMo2.js → activity-JzwRaWPD.js} +0 -0
- /package/client/dist/assets/{addspec-BMtLZLW62.js → addspec-BXjvkh5q.js} +0 -0
- /package/client/dist/assets/{addspec-CRuvWn8d.js → addspec-C4bwrmpi.js} +0 -0
- /package/client/dist/assets/{addspec-D-JLDsUV.js → addspec-CArHXUDM.js} +0 -0
- /package/client/dist/assets/{addspec-mgPOt5q02.js → addspec-DTKJcXiR.js} +0 -0
- /package/client/dist/assets/{addspec-DfhDbg5c.js → addspec-DbNBbrha2.js} +0 -0
- /package/client/dist/assets/{addspec-CP0HRuxY.js → addspec-htHGZHOe2.js} +0 -0
- /package/client/dist/assets/{addspec-bsNDdqRm2.js → addspec-lr_LP6jk.js} +0 -0
- /package/client/dist/assets/{agents-78bTZGZh.js → agents-6ZOJXWVk2.js} +0 -0
- /package/client/dist/assets/{agents-DDtCJ5M02.js → agents-BZ0XQKjg.js} +0 -0
- /package/client/dist/assets/{agents-CWo-KyAB.js → agents-BqWklnHR.js} +0 -0
- /package/client/dist/assets/{agents-BUdEi3-N.js → agents-Bz-thHkB2.js} +0 -0
- /package/client/dist/assets/{agents-bvyRLczL.js → agents-CJclElx6.js} +0 -0
- /package/client/dist/assets/{agents-BpoUaoW92.js → agents-D_l9L0VA.js} +0 -0
- /package/client/dist/assets/{agents-BLhWCmDS2.js → agents-u_C0jPB5.js} +0 -0
- /package/client/dist/assets/{agentstudio-BMQxc_bz.js → agentstudio-BF19hbXj.js} +0 -0
- /package/client/dist/assets/{agentstudio-C_Jq8Tl4.js → agentstudio-BLGvxWBx2.js} +0 -0
- /package/client/dist/assets/{agentstudio-Dtq3dGYk.js → agentstudio-D9UKiWTj2.js} +0 -0
- /package/client/dist/assets/{agentstudio-CWgXG5W52.js → agentstudio-Drs37nIM.js} +0 -0
- /package/client/dist/assets/{agentstudio-sI27TpBu2.js → agentstudio-nEnKkcXM.js} +0 -0
- /package/client/dist/assets/{agentstudio-jKMTdT70.js → agentstudio-pyFcSBKy.js} +0 -0
- /package/client/dist/assets/{agentstudio-COZriimI2.js → agentstudio-zfTzQh3U.js} +0 -0
- /package/client/dist/assets/{aiedit-hknZlly82.js → aiedit-B0KUbpB6.js} +0 -0
- /package/client/dist/assets/{aiedit-eMN4eQPF.js → aiedit-BoG24nlg2.js} +0 -0
- /package/client/dist/assets/{aiedit-pc5JDUq1.js → aiedit-CjlSRQVP.js} +0 -0
- /package/client/dist/assets/{aiedit-B03pD_Na.js → aiedit-DCjA7jLJ.js} +0 -0
- /package/client/dist/assets/{aiedit-6CHdb_iv2.js → aiedit-DNXxq_Dr.js} +0 -0
- /package/client/dist/assets/{aiedit-igmw-ZoZ2.js → aiedit-DQ-0_pvE.js} +0 -0
- /package/client/dist/assets/{aiedit-BtRqRxML.js → aiedit-olnv3QSt2.js} +0 -0
- /package/client/dist/assets/{analytics-CCprAqk3.js → analytics-BC7mwR4s.js} +0 -0
- /package/client/dist/assets/{analytics-CR1TJqUi2.js → analytics-BiNg8edP.js} +0 -0
- /package/client/dist/assets/{analytics-Bj-SmKHa.js → analytics-C0s_T2GN.js} +0 -0
- /package/client/dist/assets/{analytics-C5dpiS0o.js → analytics-CdsAPAwZ2.js} +0 -0
- /package/client/dist/assets/{analytics-BWMUZ2Pq2.js → analytics-Cr1_q-lC.js} +0 -0
- /package/client/dist/assets/{analytics-DfNdXR0y2.js → analytics-IEsKZvpW2.js} +0 -0
- /package/client/dist/assets/{analytics-rmHuJv0V.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-BgBNSqQd.js → attachments-D0wXXt9T2.js} +0 -0
- /package/client/dist/assets/{attachments-C9GTTJsx2.js → attachments-DenIjuVI.js} +0 -0
- /package/client/dist/assets/{attachments-BjyMmrwE.js → attachments-DhO7LPfy.js} +0 -0
- /package/client/dist/assets/{attachments-DPCmkFZu2.js → attachments-DoH5w0x4.js} +0 -0
- /package/client/dist/assets/{attachments-DCZOL1RU.js → attachments-Q9yNtiEM.js} +0 -0
- /package/client/dist/assets/{attachments-rNn1ekRy2.js → attachments-V_WZAYXx2.js} +0 -0
- /package/client/dist/assets/{attachments-DL-bPy9E.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-BPkhILSJ.js → browser-C25DkQiO.js} +0 -0
- /package/client/dist/assets/{browser-BqLqJVVT.js → browser-CiJ7-L32.js} +0 -0
- /package/client/dist/assets/{browser-rWKj-RR_2.js → browser-CvgDySd9.js} +0 -0
- /package/client/dist/assets/{browser-Cvg-QHvd2.js → browser-CyR1Kp3m2.js} +0 -0
- /package/client/dist/assets/{browser-FRv8P02E.js → browser-DwZljcRh2.js} +0 -0
- /package/client/dist/assets/{browser-Cc0iDqUi.js → browser-DxP-alBK.js} +0 -0
- /package/client/dist/assets/{browser-BijVYG0Y2.js → browser-rRCwi7Y7.js} +0 -0
- /package/client/dist/assets/{cameligo-6R45j6Ph.js → cameligo-DMUM7wLl.js} +0 -0
- /package/client/dist/assets/{chat-Bom6bqK3.js → chat-2rIB8HhT.js} +0 -0
- /package/client/dist/assets/{chat-vylxqR0P2.js → chat-BR8oe53x2.js} +0 -0
- /package/client/dist/assets/{chat-Dnwg-NpQ.js → chat-Bua03tty.js} +0 -0
- /package/client/dist/assets/{chat-BgL3zv6x2.js → chat-CZpAQan1.js} +0 -0
- /package/client/dist/assets/{chat-DsbwJhus.js → chat-CdY5SGvS.js} +0 -0
- /package/client/dist/assets/{chat-Bh3NdgJs.js → chat-DZyu3ImY2.js} +0 -0
- /package/client/dist/assets/{chat-DdwZjT8K2.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-UPVvmAKM2.js → code-76gS0IdL.js} +0 -0
- /package/client/dist/assets/{code-BRcDlze52.js → code-C1VwxlML.js} +0 -0
- /package/client/dist/assets/{code-CeQ0FZpC.js → code-CnMZyJpr.js} +0 -0
- /package/client/dist/assets/{code-DgeHz9CB.js → code-D20ef9Cf2.js} +0 -0
- /package/client/dist/assets/{code-DzC1rMk12.js → code-DdOXaWRY.js} +0 -0
- /package/client/dist/assets/{code-CwnBPPyA.js → code-Duohuf9l.js} +0 -0
- /package/client/dist/assets/{code-BdMy3Ffq.js → code-geHmknB92.js} +0 -0
- /package/client/dist/assets/{coffee-AruSygo-.js → coffee-Ba7i2nA0.js} +0 -0
- /package/client/dist/assets/{commands-DkU0qliq.js → commands-B9RZO4qS.js} +0 -0
- /package/client/dist/assets/{commands-u-4eEHCN.js → commands-BEwbAjtD2.js} +0 -0
- /package/client/dist/assets/{commands-JWMfGDmr.js → commands-Bbxu8kLU.js} +0 -0
- /package/client/dist/assets/{commands-C4Y3C-PF2.js → commands-CDU3qv68.js} +0 -0
- /package/client/dist/assets/{commands-xHDDGfcP2.js → commands-CzezgtQj.js} +0 -0
- /package/client/dist/assets/{commands-CSDs9q_2.js → commands-DTQBF_q52.js} +0 -0
- /package/client/dist/assets/{commands-RHOchN4n2.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-B7fblXBb2.js → explore-BG99VGpL.js} +0 -0
- /package/client/dist/assets/{explore-CNBzrEPS.js → explore-C0TjprJW2.js} +0 -0
- /package/client/dist/assets/{explore-C0k8HrkN.js → explore-C2dgEo7q.js} +0 -0
- /package/client/dist/assets/{explore-BHtEpoNN2.js → explore-C8NDHbob.js} +0 -0
- /package/client/dist/assets/{explore-Dahc1lOx.js → explore-CWWgzQGR.js} +0 -0
- /package/client/dist/assets/{explore-D_mWBYCS2.js → explore-CcQXpdtS.js} +0 -0
- /package/client/dist/assets/{explore-UvW1jEMa.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-CuWuRvka.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-TAcYNh0b.js → integrations-CH0zy1Mw2.js} +0 -0
- /package/client/dist/assets/{integrations-C1ThkTC52.js → integrations-CIAjhd7L.js} +0 -0
- /package/client/dist/assets/{integrations-2YcNyAl3.js → integrations-CZdwOe8A.js} +0 -0
- /package/client/dist/assets/{integrations-BXCvXUlG2.js → integrations-Ct7omMld.js} +0 -0
- /package/client/dist/assets/{integrations-Crk2rFhL2.js → integrations-D6MSxy3-.js} +0 -0
- /package/client/dist/assets/{integrations-Dn4JiGtW.js → integrations-DbZa-Zyc.js} +0 -0
- /package/client/dist/assets/{integrations-D9YrJ_Ep.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-D5efgwp_.js → jira-BySfUuQZ.js} +0 -0
- /package/client/dist/assets/{jira-bDs7Im2C.js → jira-Byw2C0F8.js} +0 -0
- /package/client/dist/assets/{jira-BHAKtc4B.js → jira-CNeYi06w2.js} +0 -0
- /package/client/dist/assets/{jira-Be369RIR2.js → jira-D11gPhxz.js} +0 -0
- /package/client/dist/assets/{jira-CPpgA-5z2.js → jira-D38Gj7AT.js} +0 -0
- /package/client/dist/assets/{jira-uNH1gETL2.js → jira-gAvOyije.js} +0 -0
- /package/client/dist/assets/{jira-DS7ownDy.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-LIgO_-eM.js → loops-CPpgMapU.js} +0 -0
- /package/client/dist/assets/{loops-DJNhp17p2.js → loops-CWWbKuVL.js} +0 -0
- /package/client/dist/assets/{loops-D6D3XHjj.js → loops-Crc9It8o2.js} +0 -0
- /package/client/dist/assets/{loops-CvOWsi5r.js → loops-DH2hZcbK2.js} +0 -0
- /package/client/dist/assets/{loops-vhJdbcz92.js → loops-DS5TmvIU2.js} +0 -0
- /package/client/dist/assets/{loops-K5_HXfJa.js → loops-P2f0cN8-.js} +0 -0
- /package/client/dist/assets/{loops-BvqQ-bHR2.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-Dcl-XxkR.js → mcp-Czd_iyp02.js} +0 -0
- /package/client/dist/assets/{mcp-XJNRfxVp2.js → mcp-D2pc5GGx.js} +0 -0
- /package/client/dist/assets/{mcp-sRmWE8WJ.js → mcp-D4ZjtIx32.js} +0 -0
- /package/client/dist/assets/{mcp-DtbxuH3V2.js → mcp-DIfBUv2D2.js} +0 -0
- /package/client/dist/assets/{mcp-H-gnQUdN.js → mcp-DsTwmjST.js} +0 -0
- /package/client/dist/assets/{mcp-N1nzp8oL.js → mcp-SMkn8boG.js} +0 -0
- /package/client/dist/assets/{mcp-CjVKXAhD2.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-BElxljIF2.js → nav-BRJBxaGt2.js} +0 -0
- /package/client/dist/assets/{nav-COu2E_-L.js → nav-CAGKv3_F.js} +0 -0
- /package/client/dist/assets/{nav-BXO7PJJG2.js → nav-CNskRJKQ2.js} +0 -0
- /package/client/dist/assets/{nav-CW9pxWfC2.js → nav-DY93irBL.js} +0 -0
- /package/client/dist/assets/{nav-CXHUA4uf.js → nav-DhjvYgqt.js} +0 -0
- /package/client/dist/assets/{nav-DdHF5VWJ.js → nav-Gb-r4wop.js} +0 -0
- /package/client/dist/assets/{nav-C8kOuGh8.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/{settings-1w1O5Og82.js → settings-B9ilOSYO.js} +0 -0
- /package/client/dist/assets/{settings-Jc46vUhd.js → settings-BqlWHRHA.js} +0 -0
- /package/client/dist/assets/{settings-BSihkr0e.js → settings-D8dlqt4d.js} +0 -0
- /package/client/dist/assets/{settings-BiDOB3hV2.js → settings-DAZqjX2a2.js} +0 -0
- /package/client/dist/assets/{settings-DNL68KTE.js → settings-DRh39v1S2.js} +0 -0
- /package/client/dist/assets/{settings-BoubJhDP2.js → settings-Mj1OJbfd2.js} +0 -0
- /package/client/dist/assets/{settings-CB-EZ_W8.js → settings-lRReaSYm.js} +0 -0
- /package/client/dist/assets/{setup-D84y3wx-.js → setup-CGZjy2IF2.js} +0 -0
- /package/client/dist/assets/{setup-BuQNKztt2.js → setup-CXa0Sx16.js} +0 -0
- /package/client/dist/assets/{setup-BwMovM9z2.js → setup-D2ktKKMF2.js} +0 -0
- /package/client/dist/assets/{setup-DU0ULX8q2.js → setup-DG2H7ha5.js} +0 -0
- /package/client/dist/assets/{setup-BXpw07r-.js → setup-DK5bHDUq2.js} +0 -0
- /package/client/dist/assets/{setup-7J8TjG4O.js → setup-DrWlIQTZ.js} +0 -0
- /package/client/dist/assets/{setup-BiduSX9d.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-CWtKcVDC.js → specs-BcyxaCwf2.js} +0 -0
- /package/client/dist/assets/{specs-DTplt2XM.js → specs-C1q9geAi.js} +0 -0
- /package/client/dist/assets/{specs-PozUNhqb.js → specs-CLZKysq-2.js} +0 -0
- /package/client/dist/assets/{specs-C9Sd7BhH2.js → specs-DZMS9o54.js} +0 -0
- /package/client/dist/assets/{specs-D2clrt2c2.js → specs-Dm6zUI-R.js} +0 -0
- /package/client/dist/assets/{specs-CBDvEYKv.js → specs-V3TvhKLX.js} +0 -0
- /package/client/dist/assets/{specs-CIPr9reA2.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-De2Brd23.js → terminal-BZiIu3rf.js} +0 -0
- /package/client/dist/assets/{terminal-cqfd3EDV.js → terminal-C2NAd7BW2.js} +0 -0
- /package/client/dist/assets/{terminal-WSAvHXoU.js → terminal-IahE4LW92.js} +0 -0
- /package/client/dist/assets/{terminal-Z7KsDM_n.js → terminal-QpXZU2Bn2.js} +0 -0
- /package/client/dist/assets/{terminal-xGbCZJHg.js → terminal-ScjyXNxQ.js} +0 -0
- /package/client/dist/assets/{terminal-BRm03iFA2.js → terminal-d7GadXbN.js} +0 -0
- /package/client/dist/assets/{terminal-DxQWCqSD2.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
|
@@ -5,6 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.agentCwdPath = agentCwdPath;
|
|
7
7
|
exports.ensureAgentCwd = ensureAgentCwd;
|
|
8
|
+
exports.agentConversationCwdPath = agentConversationCwdPath;
|
|
9
|
+
exports.ensureAgentConversationCwd = ensureAgentConversationCwd;
|
|
8
10
|
exports.removeAgentCwd = removeAgentCwd;
|
|
9
11
|
const fs_1 = __importDefault(require("fs"));
|
|
10
12
|
const path_1 = __importDefault(require("path"));
|
|
@@ -14,9 +16,10 @@ const agent_operator_prompt_1 = require("./agent-operator-prompt");
|
|
|
14
16
|
//
|
|
15
17
|
// The agent chat spawns the AI CLI from an app-owned cwd (NOT a project path), so
|
|
16
18
|
// no project's CLAUDE.md is auto-loaded and the agent starts with a focused
|
|
17
|
-
// "operator" stance.
|
|
18
|
-
//
|
|
19
|
-
//
|
|
19
|
+
// "operator" stance. Claude/Codex retain the original app-global cwd. Gemini
|
|
20
|
+
// gets a per-conversation child cwd because it discovers project MCP settings
|
|
21
|
+
// from `<cwd>/.gemini/settings.json`; sharing that file would let concurrent
|
|
22
|
+
// conversations overwrite each other's capability-file reference.
|
|
20
23
|
function homeDir() {
|
|
21
24
|
return process.env.SPECRAILS_REGISTRY_HOME || os_1.default.homedir();
|
|
22
25
|
}
|
|
@@ -24,20 +27,61 @@ function agentCwdPath() {
|
|
|
24
27
|
return path_1.default.join(homeDir(), '.specrails', 'agent-cwd');
|
|
25
28
|
}
|
|
26
29
|
const INSTRUCTION_FILES = ['CLAUDE.md', 'AGENTS.md', 'GEMINI.md'];
|
|
30
|
+
const AGENT_CONVERSATION_ID_RE = /^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/;
|
|
31
|
+
function ensureCwd(dir) {
|
|
32
|
+
fs_1.default.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
33
|
+
try {
|
|
34
|
+
fs_1.default.chmodSync(dir, 0o700);
|
|
35
|
+
}
|
|
36
|
+
catch { /* best-effort on platforms without chmod */ }
|
|
37
|
+
for (const name of INSTRUCTION_FILES) {
|
|
38
|
+
// App-owned files (not user-edited) — always (re)write so operator-prompt
|
|
39
|
+
// updates take effect instead of being pinned to the first materialization.
|
|
40
|
+
fs_1.default.writeFileSync(path_1.default.join(dir, name), agent_operator_prompt_1.OPERATOR_INSTRUCTIONS, 'utf-8');
|
|
41
|
+
}
|
|
42
|
+
return dir;
|
|
43
|
+
}
|
|
27
44
|
/**
|
|
28
45
|
* Ensures the app-level agent cwd exists with operator instruction files.
|
|
29
46
|
* Idempotent; safe to call on every turn. Returns the cwd path.
|
|
30
47
|
*/
|
|
31
48
|
function ensureAgentCwd() {
|
|
32
49
|
const dir = agentCwdPath();
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
50
|
+
ensureCwd(dir);
|
|
51
|
+
// Older builds wrote Gemini's per-turn MCP registration into this shared cwd.
|
|
52
|
+
// Claude also discovers `.mcp.json` from cwd, so leaving that stale file in
|
|
53
|
+
// place could make a later Claude turn load another conversation's still-live
|
|
54
|
+
// capability. This directory is wholly app-owned; remove only those legacy
|
|
55
|
+
// generated config files while preserving the operator instructions.
|
|
56
|
+
try {
|
|
57
|
+
fs_1.default.unlinkSync(path_1.default.join(dir, '.mcp.json'));
|
|
58
|
+
}
|
|
59
|
+
catch { /* absent */ }
|
|
60
|
+
try {
|
|
61
|
+
fs_1.default.unlinkSync(path_1.default.join(dir, '.gemini', 'settings.json'));
|
|
62
|
+
}
|
|
63
|
+
catch { /* absent */ }
|
|
64
|
+
try {
|
|
65
|
+
fs_1.default.rmdirSync(path_1.default.join(dir, '.gemini'));
|
|
38
66
|
}
|
|
67
|
+
catch { /* non-empty / absent */ }
|
|
39
68
|
return dir;
|
|
40
69
|
}
|
|
70
|
+
/** Path for provider state that must not be shared across agent conversations. */
|
|
71
|
+
function agentConversationCwdPath(conversationId) {
|
|
72
|
+
if (!AGENT_CONVERSATION_ID_RE.test(conversationId)) {
|
|
73
|
+
throw new Error(`unsafe agent conversation id: ${conversationId}`);
|
|
74
|
+
}
|
|
75
|
+
return path_1.default.join(agentCwdPath(), 'conversations', conversationId);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Materialise an isolated agent cwd for one conversation. Gemini uses this so
|
|
79
|
+
* its cwd-discovered `.mcp.json` and `.gemini/settings.json` can never be
|
|
80
|
+
* overwritten by a concurrent turn belonging to another conversation.
|
|
81
|
+
*/
|
|
82
|
+
function ensureAgentConversationCwd(conversationId) {
|
|
83
|
+
return ensureCwd(agentConversationCwdPath(conversationId));
|
|
84
|
+
}
|
|
41
85
|
/** Removes the agent cwd (used on full teardown / reset). Best-effort. */
|
|
42
86
|
function removeAgentCwd() {
|
|
43
87
|
try {
|
|
@@ -12,6 +12,8 @@ const cli_prompt_1 = require("./util/cli-prompt");
|
|
|
12
12
|
const providers_1 = require("./providers");
|
|
13
13
|
const result_event_1 = require("./result-event");
|
|
14
14
|
const ai_invocations_1 = require("./ai-invocations");
|
|
15
|
+
const process_admission_1 = require("./process-admission");
|
|
16
|
+
const transient_children_1 = require("./transient-children");
|
|
15
17
|
const AGENT_STUDIO_ADAPTER = (0, providers_1.getAdapter)('claude');
|
|
16
18
|
/**
|
|
17
19
|
* Finalise the accumulated adapter events (native cost, or pricing-table
|
|
@@ -77,6 +79,9 @@ function escalateKill(child) {
|
|
|
77
79
|
}
|
|
78
80
|
}
|
|
79
81
|
async function generateCustomAgent(cwd, opts) {
|
|
82
|
+
const admission = opts.record
|
|
83
|
+
? (0, process_admission_1.captureProcessAdmission)(opts.record.projectId)
|
|
84
|
+
: (0, process_admission_1.captureProcessAdmission)();
|
|
80
85
|
const systemPrompt = [
|
|
81
86
|
'You are a specrails agent-authoring assistant.',
|
|
82
87
|
'',
|
|
@@ -105,7 +110,11 @@ async function generateCustomAgent(cwd, opts) {
|
|
|
105
110
|
].join('\n');
|
|
106
111
|
return new Promise((resolve, reject) => {
|
|
107
112
|
const child = (0, cli_prompt_1.spawnClaude)([
|
|
108
|
-
|
|
113
|
+
// This is a pure text transformation. The non-existent sentinel is
|
|
114
|
+
// intentional: an empty tool list is dropped by some Claude versions
|
|
115
|
+
// and silently restores the default toolkit.
|
|
116
|
+
'--tools',
|
|
117
|
+
'__none__',
|
|
109
118
|
'--output-format',
|
|
110
119
|
'stream-json',
|
|
111
120
|
'--verbose',
|
|
@@ -118,18 +127,30 @@ async function generateCustomAgent(cwd, opts) {
|
|
|
118
127
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
119
128
|
cwd,
|
|
120
129
|
});
|
|
130
|
+
if (opts.record)
|
|
131
|
+
(0, transient_children_1.trackTransientChild)(opts.record.projectId, child);
|
|
121
132
|
let collected = '';
|
|
122
133
|
// Accumulate adapter events so a killed/failed generate run is still costed
|
|
123
134
|
// from the per-assistant-event usage snapshots (MED-3).
|
|
124
135
|
const adapterEvents = [];
|
|
125
136
|
const startedAt = new Date().toISOString();
|
|
126
137
|
const record = opts.record;
|
|
138
|
+
let settled = false;
|
|
139
|
+
const settle = (status, complete) => {
|
|
140
|
+
if (settled)
|
|
141
|
+
return;
|
|
142
|
+
settled = true;
|
|
143
|
+
clearTimeout(killer);
|
|
144
|
+
if (record && admission.isCurrent()) {
|
|
145
|
+
recordAgentStudioInvocation(record, adapterEvents, status, startedAt);
|
|
146
|
+
}
|
|
147
|
+
complete();
|
|
148
|
+
};
|
|
127
149
|
const killer = setTimeout(() => {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
reject(new Error('agent generation timed out after 90s'));
|
|
150
|
+
settle('aborted', () => {
|
|
151
|
+
escalateKill(child);
|
|
152
|
+
reject(new Error('agent generation timed out after 90s'));
|
|
153
|
+
});
|
|
133
154
|
}, 90_000);
|
|
134
155
|
const reader = (0, readline_1.createInterface)({ input: child.stdout, crlfDelay: Infinity });
|
|
135
156
|
reader.on('line', (line) => {
|
|
@@ -164,27 +185,28 @@ async function generateCustomAgent(cwd, opts) {
|
|
|
164
185
|
let stderr = '';
|
|
165
186
|
child.stderr.on('data', (chunk) => { stderr += chunk.toString(); });
|
|
166
187
|
child.on('error', (err) => {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
reject(err);
|
|
188
|
+
settle('failed', () => reject(admission.isCurrent()
|
|
189
|
+
? err
|
|
190
|
+
: new process_admission_1.ProcessAdmissionClosedError(opts.record?.projectId)));
|
|
171
191
|
});
|
|
172
192
|
child.on('close', (code) => {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
if (record) {
|
|
176
|
-
const status = code === 0 && trimmed ? 'success' : 'failed';
|
|
177
|
-
recordAgentStudioInvocation(record, adapterEvents, status, startedAt);
|
|
178
|
-
}
|
|
179
|
-
if (code !== 0) {
|
|
180
|
-
reject(new Error(`claude exited with code ${code}${stderr ? `: ${stderr.slice(-500)}` : ''}`));
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
if (!trimmed) {
|
|
184
|
-
reject(new Error('claude returned empty output'));
|
|
193
|
+
if (!admission.isCurrent()) {
|
|
194
|
+
settle('aborted', () => reject(new process_admission_1.ProcessAdmissionClosedError(opts.record?.projectId)));
|
|
185
195
|
return;
|
|
186
196
|
}
|
|
187
|
-
|
|
197
|
+
const trimmed = collected.trim();
|
|
198
|
+
const status = code === 0 && trimmed ? 'success' : 'failed';
|
|
199
|
+
settle(status, () => {
|
|
200
|
+
if (code !== 0) {
|
|
201
|
+
reject(new Error(`claude exited with code ${code}${stderr ? `: ${stderr.slice(-500)}` : ''}`));
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (!trimmed) {
|
|
205
|
+
reject(new Error('claude returned empty output'));
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
resolve(trimmed);
|
|
209
|
+
});
|
|
188
210
|
});
|
|
189
211
|
});
|
|
190
212
|
}
|
|
@@ -200,6 +222,9 @@ async function generateCustomAgent(cwd, opts) {
|
|
|
200
222
|
* can override via `tokenCeiling`).
|
|
201
223
|
*/
|
|
202
224
|
async function testCustomAgent(cwd, opts) {
|
|
225
|
+
const admission = opts.record
|
|
226
|
+
? (0, process_admission_1.captureProcessAdmission)(opts.record.projectId)
|
|
227
|
+
: (0, process_admission_1.captureProcessAdmission)();
|
|
203
228
|
const tokenCeiling = opts.tokenCeiling ?? 4000;
|
|
204
229
|
// Strip YAML frontmatter so we feed only the agent's instructions.
|
|
205
230
|
const body = opts.draftBody.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, '').trim();
|
|
@@ -219,7 +244,10 @@ async function testCustomAgent(cwd, opts) {
|
|
|
219
244
|
const started = Date.now();
|
|
220
245
|
return new Promise((resolve, reject) => {
|
|
221
246
|
const child = (0, cli_prompt_1.spawnClaude)([
|
|
222
|
-
|
|
247
|
+
// A Studio smoke test evaluates the supplied instructions and returns
|
|
248
|
+
// text; it never needs authority over the project it is testing in.
|
|
249
|
+
'--tools',
|
|
250
|
+
'__none__',
|
|
223
251
|
'--output-format',
|
|
224
252
|
'stream-json',
|
|
225
253
|
'--verbose',
|
|
@@ -232,6 +260,8 @@ async function testCustomAgent(cwd, opts) {
|
|
|
232
260
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
233
261
|
cwd,
|
|
234
262
|
});
|
|
263
|
+
if (opts.record)
|
|
264
|
+
(0, transient_children_1.trackTransientChild)(opts.record.projectId, child);
|
|
235
265
|
let collected = '';
|
|
236
266
|
// LOW-14 double-count fix: the claude stream emits `message.usage` on EVERY
|
|
237
267
|
// assistant frame AND a top-level cumulative `usage` on the terminal `result`
|
|
@@ -253,11 +283,22 @@ async function testCustomAgent(cwd, opts) {
|
|
|
253
283
|
const runningTotalTokens = () => resultTokensIn !== undefined || resultTokensOut !== undefined
|
|
254
284
|
? (resultTokensIn ?? 0) + (resultTokensOut ?? 0)
|
|
255
285
|
: msgTokensIn + msgTokensOut;
|
|
286
|
+
let settled = false;
|
|
287
|
+
const settle = (status, complete) => {
|
|
288
|
+
if (settled)
|
|
289
|
+
return;
|
|
290
|
+
settled = true;
|
|
291
|
+
clearTimeout(killer);
|
|
292
|
+
if (record && admission.isCurrent()) {
|
|
293
|
+
recordAgentStudioInvocation(record, adapterEvents, status, startedAt);
|
|
294
|
+
}
|
|
295
|
+
complete();
|
|
296
|
+
};
|
|
256
297
|
const killer = setTimeout(() => {
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
298
|
+
settle('aborted', () => {
|
|
299
|
+
escalateKill(child);
|
|
300
|
+
reject(new Error('test agent run timed out after 120s'));
|
|
301
|
+
});
|
|
261
302
|
}, 120_000);
|
|
262
303
|
const reader = (0, readline_1.createInterface)({ input: child.stdout, crlfDelay: Infinity });
|
|
263
304
|
reader.on('line', (line) => {
|
|
@@ -318,30 +359,31 @@ async function testCustomAgent(cwd, opts) {
|
|
|
318
359
|
let stderr = '';
|
|
319
360
|
child.stderr.on('data', (chunk) => { stderr += chunk.toString(); });
|
|
320
361
|
child.on('error', (err) => {
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
reject(err);
|
|
362
|
+
settle('failed', () => reject(admission.isCurrent()
|
|
363
|
+
? err
|
|
364
|
+
: new process_admission_1.ProcessAdmissionClosedError(opts.record?.projectId)));
|
|
325
365
|
});
|
|
326
366
|
child.on('close', (code) => {
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
const failedHard = !truncated && code !== 0 && !collected;
|
|
330
|
-
if (record) {
|
|
331
|
-
const status = truncated ? 'aborted' : failedHard ? 'failed' : 'success';
|
|
332
|
-
recordAgentStudioInvocation(record, adapterEvents, status, startedAt);
|
|
333
|
-
}
|
|
334
|
-
if (failedHard) {
|
|
335
|
-
reject(new Error(`claude exited with code ${code}${stderr ? `: ${stderr.slice(-500)}` : ''}`));
|
|
367
|
+
if (!admission.isCurrent()) {
|
|
368
|
+
settle('aborted', () => reject(new process_admission_1.ProcessAdmissionClosedError(opts.record?.projectId)));
|
|
336
369
|
return;
|
|
337
370
|
}
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
371
|
+
const durationMs = Date.now() - started;
|
|
372
|
+
const failedHard = !truncated && code !== 0 && !collected;
|
|
373
|
+
const status = truncated ? 'aborted' : failedHard ? 'failed' : 'success';
|
|
374
|
+
settle(status, () => {
|
|
375
|
+
if (failedHard) {
|
|
376
|
+
reject(new Error(`claude exited with code ${code}${stderr ? `: ${stderr.slice(-500)}` : ''}`));
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
resolve({
|
|
380
|
+
output: truncated
|
|
381
|
+
? collected + `\n\n[… output truncated after reaching ${tokenCeiling}-token ceiling]`
|
|
382
|
+
: collected,
|
|
383
|
+
tokens: runningTotalTokens(),
|
|
384
|
+
durationMs,
|
|
385
|
+
draftHash,
|
|
386
|
+
});
|
|
345
387
|
});
|
|
346
388
|
});
|
|
347
389
|
});
|
|
@@ -8,22 +8,26 @@ exports.resolveNodeCommand = resolveNodeCommand;
|
|
|
8
8
|
exports.buildSpecrailsMcpEntry = buildSpecrailsMcpEntry;
|
|
9
9
|
exports.mergeSpecrailsIntoWorkspaceMcp = mergeSpecrailsIntoWorkspaceMcp;
|
|
10
10
|
exports.buildAgentMcpArgs = buildAgentMcpArgs;
|
|
11
|
+
exports.removeAgentCapabilityFile = removeAgentCapabilityFile;
|
|
11
12
|
exports.prepareAgentMcp = prepareAgentMcp;
|
|
12
13
|
const fs_1 = __importDefault(require("fs"));
|
|
13
14
|
const path_1 = __importDefault(require("path"));
|
|
14
15
|
const os_1 = __importDefault(require("os"));
|
|
16
|
+
const crypto_1 = require("crypto");
|
|
15
17
|
const path_resolver_1 = require("./path-resolver");
|
|
16
18
|
const win_spawn_1 = require("./util/win-spawn");
|
|
17
19
|
const agent_tier_1 = require("./agent-tier");
|
|
20
|
+
const AGENT_CONVERSATION_ID_RE = /^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/;
|
|
18
21
|
// ─── Agent MCP wiring (design D8 / D1) ────────────────────────────────────────
|
|
19
22
|
//
|
|
20
23
|
// The in-app agent drives the app by talking to its OWN embedded MCP server. We
|
|
21
24
|
// spawn the AI CLI with `--mcp-config` pointing at a generated config whose sole
|
|
22
25
|
// server is the bundled `specrails-mcp` stdio bridge, which relays to
|
|
23
26
|
// `127.0.0.1:<port>/api/mcp` and reads the scoped token from disk (no token is
|
|
24
|
-
// ever written into the config file).
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
+
// ever written into the config file). A per-turn, server-minted capability is
|
|
28
|
+
// written to a 0600 file and the config carries only that file path. The bridge
|
|
29
|
+
// reads the secret and presents it to the server; tier/project/conversation are
|
|
30
|
+
// derived from the server-side capability binding, never client headers.
|
|
27
31
|
function homeDir() {
|
|
28
32
|
return process.env.SPECRAILS_REGISTRY_HOME || os_1.default.homedir();
|
|
29
33
|
}
|
|
@@ -75,9 +79,6 @@ function resolveBridgeScript() {
|
|
|
75
79
|
function resolveNodeCommand() {
|
|
76
80
|
return (0, path_resolver_1.resolveBundledNodeExe)() ?? 'node';
|
|
77
81
|
}
|
|
78
|
-
/** The launch-route contract for an origin conversation id (safe-pr-review-flow):
|
|
79
|
-
* must match rails-router's validation so a tagged launch is never 400'd. */
|
|
80
|
-
const ORIGIN_CONVERSATION_ID_RE = /^[A-Za-z0-9-]{1,64}$/;
|
|
81
82
|
/** Build the `mcpServers.specrails` entry the agent (or a project workspace) uses. */
|
|
82
83
|
function buildSpecrailsMcpEntry(opts) {
|
|
83
84
|
const bridge = resolveBridgeScript();
|
|
@@ -89,13 +90,8 @@ function buildSpecrailsMcpEntry(opts) {
|
|
|
89
90
|
// Preserve the test-home override so the bridge reads the right token file.
|
|
90
91
|
if (process.env.SPECRAILS_REGISTRY_HOME)
|
|
91
92
|
env.SPECRAILS_REGISTRY_HOME = process.env.SPECRAILS_REGISTRY_HOME;
|
|
92
|
-
if (opts.
|
|
93
|
-
env[agent_tier_1.
|
|
94
|
-
if (opts.activeProjectId)
|
|
95
|
-
env[agent_tier_1.AGENT_PROJECT_ENV] = opts.activeProjectId;
|
|
96
|
-
if (opts.conversationId && ORIGIN_CONVERSATION_ID_RE.test(opts.conversationId)) {
|
|
97
|
-
env[agent_tier_1.AGENT_CONVERSATION_ENV] = opts.conversationId;
|
|
98
|
-
}
|
|
93
|
+
if (opts.capabilityFile)
|
|
94
|
+
env[agent_tier_1.AGENT_CAPABILITY_FILE_ENV] = opts.capabilityFile;
|
|
99
95
|
return { command: resolveNodeCommand(), args: [bridge], env };
|
|
100
96
|
}
|
|
101
97
|
/**
|
|
@@ -138,19 +134,10 @@ function mergeSpecrailsIntoWorkspaceMcp(workspaceDir, port) {
|
|
|
138
134
|
* `[]` when the bridge can't be located (agent then runs tool-less / degraded).
|
|
139
135
|
*/
|
|
140
136
|
function buildAgentMcpArgs(opts) {
|
|
141
|
-
const entry =
|
|
142
|
-
port: opts.port,
|
|
143
|
-
tierLevel: opts.tierLevel,
|
|
144
|
-
activeProjectId: opts.activeProjectId,
|
|
145
|
-
conversationId: opts.conversationId,
|
|
146
|
-
});
|
|
137
|
+
const entry = buildAgentTurnEntry(opts);
|
|
147
138
|
if (!entry)
|
|
148
139
|
return [];
|
|
149
|
-
|
|
150
|
-
throw new Error(`unsafe agent conversation id: ${opts.conversationId}`);
|
|
151
|
-
}
|
|
152
|
-
const dir = path_1.default.join(homeDir(), '.specrails', 'agent', opts.conversationId);
|
|
153
|
-
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
140
|
+
const dir = agentDir(opts.conversationId);
|
|
154
141
|
const file = path_1.default.join(dir, 'mcp.json');
|
|
155
142
|
fs_1.default.writeFileSync(file, JSON.stringify({ mcpServers: { specrails: entry } }, null, 2), { mode: 0o600 });
|
|
156
143
|
try {
|
|
@@ -162,13 +149,64 @@ function buildAgentMcpArgs(opts) {
|
|
|
162
149
|
return ['--mcp-config', file];
|
|
163
150
|
}
|
|
164
151
|
function agentDir(conversationId) {
|
|
165
|
-
if (
|
|
152
|
+
if (!AGENT_CONVERSATION_ID_RE.test(conversationId)) {
|
|
166
153
|
throw new Error(`unsafe agent conversation id: ${conversationId}`);
|
|
167
154
|
}
|
|
168
155
|
const dir = path_1.default.join(homeDir(), '.specrails', 'agent', conversationId);
|
|
169
|
-
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
156
|
+
fs_1.default.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
157
|
+
try {
|
|
158
|
+
fs_1.default.chmodSync(dir, 0o700);
|
|
159
|
+
}
|
|
160
|
+
catch { /* best-effort on platforms without chmod */ }
|
|
170
161
|
return dir;
|
|
171
162
|
}
|
|
163
|
+
function capabilityFilePath(conversationId) {
|
|
164
|
+
return path_1.default.join(agentDir(conversationId), 'mcp.capability');
|
|
165
|
+
}
|
|
166
|
+
function buildAgentTurnEntry(opts) {
|
|
167
|
+
const capabilityFile = capabilityFilePath(opts.conversationId);
|
|
168
|
+
const entry = buildSpecrailsMcpEntry({ port: opts.port, capabilityFile });
|
|
169
|
+
if (!entry)
|
|
170
|
+
return null;
|
|
171
|
+
const tmp = `${capabilityFile}.tmp-${process.pid}-${(0, crypto_1.randomBytes)(8).toString('hex')}`;
|
|
172
|
+
try {
|
|
173
|
+
// `wx` prevents a pre-planted symlink from redirecting the bearer write.
|
|
174
|
+
fs_1.default.writeFileSync(tmp, opts.capability, { encoding: 'utf8', mode: 0o600, flag: 'wx' });
|
|
175
|
+
try {
|
|
176
|
+
fs_1.default.chmodSync(tmp, 0o600);
|
|
177
|
+
}
|
|
178
|
+
catch { /* best-effort on platforms without chmod */ }
|
|
179
|
+
// Windows rename does not replace an existing destination. A stale file can
|
|
180
|
+
// remain after a hard crash, but its server-side capability is already gone.
|
|
181
|
+
try {
|
|
182
|
+
fs_1.default.unlinkSync(capabilityFile);
|
|
183
|
+
}
|
|
184
|
+
catch { /* first turn / already absent */ }
|
|
185
|
+
fs_1.default.renameSync(tmp, capabilityFile);
|
|
186
|
+
try {
|
|
187
|
+
fs_1.default.chmodSync(capabilityFile, 0o600);
|
|
188
|
+
}
|
|
189
|
+
catch { /* best-effort on platforms without chmod */ }
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
try {
|
|
193
|
+
fs_1.default.unlinkSync(tmp);
|
|
194
|
+
}
|
|
195
|
+
catch { /* never leave a bearer-bearing temp file */ }
|
|
196
|
+
throw err;
|
|
197
|
+
}
|
|
198
|
+
return entry;
|
|
199
|
+
}
|
|
200
|
+
/** Delete the on-disk bearer as soon as its owning agent turn settles. */
|
|
201
|
+
function removeAgentCapabilityFile(conversationId) {
|
|
202
|
+
if (!AGENT_CONVERSATION_ID_RE.test(conversationId))
|
|
203
|
+
return;
|
|
204
|
+
const file = path_1.default.join(homeDir(), '.specrails', 'agent', conversationId, 'mcp.capability');
|
|
205
|
+
try {
|
|
206
|
+
fs_1.default.unlinkSync(file);
|
|
207
|
+
}
|
|
208
|
+
catch { /* absent/already removed */ }
|
|
209
|
+
}
|
|
172
210
|
/**
|
|
173
211
|
* Codex registers the specrails MCP via inline `-c mcp_servers.specrails.*`
|
|
174
212
|
* config overrides. This keeps codex on the USER's real CODEX_HOME (auth + model
|
|
@@ -194,21 +232,16 @@ function codexMcpOverrides(entry) {
|
|
|
194
232
|
* (agent then runs tool-less / degraded).
|
|
195
233
|
*/
|
|
196
234
|
function prepareAgentMcp(opts) {
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
conversationId: opts.conversationId,
|
|
202
|
-
});
|
|
235
|
+
if (opts.adapterId === 'claude') {
|
|
236
|
+
return { extraArgs: buildAgentMcpArgs(opts), env: {} };
|
|
237
|
+
}
|
|
238
|
+
const entry = buildAgentTurnEntry(opts);
|
|
203
239
|
if (!entry)
|
|
204
240
|
return { extraArgs: [], env: {} };
|
|
205
241
|
if (opts.adapterId === 'codex') {
|
|
206
|
-
// Inline -c overrides
|
|
242
|
+
// Inline -c overrides contain only the capability FILE PATH, never its secret.
|
|
207
243
|
return { extraArgs: codexMcpOverrides(entry), env: {} };
|
|
208
244
|
}
|
|
209
|
-
if (opts.adapterId === 'claude') {
|
|
210
|
-
return { extraArgs: buildAgentMcpArgs(opts), env: {} };
|
|
211
|
-
}
|
|
212
245
|
// gemini + any other project-json provider: write .mcp.json in the spawn cwd.
|
|
213
246
|
const file = path_1.default.join(opts.cwd, '.mcp.json');
|
|
214
247
|
mergeServerIntoJsonFile(file, entry);
|
|
@@ -438,7 +438,8 @@ summary later.
|
|
|
438
438
|
server/watch/tail command that should keep running (for example \`npm run dev\`,
|
|
439
439
|
\`vite --host\`, \`tail -f\`, or a local service), propose
|
|
440
440
|
\`specrails_jobs(background_start)\` with the command, project and cwd, wait for
|
|
441
|
-
explicit yes,
|
|
441
|
+
explicit yes, ensure the permission level is Autonomous, then call that tool
|
|
442
|
+
with \`confirmed:true\`. Do NOT use a raw shell/background-task
|
|
442
443
|
runner for these requests: only \`background_start\` emits the app events that
|
|
443
444
|
create the killable chip above this agent chat's composer. You normally do not
|
|
444
445
|
need to pass \`chatId\`; the in-app MCP origin conversation owns it. If a
|
|
@@ -519,4 +520,4 @@ When the user has no projects yet, or asks to add one:
|
|
|
519
520
|
Setup is QUICK-only (fast, offline). Do NOT offer, mention, or attempt a "full"
|
|
520
521
|
or "enrich" install — that flow is deprecated and not available through you.
|
|
521
522
|
`;
|
|
522
|
-
exports.OPERATOR_SYSTEM_PROMPT = `You are the Specrails operator agent, embedded inside the Specrails Desktop app; drive it on the user's behalf using the specrails_* MCP tools. Your full operator manual is the CLAUDE.md auto-loaded from your working directory — follow it. Non-negotiables: target a project with specrails_select_project or the projectId argument, and ask rather than guess when none is pinned; support/troubleshooting/install/usage/job-failure questions use specrails_support first and never become specs unless the user pivots to product work; missing agents/skills/slash commands concern the app-global specrails-core framework, never project-owned files — never say agents/skills/commands live inside the project; project setup checkpoints are not a core health signal, so pending/0 agents/0 commands must not trigger specrails_setup(install) or a project repair recommendation; offer core_update_check/core_update_apply only for global core updates, and if global core is current ask for the concrete job error/diagnostic; an on_review spec with an open PR, including a published pr_ready card, can be relaunched to continue that PR branch — do not require publish/discard/merge first; run long-lived server/watch/tail shell commands with specrails_jobs background_start and confirmed:true after explicit user confirmation, not a raw shell runner, so the app can show the killable background chip in this chat; if a background chip exits/fails, use specrails_jobs background_logs for its pid before asking to relaunch; if a job/loop is still running, pass allowWhileBusy:true only after explicit concurrent confirmation; short async 202 ops (spec generation, ai-edit) may be awaited with specrails_watch (projectId required), but after a rail/job LAUNCH is accepted end your reply immediately — progress streams live in the conversation's run card and the app; watch a launched run only when the user explicitly asks you to wait, with a bounded untilMs; never claim success from a 202 acceptance alone — verify from a terminal event or a domain read (e.g. specrails_jobs get); call the free-form autonomous rail mode Freestyle in prose — freestyle/factory:freestyle/{{cmd:freestyle}} are canonical API/id/token values for that same capability; respect the cumulative permission ladder observe / edit / operate / autonomous — if a tool is refused, name the level the user must Shift+Tab to, never work around it; when refining a spec, ground it in the real codebase FIRST (specrails_code tree/read_file/summary + specrails_specs list) and show the evolving draft as one fenced spec-draft JSON block (title, description, labels, priority, acceptanceCriteria) at the end of each turn that changed it — the app renders it as a live card; persist the refined spec with specrails_specs commit_draft (no conversationId) — never route it through create/generate, which regenerate the content with AI; commit_draft appends a Contract Layer by default via one short background AI pass — pass contractRefine false when the user declines it; report tool outputs faithfully, including failures. Format replies for easy reading: short paragraphs separated by blank lines, bullet lists for enumerations. When asking the user to pick between concrete choices, end the reply with a fenced options code block containing a JSON array of the 2-6 choice labels (rendered as clickable chips); never use that block otherwise. Before launching small work, classify it as Freestyle, SDD Quick (OpenSpec), Implement, or Batch; Freestyle is only ticket-local implementation-only when OpenSpec artifacts are relevant; SDD Quick (OpenSpec) uses loopId factory:sdd-quick-openspec for small OpenSpec-governed work and known targets belong in ticket metadata openspecChangeName before confirmation; never offer direct code edits as the implementation path, even for one-line changes — create or update a local ticket and route the work through the lightest valid rail; before classifying or relaunching follow-ups on on_review specs or active PRs, inspect the PR head branch/diff/files and treat OpenSpec artifacts added in that PR as governing context for SDD Quick decisions.`;
|
|
523
|
+
exports.OPERATOR_SYSTEM_PROMPT = `You are the Specrails operator agent, embedded inside the Specrails Desktop app; drive it on the user's behalf using the specrails_* MCP tools. Your full operator manual is the CLAUDE.md auto-loaded from your working directory — follow it. Non-negotiables: target a project with specrails_select_project or the projectId argument, and ask rather than guess when none is pinned; support/troubleshooting/install/usage/job-failure questions use specrails_support first and never become specs unless the user pivots to product work; missing agents/skills/slash commands concern the app-global specrails-core framework, never project-owned files — never say agents/skills/commands live inside the project; project setup checkpoints are not a core health signal, so pending/0 agents/0 commands must not trigger specrails_setup(install) or a project repair recommendation; offer core_update_check/core_update_apply only for global core updates, and if global core is current ask for the concrete job error/diagnostic; an on_review spec with an open PR, including a published pr_ready card, can be relaunched to continue that PR branch — do not require publish/discard/merge first; run long-lived server/watch/tail shell commands with specrails_jobs background_start and confirmed:true only at Autonomous level after explicit user confirmation, not a raw shell runner, so the app can show the killable background chip in this chat; if a background chip exits/fails, use specrails_jobs background_logs for its pid before asking to relaunch; if a job/loop is still running, pass allowWhileBusy:true only after explicit concurrent confirmation; short async 202 ops (spec generation, ai-edit) may be awaited with specrails_watch (projectId required), but after a rail/job LAUNCH is accepted end your reply immediately — progress streams live in the conversation's run card and the app; watch a launched run only when the user explicitly asks you to wait, with a bounded untilMs; never claim success from a 202 acceptance alone — verify from a terminal event or a domain read (e.g. specrails_jobs get); call the free-form autonomous rail mode Freestyle in prose — freestyle/factory:freestyle/{{cmd:freestyle}} are canonical API/id/token values for that same capability; respect the cumulative permission ladder observe / edit / operate / autonomous — if a tool is refused, name the level the user must Shift+Tab to, never work around it; when refining a spec, ground it in the real codebase FIRST (specrails_code tree/read_file/summary + specrails_specs list) and show the evolving draft as one fenced spec-draft JSON block (title, description, labels, priority, acceptanceCriteria) at the end of each turn that changed it — the app renders it as a live card; persist the refined spec with specrails_specs commit_draft (no conversationId) — never route it through create/generate, which regenerate the content with AI; commit_draft appends a Contract Layer by default via one short background AI pass — pass contractRefine false when the user declines it; report tool outputs faithfully, including failures. Format replies for easy reading: short paragraphs separated by blank lines, bullet lists for enumerations. When asking the user to pick between concrete choices, end the reply with a fenced options code block containing a JSON array of the 2-6 choice labels (rendered as clickable chips); never use that block otherwise. Before launching small work, classify it as Freestyle, SDD Quick (OpenSpec), Implement, or Batch; Freestyle is only ticket-local implementation-only when OpenSpec artifacts are relevant; SDD Quick (OpenSpec) uses loopId factory:sdd-quick-openspec for small OpenSpec-governed work and known targets belong in ticket metadata openspecChangeName before confirmation; never offer direct code edits as the implementation path, even for one-line changes — create or update a local ticket and route the work through the lightest valid rail; before classifying or relaunching follow-ups on on_review specs or active PRs, inspect the PR head branch/diff/files and treat OpenSpec artifacts added in that PR as governing context for SDD Quick decisions.`;
|