@pellux/goodvibes-agent 1.0.35 → 1.0.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/CHANGELOG.md +20 -9
  2. package/README.md +8 -7
  3. package/dist/package/{ast-grep-napi.linux-x64-gnu-swtppvy9.node → ast-grep-napi.linux-x64-gnu-mkk8xwww.node} +0 -0
  4. package/dist/package/{ast-grep-napi.linux-x64-musl-ttfcdtap.node → ast-grep-napi.linux-x64-musl-ryqtgdv6.node} +0 -0
  5. package/dist/package/main.js +51495 -49329
  6. package/docs/README.md +6 -5
  7. package/docs/channels-remote-and-api.md +3 -3
  8. package/docs/connected-host.md +3 -3
  9. package/docs/getting-started.md +12 -7
  10. package/docs/knowledge-artifacts-and-multimodal.md +9 -4
  11. package/docs/project-planning.md +3 -3
  12. package/docs/providers-and-routing.md +2 -2
  13. package/docs/release-and-publishing.md +8 -8
  14. package/docs/tools-and-commands.md +31 -18
  15. package/docs/voice-and-live-tts.md +1 -1
  16. package/package.json +1 -1
  17. package/release/live-verification/live-verification.json +3 -3
  18. package/release/live-verification/live-verification.md +2 -4
  19. package/release/release-notes.md +4 -4
  20. package/release/release-readiness.json +46 -46
  21. package/src/agent/harness-control.ts +35 -9
  22. package/src/agent/reminder-schedule-format.ts +2 -5
  23. package/src/agent/reminder-schedule.ts +4 -11
  24. package/src/agent/routine-schedule-format.ts +3 -6
  25. package/src/agent/routine-schedule-promotion.ts +5 -14
  26. package/src/agent/routine-schedule-receipts.ts +4 -9
  27. package/src/cli/agent-knowledge-command.ts +6 -11
  28. package/src/cli/agent-knowledge-format.ts +4 -9
  29. package/src/cli/agent-knowledge-runtime.ts +7 -14
  30. package/src/cli/external-runtime.ts +3 -46
  31. package/src/cli/help.ts +2 -2
  32. package/src/cli/status.ts +6 -7
  33. package/src/input/agent-workspace-categories.ts +23 -23
  34. package/src/input/agent-workspace-channels.ts +3 -3
  35. package/src/input/agent-workspace-operations-command-editors.ts +1 -1
  36. package/src/input/command-registry.ts +1 -1
  37. package/src/input/commands/compat-runtime.ts +1 -1
  38. package/src/input/commands/planning-runtime.ts +1 -1
  39. package/src/input/commands/runtime-services.ts +1 -1
  40. package/src/input/mcp-workspace.ts +1 -1
  41. package/src/input/submission-router.ts +1 -1
  42. package/src/panels/builtin/shared.ts +1 -1
  43. package/src/panels/project-planning-panel.ts +4 -4
  44. package/src/panels/qr-panel.ts +2 -2
  45. package/src/renderer/conversation-overlays.ts +1 -0
  46. package/src/renderer/onboarding/onboarding-wizard.ts +1 -2
  47. package/src/runtime/bootstrap-command-parts.ts +1 -1
  48. package/src/runtime/bootstrap-core.ts +1 -1
  49. package/src/runtime/bootstrap-hook-bridge.ts +1 -1
  50. package/src/runtime/bootstrap-shell.ts +1 -1
  51. package/src/runtime/bootstrap.ts +5 -4
  52. package/src/runtime/context.ts +2 -2
  53. package/src/runtime/index.ts +88 -5
  54. package/src/runtime/store/state.ts +1 -1
  55. package/src/tools/agent-channel-send-tool.ts +1 -1
  56. package/src/tools/agent-harness-channel-metadata.ts +36 -25
  57. package/src/tools/agent-harness-cli-metadata.ts +19 -1
  58. package/src/tools/agent-harness-command-catalog.ts +15 -4
  59. package/src/tools/agent-harness-connected-host-status.ts +7 -6
  60. package/src/tools/agent-harness-delegation-posture.ts +15 -4
  61. package/src/tools/agent-harness-keybinding-metadata.ts +67 -16
  62. package/src/tools/agent-harness-mcp-metadata.ts +11 -3
  63. package/src/tools/agent-harness-media-posture.ts +25 -14
  64. package/src/tools/agent-harness-metadata.ts +97 -6
  65. package/src/tools/agent-harness-mode-catalog.ts +81 -28
  66. package/src/tools/agent-harness-model-routing.ts +18 -3
  67. package/src/tools/agent-harness-model-tool-catalog.ts +85 -7
  68. package/src/tools/agent-harness-notification-metadata.ts +30 -19
  69. package/src/tools/agent-harness-operator-methods.ts +13 -8
  70. package/src/tools/agent-harness-pairing-posture.ts +17 -5
  71. package/src/tools/agent-harness-panel-metadata.ts +10 -4
  72. package/src/tools/agent-harness-provider-account-metadata.ts +46 -35
  73. package/src/tools/agent-harness-release-evidence.ts +31 -3
  74. package/src/tools/agent-harness-release-readiness.ts +30 -0
  75. package/src/tools/agent-harness-security-posture.ts +18 -4
  76. package/src/tools/agent-harness-service-posture.ts +8 -1
  77. package/src/tools/agent-harness-session-metadata.ts +24 -8
  78. package/src/tools/agent-harness-setup-posture.ts +32 -21
  79. package/src/tools/agent-harness-text.ts +6 -0
  80. package/src/tools/agent-harness-tool.ts +26 -34
  81. package/src/tools/agent-harness-ui-surface-metadata.ts +84 -84
  82. package/src/tools/agent-harness-workspace-actions.ts +64 -3
  83. package/src/tools/agent-knowledge-ingest-tool.ts +1 -1
  84. package/src/tools/agent-knowledge-tool.ts +1 -1
  85. package/src/tools/agent-media-generate-tool.ts +2 -2
  86. package/src/tools/agent-notify-tool.ts +1 -1
  87. package/src/tools/agent-reminder-schedule-tool.ts +1 -1
  88. package/src/tools/tool-definition-compaction.ts +35 -8
  89. package/src/version.ts +2 -8
