orbital-command 0.2.0 → 1.0.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 (431) hide show
  1. package/README.md +67 -42
  2. package/bin/commands/config.js +19 -0
  3. package/bin/commands/events.js +40 -0
  4. package/bin/commands/launch.js +126 -0
  5. package/bin/commands/manifest.js +283 -0
  6. package/bin/commands/registry.js +104 -0
  7. package/bin/commands/update.js +24 -0
  8. package/bin/lib/helpers.js +229 -0
  9. package/bin/orbital.js +147 -319
  10. package/dist/assets/Landing-CfQdHR0N.js +11 -0
  11. package/dist/assets/PrimitivesConfig-DThSipFy.js +32 -0
  12. package/dist/assets/QualityGates-B4kxM5UU.js +26 -0
  13. package/dist/assets/SessionTimeline-Bz1iZnmg.js +1 -0
  14. package/dist/assets/Settings-DLcZwbCT.js +12 -0
  15. package/dist/assets/SourceControl-BMNIz7Lt.js +36 -0
  16. package/dist/assets/WorkflowVisualizer-CxuSBOYu.js +69 -0
  17. package/dist/assets/arrow-down-DVPp6_qp.js +6 -0
  18. package/dist/assets/bot-NFaJBDn_.js +6 -0
  19. package/dist/assets/charts-LGLb8hyU.js +68 -0
  20. package/dist/assets/circle-x-IsFCkBZu.js +6 -0
  21. package/dist/assets/file-text-J1cebZXF.js +6 -0
  22. package/dist/assets/globe-WzeyHsUc.js +6 -0
  23. package/dist/assets/index-BdJ57EhC.css +1 -0
  24. package/dist/assets/index-o4ScMAuR.js +349 -0
  25. package/dist/assets/key-CKR8JJSj.js +6 -0
  26. package/dist/assets/minus-CHBsJyjp.js +6 -0
  27. package/dist/assets/radio-xqZaR-Uk.js +6 -0
  28. package/dist/assets/rocket-D_xvvNG6.js +6 -0
  29. package/dist/assets/shield-TdB1yv_a.js +6 -0
  30. package/dist/assets/ui-BmsSg9jU.js +53 -0
  31. package/dist/assets/useSocketListener-0L5yiN5i.js +1 -0
  32. package/dist/assets/useWorkflowEditor-CqeRWVQX.js +11 -0
  33. package/dist/assets/{vendor-Dzv9lrRc.js → vendor-Bqt8AJn2.js} +1 -1
  34. package/dist/assets/workflow-constants-Rw-GmgHZ.js +6 -0
  35. package/dist/assets/zap-C9wqYMpl.js +6 -0
  36. package/dist/favicon.svg +1 -0
  37. package/dist/index.html +6 -5
  38. package/dist/server/server/__tests__/data-routes.test.js +126 -0
  39. package/dist/server/server/__tests__/helpers/db.js +17 -0
  40. package/dist/server/server/__tests__/helpers/mock-emitter.js +8 -0
  41. package/dist/server/server/__tests__/scope-routes.test.js +138 -0
  42. package/dist/server/server/__tests__/sprint-routes.test.js +102 -0
  43. package/dist/server/server/__tests__/workflow-routes.test.js +107 -0
  44. package/dist/server/server/config-migrator.js +135 -0
  45. package/dist/server/server/config.js +51 -7
  46. package/dist/server/server/database.js +21 -28
  47. package/dist/server/server/global-config.js +143 -0
  48. package/dist/server/server/index.js +118 -276
  49. package/dist/server/server/init.js +243 -225
  50. package/dist/server/server/launch.js +29 -0
  51. package/dist/server/server/manifest-types.js +8 -0
  52. package/dist/server/server/manifest.js +454 -0
  53. package/dist/server/server/migrate-legacy.js +229 -0
  54. package/dist/server/server/parsers/event-parser.js +4 -1
  55. package/dist/server/server/parsers/event-parser.test.js +117 -0
  56. package/dist/server/server/parsers/scope-parser.js +74 -28
  57. package/dist/server/server/parsers/scope-parser.test.js +230 -0
  58. package/dist/server/server/project-context.js +265 -0
  59. package/dist/server/server/project-emitter.js +41 -0
  60. package/dist/server/server/project-manager.js +297 -0
  61. package/dist/server/server/routes/aggregate-routes.js +871 -0
  62. package/dist/server/server/routes/config-routes.js +41 -90
  63. package/dist/server/server/routes/data-routes.js +25 -123
  64. package/dist/server/server/routes/dispatch-routes.js +37 -15
  65. package/dist/server/server/routes/git-routes.js +74 -0
  66. package/dist/server/server/routes/manifest-routes.js +319 -0
  67. package/dist/server/server/routes/scope-routes.js +45 -28
  68. package/dist/server/server/routes/sync-routes.js +134 -0
  69. package/dist/server/server/routes/version-routes.js +1 -15
  70. package/dist/server/server/routes/workflow-routes.js +9 -3
  71. package/dist/server/server/schema.js +3 -0
  72. package/dist/server/server/services/batch-orchestrator.js +41 -17
  73. package/dist/server/server/services/claude-session-service.js +17 -14
  74. package/dist/server/server/services/config-service.js +10 -1
  75. package/dist/server/server/services/deploy-service.test.js +119 -0
  76. package/dist/server/server/services/event-service.js +64 -1
  77. package/dist/server/server/services/event-service.test.js +191 -0
  78. package/dist/server/server/services/gate-service.test.js +105 -0
  79. package/dist/server/server/services/git-service.js +108 -4
  80. package/dist/server/server/services/github-service.js +110 -2
  81. package/dist/server/server/services/readiness-service.test.js +190 -0
  82. package/dist/server/server/services/scope-cache.js +5 -1
  83. package/dist/server/server/services/scope-cache.test.js +142 -0
  84. package/dist/server/server/services/scope-service.js +222 -131
  85. package/dist/server/server/services/scope-service.test.js +137 -0
  86. package/dist/server/server/services/sprint-orchestrator.js +29 -15
  87. package/dist/server/server/services/sprint-service.js +23 -3
  88. package/dist/server/server/services/sprint-service.test.js +238 -0
  89. package/dist/server/server/services/sync-service.js +434 -0
  90. package/dist/server/server/services/sync-types.js +2 -0
  91. package/dist/server/server/services/workflow-service.js +26 -5
  92. package/dist/server/server/services/workflow-service.test.js +159 -0
  93. package/dist/server/server/settings-sync.js +284 -0
  94. package/dist/server/server/uninstall.js +195 -0
  95. package/dist/server/server/update-planner.js +279 -0
  96. package/dist/server/server/update.js +212 -0
  97. package/dist/server/server/utils/cc-hooks-parser.js +3 -0
  98. package/dist/server/server/utils/cc-hooks-parser.test.js +86 -0
  99. package/dist/server/server/utils/dispatch-utils.js +83 -24
  100. package/dist/server/server/utils/dispatch-utils.test.js +182 -0
  101. package/dist/server/server/utils/flag-builder.js +54 -0
  102. package/dist/server/server/utils/json-fields.js +14 -0
  103. package/dist/server/server/utils/json-fields.test.js +73 -0
  104. package/dist/server/server/utils/logger.js +37 -3
  105. package/dist/server/server/utils/package-info.js +30 -0
  106. package/dist/server/server/utils/route-helpers.js +47 -0
  107. package/dist/server/server/utils/route-helpers.test.js +115 -0
  108. package/dist/server/server/utils/terminal-launcher.js +79 -25
  109. package/dist/server/server/utils/worktree-manager.js +13 -4
  110. package/dist/server/server/validator.js +230 -0
  111. package/dist/server/server/watchers/event-watcher.js +28 -13
  112. package/dist/server/server/watchers/global-watcher.js +63 -0
  113. package/dist/server/server/watchers/scope-watcher.js +27 -12
  114. package/dist/server/server/wizard/config-editor.js +237 -0
  115. package/dist/server/server/wizard/detect.js +96 -0
  116. package/dist/server/server/wizard/doctor.js +115 -0
  117. package/dist/server/server/wizard/index.js +340 -0
  118. package/dist/server/server/wizard/phases/confirm.js +39 -0
  119. package/dist/server/server/wizard/phases/project-setup.js +90 -0
  120. package/dist/server/server/wizard/phases/setup-wizard.js +66 -0
  121. package/dist/server/server/wizard/phases/welcome.js +32 -0
  122. package/dist/server/server/wizard/phases/workflow-setup.js +22 -0
  123. package/dist/server/server/wizard/types.js +29 -0
  124. package/dist/server/server/wizard/ui.js +73 -0
  125. package/dist/server/shared/__fixtures__/workflow-configs.js +75 -0
  126. package/dist/server/shared/api-types.js +80 -1
  127. package/dist/server/shared/default-workflow.json +65 -0
  128. package/dist/server/shared/onboarding-tour.test.js +81 -0
  129. package/dist/server/shared/project-colors.js +24 -0
  130. package/dist/server/shared/workflow-config.test.js +84 -0
  131. package/dist/server/shared/workflow-engine.js +1 -1
  132. package/dist/server/shared/workflow-engine.test.js +302 -0
  133. package/dist/server/shared/workflow-normalizer.js +101 -0
  134. package/dist/server/shared/workflow-normalizer.test.js +100 -0
  135. package/dist/server/src/components/onboarding/tour-steps.js +84 -0
  136. package/package.json +34 -29
  137. package/schemas/orbital.config.schema.json +2 -5
  138. package/scripts/postinstall.js +18 -6
  139. package/scripts/release.sh +53 -0
  140. package/server/__tests__/data-routes.test.ts +151 -0
  141. package/server/__tests__/helpers/db.ts +19 -0
  142. package/server/__tests__/helpers/mock-emitter.ts +10 -0
  143. package/server/__tests__/scope-routes.test.ts +158 -0
  144. package/server/__tests__/sprint-routes.test.ts +118 -0
  145. package/server/__tests__/workflow-routes.test.ts +120 -0
  146. package/server/config-migrator.ts +160 -0
  147. package/server/config.ts +64 -12
  148. package/server/database.ts +22 -31
  149. package/server/global-config.ts +204 -0
  150. package/server/index.ts +139 -316
  151. package/server/init.ts +266 -234
  152. package/server/launch.ts +32 -0
  153. package/server/manifest-types.ts +145 -0
  154. package/server/manifest.ts +494 -0
  155. package/server/migrate-legacy.ts +290 -0
  156. package/server/parsers/event-parser.test.ts +135 -0
  157. package/server/parsers/event-parser.ts +4 -1
  158. package/server/parsers/scope-parser.test.ts +270 -0
  159. package/server/parsers/scope-parser.ts +79 -31
  160. package/server/project-context.ts +325 -0
  161. package/server/project-emitter.ts +50 -0
  162. package/server/project-manager.ts +368 -0
  163. package/server/routes/aggregate-routes.ts +968 -0
  164. package/server/routes/config-routes.ts +43 -85
  165. package/server/routes/data-routes.ts +34 -156
  166. package/server/routes/dispatch-routes.ts +46 -17
  167. package/server/routes/git-routes.ts +77 -0
  168. package/server/routes/manifest-routes.ts +388 -0
  169. package/server/routes/scope-routes.ts +39 -30
  170. package/server/routes/sync-routes.ts +175 -0
  171. package/server/routes/version-routes.ts +1 -16
  172. package/server/routes/workflow-routes.ts +9 -3
  173. package/server/schema.ts +3 -0
  174. package/server/services/batch-orchestrator.ts +41 -17
  175. package/server/services/claude-session-service.ts +16 -14
  176. package/server/services/config-service.ts +10 -1
  177. package/server/services/deploy-service.test.ts +145 -0
  178. package/server/services/deploy-service.ts +2 -2
  179. package/server/services/event-service.test.ts +242 -0
  180. package/server/services/event-service.ts +92 -3
  181. package/server/services/gate-service.test.ts +131 -0
  182. package/server/services/gate-service.ts +2 -2
  183. package/server/services/git-service.ts +137 -4
  184. package/server/services/github-service.ts +120 -2
  185. package/server/services/readiness-service.test.ts +217 -0
  186. package/server/services/scope-cache.test.ts +167 -0
  187. package/server/services/scope-cache.ts +4 -1
  188. package/server/services/scope-service.test.ts +169 -0
  189. package/server/services/scope-service.ts +224 -130
  190. package/server/services/sprint-orchestrator.ts +30 -15
  191. package/server/services/sprint-service.test.ts +271 -0
  192. package/server/services/sprint-service.ts +29 -5
  193. package/server/services/sync-service.ts +482 -0
  194. package/server/services/sync-types.ts +77 -0
  195. package/server/services/workflow-service.test.ts +190 -0
  196. package/server/services/workflow-service.ts +29 -9
  197. package/server/settings-sync.ts +359 -0
  198. package/server/uninstall.ts +214 -0
  199. package/server/update-planner.ts +346 -0
  200. package/server/update.ts +263 -0
  201. package/server/utils/cc-hooks-parser.test.ts +96 -0
  202. package/server/utils/cc-hooks-parser.ts +4 -0
  203. package/server/utils/dispatch-utils.test.ts +245 -0
  204. package/server/utils/dispatch-utils.ts +102 -30
  205. package/server/utils/flag-builder.ts +56 -0
  206. package/server/utils/json-fields.test.ts +83 -0
  207. package/server/utils/json-fields.ts +14 -0
  208. package/server/utils/logger.ts +40 -3
  209. package/server/utils/package-info.ts +32 -0
  210. package/server/utils/route-helpers.test.ts +144 -0
  211. package/server/utils/route-helpers.ts +50 -0
  212. package/server/utils/terminal-launcher.ts +85 -25
  213. package/server/utils/worktree-manager.ts +9 -4
  214. package/server/validator.ts +270 -0
  215. package/server/watchers/event-watcher.ts +24 -12
  216. package/server/watchers/global-watcher.ts +77 -0
  217. package/server/watchers/scope-watcher.ts +21 -9
  218. package/server/wizard/config-editor.ts +248 -0
  219. package/server/wizard/detect.ts +104 -0
  220. package/server/wizard/doctor.ts +114 -0
  221. package/server/wizard/index.ts +438 -0
  222. package/server/wizard/phases/confirm.ts +45 -0
  223. package/server/wizard/phases/project-setup.ts +106 -0
  224. package/server/wizard/phases/setup-wizard.ts +78 -0
  225. package/server/wizard/phases/welcome.ts +39 -0
  226. package/server/wizard/phases/workflow-setup.ts +28 -0
  227. package/server/wizard/types.ts +56 -0
  228. package/server/wizard/ui.ts +92 -0
  229. package/shared/__fixtures__/workflow-configs.ts +80 -0
  230. package/shared/api-types.ts +106 -0
  231. package/shared/onboarding-tour.test.ts +94 -0
  232. package/shared/project-colors.ts +24 -0
  233. package/shared/workflow-config.test.ts +111 -0
  234. package/shared/workflow-config.ts +7 -0
  235. package/shared/workflow-engine.test.ts +388 -0
  236. package/shared/workflow-engine.ts +1 -1
  237. package/shared/workflow-normalizer.test.ts +119 -0
  238. package/shared/workflow-normalizer.ts +118 -0
  239. package/templates/agents/QUICK-REFERENCE.md +1 -0
  240. package/templates/agents/README.md +1 -0
  241. package/templates/agents/SKILL-TRIGGERS.md +11 -0
  242. package/templates/agents/green-team/deep-dive.md +361 -0
  243. package/templates/hooks/end-session.sh +4 -1
  244. package/templates/hooks/init-session.sh +1 -0
  245. package/templates/hooks/orbital-emit.sh +2 -2
  246. package/templates/hooks/orbital-report-deploy.sh +4 -4
  247. package/templates/hooks/orbital-report-gates.sh +4 -4
  248. package/templates/hooks/orbital-scope-update.sh +1 -1
  249. package/templates/hooks/scope-commit-logger.sh +2 -2
  250. package/templates/hooks/scope-create-cleanup.sh +2 -2
  251. package/templates/hooks/scope-create-gate.sh +2 -5
  252. package/templates/hooks/scope-gate.sh +4 -6
  253. package/templates/hooks/scope-helpers.sh +28 -1
  254. package/templates/hooks/scope-lifecycle-gate.sh +14 -5
  255. package/templates/hooks/scope-prepare.sh +67 -12
  256. package/templates/hooks/scope-transition.sh +14 -6
  257. package/templates/hooks/time-tracker.sh +2 -5
  258. package/templates/migrations/renames.json +1 -0
  259. package/templates/orbital.config.json +8 -6
  260. package/{shared/default-workflow.json → templates/presets/default.json} +65 -0
  261. package/templates/presets/development.json +4 -4
  262. package/templates/presets/gitflow.json +7 -0
  263. package/templates/prompts/README.md +23 -0
  264. package/templates/prompts/deep-dive-audit.md +94 -0
  265. package/templates/quick/rules.md +56 -5
  266. package/templates/settings-hooks.json +1 -1
  267. package/templates/skills/git-commit/SKILL.md +27 -7
  268. package/templates/skills/git-dev/SKILL.md +13 -4
  269. package/templates/skills/git-main/SKILL.md +13 -3
  270. package/templates/skills/git-production/SKILL.md +9 -2
  271. package/templates/skills/git-staging/SKILL.md +11 -3
  272. package/templates/skills/scope-create/SKILL.md +17 -3
  273. package/templates/skills/scope-fix-review/SKILL.md +14 -7
  274. package/templates/skills/scope-implement/SKILL.md +15 -4
  275. package/templates/skills/scope-post-review/SKILL.md +77 -7
  276. package/templates/skills/scope-pre-review/SKILL.md +11 -4
  277. package/templates/skills/scope-verify/SKILL.md +5 -3
  278. package/templates/skills/test-code-review/SKILL.md +41 -33
  279. package/templates/skills/test-scaffold/SKILL.md +222 -0
  280. package/dist/assets/WorkflowVisualizer-BZ21PIIF.js +0 -84
  281. package/dist/assets/charts-D__PA1zp.js +0 -72
  282. package/dist/assets/index-D1G6i0nS.css +0 -1
  283. package/dist/assets/index-DpItvKpf.js +0 -419
  284. package/dist/assets/ui-BvF022GT.js +0 -53
  285. package/index.html +0 -15
  286. package/postcss.config.js +0 -6
  287. package/src/App.tsx +0 -33
  288. package/src/components/AgentBadge.tsx +0 -40
  289. package/src/components/BatchPreflightModal.tsx +0 -115
  290. package/src/components/CardDisplayToggle.tsx +0 -74
  291. package/src/components/ColumnHeaderActions.tsx +0 -55
  292. package/src/components/ColumnMenu.tsx +0 -99
  293. package/src/components/DeployHistory.tsx +0 -141
  294. package/src/components/DispatchModal.tsx +0 -164
  295. package/src/components/DispatchPopover.tsx +0 -139
  296. package/src/components/DragOverlay.tsx +0 -25
  297. package/src/components/DriftSidebar.tsx +0 -140
  298. package/src/components/EnvironmentStrip.tsx +0 -88
  299. package/src/components/ErrorBoundary.tsx +0 -62
  300. package/src/components/FilterChip.tsx +0 -105
  301. package/src/components/GateIndicator.tsx +0 -33
  302. package/src/components/IdeaDetailModal.tsx +0 -190
  303. package/src/components/IdeaFormDialog.tsx +0 -113
  304. package/src/components/KanbanColumn.tsx +0 -201
  305. package/src/components/MarkdownRenderer.tsx +0 -114
  306. package/src/components/NeonGrid.tsx +0 -128
  307. package/src/components/PromotionQueue.tsx +0 -89
  308. package/src/components/ScopeCard.tsx +0 -234
  309. package/src/components/ScopeDetailModal.tsx +0 -255
  310. package/src/components/ScopeFilterBar.tsx +0 -152
  311. package/src/components/SearchInput.tsx +0 -102
  312. package/src/components/SessionPanel.tsx +0 -335
  313. package/src/components/SprintContainer.tsx +0 -303
  314. package/src/components/SprintDependencyDialog.tsx +0 -78
  315. package/src/components/SprintPreflightModal.tsx +0 -138
  316. package/src/components/StatusBar.tsx +0 -168
  317. package/src/components/SwimCell.tsx +0 -67
  318. package/src/components/SwimLaneRow.tsx +0 -94
  319. package/src/components/SwimlaneBoardView.tsx +0 -108
  320. package/src/components/VersionBadge.tsx +0 -139
  321. package/src/components/ViewModeSelector.tsx +0 -114
  322. package/src/components/config/AgentChip.tsx +0 -53
  323. package/src/components/config/AgentCreateDialog.tsx +0 -321
  324. package/src/components/config/AgentEditor.tsx +0 -175
  325. package/src/components/config/DirectoryTree.tsx +0 -582
  326. package/src/components/config/FileEditor.tsx +0 -550
  327. package/src/components/config/HookChip.tsx +0 -50
  328. package/src/components/config/StageCard.tsx +0 -198
  329. package/src/components/config/TransitionZone.tsx +0 -173
  330. package/src/components/config/UnifiedWorkflowPipeline.tsx +0 -216
  331. package/src/components/config/WorkflowPipeline.tsx +0 -161
  332. package/src/components/source-control/BranchList.tsx +0 -93
  333. package/src/components/source-control/BranchPanel.tsx +0 -105
  334. package/src/components/source-control/CommitLog.tsx +0 -100
  335. package/src/components/source-control/CommitRow.tsx +0 -47
  336. package/src/components/source-control/GitHubPanel.tsx +0 -110
  337. package/src/components/source-control/GitHubSetupGuide.tsx +0 -52
  338. package/src/components/source-control/GitOverviewBar.tsx +0 -101
  339. package/src/components/source-control/PullRequestList.tsx +0 -69
  340. package/src/components/source-control/WorktreeList.tsx +0 -80
  341. package/src/components/ui/badge.tsx +0 -41
  342. package/src/components/ui/button.tsx +0 -55
  343. package/src/components/ui/card.tsx +0 -78
  344. package/src/components/ui/dialog.tsx +0 -94
  345. package/src/components/ui/popover.tsx +0 -33
  346. package/src/components/ui/scroll-area.tsx +0 -54
  347. package/src/components/ui/separator.tsx +0 -28
  348. package/src/components/ui/tabs.tsx +0 -52
  349. package/src/components/ui/toggle-switch.tsx +0 -35
  350. package/src/components/ui/tooltip.tsx +0 -27
  351. package/src/components/workflow/AddEdgeDialog.tsx +0 -217
  352. package/src/components/workflow/AddListDialog.tsx +0 -201
  353. package/src/components/workflow/ChecklistEditor.tsx +0 -239
  354. package/src/components/workflow/CommandPrefixManager.tsx +0 -118
  355. package/src/components/workflow/ConfigSettingsPanel.tsx +0 -189
  356. package/src/components/workflow/DirectionSelector.tsx +0 -133
  357. package/src/components/workflow/DispatchConfigPanel.tsx +0 -180
  358. package/src/components/workflow/EdgeDetailPanel.tsx +0 -236
  359. package/src/components/workflow/EdgePropertyEditor.tsx +0 -251
  360. package/src/components/workflow/EditToolbar.tsx +0 -138
  361. package/src/components/workflow/HookDetailPanel.tsx +0 -250
  362. package/src/components/workflow/HookExecutionLog.tsx +0 -24
  363. package/src/components/workflow/HookSourceModal.tsx +0 -129
  364. package/src/components/workflow/HooksDashboard.tsx +0 -363
  365. package/src/components/workflow/ListPropertyEditor.tsx +0 -251
  366. package/src/components/workflow/MigrationPreviewDialog.tsx +0 -237
  367. package/src/components/workflow/MovementRulesPanel.tsx +0 -188
  368. package/src/components/workflow/NodeDetailPanel.tsx +0 -245
  369. package/src/components/workflow/PresetSelector.tsx +0 -414
  370. package/src/components/workflow/SkillCommandBuilder.tsx +0 -174
  371. package/src/components/workflow/WorkflowEdgeComponent.tsx +0 -145
  372. package/src/components/workflow/WorkflowNode.tsx +0 -147
  373. package/src/components/workflow/graphLayout.ts +0 -186
  374. package/src/components/workflow/mergeHooks.ts +0 -85
  375. package/src/components/workflow/useEditHistory.ts +0 -88
  376. package/src/components/workflow/useWorkflowEditor.ts +0 -262
  377. package/src/components/workflow/validateConfig.ts +0 -70
  378. package/src/hooks/useActiveDispatches.ts +0 -198
  379. package/src/hooks/useBoardSettings.ts +0 -170
  380. package/src/hooks/useCardDisplay.ts +0 -57
  381. package/src/hooks/useCcHooks.ts +0 -24
  382. package/src/hooks/useConfigTree.ts +0 -51
  383. package/src/hooks/useEnforcementRules.ts +0 -46
  384. package/src/hooks/useEvents.ts +0 -59
  385. package/src/hooks/useFileEditor.ts +0 -165
  386. package/src/hooks/useGates.ts +0 -57
  387. package/src/hooks/useIdeaActions.ts +0 -53
  388. package/src/hooks/useKanbanDnd.ts +0 -410
  389. package/src/hooks/useOrbitalConfig.ts +0 -54
  390. package/src/hooks/usePipeline.ts +0 -47
  391. package/src/hooks/usePipelineData.ts +0 -338
  392. package/src/hooks/useReconnect.ts +0 -25
  393. package/src/hooks/useScopeFilters.ts +0 -125
  394. package/src/hooks/useScopeSessions.ts +0 -44
  395. package/src/hooks/useScopes.ts +0 -67
  396. package/src/hooks/useSearch.ts +0 -67
  397. package/src/hooks/useSettings.tsx +0 -187
  398. package/src/hooks/useSocket.ts +0 -25
  399. package/src/hooks/useSourceControl.ts +0 -105
  400. package/src/hooks/useSprintPreflight.ts +0 -55
  401. package/src/hooks/useSprints.ts +0 -154
  402. package/src/hooks/useStatusBarHighlight.ts +0 -18
  403. package/src/hooks/useSwimlaneBoardSettings.ts +0 -104
  404. package/src/hooks/useTheme.ts +0 -9
  405. package/src/hooks/useTransitionReadiness.ts +0 -53
  406. package/src/hooks/useVersion.ts +0 -155
  407. package/src/hooks/useViolations.ts +0 -65
  408. package/src/hooks/useWorkflow.tsx +0 -125
  409. package/src/hooks/useZoomModifier.ts +0 -19
  410. package/src/index.css +0 -797
  411. package/src/layouts/DashboardLayout.tsx +0 -113
  412. package/src/lib/collisionDetection.ts +0 -20
  413. package/src/lib/scope-fields.ts +0 -61
  414. package/src/lib/swimlane.ts +0 -146
  415. package/src/lib/utils.ts +0 -15
  416. package/src/main.tsx +0 -19
  417. package/src/socket.ts +0 -11
  418. package/src/types/index.ts +0 -497
  419. package/src/views/AgentFeed.tsx +0 -339
  420. package/src/views/DeployPipeline.tsx +0 -59
  421. package/src/views/EnforcementView.tsx +0 -378
  422. package/src/views/PrimitivesConfig.tsx +0 -500
  423. package/src/views/QualityGates.tsx +0 -1012
  424. package/src/views/ScopeBoard.tsx +0 -454
  425. package/src/views/SessionTimeline.tsx +0 -516
  426. package/src/views/Settings.tsx +0 -183
  427. package/src/views/SourceControl.tsx +0 -95
  428. package/src/views/WorkflowVisualizer.tsx +0 -382
  429. package/tailwind.config.js +0 -161
  430. package/tsconfig.json +0 -25
  431. package/vite.config.ts +0 -38
