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