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
@@ -45,12 +45,20 @@ export function ChatView() {
45
45
  const conversationRoles = useGrooveStore((s) => s.conversationRoles);
46
46
  const setConversationRole = useGrooveStore((s) => s.setConversationRole);
47
47
 
48
+ const conversationReasoningEffort = useGrooveStore((s) => s.conversationReasoningEffort);
49
+ const setConversationReasoningEffort = useGrooveStore((s) => s.setConversationReasoningEffort);
50
+ const conversationVerbosity = useGrooveStore((s) => s.conversationVerbosity);
51
+ const setConversationVerbosity = useGrooveStore((s) => s.setConversationVerbosity);
52
+
48
53
  const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
49
54
  const [replyContext, setReplyContext] = useState(null);
50
55
 
51
56
  const activeRole = activeConversationId ? (conversationRoles?.[activeConversationId] || null) : null;
57
+ const activeReasoningEffort = activeConversationId ? (conversationReasoningEffort?.[activeConversationId] || 'medium') : 'medium';
58
+ const activeVerbosity = activeConversationId ? (conversationVerbosity?.[activeConversationId] || 'medium') : 'medium';
52
59
 
53
60
  const activeConversation = conversations.find((c) => c.id === activeConversationId) || null;
61
+ const isCodexProvider = activeConversation?.provider === 'codex';
54
62
  const messages = activeConversationId ? (conversationMessages[activeConversationId] || []) : [];
55
63
  const isStreaming = streamingConversationId === activeConversationId && sendingMessage;
56
64
  const currentModelIsImage = activeConversation ? isImageModel(activeConversation.model) : false;
@@ -108,6 +116,16 @@ export function ChatView() {
108
116
  setReplyContext(msg);
109
117
  }, []);
110
118
 
119
+ const handleReasoningEffortChange = useCallback((effort) => {
120
+ if (!activeConversationId) return;
121
+ setConversationReasoningEffort(activeConversationId, effort);
122
+ }, [activeConversationId, setConversationReasoningEffort]);
123
+
124
+ const handleVerbosityChange = useCallback((verbosity) => {
125
+ if (!activeConversationId) return;
126
+ setConversationVerbosity(activeConversationId, verbosity);
127
+ }, [activeConversationId, setConversationVerbosity]);
128
+
111
129
  const currentModel = activeConversation
112
130
  ? { provider: activeConversation.provider, model: activeConversation.model }
113
131
  : null;
