groove-dev 0.26.3 → 0.26.4

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.
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="icon" type="image/png" href="/favicon.png" />
7
7
  <title>Groove GUI</title>
8
- <script type="module" crossorigin src="/assets/index-BgKM8VOT.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-CXBK_GNM.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/vendor-C0HXlhrU.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/reactflow-BQPfi37R.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/codemirror-BBL3i_JW.js">
@@ -109,7 +109,7 @@ function ProviderCard({ provider, onKeyChange }) {
109
109
  return (
110
110
  <div className="flex flex-col rounded-lg border border-border-subtle bg-surface-1 overflow-hidden min-w-[220px]">
111
111
  <div className="flex items-center gap-2.5 px-4 py-3 border-b border-border-subtle">
112
- <StatusDot status={isReady ? 'running' : 'crashed'} size="sm" />
112
+ <StatusDot status={isReady && installedCount > 0 ? 'running' : 'crashed'} size="sm" />
113
113
  <span className="text-[13px] font-semibold text-text-0 font-sans">{provider.name}</span>
114
114
  <div className="flex-1" />
115
115
  {isReady && installedCount > 0 ? (
@@ -117,49 +117,45 @@ function ProviderCard({ provider, onKeyChange }) {
117
117
  ) : isReady ? (
118
118
  <Badge variant="warning" className="text-2xs">No models pulled</Badge>
119
119
  ) : (
120
- <Badge variant="default" className="text-2xs">Ollama not installed</Badge>
120
+ <Badge variant="default" className="text-2xs">Not set up</Badge>
121
121
  )}
122
122
  </div>
123
123
  <div className="flex-1">
124
124
  {ollamaOpen ? (
125
- <OllamaSetup isInstalled={isReady} onModelChange={onKeyChange} />
125
+ <>
126
+ <OllamaSetup isInstalled={isReady} onModelChange={onKeyChange} />
127
+ <div className="px-4 py-2 border-t border-border-subtle flex gap-2">
128
+ <Button variant="ghost" size="sm" onClick={() => setOllamaOpen(false)} className="flex-1 h-7 text-2xs">
129
+ Back
130
+ </Button>
131
+ <Button variant="secondary" size="sm" onClick={() => { setOllamaOpen(false); goToModels(); }} className="flex-1 h-7 text-2xs gap-1">
132
+ Models Tab
133
+ </Button>
134
+ </div>
135
+ </>
126
136
  ) : (
127
137
  <div className="px-4 py-3 flex flex-col h-full">
128
138
  <div className="text-xs text-text-3 font-sans flex-1">
129
139
  {isReady && installedCount > 0
130
140
  ? 'Full agentic runtime — tool calling, context rotation, zero cloud cost'
131
141
  : isReady
132
- ? 'Ollama is running but no models pulled yet. Pull a model or browse the Models tab.'
133
- : 'Run any open-source model on your machine — free, private, fully offline'}
142
+ ? 'Ollama is running. Pull a model to start using local agents.'
143
+ : 'Run any open-source model locally — free, private, fully offline. Requires Ollama.'}
134
144
  </div>
135
- {!isReady ? (
136
- <Button
137
- variant="primary"
138
- size="sm"
139
- onClick={() => setOllamaOpen(true)}
140
- className="w-full h-7 text-2xs gap-1.5 mt-3"
141
- >
142
- <Cpu size={11} /> Set Up Ollama
143
- </Button>
144
- ) : installedCount === 0 ? (
145
- <div className="flex gap-2 mt-3">
145
+ <div className="flex gap-2 mt-3">
146
+ {!isReady ? (
146
147
  <Button variant="primary" size="sm" onClick={() => setOllamaOpen(true)} className="flex-1 h-7 text-2xs gap-1.5">
147
- <Cpu size={11} /> Pull Models
148
- </Button>
149
- <Button variant="secondary" size="sm" onClick={goToModels} className="flex-1 h-7 text-2xs gap-1.5">
150
- Browse HuggingFace
151
- </Button>
152
- </div>
153
- ) : (
154
- <div className="flex gap-2 mt-3">
155
- <Button variant="secondary" size="sm" onClick={() => setOllamaOpen(true)} className="flex-1 h-7 text-2xs gap-1.5">
156
- <Cpu size={11} /> Manage
148
+ <Cpu size={11} /> Set Up Ollama
157
149
  </Button>
158
- <Button variant="secondary" size="sm" onClick={goToModels} className="flex-1 h-7 text-2xs gap-1.5">
159
- Browse Models
150
+ ) : (
151
+ <Button variant="primary" size="sm" onClick={() => setOllamaOpen(true)} className="flex-1 h-7 text-2xs gap-1.5">
152
+ <Cpu size={11} /> {installedCount > 0 ? 'Manage' : 'Pull Models'}
160
153
  </Button>
161
- </div>
162
- )}
154
+ )}
155
+ <Button variant="secondary" size="sm" onClick={goToModels} className="flex-1 h-7 text-2xs gap-1.5">
156
+ Models Tab
157
+ </Button>
158
+ </div>
163
159
  </div>
164
160
  )}
165
161
  </div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "groove-dev",
3
- "version": "0.26.3",
3
+ "version": "0.26.4",
4
4
  "description": "Open-source agent orchestration layer — the AI company OS. Local model agent engine (GGUF/Ollama/llama-server), HuggingFace model browser, MCP integrations (Slack, Gmail, Stripe, 15+), agent scheduling (cron), business roles (CMO, CFO, EA). GUI dashboard, multi-agent coordination, zero cold-start, infinite sessions. Works with Claude Code, Codex, Gemini CLI, Ollama, any local model.",
5
5
  "license": "FSL-1.1-Apache-2.0",
6
6
  "author": "Groove Dev <hello@groovedev.ai> (https://groovedev.ai)",
@@ -184,7 +184,7 @@ export class OllamaProvider extends Provider {
184
184
 
185
185
  static getInstalledModels() {
186
186
  try {
187
- const output = execSync('ollama list', { encoding: 'utf8', timeout: 10000 });
187
+ const output = execSync('ollama list', { encoding: 'utf8', timeout: 10000, stdio: ['pipe', 'pipe', 'pipe'] });
188
188
  const lines = output.split('\n').slice(1).filter(Boolean);
189
189
  return lines.map((line) => {
190
190
  const parts = line.split(/\s+/);