farming-code 2.2.30 → 2.2.32
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/THIRD_PARTY_NOTICES.md +7 -0
- package/backend/acp/{client-services.js → client-services.cjs} +132 -134
- package/backend/acp/packaged-claude-acp.cjs +37 -0
- package/backend/acp/packaged-codex-acp.cjs +37 -0
- package/backend/acp/patch-decisions.cjs +182 -0
- package/backend/acp/permission-security.cjs +131 -0
- package/backend/{acp-checkpoint-store.js → acp-checkpoint-store.cjs} +90 -59
- package/backend/{acp-runtime.js → acp-runtime.cjs} +1220 -1112
- package/backend/acp-session-state.cjs +622 -0
- package/backend/acp-transcript.cjs +525 -0
- package/backend/agent-env.cjs +257 -0
- package/backend/agent-extension-discovery.cjs +452 -0
- package/backend/agent-extension-inventory.cjs +116 -0
- package/backend/agent-json-stream.cjs +283 -0
- package/backend/agent-lifecycle-journal.cjs +185 -0
- package/backend/{agent-manager.js → agent-manager.cjs} +3116 -4275
- package/backend/agent-order-transaction.cjs +85 -0
- package/backend/agent-order.cjs +159 -0
- package/backend/agent-provider-session.cjs +98 -0
- package/backend/agent-runtime-binding.cjs +179 -0
- package/backend/agent-session-history.cjs +1022 -0
- package/backend/agent-session-inventory.cjs +291 -0
- package/backend/async-cache.cjs +104 -0
- package/backend/atomic-json-store.cjs +67 -0
- package/backend/auth.cjs +261 -0
- package/backend/authoritative-inventory-cache.cjs +383 -0
- package/backend/business-health.cjs +68 -0
- package/backend/chat-runtime.cjs +50 -0
- package/backend/claude-settings.cjs +132 -0
- package/backend/cli-agents.cjs +435 -0
- package/backend/codex-context-window.cjs +196 -0
- package/backend/codex-models.cjs +228 -0
- package/backend/codex-session-archive.cjs +82 -0
- package/backend/codex-session-history.cjs +590 -0
- package/backend/{codex-terminal-profile.js → codex-terminal-profile.cjs} +149 -155
- package/backend/codex-transcript-sanitizer.cjs +130 -0
- package/backend/codex-transcript.cjs +2107 -0
- package/backend/command-runner-child.cjs +105 -0
- package/backend/config-manager.cjs +1263 -0
- package/backend/control-api.cjs +439 -0
- package/backend/data/LICENSE.cua +21 -0
- package/backend/executable-discovery.cjs +204 -0
- package/backend/farming-agent-bootstrap.cjs +81 -0
- package/backend/farming-agent-bootstrap.zh_cn.md +6 -2
- package/backend/{farming-app-cli.js → farming-app-cli.cjs} +441 -493
- package/backend/farming-cli.cjs +414 -0
- package/backend/farming-net-pass.cjs +319 -0
- package/backend/farming-net-registry.cjs +123 -0
- package/backend/farming-net-server.cjs +309 -0
- package/backend/farming-session-store.cjs +651 -0
- package/backend/git-worktree-info.cjs +181 -0
- package/backend/haiku-token.cjs +828 -0
- package/backend/index-html.cjs +96 -0
- package/backend/input-parts.cjs +68 -0
- package/backend/input-routing.cjs +40 -0
- package/backend/{local-session-engine.js → local-session-engine.cjs} +276 -282
- package/backend/main-agent-skills.cjs +309 -0
- package/backend/main-page-session.cjs +132 -0
- package/backend/native-pty-controller-generation.cjs +139 -0
- package/backend/{native-pty-host-client.js → native-pty-host-client.cjs} +338 -346
- package/backend/native-pty-host-identity.cjs +125 -0
- package/backend/native-pty-host-path.cjs +68 -0
- package/backend/{native-pty-host.js → native-pty-host.cjs} +480 -569
- package/backend/native-session-engine.cjs +296 -0
- package/backend/network.cjs +57 -0
- package/backend/npm-update-helper.cjs +399 -0
- package/backend/packaged-node-pty.cjs +120 -0
- package/backend/preview-session-manager.cjs +89 -0
- package/backend/provider-adapters.cjs +492 -0
- package/backend/provider-home-configuration.cjs +211 -0
- package/backend/provider-session-id.cjs +79 -0
- package/backend/provider-session-service.cjs +333 -0
- package/backend/qr-share-tickets.cjs +119 -0
- package/backend/resource-broadcast-protocol.cjs +50 -0
- package/backend/review-diff-router.cjs +202 -0
- package/backend/review-diff-service.cjs +1267 -0
- package/backend/review-session-router.cjs +93 -0
- package/backend/review-session-service.cjs +470 -0
- package/backend/review-session-store.cjs +161 -0
- package/backend/review-state-router.cjs +132 -0
- package/backend/review-state-store.cjs +299 -0
- package/backend/run-history-store.cjs +97 -0
- package/backend/runtime-dependency-manager.cjs +893 -0
- package/backend/runtime-executable-invocation.cjs +37 -0
- package/backend/runtime-observation.cjs +96 -0
- package/backend/server-process-identity.cjs +70 -0
- package/backend/server.cjs +3356 -0
- package/backend/session-engine-bridge.cjs +144 -0
- package/backend/session-engine-router.cjs +105 -0
- package/backend/session-engine.cjs +64 -0
- package/backend/session-stream-protocol.cjs +181 -0
- package/backend/shell-busy-integration.cjs +442 -0
- package/backend/slash-command-discovery.cjs +423 -0
- package/backend/storage-layout.cjs +263 -0
- package/backend/system-monitor.cjs +96 -0
- package/backend/terminal-attach-checkpoint.cjs +73 -0
- package/backend/terminal-exit-quiescence.cjs +57 -0
- package/backend/{terminal-reducer-flow-control.js → terminal-reducer-flow-control.cjs} +45 -22
- package/backend/terminal-runtime-cleanup.cjs +99 -0
- package/backend/{terminal-screen-state.js → terminal-screen-state.cjs} +100 -108
- package/backend/{terminal-screen-worker-pool.js → terminal-screen-worker-pool.cjs} +89 -79
- package/backend/{terminal-screen-worker-thread.js → terminal-screen-worker-thread.cjs} +64 -65
- package/backend/terminal-screen-worker.cjs +352 -0
- package/backend/terminal-state-serialization.cjs +147 -0
- package/backend/{terminal-status.js → terminal-status.cjs} +137 -187
- package/backend/theme-manager.cjs +185 -0
- package/backend/{update-service.js → update-service.cjs} +258 -248
- package/backend/usage-forecast.cjs +95 -0
- package/backend/{usage-history-client.js → usage-history-client.cjs} +144 -94
- package/backend/usage-history-smoke.cjs +85 -0
- package/backend/usage-history-worker.cjs +60 -0
- package/backend/{usage-monitor.js → usage-monitor.cjs} +363 -390
- package/backend/workspace-directory.cjs +239 -0
- package/backend/workspace-discovery.cjs +271 -0
- package/backend/{workspace-file-router.js → workspace-file-router.cjs} +213 -282
- package/backend/{workspace-file-service.js → workspace-file-service.cjs} +1139 -1318
- package/backend/workspace-root-registry.cjs +192 -0
- package/bin/farming +1 -1
- package/dist/acp/codex-acp-1.1.4.mjs +18 -1
- package/dist/assets/App-BCkdpWB6.css +1 -0
- package/dist/assets/App-CRjKpaGp.js +697 -0
- package/dist/assets/CodeSelect-Ci8sKZPU.js +1 -0
- package/dist/assets/CodeSelect-T2eNzrOc.css +1 -0
- package/dist/assets/{FileEditorMarkdownPreview-Cs9cLv8a.js → FileEditorMarkdownPreview-V06QHlAg.js} +55 -55
- package/dist/assets/FileEditorPane-BX-Wjg9U.js +2 -0
- package/dist/assets/IconGlyphs-YhV7tqd4.js +1 -0
- package/dist/assets/ProjectFilesSection-BDT2_r0o.js +12 -0
- package/dist/assets/ReviewPage-BqAs5sG1.js +3 -0
- package/dist/assets/code-dark-B7eM_9G9.css +1 -0
- package/dist/assets/{cssMode-Bdg5RpcJ.js → cssMode-ADdAlxTO.js} +1 -1
- package/dist/assets/{editor.api2-D74ufkbr.js → editor.api2-BFLAr0YF.js} +162 -162
- package/dist/assets/file-icons-BpeqWkIB.js +1 -0
- package/dist/assets/{freemarker2-DfMDJfnE.js → freemarker2-C90q5jrp.js} +1 -1
- package/dist/assets/{handlebars-BEdPtzMT.js → handlebars-BwUQcEDq.js} +1 -1
- package/dist/assets/{html-B1fPb1QD.js → html-1s3uPKfh.js} +1 -1
- package/dist/assets/{htmlMode-CY2ZjHxH.js → htmlMode-xtKD99de.js} +1 -1
- package/dist/assets/{index-D-zetSol.js → index-C8MchCem.js} +3 -3
- package/dist/assets/{javascript-BV2OsWA0.js → javascript-Ph7ijyny.js} +1 -1
- package/dist/assets/{jsonMode-zd07aeuX.js → jsonMode-D-jGAnFH.js} +1 -1
- package/dist/assets/linkComputer-CbGyI_qx.js +1 -0
- package/dist/assets/{liquid-BParI24X.js → liquid-0IamE_cI.js} +1 -1
- package/dist/assets/{lspLanguageFeatures-BzredkoV.js → lspLanguageFeatures-BxnQunWF.js} +1 -1
- package/dist/assets/main-CLKXa6hf.css +1 -0
- package/dist/assets/{mdx-vGzUJN98.js → mdx-DdNmfivn.js} +1 -1
- package/dist/assets/{monaco.contribution-BmaeBQEc.js → monaco.contribution-B43jsUs1.js} +2 -2
- package/dist/assets/{python-CUwdLgsI.js → python-IAt4X5TS.js} +1 -1
- package/dist/assets/{razor-BScebUxU.js → razor-DRkFYW0S.js} +1 -1
- package/dist/assets/review-C8-oPKXk.css +1 -0
- package/dist/assets/{tsMode-DzUAibXK.js → tsMode-_d_4U2gf.js} +1 -1
- package/dist/assets/{typescript-D9EOeM7N.js → typescript-C7zcMq9l.js} +1 -1
- package/dist/assets/{workers-DAiomYZM.js → workers-D0nOyJzf.js} +1 -1
- package/dist/assets/workspace-editor-model-DND_Y-Bj.js +1 -0
- package/dist/assets/workspace-editor-monaco-BPWhgcIB.js +4 -0
- package/dist/assets/workspace-editor-monaco-N641qPjX.js +1 -0
- package/dist/assets/workspace-view-state-k1bTlJ_Z.js +13 -0
- package/dist/assets/{xml-wWl1dhkQ.js → xml-BR-HvxT8.js} +1 -1
- package/dist/assets/{yaml-Dc2WDaOZ.js → yaml-YtFQwh4q.js} +1 -1
- package/dist/index.html +1 -1
- package/extensions/browser/backend/agent-browser-runtime.cjs +1040 -0
- package/extensions/browser/backend/agent-capability.cjs +85 -0
- package/extensions/browser/backend/browser-mcp-server.cjs +655 -0
- package/extensions/browser/backend/browser-resource-manager.cjs +1486 -0
- package/extensions/browser/backend/browser-resource-store.cjs +228 -0
- package/extensions/browser/backend/browser-router.cjs +203 -0
- package/extensions/browser/backend/executable-discovery.cjs +248 -0
- package/extensions/browser/backend/farming-browser-client.cjs +116 -0
- package/extensions/browser/backend/index.cjs +32 -0
- package/extensions/browser/backend/managed-chromium-installer.cjs +833 -0
- package/extensions/browser/bin/farming-browser +16 -7
- package/extensions/computer/backend/agent-capability.cjs +72 -0
- package/extensions/computer/backend/computer-constants.cjs +59 -0
- package/extensions/computer/backend/computer-mcp-server.cjs +182 -0
- package/extensions/computer/backend/computer-resource-manager.cjs +1219 -0
- package/extensions/computer/backend/computer-resource-store.cjs +190 -0
- package/extensions/computer/backend/computer-router.cjs +257 -0
- package/extensions/computer/backend/cua-tools.json +3067 -0
- package/extensions/computer/backend/farming-computer-client.cjs +84 -0
- package/extensions/computer/backend/index.cjs +35 -0
- package/extensions/computer/backend/isolated-browser-provider.cjs +157 -0
- package/extensions/computer/bin/farming-computer +131 -0
- package/frontend/farming-net/app.js +255 -262
- package/frontend/ghostty-loader.js +24 -20
- package/frontend/reading-anchor.js +210 -193
- package/frontend/runtime-paths.js +24 -26
- package/frontend/session-bridge.js +90 -111
- package/frontend/session-modal-bridge.js +184 -302
- package/frontend/skin-bridge.js +20 -23
- package/frontend/skins/crt/app.js +7686 -7901
- package/frontend/skins/crt/effects.js +7 -6
- package/frontend/skins/crt/index.html +6 -6
- package/frontend/skins/crt/styles/markdown.css +4 -4
- package/frontend/terminal-bridge.js +174 -181
- package/frontend/terminal-replay.js +320 -345
- package/frontend/theme-loader.js +55 -71
- package/package.json +64 -37
- package/shared/backend-connection-status.js +38 -69
- package/shared/browser-protocol.js +235 -110
- package/shared/websocket-liveness.js +40 -0
- package/backend/acp/packaged-claude-acp.js +0 -13
- package/backend/acp/packaged-codex-acp.js +0 -13
- package/backend/acp/patch-decisions.js +0 -153
- package/backend/acp/permission-security.js +0 -108
- package/backend/acp-session-state.js +0 -634
- package/backend/acp-transcript.js +0 -512
- package/backend/agent-env.js +0 -250
- package/backend/agent-json-stream.js +0 -268
- package/backend/agent-lifecycle-journal.js +0 -133
- package/backend/agent-order.js +0 -166
- package/backend/agent-provider-session.js +0 -76
- package/backend/agent-runtime-binding.js +0 -174
- package/backend/agent-session-history.js +0 -986
- package/backend/async-cache.js +0 -94
- package/backend/atomic-json-store.js +0 -37
- package/backend/auth.js +0 -251
- package/backend/chat-runtime.js +0 -28
- package/backend/claude-settings.js +0 -121
- package/backend/cli-agents.js +0 -486
- package/backend/codex-context-window.js +0 -189
- package/backend/codex-models.js +0 -226
- package/backend/codex-session-archive.js +0 -65
- package/backend/codex-session-history.js +0 -647
- package/backend/codex-transcript-sanitizer.js +0 -115
- package/backend/codex-transcript.js +0 -2362
- package/backend/command-runner-child.js +0 -67
- package/backend/config-manager.js +0 -1117
- package/backend/control-api.js +0 -455
- package/backend/executable-discovery.js +0 -216
- package/backend/farming-agent-bootstrap.js +0 -49
- package/backend/farming-cli.js +0 -403
- package/backend/farming-net-pass.js +0 -285
- package/backend/farming-net-registry.js +0 -112
- package/backend/farming-net-server.js +0 -298
- package/backend/farming-session-store.js +0 -677
- package/backend/git-worktree-info.js +0 -181
- package/backend/haiku-token.js +0 -772
- package/backend/index-html.js +0 -80
- package/backend/input-parts.js +0 -54
- package/backend/input-routing.js +0 -24
- package/backend/json-cli-runtime.js +0 -275
- package/backend/main-agent-skills.js +0 -288
- package/backend/main-page-session.js +0 -122
- package/backend/native-pty-controller-generation.js +0 -106
- package/backend/native-pty-host-identity.js +0 -86
- package/backend/native-pty-host-path.js +0 -42
- package/backend/native-session-engine.js +0 -268
- package/backend/network.js +0 -23
- package/backend/npm-update-helper.js +0 -374
- package/backend/packaged-node-pty.js +0 -99
- package/backend/preview-session-manager.js +0 -68
- package/backend/provider-adapters.js +0 -399
- package/backend/provider-session-id.js +0 -47
- package/backend/provider-session-service.js +0 -345
- package/backend/qr-share-tickets.js +0 -100
- package/backend/review-diff-router.js +0 -180
- package/backend/review-diff-service.js +0 -1270
- package/backend/review-session-router.js +0 -74
- package/backend/review-session-service.js +0 -446
- package/backend/review-session-store.js +0 -151
- package/backend/review-state-router.js +0 -116
- package/backend/review-state-store.js +0 -286
- package/backend/run-history-store.js +0 -67
- package/backend/runtime-dependency-manager.js +0 -759
- package/backend/runtime-executable-invocation.js +0 -20
- package/backend/runtime-observation.js +0 -81
- package/backend/server-process-identity.js +0 -47
- package/backend/server.js +0 -3225
- package/backend/session-engine-bridge.js +0 -129
- package/backend/session-engine-router.js +0 -66
- package/backend/session-engine.js +0 -39
- package/backend/session-stream-protocol.js +0 -185
- package/backend/shell-busy-integration.js +0 -472
- package/backend/slash-command-discovery.js +0 -433
- package/backend/storage-layout.js +0 -205
- package/backend/system-monitor.js +0 -77
- package/backend/terminal-attach-checkpoint.js +0 -74
- package/backend/terminal-exit-quiescence.js +0 -39
- package/backend/terminal-runtime-cleanup.js +0 -80
- package/backend/terminal-screen-worker.js +0 -337
- package/backend/terminal-state-serialization.js +0 -127
- package/backend/theme-manager.js +0 -163
- package/backend/usage-forecast.js +0 -86
- package/backend/usage-history-scanner.ts +0 -2718
- package/backend/usage-history-smoke.js +0 -64
- package/backend/usage-history-worker.js +0 -34
- package/backend/workspace-directory.js +0 -232
- package/backend/workspace-discovery.js +0 -311
- package/backend/workspace-root-registry.js +0 -166
- package/dist/assets/App-BKNUILuL.css +0 -1
- package/dist/assets/App-Z1N7T0eM.js +0 -695
- package/dist/assets/FileEditorPane-CNtuGjQ3.js +0 -2
- package/dist/assets/IconGlyphs-BClgag6E.js +0 -1
- package/dist/assets/ProjectFilesSection-K3GHuQ4U.js +0 -12
- package/dist/assets/ReviewPage-BRuxFaH5.js +0 -3
- package/dist/assets/code-dark-kLsQLvpf.css +0 -1
- package/dist/assets/file-icons-BOlcJ0ZF.js +0 -1
- package/dist/assets/main-DUTz-Rd2.css +0 -1
- package/dist/assets/review-BcnwQtJv.css +0 -1
- package/dist/assets/workspace-editor-model-CSGCl21x.js +0 -1
- package/dist/assets/workspace-editor-monaco-CJNwbpCy.js +0 -4
- package/dist/assets/workspace-editor-monaco-CO9w8YV0.js +0 -1
- package/dist/assets/workspace-view-state-BjKPYp0E.js +0 -7
- package/extensions/browser/backend/agent-browser-runtime.js +0 -1041
- package/extensions/browser/backend/agent-capability.js +0 -55
- package/extensions/browser/backend/browser-mcp-server.js +0 -621
- package/extensions/browser/backend/browser-resource-manager.js +0 -1331
- package/extensions/browser/backend/browser-resource-store.js +0 -190
- package/extensions/browser/backend/browser-router.js +0 -141
- package/extensions/browser/backend/executable-discovery.js +0 -238
- package/extensions/browser/backend/farming-browser-client.js +0 -83
- package/extensions/browser/backend/index.js +0 -7
- package/extensions/browser/backend/managed-chromium-installer.js +0 -593
- package/extensions/browser/frontend/BrowserSidebarPortals.tsx +0 -360
- package/extensions/browser/frontend/BrowserViewer.tsx +0 -500
- package/extensions/browser/frontend/browser-resource-state.ts +0 -60
- package/extensions/browser/frontend/browser.css +0 -567
- package/extensions/browser/frontend/types.ts +0 -38
- package/extensions/browser/frontend/useBrowserResources.ts +0 -166
- package/frontend/vendor/ghostty-web/index.d.ts +0 -1842
- package/shared/backend-connection-status.d.ts +0 -37
- package/shared/browser-protocol.d.ts +0 -5
- /package/dist/assets/{api-w2x5QfxB.js → api-ByCV9MEr.js} +0 -0
- /package/dist/assets/{core-vPkV8P_m.js → core-Czwdx12k.js} +0 -0
- /package/dist/assets/{fsharp-DNZNZyEE.js → fsharp-BjPpkoJe.js} +0 -0
- /package/dist/assets/{go-_kPJjNc_.js → go-BkIDmSUP.js} +0 -0
- /package/dist/assets/{graphql-4HCNVt5g.js → graphql-CCJTpqi1.js} +0 -0
- /package/dist/assets/{hcl-C87ymY0o.js → hcl-s4z8lUFg.js} +0 -0
- /package/dist/assets/{ini-BYrrGNTc.js → ini-CyUW1I7Z.js} +0 -0
- /package/dist/assets/{java-B211rJbk.js → java-CFCcGRiM.js} +0 -0
- /package/dist/assets/{julia-DVPsRtBm.js → julia-DQyH_EYb.js} +0 -0
- /package/dist/assets/{kotlin-BYyNerjp.js → kotlin-B8hA5O51.js} +0 -0
- /package/dist/assets/{less-EC9UblGE.js → less-DaVdaas0.js} +0 -0
- /package/dist/assets/{lexon-B1yuUdqW.js → lexon-DLBhPd3y.js} +0 -0
- /package/dist/assets/{lua-Bo6GFzxT.js → lua-gB1c_cif.js} +0 -0
- /package/dist/assets/{m3-C-Y9cBVI.js → m3-C2T3z3gB.js} +0 -0
- /package/dist/assets/{markdown-BHu-wLbe.js → markdown-CKq-Euj1.js} +0 -0
- /package/dist/assets/{mips-Dkds26rX.js → mips-Bcs5qIDX.js} +0 -0
- /package/dist/assets/{msdax-PU4g-8_g.js → msdax-CBP48FHF.js} +0 -0
- /package/dist/assets/{mysql-fPpuGpS7.js → mysql-c7tiPcFj.js} +0 -0
- /package/dist/assets/{objective-c-Wy1e5JUf.js → objective-c-D4BZkeEV.js} +0 -0
- /package/dist/assets/{pascal-BIXwvrqU.js → pascal-CJDZg0MN.js} +0 -0
- /package/dist/assets/{pascaligo-DwR0AtL_.js → pascaligo-Bygi8Ynl.js} +0 -0
- /package/dist/assets/{perl-CGHAl8my.js → perl-aS8bkf7E.js} +0 -0
- /package/dist/assets/{pgsql-B91M73E2.js → pgsql-CzNAYFYl.js} +0 -0
- /package/dist/assets/{php-C70ttrCx.js → php-DOtoEFTT.js} +0 -0
- /package/dist/assets/{pla-BNrXaRh0.js → pla-DugRnao1.js} +0 -0
- /package/dist/assets/{postiats-Dv2IAZR9.js → postiats-DsXwusKh.js} +0 -0
- /package/dist/assets/{powerquery-CkY5Wq7J.js → powerquery-DL3o72oD.js} +0 -0
- /package/dist/assets/{powershell-uGIYLU3C.js → powershell-C1qHekys.js} +0 -0
- /package/dist/assets/{protobuf-CavfmJu-.js → protobuf-DHgsc-cH.js} +0 -0
- /package/dist/assets/{pug-Drqnyitx.js → pug-FZXlE_Iu.js} +0 -0
- /package/dist/assets/{qrcode-7uGsTEmi.js → qrcode-DJDTdjL7.js} +0 -0
- /package/dist/assets/{qsharp-C7yF-Dti.js → qsharp-bLyhI3DT.js} +0 -0
- /package/dist/assets/{r-HXLGP0_-.js → r-DjFGXbAa.js} +0 -0
- /package/dist/assets/{redis-C4y6mf2p.js → redis-DSoZ_V6u.js} +0 -0
- /package/dist/assets/{redshift-DdQrFPrv.js → redshift-CzkdCsrg.js} +0 -0
- /package/dist/assets/{restructuredtext-CBrf2PNj.js → restructuredtext-B_XPrGCQ.js} +0 -0
- /package/dist/assets/{ruby-CVtMoX2B.js → ruby-Cry2RneJ.js} +0 -0
- /package/dist/assets/{rust-Ckq4sbMP.js → rust-CWzdbFq1.js} +0 -0
- /package/dist/assets/{sb-er66OpE3.js → sb-DmofU59h.js} +0 -0
- /package/dist/assets/{scala-BdWZz-hH.js → scala-BUC2l-vN.js} +0 -0
- /package/dist/assets/{scheme-kTV_s2kP.js → scheme-CNIB_72f.js} +0 -0
- /package/dist/assets/{scss-Bymy2VJQ.js → scss-DcL4-NbX.js} +0 -0
- /package/dist/assets/{shell-bwEP1LQ1.js → shell-CgAGvSSA.js} +0 -0
- /package/dist/assets/{solidity-DCddeBgL.js → solidity-DSkt6O_P.js} +0 -0
- /package/dist/assets/{sophia-BMN3AQig.js → sophia--5ytcjDN.js} +0 -0
- /package/dist/assets/{sparql-CSXOLjzi.js → sparql-C1Srr7cD.js} +0 -0
- /package/dist/assets/{sql-COg8ewmK.js → sql-2k_O5fj7.js} +0 -0
- /package/dist/assets/{st-CIaZtBS_.js → st-DCCCPqfz.js} +0 -0
- /package/dist/assets/{swift-DXiOhUHu.js → swift-Dd8mAfOt.js} +0 -0
- /package/dist/assets/{systemverilog-BTDE6Dr2.js → systemverilog-B0-aZYXu.js} +0 -0
- /package/dist/assets/{tcl-B0zy9NvV.js → tcl-CZAZwPVX.js} +0 -0
- /package/dist/assets/{twig-D594l4Z1.js → twig-D-Ag0tdS.js} +0 -0
- /package/dist/assets/{typespec-XKVjaPqo.js → typespec-B7kTFp0Z.js} +0 -0
- /package/dist/assets/{useWorkspaceMenuKeyboard-Bpy_s69Z.js → useWorkspaceMenuKeyboard-uYZpDxhU.js} +0 -0
- /package/dist/assets/{vb-B2wYoKRV.js → vb-20w1JPum.js} +0 -0
- /package/dist/assets/{wgsl-D0Yf2LbK.js → wgsl-CLJfqFt0.js} +0 -0
- /package/dist/assets/{workspace-working-copy-C3FSR3N6.js → workspace-working-copy-Cfz07cOd.js} +0 -0
|
@@ -1,50 +1,73 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
// Generated by scripts/build-backend-runtime.ts. Do not edit.
|
|
2
|
+
"use strict";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var workspace_file_router_exports = {};
|
|
21
|
+
__export(workspace_file_router_exports, {
|
|
22
|
+
GLOBAL_WORKSPACE_FILES_AGENT_ID: () => import_workspace_root_registry.GLOBAL_WORKSPACE_FILES_AGENT_ID,
|
|
23
|
+
GLOBAL_WORKSPACE_FILES_ROOT: () => import_workspace_root_registry.GLOBAL_WORKSPACE_FILES_ROOT,
|
|
24
|
+
PROJECT_FILES_WORKSPACE_PREFIX: () => import_workspace_root_registry.PROJECT_FILES_WORKSPACE_PREFIX,
|
|
25
|
+
assertExactExternalFileReadable: () => assertExactExternalFileReadable,
|
|
26
|
+
assertGlobalWorkspacePathAllowed: () => assertGlobalWorkspacePathAllowed,
|
|
27
|
+
createWorkspaceFileRouter: () => createWorkspaceFileRouter,
|
|
28
|
+
globalWorkspaceAllowedRoots: () => globalWorkspaceAllowedRoots,
|
|
29
|
+
isGlobalWorkspaceFilesAgentId: () => isGlobalWorkspaceFilesAgentId,
|
|
30
|
+
projectWorkspaceFromFilesId: () => projectWorkspaceFromFilesId,
|
|
31
|
+
resolveWorkspaceRoot: () => resolveWorkspaceRoot,
|
|
32
|
+
sendWorkspaceFileError: () => sendWorkspaceFileError
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(workspace_file_router_exports);
|
|
35
|
+
var import_git_worktree_info = require("./git-worktree-info.cjs");
|
|
36
|
+
var import_workspace_file_service = require("./workspace-file-service.cjs");
|
|
37
|
+
var import_preview_session_manager = require("./preview-session-manager.cjs");
|
|
38
|
+
var import_workspace_root_registry = require("./workspace-root-registry.cjs");
|
|
39
|
+
const express = require("express");
|
|
40
|
+
const fs = require("fs");
|
|
41
|
+
const os = require("os");
|
|
42
|
+
const path = require("path");
|
|
43
|
+
const expressFactory = express;
|
|
44
|
+
const ROOT_REGISTRIES = /* @__PURE__ */ new WeakMap();
|
|
45
|
+
function isRecord(value) {
|
|
46
|
+
return typeof value === "object" && value !== null;
|
|
47
|
+
}
|
|
19
48
|
function isGlobalWorkspaceFilesAgentId(agentId) {
|
|
20
|
-
return agentId === GLOBAL_WORKSPACE_FILES_AGENT_ID || agentId === GLOBAL_WORKSPACE_ROOT_ID;
|
|
49
|
+
return agentId === import_workspace_root_registry.GLOBAL_WORKSPACE_FILES_AGENT_ID || agentId === import_workspace_root_registry.GLOBAL_WORKSPACE_ROOT_ID;
|
|
21
50
|
}
|
|
22
|
-
|
|
23
51
|
function projectWorkspaceFromFilesId(filesId) {
|
|
24
|
-
return projectWorkspaceFromLegacyRef(filesId);
|
|
52
|
+
return (0, import_workspace_root_registry.projectWorkspaceFromLegacyRef)(filesId);
|
|
25
53
|
}
|
|
26
|
-
|
|
27
54
|
function workspaceRootRegistryFor(agentManager) {
|
|
28
55
|
let registry = ROOT_REGISTRIES.get(agentManager);
|
|
29
56
|
if (!registry) {
|
|
30
|
-
registry = new WorkspaceRootRegistry(agentManager);
|
|
57
|
+
registry = new import_workspace_root_registry.WorkspaceRootRegistry(agentManager);
|
|
31
58
|
ROOT_REGISTRIES.set(agentManager, registry);
|
|
32
59
|
}
|
|
33
60
|
return registry;
|
|
34
61
|
}
|
|
35
|
-
|
|
36
62
|
function workspaceRef(source) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
: source?.agentId;
|
|
63
|
+
if (!isRecord(source)) return void 0;
|
|
64
|
+
return typeof source.rootId === "string" && source.rootId.trim() ? source.rootId : source.agentId;
|
|
40
65
|
}
|
|
41
|
-
|
|
42
66
|
function normalizeAbsolutePath(value) {
|
|
43
|
-
const raw = String(value ||
|
|
44
|
-
if (!raw) return
|
|
67
|
+
const raw = String(value || "").trim();
|
|
68
|
+
if (!raw) return "";
|
|
45
69
|
return path.resolve(raw.replace(/^~(?=$|[\\/])/, os.homedir()));
|
|
46
70
|
}
|
|
47
|
-
|
|
48
71
|
function realPathIfPresent(value) {
|
|
49
72
|
try {
|
|
50
73
|
return fs.realpathSync(value);
|
|
@@ -52,27 +75,21 @@ function realPathIfPresent(value) {
|
|
|
52
75
|
return value;
|
|
53
76
|
}
|
|
54
77
|
}
|
|
55
|
-
|
|
56
78
|
function isSameOrDescendantPath(root, target) {
|
|
57
79
|
const relative = path.relative(root, target);
|
|
58
|
-
return relative ===
|
|
80
|
+
return relative === "" || Boolean(relative) && !relative.startsWith("..") && !path.isAbsolute(relative);
|
|
59
81
|
}
|
|
60
|
-
|
|
61
82
|
function previewAuthorizedRootForTarget(allowedRoots, target) {
|
|
62
|
-
return allowedRoots
|
|
63
|
-
.filter(root => isSameOrDescendantPath(root, target))
|
|
64
|
-
.sort((left, right) => right.length - left.length)[0] || '';
|
|
83
|
+
return allowedRoots.filter((root) => isSameOrDescendantPath(root, target)).sort((left, right) => right.length - left.length)[0] || "";
|
|
65
84
|
}
|
|
66
|
-
|
|
67
85
|
function normalizePreviewAssetPath(value) {
|
|
68
|
-
const normalized = path.posix.normalize(String(value ||
|
|
69
|
-
if (!normalized || normalized ===
|
|
70
|
-
if (normalized ===
|
|
71
|
-
throw new WorkspaceFileError(
|
|
86
|
+
const normalized = path.posix.normalize(String(value || "").replace(/\\/g, "/").replace(/^\/+/, ""));
|
|
87
|
+
if (!normalized || normalized === ".") return "";
|
|
88
|
+
if (normalized === ".." || normalized.startsWith("../") || path.posix.isAbsolute(normalized)) {
|
|
89
|
+
throw new import_workspace_file_service.WorkspaceFileError("preview path must stay inside the authorized root", 403);
|
|
72
90
|
}
|
|
73
91
|
return normalized;
|
|
74
92
|
}
|
|
75
|
-
|
|
76
93
|
function previewContentSecurityPolicy() {
|
|
77
94
|
return [
|
|
78
95
|
"default-src 'none'",
|
|
@@ -86,91 +103,65 @@ function previewContentSecurityPolicy() {
|
|
|
86
103
|
"object-src 'none'",
|
|
87
104
|
"base-uri 'none'",
|
|
88
105
|
"form-action 'none'",
|
|
89
|
-
"frame-ancestors 'self'"
|
|
90
|
-
].join(
|
|
106
|
+
"frame-ancestors 'self'"
|
|
107
|
+
].join("; ");
|
|
91
108
|
}
|
|
92
|
-
|
|
93
109
|
function escapeHtmlAttribute(value) {
|
|
94
|
-
return String(value ||
|
|
95
|
-
.replace(/&/g, '&')
|
|
96
|
-
.replace(/"/g, '"')
|
|
97
|
-
.replace(/</g, '<')
|
|
98
|
-
.replace(/>/g, '>');
|
|
110
|
+
return String(value || "").replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">");
|
|
99
111
|
}
|
|
100
|
-
|
|
101
112
|
function rewritePreviewHtmlRootReferences(source, rootUrl) {
|
|
102
113
|
const safeRootUrl = escapeHtmlAttribute(rootUrl);
|
|
103
|
-
return String(source || '')
|
|
104
|
-
.replace(/(\b(?:href|src|poster)\s*=\s*["'])\/(?!\/)/gi, `$1${safeRootUrl}`)
|
|
105
|
-
.replace(/(url\(\s*["']?)\/(?!\/)/gi, `$1${safeRootUrl}`);
|
|
114
|
+
return String(source || "").replace(/(\b(?:href|src|poster)\s*=\s*["'])\/(?!\/)/gi, `$1${safeRootUrl}`).replace(/(url\(\s*["']?)\/(?!\/)/gi, `$1${safeRootUrl}`);
|
|
106
115
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
.trim()
|
|
111
|
-
.replace(/\\/g, '/')
|
|
112
|
-
.replace(/^\/+/, '');
|
|
113
|
-
return path.resolve(GLOBAL_WORKSPACE_FILES_ROOT, normalized || '.');
|
|
116
|
+
function globalUserPathToAbsolute(userPath = "") {
|
|
117
|
+
const normalized = String(userPath || "").trim().replace(/\\/g, "/").replace(/^\/+/, "");
|
|
118
|
+
return path.resolve(import_workspace_root_registry.GLOBAL_WORKSPACE_FILES_ROOT, normalized || ".");
|
|
114
119
|
}
|
|
115
|
-
|
|
116
120
|
function relativeGlobalPath(absolutePath) {
|
|
117
|
-
const relative = path.relative(GLOBAL_WORKSPACE_FILES_ROOT, absolutePath);
|
|
118
|
-
return relative ===
|
|
121
|
+
const relative = path.relative(import_workspace_root_registry.GLOBAL_WORKSPACE_FILES_ROOT, absolutePath);
|
|
122
|
+
return relative === "" ? "" : relative.replace(/\\/g, "/");
|
|
119
123
|
}
|
|
120
|
-
|
|
121
124
|
function collectCandidateAllowedRoots(agentManager) {
|
|
122
125
|
const roots = [os.homedir()];
|
|
123
|
-
const state = agentManager && typeof agentManager.getState ===
|
|
124
|
-
? agentManager.getState()
|
|
125
|
-
: {};
|
|
126
|
+
const state = agentManager && typeof agentManager.getState === "function" ? agentManager.getState() : {};
|
|
126
127
|
for (const agent of state.agents || []) {
|
|
128
|
+
const worktree = isRecord(agent.gitWorktree) ? agent.gitWorktree : {};
|
|
127
129
|
roots.push(agent && agent.projectWorkspace);
|
|
128
130
|
roots.push(agent && agent.cwd);
|
|
129
|
-
roots.push(
|
|
131
|
+
roots.push(worktree.workspace);
|
|
130
132
|
}
|
|
131
133
|
for (const entry of state.taskHistory || []) {
|
|
132
134
|
roots.push(entry && entry.projectWorkspace);
|
|
133
135
|
roots.push(entry && entry.cwd);
|
|
134
136
|
}
|
|
135
|
-
|
|
136
137
|
const configManager = agentManager && agentManager.configManager;
|
|
137
|
-
const settings = configManager && typeof configManager.getSettings ===
|
|
138
|
-
? configManager.getSettings()
|
|
139
|
-
: null;
|
|
138
|
+
const settings = configManager && typeof configManager.getSettings === "function" ? configManager.getSettings() : null;
|
|
140
139
|
if (settings) {
|
|
141
|
-
roots.push(...
|
|
142
|
-
roots.push(...
|
|
140
|
+
roots.push(...Array.isArray(settings.workspaceHistory) ? settings.workspaceHistory : []);
|
|
141
|
+
roots.push(...Array.isArray(settings.projectWorkspaces) ? settings.projectWorkspaces : []);
|
|
143
142
|
}
|
|
144
143
|
return roots;
|
|
145
144
|
}
|
|
146
|
-
|
|
147
145
|
function globalWorkspaceAllowedRoots(agentManager) {
|
|
148
|
-
const seen = new Set();
|
|
149
|
-
return collectCandidateAllowedRoots(agentManager)
|
|
150
|
-
.
|
|
151
|
-
.
|
|
152
|
-
.
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
if (seen.has(root)) return false;
|
|
156
|
-
seen.add(root);
|
|
157
|
-
return true;
|
|
158
|
-
});
|
|
146
|
+
const seen = /* @__PURE__ */ new Set();
|
|
147
|
+
return collectCandidateAllowedRoots(agentManager).map(normalizeAbsolutePath).filter(Boolean).map(realPathIfPresent).filter((root) => {
|
|
148
|
+
if (root === path.parse(root).root) return false;
|
|
149
|
+
if (seen.has(root)) return false;
|
|
150
|
+
seen.add(root);
|
|
151
|
+
return true;
|
|
152
|
+
});
|
|
159
153
|
}
|
|
160
|
-
|
|
161
154
|
function assertGlobalWorkspacePathAllowed(agentManager, userPath, options = {}) {
|
|
162
155
|
const allowedRoots = globalWorkspaceAllowedRoots(agentManager);
|
|
163
156
|
const requestedTarget = globalUserPathToAbsolute(userPath);
|
|
164
157
|
if (!allowedRoots.length) {
|
|
165
|
-
throw new WorkspaceFileError(
|
|
158
|
+
throw new import_workspace_file_service.WorkspaceFileError("global files have no allowed roots", 403);
|
|
166
159
|
}
|
|
167
|
-
|
|
168
160
|
if (options.allowAllowedRootAncestor === true) {
|
|
169
|
-
const isAllowedRootAncestor = allowedRoots.some(root => isSameOrDescendantPath(requestedTarget, root));
|
|
161
|
+
const isAllowedRootAncestor = allowedRoots.some((root) => isSameOrDescendantPath(requestedTarget, root));
|
|
170
162
|
if (isAllowedRootAncestor) return { target: requestedTarget, allowedRoots };
|
|
171
163
|
}
|
|
172
|
-
|
|
173
|
-
const allowed = allowedRoots.some(root => {
|
|
164
|
+
const allowed = allowedRoots.some((root) => {
|
|
174
165
|
if (options.allowMissing === true) {
|
|
175
166
|
const realParent = realPathIfPresent(path.dirname(requestedTarget));
|
|
176
167
|
return isSameOrDescendantPath(root, requestedTarget) && isSameOrDescendantPath(root, realParent);
|
|
@@ -179,11 +170,10 @@ function assertGlobalWorkspacePathAllowed(agentManager, userPath, options = {})
|
|
|
179
170
|
return isSameOrDescendantPath(root, realTarget);
|
|
180
171
|
});
|
|
181
172
|
if (!allowed) {
|
|
182
|
-
throw new WorkspaceFileError(
|
|
173
|
+
throw new import_workspace_file_service.WorkspaceFileError("global file path is outside allowed workspaces", 403);
|
|
183
174
|
}
|
|
184
175
|
return { target: requestedTarget, allowedRoots };
|
|
185
176
|
}
|
|
186
|
-
|
|
187
177
|
function assertExactExternalFileReadable(userPath) {
|
|
188
178
|
const requestedTarget = globalUserPathToAbsolute(userPath);
|
|
189
179
|
let target;
|
|
@@ -193,19 +183,18 @@ function assertExactExternalFileReadable(userPath) {
|
|
|
193
183
|
stat = fs.statSync(target);
|
|
194
184
|
fs.accessSync(target, fs.constants.R_OK);
|
|
195
185
|
} catch {
|
|
196
|
-
throw new WorkspaceFileError(
|
|
186
|
+
throw new import_workspace_file_service.WorkspaceFileError("external file is not readable", 403);
|
|
197
187
|
}
|
|
198
188
|
if (!stat.isFile()) {
|
|
199
|
-
throw new WorkspaceFileError(
|
|
189
|
+
throw new import_workspace_file_service.WorkspaceFileError("external path must be a file", 400);
|
|
200
190
|
}
|
|
201
191
|
return relativeGlobalPath(target);
|
|
202
192
|
}
|
|
203
|
-
|
|
204
|
-
function globalSyntheticTree(agentManager, userPath = '') {
|
|
193
|
+
function globalSyntheticTree(agentManager, userPath = "") {
|
|
205
194
|
const { target, allowedRoots } = assertGlobalWorkspacePathAllowed(agentManager, userPath, {
|
|
206
|
-
allowAllowedRootAncestor: true
|
|
195
|
+
allowAllowedRootAncestor: true
|
|
207
196
|
});
|
|
208
|
-
const children = new Map();
|
|
197
|
+
const children = /* @__PURE__ */ new Map();
|
|
209
198
|
for (const root of allowedRoots) {
|
|
210
199
|
if (!isSameOrDescendantPath(target, root) || target === root) continue;
|
|
211
200
|
const relative = path.relative(target, root);
|
|
@@ -215,94 +204,80 @@ function globalSyntheticTree(agentManager, userPath = '') {
|
|
|
215
204
|
children.set(first, {
|
|
216
205
|
name: first,
|
|
217
206
|
path: relativeGlobalPath(childAbsolute),
|
|
218
|
-
type:
|
|
207
|
+
type: "directory",
|
|
219
208
|
size: 0,
|
|
220
|
-
mtimeMs: 0
|
|
209
|
+
mtimeMs: 0
|
|
221
210
|
});
|
|
222
211
|
}
|
|
223
212
|
return {
|
|
224
213
|
path: relativeGlobalPath(target),
|
|
225
214
|
items: Array.from(children.values()).sort((a, b) => a.name.localeCompare(b.name)),
|
|
226
|
-
gitStatusPending: false
|
|
215
|
+
gitStatusPending: false
|
|
227
216
|
};
|
|
228
217
|
}
|
|
229
|
-
|
|
230
|
-
async function listGlobalWorkspaceTree(agentManager, fileService, userPath = '') {
|
|
218
|
+
async function listGlobalWorkspaceTree(agentManager, fileService, userPath = "") {
|
|
231
219
|
const { target, allowedRoots } = assertGlobalWorkspacePathAllowed(agentManager, userPath, {
|
|
232
|
-
allowAllowedRootAncestor: true
|
|
220
|
+
allowAllowedRootAncestor: true
|
|
233
221
|
});
|
|
234
|
-
const insideAllowedRoot = allowedRoots.some(root => isSameOrDescendantPath(root, realPathIfPresent(target)));
|
|
222
|
+
const insideAllowedRoot = allowedRoots.some((root) => isSameOrDescendantPath(root, realPathIfPresent(target)));
|
|
235
223
|
if (!insideAllowedRoot) {
|
|
236
224
|
return globalSyntheticTree(agentManager, userPath);
|
|
237
225
|
}
|
|
238
|
-
return fileService.listTree(GLOBAL_WORKSPACE_FILES_ROOT, userPath ||
|
|
226
|
+
return fileService.listTree(import_workspace_root_registry.GLOBAL_WORKSPACE_FILES_ROOT, userPath || "");
|
|
239
227
|
}
|
|
240
|
-
|
|
241
228
|
function sendWorkspaceFileError(res, error) {
|
|
242
|
-
if (error instanceof WorkspaceFileError) {
|
|
229
|
+
if (error instanceof import_workspace_file_service.WorkspaceFileError) {
|
|
243
230
|
res.status(error.statusCode).json({
|
|
244
231
|
error: error.message,
|
|
245
|
-
...
|
|
232
|
+
...Object.keys(error.details || {}).length > 0 ? { details: error.details } : {}
|
|
246
233
|
});
|
|
247
234
|
return;
|
|
248
235
|
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
res.status(500).json({ error: 'workspace file operation failed' });
|
|
236
|
+
console.error("Workspace file API error:", error);
|
|
237
|
+
res.status(500).json({ error: "workspace file operation failed" });
|
|
252
238
|
}
|
|
253
|
-
|
|
254
239
|
function resolveWorkspaceRoot(agentManager, rootRef) {
|
|
255
240
|
return workspaceRootRegistryFor(agentManager).resolve(rootRef).canonicalPath;
|
|
256
241
|
}
|
|
257
|
-
|
|
258
242
|
function assertWritableWorkspaceAgent(agentId) {
|
|
259
243
|
if (isGlobalWorkspaceFilesAgentId(agentId)) {
|
|
260
|
-
throw new WorkspaceFileError(
|
|
244
|
+
throw new import_workspace_file_service.WorkspaceFileError("global files are read-only", 403);
|
|
261
245
|
}
|
|
262
246
|
}
|
|
263
|
-
|
|
264
247
|
function readOptionsForAgent(agentManager, agentId) {
|
|
265
|
-
return isGlobalWorkspaceFilesAgentId(agentId)
|
|
266
|
-
? {}
|
|
267
|
-
: { allowedExternalRoots: globalWorkspaceAllowedRoots(agentManager) };
|
|
248
|
+
return isGlobalWorkspaceFilesAgentId(agentId) ? {} : { allowedExternalRoots: globalWorkspaceAllowedRoots(agentManager) };
|
|
268
249
|
}
|
|
269
|
-
|
|
270
250
|
function createWorkspaceFileRouter(agentManager, fileService, options = {}) {
|
|
271
|
-
const router =
|
|
251
|
+
const router = expressFactory.Router();
|
|
272
252
|
const rootRegistry = options.rootRegistry || workspaceRootRegistryFor(agentManager);
|
|
273
|
-
const previewSessions = options.previewSessionManager || new PreviewSessionManager();
|
|
274
|
-
|
|
275
|
-
router.
|
|
276
|
-
|
|
277
|
-
router.get('/roots', (_req, res) => {
|
|
253
|
+
const previewSessions = options.previewSessionManager || new import_preview_session_manager.PreviewSessionManager();
|
|
254
|
+
router.use(expressFactory.json({ limit: "3mb" }));
|
|
255
|
+
router.get("/roots", (_req, res) => {
|
|
278
256
|
res.json({ roots: rootRegistry.list() });
|
|
279
257
|
});
|
|
280
|
-
|
|
281
|
-
const resolveRequestRoot = source => {
|
|
258
|
+
const resolveRequestRoot = (source) => {
|
|
282
259
|
const workspaceRoot = rootRegistry.resolve(workspaceRef(source));
|
|
283
|
-
return {
|
|
260
|
+
return {
|
|
261
|
+
kind: String(workspaceRoot.kind || ""),
|
|
262
|
+
root: workspaceRoot.canonicalPath,
|
|
263
|
+
rootId: workspaceRoot.rootId
|
|
264
|
+
};
|
|
284
265
|
};
|
|
285
|
-
|
|
286
|
-
router.get('/tree', async (req, res) => {
|
|
266
|
+
router.get("/tree", async (req, res) => {
|
|
287
267
|
try {
|
|
288
268
|
const rootRef = workspaceRef(req.query);
|
|
289
269
|
const { root, rootId } = resolveRequestRoot(req.query);
|
|
290
|
-
const tree = isGlobalWorkspaceFilesAgentId(rootRef)
|
|
291
|
-
? await listGlobalWorkspaceTree(agentManager, fileService, req.query.path || '')
|
|
292
|
-
: await fileService.listTree(root, req.query.path || '', readOptionsForAgent(agentManager, rootRef));
|
|
270
|
+
const tree = isGlobalWorkspaceFilesAgentId(rootRef) ? await listGlobalWorkspaceTree(agentManager, fileService, req.query.path || "") : await fileService.listTree(root, req.query.path || "", readOptionsForAgent(agentManager, rootRef));
|
|
293
271
|
res.json({ rootId, root, tree });
|
|
294
272
|
} catch (error) {
|
|
295
273
|
sendWorkspaceFileError(res, error);
|
|
296
274
|
}
|
|
297
275
|
});
|
|
298
|
-
|
|
299
|
-
router.get('/file', async (req, res) => {
|
|
276
|
+
router.get("/file", async (req, res) => {
|
|
300
277
|
try {
|
|
301
278
|
const rootRef = workspaceRef(req.query);
|
|
302
|
-
const requestPath = isGlobalWorkspaceFilesAgentId(rootRef) && req.query.exact ===
|
|
303
|
-
|
|
304
|
-
: req.query.path || '';
|
|
305
|
-
if (isGlobalWorkspaceFilesAgentId(rootRef) && req.query.exact !== '1') {
|
|
279
|
+
const requestPath = isGlobalWorkspaceFilesAgentId(rootRef) && req.query.exact === "1" ? assertExactExternalFileReadable(req.query.path || "") : req.query.path || "";
|
|
280
|
+
if (isGlobalWorkspaceFilesAgentId(rootRef) && req.query.exact !== "1") {
|
|
306
281
|
assertGlobalWorkspacePathAllowed(agentManager, requestPath);
|
|
307
282
|
}
|
|
308
283
|
const { root, rootId } = resolveRequestRoot(req.query);
|
|
@@ -312,54 +287,42 @@ function createWorkspaceFileRouter(agentManager, fileService, options = {}) {
|
|
|
312
287
|
sendWorkspaceFileError(res, error);
|
|
313
288
|
}
|
|
314
289
|
});
|
|
315
|
-
|
|
316
|
-
router.get('/raw', async (req, res) => {
|
|
290
|
+
router.get("/raw", async (req, res) => {
|
|
317
291
|
try {
|
|
318
292
|
const rootRef = workspaceRef(req.query);
|
|
319
|
-
const requestPath = isGlobalWorkspaceFilesAgentId(rootRef) && req.query.exact ===
|
|
320
|
-
|
|
321
|
-
: req.query.path || '';
|
|
322
|
-
if (isGlobalWorkspaceFilesAgentId(rootRef) && req.query.exact !== '1') {
|
|
293
|
+
const requestPath = isGlobalWorkspaceFilesAgentId(rootRef) && req.query.exact === "1" ? assertExactExternalFileReadable(req.query.path || "") : req.query.path || "";
|
|
294
|
+
if (isGlobalWorkspaceFilesAgentId(rootRef) && req.query.exact !== "1") {
|
|
323
295
|
assertGlobalWorkspacePathAllowed(agentManager, requestPath);
|
|
324
296
|
}
|
|
325
297
|
const { root } = resolveRequestRoot(req.query);
|
|
326
298
|
const file = await fileService.readPreviewFile(root, requestPath, readOptionsForAgent(agentManager, rootRef));
|
|
327
|
-
res
|
|
328
|
-
.status(200)
|
|
329
|
-
.type(file.preview.mediaType)
|
|
330
|
-
.set('Cache-Control', 'no-store')
|
|
331
|
-
.set('X-Content-Type-Options', 'nosniff')
|
|
332
|
-
.set('Content-Length', String(file.size))
|
|
333
|
-
.send(file.buffer);
|
|
299
|
+
res.status(200).type(file.preview.mediaType).set("Cache-Control", "no-store").set("X-Content-Type-Options", "nosniff").set("Content-Length", String(file.size)).send(file.buffer);
|
|
334
300
|
} catch (error) {
|
|
335
301
|
sendWorkspaceFileError(res, error);
|
|
336
302
|
}
|
|
337
303
|
});
|
|
338
|
-
|
|
339
|
-
router.post('/previews', async (req, res) => {
|
|
304
|
+
router.post("/previews", async (req, res) => {
|
|
340
305
|
try {
|
|
341
306
|
const body = req.body || {};
|
|
342
307
|
const rootRef = workspaceRef(body);
|
|
343
|
-
let entryPath = String(body.path ||
|
|
308
|
+
let entryPath = String(body.path || "").trim();
|
|
344
309
|
if (!/\.html?$/i.test(entryPath)) {
|
|
345
|
-
throw new WorkspaceFileError(
|
|
310
|
+
throw new import_workspace_file_service.WorkspaceFileError("HTML preview requires an .html or .htm file", 415);
|
|
346
311
|
}
|
|
347
|
-
|
|
348
312
|
let authorizedRoot;
|
|
349
313
|
if (isGlobalWorkspaceFilesAgentId(rootRef)) {
|
|
350
314
|
if (body.exact === true) {
|
|
351
315
|
entryPath = assertExactExternalFileReadable(entryPath);
|
|
352
316
|
authorizedRoot = path.dirname(realPathIfPresent(globalUserPathToAbsolute(entryPath)));
|
|
353
317
|
if (authorizedRoot === path.parse(authorizedRoot).root) {
|
|
354
|
-
throw new WorkspaceFileError(
|
|
318
|
+
throw new import_workspace_file_service.WorkspaceFileError("external HTML preview directory cannot be the filesystem root", 403);
|
|
355
319
|
}
|
|
356
320
|
} else {
|
|
357
321
|
const authorization = assertGlobalWorkspacePathAllowed(agentManager, entryPath);
|
|
358
322
|
authorizedRoot = previewAuthorizedRootForTarget(authorization.allowedRoots, realPathIfPresent(authorization.target));
|
|
359
|
-
if (!authorizedRoot) throw new WorkspaceFileError(
|
|
323
|
+
if (!authorizedRoot) throw new import_workspace_file_service.WorkspaceFileError("global file path is outside allowed workspaces", 403);
|
|
360
324
|
}
|
|
361
325
|
}
|
|
362
|
-
|
|
363
326
|
const { root, rootId } = resolveRequestRoot(body);
|
|
364
327
|
await fileService.readFile(root, entryPath, { allowedExternalRoots: [] });
|
|
365
328
|
const session = previewSessions.createStatic({
|
|
@@ -367,198 +330,177 @@ function createWorkspaceFileRouter(agentManager, fileService, options = {}) {
|
|
|
367
330
|
workspaceRoot: root,
|
|
368
331
|
authorizedRoot: realPathIfPresent(authorizedRoot || root),
|
|
369
332
|
entryPath,
|
|
370
|
-
baseDirectory: path.posix.dirname(entryPath) ===
|
|
333
|
+
baseDirectory: path.posix.dirname(entryPath) === "." ? "" : path.posix.dirname(entryPath)
|
|
371
334
|
});
|
|
372
335
|
res.status(201).json({
|
|
373
336
|
preview: {
|
|
374
337
|
id: session.id,
|
|
375
338
|
kind: session.kind,
|
|
376
|
-
expiresAt: session.expiresAt
|
|
377
|
-
}
|
|
339
|
+
expiresAt: session.expiresAt
|
|
340
|
+
}
|
|
378
341
|
});
|
|
379
342
|
} catch (error) {
|
|
380
343
|
sendWorkspaceFileError(res, error);
|
|
381
344
|
}
|
|
382
345
|
});
|
|
383
|
-
|
|
384
|
-
router.get('/previews/:sessionId/:scope/*', async (req, res) => {
|
|
346
|
+
router.get("/previews/:sessionId/:scope/*", async (req, res) => {
|
|
385
347
|
try {
|
|
386
348
|
const session = previewSessions.get(req.params.sessionId);
|
|
387
|
-
if (!session) throw new WorkspaceFileError(
|
|
349
|
+
if (!session) throw new import_workspace_file_service.WorkspaceFileError("preview session not found or expired", 404);
|
|
388
350
|
const scope = req.params.scope;
|
|
389
|
-
if (scope !==
|
|
390
|
-
throw new WorkspaceFileError(
|
|
351
|
+
if (scope !== "base" && scope !== "root") {
|
|
352
|
+
throw new import_workspace_file_service.WorkspaceFileError("preview scope is invalid", 400);
|
|
391
353
|
}
|
|
392
|
-
const assetPath = normalizePreviewAssetPath(req.params[0] ||
|
|
393
|
-
const resourcePath = scope ===
|
|
394
|
-
|
|
395
|
-
: assetPath;
|
|
396
|
-
if (!resourcePath) throw new WorkspaceFileError('preview resource path is required', 400);
|
|
397
|
-
|
|
354
|
+
const assetPath = normalizePreviewAssetPath(req.params[0] || "");
|
|
355
|
+
const resourcePath = scope === "base" ? path.posix.join(session.baseDirectory, assetPath) : assetPath;
|
|
356
|
+
if (!resourcePath) throw new import_workspace_file_service.WorkspaceFileError("preview resource path is required", 400);
|
|
398
357
|
const absoluteTarget = realPathIfPresent(path.resolve(session.workspaceRoot, resourcePath));
|
|
399
358
|
if (!isSameOrDescendantPath(session.authorizedRoot, absoluteTarget)) {
|
|
400
|
-
throw new WorkspaceFileError(
|
|
359
|
+
throw new import_workspace_file_service.WorkspaceFileError("preview path must stay inside the authorized root", 403);
|
|
401
360
|
}
|
|
402
|
-
|
|
403
361
|
const file = await fileService.readResourceFile(session.workspaceRoot, resourcePath, {
|
|
404
|
-
allowedExternalRoots: []
|
|
362
|
+
allowedExternalRoots: []
|
|
405
363
|
});
|
|
406
364
|
const isHtml = /\.html?$/i.test(file.path);
|
|
407
|
-
const body = isHtml
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
res
|
|
414
|
-
.status(200)
|
|
415
|
-
.type(path.extname(file.path) || 'application/octet-stream')
|
|
416
|
-
.set('Cache-Control', 'no-store')
|
|
417
|
-
.set('X-Content-Type-Options', 'nosniff')
|
|
418
|
-
.set('Content-Length', String(body.length));
|
|
419
|
-
if (isHtml) res.set('Content-Security-Policy', previewContentSecurityPolicy());
|
|
365
|
+
const body = isHtml ? Buffer.from(rewritePreviewHtmlRootReferences(
|
|
366
|
+
file.buffer.toString("utf8"),
|
|
367
|
+
`${req.baseUrl}/previews/${encodeURIComponent(session.id)}/root/`
|
|
368
|
+
)) : file.buffer;
|
|
369
|
+
res.status(200).type(path.extname(file.path) || "application/octet-stream").set("Cache-Control", "no-store").set("X-Content-Type-Options", "nosniff").set("Content-Length", String(body.length));
|
|
370
|
+
if (isHtml) res.set("Content-Security-Policy", previewContentSecurityPolicy());
|
|
420
371
|
res.send(body);
|
|
421
372
|
} catch (error) {
|
|
422
373
|
sendWorkspaceFileError(res, error);
|
|
423
374
|
}
|
|
424
375
|
});
|
|
425
|
-
|
|
426
|
-
router.delete('/previews/:sessionId', (req, res) => {
|
|
376
|
+
router.delete("/previews/:sessionId", (req, res) => {
|
|
427
377
|
const deleted = previewSessions.delete(req.params.sessionId);
|
|
428
378
|
res.status(deleted ? 204 : 404).end();
|
|
429
379
|
});
|
|
430
|
-
|
|
431
|
-
router.put('/file', async (req, res) => {
|
|
380
|
+
router.put("/file", async (req, res) => {
|
|
432
381
|
try {
|
|
433
382
|
const body = req.body || {};
|
|
434
383
|
const rootRef = workspaceRef(body);
|
|
435
384
|
assertWritableWorkspaceAgent(rootRef);
|
|
436
|
-
const { root, rootId } = resolveRequestRoot(body);
|
|
437
|
-
|
|
385
|
+
const { kind, root, rootId } = resolveRequestRoot(body);
|
|
386
|
+
if (kind === "agent-home") await fs.promises.mkdir(root, { recursive: true });
|
|
387
|
+
const file = await fileService.writeFile(root, body.path || "", body.content, {
|
|
438
388
|
baseSha1: body.baseSha1,
|
|
439
|
-
overwrite: body.overwrite === true
|
|
389
|
+
overwrite: body.overwrite === true
|
|
440
390
|
});
|
|
441
391
|
res.json({ rootId, root, file });
|
|
442
392
|
} catch (error) {
|
|
443
393
|
sendWorkspaceFileError(res, error);
|
|
444
394
|
}
|
|
445
395
|
});
|
|
446
|
-
|
|
447
|
-
router.post('/move', async (req, res) => {
|
|
396
|
+
router.post("/move", async (req, res) => {
|
|
448
397
|
try {
|
|
449
398
|
const body = req.body || {};
|
|
450
399
|
const rootRef = workspaceRef(body);
|
|
451
400
|
assertWritableWorkspaceAgent(rootRef);
|
|
452
401
|
const { root, rootId } = resolveRequestRoot(body);
|
|
453
|
-
const move = await fileService.moveEntry(root, body.sourcePath ||
|
|
454
|
-
expectedVersion: body.expectedVersion
|
|
402
|
+
const move = await fileService.moveEntry(root, body.sourcePath || "", body.targetDirectory || "", {
|
|
403
|
+
expectedVersion: body.expectedVersion
|
|
455
404
|
});
|
|
456
405
|
res.json({ rootId, root, move });
|
|
457
406
|
} catch (error) {
|
|
458
407
|
sendWorkspaceFileError(res, error);
|
|
459
408
|
}
|
|
460
409
|
});
|
|
461
|
-
|
|
462
|
-
router.post('/entry', async (req, res) => {
|
|
410
|
+
router.post("/entry", async (req, res) => {
|
|
463
411
|
try {
|
|
464
412
|
const body = req.body || {};
|
|
465
413
|
const rootRef = workspaceRef(body);
|
|
466
414
|
assertWritableWorkspaceAgent(rootRef);
|
|
467
415
|
const { root, rootId } = resolveRequestRoot(body);
|
|
468
|
-
const created = await fileService.createEntry(root, body.parentPath ||
|
|
416
|
+
const created = await fileService.createEntry(root, body.parentPath || "", body.name || "", body.entryType || "file", body.content || "");
|
|
469
417
|
res.status(201).json({ rootId, root, ...created });
|
|
470
418
|
} catch (error) {
|
|
471
419
|
sendWorkspaceFileError(res, error);
|
|
472
420
|
}
|
|
473
421
|
});
|
|
474
|
-
|
|
475
|
-
router.patch('/entry', async (req, res) => {
|
|
422
|
+
router.patch("/entry", async (req, res) => {
|
|
476
423
|
try {
|
|
477
424
|
const body = req.body || {};
|
|
478
425
|
const rootRef = workspaceRef(body);
|
|
479
426
|
assertWritableWorkspaceAgent(rootRef);
|
|
480
427
|
const { root, rootId } = resolveRequestRoot(body);
|
|
481
|
-
const move = await fileService.renameEntry(root, body.path ||
|
|
482
|
-
expectedVersion: body.expectedVersion
|
|
428
|
+
const move = await fileService.renameEntry(root, body.path || "", body.name || "", {
|
|
429
|
+
expectedVersion: body.expectedVersion
|
|
483
430
|
});
|
|
484
431
|
res.json({ rootId, root, move });
|
|
485
432
|
} catch (error) {
|
|
486
433
|
sendWorkspaceFileError(res, error);
|
|
487
434
|
}
|
|
488
435
|
});
|
|
489
|
-
|
|
490
|
-
router.delete('/entry', async (req, res) => {
|
|
436
|
+
router.delete("/entry", async (req, res) => {
|
|
491
437
|
try {
|
|
492
438
|
const body = req.body || {};
|
|
493
439
|
const rootRef = workspaceRef(body) || workspaceRef(req.query);
|
|
494
|
-
const targetPath = body.path || req.query.path ||
|
|
440
|
+
const targetPath = body.path || req.query.path || "";
|
|
495
441
|
assertWritableWorkspaceAgent(rootRef);
|
|
496
442
|
const workspaceRoot = rootRegistry.resolve(rootRef);
|
|
497
443
|
const { canonicalPath: root, rootId } = workspaceRoot;
|
|
498
444
|
const deleted = await fileService.deleteEntry(root, targetPath, {
|
|
499
|
-
expectedVersion: body.expectedVersion || req.query.expectedVersion
|
|
445
|
+
expectedVersion: body.expectedVersion || req.query.expectedVersion
|
|
500
446
|
});
|
|
501
447
|
res.json({ rootId, root, deleted });
|
|
502
448
|
} catch (error) {
|
|
503
449
|
sendWorkspaceFileError(res, error);
|
|
504
450
|
}
|
|
505
451
|
});
|
|
506
|
-
|
|
507
|
-
router.get('/search', async (req, res) => {
|
|
452
|
+
router.get("/search", async (req, res) => {
|
|
508
453
|
try {
|
|
509
454
|
const rootRef = workspaceRef(req.query);
|
|
510
455
|
if (isGlobalWorkspaceFilesAgentId(rootRef)) {
|
|
511
|
-
assertGlobalWorkspacePathAllowed(agentManager, req.query.path ||
|
|
456
|
+
assertGlobalWorkspacePathAllowed(agentManager, req.query.path || "");
|
|
512
457
|
}
|
|
513
458
|
const { root, rootId } = resolveRequestRoot(req.query);
|
|
514
459
|
const settings = agentManager?.configManager?.getSettings?.() || {};
|
|
515
|
-
const results = await fileService.search(root, req.query.q ||
|
|
516
|
-
includeIgnored: req.query.includeIgnored ===
|
|
517
|
-
path: req.query.path ||
|
|
460
|
+
const results = await fileService.search(root, req.query.q || "", {
|
|
461
|
+
includeIgnored: req.query.includeIgnored === "true",
|
|
462
|
+
path: req.query.path || "",
|
|
518
463
|
limit: req.query.limit,
|
|
519
|
-
timeoutMs: settings.searchTimeoutMs
|
|
464
|
+
timeoutMs: settings.searchTimeoutMs
|
|
520
465
|
});
|
|
521
466
|
res.json({ rootId, root, results });
|
|
522
467
|
} catch (error) {
|
|
523
468
|
sendWorkspaceFileError(res, error);
|
|
524
469
|
}
|
|
525
470
|
});
|
|
526
|
-
|
|
527
|
-
router.get('/diff', async (req, res) => {
|
|
471
|
+
router.get("/diff", async (req, res) => {
|
|
528
472
|
try {
|
|
529
473
|
const rootRef = workspaceRef(req.query);
|
|
530
474
|
if (isGlobalWorkspaceFilesAgentId(rootRef)) {
|
|
531
|
-
assertGlobalWorkspacePathAllowed(agentManager, req.query.path ||
|
|
475
|
+
assertGlobalWorkspacePathAllowed(agentManager, req.query.path || "", { allowMissing: true });
|
|
532
476
|
}
|
|
533
477
|
const { root, rootId } = resolveRequestRoot(req.query);
|
|
534
|
-
const diff = await fileService.diff(root, req.query.path ||
|
|
478
|
+
const diff = await fileService.diff(root, req.query.path || "");
|
|
535
479
|
res.json({ rootId, root, diff });
|
|
536
480
|
} catch (error) {
|
|
537
481
|
sendWorkspaceFileError(res, error);
|
|
538
482
|
}
|
|
539
483
|
});
|
|
540
|
-
|
|
541
|
-
router.get('/changes', async (req, res) => {
|
|
484
|
+
router.get("/changes", async (req, res) => {
|
|
542
485
|
try {
|
|
543
486
|
const rootRef = workspaceRef(req.query);
|
|
544
487
|
if (isGlobalWorkspaceFilesAgentId(rootRef)) {
|
|
545
|
-
throw new WorkspaceFileError(
|
|
488
|
+
throw new import_workspace_file_service.WorkspaceFileError("global files do not support workspace changes", 403);
|
|
546
489
|
}
|
|
547
490
|
const { root, rootId } = resolveRequestRoot(req.query);
|
|
548
491
|
const changes = await fileService.changes(root, {
|
|
549
|
-
limit: req.query.limit
|
|
492
|
+
limit: req.query.limit
|
|
550
493
|
});
|
|
551
494
|
res.json({ rootId, root, changes });
|
|
552
495
|
} catch (error) {
|
|
553
496
|
sendWorkspaceFileError(res, error);
|
|
554
497
|
}
|
|
555
498
|
});
|
|
556
|
-
|
|
557
|
-
router.get('/branch', async (req, res) => {
|
|
499
|
+
router.get("/branch", async (req, res) => {
|
|
558
500
|
try {
|
|
559
501
|
const rootRef = workspaceRef(req.query);
|
|
560
502
|
if (isGlobalWorkspaceFilesAgentId(rootRef)) {
|
|
561
|
-
throw new WorkspaceFileError(
|
|
503
|
+
throw new import_workspace_file_service.WorkspaceFileError("global files do not support git branches", 403);
|
|
562
504
|
}
|
|
563
505
|
const { root, rootId } = resolveRequestRoot(req.query);
|
|
564
506
|
const branch = await fileService.gitBranch(root);
|
|
@@ -567,62 +509,57 @@ function createWorkspaceFileRouter(agentManager, fileService, options = {}) {
|
|
|
567
509
|
sendWorkspaceFileError(res, error);
|
|
568
510
|
}
|
|
569
511
|
});
|
|
570
|
-
|
|
571
|
-
router.get('/worktrees', async (req, res) => {
|
|
512
|
+
router.get("/worktrees", async (req, res) => {
|
|
572
513
|
try {
|
|
573
514
|
const rootRef = workspaceRef(req.query);
|
|
574
515
|
if (isGlobalWorkspaceFilesAgentId(rootRef)) {
|
|
575
|
-
throw new WorkspaceFileError(
|
|
516
|
+
throw new import_workspace_file_service.WorkspaceFileError("global files do not support git worktrees", 403);
|
|
576
517
|
}
|
|
577
518
|
const { root, rootId } = resolveRequestRoot(req.query);
|
|
578
|
-
const info = await inspectGitWorktree(root, { cacheMs: 0 });
|
|
519
|
+
const info = await (0, import_git_worktree_info.inspectGitWorktree)(root, { cacheMs: 0 });
|
|
579
520
|
res.json({
|
|
580
521
|
rootId,
|
|
581
522
|
root,
|
|
582
|
-
worktrees: info
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
:
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
items: [],
|
|
596
|
-
},
|
|
523
|
+
worktrees: info ? {
|
|
524
|
+
isGitRepo: true,
|
|
525
|
+
commonDir: info.commonDir,
|
|
526
|
+
currentWorkspace: info.workspace,
|
|
527
|
+
mainWorkspace: info.mainWorkspace,
|
|
528
|
+
items: info.worktrees
|
|
529
|
+
} : {
|
|
530
|
+
isGitRepo: false,
|
|
531
|
+
commonDir: "",
|
|
532
|
+
currentWorkspace: root,
|
|
533
|
+
mainWorkspace: "",
|
|
534
|
+
items: []
|
|
535
|
+
}
|
|
597
536
|
});
|
|
598
537
|
} catch (error) {
|
|
599
538
|
sendWorkspaceFileError(res, error);
|
|
600
539
|
}
|
|
601
540
|
});
|
|
602
|
-
|
|
603
|
-
router.get('/history', async (req, res) => {
|
|
541
|
+
router.get("/history", async (req, res) => {
|
|
604
542
|
try {
|
|
605
543
|
const rootRef = workspaceRef(req.query);
|
|
606
544
|
if (isGlobalWorkspaceFilesAgentId(rootRef)) {
|
|
607
|
-
throw new WorkspaceFileError(
|
|
545
|
+
throw new import_workspace_file_service.WorkspaceFileError("global files do not support git history", 403);
|
|
608
546
|
}
|
|
609
547
|
const { root, rootId } = resolveRequestRoot(req.query);
|
|
610
548
|
const history = await fileService.gitHistory(root, {
|
|
611
549
|
limit: req.query.limit,
|
|
612
550
|
skip: req.query.skip,
|
|
613
|
-
scope: req.query.scope
|
|
551
|
+
scope: req.query.scope
|
|
614
552
|
});
|
|
615
553
|
res.json({ rootId, root, history });
|
|
616
554
|
} catch (error) {
|
|
617
555
|
sendWorkspaceFileError(res, error);
|
|
618
556
|
}
|
|
619
557
|
});
|
|
620
|
-
|
|
621
|
-
router.get('/history/changes', async (req, res) => {
|
|
558
|
+
router.get("/history/changes", async (req, res) => {
|
|
622
559
|
try {
|
|
623
560
|
const rootRef = workspaceRef(req.query);
|
|
624
561
|
if (isGlobalWorkspaceFilesAgentId(rootRef)) {
|
|
625
|
-
throw new WorkspaceFileError(
|
|
562
|
+
throw new import_workspace_file_service.WorkspaceFileError("global files do not support git history", 403);
|
|
626
563
|
}
|
|
627
564
|
const { root, rootId } = resolveRequestRoot(req.query);
|
|
628
565
|
const changes = await fileService.gitHistoryChanges(
|
|
@@ -636,50 +573,47 @@ function createWorkspaceFileRouter(agentManager, fileService, options = {}) {
|
|
|
636
573
|
sendWorkspaceFileError(res, error);
|
|
637
574
|
}
|
|
638
575
|
});
|
|
639
|
-
|
|
640
|
-
router.get('/line-changes', async (req, res) => {
|
|
576
|
+
router.get("/line-changes", async (req, res) => {
|
|
641
577
|
try {
|
|
642
578
|
const rootRef = workspaceRef(req.query);
|
|
643
579
|
if (isGlobalWorkspaceFilesAgentId(rootRef)) {
|
|
644
|
-
assertGlobalWorkspacePathAllowed(agentManager, req.query.path ||
|
|
580
|
+
assertGlobalWorkspacePathAllowed(agentManager, req.query.path || "");
|
|
645
581
|
}
|
|
646
582
|
const { root, rootId } = resolveRequestRoot(req.query);
|
|
647
583
|
const changes = await fileService.lineChanges(
|
|
648
584
|
root,
|
|
649
|
-
req.query.path ||
|
|
585
|
+
req.query.path || "",
|
|
650
586
|
req.query.lineNumber,
|
|
651
|
-
req.query.mode ||
|
|
587
|
+
req.query.mode || "working"
|
|
652
588
|
);
|
|
653
589
|
res.json({ rootId, root, changes });
|
|
654
590
|
} catch (error) {
|
|
655
591
|
sendWorkspaceFileError(res, error);
|
|
656
592
|
}
|
|
657
593
|
});
|
|
658
|
-
|
|
659
|
-
router.get('/blame', async (req, res) => {
|
|
594
|
+
router.get("/blame", async (req, res) => {
|
|
660
595
|
try {
|
|
661
596
|
const rootRef = workspaceRef(req.query);
|
|
662
597
|
if (isGlobalWorkspaceFilesAgentId(rootRef)) {
|
|
663
|
-
assertGlobalWorkspacePathAllowed(agentManager, req.query.path ||
|
|
598
|
+
assertGlobalWorkspacePathAllowed(agentManager, req.query.path || "");
|
|
664
599
|
}
|
|
665
600
|
const { root, rootId } = resolveRequestRoot(req.query);
|
|
666
|
-
const blame = await fileService.blame(root, req.query.path ||
|
|
601
|
+
const blame = await fileService.blame(root, req.query.path || "");
|
|
667
602
|
res.json({ rootId, root, blame });
|
|
668
603
|
} catch (error) {
|
|
669
604
|
sendWorkspaceFileError(res, error);
|
|
670
605
|
}
|
|
671
606
|
});
|
|
672
|
-
|
|
673
|
-
router.get('/blame-capability', async (req, res) => {
|
|
607
|
+
router.get("/blame-capability", async (req, res) => {
|
|
674
608
|
try {
|
|
675
609
|
const rootRef = workspaceRef(req.query);
|
|
676
610
|
if (isGlobalWorkspaceFilesAgentId(rootRef)) {
|
|
677
|
-
assertGlobalWorkspacePathAllowed(agentManager, req.query.path ||
|
|
611
|
+
assertGlobalWorkspacePathAllowed(agentManager, req.query.path || "");
|
|
678
612
|
}
|
|
679
613
|
const { root, rootId } = resolveRequestRoot(req.query);
|
|
680
614
|
const capability = await fileService.blameCapability(
|
|
681
615
|
root,
|
|
682
|
-
req.query.path ||
|
|
616
|
+
req.query.path || "",
|
|
683
617
|
readOptionsForAgent(agentManager, rootRef)
|
|
684
618
|
);
|
|
685
619
|
res.json({ rootId, root, capability });
|
|
@@ -687,22 +621,19 @@ function createWorkspaceFileRouter(agentManager, fileService, options = {}) {
|
|
|
687
621
|
sendWorkspaceFileError(res, error);
|
|
688
622
|
}
|
|
689
623
|
});
|
|
690
|
-
|
|
691
624
|
return router;
|
|
692
625
|
}
|
|
693
|
-
|
|
694
|
-
module.exports = {
|
|
626
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
627
|
+
0 && (module.exports = {
|
|
695
628
|
GLOBAL_WORKSPACE_FILES_AGENT_ID,
|
|
696
629
|
GLOBAL_WORKSPACE_FILES_ROOT,
|
|
697
630
|
PROJECT_FILES_WORKSPACE_PREFIX,
|
|
698
|
-
PROJECT_FILES_AGENT_PREFIX: PROJECT_FILES_WORKSPACE_PREFIX,
|
|
699
|
-
assertGlobalWorkspacePathAllowed,
|
|
700
631
|
assertExactExternalFileReadable,
|
|
632
|
+
assertGlobalWorkspacePathAllowed,
|
|
701
633
|
createWorkspaceFileRouter,
|
|
702
634
|
globalWorkspaceAllowedRoots,
|
|
703
635
|
isGlobalWorkspaceFilesAgentId,
|
|
704
636
|
projectWorkspaceFromFilesId,
|
|
705
|
-
projectWorkspaceFromFilesAgentId: projectWorkspaceFromFilesId,
|
|
706
637
|
resolveWorkspaceRoot,
|
|
707
|
-
sendWorkspaceFileError
|
|
708
|
-
};
|
|
638
|
+
sendWorkspaceFileError
|
|
639
|
+
});
|