@pellux/goodvibes-agent 0.1.117 → 1.0.1

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 (255) hide show
  1. package/CHANGELOG.md +20 -4
  2. package/README.md +35 -14
  3. package/bin/goodvibes-agent.ts +16 -2
  4. package/dist/package/main.js +176093 -171065
  5. package/docs/README.md +11 -5
  6. package/docs/channels-remote-and-api.md +50 -0
  7. package/docs/connected-host.md +3 -3
  8. package/docs/getting-started.md +29 -15
  9. package/docs/knowledge-artifacts-and-multimodal.md +91 -0
  10. package/docs/project-planning.md +79 -0
  11. package/docs/providers-and-routing.md +46 -0
  12. package/docs/release-and-publishing.md +44 -9
  13. package/docs/tools-and-commands.md +123 -0
  14. package/docs/voice-and-live-tts.md +51 -0
  15. package/package.json +2 -5
  16. package/src/agent/channel-delivery.ts +201 -0
  17. package/src/agent/media-generation.ts +159 -0
  18. package/src/agent/memory-prompt.ts +0 -1
  19. package/src/agent/note-registry.ts +329 -0
  20. package/src/agent/operator-actions.ts +343 -0
  21. package/src/agent/persona-registry.ts +15 -14
  22. package/src/agent/record-labels.ts +107 -0
  23. package/src/agent/reminder-schedule-format.ts +33 -24
  24. package/src/agent/reminder-schedule.ts +26 -25
  25. package/src/agent/routine-registry.ts +13 -12
  26. package/src/agent/routine-schedule-args.ts +2 -1
  27. package/src/agent/routine-schedule-format.ts +77 -53
  28. package/src/agent/routine-schedule-promotion.ts +34 -32
  29. package/src/agent/routine-schedule-receipts.ts +28 -26
  30. package/src/agent/runtime-profile-starters.ts +2 -2
  31. package/src/agent/runtime-profile.ts +18 -17
  32. package/src/agent/skill-registry.ts +25 -24
  33. package/src/cli/agent-knowledge-args.ts +5 -1
  34. package/src/cli/agent-knowledge-command.ts +39 -33
  35. package/src/cli/agent-knowledge-format.ts +80 -67
  36. package/src/cli/agent-knowledge-methods.ts +1 -1
  37. package/src/cli/agent-knowledge-runtime.ts +32 -26
  38. package/src/cli/bundle-command.ts +13 -8
  39. package/src/cli/config-overrides.ts +37 -36
  40. package/src/cli/external-runtime.ts +10 -4
  41. package/src/cli/help.ts +29 -11
  42. package/src/cli/local-library-command.ts +159 -73
  43. package/src/cli/management-commands.ts +98 -62
  44. package/src/cli/management.ts +52 -26
  45. package/src/cli/memory-command.ts +66 -32
  46. package/src/cli/parser.ts +37 -24
  47. package/src/cli/profiles-command.ts +52 -35
  48. package/src/cli/provider-auth-routes.ts +2 -1
  49. package/src/cli/routines-command.ts +59 -39
  50. package/src/cli/service-posture.ts +6 -6
  51. package/src/cli/status.ts +46 -121
  52. package/src/core/conversation-message-snapshot.ts +131 -0
  53. package/src/input/agent-workspace-activation.ts +33 -7
  54. package/src/input/agent-workspace-basic-command-editor-submission.ts +7 -3
  55. package/src/input/agent-workspace-basic-command-editors.ts +30 -10
  56. package/src/input/agent-workspace-categories.ts +276 -64
  57. package/src/input/agent-workspace-channel-command-editor-submission.ts +34 -0
  58. package/src/input/agent-workspace-channel-command-editors.ts +23 -5
  59. package/src/input/agent-workspace-channels.ts +35 -2
  60. package/src/input/agent-workspace-command-editor.ts +18 -2
  61. package/src/input/agent-workspace-config-reader.ts +16 -0
  62. package/src/input/agent-workspace-delegation-editor-submission.ts +1 -1
  63. package/src/input/agent-workspace-editors.ts +140 -2
  64. package/src/input/agent-workspace-knowledge-query-editor.ts +1 -1
  65. package/src/input/agent-workspace-knowledge-url-editor.ts +4 -11
  66. package/src/input/agent-workspace-learned-behavior.ts +2 -2
  67. package/src/input/agent-workspace-library-command-editor-submission.ts +1 -1
  68. package/src/input/agent-workspace-library-command-editors.ts +2 -2
  69. package/src/input/agent-workspace-local-operations.ts +218 -0
  70. package/src/input/agent-workspace-local-selection.ts +75 -0
  71. package/src/input/agent-workspace-media-command-editor-submission.ts +62 -0
  72. package/src/input/agent-workspace-media-command-editors.ts +27 -0
  73. package/src/input/agent-workspace-memory-command-editors.ts +1 -1
  74. package/src/input/agent-workspace-memory-editor.ts +2 -2
  75. package/src/input/agent-workspace-navigation.ts +38 -2
  76. package/src/input/agent-workspace-notify-editor-submission.ts +16 -2
  77. package/src/input/agent-workspace-operations-command-editor-submission.ts +63 -1
  78. package/src/input/agent-workspace-operations-command-editors.ts +80 -3
  79. package/src/input/agent-workspace-panel-route.ts +43 -0
  80. package/src/input/agent-workspace-reminder-schedule-editor.ts +1 -1
  81. package/src/input/agent-workspace-routine-schedule-editor.ts +2 -2
  82. package/src/input/agent-workspace-search.ts +169 -0
  83. package/src/input/agent-workspace-setup.ts +22 -11
  84. package/src/input/agent-workspace-skill-bundle-command-editor-submission.ts +6 -6
  85. package/src/input/agent-workspace-skill-bundle-command-editors.ts +10 -10
  86. package/src/input/agent-workspace-snapshot.ts +112 -13
  87. package/src/input/agent-workspace-task-command-editors.ts +4 -4
  88. package/src/input/agent-workspace-token.ts +18 -2
  89. package/src/input/agent-workspace-types.ts +92 -4
  90. package/src/input/agent-workspace-voice-media.ts +3 -6
  91. package/src/input/agent-workspace-web-research-editor.ts +104 -0
  92. package/src/input/agent-workspace.ts +136 -208
  93. package/src/input/command-registry.ts +4 -1
  94. package/src/input/commands/agent-local-library-args.ts +52 -0
  95. package/src/input/commands/agent-runtime-profile-runtime.ts +45 -41
  96. package/src/input/commands/agent-skills-runtime.ts +87 -99
  97. package/src/input/commands/agent-workspace-runtime.ts +23 -7
  98. package/src/input/commands/brief-runtime.ts +25 -24
  99. package/src/input/commands/channels-runtime.ts +145 -31
  100. package/src/input/commands/delegation-runtime.ts +29 -23
  101. package/src/input/commands/experience-runtime.ts +6 -4
  102. package/src/input/commands/guidance-runtime.ts +4 -4
  103. package/src/input/commands/health-runtime.ts +140 -115
  104. package/src/input/commands/knowledge.ts +57 -56
  105. package/src/input/commands/local-provider-runtime.ts +36 -18
  106. package/src/input/commands/local-runtime.ts +138 -16
  107. package/src/input/commands/local-setup-review.ts +7 -7
  108. package/src/input/commands/mcp-runtime.ts +118 -50
  109. package/src/input/commands/notify-runtime.ts +38 -9
  110. package/src/input/commands/operator-actions-runtime.ts +138 -0
  111. package/src/input/commands/operator-runtime.ts +6 -17
  112. package/src/input/commands/personas-runtime.ts +49 -59
  113. package/src/input/commands/planning-runtime.ts +1 -1
  114. package/src/input/commands/platform-access-runtime.ts +29 -29
  115. package/src/input/commands/provider-accounts-runtime.ts +60 -39
  116. package/src/input/commands/qrcode-runtime.ts +45 -6
  117. package/src/input/commands/recall-bundle.ts +11 -11
  118. package/src/input/commands/recall-capture.ts +13 -11
  119. package/src/input/commands/recall-query.ts +29 -21
  120. package/src/input/commands/recall-review.ts +2 -1
  121. package/src/input/commands/routines-runtime.ts +63 -72
  122. package/src/input/commands/schedule-runtime.ts +33 -20
  123. package/src/input/commands/security-runtime.ts +4 -4
  124. package/src/input/commands/session-content.ts +80 -78
  125. package/src/input/commands/session-workflow.ts +132 -93
  126. package/src/input/commands/session.ts +3 -174
  127. package/src/input/commands/shell-core.ts +32 -17
  128. package/src/input/commands/subscription-runtime.ts +53 -179
  129. package/src/input/commands/tasks-runtime.ts +20 -20
  130. package/src/input/commands/work-plan-runtime.ts +33 -8
  131. package/src/input/commands.ts +2 -2
  132. package/src/input/feed-context-factory.ts +2 -1
  133. package/src/input/file-picker.ts +3 -2
  134. package/src/input/handler-command-route.ts +4 -7
  135. package/src/input/handler-content-actions.ts +89 -1
  136. package/src/input/handler-feed-routes.ts +19 -12
  137. package/src/input/handler-feed.ts +6 -3
  138. package/src/input/handler-interactions.ts +7 -5
  139. package/src/input/handler-modal-stack.ts +3 -3
  140. package/src/input/handler-onboarding.ts +24 -80
  141. package/src/input/handler-shortcuts.ts +15 -4
  142. package/src/input/handler.ts +47 -17
  143. package/src/input/input-history.ts +5 -6
  144. package/src/input/keybindings.ts +22 -11
  145. package/src/input/onboarding/onboarding-wizard-apply.ts +13 -0
  146. package/src/input/onboarding/onboarding-wizard-constants.ts +1 -0
  147. package/src/input/onboarding/onboarding-wizard-operator-steps.ts +147 -57
  148. package/src/input/onboarding/onboarding-wizard-steps.ts +46 -29
  149. package/src/input/onboarding/onboarding-wizard-types.ts +3 -1
  150. package/src/input/onboarding/onboarding-wizard.ts +68 -0
  151. package/src/input/profile-picker-modal.ts +31 -12
  152. package/src/input/session-picker-modal.ts +22 -4
  153. package/src/input/settings-modal-behavior.ts +0 -3
  154. package/src/input/settings-modal-subscriptions.ts +3 -3
  155. package/src/input/settings-modal-types.ts +2 -13
  156. package/src/input/settings-modal.ts +6 -52
  157. package/src/input/submission-intent.ts +0 -1
  158. package/src/input/submission-router.ts +3 -3
  159. package/src/main.ts +18 -8
  160. package/src/panels/approval-panel.ts +8 -8
  161. package/src/panels/automation-control-panel.ts +2 -2
  162. package/src/panels/base-panel.ts +1 -1
  163. package/src/panels/builtin/agent.ts +1 -1
  164. package/src/panels/builtin/operations.ts +1 -10
  165. package/src/panels/builtin/session.ts +9 -9
  166. package/src/panels/builtin/shared.ts +2 -2
  167. package/src/panels/cost-tracker-panel.ts +1 -1
  168. package/src/panels/docs-panel.ts +5 -3
  169. package/src/panels/index.ts +0 -1
  170. package/src/panels/knowledge-panel.ts +6 -5
  171. package/src/panels/memory-panel.ts +7 -6
  172. package/src/panels/panel-list-panel.ts +36 -80
  173. package/src/panels/project-planning-panel.ts +18 -11
  174. package/src/panels/provider-account-snapshot.ts +51 -25
  175. package/src/panels/provider-accounts-panel.ts +33 -18
  176. package/src/panels/provider-health-domains.ts +45 -4
  177. package/src/panels/provider-health-panel.ts +5 -4
  178. package/src/panels/qr-panel.ts +1 -1
  179. package/src/panels/schedule-panel.ts +9 -17
  180. package/src/panels/security-panel.ts +8 -8
  181. package/src/panels/session-browser-panel.ts +10 -10
  182. package/src/panels/subscription-panel.ts +3 -3
  183. package/src/panels/system-messages-panel.ts +1 -1
  184. package/src/panels/tasks-panel.ts +20 -13
  185. package/src/panels/tool-inspector-panel.ts +19 -12
  186. package/src/panels/work-plan-panel.ts +5 -5
  187. package/src/planning/project-planning-coordinator.ts +1 -1
  188. package/src/provider-auth-route-display.ts +9 -0
  189. package/src/renderer/agent-workspace-style.ts +34 -0
  190. package/src/renderer/agent-workspace.ts +228 -52
  191. package/src/renderer/autocomplete-overlay.ts +25 -6
  192. package/src/renderer/bookmark-modal.ts +19 -4
  193. package/src/renderer/buffer.ts +4 -2
  194. package/src/renderer/context-inspector.ts +50 -13
  195. package/src/renderer/diff.ts +1 -1
  196. package/src/renderer/file-picker-overlay.ts +19 -6
  197. package/src/renderer/help-overlay.ts +106 -33
  198. package/src/renderer/history-search-overlay.ts +19 -4
  199. package/src/renderer/live-tail-modal.ts +27 -5
  200. package/src/renderer/mcp-workspace.ts +164 -50
  201. package/src/renderer/model-picker-overlay.ts +58 -2
  202. package/src/renderer/model-workspace.ts +104 -20
  203. package/src/renderer/process-modal.ts +27 -6
  204. package/src/renderer/profile-picker-modal.ts +20 -4
  205. package/src/renderer/search-overlay.ts +25 -5
  206. package/src/renderer/selection-modal-overlay.ts +46 -14
  207. package/src/renderer/session-picker-modal.ts +18 -1
  208. package/src/renderer/settings-modal-helpers.ts +2 -40
  209. package/src/renderer/settings-modal.ts +83 -50
  210. package/src/renderer/tool-call.ts +20 -11
  211. package/src/runtime/agent-runtime-events.ts +6 -6
  212. package/src/runtime/bootstrap-command-context.ts +7 -1
  213. package/src/runtime/bootstrap-command-parts.ts +9 -7
  214. package/src/runtime/bootstrap-core.ts +19 -1
  215. package/src/runtime/bootstrap-hook-bridge.ts +7 -18
  216. package/src/runtime/bootstrap-shell.ts +4 -4
  217. package/src/runtime/bootstrap.ts +31 -22
  218. package/src/runtime/connected-host-auth.ts +7 -2
  219. package/src/runtime/diagnostics/panels/index.ts +2 -2
  220. package/src/runtime/diagnostics/panels/policy.ts +7 -7
  221. package/src/runtime/index.ts +2 -1
  222. package/src/runtime/onboarding/apply-file-helpers.ts +66 -0
  223. package/src/runtime/onboarding/apply.ts +80 -79
  224. package/src/runtime/onboarding/derivation.ts +5 -8
  225. package/src/runtime/onboarding/snapshot.ts +0 -15
  226. package/src/runtime/onboarding/types.ts +8 -19
  227. package/src/runtime/onboarding/verify.ts +32 -10
  228. package/src/runtime/operator-token-cleanup.ts +1 -1
  229. package/src/runtime/services.ts +91 -22
  230. package/src/runtime/store/selectors/index.ts +3 -3
  231. package/src/runtime/store/state.ts +1 -4
  232. package/src/runtime/surface-feature-flags.ts +41 -6
  233. package/src/runtime/ui-read-models.ts +3 -4
  234. package/src/runtime/ui-services.ts +6 -6
  235. package/src/shell/blocking-input.ts +2 -1
  236. package/src/shell/ui-openers.ts +3 -13
  237. package/src/tools/agent-analysis-registry-policy.ts +0 -1
  238. package/src/tools/agent-channel-send-tool.ts +133 -0
  239. package/src/tools/agent-context-policy.ts +1 -1
  240. package/src/tools/agent-knowledge-ingest-tool.ts +405 -0
  241. package/src/tools/agent-knowledge-tool.ts +170 -0
  242. package/src/tools/agent-local-registry-tool.ts +269 -69
  243. package/src/tools/agent-media-generate-tool.ts +133 -0
  244. package/src/tools/agent-notify-tool.ts +143 -0
  245. package/src/tools/agent-operator-action-tool.ts +137 -0
  246. package/src/tools/agent-operator-briefing-tool.ts +217 -0
  247. package/src/tools/agent-reminder-schedule-tool.ts +237 -0
  248. package/src/tools/agent-tool-policy-guard.ts +8 -8
  249. package/src/tools/agent-work-plan-tool.ts +256 -0
  250. package/src/version.ts +1 -1
  251. package/src/input/commands/policy-dispatch.ts +0 -339
  252. package/src/input/commands/policy.ts +0 -13
  253. package/src/panels/panel-picker.ts +0 -105
  254. package/src/panels/policy-panel.ts +0 -308
  255. package/src/renderer/panel-picker-overlay.ts +0 -202
