@creativeintelligence/abbie 0.1.4 → 0.1.5

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 (537) hide show
  1. package/dist/cli/commands/start.js +2 -1
  2. package/oclif.manifest.json +1 -1
  3. package/package.json +9 -5
  4. package/dist/cli/base-command.d.ts.map +0 -1
  5. package/dist/cli/commands/agent/list.d.ts.map +0 -1
  6. package/dist/cli/commands/annotation/ack.d.ts.map +0 -1
  7. package/dist/cli/commands/annotation/create.d.ts.map +0 -1
  8. package/dist/cli/commands/annotation/events.d.ts.map +0 -1
  9. package/dist/cli/commands/annotation/export.d.ts.map +0 -1
  10. package/dist/cli/commands/annotation/import.d.ts.map +0 -1
  11. package/dist/cli/commands/annotation/ingest.d.ts.map +0 -1
  12. package/dist/cli/commands/annotation/list.d.ts.map +0 -1
  13. package/dist/cli/commands/annotation/reply.d.ts.map +0 -1
  14. package/dist/cli/commands/annotation/resolve.d.ts.map +0 -1
  15. package/dist/cli/commands/auto/index.d.ts.map +0 -1
  16. package/dist/cli/commands/backlog/add.d.ts.map +0 -1
  17. package/dist/cli/commands/backlog/claim.d.ts.map +0 -1
  18. package/dist/cli/commands/backlog/complete.d.ts.map +0 -1
  19. package/dist/cli/commands/backlog/list.d.ts.map +0 -1
  20. package/dist/cli/commands/backlog/pick.d.ts.map +0 -1
  21. package/dist/cli/commands/backlog/sync.d.ts.map +0 -1
  22. package/dist/cli/commands/bootstrap.d.ts.map +0 -1
  23. package/dist/cli/commands/bridge.d.ts.map +0 -1
  24. package/dist/cli/commands/context/inject.d.ts.map +0 -1
  25. package/dist/cli/commands/context/list.d.ts.map +0 -1
  26. package/dist/cli/commands/context/publish.d.ts.map +0 -1
  27. package/dist/cli/commands/context/read.d.ts.map +0 -1
  28. package/dist/cli/commands/daemon.d.ts.map +0 -1
  29. package/dist/cli/commands/digest/index.d.ts.map +0 -1
  30. package/dist/cli/commands/docs/lint.d.ts.map +0 -1
  31. package/dist/cli/commands/docs/sync.d.ts.map +0 -1
  32. package/dist/cli/commands/doctor.d.ts.map +0 -1
  33. package/dist/cli/commands/find/index.d.ts.map +0 -1
  34. package/dist/cli/commands/gc.d.ts.map +0 -1
  35. package/dist/cli/commands/history/index.d.ts.map +0 -1
  36. package/dist/cli/commands/hooks/guard.d.ts.map +0 -1
  37. package/dist/cli/commands/hooks/list.d.ts.map +0 -1
  38. package/dist/cli/commands/hooks/lock.d.ts.map +0 -1
  39. package/dist/cli/commands/hooks/status.d.ts.map +0 -1
  40. package/dist/cli/commands/hooks/test.d.ts.map +0 -1
  41. package/dist/cli/commands/hooks/unlock.d.ts.map +0 -1
  42. package/dist/cli/commands/index.d.ts.map +0 -1
  43. package/dist/cli/commands/list.d.ts.map +0 -1
  44. package/dist/cli/commands/list.e2e.test.d.ts +0 -1
  45. package/dist/cli/commands/list.e2e.test.js +0 -47
  46. package/dist/cli/commands/login.d.ts.map +0 -1
  47. package/dist/cli/commands/logout.d.ts.map +0 -1
  48. package/dist/cli/commands/panes/broker.d.ts.map +0 -1
  49. package/dist/cli/commands/panes/pipe-sink.d.ts.map +0 -1
  50. package/dist/cli/commands/panes/snapshot.d.ts.map +0 -1
  51. package/dist/cli/commands/plan.d.ts.map +0 -1
  52. package/dist/cli/commands/plan.e2e.test.d.ts +0 -1
  53. package/dist/cli/commands/plan.e2e.test.js +0 -74
  54. package/dist/cli/commands/preview/index.d.ts.map +0 -1
  55. package/dist/cli/commands/preview/init.d.ts.map +0 -1
  56. package/dist/cli/commands/preview/list.d.ts.map +0 -1
  57. package/dist/cli/commands/preview/status.d.ts.map +0 -1
  58. package/dist/cli/commands/preview/stop.d.ts.map +0 -1
  59. package/dist/cli/commands/preview/sync.d.ts.map +0 -1
  60. package/dist/cli/commands/preview/watch.d.ts.map +0 -1
  61. package/dist/cli/commands/project/add.d.ts.map +0 -1
  62. package/dist/cli/commands/project/list.d.ts.map +0 -1
  63. package/dist/cli/commands/project/remove.d.ts.map +0 -1
  64. package/dist/cli/commands/push.d.ts.map +0 -1
  65. package/dist/cli/commands/reference/add.d.ts.map +0 -1
  66. package/dist/cli/commands/reference/delete.d.ts.map +0 -1
  67. package/dist/cli/commands/reference/extract.d.ts.map +0 -1
  68. package/dist/cli/commands/reference/list.d.ts.map +0 -1
  69. package/dist/cli/commands/reference/normalize.d.ts.map +0 -1
  70. package/dist/cli/commands/reference/open.d.ts.map +0 -1
  71. package/dist/cli/commands/reference/save.d.ts.map +0 -1
  72. package/dist/cli/commands/reference/search.d.ts.map +0 -1
  73. package/dist/cli/commands/reference/show.d.ts.map +0 -1
  74. package/dist/cli/commands/reference/update-index.d.ts.map +0 -1
  75. package/dist/cli/commands/reference/update.d.ts.map +0 -1
  76. package/dist/cli/commands/report/blocked.d.ts.map +0 -1
  77. package/dist/cli/commands/report/complete.d.ts.map +0 -1
  78. package/dist/cli/commands/report/progress.d.ts.map +0 -1
  79. package/dist/cli/commands/report/start.d.ts.map +0 -1
  80. package/dist/cli/commands/resource/acquire.d.ts.map +0 -1
  81. package/dist/cli/commands/resource/list.d.ts.map +0 -1
  82. package/dist/cli/commands/resource/release.d.ts.map +0 -1
  83. package/dist/cli/commands/resource/wait.d.ts.map +0 -1
  84. package/dist/cli/commands/review.d.ts.map +0 -1
  85. package/dist/cli/commands/session/attach.d.ts.map +0 -1
  86. package/dist/cli/commands/session/await.d.ts.map +0 -1
  87. package/dist/cli/commands/session/complete.d.ts.map +0 -1
  88. package/dist/cli/commands/session/create.d.ts.map +0 -1
  89. package/dist/cli/commands/session/heartbeat.d.ts.map +0 -1
  90. package/dist/cli/commands/session/list.d.ts.map +0 -1
  91. package/dist/cli/commands/session/mark-done.d.ts.map +0 -1
  92. package/dist/cli/commands/session/mine.d.ts.map +0 -1
  93. package/dist/cli/commands/session/replay.d.ts.map +0 -1
  94. package/dist/cli/commands/session/run.d.ts.map +0 -1
  95. package/dist/cli/commands/session/show.d.ts.map +0 -1
  96. package/dist/cli/commands/session/start.d.ts.map +0 -1
  97. package/dist/cli/commands/session/state/cleanup.d.ts.map +0 -1
  98. package/dist/cli/commands/session/state/end.d.ts.map +0 -1
  99. package/dist/cli/commands/session/state/get.d.ts.map +0 -1
  100. package/dist/cli/commands/session/state/init.d.ts.map +0 -1
  101. package/dist/cli/commands/session/state/list.d.ts.map +0 -1
  102. package/dist/cli/commands/session/state/update.d.ts.map +0 -1
  103. package/dist/cli/commands/session/stop.d.ts.map +0 -1
  104. package/dist/cli/commands/session/view.d.ts.map +0 -1
  105. package/dist/cli/commands/start.d.ts.map +0 -1
  106. package/dist/cli/commands/state/dump.d.ts.map +0 -1
  107. package/dist/cli/commands/status.d.ts.map +0 -1
  108. package/dist/cli/commands/sync.d.ts.map +0 -1
  109. package/dist/cli/commands/trace/export.d.ts.map +0 -1
  110. package/dist/cli/commands/triage/claim.d.ts.map +0 -1
  111. package/dist/cli/commands/triage/list.d.ts.map +0 -1
  112. package/dist/cli/commands/triage/next.d.ts.map +0 -1
  113. package/dist/cli/commands/triage/pull.d.ts.map +0 -1
  114. package/dist/cli/commands/triage/stats.d.ts.map +0 -1
  115. package/dist/cli/commands/tunnel/list.d.ts.map +0 -1
  116. package/dist/cli/commands/tunnel/start.d.ts.map +0 -1
  117. package/dist/cli/commands/tunnel/stop.d.ts.map +0 -1
  118. package/dist/cli/commands/tunnel/url.d.ts.map +0 -1
  119. package/dist/cli/commands/web/start.d.ts.map +0 -1
  120. package/dist/cli/commands/windows/context.d.ts.map +0 -1
  121. package/dist/cli/commands/windows/focus.d.ts.map +0 -1
  122. package/dist/cli/commands/windows/list.d.ts.map +0 -1
  123. package/dist/cli/commands/windows/map.d.ts.map +0 -1
  124. package/dist/cli/commands/windows/read.d.ts.map +0 -1
  125. package/dist/cli/commands/windows/search.d.ts.map +0 -1
  126. package/dist/cli/commands/windows/show.d.ts.map +0 -1
  127. package/dist/cli/commands/windows/watch.d.ts.map +0 -1
  128. package/dist/lib/active-sessions.d.ts.map +0 -1
  129. package/dist/lib/agent-adapters.d.ts.map +0 -1
  130. package/dist/lib/agent-sessions.d.ts.map +0 -1
  131. package/dist/lib/agent-trace.d.ts.map +0 -1
  132. package/dist/lib/analytics.d.ts.map +0 -1
  133. package/dist/lib/annotations-convex.d.ts.map +0 -1
  134. package/dist/lib/annotations.d.ts.map +0 -1
  135. package/dist/lib/auto/discover.d.ts.map +0 -1
  136. package/dist/lib/auto/ideate.d.ts.map +0 -1
  137. package/dist/lib/auto/spawn.d.ts.map +0 -1
  138. package/dist/lib/auto/workspace.d.ts.map +0 -1
  139. package/dist/lib/backlog.d.ts.map +0 -1
  140. package/dist/lib/backlog.test.d.ts +0 -1
  141. package/dist/lib/backlog.test.js +0 -162
  142. package/dist/lib/config-loader.d.ts.map +0 -1
  143. package/dist/lib/config-sync/adapters/claude.d.ts.map +0 -1
  144. package/dist/lib/config-sync/adapters/codex.d.ts.map +0 -1
  145. package/dist/lib/config-sync/adapters/copilot.d.ts.map +0 -1
  146. package/dist/lib/config-sync/adapters/gemini.d.ts.map +0 -1
  147. package/dist/lib/config-sync/adapters/index.d.ts.map +0 -1
  148. package/dist/lib/config-sync/adapters/opencode.d.ts.map +0 -1
  149. package/dist/lib/config-sync/index.d.ts.map +0 -1
  150. package/dist/lib/config-sync/types.d.ts.map +0 -1
  151. package/dist/lib/config-sync/writer.d.ts.map +0 -1
  152. package/dist/lib/content-sync/index.d.ts.map +0 -1
  153. package/dist/lib/content-sync/types.d.ts.map +0 -1
  154. package/dist/lib/contracts.d.ts.map +0 -1
  155. package/dist/lib/convex.d.ts.map +0 -1
  156. package/dist/lib/device.d.ts.map +0 -1
  157. package/dist/lib/digest/index.d.ts.map +0 -1
  158. package/dist/lib/docs/lint.d.ts.map +0 -1
  159. package/dist/lib/docs/lint.test.d.ts +0 -1
  160. package/dist/lib/docs/lint.test.js +0 -120
  161. package/dist/lib/docs/sync.d.ts.map +0 -1
  162. package/dist/lib/doctor/index.d.ts.map +0 -1
  163. package/dist/lib/doctor/repos.d.ts.map +0 -1
  164. package/dist/lib/doctor/templates.d.ts.map +0 -1
  165. package/dist/lib/errors.d.ts.map +0 -1
  166. package/dist/lib/events.d.ts.map +0 -1
  167. package/dist/lib/heartbeat.d.ts.map +0 -1
  168. package/dist/lib/heartbeat.test.d.ts +0 -1
  169. package/dist/lib/heartbeat.test.js +0 -124
  170. package/dist/lib/hooks/adapters/claude.d.ts.map +0 -1
  171. package/dist/lib/hooks/adapters/codex.d.ts.map +0 -1
  172. package/dist/lib/hooks/adapters/copilot.d.ts.map +0 -1
  173. package/dist/lib/hooks/context.d.ts.map +0 -1
  174. package/dist/lib/hooks/index.d.ts.map +0 -1
  175. package/dist/lib/hooks/registry.d.ts.map +0 -1
  176. package/dist/lib/hooks/runner.d.ts.map +0 -1
  177. package/dist/lib/hooks/types.d.ts.map +0 -1
  178. package/dist/lib/index.test.d.ts +0 -1
  179. package/dist/lib/index.test.js +0 -334
  180. package/dist/lib/managed-session.d.ts.map +0 -1
  181. package/dist/lib/math.d.ts.map +0 -1
  182. package/dist/lib/math.test.d.ts +0 -1
  183. package/dist/lib/math.test.js +0 -238
  184. package/dist/lib/ngrok.d.ts.map +0 -1
  185. package/dist/lib/nvim/discovery.d.ts.map +0 -1
  186. package/dist/lib/nvim/discovery.test.d.ts +0 -1
  187. package/dist/lib/nvim/discovery.test.js +0 -131
  188. package/dist/lib/nvim/index.d.ts.map +0 -1
  189. package/dist/lib/nvim/remote.d.ts.map +0 -1
  190. package/dist/lib/nvim/remote.test.d.ts +0 -1
  191. package/dist/lib/nvim/remote.test.js +0 -18
  192. package/dist/lib/panes/broker.d.ts.map +0 -1
  193. package/dist/lib/panes/index.d.ts.map +0 -1
  194. package/dist/lib/panes/server.d.ts.map +0 -1
  195. package/dist/lib/preview/detect.d.ts.map +0 -1
  196. package/dist/lib/preview/index.d.ts.map +0 -1
  197. package/dist/lib/preview/manager.d.ts.map +0 -1
  198. package/dist/lib/preview/schema.d.ts.map +0 -1
  199. package/dist/lib/preview/sprite.d.ts.map +0 -1
  200. package/dist/lib/preview/watcher.d.ts.map +0 -1
  201. package/dist/lib/process/index.d.ts.map +0 -1
  202. package/dist/lib/process/snapshot.d.ts.map +0 -1
  203. package/dist/lib/process/snapshot.test.d.ts +0 -1
  204. package/dist/lib/process/snapshot.test.js +0 -127
  205. package/dist/lib/project-identity.d.ts.map +0 -1
  206. package/dist/lib/provider-auth.d.ts.map +0 -1
  207. package/dist/lib/references.d.ts.map +0 -1
  208. package/dist/lib/report.d.ts.map +0 -1
  209. package/dist/lib/resources.d.ts.map +0 -1
  210. package/dist/lib/resources.test.d.ts +0 -1
  211. package/dist/lib/resources.test.js +0 -94
  212. package/dist/lib/runner.d.ts.map +0 -1
  213. package/dist/lib/runner.test.d.ts +0 -1
  214. package/dist/lib/runner.test.js +0 -234
  215. package/dist/lib/session-artifacts.d.ts.map +0 -1
  216. package/dist/lib/session-manager.d.ts.map +0 -1
  217. package/dist/lib/session-manager.test.d.ts +0 -1
  218. package/dist/lib/session-manager.test.js +0 -310
  219. package/dist/lib/session-result.d.ts.map +0 -1
  220. package/dist/lib/session-state.d.ts.map +0 -1
  221. package/dist/lib/slack-workspace.d.ts.map +0 -1
  222. package/dist/lib/tmux/bridge.d.ts.map +0 -1
  223. package/dist/lib/tmux/context.d.ts.map +0 -1
  224. package/dist/lib/tmux/context.test.d.ts +0 -1
  225. package/dist/lib/tmux/context.test.js +0 -215
  226. package/dist/lib/tmux/index.d.ts.map +0 -1
  227. package/dist/lib/tmux/map.d.ts.map +0 -1
  228. package/dist/lib/tmux/map.test.d.ts +0 -1
  229. package/dist/lib/tmux/map.test.js +0 -80
  230. package/dist/lib/tmux/panes.d.ts.map +0 -1
  231. package/dist/lib/tmux/redaction.d.ts.map +0 -1
  232. package/dist/lib/tmux/redaction.test.d.ts +0 -1
  233. package/dist/lib/tmux/redaction.test.js +0 -183
  234. package/dist/lib/triage-llm.d.ts.map +0 -1
  235. package/dist/lib/triage-tracker.d.ts.map +0 -1
  236. package/dist/lib/triage.d.ts.map +0 -1
  237. package/dist/lib/types.d.ts.map +0 -1
  238. package/dist/lib/windows/index.d.ts.map +0 -1
  239. package/dist/lib/windows/inventory.d.ts.map +0 -1
  240. package/dist/lib/windows/inventory.test.d.ts +0 -1
  241. package/dist/lib/windows/inventory.test.js +0 -292
  242. package/dist/lib/windows/types.d.ts.map +0 -1
  243. package/dist/lib.d.ts.map +0 -1
  244. package/dist/web/app/@overlay/default.d.ts +0 -1
  245. package/dist/web/app/@overlay/default.js +0 -3
  246. package/dist/web/app/about/page.d.ts +0 -1
  247. package/dist/web/app/about/page.js +0 -6
  248. package/dist/web/app/layout.d.ts +0 -7
  249. package/dist/web/app/layout.js +0 -19
  250. package/dist/web/app/page.d.ts +0 -1
  251. package/dist/web/app/page.js +0 -38
  252. package/dist/web/app/settings/page.d.ts +0 -1
  253. package/dist/web/app/settings/page.js +0 -6
  254. package/dist/web/app/shortcuts/page.d.ts +0 -1
  255. package/dist/web/app/shortcuts/page.js +0 -6
  256. package/dist/web/atoms/sidebar.d.ts +0 -16
  257. package/dist/web/atoms/sidebar.js +0 -58
  258. package/dist/web/atoms/state.d.ts +0 -24
  259. package/dist/web/atoms/state.js +0 -43
  260. package/dist/web/components/command-palette.d.ts +0 -6
  261. package/dist/web/components/command-palette.js +0 -297
  262. package/dist/web/components/main-view.d.ts +0 -1
  263. package/dist/web/components/main-view.js +0 -93
  264. package/dist/web/components/overlay/page-overlay.d.ts +0 -16
  265. package/dist/web/components/overlay/page-overlay.js +0 -84
  266. package/dist/web/components/pane-view.d.ts +0 -5
  267. package/dist/web/components/pane-view.js +0 -168
  268. package/dist/web/components/project-files-view.d.ts +0 -6
  269. package/dist/web/components/project-files-view.js +0 -205
  270. package/dist/web/components/project-planning-view.d.ts +0 -6
  271. package/dist/web/components/project-planning-view.js +0 -146
  272. package/dist/web/components/session-view.d.ts +0 -6
  273. package/dist/web/components/session-view.js +0 -211
  274. package/dist/web/components/sessions-list-view.d.ts +0 -1
  275. package/dist/web/components/sessions-list-view.js +0 -118
  276. package/dist/web/components/sidebar/index.d.ts +0 -9
  277. package/dist/web/components/sidebar/index.js +0 -29
  278. package/dist/web/components/sidebar/kbd.d.ts +0 -17
  279. package/dist/web/components/sidebar/kbd.js +0 -47
  280. package/dist/web/components/sidebar/nav-group.d.ts +0 -22
  281. package/dist/web/components/sidebar/nav-group.js +0 -43
  282. package/dist/web/components/sidebar/nav-item.d.ts +0 -17
  283. package/dist/web/components/sidebar/nav-item.js +0 -38
  284. package/dist/web/components/sidebar/sidebar-header.d.ts +0 -9
  285. package/dist/web/components/sidebar/sidebar-header.js +0 -18
  286. package/dist/web/components/sidebar/sidebar-nav.d.ts +0 -7
  287. package/dist/web/components/sidebar/sidebar-nav.js +0 -505
  288. package/dist/web/components/sidebar/sidebar-search.d.ts +0 -7
  289. package/dist/web/components/sidebar/sidebar-search.js +0 -18
  290. package/dist/web/components/sidebar/sidebar-settings.d.ts +0 -4
  291. package/dist/web/components/sidebar/sidebar-settings.js +0 -28
  292. package/dist/web/components/sidebar/sidebar-transition.d.ts +0 -12
  293. package/dist/web/components/sidebar/sidebar-transition.js +0 -58
  294. package/dist/web/components/status-bar.d.ts +0 -1
  295. package/dist/web/components/status-bar.js +0 -53
  296. package/dist/web/components/terminal.d.ts +0 -4
  297. package/dist/web/components/terminal.js +0 -324
  298. package/dist/web/components/toast.d.ts +0 -7
  299. package/dist/web/components/toast.js +0 -72
  300. package/dist/web/hooks/use-keybindings.d.ts +0 -30
  301. package/dist/web/hooks/use-keybindings.js +0 -322
  302. package/dist/web/hooks/use-state.d.ts +0 -11
  303. package/dist/web/hooks/use-state.js +0 -84
  304. package/dist/web/lib/api.d.ts +0 -179
  305. package/dist/web/lib/api.js +0 -79
  306. package/dist/web/lib/paths.d.ts +0 -2
  307. package/dist/web/lib/paths.js +0 -26
  308. package/dist/web/lib/utils.d.ts +0 -2
  309. package/dist/web/lib/utils.js +0 -5
  310. package/dist/web/lib/ws.d.ts +0 -18
  311. package/dist/web/lib/ws.js +0 -138
  312. package/dist/web/next.config.d.ts +0 -3
  313. package/dist/web/next.config.js +0 -9
  314. package/scripts/generate-manifest.ts +0 -44
  315. package/src/cli/base-command.ts +0 -233
  316. package/src/cli/commands/__tests__/annotations.test.ts +0 -704
  317. package/src/cli/commands/__tests__/bridge.test.ts +0 -101
  318. package/src/cli/commands/__tests__/daemon.test.ts +0 -79
  319. package/src/cli/commands/agent/list.ts +0 -75
  320. package/src/cli/commands/annotation/ack.ts +0 -37
  321. package/src/cli/commands/annotation/create.ts +0 -67
  322. package/src/cli/commands/annotation/events.ts +0 -63
  323. package/src/cli/commands/annotation/export.ts +0 -67
  324. package/src/cli/commands/annotation/import.ts +0 -98
  325. package/src/cli/commands/annotation/ingest.ts +0 -112
  326. package/src/cli/commands/annotation/list.ts +0 -57
  327. package/src/cli/commands/annotation/reply.ts +0 -46
  328. package/src/cli/commands/annotation/resolve.ts +0 -37
  329. package/src/cli/commands/auto/index.ts +0 -755
  330. package/src/cli/commands/backlog/add.ts +0 -74
  331. package/src/cli/commands/backlog/claim.ts +0 -53
  332. package/src/cli/commands/backlog/complete.ts +0 -51
  333. package/src/cli/commands/backlog/list.ts +0 -107
  334. package/src/cli/commands/backlog/pick.ts +0 -50
  335. package/src/cli/commands/backlog/sync.ts +0 -131
  336. package/src/cli/commands/bootstrap.ts +0 -205
  337. package/src/cli/commands/bridge.ts +0 -233
  338. package/src/cli/commands/context/inject.ts +0 -103
  339. package/src/cli/commands/context/list.ts +0 -112
  340. package/src/cli/commands/context/publish.ts +0 -83
  341. package/src/cli/commands/context/read.ts +0 -85
  342. package/src/cli/commands/daemon.ts +0 -1809
  343. package/src/cli/commands/digest/index.ts +0 -245
  344. package/src/cli/commands/docs/lint.ts +0 -93
  345. package/src/cli/commands/docs/sync.ts +0 -90
  346. package/src/cli/commands/doctor.ts +0 -267
  347. package/src/cli/commands/find/index.ts +0 -313
  348. package/src/cli/commands/history/index.ts +0 -269
  349. package/src/cli/commands/hooks/guard.ts +0 -71
  350. package/src/cli/commands/hooks/list.ts +0 -139
  351. package/src/cli/commands/hooks/lock.ts +0 -47
  352. package/src/cli/commands/hooks/status.ts +0 -56
  353. package/src/cli/commands/hooks/test.ts +0 -190
  354. package/src/cli/commands/hooks/unlock.ts +0 -56
  355. package/src/cli/commands/list.e2e.test.ts +0 -58
  356. package/src/cli/commands/list.ts +0 -96
  357. package/src/cli/commands/login.ts +0 -236
  358. package/src/cli/commands/logout.ts +0 -45
  359. package/src/cli/commands/panes/broker.ts +0 -68
  360. package/src/cli/commands/panes/pipe-sink.ts +0 -101
  361. package/src/cli/commands/panes/snapshot.ts +0 -156
  362. package/src/cli/commands/plan.e2e.test.ts +0 -90
  363. package/src/cli/commands/plan.ts +0 -68
  364. package/src/cli/commands/preview/index.ts +0 -282
  365. package/src/cli/commands/preview/list.ts +0 -116
  366. package/src/cli/commands/preview/status.ts +0 -137
  367. package/src/cli/commands/preview/stop.ts +0 -165
  368. package/src/cli/commands/project/add.ts +0 -110
  369. package/src/cli/commands/project/list.ts +0 -136
  370. package/src/cli/commands/project/remove.ts +0 -60
  371. package/src/cli/commands/push.ts +0 -115
  372. package/src/cli/commands/reference/add.ts +0 -266
  373. package/src/cli/commands/reference/delete.ts +0 -67
  374. package/src/cli/commands/reference/extract.ts +0 -389
  375. package/src/cli/commands/reference/list.ts +0 -117
  376. package/src/cli/commands/reference/normalize.ts +0 -90
  377. package/src/cli/commands/reference/open.ts +0 -92
  378. package/src/cli/commands/reference/save.ts +0 -103
  379. package/src/cli/commands/reference/search.ts +0 -85
  380. package/src/cli/commands/reference/show.ts +0 -174
  381. package/src/cli/commands/reference/update-index.ts +0 -103
  382. package/src/cli/commands/reference/update.ts +0 -136
  383. package/src/cli/commands/report/blocked.ts +0 -165
  384. package/src/cli/commands/report/complete.ts +0 -179
  385. package/src/cli/commands/report/progress.ts +0 -142
  386. package/src/cli/commands/report/start.ts +0 -140
  387. package/src/cli/commands/resource/acquire.ts +0 -116
  388. package/src/cli/commands/resource/list.ts +0 -77
  389. package/src/cli/commands/resource/release.ts +0 -64
  390. package/src/cli/commands/resource/wait.ts +0 -93
  391. package/src/cli/commands/review.ts +0 -105
  392. package/src/cli/commands/session/attach.ts +0 -200
  393. package/src/cli/commands/session/await.ts +0 -83
  394. package/src/cli/commands/session/complete.ts +0 -100
  395. package/src/cli/commands/session/create.ts +0 -92
  396. package/src/cli/commands/session/heartbeat.ts +0 -63
  397. package/src/cli/commands/session/list.ts +0 -281
  398. package/src/cli/commands/session/mark-done.ts +0 -132
  399. package/src/cli/commands/session/mine.ts +0 -189
  400. package/src/cli/commands/session/replay.ts +0 -659
  401. package/src/cli/commands/session/run.ts +0 -44
  402. package/src/cli/commands/session/show.ts +0 -177
  403. package/src/cli/commands/session/start.ts +0 -580
  404. package/src/cli/commands/session/state/cleanup.ts +0 -61
  405. package/src/cli/commands/session/state/end.ts +0 -47
  406. package/src/cli/commands/session/state/get.ts +0 -65
  407. package/src/cli/commands/session/state/init.ts +0 -50
  408. package/src/cli/commands/session/state/list.ts +0 -68
  409. package/src/cli/commands/session/state/update.ts +0 -108
  410. package/src/cli/commands/session/stop.ts +0 -134
  411. package/src/cli/commands/session/view.ts +0 -186
  412. package/src/cli/commands/start.ts +0 -256
  413. package/src/cli/commands/state/dump.ts +0 -449
  414. package/src/cli/commands/status.ts +0 -244
  415. package/src/cli/commands/sync.ts +0 -174
  416. package/src/cli/commands/trace/export.ts +0 -255
  417. package/src/cli/commands/triage/claim.ts +0 -203
  418. package/src/cli/commands/triage/list.ts +0 -137
  419. package/src/cli/commands/triage/next.ts +0 -73
  420. package/src/cli/commands/triage/pull.ts +0 -97
  421. package/src/cli/commands/triage/stats.ts +0 -82
  422. package/src/cli/commands/tunnel/list.ts +0 -113
  423. package/src/cli/commands/tunnel/start.ts +0 -122
  424. package/src/cli/commands/tunnel/stop.ts +0 -108
  425. package/src/cli/commands/tunnel/url.ts +0 -82
  426. package/src/cli/commands/web/start.ts +0 -125
  427. package/src/cli/commands/windows/context.ts +0 -439
  428. package/src/cli/commands/windows/focus.ts +0 -130
  429. package/src/cli/commands/windows/list.ts +0 -213
  430. package/src/cli/commands/windows/map.ts +0 -223
  431. package/src/cli/commands/windows/read.ts +0 -279
  432. package/src/cli/commands/windows/search.ts +0 -219
  433. package/src/cli/commands/windows/show.ts +0 -188
  434. package/src/cli/commands/windows/watch.ts +0 -262
  435. package/src/lib/__tests__/annotations-convex.test.ts +0 -104
  436. package/src/lib/active-sessions.ts +0 -1486
  437. package/src/lib/agent-adapters.ts +0 -412
  438. package/src/lib/agent-sessions.ts +0 -671
  439. package/src/lib/agent-trace.test.ts +0 -296
  440. package/src/lib/agent-trace.ts +0 -513
  441. package/src/lib/analytics.ts +0 -178
  442. package/src/lib/annotations-convex.ts +0 -296
  443. package/src/lib/annotations.test.ts +0 -274
  444. package/src/lib/annotations.ts +0 -836
  445. package/src/lib/auto/discover.ts +0 -545
  446. package/src/lib/auto/ideate.ts +0 -412
  447. package/src/lib/auto/spawn.ts +0 -549
  448. package/src/lib/auto/workspace.ts +0 -282
  449. package/src/lib/backlog.test.ts +0 -194
  450. package/src/lib/backlog.ts +0 -428
  451. package/src/lib/config-loader.ts +0 -391
  452. package/src/lib/config-sync/adapters/claude.ts +0 -91
  453. package/src/lib/config-sync/adapters/codex.ts +0 -135
  454. package/src/lib/config-sync/adapters/copilot.ts +0 -98
  455. package/src/lib/config-sync/adapters/gemini.ts +0 -86
  456. package/src/lib/config-sync/adapters/index.ts +0 -39
  457. package/src/lib/config-sync/adapters/opencode.ts +0 -94
  458. package/src/lib/config-sync/index.ts +0 -399
  459. package/src/lib/config-sync/types.ts +0 -92
  460. package/src/lib/config-sync/writer.ts +0 -188
  461. package/src/lib/content-sync/index.ts +0 -882
  462. package/src/lib/content-sync/types.ts +0 -104
  463. package/src/lib/contracts.test.ts +0 -186
  464. package/src/lib/contracts.ts +0 -195
  465. package/src/lib/convex.ts +0 -54
  466. package/src/lib/device.ts +0 -41
  467. package/src/lib/digest/index.ts +0 -529
  468. package/src/lib/docs/lint.test.ts +0 -135
  469. package/src/lib/docs/lint.ts +0 -310
  470. package/src/lib/docs/sync.ts +0 -184
  471. package/src/lib/doctor/index.ts +0 -647
  472. package/src/lib/doctor/repos.ts +0 -381
  473. package/src/lib/doctor/templates.ts +0 -191
  474. package/src/lib/errors.ts +0 -111
  475. package/src/lib/events.ts +0 -479
  476. package/src/lib/heartbeat.test.ts +0 -164
  477. package/src/lib/heartbeat.ts +0 -326
  478. package/src/lib/hooks/adapters/claude.ts +0 -115
  479. package/src/lib/hooks/adapters/codex.ts +0 -92
  480. package/src/lib/hooks/adapters/copilot.ts +0 -141
  481. package/src/lib/hooks/context.ts +0 -174
  482. package/src/lib/hooks/index.ts +0 -39
  483. package/src/lib/hooks/registry.ts +0 -101
  484. package/src/lib/hooks/runner.ts +0 -208
  485. package/src/lib/hooks/types.ts +0 -89
  486. package/src/lib/index.test.ts +0 -426
  487. package/src/lib/managed-session.ts +0 -117
  488. package/src/lib/math.test.ts +0 -299
  489. package/src/lib/math.ts +0 -120
  490. package/src/lib/ngrok.ts +0 -441
  491. package/src/lib/nvim/discovery.test.ts +0 -157
  492. package/src/lib/nvim/discovery.ts +0 -181
  493. package/src/lib/nvim/index.ts +0 -28
  494. package/src/lib/nvim/remote.test.ts +0 -21
  495. package/src/lib/nvim/remote.ts +0 -184
  496. package/src/lib/panes/README.md +0 -20
  497. package/src/lib/panes/broker.ts +0 -261
  498. package/src/lib/panes/index.ts +0 -1
  499. package/src/lib/panes/server.ts +0 -379
  500. package/src/lib/preview/detect.ts +0 -184
  501. package/src/lib/preview/index.ts +0 -1
  502. package/src/lib/process/index.ts +0 -16
  503. package/src/lib/process/snapshot.test.ts +0 -188
  504. package/src/lib/process/snapshot.ts +0 -257
  505. package/src/lib/provider-auth.ts +0 -258
  506. package/src/lib/references.ts +0 -481
  507. package/src/lib/report.ts +0 -973
  508. package/src/lib/resources.test.ts +0 -132
  509. package/src/lib/resources.ts +0 -429
  510. package/src/lib/runner.test.ts +0 -288
  511. package/src/lib/runner.ts +0 -1223
  512. package/src/lib/session-artifacts.test.ts +0 -107
  513. package/src/lib/session-artifacts.ts +0 -193
  514. package/src/lib/session-manager.test.ts +0 -402
  515. package/src/lib/session-manager.ts +0 -150
  516. package/src/lib/session-result.test.ts +0 -98
  517. package/src/lib/session-result.ts +0 -262
  518. package/src/lib/session-state.ts +0 -470
  519. package/src/lib/slack-workspace.ts +0 -25
  520. package/src/lib/tmux/bridge.ts +0 -439
  521. package/src/lib/tmux/context.test.ts +0 -242
  522. package/src/lib/tmux/context.ts +0 -380
  523. package/src/lib/tmux/index.ts +0 -46
  524. package/src/lib/tmux/map.test.ts +0 -99
  525. package/src/lib/tmux/map.ts +0 -252
  526. package/src/lib/tmux/panes.ts +0 -170
  527. package/src/lib/tmux/redaction.test.ts +0 -231
  528. package/src/lib/tmux/redaction.ts +0 -201
  529. package/src/lib/triage-llm.ts +0 -312
  530. package/src/lib/triage-tracker.ts +0 -400
  531. package/src/lib/triage.ts +0 -655
  532. package/src/lib/types.ts +0 -61
  533. package/src/lib/windows/index.ts +0 -2
  534. package/src/lib/windows/inventory.test.ts +0 -370
  535. package/src/lib/windows/inventory.ts +0 -352
  536. package/src/lib/windows/types.ts +0 -46
  537. package/src/lib.ts +0 -260
