@pellux/goodvibes-agent 0.1.62 → 0.1.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,11 +2,23 @@
2
2
 
3
3
  All notable changes to GoodVibes Agent will be recorded here.
4
4
 
5
+ ## 0.1.64 - 2026-05-31
6
+
7
+ - Cleaned remaining visible setup, workspace, panel, and auth wording that still exposed copied runtime-host terminology.
8
+ - Changed the advertised auth login target to runtime/listener while keeping legacy runtime-host aliases non-prominent.
9
+ - Added regression coverage so setup and workspace text stay Agent-specific and avoid copied platform/product wording.
10
+
11
+ ## 0.1.63 - 2026-05-31
12
+
13
+ - Rewrote the remaining repo docs that still read like copied runtime/API notes into Agent-facing product docs.
14
+ - Clarified channel, provider, planning, voice, tools, and Agent Knowledge boundaries around external runtime usage and no default Knowledge/Wiki fallback.
15
+ - Kept the shipped package focused on the Agent TUI while preserving non-packaged foundation docs as Agent-specific references.
16
+
5
17
  ## 0.1.62 - 2026-05-31
6
18
 
7
19
  - Tightened primary CLI help around Agent workflows instead of advanced runtime diagnostics.
8
20
  - Reworded onboarding, workspace, and routine schedule surfaces toward Agent/operator language.
9
- - Kept schedule promotion explicit while removing stale daemon-schedule wording from user-facing flows.
21
+ - Kept schedule promotion explicit while removing stale runtime-schedule wording from user-facing flows.
10
22
 
11
23
  ## 0.1.61 - 2026-05-31
12
24
 
@@ -123,7 +135,7 @@ All notable changes to GoodVibes Agent will be recorded here.
123
135
 
124
136
  ## 0.1.37 - 2026-05-31
125
137
 
126
- - 656b6f4 Add Agent routine daemon schedule promotion
138
+ - 656b6f4 Add Agent routine runtime schedule promotion
127
139
 
128
140
  ## 0.1.36 - 2026-05-31
129
141
 
@@ -222,7 +234,7 @@ All notable changes to GoodVibes Agent will be recorded here.
222
234
 
223
235
  ## 0.1.12 - 2026-05-31
224
236
 
225
- - 1843a77 Handle external daemon SDK mismatch in live verification
237
+ - 1843a77 Handle external runtime SDK mismatch in live verification
226
238
  - 2b1a3f4 Align agent-owned test paths
227
239
 
228
240
  ## 0.1.11 - 2026-05-31
@@ -264,7 +276,7 @@ All notable changes to GoodVibes Agent will be recorded here.
264
276
  - 6b57500 Hide local agent activity in Agent UI
265
277
  - 7166188 Add Agent Knowledge CLI shortcuts
266
278
  - 386c19d Align service diagnostics with Agent boundaries
267
- - e8b19db Lock daemon-owned settings in Agent
279
+ - e8b19db Lock runtime-owned settings in Agent
268
280
 
269
281
  ## 0.1.9 - 2026-05-31
270
282
 
@@ -272,7 +284,7 @@ All notable changes to GoodVibes Agent will be recorded here.
272
284
  - a24c581 Use delegation wording in runtime indicator
273
285
  - 259a75f Guard Agent knowledge isolation
274
286
  - 59b6729 Align task help with Agent policy
275
- - 0074a76 Classify stale daemon knowledge routes
287
+ - 0074a76 Classify stale runtime knowledge routes
276
288
 
277
289
  ## 0.1.8 - 2026-05-31
278
290
 
@@ -303,7 +315,7 @@ All notable changes to GoodVibes Agent will be recorded here.
303
315
  - Added `LICENSE` to the explicit package file contract and release verification so registry tarballs cannot omit license text.
304
316
  - Prevented the operator workspace from dispatching placeholder delegation commands such as `/delegate --wrfc <task>`; those actions now provide guidance until the user supplies real task text.
305
317
  - Added local Agent routines with `/routines`: create/list/search/show/enable/disable/start/review/stale/delete, secret-looking value rejection, enabled routine prompt injection, and operator workspace status. Starting a routine stays in the main conversation and does not create hidden background jobs.
306
- - Removed copied TUI release, UAT, and WRFC artifact docs from the Agent source tree and updated remaining source docs so channel, voice, integration, and panel guidance speaks in Agent/external-daemon terms.
318
+ - Removed copied TUI release, UAT, and WRFC artifact docs from the Agent source tree and updated remaining source docs so channel, voice, integration, and panel guidance speaks in Agent/external-runtime terms.
307
319
 
308
320
  ## 0.1.6 - 2026-05-31
309
321
 
@@ -314,10 +326,10 @@ All notable changes to GoodVibes Agent will be recorded here.
314
326
 
315
327
  ## 0.1.5 - 2026-05-31
316
328
 
317
- - Hardened package-facing release checks so shipped docs and Agent guidance cannot reintroduce default Knowledge/Wiki, non-Agent graph, copied daemon, or copied WRFC-first policy text.
329
+ - Hardened package-facing release checks so shipped docs and Agent guidance cannot reintroduce default Knowledge/Wiki, non-Agent graph, copied runtime-hosting, or copied WRFC-first policy text.
318
330
  - Removed the generic default `knowledgeApi` client from the active Agent command context so slash commands must use the isolated Agent Knowledge API.
319
331
  - Changed CLI `knowledge ingest-url` to post directly to `/api/goodvibes-agent/knowledge/ingest/url` instead of invoking the generic knowledge operator method.
320
- - Rejected default-space and broad cross-space query flags in CLI and slash Agent Knowledge commands before any daemon call.
332
+ - Rejected default-space and broad cross-space query flags in CLI and slash Agent Knowledge commands before any runtime call.
321
333
 
322
334
  ## 0.1.4 - 2026-05-31
323
335
 
@@ -333,7 +345,7 @@ All notable changes to GoodVibes Agent will be recorded here.
333
345
 
334
346
  ## 0.1.2 - 2026-05-30
335
347
 