@@ -1,12 +1,8 @@
1
1
  import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
2
2
  import { dirname } from 'node:path';
3
3
  import { InputTokenizer } from '@pellux/goodvibes-sdk/platform/core';
4
- import { createOAuthLocalListener } from '@pellux/goodvibes-sdk/platform/config';
5
4
  import { clearModalStackForHandler, cleanupMarkerRegistryForHandler, executeBlockActionForHandler, expandPromptForHandler, findMarkerAtPosForHandler, getImageAttachmentsForHandler, handleBlockCopyForHandler, handleBlockRerunForHandler, handleBlockSaveForHandler, handleBlockToggleForHandler, handleBookmarkForHandler, handleCopyForHandler, handleCtrlCForHandler, handleEscapeForHandler, hydrateOnboardingWizardFromRuntimeForHandler, modalOpenedForHandler, openOnboardingWizardForHandler, registerPasteForHandler } from './handler-interactions.ts';
6
- import { clearOnboardingModelPickerCancelStateForHandler, clearOnboardingPendingModelPickerTargetForHandler, completeOpenAiSubscriptionFromListenerForHandler, getOnboardingConfigValueForHandler, getOnboardingRuntimePostureForHandler, handleModelPickerCommitForHandler, handleOnboardingActionForHandler, handleOpenAiSubscriptionFinishForHandler, handleOpenAiSubscriptionStartForHandler, openModelPickerWithTargetForHandler, openProviderModelPickerWithTargetForHandler, refreshOnboardingHydrationForHandler, restartOnboardingExternalServicesIfNeededForHandler, restoreOnboardingModelPickerCancelStateForHandler, syncRuntimeFromOnboardingRequestForHandler, verifyOnboardingRuntimePostureForHandler, type OnboardingRuntimePosture } from './handler-onboarding.ts';
7
- import { beginOpenAICodexLogin, exchangeOpenAICodexCode } from '@pellux/goodvibes-sdk/platform/config';
8
- import { openExternalUrl } from '@pellux/goodvibes-sdk/platform/utils';
9
- import { buildProviderAccountSnapshot } from '@/runtime/index.ts';
5
+ import { clearOnboardingModelPickerCancelStateForHandler, clearOnboardingPendingModelPickerTargetForHandler, getOnboardingConfigValueForHandler, getOnboardingRuntimePostureForHandler, handleModelPickerCommitForHandler, handleOnboardingActionForHandler, handleOpenAiSubscriptionFinishForHandler, handleOpenAiSubscriptionStartForHandler, openModelPickerWithTargetForHandler, openProviderModelPickerWithTargetForHandler, refreshOnboardingHydrationForHandler, restartOnboardingExternalServicesIfNeededForHandler, restoreOnboardingModelPickerCancelStateForHandler, syncRuntimeFromOnboardingRequestForHandler, verifyOnboardingRuntimePostureForHandler, type OnboardingRuntimePosture } from './handler-onboarding.ts';
10
6
  import { SelectionManager } from './selection.ts';
