@pellux/goodvibes-agent 0.1.116 → 0.1.117

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 (168) hide show
  1. package/CHANGELOG.md +41 -663
  2. package/README.md +38 -52
  3. package/dist/package/main.js +37826 -35924
  4. package/docs/README.md +5 -4
  5. package/docs/{connected-services.md → connected-host.md} +18 -10
  6. package/docs/getting-started.md +41 -44
  7. package/docs/release-and-publishing.md +6 -4
  8. package/package.json +3 -3
  9. package/src/agent/behavior-discovery-summary.ts +1 -3
  10. package/src/agent/persona-discovery.ts +1 -3
  11. package/src/agent/persona-registry.ts +5 -3
  12. package/src/agent/reminder-schedule-format.ts +6 -6
  13. package/src/agent/reminder-schedule.ts +1 -1
  14. package/src/agent/routine-registry.ts +43 -4
  15. package/src/agent/routine-schedule-format.ts +6 -6
  16. package/src/agent/routine-schedule-promotion.ts +1 -1
  17. package/src/agent/routine-schedule-receipts.ts +1 -1
  18. package/src/agent/runtime-profile-starters.ts +3 -3
  19. package/src/agent/runtime-profile.ts +78 -0
  20. package/src/agent/skill-registry.ts +190 -13
  21. package/src/cli/agent-knowledge-command.ts +2 -2
  22. package/src/cli/agent-knowledge-format.ts +2 -2
  23. package/src/cli/agent-knowledge-runtime.ts +1 -1
  24. package/src/cli/bundle-command.ts +1 -1
  25. package/src/cli/entrypoint.ts +16 -7
  26. package/src/cli/help.ts +26 -19
  27. package/src/cli/local-library-command.ts +75 -21
  28. package/src/cli/management-commands.ts +7 -6
  29. package/src/cli/management.ts +6 -51
  30. package/src/cli/parser.ts +23 -2
  31. package/src/cli/profiles-command.ts +119 -1
  32. package/src/cli/routines-command.ts +139 -11
  33. package/src/cli/service-posture.ts +11 -11
  34. package/src/cli/status.ts +21 -25
  35. package/src/input/agent-workspace-access-command-editor-submission.ts +149 -0
  36. package/src/input/agent-workspace-access-command-editors.ts +170 -0
  37. package/src/input/agent-workspace-activation.ts +2 -1
  38. package/src/input/agent-workspace-basic-command-editor-submission.ts +345 -92
  39. package/src/input/agent-workspace-basic-command-editors.ts +480 -7
  40. package/src/input/agent-workspace-categories.ts +175 -15
  41. package/src/input/agent-workspace-channel-command-editor-submission.ts +49 -0
  42. package/src/input/agent-workspace-channel-command-editors.ts +47 -0
  43. package/src/input/agent-workspace-command-editor.ts +23 -1
  44. package/src/input/agent-workspace-delegation-editor-submission.ts +55 -0
  45. package/src/input/agent-workspace-editors.ts +27 -0
  46. package/src/input/agent-workspace-knowledge-command-editor-submission.ts +132 -0
  47. package/src/input/agent-workspace-knowledge-command-editors.ts +110 -0
  48. package/src/input/agent-workspace-learned-behavior.ts +67 -0
  49. package/src/input/agent-workspace-library-command-editor-submission.ts +50 -0
  50. package/src/input/agent-workspace-library-command-editors.ts +35 -0
  51. package/src/input/agent-workspace-mcp-command-editor-submission.ts +95 -0
  52. package/src/input/agent-workspace-memory-command-editor-submission.ts +232 -0
  53. package/src/input/agent-workspace-memory-command-editors.ts +180 -0
  54. package/src/input/agent-workspace-navigation.ts +45 -0
  55. package/src/input/agent-workspace-notify-editor-submission.ts +107 -0
  56. package/src/input/agent-workspace-operations-command-editor-submission.ts +146 -0
  57. package/src/input/agent-workspace-operations-command-editors.ts +119 -0
  58. package/src/input/agent-workspace-provider-command-editor-submission.ts +155 -0
  59. package/src/input/agent-workspace-provider-command-editors.ts +93 -0
  60. package/src/input/agent-workspace-requirements.ts +11 -0
  61. package/src/input/agent-workspace-secret-editor-submission.ts +153 -0
  62. package/src/input/agent-workspace-session-command-editor-submission.ts +199 -0
  63. package/src/input/agent-workspace-session-command-editors.ts +249 -0
  64. package/src/input/agent-workspace-setup.ts +24 -14
  65. package/src/input/agent-workspace-skill-bundle-command-editor-submission.ts +101 -0
  66. package/src/input/agent-workspace-skill-bundle-command-editors.ts +110 -0
  67. package/src/input/agent-workspace-snapshot.ts +50 -8
  68. package/src/input/agent-workspace-task-command-editor-submission.ts +61 -0
  69. package/src/input/agent-workspace-task-command-editors.ts +47 -0
  70. package/src/input/agent-workspace-types.ts +120 -0
  71. package/src/input/agent-workspace-voice-media.ts +1 -1
  72. package/src/input/agent-workspace-workplan-editor-submission.ts +153 -0
  73. package/src/input/agent-workspace.ts +47 -37
  74. package/src/input/command-registry.ts +1 -1
  75. package/src/input/commands/agent-runtime-profile-runtime.ts +89 -4
  76. package/src/input/commands/agent-skills-runtime.ts +76 -12
  77. package/src/input/commands/agent-workspace-runtime.ts +4 -3
  78. package/src/input/commands/brief-runtime.ts +38 -9
  79. package/src/input/commands/channels-runtime.ts +3 -3
  80. package/src/input/commands/compat-runtime.ts +32 -0
  81. package/src/input/commands/health-runtime.ts +22 -24
  82. package/src/input/commands/knowledge.ts +26 -5
  83. package/src/input/commands/local-provider-runtime.ts +7 -3
  84. package/src/input/commands/local-setup-review.ts +4 -14
  85. package/src/input/commands/mcp-runtime.ts +8 -12
  86. package/src/input/commands/operator-runtime.ts +8 -67
  87. package/src/input/commands/personas-runtime.ts +1 -1
  88. package/src/input/commands/platform-access-runtime.ts +7 -70
  89. package/src/input/commands/policy-dispatch.ts +1 -1
  90. package/src/input/commands/policy.ts +1 -5
  91. package/src/input/commands/product-runtime.ts +2 -2
  92. package/src/input/commands/qrcode-runtime.ts +6 -4
  93. package/src/input/commands/routines-runtime.ts +44 -6
  94. package/src/input/commands/runtime-services.ts +1 -14
  95. package/src/input/commands/security-runtime.ts +3 -8
  96. package/src/input/commands/session-content.ts +1 -1
  97. package/src/input/commands/session-workflow.ts +5 -14
  98. package/src/input/commands/shell-core.ts +8 -2
  99. package/src/input/commands/subscription-runtime.ts +1 -6
  100. package/src/input/commands/support-bundle-runtime.ts +53 -0
  101. package/src/input/commands/tasks-runtime.ts +2 -2
  102. package/src/input/commands.ts +4 -0
  103. package/src/input/feed-context-factory.ts +0 -1
  104. package/src/input/handler-content-actions.ts +0 -25
  105. package/src/input/handler-feed.ts +0 -2
  106. package/src/input/handler-interactions.ts +2 -31
  107. package/src/input/handler-onboarding.ts +29 -12
  108. package/src/input/handler-shortcuts.ts +1 -3
  109. package/src/input/handler.ts +4 -7
  110. package/src/input/keybindings.ts +9 -9
  111. package/src/input/mcp-workspace.ts +90 -26
  112. package/src/input/onboarding/handler-onboarding-routes.ts +3 -1
  113. package/src/input/onboarding/onboarding-wizard-apply.ts +49 -0
  114. package/src/input/onboarding/onboarding-wizard-helpers.ts +1 -1
  115. package/src/input/onboarding/onboarding-wizard-operator-steps.ts +81 -3
  116. package/src/input/onboarding/onboarding-wizard-steps.ts +14 -7
  117. package/src/input/onboarding/onboarding-wizard-types.ts +1 -0
  118. package/src/input/onboarding/onboarding-wizard.ts +19 -2
  119. package/src/input/profile-picker-modal.ts +2 -2
  120. package/src/input/settings-modal-agent-policy.ts +6 -6
  121. package/src/input/settings-modal-subscriptions.ts +3 -3
  122. package/src/input/settings-modal.ts +14 -14
  123. package/src/main.ts +0 -2
  124. package/src/panels/automation-control-panel.ts +3 -3
  125. package/src/panels/builtin/agent.ts +1 -1
  126. package/src/panels/builtin/operations.ts +2 -2
  127. package/src/panels/builtin/session.ts +26 -18
  128. package/src/panels/builtin/shared.ts +6 -6
  129. package/src/panels/project-planning-panel.ts +1 -1
  130. package/src/panels/provider-health-domains.ts +3 -3
  131. package/src/panels/qr-panel.ts +44 -20
  132. package/src/panels/subscription-panel.ts +3 -3
  133. package/src/panels/system-messages-panel.ts +2 -2
  134. package/src/panels/tasks-panel.ts +4 -4
  135. package/src/planning/project-planning-coordinator.ts +2 -2
  136. package/src/renderer/agent-workspace.ts +26 -5
  137. package/src/renderer/block-actions.ts +1 -3
  138. package/src/renderer/help-overlay.ts +13 -8
  139. package/src/renderer/mcp-workspace.ts +32 -13
  140. package/src/renderer/model-picker-overlay.ts +0 -1
  141. package/src/renderer/model-workspace.ts +0 -2
  142. package/src/renderer/onboarding/onboarding-wizard.ts +20 -4
  143. package/src/renderer/panel-picker-overlay.ts +1 -1
  144. package/src/renderer/profile-picker-modal.ts +2 -2
  145. package/src/renderer/settings-modal-helpers.ts +23 -23
  146. package/src/renderer/settings-modal.ts +18 -18
  147. package/src/renderer/system-message.ts +1 -1
  148. package/src/runtime/agent-runtime-events.ts +129 -0
  149. package/src/runtime/bootstrap-command-parts.ts +3 -2
  150. package/src/runtime/bootstrap-core.ts +4 -64
  151. package/src/runtime/bootstrap-shell.ts +42 -4
  152. package/src/runtime/bootstrap.ts +8 -27
  153. package/src/runtime/connected-host-auth.ts +42 -0
  154. package/src/runtime/diagnostics/panels/panel-resources.ts +1 -1
  155. package/src/runtime/index.ts +1 -5
  156. package/src/runtime/onboarding/apply.ts +213 -0
  157. package/src/runtime/onboarding/derivation.ts +5 -5
  158. package/src/runtime/onboarding/snapshot.ts +2 -2
  159. package/src/runtime/onboarding/types.ts +26 -1
  160. package/src/runtime/onboarding/verify.ts +81 -2
  161. package/src/runtime/operator-token-cleanup.ts +2 -2
  162. package/src/runtime/services.ts +27 -12
  163. package/src/shell/service-settings-sync.ts +7 -7
  164. package/src/shell/ui-openers.ts +27 -38
  165. package/src/tools/agent-local-registry-tool.ts +10 -4
  166. package/src/tools/agent-tool-policy-guard.ts +5 -7
  167. package/src/version.ts +1 -1
  168. package/src/cli/package-verification.ts +0 -274
