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,147 @@
|
|
|
1
|
+
import type { AgentStatus } from "../tui/detect/classify.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Root-table key binds (tmux key names) for the per-widget PANEL popups —
|
|
4
|
+
* every widget is a floating app dialog one keystroke away, esc to close (the
|
|
5
|
+
* "one-app" milestone). Only widgets that exist AND stand alone are here:
|
|
6
|
+
* `preview` is a companion that renders the explorer's selection (nothing to
|
|
7
|
+
* show on its own) and `setup` is the onboarding wizard, so neither gets a key.
|
|
8
|
+
*/
|
|
9
|
+
export interface AppPanelKeys {
|
|
10
|
+
/** File explorer panel (default `M-e`). */
|
|
11
|
+
explorer: string;
|
|
12
|
+
/** Git changes panel (default `M-g`). */
|
|
13
|
+
changes: string;
|
|
14
|
+
/** Config editor panel (default `M-,`). */
|
|
15
|
+
config: string;
|
|
16
|
+
}
|
|
17
|
+
/** Root-table key binds (tmux key names) for the chrome popups + widget panels. */
|
|
18
|
+
export interface AppKeys {
|
|
19
|
+
/** Switcher popup (default `M-p`). */
|
|
20
|
+
popup: string;
|
|
21
|
+
/** Home cockpit popup — the full fleet home from any session (default `M-h`). */
|
|
22
|
+
home: string;
|
|
23
|
+
/** Cheat-sheet popup (default `M-k`). */
|
|
24
|
+
cheatsheet: string;
|
|
25
|
+
/** Actions menu (default `M-m`). */
|
|
26
|
+
menu: string;
|
|
27
|
+
/** Sidebar (app nav column) toggle (default `M-b`). */
|
|
28
|
+
sidebar: string;
|
|
29
|
+
/** Per-widget panel popups (default `M-e`/`M-g`/`M-,`). */
|
|
30
|
+
panels: AppPanelKeys;
|
|
31
|
+
}
|
|
32
|
+
/** Per-agent-status color token (tmux `colourN` / `#rrggbb`). */
|
|
33
|
+
export type AppThemeStatus = Record<AgentStatus, string>;
|
|
34
|
+
/** The two state glyphs — filled (active/present) and hollow (inactive/quiet). */
|
|
35
|
+
export interface AppThemeGlyphs {
|
|
36
|
+
active: string;
|
|
37
|
+
inactive: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The shared palette — semantic tokens, not per-surface styles. Chrome builders
|
|
41
|
+
* and widgets both map these into their own render layer, so the whole product
|
|
42
|
+
* reads as one system.
|
|
43
|
+
*/
|
|
44
|
+
export interface AppTheme {
|
|
45
|
+
/** Primary/brand accent (default `colour75`). */
|
|
46
|
+
accent: string;
|
|
47
|
+
/** Muted/secondary foreground for dim text (default `colour240`). */
|
|
48
|
+
muted: string;
|
|
49
|
+
/** Default foreground (default `colour250`). */
|
|
50
|
+
fg: string;
|
|
51
|
+
/** Per-status colors (blocked/working/done/idle/unknown). */
|
|
52
|
+
status: AppThemeStatus;
|
|
53
|
+
/** The filled/hollow state glyphs. */
|
|
54
|
+
glyphs: AppThemeGlyphs;
|
|
55
|
+
}
|
|
56
|
+
/** Chrome updater cadence. */
|
|
57
|
+
export interface AppUpdater {
|
|
58
|
+
/** Milliseconds between ticks (default 2000). */
|
|
59
|
+
tickMs: number;
|
|
60
|
+
/** Write a disaster-recovery snapshot every N ticks (default 15). */
|
|
61
|
+
snapshotEvery: number;
|
|
62
|
+
}
|
|
63
|
+
/** Notification channel toggles. */
|
|
64
|
+
export interface AppNotifications {
|
|
65
|
+
toast: boolean;
|
|
66
|
+
macos: boolean;
|
|
67
|
+
}
|
|
68
|
+
/** Restore behaviour toggles. */
|
|
69
|
+
export interface AppRestore {
|
|
70
|
+
resumeAgents: boolean;
|
|
71
|
+
}
|
|
72
|
+
/** Update-check toggles (consumed later by the update-flow card). */
|
|
73
|
+
export interface AppUpdates {
|
|
74
|
+
check: boolean;
|
|
75
|
+
}
|
|
76
|
+
/** First-run welcome toggles. */
|
|
77
|
+
export interface AppWelcome {
|
|
78
|
+
/**
|
|
79
|
+
* Whether the first-run welcome card may show (default true). Set false to
|
|
80
|
+
* suppress it independently of the `~/.tmux-ide/welcomed` marker file (which
|
|
81
|
+
* records that it has already been shown once).
|
|
82
|
+
*/
|
|
83
|
+
show: boolean;
|
|
84
|
+
}
|
|
85
|
+
/** Agent-integration auto-discovery config. */
|
|
86
|
+
export interface AppIntegrations {
|
|
87
|
+
/**
|
|
88
|
+
* Whether the first-adopt integration OFFER may show (default true). Set false
|
|
89
|
+
* to suppress the one-time "claude detected — install the integration?" popup
|
|
90
|
+
* independently of the `<home>/integration-offered` marker (which records that
|
|
91
|
+
* it has already been shown once).
|
|
92
|
+
*/
|
|
93
|
+
offer: boolean;
|
|
94
|
+
}
|
|
95
|
+
/** Worktree flow config (`tmux-ide worktree`). */
|
|
96
|
+
export interface AppWorktrees {
|
|
97
|
+
/**
|
|
98
|
+
* Base directory for worktree checkouts. Empty (default) → a sibling
|
|
99
|
+
* `<repo>-worktrees` dir next to each repo. A non-empty value overrides that
|
|
100
|
+
* base; a relative path is resolved against the repo.
|
|
101
|
+
*/
|
|
102
|
+
dir: string;
|
|
103
|
+
}
|
|
104
|
+
/** The whole config. */
|
|
105
|
+
export interface AppConfig {
|
|
106
|
+
keys: AppKeys;
|
|
107
|
+
theme: AppTheme;
|
|
108
|
+
updater: AppUpdater;
|
|
109
|
+
notifications: AppNotifications;
|
|
110
|
+
restore: AppRestore;
|
|
111
|
+
updates: AppUpdates;
|
|
112
|
+
welcome: AppWelcome;
|
|
113
|
+
integrations: AppIntegrations;
|
|
114
|
+
worktrees: AppWorktrees;
|
|
115
|
+
}
|
|
116
|
+
/** The built-in config — every field's fallback. */
|
|
117
|
+
export declare const DEFAULT_APP_CONFIG: AppConfig;
|
|
118
|
+
/** The default theme tokens — the fallback threaded into the pure builders. */
|
|
119
|
+
export declare const DEFAULT_THEME: AppTheme;
|
|
120
|
+
/** The default key binds — the fallback for the bind command builders. */
|
|
121
|
+
export declare const DEFAULT_KEYS: AppKeys;
|
|
122
|
+
/**
|
|
123
|
+
* PURE — merge an unknown (typically parsed JSON) over {@link DEFAULT_APP_CONFIG}.
|
|
124
|
+
* Every block/leaf is validated independently: a missing or mistyped field falls
|
|
125
|
+
* back to its default, so partial and garbage configs both resolve to a complete,
|
|
126
|
+
* well-typed {@link AppConfig}. Never throws.
|
|
127
|
+
*/
|
|
128
|
+
export declare function parseAppConfig(input: unknown): AppConfig;
|
|
129
|
+
/**
|
|
130
|
+
* Absolute path to the config file: `TMUX_IDE_CONFIG` when set (tests / per-run
|
|
131
|
+
* overrides), else `~/.tmux-ide/config.json`.
|
|
132
|
+
*/
|
|
133
|
+
export declare function appConfigPath(): string;
|
|
134
|
+
/**
|
|
135
|
+
* io — read + parse the config. A missing or malformed file resolves to the full
|
|
136
|
+
* defaults ({@link parseAppConfig} never throws). Reads fresh each call; use
|
|
137
|
+
* {@link getAppConfig} for the cached per-process read.
|
|
138
|
+
*/
|
|
139
|
+
export declare function loadAppConfig(): AppConfig;
|
|
140
|
+
/**
|
|
141
|
+
* The process-cached config. Resolved once on first use — config changes take
|
|
142
|
+
* effect on the next process (e.g. a re-adopt spawns fresh CLI invocations), so
|
|
143
|
+
* caching is safe and keeps the hot updater tick from re-reading the file.
|
|
144
|
+
*/
|
|
145
|
+
export declare function getAppConfig(): AppConfig;
|
|
146
|
+
/** Drop the cache so the next {@link getAppConfig} re-reads. Test-only. */
|
|
147
|
+
export declare function _resetForTests(): void;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one global config — `~/.tmux-ide/config.json` (overridable via
|
|
3
|
+
* `TMUX_IDE_CONFIG`).
|
|
4
|
+
*
|
|
5
|
+
* Everything that used to be hardcoded chrome behaviour lives here: the
|
|
6
|
+
* root-table key binds (`M-p`/`M-k`/`M-m`), the shared THEME TOKENS consumed by
|
|
7
|
+
* BOTH the tmux chrome (status bar / pane chips / actions menu / cheat sheet)
|
|
8
|
+
* AND the OpenTUI widgets, the updater cadence, and the notification/restore/
|
|
9
|
+
* update-check toggles. One palette, one keymap, one file — the foundation for
|
|
10
|
+
* the "one cohesive app" milestone.
|
|
11
|
+
*
|
|
12
|
+
* The tokens are SEMANTIC (accent/muted/fg + per-status colors + glyphs), not
|
|
13
|
+
* per-surface: a single `theme` block drives every surface, so re-theming the
|
|
14
|
+
* whole product is a one-file edit + a re-adopt (no code change).
|
|
15
|
+
*
|
|
16
|
+
* {@link parseAppConfig} is PURE — a deep partial merge over the defaults where
|
|
17
|
+
* any missing or mistyped field falls back to its default and it never throws.
|
|
18
|
+
* {@link loadAppConfig} is the thin io wrapper (missing/malformed file →
|
|
19
|
+
* defaults); {@link getAppConfig} caches that read for the process. The old
|
|
20
|
+
* per-concern readers ({@link ../tui/chrome/notify.ts}, {@link ../restore.ts})
|
|
21
|
+
* now delegate here.
|
|
22
|
+
*/
|
|
23
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
24
|
+
import { homedir } from "node:os";
|
|
25
|
+
import { join } from "node:path";
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Defaults
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
/** The built-in config — every field's fallback. */
|
|
30
|
+
export const DEFAULT_APP_CONFIG = {
|
|
31
|
+
keys: {
|
|
32
|
+
popup: "M-p",
|
|
33
|
+
home: "M-h",
|
|
34
|
+
cheatsheet: "M-k",
|
|
35
|
+
menu: "M-m",
|
|
36
|
+
sidebar: "M-b",
|
|
37
|
+
panels: { explorer: "M-e", changes: "M-g", config: "M-," },
|
|
38
|
+
},
|
|
39
|
+
theme: {
|
|
40
|
+
accent: "colour75",
|
|
41
|
+
muted: "colour240",
|
|
42
|
+
fg: "colour250",
|
|
43
|
+
status: {
|
|
44
|
+
blocked: "colour203",
|
|
45
|
+
working: "colour221",
|
|
46
|
+
done: "colour111",
|
|
47
|
+
idle: "colour114",
|
|
48
|
+
unknown: "colour244",
|
|
49
|
+
},
|
|
50
|
+
glyphs: { active: "●", inactive: "○" },
|
|
51
|
+
},
|
|
52
|
+
updater: { tickMs: 2000, snapshotEvery: 15 },
|
|
53
|
+
notifications: { toast: true, macos: false },
|
|
54
|
+
restore: { resumeAgents: false },
|
|
55
|
+
updates: { check: true },
|
|
56
|
+
welcome: { show: true },
|
|
57
|
+
integrations: { offer: true },
|
|
58
|
+
worktrees: { dir: "" },
|
|
59
|
+
};
|
|
60
|
+
/** The default theme tokens — the fallback threaded into the pure builders. */
|
|
61
|
+
export const DEFAULT_THEME = DEFAULT_APP_CONFIG.theme;
|
|
62
|
+
/** The default key binds — the fallback for the bind command builders. */
|
|
63
|
+
export const DEFAULT_KEYS = DEFAULT_APP_CONFIG.keys;
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
// Pure parse (deep partial merge over defaults)
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
/** A plain object, or `{}` for anything that isn't one (arrays included). */
|
|
68
|
+
function asObject(value) {
|
|
69
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
70
|
+
? value
|
|
71
|
+
: {};
|
|
72
|
+
}
|
|
73
|
+
/** A non-empty string, else the default. */
|
|
74
|
+
function pickString(value, fallback) {
|
|
75
|
+
return typeof value === "string" && value.length > 0 ? value : fallback;
|
|
76
|
+
}
|
|
77
|
+
/** A boolean, else the default. */
|
|
78
|
+
function pickBool(value, fallback) {
|
|
79
|
+
return typeof value === "boolean" ? value : fallback;
|
|
80
|
+
}
|
|
81
|
+
/** A positive integer, else the default. */
|
|
82
|
+
function pickPosInt(value, fallback) {
|
|
83
|
+
return typeof value === "number" && Number.isInteger(value) && value > 0 ? value : fallback;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* PURE — merge an unknown (typically parsed JSON) over {@link DEFAULT_APP_CONFIG}.
|
|
87
|
+
* Every block/leaf is validated independently: a missing or mistyped field falls
|
|
88
|
+
* back to its default, so partial and garbage configs both resolve to a complete,
|
|
89
|
+
* well-typed {@link AppConfig}. Never throws.
|
|
90
|
+
*/
|
|
91
|
+
export function parseAppConfig(input) {
|
|
92
|
+
const D = DEFAULT_APP_CONFIG;
|
|
93
|
+
const root = asObject(input);
|
|
94
|
+
const keys = asObject(root.keys);
|
|
95
|
+
const panels = asObject(keys.panels);
|
|
96
|
+
const theme = asObject(root.theme);
|
|
97
|
+
const status = asObject(theme.status);
|
|
98
|
+
const glyphs = asObject(theme.glyphs);
|
|
99
|
+
const updater = asObject(root.updater);
|
|
100
|
+
const notifications = asObject(root.notifications);
|
|
101
|
+
const restore = asObject(root.restore);
|
|
102
|
+
const updates = asObject(root.updates);
|
|
103
|
+
const welcome = asObject(root.welcome);
|
|
104
|
+
const integrations = asObject(root.integrations);
|
|
105
|
+
const worktrees = asObject(root.worktrees);
|
|
106
|
+
return {
|
|
107
|
+
keys: {
|
|
108
|
+
popup: pickString(keys.popup, D.keys.popup),
|
|
109
|
+
home: pickString(keys.home, D.keys.home),
|
|
110
|
+
cheatsheet: pickString(keys.cheatsheet, D.keys.cheatsheet),
|
|
111
|
+
menu: pickString(keys.menu, D.keys.menu),
|
|
112
|
+
sidebar: pickString(keys.sidebar, D.keys.sidebar),
|
|
113
|
+
panels: {
|
|
114
|
+
explorer: pickString(panels.explorer, D.keys.panels.explorer),
|
|
115
|
+
changes: pickString(panels.changes, D.keys.panels.changes),
|
|
116
|
+
config: pickString(panels.config, D.keys.panels.config),
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
theme: {
|
|
120
|
+
accent: pickString(theme.accent, D.theme.accent),
|
|
121
|
+
muted: pickString(theme.muted, D.theme.muted),
|
|
122
|
+
fg: pickString(theme.fg, D.theme.fg),
|
|
123
|
+
status: {
|
|
124
|
+
blocked: pickString(status.blocked, D.theme.status.blocked),
|
|
125
|
+
working: pickString(status.working, D.theme.status.working),
|
|
126
|
+
done: pickString(status.done, D.theme.status.done),
|
|
127
|
+
idle: pickString(status.idle, D.theme.status.idle),
|
|
128
|
+
unknown: pickString(status.unknown, D.theme.status.unknown),
|
|
129
|
+
},
|
|
130
|
+
glyphs: {
|
|
131
|
+
active: pickString(glyphs.active, D.theme.glyphs.active),
|
|
132
|
+
inactive: pickString(glyphs.inactive, D.theme.glyphs.inactive),
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
updater: {
|
|
136
|
+
tickMs: pickPosInt(updater.tickMs, D.updater.tickMs),
|
|
137
|
+
snapshotEvery: pickPosInt(updater.snapshotEvery, D.updater.snapshotEvery),
|
|
138
|
+
},
|
|
139
|
+
notifications: {
|
|
140
|
+
toast: pickBool(notifications.toast, D.notifications.toast),
|
|
141
|
+
macos: pickBool(notifications.macos, D.notifications.macos),
|
|
142
|
+
},
|
|
143
|
+
restore: { resumeAgents: pickBool(restore.resumeAgents, D.restore.resumeAgents) },
|
|
144
|
+
updates: { check: pickBool(updates.check, D.updates.check) },
|
|
145
|
+
welcome: { show: pickBool(welcome.show, D.welcome.show) },
|
|
146
|
+
integrations: { offer: pickBool(integrations.offer, D.integrations.offer) },
|
|
147
|
+
worktrees: { dir: pickString(worktrees.dir, D.worktrees.dir) },
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
// io
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
/**
|
|
154
|
+
* Absolute path to the config file: `TMUX_IDE_CONFIG` when set (tests / per-run
|
|
155
|
+
* overrides), else `~/.tmux-ide/config.json`.
|
|
156
|
+
*/
|
|
157
|
+
export function appConfigPath() {
|
|
158
|
+
return process.env.TMUX_IDE_CONFIG ?? join(homedir(), ".tmux-ide", "config.json");
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* io — read + parse the config. A missing or malformed file resolves to the full
|
|
162
|
+
* defaults ({@link parseAppConfig} never throws). Reads fresh each call; use
|
|
163
|
+
* {@link getAppConfig} for the cached per-process read.
|
|
164
|
+
*/
|
|
165
|
+
export function loadAppConfig() {
|
|
166
|
+
const path = appConfigPath();
|
|
167
|
+
if (!existsSync(path))
|
|
168
|
+
return parseAppConfig(undefined);
|
|
169
|
+
try {
|
|
170
|
+
return parseAppConfig(JSON.parse(readFileSync(path, "utf-8")));
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// malformed file — full defaults
|
|
174
|
+
return parseAppConfig(undefined);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
let cached = null;
|
|
178
|
+
/**
|
|
179
|
+
* The process-cached config. Resolved once on first use — config changes take
|
|
180
|
+
* effect on the next process (e.g. a re-adopt spawns fresh CLI invocations), so
|
|
181
|
+
* caching is safe and keeps the hot updater tick from re-reading the file.
|
|
182
|
+
*/
|
|
183
|
+
export function getAppConfig() {
|
|
184
|
+
if (!cached)
|
|
185
|
+
cached = loadAppConfig();
|
|
186
|
+
return cached;
|
|
187
|
+
}
|
|
188
|
+
/** Drop the cache so the next {@link getAppConfig} re-reads. Test-only. */
|
|
189
|
+
export function _resetForTests() {
|
|
190
|
+
cached = null;
|
|
191
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface AppSettings {
|
|
2
|
+
remoteAccess: {
|
|
3
|
+
enabled: boolean;
|
|
4
|
+
token: string | null;
|
|
5
|
+
};
|
|
6
|
+
}
|
|
7
|
+
export declare function appSettingsPath(): string;
|
|
8
|
+
export declare function readAppSettings(): AppSettings;
|
|
9
|
+
export declare function writeAppSettings(next: AppSettings): void;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
const DEFAULT_SETTINGS = {
|
|
5
|
+
remoteAccess: {
|
|
6
|
+
enabled: false,
|
|
7
|
+
token: null,
|
|
8
|
+
},
|
|
9
|
+
};
|
|
10
|
+
function settingsDir() {
|
|
11
|
+
return process.env.TMUX_IDE_SETTINGS_DIR ?? join(homedir(), ".tmux-ide");
|
|
12
|
+
}
|
|
13
|
+
export function appSettingsPath() {
|
|
14
|
+
return join(settingsDir(), "app-settings.json");
|
|
15
|
+
}
|
|
16
|
+
function normalizeSettings(value) {
|
|
17
|
+
if (!value || typeof value !== "object")
|
|
18
|
+
return structuredClone(DEFAULT_SETTINGS);
|
|
19
|
+
const remote = value.remoteAccess;
|
|
20
|
+
if (!remote || typeof remote !== "object")
|
|
21
|
+
return structuredClone(DEFAULT_SETTINGS);
|
|
22
|
+
const enabled = remote.enabled === true;
|
|
23
|
+
const rawToken = remote.token;
|
|
24
|
+
const token = typeof rawToken === "string" && rawToken.length > 0 ? rawToken : null;
|
|
25
|
+
return { remoteAccess: { enabled, token } };
|
|
26
|
+
}
|
|
27
|
+
export function readAppSettings() {
|
|
28
|
+
const path = appSettingsPath();
|
|
29
|
+
if (!existsSync(path))
|
|
30
|
+
return structuredClone(DEFAULT_SETTINGS);
|
|
31
|
+
try {
|
|
32
|
+
return normalizeSettings(JSON.parse(readFileSync(path, "utf-8")));
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return structuredClone(DEFAULT_SETTINGS);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function writeAppSettings(next) {
|
|
39
|
+
const path = appSettingsPath();
|
|
40
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
41
|
+
const tmp = `${path}.${process.pid}.${Date.now()}.tmp`;
|
|
42
|
+
writeFileSync(tmp, `${JSON.stringify(normalizeSettings(next), null, 2)}\n`, "utf-8");
|
|
43
|
+
renameSync(tmp, path);
|
|
44
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface AuthResult {
|
|
2
|
+
success: boolean;
|
|
3
|
+
userId?: string;
|
|
4
|
+
token?: string;
|
|
5
|
+
error?: string;
|
|
6
|
+
}
|
|
7
|
+
interface SSHKeyAuth {
|
|
8
|
+
publicKey: string;
|
|
9
|
+
signature: string;
|
|
10
|
+
challengeId: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class AuthService {
|
|
13
|
+
private challenges;
|
|
14
|
+
private jwtSecret;
|
|
15
|
+
private cleanupTimer;
|
|
16
|
+
constructor(secret?: string);
|
|
17
|
+
dispose(): void;
|
|
18
|
+
private cleanupExpiredChallenges;
|
|
19
|
+
generateToken(userId: string): string;
|
|
20
|
+
verifyToken(token: string): {
|
|
21
|
+
valid: boolean;
|
|
22
|
+
userId?: string;
|
|
23
|
+
};
|
|
24
|
+
createChallenge(userId: string): {
|
|
25
|
+
challengeId: string;
|
|
26
|
+
challenge: string;
|
|
27
|
+
};
|
|
28
|
+
authenticateWithSSHKey(auth: SSHKeyAuth): Promise<AuthResult>;
|
|
29
|
+
private verifySSHSignature;
|
|
30
|
+
private checkSSHKeyAuthorization;
|
|
31
|
+
getCurrentUser(): string;
|
|
32
|
+
}
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// Based on VibeTunnel (MIT) — github.com/amantus-ai/vibetunnel
|
|
2
|
+
import * as crypto from "node:crypto";
|
|
3
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { homedir } from "node:os";
|
|
6
|
+
import { logger } from "../log.js";
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// JWT helpers (HMAC-SHA256, no external dependency)
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
function base64url(buf) {
|
|
11
|
+
const b = typeof buf === "string" ? Buffer.from(buf) : buf;
|
|
12
|
+
return b.toString("base64url");
|
|
13
|
+
}
|
|
14
|
+
function decodeBase64url(str) {
|
|
15
|
+
return Buffer.from(str, "base64url");
|
|
16
|
+
}
|
|
17
|
+
function signJwt(payload, secret, expiresInSec) {
|
|
18
|
+
const header = { alg: "HS256", typ: "JWT" };
|
|
19
|
+
const now = Math.floor(Date.now() / 1000);
|
|
20
|
+
const body = { ...payload, iat: now, exp: now + expiresInSec };
|
|
21
|
+
const segments = [base64url(JSON.stringify(header)), base64url(JSON.stringify(body))];
|
|
22
|
+
const sigInput = segments.join(".");
|
|
23
|
+
const sig = crypto.createHmac("sha256", secret).update(sigInput).digest();
|
|
24
|
+
segments.push(base64url(sig));
|
|
25
|
+
return segments.join(".");
|
|
26
|
+
}
|
|
27
|
+
function verifyJwt(token, secret) {
|
|
28
|
+
const parts = token.split(".");
|
|
29
|
+
if (parts.length !== 3)
|
|
30
|
+
return { valid: false };
|
|
31
|
+
const sigInput = parts[0] + "." + parts[1];
|
|
32
|
+
const expected = crypto.createHmac("sha256", secret).update(sigInput).digest();
|
|
33
|
+
const actual = decodeBase64url(parts[2]);
|
|
34
|
+
if (expected.length !== actual.length || !crypto.timingSafeEqual(expected, actual)) {
|
|
35
|
+
return { valid: false };
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const payload = JSON.parse(decodeBase64url(parts[1]).toString());
|
|
39
|
+
if (typeof payload.exp === "number" && payload.exp < Math.floor(Date.now() / 1000)) {
|
|
40
|
+
return { valid: false };
|
|
41
|
+
}
|
|
42
|
+
return { valid: true, payload };
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return { valid: false };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
// AuthService
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
const TOKEN_EXPIRY_SEC = 24 * 60 * 60; // 24 hours
|
|
52
|
+
const CHALLENGE_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
|
|
53
|
+
export class AuthService {
|
|
54
|
+
challenges = new Map();
|
|
55
|
+
jwtSecret;
|
|
56
|
+
cleanupTimer;
|
|
57
|
+
constructor(secret) {
|
|
58
|
+
this.jwtSecret = secret ?? process.env.JWT_SECRET ?? crypto.randomBytes(64).toString("hex");
|
|
59
|
+
this.cleanupTimer = setInterval(() => this.cleanupExpiredChallenges(), 60_000);
|
|
60
|
+
}
|
|
61
|
+
dispose() {
|
|
62
|
+
clearInterval(this.cleanupTimer);
|
|
63
|
+
}
|
|
64
|
+
cleanupExpiredChallenges() {
|
|
65
|
+
const now = Date.now();
|
|
66
|
+
for (const [id, ch] of this.challenges) {
|
|
67
|
+
if (now - ch.timestamp > CHALLENGE_TIMEOUT_MS) {
|
|
68
|
+
this.challenges.delete(id);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// ---- JWT ----------------------------------------------------------------
|
|
73
|
+
generateToken(userId) {
|
|
74
|
+
return signJwt({ userId }, this.jwtSecret, TOKEN_EXPIRY_SEC);
|
|
75
|
+
}
|
|
76
|
+
verifyToken(token) {
|
|
77
|
+
const result = verifyJwt(token, this.jwtSecret);
|
|
78
|
+
if (!result.valid)
|
|
79
|
+
return { valid: false };
|
|
80
|
+
return { valid: true, userId: result.payload.userId };
|
|
81
|
+
}
|
|
82
|
+
// ---- SSH challenge-response --------------------------------------------
|
|
83
|
+
createChallenge(userId) {
|
|
84
|
+
const challengeId = crypto.randomUUID();
|
|
85
|
+
const challenge = crypto.randomBytes(32);
|
|
86
|
+
this.challenges.set(challengeId, {
|
|
87
|
+
challengeId,
|
|
88
|
+
challenge,
|
|
89
|
+
timestamp: Date.now(),
|
|
90
|
+
userId,
|
|
91
|
+
});
|
|
92
|
+
return { challengeId, challenge: challenge.toString("base64") };
|
|
93
|
+
}
|
|
94
|
+
async authenticateWithSSHKey(auth) {
|
|
95
|
+
const challenge = this.challenges.get(auth.challengeId);
|
|
96
|
+
if (!challenge) {
|
|
97
|
+
return { success: false, error: "Invalid or expired challenge" };
|
|
98
|
+
}
|
|
99
|
+
const sigBuf = Buffer.from(auth.signature, "base64");
|
|
100
|
+
if (!this.verifySSHSignature(challenge.challenge, sigBuf, auth.publicKey)) {
|
|
101
|
+
return { success: false, error: "Invalid SSH key signature" };
|
|
102
|
+
}
|
|
103
|
+
const authorized = this.checkSSHKeyAuthorization(challenge.userId, auth.publicKey);
|
|
104
|
+
if (!authorized) {
|
|
105
|
+
return { success: false, error: "SSH key not authorized for this user" };
|
|
106
|
+
}
|
|
107
|
+
this.challenges.delete(auth.challengeId);
|
|
108
|
+
const token = this.generateToken(challenge.userId);
|
|
109
|
+
return { success: true, userId: challenge.userId, token };
|
|
110
|
+
}
|
|
111
|
+
// ---- SSH helpers -------------------------------------------------------
|
|
112
|
+
verifySSHSignature(challenge, signature, publicKeyStr) {
|
|
113
|
+
try {
|
|
114
|
+
const parts = publicKeyStr.trim().split(" ");
|
|
115
|
+
if (parts.length < 2)
|
|
116
|
+
return false;
|
|
117
|
+
const keyType = parts[0];
|
|
118
|
+
const keyData = parts[1];
|
|
119
|
+
if (keyType !== "ssh-ed25519") {
|
|
120
|
+
logger.warn("auth", `Unsupported key type: ${keyType}`);
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
if (signature.length !== 64)
|
|
124
|
+
return false;
|
|
125
|
+
const sshBuf = Buffer.from(keyData, "base64");
|
|
126
|
+
let offset = 0;
|
|
127
|
+
const algLen = sshBuf.readUInt32BE(offset);
|
|
128
|
+
offset += 4 + algLen;
|
|
129
|
+
const keyLen = sshBuf.readUInt32BE(offset);
|
|
130
|
+
offset += 4;
|
|
131
|
+
if (keyLen !== 32)
|
|
132
|
+
return false;
|
|
133
|
+
const rawPub = sshBuf.subarray(offset, offset + 32);
|
|
134
|
+
const pubKey = crypto.createPublicKey({
|
|
135
|
+
key: Buffer.concat([
|
|
136
|
+
Buffer.from([0x30, 0x2a]),
|
|
137
|
+
Buffer.from([0x30, 0x05]),
|
|
138
|
+
Buffer.from([0x06, 0x03, 0x2b, 0x65, 0x70]),
|
|
139
|
+
Buffer.from([0x03, 0x21, 0x00]),
|
|
140
|
+
rawPub,
|
|
141
|
+
]),
|
|
142
|
+
format: "der",
|
|
143
|
+
type: "spki",
|
|
144
|
+
});
|
|
145
|
+
return crypto.verify(null, challenge, pubKey, signature);
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
logger.error("auth", "SSH signature verification failed", {
|
|
149
|
+
error: String(err),
|
|
150
|
+
});
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
checkSSHKeyAuthorization(userId, publicKey) {
|
|
155
|
+
try {
|
|
156
|
+
const home = userId === process.env.USER ? homedir() : `/home/${userId}`;
|
|
157
|
+
const authKeysPath = join(home, ".ssh", "authorized_keys");
|
|
158
|
+
if (!existsSync(authKeysPath))
|
|
159
|
+
return false;
|
|
160
|
+
const authorizedKeys = readFileSync(authKeysPath, "utf-8");
|
|
161
|
+
const parts = publicKey.trim().split(" ");
|
|
162
|
+
const keyData = parts.length > 1 ? parts[1] : parts[0];
|
|
163
|
+
return authorizedKeys.includes(keyData);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
getCurrentUser() {
|
|
170
|
+
return process.env.USER ?? process.env.USERNAME ?? "unknown";
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from "hono";
|
|
2
|
+
import { AuthService } from "./auth-service.ts";
|
|
3
|
+
import type { AuthConfig } from "./types.ts";
|
|
4
|
+
/**
|
|
5
|
+
* Hono middleware that checks Authorization Bearer header.
|
|
6
|
+
*
|
|
7
|
+
* - Bypasses /health and /api/auth/* routes.
|
|
8
|
+
* - When method is "none" (default), passes through everything (backward compatible).
|
|
9
|
+
* - Otherwise validates the JWT and sets c.set("userId", ...).
|
|
10
|
+
*/
|
|
11
|
+
export declare function authMiddleware(authService: AuthService, config: AuthConfig): MiddlewareHandler;
|
|
12
|
+
/**
|
|
13
|
+
* Validate a JWT token from a query parameter (for WebSocket upgrade).
|
|
14
|
+
* Returns the userId if valid, null otherwise.
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateWsToken(authService: AuthService, config: AuthConfig, token: string | null): string | null;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hono middleware that checks Authorization Bearer header.
|
|
3
|
+
*
|
|
4
|
+
* - Bypasses /health and /api/auth/* routes.
|
|
5
|
+
* - When method is "none" (default), passes through everything (backward compatible).
|
|
6
|
+
* - Otherwise validates the JWT and sets c.set("userId", ...).
|
|
7
|
+
*/
|
|
8
|
+
export function authMiddleware(authService, config) {
|
|
9
|
+
return async (c, next) => {
|
|
10
|
+
// Backward compatible: no auth required when method is "none"
|
|
11
|
+
if (config.method === "none") {
|
|
12
|
+
return next();
|
|
13
|
+
}
|
|
14
|
+
const path = new URL(c.req.url).pathname;
|
|
15
|
+
// Bypass health and auth endpoints
|
|
16
|
+
if (path === "/health" || path.startsWith("/api/auth/")) {
|
|
17
|
+
return next();
|
|
18
|
+
}
|
|
19
|
+
const authHeader = c.req.header("Authorization");
|
|
20
|
+
if (!authHeader?.startsWith("Bearer ")) {
|
|
21
|
+
return c.json({ error: "Missing or invalid Authorization header" }, 401);
|
|
22
|
+
}
|
|
23
|
+
const token = authHeader.slice(7);
|
|
24
|
+
const result = authService.verifyToken(token);
|
|
25
|
+
if (!result.valid) {
|
|
26
|
+
return c.json({ error: "Invalid or expired token" }, 401);
|
|
27
|
+
}
|
|
28
|
+
c.set("userId", result.userId);
|
|
29
|
+
return next();
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Validate a JWT token from a query parameter (for WebSocket upgrade).
|
|
34
|
+
* Returns the userId if valid, null otherwise.
|
|
35
|
+
*/
|
|
36
|
+
export function validateWsToken(authService, config, token) {
|
|
37
|
+
if (config.method === "none")
|
|
38
|
+
return "anonymous";
|
|
39
|
+
if (!token)
|
|
40
|
+
return null;
|
|
41
|
+
const result = authService.verifyToken(token);
|
|
42
|
+
return result.valid ? (result.userId ?? null) : null;
|
|
43
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { AuthConfigSchema, type AuthConfig } from "@tmux-ide/contracts";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function generateAuthToken(): string;
|