groove-dev 0.27.93 → 0.27.96

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 (511) hide show
  1. package/CLAUDE.md +7 -0
  2. package/README.md +25 -52
  3. package/moe-training/package.json +2 -1
  4. package/node_modules/@groove-dev/cli/package.json +1 -1
  5. package/node_modules/@groove-dev/daemon/package.json +1 -1
  6. package/node_modules/@groove-dev/daemon/src/api.js +39 -23
  7. package/node_modules/@groove-dev/daemon/src/introducer.js +21 -6
  8. package/node_modules/@groove-dev/daemon/src/process.js +20 -2
  9. package/node_modules/@groove-dev/daemon/src/providers/gemini.js +27 -28
  10. package/node_modules/@groove-dev/gui/dist/assets/{index-VB4_k5Pz.js → index-BgTyFy4f.js} +331 -331
  11. package/node_modules/@groove-dev/gui/dist/assets/{index-Bo6AeNmM.css → index-QADLyUj5.css} +1 -1
  12. package/node_modules/@groove-dev/gui/dist/index.html +2 -2
  13. package/node_modules/@groove-dev/gui/package.json +1 -1
  14. package/node_modules/@groove-dev/gui/src/components/agents/agent-file-tree.jsx +68 -16
  15. package/node_modules/@groove-dev/gui/src/components/agents/agent-panel.jsx +2 -0
  16. package/node_modules/@groove-dev/gui/src/components/agents/code-review.jsx +9 -1
  17. package/node_modules/@groove-dev/gui/src/components/agents/workspace-mode.jsx +2 -2
  18. package/node_modules/@groove-dev/gui/src/components/editor/code-editor.jsx +1 -1
  19. package/node_modules/@groove-dev/gui/src/stores/groove.js +40 -26
  20. package/node_modules/@groove-dev/gui/src/views/agents.jsx +14 -65
  21. package/node_modules/base64-js/LICENSE +21 -0
  22. package/node_modules/base64-js/README.md +34 -0
  23. package/node_modules/base64-js/base64js.min.js +1 -0
  24. package/node_modules/base64-js/index.d.ts +3 -0
  25. package/node_modules/base64-js/index.js +150 -0
  26. package/node_modules/base64-js/package.json +47 -0
  27. package/node_modules/better-sqlite3/LICENSE +21 -0
  28. package/node_modules/better-sqlite3/README.md +99 -0
  29. package/node_modules/better-sqlite3/binding.gyp +38 -0
  30. package/node_modules/better-sqlite3/deps/common.gypi +68 -0
  31. package/node_modules/better-sqlite3/deps/copy.js +31 -0
  32. package/node_modules/better-sqlite3/deps/defines.gypi +41 -0
  33. package/node_modules/better-sqlite3/deps/download.sh +122 -0
  34. package/node_modules/better-sqlite3/deps/patches/1208.patch +15 -0
  35. package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.c +268845 -0
  36. package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.h +14335 -0
  37. package/node_modules/better-sqlite3/deps/sqlite3/sqlite3ext.h +739 -0
  38. package/node_modules/better-sqlite3/deps/sqlite3.gyp +80 -0
  39. package/node_modules/better-sqlite3/deps/test_extension.c +21 -0
  40. package/node_modules/better-sqlite3/lib/database.js +90 -0
  41. package/node_modules/better-sqlite3/lib/index.js +3 -0
  42. package/node_modules/better-sqlite3/lib/methods/aggregate.js +43 -0
  43. package/node_modules/better-sqlite3/lib/methods/backup.js +67 -0
  44. package/node_modules/better-sqlite3/lib/methods/function.js +31 -0
  45. package/node_modules/better-sqlite3/lib/methods/inspect.js +7 -0
  46. package/node_modules/better-sqlite3/lib/methods/pragma.js +12 -0
  47. package/node_modules/better-sqlite3/lib/methods/serialize.js +16 -0
  48. package/node_modules/better-sqlite3/lib/methods/table.js +189 -0
  49. package/node_modules/better-sqlite3/lib/methods/transaction.js +78 -0
  50. package/node_modules/better-sqlite3/lib/methods/wrappers.js +54 -0
  51. package/node_modules/better-sqlite3/lib/sqlite-error.js +20 -0
  52. package/node_modules/better-sqlite3/lib/util.js +12 -0
  53. package/node_modules/better-sqlite3/package.json +59 -0
  54. package/node_modules/better-sqlite3/src/addon.cpp +47 -0
  55. package/node_modules/better-sqlite3/src/better_sqlite3.cpp +74 -0
  56. package/node_modules/better-sqlite3/src/objects/backup.cpp +120 -0
  57. package/node_modules/better-sqlite3/src/objects/backup.hpp +36 -0
  58. package/node_modules/better-sqlite3/src/objects/database.cpp +417 -0
  59. package/node_modules/better-sqlite3/src/objects/database.hpp +103 -0
  60. package/node_modules/better-sqlite3/src/objects/statement-iterator.cpp +113 -0
  61. package/node_modules/better-sqlite3/src/objects/statement-iterator.hpp +50 -0
  62. package/node_modules/better-sqlite3/src/objects/statement.cpp +383 -0
  63. package/node_modules/better-sqlite3/src/objects/statement.hpp +58 -0
  64. package/node_modules/better-sqlite3/src/util/bind-map.cpp +73 -0
  65. package/node_modules/better-sqlite3/src/util/binder.cpp +193 -0
  66. package/node_modules/better-sqlite3/src/util/constants.cpp +172 -0
  67. package/node_modules/better-sqlite3/src/util/custom-aggregate.cpp +121 -0
  68. package/node_modules/better-sqlite3/src/util/custom-function.cpp +59 -0
  69. package/node_modules/better-sqlite3/src/util/custom-table.cpp +409 -0
  70. package/node_modules/better-sqlite3/src/util/data-converter.cpp +17 -0
  71. package/node_modules/better-sqlite3/src/util/data.cpp +194 -0
  72. package/node_modules/better-sqlite3/src/util/helpers.cpp +109 -0
  73. package/node_modules/better-sqlite3/src/util/macros.cpp +83 -0
  74. package/node_modules/better-sqlite3/src/util/query-macros.cpp +71 -0
  75. package/node_modules/better-sqlite3/src/util/row-builder.cpp +49 -0
  76. package/node_modules/bindings/LICENSE.md +22 -0
  77. package/node_modules/bindings/README.md +98 -0
  78. package/node_modules/bindings/bindings.js +221 -0
  79. package/node_modules/bindings/package.json +28 -0
  80. package/node_modules/bl/.travis.yml +17 -0
  81. package/node_modules/bl/BufferList.js +396 -0
  82. package/node_modules/bl/LICENSE.md +13 -0
  83. package/node_modules/bl/README.md +247 -0
  84. package/node_modules/bl/bl.js +84 -0
  85. package/node_modules/bl/package.json +37 -0
  86. package/node_modules/bl/test/convert.js +21 -0
  87. package/node_modules/bl/test/indexOf.js +492 -0
  88. package/node_modules/bl/test/isBufferList.js +32 -0
  89. package/node_modules/bl/test/test.js +869 -0
  90. package/node_modules/buffer/AUTHORS.md +70 -0
  91. package/node_modules/buffer/LICENSE +21 -0
  92. package/node_modules/buffer/README.md +410 -0
  93. package/node_modules/buffer/index.d.ts +186 -0
  94. package/node_modules/buffer/index.js +1817 -0
  95. package/node_modules/buffer/package.json +96 -0
  96. package/node_modules/decompress-response/index.d.ts +22 -0
  97. package/node_modules/decompress-response/index.js +58 -0
  98. package/node_modules/decompress-response/license +9 -0
  99. package/node_modules/decompress-response/node_modules/mimic-response/index.d.ts +17 -0
  100. package/node_modules/decompress-response/node_modules/mimic-response/index.js +77 -0
  101. package/node_modules/decompress-response/node_modules/mimic-response/license +9 -0
  102. package/node_modules/decompress-response/node_modules/mimic-response/package.json +42 -0
  103. package/node_modules/decompress-response/node_modules/mimic-response/readme.md +78 -0
  104. package/node_modules/decompress-response/package.json +56 -0
  105. package/node_modules/decompress-response/readme.md +48 -0
  106. package/node_modules/deep-extend/LICENSE +20 -0
  107. package/node_modules/deep-extend/README.md +91 -0
  108. package/node_modules/deep-extend/index.js +1 -0
  109. package/node_modules/deep-extend/lib/deep-extend.js +150 -0
  110. package/node_modules/deep-extend/package.json +62 -0
  111. package/node_modules/end-of-stream/LICENSE +21 -0
  112. package/node_modules/end-of-stream/README.md +54 -0
  113. package/node_modules/end-of-stream/index.js +96 -0
  114. package/node_modules/end-of-stream/package.json +37 -0
  115. package/node_modules/expand-template/.travis.yml +6 -0
  116. package/node_modules/expand-template/LICENSE +21 -0
  117. package/node_modules/expand-template/README.md +43 -0
  118. package/node_modules/expand-template/index.js +26 -0
  119. package/node_modules/expand-template/package.json +29 -0
  120. package/node_modules/expand-template/test.js +67 -0
  121. package/node_modules/file-uri-to-path/.npmignore +1 -0
  122. package/node_modules/file-uri-to-path/.travis.yml +30 -0
  123. package/node_modules/file-uri-to-path/History.md +21 -0
  124. package/node_modules/file-uri-to-path/LICENSE +20 -0
  125. package/node_modules/file-uri-to-path/README.md +74 -0
  126. package/node_modules/file-uri-to-path/index.d.ts +2 -0
  127. package/node_modules/file-uri-to-path/index.js +66 -0
  128. package/node_modules/file-uri-to-path/package.json +32 -0
  129. package/node_modules/file-uri-to-path/test/test.js +24 -0
  130. package/node_modules/file-uri-to-path/test/tests.json +13 -0
  131. package/node_modules/fs-constants/LICENSE +21 -0
  132. package/node_modules/fs-constants/README.md +26 -0
  133. package/node_modules/fs-constants/browser.js +1 -0
  134. package/node_modules/fs-constants/index.js +1 -0
  135. package/node_modules/fs-constants/package.json +19 -0
  136. package/node_modules/github-from-package/.travis.yml +4 -0
  137. package/node_modules/github-from-package/LICENSE +18 -0
  138. package/node_modules/github-from-package/example/package.json +8 -0
  139. package/node_modules/github-from-package/example/url.js +3 -0
  140. package/node_modules/github-from-package/index.js +17 -0
  141. package/node_modules/github-from-package/package.json +30 -0
  142. package/node_modules/github-from-package/readme.markdown +53 -0
  143. package/node_modules/github-from-package/test/a.json +8 -0
  144. package/node_modules/github-from-package/test/b.json +5 -0
  145. package/node_modules/github-from-package/test/c.json +5 -0
  146. package/node_modules/github-from-package/test/d.json +7 -0
  147. package/node_modules/github-from-package/test/e.json +5 -0
  148. package/node_modules/github-from-package/test/url.js +19 -0
  149. package/node_modules/ieee754/LICENSE +11 -0
  150. package/node_modules/ieee754/README.md +51 -0
  151. package/node_modules/ieee754/index.d.ts +10 -0
  152. package/node_modules/ieee754/index.js +85 -0
  153. package/node_modules/ieee754/package.json +52 -0
  154. package/node_modules/ini/LICENSE +15 -0
  155. package/node_modules/ini/README.md +102 -0
  156. package/node_modules/ini/ini.js +206 -0
  157. package/node_modules/ini/package.json +33 -0
  158. package/node_modules/minimist/.eslintrc +29 -0
  159. package/node_modules/minimist/.github/FUNDING.yml +12 -0
  160. package/node_modules/minimist/.nycrc +14 -0
  161. package/node_modules/minimist/CHANGELOG.md +298 -0
  162. package/node_modules/minimist/LICENSE +18 -0
  163. package/node_modules/minimist/README.md +121 -0
  164. package/node_modules/minimist/example/parse.js +4 -0
  165. package/node_modules/minimist/index.js +263 -0
  166. package/node_modules/minimist/package.json +75 -0
  167. package/node_modules/minimist/test/all_bool.js +34 -0
  168. package/node_modules/minimist/test/bool.js +177 -0
  169. package/node_modules/minimist/test/dash.js +43 -0
  170. package/node_modules/minimist/test/default_bool.js +37 -0
  171. package/node_modules/minimist/test/dotted.js +24 -0
  172. package/node_modules/minimist/test/kv_short.js +32 -0
  173. package/node_modules/minimist/test/long.js +33 -0
  174. package/node_modules/minimist/test/num.js +38 -0
  175. package/node_modules/minimist/test/parse.js +209 -0
  176. package/node_modules/minimist/test/parse_modified.js +11 -0
  177. package/node_modules/minimist/test/proto.js +64 -0
  178. package/node_modules/minimist/test/short.js +69 -0
  179. package/node_modules/minimist/test/stop_early.js +17 -0
  180. package/node_modules/minimist/test/unknown.js +104 -0
  181. package/node_modules/minimist/test/whitespace.js +10 -0
  182. package/node_modules/mkdirp-classic/LICENSE +21 -0
  183. package/node_modules/mkdirp-classic/README.md +18 -0
  184. package/node_modules/mkdirp-classic/index.js +98 -0
  185. package/node_modules/mkdirp-classic/package.json +18 -0
  186. package/node_modules/moe-training/DEPLOY_CENTRAL_COMMAND.md +413 -0
  187. package/node_modules/moe-training/client/consent.js +96 -0
  188. package/node_modules/moe-training/client/envelope-builder.js +56 -0
  189. package/node_modules/moe-training/client/index.js +10 -0
  190. package/node_modules/moe-training/client/parsers/claude-code.js +108 -0
  191. package/node_modules/moe-training/client/parsers/codex.js +80 -0
  192. package/node_modules/moe-training/client/parsers/gemini.js +80 -0
  193. package/node_modules/moe-training/client/parsers/grok.js +16 -0
  194. package/node_modules/moe-training/client/parsers/index.js +20 -0
  195. package/node_modules/moe-training/client/scrubber.js +128 -0
  196. package/node_modules/moe-training/client/session-attestation.js +115 -0
  197. package/node_modules/moe-training/client/step-classifier.js +68 -0
  198. package/node_modules/moe-training/client/trajectory-capture.js +307 -0
  199. package/node_modules/moe-training/client/transmission-queue.js +104 -0
  200. package/node_modules/moe-training/package.json +21 -0
  201. package/node_modules/moe-training/server/enrichment.js +24 -0
  202. package/node_modules/moe-training/server/index.js +119 -0
  203. package/node_modules/moe-training/server/ledger.js +110 -0
  204. package/node_modules/moe-training/server/routes/ingest.js +96 -0
  205. package/node_modules/moe-training/server/routes/sessions.js +43 -0
  206. package/node_modules/moe-training/server/routes/stats.js +31 -0
  207. package/node_modules/moe-training/server/scoring.js +63 -0
  208. package/node_modules/moe-training/server/session-registry.js +156 -0
  209. package/node_modules/moe-training/server/stats.js +129 -0
  210. package/node_modules/moe-training/server/stitcher.js +69 -0
  211. package/node_modules/moe-training/server/storage.js +147 -0
  212. package/node_modules/moe-training/server/verifier.js +102 -0
  213. package/node_modules/moe-training/shared/constants.js +30 -0
  214. package/node_modules/moe-training/shared/crypto.js +45 -0
  215. package/node_modules/moe-training/shared/envelope-schema.js +220 -0
  216. package/node_modules/moe-training/test/client/consent.test.js +121 -0
  217. package/node_modules/moe-training/test/client/envelope-builder.test.js +107 -0
  218. package/node_modules/moe-training/test/client/parsers/claude-code.test.js +119 -0
  219. package/node_modules/moe-training/test/client/parsers/codex.test.js +83 -0
  220. package/node_modules/moe-training/test/client/parsers/gemini.test.js +99 -0
  221. package/node_modules/moe-training/test/client/scrubber.test.js +143 -0
  222. package/node_modules/moe-training/test/client/session-attestation-security.test.js +95 -0
  223. package/node_modules/moe-training/test/client/step-classifier.test.js +135 -0
  224. package/node_modules/moe-training/test/client/transmission-queue.test.js +33 -0
  225. package/node_modules/moe-training/test/integration/handshake.test.js +260 -0
  226. package/node_modules/moe-training/test/server/ingest-security.test.js +166 -0
  227. package/node_modules/moe-training/test/server/ledger.test.js +131 -0
  228. package/node_modules/moe-training/test/server/scoring.test.js +242 -0
  229. package/node_modules/moe-training/test/server/session-registry.test.js +125 -0
  230. package/node_modules/moe-training/test/server/stitcher.test.js +157 -0
  231. package/node_modules/moe-training/test/server/verifier.test.js +232 -0
  232. package/node_modules/moe-training/test/shared/crypto.test.js +87 -0
  233. package/node_modules/moe-training/test/shared/envelope-schema.test.js +351 -0
  234. package/node_modules/napi-build-utils/.github/workflows/run-npm-tests.yml +31 -0
  235. package/node_modules/napi-build-utils/LICENSE +21 -0
  236. package/node_modules/napi-build-utils/README.md +52 -0
  237. package/node_modules/napi-build-utils/index.js +214 -0
  238. package/node_modules/napi-build-utils/index.md +0 -0
  239. package/node_modules/napi-build-utils/package.json +42 -0
  240. package/node_modules/prebuild-install/CHANGELOG.md +131 -0
  241. package/node_modules/prebuild-install/CONTRIBUTING.md +6 -0
  242. package/node_modules/prebuild-install/LICENSE +21 -0
  243. package/node_modules/prebuild-install/README.md +163 -0
  244. package/node_modules/prebuild-install/asset.js +44 -0
  245. package/node_modules/prebuild-install/bin.js +78 -0
  246. package/node_modules/prebuild-install/download.js +142 -0
  247. package/node_modules/prebuild-install/error.js +14 -0
  248. package/node_modules/prebuild-install/help.txt +16 -0
  249. package/node_modules/prebuild-install/index.js +1 -0
  250. package/node_modules/prebuild-install/log.js +33 -0
  251. package/node_modules/prebuild-install/node_modules/node-abi/LICENSE +21 -0
  252. package/node_modules/prebuild-install/node_modules/node-abi/README.md +54 -0
  253. package/node_modules/prebuild-install/node_modules/node-abi/abi_registry.json +439 -0
  254. package/node_modules/prebuild-install/node_modules/node-abi/index.js +179 -0
  255. package/node_modules/prebuild-install/node_modules/node-abi/package.json +45 -0
  256. package/node_modules/prebuild-install/node_modules/semver/LICENSE +15 -0
  257. package/node_modules/prebuild-install/node_modules/semver/README.md +665 -0
  258. package/node_modules/prebuild-install/node_modules/semver/bin/semver.js +191 -0
  259. package/node_modules/prebuild-install/node_modules/semver/classes/comparator.js +143 -0
  260. package/node_modules/prebuild-install/node_modules/semver/classes/index.js +7 -0
  261. package/node_modules/prebuild-install/node_modules/semver/classes/range.js +557 -0
  262. package/node_modules/prebuild-install/node_modules/semver/classes/semver.js +333 -0
  263. package/node_modules/prebuild-install/node_modules/semver/functions/clean.js +8 -0
  264. package/node_modules/prebuild-install/node_modules/semver/functions/cmp.js +54 -0
  265. package/node_modules/prebuild-install/node_modules/semver/functions/coerce.js +62 -0
  266. package/node_modules/prebuild-install/node_modules/semver/functions/compare-build.js +9 -0
  267. package/node_modules/prebuild-install/node_modules/semver/functions/compare-loose.js +5 -0
  268. package/node_modules/prebuild-install/node_modules/semver/functions/compare.js +7 -0
  269. package/node_modules/prebuild-install/node_modules/semver/functions/diff.js +60 -0
  270. package/node_modules/prebuild-install/node_modules/semver/functions/eq.js +5 -0
  271. package/node_modules/prebuild-install/node_modules/semver/functions/gt.js +5 -0
  272. package/node_modules/prebuild-install/node_modules/semver/functions/gte.js +5 -0
  273. package/node_modules/prebuild-install/node_modules/semver/functions/inc.js +21 -0
  274. package/node_modules/prebuild-install/node_modules/semver/functions/lt.js +5 -0
  275. package/node_modules/prebuild-install/node_modules/semver/functions/lte.js +5 -0
  276. package/node_modules/prebuild-install/node_modules/semver/functions/major.js +5 -0
  277. package/node_modules/prebuild-install/node_modules/semver/functions/minor.js +5 -0
  278. package/node_modules/prebuild-install/node_modules/semver/functions/neq.js +5 -0
  279. package/node_modules/prebuild-install/node_modules/semver/functions/parse.js +18 -0
  280. package/node_modules/prebuild-install/node_modules/semver/functions/patch.js +5 -0
  281. package/node_modules/prebuild-install/node_modules/semver/functions/prerelease.js +8 -0
  282. package/node_modules/prebuild-install/node_modules/semver/functions/rcompare.js +5 -0
  283. package/node_modules/prebuild-install/node_modules/semver/functions/rsort.js +5 -0
  284. package/node_modules/prebuild-install/node_modules/semver/functions/satisfies.js +12 -0
  285. package/node_modules/prebuild-install/node_modules/semver/functions/sort.js +5 -0
  286. package/node_modules/prebuild-install/node_modules/semver/functions/valid.js +8 -0
  287. package/node_modules/prebuild-install/node_modules/semver/index.js +91 -0
  288. package/node_modules/prebuild-install/node_modules/semver/internal/constants.js +37 -0
  289. package/node_modules/prebuild-install/node_modules/semver/internal/debug.js +11 -0
  290. package/node_modules/prebuild-install/node_modules/semver/internal/identifiers.js +29 -0
  291. package/node_modules/prebuild-install/node_modules/semver/internal/lrucache.js +42 -0
  292. package/node_modules/prebuild-install/node_modules/semver/internal/parse-options.js +17 -0
  293. package/node_modules/prebuild-install/node_modules/semver/internal/re.js +223 -0
  294. package/node_modules/prebuild-install/node_modules/semver/package.json +78 -0
  295. package/node_modules/prebuild-install/node_modules/semver/preload.js +4 -0
  296. package/node_modules/prebuild-install/node_modules/semver/range.bnf +16 -0
  297. package/node_modules/prebuild-install/node_modules/semver/ranges/gtr.js +6 -0
  298. package/node_modules/prebuild-install/node_modules/semver/ranges/intersects.js +9 -0
  299. package/node_modules/prebuild-install/node_modules/semver/ranges/ltr.js +6 -0
  300. package/node_modules/prebuild-install/node_modules/semver/ranges/max-satisfying.js +27 -0
  301. package/node_modules/prebuild-install/node_modules/semver/ranges/min-satisfying.js +26 -0
  302. package/node_modules/prebuild-install/node_modules/semver/ranges/min-version.js +63 -0
  303. package/node_modules/prebuild-install/node_modules/semver/ranges/outside.js +82 -0
  304. package/node_modules/prebuild-install/node_modules/semver/ranges/simplify.js +49 -0
  305. package/node_modules/prebuild-install/node_modules/semver/ranges/subset.js +249 -0
  306. package/node_modules/prebuild-install/node_modules/semver/ranges/to-comparators.js +10 -0
  307. package/node_modules/prebuild-install/node_modules/semver/ranges/valid.js +13 -0
  308. package/node_modules/prebuild-install/package.json +67 -0
  309. package/node_modules/prebuild-install/proxy.js +35 -0
  310. package/node_modules/prebuild-install/rc.js +64 -0
  311. package/node_modules/prebuild-install/util.js +143 -0
  312. package/node_modules/pump/.github/FUNDING.yml +2 -0
  313. package/node_modules/pump/.travis.yml +5 -0
  314. package/node_modules/pump/LICENSE +21 -0
  315. package/node_modules/pump/README.md +74 -0
  316. package/node_modules/pump/SECURITY.md +5 -0
  317. package/node_modules/pump/empty.js +1 -0
  318. package/node_modules/pump/index.js +86 -0
  319. package/node_modules/pump/package.json +30 -0
  320. package/node_modules/pump/test-browser.js +66 -0
  321. package/node_modules/pump/test-node.js +53 -0
  322. package/node_modules/rc/LICENSE.APACHE2 +15 -0
  323. package/node_modules/rc/LICENSE.BSD +26 -0
  324. package/node_modules/rc/LICENSE.MIT +24 -0
  325. package/node_modules/rc/README.md +227 -0
  326. package/node_modules/rc/browser.js +7 -0
  327. package/node_modules/rc/cli.js +4 -0
  328. package/node_modules/rc/index.js +53 -0
  329. package/node_modules/rc/lib/utils.js +104 -0
  330. package/node_modules/rc/package.json +29 -0
  331. package/node_modules/rc/test/ini.js +16 -0
  332. package/node_modules/rc/test/nested-env-vars.js +50 -0
  333. package/node_modules/rc/test/test.js +59 -0
  334. package/node_modules/readable-stream/CONTRIBUTING.md +38 -0
  335. package/node_modules/readable-stream/GOVERNANCE.md +136 -0
  336. package/node_modules/readable-stream/LICENSE +47 -0
  337. package/node_modules/readable-stream/README.md +106 -0
  338. package/node_modules/readable-stream/errors-browser.js +127 -0
  339. package/node_modules/readable-stream/errors.js +116 -0
  340. package/node_modules/readable-stream/experimentalWarning.js +17 -0
  341. package/node_modules/readable-stream/lib/_stream_duplex.js +126 -0
  342. package/node_modules/readable-stream/lib/_stream_passthrough.js +37 -0
  343. package/node_modules/readable-stream/lib/_stream_readable.js +1027 -0
  344. package/node_modules/readable-stream/lib/_stream_transform.js +190 -0
  345. package/node_modules/readable-stream/lib/_stream_writable.js +641 -0
  346. package/node_modules/readable-stream/lib/internal/streams/async_iterator.js +180 -0
  347. package/node_modules/readable-stream/lib/internal/streams/buffer_list.js +183 -0
  348. package/node_modules/readable-stream/lib/internal/streams/destroy.js +96 -0
  349. package/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +86 -0
  350. package/node_modules/readable-stream/lib/internal/streams/from-browser.js +3 -0
  351. package/node_modules/readable-stream/lib/internal/streams/from.js +52 -0
  352. package/node_modules/readable-stream/lib/internal/streams/pipeline.js +86 -0
  353. package/node_modules/readable-stream/lib/internal/streams/state.js +22 -0
  354. package/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -0
  355. package/node_modules/readable-stream/lib/internal/streams/stream.js +1 -0
  356. package/node_modules/readable-stream/package.json +68 -0
  357. package/node_modules/readable-stream/readable-browser.js +9 -0
  358. package/node_modules/readable-stream/readable.js +16 -0
  359. package/node_modules/simple-concat/.travis.yml +3 -0
  360. package/node_modules/simple-concat/LICENSE +20 -0
  361. package/node_modules/simple-concat/README.md +44 -0
  362. package/node_modules/simple-concat/index.js +15 -0
  363. package/node_modules/simple-concat/package.json +47 -0
  364. package/node_modules/simple-concat/test/basic.js +41 -0
  365. package/node_modules/simple-get/.github/dependabot.yml +15 -0
  366. package/node_modules/simple-get/.github/workflows/ci.yml +23 -0
  367. package/node_modules/simple-get/LICENSE +20 -0
  368. package/node_modules/simple-get/README.md +333 -0
  369. package/node_modules/simple-get/index.js +108 -0
  370. package/node_modules/simple-get/package.json +67 -0
  371. package/node_modules/string_decoder/LICENSE +48 -0
  372. package/node_modules/string_decoder/README.md +47 -0
  373. package/node_modules/string_decoder/lib/string_decoder.js +296 -0
  374. package/node_modules/string_decoder/package.json +34 -0
  375. package/node_modules/strip-json-comments/index.js +70 -0
  376. package/node_modules/strip-json-comments/license +21 -0
  377. package/node_modules/strip-json-comments/package.json +42 -0
  378. package/node_modules/strip-json-comments/readme.md +64 -0
  379. package/node_modules/tar-fs/.travis.yml +6 -0
  380. package/node_modules/tar-fs/LICENSE +21 -0
  381. package/node_modules/tar-fs/README.md +165 -0
  382. package/node_modules/tar-fs/index.js +363 -0
  383. package/node_modules/tar-fs/node_modules/chownr/LICENSE +15 -0
  384. package/node_modules/tar-fs/node_modules/chownr/README.md +3 -0
  385. package/node_modules/tar-fs/node_modules/chownr/chownr.js +167 -0
  386. package/node_modules/tar-fs/node_modules/chownr/package.json +29 -0
  387. package/node_modules/tar-fs/package.json +41 -0
  388. package/node_modules/tar-fs/test/fixtures/a/hello.txt +1 -0
  389. package/node_modules/tar-fs/test/fixtures/b/a/test.txt +1 -0
  390. package/node_modules/tar-fs/test/fixtures/d/file1 +0 -0
  391. package/node_modules/tar-fs/test/fixtures/d/file2 +0 -0
  392. package/node_modules/tar-fs/test/fixtures/d/sub-dir/file5 +0 -0
  393. package/node_modules/tar-fs/test/fixtures/d/sub-files/file3 +0 -0
  394. package/node_modules/tar-fs/test/fixtures/d/sub-files/file4 +0 -0
  395. package/node_modules/tar-fs/test/fixtures/e/directory/.ignore +0 -0
  396. package/node_modules/tar-fs/test/fixtures/e/file +0 -0
  397. package/node_modules/tar-fs/test/fixtures/invalid.tar +0 -0
  398. package/node_modules/tar-fs/test/index.js +346 -0
  399. package/node_modules/tar-stream/LICENSE +21 -0
  400. package/node_modules/tar-stream/README.md +168 -0
  401. package/node_modules/tar-stream/extract.js +257 -0
  402. package/node_modules/tar-stream/headers.js +295 -0
  403. package/node_modules/tar-stream/index.js +2 -0
  404. package/node_modules/tar-stream/pack.js +255 -0
  405. package/node_modules/tar-stream/package.json +58 -0
  406. package/node_modules/tar-stream/sandbox.js +11 -0
  407. package/node_modules/tunnel-agent/LICENSE +55 -0
  408. package/node_modules/tunnel-agent/README.md +4 -0
  409. package/node_modules/tunnel-agent/index.js +244 -0
  410. package/node_modules/tunnel-agent/package.json +22 -0
  411. package/node_modules/util-deprecate/History.md +16 -0
  412. package/node_modules/util-deprecate/LICENSE +24 -0
  413. package/node_modules/util-deprecate/README.md +53 -0
  414. package/node_modules/util-deprecate/browser.js +67 -0
  415. package/node_modules/util-deprecate/node.js +6 -0
  416. package/node_modules/util-deprecate/package.json +27 -0
  417. package/node_modules/uuid/CHANGELOG.md +274 -0
  418. package/node_modules/uuid/CONTRIBUTING.md +18 -0
  419. package/node_modules/uuid/LICENSE.md +9 -0
  420. package/node_modules/uuid/README.md +466 -0
  421. package/node_modules/uuid/dist/bin/uuid +2 -0
  422. package/node_modules/uuid/dist/commonjs-browser/index.js +79 -0
  423. package/node_modules/uuid/dist/commonjs-browser/md5.js +223 -0
  424. package/node_modules/uuid/dist/commonjs-browser/native.js +11 -0
  425. package/node_modules/uuid/dist/commonjs-browser/nil.js +8 -0
  426. package/node_modules/uuid/dist/commonjs-browser/parse.js +45 -0
  427. package/node_modules/uuid/dist/commonjs-browser/regex.js +8 -0
  428. package/node_modules/uuid/dist/commonjs-browser/rng.js +25 -0
  429. package/node_modules/uuid/dist/commonjs-browser/sha1.js +104 -0
  430. package/node_modules/uuid/dist/commonjs-browser/stringify.js +44 -0
  431. package/node_modules/uuid/dist/commonjs-browser/v1.js +107 -0
  432. package/node_modules/uuid/dist/commonjs-browser/v3.js +16 -0
  433. package/node_modules/uuid/dist/commonjs-browser/v35.js +80 -0
  434. package/node_modules/uuid/dist/commonjs-browser/v4.js +43 -0
  435. package/node_modules/uuid/dist/commonjs-browser/v5.js +16 -0
  436. package/node_modules/uuid/dist/commonjs-browser/validate.js +17 -0
  437. package/node_modules/uuid/dist/commonjs-browser/version.js +21 -0
  438. package/node_modules/uuid/dist/esm-browser/index.js +9 -0
  439. package/node_modules/uuid/dist/esm-browser/md5.js +215 -0
  440. package/node_modules/uuid/dist/esm-browser/native.js +4 -0
  441. package/node_modules/uuid/dist/esm-browser/nil.js +1 -0
  442. package/node_modules/uuid/dist/esm-browser/parse.js +35 -0
  443. package/node_modules/uuid/dist/esm-browser/regex.js +1 -0
  444. package/node_modules/uuid/dist/esm-browser/rng.js +18 -0
  445. package/node_modules/uuid/dist/esm-browser/sha1.js +96 -0
  446. package/node_modules/uuid/dist/esm-browser/stringify.js +33 -0
  447. package/node_modules/uuid/dist/esm-browser/v1.js +95 -0
  448. package/node_modules/uuid/dist/esm-browser/v3.js +4 -0
  449. package/node_modules/uuid/dist/esm-browser/v35.js +66 -0
  450. package/node_modules/uuid/dist/esm-browser/v4.js +29 -0
  451. package/node_modules/uuid/dist/esm-browser/v5.js +4 -0
  452. package/node_modules/uuid/dist/esm-browser/validate.js +7 -0
  453. package/node_modules/uuid/dist/esm-browser/version.js +11 -0
  454. package/node_modules/uuid/dist/esm-node/index.js +9 -0
  455. package/node_modules/uuid/dist/esm-node/md5.js +13 -0
  456. package/node_modules/uuid/dist/esm-node/native.js +4 -0
  457. package/node_modules/uuid/dist/esm-node/nil.js +1 -0
  458. package/node_modules/uuid/dist/esm-node/parse.js +35 -0
  459. package/node_modules/uuid/dist/esm-node/regex.js +1 -0
  460. package/node_modules/uuid/dist/esm-node/rng.js +12 -0
  461. package/node_modules/uuid/dist/esm-node/sha1.js +13 -0
  462. package/node_modules/uuid/dist/esm-node/stringify.js +33 -0
  463. package/node_modules/uuid/dist/esm-node/v1.js +95 -0
  464. package/node_modules/uuid/dist/esm-node/v3.js +4 -0
  465. package/node_modules/uuid/dist/esm-node/v35.js +66 -0
  466. package/node_modules/uuid/dist/esm-node/v4.js +29 -0
  467. package/node_modules/uuid/dist/esm-node/v5.js +4 -0
  468. package/node_modules/uuid/dist/esm-node/validate.js +7 -0
  469. package/node_modules/uuid/dist/esm-node/version.js +11 -0
  470. package/node_modules/uuid/dist/index.js +79 -0
  471. package/node_modules/uuid/dist/md5-browser.js +223 -0
  472. package/node_modules/uuid/dist/md5.js +23 -0
  473. package/node_modules/uuid/dist/native-browser.js +11 -0
  474. package/node_modules/uuid/dist/native.js +15 -0
  475. package/node_modules/uuid/dist/nil.js +8 -0
  476. package/node_modules/uuid/dist/parse.js +45 -0
  477. package/node_modules/uuid/dist/regex.js +8 -0
  478. package/node_modules/uuid/dist/rng-browser.js +25 -0
  479. package/node_modules/uuid/dist/rng.js +24 -0
  480. package/node_modules/uuid/dist/sha1-browser.js +104 -0
  481. package/node_modules/uuid/dist/sha1.js +23 -0
  482. package/node_modules/uuid/dist/stringify.js +44 -0
  483. package/node_modules/uuid/dist/uuid-bin.js +85 -0
  484. package/node_modules/uuid/dist/v1.js +107 -0
  485. package/node_modules/uuid/dist/v3.js +16 -0
  486. package/node_modules/uuid/dist/v35.js +80 -0
  487. package/node_modules/uuid/dist/v4.js +43 -0
  488. package/node_modules/uuid/dist/v5.js +16 -0
  489. package/node_modules/uuid/dist/validate.js +17 -0
  490. package/node_modules/uuid/dist/version.js +21 -0
  491. package/node_modules/uuid/package.json +135 -0
  492. package/node_modules/uuid/wrapper.mjs +10 -0
  493. package/package.json +5 -3
  494. package/packages/cli/package.json +1 -1
  495. package/packages/daemon/package.json +1 -1
  496. package/packages/daemon/src/api.js +39 -23
  497. package/packages/daemon/src/introducer.js +21 -6
  498. package/packages/daemon/src/process.js +20 -2
  499. package/packages/daemon/src/providers/gemini.js +27 -28
  500. package/packages/gui/dist/assets/{index-VB4_k5Pz.js → index-BgTyFy4f.js} +331 -331
  501. package/packages/gui/dist/assets/{index-Bo6AeNmM.css → index-QADLyUj5.css} +1 -1
  502. package/packages/gui/dist/index.html +2 -2
  503. package/packages/gui/package.json +1 -1
  504. package/packages/gui/src/components/agents/agent-file-tree.jsx +68 -16
  505. package/packages/gui/src/components/agents/agent-panel.jsx +2 -0
  506. package/packages/gui/src/components/agents/code-review.jsx +9 -1
  507. package/packages/gui/src/components/agents/workspace-mode.jsx +2 -2
  508. package/packages/gui/src/components/editor/code-editor.jsx +1 -1
  509. package/packages/gui/src/stores/groove.js +40 -26
  510. package/packages/gui/src/views/agents.jsx +14 -65
  511. package/workspace.png +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@groove-dev/gui",
