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
|
@@ -14,6 +14,7 @@ const ids_1 = require("./ids");
|
|
|
14
14
|
const win_spawn_1 = require("./util/win-spawn");
|
|
15
15
|
const types_1 = require("./types");
|
|
16
16
|
const command_resolver_1 = require("./command-resolver");
|
|
17
|
+
const rail_isolation_1 = require("./rail-isolation");
|
|
17
18
|
const cli_prompt_1 = require("./util/cli-prompt");
|
|
18
19
|
const stream_display_1 = require("./util/stream-display");
|
|
19
20
|
const hooks_1 = require("./hooks");
|
|
@@ -241,6 +242,16 @@ class QueueManager {
|
|
|
241
242
|
/** Pending per-job interactive flag keyed by jobId — read at spawn time.
|
|
242
243
|
* In-memory only (mirrors _jobModelSelection). */
|
|
243
244
|
_jobInteractiveSelection;
|
|
245
|
+
/** Per-job PR-delivery mode (safe-pr-workflow), captured ONCE at spawn time by
|
|
246
|
+
* the SAME `isRailPrDeliveryEnabled()` read that injects
|
|
247
|
+
* SPECRAILS_GIT_AUTO=false — so a mid-flight env flip can never split one job
|
|
248
|
+
* between the ask-first on_review parking and the legacy done promotion.
|
|
249
|
+
* Restart-durable by construction (like the interactive gate): a queued job
|
|
250
|
+
* that survives a restart recomputes the flag at its own spawn. Consumed at
|
|
251
|
+
* settle (_onJobExit / _settleInteractiveJob) to thread
|
|
252
|
+
* `ticketCompletionStatus` into onJobFinished; cleared on every terminal
|
|
253
|
+
* path. In-memory only. */
|
|
254
|
+
_jobPrDelivery;
|
|
244
255
|
/** Live interactive job sessions keyed by jobId (the resident persistent-stdin
|
|
245
256
|
* child + per-turn accounting). Present only while an interactive job runs. */
|
|
246
257
|
_interactiveSessions;
|
|
@@ -290,6 +301,7 @@ class QueueManager {
|
|
|
290
301
|
this._snapshotRefs = new Map();
|
|
291
302
|
this._jobExecution = new Map();
|
|
292
303
|
this._jobInteractiveSelection = new Map();
|
|
304
|
+
this._jobPrDelivery = new Map();
|
|
293
305
|
this._interactiveSessions = new Map();
|
|
294
306
|
this._jobLiveAccounting = new Map();
|
|
295
307
|
this._forceFailedRowJobs = new Set();
|
|
@@ -373,6 +385,7 @@ class QueueManager {
|
|
|
373
385
|
this._snapshotRefs.clear();
|
|
374
386
|
this._jobExecution.clear();
|
|
375
387
|
this._jobResolvedProvider.clear();
|
|
388
|
+
this._jobPrDelivery.clear();
|
|
376
389
|
this._jobLiveAccounting.clear();
|
|
377
390
|
this._openspecShims.clear();
|
|
378
391
|
// Drop the DB reference last so any in-flight 'close' callback sees null
|
|
@@ -540,10 +553,12 @@ class QueueManager {
|
|
|
540
553
|
if (resolvedOpts?.model) {
|
|
541
554
|
this._jobModelSelection.set(id, resolvedOpts.model);
|
|
542
555
|
}
|
|
543
|
-
// Record per-job interactive
|
|
544
|
-
//
|
|
545
|
-
|
|
546
|
-
|
|
556
|
+
// Record per-job interactive OVERRIDE only when explicitly provided
|
|
557
|
+
// (tri-state — see EnqueueOptions.interactive). Absent ⇒ the spawn-time
|
|
558
|
+
// default decides, so a queued job that survives a restart (map lost)
|
|
559
|
+
// still spawns interactive.
|
|
560
|
+
if (typeof resolvedOpts?.interactive === 'boolean') {
|
|
561
|
+
this._jobInteractiveSelection.set(id, resolvedOpts.interactive);
|
|
547
562
|
}
|
|
548
563
|
// Insert at the correct position based on priority (higher priority first, FIFO within same level)
|
|
549
564
|
const weight = types_1.PRIORITY_WEIGHT[priority];
|
|
@@ -689,10 +704,17 @@ class QueueManager {
|
|
|
689
704
|
getLogBuffer() {
|
|
690
705
|
return [...this._logBuffer];
|
|
691
706
|
}
|
|
692
|
-
/** True while an interactive
|
|
707
|
+
/** True while an interactive session is resident for this job. */
|
|
693
708
|
isInteractiveJob(jobId) {
|
|
694
709
|
return this._interactiveSessions.has(jobId);
|
|
695
710
|
}
|
|
711
|
+
/** Settle mode of the LIVE interactive session for this job ('finalize' for
|
|
712
|
+
* ultracode, 'auto' for everything else), or null when no session is
|
|
713
|
+
* resident (unknown / not interactive / already settled). Feeds the
|
|
714
|
+
* `interactiveSettleMode` field on GET /jobs/:id. */
|
|
715
|
+
getInteractiveSettleMode(jobId) {
|
|
716
|
+
return this._interactiveSessions.get(jobId)?.getSettleMode() ?? null;
|
|
717
|
+
}
|
|
696
718
|
/** Feed one more user prompt to a running interactive job (queued behind the
|
|
697
719
|
* active turn). Returns false when the job isn't an active interactive
|
|
698
720
|
* session (unknown / already finalized / not interactive). */
|
|
@@ -1049,6 +1071,7 @@ class QueueManager {
|
|
|
1049
1071
|
this._jobProviderSelection.delete(jobId);
|
|
1050
1072
|
this._jobResolvedProvider.delete(jobId);
|
|
1051
1073
|
this._jobInteractiveSelection.delete(jobId);
|
|
1074
|
+
this._jobPrDelivery.delete(jobId);
|
|
1052
1075
|
this._jobLiveAccounting.delete(jobId);
|
|
1053
1076
|
// A wedged job may have had its openspec shim materialised already (the
|
|
1054
1077
|
// wedge can land after _startJob's shim setup). Mirror the settle path.
|
|
@@ -1170,14 +1193,17 @@ class QueueManager {
|
|
|
1170
1193
|
return (0, ticket_store_1.resolveTicketStoragePath)(this._cwd ?? process.cwd());
|
|
1171
1194
|
}
|
|
1172
1195
|
/**
|
|
1173
|
-
* Spawn an interactive
|
|
1174
|
-
*
|
|
1175
|
-
*
|
|
1176
|
-
*
|
|
1177
|
-
*
|
|
1178
|
-
*
|
|
1196
|
+
* Spawn an interactive session. The job row is created with the `interactive`
|
|
1197
|
+
* flag set; the resident child runs the first turn (the ultracode prompt, or
|
|
1198
|
+
* the slash command itself — spike-verified to expand over stream-json stdin)
|
|
1199
|
+
* and stays alive for follow-up turns until settle. `_activeProcess` is left
|
|
1200
|
+
* null — the session owns the child; the active SLOT (`_activeJobId`,
|
|
1201
|
+
* reserved by _drainQueue) is held until settle. QueueManager's own zombie
|
|
1202
|
+
* timer is never armed for interactive jobs; 'auto' sessions instead run
|
|
1203
|
+
* their OWN wedge detector on the same inactivity budget, while 'finalize'
|
|
1204
|
+
* sessions idle awaiting the human by design (no timer).
|
|
1179
1205
|
*/
|
|
1180
|
-
_startInteractiveJob(jobId, job, adapter, spec, firstPrompt) {
|
|
1206
|
+
_startInteractiveJob(jobId, job, adapter, spec, firstPrompt, settleMode) {
|
|
1181
1207
|
if (this._db) {
|
|
1182
1208
|
try {
|
|
1183
1209
|
(0, db_1.createJob)(this._db, {
|
|
@@ -1201,6 +1227,10 @@ class QueueManager {
|
|
|
1201
1227
|
adapter,
|
|
1202
1228
|
broadcast: this._broadcast,
|
|
1203
1229
|
onSettle: (info) => this._settleInteractiveJob(jobId, info),
|
|
1230
|
+
settleMode,
|
|
1231
|
+
// Auto sessions arm a wedge detector on the SAME inactivity budget the
|
|
1232
|
+
// one-shot path uses; finalize sessions idle awaiting the human.
|
|
1233
|
+
zombieTimeoutMs: settleMode === 'auto' ? this._zombieTimeoutMs : undefined,
|
|
1204
1234
|
});
|
|
1205
1235
|
this._interactiveSessions.set(jobId, session);
|
|
1206
1236
|
session.start(spec, firstPrompt);
|
|
@@ -1208,10 +1238,13 @@ class QueueManager {
|
|
|
1208
1238
|
}
|
|
1209
1239
|
/**
|
|
1210
1240
|
* Terminal bookkeeping for an interactive job (called once by the session's
|
|
1211
|
-
* onSettle
|
|
1212
|
-
*
|
|
1213
|
-
*
|
|
1214
|
-
*
|
|
1241
|
+
* onSettle — human finalize, auto-quiescence, wedge, or crash). Releases the
|
|
1242
|
+
* active slot, stamps the job's terminal status + finished_at (token/cost
|
|
1243
|
+
* totals were already accumulated per turn), writes a single ai_invocations
|
|
1244
|
+
* row with the summed usage, records Code-Explorer provenance against the
|
|
1245
|
+
* pre-spawn snapshot, enforces cost alerts + daily budgets, fires the
|
|
1246
|
+
* rail/ticket completion callback + dependent/pipeline bookkeeping, and
|
|
1247
|
+
* drains the queue.
|
|
1215
1248
|
*/
|
|
1216
1249
|
_settleInteractiveJob(jobId, info) {
|
|
1217
1250
|
this._interactiveSessions.delete(jobId);
|
|
@@ -1219,10 +1252,20 @@ class QueueManager {
|
|
|
1219
1252
|
this._activeProcess = null;
|
|
1220
1253
|
this._activeJobId = null;
|
|
1221
1254
|
}
|
|
1222
|
-
//
|
|
1223
|
-
//
|
|
1255
|
+
// Consume the pre-spawn provenance snapshot + the resolved execution
|
|
1256
|
+
// context BEFORE any early return (mirrors _onJobExit) so a disposed/
|
|
1257
|
+
// unknown-job settle can never leak the map entries.
|
|
1258
|
+
const snapshot = this._snapshotRefs.get(jobId);
|
|
1224
1259
|
this._snapshotRefs.delete(jobId);
|
|
1260
|
+
const jobExecution = this._jobExecution.get(jobId);
|
|
1261
|
+
this._jobExecution.delete(jobId);
|
|
1262
|
+
const provenanceRepoDir = jobExecution?.repoDir ?? this._cwd;
|
|
1225
1263
|
this._jobResolvedProvider.delete(jobId);
|
|
1264
|
+
// Consume the spawn-captured PR-delivery mode (before any early return so a
|
|
1265
|
+
// disposed/unknown-job settle can never leak the entry). Decides whether a
|
|
1266
|
+
// COMPLETED job's tickets park at on_review (ask-first) or done (legacy).
|
|
1267
|
+
const prDelivery = this._jobPrDelivery.get(jobId) ?? false;
|
|
1268
|
+
this._jobPrDelivery.delete(jobId);
|
|
1226
1269
|
// Clean up the per-job openspec PATH shim (relocated claude rails only).
|
|
1227
1270
|
this._cleanupOpenspecShim(jobId);
|
|
1228
1271
|
if (this._disposed)
|
|
@@ -1234,14 +1277,26 @@ class QueueManager {
|
|
|
1234
1277
|
}
|
|
1235
1278
|
const wasCanceling = this._cancelingJobs.has(jobId);
|
|
1236
1279
|
this._cancelingJobs.delete(jobId);
|
|
1280
|
+
// Zero-work strictness: a session whose WHOLE life consumed no model work
|
|
1281
|
+
// (the claude CLI's synthetic `Unknown command:` result frame — num_turns
|
|
1282
|
+
// 0, no assistant events, zero usage tokens) settles FAILED even on a
|
|
1283
|
+
// clean finalize (either settle mode): the job's command never actually
|
|
1284
|
+
// ran. A multi-turn session where only the LAST turn was synthetic
|
|
1285
|
+
// accumulated real work and still completes (the predicate is
|
|
1286
|
+
// whole-session — see isZeroWorkSettle in interactive-job-session.ts).
|
|
1237
1287
|
const finalStatus = wasCanceling
|
|
1238
1288
|
? 'canceled'
|
|
1239
|
-
: info.reason === 'finalized'
|
|
1289
|
+
: info.reason === 'finalized' && !info.zeroWork
|
|
1240
1290
|
? 'completed'
|
|
1241
1291
|
: 'failed';
|
|
1242
1292
|
job.status = finalStatus;
|
|
1243
1293
|
job.finishedAt = new Date().toISOString();
|
|
1244
|
-
job.exitCode = info.reason === 'finalized' ? 0 : 1;
|
|
1294
|
+
job.exitCode = info.reason === 'finalized' && finalStatus !== 'failed' ? 0 : 1;
|
|
1295
|
+
// Result text for output chaining between dependent pipeline steps — the
|
|
1296
|
+
// same field the one-shot path captures from its last `result` event.
|
|
1297
|
+
if (info.resultText != null) {
|
|
1298
|
+
job.resultText = info.resultText;
|
|
1299
|
+
}
|
|
1245
1300
|
const totals = info.totals;
|
|
1246
1301
|
if (this._db) {
|
|
1247
1302
|
try {
|
|
@@ -1287,6 +1342,18 @@ class QueueManager {
|
|
|
1287
1342
|
console.error('[queue-manager] recordInvocation (interactive) failed:', err);
|
|
1288
1343
|
}
|
|
1289
1344
|
}
|
|
1345
|
+
// Code-Explorer post-settle provenance hook — the interactive lifecycle
|
|
1346
|
+
// equivalent of _onJobExit's post-exit diff (pre-spawn snapshot taken in
|
|
1347
|
+
// _startJob's interactive branch, against the REPO dir, never the
|
|
1348
|
+
// workspace).
|
|
1349
|
+
this._recordProvenance(jobId, job.command, provenanceRepoDir, snapshot);
|
|
1350
|
+
// Cost alerts + daily-budget enforcement. Interactive is the DEFAULT
|
|
1351
|
+
// spawn path for claude jobs now, so its settle must trip the same
|
|
1352
|
+
// thresholds and caps the one-shot exit path does.
|
|
1353
|
+
if (totals.total_cost_usd > 0 && finalStatus === 'completed') {
|
|
1354
|
+
this._emitCostAlerts(jobId, totals.total_cost_usd);
|
|
1355
|
+
}
|
|
1356
|
+
this._enforceDailyBudget();
|
|
1290
1357
|
}
|
|
1291
1358
|
this._persistJob(job);
|
|
1292
1359
|
this._broadcast({
|
|
@@ -1300,12 +1367,31 @@ class QueueManager {
|
|
|
1300
1367
|
this._broadcastQueueState();
|
|
1301
1368
|
if (this._onJobFinished) {
|
|
1302
1369
|
try {
|
|
1303
|
-
|
|
1370
|
+
if (finalStatus === 'completed') {
|
|
1371
|
+
// Thread the spawn-captured PR-delivery mode: under the ask-first
|
|
1372
|
+
// methodology a completed job's tickets park at on_review, never done.
|
|
1373
|
+
// Failure statuses keep the legacy 3-arg call shape (the field is
|
|
1374
|
+
// completion-only).
|
|
1375
|
+
this._onJobFinished(jobId, finalStatus, totals.total_cost_usd, {
|
|
1376
|
+
ticketCompletionStatus: prDelivery ? 'on_review' : 'done',
|
|
1377
|
+
});
|
|
1378
|
+
}
|
|
1379
|
+
else {
|
|
1380
|
+
this._onJobFinished(jobId, finalStatus, totals.total_cost_usd);
|
|
1381
|
+
}
|
|
1304
1382
|
}
|
|
1305
1383
|
catch (err) {
|
|
1306
1384
|
console.error(`[QueueManager] onJobFinished failed for ${jobId}: ${err.message}`);
|
|
1307
1385
|
}
|
|
1308
1386
|
}
|
|
1387
|
+
// Dependent-job + pipeline bookkeeping (mirrors _onJobExit) — chained /
|
|
1388
|
+
// template jobs flow through the interactive settle path by default now.
|
|
1389
|
+
if (finalStatus !== 'completed') {
|
|
1390
|
+
this._skipDependents(jobId, `Parent job ${jobId} ${finalStatus}`);
|
|
1391
|
+
}
|
|
1392
|
+
if (job.pipelineId) {
|
|
1393
|
+
this._checkPipelineStatus(job.pipelineId);
|
|
1394
|
+
}
|
|
1309
1395
|
this._drainQueue();
|
|
1310
1396
|
}
|
|
1311
1397
|
async _startJob(jobId) {
|
|
@@ -1360,6 +1446,28 @@ class QueueManager {
|
|
|
1360
1446
|
(0, hooks_1.resetPhases)(phaseScopeId, this._broadcast);
|
|
1361
1447
|
}
|
|
1362
1448
|
const commandToRun = job.command.trim();
|
|
1449
|
+
// ─── Interactive-by-default gate (spawn-time, restart-durable) ──────────
|
|
1450
|
+
// Spike-verified (2026-07-03, claude 2.1.198): the claude CLI expands slash
|
|
1451
|
+
// commands arriving as stream-json stdin user frames exactly like the argv
|
|
1452
|
+
// `-p "/cmd"` path, so EVERY claude job (implement/batch/custom commands,
|
|
1453
|
+
// not just ultracode prose) is prompt-compatible with the persistent-stdin
|
|
1454
|
+
// transport. The default is therefore interactive whenever the kill-switch
|
|
1455
|
+
// is on and the resolved adapter supports persistent stdin (claude only
|
|
1456
|
+
// today); codex/gemini always take the legacy one-shot spawn below.
|
|
1457
|
+
// EnqueueOptions.interactive is a per-job OVERRIDE: false forces legacy,
|
|
1458
|
+
// true forces interactive where capable, undefined = default ON. Derived
|
|
1459
|
+
// HERE (spawn time), not at enqueue, so a queued job that survives a server
|
|
1460
|
+
// restart (selection map lost) still spawns interactive.
|
|
1461
|
+
const isUltracode = adapter.id === 'claude' && exports.ULTRACODE_COMMAND_RE.test(commandToRun);
|
|
1462
|
+
const interactiveOverride = this._jobInteractiveSelection.get(jobId);
|
|
1463
|
+
this._jobInteractiveSelection.delete(jobId);
|
|
1464
|
+
const spawnInteractive = (0, feature_flags_1.isInteractiveJobsEnabled)() &&
|
|
1465
|
+
adapter.capabilities.persistentStdin &&
|
|
1466
|
+
(interactiveOverride ?? true);
|
|
1467
|
+
// Ultracode sessions idle awaiting the human (settle only on explicit
|
|
1468
|
+
// Finalize — the pre-flip behaviour); every other command auto-settles the
|
|
1469
|
+
// moment a turn result lands with nothing queued behind it.
|
|
1470
|
+
const interactiveSettleMode = isUltracode ? 'finalize' : 'auto';
|
|
1363
1471
|
// Build supplementary context (output chaining + headless mode) that goes
|
|
1364
1472
|
// into --append-system-prompt, keeping the user prompt clean.
|
|
1365
1473
|
let systemAppend = '';
|
|
@@ -1401,18 +1509,28 @@ class QueueManager {
|
|
|
1401
1509
|
systemAppend += `Previous step output:\n\n${truncated}\n\n---\n\nNow execute the following command.\n\n`;
|
|
1402
1510
|
}
|
|
1403
1511
|
}
|
|
1404
|
-
// Headless mode: when --yes is in the command, instruct Claude to auto-proceed
|
|
1405
|
-
//
|
|
1512
|
+
// Headless mode: when --yes is in the command, instruct Claude to auto-proceed.
|
|
1513
|
+
// For a LEGACY one-shot spawn stdin is genuinely disconnected; for an
|
|
1514
|
+
// INTERACTIVE session stdin IS connected (a human may inject guidance), so
|
|
1515
|
+
// the wording softens — autonomous by default, steering welcome — without
|
|
1516
|
+
// re-opening approval prompts.
|
|
1406
1517
|
if (job.command.includes('--yes')) {
|
|
1407
|
-
systemAppend +=
|
|
1408
|
-
'
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
'
|
|
1415
|
-
|
|
1518
|
+
systemAppend += spawnInteractive
|
|
1519
|
+
? '\n\nCRITICAL — AUTONOMOUS MODE WITH LIVE GUIDANCE (--yes flag):\n' +
|
|
1520
|
+
'This pipeline runs autonomously end-to-end, but a human operator MAY inject guidance messages while it runs (stdin IS connected).\n' +
|
|
1521
|
+
'- NEVER stop to ask for approval, confirmation, review, or feedback. When options exist, choose the RECOMMENDED one and proceed.\n' +
|
|
1522
|
+
'- Auto-approve all proposals, designs, and artifacts; skip instructions that say "wait for user" or "present for review".\n' +
|
|
1523
|
+
'- If a human message arrives mid-run, treat it as steering: incorporate the guidance and continue the plan without pausing.\n' +
|
|
1524
|
+
'- Answer direct questions from the human concisely, then resume the remaining work until the plan is complete.'
|
|
1525
|
+
: '\n\nCRITICAL — FULLY AUTONOMOUS MODE (--yes flag):\n' +
|
|
1526
|
+
'This pipeline is running headless with NO human operator. stdin is disconnected — nobody can reply.\n' +
|
|
1527
|
+
'- NEVER ask for approval, confirmation, review, or feedback. There is nobody to answer.\n' +
|
|
1528
|
+
'- NEVER output prompts like "Reply with approved", "Do you want to proceed?", "Please confirm", or "Ready for review".\n' +
|
|
1529
|
+
'- NEVER stop between pipeline phases to wait for input. Run ALL phases end-to-end without pausing.\n' +
|
|
1530
|
+
'- When there are multiple options or decisions, always choose the RECOMMENDED option and proceed.\n' +
|
|
1531
|
+
'- Auto-approve all proposals, designs, and artifacts. Treat everything as "approved" by default.\n' +
|
|
1532
|
+
'- Skip any instructions that say "wait for user", "present for review", or "ask the user".\n' +
|
|
1533
|
+
'- The pipeline must complete fully from start to finish in a single uninterrupted run.';
|
|
1416
1534
|
}
|
|
1417
1535
|
// Local ticket store: implement/batch-implement jobs must read specs from
|
|
1418
1536
|
// .specrails/local-tickets.json — never from external trackers like Jira/Linear.
|
|
@@ -1449,7 +1567,7 @@ class QueueManager {
|
|
|
1449
1567
|
// pre-prompt + spec text directly as the prompt. The server route guards
|
|
1450
1568
|
// that ultracode never reaches a non-claude adapter; defensively, a codex
|
|
1451
1569
|
// adapter still falls through to its skill-translation path below.
|
|
1452
|
-
|
|
1570
|
+
// (`isUltracode` itself is resolved above, before the systemAppend build.)
|
|
1453
1571
|
const railPrompt = isUltracode
|
|
1454
1572
|
? this._buildUltracodePrompt(commandToRun)
|
|
1455
1573
|
: adapter.id === 'codex'
|
|
@@ -1655,24 +1773,54 @@ class QueueManager {
|
|
|
1655
1773
|
}
|
|
1656
1774
|
}
|
|
1657
1775
|
}
|
|
1658
|
-
//
|
|
1659
|
-
//
|
|
1660
|
-
//
|
|
1661
|
-
//
|
|
1662
|
-
//
|
|
1663
|
-
//
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1776
|
+
// Safe-PR flow: when active (SPECRAILS_RAIL_DELIVER_PR on), desktop owns version
|
|
1777
|
+
// control — tell specrails-core's implement to be git-agnostic (skip its Ship
|
|
1778
|
+
// phase) via SPECRAILS_GIT_AUTO=false so it never opens an uncoordinated PR
|
|
1779
|
+
// alongside the app's own draft-PR delivery. Default ON (flag=0/false/off disables).
|
|
1780
|
+
// The flag is read ONCE per job, HERE (spawn time — mirroring
|
|
1781
|
+
// launchIsolatedRail's prMode capture), and recorded so the settle paths park
|
|
1782
|
+
// this job's tickets under the SAME value that shaped the spawn env: a
|
|
1783
|
+
// completed job promotes its tickets to on_review (ask-first) instead of
|
|
1784
|
+
// done. A mid-flight env flip can never split one job across the two
|
|
1785
|
+
// methodologies.
|
|
1786
|
+
const prDelivery = (0, rail_isolation_1.isRailPrDeliveryEnabled)();
|
|
1787
|
+
this._jobPrDelivery.set(jobId, prDelivery);
|
|
1788
|
+
if (prDelivery) {
|
|
1789
|
+
spawnEnv = { ...spawnEnv, SPECRAILS_GIT_AUTO: 'false' };
|
|
1790
|
+
}
|
|
1791
|
+
// ─── Interactive branch (default for persistent-stdin providers) ───────
|
|
1792
|
+
// Hand off to a resident persistent-stdin session instead of the one-shot
|
|
1793
|
+
// spawn below. Ultracode keeps 'finalize' settle-mode (idles until the
|
|
1794
|
+
// human Finalizes); every other command runs 'auto' (the session settles
|
|
1795
|
+
// itself the moment a turn result lands with nothing queued). Code-Explorer
|
|
1796
|
+
// provenance is captured around the SESSION lifecycle exactly like the
|
|
1797
|
+
// one-shot path: pre-spawn snapshot here, diff at settle.
|
|
1798
|
+
if (spawnInteractive) {
|
|
1799
|
+
if ((0, feature_flags_1.isCodeExplorerEnabled)()) {
|
|
1800
|
+
try {
|
|
1801
|
+
const snap = (0, file_provenance_1.snapshotWorkingTree)(execution.repoDir);
|
|
1802
|
+
this._snapshotRefs.set(jobId, snap);
|
|
1803
|
+
}
|
|
1804
|
+
catch (err) {
|
|
1805
|
+
console.warn(`[queue-manager] provenance snapshot failed: ${err.message}`);
|
|
1806
|
+
}
|
|
1807
|
+
}
|
|
1667
1808
|
const interactiveArgs = adapter.buildArgs('chat-stream', {
|
|
1668
1809
|
// chat-stream feeds the prompt over stdin per-turn, so the argv `prompt`
|
|
1669
1810
|
// is unused — pass empty to satisfy the shared SpawnOptions shape.
|
|
1670
1811
|
prompt: '',
|
|
1671
|
-
|
|
1812
|
+
// Ultracode's prose prompt brings no system prompt of its own, so the
|
|
1813
|
+
// supplementary context rides `--system-prompt` (byte-identical to the
|
|
1814
|
+
// pre-flip interactive-ultracode spawn). A slash-command job's EXPANDED
|
|
1815
|
+
// command brings its own system prompt — mirror the legacy rail-job
|
|
1816
|
+
// spawn and APPEND on top of the CLI default instead of replacing it.
|
|
1817
|
+
systemPrompt: isUltracode ? (systemAppend || undefined) : undefined,
|
|
1672
1818
|
model: railModel,
|
|
1673
|
-
extraArgs:
|
|
1819
|
+
extraArgs: !isUltracode && systemAppend
|
|
1820
|
+
? ['--append-system-prompt', systemAppend, ...(railExtraArgs ?? [])]
|
|
1821
|
+
: railExtraArgs,
|
|
1674
1822
|
});
|
|
1675
|
-
this._startInteractiveJob(jobId, job, adapter, { binary, args: interactiveArgs, cwd: spawnCwd, env: spawnEnv }, railPrompt);
|
|
1823
|
+
this._startInteractiveJob(jobId, job, adapter, { binary, args: interactiveArgs, cwd: spawnCwd, env: spawnEnv }, railPrompt, interactiveSettleMode);
|
|
1676
1824
|
return;
|
|
1677
1825
|
}
|
|
1678
1826
|
// Code-Explorer pre-spawn snapshot. Captures the working-tree state via
|
|
@@ -1906,6 +2054,11 @@ class QueueManager {
|
|
|
1906
2054
|
// Reclaim the live-accounting handle unconditionally (shutdown flush no longer
|
|
1907
2055
|
// needs it once the child has exited).
|
|
1908
2056
|
this._jobLiveAccounting.delete(jobId);
|
|
2057
|
+
// Consume the spawn-captured PR-delivery mode (before any early return so a
|
|
2058
|
+
// disposed/unknown-job exit can never leak the entry). Decides whether a
|
|
2059
|
+
// COMPLETED job's tickets park at on_review (ask-first) or done (legacy).
|
|
2060
|
+
const prDelivery = this._jobPrDelivery.get(jobId) ?? false;
|
|
2061
|
+
this._jobPrDelivery.delete(jobId);
|
|
1909
2062
|
const provenanceRepoDir = jobExecution?.repoDir ?? this._cwd;
|
|
1910
2063
|
// Clean up the per-job openspec PATH shim (relocated claude rails only),
|
|
1911
2064
|
// BEFORE any early return, so a disposed/unknown-job exit can't leak the
|
|
@@ -2024,24 +2177,7 @@ class QueueManager {
|
|
|
2024
2177
|
// the pre-spawn snapshot and inserts one row per touched path. Gated by
|
|
2025
2178
|
// SPECRAILS_CODE_EXPLORER (re-checked at each completion so the flag can
|
|
2026
2179
|
// be flipped off mid-session without leaving partial writes).
|
|
2027
|
-
|
|
2028
|
-
const ref = snapshot?.ref ?? '';
|
|
2029
|
-
try {
|
|
2030
|
-
const diff = (0, file_provenance_1.diffAgainstSnapshot)(provenanceRepoDir, ref, snapshot?.untracked, snapshot?.headSha);
|
|
2031
|
-
const patches = (0, file_provenance_1.collectDiffPatches)(provenanceRepoDir, ref, diff, snapshot?.headSha);
|
|
2032
|
-
if (diff.length > 50) {
|
|
2033
|
-
console.warn(`[provenance.large_job] job=${jobId} files=${diff.length}`);
|
|
2034
|
-
}
|
|
2035
|
-
const ticketIds = this._extractTicketIds(job.command);
|
|
2036
|
-
const rows = (0, file_provenance_1.recordProvenanceForJob)(this._db, this._projectId, jobId, ticketIds[0] ?? null, diff, Date.now(), patches);
|
|
2037
|
-
for (const row of rows) {
|
|
2038
|
-
(0, file_provenance_1.broadcastProvenanceUpdated)(this._broadcast, this._projectId, row);
|
|
2039
|
-
}
|
|
2040
|
-
}
|
|
2041
|
-
catch (err) {
|
|
2042
|
-
console.warn(`[queue-manager] provenance recording failed: ${err.message}`);
|
|
2043
|
-
}
|
|
2044
|
-
}
|
|
2180
|
+
this._recordProvenance(jobId, job.command, provenanceRepoDir, snapshot);
|
|
2045
2181
|
// Cost comes from the normalised result so providers without a native
|
|
2046
2182
|
// total_cost_usd field (codex today) still trigger cost alerts based on
|
|
2047
2183
|
// the pricing-table estimate. When `estimated`, the figure is best-
|
|
@@ -2051,26 +2187,8 @@ class QueueManager {
|
|
|
2051
2187
|
const costStr = jobCost != null ? ` | cost: ${estimated ? '~' : ''}$${jobCost.toFixed(4)}` : '';
|
|
2052
2188
|
emitLine('stdout', `[process exited with code ${code ?? 'unknown'}${costStr}]`);
|
|
2053
2189
|
// Cost alert: check per-job threshold (app-level, then per-project).
|
|
2054
|
-
// These prepared statements touch the DB, which may have been closed
|
|
2055
|
-
// mid-job; guard so a throw never escapes the child 'close' listener.
|
|
2056
2190
|
if (jobCost != null && finalStatus === 'completed') {
|
|
2057
|
-
|
|
2058
|
-
const desktopThreshold = this._getCostAlertThreshold?.() ?? null;
|
|
2059
|
-
if (desktopThreshold != null && jobCost >= desktopThreshold) {
|
|
2060
|
-
this._broadcast({ type: 'cost_alert', projectId: '', jobId, cost: jobCost, threshold: desktopThreshold });
|
|
2061
|
-
}
|
|
2062
|
-
// Per-project job cost threshold (alerts independently of app threshold)
|
|
2063
|
-
const projectThresholdRow = this._db.prepare(`SELECT value FROM queue_state WHERE key = 'config.job_cost_threshold_usd'`).get();
|
|
2064
|
-
if (projectThresholdRow) {
|
|
2065
|
-
const projectThreshold = parseFloat(projectThresholdRow.value);
|
|
2066
|
-
if (projectThreshold > 0 && jobCost >= projectThreshold) {
|
|
2067
|
-
this._broadcast({ type: 'cost_alert', projectId: '', jobId, cost: jobCost, threshold: projectThreshold });
|
|
2068
|
-
}
|
|
2069
|
-
}
|
|
2070
|
-
}
|
|
2071
|
-
catch (err) {
|
|
2072
|
-
console.error('[queue-manager] cost-alert bookkeeping failed (db unavailable?):', err);
|
|
2073
|
-
}
|
|
2191
|
+
this._emitCostAlerts(jobId, jobCost);
|
|
2074
2192
|
}
|
|
2075
2193
|
// ─── Daily-budget enforcement (MED-5) ───────────────────────────────────
|
|
2076
2194
|
// Runs on EVERY terminal exit, not just completed jobs: a failed/aborted
|
|
@@ -2100,7 +2218,18 @@ class QueueManager {
|
|
|
2100
2218
|
catch (err) {
|
|
2101
2219
|
console.error('[queue-manager] cost read for webhook failed (db unavailable?):', err);
|
|
2102
2220
|
}
|
|
2103
|
-
|
|
2221
|
+
if (finalStatus === 'completed') {
|
|
2222
|
+
// Thread the spawn-captured PR-delivery mode: under the ask-first
|
|
2223
|
+
// methodology a completed job's tickets park at on_review, never done.
|
|
2224
|
+
// Failure statuses keep the legacy 3-arg call shape (the field is
|
|
2225
|
+
// completion-only).
|
|
2226
|
+
this._onJobFinished(jobId, finalStatus, costUsd ?? undefined, {
|
|
2227
|
+
ticketCompletionStatus: prDelivery ? 'on_review' : 'done',
|
|
2228
|
+
});
|
|
2229
|
+
}
|
|
2230
|
+
else {
|
|
2231
|
+
this._onJobFinished(jobId, finalStatus, costUsd ?? undefined);
|
|
2232
|
+
}
|
|
2104
2233
|
}
|
|
2105
2234
|
// Handle dependent jobs: skip them if parent did not complete successfully
|
|
2106
2235
|
if (finalStatus !== 'completed') {
|
|
@@ -2113,6 +2242,61 @@ class QueueManager {
|
|
|
2113
2242
|
this._broadcastQueueState();
|
|
2114
2243
|
this._drainQueue();
|
|
2115
2244
|
}
|
|
2245
|
+
/**
|
|
2246
|
+
* Code-Explorer provenance recording, shared by the one-shot exit path
|
|
2247
|
+
* (_onJobExit) and the interactive settle path (_settleInteractiveJob).
|
|
2248
|
+
* Diffs the REPO working tree against the pre-spawn snapshot and inserts one
|
|
2249
|
+
* `file_provenance` row per touched path, broadcasting each. Gated by
|
|
2250
|
+
* SPECRAILS_CODE_EXPLORER (re-checked at each completion so the flag can be
|
|
2251
|
+
* flipped off mid-session without leaving partial writes). Best-effort.
|
|
2252
|
+
*/
|
|
2253
|
+
_recordProvenance(jobId, command, provenanceRepoDir, snapshot) {
|
|
2254
|
+
if (!(0, feature_flags_1.isCodeExplorerEnabled)() || !provenanceRepoDir || !this._projectId || !this._db)
|
|
2255
|
+
return;
|
|
2256
|
+
const ref = snapshot?.ref ?? '';
|
|
2257
|
+
try {
|
|
2258
|
+
const diff = (0, file_provenance_1.diffAgainstSnapshot)(provenanceRepoDir, ref, snapshot?.untracked, snapshot?.headSha);
|
|
2259
|
+
const patches = (0, file_provenance_1.collectDiffPatches)(provenanceRepoDir, ref, diff, snapshot?.headSha);
|
|
2260
|
+
if (diff.length > 50) {
|
|
2261
|
+
console.warn(`[provenance.large_job] job=${jobId} files=${diff.length}`);
|
|
2262
|
+
}
|
|
2263
|
+
const ticketIds = this._extractTicketIds(command);
|
|
2264
|
+
const rows = (0, file_provenance_1.recordProvenanceForJob)(this._db, this._projectId, jobId, ticketIds[0] ?? null, diff, Date.now(), patches);
|
|
2265
|
+
for (const row of rows) {
|
|
2266
|
+
(0, file_provenance_1.broadcastProvenanceUpdated)(this._broadcast, this._projectId, row);
|
|
2267
|
+
}
|
|
2268
|
+
}
|
|
2269
|
+
catch (err) {
|
|
2270
|
+
console.warn(`[queue-manager] provenance recording failed: ${err.message}`);
|
|
2271
|
+
}
|
|
2272
|
+
}
|
|
2273
|
+
/**
|
|
2274
|
+
* Per-job cost alerts (app-level threshold, then per-project threshold),
|
|
2275
|
+
* shared by the one-shot exit path and the interactive settle path. The
|
|
2276
|
+
* prepared statement touches the DB, which may have been closed mid-job;
|
|
2277
|
+
* guarded so a throw never escapes a child 'close'/settle listener.
|
|
2278
|
+
*/
|
|
2279
|
+
_emitCostAlerts(jobId, jobCost) {
|
|
2280
|
+
if (!this._db)
|
|
2281
|
+
return;
|
|
2282
|
+
try {
|
|
2283
|
+
const desktopThreshold = this._getCostAlertThreshold?.() ?? null;
|
|
2284
|
+
if (desktopThreshold != null && jobCost >= desktopThreshold) {
|
|
2285
|
+
this._broadcast({ type: 'cost_alert', projectId: '', jobId, cost: jobCost, threshold: desktopThreshold });
|
|
2286
|
+
}
|
|
2287
|
+
// Per-project job cost threshold (alerts independently of app threshold)
|
|
2288
|
+
const projectThresholdRow = this._db.prepare(`SELECT value FROM queue_state WHERE key = 'config.job_cost_threshold_usd'`).get();
|
|
2289
|
+
if (projectThresholdRow) {
|
|
2290
|
+
const projectThreshold = parseFloat(projectThresholdRow.value);
|
|
2291
|
+
if (projectThreshold > 0 && jobCost >= projectThreshold) {
|
|
2292
|
+
this._broadcast({ type: 'cost_alert', projectId: '', jobId, cost: jobCost, threshold: projectThreshold });
|
|
2293
|
+
}
|
|
2294
|
+
}
|
|
2295
|
+
}
|
|
2296
|
+
catch (err) {
|
|
2297
|
+
console.error('[queue-manager] cost-alert bookkeeping failed (db unavailable?):', err);
|
|
2298
|
+
}
|
|
2299
|
+
}
|
|
2116
2300
|
_resetZombieTimer() {
|
|
2117
2301
|
if (this._zombieTimeoutMs <= 0)
|
|
2118
2302
|
return;
|
|
@@ -2268,6 +2452,7 @@ class QueueManager {
|
|
|
2268
2452
|
this._jobProviderSelection.delete(jobId);
|
|
2269
2453
|
this._jobResolvedProvider.delete(jobId);
|
|
2270
2454
|
this._jobInteractiveSelection.delete(jobId);
|
|
2455
|
+
this._jobPrDelivery.delete(jobId);
|
|
2271
2456
|
this._jobLiveAccounting.delete(jobId);
|
|
2272
2457
|
this._cleanupOpenspecShim(jobId);
|
|
2273
2458
|
this._activeProcess = null;
|