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,562 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync as realExistsSync, mkdirSync as realMkdirSync, readFileSync as realReadFileSync, rmSync as realRmSync, writeFileSync as realWriteFileSync, } from "node:fs";
|
|
3
|
+
import { homedir, userInfo } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { resolveDaemonPaths } from "../pty/host-daemon/paths.js";
|
|
6
|
+
import { waitForDaemonSocket } from "../pty/host-daemon/socket-ready.js";
|
|
7
|
+
export const SERVER_LABEL = "com.parasor";
|
|
8
|
+
export const DAEMON_LABEL = "com.parasor.pty-host";
|
|
9
|
+
export function renderPlist(p) {
|
|
10
|
+
const envXml = Object.entries(p.env)
|
|
11
|
+
.map(([k, v]) => ` <key>${esc(k)}</key>\n <string>${esc(v)}</string>`)
|
|
12
|
+
.join("\n");
|
|
13
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
14
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
15
|
+
<plist version="1.0">
|
|
16
|
+
<dict>
|
|
17
|
+
<key>Label</key>
|
|
18
|
+
<string>${esc(p.label)}</string>
|
|
19
|
+
<key>ProgramArguments</key>
|
|
20
|
+
<array>
|
|
21
|
+
<string>${esc(p.node)}</string>
|
|
22
|
+
<string>${esc(p.bin)}</string>
|
|
23
|
+
</array>
|
|
24
|
+
<key>RunAtLoad</key>
|
|
25
|
+
<true/>
|
|
26
|
+
<key>KeepAlive</key>
|
|
27
|
+
<dict>
|
|
28
|
+
<key>Crashed</key>
|
|
29
|
+
<true/>
|
|
30
|
+
<key>SuccessfulExit</key>
|
|
31
|
+
<false/>
|
|
32
|
+
</dict>
|
|
33
|
+
<key>StandardOutPath</key>
|
|
34
|
+
<string>${esc(p.stdoutLog)}</string>
|
|
35
|
+
<key>StandardErrorPath</key>
|
|
36
|
+
<string>${esc(p.stderrLog)}</string>
|
|
37
|
+
<key>EnvironmentVariables</key>
|
|
38
|
+
<dict>
|
|
39
|
+
${envXml}
|
|
40
|
+
</dict>
|
|
41
|
+
<key>ProcessType</key>
|
|
42
|
+
<string>${p.background ? "Background" : "Interactive"}</string>
|
|
43
|
+
</dict>
|
|
44
|
+
</plist>
|
|
45
|
+
`;
|
|
46
|
+
}
|
|
47
|
+
function esc(s) {
|
|
48
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
49
|
+
}
|
|
50
|
+
export function createDarwinAdapter(deps) {
|
|
51
|
+
const home = deps.home ?? homedir();
|
|
52
|
+
const configDir = deps.configDir ?? join(home, ".config", "parasor");
|
|
53
|
+
const uid = deps.uid ?? userInfo().uid;
|
|
54
|
+
const execPath = deps.execPath ?? process.execPath;
|
|
55
|
+
const fs = deps.fs ?? {
|
|
56
|
+
mkdirSync: (p, o) => realMkdirSync(p, { recursive: true, ...o }),
|
|
57
|
+
writeFileSync: realWriteFileSync,
|
|
58
|
+
readFileSync: (p) => realReadFileSync(p, "utf8"),
|
|
59
|
+
rmSync: (p, o) => realRmSync(p, { force: true, ...o }),
|
|
60
|
+
existsSync: realExistsSync,
|
|
61
|
+
};
|
|
62
|
+
const spawn = deps.spawn ??
|
|
63
|
+
((cmd, args) => {
|
|
64
|
+
const r = spawnSync(cmd, args, { encoding: "utf8" });
|
|
65
|
+
return {
|
|
66
|
+
status: r.status,
|
|
67
|
+
stdout: r.stdout ?? "",
|
|
68
|
+
stderr: r.stderr ?? "",
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
const log = deps.log ?? ((m) => console.log(m));
|
|
72
|
+
const daemonPaths = resolveDaemonPaths();
|
|
73
|
+
const daemonPidFile = deps.daemonPidFile ?? daemonPaths.pidFile;
|
|
74
|
+
const killProcess = deps.killProcess ??
|
|
75
|
+
((pid, signal) => {
|
|
76
|
+
try {
|
|
77
|
+
process.kill(pid, signal);
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
// R1/R2 -- default to the real poll when no spawn mock is
|
|
85
|
+
// injected (production path). Tests inject both `spawn` and `waitFn`; the
|
|
86
|
+
// `deps.spawn` gate ensures existing tests that supply a mock spawn but omit
|
|
87
|
+
// `waitFn` get a no-op instead of a live 5 s poll against a non-existent socket.
|
|
88
|
+
const waitFn = deps.waitFn ??
|
|
89
|
+
(deps.spawn
|
|
90
|
+
? (_socketPath) => Promise.resolve()
|
|
91
|
+
: waitForDaemonSocket);
|
|
92
|
+
const sleepFn = deps.sleepFn ??
|
|
93
|
+
((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
94
|
+
const nowFn = deps.nowFn ?? (() => Date.now());
|
|
95
|
+
const launchAgentDir = join(home, "Library", "LaunchAgents");
|
|
96
|
+
const serverPlistPath = join(launchAgentDir, `${SERVER_LABEL}.plist`);
|
|
97
|
+
const daemonPlistPath = join(launchAgentDir, `${DAEMON_LABEL}.plist`);
|
|
98
|
+
const serverStdoutLog = join(configDir, "service.log");
|
|
99
|
+
const serverStderrLog = join(configDir, "service.err.log");
|
|
100
|
+
const daemonStdoutLog = join(configDir, "pty-host.out.log");
|
|
101
|
+
const daemonStderrLog = join(configDir, "pty-host.err.log");
|
|
102
|
+
const domain = `gui/${uid}`;
|
|
103
|
+
const serverTarget = `${domain}/${SERVER_LABEL}`;
|
|
104
|
+
const daemonTarget = `${domain}/${DAEMON_LABEL}`;
|
|
105
|
+
function basePathEnv() {
|
|
106
|
+
return [
|
|
107
|
+
"/usr/local/bin",
|
|
108
|
+
"/opt/homebrew/bin",
|
|
109
|
+
"/usr/bin",
|
|
110
|
+
"/bin",
|
|
111
|
+
process.env.PATH ?? "",
|
|
112
|
+
]
|
|
113
|
+
.filter(Boolean)
|
|
114
|
+
.join(":");
|
|
115
|
+
}
|
|
116
|
+
function buildServerPlistBody() {
|
|
117
|
+
/*
|
|
118
|
+
* Service install is the canonical
|
|
119
|
+
* supervisor path, so the server unit is wired for daemon mode by
|
|
120
|
+
* default. PARASOR_PTY_DAEMON=1 makes the server connect to the
|
|
121
|
+
* daemon socket instead of running PTYs in-process;
|
|
122
|
+
* PARASOR_PTY_AUTOSTART=0 stops it from forking a competing daemon
|
|
123
|
+
* because launchd already owns one (com.parasor.pty-host).
|
|
124
|
+
*/
|
|
125
|
+
const env = {
|
|
126
|
+
PATH: basePathEnv(),
|
|
127
|
+
HOME: home,
|
|
128
|
+
PARASOR_PTY_DAEMON: "1",
|
|
129
|
+
PARASOR_PTY_AUTOSTART: "0",
|
|
130
|
+
};
|
|
131
|
+
return renderPlist({
|
|
132
|
+
label: SERVER_LABEL,
|
|
133
|
+
node: execPath,
|
|
134
|
+
bin: deps.binPath,
|
|
135
|
+
stdoutLog: serverStdoutLog,
|
|
136
|
+
stderrLog: serverStderrLog,
|
|
137
|
+
env,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
function writeServerPlist() {
|
|
141
|
+
fs.mkdirSync(launchAgentDir, { recursive: true });
|
|
142
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
143
|
+
fs.writeFileSync(serverPlistPath, buildServerPlistBody());
|
|
144
|
+
}
|
|
145
|
+
function buildDaemonPlistBody() {
|
|
146
|
+
const env = {
|
|
147
|
+
PATH: basePathEnv(),
|
|
148
|
+
HOME: home,
|
|
149
|
+
};
|
|
150
|
+
return renderPlist({
|
|
151
|
+
label: DAEMON_LABEL,
|
|
152
|
+
node: execPath,
|
|
153
|
+
bin: deps.daemonEntryPath,
|
|
154
|
+
stdoutLog: daemonStdoutLog,
|
|
155
|
+
stderrLog: daemonStderrLog,
|
|
156
|
+
env,
|
|
157
|
+
background: true,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
function writeDaemonPlist() {
|
|
161
|
+
fs.mkdirSync(launchAgentDir, { recursive: true });
|
|
162
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
163
|
+
fs.writeFileSync(daemonPlistPath, buildDaemonPlistBody());
|
|
164
|
+
}
|
|
165
|
+
function bootout(plistPath) {
|
|
166
|
+
// Not an error if nothing was previously bootstrapped; swallow non-zero.
|
|
167
|
+
spawn("launchctl", ["bootout", domain, plistPath]);
|
|
168
|
+
}
|
|
169
|
+
function bootstrap(plistPath) {
|
|
170
|
+
return spawn("launchctl", ["bootstrap", domain, plistPath]);
|
|
171
|
+
}
|
|
172
|
+
/*
|
|
173
|
+
* -- `launchctl print <target>` is the canonical way
|
|
174
|
+
* to check whether a unit is currently loaded into the user's launchd
|
|
175
|
+
* domain. Exit 0 = loaded. Non-zero (typically 113 / 3 / "Could not
|
|
176
|
+
* find service") = unloaded. We use this to gate the "plist unchanged
|
|
177
|
+
* -> skip bootstrap" path: if the user has manually `launchctl bootout`-ed
|
|
178
|
+
* the unit (or it never loaded for any reason), skipping bootstrap
|
|
179
|
+
* leaves them with no daemon. The byte-equality check alone is not
|
|
180
|
+
* sufficient -- we need both "content matches" AND "unit loaded".
|
|
181
|
+
*
|
|
182
|
+
* Best-effort: an unexpected non-zero from `launchctl print` is treated
|
|
183
|
+
* as "not loaded" so we bootstrap. The conservative side here is to
|
|
184
|
+
* over-load (idempotent: bootout-then-bootstrap if it was loaded), not
|
|
185
|
+
* under-load (leave the user without a daemon).
|
|
186
|
+
*/
|
|
187
|
+
function isLoaded(target) {
|
|
188
|
+
const r = spawn("launchctl", ["print", target]);
|
|
189
|
+
return r.status === 0;
|
|
190
|
+
}
|
|
191
|
+
function snapshotIfExists(path) {
|
|
192
|
+
if (!fs.existsSync(path))
|
|
193
|
+
return null;
|
|
194
|
+
try {
|
|
195
|
+
return fs.readFileSync(path);
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function restoreSnapshot(path, content) {
|
|
202
|
+
if (content === null) {
|
|
203
|
+
fs.rmSync(path, { force: true });
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
fs.writeFileSync(path, content);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Detects an "unmanaged daemon" -- a live process holding the canonical
|
|
210
|
+
* daemon socket while launchd is not currently running the unit. This is
|
|
211
|
+
* the inconsistency that triggers the server-only-restart guard and the
|
|
212
|
+
* `restart --all` heal path. Independent of whether the plist exists on
|
|
213
|
+
* disk: a user who ran `parasor` manually before installing the service
|
|
214
|
+
* will hit this with no plist at all.
|
|
215
|
+
*/
|
|
216
|
+
function findUnmanagedDaemonPid() {
|
|
217
|
+
const pid = readLiveCanonicalDaemonPid();
|
|
218
|
+
if (pid === null)
|
|
219
|
+
return null;
|
|
220
|
+
if (isPrintRunning(printUnit(daemonTarget)))
|
|
221
|
+
return null;
|
|
222
|
+
return pid;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Stops an unmanaged daemon process so launchd can take over the socket.
|
|
226
|
+
* SIGTERM first (5s grace for clean shutdown of PTY children); SIGKILL
|
|
227
|
+
* as escalation. Throws if the process is still alive after SIGKILL --
|
|
228
|
+
* the caller should abort the heal flow rather than racing launchd
|
|
229
|
+
* against a zombie holding the socket.
|
|
230
|
+
*/
|
|
231
|
+
async function stopUnmanagedDaemon(pid) {
|
|
232
|
+
log(`stopping unmanaged daemon (pid ${pid}) so launchd can take over`);
|
|
233
|
+
const SIGTERM_TIMEOUT_MS = 5000;
|
|
234
|
+
const SIGKILL_TIMEOUT_MS = 2000;
|
|
235
|
+
const POLL_MS = 100;
|
|
236
|
+
killProcess(pid, "SIGTERM");
|
|
237
|
+
const termStart = nowFn();
|
|
238
|
+
while (nowFn() - termStart < SIGTERM_TIMEOUT_MS) {
|
|
239
|
+
if (!killProcess(pid, 0))
|
|
240
|
+
return;
|
|
241
|
+
await sleepFn(POLL_MS);
|
|
242
|
+
}
|
|
243
|
+
log(`SIGTERM timed out after ${SIGTERM_TIMEOUT_MS}ms; sending SIGKILL`);
|
|
244
|
+
killProcess(pid, "SIGKILL");
|
|
245
|
+
const killStart = nowFn();
|
|
246
|
+
while (nowFn() - killStart < SIGKILL_TIMEOUT_MS) {
|
|
247
|
+
if (!killProcess(pid, 0))
|
|
248
|
+
return;
|
|
249
|
+
await sleepFn(POLL_MS);
|
|
250
|
+
}
|
|
251
|
+
throw new Error(`failed to stop unmanaged daemon (pid ${pid}); process still alive after SIGKILL`);
|
|
252
|
+
}
|
|
253
|
+
async function install() {
|
|
254
|
+
/*
|
|
255
|
+
* Stop any unmanaged daemon currently holding the canonical socket
|
|
256
|
+
* BEFORE writing/bootstrapping the plist. `parasor` started manually
|
|
257
|
+
* before service install spawns its own daemon child; if we skip
|
|
258
|
+
* this step launchd's bootstrap would race the existing socket
|
|
259
|
+
* owner and the launchd-managed daemon would crash-loop on
|
|
260
|
+
* EADDRINUSE while `launchctl bootstrap` still returns status 0
|
|
261
|
+
* (install looks successful but the service is broken).
|
|
262
|
+
*
|
|
263
|
+
* install is the explicit "set up canonical state" operation, so
|
|
264
|
+
* stopping a manually-spawned daemon is in-scope -- sacrificing the
|
|
265
|
+
* unmanaged PTY children is acceptable here in exchange for a
|
|
266
|
+
* guaranteed-consistent state at exit. Users who need to preserve
|
|
267
|
+
* a running session should connect first; install is opt-in.
|
|
268
|
+
*/
|
|
269
|
+
const preInstallUnmanagedPid = findUnmanagedDaemonPid();
|
|
270
|
+
if (preInstallUnmanagedPid !== null) {
|
|
271
|
+
log(`stopping unmanaged daemon (pid ${preInstallUnmanagedPid}) so launchd can take over`);
|
|
272
|
+
await stopUnmanagedDaemon(preInstallUnmanagedPid);
|
|
273
|
+
}
|
|
274
|
+
/*
|
|
275
|
+
* Order matters: bootstrap the daemon first so its socket is
|
|
276
|
+
* available when the server starts. If we bootstrapped server
|
|
277
|
+
* first, it would try to connect to a non-existent daemon socket
|
|
278
|
+
* and (per host.ts) error out because PARASOR_PTY_AUTOSTART=0
|
|
279
|
+
* prevents fallback spawning.
|
|
280
|
+
*
|
|
281
|
+
* Idempotent re-install: when the rendered plist is byte-identical
|
|
282
|
+
* to what is already on disk, skip bootout/bootstrap entirely. This
|
|
283
|
+
* preserves a long-lived daemon process (and the PTY children it
|
|
284
|
+
* owns) across `parasor service install` invocations -- npm-update
|
|
285
|
+
* style reinstalls do not lose sessions when the unit content has
|
|
286
|
+
* not changed. When the plist *does* change (binary path, env), we
|
|
287
|
+
* still need a bootout/bootstrap cycle because launchd does not
|
|
288
|
+
* pick up plist changes in place.
|
|
289
|
+
*
|
|
290
|
+
* Backup-and-restore: snapshot prior plist contents before the
|
|
291
|
+
* bootout/overwrite so a failed reinstall reverts to (and
|
|
292
|
+
* re-bootstraps) the user's last working state instead of leaving
|
|
293
|
+
* the user with no daemon at all. Without this, a botched reinstall
|
|
294
|
+
* (typo'd env value, broken binary path) destroys the user's
|
|
295
|
+
* working supervisor and forces manual recovery.
|
|
296
|
+
*/
|
|
297
|
+
const priorDaemonPlist = snapshotIfExists(daemonPlistPath);
|
|
298
|
+
const daemonExisted = priorDaemonPlist !== null;
|
|
299
|
+
const newDaemonPlist = buildDaemonPlistBody();
|
|
300
|
+
const daemonUnchanged = daemonExisted && priorDaemonPlist === newDaemonPlist;
|
|
301
|
+
// byte-equal plist + actually loaded ⇒ safe skip.
|
|
302
|
+
// Plist matches on disk but unit unloaded ⇒ user manually bootouted
|
|
303
|
+
// (or never loaded); we must bootstrap or they end up with no daemon.
|
|
304
|
+
//
|
|
305
|
+
// Exception: when we just stopped an unmanaged daemon above, launchd's
|
|
306
|
+
// unit is likely stuck in KeepAlive backoff (its child was crash-looping
|
|
307
|
+
// on EADDRINUSE while the unmanaged process held the socket). The
|
|
308
|
+
// "skipped reload" path would leave it stuck even though the socket is
|
|
309
|
+
// now free -- kickstart -k forces an immediate restart attempt.
|
|
310
|
+
if (daemonUnchanged &&
|
|
311
|
+
isLoaded(daemonTarget) &&
|
|
312
|
+
preInstallUnmanagedPid === null) {
|
|
313
|
+
log(`unchanged: ${daemonPlistPath} (skipped reload)`);
|
|
314
|
+
}
|
|
315
|
+
else if (daemonUnchanged && isLoaded(daemonTarget)) {
|
|
316
|
+
log(`unchanged: ${daemonPlistPath} (kickstarting after unmanaged stop)`);
|
|
317
|
+
const kr = spawn("launchctl", ["kickstart", "-k", daemonTarget]);
|
|
318
|
+
if (kr.status !== 0) {
|
|
319
|
+
throw new Error(`launchctl kickstart (pty-host) failed (${kr.status}): ${kr.stderr || kr.stdout}`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
else if (daemonUnchanged) {
|
|
323
|
+
log(`unchanged: ${daemonPlistPath} (loading -- unit was not loaded)`);
|
|
324
|
+
const dr = bootstrap(daemonPlistPath);
|
|
325
|
+
if (dr.status !== 0) {
|
|
326
|
+
throw new Error(`launchctl bootstrap (pty-host) failed (${dr.status}): ${dr.stderr || dr.stdout}`);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
if (daemonExisted)
|
|
331
|
+
bootout(daemonPlistPath);
|
|
332
|
+
writeDaemonPlist();
|
|
333
|
+
const dr = bootstrap(daemonPlistPath);
|
|
334
|
+
if (dr.status !== 0) {
|
|
335
|
+
// Restore the prior plist (or remove it if there was none) and
|
|
336
|
+
// re-bootstrap so the user's previous working daemon is brought
|
|
337
|
+
// back up. Best-effort: a failed recovery surfaces both errors.
|
|
338
|
+
restoreSnapshot(daemonPlistPath, priorDaemonPlist);
|
|
339
|
+
let recoverNote = "removed freshly-written plist";
|
|
340
|
+
if (daemonExisted) {
|
|
341
|
+
const recover = bootstrap(daemonPlistPath);
|
|
342
|
+
recoverNote =
|
|
343
|
+
recover.status === 0
|
|
344
|
+
? "rolled back to prior daemon plist"
|
|
345
|
+
: `rollback bootstrap also failed (${recover.status}): ${recover.stderr || recover.stdout}`;
|
|
346
|
+
}
|
|
347
|
+
throw new Error(`launchctl bootstrap (pty-host) failed (${dr.status}): ${dr.stderr || dr.stdout} (${recoverNote})`);
|
|
348
|
+
}
|
|
349
|
+
log(`installed: ${daemonPlistPath}`);
|
|
350
|
+
}
|
|
351
|
+
log(`daemon logs: ${daemonStdoutLog}`);
|
|
352
|
+
// R1 -- wait for the daemon socket to become ready
|
|
353
|
+
// before starting the server. The server requires the daemon socket
|
|
354
|
+
// immediately (PARASOR_PTY_AUTOSTART=0, so no fallback spawn).
|
|
355
|
+
await waitFn(daemonPaths.socketPath);
|
|
356
|
+
const priorServerPlist = snapshotIfExists(serverPlistPath);
|
|
357
|
+
const serverExisted = priorServerPlist !== null;
|
|
358
|
+
const newServerPlist = buildServerPlistBody();
|
|
359
|
+
const serverUnchanged = serverExisted && priorServerPlist === newServerPlist;
|
|
360
|
+
if (serverUnchanged && isLoaded(serverTarget)) {
|
|
361
|
+
log(`unchanged: ${serverPlistPath} (skipped reload)`);
|
|
362
|
+
log(`server logs: ${serverStdoutLog}`);
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
if (serverUnchanged) {
|
|
366
|
+
log(`unchanged: ${serverPlistPath} (loading -- unit was not loaded)`);
|
|
367
|
+
const r = bootstrap(serverPlistPath);
|
|
368
|
+
if (r.status !== 0) {
|
|
369
|
+
throw new Error(`launchctl bootstrap (server) failed (${r.status}): ${r.stderr || r.stdout}`);
|
|
370
|
+
}
|
|
371
|
+
log(`server logs: ${serverStdoutLog}`);
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
if (serverExisted)
|
|
375
|
+
bootout(serverPlistPath);
|
|
376
|
+
writeServerPlist();
|
|
377
|
+
const r = bootstrap(serverPlistPath);
|
|
378
|
+
if (r.status !== 0) {
|
|
379
|
+
// Server bootstrap failed -- restore the server plist (or remove
|
|
380
|
+
// it). Daemon is restored to its prior installed state: if it
|
|
381
|
+
// pre-existed we keep the freshly-bootstrapped one running (it
|
|
382
|
+
// matches the new config and the user already had one), but if
|
|
383
|
+
// it was freshly installed in this call we tear it down so the
|
|
384
|
+
// user is not left with a half-installed pair they did not have
|
|
385
|
+
// before.
|
|
386
|
+
restoreSnapshot(serverPlistPath, priorServerPlist);
|
|
387
|
+
let serverRecover = "removed freshly-written plist";
|
|
388
|
+
if (serverExisted) {
|
|
389
|
+
const recover = bootstrap(serverPlistPath);
|
|
390
|
+
serverRecover =
|
|
391
|
+
recover.status === 0
|
|
392
|
+
? "rolled back to prior server plist"
|
|
393
|
+
: `rollback bootstrap also failed (${recover.status}): ${recover.stderr || recover.stdout}`;
|
|
394
|
+
}
|
|
395
|
+
let daemonNote = "daemon left in prior installed state";
|
|
396
|
+
if (!daemonExisted) {
|
|
397
|
+
bootout(daemonPlistPath);
|
|
398
|
+
fs.rmSync(daemonPlistPath, { force: true });
|
|
399
|
+
daemonNote = "rolled back daemon unit; nothing remains installed";
|
|
400
|
+
}
|
|
401
|
+
throw new Error(`launchctl bootstrap (server) failed (${r.status}): ${r.stderr || r.stdout}. ` +
|
|
402
|
+
`${serverRecover}; ${daemonNote}.`);
|
|
403
|
+
}
|
|
404
|
+
log(`installed: ${serverPlistPath}`);
|
|
405
|
+
log(`server logs: ${serverStdoutLog}`);
|
|
406
|
+
}
|
|
407
|
+
async function uninstall() {
|
|
408
|
+
let removed = false;
|
|
409
|
+
// Remove server first so it cannot reconnect to a daemon we are
|
|
410
|
+
// about to kill (which would surface as a UI "PTY host disconnected"
|
|
411
|
+
// banner during uninstall).
|
|
412
|
+
if (fs.existsSync(serverPlistPath)) {
|
|
413
|
+
bootout(serverPlistPath);
|
|
414
|
+
fs.rmSync(serverPlistPath, { force: true });
|
|
415
|
+
log(`uninstalled: ${serverPlistPath}`);
|
|
416
|
+
removed = true;
|
|
417
|
+
}
|
|
418
|
+
if (fs.existsSync(daemonPlistPath)) {
|
|
419
|
+
bootout(daemonPlistPath);
|
|
420
|
+
fs.rmSync(daemonPlistPath, { force: true });
|
|
421
|
+
log(`uninstalled: ${daemonPlistPath}`);
|
|
422
|
+
removed = true;
|
|
423
|
+
}
|
|
424
|
+
if (!removed)
|
|
425
|
+
log("not installed; nothing to do");
|
|
426
|
+
}
|
|
427
|
+
function reportUnit(label, plistPath, target) {
|
|
428
|
+
const installed = fs.existsSync(plistPath);
|
|
429
|
+
if (!installed) {
|
|
430
|
+
log(`${label}: not installed`);
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
const r = printUnit(target);
|
|
434
|
+
const running = isPrintRunning(r);
|
|
435
|
+
const pidMatch = /pid = (\d+)/.exec(r.stdout);
|
|
436
|
+
log(`${label}: installed`);
|
|
437
|
+
log(` running: ${running ? "yes" : "no"}`);
|
|
438
|
+
if (pidMatch)
|
|
439
|
+
log(` pid: ${pidMatch[1]}`);
|
|
440
|
+
log(` plist: ${plistPath}`);
|
|
441
|
+
}
|
|
442
|
+
async function status() {
|
|
443
|
+
reportUnit("pty-host", daemonPlistPath, daemonTarget);
|
|
444
|
+
log(`daemon logs: ${daemonStdoutLog}`);
|
|
445
|
+
reportUnit("server", serverPlistPath, serverTarget);
|
|
446
|
+
log(`server logs: ${serverStdoutLog}`);
|
|
447
|
+
}
|
|
448
|
+
function printUnit(target) {
|
|
449
|
+
return spawn("launchctl", ["print", target]);
|
|
450
|
+
}
|
|
451
|
+
function isPrintRunning(r) {
|
|
452
|
+
return r.status === 0 && /state = running/.test(r.stdout);
|
|
453
|
+
}
|
|
454
|
+
function readLiveCanonicalDaemonPid() {
|
|
455
|
+
if (!fs.existsSync(daemonPidFile))
|
|
456
|
+
return null;
|
|
457
|
+
let raw;
|
|
458
|
+
try {
|
|
459
|
+
raw = fs.readFileSync(daemonPidFile).trim();
|
|
460
|
+
}
|
|
461
|
+
catch {
|
|
462
|
+
return null;
|
|
463
|
+
}
|
|
464
|
+
const pid = Number(raw);
|
|
465
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
466
|
+
return null;
|
|
467
|
+
return killProcess(pid, 0) ? pid : null;
|
|
468
|
+
}
|
|
469
|
+
function assertDaemonUnitConsistentForServerOnlyRestart() {
|
|
470
|
+
if (!fs.existsSync(daemonPlistPath))
|
|
471
|
+
return;
|
|
472
|
+
if (isPrintRunning(printUnit(daemonTarget)))
|
|
473
|
+
return;
|
|
474
|
+
const pid = readLiveCanonicalDaemonPid();
|
|
475
|
+
if (pid === null)
|
|
476
|
+
return;
|
|
477
|
+
throw new Error(`refusing server-only restart: ${DAEMON_LABEL} is installed but not running under launchd, ` +
|
|
478
|
+
`while the canonical daemon socket is owned by pid ${pid}. ` +
|
|
479
|
+
"This usually happens when `parasor` was started manually before installing the service, " +
|
|
480
|
+
"leaving an unmanaged daemon that launchd cannot supervise. " +
|
|
481
|
+
"Restarting only the server can leave launchd racing the existing daemon and may drop active PTYs. " +
|
|
482
|
+
"Run `parasor service restart --all` when you are ready to restart PTY sessions " +
|
|
483
|
+
"(this stops the unmanaged daemon and hands control to launchd), " +
|
|
484
|
+
"or stop the unmanaged daemon manually and reinstall the service.");
|
|
485
|
+
}
|
|
486
|
+
async function restart(opts) {
|
|
487
|
+
let kicked = false;
|
|
488
|
+
// Daemon kick is opt-in . says PTY lifetime
|
|
489
|
+
// is decoupled from server lifetime so live sessions survive a
|
|
490
|
+
// server restart. Kicking the daemon terminates every PTY, so it
|
|
491
|
+
// is reserved for `--all` (binary upgrade scenarios where the
|
|
492
|
+
// daemon code itself changed). Order: daemon first when both --
|
|
493
|
+
// if the server kicks before the daemon is back up and
|
|
494
|
+
// PARASOR_PTY_AUTOSTART=0 (it is), the server fails to connect
|
|
495
|
+
// and crash-loops until launchd brings the daemon back.
|
|
496
|
+
if (!opts.all) {
|
|
497
|
+
assertDaemonUnitConsistentForServerOnlyRestart();
|
|
498
|
+
}
|
|
499
|
+
if (opts.all && fs.existsSync(daemonPlistPath)) {
|
|
500
|
+
/*
|
|
501
|
+
* Heal an unmanaged-daemon inconsistency before kickstart.
|
|
502
|
+
* `launchctl kickstart -k` only signals launchd-managed processes --
|
|
503
|
+
* a daemon that was spawned manually (e.g. `parasor` run before
|
|
504
|
+
* service install) survives kickstart and continues to hold the
|
|
505
|
+
* canonical socket, leaving the launchd-managed replacement unable
|
|
506
|
+
* to bind. The `--all` contract is "PTYs may be sacrificed to
|
|
507
|
+
* restore a consistent state", so stop the unmanaged process here.
|
|
508
|
+
*/
|
|
509
|
+
const unmanagedPid = findUnmanagedDaemonPid();
|
|
510
|
+
if (unmanagedPid !== null) {
|
|
511
|
+
await stopUnmanagedDaemon(unmanagedPid);
|
|
512
|
+
}
|
|
513
|
+
/*
|
|
514
|
+
* If launchd has the unit loaded, kickstart works. If it does not
|
|
515
|
+
* (manual `launchctl bootout`, never loaded, or load aborted after
|
|
516
|
+
* a bind failure), kickstart fails -- `bootstrap` is the right verb.
|
|
517
|
+
*/
|
|
518
|
+
if (isLoaded(daemonTarget)) {
|
|
519
|
+
const r = spawn("launchctl", ["kickstart", "-k", daemonTarget]);
|
|
520
|
+
if (r.status !== 0) {
|
|
521
|
+
throw new Error(`launchctl kickstart (pty-host) failed (${r.status}): ${r.stderr || r.stdout}`);
|
|
522
|
+
}
|
|
523
|
+
log(`restarted: ${daemonTarget}`);
|
|
524
|
+
}
|
|
525
|
+
else {
|
|
526
|
+
const br = bootstrap(daemonPlistPath);
|
|
527
|
+
if (br.status !== 0) {
|
|
528
|
+
throw new Error(`launchctl bootstrap (pty-host) failed (${br.status}): ${br.stderr || br.stdout}`);
|
|
529
|
+
}
|
|
530
|
+
log(`restarted: ${daemonTarget} (bootstrapped -- was not loaded)`);
|
|
531
|
+
}
|
|
532
|
+
kicked = true;
|
|
533
|
+
// R2 -- wait for the daemon socket to become ready
|
|
534
|
+
// before kicking the server. Without this the server connects before
|
|
535
|
+
// the daemon socket is bound and crash-loops with ECONNREFUSED.
|
|
536
|
+
await waitFn(daemonPaths.socketPath);
|
|
537
|
+
}
|
|
538
|
+
if (fs.existsSync(serverPlistPath)) {
|
|
539
|
+
const r = spawn("launchctl", ["kickstart", "-k", serverTarget]);
|
|
540
|
+
if (r.status !== 0) {
|
|
541
|
+
throw new Error(`launchctl kickstart (server) failed (${r.status}): ${r.stderr || r.stdout}`);
|
|
542
|
+
}
|
|
543
|
+
log(`restarted: ${serverTarget}`);
|
|
544
|
+
kicked = true;
|
|
545
|
+
}
|
|
546
|
+
if (!kicked)
|
|
547
|
+
log("nothing installed; nothing to restart");
|
|
548
|
+
}
|
|
549
|
+
async function logs(opts) {
|
|
550
|
+
const cmd = opts.follow
|
|
551
|
+
? ["tail", "-f", serverStdoutLog]
|
|
552
|
+
: ["cat", serverStdoutLog];
|
|
553
|
+
const [command, ...args] = cmd;
|
|
554
|
+
const r = spawn(command, args);
|
|
555
|
+
if (r.stdout)
|
|
556
|
+
process.stdout.write(r.stdout);
|
|
557
|
+
if (r.stderr)
|
|
558
|
+
process.stderr.write(r.stderr);
|
|
559
|
+
}
|
|
560
|
+
return { install, uninstall, status, restart, logs };
|
|
561
|
+
}
|
|
562
|
+
//# sourceMappingURL=service-darwin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-darwin.js","sourceRoot":"","sources":["../../src/cli/service-darwin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { ServiceAdapter } from "./service.js";
|
|
2
|
+
export declare const SERVER_UNIT = "parasor.service";
|
|
3
|
+
export declare const DAEMON_UNIT = "parasor-pty-host.service";
|
|
4
|
+
export interface UnitParams {
|
|
5
|
+
description: string;
|
|
6
|
+
node: string;
|
|
7
|
+
bin: string;
|
|
8
|
+
stdoutLog: string;
|
|
9
|
+
stderrLog: string;
|
|
10
|
+
env: Record<string, string>;
|
|
11
|
+
/**
|
|
12
|
+
* After= target. Server unit uses network.target (it binds a TCP
|
|
13
|
+
* listener); daemon unit uses default.target (it only needs the user
|
|
14
|
+
* session to exist -- no network dependency).
|
|
15
|
+
*/
|
|
16
|
+
after?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Server unit uses Type=notify (sd_notify ready signal). The daemon
|
|
19
|
+
* does not implement sd_notify; readiness is observable via its unix
|
|
20
|
+
* socket. Use Type=simple for the daemon and skip the watchdog.
|
|
21
|
+
*/
|
|
22
|
+
notify?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* -- daemon escalation requires KillMode=mixed
|
|
25
|
+
* so SIGKILL reaches the process group, not just the parent. Server
|
|
26
|
+
* unit defaults to Restart=on-failure; daemon uses Restart=always
|
|
27
|
+
* because crashes there should always trigger immediate respawn (the
|
|
28
|
+
* release requirementaxis is "continuous availability", continuous availability).
|
|
29
|
+
*/
|
|
30
|
+
restartOnAlways?: boolean;
|
|
31
|
+
killModeMixed?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Disable systemd's start-rate limiter for the daemon. With Restart=always
|
|
34
|
+
* and a fast crash loop, the default 5-restarts-per-10s threshold causes
|
|
35
|
+
* the unit to enter `failed` and stop respawning -- exactly the wedge state
|
|
36
|
+
* that breaks "continuous availability". Server keeps default limits.
|
|
37
|
+
*/
|
|
38
|
+
unlimitedStartRate?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Exit codes that must NOT trigger systemd respawn even under Restart=always.
|
|
41
|
+
* The daemon entry exits with code 2 on DaemonAlreadyRunningError (a guard
|
|
42
|
+
* fired when another instance already holds the lockfile). With
|
|
43
|
+
* Restart=always + StartLimitBurst=0 + this guard, systemd would otherwise
|
|
44
|
+
* loop forever spawning a process that immediately self-aborts.
|
|
45
|
+
*/
|
|
46
|
+
restartPreventExitStatus?: number[];
|
|
47
|
+
}
|
|
48
|
+
export declare function renderUnit(p: UnitParams): string;
|
|
49
|
+
export interface LinuxAdapterDeps {
|
|
50
|
+
binPath: string;
|
|
51
|
+
daemonEntryPath: string;
|
|
52
|
+
home?: string;
|
|
53
|
+
configDir?: string;
|
|
54
|
+
execPath?: string;
|
|
55
|
+
fs?: {
|
|
56
|
+
mkdirSync: (p: string, opts?: {
|
|
57
|
+
recursive: boolean;
|
|
58
|
+
}) => void;
|
|
59
|
+
writeFileSync: (p: string, content: string) => void;
|
|
60
|
+
readFileSync: (p: string) => string;
|
|
61
|
+
rmSync: (p: string, opts?: {
|
|
62
|
+
force?: boolean;
|
|
63
|
+
}) => void;
|
|
64
|
+
existsSync: (p: string) => boolean;
|
|
65
|
+
};
|
|
66
|
+
spawn?: (cmd: string, args: string[]) => {
|
|
67
|
+
status: number | null;
|
|
68
|
+
stdout: string;
|
|
69
|
+
stderr: string;
|
|
70
|
+
};
|
|
71
|
+
log?: (msg: string) => void;
|
|
72
|
+
/**
|
|
73
|
+
* R1/R2 -- test injection seam for the daemon
|
|
74
|
+
* socket-ready poll. Production leaves this unset (uses the real
|
|
75
|
+
* `waitForDaemonSocket`). Tests inject a mock to drive
|
|
76
|
+
* timeout-error and immediate-ready branches without real sockets.
|
|
77
|
+
*/
|
|
78
|
+
waitFn?: (socketPath: string) => Promise<void>;
|
|
79
|
+
}
|
|
80
|
+
export declare function createLinuxAdapter(deps: LinuxAdapterDeps): ServiceAdapter;
|
|
81
|
+
//# sourceMappingURL=service-linux.d.ts.map
|