groove-dev 0.27.137 → 0.27.139
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 +34 -2
- 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/adaptive.js +26 -16
- package/node_modules/@groove-dev/daemon/src/api.js +124 -6
- package/node_modules/@groove-dev/daemon/src/introducer.js +7 -2
- package/node_modules/@groove-dev/daemon/src/journalist.js +62 -24
- package/node_modules/@groove-dev/daemon/src/model-lab.js +6 -5
- package/node_modules/@groove-dev/daemon/src/process.js +11 -8
- package/node_modules/@groove-dev/daemon/src/rotator.js +5 -7
- package/{packages/gui/dist/assets/codemirror-DRQdprYi.js → node_modules/@groove-dev/gui/dist/assets/codemirror-BQqYnZfL.js} +10 -10
- package/node_modules/@groove-dev/gui/dist/assets/index-AkOtskHS.css +1 -0
- package/node_modules/@groove-dev/gui/dist/assets/index-B4uYLR57.js +8694 -0
- package/node_modules/@groove-dev/gui/dist/index.html +3 -3
- package/node_modules/@groove-dev/gui/package.json +2 -1
- package/node_modules/@groove-dev/gui/src/components/agents/code-review.jsx +87 -39
- package/node_modules/@groove-dev/gui/src/components/agents/diff-viewer.jsx +174 -70
- package/node_modules/@groove-dev/gui/src/components/editor/ai-panel.jsx +199 -0
- package/node_modules/@groove-dev/gui/src/components/editor/code-editor.jsx +162 -67
- package/node_modules/@groove-dev/gui/src/components/editor/editor-status-bar.jsx +66 -0
- package/node_modules/@groove-dev/gui/src/components/editor/editor-toolbar.jsx +179 -0
- package/node_modules/@groove-dev/gui/src/components/editor/file-tree.jsx +111 -4
- package/node_modules/@groove-dev/gui/src/components/editor/inline-prompt.jsx +67 -0
- package/node_modules/@groove-dev/gui/src/components/editor/quick-search.jsx +170 -0
- package/node_modules/@groove-dev/gui/src/components/editor/selection-menu.jsx +88 -0
- package/node_modules/@groove-dev/gui/src/components/editor/terminal.jsx +1 -0
- package/node_modules/@groove-dev/gui/src/components/lab/system-prompt-editor.jsx +21 -24
- package/node_modules/@groove-dev/gui/src/components/layout/activity-bar.jsx +5 -9
- package/node_modules/@groove-dev/gui/src/components/layout/terminal-panel.jsx +8 -0
- package/node_modules/@groove-dev/gui/src/components/ui/toast.jsx +13 -8
- package/node_modules/@groove-dev/gui/src/stores/groove.js +75 -2
- package/node_modules/@groove-dev/gui/src/views/agents.jsx +7 -7
- package/node_modules/@groove-dev/gui/src/views/editor.jsx +219 -67
- package/node_modules/@uiw/codemirror-theme-abcdef/README.md +152 -0
- package/node_modules/@uiw/codemirror-theme-abcdef/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-abcdef/cjs/index.js +95 -0
- package/node_modules/@uiw/codemirror-theme-abcdef/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-abcdef/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-abcdef/esm/index.js +84 -0
- package/node_modules/@uiw/codemirror-theme-abcdef/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-abcdef/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-abcdef/src/index.ts +52 -0
- package/node_modules/@uiw/codemirror-theme-abyss/README.md +150 -0
- package/node_modules/@uiw/codemirror-theme-abyss/cjs/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-abyss/cjs/color.js +31 -0
- package/node_modules/@uiw/codemirror-theme-abyss/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-abyss/cjs/index.js +103 -0
- package/node_modules/@uiw/codemirror-theme-abyss/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-abyss/esm/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-abyss/esm/color.js +25 -0
- package/node_modules/@uiw/codemirror-theme-abyss/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-abyss/esm/index.js +93 -0
- package/node_modules/@uiw/codemirror-theme-abyss/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-abyss/package.json +45 -0
- package/node_modules/@uiw/codemirror-theme-abyss/src/color.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-abyss/src/index.ts +52 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/README.md +153 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/cjs/index.js +66 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/esm/index.js +55 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/src/index.ts +40 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/README.md +149 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/cjs/color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/cjs/color.js +32 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/cjs/index.js +106 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/esm/color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/esm/color.js +26 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/esm/index.js +96 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/package.json +45 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/src/color.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/src/index.ts +56 -0
- package/node_modules/@uiw/codemirror-theme-atomone/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-atomone/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-atomone/cjs/index.js +69 -0
- package/node_modules/@uiw/codemirror-theme-atomone/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-atomone/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-atomone/esm/index.js +58 -0
- package/node_modules/@uiw/codemirror-theme-atomone/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-atomone/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-atomone/src/index.ts +48 -0
- package/node_modules/@uiw/codemirror-theme-aura/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-aura/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-aura/cjs/index.js +99 -0
- package/node_modules/@uiw/codemirror-theme-aura/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-aura/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-aura/esm/index.js +89 -0
- package/node_modules/@uiw/codemirror-theme-aura/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-aura/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-aura/src/index.ts +51 -0
- package/node_modules/@uiw/codemirror-theme-basic/README.md +159 -0
- package/node_modules/@uiw/codemirror-theme-basic/cjs/dark.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-basic/cjs/dark.js +156 -0
- package/node_modules/@uiw/codemirror-theme-basic/cjs/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-basic/cjs/index.js +27 -0
- package/node_modules/@uiw/codemirror-theme-basic/cjs/light.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-basic/cjs/light.js +153 -0
- package/node_modules/@uiw/codemirror-theme-basic/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-basic/dark.d.ts +6 -0
- package/node_modules/@uiw/codemirror-theme-basic/esm/dark.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-basic/esm/dark.js +146 -0
- package/node_modules/@uiw/codemirror-theme-basic/esm/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-basic/esm/index.js +2 -0
- package/node_modules/@uiw/codemirror-theme-basic/esm/light.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-basic/esm/light.js +143 -0
- package/node_modules/@uiw/codemirror-theme-basic/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-basic/light.d.ts +6 -0
- package/node_modules/@uiw/codemirror-theme-basic/package.json +63 -0
- package/node_modules/@uiw/codemirror-theme-basic/src/dark.ts +76 -0
- package/node_modules/@uiw/codemirror-theme-basic/src/index.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-basic/src/light.ts +81 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/cjs/index.js +77 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/esm/index.js +67 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/src/index.ts +44 -0
- package/node_modules/@uiw/codemirror-theme-bespin/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-bespin/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-bespin/cjs/index.js +72 -0
- package/node_modules/@uiw/codemirror-theme-bespin/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-bespin/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-bespin/esm/index.js +61 -0
- package/node_modules/@uiw/codemirror-theme-bespin/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-bespin/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-bespin/src/index.ts +46 -0
- package/node_modules/@uiw/codemirror-theme-console/README.md +160 -0
- package/node_modules/@uiw/codemirror-theme-console/cjs/dark.d.ts +4 -0
- package/node_modules/@uiw/codemirror-theme-console/cjs/dark.js +36 -0
- package/node_modules/@uiw/codemirror-theme-console/cjs/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-console/cjs/index.js +27 -0
- package/node_modules/@uiw/codemirror-theme-console/cjs/light.d.ts +4 -0
- package/node_modules/@uiw/codemirror-theme-console/cjs/light.js +36 -0
- package/node_modules/@uiw/codemirror-theme-console/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-console/dark.d.ts +6 -0
- package/node_modules/@uiw/codemirror-theme-console/esm/dark.d.ts +4 -0
- package/node_modules/@uiw/codemirror-theme-console/esm/dark.js +26 -0
- package/node_modules/@uiw/codemirror-theme-console/esm/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-console/esm/index.js +2 -0
- package/node_modules/@uiw/codemirror-theme-console/esm/light.d.ts +4 -0
- package/node_modules/@uiw/codemirror-theme-console/esm/light.js +26 -0
- package/node_modules/@uiw/codemirror-theme-console/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-console/light.d.ts +6 -0
- package/node_modules/@uiw/codemirror-theme-console/package.json +62 -0
- package/node_modules/@uiw/codemirror-theme-console/src/dark.ts +27 -0
- package/node_modules/@uiw/codemirror-theme-console/src/index.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-console/src/light.ts +27 -0
- package/node_modules/@uiw/codemirror-theme-copilot/README.md +149 -0
- package/node_modules/@uiw/codemirror-theme-copilot/cjs/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-copilot/cjs/color.js +31 -0
- package/node_modules/@uiw/codemirror-theme-copilot/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-copilot/cjs/index.js +106 -0
- package/node_modules/@uiw/codemirror-theme-copilot/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-copilot/esm/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-copilot/esm/color.js +25 -0
- package/node_modules/@uiw/codemirror-theme-copilot/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-copilot/esm/index.js +96 -0
- package/node_modules/@uiw/codemirror-theme-copilot/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-copilot/package.json +45 -0
- package/node_modules/@uiw/codemirror-theme-copilot/src/color.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-copilot/src/index.ts +56 -0
- package/node_modules/@uiw/codemirror-theme-darcula/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-darcula/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-darcula/cjs/index.js +72 -0
- package/node_modules/@uiw/codemirror-theme-darcula/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-darcula/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-darcula/esm/index.js +61 -0
- package/node_modules/@uiw/codemirror-theme-darcula/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-darcula/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-darcula/src/index.ts +46 -0
- package/node_modules/@uiw/codemirror-theme-dracula/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-dracula/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-dracula/cjs/index.js +69 -0
- package/node_modules/@uiw/codemirror-theme-dracula/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-dracula/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-dracula/esm/index.js +58 -0
- package/node_modules/@uiw/codemirror-theme-dracula/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-dracula/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-dracula/src/index.ts +48 -0
- package/node_modules/@uiw/codemirror-theme-duotone/README.md +156 -0
- package/node_modules/@uiw/codemirror-theme-duotone/cjs/index.d.ts +9 -0
- package/node_modules/@uiw/codemirror-theme-duotone/cjs/index.js +115 -0
- package/node_modules/@uiw/codemirror-theme-duotone/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-duotone/esm/index.d.ts +9 -0
- package/node_modules/@uiw/codemirror-theme-duotone/esm/index.js +102 -0
- package/node_modules/@uiw/codemirror-theme-duotone/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-duotone/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-duotone/src/index.ts +79 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/README.md +145 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/cjs/index.js +78 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/esm/index.js +68 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/src/index.ts +44 -0
- package/node_modules/@uiw/codemirror-theme-github/README.md +154 -0
- package/node_modules/@uiw/codemirror-theme-github/cjs/index.d.ts +9 -0
- package/node_modules/@uiw/codemirror-theme-github/cjs/index.js +156 -0
- package/node_modules/@uiw/codemirror-theme-github/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-github/esm/index.d.ts +9 -0
- package/node_modules/@uiw/codemirror-theme-github/esm/index.js +143 -0
- package/node_modules/@uiw/codemirror-theme-github/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-github/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-github/src/index.ts +86 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/README.md +153 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/cjs/index.d.ts +8 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/cjs/index.js +296 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/esm/index.d.ts +8 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/esm/index.js +283 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/src/index.ts +203 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/README.md +149 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/cjs/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/cjs/color.js +31 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/cjs/index.js +103 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/esm/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/esm/color.js +25 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/esm/index.js +93 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/package.json +45 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/src/color.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/src/index.ts +52 -0
- package/node_modules/@uiw/codemirror-theme-material/README.md +161 -0
- package/node_modules/@uiw/codemirror-theme-material/cjs/index.d.ts +12 -0
- package/node_modules/@uiw/codemirror-theme-material/cjs/index.js +247 -0
- package/node_modules/@uiw/codemirror-theme-material/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-material/esm/index.d.ts +12 -0
- package/node_modules/@uiw/codemirror-theme-material/esm/index.js +235 -0
- package/node_modules/@uiw/codemirror-theme-material/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-material/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-material/src/index.ts +129 -0
- package/node_modules/@uiw/codemirror-theme-monokai/README.md +149 -0
- package/node_modules/@uiw/codemirror-theme-monokai/cjs/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-monokai/cjs/color.js +31 -0
- package/node_modules/@uiw/codemirror-theme-monokai/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-monokai/cjs/index.js +103 -0
- package/node_modules/@uiw/codemirror-theme-monokai/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-monokai/esm/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-monokai/esm/color.js +25 -0
- package/node_modules/@uiw/codemirror-theme-monokai/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-monokai/esm/index.js +93 -0
- package/node_modules/@uiw/codemirror-theme-monokai/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-monokai/package.json +45 -0
- package/node_modules/@uiw/codemirror-theme-monokai/src/color.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-monokai/src/index.ts +52 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/cjs/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/cjs/color.js +31 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/cjs/index.js +103 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/esm/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/esm/color.js +25 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/esm/index.js +93 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/package.json +46 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/src/color.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/src/index.ts +52 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/README.md +149 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/cjs/index.js +83 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/esm/index.js +73 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/src/index.ts +49 -0
- package/node_modules/@uiw/codemirror-theme-nord/README.md +149 -0
- package/node_modules/@uiw/codemirror-theme-nord/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-nord/cjs/index.js +159 -0
- package/node_modules/@uiw/codemirror-theme-nord/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-nord/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-nord/esm/index.js +149 -0
- package/node_modules/@uiw/codemirror-theme-nord/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-nord/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-nord/src/index.ts +77 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/README.md +147 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/cjs/index.js +69 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/esm/index.js +59 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/src/index.ts +41 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/README.md +149 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/cjs/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/cjs/color.js +31 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/cjs/index.js +104 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/esm/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/esm/color.js +25 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/esm/index.js +94 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/package.json +45 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/src/color.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/src/index.ts +53 -0
- package/node_modules/@uiw/codemirror-theme-red/README.md +149 -0
- package/node_modules/@uiw/codemirror-theme-red/cjs/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-red/cjs/color.js +31 -0
- package/node_modules/@uiw/codemirror-theme-red/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-red/cjs/index.js +103 -0
- package/node_modules/@uiw/codemirror-theme-red/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-red/esm/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-red/esm/color.js +25 -0
- package/node_modules/@uiw/codemirror-theme-red/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-red/esm/index.js +93 -0
- package/node_modules/@uiw/codemirror-theme-red/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-red/package.json +45 -0
- package/node_modules/@uiw/codemirror-theme-red/src/color.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-red/src/index.ts +52 -0
- package/node_modules/@uiw/codemirror-theme-solarized/README.md +160 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/dark-color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/dark-color.js +32 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/dark.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/dark.js +104 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/index.js +27 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/light-color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/light-color.js +32 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/light.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/light.js +104 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-solarized/dark.d.ts +6 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/dark-color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/dark-color.js +26 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/dark.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/dark.js +94 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/index.js +2 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/light-color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/light-color.js +26 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/light.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/light.js +94 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-solarized/light.d.ts +6 -0
- package/node_modules/@uiw/codemirror-theme-solarized/package.json +63 -0
- package/node_modules/@uiw/codemirror-theme-solarized/src/dark-color.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-solarized/src/dark.ts +53 -0
- package/node_modules/@uiw/codemirror-theme-solarized/src/index.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-solarized/src/light-color.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-solarized/src/light.ts +53 -0
- package/node_modules/@uiw/codemirror-theme-sublime/README.md +147 -0
- package/node_modules/@uiw/codemirror-theme-sublime/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-sublime/cjs/index.js +73 -0
- package/node_modules/@uiw/codemirror-theme-sublime/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-sublime/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-sublime/esm/index.js +62 -0
- package/node_modules/@uiw/codemirror-theme-sublime/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-sublime/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-sublime/src/index.ts +42 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/cjs/index.js +99 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/esm/index.js +89 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/src/index.ts +51 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/README.md +153 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/cjs/index.js +100 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/esm/index.js +90 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/package.json +51 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/src/index.ts +51 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/README.md +153 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/cjs/index.js +100 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/esm/index.js +90 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/package.json +51 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/src/index.ts +51 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/cjs/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/cjs/color.js +31 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/cjs/index.js +103 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/esm/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/esm/color.js +25 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/esm/index.js +93 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/package.json +45 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/src/color.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/src/index.ts +52 -0
- package/node_modules/@uiw/codemirror-theme-vscode/README.md +161 -0
- package/node_modules/@uiw/codemirror-theme-vscode/cjs/dark.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-vscode/cjs/dark.js +98 -0
- package/node_modules/@uiw/codemirror-theme-vscode/cjs/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-vscode/cjs/index.js +27 -0
- package/node_modules/@uiw/codemirror-theme-vscode/cjs/light.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-vscode/cjs/light.js +98 -0
- package/node_modules/@uiw/codemirror-theme-vscode/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-vscode/esm/dark.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-vscode/esm/dark.js +85 -0
- package/node_modules/@uiw/codemirror-theme-vscode/esm/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-vscode/esm/index.js +2 -0
- package/node_modules/@uiw/codemirror-theme-vscode/esm/light.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-vscode/esm/light.js +85 -0
- package/node_modules/@uiw/codemirror-theme-vscode/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-vscode/package.json +44 -0
- package/node_modules/@uiw/codemirror-theme-vscode/src/dark.ts +82 -0
- package/node_modules/@uiw/codemirror-theme-vscode/src/index.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-vscode/src/light.ts +82 -0
- package/node_modules/@uiw/codemirror-theme-white/README.md +160 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/dark-color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/dark-color.js +32 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/dark.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/dark.js +110 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/index.js +27 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/light-color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/light-color.js +32 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/light.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/light.js +110 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/dark-color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/dark-color.js +26 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/dark.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/dark.js +100 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/index.js +2 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/light-color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/light-color.js +26 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/light.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/light.js +100 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-white/package.json +56 -0
- package/node_modules/@uiw/codemirror-theme-white/src/dark-color.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-white/src/dark.ts +57 -0
- package/node_modules/@uiw/codemirror-theme-white/src/index.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-white/src/light-color.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-white/src/light.ts +57 -0
- package/node_modules/@uiw/codemirror-theme-xcode/README.md +154 -0
- package/node_modules/@uiw/codemirror-theme-xcode/cjs/index.d.ts +9 -0
- package/node_modules/@uiw/codemirror-theme-xcode/cjs/index.js +119 -0
- package/node_modules/@uiw/codemirror-theme-xcode/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-xcode/esm/index.d.ts +9 -0
- package/node_modules/@uiw/codemirror-theme-xcode/esm/index.js +104 -0
- package/node_modules/@uiw/codemirror-theme-xcode/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-xcode/package.json +44 -0
- package/node_modules/@uiw/codemirror-theme-xcode/src/index.ts +75 -0
- package/node_modules/@uiw/codemirror-themes/README.md +391 -0
- package/node_modules/@uiw/codemirror-themes/cjs/index.d.ts +46 -0
- package/node_modules/@uiw/codemirror-themes/cjs/index.js +84 -0
- package/node_modules/@uiw/codemirror-themes/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-themes/esm/index.d.ts +46 -0
- package/node_modules/@uiw/codemirror-themes/esm/index.js +78 -0
- package/node_modules/@uiw/codemirror-themes/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-themes/package.json +56 -0
- package/node_modules/@uiw/codemirror-themes/src/index.tsx +128 -0
- package/node_modules/@uiw/codemirror-themes-all/README.md +406 -0
- package/node_modules/@uiw/codemirror-themes-all/cjs/index.d.ts +35 -0
- package/node_modules/@uiw/codemirror-themes-all/cjs/index.js +390 -0
- package/node_modules/@uiw/codemirror-themes-all/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-themes-all/esm/index.d.ts +35 -0
- package/node_modules/@uiw/codemirror-themes-all/esm/index.js +35 -0
- package/node_modules/@uiw/codemirror-themes-all/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-themes-all/package.json +86 -0
- package/node_modules/@uiw/codemirror-themes-all/src/index.ts +35 -0
- package/package.json +1 -1
- package/packages/cli/package.json +1 -1
- package/packages/daemon/package.json +1 -1
- package/packages/daemon/src/adaptive.js +26 -16
- package/packages/daemon/src/api.js +124 -6
- package/packages/daemon/src/introducer.js +7 -2
- package/packages/daemon/src/journalist.js +62 -24
- package/packages/daemon/src/model-lab.js +6 -5
- package/packages/daemon/src/process.js +11 -8
- package/packages/daemon/src/rotator.js +5 -7
- package/{node_modules/@groove-dev/gui/dist/assets/codemirror-DRQdprYi.js → packages/gui/dist/assets/codemirror-BQqYnZfL.js} +10 -10
- package/packages/gui/dist/assets/index-AkOtskHS.css +1 -0
- package/packages/gui/dist/assets/index-B4uYLR57.js +8694 -0
- package/packages/gui/dist/index.html +3 -3
- package/packages/gui/package.json +2 -1
- package/packages/gui/src/components/agents/code-review.jsx +87 -39
- package/packages/gui/src/components/agents/diff-viewer.jsx +174 -70
- package/packages/gui/src/components/editor/ai-panel.jsx +199 -0
- package/packages/gui/src/components/editor/code-editor.jsx +162 -67
- package/packages/gui/src/components/editor/editor-status-bar.jsx +66 -0
- package/packages/gui/src/components/editor/editor-toolbar.jsx +179 -0
- package/packages/gui/src/components/editor/file-tree.jsx +111 -4
- package/packages/gui/src/components/editor/inline-prompt.jsx +67 -0
- package/packages/gui/src/components/editor/quick-search.jsx +170 -0
- package/packages/gui/src/components/editor/selection-menu.jsx +88 -0
- package/packages/gui/src/components/editor/terminal.jsx +1 -0
- package/packages/gui/src/components/lab/system-prompt-editor.jsx +21 -24
- package/packages/gui/src/components/layout/activity-bar.jsx +5 -9
- package/packages/gui/src/components/layout/terminal-panel.jsx +8 -0
- package/packages/gui/src/components/ui/toast.jsx +13 -8
- package/packages/gui/src/stores/groove.js +75 -2
- package/packages/gui/src/views/agents.jsx +7 -7
- package/packages/gui/src/views/editor.jsx +219 -67
- package/model-workspace/LAB-ASSISTANT-BUILD-PLAN.md +0 -341
- package/node_modules/@groove-dev/gui/dist/assets/index-BrZHF7pK.js +0 -8689
- package/node_modules/@groove-dev/gui/dist/assets/index-DIfiwdKl.css +0 -1
- package/packages/gui/dist/assets/index-BrZHF7pK.js +0 -8689
- package/packages/gui/dist/assets/index-DIfiwdKl.css +0 -1
package/CLAUDE.md
CHANGED
|
@@ -1,7 +1,30 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
1
5
|
# GROOVE — Agent Orchestration Layer
|
|
2
6
|
|
|
3
7
|
> Spawn fast. Stay aware. Never lose context.
|
|
4
8
|
|
|
9
|
+
## Build & Development Commands
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# Build GUI (required after any GUI changes — daemon serves built assets)
|
|
13
|
+
npm run build # or: cd packages/gui && npx vite build
|
|
14
|
+
|
|
15
|
+
# Run all tests (265 tests, 24 suites)
|
|
16
|
+
npm test # or: node --test packages/daemon/test/*.test.js
|
|
17
|
+
|
|
18
|
+
# Run a single test file
|
|
19
|
+
node --test packages/daemon/test/registry.test.js
|
|
20
|
+
|
|
21
|
+
# Dev servers (not for agents — agents use npm run build)
|
|
22
|
+
npm run dev:gui # Vite dev server (HMR)
|
|
23
|
+
npm run dev:daemon # Daemon in dev mode
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Important:** GUI changes require `npm run build` to take effect (daemon serves static build from `packages/gui/dist/`). Daemon changes require a manual daemon restart — agents must NEVER restart the daemon themselves.
|
|
27
|
+
|
|
5
28
|
## What This Is
|
|
6
29
|
|
|
7
30
|
GROOVE is a lightweight, open-source agent orchestration layer for AI coding tools. It is a **process manager** — it spawns, coordinates, and monitors AI coding agents. It does NOT wrap, proxy, or impersonate any AI API.
|
|
@@ -92,7 +115,7 @@ Bundled starter teams: `fullstack.json`, `api-builder.json`, `monorepo.json`
|
|
|
92
115
|
- Tailwind CSS v4 + Radix UI (GUI styling + accessible primitives)
|
|
93
116
|
- Zustand 5 (GUI state + WebSocket sync)
|
|
94
117
|
- React Flow / @xyflow/react (agent tree visualization)
|
|
95
|
-
- CodeMirror 6 (code editor, 7 languages)
|
|
118
|
+
- CodeMirror 6 + @uiw/codemirror-themes-all (code editor, 7 languages, 38 selectable themes)
|
|
96
119
|
- xterm.js (terminal emulation)
|
|
97
120
|
- Framer Motion (animations)
|
|
98
121
|
- Lucide React (icons)
|
|
@@ -201,7 +224,7 @@ React app served by daemon at `http://localhost:31415`. VS Code-style layout. Ta
|
|
|
201
224
|
- Log files created with 0o600 permissions
|
|
202
225
|
- Command injection prevention (execFileSync with array args in tmux)
|
|
203
226
|
- Scope patterns validated (no absolute paths, no traversal)
|
|
204
|
-
-
|
|
227
|
+
- 265 automated tests across 24 suites
|
|
205
228
|
|
|
206
229
|
## Conventions
|
|
207
230
|
|
|
@@ -211,6 +234,15 @@ React app served by daemon at `http://localhost:31415`. VS Code-style layout. Ta
|
|
|
211
234
|
- `.groove/` directory in project root for runtime state (gitignored)
|
|
212
235
|
- Generated markdown files: `AGENTS_REGISTRY.md`, `GROOVE_PROJECT_MAP.md`, `GROOVE_DECISIONS.md`
|
|
213
236
|
|
|
237
|
+
## GUI Styling Rules
|
|
238
|
+
|
|
239
|
+
- **Tailwind CSS v4 only** — zero inline styles (no `style={{}}` except dynamic values like `width`, `height`)
|
|
240
|
+
- **No absolute-positioned floating buttons** over content — use flex layout rails instead
|
|
241
|
+
- **File tree icons** must be neutral/muted (`text-text-2`/`text-text-3`) — no rainbow colors
|
|
242
|
+
- **Editor themes** are user-selectable via status bar picker — do not hardcode syntax highlight colors
|
|
243
|
+
- **Font sizes:** file trees use `text-xs` (12px), editor uses 12px via theme
|
|
244
|
+
- **No inline styles for colors** — use design token CSS variables (`--color-accent`, `--color-danger`, etc.)
|
|
245
|
+
|
|
214
246
|
## Compliance (CRITICAL)
|
|
215
247
|
|
|
216
248
|
GROOVE is a process manager, NOT a harness. Hard rules:
|
|
@@ -98,15 +98,21 @@ export class AdaptiveThresholds {
|
|
|
98
98
|
return { score, threshold: newThreshold, converged: profile.converged };
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
scoreSession(signals) {
|
|
101
|
+
scoreSession(signals, options = {}) {
|
|
102
102
|
// Score 0-100 based on quality signals.
|
|
103
103
|
// Low score → rotate sooner (threshold decreases)
|
|
104
104
|
// High score → allow more context (threshold increases)
|
|
105
|
+
//
|
|
106
|
+
// Self-managing providers (Claude Code) get reduced penalties because
|
|
107
|
+
// their normal debugging patterns — polling, retrying commands, hitting
|
|
108
|
+
// errors during investigation — look identical to degradation signals
|
|
109
|
+
// but are expected productive behavior.
|
|
110
|
+
const selfManages = options.selfManagesContext ?? false;
|
|
105
111
|
let score = 70; // Baseline: decent session
|
|
106
112
|
|
|
107
|
-
// Error rate:
|
|
113
|
+
// Error rate: -5 per error normally, -2 for self-managing (errors during debugging are expected)
|
|
108
114
|
const errorCount = signals.errorCount || 0;
|
|
109
|
-
score -= errorCount * 5;
|
|
115
|
+
score -= errorCount * (selfManages ? 2 : 5);
|
|
110
116
|
|
|
111
117
|
// Repetitions: 3+ Write/Edit to the same file in a sliding window
|
|
112
118
|
const repetitions = signals.repetitions || 0;
|
|
@@ -121,7 +127,7 @@ export class AdaptiveThresholds {
|
|
|
121
127
|
const toolFailures = signals.toolFailures || 0;
|
|
122
128
|
if (toolCalls > 0) {
|
|
123
129
|
const successRate = (toolCalls - toolFailures) / toolCalls;
|
|
124
|
-
score += Math.round((successRate - 0.8) * 20);
|
|
130
|
+
score += Math.round((successRate - 0.8) * (selfManages ? 10 : 20));
|
|
125
131
|
}
|
|
126
132
|
|
|
127
133
|
// File churn: same file written 5+ times — genuine circular refactoring
|
|
@@ -130,26 +136,30 @@ export class AdaptiveThresholds {
|
|
|
130
136
|
|
|
131
137
|
// Error trend: increasing errors in second half = degradation
|
|
132
138
|
const errorTrend = signals.errorTrend || 0;
|
|
133
|
-
if (errorTrend > 0) score -= errorTrend * 6;
|
|
134
|
-
if (errorTrend < 0) score += 3;
|
|
139
|
+
if (errorTrend > 0) score -= errorTrend * (selfManages ? 3 : 6);
|
|
140
|
+
if (errorTrend < 0) score += 3;
|
|
135
141
|
|
|
136
142
|
// Files written: productivity signal
|
|
137
143
|
const filesWritten = signals.filesWritten || 0;
|
|
138
144
|
score += Math.min(filesWritten * 2, 10); // Cap at +10
|
|
139
145
|
|
|
140
|
-
//
|
|
141
|
-
|
|
146
|
+
// The following signals are skipped for self-managing providers because
|
|
147
|
+
// they're false positives during debugging:
|
|
148
|
+
// - outputLengthDecay: shorter responses = narrowing in on a problem
|
|
149
|
+
// - toolOutputVolume: reading logs/large files is expected
|
|
150
|
+
// - turnLatencyTrend: thinking longer about hard problems is fine
|
|
151
|
+
// - bashRepetition: polling (sleep + check) is a normal pattern
|
|
152
|
+
if (!selfManages) {
|
|
153
|
+
if (signals.outputLengthDecay) score -= 10;
|
|
142
154
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
else if (toolVol === 1) score -= 5;
|
|
155
|
+
const toolVol = signals.toolOutputVolume || 0;
|
|
156
|
+
if (toolVol === 2) score -= 10;
|
|
157
|
+
else if (toolVol === 1) score -= 5;
|
|
147
158
|
|
|
148
|
-
|
|
149
|
-
if (signals.turnLatencyTrend) score -= 5;
|
|
159
|
+
if (signals.turnLatencyTrend) score -= 5;
|
|
150
160
|
|
|
151
|
-
|
|
152
|
-
|
|
161
|
+
if (signals.bashRepetition) score -= 8;
|
|
162
|
+
}
|
|
153
163
|
|
|
154
164
|
// Clamp to 0-100
|
|
155
165
|
return Math.max(0, Math.min(100, score));
|
|
@@ -1693,18 +1693,29 @@ export function createApi(app, daemon) {
|
|
|
1693
1693
|
// Rotation = full handoff brief (only for degradation or no session)
|
|
1694
1694
|
app.post('/api/agents/:id/instruct', async (req, res) => {
|
|
1695
1695
|
try {
|
|
1696
|
-
const { message } = req.body;
|
|
1696
|
+
const { message, codeContext } = req.body;
|
|
1697
1697
|
if (!message || typeof message !== 'string' || !message.trim()) {
|
|
1698
1698
|
return res.status(400).json({ error: 'message is required' });
|
|
1699
1699
|
}
|
|
1700
1700
|
const agent = daemon.registry.get(req.params.id);
|
|
1701
1701
|
if (!agent) return res.status(404).json({ error: 'Agent not found' });
|
|
1702
1702
|
|
|
1703
|
+
// Build the final instruction, optionally enriched with code context
|
|
1704
|
+
let finalMessage = message.trim();
|
|
1705
|
+
if (codeContext && typeof codeContext === 'object') {
|
|
1706
|
+
const { filePath, lineStart, lineEnd, selectedCode } = codeContext;
|
|
1707
|
+
if (filePath && typeof filePath === 'string' && selectedCode && typeof selectedCode === 'string') {
|
|
1708
|
+
const start = Number.isFinite(lineStart) ? lineStart : '?';
|
|
1709
|
+
const end = Number.isFinite(lineEnd) ? lineEnd : '?';
|
|
1710
|
+
finalMessage = `${finalMessage}\n\nCode context from ${filePath} (lines ${start}-${end}):\n\`\`\`\n${selectedCode}\n\`\`\``;
|
|
1711
|
+
}
|
|
1712
|
+
}
|
|
1713
|
+
|
|
1703
1714
|
// Record user feedback so the journalist can include it in future agent context
|
|
1704
|
-
if (daemon.journalist) daemon.journalist.recordUserFeedback(agent,
|
|
1715
|
+
if (daemon.journalist) daemon.journalist.recordUserFeedback(agent, finalMessage);
|
|
1705
1716
|
|
|
1706
1717
|
// Agent loop path — send message directly to the running loop
|
|
1707
|
-
const wrappedMessage = wrapWithRoleReminder(agent.role,
|
|
1718
|
+
const wrappedMessage = wrapWithRoleReminder(agent.role, finalMessage);
|
|
1708
1719
|
if (daemon.processes.hasAgentLoop(req.params.id)) {
|
|
1709
1720
|
const sent = await daemon.processes.sendMessage(req.params.id, wrappedMessage);
|
|
1710
1721
|
if (sent) {
|
|
@@ -1731,7 +1742,7 @@ export function createApi(app, daemon) {
|
|
|
1731
1742
|
scope: oldConfig.scope,
|
|
1732
1743
|
provider: oldConfig.provider,
|
|
1733
1744
|
model: oldConfig.model,
|
|
1734
|
-
prompt:
|
|
1745
|
+
prompt: finalMessage,
|
|
1735
1746
|
permission: oldConfig.permission || 'full',
|
|
1736
1747
|
workingDir: oldConfig.workingDir,
|
|
1737
1748
|
name: oldConfig.name,
|
|
@@ -1754,7 +1765,7 @@ export function createApi(app, daemon) {
|
|
|
1754
1765
|
scope: oldConfig.scope,
|
|
1755
1766
|
provider: oldConfig.provider,
|
|
1756
1767
|
model: oldConfig.model,
|
|
1757
|
-
prompt:
|
|
1768
|
+
prompt: finalMessage,
|
|
1758
1769
|
introContext: oldConfig.introContext,
|
|
1759
1770
|
permission: oldConfig.permission || 'full',
|
|
1760
1771
|
workingDir: oldConfig.workingDir,
|
|
@@ -3340,11 +3351,118 @@ Keep responses concise. Help them think, don't lecture them about the system the
|
|
|
3340
3351
|
});
|
|
3341
3352
|
});
|
|
3342
3353
|
|
|
3354
|
+
// Git line status — per-line modification status for editor gutter decorations
|
|
3355
|
+
app.get('/api/files/git-line-status', (req, res) => {
|
|
3356
|
+
const relPath = req.query.path;
|
|
3357
|
+
if (!relPath || typeof relPath !== 'string') {
|
|
3358
|
+
return res.status(400).json({ error: 'path parameter is required' });
|
|
3359
|
+
}
|
|
3360
|
+
if (relPath.includes('\0') || relPath.startsWith('/')) {
|
|
3361
|
+
return res.status(400).json({ error: 'Invalid path' });
|
|
3362
|
+
}
|
|
3363
|
+
const segments = relPath.split(/[/\\]/);
|
|
3364
|
+
if (segments.some(s => s === '..')) {
|
|
3365
|
+
return res.status(400).json({ error: 'Path traversal not allowed' });
|
|
3366
|
+
}
|
|
3367
|
+
|
|
3368
|
+
const rootDir = getEditorRoot();
|
|
3369
|
+
if (!rootDir) return res.status(400).json({ error: 'Editor root not set' });
|
|
3370
|
+
|
|
3371
|
+
const fullPath = resolve(rootDir, relPath);
|
|
3372
|
+
if (!fullPath.startsWith(rootDir + sep) && fullPath !== rootDir) {
|
|
3373
|
+
return res.status(400).json({ error: 'Path outside project' });
|
|
3374
|
+
}
|
|
3375
|
+
|
|
3376
|
+
const result = { lines: { added: [], modified: [], deleted: [] } };
|
|
3377
|
+
|
|
3378
|
+
// Check if file is tracked by git
|
|
3379
|
+
try {
|
|
3380
|
+
execFileSync('git', ['ls-files', '--error-unmatch', '--', relPath], { cwd: rootDir, timeout: 5000, stdio: 'pipe' });
|
|
3381
|
+
} catch {
|
|
3382
|
+
// File not tracked — check if it exists (untracked = all lines added)
|
|
3383
|
+
if (existsSync(fullPath)) {
|
|
3384
|
+
try {
|
|
3385
|
+
const content = readFileSync(fullPath, 'utf8');
|
|
3386
|
+
const lineCount = content.split('\n').length;
|
|
3387
|
+
for (let i = 1; i <= lineCount; i++) result.lines.added.push(i);
|
|
3388
|
+
} catch { /* binary or unreadable */ }
|
|
3389
|
+
}
|
|
3390
|
+
return res.json(result);
|
|
3391
|
+
}
|
|
3392
|
+
|
|
3393
|
+
try {
|
|
3394
|
+
const diffOut = execFileSync('git', ['diff', '--unified=0', '--', relPath], {
|
|
3395
|
+
cwd: rootDir, timeout: 10000, maxBuffer: 5 * 1024 * 1024,
|
|
3396
|
+
}).toString();
|
|
3397
|
+
|
|
3398
|
+
if (!diffOut.trim()) return res.json(result);
|
|
3399
|
+
|
|
3400
|
+
// Check for binary
|
|
3401
|
+
if (diffOut.includes('Binary files')) return res.json(result);
|
|
3402
|
+
|
|
3403
|
+
// Parse unified diff hunks: @@ -oldStart,oldCount +newStart,newCount @@
|
|
3404
|
+
const hunkRe = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/gm;
|
|
3405
|
+
let match;
|
|
3406
|
+
while ((match = hunkRe.exec(diffOut)) !== null) {
|
|
3407
|
+
const oldCount = parseInt(match[2] ?? '1', 10);
|
|
3408
|
+
const newStart = parseInt(match[3], 10);
|
|
3409
|
+
const newCount = parseInt(match[4] ?? '1', 10);
|
|
3410
|
+
|
|
3411
|
+
if (oldCount === 0 && newCount > 0) {
|
|
3412
|
+
// Pure addition
|
|
3413
|
+
for (let i = newStart; i < newStart + newCount; i++) result.lines.added.push(i);
|
|
3414
|
+
} else if (newCount === 0 && oldCount > 0) {
|
|
3415
|
+
// Pure deletion — mark the line where content was removed
|
|
3416
|
+
result.lines.deleted.push(newStart);
|
|
3417
|
+
} else {
|
|
3418
|
+
// Modification
|
|
3419
|
+
for (let i = newStart; i < newStart + newCount; i++) result.lines.modified.push(i);
|
|
3420
|
+
}
|
|
3421
|
+
}
|
|
3422
|
+
|
|
3423
|
+
res.json(result);
|
|
3424
|
+
} catch (err) {
|
|
3425
|
+
if (err.status !== undefined) return res.json(result);
|
|
3426
|
+
res.status(500).json({ error: 'Failed to compute line status' });
|
|
3427
|
+
}
|
|
3428
|
+
});
|
|
3429
|
+
|
|
3430
|
+
// Git branches — list all local branches with current branch marked
|
|
3431
|
+
app.get('/api/files/git-branches', (req, res) => {
|
|
3432
|
+
const rootDir = getEditorRoot();
|
|
3433
|
+
if (!rootDir) return res.status(400).json({ error: 'Editor root not set' });
|
|
3434
|
+
|
|
3435
|
+
const fallback = { current: null, branches: [] };
|
|
3436
|
+
|
|
3437
|
+
try {
|
|
3438
|
+
let current = null;
|
|
3439
|
+
try {
|
|
3440
|
+
current = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
|
|
3441
|
+
cwd: rootDir, timeout: 5000, stdio: 'pipe',
|
|
3442
|
+
}).toString().trim();
|
|
3443
|
+
} catch { return res.json(fallback); }
|
|
3444
|
+
|
|
3445
|
+
const branchOut = execFileSync('git', ['branch', '--list', '--format=%(refname:short)'], {
|
|
3446
|
+
cwd: rootDir, timeout: 5000, stdio: 'pipe',
|
|
3447
|
+
}).toString();
|
|
3448
|
+
|
|
3449
|
+
const branches = branchOut.split('\n').map(b => b.trim()).filter(Boolean);
|
|
3450
|
+
res.json({ current, branches });
|
|
3451
|
+
} catch {
|
|
3452
|
+
res.json(fallback);
|
|
3453
|
+
}
|
|
3454
|
+
});
|
|
3455
|
+
|
|
3343
3456
|
// Files touched by an agent during its session
|
|
3344
3457
|
app.get('/api/agents/:id/files-touched', (req, res) => {
|
|
3345
3458
|
const agent = daemon.registry.get(req.params.id);
|
|
3346
3459
|
if (!agent) return res.status(404).json({ error: 'Agent not found' });
|
|
3347
|
-
const
|
|
3460
|
+
const rawFiles = daemon.registry.getFilesTouched(req.params.id);
|
|
3461
|
+
const rootDir = agent.workingDir || daemon.projectDir;
|
|
3462
|
+
const files = rawFiles.map(f => {
|
|
3463
|
+
const fullPath = isAbsolute(f.path) ? f.path : resolve(rootDir, f.path);
|
|
3464
|
+
return { ...f, exists: existsSync(fullPath) };
|
|
3465
|
+
});
|
|
3348
3466
|
res.json({ files, total: files.length });
|
|
3349
3467
|
});
|
|
3350
3468
|
|
|
@@ -173,12 +173,17 @@ export class Introducer {
|
|
|
173
173
|
}
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
-
// Project files section — tell the new agent what exists
|
|
176
|
+
// Project files section — tell the new agent what exists
|
|
177
|
+
// When no task is assigned, list files as reference only (not an action prompt)
|
|
177
178
|
if (allTeamFiles.length > 0) {
|
|
178
179
|
lines.push('');
|
|
179
180
|
lines.push(`## Project Files`);
|
|
180
181
|
lines.push('');
|
|
181
|
-
|
|
182
|
+
if (hasTask || isRotation) {
|
|
183
|
+
lines.push(`Your team has created the following files. **Read relevant ones before starting work** to understand what's been built and planned:`);
|
|
184
|
+
} else {
|
|
185
|
+
lines.push(`Your team has created the following files (for reference — do NOT read or act on these until you receive a task):`);
|
|
186
|
+
}
|
|
182
187
|
lines.push('');
|
|
183
188
|
|
|
184
189
|
// Group by agent for clarity
|
|
@@ -443,24 +443,47 @@ export class Journalist {
|
|
|
443
443
|
`Scope: ${agent.scope?.join(', ') || 'unrestricted'}${dir}`,
|
|
444
444
|
`Rotation reason: ${reason}`,
|
|
445
445
|
'',
|
|
446
|
-
'Analyze the session log below and produce a structured handoff brief.',
|
|
446
|
+
'Analyze the FULL session log below and produce a structured handoff brief.',
|
|
447
|
+
'The next agent must be able to continue this work without repeating anything.',
|
|
447
448
|
'',
|
|
448
449
|
'Output EXACTLY these sections, in this priority order:',
|
|
449
450
|
'',
|
|
451
|
+
'## Investigation Path',
|
|
452
|
+
'(Chronological narrative of what was explored and why. For each major step:',
|
|
453
|
+
' what was tried, what the result was, and whether it was ruled out or remains viable.',
|
|
454
|
+
' The next agent must know the full path taken to avoid retreading ground.)',
|
|
455
|
+
'',
|
|
456
|
+
'## Current State',
|
|
457
|
+
'(Where things stand right now. What is the current hypothesis or approach?',
|
|
458
|
+
' What was the agent actively working on when rotated? What is the next step?)',
|
|
459
|
+
'',
|
|
460
|
+
'## What Was Ruled Out',
|
|
461
|
+
'(Approaches, files, or theories that were investigated and eliminated.',
|
|
462
|
+
' Include WHY each was ruled out so the next agent does not retry them.)',
|
|
463
|
+
'',
|
|
464
|
+
'## Key Findings',
|
|
465
|
+
'(Important discoveries: root causes identified, relevant code locations,',
|
|
466
|
+
' configuration details, error patterns, dependencies found. Name files,',
|
|
467
|
+
' functions, and line numbers.)',
|
|
468
|
+
'',
|
|
450
469
|
'## Unresolved Errors',
|
|
451
|
-
'(
|
|
470
|
+
'(Errors still occurring. Include exact error messages and context.)',
|
|
471
|
+
'',
|
|
472
|
+
'## User Messages',
|
|
473
|
+
'(EVERY message the user typed, verbatim or near-verbatim. These are critical —',
|
|
474
|
+
' the user must never have to repeat themselves after a rotation. Include all',
|
|
475
|
+
' instructions, questions, corrections, and context the user provided.)',
|
|
452
476
|
'',
|
|
453
477
|
'## User Constraints',
|
|
454
478
|
'(Explicit user directives, must/never/avoid/use instructions.)',
|
|
455
479
|
'',
|
|
456
|
-
'## Last
|
|
480
|
+
'## Last 15 Tool Calls',
|
|
457
481
|
'(Compact list of the most recent meaningful tool calls and outcomes.)',
|
|
458
482
|
'',
|
|
459
|
-
'## Accomplishments',
|
|
460
|
-
'(What was completed. Name files, functions, and line numbers.)',
|
|
461
|
-
'',
|
|
462
483
|
'Be specific. Name files, functions, and line numbers. Do not summarize vaguely.',
|
|
463
|
-
'
|
|
484
|
+
'Preserve the investigation narrative — the next agent needs to understand the',
|
|
485
|
+
'journey, not just the destination.',
|
|
486
|
+
'Keep your response under 4000 characters.',
|
|
464
487
|
'',
|
|
465
488
|
'---',
|
|
466
489
|
'',
|
|
@@ -469,8 +492,8 @@ export class Journalist {
|
|
|
469
492
|
];
|
|
470
493
|
|
|
471
494
|
let totalChars = 0;
|
|
472
|
-
const cap =
|
|
473
|
-
for (const entry of entries.slice(-
|
|
495
|
+
const cap = 40_000;
|
|
496
|
+
for (const entry of entries.slice(-500)) {
|
|
474
497
|
const line = this.formatEntry(entry);
|
|
475
498
|
if (totalChars + line.length > cap) break;
|
|
476
499
|
parts.push(line);
|
|
@@ -861,7 +884,14 @@ export class Journalist {
|
|
|
861
884
|
? `- Quality profile: ${specialization.avgQualityScore}/100 across ${specialization.sessionCount} sessions`
|
|
862
885
|
: '';
|
|
863
886
|
|
|
864
|
-
const recentChain = this.daemon.memory?.getRecentHandoffMarkdown(agent.role,
|
|
887
|
+
const recentChain = this.daemon.memory?.getRecentHandoffMarkdown(agent.role, 3, 3000, agent.workingDir, agent.teamId) || '';
|
|
888
|
+
|
|
889
|
+
// User messages from the session log — these are the actual things the user typed.
|
|
890
|
+
// They must always be preserved: if a user said it, the next agent needs to see it.
|
|
891
|
+
const userMessages = entries
|
|
892
|
+
.filter((e) => e.type === 'user' && e.text)
|
|
893
|
+
.map((e) => `- "${e.text.slice(0, 500)}"`)
|
|
894
|
+
.join('\n');
|
|
865
895
|
|
|
866
896
|
const agentFeedback = this.getUserFeedback(agent.id).slice(-5);
|
|
867
897
|
const conversationSummary = agentFeedback.length > 0
|
|
@@ -870,7 +900,7 @@ export class Journalist {
|
|
|
870
900
|
|
|
871
901
|
const recentTools = entries
|
|
872
902
|
.filter((e) => e.type === 'tool' || e.type === 'error')
|
|
873
|
-
.slice(-
|
|
903
|
+
.slice(-15)
|
|
874
904
|
.map((e) => `- ${e.type === 'error' ? 'ERROR ' : ''}${e.tool}: ${(e.input || e.text || '').slice(0, 200)}`)
|
|
875
905
|
.join('\n');
|
|
876
906
|
|
|
@@ -907,24 +937,32 @@ export class Journalist {
|
|
|
907
937
|
|
|
908
938
|
const fallbackRecentTools = entries
|
|
909
939
|
.filter((e) => e.type === 'tool' || e.type === 'error')
|
|
910
|
-
.slice(-
|
|
940
|
+
.slice(-15)
|
|
911
941
|
.map((e) => `- ${e.type === 'error' ? 'ERROR ' : ''}${e.tool}: ${(e.input || '').slice(0, 200)}`)
|
|
912
942
|
.join('\n');
|
|
913
943
|
|
|
944
|
+
// Build investigation timeline from thinking entries — these capture reasoning and decisions
|
|
945
|
+
const thinkingEntries = entries
|
|
946
|
+
.filter((e) => e.type === 'thinking' && e.text && e.text.length > 80)
|
|
947
|
+
.slice(-10)
|
|
948
|
+
.map((e) => `- ${e.text.slice(0, 400)}`)
|
|
949
|
+
.join('\n');
|
|
950
|
+
|
|
914
951
|
const fallbackParts = [];
|
|
952
|
+
if (thinkingEntries) fallbackParts.push(`## Investigation Path\n\n${thinkingEntries}`);
|
|
915
953
|
if (errorSummary) fallbackParts.push(`## Unresolved Errors\n\n${errorSummary}`);
|
|
916
|
-
if (fallbackRecentTools) fallbackParts.push(`## Last
|
|
954
|
+
if (fallbackRecentTools) fallbackParts.push(`## Last 15 Tool Calls\n\n${fallbackRecentTools}`);
|
|
917
955
|
if (fileChangesSummary) fallbackParts.push(`## Files Modified\n\n${fileChangesSummary}`);
|
|
918
956
|
if (resultSummary) fallbackParts.push(`## Accomplishments\n\n${resultSummary}`);
|
|
919
957
|
sessionSummary = fallbackParts.join('\n\n');
|
|
920
958
|
}
|
|
921
959
|
|
|
922
|
-
// For quality_degradation rotations, drop user messages (already in session summary)
|
|
923
|
-
const includeUserMessages = options.reason !== 'quality_degradation';
|
|
924
|
-
|
|
925
960
|
// Cap Original Task to 1000 chars — task descriptions for debugging can be long
|
|
926
961
|
const originalTask = agent.prompt ? agent.prompt.slice(0, 1000) + (agent.prompt.length > 1000 ? '…' : '') : '';
|
|
927
962
|
|
|
963
|
+
// Combine user messages from session log and feedback API — never drop these
|
|
964
|
+
const allUserMessages = [userMessages, conversationSummary].filter(Boolean).join('\n');
|
|
965
|
+
|
|
928
966
|
let brief = [
|
|
929
967
|
`# Handoff Brief — ${agent.name} (${agent.role})`,
|
|
930
968
|
``,
|
|
@@ -933,14 +971,14 @@ export class Journalist {
|
|
|
933
971
|
`Rotation: ${options.reason || 'manual'}${options.qualityScore ? ` (quality: ${options.qualityScore}/100)` : ''} | Tokens: ${agent.tokensUsed}`,
|
|
934
972
|
specLine,
|
|
935
973
|
``,
|
|
936
|
-
// Priority order: session summary (
|
|
937
|
-
//
|
|
938
|
-
//
|
|
974
|
+
// Priority order: session summary first, then user messages (never drop —
|
|
975
|
+
// if the user typed it, the next agent must see it), then constraints,
|
|
976
|
+
// then discoveries, then tools. Most critical context survives truncation.
|
|
939
977
|
sessionSummary ? `## Session Summary\n\n${sessionSummary}\n` : '',
|
|
978
|
+
allUserMessages ? `## User Messages (do not ask user to repeat these)\n\n${allUserMessages}\n` : '',
|
|
940
979
|
constraints ? `## Project Constraints (must follow)\n\n${constraints}\n` : '',
|
|
941
980
|
discoveries ? `## Known Issues & Fixes\n\n${discoveries}\n` : '',
|
|
942
|
-
recentTools ? `## Last
|
|
943
|
-
includeUserMessages && conversationSummary ? `## Recent User Messages\n\n${conversationSummary}\n` : '',
|
|
981
|
+
recentTools ? `## Last 15 Tool Calls\n\n${recentTools}\n` : '',
|
|
944
982
|
recentChain ? `## Rotation History\n\n${recentChain}\n` : '',
|
|
945
983
|
originalTask ? `## Original Task\n\n${originalTask}\n` : '',
|
|
946
984
|
``,
|
|
@@ -948,9 +986,9 @@ export class Journalist {
|
|
|
948
986
|
`Continue seamlessly — finish the work and deliver the output.`,
|
|
949
987
|
].filter(Boolean).join('\n');
|
|
950
988
|
|
|
951
|
-
// Hard cap:
|
|
952
|
-
if (brief.length >
|
|
953
|
-
brief = brief.slice(0,
|
|
989
|
+
// Hard cap: 16000 chars — investigation context needs room to preserve the full narrative
|
|
990
|
+
if (brief.length > 16000) {
|
|
991
|
+
brief = brief.slice(0, 15950) + '\n\n[Brief truncated — see session logs for full context]';
|
|
954
992
|
}
|
|
955
993
|
|
|
956
994
|
return brief;
|
|
@@ -4,8 +4,6 @@
|
|
|
4
4
|
import { resolve } from 'path';
|
|
5
5
|
import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, unlinkSync } from 'fs';
|
|
6
6
|
import { randomUUID } from 'crypto';
|
|
7
|
-
import { Readable } from 'stream';
|
|
8
|
-
|
|
9
7
|
const RUNTIME_TYPES = ['ollama', 'vllm', 'llama-cpp', 'tgi', 'openai-compatible'];
|
|
10
8
|
const DEFAULT_OLLAMA_ENDPOINT = 'http://localhost:11434';
|
|
11
9
|
|
|
@@ -249,11 +247,14 @@ export class ModelLab {
|
|
|
249
247
|
throw new Error(errMsg);
|
|
250
248
|
}
|
|
251
249
|
|
|
252
|
-
const
|
|
250
|
+
const reader = resp.body.getReader();
|
|
251
|
+
const decoder = new TextDecoder();
|
|
253
252
|
let buffer = '';
|
|
254
253
|
|
|
255
|
-
|
|
256
|
-
|
|
254
|
+
while (true) {
|
|
255
|
+
const { done, value } = await reader.read();
|
|
256
|
+
if (done) break;
|
|
257
|
+
buffer += decoder.decode(value, { stream: true });
|
|
257
258
|
const lines = buffer.split('\n');
|
|
258
259
|
buffer = lines.pop() || '';
|
|
259
260
|
|
|
@@ -887,23 +887,26 @@ export class ProcessManager {
|
|
|
887
887
|
}
|
|
888
888
|
}
|
|
889
889
|
|
|
890
|
+
// Compute hasTask from actual prompt content — agents spawned without a
|
|
891
|
+
// prompt should NOT receive handoff history (prevents cross-team contamination).
|
|
892
|
+
// Discoveries + constraints are always injected (project knowledge).
|
|
893
|
+
// Handoffs are injected only when the agent has a real task or is a rotation.
|
|
894
|
+
const hasTask = !!(config.prompt && config.prompt.trim().length > 0);
|
|
895
|
+
const isRotation = !!(config.isRotation);
|
|
896
|
+
|
|
890
897
|
// Pre-spawn task negotiation — if same-role agents are running,
|
|
891
|
-
// query them about current work so the new agent gets a clear assignment
|
|
898
|
+
// query them about current work so the new agent gets a clear assignment.
|
|
899
|
+
// Only negotiate when the agent has a task — otherwise the negotiator
|
|
900
|
+
// output acts as an implicit task and the agent starts working immediately.
|
|
892
901
|
const sameRole = registry.getAll().filter(
|
|
893
902
|
(a) => a.role === config.role && a.id !== agent.id &&
|
|
894
903
|
(a.status === 'running' || a.status === 'starting')
|
|
895
904
|
);
|
|
896
905
|
let taskNegotiation = '';
|
|
897
|
-
if (sameRole.length > 0) {
|
|
906
|
+
if (sameRole.length > 0 && (hasTask || isRotation)) {
|
|
898
907
|
taskNegotiation = await this.negotiateTaskSplit(agent, sameRole);
|
|
899
908
|
}
|
|
900
909
|
|
|
901
|
-
// Compute hasTask from actual prompt content — agents spawned without a
|
|
902
|
-
// prompt should NOT receive handoff history (prevents cross-team contamination).
|
|
903
|
-
// Discoveries + constraints are always injected (project knowledge).
|
|
904
|
-
// Handoffs are injected only when the agent has a real task or is a rotation.
|
|
905
|
-
const hasTask = !!(config.prompt && config.prompt.trim().length > 0);
|
|
906
|
-
const isRotation = !!(config.isRotation);
|
|
907
910
|
let introContext = introducer.generateContext(agent, { taskNegotiation, hasTask, isRotation });
|
|
908
911
|
|
|
909
912
|
// Intro context size warning and optional truncation (Change 7)
|
|
@@ -145,15 +145,12 @@ export class Rotator extends EventEmitter {
|
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
const signals = signalsEarly;
|
|
148
|
-
|
|
148
|
+
const providerForScore = getProvider(agent.provider);
|
|
149
|
+
const selfManages = providerForScore?.constructor?.managesOwnContext ?? false;
|
|
150
|
+
let score = this.daemon.adaptive.scoreSession(signals, { selfManagesContext: selfManages });
|
|
149
151
|
|
|
150
152
|
// Age penalties: only for providers that don't manage their own context.
|
|
151
|
-
|
|
152
|
-
// are normal and productive. Penalizing age causes premature rotation
|
|
153
|
-
// that destroys active debugging context and creates restart loops.
|
|
154
|
-
const providerForAge = getProvider(agent.provider);
|
|
155
|
-
const selfManagesForAge = providerForAge?.constructor?.managesOwnContext ?? false;
|
|
156
|
-
if (!selfManagesForAge) {
|
|
153
|
+
if (!selfManages) {
|
|
157
154
|
if (ageSec > 1800) score -= 5;
|
|
158
155
|
if (ageSec > 3600) score -= 10;
|
|
159
156
|
if (ageSec > 7200) score -= 15;
|
|
@@ -385,6 +382,7 @@ export class Rotator extends EventEmitter {
|
|
|
385
382
|
contextUsage: agent.contextUsage,
|
|
386
383
|
reason: options.reason || 'manual',
|
|
387
384
|
qualityScore: options.qualityScore || null,
|
|
385
|
+
qualitySignals: options.signals || null,
|
|
388
386
|
timestamp: new Date().toISOString(),
|
|
389
387
|
};
|
|
390
388
|
|