@pellux/goodvibes-agent 0.1.60 → 0.1.62

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.
@@ -329,9 +329,9 @@ export async function buildControlPlaneStatusResult(runtime: CliCommandRuntime):
329
329
  };
330
330
  const issues: string[] = [];
331
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 daemon config, but Agent service ownership is disabled.');
333
- if (enabled === true && service.autostart !== true) issues.push('Control plane is enabled on the external daemon config, but daemon autostart is off.');
334
- if (enabled === true && service.restartOnFailure !== true) issues.push('Control plane is enabled on the external daemon config, but restart-on-failure is off.');
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
335
  if (isNetworkFacing(enabled, binding) && !auth.userStorePresent) issues.push('Network-facing control plane has no local auth user store.');
336
336
  if (isNetworkFacing(enabled, binding) && auth.bootstrapCredentialPresent) issues.push('Network-facing control plane still has a bootstrap credential file.');
337
337
  return {
@@ -42,7 +42,7 @@ const REQUIRED_TARBALL_PATHS = [
42
42
  'docs/deployment-and-services.md',
43
43
  'docs/release-and-publishing.md',
44
44
  ] as const;
45
- const FORBIDDEN_TARBALL_PREFIXES = ['.github/', 'src/test/', 'src/.test/', '.goodvibes/memory/', '.goodvibes/agents/', 'vendor/'] as const;
45
+ const FORBIDDEN_TARBALL_PREFIXES = ['.github/', 'src/test/', 'src/.test/', '.goodvibes/', 'vendor/'] as const;
46
46
  const FORBIDDEN_TARBALL_DOCS = [
47
47
  ['docs/cloud', 'flare-batch.md'].join(''),
48
48
  ['docs/home', 'assistant-surface.md'].join(''),
@@ -55,7 +55,6 @@ const PACKAGE_FACING_TEXT_PATHS = [
55
55
  'docs/getting-started.md',
56
56
  'docs/deployment-and-services.md',
57
57
  'docs/release-and-publishing.md',
58
- '.goodvibes/skills/add-provider/SKILL.md',
59
58
  ] as const;
60
59
  const PACKAGE_FACING_FORBIDDEN_TEXT = [
61
60
  ['/api/', 'knowledge'].join(''),
@@ -13,7 +13,7 @@ export async function handleServiceCommand(runtime: CliCommandRuntime): Promise<
13
13
  };
14
14
  }
15
15
  if (sub === 'install' || sub === 'start' || sub === 'restart' || sub === 'stop' || sub === 'uninstall') {
16
- const text = 'GoodVibes Agent connects to an existing daemon and does not manage daemon lifecycle. Use GoodVibes TUI or your daemon host tooling for service mutations.';
16
+ const text = 'GoodVibes Agent connects to an existing GoodVibes runtime and does not manage runtime lifecycle. Use GoodVibes TUI or host tooling for service mutations.';
17
17
  return {
18
18
  output: json ? JSON.stringify({ ok: false, kind: 'daemon_lifecycle_external', action: sub, error: text }, null, 2) : text,
19
19
  exitCode: 2,
@@ -143,7 +143,7 @@ function resolveConfiguredLogPath(runtime: CliServiceRuntime): string | undefine
143
143
  function createExternalDaemonLifecycle(logPath: string | undefined): CliExternalDaemonLifecyclePosture {
144
144
  return {
145
145
  platform: 'manual',
146
- path: 'external daemon host',
146
+ path: 'external GoodVibes runtime host',
147
147
  installed: false,
148
148
  autostart: false,
149
149
  running: false,
@@ -151,7 +151,7 @@ function createExternalDaemonLifecycle(logPath: string | undefined): CliExternal
151
151
  commandPreview: 'managed outside goodvibes-agent',
152
152
  suggestedCommands: [],
153
153
  lastAction: 'status',
154
- pidPath: 'external daemon host',
154
+ pidPath: 'external GoodVibes runtime host',
155
155
  lastError: null,
156
156
  };
157
157
  }
@@ -184,13 +184,13 @@ export async function buildCliServicePosture(
184
184
  const issues: string[] = [];
185
185
 
186
186
  if (serverBackedEnabled && !config.enabled) {
187
- issues.push('Daemon-owned surfaces are configured, but Agent service ownership is disabled.');
187
+ issues.push('Host-owned surfaces are configured, but Agent service ownership is disabled.');
188
188
  }
189
189
  if (config.enabled && !config.autostart) {
190
- issues.push('External daemon service config has autostart off.');
190
+ issues.push('External runtime service config has autostart off.');
191
191
  }
192
192
  if (config.enabled && !config.restartOnFailure) {
193
- issues.push('External daemon service config has restart-on-failure off.');
193
+ issues.push('External runtime service config has restart-on-failure off.');
194
194
  }
195
195
  for (const endpoint of endpoints) {
196
196
  if (endpoint.enabled && options.probe && endpoint.reachable === false) {
@@ -229,7 +229,7 @@ function yesNo(value: boolean): string {
229
229
  export function formatCliServicePosture(posture: CliServicePosture, json = false): string {
230
230
  if (json) return JSON.stringify(posture, null, 2);
231
231
  return [
232
- 'GoodVibes external daemon diagnostics',
232
+ 'GoodVibes external runtime diagnostics',
233
233
  ' lifecycle: managed outside goodvibes-agent',
234
234
  ` service config enabled: ${yesNo(posture.config.enabled)}`,
235
235
  ` autostart config: ${yesNo(posture.config.autostart)}`,
package/src/cli/status.ts CHANGED
@@ -122,10 +122,10 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
122
122
  id: 'service-disabled-for-server-surfaces',
123
123
  area: 'service',
124
124
  severity: 'warning',
125
- summary: 'Daemon-owned surfaces are configured while Agent service ownership is disabled.',
126
- cause: 'One or more daemon, control-plane, listener, or web settings are enabled while service.enabled is false.',
127
- impact: 'The external daemon host must own availability for those surfaces; Agent will not start or enable them.',
128
- action: 'Manage surface/service posture from GoodVibes TUI or the daemon host, then use Agent for read-only diagnostics.',
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.',
127
+ impact: 'The external GoodVibes runtime must own availability for those surfaces; Agent will not start or enable them.',
128
+ action: 'Manage surface/service posture from GoodVibes TUI or the owning host, then use Agent for read-only diagnostics.',
129
129
  });
130
130
  }
131
131
 
@@ -134,10 +134,10 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
134
134
  id: 'service-autostart-disabled',
135
135
  area: 'service',
136
136
  severity: 'warning',
137
- summary: 'External daemon service config has autostart off.',
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 daemon may not be available after login or reboot even though service mode is selected.',
140
- action: 'Configure daemon autostart from GoodVibes TUI or the daemon host; Agent will not mutate this setting.',
139
+ impact: 'The external GoodVibes runtime may not be available after login or reboot even though service mode is selected.',
140
+ action: 'Configure autostart from GoodVibes TUI or the owning host; Agent will not mutate this setting.',
141
141
  });
142
142
  }
143
143
 
@@ -146,10 +146,10 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
146
146
  id: 'service-restart-disabled',
147
147
  area: 'service',
148
148
  severity: 'warning',
149
- summary: 'External daemon service config has restart-on-failure off.',
149
+ summary: 'External runtime service config has restart-on-failure off.',
150
150
  cause: 'service.enabled is true and service.restartOnFailure is false.',
151
- impact: 'A crashed daemon or listener may stay down until manually restarted.',
152
- action: 'Configure restart-on-failure from GoodVibes TUI or the daemon host; Agent will not mutate this setting.',
151
+ impact: 'A crashed runtime or listener may stay down until manually restarted.',
152
+ action: 'Configure restart-on-failure from GoodVibes TUI or the owning host; Agent will not mutate this setting.',
153
153
  });
154
154
  }
