@pellux/goodvibes-agent 0.1.64 → 0.1.66

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.
Files changed (36) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +3 -3
  3. package/docs/getting-started.md +2 -2
  4. package/docs/release-and-publishing.md +1 -1
  5. package/package.json +1 -1
  6. package/src/cli/help.ts +3 -3
  7. package/src/cli/management-commands.ts +7 -7
  8. package/src/cli/profiles-command.ts +8 -8
  9. package/src/cli/routines-command.ts +1 -1
  10. package/src/cli/service-posture.ts +1 -1
  11. package/src/cli/status.ts +3 -3
  12. package/src/input/agent-workspace-categories.ts +18 -19
  13. package/src/input/agent-workspace-setup.ts +4 -4
  14. package/src/input/commands/agent-runtime-profile-runtime.ts +9 -9
  15. package/src/input/commands/experience-runtime.ts +4 -4
  16. package/src/input/commands/health-runtime.ts +1 -1
  17. package/src/input/commands/local-setup-review.ts +1 -1
  18. package/src/input/commands/local-setup-transfer.ts +1 -1
  19. package/src/input/commands/local-setup.ts +2 -2
  20. package/src/input/commands/operator-runtime.ts +2 -2
  21. package/src/input/commands/product-runtime.ts +4 -4
  22. package/src/input/commands/remote-runtime-pool.ts +25 -42
  23. package/src/input/commands/remote-runtime-setup.ts +1 -1
  24. package/src/input/commands/remote-runtime.ts +14 -14
  25. package/src/input/commands/teleport-runtime.ts +1 -1
  26. package/src/input/onboarding/onboarding-wizard-steps.ts +2 -9
  27. package/src/panels/builtin/operations.ts +2 -2
  28. package/src/panels/control-plane-panel.ts +9 -9
  29. package/src/panels/ops-control-panel.ts +3 -3
  30. package/src/panels/provider-health-domains.ts +2 -2
  31. package/src/renderer/agent-workspace.ts +9 -9
  32. package/src/renderer/settings-modal-helpers.ts +13 -13
  33. package/src/renderer/settings-modal.ts +2 -2
  34. package/src/runtime/bootstrap.ts +1 -1
  35. package/src/runtime/diagnostics/panels/ops.ts +1 -1
  36. 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.66 - 2026-05-31
6
+
7
+ - Removed remote-runner and node/device posture wording from first-run Agent setup surfaces.
8
+ - Replaced the blocked remote-runner workspace action with a read-only build-delegation status action.
9
+ - Added onboarding/workspace regressions to keep visible setup focused on Agent features instead of copied runner internals.
10
+
11
+ ## 0.1.65 - 2026-05-31
12
+
13
+ - Made the operator workspace more product-facing by replacing foundation/setup jargon with Agent profile, runtime status, voice/media, and browser-tool language.
14
+ - Removed the remote-runner item from the first-run voice/media workspace so day-one setup stays focused on user-facing assistant capabilities.
15
+ - Reworded settings, status panels, profile commands, and docs away from control-plane/runtime-profile terminology while preserving the same underlying contracts.
16
+
5
17
  ## 0.1.64 - 2026-05-31
6
18
 
7
19
  - Cleaned remaining visible setup, workspace, panel, and auth wording that still exposed copied runtime-host terminology.
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 runtime profiles from them.
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 runtime profiles when one machine needs separate operator identities or local state:
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 TUI-derived 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.
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.
@@ -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 runtime profiles for repeatable local identities:
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 TUI-derived foundation code intentionally so Agent can use the mature terminal 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.
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 TUI 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 TUI-derived renderer, input, fullscreen workspace, command registry, and release bones.
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.64",
3
+ "version": "0.1.66",
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",
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 runtime profile homes',
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 runtime profile home',
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 runtime 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.',
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(`Control plane is enabled but not reachable on ${binding.host}:${binding.port}.`);
332
- if (enabled === true && service.enabled !== true) issues.push('Control plane is enabled on the external runtime config, but Agent service ownership is disabled.');
333
- if (enabled === true && service.autostart !== true) issues.push('Control plane is enabled on the external runtime config, but autostart is off.');
334
- if (enabled === true && service.restartOnFailure !== true) issues.push('Control plane is enabled on the external runtime config, but restart-on-failure is off.');
335
- if (isNetworkFacing(enabled, binding) && !auth.userStorePresent) issues.push('Network-facing control plane has no local auth user store.');
336
- if (isNetworkFacing(enabled, binding) && auth.bootstrapCredentialPresent) issues.push('Network-facing control plane still has a bootstrap credential file.');
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 control-plane status',
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 runtime profiles. Use: goodvibes-agent profiles create <name> --template <id> --yes';
66
+ if (profiles.length === 0) return 'No Agent profiles. Use: goodvibes-agent profiles create <name> --template <id> --yes';
67
67
  return [
68
- `Agent runtime profiles (${profiles.length})`,
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 runtime profile created: ${profile.id}`,
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 runtime profile deleted: ${profile.id}`;
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 runtime profile: ${profile.id}`, ` home: ${profile.homeDirectory}`, ...starter, ` use: goodvibes-agent --agent-profile ${profile.id}`].join('\n');
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 runtime profile ${name} without --yes.`,
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 runtime profile ${name} without --yes.`,
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 runtime profile not found: ${resolution.id}`,
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 a runtime profile from a starter template.',
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: 'control plane', enabledKey: 'controlPlane.enabled' },
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
  ];
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
- ['control plane', controlPlaneEnabled, controlPlaneBinding],
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, control-plane, listener, or web settings are enabled while service.enabled is false.',
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
  });
@@ -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, control-plane, listener, or web availability may not match the configuration.',
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
  }
@@ -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 surfaces without switching into coding-TUI behavior.',
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 node posture setup.', targetCategoryId: 'voice-media', kind: 'workspace', safety: 'safe' },
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 config workspace', detail: 'Use the TUI-derived fullscreen settings workspace.', command: '/config', kind: 'command', safety: 'safe' },
30
- { id: 'onboarding', label: 'Open setup wizard', detail: 'Review Agent runtime settings in the fullscreen setup flow.', command: '/onboarding', kind: 'command', safety: 'safe' },
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: 'Runtime profiles', detail: 'Browse starter templates for isolated Agent homes and operator identities.', command: '/agent-profile templates', kind: 'command', safety: 'read-only' },
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 TUI-derived QR pairing surface for companion app setup.', command: '/pair', kind: 'command', safety: 'safe' },
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' },
@@ -65,7 +65,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
65
65
  { id: 'knowledge-search', label: 'Search Agent knowledge', detail: 'Search the isolated Agent Knowledge index. Close this workspace and provide an actual query.', command: '/knowledge search <query>', kind: 'command', safety: 'read-only' },
