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,12 @@
|
|
|
1
|
+
import { basename } from "node:path";
|
|
2
|
+
import { getSessionName } from "../../../lib/yaml-io.js";
|
|
3
|
+
import { resolveProject } from "./_resolve-project.js";
|
|
4
|
+
export function resolveProjectContext(input, deps = {}) {
|
|
5
|
+
if (input.projectName) {
|
|
6
|
+
const project = resolveProject(input.projectName, deps);
|
|
7
|
+
return { dir: project.dir, sessionName: project.sessionName };
|
|
8
|
+
}
|
|
9
|
+
const dir = deps.cwd ?? process.cwd();
|
|
10
|
+
const sessionName = getSessionName(dir).name || basename(dir);
|
|
11
|
+
return { dir, sessionName };
|
|
12
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helper: resolve a registered project by name and project the
|
|
3
|
+
* fields the action handlers actually consume.
|
|
4
|
+
*
|
|
5
|
+
* Lives in handlers/ so the registry stays the only public surface; tests
|
|
6
|
+
* import from here directly.
|
|
7
|
+
*/
|
|
8
|
+
import type { RegisteredProject } from "../../../schemas/registry.ts";
|
|
9
|
+
export interface ResolvedProject {
|
|
10
|
+
name: string;
|
|
11
|
+
dir: string;
|
|
12
|
+
sessionName: string;
|
|
13
|
+
/**
|
|
14
|
+
* `true` when the project was resolved from a live tmux session
|
|
15
|
+
* (rather than the registry). Useful for handlers that want to
|
|
16
|
+
* auto-register on first action — out of scope for this slice but
|
|
17
|
+
* makes the intent explicit at the boundary.
|
|
18
|
+
*/
|
|
19
|
+
fromLiveSession: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface ProjectResolverDeps {
|
|
22
|
+
/** Override for tests — must satisfy the same contract as `getProject`. */
|
|
23
|
+
getProject?: (name: string) => RegisteredProject | null;
|
|
24
|
+
/** Override the live-session existence probe. */
|
|
25
|
+
hasSession?: (session: string) => boolean;
|
|
26
|
+
/** Override the live-session cwd lookup. */
|
|
27
|
+
getSessionCwd?: (session: string) => string | null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Resolve a project by name. The registry is the canonical source of
|
|
31
|
+
* truth, but as a fallback we also accept a live tmux session by the
|
|
32
|
+
* same name — the dashboard merges registered projects + live sessions
|
|
33
|
+
* in its sidebar, so action handlers must accept either. Throws an
|
|
34
|
+
* {@link ActionError} with code `project_not_found` when neither path
|
|
35
|
+
* succeeds.
|
|
36
|
+
*
|
|
37
|
+
* Note: the registry does not currently persist a session name distinct
|
|
38
|
+
* from the project name, so the session name returned here mirrors the
|
|
39
|
+
* project name. If they diverge in the future, this is the only call site
|
|
40
|
+
* that needs to change.
|
|
41
|
+
*/
|
|
42
|
+
export declare function resolveProject(name: string, deps?: ProjectResolverDeps): ResolvedProject;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helper: resolve a registered project by name and project the
|
|
3
|
+
* fields the action handlers actually consume.
|
|
4
|
+
*
|
|
5
|
+
* Lives in handlers/ so the registry stays the only public surface; tests
|
|
6
|
+
* import from here directly.
|
|
7
|
+
*/
|
|
8
|
+
import { getProject as getRegisteredProject } from "../../../lib/project-registry.js";
|
|
9
|
+
import { getSessionCwd as getSessionCwdDefault, hasSession as hasSessionDefault, } from "@tmux-ide/tmux-bridge";
|
|
10
|
+
import { ActionError } from "../errors.js";
|
|
11
|
+
/**
|
|
12
|
+
* Resolve a project by name. The registry is the canonical source of
|
|
13
|
+
* truth, but as a fallback we also accept a live tmux session by the
|
|
14
|
+
* same name — the dashboard merges registered projects + live sessions
|
|
15
|
+
* in its sidebar, so action handlers must accept either. Throws an
|
|
16
|
+
* {@link ActionError} with code `project_not_found` when neither path
|
|
17
|
+
* succeeds.
|
|
18
|
+
*
|
|
19
|
+
* Note: the registry does not currently persist a session name distinct
|
|
20
|
+
* from the project name, so the session name returned here mirrors the
|
|
21
|
+
* project name. If they diverge in the future, this is the only call site
|
|
22
|
+
* that needs to change.
|
|
23
|
+
*/
|
|
24
|
+
export function resolveProject(name, deps = {}) {
|
|
25
|
+
const lookup = deps.getProject ?? getRegisteredProject;
|
|
26
|
+
const project = lookup(name);
|
|
27
|
+
if (project) {
|
|
28
|
+
return {
|
|
29
|
+
name: project.name,
|
|
30
|
+
dir: project.dir,
|
|
31
|
+
sessionName: project.name,
|
|
32
|
+
fromLiveSession: false,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// Registry miss — fall back to a live tmux session of the same name.
|
|
36
|
+
const hasSession = deps.hasSession ?? hasSessionDefault;
|
|
37
|
+
if (hasSession(name)) {
|
|
38
|
+
const cwd = (deps.getSessionCwd ?? getSessionCwdDefault)(name);
|
|
39
|
+
if (cwd) {
|
|
40
|
+
return { name, dir: cwd, sessionName: name, fromLiveSession: true };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
throw new ActionError({
|
|
44
|
+
code: "project_not_found",
|
|
45
|
+
message: `Project "${name}" not found in registry or as a live tmux session`,
|
|
46
|
+
details: { name },
|
|
47
|
+
});
|
|
48
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type AppSettings } from "../../../lib/app-settings.ts";
|
|
2
|
+
import type { ActionInput, ActionResult } from "../contract.ts";
|
|
3
|
+
export interface RemoteAccessRestartRequest {
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
bindHostname: "0.0.0.0" | "127.0.0.1";
|
|
6
|
+
token: string | null;
|
|
7
|
+
port?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface RemoteAccessRestartResult {
|
|
10
|
+
port?: number;
|
|
11
|
+
host?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface AppSetRemoteAccessDeps {
|
|
14
|
+
readSettings?: () => AppSettings;
|
|
15
|
+
writeSettings?: (next: AppSettings) => void;
|
|
16
|
+
generateToken?: () => string;
|
|
17
|
+
restartDaemon?: (request: RemoteAccessRestartRequest) => Promise<RemoteAccessRestartResult> | RemoteAccessRestartResult;
|
|
18
|
+
deferRestart?: (restart: () => void) => void;
|
|
19
|
+
port?: number;
|
|
20
|
+
host?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function setRemoteAccessRestartBackend(backend: ((request: RemoteAccessRestartRequest) => Promise<RemoteAccessRestartResult> | RemoteAccessRestartResult) | null): void;
|
|
23
|
+
export declare function appSetRemoteAccessHandler(input: ActionInput<"app.setRemoteAccess">, deps?: AppSetRemoteAccessDeps): Promise<ActionResult<"app.setRemoteAccess">>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { hostname, networkInterfaces } from "node:os";
|
|
2
|
+
import { generateAuthToken } from "../../../lib/auth-token.js";
|
|
3
|
+
import { readAppSettings, writeAppSettings } from "../../../lib/app-settings.js";
|
|
4
|
+
let remoteAccessRestartBackend = null;
|
|
5
|
+
export function setRemoteAccessRestartBackend(backend) {
|
|
6
|
+
remoteAccessRestartBackend = backend;
|
|
7
|
+
}
|
|
8
|
+
function currentPort(deps) {
|
|
9
|
+
const envPort = Number(process.env.TMUX_IDE_DAEMON_PORT);
|
|
10
|
+
return deps.port ?? (Number.isInteger(envPort) && envPort > 0 ? envPort : 6060);
|
|
11
|
+
}
|
|
12
|
+
function primaryLanHost() {
|
|
13
|
+
const interfaces = networkInterfaces();
|
|
14
|
+
for (const entries of Object.values(interfaces)) {
|
|
15
|
+
for (const entry of entries ?? []) {
|
|
16
|
+
if (entry.family === "IPv4" && !entry.internal)
|
|
17
|
+
return entry.address;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return hostname();
|
|
21
|
+
}
|
|
22
|
+
function buildUrl(host, port) {
|
|
23
|
+
return `http://${host}:${port}`;
|
|
24
|
+
}
|
|
25
|
+
function defaultDeferRestart(restart) {
|
|
26
|
+
setImmediate(restart);
|
|
27
|
+
}
|
|
28
|
+
export async function appSetRemoteAccessHandler(input, deps = {}) {
|
|
29
|
+
const readSettings = deps.readSettings ?? readAppSettings;
|
|
30
|
+
const writeSettings = deps.writeSettings ?? writeAppSettings;
|
|
31
|
+
const nextEnabled = input.enabled;
|
|
32
|
+
const current = readSettings();
|
|
33
|
+
const token = nextEnabled
|
|
34
|
+
? (current.remoteAccess.token ?? (deps.generateToken ?? generateAuthToken)())
|
|
35
|
+
: null;
|
|
36
|
+
const next = {
|
|
37
|
+
...current,
|
|
38
|
+
remoteAccess: { enabled: nextEnabled, token },
|
|
39
|
+
};
|
|
40
|
+
writeSettings(next);
|
|
41
|
+
const port = currentPort(deps);
|
|
42
|
+
const request = {
|
|
43
|
+
enabled: nextEnabled,
|
|
44
|
+
bindHostname: nextEnabled ? "0.0.0.0" : "127.0.0.1",
|
|
45
|
+
token,
|
|
46
|
+
port,
|
|
47
|
+
};
|
|
48
|
+
const restartDaemon = deps.restartDaemon ?? remoteAccessRestartBackend;
|
|
49
|
+
if (restartDaemon) {
|
|
50
|
+
(deps.deferRestart ?? defaultDeferRestart)(() => {
|
|
51
|
+
void Promise.resolve(restartDaemon(request)).catch((err) => {
|
|
52
|
+
console.error(`[actions] Failed to restart daemon for remote access: ${err.message ?? String(err)}`);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
if (!nextEnabled) {
|
|
57
|
+
return { enabled: false, url: null, token: null, qrPayload: null };
|
|
58
|
+
}
|
|
59
|
+
const host = deps.host ?? primaryLanHost();
|
|
60
|
+
const url = buildUrl(host, port);
|
|
61
|
+
return {
|
|
62
|
+
enabled: true,
|
|
63
|
+
url,
|
|
64
|
+
token,
|
|
65
|
+
qrPayload: `${url}?token=${encodeURIComponent(token ?? "")}`,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ActionInput, ActionResult } from "../contract.ts";
|
|
2
|
+
import { type ProjectContextDeps } from "./_project-context.ts";
|
|
3
|
+
interface ConfigActionDeps extends ProjectContextDeps {
|
|
4
|
+
broadcastConfigChanged?: (sessionName: string) => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function configSetHandler(input: ActionInput<"config.set">, deps?: ConfigActionDeps): ActionResult<"config.set">;
|
|
7
|
+
export declare function configAddPaneHandler(input: ActionInput<"config.addPane">, deps?: ConfigActionDeps): ActionResult<"config.addPane">;
|
|
8
|
+
export declare function configRemovePaneHandler(input: ActionInput<"config.removePane">, deps?: ConfigActionDeps): ActionResult<"config.removePane">;
|
|
9
|
+
export declare function configAddRowHandler(input: ActionInput<"config.addRow">, deps?: ConfigActionDeps): ActionResult<"config.addRow">;
|
|
10
|
+
export declare function configEnableTeamHandler(input: ActionInput<"config.enableTeam">, deps?: ConfigActionDeps): ActionResult<"config.enableTeam">;
|
|
11
|
+
export declare function configDisableTeamHandler(input: ActionInput<"config.disableTeam">, deps?: ConfigActionDeps): ActionResult<"config.disableTeam">;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { configAddPane, configAddRow, configDisableTeam, configEnableTeam, configRemovePane, configSetValue, } from "../../../config.js";
|
|
4
|
+
import { broadcastConfigChanged as broadcastConfigChangedDefault } from "../../ws-events.js";
|
|
5
|
+
import { ActionError } from "../errors.js";
|
|
6
|
+
import { resolveProjectContext } from "./_project-context.js";
|
|
7
|
+
function mutateConfigAction(input, deps, fn) {
|
|
8
|
+
const context = resolveProjectContext(input, deps);
|
|
9
|
+
if (!existsSync(join(context.dir, "ide.yml"))) {
|
|
10
|
+
throw new ActionError({
|
|
11
|
+
code: "ide_yml_missing",
|
|
12
|
+
message: "ide.yml was not found",
|
|
13
|
+
details: { dir: context.dir },
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const result = fn(context.dir);
|
|
18
|
+
(deps.broadcastConfigChanged ?? broadcastConfigChangedDefault)(context.sessionName);
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
const message = err.message ?? String(err);
|
|
23
|
+
throw new ActionError({
|
|
24
|
+
code: message.toLowerCase().includes("path")
|
|
25
|
+
? "config_path_invalid"
|
|
26
|
+
: "config_validation_failed",
|
|
27
|
+
message,
|
|
28
|
+
cause: err,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function configSetHandler(input, deps = {}) {
|
|
33
|
+
const config = mutateConfigAction(input, deps, (dir) => configSetValue(dir, input.path, input.value));
|
|
34
|
+
return { config };
|
|
35
|
+
}
|
|
36
|
+
export function configAddPaneHandler(input, deps = {}) {
|
|
37
|
+
const pane = {
|
|
38
|
+
title: input.title,
|
|
39
|
+
command: input.command,
|
|
40
|
+
type: input.type,
|
|
41
|
+
target: input.target,
|
|
42
|
+
dir: input.dir,
|
|
43
|
+
size: input.size,
|
|
44
|
+
focus: input.focus,
|
|
45
|
+
env: input.env,
|
|
46
|
+
role: input.role,
|
|
47
|
+
task: input.task,
|
|
48
|
+
specialty: input.specialty,
|
|
49
|
+
skill: input.skill,
|
|
50
|
+
};
|
|
51
|
+
const config = mutateConfigAction(input, deps, (dir) => configAddPane(dir, input.rowIndex, pane));
|
|
52
|
+
return { config };
|
|
53
|
+
}
|
|
54
|
+
export function configRemovePaneHandler(input, deps = {}) {
|
|
55
|
+
const config = mutateConfigAction(input, deps, (dir) => configRemovePane(dir, input.rowIndex, input.paneIndex)).config;
|
|
56
|
+
return { config };
|
|
57
|
+
}
|
|
58
|
+
export function configAddRowHandler(input, deps = {}) {
|
|
59
|
+
const config = mutateConfigAction(input, deps, (dir) => configAddRow(dir, input.size));
|
|
60
|
+
return { config };
|
|
61
|
+
}
|
|
62
|
+
export function configEnableTeamHandler(input, deps = {}) {
|
|
63
|
+
const config = mutateConfigAction(input, deps, (dir) => configEnableTeam(dir, input.name));
|
|
64
|
+
return { config };
|
|
65
|
+
}
|
|
66
|
+
export function configDisableTeamHandler(input, deps = {}) {
|
|
67
|
+
const config = mutateConfigAction(input, deps, (dir) => configDisableTeam(dir));
|
|
68
|
+
return { config };
|
|
69
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ActionInput, ActionResult } from "../contract.ts";
|
|
2
|
+
export interface DaemonShutdownDeps {
|
|
3
|
+
shutdown?: (reason: string | null) => Promise<void> | void;
|
|
4
|
+
}
|
|
5
|
+
export declare function setDaemonShutdownBackend(backend: ((reason: string | null) => Promise<void> | void) | null): void;
|
|
6
|
+
export declare function daemonShutdownHandler(input: ActionInput<"daemon.shutdown">, deps?: DaemonShutdownDeps): ActionResult<"daemon.shutdown">;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ActionError } from "../errors.js";
|
|
2
|
+
let shutdownBackend = null;
|
|
3
|
+
let shutdownInProgress = false;
|
|
4
|
+
export function setDaemonShutdownBackend(backend) {
|
|
5
|
+
shutdownBackend = backend;
|
|
6
|
+
if (!backend)
|
|
7
|
+
shutdownInProgress = false;
|
|
8
|
+
}
|
|
9
|
+
export function daemonShutdownHandler(input, deps = {}) {
|
|
10
|
+
if (shutdownInProgress) {
|
|
11
|
+
throw new ActionError({
|
|
12
|
+
code: "shutdown_already_in_progress",
|
|
13
|
+
message: "Daemon shutdown is already in progress",
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
shutdownInProgress = true;
|
|
17
|
+
const shutdown = deps.shutdown ?? shutdownBackend;
|
|
18
|
+
process.nextTick(() => {
|
|
19
|
+
void Promise.resolve(shutdown?.(input.reason ?? null)).catch((err) => {
|
|
20
|
+
console.error("[daemon] shutdown action failed:", err);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
return { stopping: true };
|
|
24
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ProjectActivationOptions } from "../../../lib/active-projects.ts";
|
|
2
|
+
import type { ActionInput, ActionResult } from "../contract.ts";
|
|
3
|
+
import { type ProjectResolverDeps } from "./_resolve-project.ts";
|
|
4
|
+
export interface ProjectActivateDeps extends ProjectResolverDeps {
|
|
5
|
+
activateProject?: (name: string, options?: ProjectActivationOptions) => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare function projectActivateHandler(input: ActionInput<"project.activate">, deps?: ProjectActivateDeps): Promise<ActionResult<"project.activate">>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { activateProject as activateProjectDefault } from "../../../lib/active-projects.js";
|
|
2
|
+
import { ActionError } from "../errors.js";
|
|
3
|
+
import { resolveProject } from "./_resolve-project.js";
|
|
4
|
+
export async function projectActivateHandler(input, deps = {}) {
|
|
5
|
+
const project = resolveProject(input.name, deps);
|
|
6
|
+
const activateProject = deps.activateProject ?? activateProjectDefault;
|
|
7
|
+
try {
|
|
8
|
+
await activateProject(project.name);
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
throw new ActionError({
|
|
12
|
+
code: "internal",
|
|
13
|
+
message: `Failed to activate project "${project.name}": ${err.message ?? String(err)}`,
|
|
14
|
+
details: { projectName: project.name },
|
|
15
|
+
cause: err,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return { active: true, projectName: project.name };
|
|
19
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler: `project.launch`.
|
|
3
|
+
*
|
|
4
|
+
* Idempotent programmatic launch. Resolves the project from the registry,
|
|
5
|
+
* checks whether a session is already running, and returns
|
|
6
|
+
* `{ started: false }` without invoking the launcher when so. Otherwise
|
|
7
|
+
* delegates to `src/launch.ts` with `attach: false`.
|
|
8
|
+
*/
|
|
9
|
+
import { type ActionInput, type ActionResult } from "../contract.ts";
|
|
10
|
+
import { type ProjectResolverDeps } from "./_resolve-project.ts";
|
|
11
|
+
export interface ProjectLaunchDeps extends ProjectResolverDeps {
|
|
12
|
+
hasSession?: (session: string) => boolean;
|
|
13
|
+
launch?: (dir: string, options: {
|
|
14
|
+
json: boolean;
|
|
15
|
+
attach: boolean;
|
|
16
|
+
}) => Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export declare function projectLaunchHandler(input: ActionInput<"project.launch">, deps?: ProjectLaunchDeps): Promise<ActionResult<"project.launch">>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler: `project.launch`.
|
|
3
|
+
*
|
|
4
|
+
* Idempotent programmatic launch. Resolves the project from the registry,
|
|
5
|
+
* checks whether a session is already running, and returns
|
|
6
|
+
* `{ started: false }` without invoking the launcher when so. Otherwise
|
|
7
|
+
* delegates to `src/launch.ts` with `attach: false`.
|
|
8
|
+
*/
|
|
9
|
+
import { hasSession as hasSessionDefault } from "@tmux-ide/tmux-bridge";
|
|
10
|
+
import { launch as launchDefault } from "../../../launch.js";
|
|
11
|
+
import { ActionError } from "../errors.js";
|
|
12
|
+
import { resolveProject } from "./_resolve-project.js";
|
|
13
|
+
import { getDefaultWorkspaceRegistry } from "../../../lib/workspace-registry.js";
|
|
14
|
+
/**
|
|
15
|
+
* Ensure the workspace registry knows about this project. The project
|
|
16
|
+
* registry (`registerProject`) only updates the project-list — but
|
|
17
|
+
* `discoverSessions` / `/api/project/:name` consult the WORKSPACE registry
|
|
18
|
+
* before returning anything. Without this sync, every dashboard fetch
|
|
19
|
+
* 404s for projects that weren't passed as the daemon's primary sessionName.
|
|
20
|
+
*/
|
|
21
|
+
function ensureWorkspaceRegistered(name, sessionName, dir) {
|
|
22
|
+
const reg = getDefaultWorkspaceRegistry();
|
|
23
|
+
if (reg.has(name))
|
|
24
|
+
return;
|
|
25
|
+
try {
|
|
26
|
+
reg.add({ name, sessionName, projectDir: dir });
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// ALREADY_EXISTS or persistence error — non-fatal; the next discover
|
|
30
|
+
// pass will pick it up if persistence eventually succeeds.
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export async function projectLaunchHandler(input, deps = {}) {
|
|
34
|
+
const project = resolveProject(input.name, deps);
|
|
35
|
+
const hasSession = deps.hasSession ?? hasSessionDefault;
|
|
36
|
+
if (hasSession(project.sessionName)) {
|
|
37
|
+
// Session already running — but the workspace registry may still be
|
|
38
|
+
// stale (e.g. tmux session created via curl, or daemon restarted).
|
|
39
|
+
// Sync before returning so /api/project/:name resolves.
|
|
40
|
+
ensureWorkspaceRegistered(project.name, project.sessionName, project.dir);
|
|
41
|
+
return { sessionName: project.sessionName, started: false };
|
|
42
|
+
}
|
|
43
|
+
const launch = deps.launch ?? launchDefault;
|
|
44
|
+
try {
|
|
45
|
+
await launch(project.dir, { json: false, attach: false });
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
throw new ActionError({
|
|
49
|
+
code: "launch_failed",
|
|
50
|
+
message: `Failed to launch session "${project.sessionName}": ${err.message ?? String(err)}`,
|
|
51
|
+
details: { sessionName: project.sessionName, dir: project.dir },
|
|
52
|
+
cause: err,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
// Freshly launched — workspace registry definitely needs the entry.
|
|
56
|
+
ensureWorkspaceRegistered(project.name, project.sessionName, project.dir);
|
|
57
|
+
return { sessionName: project.sessionName, started: true };
|
|
58
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler: `project.openTerminal`.
|
|
3
|
+
*
|
|
4
|
+
* Resolves the project's cwd from the registry, ensures the tmux session is
|
|
5
|
+
* running (launching it if necessary), and asserts the resolved cwd is a
|
|
6
|
+
* real directory. Returns the dashboard's stable terminal tab id together
|
|
7
|
+
* with the resolved cwd so the dashboard does not need to stitch together
|
|
8
|
+
* the registry / session / cwd paths itself.
|
|
9
|
+
*
|
|
10
|
+
* This is the action that swallows the seam where the dashboard previously
|
|
11
|
+
* juggled `/api/projects` + `/api/project/:name` to figure out where to
|
|
12
|
+
* open a terminal.
|
|
13
|
+
*/
|
|
14
|
+
import type { Stats } from "node:fs";
|
|
15
|
+
import { type ActionInput, type ActionResult } from "../contract.ts";
|
|
16
|
+
import { type ProjectResolverDeps } from "./_resolve-project.ts";
|
|
17
|
+
/**
|
|
18
|
+
* Build the dashboard-facing terminal tab id for a session's default
|
|
19
|
+
* terminal. Mirrors the layout state convention `terminal:<session>:default`.
|
|
20
|
+
* Centralised here so both this handler and tests share the source of truth.
|
|
21
|
+
*/
|
|
22
|
+
export declare function defaultTerminalTabId(sessionName: string): string;
|
|
23
|
+
export interface ProjectOpenTerminalDeps extends ProjectResolverDeps {
|
|
24
|
+
hasSession?: (session: string) => boolean;
|
|
25
|
+
launch?: (dir: string, options: {
|
|
26
|
+
json: boolean;
|
|
27
|
+
attach: boolean;
|
|
28
|
+
}) => Promise<void>;
|
|
29
|
+
statCwd?: (cwd: string) => Stats;
|
|
30
|
+
activateProject?: (name: string) => Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
export declare function projectOpenTerminalHandler(input: ActionInput<"project.openTerminal">, deps?: ProjectOpenTerminalDeps): Promise<ActionResult<"project.openTerminal">>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler: `project.openTerminal`.
|
|
3
|
+
*
|
|
4
|
+
* Resolves the project's cwd from the registry, ensures the tmux session is
|
|
5
|
+
* running (launching it if necessary), and asserts the resolved cwd is a
|
|
6
|
+
* real directory. Returns the dashboard's stable terminal tab id together
|
|
7
|
+
* with the resolved cwd so the dashboard does not need to stitch together
|
|
8
|
+
* the registry / session / cwd paths itself.
|
|
9
|
+
*
|
|
10
|
+
* This is the action that swallows the seam where the dashboard previously
|
|
11
|
+
* juggled `/api/projects` + `/api/project/:name` to figure out where to
|
|
12
|
+
* open a terminal.
|
|
13
|
+
*/
|
|
14
|
+
import { hasSession as hasSessionDefault } from "@tmux-ide/tmux-bridge";
|
|
15
|
+
import { launch as launchDefault } from "../../../launch.js";
|
|
16
|
+
import { activateProject as activateProjectDefault } from "../../../lib/active-projects.js";
|
|
17
|
+
import { assertValidCwd, TerminalCwdError } from "../../../server/pty-bridge.js";
|
|
18
|
+
import { ActionError, actionErrorFromCwdError } from "../errors.js";
|
|
19
|
+
import { resolveProject } from "./_resolve-project.js";
|
|
20
|
+
const TERMINAL_TAB_ID_PREFIX = "terminal";
|
|
21
|
+
const TERMINAL_TAB_ID_SUFFIX = "default";
|
|
22
|
+
/**
|
|
23
|
+
* Build the dashboard-facing terminal tab id for a session's default
|
|
24
|
+
* terminal. Mirrors the layout state convention `terminal:<session>:default`.
|
|
25
|
+
* Centralised here so both this handler and tests share the source of truth.
|
|
26
|
+
*/
|
|
27
|
+
export function defaultTerminalTabId(sessionName) {
|
|
28
|
+
return `${TERMINAL_TAB_ID_PREFIX}:${sessionName}:${TERMINAL_TAB_ID_SUFFIX}`;
|
|
29
|
+
}
|
|
30
|
+
export async function projectOpenTerminalHandler(input, deps = {}) {
|
|
31
|
+
const project = resolveProject(input.name, deps);
|
|
32
|
+
const activateProject = deps.activateProject ?? activateProjectDefault;
|
|
33
|
+
await activateProject(project.name);
|
|
34
|
+
// Always validate cwd up-front. A missing/broken project dir is the most
|
|
35
|
+
// common cause of the bugs this slice exists to eliminate.
|
|
36
|
+
try {
|
|
37
|
+
assertValidCwd(project.dir, deps.statCwd);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
if (err instanceof TerminalCwdError) {
|
|
41
|
+
throw actionErrorFromCwdError(err);
|
|
42
|
+
}
|
|
43
|
+
throw err;
|
|
44
|
+
}
|
|
45
|
+
const hasSession = deps.hasSession ?? hasSessionDefault;
|
|
46
|
+
const launch = deps.launch ?? launchDefault;
|
|
47
|
+
let launched = false;
|
|
48
|
+
if (!hasSession(project.sessionName)) {
|
|
49
|
+
try {
|
|
50
|
+
// attach: false — we run inside the daemon HTTP server, not a TTY.
|
|
51
|
+
await launch(project.dir, { json: false, attach: false });
|
|
52
|
+
launched = true;
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
throw new ActionError({
|
|
56
|
+
code: "launch_failed",
|
|
57
|
+
message: `Failed to launch session "${project.sessionName}": ${err.message ?? String(err)}`,
|
|
58
|
+
details: { sessionName: project.sessionName, dir: project.dir },
|
|
59
|
+
cause: err,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
sessionName: project.sessionName,
|
|
65
|
+
cwd: project.dir,
|
|
66
|
+
terminalTabId: defaultTerminalTabId(project.sessionName),
|
|
67
|
+
launched,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler: `project.restart`.
|
|
3
|
+
*
|
|
4
|
+
* Programmatic version of `tmux-ide restart`. Stops the session monitor +
|
|
5
|
+
* kills the existing tmux session (when present), then re-launches with
|
|
6
|
+
* `attach: false`. Always reports `restarted: true` on success — the call
|
|
7
|
+
* is meaningful whether or not a session was previously running.
|
|
8
|
+
*/
|
|
9
|
+
import { type ActionInput, type ActionResult } from "../contract.ts";
|
|
10
|
+
import { type ProjectResolverDeps } from "./_resolve-project.ts";
|
|
11
|
+
export interface ProjectRestartDeps extends ProjectResolverDeps {
|
|
12
|
+
restart?: (dir: string, options: {
|
|
13
|
+
json?: boolean;
|
|
14
|
+
attach?: boolean;
|
|
15
|
+
}) => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export declare function projectRestartHandler(input: ActionInput<"project.restart">, deps?: ProjectRestartDeps): Promise<ActionResult<"project.restart">>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler: `project.restart`.
|
|
3
|
+
*
|
|
4
|
+
* Programmatic version of `tmux-ide restart`. Stops the session monitor +
|
|
5
|
+
* kills the existing tmux session (when present), then re-launches with
|
|
6
|
+
* `attach: false`. Always reports `restarted: true` on success — the call
|
|
7
|
+
* is meaningful whether or not a session was previously running.
|
|
8
|
+
*/
|
|
9
|
+
import { restart as restartDefault } from "../../../restart.js";
|
|
10
|
+
import { ActionError } from "../errors.js";
|
|
11
|
+
import { resolveProject } from "./_resolve-project.js";
|
|
12
|
+
export async function projectRestartHandler(input, deps = {}) {
|
|
13
|
+
const project = resolveProject(input.name, deps);
|
|
14
|
+
const restart = deps.restart ?? restartDefault;
|
|
15
|
+
try {
|
|
16
|
+
await restart(project.dir, { json: false, attach: false });
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
throw new ActionError({
|
|
20
|
+
code: "launch_failed",
|
|
21
|
+
message: `Failed to restart session "${project.sessionName}": ${err.message ?? String(err)}`,
|
|
22
|
+
details: { sessionName: project.sessionName, dir: project.dir },
|
|
23
|
+
cause: err,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return { sessionName: project.sessionName, restarted: true };
|
|
27
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler: `project.stop`.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the CLI `tmux-ide stop` flow programmatically: stop the session
|
|
5
|
+
* monitor, then `killSession`. Idempotent —
|
|
6
|
+
* returns `{ stopped: false }` when no session was running rather than
|
|
7
|
+
* throwing, so the dashboard can call this freely.
|
|
8
|
+
*/
|
|
9
|
+
import { type ActionInput, type ActionResult } from "../contract.ts";
|
|
10
|
+
import { type ProjectResolverDeps } from "./_resolve-project.ts";
|
|
11
|
+
export interface ProjectStopDeps extends ProjectResolverDeps {
|
|
12
|
+
hasSession?: (session: string) => boolean;
|
|
13
|
+
killSession?: (session: string) => {
|
|
14
|
+
stopped: boolean;
|
|
15
|
+
reason: string | null;
|
|
16
|
+
};
|
|
17
|
+
stopSessionMonitor?: (session: string) => void;
|
|
18
|
+
/**
|
|
19
|
+
* Legacy hook retained for tests. Per-session daemon cleanup is no longer
|
|
20
|
+
* needed because the canonical daemon is app/headless owned.
|
|
21
|
+
*/
|
|
22
|
+
killOrphanDaemons?: (session: string) => void;
|
|
23
|
+
}
|
|
24
|
+
export declare function projectStopHandler(input: ActionInput<"project.stop">, deps?: ProjectStopDeps): Promise<ActionResult<"project.stop">>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler: `project.stop`.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the CLI `tmux-ide stop` flow programmatically: stop the session
|
|
5
|
+
* monitor, then `killSession`. Idempotent —
|
|
6
|
+
* returns `{ stopped: false }` when no session was running rather than
|
|
7
|
+
* throwing, so the dashboard can call this freely.
|
|
8
|
+
*/
|
|
9
|
+
import { hasSession as hasSessionDefault, killSession as killSessionDefault, stopSessionMonitor as stopSessionMonitorDefault, } from "@tmux-ide/tmux-bridge";
|
|
10
|
+
import { ActionError } from "../errors.js";
|
|
11
|
+
import { resolveProject } from "./_resolve-project.js";
|
|
12
|
+
function defaultKillOrphanDaemons(_session) {
|
|
13
|
+
// No-op: per-session daemons are no longer spawned.
|
|
14
|
+
}
|
|
15
|
+
export async function projectStopHandler(input, deps = {}) {
|
|
16
|
+
const project = resolveProject(input.name, deps);
|
|
17
|
+
const hasSession = deps.hasSession ?? hasSessionDefault;
|
|
18
|
+
if (!hasSession(project.sessionName)) {
|
|
19
|
+
return { sessionName: project.sessionName, stopped: false };
|
|
20
|
+
}
|
|
21
|
+
const stopSessionMonitor = deps.stopSessionMonitor ?? stopSessionMonitorDefault;
|
|
22
|
+
const killSession = deps.killSession ?? killSessionDefault;
|
|
23
|
+
const killOrphanDaemons = deps.killOrphanDaemons ?? defaultKillOrphanDaemons;
|
|
24
|
+
try {
|
|
25
|
+
stopSessionMonitor(project.sessionName);
|
|
26
|
+
killOrphanDaemons(project.sessionName);
|
|
27
|
+
const result = killSession(project.sessionName);
|
|
28
|
+
return { sessionName: project.sessionName, stopped: result.stopped };
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
throw new ActionError({
|
|
32
|
+
code: "stop_failed",
|
|
33
|
+
message: `Failed to stop session "${project.sessionName}": ${err.message ?? String(err)}`,
|
|
34
|
+
details: { sessionName: project.sessionName },
|
|
35
|
+
cause: err,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler: `terminal.respawn`.
|
|
3
|
+
*
|
|
4
|
+
* Server-side equivalent of the dashboard's `bridge.restartWith(...)` call.
|
|
5
|
+
* Looks up the PTY bridge by id; if a cwd is supplied it validates the
|
|
6
|
+
* directory and passes it through; otherwise it respawns at the bridge's
|
|
7
|
+
* recorded `lastCwd`.
|
|
8
|
+
*
|
|
9
|
+
* Why server-side? The dashboard previously had to do the cwd resolution
|
|
10
|
+
* itself before it could ask the bridge to restart. Centralising it here
|
|
11
|
+
* keeps the cwd contract on the server, where it has direct access to the
|
|
12
|
+
* project registry and the bridge's filesystem.
|
|
13
|
+
*/
|
|
14
|
+
import { type PtyBridgeRegistry } from "../../../server/ws-route.ts";
|
|
15
|
+
import type { Stats } from "node:fs";
|
|
16
|
+
import { type ActionInput, type ActionResult } from "../contract.ts";
|
|
17
|
+
export interface TerminalRespawnDeps {
|
|
18
|
+
registry?: PtyBridgeRegistry;
|
|
19
|
+
/** Override for the bridge dimensions used on respawn. Tests inject these. */
|
|
20
|
+
cols?: number;
|
|
21
|
+
rows?: number;
|
|
22
|
+
statCwd?: (cwd: string) => Stats;
|
|
23
|
+
}
|
|
24
|
+
export declare function terminalRespawnHandler(input: ActionInput<"terminal.respawn">, deps?: TerminalRespawnDeps): ActionResult<"terminal.respawn">;
|