tmux-ide 2.1.5 → 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/BDqbxLkiJrlXDfMXNb3cK/_buildManifest.js +0 -11
- package/dashboard/out/_next/static/BDqbxLkiJrlXDfMXNb3cK/_clientMiddlewareManifest.json +0 -1
- package/dashboard/out/_next/static/BDqbxLkiJrlXDfMXNb3cK/_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 -440
- 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 -284
- 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,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project onboard — composes a sensible `ide.yml` from a small set of
|
|
3
|
+
* inputs (project name, agent count, optional dev/test commands) and
|
|
4
|
+
* writes it to disk so the project can be registered.
|
|
5
|
+
*
|
|
6
|
+
* `composeIdeYml` is the pure-logic bit (string in → string out) so the
|
|
7
|
+
* shape of the generated config is exhaustively unit-tested without
|
|
8
|
+
* touching the filesystem. The wrapper around `writeConfig` lives in the
|
|
9
|
+
* server route, which calls this function and then `registerProject`.
|
|
10
|
+
*/
|
|
11
|
+
import yaml from "js-yaml";
|
|
12
|
+
import { existsSync } from "node:fs";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
export class OnboardConflictError extends Error {
|
|
15
|
+
code = "IDE_YML_EXISTS";
|
|
16
|
+
constructor(path) {
|
|
17
|
+
super(`ide.yml already exists at ${path}`);
|
|
18
|
+
this.name = "OnboardConflictError";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export class OnboardInvalidInputError extends Error {
|
|
22
|
+
code = "INVALID_INPUT";
|
|
23
|
+
constructor(message) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.name = "OnboardInvalidInputError";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Build the `IdeConfig` value the wizard should write. Pure: same input →
|
|
30
|
+
* same output, no io.
|
|
31
|
+
*
|
|
32
|
+
* Layout shape:
|
|
33
|
+
* - Row 0 (70%): N Claude panes, first focused. When `agents > 1`, the
|
|
34
|
+
* `team:` block is added so Claude Code launches with team mode.
|
|
35
|
+
* - Row 1 (30%): Dev pane (if `devCommand` set) + Shell pane.
|
|
36
|
+
*/
|
|
37
|
+
export function composeIdeYmlConfig(input) {
|
|
38
|
+
if (!Number.isInteger(input.agents) || input.agents < 1 || input.agents > 3) {
|
|
39
|
+
throw new OnboardInvalidInputError(`agents must be an integer between 1 and 3 (got ${input.agents})`);
|
|
40
|
+
}
|
|
41
|
+
const cleanName = input.name.trim();
|
|
42
|
+
if (!cleanName) {
|
|
43
|
+
throw new OnboardInvalidInputError("name must be a non-empty string");
|
|
44
|
+
}
|
|
45
|
+
const agentsCount = input.agents;
|
|
46
|
+
const useTeam = agentsCount > 1;
|
|
47
|
+
const customNames = input.agentNames;
|
|
48
|
+
if (customNames !== undefined) {
|
|
49
|
+
if (customNames.length !== agentsCount) {
|
|
50
|
+
throw new OnboardInvalidInputError(`agentNames length (${customNames.length}) must equal agents (${agentsCount})`);
|
|
51
|
+
}
|
|
52
|
+
for (const name of customNames) {
|
|
53
|
+
if (typeof name !== "string" || name.trim() === "") {
|
|
54
|
+
throw new OnboardInvalidInputError("agentNames entries must be non-empty strings");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const topPanes = [];
|
|
59
|
+
for (let i = 0; i < agentsCount; i++) {
|
|
60
|
+
const fallback = useTeam ? (i === 0 ? "Lead" : `Teammate ${i}`) : `Claude ${i + 1}`;
|
|
61
|
+
const customTitle = customNames?.[i]?.trim();
|
|
62
|
+
const pane = {
|
|
63
|
+
title: customTitle && customTitle.length > 0 ? customTitle : fallback,
|
|
64
|
+
command: "claude",
|
|
65
|
+
};
|
|
66
|
+
if (useTeam) {
|
|
67
|
+
pane.role = i === 0 ? "lead" : "teammate";
|
|
68
|
+
}
|
|
69
|
+
if (i === 0) {
|
|
70
|
+
pane.focus = true;
|
|
71
|
+
}
|
|
72
|
+
topPanes.push(pane);
|
|
73
|
+
}
|
|
74
|
+
const bottomPanes = [];
|
|
75
|
+
const devCommand = input.devCommand?.trim();
|
|
76
|
+
if (devCommand) {
|
|
77
|
+
bottomPanes.push({ title: "Dev", command: devCommand });
|
|
78
|
+
}
|
|
79
|
+
bottomPanes.push({ title: "Shell" });
|
|
80
|
+
const rows = [{ size: "70%", panes: topPanes }, { panes: bottomPanes }];
|
|
81
|
+
const config = {
|
|
82
|
+
name: cleanName,
|
|
83
|
+
rows,
|
|
84
|
+
};
|
|
85
|
+
if (useTeam) {
|
|
86
|
+
config.team = { name: cleanName };
|
|
87
|
+
}
|
|
88
|
+
return config;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Render a composed `IdeConfig` as YAML. Wrapper over `js-yaml` with the
|
|
92
|
+
* same options used elsewhere so the output shape is identical.
|
|
93
|
+
*/
|
|
94
|
+
export function composeIdeYml(input) {
|
|
95
|
+
const config = composeIdeYmlConfig(input);
|
|
96
|
+
return yaml.dump(config, { lineWidth: -1, noRefs: true, quotingType: '"' });
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Reject onboarding when `ide.yml` already exists. The caller writes the
|
|
100
|
+
* file separately via `writeConfig`; this helper exists so the route can
|
|
101
|
+
* 409 cleanly without ever overwriting user content.
|
|
102
|
+
*/
|
|
103
|
+
export function assertNoExistingIdeYml(dir, exists = existsSync) {
|
|
104
|
+
const path = join(dir, "ide.yml");
|
|
105
|
+
if (exists(path)) {
|
|
106
|
+
throw new OnboardConflictError(path);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project probe — inspects a directory and returns identity facts (name from
|
|
3
|
+
* basename, ide.yml presence, git origin/branch). Pure-ish wrapper over a few
|
|
4
|
+
* filesystem and git child-process calls; the io functions are pluggable for
|
|
5
|
+
* tests so we don't need a full mock filesystem.
|
|
6
|
+
*
|
|
7
|
+
* All git invocations are hard-bounded by a 2s timeout — we never want a
|
|
8
|
+
* single misbehaving repo to hang an HTTP request.
|
|
9
|
+
*/
|
|
10
|
+
export interface ProjectProbe {
|
|
11
|
+
name: string;
|
|
12
|
+
dir: string;
|
|
13
|
+
hasIdeYml: boolean;
|
|
14
|
+
gitOrigin: string | null;
|
|
15
|
+
gitBranch: string | null;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Pluggable io for tests. The defaults are real fs/child_process calls — pass
|
|
19
|
+
* `io` overrides to drive the probe deterministically in unit tests.
|
|
20
|
+
*/
|
|
21
|
+
export interface ProbeIo {
|
|
22
|
+
exists(path: string): boolean;
|
|
23
|
+
runGit(args: string[], cwd: string): Promise<string | null>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Replace dangerous filename characters and collapse whitespace so the
|
|
27
|
+
* default `name` is safe to use as a tmux session name and a registry key.
|
|
28
|
+
*/
|
|
29
|
+
export declare function sanitizeName(raw: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Probe a directory and return its identity. Never throws — returns nulls for
|
|
32
|
+
* any field that can't be determined. The caller decides what's a hard error
|
|
33
|
+
* (e.g. dir doesn't exist).
|
|
34
|
+
*/
|
|
35
|
+
export declare function probeProject(dir: string, io?: ProbeIo): Promise<ProjectProbe>;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project probe — inspects a directory and returns identity facts (name from
|
|
3
|
+
* basename, ide.yml presence, git origin/branch). Pure-ish wrapper over a few
|
|
4
|
+
* filesystem and git child-process calls; the io functions are pluggable for
|
|
5
|
+
* tests so we don't need a full mock filesystem.
|
|
6
|
+
*
|
|
7
|
+
* All git invocations are hard-bounded by a 2s timeout — we never want a
|
|
8
|
+
* single misbehaving repo to hang an HTTP request.
|
|
9
|
+
*/
|
|
10
|
+
import { execFile } from "node:child_process";
|
|
11
|
+
import { existsSync } from "node:fs";
|
|
12
|
+
import { basename, isAbsolute, resolve } from "node:path";
|
|
13
|
+
const GIT_TIMEOUT_MS = 2_000;
|
|
14
|
+
const realIo = {
|
|
15
|
+
exists: existsSync,
|
|
16
|
+
runGit: (args, cwd) => new Promise((resolveResult) => {
|
|
17
|
+
execFile("git", ["-C", cwd, ...args], { timeout: GIT_TIMEOUT_MS, encoding: "utf-8" }, (err, stdout) => {
|
|
18
|
+
if (err) {
|
|
19
|
+
resolveResult(null);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
resolveResult(stdout.trim());
|
|
23
|
+
});
|
|
24
|
+
}),
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Replace dangerous filename characters and collapse whitespace so the
|
|
28
|
+
* default `name` is safe to use as a tmux session name and a registry key.
|
|
29
|
+
*/
|
|
30
|
+
export function sanitizeName(raw) {
|
|
31
|
+
return raw
|
|
32
|
+
.trim()
|
|
33
|
+
.replace(/\s+/g, "-")
|
|
34
|
+
.replace(/[^A-Za-z0-9._-]/g, "")
|
|
35
|
+
.replace(/^-+|-+$/g, "");
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Probe a directory and return its identity. Never throws — returns nulls for
|
|
39
|
+
* any field that can't be determined. The caller decides what's a hard error
|
|
40
|
+
* (e.g. dir doesn't exist).
|
|
41
|
+
*/
|
|
42
|
+
export async function probeProject(dir, io = realIo) {
|
|
43
|
+
const absoluteDir = isAbsolute(dir) ? dir : resolve(dir);
|
|
44
|
+
const rawName = basename(absoluteDir);
|
|
45
|
+
const sanitized = sanitizeName(rawName);
|
|
46
|
+
const name = sanitized.length > 0 ? sanitized : "project";
|
|
47
|
+
const hasIdeYml = io.exists(`${absoluteDir}/ide.yml`);
|
|
48
|
+
const [gitOrigin, gitBranch] = await Promise.all([
|
|
49
|
+
io.runGit(["config", "--get", "remote.origin.url"], absoluteDir),
|
|
50
|
+
io.runGit(["branch", "--show-current"], absoluteDir),
|
|
51
|
+
]);
|
|
52
|
+
return {
|
|
53
|
+
name,
|
|
54
|
+
dir: absoluteDir,
|
|
55
|
+
hasIdeYml,
|
|
56
|
+
// Treat empty string as null — branch --show-current returns "" on a
|
|
57
|
+
// detached HEAD.
|
|
58
|
+
gitOrigin: gitOrigin && gitOrigin.length > 0 ? gitOrigin : null,
|
|
59
|
+
gitBranch: gitBranch && gitBranch.length > 0 ? gitBranch : null,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project registry — persists the list of projects the user has registered
|
|
3
|
+
* with tmux-ide via the dashboard. Stored at `~/.tmux-ide/projects.json`,
|
|
4
|
+
* written atomically via temp+rename (same approach as task-store).
|
|
5
|
+
*
|
|
6
|
+
* The pure decider (`applyAction`) is exported separately from the io-bound
|
|
7
|
+
* accessors so tests can reason about state transitions without hitting the
|
|
8
|
+
* filesystem. The module also exposes a `projectRegistryEmitter` that the
|
|
9
|
+
* `/ws/events` channel listens on to broadcast `projects.changed` frames.
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from "node:events";
|
|
12
|
+
import { type RegisteredProject } from "../schemas/registry.ts";
|
|
13
|
+
import { type ProbeIo, type ProjectProbe } from "./project-probe.ts";
|
|
14
|
+
export declare class ProjectRegistryError extends Error {
|
|
15
|
+
readonly code: string;
|
|
16
|
+
constructor(message: string, code: string);
|
|
17
|
+
}
|
|
18
|
+
export declare class ProjectAlreadyRegisteredError extends ProjectRegistryError {
|
|
19
|
+
readonly suggestion: string;
|
|
20
|
+
constructor(name: string, suggestion: string);
|
|
21
|
+
}
|
|
22
|
+
export declare class ProjectNotFoundError extends ProjectRegistryError {
|
|
23
|
+
constructor(name: string);
|
|
24
|
+
}
|
|
25
|
+
export declare class ProjectDirNotFoundError extends ProjectRegistryError {
|
|
26
|
+
constructor(dir: string);
|
|
27
|
+
}
|
|
28
|
+
export type RegistryAction = {
|
|
29
|
+
type: "register";
|
|
30
|
+
project: RegisteredProject;
|
|
31
|
+
} | {
|
|
32
|
+
type: "unregister";
|
|
33
|
+
name: string;
|
|
34
|
+
} | {
|
|
35
|
+
type: "replace";
|
|
36
|
+
project: RegisteredProject;
|
|
37
|
+
};
|
|
38
|
+
export declare function applyAction(state: readonly RegisteredProject[], action: RegistryAction): RegisteredProject[];
|
|
39
|
+
/**
|
|
40
|
+
* Resolve a unique name for a probed project, appending `-2`, `-3`, … until
|
|
41
|
+
* we don't collide with an existing entry.
|
|
42
|
+
*/
|
|
43
|
+
export declare function resolveUniqueName(state: readonly RegisteredProject[], desired: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Build a `RegisteredProject` value from a probe + chosen name + timestamp.
|
|
46
|
+
* Pure — separated from `registerProject` so tests can verify the shape
|
|
47
|
+
* without io.
|
|
48
|
+
*/
|
|
49
|
+
export declare function buildRegisteredProject(probe: ProjectProbe, name: string, registeredAt: string): RegisteredProject;
|
|
50
|
+
export declare const projectRegistryEmitter: EventEmitter<any>;
|
|
51
|
+
export declare function listProjects(): RegisteredProject[];
|
|
52
|
+
export declare function getProject(name: string): RegisteredProject | null;
|
|
53
|
+
export interface RegisterInput {
|
|
54
|
+
dir: string;
|
|
55
|
+
name?: string;
|
|
56
|
+
/** Pluggable io for tests. */
|
|
57
|
+
io?: ProbeIo;
|
|
58
|
+
/** Override `Date.now()` for deterministic tests. */
|
|
59
|
+
now?: () => Date;
|
|
60
|
+
/** Override existsSync for the dir-validity check (tests). */
|
|
61
|
+
exists?: (path: string) => boolean;
|
|
62
|
+
}
|
|
63
|
+
export declare function registerProject(input: RegisterInput): Promise<RegisteredProject>;
|
|
64
|
+
export declare function unregisterProject(name: string): void;
|
|
65
|
+
export interface ProbeOptions {
|
|
66
|
+
io?: ProbeIo;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Re-probe a registered project by name, persist the refreshed snapshot, and
|
|
70
|
+
* broadcast the change. Throws if the project isn't registered.
|
|
71
|
+
*/
|
|
72
|
+
export declare function refreshProject(name: string, options?: ProbeOptions): Promise<RegisteredProject>;
|
|
73
|
+
/** Reset the in-memory cache. Tests use this between cases. */
|
|
74
|
+
export declare function _resetCacheForTests(): void;
|
|
75
|
+
/** Force a re-read from disk on next access. */
|
|
76
|
+
export declare function _invalidateCacheForTests(): void;
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project registry — persists the list of projects the user has registered
|
|
3
|
+
* with tmux-ide via the dashboard. Stored at `~/.tmux-ide/projects.json`,
|
|
4
|
+
* written atomically via temp+rename (same approach as task-store).
|
|
5
|
+
*
|
|
6
|
+
* The pure decider (`applyAction`) is exported separately from the io-bound
|
|
7
|
+
* accessors so tests can reason about state transitions without hitting the
|
|
8
|
+
* filesystem. The module also exposes a `projectRegistryEmitter` that the
|
|
9
|
+
* `/ws/events` channel listens on to broadcast `projects.changed` frames.
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from "node:events";
|
|
12
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
13
|
+
import { homedir } from "node:os";
|
|
14
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
15
|
+
import { z } from "zod";
|
|
16
|
+
import { RegisteredProjectSchemaZ } from "../schemas/registry.js";
|
|
17
|
+
import { probeProject, sanitizeName } from "./project-probe.js";
|
|
18
|
+
const REGISTRY_DIR_ENV = "TMUX_IDE_REGISTRY_DIR";
|
|
19
|
+
const RegistryFileSchemaZ = z.object({
|
|
20
|
+
version: z.literal(1),
|
|
21
|
+
projects: z.array(RegisteredProjectSchemaZ),
|
|
22
|
+
});
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Typed errors — never use stringly-typed catches at the boundary
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
export class ProjectRegistryError extends Error {
|
|
27
|
+
code;
|
|
28
|
+
constructor(message, code) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.name = "ProjectRegistryError";
|
|
31
|
+
this.code = code;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export class ProjectAlreadyRegisteredError extends ProjectRegistryError {
|
|
35
|
+
suggestion;
|
|
36
|
+
constructor(name, suggestion) {
|
|
37
|
+
super(`Project "${name}" is already registered`, "ALREADY_REGISTERED");
|
|
38
|
+
this.name = "ProjectAlreadyRegisteredError";
|
|
39
|
+
this.suggestion = suggestion;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export class ProjectNotFoundError extends ProjectRegistryError {
|
|
43
|
+
constructor(name) {
|
|
44
|
+
super(`Project "${name}" not found in registry`, "NOT_FOUND");
|
|
45
|
+
this.name = "ProjectNotFoundError";
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export class ProjectDirNotFoundError extends ProjectRegistryError {
|
|
49
|
+
constructor(dir) {
|
|
50
|
+
super(`Directory "${dir}" does not exist`, "DIR_NOT_FOUND");
|
|
51
|
+
this.name = "ProjectDirNotFoundError";
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export function applyAction(state, action) {
|
|
55
|
+
switch (action.type) {
|
|
56
|
+
case "register":
|
|
57
|
+
return [...state, action.project];
|
|
58
|
+
case "unregister":
|
|
59
|
+
return state.filter((p) => p.name !== action.name);
|
|
60
|
+
case "replace":
|
|
61
|
+
return state.map((p) => (p.name === action.project.name ? action.project : p));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Resolve a unique name for a probed project, appending `-2`, `-3`, … until
|
|
66
|
+
* we don't collide with an existing entry.
|
|
67
|
+
*/
|
|
68
|
+
export function resolveUniqueName(state, desired) {
|
|
69
|
+
const used = new Set(state.map((p) => p.name));
|
|
70
|
+
if (!used.has(desired))
|
|
71
|
+
return desired;
|
|
72
|
+
let counter = 2;
|
|
73
|
+
while (used.has(`${desired}-${counter}`))
|
|
74
|
+
counter++;
|
|
75
|
+
return `${desired}-${counter}`;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Build a `RegisteredProject` value from a probe + chosen name + timestamp.
|
|
79
|
+
* Pure — separated from `registerProject` so tests can verify the shape
|
|
80
|
+
* without io.
|
|
81
|
+
*/
|
|
82
|
+
export function buildRegisteredProject(probe, name, registeredAt) {
|
|
83
|
+
return {
|
|
84
|
+
name,
|
|
85
|
+
dir: probe.dir,
|
|
86
|
+
hasIdeYml: probe.hasIdeYml,
|
|
87
|
+
gitOrigin: probe.gitOrigin,
|
|
88
|
+
gitBranch: probe.gitBranch,
|
|
89
|
+
registeredAt,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
// Module-level emitter — listened on by ws-events.handleWsEventsConnection
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
export const projectRegistryEmitter = new EventEmitter();
|
|
96
|
+
// One listener per connected ws-events client; can grow with tabs.
|
|
97
|
+
projectRegistryEmitter.setMaxListeners(0);
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
// Persistence — io-bound, single mutex (registry is small + writes are rare)
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
function registryDir() {
|
|
102
|
+
const override = process.env[REGISTRY_DIR_ENV];
|
|
103
|
+
if (override && override.length > 0)
|
|
104
|
+
return override;
|
|
105
|
+
return join(homedir(), ".tmux-ide");
|
|
106
|
+
}
|
|
107
|
+
function registryPath() {
|
|
108
|
+
return join(registryDir(), "projects.json");
|
|
109
|
+
}
|
|
110
|
+
let cache = null;
|
|
111
|
+
function readDisk() {
|
|
112
|
+
const path = registryPath();
|
|
113
|
+
if (!existsSync(path))
|
|
114
|
+
return [];
|
|
115
|
+
const raw = readFileSync(path, "utf-8");
|
|
116
|
+
if (raw.trim().length === 0)
|
|
117
|
+
return [];
|
|
118
|
+
let parsed;
|
|
119
|
+
try {
|
|
120
|
+
parsed = JSON.parse(raw);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
console.warn("[project-registry] %s contains invalid JSON; ignoring", path);
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
const result = RegistryFileSchemaZ.safeParse(parsed);
|
|
127
|
+
if (!result.success) {
|
|
128
|
+
console.warn("[project-registry] %s failed schema validation; ignoring (%s)", path, result.error.issues
|
|
129
|
+
.slice(0, 3)
|
|
130
|
+
.map((i) => `${i.path.join(".")}: ${i.message}`)
|
|
131
|
+
.join("; "));
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
return result.data.projects;
|
|
135
|
+
}
|
|
136
|
+
function writeDisk(projects) {
|
|
137
|
+
const path = registryPath();
|
|
138
|
+
const dir = dirname(path);
|
|
139
|
+
mkdirSync(dir, { recursive: true });
|
|
140
|
+
const file = { version: 1, projects };
|
|
141
|
+
const tmpPath = `${path}.tmp`;
|
|
142
|
+
writeFileSync(tmpPath, JSON.stringify(file, null, 2) + "\n");
|
|
143
|
+
renameSync(tmpPath, path);
|
|
144
|
+
}
|
|
145
|
+
function ensureCache() {
|
|
146
|
+
if (cache !== null)
|
|
147
|
+
return cache;
|
|
148
|
+
cache = readDisk();
|
|
149
|
+
return cache;
|
|
150
|
+
}
|
|
151
|
+
function commit(next) {
|
|
152
|
+
cache = next;
|
|
153
|
+
writeDisk(next);
|
|
154
|
+
projectRegistryEmitter.emit("change");
|
|
155
|
+
}
|
|
156
|
+
// ---------------------------------------------------------------------------
|
|
157
|
+
// Public api
|
|
158
|
+
// ---------------------------------------------------------------------------
|
|
159
|
+
export function listProjects() {
|
|
160
|
+
// Return a defensive copy so callers can't mutate the cache.
|
|
161
|
+
return [...ensureCache()];
|
|
162
|
+
}
|
|
163
|
+
export function getProject(name) {
|
|
164
|
+
return ensureCache().find((p) => p.name === name) ?? null;
|
|
165
|
+
}
|
|
166
|
+
export async function registerProject(input) {
|
|
167
|
+
const exists = input.exists ?? existsSync;
|
|
168
|
+
const absoluteDir = isAbsolute(input.dir) ? input.dir : resolve(input.dir);
|
|
169
|
+
if (!exists(absoluteDir)) {
|
|
170
|
+
throw new ProjectDirNotFoundError(absoluteDir);
|
|
171
|
+
}
|
|
172
|
+
const probe = await probeProject(absoluteDir, input.io);
|
|
173
|
+
const state = ensureCache();
|
|
174
|
+
// If a name was explicitly requested, treat collisions as hard errors and
|
|
175
|
+
// suggest an alternative. If no name was given, auto-resolve via -2/-3/…
|
|
176
|
+
const desired = input.name ? sanitizeName(input.name) : probe.name;
|
|
177
|
+
const cleaned = desired.length > 0 ? desired : probe.name;
|
|
178
|
+
let resolvedName;
|
|
179
|
+
if (input.name) {
|
|
180
|
+
if (state.some((p) => p.name === cleaned)) {
|
|
181
|
+
throw new ProjectAlreadyRegisteredError(cleaned, resolveUniqueName(state, cleaned));
|
|
182
|
+
}
|
|
183
|
+
resolvedName = cleaned;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
resolvedName = resolveUniqueName(state, cleaned);
|
|
187
|
+
}
|
|
188
|
+
// Reject re-registering the same dir (different name). Probe again under a
|
|
189
|
+
// different name is fine, but we want to avoid duplicate dirs in the list.
|
|
190
|
+
const dupDir = state.find((p) => p.dir === probe.dir);
|
|
191
|
+
if (dupDir) {
|
|
192
|
+
throw new ProjectAlreadyRegisteredError(dupDir.name, dupDir.name);
|
|
193
|
+
}
|
|
194
|
+
const now = (input.now ?? (() => new Date()))();
|
|
195
|
+
const project = buildRegisteredProject(probe, resolvedName, now.toISOString());
|
|
196
|
+
commit(applyAction(state, { type: "register", project }));
|
|
197
|
+
return project;
|
|
198
|
+
}
|
|
199
|
+
export function unregisterProject(name) {
|
|
200
|
+
const state = ensureCache();
|
|
201
|
+
if (!state.some((p) => p.name === name)) {
|
|
202
|
+
throw new ProjectNotFoundError(name);
|
|
203
|
+
}
|
|
204
|
+
commit(applyAction(state, { type: "unregister", name }));
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Re-probe a registered project by name, persist the refreshed snapshot, and
|
|
208
|
+
* broadcast the change. Throws if the project isn't registered.
|
|
209
|
+
*/
|
|
210
|
+
export async function refreshProject(name, options = {}) {
|
|
211
|
+
const state = ensureCache();
|
|
212
|
+
const existing = state.find((p) => p.name === name);
|
|
213
|
+
if (!existing)
|
|
214
|
+
throw new ProjectNotFoundError(name);
|
|
215
|
+
const probe = await probeProject(existing.dir, options.io);
|
|
216
|
+
const refreshed = buildRegisteredProject(probe, existing.name, existing.registeredAt);
|
|
217
|
+
commit(applyAction(state, { type: "replace", project: refreshed }));
|
|
218
|
+
return refreshed;
|
|
219
|
+
}
|
|
220
|
+
// ---------------------------------------------------------------------------
|
|
221
|
+
// Test helpers — never call from production code
|
|
222
|
+
// ---------------------------------------------------------------------------
|
|
223
|
+
/** Reset the in-memory cache. Tests use this between cases. */
|
|
224
|
+
export function _resetCacheForTests() {
|
|
225
|
+
cache = null;
|
|
226
|
+
}
|
|
227
|
+
/** Force a re-read from disk on next access. */
|
|
228
|
+
export function _invalidateCacheForTests() {
|
|
229
|
+
cache = null;
|
|
230
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
interface MonitorPane {
|
|
2
|
+
id: string;
|
|
3
|
+
pid: string;
|
|
4
|
+
cmd?: string;
|
|
5
|
+
title?: string;
|
|
6
|
+
role?: string;
|
|
7
|
+
type?: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function computePortPanes(panes: MonitorPane[], { listeners, tree }?: {
|
|
11
|
+
listeners?: Set<string>;
|
|
12
|
+
tree?: Map<string, string>;
|
|
13
|
+
}): Set<string>;
|
|
14
|
+
export declare function computeAgentStates(panes: MonitorPane[]): Map<string, "busy" | "idle" | null>;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
const SPINNERS = /^[⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏⠂⠒⠢⠆⠐⠠⠄◐◓◑◒|/\\-] /;
|
|
3
|
+
// --- Port detection (pure helpers) ---
|
|
4
|
+
function getListeningPids() {
|
|
5
|
+
// Returns Set of PIDs that have a listening TCP port in range 1024-20000
|
|
6
|
+
try {
|
|
7
|
+
const raw = execFileSync("lsof", ["-nP", "-iTCP", "-sTCP:LISTEN", "-FpPn"], {
|
|
8
|
+
encoding: "utf-8",
|
|
9
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
10
|
+
timeout: 2000,
|
|
11
|
+
});
|
|
12
|
+
const pids = new Set();
|
|
13
|
+
let currentPid = null;
|
|
14
|
+
for (const line of raw.split("\n")) {
|
|
15
|
+
if (line.startsWith("p")) {
|
|
16
|
+
currentPid = line.slice(1);
|
|
17
|
+
}
|
|
18
|
+
else if (line.startsWith("n") && currentPid) {
|
|
19
|
+
const match = line.match(/:(\d+)$/);
|
|
20
|
+
if (match) {
|
|
21
|
+
const port = parseInt(match[1], 10);
|
|
22
|
+
if (port >= 1024 && port <= 20000)
|
|
23
|
+
pids.add(currentPid);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return pids;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return new Set();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function getProcessTree() {
|
|
34
|
+
// Returns Map<pid, ppid>
|
|
35
|
+
try {
|
|
36
|
+
const raw = execFileSync("ps", ["-axo", "pid=,ppid="], {
|
|
37
|
+
encoding: "utf-8",
|
|
38
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
39
|
+
timeout: 2000,
|
|
40
|
+
});
|
|
41
|
+
const tree = new Map();
|
|
42
|
+
for (const line of raw.trim().split("\n")) {
|
|
43
|
+
const parts = line.trim().split(/\s+/);
|
|
44
|
+
if (parts.length === 2)
|
|
45
|
+
tree.set(parts[0], parts[1]);
|
|
46
|
+
}
|
|
47
|
+
return tree;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return new Map();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function computePortPanes(panes, { listeners, tree } = {}) {
|
|
54
|
+
// Walk up from each listening PID to find which pane owns it
|
|
55
|
+
const resolvedListeners = listeners ?? getListeningPids();
|
|
56
|
+
const resolvedTree = tree ?? getProcessTree();
|
|
57
|
+
if (resolvedListeners.size === 0)
|
|
58
|
+
return new Set();
|
|
59
|
+
const panePids = new Map(panes.map((p) => [p.pid, p.id]));
|
|
60
|
+
const result = new Set();
|
|
61
|
+
for (const listenerPid of resolvedListeners) {
|
|
62
|
+
let pid = listenerPid;
|
|
63
|
+
while (pid && pid !== "0") {
|
|
64
|
+
if (panePids.has(pid)) {
|
|
65
|
+
result.add(panePids.get(pid));
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
pid = resolvedTree.get(pid);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
// --- Agent detection ---
|
|
74
|
+
export function computeAgentStates(panes) {
|
|
75
|
+
// Returns Map<paneId, "busy" | "idle" | null>
|
|
76
|
+
const states = new Map();
|
|
77
|
+
for (const pane of panes) {
|
|
78
|
+
const role = pane.role ?? "";
|
|
79
|
+
// Primary: use @ide_role pane option if available
|
|
80
|
+
if (role === "lead" || role === "teammate") {
|
|
81
|
+
states.set(pane.id, SPINNERS.test(pane.title ?? "") ? "busy" : "idle");
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
// Fallback: command-based detection for pre-upgrade sessions
|
|
85
|
+
const cmd = (pane.cmd ?? "").toLowerCase();
|
|
86
|
+
if (!cmd.includes("claude") && !cmd.includes("codex")) {
|
|
87
|
+
states.set(pane.id, null);
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
states.set(pane.id, SPINNERS.test(pane.title ?? "") ? "busy" : "idle");
|
|
91
|
+
}
|
|
92
|
+
return states;
|
|
93
|
+
}
|
|
94
|
+
// The per-session tick loop / orchestrator bootstrap that used to live
|
|
95
|
+
// here was orphaned by the canonical-tree fold — `daemon-embed.ts` owns
|
|
96
|
+
// both responsibilities now (see `startEmbeddedDaemon` + its
|
|
97
|
+
// orchestrator branch). Removing the legacy CLI block also fixes the
|
|
98
|
+
// esbuild-bundle case where `import.meta.url`-vs-`process.argv[1]`
|
|
99
|
+
// resolved to true at the bin/cli.js entry, causing the daemon's
|
|
100
|
+
// session monitor to hijack every CLI invocation (see N1 of
|
|
101
|
+
// docs/npm-distribution-audit.md). The pure exports above
|
|
102
|
+
// (`computeAgentStates`, `computePortPanes`) remain — that's what
|
|
103
|
+
// `daemon-embed.ts` actually imports.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composable builders for tmux session configuration.
|
|
3
|
+
* Each returns an array of tmux command arrays.
|
|
4
|
+
*/
|
|
5
|
+
import type { ThemeConfig, TmuxCommand } from "../types.ts";
|
|
6
|
+
export declare function buildSessionOptions(session: string, { theme }?: {
|
|
7
|
+
theme?: ThemeConfig;
|
|
8
|
+
}): TmuxCommand[];
|
|
9
|
+
export declare function themeOptions(session: string, theme: ThemeConfig): TmuxCommand[];
|
|
10
|
+
export declare function borderOptions(session: string, theme: ThemeConfig): TmuxCommand[];
|
|
11
|
+
export declare function behaviorOptions(session: string): TmuxCommand[];
|
|
12
|
+
export declare function statusBarOptions(session: string, theme: ThemeConfig): TmuxCommand[];
|
|
13
|
+
export declare function keyBindings(): TmuxCommand[];
|