specrails-desktop 2.20.1 → 2.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/client/dist/assets/{ActivityFeedPage-3WSqRYVx.js → ActivityFeedPage-roDyKGuv.js} +1 -1
- package/client/dist/assets/AgentBrowserCapture-BsXnWa4j.js +1 -0
- package/client/dist/assets/{AgentModeCodePane-Cnsea6eZ.js → AgentModeCodePane-o97EJvbJ.js} +2 -2
- package/client/dist/assets/AgentModeJobsPane-CLtpPxPM.js +1 -0
- package/client/dist/assets/AgentsPage-eNSo_ZcC.js +86 -0
- package/client/dist/assets/AnalyticsPage-cAJ60_Ex.js +1 -0
- package/client/dist/assets/{BarChart-C6If656N.js → BarChart-NLtK7xAY.js} +1 -1
- package/client/dist/assets/CodePage-B5rum8ZB.js +2 -0
- package/client/dist/assets/DesktopAnalyticsPage-DSuvG6Tq.js +1 -0
- package/client/dist/assets/DocsDialog-Bo38G3Yc.js +11 -0
- package/client/dist/assets/DocsPage-BNkiBBrC.js +11 -0
- package/client/dist/assets/{ExportDropdown-CezTK0EX.js → ExportDropdown-DCV8PN4-.js} +1 -1
- package/client/dist/assets/IntegrationsPage-BMJOzpPz.js +3 -0
- package/client/dist/assets/InteractiveJobComposer-aLduNs5R.js +19 -0
- package/client/dist/assets/JobDetailModal-kpkUWJIS.js +1 -0
- package/client/dist/assets/JobDetailPage-CFeqlrPU.js +1 -0
- package/client/dist/assets/JobsPage-fuwhXy2I.js +1 -0
- package/client/dist/assets/LoopBuilderPage-DP66322C.js +7 -0
- package/client/dist/assets/LoopPreviewModal-CpmBhE31.js +1 -0
- package/client/dist/assets/LoopsPage-CvQ18VUx.js +1 -0
- package/client/dist/assets/ProjectSettingsDialog-Deq4pwvq.js +1 -0
- package/client/dist/assets/TemplatePreviewModal-DziOj2Ct.js +1 -0
- package/client/dist/assets/agent-Csh4kP2S.js +1 -0
- package/client/dist/assets/agent-Cz_jgQX32.js +1 -0
- package/client/dist/assets/agent-D3vcIvaz2.js +1 -0
- package/client/dist/assets/agent-Dnbt0V4e.js +1 -0
- package/client/dist/assets/agent-HolR7QrZ.js +1 -0
- package/client/dist/assets/agent-Ka0rRWJy.js +1 -0
- package/client/dist/assets/agent-Te3yysMd.js +1 -0
- package/client/dist/assets/agent-vM4_iLDk2.js +1 -0
- package/client/dist/assets/{upload-CRtTj4Co.js → brain-kFJuEDNH.js} +1 -1
- package/client/dist/assets/{browser-DEEO-OSi.js → browser-BPkhILSJ.js} +1 -1
- package/client/dist/assets/{browser-BTivfZKE2.js → browser-BijVYG0Y2.js} +1 -1
- package/client/dist/assets/{browser-bpO3onlS.js → browser-BqLqJVVT.js} +1 -1
- package/client/dist/assets/{browser-DlSXtfu5.js → browser-Cc0iDqUi.js} +1 -1
- package/client/dist/assets/browser-CdS6O1Qb.js +1 -0
- package/client/dist/assets/{browser-BKP6hqQC2.js → browser-Cvg-QHvd2.js} +1 -1
- package/client/dist/assets/{browser-INCUyduh.js → browser-FRv8P02E.js} +1 -1
- package/client/dist/assets/{browser-DlKLfT612.js → browser-rWKj-RR_2.js} +1 -1
- package/client/dist/assets/code-BRcDlze52.js +1 -0
- package/client/dist/assets/code-BdMy3Ffq.js +1 -0
- package/client/dist/assets/code-CeQ0FZpC.js +1 -0
- package/client/dist/assets/code-CqCcRThR.js +1 -0
- package/client/dist/assets/code-DgeHz9CB.js +1 -0
- package/client/dist/assets/code-DzC1rMk12.js +1 -0
- package/client/dist/assets/code-UPVvmAKM2.js +1 -0
- package/client/dist/assets/code-thSEptMx.js +1 -0
- package/client/dist/assets/{common-QjVnq9XP2.js → common-BM3LFLCE2.js} +1 -1
- package/client/dist/assets/{common-CeQUwuHt2.js → common-Bwafujnc2.js} +1 -1
- package/client/dist/assets/{common-Bb64s3Bm.js → common-C-vU-j-I.js} +1 -1
- package/client/dist/assets/{common-KbQuTSGg.js → common-C5HKSbbz.js} +1 -1
- package/client/dist/assets/{common-BPQQkgJZ.js → common-CYaT2yHp.js} +1 -1
- package/client/dist/assets/{common-DPxotRK9.js → common-DhWTkocg.js} +1 -1
- package/client/dist/assets/{common-k5MTOHpn.js → common-DiPTT7V_2.js} +1 -1
- package/client/dist/assets/{common-C8ZD5upH2.js → common-DmqBPwZG.js} +1 -1
- package/client/dist/assets/{cssMode-DsArsSCT.js → cssMode-DBHbkBvI.js} +1 -1
- package/client/dist/assets/dashboard-BaStj_a_.js +1 -0
- package/client/dist/assets/dashboard-Bi6ugu5Q.js +1 -0
- package/client/dist/assets/dashboard-BmqTn3L02.js +1 -0
- package/client/dist/assets/dashboard-CvT8lOCT.js +1 -0
- package/client/dist/assets/dashboard-D7Pmeavq2.js +1 -0
- package/client/dist/assets/dashboard-DAnWdAac2.js +1 -0
- package/client/dist/assets/dashboard-JnYy2WLg.js +1 -0
- package/client/dist/assets/dashboard-L47YsFS_.js +1 -0
- package/client/dist/assets/{dist-js-BQn4yxaw.js → dist-js-BZSiJDbG.js} +1 -1
- package/client/dist/assets/{dist-js-BAWSqVtr.js → dist-js-DKpmIJlQ.js} +1 -1
- package/client/dist/assets/{editor.main-G3Sl9C67.js → editor.main-C9J2ikJK.js} +2 -2
- package/client/dist/assets/{freemarker2-pBzQNgFi.js → freemarker2-J5iIIIK-.js} +1 -1
- package/client/dist/assets/{handlebars-CtBTCnBI.js → handlebars-DSw1l_tw.js} +1 -1
- package/client/dist/assets/{html-Dx3DYBzY.js → html-h2-wE1Lj.js} +1 -1
- package/client/dist/assets/{htmlMode-In7frFOo.js → htmlMode-Cc_ij7lW.js} +1 -1
- package/client/dist/assets/index-DM6heiGa.js +155 -0
- package/client/dist/assets/index-DPX6_xIC.css +2 -0
- package/client/dist/assets/{javascript-BKcn-YkN.js → javascript-C1q3xv6N.js} +1 -1
- package/client/dist/assets/jira-B3613-gj.js +1 -0
- package/client/dist/assets/jira-BHAKtc4B.js +1 -0
- package/client/dist/assets/jira-Be369RIR2.js +1 -0
- package/client/dist/assets/jira-CPpgA-5z2.js +1 -0
- package/client/dist/assets/jira-D5efgwp_.js +1 -0
- package/client/dist/assets/jira-DS7ownDy.js +1 -0
- package/client/dist/assets/jira-bDs7Im2C.js +1 -0
- package/client/dist/assets/jira-uNH1gETL2.js +1 -0
- package/client/dist/assets/jobs-1GV2-4zd2.js +1 -0
- package/client/dist/assets/jobs-26F9gGcE.js +1 -0
- package/client/dist/assets/jobs-BgQzB0Sx2.js +1 -0
- package/client/dist/assets/jobs-BqWui9_f.js +1 -0
- package/client/dist/assets/jobs-CE8qeIYj.js +1 -0
- package/client/dist/assets/jobs-D5sZzgLs.js +1 -0
- package/client/dist/assets/jobs-DzeuASRf.js +1 -0
- package/client/dist/assets/jobs-Wh7dn28q2.js +1 -0
- package/client/dist/assets/{jsonMode-jNREoQ3C.js → jsonMode-CeaCdEhr.js} +1 -1
- package/client/dist/assets/{lib-C-g8QbZl.js → lib-B2nCKzmA.js} +1 -1
- package/client/dist/assets/{liquid-CtRkGqBu.js → liquid-eFsVK0V-.js} +1 -1
- package/client/dist/assets/loops-BvEenWBy.js +1 -0
- package/client/dist/assets/loops-CBiWd9Hf.js +1 -0
- package/client/dist/assets/loops-DNGiYKll2.js +1 -0
- package/client/dist/assets/{loops-Y3FQsUCh.js → loops-DjOtVXRo.js} +1 -1
- package/client/dist/assets/loops-HTHf-xu32.js +1 -0
- package/client/dist/assets/loops-YYV2bwjd.js +1 -0
- package/client/dist/assets/loops-hXgncEpF2.js +1 -0
- package/client/dist/assets/loops-kYbydDyN.js +1 -0
- package/client/dist/assets/{lspLanguageFeatures-Cl3gvD_W.js → lspLanguageFeatures-DT3-bbhn.js} +1 -1
- package/client/dist/assets/{mdx-B_nJldHz.js → mdx-Fuwnh1cX.js} +1 -1
- package/client/dist/assets/{monaco.contribution-PUeaZk8T.js → monaco.contribution-Desq7oq4.js} +2 -2
- package/client/dist/assets/{python-DS1Ce-A6.js → python-BgoEs6Cj.js} +1 -1
- package/client/dist/assets/{razor-L41Qg9OK.js → razor-CM1sPMMq.js} +1 -1
- package/client/dist/assets/{settings-BPq9nCJm.js → settings-BOHOmHkb.js} +1 -1
- package/client/dist/assets/{settings-r8Qq2Gzp2.js → settings-BlEA_7h02.js} +1 -1
- package/client/dist/assets/{settings-C-m3yEZ2.js → settings-BsJMsWGc.js} +1 -1
- package/client/dist/assets/{settings-zZr7NzuB.js → settings-D6qY9_UI.js} +1 -1
- package/client/dist/assets/{settings-VgCsjaYf.js → settings-DZJeXoRV.js} +1 -1
- package/client/dist/assets/settings-Mr7MnJbf.js +1 -0
- package/client/dist/assets/{settings-BWHGtmU12.js → settings-TNga5gIF2.js} +1 -1
- package/client/dist/assets/{settings-DZj7Uqy32.js → settings-lFoaYT-s2.js} +1 -1
- package/client/dist/assets/setup-B590KsTX.js +1 -0
- package/client/dist/assets/setup-BkyGoby6.js +1 -0
- package/client/dist/assets/setup-CEj6uY3-2.js +1 -0
- package/client/dist/assets/setup-CbIerFGf2.js +1 -0
- package/client/dist/assets/setup-CmU6bTCV2.js +1 -0
- package/client/dist/assets/setup-D674kWQH.js +1 -0
- package/client/dist/assets/setup-VNqXyB6Y.js +1 -0
- package/client/dist/assets/setup-iY8vH8pB.js +1 -0
- package/client/dist/assets/specs-C9Sd7BhH2.js +1 -0
- package/client/dist/assets/specs-CBDvEYKv.js +1 -0
- package/client/dist/assets/specs-CIPr9reA2.js +1 -0
- package/client/dist/assets/specs-CWtKcVDC.js +1 -0
- package/client/dist/assets/specs-CmEZY57v.js +1 -0
- package/client/dist/assets/specs-D2clrt2c2.js +1 -0
- package/client/dist/assets/specs-DTplt2XM.js +1 -0
- package/client/dist/assets/specs-PozUNhqb.js +1 -0
- package/client/dist/assets/{tsMode-BC1g186U.js → tsMode-BmT8WogI.js} +1 -1
- package/client/dist/assets/{typescript-BGlRGvJW.js → typescript-CQrQPsoW.js} +1 -1
- package/client/dist/assets/upload-CLAzW1mS.js +1 -0
- package/client/dist/assets/{value-D9aLbxw-.js → value-DSwzyyWR.js} +1 -1
- package/client/dist/assets/{workers-CXcXtO3b.js → workers-U0UXyLUf.js} +1 -1
- package/client/dist/assets/{xml-JdZZaIhJ.js → xml-WRxJs8_I.js} +1 -1
- package/client/dist/assets/{yaml-Cm82BVBt.js → yaml-CjpSTjJU.js} +1 -1
- package/client/dist/index.html +14 -14
- package/docs/customizing.md +2 -2
- package/docs/gemini.md +15 -4
- package/docs/guide/de/insights/3-code-explorer.md +6 -0
- package/docs/guide/de/integrations/3-jira-integration.md +1 -1
- package/docs/guide/de/integrations/6-agent-chat.md +5 -0
- package/docs/guide/de/pipeline/1-rails-and-jobs.md +6 -6
- package/docs/guide/de/pipeline/2-the-job-detail-view.md +27 -2
- package/docs/guide/de/pipeline/3-batch-implement-and-multi-feature.md +9 -5
- package/docs/guide/de/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/de/specs/1-specs-and-the-backlog.md +3 -2
- package/docs/guide/en/insights/3-code-explorer.md +6 -0
- package/docs/guide/en/integrations/3-jira-integration.md +1 -1
- package/docs/guide/en/integrations/6-agent-chat.md +5 -0
- package/docs/guide/en/pipeline/1-rails-and-jobs.md +6 -6
- package/docs/guide/en/pipeline/2-the-job-detail-view.md +27 -2
- package/docs/guide/en/pipeline/3-batch-implement-and-multi-feature.md +10 -4
- package/docs/guide/en/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/en/specs/1-specs-and-the-backlog.md +3 -2
- package/docs/guide/es/insights/3-code-explorer.md +6 -0
- package/docs/guide/es/integrations/3-jira-integration.md +1 -1
- package/docs/guide/es/integrations/6-agent-chat.md +5 -0
- package/docs/guide/es/pipeline/1-rails-and-jobs.md +6 -6
- package/docs/guide/es/pipeline/2-the-job-detail-view.md +27 -2
- package/docs/guide/es/pipeline/3-batch-implement-and-multi-feature.md +9 -5
- package/docs/guide/es/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/es/specs/1-specs-and-the-backlog.md +3 -2
- package/docs/guide/fr/insights/3-code-explorer.md +6 -0
- package/docs/guide/fr/integrations/3-jira-integration.md +1 -1
- package/docs/guide/fr/integrations/6-agent-chat.md +5 -0
- package/docs/guide/fr/pipeline/1-rails-and-jobs.md +6 -6
- package/docs/guide/fr/pipeline/2-the-job-detail-view.md +27 -2
- package/docs/guide/fr/pipeline/3-batch-implement-and-multi-feature.md +9 -5
- package/docs/guide/fr/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/fr/specs/1-specs-and-the-backlog.md +3 -2
- package/docs/guide/it/insights/3-code-explorer.md +6 -0
- package/docs/guide/it/integrations/3-jira-integration.md +1 -1
- package/docs/guide/it/integrations/6-agent-chat.md +5 -0
- package/docs/guide/it/pipeline/1-rails-and-jobs.md +6 -6
- package/docs/guide/it/pipeline/2-the-job-detail-view.md +27 -2
- package/docs/guide/it/pipeline/3-batch-implement-and-multi-feature.md +10 -6
- package/docs/guide/it/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/it/specs/1-specs-and-the-backlog.md +3 -2
- package/docs/guide/ja/insights/3-code-explorer.md +6 -0
- package/docs/guide/ja/integrations/3-jira-integration.md +1 -1
- package/docs/guide/ja/integrations/6-agent-chat.md +5 -0
- package/docs/guide/ja/pipeline/1-rails-and-jobs.md +6 -6
- package/docs/guide/ja/pipeline/2-the-job-detail-view.md +27 -2
- package/docs/guide/ja/pipeline/3-batch-implement-and-multi-feature.md +9 -5
- package/docs/guide/ja/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/ja/specs/1-specs-and-the-backlog.md +3 -2
- package/docs/guide/pt/insights/3-code-explorer.md +6 -0
- package/docs/guide/pt/integrations/3-jira-integration.md +1 -1
- package/docs/guide/pt/integrations/6-agent-chat.md +5 -0
- package/docs/guide/pt/pipeline/1-rails-and-jobs.md +6 -6
- package/docs/guide/pt/pipeline/2-the-job-detail-view.md +27 -2
- package/docs/guide/pt/pipeline/3-batch-implement-and-multi-feature.md +9 -5
- package/docs/guide/pt/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/pt/specs/1-specs-and-the-backlog.md +3 -2
- package/docs/guide/zh/insights/3-code-explorer.md +6 -0
- package/docs/guide/zh/integrations/3-jira-integration.md +1 -1
- package/docs/guide/zh/integrations/6-agent-chat.md +5 -0
- package/docs/guide/zh/pipeline/1-rails-and-jobs.md +6 -6
- package/docs/guide/zh/pipeline/2-the-job-detail-view.md +27 -2
- package/docs/guide/zh/pipeline/3-batch-implement-and-multi-feature.md +10 -6
- package/docs/guide/zh/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/zh/specs/1-specs-and-the-backlog.md +3 -2
- package/docs/internals/README.md +5 -0
- package/docs/internals/adding-a-provider.md +15 -3
- package/docs/internals/api-reference.md +6 -5
- package/docs/internals/browser-capture-performance.md +93 -0
- package/docs/internals/code-explorer-story.md +135 -0
- package/docs/internals/gemini-mcp-registration.md +53 -0
- package/docs/internals/interactive-jobs.md +212 -0
- package/docs/internals/loop-step-log-explorer.md +146 -0
- package/docs/internals/safe-pr-review-flow.md +367 -0
- package/docs/mcp.md +1 -1
- package/docs/running-pipelines.md +6 -2
- package/package.json +1 -1
- package/server/dist/agent-chat-manager.js +211 -0
- package/server/dist/agent-chat-registry.js +20 -0
- package/server/dist/agent-chat-router.js +22 -0
- package/server/dist/agent-mcp-config.js +45 -4
- package/server/dist/agent-operator-prompt.js +149 -56
- package/server/dist/agent-store.js +25 -0
- package/server/dist/agent-tier.js +6 -1
- package/server/dist/browser-capture-manager.js +184 -34
- package/server/dist/browser-playwright.js +98 -13
- package/server/dist/code-explorer-router.js +92 -0
- package/server/dist/db.js +102 -0
- package/server/dist/file-provenance.js +54 -1
- package/server/dist/file-story-manager.js +170 -0
- package/server/dist/file-story.js +148 -0
- package/server/dist/file-summary-generator.js +5 -4
- package/server/dist/git-guardrails.js +62 -0
- package/server/dist/index.js +5 -0
- package/server/dist/integration-branch.js +63 -0
- package/server/dist/interactive-job-session.js +226 -18
- package/server/dist/jira/jira-adf.js +9 -0
- package/server/dist/jira/jira-materializer.js +27 -4
- package/server/dist/jira/jira-status-resolver.js +12 -4
- package/server/dist/jira/jira-sync-manager.js +130 -2
- package/server/dist/jira-router.js +1 -1
- package/server/dist/loop-effect.js +12 -0
- package/server/dist/loop-executors.js +92 -22
- package/server/dist/loop-run-manager.js +354 -28
- package/server/dist/mcp/guide.js +18 -7
- package/server/dist/mcp/tools/jira.js +1 -1
- package/server/dist/mcp/tools/jobs.js +14 -5
- package/server/dist/mcp/tools/rails.js +137 -12
- package/server/dist/mcp/tools/specs.js +35 -9
- package/server/dist/mcp/tools/types.js +49 -0
- package/server/dist/mobile/mobile-ws.js +4 -0
- package/server/dist/path-resolver.js +46 -0
- package/server/dist/pr-body.js +240 -0
- package/server/dist/pr-naming.js +210 -0
- package/server/dist/pr-publisher.js +68 -0
- package/server/dist/project-registry.js +77 -17
- package/server/dist/project-router-jobs.js +53 -13
- package/server/dist/project-router-settings.js +33 -0
- package/server/dist/project-router-terminals.js +16 -0
- package/server/dist/project-router-tickets.js +57 -3
- package/server/dist/project-router.js +52 -13
- package/server/dist/queue-manager.js +268 -83
- package/server/dist/rail-isolated-launch.js +324 -34
- package/server/dist/rail-isolation.js +32 -5
- package/server/dist/rail-pr-decision.js +519 -0
- package/server/dist/rail-pr-delivery.js +75 -0
- package/server/dist/rail-pr-store.js +175 -0
- package/server/dist/rail-worktrees-store.js +18 -0
- package/server/dist/rails-router.js +241 -17
- package/server/dist/rails-store.js +78 -1
- package/server/dist/setup-prerequisites.js +105 -0
- package/server/dist/smash-runner.js +3 -1
- package/server/dist/ticket-store.js +7 -3
- package/server/dist/workspace-resolution.js +27 -0
- package/server/dist/worktree-manager.js +42 -7
- package/server/dist/worktree-overlay.js +261 -0
- package/client/dist/assets/AgentBrowserCapture-BlGDZahz.js +0 -1
- package/client/dist/assets/AgentModeJobsPane-CyNR-9BO.js +0 -1
- package/client/dist/assets/AgentsPage-dNsEsY_x.js +0 -86
- package/client/dist/assets/AnalyticsPage-BAxmR0HQ.js +0 -1
- package/client/dist/assets/CodePage-Crc4BBQN.js +0 -2
- package/client/dist/assets/DesktopAnalyticsPage-IXSnbCce.js +0 -1
- package/client/dist/assets/DocsDialog-Bc4hx7oW.js +0 -11
- package/client/dist/assets/DocsPage-bEU4t9c6.js +0 -11
- package/client/dist/assets/IntegrationsPage-wq2CezEL.js +0 -3
- package/client/dist/assets/JobDetailPage-BBcPk3j8.js +0 -1
- package/client/dist/assets/JobsPage-DXrSPlwa.js +0 -1
- package/client/dist/assets/LogViewer-BoYbwvbU.js +0 -16
- package/client/dist/assets/LoopBuilderPage-CiUMAuWz.js +0 -7
- package/client/dist/assets/LoopsPage-Xrp6W5XW.js +0 -1
- package/client/dist/assets/ProjectSettingsDialog-BU98L5JD.js +0 -1
- package/client/dist/assets/agent-B7GdHP3Z.js +0 -1
- package/client/dist/assets/agent-BHmcgoJf.js +0 -1
- package/client/dist/assets/agent-BdY_fii4.js +0 -1
- package/client/dist/assets/agent-C32FOi9v.js +0 -1
- package/client/dist/assets/agent-CiFQxoaZ2.js +0 -1
- package/client/dist/assets/agent-CtAag7V6.js +0 -1
- package/client/dist/assets/agent-DE4Mp1fY2.js +0 -1
- package/client/dist/assets/agent-DK8qovyG2.js +0 -1
- package/client/dist/assets/browser-ZB1afzjZ.js +0 -1
- package/client/dist/assets/code-BFxE1Yt62.js +0 -1
- package/client/dist/assets/code-BefYOm5Q.js +0 -1
- package/client/dist/assets/code-BkXpJt99.js +0 -1
- package/client/dist/assets/code-C6Sq7_t8.js +0 -1
- package/client/dist/assets/code-CGj3w-2N.js +0 -1
- package/client/dist/assets/code-Dfsxc9o82.js +0 -1
- package/client/dist/assets/code-Y5urks5s2.js +0 -1
- package/client/dist/assets/code-wtcs0ivb.js +0 -1
- package/client/dist/assets/dashboard-B8032psZ.js +0 -1
- package/client/dist/assets/dashboard-BHGKtxty2.js +0 -1
- package/client/dist/assets/dashboard-CXnoUgN22.js +0 -1
- package/client/dist/assets/dashboard-Ccyxqy7d.js +0 -1
- package/client/dist/assets/dashboard-CoED_41r.js +0 -1
- package/client/dist/assets/dashboard-Dc5ZAgMN.js +0 -1
- package/client/dist/assets/dashboard-JMY8ueD3.js +0 -1
- package/client/dist/assets/dashboard-tkWr1aHD2.js +0 -1
- package/client/dist/assets/index-BHPbzyg6.css +0 -2
- package/client/dist/assets/index-n2PmJGF6.js +0 -152
- package/client/dist/assets/jira-BcZzX9122.js +0 -1
- package/client/dist/assets/jira-CTYs7LA12.js +0 -1
- package/client/dist/assets/jira-D2nN39e92.js +0 -1
- package/client/dist/assets/jira-DJxmIkyr.js +0 -1
- package/client/dist/assets/jira-DXMoAKWD.js +0 -1
- package/client/dist/assets/jira-IhC1ROIc.js +0 -1
- package/client/dist/assets/jira-Iw575fN8.js +0 -1
- package/client/dist/assets/jira-kbWZY7jH.js +0 -1
- package/client/dist/assets/jobs-BqF79kHz2.js +0 -1
- package/client/dist/assets/jobs-C1XM5urS.js +0 -1
- package/client/dist/assets/jobs-C5UjG0262.js +0 -1
- package/client/dist/assets/jobs-DBfaHTxC.js +0 -1
- package/client/dist/assets/jobs-DM4BDPdg.js +0 -1
- package/client/dist/assets/jobs-Da5OkZmf2.js +0 -1
- package/client/dist/assets/jobs-JJdnuQ03.js +0 -1
- package/client/dist/assets/jobs-SI34ML8I.js +0 -1
- package/client/dist/assets/loops-BR4FmOv12.js +0 -1
- package/client/dist/assets/loops-BgX_uudn.js +0 -1
- package/client/dist/assets/loops-Bpl2j2LP.js +0 -1
- package/client/dist/assets/loops-CQuuMlyZ.js +0 -1
- package/client/dist/assets/loops-DW8hSMdS2.js +0 -1
- package/client/dist/assets/loops-Q2muu8hW2.js +0 -1
- package/client/dist/assets/loops-q7CNDvfK.js +0 -1
- package/client/dist/assets/settings-CY8udi0e.js +0 -1
- package/client/dist/assets/setup-CNMdCHHt2.js +0 -1
- package/client/dist/assets/setup-Cag4XrbL2.js +0 -1
- package/client/dist/assets/setup-D9IHGoWU.js +0 -1
- package/client/dist/assets/setup-Dg6Ba3JT.js +0 -1
- package/client/dist/assets/setup-DyK36RIW.js +0 -1
- package/client/dist/assets/setup-G4ZvDKxX.js +0 -1
- package/client/dist/assets/setup-aTlGxuwi2.js +0 -1
- package/client/dist/assets/setup-kWsoAeHQ.js +0 -1
- package/client/dist/assets/specs-BFSUPa122.js +0 -1
- package/client/dist/assets/specs-BMzip1WY2.js +0 -1
- package/client/dist/assets/specs-BYeAbIEy.js +0 -1
- package/client/dist/assets/specs-C-mtLcXw.js +0 -1
- package/client/dist/assets/specs-CAzpvADd2.js +0 -1
- package/client/dist/assets/specs-CyRIw_IR.js +0 -1
- package/client/dist/assets/specs-DMm7gB_l.js +0 -1
- package/client/dist/assets/specs-DuottM0Z.js +0 -1
- /package/client/dist/assets/{abap-CpHUwCVK.js → abap-D0E4FfVW.js} +0 -0
- /package/client/dist/assets/{activity-DemHQS7l.js → activity--iN4Ad2R2.js} +0 -0
- /package/client/dist/assets/{activity-B_71BWg3.js → activity-6hM_ZSg9.js} +0 -0
- /package/client/dist/assets/{activity-DHv2V5Oi.js → activity-BZNfOdiS.js} +0 -0
- /package/client/dist/assets/{activity-D0rfjQzT2.js → activity-BuVo5sPB.js} +0 -0
- /package/client/dist/assets/{activity-BpTTj_PH.js → activity-CIOLxGvh.js} +0 -0
- /package/client/dist/assets/{activity-D2e62vbV2.js → activity-D2r2h3SE2.js} +0 -0
- /package/client/dist/assets/{activity-Ch-wbr0C2.js → activity-DtxrAUMo2.js} +0 -0
- /package/client/dist/assets/{addon-image-Ba-TY3wr.js → addon-image-CwoZj17F.js} +0 -0
- /package/client/dist/assets/{addon-ligatures-T4ARLiuu.js → addon-ligatures-CWDrED80.js} +0 -0
- /package/client/dist/assets/{addon-webgl-Cd73n8eh.js → addon-webgl-DMbGeI_u.js} +0 -0
- /package/client/dist/assets/{addspec-xwRX_Pnf.js → addspec-BMtLZLW62.js} +0 -0
- /package/client/dist/assets/{addspec-l_zU5gla.js → addspec-CP0HRuxY.js} +0 -0
- /package/client/dist/assets/{addspec-Dio-H5z0.js → addspec-CRuvWn8d.js} +0 -0
- /package/client/dist/assets/{addspec-D6L4ZteP.js → addspec-D-JLDsUV.js} +0 -0
- /package/client/dist/assets/{addspec-CrEm6Fzr2.js → addspec-DfhDbg5c.js} +0 -0
- /package/client/dist/assets/{addspec-B6Ns8KU02.js → addspec-bsNDdqRm2.js} +0 -0
- /package/client/dist/assets/{addspec-qGyH7MHy2.js → addspec-mgPOt5q02.js} +0 -0
- /package/client/dist/assets/{agents-OzxCLVW1.js → agents-78bTZGZh.js} +0 -0
- /package/client/dist/assets/{agents-hv3sqmPm2.js → agents-BLhWCmDS2.js} +0 -0
- /package/client/dist/assets/{agents-CHgCudUV.js → agents-BUdEi3-N.js} +0 -0
- /package/client/dist/assets/{agents-Dumx4JiM2.js → agents-BpoUaoW92.js} +0 -0
- /package/client/dist/assets/{agents-CnaPeSyw.js → agents-CWo-KyAB.js} +0 -0
- /package/client/dist/assets/{agents-Xh-zYHUx2.js → agents-DDtCJ5M02.js} +0 -0
- /package/client/dist/assets/{agents-DuhLEaQ_.js → agents-bvyRLczL.js} +0 -0
- /package/client/dist/assets/{agentstudio-CCthUdzR.js → agentstudio-BMQxc_bz.js} +0 -0
- /package/client/dist/assets/{agentstudio-CcH8Ckql2.js → agentstudio-COZriimI2.js} +0 -0
- /package/client/dist/assets/{agentstudio-Bo91kfUd2.js → agentstudio-CWgXG5W52.js} +0 -0
- /package/client/dist/assets/{agentstudio-VJOa_NVO.js → agentstudio-C_Jq8Tl4.js} +0 -0
- /package/client/dist/assets/{agentstudio-BIxikDf_.js → agentstudio-Dtq3dGYk.js} +0 -0
- /package/client/dist/assets/{agentstudio-Bz8cP8_c.js → agentstudio-jKMTdT70.js} +0 -0
- /package/client/dist/assets/{agentstudio-DARgYg5Z2.js → agentstudio-sI27TpBu2.js} +0 -0
- /package/client/dist/assets/{aiedit-5ZXN4cep2.js → aiedit-6CHdb_iv2.js} +0 -0
- /package/client/dist/assets/{aiedit-B7gAJZVC.js → aiedit-B03pD_Na.js} +0 -0
- /package/client/dist/assets/{aiedit-D92V-kUW.js → aiedit-BtRqRxML.js} +0 -0
- /package/client/dist/assets/{aiedit-D9ualLVJ.js → aiedit-eMN4eQPF.js} +0 -0
- /package/client/dist/assets/{aiedit-h48tJU0V2.js → aiedit-hknZlly82.js} +0 -0
- /package/client/dist/assets/{aiedit-xkA_mR2a2.js → aiedit-igmw-ZoZ2.js} +0 -0
- /package/client/dist/assets/{aiedit-7B2dvCv-.js → aiedit-pc5JDUq1.js} +0 -0
- /package/client/dist/assets/{analytics-slx4X1mu2.js → analytics-BWMUZ2Pq2.js} +0 -0
- /package/client/dist/assets/{analytics-uRNP6yAJ.js → analytics-Bj-SmKHa.js} +0 -0
- /package/client/dist/assets/{analytics-WF1I49ln.js → analytics-C5dpiS0o.js} +0 -0
- /package/client/dist/assets/{analytics-CBvaxOId.js → analytics-CCprAqk3.js} +0 -0
- /package/client/dist/assets/{analytics-BakymH7Z2.js → analytics-CR1TJqUi2.js} +0 -0
- /package/client/dist/assets/{analytics-B7bPj6u_2.js → analytics-DfNdXR0y2.js} +0 -0
- /package/client/dist/assets/{analytics-DZ74aQ54.js → analytics-rmHuJv0V.js} +0 -0
- /package/client/dist/assets/{apex-DlD7oJX6.js → apex-D_X_8J4d.js} +0 -0
- /package/client/dist/assets/{atom-one-dark-BrRN8wBy.js → atom-one-dark-BMDPFwRZ.js} +0 -0
- /package/client/dist/assets/{attachments-C11tOKZ_.js → attachments-BgBNSqQd.js} +0 -0
- /package/client/dist/assets/{attachments-Bnbyj2PN.js → attachments-BjyMmrwE.js} +0 -0
- /package/client/dist/assets/{attachments-CIeLa8l12.js → attachments-C9GTTJsx2.js} +0 -0
- /package/client/dist/assets/{attachments-DslHfa-L.js → attachments-DCZOL1RU.js} +0 -0
- /package/client/dist/assets/{attachments-C-gyrCOb.js → attachments-DL-bPy9E.js} +0 -0
- /package/client/dist/assets/{attachments-Cxrs0pyL2.js → attachments-DPCmkFZu2.js} +0 -0
- /package/client/dist/assets/{attachments-TTPsc0a52.js → attachments-rNn1ekRy2.js} +0 -0
- /package/client/dist/assets/{azcli-CmXFAbc-.js → azcli-PZLnZ3jH.js} +0 -0
- /package/client/dist/assets/{bat-DdNJq4hH.js → bat-KlBOxpO4.js} +0 -0
- /package/client/dist/assets/{bicep-Bppz7WOA.js → bicep-CgG9oF3V.js} +0 -0
- /package/client/dist/assets/{cameligo-0MRMdSmg.js → cameligo-6R45j6Ph.js} +0 -0
- /package/client/dist/assets/{chat-BvHrebKC2.js → chat-BgL3zv6x2.js} +0 -0
- /package/client/dist/assets/{chat-CZyiLJvQ.js → chat-Bh3NdgJs.js} +0 -0
- /package/client/dist/assets/{chat-DKYP7NnC.js → chat-Bom6bqK3.js} +0 -0
- /package/client/dist/assets/{chat-5mdg_YIc2.js → chat-DdwZjT8K2.js} +0 -0
- /package/client/dist/assets/{chat-wkTIy9rX.js → chat-Dnwg-NpQ.js} +0 -0
- /package/client/dist/assets/{chat-BpYxnkr4.js → chat-DsbwJhus.js} +0 -0
- /package/client/dist/assets/{chat-BGax2nV62.js → chat-vylxqR0P2.js} +0 -0
- /package/client/dist/assets/{clojure-B5dKj863.js → clojure-CLAAMO7J.js} +0 -0
- /package/client/dist/assets/{clsx-1dnHRn8W.js → clsx-CNmW0Nip.js} +0 -0
- /package/client/dist/assets/{coffee-DSbWjzk7.js → coffee-AruSygo-.js} +0 -0
- /package/client/dist/assets/{commands-uz_uKT242.js → commands-C4Y3C-PF2.js} +0 -0
- /package/client/dist/assets/{commands-Bb7MnPqn2.js → commands-CSDs9q_2.js} +0 -0
- /package/client/dist/assets/{commands-C_7zZwJf.js → commands-DkU0qliq.js} +0 -0
- /package/client/dist/assets/{commands-D_6B8lfU.js → commands-JWMfGDmr.js} +0 -0
- /package/client/dist/assets/{commands-DBc5llLi2.js → commands-RHOchN4n2.js} +0 -0
- /package/client/dist/assets/{commands-CQkdthjF.js → commands-u-4eEHCN.js} +0 -0
- /package/client/dist/assets/{commands-DhZNhSbl.js → commands-xHDDGfcP2.js} +0 -0
- /package/client/dist/assets/{cpp-SBF8SAh9.js → cpp-DEE5r4Pw.js} +0 -0
- /package/client/dist/assets/{csharp-Lzuq_1t-.js → csharp-BVXJUvbK.js} +0 -0
- /package/client/dist/assets/{csp-BEzxZqi1.js → csp-cXOF0JoV.js} +0 -0
- /package/client/dist/assets/{css-C3D3PKln.js → css-C_zQuAoy.js} +0 -0
- /package/client/dist/assets/{cypher-CQ3dEPmv.js → cypher-t95m_Q-O.js} +0 -0
- /package/client/dist/assets/{dart-DCPmxolI.js → dart-B4r1Tg-e.js} +0 -0
- /package/client/dist/assets/{dockerfile-B_2_aaTO.js → dockerfile-6mt7zHQw.js} +0 -0
- /package/client/dist/assets/{ecl-rADUeXsV.js → ecl-DEY_Fz_Q.js} +0 -0
- /package/client/dist/assets/{editor.api2-T7u8kQWG.js → editor.api2-C3B0tp2x.js} +0 -0
- /package/client/dist/assets/{elixir-DOd-TuJO.js → elixir-R6-q1c5t.js} +0 -0
- /package/client/dist/assets/{explore-BHEhNekP2.js → explore-B7fblXBb2.js} +0 -0
- /package/client/dist/assets/{explore-DAsroA482.js → explore-BHtEpoNN2.js} +0 -0
- /package/client/dist/assets/{explore-UwHHj2ux.js → explore-C0k8HrkN.js} +0 -0
- /package/client/dist/assets/{explore-DaXiW9-6.js → explore-CNBzrEPS.js} +0 -0
- /package/client/dist/assets/{explore-CWlAXx0f2.js → explore-D_mWBYCS2.js} +0 -0
- /package/client/dist/assets/{explore-DG1CtYqT.js → explore-Dahc1lOx.js} +0 -0
- /package/client/dist/assets/{explore-DMSGAnhK.js → explore-UvW1jEMa.js} +0 -0
- /package/client/dist/assets/{flow9-Bf7zg_j0.js → flow9-CNQvHBOt.js} +0 -0
- /package/client/dist/assets/{format-command-BHymDa4r.js → format-command-CuWuRvka.js} +0 -0
- /package/client/dist/assets/{fsharp-BqROZjbA.js → fsharp-vPZkFXwv.js} +0 -0
- /package/client/dist/assets/{go-oQTP5uLe.js → go-KUzBMYJ_.js} +0 -0
- /package/client/dist/assets/{graphql-CSHfTU3q.js → graphql-C3W0rCsD.js} +0 -0
- /package/client/dist/assets/{hcl-CeG-RoFJ.js → hcl-BOOMFSNX.js} +0 -0
- /package/client/dist/assets/{ini-B2Dv4ohc.js → ini-CFat1WJr.js} +0 -0
- /package/client/dist/assets/{integrations-CAF21FbQ.js → integrations-4KZnYECp.js} +0 -0
- /package/client/dist/assets/{integrations-CHCgning2.js → integrations-7W266oqF2.js} +0 -0
- /package/client/dist/assets/{integrations-B-JVE1_D.js → integrations-BNuauK3o.js} +0 -0
- /package/client/dist/assets/{integrations-BAujIDoE.js → integrations-CHy8tnpV.js} +0 -0
- /package/client/dist/assets/{integrations-DS5FFMes.js → integrations-Cl_wD5AI.js} +0 -0
- /package/client/dist/assets/{integrations-axZN4--n2.js → integrations-Cy8nZ_dv2.js} +0 -0
- /package/client/dist/assets/{integrations-CtsOpq2D2.js → integrations-zMqY4VU12.js} +0 -0
- /package/client/dist/assets/{java-aUDDeufb.js → java-Dee-CNAM.js} +0 -0
- /package/client/dist/assets/{julia-C5LbruO5.js → julia-CGNlLYuU.js} +0 -0
- /package/client/dist/assets/{kotlin-C6mOuSKk.js → kotlin-CY7lhknJ.js} +0 -0
- /package/client/dist/assets/{less-D5qC3caW.js → less-D0KN7hfJ.js} +0 -0
- /package/client/dist/assets/{lexon-Dr2La-fj.js → lexon-CuRJufPs.js} +0 -0
- /package/client/dist/assets/{lua-Zy6u5z6Z.js → lua-DHvH62Zf.js} +0 -0
- /package/client/dist/assets/{m3-C7XHeDz_.js → m3-tlthQ8Fo.js} +0 -0
- /package/client/dist/assets/{markdown-PiF7r-2h.js → markdown-Dbx1LgUZ.js} +0 -0
- /package/client/dist/assets/{mcp-B_nWlxZa2.js → mcp-CjVKXAhD2.js} +0 -0
- /package/client/dist/assets/{mcp-B8omp_Cd.js → mcp-Dcl-XxkR.js} +0 -0
- /package/client/dist/assets/{mcp-DTCCrYHz2.js → mcp-DtbxuH3V2.js} +0 -0
- /package/client/dist/assets/{mcp-DytBbASZ.js → mcp-H-gnQUdN.js} +0 -0
- /package/client/dist/assets/{mcp-D_oPS6Zc.js → mcp-N1nzp8oL.js} +0 -0
- /package/client/dist/assets/{mcp-Cb2jtHP72.js → mcp-XJNRfxVp2.js} +0 -0
- /package/client/dist/assets/{mcp-DPqm2C8-.js → mcp-sRmWE8WJ.js} +0 -0
- /package/client/dist/assets/{mips-nn07GiyE.js → mips-D_O3IUz_.js} +0 -0
- /package/client/dist/assets/{msdax-DaKFVMST.js → msdax-C_ZmCnRt.js} +0 -0
- /package/client/dist/assets/{mysql-C6d6xrbU.js → mysql-C-dCEYSX.js} +0 -0
- /package/client/dist/assets/{nav-Cibp2KWF.js → nav-40HzpIFb.js} +0 -0
- /package/client/dist/assets/{nav-DtTnF9xd.js → nav-8yPhBn00.js} +0 -0
- /package/client/dist/assets/{nav-Danf5sRf2.js → nav-B6PkGfTk2.js} +0 -0
- /package/client/dist/assets/{nav-Bqhyfbcj2.js → nav-BHqMLrS72.js} +0 -0
- /package/client/dist/assets/{nav-CQb9y1km.js → nav-CGy4yx3C.js} +0 -0
- /package/client/dist/assets/{nav-BAsYcqdw2.js → nav-CXEDcRdv2.js} +0 -0
- /package/client/dist/assets/{nav-BRrNlZkr.js → nav-EI_OhEAo.js} +0 -0
- /package/client/dist/assets/{objective-c-B6KMtI-k.js → objective-c-DZY9Aqxd.js} +0 -0
- /package/client/dist/assets/{pascal-DYr8MPE7.js → pascal-BVHLXoor.js} +0 -0
- /package/client/dist/assets/{pascaligo-B3pd-jJ_.js → pascaligo-XdG_6u3k.js} +0 -0
- /package/client/dist/assets/{perl-z2xUzoaL.js → perl-b9QV0BcD.js} +0 -0
- /package/client/dist/assets/{pgsql-DUvT-09-.js → pgsql-Du5FDOgT.js} +0 -0
- /package/client/dist/assets/{php-CGyOmJfy.js → php-WJD0z2Z_.js} +0 -0
- /package/client/dist/assets/{pla-CMqgvyD0.js → pla-CbciTf2w.js} +0 -0
- /package/client/dist/assets/{postiats-Dx5LUn4Z.js → postiats-C1QxmvVq.js} +0 -0
- /package/client/dist/assets/{powerquery-DazYxvJ6.js → powerquery-BEYDhPLZ.js} +0 -0
- /package/client/dist/assets/{powershell-B3nwlDka.js → powershell-CfaYw4XL.js} +0 -0
- /package/client/dist/assets/{protobuf-BGuu2u2s.js → protobuf-pwZEDOYa.js} +0 -0
- /package/client/dist/assets/{pug-Dbte1MXA.js → pug-5ftqSPVe.js} +0 -0
- /package/client/dist/assets/{qsharp-DJLwBOvG.js → qsharp-uI6qZMq4.js} +0 -0
- /package/client/dist/assets/{r-DmGBRSHj.js → r-BK54P1EG.js} +0 -0
- /package/client/dist/assets/{redis-VvUYn0a4.js → redis-DI0yd7kN.js} +0 -0
- /package/client/dist/assets/{redshift-6GdDrxg3.js → redshift-Dov26eyI.js} +0 -0
- /package/client/dist/assets/{restructuredtext-CfAB8aRU.js → restructuredtext-QqJ_1dC-.js} +0 -0
- /package/client/dist/assets/{ruby-CIYK6MXY.js → ruby-5WjveeVb.js} +0 -0
- /package/client/dist/assets/{rust-CTHZfjj9.js → rust-BzVSfqFH.js} +0 -0
- /package/client/dist/assets/{sb-CkKTdkz_.js → sb-DMIUfT-3.js} +0 -0
- /package/client/dist/assets/{scala-Bx-Wr9TM.js → scala-CSKA7lqt.js} +0 -0
- /package/client/dist/assets/{scheme-Dcfi6f83.js → scheme-CojOP2Qc.js} +0 -0
- /package/client/dist/assets/{scss-ByL-7PFQ.js → scss-DoBZGJG6.js} +0 -0
- /package/client/dist/assets/{shell-Csnb9Yqd.js → shell-YOaE4udl.js} +0 -0
- /package/client/dist/assets/{solidity-Dbw5-0QP.js → solidity-l3jSyVLu.js} +0 -0
- /package/client/dist/assets/{sophia-ZQ3saZQx.js → sophia-BhSGTaQJ.js} +0 -0
- /package/client/dist/assets/{sparql-BEtOel8u.js → sparql-qhk6QD9w.js} +0 -0
- /package/client/dist/assets/{sql-DGPDbzB7.js → sql-DoO3y21-.js} +0 -0
- /package/client/dist/assets/{st-GeW2MOgh.js → st-ChZAY8oG.js} +0 -0
- /package/client/dist/assets/{swift-BVYTN8jq.js → swift-D290Tr7_.js} +0 -0
- /package/client/dist/assets/{systemverilog-Deg2a8Lr.js → systemverilog-DsxzgJ-o.js} +0 -0
- /package/client/dist/assets/{tcl-6DnLmROF.js → tcl-BKDUHAAR.js} +0 -0
- /package/client/dist/assets/{terminal-CDiOAmBd2.js → terminal-BRm03iFA2.js} +0 -0
- /package/client/dist/assets/{terminal-CJN-mQMc.js → terminal-De2Brd23.js} +0 -0
- /package/client/dist/assets/{terminal-CYB4TiAd.js → terminal-DxQWCqSD2.js} +0 -0
- /package/client/dist/assets/{terminal-DsaDTq5N2.js → terminal-WSAvHXoU.js} +0 -0
- /package/client/dist/assets/{terminal-DTQ_dPqi2.js → terminal-Z7KsDM_n.js} +0 -0
- /package/client/dist/assets/{terminal-58ReNaya.js → terminal-cqfd3EDV.js} +0 -0
- /package/client/dist/assets/{terminal-DawP8xNL.js → terminal-xGbCZJHg.js} +0 -0
- /package/client/dist/assets/{tickets-DoRTUYRT.js → tickets-B7zT4IRf.js} +0 -0
- /package/client/dist/assets/{tickets-DBfFePwk2.js → tickets-BoXom7l8.js} +0 -0
- /package/client/dist/assets/{tickets-DvohTziT2.js → tickets-C3b8cHhd2.js} +0 -0
- /package/client/dist/assets/{tickets-Da15iaRw.js → tickets-CFXnJsYF.js} +0 -0
- /package/client/dist/assets/{tickets-CujsZvkf.js → tickets-CWYFvx1W2.js} +0 -0
- /package/client/dist/assets/{tickets-Df6pee-O2.js → tickets-DTHo9c3C.js} +0 -0
- /package/client/dist/assets/{tickets-CNvIilmP.js → tickets-SuX_HkK4.js} +0 -0
- /package/client/dist/assets/{twig-XbbXW9Yz.js → twig-UpZQaM8G.js} +0 -0
- /package/client/dist/assets/{typespec-CRlV8GhI.js → typespec-DzaKvN8i.js} +0 -0
- /package/client/dist/assets/{vb-BHE2izPH.js → vb-CZpbb7tk.js} +0 -0
- /package/client/dist/assets/{wgsl-Bf5vkfmY.js → wgsl-CNt3OIvl.js} +0 -0
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AgentChatManager = void 0;
|
|
4
|
+
exports.sanitizeAgentTitle = sanitizeAgentTitle;
|
|
4
5
|
const crypto_1 = require("crypto");
|
|
6
|
+
const readline_1 = require("readline");
|
|
7
|
+
const os_1 = require("os");
|
|
5
8
|
const providers_1 = require("./providers");
|
|
6
9
|
const spawn_lifecycle_1 = require("./spawn-lifecycle");
|
|
10
|
+
const cli_prompt_1 = require("./util/cli-prompt");
|
|
7
11
|
const result_event_1 = require("./result-event");
|
|
8
12
|
const desktop_db_1 = require("./desktop-db");
|
|
9
13
|
const agent_cwd_manager_1 = require("./agent-cwd-manager");
|
|
@@ -29,6 +33,10 @@ class AgentChatManager {
|
|
|
29
33
|
* at settle so an abort is never mistaken for a stale session (auto-heal
|
|
30
34
|
* would resurrect the aborted prompt) nor surfaced as an error. */
|
|
31
35
|
_abortedTurns = new Set();
|
|
36
|
+
/** Fire-and-forget auxiliary children (the AI title spawn) tracked so
|
|
37
|
+
* shutdown() can tree-kill them instead of orphaning them. Self-removed on
|
|
38
|
+
* 'close'/'error'. */
|
|
39
|
+
_auxProcesses = new Set();
|
|
32
40
|
constructor(broadcast, db, port) {
|
|
33
41
|
this._broadcast = broadcast;
|
|
34
42
|
this._db = db;
|
|
@@ -337,6 +345,10 @@ class AgentChatManager {
|
|
|
337
345
|
persistSession(r.sessionId);
|
|
338
346
|
this._broadcast({ type: 'agent_done', conversationId, fullText: r.text, timestamp: timestamp() });
|
|
339
347
|
record(r, 'success');
|
|
348
|
+
// AI title after the FIRST completed turn (industry standard — ChatGPT /
|
|
349
|
+
// Claude.ai), on the conversation's own provider. The deterministic title
|
|
350
|
+
// set at send stays the instant fallback; this upgrades it a moment later.
|
|
351
|
+
this._maybeAiTitle(conversation, userText, r.text);
|
|
340
352
|
return;
|
|
341
353
|
}
|
|
342
354
|
// Failure: reset the session so the NEXT turn starts fresh, and surface the
|
|
@@ -408,6 +420,173 @@ class AgentChatManager {
|
|
|
408
420
|
console.error(`[agent-chat] auto-title failed (${conversationId}):`, err);
|
|
409
421
|
}
|
|
410
422
|
}
|
|
423
|
+
/**
|
|
424
|
+
* Gate + fire the AI title upgrade. Runs ONLY on the first completed assistant
|
|
425
|
+
* turn and ONLY while the stored title is still the deterministic turn-1
|
|
426
|
+
* auto-title (a manual rename is recomputable-detectable and never clobbered),
|
|
427
|
+
* so the cheap spawn is skipped when it would be pointless.
|
|
428
|
+
*/
|
|
429
|
+
_maybeAiTitle(conversation, firstUserMsg, firstResponse) {
|
|
430
|
+
try {
|
|
431
|
+
const conversationId = conversation.id;
|
|
432
|
+
const assistantCount = (0, agent_store_1.listAgentMessages)(this._db, conversationId).filter((m) => m.role === 'assistant').length;
|
|
433
|
+
if (assistantCount !== 1)
|
|
434
|
+
return;
|
|
435
|
+
const deterministic = (0, explore_draft_title_1.generateAutoTitle)([{ role: 'user', content: firstUserMsg }]);
|
|
436
|
+
const fresh = (0, agent_store_1.getAgentConversation)(this._db, conversationId);
|
|
437
|
+
if (!fresh || fresh.title !== deterministic)
|
|
438
|
+
return;
|
|
439
|
+
this._aiTitle(fresh, firstUserMsg, firstResponse);
|
|
440
|
+
}
|
|
441
|
+
catch (err) {
|
|
442
|
+
console.error(`[agent-chat] ai-title gate failed (${conversation.id}):`, err);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Fire-and-forget AI title: a cheap one-shot on the conversation's OWN provider
|
|
447
|
+
* (default model) that summarizes the first exchange into a 3-6 word title.
|
|
448
|
+
* Spawned from an empty tmp cwd so no operator CLAUDE.md / `.mcp.json` /
|
|
449
|
+
* user-scope settings are auto-loaded (leanest possible spawn, no tool wiring).
|
|
450
|
+
* On close it records the billable turn (parity with ChatManager's LOW-1 title
|
|
451
|
+
* accounting), then overwrites the title only if it is STILL the deterministic
|
|
452
|
+
* one (never clobbers a rename made during the ~1s generation). Never throws
|
|
453
|
+
* into the turn path — title generation failing must not surface an error.
|
|
454
|
+
*/
|
|
455
|
+
_aiTitle(conversation, firstUserMsg, firstResponse) {
|
|
456
|
+
try {
|
|
457
|
+
const conversationId = conversation.id;
|
|
458
|
+
const adapter = (0, providers_1.getAdapter)(conversation.provider);
|
|
459
|
+
const model = adapter.defaultModel();
|
|
460
|
+
const prompt = 'Generate a concise 3-6 word title for this conversation. ' +
|
|
461
|
+
'Output ONLY the title text — no quotes, no punctuation, no markdown, no preamble.\n\n' +
|
|
462
|
+
`User: ${firstUserMsg.slice(0, 240)}\nAssistant: ${firstResponse.slice(0, 320)}`;
|
|
463
|
+
const args = adapter.buildArgs('auto-title', { prompt, model });
|
|
464
|
+
const child = (0, cli_prompt_1.spawnAiCli)(adapter.binary, args, {
|
|
465
|
+
env: process.env,
|
|
466
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
467
|
+
cwd: (0, os_1.tmpdir)(),
|
|
468
|
+
});
|
|
469
|
+
this._auxProcesses.add(child);
|
|
470
|
+
let raw = '';
|
|
471
|
+
const events = [];
|
|
472
|
+
const startedAt = new Date().toISOString();
|
|
473
|
+
const reader = (0, readline_1.createInterface)({ input: child.stdout, crlfDelay: Infinity });
|
|
474
|
+
reader.on('line', (line) => {
|
|
475
|
+
const ev = adapter.parseStreamLine(line);
|
|
476
|
+
if (!ev)
|
|
477
|
+
return;
|
|
478
|
+
events.push(ev);
|
|
479
|
+
if (ev.kind === 'text-delta')
|
|
480
|
+
raw += ev.text;
|
|
481
|
+
});
|
|
482
|
+
child.on('error', () => {
|
|
483
|
+
this._auxProcesses.delete(child);
|
|
484
|
+
});
|
|
485
|
+
child.on('close', (code) => {
|
|
486
|
+
this._auxProcesses.delete(child);
|
|
487
|
+
const fresh = (0, agent_store_1.getAgentConversation)(this._db, conversationId);
|
|
488
|
+
if (!fresh)
|
|
489
|
+
return; // deleted mid-generation — FK-safe: skip record + update
|
|
490
|
+
// Cost accounting parity with ChatManager LOW-1: the title spawn is a
|
|
491
|
+
// real billable invocation — record one agent_invocations row.
|
|
492
|
+
this._recordTurn(fresh, adapter, model, { events, startedAt, sessionId: null }, code === 0 ? 'success' : 'failed');
|
|
493
|
+
if (code !== 0)
|
|
494
|
+
return;
|
|
495
|
+
const title = sanitizeAgentTitle(raw);
|
|
496
|
+
if (!title || title === fresh.title)
|
|
497
|
+
return;
|
|
498
|
+
// Never clobber a manual rename made while the title was generating.
|
|
499
|
+
const deterministic = (0, explore_draft_title_1.generateAutoTitle)([{ role: 'user', content: firstUserMsg }]);
|
|
500
|
+
if (fresh.title !== deterministic)
|
|
501
|
+
return;
|
|
502
|
+
(0, agent_store_1.updateAgentConversation)(this._db, conversationId, { title });
|
|
503
|
+
this._broadcast({ type: 'agent_title', conversationId, title, timestamp: new Date().toISOString() });
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
catch (err) {
|
|
507
|
+
console.error(`[agent-chat] ai-title spawn failed (${conversation.id}):`, err);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Post the inline PR-decision card into the conversation that launched the
|
|
512
|
+
* rail (safe-pr-review-flow): persist a `system`-role row whose content is
|
|
513
|
+
* the JSON envelope (so the card survives refresh/cold-load), then broadcast
|
|
514
|
+
* `agent_pr_decision` so open panels render it live. No-ops when the
|
|
515
|
+
* conversation was deleted (the ledger's origin link is a soft reference).
|
|
516
|
+
* NEVER throws — it runs inside rail settle paths.
|
|
517
|
+
*/
|
|
518
|
+
postPrDecisionCard(conversationId, envelope) {
|
|
519
|
+
try {
|
|
520
|
+
if (!(0, agent_store_1.getAgentConversation)(this._db, conversationId)) {
|
|
521
|
+
console.log(`[agent-chat] pr-decision card skipped — conversation gone (${conversationId})`);
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
(0, agent_store_1.addAgentMessage)(this._db, { conversationId, role: 'system', content: JSON.stringify(envelope) });
|
|
525
|
+
this._broadcastPrDecision(conversationId, envelope);
|
|
526
|
+
}
|
|
527
|
+
catch (err) {
|
|
528
|
+
console.error(`[agent-chat] postPrDecisionCard failed (${conversationId}):`, err);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Update the SAME persisted card in place on a later decision transition
|
|
533
|
+
* (matched by `prDeliveryId`), so a cold-load renders the current/terminal
|
|
534
|
+
* state instead of a stale ask — then re-broadcast. Falls back to posting a
|
|
535
|
+
* fresh card when none exists (resilience: e.g. the original post raced a
|
|
536
|
+
* conversation delete/restore). NEVER throws — it runs inside decision paths.
|
|
537
|
+
*/
|
|
538
|
+
updatePrDecisionCard(conversationId, envelope) {
|
|
539
|
+
try {
|
|
540
|
+
const existing = (0, agent_store_1.findAgentSystemMessage)(this._db, conversationId, (content) => {
|
|
541
|
+
try {
|
|
542
|
+
const parsed = JSON.parse(content);
|
|
543
|
+
return parsed.kind === 'pr_decision' && parsed.prDeliveryId === envelope.prDeliveryId;
|
|
544
|
+
}
|
|
545
|
+
catch {
|
|
546
|
+
return false;
|
|
547
|
+
}
|
|
548
|
+
});
|
|
549
|
+
if (!existing) {
|
|
550
|
+
this.postPrDecisionCard(conversationId, envelope);
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
553
|
+
(0, agent_store_1.updateAgentMessageContent)(this._db, existing.id, JSON.stringify(envelope));
|
|
554
|
+
this._broadcastPrDecision(conversationId, envelope);
|
|
555
|
+
}
|
|
556
|
+
catch (err) {
|
|
557
|
+
console.error(`[agent-chat] updatePrDecisionCard failed (${conversationId}):`, err);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
_broadcastPrDecision(conversationId, envelope) {
|
|
561
|
+
this._broadcast({
|
|
562
|
+
type: 'agent_pr_decision',
|
|
563
|
+
conversationId,
|
|
564
|
+
...envelope,
|
|
565
|
+
timestamp: new Date().toISOString(),
|
|
566
|
+
});
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* Edits a still-queued message in place (composer ↑/↓ queue navigation).
|
|
570
|
+
* Returns false when the message is no longer in the queue — the drain loop
|
|
571
|
+
* `shift()`s an item synchronously before spawning its turn, so a false here
|
|
572
|
+
* means "already dispatched (or cleared)" and the router maps it to 409.
|
|
573
|
+
* Success broadcasts `agent_queue_edited` so every open window updates its chip.
|
|
574
|
+
*/
|
|
575
|
+
editQueued(conversationId, queueId, text) {
|
|
576
|
+
const pending = this._queue.get(conversationId);
|
|
577
|
+
const item = pending?.find((q) => q.queueId === queueId);
|
|
578
|
+
if (!item)
|
|
579
|
+
return false;
|
|
580
|
+
item.text = text;
|
|
581
|
+
this._broadcast({
|
|
582
|
+
type: 'agent_queue_edited',
|
|
583
|
+
conversationId,
|
|
584
|
+
queueId,
|
|
585
|
+
text,
|
|
586
|
+
timestamp: new Date().toISOString(),
|
|
587
|
+
});
|
|
588
|
+
return true;
|
|
589
|
+
}
|
|
411
590
|
/** Aborts the active turn for a conversation, if any. Stop means stop: any
|
|
412
591
|
* queued messages are discarded too (broadcast so the client drops chips),
|
|
413
592
|
* and the settling turn is marked aborted so the stale-session auto-heal
|
|
@@ -447,9 +626,41 @@ class AgentChatManager {
|
|
|
447
626
|
}
|
|
448
627
|
}
|
|
449
628
|
this._active.clear();
|
|
629
|
+
for (const child of this._auxProcesses) {
|
|
630
|
+
try {
|
|
631
|
+
child.kill('SIGTERM');
|
|
632
|
+
}
|
|
633
|
+
catch {
|
|
634
|
+
/* ignore */
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
this._auxProcesses.clear();
|
|
450
638
|
}
|
|
451
639
|
_emitError(conversationId, error) {
|
|
452
640
|
this._broadcast({ type: 'agent_error', conversationId, error, timestamp: new Date().toISOString() });
|
|
453
641
|
}
|
|
454
642
|
}
|
|
455
643
|
exports.AgentChatManager = AgentChatManager;
|
|
644
|
+
const MAX_AI_TITLE_LEN = 80;
|
|
645
|
+
/**
|
|
646
|
+
* Coerce a model's title output into a clean single-line title: first non-empty
|
|
647
|
+
* line, surrounding quotes / markdown emphasis / leading list markers stripped,
|
|
648
|
+
* whitespace collapsed, word-aware length cap. Returns '' when nothing usable
|
|
649
|
+
* remains (the caller then keeps the deterministic title).
|
|
650
|
+
*/
|
|
651
|
+
function sanitizeAgentTitle(raw) {
|
|
652
|
+
const firstLine = raw.split('\n').map((s) => s.trim()).find((s) => s.length > 0) ?? '';
|
|
653
|
+
const stripped = firstLine
|
|
654
|
+
.replace(/^[\s>*_#-]+/, '') // leading markdown/list markers
|
|
655
|
+
.replace(/^["'`]+/, '')
|
|
656
|
+
.replace(/["'`*_\s]+$/, '')
|
|
657
|
+
.replace(/\s+/g, ' ')
|
|
658
|
+
.trim();
|
|
659
|
+
if (!stripped)
|
|
660
|
+
return '';
|
|
661
|
+
if (stripped.length <= MAX_AI_TITLE_LEN)
|
|
662
|
+
return stripped;
|
|
663
|
+
const head = stripped.slice(0, MAX_AI_TITLE_LEN);
|
|
664
|
+
const lastSpace = head.lastIndexOf(' ');
|
|
665
|
+
return (lastSpace > 20 ? head.slice(0, lastSpace) : head).trim() + '…';
|
|
666
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setAgentChatManager = setAgentChatManager;
|
|
4
|
+
exports.getAgentChatManager = getAgentChatManager;
|
|
5
|
+
// ─── Agent-chat manager registry (safe-pr-review-flow) ────────────────────────
|
|
6
|
+
//
|
|
7
|
+
// The AgentChatManager instance is a non-exported local of index.ts's startup,
|
|
8
|
+
// but the rails layer (rail-isolated-launch / the pr-decision endpoint) must
|
|
9
|
+
// reach it to post/update the inline PR-decision card into the launching
|
|
10
|
+
// conversation. This process-wide singleton is the reference path — mirroring
|
|
11
|
+
// the `setActiveProject` pattern in mcp/tools/types.ts — so rails code never
|
|
12
|
+
// imports index.ts (circular). It stays null in tests and when agent chat is
|
|
13
|
+
// disabled; callers use `getAgentChatManager()?.…` (null-safe).
|
|
14
|
+
let _manager = null;
|
|
15
|
+
function setAgentChatManager(m) {
|
|
16
|
+
_manager = m;
|
|
17
|
+
}
|
|
18
|
+
function getAgentChatManager() {
|
|
19
|
+
return _manager;
|
|
20
|
+
}
|
|
@@ -307,6 +307,28 @@ function createAgentChatRouter(deps) {
|
|
|
307
307
|
void manager.sendMessage(conversation.id, text, { tierLevel, model, attachmentIds, queueId }).catch((e) => console.error('[agent-chat] send failed:', e));
|
|
308
308
|
res.status(202).json({ accepted: true, queued });
|
|
309
309
|
});
|
|
310
|
+
// Edit a still-queued (not yet dispatched) message in place. 409 when the
|
|
311
|
+
// queue already consumed it — the client keeps the user's text as a draft so
|
|
312
|
+
// nothing is lost (never-lose-input semantics).
|
|
313
|
+
router.patch('/conversations/:id/queue/:queueId', (req, res) => {
|
|
314
|
+
const conversation = (0, agent_store_1.getAgentConversation)(desktopDb, String(req.params.id));
|
|
315
|
+
if (!conversation) {
|
|
316
|
+
res.status(404).json({ error: 'Unknown conversation' });
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
const body = (req.body ?? {});
|
|
320
|
+
const text = typeof body.text === 'string' ? body.text.trim() : '';
|
|
321
|
+
if (!text) {
|
|
322
|
+
res.status(400).json({ error: 'text is required' });
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
const edited = manager.editQueued(conversation.id, String(req.params.queueId), text);
|
|
326
|
+
if (!edited) {
|
|
327
|
+
res.status(409).json({ error: 'Message already dispatched' });
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
res.json({ ok: true });
|
|
331
|
+
});
|
|
310
332
|
router.post('/conversations/:id/abort', (req, res) => {
|
|
311
333
|
const aborted = manager.abort(String(req.params.id));
|
|
312
334
|
res.json({ aborted });
|
|
@@ -13,6 +13,7 @@ const fs_1 = __importDefault(require("fs"));
|
|
|
13
13
|
const path_1 = __importDefault(require("path"));
|
|
14
14
|
const os_1 = __importDefault(require("os"));
|
|
15
15
|
const path_resolver_1 = require("./path-resolver");
|
|
16
|
+
const win_spawn_1 = require("./util/win-spawn");
|
|
16
17
|
const agent_tier_1 = require("./agent-tier");
|
|
17
18
|
// ─── Agent MCP wiring (design D8 / D1) ────────────────────────────────────────
|
|
18
19
|
//
|
|
@@ -42,9 +43,16 @@ function fileExists(p) {
|
|
|
42
43
|
* Climbs from this module so it works whether running from server/ or server/dist/.
|
|
43
44
|
*/
|
|
44
45
|
function resolveBridgeScript() {
|
|
46
|
+
// Tauri's resource_dir() delivers `\\?\C:\…` verbatim paths on Windows; a
|
|
47
|
+
// `\\?\`-prefixed script argument crashes node's module loader (EISDIR
|
|
48
|
+
// lstat 'C:'), leaving the MCP server perpetually "connecting". Strip here
|
|
49
|
+
// as defence-in-depth even though ensureWindowsBaseEnv() normalizes the var.
|
|
45
50
|
const fromEnv = process.env.SPECRAILS_BUNDLED_MCP_BRIDGE_PATH;
|
|
46
|
-
if (fromEnv
|
|
47
|
-
|
|
51
|
+
if (fromEnv) {
|
|
52
|
+
const cleaned = (0, win_spawn_1.stripWindowsVerbatimPrefix)(fromEnv);
|
|
53
|
+
if (fileExists(cleaned))
|
|
54
|
+
return cleaned;
|
|
55
|
+
}
|
|
48
56
|
const roots = [
|
|
49
57
|
path_1.default.resolve(__dirname, '..'),
|
|
50
58
|
path_1.default.resolve(__dirname, '..', '..'),
|
|
@@ -67,6 +75,9 @@ function resolveBridgeScript() {
|
|
|
67
75
|
function resolveNodeCommand() {
|
|
68
76
|
return (0, path_resolver_1.resolveBundledNodeExe)() ?? 'node';
|
|
69
77
|
}
|
|
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}$/;
|
|
70
81
|
/** Build the `mcpServers.specrails` entry the agent (or a project workspace) uses. */
|
|
71
82
|
function buildSpecrailsMcpEntry(opts) {
|
|
72
83
|
const bridge = resolveBridgeScript();
|
|
@@ -82,6 +93,9 @@ function buildSpecrailsMcpEntry(opts) {
|
|
|
82
93
|
env[agent_tier_1.AGENT_TIER_ENV] = (0, agent_tier_1.tierNameForLevel)(opts.tierLevel);
|
|
83
94
|
if (opts.activeProjectId)
|
|
84
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
|
+
}
|
|
85
99
|
return { command: resolveNodeCommand(), args: [bridge], env };
|
|
86
100
|
}
|
|
87
101
|
/**
|
|
@@ -124,7 +138,12 @@ function mergeSpecrailsIntoWorkspaceMcp(workspaceDir, port) {
|
|
|
124
138
|
* `[]` when the bridge can't be located (agent then runs tool-less / degraded).
|
|
125
139
|
*/
|
|
126
140
|
function buildAgentMcpArgs(opts) {
|
|
127
|
-
const entry = buildSpecrailsMcpEntry({
|
|
141
|
+
const entry = buildSpecrailsMcpEntry({
|
|
142
|
+
port: opts.port,
|
|
143
|
+
tierLevel: opts.tierLevel,
|
|
144
|
+
activeProjectId: opts.activeProjectId,
|
|
145
|
+
conversationId: opts.conversationId,
|
|
146
|
+
});
|
|
128
147
|
if (!entry)
|
|
129
148
|
return [];
|
|
130
149
|
if (!/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(opts.conversationId)) {
|
|
@@ -179,6 +198,7 @@ function prepareAgentMcp(opts) {
|
|
|
179
198
|
port: opts.port,
|
|
180
199
|
tierLevel: opts.tierLevel,
|
|
181
200
|
activeProjectId: opts.activeProjectId,
|
|
201
|
+
conversationId: opts.conversationId,
|
|
182
202
|
});
|
|
183
203
|
if (!entry)
|
|
184
204
|
return { extraArgs: [], env: {} };
|
|
@@ -191,6 +211,28 @@ function prepareAgentMcp(opts) {
|
|
|
191
211
|
}
|
|
192
212
|
// gemini + any other project-json provider: write .mcp.json in the spawn cwd.
|
|
193
213
|
const file = path_1.default.join(opts.cwd, '.mcp.json');
|
|
214
|
+
mergeServerIntoJsonFile(file, entry);
|
|
215
|
+
if (opts.adapterId === 'gemini') {
|
|
216
|
+
// gemini-cli has NEVER read .mcp.json (a Claude convention) — its only MCP
|
|
217
|
+
// surface is `mcpServers` in settings.json (user or <cwd>/.gemini project
|
|
218
|
+
// scope), and an UNTRUSTED cwd suppresses MCP entirely (headless run exits
|
|
219
|
+
// 55 with FatalUntrustedWorkspaceError on 0.49). So: register in the
|
|
220
|
+
// project-scope settings file AND trust the app-owned agent cwd per-spawn
|
|
221
|
+
// via env — the same pattern every other gemini spawn path already uses
|
|
222
|
+
// (chat-manager / queue-manager / cli-prompt). Verified empirically against
|
|
223
|
+
// gemini-cli 0.49.0 (see docs/internals note on FQN tool prefixing).
|
|
224
|
+
const geminiDir = path_1.default.join(opts.cwd, '.gemini');
|
|
225
|
+
fs_1.default.mkdirSync(geminiDir, { recursive: true });
|
|
226
|
+
mergeServerIntoJsonFile(path_1.default.join(geminiDir, 'settings.json'), entry);
|
|
227
|
+
return { extraArgs: [], env: { GEMINI_CLI_TRUST_WORKSPACE: 'true' } };
|
|
228
|
+
}
|
|
229
|
+
return { extraArgs: [], env: {} };
|
|
230
|
+
}
|
|
231
|
+
/** Merge `mcpServers.specrails` into a JSON config file (read-if-exists,
|
|
232
|
+
* preserve every other key, corrupt file → start fresh, chmod 600). Shape is
|
|
233
|
+
* shared by claude-style `.mcp.json` and gemini `.gemini/settings.json` —
|
|
234
|
+
* both carry a top-level `mcpServers` object. */
|
|
235
|
+
function mergeServerIntoJsonFile(file, entry) {
|
|
194
236
|
let current = {};
|
|
195
237
|
try {
|
|
196
238
|
if (fs_1.default.existsSync(file)) {
|
|
@@ -204,5 +246,4 @@ function prepareAgentMcp(opts) {
|
|
|
204
246
|
}
|
|
205
247
|
const next = { ...current, mcpServers: { ...(current.mcpServers ?? {}), specrails: entry } };
|
|
206
248
|
fs_1.default.writeFileSync(file, JSON.stringify(next, null, 2), { mode: 0o600 });
|
|
207
|
-
return { extraArgs: [], env: {} };
|
|
208
249
|
}
|