3
- "version": "0.27.93",
3
+ "version": "0.27.96",
4
4
  "description": "GROOVE GUI — visual agent control plane",
5
5
  "license": "FSL-1.1-Apache-2.0",
6
6
  "type": "module",
@@ -34,8 +34,41 @@ function matchesScope(filePath, scopePatterns) {
34
34
  return false;
35
35
  }
36
36
 
37
+ // ── Inline Input (for new file/folder) ─────────────────
38
+ function InlineInput({ defaultValue = '', placeholder, onSubmit, onCancel, depth = 0 }) {
39
+ const [value, setValue] = useState(defaultValue);
40
+ const inputRef = useRef(null);
41
+
42
+ useEffect(() => {
43
+ inputRef.current?.focus();
44
+ if (defaultValue) inputRef.current?.select();
45
+ }, [defaultValue]);
46
+
47
+ function handleKeyDown(e) {
48
+ if (e.key === 'Enter') {
49
+ const name = value.trim();
50
+ if (name) onSubmit(name);
51
+ }
52
+ if (e.key === 'Escape') onCancel();
53
+ }
54
+
55
+ return (
56
+ <div className="flex items-center py-0.5" style={{ paddingLeft: depth * 16 + 8 }}>
57
+ <input
58
+ ref={inputRef}
59
+ value={value}
60
+ onChange={(e) => setValue(e.target.value)}
61
+ onKeyDown={handleKeyDown}
62
+ onBlur={onCancel}
63
+ placeholder={placeholder}
64
+ className="w-full h-5 px-1.5 text-xs bg-surface-0 border border-accent rounded text-text-0 font-sans focus:outline-none"
65
+ />
66
+ </div>
67
+ );
68
+ }
69
+
37
70
  function TreeEntry({ entry, depth, onOpen, expandedDirs, onToggleDir }) {
38
- const isDir = entry.type === 'directory';
71
+ const isDir = entry.type === 'dir';
39
72
  const isExpanded = expandedDirs.has(entry.path);
40
73
  const fileColor = isDir ? 'text-accent' : getFileColor(entry.name);
41
74
 
@@ -91,6 +124,7 @@ export function AgentFileTree({ agentId }) {
91
124
  const [expandedDirs, setExpandedDirs] = useState(new Set());
92
125
  const [loading, setLoading] = useState(true);
93
126
  const [touchedFiles, setTouchedFiles] = useState([]);
127
+ const [inlineInput, setInlineInput] = useState(null);
94
128
  const fetchedRef = useRef(new Set());
95
129
 
96
130
  useEffect(() => {
@@ -152,7 +186,7 @@ export function AgentFileTree({ agentId }) {
152
186
  for (const dir of dirs) {
153
187
  const entries = await fetchDir(dir);
154
188
  if (entries.length > 0) {
155
- results.push({ name: dir.split('/').pop(), path: dir, type: 'directory', children: entries });
189
+ results.push({ name: dir.split('/').pop(), path: dir, type: 'dir', children: entries });
156
190
  }
157
191
  }
158
192
  if (!cancelled) setTreeData(results);
@@ -178,22 +212,32 @@ export function AgentFileTree({ agentId }) {
178
212
  openFile(path);
179
213
  }
180
214
 
181
- async function handleNewFile() {
182
- const name = prompt('File name:');
183
- if (!name?.trim()) return;
184
- await createFile?.(name.trim());
215
+ function handleNewFile() {
216
+ setInlineInput({
217
+ type: 'file',
218
+ onSubmit: async (name) => {
219
+ setInlineInput(null);
220
+ await createFile?.(name);
221
+ },
222
+ onCancel: () => setInlineInput(null)
223
+ });
185
224
  }
186
225
 
187
- async function handleNewFolder() {
188
- const name = prompt('Folder name:');
189
- if (!name?.trim()) return;
190
- try {
191
- await api.post('/files/mkdir', { path: name.trim() });
192
- addToast('success', `Created ${name.trim()}/`);
193
- handleRefresh();
194
- } catch (err) {
195
- addToast('error', 'Create folder failed', err.message);
196
- }
226
+ function handleNewFolder() {
227
+ setInlineInput({
228
+ type: 'folder',
229
+ onSubmit: async (name) => {
230
+ setInlineInput(null);
231
+ try {
232
+ await api.post('/files/mkdir', { path: name });
233
+ addToast('success', `Created ${name}/`);
234
+ handleRefresh();
235
+ } catch (err) {
236
+ addToast('error', 'Create folder failed', err.message);
237
+ }
238
+ },
239
+ onCancel: () => setInlineInput(null)
240
+ });
197
241
  }
198
242
 
199
243
  function handleRefresh() {
@@ -226,6 +270,14 @@ export function AgentFileTree({ agentId }) {
226
270
  </div>
227
271
  <ScrollArea className="flex-1 min-h-0">
228
272
  <div className="py-2">
273
+ {inlineInput && (
274
+ <InlineInput
275
+ placeholder={inlineInput.type === 'file' ? 'filename.ext' : 'folder-name'}
276
+ onSubmit={inlineInput.onSubmit}
277
+ onCancel={inlineInput.onCancel}
278
+ depth={0}
279
+ />
280
+ )}
229
281
  {touchedFiles.length > 0 && (
230
282
  <div className="mb-3">
231
283
  <div className="flex items-center gap-1.5 px-3 py-1.5 text-2xs font-semibold text-text-3 uppercase tracking-wider">
@@ -80,11 +80,13 @@ function InlineName({ agent }) {
80
80
  export function AgentPanel() {
81
81
  const detailPanel = useGrooveStore((s) => s.detailPanel);
82
82
  const agents = useGrooveStore((s) => s.agents);
83
+ const activeTeamId = useGrooveStore((s) => s.activeTeamId);
83
84
  const [activeTab, setActiveTab] = useState('command');
84
85
 
85
86
  if (detailPanel?.type !== 'agent') return null;
86
87
  const agent = agents.find((a) => a.id === detailPanel.agentId);
87
88
  if (!agent) return null;
89
+ if (activeTeamId && agent.teamId && agent.teamId !== activeTeamId) return null;
88
90
 
89
91
  const isAlive = agent.status === 'running' || agent.status === 'starting';
90
92
  const ctxPct = Math.round((agent.contextUsage || 0) * 100);
@@ -5,7 +5,7 @@ import { cn } from '../../lib/cn';
5
5
  import { ScrollArea } from '../ui/scroll-area';
6
6
  import { Button } from '../ui/button';
7
7
  import { DiffViewer } from './diff-viewer';
8
- import { Check, X, MessageSquare, ChevronLeft, CheckCircle2, XCircle, Send } from 'lucide-react';
8
+ import { Check, X, MessageSquare, ChevronLeft, CheckCircle2, XCircle, Send, Users } from 'lucide-react';
9
9
 
10
10
  export function CodeReview({ agentId }) {
11
11
  const reviewFiles = useGrooveStore((s) => s.workspaceReviewFiles);
@@ -15,6 +15,7 @@ export function CodeReview({ agentId }) {
15
15
  const instructAgent = useGrooveStore((s) => s.instructAgent);
16
16
  const toggleReviewMode = useGrooveStore((s) => s.toggleReviewMode);
17
17
  const openFile = useGrooveStore((s) => s.openFile);
18
+ const setWorkspaceMode = useGrooveStore((s) => s.setWorkspaceMode);
18
19
 
19
20
  const [selectedFile, setSelectedFile] = useState(null);
20
21
  const [commentingPath, setCommentingPath] = useState(null);
@@ -71,12 +72,19 @@ export function CodeReview({ agentId }) {
71
72
  return (
72
73
  <div className="flex flex-col h-full">
73
74
  <div className="flex items-center gap-3 px-4 py-3 bg-surface-1 border-b border-border flex-shrink-0">
75
+ <button onClick={toggleReviewMode} className="p-1 rounded hover:bg-surface-4 text-text-3 hover:text-text-1 cursor-pointer" title="Back to Files">
76
+ <ChevronLeft size={16} />
77
+ </button>
74
78
  <span className="text-sm font-semibold text-text-0 font-sans flex-1">Review Changes</span>
75
79
  <span className="text-xs text-text-3 font-sans">
76
80
  {reviewFiles.length} file{reviewFiles.length !== 1 ? 's' : ''} changed
77
81
  </span>
78
82
  {approved > 0 && <span className="text-xs text-success font-sans">{approved} approved</span>}
79
83
  {rejected > 0 && <span className="text-xs text-danger font-sans">{rejected} rejected</span>}
84
+ <button onClick={() => { toggleReviewMode(); setWorkspaceMode(false); }} className="p-1.5 rounded bg-surface-3 hover:bg-surface-4 text-text-2 hover:text-text-0 cursor-pointer flex items-center gap-1.5" title="Back to Team">
85
+ <Users size={14} />
86
+ <span className="text-xs font-sans">Team</span>
87
+ </button>
80
88
  </div>
81
89
 
82
90
  <ScrollArea className="flex-1">
@@ -227,7 +227,7 @@ export function WorkspaceMode() {
227
227
  </div>
228
228
 
229
229
  {/* Editor Area */}
230
- <div className="flex-1 flex flex-col min-w-0 bg-[#13161b]">
230
+ <div className="flex-1 flex flex-col min-w-0 bg-surface-0">
231
231
  {workspaceReviewMode ? (
232
232
  <CodeReview agentId={agent.id} />
233
233
  ) : (
@@ -266,7 +266,7 @@ export function WorkspaceMode() {
266
266
  )}
267
267
 
268
268
  {!editorActiveFile && (
269
- <div className="w-full h-full flex items-center justify-center text-text-4 font-sans bg-[#13161b]">
269
+ <div className="w-full h-full flex items-center justify-center text-text-4 font-sans bg-surface-0">
270
270
  <div className="text-center space-y-2">
271
271
  <Code2 size={32} className="mx-auto" />
272
272
  <p className="text-sm">Open a file from the tree</p>
@@ -141,5 +141,5 @@ export function CodeEditor({ content, language, onChange, onSave, onCursorChange
141
141
  view.dispatch({ effects: langCompartment.current.reconfigure(langExt()) });
142
142
  }, [language]);
143
143
 
144
- return <div ref={containerRef} className="w-full h-full overflow-hidden bg-[#13161b]" />;
144
+ return <div ref={containerRef} className="w-full h-full overflow-hidden bg-surface-0" />;
145
145
  }
@@ -70,7 +70,6 @@ export const useGrooveStore = create((set, get) => ({
70
70
  teamBuilderRoles: [],
71
71
  teamBuilderSettings: { provider: null, model: null, reasoningEffort: 50, temperature: 0.5 },
72
72
  teamBuilderTask: '',
73
- teamBuilderLaunchMode: 'plan',
74
73
  teamTemplates: { builtIn: [], custom: [] },
75
74
 
76
75
  // ── Navigation ────────────────────────────────────────────
@@ -1201,6 +1200,8 @@ export const useGrooveStore = create((set, get) => ({
1201
1200
  },
1202
1201
  selectAgent(id) {
1203
1202
  const tid = get().activeTeamId;
1203
+ const match = get().agents.find((a) => a.id === id);
1204
+ if (tid && match && match.teamId && match.teamId !== tid) return;
1204
1205
  const panel = { type: 'agent', agentId: id };
1205
1206
  set((s) => ({ detailPanel: panel, teamDetailPanels: { ...s.teamDetailPanels, [tid]: panel } }));
1206
1207
  },
@@ -1522,7 +1523,14 @@ export const useGrooveStore = create((set, get) => ({
1522
1523
  if (get()._delegatingTeamIds.has(teamId)) return;
1523
1524
  set((s) => ({ recommendedTeam: null, _delegatingTeamIds: new Set([...s._delegatingTeamIds, teamId]) }));
1524
1525
  try {
1525
- const result = await api.post('/recommended-team/launch', { teamId });
1526
+ const tlc = get().teamLaunchConfig;
1527
+ const result = await api.post('/recommended-team/launch', {
1528
+ teamId,
1529
+ ...(tlc?.provider && { teamProvider: tlc.provider }),
1530
+ ...(tlc?.model && { teamModel: tlc.model }),
1531
+ ...(tlc?.reasoningEffort != null && { teamReasoningEffort: tlc.reasoningEffort }),
1532
+ ...(tlc?.temperature != null && { teamTemperature: tlc.temperature }),
1533
+ });
1526
1534
  const agents = result.agents || [];
1527
1535
  const failures = result.failed || [];
1528
1536
  const names = agents.map((a) => a.name).join(', ') || '';
@@ -1619,7 +1627,6 @@ export const useGrooveStore = create((set, get) => ({
1619
1627
  teamBuilderRoles: [],
1620
1628
  teamBuilderSettings: { provider: null, model: null, reasoningEffort: 50, temperature: 0.5 },
1621
1629
  teamBuilderTask: '',
1622
- teamBuilderLaunchMode: 'plan',
1623
1630
  });
1624
1631
  },
1625
1632
  addTeamBuilderRole(role) {
@@ -1651,12 +1658,18 @@ export const useGrooveStore = create((set, get) => ({
1651
1658
  set((s) => ({ teamBuilderSettings: { ...s.teamBuilderSettings, ...settings } }));
1652
1659
  },
1653
1660
  setTeamBuilderTask(task) { set({ teamBuilderTask: task }); },
1654
- setTeamBuilderLaunchMode(mode) { set({ teamBuilderLaunchMode: mode }); },
1655
1661
 
1656
1662
  async fetchTeamTemplates() {
1657
1663
  try {
1658
1664
  const data = await api.get('/team-templates');
1659
- set({ teamTemplates: data });
1665
+ const builtIn = [];
1666
+ const custom = [];
1667
+ for (const [key, tmpl] of Object.entries(data || {})) {
1668
+ const entry = { ...tmpl, name: key };
1669
+ if (tmpl.builtIn) builtIn.push(entry);
1670
+ else custom.push(entry);
1671
+ }
1672
+ set({ teamTemplates: { builtIn, custom } });
1660
1673
  } catch { /* endpoint may not exist yet */ }
1661
1674
  },
1662
1675
 
@@ -1686,21 +1699,25 @@ export const useGrooveStore = create((set, get) => ({
1686
1699
  },
1687
1700
 
1688
1701
  async launchTeamBuilder() {
1689
- const { teamBuilderRoles, teamBuilderSettings, teamBuilderTask, teamBuilderLaunchMode, activeTeamId } = get();
1702
+ const { teamBuilderRoles, teamBuilderSettings, teamBuilderTask, activeTeamId } = get();
1690
1703
  if (teamBuilderRoles.length === 0) return;
1704
+ set({ teamLaunchConfig: {
1705
+ provider: teamBuilderSettings.provider || null,
1706
+ model: teamBuilderSettings.model || null,
1707
+ reasoningEffort: teamBuilderSettings.reasoningEffort,
1708
+ temperature: teamBuilderSettings.temperature,
1709
+ }});
1710
+ get().closeTeamBuilder();
1691
1711
  try {
1692
- get().addToast('info', 'Launching team...');
1693
1712
  const body = {
1694
1713
  task: teamBuilderTask,
1695
1714
  roles: teamBuilderRoles,
1696
1715
  settings: teamBuilderSettings,
1697
- launchMode: teamBuilderLaunchMode,
1716
+ launchMode: 'plan-first',
1698
1717
  teamId: activeTeamId,
1699
1718
  };
1700
1719
  const result = await api.post('/team-builder/launch', body);
1701
- const count = result.launched || result.agents?.length || 0;
1702
- get().addToast('success', `Launched ${count} agent${count !== 1 ? 's' : ''}`);
1703
- get().closeTeamBuilder();
1720
+ get().addToast('success', 'Planner spawned team will build automatically');
1704
1721
  return result;
1705
1722
  } catch (err) {
1706
1723
  get().addToast('error', 'Team launch failed', err.message);
@@ -2529,27 +2546,24 @@ export const useGrooveStore = create((set, get) => ({
2529
2546
  });
2530
2547
  },
2531
2548
 
2532
- toggleReviewMode() {
2549
+ async toggleReviewMode() {
2533
2550
  const st = get();
2534
2551
  if (st.workspaceReviewMode) {
2535
2552
  set({ workspaceReviewMode: false, workspaceReviewFiles: [] });
2536
2553
  return;
2537
2554
  }
2538
2555
  const agentId = st.workspaceAgentId;
2539
- const log = st.activityLog[agentId] || [];
2540
- const seen = new Set();
2541
- const files = [];
2542
- for (const entry of log) {
2543
- const t = (entry.text || '').toLowerCase();
2544
- if (!(t.includes('writ') || t.includes('edit') || t.includes('creat'))) continue;
2545
- const match = entry.text.match(/(?:Write|Edit|Create|wrote|editing|writing)\S*\s+(\S+)/i);
2546
- if (!match) continue;
2547
- const path = match[1];
2548
- if (seen.has(path)) continue;
2549
- seen.add(path);
2550
- files.push({ path, status: 'pending', comment: '' });
2551
- }
2552
- set({ workspaceReviewMode: true, workspaceReviewFiles: files });
2556
+ if (!agentId) return;
2557
+ try {
2558
+ const res = await api.get(`/agents/${agentId}/files-touched`);
2559
+ const touched = res.data || [];
2560
+ const files = touched
2561
+ .filter((f) => f.writes > 0)
2562
+ .map((f) => ({ path: f.path, status: 'pending', comment: '' }));
2563
+ set({ workspaceReviewMode: true, workspaceReviewFiles: files });
2564
+ } catch (err) {
2565
+ console.error('Failed to fetch touched files for review:', err);
2566
+ }
2553
2567
  },
2554
2568
 
2555
2569
  approveFile(path) {
@@ -10,7 +10,7 @@ import { RootNode } from '../components/agents/root-node';
10
10
  import { cn } from '../lib/cn';
11
11
  import { Button } from '../components/ui/button';
12
12
  import { Badge } from '../components/ui/badge';
13
- import { Plus, Users, UserPlus, Zap, X, Check, Rocket, Server, Monitor, Code2, TestTube, Shield, Pencil, Copy, Trash2, ChevronDown, ChevronLeft, ChevronRight, FolderOpen, Eye, Settings2, Search, GripVertical, Cloud, FileText, Database, Megaphone, Calculator, UserCheck, Headphones, BarChart3, Pen, Presentation, Globe, MessageCircle, Save, Play, Clock, ListChecks, Layers } from 'lucide-react';
13
+ import { Plus, Users, UserPlus, Zap, X, Check, Rocket, Server, Monitor, Code2, TestTube, Shield, Pencil, Copy, Trash2, ChevronDown, ChevronLeft, ChevronRight, FolderOpen, Eye, Settings2, Search, GripVertical, Cloud, FileText, Database, Megaphone, Calculator, UserCheck, Headphones, BarChart3, Pen, Presentation, Globe, MessageCircle, Save, Layers } from 'lucide-react';
14
14
  import { PreviewWorkspace } from '../components/preview/preview-workspace';
15
15
  import { WorkspaceMode } from '../components/agents/workspace-mode';
16
16
  import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuSeparator } from '../components/ui/context-menu';
@@ -750,7 +750,6 @@ function TeamBuilder() {
750
750
  const roles = useGrooveStore((s) => s.teamBuilderRoles);
751
751
  const settings = useGrooveStore((s) => s.teamBuilderSettings);
752
752
  const task = useGrooveStore((s) => s.teamBuilderTask);
753
- const launchMode = useGrooveStore((s) => s.teamBuilderLaunchMode);
754
753
  const templates = useGrooveStore((s) => s.teamTemplates);
755
754
  const closeTeamBuilder = useGrooveStore((s) => s.closeTeamBuilder);
756
755
  const addRole = useGrooveStore((s) => s.addTeamBuilderRole);
@@ -759,7 +758,6 @@ function TeamBuilder() {
759
758
  const applyTemplate = useGrooveStore((s) => s.applyTemplate);
760
759
  const setSettings = useGrooveStore((s) => s.setTeamBuilderSettings);
761
760
  const setTask = useGrooveStore((s) => s.setTeamBuilderTask);
762
- const setLaunchMode = useGrooveStore((s) => s.setTeamBuilderLaunchMode);
763
761
  const launchTeamBuilder = useGrooveStore((s) => s.launchTeamBuilder);
764
762
  const saveTeamTemplate = useGrooveStore((s) => s.saveTeamTemplate);
765
763
  const fetchTeamTemplates = useGrooveStore((s) => s.fetchTeamTemplates);
@@ -789,8 +787,6 @@ function TeamBuilder() {
789
787
 
790
788
  const selectedProvider = providers.find((p) => p.id === settings.provider);
791
789
  const settingsModels = (selectedProvider?.models || []).filter((m) => m.type !== 'image' && !m.disabled);
792
- const showTemp = PROVIDER_TEMP_SUPPORT.has(settings.provider);
793
-
794
790
  function handleSettingsProviderChange(id) {
795
791
  setSettings({ provider: id });
796
792
  const p = providers.find((x) => x.id === id);
@@ -829,8 +825,8 @@ function TeamBuilder() {
829
825
  {/* Top Bar */}
830
826
  <div className="flex items-center justify-between px-6 py-4 border-b border-border-subtle">
831
827
  <div className="flex items-center gap-3">
832
- <div className="w-8 h-8 rounded-lg bg-purple/15 flex items-center justify-center">
833
- <Users size={16} className="text-purple" />
828
+ <div className="w-8 h-8 rounded-lg bg-info/15 flex items-center justify-center">
829
+ <Users size={16} className="text-info" />
834
830
  </div>
835
831
  <h2 className="text-lg font-bold text-text-0 font-sans">Team Builder</h2>
836
832
  </div>
@@ -1017,16 +1013,6 @@ function TeamBuilder() {
1017
1013
  formatValue={(v) => v.toFixed(2)}
1018
1014
  />
1019
1015
  )}
1020
- <div className="space-y-1">
1021
- <label className="text-2xs text-text-3 font-sans">Custom Prompt</label>
1022
- <textarea
1023
- value={r.prompt || ''}
1024
- onChange={(e) => updateRole(i, { prompt: e.target.value })}
1025
- placeholder="Optional instructions for this agent..."
1026
- rows={2}
1027
- className="w-full px-2.5 py-1.5 text-xs bg-surface-3 border border-border-subtle rounded-md text-text-0 font-sans placeholder:text-text-4 focus:outline-none focus:ring-1 focus:ring-accent resize-none"
1028
- />
1029
- </div>
1030
1016
  </div>
1031
1017
  )}
1032
1018
  </div>
@@ -1040,38 +1026,16 @@ function TeamBuilder() {
1040
1026
  {/* Bottom Bar */}
1041
1027
  <div className="border-t border-border-subtle px-6 py-4">
1042
1028
  <div className="flex gap-4">
1043
- {/* Task + Launch Mode */}
1044
- <div className="flex-1 space-y-3">
1029
+ {/* Task */}
1030
+ <div className="flex-1 space-y-1.5">
1045
1031
  <textarea
1046
1032
  value={task}
1047
1033
  onChange={(e) => setTask(e.target.value)}
1048
- placeholder="Describe what this team should work on..."
1049
- rows={2}
1050
- className="w-full px-3 py-2 text-sm bg-surface-3 border border-border-subtle rounded-lg text-text-0 font-sans placeholder:text-text-4 focus:outline-none focus:ring-1 focus:ring-accent resize-none"
1034
+ placeholder="Describe what you want to build... (optional)"
1035
+ rows={3}
1036
+ className="w-full px-3 py-2 text-sm bg-surface-3 border border-border-subtle rounded-md text-text-0 font-sans placeholder:text-text-4 focus:outline-none focus:ring-1 focus:ring-accent resize-none"
1051
1037
  />
1052
- <div className="flex items-center gap-2">
1053
- <span className="text-2xs text-text-3 font-sans mr-1">Launch Mode:</span>
1054
- {[
1055
- { id: 'direct', label: 'Direct', icon: Play, tip: 'Agents start working immediately' },
1056
- { id: 'plan', label: 'Plan First', icon: ListChecks, tip: 'Planner designs prompts, then team launches' },
1057
- { id: 'await', label: 'Await', icon: Clock, tip: 'Agents spawn idle, await instructions' },
1058
- ].map((m) => (
1059
- <Tooltip key={m.id} content={m.tip}>
1060
- <button
1061
- onClick={() => setLaunchMode(m.id)}
1062
- className={cn(
1063
- 'flex items-center gap-1.5 px-2.5 py-1 rounded-md text-2xs font-semibold font-sans transition-colors cursor-pointer',
1064
- launchMode === m.id
1065
- ? 'bg-accent/15 text-accent border border-accent/30'
1066
- : 'bg-surface-3 text-text-3 border border-border-subtle hover:text-text-1 hover:border-border',
1067
- )}
1068
- >
1069
- <m.icon size={11} />
1070
- {m.label}
1071
- </button>
1072
- </Tooltip>
1073
- ))}
1074
- </div>
1038
+ <p className="text-2xs text-text-4 font-sans italic">Leave empty to spawn agents awaiting instructions</p>
1075
1039
  </div>
1076
1040
 
1077
1041
  {/* Team Settings + Launch */}
@@ -1102,21 +1066,6 @@ function TeamBuilder() {
1102
1066
  </Select>
1103
1067
  </div>
1104
1068
  </div>
1105
- <TuningSlider
1106
- label="Reasoning"
1107
- value={settings.reasoningEffort}
1108
- onChange={(v) => setSettings({ reasoningEffort: v })}
1109
- min={0} max={100} step={1}
1110
- />
1111
- {showTemp && (
1112
- <TuningSlider
1113
- label="Temperature"
1114
- value={settings.temperature}
1115
- onChange={(v) => setSettings({ temperature: v })}
1116
- min={0} max={1} step={0.01}
1117
- formatValue={(v) => v.toFixed(2)}
1118
- />
1119
- )}
1120
1069
  <Button
1121
1070
  variant="primary"
1122
1071
  size="md"
@@ -1125,7 +1074,7 @@ function TeamBuilder() {
1125
1074
  className="w-full gap-2 mt-1"
1126
1075
  >
1127
1076
  <Zap size={14} />
1128
- {launching ? 'Launching...' : `Launch Team (${roles.length})`}
1077
+ {launching ? 'Launching...' : `Plan & Launch (${roles.length})`}
1129
1078
  </Button>
1130
1079
  </div>
1131
1080
  </div>
@@ -1197,10 +1146,10 @@ function EmptyState({ onPlanner, onSpawn, onTeamBuilder }) {
1197
1146
  <div className="grid grid-cols-2 gap-3">
1198
1147
  <button
1199
1148
  onClick={onTeamBuilder}
1200
- className="flex items-center gap-3 p-4 rounded-lg border border-purple/25 bg-gradient-to-r from-purple/6 to-purple/2 hover:from-purple/12 hover:to-purple/5 hover:border-purple/35 transition-all cursor-pointer group text-left"
1149
+ className="flex items-center gap-3 p-4 rounded-lg border border-info/25 bg-gradient-to-r from-info/6 to-info/2 hover:from-info/12 hover:to-info/5 hover:border-info/35 transition-all cursor-pointer group text-left"
1201
1150
  >
1202
- <div className="w-10 h-10 rounded-lg bg-purple/15 flex items-center justify-center group-hover:scale-110 transition-transform flex-shrink-0">
1203
- <UserPlus size={20} className="text-purple" />
1151
+ <div className="w-10 h-10 rounded-lg bg-info/15 flex items-center justify-center group-hover:scale-110 transition-transform flex-shrink-0">
1152
+ <UserPlus size={20} className="text-info" />
1204
1153
  </div>
1205
1154
  <div className="min-w-0">
1206
1155
  <div className="text-sm font-semibold text-text-0 font-sans">Build a Team</div>
@@ -1558,7 +1507,7 @@ export default function AgentsView() {
1558
1507
  className={cn(
1559
1508
  'absolute bottom-4 z-40 flex items-center gap-1.5 h-8 px-4 rounded-md text-xs font-semibold font-sans transition-colors cursor-pointer select-none shadow-lg shadow-black/10',
1560
1509
  previewState.url && previewState.teamId === activeTeamId ? 'right-32' : 'right-4',
1561
- 'bg-purple/15 text-purple hover:bg-purple/25',
1510
+ 'bg-accent/15 text-accent hover:bg-accent/25',
1562
1511
  )}
1563
1512
  >
1564
1513
  <Code2 size={14} /> Workspace
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Jameson Little
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,34 @@
1
+ base64-js
2
+ =========
3
+
4
+ `base64-js` does basic base64 encoding/decoding in pure JS.
5
+
6
+ [![build status](https://secure.travis-ci.org/beatgammit/base64-js.png)](http://travis-ci.org/beatgammit/base64-js)
7
+
8
+ Many browsers already have base64 encoding/decoding functionality, but it is for text data, not all-purpose binary data.
9
+
10
+ Sometimes encoding/decoding binary data in the browser is useful, and that is what this module does.
11
+
12
+ ## install
13
+
14
+ With [npm](https://npmjs.org) do:
15
+
16
+ `npm install base64-js` and `var base64js = require('base64-js')`
17
+
18
+ For use in web browsers do:
19
+
20
+ `<script src="base64js.min.js"></script>`
21
+
22
+ [Get supported base64-js with the Tidelift Subscription](https://tidelift.com/subscription/pkg/npm-base64-js?utm_source=npm-base64-js&utm_medium=referral&utm_campaign=readme)
23
+
24
+ ## methods
25
+
26
+ `base64js` has three exposed functions, `byteLength`, `toByteArray` and `fromByteArray`, which both take a single argument.
27
+
28
+ * `byteLength` - Takes a base64 string and returns length of byte array
29
+ * `toByteArray` - Takes a base64 string and returns a byte array
30
+ * `fromByteArray` - Takes a byte array and returns a base64 string
31
+
32
+ ## license
33
+
34
+ MIT
@@ -0,0 +1 @@
1
+ (function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"==typeof window?"undefined"==typeof global?"undefined"==typeof self?this:self:global:window,b.base64js=a()}})(function(){return function(){function b(d,e,g){function a(j,i){if(!e[j]){if(!d[j]){var f="function"==typeof require&&require;if(!i&&f)return f(j,!0);if(h)return h(j,!0);var c=new Error("Cannot find module '"+j+"'");throw c.code="MODULE_NOT_FOUND",c}var k=e[j]={exports:{}};d[j][0].call(k.exports,function(b){var c=d[j][1][b];return a(c||b)},k,k.exports,b,d,e,g)}return e[j].exports}for(var h="function"==typeof require&&require,c=0;c<g.length;c++)a(g[c]);return a}return b}()({"/":[function(a,b,c){'use strict';function d(a){var b=a.length;if(0<b%4)throw new Error("Invalid string. Length must be a multiple of 4");var c=a.indexOf("=");-1===c&&(c=b);var d=c===b?0:4-c%4;return[c,d]}function e(a,b,c){return 3*(b+c)/4-c}function f(a){var b,c,f=d(a),g=f[0],h=f[1],j=new m(e(a,g,h)),k=0,n=0<h?g-4:g;for(c=0;c<n;c+=4)b=l[a.charCodeAt(c)]<<18|l[a.charCodeAt(c+1)]<<12|l[a.charCodeAt(c+2)]<<6|l[a.charCodeAt(c+3)],j[k++]=255&b>>16,j[k++]=255&b>>8,j[k++]=255&b;return 2===h&&(b=l[a.charCodeAt(c)]<<2|l[a.charCodeAt(c+1)]>>4,j[k++]=255&b),1===h&&(b=l[a.charCodeAt(c)]<<10|l[a.charCodeAt(c+1)]<<4|l[a.charCodeAt(c+2)]>>2,j[k++]=255&b>>8,j[k++]=255&b),j}function g(a){return k[63&a>>18]+k[63&a>>12]+k[63&a>>6]+k[63&a]}function h(a,b,c){for(var d,e=[],f=b;f<c;f+=3)d=(16711680&a[f]<<16)+(65280&a[f+1]<<8)+(255&a[f+2]),e.push(g(d));return e.join("")}function j(a){for(var b,c=a.length,d=c%3,e=[],f=16383,g=0,j=c-d;g<j;g+=f)e.push(h(a,g,g+f>j?j:g+f));return 1===d?(b=a[c-1],e.push(k[b>>2]+k[63&b<<4]+"==")):2===d&&(b=(a[c-2]<<8)+a[c-1],e.push(k[b>>10]+k[63&b>>4]+k[63&b<<2]+"=")),e.join("")}c.byteLength=function(a){var b=d(a),c=b[0],e=b[1];return 3*(c+e)/4-e},c.toByteArray=f,c.fromByteArray=j;for(var k=[],l=[],m="undefined"==typeof Uint8Array?Array:Uint8Array,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,p=n.length;o<p;++o)k[o]=n[o],l[n.charCodeAt(o)]=o;l[45]=62,l[95]=63},{}]},{},[])("/")});
@@ -0,0 +1,3 @@
1
+ export function byteLength(b64: string): number;
2
+ export function toByteArray(b64: string): Uint8Array;
3
+ export function fromByteArray(uint8: Uint8Array): string;