groove-dev 0.27.137 → 0.27.139

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 (525) hide show
  1. package/CLAUDE.md +34 -2
  2. package/node_modules/@groove-dev/cli/package.json +1 -1
  3. package/node_modules/@groove-dev/daemon/package.json +1 -1
  4. package/node_modules/@groove-dev/daemon/src/adaptive.js +26 -16
  5. package/node_modules/@groove-dev/daemon/src/api.js +124 -6
  6. package/node_modules/@groove-dev/daemon/src/introducer.js +7 -2
  7. package/node_modules/@groove-dev/daemon/src/journalist.js +62 -24
  8. package/node_modules/@groove-dev/daemon/src/model-lab.js +6 -5
  9. package/node_modules/@groove-dev/daemon/src/process.js +11 -8
  10. package/node_modules/@groove-dev/daemon/src/rotator.js +5 -7
  11. package/{packages/gui/dist/assets/codemirror-DRQdprYi.js → node_modules/@groove-dev/gui/dist/assets/codemirror-BQqYnZfL.js} +10 -10
  12. package/node_modules/@groove-dev/gui/dist/assets/index-AkOtskHS.css +1 -0
  13. package/node_modules/@groove-dev/gui/dist/assets/index-B4uYLR57.js +8694 -0
  14. package/node_modules/@groove-dev/gui/dist/index.html +3 -3
  15. package/node_modules/@groove-dev/gui/package.json +2 -1
  16. package/node_modules/@groove-dev/gui/src/components/agents/code-review.jsx +87 -39
  17. package/node_modules/@groove-dev/gui/src/components/agents/diff-viewer.jsx +174 -70
  18. package/node_modules/@groove-dev/gui/src/components/editor/ai-panel.jsx +199 -0
  19. package/node_modules/@groove-dev/gui/src/components/editor/code-editor.jsx +162 -67
  20. package/node_modules/@groove-dev/gui/src/components/editor/editor-status-bar.jsx +66 -0
  21. package/node_modules/@groove-dev/gui/src/components/editor/editor-toolbar.jsx +179 -0
  22. package/node_modules/@groove-dev/gui/src/components/editor/file-tree.jsx +111 -4
  23. package/node_modules/@groove-dev/gui/src/components/editor/inline-prompt.jsx +67 -0
  24. package/node_modules/@groove-dev/gui/src/components/editor/quick-search.jsx +170 -0
  25. package/node_modules/@groove-dev/gui/src/components/editor/selection-menu.jsx +88 -0
  26. package/node_modules/@groove-dev/gui/src/components/editor/terminal.jsx +1 -0
  27. package/node_modules/@groove-dev/gui/src/components/lab/system-prompt-editor.jsx +21 -24
  28. package/node_modules/@groove-dev/gui/src/components/layout/activity-bar.jsx +5 -9
  29. package/node_modules/@groove-dev/gui/src/components/layout/terminal-panel.jsx +8 -0
  30. package/node_modules/@groove-dev/gui/src/components/ui/toast.jsx +13 -8
  31. package/node_modules/@groove-dev/gui/src/stores/groove.js +75 -2
  32. package/node_modules/@groove-dev/gui/src/views/agents.jsx +7 -7
  33. package/node_modules/@groove-dev/gui/src/views/editor.jsx +219 -67
  34. package/node_modules/@uiw/codemirror-theme-abcdef/README.md +152 -0
  35. package/node_modules/@uiw/codemirror-theme-abcdef/cjs/index.d.ts +5 -0
  36. package/node_modules/@uiw/codemirror-theme-abcdef/cjs/index.js +95 -0
  37. package/node_modules/@uiw/codemirror-theme-abcdef/cjs/package.json +1 -0
  38. package/node_modules/@uiw/codemirror-theme-abcdef/esm/index.d.ts +5 -0
  39. package/node_modules/@uiw/codemirror-theme-abcdef/esm/index.js +84 -0
  40. package/node_modules/@uiw/codemirror-theme-abcdef/esm/package.json +1 -0
  41. package/node_modules/@uiw/codemirror-theme-abcdef/package.json +50 -0
  42. package/node_modules/@uiw/codemirror-theme-abcdef/src/index.ts +52 -0
  43. package/node_modules/@uiw/codemirror-theme-abyss/README.md +150 -0
  44. package/node_modules/@uiw/codemirror-theme-abyss/cjs/color.d.ts +25 -0
  45. package/node_modules/@uiw/codemirror-theme-abyss/cjs/color.js +31 -0
  46. package/node_modules/@uiw/codemirror-theme-abyss/cjs/index.d.ts +5 -0
  47. package/node_modules/@uiw/codemirror-theme-abyss/cjs/index.js +103 -0
  48. package/node_modules/@uiw/codemirror-theme-abyss/cjs/package.json +1 -0
  49. package/node_modules/@uiw/codemirror-theme-abyss/esm/color.d.ts +25 -0
  50. package/node_modules/@uiw/codemirror-theme-abyss/esm/color.js +25 -0
  51. package/node_modules/@uiw/codemirror-theme-abyss/esm/index.d.ts +5 -0
  52. package/node_modules/@uiw/codemirror-theme-abyss/esm/index.js +93 -0
  53. package/node_modules/@uiw/codemirror-theme-abyss/esm/package.json +1 -0
  54. package/node_modules/@uiw/codemirror-theme-abyss/package.json +45 -0
  55. package/node_modules/@uiw/codemirror-theme-abyss/src/color.ts +25 -0
  56. package/node_modules/@uiw/codemirror-theme-abyss/src/index.ts +52 -0
  57. package/node_modules/@uiw/codemirror-theme-androidstudio/README.md +153 -0
  58. package/node_modules/@uiw/codemirror-theme-androidstudio/cjs/index.d.ts +5 -0
  59. package/node_modules/@uiw/codemirror-theme-androidstudio/cjs/index.js +66 -0
  60. package/node_modules/@uiw/codemirror-theme-androidstudio/cjs/package.json +1 -0
  61. package/node_modules/@uiw/codemirror-theme-androidstudio/esm/index.d.ts +5 -0
  62. package/node_modules/@uiw/codemirror-theme-androidstudio/esm/index.js +55 -0
  63. package/node_modules/@uiw/codemirror-theme-androidstudio/esm/package.json +1 -0
  64. package/node_modules/@uiw/codemirror-theme-androidstudio/package.json +50 -0
  65. package/node_modules/@uiw/codemirror-theme-androidstudio/src/index.ts +40 -0
  66. package/node_modules/@uiw/codemirror-theme-andromeda/README.md +149 -0
  67. package/node_modules/@uiw/codemirror-theme-andromeda/cjs/color.d.ts +26 -0
  68. package/node_modules/@uiw/codemirror-theme-andromeda/cjs/color.js +32 -0
  69. package/node_modules/@uiw/codemirror-theme-andromeda/cjs/index.d.ts +5 -0
  70. package/node_modules/@uiw/codemirror-theme-andromeda/cjs/index.js +106 -0
  71. package/node_modules/@uiw/codemirror-theme-andromeda/cjs/package.json +1 -0
  72. package/node_modules/@uiw/codemirror-theme-andromeda/esm/color.d.ts +26 -0
  73. package/node_modules/@uiw/codemirror-theme-andromeda/esm/color.js +26 -0
  74. package/node_modules/@uiw/codemirror-theme-andromeda/esm/index.d.ts +5 -0
  75. package/node_modules/@uiw/codemirror-theme-andromeda/esm/index.js +96 -0
  76. package/node_modules/@uiw/codemirror-theme-andromeda/esm/package.json +1 -0
  77. package/node_modules/@uiw/codemirror-theme-andromeda/package.json +45 -0
  78. package/node_modules/@uiw/codemirror-theme-andromeda/src/color.ts +26 -0
  79. package/node_modules/@uiw/codemirror-theme-andromeda/src/index.ts +56 -0
  80. package/node_modules/@uiw/codemirror-theme-atomone/README.md +151 -0
  81. package/node_modules/@uiw/codemirror-theme-atomone/cjs/index.d.ts +5 -0
  82. package/node_modules/@uiw/codemirror-theme-atomone/cjs/index.js +69 -0
  83. package/node_modules/@uiw/codemirror-theme-atomone/cjs/package.json +1 -0
  84. package/node_modules/@uiw/codemirror-theme-atomone/esm/index.d.ts +5 -0
  85. package/node_modules/@uiw/codemirror-theme-atomone/esm/index.js +58 -0
  86. package/node_modules/@uiw/codemirror-theme-atomone/esm/package.json +1 -0
  87. package/node_modules/@uiw/codemirror-theme-atomone/package.json +50 -0
  88. package/node_modules/@uiw/codemirror-theme-atomone/src/index.ts +48 -0
  89. package/node_modules/@uiw/codemirror-theme-aura/README.md +151 -0
  90. package/node_modules/@uiw/codemirror-theme-aura/cjs/index.d.ts +5 -0
  91. package/node_modules/@uiw/codemirror-theme-aura/cjs/index.js +99 -0
  92. package/node_modules/@uiw/codemirror-theme-aura/cjs/package.json +1 -0
  93. package/node_modules/@uiw/codemirror-theme-aura/esm/index.d.ts +5 -0
  94. package/node_modules/@uiw/codemirror-theme-aura/esm/index.js +89 -0
  95. package/node_modules/@uiw/codemirror-theme-aura/esm/package.json +1 -0
  96. package/node_modules/@uiw/codemirror-theme-aura/package.json +50 -0
  97. package/node_modules/@uiw/codemirror-theme-aura/src/index.ts +51 -0
  98. package/node_modules/@uiw/codemirror-theme-basic/README.md +159 -0
  99. package/node_modules/@uiw/codemirror-theme-basic/cjs/dark.d.ts +5 -0
  100. package/node_modules/@uiw/codemirror-theme-basic/cjs/dark.js +156 -0
  101. package/node_modules/@uiw/codemirror-theme-basic/cjs/index.d.ts +2 -0
  102. package/node_modules/@uiw/codemirror-theme-basic/cjs/index.js +27 -0
  103. package/node_modules/@uiw/codemirror-theme-basic/cjs/light.d.ts +5 -0
  104. package/node_modules/@uiw/codemirror-theme-basic/cjs/light.js +153 -0
  105. package/node_modules/@uiw/codemirror-theme-basic/cjs/package.json +1 -0
  106. package/node_modules/@uiw/codemirror-theme-basic/dark.d.ts +6 -0
  107. package/node_modules/@uiw/codemirror-theme-basic/esm/dark.d.ts +5 -0
  108. package/node_modules/@uiw/codemirror-theme-basic/esm/dark.js +146 -0
  109. package/node_modules/@uiw/codemirror-theme-basic/esm/index.d.ts +2 -0
  110. package/node_modules/@uiw/codemirror-theme-basic/esm/index.js +2 -0
  111. package/node_modules/@uiw/codemirror-theme-basic/esm/light.d.ts +5 -0
  112. package/node_modules/@uiw/codemirror-theme-basic/esm/light.js +143 -0
  113. package/node_modules/@uiw/codemirror-theme-basic/esm/package.json +1 -0
  114. package/node_modules/@uiw/codemirror-theme-basic/light.d.ts +6 -0
  115. package/node_modules/@uiw/codemirror-theme-basic/package.json +63 -0
  116. package/node_modules/@uiw/codemirror-theme-basic/src/dark.ts +76 -0
  117. package/node_modules/@uiw/codemirror-theme-basic/src/index.ts +2 -0
  118. package/node_modules/@uiw/codemirror-theme-basic/src/light.ts +81 -0
  119. package/node_modules/@uiw/codemirror-theme-bbedit/README.md +151 -0
  120. package/node_modules/@uiw/codemirror-theme-bbedit/cjs/index.d.ts +5 -0
  121. package/node_modules/@uiw/codemirror-theme-bbedit/cjs/index.js +77 -0
  122. package/node_modules/@uiw/codemirror-theme-bbedit/cjs/package.json +1 -0
  123. package/node_modules/@uiw/codemirror-theme-bbedit/esm/index.d.ts +5 -0
  124. package/node_modules/@uiw/codemirror-theme-bbedit/esm/index.js +67 -0
  125. package/node_modules/@uiw/codemirror-theme-bbedit/esm/package.json +1 -0
  126. package/node_modules/@uiw/codemirror-theme-bbedit/package.json +50 -0
  127. package/node_modules/@uiw/codemirror-theme-bbedit/src/index.ts +44 -0
  128. package/node_modules/@uiw/codemirror-theme-bespin/README.md +151 -0
  129. package/node_modules/@uiw/codemirror-theme-bespin/cjs/index.d.ts +5 -0
  130. package/node_modules/@uiw/codemirror-theme-bespin/cjs/index.js +72 -0
  131. package/node_modules/@uiw/codemirror-theme-bespin/cjs/package.json +1 -0
  132. package/node_modules/@uiw/codemirror-theme-bespin/esm/index.d.ts +5 -0
  133. package/node_modules/@uiw/codemirror-theme-bespin/esm/index.js +61 -0
  134. package/node_modules/@uiw/codemirror-theme-bespin/esm/package.json +1 -0
  135. package/node_modules/@uiw/codemirror-theme-bespin/package.json +50 -0
  136. package/node_modules/@uiw/codemirror-theme-bespin/src/index.ts +46 -0
  137. package/node_modules/@uiw/codemirror-theme-console/README.md +160 -0
  138. package/node_modules/@uiw/codemirror-theme-console/cjs/dark.d.ts +4 -0
  139. package/node_modules/@uiw/codemirror-theme-console/cjs/dark.js +36 -0
  140. package/node_modules/@uiw/codemirror-theme-console/cjs/index.d.ts +2 -0
  141. package/node_modules/@uiw/codemirror-theme-console/cjs/index.js +27 -0
  142. package/node_modules/@uiw/codemirror-theme-console/cjs/light.d.ts +4 -0
  143. package/node_modules/@uiw/codemirror-theme-console/cjs/light.js +36 -0
  144. package/node_modules/@uiw/codemirror-theme-console/cjs/package.json +1 -0
  145. package/node_modules/@uiw/codemirror-theme-console/dark.d.ts +6 -0
  146. package/node_modules/@uiw/codemirror-theme-console/esm/dark.d.ts +4 -0
  147. package/node_modules/@uiw/codemirror-theme-console/esm/dark.js +26 -0
  148. package/node_modules/@uiw/codemirror-theme-console/esm/index.d.ts +2 -0
  149. package/node_modules/@uiw/codemirror-theme-console/esm/index.js +2 -0
  150. package/node_modules/@uiw/codemirror-theme-console/esm/light.d.ts +4 -0
  151. package/node_modules/@uiw/codemirror-theme-console/esm/light.js +26 -0
  152. package/node_modules/@uiw/codemirror-theme-console/esm/package.json +1 -0
  153. package/node_modules/@uiw/codemirror-theme-console/light.d.ts +6 -0
  154. package/node_modules/@uiw/codemirror-theme-console/package.json +62 -0
  155. package/node_modules/@uiw/codemirror-theme-console/src/dark.ts +27 -0
  156. package/node_modules/@uiw/codemirror-theme-console/src/index.ts +2 -0
  157. package/node_modules/@uiw/codemirror-theme-console/src/light.ts +27 -0
  158. package/node_modules/@uiw/codemirror-theme-copilot/README.md +149 -0
  159. package/node_modules/@uiw/codemirror-theme-copilot/cjs/color.d.ts +25 -0
  160. package/node_modules/@uiw/codemirror-theme-copilot/cjs/color.js +31 -0
  161. package/node_modules/@uiw/codemirror-theme-copilot/cjs/index.d.ts +5 -0
  162. package/node_modules/@uiw/codemirror-theme-copilot/cjs/index.js +106 -0
  163. package/node_modules/@uiw/codemirror-theme-copilot/cjs/package.json +1 -0
  164. package/node_modules/@uiw/codemirror-theme-copilot/esm/color.d.ts +25 -0
  165. package/node_modules/@uiw/codemirror-theme-copilot/esm/color.js +25 -0
  166. package/node_modules/@uiw/codemirror-theme-copilot/esm/index.d.ts +5 -0
  167. package/node_modules/@uiw/codemirror-theme-copilot/esm/index.js +96 -0
  168. package/node_modules/@uiw/codemirror-theme-copilot/esm/package.json +1 -0
  169. package/node_modules/@uiw/codemirror-theme-copilot/package.json +45 -0
  170. package/node_modules/@uiw/codemirror-theme-copilot/src/color.ts +25 -0
  171. package/node_modules/@uiw/codemirror-theme-copilot/src/index.ts +56 -0
  172. package/node_modules/@uiw/codemirror-theme-darcula/README.md +151 -0
  173. package/node_modules/@uiw/codemirror-theme-darcula/cjs/index.d.ts +5 -0
  174. package/node_modules/@uiw/codemirror-theme-darcula/cjs/index.js +72 -0
  175. package/node_modules/@uiw/codemirror-theme-darcula/cjs/package.json +1 -0
  176. package/node_modules/@uiw/codemirror-theme-darcula/esm/index.d.ts +5 -0
  177. package/node_modules/@uiw/codemirror-theme-darcula/esm/index.js +61 -0
  178. package/node_modules/@uiw/codemirror-theme-darcula/esm/package.json +1 -0
  179. package/node_modules/@uiw/codemirror-theme-darcula/package.json +50 -0
  180. package/node_modules/@uiw/codemirror-theme-darcula/src/index.ts +46 -0
  181. package/node_modules/@uiw/codemirror-theme-dracula/README.md +151 -0
  182. package/node_modules/@uiw/codemirror-theme-dracula/cjs/index.d.ts +5 -0
  183. package/node_modules/@uiw/codemirror-theme-dracula/cjs/index.js +69 -0
  184. package/node_modules/@uiw/codemirror-theme-dracula/cjs/package.json +1 -0
  185. package/node_modules/@uiw/codemirror-theme-dracula/esm/index.d.ts +5 -0
  186. package/node_modules/@uiw/codemirror-theme-dracula/esm/index.js +58 -0
  187. package/node_modules/@uiw/codemirror-theme-dracula/esm/package.json +1 -0
  188. package/node_modules/@uiw/codemirror-theme-dracula/package.json +50 -0
  189. package/node_modules/@uiw/codemirror-theme-dracula/src/index.ts +48 -0
  190. package/node_modules/@uiw/codemirror-theme-duotone/README.md +156 -0
  191. package/node_modules/@uiw/codemirror-theme-duotone/cjs/index.d.ts +9 -0
  192. package/node_modules/@uiw/codemirror-theme-duotone/cjs/index.js +115 -0
  193. package/node_modules/@uiw/codemirror-theme-duotone/cjs/package.json +1 -0
  194. package/node_modules/@uiw/codemirror-theme-duotone/esm/index.d.ts +9 -0
  195. package/node_modules/@uiw/codemirror-theme-duotone/esm/index.js +102 -0
  196. package/node_modules/@uiw/codemirror-theme-duotone/esm/package.json +1 -0
  197. package/node_modules/@uiw/codemirror-theme-duotone/package.json +50 -0
  198. package/node_modules/@uiw/codemirror-theme-duotone/src/index.ts +79 -0
  199. package/node_modules/@uiw/codemirror-theme-eclipse/README.md +145 -0
  200. package/node_modules/@uiw/codemirror-theme-eclipse/cjs/index.d.ts +5 -0
  201. package/node_modules/@uiw/codemirror-theme-eclipse/cjs/index.js +78 -0
  202. package/node_modules/@uiw/codemirror-theme-eclipse/cjs/package.json +1 -0
  203. package/node_modules/@uiw/codemirror-theme-eclipse/esm/index.d.ts +5 -0
  204. package/node_modules/@uiw/codemirror-theme-eclipse/esm/index.js +68 -0
  205. package/node_modules/@uiw/codemirror-theme-eclipse/esm/package.json +1 -0
  206. package/node_modules/@uiw/codemirror-theme-eclipse/package.json +50 -0
  207. package/node_modules/@uiw/codemirror-theme-eclipse/src/index.ts +44 -0
  208. package/node_modules/@uiw/codemirror-theme-github/README.md +154 -0
  209. package/node_modules/@uiw/codemirror-theme-github/cjs/index.d.ts +9 -0
  210. package/node_modules/@uiw/codemirror-theme-github/cjs/index.js +156 -0
  211. package/node_modules/@uiw/codemirror-theme-github/cjs/package.json +1 -0
  212. package/node_modules/@uiw/codemirror-theme-github/esm/index.d.ts +9 -0
  213. package/node_modules/@uiw/codemirror-theme-github/esm/index.js +143 -0
  214. package/node_modules/@uiw/codemirror-theme-github/esm/package.json +1 -0
  215. package/node_modules/@uiw/codemirror-theme-github/package.json +50 -0
  216. package/node_modules/@uiw/codemirror-theme-github/src/index.ts +86 -0
  217. package/node_modules/@uiw/codemirror-theme-gruvbox-dark/README.md +153 -0
  218. package/node_modules/@uiw/codemirror-theme-gruvbox-dark/cjs/index.d.ts +8 -0
  219. package/node_modules/@uiw/codemirror-theme-gruvbox-dark/cjs/index.js +296 -0
  220. package/node_modules/@uiw/codemirror-theme-gruvbox-dark/cjs/package.json +1 -0
  221. package/node_modules/@uiw/codemirror-theme-gruvbox-dark/esm/index.d.ts +8 -0
  222. package/node_modules/@uiw/codemirror-theme-gruvbox-dark/esm/index.js +283 -0
  223. package/node_modules/@uiw/codemirror-theme-gruvbox-dark/esm/package.json +1 -0
  224. package/node_modules/@uiw/codemirror-theme-gruvbox-dark/package.json +50 -0
  225. package/node_modules/@uiw/codemirror-theme-gruvbox-dark/src/index.ts +203 -0
  226. package/node_modules/@uiw/codemirror-theme-kimbie/README.md +149 -0
  227. package/node_modules/@uiw/codemirror-theme-kimbie/cjs/color.d.ts +25 -0
  228. package/node_modules/@uiw/codemirror-theme-kimbie/cjs/color.js +31 -0
  229. package/node_modules/@uiw/codemirror-theme-kimbie/cjs/index.d.ts +5 -0
  230. package/node_modules/@uiw/codemirror-theme-kimbie/cjs/index.js +103 -0
  231. package/node_modules/@uiw/codemirror-theme-kimbie/cjs/package.json +1 -0
  232. package/node_modules/@uiw/codemirror-theme-kimbie/esm/color.d.ts +25 -0
  233. package/node_modules/@uiw/codemirror-theme-kimbie/esm/color.js +25 -0
  234. package/node_modules/@uiw/codemirror-theme-kimbie/esm/index.d.ts +5 -0
  235. package/node_modules/@uiw/codemirror-theme-kimbie/esm/index.js +93 -0
  236. package/node_modules/@uiw/codemirror-theme-kimbie/esm/package.json +1 -0
  237. package/node_modules/@uiw/codemirror-theme-kimbie/package.json +45 -0
  238. package/node_modules/@uiw/codemirror-theme-kimbie/src/color.ts +25 -0
  239. package/node_modules/@uiw/codemirror-theme-kimbie/src/index.ts +52 -0
  240. package/node_modules/@uiw/codemirror-theme-material/README.md +161 -0
  241. package/node_modules/@uiw/codemirror-theme-material/cjs/index.d.ts +12 -0
  242. package/node_modules/@uiw/codemirror-theme-material/cjs/index.js +247 -0
  243. package/node_modules/@uiw/codemirror-theme-material/cjs/package.json +1 -0
  244. package/node_modules/@uiw/codemirror-theme-material/esm/index.d.ts +12 -0
  245. package/node_modules/@uiw/codemirror-theme-material/esm/index.js +235 -0
  246. package/node_modules/@uiw/codemirror-theme-material/esm/package.json +1 -0
  247. package/node_modules/@uiw/codemirror-theme-material/package.json +50 -0
  248. package/node_modules/@uiw/codemirror-theme-material/src/index.ts +129 -0
  249. package/node_modules/@uiw/codemirror-theme-monokai/README.md +149 -0
  250. package/node_modules/@uiw/codemirror-theme-monokai/cjs/color.d.ts +25 -0
  251. package/node_modules/@uiw/codemirror-theme-monokai/cjs/color.js +31 -0
  252. package/node_modules/@uiw/codemirror-theme-monokai/cjs/index.d.ts +5 -0
  253. package/node_modules/@uiw/codemirror-theme-monokai/cjs/index.js +103 -0
  254. package/node_modules/@uiw/codemirror-theme-monokai/cjs/package.json +1 -0
  255. package/node_modules/@uiw/codemirror-theme-monokai/esm/color.d.ts +25 -0
  256. package/node_modules/@uiw/codemirror-theme-monokai/esm/color.js +25 -0
  257. package/node_modules/@uiw/codemirror-theme-monokai/esm/index.d.ts +5 -0
  258. package/node_modules/@uiw/codemirror-theme-monokai/esm/index.js +93 -0
  259. package/node_modules/@uiw/codemirror-theme-monokai/esm/package.json +1 -0
  260. package/node_modules/@uiw/codemirror-theme-monokai/package.json +45 -0
  261. package/node_modules/@uiw/codemirror-theme-monokai/src/color.ts +25 -0
  262. package/node_modules/@uiw/codemirror-theme-monokai/src/index.ts +52 -0
  263. package/node_modules/@uiw/codemirror-theme-monokai-dimmed/README.md +151 -0
  264. package/node_modules/@uiw/codemirror-theme-monokai-dimmed/cjs/color.d.ts +25 -0
  265. package/node_modules/@uiw/codemirror-theme-monokai-dimmed/cjs/color.js +31 -0
  266. package/node_modules/@uiw/codemirror-theme-monokai-dimmed/cjs/index.d.ts +5 -0
  267. package/node_modules/@uiw/codemirror-theme-monokai-dimmed/cjs/index.js +103 -0
  268. package/node_modules/@uiw/codemirror-theme-monokai-dimmed/cjs/package.json +1 -0
  269. package/node_modules/@uiw/codemirror-theme-monokai-dimmed/esm/color.d.ts +25 -0
  270. package/node_modules/@uiw/codemirror-theme-monokai-dimmed/esm/color.js +25 -0
  271. package/node_modules/@uiw/codemirror-theme-monokai-dimmed/esm/index.d.ts +5 -0
  272. package/node_modules/@uiw/codemirror-theme-monokai-dimmed/esm/index.js +93 -0
  273. package/node_modules/@uiw/codemirror-theme-monokai-dimmed/esm/package.json +1 -0
  274. package/node_modules/@uiw/codemirror-theme-monokai-dimmed/package.json +46 -0
  275. package/node_modules/@uiw/codemirror-theme-monokai-dimmed/src/color.ts +25 -0
  276. package/node_modules/@uiw/codemirror-theme-monokai-dimmed/src/index.ts +52 -0
  277. package/node_modules/@uiw/codemirror-theme-noctis-lilac/README.md +149 -0
  278. package/node_modules/@uiw/codemirror-theme-noctis-lilac/cjs/index.d.ts +5 -0
  279. package/node_modules/@uiw/codemirror-theme-noctis-lilac/cjs/index.js +83 -0
  280. package/node_modules/@uiw/codemirror-theme-noctis-lilac/cjs/package.json +1 -0
  281. package/node_modules/@uiw/codemirror-theme-noctis-lilac/esm/index.d.ts +5 -0
  282. package/node_modules/@uiw/codemirror-theme-noctis-lilac/esm/index.js +73 -0
  283. package/node_modules/@uiw/codemirror-theme-noctis-lilac/esm/package.json +1 -0
  284. package/node_modules/@uiw/codemirror-theme-noctis-lilac/package.json +50 -0
  285. package/node_modules/@uiw/codemirror-theme-noctis-lilac/src/index.ts +49 -0
  286. package/node_modules/@uiw/codemirror-theme-nord/README.md +149 -0
  287. package/node_modules/@uiw/codemirror-theme-nord/cjs/index.d.ts +5 -0
  288. package/node_modules/@uiw/codemirror-theme-nord/cjs/index.js +159 -0
  289. package/node_modules/@uiw/codemirror-theme-nord/cjs/package.json +1 -0
  290. package/node_modules/@uiw/codemirror-theme-nord/esm/index.d.ts +5 -0
  291. package/node_modules/@uiw/codemirror-theme-nord/esm/index.js +149 -0
  292. package/node_modules/@uiw/codemirror-theme-nord/esm/package.json +1 -0
  293. package/node_modules/@uiw/codemirror-theme-nord/package.json +50 -0
  294. package/node_modules/@uiw/codemirror-theme-nord/src/index.ts +77 -0
  295. package/node_modules/@uiw/codemirror-theme-okaidia/README.md +147 -0
  296. package/node_modules/@uiw/codemirror-theme-okaidia/cjs/index.d.ts +5 -0
  297. package/node_modules/@uiw/codemirror-theme-okaidia/cjs/index.js +69 -0
  298. package/node_modules/@uiw/codemirror-theme-okaidia/cjs/package.json +1 -0
  299. package/node_modules/@uiw/codemirror-theme-okaidia/esm/index.d.ts +5 -0
  300. package/node_modules/@uiw/codemirror-theme-okaidia/esm/index.js +59 -0
  301. package/node_modules/@uiw/codemirror-theme-okaidia/esm/package.json +1 -0
  302. package/node_modules/@uiw/codemirror-theme-okaidia/package.json +50 -0
  303. package/node_modules/@uiw/codemirror-theme-okaidia/src/index.ts +41 -0
  304. package/node_modules/@uiw/codemirror-theme-quietlight/README.md +149 -0
  305. package/node_modules/@uiw/codemirror-theme-quietlight/cjs/color.d.ts +25 -0
  306. package/node_modules/@uiw/codemirror-theme-quietlight/cjs/color.js +31 -0
  307. package/node_modules/@uiw/codemirror-theme-quietlight/cjs/index.d.ts +5 -0
  308. package/node_modules/@uiw/codemirror-theme-quietlight/cjs/index.js +104 -0
  309. package/node_modules/@uiw/codemirror-theme-quietlight/cjs/package.json +1 -0
  310. package/node_modules/@uiw/codemirror-theme-quietlight/esm/color.d.ts +25 -0
  311. package/node_modules/@uiw/codemirror-theme-quietlight/esm/color.js +25 -0
  312. package/node_modules/@uiw/codemirror-theme-quietlight/esm/index.d.ts +5 -0
  313. package/node_modules/@uiw/codemirror-theme-quietlight/esm/index.js +94 -0
  314. package/node_modules/@uiw/codemirror-theme-quietlight/esm/package.json +1 -0
  315. package/node_modules/@uiw/codemirror-theme-quietlight/package.json +45 -0
  316. package/node_modules/@uiw/codemirror-theme-quietlight/src/color.ts +25 -0
  317. package/node_modules/@uiw/codemirror-theme-quietlight/src/index.ts +53 -0
  318. package/node_modules/@uiw/codemirror-theme-red/README.md +149 -0
  319. package/node_modules/@uiw/codemirror-theme-red/cjs/color.d.ts +25 -0
  320. package/node_modules/@uiw/codemirror-theme-red/cjs/color.js +31 -0
  321. package/node_modules/@uiw/codemirror-theme-red/cjs/index.d.ts +5 -0
  322. package/node_modules/@uiw/codemirror-theme-red/cjs/index.js +103 -0
  323. package/node_modules/@uiw/codemirror-theme-red/cjs/package.json +1 -0
  324. package/node_modules/@uiw/codemirror-theme-red/esm/color.d.ts +25 -0
  325. package/node_modules/@uiw/codemirror-theme-red/esm/color.js +25 -0
  326. package/node_modules/@uiw/codemirror-theme-red/esm/index.d.ts +5 -0
  327. package/node_modules/@uiw/codemirror-theme-red/esm/index.js +93 -0
  328. package/node_modules/@uiw/codemirror-theme-red/esm/package.json +1 -0
  329. package/node_modules/@uiw/codemirror-theme-red/package.json +45 -0
  330. package/node_modules/@uiw/codemirror-theme-red/src/color.ts +25 -0
  331. package/node_modules/@uiw/codemirror-theme-red/src/index.ts +52 -0
  332. package/node_modules/@uiw/codemirror-theme-solarized/README.md +160 -0
  333. package/node_modules/@uiw/codemirror-theme-solarized/cjs/dark-color.d.ts +26 -0
  334. package/node_modules/@uiw/codemirror-theme-solarized/cjs/dark-color.js +32 -0
  335. package/node_modules/@uiw/codemirror-theme-solarized/cjs/dark.d.ts +5 -0
  336. package/node_modules/@uiw/codemirror-theme-solarized/cjs/dark.js +104 -0
  337. package/node_modules/@uiw/codemirror-theme-solarized/cjs/index.d.ts +2 -0
  338. package/node_modules/@uiw/codemirror-theme-solarized/cjs/index.js +27 -0
  339. package/node_modules/@uiw/codemirror-theme-solarized/cjs/light-color.d.ts +26 -0
  340. package/node_modules/@uiw/codemirror-theme-solarized/cjs/light-color.js +32 -0
  341. package/node_modules/@uiw/codemirror-theme-solarized/cjs/light.d.ts +5 -0
  342. package/node_modules/@uiw/codemirror-theme-solarized/cjs/light.js +104 -0
  343. package/node_modules/@uiw/codemirror-theme-solarized/cjs/package.json +1 -0
  344. package/node_modules/@uiw/codemirror-theme-solarized/dark.d.ts +6 -0
  345. package/node_modules/@uiw/codemirror-theme-solarized/esm/dark-color.d.ts +26 -0
  346. package/node_modules/@uiw/codemirror-theme-solarized/esm/dark-color.js +26 -0
  347. package/node_modules/@uiw/codemirror-theme-solarized/esm/dark.d.ts +5 -0
  348. package/node_modules/@uiw/codemirror-theme-solarized/esm/dark.js +94 -0
  349. package/node_modules/@uiw/codemirror-theme-solarized/esm/index.d.ts +2 -0
  350. package/node_modules/@uiw/codemirror-theme-solarized/esm/index.js +2 -0
  351. package/node_modules/@uiw/codemirror-theme-solarized/esm/light-color.d.ts +26 -0
  352. package/node_modules/@uiw/codemirror-theme-solarized/esm/light-color.js +26 -0
  353. package/node_modules/@uiw/codemirror-theme-solarized/esm/light.d.ts +5 -0
  354. package/node_modules/@uiw/codemirror-theme-solarized/esm/light.js +94 -0
  355. package/node_modules/@uiw/codemirror-theme-solarized/esm/package.json +1 -0
  356. package/node_modules/@uiw/codemirror-theme-solarized/light.d.ts +6 -0
  357. package/node_modules/@uiw/codemirror-theme-solarized/package.json +63 -0
  358. package/node_modules/@uiw/codemirror-theme-solarized/src/dark-color.ts +26 -0
  359. package/node_modules/@uiw/codemirror-theme-solarized/src/dark.ts +53 -0
  360. package/node_modules/@uiw/codemirror-theme-solarized/src/index.ts +2 -0
  361. package/node_modules/@uiw/codemirror-theme-solarized/src/light-color.ts +26 -0
  362. package/node_modules/@uiw/codemirror-theme-solarized/src/light.ts +53 -0
  363. package/node_modules/@uiw/codemirror-theme-sublime/README.md +147 -0
  364. package/node_modules/@uiw/codemirror-theme-sublime/cjs/index.d.ts +5 -0
  365. package/node_modules/@uiw/codemirror-theme-sublime/cjs/index.js +73 -0
  366. package/node_modules/@uiw/codemirror-theme-sublime/cjs/package.json +1 -0
  367. package/node_modules/@uiw/codemirror-theme-sublime/esm/index.d.ts +5 -0
  368. package/node_modules/@uiw/codemirror-theme-sublime/esm/index.js +62 -0
  369. package/node_modules/@uiw/codemirror-theme-sublime/esm/package.json +1 -0
  370. package/node_modules/@uiw/codemirror-theme-sublime/package.json +50 -0
  371. package/node_modules/@uiw/codemirror-theme-sublime/src/index.ts +42 -0
  372. package/node_modules/@uiw/codemirror-theme-tokyo-night/README.md +151 -0
  373. package/node_modules/@uiw/codemirror-theme-tokyo-night/cjs/index.d.ts +5 -0
  374. package/node_modules/@uiw/codemirror-theme-tokyo-night/cjs/index.js +99 -0
  375. package/node_modules/@uiw/codemirror-theme-tokyo-night/cjs/package.json +1 -0
  376. package/node_modules/@uiw/codemirror-theme-tokyo-night/esm/index.d.ts +5 -0
  377. package/node_modules/@uiw/codemirror-theme-tokyo-night/esm/index.js +89 -0
  378. package/node_modules/@uiw/codemirror-theme-tokyo-night/esm/package.json +1 -0
  379. package/node_modules/@uiw/codemirror-theme-tokyo-night/package.json +50 -0
  380. package/node_modules/@uiw/codemirror-theme-tokyo-night/src/index.ts +51 -0
  381. package/node_modules/@uiw/codemirror-theme-tokyo-night-day/README.md +153 -0
  382. package/node_modules/@uiw/codemirror-theme-tokyo-night-day/cjs/index.d.ts +5 -0
  383. package/node_modules/@uiw/codemirror-theme-tokyo-night-day/cjs/index.js +100 -0
  384. package/node_modules/@uiw/codemirror-theme-tokyo-night-day/cjs/package.json +1 -0
  385. package/node_modules/@uiw/codemirror-theme-tokyo-night-day/esm/index.d.ts +5 -0
  386. package/node_modules/@uiw/codemirror-theme-tokyo-night-day/esm/index.js +90 -0
  387. package/node_modules/@uiw/codemirror-theme-tokyo-night-day/esm/package.json +1 -0
  388. package/node_modules/@uiw/codemirror-theme-tokyo-night-day/package.json +51 -0
  389. package/node_modules/@uiw/codemirror-theme-tokyo-night-day/src/index.ts +51 -0
  390. package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/README.md +153 -0
  391. package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/cjs/index.d.ts +5 -0
  392. package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/cjs/index.js +100 -0
  393. package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/cjs/package.json +1 -0
  394. package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/esm/index.d.ts +5 -0
  395. package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/esm/index.js +90 -0
  396. package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/esm/package.json +1 -0
  397. package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/package.json +51 -0
  398. package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/src/index.ts +51 -0
  399. package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/README.md +151 -0
  400. package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/cjs/color.d.ts +25 -0
  401. package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/cjs/color.js +31 -0
  402. package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/cjs/index.d.ts +5 -0
  403. package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/cjs/index.js +103 -0
  404. package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/cjs/package.json +1 -0
  405. package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/esm/color.d.ts +25 -0
  406. package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/esm/color.js +25 -0
  407. package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/esm/index.d.ts +5 -0
  408. package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/esm/index.js +93 -0
  409. package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/esm/package.json +1 -0
  410. package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/package.json +45 -0
  411. package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/src/color.ts +25 -0
  412. package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/src/index.ts +52 -0
  413. package/node_modules/@uiw/codemirror-theme-vscode/README.md +161 -0
  414. package/node_modules/@uiw/codemirror-theme-vscode/cjs/dark.d.ts +5 -0
  415. package/node_modules/@uiw/codemirror-theme-vscode/cjs/dark.js +98 -0
  416. package/node_modules/@uiw/codemirror-theme-vscode/cjs/index.d.ts +2 -0
  417. package/node_modules/@uiw/codemirror-theme-vscode/cjs/index.js +27 -0
  418. package/node_modules/@uiw/codemirror-theme-vscode/cjs/light.d.ts +5 -0
  419. package/node_modules/@uiw/codemirror-theme-vscode/cjs/light.js +98 -0
  420. package/node_modules/@uiw/codemirror-theme-vscode/cjs/package.json +1 -0
  421. package/node_modules/@uiw/codemirror-theme-vscode/esm/dark.d.ts +5 -0
  422. package/node_modules/@uiw/codemirror-theme-vscode/esm/dark.js +85 -0
  423. package/node_modules/@uiw/codemirror-theme-vscode/esm/index.d.ts +2 -0
  424. package/node_modules/@uiw/codemirror-theme-vscode/esm/index.js +2 -0
  425. package/node_modules/@uiw/codemirror-theme-vscode/esm/light.d.ts +5 -0
  426. package/node_modules/@uiw/codemirror-theme-vscode/esm/light.js +85 -0
  427. package/node_modules/@uiw/codemirror-theme-vscode/esm/package.json +1 -0
  428. package/node_modules/@uiw/codemirror-theme-vscode/package.json +44 -0
  429. package/node_modules/@uiw/codemirror-theme-vscode/src/dark.ts +82 -0
  430. package/node_modules/@uiw/codemirror-theme-vscode/src/index.ts +2 -0
  431. package/node_modules/@uiw/codemirror-theme-vscode/src/light.ts +82 -0
  432. package/node_modules/@uiw/codemirror-theme-white/README.md +160 -0
  433. package/node_modules/@uiw/codemirror-theme-white/cjs/dark-color.d.ts +26 -0
  434. package/node_modules/@uiw/codemirror-theme-white/cjs/dark-color.js +32 -0
  435. package/node_modules/@uiw/codemirror-theme-white/cjs/dark.d.ts +5 -0
  436. package/node_modules/@uiw/codemirror-theme-white/cjs/dark.js +110 -0
  437. package/node_modules/@uiw/codemirror-theme-white/cjs/index.d.ts +2 -0
  438. package/node_modules/@uiw/codemirror-theme-white/cjs/index.js +27 -0
  439. package/node_modules/@uiw/codemirror-theme-white/cjs/light-color.d.ts +26 -0
  440. package/node_modules/@uiw/codemirror-theme-white/cjs/light-color.js +32 -0
  441. package/node_modules/@uiw/codemirror-theme-white/cjs/light.d.ts +5 -0
  442. package/node_modules/@uiw/codemirror-theme-white/cjs/light.js +110 -0
  443. package/node_modules/@uiw/codemirror-theme-white/cjs/package.json +1 -0
  444. package/node_modules/@uiw/codemirror-theme-white/esm/dark-color.d.ts +26 -0
  445. package/node_modules/@uiw/codemirror-theme-white/esm/dark-color.js +26 -0
  446. package/node_modules/@uiw/codemirror-theme-white/esm/dark.d.ts +5 -0
  447. package/node_modules/@uiw/codemirror-theme-white/esm/dark.js +100 -0
  448. package/node_modules/@uiw/codemirror-theme-white/esm/index.d.ts +2 -0
  449. package/node_modules/@uiw/codemirror-theme-white/esm/index.js +2 -0
  450. package/node_modules/@uiw/codemirror-theme-white/esm/light-color.d.ts +26 -0
  451. package/node_modules/@uiw/codemirror-theme-white/esm/light-color.js +26 -0
  452. package/node_modules/@uiw/codemirror-theme-white/esm/light.d.ts +5 -0
  453. package/node_modules/@uiw/codemirror-theme-white/esm/light.js +100 -0
  454. package/node_modules/@uiw/codemirror-theme-white/esm/package.json +1 -0
  455. package/node_modules/@uiw/codemirror-theme-white/package.json +56 -0
  456. package/node_modules/@uiw/codemirror-theme-white/src/dark-color.ts +26 -0
  457. package/node_modules/@uiw/codemirror-theme-white/src/dark.ts +57 -0
  458. package/node_modules/@uiw/codemirror-theme-white/src/index.ts +2 -0
  459. package/node_modules/@uiw/codemirror-theme-white/src/light-color.ts +26 -0
  460. package/node_modules/@uiw/codemirror-theme-white/src/light.ts +57 -0
  461. package/node_modules/@uiw/codemirror-theme-xcode/README.md +154 -0
  462. package/node_modules/@uiw/codemirror-theme-xcode/cjs/index.d.ts +9 -0
  463. package/node_modules/@uiw/codemirror-theme-xcode/cjs/index.js +119 -0
  464. package/node_modules/@uiw/codemirror-theme-xcode/cjs/package.json +1 -0
  465. package/node_modules/@uiw/codemirror-theme-xcode/esm/index.d.ts +9 -0
  466. package/node_modules/@uiw/codemirror-theme-xcode/esm/index.js +104 -0
  467. package/node_modules/@uiw/codemirror-theme-xcode/esm/package.json +1 -0
  468. package/node_modules/@uiw/codemirror-theme-xcode/package.json +44 -0
  469. package/node_modules/@uiw/codemirror-theme-xcode/src/index.ts +75 -0
  470. package/node_modules/@uiw/codemirror-themes/README.md +391 -0
  471. package/node_modules/@uiw/codemirror-themes/cjs/index.d.ts +46 -0
  472. package/node_modules/@uiw/codemirror-themes/cjs/index.js +84 -0
  473. package/node_modules/@uiw/codemirror-themes/cjs/package.json +1 -0
  474. package/node_modules/@uiw/codemirror-themes/esm/index.d.ts +46 -0
  475. package/node_modules/@uiw/codemirror-themes/esm/index.js +78 -0
  476. package/node_modules/@uiw/codemirror-themes/esm/package.json +1 -0
  477. package/node_modules/@uiw/codemirror-themes/package.json +56 -0
  478. package/node_modules/@uiw/codemirror-themes/src/index.tsx +128 -0
  479. package/node_modules/@uiw/codemirror-themes-all/README.md +406 -0
  480. package/node_modules/@uiw/codemirror-themes-all/cjs/index.d.ts +35 -0
  481. package/node_modules/@uiw/codemirror-themes-all/cjs/index.js +390 -0
  482. package/node_modules/@uiw/codemirror-themes-all/cjs/package.json +1 -0
  483. package/node_modules/@uiw/codemirror-themes-all/esm/index.d.ts +35 -0
  484. package/node_modules/@uiw/codemirror-themes-all/esm/index.js +35 -0
  485. package/node_modules/@uiw/codemirror-themes-all/esm/package.json +1 -0
  486. package/node_modules/@uiw/codemirror-themes-all/package.json +86 -0
  487. package/node_modules/@uiw/codemirror-themes-all/src/index.ts +35 -0
  488. package/package.json +1 -1
  489. package/packages/cli/package.json +1 -1
  490. package/packages/daemon/package.json +1 -1
  491. package/packages/daemon/src/adaptive.js +26 -16
  492. package/packages/daemon/src/api.js +124 -6
  493. package/packages/daemon/src/introducer.js +7 -2
  494. package/packages/daemon/src/journalist.js +62 -24
  495. package/packages/daemon/src/model-lab.js +6 -5
  496. package/packages/daemon/src/process.js +11 -8
  497. package/packages/daemon/src/rotator.js +5 -7
  498. package/{node_modules/@groove-dev/gui/dist/assets/codemirror-DRQdprYi.js → packages/gui/dist/assets/codemirror-BQqYnZfL.js} +10 -10
  499. package/packages/gui/dist/assets/index-AkOtskHS.css +1 -0
  500. package/packages/gui/dist/assets/index-B4uYLR57.js +8694 -0
  501. package/packages/gui/dist/index.html +3 -3
  502. package/packages/gui/package.json +2 -1
  503. package/packages/gui/src/components/agents/code-review.jsx +87 -39
  504. package/packages/gui/src/components/agents/diff-viewer.jsx +174 -70
  505. package/packages/gui/src/components/editor/ai-panel.jsx +199 -0
  506. package/packages/gui/src/components/editor/code-editor.jsx +162 -67
  507. package/packages/gui/src/components/editor/editor-status-bar.jsx +66 -0
  508. package/packages/gui/src/components/editor/editor-toolbar.jsx +179 -0
  509. package/packages/gui/src/components/editor/file-tree.jsx +111 -4
  510. package/packages/gui/src/components/editor/inline-prompt.jsx +67 -0
  511. package/packages/gui/src/components/editor/quick-search.jsx +170 -0
  512. package/packages/gui/src/components/editor/selection-menu.jsx +88 -0
  513. package/packages/gui/src/components/editor/terminal.jsx +1 -0
  514. package/packages/gui/src/components/lab/system-prompt-editor.jsx +21 -24
  515. package/packages/gui/src/components/layout/activity-bar.jsx +5 -9
  516. package/packages/gui/src/components/layout/terminal-panel.jsx +8 -0
  517. package/packages/gui/src/components/ui/toast.jsx +13 -8
  518. package/packages/gui/src/stores/groove.js +75 -2
  519. package/packages/gui/src/views/agents.jsx +7 -7
  520. package/packages/gui/src/views/editor.jsx +219 -67
  521. package/model-workspace/LAB-ASSISTANT-BUILD-PLAN.md +0 -341
  522. package/node_modules/@groove-dev/gui/dist/assets/index-BrZHF7pK.js +0 -8689
  523. package/node_modules/@groove-dev/gui/dist/assets/index-DIfiwdKl.css +0 -1
  524. package/packages/gui/dist/assets/index-BrZHF7pK.js +0 -8689
  525. package/packages/gui/dist/assets/index-DIfiwdKl.css +0 -1
