groove-dev 0.27.86 → 0.27.88

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 (538) hide show
  1. package/CLAUDE.md +11 -0
  2. package/moe-training/client/scrubber.js +4 -2
  3. package/moe-training/client/step-classifier.js +17 -0
  4. package/moe-training/client/trajectory-capture.js +80 -6
  5. package/moe-training/client/transmission-queue.js +11 -0
  6. package/moe-training/test/client/scrubber.test.js +14 -4
  7. package/moe-training/test/client/step-classifier.test.js +47 -0
  8. package/moe-training/test/client/transmission-queue.test.js +33 -0
  9. package/node_modules/@groove-dev/cli/bin/groove.js +10 -1
  10. package/node_modules/@groove-dev/cli/package.json +1 -1
  11. package/node_modules/@groove-dev/cli/src/commands/connect.js +116 -205
  12. package/node_modules/@groove-dev/cli/src/commands/disconnect.js +38 -62
  13. package/node_modules/@groove-dev/cli/src/commands/remotes.js +75 -0
  14. package/node_modules/@groove-dev/daemon/package.json +1 -1
  15. package/node_modules/@groove-dev/daemon/src/api.js +115 -7
  16. package/node_modules/@groove-dev/daemon/src/conversations.js +29 -3
  17. package/node_modules/@groove-dev/daemon/src/process.js +56 -1
  18. package/node_modules/@groove-dev/daemon/src/providers/codex.js +28 -10
  19. package/node_modules/@groove-dev/daemon/src/registry.js +30 -0
  20. package/node_modules/@groove-dev/daemon/src/validate.js +23 -0
  21. package/node_modules/@groove-dev/gui/dist/assets/index-BSqk8cbI.css +1 -0
  22. package/node_modules/@groove-dev/gui/dist/assets/index-B_igwWvq.js +8642 -0
  23. package/node_modules/@groove-dev/gui/dist/index.html +2 -2
  24. package/node_modules/@groove-dev/gui/package.json +2 -1
  25. package/node_modules/@groove-dev/gui/src/components/agents/agent-file-tree.jsx +254 -0
  26. package/node_modules/@groove-dev/gui/src/components/agents/code-review.jsx +177 -0
  27. package/node_modules/@groove-dev/gui/src/components/agents/diff-viewer.jsx +148 -0
  28. package/node_modules/@groove-dev/gui/src/components/agents/workspace-mode.jsx +377 -0
  29. package/node_modules/@groove-dev/gui/src/components/chat/chat-input.jsx +117 -40
  30. package/node_modules/@groove-dev/gui/src/components/chat/chat-messages.jsx +10 -13
  31. package/node_modules/@groove-dev/gui/src/components/chat/chat-view.jsx +26 -1
  32. package/node_modules/@groove-dev/gui/src/components/chat/conversation-list.jsx +14 -14
  33. package/node_modules/@groove-dev/gui/src/components/chat/model-picker.jsx +5 -0
  34. package/node_modules/@groove-dev/gui/src/components/preview/preview-workspace.jsx +6 -5
  35. package/node_modules/@groove-dev/gui/src/components/preview/screenshot-overlay.jsx +41 -29
  36. package/node_modules/@groove-dev/gui/src/stores/groove.js +138 -3
  37. package/node_modules/@groove-dev/gui/src/views/agents.jsx +36 -3
  38. package/node_modules/@groove-dev/gui/src/views/settings.jsx +104 -26
  39. package/node_modules/base64-arraybuffer/CHANGELOG.md +28 -0
  40. package/node_modules/base64-arraybuffer/LICENSE +22 -0
  41. package/node_modules/base64-arraybuffer/README.md +27 -0
  42. package/node_modules/base64-arraybuffer/dist/base64-arraybuffer.es5.js +50 -0
  43. package/node_modules/base64-arraybuffer/dist/base64-arraybuffer.es5.js.map +1 -0
  44. package/node_modules/base64-arraybuffer/dist/base64-arraybuffer.umd.js +61 -0
  45. package/node_modules/base64-arraybuffer/dist/base64-arraybuffer.umd.js.map +1 -0
  46. package/node_modules/base64-arraybuffer/dist/lib/index.js +48 -0
  47. package/node_modules/base64-arraybuffer/dist/lib/index.js.map +1 -0
  48. package/node_modules/base64-arraybuffer/dist/types/index.d.ts +2 -0
  49. package/node_modules/base64-arraybuffer/package.json +54 -0
  50. package/node_modules/base64-arraybuffer/rollup.config.ts +40 -0
  51. package/node_modules/css-line-break/CHANGELOG.md +58 -0
  52. package/node_modules/css-line-break/LICENSE +22 -0
  53. package/node_modules/css-line-break/README.md +66 -0
  54. package/node_modules/css-line-break/dist/css-line-break.es5.js +706 -0
  55. package/node_modules/css-line-break/dist/css-line-break.es5.js.map +1 -0
  56. package/node_modules/css-line-break/dist/css-line-break.umd.js +718 -0
  57. package/node_modules/css-line-break/dist/css-line-break.umd.js.map +1 -0
  58. package/node_modules/css-line-break/dist/lib/LineBreak.js +516 -0
  59. package/node_modules/css-line-break/dist/lib/LineBreak.js.map +1 -0
  60. package/node_modules/css-line-break/dist/lib/Util.js +109 -0
  61. package/node_modules/css-line-break/dist/lib/Util.js.map +1 -0
  62. package/node_modules/css-line-break/dist/lib/index.js +9 -0
  63. package/node_modules/css-line-break/dist/lib/index.js.map +1 -0
  64. package/node_modules/css-line-break/dist/lib/linebreak-trie.js +6 -0
  65. package/node_modules/css-line-break/dist/lib/linebreak-trie.js.map +1 -0
  66. package/node_modules/css-line-break/dist/types/LineBreak.d.ts +38 -0
  67. package/node_modules/css-line-break/dist/types/Util.d.ts +5 -0
  68. package/node_modules/css-line-break/dist/types/index.d.ts +2 -0
  69. package/node_modules/css-line-break/dist/types/linebreak-trie.d.ts +2 -0
  70. package/node_modules/css-line-break/package.json +61 -0
  71. package/node_modules/css-line-break/rollup.config.ts +40 -0
  72. package/node_modules/html2canvas/CHANGELOG.md +566 -0
  73. package/node_modules/html2canvas/LICENSE +22 -0
  74. package/node_modules/html2canvas/README.md +73 -0
  75. package/node_modules/html2canvas/dist/html2canvas.esm.js +7822 -0
  76. package/node_modules/html2canvas/dist/html2canvas.esm.js.map +1 -0
  77. package/node_modules/html2canvas/dist/html2canvas.js +7830 -0
  78. package/node_modules/html2canvas/dist/html2canvas.js.map +1 -0
  79. package/node_modules/html2canvas/dist/html2canvas.min.js +20 -0
  80. package/node_modules/html2canvas/dist/lib/__tests__/index.js +144 -0
  81. package/node_modules/html2canvas/dist/lib/__tests__/index.js.map +1 -0
  82. package/node_modules/html2canvas/dist/lib/core/__mocks__/cache-storage.js +10 -0
  83. package/node_modules/html2canvas/dist/lib/core/__mocks__/cache-storage.js.map +1 -0
  84. package/node_modules/html2canvas/dist/lib/core/__mocks__/context.js +22 -0
  85. package/node_modules/html2canvas/dist/lib/core/__mocks__/context.js.map +1 -0
  86. package/node_modules/html2canvas/dist/lib/core/__mocks__/features.js +12 -0
  87. package/node_modules/html2canvas/dist/lib/core/__mocks__/features.js.map +1 -0
  88. package/node_modules/html2canvas/dist/lib/core/__mocks__/logger.js +24 -0
  89. package/node_modules/html2canvas/dist/lib/core/__mocks__/logger.js.map +1 -0
  90. package/node_modules/html2canvas/dist/lib/core/__tests__/cache-storage.js +420 -0
  91. package/node_modules/html2canvas/dist/lib/core/__tests__/cache-storage.js.map +1 -0
  92. package/node_modules/html2canvas/dist/lib/core/__tests__/logger.js +28 -0
  93. package/node_modules/html2canvas/dist/lib/core/__tests__/logger.js.map +1 -0
  94. package/node_modules/html2canvas/dist/lib/core/bitwise.js +6 -0
  95. package/node_modules/html2canvas/dist/lib/core/bitwise.js.map +1 -0
  96. package/node_modules/html2canvas/dist/lib/core/cache-storage.js +198 -0
  97. package/node_modules/html2canvas/dist/lib/core/cache-storage.js.map +1 -0
  98. package/node_modules/html2canvas/dist/lib/core/context.js +18 -0
  99. package/node_modules/html2canvas/dist/lib/core/context.js.map +1 -0
  100. package/node_modules/html2canvas/dist/lib/core/debugger.js +25 -0
  101. package/node_modules/html2canvas/dist/lib/core/debugger.js.map +1 -0
  102. package/node_modules/html2canvas/dist/lib/core/features.js +193 -0
  103. package/node_modules/html2canvas/dist/lib/core/features.js.map +1 -0
  104. package/node_modules/html2canvas/dist/lib/core/logger.js +88 -0
  105. package/node_modules/html2canvas/dist/lib/core/logger.js.map +1 -0
  106. package/node_modules/html2canvas/dist/lib/core/util.js +5 -0
  107. package/node_modules/html2canvas/dist/lib/core/util.js.map +1 -0
  108. package/node_modules/html2canvas/dist/lib/css/IPropertyDescriptor.js +3 -0
  109. package/node_modules/html2canvas/dist/lib/css/IPropertyDescriptor.js.map +1 -0
  110. package/node_modules/html2canvas/dist/lib/css/ITypeDescriptor.js +3 -0
  111. package/node_modules/html2canvas/dist/lib/css/ITypeDescriptor.js.map +1 -0
  112. package/node_modules/html2canvas/dist/lib/css/index.js +216 -0
  113. package/node_modules/html2canvas/dist/lib/css/index.js.map +1 -0
  114. package/node_modules/html2canvas/dist/lib/css/layout/__mocks__/bounds.js +9 -0
  115. package/node_modules/html2canvas/dist/lib/css/layout/__mocks__/bounds.js.map +1 -0
  116. package/node_modules/html2canvas/dist/lib/css/layout/bounds.js +42 -0
  117. package/node_modules/html2canvas/dist/lib/css/layout/bounds.js.map +1 -0
  118. package/node_modules/html2canvas/dist/lib/css/layout/text.js +137 -0
  119. package/node_modules/html2canvas/dist/lib/css/layout/text.js.map +1 -0
  120. package/node_modules/html2canvas/dist/lib/css/property-descriptors/__tests__/background-tests.js +48 -0
  121. package/node_modules/html2canvas/dist/lib/css/property-descriptors/__tests__/background-tests.js.map +1 -0
  122. package/node_modules/html2canvas/dist/lib/css/property-descriptors/__tests__/font-family.js +25 -0
  123. package/node_modules/html2canvas/dist/lib/css/property-descriptors/__tests__/font-family.js.map +1 -0
  124. package/node_modules/html2canvas/dist/lib/css/property-descriptors/__tests__/paint-order.js +88 -0
  125. package/node_modules/html2canvas/dist/lib/css/property-descriptors/__tests__/paint-order.js.map +1 -0
  126. package/node_modules/html2canvas/dist/lib/css/property-descriptors/__tests__/text-shadow.js +94 -0
  127. package/node_modules/html2canvas/dist/lib/css/property-descriptors/__tests__/text-shadow.js.map +1 -0
  128. package/node_modules/html2canvas/dist/lib/css/property-descriptors/__tests__/transform-tests.js +18 -0
  129. package/node_modules/html2canvas/dist/lib/css/property-descriptors/__tests__/transform-tests.js.map +1 -0
  130. package/node_modules/html2canvas/dist/lib/css/property-descriptors/background-clip.js +24 -0
  131. package/node_modules/html2canvas/dist/lib/css/property-descriptors/background-clip.js.map +1 -0
  132. package/node_modules/html2canvas/dist/lib/css/property-descriptors/background-color.js +11 -0
  133. package/node_modules/html2canvas/dist/lib/css/property-descriptors/background-color.js.map +1 -0
  134. package/node_modules/html2canvas/dist/lib/css/property-descriptors/background-image.js +24 -0
  135. package/node_modules/html2canvas/dist/lib/css/property-descriptors/background-image.js.map +1 -0
  136. package/node_modules/html2canvas/dist/lib/css/property-descriptors/background-origin.js +24 -0
  137. package/node_modules/html2canvas/dist/lib/css/property-descriptors/background-origin.js.map +1 -0
  138. package/node_modules/html2canvas/dist/lib/css/property-descriptors/background-position.js +17 -0
  139. package/node_modules/html2canvas/dist/lib/css/property-descriptors/background-position.js.map +1 -0
  140. package/node_modules/html2canvas/dist/lib/css/property-descriptors/background-repeat.js +36 -0
  141. package/node_modules/html2canvas/dist/lib/css/property-descriptors/background-repeat.js.map +1 -0
  142. package/node_modules/html2canvas/dist/lib/css/property-descriptors/background-size.js +24 -0
  143. package/node_modules/html2canvas/dist/lib/css/property-descriptors/background-size.js.map +1 -0
  144. package/node_modules/html2canvas/dist/lib/css/property-descriptors/border-color.js +15 -0
  145. package/node_modules/html2canvas/dist/lib/css/property-descriptors/border-color.js.map +1 -0
  146. package/node_modules/html2canvas/dist/lib/css/property-descriptors/border-radius.js +18 -0
  147. package/node_modules/html2canvas/dist/lib/css/property-descriptors/border-radius.js.map +1 -0
  148. package/node_modules/html2canvas/dist/lib/css/property-descriptors/border-style.js +27 -0
  149. package/node_modules/html2canvas/dist/lib/css/property-descriptors/border-style.js.map +1 -0
  150. package/node_modules/html2canvas/dist/lib/css/property-descriptors/border-width.js +21 -0
  151. package/node_modules/html2canvas/dist/lib/css/property-descriptors/border-width.js.map +1 -0
  152. package/node_modules/html2canvas/dist/lib/css/property-descriptors/box-shadow.js +55 -0
  153. package/node_modules/html2canvas/dist/lib/css/property-descriptors/box-shadow.js.map +1 -0
  154. package/node_modules/html2canvas/dist/lib/css/property-descriptors/color.js +11 -0
  155. package/node_modules/html2canvas/dist/lib/css/property-descriptors/color.js.map +1 -0
  156. package/node_modules/html2canvas/dist/lib/css/property-descriptors/content.js +20 -0
  157. package/node_modules/html2canvas/dist/lib/css/property-descriptors/content.js.map +1 -0
  158. package/node_modules/html2canvas/dist/lib/css/property-descriptors/counter-increment.js +31 -0
  159. package/node_modules/html2canvas/dist/lib/css/property-descriptors/counter-increment.js.map +1 -0
  160. package/node_modules/html2canvas/dist/lib/css/property-descriptors/counter-reset.js +27 -0
  161. package/node_modules/html2canvas/dist/lib/css/property-descriptors/counter-reset.js.map +1 -0
  162. package/node_modules/html2canvas/dist/lib/css/property-descriptors/direction.js +19 -0
  163. package/node_modules/html2canvas/dist/lib/css/property-descriptors/direction.js.map +1 -0
  164. package/node_modules/html2canvas/dist/lib/css/property-descriptors/display.js +82 -0
  165. package/node_modules/html2canvas/dist/lib/css/property-descriptors/display.js.map +1 -0
  166. package/node_modules/html2canvas/dist/lib/css/property-descriptors/duration.js +15 -0
  167. package/node_modules/html2canvas/dist/lib/css/property-descriptors/duration.js.map +1 -0
  168. package/node_modules/html2canvas/dist/lib/css/property-descriptors/float.js +23 -0
  169. package/node_modules/html2canvas/dist/lib/css/property-descriptors/float.js.map +1 -0
  170. package/node_modules/html2canvas/dist/lib/css/property-descriptors/font-family.js +33 -0
  171. package/node_modules/html2canvas/dist/lib/css/property-descriptors/font-family.js.map +1 -0
  172. package/node_modules/html2canvas/dist/lib/css/property-descriptors/font-size.js +11 -0
  173. package/node_modules/html2canvas/dist/lib/css/property-descriptors/font-size.js.map +1 -0
  174. package/node_modules/html2canvas/dist/lib/css/property-descriptors/font-style.js +21 -0
  175. package/node_modules/html2canvas/dist/lib/css/property-descriptors/font-style.js.map +1 -0
  176. package/node_modules/html2canvas/dist/lib/css/property-descriptors/font-variant.js +14 -0
  177. package/node_modules/html2canvas/dist/lib/css/property-descriptors/font-variant.js.map +1 -0
  178. package/node_modules/html2canvas/dist/lib/css/property-descriptors/font-weight.js +26 -0
  179. package/node_modules/html2canvas/dist/lib/css/property-descriptors/font-weight.js.map +1 -0
  180. package/node_modules/html2canvas/dist/lib/css/property-descriptors/letter-spacing.js +22 -0
  181. package/node_modules/html2canvas/dist/lib/css/property-descriptors/letter-spacing.js.map +1 -0
  182. package/node_modules/html2canvas/dist/lib/css/property-descriptors/line-break.js +24 -0
  183. package/node_modules/html2canvas/dist/lib/css/property-descriptors/line-break.js.map +1 -0
  184. package/node_modules/html2canvas/dist/lib/css/property-descriptors/line-height.js +25 -0
  185. package/node_modules/html2canvas/dist/lib/css/property-descriptors/line-height.js.map +1 -0
  186. package/node_modules/html2canvas/dist/lib/css/property-descriptors/list-style-image.js +17 -0
  187. package/node_modules/html2canvas/dist/lib/css/property-descriptors/list-style-image.js.map +1 -0
  188. package/node_modules/html2canvas/dist/lib/css/property-descriptors/list-style-position.js +19 -0
  189. package/node_modules/html2canvas/dist/lib/css/property-descriptors/list-style-position.js.map +1 -0
  190. package/node_modules/html2canvas/dist/lib/css/property-descriptors/list-style-type.js +123 -0
  191. package/node_modules/html2canvas/dist/lib/css/property-descriptors/list-style-type.js.map +1 -0
  192. package/node_modules/html2canvas/dist/lib/css/property-descriptors/margin.js +14 -0
  193. package/node_modules/html2canvas/dist/lib/css/property-descriptors/margin.js.map +1 -0
  194. package/node_modules/html2canvas/dist/lib/css/property-descriptors/opacity.js +17 -0
  195. package/node_modules/html2canvas/dist/lib/css/property-descriptors/opacity.js.map +1 -0
  196. package/node_modules/html2canvas/dist/lib/css/property-descriptors/overflow-wrap.js +19 -0
  197. package/node_modules/html2canvas/dist/lib/css/property-descriptors/overflow-wrap.js.map +1 -0
  198. package/node_modules/html2canvas/dist/lib/css/property-descriptors/overflow.js +28 -0
  199. package/node_modules/html2canvas/dist/lib/css/property-descriptors/overflow.js.map +1 -0
  200. package/node_modules/html2canvas/dist/lib/css/property-descriptors/padding.js +15 -0
  201. package/node_modules/html2canvas/dist/lib/css/property-descriptors/padding.js.map +1 -0
  202. package/node_modules/html2canvas/dist/lib/css/property-descriptors/paint-order.js +34 -0
  203. package/node_modules/html2canvas/dist/lib/css/property-descriptors/paint-order.js.map +1 -0
  204. package/node_modules/html2canvas/dist/lib/css/property-descriptors/position.js +23 -0
  205. package/node_modules/html2canvas/dist/lib/css/property-descriptors/position.js.map +1 -0
  206. package/node_modules/html2canvas/dist/lib/css/property-descriptors/quotes.js +42 -0
  207. package/node_modules/html2canvas/dist/lib/css/property-descriptors/quotes.js.map +1 -0
  208. package/node_modules/html2canvas/dist/lib/css/property-descriptors/text-align.js +22 -0
  209. package/node_modules/html2canvas/dist/lib/css/property-descriptors/text-align.js.map +1 -0
  210. package/node_modules/html2canvas/dist/lib/css/property-descriptors/text-decoration-color.js +11 -0
  211. package/node_modules/html2canvas/dist/lib/css/property-descriptors/text-decoration-color.js.map +1 -0
  212. package/node_modules/html2canvas/dist/lib/css/property-descriptors/text-decoration-line.js +29 -0
  213. package/node_modules/html2canvas/dist/lib/css/property-descriptors/text-decoration-line.js.map +1 -0
  214. package/node_modules/html2canvas/dist/lib/css/property-descriptors/text-shadow.js +47 -0
  215. package/node_modules/html2canvas/dist/lib/css/property-descriptors/text-shadow.js.map +1 -0
  216. package/node_modules/html2canvas/dist/lib/css/property-descriptors/text-transform.js +21 -0
  217. package/node_modules/html2canvas/dist/lib/css/property-descriptors/text-transform.js.map +1 -0
  218. package/node_modules/html2canvas/dist/lib/css/property-descriptors/transform-origin.js +25 -0
  219. package/node_modules/html2canvas/dist/lib/css/property-descriptors/transform-origin.js.map +1 -0
  220. package/node_modules/html2canvas/dist/lib/css/property-descriptors/transform.js +37 -0
  221. package/node_modules/html2canvas/dist/lib/css/property-descriptors/transform.js.map +1 -0
  222. package/node_modules/html2canvas/dist/lib/css/property-descriptors/visibility.js +21 -0
  223. package/node_modules/html2canvas/dist/lib/css/property-descriptors/visibility.js.map +1 -0
  224. package/node_modules/html2canvas/dist/lib/css/property-descriptors/webkit-text-stroke-color.js +11 -0
  225. package/node_modules/html2canvas/dist/lib/css/property-descriptors/webkit-text-stroke-color.js.map +1 -0
  226. package/node_modules/html2canvas/dist/lib/css/property-descriptors/webkit-text-stroke-width.js +17 -0
  227. package/node_modules/html2canvas/dist/lib/css/property-descriptors/webkit-text-stroke-width.js.map +1 -0
  228. package/node_modules/html2canvas/dist/lib/css/property-descriptors/word-break.js +27 -0
  229. package/node_modules/html2canvas/dist/lib/css/property-descriptors/word-break.js.map +1 -0
  230. package/node_modules/html2canvas/dist/lib/css/property-descriptors/z-index.js +20 -0
  231. package/node_modules/html2canvas/dist/lib/css/property-descriptors/z-index.js.map +1 -0
  232. package/node_modules/html2canvas/dist/lib/css/syntax/__tests__/tokernizer-tests.js +34 -0
  233. package/node_modules/html2canvas/dist/lib/css/syntax/__tests__/tokernizer-tests.js.map +1 -0
  234. package/node_modules/html2canvas/dist/lib/css/syntax/parser.js +147 -0
  235. package/node_modules/html2canvas/dist/lib/css/syntax/parser.js.map +1 -0
  236. package/node_modules/html2canvas/dist/lib/css/syntax/tokenizer.js +630 -0
  237. package/node_modules/html2canvas/dist/lib/css/syntax/tokenizer.js.map +1 -0
  238. package/node_modules/html2canvas/dist/lib/css/types/__tests__/color-tests.js +66 -0
  239. package/node_modules/html2canvas/dist/lib/css/types/__tests__/color-tests.js.map +1 -0
  240. package/node_modules/html2canvas/dist/lib/css/types/__tests__/image-tests.js +233 -0
  241. package/node_modules/html2canvas/dist/lib/css/types/__tests__/image-tests.js.map +1 -0
  242. package/node_modules/html2canvas/dist/lib/css/types/angle.js +81 -0
  243. package/node_modules/html2canvas/dist/lib/css/types/angle.js.map +1 -0
  244. package/node_modules/html2canvas/dist/lib/css/types/color.js +288 -0
  245. package/node_modules/html2canvas/dist/lib/css/types/color.js.map +1 -0
  246. package/node_modules/html2canvas/dist/lib/css/types/functions/-prefix-linear-gradient.js +33 -0
  247. package/node_modules/html2canvas/dist/lib/css/types/functions/-prefix-linear-gradient.js.map +1 -0
  248. package/node_modules/html2canvas/dist/lib/css/types/functions/-prefix-radial-gradient.js +84 -0
  249. package/node_modules/html2canvas/dist/lib/css/types/functions/-prefix-radial-gradient.js.map +1 -0
  250. package/node_modules/html2canvas/dist/lib/css/types/functions/-webkit-gradient.js +60 -0
  251. package/node_modules/html2canvas/dist/lib/css/types/functions/-webkit-gradient.js.map +1 -0
  252. package/node_modules/html2canvas/dist/lib/css/types/functions/__tests__/radial-gradient.js +68 -0
  253. package/node_modules/html2canvas/dist/lib/css/types/functions/__tests__/radial-gradient.js.map +1 -0
  254. package/node_modules/html2canvas/dist/lib/css/types/functions/counter.js +374 -0
  255. package/node_modules/html2canvas/dist/lib/css/types/functions/counter.js.map +1 -0
  256. package/node_modules/html2canvas/dist/lib/css/types/functions/gradient.js +165 -0
  257. package/node_modules/html2canvas/dist/lib/css/types/functions/gradient.js.map +1 -0
  258. package/node_modules/html2canvas/dist/lib/css/types/functions/linear-gradient.js +28 -0
  259. package/node_modules/html2canvas/dist/lib/css/types/functions/linear-gradient.js.map +1 -0
  260. package/node_modules/html2canvas/dist/lib/css/types/functions/radial-gradient.js +91 -0
  261. package/node_modules/html2canvas/dist/lib/css/types/functions/radial-gradient.js.map +1 -0
  262. package/node_modules/html2canvas/dist/lib/css/types/image.js +53 -0
  263. package/node_modules/html2canvas/dist/lib/css/types/image.js.map +1 -0
  264. package/node_modules/html2canvas/dist/lib/css/types/index.js +3 -0
  265. package/node_modules/html2canvas/dist/lib/css/types/index.js.map +1 -0
  266. package/node_modules/html2canvas/dist/lib/css/types/length-percentage.js +52 -0
  267. package/node_modules/html2canvas/dist/lib/css/types/length-percentage.js.map +1 -0
  268. package/node_modules/html2canvas/dist/lib/css/types/length.js +8 -0
  269. package/node_modules/html2canvas/dist/lib/css/types/length.js.map +1 -0
  270. package/node_modules/html2canvas/dist/lib/css/types/time.js +18 -0
  271. package/node_modules/html2canvas/dist/lib/css/types/time.js.map +1 -0
  272. package/node_modules/html2canvas/dist/lib/dom/__mocks__/document-cloner.js +24 -0
  273. package/node_modules/html2canvas/dist/lib/dom/__mocks__/document-cloner.js.map +1 -0
  274. package/node_modules/html2canvas/dist/lib/dom/document-cloner.js +530 -0
  275. package/node_modules/html2canvas/dist/lib/dom/document-cloner.js.map +1 -0
  276. package/node_modules/html2canvas/dist/lib/dom/element-container.js +35 -0
  277. package/node_modules/html2canvas/dist/lib/dom/element-container.js.map +1 -0
  278. package/node_modules/html2canvas/dist/lib/dom/elements/li-element-container.js +30 -0
  279. package/node_modules/html2canvas/dist/lib/dom/elements/li-element-container.js.map +1 -0
  280. package/node_modules/html2canvas/dist/lib/dom/elements/ol-element-container.js +31 -0
  281. package/node_modules/html2canvas/dist/lib/dom/elements/ol-element-container.js.map +1 -0
  282. package/node_modules/html2canvas/dist/lib/dom/elements/select-element-container.js +31 -0
  283. package/node_modules/html2canvas/dist/lib/dom/elements/select-element-container.js.map +1 -0
  284. package/node_modules/html2canvas/dist/lib/dom/elements/textarea-element-container.js +30 -0
  285. package/node_modules/html2canvas/dist/lib/dom/elements/textarea-element-container.js.map +1 -0
  286. package/node_modules/html2canvas/dist/lib/dom/node-parser.js +142 -0
  287. package/node_modules/html2canvas/dist/lib/dom/node-parser.js.map +1 -0
  288. package/node_modules/html2canvas/dist/lib/dom/replaced-elements/canvas-element-container.js +32 -0
  289. package/node_modules/html2canvas/dist/lib/dom/replaced-elements/canvas-element-container.js.map +1 -0
  290. package/node_modules/html2canvas/dist/lib/dom/replaced-elements/iframe-element-container.js +55 -0
  291. package/node_modules/html2canvas/dist/lib/dom/replaced-elements/iframe-element-container.js.map +1 -0
  292. package/node_modules/html2canvas/dist/lib/dom/replaced-elements/image-element-container.js +33 -0
  293. package/node_modules/html2canvas/dist/lib/dom/replaced-elements/image-element-container.js.map +1 -0
  294. package/node_modules/html2canvas/dist/lib/dom/replaced-elements/index.js +3 -0
  295. package/node_modules/html2canvas/dist/lib/dom/replaced-elements/index.js.map +1 -0
  296. package/node_modules/html2canvas/dist/lib/dom/replaced-elements/input-element-container.js +102 -0
  297. package/node_modules/html2canvas/dist/lib/dom/replaced-elements/input-element-container.js.map +1 -0
  298. package/node_modules/html2canvas/dist/lib/dom/replaced-elements/pseudo-elements.js +1 -0
  299. package/node_modules/html2canvas/dist/lib/dom/replaced-elements/pseudo-elements.js.map +1 -0
  300. package/node_modules/html2canvas/dist/lib/dom/replaced-elements/svg-element-container.js +38 -0
  301. package/node_modules/html2canvas/dist/lib/dom/replaced-elements/svg-element-container.js.map +1 -0
  302. package/node_modules/html2canvas/dist/lib/dom/text-container.js +32 -0
  303. package/node_modules/html2canvas/dist/lib/dom/text-container.js.map +1 -0
  304. package/node_modules/html2canvas/dist/lib/index.js +181 -0
  305. package/node_modules/html2canvas/dist/lib/index.js.map +1 -0
  306. package/node_modules/html2canvas/dist/lib/invariant.js +10 -0
  307. package/node_modules/html2canvas/dist/lib/invariant.js.map +1 -0
  308. package/node_modules/html2canvas/dist/lib/render/background.js +187 -0
  309. package/node_modules/html2canvas/dist/lib/render/background.js.map +1 -0
  310. package/node_modules/html2canvas/dist/lib/render/bezier-curve.js +36 -0
  311. package/node_modules/html2canvas/dist/lib/render/bezier-curve.js.map +1 -0
  312. package/node_modules/html2canvas/dist/lib/render/border.js +105 -0
  313. package/node_modules/html2canvas/dist/lib/render/border.js.map +1 -0
  314. package/node_modules/html2canvas/dist/lib/render/bound-curves.js +190 -0
  315. package/node_modules/html2canvas/dist/lib/render/bound-curves.js.map +1 -0
  316. package/node_modules/html2canvas/dist/lib/render/box-sizing.js +21 -0
  317. package/node_modules/html2canvas/dist/lib/render/box-sizing.js.map +1 -0
  318. package/node_modules/html2canvas/dist/lib/render/canvas/canvas-renderer.js +1030 -0
  319. package/node_modules/html2canvas/dist/lib/render/canvas/canvas-renderer.js.map +1 -0
  320. package/node_modules/html2canvas/dist/lib/render/canvas/foreignobject-renderer.js +108 -0
  321. package/node_modules/html2canvas/dist/lib/render/canvas/foreignobject-renderer.js.map +1 -0
  322. package/node_modules/html2canvas/dist/lib/render/effects.js +41 -0
  323. package/node_modules/html2canvas/dist/lib/render/effects.js.map +1 -0
  324. package/node_modules/html2canvas/dist/lib/render/font-metrics.js +55 -0
  325. package/node_modules/html2canvas/dist/lib/render/font-metrics.js.map +1 -0
  326. package/node_modules/html2canvas/dist/lib/render/path.js +27 -0
  327. package/node_modules/html2canvas/dist/lib/render/path.js.map +1 -0
  328. package/node_modules/html2canvas/dist/lib/render/renderer.js +12 -0
  329. package/node_modules/html2canvas/dist/lib/render/renderer.js.map +1 -0
  330. package/node_modules/html2canvas/dist/lib/render/stacking-context.js +172 -0
  331. package/node_modules/html2canvas/dist/lib/render/stacking-context.js.map +1 -0
  332. package/node_modules/html2canvas/dist/lib/render/vector.js +18 -0
  333. package/node_modules/html2canvas/dist/lib/render/vector.js.map +1 -0
  334. package/node_modules/html2canvas/dist/types/__tests__/index.d.ts +1 -0
  335. package/node_modules/html2canvas/dist/types/core/__mocks__/cache-storage.d.ts +2 -0
  336. package/node_modules/html2canvas/dist/types/core/__mocks__/context.d.ts +9 -0
  337. package/node_modules/html2canvas/dist/types/core/__mocks__/features.d.ts +8 -0
  338. package/node_modules/html2canvas/dist/types/core/__mocks__/logger.d.ts +9 -0
  339. package/node_modules/html2canvas/dist/types/core/__tests__/cache-storage.d.ts +1 -0
  340. package/node_modules/html2canvas/dist/types/core/__tests__/logger.d.ts +1 -0
  341. package/node_modules/html2canvas/dist/types/core/bitwise.d.ts +1 -0
  342. package/node_modules/html2canvas/dist/types/core/cache-storage.d.ts +26 -0
  343. package/node_modules/html2canvas/dist/types/core/context.d.ts +15 -0
  344. package/node_modules/html2canvas/dist/types/core/debugger.d.ts +8 -0
  345. package/node_modules/html2canvas/dist/types/core/features.d.ts +12 -0
  346. package/node_modules/html2canvas/dist/types/core/logger.d.ts +18 -0
  347. package/node_modules/html2canvas/dist/types/core/util.d.ts +1 -0
  348. package/node_modules/html2canvas/dist/types/css/IPropertyDescriptor.d.ts +36 -0
  349. package/node_modules/html2canvas/dist/types/css/ITypeDescriptor.d.ts +6 -0
  350. package/node_modules/html2canvas/dist/types/css/index.d.ts +132 -0
  351. package/node_modules/html2canvas/dist/types/css/layout/__mocks__/bounds.d.ts +2 -0
  352. package/node_modules/html2canvas/dist/types/css/layout/bounds.d.ts +14 -0
  353. package/node_modules/html2canvas/dist/types/css/layout/text.d.ts +10 -0
  354. package/node_modules/html2canvas/dist/types/css/property-descriptors/__tests__/background-tests.d.ts +1 -0
  355. package/node_modules/html2canvas/dist/types/css/property-descriptors/__tests__/font-family.d.ts +1 -0
  356. package/node_modules/html2canvas/dist/types/css/property-descriptors/__tests__/paint-order.d.ts +1 -0
  357. package/node_modules/html2canvas/dist/types/css/property-descriptors/__tests__/text-shadow.d.ts +1 -0
  358. package/node_modules/html2canvas/dist/types/css/property-descriptors/__tests__/transform-tests.d.ts +1 -0
  359. package/node_modules/html2canvas/dist/types/css/property-descriptors/background-clip.d.ts +8 -0
  360. package/node_modules/html2canvas/dist/types/css/property-descriptors/background-color.d.ts +2 -0
  361. package/node_modules/html2canvas/dist/types/css/property-descriptors/background-image.d.ts +3 -0
  362. package/node_modules/html2canvas/dist/types/css/property-descriptors/background-origin.d.ts +8 -0
  363. package/node_modules/html2canvas/dist/types/css/property-descriptors/background-position.d.ts +5 -0
  364. package/node_modules/html2canvas/dist/types/css/property-descriptors/background-repeat.d.ts +9 -0
  365. package/node_modules/html2canvas/dist/types/css/property-descriptors/background-size.d.ts +11 -0
  366. package/node_modules/html2canvas/dist/types/css/property-descriptors/border-color.d.ts +5 -0
  367. package/node_modules/html2canvas/dist/types/css/property-descriptors/border-radius.d.ts +7 -0
  368. package/node_modules/html2canvas/dist/types/css/property-descriptors/border-style.d.ts +12 -0
  369. package/node_modules/html2canvas/dist/types/css/property-descriptors/border-width.d.ts +5 -0
  370. package/node_modules/html2canvas/dist/types/css/property-descriptors/box-shadow.d.ts +14 -0
  371. package/node_modules/html2canvas/dist/types/css/property-descriptors/color.d.ts +2 -0
  372. package/node_modules/html2canvas/dist/types/css/property-descriptors/content.d.ts +4 -0
  373. package/node_modules/html2canvas/dist/types/css/property-descriptors/counter-increment.d.ts +7 -0
  374. package/node_modules/html2canvas/dist/types/css/property-descriptors/counter-reset.d.ts +7 -0
  375. package/node_modules/html2canvas/dist/types/css/property-descriptors/direction.d.ts +6 -0
  376. package/node_modules/html2canvas/dist/types/css/property-descriptors/display.d.ts +35 -0
  377. package/node_modules/html2canvas/dist/types/css/property-descriptors/duration.d.ts +2 -0
  378. package/node_modules/html2canvas/dist/types/css/property-descriptors/float.d.ts +9 -0
  379. package/node_modules/html2canvas/dist/types/css/property-descriptors/font-family.d.ts +4 -0
  380. package/node_modules/html2canvas/dist/types/css/property-descriptors/font-size.d.ts +2 -0
  381. package/node_modules/html2canvas/dist/types/css/property-descriptors/font-style.d.ts +7 -0
  382. package/node_modules/html2canvas/dist/types/css/property-descriptors/font-variant.d.ts +2 -0
  383. package/node_modules/html2canvas/dist/types/css/property-descriptors/font-weight.d.ts +2 -0
  384. package/node_modules/html2canvas/dist/types/css/property-descriptors/letter-spacing.d.ts +2 -0
  385. package/node_modules/html2canvas/dist/types/css/property-descriptors/line-break.d.ts +6 -0
  386. package/node_modules/html2canvas/dist/types/css/property-descriptors/line-height.d.ts +4 -0
  387. package/node_modules/html2canvas/dist/types/css/property-descriptors/list-style-image.d.ts +3 -0
  388. package/node_modules/html2canvas/dist/types/css/property-descriptors/list-style-position.d.ts +6 -0
  389. package/node_modules/html2canvas/dist/types/css/property-descriptors/list-style-type.d.ts +58 -0
  390. package/node_modules/html2canvas/dist/types/css/property-descriptors/margin.d.ts +5 -0
  391. package/node_modules/html2canvas/dist/types/css/property-descriptors/opacity.d.ts +2 -0
  392. package/node_modules/html2canvas/dist/types/css/property-descriptors/overflow-wrap.d.ts +6 -0
  393. package/node_modules/html2canvas/dist/types/css/property-descriptors/overflow.d.ts +9 -0
  394. package/node_modules/html2canvas/dist/types/css/property-descriptors/padding.d.ts +5 -0
  395. package/node_modules/html2canvas/dist/types/css/property-descriptors/paint-order.d.ts +8 -0
  396. package/node_modules/html2canvas/dist/types/css/property-descriptors/position.d.ts +9 -0
  397. package/node_modules/html2canvas/dist/types/css/property-descriptors/quotes.d.ts +8 -0
  398. package/node_modules/html2canvas/dist/types/css/property-descriptors/text-align.d.ts +7 -0
  399. package/node_modules/html2canvas/dist/types/css/property-descriptors/text-decoration-color.d.ts +2 -0
  400. package/node_modules/html2canvas/dist/types/css/property-descriptors/text-decoration-line.d.ts +10 -0
  401. package/node_modules/html2canvas/dist/types/css/property-descriptors/text-shadow.d.ts +12 -0
  402. package/node_modules/html2canvas/dist/types/css/property-descriptors/text-transform.d.ts +8 -0
  403. package/node_modules/html2canvas/dist/types/css/property-descriptors/transform-origin.d.ts +4 -0
  404. package/node_modules/html2canvas/dist/types/css/property-descriptors/transform.d.ts +4 -0
  405. package/node_modules/html2canvas/dist/types/css/property-descriptors/visibility.d.ts +7 -0
  406. package/node_modules/html2canvas/dist/types/css/property-descriptors/webkit-text-stroke-color.d.ts +2 -0
  407. package/node_modules/html2canvas/dist/types/css/property-descriptors/webkit-text-stroke-width.d.ts +2 -0
  408. package/node_modules/html2canvas/dist/types/css/property-descriptors/word-break.d.ts +7 -0
  409. package/node_modules/html2canvas/dist/types/css/property-descriptors/z-index.d.ts +7 -0
  410. package/node_modules/html2canvas/dist/types/css/syntax/__tests__/tokernizer-tests.d.ts +1 -0
  411. package/node_modules/html2canvas/dist/types/css/syntax/parser.d.ts +34 -0
  412. package/node_modules/html2canvas/dist/types/css/syntax/tokenizer.d.ts +94 -0
  413. package/node_modules/html2canvas/dist/types/css/types/__tests__/color-tests.d.ts +1 -0
  414. package/node_modules/html2canvas/dist/types/css/types/__tests__/image-tests.d.ts +1 -0
  415. package/node_modules/html2canvas/dist/types/css/types/angle.d.ts +7 -0
  416. package/node_modules/html2canvas/dist/types/css/types/color.d.ts +11 -0
  417. package/node_modules/html2canvas/dist/types/css/types/functions/-prefix-linear-gradient.d.ts +4 -0
  418. package/node_modules/html2canvas/dist/types/css/types/functions/-prefix-radial-gradient.d.ts +4 -0
  419. package/node_modules/html2canvas/dist/types/css/types/functions/-webkit-gradient.d.ts +4 -0
  420. package/node_modules/html2canvas/dist/types/css/types/functions/__tests__/radial-gradient.d.ts +1 -0
  421. package/node_modules/html2canvas/dist/types/css/types/functions/counter.d.ts +10 -0
  422. package/node_modules/html2canvas/dist/types/css/types/functions/gradient.d.ts +7 -0
  423. package/node_modules/html2canvas/dist/types/css/types/functions/linear-gradient.d.ts +4 -0
  424. package/node_modules/html2canvas/dist/types/css/types/functions/radial-gradient.d.ts +12 -0
  425. package/node_modules/html2canvas/dist/types/css/types/image.d.ts +54 -0
  426. package/node_modules/html2canvas/dist/types/css/types/index.d.ts +1 -0
  427. package/node_modules/html2canvas/dist/types/css/types/length-percentage.d.ts +11 -0
  428. package/node_modules/html2canvas/dist/types/css/types/length.d.ts +4 -0
  429. package/node_modules/html2canvas/dist/types/css/types/time.d.ts +2 -0
  430. package/node_modules/html2canvas/dist/types/dom/__mocks__/document-cloner.d.ts +6 -0
  431. package/node_modules/html2canvas/dist/types/dom/document-cloner.d.ts +45 -0
  432. package/node_modules/html2canvas/dist/types/dom/element-container.d.ts +19 -0
  433. package/node_modules/html2canvas/dist/types/dom/elements/li-element-container.d.ts +6 -0
  434. package/node_modules/html2canvas/dist/types/dom/elements/ol-element-container.d.ts +7 -0
  435. package/node_modules/html2canvas/dist/types/dom/elements/select-element-container.d.ts +6 -0
  436. package/node_modules/html2canvas/dist/types/dom/elements/textarea-element-container.d.ts +6 -0
  437. package/node_modules/html2canvas/dist/types/dom/node-parser.d.ts +23 -0
  438. package/node_modules/html2canvas/dist/types/dom/replaced-elements/canvas-element-container.d.ts +8 -0
  439. package/node_modules/html2canvas/dist/types/dom/replaced-elements/iframe-element-container.d.ts +11 -0
  440. package/node_modules/html2canvas/dist/types/dom/replaced-elements/image-element-container.d.ts +8 -0
  441. package/node_modules/html2canvas/dist/types/dom/replaced-elements/index.d.ts +4 -0
  442. package/node_modules/html2canvas/dist/types/dom/replaced-elements/input-element-container.d.ts +12 -0
  443. package/node_modules/html2canvas/dist/types/dom/replaced-elements/pseudo-elements.d.ts +0 -0
  444. package/node_modules/html2canvas/dist/types/dom/replaced-elements/svg-element-container.d.ts +8 -0
  445. package/node_modules/html2canvas/dist/types/dom/text-container.d.ts +8 -0
  446. package/node_modules/html2canvas/dist/types/index.d.ts +10 -0
  447. package/node_modules/html2canvas/dist/types/invariant.d.ts +1 -0
  448. package/node_modules/html2canvas/dist/types/render/background.d.ts +16 -0
  449. package/node_modules/html2canvas/dist/types/render/bezier-curve.d.ts +14 -0
  450. package/node_modules/html2canvas/dist/types/render/border.d.ts +6 -0
  451. package/node_modules/html2canvas/dist/types/render/bound-curves.d.ts +32 -0
  452. package/node_modules/html2canvas/dist/types/render/box-sizing.d.ts +4 -0
  453. package/node_modules/html2canvas/dist/types/render/canvas/canvas-renderer.d.ts +53 -0
  454. package/node_modules/html2canvas/dist/types/render/canvas/foreignobject-renderer.d.ts +11 -0
  455. package/node_modules/html2canvas/dist/types/render/effects.d.ts +38 -0
  456. package/node_modules/html2canvas/dist/types/render/font-metrics.d.ts +11 -0
  457. package/node_modules/html2canvas/dist/types/render/path.d.ts +13 -0
  458. package/node_modules/html2canvas/dist/types/render/renderer.d.ts +7 -0
  459. package/node_modules/html2canvas/dist/types/render/stacking-context.d.ts +24 -0
  460. package/node_modules/html2canvas/dist/types/render/vector.d.ts +9 -0
  461. package/node_modules/html2canvas/package.json +124 -0
  462. package/node_modules/html2canvas/tsconfig.json +21 -0
  463. package/node_modules/text-segmentation/CHANGELOG.md +43 -0
  464. package/node_modules/text-segmentation/LICENSE +22 -0
  465. package/node_modules/text-segmentation/README.md +27 -0
  466. package/node_modules/text-segmentation/dist/lib/GraphemeBreak.js +218 -0
  467. package/node_modules/text-segmentation/dist/lib/GraphemeBreak.js.map +1 -0
  468. package/node_modules/text-segmentation/dist/lib/grapheme-break-trie.js +6 -0
  469. package/node_modules/text-segmentation/dist/lib/grapheme-break-trie.js.map +1 -0
  470. package/node_modules/text-segmentation/dist/lib/index.js +9 -0
  471. package/node_modules/text-segmentation/dist/lib/index.js.map +1 -0
  472. package/node_modules/text-segmentation/dist/text-segmentation.es5.js +384 -0
  473. package/node_modules/text-segmentation/dist/text-segmentation.es5.js.map +1 -0
  474. package/node_modules/text-segmentation/dist/text-segmentation.umd.js +397 -0
  475. package/node_modules/text-segmentation/dist/text-segmentation.umd.js.map +1 -0
  476. package/node_modules/text-segmentation/dist/types/GraphemeBreak.d.ts +21 -0
  477. package/node_modules/text-segmentation/dist/types/grapheme-break-trie.d.ts +2 -0
  478. package/node_modules/text-segmentation/dist/types/index.d.ts +1 -0
  479. package/node_modules/text-segmentation/package.json +55 -0
  480. package/node_modules/text-segmentation/rollup.config.ts +40 -0
  481. package/node_modules/utrie/CHANGELOG.md +32 -0
  482. package/node_modules/utrie/LICENSE +22 -0
  483. package/node_modules/utrie/dist/lib/Trie.js +143 -0
  484. package/node_modules/utrie/dist/lib/Trie.js.map +1 -0
  485. package/node_modules/utrie/dist/lib/TrieBuilder.js +888 -0
  486. package/node_modules/utrie/dist/lib/TrieBuilder.js.map +1 -0
  487. package/node_modules/utrie/dist/lib/Util.js +54 -0
  488. package/node_modules/utrie/dist/lib/Util.js.map +1 -0
  489. package/node_modules/utrie/dist/lib/index.js +10 -0
  490. package/node_modules/utrie/dist/lib/index.js.map +1 -0
  491. package/node_modules/utrie/dist/types/Trie.d.ts +76 -0
  492. package/node_modules/utrie/dist/types/TrieBuilder.d.ts +65 -0
  493. package/node_modules/utrie/dist/types/Util.d.ts +3 -0
  494. package/node_modules/utrie/dist/types/index.d.ts +2 -0
  495. package/node_modules/utrie/dist/utrie.es5.js +1101 -0
  496. package/node_modules/utrie/dist/utrie.es5.js.map +1 -0
  497. package/node_modules/utrie/dist/utrie.umd.js +1114 -0
  498. package/node_modules/utrie/dist/utrie.umd.js.map +1 -0
  499. package/node_modules/utrie/package.json +53 -0
  500. package/node_modules/utrie/rollup.config.ts +40 -0
  501. package/package.json +1 -1
  502. package/packages/cli/bin/groove.js +10 -1
  503. package/packages/cli/package.json +1 -1
  504. package/packages/cli/src/commands/connect.js +116 -205
  505. package/packages/cli/src/commands/disconnect.js +38 -62
  506. package/packages/cli/src/commands/remotes.js +75 -0
  507. package/packages/daemon/package.json +1 -1
  508. package/packages/daemon/src/api.js +115 -7
  509. package/packages/daemon/src/conversations.js +29 -3
  510. package/packages/daemon/src/process.js +56 -1
  511. package/packages/daemon/src/providers/codex.js +28 -10
  512. package/packages/daemon/src/registry.js +30 -0
  513. package/packages/daemon/src/validate.js +23 -0
  514. package/packages/gui/dist/assets/index-BSqk8cbI.css +1 -0
  515. package/packages/gui/dist/assets/index-B_igwWvq.js +8642 -0
  516. package/packages/gui/dist/index.html +2 -2
  517. package/packages/gui/package.json +2 -1
  518. package/packages/gui/src/components/agents/agent-file-tree.jsx +254 -0
  519. package/packages/gui/src/components/agents/code-review.jsx +177 -0
  520. package/packages/gui/src/components/agents/diff-viewer.jsx +148 -0
  521. package/packages/gui/src/components/agents/workspace-mode.jsx +377 -0
  522. package/packages/gui/src/components/chat/chat-input.jsx +117 -40
  523. package/packages/gui/src/components/chat/chat-messages.jsx +10 -13
  524. package/packages/gui/src/components/chat/chat-view.jsx +26 -1
  525. package/packages/gui/src/components/chat/conversation-list.jsx +14 -14
  526. package/packages/gui/src/components/chat/model-picker.jsx +5 -0
  527. package/packages/gui/src/components/preview/preview-workspace.jsx +6 -5
  528. package/packages/gui/src/components/preview/screenshot-overlay.jsx +41 -29
  529. package/packages/gui/src/stores/groove.js +138 -3
  530. package/packages/gui/src/views/agents.jsx +36 -3
  531. package/packages/gui/src/views/settings.jsx +104 -26
  532. package/test/doomsday-clock/index.html +55 -0
  533. package/test/doomsday-clock/script.js +66 -0
  534. package/test/doomsday-clock/style.css +315 -0
  535. package/node_modules/@groove-dev/gui/dist/assets/index-BbDDgazC.js +0 -8616
  536. package/node_modules/@groove-dev/gui/dist/assets/index-fhMxiPGp.css +0 -1
  537. package/packages/gui/dist/assets/index-BbDDgazC.js +0 -8616
  538. package/packages/gui/dist/assets/index-fhMxiPGp.css +0 -1