@@ -1,7 +1,10 @@
1
1
  import { existsSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  import { isSecretRefInput } from '@pellux/goodvibes-sdk/platform/config';
4
- import { resolveAgentRuntimeProfileHome } from '../../agent/runtime-profile.ts';
4
+ import { AgentPersonaRegistry } from '../../agent/persona-registry.ts';
5
+ import { AgentRoutineRegistry } from '../../agent/routine-registry.ts';
6
+ import { readAgentRuntimeProfileSelection, resolveAgentRuntimeProfileHome } from '../../agent/runtime-profile.ts';
7
+ import { AgentSkillRegistry } from '../../agent/skill-registry.ts';
5
8
  import { readOnboardingRuntimeState } from './state.ts';
6
9
  import type {
7
10
  OnboardingApplyOperation,
@@ -144,6 +147,78 @@ function verifyCreateAgentProfileOperation(
144
147
  };
145
148
  }
146
149
 
150
+ function verifySelectAgentProfileOperation(
151
+ deps: OnboardingVerificationDependencies,
152
+ operation: Extract<OnboardingApplyOperation, { kind: 'select-agent-profile' }>,
153
+ ): OnboardingVerificationItem {
154
+ const resolution = resolveAgentRuntimeProfileHome(deps.shellPaths.homeDirectory, operation.name);
155
+ const selection = readAgentRuntimeProfileSelection(deps.shellPaths.homeDirectory);
156
+ const ok = selection?.id === resolution.id && selection.exists;
157
+ return {
158
+ id: `selected-agent-profile:${resolution.id}`,
159
+ status: ok ? 'pass' : 'fail',
160
+ message: ok
161
+ ? `${resolution.id} Agent profile is selected for future launches.`
162
+ : `${resolution.id} Agent profile is not selected for future launches.`,
163
+ target: resolution.id,
164
+ };
165
+ }
166
+
167
+ function verifyCreateLocalPersonaOperation(
168
+ deps: OnboardingVerificationDependencies,
169
+ operation: Extract<OnboardingApplyOperation, { kind: 'create-local-persona' }>,
170
+ ): OnboardingVerificationItem {
171
+ const registry = AgentPersonaRegistry.fromShellPaths(deps.shellPaths);
172
+ const persona = registry.get(operation.name);
173
+ const activeOk = operation.activate === false || registry.snapshot().activePersonaId === persona?.id;
174
+ const ok = persona !== null && activeOk;
175
+ const target = persona?.id ?? operation.name.trim();
176
+ return {
177
+ id: `local-persona:${target}`,
178
+ status: ok ? 'pass' : 'fail',
179
+ message: ok
180
+ ? `${target} local Agent persona exists${operation.activate === false ? '' : ' and is active'}.`
181
+ : `${target} local Agent persona was not created${operation.activate === false ? '' : ' or activated'}.`,
182
+ target,
183
+ };
184
+ }
185
+
186
+ function verifyCreateLocalSkillOperation(
187
+ deps: OnboardingVerificationDependencies,
188
+ operation: Extract<OnboardingApplyOperation, { kind: 'create-local-skill' }>,
189
+ ): OnboardingVerificationItem {
190
+ const skill = AgentSkillRegistry.fromShellPaths(deps.shellPaths).get(operation.name);
191
+ const enabledOk = operation.enabled === false || skill?.enabled === true;
192
+ const ok = skill !== null && enabledOk;
193
+ const target = skill?.id ?? operation.name.trim();
194
+ return {
195
+ id: `local-skill:${target}`,
196
+ status: ok ? 'pass' : 'fail',
197
+ message: ok
198
+ ? `${target} local Agent skill exists${operation.enabled === false ? '' : ' and is enabled'}.`
199
+ : `${target} local Agent skill was not created${operation.enabled === false ? '' : ' or enabled'}.`,
200
+ target,
201
+ };
202
+ }
203
+
204
+ function verifyCreateLocalRoutineOperation(
205
+ deps: OnboardingVerificationDependencies,
206
+ operation: Extract<OnboardingApplyOperation, { kind: 'create-local-routine' }>,
207
+ ): OnboardingVerificationItem {
208
+ const routine = AgentRoutineRegistry.fromShellPaths(deps.shellPaths).get(operation.name);
209
+ const enabledOk = operation.enabled === false || routine?.enabled === true;
210
+ const ok = routine !== null && enabledOk;
211
+ const target = routine?.id ?? operation.name.trim();
212
+ return {
213
+ id: `local-routine:${target}`,
214
+ status: ok ? 'pass' : 'fail',
215
+ message: ok
216
+ ? `${target} local Agent routine exists${operation.enabled === false ? '' : ' and is enabled'}.`
217
+ : `${target} local Agent routine was not created${operation.enabled === false ? '' : ' or enabled'}.`,
218
+ target,
219
+ };
220
+ }
221
+
147
222
  async function verifyOperation(
148
223
  deps: OnboardingVerificationDependencies,
149
224
  operation: OnboardingApplyOperation,
@@ -152,7 +227,11 @@ async function verifyOperation(
152
227
  if (operation.kind === 'set-secret') return verifySecretOperation(deps, operation);
153
228
  if (operation.kind === 'ensure-auth-user') return verifyAuthOperation(deps, operation);
154
229
  if (operation.kind === 'acknowledge') return verifyAcknowledgementOperation(deps, operation);
155
- return verifyCreateAgentProfileOperation(deps, operation);
230
+ if (operation.kind === 'create-agent-profile') return verifyCreateAgentProfileOperation(deps, operation);
231
+ if (operation.kind === 'select-agent-profile') return verifySelectAgentProfileOperation(deps, operation);
232
+ if (operation.kind === 'create-local-persona') return verifyCreateLocalPersonaOperation(deps, operation);
233
+ if (operation.kind === 'create-local-skill') return verifyCreateLocalSkillOperation(deps, operation);
234
+ return verifyCreateLocalRoutineOperation(deps, operation);
156
235
  }
157
236
 
158
237
  export async function verifyOnboardingRequest(
@@ -4,10 +4,10 @@
4
4
  * Shared helper that enumerates the legacy workspace-scoped `operator-tokens.json`
5
5
  * locations earlier GoodVibes builds may have written. Used by the in-process
6
6
  * bootstrap path so stale-token pruning has a single source of truth for where
7
- * to look. GoodVibes Agent itself does not own daemon startup.
7
+ * to look. GoodVibes Agent itself does not own connected-host startup.
8
8
  *
9
9
  * Adding a new legacy location: append to `workspaceOperatorTokenCandidates` and
10
- * the new path will be inspected on the next daemon boot.
10
+ * the new path will be inspected on the next connected-host boot.
11
11
  */
12
12
 
13
13
  import { join } from 'node:path';
@@ -23,7 +23,7 @@ import { MediaProviderRegistry, ensureBuiltinMediaProviders } from '@pellux/good
23
23
  import { MultimodalService } from '@pellux/goodvibes-sdk/platform/multimodal';
24
24
  import { AgentManager } from '@pellux/goodvibes-sdk/platform/tools';
25
25
  import { AgentMessageBus } from '@pellux/goodvibes-sdk/platform/agents';
26
- import { WrfcController } from '@pellux/goodvibes-sdk/platform/agents';
26
+ import type { WrfcController } from '@pellux/goodvibes-sdk/platform/agents';
27
27
  import { AgentOrchestrator } from '@pellux/goodvibes-sdk/platform/agents';
28
28
  import { ArchetypeLoader } from '@pellux/goodvibes-sdk/platform/agents';
29
29
  import { ProcessManager } from '@pellux/goodvibes-sdk/platform/tools';
@@ -73,7 +73,7 @@ import { IdempotencyStore } from '@/runtime/index.ts';
73
73
  import { OverflowHandler } from '@pellux/goodvibes-sdk/platform/tools';
74
74
  import { ToolLLM } from '@pellux/goodvibes-sdk/platform/config';
75
75
  import { ComponentHealthMonitor } from '@/runtime/index.ts';
76
- import { WorktreeRegistry } from '@/runtime/index.ts';
76
+ import type { WorktreeRegistry } from '@/runtime/index.ts';
77
77
  import { SandboxSessionRegistry } from '@/runtime/index.ts';
78
78
  import { createShellPathService, type ShellPathService } from '@/runtime/index.ts';
79
79
  import { GOODVIBES_AGENT_SURFACE_ROOT } from '../config/surface.ts';
@@ -101,7 +101,7 @@ function buildFallbackModelDefinition(provider: string, modelId: string): ModelD
101
101
  description: 'Configured model available before the model catalog cache has loaded.',
102
102
  capabilities: {
103
103
  toolCalling: true,
104
- codeEditing: true,
104
+ codeEditing: false,
105
105
  reasoning: isReasoningProvider,
106
106
  multimodal: isReasoningProvider,
107
107
  },
@@ -113,6 +113,24 @@ function buildFallbackModelDefinition(provider: string, modelId: string): ModelD
113
113
  };
114
114
  }
115
115
 
116
+ function createDisabledAgentWorktreeRegistry(): WorktreeRegistry {
117
+ const registry: Pick<WorktreeRegistry, 'list' | 'attach' | 'setState' | 'cleanup'> = {
118
+ async list() {
119
+ return [];
120
+ },
121
+ attach(_path, _target) {
122
+ throw new Error('GoodVibes Agent does not own local worktree attachment. Delegate build, fix, and review work to GoodVibes TUI.');
123
+ },
124
+ setState(_path, _state) {
125
+ throw new Error('GoodVibes Agent does not own local worktree state. Delegate build, fix, and review work to GoodVibes TUI.');
126
+ },
127
+ async cleanup(_path) {
128
+ throw new Error('GoodVibes Agent does not own local worktree cleanup. Delegate build, fix, and review work to GoodVibes TUI.');
129
+ },
130
+ };
131
+ return registry as unknown as WorktreeRegistry;
132
+ }
133
+
116
134
  function ensureConfiguredModelIsRoutable(providerRegistry: ProviderRegistry, configManager: ConfigManager): void {
117
135
  const configuredModel = String(configManager.get('provider.model') ?? '').trim();
118
136
  if (!configuredModel.includes(':')) return;
@@ -335,7 +353,7 @@ export interface RuntimeServices {
335
353
  readonly agentManager: AgentManager;
336
354
  readonly agentMessageBus: AgentMessageBus;
337
355
  readonly agentOrchestrator: AgentOrchestrator;
338
- readonly wrfcController: WrfcController;
356
+ readonly wrfcController: Pick<WrfcController, 'listChains'>;
339
357
  readonly processManager: ProcessManager;
340
358
  readonly modeManager: ModeManager;
341
359
  readonly fileUndoManager: FileUndoManager;
@@ -345,7 +363,7 @@ export interface RuntimeServices {
345
363
  * Agent memory is home/profile-owned and intentionally does not move on workspace swap.
346
364
  * Called by WorkspaceSwapManager after the new directory has been verified.
347
365
  * Stores that require a process restart emit a warn-level log; they continue serving
348
- * the old path until the daemon restarts with the new --working-dir.
366
+ * the old path until the externally owned GoodVibes host restarts with the new --working-dir.
349
367
  */
350
368
  rerootStores(newWorkingDir: string): Promise<void>;
351
369
  }
@@ -443,12 +461,9 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
443
461
  configManager,
444
462
  });
445
463
  agentManager.setRuntimeBus(options.runtimeBus);
446
- const wrfcController = new WrfcController(options.runtimeBus, agentMessageBus, {
447
- agentManager,
448
- configManager,
449
- projectRoot: workingDirectory,
450
- });
451
- agentManager.setWrfcController(wrfcController);
464
+ const wrfcController: Pick<WrfcController, 'listChains'> = {
465
+ listChains: () => [],
466
+ };
452
467
  const hookDispatcher = new HookDispatcher({ toolLLM, projectRoot: workingDirectory }, hookActivityTracker);
453
468
  configManager.attachHookDispatcher(hookDispatcher);
454
469
  const hookWorkbench = createHookWorkbench({
@@ -578,7 +593,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
578
593
  mcpRegistry.setSandboxRuntime(configManager, sandboxSessionRegistry);
579
594
  const tokenAuditor = new ApiTokenAuditor({ managed: false });
580
595
  const componentHealthMonitor = new ComponentHealthMonitor();
581
- const worktreeRegistry = new WorktreeRegistry(workingDirectory);
596
+ const worktreeRegistry = createDisabledAgentWorktreeRegistry();
582
597
  const webhookNotifier = new WebhookNotifier();
583
598
  const replayEngine = new DeterministicReplayEngine(workingDirectory);
584
599
  const providerOptimizer = new ProviderOptimizer(providerRegistry, providerCapabilityRegistry, false);
@@ -1,7 +1,7 @@
1
1
  import type { ConfigKey } from '@pellux/goodvibes-sdk/platform/config';
2
2
  import type { CliServiceRuntime } from '../cli/service-posture.ts';
3
3
 
4
- export const AGENT_EXTERNAL_DAEMON_SERVICE_MESSAGE = 'GoodVibes Agent uses connected GoodVibes services and does not install, start, stop, restart, or uninstall them. Manage service lifecycle outside Agent.';
4
+ export const AGENT_EXTERNAL_HOST_SERVICE_MESSAGE = 'GoodVibes Agent uses a connected GoodVibes host and does not install, start, stop, restart, or uninstall it. Manage host lifecycle outside Agent.';
5
5
 
6
6
  export interface ServiceSettingsSyncChange {
7
7
  readonly key: ConfigKey;
@@ -11,13 +11,13 @@ export interface ServiceSettingsSyncChange {
11
11
 
12
12
  export interface ServiceSettingsSyncResult {
13
13
  readonly handled: boolean;
14
- readonly action?: 'external-daemon-blocked' | 'unchanged';
14
+ readonly action?: 'connected-host-blocked' | 'unchanged';
15
15
  readonly message?: string;
16
16
  readonly error?: string;
17
17
  }
18
18
 
19
19
  export interface ServiceSettingsSyncOptions {
20
- readonly allowExternalDaemonMutation?: false;
20
+ readonly allowExternalHostMutation?: false;
21
21
  }
22
22
 
23
23
  export function syncServiceSettingToPlatform(
@@ -30,15 +30,15 @@ export function syncServiceSettingToPlatform(
30
30
  return {
31
31
  handled: true,
32
32
  action: 'unchanged',
33
- message: 'External daemon service setting unchanged',
33
+ message: 'Connected-host setting unchanged',
34
34
  };
35
35
  }
36
36
 
37
37
  runtime.configManager.setDynamic(change.key, change.previousValue);
38
38
  return {
39
39
  handled: true,
40
- action: 'external-daemon-blocked',
41
- message: AGENT_EXTERNAL_DAEMON_SERVICE_MESSAGE,
42
- error: 'daemon_lifecycle_external',
40
+ action: 'connected-host-blocked',
41
+ message: AGENT_EXTERNAL_HOST_SERVICE_MESSAGE,
42
+ error: 'connected_host_lifecycle_external',
43
43
  };
44
44
  }
@@ -78,6 +78,17 @@ function buildConfiguredViaMap(
78
78
  return map;
79
79
  }
80
80
 
81
+ function agentWorkspaceCategoryForPanel(panelId: string): string {
82
+ if (panelId === 'knowledge') return 'knowledge';
83
+ if (panelId === 'memory') return 'memory';
84
+ if (panelId === 'work-plan' || panelId === 'tasks' || panelId === 'approval') return 'work';
85
+ if (panelId === 'automation' || panelId === 'schedule') return 'automation';
86
+ if (panelId === 'provider-health' || panelId === 'providers' || panelId === 'accounts' || panelId === 'subscription') return 'setup';
87
+ if (panelId === 'security' || panelId === 'policy') return 'tools';
88
+ if (panelId === 'qr-code') return 'channels';
89
+ return 'home';
90
+ }
91
+
81
92
  export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
82
93
  const {
83
94
  commandContext,
@@ -284,8 +295,8 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
284
295
  render();
285
296
  };
286
297
 
287
- commandContext.openAgentWorkspace = () => {
288
- input.openAgentWorkspace(commandContext);
298
+ commandContext.openAgentWorkspace = (categoryId?: string) => {
299
+ input.openAgentWorkspace(commandContext, categoryId);
289
300
  render();
290
301
  };
291
302
 
@@ -296,42 +307,18 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
296
307
  };
297
308
 
298
309
  commandContext.openPanelPicker = () => {
299
- if (!panelManager.isVisible()) {
300
- if (panelManager.getAllOpen().length === 0) {
301
- try {
302
- panelManager.open('panel-list');
303
- } catch {
304
- // non-fatal
305
- }
306
- }
307
- panelManager.show();
308
- input.panelFocused = true;
309
- conversation.setSplashSuppressed(true);
310
- conversation.rebuildHistory();
311
- } else if (!input.panelFocused) {
312
- if (panelManager.getAllOpen().length === 0) {
313
- try {
314
- panelManager.open('panel-list');
315
- } catch {
316
- // non-fatal
317
- }
318
- }
319
- panelManager.show();
320
- input.panelFocused = true;
321
- conversation.setSplashSuppressed(true);
322
- conversation.rebuildHistory();
323
- } else {
324
- panelManager.hide();
325
- input.panelFocused = false;
326
- conversation.setSplashSuppressed(false);
327
- conversation.rebuildHistory();
328
- }
310
+ panelManager.hide();
311
+ input.panelFocused = false;
312
+ conversation.setSplashSuppressed(false);
313
+ conversation.log('Panel picker is deferred in GoodVibes Agent. Opening the Agent operator workspace instead.', { fg: '214' });
314
+ input.openAgentWorkspace(commandContext, 'home');
315
+ conversation.rebuildHistory();
329
316
  render();
330
317
  };
331
318
 
332
319
  commandContext.focusPanels = () => {
333
- if (!panelManager.isVisible() || panelManager.getAllOpen().length === 0) return;
334
- input.panelFocused = true;
320
+ input.panelFocused = false;
321
+ input.openAgentWorkspace(commandContext, 'home');
335
322
  render();
336
323
  };
337
324
 
@@ -342,10 +329,12 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
342
329
  };
343
330
 
344
331
  commandContext.showPanel = (panelId, pane) => {
345
- panelManager.open(panelId, pane);
346
- panelManager.show();
347
- input.panelFocused = true;
348
- conversation.setSplashSuppressed(true);
332
+ void pane;
333
+ panelManager.hide();
334
+ input.panelFocused = false;
335
+ conversation.setSplashSuppressed(false);
336
+ conversation.log(`Panel "${panelId}" is not part of the Agent front door yet. Opening the matching Agent workspace.`, { fg: '214' });
337
+ input.openAgentWorkspace(commandContext, agentWorkspaceCategoryForPanel(panelId));
349
338
  conversation.rebuildHistory();
350
339
  render();
351
340
  };
@@ -137,6 +137,12 @@ function requireDescription(args: AgentLocalRegistryToolArgs): string {
137
137
  return description;
138
138
  }
139
139
 
140
+ function requireTextField(value: unknown, fieldName: string): string {
141
+ const text = readString(value);
142
+ if (!text) throw new Error(`${fieldName} is required.`);
143
+ return text;
144
+ }
145
+
140
146
  function requireSummary(args: AgentLocalRegistryToolArgs): string {
141
147
  const summary = readString(args.summary || args.description);
142
148
  if (!summary) throw new Error('summary is required.');
@@ -299,7 +305,7 @@ function handlePersona(shellPaths: ShellPathService, action: AgentLocalRegistryA
299
305
  const persona = registry.create({
300
306
  name: requireName(args),
301
307
  description: requireDescription(args),
302
- body: readString(args.body),
308
+ body: requireTextField(args.body, 'body'),
303
309
  tags: readStringList(args.tags),
304
310
  triggers: readStringList(args.triggers),
305
311
  source: 'agent',
@@ -350,7 +356,7 @@ function handleSkill(shellPaths: ShellPathService, action: AgentLocalRegistryAct
350
356
  const skill = registry.create({
351
357
  name: requireName(args),
352
358
  description: requireDescription(args),
353
- procedure: readString(args.procedure),
359
+ procedure: requireTextField(args.procedure, 'procedure'),
354
360
  triggers: readStringList(args.triggers),
355
361
  tags: readStringList(args.tags),
356
362
  enabled: args.enabled === true,
@@ -441,7 +447,7 @@ function handleRoutine(shellPaths: ShellPathService, action: AgentLocalRegistryA
441
447
  const routine = registry.create({
442
448
  name: requireName(args),
443
449
  description: requireDescription(args),
444
- steps: readString(args.steps),
450
+ steps: requireTextField(args.steps, 'steps'),
445
451
  triggers: readStringList(args.triggers),
446
452
  tags: readStringList(args.tags),
447
453
  enabled: args.enabled === true,
@@ -469,7 +475,7 @@ function handleRoutine(shellPaths: ShellPathService, action: AgentLocalRegistryA
469
475
  const routine = registry.markStarted(requireId(args));
470
476
  return [
471
477
  `Started Agent-local routine ${routine.id}: ${routine.name}`,
472
- 'Policy: same main conversation; no hidden background job, daemon mutation, or external side effect was started.',
478
+ 'Policy: same main conversation; no hidden background job, connected-host mutation, or external side effect was started.',
473
479
  '',
474
480
  routine.steps,
475
481
  ].join('\n');
@@ -83,8 +83,6 @@ const READ_ONLY_AGENT_TOOL_MODES = [
83
83
  'templates',
84
84
  'get',
85
85
  'budget',
86
- 'wrfc-chains',
87
- 'wrfc-history',
88
86
  'cohort-status',
89
87
  'cohort-report',
90
88
  ] as const;
@@ -174,7 +172,7 @@ const STATE_MUTATION_DENIAL = [
174
172
  const SETTINGS_MUTATION_DENIAL = [
175
173
  'GoodVibes Agent does not mutate configuration through model tools in the main conversation.',
176
174
  'Use explicit Agent CLI/slash settings commands for intentional config changes.',
177
- 'Secrets, tokens, passwords, daemon lifecycle settings, and service exposure settings require explicit user action outside the model tool surface.',
175
+ 'Secrets, tokens, passwords, connected-host lifecycle settings, and connected-host exposure settings require explicit user action outside the model tool surface.',
178
176
  ].join(' ');
179
177
 
180
178
  const INSPECT_WRITE_DENIAL = [
@@ -191,8 +189,8 @@ const DURABLE_WORKFLOW_MUTATION_DENIAL = [
191
189
 
192
190
  const CONTROL_MUTATION_DENIAL = [
193
191
  'GoodVibes Agent only inspects runtime-owned product-control surfaces from the main conversation.',
194
- 'Product-control mutation, daemon lifecycle, and service posture changes are disabled here.',
195
- 'Use explicit Agent CLI/slash commands for Agent-owned changes, and keep daemon lifecycle external.',
192
+ 'Product-control mutation, connected-host lifecycle, and connected-host posture changes are disabled here.',
193
+ 'Use explicit Agent CLI/slash commands for Agent-owned changes, and keep connected-host lifecycle external.',
196
194
  ].join(' ');
197
195
 
198
196
  export function installAgentToolPolicyGuard(registry: ToolRegistry, options: AgentToolPolicyGuardOptions = {}): void {
@@ -250,7 +248,7 @@ export function installAgentToolPolicyGuard(registry: ToolRegistry, options: Age
250
248
  modeSet: READ_ONLY_CONTROL_TOOL_MODE_SET,
251
249
  description: [
252
250
  'Read-only product-control inspection for GoodVibes Agent.',
253
- 'Command, panel, and subscription catalogs can be inspected, but product-control mutation and daemon lifecycle are external.',
251
+ 'Command, panel, and subscription catalogs can be inspected, but product-control mutation and connected-host lifecycle are external.',
254
252
  ].join(' '),
255
253
  denial: CONTROL_MUTATION_DENIAL,
256
254
  });
@@ -363,7 +361,7 @@ export function wrapBlockedSettingsToolForAgentPolicy(tool: Tool): void {
363
361
  tool.definition.description = [
364
362
  'Blocked in GoodVibes Agent main conversation: configuration mutation.',
365
363
  'Use explicit Agent CLI/slash settings commands for intentional config changes.',
366
- 'Daemon lifecycle and service exposure remain externally managed by GoodVibes TUI/daemon.',
364
+ 'Connected-host lifecycle and service exposure remain externally managed outside GoodVibes Agent.',
367
365
  ].join(' ');
368
366
  tool.definition.sideEffects = [];
369
367
  tool.definition.parameters = {
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.116';
9
+ let _version = '0.1.117';
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 {