package/CLAUDE.md CHANGED
@@ -1,7 +1,30 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
1
5
  # GROOVE — Agent Orchestration Layer
2
6
 
3
7
  > Spawn fast. Stay aware. Never lose context.
4
8
 
9
+ ## Build & Development Commands
10
+
11
+ ```bash
12
+ # Build GUI (required after any GUI changes — daemon serves built assets)
13
+ npm run build # or: cd packages/gui && npx vite build
14
+
15
+ # Run all tests (265 tests, 24 suites)
16
+ npm test # or: node --test packages/daemon/test/*.test.js
17
+
18
+ # Run a single test file
19
+ node --test packages/daemon/test/registry.test.js
20
+
21
+ # Dev servers (not for agents — agents use npm run build)
22
+ npm run dev:gui # Vite dev server (HMR)
23
+ npm run dev:daemon # Daemon in dev mode
24
+ ```
25
+
26
+ **Important:** GUI changes require `npm run build` to take effect (daemon serves static build from `packages/gui/dist/`). Daemon changes require a manual daemon restart — agents must NEVER restart the daemon themselves.
27
+
5
28
  ## What This Is
6
29
 
7
30
  GROOVE is a lightweight, open-source agent orchestration layer for AI coding tools. It is a **process manager** — it spawns, coordinates, and monitors AI coding agents. It does NOT wrap, proxy, or impersonate any AI API.
