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
@@ -16,7 +16,7 @@ import { OllamaProvider } from './providers/ollama.js';
16
16
  import { ClaudeCodeProvider } from './providers/claude-code.js';
17
17
  import { supportsSignalFlag, compareSemver, parseSemver } from './providers/groove-network.js';
18
18
  import { ConsentManager } from '../../../moe-training/client/index.js';
19
- import { validateAgentConfig } from './validate.js';
19
+ import { validateAgentConfig, validateReasoningEffort, validateVerbosity } from './validate.js';
20
20
  import { ROLE_INTEGRATIONS, wrapWithRoleReminder } from './process.js';
21
21
 
22
22
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -72,6 +72,9 @@ async function _executeApprovalRetry(daemon, approval) {
72
72
  }
73
73
  }
74
74
 
75
+ const FILE_READ_TOOLS = new Set(['Read', 'read_file']);
76
+ const FILE_WRITE_TOOLS = new Set(['Write', 'Edit', 'write_file', 'edit_file', 'create_file']);
77
+
75
78
  export function createApi(app, daemon) {
76
79
  _daemon = daemon;
77
80
 
@@ -325,6 +328,14 @@ export function createApi(app, daemon) {
325
328
  }
326
329
  }
327
330
 
331
+ // Track file operations for the files-touched API
332
+ if (targets.length > 0) {
333
+ const op = FILE_WRITE_TOOLS.has(toolName) ? 'write' : FILE_READ_TOOLS.has(toolName) ? 'read' : null;
334
+ if (op) {
335
+ for (const t of targets) daemon.registry.trackFileOp(agentId, t, op);
336
+ }
337
+ }
338
+
328
339
  daemon.audit.log('knock.allowed', { agentId, toolName, targets });
329
340
  res.json({ allow: true });
330
341
  });