@@ -116,7 +134,7 @@ export function ChatView() {
116
134
  <div className="flex h-full bg-surface-0">
117
135
  {/* Conversation sidebar */}
118
136
  <div className={cn(
119
- 'flex-shrink-0 border-r border-accent/12 bg-surface-1 transition-all duration-200 overflow-hidden',
137
+ 'flex-shrink-0 border-r border-accent/12 bg-accent transition-all duration-200 overflow-hidden',
120
138
  sidebarCollapsed ? 'w-0' : 'w-64',
121
139
  )}>
122
140
  <ConversationList onNewChat={() => handleNewChat()} />
@@ -146,6 +164,13 @@ export function ChatView() {
146
164
  replyContext={replyContext}
147
165
  onClearReply={() => setReplyContext(null)}
148
166
  role={activeRole}
167
+ isCodex={isCodexProvider}
168
+ reasoningEffort={activeReasoningEffort}
169
+ onReasoningEffortChange={handleReasoningEffortChange}
170
+ verbosity={activeVerbosity}
171
+ onVerbosityChange={handleVerbosityChange}
172
+ mode={activeConversation?.mode || 'api'}
173
+ onModeChange={handleModeChange}
149
174
  />
150
175
  </>
151
176
  ) : (
@@ -31,7 +31,7 @@ function groupByDate(conversations) {
31
31
  function GroupLabel({ label }) {
32
32
  return (
33
33
  <div className="px-3 pt-4 pb-1.5">
34
- <span className="text-2xs font-semibold text-text-4 uppercase tracking-wider font-sans">{label}</span>
34
+ <span className="text-2xs font-semibold text-white/60 uppercase tracking-wider font-sans">{label}</span>
35
35
  </div>
36
36
  );
37
37
  }
@@ -45,23 +45,23 @@ function ConversationItem({ conv, isActive, onSelect, onRename, onPin, onDelete
45
45
  className={cn(
46
46
  'w-full flex items-center gap-2 px-3 py-2 text-left rounded-md transition-colors cursor-pointer group',
47
47
  isActive
48
- ? 'bg-accent/10 text-text-0'
49
- : 'text-text-2 hover:bg-surface-4 hover:text-text-1',
48
+ ? 'bg-white/15 text-white'
49
+ : 'text-white/80 hover:bg-white/10 hover:text-white',
50
50
  )}
51
51
  >
52
- <MessageCircle size={13} className={cn('flex-shrink-0', isActive ? 'text-accent' : 'text-text-4 group-hover:text-text-3')} />
52
+ <MessageCircle size={13} className={cn('flex-shrink-0', isActive ? 'text-white' : 'text-white/50 group-hover:text-white/70')} />
53
53
  <div className="flex-1 min-w-0">
54
- <div className="text-xs font-medium font-sans truncate">{conv.title || 'New Chat'}</div>
54
+ <div className="text-xs font-medium font-sans truncate text-white">{conv.title || 'New Chat'}</div>
55
55
  <div className="flex items-center gap-1.5 mt-0.5">
56
56
  {conv.mode === 'agent'
57
- ? <Bot size={9} className="text-purple flex-shrink-0" />
58
- : <Zap size={9} className="text-accent flex-shrink-0" />
57
+ ? <Bot size={9} className="text-white/70 flex-shrink-0" />
58
+ : <Zap size={9} className="text-white/70 flex-shrink-0" />
59
59
  }
60
60
  {conv.model && <Badge variant="default" className="text-[8px] px-1 py-0">{formatModelName(conv.model)}</Badge>}
61
- <span className="text-2xs text-text-4 font-sans">{timeAgo(conv.updatedAt || conv.createdAt)}</span>
61
+ <span className="text-2xs text-white/50 font-sans">{timeAgo(conv.updatedAt || conv.createdAt)}</span>
62
62
  </div>
63
63
  </div>
64
- {conv.pinned && <Pin size={10} className="text-accent flex-shrink-0" />}
64
+ {conv.pinned && <Pin size={10} className="text-white flex-shrink-0" />}
65
65
  </button>
66
66
  </ContextMenuTrigger>
67
67
  <ContextMenuContent>
@@ -125,9 +125,9 @@ export function ConversationList({ onNewChat }) {
125
125
  <div className="flex-1 overflow-y-auto px-1.5 pt-3 pb-3 space-y-0.5">
126
126
  {conversations.length === 0 ? (
127
127
  <div className="flex flex-col items-center justify-center py-16 text-center px-4">
128
- <MessageCircle size={24} className="text-text-4 mb-3" />
129
- <p className="text-xs text-text-3 font-sans">No conversations yet</p>
130
- <p className="text-2xs text-text-4 font-sans mt-1">Start a new chat to begin</p>
128
+ <MessageCircle size={24} className="text-white/50 mb-3" />
129
+ <p className="text-xs text-white/80 font-sans">No conversations yet</p>
130
+ <p className="text-2xs text-white/60 font-sans mt-1">Start a new chat to begin</p>
131
131
  </div>
132
132
  ) : (
133
133
  <>
@@ -140,10 +140,10 @@ export function ConversationList({ onNewChat }) {
140
140
  )}
141
141
  </div>
142
142
 
143
- <div className="p-3 border-t border-border-subtle">
143
+ <div className="p-3 border-t border-white/15">
144
144
  <button
145
145
  onClick={onNewChat}
146
- className="w-full flex items-center justify-center gap-2 h-9 rounded-lg bg-accent/15 text-accent text-xs font-semibold font-sans hover:bg-accent/25 transition-colors cursor-pointer border border-accent/20"
146
+ className="w-full flex items-center justify-center gap-2 h-9 rounded-lg bg-white/15 text-white text-xs font-semibold font-sans hover:bg-white/25 transition-colors cursor-pointer border border-white/20"
147
147
  >
148
148
  <Plus size={14} />
149
149
  New Chat
@@ -23,6 +23,10 @@ const TIER_CONFIG = {
23
23
 
24
24
  function getTier(model) {
25
25
  const name = (model || '').toLowerCase();
26
+ if (name.includes('gpt-5.5') || name.includes('gpt-5.4-pro')) return 'frontier';
27
+ if (name.includes('gpt-5.4-mini') || name.includes('gpt-5-mini')) return 'mid';
28
+ if (name.includes('gpt-5.4-nano') || name.includes('gpt-5-nano')) return 'fast';
29
+ if (name.includes('gpt-5.4')) return 'frontier';
26
30
  if (name.includes('opus') || name.includes('pro') || name.includes('o3') || name.includes('gpt-4o')) return 'frontier';
27
31
  if (name.includes('sonnet') || name.includes('flash') || name.includes('o4-mini')) return 'mid';
28
32
  return 'fast';
@@ -30,6 +34,7 @@ function getTier(model) {
30
34
 
31
35
  function getContextSize(model) {
32
36
  const name = (model || '').toLowerCase();
37
+ if (name.startsWith('gpt-5')) return '200k';
33
38
  if (name.includes('opus') || name.includes('sonnet')) return '200k';
34
39
  if (name.includes('haiku')) return '200k';
35
40
  if (name.includes('pro')) return '1M';
@@ -224,7 +224,7 @@ const DEVICE_WIDTHS = {
224
224
  mobile: '375px',
225
225
  };
226
226
 
227
- export function PreviewWorkspace() {
227
+ export function PreviewWorkspace({ embedded = false }) {
228
228
  const previewState = useGrooveStore((s) => s.previewState);
229
229
  const iframeRef = useRef(null);
230
230
  const [iframeKey, setIframeKey] = useState(0);
@@ -269,10 +269,11 @@ export function PreviewWorkspace() {
269
269
  </div>
270
270
  </div>
271
271
 
272
- {/* Right pane: chat */}
273
- <div className="flex-[2] min-w-[280px] max-w-[480px] border-l border-border md:max-w-none md:flex-[2]">
274
- <PreviewChat />
275
- </div>
272
+ {!embedded && (
273
+ <div className="flex-[2] min-w-[280px] max-w-[480px] border-l border-border md:max-w-none md:flex-[2]">
274
+ <PreviewChat />
275
+ </div>
276
+ )}
276
277
  </div>
277
278
  );
278
279
  }
@@ -2,6 +2,7 @@
2
2
  import { useState, useRef, useCallback, useEffect } from 'react';
3
3
  import { Send, X, Loader2 } from 'lucide-react';
4
4
  import { useGrooveStore } from '../../stores/groove';
5
+ import html2canvas from 'html2canvas';
5
6
 
6
7
  export function ScreenshotOverlay({ iframeRef }) {
7
8
  const toggleScreenshotMode = useGrooveStore((s) => s.toggleScreenshotMode);
@@ -77,37 +78,48 @@ export function ScreenshotOverlay({ iframeRef }) {
77
78
  return canvas.toDataURL('image/png');
78
79
  }
79
80
 
80
- try {
81
- const iframe = iframeRef.current;
82
- if (!iframe) { finishCapture(drawPlaceholder()); return; }
81
+ const iframe = iframeRef.current;
82
+ if (!iframe) { finishCapture(drawPlaceholder()); return; }
83
83
 
84
- const canvas = document.createElement('canvas');
85
- const dpr = window.devicePixelRatio || 1;
86
- canvas.width = selRect.w * dpr;
87
- canvas.height = selRect.h * dpr;
88
- const ctx = canvas.getContext('2d');
89
- ctx.scale(dpr, dpr);
84
+ const iframeRect = iframe.getBoundingClientRect();
85
+ const overlayRect = overlayRef.current.getBoundingClientRect();
86
+ const offsetX = selRect.x - (iframeRect.left - overlayRect.left);
87
+ const offsetY = selRect.y - (iframeRect.top - overlayRect.top);
90
88
 
91
- const iframeRect = iframe.getBoundingClientRect();
92
- const overlayRect = overlayRef.current.getBoundingClientRect();
93
- const offsetX = selRect.x - (iframeRect.left - overlayRect.left);
94
- const offsetY = selRect.y - (iframeRect.top - overlayRect.top);
95
-
96
- try {
97
- ctx.drawImage(iframe, -offsetX * dpr, -offsetY * dpr, iframeRect.width * dpr, iframeRect.height * dpr, 0, 0, selRect.w, selRect.h);
98
- const testPixel = ctx.getImageData(0, 0, 1, 1).data;
99
- if (testPixel[0] === 0 && testPixel[1] === 0 && testPixel[2] === 0 && testPixel[3] === 0) {
100
- throw new Error('blank');
101
- }
102
- finishCapture(canvas.toDataURL('image/png'));
103
- } catch {
104
- finishCapture(drawPlaceholder());
105
- }
106
- } catch {
107
- setStart(null);
108
- setEnd(null);
109
- setCaptured(null);
110
- }
89
+ let iframeBody;
90
+ try {
91
+ iframeBody = iframe.contentDocument?.body || iframe.contentWindow?.document?.body;
92
+ } catch { /* cross-origin fallback */ }
93
+
94
+ if (!iframeBody) { finishCapture(drawPlaceholder()); return; }
95
+
96
+ html2canvas(iframeBody, {
97
+ width: iframeRect.width,
98
+ height: iframeRect.height,
99
+ windowWidth: iframeRect.width,
100
+ windowHeight: iframeRect.height,
101
+ x: 0,
102
+ y: 0,
103
+ useCORS: true,
104
+ logging: false,
105
+ }).then((fullCanvas) => {
106
+ const dpr = window.devicePixelRatio || 1;
107
+ const cropCanvas = document.createElement('canvas');
108
+ cropCanvas.width = selRect.w * dpr;
109
+ cropCanvas.height = selRect.h * dpr;
110
+ const ctx = cropCanvas.getContext('2d');
111
+ ctx.drawImage(
112
+ fullCanvas,
113
+ offsetX * (fullCanvas.width / iframeRect.width),
114
+ offsetY * (fullCanvas.height / iframeRect.height),
115
+ selRect.w * (fullCanvas.width / iframeRect.width),
116
+ selRect.h * (fullCanvas.height / iframeRect.height),
117
+ 0, 0, cropCanvas.width, cropCanvas.height,
118
+ );
119
+ finishCapture(cropCanvas.toDataURL('image/png'));
120
+ }).catch(() => {
121
+ finishCapture(drawPlaceholder());
122
+ });
111
123
  }, [dragging, start, end, iframeRef]);
112
124
 
113
125
  useEffect(() => {
@@ -58,6 +58,7 @@ export const useGrooveStore = create((set, get) => ({
58
58
 
59
59
  // ── Preview ───────────────────────────────────────────────
60
60
  previewState: { url: null, teamId: null, kind: null, deviceSize: 'desktop', screenshotMode: false },
61
+ showPreviewInAgents: false,
61
62
  previewChat: [],
62
63
  previewIterating: false,
63
64
 
@@ -91,6 +92,8 @@ export const useGrooveStore = create((set, get) => ({
91
92
  sendingMessage: false,
92
93
  streamingConversationId: null,
93
94
  conversationRoles: loadJSON('groove:conversationRoles'),
95
+ conversationReasoningEffort: loadJSON('groove:conversationReasoningEffort'),
96
+ conversationVerbosity: loadJSON('groove:conversationVerbosity'),
94
97
 
95
98
  // ── Approvals ─────────────────────────────────────────────
96
99
  pendingApprovals: [],
@@ -172,6 +175,13 @@ export const useGrooveStore = create((set, get) => ({
172
175
  editorRecentSaves: {},
173
176
  editorSidebarWidth: Number(localStorage.getItem('groove:editorSidebarWidth')) || 240,
174
177
 
178
+ // ── Workspace Mode ────────────────────────────────────────
179
+ workspaceMode: localStorage.getItem('groove:workspaceMode') === 'true',
180
+ workspaceAgentId: null,
181
+ workspaceSnapshots: {},
182
+ workspaceReviewMode: false,
183
+ workspaceReviewFiles: [],
184
+
175
185
  // ── Onboarding ────────────────────────────────────────────
176
186
  onboardingComplete: localStorage.getItem('groove:onboardingComplete') === 'true',
177
187
 
@@ -450,6 +460,15 @@ export const useGrooveStore = create((set, get) => ({
450
460
  if (msg.error && msg.agentId) {
451
461
  get().addChatMessage(msg.agentId, 'system', `Crashed: ${msg.error}`);
452
462
  }
463
+ // Clear workspace if the exiting agent was the workspace target
464
+ if (get().workspaceAgentId === msg.agentId) {
465
+ const teamAgents = get().agents.filter(
466
+ (a) => a.id !== msg.agentId && a.teamId === get().activeTeamId,
467
+ );
468
+ const next = teamAgents.find((a) => a.status === 'running') || teamAgents[0];
469
+ set({ workspaceAgentId: next?.id || null });
470
+ }
471
+
453
472
  // Check for recommended team when planner completes
454
473
  if (agent?.role === 'planner' && msg.status === 'completed') {
455
474
  setTimeout(() => get().checkRecommendedTeam(), 1000);
@@ -566,6 +585,13 @@ export const useGrooveStore = create((set, get) => ({
566
585
  const savedAt = get().editorRecentSaves[msg.path];
567
586
  if (savedAt && Date.now() - savedAt < 2000) break;
568
587
  set((s) => ({ editorChangedFiles: { ...s.editorChangedFiles, [msg.path]: msg.timestamp } }));
588
+ // Auto-capture workspace snapshot for diff viewer
589
+ if (get().workspaceMode && msg.path && !get().workspaceSnapshots[msg.path]) {
590
+ const existing = get().editorFiles[msg.path];
591
+ if (existing?.content) {
592
+ get().captureSnapshot(msg.path, existing.content);
593
+ }
594
+ }
569
595
  break;
570
596
  }
571
597
 
@@ -1187,14 +1213,17 @@ export const useGrooveStore = create((set, get) => ({
1187
1213
  // ── Preview ──────────────────────────────────────────────
1188
1214
 
1189
1215
  openPreview(url, teamId, kind) {
1190
- set({ previewState: { url, teamId, kind, deviceSize: 'desktop', screenshotMode: false }, previewChat: [], activeView: 'preview' });
1216
+ set({ previewState: { url, teamId, kind, deviceSize: 'desktop', screenshotMode: false }, previewChat: [], showPreviewInAgents: true });
1191
1217
  },
1192
1218
  closePreview() {
1193
1219
  const { previewState } = get();
1194
1220
  if (previewState.teamId) {
1195
1221
  api.delete(`/preview/${previewState.teamId}`).catch(() => {});
1196
1222
  }
1197
- set({ previewState: { url: null, teamId: null, kind: null, deviceSize: 'desktop', screenshotMode: false }, previewChat: [], previewIterating: false, activeView: 'agents' });
1223
+ set({ previewState: { url: null, teamId: null, kind: null, deviceSize: 'desktop', screenshotMode: false }, previewChat: [], previewIterating: false, showPreviewInAgents: false, activeView: 'agents' });
1224
+ },
1225
+ togglePreviewInAgents() {
1226
+ set((s) => ({ showPreviewInAgents: !s.showPreviewInAgents }));
1198
1227
  },
1199
1228
  setPreviewDevice(size) {
1200
1229
  set((s) => ({ previewState: { ...s.previewState, deviceSize: size } }));
@@ -2046,7 +2075,13 @@ export const useGrooveStore = create((set, get) => ({
2046
2075
  const conversationRoles = { ...s.conversationRoles };
2047
2076
  delete conversationRoles[id];
2048
2077
  persistJSON('groove:conversationRoles', conversationRoles);
2049
- return { conversations, conversationMessages, conversationRoles, activeConversationId };
2078
+ const conversationReasoningEffort = { ...s.conversationReasoningEffort };
2079
+ delete conversationReasoningEffort[id];
2080
+ persistJSON('groove:conversationReasoningEffort', conversationReasoningEffort);
2081
+ const conversationVerbosity = { ...s.conversationVerbosity };
2082
+ delete conversationVerbosity[id];
2083
+ persistJSON('groove:conversationVerbosity', conversationVerbosity);
2084
+ return { conversations, conversationMessages, conversationRoles, conversationReasoningEffort, conversationVerbosity, activeConversationId };
2050
2085
  });
2051
2086
  } catch (err) {
2052
2087
  get().addToast('error', 'Delete failed', err.message);
@@ -2089,6 +2124,24 @@ export const useGrooveStore = create((set, get) => ({
2089
2124
  });
2090
2125
  },
2091
2126
 
2127
+ setConversationReasoningEffort(id, effort) {
2128
+ set((s) => {
2129
+ const map = { ...s.conversationReasoningEffort };
2130
+ map[id] = effort || 'medium';
2131
+ persistJSON('groove:conversationReasoningEffort', map);
2132
+ return { conversationReasoningEffort: map };
2133
+ });
2134
+ },
2135
+
2136
+ setConversationVerbosity(id, verbosity) {
2137
+ set((s) => {
2138
+ const map = { ...s.conversationVerbosity };
2139
+ map[id] = verbosity || 'medium';
2140
+ persistJSON('groove:conversationVerbosity', map);
2141
+ return { conversationVerbosity: map };
2142
+ });
2143
+ },
2144
+
2092
2145
  async sendChatMessage(conversationId, message) {
2093
2146
  const conv = get().conversations.find((c) => c.id === conversationId);
2094
2147
  if (!conv) return;
@@ -2118,6 +2171,12 @@ export const useGrooveStore = create((set, get) => ({
2118
2171
  ...body.history,
2119
2172
  ];
2120
2173
  }
2174
+ const effort = get().conversationReasoningEffort?.[conversationId] || 'medium';
2175
+ const verbosity = get().conversationVerbosity?.[conversationId] || 'medium';
2176
+ if (conv.provider === 'codex') {
2177
+ body.reasoning_effort = effort;
2178
+ body.verbosity = verbosity;
2179
+ }
2121
2180
  await api.post(`/conversations/${encodeURIComponent(conversationId)}/message`, body);
2122
2181
  } catch (err) {
2123
2182
  set((s) => {
@@ -2299,6 +2358,82 @@ export const useGrooveStore = create((set, get) => ({
2299
2358
  }
2300
2359
  },
2301
2360
 
2361
+ // ── Workspace Mode ────────────────────────────────────────
2362
+
2363
+ setWorkspaceMode(on) {
2364
+ set({ workspaceMode: on });
2365
+ localStorage.setItem('groove:workspaceMode', String(on));
2366
+ if (on && !get().workspaceAgentId) {
2367
+ const teamAgents = get().agents.filter((a) => a.teamId === get().activeTeamId);
2368
+ const selected = get().detailPanel?.type === 'agent' ? get().detailPanel.agentId : null;
2369
+ const running = teamAgents.find((a) => a.status === 'running');
2370
+ set({ workspaceAgentId: selected || running?.id || teamAgents[0]?.id || null });
2371
+ }
2372
+ },
2373
+
2374
+ setWorkspaceAgent(id) {
2375
+ set({ workspaceAgentId: id });
2376
+ },
2377
+
2378
+ captureSnapshot(path, content) {
2379
+ set((s) => {
2380
+ if (s.workspaceSnapshots[path]) return s;
2381
+ const next = { ...s.workspaceSnapshots, [path]: content };
2382
+ const keys = Object.keys(next);
2383
+ if (keys.length > 200) {
2384
+ delete next[keys[0]];
2385
+ }
2386
+ return { workspaceSnapshots: next };
2387
+ });
2388
+ },
2389
+
2390
+ toggleReviewMode() {
2391
+ const st = get();
2392
+ if (st.workspaceReviewMode) {
2393
+ set({ workspaceReviewMode: false, workspaceReviewFiles: [] });
2394
+ return;
2395
+ }
2396
+ const agentId = st.workspaceAgentId;
2397
+ const log = st.activityLog[agentId] || [];
2398
+ const seen = new Set();
2399
+ const files = [];
2400
+ for (const entry of log) {
2401
+ const t = (entry.text || '').toLowerCase();
2402
+ if (!(t.includes('writ') || t.includes('edit') || t.includes('creat'))) continue;
2403
+ const match = entry.text.match(/(?:Write|Edit|Create|wrote|editing|writing)\S*\s+(\S+)/i);
2404
+ if (!match) continue;
2405
+ const path = match[1];
2406
+ if (seen.has(path)) continue;
2407
+ seen.add(path);
2408
+ files.push({ path, status: 'pending', comment: '' });
2409
+ }
2410
+ set({ workspaceReviewMode: true, workspaceReviewFiles: files });
2411
+ },
2412
+
2413
+ approveFile(path) {
2414
+ set((s) => ({
2415
+ workspaceReviewFiles: s.workspaceReviewFiles.map((f) =>
2416
+ f.path === path ? { ...f, status: 'approved' } : f,
2417
+ ),
2418
+ }));
2419
+ },
2420
+
2421
+ rejectFile(path) {
2422
+ set((s) => ({
2423
+ workspaceReviewFiles: s.workspaceReviewFiles.map((f) =>
2424
+ f.path === path ? { ...f, status: 'rejected' } : f,
2425
+ ),
2426
+ }));
2427
+ },
2428
+
2429
+ commentFile(path, comment) {
2430
+ set((s) => ({
2431
+ workspaceReviewFiles: s.workspaceReviewFiles.map((f) =>
2432
+ f.path === path ? { ...f, comment } : f,
2433
+ ),
2434
+ }));
2435
+ },
2436
+
2302
2437
  // ── Federation ────────────────────────────────────────────
2303
2438
 
2304
2439
  async fetchFederationStatus() {
@@ -10,7 +10,9 @@ import { RootNode } from '../components/agents/root-node';
10
10
  import { cn } from '../lib/cn';
11
11
  import { Button } from '../components/ui/button';
12
12
  import { Badge } from '../components/ui/badge';
13
- import { Plus, Users, Zap, X, Check, Rocket, Server, Monitor, Code2, TestTube, Shield, Pencil, Copy, Trash2, ChevronDown, ChevronLeft, ChevronRight, FolderOpen, Radio } from 'lucide-react';
13
+ import { Plus, Users, Zap, X, Check, Rocket, Server, Monitor, Code2, TestTube, Shield, Pencil, Copy, Trash2, ChevronDown, ChevronLeft, ChevronRight, FolderOpen, Radio, Eye } from 'lucide-react';
14
+ import { PreviewWorkspace } from '../components/preview/preview-workspace';
15
+ import { WorkspaceMode } from '../components/agents/workspace-mode';
14
16
  import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuSeparator } from '../components/ui/context-menu';
15
17
 
16
18
  const NODE_TYPES = { agentNode: AgentNode, rootNode: RootNode };
@@ -795,6 +797,11 @@ export default function AgentsView() {
795
797
  const selectAgent = useGrooveStore((s) => s.selectAgent);
796
798
  const recommendedTeam = useGrooveStore((s) => s.recommendedTeam);
797
799
  const checkRecommendedTeam = useGrooveStore((s) => s.checkRecommendedTeam);
800
+ const showPreviewInAgents = useGrooveStore((s) => s.showPreviewInAgents);
801
+ const previewState = useGrooveStore((s) => s.previewState);
802
+ const togglePreviewInAgents = useGrooveStore((s) => s.togglePreviewInAgents);
803
+ const workspaceMode = useGrooveStore((s) => s.workspaceMode);
804
+ const setWorkspaceMode = useGrooveStore((s) => s.setWorkspaceMode);
798
805
 
799
806
  // Poll for recommended team while a planner is running
800
807
  useEffect(() => {
@@ -845,14 +852,18 @@ export default function AgentsView() {
845
852
  </div>
846
853
  ) : teamAgents.length === 0 ? (
847
854
  <EmptyState onPlanner={launchPlanner} onSpawn={() => openDetail({ type: 'spawn' })} />
855
+ ) : workspaceMode ? (
856
+ <WorkspaceMode />
857
+ ) : showPreviewInAgents && previewState.url ? (
858
+ <PreviewWorkspace embedded />
848
859
  ) : (
849
860
  <ReactFlowProvider key={activeTeamId}>
850
861
  <AgentTreeInner />
851
862
  </ReactFlowProvider>
852
863
  )}
853
864
  </div>
854
- <RecommendedTeamCard />
855
- {!isLoading && teamAgents.length > 0 && (
865
+ {!workspaceMode && <RecommendedTeamCard />}
866
+ {!isLoading && teamAgents.length > 0 && !workspaceMode && (
856
867
  <button
857
868
  onClick={() => openDetail({ type: 'spawn' })}
858
869
  className="absolute bottom-4 left-4 z-40 flex items-center gap-1.5 h-8 px-4 rounded-md bg-accent/15 text-accent text-xs font-semibold font-sans hover:bg-accent/25 transition-colors cursor-pointer select-none shadow-lg shadow-black/10"
@@ -861,6 +872,28 @@ export default function AgentsView() {
861
872
  Spawn
862
873
  </button>
863
874
  )}
875
+ {!isLoading && teamAgents.length > 0 && (
876
+ <button
877
+ onClick={() => setWorkspaceMode(!workspaceMode)}
878
+ className={cn(
879
+ 'absolute bottom-4 z-40 flex items-center gap-1.5 h-8 px-4 rounded-md text-xs font-semibold font-sans transition-colors cursor-pointer select-none shadow-lg shadow-black/10',
880
+ previewState.url && !workspaceMode ? 'right-32' : 'right-4',
881
+ workspaceMode
882
+ ? 'bg-accent/15 text-accent hover:bg-accent/25'
883
+ : 'bg-purple/15 text-purple hover:bg-purple/25',
884
+ )}
885
+ >
886
+ {workspaceMode ? <><Users size={14} /> Tree</> : <><Code2 size={14} /> Workspace</>}
887
+ </button>
888
+ )}
889
+ {!isLoading && teamAgents.length > 0 && !workspaceMode && previewState.url && (
890
+ <button
891
+ onClick={togglePreviewInAgents}
892
+ className="absolute bottom-4 right-4 z-40 flex items-center gap-1.5 h-8 px-4 rounded-md bg-info/15 text-info text-xs font-semibold font-sans hover:bg-info/25 transition-colors cursor-pointer select-none shadow-lg shadow-black/10"
893
+ >
894
+ {showPreviewInAgents ? <><Users size={14} /> Team</> : <><Eye size={14} /> Preview</>}
895
+ </button>
896
+ )}
864
897
  </div>
865
898
  );
866
899
  }