@pellux/goodvibes-agent 0.1.32 → 0.1.33
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/CHANGELOG.md
CHANGED
|
@@ -57,7 +57,7 @@ Primary sources used for the benchmark:
|
|
|
57
57
|
| Tools/MCP | Broad toolsets, MCP, browser, media, terminal, files | GoodVibes SDK tools with Agent policy guards and MCP/provider integrations |
|
|
58
58
|
| Voice/media/canvas/nodes | Voice, TTS, mobile nodes, live canvas, browser automation | GoodVibes media/voice/browser/node primitives with an Agent workspace for setup, image input, browser posture, MCP, and remote/node inspection |
|
|
59
59
|
| Build/code work | Direct terminal/file/code tools and subagents | Explicit delegation to GoodVibes TUI; local WRFC/spawn fanout blocked |
|
|
60
|
-
| Profiles | Independent profiles with own config/memory/skills/gateway | `GOODVIBES_AGENT_HOME` and named `--agent-profile` homes isolate Agent-local state; daemon remains external |
|
|
60
|
+
| Profiles | Independent profiles with own config/memory/skills/gateway | `GOODVIBES_AGENT_HOME` and named `--agent-profile` homes isolate Agent-local state; the Agent workspace exposes profile and portability flows; daemon remains external |
|
|
61
61
|
| Security | DM pairing, approvals, sandboxing, allowlists | Daemon approvals, auth diagnostics, secret refs, confirmation gates, model-tool policy |
|
|
62
62
|
|
|
63
63
|
## Exceed Targets
|
|
@@ -75,7 +75,7 @@ GoodVibes Agent should exceed OpenClaw/Hermes by making these properties true fr
|
|
|
75
75
|
|
|
76
76
|
- Live daemon account health and last delivery errors in the Channels workspace once a stable read-only route is available.
|
|
77
77
|
- Artifact and multimodal Agent Knowledge ingest affordances once Agent-specific routes are stable.
|
|
78
|
-
-
|
|
78
|
+
- Curated profile starter templates for household, research, travel, operations, and personal productivity profiles.
|
|
79
79
|
- Artifact and multimodal Agent Knowledge ingestion when the isolated Agent route accepts artifact-backed media.
|
|
80
80
|
- Delegation receipts and artifact review inside the operator workspace.
|
|
81
81
|
- Approval center with route risk labels and saved policy presets.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pellux/goodvibes-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.33",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Near-fork GoodVibes operator assistant with the GoodVibes TUI shell, renderer, input, fullscreen workspace, and daemon-connected Agent product brain.",
|
|
6
6
|
"type": "module",
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { InputToken } from '@pellux/goodvibes-sdk/platform/core';
|
|
2
|
+
import { basename, sep } from 'node:path';
|
|
2
3
|
import type { CommandContext } from './command-registry.ts';
|
|
3
4
|
import { AgentPersonaRegistry } from '../agent/persona-registry.ts';
|
|
4
5
|
import { AgentRoutineRegistry } from '../agent/routine-registry.ts';
|
|
5
6
|
import { AgentSkillRegistry } from '../agent/skill-registry.ts';
|
|
7
|
+
import { getAgentRuntimeProfilesRoot, listAgentRuntimeProfiles } from '../agent/runtime-profile.ts';
|
|
6
8
|
|
|
7
9
|
export const AGENT_WORKSPACE_MODAL_NAME = 'agentWorkspace';
|
|
8
10
|
|
|
@@ -92,6 +94,10 @@ export interface AgentWorkspaceRuntimeSnapshot {
|
|
|
92
94
|
readonly mediaGenerationProviderCount: number;
|
|
93
95
|
readonly browserSurfaceEnabled: boolean;
|
|
94
96
|
readonly browserSurfacePublicBaseUrl: string;
|
|
97
|
+
readonly activeRuntimeProfile: string;
|
|
98
|
+
readonly runtimeProfileCount: number;
|
|
99
|
+
readonly runtimeProfileRoot: string;
|
|
100
|
+
readonly configProfileCount: number;
|
|
95
101
|
readonly warnings: readonly string[];
|
|
96
102
|
}
|
|
97
103
|
|
|
@@ -304,6 +310,11 @@ function buildChannelStatus(context: CommandContext, spec: AgentWorkspaceChannel
|
|
|
304
310
|
};
|
|
305
311
|
}
|
|
306
312
|
|
|
313
|
+
function inferActiveRuntimeProfile(homeDirectory: string): string {
|
|
314
|
+
const marker = `${sep}.goodvibes${sep}agent${sep}profile-homes${sep}`;
|
|
315
|
+
return homeDirectory.includes(marker) ? basename(homeDirectory) : '(default home)';
|
|
316
|
+
}
|
|
317
|
+
|
|
307
318
|
export function buildAgentWorkspaceRuntimeSnapshot(context: CommandContext): AgentWorkspaceRuntimeSnapshot {
|
|
308
319
|
const host = readConfigString(context, 'controlPlane.host', '127.0.0.1');
|
|
309
320
|
const port = readConfigNumber(context, 'controlPlane.port', 3421);
|
|
@@ -353,6 +364,20 @@ export function buildAgentWorkspaceRuntimeSnapshot(context: CommandContext): Age
|
|
|
353
364
|
return { count: 0, enabled: 0 };
|
|
354
365
|
}
|
|
355
366
|
})();
|
|
367
|
+
const runtimeProfiles = (() => {
|
|
368
|
+
try {
|
|
369
|
+
return listAgentRuntimeProfiles(context.workspace?.shellPaths?.homeDirectory ?? '');
|
|
370
|
+
} catch {
|
|
371
|
+
return [];
|
|
372
|
+
}
|
|
373
|
+
})();
|
|
374
|
+
const configProfileCount = (() => {
|
|
375
|
+
try {
|
|
376
|
+
return context.workspace?.profileManager?.list?.().length ?? 0;
|
|
377
|
+
} catch {
|
|
378
|
+
return 0;
|
|
379
|
+
}
|
|
380
|
+
})();
|
|
356
381
|
const voiceProviders = (() => {
|
|
357
382
|
try {
|
|
358
383
|
return context.platform?.voiceProviderRegistry?.list?.() ?? [];
|
|
@@ -409,6 +434,10 @@ export function buildAgentWorkspaceRuntimeSnapshot(context: CommandContext): Age
|
|
|
409
434
|
mediaGenerationProviderCount: mediaProviders.filter((entry) => entry.capabilities.includes('generate')).length,
|
|
410
435
|
browserSurfaceEnabled: readConfigBoolean(context, 'web.enabled', false),
|
|
411
436
|
browserSurfacePublicBaseUrl: readConfigString(context, 'web.publicBaseUrl', '(not configured)'),
|
|
437
|
+
activeRuntimeProfile: inferActiveRuntimeProfile(context.workspace?.shellPaths?.homeDirectory ?? ''),
|
|
438
|
+
runtimeProfileCount: runtimeProfiles.length,
|
|
439
|
+
runtimeProfileRoot: getAgentRuntimeProfilesRoot(context.workspace?.shellPaths?.homeDirectory ?? ''),
|
|
440
|
+
configProfileCount,
|
|
412
441
|
warnings,
|
|
413
442
|
};
|
|
414
443
|
}
|
|
@@ -485,6 +514,21 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
|
|
|
485
514
|
{ id: 'node-posture', label: 'Node/remote posture', detail: 'Inspect remote runner/node posture. Dispatch remains blocked unless the task is explicit build delegation to TUI.', command: '/remote list', kind: 'command', safety: 'read-only' },
|
|
486
515
|
],
|
|
487
516
|
},
|
|
517
|
+
{
|
|
518
|
+
id: 'profiles',
|
|
519
|
+
group: 'SETUP',
|
|
520
|
+
label: 'Profiles & Portability',
|
|
521
|
+
summary: 'Isolated Agent homes, config profiles, and setup bundles.',
|
|
522
|
+
detail: 'Hermes profiles isolate agent state. GoodVibes Agent exposes named runtime homes, config profile pickers, profile-sync bundles, setup transfer bundles, and support bundles while keeping the daemon external.',
|
|
523
|
+
actions: [
|
|
524
|
+
{ id: 'profiles-open', label: 'Open config profiles', detail: 'Open the TUI-derived config profile picker for display/provider/behavior profile files.', command: '/profiles', kind: 'command', safety: 'safe' },
|
|
525
|
+
{ id: 'profile-sync-list', label: 'Profile sync list', detail: 'Inspect saved config profiles available for export/import.', command: '/profilesync list', kind: 'command', safety: 'read-only' },
|
|
526
|
+
{ id: 'profile-sync-export', label: 'Export profile sync', detail: 'Export config profiles to a portable bundle. Requires a real path and explicit --yes.', command: '/profilesync export <path> --yes', kind: 'command', safety: 'safe' },
|
|
527
|
+
{ id: 'setup-transfer-export', label: 'Export setup transfer', detail: 'Export Agent setup transfer data from the current home. Requires a real path and explicit --yes.', command: '/setup transfer export <path> --yes', kind: 'command', safety: 'safe' },
|
|
528
|
+
{ id: 'runtime-profile-create', label: 'Create runtime profile', detail: 'Use the CLI command goodvibes-agent profiles create <name> --yes, then launch with --agent-profile <name>. Runtime profile homes isolate Agent-local state and do not start a daemon.', kind: 'guidance', safety: 'safe' },
|
|
529
|
+
{ id: 'runtime-profile-switch', label: 'Switch runtime profile', detail: 'Launch goodvibes-agent --agent-profile <name> to use that isolated Agent home. This workspace cannot switch the current process home after startup.', kind: 'guidance', safety: 'safe' },
|
|
530
|
+
],
|
|
531
|
+
},
|
|
488
532
|
{
|
|
489
533
|
id: 'memory',
|
|
490
534
|
group: 'LEARN',
|
|
@@ -160,11 +160,11 @@ export const OPERATOR_CAPABILITY_BENCHMARKS: readonly OperatorCapabilityBenchmar
|
|
|
160
160
|
posture: 'ready',
|
|
161
161
|
competitors: ['hermes'],
|
|
162
162
|
competitorBaseline: 'Profiles run independent agents with isolated configs, sessions, skills, memory, cron jobs, and gateway state.',
|
|
163
|
-
goodvibesAgent: 'Supports GOODVIBES_AGENT_HOME and named --agent-profile homes for isolated Agent-local config, sessions, memory, personas, skills, routines, setup, and bundles; daemon remains shared/external by design.',
|
|
164
|
-
configure: ['GOODVIBES_AGENT_HOME=<path> goodvibes-agent status', 'goodvibes-agent profiles create household --yes', '
|
|
165
|
-
use: ['goodvibes-agent --agent-profile household', '
|
|
166
|
-
exceedsBy: ['Typed support bundles', 'explicit daemon boundary', 'no accidental cross-product knowledge fallback', 'profile isolation without hidden daemon lifecycle ownership'],
|
|
167
|
-
next: ['Add profile
|
|
163
|
+
goodvibesAgent: 'Supports GOODVIBES_AGENT_HOME and named --agent-profile homes for isolated Agent-local config, sessions, memory, personas, skills, routines, setup, and bundles; daemon remains shared/external by design. The Agent workspace exposes runtime profile posture, config profiles, profile sync, and setup transfer shortcuts.',
|
|
164
|
+
configure: ['GOODVIBES_AGENT_HOME=<path> goodvibes-agent status', 'goodvibes-agent profiles create household --yes', '/agent → Profiles & Portability'],
|
|
165
|
+
use: ['goodvibes-agent --agent-profile household', '/profiles', '/profilesync list', '/setup transfer export <path> --yes'],
|
|
166
|
+
exceedsBy: ['Typed support bundles', 'explicit daemon boundary', 'no accidental cross-product knowledge fallback', 'profile isolation without hidden daemon lifecycle ownership', 'fullscreen profile and portability workflow discovery'],
|
|
167
|
+
next: ['Add curated profile starter templates for household, research, travel, operations, and personal productivity profiles.'],
|
|
168
168
|
},
|
|
169
169
|
{
|
|
170
170
|
id: 'security-approvals',
|
|
@@ -127,6 +127,16 @@ function snapshotLines(category: AgentWorkspaceCategory, snapshot: AgentWorkspac
|
|
|
127
127
|
{ text: 'Node/remote posture is read-only here; build dispatch remains explicit TUI delegation.', fg: PALETTE.good },
|
|
128
128
|
{ text: 'Image input uses prompt attachments; media generation/provider setup stays behind explicit commands and configured providers.', fg: PALETTE.muted },
|
|
129
129
|
);
|
|
130
|
+
} else if (category.id === 'profiles') {
|
|
131
|
+
base.push(
|
|
132
|
+
{ text: `Active runtime profile: ${snapshot.activeRuntimeProfile}`, fg: PALETTE.info },
|
|
133
|
+
{ text: `Runtime profiles under this home: ${snapshot.runtimeProfileCount}`, fg: PALETTE.info },
|
|
134
|
+
{ text: `Runtime profile root: ${snapshot.runtimeProfileRoot}`, fg: PALETTE.muted },
|
|
135
|
+
{ text: `Config profiles: ${snapshot.configProfileCount}`, fg: PALETTE.info },
|
|
136
|
+
{ text: 'Named runtime profiles isolate Agent-local config, sessions, memory, personas, skills, routines, setup, and bundles.', fg: PALETTE.good },
|
|
137
|
+
{ text: 'The external daemon remains shared unless the daemon host is configured separately.', fg: PALETTE.warn },
|
|
138
|
+
{ text: 'Portable bundles require explicit export/import commands with real paths and --yes.', fg: PALETTE.muted },
|
|
139
|
+
);
|
|
130
140
|
} else if (category.id === 'memory') {
|
|
131
141
|
base.push(
|
|
132
142
|
{ text: `Session memories: ${snapshot.sessionMemoryCount}`, fg: PALETTE.info },
|
package/src/version.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { join } from 'node:path';
|
|
|
6
6
|
// The prebuild script updates the fallback value before compilation.
|
|
7
7
|
// Uses import.meta.dir (Bun) to locate package.json relative to this file,
|
|
8
8
|
// which is correct regardless of the process working directory.
|
|
9
|
-
let _version = '0.1.
|
|
9
|
+
let _version = '0.1.33';
|
|
10
10
|
let _sdkVersion = '0.33.35';
|
|
11
11
|
try {
|
|
12
12
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8')) as {
|