@pellux/goodvibes-agent 0.1.63 → 0.1.65
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 +12 -0
- package/README.md +3 -3
- package/docs/getting-started.md +2 -2
- package/docs/release-and-publishing.md +1 -1
- package/package.json +1 -1
- package/src/cli/agent-knowledge-command.ts +1 -1
- package/src/cli/help.ts +3 -3
- package/src/cli/management-commands.ts +7 -7
- package/src/cli/profiles-command.ts +8 -8
- package/src/cli/routines-command.ts +1 -1
- package/src/cli/service-posture.ts +2 -2
- package/src/cli/status.ts +6 -6
- package/src/cli/surface-command.ts +1 -1
- package/src/input/agent-workspace-categories.ts +16 -17
- package/src/input/agent-workspace-setup.ts +4 -4
- package/src/input/agent-workspace.ts +1 -1
- package/src/input/commands/agent-runtime-profile-runtime.ts +10 -10
- package/src/input/commands/local-auth-runtime.ts +1 -1
- package/src/input/commands/operator-runtime.ts +2 -2
- package/src/input/commands/platform-access-runtime.ts +28 -15
- package/src/input/commands/remote-runtime-setup.ts +6 -6
- package/src/input/commands/routines-runtime.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-steps.ts +3 -3
- package/src/panels/automation-control-panel.ts +2 -2
- package/src/panels/builtin/agent.ts +1 -1
- package/src/panels/builtin/operations.ts +5 -5
- package/src/panels/control-plane-panel.ts +10 -10
- package/src/panels/local-auth-panel.ts +1 -1
- package/src/panels/ops-control-panel.ts +3 -3
- package/src/panels/project-planning-panel.ts +2 -2
- package/src/panels/provider-health-domains.ts +2 -2
- package/src/panels/remote-panel.ts +2 -2
- package/src/panels/schedule-panel.ts +1 -1
- package/src/panels/watchers-panel.ts +1 -1
- package/src/renderer/agent-workspace.ts +9 -9
- package/src/renderer/settings-modal-helpers.ts +14 -14
- package/src/renderer/settings-modal.ts +4 -4
- package/src/runtime/bootstrap.ts +8 -8
- package/src/runtime/diagnostics/panels/ops.ts +1 -1
- package/src/runtime/index.ts +2 -2
- package/src/runtime/onboarding/derivation.ts +15 -15
- package/src/version.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to GoodVibes Agent will be recorded here.
|
|
4
4
|
|
|
5
|
+
## 0.1.65 - 2026-05-31
|
|
6
|
+
|
|
7
|
+
- Made the operator workspace more product-facing by replacing foundation/setup jargon with Agent profile, runtime status, voice/media, and browser-tool language.
|
|
8
|
+
- Removed the remote-runner item from the first-run voice/media workspace so day-one setup stays focused on user-facing assistant capabilities.
|
|
9
|
+
- Reworded settings, status panels, profile commands, and docs away from control-plane/runtime-profile terminology while preserving the same underlying contracts.
|
|
10
|
+
|
|
11
|
+
## 0.1.64 - 2026-05-31
|
|
12
|
+
|
|
13
|
+
- Cleaned remaining visible setup, workspace, panel, and auth wording that still exposed copied runtime-host terminology.
|
|
14
|
+
- Changed the advertised auth login target to runtime/listener while keeping legacy runtime-host aliases non-prominent.
|
|
15
|
+
- Added regression coverage so setup and workspace text stay Agent-specific and avoid copied platform/product wording.
|
|
16
|
+
|
|
5
17
|
## 0.1.63 - 2026-05-31
|
|
6
18
|
|
|
7
19
|
- Rewrote the remaining repo docs that still read like copied runtime/API notes into Agent-facing product docs.
|
package/README.md
CHANGED
|
@@ -52,9 +52,9 @@ bun run publish:check
|
|
|
52
52
|
|
|
53
53
|
Inside the Agent TUI, use `/agent`, `/home`, or `/operator` to open the operator workspace. It is the Agent-first fullscreen surface for setup, status, knowledge, local memory/skills, work-plan/approval review, automation observability, and explicit build delegation to GoodVibes TUI.
|
|
54
54
|
|
|
55
|
-
Inside the workspace, use `/agent-profile guide` to author custom profile starters without leaving the Agent TUI. The guided flow lists starters, exports starter JSON, imports edited local starters, and creates isolated
|
|
55
|
+
Inside the workspace, use `/agent-profile guide` to author custom profile starters without leaving the Agent TUI. The guided flow lists starters, exports starter JSON, imports edited local starters, and creates isolated Agent profiles from them.
|
|
56
56
|
|
|
57
|
-
Use isolated Agent
|
|
57
|
+
Use isolated Agent profiles when one machine needs separate operator identities or local state:
|
|
58
58
|
|
|
59
59
|
```sh
|
|
60
60
|
goodvibes-agent profiles templates
|
|
@@ -113,4 +113,4 @@ Package-facing docs are intentionally narrow during the near-fork baseline:
|
|
|
113
113
|
- [Deployment And Services](docs/deployment-and-services.md)
|
|
114
114
|
- [Release And Publishing](docs/release-and-publishing.md)
|
|
115
115
|
|
|
116
|
-
Broader
|
|
116
|
+
Broader foundation reference docs may exist in the source tree while the near-fork foundation is being completed, but the package-facing Agent documentation is limited to the docs listed above.
|
package/docs/getting-started.md
CHANGED
|
@@ -56,7 +56,7 @@ Use a separate Agent home when you want isolated local state:
|
|
|
56
56
|
GOODVIBES_AGENT_HOME=/path/to/agent-home goodvibes-agent status
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
-
Use named
|
|
59
|
+
Use named Agent profiles for repeatable local identities:
|
|
60
60
|
|
|
61
61
|
```sh
|
|
62
62
|
goodvibes-agent profiles templates
|
|
@@ -103,4 +103,4 @@ Agent lifecycle commands that would start or mutate runtime posture are blocked
|
|
|
103
103
|
|
|
104
104
|
## Current Baseline Notes
|
|
105
105
|
|
|
106
|
-
This repository keeps broad
|
|
106
|
+
This repository keeps broad terminal foundation code intentionally so Agent can use the mature shell, renderer, input, fullscreen workspace, command registry, and release bones. The active Agent policy is serial/proactive by default, blocks local Agent-owned WRFC/spawn fanout, and delegates explicit build/fix/review work to GoodVibes TUI instead of turning the Agent into a coding TUI.
|
|
@@ -57,4 +57,4 @@ Do not ship runtime host binaries from this package. If Agent later gets compile
|
|
|
57
57
|
|
|
58
58
|
## Near-Fork Baseline Rule
|
|
59
59
|
|
|
60
|
-
The public alpha can include copied
|
|
60
|
+
The public alpha can include copied terminal foundation code, but package-facing behavior must follow Agent product policy. Follow-up work should continue pruning or reshaping copied coding-first surfaces while preserving the renderer, input, fullscreen workspace, command registry, and release bones.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pellux/goodvibes-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.65",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "GoodVibes personal operator assistant TUI with a proactive Agent product brain, isolated Agent Knowledge, local profiles, routines, skills, personas, and explicit build delegation.",
|
|
6
6
|
"type": "module",
|
|
@@ -443,7 +443,7 @@ async function runKnowledgeCall<TData>(
|
|
|
443
443
|
return {
|
|
444
444
|
ok: false,
|
|
445
445
|
kind: 'auth_required',
|
|
446
|
-
error: `No
|
|
446
|
+
error: `No runtime operator token found at ${connection.tokenPath}`,
|
|
447
447
|
baseUrl: connection.baseUrl,
|
|
448
448
|
route: method.route,
|
|
449
449
|
};
|
package/src/cli/help.ts
CHANGED
|
@@ -36,7 +36,7 @@ export function renderGoodVibesHelp(binary = 'goodvibes-agent'): string {
|
|
|
36
36
|
' onboarding [status] Open Agent onboarding, or print onboarding status',
|
|
37
37
|
' models [provider] List/use/pin selectable models and recent model history',
|
|
38
38
|
' providers List/inspect/use provider config/auth posture',
|
|
39
|
-
' profiles Manage isolated Agent
|
|
39
|
+
' profiles Manage isolated Agent profile homes',
|
|
40
40
|
' routines Inspect local routines and explicitly promote one to an external schedule',
|
|
41
41
|
' auth Inspect and manage local users, sessions, and bootstrap auth',
|
|
42
42
|
' compat Inspect Agent SDK pin, runtime version, and Agent knowledge route readiness',
|
|
@@ -56,7 +56,7 @@ export function renderGoodVibesHelp(binary = 'goodvibes-agent'): string {
|
|
|
56
56
|
'Options:',
|
|
57
57
|
' -m, --model <registryKey> Override model. provider:model infers --provider',
|
|
58
58
|
' --provider <id> Override provider',
|
|
59
|
-
' --agent-profile <name> Use an isolated Agent
|
|
59
|
+
' --agent-profile <name> Use an isolated Agent profile home',
|
|
60
60
|
' -C, --cd <dir> Set working directory for this launch',
|
|
61
61
|
' --working-dir <dir> Alias for --cd',
|
|
62
62
|
' -c, --config <key=value> Override a config value for this launch',
|
|
@@ -141,7 +141,7 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
|
|
|
141
141
|
},
|
|
142
142
|
profiles: {
|
|
143
143
|
usage: ['profiles list', 'profiles templates', 'profiles templates export <id> <path> --yes', 'profiles templates import <path> --yes', 'profiles show <name>', 'profiles create <name> [--template <id>] --yes', 'profiles delete <name> --yes', '--agent-profile <name>'],
|
|
144
|
-
summary: 'Create and inspect isolated Agent
|
|
144
|
+
summary: 'Create and inspect isolated Agent profile homes, with starter templates for household, research, travel, operations, personal productivity, and local imported starters. A profile changes Agent-local config, sessions, memory, personas, skills, routines, and setup paths without changing the shared GoodVibes runtime.',
|
|
145
145
|
examples: ['profiles templates', 'profiles templates export research ./research-starter.json --yes', 'profiles templates import ./research-starter.json --yes', 'profiles create household --template household --yes', '--agent-profile household status'],
|
|
146
146
|
},
|
|
147
147
|
routines: {
|
|
@@ -328,12 +328,12 @@ export async function buildControlPlaneStatusResult(runtime: CliCommandRuntime):
|
|
|
328
328
|
restartOnFailure: runtime.configManager.get('service.restartOnFailure'),
|
|
329
329
|
};
|
|
330
330
|
const issues: string[] = [];
|
|
331
|
-
if (enabled === true && !reachable) issues.push(`
|
|
332
|
-
if (enabled === true && service.enabled !== true) issues.push('
|
|
333
|
-
if (enabled === true && service.autostart !== true) issues.push('
|
|
334
|
-
if (enabled === true && service.restartOnFailure !== true) issues.push('
|
|
335
|
-
if (isNetworkFacing(enabled, binding) && !auth.userStorePresent) issues.push('Network-facing
|
|
336
|
-
if (isNetworkFacing(enabled, binding) && auth.bootstrapCredentialPresent) issues.push('Network-facing
|
|
331
|
+
if (enabled === true && !reachable) issues.push(`Runtime API is enabled but not reachable on ${binding.host}:${binding.port}.`);
|
|
332
|
+
if (enabled === true && service.enabled !== true) issues.push('Runtime API is enabled on the external runtime config, but Agent service ownership is disabled.');
|
|
333
|
+
if (enabled === true && service.autostart !== true) issues.push('Runtime API is enabled on the external runtime config, but autostart is off.');
|
|
334
|
+
if (enabled === true && service.restartOnFailure !== true) issues.push('Runtime API is enabled on the external runtime config, but restart-on-failure is off.');
|
|
335
|
+
if (isNetworkFacing(enabled, binding) && !auth.userStorePresent) issues.push('Network-facing Runtime API has no local auth user store.');
|
|
336
|
+
if (isNetworkFacing(enabled, binding) && auth.bootstrapCredentialPresent) issues.push('Network-facing Runtime API still has a bootstrap credential file.');
|
|
337
337
|
return {
|
|
338
338
|
enabled,
|
|
339
339
|
...binding,
|
|
@@ -347,7 +347,7 @@ export async function buildControlPlaneStatusResult(runtime: CliCommandRuntime):
|
|
|
347
347
|
|
|
348
348
|
export function formatControlPlaneStatus(runtime: CliCommandRuntime, value: ControlPlaneStatusResult): string {
|
|
349
349
|
return formatJsonOrText(runtime.cli)(value, [
|
|
350
|
-
'GoodVibes
|
|
350
|
+
'GoodVibes runtime API status',
|
|
351
351
|
` enabled: ${yesNo(value.enabled)}`,
|
|
352
352
|
` bind: ${value.hostMode} ${value.host}:${value.port}`,
|
|
353
353
|
` bind posture: ${value.posture.label}`,
|
|
@@ -63,9 +63,9 @@ function renderProfilesResult(result: AgentRuntimeProfileCommandResult): string
|
|
|
63
63
|
if (!result.ok) return result.error ?? 'Agent profile command failed.';
|
|
64
64
|
if (result.kind === 'agent.profiles.list') {
|
|
65
65
|
const profiles = result.data?.profiles ?? [];
|
|
66
|
-
if (profiles.length === 0) return 'No Agent
|
|
66
|
+
if (profiles.length === 0) return 'No Agent profiles. Use: goodvibes-agent profiles create <name> --template <id> --yes';
|
|
67
67
|
return [
|
|
68
|
-
`Agent
|
|
68
|
+
`Agent profiles (${profiles.length})`,
|
|
69
69
|
...profiles.map(profileLine),
|
|
70
70
|
].join('\n');
|
|
71
71
|
}
|
|
@@ -103,7 +103,7 @@ function renderProfilesResult(result: AgentRuntimeProfileCommandResult): string
|
|
|
103
103
|
if (result.kind === 'agent.profiles.create' && profile) {
|
|
104
104
|
const template = result.data?.appliedTemplate;
|
|
105
105
|
return [
|
|
106
|
-
`Agent
|
|
106
|
+
`Agent profile created: ${profile.id}`,
|
|
107
107
|
` home: ${profile.homeDirectory}`,
|
|
108
108
|
...(template ? [
|
|
109
109
|
` starter: ${template.id} (${template.name})`,
|
|
@@ -113,7 +113,7 @@ function renderProfilesResult(result: AgentRuntimeProfileCommandResult): string
|
|
|
113
113
|
].join('\n');
|
|
114
114
|
}
|
|
115
115
|
if (result.kind === 'agent.profiles.delete' && profile) {
|
|
116
|
-
return `Agent
|
|
116
|
+
return `Agent profile deleted: ${profile.id}`;
|
|
117
117
|
}
|
|
118
118
|
return 'Agent profile command completed.';
|
|
119
119
|
}
|
|
@@ -242,7 +242,7 @@ export async function handleProfilesCommand(runtime: ProfilesCommandRuntime): Pr
|
|
|
242
242
|
data: { profile: info },
|
|
243
243
|
};
|
|
244
244
|
const starter = info.starterTemplateId ? [` starter: ${info.starterTemplateId} (${info.starterTemplateName ?? info.starterTemplateId})`] : [];
|
|
245
|
-
const text = [`Agent
|
|
245
|
+
const text = [`Agent profile: ${profile.id}`, ` home: ${profile.homeDirectory}`, ...starter, ` use: goodvibes-agent --agent-profile ${profile.id}`].join('\n');
|
|
246
246
|
return {
|
|
247
247
|
output: runtime.cli.flags.outputFormat === 'json' ? JSON.stringify(result, null, 2) : text,
|
|
248
248
|
exitCode: 0,
|
|
@@ -266,7 +266,7 @@ export async function handleProfilesCommand(runtime: ProfilesCommandRuntime): Pr
|
|
|
266
266
|
const result: AgentRuntimeProfileCommandResult = {
|
|
267
267
|
ok: false,
|
|
268
268
|
kind: 'agent.profiles.error',
|
|
269
|
-
error: `Refusing to create Agent
|
|
269
|
+
error: `Refusing to create Agent profile ${name} without --yes.`,
|
|
270
270
|
};
|
|
271
271
|
return {
|
|
272
272
|
output: renderProfilesOutput(result, runtime.cli.flags.outputFormat),
|
|
@@ -307,7 +307,7 @@ export async function handleProfilesCommand(runtime: ProfilesCommandRuntime): Pr
|
|
|
307
307
|
const result: AgentRuntimeProfileCommandResult = {
|
|
308
308
|
ok: false,
|
|
309
309
|
kind: 'agent.profiles.error',
|
|
310
|
-
error: `Refusing to delete Agent
|
|
310
|
+
error: `Refusing to delete Agent profile ${name} without --yes.`,
|
|
311
311
|
};
|
|
312
312
|
return {
|
|
313
313
|
output: renderProfilesOutput(result, runtime.cli.flags.outputFormat),
|
|
@@ -325,7 +325,7 @@ export async function handleProfilesCommand(runtime: ProfilesCommandRuntime): Pr
|
|
|
325
325
|
: {
|
|
326
326
|
ok: false,
|
|
327
327
|
kind: 'agent.profiles.error',
|
|
328
|
-
error: `Agent
|
|
328
|
+
error: `Agent profile not found: ${resolution.id}`,
|
|
329
329
|
};
|
|
330
330
|
return {
|
|
331
331
|
output: renderProfilesOutput(result, runtime.cli.flags.outputFormat),
|
|
@@ -62,7 +62,7 @@ function renderRoutineList(title: string, path: string, routines: readonly Agent
|
|
|
62
62
|
return [
|
|
63
63
|
title,
|
|
64
64
|
' No local Agent routines yet.',
|
|
65
|
-
' Create routines inside the Agent TUI with /routines create, or create
|
|
65
|
+
' Create routines inside the Agent TUI with /routines create, or create an Agent profile from a starter template.',
|
|
66
66
|
].join('\n');
|
|
67
67
|
}
|
|
68
68
|
return [
|
|
@@ -61,7 +61,7 @@ export interface CliServicePosture {
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
const ENDPOINTS: readonly { readonly id: RuntimeEndpointId; readonly label: string; readonly enabledKey: string }[] = [
|
|
64
|
-
{ id: 'controlPlane', label: '
|
|
64
|
+
{ id: 'controlPlane', label: 'runtime API', enabledKey: 'controlPlane.enabled' },
|
|
65
65
|
{ id: 'httpListener', label: 'HTTP listener', enabledKey: 'danger.httpListener' },
|
|
66
66
|
{ id: 'web', label: 'web surface', enabledKey: 'web.enabled' },
|
|
67
67
|
];
|
|
@@ -234,7 +234,7 @@ export function formatCliServicePosture(posture: CliServicePosture, json = false
|
|
|
234
234
|
` service config enabled: ${yesNo(posture.config.enabled)}`,
|
|
235
235
|
` autostart config: ${yesNo(posture.config.autostart)}`,
|
|
236
236
|
` restartOnFailure config: ${yesNo(posture.config.restartOnFailure)}`,
|
|
237
|
-
`
|
|
237
|
+
` runtime host flag: ${yesNo(posture.config.daemonEnabled)}`,
|
|
238
238
|
` log: ${posture.log.path ?? 'n/a'} (${posture.log.exists ? 'present' : 'missing'})`,
|
|
239
239
|
...(posture.log.readError ? [` log read error: ${posture.log.readError}`] : []),
|
|
240
240
|
'',
|
package/src/cli/status.ts
CHANGED
|
@@ -110,7 +110,7 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
|
|
|
110
110
|
const marker = options.onboardingMarkers?.effective;
|
|
111
111
|
const serverBackedEnabled = daemonEnabled || controlPlaneEnabled || listenerEnabled || webEnabled;
|
|
112
112
|
const networkFacingSurfaces = [
|
|
113
|
-
['
|
|
113
|
+
['runtime API', controlPlaneEnabled, controlPlaneBinding],
|
|
114
114
|
['HTTP listener', listenerEnabled, httpListenerBinding],
|
|
115
115
|
['web surface', webEnabled, webBinding],
|
|
116
116
|
].filter(([, enabled, binding]) => isNetworkFacing(enabled, binding as typeof controlPlaneBinding));
|
|
@@ -123,7 +123,7 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
|
|
|
123
123
|
area: 'service',
|
|
124
124
|
severity: 'warning',
|
|
125
125
|
summary: 'Host-owned surfaces are configured while Agent service ownership is disabled.',
|
|
126
|
-
cause: 'One or more runtime
|
|
126
|
+
cause: 'One or more runtime API, listener, or web settings are enabled while service.enabled is false.',
|
|
127
127
|
impact: 'The external GoodVibes runtime must own availability for those surfaces; Agent will not start or enable them.',
|
|
128
128
|
action: 'Manage surface/service posture from GoodVibes TUI or the owning host, then use Agent for read-only diagnostics.',
|
|
129
129
|
});
|
|
@@ -136,7 +136,7 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
|
|
|
136
136
|
severity: 'warning',
|
|
137
137
|
summary: 'External runtime service config has autostart off.',
|
|
138
138
|
cause: 'service.enabled is true and service.autostart is false.',
|
|
139
|
-
impact: 'The external GoodVibes runtime may not be available after login or reboot even though
|
|
139
|
+
impact: 'The external GoodVibes runtime may not be available after login or reboot even though host-managed startup is selected.',
|
|
140
140
|
action: 'Configure autostart from GoodVibes TUI or the owning host; Agent will not mutate this setting.',
|
|
141
141
|
});
|
|
142
142
|
}
|
|
@@ -162,7 +162,7 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
|
|
|
162
162
|
severity: 'warning',
|
|
163
163
|
summary: issue,
|
|
164
164
|
cause: 'The service lifecycle inspection found a mismatch between configured service/surface state and observed host state.',
|
|
165
|
-
impact: 'Runtime
|
|
165
|
+
impact: 'Runtime API, listener, or web availability may not match the configuration.',
|
|
166
166
|
action: 'Use goodvibes-agent service check for read-only detail, then manage the runtime from GoodVibes TUI or your host tooling.',
|
|
167
167
|
});
|
|
168
168
|
}
|
|
@@ -326,7 +326,7 @@ export function renderCliStatus(options: CliStatusOptions): string {
|
|
|
326
326
|
? ` operatorTokens: ${options.auth.operatorTokenPresent ? 'present' : 'missing'} (${options.auth.operatorTokenPath})`
|
|
327
327
|
: ' operatorTokens: unknown',
|
|
328
328
|
'',
|
|
329
|
-
'External
|
|
329
|
+
'External Runtime Service:',
|
|
330
330
|
` enabled: ${yesNo(serviceEnabled)}`,
|
|
331
331
|
` autostart: ${yesNo(serviceAutostart)}`,
|
|
332
332
|
` restartOnFailure: ${yesNo(restartOnFailure)}`,
|
|
@@ -338,7 +338,7 @@ export function renderCliStatus(options: CliStatusOptions): string {
|
|
|
338
338
|
` log: ${options.service.log.path ?? 'n/a'} (${options.service.log.exists ? 'present' : 'missing'})`,
|
|
339
339
|
] : []),
|
|
340
340
|
'',
|
|
341
|
-
'
|
|
341
|
+
'Runtime Endpoints:',
|
|
342
342
|
bindLine('controlPlane', controlPlaneEnabled, controlPlaneBinding),
|
|
343
343
|
bindLine('httpListener', listenerEnabled, httpListenerBinding),
|
|
344
344
|
bindLine('web', webEnabled, webBinding),
|
|
@@ -155,7 +155,7 @@ export async function handleSurfacesCommand(runtime: CliCommandRuntime): Promise
|
|
|
155
155
|
'ntfy inbound topics:',
|
|
156
156
|
` chat: ${ntfyTopics.chatTopic}`,
|
|
157
157
|
` agent: ${ntfyTopics.agentTopic}`,
|
|
158
|
-
`
|
|
158
|
+
` runtime-only remote: ${ntfyTopics.remoteTopic}`,
|
|
159
159
|
` default delivery topic: ${String(config.get('surfaces.ntfy.topic') || '(none)')}`,
|
|
160
160
|
] : []),
|
|
161
161
|
...(includeProbe ? [
|
|
@@ -6,7 +6,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
|
|
|
6
6
|
group: 'OPERATE',
|
|
7
7
|
label: 'Home',
|
|
8
8
|
summary: 'Main operator surface for normal assistant work.',
|
|
9
|
-
detail: 'Use this as the Agent front door: chat in the main conversation, inspect state, choose model/provider, and open setup
|
|
9
|
+
detail: 'Use this as the Agent front door: chat in the main conversation, inspect state, choose model/provider, and open setup without switching modes.',
|
|
10
10
|
actions: [
|
|
11
11
|
{ id: 'chat', label: 'Continue assistant chat', detail: 'Close this workspace and type a normal message. Agent work stays serial in the main conversation.', kind: 'guidance', safety: 'safe' },
|
|
12
12
|
{ id: 'model', label: 'Choose model', detail: 'Open the model/provider workspace for the Agent chat route.', command: '/model', kind: 'command', safety: 'safe' },
|
|
@@ -14,7 +14,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
|
|
|
14
14
|
{ id: 'knowledge-home', label: 'Agent Knowledge', detail: 'Jump to isolated Agent Knowledge status, ingest, search, and review flows.', targetCategoryId: 'knowledge', kind: 'workspace', safety: 'read-only' },
|
|
15
15
|
{ id: 'memory-home', label: 'Memory, skills, routines', detail: 'Jump to local memory, persona, skill, and routine setup. These are core Agent product features.', targetCategoryId: 'memory', kind: 'workspace', safety: 'safe' },
|
|
16
16
|
{ id: 'channels-home', label: 'Channels', detail: 'Jump to companion pairing and channel readiness without changing runtime connectivity.', targetCategoryId: 'channels', kind: 'workspace', safety: 'read-only' },
|
|
17
|
-
{ id: 'voice-home', label: 'Voice and media', detail: 'Jump to voice, TTS, image input, browser, and
|
|
17
|
+
{ id: 'voice-home', label: 'Voice and media', detail: 'Jump to voice, TTS, image input, browser-tool, and media setup.', targetCategoryId: 'voice-media', kind: 'workspace', safety: 'safe' },
|
|
18
18
|
{ id: 'help', label: 'Browse commands', detail: 'Open registry-driven command help.', command: '/help', kind: 'command', safety: 'safe' },
|
|
19
19
|
{ id: 'health', label: 'Review health', detail: 'Show the local health review surface without starting or mutating runtime services.', command: '/health review', kind: 'command', safety: 'read-only' },
|
|
20
20
|
],
|
|
@@ -26,11 +26,11 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
|
|
|
26
26
|
summary: 'Configuration, auth, provider, and onboarding surfaces.',
|
|
27
27
|
detail: 'Agent connects to an existing GoodVibes runtime and owns local assistant configuration only. Runtime lifecycle and connectivity posture remain external.',
|
|
28
28
|
actions: [
|
|
29
|
-
{ id: 'config', label: 'Open
|
|
30
|
-
{ id: 'onboarding', label: '
|
|
29
|
+
{ id: 'config', label: 'Open settings', detail: 'Open the fullscreen Agent settings workspace.', command: '/config', kind: 'command', safety: 'safe' },
|
|
30
|
+
{ id: 'onboarding', label: 'Run setup', detail: 'Review Agent settings in the fullscreen setup flow.', command: '/onboarding', kind: 'command', safety: 'safe' },
|
|
31
31
|
{ id: 'setup-provider-model', label: 'Provider and model', detail: 'Choose the provider/model route for normal assistant chat.', command: '/model', kind: 'command', safety: 'safe' },
|
|
32
32
|
{ id: 'setup-agent-knowledge', label: 'Agent Knowledge', detail: 'Inspect the isolated Agent Knowledge store before ingesting source-backed material.', command: '/knowledge status', kind: 'command', safety: 'read-only' },
|
|
33
|
-
{ id: 'setup-runtime-profiles', label: '
|
|
33
|
+
{ id: 'setup-runtime-profiles', label: 'Agent profiles', detail: 'Browse starter templates for isolated Agent homes and operator identities.', command: '/agent-profile templates', kind: 'command', safety: 'read-only' },
|
|
34
34
|
{ id: 'setup-personas', label: 'Personas', detail: 'Create or select the active local Agent persona.', targetCategoryId: 'personas', kind: 'workspace', safety: 'safe' },
|
|
35
35
|
{ id: 'setup-skills', label: 'Skills', detail: 'Create, review, and enable reusable local Agent skills.', targetCategoryId: 'skills', kind: 'workspace', safety: 'safe' },
|
|
36
36
|
{ id: 'setup-routines', label: 'Routines', detail: 'Create, review, and enable local Agent routines before any explicit schedule promotion.', targetCategoryId: 'routines', kind: 'workspace', safety: 'safe' },
|
|
@@ -48,7 +48,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
|
|
|
48
48
|
summary: 'Companion pairing, channel posture, and delivery safety.',
|
|
49
49
|
detail: 'Agent uses externally managed channel surfaces. Pairing, account inspection, and readiness checks are visible here; inbound delivery and public channel exposure stay policy-gated.',
|
|
50
50
|
actions: [
|
|
51
|
-
{ id: 'pair', label: 'Pair companion', detail: 'Open the
|
|
51
|
+
{ id: 'pair', label: 'Pair companion', detail: 'Open the QR pairing surface for companion app setup.', command: '/pair', kind: 'command', safety: 'safe' },
|
|
52
52
|
{ id: 'communication', label: 'Communication routes', detail: 'Inspect structured communication routes and recent activity.', command: '/communication', kind: 'command', safety: 'read-only' },
|
|
53
53
|
{ id: 'setup-review', label: 'Channel setup review', detail: 'Review setup posture without starting inbound endpoints or mutating channel state.', command: '/setup review', kind: 'command', safety: 'read-only' },
|
|
54
54
|
{ id: 'channel-safety', label: 'Delivery safety', detail: 'External messages, channel DMs, and public delivery targets require explicit user action and runtime policy. Agent will not silently send or expose channels from this workspace.', kind: 'guidance', safety: 'blocked' },
|
|
@@ -73,35 +73,34 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
|
|
|
73
73
|
{
|
|
74
74
|
id: 'voice-media',
|
|
75
75
|
group: 'SETUP',
|
|
76
|
-
label: 'Voice
|
|
77
|
-
summary: 'Voice, TTS, image input, browser
|
|
78
|
-
detail: 'Voice, media, browser, and
|
|
76
|
+
label: 'Voice & Media',
|
|
77
|
+
summary: 'Voice, TTS, image input, browser tools, and media providers.',
|
|
78
|
+
detail: 'Voice, media, browser tools, and image-capable flows are first-class Agent surfaces. Runtime ownership stays external and side effects stay explicit.',
|
|
79
79
|
actions: [
|
|
80
|
-
{ id: 'tts-config', label: 'Configure live TTS', detail: 'Open the
|
|
80
|
+
{ id: 'tts-config', label: 'Configure live TTS', detail: 'Open the settings workspace at the TTS group.', command: '/config tts', kind: 'command', safety: 'safe' },
|
|
81
81
|
{ id: 'tts-provider', label: 'Choose TTS provider', detail: 'Open provider/model routing for spoken responses through the settings flow.', command: '/config tts.provider', kind: 'command', safety: 'safe' },
|
|
82
82
|
{ id: 'tts-speak', label: 'Speak a prompt', detail: 'Submit a normal assistant turn and play the reply through configured live TTS. Close this workspace and provide real prompt text.', command: '/tts <prompt>', kind: 'command', safety: 'safe' },
|
|
83
83
|
{ id: 'image-attach', label: 'Attach image input', detail: 'Attach an image to the next assistant turn. Close this workspace and provide a real path and prompt.', command: '/image <path> <prompt>', kind: 'command', safety: 'safe' },
|
|
84
|
-
{ id: 'browser-surface', label: 'Browser
|
|
84
|
+
{ id: 'browser-surface', label: 'Browser tools', detail: 'Inspect browser/tool readiness without starting inbound endpoints or runtime services.', command: '/setup services', kind: 'command', safety: 'read-only' },
|
|
85
85
|
{ id: 'mcp-browser', label: 'Browser MCP tools', detail: 'Inspect MCP servers and tools, including browser/automation roles, without mutating server setup.', command: '/mcp servers', kind: 'command', safety: 'read-only' },
|
|
86
|
-
{ 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' },
|
|
87
86
|
],
|
|
88
87
|
},
|
|
89
88
|
{
|
|
90
89
|
id: 'profiles',
|
|
91
90
|
group: 'SETUP',
|
|
92
|
-
label: 'Profiles
|
|
91
|
+
label: 'Profiles',
|
|
93
92
|
summary: 'Isolated Agent homes, config profiles, and setup bundles.',
|
|
94
|
-
detail: 'Profiles isolate
|
|
93
|
+
detail: 'Profiles isolate Agent state. GoodVibes Agent exposes named homes, config profile pickers, profile-sync bundles, setup transfer bundles, and support bundles while keeping the shared runtime external.',
|
|
95
94
|
actions: [
|
|
96
|
-
{ id: 'profiles-open', label: 'Open config profiles', detail: 'Open the
|
|
95
|
+
{ id: 'profiles-open', label: 'Open config profiles', detail: 'Open the config profile picker for display/provider/behavior profile files.', command: '/profiles', kind: 'command', safety: 'safe' },
|
|
97
96
|
{ id: 'runtime-profile-guide', label: 'Starter authoring guide', detail: 'Open the Agent-local starter authoring flow inside the TUI command surface.', command: '/agent-profile guide', kind: 'command', safety: 'safe' },
|
|
98
97
|
{ id: 'runtime-profile-templates', label: 'Browse starter templates', detail: 'List built-in and local Agent starter templates with persona, skill, routine, and source details.', command: '/agent-profile templates', kind: 'command', safety: 'read-only' },
|
|
99
98
|
{ 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' },
|
|
100
99
|
{ 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' },
|
|
101
100
|
{ 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' },
|
|
102
|
-
{ id: 'runtime-profile-create', label: 'Create
|
|
101
|
+
{ id: 'runtime-profile-create', label: 'Create Agent profile', detail: 'Create an isolated Agent profile from a built-in or local starter. Requires a real name and explicit --yes.', command: '/agent-profile create <name> --template <id> --yes', kind: 'command', safety: 'safe' },
|
|
103
102
|
{ id: 'runtime-profile-template-edit', label: 'Customize starter', detail: 'Export a starter JSON file, edit it, import it as a local starter, then create a profile from it.', command: '/agent-profile template export <id> <path> --yes', kind: 'command', safety: 'safe' },
|
|
104
|
-
{ id: 'runtime-profile-switch', label: 'Switch
|
|
103
|
+
{ id: 'runtime-profile-switch', label: 'Switch Agent 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' },
|
|
105
104
|
],
|
|
106
105
|
},
|
|
107
106
|
{
|
|
@@ -35,9 +35,9 @@ export function buildAgentWorkspaceSetupChecklist(input: AgentWorkspaceSetupChec
|
|
|
35
35
|
return [
|
|
36
36
|
{
|
|
37
37
|
id: 'runtime',
|
|
38
|
-
label: '
|
|
38
|
+
label: 'GoodVibes runtime',
|
|
39
39
|
status: 'ready',
|
|
40
|
-
detail: `Agent will connect to ${input.daemonBaseUrl}; runtime
|
|
40
|
+
detail: `Agent will connect to ${input.daemonBaseUrl}; runtime ownership stays outside this product.`,
|
|
41
41
|
command: '/status',
|
|
42
42
|
},
|
|
43
43
|
{
|
|
@@ -58,10 +58,10 @@ export function buildAgentWorkspaceSetupChecklist(input: AgentWorkspaceSetupChec
|
|
|
58
58
|
},
|
|
59
59
|
{
|
|
60
60
|
id: 'profile',
|
|
61
|
-
label: '
|
|
61
|
+
label: 'Agent profile',
|
|
62
62
|
status: setupStatusForCount(input.runtimeProfileCount, 'ready', 'optional'),
|
|
63
63
|
detail: input.runtimeProfileCount > 0
|
|
64
|
-
? `${input.runtimeProfileCount} isolated
|
|
64
|
+
? `${input.runtimeProfileCount} isolated Agent profile(s) are available.`
|
|
65
65
|
: `${input.runtimeStarterTemplateCount} starter template(s) are available if this machine needs separate operator identities.`,
|
|
66
66
|
command: '/agent-profile templates',
|
|
67
67
|
},
|
|
@@ -154,7 +154,7 @@ export class AgentWorkspace {
|
|
|
154
154
|
this.lastActionResult = {
|
|
155
155
|
kind: 'refreshed',
|
|
156
156
|
title: 'Runtime context refreshed',
|
|
157
|
-
detail: 'Provider, model, session, local memory,
|
|
157
|
+
detail: 'Provider, model, session, local memory, runtime endpoint, and Agent knowledge route posture were re-read from the live command context.',
|
|
158
158
|
};
|
|
159
159
|
}
|
|
160
160
|
|
|
@@ -43,12 +43,12 @@ function renderProfiles(homeDirectory: string): string {
|
|
|
43
43
|
const profiles = listAgentRuntimeProfiles(homeDirectory);
|
|
44
44
|
if (profiles.length === 0) {
|
|
45
45
|
return [
|
|
46
|
-
'Agent
|
|
47
|
-
' No isolated Agent
|
|
46
|
+
'Agent Profiles',
|
|
47
|
+
' No isolated Agent profiles yet.',
|
|
48
48
|
' Create one with /agent-profile create <name> --template <id> --yes.',
|
|
49
49
|
].join('\n');
|
|
50
50
|
}
|
|
51
|
-
return ['Agent
|
|
51
|
+
return ['Agent Profiles', ...profiles.map(profileLine)].join('\n');
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
function renderTemplates(homeDirectory: string): string {
|
|
@@ -80,10 +80,10 @@ function renderGuide(homeDirectory: string): string {
|
|
|
80
80
|
'3. Edit id, name, description, persona, skills, and routines in that JSON file.',
|
|
81
81
|
'4. Import it into this Agent home:',
|
|
82
82
|
' /agent-profile template import ./agent-starter.json --yes',
|
|
83
|
-
'5. Create
|
|
83
|
+
'5. Create an Agent profile from the imported starter:',
|
|
84
84
|
' /agent-profile create <name> --template <imported-id> --yes',
|
|
85
85
|
'',
|
|
86
|
-
'This writes only Agent-local starter/profile state. It does not mutate the
|
|
86
|
+
'This writes only Agent-local starter/profile state. It does not mutate the runtime host, default wiki, or non-Agent knowledge segments.',
|
|
87
87
|
].join('\n');
|
|
88
88
|
}
|
|
89
89
|
|
|
@@ -107,7 +107,7 @@ export function registerAgentRuntimeProfileRuntimeCommands(registry: CommandRegi
|
|
|
107
107
|
registry.register({
|
|
108
108
|
name: 'agent-profile',
|
|
109
109
|
aliases: ['runtime-profile', 'agent-profiles'],
|
|
110
|
-
description: 'Manage isolated Agent
|
|
110
|
+
description: 'Manage isolated Agent profiles and starter templates',
|
|
111
111
|
usage: '[list|templates|guide|template show|template export|template import|create|delete]',
|
|
112
112
|
handler(args, ctx) {
|
|
113
113
|
const shellPaths = requireShellPaths(ctx);
|
|
@@ -187,12 +187,12 @@ export function registerAgentRuntimeProfileRuntimeCommands(registry: CommandRegi
|
|
|
187
187
|
return;
|
|
188
188
|
}
|
|
189
189
|
if (!parsed.yes) {
|
|
190
|
-
requireYesFlag(ctx, `create Agent
|
|
190
|
+
requireYesFlag(ctx, `create Agent profile ${name}`, '/agent-profile create <name> [--template <id>] --yes');
|
|
191
191
|
return;
|
|
192
192
|
}
|
|
193
193
|
const profile = createAgentRuntimeProfile(homeDirectory, name, { templateId });
|
|
194
194
|
ctx.print([
|
|
195
|
-
`Agent
|
|
195
|
+
`Agent profile created: ${profile.id}`,
|
|
196
196
|
` home: ${profile.homeDirectory}`,
|
|
197
197
|
profile.starterTemplateId ? ` starter: ${profile.starterTemplateId}` : '',
|
|
198
198
|
` launch: goodvibes-agent --agent-profile ${profile.id}`,
|
|
@@ -207,10 +207,10 @@ export function registerAgentRuntimeProfileRuntimeCommands(registry: CommandRegi
|
|
|
207
207
|
return;
|
|
208
208
|
}
|
|
209
209
|
if (!parsed.yes) {
|
|
210
|
-
requireYesFlag(ctx, `delete Agent
|
|
210
|
+
requireYesFlag(ctx, `delete Agent profile ${name}`, '/agent-profile delete <name> --yes');
|
|
211
211
|
return;
|
|
212
212
|
}
|
|
213
|
-
ctx.print(deleteAgentRuntimeProfile(homeDirectory, name) ? `Agent
|
|
213
|
+
ctx.print(deleteAgentRuntimeProfile(homeDirectory, name) ? `Agent profile deleted: ${name}` : `Agent profile not found: ${name}`);
|
|
214
214
|
return;
|
|
215
215
|
}
|
|
216
216
|
|
|
@@ -119,7 +119,7 @@ export function registerLocalAuthRuntimeCommands(registry: CommandRegistry): voi
|
|
|
119
119
|
registry.register({
|
|
120
120
|
name: 'local-auth',
|
|
121
121
|
aliases: ['auth-local'],
|
|
122
|
-
description: 'Inspect and manage local
|
|
122
|
+
description: 'Inspect and manage local runtime auth users, sessions, and bootstrap credentials',
|
|
123
123
|
usage: '[review|panel|add-user <username> <password> [roles] --yes|delete-user <username> --yes|rotate-password <username> <password> --yes|revoke-session <token-or-fingerprint> --yes|clear-bootstrap-file --yes]',
|
|
124
124
|
handler(args, ctx) {
|
|
125
125
|
handleLocalAuthCommand(args, ctx);
|
|
@@ -252,7 +252,7 @@ export function registerOperatorRuntimeCommands(registry: CommandRegistry): void
|
|
|
252
252
|
|
|
253
253
|
registry.register({
|
|
254
254
|
name: 'ops',
|
|
255
|
-
description: 'Operator
|
|
255
|
+
description: 'Operator runtime status: view Agent posture without local task/agent lifecycle mutations',
|
|
256
256
|
usage: '[view]',
|
|
257
257
|
argsHint: '[view]',
|
|
258
258
|
handler(args, ctx) {
|
|
@@ -260,7 +260,7 @@ export function registerOperatorRuntimeCommands(registry: CommandRegistry): void
|
|
|
260
260
|
|
|
261
261
|
if (sub === 'view' || sub === undefined) {
|
|
262
262
|
if (ctx.openOpsPanel) ctx.openOpsPanel();
|
|
263
|
-
else ctx.print('Operator
|
|
263
|
+
else ctx.print('Operator runtime status panel is not available. Enable the operator-control-plane feature flag.');
|
|
264
264
|
return;
|
|
265
265
|
}
|
|
266
266
|
|