@pennyfarthing/cyclist 10.4.0 → 11.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 (384) hide show
  1. package/dist/api/agent-load.d.ts +1 -2
  2. package/dist/api/agent-load.d.ts.map +1 -1
  3. package/dist/api/agent-load.js +2 -123
  4. package/dist/api/agent-load.js.map +1 -1
  5. package/dist/api/audit-log.d.ts +1 -17
  6. package/dist/api/audit-log.d.ts.map +1 -1
  7. package/dist/api/audit-log.js +2 -162
  8. package/dist/api/audit-log.js.map +1 -1
  9. package/dist/api/background-tasks.d.ts +1 -26
  10. package/dist/api/background-tasks.d.ts.map +1 -1
  11. package/dist/api/background-tasks.js +2 -55
  12. package/dist/api/background-tasks.js.map +1 -1
  13. package/dist/api/bell.d.ts +1 -18
  14. package/dist/api/bell.d.ts.map +1 -1
  15. package/dist/api/bell.js +2 -33
  16. package/dist/api/bell.js.map +1 -1
  17. package/dist/api/code-markers.d.ts +1 -8
  18. package/dist/api/code-markers.d.ts.map +1 -1
  19. package/dist/api/code-markers.js +2 -61
  20. package/dist/api/code-markers.js.map +1 -1
  21. package/dist/api/complexity.d.ts +1 -2
  22. package/dist/api/complexity.d.ts.map +1 -1
  23. package/dist/api/complexity.js +2 -46
  24. package/dist/api/complexity.js.map +1 -1
  25. package/dist/api/context.d.ts +1 -37
  26. package/dist/api/context.d.ts.map +1 -1
  27. package/dist/api/context.js +2 -143
  28. package/dist/api/context.js.map +1 -1
  29. package/dist/api/dead-code.d.ts +1 -2
  30. package/dist/api/dead-code.d.ts.map +1 -1
  31. package/dist/api/dead-code.js +2 -69
  32. package/dist/api/dead-code.js.map +1 -1
  33. package/dist/api/dependencies.d.ts +1 -2
  34. package/dist/api/dependencies.d.ts.map +1 -1
  35. package/dist/api/dependencies.js +2 -42
  36. package/dist/api/dependencies.js.map +1 -1
  37. package/dist/api/evaluation.d.ts +1 -19
  38. package/dist/api/evaluation.d.ts.map +1 -1
  39. package/dist/api/evaluation.js +2 -127
  40. package/dist/api/evaluation.js.map +1 -1
  41. package/dist/api/file-browser.d.ts +1 -8
  42. package/dist/api/file-browser.d.ts.map +1 -1
  43. package/dist/api/file-browser.js +2 -114
  44. package/dist/api/file-browser.js.map +1 -1
  45. package/dist/api/git.d.ts +1 -46
  46. package/dist/api/git.d.ts.map +1 -1
  47. package/dist/api/git.js +2 -354
  48. package/dist/api/git.js.map +1 -1
  49. package/dist/api/health-score.d.ts +1 -2
  50. package/dist/api/health-score.d.ts.map +1 -1
  51. package/dist/api/health-score.js +2 -46
  52. package/dist/api/health-score.js.map +1 -1
  53. package/dist/api/hook-request.d.ts +1 -40
  54. package/dist/api/hook-request.d.ts.map +1 -1
  55. package/dist/api/hook-request.js +2 -277
  56. package/dist/api/hook-request.js.map +1 -1
  57. package/dist/api/hotspots.d.ts +1 -2
  58. package/dist/api/hotspots.d.ts.map +1 -1
  59. package/dist/api/hotspots.js +2 -61
  60. package/dist/api/hotspots.js.map +1 -1
  61. package/dist/api/identity.d.ts +1 -16
  62. package/dist/api/identity.d.ts.map +1 -1
  63. package/dist/api/identity.js +2 -78
  64. package/dist/api/identity.js.map +1 -1
  65. package/dist/api/index.d.ts +1 -34
  66. package/dist/api/index.d.ts.map +1 -1
  67. package/dist/api/index.js +2 -44
  68. package/dist/api/index.js.map +1 -1
  69. package/dist/api/mode.d.ts +1 -22
  70. package/dist/api/mode.d.ts.map +1 -1
  71. package/dist/api/mode.js +2 -37
  72. package/dist/api/mode.js.map +1 -1
  73. package/dist/api/otlp.d.ts +1 -2
  74. package/dist/api/otlp.d.ts.map +1 -1
  75. package/dist/api/otlp.js +2 -46
  76. package/dist/api/otlp.js.map +1 -1
  77. package/dist/api/permissions.d.ts +1 -15
  78. package/dist/api/permissions.d.ts.map +1 -1
  79. package/dist/api/permissions.js +2 -66
  80. package/dist/api/permissions.js.map +1 -1
  81. package/dist/api/persona.d.ts +1 -8
  82. package/dist/api/persona.d.ts.map +1 -1
  83. package/dist/api/persona.js +2 -67
  84. package/dist/api/persona.js.map +1 -1
  85. package/dist/api/portrait.d.ts +1 -5
  86. package/dist/api/portrait.d.ts.map +1 -1
  87. package/dist/api/portrait.js +2 -27
  88. package/dist/api/portrait.js.map +1 -1
  89. package/dist/api/settings.d.ts +1 -53
  90. package/dist/api/settings.d.ts.map +1 -1
  91. package/dist/api/settings.js +2 -464
  92. package/dist/api/settings.js.map +1 -1
  93. package/dist/api/spans.d.ts +1 -16
  94. package/dist/api/spans.d.ts.map +1 -1
  95. package/dist/api/spans.js +2 -244
  96. package/dist/api/spans.js.map +1 -1
  97. package/dist/api/stats.d.ts +1 -12
  98. package/dist/api/stats.d.ts.map +1 -1
  99. package/dist/api/stats.js +2 -84
  100. package/dist/api/stats.js.map +1 -1
  101. package/dist/api/story.d.ts +1 -2
  102. package/dist/api/story.d.ts.map +1 -1
  103. package/dist/api/story.js +2 -14
  104. package/dist/api/story.js.map +1 -1
  105. package/dist/api/telemetry.d.ts +1 -18
  106. package/dist/api/telemetry.d.ts.map +1 -1
  107. package/dist/api/telemetry.js +2 -164
  108. package/dist/api/telemetry.js.map +1 -1
  109. package/dist/api/theme-agents.d.ts +1 -60
  110. package/dist/api/theme-agents.d.ts.map +1 -1
  111. package/dist/api/theme-agents.js +2 -213
  112. package/dist/api/theme-agents.js.map +1 -1
  113. package/dist/api/todos.d.ts +1 -32
  114. package/dist/api/todos.d.ts.map +1 -1
  115. package/dist/api/todos.js +2 -43
  116. package/dist/api/todos.js.map +1 -1
  117. package/dist/api/token-stats.d.ts +1 -7
  118. package/dist/api/token-stats.d.ts.map +1 -1
  119. package/dist/api/token-stats.js +2 -35
  120. package/dist/api/token-stats.js.map +1 -1
  121. package/dist/api/welcome.d.ts +1 -21
  122. package/dist/api/welcome.d.ts.map +1 -1
  123. package/dist/api/welcome.js +2 -34
  124. package/dist/api/welcome.js.map +1 -1
  125. package/dist/bikerack.js +2 -2
  126. package/dist/bikerack.js.map +1 -1
  127. package/dist/env.d.ts +6 -0
  128. package/dist/env.d.ts.map +1 -0
  129. package/dist/env.js +10 -0
  130. package/dist/env.js.map +1 -0
  131. package/dist/focus.d.ts +53 -0
  132. package/dist/focus.d.ts.map +1 -0
  133. package/dist/focus.js +122 -0
  134. package/dist/focus.js.map +1 -0
  135. package/dist/git-cache.d.ts +1 -0
  136. package/dist/git-cache.d.ts.map +1 -1
  137. package/dist/git-cache.js +3 -1
  138. package/dist/git-cache.js.map +1 -1
  139. package/dist/menu-builder.d.ts.map +1 -1
  140. package/dist/menu-builder.js +0 -1
  141. package/dist/menu-builder.js.map +1 -1
  142. package/dist/prime.d.ts +3 -3
  143. package/dist/prime.d.ts.map +1 -1
  144. package/dist/prime.js +38 -14
  145. package/dist/prime.js.map +1 -1
  146. package/dist/public/css/react.css +1 -1
  147. package/dist/public/js/react/react.js +53 -61
  148. package/dist/server.d.ts +18 -85
  149. package/dist/server.d.ts.map +1 -1
  150. package/dist/server.js +105 -405
  151. package/dist/server.js.map +1 -1
  152. package/dist/sprint-data.d.ts +1 -1
  153. package/dist/sprint-data.d.ts.map +1 -1
  154. package/dist/sprint-data.js +2 -2
  155. package/dist/sprint-data.js.map +1 -1
  156. package/dist/theme-metadata.d.ts +3 -3
  157. package/dist/theme-metadata.d.ts.map +1 -1
  158. package/dist/theme-metadata.js +4 -4
  159. package/dist/theme-metadata.js.map +1 -1
  160. package/dist/websocket.d.ts +2 -0
  161. package/dist/websocket.d.ts.map +1 -1
  162. package/dist/websocket.js +53 -75
  163. package/dist/websocket.js.map +1 -1
  164. package/package.json +2 -6
  165. package/portraits/hogans-heroes/large/burkhalter-35312.png +0 -0
  166. package/portraits/hogans-heroes/large/carter-34352.png +0 -0
  167. package/portraits/hogans-heroes/large/hochstetter-45314.png +0 -0
  168. package/portraits/hogans-heroes/large/hogan-44541.png +0 -0
  169. package/portraits/hogans-heroes/large/kinch-35241.png +0 -0
  170. package/portraits/hogans-heroes/large/klink-23434.png +0 -0
  171. package/portraits/hogans-heroes/large/lebeau-45443.png +0 -0
  172. package/portraits/hogans-heroes/large/marya-53543.png +0 -0
  173. package/portraits/hogans-heroes/large/newkirk-54432.png +0 -0
  174. package/portraits/hogans-heroes/large/schultz-42453.png +0 -0
  175. package/portraits/hogans-heroes/large/underground-55131.png +0 -0
  176. package/portraits/hogans-heroes/medium/burkhalter-35312.png +0 -0
  177. package/portraits/hogans-heroes/medium/carter-34352.png +0 -0
  178. package/portraits/hogans-heroes/medium/hochstetter-45314.png +0 -0
  179. package/portraits/hogans-heroes/medium/hogan-44541.png +0 -0
  180. package/portraits/hogans-heroes/medium/kinch-35241.png +0 -0
  181. package/portraits/hogans-heroes/medium/klink-23434.png +0 -0
  182. package/portraits/hogans-heroes/medium/lebeau-45443.png +0 -0
  183. package/portraits/hogans-heroes/medium/marya-53543.png +0 -0
  184. package/portraits/hogans-heroes/medium/newkirk-54432.png +0 -0
  185. package/portraits/hogans-heroes/medium/schultz-42453.png +0 -0
  186. package/portraits/hogans-heroes/medium/underground-55131.png +0 -0
  187. package/portraits/monty-python/large/announcer-44441.png +0 -0
  188. package/portraits/monty-python/large/arguer-35412.png +0 -0
  189. package/portraits/monty-python/large/bicycle-repair-man-35241.png +0 -0
  190. package/portraits/monty-python/large/colonel-35423.png +0 -0
  191. package/portraits/monty-python/large/counsellor-45341.png +0 -0
  192. package/portraits/monty-python/large/gumbys-23524.png +0 -0
  193. package/portraits/monty-python/large/nudge-43533.png +0 -0
  194. package/portraits/monty-python/large/praline-45413.png +0 -0
  195. package/portraits/monty-python/large/silly-walks-55322.png +0 -0
  196. package/portraits/monty-python/large/wensleydale-54451.png +0 -0
  197. package/portraits/monty-python/large/xim-nez-43534.png +0 -0
  198. package/portraits/monty-python/medium/announcer-44441.png +0 -0
  199. package/portraits/monty-python/medium/arguer-35412.png +0 -0
  200. package/portraits/monty-python/medium/bicycle-repair-man-35241.png +0 -0
  201. package/portraits/monty-python/medium/colonel-35423.png +0 -0
  202. package/portraits/monty-python/medium/counsellor-45341.png +0 -0
  203. package/portraits/monty-python/medium/gumbys-23524.png +0 -0
  204. package/portraits/monty-python/medium/nudge-43533.png +0 -0
  205. package/portraits/monty-python/medium/praline-45413.png +0 -0
  206. package/portraits/monty-python/medium/silly-walks-55322.png +0 -0
  207. package/portraits/monty-python/medium/wensleydale-54451.png +0 -0
  208. package/portraits/monty-python/medium/xim-nez-43534.png +0 -0
  209. package/portraits/stephen-king/large/andy-55231.png +0 -0
  210. package/portraits/stephen-king/large/christine-25112.png +0 -0
  211. package/portraits/stephen-king/large/danny-53243.png +0 -0
  212. package/portraits/stephen-king/large/flagg-55311.png +0 -0
  213. package/portraits/stephen-king/large/gaunt-54421.png +0 -0
  214. package/portraits/stephen-king/large/jack-44224.png +0 -0
  215. package/portraits/stephen-king/large/johnny-44353.png +0 -0
  216. package/portraits/stephen-king/large/margaret-15415.png +0 -0
  217. package/portraits/stephen-king/large/paul-45233.png +0 -0
  218. package/portraits/stephen-king/large/pennywise-54411.png +0 -0
  219. package/portraits/stephen-king/large/roland-35121.png +0 -0
  220. package/portraits/stephen-king/medium/andy-55231.png +0 -0
  221. package/portraits/stephen-king/medium/christine-25112.png +0 -0
  222. package/portraits/stephen-king/medium/danny-53243.png +0 -0
  223. package/portraits/stephen-king/medium/flagg-55311.png +0 -0
  224. package/portraits/stephen-king/medium/gaunt-54421.png +0 -0
  225. package/portraits/stephen-king/medium/jack-44224.png +0 -0
  226. package/portraits/stephen-king/medium/johnny-44353.png +0 -0
  227. package/portraits/stephen-king/medium/margaret-15415.png +0 -0
  228. package/portraits/stephen-king/medium/paul-45233.png +0 -0
  229. package/portraits/stephen-king/medium/pennywise-54411.png +0 -0
  230. package/portraits/stephen-king/medium/roland-35121.png +0 -0
  231. package/portraits/star-trek-tng/large/beverly-44352.png +0 -0
  232. package/portraits/star-trek-tng/large/data-55241.png +0 -0
  233. package/portraits/star-trek-tng/large/deanna-43353.png +0 -0
  234. package/portraits/star-trek-tng/large/geordi-54342.png +0 -0
  235. package/portraits/star-trek-tng/large/jean-luc-45342.png +0 -0
  236. package/portraits/star-trek-tng/large/kathryn-45332.png +0 -0
  237. package/portraits/star-trek-tng/large/miles-35342.png +0 -0
  238. package/portraits/star-trek-tng/large/q-53521.png +0 -0
  239. package/portraits/star-trek-tng/large/spock-45231.png +0 -0
  240. package/portraits/star-trek-tng/large/troi-44352.png +0 -0
  241. package/portraits/star-trek-tng/medium/beverly-44352.png +0 -0
  242. package/portraits/star-trek-tng/medium/data-55241.png +0 -0
  243. package/portraits/star-trek-tng/medium/deanna-43353.png +0 -0
  244. package/portraits/star-trek-tng/medium/geordi-54342.png +0 -0
  245. package/portraits/star-trek-tng/medium/jean-luc-45342.png +0 -0
  246. package/portraits/star-trek-tng/medium/kathryn-45332.png +0 -0
  247. package/portraits/star-trek-tng/medium/miles-35342.png +0 -0
  248. package/portraits/star-trek-tng/medium/q-53521.png +0 -0
  249. package/portraits/star-trek-tng/medium/spock-45231.png +0 -0
  250. package/portraits/star-trek-tng/medium/troi-44352.png +0 -0
  251. package/src/public/App.tsx +0 -340
  252. package/src/public/components/AgentLoadDialog.tsx +0 -202
  253. package/src/public/components/AgentPopup.tsx +0 -308
  254. package/src/public/components/ApprovalModal/ApprovalModal.css +0 -35
  255. package/src/public/components/ApprovalModal/index.tsx +0 -632
  256. package/src/public/components/BikeRackIndex.tsx +0 -54
  257. package/src/public/components/BikeRackWorkspace.tsx +0 -142
  258. package/src/public/components/CommandPalette.tsx +0 -555
  259. package/src/public/components/ConfirmDialog.tsx +0 -168
  260. package/src/public/components/ContextIndicator/ContextIndicator.css +0 -85
  261. package/src/public/components/ContextIndicator/index.tsx +0 -330
  262. package/src/public/components/ContextSparkline.tsx +0 -56
  263. package/src/public/components/ControlBar.tsx +0 -636
  264. package/src/public/components/DeadCodeDialog.tsx +0 -169
  265. package/src/public/components/DiffViewer.tsx +0 -585
  266. package/src/public/components/DockviewWorkspace.tsx +0 -737
  267. package/src/public/components/Editor.tsx +0 -630
  268. package/src/public/components/ErrorBoundary.tsx +0 -67
  269. package/src/public/components/FileTree.tsx +0 -379
  270. package/src/public/components/FontPicker/FontPicker.css +0 -276
  271. package/src/public/components/FontPicker/index.tsx +0 -430
  272. package/src/public/components/FullFileTree.tsx +0 -237
  273. package/src/public/components/HealthGauge.tsx +0 -181
  274. package/src/public/components/Message.tsx +0 -225
  275. package/src/public/components/MessageList.tsx +0 -98
  276. package/src/public/components/MessageView.tsx +0 -400
  277. package/src/public/components/ModeSwitch/ModeSwitch.css +0 -165
  278. package/src/public/components/ModeSwitch/index.tsx +0 -372
  279. package/src/public/components/PersonaHeader.tsx +0 -240
  280. package/src/public/components/QuickActions.tsx +0 -267
  281. package/src/public/components/SpanTimeline.tsx +0 -352
  282. package/src/public/components/StandalonePanel.tsx +0 -84
  283. package/src/public/components/StatsStrip.tsx +0 -162
  284. package/src/public/components/StreamingContent.tsx +0 -77
  285. package/src/public/components/SubagentSpan.tsx +0 -180
  286. package/src/public/components/TandemPortrait.tsx +0 -72
  287. package/src/public/components/ThemePalette/ThemePalette.css +0 -179
  288. package/src/public/components/ThemePalette/index.tsx +0 -326
  289. package/src/public/components/ToolCallBlock.tsx +0 -252
  290. package/src/public/components/ToolStack.tsx +0 -209
  291. package/src/public/components/ToolStatus.tsx +0 -57
  292. package/src/public/components/dialogs/CodeMarkersDialog.tsx +0 -169
  293. package/src/public/components/dialogs/ComplexityDialog.tsx +0 -163
  294. package/src/public/components/dialogs/DependenciesDialog.tsx +0 -120
  295. package/src/public/components/dialogs/HotspotsDialog.tsx +0 -451
  296. package/src/public/components/dialogs/ToolDialog.tsx +0 -43
  297. package/src/public/components/panel-registry.ts +0 -11
  298. package/src/public/components/panels/ACPanel.tsx +0 -93
  299. package/src/public/components/panels/AcceptanceCriteriaPanel.tsx +0 -104
  300. package/src/public/components/panels/AuditLogPanel.tsx +0 -465
  301. package/src/public/components/panels/BackgroundPanel.tsx +0 -115
  302. package/src/public/components/panels/BikeLanePanel.tsx +0 -214
  303. package/src/public/components/panels/ChangedPanel.tsx +0 -65
  304. package/src/public/components/panels/DebugPanel.tsx +0 -344
  305. package/src/public/components/panels/DiffsPanel.tsx +0 -155
  306. package/src/public/components/panels/GitPanel.tsx +0 -216
  307. package/src/public/components/panels/HotspotsPanel.tsx +0 -365
  308. package/src/public/components/panels/MessagePanel.tsx +0 -497
  309. package/src/public/components/panels/SettingsPanel.tsx +0 -453
  310. package/src/public/components/panels/SprintPanel.tsx +0 -670
  311. package/src/public/components/panels/TTYPanel.tsx +0 -299
  312. package/src/public/components/panels/TodoPanel.tsx +0 -142
  313. package/src/public/components/panels/WorkflowPanel.tsx +0 -224
  314. package/src/public/components/panels/index.ts +0 -24
  315. package/src/public/components/ui/alert-dialog.tsx +0 -139
  316. package/src/public/components/ui/badge.tsx +0 -36
  317. package/src/public/components/ui/button.tsx +0 -57
  318. package/src/public/components/ui/checkbox.tsx +0 -28
  319. package/src/public/components/ui/collapsible.tsx +0 -9
  320. package/src/public/components/ui/command.tsx +0 -151
  321. package/src/public/components/ui/dialog.tsx +0 -120
  322. package/src/public/components/ui/popover.tsx +0 -31
  323. package/src/public/components/ui/progress.tsx +0 -28
  324. package/src/public/components/ui/scroll-area.tsx +0 -46
  325. package/src/public/components/ui/select.tsx +0 -157
  326. package/src/public/components/ui/separator.tsx +0 -29
  327. package/src/public/components/ui/skeleton.tsx +0 -15
  328. package/src/public/components/ui/switch.tsx +0 -27
  329. package/src/public/components/ui/toggle-group.tsx +0 -59
  330. package/src/public/components/ui/toggle.tsx +0 -43
  331. package/src/public/components/ui/tooltip.tsx +0 -30
  332. package/src/public/contexts/ClaudeContext.tsx +0 -311
  333. package/src/public/contexts/MessageQueueContext.tsx +0 -143
  334. package/src/public/css/theme-browser.css +0 -550
  335. package/src/public/css/theme-system.css +0 -630
  336. package/src/public/hooks/index.ts +0 -49
  337. package/src/public/hooks/useAgentLoad.ts +0 -105
  338. package/src/public/hooks/useBackgroundTasks.ts +0 -131
  339. package/src/public/hooks/useClaude.ts +0 -234
  340. package/src/public/hooks/useCodeMarkers.ts +0 -101
  341. package/src/public/hooks/useColorScheme.ts +0 -42
  342. package/src/public/hooks/useCommandHistory.ts +0 -99
  343. package/src/public/hooks/useComplexity.ts +0 -80
  344. package/src/public/hooks/useDeadCode.ts +0 -99
  345. package/src/public/hooks/useDependencies.ts +0 -82
  346. package/src/public/hooks/useDiffs.ts +0 -143
  347. package/src/public/hooks/useFileBrowser.ts +0 -71
  348. package/src/public/hooks/useGitStatus.ts +0 -233
  349. package/src/public/hooks/useHealthScore.ts +0 -69
  350. package/src/public/hooks/useHotspots.ts +0 -123
  351. package/src/public/hooks/useLayoutPersistence.ts +0 -138
  352. package/src/public/hooks/useMarkdownParser.ts +0 -36
  353. package/src/public/hooks/useMarkerActions.ts +0 -234
  354. package/src/public/hooks/useMessageQueue.ts +0 -380
  355. package/src/public/hooks/useMessageStream.ts +0 -131
  356. package/src/public/hooks/usePersona.ts +0 -112
  357. package/src/public/hooks/usePlanModeExit.ts +0 -105
  358. package/src/public/hooks/useResponsiveLayout.ts +0 -173
  359. package/src/public/hooks/useSprint.ts +0 -147
  360. package/src/public/hooks/useStatsStrip.ts +0 -204
  361. package/src/public/hooks/useStory.ts +0 -135
  362. package/src/public/hooks/useSubagentHelper.ts +0 -64
  363. package/src/public/hooks/useSyntaxHighlighter.ts +0 -52
  364. package/src/public/hooks/useTabCompletion.ts +0 -124
  365. package/src/public/hooks/useTodos.ts +0 -93
  366. package/src/public/hooks/useUserAvatar.ts +0 -54
  367. package/src/public/index.tsx +0 -10
  368. package/src/public/lib/utils.ts +0 -6
  369. package/src/public/styles/dockview-theme.css +0 -459
  370. package/src/public/styles/tailwind.css +0 -4396
  371. package/src/public/types/electron.d.ts +0 -18
  372. package/src/public/types/message.ts +0 -51
  373. package/src/public/utils/avatar-service.ts +0 -73
  374. package/src/public/utils/color-presets.ts +0 -940
  375. package/src/public/utils/font-presets.ts +0 -362
  376. package/src/public/utils/formatDuration.ts +0 -14
  377. package/src/public/utils/markdown.ts +0 -249
  378. package/src/public/utils/messageFilters.ts +0 -128
  379. package/src/public/utils/slash-commands.ts +0 -353
  380. package/src/public/utils/subagent-display.ts +0 -146
  381. package/src/public/utils/syntax.ts +0 -219
  382. package/src/public/utils/toolIntentSummarizer.ts +0 -199
  383. package/src/public/utils/toolStackGrouper.ts +0 -106
  384. package/src/public/utils/toolTypeColors.ts +0 -45