@@ -0,0 +1,377 @@
1
+ // FSL-1.1-Apache-2.0 — see LICENSE
2
+ import { useState, useRef, useCallback, useEffect } from 'react';
3
+ import { useGrooveStore } from '../../stores/groove';
4
+ import { cn } from '../../lib/cn';
5
+ import { AgentFileTree } from './agent-file-tree';
6
+ import { AgentChat } from './agent-chat';
7
+ import { AgentFeed } from './agent-feed';
8
+ import { DiffViewer } from './diff-viewer';
9
+ import { CodeReview } from './code-review';
10
+ import { CodeEditor } from '../editor/code-editor';
11
+ import { Badge } from '../ui/badge';
12
+ import { Tooltip } from '../ui/tooltip';
13
+ import { ScrollArea } from '../ui/scroll-area';
14
+ import { roleColor } from '../../lib/status';
15
+ import { fmtNum } from '../../lib/format';
16
+ import {
17
+ X, Code2, MessageSquare, Activity, FileCode, GitCompareArrows,
18
+ ClipboardCheck, AlertTriangle, RefreshCw,
19
+ } from 'lucide-react';
20
+
21
+ const STATUS_VARIANT = {
22
+ running: 'success', starting: 'warning', stopped: 'default',
23
+ crashed: 'danger', completed: 'accent', killed: 'default', rotating: 'purple',
24
+ };
25
+
26
+ const TREE_DEFAULT = 220;
27
+ const TREE_MIN = 140;
28
+ const TREE_MAX = 360;
29
+ const RIGHT_DEFAULT = 340;
30
+ const RIGHT_MIN = 260;
31
+ const RIGHT_MAX = 520;
32
+
33
+ function AgentRail({ agents, activeId, onSelect }) {
34
+ return (
35
+ <div className="flex flex-col items-center gap-1 py-2 w-12 bg-surface-1 border-r border-border flex-shrink-0">
36
+ {agents.map((agent) => {
37
+ const colors = roleColor(agent.role);
38
+ const isActive = agent.id === activeId;
39
+ const isRunning = agent.status === 'running' || agent.status === 'starting';
40
+ const initial = (agent.role || '?')[0].toUpperCase();
41
+
42
+ return (
43
+ <Tooltip key={agent.id} content={`${agent.name} — ${agent.status}`} side="right">
44
+ <button
45
+ onClick={() => onSelect(agent.id)}
46
+ className={cn(
47
+ 'relative w-9 h-9 rounded-lg flex items-center justify-center',
48
+ 'text-xs font-bold font-sans cursor-pointer transition-all',
49
+ isActive
50
+ ? 'ring-1.5 ring-accent bg-accent/12'
51
+ : 'hover:bg-surface-3',
52
+ )}
53
+ style={{ color: colors.text, background: isActive ? colors.bg : undefined }}
54
+ >
55
+ {initial}
56
+ <span
57
+ className={cn(
58
+ 'absolute bottom-0.5 right-0.5 w-2 h-2 rounded-full border border-surface-1',
59
+ isRunning ? 'bg-success animate-pulse' :
60
+ agent.status === 'completed' ? 'bg-accent' :
61
+ agent.status === 'crashed' ? 'bg-danger' : 'bg-text-4',
62
+ )}
63
+ />
64
+ </button>
65
+ </Tooltip>
66
+ );
67
+ })}
68
+ </div>
69
+ );
70
+ }
71
+
72
+ function TabBar({ tabs, activeFile, files, onSelect, onClose, diffMode, onToggleDiff, workspaceSnapshots }) {
73
+ const hasSnapshot = activeFile && workspaceSnapshots[activeFile];
74
+
75
+ return (
76
+ <div className="flex items-stretch h-9 bg-surface-3 border-b border-border-subtle flex-shrink-0">
77
+ <div className="flex items-stretch flex-1 min-w-0 overflow-x-auto scrollbar-none">
78
+ {tabs.map((path) => {
79
+ const isActive = path === activeFile;
80
+ const file = files[path];
81
+ const isDirty = file && file.content !== file.originalContent;
82
+ const name = path.split('/').pop();
83
+
84
+ return (
85
+ <div
86
+ key={path}
87
+ className={cn(
88
+ 'flex items-center gap-1.5 px-3 text-xs font-sans cursor-pointer select-none',
89
+ 'border-r border-white/5 transition-colors duration-75 flex-shrink-0',
90
+ isActive
91
+ ? 'bg-surface-0 text-text-0 border-b border-b-accent'
92
+ : 'bg-surface-3 text-text-4 hover:text-text-1 hover:bg-surface-4 border-b border-b-transparent',
93
+ )}
94
+ onClick={() => onSelect(path)}
95
+ >
96
+ <span className="truncate max-w-[120px]">{name}</span>
97
+ {isDirty && <span className="w-1.5 h-1.5 rounded-full bg-warning flex-shrink-0" />}
98
+ <button
99
+ onClick={(e) => { e.stopPropagation(); onClose(path); }}
100
+ className="p-0.5 rounded hover:bg-surface-5 text-text-4 hover:text-text-1 transition-colors cursor-pointer ml-0.5"
101
+ >
102
+ <X size={12} />
103
+ </button>
104
+ </div>
105
+ );
106
+ })}
107
+ </div>
108
+ {hasSnapshot && (
109
+ <div className="flex items-center gap-0.5 px-2 border-l border-border-subtle flex-shrink-0">
110
+ <button
111
+ onClick={() => onToggleDiff(false)}
112
+ className={cn(
113
+ 'flex items-center gap-1 px-2 py-1 text-xs font-sans rounded cursor-pointer transition-colors',
114
+ !diffMode ? 'bg-surface-4 text-text-0 font-medium' : 'text-text-3 hover:text-text-1',
115
+ )}
116
+ >
117
+ <FileCode size={11} /> Code
118
+ </button>
119
+ <button
120
+ onClick={() => onToggleDiff(true)}
121
+ className={cn(
122
+ 'flex items-center gap-1 px-2 py-1 text-xs font-sans rounded cursor-pointer transition-colors',
123
+ diffMode ? 'bg-surface-4 text-text-0 font-medium' : 'text-text-3 hover:text-text-1',
124
+ )}
125
+ >
126
+ <GitCompareArrows size={11} /> Diff
127
+ </button>
128
+ </div>
129
+ )}
130
+ </div>
131
+ );
132
+ }
133
+
134
+ export function WorkspaceMode() {
135
+ const agents = useGrooveStore((s) => s.agents);
136
+ const activeTeamId = useGrooveStore((s) => s.activeTeamId);
137
+ const workspaceAgentId = useGrooveStore((s) => s.workspaceAgentId);
138
+ const setWorkspaceAgent = useGrooveStore((s) => s.setWorkspaceAgent);
139
+ const workspaceReviewMode = useGrooveStore((s) => s.workspaceReviewMode);
140
+ const toggleReviewMode = useGrooveStore((s) => s.toggleReviewMode);
141
+ const workspaceSnapshots = useGrooveStore((s) => s.workspaceSnapshots);
142
+
143
+ const editorFiles = useGrooveStore((s) => s.editorFiles);
144
+ const editorActiveFile = useGrooveStore((s) => s.editorActiveFile);
145
+ const editorOpenTabs = useGrooveStore((s) => s.editorOpenTabs);
146
+ const editorChangedFiles = useGrooveStore((s) => s.editorChangedFiles);
147
+ const setActiveFile = useGrooveStore((s) => s.setActiveFile);
148
+ const closeFile = useGrooveStore((s) => s.closeFile);
149
+ const updateFileContent = useGrooveStore((s) => s.updateFileContent);
150
+ const saveFile = useGrooveStore((s) => s.saveFile);
151
+ const reloadFile = useGrooveStore((s) => s.reloadFile);
152
+ const dismissFileChange = useGrooveStore((s) => s.dismissFileChange);
153
+
154
+ const teamAgents = agents.filter((a) => a.teamId === activeTeamId);
155
+ const agent = teamAgents.find((a) => a.id === workspaceAgentId) || teamAgents[0];
156
+
157
+ const [treeWidth, setTreeWidth] = useState(TREE_DEFAULT);
158
+ const [rightWidth, setRightWidth] = useState(RIGHT_DEFAULT);
159
+ const [diffMode, setDiffMode] = useState(false);
160
+ const [rightTab, setRightTab] = useState('chat');
161
+
162
+ const treeDragging = useRef(false);
163
+ const rightDragging = useRef(false);
164
+ const startX = useRef(0);
165
+ const startW = useRef(0);
166
+
167
+ useEffect(() => {
168
+ setDiffMode(false);
169
+ }, [editorActiveFile]);
170
+
171
+ const onTreeMouseDown = useCallback((e) => {
172
+ e.preventDefault();
173
+ treeDragging.current = true;
174
+ startX.current = e.clientX;
175
+ startW.current = treeWidth;
176
+ function onMove(e) {
177
+ if (!treeDragging.current) return;
178
+ setTreeWidth(Math.min(Math.max(startW.current + e.clientX - startX.current, TREE_MIN), TREE_MAX));
179
+ }
180
+ function onUp() {
181
+ treeDragging.current = false;
182
+ document.removeEventListener('mousemove', onMove);
183
+ document.removeEventListener('mouseup', onUp);
184
+ }
185
+ document.addEventListener('mousemove', onMove);
186
+ document.addEventListener('mouseup', onUp);
187
+ }, [treeWidth]);
188
+
189
+ const onRightMouseDown = useCallback((e) => {
190
+ e.preventDefault();
191
+ rightDragging.current = true;
192
+ startX.current = e.clientX;
193
+ startW.current = rightWidth;
194
+ function onMove(e) {
195
+ if (!rightDragging.current) return;
196
+ setRightWidth(Math.min(Math.max(startW.current - (e.clientX - startX.current), RIGHT_MIN), RIGHT_MAX));
197
+ }
198
+ function onUp() {
199
+ rightDragging.current = false;
200
+ document.removeEventListener('mousemove', onMove);
201
+ document.removeEventListener('mouseup', onUp);
202
+ }
203
+ document.addEventListener('mousemove', onMove);
204
+ document.addEventListener('mouseup', onUp);
205
+ }, [rightWidth]);
206
+
207
+ if (!agent) {
208
+ return (
209
+ <div className="flex items-center justify-center h-full text-text-4 text-xs font-sans">
210
+ No agents in this team
211
+ </div>
212
+ );
213
+ }
214
+
215
+ const isAlive = agent.status === 'running' || agent.status === 'starting';
216
+ const ctxPct = Math.round((agent.contextUsage || 0) * 100);
217
+ const file = editorActiveFile ? editorFiles[editorActiveFile] : null;
218
+ const hasExternalChange = editorActiveFile && editorChangedFiles[editorActiveFile];
219
+
220
+ return (
221
+ <div className="flex h-full bg-surface-0">
222
+ {/* Left Rail — Agent Switcher */}
223
+ <AgentRail agents={teamAgents} activeId={agent.id} onSelect={setWorkspaceAgent} />
224
+
225
+ {/* Center Panel — File Tree + Editor */}
226
+ <div className="flex flex-1 min-w-0">
227
+ {/* File Tree Sidebar */}
228
+ <div className="flex-shrink-0 bg-surface-1 border-r border-border relative" style={{ width: treeWidth }}>
229
+ <AgentFileTree agentId={agent.id} />
230
+ <div
231
+ className="absolute top-0 right-0 bottom-0 w-1 cursor-col-resize hover:bg-accent/30 transition-colors z-10"
232
+ onMouseDown={onTreeMouseDown}
233
+ onDoubleClick={() => setTreeWidth(TREE_DEFAULT)}
234
+ />
235
+ </div>
236
+
237
+ {/* Editor Area */}
238
+ <div className="flex-1 flex flex-col min-w-0">
239
+ {workspaceReviewMode ? (
240
+ <CodeReview agentId={agent.id} />
241
+ ) : (
242
+ <>
243
+ <TabBar
244
+ tabs={editorOpenTabs}
245
+ activeFile={editorActiveFile}
246
+ files={editorFiles}
247
+ onSelect={setActiveFile}
248
+ onClose={closeFile}
249
+ diffMode={diffMode}
250
+ onToggleDiff={setDiffMode}
251
+ workspaceSnapshots={workspaceSnapshots}
252
+ />
253
+
254
+ <div className="flex-1 relative min-h-0">
255
+ {hasExternalChange && (
256
+ <div className="absolute top-0 left-0 right-0 z-10 flex items-center gap-2 px-4 py-2 bg-warning/10 border-b border-warning/20">
257
+ <AlertTriangle size={14} className="text-warning" />
258
+ <span className="text-xs text-warning font-sans flex-1">File modified externally</span>
259
+ <button
260
+ onClick={() => reloadFile(editorActiveFile)}
261
+ className="flex items-center gap-1 px-2 py-1 text-xs text-text-1 hover:bg-surface-4 rounded cursor-pointer"
262
+ >
263
+ <RefreshCw size={12} /> Reload
264
+ </button>
265
+ <button
266
+ onClick={() => dismissFileChange(editorActiveFile)}
267
+ className="flex items-center gap-1 px-2 py-1 text-xs text-text-3 hover:bg-surface-4 rounded cursor-pointer"
268
+ >
269
+ <X size={12} /> Dismiss
270
+ </button>
271
+ </div>
272
+ )}
273
+
274
+ {!editorActiveFile && (
275
+ <div className="w-full h-full flex items-center justify-center text-text-4 font-sans">
276
+ <div className="text-center space-y-2">
277
+ <Code2 size={32} className="mx-auto" />
278
+ <p className="text-sm">Open a file from the tree</p>
279
+ <p className="text-2xs text-text-4">Files scoped to {agent.name}</p>
280
+ </div>
281
+ </div>
282
+ )}
283
+
284
+ {editorActiveFile && diffMode && (
285
+ <DiffViewer filePath={editorActiveFile} />
286
+ )}
287
+
288
+ {editorActiveFile && !diffMode && file && (
289
+ <CodeEditor
290
+ content={file.content}
291
+ language={file.language}
292
+ onChange={(content) => updateFileContent(editorActiveFile, content)}
293
+ onSave={() => saveFile(editorActiveFile)}
294
+ />
295
+ )}
296
+ </div>
297
+ </>
298
+ )}
299
+ </div>
300
+ </div>
301
+
302
+ {/* Right Panel — Chat + Activity */}
303
+ <div className="flex flex-col bg-surface-1 border-l border-border relative" style={{ width: rightWidth }}>
304
+ {/* Resize handle */}
305
+ <div
306
+ className="absolute top-0 left-0 bottom-0 w-1 cursor-col-resize hover:bg-accent/30 transition-colors z-10"
307
+ onMouseDown={onRightMouseDown}
308
+ onDoubleClick={() => setRightWidth(RIGHT_DEFAULT)}
309
+ />
310
+
311
+ {/* Header */}
312
+ <div className="flex items-center gap-2 px-4 py-2.5 border-b border-border flex-shrink-0">
313
+ <div className="flex-1 min-w-0">
314
+ <div className="flex items-center gap-2">
315
+ <span className="text-sm font-bold text-text-0 font-sans truncate">{agent.name}</span>
316
+ <Badge variant={STATUS_VARIANT[agent.status]} dot={isAlive ? 'pulse' : undefined}>
317
+ {agent.status}
318
+ </Badge>
319
+ </div>
320
+ <div className="flex items-center gap-3 mt-0.5">
321
+ <span className="text-2xs text-text-3 font-sans">
322
+ {fmtNum(agent.tokensUsed || 0)} tokens
323
+ </span>
324
+ <span className="text-2xs text-text-3 font-sans">
325
+ ctx {ctxPct}%
326
+ </span>
327
+ </div>
328
+ </div>
329
+ <button
330
+ onClick={toggleReviewMode}
331
+ className={cn(
332
+ 'flex items-center gap-1 px-2 py-1 text-xs font-sans rounded cursor-pointer transition-colors',
333
+ workspaceReviewMode
334
+ ? 'bg-accent/15 text-accent'
335
+ : 'text-text-3 hover:text-text-1 hover:bg-surface-3',
336
+ )}
337
+ title="Review Changes"
338
+ >
339
+ <ClipboardCheck size={13} />
340
+ </button>
341
+ </div>
342
+
343
+ {/* Tab switcher */}
344
+ <div className="flex items-center gap-0 border-b border-border-subtle flex-shrink-0">
345
+ <button
346
+ onClick={() => setRightTab('chat')}
347
+ className={cn(
348
+ 'flex items-center gap-1.5 px-3 py-2 text-xs font-sans cursor-pointer transition-colors',
349
+ rightTab === 'chat'
350
+ ? 'text-text-0 border-b border-b-accent font-medium'
351
+ : 'text-text-3 hover:text-text-1',
352
+ )}
353
+ >
354
+ <MessageSquare size={12} /> Chat
355
+ </button>
356
+ <button
357
+ onClick={() => setRightTab('activity')}
358
+ className={cn(
359
+ 'flex items-center gap-1.5 px-3 py-2 text-xs font-sans cursor-pointer transition-colors',
360
+ rightTab === 'activity'
361
+ ? 'text-text-0 border-b border-b-accent font-medium'
362
+ : 'text-text-3 hover:text-text-1',
363
+ )}
364
+ >
365
+ <Activity size={12} /> Activity
366
+ </button>
367
+ </div>
368
+
369
+ {/* Content */}
370
+ <div className="flex-1 min-h-0">
371
+ {rightTab === 'chat' && <AgentChat agent={agent} />}
372
+ {rightTab === 'activity' && <AgentFeed agent={agent} />}
373
+ </div>
374
+ </div>
375
+ </div>
376
+ );
377
+ }
@@ -1,10 +1,23 @@
1
1
  // FSL-1.1-Apache-2.0 — see LICENSE