@@ -6,7 +6,6 @@ import { formatEveryInterval } from '@pellux/goodvibes-sdk/platform/automation';
6
6
  import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
7
7
  import type { ShellPathService } from '@/runtime/index.ts';
8
8
  import { GOODVIBES_AGENT_SURFACE_ROOT } from '../config/surface.ts';
9
- import { SDK_VERSION } from '../version.ts';
10
9
  import { isRoutineScheduleDeliverySurfaceKind } from './routine-schedule-args.ts';
11
10
  import {
12
11
  ROUTINE_SCHEDULE_LIST_METHOD,
@@ -83,7 +82,7 @@ function redactedDeliveryTargets(delivery: ScheduleDeliveryInput | undefined): r
83
82
  }
84
83
 
85
84
  function normalizeFailureKind(value: unknown): RoutineScheduleReceipt['failureKind'] {
86
- if (value === 'confirmation_required' || value === 'auth_required' || value === 'version_mismatch') return value;
85
+ if (value === 'confirmation_required' || value === 'auth_required' || value === 'connected_host_incompatible') return value;
87
86
  if (value === 'connected_host_unavailable' || value === 'connected_host_route_unavailable' || value === 'connected_host_error') return value;
88
87
  if (value === 'daemon_unavailable') return 'connected_host_unavailable';
89
88
  if (value === 'daemon_route_unavailable') return 'connected_host_route_unavailable';
@@ -450,17 +449,13 @@ async function classifyScheduleListError(
450
449
  }
451
450
  if (lower.includes('404') || lower.includes('not found')) {
452
451
  const connectedHost = await fetchConnectedHostStatus(connection);
453
- const record = isRecord(connectedHost.body) ? connectedHost.body : {};
454
- const connectedHostVersion = readString(record, 'version') ?? 'unknown';
455
- if (connectedHost.ok && connectedHostVersion !== SDK_VERSION) {
452
+ if (connectedHost.ok) {
456
453
  return {
457
454
  ok: false,
458
- kind: 'version_mismatch',
459
- error: `Connected GoodVibes host SDK version ${connectedHostVersion} does not match Agent SDK pin ${SDK_VERSION}; schedules.list is unavailable.`,
455
+ kind: 'connected_host_incompatible',
456
+ error: 'Connected GoodVibes host compatibility does not satisfy Agent schedule requirements; schedules.list is unavailable.',
460
457
  route: ROUTINE_SCHEDULE_ROUTE,
461
458
  baseUrl: connection.baseUrl,
462
- connectedHostVersion,
463
- expectedSdkVersion: SDK_VERSION,
464
459
  };
465
460
  }
466
461
  return { ok: false, kind: 'connected_host_route_unavailable', error: message, route: ROUTINE_SCHEDULE_ROUTE, baseUrl: connection.baseUrl };
@@ -484,23 +484,19 @@ export async function handleCompatCommand(runtime: CliCommandRuntime): Promise<C
484
484
  const connection = resolveConnectedHostConnection(runtime);
485
485
  const metadata = readPackageMetadata();
486
486
  const connectedHost = await fetchConnectedHostStatus(connection);
487
- const connectedHostRecord = isRecord(connectedHost.body) ? connectedHost.body : {};
488
- const connectedHostVersion = readString(connectedHostRecord, 'version') ?? 'unknown';
489
- const versionCompatible = connectedHost.ok && connectedHostVersion === metadata.sdkVersion;
490
487
  const knowledgeRoute = await runKnowledgeCall(runtime, AGENT_KNOWLEDGE_METHODS.status, async (routeConnection) => (
491
488
  await createAgentSdk(routeConnection).knowledge.status()
492
489
  ));
493
490
  const knowledgeRouteReady = knowledgeRoute.ok;
491
+ const hostCompatible = connectedHost.ok && knowledgeRouteReady;
494
492
  const value = {
495
- ok: versionCompatible && knowledgeRouteReady,
493
+ ok: hostCompatible && knowledgeRouteReady,
496
494
  packageVersion: metadata.version,
497
- sdkPin: metadata.sdkVersion,
498
495
  connectedHost: {
499
496
  baseUrl: connection.baseUrl,
500
497
  status: connectedHost.status,
501
- version: connectedHostVersion,
502
498
  reachable: connectedHost.ok,
503
- compatible: versionCompatible,
499
+ compatible: hostCompatible,
504
500
  },
505
501
  auth: {
506
502
  tokenPresent: Boolean(connection.token),
@@ -515,12 +511,11 @@ export async function handleCompatCommand(runtime: CliCommandRuntime): Promise<C
515
511
  const text = [
516
512
  'GoodVibes Agent compatibility',
517
513
  ` package ${metadata.version}`,
518
- ` SDK pin ${metadata.sdkVersion}`,
519
- ` connected host ${connectedHostVersion} at ${connection.baseUrl} (${connectedHost.ok ? 'reachable' : 'unreachable'})`,
520
- ` version compatible ${yesNo(versionCompatible)}`,
514
+ ` connected host ${connection.baseUrl} (${connectedHost.ok ? 'reachable' : 'unreachable'})`,
515
+ ` host compatible ${yesNo(hostCompatible)}`,
521
516
  ` operator token ${connection.token ? 'present' : 'missing'} (${connection.tokenPath})`,
522
517
  ` Agent Knowledge route ${knowledgeRouteReady ? 'ready' : `not ready (${knowledgeRoute.ok ? 'unknown' : formatAgentKnowledgeFailureKind(knowledgeRoute.kind)})`}`,
523
- ...(versionCompatible ? [] : [' next update the connected GoodVibes host so /status matches the Agent SDK pin.']),
518
+ ...(hostCompatible ? [] : [' next update the connected GoodVibes host so its public Agent routes are compatible.']),
524
519
  ].join('\n');
525
520
  return {
526
521
  output: runtime.cli.flags.outputFormat === 'json' ? JSON.stringify(value, null, 2) : text,
@@ -6,8 +6,6 @@ export interface AgentKnowledgeFailureLike {
6
6
  readonly error: string;
7
7
  readonly baseUrl: string;
8
8
  readonly route: string;
9
- readonly connectedHostVersion?: string;
10
- readonly expectedSdkVersion?: string;
11
9
  }
12
10
 
13
11
  export function isRecord(value: unknown): value is JsonRecord {
@@ -45,10 +43,10 @@ function yesNo(value: boolean): string {
45
43
  export function formatAgentKnowledgeFailureKind(kind: string): string {
46
44
  if (kind === 'auth_required') return 'authorization required';
47
45
  if (kind === 'connected_host_unavailable') return 'connected host unavailable';
46
+ if (kind === 'connected_host_incompatible') return 'connected host incompatible';
48
47
  if (kind === 'connected_host_route_unavailable') return 'connected host route unavailable';
49
48
  if (kind === 'connected_host_error') return 'connected host error';
50
49
  if (kind === 'scope_contamination') return 'scope contamination';
51
- if (kind === 'version_mismatch') return 'version mismatch';
52
50
  return kind.replace(/[_-]+/g, ' ');
53
51
  }
54
52
 
@@ -384,14 +382,11 @@ export function formatFailure(failure: AgentKnowledgeFailureLike, json: boolean)
384
382
  ` ${failure.error}`,
385
383
  ` connected host ${failure.baseUrl}`,
386
384
  ` route ${failure.route}`,
387
- failure.kind === 'version_mismatch' && failure.connectedHostVersion && failure.expectedSdkVersion
388
- ? ` versions connected host ${failure.connectedHostVersion}; expected ${failure.expectedSdkVersion}`
389
- : null,
390
- failure.kind === 'version_mismatch'
391
- ? ' next update the connected GoodVibes host so /status matches the Agent SDK pin.'
385
+ failure.kind === 'connected_host_incompatible'
386
+ ? ' next update the connected GoodVibes host so its public Agent routes are compatible.'
392
387
  : null,
393
388
  failure.kind === 'connected_host_route_unavailable'
394
- ? ' next update the connected GoodVibes host to the SDK version required by this Agent package.'
389
+ ? ' next update the connected GoodVibes host so Agent Knowledge routes are available.'
395
390
  : null,
396
391
  failure.kind === 'scope_contamination'
397
392
  ? ' next update the connected GoodVibes host so Agent Knowledge routes return only Agent-owned scope data.'
@@ -1,6 +1,6 @@
1
1
  import { createBrowserAgentSdk } from '@pellux/goodvibes-sdk/browser/agent';
2
2
  import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
3
- import { SDK_VERSION, VERSION } from '../version.ts';
3
+ import { VERSION } from '../version.ts';
4
4
  import { readConnectedHostOperatorToken } from '../runtime/connected-host-auth.ts';
5
5
  import type { ConnectedHostCallMethod } from './agent-knowledge-methods.ts';
6
6
 
@@ -24,15 +24,13 @@ export interface AgentKnowledgeFailure {
24
24
  readonly kind:
25
25
  | 'connected_host_unavailable'
26
26
  | 'auth_required'
27
- | 'version_mismatch'
27
+ | 'connected_host_incompatible'
28
28
  | 'connected_host_route_unavailable'
29
29
  | 'connected_host_error'
30
30
  | 'scope_contamination';
31
31
  readonly error: string;
32
32
  readonly baseUrl: string;
33
33
  readonly route: string;
34
- readonly connectedHostVersion?: string;
35
- readonly expectedSdkVersion?: string;
36
34
  }
37
35
 
38
36
  export interface AgentKnowledgeSuccess<TData> {
@@ -53,8 +51,8 @@ export function readString(record: JsonRecord | null, key: string): string | nul
53
51
  return typeof value === 'string' ? value : null;
54
52
  }
55
53
 
56
- export function readPackageMetadata(): { readonly version: string; readonly sdkVersion: string } {
57
- return { version: VERSION, sdkVersion: SDK_VERSION };
54
+ export function readPackageMetadata(): { readonly version: string } {
55
+ return { version: VERSION };
58
56
  }
59
57
 
60
58
  export function resolveConnectedHostConnection(runtime: AgentKnowledgeConnectionRuntime): AgentKnowledgeConnection {
@@ -90,19 +88,14 @@ export async function classifyKnowledgeError(error: unknown, connection: AgentKn
90
88
  return { ok: false, kind: 'auth_required', error: message, baseUrl: connection.baseUrl, route };
91
89
  }
92
90
  if (lower.includes('404') || lower.includes('not found')) {
93
- const metadata = readPackageMetadata();
94
91
  const connectedHost = await fetchConnectedHostStatus(connection);
95
- const connectedHostRecord = isRecord(connectedHost.body) ? connectedHost.body : {};
96
- const connectedHostVersion = readString(connectedHostRecord, 'version') ?? 'unknown';
97
- if (connectedHost.ok && connectedHostVersion !== metadata.sdkVersion) {
92
+ if (connectedHost.ok) {
98
93
  return {
99
94
  ok: false,
100
- kind: 'version_mismatch',
101
- error: `Connected GoodVibes host SDK version ${connectedHostVersion} does not match Agent SDK pin ${metadata.sdkVersion}; Agent Knowledge route is unavailable.`,
95
+ kind: 'connected_host_incompatible',
96
+ error: `Connected GoodVibes host compatibility does not satisfy Agent Knowledge requirements; Agent Knowledge route is unavailable.`,
102
97
  baseUrl: connection.baseUrl,
103
98
  route,
104
- connectedHostVersion,
105
- expectedSdkVersion: metadata.sdkVersion,
106
99
  };
107
100
  }
108
101
  return { ok: false, kind: 'connected_host_route_unavailable', error: message, baseUrl: connection.baseUrl, route };
@@ -1,10 +1,7 @@
1
1
  import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config';
2
2
  import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
3
- import { SDK_VERSION } from '../version.ts';
4
3
  import { readConnectedHostOperatorToken } from '../runtime/connected-host-auth.ts';
5
4
 
6
- type JsonRecord = Record<string, unknown>;
7
-
8
5
  export interface CliExternalRuntimeInspectionOptions {
9
6
  readonly configManager: Pick<ConfigManager, 'get'>;
10
7
  readonly homeDirectory: string;
@@ -15,8 +12,6 @@ export interface CliExternalRuntimeSnapshot {
15
12
  readonly baseUrl: string;
16
13
  readonly statusCode: number | null;
17
14
  readonly reachable: boolean;
18
- readonly version: string;
19
- readonly expectedVersion: string;
20
15
  readonly compatible: boolean;
21
16
  readonly operatorToken: {
22
17
  readonly present: boolean;
@@ -25,21 +20,12 @@ export interface CliExternalRuntimeSnapshot {
25
20
  readonly agentKnowledge: {
26
21
  readonly route: '/api/goodvibes-agent/knowledge/status';
27
22
  readonly ready: boolean;
28
- readonly kind: 'ok' | 'auth_required' | 'connected_host_unavailable' | 'version_mismatch' | 'connected_host_route_unavailable' | 'connected_host_error';
23
+ readonly kind: 'ok' | 'auth_required' | 'connected_host_unavailable' | 'connected_host_incompatible' | 'connected_host_route_unavailable' | 'connected_host_error';
29
24
  readonly statusCode: number | null;
30
25
  };
31
26
  readonly error: string | null;
32
27
  }
33
28
 
34
- function isRecord(value: unknown): value is JsonRecord {
35
- return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
36
- }
37
-
38
- function readString(record: JsonRecord | null, key: string): string | null {
39
- const value = record?.[key];
40
- return typeof value === 'string' ? value : null;
41
- }
42
-
43
29
  function resolveBaseUrl(configManager: Pick<ConfigManager, 'get'>): string {
44
30
  const host = String(configManager.get('controlPlane.host') ?? '127.0.0.1');
45
31
  const port = Number(configManager.get('controlPlane.port') ?? 3421);
@@ -83,17 +69,12 @@ export async function inspectCliExternalRuntime(
83
69
 
84
70
  try {
85
71
  const status = await fetchJson(`${baseUrl}/status`, token.token, timeoutMs);
86
- const statusRecord = isRecord(status.body) ? status.body : {};
87
- const version = readString(statusRecord, 'version') ?? 'unknown';
88
- const compatible = status.ok && version === SDK_VERSION;
89
72
 
90
73
  if (!status.ok) {
91
74
  return {
92
75
  baseUrl,
93
76
  statusCode: status.status,
94
77
  reachable: false,
95
- version,
96
- expectedVersion: SDK_VERSION,
97
78
  compatible: false,
98
79
  operatorToken: { present: Boolean(token.token), path: token.path },
99
80
  agentKnowledge: {
@@ -111,9 +92,7 @@ export async function inspectCliExternalRuntime(
111
92
  baseUrl,
112
93
  statusCode: status.status,
113
94
  reachable: true,
114
- version,
115
- expectedVersion: SDK_VERSION,
116
- compatible,
95
+ compatible: false,
117
96
  operatorToken: { present: false, path: token.path },
118
97
  agentKnowledge: {
119
98
  route,
@@ -125,32 +104,12 @@ export async function inspectCliExternalRuntime(
125
104
  };
126
105
  }
127
106
 
128
- if (!compatible) {
129
- return {
130
- baseUrl,
131
- statusCode: status.status,
132
- reachable: true,
133
- version,
134
- expectedVersion: SDK_VERSION,
135
- compatible: false,
136
- operatorToken: { present: true, path: token.path },
137
- agentKnowledge: {
138
- route,
139
- ready: false,
140
- kind: 'version_mismatch',
141
- statusCode: null,
142
- },
143
- error: null,
144
- };
145
- }
146
-
147
107
  const knowledge = await fetchJson(`${baseUrl}${route}`, token.token, timeoutMs);
108
+ const compatible = knowledge.ok;
148
109
  return {
149
110
  baseUrl,
150
111
  statusCode: status.status,
151
112
  reachable: true,
152
- version,
153
- expectedVersion: SDK_VERSION,
154
113
  compatible,
155
114
  operatorToken: { present: true, path: token.path },
156
115
  agentKnowledge: {
@@ -172,8 +131,6 @@ export async function inspectCliExternalRuntime(
172
131
  baseUrl,
173
132
  statusCode: null,
174
133
  reachable: false,
175
- version: 'unknown',
176
- expectedVersion: SDK_VERSION,
177
134
  compatible: false,
178
135
  operatorToken: { present: Boolean(token.token), path: token.path },
179
136
  agentKnowledge: {
package/src/cli/help.ts CHANGED
@@ -56,7 +56,7 @@ export function renderGoodVibesHelp(binary = 'goodvibes-agent'): string {
56
56
  ' memory Manage Agent-owned durable memory records',
57
57
  ' routines Inspect local routines and explicitly promote one to a connected schedule',
58
58
  ' auth Inspect Agent auth posture and connection token state',
59
- ' compat Inspect Agent SDK pin, connected host version, and Agent Knowledge route readiness',
59
+ ' compat Inspect connected-host compatibility and Agent Knowledge route readiness',
60
60
  ' knowledge Use isolated Agent Knowledge routes',
61
61
  ' ask|search Shortcuts for isolated Agent Knowledge ask/search',
62
62
  ' delegate Explicitly delegate build/fix/review work to GoodVibes TUI',
@@ -296,7 +296,7 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
296
296
  },
297
297
  compat: {
298
298
  usage: ['compat', 'compat --json'],
299
- summary: 'Inspect package SDK pin, live runtime version, and Agent-specific knowledge route readiness.',
299
+ summary: 'Inspect connected-host compatibility and Agent-specific knowledge route readiness.',
300
300
  examples: ['compat', 'compat --json'],
301
301
  },
302
302
  knowledge: {
package/src/cli/status.ts CHANGED
@@ -114,13 +114,13 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
114
114
  });
115
115
  } else if (!options.externalRuntime.compatible) {
116
116
  findings.push({
117
- id: 'external-runtime-version-mismatch',
117
+ id: 'external-runtime-incompatible',
118
118
  area: 'runtime',
119
119
  severity: 'warning',
120
- summary: 'Connected GoodVibes host SDK version does not match Agent.',
121
- cause: `Connected host reports SDK ${options.externalRuntime.version}; Agent expects ${options.externalRuntime.expectedVersion}.`,
122
- impact: 'Agent-only routes, especially isolated Agent Knowledge, may be missing or incompatible.',
123
- action: 'Update the owning GoodVibes host so /status matches this Agent package SDK pin.',
120
+ summary: 'Connected GoodVibes host compatibility does not satisfy Agent readiness.',
121
+ cause: 'Connected host is reachable, but at least one public Agent route is unavailable or incompatible.',
122
+ impact: 'Agent-only routes, especially isolated Agent Knowledge, may be unavailable.',
123
+ action: 'Update the owning GoodVibes host so its public Agent routes are compatible.',
124
124
  });
125
125
  }
126
126
 
@@ -144,7 +144,7 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
144
144
  summary: 'Isolated Agent Knowledge route is not ready.',
145
145
  cause: `${options.externalRuntime.agentKnowledge.route} returned ${options.externalRuntime.agentKnowledge.kind}${options.externalRuntime.agentKnowledge.statusCode === null ? '' : ` (${options.externalRuntime.agentKnowledge.statusCode})`}.`,
146
146
  impact: 'Agent Knowledge ask/search will not use default or non-Agent knowledge fallback; it will fail closed until the Agent route is available.',
147
- action: 'Update the connected GoodVibes host to the Agent-compatible SDK and verify goodvibes-agent compat.',
147
+ action: 'Update the connected GoodVibes host so public Agent routes are compatible, then verify goodvibes-agent compat.',
148
148
  });
149
149
  }
150
150
  }
@@ -283,7 +283,6 @@ export function renderCliStatus(options: CliStatusOptions): string {
283
283
  ...(externalRuntime ? [
284
284
  ` baseUrl: ${externalRuntime.baseUrl}`,
285
285
  ` reachable: ${yesNo(externalRuntime.reachable)}${externalRuntime.statusCode === null ? '' : ` (HTTP ${externalRuntime.statusCode})`}`,
286
- ` sdk: ${externalRuntime.version} expected ${externalRuntime.expectedVersion}`,
287
286
  ` compatible: ${yesNo(externalRuntime.compatible)}`,
288
287
  ` access token: ${externalRuntime.operatorToken.present ? 'present' : 'missing'} (${externalRuntime.operatorToken.path})`,
289
288
  ` Agent Knowledge: ${externalRuntime.agentKnowledge.ready ? 'ready' : `not ready (${formatAgentKnowledgeFailureKind(externalRuntime.agentKnowledge.kind)})`}`,
@@ -3,10 +3,10 @@ import type { AgentWorkspaceCategory } from './agent-workspace-types.ts';
3
3
  export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
4
4
  {
5
5
  id: 'home',
6
- group: 'OPERATE',
6
+ group: 'START',
7
7
  label: 'Home',
8
8
  summary: 'Main operator workspace for normal assistant work.',
9
- detail: 'Use this as the Agent front door: chat in the main conversation, inspect state, choose model/provider, and open setup without switching modes.',
9
+ detail: 'Use this as the primary Agent workspace: chat in the main conversation, inspect state, choose model/provider, and open setup without switching modes.',
10
10
  actions: [
11
11
  { id: 'chat', label: 'Continue assistant chat', detail: 'Return to the main composer and type a normal message. Agent work stays serial in the main conversation.', kind: 'guidance', safety: 'safe' },
12
12
  { id: 'brief', label: 'Operator briefing', detail: 'Show a concise Agent status and next-actions briefing without mutating the connected host.', command: '/brief', kind: 'command', safety: 'read-only' },
@@ -29,13 +29,13 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
29
29
  { id: 'welcome', label: 'Welcome and setup guide', detail: 'Open the Agent setup guide from the workspace.', command: '/welcome', kind: 'command', safety: 'safe' },
30
30
  { id: 'health', label: 'Review health', detail: 'Show local health and connected-host status without starting or mutating anything.', command: '/health review', kind: 'command', safety: 'read-only' },
31
31
  { id: 'doctor', label: 'Doctor diagnostics', detail: 'Run the same Agent doctor diagnostics from the TUI home workspace instead of relying on the CLI.', command: '/doctor', kind: 'command', safety: 'read-only' },
32
- { id: 'compat', label: 'Host compatibility', detail: 'Inspect Agent SDK pin, connected-host version, and isolated Agent Knowledge route readiness from the TUI.', command: '/compat', kind: 'command', safety: 'read-only' },
32
+ { id: 'compat', label: 'Host compatibility', detail: 'Inspect connected-host compatibility and isolated Agent Knowledge route readiness from the TUI.', command: '/compat', kind: 'command', safety: 'read-only' },
33
33
  { id: 'quit', label: 'Quit Agent', detail: 'Exit the TUI and restore terminal state.', command: '/quit', kind: 'command', safety: 'safe' },
34
34
  ],
35
35
  },
36
36
  {
37
37
  id: 'setup',
38
- group: 'SETUP',
38
+ group: 'START',
39
39
  label: 'Setup',
40
40
  summary: 'Configuration, auth, provider, and onboarding workspaces.',
41
41
  detail: 'Use this to configure the assistant: provider/model, setup checklist, Agent Knowledge, local behavior, channels, and voice/media. Changes here stay Agent-owned.',
@@ -53,7 +53,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
53
53
  { id: 'setup-mode-show', label: 'Interaction mode', detail: 'Review current Agent interaction mode and domain verbosity.', command: '/mode show', kind: 'command', safety: 'read-only' },
54
54
  { id: 'setup-mode-preset', label: 'Set interaction mode', detail: 'Open a confirmed form for quiet, balanced, or operator interaction mode.', editorKind: 'mode-preset', kind: 'editor', safety: 'safe' },
55
55
  { id: 'setup-mode-domain', label: 'Set domain verbosity', detail: 'Open a confirmed form for one interaction-domain verbosity override.', editorKind: 'mode-domain', kind: 'editor', safety: 'safe' },
56
- { id: 'setup-compat', label: 'Compatibility', detail: 'Inspect Agent SDK pin, connected host version, and isolated Agent Knowledge route readiness.', command: '/compat', kind: 'command', safety: 'read-only' },
56
+ { id: 'setup-compat', label: 'Compatibility', detail: 'Inspect connected-host compatibility and isolated Agent Knowledge route readiness.', command: '/compat', kind: 'command', safety: 'read-only' },
57
57
  { id: 'setup-agent-knowledge', label: 'Agent Knowledge', detail: 'Open isolated Agent Knowledge status, ask/search, ingest, source review, and reindex actions.', targetCategoryId: 'knowledge', kind: 'workspace', safety: 'safe' },
58
58
  { id: 'setup-runtime-profiles', label: 'Agent profiles', detail: 'Open starter templates, isolated Agent homes, profile defaults, and profile import/export actions.', targetCategoryId: 'profiles', kind: 'workspace', safety: 'safe' },
59
59
  { id: 'setup-profile-from-discovered', label: 'Profile from discovered behavior', detail: 'Create an isolated Agent profile directly from reviewed local persona, skill, and routine files.', editorKind: 'profile-from-discovered', kind: 'editor', safety: 'safe' },
@@ -94,7 +94,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
94
94
  },
95
95
  {
96
96
  id: 'research',
97
- group: 'OPERATE',
97
+ group: 'DAY-TO-DAY',
98
98
  label: 'Research',
99
99
  summary: 'Read-only web research and source triage in the main conversation.',
100
100
  detail: 'Use this workspace to ask Agent to search, inspect URLs, compare sources, and decide what belongs in isolated Agent Knowledge. Research requests run in the normal conversation; source ingestion is explicit.',
@@ -113,7 +113,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
113
113
  },
114
114
  {
115
115
  id: 'artifacts',
116
- group: 'OPERATE',
116
+ group: 'DAY-TO-DAY',
117
117
  label: 'Artifacts',
118
118
  summary: 'Files, attachments, exports, source ingest, and generated media.',
119
119
  detail: 'Use this workspace to handle concrete user-visible artifacts: attach images, export conversations, ingest source files into Agent Knowledge, inspect source libraries, and generate media with explicit confirmation.',
@@ -136,7 +136,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
136
136
  },
137
137
  {
138
138
  id: 'conversation',
139
- group: 'OPERATE',
139
+ group: 'DAY-TO-DAY',
140
140
  label: 'Conversation',
141
141
  summary: 'Transcript, prompt, context, and session controls.',
142
142
  detail: 'Use this workspace for the main TUI conversation: context review, compaction, prompt helpers, transcript navigation, session continuity, title, export, undo, redo, and retry.',
@@ -181,7 +181,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
181
181
  },
182
182
  {
183
183
  id: 'channels',
184
- group: 'SETUP',
184
+ group: 'CAPABILITIES',
185
185
  label: 'Channels',
186
186
  summary: 'Companion pairing, channel posture, and delivery safety.',
187
187
  detail: 'Agent uses connected channel accounts. Pairing, account inspection, and readiness checks are visible here; inbound delivery and public channel exposure stay policy-gated.',
@@ -209,7 +209,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
209
209
  },
210
210
  {
211
211
  id: 'tools',
212
- group: 'SETUP',
212
+ group: 'CAPABILITIES',
213
213
  label: 'Tools & MCP',
214
214
  summary: 'MCP server setup, trust review, and tool inventory.',
215
215
  detail: 'Configure and inspect task tools from the Agent TUI. Adding or changing tools requires typed confirmation; normal chat still chooses tools serially in the main conversation.',
@@ -240,7 +240,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
240
240
  },
241
241
  {
242
242
  id: 'knowledge',
243
- group: 'KNOW',
243
+ group: 'CAPABILITIES',
244
244
  label: 'Knowledge',
245
245
  summary: 'Agent Knowledge and source-backed lookup.',
246
246
  detail: 'Agent knowledge calls use the isolated Agent Knowledge route family only. Default knowledge and non-Agent knowledge segments are not the Agent knowledge environment.',
@@ -276,7 +276,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
276
276
  },
277
277
  {
278
278
  id: 'voice-media',
279
- group: 'SETUP',
279
+ group: 'CAPABILITIES',
280
280
  label: 'Voice & Media',
281
281
  summary: 'Voice, TTS, image input, browser tools, and media providers.',
282
282
  detail: 'Voice, media, browser tools, and image-capable flows are first-class Agent tools. Connected-host administration stays outside Agent and side effects stay explicit.',
@@ -302,7 +302,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
302
302
  },
303
303
  {
304
304
  id: 'profiles',
305
- group: 'SETUP',
305
+ group: 'LOCAL BEHAVIOR',
306
306
  label: 'Profiles',
307
307
  summary: 'Isolated Agent homes, starter templates, and setup bundles.',
308
308
  detail: 'Agent profiles isolate Agent state. Named homes and starter templates let one install behave like separate assistants for household, research, travel, operations, or personal workflows.',
@@ -325,7 +325,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
325
325
  },
326
326
  {
327
327
  id: 'memory',
328
- group: 'LEARN',
328
+ group: 'LOCAL BEHAVIOR',
329
329
  label: 'Memory & Skills',
330
330
  summary: 'Local assistant memory, notes, routines, skills, and reusable behavior.',
331
331
  detail: 'Memory, notes, routines, skills, and personas stay Agent-local until stable shared registry contracts exist. Secrets must not be stored as memory or notes.',
@@ -362,7 +362,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
362
362
  },
363
363
  {
364
364
  id: 'notes',
365
- group: 'LEARN',
365
+ group: 'LOCAL BEHAVIOR',
366
366
  label: 'Notes',
367
367
  summary: 'Agent-local scratchpad for source triage and temporary context.',
368
368
  detail: 'Notes are local working context. They are useful for research notes, decisions in progress, and handoff notes, but they are not memory and are not Agent Knowledge.',
@@ -385,7 +385,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
385
385
  },
386
386
  {
387
387
  id: 'personas',
388
- group: 'LEARN',
388
+ group: 'LOCAL BEHAVIOR',
389
389
  label: 'Personas',
390
390
  summary: 'Local behavior profiles for the main assistant.',
391
391
  detail: 'Personas shape the serial Agent in the main conversation. They are local behavior profiles, not separate Agent identities.',
@@ -408,7 +408,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
408
408
  },
409
409
  {
410
410
  id: 'skills',
411
- group: 'LEARN',
411
+ group: 'LOCAL BEHAVIOR',
412
412
  label: 'Skills',
413
413
  summary: 'Reusable local procedures with setup readiness.',
414
414
  detail: 'Skills are local, reviewable procedures with optional env/command requirements. Enabled skills inform the main conversation; secret-looking content is rejected.',
@@ -443,7 +443,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
443
443
  },
444
444
  {
445
445
  id: 'routines',
446
- group: 'LEARN',
446
+ group: 'LOCAL BEHAVIOR',
447
447
  label: 'Routines',
448
448
  summary: 'Repeatable workflows with setup readiness.',
449
449
  detail: 'Routines run in the main conversation by default and can declare env/command requirements. Promotion to a connected schedule requires a real schedule command and --yes.',
@@ -473,7 +473,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
473
473
  },
474
474
  {
475
475
  id: 'work',
476
- group: 'TRACK',
476
+ group: 'OPERATIONS',
477
477
  label: 'Work & Approvals',
478
478
  summary: 'Visible task state, work plan, and approval posture.',
479
479
  detail: 'Use this workspace to inspect active operator state and update visible work-plan items from confirmed TUI forms.',
@@ -527,9 +527,9 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
527
527
  },
528
528
  {
529
529
  id: 'host',
530
- group: 'WATCH',
530
+ group: 'OPERATIONS',
531
531
  label: 'Connected Host',
532
- summary: 'Connected-host health, tasks, sessions, channels, automation, and control-plane posture.',
532
+ summary: 'Connected-host health, tasks, sessions, channels, and automation.',
533
533
  detail: 'Use this workspace to inspect the GoodVibes host surfaces that Agent can see: system health, remote routes, host tasks, sessions, channels, schedules, knowledge, media, MCP, provider auth, support bundles, and telemetry/config posture.',
534
534
  actions: [
535
535
  { id: 'host-overview', label: 'Host overview', detail: 'Review connected-host, provider, settings, continuity, and Agent health without starting or mutating host work.', command: '/health review', kind: 'command', safety: 'read-only' },
@@ -571,7 +571,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
571
571
  },
572
572
  {
573
573
  id: 'automation',
574
- group: 'WATCH',
574
+ group: 'OPERATIONS',
575
575
  label: 'Automation',
576
576
  summary: 'Reminders, schedule observability, and explicit routine promotion.',
577
577
  detail: 'Agent does not create hidden local automation jobs. Confirmed reminders, reviewed routine promotion, and explicit run/pause/resume controls go through the connected host with confirmation.',
@@ -598,7 +598,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
598
598
  },
599
599
  {
600
600
  id: 'delegate',
601
- group: 'BUILD',
601
+ group: 'OPERATIONS',
602
602
  label: 'Build Delegation',
603
603
  summary: 'Explicit handoff to GoodVibes TUI for code work.',
604
604
  detail: 'Agent does not become the coding TUI. Build, implement, fix, patch, and review work must be handed to GoodVibes TUI with the full original ask and delegated review only when explicitly requested.',
@@ -88,7 +88,7 @@ const AGENT_WORKSPACE_CHANNEL_SPECS: readonly AgentWorkspaceChannelSpec[] = [
88
88
  requiredKeys: ['surfaces.signal.bridgeUrl', 'surfaces.signal.account'],
89
89
  defaultTargetKeys: ['surfaces.signal.defaultRecipient'],
90
90
  risk: 'bridge',
91
- riskLabel: 'private bridge delivery',
91
+ riskLabel: 'private routed delivery',
92
92
  },
93
93
  {
94
94
  id: 'whatsapp',
@@ -119,7 +119,7 @@ const AGENT_WORKSPACE_CHANNEL_SPECS: readonly AgentWorkspaceChannelSpec[] = [
119
119
  requiredKeys: ['surfaces.imessage.bridgeUrl', 'surfaces.imessage.account'],
120
120
  defaultTargetKeys: ['surfaces.imessage.defaultChatId'],
121
121
  risk: 'bridge',
122
- riskLabel: 'Apple bridge delivery',
122
+ riskLabel: 'Apple routed delivery',
123
123
  },
124
124
  {
125
125
  id: 'bluebubbles',
@@ -128,7 +128,7 @@ const AGENT_WORKSPACE_CHANNEL_SPECS: readonly AgentWorkspaceChannelSpec[] = [
128
128
  requiredKeys: ['surfaces.bluebubbles.serverUrl', 'surfaces.bluebubbles.password'],
129
129
  defaultTargetKeys: ['surfaces.bluebubbles.defaultChatGuid'],
130
130
  risk: 'bridge',
131
- riskLabel: 'iMessage bridge delivery',
131
+ riskLabel: 'iMessage routed delivery',
132
132
  },
133
133
  {
134
134
  id: 'msteams',
@@ -149,7 +149,7 @@ export function createAgentWorkspaceOperationsCommandEditor(kind: AgentWorkspace
149
149
  mode: 'update',
150
150
  title: 'Override Planning Strategy',
151
151
  selectedFieldIndex: 0,
152
- message: 'Override the planner strategy through the runtime bridge. This changes planner state and requires typed confirmation.',
152
+ message: 'Override the planner strategy through the runtime route. This changes planner state and requires typed confirmation.',
153
153
  fields: [
154
154
  { id: 'strategy', label: 'Strategy', value: 'serial', required: true, multiline: false, hint: 'Planner strategy, such as serial.' },
155
155
  { id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /plan override with --yes.' },
@@ -153,7 +153,7 @@ export interface CommandProviderServices {
153
153
  }
154
154
 
155
155
  /**
156
- * Compose locally-owned command helpers with the narrower shell bridge-owned
156
+ * Compose locally-owned command helpers with the narrower runtime-owned
157
157
  * runtime surfaces exported from runtime/shell-command-services.ts.
158
158
  */
159
159
  export interface CommandWorkspaceUiServices {
@@ -8,7 +8,7 @@ export function registerCompatRuntimeCommands(registry: CommandRegistry): void {
8
8
  registry.register({
9
9
  name: 'compat',
10
10
  aliases: ['compatibility'],
11
- description: 'Inspect Agent SDK pin, connected host version, and Agent Knowledge route readiness',
11
+ description: 'Inspect connected-host compatibility and Agent Knowledge route readiness',
12
12
  usage: '[--json]',
13
13
  argsHint: '[--json]',
14
14
  async handler(args, ctx) {
@@ -67,7 +67,7 @@ export function registerPlanningRuntimeCommands(registry: CommandRegistry): void
67
67
  }
68
68
  const result = ctx.ops.planRuntime
69
69
  ? ctx.ops.planRuntime(parsed.rest[0] ?? args[0], parsed.rest.slice(1))
70
- : { ok: false, output: 'Plan runtime bridge is not available in this runtime.' };
70
+ : { ok: false, output: 'Plan runtime route is not available in this runtime.' };
71
71
  ctx.print(result.output);
72
72
  return;
73
73
  }
@@ -31,7 +31,7 @@ import type {
31
31
 
32
32
  function requireContextValue<T>(value: T | null | undefined, name: string): T {
33
33
  if (value == null) {
34
- throw new Error(`commandContext.${name} is unavailable in this Agent runtime`);
34
+ throw new Error(`Required Agent runtime service "${name}" is unavailable in this runtime`);
35
35
  }
36
36
  return value;
37
37
  }
@@ -266,7 +266,7 @@ export class McpWorkspace {
266
266
  { type: 'action', id: 'add', label: 'Add or update server', detail: `Open a confirmed Agent workspace form to save an MCP server in ${this.form.scope} scope.` },
267
267
  { type: 'action', id: 'reload', label: 'Reload runtime', detail: 'Confirm an MCP runtime reload from this workspace after external config edits.' },
268
268
  { type: 'action', id: 'refresh-tools', label: 'Refresh tools', detail: 'Fetch the currently available MCP tool list from connected servers.' },
269
- { type: 'action', id: 'config', label: 'Config locations', detail: 'Show SDK-scanned config files and writable project/global paths.' },
269
+ { type: 'action', id: 'config', label: 'Config locations', detail: 'Show detected config files and writable project/global paths.' },
270
270
  ];
271
271
  }
272
272
 
@@ -43,7 +43,7 @@ export function routeSubmissionIntent(input: SubmissionRouterInput): SubmissionI
43
43
  return { kind: 'plan', label: 'plan', commandName, hasAttachments };
44
44
  }
45
45
  if (DELEGATION_COMMANDS.has(commandName)) {
46
- return { kind: 'delegation', label: 'TUI delegation', commandName, hasAttachments };
46
+ return { kind: 'delegation', label: 'delegation', commandName, hasAttachments };
47
47
  }
48
48
  if (PANEL_COMMANDS.has(commandName)) {
49
49
  return { kind: 'slash-command', label: 'Agent workspace', commandName, hasAttachments };