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
package/CLAUDE.md CHANGED
@@ -263,3 +263,10 @@ Audit-driven release. Multi-agent orchestration system with 7 coordination layer
263
263
  - Dashboard: routing donut, cache panel, context health gauges
264
264
  - Monitor/QC agent mode (stay active, loop)
265
265
  - Distribution: demo video, HN launch, Twitter content
266
+
267
+ <!-- GROOVE:START -->
268
+ ## GROOVE Orchestration (auto-injected)
269
+ Active agents: 0
270
+ See AGENTS_REGISTRY.md for full agent state.
271
+ **Memory policy:** GROOVE manages project memory automatically. Do not read or write MEMORY.md or .groove/memory/ files directly.
272
+ <!-- GROOVE:END -->
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # groove
1
+ # Groove OS 🌀
2
2
 
3
- **Orchestrate your AI coding agents. Stop losing context.**
3
+ **Orchestrate your AI coding agents over localhost.**
4
4
 
5
- The open-source orchestration layer for AI coding tools. Spawn teams of agents, coordinate their work, and never lose context with a full GUI dashboard.
5
+ The open-source desktop OS for AI coding tools. Spawn multi-agent teams, eliminate cold-starts via our "Journalist" state-tracker, and manage complex workflows with a beautiful GUI dashboard. Your code never touches a centralized server.
6
6
 