@@ -1100,14 +1111,19 @@ export function createApi(app, daemon) {
1100
1111
 
1101
1112
  app.post('/api/conversations', async (req, res) => {
1102
1113
  try {
1103
- const { provider, model, title, mode } = req.body;
1114
+ const { provider, model, title, mode, reasoning_effort, verbosity } = req.body;
1104
1115
  if (!provider || typeof provider !== 'string') {
1105
1116
  return res.status(400).json({ error: 'provider is required' });
1106
1117
  }
1107
1118
  if (mode && mode !== 'api' && mode !== 'agent') {
1108
1119
  return res.status(400).json({ error: 'mode must be "api" or "agent"' });
1109
1120
  }
1110
- const conversation = await daemon.conversations.create(provider, model, title, mode || 'api');
1121
+ const validatedEffort = validateReasoningEffort(reasoning_effort);
1122
+ const validatedVerbosity = validateVerbosity(verbosity);
1123
+ const conversation = await daemon.conversations.create(provider, model, title, mode || 'api', {
1124
+ reasoningEffort: validatedEffort,
1125
+ verbosity: validatedVerbosity,
1126
+ });
1111
1127
  daemon.audit.log('conversation.create', { id: conversation.id, provider, model, mode: conversation.mode });
1112
1128
  res.status(201).json(conversation);
1113
1129
  } catch (err) {
@@ -1139,6 +1155,11 @@ export function createApi(app, daemon) {
1139
1155
  }
1140
1156
  await daemon.conversations.setMode(req.params.id, req.body.mode);
1141
1157
  }
1158
+ if (req.body.reasoning_effort !== undefined || req.body.verbosity !== undefined) {
1159
+ const validatedEffort = req.body.reasoning_effort !== undefined ? validateReasoningEffort(req.body.reasoning_effort) : undefined;
1160
+ const validatedVerbosity = req.body.verbosity !== undefined ? validateVerbosity(req.body.verbosity) : undefined;
1161
+ daemon.conversations.updateReasoningSettings(req.params.id, validatedEffort, validatedVerbosity);
1162
+ }
1142
1163
  daemon.audit.log('conversation.update', { id: req.params.id, provider: req.body.provider, model: req.body.model, mode: req.body.mode });
1143
1164
  res.json(daemon.conversations.get(req.params.id));
1144
1165
  } catch (err) {
@@ -1160,10 +1181,13 @@ export function createApi(app, daemon) {
1160
1181
 
1161
1182
  app.post('/api/conversations/:id/message', async (req, res) => {
1162
1183
  try {
1163
- const { message, history } = req.body;
1184
+ const { message, history, reasoning_effort, verbosity } = req.body;
1164
1185
  if (!message || typeof message !== 'string' || !message.trim()) {
1165
1186
  return res.status(400).json({ error: 'message is required' });
1166
1187
  }
1188
+ const validatedEffort = validateReasoningEffort(reasoning_effort);
1189
+ const validatedVerbosity = validateVerbosity(verbosity);
1190
+
1167
1191
  const conv = daemon.conversations.get(req.params.id);
1168
1192
  if (!conv) return res.status(404).json({ error: 'Conversation not found' });
1169
1193
 
@@ -1172,7 +1196,10 @@ export function createApi(app, daemon) {
1172
1196
 
1173
1197
  // API mode — lightweight headless streaming, no agent spawned
1174
1198
  if (conv.mode === 'api' || !conv.agentId) {
1175
- await daemon.conversations.sendMessage(req.params.id, message.trim(), history || []);
1199
+ await daemon.conversations.sendMessage(req.params.id, message.trim(), history || [], {
1200
+ reasoningEffort: validatedEffort,
1201
+ verbosity: validatedVerbosity,
1202
+ });
1176
1203
  daemon.audit.log('conversation.message', { id: req.params.id, mode: 'api' });
1177
1204
  return res.json({ status: 'streaming', mode: 'api' });
1178
1205
  }
@@ -3064,6 +3091,87 @@ Keep responses concise. Help them think, don't lecture them about the system the
3064
3091
  });
3065
3092
  });
3066
3093
 
3094
+ // Files touched by an agent during its session
3095
+ app.get('/api/agents/:id/files-touched', (req, res) => {
3096
+ const agent = daemon.registry.get(req.params.id);
3097
+ if (!agent) return res.status(404).json({ error: 'Agent not found' });
3098
+ const files = daemon.registry.getFilesTouched(req.params.id);
3099
+ res.json({ files, total: files.length });
3100
+ });
3101
+
3102
+ // Git diff — structured diff for a file, an agent's touched files, or all uncommitted changes
3103
+ app.get('/api/files/git-diff', (req, res) => {
3104
+ const rootDir = getEditorRoot();
3105
+ if (!rootDir) return res.status(400).json({ error: 'Editor root not set' });
3106
+
3107
+ let paths = [];
3108
+
3109
+ if (req.query.path) {
3110
+ const result = validateFilePath(req.query.path, rootDir);
3111
+ if (result.error) return res.status(400).json({ error: result.error });
3112
+ paths = [req.query.path];
3113
+ } else if (req.query.agentId) {
3114
+ const agent = daemon.registry.get(req.query.agentId);
3115
+ if (!agent) return res.status(404).json({ error: 'Agent not found' });
3116
+ paths = daemon.registry.getFilesTouched(req.query.agentId).map(f => f.path);
3117
+ if (paths.length === 0) return res.json({ diffs: [] });
3118
+ // Validate each path
3119
+ for (const p of paths) {
3120
+ if (p.startsWith('/') || p.includes('..') || p.includes('\0')) {
3121
+ return res.status(400).json({ error: 'Invalid path in agent files' });
3122
+ }
3123
+ }
3124
+ }
3125
+
3126
+ const args = ['diff'];
3127
+ const cachedArgs = ['diff', '--cached'];
3128
+ if (paths.length > 0) {
3129
+ args.push('--', ...paths);
3130
+ cachedArgs.push('--', ...paths);
3131
+ }
3132
+
3133
+ try {
3134
+ const unstaged = execFileSync('git', args, { cwd: rootDir, timeout: 15000, maxBuffer: 10 * 1024 * 1024 }).toString();
3135
+ const staged = execFileSync('git', cachedArgs, { cwd: rootDir, timeout: 15000, maxBuffer: 10 * 1024 * 1024 }).toString();
3136
+ const combined = (staged + '\n' + unstaged).trim();
3137
+ const diffs = parseDiffOutput(combined);
3138
+ res.json({ diffs });
3139
+ } catch (err) {
3140
+ if (err.status !== undefined) {
3141
+ return res.json({ diffs: [] });
3142
+ }
3143
+ res.status(500).json({ error: 'Failed to compute diff' });
3144
+ }
3145
+ });
3146
+
3147
+ function parseDiffOutput(raw) {
3148
+ if (!raw) return [];
3149
+ const fileDiffs = raw.split(/^diff --git /m).filter(Boolean);
3150
+ return fileDiffs.map(chunk => {
3151
+ const lines = chunk.split('\n');
3152
+ const headerMatch = lines[0]?.match(/a\/(.+?) b\/(.+)/);
3153
+ const filePath = headerMatch ? headerMatch[2] : 'unknown';
3154
+ let status = 'modified';
3155
+ if (lines.some(l => l.startsWith('new file'))) status = 'added';
3156
+ else if (lines.some(l => l.startsWith('deleted file'))) status = 'deleted';
3157
+ let additions = 0, deletions = 0;
3158
+ const hunks = [];
3159
+ let currentHunk = null;
3160
+ for (const line of lines) {
3161
+ if (line.startsWith('@@')) {
3162
+ if (currentHunk) hunks.push(currentHunk);
3163
+ currentHunk = { header: line, lines: [] };
3164
+ } else if (currentHunk) {
3165
+ currentHunk.lines.push(line);
3166
+ if (line.startsWith('+') && !line.startsWith('+++')) additions++;
3167
+ else if (line.startsWith('-') && !line.startsWith('---')) deletions++;
3168
+ }
3169
+ }
3170
+ if (currentHunk) hunks.push(currentHunk);
3171
+ return { path: filePath, status, hunks, additions, deletions, content: 'diff --git ' + chunk };
3172
+ });
3173
+ }
3174
+
3067
3175
  // File search — fuzzy filename matching for quick-open (Ctrl+P)
3068
3176
  app.get('/api/files/search', (req, res) => {
3069
3177
  const query = req.query.q;
@@ -4172,10 +4280,10 @@ Keep responses concise. Help them think, don't lecture them about the system the
4172
4280
 
4173
4281
  app.post('/api/tunnels', (req, res) => {
4174
4282
  try {
4175
- const { name, host, user, port, sshKeyPath, autoStart, autoConnect } = req.body;
4283
+ const { name, host, user, port, sshKeyPath, autoStart, autoConnect, projectDir } = req.body;
4176
4284
  if (!name || typeof name !== 'string') return res.status(400).json({ error: 'name is required (string)' });
4177
4285
  if (!host || typeof host !== 'string') return res.status(400).json({ error: 'host is required (string)' });
4178
- const result = daemon.tunnelManager.save({ name, host, user, port, sshKeyPath, autoStart, autoConnect });
4286
+ const result = daemon.tunnelManager.save({ name, host, user, port, sshKeyPath, autoStart, autoConnect, projectDir });
4179
4287
  res.json(result);
4180
4288
  } catch (err) {
4181
4289
  res.status(400).json({ error: err.message });
@@ -55,7 +55,7 @@ export class ConversationManager {
55
55
  return null;
56
56
  }
57
57
 
58
- async create(provider, model, title, mode = 'api') {
58
+ async create(provider, model, title, mode = 'api', options = {}) {
59
59
  if (!provider && this.daemon.config?.defaultChatProvider) {
60
60
  provider = this.daemon.config.defaultChatProvider;
61
61
  }
@@ -90,6 +90,9 @@ export class ConversationManager {
90
90
  provider,
91
91
  model: model || null,
92
92
  mode: mode === 'agent' ? 'agent' : 'api',
93
+ reasoningEffort: options.reasoningEffort || null,
94
+ verbosity: options.verbosity || null,
95
+ previousResponseId: null,
93
96
  createdAt: now,
94
97
  updatedAt: now,
95
98
  pinned: false,
@@ -218,6 +221,17 @@ export class ConversationManager {
218
221
  return conv;
219
222
  }
220
223
 
224
+ updateReasoningSettings(id, reasoningEffort, verbosity) {
225
+ const conv = this.conversations.get(id);
226
+ if (!conv) throw new Error('Conversation not found');
227
+ if (reasoningEffort !== undefined) conv.reasoningEffort = reasoningEffort || null;
228
+ if (verbosity !== undefined) conv.verbosity = verbosity || null;
229
+ conv.updatedAt = new Date().toISOString();
230
+ this._save();
231
+ this.daemon.broadcast({ type: 'conversation:updated', data: conv });
232
+ return conv;
233
+ }
234
+
221
235
  async setMode(id, mode) {
222
236
  const conv = this.conversations.get(id);
223
237
  if (!conv) throw new Error('Conversation not found');
@@ -302,7 +316,7 @@ export class ConversationManager {
302
316
  } catch { return null; }
303
317
  }
304
318
 
305
- async sendMessage(id, message, history) {
319
+ async sendMessage(id, message, history, { reasoningEffort, verbosity } = {}) {
306
320
  const conv = this.conversations.get(id);
307
321
  if (!conv) throw new Error('Conversation not found');
308
322
  if (conv.mode !== 'api') throw new Error('sendMessage only works in API mode');
@@ -331,6 +345,9 @@ export class ConversationManager {
331
345
 
332
346
  const apiKey = this._getApiKey(providerName);
333
347
 
348
+ const effectiveReasoningEffort = reasoningEffort || conv.reasoningEffort || null;
349
+ const effectiveVerbosity = verbosity || conv.verbosity || null;
350
+
334
351
  // Try direct API streaming first (sub-second latency)
335
352
  const controller = provider.streamChat(
336
353
  messages, modelId, apiKey,
@@ -340,7 +357,11 @@ export class ConversationManager {
340
357
  data: { conversationId: id, text },
341
358
  });
342
359
  },
343
- () => {
360
+ (result) => {
361
+ if (result?.responseId) {
362
+ conv.previousResponseId = result.responseId;
363
+ this._save();
364
+ }
344
365
  this._getStreamingProcesses().delete(id);
345
366
  this.daemon.broadcast({
346
367
  type: 'conversation:complete',
@@ -354,6 +375,11 @@ export class ConversationManager {
354
375
  data: { conversationId: id, error: err.message },
355
376
  });
356
377
  },
378
+ {
379
+ reasoningEffort: effectiveReasoningEffort,
380
+ verbosity: effectiveVerbosity,
381
+ previousResponseId: conv.previousResponseId,
382
+ },
357
383
  );
358
384
 
359
385
  if (controller) {
@@ -999,7 +999,9 @@ For normal file edits within your scope, proceed without review.
999
999
  // Preview launch: when every agent in this team is in a terminal state,
1000
1000
  // kick off the one-click preview (dev server or static serve) the planner
1001
1001
  // staged in the team plan. Fires once per team launch.
1002
- if (finalStatus === 'completed' && agent.teamId) {
1002
+ // Fire on any terminal status so crashed QC agents don't block preview
1003
+ // when builders completed successfully.
1004
+ if (agent.teamId) {
1003
1005
  this._checkPreviewReady(agent.teamId);
1004
1006
  }
1005
1007
 
@@ -1198,6 +1200,9 @@ For normal file edits within your scope, proceed without review.
1198
1200
  * Fire the one-click preview when the whole team has finished building.
1199
1201
  * Requirements:
1200
1202
  * - The daemon has a preview plan stashed for this team (planner wrote one).
1203
+ * - If the team plan has multiple phases, at least one agent from the highest
1204
+ * phase exists in the registry AND is in a terminal state (prevents launching
1205
+ * before QC finishes — _checkPhase2 consumes _pendingPhase2 before we run).
1201
1206
  * - No pending phase 2 groups for this team (QC hasn't spawned yet).
1202
1207
  * - Every non-planner team agent is in a terminal state.
1203
1208
  * - At least one non-planner agent completed successfully.
@@ -1219,6 +1224,56 @@ For normal file edits within your scope, proceed without review.
1219
1224
  return;
1220
1225
  }
1221
1226
 
1227
+ // Multi-phase guard: read the team plan to detect phase 2 (QC) agents.
1228
+ // _checkPhase2 runs before this method and consumes _pendingPhase2, so the
1229
+ // pending-group check below may pass even though QC hasn't registered yet.
1230
+ let maxPhase = 1;
1231
+ const maxPhaseRoles = new Set();
1232
+ const expectedRoleCounts = {};
1233
+ const searchPaths = [];
1234
+ if (plan.workingDir) searchPaths.push(resolve(plan.workingDir, '.groove', 'recommended-team.json'));
1235
+ const plannerAgent = this.daemon.registry.getAll().find(a => a.role === 'planner' && a.teamId === teamId);
1236
+ if (plannerAgent?.workingDir) searchPaths.push(resolve(plannerAgent.workingDir, '.groove', 'recommended-team.json'));
1237
+ searchPaths.push(resolve(this.daemon.grooveDir, 'recommended-team.json'));
1238
+
1239
+ for (const planPath of searchPaths) {
1240
+ if (!existsSync(planPath)) continue;
1241
+ try {
1242
+ const raw = JSON.parse(readFileSync(planPath, 'utf8'));
1243
+ const configs = Array.isArray(raw) ? raw : (raw?.agents || []);
1244
+ if (configs.length === 0) continue;
1245
+ for (const cfg of configs) {
1246
+ const phase = typeof cfg.phase === 'number' ? cfg.phase : 1;
1247
+ if (phase > maxPhase) maxPhase = phase;
1248
+ }
1249
+ if (maxPhase > 1) {
1250
+ for (const cfg of configs) {
1251
+ if (cfg.role === 'planner') continue;
1252
+ const role = cfg.role || 'fullstack';
1253
+ const phase = typeof cfg.phase === 'number' ? cfg.phase : 1;
1254
+ expectedRoleCounts[role] = (expectedRoleCounts[role] || 0) + 1;
1255
+ if (phase === maxPhase) maxPhaseRoles.add(role);
1256
+ }
1257
+ }
1258
+ break;
1259
+ } catch { /* malformed, try next */ }
1260
+ }
1261
+
1262
+ if (maxPhase > 1) {
1263
+ const terminalSet = new Set(['completed', 'crashed', 'stopped', 'killed']);
1264
+ const allTeamAgents = this.daemon.registry.getAll().filter(
1265
+ a => a.teamId === teamId && a.role !== 'planner'
1266
+ );
1267
+ for (const role of maxPhaseRoles) {
1268
+ const actual = allTeamAgents.filter(a => a.role === role).length;
1269
+ if (actual < (expectedRoleCounts[role] || 0)) return;
1270
+ }
1271
+ const anyMaxPhaseTerminal = allTeamAgents.some(
1272
+ a => maxPhaseRoles.has(a.role) && terminalSet.has(a.status)
1273
+ );
1274
+ if (!anyMaxPhaseTerminal) return;
1275
+ }
1276
+
1222
1277
  const pendingPhase2 = this.daemon._pendingPhase2 || [];
1223
1278
  for (const group of pendingPhase2) {
1224
1279
  for (const id of group.waitFor) {
@@ -153,22 +153,31 @@ export class CodexProvider extends Provider {
153
153
  return (inputTokens / 1000) * model.pricing.input + (outputTokens / 1000) * model.pricing.output;
154
154
  }
155
155
 
156
- streamChat(messages, model, apiKey, onChunk, onDone, onError) {
156
+ streamChat(messages, model, apiKey, onChunk, onDone, onError, { reasoningEffort, verbosity, previousResponseId } = {}) {
157
157
  if (!apiKey) return null;
158
158
  const controller = new AbortController();
159
159
  let finished = false;
160
- const finish = () => { if (!finished) { finished = true; onDone(); } };
161
- fetch('https://api.openai.com/v1/chat/completions', {
160
+ let responseId = null;
161
+ const finish = () => { if (!finished) { finished = true; onDone({ responseId }); } };
162
+
163
+ const effort = reasoningEffort || 'medium';
164
+ const verb = verbosity || 'medium';
165
+ const body = {
166
+ model: model || 'gpt-5.5',
167
+ input: previousResponseId ? [messages[messages.length - 1]] : messages,
168
+ stream: true,
169
+ reasoning: { effort },
170
+ text: { format: { type: 'text' }, verbosity: verb },
171
+ };
172
+ if (previousResponseId) body.previous_response_id = previousResponseId;
173
+
174
+ fetch('https://api.openai.com/v1/responses', {
162
175
  method: 'POST',
163
176
  headers: {
164
177
  'Authorization': `Bearer ${apiKey}`,
165
178
  'Content-Type': 'application/json',
166
179
  },
167
- body: JSON.stringify({
168
- model: model || 'gpt-5.4-mini',
169
- messages,
170
- stream: true,
171
- }),
180
+ body: JSON.stringify(body),
172
181
  signal: controller.signal,
173
182
  }).then((res) => {
174
183
  if (!res.ok) {
@@ -176,8 +185,11 @@ export class CodexProvider extends Provider {
176
185
  }
177
186
  return parseSSEStream(res, (event) => {
178
187
  if (event.done) { finish(); return; }
179
- const content = event.choices?.[0]?.delta?.content;
180
- if (content) onChunk(content);
188
+ if (event.type === 'response.output_text.delta') {
189
+ if (event.delta) onChunk(event.delta);
190
+ } else if (event.type === 'response.completed') {
191
+ responseId = event.response?.id || null;
192
+ }
181
193
  });
182
194
  }).then(() => {
183
195
  finish();
@@ -313,6 +325,10 @@ export class CodexProvider extends Provider {
313
325
  };
314
326
  }
315
327
 
328
+ if (result && item.phase !== undefined) {
329
+ result.phase = item.phase;
330
+ }
331
+
316
332
  // Attach intermediate context estimate so all 7 layers see Codex progress
317
333
  if (result && this._sessionInputTokens > 0) {
318
334
  result.contextUsage = this._sessionInputTokens / this._getMaxContext();
@@ -328,6 +344,7 @@ export class CodexProvider extends Provider {
328
344
  const inputTokens = usage.input_tokens || 0;
329
345
  const outputTokens = usage.output_tokens || 0;
330
346
  const cachedTokens = usage.cached_input_tokens || 0;
347
+ const reasoningTokens = usage.output_tokens_details?.reasoning_tokens || 0;
331
348
  const totalTokens = inputTokens + outputTokens;
332
349
  const cacheCreationTokens = cachedTokens > 0 ? Math.max(0, inputTokens - cachedTokens) : 0;
333
350
 
@@ -352,6 +369,7 @@ export class CodexProvider extends Provider {
352
369
  tokensUsed: totalTokens,
353
370
  inputTokens,
354
371
  outputTokens,
372
+ reasoningTokens,
355
373
  cacheReadTokens: cachedTokens,
356
374
  cacheCreationTokens,
357
375
  contextUsage: inputTokens / maxContext,
@@ -43,6 +43,7 @@ export class Registry extends EventEmitter {
43
43
  lastActivity: null,
44
44
  tokensUsed: 0,
45
45
  contextUsage: 0,
46
+ filesTouched: {},
46
47
  };
47
48
 
48
49
  this.agents.set(agent.id, agent);
@@ -94,6 +95,35 @@ export class Registry extends EventEmitter {
94
95
  return this.getAll().filter((a) => a.teamId === teamId);
95
96
  }
96
97
 
98
+ trackFileOp(id, filePath, op) {
99
+ const agent = this.agents.get(id);
100
+ if (!agent) return;
101
+ if (!agent.filesTouched) agent.filesTouched = {};
102
+ const entry = agent.filesTouched[filePath] || { reads: 0, writes: 0, lastOp: null };
103
+ if (op === 'read') entry.reads++;
104
+ else entry.writes++;
105
+ entry.lastOp = new Date().toISOString();
106
+ agent.filesTouched[filePath] = entry;
107
+
108
+ const keys = Object.keys(agent.filesTouched);
109
+ if (keys.length > 5000) {
110
+ const sorted = keys
111
+ .map((k) => ({ k, t: agent.filesTouched[k].lastOp || '' }))
112
+ .sort((a, b) => a.t.localeCompare(b.t));
113
+ for (let i = 0; i < keys.length - 5000; i++) {
114
+ delete agent.filesTouched[sorted[i].k];
115
+ }
116
+ }
117
+ }
118
+
119
+ getFilesTouched(id) {
120
+ const agent = this.agents.get(id);
121
+ if (!agent || !agent.filesTouched) return [];
122
+ return Object.entries(agent.filesTouched)
123
+ .map(([path, info]) => ({ path, reads: info.reads, writes: info.writes, lastOp: info.lastOp }))
124
+ .sort((a, b) => (b.lastOp || '').localeCompare(a.lastOp || ''));
125
+ }
126
+
97
127
  restore(agents) {
98
128
  for (const agent of agents) {
99
129
  agent.status = 'stopped';
@@ -90,6 +90,9 @@ export function validateAgentConfig(config) {
90
90
 
91
91
  const personality = (typeof config.personality === 'string' && config.personality.length > 0 && config.personality.length <= 64 && NAME_PATTERN.test(config.personality)) ? config.personality : undefined;
92
92
 
93
+ const reasoningEffort = config.reasoning_effort !== undefined && config.reasoning_effort !== null
94
+ ? validateReasoningEffort(config.reasoning_effort) : undefined;
95
+
93
96
  // Return sanitized config (only known fields)
94
97
  return {
95
98
  role: config.role,
@@ -106,6 +109,7 @@ export function validateAgentConfig(config) {
106
109
  integrationApproval,
107
110
  repos,
108
111
  personality,
112
+ reasoningEffort,
109
113
  };
110
114
  }
111
115
 
@@ -195,6 +199,25 @@ export function validateGatewayConfig(config) {
195
199
  };
196
200
  }
197
201
 
202
+ const VALID_REASONING_EFFORTS = ['none', 'low', 'medium', 'high', 'xhigh'];
203
+ const VALID_VERBOSITIES = ['low', 'medium'];
204
+
205
+ export function validateReasoningEffort(value) {
206
+ if (value === null || value === undefined) return null;
207
+ if (typeof value !== 'string' || !VALID_REASONING_EFFORTS.includes(value)) {
208
+ throw new Error(`Invalid reasoning_effort: must be one of ${VALID_REASONING_EFFORTS.join(', ')}`);
209
+ }
210
+ return value;
211
+ }
212
+
213
+ export function validateVerbosity(value) {
214
+ if (value === null || value === undefined) return null;
215
+ if (typeof value !== 'string' || !VALID_VERBOSITIES.includes(value)) {
216
+ throw new Error(`Invalid verbosity: must be one of ${VALID_VERBOSITIES.join(', ')}`);
217
+ }
218
+ return value;
219
+ }
220
+
198
221
  export function escapeMd(text) {
199
222
  if (!text) return '';
200
223
  // Escape markdown special chars that could break table rendering or inject formatting.