11
7
  import type { InfiniteBuffer } from '../core/history.ts';
12
8
  import type { CommandRegistry, CommandContext } from './command-registry.ts';
@@ -163,14 +159,13 @@ export class InputHandler {
163
159
  public onboardingModelPickerCancelSnapshot: OnboardingWizardSnapshot | null = null;
164
160
  public onboardingHydrationSerial = 0;
165
161
  public onboardingApplyPending = false;
166
- public onboardingOpenAiListenerSerial = 0;
167
162
 
168
163
  /**
169
164
  * Modal navigation stack. Each element is the name of an open modal.
170
165
  * Used to support back-navigation via Escape.
171
166
  */
172
167
  public modalStack: string[] = [];
173
- public modalReturnFocus: 'prompt' | 'panel' | 'indicator' = 'prompt';
168
+ public modalReturnFocus: 'prompt' | 'indicator' = 'prompt';
174
169
  public sessionPickerModal: SessionPickerModal;
175
170
  public profilePickerModal: ProfilePickerModal;
176
171
  /** True when the help overlay is visible. */
@@ -308,7 +303,8 @@ export class InputHandler {
308
303
  ensureInputCursorVisible: (contentWidth?: number) => this.ensureInputCursorVisible(contentWidth),
309
304
  registerPaste: (content: string) => this.registerPaste(content),
310
305
  executeBlockAction: (id: string) => this.executeBlockAction(id),
311
- cyclePanelTab: (direction: 'next' | 'prev') => this.cyclePanelTab(direction),
306
+ cycleAgentWorkspaceCategory: (direction: 'next' | 'prev') => this.cycleAgentWorkspaceCategory(direction),
307
+ dismissAgentWorkspace: () => this.dismissAgentWorkspace(),
312
308
  onPanelInputConsumed: (activePanel: Panel | null, key: string) => this.handlePanelIntegrationAction(activePanel, key),
313
309
  getWrappedPromptInfo: (contentWidth: number) => this.getWrappedPromptInfo(contentWidth),
314
310
  moveCursorVertical: (direction: -1 | 1) => this.moveCursorVertical(direction),
@@ -412,15 +408,33 @@ export class InputHandler {
412
408
  this.panelFocused = false;
413
409
  this.indicatorFocused = false;
414
410
  this.modalOpened('agentWorkspace');
415
- this.agentWorkspace.open(context, (command) => this.dispatchAgentWorkspaceCommand(command, context), categoryId);
411
+ this.agentWorkspace.open(
412
+ context,
413
+ (command) => this.dispatchAgentWorkspaceCommand(command, context),
414
+ categoryId,
415
+ (prompt) => this.dispatchAgentWorkspacePrompt(prompt, context),
416
+ );
416
417
  this.requestRender();
417
418
  }
418
419
 
419
- private dispatchAgentWorkspaceCommand(command: string, context: CommandContext): void {
420
+ private closeAgentWorkspaceModal(): void {
420
421
  this.agentWorkspace.close();
421
422
  for (let index = this.modalStack.length - 1; index >= 0; index -= 1) {
422
423
  if (this.modalStack[index] === 'agentWorkspace') this.modalStack.splice(index, 1);
423
424
  }
425
+ }
426
+
427
+ public dismissAgentWorkspace(): boolean {
428
+ if (!this.agentWorkspace.active) return false;
429
+ this.closeAgentWorkspaceModal();
430
+ this.panelFocused = false;
431
+ this.indicatorFocused = false;
432
+ this.requestRender();
433
+ return true;
434
+ }
435
+
436
+ private dispatchAgentWorkspaceCommand(command: string, context: CommandContext): void {
437
+ this.closeAgentWorkspaceModal();
424
438
  const { name, args } = parseSlashCommand(command);
425
439
  if (!name) return;
426
440
  void context.executeCommand?.(name, [...args]).catch((error: unknown) => {
@@ -429,11 +443,16 @@ export class InputHandler {
429
443
  });
430
444
  this.requestRender();
431
445
  }
446
+
447
+ private dispatchAgentWorkspacePrompt(prompt: string, context: CommandContext): void {
448
+ this.closeAgentWorkspaceModal();
449
+ context.submitInput?.(prompt);
450
+ this.requestRender();
451
+ }
432
452
  public handleModelPickerCommit(): boolean { return handleModelPickerCommitForHandler(this); }
433
453
  public async handleOnboardingAction(action: OnboardingWizardAction): Promise<void> { await handleOnboardingActionForHandler(this, action); }
434
454
  public async refreshOnboardingHydration(options: { readonly preserveValues?: boolean; readonly targetStepId?: string } = {}): Promise<void> { await refreshOnboardingHydrationForHandler(this, options); }
435
455
  public async handleOpenAiSubscriptionStart(): Promise<void> { await handleOpenAiSubscriptionStartForHandler(this); }
436
- public async completeOpenAiSubscriptionFromListener(listener: Awaited<ReturnType<typeof createOAuthLocalListener>>, verifier: string, serial: number): Promise<void> { await completeOpenAiSubscriptionFromListenerForHandler(this, listener, verifier, serial); }
437
456
  public async handleOpenAiSubscriptionFinish(): Promise<void> { await handleOpenAiSubscriptionFinishForHandler(this); }
438
457
  public syncRuntimeFromOnboardingRequest(request: ReturnType<OnboardingWizardController['buildApplyRequest']>): void { syncRuntimeFromOnboardingRequestForHandler(this, request); }
439
458
  public getOnboardingConfigValue(request: OnboardingApplyRequest, key: string): unknown { return getOnboardingConfigValueForHandler(this, request, key); }
@@ -693,13 +712,24 @@ export class InputHandler {
693
712
  * Word-wrap a single line to fit within maxW columns.
694
713
  * Breaks at spaces; words wider than maxW are force-broken.
695
714
  */
696
- public cyclePanelTab(direction: 'next' | 'prev'): void {
697
- const pm = this.uiServices.shell.panelManager;
698
- if (pm.isVisible()) {
699
- if (direction === 'next') pm.nextWorkspaceTab();
700
- else pm.prevWorkspaceTab();
701
- this.requestRender();
715
+ public cycleAgentWorkspaceCategory(direction: 'next' | 'prev'): void {
716
+ const context = this.commandContext;
717
+ if (!this.agentWorkspace.active) {
718
+ if (!context) return;
719
+ this.panelFocused = false;
720
+ this.indicatorFocused = false;
721
+ this.modalOpened('agentWorkspace');
722
+ this.agentWorkspace.open(
723
+ context,
724
+ (command) => this.dispatchAgentWorkspaceCommand(command, context),
725
+ undefined,
726
+ (prompt) => this.dispatchAgentWorkspacePrompt(prompt, context),
727
+ );
702
728
  }
729
+ this.agentWorkspace.cycleCategory(direction);
730
+ this.panelFocused = false;
731
+ this.indicatorFocused = false;
732
+ this.requestRender();
703
733
  }
704
734
 
705
735
  public handlePanelIntegrationAction(activePanel: Panel | null, key: string): void {
@@ -284,13 +284,12 @@ export class InputHistory {
284
284
 
285
285
  private normalizeStoredEntry(entry: unknown): StoredInputHistoryEntry | null {
286
286
  if (typeof entry === 'string') return entry;
287
- if (!entry || typeof entry !== 'object') return null;
288
- const record = entry as Record<string, unknown>;
289
- if (typeof record.text !== 'string') return null;
290
- const text = record.text.trim();
287
+ if (!entry || typeof entry !== 'object' || Array.isArray(entry)) return null;
288
+ if (!('text' in entry) || typeof entry.text !== 'string') return null;
289
+ const text = entry.text.trim();
291
290
  if (!text) return null;
292
- if (typeof record.recallText === 'string' && record.recallText.trim() && record.recallText.trim() !== text) {
293
- return { text, recallText: record.recallText.trim() };
291
+ if ('recallText' in entry && typeof entry.recallText === 'string' && entry.recallText.trim() && entry.recallText.trim() !== text) {
292
+ return { text, recallText: entry.recallText.trim() };
294
293
  }
295
294
  return text;
296
295
  }
@@ -60,10 +60,10 @@ export const ACTION_DESCRIPTIONS: Record<KeyAction, string> = {
60
60
  'clear-cancel': 'Clear input / cancel generation / exit (double)',
61
61
  'screen-clear': 'Repaint the screen',
62
62
  'panel-picker': 'Open the Agent operator workspace',
63
- 'panel-close': 'Dismiss deferred panel focus',
64
- 'panel-close-all': 'Dismiss deferred workspace focus',
65
- 'panel-tab-next': 'Reserved for future Agent workspace tabs',
66
- 'panel-tab-prev': 'Reserved for future Agent workspace tabs',
63
+ 'panel-close': 'Dismiss Agent workspace',
64
+ 'panel-close-all': 'Dismiss Agent workspace focus',
65
+ 'panel-tab-next': 'Cycle Agent workspace category forward',
66
+ 'panel-tab-prev': 'Cycle Agent workspace category backward',
67
67
  'history-search': 'Reverse input history search',
68
68
  'search': 'Toggle conversation search',
69
69
  'block-copy': 'Copy nearest block to clipboard',
@@ -80,6 +80,19 @@ export const ACTION_DESCRIPTIONS: Record<KeyAction, string> = {
80
80
  'replay-panel': 'Reserved replay workspace shortcut',
81
81
  };
82
82
 
83
+ function isKeyAction(action: string): action is KeyAction {
84
+ return Object.hasOwn(ACTION_DESCRIPTIONS, action);
85
+ }
86
+
87
+ function isKeyCombo(value: unknown): value is KeyCombo {
88
+ if (!value || typeof value !== 'object' || Array.isArray(value)) return false;
89
+ if (!('key' in value) || typeof value.key !== 'string' || value.key.length === 0) return false;
90
+ if ('ctrl' in value && value.ctrl !== undefined && typeof value.ctrl !== 'boolean') return false;
91
+ if ('shift' in value && value.shift !== undefined && typeof value.shift !== 'boolean') return false;
92
+ if ('alt' in value && value.alt !== undefined && typeof value.alt !== 'boolean') return false;
93
+ return true;
94
+ }
95
+
83
96
  /** Default key bindings for all actions. */
84
97
  export const DEFAULT_KEYBINDINGS: Record<KeyAction, KeyCombo[]> = {
85
98
  'copy-selection': [{ key: 'c', ctrl: true, shift: true }],
@@ -218,11 +231,7 @@ export class KeybindingsManager {
218
231
  }
219
232
 
220
233
  private validateCombos(combos: unknown[]): combos is KeyCombo[] {
221
- return combos.every((c) => {
222
- if (typeof c !== 'object' || c === null) return false;
223
- const combo = c as Record<string, unknown>;
224
- return typeof combo['key'] === 'string' && combo['key'].length > 0;
225
- });
234
+ return combos.every(isKeyCombo);
226
235
  }
227
236
 
228
237
  /**
@@ -233,9 +242,10 @@ export class KeybindingsManager {
233
242
  * Expects: { logicalName: string; ctrl?: boolean; shift?: boolean; alt?: boolean }
234
243
  */
235
244
  matches(
236
- action: KeyAction,
245
+ action: string,
237
246
  token: { logicalName?: string; ctrl?: boolean; shift?: boolean; alt?: boolean },
238
247
  ): boolean {
248
+ if (!isKeyAction(action)) return false;
239
249
  const combos = this.bindings[action];
240
250
  if (!combos) return false;
241
251
  return combos.some((combo) => this.comboMatches(combo, token));
@@ -267,7 +277,8 @@ export class KeybindingsManager {
267
277
  * getComboLabel — Return a human-readable label for the first combo of an action.
268
278
  * Example: { key: 'f', ctrl: true } → "Ctrl+F"
269
279
  */
270
- getComboLabel(action: KeyAction): string {
280
+ getComboLabel(action: string): string {
281
+ if (!isKeyAction(action)) return '(unbound)';
271
282
  const combos = this.bindings[action];
272
283
  if (!combos?.length) return '(unbound)';
273
284
  return this.formatCombo(combos[0]);
@@ -22,6 +22,18 @@ export function buildOnboardingApplyRequest(controller: OnboardingWizardControll
22
22
  });
23
23
  };
24
24
  const readText = (fieldId: string): string => controller.getStringFieldValue(fieldId, '').trim();
25
+ const readList = (fieldId: string): readonly string[] => readText(fieldId).split(',').map((entry) => entry.trim()).filter(Boolean);
26
+ const maybeCreateLocalNote = (): void => {
27
+ const title = readText('agent-local-state.note-title');
28
+ const body = readText('agent-local-state.note-body');
29
+ if (!title && !body) return;
30
+ operations.push({
31
+ kind: 'create-local-note',
32
+ title,
33
+ body,
34
+ tags: readList('agent-local-state.note-tags'),
35
+ });
36
+ };
25
37
  const maybeCreateLocalPersona = (): void => {
26
38
  const name = readText('agent-local-state.persona-name');
27
39
  const description = readText('agent-local-state.persona-description');
@@ -93,6 +105,7 @@ export function buildOnboardingApplyRequest(controller: OnboardingWizardControll
93
105
  });
94
106
  }
95
107
  }
108
+ maybeCreateLocalNote();
96
109
  maybeCreateLocalPersona();
97
110
  maybeCreateLocalSkill();
98
111
  maybeCreateLocalRoutine();
@@ -6,6 +6,7 @@ export const STEP_ORDER: readonly OnboardingWizardStepId[] = [
6
6
  'default-model',
7
7
  'agent-communication',
8
8
  'agent-tools',
9
+ 'agent-research',
9
10
  'agent-knowledge',
10
11
  'agent-local-state',
11
12
  'agent-automation',
@@ -22,7 +22,7 @@ function discoverySample(discovery: AgentBehaviorDiscoverySnapshot | undefined):
22
22
  ...discovery.skills.names,
23
23
  ...discovery.routines.names,
24
24
  ].slice(0, 4);
25
- if (names.length === 0) return 'Use /personas discover, /agent-skills discover, and /routines discover after setup to rescan.';
25
+ if (names.length === 0) return 'Open the Memory & Skills workspace after setup to rescan and import local behavior files.';
26
26
  const remaining = discoveryCount(discovery) > names.length ? `, +${discoveryCount(discovery) - names.length} more` : '';
27
27
  return `Import candidates: ${names.join(', ')}${remaining}.`;
28
28
  }
@@ -41,11 +41,12 @@ export function buildCommunicationStep(): OnboardingWizardStepDefinition {
41
41
  ],
42
42
  fields: [
43
43
  {
44
- kind: 'status',
44
+ kind: 'action',
45
45
  id: 'agent-communication.companion',
46
+ action: 'open-agent-workspace:channels',
46
47
  label: 'Companion pairing',
47
- hint: 'Use /pair from the Agent workspace to pair companion clients through the connected GoodVibes host.',
48
- defaultValue: 'Pair when ready',
48
+ hint: 'Open the Channels workspace to pair companion clients and review channel readiness and delivery safety.',
49
+ defaultValue: 'Open Channels',
49
50
  },
50
51
  {
51
52
  kind: 'status',
@@ -86,11 +87,12 @@ export function buildToolsStep(): OnboardingWizardStepDefinition {
86
87
  ],
87
88
  fields: [
88
89
  {
89
- kind: 'status',
90
+ kind: 'action',
90
91
  id: 'agent-tools.mcp',
92
+ action: 'open-agent-workspace:tools',
91
93
  label: 'MCP connections and tools',
92
- hint: 'Use /mcp servers and the Agent workspace Tools area to inspect connected MCP servers, roles, and tool readiness.',
93
- defaultValue: 'Inspectable',
94
+ hint: 'Open the Tools & MCP workspace to inspect connected MCP servers, roles, trust, and tool readiness.',
95
+ defaultValue: 'Open Tools',
94
96
  },
95
97
  {
96
98
  kind: 'status',
@@ -122,26 +124,27 @@ export function buildAgentKnowledgeStep(): OnboardingWizardStepDefinition {
122
124
  id: 'agent-knowledge',
123
125
  title: 'Agent Knowledge',
124
126
  shortLabel: 'Knowledge',
125
- description: 'Agent Knowledge is isolated to the GoodVibes Agent product segment. It never falls back to default Knowledge/Wiki or any non-Agent product segment.',
127
+ description: 'Agent Knowledge is isolated to the GoodVibes Agent product segment. It never falls back to default knowledge or any non-Agent product segment.',
126
128
  summaryTitle: 'Knowledge isolation',
127
129
  summaryLines: [
128
- 'Route segment: /api/goodvibes-agent/knowledge/*',
129
- 'Default wiki fallback: disabled',
130
- 'Non-Agent route fallback: disabled',
130
+ 'Route segment /api/goodvibes-agent/knowledge/*',
131
+ 'Default knowledge fallback disabled',
132
+ 'Non-Agent route fallback disabled',
131
133
  ],
132
134
  fields: [
133
135
  {
134
- kind: 'status',
136
+ kind: 'action',
135
137
  id: 'agent-knowledge.route',
138
+ action: 'open-agent-workspace:knowledge',
136
139
  label: 'Isolated Agent Knowledge route',
137
- hint: 'Ask, search, status, and ingest use /api/goodvibes-agent/knowledge/* only.',
138
- defaultValue: 'Isolated',
140
+ hint: 'Open the Knowledge workspace for isolated Agent ask, search, status, ingest, and review actions.',
141
+ defaultValue: 'Open Knowledge',
139
142
  },
140
143
  {
141
144
  kind: 'status',
142
- id: 'agent-knowledge.no-default-wiki',
143
- label: 'Default Knowledge/Wiki fallback',
144
- hint: 'Agent setup and Agent ask/search must not query the default wiki when Agent Knowledge has no answer.',
145
+ id: 'agent-knowledge.no-default-knowledge',
146
+ label: 'Default knowledge fallback',
147
+ hint: 'Agent setup and Agent ask/search must not query the default knowledge when Agent Knowledge has no answer.',
145
148
  defaultValue: 'Blocked',
146
149
  },
147
150
  {
@@ -155,6 +158,52 @@ export function buildAgentKnowledgeStep(): OnboardingWizardStepDefinition {
155
158
  };
156
159
  }
157
160
 
161
+ export function buildResearchStep(): OnboardingWizardStepDefinition {
162
+ return {
163
+ id: 'agent-research',
164
+ title: 'Research and source triage',
165
+ shortLabel: 'Research',
166
+ description: 'Prepare read-only web research and source triage. Research runs in the main Agent conversation; durable source storage uses explicit Agent Knowledge ingest.',
167
+ summaryTitle: 'Research posture',
168
+ summaryLines: [
169
+ 'Web research: read-only main-conversation requests',
170
+ 'URL inspection: user-directed and visible',
171
+ 'Durable sources: explicit Agent Knowledge ingest only',
172
+ ],
173
+ fields: [
174
+ {
175
+ kind: 'action',
176
+ id: 'agent-research.workspace',
177
+ action: 'open-agent-workspace:research',
178
+ label: 'Research workspace',
179
+ hint: 'Open the Research workspace to submit web research, inspect URLs, and decide what belongs in Agent Knowledge.',
180
+ defaultValue: 'Open Research',
181
+ },
182
+ {
183
+ kind: 'status',
184
+ id: 'agent-research.read-only',
185
+ label: 'Read-only web use',
186
+ hint: 'Search and URL inspection are normal Agent conversation turns. They should not send messages, mutate connected-host state, or perform browser side effects.',
187
+ defaultValue: 'Serial',
188
+ },
189
+ {
190
+ kind: 'status',
191
+ id: 'agent-research.knowledge-boundary',
192
+ label: 'Source-to-knowledge boundary',
193
+ hint: 'Reviewed sources become durable only through confirmed Agent Knowledge ingest actions. Default knowledge and non-Agent segments are not fallback stores.',
194
+ defaultValue: 'Explicit ingest',
195
+ },
196
+ {
197
+ kind: 'status',
198
+ id: 'agent-research.context-references',
199
+ label: 'Inline URL context',
200
+ hint: 'Use @https://... in the composer to reference a URL for one turn without ingesting it into Agent Knowledge.',
201
+ defaultValue: 'Available',
202
+ },
203
+ ],
204
+ };
205
+ }
206
+
158
207
  export function buildLocalStateStep(discovery?: AgentBehaviorDiscoverySnapshot): OnboardingWizardStepDefinition {
159
208
  const discoveredCount = discoveryCount(discovery);
160
209
  return {
@@ -163,54 +212,91 @@ export function buildLocalStateStep(discovery?: AgentBehaviorDiscoverySnapshot):
163
212
  shortLabel: 'Behavior',
164
213
  description: discoveredCount > 0
165
214
  ? 'Review importable Agent-local behavior files, then create an isolated profile from them or import individual records.'
166
- : 'Review the Agent-local behavior model. Memory, personas, skills, routines, and Agent profiles stay local until a stable shared registry exists.',
167
- summaryTitle: 'Local Agent state',
215
+ : 'Review the Agent-local behavior model. Memory, notes, personas, skills, routines, and Agent profiles stay local until a stable shared registry exists.',
216
+ summaryTitle: 'Agent-local state',
168
217
  summaryLines: [
169
- 'Memory/personas/skills/routines: local Agent registries',
170
- `Discovered behavior files: ${discoverySummary(discovery)}`,
171
- 'Secrets: rejected or stored by secret reference',
172
- 'Profiles: isolated Agent homes',
218
+ 'Memory/notes/personas/skills/routines use Agent-local registries',
219
+ `Discovered behavior files ${discoverySummary(discovery)}`,
220
+ 'Secrets are rejected or stored by secret reference',
221
+ 'Profiles use isolated Agent homes',
173
222
  ],
174
223
  fields: [
175
224
  {
176
- kind: 'status',
225
+ kind: 'action',
177
226
  id: 'agent-local-state.memory',
227
+ action: 'open-agent-workspace:memory',
178
228
  label: 'Local memory',
179
- hint: 'Use /memory to create, review, stale, search, and delete Agent-local memory records.',
180
- defaultValue: 'Local registry',
229
+ hint: 'Open the Memory & Skills workspace to create, review, stale, search, and delete Agent-local memory records.',
230
+ defaultValue: 'Open Memory',
181
231
  },
182
232
  {
183
- kind: 'status',
233
+ kind: 'action',
234
+ id: 'agent-local-state.notes',
235
+ action: 'open-agent-workspace:notes',
236
+ label: 'Scratchpad notes',
237
+ hint: 'Open the Notes workspace to capture source triage, temporary decisions, and operator handoff without writing memory or Agent Knowledge.',
238
+ defaultValue: 'Open Notes',
239
+ },
240
+ {
241
+ kind: 'text',
242
+ id: 'agent-local-state.note-title',
243
+ label: 'Initial note title',
244
+ hint: 'Optional scratchpad note created during setup. Notes are temporary working context, not durable memory or Agent Knowledge.',
245
+ placeholder: 'First things to remember',
246
+ defaultValue: '',
247
+ },
248
+ {
249
+ kind: 'text',
250
+ id: 'agent-local-state.note-body',
251
+ label: 'Initial note body',
252
+ hint: 'Capture temporary setup context, source-triage notes, or user preferences that should be reviewed before promotion.',
253
+ placeholder: 'Review calendar connection later; user prefers concise daily planning; do not store secrets here.',
254
+ defaultValue: '',
255
+ multiline: true,
256
+ },
257
+ {
258
+ kind: 'text',
259
+ id: 'agent-local-state.note-tags',
260
+ label: 'Initial note tags',
261
+ hint: 'Optional comma-separated tags for the setup note.',
262
+ placeholder: 'setup, preference',
263
+ defaultValue: '',
264
+ },
265
+ {
266
+ kind: 'action',
184
267
  id: 'agent-local-state.personas',
268
+ action: 'open-agent-workspace:personas',
185
269
  label: 'Personas',
186
270
  hint: discovery?.personas.count && discovery.personas.count > 0
187
- ? `${discovery.personas.count} persona file(s) are available. Use the Profiles workspace to create a profile from discovered behavior, or preview individual files with /personas discover.`
188
- : 'Use /personas to create and activate serial operating modes for the main conversation.',
189
- defaultValue: discovery?.personas.count && discovery.personas.count > 0 ? `${discovery.personas.count} discovered` : 'Local registry',
271
+ ? `${discovery.personas.count} persona file(s) are available. Open the Personas workspace to review, import, activate, or create a profile from discovered behavior.`
272
+ : 'Open the Personas workspace to create and activate serial operating modes for the main conversation.',
273
+ defaultValue: discovery?.personas.count && discovery.personas.count > 0 ? `${discovery.personas.count} discovered` : 'Open Personas',
190
274
  },
191
275
  {
192
- kind: 'status',
276
+ kind: 'action',
193
277
  id: 'agent-local-state.skills',
278
+ action: 'open-agent-workspace:skills',
194
279
  label: 'Skills',
195
280
  hint: discovery?.skills.count && discovery.skills.count > 0
196
- ? `${discovery.skills.count} skill file(s) are available. Use the Profiles workspace to create a profile from discovered behavior, or preview individual files with /agent-skills discover.`
197
- : 'Use /agent-skills and /skills local to manage reusable Agent procedures.',
198
- defaultValue: discovery?.skills.count && discovery.skills.count > 0 ? `${discovery.skills.count} discovered` : 'Local registry',
281
+ ? `${discovery.skills.count} skill file(s) are available. Open the Skills workspace to review, import, bundle, enable reusable procedures, or create a profile from discovered behavior.`
282
+ : 'Open the Skills workspace to manage reusable Agent procedures.',
283
+ defaultValue: discovery?.skills.count && discovery.skills.count > 0 ? `${discovery.skills.count} discovered` : 'Open Skills',
199
284
  },
200
285
  {
201
- kind: 'status',
286
+ kind: 'action',
202
287
  id: 'agent-local-state.routines',
288
+ action: 'open-agent-workspace:routines',
203
289
  label: 'Routines',
204
290
  hint: discovery?.routines.count && discovery.routines.count > 0
205
- ? `${discovery.routines.count} routine file(s) are available. Use the Profiles workspace to create a profile from discovered behavior, or preview individual files with /routines discover. ${discoverySample(discovery)}`
206
- : 'Use /routines for reusable local procedures. Starting a routine prints steps in the main conversation and does not launch local workers.',
207
- defaultValue: discovery?.routines.count && discovery.routines.count > 0 ? `${discovery.routines.count} discovered` : 'Local registry',
291
+ ? `${discovery.routines.count} routine file(s) are available. Open the Routines workspace to review, import, start, promote reviewed routines, or create a profile from discovered behavior. ${discoverySample(discovery)}`
292
+ : 'Open the Routines workspace for reusable local procedures. Starting a routine prints steps in the main conversation; schedule promotion remains explicit.',
293
+ defaultValue: discovery?.routines.count && discovery.routines.count > 0 ? `${discovery.routines.count} discovered` : 'Open Routines',
208
294
  },
209
295
  {
210
296
  kind: 'text',
211
297
  id: 'agent-local-state.persona-name',
212
298
  label: 'Initial persona name',
213
- hint: 'Optional: create and activate a serial Agent persona during setup. Leave persona fields blank to skip.',
299
+ hint: 'Optional serial Agent persona created and activated during setup. Leave persona fields blank to skip.',
214
300
  placeholder: 'Household Operator',
215
301
  defaultValue: '',
216
302
  spacerBeforeRows: 1,
@@ -236,7 +322,7 @@ export function buildLocalStateStep(discovery?: AgentBehaviorDiscoverySnapshot):
236
322
  kind: 'text',
237
323
  id: 'agent-local-state.skill-name',
238
324
  label: 'Initial skill name',
239
- hint: 'Optional: create and enable a reusable local procedure during setup.',
325
+ hint: 'Optional reusable local procedure created and enabled during setup.',
240
326
  placeholder: 'Daily Briefing',
241
327
  defaultValue: '',
242
328
  spacerBeforeRows: 1,
@@ -262,7 +348,7 @@ export function buildLocalStateStep(discovery?: AgentBehaviorDiscoverySnapshot):
262
348
  kind: 'text',
263
349
  id: 'agent-local-state.routine-name',
264
350
  label: 'Initial routine name',
265
- hint: 'Optional: create and enable a local routine. Routines print steps in the main conversation and do not launch hidden jobs.',
351
+ hint: 'Optional local routine created and enabled during setup. Routines print steps in the main conversation and do not launch hidden jobs.',
266
352
  placeholder: 'Evening Reset',
267
353
  defaultValue: '',
268
354
  spacerBeforeRows: 1,
@@ -302,18 +388,20 @@ export function buildAutomationStep(): OnboardingWizardStepDefinition {
302
388
  ],
303
389
  fields: [
304
390
  {
305
- kind: 'status',
391
+ kind: 'action',
306
392
  id: 'agent-automation.local-routines',
393
+ action: 'open-agent-workspace:routines',
307
394
  label: 'Local routine library',
308
- hint: 'Use /routines or the Agent workspace to create, review, enable, and start local routines without spawning hidden jobs.',
309
- defaultValue: 'Local registry',
395
+ hint: 'Open the Routines workspace to create, review, enable, and start local routines without hidden jobs.',
396
+ defaultValue: 'Open Routines',
310
397
  },
311
398
  {
312
- kind: 'status',
399
+ kind: 'action',
313
400
  id: 'agent-automation.schedule-observability',
401
+ action: 'open-agent-workspace:automation',
314
402
  label: 'Schedule observability',
315
- hint: 'Use /schedule list, /schedule reconcile, and automation views to inspect externally owned jobs and runs.',
316
- defaultValue: 'Read first',
403
+ hint: 'Open the Automation workspace to inspect schedules, receipts, reconciliation, externally owned jobs, and runs.',
404
+ defaultValue: 'Open Automation',
317
405
  },
318
406
  {
319
407
  kind: 'status',
@@ -347,11 +435,12 @@ export function buildVoiceMediaStep(): OnboardingWizardStepDefinition {
347
435
  ],
348
436
  fields: [
349
437
  {
350
- kind: 'status',
438
+ kind: 'action',
351
439
  id: 'agent-voice-media.voice',
440
+ action: 'open-agent-workspace:voice-media',
352
441
  label: 'Voice interaction',
353
- hint: 'Use the voice/media workspace and TTS settings to configure spoken responses for the Agent conversation.',
354
- defaultValue: 'Optional',
442
+ hint: 'Open the Voice & Media workspace and TTS settings to configure spoken responses for the Agent conversation.',
443
+ defaultValue: 'Open Voice',
355
444
  },
356
445
  {
357
446
  kind: 'status',
@@ -381,7 +470,7 @@ export function buildDelegationPolicyStep(): OnboardingWizardStepDefinition {
381
470
  summaryLines: [
382
471
  'Normal chat: main Agent conversation',
383
472
  'Build/fix/review: explicit GoodVibes TUI delegation',
384
- 'WRFC: only when explicitly requested for build/fix/review',
473
+ 'Delegated review: only when explicitly requested for build/fix/review',
385
474
  ],
386
475
  fields: [
387
476
  {
@@ -392,17 +481,18 @@ export function buildDelegationPolicyStep(): OnboardingWizardStepDefinition {
392
481
  defaultValue: 'Serial',
393
482
  },
394
483
  {
395
- kind: 'status',
484
+ kind: 'action',
396
485
  id: 'agent-delegation.build-work',
486
+ action: 'open-agent-workspace:delegate',
397
487
  label: 'Build/fix/review work',
398
- hint: 'Use /delegate with the full original task. GoodVibes TUI owns coding execution and WRFC chains.',
399
- defaultValue: 'Explicit delegation',
488
+ hint: 'Open the Delegation workspace for explicit build/fix/review handoff. GoodVibes TUI owns coding execution and delegated review chains.',
489
+ defaultValue: 'Open Delegation',
400
490
  },
401
491
  {
402
492
  kind: 'status',
403
- id: 'agent-delegation.wrfc',
404
- label: 'WRFC policy',
405
- hint: 'Agent never uses WRFC by default; request it only for explicit build, fix, review, or implementation work.',
493
+ id: 'agent-delegation.review',
494
+ label: 'Review policy',
495
+ hint: 'Agent never requests delegated review by default; request it only for explicit build, fix, review, or implementation work.',
406
496
  defaultValue: 'Explicit only',
407
497
  },
408
498
  ],