336
- - Added `goodvibes-agent compat` for package SDK pin, external daemon version, auth presence, and isolated Agent Knowledge route readiness.
348
+ - Added `goodvibes-agent compat` for package SDK pin, external runtime version, auth presence, and isolated Agent Knowledge route readiness.
337
349
  - Added `goodvibes-agent knowledge ...` commands for the isolated `/api/goodvibes-agent/knowledge/*` environment with no default Knowledge/Wiki or non-Agent graph fallback.
338
350
  - Added explicit GoodVibes TUI build delegation through `goodvibes-agent delegate` and `/delegate`; WRFC is requested only through explicit `--wrfc`, `/wrfc`, or `/review` delegation.
339
351
  - Removed the copied WRFC panel from the default Agent panel registry while preserving explicit TUI delegation for build/fix/review work.
@@ -342,7 +354,7 @@ All notable changes to GoodVibes Agent will be recorded here.
342
354
  ## 0.1.1 - 2026-05-30
343
355
 
344
356
  - Reissued the first public alpha package after the initial `0.1.0` registry publish produced an install-blocking npm packument inconsistency.
345
- - Kept the same Agent runtime boundary and TUI-derived shell foundation: external daemon only, serial/proactive Agent policy, and explicit GoodVibes TUI delegation for build/fix/review work.
357
+ - Kept the same Agent runtime boundary and TUI-derived shell foundation: external runtime only, serial/proactive Agent policy, and explicit GoodVibes TUI delegation for build/fix/review work.
346
358
 
347
359
  ## 0.1.0 - 2026-05-28
348
360
 
@@ -351,7 +363,7 @@ All notable changes to GoodVibes Agent will be recorded here.
351
363
  - Preserved Agent product policy: serial/proactive main conversation by default, no local Agent-owned WRFC/spawn fanout, and explicit GoodVibes TUI delegation for build/fix/review work.
352
364
  - Moved Agent-owned runtime state to `.goodvibes/agent` surface roots.
353
365
  - Updated packaged Agent guidance, reviewer persona, and provider skill to avoid copied TUI WRFC/multi-agent defaults.
354
- - Kept daemon lifecycle external: Agent connects to an already-running GoodVibes daemon and blocks daemon/service ownership commands.
366
+ - Kept runtime lifecycle external: Agent connects to an already-running GoodVibes runtime and blocks runtime/service ownership commands.
355
367
  - Pinned `@pellux/goodvibes-sdk` to `0.33.35`.
356
368
 
357
369
  ## 0.0.0 - Private Baseline
@@ -359,8 +371,8 @@ All notable changes to GoodVibes Agent will be recorded here.
359
371
  - Copied the GoodVibes terminal foundation as a near-fork starting point for the Agent product.
360
372
  - Renamed package identity to `@pellux/goodvibes-agent` and exposed one executable, `goodvibes-agent`.
361
373
  - Pinned `@pellux/goodvibes-sdk` to `0.33.35`.
362
- - Removed packaged daemon binaries and blocked Agent-owned daemon/service lifecycle commands.
363
- - Limited package-facing docs to Agent install, external-daemon deployment, and release guidance.
374
+ - Removed packaged runtime-host binaries and blocked Agent-owned runtime/service lifecycle commands.
375
+ - Limited package-facing docs to Agent install, external-runtime deployment, and release guidance.
364
376
  - Replaced copied coding-first orchestration policy with Agent serial/proactive policy and explicit GoodVibes TUI build delegation.
365
377
  - Added the first Agent operator workspace on the copied fullscreen workspace foundation, exposed through `/agent`, `/home`, and `/operator`.
366
378
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pellux/goodvibes-agent",
3
- "version": "0.1.62",
3
+ "version": "0.1.64",
4
4
  "private": false,
5
5
  "description": "GoodVibes personal operator assistant TUI with a proactive Agent product brain, isolated Agent Knowledge, local profiles, routines, skills, personas, and explicit build delegation.",
6
6
  "type": "module",
@@ -443,7 +443,7 @@ async function runKnowledgeCall<TData>(
443
443
  return {
444
444
  ok: false,
445
445
  kind: 'auth_required',
446
- error: `No daemon operator token found at ${connection.tokenPath}`,
446
+ error: `No runtime operator token found at ${connection.tokenPath}`,
447
447
  baseUrl: connection.baseUrl,
448
448
  route: method.route,
449
449
  };
@@ -234,7 +234,7 @@ export function formatCliServicePosture(posture: CliServicePosture, json = false
234
234
  ` service config enabled: ${yesNo(posture.config.enabled)}`,
235
235
  ` autostart config: ${yesNo(posture.config.autostart)}`,
236
236
  ` restartOnFailure config: ${yesNo(posture.config.restartOnFailure)}`,
237
- ` daemon flag: ${yesNo(posture.config.daemonEnabled)}`,
237
+ ` runtime host flag: ${yesNo(posture.config.daemonEnabled)}`,
238
238
  ` log: ${posture.log.path ?? 'n/a'} (${posture.log.exists ? 'present' : 'missing'})`,
239
239
  ...(posture.log.readError ? [` log read error: ${posture.log.readError}`] : []),
240
240
  '',
package/src/cli/status.ts CHANGED
@@ -136,7 +136,7 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
136
136
  severity: 'warning',
137
137
  summary: 'External runtime service config has autostart off.',
138
138
  cause: 'service.enabled is true and service.autostart is false.',
139
- impact: 'The external GoodVibes runtime may not be available after login or reboot even though service mode is selected.',
139
+ impact: 'The external GoodVibes runtime may not be available after login or reboot even though host-managed startup is selected.',
140
140
  action: 'Configure autostart from GoodVibes TUI or the owning host; Agent will not mutate this setting.',
141
141
  });
142
142
  }
@@ -326,7 +326,7 @@ export function renderCliStatus(options: CliStatusOptions): string {
326
326
  ? ` operatorTokens: ${options.auth.operatorTokenPresent ? 'present' : 'missing'} (${options.auth.operatorTokenPath})`
327
327
  : ' operatorTokens: unknown',
328
328
  '',
329
- 'External Daemon Service:',
329
+ 'External Runtime Service:',
330
330
  ` enabled: ${yesNo(serviceEnabled)}`,
331
331
  ` autostart: ${yesNo(serviceAutostart)}`,
332
332
  ` restartOnFailure: ${yesNo(restartOnFailure)}`,
@@ -338,7 +338,7 @@ export function renderCliStatus(options: CliStatusOptions): string {
338
338
  ` log: ${options.service.log.path ?? 'n/a'} (${options.service.log.exists ? 'present' : 'missing'})`,
339
339
  ] : []),
