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
|
@@ -34,8 +34,41 @@ function matchesScope(filePath, scopePatterns) {
|
|
|
34
34
|
return false;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
// ── Inline Input (for new file/folder) ─────────────────
|
|
38
|
+
function InlineInput({ defaultValue = '', placeholder, onSubmit, onCancel, depth = 0 }) {
|
|
39
|
+
const [value, setValue] = useState(defaultValue);
|
|
40
|
+
const inputRef = useRef(null);
|
|
41
|
+
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
inputRef.current?.focus();
|
|
44
|
+
if (defaultValue) inputRef.current?.select();
|
|
45
|
+
}, [defaultValue]);
|
|
46
|
+
|
|
47
|
+
function handleKeyDown(e) {
|
|
48
|
+
if (e.key === 'Enter') {
|
|
49
|
+
const name = value.trim();
|
|
50
|
+
if (name) onSubmit(name);
|
|
51
|
+
}
|
|
52
|
+
if (e.key === 'Escape') onCancel();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<div className="flex items-center py-0.5" style={{ paddingLeft: depth * 16 + 8 }}>
|
|
57
|
+
<input
|
|
58
|
+
ref={inputRef}
|
|
59
|
+
value={value}
|
|
60
|
+
onChange={(e) => setValue(e.target.value)}
|
|
61
|
+
onKeyDown={handleKeyDown}
|
|
62
|
+
onBlur={onCancel}
|
|
63
|
+
placeholder={placeholder}
|
|
64
|
+
className="w-full h-5 px-1.5 text-xs bg-surface-0 border border-accent rounded text-text-0 font-sans focus:outline-none"
|
|
65
|
+
/>
|
|
66
|
+
</div>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
37
70
|
function TreeEntry({ entry, depth, onOpen, expandedDirs, onToggleDir }) {
|
|
38
|
-
const isDir = entry.type === '
|
|
71
|
+
const isDir = entry.type === 'dir';
|
|
39
72
|
const isExpanded = expandedDirs.has(entry.path);
|
|
40
73
|
const fileColor = isDir ? 'text-accent' : getFileColor(entry.name);
|
|
41
74
|
|
|
@@ -91,6 +124,7 @@ export function AgentFileTree({ agentId }) {
|
|
|
91
124
|
const [expandedDirs, setExpandedDirs] = useState(new Set());
|
|
92
125
|
const [loading, setLoading] = useState(true);
|
|
93
126
|
const [touchedFiles, setTouchedFiles] = useState([]);
|
|
127
|
+
const [inlineInput, setInlineInput] = useState(null);
|
|
94
128
|
const fetchedRef = useRef(new Set());
|
|
95
129
|
|
|
96
130
|
useEffect(() => {
|
|
@@ -152,7 +186,7 @@ export function AgentFileTree({ agentId }) {
|
|
|
152
186
|
for (const dir of dirs) {
|
|
153
187
|
const entries = await fetchDir(dir);
|
|
154
188
|
if (entries.length > 0) {
|
|
155
|
-
results.push({ name: dir.split('/').pop(), path: dir, type: '
|
|
189
|
+
results.push({ name: dir.split('/').pop(), path: dir, type: 'dir', children: entries });
|
|
156
190
|
}
|
|
157
191
|
}
|
|
158
192
|
if (!cancelled) setTreeData(results);
|
|
@@ -178,22 +212,32 @@ export function AgentFileTree({ agentId }) {
|
|
|
178
212
|
openFile(path);
|
|
179
213
|
}
|
|
180
214
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
215
|
+
function handleNewFile() {
|
|
216
|
+
setInlineInput({
|
|
217
|
+
type: 'file',
|
|
218
|
+
onSubmit: async (name) => {
|
|
219
|
+
setInlineInput(null);
|
|
220
|
+
await createFile?.(name);
|
|
221
|
+
},
|
|
222
|
+
onCancel: () => setInlineInput(null)
|
|
223
|
+
});
|
|
185
224
|
}
|
|
186
225
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
226
|
+
function handleNewFolder() {
|
|
227
|
+
setInlineInput({
|
|
228
|
+
type: 'folder',
|
|
229
|
+
onSubmit: async (name) => {
|
|
230
|
+
setInlineInput(null);
|
|
231
|
+
try {
|
|
232
|
+
await api.post('/files/mkdir', { path: name });
|
|
233
|
+
addToast('success', `Created ${name}/`);
|
|
234
|
+
handleRefresh();
|
|
235
|
+
} catch (err) {
|
|
236
|
+
addToast('error', 'Create folder failed', err.message);
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
onCancel: () => setInlineInput(null)
|
|
240
|
+
});
|
|
197
241
|
}
|
|
198
242
|
|
|
199
243
|
function handleRefresh() {
|
|
@@ -226,6 +270,14 @@ export function AgentFileTree({ agentId }) {
|
|
|
226
270
|
</div>
|
|
227
271
|
<ScrollArea className="flex-1 min-h-0">
|
|
228
272
|
<div className="py-2">
|
|
273
|
+
{inlineInput && (
|
|
274
|
+
<InlineInput
|
|
275
|
+
placeholder={inlineInput.type === 'file' ? 'filename.ext' : 'folder-name'}
|
|
276
|
+
onSubmit={inlineInput.onSubmit}
|
|
277
|
+
onCancel={inlineInput.onCancel}
|
|
278
|
+
depth={0}
|
|
279
|
+
/>
|
|
280
|
+
)}
|
|
229
281
|
{touchedFiles.length > 0 && (
|
|
230
282
|
<div className="mb-3">
|
|
231
283
|
<div className="flex items-center gap-1.5 px-3 py-1.5 text-2xs font-semibold text-text-3 uppercase tracking-wider">
|
|
@@ -80,11 +80,13 @@ function InlineName({ agent }) {
|
|
|
80
80
|
export function AgentPanel() {
|
|
81
81
|
const detailPanel = useGrooveStore((s) => s.detailPanel);
|
|
82
82
|
const agents = useGrooveStore((s) => s.agents);
|
|
83
|
+
const activeTeamId = useGrooveStore((s) => s.activeTeamId);
|
|
83
84
|
const [activeTab, setActiveTab] = useState('command');
|
|
84
85
|
|
|
85
86
|
if (detailPanel?.type !== 'agent') return null;
|
|
86
87
|
const agent = agents.find((a) => a.id === detailPanel.agentId);
|
|
87
88
|
if (!agent) return null;
|
|
89
|
+
if (activeTeamId && agent.teamId && agent.teamId !== activeTeamId) return null;
|
|
88
90
|
|
|
89
91
|
const isAlive = agent.status === 'running' || agent.status === 'starting';
|
|
90
92
|
const ctxPct = Math.round((agent.contextUsage || 0) * 100);
|
|
@@ -5,7 +5,7 @@ import { cn } from '../../lib/cn';
|
|
|
5
5
|
import { ScrollArea } from '../ui/scroll-area';
|
|
6
6
|
import { Button } from '../ui/button';
|
|
7
7
|
import { DiffViewer } from './diff-viewer';
|
|
8
|
-
import { Check, X, MessageSquare, ChevronLeft, CheckCircle2, XCircle, Send } from 'lucide-react';
|
|
8
|
+
import { Check, X, MessageSquare, ChevronLeft, CheckCircle2, XCircle, Send, Users } from 'lucide-react';
|
|
9
9
|
|
|
10
10
|
export function CodeReview({ agentId }) {
|
|
11
11
|
const reviewFiles = useGrooveStore((s) => s.workspaceReviewFiles);
|
|
@@ -15,6 +15,7 @@ export function CodeReview({ agentId }) {
|
|
|
15
15
|
const instructAgent = useGrooveStore((s) => s.instructAgent);
|
|
16
16
|
const toggleReviewMode = useGrooveStore((s) => s.toggleReviewMode);
|
|
17
17
|
const openFile = useGrooveStore((s) => s.openFile);
|
|
18
|
+
const setWorkspaceMode = useGrooveStore((s) => s.setWorkspaceMode);
|
|
18
19
|
|
|
19
20
|
const [selectedFile, setSelectedFile] = useState(null);
|
|
20
21
|
const [commentingPath, setCommentingPath] = useState(null);
|
|
@@ -71,12 +72,19 @@ export function CodeReview({ agentId }) {
|
|
|
71
72
|
return (
|
|
72
73
|
<div className="flex flex-col h-full">
|
|
73
74
|
<div className="flex items-center gap-3 px-4 py-3 bg-surface-1 border-b border-border flex-shrink-0">
|
|
75
|
+
<button onClick={toggleReviewMode} className="p-1 rounded hover:bg-surface-4 text-text-3 hover:text-text-1 cursor-pointer" title="Back to Files">
|
|
76
|
+
<ChevronLeft size={16} />
|
|
77
|
+
</button>
|
|
74
78
|
<span className="text-sm font-semibold text-text-0 font-sans flex-1">Review Changes</span>
|
|
75
79
|
<span className="text-xs text-text-3 font-sans">
|
|
76
80
|
{reviewFiles.length} file{reviewFiles.length !== 1 ? 's' : ''} changed
|
|
77
81
|
</span>
|
|
78
82
|
{approved > 0 && <span className="text-xs text-success font-sans">{approved} approved</span>}
|
|
79
83
|
{rejected > 0 && <span className="text-xs text-danger font-sans">{rejected} rejected</span>}
|
|
84
|
+
<button onClick={() => { toggleReviewMode(); setWorkspaceMode(false); }} className="p-1.5 rounded bg-surface-3 hover:bg-surface-4 text-text-2 hover:text-text-0 cursor-pointer flex items-center gap-1.5" title="Back to Team">
|
|
85
|
+
<Users size={14} />
|
|
86
|
+
<span className="text-xs font-sans">Team</span>
|
|
87
|
+
</button>
|
|
80
88
|
</div>
|
|
81
89
|
|
|
82
90
|
<ScrollArea className="flex-1">
|
|
@@ -227,7 +227,7 @@ export function WorkspaceMode() {
|
|
|
227
227
|
</div>
|
|
228
228
|
|
|
229
229
|
{/* Editor Area */}
|
|
230
|
-
<div className="flex-1 flex flex-col min-w-0 bg-
|
|
230
|
+
<div className="flex-1 flex flex-col min-w-0 bg-surface-0">
|
|
231
231
|
{workspaceReviewMode ? (
|
|
232
232
|
<CodeReview agentId={agent.id} />
|
|
233
233
|
) : (
|
|
@@ -266,7 +266,7 @@ export function WorkspaceMode() {
|
|
|
266
266
|
)}
|
|
267
267
|
|
|
268
268
|
{!editorActiveFile && (
|
|
269
|
-
<div className="w-full h-full flex items-center justify-center text-text-4 font-sans bg-
|
|
269
|
+
<div className="w-full h-full flex items-center justify-center text-text-4 font-sans bg-surface-0">
|
|
270
270
|
<div className="text-center space-y-2">
|
|
271
271
|
<Code2 size={32} className="mx-auto" />
|
|
272
272
|
<p className="text-sm">Open a file from the tree</p>
|
|
@@ -141,5 +141,5 @@ export function CodeEditor({ content, language, onChange, onSave, onCursorChange
|
|
|
141
141
|
view.dispatch({ effects: langCompartment.current.reconfigure(langExt()) });
|
|
142
142
|
}, [language]);
|
|
143
143
|
|
|
144
|
-
return <div ref={containerRef} className="w-full h-full overflow-hidden bg-
|
|
144
|
+
return <div ref={containerRef} className="w-full h-full overflow-hidden bg-surface-0" />;
|
|
145
145
|
}
|
|
@@ -70,7 +70,6 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
70
70
|
teamBuilderRoles: [],
|
|
71
71
|
teamBuilderSettings: { provider: null, model: null, reasoningEffort: 50, temperature: 0.5 },
|
|
72
72
|
teamBuilderTask: '',
|
|
73
|
-
teamBuilderLaunchMode: 'plan',
|
|
74
73
|
teamTemplates: { builtIn: [], custom: [] },
|
|
75
74
|
|
|
76
75
|
// ── Navigation ────────────────────────────────────────────
|
|
@@ -1201,6 +1200,8 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
1201
1200
|
},
|
|
1202
1201
|
selectAgent(id) {
|
|
1203
1202
|
const tid = get().activeTeamId;
|
|
1203
|
+
const match = get().agents.find((a) => a.id === id);
|
|
1204
|
+
if (tid && match && match.teamId && match.teamId !== tid) return;
|
|
1204
1205
|
const panel = { type: 'agent', agentId: id };
|
|
1205
1206
|
set((s) => ({ detailPanel: panel, teamDetailPanels: { ...s.teamDetailPanels, [tid]: panel } }));
|
|
1206
1207
|
},
|
|
@@ -1522,7 +1523,14 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
1522
1523
|
if (get()._delegatingTeamIds.has(teamId)) return;
|
|
1523
1524
|
set((s) => ({ recommendedTeam: null, _delegatingTeamIds: new Set([...s._delegatingTeamIds, teamId]) }));
|
|
1524
1525
|
try {
|
|
1525
|
-
const
|
|
1526
|
+
const tlc = get().teamLaunchConfig;
|
|
1527
|
+
const result = await api.post('/recommended-team/launch', {
|
|
1528
|
+
teamId,
|
|
1529
|
+
...(tlc?.provider && { teamProvider: tlc.provider }),
|
|
1530
|
+
...(tlc?.model && { teamModel: tlc.model }),
|
|
1531
|
+
...(tlc?.reasoningEffort != null && { teamReasoningEffort: tlc.reasoningEffort }),
|
|
1532
|
+
...(tlc?.temperature != null && { teamTemperature: tlc.temperature }),
|
|
1533
|
+
});
|
|
1526
1534
|
const agents = result.agents || [];
|
|
1527
1535
|
const failures = result.failed || [];
|
|
1528
1536
|
const names = agents.map((a) => a.name).join(', ') || '';
|
|
@@ -1619,7 +1627,6 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
1619
1627
|
teamBuilderRoles: [],
|
|
1620
1628
|
teamBuilderSettings: { provider: null, model: null, reasoningEffort: 50, temperature: 0.5 },
|
|
1621
1629
|
teamBuilderTask: '',
|
|
1622
|
-
teamBuilderLaunchMode: 'plan',
|
|
1623
1630
|
});
|
|
1624
1631
|
},
|
|
1625
1632
|
addTeamBuilderRole(role) {
|
|
@@ -1651,12 +1658,18 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
1651
1658
|
set((s) => ({ teamBuilderSettings: { ...s.teamBuilderSettings, ...settings } }));
|
|
1652
1659
|
},
|
|
1653
1660
|
setTeamBuilderTask(task) { set({ teamBuilderTask: task }); },
|
|
1654
|
-
setTeamBuilderLaunchMode(mode) { set({ teamBuilderLaunchMode: mode }); },
|
|
1655
1661
|
|
|
1656
1662
|
async fetchTeamTemplates() {
|
|
1657
1663
|
try {
|
|
1658
1664
|
const data = await api.get('/team-templates');
|
|
1659
|
-
|
|
1665
|
+
const builtIn = [];
|
|
1666
|
+
const custom = [];
|
|
1667
|
+
for (const [key, tmpl] of Object.entries(data || {})) {
|
|
1668
|
+
const entry = { ...tmpl, name: key };
|
|
1669
|
+
if (tmpl.builtIn) builtIn.push(entry);
|
|
1670
|
+
else custom.push(entry);
|
|
1671
|
+
}
|
|
1672
|
+
set({ teamTemplates: { builtIn, custom } });
|
|
1660
1673
|
} catch { /* endpoint may not exist yet */ }
|
|
1661
1674
|
},
|
|
1662
1675
|
|
|
@@ -1686,21 +1699,25 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
1686
1699
|
},
|
|
1687
1700
|
|
|
1688
1701
|
async launchTeamBuilder() {
|
|
1689
|
-
const { teamBuilderRoles, teamBuilderSettings, teamBuilderTask,
|
|
1702
|
+
const { teamBuilderRoles, teamBuilderSettings, teamBuilderTask, activeTeamId } = get();
|
|
1690
1703
|
if (teamBuilderRoles.length === 0) return;
|
|
1704
|
+
set({ teamLaunchConfig: {
|
|
1705
|
+
provider: teamBuilderSettings.provider || null,
|
|
1706
|
+
model: teamBuilderSettings.model || null,
|
|
1707
|
+
reasoningEffort: teamBuilderSettings.reasoningEffort,
|
|
1708
|
+
temperature: teamBuilderSettings.temperature,
|
|
1709
|
+
}});
|
|
1710
|
+
get().closeTeamBuilder();
|
|
1691
1711
|
try {
|
|
1692
|
-
get().addToast('info', 'Launching team...');
|
|
1693
1712
|
const body = {
|
|
1694
1713
|
task: teamBuilderTask,
|
|
1695
1714
|
roles: teamBuilderRoles,
|
|
1696
1715
|
settings: teamBuilderSettings,
|
|
1697
|
-
launchMode:
|
|
1716
|
+
launchMode: 'plan-first',
|
|
1698
1717
|
teamId: activeTeamId,
|
|
1699
1718
|
};
|
|
1700
1719
|
const result = await api.post('/team-builder/launch', body);
|
|
1701
|
-
|
|
1702
|
-
get().addToast('success', `Launched ${count} agent${count !== 1 ? 's' : ''}`);
|
|
1703
|
-
get().closeTeamBuilder();
|
|
1720
|
+
get().addToast('success', 'Planner spawned — team will build automatically');
|
|
1704
1721
|
return result;
|
|
1705
1722
|
} catch (err) {
|
|
1706
1723
|
get().addToast('error', 'Team launch failed', err.message);
|
|
@@ -2529,27 +2546,24 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
2529
2546
|
});
|
|
2530
2547
|
},
|
|
2531
2548
|
|
|
2532
|
-
toggleReviewMode() {
|
|
2549
|
+
async toggleReviewMode() {
|
|
2533
2550
|
const st = get();
|
|
2534
2551
|
if (st.workspaceReviewMode) {
|
|
2535
2552
|
set({ workspaceReviewMode: false, workspaceReviewFiles: [] });
|
|
2536
2553
|
return;
|
|
2537
2554
|
}
|
|
2538
2555
|
const agentId = st.workspaceAgentId;
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
|
|
2543
|
-
const
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
files.push({ path, status: 'pending', comment: '' });
|
|
2551
|
-
}
|
|
2552
|
-
set({ workspaceReviewMode: true, workspaceReviewFiles: files });
|
|
2556
|
+
if (!agentId) return;
|
|
2557
|
+
try {
|
|
2558
|
+
const res = await api.get(`/agents/${agentId}/files-touched`);
|
|
2559
|
+
const touched = res.data || [];
|
|
2560
|
+
const files = touched
|
|
2561
|
+
.filter((f) => f.writes > 0)
|
|
2562
|
+
.map((f) => ({ path: f.path, status: 'pending', comment: '' }));
|
|
2563
|
+
set({ workspaceReviewMode: true, workspaceReviewFiles: files });
|
|
2564
|
+
} catch (err) {
|
|
2565
|
+
console.error('Failed to fetch touched files for review:', err);
|
|
2566
|
+
}
|
|
2553
2567
|
},
|
|
2554
2568
|
|
|
2555
2569
|
approveFile(path) {
|
|
@@ -10,7 +10,7 @@ import { RootNode } from '../components/agents/root-node';
|
|
|
10
10
|
import { cn } from '../lib/cn';
|
|
11
11
|
import { Button } from '../components/ui/button';
|
|
12
12
|
import { Badge } from '../components/ui/badge';
|
|
13
|
-
import { Plus, Users, UserPlus, Zap, X, Check, Rocket, Server, Monitor, Code2, TestTube, Shield, Pencil, Copy, Trash2, ChevronDown, ChevronLeft, ChevronRight, FolderOpen, Eye, Settings2, Search, GripVertical, Cloud, FileText, Database, Megaphone, Calculator, UserCheck, Headphones, BarChart3, Pen, Presentation, Globe, MessageCircle, Save,
|
|
13
|
+
import { Plus, Users, UserPlus, Zap, X, Check, Rocket, Server, Monitor, Code2, TestTube, Shield, Pencil, Copy, Trash2, ChevronDown, ChevronLeft, ChevronRight, FolderOpen, Eye, Settings2, Search, GripVertical, Cloud, FileText, Database, Megaphone, Calculator, UserCheck, Headphones, BarChart3, Pen, Presentation, Globe, MessageCircle, Save, Layers } from 'lucide-react';
|
|
14
14
|
import { PreviewWorkspace } from '../components/preview/preview-workspace';
|
|
15
15
|
import { WorkspaceMode } from '../components/agents/workspace-mode';
|
|
16
16
|
import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuSeparator } from '../components/ui/context-menu';
|
|
@@ -750,7 +750,6 @@ function TeamBuilder() {
|
|
|
750
750
|
const roles = useGrooveStore((s) => s.teamBuilderRoles);
|
|
751
751
|
const settings = useGrooveStore((s) => s.teamBuilderSettings);
|
|
752
752
|
const task = useGrooveStore((s) => s.teamBuilderTask);
|
|
753
|
-
const launchMode = useGrooveStore((s) => s.teamBuilderLaunchMode);
|
|
754
753
|
const templates = useGrooveStore((s) => s.teamTemplates);
|
|
755
754
|
const closeTeamBuilder = useGrooveStore((s) => s.closeTeamBuilder);
|
|
756
755
|
const addRole = useGrooveStore((s) => s.addTeamBuilderRole);
|
|
@@ -759,7 +758,6 @@ function TeamBuilder() {
|
|
|
759
758
|
const applyTemplate = useGrooveStore((s) => s.applyTemplate);
|
|
760
759
|
const setSettings = useGrooveStore((s) => s.setTeamBuilderSettings);
|
|
761
760
|
const setTask = useGrooveStore((s) => s.setTeamBuilderTask);
|
|
762
|
-
const setLaunchMode = useGrooveStore((s) => s.setTeamBuilderLaunchMode);
|
|
763
761
|
const launchTeamBuilder = useGrooveStore((s) => s.launchTeamBuilder);
|
|
764
762
|
const saveTeamTemplate = useGrooveStore((s) => s.saveTeamTemplate);
|
|
765
763
|
const fetchTeamTemplates = useGrooveStore((s) => s.fetchTeamTemplates);
|
|
@@ -789,8 +787,6 @@ function TeamBuilder() {
|
|
|
789
787
|
|
|
790
788
|
const selectedProvider = providers.find((p) => p.id === settings.provider);
|
|
791
789
|
const settingsModels = (selectedProvider?.models || []).filter((m) => m.type !== 'image' && !m.disabled);
|
|
792
|
-
const showTemp = PROVIDER_TEMP_SUPPORT.has(settings.provider);
|
|
793
|
-
|
|
794
790
|
function handleSettingsProviderChange(id) {
|
|
795
791
|
setSettings({ provider: id });
|
|
796
792
|
const p = providers.find((x) => x.id === id);
|
|
@@ -829,8 +825,8 @@ function TeamBuilder() {
|
|
|
829
825
|
{/* Top Bar */}
|
|
830
826
|
<div className="flex items-center justify-between px-6 py-4 border-b border-border-subtle">
|
|
831
827
|
<div className="flex items-center gap-3">
|
|
832
|
-
<div className="w-8 h-8 rounded-lg bg-
|
|
833
|
-
<Users size={16} className="text-
|
|
828
|
+
<div className="w-8 h-8 rounded-lg bg-info/15 flex items-center justify-center">
|
|
829
|
+
<Users size={16} className="text-info" />
|
|
834
830
|
</div>
|
|
835
831
|
<h2 className="text-lg font-bold text-text-0 font-sans">Team Builder</h2>
|
|
836
832
|
</div>
|
|
@@ -1017,16 +1013,6 @@ function TeamBuilder() {
|
|
|
1017
1013
|
formatValue={(v) => v.toFixed(2)}
|
|
1018
1014
|
/>
|
|
1019
1015
|
)}
|
|
1020
|
-
<div className="space-y-1">
|
|
1021
|
-
<label className="text-2xs text-text-3 font-sans">Custom Prompt</label>
|
|
1022
|
-
<textarea
|
|
1023
|
-
value={r.prompt || ''}
|
|
1024
|
-
onChange={(e) => updateRole(i, { prompt: e.target.value })}
|
|
1025
|
-
placeholder="Optional instructions for this agent..."
|
|
1026
|
-
rows={2}
|
|
1027
|
-
className="w-full px-2.5 py-1.5 text-xs bg-surface-3 border border-border-subtle rounded-md text-text-0 font-sans placeholder:text-text-4 focus:outline-none focus:ring-1 focus:ring-accent resize-none"
|
|
1028
|
-
/>
|
|
1029
|
-
</div>
|
|
1030
1016
|
</div>
|
|
1031
1017
|
)}
|
|
1032
1018
|
</div>
|
|
@@ -1040,38 +1026,16 @@ function TeamBuilder() {
|
|
|
1040
1026
|
{/* Bottom Bar */}
|
|
1041
1027
|
<div className="border-t border-border-subtle px-6 py-4">
|
|
1042
1028
|
<div className="flex gap-4">
|
|
1043
|
-
{/* Task
|
|
1044
|
-
<div className="flex-1 space-y-
|
|
1029
|
+
{/* Task */}
|
|
1030
|
+
<div className="flex-1 space-y-1.5">
|
|
1045
1031
|
<textarea
|
|
1046
1032
|
value={task}
|
|
1047
1033
|
onChange={(e) => setTask(e.target.value)}
|
|
1048
|
-
placeholder="Describe what
|
|
1049
|
-
rows={
|
|
1050
|
-
className="w-full px-3 py-2 text-sm bg-surface-3 border border-border-subtle rounded-
|
|
1034
|
+
placeholder="Describe what you want to build... (optional)"
|
|
1035
|
+
rows={3}
|
|
1036
|
+
className="w-full px-3 py-2 text-sm bg-surface-3 border border-border-subtle rounded-md text-text-0 font-sans placeholder:text-text-4 focus:outline-none focus:ring-1 focus:ring-accent resize-none"
|
|
1051
1037
|
/>
|
|
1052
|
-
<
|
|
1053
|
-
<span className="text-2xs text-text-3 font-sans mr-1">Launch Mode:</span>
|
|
1054
|
-
{[
|
|
1055
|
-
{ id: 'direct', label: 'Direct', icon: Play, tip: 'Agents start working immediately' },
|
|
1056
|
-
{ id: 'plan', label: 'Plan First', icon: ListChecks, tip: 'Planner designs prompts, then team launches' },
|
|
1057
|
-
{ id: 'await', label: 'Await', icon: Clock, tip: 'Agents spawn idle, await instructions' },
|
|
1058
|
-
].map((m) => (
|
|
1059
|
-
<Tooltip key={m.id} content={m.tip}>
|
|
1060
|
-
<button
|
|
1061
|
-
onClick={() => setLaunchMode(m.id)}
|
|
1062
|
-
className={cn(
|
|
1063
|
-
'flex items-center gap-1.5 px-2.5 py-1 rounded-md text-2xs font-semibold font-sans transition-colors cursor-pointer',
|
|
1064
|
-
launchMode === m.id
|
|
1065
|
-
? 'bg-accent/15 text-accent border border-accent/30'
|
|
1066
|
-
: 'bg-surface-3 text-text-3 border border-border-subtle hover:text-text-1 hover:border-border',
|
|
1067
|
-
)}
|
|
1068
|
-
>
|
|
1069
|
-
<m.icon size={11} />
|
|
1070
|
-
{m.label}
|
|
1071
|
-
</button>
|
|
1072
|
-
</Tooltip>
|
|
1073
|
-
))}
|
|
1074
|
-
</div>
|
|
1038
|
+
<p className="text-2xs text-text-4 font-sans italic">Leave empty to spawn agents awaiting instructions</p>
|
|
1075
1039
|
</div>
|
|
1076
1040
|
|
|
1077
1041
|
{/* Team Settings + Launch */}
|
|
@@ -1102,21 +1066,6 @@ function TeamBuilder() {
|
|
|
1102
1066
|
</Select>
|
|
1103
1067
|
</div>
|
|
1104
1068
|
</div>
|
|
1105
|
-
<TuningSlider
|
|
1106
|
-
label="Reasoning"
|
|
1107
|
-
value={settings.reasoningEffort}
|
|
1108
|
-
onChange={(v) => setSettings({ reasoningEffort: v })}
|
|
1109
|
-
min={0} max={100} step={1}
|
|
1110
|
-
/>
|
|
1111
|
-
{showTemp && (
|
|
1112
|
-
<TuningSlider
|
|
1113
|
-
label="Temperature"
|
|
1114
|
-
value={settings.temperature}
|
|
1115
|
-
onChange={(v) => setSettings({ temperature: v })}
|
|
1116
|
-
min={0} max={1} step={0.01}
|
|
1117
|
-
formatValue={(v) => v.toFixed(2)}
|
|
1118
|
-
/>
|
|
1119
|
-
)}
|
|
1120
1069
|
<Button
|
|
1121
1070
|
variant="primary"
|
|
1122
1071
|
size="md"
|
|
@@ -1125,7 +1074,7 @@ function TeamBuilder() {
|
|
|
1125
1074
|
className="w-full gap-2 mt-1"
|
|
1126
1075
|
>
|
|
1127
1076
|
<Zap size={14} />
|
|
1128
|
-
{launching ? 'Launching...' : `Launch
|
|
1077
|
+
{launching ? 'Launching...' : `Plan & Launch (${roles.length})`}
|
|
1129
1078
|
</Button>
|
|
1130
1079
|
</div>
|
|
1131
1080
|
</div>
|
|
@@ -1197,10 +1146,10 @@ function EmptyState({ onPlanner, onSpawn, onTeamBuilder }) {
|
|
|
1197
1146
|
<div className="grid grid-cols-2 gap-3">
|
|
1198
1147
|
<button
|
|
1199
1148
|
onClick={onTeamBuilder}
|
|
1200
|
-
className="flex items-center gap-3 p-4 rounded-lg border border-
|
|
1149
|
+
className="flex items-center gap-3 p-4 rounded-lg border border-info/25 bg-gradient-to-r from-info/6 to-info/2 hover:from-info/12 hover:to-info/5 hover:border-info/35 transition-all cursor-pointer group text-left"
|
|
1201
1150
|
>
|
|
1202
|
-
<div className="w-10 h-10 rounded-lg bg-
|
|
1203
|
-
<UserPlus size={20} className="text-
|
|
1151
|
+
<div className="w-10 h-10 rounded-lg bg-info/15 flex items-center justify-center group-hover:scale-110 transition-transform flex-shrink-0">
|
|
1152
|
+
<UserPlus size={20} className="text-info" />
|
|
1204
1153
|
</div>
|
|
1205
1154
|
<div className="min-w-0">
|
|
1206
1155
|
<div className="text-sm font-semibold text-text-0 font-sans">Build a Team</div>
|
|
@@ -1558,7 +1507,7 @@ export default function AgentsView() {
|
|
|
1558
1507
|
className={cn(
|
|
1559
1508
|
'absolute bottom-4 z-40 flex items-center gap-1.5 h-8 px-4 rounded-md text-xs font-semibold font-sans transition-colors cursor-pointer select-none shadow-lg shadow-black/10',
|
|
1560
1509
|
previewState.url && previewState.teamId === activeTeamId ? 'right-32' : 'right-4',
|
|
1561
|
-
'bg-
|
|
1510
|
+
'bg-accent/15 text-accent hover:bg-accent/25',
|
|
1562
1511
|
)}
|
|
1563
1512
|
>
|
|
1564
1513
|
<Code2 size={14} /> Workspace
|
package/workspace.png
DELETED
|
Binary file
|