155
155
 
@@ -162,8 +162,8 @@ 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: 'Daemon, control-plane, listener, or web availability may not match the configuration.',
166
- action: 'Use goodvibes-agent service check for read-only detail, then manage the daemon from GoodVibes TUI or your daemon host tooling.',
165
+ impact: 'Runtime, control-plane, listener, or web availability may not match the configuration.',
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
  }
169
169
  }
@@ -40,8 +40,8 @@ export async function handleSurfacesCommand(runtime: CliCommandRuntime): Promise
40
40
  if (sub === 'enable' || sub === 'disable') {
41
41
  if (!target) return { output: `Usage: goodvibes-agent surfaces ${sub} <web|listener|control-plane|surfaceId>`, exitCode: 2 };
42
42
  const text = [
43
- 'GoodVibes Agent does not mutate daemon, listener, web, or channel surface posture.',
44
- 'Configure those surfaces from GoodVibes TUI or the externally managed daemon host, then use `goodvibes-agent surfaces check` for read-only diagnostics.',
43
+ 'GoodVibes Agent does not mutate runtime, listener, web, or channel surface posture.',
44
+ 'Configure those surfaces from GoodVibes TUI or the external GoodVibes runtime host, then use `goodvibes-agent surfaces check` for read-only diagnostics.',
45
45
  ].join(' ');
46
46
  return {
47
47
  output: formatJsonOrText(runtime.cli)({
@@ -217,9 +217,9 @@ export async function buildListenerTestResult(runtime: CliCommandRuntime): Promi
217
217
  }).filter((surface) => surface.enabled === true);
218
218
  const issues: string[] = [];
219
219
  if (enabled !== true) issues.push('HTTP listener is disabled.');
220
- if (enabled === true && service.enabled !== true) issues.push('HTTP listener is enabled on the external daemon config, but Agent service ownership is disabled.');
221
- if (enabled === true && service.autostart !== true) issues.push('HTTP listener is enabled on the external daemon config, but daemon autostart is off.');
222
- if (enabled === true && service.restartOnFailure !== true) issues.push('HTTP listener is enabled on the external daemon config, but restart-on-failure is off.');
220
+ if (enabled === true && service.enabled !== true) issues.push('HTTP listener is enabled on the external runtime config, but Agent service ownership is disabled.');
221
+ if (enabled === true && service.autostart !== true) issues.push('HTTP listener is enabled on the external runtime config, but autostart is off.');
222
+ if (enabled === true && service.restartOnFailure !== true) issues.push('HTTP listener is enabled on the external runtime config, but restart-on-failure is off.');
223
223
  if (isNetworkFacing(enabled, binding) && !auth.userStorePresent) issues.push('Network-facing listener has no local auth user store.');
224
224
  if (isNetworkFacing(enabled, binding) && auth.bootstrapCredentialPresent) issues.push('Network-facing listener still has a bootstrap credential file.');
225
225
  for (const surface of surfaces) {
@@ -13,10 +13,10 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
13
13
  { id: 'setup-home', label: 'Setup checklist', detail: 'Jump to the first-run checklist for provider, knowledge, personas, skills, routines, memory, channels, and voice/media.', targetCategoryId: 'setup', kind: 'workspace', safety: 'safe' },
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
- { id: 'channels-home', label: 'Channels', detail: 'Jump to companion pairing and channel readiness without changing daemon lifecycle.', targetCategoryId: 'channels', kind: 'workspace', safety: 'read-only' },
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
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' },
18
18
  { id: 'help', label: 'Browse commands', detail: 'Open registry-driven command help.', command: '/help', kind: 'command', safety: 'safe' },
19
- { id: 'health', label: 'Review health', detail: 'Show the local health review surface without starting or mutating daemon services.', command: '/health review', kind: 'command', safety: 'read-only' },
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
  ],
21
21
  },
22
22
  {
@@ -24,7 +24,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
24
24
  group: 'SETUP',
25
25
  label: 'Setup',
26
26
  summary: 'Configuration, auth, provider, and onboarding surfaces.',
27
- detail: 'Agent connects to an external daemon and owns local assistant configuration only. Daemon lifecycle and listener posture remain external.',
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
29
  { id: 'config', label: 'Open config workspace', detail: 'Use the TUI-derived fullscreen settings workspace.', command: '/config', kind: 'command', safety: 'safe' },
30
30
  { id: 'onboarding', label: 'Open setup wizard', detail: 'Review Agent runtime settings in the fullscreen setup flow.', command: '/onboarding', kind: 'command', safety: 'safe' },
@@ -46,12 +46,12 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
46
46
  group: 'SETUP',
47
47
  label: 'Channels',
48
48
  summary: 'Companion pairing, channel posture, and delivery safety.',
49
- detail: 'Agent uses externally owned daemon channel surfaces. Pairing, account inspection, and readiness checks are visible here; inbound delivery and public channel exposure stay policy-gated.',
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
51
  { id: 'pair', label: 'Pair companion', detail: 'Open the TUI-derived 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
- { id: 'setup-review', label: 'Channel setup review', detail: 'Review setup posture without starting listeners or mutating daemon surface state.', command: '/setup review', kind: 'command', safety: 'read-only' },
54
- { id: 'channel-safety', label: 'Delivery safety', detail: 'External messages, channel DMs, and public delivery targets require explicit user action and daemon-side policy. Agent will not silently send or expose channels from this workspace.', kind: 'guidance', safety: 'blocked' },
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
+ { 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' },
55
55
  ],
56
56
  },
57
57
  {
@@ -75,13 +75,13 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
75
75
  group: 'SETUP',
76
76
  label: 'Voice, Media & Nodes',
77
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 daemon ownership external and side effects explicit.',
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.',
79
79
  actions: [
80
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' },
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 listeners or daemon services.', command: '/setup services', kind: 'command', safety: 'read-only' },
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' },
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
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
87
  ],
@@ -91,7 +91,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
91
91
  group: 'SETUP',
92
92
  label: 'Profiles & Portability',
93
93
  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 daemon external.',
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.',
95
95
  actions: [
96
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' },
97
97
  { 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' },
@@ -109,7 +109,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
109
109
  group: 'LEARN',
110
110
  label: 'Memory & Skills',
111
111
  summary: 'Local assistant memory, routines, skills, and reusable behavior.',
112
- detail: 'Memory, routines, skills, and personas stay Agent-local until stable shared daemon registry contracts exist. Secrets must not be stored as memory.',
112
+ detail: 'Memory, routines, skills, and personas stay Agent-local until stable shared registry contracts exist. Secrets must not be stored as memory.',
113
113
  actions: [
114
114
  { id: 'memory', label: 'Open memory', detail: 'Inspect local/session memory commands and surfaces.', command: '/memory', kind: 'command', safety: 'read-only' },
115
115
  { id: 'personas', label: 'Persona library', detail: 'Open the local persona workspace for active role selection and review.', targetCategoryId: 'personas', kind: 'workspace', safety: 'safe' },
@@ -160,7 +160,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
160
160
  group: 'LEARN',
161
161
  label: 'Routines',
162
162
  summary: 'Repeatable workflows for the main conversation.',
163
- detail: 'Routines run in the main conversation by default. Promotion to an external daemon schedule requires a real schedule command and --yes.',
163
+ detail: 'Routines run in the main conversation by default. Promotion to an external schedule requires a real schedule command and --yes.',
164
164
  actions: [
165
165
  { id: 'routines-list', label: 'List routines', detail: 'Print the full local Agent routine library.', command: '/routines list', kind: 'command', safety: 'read-only' },
166
166
  { id: 'routines-enabled', label: 'Enabled routines', detail: 'Show routines available for direct use.', command: '/routines enabled', kind: 'command', safety: 'read-only' },
@@ -173,7 +173,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
173
173
  { id: 'routines-disable', label: 'Disable selected', detail: 'Disable the selected routine without deleting it.', localKind: 'routine', localOperation: 'routine-disable', kind: 'local-operation', safety: 'safe' },
174
174
  { id: 'routines-review', label: 'Review selected', detail: 'Mark the selected local routine reviewed after inspecting it.', localKind: 'routine', localOperation: 'routine-review', kind: 'local-operation', safety: 'safe' },
175
175
  { id: 'routines-delete', label: 'Delete selected', detail: 'Open a confirmation form before deleting the selected local Agent routine.', localKind: 'routine', localOperation: 'routine-delete', kind: 'local-operation', safety: 'safe' },
176
- { id: 'routines-promote', label: 'Promote to schedule', detail: 'Create an external daemon schedule from a reviewed routine only with real timing and --yes.', command: '/routines promote <id> --cron <expr> --yes', kind: 'command', safety: 'safe' },
176
+ { id: 'routines-promote', label: 'Promote to schedule', detail: 'Create an external schedule from a reviewed routine only with real timing and --yes.', command: '/routines promote <id> --cron <expr> --yes', kind: 'command', safety: 'safe' },
177
177
  { id: 'routines-receipts', label: 'Promotion receipts', detail: 'Inspect local redacted routine schedule promotion receipts.', command: '/routines receipts', kind: 'command', safety: 'read-only' },
178
178
  ],
179
179
  },
@@ -194,14 +194,14 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
194
194
  group: 'WATCH',
195
195
  label: 'Automation',
196
196
  summary: 'Automation and schedule observability with explicit routine promotion.',
197
- detail: 'Agent does not create local automation jobs or hidden scheduler spawns. Reviewed local routines can be promoted into externally owned daemon schedules only through an explicit schedules.create command with --yes, optional delivery targets, and a redacted local receipt.',
197
+ detail: 'Agent does not create local automation jobs or hidden scheduler spawns. Reviewed local routines can be promoted into external schedules only through an explicit schedules.create command with --yes, optional delivery targets, and a redacted local receipt.',
198
198
  actions: [
199
199
  { id: 'schedule-list', label: 'List schedules', detail: 'Inspect configured jobs and history without running or mutating them.', command: '/schedule list', kind: 'command', safety: 'read-only' },
200
- { id: 'schedule-promote-routine', label: 'Promote routine', detail: 'Create an external daemon schedule from a local Agent routine. Requires a real routine id, schedule expression, optional delivery target, and explicit --yes.', command: '/schedule promote-routine <routine-id> --cron <expr> [--delivery-surface slack] --yes', kind: 'command', safety: 'safe' },
201
- { id: 'schedule-receipts', label: 'Promotion receipts', detail: 'Review local redacted receipt history for routine-to-daemon schedule promotion attempts.', command: '/schedule receipts', kind: 'command', safety: 'read-only' },
202
- { id: 'schedule-reconcile', label: 'Reconcile schedules', detail: 'Compare local promotion receipts with live externally owned daemon schedules using schedules.list.', command: '/schedule reconcile', kind: 'command', safety: 'read-only' },
203
- { id: 'schedule-policy', label: 'Local scheduler blocked', detail: 'Local schedule add/run/remove/enable/disable remain blocked; only explicit external daemon schedule promotion is allowed here.', kind: 'guidance', safety: 'blocked' },
204
- { id: 'health-services', label: 'Service health', detail: 'Inspect service readiness without starting, stopping, or restarting daemon services.', command: '/health services', kind: 'command', safety: 'read-only' },
200
+ { id: 'schedule-promote-routine', label: 'Promote routine', detail: 'Create an external schedule from a local Agent routine. Requires a real routine id, schedule expression, optional delivery target, and explicit --yes.', command: '/schedule promote-routine <routine-id> --cron <expr> [--delivery-surface slack] --yes', kind: 'command', safety: 'safe' },
201
+ { id: 'schedule-receipts', label: 'Promotion receipts', detail: 'Review local redacted receipt history for routine-to-schedule promotion attempts.', command: '/schedule receipts', kind: 'command', safety: 'read-only' },
202
+ { id: 'schedule-reconcile', label: 'Reconcile schedules', detail: 'Compare local promotion receipts with live external schedules using schedules.list.', command: '/schedule reconcile', kind: 'command', safety: 'read-only' },
203
+ { id: 'schedule-policy', label: 'Local scheduler blocked', detail: 'Local schedule add/run/remove/enable/disable remain blocked; only explicit external schedule promotion is allowed here.', kind: 'guidance', safety: 'blocked' },
204
+ { id: 'health-services', label: 'Runtime health', detail: 'Inspect runtime readiness without starting, stopping, or restarting services.', command: '/health services', kind: 'command', safety: 'read-only' },
205
205
  ],
206
206
  },
207
207
  {
@@ -43,7 +43,7 @@ export function createLocalEditor(kind: AgentWorkspaceLocalEditorKind): AgentWor
43
43
  mode: 'create',
44
44
  title: 'Create Routine',
45
45
  selectedFieldIndex: 0,
46
- message: 'Enter a repeatable workflow. It runs in the main conversation unless explicitly promoted to a daemon schedule.',
46
+ message: 'Enter a repeatable workflow. It runs in the main conversation unless explicitly promoted to an external schedule.',
47
47
  fields: [
48
48
  { id: 'name', label: 'Name', value: '', required: true, multiline: false, hint: 'Short routine name.' },
49
49
  { id: 'description', label: 'Description', value: '', required: true, multiline: false, hint: 'One-line summary of the workflow.' },
@@ -34,10 +34,10 @@ export function buildAgentWorkspaceSetupChecklist(input: AgentWorkspaceSetupChec
34
34
  const hasActivePersona = input.activePersonaName !== '(none)' && input.activePersonaName !== '(unavailable)';
35
35
  return [
36
36
  {
37
- id: 'daemon',
38
- label: 'External daemon',
37
+ id: 'runtime',
38
+ label: 'External runtime',
39
39
  status: 'ready',
40
- detail: `Agent will connect to ${input.daemonBaseUrl}; daemon lifecycle stays external.`,
40
+ detail: `Agent will connect to ${input.daemonBaseUrl}; runtime lifecycle stays external.`,
41
41
  command: '/status',
42
42
  },
43
43
  {
@@ -48,7 +48,7 @@ export function registerDelegationRuntimeCommands(registry: CommandRegistry): vo
48
48
  if (!operator) {
49
49
  ctx.print([
50
50
  'Delegation unavailable: no operator client is attached.',
51
- 'Use the external daemon/shared-session route from a configured Agent runtime, or open GoodVibes TUI in the target workspace.',
51
+ 'Use the shared-session route from a configured Agent runtime, or open GoodVibes TUI in the target workspace.',
52
52
  ].join('\n'));
53
53
  return;
54
54
  }
@@ -56,7 +56,7 @@ function printReadOnlyScheduleBoundary(print: (text: string) => void, requestedA
56
56
  ` requested: ${requestedAction}`,
57
57
  ' policy: no local Agent automation jobs, scheduled spawns, or immediate automation runs',
58
58
  ' use: /schedule list',
59
- ' daemon route: use /schedule promote-routine <routine> --cron <expr> --yes to create an external daemon schedule explicitly',
59
+ ' schedule route: use /schedule promote-routine <routine> --cron <expr> --yes to create an external schedule explicitly',
60
60
  ].join('\n'));
61
61
  }
62
62
 
@@ -90,7 +90,7 @@ export function registerScheduleRuntimeCommands(registry: CommandRegistry): void
90
90
  registry.register({
91
91
  name: 'schedule',
92
92
  aliases: ['sched'],
93
- description: 'Inspect schedules and explicitly promote local Agent routines to daemon schedules',
93
+ description: 'Inspect schedules and explicitly promote local Agent routines to external schedules',
94
94
  usage: 'list | receipts | reconcile | receipt <id> | promote-routine <routine-id> --cron <expr> [--delivery-surface slack] --yes',
95
95
  argsHint: 'list | receipts | reconcile | receipt <id> | promote-routine <routine-id> --cron <expr> [--delivery-surface slack] --yes',
96
96
  async handler(args, ctx) {
@@ -136,7 +136,7 @@ export function registerScheduleRuntimeCommands(registry: CommandRegistry): void
136
136
  if (jobs.length === 0) {
137
137
  ctx.print(
138
138
  'No automation jobs.\n'
139
- + 'Local add/run/enable/disable/remove are blocked. Use /schedule promote-routine <routine> --cron <expr> --yes for an explicit external daemon schedule.'
139
+ + 'Local add/run/enable/disable/remove are blocked. Use /schedule promote-routine <routine> --cron <expr> --yes for an explicit external schedule.'
140
140
  );
141
141
  return;
142
142
  }
@@ -116,6 +116,13 @@ export function registerShellCoreCommands(registry: CommandRegistry): void {
116
116
  const items: SelectionItem[] = [
117
117
  { id: '/agent', label: '/agent', detail: 'Open the Agent operator workspace', category: 'Agent Operator' },
118
118
  { id: '/home', label: '/home', detail: 'Alias for the Agent operator workspace', category: 'Agent Operator' },
119
+ { id: '/knowledge', label: '/knowledge', detail: 'Inspect isolated Agent Knowledge status, ask/search, and ingest flows', category: 'Agent Operator' },
120
+ { id: '/memory', label: '/memory', detail: 'Review local Agent memory records', category: 'Agent Operator' },
121
+ { id: '/personas', label: '/personas', detail: 'Create, review, and activate local Agent personas', category: 'Agent Operator' },
122
+ { id: '/agent-skills', label: '/agent-skills', detail: 'Create, review, and enable reusable Agent skills', category: 'Agent Operator' },
123
+ { id: '/routines', label: '/routines', detail: 'Create, review, start, and promote Agent routines explicitly', category: 'Agent Operator' },
124
+ { id: '/delegate', label: '/delegate [task]', detail: 'Explicit build/fix/review handoff to GoodVibes TUI', category: 'Agent Operator' },
125
+ { id: '/pair', label: '/pair', detail: 'Pair companion clients through the GoodVibes runtime', category: 'Agent Operator' },
119
126
  { id: '/model', label: '/model [id]', detail: 'Select LLM model', category: 'Model & Provider' },
120
127
  { id: '/provider', label: '/provider [name]', detail: 'Switch provider', category: 'Model & Provider' },
121
128
  { id: '/effort', label: '/effort [level]', detail: 'Reasoning effort (instant/low/medium/high)', category: 'Model & Provider' },
@@ -487,11 +487,11 @@ export function getOnboardingRuntimePostureForHandler(handler: InputHandler, req
487
487
  export async function restartOnboardingExternalServicesIfNeededForHandler(handler: InputHandler, request: OnboardingApplyRequest): Promise<OnboardingVerificationItem[]> {
488
488
  const externalServices = handler.uiServices.platform.externalServices;
489
489
  const state = externalServices?.inspect();
490
- const serviceStatus = state?.daemonStatus?.reason ?? (state?.daemonRunning ? 'external GoodVibes service appears active' : 'external GoodVibes service is not verified from this shell');
490
+ const serviceStatus = state?.daemonStatus?.reason ?? (state?.daemonRunning ? 'external GoodVibes runtime appears active' : 'external GoodVibes runtime is not verified from this shell');
491
491
  return [{
492
492
  id: 'runtime:external-service-owned',
493
493
  status: 'pass',
494
- message: `GoodVibes Agent did not start, stop, restart, or reconfigure service lifecycle. ${serviceStatus}`,
494
+ message: `GoodVibes Agent did not start, stop, restart, or reconfigure runtime lifecycle. ${serviceStatus}`,
495
495
  target: 'service',
496
496
  }];
497
497
  }
@@ -503,8 +503,8 @@ export function verifyOnboardingRuntimePostureForHandler(handler: InputHandler,
503
503
  id: 'runtime:external-service-owned',
504
504
  status: 'pass',
505
505
  message: externalState
506
- ? 'GoodVibes service lifecycle is externally managed; Agent onboarding did not request shutdown, startup, restart, bind, or surface changes.'
507
- : 'GoodVibes service lifecycle is externally managed; no local service controller is required for Agent onboarding.',
506
+ ? 'GoodVibes runtime lifecycle is externally managed; Agent onboarding did not request shutdown, startup, restart, bind, or surface changes.'
507
+ : 'GoodVibes runtime lifecycle is externally managed; no local service controller is required for Agent onboarding.',
508
508
  target: 'service',
509
509
  }];
510
510
  }
@@ -47,10 +47,10 @@ export function buildCommunicationStep(): OnboardingWizardStepDefinition {
47
47
  id: 'agent-communication',
48
48
  title: 'Channels and notifications',
49
49
  shortLabel: 'Channels',
50
- description: 'Prepare the Agent for companion pairing, messaging-channel awareness, notification delivery, and safe outbound communication without owning daemon listeners.',
50
+ description: 'Prepare the Agent for companion pairing, messaging-channel awareness, notification delivery, and safe outbound communication without changing runtime connectivity.',
51
51
  summaryTitle: 'Communication posture',
52
52
  summaryLines: [
53
- 'Companion chat: paired through the external GoodVibes service',
53
+ 'Companion chat: paired through the GoodVibes runtime',
54
54
  'Channel accounts: inspect readiness before using them',
55
55
  'Outbound messages: explicit user action only',
56
56
  ],
@@ -59,14 +59,14 @@ export function buildCommunicationStep(): OnboardingWizardStepDefinition {
59
59
  kind: 'status',
60
60
  id: 'agent-communication.companion',
61
61
  label: 'Companion pairing',
62
- hint: 'Use /pair from the Agent workspace to pair companion clients through the already-running service.',
62
+ hint: 'Use /pair from the Agent workspace to pair companion clients through the already-running GoodVibes runtime.',
63
63
  defaultValue: 'External service route',
64
64
  },
65
65
  {
66
66
  kind: 'status',
67
67
  id: 'agent-communication.channels',
68
68
  label: 'Messaging channels',
69
- hint: 'Use the Channels workspace to inspect account readiness, delivery posture, and recent communication without changing listener or service lifecycle.',
69
+ hint: 'Use the Channels workspace to inspect account readiness, delivery posture, and recent communication without changing runtime connectivity.',
70
70
  defaultValue: 'Inspectable',
71
71
  },
72
72
  {
@@ -80,7 +80,7 @@ export function buildCommunicationStep(): OnboardingWizardStepDefinition {
80
80
  kind: 'status',
81
81
  id: 'agent-communication.inbound-policy',
82
82
  label: 'Inbound command policy',
83
- hint: 'Incoming channel commands stay constrained by daemon-side policy, allowlists, and account posture.',
83
+ hint: 'Incoming channel commands stay constrained by runtime policy, allowlists, and account posture.',
84
84
  defaultValue: 'Policy gated',
85
85
  },
86
86
  ],
@@ -169,7 +169,7 @@ export function buildAgentSetupStep(controller: OnboardingWizardController): Onb
169
169
  summaryTitle: 'Agent setup posture',
170
170
  summaryLines: [
171
171
  'Agent owns the operator TUI and local behavior registry.',
172
- 'GoodVibes service lifecycle is external to this product.',
172
+ 'GoodVibes runtime lifecycle is external to this product.',
173
173
  `Secret policy: ${controller.getStringFieldValue('agent-setup.secret-policy', secretPolicy)}`,
174
174
  collectionIssues > 0 ? `${collectionIssues} setup snapshot issue(s)` : 'Setup snapshot collected cleanly',
175
175
  ],
@@ -184,10 +184,10 @@ export function buildAgentSetupStep(controller: OnboardingWizardController): Onb
184
184
  {
185
185
  kind: 'status',
186
186
  id: 'agent-setup.connection',
187
- label: 'GoodVibes service connection',
187
+ label: 'GoodVibes runtime connection',
188
188
  hint: collectionIssues > 0
189
189
  ? `${collectionIssues} setup snapshot issue(s) were reported. Status and doctor commands show connection details.`
190
- : 'Agent connects to an already-running GoodVibes service for companion chat, work plans, approvals, automation, and Agent Knowledge.',
190
+ : 'Agent connects to an already-running GoodVibes runtime for companion chat, work plans, approvals, automation, and Agent Knowledge.',
191
191
  defaultValue: collectionIssues > 0 ? `${collectionIssues} issue(s)` : 'External service',
192
192
  },
193
193
  {
@@ -423,11 +423,11 @@ export function buildAutomationStep(): OnboardingWizardStepDefinition {
423
423
  id: 'agent-automation',
424
424
  title: 'Routines and automation',
425
425
  shortLabel: 'Routines',
426
- description: 'Set the Agent automation posture: local routines run in the main conversation, while daemon schedules remain externally owned and explicit.',
426
+ description: 'Set the Agent automation posture: local routines run in the main conversation, while external schedules remain explicit.',
427
427
  summaryTitle: 'Routine and schedule posture',
428
428
  summaryLines: [
429
429
  'Local routines: reusable main-conversation workflows',
430
- 'Daemon schedules: explicit promotion only',
430
+ 'External schedules: explicit promotion only',
431
431
  'Runs/cancels/retries: command-confirmed side effects',
432
432
  ],
433
433
  fields: [
@@ -449,7 +449,7 @@ export function buildAutomationStep(): OnboardingWizardStepDefinition {
449
449
  kind: 'status',
450
450
  id: 'agent-automation.schedule-promotion',
451
451
  label: 'Routine-to-schedule promotion',
452
- hint: 'Creating daemon schedules from routines requires a reviewed routine, a real timing expression, optional delivery target, and explicit confirmation.',
452
+ hint: 'Creating external schedules from routines requires a reviewed routine, a real timing expression, optional delivery target, and explicit confirmation.',
453
453
  defaultValue: 'Explicit command',
454
454
  },
455
455
  {
@@ -468,7 +468,7 @@ export function buildVoiceMediaStep(): OnboardingWizardStepDefinition {
468
468
  id: 'agent-voice-media',
469
469
  title: 'Voice and media',
470
470
  shortLabel: 'Voice',
471
- description: 'Prepare voice, speech, image input, and media understanding as Agent operator surfaces rather than daemon lifecycle features.',
471
+ description: 'Prepare voice, speech, image input, and media understanding as Agent operator surfaces rather than runtime lifecycle features.',
472
472
  summaryTitle: 'Voice and media posture',
473
473
  summaryLines: [
474
474
  'Voice and speech: optional operator surfaces',
@@ -637,7 +637,7 @@ export function buildReviewStep(controller: OnboardingWizardController): Onboard
637
637
  id: 'review.apply',
638
638
  action: 'apply',
639
639
  label: 'Apply Agent settings and verify',
640
- hint: 'Persist the Agent-owned settings and verify that no service lifecycle, non-Agent entrypoint, default wiki, or non-Agent knowledge setup was requested.',
640
+ hint: 'Persist the Agent-owned settings and verify that no runtime lifecycle, non-Agent entrypoint, default wiki, or non-Agent knowledge setup was requested.',
641
641
  defaultValue: 'Ready',
642
642
  },
643
643
  ],
@@ -1,4 +1,4 @@
1
- export const AGENT_EXTERNAL_DAEMON_SETTING_LOCK_REASON = 'GoodVibes Agent connects to an external daemon. Change this from GoodVibes TUI or the daemon host; Agent settings are read-only for daemon lifecycle and bind posture.';
1
+ export const AGENT_EXTERNAL_DAEMON_SETTING_LOCK_REASON = 'GoodVibes Agent connects to an external GoodVibes runtime. Change runtime lifecycle and bind posture from the owning host; Agent settings are read-only for those controls.';
2
2
 
3
3
  const AGENT_HIDDEN_SETTING_PREFIXES = [
4
4
  ['cloud', 'flare.'].join(''),
@@ -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 daemon: ${snapshot.daemonBaseUrl}`, fg: PALETTE.info },
157
- { text: `Daemon ownership: ${snapshot.daemonOwnership}; Agent never starts or restarts it`, fg: PALETTE.good },
156
+ { text: `External runtime: ${snapshot.daemonBaseUrl}`, fg: PALETTE.info },
157
+ { text: `Runtime ownership: ${snapshot.daemonOwnership}; Agent 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 daemon: ${snapshot.daemonBaseUrl}`, fg: PALETTE.info },
169
+ { text: `External 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 },
@@ -208,7 +208,7 @@ function snapshotLines(workspace: AgentWorkspace, category: AgentWorkspaceCatego
208
208
  { text: `Config profiles: ${snapshot.configProfileCount}`, fg: PALETTE.info },
209
209
  { text: 'Named runtime profiles isolate Agent-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
- { text: 'The external daemon remains shared unless the daemon host is configured separately.', fg: PALETTE.warn },
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 },
213
213
  );
214
214
  } else if (category.id === 'memory') {
@@ -240,7 +240,7 @@ function snapshotLines(workspace: AgentWorkspace, category: AgentWorkspaceCatego
240
240
  base.push(
241
241
  { text: `Routines: ${snapshot.localRoutineCount}; enabled: ${snapshot.enabledRoutineCount}`, fg: PALETTE.info },
242
242
  { text: 'Routines are repeatable main-conversation workflows. Starting one does not create hidden jobs.', fg: PALETTE.good },
243
- { text: 'Scheduling a reviewed routine is explicit and writes to the externally owned daemon only with --yes.', fg: PALETTE.warn },
243
+ { text: 'Scheduling a reviewed routine is explicit and writes to the external GoodVibes runtime only with --yes.', fg: PALETTE.warn },
244
244
  { text: '' },
245
245
  ...localLibraryLines('Routine Library', snapshot.localRoutines, 'No local routines yet. Create one here with Create routine.', workspace.selectedLocalLibraryItem('routine')?.id ?? null),
246
246
  );
@@ -34,11 +34,11 @@ const CATEGORY_INFO: Record<SettingsCategory, string> = {
34
34
  wrfc: 'WRFC is external to normal Agent operation. Review these copied compatibility values only for explicit GoodVibes TUI build delegation.',
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
- service: 'External daemon service posture. Agent shows these copied compatibility keys for inspection only and does not install, start, stop, restart, or autostart services.',
38
- controlPlane: 'External daemon control-plane settings for local admin/API access. Agent connects to this daemon and does not mutate its bind posture.',
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.',
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
- batch: 'Batch execution settings reported from the external daemon. Agent does not own remote queue provisioning.',
41
+ batch: 'Batch execution settings reported from the external GoodVibes runtime. Agent does not own remote queue provisioning.',
42
42
  automation: 'Scheduled and automated run settings, concurrency, timeout, catch-up, cooldown, and retention behavior.',
43
43
  watchers: 'File/process watcher heartbeat, polling, and recovery-window behavior.',
44
44
  runtime: 'Runtime guardrails such as companion chat limiter and event bus listener caps.',
@@ -47,10 +47,10 @@ const CATEGORY_INFO: Record<SettingsCategory, string> = {
47
47
  mcp: 'MCP server trust and scope review. Trust changes can expose local files, tools, databases, browsers, or remote automation depending on the server.',
48
48
  surfaces: 'External app surfaces such as Slack, Discord, ntfy, Telegram, webhooks, chat bridges, and messaging providers.',
49
49
  release: 'Release-channel preference.',
50
- danger: 'High-impact daemon and listener switches. Agent renders daemon-owned switches read-only; use GoodVibes TUI or the daemon host to change them.',
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 daemon control-plane, HTTP listener, and browser web bind posture plus editable non-daemon network settings.',
53
+ network: 'Read-only view of external GoodVibes runtime control-plane, 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>> = {
@@ -479,7 +479,7 @@ function footerText(modal: SettingsModal): string {
479
479
  if (modal.currentCategory === 'flags') return 'Focus feature flags · Up/Down flag · Left categories · Tab pane · Enter/Space toggle · Esc close';
480
480
  const selected = modal.getSelected();
481
481
  if (selected && isExternalDaemonOwnedSettingKey(selected.setting.key)) {
482
- return 'Read-only external daemon setting · Change from GoodVibes TUI or daemon host · Esc close';
482
+ return 'Read-only external runtime setting · Change from GoodVibes TUI or the owning host · Esc close';
483
483
  }
484
484
  return 'Focus settings · Up/Down setting · Left categories · Tab pane · Enter/Space edit/toggle · R reset · Esc close';
485
485
  }
@@ -490,7 +490,7 @@ export function renderSettingsModal(
490
490
  viewportHeight = 24,
491
491
  ): Line[] {
492
492
  const notices = [
493
- ...(modal.lastSaveTriggeredRestart ? [`External daemon owner must restart ${modal.lastSaveTriggeredRestart}`] : []),
493
+ ...(modal.lastSaveTriggeredRestart ? [`External runtime owner must restart ${modal.lastSaveTriggeredRestart}`] : []),
494
494
  ...(modal.lastSettingEffectMessage ? [modal.lastSettingEffectMessage] : []),
495
495
  ];
496
496
  const metrics = getFullscreenWorkspaceMetrics({ width, height: viewportHeight });
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.60';
9
+ let _version = '0.1.62';
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 {