@@ -1,379 +0,0 @@
1
- /**
2
- * FileTree - Display modified files in a tree structure
3
- *
4
- * Story MSSCI-12710 - FileTree Component
5
- *
6
- * Features:
7
- * - Display modified files with paths and status indicators
8
- * - Group files by directory with collapsible sections
9
- * - Click to open file in DiffViewer
10
- * - Badge showing count of modified files
11
- * - Real-time updates as files change
12
- */
13
-
14
- import React, { useState, useCallback, useMemo, useRef, useEffect, KeyboardEvent } from 'react';
15
- import { Button } from '@/components/ui/button';
16
- import { Badge } from '@/components/ui/badge';
17
- import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
18
- import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible";
19
-
20
- // =============================================================================
21
- // Types
22
- // =============================================================================
23
-
24
- export type FileStatus = 'created' | 'modified' | 'deleted';
25
-
26
- export interface FileChange {
27
- path: string;
28
- status: FileStatus;
29
- }
30
-
31
- export interface FileTreeProps {
32
- files: FileChange[];
33
- onFileClick?: (file: FileChange) => void;
34
- }
35
-
36
- // =============================================================================
37
- // Utility Functions
38
- // =============================================================================
39
-
40
- function getDirectory(path: string): string {
41
- const lastSlash = path.lastIndexOf('/');
42
- if (lastSlash === -1) return 'root';
43
- return path.substring(0, lastSlash);
44
- }
45
-
46
- function getFileName(path: string): string {
47
- const lastSlash = path.lastIndexOf('/');
48
- if (lastSlash === -1) return path;
49
- return path.substring(lastSlash + 1);
50
- }
51
-
52
- function groupFilesByDirectory(files: FileChange[]): Map<string, FileChange[]> {
53
- const groups = new Map<string, FileChange[]>();
54
-
55
- for (const file of files) {
56
- const dir = getDirectory(file.path);
57
- const existing = groups.get(dir) || [];
58
- existing.push(file);
59
- groups.set(dir, existing);
60
- }
61
-
62
- return groups;
63
- }
64
-
65
- function countByStatus(files: FileChange[]): { created: number; modified: number; deleted: number } {
66
- return files.reduce(
67
- (acc, file) => {
68
- const status = file.status || 'modified';
69
- acc[status] = (acc[status] || 0) + 1;
70
- return acc;
71
- },
72
- { created: 0, modified: 0, deleted: 0 }
73
- );
74
- }
75
-
76
- function formatStatusBreakdown(counts: { created: number; modified: number; deleted: number }): string {
77
- const parts: string[] = [];
78
- if (counts.created > 0) parts.push(`${counts.created} created`);
79
- if (counts.modified > 0) parts.push(`${counts.modified} modified`);
80
- if (counts.deleted > 0) parts.push(`${counts.deleted} deleted`);
81
- return parts.join(', ');
82
- }
83
-
84
- // =============================================================================
85
- // Status Icon Component
86
- // =============================================================================
87
-
88
- interface StatusIconProps {
89
- status: FileStatus | undefined;
90
- }
91
-
92
- function StatusIcon({ status }: StatusIconProps): React.ReactElement {
93
- const safeStatus = status || 'modified';
94
-
95
- return (
96
- <span
97
- data-testid={`status-${safeStatus}`}
98
- className={`status-icon status-${safeStatus}`}
99
- aria-hidden="true"
100
- >
101
- {safeStatus === 'created' && '+'}
102
- {safeStatus === 'modified' && '~'}
103
- {safeStatus === 'deleted' && '-'}
104
- </span>
105
- );
106
- }
107
-
108
- // =============================================================================
109
- // File Item Component
110
- // =============================================================================
111
-
112
- interface FileItemProps {
113
- file: FileChange;
114
- onFileClick?: (file: FileChange) => void;
115
- isFocused: boolean;
116
- onFocus: () => void;
117
- }
118
-
119
- function FileItem({ file, onFileClick, isFocused, onFocus }: FileItemProps): React.ReactElement {
120
- const status = file.status || 'modified';
121
- const fileName = getFileName(file.path);
122
- const [hasFocus, setHasFocus] = useState(false);
123
-
124
- const handleClick = useCallback(() => {
125
- onFileClick?.(file);
126
- }, [file, onFileClick]);
127
-
128
- const handleKeyDown = useCallback(
129
- (e: KeyboardEvent<HTMLDivElement>) => {
130
- if (e.key === 'Enter' || e.key === ' ') {
131
- e.preventDefault();
132
- onFileClick?.(file);
133
- }
134
- },
135
- [file, onFileClick]
136
- );
137
-
138
- const handleFocus = useCallback(() => {
139
- setHasFocus(true);
140
- onFocus();
141
- }, [onFocus]);
142
-
143
- const handleBlur = useCallback(() => {
144
- setHasFocus(false);
145
- }, []);
146
-
147
- return (
148
- <Tooltip>
149
- <TooltipTrigger asChild>
150
- <div
151
- role="treeitem"
152
- data-testid="file-item"
153
- className={`file-item file-${status}${isFocused || hasFocus ? ' focused' : ''}`}
154
- tabIndex={0}
155
- aria-label={`${fileName}, ${status}`}
156
- onClick={handleClick}
157
- onKeyDown={handleKeyDown}
158
- onFocus={handleFocus}
159
- onBlur={handleBlur}
160
- >
161
- <StatusIcon status={file.status} />
162
- <span className="file-name">{fileName}</span>
163
- </div>
164
- </TooltipTrigger>
165
- <TooltipContent>{file.path}</TooltipContent>
166
- </Tooltip>
167
- );
168
- }
169
-
170
- // =============================================================================
171
- // Directory Section Component
172
- // =============================================================================
173
-
174
- interface DirectorySectionProps {
175
- directory: string;
176
- files: FileChange[];
177
- isExpanded: boolean;
178
- onToggle: () => void;
179
- onFileClick?: (file: FileChange) => void;
180
- focusedPath: string | null;
181
- onFileFocus: (path: string) => void;
182
- }
183
-
184
- function DirectorySection({
185
- directory,
186
- files,
187
- isExpanded,
188
- onToggle,
189
- onFileClick,
190
- focusedPath,
191
- onFileFocus,
192
- }: DirectorySectionProps): React.ReactElement {
193
- return (
194
- <Collapsible
195
- open={isExpanded}
196
- onOpenChange={() => onToggle()}
197
- asChild
198
- >
199
- <div
200
- role="group"
201
- data-testid={`directory-${directory}`}
202
- className="directory-section"
203
- >
204
- <CollapsibleTrigger asChild>
205
- <div className="directory-header">
206
- <span
207
- className="directory-toggle"
208
- aria-expanded={isExpanded}
209
- aria-label={isExpanded ? 'Collapse' : 'Expand'}
210
- >
211
- <span className="toggle-icon">{isExpanded ? '▼' : '▶'}</span>
212
- </span>
213
- <span className="directory-name">{directory === 'root' ? '/' : directory}</span>
214
- <span className="directory-count">{files.length}</span>
215
- </div>
216
- </CollapsibleTrigger>
217
- <CollapsibleContent>
218
- <div className="directory-files">
219
- {files.map((file, index) => (
220
- <FileItem
221
- key={`${file.path}-${index}`}
222
- file={file}
223
- onFileClick={onFileClick}
224
- isFocused={focusedPath === file.path}
225
- onFocus={() => onFileFocus(file.path)}
226
- />
227
- ))}
228
- </div>
229
- </CollapsibleContent>
230
- </div>
231
- </Collapsible>
232
- );
233
- }
234
-
235
- // =============================================================================
236
- // FileTree Component
237
- // =============================================================================
238
-
239
- export function FileTree({ files, onFileClick }: FileTreeProps): React.ReactElement {
240
- const [collapsedDirs, setCollapsedDirs] = useState<Set<string>>(new Set());
241
- const [focusedPath, setFocusedPath] = useState<string | null>(null);
242
- const previousFocusedRef = useRef<string | null>(null);
243
- const treeRef = useRef<HTMLDivElement>(null);
244
-
245
- // Group files by directory
246
- const groupedFiles = useMemo(() => groupFilesByDirectory(files), [files]);
247
-
248
- // Calculate status counts
249
- const statusCounts = useMemo(() => countByStatus(files), [files]);
250
- const statusTooltip = useMemo(() => formatStatusBreakdown(statusCounts), [statusCounts]);
251
-
252
- // Get sorted directory names
253
- const directories = useMemo(() => {
254
- const dirs = Array.from(groupedFiles.keys()).sort();
255
- // Move 'root' to the end for display
256
- const rootIndex = dirs.indexOf('root');
257
- if (rootIndex > -1) {
258
- dirs.splice(rootIndex, 1);
259
- dirs.push('root');
260
- }
261
- return dirs;
262
- }, [groupedFiles]);
263
-
264
- // Preserve focus when files update
265
- useEffect(() => {
266
- if (focusedPath) {
267
- previousFocusedRef.current = focusedPath;
268
- }
269
- }, [focusedPath]);
270
-
271
- useEffect(() => {
272
- // If the previously focused file still exists, try to refocus it
273
- if (previousFocusedRef.current) {
274
- const stillExists = files.some((f) => f.path === previousFocusedRef.current);
275
- if (stillExists) {
276
- // The focus will be maintained by the DOM if the element still exists
277
- setFocusedPath(previousFocusedRef.current);
278
- }
279
- }
280
- }, [files]);
281
-
282
- const handleToggle = useCallback((dir: string) => {
283
- setCollapsedDirs((prev) => {
284
- const next = new Set(prev);
285
- if (next.has(dir)) {
286
- next.delete(dir);
287
- } else {
288
- next.add(dir);
289
- }
290
- return next;
291
- });
292
- }, []);
293
-
294
- const handleFileFocus = useCallback((path: string) => {
295
- setFocusedPath(path);
296
- }, []);
297
-
298
- // Handle keyboard navigation
299
- const handleKeyDown = useCallback((e: KeyboardEvent) => {
300
- if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp') return;
301
-
302
- e.preventDefault();
303
-
304
- // Get all visible tree items
305
- const treeItems = treeRef.current?.querySelectorAll('[role="treeitem"]');
306
- if (!treeItems || treeItems.length === 0) return;
307
-
308
- const items = Array.from(treeItems) as HTMLElement[];
309
- const currentIndex = items.findIndex(item => document.activeElement === item);
310
-
311
- let nextIndex: number;
312
- if (e.key === 'ArrowDown') {
313
- nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;
314
- } else {
315
- nextIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;
316
- }
317
-
318
- items[nextIndex]?.focus();
319
- }, []);
320
-
321
- // Empty state
322
- if (files.length === 0) {
323
- return (
324
- <TooltipProvider delayDuration={300}>
325
- <div role="tree" aria-label="Changed files" className="filetree">
326
- <Badge
327
- variant="secondary"
328
- data-testid="file-count-badge"
329
- className="file-count-badge"
330
- aria-label="0 files changed"
331
- >
332
- 0
333
- </Badge>
334
- <div className="empty-state">No files changed</div>
335
- </div>
336
- </TooltipProvider>
337
- );
338
- }
339
-
340
- return (
341
- <TooltipProvider delayDuration={300}>
342
- <div
343
- ref={treeRef}
344
- role="tree"
345
- aria-label="Changed files"
346
- className="filetree"
347
- onKeyDown={handleKeyDown}
348
- >
349
- <Tooltip>
350
- <TooltipTrigger asChild>
351
- <Badge
352
- variant="secondary"
353
- data-testid="file-count-badge"
354
- className="file-count-badge"
355
- aria-label={`${files.length} files changed`}
356
- >
357
- {files.length}
358
- </Badge>
359
- </TooltipTrigger>
360
- <TooltipContent>{statusTooltip}</TooltipContent>
361
- </Tooltip>
362
- {directories.map((dir) => (
363
- <DirectorySection
364
- key={dir}
365
- directory={dir}
366
- files={groupedFiles.get(dir) || []}
367
- isExpanded={!collapsedDirs.has(dir)}
368
- onToggle={() => handleToggle(dir)}
369
- onFileClick={onFileClick}
370
- focusedPath={focusedPath}
371
- onFileFocus={handleFileFocus}
372
- />
373
- ))}
374
- </div>
375
- </TooltipProvider>
376
- );
377
- }
378
-
379
- export default FileTree;
@@ -1,276 +0,0 @@
1
- /**
2
- * FontPicker Component Styles
3
- *
4
- * Story MSSCI-12769 - Font Customization
5
- */
6
-
7
- /* =============================================================================
8
- Font Picker Container
9
- ============================================================================= */
10
-
11
- .font-picker {
12
- position: relative;
13
- display: flex;
14
- flex-direction: column;
15
- gap: 0.5rem;
16
- }
17
-
18
- /* =============================================================================
19
- Font Picker Button
20
- ============================================================================= */
21
-
22
- .font-picker-button {
23
- display: flex;
24
- align-items: center;
25
- justify-content: space-between;
26
- gap: 0.5rem;
27
- padding: 0.5rem 0.75rem;
28
- background: var(--bg-tertiary, #0f0f1a);
29
- border: 1px solid var(--border, #27272a);
30
- border-radius: 0.375rem;
31
- color: var(--text-primary, #e4e4e7);
32
- cursor: pointer;
33
- min-width: 150px;
34
- transition: border-color 0.15s ease, background-color 0.15s ease;
35
- }
36
-
37
- .font-picker-button:hover {
38
- border-color: var(--border-focus);
39
- background: var(--bg-secondary);
40
- }
41
-
42
- .font-picker-button:focus {
43
- outline: none;
44
- border-color: var(--accent);
45
- box-shadow: 0 0 0 2px rgba(var(--accent-rgb, 79, 70, 229), 0.2);
46
- }
47
-
48
- .font-picker-current {
49
- display: flex;
50
- align-items: center;
51
- gap: 0.5rem;
52
- overflow: hidden;
53
- }
54
-
55
- .font-picker-name {
56
- white-space: nowrap;
57
- overflow: hidden;
58
- text-overflow: ellipsis;
59
- }
60
-
61
- .font-picker-chevron {
62
- font-size: 0.625rem;
63
- color: var(--text-muted);
64
- flex-shrink: 0;
65
- }
66
-
67
- /* =============================================================================
68
- Font Picker Menu
69
- ============================================================================= */
70
-
71
- .font-picker-menu {
72
- position: absolute;
73
- top: 100%;
74
- left: 0;
75
- right: 0;
76
- z-index: 50;
77
- margin-top: 0.25rem;
78
- padding: 0.25rem;
79
- background: var(--bg-secondary, #16213e);
80
- border: 1px solid var(--border, #27272a);
81
- border-radius: 0.375rem;
82
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.5);
83
- display: none;
84
- max-height: 320px;
85
- overflow-y: auto;
86
- min-width: 220px;
87
- }
88
-
89
- .font-picker-menu.open {
90
- display: block;
91
- }
92
-
93
- /* =============================================================================
94
- Font Picker Options
95
- ============================================================================= */
96
-
97
- .font-picker-option {
98
- display: flex;
99
- align-items: center;
100
- justify-content: space-between;
101
- width: 100%;
102
- padding: 0.5rem 0.75rem;
103
- background: var(--bg-secondary, #16213e);
104
- border: none;
105
- border-radius: 0.25rem;
106
- color: var(--text-primary, #e4e4e7);
107
- cursor: pointer;
108
- text-align: left;
109
- transition: background-color 0.15s ease;
110
- }
111
-
112
- .font-picker-option:hover,
113
- .font-picker-option.focused {
114
- background: var(--bg-tertiary, #0f0f1a);
115
- }
116
-
117
- .font-picker-option.active {
118
- background: var(--accent);
119
- color: white;
120
- }
121
-
122
- .font-picker-option.active:hover {
123
- background: var(--accent-hover);
124
- }
125
-
126
- .font-name {
127
- flex: 1;
128
- }
129
-
130
- .font-preview {
131
- font-size: 1rem;
132
- color: var(--text-muted);
133
- margin-left: 0.5rem;
134
- }
135
-
136
- .font-picker-option.active .font-preview {
137
- color: rgba(255, 255, 255, 0.8);
138
- }
139
-
140
- .font-check {
141
- margin-left: 0.5rem;
142
- font-size: 0.75rem;
143
- }
144
-
145
- /* =============================================================================
146
- Custom Font Input
147
- ============================================================================= */
148
-
149
- .font-picker-custom-input {
150
- margin-top: 0.25rem;
151
- padding: 0.5rem 0.75rem;
152
- background: var(--bg-tertiary);
153
- border: 1px solid var(--border);
154
- border-radius: 0.375rem;
155
- color: var(--text-primary);
156
- font-size: 0.875rem;
157
- width: 100%;
158
- }
159
-
160
- .font-picker-custom-input:focus {
161
- outline: none;
162
- border-color: var(--accent);
163
- box-shadow: 0 0 0 2px rgba(var(--accent-rgb, 79, 70, 229), 0.2);
164
- }
165
-
166
- .font-picker-custom-input::placeholder {
167
- color: var(--text-muted);
168
- }
169
-
170
- /* =============================================================================
171
- Font Size Picker
172
- ============================================================================= */
173
-
174
- .font-size-picker {
175
- display: flex;
176
- gap: 0;
177
- border: 1px solid var(--border);
178
- border-radius: 0.375rem;
179
- overflow: hidden;
180
- }
181
-
182
- .font-size-option {
183
- padding: 0.375rem 0.625rem;
184
- background: var(--bg-tertiary, #0f0f1a);
185
- border: none;
186
- border-right: 1px solid var(--border, #27272a);
187
- color: var(--text-secondary, #a1a1aa);
188
- font-size: 0.75rem;
189
- font-weight: 500;
190
- cursor: pointer;
191
- transition: background-color 0.15s ease, color 0.15s ease;
192
- }
193
-
194
- .font-size-option:last-child {
195
- border-right: none;
196
- }
197
-
198
- .font-size-option:hover {
199
- background: var(--bg-secondary);
200
- color: var(--text-primary);
201
- }
202
-
203
- .font-size-option.active {
204
- background: var(--accent);
205
- color: white;
206
- }
207
-
208
- .font-size-option:focus {
209
- outline: none;
210
- box-shadow: inset 0 0 0 2px rgba(var(--accent-rgb, 79, 70, 229), 0.4);
211
- }
212
-
213
- /* =============================================================================
214
- Search Input
215
- ============================================================================= */
216
-
217
- .font-picker-search {
218
- padding: 0.25rem;
219
- border-bottom: 1px solid var(--border, #27272a);
220
- position: sticky;
221
- top: 0;
222
- background: var(--bg-secondary, #16213e);
223
- z-index: 1;
224
- }
225
-
226
- .font-picker-search-input {
227
- width: 100%;
228
- padding: 0.375rem 0.5rem;
229
- background: var(--bg-tertiary, #0f0f1a);
230
- border: 1px solid var(--border, #27272a);
231
- border-radius: 0.25rem;
232
- color: var(--text-primary, #e4e4e7);
233
- font-size: 0.8125rem;
234
- box-sizing: border-box;
235
- }
236
-
237
- .font-picker-search-input:focus {
238
- outline: none;
239
- border-color: var(--accent);
240
- }
241
-
242
- .font-picker-search-input::placeholder {
243
- color: var(--text-muted, #71717a);
244
- }
245
-
246
- /* =============================================================================
247
- Group Headers
248
- ============================================================================= */
249
-
250
- .font-picker-group-header {
251
- padding: 0.375rem 0.75rem 0.25rem;
252
- font-size: 0.625rem;
253
- font-weight: 600;
254
- text-transform: uppercase;
255
- letter-spacing: 0.05em;
256
- color: var(--text-muted, #71717a);
257
- user-select: none;
258
- }
259
-
260
- .font-picker-group-header:not(:first-child) {
261
- margin-top: 0.25rem;
262
- border-top: 1px solid var(--border, #27272a);
263
- padding-top: 0.5rem;
264
- }
265
-
266
- /* =============================================================================
267
- Empty State
268
- ============================================================================= */
269
-
270
- .font-picker-empty {
271
- padding: 0.75rem;
272
- text-align: center;
273
- color: var(--text-muted, #71717a);
274
- font-size: 0.8125rem;
275
- font-style: italic;
276
- }