@@ -1,67 +0,0 @@
1
- import { useDroppable } from '@dnd-kit/core';
2
- import type { Scope, ScopeStatus, CardDisplayConfig } from '@/types';
3
- import { ScopeCard } from './ScopeCard';
4
- import { cn } from '@/lib/utils';
5
-
6
- interface SwimCellProps {
7
- laneValue: string;
8
- status: ScopeStatus;
9
- scopes: Scope[];
10
- onScopeClick?: (scope: Scope) => void;
11
- cardDisplay?: CardDisplayConfig;
12
- dimmedIds?: Set<number>;
13
- isDragActive: boolean;
14
- isValidDrop: boolean;
15
- isCollapsed: boolean;
16
- }
17
-
18
- export function SwimCell({
19
- laneValue,
20
- status,
21
- scopes = [],
22
- onScopeClick,
23
- cardDisplay,
24
- dimmedIds,
25
- isDragActive,
26
- isValidDrop,
27
- isCollapsed,
28
- }: SwimCellProps) {
29
- const droppableId = `swim::${laneValue}::${status}`;
30
- const { setNodeRef, isOver } = useDroppable({ id: droppableId });
31
-
32
- if (isCollapsed) return null;
33
-
34
- return (
35
- <div
36
- ref={setNodeRef}
37
- className={cn(
38
- 'swim-cell min-h-[48px] rounded border border-white/[0.04] p-1 transition-colors',
39
- isDragActive && isOver && isValidDrop && 'ring-2 ring-green-500/60 border-green-500/40 bg-green-500/5',
40
- isDragActive && isOver && !isValidDrop && 'ring-2 ring-red-500/50 border-red-500/30 bg-red-500/5',
41
- isDragActive && !isOver && isValidDrop && 'border-green-500/20',
42
- scopes.length === 0 && 'border-dashed border-white/[0.06]',
43
- )}
44
- >
45
- <div className="space-y-1.5">
46
- {scopes.filter((s) => !s.is_ghost).map((scope) => (
47
- <ScopeCard
48
- key={scope.id}
49
- scope={scope}
50
- onClick={onScopeClick}
51
- cardDisplay={cardDisplay}
52
- dimmed={dimmedIds?.has(scope.id)}
53
- />
54
- ))}
55
- {scopes.filter((s) => s.is_ghost).map((scope) => (
56
- <ScopeCard
57
- key={scope.id}
58
- scope={scope}
59
- onClick={onScopeClick}
60
- cardDisplay={cardDisplay}
61
- dimmed={dimmedIds?.has(scope.id)}
62
- />
63
- ))}
64
- </div>
65
- </div>
66
- );
67
- }
@@ -1,94 +0,0 @@
1
- import { ChevronRight } from 'lucide-react';
2
- import type { SwimLane } from '@/lib/swimlane';
3
- import type { Scope, ScopeStatus, CardDisplayConfig, BoardColumn } from '@/types';
4
- import { SwimCell } from './SwimCell';
5
- import { cn } from '@/lib/utils';
6
-
7
- interface SwimLaneRowProps {
8
- lane: SwimLane;
9
- columns: BoardColumn[];
10
- collapsedColumns: Set<string>;
11
- isLaneCollapsed: boolean;
12
- onToggleLane: () => void;
13
- onScopeClick?: (scope: Scope) => void;
14
- cardDisplay?: CardDisplayConfig;
15
- dimmedIds?: Set<number>;
16
- isDragActive: boolean;
17
- validTargets: Set<ScopeStatus>;
18
- }
19
-
20
- export function SwimLaneRow({
21
- lane,
22
- columns,
23
- collapsedColumns,
24
- isLaneCollapsed,
25
- onToggleLane,
26
- onScopeClick,
27
- cardDisplay,
28
- dimmedIds,
29
- isDragActive,
30
- validTargets,
31
- }: SwimLaneRowProps) {
32
- if (isLaneCollapsed) {
33
- return (
34
- <>
35
- {/* Lane label cell — collapsed */}
36
- <button
37
- onClick={onToggleLane}
38
- className="swim-lane-header flex items-center gap-2 rounded-l px-3 py-1.5 text-left hover:bg-white/[0.04] transition-colors cursor-pointer sticky left-0 z-10 bg-background"
39
- >
40
- <div className={cn('h-full w-0.5 rounded-full shrink-0 self-stretch', lane.color)} />
41
- <ChevronRight className="h-3 w-3 text-muted-foreground shrink-0" />
42
- <span className="text-xxs font-medium text-muted-foreground truncate capitalize">
43
- {lane.label}
44
- </span>
45
- <span className="ml-auto rounded-full bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground shrink-0">
46
- {lane.count}
47
- </span>
48
- </button>
49
- {/* Empty cells across columns */}
50
- {columns.map((col) => (
51
- <div key={col.id} className={cn(collapsedColumns.has(col.id) && 'hidden')} />
52
- ))}
53
- </>
54
- );
55
- }
56
-
57
- return (
58
- <>
59
- {/* Lane label cell */}
60
- <button
61
- onClick={onToggleLane}
62
- className="swim-lane-header flex items-start gap-2 rounded-l px-3 py-2 text-left hover:bg-white/[0.04] transition-colors cursor-pointer sticky left-0 z-10 bg-background"
63
- >
64
- <div className={cn('w-0.5 rounded-full shrink-0 min-h-[32px] self-stretch', lane.color)} />
65
- <div className="flex flex-col gap-1 min-w-0">
66
- <div className="flex items-center gap-1.5">
67
- <ChevronRight className="h-3 w-3 text-muted-foreground shrink-0 rotate-90 transition-transform" />
68
- <span className="swim-lane-label text-xxs font-medium text-foreground/80 truncate capitalize">
69
- {lane.label}
70
- </span>
71
- </div>
72
- <span className="text-[10px] text-muted-foreground">
73
- {lane.count} scope{lane.count !== 1 ? 's' : ''}
74
- </span>
75
- </div>
76
- </button>
77
- {/* Cells per column */}
78
- {columns.map((col) => (
79
- <SwimCell
80
- key={col.id}
81
- laneValue={lane.value}
82
- status={col.id}
83
- scopes={lane.cells[col.id]}
84
- onScopeClick={onScopeClick}
85
- cardDisplay={cardDisplay}
86
- dimmedIds={dimmedIds}
87
- isDragActive={isDragActive}
88
- isValidDrop={validTargets.has(col.id)}
89
- isCollapsed={collapsedColumns.has(col.id)}
90
- />
91
- ))}
92
- </>
93
- );
94
- }
@@ -1,108 +0,0 @@
1
- import { Info } from 'lucide-react';
2
- import type { SwimLane } from '@/lib/swimlane';
3
- import type { Scope, ScopeStatus, CardDisplayConfig, BoardColumn, Sprint } from '@/types';
4
- import { SwimLaneRow } from './SwimLaneRow';
5
- import { cn } from '@/lib/utils';
6
- import { useTheme } from '@/hooks/useTheme';
7
-
8
- interface SwimlaneBoardViewProps {
9
- lanes: SwimLane[];
10
- columns: BoardColumn[];
11
- collapsedColumns: Set<string>;
12
- collapsedLanes: Set<string>;
13
- onToggleLane: (laneValue: string) => void;
14
- onToggleCollapse: (columnId: string) => void;
15
- onScopeClick?: (scope: Scope) => void;
16
- cardDisplay?: CardDisplayConfig;
17
- dimmedIds?: Set<number>;
18
- isDragActive: boolean;
19
- validTargets: Set<ScopeStatus>;
20
- sprints: Sprint[];
21
- }
22
-
23
- export function SwimlaneBoardView({
24
- lanes,
25
- columns,
26
- collapsedColumns,
27
- collapsedLanes,
28
- onToggleLane,
29
- onToggleCollapse,
30
- onScopeClick,
31
- cardDisplay,
32
- dimmedIds,
33
- isDragActive,
34
- validTargets,
35
- sprints,
36
- }: SwimlaneBoardViewProps) {
37
- const { neonGlass } = useTheme();
38
-
39
- // Filter out collapsed columns for grid sizing
40
- const visibleColumns = columns.filter((c) => !collapsedColumns.has(c.id));
41
- const gridTemplateColumns = `140px ${visibleColumns.map(() => '200px').join(' ')}`;
42
-
43
- const hasActiveSprints = sprints.some((s) =>
44
- s.group_type === 'sprint' || (s.group_type === 'batch' && s.status !== 'completed')
45
- );
46
-
47
- return (
48
- <div className="min-h-0 flex-1 overflow-auto">
49
- {/* Sprint info banner */}
50
- {hasActiveSprints && (
51
- <div className="mb-2 flex items-center gap-2 rounded border border-primary/20 bg-primary/5 px-3 py-1.5 text-xs text-muted-foreground">
52
- <Info className="h-3.5 w-3.5 text-primary shrink-0" />
53
- Sprint groups are hidden in swimlane view
54
- </div>
55
- )}
56
-
57
- <div
58
- className="grid gap-px pb-4"
59
- style={{ gridTemplateColumns, width: 'max-content' }}
60
- >
61
- {/* Column headers — sticky top row */}
62
- <div className="sticky top-0 z-20 bg-background" />
63
- {visibleColumns.map((col) => (
64
- <button
65
- key={col.id}
66
- onClick={() => onToggleCollapse(col.id)}
67
- className={cn(
68
- 'sticky top-0 z-20 flex items-center gap-1.5 rounded-t border-b border-white/[0.06] bg-background px-2 py-1.5 text-left cursor-pointer hover:bg-white/[0.03] transition-colors',
69
- neonGlass && 'border-b-white/[0.08]',
70
- )}
71
- >
72
- <div className={cn('h-2 w-2 rounded-full shrink-0', neonGlass && 'animate-glow-pulse')} style={{ backgroundColor: `hsl(${col.color})` }} />
73
- <span className="text-xxs uppercase tracking-wider font-normal text-muted-foreground truncate">
74
- {col.label}
75
- </span>
76
- </button>
77
- ))}
78
-
79
- {/* Lane rows */}
80
- {lanes.map((lane) => (
81
- <SwimLaneRow
82
- key={lane.value}
83
- lane={lane}
84
- columns={visibleColumns}
85
- collapsedColumns={collapsedColumns}
86
- isLaneCollapsed={collapsedLanes.has(lane.value)}
87
- onToggleLane={() => onToggleLane(lane.value)}
88
- onScopeClick={onScopeClick}
89
- cardDisplay={cardDisplay}
90
- dimmedIds={dimmedIds}
91
- isDragActive={isDragActive}
92
- validTargets={validTargets}
93
- />
94
- ))}
95
-
96
- {/* Empty state */}
97
- {lanes.length === 0 && (
98
- <>
99
- <div />
100
- <div className={cn('col-span-full py-12 text-center text-xs text-muted-foreground')}>
101
- No scopes to display
102
- </div>
103
- </>
104
- )}
105
- </div>
106
- </div>
107
- );
108
- }
@@ -1,139 +0,0 @@
1
- import { RefreshCw, Download, Check, AlertCircle, GitBranch, GitCommit, Loader2 } from 'lucide-react';
2
- import { Badge } from '@/components/ui/badge';
3
- import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
4
- import { useVersion } from '@/hooks/useVersion';
5
- import { cn } from '@/lib/utils';
6
-
7
- export function VersionBadge() {
8
- const {
9
- version,
10
- updateAvailable,
11
- behindCount,
12
- updateStage,
13
- updateError,
14
- loading,
15
- checkForUpdate,
16
- performUpdate,
17
- } = useVersion();
18
-
19
- if (loading) return null;
20
- if (!version) {
21
- return (
22
- <button className="version-badge flex items-center gap-1.5 rounded-lg px-2 py-1 text-[10px] font-mono text-muted-foreground/50">
23
- <span>v?</span>
24
- </button>
25
- );
26
- }
27
-
28
- const isWorking = updateStage === 'checking' || updateStage === 'pulling' || updateStage === 'installing';
29
-
30
- return (
31
- <Popover>
32
- <PopoverTrigger asChild>
33
- <button className="relative cursor-pointer">
34
- <Badge
35
- variant={updateAvailable ? 'warning' : 'success'}
36
- className="version-badge font-mono text-[10px] transition-colors"
37
- >
38
- v{version.version}
39
- </Badge>
40
- {updateAvailable && (
41
- <span className="version-pulse-dot absolute -top-1 -right-1 h-2 w-2 rounded-full bg-emerald-400" />
42
- )}
43
- </button>
44
- </PopoverTrigger>
45
-
46
- <PopoverContent
47
- side="top"
48
- align="end"
49
- sideOffset={8}
50
- className="w-64 filter-popover-glass"
51
- >
52
- <div className="space-y-3">
53
- {/* Version header */}
54
- <div className="flex items-center justify-between">
55
- <span className="text-xs font-medium text-foreground">Orbital Command</span>
56
- <Badge variant="outline" className="font-mono text-[10px]">
57
- v{version.version}
58
- </Badge>
59
- </div>
60
-
61
- {/* Git info */}
62
- <div className="space-y-1.5 text-[11px] text-muted-foreground">
63
- <div className="flex items-center gap-1.5">
64
- <GitCommit className="h-3 w-3" />
65
- <span className="font-mono">{version.commitSha}</span>
66
- </div>
67
- <div className="flex items-center gap-1.5">
68
- <GitBranch className="h-3 w-3" />
69
- <span className="font-mono">{version.branch}</span>
70
- </div>
71
- </div>
72
-
73
- {/* Update status */}
74
- {updateAvailable && updateStage !== 'done' && (
75
- <div className="rounded-md border border-emerald-500/20 bg-emerald-500/5 px-2 py-1.5 text-[11px] text-emerald-400">
76
- {behindCount} commit{behindCount !== 1 ? 's' : ''} behind remote
77
- </div>
78
- )}
79
-
80
- {updateStage === 'done' && (
81
- <div className="flex items-center gap-1.5 rounded-md border border-emerald-500/20 bg-emerald-500/5 px-2 py-1.5 text-[11px] text-emerald-400">
82
- <Check className="h-3 w-3" />
83
- Updated. Restart server to apply.
84
- </div>
85
- )}
86
-
87
- {updateStage === 'error' && (
88
- <div className="flex items-start gap-1.5 rounded-md border border-destructive/20 bg-destructive/5 px-2 py-1.5 text-[11px] text-destructive">
89
- <AlertCircle className="h-3 w-3 mt-0.5 shrink-0" />
90
- <span>{updateError ?? 'An unknown error occurred'}</span>
91
- </div>
92
- )}
93
-
94
- {isWorking && (
95
- <div className="flex items-center gap-1.5 text-[11px] text-muted-foreground">
96
- <Loader2 className="h-3 w-3 animate-spin" />
97
- <span>
98
- {updateStage === 'checking' && 'Checking for updates...'}
99
- {updateStage === 'pulling' && 'Pulling latest changes...'}
100
- {updateStage === 'installing' && 'Installing dependencies...'}
101
- </span>
102
- </div>
103
- )}
104
-
105
- {/* Actions */}
106
- <div className="flex gap-2 pt-1">
107
- <button
108
- onClick={checkForUpdate}
109
- disabled={isWorking}
110
- className={cn(
111
- 'flex flex-1 items-center justify-center gap-1.5 rounded-md border border-border px-2 py-1 text-[11px]',
112
- 'text-muted-foreground hover:text-foreground hover:bg-surface-light transition-colors',
113
- 'disabled:opacity-40 disabled:cursor-not-allowed',
114
- )}
115
- >
116
- <RefreshCw className={cn('h-3 w-3', updateStage === 'checking' && 'animate-spin')} />
117
- Check
118
- </button>
119
- {updateAvailable && updateStage !== 'done' && (
120
- <button
121
- onClick={performUpdate}
122
- disabled={isWorking}
123
- className={cn(
124
- 'flex flex-1 items-center justify-center gap-1.5 rounded-md px-2 py-1 text-[11px]',
125
- 'bg-emerald-500/10 border border-emerald-500/20 text-emerald-400',
126
- 'hover:bg-emerald-500/20 transition-colors',
127
- 'disabled:opacity-40 disabled:cursor-not-allowed',
128
- )}
129
- >
130
- <Download className="h-3 w-3" />
131
- Update
132
- </button>
133
- )}
134
- </div>
135
- </div>
136
- </PopoverContent>
137
- </Popover>
138
- );
139
- }
@@ -1,114 +0,0 @@
1
- import { Columns3, Rows3 } from 'lucide-react';
2
- import { Popover, PopoverTrigger, PopoverContent } from '@/components/ui/popover';
3
- import { Button } from '@/components/ui/button';
4
- import { cn } from '@/lib/utils';
5
- import type { ViewMode, SwimGroupField } from '@/types';
6
-
7
- interface ViewModeSelectorProps {
8
- viewMode: ViewMode;
9
- groupField: SwimGroupField;
10
- onViewModeChange: (mode: ViewMode) => void;
11
- onGroupFieldChange: (field: SwimGroupField) => void;
12
- }
13
-
14
- const VIEW_MODES: { value: ViewMode; label: string; Icon: typeof Columns3 }[] = [
15
- { value: 'kanban', label: 'Kanban', Icon: Columns3 },
16
- { value: 'swimlane', label: 'Swimlane', Icon: Rows3 },
17
- ];
18
-
19
- const GROUP_FIELDS: { value: SwimGroupField; label: string }[] = [
20
- { value: 'priority', label: 'Priority' },
21
- { value: 'category', label: 'Category' },
22
- { value: 'tags', label: 'Tags' },
23
- { value: 'effort', label: 'Effort' },
24
- { value: 'dependencies', label: 'Dependencies' },
25
- ];
26
-
27
- export function ViewModeSelector({
28
- viewMode,
29
- groupField,
30
- onViewModeChange,
31
- onGroupFieldChange,
32
- }: ViewModeSelectorProps) {
33
- const ActiveIcon = viewMode === 'swimlane' ? Rows3 : Columns3;
34
-
35
- return (
36
- <Popover>
37
- <PopoverTrigger asChild>
38
- <Button
39
- variant="outline"
40
- size="sm"
41
- className="gap-1.5 backdrop-blur-sm bg-white/[0.03] border-white/10"
42
- aria-label="Toggle view mode"
43
- >
44
- <ActiveIcon className="h-3 w-3" />
45
- {viewMode === 'swimlane' ? 'Swimlane' : 'Kanban'}
46
- </Button>
47
- </PopoverTrigger>
48
-
49
- <PopoverContent align="end" className="filter-popover-glass !bg-transparent w-44">
50
- {/* View mode selection */}
51
- <div className="space-y-0.5">
52
- <p className="px-2 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground">View</p>
53
- {VIEW_MODES.map(({ value, label, Icon }) => (
54
- <button
55
- key={value}
56
- onClick={() => onViewModeChange(value)}
57
- className={cn(
58
- 'flex w-full items-center gap-2 rounded px-2 py-1.5 text-xs transition-colors',
59
- 'hover:bg-white/[0.06]',
60
- viewMode === value && 'bg-white/[0.06]',
61
- )}
62
- >
63
- <span
64
- className={cn(
65
- 'flex h-3.5 w-3.5 shrink-0 items-center justify-center rounded-full border',
66
- viewMode === value ? 'border-primary bg-primary' : 'border-white/15',
67
- )}
68
- >
69
- {viewMode === value && (
70
- <span className="h-1.5 w-1.5 rounded-full bg-primary-foreground" />
71
- )}
72
- </span>
73
- <Icon className="h-3 w-3 text-muted-foreground" />
74
- <span className={cn(viewMode === value && 'text-foreground')}>{label}</span>
75
- </button>
76
- ))}
77
- </div>
78
-
79
- {/* Group-by field — only visible in swimlane mode */}
80
- {viewMode === 'swimlane' && (
81
- <>
82
- <div className="my-2 border-t border-white/[0.06]" />
83
- <div className="space-y-0.5">
84
- <p className="px-2 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground">Group by</p>
85
- {GROUP_FIELDS.map(({ value, label }) => (
86
- <button
87
- key={value}
88
- onClick={() => onGroupFieldChange(value)}
89
- className={cn(
90
- 'flex w-full items-center gap-2 rounded px-2 py-1.5 text-xs transition-colors',
91
- 'hover:bg-white/[0.06]',
92
- groupField === value && 'bg-white/[0.06]',
93
- )}
94
- >
95
- <span
96
- className={cn(
97
- 'flex h-3.5 w-3.5 shrink-0 items-center justify-center rounded-full border',
98
- groupField === value ? 'border-primary bg-primary' : 'border-white/15',
99
- )}
100
- >
101
- {groupField === value && (
102
- <span className="h-1.5 w-1.5 rounded-full bg-primary-foreground" />
103
- )}
104
- </span>
105
- <span className={cn(groupField === value && 'text-foreground')}>{label}</span>
106
- </button>
107
- ))}
108
- </div>
109
- </>
110
- )}
111
- </PopoverContent>
112
- </Popover>
113
- );
114
- }
@@ -1,53 +0,0 @@
1
- import { Bot, X } from 'lucide-react';
2
- import { cn } from '@/lib/utils';
3
- import type { ResolvedAgent } from '@/types';
4
-
5
- interface AgentChipProps {
6
- agent: ResolvedAgent;
7
- mode?: 'always-on' | 'review';
8
- selected?: boolean;
9
- onClick?: () => void;
10
- onRemove?: () => void;
11
- }
12
-
13
- export function AgentChip({ agent, mode, selected, onClick, onRemove }: AgentChipProps) {
14
- const color = agent.color || '#8B5CF6';
15
-
16
- return (
17
- <button
18
- type="button"
19
- onClick={onClick}
20
- data-pipeline-path={agent.filePath ?? undefined}
21
- className={cn(
22
- 'inline-flex items-center gap-1.5 rounded-md border px-2 py-0.5 text-[11px] font-medium transition-colors',
23
- 'hover:brightness-125 cursor-pointer',
24
- selected && 'glow-selected-pulse',
25
- )}
26
- style={{
27
- color,
28
- borderColor: `${color}4D`,
29
- backgroundColor: `${color}1A`,
30
- ...(selected ? { '--glow-color': `${color}A0`, '--glow-color-wide': `${color}40` } as React.CSSProperties : {}),
31
- }}
32
- >
33
- {agent.emoji ? (
34
- <span className="text-xs">{agent.emoji}</span>
35
- ) : (
36
- <Bot className="h-3 w-3 shrink-0" />
37
- )}
38
- <span className="truncate max-w-[100px]">{agent.label}</span>
39
- {mode === 'always-on' && (
40
- <span className="ml-0.5 h-1.5 w-1.5 rounded-full bg-green-500 shrink-0" title="Auto-invoke" />
41
- )}
42
- {onRemove && (
43
- <span
44
- role="button"
45
- onClick={(e) => { e.stopPropagation(); onRemove(); }}
46
- className="ml-0.5 rounded-full p-0.5 hover:bg-red-500/20"
47
- >
48
- <X className="h-2.5 w-2.5" />
49
- </span>
50
- )}
51
- </button>
52
- );
53
- }