groove-dev 0.27.189 → 0.27.191

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.
@@ -6,7 +6,7 @@
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <link rel="icon" type="image/png" href="/favicon.png" />
8
8
  <title>Groove GUI</title>
9
- <script type="module" crossorigin src="/assets/index-DTY0KsH9.js"></script>
9
+ <script type="module" crossorigin src="/assets/index-L8xSnvHj.js"></script>
10
10
  <link rel="modulepreload" crossorigin href="/assets/vendor-26L3JoZv.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/reactflow-DoBZjiHE.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/codemirror-BYKpdS2W.js">
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@groove-dev/gui",
3
- "version": "0.27.189",
3
+ "version": "0.27.191",
4
4
  "description": "GROOVE GUI — visual agent control plane",
5
5
  "license": "FSL-1.1-Apache-2.0",
6
6
  "type": "module",
@@ -1,7 +1,7 @@
1
1
  // GROOVE GUI v2 — App Root
2
2
  // FSL-1.1-Apache-2.0 — see LICENSE
3
3
 
4
- import React, { useEffect, useMemo, useState, useRef } from 'react';
4
+ import React, { useEffect, useMemo, useState } from 'react';
5
5
  import { useGrooveStore } from './stores/groove';
6
6
  import { AppShell } from './components/layout/app-shell';
7
7
  import { SetupWizard } from './components/onboarding/setup-wizard';
@@ -136,27 +136,17 @@ function LoadingScreen() {
136
136
  const connected = useGrooveStore((s) => s.connected);
137
137
  const [slow, setSlow] = useState(false);
138
138
  const [reconnecting, setReconnecting] = useState(false);
139
- const triedRef = useRef(false);
140
139
 
141
- // If we haven't come up within a few seconds, the connection (or the SSH
142
- // tunnel behind it) is likely stalled surface a reload rather than an
143
- // endless pulse the user can't act on.
140
+ // Reveal a manual reconnect after a while rather than pulsing forever. We do
141
+ // NOT auto-reconnect here: over a slow SSH tunnel the socket can take longer
142
+ // than this to open, and reloading mid-connect would restart the load in a
143
+ // loop that never finishes. Wake recovery is handled by the desktop shell's
144
+ // power-resume handler; this is just a user-triggered escape hatch.
144
145
  useEffect(() => {
145
- const t = setTimeout(() => setSlow(true), 6000);
146
+ const t = setTimeout(() => setSlow(true), 12000);
146
147
  return () => clearTimeout(t);
147
148
  }, []);
148
149
 
149
- // If the socket can't even open (not just un-hydrated), the tunnel behind it
150
- // is probably dead — ask the desktop shell to re-establish it. Once only, and
151
- // only when disconnected, so a merely-slow load isn't disturbed.
152
- useEffect(() => {
153
- if (!slow || connected || triedRef.current) return;
154
- if (!window.groove?.reconnect) return;
155
- triedRef.current = true;
156
- setReconnecting(true);
157
- window.groove.reconnect().catch(() => {}).finally(() => setReconnecting(false));
158
- }, [slow, connected]);
159
-
160
150
  async function manualReconnect() {
161
151
  if (window.groove?.reconnect) {
162
152
  setReconnecting(true);
@@ -19,7 +19,7 @@ const PROVIDERS = [
19
19
  id: 'claude-code',
20
20
  name: 'Claude Code',
21
21
  subtitle: 'by Anthropic',
22
- models: ['Opus 4.6', 'Sonnet 4.6', 'Haiku 4.5'],
22
+ models: ['Opus 5', 'Sonnet 4.6', 'Haiku 4.5'],
23
23
  authType: 'Subscription or API key',
24
24
  authModes: ['subscription', 'apikey'],
25
25
  recommended: true,
@@ -776,8 +776,9 @@ export const useGrooveStore = create((set, get) => ({
776
776
  }
777
777
 
778
778
  case 'auth:expired':
779
+ // Marketplace/subscription token lapsed — reset to the community state
780
+ // silently. There is no sign-in flow to nag the user toward.
779
781
  set({ marketplaceAuthenticated: false, marketplaceUser: null });
780
- get().addToast('warning', 'Session expired', 'Please sign in again');
781
782
  break;
782
783
 
783
784
  case 'network:node:status': {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "groove-dev",
3
- "version": "0.27.189",
3
+ "version": "0.27.191",
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)",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@groove-dev/cli",
3
- "version": "0.27.189",
3
+ "version": "0.27.191",
4
4
  "description": "GROOVE CLI — manage AI coding agents from your terminal",
5
5
  "license": "FSL-1.1-Apache-2.0",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@groove-dev/daemon",
3
- "version": "0.27.189",
3
+ "version": "0.27.191",
4
4
  "description": "GROOVE daemon — agent orchestration engine",
5
5
  "license": "FSL-1.1-Apache-2.0",
6
6
  "type": "module",
@@ -491,7 +491,11 @@ export class Daemon {
491
491
  signal: AbortSignal.timeout(10000),
492
492
  });
493
493
  if (resp.status === 401) {
494
+ // The stored marketplace token is invalid. Clear it and stop here so
495
+ // we don't re-poll a dead token every cycle and re-fire this forever.
494
496
  this.subscriptionCache = { plan: 'community', status: 'none', features: [], active: false, validatedAt: Date.now() };
497
+ this.authToken = null;
498
+ try { await this.skills.clearAuth(); } catch { /* best effort */ }
495
499
  this.broadcast({ type: 'subscription:updated', data: this.subscriptionCache });
496
500
  this.broadcast({ type: 'auth:expired' });
497
501
  return;
@@ -39,6 +39,7 @@ export class ClaudeCodeProvider extends Provider {
39
39
  static authType = 'subscription';
40
40
  static managesOwnContext = true; // Claude Code compacts context internally (~25-37% → 2-8%)
41
41
  static models = [
42
+ { id: 'claude-opus-5', name: 'Claude Opus 5', tier: 'heavy', contextWindow: 1_000_000 },
42
43
  { id: 'claude-fable-5', name: 'Claude Fable 5', tier: 'heavy', contextWindow: 1_000_000 },
43
44
  { id: 'claude-opus-4-8', name: 'Claude Opus 4.8', tier: 'heavy', contextWindow: 1_000_000 },
44
45
  { id: 'claude-opus-4-6', name: 'Claude Opus 4.6', tier: 'heavy', contextWindow: 1_000_000 },