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,390 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* -- `parasor pty-host` CLI subcommands.
|
|
3
|
+
*
|
|
4
|
+
* start Start the daemon (idempotent).
|
|
5
|
+
* stop Send SIGTERM to the running daemon, wait for graceful exit.
|
|
6
|
+
* status Print pid + socket path + mode (running/down/locked-by-other).
|
|
7
|
+
* restart stop + start in sequence (does *not* terminate sessions --
|
|
8
|
+
* the daemon's SIGTERM/SIGKILL escalation is governed by
|
|
9
|
+
* the daemon itself; restart is a one-shot supervisor op).
|
|
10
|
+
* doctor Diagnostic dump for support: paths, lockfile state, recorded
|
|
11
|
+
* pid liveness, mode-marker, last 50 lines of the daemon log,
|
|
12
|
+
* and the SessionRecord table from AppState.
|
|
13
|
+
*
|
|
14
|
+
* All commands take Partial<PtyHostDeps> for test seams. Production
|
|
15
|
+
* defaults wrap node:fs / node:child_process / node:net.
|
|
16
|
+
*/
|
|
17
|
+
import { spawn as realSpawn } from "node:child_process";
|
|
18
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
19
|
+
import { homedir } from "node:os";
|
|
20
|
+
import { join } from "node:path";
|
|
21
|
+
import { fileURLToPath } from "node:url";
|
|
22
|
+
import { markerFileFor, readMarker } from "../pty/host-daemon/mode-marker.js";
|
|
23
|
+
import { resolveDaemonPaths, } from "../pty/host-daemon/paths.js";
|
|
24
|
+
import { AppStateStore } from "../state/app-state.js";
|
|
25
|
+
const STOP_TIMEOUT_MS = 10_000;
|
|
26
|
+
const START_TIMEOUT_MS = 5_000;
|
|
27
|
+
const POLL_INTERVAL_MS = 100;
|
|
28
|
+
function defaultConfigDir() {
|
|
29
|
+
const fromEnv = process.env.PARASOR_CONFIG_DIR;
|
|
30
|
+
if (fromEnv && fromEnv.length > 0)
|
|
31
|
+
return fromEnv;
|
|
32
|
+
return join(homedir(), ".config", "parasor");
|
|
33
|
+
}
|
|
34
|
+
function defaultKill(pid, signal) {
|
|
35
|
+
try {
|
|
36
|
+
process.kill(pid, signal);
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
return err.code === "EPERM";
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function defaultSpawnDetached(cmd, args) {
|
|
44
|
+
const child = realSpawn(cmd, args, {
|
|
45
|
+
detached: true,
|
|
46
|
+
stdio: "ignore",
|
|
47
|
+
});
|
|
48
|
+
// detached spawn can emit `error` asynchronously
|
|
49
|
+
// (ENOENT for the binary, EACCES on platforms without immediate
|
|
50
|
+
// exec verification). Without a listener, unhandled error events
|
|
51
|
+
// crash the parent. The CLI start path polls the socket afterward --
|
|
52
|
+
// a failed spawn shows up as "did not become ready" rather than as
|
|
53
|
+
// a parent crash.
|
|
54
|
+
child.once("error", () => {
|
|
55
|
+
/* swallow -- caller relies on probe loop to detect non-startup */
|
|
56
|
+
});
|
|
57
|
+
child.unref();
|
|
58
|
+
return { pid: child.pid };
|
|
59
|
+
}
|
|
60
|
+
function defaultProbeSocket(path) {
|
|
61
|
+
return import("node:net").then((net) => new Promise((resolve) => {
|
|
62
|
+
const s = net.connect(path);
|
|
63
|
+
const finish = (outcome) => {
|
|
64
|
+
s.removeAllListeners();
|
|
65
|
+
try {
|
|
66
|
+
s.destroy();
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
/* ignore */
|
|
70
|
+
}
|
|
71
|
+
resolve({
|
|
72
|
+
socketReady: outcome === "ready",
|
|
73
|
+
// Connect-success and timeout both mean a live process owns
|
|
74
|
+
// the socket; only ECONNREFUSED / ENOENT / etc. prove the
|
|
75
|
+
// daemon is gone. See bootstrap.ts isSocketActive doc.
|
|
76
|
+
socketAlive: outcome === "ready" || outcome === "timeout",
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
s.once("connect", () => finish("ready"));
|
|
80
|
+
s.once("error", () => finish("error"));
|
|
81
|
+
s.setTimeout(250, () => finish("timeout"));
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
function defaultReadPidFile(path) {
|
|
85
|
+
if (!existsSync(path))
|
|
86
|
+
return null;
|
|
87
|
+
try {
|
|
88
|
+
const pid = Number(readFileSync(path, "utf8").trim());
|
|
89
|
+
return Number.isFinite(pid) && pid > 0 ? pid : null;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function defaultReadLog(path, lines) {
|
|
96
|
+
if (!existsSync(path))
|
|
97
|
+
return "(no log file)";
|
|
98
|
+
try {
|
|
99
|
+
const content = readFileSync(path, "utf8");
|
|
100
|
+
const all = content.split(/\r?\n/);
|
|
101
|
+
return all.slice(-lines).join("\n");
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
return `(log unreadable: ${err.message})`;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function defaultSleep(ms) {
|
|
108
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
109
|
+
}
|
|
110
|
+
function defaultEntryPath() {
|
|
111
|
+
// dist/server/cli/pty-host.js -> ../pty/host-daemon/entry.js
|
|
112
|
+
// src/cli/pty-host.ts also resolves to the same .js after build, so
|
|
113
|
+
// tests that exercise via `tsx` need to override this.
|
|
114
|
+
const here = fileURLToPath(import.meta.url);
|
|
115
|
+
return join(here, "..", "..", "pty", "host-daemon", "entry.js");
|
|
116
|
+
}
|
|
117
|
+
function resolveDeps(partial) {
|
|
118
|
+
const appStateDir = partial?.appStateDir ?? defaultConfigDir();
|
|
119
|
+
return {
|
|
120
|
+
paths: partial?.paths ?? resolveDaemonPaths(),
|
|
121
|
+
appStateDir,
|
|
122
|
+
now: partial?.now ?? Date.now,
|
|
123
|
+
killProcess: partial?.killProcess ?? defaultKill,
|
|
124
|
+
spawnDetached: partial?.spawnDetached ?? defaultSpawnDetached,
|
|
125
|
+
probeSocket: partial?.probeSocket ?? defaultProbeSocket,
|
|
126
|
+
readPidFile: partial?.readPidFile ?? defaultReadPidFile,
|
|
127
|
+
readLog: partial?.readLog ?? defaultReadLog,
|
|
128
|
+
sleep: partial?.sleep ?? defaultSleep,
|
|
129
|
+
log: partial?.log ?? ((m) => console.log(m)),
|
|
130
|
+
error: partial?.error ?? ((m) => console.error(m)),
|
|
131
|
+
daemonEntryPath: partial?.daemonEntryPath ?? defaultEntryPath(),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
async function probeStatus(deps) {
|
|
135
|
+
const probe = await deps.probeSocket(deps.paths.socketPath);
|
|
136
|
+
const pid = deps.readPidFile(deps.paths.pidFile);
|
|
137
|
+
/*
|
|
138
|
+
* bootstrap.isSocketActive treats a connect
|
|
139
|
+
* timeout as "alive" (fail-closed) to avoid double-spawn races.
|
|
140
|
+
* The CLI's old behavior (timeout = down) disagreed: a busy daemon
|
|
141
|
+
* mid-handshake could be flagged stale-pidfile and (post HIGH#2
|
|
142
|
+
* with --force) killed. Use socketAlive here so a live but stalled
|
|
143
|
+
* daemon stays classified `running` -- the user can investigate
|
|
144
|
+
* before forcing termination.
|
|
145
|
+
*/
|
|
146
|
+
if (probe.socketAlive) {
|
|
147
|
+
return { state: "running", pid, socketReady: probe.socketReady };
|
|
148
|
+
}
|
|
149
|
+
if (pid !== null && deps.killProcess(pid, 0)) {
|
|
150
|
+
return { state: "stale-pidfile", pid, socketReady: false };
|
|
151
|
+
}
|
|
152
|
+
return { state: "down", pid: null, socketReady: false };
|
|
153
|
+
}
|
|
154
|
+
async function startCmd(deps) {
|
|
155
|
+
const status = await probeStatus(deps);
|
|
156
|
+
if (status.state === "running") {
|
|
157
|
+
deps.log(`parasor-pty-host already running (pid ${status.pid ?? "?"}).`);
|
|
158
|
+
return 0;
|
|
159
|
+
}
|
|
160
|
+
/*
|
|
161
|
+
* symmetry with spawn-daemon.ts. The auto-spawn
|
|
162
|
+
* path falls back to `entry.ts` + `--import tsx` when the compiled
|
|
163
|
+
* `entry.js` is missing (dev/test runs without `pnpm build`). The
|
|
164
|
+
* operator-recovery `parasor pty-host start` CLI must do the same,
|
|
165
|
+
* otherwise users on the dev tree see "entry script not found" and
|
|
166
|
+
* have no way to start the daemon manually.
|
|
167
|
+
*/
|
|
168
|
+
const tsFallback = deps.daemonEntryPath.endsWith(".js")
|
|
169
|
+
? `${deps.daemonEntryPath.slice(0, -3)}.ts`
|
|
170
|
+
: null;
|
|
171
|
+
let nodeArgs;
|
|
172
|
+
if (existsSync(deps.daemonEntryPath)) {
|
|
173
|
+
nodeArgs = [deps.daemonEntryPath];
|
|
174
|
+
}
|
|
175
|
+
else if (tsFallback && existsSync(tsFallback)) {
|
|
176
|
+
nodeArgs = ["--import", "tsx", tsFallback];
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
deps.error(`daemon entry script not found at ${deps.daemonEntryPath} ` +
|
|
180
|
+
`(also tried ${tsFallback ?? "(no .ts fallback)"}). ` +
|
|
181
|
+
"Rebuild @parasor/server before retrying.");
|
|
182
|
+
return 1;
|
|
183
|
+
}
|
|
184
|
+
let spawned;
|
|
185
|
+
try {
|
|
186
|
+
spawned = deps.spawnDetached(process.execPath, nodeArgs);
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
deps.error(`spawn failed: ${err.message}`);
|
|
190
|
+
return 1;
|
|
191
|
+
}
|
|
192
|
+
// Poll until socket accepts connections or timeout.
|
|
193
|
+
const deadline = deps.now() + START_TIMEOUT_MS;
|
|
194
|
+
while (deps.now() < deadline) {
|
|
195
|
+
const probe = await deps.probeSocket(deps.paths.socketPath);
|
|
196
|
+
if (probe.socketReady) {
|
|
197
|
+
const pid = deps.readPidFile(deps.paths.pidFile);
|
|
198
|
+
deps.log(`parasor-pty-host started (pid ${pid ?? "?"}, socket ${deps.paths.socketPath}).`);
|
|
199
|
+
return 0;
|
|
200
|
+
}
|
|
201
|
+
await deps.sleep(POLL_INTERVAL_MS);
|
|
202
|
+
}
|
|
203
|
+
/*
|
|
204
|
+
* timeout means our spawned child either crashed
|
|
205
|
+
* during boot or is hung. The child still holds the lockfile and may
|
|
206
|
+
* still finish writing the marker; without an explicit reap the next
|
|
207
|
+
* `start` waits 60s for proper-lockfile's stale window. Send SIGTERM
|
|
208
|
+
* to the child we just spawned so the next attempt has a clean slate.
|
|
209
|
+
* Best-effort: child may already be dead, or pid may be unknown
|
|
210
|
+
* (test stubs don't always populate it).
|
|
211
|
+
*/
|
|
212
|
+
if (typeof spawned.pid === "number") {
|
|
213
|
+
deps.killProcess(spawned.pid, "SIGTERM");
|
|
214
|
+
}
|
|
215
|
+
deps.error(`daemon did not become ready within ${START_TIMEOUT_MS}ms. ` +
|
|
216
|
+
`Check ${deps.paths.logFile} for errors.`);
|
|
217
|
+
return 1;
|
|
218
|
+
}
|
|
219
|
+
async function stopCmd(deps, force) {
|
|
220
|
+
const status = await probeStatus(deps);
|
|
221
|
+
if (status.state === "down") {
|
|
222
|
+
deps.log("parasor-pty-host is not running.");
|
|
223
|
+
return 0;
|
|
224
|
+
}
|
|
225
|
+
/*
|
|
226
|
+
* refuse to SIGTERM a pid we cannot prove is
|
|
227
|
+
* the daemon. The kernel recycles PIDs; user-written or stale
|
|
228
|
+
* pidfiles can name an unrelated process (a long-running editor,
|
|
229
|
+
* sleep, etc.). Without a live socket on the daemon path we have
|
|
230
|
+
* no proof of ownership, so default-stop bails out and points to
|
|
231
|
+
* doctor for diagnosis. `--force` overrides for the rare ops case
|
|
232
|
+
* where the daemon crashed mid-shutdown and pidfile must be cleared.
|
|
233
|
+
*/
|
|
234
|
+
if (status.state === "stale-pidfile" && !force) {
|
|
235
|
+
deps.error(`parasor-pty-host: socket ${deps.paths.socketPath} is unreachable but ` +
|
|
236
|
+
`pidfile ${deps.paths.pidFile} names a live process (pid ${status.pid ?? "?"}). ` +
|
|
237
|
+
`Refusing to send SIGTERM without ownership proof -- the pid may have been ` +
|
|
238
|
+
`recycled by the kernel. Run \`parasor pty-host doctor\` to inspect, or ` +
|
|
239
|
+
`pass \`--force\` if you have already verified the pid is the daemon.`);
|
|
240
|
+
return 1;
|
|
241
|
+
}
|
|
242
|
+
const pid = status.pid;
|
|
243
|
+
if (pid === null) {
|
|
244
|
+
deps.error(`socket reachable but pidfile missing (${deps.paths.pidFile}). ` +
|
|
245
|
+
"Cannot send SIGTERM safely.");
|
|
246
|
+
return 1;
|
|
247
|
+
}
|
|
248
|
+
if (!deps.killProcess(pid, "SIGTERM")) {
|
|
249
|
+
deps.error(`SIGTERM to pid ${pid} failed.`);
|
|
250
|
+
return 1;
|
|
251
|
+
}
|
|
252
|
+
// Poll for exit.
|
|
253
|
+
const deadline = deps.now() + STOP_TIMEOUT_MS;
|
|
254
|
+
while (deps.now() < deadline) {
|
|
255
|
+
if (!deps.killProcess(pid, 0)) {
|
|
256
|
+
deps.log(`parasor-pty-host stopped (pid ${pid}).`);
|
|
257
|
+
return 0;
|
|
258
|
+
}
|
|
259
|
+
await deps.sleep(POLL_INTERVAL_MS);
|
|
260
|
+
}
|
|
261
|
+
deps.error(`pid ${pid} did not exit after ${STOP_TIMEOUT_MS}ms. ` +
|
|
262
|
+
"Escalate manually with kill -9.");
|
|
263
|
+
return 1;
|
|
264
|
+
}
|
|
265
|
+
async function statusCmd(deps) {
|
|
266
|
+
const status = await probeStatus(deps);
|
|
267
|
+
const lines = [];
|
|
268
|
+
lines.push(`socket: ${deps.paths.socketPath}`);
|
|
269
|
+
lines.push(`pidfile: ${deps.paths.pidFile}`);
|
|
270
|
+
lines.push(`logfile: ${deps.paths.logFile}`);
|
|
271
|
+
lines.push(`state: ${status.state}`);
|
|
272
|
+
if (status.pid !== null)
|
|
273
|
+
lines.push(`pid: ${status.pid}`);
|
|
274
|
+
lines.push(`socket-ready: ${status.socketReady}`);
|
|
275
|
+
deps.log(lines.join("\n"));
|
|
276
|
+
return status.state === "running" ? 0 : 1;
|
|
277
|
+
}
|
|
278
|
+
async function restartCmd(deps, force) {
|
|
279
|
+
// restart honours the same --force semantics as stop: the daemon may
|
|
280
|
+
// be in stale-pidfile state after a crash, and the user is signalling
|
|
281
|
+
// they have verified the pid.
|
|
282
|
+
const stopRc = await stopCmd(deps, force);
|
|
283
|
+
if (stopRc !== 0) {
|
|
284
|
+
deps.error("stop failed; aborting restart.");
|
|
285
|
+
return stopRc;
|
|
286
|
+
}
|
|
287
|
+
// Small drain to give the lockfile time to release. proper-lockfile
|
|
288
|
+
// releases synchronously on graceful exit, but kernel cleanup of the
|
|
289
|
+
// socket inode can lag a few ms.
|
|
290
|
+
await deps.sleep(POLL_INTERVAL_MS);
|
|
291
|
+
return startCmd(deps);
|
|
292
|
+
}
|
|
293
|
+
async function doctorCmd(deps) {
|
|
294
|
+
const status = await probeStatus(deps);
|
|
295
|
+
const lines = [];
|
|
296
|
+
lines.push("=== parasor pty-host doctor ===");
|
|
297
|
+
lines.push(`runtimeDir: ${deps.paths.runtimeDir}`);
|
|
298
|
+
lines.push(`socket: ${deps.paths.socketPath}`);
|
|
299
|
+
lines.push(`pidfile: ${deps.paths.pidFile}`);
|
|
300
|
+
lines.push(`lockfile: ${deps.paths.lockFile}`);
|
|
301
|
+
lines.push(`logfile: ${deps.paths.logFile}`);
|
|
302
|
+
lines.push(`appStateDir: ${deps.appStateDir}`);
|
|
303
|
+
lines.push("");
|
|
304
|
+
lines.push(`state: ${status.state}`);
|
|
305
|
+
lines.push(`pid: ${status.pid ?? "(none)"}`);
|
|
306
|
+
lines.push(`socket-ready: ${status.socketReady}`);
|
|
307
|
+
// Mode marker -- tells us whether the AppState belongs to in-process
|
|
308
|
+
// or daemon and surfaces stale markers from a prior crash.
|
|
309
|
+
const markerFile = markerFileFor(deps.appStateDir);
|
|
310
|
+
const marker = readMarker(markerFile);
|
|
311
|
+
if (marker) {
|
|
312
|
+
lines.push(`mode-marker: ${marker.mode} (pid=${marker.pid}, startedAt=${marker.startedAt})`);
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
lines.push("mode-marker: (none)");
|
|
316
|
+
}
|
|
317
|
+
// SessionRecord table -- both daemon and in-process modes write to it
|
|
318
|
+
// when a daemonContext is present, so this is the single best
|
|
319
|
+
// user-facing snapshot of "what PTYs are tracked".
|
|
320
|
+
// ensure store.destroy() runs even when get() or
|
|
321
|
+
// the format loop throws -- without try/finally a failing read would
|
|
322
|
+
// leak the AppStateStore's internal flush timer until process exit.
|
|
323
|
+
let store = null;
|
|
324
|
+
try {
|
|
325
|
+
store = new AppStateStore({ dir: deps.appStateDir, debounceMs: 0 });
|
|
326
|
+
const recs = store.get().sessionRecords;
|
|
327
|
+
lines.push("");
|
|
328
|
+
lines.push(`sessionRecords (${recs.length}):`);
|
|
329
|
+
for (const r of recs) {
|
|
330
|
+
lines.push(` ${r.id} state=${r.state} pid=${r.pid ?? "-"} pgid=${r.pgid ?? "-"} ` +
|
|
331
|
+
`daemonPid=${r.daemonPid} startedAt=${r.startedAt}`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
catch (err) {
|
|
335
|
+
lines.push(`sessionRecords: (load failed: ${err.message})`);
|
|
336
|
+
}
|
|
337
|
+
finally {
|
|
338
|
+
store?.destroy();
|
|
339
|
+
}
|
|
340
|
+
// Tail of the log file.
|
|
341
|
+
lines.push("");
|
|
342
|
+
lines.push("=== last 50 log lines ===");
|
|
343
|
+
lines.push(deps.readLog(deps.paths.logFile, 50));
|
|
344
|
+
deps.log(lines.join("\n"));
|
|
345
|
+
return 0;
|
|
346
|
+
}
|
|
347
|
+
const HELP = `Usage: parasor pty-host <subcommand> [--force]
|
|
348
|
+
|
|
349
|
+
Subcommands:
|
|
350
|
+
start Start the parasor-pty-host daemon (idempotent).
|
|
351
|
+
stop Send SIGTERM to the running daemon and wait for exit.
|
|
352
|
+
Refuses to kill when the socket is unreachable (pid may be
|
|
353
|
+
recycled). Pass --force to override after running doctor.
|
|
354
|
+
status Print daemon state, pid, and socket path.
|
|
355
|
+
restart stop then start. --force is forwarded to stop.
|
|
356
|
+
doctor Diagnostic dump (paths, lockfile, sessionRecords, log tail).
|
|
357
|
+
|
|
358
|
+
Environment:
|
|
359
|
+
PARASOR_PTY_SOCK Override socket path (also relocates pid/lock/log).
|
|
360
|
+
XDG_RUNTIME_DIR Linux runtime dir; defaults to ~/.parasor/run otherwise.
|
|
361
|
+
PARASOR_CONFIG_DIR AppState dir (default ~/.config/parasor).`;
|
|
362
|
+
export async function cliPtyHost(args, partial) {
|
|
363
|
+
const deps = resolveDeps(partial);
|
|
364
|
+
const sub = args[0];
|
|
365
|
+
// Parse --force at the subcommand argument layer rather than the top
|
|
366
|
+
// level so `parasor pty-host stop --force` reads naturally and the
|
|
367
|
+
// flag never accidentally affects start/status/doctor.
|
|
368
|
+
const force = args.slice(1).includes("--force");
|
|
369
|
+
switch (sub) {
|
|
370
|
+
case "start":
|
|
371
|
+
return startCmd(deps);
|
|
372
|
+
case "stop":
|
|
373
|
+
return stopCmd(deps, force);
|
|
374
|
+
case "status":
|
|
375
|
+
return statusCmd(deps);
|
|
376
|
+
case "restart":
|
|
377
|
+
return restartCmd(deps, force);
|
|
378
|
+
case "doctor":
|
|
379
|
+
return doctorCmd(deps);
|
|
380
|
+
case "help":
|
|
381
|
+
case "--help":
|
|
382
|
+
case "-h":
|
|
383
|
+
deps.log(HELP);
|
|
384
|
+
return 0;
|
|
385
|
+
default:
|
|
386
|
+
deps.error(`unknown subcommand: ${sub ?? "(none)"}\n\n${HELP}`);
|
|
387
|
+
return 1;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
//# sourceMappingURL=pty-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty-host.js","sourceRoot":"","sources":["../../src/cli/pty-host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr.d.ts","sourceRoot":"","sources":["../../src/cli/qr.ts"],"names":[],"mappings":"AAkBA,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CzD"}
|
package/server/cli/qr.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { createConnection } from "node:net";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { buildPairingUrl, buildQrSection } from "../network/qr.js";
|
|
5
|
+
export async function cliQr(args) {
|
|
6
|
+
let iface;
|
|
7
|
+
for (const arg of args) {
|
|
8
|
+
if (arg.startsWith("--iface="))
|
|
9
|
+
iface = arg.slice(8);
|
|
10
|
+
else if (arg === "-h" || arg === "--help") {
|
|
11
|
+
console.log("Usage: parasor qr [--iface=<iface>]\n" +
|
|
12
|
+
" Displays a QR code for a running parasor server. Defaults to Tailscale, falls back to LAN.");
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const socketPath = process.env.PARASOR_SOCKET ??
|
|
17
|
+
join(process.env.PARASOR_CONFIG_DIR ?? join(homedir(), ".config", "parasor"), "parasor.sock");
|
|
18
|
+
const response = await sendRequest(socketPath, {
|
|
19
|
+
cmd: "qr",
|
|
20
|
+
args: { iface: iface ?? "" },
|
|
21
|
+
});
|
|
22
|
+
if (!response.ok) {
|
|
23
|
+
console.error(`parasor qr failed: ${response.error ?? "unknown error"}`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const lines = buildQrSection({
|
|
27
|
+
endpoints: response.endpoints,
|
|
28
|
+
port: response.port,
|
|
29
|
+
authMode: response.authMode,
|
|
30
|
+
token: response.token,
|
|
31
|
+
makeAccessUrl: response.authMode === "token" && response.tokenKind === "pairing"
|
|
32
|
+
? (endpoint) => buildPairingUrl(endpoint.address, response.port, response.token)
|
|
33
|
+
: undefined,
|
|
34
|
+
iface: iface ?? response.iface,
|
|
35
|
+
clickable: process.stdout.isTTY === true,
|
|
36
|
+
});
|
|
37
|
+
for (const line of lines)
|
|
38
|
+
console.log(line);
|
|
39
|
+
}
|
|
40
|
+
function sendRequest(socketPath, request) {
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
const client = createConnection(socketPath, () => {
|
|
43
|
+
client.write(`${JSON.stringify(request)}\n`);
|
|
44
|
+
});
|
|
45
|
+
let data = "";
|
|
46
|
+
client.on("data", (chunk) => {
|
|
47
|
+
data += chunk;
|
|
48
|
+
});
|
|
49
|
+
client.on("end", () => {
|
|
50
|
+
try {
|
|
51
|
+
resolve(JSON.parse(data.trim()));
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
reject(err);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
client.on("error", (err) => {
|
|
58
|
+
if (err.code === "ENOENT" || err.code === "ECONNREFUSED") {
|
|
59
|
+
reject(new Error(`No parasor server reachable at ${socketPath}. Start it with \`parasor\` first.`));
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
reject(err);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
client.setTimeout(2000, () => {
|
|
66
|
+
client.destroy(new Error("timeout"));
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=qr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr.js","sourceRoot":"","sources":["../../src/cli/qr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type ProbeOptions, type ProbeResult } from "./probe-daemon-version.js";
|
|
2
|
+
export interface ConfirmRestartDeps {
|
|
3
|
+
isTty: boolean;
|
|
4
|
+
log: (message: string) => void;
|
|
5
|
+
/** Reads one line from stdin. Resolves to null on EOF. */
|
|
6
|
+
readLine: () => Promise<string | null>;
|
|
7
|
+
probe: (opts: ProbeOptions) => Promise<ProbeResult>;
|
|
8
|
+
resolvePaths: () => {
|
|
9
|
+
socketPath: string;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export interface ConfirmRestartOptions {
|
|
13
|
+
autoYes: boolean;
|
|
14
|
+
/** Override for tests. */
|
|
15
|
+
deps?: Partial<ConfirmRestartDeps>;
|
|
16
|
+
}
|
|
17
|
+
export interface ConfirmRestartResult {
|
|
18
|
+
proceed: boolean;
|
|
19
|
+
/** Human-readable explanation, surfaced to the caller's log on abort. */
|
|
20
|
+
reason: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function confirmRestartIfMismatch(options: ConfirmRestartOptions): Promise<ConfirmRestartResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Pull `--yes` / `-y` from an args array and return both the flag and the
|
|
25
|
+
* filtered remainder. Modeled on the existing `--all` filtering style in
|
|
26
|
+
* `cliService` so the help text stays consistent.
|
|
27
|
+
*/
|
|
28
|
+
export declare function extractAutoYesFlag(args: string[]): {
|
|
29
|
+
autoYes: boolean;
|
|
30
|
+
rest: string[];
|
|
31
|
+
};
|
|
32
|
+
export declare function readLineFromInput(input: NodeJS.ReadableStream): Promise<string | null>;
|
|
33
|
+
//# sourceMappingURL=restart-confirm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart-confirm.d.ts","sourceRoot":"","sources":["../../src/cli/restart-confirm.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,WAAW,EAEjB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvC,KAAK,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IACpD,YAAY,EAAE,MAAM;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,0BAA0B;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;CAChB;AAaD,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CA+D/B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAClD,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAIA;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,CAAC,cAAc,GAC3B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAexB"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Restart confirmation -- gate restart commands behind a confirmation when the
|
|
3
|
+
* running daemon's PROTOCOL_VERSION is incompatible with this binary's.
|
|
4
|
+
*
|
|
5
|
+
* The mismatch path inside `pty/host.ts` SIGKILLs the daemon and every
|
|
6
|
+
* PTY child to recover. This module probes the daemon BEFORE we kick
|
|
7
|
+
* the supervisor, and prompts the user to acknowledge session loss.
|
|
8
|
+
*
|
|
9
|
+
* Non-interactive callers (launchd auto-respawn, scripted upgrades,
|
|
10
|
+
* CI) cannot answer prompts. They must opt in via `--yes`/`-y`,
|
|
11
|
+
* otherwise the restart aborts with a hint instead of hanging.
|
|
12
|
+
*/
|
|
13
|
+
import { createInterface } from "node:readline";
|
|
14
|
+
import { resolveDaemonPaths } from "../pty/host-daemon/paths.js";
|
|
15
|
+
import { probeDaemonProtocolVersion, } from "./probe-daemon-version.js";
|
|
16
|
+
const DEFAULT_DEPS = {
|
|
17
|
+
isTty: Boolean(process.stdin.isTTY),
|
|
18
|
+
log: (msg) => process.stderr.write(`${msg}\n`),
|
|
19
|
+
readLine: () => readLineFromInput(process.stdin),
|
|
20
|
+
probe: (opts) => probeDaemonProtocolVersion(opts),
|
|
21
|
+
resolvePaths: () => {
|
|
22
|
+
const paths = resolveDaemonPaths();
|
|
23
|
+
return { socketPath: paths.socketPath };
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
export async function confirmRestartIfMismatch(options) {
|
|
27
|
+
const deps = { ...DEFAULT_DEPS, ...(options.deps ?? {}) };
|
|
28
|
+
const { socketPath } = deps.resolvePaths();
|
|
29
|
+
const probeResult = await deps.probe({ socketPath });
|
|
30
|
+
if (probeResult.status === "no-daemon") {
|
|
31
|
+
return { proceed: true, reason: "no daemon detected" };
|
|
32
|
+
}
|
|
33
|
+
if (probeResult.status === "compatible") {
|
|
34
|
+
return {
|
|
35
|
+
proceed: true,
|
|
36
|
+
reason: `daemon ${probeResult.daemonVersion} compatible with server ${probeResult.serverVersion}`,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (probeResult.status === "unknown") {
|
|
40
|
+
/*
|
|
41
|
+
* Probe couldn't decide. Don't block the restart -- we may be
|
|
42
|
+
* running against a future daemon version with a different reply
|
|
43
|
+
* shape, or a transient IO error. Surface the reason so an
|
|
44
|
+
* operator can investigate, but defer to the existing in-server
|
|
45
|
+
* recovery path.
|
|
46
|
+
*/
|
|
47
|
+
deps.log(`parasor: daemon version probe inconclusive (${probeResult.reason}); proceeding without confirmation.`);
|
|
48
|
+
return { proceed: true, reason: `probe unknown: ${probeResult.reason}` };
|
|
49
|
+
}
|
|
50
|
+
// probeResult.status === "mismatch"
|
|
51
|
+
const banner = `parasor: this binary speaks PTY host protocol ${probeResult.serverVersion}, ` +
|
|
52
|
+
`but the running daemon speaks ${probeResult.daemonVersion}. ` +
|
|
53
|
+
`Continuing will terminate the daemon and every active PTY session.`;
|
|
54
|
+
if (options.autoYes) {
|
|
55
|
+
deps.log(`${banner} (--yes supplied, proceeding)`);
|
|
56
|
+
return {
|
|
57
|
+
proceed: true,
|
|
58
|
+
reason: `mismatch acknowledged via --yes (server=${probeResult.serverVersion} daemon=${probeResult.daemonVersion})`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
if (!deps.isTty) {
|
|
62
|
+
deps.log(banner);
|
|
63
|
+
deps.log("parasor: stdin is not a TTY; pass --yes to acknowledge session loss in non-interactive contexts.");
|
|
64
|
+
return {
|
|
65
|
+
proceed: false,
|
|
66
|
+
reason: "non-interactive without --yes",
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
deps.log(banner);
|
|
70
|
+
deps.log("parasor: continue and lose all active sessions? [y/N] ");
|
|
71
|
+
const answer = (await deps.readLine())?.trim().toLowerCase() ?? "";
|
|
72
|
+
if (answer === "y" || answer === "yes") {
|
|
73
|
+
return {
|
|
74
|
+
proceed: true,
|
|
75
|
+
reason: `user confirmed mismatch (server=${probeResult.serverVersion} daemon=${probeResult.daemonVersion})`,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
return { proceed: false, reason: "user declined" };
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Pull `--yes` / `-y` from an args array and return both the flag and the
|
|
82
|
+
* filtered remainder. Modeled on the existing `--all` filtering style in
|
|
83
|
+
* `cliService` so the help text stays consistent.
|
|
84
|
+
*/
|
|
85
|
+
export function extractAutoYesFlag(args) {
|
|
86
|
+
const autoYes = args.includes("--yes") || args.includes("-y");
|
|
87
|
+
const rest = args.filter((a) => a !== "--yes" && a !== "-y");
|
|
88
|
+
return { autoYes, rest };
|
|
89
|
+
}
|
|
90
|
+
export function readLineFromInput(input) {
|
|
91
|
+
return new Promise((resolve) => {
|
|
92
|
+
let settled = false;
|
|
93
|
+
const settle = (value) => {
|
|
94
|
+
if (settled)
|
|
95
|
+
return;
|
|
96
|
+
settled = true;
|
|
97
|
+
resolve(value);
|
|
98
|
+
};
|
|
99
|
+
const rl = createInterface({ input });
|
|
100
|
+
rl.once("line", (line) => {
|
|
101
|
+
settle(line);
|
|
102
|
+
rl.close();
|
|
103
|
+
});
|
|
104
|
+
rl.once("close", () => settle(null));
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=restart-confirm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart-confirm.js","sourceRoot":"","sources":["../../src/cli/restart-confirm.ts"],"names":[],"mappings":"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"}
|