340
340
  '',
341
- 'Surfaces:',
341
+ 'Runtime Endpoints:',
342
342
  bindLine('controlPlane', controlPlaneEnabled, controlPlaneBinding),
343
343
  bindLine('httpListener', listenerEnabled, httpListenerBinding),
344
344
  bindLine('web', webEnabled, webBinding),
@@ -155,7 +155,7 @@ export async function handleSurfacesCommand(runtime: CliCommandRuntime): Promise
155
155
  'ntfy inbound topics:',
156
156
  ` chat: ${ntfyTopics.chatTopic}`,
157
157
  ` agent: ${ntfyTopics.agentTopic}`,
158
- ` daemon-only remote: ${ntfyTopics.remoteTopic}`,
158
+ ` runtime-only remote: ${ntfyTopics.remoteTopic}`,
159
159
  ` default delivery topic: ${String(config.get('surfaces.ntfy.topic') || '(none)')}`,
160
160
  ] : []),
161
161
  ...(includeProbe ? [
@@ -37,7 +37,7 @@ export function buildAgentWorkspaceSetupChecklist(input: AgentWorkspaceSetupChec
37
37
  id: 'runtime',
38
38
  label: 'External runtime',
39
39
  status: 'ready',
40
- detail: `Agent will connect to ${input.daemonBaseUrl}; runtime lifecycle stays external.`,
40
+ detail: `Agent will connect to ${input.daemonBaseUrl}; runtime ownership stays outside this TUI.`,
41
41
  command: '/status',
42
42
  },
43
43
  {
@@ -154,7 +154,7 @@ export class AgentWorkspace {
154
154
  this.lastActionResult = {
155
155
  kind: 'refreshed',
156
156
  title: 'Runtime context refreshed',
157
- detail: 'Provider, model, session, local memory, daemon URL, and Agent knowledge route posture were re-read from the live command context.',
157
+ detail: 'Provider, model, session, local memory, runtime endpoint, and Agent knowledge route posture were re-read from the live command context.',
158
158
  };
159
159
  }
160
160
 
@@ -83,7 +83,7 @@ function renderGuide(homeDirectory: string): string {
83
83
  '5. Create a runtime profile from the imported starter:',
84
84
  ' /agent-profile create <name> --template <imported-id> --yes',
85
85
  '',
86
- 'This writes only Agent-local starter/profile state. It does not mutate the daemon, default wiki, or non-Agent knowledge segments.',
86
+ 'This writes only Agent-local starter/profile state. It does not mutate the runtime host, default wiki, or non-Agent knowledge segments.',
87
87
  ].join('\n');
88
88
  }
89
89
 
@@ -119,7 +119,7 @@ export function registerLocalAuthRuntimeCommands(registry: CommandRegistry): voi
119
119
  registry.register({
120
120
  name: 'local-auth',
121
121
  aliases: ['auth-local'],
122
- description: 'Inspect and manage local daemon/listener auth users, sessions, and bootstrap credentials',
122
+ description: 'Inspect and manage local runtime auth users, sessions, and bootstrap credentials',
123
123
  usage: '[review|panel|add-user <username> <password> [roles] --yes|delete-user <username> --yes|rotate-password <username> <password> --yes|revoke-session <token-or-fingerprint> --yes|clear-bootstrap-file --yes]',
124
124
  handler(args, ctx) {
125
125
  handleLocalAuthCommand(args, ctx);
@@ -31,13 +31,26 @@ interface UpdateBundle {
31
31
  interface AuthReviewBundle {
32
32
  readonly version: 1;
33
33
  readonly exportedAt: number;
34
- readonly daemonLoginUrl: string;
34
+ readonly runtimeLoginUrl: string;
35
35
  readonly listenerLoginUrl: string;
36
36
  readonly secretKeys: readonly string[];
37
37
  readonly activeSubscriptions: readonly string[];
38
38
  readonly pendingSubscriptions: readonly string[];
39
39
  }
40
40
 
41
+ type AuthServiceLoginTarget = 'runtime' | 'listener';
42
+
43
+ function normalizeAuthServiceLoginTarget(value: string | undefined): AuthServiceLoginTarget | null {
44
+ const normalized = value?.trim().toLowerCase();
45
+ if (normalized === 'runtime' || normalized === 'daemon') return 'runtime';
46
+ if (normalized === 'listener' || normalized === 'inbound-listener') return 'listener';
47
+ return null;
48
+ }
49
+
50
+ function authServiceSecretPrefix(target: AuthServiceLoginTarget): string {
51
+ return target === 'runtime' ? 'RUNTIME' : 'LISTENER';
52
+ }
53
+
41
54
  function buildSetupLink(surface: string, target?: string): string {
42
55
  const params = target ? `?target=${encodeURIComponent(target)}` : '';
43
56
  return `goodvibes://open/${surface}${params}`;
@@ -68,7 +81,7 @@ function inspectAuthBundle(bundle: AuthReviewBundle): string {
68
81
  return [
69
82
  'Auth Review Bundle',
70
83
  ` exportedAt: ${new Date(bundle.exportedAt).toISOString()}`,
71
- ` daemonLoginUrl: ${bundle.daemonLoginUrl}`,
84
+ ` runtimeLoginUrl: ${bundle.runtimeLoginUrl}`,
72
85
  ` listenerLoginUrl: ${bundle.listenerLoginUrl}`,
73
86
  ` stored secrets: ${bundle.secretKeys.length}`,
74
87
  ` active subscriptions: ${bundle.activeSubscriptions.length}`,
@@ -80,7 +93,7 @@ export function registerPlatformAccessRuntimeCommands(registry: CommandRegistry)
80
93
  registry.register({
81
94
  name: 'login',
82
95
  description: 'Front-door login flow for provider subscriptions and local service sessions',
83
- usage: '[provider <name> start|finish <code> --yes|service <daemon|listener> <baseUrl> <username> <password> [secretKey] --yes]',
96
+ usage: '[provider <name> start|finish <code> --yes|service <runtime|listener> <baseUrl> <username> <password> [secretKey] --yes]',
84
97
  async handler(args, ctx) {
85
98
  const parsed = stripYesFlag(args);
86
99
  const commandArgs = [...parsed.rest];
@@ -106,17 +119,17 @@ export function registerPlatformAccessRuntimeCommands(registry: CommandRegistry)
106
119
  }
107
120
  if (target === 'service') {
108
121
  if (!parsed.yes) {
109
- requireYesFlag(ctx, 'store a local service session token', '/login service <daemon|listener> <baseUrl> <username> <password> [secretKey] --yes');
122
+ requireYesFlag(ctx, 'store a local service session token', '/login service <runtime|listener> <baseUrl> <username> <password> [secretKey] --yes');
110
123
  return;
111
124
  }
112
125
  if (ctx.executeCommand) {
113
126
  await ctx.executeCommand('auth', ['login', ...commandArgs.slice(1), '--yes']);
114
127
  return;
115
128
  }
116
- ctx.print('Use /auth login <daemon|listener> <baseUrl> <username> <password> [secretKey] --yes');
129
+ ctx.print('Use /auth login <runtime|listener> <baseUrl> <username> <password> [secretKey] --yes');
117
130
  return;
118
131
  }
119
- ctx.print('Usage: /login [provider <name> start|finish <code> --yes|service <daemon|listener> <baseUrl> <username> <password> [secretKey] --yes]');
132
+ ctx.print('Usage: /login [provider <name> start|finish <code> --yes|service <runtime|listener> <baseUrl> <username> <password> [secretKey] --yes]');
120
133
  },
121
134
  });
122
135
 
@@ -293,7 +306,7 @@ export function registerPlatformAccessRuntimeCommands(registry: CommandRegistry)
293
306
  registry.register({
294
307
  name: 'auth',
295
308
  description: 'Review auth posture and exchange session login tokens with local services',
296
- usage: '[review|show <provider>|repair <provider>|bundle export <path> --yes|bundle inspect <path>|login <daemon|listener> <baseUrl> <username> <password> [secretKey] --yes|local <review|panel|add-user --yes|delete-user --yes|rotate-password --yes|revoke-session --yes|clear-bootstrap-file --yes>]',
309
+ usage: '[review|show <provider>|repair <provider>|bundle export <path> --yes|bundle inspect <path>|login <runtime|listener> <baseUrl> <username> <password> [secretKey] --yes|local <review|panel|add-user --yes|delete-user --yes|rotate-password --yes|revoke-session --yes|clear-bootstrap-file --yes>]',
297
310
  async handler(args, ctx) {
298
311
  const parsed = stripYesFlag(args);
299
312
  const commandArgs = [...parsed.rest];
@@ -315,7 +328,7 @@ export function registerPlatformAccessRuntimeCommands(registry: CommandRegistry)
315
328
  const builtinProviders = listBuiltinSubscriptionProviders().map((entry) => entry.provider);
316
329
  ctx.print([
317
330
  'Auth Review',
318
- ' daemon login route: /login',
331
+ ' runtime login route: /login',
319
332
  ' listener login route: /login',
320
333
  ` stored secrets: ${snapshot.secretKeyCount}`,
321
334
  ` built-in providers: ${builtinProviders.length}${builtinProviders.length > 0 ? ` (${builtinProviders.join(', ')})` : ''}`,
@@ -397,7 +410,7 @@ export function registerPlatformAccessRuntimeCommands(registry: CommandRegistry)
397
410
  const bundle: AuthReviewBundle = {
398
411
  version: 1,
399
412
  exportedAt: Date.now(),
400
- daemonLoginUrl: 'http://127.0.0.1:3421/login',
413
+ runtimeLoginUrl: 'http://127.0.0.1:3421/login',
401
414
  listenerLoginUrl: 'http://127.0.0.1:3422/login',
402
415
  secretKeys,
403
416
  activeSubscriptions: subscriptions.list().map((entry) => entry.provider),
@@ -416,17 +429,17 @@ export function registerPlatformAccessRuntimeCommands(registry: CommandRegistry)
416
429
  }
417
430
 
418
431
  if (sub === 'login') {
419
- const target = commandArgs[1];
432
+ const target = normalizeAuthServiceLoginTarget(commandArgs[1]);
420
433
  const baseUrl = commandArgs[2];
421
434
  const username = commandArgs[3];
422
435
  const password = commandArgs[4];
423
- const secretKey = commandArgs[5] ?? `${target?.toUpperCase() ?? 'SERVICE'}_SESSION_TOKEN`;
424
- if ((target !== 'daemon' && target !== 'listener') || !baseUrl || !username || !password) {
425
- ctx.print('Usage: /auth login <daemon|listener> <baseUrl> <username> <password> [secretKey] --yes');
436
+ const secretKey = commandArgs[5] ?? `${target ? authServiceSecretPrefix(target) : 'SERVICE'}_SESSION_TOKEN`;
437
+ if (!target || !baseUrl || !username || !password) {
438
+ ctx.print('Usage: /auth login <runtime|listener> <baseUrl> <username> <password> [secretKey] --yes');
426
439
  return;
427
440
  }
428
441
  if (!parsed.yes) {
429
- requireYesFlag(ctx, `store ${target} session token`, '/auth login <daemon|listener> <baseUrl> <username> <password> [secretKey] --yes');
442
+ requireYesFlag(ctx, `store ${target} session token`, '/auth login <runtime|listener> <baseUrl> <username> <password> [secretKey] --yes');
430
443
  return;
431
444
  }
432
445
  const url = new URL('/login', baseUrl).toString();
@@ -450,7 +463,7 @@ export function registerPlatformAccessRuntimeCommands(registry: CommandRegistry)
450
463
  return;
451
464
  }
452
465
 
453
- ctx.print('Usage: /auth [review|show <provider>|bundle export <path> --yes|bundle inspect <path>|login <daemon|listener> <baseUrl> <username> <password> [secretKey] --yes|local <review|panel|add-user --yes|delete-user --yes|rotate-password --yes|revoke-session --yes|clear-bootstrap-file --yes>]');
466
+ ctx.print('Usage: /auth [review|show <provider>|bundle export <path> --yes|bundle inspect <path>|login <runtime|listener> <baseUrl> <username> <password> [secretKey] --yes|local <review|panel|add-user --yes|delete-user --yes|rotate-password --yes|revoke-session --yes|clear-bootstrap-file --yes>]');
454
467
  },
455
468
  });
456
469
  }
@@ -43,15 +43,15 @@ export async function handleRemoteSetupCommand(
43
43
  const lines = [
44
44
  'Remote Setup Review',
45
45
  ` acp agent command: ${command.join(' ')}`,
46
- ` daemon enabled: ${danger.daemon ? 'yes' : 'no'}`,
47
- ` http listener enabled: ${danger.httpListener ? 'yes' : 'no'}`,
46
+ ` runtime host enabled: ${danger.daemon ? 'yes' : 'no'}`,
47
+ ` inbound listener enabled: ${danger.httpListener ? 'yes' : 'no'}`,
48
48
  ` remote runner contracts: ${remoteRegistry.listContracts().length}`,
49
49
  ` active acp connections: ${activeConnections.length}`,
50
50
  '',
51
51
  ' guidance:',
52
52
  ' - set ACP_AGENT_CMD to override the spawned remote agent command',
53
53
  ' - use /remote env to export a reusable shell snippet',
54
- ' - enable danger.daemon / danger.httpListener only when you actually need those remote surfaces',
54
+ ' - runtime-host and inbound-listener posture belongs to the runtime owner, not Agent onboarding',
55
55
  ];
56
56
  if (commandArgs[1]?.toLowerCase() === 'export') {
57
57
  const pathArg = commandArgs[2];
@@ -69,8 +69,8 @@ export async function handleRemoteSetupCommand(
69
69
  writeFileSync(targetPath, `${JSON.stringify({
70
70
  exportedAt: Date.now(),
71
71
  acpAgentCommand: command,
72
- daemonEnabled: Boolean(danger.daemon),
73
- httpListenerEnabled: Boolean(danger.httpListener),
72
+ runtimeHostEnabled: Boolean(danger.daemon),
73
+ inboundListenerEnabled: Boolean(danger.httpListener),
74
74
  remoteRunnerContracts: remoteRegistry.listContracts().length,
75
75
  }, null, 2)}\n`, 'utf-8');
76
76
  ctx.print(`Exported remote setup bundle to ${targetPath}`);
@@ -111,7 +111,7 @@ export async function handleRemoteSetupCommand(
111
111
  const mode = commandArgs[1]?.toLowerCase() ?? 'review';
112
112
  const lines = [
113
113
  'Remote Tunnel Review',
114
- ' transport: self-hosted ACP / daemon relay',
114
+ ' transport: self-hosted ACP / runtime relay',
115
115
  ` session: ${ctx.session.runtime.sessionId}`,
116
116
  ` active remote connections: ${activeConnections.length}`,
117
117
  ' guidance: forward ACP agent traffic through your chosen self-hosted tunnel or SSH transport',
@@ -243,7 +243,7 @@ export async function runRoutinesRuntimeCommand(args: readonly string[], ctx: Co
243
243
  const routine = routineRegistry.markStarted(id);
244
244
  ctx.print([
245
245
  `Started Agent routine ${routine.id}: ${routine.name}`,
246
- ' policy: same main conversation; no hidden background job, daemon mutation, or external side effect was started',
246
+ ' policy: same main conversation; no hidden job, runtime mutation, or external side effect was started',
247
247
  '',
248
248
  routine.steps,
249
249
  ].join('\n'));
@@ -501,7 +501,7 @@ export function buildVoiceMediaStep(): OnboardingWizardStepDefinition {
501
501
  kind: 'status',
502
502
  id: 'agent-voice-media.nodes',
503
503
  label: 'Node and device posture',
504
- hint: 'Remote devices and nodes are inspected as capability surfaces. Agent does not own runner topology or launch service processes from onboarding.',
504
+ hint: 'Remote devices and nodes are inspected only when useful. Agent onboarding does not launch runners or background service processes.',
505
505
  defaultValue: 'External',
506
506
  },
507
507
  ],
@@ -88,12 +88,12 @@ export class AutomationControlPanel extends ScrollableListPanel<AutomationRun> {
88
88
  protected override getEmptyStateActions(): Array<{ command: string; summary: string }> {
89
89
  return [
90
90
  { command: '/schedule list', summary: 'inspect jobs and run history without mutating schedules' },
91
- { command: '/automation jobs', summary: 'review daemon-owned automation jobs from the Agent CLI' },
91
+ { command: '/automation jobs', summary: 'review runtime-owned automation jobs from Agent' },
92
92
  ];
93
93
  }
94
94
 
95
95
  public render(width: number, height: number): Line[] {
96
- const intro = 'Automation jobs, active runs, deliveries, and failure posture across the shared control plane.';
96
+ const intro = 'Automation jobs, active runs, deliveries, and failure posture across the shared runtime.';
97
97
 
98
98
  if (!this.readModel) {
99
99
  const workspace = buildPanelWorkspace(width, height, {
@@ -97,7 +97,7 @@ export function registerAgentPanels(manager: PanelManager, deps: ResolvedBuiltin
97
97
  name: 'Schedule',
98
98
  icon: 'Z',
99
99
  category: 'agent',
100
- description: 'Read-only schedule posture from the external daemon; local Agent schedule mutation is blocked',
100
+ description: 'Read-only schedule posture from the external runtime; local Agent schedule mutation is blocked',
101
101
  factory: () => new SchedulePanel(requireAutomationManager(deps)),
102
102
  });
103
103
  }
@@ -129,7 +129,7 @@ export function registerOperationsPanels(manager: PanelManager, deps: ResolvedBu
129
129
  name: 'Control Plane',
130
130
  icon: 'C',
131
131
  category: 'monitoring',
132
- description: 'Daemon control-plane state, clients, approvals, and recent operator activity',
132
+ description: 'Runtime state, clients, approvals, and recent operator activity',
133
133
  factory: () => {
134
134
  requireControlPlanePanelDeps(deps);
135
135
  return new ControlPlanePanel(ui.readModels.controlPlane);
@@ -150,7 +150,7 @@ export function registerOperationsPanels(manager: PanelManager, deps: ResolvedBu
150
150
  name: 'Local Auth',
151
151
  icon: 'U',
152
152
  category: 'monitoring',
153
- description: 'Local daemon/listener auth users, bootstrap posture, and active sessions',
153
+ description: 'Local runtime auth users, bootstrap posture, and active sessions',
154
154
  factory: () => new LocalAuthPanel(deps.localUserAuthManager),
155
155
  });
156
156
 
@@ -251,7 +251,7 @@ export function registerOperationsPanels(manager: PanelManager, deps: ResolvedBu
251
251
  name: 'Remote',
252
252
  icon: 'R',
253
253
  category: 'monitoring',
254
- description: 'Self-hosted daemon and ACP transport state with active remote connections',
254
+ description: 'Runtime transport state with active remote connections',
255
255
  factory: () => new RemotePanel(ui.readModels.remote),
256
256
  });
257
257
 
@@ -83,7 +83,7 @@ export class ControlPlanePanel extends ScrollableListPanel<ControlPlaneClient> {
83
83
  }
84
84
 
85
85
  public render(width: number, height: number): Line[] {
86
- const intro = 'Shared daemon control plane state, live clients, approval pressure, and recent omnichannel session posture.';
86
+ const intro = 'Shared runtime state, live clients, approval pressure, and recent omnichannel session posture.';
87
87
 
88
88
  if (!this.readModel) {
89
89
  const workspace = buildPanelWorkspace(width, height, {
@@ -123,7 +123,7 @@ export class ControlPlanePanel extends ScrollableListPanel<ControlPlaneClient> {
123
123
  { label: 'sessions', value: String(sessions.length), valueColor: sessions.length > 0 ? C.info : C.dim },
124
124
  { label: 'events', value: String(recentEvents.length), valueColor: recentEvents.length > 0 ? C.info : C.dim },
125
125
  ], C),
126
- buildGuidanceLine(width, '/cockpit', 'use the web operator surface or daemon APIs for direct interventions while this panel tracks overall posture', C),
126
+ buildGuidanceLine(width, '/cockpit', 'use confirmed runtime actions for interventions while this panel tracks overall posture', C),
127
127
  ];
128
128
 
129
129
  if (clients.length === 0 && approvals.length === 0 && sessions.length === 0) {
@@ -57,7 +57,7 @@ export class LocalAuthPanel extends ScrollableListPanel<LocalAuthUser> {
57
57
  }
58
58
 
59
59
  public render(width: number, height: number): Line[] {
60
- const intro = 'Manage local daemon and HTTP-listener auth users, bootstrap state, and active sessions.';
60
+ const intro = 'Review local runtime auth users, bootstrap state, and active sessions.';
61
61
  const snapshot = this.authManager.inspect();
62
62
  const users = this.getItems();
63
63
 
@@ -545,13 +545,13 @@ export class ProjectPlanningPanel extends BasePanel {
545
545
  id: 'scope-end-to-end',
546
546
  label: 'End-to-end required scope',
547
547
  detail: 'Let the plan include every component needed to make this work, but avoid unrelated cleanup.',
548
- answer: 'Scope is everything required to make the requested outcome work end-to-end. Include TUI, daemon composition, configuration, docs, and tests if they are required. Do not include unrelated cleanup or broad refactors unless they are necessary for this task.',
548
+ answer: 'Scope is everything required to make the requested outcome work end-to-end. Include TUI, runtime composition, configuration, docs, and tests if they are required. Do not include unrelated cleanup or broad refactors unless they are necessary for this task.',
549
549
  });
550
550
  actions.push({
551
551
  id: 'scope-agent-first',
552
552
  label: 'Agent-first scope',
553
553
  detail: 'Fix Agent behavior here; report SDK blockers instead of patching around SDK-owned bugs.',
554
- answer: 'Scope is Agent-owned behavior first. If a blocker is SDK-owned, report the exact SDK contract/runtime issue instead of patching around it locally. Include daemon contracts only where Agent consumes public daemon routes.',
554
+ answer: 'Scope is Agent-owned behavior first. If a blocker is SDK-owned, report the exact SDK contract/runtime issue instead of patching around it locally. Include runtime contracts only where Agent consumes public runtime routes.',
555
555
  });
556
556
  }
557
557
  actions.push({
@@ -158,7 +158,7 @@ export class RemotePanel extends BasePanel {
158
158
 
159
159
  const postureLines: Line[] = [
160
160
  buildPanelLine(width, [
161
- [' daemon ', C.label],
161
+ [' runtime ', C.label],
162
162
  [daemon.transportState.toUpperCase(), stateColor(daemon.transportState)],
163
163
  [' running ', C.label],
164
164
  [daemon.isRunning ? 'yes' : 'no', daemon.isRunning ? C.ok : C.dim],
@@ -199,7 +199,7 @@ export class RemotePanel extends BasePanel {
199
199
 
200
200
  if (daemon.lastError) {
201
201
  postureLines.push(buildPanelLine(width, [
202
- [' daemon error ', C.label],
202
+ [' runtime error ', C.label],
203
203
  [daemon.lastError.slice(0, Math.max(0, width - 14)), C.error],
204
204
  ]));
205
205
  }
@@ -171,7 +171,7 @@ export class SchedulePanel extends BasePanel {
171
171
  }
172
172
  case 'return':
173
173
  case ' ': {
174
- this.setError('Schedule mutation is read-only in GoodVibes Agent; use daemon/TUI-owned explicit approval routes later.');
174
+ this.setError('Schedule mutation is read-only in GoodVibes Agent; use explicit runtime approval routes later.');
175
175
  return true;
176
176
  }
177
177
  case 'r': {
@@ -130,7 +130,7 @@ export class WatchersPanel extends ScrollableListPanel<WatcherEntry> {
130
130
  { label: 'degraded', value: String(snapshot.totalDegraded), valueColor: snapshot.totalDegraded > 0 ? C.warn : C.dim },
131
131
  { label: 'lagged', value: String(snapshot.totalLagged), valueColor: snapshot.totalLagged > 0 ? C.warn : C.dim },
132
132
  ], C),
133
- buildGuidanceLine(width, '/schedule list', 'verify jobs consuming these sources and use daemon APIs for watcher lifecycle control', C),
133
+ buildGuidanceLine(width, '/schedule list', 'verify jobs consuming these sources; Agent keeps watcher lifecycle read-only here', C),
134
134
  ];
135
135
 
136
136
  if (watchers.length === 0) {
@@ -154,7 +154,7 @@ export const SETTING_LABELS: Partial<Record<string, string>> = {
154
154
  'surfaces.ntfy.topic': 'ntfy Default Delivery Topic',
155
155
  'surfaces.ntfy.chatTopic': 'ntfy Chat Topic',
156
156
  'surfaces.ntfy.agentTopic': 'ntfy Agent Topic',
157
- 'surfaces.ntfy.remoteTopic': 'ntfy Daemon-Only Remote Topic',
157
+ 'surfaces.ntfy.remoteTopic': 'ntfy Runtime-Only Remote Topic',
158
158
  'surfaces.ntfy.token': 'ntfy Token',
159
159
  'surfaces.ntfy.defaultPriority': 'ntfy Default Priority',
160
160
  };
@@ -75,9 +75,9 @@ const ENUM_VALUE_DESCRIPTIONS: Record<string, Record<string, string>> = {
75
75
  plaintext_allowed: 'Allow plaintext fallback when secure storage is unavailable.',
76
76
  },
77
77
  'batch.mode': {
78
- off: 'Keep daemon work on the immediate local path.',
78
+ off: 'Keep runtime work on the immediate local path.',
79
79
  explicit: 'Use batch only when callers explicitly request batch execution.',
80
- 'eligible-by-default': 'Allow eligible daemon work to use the batch path unless callers opt out.',
80
+ 'eligible-by-default': 'Allow eligible runtime work to use the batch path unless callers opt out.',
81
81
  },
82
82
  'controlPlane.hostMode': {
83
83
  localhost: 'Bind only to this computer.',
@@ -46,8 +46,8 @@ import { buildEnabledRoutinesPrompt } from '../agent/routine-registry.ts';
46
46
 
47
47
  const GOODVIBES_AGENT_OPERATOR_POLICY = [
48
48
  '## GoodVibes Agent Operator Policy',
49
- '- Default to serial, proactive assistant work in the main conversation. Answer, inspect, summarize, remember useful non-secret facts, configure local Agent state, use read-only daemon/operator routes, and take safe non-destructive actions without spawning local agents or WRFC.',
50
- '- GoodVibes Agent connects to an externally managed GoodVibes daemon. Do not start, stop, restart, install, expose, or mutate daemon/listener/control-plane surface posture from Agent runtime.',
49
+ '- Default to serial, proactive assistant work in the main conversation. Answer, inspect, summarize, remember useful non-secret facts, configure local Agent state, use read-only runtime/operator routes, and take safe non-destructive actions without spawning local agents or WRFC.',
50
+ '- GoodVibes Agent connects to an externally managed GoodVibes runtime host. Do not start, stop, restart, install, expose, or mutate runtime-host network/listener posture from Agent runtime.',
51
51
  '- Use the `agent_local_registry` tool when a reusable persona, skill, or routine would improve future work. Keep those records local, non-secret, source/provenance tagged, and reviewable. Starting a routine means applying its steps in this same serial conversation, not creating a background job.',
52
52
  '- WRFC is never the default Agent reasoning path. Do not create local WRFC chains for planning, research, operations, knowledge, memory, configuration, approvals, automation observability, or ordinary assistant work.',
53
53
  '- GoodVibes Agent is not the coding TUI. Do not use the `agent` tool to spawn local Engineer, Reviewer, Tester, Verifier, or batch-spawn roots from Agent.',
@@ -332,8 +332,8 @@ export async function bootstrapRuntime(
332
332
  port,
333
333
  baseUrl: formatHostServiceBaseUrl(host, port),
334
334
  reason: service === 'daemon'
335
- ? 'GoodVibes Agent connects to an externally managed GoodVibes daemon and does not start or restart it.'
336
- : 'GoodVibes Agent does not own the HTTP listener lifecycle.',
335
+ ? 'GoodVibes Agent connects to an externally managed GoodVibes runtime host and does not start or restart it.'
336
+ : 'GoodVibes Agent does not own external listener lifecycle.',
337
337
  };
338
338
  };
339
339
 
@@ -373,7 +373,7 @@ export async function bootstrapRuntime(
373
373
  daemonStatus: createExternalAgentServiceStatus('daemon'),
374
374
  httpListenerStatus: createExternalAgentServiceStatus('httpListener'),
375
375
  };
376
- systemMessageRouter.high('[Startup] GoodVibes Agent does not start or restart daemon/listener services. Start the daemon from GoodVibes TUI or the daemon host, then refresh status.');
376
+ systemMessageRouter.high('[Startup] GoodVibes Agent does not start or restart runtime-host services. Start the GoodVibes runtime from its owner, then refresh status.');
377
377
  requestRender();
378
378
  return inspectExternalServices();
379
379
  },
@@ -450,8 +450,8 @@ export async function bootstrapRuntime(
450
450
  });
451
451
  bootstrapUnsubs.push(() => mcpAutoReload.stop());
452
452
  if (configManager.get('automation.enabled')) {
453
- logger.warn('Local automation startup is disabled in GoodVibes Agent; use external daemon observability instead.');
454
- systemMessageRouter.low('[Startup] Local automation runners are disabled in GoodVibes Agent; use read-only automation observability or explicit external-daemon actions.');
453
+ logger.warn('Local automation startup is disabled in GoodVibes Agent; use external runtime observability instead.');
454
+ systemMessageRouter.low('[Startup] Local automation runners are disabled in GoodVibes Agent; use read-only automation observability or explicit external-runtime actions.');
455
455
  }
456
456
 
457
457
  // ── Phase 12: Session:start lifecycle hook ─────────────────────────────
@@ -113,8 +113,8 @@ function agentExternalHostStatus(
113
113
  port,
114
114
  baseUrl: `http://${host}:${port}`,
115
115
  reason: service === 'daemon'
116
- ? 'GoodVibes Agent connects to an externally managed GoodVibes daemon and does not start or restart it.'
117
- : 'GoodVibes Agent does not own the HTTP listener lifecycle.',
116
+ ? 'GoodVibes Agent connects to an externally managed GoodVibes runtime host and does not start or restart it.'
117
+ : 'GoodVibes Agent does not own external listener lifecycle.',
118
118
  };
119
119
  }
120
120
 
@@ -253,28 +253,28 @@ function hasExternalIntegrations(snapshot: OnboardingSnapshotState): boolean {
253
253
 
254
254
  function describeLocalTuiOnly(snapshot: OnboardingSnapshotState): string {
255
255
  if (!hasAnyServerEnabled(snapshot)) {
256
- return 'Use GoodVibes Agent in this terminal while connecting only to an externally managed daemon. Agent does not enable service mode, HTTP listeners, external app surfaces, or network setup.';
256
+ return 'Use GoodVibes Agent in this terminal while connecting to the existing GoodVibes runtime. Agent setup does not enable network services or extra entrypoints.';
257
257
  }
258
258
 
259
- return 'Keep Agent local-only by not requesting browser access, service posture changes, HTTP listeners, external app surfaces, or network setup from the daemon owner.';
259
+ return 'Keep Agent local-first by reviewing runtime connectivity separately from Agent-owned assistant setup.';
260
260
  }
261
261
 
262
262
  function describeBrowserAccess(snapshot: OnboardingSnapshotState): string {
263
263
  return snapshot.bindSettings.web.enabled
264
- ? 'Review the externally managed daemon web UI posture. Network reachability is controlled by the daemon owner.'
265
- : 'Review browser access requirements for the externally managed daemon. Agent records intent but does not start web services.';
264
+ ? 'Review browser access already exposed by the runtime owner. Agent records visibility but does not change network posture.'
265
+ : 'Browser access is optional. Agent can stay terminal-first while the runtime owner controls any browser entrypoint.';
266
266
  }
267
267
 
268
268
  function describeRemoteDeviceAccess(snapshot: OnboardingSnapshotState): string {
269
269
  return hasRemoteDeviceAccess(snapshot)
270
- ? 'Review external daemon surfaces reachable from other devices on your LAN. Local authentication is required.'
271
- : 'Review the external daemon surfaces required for other-device LAN access. Local authentication is required.';
270
+ ? 'Review runtime access reachable from other devices on your LAN. Local authentication is required.'
271
+ : 'Other-device access is optional and remains controlled by the runtime owner.';
272
272
  }
273
273
 
274
274
  function describeWebhookIngress(snapshot: OnboardingSnapshotState): string {
275
275
  return hasWebhookOrEventIngress(snapshot)
276
- ? 'Review the external HTTP listener used for incoming webhooks, callbacks, and automation events.'
277
- : 'Review the external HTTP listener required for incoming webhooks, callbacks, and automation events.';
276
+ ? 'Review incoming webhook, callback, and automation-event routes exposed by the runtime owner.'
277
+ : 'Incoming webhook and callback routes are optional; Agent onboarding does not create them.';
278
278
  }
279
279
 
280
280
  function describeExternalIntegrations(snapshot: OnboardingSnapshotState): string {
@@ -284,10 +284,10 @@ function describeExternalIntegrations(snapshot: OnboardingSnapshotState): string
284
284
  ]).size;
285
285
 
286
286
  if (integrationCount === 0) {
287
- return 'Enable setup screens for Slack, Discord, Telegram, Teams, Matrix, and other app surfaces you choose.';
287
+ return 'Connect only the channels you want the assistant to use, then review delivery safety before sending externally.';
288
288
  }
289
289
 
290
- return `Review and configure ${integrationCount} detected external app, service, or surface integration signal(s).`;
290
+ return `Review ${integrationCount} detected channel or integration signal(s) before allowing external delivery.`;
291
291
  }
292
292
 
293
293
  function getAcknowledgementAccepted(
@@ -330,31 +330,31 @@ export function deriveStep1Capabilities(
330
330
  return [
331
331
  {
332
332
  id: 'local-tui-only',
333
- label: 'Agent Local Only (External Daemon)',
333
+ label: 'Agent Terminal First',
334
334
  selected: !hasAnyServerEnabled(snapshot),
335
335
  detail: describeLocalTuiOnly(snapshot),
336
336
  },
337
337
  {
338
338
  id: 'browser-access',
339
- label: 'Open GoodVibes in a Browser',
339
+ label: 'Optional Browser Access',
340
340
  selected: hasBrowserAccess(snapshot),
341
341
  detail: describeBrowserAccess(snapshot),
342
342
  },
343
343
  {
344
344
  id: 'network-access',
345
- label: 'Let other devices use GoodVibes',
345
+ label: 'Optional Other-Device Access',
346
346
  selected: hasRemoteDeviceAccess(snapshot),
347
347
  detail: describeRemoteDeviceAccess(snapshot),
348
348
  },
349
349
  {
350
350
  id: 'webhook-events',
351
- label: 'Receive webhooks or events from other tools',
351
+ label: 'Optional Incoming Events',
352
352
  selected: hasWebhookOrEventIngress(snapshot),
353
353
  detail: describeWebhookIngress(snapshot),
354
354
  },
355
355
  {
356
356
  id: 'external-integrations',
357
- label: 'Connect GoodVibes to external apps and services',
357
+ label: 'Channels and Integrations',
358
358
  selected: hasExternalIntegrations(snapshot),
359
359
  detail: describeExternalIntegrations(snapshot),
360
360
  },
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.62';
9
+ let _version = '0.1.64';
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 {