@@ -92,7 +115,7 @@ Bundled starter teams: `fullstack.json`, `api-builder.json`, `monorepo.json`
92
115
  - Tailwind CSS v4 + Radix UI (GUI styling + accessible primitives)
93
116
  - Zustand 5 (GUI state + WebSocket sync)
94
117
  - React Flow / @xyflow/react (agent tree visualization)
95
- - CodeMirror 6 (code editor, 7 languages)
118
+ - CodeMirror 6 + @uiw/codemirror-themes-all (code editor, 7 languages, 38 selectable themes)
96
119
  - xterm.js (terminal emulation)
97
120
  - Framer Motion (animations)
98
121
  - Lucide React (icons)
@@ -201,7 +224,7 @@ React app served by daemon at `http://localhost:31415`. VS Code-style layout. Ta
201
224
  - Log files created with 0o600 permissions
202
225
  - Command injection prevention (execFileSync with array args in tmux)
203
226
  - Scope patterns validated (no absolute paths, no traversal)
204
- - 137 automated tests across 14 suites
227
+ - 265 automated tests across 24 suites
205
228
 
206
229
  ## Conventions
207
230
 
@@ -211,6 +234,15 @@ React app served by daemon at `http://localhost:31415`. VS Code-style layout. Ta
211
234
  - `.groove/` directory in project root for runtime state (gitignored)