66
66
  { id: 'knowledge-ingest-url', label: 'Ingest URL', detail: 'Ingest a URL into Agent Knowledge only. Requires an explicit --yes command with a real URL.', command: '/knowledge ingest-url <url> --yes', kind: 'command', safety: 'safe' },
67
67
  { id: 'knowledge-import-bookmarks', label: 'Import bookmarks', detail: 'Import a browser bookmark export into Agent Knowledge only. Requires an explicit --yes command with a real path.', command: '/knowledge import-bookmarks <path> --yes', kind: 'command', safety: 'safe' },
68
- { id: 'knowledge-review-queue', label: 'Review queue', detail: 'Inspect source/node/issue review work before accepting, rejecting, or resolving anything.', command: '/knowledge queue', kind: 'command', safety: 'read-only' },
68
+ { id: 'knowledge-review-queue', label: 'Review queue', detail: 'Inspect source, item, and issue review work before accepting, rejecting, or resolving anything.', command: '/knowledge queue', kind: 'command', safety: 'read-only' },
69
69
  { id: 'knowledge-consolidation', label: 'Consolidation review', detail: 'Inspect consolidation candidates and reports before running Agent Knowledge mutations.', command: '/knowledge candidates', kind: 'command', safety: 'read-only' },
70
70
  { id: 'knowledge-ask', label: 'Ask Agent knowledge', detail: 'Close this workspace and run /knowledge ask <question> or ask normally in chat.', kind: 'guidance', safety: 'read-only' },
71
71
  ],
@@ -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, Media & Nodes',
77
- summary: 'Voice, TTS, image input, browser surface, and node/remote posture.',
78
- detail: 'Voice, media, browser, and node surfaces are first-class operator surfaces. Agent uses the GoodVibes voice/media/provider/browser/remote bones while keeping runtime ownership external and side effects explicit.',
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 TUI-derived config workspace at the TTS settings group.', command: '/config tts', kind: 'command', safety: 'safe' },
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 surface status', detail: 'Inspect browser/web posture through setup diagnostics without starting inbound endpoints or runtime services.', command: '/setup services', kind: 'command', safety: 'read-only' },
84
+ { id: 'browser-tools', 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 & Portability',
91
+ label: 'Profiles',
93
92
  summary: 'Isolated Agent homes, config profiles, and setup bundles.',
94
- detail: '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 shared runtime external.',
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 TUI-derived config profile picker for display/provider/behavior profile files.', command: '/profiles', kind: 'command', safety: 'safe' },
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 runtime profile', detail: 'Create an isolated Agent runtime 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' },
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 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' },
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
  {
@@ -213,7 +212,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
213
212
  actions: [
214
213
  { id: 'delegate-guidance', label: 'Delegation rule', detail: 'For build/fix/review work, delegate one request to GoodVibes TUI instead of spawning local Engineer/Reviewer/Tester roots.', kind: 'guidance', safety: 'delegates' },
215
214
  { id: 'review-command', label: 'Review delegation command', detail: 'Use /delegate --wrfc <task> only when the user explicitly asks for code review/build execution. Close this workspace and include the actual task text.', kind: 'guidance', safety: 'delegates' },
216
- { id: 'remote-policy', label: 'Remote runner policy', detail: 'Remote dispatch/rerun is blocked in Agent; TUI owns runner topology for delegated build work.', command: '/remote dispatch', kind: 'command', safety: 'blocked' },
215
+ { id: 'delegation-status', label: 'Delegation status', detail: 'Inspect build-delegation receipts and shared-session status without starting coding work.', command: '/delegate status', kind: 'command', safety: 'read-only' },
217
216
  ],
218
217
  },
219
218
  ];
