specrails-desktop 2.36.0 → 2.42.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -247
- package/client/dist/assets/ActivityFeedPage-DoEMumQS.js +1 -0
- package/client/dist/assets/AgentBrowserCapture-DIh4K0gh.js +1 -0
- package/client/dist/assets/AgentModeAnalyticsPane-mbq4WEoO.js +2 -0
- package/client/dist/assets/AgentModeCodePane-CKh7zuA4.js +2 -0
- package/client/dist/assets/AgentModeJobsPane-BDokPiLJ.js +1 -0
- package/client/dist/assets/AgentsPage-BFVAZbBj.js +87 -0
- package/client/dist/assets/AnalyticsPage-3Y9LuWwz.js +1 -0
- package/client/dist/assets/CodePage-C9KyuV_C.js +3 -0
- package/client/dist/assets/DesktopAnalyticsPage-Bhi54bXQ.js +1 -0
- package/client/dist/assets/{DocsDialog-C76VdBJC.js → DocsDialog-Dj6mt4ga.js} +2 -2
- package/client/dist/assets/{DocsPage-ziMlj6B6.js → DocsPage-24yWglNI.js} +1 -1
- package/client/dist/assets/ExportDropdown-ophapHrT.js +1 -0
- package/client/dist/assets/InteractiveJobComposer-C1ucmxQh.js +19 -0
- package/client/dist/assets/JobDetailModal-DNWmgVHD.js +1 -0
- package/client/dist/assets/JobDetailPage-BcajZyuu.js +1 -0
- package/client/dist/assets/JobsPage-B9nTZw6e.js +1 -0
- package/client/dist/assets/LoopBuilderPage-Oc48iOFW.js +7 -0
- package/client/dist/assets/LoopPreviewModal-ae0Fr6SU.js +1 -0
- package/client/dist/assets/LoopsPage-CUEqzUBI.js +1 -0
- package/client/dist/assets/MinimizedChatsContext-Deg39peL.js +1 -0
- package/client/dist/assets/PluginsPage-C1xtARIx.js +2 -0
- package/client/dist/assets/ProjectSettingsDialog-JZzrXFBN.js +1 -0
- package/client/dist/assets/RepositoryDeliveries-CSDsiVUz.js +5 -0
- package/client/dist/assets/RepositoryScopeSelector-D-RCaknl.js +1 -0
- package/client/dist/assets/ReviewPacketPage-x5EfGTiL.js +1 -0
- package/client/dist/assets/TemplatePreviewModal-BSyuZxGq.js +1 -0
- package/client/dist/assets/TicketDetailModalContext-DqyF0so-.js +14 -0
- package/client/dist/assets/Trans-SnMX4MhW.js +1 -0
- package/client/dist/assets/agent-BdT0SB1D.js +1 -0
- package/client/dist/assets/agent-Bh9K7iEt.js +1 -0
- package/client/dist/assets/agent-C4ibdFk9.js +1 -0
- package/client/dist/assets/agent-CSFY22Zo.js +1 -0
- package/client/dist/assets/agent-DAnqxUn8.js +1 -0
- package/client/dist/assets/agent-DTQiu0Mi.js +1 -0
- package/client/dist/assets/agent-T54WuR_Y.js +1 -0
- package/client/dist/assets/agent-i75WDZOA.js +1 -0
- package/client/dist/assets/browser-05vRDg_y.js +1 -0
- package/client/dist/assets/browser-Bulb-cB1.js +1 -0
- package/client/dist/assets/browser-C7f-Jsg1.js +1 -0
- package/client/dist/assets/browser-CG0PE1j_.js +1 -0
- package/client/dist/assets/browser-CMzaqAjo.js +1 -0
- package/client/dist/assets/browser-DMajYdNX.js +1 -0
- package/client/dist/assets/browser-DxcOHrdP.js +1 -0
- package/client/dist/assets/browser-ObE7xVo3.js +1 -0
- package/client/dist/assets/builder-765NeYTp.js +1 -0
- package/client/dist/assets/builder-8MG3V6ea.js +1 -0
- package/client/dist/assets/builder-B-1UBs5K.js +1 -0
- package/client/dist/assets/builder-BTiGnPT0.js +1 -0
- package/client/dist/assets/builder-Cx9Rz-7u.js +1 -0
- package/client/dist/assets/builder-DKFMELBl.js +1 -0
- package/client/dist/assets/builder-OcmKrC0h.js +1 -0
- package/client/dist/assets/builder-P9qVBXFZ.js +1 -0
- package/client/dist/assets/{button-CJqFnUOL.js → button-DCBqEaZl.js} +1 -1
- package/client/dist/assets/{code-CkUuW4m9.js → code-B37GRg9C.js} +1 -1
- package/client/dist/assets/{code-B0O8-p8k.js → code-BBOEZbf9.js} +1 -1
- package/client/dist/assets/{code-B1VLZDhS.js → code-BRm-jcyx.js} +1 -1
- package/client/dist/assets/{code-Bpj4Ddml.js → code-CF7w62CR.js} +1 -1
- package/client/dist/assets/{code-BykBZ5-e.js → code-CLuvJt2r.js} +1 -1
- package/client/dist/assets/{code-B86IMAfz.js → code-D0RCm59f.js} +1 -1
- package/client/dist/assets/code-DaZ-ZwCT.js +1 -0
- package/client/dist/assets/{code-cAqaqMTx.js → code-iIHkGaCL.js} +1 -1
- package/client/dist/assets/commands-0XjAftla.js +1 -0
- package/client/dist/assets/commands-BAWSYHjQ.js +1 -0
- package/client/dist/assets/commands-BBwowgiE.js +1 -0
- package/client/dist/assets/commands-BacjIZLN.js +1 -0
- package/client/dist/assets/commands-Bs62IAZ3.js +1 -0
- package/client/dist/assets/commands-CLPdh-Hh.js +1 -0
- package/client/dist/assets/commands-DlbFzgrp.js +1 -0
- package/client/dist/assets/commands-LjPSsi5F.js +1 -0
- package/client/dist/assets/common-B5AZNYMH.js +1 -0
- package/client/dist/assets/common-BFZ0c_vN.js +1 -0
- package/client/dist/assets/common-BrlwEnL7.js +1 -0
- package/client/dist/assets/common-BttQx3z4.js +1 -0
- package/client/dist/assets/common-CM65k_-e.js +1 -0
- package/client/dist/assets/common-D4mvFFlu.js +1 -0
- package/client/dist/assets/common-TZ9Ny96S.js +1 -0
- package/client/dist/assets/common-nFpSF4GC.js +1 -0
- package/client/dist/assets/dashboard-B14uYXkG.js +1 -0
- package/client/dist/assets/dashboard-BK_mez-z.js +1 -0
- package/client/dist/assets/dashboard-BfBir_6o.js +1 -0
- package/client/dist/assets/dashboard-Bt0cCzeG.js +1 -0
- package/client/dist/assets/dashboard-BwkjxI6H.js +1 -0
- package/client/dist/assets/{dashboard-C8WOEiPu.js → dashboard-C3bDKf7s.js} +1 -1
- package/client/dist/assets/dashboard-CdvjGfog.js +1 -0
- package/client/dist/assets/dashboard-fRrP0Kv0.js +1 -0
- package/client/dist/assets/dialog-SRw01_QU.js +45 -0
- package/client/dist/assets/dist-js-CJ_2XX1Y.js +1 -0
- package/client/dist/assets/formatDistanceToNow-DSj5DprF.js +1 -0
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-YhD8rIEs.js +1 -0
- package/client/dist/assets/index-DwAmL7m5.css +2 -0
- package/client/dist/assets/index-EzrkUb8B.js +76 -0
- package/client/dist/assets/{jira-api-B1-MUehg.js → jira-api-CSCqGr-Q.js} +1 -1
- package/client/dist/assets/{jobs-CN_zv4Gr.js → jobs-B8rrzfyZ.js} +1 -1
- package/client/dist/assets/{jobs-DUlWSYq2.js → jobs-BS6RTurf.js} +1 -1
- package/client/dist/assets/{jobs-Bpks6doU.js → jobs-BTT0Bsks.js} +1 -1
- package/client/dist/assets/{jobs-Bgq-PZkC.js → jobs-CezU69AE.js} +1 -1
- package/client/dist/assets/{jobs-SwYS2M-B.js → jobs-ClFJae0s.js} +1 -1
- package/client/dist/assets/{jobs-BAls3bWq.js → jobs-DJSFIFVy.js} +1 -1
- package/client/dist/assets/{jobs-DhxKgWFq.js → jobs-DhgGr8vm.js} +1 -1
- package/client/dist/assets/{jobs-B_TeSQxb.js → jobs-DzMjUcaN.js} +1 -1
- package/client/dist/assets/mcp-6rMoZfEO.js +1 -0
- package/client/dist/assets/mcp-BD8sL5mP.js +1 -0
- package/client/dist/assets/mcp-BkcA3I5s.js +1 -0
- package/client/dist/assets/mcp-CCpSelOh.js +1 -0
- package/client/dist/assets/mcp-CUAN6ORK.js +1 -0
- package/client/dist/assets/mcp-CqbRxRTE.js +1 -0
- package/client/dist/assets/mcp-DP2YfVhO.js +1 -0
- package/client/dist/assets/mcp-DUVQamDz.js +1 -0
- package/client/dist/assets/narration-B-ynWTpn.js +1 -0
- package/client/dist/assets/narration-Bj_laZwg.js +1 -0
- package/client/dist/assets/narration-BxHpmMv_.js +1 -0
- package/client/dist/assets/narration-C1Px0-0j.js +1 -0
- package/client/dist/assets/narration-CAXhGbzM.js +1 -0
- package/client/dist/assets/narration-DQ1l_Kq6.js +1 -0
- package/client/dist/assets/narration-XISXwqZd.js +1 -0
- package/client/dist/assets/narration-kwzfglQo.js +1 -0
- package/client/dist/assets/nav-1-Hh2kOz.js +1 -0
- package/client/dist/assets/nav-B34QkESm.js +1 -0
- package/client/dist/assets/nav-Bap_UXAq.js +1 -0
- package/client/dist/assets/{nav-pYuXq7sf.js → nav-BwxXIB24.js} +1 -1
- package/client/dist/assets/nav-Ch-zHBG5.js +1 -0
- package/client/dist/assets/nav-CygC_WN-.js +1 -0
- package/client/dist/assets/{nav-iwjCg5FR.js → nav-KnnLQtOQ.js} +1 -1
- package/client/dist/assets/nav-m00uxYUG.js +1 -0
- package/client/dist/assets/packet-BQ2tXfJI.js +1 -0
- package/client/dist/assets/packet-BdpOJ1Cy.js +1 -0
- package/client/dist/assets/packet-C3Ievb9R.js +1 -0
- package/client/dist/assets/packet-C4zJIG0Y.js +1 -0
- package/client/dist/assets/packet-Cx-zRuWn.js +1 -0
- package/client/dist/assets/packet-DUTGX52M.js +1 -0
- package/client/dist/assets/packet-DhsKtUPB.js +1 -0
- package/client/dist/assets/packet-z3LJ8Zyy.js +1 -0
- package/client/dist/assets/project-repositories-DYhTvwQ1.js +1 -0
- package/client/dist/assets/provider-capabilities-B-wOHfLP.js +1 -0
- package/client/dist/assets/settings-BBt2xtDQ.js +1 -0
- package/client/dist/assets/settings-BJB9RKJj.js +1 -0
- package/client/dist/assets/settings-CHwQR2rB.js +1 -0
- package/client/dist/assets/settings-CrMi3kSi.js +1 -0
- package/client/dist/assets/settings-DKyhDGD1.js +1 -0
- package/client/dist/assets/settings-Deupji9c.js +1 -0
- package/client/dist/assets/settings-DqRMmwAM.js +1 -0
- package/client/dist/assets/settings-J4rj6vo-.js +1 -0
- package/client/dist/assets/setup-2xGgu4Sk.js +1 -0
- package/client/dist/assets/setup-Ba11l2JA.js +1 -0
- package/client/dist/assets/setup-BzW4kMok.js +1 -0
- package/client/dist/assets/setup-COzwYhkJ.js +1 -0
- package/client/dist/assets/setup-CRVULhtF.js +1 -0
- package/client/dist/assets/setup-DgvlxwpE.js +1 -0
- package/client/dist/assets/setup-Dw_wYeEY.js +1 -0
- package/client/dist/assets/setup-ZPtEeJPW.js +1 -0
- package/client/dist/assets/spending-BqbdPm_4.js +1 -0
- package/client/dist/assets/square-Ci-PFcFe.js +1 -0
- package/client/dist/assets/{terminal-BFRZnMPP.js → terminal-BAzpHtpY.js} +1 -1
- package/client/dist/assets/{terminal-IahE4LW9.js → terminal-C7dHeR3x.js} +1 -1
- package/client/dist/assets/{terminal-tITa81iz.js → terminal-CMla5Qsz.js} +1 -1
- package/client/dist/assets/{terminal-BZiIu3rf.js → terminal-CdNXH-n9.js} +1 -1
- package/client/dist/assets/{terminal-ScjyXNxQ.js → terminal-Cw5bZsmV.js} +1 -1
- package/client/dist/assets/{terminal-C2NAd7BW.js → terminal-DFUP4eNv.js} +1 -1
- package/client/dist/assets/{terminal-d7GadXbN.js → terminal-DGqljeK_.js} +1 -1
- package/client/dist/assets/{terminal-QpXZU2Bn.js → terminal-cU70NodO.js} +1 -1
- package/client/dist/assets/useDesktop-RSMTyy7V.js +1 -0
- package/client/dist/assets/useSharedWebSocket-BOdS5_Iz.js +2 -0
- package/client/dist/index.html +34 -35
- package/docs/README.md +3 -0
- package/docs/agent-live-steering.md +57 -0
- package/docs/ci-cd.md +57 -0
- package/docs/code-explorer.md +48 -0
- package/docs/codex.md +12 -1
- package/docs/features/detachable-mission-windows.md +59 -0
- package/docs/guide/de/integrations/5-mcp-server.md +13 -9
- package/docs/guide/de/integrations/6-agent-chat.md +1 -0
- package/docs/guide/en/integrations/5-mcp-server.md +13 -9
- package/docs/guide/en/integrations/6-agent-chat.md +1 -0
- package/docs/guide/es/integrations/5-mcp-server.md +13 -9
- package/docs/guide/es/integrations/6-agent-chat.md +1 -0
- package/docs/guide/fr/integrations/5-mcp-server.md +13 -9
- package/docs/guide/fr/integrations/6-agent-chat.md +1 -0
- package/docs/guide/it/integrations/5-mcp-server.md +13 -9
- package/docs/guide/it/integrations/6-agent-chat.md +1 -0
- package/docs/guide/ja/integrations/5-mcp-server.md +13 -9
- package/docs/guide/ja/integrations/6-agent-chat.md +1 -0
- package/docs/guide/pt/integrations/5-mcp-server.md +13 -9
- package/docs/guide/pt/integrations/6-agent-chat.md +1 -0
- package/docs/guide/zh/integrations/5-mcp-server.md +13 -9
- package/docs/guide/zh/integrations/6-agent-chat.md +1 -0
- package/docs/internals/README.md +1 -0
- package/docs/internals/browser-capture-performance.md +55 -3
- package/docs/internals/browser-login-popups.md +45 -0
- package/docs/internals/browser-native-retina-audit.md +39 -0
- package/docs/internals/ci-cd-audit.md +39 -0
- package/docs/internals/core-runtime-updates.md +68 -0
- package/docs/internals/embedded-browser-native-webview-evaluation.md +2 -0
- package/docs/internals/implementation-reliability-audit.md +93 -0
- package/docs/internals/interactive-jobs.md +110 -6
- package/docs/internals/mcp-mission-audit.md +76 -0
- package/docs/internals/project-builder.md +404 -42
- package/docs/internals/safe-pr-review-flow.md +52 -10
- package/docs/internals/startup-recovery-audit.md +58 -0
- package/docs/mcp.md +74 -41
- package/docs/mission-processes.md +59 -0
- package/docs/multi-repo-projects.md +51 -0
- package/docs/platforms/windows-parity.md +70 -0
- package/docs/platforms/windows.md +13 -11
- package/docs/running-pipelines.md +14 -0
- package/mcp-bridge/dist/specrails-mcp.js +7186 -0
- package/package.json +9 -4
- package/server/dist/agent-chat-manager.js +537 -68
- package/server/dist/agent-chat-router.js +87 -6
- package/server/dist/agent-context-resolver.js +129 -25
- package/server/dist/agent-defaults.js +19 -11
- package/server/dist/agent-input-store.js +206 -0
- package/server/dist/agent-mcp-config.js +54 -15
- package/server/dist/agent-operator-prompt.js +255 -65
- package/server/dist/agent-spec-framing.js +202 -0
- package/server/dist/agent-steering.js +218 -0
- package/server/dist/agent-store.js +153 -0
- package/server/dist/api-not-found.js +8 -0
- package/server/dist/background-process-control.js +164 -0
- package/server/dist/background-process-service.js +61 -0
- package/server/dist/background-process-store.js +242 -0
- package/server/dist/background-windows-bootstrap.js +238 -0
- package/server/dist/blueprint-chat-manager.js +476 -62
- package/server/dist/blueprint-commit.js +21 -1
- package/server/dist/blueprint-draft-parser.js +122 -17
- package/server/dist/blueprint-generation.js +238 -0
- package/server/dist/blueprint-operator-prompt.js +91 -63
- package/server/dist/blueprint-router.js +55 -3
- package/server/dist/blueprint-spec-fixtures.js +85 -0
- package/server/dist/blueprint-spec-quality.js +57 -16
- package/server/dist/blueprint-store.js +92 -1
- package/server/dist/browser-capture-manager.js +86 -30
- package/server/dist/browser-playwright.js +168 -45
- package/server/dist/browser-viewport.js +26 -0
- package/server/dist/chat-manager.js +23 -15
- package/server/dist/chromium-archive.cjs +83 -0
- package/server/dist/chromium-resolver.js +72 -64
- package/server/dist/code-activity.js +145 -0
- package/server/dist/code-explorer-router.js +714 -114
- package/server/dist/core-compat.js +28 -1
- package/server/dist/core-execution.js +111 -0
- package/server/dist/core-package.js +4 -16
- package/server/dist/core-runtime.js +202 -0
- package/server/dist/core-update-manager.js +161 -60
- package/server/dist/core-update-state.js +29 -0
- package/server/dist/db.js +66 -35
- package/server/dist/delivery-evidence.js +142 -39
- package/server/dist/desktop-db.js +239 -43
- package/server/dist/desktop-router.js +109 -9
- package/server/dist/dev-ports.js +8 -3
- package/server/dist/file-provenance.js +34 -22
- package/server/dist/file-story-manager.js +62 -64
- package/server/dist/file-story.js +118 -35
- package/server/dist/file-summary-generator.js +46 -5
- package/server/dist/file-summary-manager.js +355 -106
- package/server/dist/framework-manager.js +98 -110
- package/server/dist/framework-reseed.js +76 -10
- package/server/dist/git-diagnostics.js +2 -2
- package/server/dist/headroom-manager.js +38 -3
- package/server/dist/host-control.js +52 -0
- package/server/dist/index.js +43 -2
- package/server/dist/interactive-job-session.js +149 -16
- package/server/dist/internal-api.js +48 -0
- package/server/dist/jira/jira-materializer.js +1 -0
- package/server/dist/json-tolerant.js +174 -0
- package/server/dist/legacy-migration.js +4 -2
- package/server/dist/loop-command-catalog.js +83 -21
- package/server/dist/loop-constants.js +6 -1
- package/server/dist/loop-decider.js +11 -1
- package/server/dist/loop-executors.js +194 -45
- package/server/dist/loop-factory.js +11 -4
- package/server/dist/loop-graph.js +90 -4
- package/server/dist/loop-run-manager.js +301 -69
- package/server/dist/loop-shell-invocation.js +21 -0
- package/server/dist/loop-step-idle.js +55 -0
- package/server/dist/loop-templates.js +31 -7
- package/server/dist/mcp/agent-capability.js +37 -4
- package/server/dist/mcp/guide.js +149 -36
- package/server/dist/mcp/mcp-admin-router.js +20 -4
- package/server/dist/mcp/mcp-server.js +89 -43
- package/server/dist/mcp/mcp-tiers.js +6 -5
- package/server/dist/mcp/mcp-token.js +3 -1
- package/server/dist/mcp/resources.js +5 -4
- package/server/dist/mcp/tools/catalog.js +4 -0
- package/server/dist/mcp/tools/code.js +125 -14
- package/server/dist/mcp/tools/context.js +153 -0
- package/server/dist/mcp/tools/git.js +15 -5
- package/server/dist/mcp/tools/jobs.js +84 -71
- package/server/dist/mcp/tools/loops.js +17 -6
- package/server/dist/mcp/tools/meta.js +74 -27
- package/server/dist/mcp/tools/mission.js +29 -0
- package/server/dist/mcp/tools/projects.js +22 -6
- package/server/dist/mcp/tools/rails.js +48 -11
- package/server/dist/mcp/tools/specs.js +86 -14
- package/server/dist/mcp/tools/support.js +1 -1
- package/server/dist/mcp/tools/types.js +117 -43
- package/server/dist/mcp/tools/watch.js +144 -51
- package/server/dist/milestone-chain-store.js +164 -0
- package/server/dist/milestone-chain.js +487 -0
- package/server/dist/milestone-progress.js +348 -0
- package/server/dist/mobile/mobile-devices.js +10 -7
- package/server/dist/mobile/mobile-gateway.js +2 -0
- package/server/dist/mobile/mobile-missions.js +214 -0
- package/server/dist/mobile/mobile-redact.js +17 -3
- package/server/dist/mobile/mobile-router.js +46 -4
- package/server/dist/mobile/mobile-ws.js +49 -4
- package/server/dist/multi-repo-bases.js +56 -0
- package/server/dist/multi-repo-checkout.js +101 -0
- package/server/dist/multi-repo-delivery.js +100 -0
- package/server/dist/multi-repo-execution-store.js +65 -0
- package/server/dist/multi-repo-execution.js +453 -0
- package/server/dist/offline-assemble.js +10 -8
- package/server/dist/openspec-runtime-plugin-commands.json +18 -0
- package/server/dist/openspec-runtime-plugin.js +120 -0
- package/server/dist/plugins/codex-spawn.js +49 -0
- package/server/dist/plugins/serena/manifest.js +2 -2
- package/server/dist/plugins/serena/templates/instructions.md +16 -0
- package/server/dist/pr-publisher.js +1 -1
- package/server/dist/profiles-router.js +3 -18
- package/server/dist/project-code-discovery.js +142 -0
- package/server/dist/project-git.js +19 -21
- package/server/dist/project-registry.js +272 -20
- package/server/dist/project-repositories.js +157 -0
- package/server/dist/project-repository-provenance.js +31 -0
- package/server/dist/project-router-background-processes.js +105 -0
- package/server/dist/project-router-git.js +75 -16
- package/server/dist/project-router-jobs.js +2 -126
- package/server/dist/project-router-loop-runs.js +72 -2
- package/server/dist/project-router-tickets.js +53 -8
- package/server/dist/project-router.js +239 -38
- package/server/dist/provider-detection.js +18 -6
- package/server/dist/provider-limit.js +64 -0
- package/server/dist/providers/claude-adapter.js +26 -1
- package/server/dist/providers/claude-background-tasks.js +18 -0
- package/server/dist/providers/claude-live-session.js +383 -0
- package/server/dist/providers/codex-adapter.js +19 -0
- package/server/dist/providers/codex-live-session.js +545 -0
- package/server/dist/providers/gemini-adapter.js +1 -0
- package/server/dist/providers/live-session-types.js +12 -0
- package/server/dist/providers/live-session.js +13 -0
- package/server/dist/providers/terminal-result.js +24 -0
- package/server/dist/queue-manager.js +2 -0
- package/server/dist/rail-isolated-launch.js +141 -16
- package/server/dist/rail-pr-decision.js +364 -99
- package/server/dist/rail-pr-store.js +24 -10
- package/server/dist/rail-worktree-release.js +34 -2
- package/server/dist/rail-worktrees-store.js +4 -4
- package/server/dist/rails-router.js +249 -55
- package/server/dist/repo-lock.js +92 -17
- package/server/dist/review-packet.js +23 -13
- package/server/dist/schemas/file-summary.v1.json +59 -59
- package/server/dist/schemas/profile.v1.json +137 -137
- package/server/dist/setup-manager.js +52 -8
- package/server/dist/shell-integration/bash-shim.bash +45 -0
- package/server/dist/shell-integration/fish-shim.fish +36 -0
- package/server/dist/shell-integration/powershell-shim.ps1 +48 -0
- package/server/dist/shell-integration/zsh-shim.zsh +47 -0
- package/server/dist/smash-runner.js +1 -0
- package/server/dist/spawn-lifecycle.js +44 -27
- package/server/dist/spec-contract-prompt.js +143 -0
- package/server/dist/spec-draft-parser.js +6 -1
- package/server/dist/spec-models.js +1 -0
- package/server/dist/stuck-run-detector.js +1 -0
- package/server/dist/terminal-manager.js +21 -1
- package/server/dist/terminal-shell-integration.js +4 -1
- package/server/dist/transient-children.js +619 -230
- package/server/dist/util/cli-prompt.js +78 -5
- package/server/dist/util/sqlite-migrations.js +20 -0
- package/server/dist/util/win-spawn.js +18 -3
- package/server/dist/util/windows-provider-shell.js +29 -0
- package/server/dist/verification-sentinel.js +14 -0
- package/server/dist/vitest-setup.js +2 -0
- package/server/dist/windows-job-supervisor.js +133 -0
- package/server/dist/workspace-manager.js +9 -30
- package/server/dist/worktree-manager.js +17 -2
- package/server/dist/worktree-overlay.js +3 -1
- package/client/dist/assets/ActivityFeedPage-tAQcWs1R.js +0 -1
- package/client/dist/assets/AgentBrowserCapture-BX8BNae5.js +0 -1
- package/client/dist/assets/AgentModeAnalyticsPane-BVAqCL0K.js +0 -2
- package/client/dist/assets/AgentModeCodePane-9XfqQc9c.js +0 -2
- package/client/dist/assets/AgentModeJobsPane-BCjLsPhc.js +0 -1
- package/client/dist/assets/AgentsPage-C8J_42sm.js +0 -87
- package/client/dist/assets/AnalyticsPage-BtQuyfJm.js +0 -1
- package/client/dist/assets/CodePage-BZ2MwdCu.js +0 -2
- package/client/dist/assets/DesktopAnalyticsPage-Bh_29V4g.js +0 -1
- package/client/dist/assets/ExportDropdown-BrtfWzEG.js +0 -1
- package/client/dist/assets/InteractiveJobComposer-BCZiSfzc.js +0 -19
- package/client/dist/assets/JobDetailModal-NAJmuYIT.js +0 -1
- package/client/dist/assets/JobDetailPage-fE0ZycUX.js +0 -1
- package/client/dist/assets/JobsPage-z5M_HVJG.js +0 -1
- package/client/dist/assets/LoopBuilderPage-j1FQS47c.js +0 -7
- package/client/dist/assets/LoopPreviewModal-DhDJjdCe.js +0 -1
- package/client/dist/assets/LoopsPage-Ll7zORZb.js +0 -1
- package/client/dist/assets/MinimizedChatsContext-Bd3OqR_S.js +0 -1
- package/client/dist/assets/PluginsPage-DN4kGvJt.js +0 -2
- package/client/dist/assets/ProjectSettingsDialog-OgsgxjzF.js +0 -1
- package/client/dist/assets/ReviewPacketPage-DFog4sXn.js +0 -1
- package/client/dist/assets/TemplatePreviewModal-L2XxqiOD.js +0 -1
- package/client/dist/assets/TicketDetailModal-CsF-AWZX.js +0 -14
- package/client/dist/assets/Trans-Bsz9_gyq.js +0 -1
- package/client/dist/assets/agent-BQgKv_2F.js +0 -1
- package/client/dist/assets/agent-C1NRDJqL.js +0 -1
- package/client/dist/assets/agent-CLNleiy6.js +0 -1
- package/client/dist/assets/agent-CmceArkQ.js +0 -1
- package/client/dist/assets/agent-D3UxQ3SR.js +0 -1
- package/client/dist/assets/agent-DB1JeE64.js +0 -1
- package/client/dist/assets/agent-DXkHcQ-D.js +0 -1
- package/client/dist/assets/agent-DjJJJ2M8.js +0 -1
- package/client/dist/assets/auth-D_5bQv5W.js +0 -1
- package/client/dist/assets/ban-E4EaZe3a.js +0 -1
- package/client/dist/assets/bot-DzuuuC5R.js +0 -1
- package/client/dist/assets/browser-BgqHDMXP.js +0 -1
- package/client/dist/assets/browser-CsKJtrpv.js +0 -1
- package/client/dist/assets/browser-Cu58EpZU.js +0 -1
- package/client/dist/assets/browser-CvXOJm-j.js +0 -1
- package/client/dist/assets/browser-DOrFh1c7.js +0 -1
- package/client/dist/assets/browser-DQv_Jo7x.js +0 -1
- package/client/dist/assets/browser-LPgxvJu2.js +0 -1
- package/client/dist/assets/browser-eL-3MIEI.js +0 -1
- package/client/dist/assets/builder-0IWtosUm.js +0 -1
- package/client/dist/assets/builder-Bf2N6XWn.js +0 -1
- package/client/dist/assets/builder-BnqaaBkT.js +0 -1
- package/client/dist/assets/builder-BxxfGgAO.js +0 -1
- package/client/dist/assets/builder-C5IIgWsq.js +0 -1
- package/client/dist/assets/builder-CHuahItu.js +0 -1
- package/client/dist/assets/builder-CjWosXL_.js +0 -1
- package/client/dist/assets/builder-CpCIOoKj.js +0 -1
- package/client/dist/assets/code-CHPkOkDS.js +0 -1
- package/client/dist/assets/commands-6tYQih5m.js +0 -1
- package/client/dist/assets/commands-BK2QinXN.js +0 -1
- package/client/dist/assets/commands-C2Nca76h.js +0 -1
- package/client/dist/assets/commands-CKdLihNX.js +0 -1
- package/client/dist/assets/commands-CYIBTAlc.js +0 -1
- package/client/dist/assets/commands-CjUtYJIM.js +0 -1
- package/client/dist/assets/commands-Cq_u_8y9.js +0 -1
- package/client/dist/assets/commands-D_ZHYQug.js +0 -1
- package/client/dist/assets/common-6MLbD-jM.js +0 -1
- package/client/dist/assets/common-BKGEu4rm.js +0 -1
- package/client/dist/assets/common-BNbnv8cE.js +0 -1
- package/client/dist/assets/common-BqGWtDbt.js +0 -1
- package/client/dist/assets/common-DBtTzeYm.js +0 -1
- package/client/dist/assets/common-DEW3Nr8n.js +0 -1
- package/client/dist/assets/common-DHsv9N5d.js +0 -1
- package/client/dist/assets/common-mkrEcW-Y.js +0 -1
- package/client/dist/assets/dashboard-B9GhC5ku.js +0 -1
- package/client/dist/assets/dashboard-CBnv6zOI.js +0 -1
- package/client/dist/assets/dashboard-CaP0fU87.js +0 -1
- package/client/dist/assets/dashboard-D4ZZ4x84.js +0 -1
- package/client/dist/assets/dashboard-DmuTQBX8.js +0 -1
- package/client/dist/assets/dashboard-DynLYj3d.js +0 -1
- package/client/dist/assets/dashboard-zj4gGFJ1.js +0 -1
- package/client/dist/assets/dialog-CdWCb02j.js +0 -45
- package/client/dist/assets/dist-bVqfYmby.js +0 -1
- package/client/dist/assets/dist-js-CWeUdf5Z.js +0 -1
- package/client/dist/assets/formatDistanceToNow-DQCvMgUc.js +0 -1
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-C16cxSe1.js +0 -1
- package/client/dist/assets/git-refresh-wTW0rO0Z.js +0 -1
- package/client/dist/assets/i18n-hnX2DPmo.js +0 -2
- package/client/dist/assets/index-DIhMEAVw.js +0 -66
- package/client/dist/assets/index-DwygcU7s.css +0 -2
- package/client/dist/assets/mcp-B8X8wBLu.js +0 -1
- package/client/dist/assets/mcp-C2AojZZN.js +0 -1
- package/client/dist/assets/mcp-D8BT78_L.js +0 -1
- package/client/dist/assets/mcp-Df5RWBNk.js +0 -1
- package/client/dist/assets/mcp-Dj7BgMQW.js +0 -1
- package/client/dist/assets/mcp-Q7iT7rcz.js +0 -1
- package/client/dist/assets/mcp-YlvNvJbW.js +0 -1
- package/client/dist/assets/mcp-mKFpTSRb.js +0 -1
- package/client/dist/assets/narration-4Z2VUhZw.js +0 -1
- package/client/dist/assets/narration-BGuiEDj3.js +0 -1
- package/client/dist/assets/narration-BuSoqRmv.js +0 -1
- package/client/dist/assets/narration-CB9t29fy.js +0 -1
- package/client/dist/assets/narration-CU3x8FHD.js +0 -1
- package/client/dist/assets/narration-CWeXhfP5.js +0 -1
- package/client/dist/assets/narration-DRaDnhT5.js +0 -1
- package/client/dist/assets/narration-DtEbQgCw.js +0 -1
- package/client/dist/assets/nav-ApJVg3xu.js +0 -1
- package/client/dist/assets/nav-BKNky1Bg.js +0 -1
- package/client/dist/assets/nav-C6vWWKYx.js +0 -1
- package/client/dist/assets/nav-CXJ6Aw89.js +0 -1
- package/client/dist/assets/nav-CsmFBIDf.js +0 -1
- package/client/dist/assets/nav-DjkmQJjd.js +0 -1
- package/client/dist/assets/packet-B1IxaL5f.js +0 -1
- package/client/dist/assets/packet-Bh5kkbiB.js +0 -1
- package/client/dist/assets/packet-By8fqYxW.js +0 -1
- package/client/dist/assets/packet-CZdvA44E.js +0 -1
- package/client/dist/assets/packet-CrjHRQCP.js +0 -1
- package/client/dist/assets/packet-Dwi2pTtx.js +0 -1
- package/client/dist/assets/packet-_-ZIa0IR.js +0 -1
- package/client/dist/assets/packet-n0W6E1Hn.js +0 -1
- package/client/dist/assets/play-DNlrawbS.js +0 -1
- package/client/dist/assets/provider-capabilities-Doej9lfa.js +0 -1
- package/client/dist/assets/settings-Bd0x4TBa.js +0 -1
- package/client/dist/assets/settings-C1-7cXzC.js +0 -1
- package/client/dist/assets/settings-CAFaT38b.js +0 -1
- package/client/dist/assets/settings-Ct3v1nW2.js +0 -1
- package/client/dist/assets/settings-DHh7_IF5.js +0 -1
- package/client/dist/assets/settings-DQXAmdcv.js +0 -1
- package/client/dist/assets/settings-guzlhpup.js +0 -1
- package/client/dist/assets/settings-sZfTPMEH.js +0 -1
- package/client/dist/assets/setup-3jWaoVUO.js +0 -1
- package/client/dist/assets/setup-BjgRneb2.js +0 -1
- package/client/dist/assets/setup-BzFIjv-f.js +0 -1
- package/client/dist/assets/setup-C4VfQsxE.js +0 -1
- package/client/dist/assets/setup-DfUkpDbN.js +0 -1
- package/client/dist/assets/setup-ECe90Pmu.js +0 -1
- package/client/dist/assets/setup-dlqC4Jmm.js +0 -1
- package/client/dist/assets/setup-jwfLMiM2.js +0 -1
- package/client/dist/assets/spending-EC9xqio-.js +0 -1
- package/client/dist/assets/useDesktop-BQVt8lFd.js +0 -1
|
@@ -37,10 +37,13 @@ exports.parseNpmCmdShimEntry = parseNpmCmdShimEntry;
|
|
|
37
37
|
exports.spawnKimi = spawnKimi;
|
|
38
38
|
exports.spawnAiCli = spawnAiCli;
|
|
39
39
|
const node_fs_1 = require("node:fs");
|
|
40
|
+
const node_os_1 = require("node:os");
|
|
40
41
|
const node_path_1 = __importDefault(require("node:path"));
|
|
41
42
|
const win_spawn_1 = require("./win-spawn");
|
|
42
43
|
const headroom_routing_1 = require("../headroom-routing");
|
|
43
44
|
const process_admission_1 = require("../process-admission");
|
|
45
|
+
const openspec_runtime_plugin_1 = require("../openspec-runtime-plugin");
|
|
46
|
+
const windows_provider_shell_1 = require("./windows-provider-shell");
|
|
44
47
|
// Per-call (not a frozen module const) so a test can flip the platform with a
|
|
45
48
|
// `process.platform` spy without re-importing this module — which removes a
|
|
46
49
|
// flaky vi.doMock + resetModules + dynamic-import dance in the spawn tests.
|
|
@@ -138,8 +141,8 @@ function transformCodexArgsForWindows(args) {
|
|
|
138
141
|
}
|
|
139
142
|
i += 1;
|
|
140
143
|
}
|
|
141
|
-
if (stdin === null ||
|
|
142
|
-
//
|
|
144
|
+
if (stdin === null || (!/[\r\n]/.test(stdin) && estimatedWindowsArgvChars('codex', args) < 7000)) {
|
|
145
|
+
// Short single-line prompts pass through cmd.exe fine — keep argv to
|
|
143
146
|
// dodge any codex versions that don't recognise `-` as stdin.
|
|
144
147
|
if (stdin !== null && promptReplacedIdx >= 0) {
|
|
145
148
|
out[promptReplacedIdx] = stdin;
|
|
@@ -174,6 +177,8 @@ function ensureStdinPipe(stdio) {
|
|
|
174
177
|
*/
|
|
175
178
|
function spawnClaude(args, options = {}) {
|
|
176
179
|
(0, process_admission_1.assertProcessAdmission)();
|
|
180
|
+
(0, openspec_runtime_plugin_1.ensureOpenSpecRuntimePluginForArgs)(args);
|
|
181
|
+
options = (0, windows_provider_shell_1.withWindowsProviderShell)('claude', options);
|
|
177
182
|
options = (0, headroom_routing_1.withHeadroomSpawnEnv)('claude', options);
|
|
178
183
|
let child;
|
|
179
184
|
if (!isWin()) {
|
|
@@ -182,6 +187,43 @@ function spawnClaude(args, options = {}) {
|
|
|
182
187
|
return child;
|
|
183
188
|
}
|
|
184
189
|
/* c8 ignore start -- Windows-only branch; coverage runs on Linux/macOS */
|
|
190
|
+
if (args.some((arg, index) => arg === '--input-format' && args[index + 1] === 'stream-json')) {
|
|
191
|
+
// Resident sessions own stdin for JSON frames. Folding the system prompt
|
|
192
|
+
// into stdin both corrupts that protocol and closes it before the first turn.
|
|
193
|
+
let directory;
|
|
194
|
+
const cleanup = () => { if (directory) {
|
|
195
|
+
try {
|
|
196
|
+
(0, node_fs_1.rmSync)(directory, { recursive: true, force: true });
|
|
197
|
+
}
|
|
198
|
+
catch { /* best effort */ }
|
|
199
|
+
} };
|
|
200
|
+
try {
|
|
201
|
+
const streamArgs = [...args];
|
|
202
|
+
for (let index = 0; index < streamArgs.length; index++) {
|
|
203
|
+
if (!['--system-prompt', '--append-system-prompt'].includes(streamArgs[index]))
|
|
204
|
+
continue;
|
|
205
|
+
const value = streamArgs[index + 1];
|
|
206
|
+
if (value === undefined)
|
|
207
|
+
throw new Error('claude_stream_system_prompt_missing');
|
|
208
|
+
directory ??= (0, node_fs_1.mkdtempSync)(node_path_1.default.join((0, node_os_1.tmpdir)(), 'specrails-claude-stream-'));
|
|
209
|
+
const file = node_path_1.default.join(directory, `prompt-${index}.txt`);
|
|
210
|
+
(0, node_fs_1.writeFileSync)(file, value, { encoding: 'utf8', mode: 0o600 });
|
|
211
|
+
streamArgs[index] += '-file';
|
|
212
|
+
streamArgs[++index] = file;
|
|
213
|
+
}
|
|
214
|
+
child = (0, win_spawn_1.spawnCli)('claude', streamArgs, options);
|
|
215
|
+
if (directory) {
|
|
216
|
+
child.once('error', cleanup);
|
|
217
|
+
child.once('close', cleanup);
|
|
218
|
+
}
|
|
219
|
+
(0, headroom_routing_1.registerHeadroomRoutedChild)('claude', options.env, child);
|
|
220
|
+
return child;
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
cleanup();
|
|
224
|
+
throw error;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
185
227
|
const { args: winArgs, stdinPayload } = transformClaudeArgsForWindows(args);
|
|
186
228
|
if (stdinPayload === null) {
|
|
187
229
|
child = (0, win_spawn_1.spawnCli)('claude', winArgs, options);
|
|
@@ -239,8 +281,8 @@ function spawnCodex(args, options = {}) {
|
|
|
239
281
|
* call) when the project dir is not a "trusted folder" — the documented escape
|
|
240
282
|
* hatch for headless/automated environments. Validated empirically: without it,
|
|
241
283
|
* a headless `gemini -p` run executes zero tool calls and the rail does nothing.
|
|
242
|
-
*
|
|
243
|
-
*
|
|
284
|
+
* Windows sends the prompt through Gemini's headless stdin transport so cmd.exe
|
|
285
|
+
* cannot split multiline text or reject a long command line.
|
|
244
286
|
*/
|
|
245
287
|
// Gemini auth env vars. Forwarded from `process.env` into the spawn env when
|
|
246
288
|
// present so a caller that narrows the env (or a relocated spawn) still carries
|
|
@@ -262,7 +304,34 @@ function spawnGemini(args, options = {}) {
|
|
|
262
304
|
if (process.env[key] && env[key] === undefined)
|
|
263
305
|
env[key] = process.env[key];
|
|
264
306
|
}
|
|
265
|
-
|
|
307
|
+
const promptIndex = args.findIndex((arg) => arg === '-p' || arg === '--prompt');
|
|
308
|
+
if (!isWin() || promptIndex < 0 || args[promptIndex + 1] === undefined) {
|
|
309
|
+
return (0, win_spawn_1.spawnCli)('gemini', args, { ...options, env });
|
|
310
|
+
}
|
|
311
|
+
const prompt = args[promptIndex + 1];
|
|
312
|
+
// Gemini headless bounds stdin at 8 MiB and otherwise silently truncates it.
|
|
313
|
+
if (Buffer.byteLength(prompt, 'utf8') > 8 * 1024 * 1024)
|
|
314
|
+
throw new Error('gemini_windows_prompt_too_large: headless stdin is limited to 8 MiB.');
|
|
315
|
+
const forwarded = [...args];
|
|
316
|
+
forwarded.splice(promptIndex, 2);
|
|
317
|
+
const child = (0, win_spawn_1.spawnCli)('gemini', forwarded, { ...options, env, stdio: ensureStdinPipe(options.stdio) });
|
|
318
|
+
if (!child.stdin) {
|
|
319
|
+
try {
|
|
320
|
+
child.kill('SIGTERM');
|
|
321
|
+
}
|
|
322
|
+
catch { /* already gone */ }
|
|
323
|
+
throw new Error('gemini_windows_prompt_stdin_unavailable');
|
|
324
|
+
}
|
|
325
|
+
child.stdin.on('error', (error) => {
|
|
326
|
+
if (error.code !== 'EPIPE') {
|
|
327
|
+
try {
|
|
328
|
+
child.kill('SIGTERM');
|
|
329
|
+
}
|
|
330
|
+
catch { /* already gone */ }
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
child.stdin.end(prompt);
|
|
334
|
+
return child;
|
|
266
335
|
}
|
|
267
336
|
/**
|
|
268
337
|
* Extract the JavaScript entry from a standard npm-generated Windows `.cmd`
|
|
@@ -306,6 +375,7 @@ function estimatedWindowsArgvChars(binary, args) {
|
|
|
306
375
|
}
|
|
307
376
|
function spawnKimi(args, options = {}) {
|
|
308
377
|
(0, process_admission_1.assertProcessAdmission)();
|
|
378
|
+
options = (0, windows_provider_shell_1.withWindowsProviderShell)('kimi', options);
|
|
309
379
|
if (!isWin())
|
|
310
380
|
return (0, win_spawn_1.spawnCli)('kimi', args, options);
|
|
311
381
|
/* c8 ignore start -- Windows-only branch; unit tests force process.platform */
|
|
@@ -402,5 +472,8 @@ function spawnAiCli(binary, args, options = {}) {
|
|
|
402
472
|
return spawnGemini(args, options);
|
|
403
473
|
if (binary === 'kimi')
|
|
404
474
|
return spawnKimi(args, options);
|
|
475
|
+
// An explicitly selected Claude executable can be an absolute path/shim.
|
|
476
|
+
// Its adapter still supplies the same exact managed-plugin argv contract.
|
|
477
|
+
(0, openspec_runtime_plugin_1.ensureOpenSpecRuntimePluginForArgs)(args);
|
|
405
478
|
return (0, win_spawn_1.spawnCli)(binary, args, options);
|
|
406
479
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyNumberedMigrations = applyNumberedMigrations;
|
|
4
|
+
/** Recheck the version while holding the write lock: another startup may have
|
|
5
|
+
* migrated the database after our initial read, while we waited for SQLite. */
|
|
6
|
+
function applyNumberedMigrations(db, migrations) {
|
|
7
|
+
const applied = new Set(db.prepare('SELECT version FROM schema_migrations').all().map((row) => row.version));
|
|
8
|
+
const hasVersion = db.prepare('SELECT 1 FROM schema_migrations WHERE version = ?');
|
|
9
|
+
const recordVersion = db.prepare('INSERT INTO schema_migrations (version) VALUES (?)');
|
|
10
|
+
const migrate = db.transaction((version, body) => {
|
|
11
|
+
if (hasVersion.get(version))
|
|
12
|
+
return;
|
|
13
|
+
body(db);
|
|
14
|
+
recordVersion.run(version);
|
|
15
|
+
});
|
|
16
|
+
for (let i = 0; i < migrations.length; i++) {
|
|
17
|
+
if (!applied.has(i + 1))
|
|
18
|
+
migrate.immediate(i + 1, migrations[i]);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -32,6 +32,7 @@ exports.resolveWindowsBinary = resolveWindowsBinary;
|
|
|
32
32
|
exports.__resetWindowsBinaryResolveCacheForTest = __resetWindowsBinaryResolveCacheForTest;
|
|
33
33
|
const child_process_1 = require("child_process");
|
|
34
34
|
const path_1 = __importDefault(require("path"));
|
|
35
|
+
const os_1 = __importDefault(require("os"));
|
|
35
36
|
const cross_spawn_1 = __importDefault(require("cross-spawn"));
|
|
36
37
|
const tree_kill_1 = __importDefault(require("tree-kill"));
|
|
37
38
|
/**
|
|
@@ -95,6 +96,17 @@ function windowsSpawnEnv(base = process.env) {
|
|
|
95
96
|
if (process.platform !== 'win32')
|
|
96
97
|
return base;
|
|
97
98
|
const env = { ...base };
|
|
99
|
+
// Windows env names are case-insensitive, even when a caller passes an
|
|
100
|
+
// ordinary JS object. Avoid conflicting aliases when spawning that object.
|
|
101
|
+
for (const name of ['SystemRoot', 'windir', 'ComSpec', 'USERPROFILE', 'HOMEDRIVE', 'HOMEPATH', 'APPDATA', 'LOCALAPPDATA', 'TEMP', 'TMP']) {
|
|
102
|
+
const aliases = Object.keys(env).filter(key => key.toLowerCase() === name.toLowerCase());
|
|
103
|
+
const value = env[name] || aliases.map(key => env[key]).find(Boolean);
|
|
104
|
+
for (const key of aliases)
|
|
105
|
+
if (key !== name)
|
|
106
|
+
delete env[key];
|
|
107
|
+
if (value !== undefined)
|
|
108
|
+
env[name] = value;
|
|
109
|
+
}
|
|
98
110
|
const systemRoot = (env.SystemRoot || env.windir || 'C:\\Windows').replace(/[\\/]$/, '');
|
|
99
111
|
env.SystemRoot = env.SystemRoot || systemRoot;
|
|
100
112
|
env.windir = env.windir || systemRoot;
|
|
@@ -103,10 +115,13 @@ function windowsSpawnEnv(base = process.env) {
|
|
|
103
115
|
// npm-prefix.js resolver), which reads the user profile via USERPROFILE /
|
|
104
116
|
// APPDATA / HOMEDRIVE+HOMEPATH / TEMP. A GUI-launched, env-stripped sidecar can
|
|
105
117
|
// lack these → `node npm-cli.js --version` fails the same way the .cmd shim did.
|
|
106
|
-
//
|
|
107
|
-
//
|
|
118
|
+
// Query the real account BEFORE ensureWindowsBaseEnv mutates process.env.
|
|
119
|
+
// Inventing C:\\Users\\Default here redirects os.homedir(), the project
|
|
120
|
+
// database and provider authentication to another account's directory.
|
|
108
121
|
const userProfile = env.USERPROFILE ||
|
|
109
|
-
(env.HOMEDRIVE && env.HOMEPATH ? `${env.HOMEDRIVE}${env.HOMEPATH}` :
|
|
122
|
+
(env.HOMEDRIVE && env.HOMEPATH ? `${env.HOMEDRIVE}${env.HOMEPATH}` : os_1.default.homedir());
|
|
123
|
+
if (!userProfile)
|
|
124
|
+
throw new Error('Cannot determine the Windows user profile; refusing to select another data directory.');
|
|
110
125
|
env.USERPROFILE = userProfile;
|
|
111
126
|
const drive = /^([A-Za-z]:)(.*)$/.exec(userProfile);
|
|
112
127
|
if (drive) {
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.withWindowsProviderShell = withWindowsProviderShell;
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const win_spawn_1 = require("./win-spawn");
|
|
10
|
+
/** Provider tools must find PortableGit's Bash even with only git/cmd on PATH. */
|
|
11
|
+
function withWindowsProviderShell(binary, options) {
|
|
12
|
+
if (process.platform !== 'win32')
|
|
13
|
+
return options;
|
|
14
|
+
const key = binary === 'claude' ? 'CLAUDE_CODE_GIT_BASH_PATH' : 'KIMI_SHELL_PATH';
|
|
15
|
+
const effective = options.env ?? process.env;
|
|
16
|
+
if (Object.entries(effective).some(([name, value]) => name.toUpperCase() === key && value !== undefined))
|
|
17
|
+
return options;
|
|
18
|
+
const inherited = Object.entries(process.env).find(([name, value]) => name.toUpperCase() === key && value !== undefined)?.[1];
|
|
19
|
+
const runtimes = (0, win_spawn_1.stripWindowsVerbatimPrefix)(effective.SPECRAILS_BUNDLED_RUNTIMES_PATH ?? process.env.SPECRAILS_BUNDLED_RUNTIMES_PATH ?? '');
|
|
20
|
+
const bundled = runtimes ? [node_path_1.default.join(runtimes, 'git', 'bin', 'bash.exe'), node_path_1.default.join(runtimes, 'git', 'usr', 'bin', 'bash.exe')]
|
|
21
|
+
.find(candidate => { try {
|
|
22
|
+
return (0, node_fs_1.statSync)(candidate).isFile();
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
} }) : undefined;
|
|
27
|
+
const selected = inherited ?? bundled;
|
|
28
|
+
return selected === undefined ? options : { ...options, env: { ...effective, [key]: selected } };
|
|
29
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseVerificationSentinel = parseVerificationSentinel;
|
|
4
|
+
const SENTINEL_RE = /^[ \t]*VERIFICATION:[ \t]*(PASS|FAIL)\b[ \t]*(?:[—:-][ \t]*)?([^\r\n]*)/gim;
|
|
5
|
+
function parseVerificationSentinel(text) {
|
|
6
|
+
let verdict = 'absent';
|
|
7
|
+
let detail = null;
|
|
8
|
+
for (const match of text.matchAll(SENTINEL_RE)) {
|
|
9
|
+
verdict = match[1].toUpperCase() === 'PASS' ? 'pass' : 'fail';
|
|
10
|
+
const tail = (match[2] ?? '').trim();
|
|
11
|
+
detail = verdict === 'fail' && tail ? tail.slice(0, 512) : null;
|
|
12
|
+
}
|
|
13
|
+
return { verdict, detail };
|
|
14
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WINDOWS_JOB_SUPERVISOR = void 0;
|
|
4
|
+
/** Windows PowerShell 5.1/.NET Framework: no additional executable or addon.
|
|
5
|
+
* This process creates the bootstrap itself and owns its kernel handle; it
|
|
6
|
+
* never adopts a pid. Its unnamed, non-inheritable job contains descendants
|
|
7
|
+
* even when every intermediate wrapper has already exited. */
|
|
8
|
+
exports.WINDOWS_JOB_SUPERVISOR = String.raw `
|
|
9
|
+
param([string]$NodePath, [string]$BootstrapPath, [string]$PipeName)
|
|
10
|
+
$ErrorActionPreference = 'Stop'
|
|
11
|
+
Add-Type -TypeDefinition @'
|
|
12
|
+
using System;
|
|
13
|
+
using System.Diagnostics;
|
|
14
|
+
using System.IO;
|
|
15
|
+
using System.IO.Pipes;
|
|
16
|
+
using System.Runtime.InteropServices;
|
|
17
|
+
using System.Text;
|
|
18
|
+
using System.Threading;
|
|
19
|
+
using System.Threading.Tasks;
|
|
20
|
+
public static class SpecrailsBackgroundJob {
|
|
21
|
+
[StructLayout(LayoutKind.Sequential)] struct BasicLimits {
|
|
22
|
+
public long ProcessTime, JobTime; public uint Flags;
|
|
23
|
+
public UIntPtr MinWorkingSet, MaxWorkingSet; public uint ActiveLimit;
|
|
24
|
+
public UIntPtr Affinity; public uint Priority, Scheduling;
|
|
25
|
+
}
|
|
26
|
+
[StructLayout(LayoutKind.Sequential)] struct IoCounters {
|
|
27
|
+
public ulong ReadOps, WriteOps, OtherOps, ReadBytes, WriteBytes, OtherBytes;
|
|
28
|
+
}
|
|
29
|
+
[StructLayout(LayoutKind.Sequential)] struct ExtendedLimits {
|
|
30
|
+
public BasicLimits Basic; public IoCounters Io;
|
|
31
|
+
public UIntPtr ProcessMemory, JobMemory, PeakProcessMemory, PeakJobMemory;
|
|
32
|
+
}
|
|
33
|
+
[StructLayout(LayoutKind.Sequential)] struct Accounting {
|
|
34
|
+
public long UserTime, KernelTime, PeriodUserTime, PeriodKernelTime;
|
|
35
|
+
public uint PageFaults, Total, Active, Terminated;
|
|
36
|
+
}
|
|
37
|
+
[DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)] static extern IntPtr CreateJobObject(IntPtr attrs, string name);
|
|
38
|
+
[DllImport("kernel32.dll", SetLastError=true)] static extern bool SetInformationJobObject(IntPtr job, int kind, ref ExtendedLimits info, uint length);
|
|
39
|
+
[DllImport("kernel32.dll", SetLastError=true)] static extern bool QueryInformationJobObject(IntPtr job, int kind, out Accounting info, uint length, IntPtr returned);
|
|
40
|
+
[DllImport("kernel32.dll", SetLastError=true)] static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process);
|
|
41
|
+
[DllImport("kernel32.dll", SetLastError=true)] static extern bool TerminateJobObject(IntPtr job, uint code);
|
|
42
|
+
[DllImport("kernel32.dll", SetLastError=true)] static extern bool TerminateProcess(IntPtr process, uint code);
|
|
43
|
+
[DllImport("kernel32.dll")] static extern bool CloseHandle(IntPtr handle);
|
|
44
|
+
static void Check(bool okay, string operation) { if (!okay) throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error(), operation); }
|
|
45
|
+
static uint Active(IntPtr job) {
|
|
46
|
+
Accounting info;
|
|
47
|
+
Check(QueryInformationJobObject(job, 1, out info, (uint)Marshal.SizeOf(typeof(Accounting)), IntPtr.Zero), "QueryInformationJobObject");
|
|
48
|
+
return info.Active;
|
|
49
|
+
}
|
|
50
|
+
static string Quote(string value) {
|
|
51
|
+
var result=new StringBuilder("\""); int slashes=0;
|
|
52
|
+
foreach(char c in value) {
|
|
53
|
+
if(c=='\\') { slashes++; continue; }
|
|
54
|
+
result.Append('\\', c=='"' ? slashes*2+1 : slashes); result.Append(c); slashes=0;
|
|
55
|
+
}
|
|
56
|
+
result.Append('\\',slashes*2); return result.Append('"').ToString();
|
|
57
|
+
}
|
|
58
|
+
public static int Run(string node, string bootstrap, string pipeName) {
|
|
59
|
+
IntPtr job=IntPtr.Zero; Process root=null; StreamWriter output=null; bool assigned=false;
|
|
60
|
+
int code=125;
|
|
61
|
+
try {
|
|
62
|
+
var pipeOptions=PipeOptions.Asynchronous;
|
|
63
|
+
if(Enum.IsDefined(typeof(PipeOptions),"CurrentUserOnly")) pipeOptions|=(PipeOptions)Enum.Parse(typeof(PipeOptions),"CurrentUserOnly");
|
|
64
|
+
using(var pipe=new NamedPipeClientStream(".",pipeName,PipeDirection.InOut,pipeOptions)) {
|
|
65
|
+
pipe.Connect(8000);
|
|
66
|
+
var reader=new StreamReader(pipe,new UTF8Encoding(false),false,4096,true);
|
|
67
|
+
output=new StreamWriter(pipe,new UTF8Encoding(false),4096,true); output.AutoFlush=true;
|
|
68
|
+
job=CreateJobObject(IntPtr.Zero,null); Check(job!=IntPtr.Zero,"CreateJobObject");
|
|
69
|
+
var limits=new ExtendedLimits(); limits.Basic.Flags=0x2000; // KILL_ON_JOB_CLOSE; no BREAKAWAY flags.
|
|
70
|
+
Check(SetInformationJobObject(job,9,ref limits,(uint)Marshal.SizeOf(typeof(ExtendedLimits))),"SetInformationJobObject");
|
|
71
|
+
var start=new ProcessStartInfo(node,Quote(bootstrap));
|
|
72
|
+
start.UseShellExecute=false; start.CreateNoWindow=true; start.RedirectStandardInput=true;
|
|
73
|
+
// A user preload must not execute before job assignment. The bootstrap
|
|
74
|
+
// restores these only for the admitted application child.
|
|
75
|
+
foreach(string key in new [] {"NODE_OPTIONS","NODE_PATH"}) {
|
|
76
|
+
string value=start.EnvironmentVariables[key];
|
|
77
|
+
if(value!=null) start.EnvironmentVariables["SPECRAILS_JOB_"+key+"_B64"]=Convert.ToBase64String(Encoding.UTF8.GetBytes(value));
|
|
78
|
+
start.EnvironmentVariables.Remove(key);
|
|
79
|
+
}
|
|
80
|
+
root=Process.Start(start);
|
|
81
|
+
if(root==null) throw new Exception("Could not create background bootstrap.");
|
|
82
|
+
Check(AssignProcessToJobObject(job,root.Handle),"AssignProcessToJobObject"); assigned=true;
|
|
83
|
+
output.WriteLine("ready");
|
|
84
|
+
bool admitted=false, stopping=false;
|
|
85
|
+
Task<string> input=reader.ReadLineAsync();
|
|
86
|
+
while(true) {
|
|
87
|
+
if(input.Wait(100)) {
|
|
88
|
+
string line=input.Result;
|
|
89
|
+
if(line==null) { Check(TerminateJobObject(job,137),"TerminateJobObject"); stopping=true; break; }
|
|
90
|
+
string[] parts=line.Split(new [] {'\t'},2);
|
|
91
|
+
if(parts[0]=="start" && parts.Length==2 && !admitted && !stopping) {
|
|
92
|
+
Convert.FromBase64String(parts[1]); // validate before framing JSON for Node
|
|
93
|
+
root.StandardInput.WriteLine("{\"commandBase64\":\""+parts[1]+"\"}"); root.StandardInput.Close(); admitted=true;
|
|
94
|
+
} else if(parts[0]=="stop") {
|
|
95
|
+
Check(TerminateJobObject(job,137),"TerminateJobObject"); stopping=true;
|
|
96
|
+
output.WriteLine("state\t"+(parts.Length==2?parts[1]:"0")+"\t"+Active(job));
|
|
97
|
+
} else if(parts[0]=="poll") {
|
|
98
|
+
output.WriteLine("state\t"+(parts.Length==2?parts[1]:"0")+"\t"+Active(job));
|
|
99
|
+
}
|
|
100
|
+
input=reader.ReadLineAsync();
|
|
101
|
+
}
|
|
102
|
+
if(Active(job)==0) {
|
|
103
|
+
root.WaitForExit(); code=root.ExitCode;
|
|
104
|
+
output.WriteLine("empty"); return code;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// EOF means the owning sidecar disappeared. The job still owns every
|
|
108
|
+
// descendant; wait for the kernel's active count before releasing it.
|
|
109
|
+
var deadline=DateTime.UtcNow.AddSeconds(5);
|
|
110
|
+
while(Active(job)>0 && DateTime.UtcNow<deadline) Thread.Sleep(25);
|
|
111
|
+
}
|
|
112
|
+
} catch(Exception error) {
|
|
113
|
+
try { if(output!=null) output.WriteLine("error\t"+Convert.ToBase64String(Encoding.UTF8.GetBytes(error.Message))); } catch {}
|
|
114
|
+
Console.Error.WriteLine("Background job supervisor failed: "+error.Message);
|
|
115
|
+
} finally {
|
|
116
|
+
if(job!=IntPtr.Zero) {
|
|
117
|
+
if(assigned) {
|
|
118
|
+
TerminateJobObject(job,137);
|
|
119
|
+
try { var until=DateTime.UtcNow.AddSeconds(5); while(Active(job)>0 && DateTime.UtcNow<until) Thread.Sleep(25); } catch {}
|
|
120
|
+
}
|
|
121
|
+
CloseHandle(job);
|
|
122
|
+
}
|
|
123
|
+
if(root!=null) {
|
|
124
|
+
if(!assigned) { try { TerminateProcess(root.Handle,125); } catch {} }
|
|
125
|
+
root.Dispose();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return code;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
'@
|
|
132
|
+
exit [SpecrailsBackgroundJob]::Run($NodePath, $BootstrapPath, $PipeName)
|
|
133
|
+
`;
|
|
@@ -10,23 +10,12 @@ exports.ensureWorkspace = ensureWorkspace;
|
|
|
10
10
|
exports.assembleWorkspaceFramework = assembleWorkspaceFramework;
|
|
11
11
|
exports.removeWorkspace = removeWorkspace;
|
|
12
12
|
const fs_1 = __importDefault(require("fs"));
|
|
13
|
+
const core_update_state_1 = require("./core-update-state");
|
|
13
14
|
const path_1 = __importDefault(require("path"));
|
|
14
15
|
const framework_manager_1 = require("./framework-manager");
|
|
15
16
|
const framework_migration_1 = require("./framework-migration");
|
|
16
17
|
const artifact_registry_1 = require("./artifact-registry");
|
|
17
18
|
const agent_mcp_config_1 = require("./agent-mcp-config");
|
|
18
|
-
/** Highest-first semver-ish sort for framework version dir names. */
|
|
19
|
-
function compareFrameworkVersionDesc(a, b) {
|
|
20
|
-
const pa = a.split('.').map((n) => parseInt(n, 10));
|
|
21
|
-
const pb = b.split('.').map((n) => parseInt(n, 10));
|
|
22
|
-
for (let i = 0; i < 3; i++) {
|
|
23
|
-
const x = pa[i] ?? 0;
|
|
24
|
-
const y = pb[i] ?? 0;
|
|
25
|
-
if (x !== y)
|
|
26
|
-
return y - x;
|
|
27
|
-
}
|
|
28
|
-
return 0;
|
|
29
|
-
}
|
|
30
19
|
/**
|
|
31
20
|
* Windows repair: ensure the workspace's `<providerDir>/agents` holds the
|
|
32
21
|
* framework's `sr-*` agent definitions, copied from the REAL versioned framework
|
|
@@ -48,25 +37,12 @@ function compareFrameworkVersionDesc(a, b) {
|
|
|
48
37
|
* byte-identical). Additive (never touches user `custom-*.md`) + idempotent.
|
|
49
38
|
* Returns the number of agents copied.
|
|
50
39
|
*/
|
|
51
|
-
/** Newest REAL framework version dir under the root — resolved by LISTING (not
|
|
52
|
-
* via the `current` junction, which is the very thing that may be untraversable
|
|
53
|
-
* on Windows). Null when the framework isn't materialized. */
|
|
54
|
-
function newestFrameworkVersion(root) {
|
|
55
|
-
try {
|
|
56
|
-
return fs_1.default
|
|
57
|
-
.readdirSync(root)
|
|
58
|
-
.filter((n) => /^\d+\.\d+\.\d+$/.test(n))
|
|
59
|
-
.sort(compareFrameworkVersionDesc)[0] ?? null;
|
|
60
|
-
}
|
|
61
|
-
catch {
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
40
|
function ensureFrameworkAgents(workspaceDir, providerDir, home) {
|
|
41
|
+
(0, core_update_state_1.assertWorkspaceCoreReady)(workspaceDir, home);
|
|
66
42
|
if (process.platform !== 'win32')
|
|
67
43
|
return 0;
|
|
68
44
|
const root = (0, framework_manager_1.frameworkRoot)(home);
|
|
69
|
-
const version =
|
|
45
|
+
const version = (0, framework_manager_1.readCurrentFrameworkVersion)(home);
|
|
70
46
|
if (!version)
|
|
71
47
|
return 0;
|
|
72
48
|
const src = path_1.default.join(root, version, providerDir, 'agents');
|
|
@@ -173,10 +149,11 @@ function hasReadableFrameworkContent(dest) {
|
|
|
173
149
|
* idempotent. Returns the number of repaired subtrees/managed skill children.
|
|
174
150
|
*/
|
|
175
151
|
function ensureFrameworkCommandSubtrees(workspaceDir, providerDir, home) {
|
|
152
|
+
(0, core_update_state_1.assertWorkspaceCoreReady)(workspaceDir, home);
|
|
176
153
|
if (process.platform !== 'win32')
|
|
177
154
|
return 0;
|
|
178
155
|
const root = (0, framework_manager_1.frameworkRoot)(home);
|
|
179
|
-
const version =
|
|
156
|
+
const version = (0, framework_manager_1.readCurrentFrameworkVersion)(home);
|
|
180
157
|
if (!version)
|
|
181
158
|
return 0;
|
|
182
159
|
let healed = 0;
|
|
@@ -199,7 +176,9 @@ function ensureFrameworkCommandSubtrees(workspaceDir, providerDir, home) {
|
|
|
199
176
|
removeBrokenFrameworkDestination(dest);
|
|
200
177
|
try {
|
|
201
178
|
fs_1.default.mkdirSync(path_1.default.dirname(dest), { recursive: true });
|
|
202
|
-
|
|
179
|
+
// JS traversal avoids Node 22's native Unicode directory-copy failure on
|
|
180
|
+
// Windows (nodejs/node#61878). The missing subtree is a fresh destination.
|
|
181
|
+
fs_1.default.cpSync(src, dest, { recursive: true, filter: () => true, mode: fs_1.default.constants.COPYFILE_FICLONE });
|
|
203
182
|
healed += 1;
|
|
204
183
|
}
|
|
205
184
|
catch {
|
|
@@ -240,7 +219,7 @@ function ensureFrameworkCommandSubtrees(workspaceDir, providerDir, home) {
|
|
|
240
219
|
removeBrokenFrameworkDestination(dest);
|
|
241
220
|
try {
|
|
242
221
|
fs_1.default.mkdirSync(path_1.default.dirname(dest), { recursive: true });
|
|
243
|
-
fs_1.default.cpSync(src, dest, { recursive: true });
|
|
222
|
+
fs_1.default.cpSync(src, dest, { recursive: true, filter: () => true, mode: fs_1.default.constants.COPYFILE_FICLONE });
|
|
244
223
|
healed += 1;
|
|
245
224
|
}
|
|
246
225
|
catch {
|
|
@@ -130,6 +130,13 @@ exports.PR_NEVER_STAGE_PATHS = [
|
|
|
130
130
|
'.kimi-code/agent-memory/**',
|
|
131
131
|
'.kimi-code/agent-memory/explanations',
|
|
132
132
|
'.kimi-code/agent-memory/explanations/**',
|
|
133
|
+
// The relocated workspace root. The Revision gate harvests reviewer scores
|
|
134
|
+
// from `.specrails/agent-memory/explanations/`, so that dir now materializes
|
|
135
|
+
// inside the worktree — it is private evidence, never PR content.
|
|
136
|
+
'.specrails/agent-memory',
|
|
137
|
+
'.specrails/agent-memory/**',
|
|
138
|
+
'.specrails/agent-memory/explanations',
|
|
139
|
+
'.specrails/agent-memory/explanations/**',
|
|
133
140
|
];
|
|
134
141
|
const PR_NEVER_STAGE_EXCLUDE_MARKER_BEGIN = '# specrails: never stage private agent artifacts';
|
|
135
142
|
const PR_NEVER_STAGE_EXCLUDE_MARKER_END = '# /specrails: never stage private agent artifacts';
|
|
@@ -184,6 +191,14 @@ async function fastForwardExistingBranch(git, repoDir, branch, baseRef, mountedW
|
|
|
184
191
|
* callers creating fresh work may choose shared cwd. PR continuations must fail
|
|
185
192
|
* closed because shared cwd cannot guarantee branch identity.
|
|
186
193
|
*/
|
|
194
|
+
function canonicalWorktreePath(value) {
|
|
195
|
+
try {
|
|
196
|
+
return fs.realpathSync.native(value);
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
return path.resolve(value);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
187
202
|
async function createWorktree(git, input) {
|
|
188
203
|
const branch = input.branch ?? worktreeBranch(input.slug, input.ticketId);
|
|
189
204
|
const wt = worktreePath(input.worktreesRoot, input.ticketId);
|
|
@@ -195,7 +210,7 @@ async function createWorktree(git, input) {
|
|
|
195
210
|
// it out into a worktree (resume from the committed partial work).
|
|
196
211
|
// 3. neither → create a fresh branch off base.
|
|
197
212
|
const existing = await listWorktrees(git, input.repoDir);
|
|
198
|
-
if (existing.some((p) =>
|
|
213
|
+
if (existing.some((p) => canonicalWorktreePath(p) === canonicalWorktreePath(wt))) {
|
|
199
214
|
// The still-mounted worktree may be checked out on a DIFFERENT branch than
|
|
200
215
|
// the caller's preferred name (the path is keyed by ticketId only, so a
|
|
201
216
|
// stale mount from a prior run of the same ticket collides here). The
|
|
@@ -445,7 +460,7 @@ async function listWorktrees(git, repoDir) {
|
|
|
445
460
|
for (const line of res.stdout.split('\n')) {
|
|
446
461
|
if (line.startsWith('worktree ')) {
|
|
447
462
|
const p = line.slice('worktree '.length).trim();
|
|
448
|
-
if (p &&
|
|
463
|
+
if (p && canonicalWorktreePath(p) !== canonicalWorktreePath(repoDir))
|
|
449
464
|
paths.push(p);
|
|
450
465
|
}
|
|
451
466
|
}
|
|
@@ -310,8 +310,10 @@ function linkOrCopyEntry(src, dest, rel, created, warnings) {
|
|
|
310
310
|
// Copy fallback (Windows without symlink rights, exotic filesystems).
|
|
311
311
|
// Dereference so workspace-internal symlinks become real files.
|
|
312
312
|
try {
|
|
313
|
+
// A filter avoids Node 22's native Unicode directory-copy failure on
|
|
314
|
+
// Windows (nodejs/node#61878). The caller admits only a missing destination.
|
|
313
315
|
if (srcIsDir)
|
|
314
|
-
fs_1.default.cpSync(src, dest, { recursive: true, dereference: true });
|
|
316
|
+
fs_1.default.cpSync(src, dest, { recursive: true, dereference: true, filter: () => true, mode: fs_1.default.constants.COPYFILE_FICLONE });
|
|
315
317
|
else
|
|
316
318
|
fs_1.default.copyFileSync(src, dest);
|
|
317
319
|
linked = true;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t,t as n}from"./jsx-runtime-zu2_FqZY.js";import{o as r,w as i}from"./i18n-hnX2DPmo.js";import{n as a}from"./createLucideIcon-Bjbbp_KS.js";import{t as o}from"./ban-E4EaZe3a.js";import{t as s}from"./circle-x-CMYsN4ZH.js";import{t as c}from"./loader-circle-DcygOQpC.js";import{t as l}from"./zap-CHo3aCD1.js";import{a as u,r as d}from"./useDesktop-BQVt8lFd.js";import{Ot as f,Pt as p}from"./index-DIhMEAVw.js";var m=e(t(),1);function h(e){let t=new Set;return e.filter(e=>{let n=`${e.type}:${e.jobId}`;return t.has(n)?!1:(t.add(n),!0)})}function g({activeProjectId:e,limit:t=50}){let[n,a]=(0,m.useState)([]),[o,s]=(0,m.useState)(!1),[c,l]=(0,m.useState)(!0),d=(0,m.useRef)(e);(0,m.useEffect)(()=>{d.current=e},[e]);let{registerHandler:f,unregisterHandler:p}=i();(0,m.useEffect)(()=>{if(!e){a([]),l(!0);return}let n=!1;s(!0),a([]),l(!0);async function r(){let e=u();try{let r=await fetch(`${e}/activity?limit=${t}`);if(!r.ok||n)return;let i=await r.json();if(n)return;a(i),l(i.length===t)}catch{}finally{n||s(!1)}}return r(),()=>{n=!0}},[e,t]);let g=(0,m.useCallback)(async()=>{if(o||!c)return;s(!0);let e=u(),n=d.current;try{a(r=>{let i=r[r.length-1];if(!i)return r;let o=encodeURIComponent(i.timestamp);return fetch(`${e}/activity?limit=${t}&before=${o}`).then(e=>e.json()).then(e=>{if(d.current!==n){s(!1);return}a(t=>h([...t,...e])),l(e.length===t),s(!1)}).catch(()=>s(!1)),r})}catch{s(!1)}},[o,c,t]),_=(0,m.useCallback)(e=>{let t=e,n=d.current;if(!(!t||typeof t.type!=`string`)&&!(t.projectId&&t.projectId!==n)){if(t.type===`queue`&&Array.isArray(t.jobs)){let e=[];for(let n of t.jobs){let t=n.status===`completed`?`job_completed`:n.status===`failed`?`job_failed`:n.status===`canceled`?`job_canceled`:`job_started`;e.push({id:`${t}:${n.id}`,type:t,jobId:n.id,jobCommand:n.command??``,timestamp:n.startedAt??new Date().toISOString(),summary:`${t.replace(`_`,` `)}: ${n.command??``}`,costUsd:null})}e.length>0&&a(t=>h([...e,...t]))}if(t.type===`phase`&&t.phase&&t.state&&t.timestamp){let e={id:`phase:${t.phase}:${t.state}:${t.timestamp}`,type:`job_started`,jobId:`phase-${t.phase}`,jobCommand:r.t(`activity:feed.phaseCommand`,{phase:t.phase,state:t.state}),timestamp:t.timestamp,summary:`Phase ${t.phase} is ${t.state}`,costUsd:null};a(t=>h([e,...t]))}}},[]);return(0,m.useLayoutEffect)(()=>(f(`activity`,_),()=>p(`activity`)),[_,f,p]),{items:n,loading:o,hasMore:c,loadMore:g}}var _=n();function v(e,t){let n=Date.now()-new Date(e).getTime(),r=Math.floor(n/1e3);if(r<60)return t(`feed.relativeTime.seconds`,{value:r});let i=Math.floor(r/60);if(i<60)return t(`feed.relativeTime.minutes`,{value:i});let a=Math.floor(i/60);return a<24?t(`feed.relativeTime.hours`,{value:a}):t(`feed.relativeTime.days`,{value:Math.floor(a/24)})}function y({type:e}){switch(e){case`job_completed`:return(0,_.jsx)(f,{className:`w-4 h-4 text-green-500 aurora-light:text-accent-success flex-shrink-0`});case`job_failed`:return(0,_.jsx)(s,{className:`w-4 h-4 text-red-500 aurora-light:text-destructive flex-shrink-0`});case`job_canceled`:return(0,_.jsx)(o,{className:`w-4 h-4 text-muted-foreground flex-shrink-0`});default:return(0,_.jsx)(l,{className:`w-4 h-4 text-blue-500 aurora-light:text-accent-info flex-shrink-0`})}}function b(e,t){switch(e){case`job_completed`:return t(`common:status.completed`);case`job_failed`:return t(`common:status.failed`);case`job_canceled`:return t(`common:status.canceled`);default:return t(`feed.typeStarted`)}}function x(e){switch(e){case`job_completed`:return`text-green-500 aurora-light:text-accent-success`;case`job_failed`:return`text-red-500 aurora-light:text-destructive`;case`job_canceled`:return`text-muted-foreground`;default:return`text-blue-500 aurora-light:text-accent-info`}}function S(){let{t:e}=a(`activity`),{activeProjectId:t}=d(),{items:n,loading:r,hasMore:i,loadMore:o}=g({activeProjectId:t}),s=(0,m.useRef)(null);return(0,m.useEffect)(()=>{let e=s.current;if(!e)return;let t=new IntersectionObserver(e=>{e[0].isIntersecting&&i&&!r&&o()},{threshold:.1});return t.observe(e),()=>t.disconnect()},[i,r,o]),(0,_.jsxs)(`div`,{className:`flex flex-col h-full overflow-hidden`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-2 px-4 py-3 border-b border-border bg-background/50`,children:[(0,_.jsx)(p,{className:`w-4 h-4 text-muted-foreground`}),(0,_.jsx)(`h1`,{className:`text-sm font-medium`,children:e(`feed.title`)})]}),(0,_.jsxs)(`div`,{className:`flex-1 overflow-y-auto`,children:[r&&n.length===0?(0,_.jsx)(`div`,{className:`flex items-center justify-center h-32`,children:(0,_.jsx)(c,{className:`w-4 h-4 animate-spin text-muted-foreground`})}):n.length===0?(0,_.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-48 gap-2 text-muted-foreground`,children:[(0,_.jsx)(p,{className:`w-8 h-8 opacity-40`}),(0,_.jsx)(`p`,{className:`text-sm`,children:e(`feed.emptyTitle`)}),(0,_.jsx)(`p`,{className:`text-xs opacity-70`,children:e(`feed.emptyHint`)})]}):(0,_.jsx)(`ul`,{className:`divide-y divide-border/50`,children:n.map(t=>(0,_.jsxs)(`li`,{className:`flex items-center gap-3 px-4 py-2.5 hover:bg-accent/30 transition-colors`,children:[(0,_.jsx)(y,{type:t.type}),(0,_.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,_.jsx)(`p`,{className:`text-xs text-foreground truncate`,title:t.jobCommand,children:t.jobCommand}),(0,_.jsxs)(`div`,{className:`flex items-center gap-2 mt-0.5`,children:[(0,_.jsx)(`span`,{className:`text-xs font-medium ${x(t.type)}`,children:b(t.type,e)}),t.costUsd!=null&&(0,_.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`$`,t.costUsd.toFixed(4)]})]})]}),(0,_.jsx)(`span`,{className:`text-xs text-muted-foreground flex-shrink-0 tabular-nums`,children:v(t.timestamp,e)})]},`${t.type}:${t.jobId}`))}),(0,_.jsx)(`div`,{ref:s,className:`h-1`}),r&&n.length>0&&(0,_.jsx)(`div`,{className:`flex justify-center py-3`,children:(0,_.jsx)(c,{className:`w-4 h-4 animate-spin text-muted-foreground`})}),!i&&n.length>0&&(0,_.jsx)(`p`,{className:`text-center text-xs text-muted-foreground py-3`,children:e(`feed.allLoaded`)})]})]})}export{S as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t,t as n}from"./jsx-runtime-zu2_FqZY.js";import{n as r}from"./createLucideIcon-Bjbbp_KS.js";import{n as i}from"./dist-bVqfYmby.js";import{O as a,a as o,n as s,u as c}from"./index-DIhMEAVw.js";var l=e(t(),1);function u(e,t){let n=e.indexOf(`,`);if(!e.startsWith(`data:`)||n===-1)throw Error(`dataUrlToFile: not a data URL`);let r=e.slice(0,n),i=/^data:([^;,]+)/.exec(r)?.[1]||`application/octet-stream`,a=e.slice(n+1);if(/;base64$/i.test(r)){let e=atob(a),n=new Uint8Array(e.length);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t);return new File([n],t,{type:i})}return new File([decodeURIComponent(a)],t,{type:i})}var d=n();function f({projectId:e,conversationId:t}){let{t:n}=r(`agent`),{closeBrowser:f,queueCapture:p}=o(),{materializeDraftConversation:m}=s(),h=(0,l.useMemo)(()=>`agent-${t??`home`}-${Math.round(performance.now())}`,[t]),g=async e=>{try{let r=await c(t??(await m()).id,u(e.screenshotDataUrl,`capture-${Date.now()}.png`));p(r),i.success(n(`workspace.browserCaptured`)),f()}catch(e){i.error(n(`workspace.uploadFailed`),{description:e instanceof Error?e.message:void 0})}};return(0,d.jsx)(a,{open:!0,onClose:f,projectId:e,pendingSpecId:h,confirmLabel:n(`workspace.browserConfirm`),selectLabel:n(`workspace.browserSelectStart`),onCaptured:e=>{g(e)}})}export{f as AgentBrowserCapture};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AnalyticsPage-BtQuyfJm.js","assets/rolldown-runtime-CNC7AqOf.js","assets/jsx-runtime-zu2_FqZY.js","assets/chunk-KS7C4IRE-DEKu087k.js","assets/preload-helper-Czpn1I53.js","assets/i18n-hnX2DPmo.js","assets/createLucideIcon-Bjbbp_KS.js","assets/auth-D_5bQv5W.js","assets/activity-DiyjsgQV.js","assets/addspec-D2YIQ0GU.js","assets/agent-DB1JeE64.js","assets/agents-ms7TwG16.js","assets/agentstudio-CN2pokQu.js","assets/aiedit-iIjz2_Qk.js","assets/analytics-BMzCvrCU.js","assets/attachments-B53PG733.js","assets/browser-Cu58EpZU.js","assets/builder-CHuahItu.js","assets/chat-BGD7MXAy.js","assets/code-CHPkOkDS.js","assets/commands-6tYQih5m.js","assets/common-DHsv9N5d.js","assets/dashboard-B9GhC5ku.js","assets/explore-DgBACn39.js","assets/integrations-mB-7zoyT.js","assets/jira-CKJg3HZd.js","assets/jobs-B_TeSQxb.js","assets/loops-B7YpGizO.js","assets/mcp-D8BT78_L.js","assets/narration-DRaDnhT5.js","assets/nav-DjkmQJjd.js","assets/packet-Bh5kkbiB.js","assets/settings-DHh7_IF5.js","assets/setup-3jWaoVUO.js","assets/specs-DII0C8gw.js","assets/terminal-BFRZnMPP.js","assets/tickets-W6pBmbrX.js","assets/Trans-Bsz9_gyq.js","assets/bot-DzuuuC5R.js","assets/useDesktop-BQVt8lFd.js","assets/dist-bVqfYmby.js","assets/react-dom-DiWzBDP9.js","assets/clsx-CjueKrWZ.js","assets/provider-capabilities-Doej9lfa.js","assets/formatDistanceToNow-DQCvMgUc.js","assets/getTimezoneOffsetInMilliseconds-C16cxSe1.js","assets/spending-EC9xqio-.js","assets/index-DIhMEAVw.js","assets/save-B6wGWwBR.js","assets/TicketDetailModal-CsF-AWZX.js","assets/MinimizedChatsContext-Bd3OqR_S.js","assets/sparkles-DrY8hb0X.js","assets/x-CBMI9ejn.js","assets/file-text-BcLCfcWZ.js","assets/circle-x-CMYsN4ZH.js","assets/download-CFHyyHcw.js","assets/git-branch-BRM0F5GN.js","assets/loader-circle-DcygOQpC.js","assets/pencil-C9RkrIPZ.js","assets/play-DNlrawbS.js","assets/plus-CsnjfkmX.js","assets/search-Cq_gE3Ik.js","assets/trash-2-BOU3WdZZ.js","assets/triangle-alert-H9T4jAmh.js","assets/jira-api-B1-MUehg.js","assets/zap-CHo3aCD1.js","assets/dialog-CdWCb02j.js","assets/utils-BC4DHlz2.js","assets/button-CJqFnUOL.js","assets/lib-CGdyxIWg.js","assets/git-refresh-wTW0rO0Z.js","assets/core-B3mKBIh5.js","assets/event-Bt7f3wXe.js","assets/index-DwygcU7s.css","assets/ExportDropdown-BrtfWzEG.js","assets/BarChart-nBOMNfiy.js","assets/value-s-gzBeyF.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t,t as n}from"./jsx-runtime-zu2_FqZY.js";import{t as r}from"./preload-helper-Czpn1I53.js";import{n as i}from"./createLucideIcon-Bjbbp_KS.js";import{t as a}from"./loader-circle-DcygOQpC.js";import{t as o}from"./x-CBMI9ejn.js";import{t as s}from"./utils-BC4DHlz2.js";import{a as c,ft as l,pt as u}from"./index-DIhMEAVw.js";var d=e(t(),1),f=n(),p=(0,d.lazy)(()=>r(()=>import(`./AnalyticsPage-BtQuyfJm.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76]))),m=420,h=560;function g(){let{t:e}=i(`agent`),{closeAnalyticsPane:t}=c(),[n,r]=(0,d.useState)(h),[g,_]=(0,d.useState)(!1),v=(0,d.useCallback)(e=>{let t=e.clientX,i=n,a=window.innerWidth-m;try{e.currentTarget.setPointerCapture(e.pointerId)}catch{}let o=e=>{let n=Math.min(Math.max(i+(t-e.clientX),m),a);r(n)},s=()=>{window.removeEventListener(`pointermove`,o),window.removeEventListener(`pointerup`,s),window.removeEventListener(`pointercancel`,s)};window.addEventListener(`pointermove`,o),window.addEventListener(`pointerup`,s),window.addEventListener(`pointercancel`,s)},[n]);return(0,f.jsxs)(`div`,{className:s(`flex h-full flex-col overflow-hidden border-l border-border bg-background`,g&&`absolute inset-0 z-30 border-l-0`),style:g?void 0:{width:n,flexShrink:0},"data-testid":`agent-analytics-pane`,children:[(0,f.jsx)(`div`,{className:`relative flex items-center`,children:!g&&(0,f.jsx)(`div`,{role:`separator`,"aria-orientation":`vertical`,onPointerDown:v,className:`absolute left-0 top-0 h-full w-1.5 -translate-x-full cursor-col-resize select-none touch-none hover:bg-accent-primary/20`,title:e(`workspace.resizeAnalytics`)})}),(0,f.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-border/60 bg-surface/40 px-3 py-1.5`,children:[(0,f.jsx)(`span`,{className:`text-xs font-medium text-foreground/70`,children:e(`workspace.analytics`)}),(0,f.jsxs)(`div`,{className:`ml-auto flex items-center gap-1`,children:[(0,f.jsx)(`button`,{type:`button`,onClick:()=>_(e=>!e),"aria-label":e(g?`restore`:`maximize`),title:e(g?`restore`:`maximize`),className:`rounded-md p-1 text-foreground/60 hover:bg-surface hover:text-foreground`,children:g?(0,f.jsx)(l,{className:`h-4 w-4`}):(0,f.jsx)(u,{className:`h-4 w-4`})}),(0,f.jsx)(`button`,{type:`button`,onClick:t,"aria-label":e(`workspace.closeAnalytics`),title:e(`workspace.closeAnalytics`),className:`rounded-md p-1 text-foreground/60 hover:bg-surface hover:text-foreground`,children:(0,f.jsx)(o,{className:`h-4 w-4`})})]})]}),(0,f.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:(0,f.jsx)(d.Suspense,{fallback:(0,f.jsx)(`div`,{className:`flex h-24 items-center justify-center text-muted-foreground`,children:(0,f.jsx)(a,{className:`h-4 w-4 animate-spin`})}),children:(0,f.jsx)(p,{})})})]})}export{g as AgentModeAnalyticsPane};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/CodePage-BZ2MwdCu.js","assets/rolldown-runtime-CNC7AqOf.js","assets/jsx-runtime-zu2_FqZY.js","assets/react-dom-DiWzBDP9.js","assets/preload-helper-Czpn1I53.js","assets/chunk-KS7C4IRE-DEKu087k.js","assets/i18n-hnX2DPmo.js","assets/createLucideIcon-Bjbbp_KS.js","assets/auth-D_5bQv5W.js","assets/activity-DiyjsgQV.js","assets/addspec-D2YIQ0GU.js","assets/agent-DB1JeE64.js","assets/agents-ms7TwG16.js","assets/agentstudio-CN2pokQu.js","assets/aiedit-iIjz2_Qk.js","assets/analytics-BMzCvrCU.js","assets/attachments-B53PG733.js","assets/browser-Cu58EpZU.js","assets/builder-CHuahItu.js","assets/chat-BGD7MXAy.js","assets/code-CHPkOkDS.js","assets/commands-6tYQih5m.js","assets/common-DHsv9N5d.js","assets/dashboard-B9GhC5ku.js","assets/explore-DgBACn39.js","assets/integrations-mB-7zoyT.js","assets/jira-CKJg3HZd.js","assets/jobs-B_TeSQxb.js","assets/loops-B7YpGizO.js","assets/mcp-D8BT78_L.js","assets/narration-DRaDnhT5.js","assets/nav-DjkmQJjd.js","assets/packet-Bh5kkbiB.js","assets/settings-DHh7_IF5.js","assets/setup-3jWaoVUO.js","assets/specs-DII0C8gw.js","assets/terminal-BFRZnMPP.js","assets/tickets-W6pBmbrX.js","assets/dist-bVqfYmby.js","assets/TicketDetailModal-CsF-AWZX.js","assets/Trans-Bsz9_gyq.js","assets/save-B6wGWwBR.js","assets/MinimizedChatsContext-Bd3OqR_S.js","assets/sparkles-DrY8hb0X.js","assets/x-CBMI9ejn.js","assets/useDesktop-BQVt8lFd.js","assets/file-text-BcLCfcWZ.js","assets/circle-x-CMYsN4ZH.js","assets/download-CFHyyHcw.js","assets/git-branch-BRM0F5GN.js","assets/loader-circle-DcygOQpC.js","assets/pencil-C9RkrIPZ.js","assets/play-DNlrawbS.js","assets/plus-CsnjfkmX.js","assets/search-Cq_gE3Ik.js","assets/trash-2-BOU3WdZZ.js","assets/triangle-alert-H9T4jAmh.js","assets/jira-api-B1-MUehg.js","assets/zap-CHo3aCD1.js","assets/dialog-CdWCb02j.js","assets/utils-BC4DHlz2.js","assets/clsx-CjueKrWZ.js","assets/button-CJqFnUOL.js","assets/provider-capabilities-Doej9lfa.js","assets/lib-CGdyxIWg.js","assets/formatDistanceToNow-DQCvMgUc.js","assets/getTimezoneOffsetInMilliseconds-C16cxSe1.js","assets/spending-EC9xqio-.js","assets/index-DIhMEAVw.js","assets/bot-DzuuuC5R.js","assets/git-refresh-wTW0rO0Z.js","assets/core-B3mKBIh5.js","assets/event-Bt7f3wXe.js","assets/index-DwygcU7s.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t,t as n}from"./jsx-runtime-zu2_FqZY.js";import{t as r}from"./preload-helper-Czpn1I53.js";import{n as i}from"./createLucideIcon-Bjbbp_KS.js";import{t as a}from"./x-CBMI9ejn.js";import{a as o,ft as s,pt as c}from"./index-DIhMEAVw.js";var l=e(t(),1),u=n(),d=(0,l.lazy)(()=>r(()=>import(`./CodePage-BZ2MwdCu.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73]))),f=new Map,p=420,m=560;function h({projectId:e,conversationId:t}){let{t:n}=i(`agent`),{closeCodePane:r}=o(),[h,g]=(0,l.useState)(m),[_,v]=(0,l.useState)(!1),y=(0,l.useRef)(null),b=`${e}:${t}`,x=(0,l.useCallback)(e=>{f.set(b,e)},[b]),S=(0,l.useCallback)(e=>{let t=e.clientX,n=h,r=window.innerWidth-p;try{e.currentTarget.setPointerCapture(e.pointerId)}catch{}let i=e=>{let i=Math.min(Math.max(n+(t-e.clientX),p),r);g(i)},a=()=>{window.removeEventListener(`pointermove`,i),window.removeEventListener(`pointerup`,a),window.removeEventListener(`pointercancel`,a)};window.addEventListener(`pointermove`,i),window.addEventListener(`pointerup`,a),window.addEventListener(`pointercancel`,a)},[h]);return(0,u.jsxs)(`div`,{ref:y,className:`flex h-full flex-col overflow-hidden border-l border-border bg-background${_?` absolute inset-0 z-30 border-l-0`:``}`,style:_?void 0:{width:h,flexShrink:0},children:[(0,u.jsx)(`div`,{className:`relative flex items-center`,children:!_&&(0,u.jsx)(`div`,{role:`separator`,"aria-orientation":`vertical`,onPointerDown:S,className:`absolute left-0 top-0 h-full w-1.5 -translate-x-full cursor-col-resize select-none touch-none hover:bg-accent-primary/20`,title:n(`workspace.resizeCode`)})}),(0,u.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-border/60 bg-surface/40 px-3 py-1.5`,children:[(0,u.jsx)(`span`,{className:`text-xs font-medium text-foreground/70`,children:n(`workspace.files`)}),(0,u.jsxs)(`div`,{className:`ml-auto flex items-center gap-1`,children:[(0,u.jsx)(`button`,{type:`button`,onClick:()=>v(e=>!e),"aria-label":n(_?`restore`:`maximize`),title:n(_?`restore`:`maximize`),className:`rounded-md p-1 text-foreground/60 hover:bg-surface hover:text-foreground`,children:_?(0,u.jsx)(s,{className:`h-4 w-4`}):(0,u.jsx)(c,{className:`h-4 w-4`})}),(0,u.jsx)(`button`,{type:`button`,onClick:r,"aria-label":n(`workspace.closeFiles`),title:n(`workspace.closeFiles`),className:`rounded-md p-1 text-foreground/60 hover:bg-surface hover:text-foreground`,children:(0,u.jsx)(a,{className:`h-4 w-4`})})]})]}),(0,u.jsx)(`div`,{className:`min-h-0 flex-1 overflow-hidden`,children:(0,u.jsx)(l.Suspense,{fallback:(0,u.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:`…`}),children:(0,u.jsx)(d,{embedded:!0,initialPath:f.get(b)??null,onSelectedPathChange:x})})})]},b)}export{h as AgentModeCodePane};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t,t as n}from"./jsx-runtime-zu2_FqZY.js";import{a as r,w as i}from"./i18n-hnX2DPmo.js";import{n as a}from"./createLucideIcon-Bjbbp_KS.js";import{t as o}from"./loader-circle-DcygOQpC.js";import{t as s}from"./x-CBMI9ejn.js";import{a as c,i as l,r as u}from"./useDesktop-BQVt8lFd.js";import{t as d}from"./utils-BC4DHlz2.js";import{t as f}from"./formatDistanceToNow-DQCvMgUc.js";import{L as p,a as m,ft as h,jt as g,pt as _}from"./index-DIhMEAVw.js";import{n as v,t as y}from"./job-time-BCL7wee9.js";import{JobDetailModal as b}from"./JobDetailModal-NAJmuYIT.js";import{t as x}from"./format-command-C0D9IPmV.js";var S=e(t(),1),C=n(),w=360,T=480,E={running:`running`,completed:`success`,failed:`failed`,canceled:`canceled`,queued:`queued`};function D({projectId:e}){let{t}=a(`agent`),{t:n}=a(`jobs`),{closeJobsPane:D}=m(),{projects:O}=u(),k=O.find(t=>t.id===e)?.provider,[A,j]=(0,S.useState)(T),[M,N]=(0,S.useState)(!1),[P,F]=(0,S.useState)(null),{data:I,isFirstLoad:L,refresh:R}=l({namespace:`agent-jobs`,projectId:e,initialValue:[],fetcher:async()=>{let e=await fetch(`${c()}/jobs?limit=50`);return e.ok?(await e.json()).jobs:[]},pollInterval:5e3}),{registerHandler:z,unregisterHandler:B}=i(),V=(0,S.useRef)(e);V.current=e;let H=(0,S.useRef)(R);H.current=R,(0,S.useEffect)(()=>(z(`agent-jobs-pane`,e=>{let t=e;t.type===`queue`&&(t.projectId&&t.projectId!==V.current||H.current())}),()=>B(`agent-jobs-pane`)),[z,B]);let U=(0,S.useCallback)(e=>{let t=e.clientX,n=A,r=window.innerWidth-w;try{e.currentTarget.setPointerCapture(e.pointerId)}catch{}let i=e=>{let i=Math.min(Math.max(n+(t-e.clientX),w),r);j(i)},a=()=>{window.removeEventListener(`pointermove`,i),window.removeEventListener(`pointerup`,a),window.removeEventListener(`pointercancel`,a)};window.addEventListener(`pointermove`,i),window.addEventListener(`pointerup`,a),window.addEventListener(`pointercancel`,a)},[A]);return(0,C.jsxs)(`div`,{className:d(`flex h-full flex-col overflow-hidden border-l border-border bg-background`,M&&`absolute inset-0 z-30 border-l-0`),style:M?void 0:{width:A,flexShrink:0},children:[(0,C.jsx)(`div`,{className:`relative flex items-center`,children:!M&&(0,C.jsx)(`div`,{role:`separator`,"aria-orientation":`vertical`,onPointerDown:U,className:`absolute left-0 top-0 h-full w-1.5 -translate-x-full cursor-col-resize select-none touch-none hover:bg-accent-primary/20`,title:t(`workspace.resizeJobs`)})}),(0,C.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-border/60 bg-surface/40 px-3 py-1.5`,children:[(0,C.jsx)(`span`,{className:`text-xs font-medium text-foreground/70`,children:t(`workspace.jobs`)}),(0,C.jsxs)(`div`,{className:`ml-auto flex items-center gap-1`,children:[(0,C.jsx)(`button`,{type:`button`,onClick:()=>N(e=>!e),"aria-label":t(M?`restore`:`maximize`),title:t(M?`restore`:`maximize`),className:`rounded-md p-1 text-foreground/60 hover:bg-surface hover:text-foreground`,children:M?(0,C.jsx)(h,{className:`h-4 w-4`}):(0,C.jsx)(_,{className:`h-4 w-4`})}),(0,C.jsx)(`button`,{type:`button`,onClick:D,"aria-label":t(`workspace.closeJobs`),title:t(`workspace.closeJobs`),className:`rounded-md p-1 text-foreground/60 hover:bg-surface hover:text-foreground`,children:(0,C.jsx)(s,{className:`h-4 w-4`})})]})]}),(0,C.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-2`,children:L?(0,C.jsx)(`div`,{className:`flex h-24 items-center justify-center text-muted-foreground`,children:(0,C.jsx)(o,{className:`h-4 w-4 animate-spin`})}):I.length===0?(0,C.jsxs)(`div`,{className:`flex h-full flex-col items-center justify-center gap-2 text-center text-muted-foreground`,children:[(0,C.jsx)(g,{className:`h-6 w-6 opacity-40`}),(0,C.jsx)(`p`,{className:`text-xs`,children:t(`workspace.noJobs`)})]}):(0,C.jsx)(`ul`,{className:`space-y-1`,children:I.map(e=>(0,C.jsx)(`li`,{children:(0,C.jsxs)(`button`,{type:`button`,onClick:()=>F(e.id),className:d(`flex w-full flex-col gap-1 rounded-lg border border-border/50 bg-surface/30 px-2.5 py-2 text-left transition-colors`,`hover:border-accent-primary/40 hover:bg-surface/60`),children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,C.jsx)(p,{variant:E[e.status]??`queued`,children:n(`statusLabel.${e.status in E?e.status:`queued`}`)}),e.status===`running`&&(0,C.jsx)(o,{className:`h-3 w-3 animate-spin text-accent-primary`}),(0,C.jsx)(`span`,{className:`ml-auto text-[10px] text-muted-foreground`,children:(()=>{let t=v(y(e));return t?f(t,{addSuffix:!0,locale:r()}):`—`})()})]}),(0,C.jsx)(`code`,{className:`truncate font-mono text-xs text-foreground/85`,children:x(e.command,k)})]})},e.id))})}),P&&(0,C.jsx)(b,{jobId:P,onClose:()=>F(null)})]})}export{D as AgentModeJobsPane};
|