parasor 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +208 -0
- package/THIRD-PARTY-NOTICES.md +138 -0
- package/bin/parasor.mjs +3 -0
- package/node_modules/@parasor/shared/dist/client.d.ts +8 -0
- package/node_modules/@parasor/shared/dist/client.d.ts.map +1 -0
- package/node_modules/@parasor/shared/dist/client.js +2 -0
- package/node_modules/@parasor/shared/dist/client.js.map +1 -0
- package/node_modules/@parasor/shared/dist/drops.d.ts +24 -0
- package/node_modules/@parasor/shared/dist/drops.d.ts.map +1 -0
- package/node_modules/@parasor/shared/dist/drops.js +2 -0
- package/node_modules/@parasor/shared/dist/drops.js.map +1 -0
- package/node_modules/@parasor/shared/dist/file-uploads.d.ts +56 -0
- package/node_modules/@parasor/shared/dist/file-uploads.d.ts.map +1 -0
- package/node_modules/@parasor/shared/dist/file-uploads.js +13 -0
- package/node_modules/@parasor/shared/dist/file-uploads.js.map +1 -0
- package/node_modules/@parasor/shared/dist/ide-commands.d.ts +8 -0
- package/node_modules/@parasor/shared/dist/ide-commands.d.ts.map +1 -0
- package/node_modules/@parasor/shared/dist/ide-commands.js +59 -0
- package/node_modules/@parasor/shared/dist/ide-commands.js.map +1 -0
- package/node_modules/@parasor/shared/dist/pane-commands.d.ts +7 -0
- package/node_modules/@parasor/shared/dist/pane-commands.d.ts.map +1 -0
- package/node_modules/@parasor/shared/dist/pane-commands.js +47 -0
- package/node_modules/@parasor/shared/dist/pane-commands.js.map +1 -0
- package/node_modules/@parasor/shared/dist/pane-model.d.ts +63 -0
- package/node_modules/@parasor/shared/dist/pane-model.d.ts.map +1 -0
- package/node_modules/@parasor/shared/dist/pane-model.js +89 -0
- package/node_modules/@parasor/shared/dist/pane-model.js.map +1 -0
- package/node_modules/@parasor/shared/dist/panes.d.ts +33 -0
- package/node_modules/@parasor/shared/dist/panes.d.ts.map +1 -0
- package/node_modules/@parasor/shared/dist/panes.js +2 -0
- package/node_modules/@parasor/shared/dist/panes.js.map +1 -0
- package/node_modules/@parasor/shared/dist/runtime.d.ts +180 -0
- package/node_modules/@parasor/shared/dist/runtime.d.ts.map +1 -0
- package/node_modules/@parasor/shared/dist/runtime.js +2 -0
- package/node_modules/@parasor/shared/dist/runtime.js.map +1 -0
- package/node_modules/@parasor/shared/dist/state.d.ts +192 -0
- package/node_modules/@parasor/shared/dist/state.d.ts.map +1 -0
- package/node_modules/@parasor/shared/dist/state.js +10 -0
- package/node_modules/@parasor/shared/dist/state.js.map +1 -0
- package/node_modules/@parasor/shared/dist/terminal.d.ts +191 -0
- package/node_modules/@parasor/shared/dist/terminal.d.ts.map +1 -0
- package/node_modules/@parasor/shared/dist/terminal.js +174 -0
- package/node_modules/@parasor/shared/dist/terminal.js.map +1 -0
- package/node_modules/@parasor/shared/dist/types.d.ts +13 -0
- package/node_modules/@parasor/shared/dist/types.d.ts.map +1 -0
- package/node_modules/@parasor/shared/dist/types.js +13 -0
- package/node_modules/@parasor/shared/dist/types.js.map +1 -0
- package/node_modules/@parasor/shared/dist/worktree-local-files.d.ts +14 -0
- package/node_modules/@parasor/shared/dist/worktree-local-files.d.ts.map +1 -0
- package/node_modules/@parasor/shared/dist/worktree-local-files.js +41 -0
- package/node_modules/@parasor/shared/dist/worktree-local-files.js.map +1 -0
- package/node_modules/@parasor/shared/dist/ws-events.d.ts +152 -0
- package/node_modules/@parasor/shared/dist/ws-events.d.ts.map +1 -0
- package/node_modules/@parasor/shared/dist/ws-events.js +2 -0
- package/node_modules/@parasor/shared/dist/ws-events.js.map +1 -0
- package/node_modules/@parasor/shared/package.json +13 -0
- package/package.json +61 -0
- package/server/agent-detector/agent-state-store.d.ts +23 -0
- package/server/agent-detector/agent-state-store.d.ts.map +1 -0
- package/server/agent-detector/agent-state-store.js +110 -0
- package/server/agent-detector/agent-state-store.js.map +1 -0
- package/server/agent-detector/detector.d.ts +80 -0
- package/server/agent-detector/detector.d.ts.map +1 -0
- package/server/agent-detector/detector.js +219 -0
- package/server/agent-detector/detector.js.map +1 -0
- package/server/agent-detector/event-map.d.ts +25 -0
- package/server/agent-detector/event-map.d.ts.map +1 -0
- package/server/agent-detector/event-map.js +136 -0
- package/server/agent-detector/event-map.js.map +1 -0
- package/server/agent-detector/manual-agent-tracker.d.ts +19 -0
- package/server/agent-detector/manual-agent-tracker.d.ts.map +1 -0
- package/server/agent-detector/manual-agent-tracker.js +123 -0
- package/server/agent-detector/manual-agent-tracker.js.map +1 -0
- package/server/agent-detector/output-eligibility.d.ts +3 -0
- package/server/agent-detector/output-eligibility.d.ts.map +1 -0
- package/server/agent-detector/output-eligibility.js +39 -0
- package/server/agent-detector/output-eligibility.js.map +1 -0
- package/server/application/files/errors.d.ts +28 -0
- package/server/application/files/errors.d.ts.map +1 -0
- package/server/application/files/errors.js +55 -0
- package/server/application/files/errors.js.map +1 -0
- package/server/application/files/local-filesystem.d.ts +36 -0
- package/server/application/files/local-filesystem.d.ts.map +1 -0
- package/server/application/files/local-filesystem.js +171 -0
- package/server/application/files/local-filesystem.js.map +1 -0
- package/server/application/files/project-file-queries.d.ts +16 -0
- package/server/application/files/project-file-queries.d.ts.map +1 -0
- package/server/application/files/project-file-queries.js +126 -0
- package/server/application/files/project-file-queries.js.map +1 -0
- package/server/application/integrations/errors.d.ts +16 -0
- package/server/application/integrations/errors.d.ts.map +1 -0
- package/server/application/integrations/errors.js +31 -0
- package/server/application/integrations/errors.js.map +1 -0
- package/server/application/integrations/hook-notify.d.ts +32 -0
- package/server/application/integrations/hook-notify.d.ts.map +1 -0
- package/server/application/integrations/hook-notify.js +118 -0
- package/server/application/integrations/hook-notify.js.map +1 -0
- package/server/application/integrations/open-url.d.ts +11 -0
- package/server/application/integrations/open-url.d.ts.map +1 -0
- package/server/application/integrations/open-url.js +23 -0
- package/server/application/integrations/open-url.js.map +1 -0
- package/server/application/ports.d.ts +11 -0
- package/server/application/ports.d.ts.map +1 -0
- package/server/application/ports.js +2 -0
- package/server/application/ports.js.map +1 -0
- package/server/application/workspace/errors.d.ts +21 -0
- package/server/application/workspace/errors.d.ts.map +1 -0
- package/server/application/workspace/errors.js +21 -0
- package/server/application/workspace/errors.js.map +1 -0
- package/server/application/workspace/pane-commands.d.ts +47 -0
- package/server/application/workspace/pane-commands.d.ts.map +1 -0
- package/server/application/workspace/pane-commands.js +193 -0
- package/server/application/workspace/pane-commands.js.map +1 -0
- package/server/application/workspace/project-commands.d.ts +34 -0
- package/server/application/workspace/project-commands.d.ts.map +1 -0
- package/server/application/workspace/project-commands.js +81 -0
- package/server/application/workspace/project-commands.js.map +1 -0
- package/server/application/workspace/project-queries.d.ts +21 -0
- package/server/application/workspace/project-queries.d.ts.map +1 -0
- package/server/application/workspace/project-queries.js +216 -0
- package/server/application/workspace/project-queries.js.map +1 -0
- package/server/application/workspace/session-commands.d.ts +24 -0
- package/server/application/workspace/session-commands.d.ts.map +1 -0
- package/server/application/workspace/session-commands.js +123 -0
- package/server/application/workspace/session-commands.js.map +1 -0
- package/server/application/workspace/session-queries.d.ts +14 -0
- package/server/application/workspace/session-queries.d.ts.map +1 -0
- package/server/application/workspace/session-queries.js +47 -0
- package/server/application/workspace/session-queries.js.map +1 -0
- package/server/application/workspace/worktree-commands.d.ts +98 -0
- package/server/application/workspace/worktree-commands.d.ts.map +1 -0
- package/server/application/workspace/worktree-commands.js +323 -0
- package/server/application/workspace/worktree-commands.js.map +1 -0
- package/server/application/workspace/worktree-local-files.d.ts +11 -0
- package/server/application/workspace/worktree-local-files.d.ts.map +1 -0
- package/server/application/workspace/worktree-local-files.js +223 -0
- package/server/application/workspace/worktree-local-files.js.map +1 -0
- package/server/application/workspace/worktree-reconcile.d.ts +21 -0
- package/server/application/workspace/worktree-reconcile.d.ts.map +1 -0
- package/server/application/workspace/worktree-reconcile.js +49 -0
- package/server/application/workspace/worktree-reconcile.js.map +1 -0
- package/server/auth/origin.d.ts +17 -0
- package/server/auth/origin.d.ts.map +1 -0
- package/server/auth/origin.js +93 -0
- package/server/auth/origin.js.map +1 -0
- package/server/auth/pairing-token.d.ts +28 -0
- package/server/auth/pairing-token.d.ts.map +1 -0
- package/server/auth/pairing-token.js +46 -0
- package/server/auth/pairing-token.js.map +1 -0
- package/server/auth/token-exchange.d.ts +11 -0
- package/server/auth/token-exchange.d.ts.map +1 -0
- package/server/auth/token-exchange.js +27 -0
- package/server/auth/token-exchange.js.map +1 -0
- package/server/auth/token.d.ts +18 -0
- package/server/auth/token.d.ts.map +1 -0
- package/server/auth/token.js +115 -0
- package/server/auth/token.js.map +1 -0
- package/server/bootstrap/create-app-server.d.ts +49 -0
- package/server/bootstrap/create-app-server.d.ts.map +1 -0
- package/server/bootstrap/create-app-server.js +154 -0
- package/server/bootstrap/create-app-server.js.map +1 -0
- package/server/bootstrap/project-runtime.d.ts +29 -0
- package/server/bootstrap/project-runtime.d.ts.map +1 -0
- package/server/bootstrap/project-runtime.js +253 -0
- package/server/bootstrap/project-runtime.js.map +1 -0
- package/server/bootstrap/pty-env.d.ts +3 -0
- package/server/bootstrap/pty-env.d.ts.map +1 -0
- package/server/bootstrap/pty-env.js +15 -0
- package/server/bootstrap/pty-env.js.map +1 -0
- package/server/bootstrap/reconcile-state.d.ts +16 -0
- package/server/bootstrap/reconcile-state.d.ts.map +1 -0
- package/server/bootstrap/reconcile-state.js +73 -0
- package/server/bootstrap/reconcile-state.js.map +1 -0
- package/server/bootstrap/runtime-loops.d.ts +51 -0
- package/server/bootstrap/runtime-loops.d.ts.map +1 -0
- package/server/bootstrap/runtime-loops.js +189 -0
- package/server/bootstrap/runtime-loops.js.map +1 -0
- package/server/bootstrap/runtime-port.d.ts +4 -0
- package/server/bootstrap/runtime-port.d.ts.map +1 -0
- package/server/bootstrap/runtime-port.js +52 -0
- package/server/bootstrap/runtime-port.js.map +1 -0
- package/server/bootstrap/safety-gate.d.ts +22 -0
- package/server/bootstrap/safety-gate.d.ts.map +1 -0
- package/server/bootstrap/safety-gate.js +43 -0
- package/server/bootstrap/safety-gate.js.map +1 -0
- package/server/bootstrap/shutdown-marker.d.ts +35 -0
- package/server/bootstrap/shutdown-marker.d.ts.map +1 -0
- package/server/bootstrap/shutdown-marker.js +100 -0
- package/server/bootstrap/shutdown-marker.js.map +1 -0
- package/server/bootstrap/shutdown-runtime.d.ts +62 -0
- package/server/bootstrap/shutdown-runtime.d.ts.map +1 -0
- package/server/bootstrap/shutdown-runtime.js +66 -0
- package/server/bootstrap/shutdown-runtime.js.map +1 -0
- package/server/bootstrap/startup-banner.d.ts +34 -0
- package/server/bootstrap/startup-banner.d.ts.map +1 -0
- package/server/bootstrap/startup-banner.js +114 -0
- package/server/bootstrap/startup-banner.js.map +1 -0
- package/server/bootstrap/wire-runtime.d.ts +42 -0
- package/server/bootstrap/wire-runtime.d.ts.map +1 -0
- package/server/bootstrap/wire-runtime.js +205 -0
- package/server/bootstrap/wire-runtime.js.map +1 -0
- package/server/cli/help.d.ts +3 -0
- package/server/cli/help.d.ts.map +1 -0
- package/server/cli/help.js +39 -0
- package/server/cli/help.js.map +1 -0
- package/server/cli/hook-client.d.ts +12 -0
- package/server/cli/hook-client.d.ts.map +1 -0
- package/server/cli/hook-client.js +81 -0
- package/server/cli/hook-client.js.map +1 -0
- package/server/cli/hook.d.ts +3 -0
- package/server/cli/hook.d.ts.map +1 -0
- package/server/cli/hook.js +152 -0
- package/server/cli/hook.js.map +1 -0
- package/server/cli/main.d.ts +2 -0
- package/server/cli/main.d.ts.map +1 -0
- package/server/cli/main.js +133 -0
- package/server/cli/main.js.map +1 -0
- package/server/cli/notify.d.ts +19 -0
- package/server/cli/notify.d.ts.map +1 -0
- package/server/cli/notify.js +77 -0
- package/server/cli/notify.js.map +1 -0
- package/server/cli/open.d.ts +2 -0
- package/server/cli/open.d.ts.map +1 -0
- package/server/cli/open.js +47 -0
- package/server/cli/open.js.map +1 -0
- package/server/cli/probe-daemon-version.d.ts +46 -0
- package/server/cli/probe-daemon-version.d.ts.map +1 -0
- package/server/cli/probe-daemon-version.js +167 -0
- package/server/cli/probe-daemon-version.js.map +1 -0
- package/server/cli/pty-host.d.ts +36 -0
- package/server/cli/pty-host.d.ts.map +1 -0
- package/server/cli/pty-host.js +390 -0
- package/server/cli/pty-host.js.map +1 -0
- package/server/cli/qr.d.ts +2 -0
- package/server/cli/qr.d.ts.map +1 -0
- package/server/cli/qr.js +70 -0
- package/server/cli/qr.js.map +1 -0
- package/server/cli/restart-confirm.d.ts +33 -0
- package/server/cli/restart-confirm.d.ts.map +1 -0
- package/server/cli/restart-confirm.js +107 -0
- package/server/cli/restart-confirm.js.map +1 -0
- package/server/cli/restart.d.ts +17 -0
- package/server/cli/restart.d.ts.map +1 -0
- package/server/cli/restart.js +145 -0
- package/server/cli/restart.js.map +1 -0
- package/server/cli/service-darwin.d.ts +70 -0
- package/server/cli/service-darwin.d.ts.map +1 -0
- package/server/cli/service-darwin.js +562 -0
- package/server/cli/service-darwin.js.map +1 -0
- package/server/cli/service-linux.d.ts +81 -0
- package/server/cli/service-linux.d.ts.map +1 -0
- package/server/cli/service-linux.js +412 -0
- package/server/cli/service-linux.js.map +1 -0
- package/server/cli/service.d.ts +33 -0
- package/server/cli/service.d.ts.map +1 -0
- package/server/cli/service.js +133 -0
- package/server/cli/service.js.map +1 -0
- package/server/cli/shim-installer.d.ts +35 -0
- package/server/cli/shim-installer.d.ts.map +1 -0
- package/server/cli/shim-installer.js +662 -0
- package/server/cli/shim-installer.js.map +1 -0
- package/server/cli/shim-open.d.ts +2 -0
- package/server/cli/shim-open.d.ts.map +1 -0
- package/server/cli/shim-open.js +128 -0
- package/server/cli/shim-open.js.map +1 -0
- package/server/cli/shutdown-deps.d.ts +41 -0
- package/server/cli/shutdown-deps.d.ts.map +1 -0
- package/server/cli/shutdown-deps.js +158 -0
- package/server/cli/shutdown-deps.js.map +1 -0
- package/server/cli/stop.d.ts +11 -0
- package/server/cli/stop.d.ts.map +1 -0
- package/server/cli/stop.js +123 -0
- package/server/cli/stop.js.map +1 -0
- package/server/cli/unknown-command.d.ts +8 -0
- package/server/cli/unknown-command.d.ts.map +1 -0
- package/server/cli/unknown-command.js +14 -0
- package/server/cli/unknown-command.js.map +1 -0
- package/server/debug/agent-status-recorder.d.ts +57 -0
- package/server/debug/agent-status-recorder.d.ts.map +1 -0
- package/server/debug/agent-status-recorder.js +209 -0
- package/server/debug/agent-status-recorder.js.map +1 -0
- package/server/debug/terminal-trace-recorder.d.ts +41 -0
- package/server/debug/terminal-trace-recorder.d.ts.map +1 -0
- package/server/debug/terminal-trace-recorder.js +112 -0
- package/server/debug/terminal-trace-recorder.js.map +1 -0
- package/server/fonts/catalog.d.ts +35 -0
- package/server/fonts/catalog.d.ts.map +1 -0
- package/server/fonts/catalog.js +76 -0
- package/server/fonts/catalog.js.map +1 -0
- package/server/fonts/installer.d.ts +45 -0
- package/server/fonts/installer.d.ts.map +1 -0
- package/server/fonts/installer.js +201 -0
- package/server/fonts/installer.js.map +1 -0
- package/server/fonts/routes.d.ts +4 -0
- package/server/fonts/routes.d.ts.map +1 -0
- package/server/fonts/routes.js +91 -0
- package/server/fonts/routes.js.map +1 -0
- package/server/fs/drops.d.ts +50 -0
- package/server/fs/drops.d.ts.map +1 -0
- package/server/fs/drops.js +137 -0
- package/server/fs/drops.js.map +1 -0
- package/server/fs/file-uploads.d.ts +57 -0
- package/server/fs/file-uploads.d.ts.map +1 -0
- package/server/fs/file-uploads.js +214 -0
- package/server/fs/file-uploads.js.map +1 -0
- package/server/fs/file-watcher.d.ts +22 -0
- package/server/fs/file-watcher.d.ts.map +1 -0
- package/server/fs/file-watcher.js +105 -0
- package/server/fs/file-watcher.js.map +1 -0
- package/server/fs/git-watcher.d.ts +76 -0
- package/server/fs/git-watcher.d.ts.map +1 -0
- package/server/fs/git-watcher.js +356 -0
- package/server/fs/git-watcher.js.map +1 -0
- package/server/fs/media.d.ts +35 -0
- package/server/fs/media.d.ts.map +1 -0
- package/server/fs/media.js +271 -0
- package/server/fs/media.js.map +1 -0
- package/server/fs/service.d.ts +97 -0
- package/server/fs/service.d.ts.map +1 -0
- package/server/fs/service.js +306 -0
- package/server/fs/service.js.map +1 -0
- package/server/fs/upload-staging.d.ts +76 -0
- package/server/fs/upload-staging.d.ts.map +1 -0
- package/server/fs/upload-staging.js +283 -0
- package/server/fs/upload-staging.js.map +1 -0
- package/server/fs/watcher-lifecycle.d.ts +24 -0
- package/server/fs/watcher-lifecycle.d.ts.map +1 -0
- package/server/fs/watcher-lifecycle.js +105 -0
- package/server/fs/watcher-lifecycle.js.map +1 -0
- package/server/index.d.ts +17 -0
- package/server/index.d.ts.map +1 -0
- package/server/index.js +510 -0
- package/server/index.js.map +1 -0
- package/server/ipc/socket-server.d.ts +28 -0
- package/server/ipc/socket-server.d.ts.map +1 -0
- package/server/ipc/socket-server.js +206 -0
- package/server/ipc/socket-server.js.map +1 -0
- package/server/lib/git-exec.d.ts +38 -0
- package/server/lib/git-exec.d.ts.map +1 -0
- package/server/lib/git-exec.js +96 -0
- package/server/lib/git-exec.js.map +1 -0
- package/server/lib/open-in-ide.d.ts +22 -0
- package/server/lib/open-in-ide.d.ts.map +1 -0
- package/server/lib/open-in-ide.js +90 -0
- package/server/lib/open-in-ide.js.map +1 -0
- package/server/lib/open-in-os.d.ts +20 -0
- package/server/lib/open-in-os.d.ts.map +1 -0
- package/server/lib/open-in-os.js +51 -0
- package/server/lib/open-in-os.js.map +1 -0
- package/server/lib/path.d.ts +2 -0
- package/server/lib/path.d.ts.map +1 -0
- package/server/lib/path.js +10 -0
- package/server/lib/path.js.map +1 -0
- package/server/lib/promise-mutex.d.ts +7 -0
- package/server/lib/promise-mutex.d.ts.map +1 -0
- package/server/lib/promise-mutex.js +26 -0
- package/server/lib/promise-mutex.js.map +1 -0
- package/server/lib/sd-notify.d.ts +8 -0
- package/server/lib/sd-notify.d.ts.map +1 -0
- package/server/lib/sd-notify.js +27 -0
- package/server/lib/sd-notify.js.map +1 -0
- package/server/net/local-machine.d.ts +7 -0
- package/server/net/local-machine.d.ts.map +1 -0
- package/server/net/local-machine.js +79 -0
- package/server/net/local-machine.js.map +1 -0
- package/server/net/reachable-host.d.ts +12 -0
- package/server/net/reachable-host.d.ts.map +1 -0
- package/server/net/reachable-host.js +25 -0
- package/server/net/reachable-host.js.map +1 -0
- package/server/network/endpoints.d.ts +14 -0
- package/server/network/endpoints.d.ts.map +1 -0
- package/server/network/endpoints.js +104 -0
- package/server/network/endpoints.js.map +1 -0
- package/server/network/qr.d.ts +16 -0
- package/server/network/qr.d.ts.map +1 -0
- package/server/network/qr.js +89 -0
- package/server/network/qr.js.map +1 -0
- package/server/port-forwarder/forwarder.d.ts +47 -0
- package/server/port-forwarder/forwarder.d.ts.map +1 -0
- package/server/port-forwarder/forwarder.js +159 -0
- package/server/port-forwarder/forwarder.js.map +1 -0
- package/server/port-scanner/scanner.d.ts +24 -0
- package/server/port-scanner/scanner.d.ts.map +1 -0
- package/server/port-scanner/scanner.js +193 -0
- package/server/port-scanner/scanner.js.map +1 -0
- package/server/pty/connection-lifecycle.d.ts +50 -0
- package/server/pty/connection-lifecycle.d.ts.map +1 -0
- package/server/pty/connection-lifecycle.js +113 -0
- package/server/pty/connection-lifecycle.js.map +1 -0
- package/server/pty/daemon-connect.d.ts +52 -0
- package/server/pty/daemon-connect.d.ts.map +1 -0
- package/server/pty/daemon-connect.js +62 -0
- package/server/pty/daemon-connect.js.map +1 -0
- package/server/pty/handshake-timeout-race.d.ts +22 -0
- package/server/pty/handshake-timeout-race.d.ts.map +1 -0
- package/server/pty/handshake-timeout-race.js +23 -0
- package/server/pty/handshake-timeout-race.js.map +1 -0
- package/server/pty/headless-replay-snapshot.d.ts +28 -0
- package/server/pty/headless-replay-snapshot.d.ts.map +1 -0
- package/server/pty/headless-replay-snapshot.js +285 -0
- package/server/pty/headless-replay-snapshot.js.map +1 -0
- package/server/pty/headless-terminal-state-cache.d.ts +31 -0
- package/server/pty/headless-terminal-state-cache.d.ts.map +1 -0
- package/server/pty/headless-terminal-state-cache.js +119 -0
- package/server/pty/headless-terminal-state-cache.js.map +1 -0
- package/server/pty/hello-ack-validator.d.ts +15 -0
- package/server/pty/hello-ack-validator.d.ts.map +1 -0
- package/server/pty/hello-ack-validator.js +30 -0
- package/server/pty/hello-ack-validator.js.map +1 -0
- package/server/pty/host-daemon/bootstrap.d.ts +100 -0
- package/server/pty/host-daemon/bootstrap.d.ts.map +1 -0
- package/server/pty/host-daemon/bootstrap.js +611 -0
- package/server/pty/host-daemon/bootstrap.js.map +1 -0
- package/server/pty/host-daemon/daemon.d.ts +111 -0
- package/server/pty/host-daemon/daemon.d.ts.map +1 -0
- package/server/pty/host-daemon/daemon.js +648 -0
- package/server/pty/host-daemon/daemon.js.map +1 -0
- package/server/pty/host-daemon/entry.d.ts +3 -0
- package/server/pty/host-daemon/entry.d.ts.map +1 -0
- package/server/pty/host-daemon/entry.js +72 -0
- package/server/pty/host-daemon/entry.js.map +1 -0
- package/server/pty/host-daemon/lockfile.d.ts +12 -0
- package/server/pty/host-daemon/lockfile.d.ts.map +1 -0
- package/server/pty/host-daemon/lockfile.js +120 -0
- package/server/pty/host-daemon/lockfile.js.map +1 -0
- package/server/pty/host-daemon/mode-marker.d.ts +77 -0
- package/server/pty/host-daemon/mode-marker.d.ts.map +1 -0
- package/server/pty/host-daemon/mode-marker.js +228 -0
- package/server/pty/host-daemon/mode-marker.js.map +1 -0
- package/server/pty/host-daemon/orphan-cleanup.d.ts +42 -0
- package/server/pty/host-daemon/orphan-cleanup.d.ts.map +1 -0
- package/server/pty/host-daemon/orphan-cleanup.js +84 -0
- package/server/pty/host-daemon/orphan-cleanup.js.map +1 -0
- package/server/pty/host-daemon/paths.d.ts +10 -0
- package/server/pty/host-daemon/paths.d.ts.map +1 -0
- package/server/pty/host-daemon/paths.js +56 -0
- package/server/pty/host-daemon/paths.js.map +1 -0
- package/server/pty/host-daemon/server-connection.d.ts +44 -0
- package/server/pty/host-daemon/server-connection.d.ts.map +1 -0
- package/server/pty/host-daemon/server-connection.js +100 -0
- package/server/pty/host-daemon/server-connection.js.map +1 -0
- package/server/pty/host-daemon/service-detection.d.ts +24 -0
- package/server/pty/host-daemon/service-detection.d.ts.map +1 -0
- package/server/pty/host-daemon/service-detection.js +16 -0
- package/server/pty/host-daemon/service-detection.js.map +1 -0
- package/server/pty/host-daemon/socket-ready.d.ts +22 -0
- package/server/pty/host-daemon/socket-ready.d.ts.map +1 -0
- package/server/pty/host-daemon/socket-ready.js +33 -0
- package/server/pty/host-daemon/socket-ready.js.map +1 -0
- package/server/pty/host-daemon/spawn-daemon.d.ts +45 -0
- package/server/pty/host-daemon/spawn-daemon.d.ts.map +1 -0
- package/server/pty/host-daemon/spawn-daemon.js +155 -0
- package/server/pty/host-daemon/spawn-daemon.js.map +1 -0
- package/server/pty/host-daemon/terminate-daemon.d.ts +16 -0
- package/server/pty/host-daemon/terminate-daemon.d.ts.map +1 -0
- package/server/pty/host-daemon/terminate-daemon.js +128 -0
- package/server/pty/host-daemon/terminate-daemon.js.map +1 -0
- package/server/pty/host-protocol/frames.d.ts +110 -0
- package/server/pty/host-protocol/frames.d.ts.map +1 -0
- package/server/pty/host-protocol/frames.js +255 -0
- package/server/pty/host-protocol/frames.js.map +1 -0
- package/server/pty/host-protocol/messages.d.ts +140 -0
- package/server/pty/host-protocol/messages.d.ts.map +1 -0
- package/server/pty/host-protocol/messages.js +117 -0
- package/server/pty/host-protocol/messages.js.map +1 -0
- package/server/pty/host.d.ts +273 -0
- package/server/pty/host.d.ts.map +1 -0
- package/server/pty/host.js +184 -0
- package/server/pty/host.js.map +1 -0
- package/server/pty/in-process-host.d.ts +224 -0
- package/server/pty/in-process-host.d.ts.map +1 -0
- package/server/pty/in-process-host.js +1183 -0
- package/server/pty/in-process-host.js.map +1 -0
- package/server/pty/osc7-lifecycle.d.ts +8 -0
- package/server/pty/osc7-lifecycle.d.ts.map +1 -0
- package/server/pty/osc7-lifecycle.js +22 -0
- package/server/pty/osc7-lifecycle.js.map +1 -0
- package/server/pty/osc7-parser.d.ts +23 -0
- package/server/pty/osc7-parser.d.ts.map +1 -0
- package/server/pty/osc7-parser.js +91 -0
- package/server/pty/osc7-parser.js.map +1 -0
- package/server/pty/remote-host.d.ts +188 -0
- package/server/pty/remote-host.d.ts.map +1 -0
- package/server/pty/remote-host.js +810 -0
- package/server/pty/remote-host.js.map +1 -0
- package/server/pty/request-correlator.d.ts +59 -0
- package/server/pty/request-correlator.d.ts.map +1 -0
- package/server/pty/request-correlator.js +75 -0
- package/server/pty/request-correlator.js.map +1 -0
- package/server/pty/scrollback-log.d.ts +130 -0
- package/server/pty/scrollback-log.d.ts.map +1 -0
- package/server/pty/scrollback-log.js +344 -0
- package/server/pty/scrollback-log.js.map +1 -0
- package/server/pty/scrollback-sanitize.d.ts +2 -0
- package/server/pty/scrollback-sanitize.d.ts.map +1 -0
- package/server/pty/scrollback-sanitize.js +54 -0
- package/server/pty/scrollback-sanitize.js.map +1 -0
- package/server/pty/session-mirror.d.ts +67 -0
- package/server/pty/session-mirror.d.ts.map +1 -0
- package/server/pty/session-mirror.js +112 -0
- package/server/pty/session-mirror.js.map +1 -0
- package/server/pty/session-policy.d.ts +85 -0
- package/server/pty/session-policy.d.ts.map +1 -0
- package/server/pty/session-policy.js +186 -0
- package/server/pty/session-policy.js.map +1 -0
- package/server/pty/version-mismatch-recovery.d.ts +71 -0
- package/server/pty/version-mismatch-recovery.d.ts.map +1 -0
- package/server/pty/version-mismatch-recovery.js +63 -0
- package/server/pty/version-mismatch-recovery.js.map +1 -0
- package/server/routes/debug-agent-status.d.ts +5 -0
- package/server/routes/debug-agent-status.d.ts.map +1 -0
- package/server/routes/debug-agent-status.js +22 -0
- package/server/routes/debug-agent-status.js.map +1 -0
- package/server/routes/debug-diagnostics.d.ts +8 -0
- package/server/routes/debug-diagnostics.d.ts.map +1 -0
- package/server/routes/debug-diagnostics.js +34 -0
- package/server/routes/debug-diagnostics.js.map +1 -0
- package/server/routes/debug-terminal-trace.d.ts +16 -0
- package/server/routes/debug-terminal-trace.d.ts.map +1 -0
- package/server/routes/debug-terminal-trace.js +545 -0
- package/server/routes/debug-terminal-trace.js.map +1 -0
- package/server/routes/drops.d.ts +13 -0
- package/server/routes/drops.d.ts.map +1 -0
- package/server/routes/drops.js +126 -0
- package/server/routes/drops.js.map +1 -0
- package/server/routes/file-uploads.d.ts +9 -0
- package/server/routes/file-uploads.d.ts.map +1 -0
- package/server/routes/file-uploads.js +119 -0
- package/server/routes/file-uploads.js.map +1 -0
- package/server/routes/files.d.ts +9 -0
- package/server/routes/files.d.ts.map +1 -0
- package/server/routes/files.js +441 -0
- package/server/routes/files.js.map +1 -0
- package/server/routes/filesystem.d.ts +6 -0
- package/server/routes/filesystem.d.ts.map +1 -0
- package/server/routes/filesystem.js +76 -0
- package/server/routes/filesystem.js.map +1 -0
- package/server/routes/git.d.ts +38 -0
- package/server/routes/git.d.ts.map +1 -0
- package/server/routes/git.js +585 -0
- package/server/routes/git.js.map +1 -0
- package/server/routes/healthz.d.ts +8 -0
- package/server/routes/healthz.d.ts.map +1 -0
- package/server/routes/healthz.js +24 -0
- package/server/routes/healthz.js.map +1 -0
- package/server/routes/hook.d.ts +14 -0
- package/server/routes/hook.d.ts.map +1 -0
- package/server/routes/hook.js +86 -0
- package/server/routes/hook.js.map +1 -0
- package/server/routes/ide-commands.d.ts +9 -0
- package/server/routes/ide-commands.d.ts.map +1 -0
- package/server/routes/ide-commands.js +23 -0
- package/server/routes/ide-commands.js.map +1 -0
- package/server/routes/lib/resolve-worktree.d.ts +30 -0
- package/server/routes/lib/resolve-worktree.d.ts.map +1 -0
- package/server/routes/lib/resolve-worktree.js +35 -0
- package/server/routes/lib/resolve-worktree.js.map +1 -0
- package/server/routes/open.d.ts +4 -0
- package/server/routes/open.d.ts.map +1 -0
- package/server/routes/open.js +21 -0
- package/server/routes/open.js.map +1 -0
- package/server/routes/pane-commands.d.ts +9 -0
- package/server/routes/pane-commands.d.ts.map +1 -0
- package/server/routes/pane-commands.js +23 -0
- package/server/routes/pane-commands.js.map +1 -0
- package/server/routes/projects.d.ts +15 -0
- package/server/routes/projects.d.ts.map +1 -0
- package/server/routes/projects.js +363 -0
- package/server/routes/projects.js.map +1 -0
- package/server/routes/server-notices.d.ts +4 -0
- package/server/routes/server-notices.d.ts.map +1 -0
- package/server/routes/server-notices.js +29 -0
- package/server/routes/server-notices.js.map +1 -0
- package/server/routes/service-config.d.ts +11 -0
- package/server/routes/service-config.d.ts.map +1 -0
- package/server/routes/service-config.js +64 -0
- package/server/routes/service-config.js.map +1 -0
- package/server/routes/sessions.d.ts +7 -0
- package/server/routes/sessions.d.ts.map +1 -0
- package/server/routes/sessions.js +218 -0
- package/server/routes/sessions.js.map +1 -0
- package/server/service/caffeinate.d.ts +33 -0
- package/server/service/caffeinate.d.ts.map +1 -0
- package/server/service/caffeinate.js +72 -0
- package/server/service/caffeinate.js.map +1 -0
- package/server/state/app-state.d.ts +167 -0
- package/server/state/app-state.d.ts.map +1 -0
- package/server/state/app-state.js +335 -0
- package/server/state/app-state.js.map +1 -0
- package/server/state/project-manager.d.ts +30 -0
- package/server/state/project-manager.d.ts.map +1 -0
- package/server/state/project-manager.js +128 -0
- package/server/state/project-manager.js.map +1 -0
- package/server/state/server-notices.d.ts +12 -0
- package/server/state/server-notices.d.ts.map +1 -0
- package/server/state/server-notices.js +32 -0
- package/server/state/server-notices.js.map +1 -0
- package/server/state/worktree-cache.d.ts +25 -0
- package/server/state/worktree-cache.d.ts.map +1 -0
- package/server/state/worktree-cache.js +53 -0
- package/server/state/worktree-cache.js.map +1 -0
- package/server/ws/events.d.ts +45 -0
- package/server/ws/events.d.ts.map +1 -0
- package/server/ws/events.js +134 -0
- package/server/ws/events.js.map +1 -0
- package/server/ws/keepalive.d.ts +27 -0
- package/server/ws/keepalive.d.ts.map +1 -0
- package/server/ws/keepalive.js +63 -0
- package/server/ws/keepalive.js.map +1 -0
- package/server/ws/terminal-attach.d.ts +13 -0
- package/server/ws/terminal-attach.d.ts.map +1 -0
- package/server/ws/terminal-attach.js +233 -0
- package/server/ws/terminal-attach.js.map +1 -0
- package/server/ws/terminal-flow.d.ts +17 -0
- package/server/ws/terminal-flow.d.ts.map +1 -0
- package/server/ws/terminal-flow.js +64 -0
- package/server/ws/terminal-flow.js.map +1 -0
- package/server/ws/terminal.d.ts +69 -0
- package/server/ws/terminal.d.ts.map +1 -0
- package/server/ws/terminal.js +311 -0
- package/server/ws/terminal.js.map +1 -0
- package/web/assets/EditorPane-CzzT3iYY.js +123 -0
- package/web/assets/SymbolsNerdFontMono-Regular-CwEZqMeU.woff2 +0 -0
- package/web/assets/TerminalPane-CjbYzePr.js +68 -0
- package/web/assets/TerminalPane-DkTCHfhq.css +1 -0
- package/web/assets/file-icons-JBi09j0r.js +6 -0
- package/web/assets/index-CTTkRpnn.css +2 -0
- package/web/assets/index-CmhewzMp.js +34 -0
- package/web/assets/session-resume-7f-tB-ZU.js +2 -0
- package/web/assets/terminal-trace-PuuFRybC.js +2803 -0
- package/web/assets/useVirtualKeyboard-DgJb9u9d.js +1 -0
- package/web/index.html +52 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { expandUserHome } from "../../lib/path.js";
|
|
2
|
+
import { WorkspaceConflictError, WorkspaceNotFoundError } from "./errors.js";
|
|
3
|
+
function removePaneBySessionId(node, sessionId) {
|
|
4
|
+
if (node.type === "terminal") {
|
|
5
|
+
return node.sessionId === sessionId ? null : node;
|
|
6
|
+
}
|
|
7
|
+
if (node.type === "split") {
|
|
8
|
+
const children = [];
|
|
9
|
+
const sizes = [];
|
|
10
|
+
for (let index = 0; index < node.children.length; index++) {
|
|
11
|
+
const child = removePaneBySessionId(node.children[index], sessionId);
|
|
12
|
+
if (child !== null) {
|
|
13
|
+
children.push(child);
|
|
14
|
+
sizes.push(node.sizes[index]);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
if (children.length === 0)
|
|
18
|
+
return null;
|
|
19
|
+
if (children.length === 1)
|
|
20
|
+
return children[0];
|
|
21
|
+
return { ...node, children, sizes };
|
|
22
|
+
}
|
|
23
|
+
return node;
|
|
24
|
+
}
|
|
25
|
+
export function createSessionCommands({ appStateStore, eventBus, ptyManager, }) {
|
|
26
|
+
return {
|
|
27
|
+
async createSession(input) {
|
|
28
|
+
const project = appStateStore
|
|
29
|
+
.get()
|
|
30
|
+
.projects.find((entry) => entry.id === input.projectId);
|
|
31
|
+
if (!project) {
|
|
32
|
+
throw new WorkspaceNotFoundError("Project not found");
|
|
33
|
+
}
|
|
34
|
+
const session = await ptyManager.create({
|
|
35
|
+
projectId: input.projectId,
|
|
36
|
+
command: input.command ?? { type: "shell" },
|
|
37
|
+
cwd: expandUserHome(input.cwd ?? project.path),
|
|
38
|
+
...(input.title !== undefined && { title: input.title }),
|
|
39
|
+
...(input.bootstrapInput !== undefined && {
|
|
40
|
+
bootstrapInput: input.bootstrapInput,
|
|
41
|
+
}),
|
|
42
|
+
});
|
|
43
|
+
eventBus.broadcast({ type: "session-created", session });
|
|
44
|
+
return session;
|
|
45
|
+
},
|
|
46
|
+
async setSessionPinned(id, pinned) {
|
|
47
|
+
const session = ptyManager.get(id);
|
|
48
|
+
if (!session) {
|
|
49
|
+
throw new WorkspaceNotFoundError();
|
|
50
|
+
}
|
|
51
|
+
const changed = ptyManager.setPinned(id, pinned);
|
|
52
|
+
if (changed) {
|
|
53
|
+
eventBus.broadcast({
|
|
54
|
+
type: "session-pin-changed",
|
|
55
|
+
sessionId: id,
|
|
56
|
+
pinned,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const latest = ptyManager.get(id);
|
|
60
|
+
return latest ?? session;
|
|
61
|
+
},
|
|
62
|
+
async setSessionTitle(id, rawTitle) {
|
|
63
|
+
const session = ptyManager.get(id);
|
|
64
|
+
if (!session) {
|
|
65
|
+
throw new WorkspaceNotFoundError();
|
|
66
|
+
}
|
|
67
|
+
const title = rawTitle.trim();
|
|
68
|
+
const titleManual = title.length > 0;
|
|
69
|
+
const changed = ptyManager.setTitle(id, title, titleManual);
|
|
70
|
+
if (changed) {
|
|
71
|
+
eventBus.broadcast({
|
|
72
|
+
type: "session-title-changed",
|
|
73
|
+
sessionId: id,
|
|
74
|
+
title,
|
|
75
|
+
titleManual,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const latest = ptyManager.get(id);
|
|
79
|
+
return latest ?? session;
|
|
80
|
+
},
|
|
81
|
+
async restartSession(id) {
|
|
82
|
+
const session = ptyManager.get(id);
|
|
83
|
+
if (!session) {
|
|
84
|
+
throw new WorkspaceNotFoundError();
|
|
85
|
+
}
|
|
86
|
+
if (session.state !== "ended") {
|
|
87
|
+
throw new WorkspaceConflictError("Session is not ended");
|
|
88
|
+
}
|
|
89
|
+
const restarted = await ptyManager.restart(id);
|
|
90
|
+
eventBus.broadcast({
|
|
91
|
+
type: "session-restarted",
|
|
92
|
+
session: restarted,
|
|
93
|
+
generation: restarted.generation,
|
|
94
|
+
});
|
|
95
|
+
return restarted;
|
|
96
|
+
},
|
|
97
|
+
async deleteSession(id) {
|
|
98
|
+
const session = ptyManager.get(id);
|
|
99
|
+
if (!session) {
|
|
100
|
+
throw new WorkspaceNotFoundError();
|
|
101
|
+
}
|
|
102
|
+
await ptyManager.dispose(id);
|
|
103
|
+
appStateStore.mutateProjectStates((state) => {
|
|
104
|
+
const projectState = state.projectStates[session.projectId];
|
|
105
|
+
if (!projectState?.layout)
|
|
106
|
+
return;
|
|
107
|
+
const layout = removePaneBySessionId(projectState.layout, id);
|
|
108
|
+
projectState.layout = layout;
|
|
109
|
+
eventBus.broadcast({
|
|
110
|
+
type: "layout-updated",
|
|
111
|
+
projectId: session.projectId,
|
|
112
|
+
layout,
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
eventBus.broadcast({
|
|
116
|
+
type: "session-closed",
|
|
117
|
+
sessionId: id,
|
|
118
|
+
projectId: session.projectId,
|
|
119
|
+
});
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=session-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-commands.js","sourceRoot":"","sources":["../../../src/application/workspace/session-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { PtyHost } from "../../pty/host.js";
|
|
2
|
+
interface CreateSessionQueriesDeps {
|
|
3
|
+
ptyManager: PtyHost;
|
|
4
|
+
platform?: NodeJS.Platform;
|
|
5
|
+
readProcessCwd?: (pid: number, fallback: string) => Promise<string>;
|
|
6
|
+
}
|
|
7
|
+
export declare function createSessionQueries({ ptyManager, platform, readProcessCwd, }: CreateSessionQueriesDeps): {
|
|
8
|
+
listSessions(projectId?: string): import("@parasor/shared").Session[];
|
|
9
|
+
getSessionCwd(id: string): Promise<{
|
|
10
|
+
cwd: string;
|
|
11
|
+
}>;
|
|
12
|
+
};
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=session-queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-queries.d.ts","sourceRoot":"","sources":["../../../src/application/workspace/session-queries.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAKjD,UAAU,wBAAwB;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACrE;AA+BD,wBAAgB,oBAAoB,CAAC,EACnC,UAAU,EACV,QAA2B,EAC3B,cACgD,GACjD,EAAE,wBAAwB;6BAEE,MAAM;sBAMP,MAAM;;;EAYjC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { readlink } from "node:fs/promises";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
import { WorkspaceConflictError, WorkspaceNotFoundError } from "./errors.js";
|
|
5
|
+
const execFileAsync = promisify(execFile);
|
|
6
|
+
async function defaultReadProcessCwd(pid, fallback, platform = process.platform) {
|
|
7
|
+
try {
|
|
8
|
+
if (platform === "darwin") {
|
|
9
|
+
const { stdout } = await execFileAsync("lsof", [
|
|
10
|
+
"-a",
|
|
11
|
+
"-d",
|
|
12
|
+
"cwd",
|
|
13
|
+
"-p",
|
|
14
|
+
String(pid),
|
|
15
|
+
"-F",
|
|
16
|
+
"n",
|
|
17
|
+
]);
|
|
18
|
+
const lines = stdout.trim().split("\n");
|
|
19
|
+
const cwdLine = lines.findLast((line) => line.startsWith("n") && line !== "ncwd");
|
|
20
|
+
return cwdLine?.slice(1) || fallback;
|
|
21
|
+
}
|
|
22
|
+
return (await readlink(`/proc/${pid}/cwd`)) || fallback;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return fallback;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function createSessionQueries({ ptyManager, platform = process.platform, readProcessCwd = (pid, fallback) => defaultReadProcessCwd(pid, fallback, platform), }) {
|
|
29
|
+
return {
|
|
30
|
+
listSessions(projectId) {
|
|
31
|
+
return projectId
|
|
32
|
+
? ptyManager.listByProject(projectId)
|
|
33
|
+
: ptyManager.list();
|
|
34
|
+
},
|
|
35
|
+
async getSessionCwd(id) {
|
|
36
|
+
const session = ptyManager.get(id);
|
|
37
|
+
if (!session) {
|
|
38
|
+
throw new WorkspaceNotFoundError();
|
|
39
|
+
}
|
|
40
|
+
if (session.state !== "running" || session.pid === null) {
|
|
41
|
+
throw new WorkspaceConflictError("Session not running");
|
|
42
|
+
}
|
|
43
|
+
return { cwd: await readProcessCwd(session.pid, session.cwd) };
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=session-queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-queries.js","sourceRoot":"","sources":["../../../src/application/workspace/session-queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE7E,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAQ1C,KAAK,UAAU,qBAAqB,CAClC,GAAW,EACX,QAAgB,EAChB,QAAQ,GAAG,OAAO,CAAC,QAAQ;IAE3B,IAAI,CAAC;QACH,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE;gBAC7C,IAAI;gBACJ,IAAI;gBACJ,KAAK;gBACL,IAAI;gBACJ,MAAM,CAAC,GAAG,CAAC;gBACX,IAAI;gBACJ,GAAG;aACJ,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAC5B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,MAAM,CAClD,CAAC;YACF,OAAO,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;QACvC,CAAC;QAED,OAAO,CAAC,MAAM,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,IAAI,QAAQ,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EACnC,UAAU,EACV,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAC3B,cAAc,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CACjC,qBAAqB,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,GACvB;IACzB,OAAO;QACL,YAAY,CAAC,SAAkB;YAC7B,OAAO,SAAS;gBACd,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC;gBACrC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,EAAU;YAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,sBAAsB,EAAE,CAAC;YACrC,CAAC;YACD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;gBACxD,MAAM,IAAI,sBAAsB,CAAC,qBAAqB,CAAC,CAAC;YAC1D,CAAC;YAED,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACjE,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type { Worktree, WorktreeLocalFileCopyResult } from "@parasor/shared";
|
|
2
|
+
import type { ProjectManager } from "../../state/project-manager.js";
|
|
3
|
+
import type { EventPublisher } from "../ports.js";
|
|
4
|
+
export interface CreateWorktreeInput {
|
|
5
|
+
branch: string;
|
|
6
|
+
base?: string;
|
|
7
|
+
copyLocalFiles?: unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface CreateWorktreeResult {
|
|
10
|
+
path: string;
|
|
11
|
+
head: string;
|
|
12
|
+
branch: string;
|
|
13
|
+
localFileCopies?: WorktreeLocalFileCopyResult[];
|
|
14
|
+
}
|
|
15
|
+
interface CreateWorktreeCommandsDeps {
|
|
16
|
+
projectManager: ProjectManager;
|
|
17
|
+
eventBus: EventPublisher;
|
|
18
|
+
/**
|
|
19
|
+
* Returns the registered worktrees for a project. Used to fence client-supplied
|
|
20
|
+
* `worktreePath` against arbitrary local paths before running git. The empty
|
|
21
|
+
* array is a valid result for projects that have not yet been hydrated.
|
|
22
|
+
*/
|
|
23
|
+
getProjectWorktrees: (projectId: string) => Worktree[];
|
|
24
|
+
runGit?: (projectPath: string, args: string[]) => Promise<{
|
|
25
|
+
stdout: string;
|
|
26
|
+
stderr: string;
|
|
27
|
+
}>;
|
|
28
|
+
pathExists?: (target: string) => Promise<boolean>;
|
|
29
|
+
/**
|
|
30
|
+
* Probe whether `projectPath` lives inside a git work tree. Defaults to
|
|
31
|
+
* `git rev-parse --is-inside-work-tree`; tests inject a stub so they can
|
|
32
|
+
* keep using the simple non-arg-aware `runGit` mock.
|
|
33
|
+
*/
|
|
34
|
+
isInsideGitRepo?: (projectPath: string) => Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Override the realpath-based fence helper. Provided for tests that operate
|
|
37
|
+
* on synthetic paths; production code uses {@link resolveWorktreePath}.
|
|
38
|
+
*/
|
|
39
|
+
resolveWorktree?: (projectPath: string, worktreePath: string, registered: Worktree[]) => Promise<string>;
|
|
40
|
+
copyLocalFiles?: (projectPath: string, worktreePath: string, selectedPaths: unknown) => Promise<WorktreeLocalFileCopyResult[]>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Best-effort branch name validation matching common `git check-ref-format`
|
|
44
|
+
* rules. Server still relies on git itself to surface the final error;
|
|
45
|
+
* this only filters obvious shell hazards.
|
|
46
|
+
*/
|
|
47
|
+
export declare function validateBranchName(branch: string): string | null;
|
|
48
|
+
/**
|
|
49
|
+
* Default worktree placement: sibling directory `{projectPath}.worktrees/{branch}`.
|
|
50
|
+
* Matches the convention used by GitLens, editor worktree extensions, and
|
|
51
|
+
* JetBrains IDEs.
|
|
52
|
+
*/
|
|
53
|
+
export declare function defaultWorktreePath(projectPath: string, branch: string): string;
|
|
54
|
+
export interface FenceWorktreePathDeps {
|
|
55
|
+
projectManager: ProjectManager;
|
|
56
|
+
/** Registered worktrees for a project -- see CreateWorktreeCommandsDeps. */
|
|
57
|
+
getProjectWorktrees: (projectId: string) => Worktree[];
|
|
58
|
+
/** Realpath-based fence; defaults to {@link resolveWorktreePath}. */
|
|
59
|
+
resolveWorktree?: (projectPath: string, worktreePath: string, registered: Worktree[]) => Promise<string>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Fence a client-supplied path against the project's registered worktrees
|
|
63
|
+
* (project root + each `git worktree list` entry). Returns the realpath-
|
|
64
|
+
* resolved canonical path that callers MUST pass to git, so symlink and
|
|
65
|
+
* case-insensitive filesystem aliases reach the same on-disk repo.
|
|
66
|
+
*
|
|
67
|
+
* Single source for both the worktree-command closure and the route helpers.
|
|
68
|
+
* Throws `WorkspaceNotFoundError`:
|
|
69
|
+
* - `kind === "project"` (default) when the project id is unknown
|
|
70
|
+
* - `kind === "worktree"` when the path is not a registered worktree
|
|
71
|
+
*/
|
|
72
|
+
export declare function fenceWorktreePathWith(deps: FenceWorktreePathDeps, projectId: string, worktreePath: string): Promise<{
|
|
73
|
+
projectPath: string;
|
|
74
|
+
resolved: string;
|
|
75
|
+
}>;
|
|
76
|
+
export declare function createWorktreeCommands({ projectManager, eventBus, getProjectWorktrees, runGit, pathExists, isInsideGitRepo, resolveWorktree, copyLocalFiles, }: CreateWorktreeCommandsDeps): {
|
|
77
|
+
fenceWorktreePath: (projectId: string, worktreePath: string) => Promise<{
|
|
78
|
+
projectPath: string;
|
|
79
|
+
resolved: string;
|
|
80
|
+
}>;
|
|
81
|
+
createProjectWorktree(projectId: string, input: CreateWorktreeInput): Promise<CreateWorktreeResult>;
|
|
82
|
+
/**
|
|
83
|
+
* Rename the worktree's branch via `git branch -m old new`. The on-disk
|
|
84
|
+
* worktree directory keeps its original path -- `git worktree move` is
|
|
85
|
+
* intentionally out of scope here so the operation stays a single,
|
|
86
|
+
* cheap ref rename. Sidebar / topbar consumers display `branch`, so the
|
|
87
|
+
* UX still updates cleanly even though `path` lags the convention.
|
|
88
|
+
*/
|
|
89
|
+
renameProjectWorktree(projectId: string, worktreePath: string, newBranch: string): Promise<{
|
|
90
|
+
oldBranch: string;
|
|
91
|
+
newBranch: string;
|
|
92
|
+
}>;
|
|
93
|
+
removeProjectWorktree(projectId: string, worktreePath: string, opts?: {
|
|
94
|
+
force?: boolean;
|
|
95
|
+
}): Promise<void>;
|
|
96
|
+
};
|
|
97
|
+
export {};
|
|
98
|
+
//# sourceMappingURL=worktree-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-commands.d.ts","sourceRoot":"","sources":["../../../src/application/workspace/worktree-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { access } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
import { parseGitStatusV2 } from "../../fs/git-watcher.js";
|
|
6
|
+
import { resolveWorktreePath, WorktreeNotRegisteredError, } from "../../lib/git-exec.js";
|
|
7
|
+
import { WorkspaceConflictError, WorkspaceNotFoundError, WorkspaceValidationError, } from "./errors.js";
|
|
8
|
+
import { copyWorktreeLocalFiles } from "./worktree-local-files.js";
|
|
9
|
+
const execFileAsync = promisify(execFile);
|
|
10
|
+
async function defaultRunGit(projectPath, args) {
|
|
11
|
+
const { stdout, stderr } = await execFileAsync("git", ["-C", projectPath, ...args], { timeout: 15_000, maxBuffer: 16 * 1024 * 1024 });
|
|
12
|
+
return { stdout, stderr };
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Hard ceiling on counter enrichment for a freshly created worktree. Set
|
|
16
|
+
* tighter than the underlying `runGit` 15s timeout so a locked / pathological
|
|
17
|
+
* repo cannot delay the `worktree-created` broadcast or the HTTP response.
|
|
18
|
+
*/
|
|
19
|
+
const ENRICH_DEADLINE_MS = 3000;
|
|
20
|
+
async function raceWithDeadline(task, deadlineMs) {
|
|
21
|
+
let timer;
|
|
22
|
+
const timeout = new Promise((resolve) => {
|
|
23
|
+
timer = setTimeout(() => resolve(undefined), deadlineMs);
|
|
24
|
+
});
|
|
25
|
+
try {
|
|
26
|
+
return await Promise.race([task, timeout]);
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
if (timer)
|
|
30
|
+
clearTimeout(timer);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async function defaultPathExists(target) {
|
|
34
|
+
try {
|
|
35
|
+
await access(target);
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: git branch validation must reject C0/DEL control bytes.
|
|
43
|
+
const BRANCH_INVALID_CHARS = /[\s\x00-\x1f\x7f~^:?*[\\@]/;
|
|
44
|
+
/**
|
|
45
|
+
* Best-effort branch name validation matching common `git check-ref-format`
|
|
46
|
+
* rules. Server still relies on git itself to surface the final error;
|
|
47
|
+
* this only filters obvious shell hazards.
|
|
48
|
+
*/
|
|
49
|
+
export function validateBranchName(branch) {
|
|
50
|
+
if (!branch || branch.length > 200)
|
|
51
|
+
return "Branch name is required";
|
|
52
|
+
if (BRANCH_INVALID_CHARS.test(branch)) {
|
|
53
|
+
return "Branch name contains invalid characters";
|
|
54
|
+
}
|
|
55
|
+
if (branch.includes("..") || branch.includes("@{")) {
|
|
56
|
+
return "Branch name contains invalid sequence";
|
|
57
|
+
}
|
|
58
|
+
if (branch.startsWith("-") ||
|
|
59
|
+
branch.startsWith("/") ||
|
|
60
|
+
branch.startsWith(".") ||
|
|
61
|
+
branch.endsWith("/") ||
|
|
62
|
+
branch.endsWith(".") ||
|
|
63
|
+
branch.endsWith(".lock")) {
|
|
64
|
+
return "Branch name starts or ends with a reserved character";
|
|
65
|
+
}
|
|
66
|
+
for (const segment of branch.split("/")) {
|
|
67
|
+
if (segment.length === 0)
|
|
68
|
+
return "Branch name has empty path segment";
|
|
69
|
+
if (segment.startsWith(".") || segment.endsWith(".lock")) {
|
|
70
|
+
return "Branch name has invalid path segment";
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Default worktree placement: sibling directory `{projectPath}.worktrees/{branch}`.
|
|
77
|
+
* Matches the convention used by GitLens, editor worktree extensions, and
|
|
78
|
+
* JetBrains IDEs.
|
|
79
|
+
*/
|
|
80
|
+
export function defaultWorktreePath(projectPath, branch) {
|
|
81
|
+
const trimmed = projectPath.replace(/\/+$/, "");
|
|
82
|
+
return path.join(`${trimmed}.worktrees`, branch);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Fence a client-supplied path against the project's registered worktrees
|
|
86
|
+
* (project root + each `git worktree list` entry). Returns the realpath-
|
|
87
|
+
* resolved canonical path that callers MUST pass to git, so symlink and
|
|
88
|
+
* case-insensitive filesystem aliases reach the same on-disk repo.
|
|
89
|
+
*
|
|
90
|
+
* Single source for both the worktree-command closure and the route helpers.
|
|
91
|
+
* Throws `WorkspaceNotFoundError`:
|
|
92
|
+
* - `kind === "project"` (default) when the project id is unknown
|
|
93
|
+
* - `kind === "worktree"` when the path is not a registered worktree
|
|
94
|
+
*/
|
|
95
|
+
export async function fenceWorktreePathWith(deps, projectId, worktreePath) {
|
|
96
|
+
const { projectManager, getProjectWorktrees } = deps;
|
|
97
|
+
const resolveWorktree = deps.resolveWorktree ?? resolveWorktreePath;
|
|
98
|
+
const project = projectManager.get(projectId);
|
|
99
|
+
if (!project)
|
|
100
|
+
throw new WorkspaceNotFoundError();
|
|
101
|
+
try {
|
|
102
|
+
const resolved = await resolveWorktree(project.path, worktreePath, getProjectWorktrees(projectId));
|
|
103
|
+
return { projectPath: project.path, resolved };
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
if (err instanceof WorktreeNotRegisteredError) {
|
|
107
|
+
// Tag as "worktree" so the route layer preserves the original
|
|
108
|
+
// WorktreeNotRegisteredError message distinctly from the
|
|
109
|
+
// project-missing "Project not found" body.
|
|
110
|
+
throw new WorkspaceNotFoundError(err.message, "worktree");
|
|
111
|
+
}
|
|
112
|
+
throw err;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export function createWorktreeCommands({ projectManager, eventBus, getProjectWorktrees, runGit = defaultRunGit, pathExists = defaultPathExists, isInsideGitRepo = (projectPath) => defaultIsInsideGitRepo(projectPath, runGit), resolveWorktree = resolveWorktreePath, copyLocalFiles = copyWorktreeLocalFiles, }) {
|
|
116
|
+
const fenceWorktreePath = (projectId, worktreePath) => fenceWorktreePathWith({ projectManager, getProjectWorktrees, resolveWorktree }, projectId, worktreePath);
|
|
117
|
+
return {
|
|
118
|
+
fenceWorktreePath,
|
|
119
|
+
async createProjectWorktree(projectId, input) {
|
|
120
|
+
const project = projectManager.get(projectId);
|
|
121
|
+
if (!project)
|
|
122
|
+
throw new WorkspaceNotFoundError();
|
|
123
|
+
const branch = input.branch.trim();
|
|
124
|
+
const validation = validateBranchName(branch);
|
|
125
|
+
if (validation)
|
|
126
|
+
throw new WorkspaceValidationError(validation);
|
|
127
|
+
const base = input.base?.trim();
|
|
128
|
+
if (base) {
|
|
129
|
+
const baseValidation = validateBranchName(base);
|
|
130
|
+
if (baseValidation) {
|
|
131
|
+
throw new WorkspaceValidationError(`base: ${baseValidation}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (!(await isInsideGitRepo(project.path))) {
|
|
135
|
+
throw new WorkspaceValidationError("Not a git repository");
|
|
136
|
+
}
|
|
137
|
+
const worktreePath = defaultWorktreePath(project.path, branch);
|
|
138
|
+
if (await pathExists(worktreePath)) {
|
|
139
|
+
throw new WorkspaceConflictError(`Path already exists: ${worktreePath}`);
|
|
140
|
+
}
|
|
141
|
+
const branchExists = await branchRefExists(project.path, branch, runGit);
|
|
142
|
+
const args = branchExists
|
|
143
|
+
? ["worktree", "add", worktreePath, branch]
|
|
144
|
+
: [
|
|
145
|
+
"worktree",
|
|
146
|
+
"add",
|
|
147
|
+
"-b",
|
|
148
|
+
branch,
|
|
149
|
+
worktreePath,
|
|
150
|
+
base && base.length > 0 ? base : "HEAD",
|
|
151
|
+
];
|
|
152
|
+
try {
|
|
153
|
+
await runGit(project.path, args);
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
const message = error instanceof Error ? error.message : "git worktree add failed";
|
|
157
|
+
throw new WorkspaceConflictError(message);
|
|
158
|
+
}
|
|
159
|
+
let head = "";
|
|
160
|
+
try {
|
|
161
|
+
const { stdout } = await runGit(project.path, [
|
|
162
|
+
"rev-parse",
|
|
163
|
+
`refs/heads/${branch}`,
|
|
164
|
+
]);
|
|
165
|
+
head = stdout.trim();
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
/* ignore -- head stays empty if rev-parse cannot resolve */
|
|
169
|
+
}
|
|
170
|
+
const result = {
|
|
171
|
+
path: worktreePath,
|
|
172
|
+
head,
|
|
173
|
+
branch,
|
|
174
|
+
};
|
|
175
|
+
const localFileCopies = await copyLocalFiles(project.path, worktreePath, input.copyLocalFiles);
|
|
176
|
+
if (localFileCopies.length > 0) {
|
|
177
|
+
result.localFileCopies = localFileCopies;
|
|
178
|
+
}
|
|
179
|
+
// Best-effort counter enrichment for the freshly created worktree.
|
|
180
|
+
// Bounded by ENRICH_DEADLINE_MS so a slow / locked repo cannot stall the
|
|
181
|
+
// HTTP response and the sidebar broadcast. On timeout we broadcast
|
|
182
|
+
// without counters; the sidebar will fill in zeros and the next
|
|
183
|
+
// git-state poll covers this path.
|
|
184
|
+
const counters = await raceWithDeadline((async () => {
|
|
185
|
+
try {
|
|
186
|
+
const { stdout } = await runGit(worktreePath, [
|
|
187
|
+
"status",
|
|
188
|
+
"--porcelain=v2",
|
|
189
|
+
"-b",
|
|
190
|
+
]);
|
|
191
|
+
return parseGitStatusV2(stdout);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
})(), ENRICH_DEADLINE_MS);
|
|
197
|
+
eventBus.broadcast({
|
|
198
|
+
type: "worktree-created",
|
|
199
|
+
projectId,
|
|
200
|
+
worktree: { ...result, ...(counters ?? {}) },
|
|
201
|
+
});
|
|
202
|
+
return result;
|
|
203
|
+
},
|
|
204
|
+
/**
|
|
205
|
+
* Rename the worktree's branch via `git branch -m old new`. The on-disk
|
|
206
|
+
* worktree directory keeps its original path -- `git worktree move` is
|
|
207
|
+
* intentionally out of scope here so the operation stays a single,
|
|
208
|
+
* cheap ref rename. Sidebar / topbar consumers display `branch`, so the
|
|
209
|
+
* UX still updates cleanly even though `path` lags the convention.
|
|
210
|
+
*/
|
|
211
|
+
async renameProjectWorktree(projectId, worktreePath, newBranch) {
|
|
212
|
+
const trimmedNew = newBranch.trim();
|
|
213
|
+
const validation = validateBranchName(trimmedNew);
|
|
214
|
+
if (validation)
|
|
215
|
+
throw new WorkspaceValidationError(validation);
|
|
216
|
+
const { resolved } = await fenceWorktreePath(projectId, worktreePath);
|
|
217
|
+
let oldBranch = "";
|
|
218
|
+
try {
|
|
219
|
+
const { stdout } = await runGit(resolved, [
|
|
220
|
+
"rev-parse",
|
|
221
|
+
"--abbrev-ref",
|
|
222
|
+
"HEAD",
|
|
223
|
+
]);
|
|
224
|
+
oldBranch = stdout.trim();
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
const message = err instanceof Error ? err.message : "rev-parse HEAD failed";
|
|
228
|
+
throw new WorkspaceConflictError(message);
|
|
229
|
+
}
|
|
230
|
+
if (!oldBranch || oldBranch === "HEAD") {
|
|
231
|
+
throw new WorkspaceConflictError("Cannot rename a detached HEAD worktree");
|
|
232
|
+
}
|
|
233
|
+
if (oldBranch === trimmedNew) {
|
|
234
|
+
return { oldBranch, newBranch: trimmedNew };
|
|
235
|
+
}
|
|
236
|
+
try {
|
|
237
|
+
await runGit(resolved, ["branch", "-m", oldBranch, trimmedNew]);
|
|
238
|
+
}
|
|
239
|
+
catch (err) {
|
|
240
|
+
const message = err instanceof Error ? err.message : "git branch -m failed";
|
|
241
|
+
throw new WorkspaceConflictError(message);
|
|
242
|
+
}
|
|
243
|
+
eventBus.broadcast({
|
|
244
|
+
type: "worktree-renamed",
|
|
245
|
+
projectId,
|
|
246
|
+
worktreePath: resolved,
|
|
247
|
+
oldBranch,
|
|
248
|
+
newBranch: trimmedNew,
|
|
249
|
+
});
|
|
250
|
+
return { oldBranch, newBranch: trimmedNew };
|
|
251
|
+
},
|
|
252
|
+
async removeProjectWorktree(projectId, worktreePath, opts = {}) {
|
|
253
|
+
const project = projectManager.get(projectId);
|
|
254
|
+
if (!project)
|
|
255
|
+
throw new WorkspaceNotFoundError();
|
|
256
|
+
// Orphan path: on-disk dir gone -> `git worktree remove` and the realpath fence both throw ENOENT, so prune by exact-string match instead.
|
|
257
|
+
const registered = getProjectWorktrees(projectId);
|
|
258
|
+
const cachedHit = registered.find((w) => w.path === worktreePath);
|
|
259
|
+
if (cachedHit && !(await pathExists(worktreePath))) {
|
|
260
|
+
try {
|
|
261
|
+
await runGit(project.path, ["worktree", "prune"]);
|
|
262
|
+
}
|
|
263
|
+
catch (err) {
|
|
264
|
+
const message = err instanceof Error ? err.message : "git worktree prune failed";
|
|
265
|
+
throw new WorkspaceConflictError(message);
|
|
266
|
+
}
|
|
267
|
+
eventBus.broadcast({
|
|
268
|
+
type: "worktree-removed",
|
|
269
|
+
projectId,
|
|
270
|
+
worktreePath: cachedHit.path,
|
|
271
|
+
});
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
const { projectPath, resolved } = await fenceWorktreePath(projectId, worktreePath);
|
|
275
|
+
// `--` separator before the path keeps git from interpreting an unusual
|
|
276
|
+
// realpath (e.g. starting with `-`) as an option, even though the fence
|
|
277
|
+
// already restricts it to a registered worktree.
|
|
278
|
+
const args = ["worktree", "remove"];
|
|
279
|
+
if (opts.force === true)
|
|
280
|
+
args.push("--force");
|
|
281
|
+
args.push("--", resolved);
|
|
282
|
+
try {
|
|
283
|
+
await runGit(projectPath, args);
|
|
284
|
+
}
|
|
285
|
+
catch (err) {
|
|
286
|
+
const message = err instanceof Error ? err.message : "git worktree remove failed";
|
|
287
|
+
throw new WorkspaceConflictError(message);
|
|
288
|
+
}
|
|
289
|
+
eventBus.broadcast({
|
|
290
|
+
type: "worktree-removed",
|
|
291
|
+
projectId,
|
|
292
|
+
worktreePath: resolved,
|
|
293
|
+
});
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
async function branchRefExists(projectPath, branch, runGit) {
|
|
298
|
+
try {
|
|
299
|
+
await runGit(projectPath, [
|
|
300
|
+
"show-ref",
|
|
301
|
+
"--verify",
|
|
302
|
+
"--quiet",
|
|
303
|
+
`refs/heads/${branch}`,
|
|
304
|
+
]);
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
catch {
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
async function defaultIsInsideGitRepo(projectPath, runGit) {
|
|
312
|
+
try {
|
|
313
|
+
const { stdout } = await runGit(projectPath, [
|
|
314
|
+
"rev-parse",
|
|
315
|
+
"--is-inside-work-tree",
|
|
316
|
+
]);
|
|
317
|
+
return stdout.trim() === "true";
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=worktree-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-commands.js","sourceRoot":"","sources":["../../../src/application/workspace/worktree-commands.ts"],"names":[],"mappings":"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"}
|