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
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "mkdirp-classic",
3
+ "version": "0.5.3",
4
+ "description": "Mirror of mkdirp 0.5.2",
5
+ "main": "index.js",
6
+ "dependencies": {},
7
+ "devDependencies": {},
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/mafintosh/mkdirp-classic.git"
11
+ },
12
+ "author": "Mathias Buus (@mafintosh)",
13
+ "license": "MIT",
14
+ "bugs": {
15
+ "url": "https://github.com/mafintosh/mkdirp-classic/issues"
16
+ },
17
+ "homepage": "https://github.com/mafintosh/mkdirp-classic"
18
+ }
@@ -0,0 +1,413 @@
1
+ # Central Command — AWS Deployment Guide
2
+
3
+ Build guide for deploying the MoE Training Data ingest server on the groovedev.ai AWS instance.
4
+
5
+ Last updated: 2026-04-23
6
+
7
+ ---
8
+
9
+ ## 1. What This Server Does
10
+
11
+ Central Command receives Trajectory Envelopes from Groove desktop clients that have opted into training data sharing. It verifies cryptographic attestation (ECDH + HMAC), stores verified envelopes, stitches multi-chunk sessions, scores trajectories using a multiplier matrix, and credits contributors with points.
12
+
13
+ All source code is in: `moe-training/server/`
14
+ Shared utilities: `moe-training/shared/`
15
+
16
+ ---
17
+
18
+ ## 2. System Requirements
19
+
20
+ - Node.js 20+ LTS (ES modules, native fetch)
21
+ - build-essential + python3 (for compiling better-sqlite3 native bindings)
22
+ - nginx (reverse proxy, SSL termination)
23
+ - certbot (Let's Encrypt SSL for api.groovedev.ai)
24
+ - PM2 (process manager) or systemd
25
+ - 1GB+ RAM, 20GB+ disk (envelopes grow over time)
26
+
27
+ ---
28
+
29
+ ## 3. Environment Variables
30
+
31
+ | Variable | Default | Description |
32
+ |---|---|---|
33
+ | GROOVE_CENTRAL_PORT | 8443 | Port the Express server listens on (behind nginx) |
34
+ | NODE_ENV | production | Set to production for security defaults |
35
+
36
+ The server does NOT need any API keys. It only receives data — it does not call any external APIs. The enrichment pipeline (LLM-as-a-Judge) is currently a stub and will need API keys when activated post-launch.
37
+
38
+ ---
39
+
40
+ ## 4. Directory Structure on Server
41
+
42
+ ```
43
+ /opt/groove-central/
44
+ moe-training/
45
+ package.json
46
+ package-lock.json
47
+ server/ <-- the server code
48
+ shared/ <-- shared crypto/schema/constants
49
+ client/ <-- NOT needed on server, but harmless to include
50
+ data/ <-- created automatically on first run
51
+ sessions.db <-- SQLite: ECDH session state, rate limiting
52
+ ledger.db <-- SQLite: contributor points and balances
53
+ envelopes/ <-- JSONL envelope storage (daily rotation)
54
+ 2026-04-26.jsonl
55
+ 2026-04-27.jsonl
56
+ ```
57
+
58
+ The data/ directory is created automatically by the server components on first request. SQLite databases use WAL mode for crash safety. File permissions: directories 0o700, files 0o600.
59
+
60
+ ---
61
+
62
+ ## 5. Dependencies
63
+
64
+ ```json
65
+ {
66
+ "better-sqlite3": "^11.0.0",
67
+ "uuid": "^9.0.0",
68
+ "express": "^4.18.0"
69
+ }
70
+ ```
71
+
72
+ better-sqlite3 is a native C++ addon — it needs compilation tools:
73
+
74
+ ```bash
75
+ sudo apt update
76
+ sudo apt install -y build-essential python3 git
77
+ ```
78
+
79
+ ---
80
+
81
+ ## 6. Deployment Steps
82
+
83
+ ### 6a. Clone and Install
84
+
85
+ ```bash
86
+ # Clone the repo (or scp the moe-training directory)
87
+ cd /opt/groove-central
88
+ git clone https://github.com/grooveai-dev/groove.git
89
+ cd groove/moe-training
90
+
91
+ # Install dependencies
92
+ npm install --production
93
+ ```
94
+
95
+ ### 6b. Test the Server Locally
96
+
97
+ ```bash
98
+ # Start the server
99
+ GROOVE_CENTRAL_PORT=8443 node server/index.js
100
+
101
+ # In another terminal, verify health
102
+ curl http://localhost:8443/health
103
+ # Expected: {"status":"ok","uptime":...}
104
+
105
+ # Verify session endpoint
106
+ curl -X POST http://localhost:8443/v1/sessions/open \
107
+ -H "Content-Type: application/json" \
108
+ -d '{"session_id":"test-1","public_key":"dGVzdA==","provider":"claude-code","model":"claude-opus-4-6","machine_fingerprint":"test","app_version_hash":"abc","groove_version":"0.27.77"}'
109
+ # Expected: {"server_public_key":"..."}
110
+
111
+ # Verify stats endpoint
112
+ curl http://localhost:8443/v1/stats/summary
113
+ # Expected: {"totalEnvelopes":0,...}
114
+
115
+ # Kill the test server (Ctrl+C)
116
+ ```
117
+
118
+ ### 6c. PM2 Process Manager
119
+
120
+ ```bash
121
+ # Install PM2 globally
122
+ sudo npm install -g pm2
123
+
124
+ # Create ecosystem config
125
+ cat > /opt/groove-central/groove/moe-training/ecosystem.config.cjs << 'EOF'
126
+ module.exports = {
127
+ apps: [{
128
+ name: 'groove-central',
129
+ script: 'server/index.js',
130
+ cwd: '/opt/groove-central/groove/moe-training',
131
+ env: {
132
+ NODE_ENV: 'production',
133
+ GROOVE_CENTRAL_PORT: 8443,
134
+ },
135
+ instances: 1,
136
+ max_memory_restart: '500M',
137
+ log_date_format: 'YYYY-MM-DD HH:mm:ss',
138
+ error_file: '/var/log/groove-central/error.log',
139
+ out_file: '/var/log/groove-central/access.log',
140
+ merge_logs: true,
141
+ }],
142
+ };
143
+ EOF
144
+
145
+ # Create log directory
146
+ sudo mkdir -p /var/log/groove-central
147
+ sudo chown $USER:$USER /var/log/groove-central
148
+
149
+ # Start with PM2
150
+ pm2 start ecosystem.config.cjs
151
+
152
+ # Save PM2 config for auto-restart on reboot
153
+ pm2 save
154
+ pm2 startup
155
+ # (follow the instructions PM2 prints to enable startup hook)
156
+ ```
157
+
158
+ ### 6d. Nginx Reverse Proxy + SSL
159
+
160
+ ```nginx
161
+ # /etc/nginx/sites-available/groove-central
162
+
163
+ server {
164
+ listen 80;
165
+ server_name api.groovedev.ai;
166
+
167
+ # Certbot will add the redirect after SSL is set up
168
+ location / {
169
+ return 301 https://$host$request_uri;
170
+ }
171
+ }
172
+
173
+ server {
174
+ listen 443 ssl http2;
175
+ server_name api.groovedev.ai;
176
+
177
+ # SSL certs (managed by certbot)
178
+ ssl_certificate /etc/letsencrypt/live/api.groovedev.ai/fullchain.pem;
179
+ ssl_certificate_key /etc/letsencrypt/live/api.groovedev.ai/privkey.pem;
180
+ ssl_protocols TLSv1.2 TLSv1.3;
181
+ ssl_ciphers HIGH:!aNULL:!MD5;
182
+
183
+ # Proxy to Node.js server
184
+ location /v1/ {
185
+ proxy_pass http://127.0.0.1:8443;
186
+ proxy_http_version 1.1;
187
+ proxy_set_header Host $host;
188
+ proxy_set_header X-Real-IP $remote_addr;
189
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
190
+ proxy_set_header X-Forwarded-Proto $scheme;
191
+
192
+ # Large envelopes (up to 5MB)
193
+ client_max_body_size 5m;
194
+
195
+ # Timeouts for stitching/scoring on SESSION_CLOSE
196
+ proxy_read_timeout 30s;
197
+ proxy_send_timeout 30s;
198
+ }
199
+
200
+ location /health {
201
+ proxy_pass http://127.0.0.1:8443;
202
+ proxy_http_version 1.1;
203
+ }
204
+
205
+ # Block everything else
206
+ location / {
207
+ return 404;
208
+ }
209
+ }
210
+ ```
211
+
212
+ ```bash
213
+ # Enable the site
214
+ sudo ln -s /etc/nginx/sites-available/groove-central /etc/nginx/sites-enabled/
215
+ sudo nginx -t
216
+ sudo systemctl reload nginx
217
+
218
+ # Get SSL certificate
219
+ sudo certbot --nginx -d api.groovedev.ai
220
+ ```
221
+
222
+ ### 6e. DNS
223
+
224
+ Point api.groovedev.ai to the AWS instance's public IP:
225
+ - Type: A record
226
+ - Name: api
227
+ - Value: <AWS instance public IP>
228
+ - TTL: 300
229
+
230
+ If api.groovedev.ai already points to this instance for other services, add the /v1/ location block to the existing nginx config instead of creating a new server block.
231
+
232
+ ---
233
+
234
+ ## 7. API Endpoints
235
+
236
+ All endpoints are under /v1/ (proxied through nginx).
237
+
238
+ ### Session Management
239
+
240
+ POST /v1/sessions/open
241
+ Body: { session_id, public_key (base64), provider, model, machine_fingerprint, app_version_hash, groove_version }
242
+ Returns: { server_public_key (base64) }
243
+ Errors: 400 (missing fields), 429 (rate limited: 20 sessions/hour per fingerprint)
244
+
245
+ POST /v1/sessions/close
246
+ Body: { session_id }
247
+ Returns: { closed: true }
248
+ Errors: 404 (unknown session)
249
+
250
+ ### Data Ingestion
251
+
252
+ POST /v1/training/ingest
253
+ Body: Full Trajectory Envelope JSON (up to 5MB)
254
+ Returns: { accepted: true, envelope_id }
255
+ Errors: { accepted: false, reason: "..." }
256
+ Special: SESSION_CLOSE envelopes trigger stitching, scoring, and ledger credit
257
+
258
+ ### Statistics
259
+
260
+ GET /v1/stats/summary
261
+ Returns: { totalEnvelopes, totalSteps, totalSessions, activeSessions, uniqueContributors, storageSizeMb, totalPointsAwarded }
262
+
263
+ GET /v1/stats/daily?days=7
264
+ Returns: [{ date, envelopes, steps, sessions, points }, ...]
265
+
266
+ GET /v1/stats/models
267
+ Returns: { "claude-opus-4-6": { sessions, steps, points, percentage }, ... }
268
+
269
+ GET /v1/stats/providers
270
+ Returns: { "claude-code": { sessions, steps, points }, ... }
271
+
272
+ GET /v1/stats/leaderboard?limit=10
273
+ Returns: [{ contributor_id (truncated), total_points, total_sessions }, ...]
274
+
275
+ ### Health
276
+
277
+ GET /health
278
+ Returns: { status: "ok", uptime: seconds }
279
+
280
+ ---
281
+
282
+ ## 8. ECDH Handshake Flow
283
+
284
+ This is how client (Groove daemon) and server authenticate:
285
+
286
+ 1. Client generates ephemeral ECDH keypair (prime256v1 curve)
287
+ 2. Client POSTs public key to /v1/sessions/open
288
+ 3. Server generates its own ECDH keypair, derives shared secret, stores session
289
+ 4. Server returns its public key
290
+ 5. Client derives the same shared secret (ECDH math)
291
+ 6. Every envelope is HMAC-SHA256 signed: HMAC(shared_secret, JSON(envelope) + sequence_number)
292
+ 7. Server verifies HMAC and sequence number on each ingest
293
+ 8. Sequence numbers are monotonically increasing — prevents replay attacks
294
+
295
+ The shared secret NEVER crosses the wire. Both sides derive it independently from the key exchange. An attacker would need the server's ephemeral private key to forge envelopes.
296
+
297
+ ---
298
+
299
+ ## 9. Data Storage
300
+
301
+ ### SQLite Databases
302
+
303
+ sessions.db — Active and closed session records
304
+ Columns: session_id, server_private_key, server_public_key, shared_secret, client_public_key, provider, model, machine_fingerprint, app_version_hash, groove_version, expected_sequence, status, created_at, closed_at
305
+ WAL mode enabled for concurrent reads
306
+
307
+ ledger.db — Contributor points
308
+ Table credits: id, contributor_id, session_id, points, base_points, multiplier_breakdown (JSON), created_at
309
+ Table balances: contributor_id (PK), total_points, total_sessions, last_credit_at, trust_score
310
+ WAL mode enabled
311
+
312
+ ### JSONL Envelope Storage
313
+
314
+ Location: ./data/envelopes/YYYY-MM-DD.jsonl
315
+ One JSON object per line, daily rotation.
316
+ Each line is a complete verified envelope (chunk or SESSION_CLOSE).
317
+
318
+ Storage will grow linearly with usage. Estimate: ~1KB per envelope chunk, 5-10 chunks per session.
319
+ At 100 sessions/day = ~1MB/day. At 10,000 sessions/day = ~100MB/day.
320
+
321
+ ---
322
+
323
+ ## 10. Scoring / Multiplier Matrix
324
+
325
+ When a SESSION_CLOSE envelope arrives, the server stitches all chunks and scores:
326
+
327
+ Base points: 1 per trajectory step
328
+
329
+ Model multiplier (applied to all steps):
330
+ claude-opus-4-6, claude-opus-4-7: 5x
331
+ claude-sonnet-4-6: 3x
332
+ gpt-4.5, o3: 5x
333
+ o4-mini: 2x
334
+ gemini-2.5-pro: 3x
335
+ gemini-2.5-flash: 1.5x
336
+
337
+ Quality multipliers (applied to relevant steps):
338
+ User corrections present: 10x on correction steps
339
+ Coordination events: 5x on coordination steps
340
+ Error recovery arcs: 3x on error+resolution steps
341
+ Heavy task complexity: 2x base
342
+ Session quality >= 80: 1.5x total
343
+
344
+ ---
345
+
346
+ ## 11. Monitoring
347
+
348
+ Check server health:
349
+ curl https://api.groovedev.ai/health
350
+
351
+ Check corpus stats:
352
+ curl https://api.groovedev.ai/v1/stats/summary
353
+
354
+ Check daily growth:
355
+ curl https://api.groovedev.ai/v1/stats/daily?days=7
356
+
357
+ Check active sessions:
358
+ curl https://api.groovedev.ai/v1/stats/summary | jq .activeSessions
359
+
360
+ PM2 monitoring:
361
+ pm2 status
362
+ pm2 logs groove-central
363
+ pm2 monit
364
+
365
+ ---
366
+
367
+ ## 12. Backup Strategy
368
+
369
+ Critical data to back up:
370
+ ./data/sessions.db — session keys (active sessions need this)
371
+ ./data/ledger.db — contributor points (this is money)
372
+ ./data/envelopes/ — raw training data (the product)
373
+
374
+ Recommended: daily cron to rsync data/ to S3 or another volume.
375
+
376
+ ```bash
377
+ # Example cron (add to crontab -e)
378
+ 0 3 * * * aws s3 sync /opt/groove-central/groove/moe-training/data/ s3://groove-training-backup/$(date +\%Y-\%m-\%d)/ --quiet
379
+ ```
380
+
381
+ ---
382
+
383
+ ## 13. Security Notes
384
+
385
+ - The server accepts connections from any origin (CORS: *) because Groove clients connect from user machines worldwide
386
+ - Rate limiting: max 20 sessions per machine fingerprint per hour (prevents session spam)
387
+ - HMAC verification on every envelope prevents forged data
388
+ - Sequence numbers prevent replay attacks
389
+ - SQLite databases contain ECDH private keys — protect with filesystem permissions (0o600)
390
+ - nginx should only expose /v1/ and /health paths — everything else returns 404
391
+ - No authentication on stats endpoints (they show aggregate data only, no PII)
392
+
393
+ ---
394
+
395
+ ## 14. Future Additions (Not in This Build)
396
+
397
+ - Enrichment pipeline: LLM-as-a-Judge for model fingerprinting and cognitive target classification (server/enrichment.js is a stub)
398
+ - S3 migration: move envelope storage from local JSONL to S3 for durability
399
+ - PostgreSQL migration: move from SQLite to PostgreSQL if concurrent write pressure increases
400
+ - Merkle tree: daily hash of ledger for on-chain publication (Base L2)
401
+ - Admin dashboard: web UI for monitoring corpus health, contributor activity, data quality
402
+
403
+ ---
404
+
405
+ ## 15. Quick Reference
406
+
407
+ Start: pm2 start ecosystem.config.cjs
408
+ Stop: pm2 stop groove-central
409
+ Restart: pm2 restart groove-central
410
+ Logs: pm2 logs groove-central
411
+ Status: pm2 status
412
+ Health: curl https://api.groovedev.ai/health
413
+ Stats: curl https://api.groovedev.ai/v1/stats/summary
@@ -0,0 +1,96 @@
1
+ // FSL-1.1-Apache-2.0 — see LICENSE
2
+
3
+ import Database from 'better-sqlite3';
4
+ import { randomUUID } from 'node:crypto';
5
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import { homedir } from 'node:os';
8
+ import { CURRENT_CONSENT_VERSION } from '../shared/constants.js';
9
+
10
+ export class ConsentManager {
11
+ constructor(dbPath) {
12
+ this._dbPath = dbPath || join(homedir(), '.groove', 'consent.db');
13
+ const dir = this._dbPath.replace(/[/\\][^/\\]+$/, '');
14
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
15
+ this._db = new Database(this._dbPath);
16
+ this._db.pragma('journal_mode = WAL');
17
+ this._db.exec(`
18
+ CREATE TABLE IF NOT EXISTS consent_history (
19
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
20
+ user_id TEXT NOT NULL,
21
+ opted_in INTEGER NOT NULL,
22
+ consent_version TEXT NOT NULL,
23
+ metadata TEXT,
24
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
25
+ )
26
+ `);
27
+ }
28
+
29
+ recordConsent(userId, optedIn, consentVersion, metadata) {
30
+ this._db.prepare(
31
+ 'INSERT INTO consent_history (user_id, opted_in, consent_version, metadata) VALUES (?, ?, ?, ?)'
32
+ ).run(userId, optedIn ? 1 : 0, consentVersion, metadata ? JSON.stringify(metadata) : null);
33
+ }
34
+
35
+ isOptedIn(userId) {
36
+ const row = this._db.prepare(
37
+ 'SELECT opted_in, consent_version FROM consent_history WHERE user_id = ? ORDER BY id DESC LIMIT 1'
38
+ ).get(userId);
39
+ if (!row) return false;
40
+ if (row.consent_version !== CURRENT_CONSENT_VERSION) return false;
41
+ return row.opted_in === 1;
42
+ }
43
+
44
+ revokeConsent(userId) {
45
+ this.recordConsent(userId, false, CURRENT_CONSENT_VERSION);
46
+ }
47
+
48
+ getOptedInCount() {
49
+ const row = this._db.prepare(`
50
+ SELECT COUNT(DISTINCT user_id) as cnt FROM consent_history ch1
51
+ WHERE opted_in = 1
52
+ AND consent_version = ?
53
+ AND id = (SELECT MAX(id) FROM consent_history ch2 WHERE ch2.user_id = ch1.user_id)
54
+ `).get(CURRENT_CONSENT_VERSION);
55
+ return row?.cnt || 0;
56
+ }
57
+
58
+ getConsentHistory(userId) {
59
+ const rows = this._db.prepare(
60
+ 'SELECT * FROM consent_history WHERE user_id = ? ORDER BY id ASC'
61
+ ).all(userId);
62
+ return rows.map((r) => ({
63
+ ...r,
64
+ opted_in: r.opted_in === 1,
65
+ metadata: r.metadata ? JSON.parse(r.metadata) : null,
66
+ }));
67
+ }
68
+
69
+ close() {
70
+ this._db.close();
71
+ }
72
+
73
+ static getOrCreateUserId(userIdPath) {
74
+ const filePath = userIdPath || join(homedir(), '.groove', 'user_id');
75
+ const dir = filePath.replace(/[/\\][^/\\]+$/, '');
76
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
77
+ if (existsSync(filePath)) {
78
+ return readFileSync(filePath, 'utf-8').trim();
79
+ }
80
+ const uid = randomUUID().replace(/-/g, '');
81
+ writeFileSync(filePath, uid, { mode: 0o600 });
82
+ return uid;
83
+ }
84
+
85
+ static isCaptureEnabled(userIdPath, dbPath) {
86
+ const filePath = userIdPath || join(homedir(), '.groove', 'user_id');
87
+ if (!existsSync(filePath)) return false;
88
+ const userId = readFileSync(filePath, 'utf-8').trim();
89
+ const manager = new ConsentManager(dbPath);
90
+ try {
91
+ return manager.isOptedIn(userId);
92
+ } finally {
93
+ manager.close();
94
+ }
95
+ }
96
+ }
@@ -0,0 +1,56 @@
1
+ // FSL-1.1-Apache-2.0 — see LICENSE
2
+
3
+ import { randomUUID } from 'node:crypto';
4
+ import { CHUNK_SIZE } from '../shared/constants.js';
5
+
6
+ export class EnvelopeBuilder {
7
+ constructor(sessionId, contributorId, metadata) {
8
+ this._sessionId = sessionId;
9
+ this._contributorId = contributorId;
10
+ this._metadata = metadata;
11
+ this._buffer = [];
12
+ this._chunkSequence = 0;
13
+ }
14
+
15
+ addStep(step) {
16
+ if (step.content && typeof step.content === 'string' && step.content.length > 10_000) {
17
+ step.content = step.content.slice(0, 10_000);
18
+ }
19
+ if (typeof step.token_count === 'number' && step.token_count > 100_000) {
20
+ step.token_count = 100_000;
21
+ }
22
+ this._buffer.push(step);
23
+ if (this._buffer.length >= CHUNK_SIZE) {
24
+ return this._buildEnvelope();
25
+ }
26
+ return null;
27
+ }
28
+
29
+ flush() {
30
+ if (this._buffer.length === 0) return null;
31
+ return this._buildEnvelope();
32
+ }
33
+
34
+ buildSessionClose(outcome) {
35
+ return {
36
+ envelope_id: `env_${randomUUID()}`,
37
+ session_id: this._sessionId,
38
+ type: 'SESSION_CLOSE',
39
+ attestation: { session_hmac: '', sequence: 0, app_version_hash: '' },
40
+ outcome,
41
+ };
42
+ }
43
+
44
+ _buildEnvelope() {
45
+ const envelope = {
46
+ envelope_id: `env_${randomUUID()}`,
47
+ session_id: this._sessionId,
48
+ chunk_sequence: this._chunkSequence++,
49
+ contributor_id: this._contributorId,
50
+ attestation: { session_hmac: '', sequence: 0, app_version_hash: '' },
51
+ metadata: { ...this._metadata },
52
+ trajectory_log: this._buffer.splice(0),
53
+ };
54
+ return envelope;
55
+ }
56
+ }
@@ -0,0 +1,10 @@
1
+ // FSL-1.1-Apache-2.0 — see LICENSE
2
+
3
+ export { TrajectoryCapture } from './trajectory-capture.js';
4
+ export { ConsentManager } from './consent.js';
5
+ export { PIIScrubber } from './scrubber.js';
6
+ export { SessionAttestation } from './session-attestation.js';
7
+ export { TransmissionQueue } from './transmission-queue.js';
8
+ export { EnvelopeBuilder } from './envelope-builder.js';
9
+ export { StepClassifier } from './step-classifier.js';
10
+ export { getParser } from './parsers/index.js';
@@ -0,0 +1,108 @@
1
+ // FSL-1.1-Apache-2.0 — see LICENSE
2
+
3
+ import { OBSERVATION_TRUNCATE_HEAD, OBSERVATION_TRUNCATE_TAIL } from '../../shared/constants.js';
4
+
5
+ function truncateObservation(text) {
6
+ if (!text || typeof text !== 'string') return text;
7
+ const lines = text.split('\n');
8
+ if (lines.length <= OBSERVATION_TRUNCATE_HEAD + OBSERVATION_TRUNCATE_TAIL) return text;
9
+ const head = lines.slice(0, OBSERVATION_TRUNCATE_HEAD);
10
+ const tail = lines.slice(-OBSERVATION_TRUNCATE_TAIL);
11
+ const omitted = lines.length - OBSERVATION_TRUNCATE_HEAD - OBSERVATION_TRUNCATE_TAIL;
12
+ return [...head, `[... ${omitted} lines omitted ...]`, ...tail].join('\n');
13
+ }
14
+
15
+ export class ClaudeCodeParser {
16
+ constructor() {
17
+ this._pendingToolUse = new Map();
18
+ }
19
+
20
+ parseEvent(jsonEvent) {
21
+ if (!jsonEvent || !jsonEvent.type) return null;
22
+
23
+ if (jsonEvent.type === 'assistant') {
24
+ const contentBlocks = jsonEvent.message?.content;
25
+ if (!Array.isArray(contentBlocks)) return null;
26
+
27
+ const results = [];
28
+ for (const block of contentBlocks) {
29
+ if (block.type === 'text') {
30
+ results.push({
31
+ type: 'thought',
32
+ content: block.text || '',
33
+ });
34
+ } else if (block.type === 'tool_use') {
35
+ this._pendingToolUse.set(block.id, block);
36
+ results.push({
37
+ type: 'action',
38
+ tool: block.name,
39
+ arguments: block.input,
40
+ content: `Using ${block.name}`,
41
+ });
42
+ } else if (block.type === 'tool_result') {
43
+ const toolUse = this._pendingToolUse.get(block.tool_use_id);
44
+ if (toolUse) this._pendingToolUse.delete(block.tool_use_id);
45
+
46
+ const resultContent = Array.isArray(block.content)
47
+ ? block.content.map((c) => c.text || '').join('\n')
48
+ : (typeof block.content === 'string' ? block.content : '');
49
+
50
+ if (block.is_error) {
51
+ results.push({ type: 'error', content: resultContent, is_error: true });
52
+ } else {
53
+ results.push({
54
+ type: 'observation',
55
+ content: truncateObservation(resultContent),
56
+ is_error: false,
57
+ });
58
+ }
59
+ }
60
+ }
61
+
62
+ return results.length === 1 ? results[0] : results.length > 1 ? results : null;
63
+ }
64
+
65
+ if (jsonEvent.type === 'result') {
66
+ return {
67
+ type: 'resolution',
68
+ content: typeof jsonEvent.result === 'string' ? jsonEvent.result : JSON.stringify(jsonEvent.result),
69
+ };
70
+ }
71
+
72
+ return null;
73
+ }
74
+
75
+ extractTokens(jsonEvent) {
76
+ if (!jsonEvent) return null;
77
+ if (jsonEvent.type === 'assistant') {
78
+ const usage = jsonEvent.message?.usage;
79
+ if (!usage) return null;
80
+ return {
81
+ input: usage.input_tokens || 0,
82
+ output: usage.output_tokens || 0,
83
+ cacheRead: usage.cache_read_input_tokens || 0,
84
+ cacheCreation: usage.cache_creation_input_tokens || 0,
85
+ };
86
+ }
87
+ if (jsonEvent.type === 'result') {
88
+ return {
89
+ input: jsonEvent.total_input_tokens || 0,
90
+ output: jsonEvent.total_output_tokens || 0,
91
+ cacheRead: 0,
92
+ cacheCreation: 0,
93
+ };
94
+ }
95
+ return null;
96
+ }
97
+
98
+ extractSessionId(jsonEvent) {
99
+ return jsonEvent?.session_id || null;
100
+ }
101
+
102
+ extractModel(jsonEvent) {
103
+ if (jsonEvent?.type === 'assistant') {
104
+ return jsonEvent.message?.model || null;
105
+ }
106
+ return null;
107
+ }
108
+ }