2
2
  import { useState, useRef, useEffect, useCallback } from 'react';
3
- import { Send, Loader2, Square, Paperclip, Image as ImageIcon } from 'lucide-react';
3
+ import { Send, Loader2, Square, Paperclip, Image as ImageIcon, Zap, Bot } from 'lucide-react';
4
4
  import { cn } from '../../lib/cn';
5
5
  import { formatModelName } from './model-picker';
6
6
 
7
- export function ChatInput({ onSend, onStop, sending, streaming, disabled, isImageModel, currentModel, replyContext, onClearReply, role }) {
7
+ const EFFORT_OPTIONS = [
8
+ { value: 'none', label: 'None' },
9
+ { value: 'low', label: 'Low' },
10
+ { value: 'medium', label: 'Med' },
11
+ { value: 'high', label: 'High' },
12
+ { value: 'xhigh', label: 'XHigh' },
13
+ ];
14
+
15
+ const VERBOSITY_OPTIONS = [
16
+ { value: 'low', label: 'Concise' },
17
+ { value: 'medium', label: 'Normal' },
18
+ ];
19
+
20
+ export function ChatInput({ onSend, onStop, sending, streaming, disabled, isImageModel, currentModel, replyContext, onClearReply, role, isCodex, reasoningEffort, onReasoningEffortChange, verbosity, onVerbosityChange, mode, onModeChange }) {
8
21
  const [input, setInput] = useState('');
9
22
  const textareaRef = useRef(null);
10
23
  const fileInputRef = useRef(null);
@@ -13,7 +26,7 @@ export function ChatInput({ onSend, onStop, sending, streaming, disabled, isImag
13
26
  const el = textareaRef.current;
14
27
  if (!el) return;
15
28
  el.style.height = 'auto';
16
- el.style.height = Math.min(el.scrollHeight, 200) + 'px';
29
+ el.style.height = Math.min(el.scrollHeight, 400) + 'px';
17
30
  }, []);
18
31
 
19
32
  useEffect(() => {
@@ -51,6 +64,7 @@ export function ChatInput({ onSend, onStop, sending, streaming, disabled, isImag
51
64
 
52
65
  const isActive = streaming || sending;
53
66
  const canSend = input.trim() && !sending && !disabled;
67
+ const currentMode = mode || 'api';
54
68
 
55
69
  const placeholder = disabled
56
70
  ? 'Select a model to start chatting...'
@@ -72,21 +86,26 @@ export function ChatInput({ onSend, onStop, sending, streaming, disabled, isImag
72
86
  </div>
73
87
  )}
74
88
 
75
- {currentModel && (
76
- <div className="flex items-center gap-2 mb-2">
77
- <div className={cn(
78
- 'flex items-center gap-1 h-6 px-2 rounded-md text-2xs font-mono border',
79
- isImageModel
80
- ? 'bg-purple/8 border-purple/20 text-purple'
81
- : 'bg-surface-3 border-border-subtle text-text-3',
82
- )}>
83
- {isImageModel && <ImageIcon size={9} />}
84
- <span className="max-w-[80px] truncate">{formatModelName(currentModel)}</span>
85
- </div>
86
- </div>
87
- )}
89
+ <textarea
90
+ ref={textareaRef}
91
+ value={input}
92
+ onChange={(e) => setInput(e.target.value)}
93
+ onKeyDown={onKeyDown}
94
+ placeholder={placeholder}
95
+ disabled={disabled}
96
+ rows={1}
97
+ className={cn(
98
+ 'w-full resize-y rounded-xl px-4 py-2.5 text-sm',
99
+ 'bg-surface-0 border text-text-0 font-sans',
100
+ 'placeholder:text-text-4',
101
+ 'focus:outline-none focus:ring-1',
102
+ 'min-h-[40px]',
103
+ 'border-border focus:ring-accent/40',
104
+ 'disabled:opacity-50 disabled:cursor-not-allowed',
105
+ )}
106
+ />
88
107
 
89
- <div className="flex items-end gap-2">
108
+ <div className="flex items-center gap-2 mt-2">
90
109
  <input
91
110
  ref={fileInputRef}
92
111
  type="file"
@@ -98,35 +117,93 @@ export function ChatInput({ onSend, onStop, sending, streaming, disabled, isImag
98
117
  <button
99
118
  onClick={() => fileInputRef.current?.click()}
100
119
  disabled={disabled}
101
- className="w-10 h-10 flex items-center justify-center rounded-xl text-text-4 hover:text-text-1 hover:bg-surface-3 transition-colors cursor-pointer disabled:opacity-30 disabled:cursor-not-allowed flex-shrink-0"
120
+ className="w-8 h-8 flex items-center justify-center rounded-lg text-text-4 hover:text-text-1 hover:bg-surface-3 transition-colors cursor-pointer disabled:opacity-30 disabled:cursor-not-allowed flex-shrink-0"
102
121
  title="Attach file"
103
122
  >
104
- <Paperclip size={16} />
123
+ <Paperclip size={14} />
105
124
  </button>
106
125
 
107
- <textarea
108
- ref={textareaRef}
109
- value={input}
110
- onChange={(e) => setInput(e.target.value)}
111
- onKeyDown={onKeyDown}
112
- placeholder={placeholder}
113
- disabled={disabled}
114
- rows={1}
115
- className={cn(
116
- 'flex-1 resize-y rounded-xl px-4 py-2.5 text-sm',
117
- 'bg-surface-0 border text-text-0 font-sans',
118
- 'placeholder:text-text-4',
119
- 'focus:outline-none focus:ring-1',
120
- 'min-h-[40px]',
121
- 'border-border focus:ring-accent/40',
122
- 'disabled:opacity-50 disabled:cursor-not-allowed',
123
- )}
124
- />
126
+ <div className="flex items-center h-7 rounded-lg bg-surface-3 border border-border-subtle p-0.5">
127
+ <button
128
+ onClick={() => onModeChange?.('api')}
129
+ className={cn(
130
+ 'flex items-center gap-1 h-6 px-2 rounded-md text-2xs font-semibold font-sans transition-colors cursor-pointer',
131
+ currentMode === 'api' ? 'bg-accent/15 text-accent border border-accent/25' : 'text-text-3 hover:text-text-1',
132
+ )}
133
+ title="Lightweight — fast and cheap, no tools"
134
+ >
135
+ <Zap size={11} /> Chat
136
+ </button>
137
+ <button
138
+ onClick={() => onModeChange?.('agent')}
139
+ className={cn(
140
+ 'flex items-center gap-1 h-6 px-2 rounded-md text-2xs font-semibold font-sans transition-colors cursor-pointer',
141
+ currentMode === 'agent' ? 'bg-purple/15 text-purple border border-purple/25' : 'text-text-3 hover:text-text-1',
142
+ )}
143
+ title="Full agent — tools, files, session resume"
144
+ >
145
+ <Bot size={11} /> Agent
146
+ </button>
147
+ </div>
148
+
149
+ {currentModel && (
150
+ <div className={cn(
151
+ 'flex items-center gap-1 h-6 px-2 rounded-md text-2xs font-mono border',
152
+ isImageModel
153
+ ? 'bg-purple/8 border-purple/20 text-purple'
154
+ : 'bg-surface-3 border-border-subtle text-text-3',
155
+ )}>
156
+ {isImageModel && <ImageIcon size={9} />}
157
+ <span className="max-w-[80px] truncate">{formatModelName(currentModel)}</span>
158
+ </div>
159
+ )}
160
+
161
+ {isCodex && (
162
+ <>
163
+ <div className="flex items-center h-6 rounded-md bg-surface-3 border border-border-subtle p-0.5">
164
+ {EFFORT_OPTIONS.map((opt) => (
165
+ <button
166
+ key={opt.value}
167
+ onClick={() => onReasoningEffortChange?.(opt.value)}
168
+ className={cn(
169
+ 'h-5 px-1.5 rounded text-2xs font-semibold font-sans transition-colors cursor-pointer',
170
+ reasoningEffort === opt.value
171
+ ? 'bg-accent/15 text-accent'
172
+ : 'text-text-4 hover:text-text-1',
173
+ )}
174
+ title={`Reasoning: ${opt.label}`}
175
+ >
176
+ {opt.label}
177
+ </button>
178
+ ))}
179
+ </div>
180
+
181
+ <div className="flex items-center h-6 rounded-md bg-surface-3 border border-border-subtle p-0.5">
182
+ {VERBOSITY_OPTIONS.map((opt) => (
183
+ <button
184
+ key={opt.value}
185
+ onClick={() => onVerbosityChange?.(opt.value)}
186
+ className={cn(
187
+ 'h-5 px-1.5 rounded text-2xs font-semibold font-sans transition-colors cursor-pointer',
188
+ verbosity === opt.value
189
+ ? 'bg-accent/15 text-accent'
190
+ : 'text-text-4 hover:text-text-1',
191
+ )}
192
+ title={`Verbosity: ${opt.label}`}
193
+ >
194
+ {opt.label}
195
+ </button>
196
+ ))}
197
+ </div>
198
+ </>
199
+ )}
200
+
201
+ <div className="flex-1" />
125
202
 
126
203
  {isActive ? (
127
204
  <button
128
205
  onClick={onStop}
129
- className="w-10 h-10 flex items-center justify-center rounded-xl bg-danger/80 text-white hover:bg-danger transition-all cursor-pointer shadow-lg shadow-danger/20 flex-shrink-0"
206
+ className="w-8 h-8 flex items-center justify-center rounded-lg bg-danger/80 text-white hover:bg-danger transition-all cursor-pointer shadow-lg shadow-danger/20 flex-shrink-0"
130
207
  title="Stop generation"
131
208
  >
132
209
  <Square size={14} fill="currentColor" />
@@ -136,14 +213,14 @@ export function ChatInput({ onSend, onStop, sending, streaming, disabled, isImag
136
213
  onClick={handleSend}
137
214
  disabled={!canSend}
138
215
  className={cn(
139
- 'w-10 h-10 flex items-center justify-center rounded-xl transition-all cursor-pointer flex-shrink-0',
216
+ 'w-8 h-8 flex items-center justify-center rounded-lg transition-all cursor-pointer flex-shrink-0',
140
217
  'disabled:opacity-20 disabled:cursor-not-allowed',
141
218
  canSend
142
219
  ? 'bg-accent/15 text-accent hover:bg-accent/25 border border-accent/25'
143
220
  : 'bg-surface-4 text-text-4',
144
221
  )}
145
222
  >
146
- {sending ? <Loader2 size={16} className="animate-spin" /> : <Send size={16} />}
223
+ {sending ? <Loader2 size={14} className="animate-spin" /> : <Send size={14} />}
147
224
  </button>
148
225
  )}
149
226
  </div>
@@ -3,7 +3,6 @@ import { useRef, useEffect, useState, useCallback } from 'react';
3
3
  import { Copy, Check, ArrowRight, Download, Maximize2, X, Image as ImageIcon, RefreshCw } from 'lucide-react';
4
4
  import { cn } from '../../lib/cn';
5
5
  import { timeAgo } from '../../lib/format';
6
- import { Avatar } from '../ui/avatar';
7
6
  import { ThinkingIndicator } from '../ui/thinking-indicator';
8
7
 
9
8
  const API_STATUS_MESSAGES = [
@@ -249,7 +248,7 @@ function UserMessage({ msg }) {
249
248
  return (
250
249
  <div className="flex justify-end">
251
250
  <div className="max-w-[85%]">
252
- <div className="px-3.5 py-2.5 rounded-2xl rounded-br-md bg-accent/10 border border-accent/15">
251
+ <div className="px-3.5 py-2.5 rounded-2xl rounded-br-md bg-info/10 border border-info/15">
253
252
  <p className="text-sm text-text-0 font-sans whitespace-pre-wrap break-words leading-relaxed">{msg.text}</p>
254
253
  </div>
255
254
  <div className="text-2xs text-text-4 font-sans mt-1 text-right">{timeAgo(msg.timestamp)}</div>
@@ -260,20 +259,18 @@ function UserMessage({ msg }) {
260
259
 
261
260
  function AssistantMessage({ msg, model, role }) {
262
261
  const cleanText = stripEmojis(msg.text);
263
- const displayName = model || 'Assistant';
264
- const avatarRole = role || 'chat';
262
+ const displayName = role
263
+ ? `${model || 'Assistant'} ${role.charAt(0).toUpperCase() + role.slice(1)}`
264
+ : (model || 'Assistant');
265
265
  return (
266
- <div className="flex gap-2.5">
267
- <Avatar name={displayName} role={avatarRole} size="sm" className="mt-1 flex-shrink-0" />
268
- <div className="max-w-[85%]">
269
- <div className="text-2xs text-text-3 font-sans mb-1 font-medium">{displayName}</div>
270
- <div className="border-l-2 border-accent/40 pl-3.5 py-1">
271
- <div className="text-sm text-text-1 font-sans whitespace-pre-wrap break-words leading-relaxed">
272
- <RenderedMarkdown text={cleanText} />
273
- </div>
266
+ <div className="max-w-[85%]">
267
+ <div className="text-2xs text-text-3 font-sans mb-1 font-medium">{displayName}</div>
268
+ <div className="border-l-2 border-accent/40 pl-3.5 py-1">
269
+ <div className="text-sm text-text-1 font-sans whitespace-pre-wrap break-words leading-relaxed">
270
+ <RenderedMarkdown text={cleanText} />
274
271
  </div>
275
- <div className="text-2xs text-text-4 font-sans mt-1">{timeAgo(msg.timestamp)}</div>
276
272
  </div>
273
+ <div className="text-2xs text-text-4 font-sans mt-1">{timeAgo(msg.timestamp)}</div>
277
274
  </div>
278
275
  );
279
276
  }