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.
Files changed (805) hide show
  1. package/README.md +115 -101
  2. package/bin/cli.js +13678 -4
  3. package/bin/cli.ts +1143 -260
  4. package/package.json +27 -17
  5. package/packages/daemon/dist/__tests__/support.d.ts +7 -0
  6. package/packages/daemon/dist/__tests__/support.js +33 -0
  7. package/packages/daemon/dist/agent-explain.d.ts +45 -0
  8. package/packages/daemon/dist/agent-explain.js +210 -0
  9. package/packages/daemon/dist/attach.d.ts +3 -0
  10. package/packages/daemon/dist/attach.js +14 -0
  11. package/packages/daemon/dist/bin.d.ts +2 -0
  12. package/packages/daemon/dist/bin.js +3 -0
  13. package/packages/daemon/dist/canonical.d.ts +2 -0
  14. package/packages/daemon/dist/canonical.js +1 -0
  15. package/packages/daemon/dist/cli.d.ts +1 -0
  16. package/packages/daemon/dist/cli.js +425 -0
  17. package/packages/daemon/dist/command-center/actions/contract.d.ts +1 -0
  18. package/packages/daemon/dist/command-center/actions/contract.js +2 -0
  19. package/packages/daemon/dist/command-center/actions/dispatcher.d.ts +27 -0
  20. package/packages/daemon/dist/command-center/actions/dispatcher.js +109 -0
  21. package/packages/daemon/dist/command-center/actions/errors.d.ts +38 -0
  22. package/packages/daemon/dist/command-center/actions/errors.js +56 -0
  23. package/packages/daemon/dist/command-center/actions/handlers/_project-context.d.ts +12 -0
  24. package/packages/daemon/dist/command-center/actions/handlers/_project-context.js +12 -0
  25. package/packages/daemon/dist/command-center/actions/handlers/_resolve-project.d.ts +42 -0
  26. package/packages/daemon/dist/command-center/actions/handlers/_resolve-project.js +48 -0
  27. package/packages/daemon/dist/command-center/actions/handlers/app-set-remote-access.d.ts +23 -0
  28. package/packages/daemon/dist/command-center/actions/handlers/app-set-remote-access.js +67 -0
  29. package/packages/daemon/dist/command-center/actions/handlers/config-actions.d.ts +12 -0
  30. package/packages/daemon/dist/command-center/actions/handlers/config-actions.js +69 -0
  31. package/packages/daemon/dist/command-center/actions/handlers/daemon-shutdown.d.ts +6 -0
  32. package/packages/daemon/dist/command-center/actions/handlers/daemon-shutdown.js +24 -0
  33. package/packages/daemon/dist/command-center/actions/handlers/project-activate.d.ts +7 -0
  34. package/packages/daemon/dist/command-center/actions/handlers/project-activate.js +19 -0
  35. package/packages/daemon/dist/command-center/actions/handlers/project-launch.d.ts +18 -0
  36. package/packages/daemon/dist/command-center/actions/handlers/project-launch.js +58 -0
  37. package/packages/daemon/dist/command-center/actions/handlers/project-open-terminal.d.ts +32 -0
  38. package/packages/daemon/dist/command-center/actions/handlers/project-open-terminal.js +69 -0
  39. package/packages/daemon/dist/command-center/actions/handlers/project-restart.d.ts +17 -0
  40. package/packages/daemon/dist/command-center/actions/handlers/project-restart.js +27 -0
  41. package/packages/daemon/dist/command-center/actions/handlers/project-stop.d.ts +24 -0
  42. package/packages/daemon/dist/command-center/actions/handlers/project-stop.js +38 -0
  43. package/packages/daemon/dist/command-center/actions/handlers/terminal-respawn.d.ts +24 -0
  44. package/packages/daemon/dist/command-center/actions/handlers/terminal-respawn.js +88 -0
  45. package/packages/daemon/dist/command-center/actions/handlers/terminal-stop.d.ts +14 -0
  46. package/packages/daemon/dist/command-center/actions/handlers/terminal-stop.js +22 -0
  47. package/packages/daemon/dist/command-center/actions/registry.d.ts +35 -0
  48. package/packages/daemon/dist/command-center/actions/registry.js +109 -0
  49. package/packages/daemon/dist/command-center/discovery.d.ts +23 -0
  50. package/packages/daemon/dist/command-center/discovery.js +67 -0
  51. package/packages/daemon/dist/command-center/index.d.ts +10 -0
  52. package/packages/daemon/dist/command-center/index.js +21 -0
  53. package/packages/daemon/dist/command-center/schemas.d.ts +76 -0
  54. package/packages/daemon/dist/command-center/schemas.js +68 -0
  55. package/packages/daemon/dist/command-center/server.d.ts +26 -0
  56. package/packages/daemon/dist/command-center/server.js +1103 -0
  57. package/packages/daemon/dist/command-center/ws-events.d.ts +59 -0
  58. package/packages/daemon/dist/command-center/ws-events.js +277 -0
  59. package/packages/daemon/dist/config.d.ts +19 -0
  60. package/packages/daemon/dist/config.js +494 -0
  61. package/packages/daemon/dist/detect.d.ts +15 -0
  62. package/packages/daemon/dist/detect.js +228 -0
  63. package/packages/daemon/dist/doctor.d.ts +21 -0
  64. package/packages/daemon/dist/doctor.js +154 -0
  65. package/packages/daemon/dist/embed.d.ts +1 -0
  66. package/packages/daemon/dist/embed.js +1 -0
  67. package/packages/daemon/dist/index.d.ts +3 -0
  68. package/packages/daemon/dist/index.js +2 -0
  69. package/packages/daemon/dist/init.d.ts +4 -0
  70. package/packages/daemon/dist/init.js +174 -0
  71. package/packages/daemon/dist/inspect.d.ts +54 -0
  72. package/packages/daemon/dist/inspect.js +118 -0
  73. package/packages/daemon/dist/launch.d.ts +23 -0
  74. package/packages/daemon/dist/launch.js +250 -0
  75. package/packages/daemon/dist/lib/active-projects.d.ts +12 -0
  76. package/packages/daemon/dist/lib/active-projects.js +35 -0
  77. package/packages/daemon/dist/lib/agent-discovery.d.ts +43 -0
  78. package/packages/daemon/dist/lib/agent-discovery.js +85 -0
  79. package/packages/daemon/dist/lib/app-config.d.ts +147 -0
  80. package/packages/daemon/dist/lib/app-config.js +191 -0
  81. package/packages/daemon/dist/lib/app-settings.d.ts +9 -0
  82. package/packages/daemon/dist/lib/app-settings.js +44 -0
  83. package/packages/daemon/dist/lib/auth/auth-service.d.ts +33 -0
  84. package/packages/daemon/dist/lib/auth/auth-service.js +172 -0
  85. package/packages/daemon/dist/lib/auth/middleware.d.ts +16 -0
  86. package/packages/daemon/dist/lib/auth/middleware.js +43 -0
  87. package/packages/daemon/dist/lib/auth/types.d.ts +1 -0
  88. package/packages/daemon/dist/lib/auth/types.js +2 -0
  89. package/packages/daemon/dist/lib/auth-token.d.ts +1 -0
  90. package/packages/daemon/dist/lib/auth-token.js +4 -0
  91. package/packages/daemon/dist/lib/authorship.d.ts +62 -0
  92. package/packages/daemon/dist/lib/authorship.js +209 -0
  93. package/packages/daemon/dist/lib/canonical-daemon.d.ts +21 -0
  94. package/packages/daemon/dist/lib/canonical-daemon.js +111 -0
  95. package/packages/daemon/dist/lib/cli-action-bridge.d.ts +27 -0
  96. package/packages/daemon/dist/lib/cli-action-bridge.js +161 -0
  97. package/packages/daemon/dist/lib/daemon-embed.d.ts +31 -0
  98. package/packages/daemon/dist/lib/daemon-embed.js +643 -0
  99. package/packages/daemon/dist/lib/daemon-watchdog.d.ts +16 -0
  100. package/packages/daemon/dist/lib/daemon-watchdog.js +98 -0
  101. package/packages/daemon/dist/lib/daemon.d.ts +8 -0
  102. package/packages/daemon/dist/lib/daemon.js +79 -0
  103. package/packages/daemon/dist/lib/dot-path.d.ts +2 -0
  104. package/packages/daemon/dist/lib/dot-path.js +17 -0
  105. package/packages/daemon/dist/lib/errors.d.ts +37 -0
  106. package/packages/daemon/dist/lib/errors.js +50 -0
  107. package/packages/daemon/dist/lib/filesystem-browser.d.ts +85 -0
  108. package/packages/daemon/dist/lib/filesystem-browser.js +257 -0
  109. package/packages/daemon/dist/lib/launch-plan.d.ts +6 -0
  110. package/packages/daemon/dist/lib/launch-plan.js +76 -0
  111. package/packages/daemon/dist/lib/log.d.ts +40 -0
  112. package/packages/daemon/dist/lib/log.js +86 -0
  113. package/packages/daemon/dist/lib/output.d.ts +9 -0
  114. package/packages/daemon/dist/lib/output.js +65 -0
  115. package/packages/daemon/dist/lib/project-init-runner.d.ts +46 -0
  116. package/packages/daemon/dist/lib/project-init-runner.js +117 -0
  117. package/packages/daemon/dist/lib/project-inspect.d.ts +28 -0
  118. package/packages/daemon/dist/lib/project-inspect.js +67 -0
  119. package/packages/daemon/dist/lib/project-onboard.d.ts +58 -0
  120. package/packages/daemon/dist/lib/project-onboard.js +108 -0
  121. package/packages/daemon/dist/lib/project-probe.d.ts +35 -0
  122. package/packages/daemon/dist/lib/project-probe.js +61 -0
  123. package/packages/daemon/dist/lib/project-registry.d.ts +76 -0
  124. package/packages/daemon/dist/lib/project-registry.js +230 -0
  125. package/packages/daemon/dist/lib/session-monitor.d.ts +15 -0
  126. package/packages/daemon/dist/lib/session-monitor.js +103 -0
  127. package/packages/daemon/dist/lib/session-options.d.ts +13 -0
  128. package/packages/daemon/dist/lib/session-options.js +85 -0
  129. package/packages/daemon/dist/lib/shell.d.ts +5 -0
  130. package/{src/lib/shell.ts → packages/daemon/dist/lib/shell.js} +3 -3
  131. package/packages/daemon/dist/lib/sizes.d.ts +16 -0
  132. package/packages/daemon/dist/lib/sizes.js +36 -0
  133. package/packages/daemon/dist/lib/skill-sync.d.ts +60 -0
  134. package/packages/daemon/dist/lib/skill-sync.js +128 -0
  135. package/packages/daemon/dist/lib/slugify.d.ts +4 -0
  136. package/packages/daemon/dist/lib/slugify.js +10 -0
  137. package/packages/daemon/dist/lib/terminals-store.d.ts +27 -0
  138. package/packages/daemon/dist/lib/terminals-store.js +111 -0
  139. package/packages/daemon/dist/lib/update-check.d.ts +118 -0
  140. package/packages/daemon/dist/lib/update-check.js +261 -0
  141. package/packages/daemon/dist/lib/update.d.ts +65 -0
  142. package/packages/daemon/dist/lib/update.js +141 -0
  143. package/packages/daemon/dist/lib/workspace-registry.d.ts +84 -0
  144. package/packages/daemon/dist/lib/workspace-registry.js +176 -0
  145. package/packages/daemon/dist/lib/worktree.d.ts +76 -0
  146. package/packages/daemon/dist/lib/worktree.js +207 -0
  147. package/packages/daemon/dist/lib/yaml-io.d.ts +10 -0
  148. package/packages/daemon/dist/lib/yaml-io.js +24 -0
  149. package/packages/daemon/dist/ls.d.ts +3 -0
  150. package/packages/daemon/dist/ls.js +35 -0
  151. package/packages/daemon/dist/restart.d.ts +4 -0
  152. package/packages/daemon/dist/restart.js +16 -0
  153. package/packages/daemon/dist/restore.d.ts +86 -0
  154. package/packages/daemon/dist/restore.js +406 -0
  155. package/packages/daemon/dist/schemas/domain.d.ts +1 -0
  156. package/packages/daemon/dist/schemas/domain.js +2 -0
  157. package/packages/daemon/dist/schemas/filesystem.d.ts +29 -0
  158. package/packages/daemon/dist/schemas/filesystem.js +29 -0
  159. package/packages/daemon/dist/schemas/ide-config.d.ts +1 -0
  160. package/packages/daemon/dist/schemas/ide-config.js +2 -0
  161. package/packages/daemon/dist/schemas/index.d.ts +12 -0
  162. package/packages/daemon/dist/schemas/index.js +6 -0
  163. package/packages/daemon/dist/schemas/inspect.d.ts +53 -0
  164. package/packages/daemon/dist/schemas/inspect.js +57 -0
  165. package/packages/daemon/dist/schemas/registry.d.ts +35 -0
  166. package/packages/daemon/dist/schemas/registry.js +43 -0
  167. package/packages/daemon/dist/schemas/ws-events.d.ts +72 -0
  168. package/packages/daemon/dist/schemas/ws-events.js +110 -0
  169. package/packages/daemon/dist/send.d.ts +27 -0
  170. package/packages/daemon/dist/send.js +141 -0
  171. package/packages/daemon/dist/server/index.d.ts +10 -0
  172. package/packages/daemon/dist/server/index.js +55 -0
  173. package/packages/daemon/dist/server/pty-bridge.d.ts +174 -0
  174. package/packages/daemon/dist/server/pty-bridge.js +422 -0
  175. package/packages/daemon/dist/server/standalone.d.ts +1 -0
  176. package/packages/daemon/dist/server/standalone.js +14 -0
  177. package/packages/daemon/dist/server/ws-route.d.ts +74 -0
  178. package/packages/daemon/dist/server/ws-route.js +379 -0
  179. package/packages/daemon/dist/status.d.ts +3 -0
  180. package/packages/daemon/dist/status.js +46 -0
  181. package/packages/daemon/dist/stop.d.ts +3 -0
  182. package/packages/daemon/dist/stop.js +21 -0
  183. package/packages/daemon/dist/terminal/NodePtyAdapter.d.ts +44 -0
  184. package/packages/daemon/dist/terminal/NodePtyAdapter.js +253 -0
  185. package/packages/daemon/dist/terminal/PtyAdapter.d.ts +124 -0
  186. package/packages/daemon/dist/terminal/PtyAdapter.js +43 -0
  187. package/packages/daemon/dist/terminal/__tests__/MockPtyAdapter.d.ts +77 -0
  188. package/packages/daemon/dist/terminal/__tests__/MockPtyAdapter.js +155 -0
  189. package/packages/daemon/dist/types.d.ts +2 -0
  190. package/packages/daemon/dist/types.js +1 -0
  191. package/packages/daemon/dist/validate.d.ts +4 -0
  192. package/packages/daemon/dist/validate.js +184 -0
  193. package/packages/daemon/dist/widgets/changes/index.d.ts +1 -0
  194. package/packages/daemon/dist/widgets/changes/index.jsx +575 -0
  195. package/packages/daemon/dist/widgets/config/index.d.ts +1 -0
  196. package/packages/daemon/dist/widgets/config/index.jsx +395 -0
  197. package/packages/daemon/dist/widgets/explorer/breadcrumbs.d.ts +10 -0
  198. package/packages/daemon/dist/widgets/explorer/breadcrumbs.jsx +51 -0
  199. package/packages/daemon/dist/widgets/explorer/footer.d.ts +6 -0
  200. package/packages/daemon/dist/widgets/explorer/footer.jsx +11 -0
  201. package/packages/daemon/dist/widgets/explorer/index.d.ts +1 -0
  202. package/packages/daemon/dist/widgets/explorer/index.jsx +393 -0
  203. package/packages/daemon/dist/widgets/explorer/tree-model.d.ts +13 -0
  204. package/packages/daemon/dist/widgets/explorer/tree-model.js +69 -0
  205. package/packages/daemon/dist/widgets/explorer/tree.d.ts +13 -0
  206. package/packages/daemon/dist/widgets/explorer/tree.jsx +108 -0
  207. package/packages/daemon/dist/widgets/lib/config-model.d.ts +22 -0
  208. package/packages/daemon/dist/widgets/lib/config-model.js +99 -0
  209. package/packages/daemon/dist/widgets/lib/files.d.ts +11 -0
  210. package/packages/daemon/dist/widgets/lib/files.js +76 -0
  211. package/packages/daemon/dist/widgets/lib/git.d.ts +11 -0
  212. package/packages/daemon/dist/widgets/lib/git.js +70 -0
  213. package/packages/daemon/dist/widgets/lib/grammar.d.ts +79 -0
  214. package/packages/daemon/dist/widgets/lib/grammar.js +95 -0
  215. package/packages/daemon/dist/widgets/lib/help-overlay.d.ts +19 -0
  216. package/packages/daemon/dist/widgets/lib/help-overlay.jsx +69 -0
  217. package/packages/daemon/dist/widgets/lib/pane-comms.d.ts +28 -0
  218. package/packages/daemon/dist/widgets/lib/pane-comms.js +189 -0
  219. package/packages/daemon/dist/widgets/lib/theme.d.ts +44 -0
  220. package/packages/daemon/dist/widgets/lib/theme.js +153 -0
  221. package/packages/daemon/dist/widgets/lib/watcher.d.ts +9 -0
  222. package/packages/daemon/dist/widgets/lib/watcher.js +92 -0
  223. package/packages/daemon/dist/widgets/preview/index.d.ts +1 -0
  224. package/packages/daemon/dist/widgets/preview/index.jsx +371 -0
  225. package/packages/daemon/dist/widgets/resolve.d.ts +20 -0
  226. package/packages/daemon/dist/widgets/resolve.js +100 -0
  227. package/packages/daemon/dist/widgets/setup/agent-naming.d.ts +9 -0
  228. package/packages/daemon/dist/widgets/setup/agent-naming.jsx +81 -0
  229. package/packages/daemon/dist/widgets/setup/config-tree.d.ts +13 -0
  230. package/packages/daemon/dist/widgets/setup/config-tree.jsx +203 -0
  231. package/packages/daemon/dist/widgets/setup/detect-panel.d.ts +14 -0
  232. package/{src/widgets/setup/detect-panel.tsx → packages/daemon/dist/widgets/setup/detect-panel.jsx} +16 -40
  233. package/packages/daemon/dist/widgets/setup/field-editor.d.ts +12 -0
  234. package/packages/daemon/dist/widgets/setup/field-editor.jsx +163 -0
  235. package/packages/daemon/dist/widgets/setup/footer.d.ts +17 -0
  236. package/packages/daemon/dist/widgets/setup/footer.jsx +64 -0
  237. package/packages/daemon/dist/widgets/setup/index.d.ts +1 -0
  238. package/packages/daemon/dist/widgets/setup/index.jsx +261 -0
  239. package/packages/daemon/dist/widgets/setup/layout-picker.d.ts +9 -0
  240. package/packages/daemon/dist/widgets/setup/layout-picker.jsx +69 -0
  241. package/packages/daemon/dist/widgets/setup/setup-model.d.ts +15 -0
  242. package/packages/daemon/dist/widgets/setup/setup-model.js +157 -0
  243. package/packages/daemon/dist/widgets/sidebar/index.d.ts +1 -0
  244. package/packages/daemon/dist/widgets/sidebar/index.jsx +462 -0
  245. package/scripts/build-cli.mjs +101 -0
  246. package/scripts/build-tui.mjs +58 -0
  247. package/scripts/capture-codex-traffic.mjs +195 -0
  248. package/scripts/check-src-additions.sh +74 -0
  249. package/scripts/coverage-summary.mjs +68 -0
  250. package/scripts/install-git-hooks.js +53 -0
  251. package/scripts/merge-update-manifests.mjs +58 -0
  252. package/scripts/merge-update-manifests.test.mjs +82 -0
  253. package/scripts/pack-check-run.mjs +83 -0
  254. package/scripts/postinstall.js +28 -6
  255. package/scripts/prepublish-check.mjs +44 -0
  256. package/scripts/stress-test.ts +141 -0
  257. package/scripts/verify-endpoints.sh +90 -0
  258. package/skill/SKILL.md +203 -236
  259. package/dashboard/out/404/index.html +0 -1
  260. package/dashboard/out/404.html +0 -1
  261. package/dashboard/out/__next.__PAGE__.txt +0 -9
  262. package/dashboard/out/__next._full.txt +0 -21
  263. package/dashboard/out/__next._head.txt +0 -5
  264. package/dashboard/out/__next._index.txt +0 -7
  265. package/dashboard/out/__next._tree.txt +0 -4
  266. package/dashboard/out/_next/static/Tl1KoIH7mHCyjo5KtXqQ0/_buildManifest.js +0 -11
  267. package/dashboard/out/_next/static/Tl1KoIH7mHCyjo5KtXqQ0/_clientMiddlewareManifest.json +0 -1
  268. package/dashboard/out/_next/static/Tl1KoIH7mHCyjo5KtXqQ0/_ssgManifest.js +0 -1
  269. package/dashboard/out/_next/static/chunks/048e2449530877e2.js +0 -1
  270. package/dashboard/out/_next/static/chunks/053c57bda6abb959.js +0 -1
  271. package/dashboard/out/_next/static/chunks/056760c6c2dd9172.js +0 -1
  272. package/dashboard/out/_next/static/chunks/06ab47357b6d3e35.js +0 -1
  273. package/dashboard/out/_next/static/chunks/0921cbe5dfd6738e.js +0 -1
  274. package/dashboard/out/_next/static/chunks/0b2599bf468cf5ea.js +0 -1
  275. package/dashboard/out/_next/static/chunks/0c012eac08ef2c4f.js +0 -1
  276. package/dashboard/out/_next/static/chunks/0c29e87fcdcffac3.js +0 -1
  277. package/dashboard/out/_next/static/chunks/0e1e98854430c693.js +0 -1
  278. package/dashboard/out/_next/static/chunks/0e24498976a88976.js +0 -1
  279. package/dashboard/out/_next/static/chunks/0e5bf11ff0b9ab90.js +0 -1
  280. package/dashboard/out/_next/static/chunks/0eae0a45ab8416c8.js +0 -1
  281. package/dashboard/out/_next/static/chunks/104797400d9d38ad.js +0 -1
  282. package/dashboard/out/_next/static/chunks/10cfcfce475f9d2d.js +0 -1
  283. package/dashboard/out/_next/static/chunks/11bac38e7cfb4ecc.js +0 -1
  284. package/dashboard/out/_next/static/chunks/120c5f6501ec3529.js +0 -1
  285. package/dashboard/out/_next/static/chunks/121fceb2b1dcd79f.js +0 -1
  286. package/dashboard/out/_next/static/chunks/13726b63e1be6b98.js +0 -1
  287. package/dashboard/out/_next/static/chunks/140c6ce631514660.js +0 -1
  288. package/dashboard/out/_next/static/chunks/1435ee3a51174c97.js +0 -1
  289. package/dashboard/out/_next/static/chunks/14dc927d2e2cca91.js +0 -1
  290. package/dashboard/out/_next/static/chunks/179c3031b292d98e.js +0 -1
  291. package/dashboard/out/_next/static/chunks/181e88957c47e5c1.js +0 -1
  292. package/dashboard/out/_next/static/chunks/18f70ba23873c432.js +0 -1
  293. package/dashboard/out/_next/static/chunks/1b58303b027fd135.js +0 -1
  294. package/dashboard/out/_next/static/chunks/1b5f49a358dcc71e.js +0 -1
  295. package/dashboard/out/_next/static/chunks/1bba44b81585099a.js +0 -1
  296. package/dashboard/out/_next/static/chunks/1bea8dee19a3e9ae.js +0 -1
  297. package/dashboard/out/_next/static/chunks/1cfad21646fc250e.js +0 -1
  298. package/dashboard/out/_next/static/chunks/1d053dc9e1e428ef.js +0 -1
  299. package/dashboard/out/_next/static/chunks/1e7d7639c6f0ee5e.js +0 -1
  300. package/dashboard/out/_next/static/chunks/1f42504ca81463f1.js +0 -1
  301. package/dashboard/out/_next/static/chunks/20c92047399305b4.js +0 -1
  302. package/dashboard/out/_next/static/chunks/214560e9514a9a4d.js +0 -1
  303. package/dashboard/out/_next/static/chunks/21d4ef106914e997.js +0 -1
  304. package/dashboard/out/_next/static/chunks/2586e83fc3dc2588.js +0 -1
  305. package/dashboard/out/_next/static/chunks/267136a09e94f5c2.js +0 -1
  306. package/dashboard/out/_next/static/chunks/271c50b329917c10.js +0 -1
  307. package/dashboard/out/_next/static/chunks/27fccecefffd88b5.js +0 -1
  308. package/dashboard/out/_next/static/chunks/28f058ed331315b6.js +0 -1
  309. package/dashboard/out/_next/static/chunks/28f704f2cc5713eb.js +0 -1
  310. package/dashboard/out/_next/static/chunks/290f67a6cd150a98.js +0 -1
  311. package/dashboard/out/_next/static/chunks/2ad12f4dcc30d30a.js +0 -1
  312. package/dashboard/out/_next/static/chunks/2b650b172078ab92.js +0 -1
  313. package/dashboard/out/_next/static/chunks/2bd91076019a6453.js +0 -1
  314. package/dashboard/out/_next/static/chunks/2e1278563a8e26be.js +0 -1
  315. package/dashboard/out/_next/static/chunks/309eb70780a3d67d.js +0 -1
  316. package/dashboard/out/_next/static/chunks/30f71950992e2307.js +0 -1
  317. package/dashboard/out/_next/static/chunks/31191873c2075784.js +0 -1
  318. package/dashboard/out/_next/static/chunks/31a790921a0c035e.js +0 -1
  319. package/dashboard/out/_next/static/chunks/34f8d7a5a06e8e32.js +0 -1
  320. package/dashboard/out/_next/static/chunks/36b3716436d9bc9d.js +0 -1
  321. package/dashboard/out/_next/static/chunks/3770b7d0ff004de3.js +0 -1
  322. package/dashboard/out/_next/static/chunks/381ab3bd4cffbf4d.js +0 -1
  323. package/dashboard/out/_next/static/chunks/38aa4eada5dcd1a4.js +0 -1
  324. package/dashboard/out/_next/static/chunks/39723132b78cb77e.js +0 -1
  325. package/dashboard/out/_next/static/chunks/399efdcc3fe56e09.js +0 -1
  326. package/dashboard/out/_next/static/chunks/3a8431a9221b0706.js +0 -1
  327. package/dashboard/out/_next/static/chunks/3a9b40810ce88cbf.js +0 -1
  328. package/dashboard/out/_next/static/chunks/3b322e3e9476ecdf.js +0 -1
  329. package/dashboard/out/_next/static/chunks/3bb14befeeb08c28.js +0 -1
  330. package/dashboard/out/_next/static/chunks/3c99637ebd462b20.js +0 -1
  331. package/dashboard/out/_next/static/chunks/3cbb9217d56459d8.js +0 -1
  332. package/dashboard/out/_next/static/chunks/3d438e0929a762f7.js +0 -1
  333. package/dashboard/out/_next/static/chunks/3e6d4834e0752f76.js +0 -2
  334. package/dashboard/out/_next/static/chunks/3e6f8cedaad4e89b.js +0 -1
  335. package/dashboard/out/_next/static/chunks/3e701259ce1b53e3.js +0 -1
  336. package/dashboard/out/_next/static/chunks/41562f7ab7c033eb.js +0 -1
  337. package/dashboard/out/_next/static/chunks/418fadd8a94e2fd7.js +0 -1
  338. package/dashboard/out/_next/static/chunks/42345437bb922e9c.js +0 -1
  339. package/dashboard/out/_next/static/chunks/434b6bd78c97b668.js +0 -1
  340. package/dashboard/out/_next/static/chunks/434febe897d33e2d.js +0 -1
  341. package/dashboard/out/_next/static/chunks/45d28707dd8ce1c1.js +0 -1
  342. package/dashboard/out/_next/static/chunks/4620a640e88cb1b7.js +0 -1
  343. package/dashboard/out/_next/static/chunks/468f8eb604502ea4.js +0 -1
  344. package/dashboard/out/_next/static/chunks/495f5cedf8afe823.js +0 -1
  345. package/dashboard/out/_next/static/chunks/49a89d1704d27740.js +0 -1
  346. package/dashboard/out/_next/static/chunks/49e5c37d15f63def.js +0 -1
  347. package/dashboard/out/_next/static/chunks/4a46ad186a8587ee.css +0 -2
  348. package/dashboard/out/_next/static/chunks/4a5c728574935d50.js +0 -1
  349. package/dashboard/out/_next/static/chunks/4b27ebd4d9304d8f.js +0 -1
  350. package/dashboard/out/_next/static/chunks/4b965aa320a9b358.js +0 -1
  351. package/dashboard/out/_next/static/chunks/4bb2da90bbe5794f.js +0 -1
  352. package/dashboard/out/_next/static/chunks/4d2f1c6f631e4b85.js +0 -1
  353. package/dashboard/out/_next/static/chunks/4d696d5a64dab42e.js +0 -1
  354. package/dashboard/out/_next/static/chunks/4f660dadb3f1e9e2.js +0 -1
  355. package/dashboard/out/_next/static/chunks/507b50d47f949333.js +0 -1
  356. package/dashboard/out/_next/static/chunks/50b1b7063bb044e2.js +0 -1
  357. package/dashboard/out/_next/static/chunks/50c0c2e3c4f02508.js +0 -1
  358. package/dashboard/out/_next/static/chunks/50d7ba9803e65b02.js +0 -1
  359. package/dashboard/out/_next/static/chunks/51535a6d4c98c7a4.js +0 -1
  360. package/dashboard/out/_next/static/chunks/526de6cc16c7dd2f.js +0 -1
  361. package/dashboard/out/_next/static/chunks/5307604f8632b3fd.js +0 -1
  362. package/dashboard/out/_next/static/chunks/5480bd722260f231.js +0 -1
  363. package/dashboard/out/_next/static/chunks/54c61c82e5f1dca5.js +0 -1
  364. package/dashboard/out/_next/static/chunks/555de6ac6bb9034c.js +0 -1
  365. package/dashboard/out/_next/static/chunks/562b89ee76a4b90c.js +0 -1
  366. package/dashboard/out/_next/static/chunks/5747f9a32edff429.js +0 -1
  367. package/dashboard/out/_next/static/chunks/57ee141430b4c05c.js +0 -1
  368. package/dashboard/out/_next/static/chunks/584c066a0837dd9a.js +0 -1
  369. package/dashboard/out/_next/static/chunks/5856aed4670a6253.js +0 -1
  370. package/dashboard/out/_next/static/chunks/58fe563414726511.js +0 -1
  371. package/dashboard/out/_next/static/chunks/5948196b2729b18c.js +0 -1
  372. package/dashboard/out/_next/static/chunks/5ab77c69e7306f97.js +0 -1
  373. package/dashboard/out/_next/static/chunks/5b3fa4c99d61611c.js +0 -1
  374. package/dashboard/out/_next/static/chunks/5cc87abaef616661.js +0 -1
  375. package/dashboard/out/_next/static/chunks/5dfa7913f99bb966.js +0 -1
  376. package/dashboard/out/_next/static/chunks/5e49b008432770f1.js +0 -1
  377. package/dashboard/out/_next/static/chunks/5e5a33dd81c45c47.js +0 -1
  378. package/dashboard/out/_next/static/chunks/5ee61bed638eb8a8.js +0 -1
  379. package/dashboard/out/_next/static/chunks/5eed557b9f45ae4a.js +0 -1
  380. package/dashboard/out/_next/static/chunks/60446823a7d30c1b.js +0 -1
  381. package/dashboard/out/_next/static/chunks/605150c490861442.js +0 -1
  382. package/dashboard/out/_next/static/chunks/609056d51c0bf332.js +0 -1
  383. package/dashboard/out/_next/static/chunks/60ec91dfeb50071b.js +0 -1
  384. package/dashboard/out/_next/static/chunks/61bc7be0bba6a33f.js +0 -1
  385. package/dashboard/out/_next/static/chunks/61f4a5c9ce23e55e.js +0 -1
  386. package/dashboard/out/_next/static/chunks/63aae3585be04e65.js +0 -1
  387. package/dashboard/out/_next/static/chunks/64e0e1ee7ef4f01b.js +0 -1
  388. package/dashboard/out/_next/static/chunks/66e9b4c26ff1aaaf.js +0 -1
  389. package/dashboard/out/_next/static/chunks/67068847aa1b5e98.js +0 -1
  390. package/dashboard/out/_next/static/chunks/68d7de1f2e202c26.js +0 -1
  391. package/dashboard/out/_next/static/chunks/698ca3ea1937ba4f.js +0 -1
  392. package/dashboard/out/_next/static/chunks/69eb97c24b5b6b9d.js +0 -1
  393. package/dashboard/out/_next/static/chunks/6b1ac098c228a479.js +0 -1
  394. package/dashboard/out/_next/static/chunks/6bb8020cb796bcc1.js +0 -1
  395. package/dashboard/out/_next/static/chunks/6cf8b1db17f2a155.js +0 -1
  396. package/dashboard/out/_next/static/chunks/6e7613643906ea88.js +0 -1
  397. package/dashboard/out/_next/static/chunks/6ea27ceb2e6feae5.js +0 -1
  398. package/dashboard/out/_next/static/chunks/6f95a8dbcf23dded.js +0 -1
  399. package/dashboard/out/_next/static/chunks/6fd44e759d82f64e.js +0 -1
  400. package/dashboard/out/_next/static/chunks/716ec29c268c38f6.js +0 -1
  401. package/dashboard/out/_next/static/chunks/717b399dfcf7c02c.js +0 -1
  402. package/dashboard/out/_next/static/chunks/72badd90e1c91348.js +0 -1
  403. package/dashboard/out/_next/static/chunks/72f9296dbb7ae3c4.js +0 -1
  404. package/dashboard/out/_next/static/chunks/73aa31e1144d8191.js +0 -1
  405. package/dashboard/out/_next/static/chunks/73f98ded8fe2e879.js +0 -1
  406. package/dashboard/out/_next/static/chunks/740a2e8ace15e13b.js +0 -1
  407. package/dashboard/out/_next/static/chunks/74e57c16e7304b6b.js +0 -1
  408. package/dashboard/out/_next/static/chunks/7628dead4d113df2.js +0 -1
  409. package/dashboard/out/_next/static/chunks/7717c88c07ed96e6.js +0 -1
  410. package/dashboard/out/_next/static/chunks/775581f7956d9a27.js +0 -1
  411. package/dashboard/out/_next/static/chunks/77d3b6661befdb98.js +0 -1
  412. package/dashboard/out/_next/static/chunks/78435c0e1c77fea7.js +0 -1
  413. package/dashboard/out/_next/static/chunks/791336748b9c9393.js +0 -1
  414. package/dashboard/out/_next/static/chunks/79ea68dfae65ef2f.js +0 -1
  415. package/dashboard/out/_next/static/chunks/7bae777a472eb13c.js +0 -1
  416. package/dashboard/out/_next/static/chunks/7fd847f47237a35c.js +0 -1
  417. package/dashboard/out/_next/static/chunks/804d718be0370058.css +0 -1
  418. package/dashboard/out/_next/static/chunks/807cb3c1923995ab.js +0 -1
  419. package/dashboard/out/_next/static/chunks/8286b39407d94447.js +0 -1
  420. package/dashboard/out/_next/static/chunks/84e4305b8dc830ed.js +0 -1
  421. package/dashboard/out/_next/static/chunks/850f99dbfabb53e0.js +0 -1
  422. package/dashboard/out/_next/static/chunks/85594127e66b6b7f.js +0 -1
  423. package/dashboard/out/_next/static/chunks/858c11169c183c9c.js +0 -1
  424. package/dashboard/out/_next/static/chunks/85e27005dfe4c3e3.js +0 -1
  425. package/dashboard/out/_next/static/chunks/8707bd3d8ddc1f1c.js +0 -1
  426. package/dashboard/out/_next/static/chunks/8851e5d7ef894973.js +0 -1
  427. package/dashboard/out/_next/static/chunks/88ba3782cc614989.js +0 -1
  428. package/dashboard/out/_next/static/chunks/8a0c9a181784c2ef.js +0 -1
  429. package/dashboard/out/_next/static/chunks/8ad01ae355a6e7f6.js +0 -1
  430. package/dashboard/out/_next/static/chunks/8d2ed93b0d0a4b4f.js +0 -1
  431. package/dashboard/out/_next/static/chunks/8dc352ebd5310d3c.js +0 -1
  432. package/dashboard/out/_next/static/chunks/8dd1d722c8c1a22c.js +0 -1
  433. package/dashboard/out/_next/static/chunks/8e60fe307e3e4986.js +0 -1
  434. package/dashboard/out/_next/static/chunks/8eea4dd71e25f32a.js +0 -1
  435. package/dashboard/out/_next/static/chunks/8f468a65bac34eaa.js +0 -1
  436. package/dashboard/out/_next/static/chunks/9057e5382d6a5059.js +0 -1
  437. package/dashboard/out/_next/static/chunks/931d056437805ecb.js +0 -1
  438. package/dashboard/out/_next/static/chunks/954eb11648dd8cff.js +0 -1
  439. package/dashboard/out/_next/static/chunks/955034d876d14bb3.js +0 -1
  440. package/dashboard/out/_next/static/chunks/966c4895773249f6.js +0 -1
  441. package/dashboard/out/_next/static/chunks/96aff410a6ab106c.js +0 -1
  442. package/dashboard/out/_next/static/chunks/99b396c821c1dd2d.js +0 -1
  443. package/dashboard/out/_next/static/chunks/9a255fd2cf4922ae.js +0 -1
  444. package/dashboard/out/_next/static/chunks/9b1f6aa73bc864b2.js +0 -1
  445. package/dashboard/out/_next/static/chunks/9b9ce582c533aa79.js +0 -1
  446. package/dashboard/out/_next/static/chunks/9c19bd3c773c6611.js +0 -1
  447. package/dashboard/out/_next/static/chunks/9ceeaa847eb15ca2.js +0 -1
  448. package/dashboard/out/_next/static/chunks/9d2e6e7b8b65f845.js +0 -1
  449. package/dashboard/out/_next/static/chunks/9de23802066128ff.js +0 -1
  450. package/dashboard/out/_next/static/chunks/9e327f94b3701170.js +0 -1
  451. package/dashboard/out/_next/static/chunks/9e7818421c2d455a.js +0 -1
  452. package/dashboard/out/_next/static/chunks/9e935acbcf2fb519.js +0 -1
  453. package/dashboard/out/_next/static/chunks/9ed9f68340343b51.js +0 -1
  454. package/dashboard/out/_next/static/chunks/9f94a0242455fc20.js +0 -1
  455. package/dashboard/out/_next/static/chunks/9fff46b5aaecf47e.js +0 -1
  456. package/dashboard/out/_next/static/chunks/a06d267a5c557657.js +0 -1
  457. package/dashboard/out/_next/static/chunks/a0eb8c81c54722fe.js +0 -1
  458. package/dashboard/out/_next/static/chunks/a16808e83106427d.js +0 -1
  459. package/dashboard/out/_next/static/chunks/a2215e2bc72739ef.js +0 -1
  460. package/dashboard/out/_next/static/chunks/a2de9e6696eb9c17.js +0 -1
  461. package/dashboard/out/_next/static/chunks/a33420b8c14090d6.js +0 -1
  462. package/dashboard/out/_next/static/chunks/a360bffef39d818b.js +0 -1
  463. package/dashboard/out/_next/static/chunks/a42852fdf5287cf5.js +0 -1
  464. package/dashboard/out/_next/static/chunks/a4efc88488322b67.js +0 -1
  465. package/dashboard/out/_next/static/chunks/a696a91d14101bdb.js +0 -1
  466. package/dashboard/out/_next/static/chunks/a6dad97d9634a72d.js +0 -1
  467. package/dashboard/out/_next/static/chunks/a6dad97d9634a72d.js.map +0 -1
  468. package/dashboard/out/_next/static/chunks/a705c7261712bd8e.js +0 -1
  469. package/dashboard/out/_next/static/chunks/a7d1e4b067ace180.js +0 -1
  470. package/dashboard/out/_next/static/chunks/a8590c121a7efaa5.js +0 -1
  471. package/dashboard/out/_next/static/chunks/a95953a83a6df6cf.js +0 -1
  472. package/dashboard/out/_next/static/chunks/a9d0a757d3b4afed.js +0 -1
  473. package/dashboard/out/_next/static/chunks/a9dc35514619c872.js +0 -1
  474. package/dashboard/out/_next/static/chunks/aae0253c73fba984.js +0 -193
  475. package/dashboard/out/_next/static/chunks/ab1821552066a74d.js +0 -1
  476. package/dashboard/out/_next/static/chunks/ac96bc0eccebe15a.js +0 -1
  477. package/dashboard/out/_next/static/chunks/acc03cfaaf6bb30f.js +0 -1
  478. package/dashboard/out/_next/static/chunks/acc298ae059b9fe4.js +0 -1
  479. package/dashboard/out/_next/static/chunks/ad076b6e996d250c.js +0 -1
  480. package/dashboard/out/_next/static/chunks/ae53b64af7ba16d5.js +0 -1
  481. package/dashboard/out/_next/static/chunks/ae5da7fa4bc5fa95.js +0 -1
  482. package/dashboard/out/_next/static/chunks/aefcf0eb033a155e.js +0 -1
  483. package/dashboard/out/_next/static/chunks/b12d43100ee10526.js +0 -1
  484. package/dashboard/out/_next/static/chunks/b137952dd5566a41.js +0 -1
  485. package/dashboard/out/_next/static/chunks/b2832d8a2d332a47.js +0 -1
  486. package/dashboard/out/_next/static/chunks/b417aa09c15f63c6.js +0 -1
  487. package/dashboard/out/_next/static/chunks/b48e152ba7bf6caf.js +0 -1
  488. package/dashboard/out/_next/static/chunks/b4cbef8e4714bf92.js +0 -1
  489. package/dashboard/out/_next/static/chunks/b568ff8383a37f53.js +0 -1
  490. package/dashboard/out/_next/static/chunks/b6e1495dd89a39e3.js +0 -1
  491. package/dashboard/out/_next/static/chunks/b73a21bd67528440.js +0 -1
  492. package/dashboard/out/_next/static/chunks/b77ee62bc71dcec7.js +0 -1
  493. package/dashboard/out/_next/static/chunks/b7f454615c11d4eb.js +0 -1
  494. package/dashboard/out/_next/static/chunks/b818ea32a839590f.js +0 -1
  495. package/dashboard/out/_next/static/chunks/b901ce78c1c65d66.js +0 -1
  496. package/dashboard/out/_next/static/chunks/b93d647b803be9fa.js +0 -1
  497. package/dashboard/out/_next/static/chunks/b960b09ff1ecd6bb.js +0 -1
  498. package/dashboard/out/_next/static/chunks/ba717c7779a778fc.js +0 -1
  499. package/dashboard/out/_next/static/chunks/bacb0ae7458d18b6.js +0 -1
  500. package/dashboard/out/_next/static/chunks/bb51f68b27346852.js +0 -1
  501. package/dashboard/out/_next/static/chunks/bb67f22e1ab632ae.js +0 -1
  502. package/dashboard/out/_next/static/chunks/bbae97ec58d1bb9d.js +0 -1
  503. package/dashboard/out/_next/static/chunks/bbaf38ee90307765.js +0 -1
  504. package/dashboard/out/_next/static/chunks/be01598fe1fce5db.js +0 -1
  505. package/dashboard/out/_next/static/chunks/bf4cbbc095987fec.js +0 -1
  506. package/dashboard/out/_next/static/chunks/c18f823797d57446.js +0 -1
  507. package/dashboard/out/_next/static/chunks/c1bcece34ec5b295.js +0 -1
  508. package/dashboard/out/_next/static/chunks/c1ccbc3a51adaf0a.js +0 -1
  509. package/dashboard/out/_next/static/chunks/c1f54a628f27791c.js +0 -1
  510. package/dashboard/out/_next/static/chunks/c21916bf5d232151.js +0 -1
  511. package/dashboard/out/_next/static/chunks/c27e570f0fc2f78b.js +0 -1
  512. package/dashboard/out/_next/static/chunks/c322b8005eebc0d8.js +0 -1
  513. package/dashboard/out/_next/static/chunks/c3900ac2b009b764.js +0 -1
  514. package/dashboard/out/_next/static/chunks/c3c597c8eb77ad6b.js +0 -1
  515. package/dashboard/out/_next/static/chunks/c58d45c1d88e208c.js +0 -1
  516. package/dashboard/out/_next/static/chunks/c63875998d7a655f.js +0 -1
  517. package/dashboard/out/_next/static/chunks/c6eaa7c8e7209c8e.js +0 -1
  518. package/dashboard/out/_next/static/chunks/c6f820f71162a59a.js +0 -1
  519. package/dashboard/out/_next/static/chunks/c7ce0941d1dfe7ed.js +0 -1
  520. package/dashboard/out/_next/static/chunks/c877259f784ec8e5.js +0 -1
  521. package/dashboard/out/_next/static/chunks/cb8057e86aaa1c68.js +0 -1
  522. package/dashboard/out/_next/static/chunks/ccb4e306ee4859b1.js +0 -1
  523. package/dashboard/out/_next/static/chunks/ccde62b0fa8112eb.js +0 -1
  524. package/dashboard/out/_next/static/chunks/cd421f0971c63c31.js +0 -1
  525. package/dashboard/out/_next/static/chunks/cde0317494d4adb7.js +0 -1
  526. package/dashboard/out/_next/static/chunks/cfae64434b92b8b6.js +0 -1
  527. package/dashboard/out/_next/static/chunks/cfc0e19310ec0a36.js +0 -1
  528. package/dashboard/out/_next/static/chunks/d0f344c7d0bcb59a.js +0 -1
  529. package/dashboard/out/_next/static/chunks/d1871c73e74e1f50.js +0 -1
  530. package/dashboard/out/_next/static/chunks/d18f658850711061.js +0 -1
  531. package/dashboard/out/_next/static/chunks/d25d9c48880697f6.js +0 -1
  532. package/dashboard/out/_next/static/chunks/d3f0a72bbc3060b0.js +0 -1
  533. package/dashboard/out/_next/static/chunks/d5fca429bc89060b.js +0 -1
  534. package/dashboard/out/_next/static/chunks/d6a6c75c9a4bef49.js +0 -1
  535. package/dashboard/out/_next/static/chunks/d6a8f93aa8f1e345.js +0 -1
  536. package/dashboard/out/_next/static/chunks/d7deab676b19ba0e.js +0 -1
  537. package/dashboard/out/_next/static/chunks/d80030dde88cec85.js +0 -1
  538. package/dashboard/out/_next/static/chunks/da84f9774c076ff1.js +0 -1
  539. package/dashboard/out/_next/static/chunks/da98ecc6b9b0ceb2.js +0 -1
  540. package/dashboard/out/_next/static/chunks/db550aabce60b912.js +0 -4
  541. package/dashboard/out/_next/static/chunks/dc87f77fcc029482.js +0 -1
  542. package/dashboard/out/_next/static/chunks/dd05f30acdb63a53.js +0 -1
  543. package/dashboard/out/_next/static/chunks/dea150155499b903.js +0 -1
  544. package/dashboard/out/_next/static/chunks/df4358754ff1d5e8.js +0 -1
  545. package/dashboard/out/_next/static/chunks/df8b21ff12d23b0e.js +0 -1
  546. package/dashboard/out/_next/static/chunks/df8fc68d77debf2c.js +0 -1
  547. package/dashboard/out/_next/static/chunks/df9ed1ffec90589f.js +0 -1
  548. package/dashboard/out/_next/static/chunks/dfa65ece1598f934.js +0 -1
  549. package/dashboard/out/_next/static/chunks/dfaab5cdd41a20d9.js +0 -1
  550. package/dashboard/out/_next/static/chunks/e00c03c942b5ae3e.js +0 -1
  551. package/dashboard/out/_next/static/chunks/e02d27cf679bece1.js +0 -1
  552. package/dashboard/out/_next/static/chunks/e0b747585f78513a.js +0 -1
  553. package/dashboard/out/_next/static/chunks/e19b71ca23fd7df0.js +0 -1
  554. package/dashboard/out/_next/static/chunks/e21cbe89d0cda120.js +0 -1
  555. package/dashboard/out/_next/static/chunks/e2a0386930edd34f.js +0 -1
  556. package/dashboard/out/_next/static/chunks/e375de19a36e2f38.js +0 -1
  557. package/dashboard/out/_next/static/chunks/e5241b4a6496a9e0.js +0 -1
  558. package/dashboard/out/_next/static/chunks/e569dd07c96eb4dd.js +0 -1
  559. package/dashboard/out/_next/static/chunks/e61c3ea91233f948.js +0 -1
  560. package/dashboard/out/_next/static/chunks/e73b42c5d34c4c28.js +0 -1
  561. package/dashboard/out/_next/static/chunks/e7c5b2105f651e87.js +0 -1
  562. package/dashboard/out/_next/static/chunks/e878e58a69bb01b6.js +0 -1
  563. package/dashboard/out/_next/static/chunks/e8f090a4dc571062.js +0 -1
  564. package/dashboard/out/_next/static/chunks/e98dc34dac91cdad.js +0 -1
  565. package/dashboard/out/_next/static/chunks/ea67cf7a0c5e7233.js +0 -1
  566. package/dashboard/out/_next/static/chunks/eacc98a1e3512fa9.js +0 -1
  567. package/dashboard/out/_next/static/chunks/eae9cd74d9bbed8b.js +0 -1
  568. package/dashboard/out/_next/static/chunks/eb187fd345852b34.js +0 -1
  569. package/dashboard/out/_next/static/chunks/ecea46df7a40b427.js +0 -1
  570. package/dashboard/out/_next/static/chunks/ecf48b83f4245d9c.js +0 -1
  571. package/dashboard/out/_next/static/chunks/eda41732bf966c6d.js +0 -1
  572. package/dashboard/out/_next/static/chunks/ee174a433049f43a.js +0 -1
  573. package/dashboard/out/_next/static/chunks/ee66b2d3b76de72e.js +0 -1
  574. package/dashboard/out/_next/static/chunks/ef058d3041c3d8ab.js +0 -1
  575. package/dashboard/out/_next/static/chunks/f3544b800b0d4969.js +0 -1
  576. package/dashboard/out/_next/static/chunks/f3b280e604b97509.js +0 -1
  577. package/dashboard/out/_next/static/chunks/f42e1d3693232993.js +0 -1
  578. package/dashboard/out/_next/static/chunks/f5a5fdd80166d304.js +0 -1
  579. package/dashboard/out/_next/static/chunks/f60adc5dd6169316.js +0 -1
  580. package/dashboard/out/_next/static/chunks/f6255bc2e6c68ce8.js +0 -1
  581. package/dashboard/out/_next/static/chunks/f6bb677d2d8840db.js +0 -1
  582. package/dashboard/out/_next/static/chunks/f6f3bf016239c33a.js +0 -1
  583. package/dashboard/out/_next/static/chunks/f6f57a46cd074bfe.js +0 -1
  584. package/dashboard/out/_next/static/chunks/f7feb9c1199e8cf6.js +0 -1
  585. package/dashboard/out/_next/static/chunks/f831087bf964cc3d.js +0 -1
  586. package/dashboard/out/_next/static/chunks/fa5a2f7244935aa2.js +0 -1
  587. package/dashboard/out/_next/static/chunks/fa73f36df4c38fa0.js +0 -1
  588. package/dashboard/out/_next/static/chunks/faa1461722d6a88d.js +0 -1
  589. package/dashboard/out/_next/static/chunks/fbf706b9a0edb7e6.js +0 -1
  590. package/dashboard/out/_next/static/chunks/fc2b8c8b7446bbc2.js +0 -1
  591. package/dashboard/out/_next/static/chunks/fd516f3930c128c1.js +0 -1
  592. package/dashboard/out/_next/static/chunks/fd663e7ff8de4887.js +0 -1
  593. package/dashboard/out/_next/static/chunks/fe5b656cc9bdd60e.js +0 -1
  594. package/dashboard/out/_next/static/chunks/turbopack-2f5dec4a537c0ee7.js +0 -4
  595. package/dashboard/out/_next/static/media/02263ebadd758ea4-s.8da66e7f.woff2 +0 -0
  596. package/dashboard/out/_next/static/media/2fe89d53234c61d4-s.cb53f04b.woff2 +0 -0
  597. package/dashboard/out/_next/static/media/59b15b4bcd7b1eb5-s.afa48be3.woff2 +0 -0
  598. package/dashboard/out/_next/static/media/5e05ae5b48faa55e-s.6b5ea6af.woff2 +0 -0
  599. package/dashboard/out/_next/static/media/68757d6cddeff913-s.e6cd1753.woff2 +0 -0
  600. package/dashboard/out/_next/static/media/99e609270109b47d-s.p.64b9304e.woff2 +0 -0
  601. package/dashboard/out/_next/static/media/a7afbb44bec2bb18-s.1dcddae6.woff2 +0 -0
  602. package/dashboard/out/_next/static/media/e390973e931a41c5-s.a82ecf4e.woff2 +0 -0
  603. package/dashboard/out/_next/static/media/e532fa1b9921e1cd-s.764b43eb.woff2 +0 -0
  604. package/dashboard/out/_next/static/media/effe91970fc4db64-s.p.19510058.woff2 +0 -0
  605. package/dashboard/out/_not-found/__next._full.txt +0 -15
  606. package/dashboard/out/_not-found/__next._head.txt +0 -5
  607. package/dashboard/out/_not-found/__next._index.txt +0 -7
  608. package/dashboard/out/_not-found/__next._not-found.__PAGE__.txt +0 -5
  609. package/dashboard/out/_not-found/__next._not-found.txt +0 -4
  610. package/dashboard/out/_not-found/__next._tree.txt +0 -2
  611. package/dashboard/out/_not-found/index.html +0 -1
  612. package/dashboard/out/_not-found/index.txt +0 -15
  613. package/dashboard/out/index.html +0 -1
  614. package/dashboard/out/index.txt +0 -21
  615. package/dashboard/out/project/__fallback/__next._full.txt +0 -19
  616. package/dashboard/out/project/__fallback/__next._head.txt +0 -5
  617. package/dashboard/out/project/__fallback/__next._index.txt +0 -7
  618. package/dashboard/out/project/__fallback/__next._tree.txt +0 -5
  619. package/dashboard/out/project/__fallback/__next.project.$d$name.__PAGE__.txt +0 -7
  620. package/dashboard/out/project/__fallback/__next.project.$d$name.txt +0 -4
  621. package/dashboard/out/project/__fallback/__next.project.txt +0 -4
  622. package/dashboard/out/project/__fallback/index.html +0 -1
  623. package/dashboard/out/project/__fallback/index.txt +0 -19
  624. package/src/__tests__/support.ts +0 -186
  625. package/src/attach.ts +0 -20
  626. package/src/cli.test.ts +0 -314
  627. package/src/command-center/discovery.test.ts +0 -265
  628. package/src/command-center/discovery.ts +0 -296
  629. package/src/command-center/index.ts +0 -31
  630. package/src/command-center/schemas.ts +0 -57
  631. package/src/command-center/server.test.ts +0 -814
  632. package/src/command-center/server.ts +0 -1427
  633. package/src/command-center/static.test.ts +0 -105
  634. package/src/command-center/static.ts +0 -122
  635. package/src/config-cli.test.ts +0 -86
  636. package/src/config.test.ts +0 -205
  637. package/src/config.ts +0 -313
  638. package/src/detect.test.ts +0 -142
  639. package/src/detect.ts +0 -248
  640. package/src/dispatch.ts +0 -102
  641. package/src/doctor.test.ts +0 -119
  642. package/src/doctor.ts +0 -167
  643. package/src/init.test.ts +0 -101
  644. package/src/init.ts +0 -211
  645. package/src/inspect.test.ts +0 -67
  646. package/src/inspect.ts +0 -212
  647. package/src/integration.test.ts.skip +0 -276
  648. package/src/js-yaml.d.ts +0 -10
  649. package/src/launch.test.ts +0 -149
  650. package/src/launch.ts +0 -583
  651. package/src/lib/auth/auth-service.test.ts +0 -178
  652. package/src/lib/auth/auth-service.ts +0 -227
  653. package/src/lib/auth/middleware.test.ts +0 -119
  654. package/src/lib/auth/middleware.ts +0 -56
  655. package/src/lib/auth/types.ts +0 -13
  656. package/src/lib/authorship.test.ts +0 -242
  657. package/src/lib/authorship.ts +0 -280
  658. package/src/lib/cast/recorder.test.ts +0 -127
  659. package/src/lib/cast/recorder.ts +0 -148
  660. package/src/lib/daemon-watchdog.ts +0 -102
  661. package/src/lib/daemon.ts +0 -431
  662. package/src/lib/dot-path.test.ts +0 -66
  663. package/src/lib/dot-path.ts +0 -17
  664. package/src/lib/errors.ts +0 -44
  665. package/src/lib/event-log.test.ts +0 -189
  666. package/src/lib/event-log.ts +0 -237
  667. package/src/lib/github-pr.ts +0 -182
  668. package/src/lib/hq/client.test.ts +0 -154
  669. package/src/lib/hq/client.ts +0 -142
  670. package/src/lib/hq/mdns.test.ts +0 -54
  671. package/src/lib/hq/mdns.ts +0 -88
  672. package/src/lib/hq/registry.test.ts +0 -237
  673. package/src/lib/hq/registry.ts +0 -145
  674. package/src/lib/hq/types.ts +0 -44
  675. package/src/lib/ipc/socket-protocol.test.ts +0 -126
  676. package/src/lib/ipc/socket-protocol.ts +0 -324
  677. package/src/lib/launch-plan.test.ts +0 -119
  678. package/src/lib/launch-plan.ts +0 -90
  679. package/src/lib/log.test.ts +0 -39
  680. package/src/lib/log.ts +0 -71
  681. package/src/lib/metrics.test.ts +0 -213
  682. package/src/lib/metrics.ts +0 -345
  683. package/src/lib/orchestrator.test.ts +0 -2358
  684. package/src/lib/orchestrator.ts +0 -1799
  685. package/src/lib/output.ts +0 -76
  686. package/src/lib/plan-store.test.ts +0 -148
  687. package/src/lib/plan-store.ts +0 -131
  688. package/src/lib/research.test.ts +0 -208
  689. package/src/lib/research.ts +0 -475
  690. package/src/lib/round-trip.test.ts +0 -341
  691. package/src/lib/session-monitor.test.ts +0 -152
  692. package/src/lib/session-monitor.ts +0 -282
  693. package/src/lib/session-options.test.ts +0 -146
  694. package/src/lib/session-options.ts +0 -100
  695. package/src/lib/shell.test.ts +0 -20
  696. package/src/lib/sizes.test.ts +0 -73
  697. package/src/lib/sizes.ts +0 -36
  698. package/src/lib/skill-registry.test.ts +0 -134
  699. package/src/lib/skill-registry.ts +0 -86
  700. package/src/lib/slugify.test.ts +0 -35
  701. package/src/lib/slugify.ts +0 -10
  702. package/src/lib/task-store.ts +0 -352
  703. package/src/lib/tmux.test.ts +0 -500
  704. package/src/lib/tmux.ts +0 -372
  705. package/src/lib/token-tracker.test.ts +0 -102
  706. package/src/lib/token-tracker.ts +0 -70
  707. package/src/lib/tunnels/cloudflare.test.ts +0 -73
  708. package/src/lib/tunnels/cloudflare.ts +0 -254
  709. package/src/lib/tunnels/manager.test.ts +0 -63
  710. package/src/lib/tunnels/manager.ts +0 -132
  711. package/src/lib/tunnels/ngrok.test.ts +0 -94
  712. package/src/lib/tunnels/ngrok.ts +0 -261
  713. package/src/lib/tunnels/tailscale.test.ts +0 -103
  714. package/src/lib/tunnels/tailscale.ts +0 -1048
  715. package/src/lib/tunnels/types.ts +0 -44
  716. package/src/lib/validation.test.ts +0 -289
  717. package/src/lib/validation.ts +0 -123
  718. package/src/lib/webhook.ts +0 -51
  719. package/src/lib/workflow-store.ts +0 -209
  720. package/src/lib/ws-v3/protocol.test.ts +0 -127
  721. package/src/lib/ws-v3/protocol.ts +0 -160
  722. package/src/lib/yaml-io.test.ts +0 -125
  723. package/src/lib/yaml-io.ts +0 -27
  724. package/src/ls.test.ts +0 -76
  725. package/src/ls.ts +0 -40
  726. package/src/metrics-cli.ts +0 -177
  727. package/src/notify.ts +0 -85
  728. package/src/orchestrator-status.ts +0 -228
  729. package/src/plan.ts +0 -117
  730. package/src/postinstall.test.ts +0 -79
  731. package/src/remote.test.ts +0 -115
  732. package/src/remote.ts +0 -148
  733. package/src/restart.ts +0 -24
  734. package/src/schemas/domain.ts +0 -422
  735. package/src/schemas/ide-config.ts +0 -148
  736. package/src/schemas/index.ts +0 -53
  737. package/src/send.test.ts +0 -70
  738. package/src/send.ts +0 -181
  739. package/src/skill.test.ts +0 -114
  740. package/src/skill.ts +0 -138
  741. package/src/status.ts +0 -66
  742. package/src/stop.test.ts +0 -151
  743. package/src/stop.ts +0 -37
  744. package/src/task.test.ts +0 -1466
  745. package/src/task.ts +0 -1143
  746. package/src/tunnel.test.ts +0 -80
  747. package/src/tunnel.ts +0 -133
  748. package/src/types.ts +0 -15
  749. package/src/ui/index.ts +0 -32
  750. package/src/ui/terminal/index.ts +0 -9
  751. package/src/ui/types.ts +0 -91
  752. package/src/ui/web/base.css +0 -80
  753. package/src/ui/web/components/Box.tsx +0 -59
  754. package/src/ui/web/components/Input.tsx +0 -32
  755. package/src/ui/web/components/ScrollBox.tsx +0 -60
  756. package/src/ui/web/components/Text.tsx +0 -28
  757. package/src/ui/web/hooks.ts +0 -106
  758. package/src/ui/web/index.ts +0 -27
  759. package/src/ui/web/render.ts +0 -77
  760. package/src/ui/web/utils/color.test.ts +0 -93
  761. package/src/ui/web/utils/color.ts +0 -27
  762. package/src/validate.test.ts +0 -385
  763. package/src/validate.ts +0 -217
  764. package/src/widgets/changes/index.tsx +0 -576
  765. package/src/widgets/config/index.tsx +0 -440
  766. package/src/widgets/costs/index.tsx +0 -216
  767. package/src/widgets/explorer/breadcrumbs.tsx +0 -77
  768. package/src/widgets/explorer/footer.tsx +0 -20
  769. package/src/widgets/explorer/header.tsx +0 -23
  770. package/src/widgets/explorer/index.tsx +0 -408
  771. package/src/widgets/explorer/tree-model.test.ts +0 -214
  772. package/src/widgets/explorer/tree-model.ts +0 -103
  773. package/src/widgets/explorer/tree.tsx +0 -156
  774. package/src/widgets/lib/config-model.ts +0 -116
  775. package/src/widgets/lib/files.test.ts +0 -103
  776. package/src/widgets/lib/files.ts +0 -88
  777. package/src/widgets/lib/git.test.ts +0 -151
  778. package/src/widgets/lib/git.ts +0 -88
  779. package/src/widgets/lib/pane-comms.test.ts +0 -178
  780. package/src/widgets/lib/pane-comms.ts +0 -207
  781. package/src/widgets/lib/theme.ts +0 -151
  782. package/src/widgets/lib/watcher.ts +0 -50
  783. package/src/widgets/mission-control/activity-feed.tsx +0 -59
  784. package/src/widgets/mission-control/agent-panel.tsx +0 -132
  785. package/src/widgets/mission-control/command-bar.tsx +0 -63
  786. package/src/widgets/mission-control/index.tsx +0 -751
  787. package/src/widgets/mission-control/task-panel.tsx +0 -238
  788. package/src/widgets/preview/index.tsx +0 -415
  789. package/src/widgets/resolve.ts +0 -40
  790. package/src/widgets/setup/agent-naming.tsx +0 -112
  791. package/src/widgets/setup/config-tree.tsx +0 -238
  792. package/src/widgets/setup/field-editor.tsx +0 -265
  793. package/src/widgets/setup/footer.tsx +0 -107
  794. package/src/widgets/setup/index.tsx +0 -340
  795. package/src/widgets/setup/layout-picker.tsx +0 -96
  796. package/src/widgets/setup/orchestrator-panel.tsx +0 -200
  797. package/src/widgets/setup/review-panel.tsx +0 -140
  798. package/src/widgets/setup/setup-model.test.ts +0 -303
  799. package/src/widgets/setup/setup-model.ts +0 -188
  800. package/src/widgets/tasks/index.tsx +0 -129
  801. package/src/widgets/tasks/task-detail.tsx +0 -309
  802. package/src/widgets/tasks/task-form.tsx +0 -193
  803. package/src/widgets/tasks/task-list.tsx +0 -205
  804. package/src/widgets/tasks/task-model.test.ts +0 -473
  805. 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[];