212
235
  - Generated markdown files: `AGENTS_REGISTRY.md`, `GROOVE_PROJECT_MAP.md`, `GROOVE_DECISIONS.md`
213
236
 
237
+ ## GUI Styling Rules
238
+
239
+ - **Tailwind CSS v4 only** — zero inline styles (no `style={{}}` except dynamic values like `width`, `height`)
240
+ - **No absolute-positioned floating buttons** over content — use flex layout rails instead
241
+ - **File tree icons** must be neutral/muted (`text-text-2`/`text-text-3`) — no rainbow colors
242
+ - **Editor themes** are user-selectable via status bar picker — do not hardcode syntax highlight colors
243
+ - **Font sizes:** file trees use `text-xs` (12px), editor uses 12px via theme
244
+ - **No inline styles for colors** — use design token CSS variables (`--color-accent`, `--color-danger`, etc.)
245
+
214
246
  ## Compliance (CRITICAL)
215
247
 
216
248
  GROOVE is a process manager, NOT a harness. Hard rules:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@groove-dev/cli",
3
- "version": "0.27.137",
3
+ "version": "0.27.139",
4
4
  "description": "GROOVE CLI — manage AI coding agents from your terminal",
5
5
  "license": "FSL-1.1-Apache-2.0",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@groove-dev/daemon",
