tmux-ide 2.1.4 → 2.6.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/README.md +115 -101
- package/bin/cli.js +13678 -4
- package/bin/cli.ts +1143 -260
- package/package.json +27 -17
- package/packages/daemon/dist/__tests__/support.d.ts +7 -0
- package/packages/daemon/dist/__tests__/support.js +33 -0
- package/packages/daemon/dist/agent-explain.d.ts +45 -0
- package/packages/daemon/dist/agent-explain.js +210 -0
- package/packages/daemon/dist/attach.d.ts +3 -0
- package/packages/daemon/dist/attach.js +14 -0
- package/packages/daemon/dist/bin.d.ts +2 -0
- package/packages/daemon/dist/bin.js +3 -0
- package/packages/daemon/dist/canonical.d.ts +2 -0
- package/packages/daemon/dist/canonical.js +1 -0
- package/packages/daemon/dist/cli.d.ts +1 -0
- package/packages/daemon/dist/cli.js +425 -0
- package/packages/daemon/dist/command-center/actions/contract.d.ts +1 -0
- package/packages/daemon/dist/command-center/actions/contract.js +2 -0
- package/packages/daemon/dist/command-center/actions/dispatcher.d.ts +27 -0
- package/packages/daemon/dist/command-center/actions/dispatcher.js +109 -0
- package/packages/daemon/dist/command-center/actions/errors.d.ts +38 -0
- package/packages/daemon/dist/command-center/actions/errors.js +56 -0
- package/packages/daemon/dist/command-center/actions/handlers/_project-context.d.ts +12 -0
- package/packages/daemon/dist/command-center/actions/handlers/_project-context.js +12 -0
- package/packages/daemon/dist/command-center/actions/handlers/_resolve-project.d.ts +42 -0
- package/packages/daemon/dist/command-center/actions/handlers/_resolve-project.js +48 -0
- package/packages/daemon/dist/command-center/actions/handlers/app-set-remote-access.d.ts +23 -0
- package/packages/daemon/dist/command-center/actions/handlers/app-set-remote-access.js +67 -0
- package/packages/daemon/dist/command-center/actions/handlers/config-actions.d.ts +12 -0
- package/packages/daemon/dist/command-center/actions/handlers/config-actions.js +69 -0
- package/packages/daemon/dist/command-center/actions/handlers/daemon-shutdown.d.ts +6 -0
- package/packages/daemon/dist/command-center/actions/handlers/daemon-shutdown.js +24 -0
- package/packages/daemon/dist/command-center/actions/handlers/project-activate.d.ts +7 -0
- package/packages/daemon/dist/command-center/actions/handlers/project-activate.js +19 -0
- package/packages/daemon/dist/command-center/actions/handlers/project-launch.d.ts +18 -0
- package/packages/daemon/dist/command-center/actions/handlers/project-launch.js +58 -0
- package/packages/daemon/dist/command-center/actions/handlers/project-open-terminal.d.ts +32 -0
- package/packages/daemon/dist/command-center/actions/handlers/project-open-terminal.js +69 -0
- package/packages/daemon/dist/command-center/actions/handlers/project-restart.d.ts +17 -0
- package/packages/daemon/dist/command-center/actions/handlers/project-restart.js +27 -0
- package/packages/daemon/dist/command-center/actions/handlers/project-stop.d.ts +24 -0
- package/packages/daemon/dist/command-center/actions/handlers/project-stop.js +38 -0
- package/packages/daemon/dist/command-center/actions/handlers/terminal-respawn.d.ts +24 -0
- package/packages/daemon/dist/command-center/actions/handlers/terminal-respawn.js +88 -0
- package/packages/daemon/dist/command-center/actions/handlers/terminal-stop.d.ts +14 -0
- package/packages/daemon/dist/command-center/actions/handlers/terminal-stop.js +22 -0
- package/packages/daemon/dist/command-center/actions/registry.d.ts +35 -0
- package/packages/daemon/dist/command-center/actions/registry.js +109 -0
- package/packages/daemon/dist/command-center/discovery.d.ts +23 -0
- package/packages/daemon/dist/command-center/discovery.js +67 -0
- package/packages/daemon/dist/command-center/index.d.ts +10 -0
- package/packages/daemon/dist/command-center/index.js +21 -0
- package/packages/daemon/dist/command-center/schemas.d.ts +76 -0
- package/packages/daemon/dist/command-center/schemas.js +68 -0
- package/packages/daemon/dist/command-center/server.d.ts +26 -0
- package/packages/daemon/dist/command-center/server.js +1103 -0
- package/packages/daemon/dist/command-center/ws-events.d.ts +59 -0
- package/packages/daemon/dist/command-center/ws-events.js +277 -0
- package/packages/daemon/dist/config.d.ts +19 -0
- package/packages/daemon/dist/config.js +494 -0
- package/packages/daemon/dist/detect.d.ts +15 -0
- package/packages/daemon/dist/detect.js +228 -0
- package/packages/daemon/dist/doctor.d.ts +21 -0
- package/packages/daemon/dist/doctor.js +154 -0
- package/packages/daemon/dist/embed.d.ts +1 -0
- package/packages/daemon/dist/embed.js +1 -0
- package/packages/daemon/dist/index.d.ts +3 -0
- package/packages/daemon/dist/index.js +2 -0
- package/packages/daemon/dist/init.d.ts +4 -0
- package/packages/daemon/dist/init.js +174 -0
- package/packages/daemon/dist/inspect.d.ts +54 -0
- package/packages/daemon/dist/inspect.js +118 -0
- package/packages/daemon/dist/launch.d.ts +23 -0
- package/packages/daemon/dist/launch.js +250 -0
- package/packages/daemon/dist/lib/active-projects.d.ts +12 -0
- package/packages/daemon/dist/lib/active-projects.js +35 -0
- package/packages/daemon/dist/lib/agent-discovery.d.ts +43 -0
- package/packages/daemon/dist/lib/agent-discovery.js +85 -0
- package/packages/daemon/dist/lib/app-config.d.ts +147 -0
- package/packages/daemon/dist/lib/app-config.js +191 -0
- package/packages/daemon/dist/lib/app-settings.d.ts +9 -0
- package/packages/daemon/dist/lib/app-settings.js +44 -0
- package/packages/daemon/dist/lib/auth/auth-service.d.ts +33 -0
- package/packages/daemon/dist/lib/auth/auth-service.js +172 -0
- package/packages/daemon/dist/lib/auth/middleware.d.ts +16 -0
- package/packages/daemon/dist/lib/auth/middleware.js +43 -0
- package/packages/daemon/dist/lib/auth/types.d.ts +1 -0
- package/packages/daemon/dist/lib/auth/types.js +2 -0
- package/packages/daemon/dist/lib/auth-token.d.ts +1 -0
- package/packages/daemon/dist/lib/auth-token.js +4 -0
- package/packages/daemon/dist/lib/authorship.d.ts +62 -0
- package/packages/daemon/dist/lib/authorship.js +209 -0
- package/packages/daemon/dist/lib/canonical-daemon.d.ts +21 -0
- package/packages/daemon/dist/lib/canonical-daemon.js +111 -0
- package/packages/daemon/dist/lib/cli-action-bridge.d.ts +27 -0
- package/packages/daemon/dist/lib/cli-action-bridge.js +161 -0
- package/packages/daemon/dist/lib/daemon-embed.d.ts +31 -0
- package/packages/daemon/dist/lib/daemon-embed.js +643 -0
- package/packages/daemon/dist/lib/daemon-watchdog.d.ts +16 -0
- package/packages/daemon/dist/lib/daemon-watchdog.js +98 -0
- package/packages/daemon/dist/lib/daemon.d.ts +8 -0
- package/packages/daemon/dist/lib/daemon.js +79 -0
- package/packages/daemon/dist/lib/dot-path.d.ts +2 -0
- package/packages/daemon/dist/lib/dot-path.js +17 -0
- package/packages/daemon/dist/lib/errors.d.ts +37 -0
- package/packages/daemon/dist/lib/errors.js +50 -0
- package/packages/daemon/dist/lib/filesystem-browser.d.ts +85 -0
- package/packages/daemon/dist/lib/filesystem-browser.js +257 -0
- package/packages/daemon/dist/lib/launch-plan.d.ts +6 -0
- package/packages/daemon/dist/lib/launch-plan.js +76 -0
- package/packages/daemon/dist/lib/log.d.ts +40 -0
- package/packages/daemon/dist/lib/log.js +86 -0
- package/packages/daemon/dist/lib/output.d.ts +9 -0
- package/packages/daemon/dist/lib/output.js +65 -0
- package/packages/daemon/dist/lib/project-init-runner.d.ts +46 -0
- package/packages/daemon/dist/lib/project-init-runner.js +117 -0
- package/packages/daemon/dist/lib/project-inspect.d.ts +28 -0
- package/packages/daemon/dist/lib/project-inspect.js +67 -0
- package/packages/daemon/dist/lib/project-onboard.d.ts +58 -0
- package/packages/daemon/dist/lib/project-onboard.js +108 -0
- package/packages/daemon/dist/lib/project-probe.d.ts +35 -0
- package/packages/daemon/dist/lib/project-probe.js +61 -0
- package/packages/daemon/dist/lib/project-registry.d.ts +76 -0
- package/packages/daemon/dist/lib/project-registry.js +230 -0
- package/packages/daemon/dist/lib/session-monitor.d.ts +15 -0
- package/packages/daemon/dist/lib/session-monitor.js +103 -0
- package/packages/daemon/dist/lib/session-options.d.ts +13 -0
- package/packages/daemon/dist/lib/session-options.js +85 -0
- package/packages/daemon/dist/lib/shell.d.ts +5 -0
- package/{src/lib/shell.ts → packages/daemon/dist/lib/shell.js} +3 -3
- package/packages/daemon/dist/lib/sizes.d.ts +16 -0
- package/packages/daemon/dist/lib/sizes.js +36 -0
- package/packages/daemon/dist/lib/skill-sync.d.ts +60 -0
- package/packages/daemon/dist/lib/skill-sync.js +128 -0
- package/packages/daemon/dist/lib/slugify.d.ts +4 -0
- package/packages/daemon/dist/lib/slugify.js +10 -0
- package/packages/daemon/dist/lib/terminals-store.d.ts +27 -0
- package/packages/daemon/dist/lib/terminals-store.js +111 -0
- package/packages/daemon/dist/lib/update-check.d.ts +118 -0
- package/packages/daemon/dist/lib/update-check.js +261 -0
- package/packages/daemon/dist/lib/update.d.ts +65 -0
- package/packages/daemon/dist/lib/update.js +141 -0
- package/packages/daemon/dist/lib/workspace-registry.d.ts +84 -0
- package/packages/daemon/dist/lib/workspace-registry.js +176 -0
- package/packages/daemon/dist/lib/worktree.d.ts +76 -0
- package/packages/daemon/dist/lib/worktree.js +207 -0
- package/packages/daemon/dist/lib/yaml-io.d.ts +10 -0
- package/packages/daemon/dist/lib/yaml-io.js +24 -0
- package/packages/daemon/dist/ls.d.ts +3 -0
- package/packages/daemon/dist/ls.js +35 -0
- package/packages/daemon/dist/restart.d.ts +4 -0
- package/packages/daemon/dist/restart.js +16 -0
- package/packages/daemon/dist/restore.d.ts +86 -0
- package/packages/daemon/dist/restore.js +406 -0
- package/packages/daemon/dist/schemas/domain.d.ts +1 -0
- package/packages/daemon/dist/schemas/domain.js +2 -0
- package/packages/daemon/dist/schemas/filesystem.d.ts +29 -0
- package/packages/daemon/dist/schemas/filesystem.js +29 -0
- package/packages/daemon/dist/schemas/ide-config.d.ts +1 -0
- package/packages/daemon/dist/schemas/ide-config.js +2 -0
- package/packages/daemon/dist/schemas/index.d.ts +12 -0
- package/packages/daemon/dist/schemas/index.js +6 -0
- package/packages/daemon/dist/schemas/inspect.d.ts +53 -0
- package/packages/daemon/dist/schemas/inspect.js +57 -0
- package/packages/daemon/dist/schemas/registry.d.ts +35 -0
- package/packages/daemon/dist/schemas/registry.js +43 -0
- package/packages/daemon/dist/schemas/ws-events.d.ts +72 -0
- package/packages/daemon/dist/schemas/ws-events.js +110 -0
- package/packages/daemon/dist/send.d.ts +27 -0
- package/packages/daemon/dist/send.js +141 -0
- package/packages/daemon/dist/server/index.d.ts +10 -0
- package/packages/daemon/dist/server/index.js +55 -0
- package/packages/daemon/dist/server/pty-bridge.d.ts +174 -0
- package/packages/daemon/dist/server/pty-bridge.js +422 -0
- package/packages/daemon/dist/server/standalone.d.ts +1 -0
- package/packages/daemon/dist/server/standalone.js +14 -0
- package/packages/daemon/dist/server/ws-route.d.ts +74 -0
- package/packages/daemon/dist/server/ws-route.js +379 -0
- package/packages/daemon/dist/status.d.ts +3 -0
- package/packages/daemon/dist/status.js +46 -0
- package/packages/daemon/dist/stop.d.ts +3 -0
- package/packages/daemon/dist/stop.js +21 -0
- package/packages/daemon/dist/terminal/NodePtyAdapter.d.ts +44 -0
- package/packages/daemon/dist/terminal/NodePtyAdapter.js +253 -0
- package/packages/daemon/dist/terminal/PtyAdapter.d.ts +124 -0
- package/packages/daemon/dist/terminal/PtyAdapter.js +43 -0
- package/packages/daemon/dist/terminal/__tests__/MockPtyAdapter.d.ts +77 -0
- package/packages/daemon/dist/terminal/__tests__/MockPtyAdapter.js +155 -0
- package/packages/daemon/dist/types.d.ts +2 -0
- package/packages/daemon/dist/types.js +1 -0
- package/packages/daemon/dist/validate.d.ts +4 -0
- package/packages/daemon/dist/validate.js +184 -0
- package/packages/daemon/dist/widgets/changes/index.d.ts +1 -0
- package/packages/daemon/dist/widgets/changes/index.jsx +575 -0
- package/packages/daemon/dist/widgets/config/index.d.ts +1 -0
- package/packages/daemon/dist/widgets/config/index.jsx +395 -0
- package/packages/daemon/dist/widgets/explorer/breadcrumbs.d.ts +10 -0
- package/packages/daemon/dist/widgets/explorer/breadcrumbs.jsx +51 -0
- package/packages/daemon/dist/widgets/explorer/footer.d.ts +6 -0
- package/packages/daemon/dist/widgets/explorer/footer.jsx +11 -0
- package/packages/daemon/dist/widgets/explorer/index.d.ts +1 -0
- package/packages/daemon/dist/widgets/explorer/index.jsx +393 -0
- package/packages/daemon/dist/widgets/explorer/tree-model.d.ts +13 -0
- package/packages/daemon/dist/widgets/explorer/tree-model.js +69 -0
- package/packages/daemon/dist/widgets/explorer/tree.d.ts +13 -0
- package/packages/daemon/dist/widgets/explorer/tree.jsx +108 -0
- package/packages/daemon/dist/widgets/lib/config-model.d.ts +22 -0
- package/packages/daemon/dist/widgets/lib/config-model.js +99 -0
- package/packages/daemon/dist/widgets/lib/files.d.ts +11 -0
- package/packages/daemon/dist/widgets/lib/files.js +76 -0
- package/packages/daemon/dist/widgets/lib/git.d.ts +11 -0
- package/packages/daemon/dist/widgets/lib/git.js +70 -0
- package/packages/daemon/dist/widgets/lib/grammar.d.ts +79 -0
- package/packages/daemon/dist/widgets/lib/grammar.js +95 -0
- package/packages/daemon/dist/widgets/lib/help-overlay.d.ts +19 -0
- package/packages/daemon/dist/widgets/lib/help-overlay.jsx +69 -0
- package/packages/daemon/dist/widgets/lib/pane-comms.d.ts +28 -0
- package/packages/daemon/dist/widgets/lib/pane-comms.js +189 -0
- package/packages/daemon/dist/widgets/lib/theme.d.ts +44 -0
- package/packages/daemon/dist/widgets/lib/theme.js +153 -0
- package/packages/daemon/dist/widgets/lib/watcher.d.ts +9 -0
- package/packages/daemon/dist/widgets/lib/watcher.js +92 -0
- package/packages/daemon/dist/widgets/preview/index.d.ts +1 -0
- package/packages/daemon/dist/widgets/preview/index.jsx +371 -0
- package/packages/daemon/dist/widgets/resolve.d.ts +20 -0
- package/packages/daemon/dist/widgets/resolve.js +100 -0
- package/packages/daemon/dist/widgets/setup/agent-naming.d.ts +9 -0
- package/packages/daemon/dist/widgets/setup/agent-naming.jsx +81 -0
- package/packages/daemon/dist/widgets/setup/config-tree.d.ts +13 -0
- package/packages/daemon/dist/widgets/setup/config-tree.jsx +203 -0
- package/packages/daemon/dist/widgets/setup/detect-panel.d.ts +14 -0
- package/{src/widgets/setup/detect-panel.tsx → packages/daemon/dist/widgets/setup/detect-panel.jsx} +16 -40
- package/packages/daemon/dist/widgets/setup/field-editor.d.ts +12 -0
- package/packages/daemon/dist/widgets/setup/field-editor.jsx +163 -0
- package/packages/daemon/dist/widgets/setup/footer.d.ts +17 -0
- package/packages/daemon/dist/widgets/setup/footer.jsx +64 -0
- package/packages/daemon/dist/widgets/setup/index.d.ts +1 -0
- package/packages/daemon/dist/widgets/setup/index.jsx +261 -0
- package/packages/daemon/dist/widgets/setup/layout-picker.d.ts +9 -0
- package/packages/daemon/dist/widgets/setup/layout-picker.jsx +69 -0
- package/packages/daemon/dist/widgets/setup/setup-model.d.ts +15 -0
- package/packages/daemon/dist/widgets/setup/setup-model.js +157 -0
- package/packages/daemon/dist/widgets/sidebar/index.d.ts +1 -0
- package/packages/daemon/dist/widgets/sidebar/index.jsx +462 -0
- package/scripts/build-cli.mjs +101 -0
- package/scripts/build-tui.mjs +58 -0
- package/scripts/capture-codex-traffic.mjs +195 -0
- package/scripts/check-src-additions.sh +74 -0
- package/scripts/coverage-summary.mjs +68 -0
- package/scripts/install-git-hooks.js +53 -0
- package/scripts/merge-update-manifests.mjs +58 -0
- package/scripts/merge-update-manifests.test.mjs +82 -0
- package/scripts/pack-check-run.mjs +83 -0
- package/scripts/postinstall.js +28 -6
- package/scripts/prepublish-check.mjs +44 -0
- package/scripts/stress-test.ts +141 -0
- package/scripts/verify-endpoints.sh +90 -0
- package/skill/SKILL.md +203 -236
- package/dashboard/out/404/index.html +0 -1
- package/dashboard/out/404.html +0 -1
- package/dashboard/out/__next.__PAGE__.txt +0 -9
- package/dashboard/out/__next._full.txt +0 -21
- package/dashboard/out/__next._head.txt +0 -5
- package/dashboard/out/__next._index.txt +0 -7
- package/dashboard/out/__next._tree.txt +0 -4
- package/dashboard/out/_next/static/Tl1KoIH7mHCyjo5KtXqQ0/_buildManifest.js +0 -11
- package/dashboard/out/_next/static/Tl1KoIH7mHCyjo5KtXqQ0/_clientMiddlewareManifest.json +0 -1
- package/dashboard/out/_next/static/Tl1KoIH7mHCyjo5KtXqQ0/_ssgManifest.js +0 -1
- package/dashboard/out/_next/static/chunks/048e2449530877e2.js +0 -1
- package/dashboard/out/_next/static/chunks/053c57bda6abb959.js +0 -1
- package/dashboard/out/_next/static/chunks/056760c6c2dd9172.js +0 -1
- package/dashboard/out/_next/static/chunks/06ab47357b6d3e35.js +0 -1
- package/dashboard/out/_next/static/chunks/0921cbe5dfd6738e.js +0 -1
- package/dashboard/out/_next/static/chunks/0b2599bf468cf5ea.js +0 -1
- package/dashboard/out/_next/static/chunks/0c012eac08ef2c4f.js +0 -1
- package/dashboard/out/_next/static/chunks/0c29e87fcdcffac3.js +0 -1
- package/dashboard/out/_next/static/chunks/0e1e98854430c693.js +0 -1
- package/dashboard/out/_next/static/chunks/0e24498976a88976.js +0 -1
- package/dashboard/out/_next/static/chunks/0e5bf11ff0b9ab90.js +0 -1
- package/dashboard/out/_next/static/chunks/0eae0a45ab8416c8.js +0 -1
- package/dashboard/out/_next/static/chunks/104797400d9d38ad.js +0 -1
- package/dashboard/out/_next/static/chunks/10cfcfce475f9d2d.js +0 -1
- package/dashboard/out/_next/static/chunks/11bac38e7cfb4ecc.js +0 -1
- package/dashboard/out/_next/static/chunks/120c5f6501ec3529.js +0 -1
- package/dashboard/out/_next/static/chunks/121fceb2b1dcd79f.js +0 -1
- package/dashboard/out/_next/static/chunks/13726b63e1be6b98.js +0 -1
- package/dashboard/out/_next/static/chunks/140c6ce631514660.js +0 -1
- package/dashboard/out/_next/static/chunks/1435ee3a51174c97.js +0 -1
- package/dashboard/out/_next/static/chunks/14dc927d2e2cca91.js +0 -1
- package/dashboard/out/_next/static/chunks/179c3031b292d98e.js +0 -1
- package/dashboard/out/_next/static/chunks/181e88957c47e5c1.js +0 -1
- package/dashboard/out/_next/static/chunks/18f70ba23873c432.js +0 -1
- package/dashboard/out/_next/static/chunks/1b58303b027fd135.js +0 -1
- package/dashboard/out/_next/static/chunks/1b5f49a358dcc71e.js +0 -1
- package/dashboard/out/_next/static/chunks/1bba44b81585099a.js +0 -1
- package/dashboard/out/_next/static/chunks/1bea8dee19a3e9ae.js +0 -1
- package/dashboard/out/_next/static/chunks/1cfad21646fc250e.js +0 -1
- package/dashboard/out/_next/static/chunks/1d053dc9e1e428ef.js +0 -1
- package/dashboard/out/_next/static/chunks/1e7d7639c6f0ee5e.js +0 -1
- package/dashboard/out/_next/static/chunks/1f42504ca81463f1.js +0 -1
- package/dashboard/out/_next/static/chunks/20c92047399305b4.js +0 -1
- package/dashboard/out/_next/static/chunks/214560e9514a9a4d.js +0 -1
- package/dashboard/out/_next/static/chunks/21d4ef106914e997.js +0 -1
- package/dashboard/out/_next/static/chunks/2586e83fc3dc2588.js +0 -1
- package/dashboard/out/_next/static/chunks/267136a09e94f5c2.js +0 -1
- package/dashboard/out/_next/static/chunks/271c50b329917c10.js +0 -1
- package/dashboard/out/_next/static/chunks/27fccecefffd88b5.js +0 -1
- package/dashboard/out/_next/static/chunks/28f058ed331315b6.js +0 -1
- package/dashboard/out/_next/static/chunks/28f704f2cc5713eb.js +0 -1
- package/dashboard/out/_next/static/chunks/290f67a6cd150a98.js +0 -1
- package/dashboard/out/_next/static/chunks/2ad12f4dcc30d30a.js +0 -1
- package/dashboard/out/_next/static/chunks/2b650b172078ab92.js +0 -1
- package/dashboard/out/_next/static/chunks/2bd91076019a6453.js +0 -1
- package/dashboard/out/_next/static/chunks/2e1278563a8e26be.js +0 -1
- package/dashboard/out/_next/static/chunks/309eb70780a3d67d.js +0 -1
- package/dashboard/out/_next/static/chunks/30f71950992e2307.js +0 -1
- package/dashboard/out/_next/static/chunks/31191873c2075784.js +0 -1
- package/dashboard/out/_next/static/chunks/31a790921a0c035e.js +0 -1
- package/dashboard/out/_next/static/chunks/34f8d7a5a06e8e32.js +0 -1
- package/dashboard/out/_next/static/chunks/36b3716436d9bc9d.js +0 -1
- package/dashboard/out/_next/static/chunks/3770b7d0ff004de3.js +0 -1
- package/dashboard/out/_next/static/chunks/381ab3bd4cffbf4d.js +0 -1
- package/dashboard/out/_next/static/chunks/38aa4eada5dcd1a4.js +0 -1
- package/dashboard/out/_next/static/chunks/39723132b78cb77e.js +0 -1
- package/dashboard/out/_next/static/chunks/399efdcc3fe56e09.js +0 -1
- package/dashboard/out/_next/static/chunks/3a8431a9221b0706.js +0 -1
- package/dashboard/out/_next/static/chunks/3a9b40810ce88cbf.js +0 -1
- package/dashboard/out/_next/static/chunks/3b322e3e9476ecdf.js +0 -1
- package/dashboard/out/_next/static/chunks/3bb14befeeb08c28.js +0 -1
- package/dashboard/out/_next/static/chunks/3c99637ebd462b20.js +0 -1
- package/dashboard/out/_next/static/chunks/3cbb9217d56459d8.js +0 -1
- package/dashboard/out/_next/static/chunks/3d438e0929a762f7.js +0 -1
- package/dashboard/out/_next/static/chunks/3e6d4834e0752f76.js +0 -2
- package/dashboard/out/_next/static/chunks/3e6f8cedaad4e89b.js +0 -1
- package/dashboard/out/_next/static/chunks/3e701259ce1b53e3.js +0 -1
- package/dashboard/out/_next/static/chunks/41562f7ab7c033eb.js +0 -1
- package/dashboard/out/_next/static/chunks/418fadd8a94e2fd7.js +0 -1
- package/dashboard/out/_next/static/chunks/42345437bb922e9c.js +0 -1
- package/dashboard/out/_next/static/chunks/434b6bd78c97b668.js +0 -1
- package/dashboard/out/_next/static/chunks/434febe897d33e2d.js +0 -1
- package/dashboard/out/_next/static/chunks/45d28707dd8ce1c1.js +0 -1
- package/dashboard/out/_next/static/chunks/4620a640e88cb1b7.js +0 -1
- package/dashboard/out/_next/static/chunks/468f8eb604502ea4.js +0 -1
- package/dashboard/out/_next/static/chunks/495f5cedf8afe823.js +0 -1
- package/dashboard/out/_next/static/chunks/49a89d1704d27740.js +0 -1
- package/dashboard/out/_next/static/chunks/49e5c37d15f63def.js +0 -1
- package/dashboard/out/_next/static/chunks/4a46ad186a8587ee.css +0 -2
- package/dashboard/out/_next/static/chunks/4a5c728574935d50.js +0 -1
- package/dashboard/out/_next/static/chunks/4b27ebd4d9304d8f.js +0 -1
- package/dashboard/out/_next/static/chunks/4b965aa320a9b358.js +0 -1
- package/dashboard/out/_next/static/chunks/4bb2da90bbe5794f.js +0 -1
- package/dashboard/out/_next/static/chunks/4d2f1c6f631e4b85.js +0 -1
- package/dashboard/out/_next/static/chunks/4d696d5a64dab42e.js +0 -1
- package/dashboard/out/_next/static/chunks/4f660dadb3f1e9e2.js +0 -1
- package/dashboard/out/_next/static/chunks/507b50d47f949333.js +0 -1
- package/dashboard/out/_next/static/chunks/50b1b7063bb044e2.js +0 -1
- package/dashboard/out/_next/static/chunks/50c0c2e3c4f02508.js +0 -1
- package/dashboard/out/_next/static/chunks/50d7ba9803e65b02.js +0 -1
- package/dashboard/out/_next/static/chunks/51535a6d4c98c7a4.js +0 -1
- package/dashboard/out/_next/static/chunks/526de6cc16c7dd2f.js +0 -1
- package/dashboard/out/_next/static/chunks/5307604f8632b3fd.js +0 -1
- package/dashboard/out/_next/static/chunks/5480bd722260f231.js +0 -1
- package/dashboard/out/_next/static/chunks/54c61c82e5f1dca5.js +0 -1
- package/dashboard/out/_next/static/chunks/555de6ac6bb9034c.js +0 -1
- package/dashboard/out/_next/static/chunks/562b89ee76a4b90c.js +0 -1
- package/dashboard/out/_next/static/chunks/5747f9a32edff429.js +0 -1
- package/dashboard/out/_next/static/chunks/57ee141430b4c05c.js +0 -1
- package/dashboard/out/_next/static/chunks/584c066a0837dd9a.js +0 -1
- package/dashboard/out/_next/static/chunks/5856aed4670a6253.js +0 -1
- package/dashboard/out/_next/static/chunks/58fe563414726511.js +0 -1
- package/dashboard/out/_next/static/chunks/5948196b2729b18c.js +0 -1
- package/dashboard/out/_next/static/chunks/5ab77c69e7306f97.js +0 -1
- package/dashboard/out/_next/static/chunks/5b3fa4c99d61611c.js +0 -1
- package/dashboard/out/_next/static/chunks/5cc87abaef616661.js +0 -1
- package/dashboard/out/_next/static/chunks/5dfa7913f99bb966.js +0 -1
- package/dashboard/out/_next/static/chunks/5e49b008432770f1.js +0 -1
- package/dashboard/out/_next/static/chunks/5e5a33dd81c45c47.js +0 -1
- package/dashboard/out/_next/static/chunks/5ee61bed638eb8a8.js +0 -1
- package/dashboard/out/_next/static/chunks/5eed557b9f45ae4a.js +0 -1
- package/dashboard/out/_next/static/chunks/60446823a7d30c1b.js +0 -1
- package/dashboard/out/_next/static/chunks/605150c490861442.js +0 -1
- package/dashboard/out/_next/static/chunks/609056d51c0bf332.js +0 -1
- package/dashboard/out/_next/static/chunks/60ec91dfeb50071b.js +0 -1
- package/dashboard/out/_next/static/chunks/61bc7be0bba6a33f.js +0 -1
- package/dashboard/out/_next/static/chunks/61f4a5c9ce23e55e.js +0 -1
- package/dashboard/out/_next/static/chunks/63aae3585be04e65.js +0 -1
- package/dashboard/out/_next/static/chunks/64e0e1ee7ef4f01b.js +0 -1
- package/dashboard/out/_next/static/chunks/66e9b4c26ff1aaaf.js +0 -1
- package/dashboard/out/_next/static/chunks/67068847aa1b5e98.js +0 -1
- package/dashboard/out/_next/static/chunks/68d7de1f2e202c26.js +0 -1
- package/dashboard/out/_next/static/chunks/698ca3ea1937ba4f.js +0 -1
- package/dashboard/out/_next/static/chunks/69eb97c24b5b6b9d.js +0 -1
- package/dashboard/out/_next/static/chunks/6b1ac098c228a479.js +0 -1
- package/dashboard/out/_next/static/chunks/6bb8020cb796bcc1.js +0 -1
- package/dashboard/out/_next/static/chunks/6cf8b1db17f2a155.js +0 -1
- package/dashboard/out/_next/static/chunks/6e7613643906ea88.js +0 -1
- package/dashboard/out/_next/static/chunks/6ea27ceb2e6feae5.js +0 -1
- package/dashboard/out/_next/static/chunks/6f95a8dbcf23dded.js +0 -1
- package/dashboard/out/_next/static/chunks/6fd44e759d82f64e.js +0 -1
- package/dashboard/out/_next/static/chunks/716ec29c268c38f6.js +0 -1
- package/dashboard/out/_next/static/chunks/717b399dfcf7c02c.js +0 -1
- package/dashboard/out/_next/static/chunks/72badd90e1c91348.js +0 -1
- package/dashboard/out/_next/static/chunks/72f9296dbb7ae3c4.js +0 -1
- package/dashboard/out/_next/static/chunks/73aa31e1144d8191.js +0 -1
- package/dashboard/out/_next/static/chunks/73f98ded8fe2e879.js +0 -1
- package/dashboard/out/_next/static/chunks/740a2e8ace15e13b.js +0 -1
- package/dashboard/out/_next/static/chunks/74e57c16e7304b6b.js +0 -1
- package/dashboard/out/_next/static/chunks/7628dead4d113df2.js +0 -1
- package/dashboard/out/_next/static/chunks/7717c88c07ed96e6.js +0 -1
- package/dashboard/out/_next/static/chunks/775581f7956d9a27.js +0 -1
- package/dashboard/out/_next/static/chunks/77d3b6661befdb98.js +0 -1
- package/dashboard/out/_next/static/chunks/78435c0e1c77fea7.js +0 -1
- package/dashboard/out/_next/static/chunks/791336748b9c9393.js +0 -1
- package/dashboard/out/_next/static/chunks/79ea68dfae65ef2f.js +0 -1
- package/dashboard/out/_next/static/chunks/7bae777a472eb13c.js +0 -1
- package/dashboard/out/_next/static/chunks/7fd847f47237a35c.js +0 -1
- package/dashboard/out/_next/static/chunks/804d718be0370058.css +0 -1
- package/dashboard/out/_next/static/chunks/807cb3c1923995ab.js +0 -1
- package/dashboard/out/_next/static/chunks/8286b39407d94447.js +0 -1
- package/dashboard/out/_next/static/chunks/84e4305b8dc830ed.js +0 -1
- package/dashboard/out/_next/static/chunks/850f99dbfabb53e0.js +0 -1
- package/dashboard/out/_next/static/chunks/85594127e66b6b7f.js +0 -1
- package/dashboard/out/_next/static/chunks/858c11169c183c9c.js +0 -1
- package/dashboard/out/_next/static/chunks/85e27005dfe4c3e3.js +0 -1
- package/dashboard/out/_next/static/chunks/8707bd3d8ddc1f1c.js +0 -1
- package/dashboard/out/_next/static/chunks/8851e5d7ef894973.js +0 -1
- package/dashboard/out/_next/static/chunks/88ba3782cc614989.js +0 -1
- package/dashboard/out/_next/static/chunks/8a0c9a181784c2ef.js +0 -1
- package/dashboard/out/_next/static/chunks/8ad01ae355a6e7f6.js +0 -1
- package/dashboard/out/_next/static/chunks/8d2ed93b0d0a4b4f.js +0 -1
- package/dashboard/out/_next/static/chunks/8dc352ebd5310d3c.js +0 -1
- package/dashboard/out/_next/static/chunks/8dd1d722c8c1a22c.js +0 -1
- package/dashboard/out/_next/static/chunks/8e60fe307e3e4986.js +0 -1
- package/dashboard/out/_next/static/chunks/8eea4dd71e25f32a.js +0 -1
- package/dashboard/out/_next/static/chunks/8f468a65bac34eaa.js +0 -1
- package/dashboard/out/_next/static/chunks/9057e5382d6a5059.js +0 -1
- package/dashboard/out/_next/static/chunks/931d056437805ecb.js +0 -1
- package/dashboard/out/_next/static/chunks/954eb11648dd8cff.js +0 -1
- package/dashboard/out/_next/static/chunks/955034d876d14bb3.js +0 -1
- package/dashboard/out/_next/static/chunks/966c4895773249f6.js +0 -1
- package/dashboard/out/_next/static/chunks/96aff410a6ab106c.js +0 -1
- package/dashboard/out/_next/static/chunks/99b396c821c1dd2d.js +0 -1
- package/dashboard/out/_next/static/chunks/9a255fd2cf4922ae.js +0 -1
- package/dashboard/out/_next/static/chunks/9b1f6aa73bc864b2.js +0 -1
- package/dashboard/out/_next/static/chunks/9b9ce582c533aa79.js +0 -1
- package/dashboard/out/_next/static/chunks/9c19bd3c773c6611.js +0 -1
- package/dashboard/out/_next/static/chunks/9ceeaa847eb15ca2.js +0 -1
- package/dashboard/out/_next/static/chunks/9d2e6e7b8b65f845.js +0 -1
- package/dashboard/out/_next/static/chunks/9de23802066128ff.js +0 -1
- package/dashboard/out/_next/static/chunks/9e327f94b3701170.js +0 -1
- package/dashboard/out/_next/static/chunks/9e7818421c2d455a.js +0 -1
- package/dashboard/out/_next/static/chunks/9e935acbcf2fb519.js +0 -1
- package/dashboard/out/_next/static/chunks/9ed9f68340343b51.js +0 -1
- package/dashboard/out/_next/static/chunks/9f94a0242455fc20.js +0 -1
- package/dashboard/out/_next/static/chunks/9fff46b5aaecf47e.js +0 -1
- package/dashboard/out/_next/static/chunks/a06d267a5c557657.js +0 -1
- package/dashboard/out/_next/static/chunks/a0eb8c81c54722fe.js +0 -1
- package/dashboard/out/_next/static/chunks/a16808e83106427d.js +0 -1
- package/dashboard/out/_next/static/chunks/a2215e2bc72739ef.js +0 -1
- package/dashboard/out/_next/static/chunks/a2de9e6696eb9c17.js +0 -1
- package/dashboard/out/_next/static/chunks/a33420b8c14090d6.js +0 -1
- package/dashboard/out/_next/static/chunks/a360bffef39d818b.js +0 -1
- package/dashboard/out/_next/static/chunks/a42852fdf5287cf5.js +0 -1
- package/dashboard/out/_next/static/chunks/a4efc88488322b67.js +0 -1
- package/dashboard/out/_next/static/chunks/a696a91d14101bdb.js +0 -1
- package/dashboard/out/_next/static/chunks/a6dad97d9634a72d.js +0 -1
- package/dashboard/out/_next/static/chunks/a6dad97d9634a72d.js.map +0 -1
- package/dashboard/out/_next/static/chunks/a705c7261712bd8e.js +0 -1
- package/dashboard/out/_next/static/chunks/a7d1e4b067ace180.js +0 -1
- package/dashboard/out/_next/static/chunks/a8590c121a7efaa5.js +0 -1
- package/dashboard/out/_next/static/chunks/a95953a83a6df6cf.js +0 -1
- package/dashboard/out/_next/static/chunks/a9d0a757d3b4afed.js +0 -1
- package/dashboard/out/_next/static/chunks/a9dc35514619c872.js +0 -1
- package/dashboard/out/_next/static/chunks/aae0253c73fba984.js +0 -193
- package/dashboard/out/_next/static/chunks/ab1821552066a74d.js +0 -1
- package/dashboard/out/_next/static/chunks/ac96bc0eccebe15a.js +0 -1
- package/dashboard/out/_next/static/chunks/acc03cfaaf6bb30f.js +0 -1
- package/dashboard/out/_next/static/chunks/acc298ae059b9fe4.js +0 -1
- package/dashboard/out/_next/static/chunks/ad076b6e996d250c.js +0 -1
- package/dashboard/out/_next/static/chunks/ae53b64af7ba16d5.js +0 -1
- package/dashboard/out/_next/static/chunks/ae5da7fa4bc5fa95.js +0 -1
- package/dashboard/out/_next/static/chunks/aefcf0eb033a155e.js +0 -1
- package/dashboard/out/_next/static/chunks/b12d43100ee10526.js +0 -1
- package/dashboard/out/_next/static/chunks/b137952dd5566a41.js +0 -1
- package/dashboard/out/_next/static/chunks/b2832d8a2d332a47.js +0 -1
- package/dashboard/out/_next/static/chunks/b417aa09c15f63c6.js +0 -1
- package/dashboard/out/_next/static/chunks/b48e152ba7bf6caf.js +0 -1
- package/dashboard/out/_next/static/chunks/b4cbef8e4714bf92.js +0 -1
- package/dashboard/out/_next/static/chunks/b568ff8383a37f53.js +0 -1
- package/dashboard/out/_next/static/chunks/b6e1495dd89a39e3.js +0 -1
- package/dashboard/out/_next/static/chunks/b73a21bd67528440.js +0 -1
- package/dashboard/out/_next/static/chunks/b77ee62bc71dcec7.js +0 -1
- package/dashboard/out/_next/static/chunks/b7f454615c11d4eb.js +0 -1
- package/dashboard/out/_next/static/chunks/b818ea32a839590f.js +0 -1
- package/dashboard/out/_next/static/chunks/b901ce78c1c65d66.js +0 -1
- package/dashboard/out/_next/static/chunks/b93d647b803be9fa.js +0 -1
- package/dashboard/out/_next/static/chunks/b960b09ff1ecd6bb.js +0 -1
- package/dashboard/out/_next/static/chunks/ba717c7779a778fc.js +0 -1
- package/dashboard/out/_next/static/chunks/bacb0ae7458d18b6.js +0 -1
- package/dashboard/out/_next/static/chunks/bb51f68b27346852.js +0 -1
- package/dashboard/out/_next/static/chunks/bb67f22e1ab632ae.js +0 -1
- package/dashboard/out/_next/static/chunks/bbae97ec58d1bb9d.js +0 -1
- package/dashboard/out/_next/static/chunks/bbaf38ee90307765.js +0 -1
- package/dashboard/out/_next/static/chunks/be01598fe1fce5db.js +0 -1
- package/dashboard/out/_next/static/chunks/bf4cbbc095987fec.js +0 -1
- package/dashboard/out/_next/static/chunks/c18f823797d57446.js +0 -1
- package/dashboard/out/_next/static/chunks/c1bcece34ec5b295.js +0 -1
- package/dashboard/out/_next/static/chunks/c1ccbc3a51adaf0a.js +0 -1
- package/dashboard/out/_next/static/chunks/c1f54a628f27791c.js +0 -1
- package/dashboard/out/_next/static/chunks/c21916bf5d232151.js +0 -1
- package/dashboard/out/_next/static/chunks/c27e570f0fc2f78b.js +0 -1
- package/dashboard/out/_next/static/chunks/c322b8005eebc0d8.js +0 -1
- package/dashboard/out/_next/static/chunks/c3900ac2b009b764.js +0 -1
- package/dashboard/out/_next/static/chunks/c3c597c8eb77ad6b.js +0 -1
- package/dashboard/out/_next/static/chunks/c58d45c1d88e208c.js +0 -1
- package/dashboard/out/_next/static/chunks/c63875998d7a655f.js +0 -1
- package/dashboard/out/_next/static/chunks/c6eaa7c8e7209c8e.js +0 -1
- package/dashboard/out/_next/static/chunks/c6f820f71162a59a.js +0 -1
- package/dashboard/out/_next/static/chunks/c7ce0941d1dfe7ed.js +0 -1
- package/dashboard/out/_next/static/chunks/c877259f784ec8e5.js +0 -1
- package/dashboard/out/_next/static/chunks/cb8057e86aaa1c68.js +0 -1
- package/dashboard/out/_next/static/chunks/ccb4e306ee4859b1.js +0 -1
- package/dashboard/out/_next/static/chunks/ccde62b0fa8112eb.js +0 -1
- package/dashboard/out/_next/static/chunks/cd421f0971c63c31.js +0 -1
- package/dashboard/out/_next/static/chunks/cde0317494d4adb7.js +0 -1
- package/dashboard/out/_next/static/chunks/cfae64434b92b8b6.js +0 -1
- package/dashboard/out/_next/static/chunks/cfc0e19310ec0a36.js +0 -1
- package/dashboard/out/_next/static/chunks/d0f344c7d0bcb59a.js +0 -1
- package/dashboard/out/_next/static/chunks/d1871c73e74e1f50.js +0 -1
- package/dashboard/out/_next/static/chunks/d18f658850711061.js +0 -1
- package/dashboard/out/_next/static/chunks/d25d9c48880697f6.js +0 -1
- package/dashboard/out/_next/static/chunks/d3f0a72bbc3060b0.js +0 -1
- package/dashboard/out/_next/static/chunks/d5fca429bc89060b.js +0 -1
- package/dashboard/out/_next/static/chunks/d6a6c75c9a4bef49.js +0 -1
- package/dashboard/out/_next/static/chunks/d6a8f93aa8f1e345.js +0 -1
- package/dashboard/out/_next/static/chunks/d7deab676b19ba0e.js +0 -1
- package/dashboard/out/_next/static/chunks/d80030dde88cec85.js +0 -1
- package/dashboard/out/_next/static/chunks/da84f9774c076ff1.js +0 -1
- package/dashboard/out/_next/static/chunks/da98ecc6b9b0ceb2.js +0 -1
- package/dashboard/out/_next/static/chunks/db550aabce60b912.js +0 -4
- package/dashboard/out/_next/static/chunks/dc87f77fcc029482.js +0 -1
- package/dashboard/out/_next/static/chunks/dd05f30acdb63a53.js +0 -1
- package/dashboard/out/_next/static/chunks/dea150155499b903.js +0 -1
- package/dashboard/out/_next/static/chunks/df4358754ff1d5e8.js +0 -1
- package/dashboard/out/_next/static/chunks/df8b21ff12d23b0e.js +0 -1
- package/dashboard/out/_next/static/chunks/df8fc68d77debf2c.js +0 -1
- package/dashboard/out/_next/static/chunks/df9ed1ffec90589f.js +0 -1
- package/dashboard/out/_next/static/chunks/dfa65ece1598f934.js +0 -1
- package/dashboard/out/_next/static/chunks/dfaab5cdd41a20d9.js +0 -1
- package/dashboard/out/_next/static/chunks/e00c03c942b5ae3e.js +0 -1
- package/dashboard/out/_next/static/chunks/e02d27cf679bece1.js +0 -1
- package/dashboard/out/_next/static/chunks/e0b747585f78513a.js +0 -1
- package/dashboard/out/_next/static/chunks/e19b71ca23fd7df0.js +0 -1
- package/dashboard/out/_next/static/chunks/e21cbe89d0cda120.js +0 -1
- package/dashboard/out/_next/static/chunks/e2a0386930edd34f.js +0 -1
- package/dashboard/out/_next/static/chunks/e375de19a36e2f38.js +0 -1
- package/dashboard/out/_next/static/chunks/e5241b4a6496a9e0.js +0 -1
- package/dashboard/out/_next/static/chunks/e569dd07c96eb4dd.js +0 -1
- package/dashboard/out/_next/static/chunks/e61c3ea91233f948.js +0 -1
- package/dashboard/out/_next/static/chunks/e73b42c5d34c4c28.js +0 -1
- package/dashboard/out/_next/static/chunks/e7c5b2105f651e87.js +0 -1
- package/dashboard/out/_next/static/chunks/e878e58a69bb01b6.js +0 -1
- package/dashboard/out/_next/static/chunks/e8f090a4dc571062.js +0 -1
- package/dashboard/out/_next/static/chunks/e98dc34dac91cdad.js +0 -1
- package/dashboard/out/_next/static/chunks/ea67cf7a0c5e7233.js +0 -1
- package/dashboard/out/_next/static/chunks/eacc98a1e3512fa9.js +0 -1
- package/dashboard/out/_next/static/chunks/eae9cd74d9bbed8b.js +0 -1
- package/dashboard/out/_next/static/chunks/eb187fd345852b34.js +0 -1
- package/dashboard/out/_next/static/chunks/ecea46df7a40b427.js +0 -1
- package/dashboard/out/_next/static/chunks/ecf48b83f4245d9c.js +0 -1
- package/dashboard/out/_next/static/chunks/eda41732bf966c6d.js +0 -1
- package/dashboard/out/_next/static/chunks/ee174a433049f43a.js +0 -1
- package/dashboard/out/_next/static/chunks/ee66b2d3b76de72e.js +0 -1
- package/dashboard/out/_next/static/chunks/ef058d3041c3d8ab.js +0 -1
- package/dashboard/out/_next/static/chunks/f3544b800b0d4969.js +0 -1
- package/dashboard/out/_next/static/chunks/f3b280e604b97509.js +0 -1
- package/dashboard/out/_next/static/chunks/f42e1d3693232993.js +0 -1
- package/dashboard/out/_next/static/chunks/f5a5fdd80166d304.js +0 -1
- package/dashboard/out/_next/static/chunks/f60adc5dd6169316.js +0 -1
- package/dashboard/out/_next/static/chunks/f6255bc2e6c68ce8.js +0 -1
- package/dashboard/out/_next/static/chunks/f6bb677d2d8840db.js +0 -1
- package/dashboard/out/_next/static/chunks/f6f3bf016239c33a.js +0 -1
- package/dashboard/out/_next/static/chunks/f6f57a46cd074bfe.js +0 -1
- package/dashboard/out/_next/static/chunks/f7feb9c1199e8cf6.js +0 -1
- package/dashboard/out/_next/static/chunks/f831087bf964cc3d.js +0 -1
- package/dashboard/out/_next/static/chunks/fa5a2f7244935aa2.js +0 -1
- package/dashboard/out/_next/static/chunks/fa73f36df4c38fa0.js +0 -1
- package/dashboard/out/_next/static/chunks/faa1461722d6a88d.js +0 -1
- package/dashboard/out/_next/static/chunks/fbf706b9a0edb7e6.js +0 -1
- package/dashboard/out/_next/static/chunks/fc2b8c8b7446bbc2.js +0 -1
- package/dashboard/out/_next/static/chunks/fd516f3930c128c1.js +0 -1
- package/dashboard/out/_next/static/chunks/fd663e7ff8de4887.js +0 -1
- package/dashboard/out/_next/static/chunks/fe5b656cc9bdd60e.js +0 -1
- package/dashboard/out/_next/static/chunks/turbopack-2f5dec4a537c0ee7.js +0 -4
- package/dashboard/out/_next/static/media/02263ebadd758ea4-s.8da66e7f.woff2 +0 -0
- package/dashboard/out/_next/static/media/2fe89d53234c61d4-s.cb53f04b.woff2 +0 -0
- package/dashboard/out/_next/static/media/59b15b4bcd7b1eb5-s.afa48be3.woff2 +0 -0
- package/dashboard/out/_next/static/media/5e05ae5b48faa55e-s.6b5ea6af.woff2 +0 -0
- package/dashboard/out/_next/static/media/68757d6cddeff913-s.e6cd1753.woff2 +0 -0
- package/dashboard/out/_next/static/media/99e609270109b47d-s.p.64b9304e.woff2 +0 -0
- package/dashboard/out/_next/static/media/a7afbb44bec2bb18-s.1dcddae6.woff2 +0 -0
- package/dashboard/out/_next/static/media/e390973e931a41c5-s.a82ecf4e.woff2 +0 -0
- package/dashboard/out/_next/static/media/e532fa1b9921e1cd-s.764b43eb.woff2 +0 -0
- package/dashboard/out/_next/static/media/effe91970fc4db64-s.p.19510058.woff2 +0 -0
- package/dashboard/out/_not-found/__next._full.txt +0 -15
- package/dashboard/out/_not-found/__next._head.txt +0 -5
- package/dashboard/out/_not-found/__next._index.txt +0 -7
- package/dashboard/out/_not-found/__next._not-found.__PAGE__.txt +0 -5
- package/dashboard/out/_not-found/__next._not-found.txt +0 -4
- package/dashboard/out/_not-found/__next._tree.txt +0 -2
- package/dashboard/out/_not-found/index.html +0 -1
- package/dashboard/out/_not-found/index.txt +0 -15
- package/dashboard/out/index.html +0 -1
- package/dashboard/out/index.txt +0 -21
- package/dashboard/out/project/__fallback/__next._full.txt +0 -19
- package/dashboard/out/project/__fallback/__next._head.txt +0 -5
- package/dashboard/out/project/__fallback/__next._index.txt +0 -7
- package/dashboard/out/project/__fallback/__next._tree.txt +0 -5
- package/dashboard/out/project/__fallback/__next.project.$d$name.__PAGE__.txt +0 -7
- package/dashboard/out/project/__fallback/__next.project.$d$name.txt +0 -4
- package/dashboard/out/project/__fallback/__next.project.txt +0 -4
- package/dashboard/out/project/__fallback/index.html +0 -1
- package/dashboard/out/project/__fallback/index.txt +0 -19
- package/src/__tests__/support.ts +0 -186
- package/src/attach.ts +0 -20
- package/src/cli.test.ts +0 -314
- package/src/command-center/discovery.test.ts +0 -265
- package/src/command-center/discovery.ts +0 -296
- package/src/command-center/index.ts +0 -31
- package/src/command-center/schemas.ts +0 -57
- package/src/command-center/server.test.ts +0 -814
- package/src/command-center/server.ts +0 -1427
- package/src/command-center/static.test.ts +0 -105
- package/src/command-center/static.ts +0 -122
- package/src/config-cli.test.ts +0 -86
- package/src/config.test.ts +0 -205
- package/src/config.ts +0 -313
- package/src/detect.test.ts +0 -142
- package/src/detect.ts +0 -248
- package/src/dispatch.ts +0 -102
- package/src/doctor.test.ts +0 -119
- package/src/doctor.ts +0 -167
- package/src/init.test.ts +0 -101
- package/src/init.ts +0 -211
- package/src/inspect.test.ts +0 -67
- package/src/inspect.ts +0 -212
- package/src/integration.test.ts.skip +0 -276
- package/src/js-yaml.d.ts +0 -10
- package/src/launch.test.ts +0 -149
- package/src/launch.ts +0 -583
- package/src/lib/auth/auth-service.test.ts +0 -178
- package/src/lib/auth/auth-service.ts +0 -227
- package/src/lib/auth/middleware.test.ts +0 -119
- package/src/lib/auth/middleware.ts +0 -56
- package/src/lib/auth/types.ts +0 -13
- package/src/lib/authorship.test.ts +0 -242
- package/src/lib/authorship.ts +0 -280
- package/src/lib/cast/recorder.test.ts +0 -127
- package/src/lib/cast/recorder.ts +0 -148
- package/src/lib/daemon-watchdog.ts +0 -102
- package/src/lib/daemon.ts +0 -431
- package/src/lib/dot-path.test.ts +0 -66
- package/src/lib/dot-path.ts +0 -17
- package/src/lib/errors.ts +0 -44
- package/src/lib/event-log.test.ts +0 -189
- package/src/lib/event-log.ts +0 -237
- package/src/lib/github-pr.ts +0 -182
- package/src/lib/hq/client.test.ts +0 -154
- package/src/lib/hq/client.ts +0 -142
- package/src/lib/hq/mdns.test.ts +0 -54
- package/src/lib/hq/mdns.ts +0 -88
- package/src/lib/hq/registry.test.ts +0 -237
- package/src/lib/hq/registry.ts +0 -145
- package/src/lib/hq/types.ts +0 -44
- package/src/lib/ipc/socket-protocol.test.ts +0 -126
- package/src/lib/ipc/socket-protocol.ts +0 -324
- package/src/lib/launch-plan.test.ts +0 -119
- package/src/lib/launch-plan.ts +0 -90
- package/src/lib/log.test.ts +0 -39
- package/src/lib/log.ts +0 -71
- package/src/lib/metrics.test.ts +0 -213
- package/src/lib/metrics.ts +0 -345
- package/src/lib/orchestrator.test.ts +0 -2358
- package/src/lib/orchestrator.ts +0 -1799
- package/src/lib/output.ts +0 -76
- package/src/lib/plan-store.test.ts +0 -148
- package/src/lib/plan-store.ts +0 -131
- package/src/lib/research.test.ts +0 -208
- package/src/lib/research.ts +0 -475
- package/src/lib/round-trip.test.ts +0 -341
- package/src/lib/session-monitor.test.ts +0 -152
- package/src/lib/session-monitor.ts +0 -282
- package/src/lib/session-options.test.ts +0 -146
- package/src/lib/session-options.ts +0 -100
- package/src/lib/shell.test.ts +0 -20
- package/src/lib/sizes.test.ts +0 -73
- package/src/lib/sizes.ts +0 -36
- package/src/lib/skill-registry.test.ts +0 -134
- package/src/lib/skill-registry.ts +0 -86
- package/src/lib/slugify.test.ts +0 -35
- package/src/lib/slugify.ts +0 -10
- package/src/lib/task-store.ts +0 -352
- package/src/lib/tmux.test.ts +0 -500
- package/src/lib/tmux.ts +0 -372
- package/src/lib/token-tracker.test.ts +0 -102
- package/src/lib/token-tracker.ts +0 -70
- package/src/lib/tunnels/cloudflare.test.ts +0 -73
- package/src/lib/tunnels/cloudflare.ts +0 -254
- package/src/lib/tunnels/manager.test.ts +0 -63
- package/src/lib/tunnels/manager.ts +0 -132
- package/src/lib/tunnels/ngrok.test.ts +0 -94
- package/src/lib/tunnels/ngrok.ts +0 -261
- package/src/lib/tunnels/tailscale.test.ts +0 -103
- package/src/lib/tunnels/tailscale.ts +0 -1048
- package/src/lib/tunnels/types.ts +0 -44
- package/src/lib/validation.test.ts +0 -289
- package/src/lib/validation.ts +0 -123
- package/src/lib/webhook.ts +0 -51
- package/src/lib/workflow-store.ts +0 -209
- package/src/lib/ws-v3/protocol.test.ts +0 -127
- package/src/lib/ws-v3/protocol.ts +0 -160
- package/src/lib/yaml-io.test.ts +0 -125
- package/src/lib/yaml-io.ts +0 -27
- package/src/ls.test.ts +0 -76
- package/src/ls.ts +0 -40
- package/src/metrics-cli.ts +0 -177
- package/src/notify.ts +0 -85
- package/src/orchestrator-status.ts +0 -228
- package/src/plan.ts +0 -117
- package/src/postinstall.test.ts +0 -79
- package/src/remote.test.ts +0 -115
- package/src/remote.ts +0 -148
- package/src/restart.ts +0 -24
- package/src/schemas/domain.ts +0 -422
- package/src/schemas/ide-config.ts +0 -148
- package/src/schemas/index.ts +0 -53
- package/src/send.test.ts +0 -70
- package/src/send.ts +0 -181
- package/src/skill.test.ts +0 -114
- package/src/skill.ts +0 -138
- package/src/status.ts +0 -66
- package/src/stop.test.ts +0 -151
- package/src/stop.ts +0 -37
- package/src/task.test.ts +0 -1466
- package/src/task.ts +0 -1143
- package/src/tunnel.test.ts +0 -80
- package/src/tunnel.ts +0 -133
- package/src/types.ts +0 -15
- package/src/ui/index.ts +0 -32
- package/src/ui/terminal/index.ts +0 -9
- package/src/ui/types.ts +0 -91
- package/src/ui/web/base.css +0 -80
- package/src/ui/web/components/Box.tsx +0 -59
- package/src/ui/web/components/Input.tsx +0 -32
- package/src/ui/web/components/ScrollBox.tsx +0 -60
- package/src/ui/web/components/Text.tsx +0 -28
- package/src/ui/web/hooks.ts +0 -106
- package/src/ui/web/index.ts +0 -27
- package/src/ui/web/render.ts +0 -77
- package/src/ui/web/utils/color.test.ts +0 -93
- package/src/ui/web/utils/color.ts +0 -27
- package/src/validate.test.ts +0 -385
- package/src/validate.ts +0 -217
- package/src/widgets/changes/index.tsx +0 -576
- package/src/widgets/config/index.tsx +0 -440
- package/src/widgets/costs/index.tsx +0 -216
- package/src/widgets/explorer/breadcrumbs.tsx +0 -77
- package/src/widgets/explorer/footer.tsx +0 -20
- package/src/widgets/explorer/header.tsx +0 -23
- package/src/widgets/explorer/index.tsx +0 -408
- package/src/widgets/explorer/tree-model.test.ts +0 -214
- package/src/widgets/explorer/tree-model.ts +0 -103
- package/src/widgets/explorer/tree.tsx +0 -156
- package/src/widgets/lib/config-model.ts +0 -116
- package/src/widgets/lib/files.test.ts +0 -103
- package/src/widgets/lib/files.ts +0 -88
- package/src/widgets/lib/git.test.ts +0 -151
- package/src/widgets/lib/git.ts +0 -88
- package/src/widgets/lib/pane-comms.test.ts +0 -178
- package/src/widgets/lib/pane-comms.ts +0 -207
- package/src/widgets/lib/theme.ts +0 -151
- package/src/widgets/lib/watcher.ts +0 -50
- package/src/widgets/mission-control/activity-feed.tsx +0 -59
- package/src/widgets/mission-control/agent-panel.tsx +0 -132
- package/src/widgets/mission-control/command-bar.tsx +0 -63
- package/src/widgets/mission-control/index.tsx +0 -751
- package/src/widgets/mission-control/task-panel.tsx +0 -238
- package/src/widgets/preview/index.tsx +0 -415
- package/src/widgets/resolve.ts +0 -40
- package/src/widgets/setup/agent-naming.tsx +0 -112
- package/src/widgets/setup/config-tree.tsx +0 -238
- package/src/widgets/setup/field-editor.tsx +0 -265
- package/src/widgets/setup/footer.tsx +0 -107
- package/src/widgets/setup/index.tsx +0 -340
- package/src/widgets/setup/layout-picker.tsx +0 -96
- package/src/widgets/setup/orchestrator-panel.tsx +0 -200
- package/src/widgets/setup/review-panel.tsx +0 -140
- package/src/widgets/setup/setup-model.test.ts +0 -303
- package/src/widgets/setup/setup-model.ts +0 -188
- package/src/widgets/tasks/index.tsx +0 -129
- package/src/widgets/tasks/task-detail.tsx +0 -309
- package/src/widgets/tasks/task-form.tsx +0 -193
- package/src/widgets/tasks/task-list.tsx +0 -205
- package/src/widgets/tasks/task-model.test.ts +0 -473
- package/src/widgets/tasks/task-model.ts +0 -157
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NodePtyAdapter — concrete `PtyAdapter` backed by the `node-pty` native
|
|
3
|
+
* module (T087). The only place in the daemon that imports `node-pty`.
|
|
4
|
+
*
|
|
5
|
+
* One-time setup:
|
|
6
|
+
* - macOS / Linux: node-pty ships a `spawn-helper` binary. The
|
|
7
|
+
* `chmod +x` is occasionally lost during install (npm tarball
|
|
8
|
+
* metadata edge cases). Borrowing t3's
|
|
9
|
+
* `ensureNodePtySpawnHelperExecutable`, we walk the published candidate
|
|
10
|
+
* paths and chmod 0755 once per process. Failure is best-effort —
|
|
11
|
+
* spawning will surface a real error if it actually matters.
|
|
12
|
+
*/
|
|
13
|
+
import { chmodSync, existsSync, statSync } from "node:fs";
|
|
14
|
+
import { dirname, join } from "node:path";
|
|
15
|
+
import { createRequire } from "node:module";
|
|
16
|
+
import * as pty from "node-pty";
|
|
17
|
+
import { PtySpawnError, } from "./PtyAdapter.js";
|
|
18
|
+
const ADAPTER_ID = "node-pty";
|
|
19
|
+
let helperEnsured = false;
|
|
20
|
+
function candidateSpawnHelperPaths() {
|
|
21
|
+
const requireForNodePty = createRequire(import.meta.url);
|
|
22
|
+
let pkgJsonPath;
|
|
23
|
+
try {
|
|
24
|
+
pkgJsonPath = requireForNodePty.resolve("node-pty/package.json");
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// node-pty package missing — `pty.spawn` will throw a richer error.
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
const pkgDir = dirname(pkgJsonPath);
|
|
31
|
+
return [
|
|
32
|
+
join(pkgDir, "build", "Release", "spawn-helper"),
|
|
33
|
+
join(pkgDir, "build", "Debug", "spawn-helper"),
|
|
34
|
+
join(pkgDir, "prebuilds", `${process.platform}-${process.arch}`, "spawn-helper"),
|
|
35
|
+
];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Chmod node-pty's `spawn-helper` to 0755 the first time we touch it.
|
|
39
|
+
* No-op on Windows (no helper binary). Idempotent across calls.
|
|
40
|
+
* Exported for the unit test that asserts the chmod side effect.
|
|
41
|
+
*/
|
|
42
|
+
export function ensureNodePtySpawnHelperExecutable(options = {}) {
|
|
43
|
+
if (process.platform === "win32")
|
|
44
|
+
return;
|
|
45
|
+
if (!options.force && !options.explicitPath && helperEnsured)
|
|
46
|
+
return;
|
|
47
|
+
const candidates = options.explicitPath ? [options.explicitPath] : candidateSpawnHelperPaths();
|
|
48
|
+
for (const candidate of candidates) {
|
|
49
|
+
if (!existsSync(candidate))
|
|
50
|
+
continue;
|
|
51
|
+
try {
|
|
52
|
+
chmodSync(candidate, 0o755);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Best-effort: a hardened filesystem may forbid chmod even when the
|
|
56
|
+
// bit is already set. Continue to the next candidate so we never
|
|
57
|
+
// fail spawning just because the helper was already executable.
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (!options.explicitPath)
|
|
61
|
+
helperEnsured = true;
|
|
62
|
+
}
|
|
63
|
+
function assertValidCwd(cwd, statFn) {
|
|
64
|
+
let stats;
|
|
65
|
+
try {
|
|
66
|
+
stats = statFn(cwd);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
throw new PtySpawnError({
|
|
70
|
+
adapter: ADAPTER_ID,
|
|
71
|
+
code: "cwd_invalid",
|
|
72
|
+
message: `cwd does not exist or cannot be stat'd: ${cwd}`,
|
|
73
|
+
cause: err,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
if (!stats.isDirectory()) {
|
|
77
|
+
throw new PtySpawnError({
|
|
78
|
+
adapter: ADAPTER_ID,
|
|
79
|
+
code: "cwd_invalid",
|
|
80
|
+
message: `cwd is not a directory: ${cwd}`,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Wrap a live `node-pty` IPty with the `PtyProcess` interface. Disposes are
|
|
86
|
+
* idempotent; `kill` emits a synthetic exit if node-pty doesn't fire one
|
|
87
|
+
* (e.g. when the child has already gone away under us).
|
|
88
|
+
*/
|
|
89
|
+
class NodePtyProcess {
|
|
90
|
+
exited = false;
|
|
91
|
+
child;
|
|
92
|
+
dataListeners = new Set();
|
|
93
|
+
exitListeners = new Set();
|
|
94
|
+
constructor(child) {
|
|
95
|
+
this.child = child;
|
|
96
|
+
// node-pty hands us strings by default; we want raw buffers for
|
|
97
|
+
// byte-accurate WS bridging. The encoding:null on spawn opts gives us
|
|
98
|
+
// buffers in the typings of node-pty@1.2.0-beta.12.
|
|
99
|
+
this.child.onData((data) => {
|
|
100
|
+
const buf = Buffer.isBuffer(data) ? data : Buffer.from(String(data), "utf8");
|
|
101
|
+
for (const listener of this.dataListeners)
|
|
102
|
+
listener(buf);
|
|
103
|
+
});
|
|
104
|
+
this.child.onExit((evt) => {
|
|
105
|
+
this.exited = true;
|
|
106
|
+
const event = {
|
|
107
|
+
exitCode: evt.exitCode ?? 0,
|
|
108
|
+
signal: typeof evt.signal === "number" ? evt.signal : null,
|
|
109
|
+
};
|
|
110
|
+
for (const listener of this.exitListeners)
|
|
111
|
+
listener(event);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
get pid() {
|
|
115
|
+
return this.child.pid;
|
|
116
|
+
}
|
|
117
|
+
write(data) {
|
|
118
|
+
if (this.exited)
|
|
119
|
+
return;
|
|
120
|
+
if (typeof data === "string")
|
|
121
|
+
this.child.write(data);
|
|
122
|
+
else
|
|
123
|
+
this.child.write(Buffer.from(data).toString("binary"));
|
|
124
|
+
}
|
|
125
|
+
resize(cols, rows) {
|
|
126
|
+
if (this.exited)
|
|
127
|
+
return;
|
|
128
|
+
if (!Number.isInteger(cols) || cols <= 0)
|
|
129
|
+
throw new RangeError("cols must be a positive integer");
|
|
130
|
+
if (!Number.isInteger(rows) || rows <= 0)
|
|
131
|
+
throw new RangeError("rows must be a positive integer");
|
|
132
|
+
try {
|
|
133
|
+
this.child.resize(cols, rows);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// node-pty throws if the underlying fd is gone — treat as no-op so
|
|
137
|
+
// bridge resize handlers don't have to special-case.
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
kill(signal) {
|
|
141
|
+
if (this.exited)
|
|
142
|
+
return;
|
|
143
|
+
try {
|
|
144
|
+
this.child.kill(typeof signal === "number" ? String(signal) : signal);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// Already gone. Synthesize an exit so listeners detach cleanly.
|
|
148
|
+
this.exited = true;
|
|
149
|
+
for (const listener of this.exitListeners)
|
|
150
|
+
listener({ exitCode: 0, signal: null });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
onData(callback) {
|
|
154
|
+
this.dataListeners.add(callback);
|
|
155
|
+
return () => {
|
|
156
|
+
this.dataListeners.delete(callback);
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
onExit(callback) {
|
|
160
|
+
if (this.exited) {
|
|
161
|
+
// Adapters MUST guarantee at most one terminal onExit — late
|
|
162
|
+
// subscribers get an inert disposer.
|
|
163
|
+
return () => undefined;
|
|
164
|
+
}
|
|
165
|
+
this.exitListeners.add(callback);
|
|
166
|
+
return () => {
|
|
167
|
+
this.exitListeners.delete(callback);
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
export class NodePtyAdapter {
|
|
172
|
+
id = ADAPTER_ID;
|
|
173
|
+
spawnPty;
|
|
174
|
+
statCwd;
|
|
175
|
+
skipHelperEnsure;
|
|
176
|
+
constructor(options = {}) {
|
|
177
|
+
this.spawnPty = options.spawnPty ?? pty.spawn;
|
|
178
|
+
this.statCwd = options.statCwd ?? statSync;
|
|
179
|
+
this.skipHelperEnsure = options.skipHelperEnsure ?? false;
|
|
180
|
+
}
|
|
181
|
+
async spawn(input) {
|
|
182
|
+
if (!this.skipHelperEnsure)
|
|
183
|
+
ensureNodePtySpawnHelperExecutable();
|
|
184
|
+
return this.spawnSyncInternal(input);
|
|
185
|
+
}
|
|
186
|
+
spawnSync(input) {
|
|
187
|
+
if (!this.skipHelperEnsure)
|
|
188
|
+
ensureNodePtySpawnHelperExecutable();
|
|
189
|
+
return this.spawnSyncInternal(input);
|
|
190
|
+
}
|
|
191
|
+
spawnSyncInternal(input) {
|
|
192
|
+
assertValidCwd(input.cwd, this.statCwd);
|
|
193
|
+
if (!Number.isInteger(input.cols) || input.cols <= 0) {
|
|
194
|
+
throw new PtySpawnError({
|
|
195
|
+
adapter: ADAPTER_ID,
|
|
196
|
+
code: "unknown",
|
|
197
|
+
message: `cols must be a positive integer (got ${input.cols})`,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
if (!Number.isInteger(input.rows) || input.rows <= 0) {
|
|
201
|
+
throw new PtySpawnError({
|
|
202
|
+
adapter: ADAPTER_ID,
|
|
203
|
+
code: "unknown",
|
|
204
|
+
message: `rows must be a positive integer (got ${input.rows})`,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
// node-pty wants `Record<string, string>` for env — strip undefined values.
|
|
208
|
+
const env = {};
|
|
209
|
+
for (const [key, value] of Object.entries(input.env)) {
|
|
210
|
+
if (typeof value === "string")
|
|
211
|
+
env[key] = value;
|
|
212
|
+
}
|
|
213
|
+
let child;
|
|
214
|
+
try {
|
|
215
|
+
child = this.spawnPty(input.shell, [...(input.args ?? [])], {
|
|
216
|
+
name: input.name ?? "xterm-256color",
|
|
217
|
+
cols: input.cols,
|
|
218
|
+
rows: input.rows,
|
|
219
|
+
cwd: input.cwd,
|
|
220
|
+
env,
|
|
221
|
+
encoding: input.encoding === "utf8" ? "utf8" : null,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
const errno = err?.code;
|
|
226
|
+
if (errno === "ENOENT") {
|
|
227
|
+
throw new PtySpawnError({
|
|
228
|
+
adapter: ADAPTER_ID,
|
|
229
|
+
code: "shell_not_found",
|
|
230
|
+
message: `shell not found in PATH: ${input.shell}`,
|
|
231
|
+
cause: err,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
if (errno === "EACCES" || errno === "EPERM") {
|
|
235
|
+
throw new PtySpawnError({
|
|
236
|
+
adapter: ADAPTER_ID,
|
|
237
|
+
code: "permission_denied",
|
|
238
|
+
message: `permission denied spawning ${input.shell}`,
|
|
239
|
+
cause: err,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
throw new PtySpawnError({
|
|
243
|
+
adapter: ADAPTER_ID,
|
|
244
|
+
code: "unknown",
|
|
245
|
+
message: `node-pty spawn failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
246
|
+
cause: err,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
return new NodePtyProcess(child);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/** Convenience singleton — most call sites just want `defaultNodePtyAdapter`. */
|
|
253
|
+
export const defaultNodePtyAdapter = new NodePtyAdapter();
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PtyAdapter — terminal PTY adapter service contract (T087).
|
|
3
|
+
*
|
|
4
|
+
* Defines the process primitives required by terminal session management
|
|
5
|
+
* without binding to a specific PTY implementation. Mirrors t3's
|
|
6
|
+
* `apps/server/src/terminal/Services/PTY.ts` shape minus the Effect runtime
|
|
7
|
+
* (Effect adoption is G14-T07 territory; we stay on plain TS Promises here).
|
|
8
|
+
*
|
|
9
|
+
* Why:
|
|
10
|
+
* - `node-pty` is a native module whose `onData` callback never fires
|
|
11
|
+
* under Bun (T085 burned half a day on the diagnosis). Routing every
|
|
12
|
+
* daemon-side PTY spawn through this interface lets us swap runtimes
|
|
13
|
+
* without touching consumers and lets tests stub the entire layer with
|
|
14
|
+
* a `MockPtyAdapter` that returns scripted output.
|
|
15
|
+
* - The Electron preload + future remote-PTY transports will eventually
|
|
16
|
+
* ship their own adapters. Keeping the seam thin makes that drop-in.
|
|
17
|
+
*
|
|
18
|
+
* Synchronous vs async:
|
|
19
|
+
* - `spawn(input): Promise<PtyProcess>` is the canonical entry point.
|
|
20
|
+
* Async because some adapters do real setup (e.g. NodePtyAdapter chmods
|
|
21
|
+
* node-pty's `spawn-helper` binary the first time, t3 does the same).
|
|
22
|
+
* - `spawnSync(input): PtyProcess` is a sibling for legacy synchronous
|
|
23
|
+
* callers (today: `PtyBridge.spawn` in `server/pty-bridge.ts`). It MUST
|
|
24
|
+
* have the same observable semantics as `spawn` once any one-shot setup
|
|
25
|
+
* has been done. Adapters that genuinely need async work should throw
|
|
26
|
+
* `PtySpawnError` ("sync_unsupported") from `spawnSync` so the caller
|
|
27
|
+
* can fall back to the async path.
|
|
28
|
+
*/
|
|
29
|
+
export interface PtySpawnInput {
|
|
30
|
+
/** Executable to run. Defaults are adapter-defined when omitted. */
|
|
31
|
+
shell: string;
|
|
32
|
+
/** Argv for the executable (without argv[0]). Optional; adapters may apply defaults. */
|
|
33
|
+
args?: ReadonlyArray<string>;
|
|
34
|
+
/** Working directory for the spawned process. Must exist + be a directory. */
|
|
35
|
+
cwd: string;
|
|
36
|
+
/** Initial cols. Must be a positive integer. */
|
|
37
|
+
cols: number;
|
|
38
|
+
/** Initial rows. Must be a positive integer. */
|
|
39
|
+
rows: number;
|
|
40
|
+
/** Environment vars handed to the child. */
|
|
41
|
+
env: NodeJS.ProcessEnv;
|
|
42
|
+
/**
|
|
43
|
+
* Terminal name (`$TERM`) handed to the child. Defaults to
|
|
44
|
+
* `xterm-256color` when omitted. Some adapters honour it, some pin it.
|
|
45
|
+
*/
|
|
46
|
+
name?: string;
|
|
47
|
+
/**
|
|
48
|
+
* Output encoding. `null` (default) yields raw `Buffer` data — required
|
|
49
|
+
* for byte-accurate WebSocket bridging.
|
|
50
|
+
*/
|
|
51
|
+
encoding?: "utf8" | null;
|
|
52
|
+
}
|
|
53
|
+
export interface PtyExitEvent {
|
|
54
|
+
/** Process exit code. `0` is clean shutdown. */
|
|
55
|
+
exitCode: number;
|
|
56
|
+
/** Terminating signal (numeric), or `null` when the process exited cleanly. */
|
|
57
|
+
signal: number | null;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Handle to a live PTY child returned by `PtyAdapter.spawn`. Modelled on
|
|
61
|
+
* t3's `PtyProcess` and `node-pty`'s `IPty` so wrapping is trivial.
|
|
62
|
+
*
|
|
63
|
+
* Listeners returned by `onData`/`onExit` are disposers — call them to
|
|
64
|
+
* detach. After `kill()` the adapter is expected to emit a single
|
|
65
|
+
* synthetic `onExit` event so the bridge layer can converge on shutdown.
|
|
66
|
+
*/
|
|
67
|
+
export interface PtyProcess {
|
|
68
|
+
/** Underlying OS PID (or a synthetic positive integer for mocks). */
|
|
69
|
+
readonly pid: number;
|
|
70
|
+
/** Write raw bytes (string is interpreted as UTF-8) into the child stdin. */
|
|
71
|
+
write(data: string | Uint8Array): void;
|
|
72
|
+
/** Resize the controlling terminal. */
|
|
73
|
+
resize(cols: number, rows: number): void;
|
|
74
|
+
/**
|
|
75
|
+
* Send a signal to the child. Defaults to `SIGTERM` so adapters that
|
|
76
|
+
* can't deliver arbitrary signals (mocks, sandboxed remotes) still
|
|
77
|
+
* honour the common case.
|
|
78
|
+
*/
|
|
79
|
+
kill(signal?: NodeJS.Signals | number): void;
|
|
80
|
+
/**
|
|
81
|
+
* Subscribe to data emissions. Returns a disposer; calling it detaches
|
|
82
|
+
* the listener without affecting any sibling subscribers.
|
|
83
|
+
*/
|
|
84
|
+
onData(callback: (data: Buffer) => void): () => void;
|
|
85
|
+
/**
|
|
86
|
+
* Subscribe to exit. Returns a disposer. Adapters MUST guarantee at
|
|
87
|
+
* most one terminal `onExit` per process; resubscribing after exit is
|
|
88
|
+
* a no-op that returns an inert disposer.
|
|
89
|
+
*/
|
|
90
|
+
onExit(callback: (event: PtyExitEvent) => void): () => void;
|
|
91
|
+
}
|
|
92
|
+
/** Discriminator codes for `PtySpawnError`. */
|
|
93
|
+
export type PtySpawnErrorCode = "cwd_invalid" | "shell_not_found" | "permission_denied" | "sync_unsupported" | "unknown";
|
|
94
|
+
/**
|
|
95
|
+
* Typed failure for `PtyAdapter.spawn` / `spawnSync`. Adapters MUST throw
|
|
96
|
+
* (or reject with) this class so the WS bridge can translate to a
|
|
97
|
+
* structured error frame without sniffing native error message strings.
|
|
98
|
+
*/
|
|
99
|
+
export declare class PtySpawnError extends Error {
|
|
100
|
+
readonly adapter: string;
|
|
101
|
+
readonly code: PtySpawnErrorCode;
|
|
102
|
+
constructor(args: {
|
|
103
|
+
adapter: string;
|
|
104
|
+
code: PtySpawnErrorCode;
|
|
105
|
+
message: string;
|
|
106
|
+
cause?: unknown;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The adapter contract every PTY backend must satisfy. Async is the
|
|
111
|
+
* canonical surface; `spawnSync` is provided for the synchronous callers
|
|
112
|
+
* that exist today (PtyBridge / ws-route). New code should prefer `spawn`.
|
|
113
|
+
*/
|
|
114
|
+
export interface PtyAdapter {
|
|
115
|
+
/** Human-readable adapter id, surfaced in `PtySpawnError.adapter`. */
|
|
116
|
+
readonly id: string;
|
|
117
|
+
/** Canonical async spawn. Resolves once the child PID is known. */
|
|
118
|
+
spawn(input: PtySpawnInput): Promise<PtyProcess>;
|
|
119
|
+
/**
|
|
120
|
+
* Synchronous spawn. Adapters that can't satisfy this (because they
|
|
121
|
+
* need async setup) MUST throw `PtySpawnError({ code: "sync_unsupported" })`.
|
|
122
|
+
*/
|
|
123
|
+
spawnSync(input: PtySpawnInput): PtyProcess;
|
|
124
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PtyAdapter — terminal PTY adapter service contract (T087).
|
|
3
|
+
*
|
|
4
|
+
* Defines the process primitives required by terminal session management
|
|
5
|
+
* without binding to a specific PTY implementation. Mirrors t3's
|
|
6
|
+
* `apps/server/src/terminal/Services/PTY.ts` shape minus the Effect runtime
|
|
7
|
+
* (Effect adoption is G14-T07 territory; we stay on plain TS Promises here).
|
|
8
|
+
*
|
|
9
|
+
* Why:
|
|
10
|
+
* - `node-pty` is a native module whose `onData` callback never fires
|
|
11
|
+
* under Bun (T085 burned half a day on the diagnosis). Routing every
|
|
12
|
+
* daemon-side PTY spawn through this interface lets us swap runtimes
|
|
13
|
+
* without touching consumers and lets tests stub the entire layer with
|
|
14
|
+
* a `MockPtyAdapter` that returns scripted output.
|
|
15
|
+
* - The Electron preload + future remote-PTY transports will eventually
|
|
16
|
+
* ship their own adapters. Keeping the seam thin makes that drop-in.
|
|
17
|
+
*
|
|
18
|
+
* Synchronous vs async:
|
|
19
|
+
* - `spawn(input): Promise<PtyProcess>` is the canonical entry point.
|
|
20
|
+
* Async because some adapters do real setup (e.g. NodePtyAdapter chmods
|
|
21
|
+
* node-pty's `spawn-helper` binary the first time, t3 does the same).
|
|
22
|
+
* - `spawnSync(input): PtyProcess` is a sibling for legacy synchronous
|
|
23
|
+
* callers (today: `PtyBridge.spawn` in `server/pty-bridge.ts`). It MUST
|
|
24
|
+
* have the same observable semantics as `spawn` once any one-shot setup
|
|
25
|
+
* has been done. Adapters that genuinely need async work should throw
|
|
26
|
+
* `PtySpawnError` ("sync_unsupported") from `spawnSync` so the caller
|
|
27
|
+
* can fall back to the async path.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* Typed failure for `PtyAdapter.spawn` / `spawnSync`. Adapters MUST throw
|
|
31
|
+
* (or reject with) this class so the WS bridge can translate to a
|
|
32
|
+
* structured error frame without sniffing native error message strings.
|
|
33
|
+
*/
|
|
34
|
+
export class PtySpawnError extends Error {
|
|
35
|
+
adapter;
|
|
36
|
+
code;
|
|
37
|
+
constructor(args) {
|
|
38
|
+
super(args.message, args.cause !== undefined ? { cause: args.cause } : undefined);
|
|
39
|
+
this.name = "PtySpawnError";
|
|
40
|
+
this.adapter = args.adapter;
|
|
41
|
+
this.code = args.code;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MockPtyAdapter — scripted PTY backend for tests (T087).
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the `PtyAdapter` contract but spawns no real processes. Every
|
|
5
|
+
* call to {@link MockPtyAdapter.spawn} or {@link MockPtyAdapter.spawnSync}
|
|
6
|
+
* returns a fresh {@link MockPtyProcess} the test then drives manually via
|
|
7
|
+
* {@link MockPtyProcess.pushOutput} / {@link MockPtyProcess.emitExit}.
|
|
8
|
+
*
|
|
9
|
+
* Drop-in for any layer that takes a `PtyAdapter`. The adapter also keeps
|
|
10
|
+
* a `spawnLog` of every `PtySpawnInput` so tests can assert wiring without
|
|
11
|
+
* inspecting node-pty internals.
|
|
12
|
+
*
|
|
13
|
+
* Why this lives under `__tests__/`: it is purely test infrastructure and
|
|
14
|
+
* MUST NOT be bundled into the production daemon. Vitest's `include`
|
|
15
|
+
* pulls it in implicitly when sibling tests import it.
|
|
16
|
+
*/
|
|
17
|
+
import { PtySpawnError, type PtyAdapter, type PtyExitEvent, type PtyProcess, type PtySpawnInput } from "../PtyAdapter.ts";
|
|
18
|
+
export interface MockPtyOptions {
|
|
19
|
+
/** Force `spawn` to reject with this error. Used by error-path tests. */
|
|
20
|
+
failNext?: {
|
|
21
|
+
code: PtySpawnError["code"];
|
|
22
|
+
message: string;
|
|
23
|
+
};
|
|
24
|
+
/** When true, throw `sync_unsupported` from `spawnSync` to exercise async fallback. */
|
|
25
|
+
syncUnsupported?: boolean;
|
|
26
|
+
/** Synthetic starting pid for spawned processes; auto-increments. */
|
|
27
|
+
startingPid?: number;
|
|
28
|
+
}
|
|
29
|
+
export declare class MockPtyProcess implements PtyProcess {
|
|
30
|
+
readonly pid: number;
|
|
31
|
+
/** Append-only log of every `write(...)` call so tests can assert input. */
|
|
32
|
+
readonly writeLog: Array<string | Uint8Array>;
|
|
33
|
+
/** Append-only log of every `resize(...)` call. */
|
|
34
|
+
readonly resizeLog: Array<{
|
|
35
|
+
cols: number;
|
|
36
|
+
rows: number;
|
|
37
|
+
}>;
|
|
38
|
+
/** Records the last signal observed by `kill(...)`. */
|
|
39
|
+
killed: NodeJS.Signals | number | null;
|
|
40
|
+
private exited;
|
|
41
|
+
private readonly dataListeners;
|
|
42
|
+
private readonly exitListeners;
|
|
43
|
+
private readonly _input;
|
|
44
|
+
constructor(pid: number, input: PtySpawnInput);
|
|
45
|
+
/** Original spawn input — handy for assertions. */
|
|
46
|
+
get spawnInput(): PtySpawnInput;
|
|
47
|
+
write(data: string | Uint8Array): void;
|
|
48
|
+
resize(cols: number, rows: number): void;
|
|
49
|
+
kill(signal?: NodeJS.Signals | number): void;
|
|
50
|
+
onData(callback: (data: Buffer) => void): () => void;
|
|
51
|
+
onExit(callback: (event: PtyExitEvent) => void): () => void;
|
|
52
|
+
/** Push synthetic PTY output bytes to every `onData` subscriber. */
|
|
53
|
+
pushOutput(data: string | Uint8Array | Buffer): void;
|
|
54
|
+
/** Fire the terminal exit event (idempotent — subsequent calls are no-ops). */
|
|
55
|
+
emitExit(event: PtyExitEvent): void;
|
|
56
|
+
/** Number of currently attached data listeners — handy for leak assertions. */
|
|
57
|
+
get dataListenerCount(): number;
|
|
58
|
+
/** Number of currently attached exit listeners. */
|
|
59
|
+
get exitListenerCount(): number;
|
|
60
|
+
}
|
|
61
|
+
export declare class MockPtyAdapter implements PtyAdapter {
|
|
62
|
+
readonly id = "mock";
|
|
63
|
+
readonly spawnLog: PtySpawnInput[];
|
|
64
|
+
readonly spawned: MockPtyProcess[];
|
|
65
|
+
private nextPid;
|
|
66
|
+
private _failNext;
|
|
67
|
+
private readonly syncUnsupported;
|
|
68
|
+
constructor(options?: MockPtyOptions);
|
|
69
|
+
/** Arm the next spawn to throw a typed error. */
|
|
70
|
+
failNext(code: PtySpawnError["code"], message: string): void;
|
|
71
|
+
spawn(input: PtySpawnInput): Promise<PtyProcess>;
|
|
72
|
+
spawnSync(input: PtySpawnInput): PtyProcess;
|
|
73
|
+
/** Read-only view of all spawns so tests can assert wiring. */
|
|
74
|
+
get spawnCount(): number;
|
|
75
|
+
/** The most recently spawned mock process, or `null` if there were none. */
|
|
76
|
+
lastSpawned(): MockPtyProcess | null;
|
|
77
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MockPtyAdapter — scripted PTY backend for tests (T087).
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the `PtyAdapter` contract but spawns no real processes. Every
|
|
5
|
+
* call to {@link MockPtyAdapter.spawn} or {@link MockPtyAdapter.spawnSync}
|
|
6
|
+
* returns a fresh {@link MockPtyProcess} the test then drives manually via
|
|
7
|
+
* {@link MockPtyProcess.pushOutput} / {@link MockPtyProcess.emitExit}.
|
|
8
|
+
*
|
|
9
|
+
* Drop-in for any layer that takes a `PtyAdapter`. The adapter also keeps
|
|
10
|
+
* a `spawnLog` of every `PtySpawnInput` so tests can assert wiring without
|
|
11
|
+
* inspecting node-pty internals.
|
|
12
|
+
*
|
|
13
|
+
* Why this lives under `__tests__/`: it is purely test infrastructure and
|
|
14
|
+
* MUST NOT be bundled into the production daemon. Vitest's `include`
|
|
15
|
+
* pulls it in implicitly when sibling tests import it.
|
|
16
|
+
*/
|
|
17
|
+
import { PtySpawnError, } from "../PtyAdapter.js";
|
|
18
|
+
export class MockPtyProcess {
|
|
19
|
+
pid;
|
|
20
|
+
/** Append-only log of every `write(...)` call so tests can assert input. */
|
|
21
|
+
writeLog = [];
|
|
22
|
+
/** Append-only log of every `resize(...)` call. */
|
|
23
|
+
resizeLog = [];
|
|
24
|
+
/** Records the last signal observed by `kill(...)`. */
|
|
25
|
+
killed = null;
|
|
26
|
+
exited = false;
|
|
27
|
+
dataListeners = new Set();
|
|
28
|
+
exitListeners = new Set();
|
|
29
|
+
_input;
|
|
30
|
+
constructor(pid, input) {
|
|
31
|
+
this.pid = pid;
|
|
32
|
+
this._input = input;
|
|
33
|
+
}
|
|
34
|
+
/** Original spawn input — handy for assertions. */
|
|
35
|
+
get spawnInput() {
|
|
36
|
+
return this._input;
|
|
37
|
+
}
|
|
38
|
+
write(data) {
|
|
39
|
+
if (this.exited)
|
|
40
|
+
return;
|
|
41
|
+
this.writeLog.push(data);
|
|
42
|
+
}
|
|
43
|
+
resize(cols, rows) {
|
|
44
|
+
if (this.exited)
|
|
45
|
+
return;
|
|
46
|
+
this.resizeLog.push({ cols, rows });
|
|
47
|
+
}
|
|
48
|
+
kill(signal) {
|
|
49
|
+
if (this.exited)
|
|
50
|
+
return;
|
|
51
|
+
this.killed = signal ?? "SIGTERM";
|
|
52
|
+
// Synthesize an exit so subscribers detach cleanly — matches the
|
|
53
|
+
// node-pty fallback inside NodePtyAdapter.
|
|
54
|
+
this.emitExit({ exitCode: 0, signal: typeof signal === "number" ? signal : null });
|
|
55
|
+
}
|
|
56
|
+
onData(callback) {
|
|
57
|
+
this.dataListeners.add(callback);
|
|
58
|
+
return () => {
|
|
59
|
+
this.dataListeners.delete(callback);
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
onExit(callback) {
|
|
63
|
+
if (this.exited)
|
|
64
|
+
return () => undefined;
|
|
65
|
+
this.exitListeners.add(callback);
|
|
66
|
+
return () => {
|
|
67
|
+
this.exitListeners.delete(callback);
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// ------------------------------------------------------------------
|
|
71
|
+
// Test-only drivers — never called by production code.
|
|
72
|
+
// ------------------------------------------------------------------
|
|
73
|
+
/** Push synthetic PTY output bytes to every `onData` subscriber. */
|
|
74
|
+
pushOutput(data) {
|
|
75
|
+
if (this.exited)
|
|
76
|
+
return;
|
|
77
|
+
const buf = data instanceof Buffer
|
|
78
|
+
? data
|
|
79
|
+
: typeof data === "string"
|
|
80
|
+
? Buffer.from(data, "utf8")
|
|
81
|
+
: Buffer.from(data);
|
|
82
|
+
for (const listener of this.dataListeners)
|
|
83
|
+
listener(buf);
|
|
84
|
+
}
|
|
85
|
+
/** Fire the terminal exit event (idempotent — subsequent calls are no-ops). */
|
|
86
|
+
emitExit(event) {
|
|
87
|
+
if (this.exited)
|
|
88
|
+
return;
|
|
89
|
+
this.exited = true;
|
|
90
|
+
for (const listener of this.exitListeners)
|
|
91
|
+
listener(event);
|
|
92
|
+
}
|
|
93
|
+
/** Number of currently attached data listeners — handy for leak assertions. */
|
|
94
|
+
get dataListenerCount() {
|
|
95
|
+
return this.dataListeners.size;
|
|
96
|
+
}
|
|
97
|
+
/** Number of currently attached exit listeners. */
|
|
98
|
+
get exitListenerCount() {
|
|
99
|
+
return this.exitListeners.size;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
export class MockPtyAdapter {
|
|
103
|
+
id = "mock";
|
|
104
|
+
spawnLog = [];
|
|
105
|
+
spawned = [];
|
|
106
|
+
nextPid;
|
|
107
|
+
_failNext;
|
|
108
|
+
syncUnsupported;
|
|
109
|
+
constructor(options = {}) {
|
|
110
|
+
this.nextPid = options.startingPid ?? 100_000;
|
|
111
|
+
this._failNext = options.failNext;
|
|
112
|
+
this.syncUnsupported = options.syncUnsupported ?? false;
|
|
113
|
+
}
|
|
114
|
+
/** Arm the next spawn to throw a typed error. */
|
|
115
|
+
failNext(code, message) {
|
|
116
|
+
this._failNext = { code, message };
|
|
117
|
+
}
|
|
118
|
+
async spawn(input) {
|
|
119
|
+
if (this._failNext) {
|
|
120
|
+
const err = this._failNext;
|
|
121
|
+
this._failNext = undefined;
|
|
122
|
+
throw new PtySpawnError({ adapter: this.id, code: err.code, message: err.message });
|
|
123
|
+
}
|
|
124
|
+
this.spawnLog.push(input);
|
|
125
|
+
const proc = new MockPtyProcess(this.nextPid++, input);
|
|
126
|
+
this.spawned.push(proc);
|
|
127
|
+
return proc;
|
|
128
|
+
}
|
|
129
|
+
spawnSync(input) {
|
|
130
|
+
if (this.syncUnsupported) {
|
|
131
|
+
throw new PtySpawnError({
|
|
132
|
+
adapter: this.id,
|
|
133
|
+
code: "sync_unsupported",
|
|
134
|
+
message: "MockPtyAdapter is configured with syncUnsupported=true",
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
if (this._failNext) {
|
|
138
|
+
const err = this._failNext;
|
|
139
|
+
this._failNext = undefined;
|
|
140
|
+
throw new PtySpawnError({ adapter: this.id, code: err.code, message: err.message });
|
|
141
|
+
}
|
|
142
|
+
this.spawnLog.push(input);
|
|
143
|
+
const proc = new MockPtyProcess(this.nextPid++, input);
|
|
144
|
+
this.spawned.push(proc);
|
|
145
|
+
return proc;
|
|
146
|
+
}
|
|
147
|
+
/** Read-only view of all spawns so tests can assert wiring. */
|
|
148
|
+
get spawnCount() {
|
|
149
|
+
return this.spawnLog.length;
|
|
150
|
+
}
|
|
151
|
+
/** The most recently spawned mock process, or `null` if there were none. */
|
|
152
|
+
lastSpawned() {
|
|
153
|
+
return this.spawned.at(-1) ?? null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|