@@ -35,9 +35,9 @@ export function buildAgentWorkspaceSetupChecklist(input: AgentWorkspaceSetupChec
35
35
  return [
36
36
  {
37
37
  id: 'runtime',
38
- label: 'External runtime',
38
+ label: 'GoodVibes runtime',
39
39
  status: 'ready',
40
- detail: `Agent will connect to ${input.daemonBaseUrl}; runtime ownership stays outside this TUI.`,
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: 'Runtime profile',
61
+ label: 'Agent profile',
62
62
  status: setupStatusForCount(input.runtimeProfileCount, 'ready', 'optional'),
63
63
  detail: input.runtimeProfileCount > 0
64
- ? `${input.runtimeProfileCount} isolated runtime profile(s) are available.`
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
  },
@@ -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 Runtime Profiles',
47
- ' No isolated Agent runtime profiles yet.',
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 Runtime Profiles', ...profiles.map(profileLine)].join('\n');
51
+ return ['Agent Profiles', ...profiles.map(profileLine)].join('\n');
52
52
  }
53
53
 
54
54
  function renderTemplates(homeDirectory: string): string {
@@ -80,7 +80,7 @@ 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 a runtime profile from the imported starter:',
83
+ '5. Create an Agent profile from the imported starter:',
84
84
  ' /agent-profile create <name> --template <imported-id> --yes',
85
85
  '',
86
86
  'This writes only Agent-local starter/profile state. It does not mutate the runtime host, default wiki, or non-Agent knowledge segments.',
@@ -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 runtime profiles and starter templates',
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 runtime profile ${name}`, '/agent-profile create <name> [--template <id>] --yes');
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 runtime profile created: ${profile.id}`,
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 runtime profile ${name}`, '/agent-profile delete <name> --yes');
210
+ requireYesFlag(ctx, `delete Agent profile ${name}`, '/agent-profile delete <name> --yes');
211
211
  return;
212
212
  }
213
- ctx.print(deleteAgentRuntimeProfile(homeDirectory, name) ? `Agent runtime profile deleted: ${name}` : `Agent runtime profile not found: ${name}`);
213
+ ctx.print(deleteAgentRuntimeProfile(homeDirectory, name) ? `Agent profile deleted: ${name}` : `Agent profile not found: ${name}`);
214
214
  return;
215
215
  }
216
216
 
@@ -145,14 +145,14 @@ export function registerExperienceRuntimeCommands(registry: CommandRegistry): vo
145
145
  });
146
146
 
147
147
  registry.register({
148
- name: 'runner-pool',
148
+ name: 'worker-pool',
149
149
  aliases: ['pool'],
150
- description: 'Dedicated front-door for remote runner pool review and assignment flows',
150
+ description: 'Dedicated front-door for remote worker pool review flows',
151
151
  usage: '[list|show <id>|create <id> <label...>|assign <pool> <runner>|unassign <pool> <runner>]',
152
152
  async handler(args, ctx) {
153
153
  const sub = (args[0] ?? 'list').toLowerCase();
154
154
  if (!ctx.executeCommand) {
155
- ctx.print('Runner pool controls are not available in this runtime.');
155
+ ctx.print('Remote worker pool controls are not available in this runtime.');
156
156
  return;
157
157
  }
158
158
  if (sub === 'list') {
@@ -171,7 +171,7 @@ export function registerExperienceRuntimeCommands(registry: CommandRegistry): vo
171
171
  await ctx.executeCommand('remote', ['pool', sub, args[1], args[2]]);
172
172
  return;
173
173
  }
174
- ctx.print('Usage: /runner-pool [list|show <id>|create <id> <label...>|assign <pool> <runner>|unassign <pool> <runner>]');
174
+ ctx.print('Usage: /worker-pool [list|show <id>]');
175
175
  },
176
176
  });
177
177
 
@@ -317,7 +317,7 @@ export function registerHealthRuntimeCommands(registry: CommandRegistry): void {
317
317
  ` settings conflicts: ${settingsSnapshot.conflicts.length}`,
318
318
  ` managed locks: ${settingsSnapshot.managedLockCount}`,
319
319
  ` local auth users: ${readModels.localAuth.getSnapshot().userCount}`,
320
- ` remote runners: ${snapshot.remoteRunnerCount}`,
320
+ ` remote workers: ${snapshot.remoteRunnerCount}`,
321
321
  ...formatSessionMaintenanceLines(maintenance, 'guided').map((line) => ` ${line}`),
322
322
  ...(snapshot.issues.length > 0 ? ['', ...snapshot.issues.map((issue) => ` [${issue.severity.toUpperCase()}] ${issue.area}: ${issue.message}`)] : []),
323
323
  ...(snapshot.serviceIssues.length > 0 ? ['', ...snapshot.serviceIssues.map((issue) => ` service: ${issue}`)] : []),
@@ -89,7 +89,7 @@ export async function buildSetupReviewSnapshot(ctx: CommandContext): Promise<Set
89
89
  {
90
90
  severity: remoteRunnerCount > 0 ? 'pass' : 'warn',
91
91
  area: 'remote',
92
- message: remoteRunnerCount > 0 ? `${remoteRunnerCount} remote runner contract(s)` : 'no remote runner contracts registered',
92
+ message: remoteRunnerCount > 0 ? `${remoteRunnerCount} remote worker contract(s)` : 'no remote worker contracts registered',
93
93
  },
94
94
  ];
95
95
 
@@ -56,7 +56,7 @@ export function inspectSetupTransferBundle(bundle: SetupTransferBundle): string
56
56
  ` services: ${bundle.startupReview.serviceCount}`,
57
57
  ` plugins: ${bundle.startupReview.pluginCount}`,
58
58
  ` skills: ${bundle.startupReview.skillCount}`,
59
- ` remote runners: ${bundle.startupReview.remoteRunnerCount}`,
59
+ ` remote workers: ${bundle.startupReview.remoteRunnerCount}`,
60
60
  ` config keys: ${Object.keys(bundle.config ?? {}).length}`,
61
61
  ` curated plugins: ${ecosystemPluginCount}`,
62
62
  ` curated skills: ${ecosystemSkillCount}`,
@@ -57,7 +57,7 @@ export function registerLocalSetupCommands(registry: CommandRegistry): void {
57
57
  ` mcp servers known: ${snapshot.mcpServerCount}`,
58
58
  ` mcp quarantined: ${snapshot.quarantinedMcpCount}`,
59
59
  ` mcp elevated: ${snapshot.elevatedMcpCount}`,
60
- ` remote runners: ${snapshot.remoteRunnerCount}`,
60
+ ` remote workers: ${snapshot.remoteRunnerCount}`,
61
61
  '',
62
62
  ` service ids: ${snapshot.services.join(', ') || '(none)'}`,
63
63
  ` plugin dirs: ${snapshot.pluginDirectories.join(', ') || '(none)'}`,
@@ -111,7 +111,7 @@ export function registerLocalSetupCommands(registry: CommandRegistry): void {
111
111
  const runners = ctx.ops.remoteRuntime?.listContracts() ?? [];
112
112
  ctx.print([
113
113
  'Startup Remote',
114
- ` runner contracts: ${snapshot.remoteRunnerCount}`,
114
+ ` worker contracts: ${snapshot.remoteRunnerCount}`,
115
115
  ...runners.map((runner) => ` ${runner.id} [${runner.trustClass}] ${runner.label}`),
116
116
  ].join('\n'));
117
117
  return;
@@ -252,7 +252,7 @@ export function registerOperatorRuntimeCommands(registry: CommandRegistry): void
252
252
 
253
253
  registry.register({
254
254
  name: 'ops',
255
- description: 'Operator Control Plane: view Agent operator posture without local task/agent lifecycle mutations',
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 Control Plane panel is not available. Enable the operator-control-plane feature flag.');
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
 
@@ -131,14 +131,14 @@ export function registerProductRuntimeCommands(registry: CommandRegistry): void
131
131
  });
132
132
  registry.register({
133
133
  name: 'bridge',
134
- description: 'Review and operate self-hosted bridge and remote runner flows',
134
+ description: 'Review self-hosted bridge and remote worker flows',
135
135
  usage: '[status|pools|assign <pool> <runner> --yes|runner <id>|review <artifactId>|export <artifactId> [path] --yes|import <path> --yes]',
136
136
  async handler(args, ctx) {
137
137
  const parsed = stripYesFlag(args);
138
138
  const commandArgs = [...parsed.rest];
139
139
  const shellPaths = requireShellPaths(ctx);
140
140
  if (!ctx.ops.remoteRuntime) {
141
- ctx.print('Remote runner registry is not available in this runtime.');
141
+ ctx.print('Remote worker registry is not available in this runtime.');
142
142
  return;
143
143
  }
144
144
  const remoteRegistry = ctx.ops.remoteRuntime;
@@ -148,7 +148,7 @@ export function registerProductRuntimeCommands(registry: CommandRegistry): void
148
148
  ctx.print([
149
149
  'Bridge Status',
150
150
  ` remote pools: ${remote.pools.length}`,
151
- ` runner contracts: ${remote.contracts.length}`,
151
+ ` worker contracts: ${remote.contracts.length}`,
152
152
  ` review artifacts: ${remote.artifacts.length}`,
153
153
  ].join('\n'));
154
154
  return;
@@ -157,7 +157,7 @@ export function registerProductRuntimeCommands(registry: CommandRegistry): void
157
157
  const pools = remoteRegistry.listPools();
158
158
  ctx.print(pools.length > 0
159
159
  ? ['Bridge Pools', ...pools.map((pool) => ` ${pool.id} runners=${pool.runnerIds.length} trust=${pool.trustClass}`)].join('\n')
160
- : 'Bridge Pools\n No runner pools registered yet.');
160
+ : 'Bridge Pools\n No worker pools registered yet.');
161
161
  return;
162
162
  }
163
163
  if (sub === 'assign') {
@@ -13,9 +13,6 @@ type RemotePoolLike = {
13
13
  type RemoteRegistryLike = {
14
14
  listPools(): readonly RemotePoolLike[];
15
15
  getPool(id: string): RemotePoolLike | null | undefined;
16
- createPool(input: { id: string; label: string }): RemotePoolLike;
17
- assignRunnerToPool(poolId: string, runnerId: string): RemotePoolLike | null | undefined;
18
- removeRunnerFromPool(poolId: string, runnerId: string): RemotePoolLike | null | undefined;
19
16
  };
20
17
 
21
18
  export function handleRemotePoolCommand(
@@ -29,12 +26,12 @@ export function handleRemotePoolCommand(
29
26
  if (mode === 'list') {
30
27
  const pools = remoteRegistry.listPools();
31
28
  if (pools.length === 0) {
32
- ctx.print('No remote runner pools defined yet.');
29
+ ctx.print('No remote worker pools defined yet.');
33
30
  return true;
34
31
  }
35
32
  ctx.print([
36
- `Remote Runner Pools (${pools.length})`,
37
- ...pools.map((pool) => ` ${pool.id} ${pool.runnerIds.length} runners trust=${pool.trustClass} template=${pool.preferredTemplate ?? '(none)'}`),
33
+ `Remote Worker Pools (${pools.length})`,
34
+ ...pools.map((pool) => ` ${pool.id} ${pool.runnerIds.length} workers trust=${pool.trustClass} template=${pool.preferredTemplate ?? '(none)'}`),
38
35
  ].join('\n'));
39
36
  return true;
40
37
  }
@@ -46,59 +43,45 @@ export function handleRemotePoolCommand(
46
43
  }
47
44
  const pool = remoteRegistry.getPool(poolId);
48
45
  if (!pool) {
49
- ctx.print(`Unknown remote runner pool: ${poolId}`);
46
+ ctx.print(`Unknown remote worker pool: ${poolId}`);
50
47
  return true;
51
48
  }
52
49
  ctx.print([
53
- `Remote Runner Pool ${pool.id}`,
50
+ `Remote Worker Pool ${pool.id}`,
54
51
  ` label: ${pool.label}`,
55
52
  ` trustClass: ${pool.trustClass}`,
56
53
  ` preferredTemplate: ${pool.preferredTemplate ?? '(none)'}`,
57
- ` maxRunners: ${pool.maxRunners ?? '(unbounded)'}`,
58
- ` runners: ${pool.runnerIds.join(', ') || '(none)'}`,
54
+ ` maxWorkers: ${pool.maxRunners ?? '(unbounded)'}`,
55
+ ` workers: ${pool.runnerIds.join(', ') || '(none)'}`,
59
56
  ` description: ${pool.description ?? '(none)'}`,
60
57
  ].join('\n'));
61
58
  return true;
62
59
  }
63
60
  if (mode === 'create') {
64
- const poolId = args[2];
65
- if (!poolId) {
66
- ctx.print('Usage: /remote pool create <poolId> [label]');
67
- return true;
68
- }
69
- const label = args.slice(3).join(' ').trim() || poolId;
70
- const pool = remoteRegistry.createPool({ id: poolId, label });
71
- ctx.print(`Created remote runner pool ${pool.id} (${pool.label}).`);
61
+ ctx.print([
62
+ 'Remote worker pool mutation is blocked in GoodVibes Agent.',
63
+ ' requested: /remote pool create',
64
+ ' policy: Agent inspects remote worker pools but does not manage worker topology',
65
+ ' next: use the owning GoodVibes runtime or delegated build environment for worker-pool administration',
66
+ ].join('\n'));
72
67
  return true;
73
68
  }
74
69
  if (mode === 'assign') {
75
- const poolId = args[2];
76
- const runnerId = args[3];
77
- if (!poolId || !runnerId) {
78
- ctx.print('Usage: /remote pool assign <poolId> <runnerId>');
79
- return true;
80
- }
81
- const pool = remoteRegistry.assignRunnerToPool(poolId, runnerId);
82
- if (!pool) {
83
- ctx.print(`Could not assign ${runnerId} to pool ${poolId}.`);
84
- return true;
85
- }
86
- ctx.print(`Assigned remote runner ${runnerId} to pool ${poolId}.`);
70
+ ctx.print([
71
+ 'Remote worker pool mutation is blocked in GoodVibes Agent.',
72
+ ' requested: /remote pool assign',
73
+ ' policy: Agent inspects remote worker pools but does not manage worker topology',
74
+ ' next: use the owning GoodVibes runtime or delegated build environment for worker-pool administration',
75
+ ].join('\n'));
87
76
  return true;
88
77
  }
89
78
  if (mode === 'unassign') {
90
- const poolId = args[2];
91
- const runnerId = args[3];
92
- if (!poolId || !runnerId) {
93
- ctx.print('Usage: /remote pool unassign <poolId> <runnerId>');
94
- return true;
95
- }
96
- const pool = remoteRegistry.removeRunnerFromPool(poolId, runnerId);
97
- if (!pool) {
98
- ctx.print(`Unknown remote runner pool: ${poolId}`);
99
- return true;
100
- }
101
- ctx.print(`Removed remote runner ${runnerId} from pool ${poolId}.`);
79
+ ctx.print([
80
+ 'Remote worker pool mutation is blocked in GoodVibes Agent.',
81
+ ' requested: /remote pool unassign',
82
+ ' policy: Agent inspects remote worker pools but does not manage worker topology',
83
+ ' next: use the owning GoodVibes runtime or delegated build environment for worker-pool administration',
84
+ ].join('\n'));
102
85
  return true;
103
86
  }
104
87
  ctx.print('Usage: /remote pool <list|show|create|assign|unassign> ...');
@@ -45,7 +45,7 @@ export async function handleRemoteSetupCommand(
45
45
  ` acp agent command: ${command.join(' ')}`,
46
46
  ` runtime host enabled: ${danger.daemon ? 'yes' : 'no'}`,
47
47
  ` inbound listener enabled: ${danger.httpListener ? 'yes' : 'no'}`,
48
- ` remote runner contracts: ${remoteRegistry.listContracts().length}`,
48
+ ` remote worker contracts: ${remoteRegistry.listContracts().length}`,
49
49
  ` active acp connections: ${activeConnections.length}`,
50
50
  '',
51
51
  ' guidance:',
@@ -11,11 +11,11 @@ type RemoteCancelContext = Pick<CommandContext, 'print'>;
11
11
 
12
12
  function printRemoteDelegationBoundary(ctx: Pick<CommandContext, 'print'>, requestedAction: string): void {
13
13
  ctx.print([
14
- 'GoodVibes Agent does not dispatch remote/local coding runners from this surface.',
14
+ 'GoodVibes Agent does not dispatch remote/local coding workers from this surface.',
15
15
  ` requested: ${requestedAction}`,
16
16
  ' policy: keep ordinary work serial in the main assistant conversation',
17
17
  ' build/fix/review: delegate one request to GoodVibes TUI through the public shared-session/build-delegation contract',
18
- ' preserve: full original user ask and executionIntent; let TUI own runner/WRFC topology when explicitly requested',
18
+ ' preserve: full original user ask and executionIntent; let TUI own execution and WRFC chain details when explicitly requested',
19
19
  ].join('\n'));
20
20
  }
21
21
 
@@ -45,8 +45,8 @@ export function registerRemoteRuntimeCommands(registry: CommandRegistry): void {
45
45
  registry.register({
46
46
  name: 'remote',
47
47
  aliases: [],
48
- description: 'Inspect, dispatch, and review self-hosted remote runners and artifacts',
49
- usage: '[list | show [agentId] | supervisor [runnerId] | support [runnerId] | recover [runnerId] | setup [export <path> --yes] | env [export <path> --yes] | tunnel [review|export <path> --yes] | bootstrap [export <path> --yes|inspect <path>] | session <export|inspect|import> <path> [--yes] | pool <list|show|create|assign|unassign> ... | dispatch [template] <description> | dispatch-pool <pool> [template] <description> | contract [agentId] | cancel <agentId> | export <agentId> [path] --yes | artifact list | artifact show <id> | artifact export <id> [path] --yes | review <id> | rerun-local <id> | import <path> --yes]',
48
+ description: 'Inspect remote workers, delegated work receipts, and review artifacts',
49
+ usage: '[list | show [agentId] | supervisor [workerId] | support [workerId] | recover [workerId] | setup [export <path> --yes] | env [export <path> --yes] | tunnel [review|export <path> --yes] | bootstrap [export <path> --yes|inspect <path>] | session <export|inspect|import> <path> [--yes] | pool <list|show> ... | dispatch [template] <description> | dispatch-pool <pool> [template] <description> | contract [agentId] | cancel <agentId> | export <agentId> [path] --yes | artifact list | artifact show <id> | artifact export <id> [path] --yes | review <id> | rerun-local <id> | import <path> --yes]',
50
50
  async handler(args, ctx) {
51
51
  if (args.length === 0) {
52
52
  if (ctx.openRemotePanel) {
@@ -85,8 +85,8 @@ export function registerRemoteRuntimeCommands(registry: CommandRegistry): void {
85
85
  const lines = [
86
86
  'Remote Control Surface',
87
87
  ` active connections: ${activeConnections.length}`,
88
- ` runner contracts: ${contracts.length}`,
89
- ` runner pools: ${pools.length}`,
88
+ ` worker contracts: ${contracts.length}`,
89
+ ` worker pools: ${pools.length}`,
90
90
  ` review artifacts: ${artifacts.length}`,
91
91
  ` supervisor sessions: ${supervisor.sessions.length}`,
92
92
  ` degraded sessions: ${supervisor.degradedConnections}`,
@@ -131,7 +131,7 @@ export function registerRemoteRuntimeCommands(registry: CommandRegistry): void {
131
131
  ` messageCount: ${selected.messageCount}`,
132
132
  ` errorCount: ${selected.errorCount}`,
133
133
  ...(selected.lastError ? [` lastError: ${selected.lastError}`] : []),
134
- ' runner support:',
134
+ ' worker support:',
135
135
  ...selected.capabilities.map((capability) => ` ${capability.id}: ${capability.supported ? 'yes' : 'no'} (${capability.detail})`),
136
136
  ' recovery:',
137
137
  ...selected.recovery.map((action) => ` ${action.command} — ${action.reason}`),
@@ -146,7 +146,7 @@ export function registerRemoteRuntimeCommands(registry: CommandRegistry): void {
146
146
  ? snapshot.sessions.find((entry) => entry.runnerId === runnerId)
147
147
  : snapshot.sessions[0];
148
148
  if (!selected) {
149
- ctx.print(runnerId ? `Unknown remote runner: ${runnerId}` : 'No remote supervisor sessions are currently tracked.');
149
+ ctx.print(runnerId ? `Unknown remote worker: ${runnerId}` : 'No remote supervisor sessions are currently tracked.');
150
150
  return;
151
151
  }
152
152
  ctx.print([
@@ -157,7 +157,7 @@ export function registerRemoteRuntimeCommands(registry: CommandRegistry): void {
157
157
  ` reviewMode: ${selected.negotiation.reviewMode}`,
158
158
  ` communicationLane: ${selected.negotiation.communicationLane}`,
159
159
  ` trustClass: ${selected.negotiation.trustClass}`,
160
- ' runner support:',
160
+ ' worker support:',
161
161
  ...selected.capabilities.map((capability) => (
162
162
  ` ${capability.id}: ${capability.supported ? 'supported' : 'missing'} — ${capability.detail}`
163
163
  )),
@@ -172,7 +172,7 @@ export function registerRemoteRuntimeCommands(registry: CommandRegistry): void {
172
172
  ? snapshot.sessions.find((entry) => entry.runnerId === runnerId)
173
173
  : snapshot.sessions.find((entry) => entry.recovery.length > 0) ?? snapshot.sessions[0];
174
174
  if (!selected) {
175
- ctx.print(runnerId ? `Unknown remote runner: ${runnerId}` : 'No remote supervisor sessions are currently tracked.');
175
+ ctx.print(runnerId ? `Unknown remote worker: ${runnerId}` : 'No remote supervisor sessions are currently tracked.');
176
176
  return;
177
177
  }
178
178
  const nextSteps = selected.recovery.length > 0
@@ -254,7 +254,7 @@ export function registerRemoteRuntimeCommands(registry: CommandRegistry): void {
254
254
  }
255
255
  const pool = remoteRunners.getPool(poolId);
256
256
  if (!pool) {
257
- ctx.print(`Unknown remote runner pool: ${poolId}`);
257
+ ctx.print(`Unknown remote worker pool: ${poolId}`);
258
258
  return;
259
259
  }
260
260
  let template = pool.preferredTemplate ?? 'general';
@@ -275,16 +275,16 @@ export function registerRemoteRuntimeCommands(registry: CommandRegistry): void {
275
275
  if (subcommand === 'contract') {
276
276
  const agentId = args[1] ?? activeConnections[0]?.agentId;
277
277
  if (!agentId) {
278
- ctx.print('No remote runner contracts are available yet.');
278
+ ctx.print('No remote worker contracts are available yet.');
279
279
  return;
280
280
  }
281
281
  const contract = remoteRunners.upsertContractForAgent(agentId);
282
282
  if (!contract) {
283
- ctx.print(`Unknown remote runner: ${agentId}`);
283
+ ctx.print(`Unknown remote worker: ${agentId}`);
284
284
  return;
285
285
  }
286
286
  ctx.print([
287
- `Remote runner contract ${contract.id}`,
287
+ `Remote worker contract ${contract.id}`,
288
288
  ` runnerId: ${contract.runnerId}`,
289
289
  ` label: ${contract.label}`,
290
290
  ` pool: ${contract.poolId ?? '(none)'}`,
@@ -35,7 +35,7 @@ export function registerTeleportRuntimeCommands(registry: CommandRegistry): void
35
35
  try {
36
36
  peerClient = requirePeerClient(ctx);
37
37
  } catch {
38
- ctx.print('Remote runner registry is not available in this runtime.');
38
+ ctx.print('Remote worker registry is not available in this runtime.');
39
39
  return;
40
40
  }
41
41
  const targetPath = shellPaths.resolveWorkspacePath(pathArg);
@@ -201,7 +201,7 @@ export function buildAgentSetupStep(controller: OnboardingWizardController): Onb
201
201
  {
202
202
  kind: 'status',
203
203
  id: 'agent-setup.profile-guide',
204
- label: 'Runtime profiles',
204
+ label: 'Agent profiles',
205
205
  hint: 'Use /agent-profile guide after setup to create household, research, travel, operations, or custom Agent profiles.',
206
206
  defaultValue: 'Local profiles',
207
207
  },
@@ -378,7 +378,7 @@ export function buildLocalStateStep(): OnboardingWizardStepDefinition {
378
378
  id: 'agent-local-state',
379
379
  title: 'Local memory and behavior',
380
380
  shortLabel: 'Memory',
381
- description: 'Review the Agent-local behavior model. Memory, personas, skills, routines, and runtime profiles stay local until a stable shared registry exists.',
381
+ description: 'Review the Agent-local behavior model. Memory, personas, skills, routines, and Agent profiles stay local until a stable shared registry exists.',
382
382
  summaryTitle: 'Local Agent state',
383
383
  summaryLines: [
384
384
  'Memory/personas/skills/routines: local Agent registries',
@@ -497,13 +497,6 @@ export function buildVoiceMediaStep(): OnboardingWizardStepDefinition {
497
497
  hint: 'Media output uses configured providers and visible command/turn flow; external publication still requires explicit approval.',
498
498
  defaultValue: 'Policy gated',
499
499
  },
500
- {
501
- kind: 'status',
502
- id: 'agent-voice-media.nodes',
503
- label: 'Node and device posture',
504
- hint: 'Remote devices and nodes are inspected only when useful. Agent onboarding does not launch runners or background service processes.',
505
- defaultValue: 'External',
506
- },
507
500
  ],
508
501
  };
509
502
  }
@@ -102,7 +102,7 @@ export function registerOperationsPanels(manager: PanelManager, deps: ResolvedBu
102
102
  name: 'Automation',
103
103
  icon: 'M',
104
104
  category: 'monitoring',
105
- description: 'Automation jobs, runs, deliveries, and failure posture across the control plane',
105
+ description: 'Automation jobs, runs, deliveries, and failure posture across the shared runtime',
106
106
  factory: () => new AutomationControlPanel(ui.readModels.automation),
107
107
  });
108
108
 
@@ -126,7 +126,7 @@ export function registerOperationsPanels(manager: PanelManager, deps: ResolvedBu
126
126
 
127
127
  manager.registerType({
128
128
  id: 'control-plane',
129
- name: 'Control Plane',
129
+ name: 'Runtime Status',
130
130
  icon: 'C',
131
131
  category: 'monitoring',
132
132
  description: 'Runtime state, clients, approvals, and recent operator activity',
@@ -42,7 +42,7 @@ export class ControlPlanePanel extends ScrollableListPanel<ControlPlaneClient> {
42
42
  private readonly unsub: (() => void) | null;
43
43
 
44
44
  public constructor(private readonly readModel?: UiReadModel<UiControlPlaneSnapshot>) {
45
- super('control-plane', 'Control Plane', 'C', 'monitoring');
45
+ super('control-plane', 'Runtime Status', 'C', 'monitoring');
46
46
  this.showSelectionGutter = true; // I5: non-color selection affordance
47
47
  this.unsub = readModel ? readModel.subscribe(() => this.markDirty()) : null;
48
48
  }
@@ -72,7 +72,7 @@ export class ControlPlanePanel extends ScrollableListPanel<ControlPlaneClient> {
72
72
  }
73
73
 
74
74
  protected override getEmptyStateMessage(): string {
75
- return ' No control-plane activity recorded.';
75
+ return ' No runtime activity recorded.';
76
76
  }
77
77
 
78
78
  protected override getEmptyStateActions(): Array<{ command: string; summary: string }> {
@@ -83,18 +83,18 @@ export class ControlPlanePanel extends ScrollableListPanel<ControlPlaneClient> {
83
83
  }
84
84
 
85
85
  public render(width: number, height: number): Line[] {
86
- const intro = 'Shared runtime state, live clients, approval pressure, and recent omnichannel session posture.';
86
+ const intro = 'Shared runtime state, live clients, approval pressure, and recent channel session posture.';
87
87
 
88
88
  if (!this.readModel) {
89
89
  const workspace = buildPanelWorkspace(width, height, {
90
- title: 'Control Plane',
90
+ title: 'Runtime Status',
91
91
  intro,
92
92
  sections: [{
93
93
  lines: buildEmptyState(
94
94
  width,
95
95
  ' Runtime read model not wired.',
96
- 'This panel needs the shared control-plane read model to inspect clients, requests, and approvals.',
97
- [{ command: '/cockpit', summary: 'use the cockpit while control-plane wiring is unavailable' }],
96
+ 'This panel needs the shared runtime read model to inspect clients, requests, and approvals.',
97
+ [{ command: '/cockpit', summary: 'use the cockpit while runtime wiring is unavailable' }],
98
98
  C,
99
99
  ),
100
100
  }],
@@ -128,9 +128,9 @@ export class ControlPlanePanel extends ScrollableListPanel<ControlPlaneClient> {
128
128
 
129
129
  if (clients.length === 0 && approvals.length === 0 && sessions.length === 0) {
130
130
  return this.renderList(width, height, {
131
- title: 'Control Plane',
131
+ title: 'Runtime Status',
132
132
  header: headerLines,
133
- emptyMessage: ' No control-plane activity recorded.',
133
+ emptyMessage: ' No runtime activity recorded.',
134
134
  });
135
135
  }
136
136
 
@@ -203,7 +203,7 @@ export class ControlPlanePanel extends ScrollableListPanel<ControlPlaneClient> {
203
203
  footerLines.push(buildPanelLine(width, [[' Up/Down move through connected clients', C.dim]]));
204
204
 
205
205
  return this.renderList(width, height, {
206
- title: 'Control Plane',
206
+ title: 'Runtime Status',
207
207
  header: headerLines,
208
208
  footer: footerLines,
209
209
  });
@@ -1,5 +1,5 @@
1
1
  /**
2
- * OpsControlPanel — operator control plane UI panel.
2
+ * OpsControlPanel — operator intervention log panel.
3
3
  *
4
4
  * Renders the ops audit log sourced from the OpsPanel diagnostics subscriber.
5
5
  * Each entry shows: seq, timestamp, action, target, outcome, and optional note.
@@ -130,7 +130,7 @@ export class OpsControlPanel extends ScrollableListPanel<OpsAuditEntry> {
130
130
  }
131
131
 
132
132
  protected override getEmptyStateActions(): Array<{ command: string; summary: string }> {
133
- return [{ command: '/cockpit', summary: 'open the cockpit and drive runtime interventions from the control rooms' }];
133
+ return [{ command: '/cockpit', summary: 'open the cockpit and review runtime interventions' }];
134
134
  }
135
135
 
136
136
  public render(width: number, height: number): Line[] {
@@ -142,7 +142,7 @@ export class OpsControlPanel extends ScrollableListPanel<OpsAuditEntry> {
142
142
  ];
143
143
 
144
144
  return this.renderList(width, height, {
145
- title: 'Operator Control Plane',
145
+ title: 'Operator Interventions',
146
146
  header: headerLines,
147
147
  footer: footerLines,
148
148
  });
@@ -63,10 +63,10 @@ export function buildProviderHealthDomainSummaries(
63
63
  name: 'settings',
64
64
  level: !settings.available ? 'info' : settingIssueCount > 0 ? 'warn' : 'good',
65
65
  summary: !settings.available
66
- ? 'settings control plane unavailable'
66
+ ? 'settings runtime API unavailable'
67
67
  : settingIssueCount > 0
68
68
  ? `${settings.conflictCount} conflicts / ${settings.recentFailureCount} failures${settings.hasStagedManagedBundle ? ' / staged bundle' : ''}`
69
- : 'settings control plane clean',
69
+ : 'settings runtime API clean',
70
70
  next: settingIssueCount > 0 ? '/settingssync panel' : '/settingssync show <key>',
71
71
  details: [
72
72
  settings.conflictCount > 0 ? `${settings.conflictCount} unresolved import conflict(s)` : '',
@@ -153,8 +153,8 @@ function snapshotLines(workspace: AgentWorkspace, category: AgentWorkspaceCatego
153
153
  );
154
154
  } else if (category.id === 'setup') {
155
155
  base.push(
156
- { text: `External runtime: ${snapshot.daemonBaseUrl}`, fg: PALETTE.info },
157
- { text: `Runtime ownership: ${snapshot.daemonOwnership}; Agent never starts or restarts it`, fg: PALETTE.good },
156
+ { text: `GoodVibes runtime: ${snapshot.daemonBaseUrl}`, fg: PALETTE.info },
157
+ { text: `Runtime owner: ${snapshot.daemonOwnership}; Agent connects but never starts or restarts it`, fg: PALETTE.good },
158
158
  { text: `Workspace: ${snapshot.workingDirectory}`, fg: PALETTE.muted },
159
159
  { text: `Home: ${snapshot.homeDirectory}`, fg: PALETTE.muted },
160
160
  { text: '' },
@@ -166,7 +166,7 @@ function snapshotLines(workspace: AgentWorkspace, category: AgentWorkspaceCatego
166
166
  const configuredDefaults = snapshot.channels.filter((channel) => channel.defaultTarget === 'configured').length;
167
167
  const disabledChannels = snapshot.channels.filter((channel) => !channel.enabled).map((channel) => channel.label).join(', ');
168
168
  base.push(
169
- { text: `External runtime: ${snapshot.daemonBaseUrl}`, fg: PALETTE.info },
169
+ { text: `GoodVibes runtime: ${snapshot.daemonBaseUrl}`, fg: PALETTE.info },
170
170
  { text: `Readiness: ${readyCount}/${snapshot.channels.length} ready; ${enabledCount} enabled; ${configuredDefaults} default target(s) configured.`, fg: PALETTE.info },
171
171
  { text: `Disabled channels: ${disabledChannels || 'none'}.`, fg: PALETTE.dim },
172
172
  { text: 'Pairing: use /pair or /qrcode for companion setup.', fg: PALETTE.info },
@@ -195,18 +195,18 @@ function snapshotLines(workspace: AgentWorkspace, category: AgentWorkspaceCatego
195
195
  { text: `Voice surface: ${snapshot.voiceSurfaceEnabled ? 'enabled' : 'disabled'}; use /voice review for portable voice posture.`, fg: snapshot.voiceSurfaceEnabled ? PALETTE.warn : PALETTE.muted },
196
196
  { text: `TTS config: provider ${snapshot.ttsProvider}; voice ${snapshot.ttsVoice}; response model ${snapshot.ttsResponseModel}.`, fg: PALETTE.info },
197
197
  { text: `Media providers: ${snapshot.mediaProviderCount}; understanding: ${snapshot.mediaUnderstandingProviderCount}; generation: ${snapshot.mediaGenerationProviderCount}.`, fg: PALETTE.info },
198
- { text: `Browser surface: ${snapshot.browserSurfaceEnabled ? 'enabled' : 'disabled'}; public base URL ${snapshot.browserSurfacePublicBaseUrl}.`, fg: snapshot.browserSurfaceEnabled ? PALETTE.warn : PALETTE.muted },
199
- { text: 'Node/remote posture is read-only here; build dispatch remains explicit TUI delegation.', fg: PALETTE.good },
198
+ { text: `Browser tools: ${snapshot.browserSurfaceEnabled ? 'available' : 'not advertised'}; public base URL ${snapshot.browserSurfacePublicBaseUrl}.`, fg: snapshot.browserSurfaceEnabled ? PALETTE.warn : PALETTE.muted },
199
+ { text: 'Build dispatch stays out of setup; explicit delegation is handled from the Build Delegation workspace.', fg: PALETTE.good },
200
200
  { text: 'Image input uses prompt attachments; media generation/provider setup stays behind explicit commands and configured providers.', fg: PALETTE.muted },
201
201
  );
202
202
  } else if (category.id === 'profiles') {
203
203
  base.push(
204
- { text: `Active runtime profile: ${snapshot.activeRuntimeProfile}`, fg: PALETTE.info },
205
- { text: `Runtime profiles under this home: ${snapshot.runtimeProfileCount}`, fg: PALETTE.info },
206
- { text: `Runtime profile root: ${snapshot.runtimeProfileRoot}`, fg: PALETTE.muted },
204
+ { text: `Active Agent profile: ${snapshot.activeRuntimeProfile}`, fg: PALETTE.info },
205
+ { text: `Agent profiles under this home: ${snapshot.runtimeProfileCount}`, fg: PALETTE.info },
206
+ { text: `Agent profile root: ${snapshot.runtimeProfileRoot}`, fg: PALETTE.muted },
207
207
  { text: `Starter templates: ${snapshot.runtimeStarterTemplateCount}; local custom: ${snapshot.localStarterTemplateCount}`, fg: PALETTE.info },
208
208
  { text: `Config profiles: ${snapshot.configProfileCount}`, fg: PALETTE.info },
209
- { text: 'Named runtime profiles isolate Agent-local config, sessions, memory, personas, skills, routines, setup, and bundles.', fg: PALETTE.good },
209
+ { text: 'Named Agent profiles isolate local config, sessions, memory, personas, skills, routines, setup, and bundles.', fg: PALETTE.good },
210
210
  { text: 'Starter authoring: browse, export, edit, import, and create Agent profiles from inside this workspace via /agent-profile.', fg: PALETTE.info },
211
211
  { text: 'The external GoodVibes runtime remains shared unless the owning host is configured separately.', fg: PALETTE.warn },
212
212
  { text: 'Portable bundles require explicit export/import commands with real paths and --yes.', fg: PALETTE.muted },
@@ -87,7 +87,7 @@ export const CATEGORY_LABELS: Record<(typeof SETTINGS_CATEGORIES)[number], strin
87
87
  helper: 'Helper',
88
88
  tts: 'TTS',
89
89
  service: 'Service',
90
- controlPlane: 'Control Plane',
90
+ controlPlane: 'Runtime API',
91
91
  httpListener: 'HTTP Listener',
92
92
  web: 'Web',
93
93
  batch: 'Batch',
@@ -123,18 +123,18 @@ export const SETTING_LABELS: Partial<Record<string, string>> = {
123
123
  'helper.enabled': 'Helper Enabled',
124
124
  'helper.globalProvider': 'Helper Provider',
125
125
  'helper.globalModel': 'Helper Model',
126
- // Control Plane
127
- 'controlPlane.enabled': 'CP Enabled',
128
- 'controlPlane.hostMode': 'CP Host Mode',
129
- 'controlPlane.host': 'CP Host',
130
- 'controlPlane.port': 'CP Port',
131
- 'controlPlane.baseUrl': 'CP Base URL',
132
- 'controlPlane.streamMode': 'CP Stream Mode',
133
- 'controlPlane.allowRemote': 'CP Allow Remote',
134
- 'controlPlane.trustProxy': 'CP Trust Proxy',
135
- 'controlPlane.tls.mode': 'CP TLS Mode',
136
- 'controlPlane.tls.certFile': 'CP TLS Cert',
137
- 'controlPlane.tls.keyFile': 'CP TLS Key',
126
+ // Runtime API
127
+ 'controlPlane.enabled': 'Runtime API Enabled',
128
+ 'controlPlane.hostMode': 'Runtime API Host Mode',
129
+ 'controlPlane.host': 'Runtime API Host',
130
+ 'controlPlane.port': 'Runtime API Port',
131
+ 'controlPlane.baseUrl': 'Runtime API Base URL',
132
+ 'controlPlane.streamMode': 'Runtime API Stream Mode',
133
+ 'controlPlane.allowRemote': 'Runtime API Allow Remote',
134
+ 'controlPlane.trustProxy': 'Runtime API Trust Proxy',
135
+ 'controlPlane.tls.mode': 'Runtime API TLS Mode',
136
+ 'controlPlane.tls.certFile': 'Runtime API TLS Cert',
137
+ 'controlPlane.tls.keyFile': 'Runtime API TLS Key',
138
138
  // HTTP Listener
139
139
  'httpListener.hostMode': 'HTTP Host Mode',
140
140
  'httpListener.host': 'HTTP Host',
@@ -35,7 +35,7 @@ const CATEGORY_INFO: Record<SettingsCategory, string> = {
35
35
  helper: 'Helper model defaults used by helper subsystems when they do not use the main chat route.',
36
36
  tts: 'Text-to-speech provider, voice, and optional spoken-turn LLM overrides.',
37
37
  service: 'External GoodVibes runtime service posture. Agent shows these compatibility keys for inspection only and does not install, start, stop, restart, or autostart services.',
38
- controlPlane: 'External GoodVibes runtime control-plane settings for local admin/API access. Agent connects to that runtime and does not mutate its bind posture.',
38
+ controlPlane: 'External GoodVibes runtime API settings for local admin/API access. Agent connects to that runtime and does not mutate its bind posture.',
39
39
  httpListener: 'External HTTP listener settings for webhook and integration ingress. Agent does not start or expose the listener.',
40
40
  web: 'External browser surface settings. Agent does not own the web listener or network bind lifecycle.',
41
41
  batch: 'Batch execution settings reported from the external GoodVibes runtime. Agent does not own remote queue provisioning.',
@@ -50,7 +50,7 @@ const CATEGORY_INFO: Record<SettingsCategory, string> = {
50
50
  danger: 'High-impact runtime and listener switches. Agent renders host-owned switches read-only; use GoodVibes TUI or the owning host to change them.',
51
51
  tools: 'Tool LLM and helper model routing. Empty provider/model values inherit the active chat route unless a specific helper/tool route is set.',
52
52
  flags: 'Feature flags are SDK runtime gates. They are separate from normal config keys because they enable or disable staged runtime behavior.',
53
- network: 'Read-only view of external GoodVibes runtime control-plane, HTTP listener, and browser web bind posture plus editable Agent network settings.',
53
+ network: 'Read-only view of external GoodVibes runtime API, HTTP listener, and browser web bind posture plus editable Agent network settings.',
54
54
  };
55
55
 
56
56
  const ENUM_VALUE_DESCRIPTIONS: Record<string, Record<string, string>> = {
@@ -552,7 +552,7 @@ export async function bootstrapRuntime(
552
552
  },
553
553
  };
554
554
 
555
- // ── Phase 12b: Operator Control Plane wiring (feature-gated) ──────────────
555
+ // ── Phase 12b: Operator intervention wiring (feature-gated) ──────────────
556
556
  // Wire the OpsControlPlane into CommandContext when the feature flag is enabled.
557
557
  // The store and task manager are created unconditionally so they reflect the
558
558
  // real runtime state (tasks registered before the flag check are visible).
@@ -1,5 +1,5 @@
1
1
  /**
2
- * OpsPanel — diagnostic data provider for the Operator Control Plane.
2
+ * OpsPanel — diagnostic data provider for operator interventions.
3
3
  *
4
4
  * Subscribes to OPS_AUDIT events from the UI-facing ops event feed and maintains a
5
5
  * bounded buffer of intervention records for display
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.64';
9
+ let _version = '0.1.66';
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 {