groove-dev 0.27.92 → 0.27.94
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.
- package/moe-training/package.json +2 -1
- package/node_modules/@groove-dev/cli/package.json +1 -1
- package/node_modules/@groove-dev/daemon/package.json +1 -1
- package/node_modules/@groove-dev/daemon/src/api.js +17 -9
- package/node_modules/@groove-dev/daemon/src/process.js +2 -0
- package/node_modules/@groove-dev/gui/dist/assets/{codemirror-BBL3i_JW.js → codemirror-CFF1Lrnz.js} +10 -10
- package/{packages/gui/dist/assets/index-DWv32qyJ.js → node_modules/@groove-dev/gui/dist/assets/index-B3GUKInH.js} +1740 -1740
- package/{packages/gui/dist/assets/index-Bo6AeNmM.css → node_modules/@groove-dev/gui/dist/assets/index-C1k-GuDg.css} +1 -1
- package/node_modules/@groove-dev/gui/dist/index.html +3 -3
- package/node_modules/@groove-dev/gui/package.json +1 -1
- package/node_modules/@groove-dev/gui/src/components/agents/agent-panel.jsx +2 -0
- package/node_modules/@groove-dev/gui/src/components/editor/code-editor.jsx +3 -3
- package/node_modules/@groove-dev/gui/src/stores/groove.js +23 -16
- package/node_modules/@groove-dev/gui/src/views/agents.jsx +44 -113
- package/node_modules/base64-js/LICENSE +21 -0
- package/node_modules/base64-js/README.md +34 -0
- package/node_modules/base64-js/base64js.min.js +1 -0
- package/node_modules/base64-js/index.d.ts +3 -0
- package/node_modules/base64-js/index.js +150 -0
- package/node_modules/base64-js/package.json +47 -0
- package/node_modules/better-sqlite3/LICENSE +21 -0
- package/node_modules/better-sqlite3/README.md +99 -0
- package/node_modules/better-sqlite3/binding.gyp +38 -0
- package/node_modules/better-sqlite3/deps/common.gypi +68 -0
- package/node_modules/better-sqlite3/deps/copy.js +31 -0
- package/node_modules/better-sqlite3/deps/defines.gypi +41 -0
- package/node_modules/better-sqlite3/deps/download.sh +122 -0
- package/node_modules/better-sqlite3/deps/patches/1208.patch +15 -0
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.c +268845 -0
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.h +14335 -0
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3ext.h +739 -0
- package/node_modules/better-sqlite3/deps/sqlite3.gyp +80 -0
- package/node_modules/better-sqlite3/deps/test_extension.c +21 -0
- package/node_modules/better-sqlite3/lib/database.js +90 -0
- package/node_modules/better-sqlite3/lib/index.js +3 -0
- package/node_modules/better-sqlite3/lib/methods/aggregate.js +43 -0
- package/node_modules/better-sqlite3/lib/methods/backup.js +67 -0
- package/node_modules/better-sqlite3/lib/methods/function.js +31 -0
- package/node_modules/better-sqlite3/lib/methods/inspect.js +7 -0
- package/node_modules/better-sqlite3/lib/methods/pragma.js +12 -0
- package/node_modules/better-sqlite3/lib/methods/serialize.js +16 -0
- package/node_modules/better-sqlite3/lib/methods/table.js +189 -0
- package/node_modules/better-sqlite3/lib/methods/transaction.js +78 -0
- package/node_modules/better-sqlite3/lib/methods/wrappers.js +54 -0
- package/node_modules/better-sqlite3/lib/sqlite-error.js +20 -0
- package/node_modules/better-sqlite3/lib/util.js +12 -0
- package/node_modules/better-sqlite3/package.json +59 -0
- package/node_modules/better-sqlite3/src/addon.cpp +47 -0
- package/node_modules/better-sqlite3/src/better_sqlite3.cpp +74 -0
- package/node_modules/better-sqlite3/src/objects/backup.cpp +120 -0
- package/node_modules/better-sqlite3/src/objects/backup.hpp +36 -0
- package/node_modules/better-sqlite3/src/objects/database.cpp +417 -0
- package/node_modules/better-sqlite3/src/objects/database.hpp +103 -0
- package/node_modules/better-sqlite3/src/objects/statement-iterator.cpp +113 -0
- package/node_modules/better-sqlite3/src/objects/statement-iterator.hpp +50 -0
- package/node_modules/better-sqlite3/src/objects/statement.cpp +383 -0
- package/node_modules/better-sqlite3/src/objects/statement.hpp +58 -0
- package/node_modules/better-sqlite3/src/util/bind-map.cpp +73 -0
- package/node_modules/better-sqlite3/src/util/binder.cpp +193 -0
- package/node_modules/better-sqlite3/src/util/constants.cpp +172 -0
- package/node_modules/better-sqlite3/src/util/custom-aggregate.cpp +121 -0
- package/node_modules/better-sqlite3/src/util/custom-function.cpp +59 -0
- package/node_modules/better-sqlite3/src/util/custom-table.cpp +409 -0
- package/node_modules/better-sqlite3/src/util/data-converter.cpp +17 -0
- package/node_modules/better-sqlite3/src/util/data.cpp +194 -0
- package/node_modules/better-sqlite3/src/util/helpers.cpp +109 -0
- package/node_modules/better-sqlite3/src/util/macros.cpp +83 -0
- package/node_modules/better-sqlite3/src/util/query-macros.cpp +71 -0
- package/node_modules/better-sqlite3/src/util/row-builder.cpp +49 -0
- package/node_modules/bindings/LICENSE.md +22 -0
- package/node_modules/bindings/README.md +98 -0
- package/node_modules/bindings/bindings.js +221 -0
- package/node_modules/bindings/package.json +28 -0
- package/node_modules/bl/.travis.yml +17 -0
- package/node_modules/bl/BufferList.js +396 -0
- package/node_modules/bl/LICENSE.md +13 -0
- package/node_modules/bl/README.md +247 -0
- package/node_modules/bl/bl.js +84 -0
- package/node_modules/bl/package.json +37 -0
- package/node_modules/bl/test/convert.js +21 -0
- package/node_modules/bl/test/indexOf.js +492 -0
- package/node_modules/bl/test/isBufferList.js +32 -0
- package/node_modules/bl/test/test.js +869 -0
- package/node_modules/buffer/AUTHORS.md +70 -0
- package/node_modules/buffer/LICENSE +21 -0
- package/node_modules/buffer/README.md +410 -0
- package/node_modules/buffer/index.d.ts +186 -0
- package/node_modules/buffer/index.js +1817 -0
- package/node_modules/buffer/package.json +96 -0
- package/node_modules/decompress-response/index.d.ts +22 -0
- package/node_modules/decompress-response/index.js +58 -0
- package/node_modules/decompress-response/license +9 -0
- package/node_modules/decompress-response/node_modules/mimic-response/index.d.ts +17 -0
- package/node_modules/decompress-response/node_modules/mimic-response/index.js +77 -0
- package/node_modules/decompress-response/node_modules/mimic-response/license +9 -0
- package/node_modules/decompress-response/node_modules/mimic-response/package.json +42 -0
- package/node_modules/decompress-response/node_modules/mimic-response/readme.md +78 -0
- package/node_modules/decompress-response/package.json +56 -0
- package/node_modules/decompress-response/readme.md +48 -0
- package/node_modules/deep-extend/LICENSE +20 -0
- package/node_modules/deep-extend/README.md +91 -0
- package/node_modules/deep-extend/index.js +1 -0
- package/node_modules/deep-extend/lib/deep-extend.js +150 -0
- package/node_modules/deep-extend/package.json +62 -0
- package/node_modules/end-of-stream/LICENSE +21 -0
- package/node_modules/end-of-stream/README.md +54 -0
- package/node_modules/end-of-stream/index.js +96 -0
- package/node_modules/end-of-stream/package.json +37 -0
- package/node_modules/expand-template/.travis.yml +6 -0
- package/node_modules/expand-template/LICENSE +21 -0
- package/node_modules/expand-template/README.md +43 -0
- package/node_modules/expand-template/index.js +26 -0
- package/node_modules/expand-template/package.json +29 -0
- package/node_modules/expand-template/test.js +67 -0
- package/node_modules/file-uri-to-path/.npmignore +1 -0
- package/node_modules/file-uri-to-path/.travis.yml +30 -0
- package/node_modules/file-uri-to-path/History.md +21 -0
- package/node_modules/file-uri-to-path/LICENSE +20 -0
- package/node_modules/file-uri-to-path/README.md +74 -0
- package/node_modules/file-uri-to-path/index.d.ts +2 -0
- package/node_modules/file-uri-to-path/index.js +66 -0
- package/node_modules/file-uri-to-path/package.json +32 -0
- package/node_modules/file-uri-to-path/test/test.js +24 -0
- package/node_modules/file-uri-to-path/test/tests.json +13 -0
- package/node_modules/fs-constants/LICENSE +21 -0
- package/node_modules/fs-constants/README.md +26 -0
- package/node_modules/fs-constants/browser.js +1 -0
- package/node_modules/fs-constants/index.js +1 -0
- package/node_modules/fs-constants/package.json +19 -0
- package/node_modules/github-from-package/.travis.yml +4 -0
- package/node_modules/github-from-package/LICENSE +18 -0
- package/node_modules/github-from-package/example/package.json +8 -0
- package/node_modules/github-from-package/example/url.js +3 -0
- package/node_modules/github-from-package/index.js +17 -0
- package/node_modules/github-from-package/package.json +30 -0
- package/node_modules/github-from-package/readme.markdown +53 -0
- package/node_modules/github-from-package/test/a.json +8 -0
- package/node_modules/github-from-package/test/b.json +5 -0
- package/node_modules/github-from-package/test/c.json +5 -0
- package/node_modules/github-from-package/test/d.json +7 -0
- package/node_modules/github-from-package/test/e.json +5 -0
- package/node_modules/github-from-package/test/url.js +19 -0
- package/node_modules/ieee754/LICENSE +11 -0
- package/node_modules/ieee754/README.md +51 -0
- package/node_modules/ieee754/index.d.ts +10 -0
- package/node_modules/ieee754/index.js +85 -0
- package/node_modules/ieee754/package.json +52 -0
- package/node_modules/ini/LICENSE +15 -0
- package/node_modules/ini/README.md +102 -0
- package/node_modules/ini/ini.js +206 -0
- package/node_modules/ini/package.json +33 -0
- package/node_modules/minimist/.eslintrc +29 -0
- package/node_modules/minimist/.github/FUNDING.yml +12 -0
- package/node_modules/minimist/.nycrc +14 -0
- package/node_modules/minimist/CHANGELOG.md +298 -0
- package/node_modules/minimist/LICENSE +18 -0
- package/node_modules/minimist/README.md +121 -0
- package/node_modules/minimist/example/parse.js +4 -0
- package/node_modules/minimist/index.js +263 -0
- package/node_modules/minimist/package.json +75 -0
- package/node_modules/minimist/test/all_bool.js +34 -0
- package/node_modules/minimist/test/bool.js +177 -0
- package/node_modules/minimist/test/dash.js +43 -0
- package/node_modules/minimist/test/default_bool.js +37 -0
- package/node_modules/minimist/test/dotted.js +24 -0
- package/node_modules/minimist/test/kv_short.js +32 -0
- package/node_modules/minimist/test/long.js +33 -0
- package/node_modules/minimist/test/num.js +38 -0
- package/node_modules/minimist/test/parse.js +209 -0
- package/node_modules/minimist/test/parse_modified.js +11 -0
- package/node_modules/minimist/test/proto.js +64 -0
- package/node_modules/minimist/test/short.js +69 -0
- package/node_modules/minimist/test/stop_early.js +17 -0
- package/node_modules/minimist/test/unknown.js +104 -0
- package/node_modules/minimist/test/whitespace.js +10 -0
- package/node_modules/mkdirp-classic/LICENSE +21 -0
- package/node_modules/mkdirp-classic/README.md +18 -0
- package/node_modules/mkdirp-classic/index.js +98 -0
- package/node_modules/mkdirp-classic/package.json +18 -0
- package/node_modules/moe-training/DEPLOY_CENTRAL_COMMAND.md +413 -0
- package/node_modules/moe-training/client/consent.js +96 -0
- package/node_modules/moe-training/client/envelope-builder.js +56 -0
- package/node_modules/moe-training/client/index.js +10 -0
- package/node_modules/moe-training/client/parsers/claude-code.js +108 -0
- package/node_modules/moe-training/client/parsers/codex.js +80 -0
- package/node_modules/moe-training/client/parsers/gemini.js +80 -0
- package/node_modules/moe-training/client/parsers/grok.js +16 -0
- package/node_modules/moe-training/client/parsers/index.js +20 -0
- package/node_modules/moe-training/client/scrubber.js +128 -0
- package/node_modules/moe-training/client/session-attestation.js +115 -0
- package/node_modules/moe-training/client/step-classifier.js +68 -0
- package/node_modules/moe-training/client/trajectory-capture.js +307 -0
- package/node_modules/moe-training/client/transmission-queue.js +104 -0
- package/node_modules/moe-training/package.json +21 -0
- package/node_modules/moe-training/server/enrichment.js +24 -0
- package/node_modules/moe-training/server/index.js +119 -0
- package/node_modules/moe-training/server/ledger.js +110 -0
- package/node_modules/moe-training/server/routes/ingest.js +96 -0
- package/node_modules/moe-training/server/routes/sessions.js +43 -0
- package/node_modules/moe-training/server/routes/stats.js +31 -0
- package/node_modules/moe-training/server/scoring.js +63 -0
- package/node_modules/moe-training/server/session-registry.js +156 -0
- package/node_modules/moe-training/server/stats.js +129 -0
- package/node_modules/moe-training/server/stitcher.js +69 -0
- package/node_modules/moe-training/server/storage.js +147 -0
- package/node_modules/moe-training/server/verifier.js +102 -0
- package/node_modules/moe-training/shared/constants.js +30 -0
- package/node_modules/moe-training/shared/crypto.js +45 -0
- package/node_modules/moe-training/shared/envelope-schema.js +220 -0
- package/node_modules/moe-training/test/client/consent.test.js +121 -0
- package/node_modules/moe-training/test/client/envelope-builder.test.js +107 -0
- package/node_modules/moe-training/test/client/parsers/claude-code.test.js +119 -0
- package/node_modules/moe-training/test/client/parsers/codex.test.js +83 -0
- package/node_modules/moe-training/test/client/parsers/gemini.test.js +99 -0
- package/node_modules/moe-training/test/client/scrubber.test.js +143 -0
- package/node_modules/moe-training/test/client/session-attestation-security.test.js +95 -0
- package/node_modules/moe-training/test/client/step-classifier.test.js +135 -0
- package/node_modules/moe-training/test/client/transmission-queue.test.js +33 -0
- package/node_modules/moe-training/test/integration/handshake.test.js +260 -0
- package/node_modules/moe-training/test/server/ingest-security.test.js +166 -0
- package/node_modules/moe-training/test/server/ledger.test.js +131 -0
- package/node_modules/moe-training/test/server/scoring.test.js +242 -0
- package/node_modules/moe-training/test/server/session-registry.test.js +125 -0
- package/node_modules/moe-training/test/server/stitcher.test.js +157 -0
- package/node_modules/moe-training/test/server/verifier.test.js +232 -0
- package/node_modules/moe-training/test/shared/crypto.test.js +87 -0
- package/node_modules/moe-training/test/shared/envelope-schema.test.js +351 -0
- package/node_modules/napi-build-utils/.github/workflows/run-npm-tests.yml +31 -0
- package/node_modules/napi-build-utils/LICENSE +21 -0
- package/node_modules/napi-build-utils/README.md +52 -0
- package/node_modules/napi-build-utils/index.js +214 -0
- package/node_modules/napi-build-utils/index.md +0 -0
- package/node_modules/napi-build-utils/package.json +42 -0
- package/node_modules/prebuild-install/CHANGELOG.md +131 -0
- package/node_modules/prebuild-install/CONTRIBUTING.md +6 -0
- package/node_modules/prebuild-install/LICENSE +21 -0
- package/node_modules/prebuild-install/README.md +163 -0
- package/node_modules/prebuild-install/asset.js +44 -0
- package/node_modules/prebuild-install/bin.js +78 -0
- package/node_modules/prebuild-install/download.js +142 -0
- package/node_modules/prebuild-install/error.js +14 -0
- package/node_modules/prebuild-install/help.txt +16 -0
- package/node_modules/prebuild-install/index.js +1 -0
- package/node_modules/prebuild-install/log.js +33 -0
- package/node_modules/prebuild-install/node_modules/node-abi/LICENSE +21 -0
- package/node_modules/prebuild-install/node_modules/node-abi/README.md +54 -0
- package/node_modules/prebuild-install/node_modules/node-abi/abi_registry.json +439 -0
- package/node_modules/prebuild-install/node_modules/node-abi/index.js +179 -0
- package/node_modules/prebuild-install/node_modules/node-abi/package.json +45 -0
- package/node_modules/prebuild-install/node_modules/semver/LICENSE +15 -0
- package/node_modules/prebuild-install/node_modules/semver/README.md +665 -0
- package/node_modules/prebuild-install/node_modules/semver/bin/semver.js +191 -0
- package/node_modules/prebuild-install/node_modules/semver/classes/comparator.js +143 -0
- package/node_modules/prebuild-install/node_modules/semver/classes/index.js +7 -0
- package/node_modules/prebuild-install/node_modules/semver/classes/range.js +557 -0
- package/node_modules/prebuild-install/node_modules/semver/classes/semver.js +333 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/clean.js +8 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/cmp.js +54 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/coerce.js +62 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/compare-build.js +9 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/compare-loose.js +5 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/compare.js +7 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/diff.js +60 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/eq.js +5 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/gt.js +5 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/gte.js +5 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/inc.js +21 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/lt.js +5 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/lte.js +5 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/major.js +5 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/minor.js +5 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/neq.js +5 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/parse.js +18 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/patch.js +5 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/prerelease.js +8 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/rcompare.js +5 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/rsort.js +5 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/satisfies.js +12 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/sort.js +5 -0
- package/node_modules/prebuild-install/node_modules/semver/functions/valid.js +8 -0
- package/node_modules/prebuild-install/node_modules/semver/index.js +91 -0
- package/node_modules/prebuild-install/node_modules/semver/internal/constants.js +37 -0
- package/node_modules/prebuild-install/node_modules/semver/internal/debug.js +11 -0
- package/node_modules/prebuild-install/node_modules/semver/internal/identifiers.js +29 -0
- package/node_modules/prebuild-install/node_modules/semver/internal/lrucache.js +42 -0
- package/node_modules/prebuild-install/node_modules/semver/internal/parse-options.js +17 -0
- package/node_modules/prebuild-install/node_modules/semver/internal/re.js +223 -0
- package/node_modules/prebuild-install/node_modules/semver/package.json +78 -0
- package/node_modules/prebuild-install/node_modules/semver/preload.js +4 -0
- package/node_modules/prebuild-install/node_modules/semver/range.bnf +16 -0
- package/node_modules/prebuild-install/node_modules/semver/ranges/gtr.js +6 -0
- package/node_modules/prebuild-install/node_modules/semver/ranges/intersects.js +9 -0
- package/node_modules/prebuild-install/node_modules/semver/ranges/ltr.js +6 -0
- package/node_modules/prebuild-install/node_modules/semver/ranges/max-satisfying.js +27 -0
- package/node_modules/prebuild-install/node_modules/semver/ranges/min-satisfying.js +26 -0
- package/node_modules/prebuild-install/node_modules/semver/ranges/min-version.js +63 -0
- package/node_modules/prebuild-install/node_modules/semver/ranges/outside.js +82 -0
- package/node_modules/prebuild-install/node_modules/semver/ranges/simplify.js +49 -0
- package/node_modules/prebuild-install/node_modules/semver/ranges/subset.js +249 -0
- package/node_modules/prebuild-install/node_modules/semver/ranges/to-comparators.js +10 -0
- package/node_modules/prebuild-install/node_modules/semver/ranges/valid.js +13 -0
- package/node_modules/prebuild-install/package.json +67 -0
- package/node_modules/prebuild-install/proxy.js +35 -0
- package/node_modules/prebuild-install/rc.js +64 -0
- package/node_modules/prebuild-install/util.js +143 -0
- package/node_modules/pump/.github/FUNDING.yml +2 -0
- package/node_modules/pump/.travis.yml +5 -0
- package/node_modules/pump/LICENSE +21 -0
- package/node_modules/pump/README.md +74 -0
- package/node_modules/pump/SECURITY.md +5 -0
- package/node_modules/pump/empty.js +1 -0
- package/node_modules/pump/index.js +86 -0
- package/node_modules/pump/package.json +30 -0
- package/node_modules/pump/test-browser.js +66 -0
- package/node_modules/pump/test-node.js +53 -0
- package/node_modules/rc/LICENSE.APACHE2 +15 -0
- package/node_modules/rc/LICENSE.BSD +26 -0
- package/node_modules/rc/LICENSE.MIT +24 -0
- package/node_modules/rc/README.md +227 -0
- package/node_modules/rc/browser.js +7 -0
- package/node_modules/rc/cli.js +4 -0
- package/node_modules/rc/index.js +53 -0
- package/node_modules/rc/lib/utils.js +104 -0
- package/node_modules/rc/package.json +29 -0
- package/node_modules/rc/test/ini.js +16 -0
- package/node_modules/rc/test/nested-env-vars.js +50 -0
- package/node_modules/rc/test/test.js +59 -0
- package/node_modules/readable-stream/CONTRIBUTING.md +38 -0
- package/node_modules/readable-stream/GOVERNANCE.md +136 -0
- package/node_modules/readable-stream/LICENSE +47 -0
- package/node_modules/readable-stream/README.md +106 -0
- package/node_modules/readable-stream/errors-browser.js +127 -0
- package/node_modules/readable-stream/errors.js +116 -0
- package/node_modules/readable-stream/experimentalWarning.js +17 -0
- package/node_modules/readable-stream/lib/_stream_duplex.js +126 -0
- package/node_modules/readable-stream/lib/_stream_passthrough.js +37 -0
- package/node_modules/readable-stream/lib/_stream_readable.js +1027 -0
- package/node_modules/readable-stream/lib/_stream_transform.js +190 -0
- package/node_modules/readable-stream/lib/_stream_writable.js +641 -0
- package/node_modules/readable-stream/lib/internal/streams/async_iterator.js +180 -0
- package/node_modules/readable-stream/lib/internal/streams/buffer_list.js +183 -0
- package/node_modules/readable-stream/lib/internal/streams/destroy.js +96 -0
- package/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +86 -0
- package/node_modules/readable-stream/lib/internal/streams/from-browser.js +3 -0
- package/node_modules/readable-stream/lib/internal/streams/from.js +52 -0
- package/node_modules/readable-stream/lib/internal/streams/pipeline.js +86 -0
- package/node_modules/readable-stream/lib/internal/streams/state.js +22 -0
- package/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -0
- package/node_modules/readable-stream/lib/internal/streams/stream.js +1 -0
- package/node_modules/readable-stream/package.json +68 -0
- package/node_modules/readable-stream/readable-browser.js +9 -0
- package/node_modules/readable-stream/readable.js +16 -0
- package/node_modules/simple-concat/.travis.yml +3 -0
- package/node_modules/simple-concat/LICENSE +20 -0
- package/node_modules/simple-concat/README.md +44 -0
- package/node_modules/simple-concat/index.js +15 -0
- package/node_modules/simple-concat/package.json +47 -0
- package/node_modules/simple-concat/test/basic.js +41 -0
- package/node_modules/simple-get/.github/dependabot.yml +15 -0
- package/node_modules/simple-get/.github/workflows/ci.yml +23 -0
- package/node_modules/simple-get/LICENSE +20 -0
- package/node_modules/simple-get/README.md +333 -0
- package/node_modules/simple-get/index.js +108 -0
- package/node_modules/simple-get/package.json +67 -0
- package/node_modules/string_decoder/LICENSE +48 -0
- package/node_modules/string_decoder/README.md +47 -0
- package/node_modules/string_decoder/lib/string_decoder.js +296 -0
- package/node_modules/string_decoder/package.json +34 -0
- package/node_modules/strip-json-comments/index.js +70 -0
- package/node_modules/strip-json-comments/license +21 -0
- package/node_modules/strip-json-comments/package.json +42 -0
- package/node_modules/strip-json-comments/readme.md +64 -0
- package/node_modules/tar-fs/.travis.yml +6 -0
- package/node_modules/tar-fs/LICENSE +21 -0
- package/node_modules/tar-fs/README.md +165 -0
- package/node_modules/tar-fs/index.js +363 -0
- package/node_modules/tar-fs/node_modules/chownr/LICENSE +15 -0
- package/node_modules/tar-fs/node_modules/chownr/README.md +3 -0
- package/node_modules/tar-fs/node_modules/chownr/chownr.js +167 -0
- package/node_modules/tar-fs/node_modules/chownr/package.json +29 -0
- package/node_modules/tar-fs/package.json +41 -0
- package/node_modules/tar-fs/test/fixtures/a/hello.txt +1 -0
- package/node_modules/tar-fs/test/fixtures/b/a/test.txt +1 -0
- package/node_modules/tar-fs/test/fixtures/d/file1 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/file2 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-dir/file5 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-files/file3 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-files/file4 +0 -0
- package/node_modules/tar-fs/test/fixtures/e/directory/.ignore +0 -0
- package/node_modules/tar-fs/test/fixtures/e/file +0 -0
- package/node_modules/tar-fs/test/fixtures/invalid.tar +0 -0
- package/node_modules/tar-fs/test/index.js +346 -0
- package/node_modules/tar-stream/LICENSE +21 -0
- package/node_modules/tar-stream/README.md +168 -0
- package/node_modules/tar-stream/extract.js +257 -0
- package/node_modules/tar-stream/headers.js +295 -0
- package/node_modules/tar-stream/index.js +2 -0
- package/node_modules/tar-stream/pack.js +255 -0
- package/node_modules/tar-stream/package.json +58 -0
- package/node_modules/tar-stream/sandbox.js +11 -0
- package/node_modules/tunnel-agent/LICENSE +55 -0
- package/node_modules/tunnel-agent/README.md +4 -0
- package/node_modules/tunnel-agent/index.js +244 -0
- package/node_modules/tunnel-agent/package.json +22 -0
- package/node_modules/util-deprecate/History.md +16 -0
- package/node_modules/util-deprecate/LICENSE +24 -0
- package/node_modules/util-deprecate/README.md +53 -0
- package/node_modules/util-deprecate/browser.js +67 -0
- package/node_modules/util-deprecate/node.js +6 -0
- package/node_modules/util-deprecate/package.json +27 -0
- package/node_modules/uuid/CHANGELOG.md +274 -0
- package/node_modules/uuid/CONTRIBUTING.md +18 -0
- package/node_modules/uuid/LICENSE.md +9 -0
- package/node_modules/uuid/README.md +466 -0
- package/node_modules/uuid/dist/bin/uuid +2 -0
- package/node_modules/uuid/dist/commonjs-browser/index.js +79 -0
- package/node_modules/uuid/dist/commonjs-browser/md5.js +223 -0
- package/node_modules/uuid/dist/commonjs-browser/native.js +11 -0
- package/node_modules/uuid/dist/commonjs-browser/nil.js +8 -0
- package/node_modules/uuid/dist/commonjs-browser/parse.js +45 -0
- package/node_modules/uuid/dist/commonjs-browser/regex.js +8 -0
- package/node_modules/uuid/dist/commonjs-browser/rng.js +25 -0
- package/node_modules/uuid/dist/commonjs-browser/sha1.js +104 -0
- package/node_modules/uuid/dist/commonjs-browser/stringify.js +44 -0
- package/node_modules/uuid/dist/commonjs-browser/v1.js +107 -0
- package/node_modules/uuid/dist/commonjs-browser/v3.js +16 -0
- package/node_modules/uuid/dist/commonjs-browser/v35.js +80 -0
- package/node_modules/uuid/dist/commonjs-browser/v4.js +43 -0
- package/node_modules/uuid/dist/commonjs-browser/v5.js +16 -0
- package/node_modules/uuid/dist/commonjs-browser/validate.js +17 -0
- package/node_modules/uuid/dist/commonjs-browser/version.js +21 -0
- package/node_modules/uuid/dist/esm-browser/index.js +9 -0
- package/node_modules/uuid/dist/esm-browser/md5.js +215 -0
- package/node_modules/uuid/dist/esm-browser/native.js +4 -0
- package/node_modules/uuid/dist/esm-browser/nil.js +1 -0
- package/node_modules/uuid/dist/esm-browser/parse.js +35 -0
- package/node_modules/uuid/dist/esm-browser/regex.js +1 -0
- package/node_modules/uuid/dist/esm-browser/rng.js +18 -0
- package/node_modules/uuid/dist/esm-browser/sha1.js +96 -0
- package/node_modules/uuid/dist/esm-browser/stringify.js +33 -0
- package/node_modules/uuid/dist/esm-browser/v1.js +95 -0
- package/node_modules/uuid/dist/esm-browser/v3.js +4 -0
- package/node_modules/uuid/dist/esm-browser/v35.js +66 -0
- package/node_modules/uuid/dist/esm-browser/v4.js +29 -0
- package/node_modules/uuid/dist/esm-browser/v5.js +4 -0
- package/node_modules/uuid/dist/esm-browser/validate.js +7 -0
- package/node_modules/uuid/dist/esm-browser/version.js +11 -0
- package/node_modules/uuid/dist/esm-node/index.js +9 -0
- package/node_modules/uuid/dist/esm-node/md5.js +13 -0
- package/node_modules/uuid/dist/esm-node/native.js +4 -0
- package/node_modules/uuid/dist/esm-node/nil.js +1 -0
- package/node_modules/uuid/dist/esm-node/parse.js +35 -0
- package/node_modules/uuid/dist/esm-node/regex.js +1 -0
- package/node_modules/uuid/dist/esm-node/rng.js +12 -0
- package/node_modules/uuid/dist/esm-node/sha1.js +13 -0
- package/node_modules/uuid/dist/esm-node/stringify.js +33 -0
- package/node_modules/uuid/dist/esm-node/v1.js +95 -0
- package/node_modules/uuid/dist/esm-node/v3.js +4 -0
- package/node_modules/uuid/dist/esm-node/v35.js +66 -0
- package/node_modules/uuid/dist/esm-node/v4.js +29 -0
- package/node_modules/uuid/dist/esm-node/v5.js +4 -0
- package/node_modules/uuid/dist/esm-node/validate.js +7 -0
- package/node_modules/uuid/dist/esm-node/version.js +11 -0
- package/node_modules/uuid/dist/index.js +79 -0
- package/node_modules/uuid/dist/md5-browser.js +223 -0
- package/node_modules/uuid/dist/md5.js +23 -0
- package/node_modules/uuid/dist/native-browser.js +11 -0
- package/node_modules/uuid/dist/native.js +15 -0
- package/node_modules/uuid/dist/nil.js +8 -0
- package/node_modules/uuid/dist/parse.js +45 -0
- package/node_modules/uuid/dist/regex.js +8 -0
- package/node_modules/uuid/dist/rng-browser.js +25 -0
- package/node_modules/uuid/dist/rng.js +24 -0
- package/node_modules/uuid/dist/sha1-browser.js +104 -0
- package/node_modules/uuid/dist/sha1.js +23 -0
- package/node_modules/uuid/dist/stringify.js +44 -0
- package/node_modules/uuid/dist/uuid-bin.js +85 -0
- package/node_modules/uuid/dist/v1.js +107 -0
- package/node_modules/uuid/dist/v3.js +16 -0
- package/node_modules/uuid/dist/v35.js +80 -0
- package/node_modules/uuid/dist/v4.js +43 -0
- package/node_modules/uuid/dist/v5.js +16 -0
- package/node_modules/uuid/dist/validate.js +17 -0
- package/node_modules/uuid/dist/version.js +21 -0
- package/node_modules/uuid/package.json +135 -0
- package/node_modules/uuid/wrapper.mjs +10 -0
- package/package.json +5 -3
- package/packages/cli/package.json +1 -1
- package/packages/daemon/package.json +1 -1
- package/packages/daemon/src/api.js +17 -9
- package/packages/daemon/src/process.js +2 -0
- package/packages/gui/dist/assets/{codemirror-BBL3i_JW.js → codemirror-CFF1Lrnz.js} +10 -10
- package/{node_modules/@groove-dev/gui/dist/assets/index-DWv32qyJ.js → packages/gui/dist/assets/index-B3GUKInH.js} +1740 -1740
- package/{node_modules/@groove-dev/gui/dist/assets/index-Bo6AeNmM.css → packages/gui/dist/assets/index-C1k-GuDg.css} +1 -1
- package/packages/gui/dist/index.html +3 -3
- package/packages/gui/package.json +1 -1
- package/packages/gui/src/components/agents/agent-panel.jsx +2 -0
- package/packages/gui/src/components/editor/code-editor.jsx +3 -3
- package/packages/gui/src/stores/groove.js +23 -16
- package/packages/gui/src/views/agents.jsx +44 -113
- 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
|
+
}
|