@@ -1,505 +0,0 @@
1
- 'use client';
2
- import { createContext, memo, useCallback, useContext, useEffect, useId, useMemo, useRef, useState, } from 'react';
3
- import { useAtom, useAtomValue, useSetAtom } from 'jotai';
4
- import { Menu } from '@base-ui-components/react/menu';
5
- import { Reorder, useDragControls } from 'motion/react';
6
- import { CubeTransparentIcon, Squares2X2Icon, Bars3BottomLeftIcon, ClipboardIcon, EllipsisHorizontalIcon, Bars2Icon, FolderOpenIcon, CodeBracketIcon, ChevronRightIcon, CheckIcon, EyeIcon, } from '@heroicons/react/24/outline';
7
- import { cn } from '@/lib/utils';
8
- import { stateAtom, tmuxWindowsAtom, selectedProjectAtom, selectedProjectViewAtom, selectedSessionIdAtom, viewModeAtom, projectsAtom, } from '@/atoms/state';
9
- import { DEFAULT_PROJECT_SIDEBAR_ITEMS, expandedProjectsAtom, projectSidebarItemsAtom, setProjectExpandedAtom, setProjectSidebarItemEnabledAtom, } from '@/atoms/sidebar';
10
- import { api } from '@/lib/api';
11
- import { toastError, toastSuccess } from '@/components/toast';
12
- import { formatTmuxWindowName } from '@/lib/paths';
13
- import { NavGroup } from './nav-group';
14
- import { NavItem } from './nav-item';
15
- const HoverContext = createContext(null);
16
- function HoverProvider({ children }) {
17
- const [lastHoveredId, setLastHoveredId] = useState(null);
18
- const setLastHovered = useCallback((id) => {
19
- setLastHoveredId(id);
20
- }, []);
21
- return (<HoverContext.Provider value={{ lastHoveredId, setLastHovered }}>
22
- {children}
23
- </HoverContext.Provider>);
24
- }
25
- // Base styles for menu items (without hover state)
26
- const menuItemBaseClass = cn('relative flex w-full items-center gap-2.5 px-2 py-2 text-sm', 'outline-none cursor-pointer select-none', 'text-foreground-secondary');
27
- const menuCheckboxBaseClass = cn('relative flex w-full items-center justify-between gap-2.5 px-2 py-2 text-sm', 'outline-none cursor-pointer select-none', 'text-foreground-secondary');
28
- // Sticky hover tile styles (applied when item is hovered or last hovered)
29
- // inset-x-0.5 (2px) aligns better with px-2.5 content padding
30
- const stickyHoverTileClass = cn('before:absolute before:inset-x-px before:inset-y-0', 'before:z-[-1] before:rounded-lg', 'before:bg-background-tertiary');
31
- function StickyMenuItem({ children, onClick, className }) {
32
- const itemId = useId();
33
- const hoverContext = useContext(HoverContext);
34
- const isLastHovered = hoverContext?.lastHoveredId === itemId;
35
- return (<Menu.Item onClick={onClick} onPointerEnter={() => hoverContext?.setLastHovered(itemId)} className={cn(menuItemBaseClass, 'z-0', isLastHovered && ['text-foreground', stickyHoverTileClass],
36
- // Also show on data-[highlighted] for keyboard navigation
37
- 'data-[highlighted]:text-foreground', 'data-[highlighted]:before:absolute data-[highlighted]:before:inset-x-px data-[highlighted]:before:inset-y-0', 'data-[highlighted]:before:z-[-1] data-[highlighted]:before:rounded-lg', 'data-[highlighted]:before:bg-background-tertiary', className)}>
38
- {children}
39
- </Menu.Item>);
40
- }
41
- function StickySubmenuTrigger({ children, className }) {
42
- const itemId = useId();
43
- const hoverContext = useContext(HoverContext);
44
- const isLastHovered = hoverContext?.lastHoveredId === itemId;
45
- return (<Menu.SubmenuTrigger onPointerEnter={() => hoverContext?.setLastHovered(itemId)} className={cn(menuItemBaseClass, 'z-0 justify-between', isLastHovered && ['text-foreground', stickyHoverTileClass], 'data-[highlighted]:text-foreground', 'data-[highlighted]:before:absolute data-[highlighted]:before:inset-x-px data-[highlighted]:before:inset-y-0', 'data-[highlighted]:before:z-[-1] data-[highlighted]:before:rounded-lg', 'data-[highlighted]:before:bg-background-tertiary', className)}>
46
- {children}
47
- </Menu.SubmenuTrigger>);
48
- }
49
- function StickyCheckboxItem({ children, checked, onCheckedChange, closeOnClick = false, className, }) {
50
- const itemId = useId();
51
- const hoverContext = useContext(HoverContext);
52
- const isLastHovered = hoverContext?.lastHoveredId === itemId;
53
- return (<Menu.CheckboxItem checked={checked} closeOnClick={closeOnClick} onCheckedChange={onCheckedChange} onPointerEnter={() => hoverContext?.setLastHovered(itemId)} className={cn(menuCheckboxBaseClass, 'z-0', isLastHovered && ['text-foreground', stickyHoverTileClass], 'data-[highlighted]:text-foreground', 'data-[highlighted]:before:absolute data-[highlighted]:before:inset-x-px data-[highlighted]:before:inset-y-0', 'data-[highlighted]:before:z-[-1] data-[highlighted]:before:rounded-lg', 'data-[highlighted]:before:bg-background-tertiary', className)}>
54
- {children}
55
- </Menu.CheckboxItem>);
56
- }
57
- // ----------------------------------------------------------------------------
58
- /**
59
- * Main navigation - project list (tmux windows) with expandable sections.
60
- */
61
- export function SidebarNav({ className, onScrolledChange, }) {
62
- const [, setState] = useAtom(stateAtom);
63
- const windows = useAtomValue(tmuxWindowsAtom);
64
- const projects = useAtomValue(projectsAtom);
65
- const expandedProjects = useAtomValue(expandedProjectsAtom);
66
- const projectItems = useAtomValue(projectSidebarItemsAtom);
67
- const setProjectExpanded = useSetAtom(setProjectExpandedAtom);
68
- const setProjectSidebarItemEnabled = useSetAtom(setProjectSidebarItemEnabledAtom);
69
- const [selectedProject, setSelectedProject] = useAtom(selectedProjectAtom);
70
- const [selectedProjectView, setSelectedProjectView] = useAtom(selectedProjectViewAtom);
71
- const setSelectedSessionId = useSetAtom(selectedSessionIdAtom);
72
- const setViewMode = useSetAtom(viewModeAtom);
73
- const [openProjectMenu, setOpenProjectMenu] = useState(null);
74
- const [draggingProjectKey, setDraggingProjectKey] = useState(null);
75
- const draggingProjectKeyRef = useRef(null);
76
- const [dragDirection, setDragDirection] = useState(null);
77
- const windowsRef = useRef(windows);
78
- const frozenWindowsRef = useRef(null);
79
- const [orderedProjectKeys, setOrderedProjectKeys] = useState([]);
80
- const orderAtDragStartRef = useRef([]);
81
- const orderedProjectKeysRef = useRef([]);
82
- const lastTmuxOrderKeysRef = useRef([]);
83
- const [reorderSaving, setReorderSaving] = useState(false);
84
- const getProjectEmoji = useCallback((name) => {
85
- return projects.projects[name]?.emoji ?? projects.defaultEmoji;
86
- }, [projects]);
87
- const getWindowKey = useCallback((window) => {
88
- // In normal operation, this is `window.id` (stable like "@47").
89
- // If the API server is out of date and doesn't provide ids, fall back to the index.
90
- return window.id || (Number.isFinite(window.index) ? String(window.index) : window.name);
91
- }, []);
92
- useEffect(() => {
93
- windowsRef.current = windows;
94
- }, [windows]);
95
- const windowsForRender = draggingProjectKey != null ? (frozenWindowsRef.current ?? windows) : windows;
96
- const windowsByKey = useMemo(() => {
97
- const map = new Map();
98
- for (const w of windowsForRender) {
99
- map.set(getWindowKey(w), w);
100
- }
101
- return map;
102
- }, [windowsForRender, getWindowKey]);
103
- const tmuxOrderKeys = useMemo(() => windowsForRender.map(getWindowKey), [windowsForRender, getWindowKey]);
104
- const draggingExpanded = useMemo(() => {
105
- if (!draggingProjectKey)
106
- return false;
107
- const window = windowsByKey.get(draggingProjectKey);
108
- if (!window)
109
- return false;
110
- return expandedProjects[window.name] ?? false;
111
- }, [draggingProjectKey, expandedProjects, windowsByKey]);
112
- const setDragDirectionSafe = useCallback((next) => {
113
- setDragDirection((prev) => (prev === next ? prev : next));
114
- }, []);
115
- const softLayoutActive = draggingExpanded || dragDirection === 'up';
116
- const handleReorder = useCallback((nextKeys) => {
117
- const prev = orderedProjectKeysRef.current;
118
- const isSame = prev.length === nextKeys.length && prev.every((value, i) => value === nextKeys[i]);
119
- if (isSame)
120
- return;
121
- setOrderedProjectKeys(nextKeys);
122
- orderedProjectKeysRef.current = nextKeys;
123
- }, []);
124
- useEffect(() => {
125
- draggingProjectKeyRef.current = draggingProjectKey;
126
- }, [draggingProjectKey]);
127
- // Keep UI order in sync with tmux order:
128
- // - If user hasn't reordered locally, follow tmux exactly.
129
- // - If user has reordered locally, preserve local order but reconcile added/removed windows.
130
- useEffect(() => {
131
- if (reorderSaving)
132
- return;
133
- if (draggingProjectKeyRef.current)
134
- return;
135
- setOrderedProjectKeys((prev) => {
136
- if (prev.length === 0) {
137
- orderedProjectKeysRef.current = tmuxOrderKeys;
138
- lastTmuxOrderKeysRef.current = tmuxOrderKeys;
139
- return tmuxOrderKeys;
140
- }
141
- const lastTmux = lastTmuxOrderKeysRef.current;
142
- const prevWasTmux = prev.length === lastTmux.length && prev.every((v, i) => v === lastTmux[i]);
143
- const next = prevWasTmux
144
- ? tmuxOrderKeys
145
- : [
146
- ...prev.filter((k) => tmuxOrderKeys.includes(k)),
147
- ...tmuxOrderKeys.filter((k) => !prev.includes(k)),
148
- ];
149
- lastTmuxOrderKeysRef.current = tmuxOrderKeys;
150
- orderedProjectKeysRef.current = next;
151
- if (prev.length === next.length && prev.every((v, i) => v === next[i]))
152
- return prev;
153
- return next;
154
- });
155
- }, [tmuxOrderKeys]);
156
- const selectProjectView = useCallback((windowKey, windowName, view) => {
157
- setSelectedProject(windowKey);
158
- setSelectedProjectView(view);
159
- setSelectedSessionId(null);
160
- setViewMode('windows');
161
- setProjectExpanded({ project: windowName, expanded: true });
162
- }, [setSelectedProject, setSelectedProjectView, setSelectedSessionId, setViewMode, setProjectExpanded]);
163
- useEffect(() => {
164
- if (!selectedProject)
165
- return;
166
- const window = windows.find((w) => getWindowKey(w) === selectedProject);
167
- if (!window)
168
- return;
169
- setProjectExpanded({ project: window.name, expanded: true });
170
- }, [selectedProject, setProjectExpanded, windows, getWindowKey]);
171
- const commitReorder = useCallback(async () => {
172
- const start = orderAtDragStartRef.current;
173
- const end = orderedProjectKeysRef.current;
174
- if (start.length === end.length && start.every((v, i) => v === end[i]))
175
- return;
176
- if (reorderSaving)
177
- return;
178
- const orderIds = [];
179
- for (const key of end) {
180
- const w = windowsByKey.get(key);
181
- if (!w?.id) {
182
- toastError('Reorder requires tmux window ids. Restart `agents web --dev`.');
183
- return;
184
- }
185
- orderIds.push(w.id);
186
- }
187
- setReorderSaving(true);
188
- try {
189
- await api.reorderTmuxWindowsOrder(orderIds);
190
- // Confirm order applied (tmux should be synchronous, but we'll retry briefly).
191
- let refreshed = await api.getState();
192
- for (let attempt = 0; attempt < 2; attempt++) {
193
- const refreshedIds = (refreshed.tmux.windows ?? []).map((w) => w.id);
194
- const matches = refreshedIds.length === orderIds.length &&
195
- refreshedIds.every((id, i) => id === orderIds[i]);
196
- if (matches)
197
- break;
198
- await new Promise((r) => setTimeout(r, 150));
199
- refreshed = await api.getState();
200
- }
201
- const refreshedIds = (refreshed.tmux.windows ?? []).map((w) => w.id);
202
- const matches = refreshedIds.length === orderIds.length &&
203
- refreshedIds.every((id, i) => id === orderIds[i]);
204
- if (!matches)
205
- throw new Error('tmux reorder did not apply');
206
- setState(refreshed);
207
- }
208
- catch {
209
- toastError('Failed to reorder');
210
- // Revert back to current tmux order.
211
- setOrderedProjectKeys(tmuxOrderKeys);
212
- orderedProjectKeysRef.current = tmuxOrderKeys;
213
- lastTmuxOrderKeysRef.current = tmuxOrderKeys;
214
- api.getState().then(setState).catch(() => { });
215
- }
216
- finally {
217
- setReorderSaving(false);
218
- }
219
- }, [setState, windowsByKey, getWindowKey, tmuxOrderKeys, reorderSaving]);
220
- const beginDrag = useCallback((windowKey) => {
221
- orderAtDragStartRef.current = [...orderedProjectKeysRef.current];
222
- frozenWindowsRef.current = windowsRef.current;
223
- setDragDirection(null);
224
- setDraggingProjectKey(windowKey);
225
- }, []);
226
- const endDrag = useCallback(() => {
227
- frozenWindowsRef.current = null;
228
- setDraggingProjectKey(null);
229
- setDragDirection(null);
230
- commitReorder();
231
- }, [commitReorder]);
232
- const scrolledRef = useRef(false);
233
- const handleScroll = useCallback((event) => {
234
- if (!onScrolledChange)
235
- return;
236
- const scrolled = event.currentTarget.scrollTop > 4;
237
- if (scrolled === scrolledRef.current)
238
- return;
239
- scrolledRef.current = scrolled;
240
- onScrolledChange(scrolled);
241
- }, [onScrolledChange]);
242
- if (windows.length === 0) {
243
- return (<div className={cn('flex-1 space-y-0.5 overflow-y-auto p-2', className)}>
244
- <p className="px-2 py-8 text-center text-xs text-foreground-tertiary">
245
- No tmux windows.
246
- </p>
247
- </div>);
248
- }
249
- return (<Reorder.Group axis="y" as="div" values={orderedProjectKeys} onReorder={handleReorder} layoutScroll onScroll={handleScroll} className={cn('flex-1 space-y-0.5 overflow-y-auto p-2', className)}>
250
- {orderedProjectKeys.map((windowKey) => {
251
- const window = windowsByKey.get(windowKey);
252
- if (!window)
253
- return null;
254
- const expanded = expandedProjects[window.name] ?? false;
255
- const menuOpen = openProjectMenu === windowKey;
256
- const label = formatTmuxWindowName(window.name);
257
- const disabled = draggingProjectKey != null && draggingProjectKey !== windowKey;
258
- const projectVisibility = projectItems[window.name];
259
- const terminalVisible = projectVisibility?.terminal ?? DEFAULT_PROJECT_SIDEBAR_ITEMS.terminal;
260
- const filesVisible = projectVisibility?.files ?? DEFAULT_PROJECT_SIDEBAR_ITEMS.files;
261
- const planningVisible = projectVisibility?.planning ?? DEFAULT_PROJECT_SIDEBAR_ITEMS.planning;
262
- return (<ProjectRow key={windowKey} tmuxWindow={window} windowKey={windowKey} label={label} expanded={expanded} terminalVisible={terminalVisible} filesVisible={filesVisible} planningVisible={planningVisible} menuOpen={menuOpen} dragging={draggingProjectKey === windowKey} softLayout={softLayoutActive && draggingProjectKey !== windowKey} disabled={disabled} selected={selectedProject === windowKey} selectedView={selectedProjectView} getProjectEmoji={getProjectEmoji} onSelectView={selectProjectView} onExpandedChange={setProjectExpanded} onOpenMenuChange={setOpenProjectMenu} onDragStart={beginDrag} onDragEnd={endDrag} onDragDirectionChange={setDragDirectionSafe} setSidebarItemEnabled={setProjectSidebarItemEnabled}/>);
263
- })}
264
- </Reorder.Group>);
265
- }
266
- const ProjectRow = memo(function ProjectRow({ tmuxWindow, windowKey, label, expanded, terminalVisible, filesVisible, planningVisible, menuOpen, dragging, softLayout, disabled, selected, selectedView, getProjectEmoji, onSelectView, onExpandedChange, onOpenMenuChange, onDragStart, onDragEnd, onDragDirectionChange, setSidebarItemEnabled, }) {
267
- const dragControls = useDragControls();
268
- const dragStartRef = useRef(null);
269
- const didDragRef = useRef(false);
270
- const lastDragDirectionRef = useRef(null);
271
- const reorderDuration = softLayout ? (expanded ? 0.18 : 0.22) : 0.12;
272
- const handleTriggerPointerDown = useCallback((event) => {
273
- if (event.button !== 0)
274
- return;
275
- didDragRef.current = false;
276
- dragStartRef.current = {
277
- pointerId: event.pointerId,
278
- x: event.clientX,
279
- y: event.clientY,
280
- };
281
- try {
282
- event.currentTarget.setPointerCapture(event.pointerId);
283
- }
284
- catch {
285
- // no-op
286
- }
287
- }, []);
288
- const handleTriggerPointerMove = useCallback((event) => {
289
- const start = dragStartRef.current;
290
- if (!start)
291
- return;
292
- if (start.pointerId !== event.pointerId)
293
- return;
294
- if (didDragRef.current)
295
- return;
296
- const dx = event.clientX - start.x;
297
- const dy = event.clientY - start.y;
298
- if (dx * dx + dy * dy < 16)
299
- return; // 4px threshold
300
- didDragRef.current = true;
301
- dragControls.start(event);
302
- }, [dragControls]);
303
- const handleTriggerPointerUp = useCallback((event) => {
304
- const start = dragStartRef.current;
305
- if (!start)
306
- return;
307
- if (start.pointerId !== event.pointerId)
308
- return;
309
- dragStartRef.current = null;
310
- try {
311
- event.currentTarget.releasePointerCapture(event.pointerId);
312
- }
313
- catch {
314
- // no-op
315
- }
316
- }, []);
317
- const handleTriggerPointerCancel = useCallback(() => {
318
- dragStartRef.current = null;
319
- }, []);
320
- const handleTriggerClickCapture = useCallback((event) => {
321
- if (!didDragRef.current)
322
- return;
323
- event.preventDefault();
324
- event.stopPropagation();
325
- didDragRef.current = false;
326
- }, []);
327
- const projectMenu = (<Menu.Root open={menuOpen} onOpenChange={(open) => onOpenMenuChange(open ? windowKey : null)}>
328
- <Menu.Trigger aria-label="Project actions" className={cn('flex h-7 w-7 items-center justify-center', 'cursor-pointer rounded-md outline-none', 'transition-opacity duration-100', '[transition-timing-function:cubic-bezier(0.32,0.72,0,1)]', dragging
329
- ? 'pointer-events-none opacity-0'
330
- : menuOpen
331
- ? 'text-foreground'
332
- : 'text-foreground-quaternary hover:text-foreground-secondary')} onClick={(e) => e.stopPropagation()} onPointerDown={(e) => e.stopPropagation()}>
333
- <EllipsisHorizontalIcon className="h-4 w-4"/>
334
- </Menu.Trigger>
335
- <Menu.Portal>
336
- <Menu.Positioner sideOffset={8} align="end">
337
- <Menu.Popup className={cn('z-50 min-w-[200px] rounded-xl p-1', 'bg-card border border-border shadow-xl', 'outline-none', 'origin-[var(--transform-origin)]', 'transition-[transform,opacity] duration-150', '[transition-timing-function:cubic-bezier(0.32,0.72,0,1)]', 'data-[starting-style]:scale-[0.96] data-[starting-style]:opacity-0', 'data-[ending-style]:scale-[0.96] data-[ending-style]:opacity-0')}>
338
- <HoverProvider>
339
- {/* Primary actions */}
340
- <Menu.Group>
341
- <StickyMenuItem onClick={() => onSelectView(windowKey, tmuxWindow.name, 'terminal')}>
342
- <CubeTransparentIcon className="h-4 w-4 stroke-[1.75]"/>
343
- Open terminal
344
- </StickyMenuItem>
345
-
346
- <StickyMenuItem onClick={() => onSelectView(windowKey, tmuxWindow.name, 'files')}>
347
- <Squares2X2Icon className="h-4 w-4 stroke-[1.75]"/>
348
- Open files
349
- </StickyMenuItem>
350
-
351
- <StickyMenuItem onClick={() => onSelectView(windowKey, tmuxWindow.name, 'planning')}>
352
- <Bars3BottomLeftIcon className="h-4 w-4 stroke-[1.75]"/>
353
- Open planning
354
- </StickyMenuItem>
355
- </Menu.Group>
356
-
357
- <Menu.Separator className="my-1 h-px bg-border/50"/>
358
-
359
- {/* External actions */}
360
- <Menu.Group>
361
- <StickyMenuItem onClick={async () => {
362
- try {
363
- const { panes } = await api.getTmuxPanes(tmuxWindow.id || windowKey);
364
- const path = panes.find((p) => p.active)?.currentPath ?? panes[0]?.currentPath;
365
- if (!path)
366
- return;
367
- // Open in Finder using the native API
368
- globalThis.window.open(`file://${path}`, '_blank');
369
- }
370
- catch {
371
- toastError('Failed to open in Finder');
372
- }
373
- }}>
374
- <FolderOpenIcon className="h-4 w-4 stroke-[1.75]"/>
375
- Open in Finder
376
- </StickyMenuItem>
377
-
378
- <StickyMenuItem onClick={async () => {
379
- try {
380
- const { panes } = await api.getTmuxPanes(tmuxWindow.id || windowKey);
381
- const path = panes.find((p) => p.active)?.currentPath ?? panes[0]?.currentPath;
382
- if (!path)
383
- return;
384
- // Uses VSCode's URL scheme
385
- globalThis.window.open(`vscode://file/${path}`, '_blank');
386
- }
387
- catch {
388
- toastError('Failed to open in VS Code');
389
- }
390
- }}>
391
- <CodeBracketIcon className="h-4 w-4 stroke-[1.75]"/>
392
- Open in VS Code
393
- </StickyMenuItem>
394
-
395
- <StickyMenuItem onClick={async () => {
396
- try {
397
- const { panes } = await api.getTmuxPanes(tmuxWindow.id || windowKey);
398
- const path = panes.find((p) => p.active)?.currentPath ?? panes[0]?.currentPath;
399
- if (!path)
400
- return;
401
- await navigator.clipboard.writeText(path);
402
- toastSuccess('Copied path');
403
- }
404
- catch {
405
- toastError('Failed to copy path');
406
- }
407
- }}>
408
- <ClipboardIcon className="h-4 w-4 stroke-[1.75]"/>
409
- Copy path
410
- </StickyMenuItem>
411
- </Menu.Group>
412
-
413
- <Menu.Separator className="my-1 h-px bg-border/50"/>
414
-
415
- {/* View options submenu */}
416
- <Menu.SubmenuRoot>
417
- <StickySubmenuTrigger>
418
- <span className="flex items-center gap-2.5">
419
- <EyeIcon className="h-4 w-4 stroke-[1.75]"/>
420
- Sidebar views
421
- </span>
422
- <ChevronRightIcon className="h-3.5 w-3.5 text-foreground-quaternary"/>
423
- </StickySubmenuTrigger>
424
- <Menu.Portal>
425
- <Menu.Positioner sideOffset={2} alignOffset={-4}>
426
- <Menu.Popup className={cn('z-50 min-w-[200px] rounded-xl p-1', 'bg-card border border-border shadow-xl', 'outline-none', 'origin-[var(--transform-origin)]', 'transition-[transform,opacity] duration-150', '[transition-timing-function:cubic-bezier(0.32,0.72,0,1)]', 'data-[starting-style]:scale-[0.96] data-[starting-style]:opacity-0', 'data-[ending-style]:scale-[0.96] data-[ending-style]:opacity-0')}>
427
- <HoverProvider>
428
- <StickyCheckboxItem checked={filesVisible} onCheckedChange={(checked) => setSidebarItemEnabled({ project: tmuxWindow.name, item: 'files', enabled: checked })}>
429
- <span className="flex items-center gap-2.5">
430
- <Squares2X2Icon className="h-4 w-4 stroke-[1.75]"/>
431
- Files
432
- </span>
433
- <Menu.CheckboxItemIndicator className="text-foreground-secondary">
434
- <CheckIcon className="h-3.5 w-3.5 stroke-[2]"/>
435
- </Menu.CheckboxItemIndicator>
436
- </StickyCheckboxItem>
437
-
438
- <StickyCheckboxItem checked={terminalVisible} onCheckedChange={(checked) => setSidebarItemEnabled({ project: tmuxWindow.name, item: 'terminal', enabled: checked })}>
439
- <span className="flex items-center gap-2.5">
440
- <CubeTransparentIcon className="h-4 w-4 stroke-[1.75]"/>
441
- Terminal
442
- </span>
443
- <Menu.CheckboxItemIndicator className="text-foreground-secondary">
444
- <CheckIcon className="h-3.5 w-3.5 stroke-[2]"/>
445
- </Menu.CheckboxItemIndicator>
446
- </StickyCheckboxItem>
447
-
448
- <StickyCheckboxItem checked={planningVisible} onCheckedChange={(checked) => setSidebarItemEnabled({ project: tmuxWindow.name, item: 'planning', enabled: checked })}>
449
- <span className="flex items-center gap-2.5">
450
- <Bars3BottomLeftIcon className="h-4 w-4 stroke-[1.75]"/>
451
- Planning
452
- </span>
453
- <Menu.CheckboxItemIndicator className="text-foreground-secondary">
454
- <CheckIcon className="h-3.5 w-3.5 stroke-[2]"/>
455
- </Menu.CheckboxItemIndicator>
456
- </StickyCheckboxItem>
457
- </HoverProvider>
458
- </Menu.Popup>
459
- </Menu.Positioner>
460
- </Menu.Portal>
461
- </Menu.SubmenuRoot>
462
- </HoverProvider>
463
- </Menu.Popup>
464
- </Menu.Positioner>
465
- </Menu.Portal>
466
- </Menu.Root>);
467
- return (<Reorder.Item as="div" value={windowKey} drag="y" dragControls={dragControls} dragListener={false} layout="position" onDragStart={() => {
468
- lastDragDirectionRef.current = null;
469
- onOpenMenuChange(null);
470
- onDragStart(windowKey);
471
- }} onDragEnd={() => {
472
- lastDragDirectionRef.current = null;
473
- onDragEnd();
474
- }} onDrag={(_event, info) => {
475
- if (!dragging)
476
- return;
477
- if (Math.abs(info.offset.y) < 2)
478
- return;
479
- const direction = info.offset.y < 0 ? 'up' : 'down';
480
- if (direction === lastDragDirectionRef.current)
481
- return;
482
- lastDragDirectionRef.current = direction;
483
- onDragDirectionChange(direction);
484
- }} whileDrag={{ scale: 1.005 }} dragMomentum={false} dragElastic={0.02} transition={{ duration: reorderDuration, ease: [0.32, 0.72, 0, 1] }} className={cn('relative rounded-[10px] will-change-transform', disabled && 'pointer-events-none')}>
485
- <NavGroup label={label} dragging={dragging} leading={<span aria-label="Reorder project" className={cn('flex w-4 shrink-0 items-center justify-center', 'cursor-move', 'text-foreground-quaternary', 'transition-opacity duration-100', '[transition-timing-function:cubic-bezier(0.32,0.72,0,1)]', dragging ? 'opacity-0' : menuOpen ? 'opacity-100' : 'opacity-60 group-hover:opacity-100')}>
486
- <Bars2Icon className="h-3.5 w-3.5"/>
487
- </span>} icon={getProjectEmoji(tmuxWindow.name)} expanded={expanded} onExpandedChange={(next) => onExpandedChange({ project: tmuxWindow.name, expanded: next })} triggerProps={{
488
- onPointerDown: handleTriggerPointerDown,
489
- onPointerMove: handleTriggerPointerMove,
490
- onPointerUp: handleTriggerPointerUp,
491
- onPointerCancel: handleTriggerPointerCancel,
492
- onClickCapture: handleTriggerClickCapture,
493
- }} actions={projectMenu} actionsVisible={menuOpen} className={cn(dragging && 'pointer-events-none')}>
494
- <div className="space-y-0.5" onPointerDown={(e) => e.stopPropagation()} onPointerDownCapture={(e) => e.stopPropagation()}>
495
- {filesVisible && (<NavItem label="Files" icon={<Squares2X2Icon className="h-4 w-4 stroke-[1.75]"/>} selected={selected && selectedView === 'files'} onClick={() => onSelectView(windowKey, tmuxWindow.name, 'files')}/>)}
496
-
497
- {terminalVisible && (<NavItem label="Terminal" icon={<CubeTransparentIcon className="h-4 w-4 stroke-[1.75]"/>} selected={selected && selectedView === 'terminal'} shortcut={typeof tmuxWindow.index === 'number' && tmuxWindow.index >= 0 && tmuxWindow.index < 9
498
- ? ['G', String(tmuxWindow.index + 1)]
499
- : undefined} onClick={() => onSelectView(windowKey, tmuxWindow.name, 'terminal')}/>)}
500
-
501
- {planningVisible && (<NavItem label="Planning" icon={<Bars3BottomLeftIcon className="h-4 w-4 stroke-[1.75]"/>} selected={selected && selectedView === 'planning'} onClick={() => onSelectView(windowKey, tmuxWindow.name, 'planning')}/>)}
502
- </div>
503
- </NavGroup>
504
- </Reorder.Item>);
505
- });
@@ -1,7 +0,0 @@
1
- /**
2
- * Search button that opens the command palette.
3
- * Pill button styled to match Share/Actions buttons.
4
- */
5
- export declare function SidebarSearch({ dividerVisible }: {
6
- dividerVisible?: boolean;
7
- }): any;
@@ -1,18 +0,0 @@
1
- 'use client';
2
- import { useSetAtom } from 'jotai';
3
- import { MagnifyingGlassIcon } from '@heroicons/react/24/outline';
4
- import { commandPaletteOpenAtom } from '@/atoms/state';
5
- import { cn } from '@/lib/utils';
6
- /**
7
- * Search button that opens the command palette.
8
- * Pill button styled to match Share/Actions buttons.
9
- */
10
- export function SidebarSearch({ dividerVisible }) {
11
- const setCommandPaletteOpen = useSetAtom(commandPaletteOpenAtom);
12
- return (<div className={cn('flex h-12 items-center px-2', dividerVisible && 'border-b border-border/60')}>
13
- <button onClick={() => setCommandPaletteOpen(true)} className={cn('flex items-center gap-1.5 rounded-full px-3 py-1.5 text-xs font-medium', 'outline-none transition-colors', 'bg-background-secondary text-foreground-secondary', 'hover:bg-background-tertiary hover:text-foreground')}>
14
- <MagnifyingGlassIcon className="h-3.5 w-3.5"/>
15
- <span>Search</span>
16
- </button>
17
- </div>);
18
- }
@@ -1,4 +0,0 @@
1
- /**
2
- * Settings navigation view (Vercel drill-down pattern).
3
- */
4
- export declare function SidebarSettings(): any;
@@ -1,28 +0,0 @@
1
- 'use client';
2
- import Link from 'next/link';
3
- import { useTheme } from 'next-themes';
4
- import { AdjustmentsHorizontalIcon, CommandLineIcon, InformationCircleIcon, SunIcon, MoonIcon, } from '@heroicons/react/24/outline';
5
- import { NavItem } from './nav-item';
6
- const SETTINGS_ITEMS = [
7
- { id: 'general', label: 'General', Icon: AdjustmentsHorizontalIcon, href: '/settings' },
8
- { id: 'shortcuts', label: 'Keyboard shortcuts', Icon: CommandLineIcon, href: '/shortcuts' },
9
- { id: 'about', label: 'About', Icon: InformationCircleIcon, href: '/about' },
10
- ];
11
- /**
12
- * Settings navigation view (Vercel drill-down pattern).
13
- */
14
- export function SidebarSettings() {
15
- const { theme, setTheme } = useTheme();
16
- const isDark = theme === 'dark';
17
- const toggleTheme = () => {
18
- setTheme(isDark ? 'light' : 'dark');
19
- };
20
- return (<div className="space-y-0.5 p-2">
21
- {SETTINGS_ITEMS.map((item) => (<Link key={item.id} href={item.href}>
22
- <NavItem label={item.label} icon={<item.Icon className="h-4 w-4 stroke-[1.75]"/>}/>
23
- </Link>))}
24
-
25
- {/* Theme toggle */}
26
- <NavItem label={isDark ? 'Light mode' : 'Dark mode'} icon={isDark ? <SunIcon className="h-4 w-4 stroke-[1.75]"/> : <MoonIcon className="h-4 w-4 stroke-[1.75]"/>} onClick={toggleTheme}/>
27
- </div>);
28
- }
@@ -1,12 +0,0 @@
1
- interface SidebarTransitionProps {
2
- className?: string;
3
- }
4
- /**
5
- * Animated container for sidebar view transitions using motion.
6
- * Renders the appropriate view content and handles smooth transitions.
7
- *
8
- * Forward (drill in): main exits left, settings enters from right
9
- * Back (drill out): settings exits right, main enters from left
10
- */
11
- export declare function SidebarTransition({ className }: SidebarTransitionProps): any;
12
- export {};
@@ -1,58 +0,0 @@
1
- 'use client';
2
- import { useEffect, useState } from 'react';
3
- import { useAtomValue, useSetAtom } from 'jotai';
4
- import { motion, AnimatePresence } from 'motion/react';
5
- import { Cog6ToothIcon } from '@heroicons/react/24/outline';
6
- import { sidebarViewAtom, navigationDirectionAtom, pushViewAtom } from '@/atoms/sidebar';
7
- import { cn } from '@/lib/utils';
8
- import { SidebarHeader } from './sidebar-header';
9
- import { SidebarSearch } from './sidebar-search';
10
- import { SidebarNav } from './sidebar-nav';
11
- import { SidebarSettings } from './sidebar-settings';
12
- import { NavItem } from './nav-item';
13
- const TRANSITION_DURATION = 0.25;
14
- const EASE = [0.32, 0.72, 0, 1];
15
- // Separate components to ensure AnimatePresence can properly track them
16
- function MainView({ navScrolled, onNavScrolledChange, onNavigate, }) {
17
- return (<>
18
- <SidebarSearch dividerVisible={navScrolled}/>
19
- <SidebarNav className="flex-1" onScrolledChange={onNavScrolledChange}/>
20
- <div className="border-t border-border px-2 py-2">
21
- <NavItem label="Settings" icon={<Cog6ToothIcon className="h-4 w-4 stroke-[1.75]"/>} shortcut={['G', 'S']} onClick={onNavigate}/>
22
- </div>
23
- </>);
24
- }
25
- function SettingsView() {
26
- return (<>
27
- <SidebarHeader title="Settings"/>
28
- <div className="flex-1 overflow-y-auto">
29
- <SidebarSettings />
30
- </div>
31
- </>);
32
- }
33
- /**
34
- * Animated container for sidebar view transitions using motion.
35
- * Renders the appropriate view content and handles smooth transitions.
36
- *
37
- * Forward (drill in): main exits left, settings enters from right
38
- * Back (drill out): settings exits right, main enters from left
39
- */
40
- export function SidebarTransition({ className }) {
41
- const view = useAtomValue(sidebarViewAtom);
42
- const direction = useAtomValue(navigationDirectionAtom);
43
- const pushView = useSetAtom(pushViewAtom);
44
- const [navScrolled, setNavScrolled] = useState(false);
45
- useEffect(() => {
46
- if (view !== 'main')
47
- setNavScrolled(false);
48
- }, [view]);
49
- return (<div className={cn('relative flex-1 overflow-hidden', className)}>
50
- <AnimatePresence mode="popLayout" initial={false} custom={direction}>
51
- {view === 'main' ? (<motion.div key="main" custom={direction} initial={{ opacity: 0, x: -16, filter: 'blur(6px)' }} animate={{ opacity: 1, x: 0, filter: 'blur(0px)' }} exit={{ opacity: 0, x: -16, filter: 'blur(6px)' }} transition={{ duration: TRANSITION_DURATION, ease: EASE }} className="absolute inset-0 flex flex-col">
52
- <MainView navScrolled={navScrolled} onNavScrolledChange={setNavScrolled} onNavigate={() => pushView('settings')}/>
53
- </motion.div>) : (<motion.div key="settings" custom={direction} initial={{ opacity: 0, x: 16, filter: 'blur(6px)' }} animate={{ opacity: 1, x: 0, filter: 'blur(0px)' }} exit={{ opacity: 0, x: 16, filter: 'blur(6px)' }} transition={{ duration: TRANSITION_DURATION, ease: EASE }} className="absolute inset-0 flex flex-col">
54
- <SettingsView />
55
- </motion.div>)}
56
- </AnimatePresence>
57
- </div>);
58
- }
@@ -1 +0,0 @@
1
- export declare function StatusBar(): any;