3
- "version": "0.27.137",
3
+ "version": "0.27.139",
4
4
  "description": "GROOVE daemon — agent orchestration engine",
5
5
  "license": "FSL-1.1-Apache-2.0",
6
6
  "type": "module",
@@ -98,15 +98,21 @@ export class AdaptiveThresholds {
98
98
  return { score, threshold: newThreshold, converged: profile.converged };
99
99
  }
100
100
 
101
- scoreSession(signals) {
101
+ scoreSession(signals, options = {}) {
102
102
  // Score 0-100 based on quality signals.
103
103
  // Low score → rotate sooner (threshold decreases)
104
104
  // High score → allow more context (threshold increases)
105
+ //
106
+ // Self-managing providers (Claude Code) get reduced penalties because
107
+ // their normal debugging patterns — polling, retrying commands, hitting
108
+ // errors during investigation — look identical to degradation signals
109
+ // but are expected productive behavior.
110
+ const selfManages = options.selfManagesContext ?? false;
105
111
  let score = 70; // Baseline: decent session
106
112
 
107
- // Error rate: each error costs 5 points
113
+ // Error rate: -5 per error normally, -2 for self-managing (errors during debugging are expected)
108
114
  const errorCount = signals.errorCount || 0;
109
- score -= errorCount * 5;
115
+ score -= errorCount * (selfManages ? 2 : 5);
110
116
 
111
117
  // Repetitions: 3+ Write/Edit to the same file in a sliding window
112
118
  const repetitions = signals.repetitions || 0;
@@ -121,7 +127,7 @@ export class AdaptiveThresholds {
121
127
  const toolFailures = signals.toolFailures || 0;
122
128
  if (toolCalls > 0) {
123
129
  const successRate = (toolCalls - toolFailures) / toolCalls;
124
- score += Math.round((successRate - 0.8) * 20);
130
+ score += Math.round((successRate - 0.8) * (selfManages ? 10 : 20));
125
131
  }
126
132
 
127
133
  // File churn: same file written 5+ times — genuine circular refactoring
@@ -130,26 +136,30 @@ export class AdaptiveThresholds {
130
136
 
131
137
  // Error trend: increasing errors in second half = degradation
132
138
  const errorTrend = signals.errorTrend || 0;
133
- if (errorTrend > 0) score -= errorTrend * 6; // getting worse
134
- if (errorTrend < 0) score += 3; // getting better (small bonus)
139
+ if (errorTrend > 0) score -= errorTrend * (selfManages ? 3 : 6);
140
+ if (errorTrend < 0) score += 3;
135
141
 
136
142
  // Files written: productivity signal
137
143
  const filesWritten = signals.filesWritten || 0;
138
144
  score += Math.min(filesWritten * 2, 10); // Cap at +10
139
145
 
140
- // Output length decay: assistant responses shrinking dramatically
141
- if (signals.outputLengthDecay) score -= 10;
146
+ // The following signals are skipped for self-managing providers because
147
+ // they're false positives during debugging:
148
+ // - outputLengthDecay: shorter responses = narrowing in on a problem
149
+ // - toolOutputVolume: reading logs/large files is expected
150
+ // - turnLatencyTrend: thinking longer about hard problems is fine
151
+ // - bashRepetition: polling (sleep + check) is a normal pattern
152
+ if (!selfManages) {
153
+ if (signals.outputLengthDecay) score -= 10;
142
154
 
143
- // Tool output volume: bloated context from large tool results
144
- const toolVol = signals.toolOutputVolume || 0;
145
- if (toolVol === 2) score -= 10;
146
- else if (toolVol === 1) score -= 5;
155
+ const toolVol = signals.toolOutputVolume || 0;
156
+ if (toolVol === 2) score -= 10;
157
+ else if (toolVol === 1) score -= 5;
147
158
 
148
- // Turn latency trend: agent slowing down significantly
149
- if (signals.turnLatencyTrend) score -= 5;
159
+ if (signals.turnLatencyTrend) score -= 5;
150
160
 
151
- // Bash repetition: agent stuck running identical commands
152
- if (signals.bashRepetition) score -= 8;
161
+ if (signals.bashRepetition) score -= 8;
162
+ }
153
163
 
154
164
  // Clamp to 0-100
155
165
  return Math.max(0, Math.min(100, score));
@@ -1693,18 +1693,29 @@ export function createApi(app, daemon) {
1693
1693
  // Rotation = full handoff brief (only for degradation or no session)
1694
1694
  app.post('/api/agents/:id/instruct', async (req, res) => {
1695
1695
  try {
1696
- const { message } = req.body;
1696
+ const { message, codeContext } = req.body;
1697
1697
  if (!message || typeof message !== 'string' || !message.trim()) {
1698
1698
  return res.status(400).json({ error: 'message is required' });
1699
1699
  }
1700
1700
  const agent = daemon.registry.get(req.params.id);
1701
1701
  if (!agent) return res.status(404).json({ error: 'Agent not found' });
1702
1702
 
1703
+ // Build the final instruction, optionally enriched with code context
1704
+ let finalMessage = message.trim();
1705
+ if (codeContext && typeof codeContext === 'object') {
1706
+ const { filePath, lineStart, lineEnd, selectedCode } = codeContext;
1707
+ if (filePath && typeof filePath === 'string' && selectedCode && typeof selectedCode === 'string') {
1708
+ const start = Number.isFinite(lineStart) ? lineStart : '?';
1709
+ const end = Number.isFinite(lineEnd) ? lineEnd : '?';
1710
+ finalMessage = `${finalMessage}\n\nCode context from ${filePath} (lines ${start}-${end}):\n\`\`\`\n${selectedCode}\n\`\`\``;
1711
+ }
1712
+ }
1713
+
1703
1714
  // Record user feedback so the journalist can include it in future agent context
1704
- if (daemon.journalist) daemon.journalist.recordUserFeedback(agent, message.trim());
1715
+ if (daemon.journalist) daemon.journalist.recordUserFeedback(agent, finalMessage);
1705
1716
 
1706
1717
  // Agent loop path — send message directly to the running loop
1707
- const wrappedMessage = wrapWithRoleReminder(agent.role, message.trim());
1718
+ const wrappedMessage = wrapWithRoleReminder(agent.role, finalMessage);
1708
1719
  if (daemon.processes.hasAgentLoop(req.params.id)) {
1709
1720
  const sent = await daemon.processes.sendMessage(req.params.id, wrappedMessage);
1710
1721
  if (sent) {
@@ -1731,7 +1742,7 @@ export function createApi(app, daemon) {
1731
1742
  scope: oldConfig.scope,
1732
1743
  provider: oldConfig.provider,
1733
1744
  model: oldConfig.model,
1734
- prompt: message.trim(),
1745
+ prompt: finalMessage,
1735
1746
  permission: oldConfig.permission || 'full',
1736
1747
  workingDir: oldConfig.workingDir,
1737
1748
  name: oldConfig.name,
@@ -1754,7 +1765,7 @@ export function createApi(app, daemon) {
1754
1765
  scope: oldConfig.scope,
1755
1766
  provider: oldConfig.provider,
1756
1767
  model: oldConfig.model,
1757
- prompt: message.trim(),
1768
+ prompt: finalMessage,
1758
1769
  introContext: oldConfig.introContext,
1759
1770
  permission: oldConfig.permission || 'full',
1760
1771
  workingDir: oldConfig.workingDir,
@@ -3340,11 +3351,118 @@ Keep responses concise. Help them think, don't lecture them about the system the
3340
3351
  });
3341
3352
  });
3342
3353
 
3354
+ // Git line status — per-line modification status for editor gutter decorations
3355
+ app.get('/api/files/git-line-status', (req, res) => {
3356
+ const relPath = req.query.path;
3357
+ if (!relPath || typeof relPath !== 'string') {
3358
+ return res.status(400).json({ error: 'path parameter is required' });
3359
+ }
3360
+ if (relPath.includes('\0') || relPath.startsWith('/')) {
3361
+ return res.status(400).json({ error: 'Invalid path' });
3362
+ }
3363
+ const segments = relPath.split(/[/\\]/);
3364
+ if (segments.some(s => s === '..')) {
3365
+ return res.status(400).json({ error: 'Path traversal not allowed' });
3366
+ }
3367
+
3368
+ const rootDir = getEditorRoot();
3369
+ if (!rootDir) return res.status(400).json({ error: 'Editor root not set' });
3370
+
3371
+ const fullPath = resolve(rootDir, relPath);
3372
+ if (!fullPath.startsWith(rootDir + sep) && fullPath !== rootDir) {
3373
+ return res.status(400).json({ error: 'Path outside project' });
3374
+ }
3375
+
3376
+ const result = { lines: { added: [], modified: [], deleted: [] } };
3377
+
3378
+ // Check if file is tracked by git
3379
+ try {
3380
+ execFileSync('git', ['ls-files', '--error-unmatch', '--', relPath], { cwd: rootDir, timeout: 5000, stdio: 'pipe' });
3381
+ } catch {
3382
+ // File not tracked — check if it exists (untracked = all lines added)
3383
+ if (existsSync(fullPath)) {
3384
+ try {
3385
+ const content = readFileSync(fullPath, 'utf8');
3386
+ const lineCount = content.split('\n').length;
3387
+ for (let i = 1; i <= lineCount; i++) result.lines.added.push(i);
3388
+ } catch { /* binary or unreadable */ }
3389
+ }
3390
+ return res.json(result);
3391
+ }
3392
+
3393
+ try {
3394
+ const diffOut = execFileSync('git', ['diff', '--unified=0', '--', relPath], {
3395
+ cwd: rootDir, timeout: 10000, maxBuffer: 5 * 1024 * 1024,
3396
+ }).toString();
3397
+
3398
+ if (!diffOut.trim()) return res.json(result);
3399
+
3400
+ // Check for binary
3401
+ if (diffOut.includes('Binary files')) return res.json(result);
3402
+
3403
+ // Parse unified diff hunks: @@ -oldStart,oldCount +newStart,newCount @@
3404
+ const hunkRe = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/gm;
3405
+ let match;
3406
+ while ((match = hunkRe.exec(diffOut)) !== null) {
3407
+ const oldCount = parseInt(match[2] ?? '1', 10);
3408
+ const newStart = parseInt(match[3], 10);
3409
+ const newCount = parseInt(match[4] ?? '1', 10);
3410
+
3411
+ if (oldCount === 0 && newCount > 0) {
3412
+ // Pure addition
3413
+ for (let i = newStart; i < newStart + newCount; i++) result.lines.added.push(i);
3414
+ } else if (newCount === 0 && oldCount > 0) {
3415
+ // Pure deletion — mark the line where content was removed
3416
+ result.lines.deleted.push(newStart);
3417
+ } else {
3418
+ // Modification
3419
+ for (let i = newStart; i < newStart + newCount; i++) result.lines.modified.push(i);
3420
+ }
3421
+ }
3422
+
3423
+ res.json(result);
3424
+ } catch (err) {
3425
+ if (err.status !== undefined) return res.json(result);
3426
+ res.status(500).json({ error: 'Failed to compute line status' });
3427
+ }
3428
+ });
3429
+
3430
+ // Git branches — list all local branches with current branch marked
3431
+ app.get('/api/files/git-branches', (req, res) => {
3432
+ const rootDir = getEditorRoot();
3433
+ if (!rootDir) return res.status(400).json({ error: 'Editor root not set' });
3434
+
3435
+ const fallback = { current: null, branches: [] };
3436
+
3437
+ try {
3438
+ let current = null;
3439
+ try {
3440
+ current = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
3441
+ cwd: rootDir, timeout: 5000, stdio: 'pipe',
3442
+ }).toString().trim();
3443
+ } catch { return res.json(fallback); }
3444
+
3445
+ const branchOut = execFileSync('git', ['branch', '--list', '--format=%(refname:short)'], {
3446
+ cwd: rootDir, timeout: 5000, stdio: 'pipe',
3447
+ }).toString();
3448
+
3449
+ const branches = branchOut.split('\n').map(b => b.trim()).filter(Boolean);
3450
+ res.json({ current, branches });
3451
+ } catch {
3452
+ res.json(fallback);
3453
+ }
3454
+ });
3455
+
3343
3456
  // Files touched by an agent during its session
3344
3457
  app.get('/api/agents/:id/files-touched', (req, res) => {
3345
3458
  const agent = daemon.registry.get(req.params.id);
3346
3459
  if (!agent) return res.status(404).json({ error: 'Agent not found' });
3347
- const files = daemon.registry.getFilesTouched(req.params.id);
3460
+ const rawFiles = daemon.registry.getFilesTouched(req.params.id);
3461
+ const rootDir = agent.workingDir || daemon.projectDir;
3462
+ const files = rawFiles.map(f => {
3463
+ const fullPath = isAbsolute(f.path) ? f.path : resolve(rootDir, f.path);
3464
+ return { ...f, exists: existsSync(fullPath) };
3465
+ });
3348
3466
  res.json({ files, total: files.length });
3349
3467
  });
3350
3468
 
@@ -173,12 +173,17 @@ export class Introducer {
173
173
  }
174
174
  }
175
175
 
176
- // Project files section — tell the new agent what exists and what to read
176
+ // Project files section — tell the new agent what exists
177
+ // When no task is assigned, list files as reference only (not an action prompt)
177
178
  if (allTeamFiles.length > 0) {
178
179
  lines.push('');
179
180
  lines.push(`## Project Files`);
180
181
  lines.push('');
181
- lines.push(`Your team has created the following files. **Read relevant ones before starting work** to understand what's been built and planned:`);
182
+ if (hasTask || isRotation) {
183
+ lines.push(`Your team has created the following files. **Read relevant ones before starting work** to understand what's been built and planned:`);
184
+ } else {
185
+ lines.push(`Your team has created the following files (for reference — do NOT read or act on these until you receive a task):`);
186
+ }
182
187
  lines.push('');
183
188
 
184
189
  // Group by agent for clarity
@@ -443,24 +443,47 @@ export class Journalist {
443
443
  `Scope: ${agent.scope?.join(', ') || 'unrestricted'}${dir}`,
444
444
  `Rotation reason: ${reason}`,
445
445
  '',
446
- 'Analyze the session log below and produce a structured handoff brief.',
446
+ 'Analyze the FULL session log below and produce a structured handoff brief.',
447
+ 'The next agent must be able to continue this work without repeating anything.',
447
448
  '',
448
449
  'Output EXACTLY these sections, in this priority order:',
449
450
  '',
451
+ '## Investigation Path',
452
+ '(Chronological narrative of what was explored and why. For each major step:',
453
+ ' what was tried, what the result was, and whether it was ruled out or remains viable.',
454
+ ' The next agent must know the full path taken to avoid retreading ground.)',
455
+ '',
456
+ '## Current State',
457
+ '(Where things stand right now. What is the current hypothesis or approach?',
458
+ ' What was the agent actively working on when rotated? What is the next step?)',
459
+ '',
460
+ '## What Was Ruled Out',
461
+ '(Approaches, files, or theories that were investigated and eliminated.',
462
+ ' Include WHY each was ruled out so the next agent does not retry them.)',
463
+ '',
464
+ '## Key Findings',
465
+ '(Important discoveries: root causes identified, relevant code locations,',
466
+ ' configuration details, error patterns, dependencies found. Name files,',
467
+ ' functions, and line numbers.)',
468
+ '',
450
469
  '## Unresolved Errors',
451
- '(What failed, what was tried, and what to avoid repeating.)',
470
+ '(Errors still occurring. Include exact error messages and context.)',
471
+ '',
472
+ '## User Messages',
473
+ '(EVERY message the user typed, verbatim or near-verbatim. These are critical —',
474
+ ' the user must never have to repeat themselves after a rotation. Include all',
475
+ ' instructions, questions, corrections, and context the user provided.)',
452
476
  '',
453
477
  '## User Constraints',
454
478
  '(Explicit user directives, must/never/avoid/use instructions.)',
455
479
  '',
456
- '## Last 5 Tool Calls',
480
+ '## Last 15 Tool Calls',
457
481
  '(Compact list of the most recent meaningful tool calls and outcomes.)',
458
482
  '',
459
- '## Accomplishments',
460
- '(What was completed. Name files, functions, and line numbers.)',
461
- '',
462
483
  'Be specific. Name files, functions, and line numbers. Do not summarize vaguely.',
463
- 'Keep your response under 1500 characters.',
484
+ 'Preserve the investigation narrative the next agent needs to understand the',
485
+ 'journey, not just the destination.',
486
+ 'Keep your response under 4000 characters.',
464
487
  '',
465
488
  '---',
466
489
  '',
@@ -469,8 +492,8 @@ export class Journalist {
469
492
  ];
470
493
 
471
494
  let totalChars = 0;
472
- const cap = 15_000;
473
- for (const entry of entries.slice(-200)) {
495
+ const cap = 40_000;
496
+ for (const entry of entries.slice(-500)) {
474
497
  const line = this.formatEntry(entry);
475
498
  if (totalChars + line.length > cap) break;
476
499
  parts.push(line);
@@ -861,7 +884,14 @@ export class Journalist {
861
884
  ? `- Quality profile: ${specialization.avgQualityScore}/100 across ${specialization.sessionCount} sessions`
862
885
  : '';
863
886
 
864
- const recentChain = this.daemon.memory?.getRecentHandoffMarkdown(agent.role, 1, 1500, agent.workingDir, agent.teamId) || '';
887
+ const recentChain = this.daemon.memory?.getRecentHandoffMarkdown(agent.role, 3, 3000, agent.workingDir, agent.teamId) || '';
888
+
889
+ // User messages from the session log — these are the actual things the user typed.
890
+ // They must always be preserved: if a user said it, the next agent needs to see it.
891
+ const userMessages = entries
892
+ .filter((e) => e.type === 'user' && e.text)
893
+ .map((e) => `- "${e.text.slice(0, 500)}"`)
894
+ .join('\n');
865
895
 
866
896
  const agentFeedback = this.getUserFeedback(agent.id).slice(-5);
867
897
  const conversationSummary = agentFeedback.length > 0
@@ -870,7 +900,7 @@ export class Journalist {
870
900
 
871
901
  const recentTools = entries
872
902
  .filter((e) => e.type === 'tool' || e.type === 'error')
873
- .slice(-5)
903
+ .slice(-15)
874
904
  .map((e) => `- ${e.type === 'error' ? 'ERROR ' : ''}${e.tool}: ${(e.input || e.text || '').slice(0, 200)}`)
875
905
  .join('\n');
876
906
 
@@ -907,24 +937,32 @@ export class Journalist {
907
937
 
908
938
  const fallbackRecentTools = entries
909
939
  .filter((e) => e.type === 'tool' || e.type === 'error')
910
- .slice(-5)
940
+ .slice(-15)
911
941
  .map((e) => `- ${e.type === 'error' ? 'ERROR ' : ''}${e.tool}: ${(e.input || '').slice(0, 200)}`)
912
942
  .join('\n');
913
943
 
944
+ // Build investigation timeline from thinking entries — these capture reasoning and decisions
945
+ const thinkingEntries = entries
946
+ .filter((e) => e.type === 'thinking' && e.text && e.text.length > 80)
947
+ .slice(-10)
948
+ .map((e) => `- ${e.text.slice(0, 400)}`)
949
+ .join('\n');
950
+
914
951
  const fallbackParts = [];
952
+ if (thinkingEntries) fallbackParts.push(`## Investigation Path\n\n${thinkingEntries}`);
915
953
  if (errorSummary) fallbackParts.push(`## Unresolved Errors\n\n${errorSummary}`);
916
- if (fallbackRecentTools) fallbackParts.push(`## Last 5 Tool Calls\n\n${fallbackRecentTools}`);
954
+ if (fallbackRecentTools) fallbackParts.push(`## Last 15 Tool Calls\n\n${fallbackRecentTools}`);
917
955
  if (fileChangesSummary) fallbackParts.push(`## Files Modified\n\n${fileChangesSummary}`);
918
956
  if (resultSummary) fallbackParts.push(`## Accomplishments\n\n${resultSummary}`);
919
957
  sessionSummary = fallbackParts.join('\n\n');
920
958
  }
921
959
 
922
- // For quality_degradation rotations, drop user messages (already in session summary)
923
- const includeUserMessages = options.reason !== 'quality_degradation';
924
-
925
960
  // Cap Original Task to 1000 chars — task descriptions for debugging can be long
926
961
  const originalTask = agent.prompt ? agent.prompt.slice(0, 1000) + (agent.prompt.length > 1000 ? '…' : '') : '';
927
962
 
963
+ // Combine user messages from session log and feedback API — never drop these
964
+ const allUserMessages = [userMessages, conversationSummary].filter(Boolean).join('\n');
965
+
928
966
  let brief = [
929
967
  `# Handoff Brief — ${agent.name} (${agent.role})`,
930
968
  ``,
@@ -933,14 +971,14 @@ export class Journalist {
933
971
  `Rotation: ${options.reason || 'manual'}${options.qualityScore ? ` (quality: ${options.qualityScore}/100)` : ''} | Tokens: ${agent.tokensUsed}`,
934
972
  specLine,
935
973
  ``,
936
- // Priority order: session summary (contains unresolved errors) first,
937
- // then constraints, then discoveries, then tools so the most critical
938
- // debugging context survives even if the brief hits the hard cap.
974
+ // Priority order: session summary first, then user messages (never drop
975
+ // if the user typed it, the next agent must see it), then constraints,
976
+ // then discoveries, then tools. Most critical context survives truncation.
939
977
  sessionSummary ? `## Session Summary\n\n${sessionSummary}\n` : '',
978
+ allUserMessages ? `## User Messages (do not ask user to repeat these)\n\n${allUserMessages}\n` : '',
940
979
  constraints ? `## Project Constraints (must follow)\n\n${constraints}\n` : '',
941
980
  discoveries ? `## Known Issues & Fixes\n\n${discoveries}\n` : '',
942
- recentTools ? `## Last 5 Tool Calls\n\n${recentTools}\n` : '',
943
- includeUserMessages && conversationSummary ? `## Recent User Messages\n\n${conversationSummary}\n` : '',
981
+ recentTools ? `## Last 15 Tool Calls\n\n${recentTools}\n` : '',
944
982
  recentChain ? `## Rotation History\n\n${recentChain}\n` : '',
945
983
  originalTask ? `## Original Task\n\n${originalTask}\n` : '',
946
984
  ``,
@@ -948,9 +986,9 @@ export class Journalist {
948
986
  `Continue seamlessly — finish the work and deliver the output.`,
949
987
  ].filter(Boolean).join('\n');
950
988
 
951
- // Hard cap: 8000 chars — enough for debugging context without overwhelming the new agent
952
- if (brief.length > 8000) {
953
- brief = brief.slice(0, 7950) + '\n\n[Brief truncated — see session logs for full context]';
989
+ // Hard cap: 16000 chars — investigation context needs room to preserve the full narrative
990
+ if (brief.length > 16000) {
991
+ brief = brief.slice(0, 15950) + '\n\n[Brief truncated — see session logs for full context]';
954
992
  }
955
993
 
956
994
  return brief;
@@ -4,8 +4,6 @@
4
4
  import { resolve } from 'path';
5
5
  import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, unlinkSync } from 'fs';
6
6
  import { randomUUID } from 'crypto';
7
- import { Readable } from 'stream';
8
-
9
7
  const RUNTIME_TYPES = ['ollama', 'vllm', 'llama-cpp', 'tgi', 'openai-compatible'];
10
8
  const DEFAULT_OLLAMA_ENDPOINT = 'http://localhost:11434';
11
9
 
@@ -249,11 +247,14 @@ export class ModelLab {
249
247
  throw new Error(errMsg);
250
248
  }
251
249
 
252
- const nodeStream = Readable.fromWeb(resp.body);
250
+ const reader = resp.body.getReader();
251
+ const decoder = new TextDecoder();
253
252
  let buffer = '';
254
253
 
255
- for await (const chunk of nodeStream) {
256
- buffer += typeof chunk === 'string' ? chunk : chunk.toString('utf8');
254
+ while (true) {
255
+ const { done, value } = await reader.read();
256
+ if (done) break;
257
+ buffer += decoder.decode(value, { stream: true });
257
258
  const lines = buffer.split('\n');
258
259
  buffer = lines.pop() || '';
259
260
 
@@ -887,23 +887,26 @@ export class ProcessManager {
887
887
  }
888
888
  }
889
889
 
890
+ // Compute hasTask from actual prompt content — agents spawned without a
891
+ // prompt should NOT receive handoff history (prevents cross-team contamination).
892
+ // Discoveries + constraints are always injected (project knowledge).
893
+ // Handoffs are injected only when the agent has a real task or is a rotation.
894
+ const hasTask = !!(config.prompt && config.prompt.trim().length > 0);
895
+ const isRotation = !!(config.isRotation);
896
+
890
897
  // Pre-spawn task negotiation — if same-role agents are running,
891
- // query them about current work so the new agent gets a clear assignment
898
+ // query them about current work so the new agent gets a clear assignment.
899
+ // Only negotiate when the agent has a task — otherwise the negotiator
900
+ // output acts as an implicit task and the agent starts working immediately.
892
901
  const sameRole = registry.getAll().filter(
893
902
  (a) => a.role === config.role && a.id !== agent.id &&
894
903
  (a.status === 'running' || a.status === 'starting')
895
904
  );
896
905
  let taskNegotiation = '';
897
- if (sameRole.length > 0) {
906
+ if (sameRole.length > 0 && (hasTask || isRotation)) {
898
907
  taskNegotiation = await this.negotiateTaskSplit(agent, sameRole);
899
908
  }
900
909
 
901
- // Compute hasTask from actual prompt content — agents spawned without a
902
- // prompt should NOT receive handoff history (prevents cross-team contamination).
903
- // Discoveries + constraints are always injected (project knowledge).
904
- // Handoffs are injected only when the agent has a real task or is a rotation.
905
- const hasTask = !!(config.prompt && config.prompt.trim().length > 0);
906
- const isRotation = !!(config.isRotation);
907
910
  let introContext = introducer.generateContext(agent, { taskNegotiation, hasTask, isRotation });
908
911
 
909
912
  // Intro context size warning and optional truncation (Change 7)
@@ -145,15 +145,12 @@ export class Rotator extends EventEmitter {
145
145
  }
146
146
 
147
147
  const signals = signalsEarly;
148
- let score = this.daemon.adaptive.scoreSession(signals);
148
+ const providerForScore = getProvider(agent.provider);
149
+ const selfManages = providerForScore?.constructor?.managesOwnContext ?? false;
150
+ let score = this.daemon.adaptive.scoreSession(signals, { selfManagesContext: selfManages });
149
151
 
150
152
  // Age penalties: only for providers that don't manage their own context.
151
- // Claude Code handles context internally via compaction — long sessions
152
- // are normal and productive. Penalizing age causes premature rotation
153
- // that destroys active debugging context and creates restart loops.
154
- const providerForAge = getProvider(agent.provider);
155
- const selfManagesForAge = providerForAge?.constructor?.managesOwnContext ?? false;
156
- if (!selfManagesForAge) {
153
+ if (!selfManages) {
157
154
  if (ageSec > 1800) score -= 5;
158
155
  if (ageSec > 3600) score -= 10;
159
156
  if (ageSec > 7200) score -= 15;
@@ -385,6 +382,7 @@ export class Rotator extends EventEmitter {
385
382
  contextUsage: agent.contextUsage,
386
383
  reason: options.reason || 'manual',
387
384
  qualityScore: options.qualityScore || null,
385
+ qualitySignals: options.signals || null,
388
386
  timestamp: new Date().toISOString(),
389
387
  };
390
388