7
7
  [![npm](https://img.shields.io/npm/v/groove-dev)](https://www.npmjs.com/package/groove-dev)
8
8
  [![License](https://img.shields.io/badge/license-FSL--1.1--Apache--2.0-blue)](LICENSE)
@@ -19,6 +19,8 @@ No terminal needed. Download, install, open a project folder.
19
19
 
20
20
  Everything is bundled — daemon, GUI, auto-updates. No Node.js required.
21
21
 
22
+ **Zero Dependencies:** The Groove Desktop App is completely self-contained. You do not need to install Node.js, Python, or manage terminal dependencies. Just download, open, and spawn a team.
23
+
22
24
  ### Developer Install
23
25
 
24
26
  ```bash
@@ -91,8 +93,6 @@ groove auto-detects monorepo workspaces (npm, pnpm, lerna) and lets you spawn ea
91
93
 
92
94
  ## Remote Access
93
95
 
94
- *Included with Groove Pro.*
95
-
96
96
  Run groove on a VPS and manage your agents from anywhere. No ports exposed to the internet. No tokens. No custom auth code. Zero attack surface.
97
97
 
98
98
  ### How It Works
@@ -154,8 +154,6 @@ This is by design. Direct exposure requires custom auth, rate limiting, TLS mana
154
154
 
155
155
  ### Federation
156
156
 
157
- *Included with Groove Pro.*
158
-
159
157
  Pair groove daemons across machines with Ed25519 key exchange. The security layer is built — cross-server agent coordination (typed contracts, federated registry) is coming soon.
160
158
 
161
159
  ```bash
@@ -185,7 +183,7 @@ groove audit # view recent entries
185
183
  groove audit -n 50 # last 50 entries
186
184
  ```
187
185
 
188
- ```
186
+ ```log
189
187
  2:14:32 PM agent.spawn id=a1 role=backend provider=claude-code
190
188
  2:14:35 PM agent.spawn id=a2 role=frontend provider=claude-code
191
189
  2:33:12 PM agent.rotate oldId=a1 newId=a3 role=backend
@@ -217,9 +215,11 @@ Append-only, `0600` permissions, auto-rotates at 5MB. When team auth is added, e
217
215
  | Provider | Auth | Models |
218
216
  |----------|------|--------|
219
217
  | **Claude Code** | Subscription | Opus 4.6, Sonnet 4.6, Haiku 4.5 |
220
- | **Codex** | API Key | o3, o4-mini, GPT-4.1, GPT-4.1 Mini, GPT-4.1 Nano |
221
- | **Gemini CLI** | API Key | 3.1 Pro, 3 Flash, 3.1 Flash Lite, 2.5 Pro, 2.5 Flash |
222
- | **Ollama** | Local | Any |
218
+ | **Codex** | API Key | GPT-5.5, o3, o4-mini |
219
+ | **Gemini CLI** | API Key | 3.1 Pro, 3 Flash, 2.5 Pro, 2.5 Flash |
220
+ | **Grok** | API Key | Grok 4, 4.1 Fast, Code Fast |
221
+ | **Local Models** | Local | Qwen, DeepSeek, Llama, Mistral, Phi, Codestral |
222
+ | **Groove Network** | P2P | Federated inference |
223
223
 
224
224
  groove is a process manager — it spawns actual AI tool binaries. It never proxies API calls, never touches OAuth tokens, never impersonates any client. Your AI tools talk directly to their servers.
225
225
 
@@ -229,46 +229,19 @@ Works in any terminal, any IDE, any OS. Technical and non-technical users alike.
229
229
 
230
230
  Open the dashboard after starting the daemon (local or remote):
231
231
 
232
- - **Agent Tree** — visual node graph with Bezier spline connections, role badges, live status
233
- - **File Editor** — CodeMirror 6 with syntax highlighting, file tree, tabs, media viewer, and embedded terminal
234
- - **Chat** — instruct agents, query without disrupting, continue completed agents, streaming text
235
- - **Command Center** — gauge charts, live telemetry, token savings, model routing, adaptive thresholds
236
- - **Quick Launch** — planner recommends team, one-click to spawn all
237
- - **Skills Store** — app-store marketplace for agent skills with ratings and verification
238
- - **PM Review Log** — full audit trail of AI Project Manager decisions
239
- - **Team Management** — save, load, export, import agent configurations
240
-
241
- ## Plans
242
-
243
- groove's core orchestration is free. Unlimited agents, teams, context rotation, Layer 7 memory, model routing, dashboard, all providers, skills marketplace, and scheduling all ship in the free tier. No agent caps.
244
-
245
- Pro and Team add the infrastructure for users who outgrow a single machine — remote access, federation, and multi-device sync.
246
-
247
- | Feature | Free | Pro | Team |
248
- |---------|:----:|:---:|:----:|
249
- | Unlimited agents | ✓ | ✓ | ✓ |
250
- | Unlimited teams | ✓ | ✓ | ✓ |
251
- | Context rotation (adaptive) | ✓ | ✓ | ✓ |
252
- | Layer 7 memory | ✓ | ✓ | ✓ |
253
- | Journalist (zero cold-start) | ✓ | ✓ | ✓ |
254
- | AI Project Manager | ✓ | ✓ | ✓ |
255
- | Adaptive model routing | ✓ | ✓ | ✓ |
256
- | Dashboard + telemetry | ✓ | ✓ | ✓ |
257
- | All providers (Claude, Codex, Gemini, Ollama) | ✓ | ✓ | ✓ |
258
- | Skills marketplace | ✓ | ✓ | ✓ |
259
- | Quick Launch | ✓ | ✓ | ✓ |
260
- | Workspaces | ✓ | ✓ | ✓ |
261
- | Scheduling | ✓ | ✓ | ✓ |
262
- | Gateways | ✓ | ✓ | ✓ |
263
- | Remote tunnels (SSH / Tailscale) | — | ✓ | ✓ |
264
- | Federation (daemon-to-daemon) | — | ✓ | ✓ |
265
- | Cloud team management | — | — | ✓ |
266
- | Centralized config | — | — | ✓ |
267
- | Seat management | — | — | ✓ |
268
-
269
- - **Free** — one machine, one person, everything works.
270
- - **Pro** — multiple machines, one person, everything connects.
271
- - **Team** — multiple machines, multiple people, everything is managed.
232
+ - **Agent Tree** — React Flow with slim 200px nodes, animated Bezier edges, minimap, welcome onboarding
233
+ - **File Editor** — CodeMirror 6, 7 language modes, file tree, tabs, media viewer, embedded terminal
234
+ - **Chat** — bubble UI with mode pills, streaming text, markdown rendering, continue completed agents
235
+ - **Dashboard** — KPI strip with sparklines, token/cost charts, fleet panel, savings breakdown, per-team burn
236
+ - **Quick Launch** — planner recommends team, one-click spawn all agents
237
+ - **Skills Marketplace** — NFT-style skill cards, category bar, search, ratings, integrations tab
238
+ - **Team Management** — create, rename, delete teams, inherited defaults
239
+ - **Terminal** — xterm.js embedded terminal with resize/fullscreen
240
+ - **Command Palette** — Cmd+K fuzzy search with dynamic agent commands
241
+
242
+ ## Pricing
243
+
244
+ Everything is free and open source. Unlimited agents, teams, context rotation, Layer 7 memory, model routing, dashboard, all providers, federation, remote access, skills marketplace, and scheduling. No tiers, no upgrades, no gates.
272
245
 
273
246
  ## Adaptive Model Routing
274
247
 
@@ -294,7 +267,7 @@ groove routes tasks to the cheapest model that can handle them. Planners get Opu
294
267
  └──────────────────────┬───────────────────────┘
295
268
 
296
269
  ┌──────────────────────▼───────────────────────┐
297
- Claude Code · Codex · Gemini CLI · Ollama
270
+ Claude · Codex · Gemini · Grok · Local · P2P
298
271
  └──────────────────────────────────────────────┘
299
272
  ```
300
273
 
@@ -1,5 +1,6 @@
1
1
  {
2
- "name": "@groove-dev/moe-training",
2
+ "name": "moe-training",
3
+ "private": true,
3
4
  "version": "0.1.0",
4
5
  "type": "module",
5
6
  "description": "MoE TrajectoryCapture client — captures agent session data into structured Trajectory Envelopes",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@groove-dev/cli",
3
- "version": "0.27.93",
3
+ "version": "0.27.96",
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.93",
3
+ "version": "0.27.96",
4
4
  "description": "GROOVE daemon — agent orchestration engine",
5
5
  "license": "FSL-1.1-Apache-2.0",
6
6
  "type": "module",
@@ -3277,20 +3277,26 @@ Keep responses concise. Help them think, don't lecture them about the system the
3277
3277
  .filter((a) => a.role === 'planner' && a.workingDir)
3278
3278
  .sort((a, b) => (b.lastActivity || b.spawnedAt || '').localeCompare(a.lastActivity || a.spawnedAt || ''));
3279
3279
 
3280
- // Check planner workingDirs first — most recently active planner wins
3280
+ const candidates = [];
3281
3281
  for (const planner of planners) {
3282
3282
  const p = resolve(planner.workingDir, '.groove', 'recommended-team.json');
3283
- if (existsSync(p)) return { path: p, teamId: planner.teamId || null, agentId: planner.id || null };
3283
+ if (existsSync(p)) candidates.push({ path: p, teamId: planner.teamId || null, agentId: planner.id || null });
3284
3284
  }
3285
+ const fallback = resolve(daemon.grooveDir, 'recommended-team.json');
3286
+ if (existsSync(fallback) && !candidates.some(c => c.path === fallback)) {
3287
+ candidates.push({ path: fallback, teamId: planners[0]?.teamId || null, agentId: planners[0]?.id || null });
3288
+ }
3289
+ if (candidates.length === 0) return null;
3285
3290
 
3286
- // Fallback to daemon's .groove dir — try to attribute to most recent planner
3287
- const p = resolve(daemon.grooveDir, 'recommended-team.json');
3288
- if (existsSync(p)) {
3289
- const fallbackTeamId = planners[0]?.teamId || null;
3290
- const fallbackAgentId = planners[0]?.id || null;
3291
- return { path: p, teamId: fallbackTeamId, agentId: fallbackAgentId };
3291
+ for (const c of candidates) {
3292
+ try {
3293
+ const data = JSON.parse(readFileSync(c.path, 'utf8'));
3294
+ if (data._meta?.teamId) {
3295
+ return { path: c.path, teamId: data._meta.teamId, agentId: data._meta.agentId || c.agentId };
3296
+ }
3297
+ } catch {}
3292
3298
  }
3293
- return null;
3299
+ return candidates[0];
3294
3300
  }
3295
3301
 
3296
3302
  app.get('/api/recommended-team', (req, res) => {
@@ -3300,6 +3306,7 @@ Keep responses concise. Help them think, don't lecture them about the system the
3300
3306
  }
3301
3307
  try {
3302
3308
  const raw = JSON.parse(readFileSync(found.path, 'utf8'));
3309
+ delete raw._meta;
3303
3310
  // Support both old format (bare array) and new format ({ projectDir, agents })
3304
3311
  if (Array.isArray(raw)) {
3305
3312
  res.json({ exists: true, agents: raw, teamId: found.teamId });
@@ -3322,6 +3329,7 @@ Keep responses concise. Help them think, don't lecture them about the system the
3322
3329
  const planContents = readFileSync(planPath, 'utf8');
3323
3330
  try {
3324
3331
  const raw = JSON.parse(planContents);
3332
+ delete raw._meta;
3325
3333
 
3326
3334
  // Delete immediately after reading to prevent duplicate launches from poll races.
3327
3335
  // If every spawn below fails, we'll restore the plan from planContents so the
@@ -3686,18 +3694,26 @@ Keep responses concise. Help them think, don't lecture them about the system the
3686
3694
  const baseDir = daemon.config?.defaultWorkingDir || daemon.projectDir;
3687
3695
 
3688
3696
  if (mode === 'plan-first') {
3689
- // Spawn a headless planner to generate per-agent prompts, then auto-launch
3697
+ const rolesList = roles.map(r => r.role || r.name || r).join(', ');
3698
+ const providerNote = teamProvider ? ` (provider: ${teamProvider})` : '';
3699
+ let plannerPrompt;
3700
+ if (task) {
3701
+ plannerPrompt = `The user wants these agents: ${rolesList}${providerNote}. Task: ${task}`;
3702
+ } else {
3703
+ plannerPrompt = '';
3704
+ }
3690
3705
  const plannerConfig = validateAgentConfig({
3691
3706
  role: 'planner',
3692
- prompt: task || 'Analyze the codebase and create a plan for the team.',
3707
+ prompt: plannerPrompt,
3693
3708
  provider: teamProvider,
3694
3709
  model: teamModel,
3695
3710
  workingDir: baseDir,
3696
3711
  });
3697
3712
  plannerConfig.teamId = defaultTeamId;
3713
+ plannerConfig.teamBuilderRoles = roles.map(r => ({ role: r.role || r, provider: r.provider || null }));
3698
3714
  const planner = await daemon.processes.spawn(plannerConfig);
3699
3715
  daemon.audit.log('team-builder.plan-first', { plannerId: planner.id, roles: roles.length });
3700
- return res.status(202).json({ mode: 'plan-first', plannerId: planner.id, message: 'Planner spawned — team will launch when plan is ready' });
3716
+ return res.status(202).json({ mode: 'plan-first', plannerId: planner.id, message: 'Planner spawned — waiting for user instructions' });
3701
3717
  }
3702
3718
 
3703
3719
  const spawned = [];
@@ -4149,17 +4165,17 @@ Keep responses concise. Help them think, don't lecture them about the system the
4149
4165
  // --- Federation ---
4150
4166
 
4151
4167
  // Federation status (v1 — includes whitelist, connections, ambassadors)
4152
- app.get('/api/federation', proOnly, (req, res) => {
4168
+ app.get('/api/federation', (req, res) => {
4153
4169
  res.json(daemon.federation.getStatus());
4154
4170
  });
4155
4171
 
4156
4172
  // List peers
4157
- app.get('/api/federation/peers', proOnly, (req, res) => {
4173
+ app.get('/api/federation/peers', (req, res) => {
4158
4174
  res.json(daemon.federation.getPeers());
4159
4175
  });
4160
4176
 
4161
4177
  // Unpair a peer
4162
- app.delete('/api/federation/peers/:id', proOnly, (req, res) => {
4178
+ app.delete('/api/federation/peers/:id', (req, res) => {
4163
4179
  try {
4164
4180
  daemon.federation.unpair(req.params.id);
4165
4181
  res.json({ ok: true });
@@ -4169,7 +4185,7 @@ Keep responses concise. Help them think, don't lecture them about the system the
4169
4185
  });
4170
4186
 
4171
4187
  // Initiate pairing with a remote daemon
4172
- app.post('/api/federation/initiate', proOnly, async (req, res) => {
4188
+ app.post('/api/federation/initiate', async (req, res) => {
4173
4189
  try {
4174
4190
  const { remoteUrl } = req.body;
4175
4191
  if (!remoteUrl || typeof remoteUrl !== 'string') {
@@ -4184,11 +4200,11 @@ Keep responses concise. Help them think, don't lecture them about the system the
4184
4200
 
4185
4201
  // --- Federation v1: Whitelist ---
4186
4202
 
4187
- app.get('/api/federation/whitelist', proOnly, (req, res) => {
4203
+ app.get('/api/federation/whitelist', (req, res) => {
4188
4204
  res.json(daemon.federation.whitelist?.list() || []);
4189
4205
  });
4190
4206
 
4191
- app.post('/api/federation/whitelist', proOnly, (req, res) => {
4207
+ app.post('/api/federation/whitelist', (req, res) => {
4192
4208
  try {
4193
4209
  const { ip, port, name } = req.body;
4194
4210
  if (!ip || typeof ip !== 'string') {
@@ -4202,7 +4218,7 @@ Keep responses concise. Help them think, don't lecture them about the system the
4202
4218
  }
4203
4219
  });
4204
4220
 
4205
- app.delete('/api/federation/whitelist/:ip', proOnly, (req, res) => {
4221
+ app.delete('/api/federation/whitelist/:ip', (req, res) => {
4206
4222
  try {
4207
4223
  daemon.federation.whitelist.remove(req.params.ip);
4208
4224
  daemon.broadcast({ type: 'federation:whitelist', data: daemon.federation.whitelist.list() });
@@ -4240,7 +4256,7 @@ Keep responses concise. Help them think, don't lecture them about the system the
4240
4256
 
4241
4257
  // --- Federation v1: Connections ---
4242
4258
 
4243
- app.get('/api/federation/connections', proOnly, (req, res) => {
4259
+ app.get('/api/federation/connections', (req, res) => {
4244
4260
  res.json(daemon.federation.connections?.getStatus() || []);
4245
4261
  });
4246
4262
 
@@ -4263,13 +4279,13 @@ Keep responses concise. Help them think, don't lecture them about the system the
4263
4279
  }
4264
4280
  });
4265
4281
 
4266
- app.get('/api/federation/pouch/log', proOnly, (req, res) => {
4282
+ app.get('/api/federation/pouch/log', (req, res) => {
4267
4283
  const limit = Math.min(parseInt(req.query.limit, 10) || 50, 200);
4268
4284
  res.json(daemon.federation.ambassadors?.getPouchLog(limit) || []);
4269
4285
  });
4270
4286
 
4271
4287
  // Send a pouch message to a peer (local agents/GUI call this)
4272
- app.post('/api/federation/pouch/send', proOnly, async (req, res) => {
4288
+ app.post('/api/federation/pouch/send', async (req, res) => {
4273
4289
  try {
4274
4290
  const { peerId, contract } = req.body;
4275
4291
  if (!peerId || !contract) {
@@ -4315,7 +4331,7 @@ Keep responses concise. Help them think, don't lecture them about the system the
4315
4331
  }
4316
4332
  });
4317
4333
 
4318
- app.post('/api/federation/contract/send', proOnly, async (req, res) => {
4334
+ app.post('/api/federation/contract/send', async (req, res) => {
4319
4335
  try {
4320
4336
  const { peerId, contract } = req.body;
4321
4337
  if (!peerId || !contract) {
@@ -48,6 +48,17 @@ export class Introducer {
48
48
  }
49
49
  }
50
50
 
51
+ if (newAgent.teamBuilderRoles && newAgent.teamBuilderRoles.length > 0) {
52
+ lines.push('');
53
+ lines.push('## Team Builder Pre-Selection');
54
+ lines.push('');
55
+ const roleDescs = newAgent.teamBuilderRoles.map(r => {
56
+ return r.provider ? `${r.role} (provider: ${r.provider})` : r.role;
57
+ });
58
+ lines.push(`The user selected these roles in the Team Builder UI: ${roleDescs.join(', ')}.`);
59
+ lines.push('When the user gives you a task, create a plan using EXACTLY these roles. Do not redesign the team composition.');
60
+ }
61
+
51
62
  lines.push('');
52
63
 
53
64
  if (others.length === 0) {
@@ -199,12 +210,16 @@ export class Introducer {
199
210
  // CLAUDE.md parity — non-Claude providers don't read CLAUDE.md natively,
200
211
  // so inject its project content (minus the GROOVE section) into introContext
201
212
  if (newAgent.provider && newAgent.provider !== 'claude-code') {
202
- const claudeMdContent = this._loadClaudeMd(newAgent.workingDir);
203
- if (claudeMdContent) {
204
- lines.push('');
205
- lines.push('## Project Context (from CLAUDE.md)');
206
- lines.push('');
207
- lines.push(claudeMdContent);
213
+ if (newAgent.role === 'planner') {
214
+ // Planners don't need full project context — codebase structure is injected separately
215
+ } else {
216
+ const claudeMdContent = this._loadClaudeMd(newAgent.workingDir);
217
+ if (claudeMdContent) {
218
+ lines.push('');
219
+ lines.push('## Project Context (from CLAUDE.md)');
220
+ lines.push('');
221
+ lines.push(claudeMdContent);
222
+ }
208
223
  }
209
224
  }
210
225
 
@@ -315,7 +315,7 @@ function sanitizeFilename(name) {
315
315
 
316
316
  export function wrapWithRoleReminder(role, message) {
317
317
  if (role === 'planner' && !message.startsWith('ROLE REMINDER:')) {
318
- return 'ROLE REMINDER: You are a PLANNING ONLY agent. Do NOT write code, edit files, or use Edit/Write/Bash tools. Route this task to your team by writing .groove/recommended-team.json.\n\nUser message: ' + message;
318
+ return 'ROLE REMINDER: You are a PLANNING ONLY agent. Do NOT write code, edit source files, or run build commands. Your ONLY file write should be .groove/recommended-team.json.\n\nUser message: ' + message;
319
319
  }
320
320
  return message;
321
321
  }
@@ -1336,13 +1336,31 @@ For normal file edits within your scope, proceed without review.
1336
1336
  if (existsSync(targetPath)) return;
1337
1337
 
1338
1338
  const log = readFileSync(logPath, 'utf8');
1339
- const match = log.match(/\{[\s\S]*?"agents"\s*:\s*\[[\s\S]*?\]\s*\}/);
1339
+
1340
+ // Extract text from JSON log events (Codex agent_message, Claude content blocks)
1341
+ const textParts = [];
1342
+ for (const line of log.split('\n')) {
1343
+ try {
1344
+ const evt = JSON.parse(line.trim());
1345
+ if (evt.item?.type === 'agent_message' && evt.item?.text) textParts.push(evt.item.text);
1346
+ if (evt.type === 'assistant' && evt.message?.content) {
1347
+ for (const block of evt.message.content) {
1348
+ if (block.type === 'text') textParts.push(block.text);
1349
+ }
1350
+ }
1351
+ } catch { textParts.push(line); }
1352
+ }
1353
+ const fullText = textParts.join('\n');
1354
+
1355
+ const match = fullText.match(/\{[\s\S]*?"agents"\s*:\s*\[[\s\S]*?\]\s*\}/);
1340
1356
  if (!match) return;
1341
1357
 
1342
1358
  let parsed;
1343
1359
  try { parsed = JSON.parse(match[0]); } catch { return; }
1344
1360
  if (!parsed || !Array.isArray(parsed.agents) || parsed.agents.length === 0) return;
1345
1361
 
1362
+ parsed._meta = { teamId: agent.teamId || null, agentId: agent.id || null };
1363
+
1346
1364
  if (!existsSync(grooveDir)) mkdirSync(grooveDir, { recursive: true });
1347
1365
  writeFileSync(targetPath, JSON.stringify(parsed, null, 2));
1348
1366
  } catch { /* best effort */ }
@@ -147,11 +147,8 @@ export class GeminiProvider extends Provider {
147
147
  }
148
148
 
149
149
  switch (event.type) {
150
- case 'agent_start':
151
- return { type: 'activity', subtype: 'assistant', sessionId: event.streamId, data: [{ type: 'text', text: '' }] };
152
-
153
- case 'session_update':
154
- return null;
150
+ case 'init':
151
+ return { type: 'activity', subtype: 'assistant', sessionId: event.session_id, data: [{ type: 'text', text: '' }] };
155
152
 
156
153
  case 'message': {
157
154
  if (event.role === 'user') return null;
@@ -165,38 +162,39 @@ export class GeminiProvider extends Provider {
165
162
  return { type: 'activity', subtype: 'assistant', data: blocks };
166
163
  }
167
164
 
168
- case 'tool_request': {
169
- const toolName = (event.name || '').includes('shell') || (event.name || '').includes('exec')
170
- ? 'Bash' : event.name || 'Tool';
171
- const input = event.name === 'Bash' || (event.name || '').includes('shell')
172
- ? { command: typeof event.args === 'string' ? event.args : JSON.stringify(event.args || {}) }
173
- : (event.args || {});
165
+ case 'tool_use': {
166
+ const name = event.tool_name || '';
167
+ const toolName = name.includes('shell') || name.includes('exec')
168
+ ? 'Bash' : name || 'Tool';
169
+ const input = toolName === 'Bash'
170
+ ? { command: event.parameters?.command || (typeof event.parameters === 'string' ? event.parameters : JSON.stringify(event.parameters || {})) }
171
+ : (event.parameters || {});
174
172
  return {
175
173
  type: 'activity', subtype: 'assistant',
176
- data: [{ type: 'tool_use', id: event.requestId || 'tool', name: toolName, input }],
174
+ data: [{ type: 'tool_use', id: event.tool_id || 'tool', name: toolName, input }],
177
175
  };
178
176
  }
179
177
 
180
- case 'tool_response': {
181
- const rawContent = event.content;
182
- const contentParts = Array.isArray(rawContent) ? rawContent : (typeof rawContent === 'string' ? [{ text: rawContent }] : rawContent ? [rawContent] : []);
183
- const content = contentParts.map((p) => p.text || '').join('').slice(0, 2000);
184
- const toolName = (event.name || '').includes('shell') || (event.name || '').includes('exec')
185
- ? 'Bash' : event.name || 'Tool';
178
+ case 'tool_result': {
179
+ const content = typeof event.output === 'string' ? event.output.slice(0, 2000) : '';
180
+ const toolId = event.tool_id || '';
181
+ const isShell = toolId.includes('shell') || toolId.includes('exec');
182
+ const toolName = isShell ? 'Bash' : 'Tool';
186
183
  return {
187
184
  type: 'activity', subtype: 'assistant',
188
185
  data: [
189
- { type: 'tool_use', id: event.requestId || 'tool', name: toolName, input: {} },
186
+ { type: 'tool_use', id: toolId || 'tool', name: toolName, input: {} },
190
187
  ...(content ? [{ type: 'text', text: content }] : []),
191
188
  ],
192
189
  };
193
190
  }
194
191
 
195
- case 'usage': {
196
- const inputTokens = event.inputTokens || 0;
197
- const outputTokens = event.outputTokens || 0;
198
- const cachedTokens = event.cachedTokens || 0;
199
- const totalTokens = inputTokens + outputTokens;
192
+ case 'result': {
193
+ const stats = event.stats || {};
194
+ const inputTokens = stats.input_tokens || 0;
195
+ const outputTokens = stats.output_tokens || 0;
196
+ const cachedTokens = stats.cached || 0;
197
+ const totalTokens = stats.total_tokens || (inputTokens + outputTokens);
200
198
 
201
199
  const model = GeminiProvider.models.find((m) => m.id === this._currentModel);
202
200
  const pricing = model?.pricing;
@@ -211,7 +209,8 @@ export class GeminiProvider extends Provider {
211
209
  }
212
210
 
213
211
  return {
214
- type: 'activity', subtype: 'assistant',
212
+ type: 'result',
213
+ subtype: 'assistant',
215
214
  data: [{ type: 'text', text: '' }],
216
215
  tokensUsed: totalTokens,
217
216
  inputTokens,
@@ -220,12 +219,12 @@ export class GeminiProvider extends Provider {
220
219
  contextUsage: inputTokens / maxContext,
221
220
  estimatedCostUsd,
222
221
  costSource: pricing ? 'calculated' : 'estimated',
222
+ cost: estimatedCostUsd,
223
+ duration: stats.duration_ms,
224
+ turns: stats.tool_calls || 0,
223
225
  };
224
226
  }
225
227
 
226
- case 'agent_end':
227
- return { type: 'activity', subtype: 'assistant', data: [{ type: 'text', text: '' }] };
228
-
229
228
  case 'error':
230
229
  return { type: 'activity', subtype: 'assistant', data: [{ type: 'text', text: `Error: ${event.message || 'unknown'}` }] };
231
230