@pellux/goodvibes-agent 0.1.116 → 1.0.0

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 (285) hide show
  1. package/CHANGELOG.md +48 -661
  2. package/README.md +64 -57
  3. package/bin/goodvibes-agent.ts +16 -2
  4. package/dist/package/main.js +199180 -192185
  5. package/docs/README.md +15 -8
  6. package/docs/channels-remote-and-api.md +50 -0
  7. package/docs/connected-host.md +59 -0
  8. package/docs/getting-started.md +61 -50
  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 +48 -11
  13. package/docs/tools-and-commands.md +123 -0
  14. package/docs/voice-and-live-tts.md +51 -0
  15. package/package.json +3 -6
  16. package/src/agent/behavior-discovery-summary.ts +1 -3
  17. package/src/agent/channel-delivery.ts +201 -0
  18. package/src/agent/media-generation.ts +159 -0
  19. package/src/agent/memory-prompt.ts +0 -1
  20. package/src/agent/note-registry.ts +329 -0
  21. package/src/agent/operator-actions.ts +343 -0
  22. package/src/agent/persona-discovery.ts +1 -3
  23. package/src/agent/persona-registry.ts +19 -16
  24. package/src/agent/record-labels.ts +107 -0
  25. package/src/agent/reminder-schedule-format.ts +33 -24
  26. package/src/agent/reminder-schedule.ts +27 -26
  27. package/src/agent/routine-registry.ts +54 -14
  28. package/src/agent/routine-schedule-args.ts +2 -1
  29. package/src/agent/routine-schedule-format.ts +77 -53
  30. package/src/agent/routine-schedule-promotion.ts +35 -33
  31. package/src/agent/routine-schedule-receipts.ts +29 -27
  32. package/src/agent/runtime-profile-starters.ts +5 -5
  33. package/src/agent/runtime-profile.ts +91 -12
  34. package/src/agent/skill-registry.ts +210 -32
  35. package/src/cli/agent-knowledge-args.ts +5 -1
  36. package/src/cli/agent-knowledge-command.ts +40 -34
  37. package/src/cli/agent-knowledge-format.ts +80 -67
  38. package/src/cli/agent-knowledge-methods.ts +1 -1
  39. package/src/cli/agent-knowledge-runtime.ts +32 -26
  40. package/src/cli/bundle-command.ts +14 -9
  41. package/src/cli/config-overrides.ts +37 -36
  42. package/src/cli/entrypoint.ts +16 -7
  43. package/src/cli/external-runtime.ts +10 -4
  44. package/src/cli/help.ts +54 -29
  45. package/src/cli/local-library-command.ts +203 -83
  46. package/src/cli/management-commands.ts +105 -68
  47. package/src/cli/management.ts +55 -74
  48. package/src/cli/memory-command.ts +66 -32
  49. package/src/cli/parser.ts +37 -3
  50. package/src/cli/profiles-command.ts +166 -31
  51. package/src/cli/provider-auth-routes.ts +2 -1
  52. package/src/cli/routines-command.ts +176 -40
  53. package/src/cli/service-posture.ts +16 -16
  54. package/src/cli/status.ts +56 -135
  55. package/src/core/conversation-message-snapshot.ts +131 -0
  56. package/src/input/agent-workspace-access-command-editor-submission.ts +149 -0
  57. package/src/input/agent-workspace-access-command-editors.ts +170 -0
  58. package/src/input/agent-workspace-activation.ts +35 -8
  59. package/src/input/agent-workspace-basic-command-editor-submission.ts +351 -94
  60. package/src/input/agent-workspace-basic-command-editors.ts +502 -9
  61. package/src/input/agent-workspace-categories.ts +423 -51
  62. package/src/input/agent-workspace-channel-command-editor-submission.ts +83 -0
  63. package/src/input/agent-workspace-channel-command-editors.ts +65 -0
  64. package/src/input/agent-workspace-channels.ts +35 -2
  65. package/src/input/agent-workspace-command-editor.ts +41 -3
  66. package/src/input/agent-workspace-config-reader.ts +16 -0
  67. package/src/input/agent-workspace-delegation-editor-submission.ts +55 -0
  68. package/src/input/agent-workspace-editors.ts +166 -1
  69. package/src/input/agent-workspace-knowledge-command-editor-submission.ts +132 -0
  70. package/src/input/agent-workspace-knowledge-command-editors.ts +110 -0
  71. package/src/input/agent-workspace-knowledge-query-editor.ts +1 -1
  72. package/src/input/agent-workspace-learned-behavior.ts +67 -0
  73. package/src/input/agent-workspace-library-command-editor-submission.ts +50 -0
  74. package/src/input/agent-workspace-library-command-editors.ts +35 -0
  75. package/src/input/agent-workspace-local-operations.ts +218 -0
  76. package/src/input/agent-workspace-local-selection.ts +75 -0
  77. package/src/input/agent-workspace-mcp-command-editor-submission.ts +95 -0
  78. package/src/input/agent-workspace-media-command-editor-submission.ts +62 -0
  79. package/src/input/agent-workspace-media-command-editors.ts +27 -0
  80. package/src/input/agent-workspace-memory-command-editor-submission.ts +232 -0
  81. package/src/input/agent-workspace-memory-command-editors.ts +180 -0
  82. package/src/input/agent-workspace-memory-editor.ts +2 -2
  83. package/src/input/agent-workspace-navigation.ts +81 -0
  84. package/src/input/agent-workspace-notify-editor-submission.ts +121 -0
  85. package/src/input/agent-workspace-operations-command-editor-submission.ts +208 -0
  86. package/src/input/agent-workspace-operations-command-editors.ts +196 -0
  87. package/src/input/agent-workspace-panel-route.ts +43 -0
  88. package/src/input/agent-workspace-provider-command-editor-submission.ts +155 -0
  89. package/src/input/agent-workspace-provider-command-editors.ts +93 -0
  90. package/src/input/agent-workspace-reminder-schedule-editor.ts +1 -1
  91. package/src/input/agent-workspace-requirements.ts +11 -0
  92. package/src/input/agent-workspace-routine-schedule-editor.ts +2 -2
  93. package/src/input/agent-workspace-search.ts +169 -0
  94. package/src/input/agent-workspace-secret-editor-submission.ts +153 -0
  95. package/src/input/agent-workspace-session-command-editor-submission.ts +199 -0
  96. package/src/input/agent-workspace-session-command-editors.ts +249 -0
  97. package/src/input/agent-workspace-setup.ts +37 -16
  98. package/src/input/agent-workspace-skill-bundle-command-editor-submission.ts +101 -0
  99. package/src/input/agent-workspace-skill-bundle-command-editors.ts +110 -0
  100. package/src/input/agent-workspace-snapshot.ts +162 -21
  101. package/src/input/agent-workspace-task-command-editor-submission.ts +61 -0
  102. package/src/input/agent-workspace-task-command-editors.ts +47 -0
  103. package/src/input/agent-workspace-token.ts +18 -2
  104. package/src/input/agent-workspace-types.ts +212 -4
  105. package/src/input/agent-workspace-voice-media.ts +4 -7
  106. package/src/input/agent-workspace-web-research-editor.ts +104 -0
  107. package/src/input/agent-workspace-workplan-editor-submission.ts +153 -0
  108. package/src/input/agent-workspace.ts +178 -240
  109. package/src/input/command-registry.ts +5 -2
  110. package/src/input/commands/agent-runtime-profile-runtime.ts +126 -37
  111. package/src/input/commands/agent-skills-runtime.ts +149 -72
  112. package/src/input/commands/agent-workspace-runtime.ts +23 -6
  113. package/src/input/commands/brief-runtime.ts +55 -25
  114. package/src/input/commands/channels-runtime.ts +147 -33
  115. package/src/input/commands/compat-runtime.ts +32 -0
  116. package/src/input/commands/delegation-runtime.ts +29 -23
  117. package/src/input/commands/experience-runtime.ts +6 -4
  118. package/src/input/commands/guidance-runtime.ts +4 -4
  119. package/src/input/commands/health-runtime.ts +149 -126
  120. package/src/input/commands/knowledge.ts +82 -60
  121. package/src/input/commands/local-provider-runtime.ts +43 -21
  122. package/src/input/commands/local-runtime.ts +138 -16
  123. package/src/input/commands/local-setup-review.ts +10 -20
  124. package/src/input/commands/mcp-runtime.ts +63 -46
  125. package/src/input/commands/notify-runtime.ts +38 -9
  126. package/src/input/commands/operator-actions-runtime.ts +138 -0
  127. package/src/input/commands/operator-runtime.ts +6 -76
  128. package/src/input/commands/personas-runtime.ts +46 -31
  129. package/src/input/commands/planning-runtime.ts +1 -1
  130. package/src/input/commands/platform-access-runtime.ts +35 -98
  131. package/src/input/commands/product-runtime.ts +2 -2
  132. package/src/input/commands/provider-accounts-runtime.ts +60 -39
  133. package/src/input/commands/qrcode-runtime.ts +50 -9
  134. package/src/input/commands/recall-bundle.ts +11 -11
  135. package/src/input/commands/recall-capture.ts +13 -11
  136. package/src/input/commands/recall-query.ts +29 -21
  137. package/src/input/commands/recall-review.ts +2 -1
  138. package/src/input/commands/routines-runtime.ts +99 -45
  139. package/src/input/commands/runtime-services.ts +1 -14
  140. package/src/input/commands/schedule-runtime.ts +33 -20
  141. package/src/input/commands/security-runtime.ts +6 -11
  142. package/src/input/commands/session-content.ts +80 -78
  143. package/src/input/commands/session-workflow.ts +134 -104
  144. package/src/input/commands/session.ts +3 -174
  145. package/src/input/commands/shell-core.ts +38 -17
  146. package/src/input/commands/subscription-runtime.ts +54 -185
  147. package/src/input/commands/support-bundle-runtime.ts +53 -0
  148. package/src/input/commands/tasks-runtime.ts +21 -21
  149. package/src/input/commands/work-plan-runtime.ts +33 -8
  150. package/src/input/commands.ts +6 -2
  151. package/src/input/feed-context-factory.ts +2 -2
  152. package/src/input/file-picker.ts +3 -2
  153. package/src/input/handler-command-route.ts +4 -7
  154. package/src/input/handler-content-actions.ts +89 -26
  155. package/src/input/handler-feed-routes.ts +19 -12
  156. package/src/input/handler-feed.ts +6 -5
  157. package/src/input/handler-interactions.ts +9 -36
  158. package/src/input/handler-modal-stack.ts +3 -3
  159. package/src/input/handler-onboarding.ts +52 -91
  160. package/src/input/handler-shortcuts.ts +16 -7
  161. package/src/input/handler.ts +50 -23
  162. package/src/input/input-history.ts +5 -6
  163. package/src/input/keybindings.ts +27 -16
  164. package/src/input/mcp-workspace.ts +90 -26
  165. package/src/input/onboarding/handler-onboarding-routes.ts +3 -1
  166. package/src/input/onboarding/onboarding-wizard-apply.ts +62 -0
  167. package/src/input/onboarding/onboarding-wizard-constants.ts +1 -0
  168. package/src/input/onboarding/onboarding-wizard-helpers.ts +1 -1
  169. package/src/input/onboarding/onboarding-wizard-operator-steps.ts +223 -55
  170. package/src/input/onboarding/onboarding-wizard-steps.ts +59 -35
  171. package/src/input/onboarding/onboarding-wizard-types.ts +4 -1
  172. package/src/input/onboarding/onboarding-wizard.ts +87 -2
  173. package/src/input/profile-picker-modal.ts +31 -12
  174. package/src/input/session-picker-modal.ts +21 -4
  175. package/src/input/settings-modal-agent-policy.ts +6 -6
  176. package/src/input/settings-modal-behavior.ts +0 -3
  177. package/src/input/settings-modal-subscriptions.ts +3 -3
  178. package/src/input/settings-modal-types.ts +2 -13
  179. package/src/input/settings-modal.ts +20 -66
  180. package/src/input/submission-intent.ts +0 -1
  181. package/src/input/submission-router.ts +3 -3
  182. package/src/main.ts +18 -10
  183. package/src/panels/approval-panel.ts +8 -8
  184. package/src/panels/automation-control-panel.ts +4 -4
  185. package/src/panels/base-panel.ts +1 -1
  186. package/src/panels/builtin/agent.ts +1 -1
  187. package/src/panels/builtin/operations.ts +3 -12
  188. package/src/panels/builtin/session.ts +32 -24
  189. package/src/panels/builtin/shared.ts +7 -7
  190. package/src/panels/cost-tracker-panel.ts +1 -1
  191. package/src/panels/docs-panel.ts +5 -3
  192. package/src/panels/index.ts +0 -1
  193. package/src/panels/knowledge-panel.ts +6 -5
  194. package/src/panels/memory-panel.ts +7 -6
  195. package/src/panels/panel-list-panel.ts +36 -80
  196. package/src/panels/project-planning-panel.ts +19 -12
  197. package/src/panels/provider-account-snapshot.ts +51 -25
  198. package/src/panels/provider-accounts-panel.ts +33 -18
  199. package/src/panels/provider-health-domains.ts +48 -7
  200. package/src/panels/provider-health-panel.ts +5 -4
  201. package/src/panels/qr-panel.ts +44 -20
  202. package/src/panels/schedule-panel.ts +9 -17
  203. package/src/panels/security-panel.ts +8 -8
  204. package/src/panels/session-browser-panel.ts +10 -10
  205. package/src/panels/subscription-panel.ts +6 -6
  206. package/src/panels/system-messages-panel.ts +3 -3
  207. package/src/panels/tasks-panel.ts +21 -14
  208. package/src/panels/tool-inspector-panel.ts +19 -12
  209. package/src/panels/work-plan-panel.ts +5 -5
  210. package/src/planning/project-planning-coordinator.ts +3 -3
  211. package/src/provider-auth-route-display.ts +9 -0
  212. package/src/renderer/agent-workspace-style.ts +34 -0
  213. package/src/renderer/agent-workspace.ts +254 -57
  214. package/src/renderer/autocomplete-overlay.ts +25 -6
  215. package/src/renderer/block-actions.ts +1 -3
  216. package/src/renderer/bookmark-modal.ts +19 -4
  217. package/src/renderer/buffer.ts +4 -2
  218. package/src/renderer/context-inspector.ts +50 -13
  219. package/src/renderer/diff.ts +1 -1
  220. package/src/renderer/file-picker-overlay.ts +19 -6
  221. package/src/renderer/help-overlay.ts +112 -34
  222. package/src/renderer/history-search-overlay.ts +19 -4
  223. package/src/renderer/live-tail-modal.ts +27 -5
  224. package/src/renderer/mcp-workspace.ts +176 -43
  225. package/src/renderer/model-picker-overlay.ts +58 -3
  226. package/src/renderer/model-workspace.ts +104 -22
  227. package/src/renderer/onboarding/onboarding-wizard.ts +20 -4
  228. package/src/renderer/process-modal.ts +27 -6
  229. package/src/renderer/profile-picker-modal.ts +21 -5
  230. package/src/renderer/search-overlay.ts +25 -5
  231. package/src/renderer/selection-modal-overlay.ts +46 -14
  232. package/src/renderer/session-picker-modal.ts +18 -1
  233. package/src/renderer/settings-modal-helpers.ts +2 -40
  234. package/src/renderer/settings-modal.ts +88 -55
  235. package/src/renderer/system-message.ts +1 -1
  236. package/src/renderer/tool-call.ts +20 -11
  237. package/src/runtime/agent-runtime-events.ts +129 -0
  238. package/src/runtime/bootstrap-command-context.ts +7 -1
  239. package/src/runtime/bootstrap-command-parts.ts +11 -8
  240. package/src/runtime/bootstrap-core.ts +23 -65
  241. package/src/runtime/bootstrap-hook-bridge.ts +7 -18
  242. package/src/runtime/bootstrap-shell.ts +46 -8
  243. package/src/runtime/bootstrap.ts +36 -46
  244. package/src/runtime/connected-host-auth.ts +47 -0
  245. package/src/runtime/diagnostics/panels/index.ts +2 -2
  246. package/src/runtime/diagnostics/panels/panel-resources.ts +1 -1
  247. package/src/runtime/diagnostics/panels/policy.ts +7 -7
  248. package/src/runtime/index.ts +2 -5
  249. package/src/runtime/onboarding/apply-file-helpers.ts +66 -0
  250. package/src/runtime/onboarding/apply.ts +288 -74
  251. package/src/runtime/onboarding/derivation.ts +10 -13
  252. package/src/runtime/onboarding/snapshot.ts +2 -17
  253. package/src/runtime/onboarding/types.ts +34 -20
  254. package/src/runtime/onboarding/verify.ts +105 -4
  255. package/src/runtime/operator-token-cleanup.ts +3 -3
  256. package/src/runtime/services.ts +95 -11
  257. package/src/runtime/store/selectors/index.ts +3 -3
  258. package/src/runtime/store/state.ts +1 -4
  259. package/src/runtime/surface-feature-flags.ts +41 -6
  260. package/src/runtime/ui-read-models.ts +3 -4
  261. package/src/runtime/ui-services.ts +6 -6
  262. package/src/shell/blocking-input.ts +2 -1
  263. package/src/shell/service-settings-sync.ts +7 -7
  264. package/src/shell/ui-openers.ts +17 -38
  265. package/src/tools/agent-analysis-registry-policy.ts +0 -1
  266. package/src/tools/agent-channel-send-tool.ts +133 -0
  267. package/src/tools/agent-context-policy.ts +1 -1
  268. package/src/tools/agent-knowledge-ingest-tool.ts +405 -0
  269. package/src/tools/agent-knowledge-tool.ts +170 -0
  270. package/src/tools/agent-local-registry-tool.ts +279 -73
  271. package/src/tools/agent-media-generate-tool.ts +133 -0
  272. package/src/tools/agent-notify-tool.ts +143 -0
  273. package/src/tools/agent-operator-action-tool.ts +137 -0
  274. package/src/tools/agent-operator-briefing-tool.ts +217 -0
  275. package/src/tools/agent-reminder-schedule-tool.ts +237 -0
  276. package/src/tools/agent-tool-policy-guard.ts +13 -15
  277. package/src/tools/agent-work-plan-tool.ts +256 -0
  278. package/src/version.ts +1 -1
  279. package/docs/connected-services.md +0 -51
  280. package/src/cli/package-verification.ts +0 -274
  281. package/src/input/commands/policy-dispatch.ts +0 -339
  282. package/src/input/commands/policy.ts +0 -17
  283. package/src/panels/panel-picker.ts +0 -105
  284. package/src/panels/policy-panel.ts +0 -308
  285. package/src/renderer/panel-picker-overlay.ts +0 -202
@@ -17,6 +17,7 @@ export type OnboardingWizardStepId =
17
17
  | 'agent-communication'
18
18
  | 'agent-tools'
19
19
  | 'agent-knowledge'
20
+ | 'agent-research'
20
21
  | 'agent-local-state'
21
22
  | 'agent-automation'
22
23
  | 'agent-voice-media'
@@ -40,7 +41,8 @@ export type OnboardingWizardAction =
40
41
  | 'apply'
41
42
  | 'apply-and-continue'
42
43
  | 'start-openai-subscription'
43
- | 'finish-openai-subscription';
44
+ | 'finish-openai-subscription'
45
+ | `open-agent-workspace:${string}`;
44
46
 
45
47
  export type OnboardingWizardApplyFeedbackSeverity = 'info' | 'warning' | 'error';
46
48
 
@@ -87,6 +89,7 @@ export interface OnboardingWizardTextFieldDefinition extends OnboardingWizardFie
87
89
  readonly defaultValue: string;
88
90
  readonly placeholder: string;
89
91
  readonly required?: boolean;
92
+ readonly multiline?: boolean;
90
93
  }
91
94
 
92
95
  export interface OnboardingWizardMaskedFieldDefinition extends OnboardingWizardFieldBase {
@@ -295,6 +295,12 @@ export class OnboardingWizardController {
295
295
  return this.editingFieldId !== null;
296
296
  }
297
297
 
298
+ public isEditingMultilineTextField(): boolean {
299
+ if (this.editingFieldId === null) return false;
300
+ const field = this.getFieldById(this.editingFieldId);
301
+ return field?.kind === 'text' && field.multiline === true;
302
+ }
303
+
298
304
  public getFieldWindow(visibleFields: number): OnboardingWizardFieldWindow {
299
305
  const fields = this.currentStep.fields;
300
306
  const total = fields.length;
@@ -408,7 +414,7 @@ export class OnboardingWizardController {
408
414
  const field = this.getSelectedField();
409
415
  if (!field || (field.kind !== 'text' && field.kind !== 'masked')) return false;
410
416
  this.beginEdit(field.id);
411
- this.editBuffer = initialText;
417
+ this.editBuffer = this.prepareTextInput(initialText);
412
418
  return true;
413
419
  }
414
420
 
@@ -432,7 +438,13 @@ export class OnboardingWizardController {
432
438
 
433
439
  public editChar(char: string): void {
434
440
  if (this.editingFieldId === null || char.length === 0) return;
435
- this.editBuffer += char;
441
+ this.editBuffer += this.prepareTextInput(char);
442
+ }
443
+
444
+ public editNewline(): boolean {
445
+ if (!this.isEditingMultilineTextField()) return false;
446
+ this.editBuffer += '\n';
447
+ return true;
436
448
  }
437
449
 
438
450
  public editBackspace(): void {
@@ -455,6 +467,11 @@ export class OnboardingWizardController {
455
467
  return true;
456
468
  }
457
469
 
470
+ private prepareTextInput(text: string): string {
471
+ if (this.isEditingMultilineTextField()) return text.replace(/\r\n?/g, '\n');
472
+ return text.replace(/[\r\n]+/g, ' ');
473
+ }
474
+
458
475
  public setFieldValue(fieldId: string, value: boolean | string): void {
459
476
  const field = this.getFieldById(fieldId);
460
477
  if (!field) return;
@@ -604,3 +621,71 @@ export class OnboardingWizardController {
604
621
  public isFieldDirtyByDefinition(field: OnboardingWizardFieldDefinition): boolean { return isFieldDirtyByDefinitionForController(this, field); }
605
622
  public isFieldSatisfied(field: OnboardingWizardFieldDefinition): boolean { return isFieldSatisfiedForController(this, field); }
606
623
  }
624
+
625
+ function pushOnboardingPackageText(lines: string[], ...values: readonly (string | undefined)[]): void {
626
+ for (const value of values) {
627
+ const normalized = normalizeText(value);
628
+ if (normalized.length > 0) lines.push(normalized);
629
+ }
630
+ }
631
+
632
+ function appendOnboardingFieldPackageText(
633
+ lines: string[],
634
+ wizard: OnboardingWizardController,
635
+ field: OnboardingWizardFieldDefinition,
636
+ ): void {
637
+ pushOnboardingPackageText(lines, field.kind, field.id, field.label, field.hint, wizard.getFieldValueLabel(field));
638
+
639
+ if (field.kind === 'text' || field.kind === 'masked') {
640
+ pushOnboardingPackageText(lines, field.placeholder, field.defaultValue);
641
+ return;
642
+ }
643
+
644
+ if (field.kind === 'radio') {
645
+ for (const option of field.options) {
646
+ pushOnboardingPackageText(lines, option.id, option.label, option.hint);
647
+ }
648
+ return;
649
+ }
650
+
651
+ if (field.kind === 'action') {
652
+ pushOnboardingPackageText(lines, field.action, field.defaultValue);
653
+ return;
654
+ }
655
+
656
+ if (field.kind === 'acknowledgement') {
657
+ pushOnboardingPackageText(lines, field.reason);
658
+ return;
659
+ }
660
+
661
+ if (field.kind === 'modelPicker') {
662
+ pushOnboardingPackageText(
663
+ lines,
664
+ field.target,
665
+ field.defaultSelection.providerId,
666
+ field.defaultSelection.modelId,
667
+ );
668
+ }
669
+ }
670
+
671
+ export function renderOnboardingWizardPackageText(): string {
672
+ const wizard = new OnboardingWizardController();
673
+ const lines: string[] = ['GoodVibes Agent onboarding wizard'];
674
+
675
+ for (const step of wizard.steps) {
676
+ pushOnboardingPackageText(
677
+ lines,
678
+ step.id,
679
+ step.shortLabel,
680
+ step.title,
681
+ step.description,
682
+ step.summaryTitle,
683
+ ...step.summaryLines,
684
+ );
685
+ for (const field of step.fields) {
686
+ appendOnboardingFieldPackageText(lines, wizard, field);
687
+ }
688
+ }
689
+
690
+ return lines.join('\n');
691
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * ProfilePickerModal — state management for the /profiles picker modal.
2
+ * ProfilePickerModal — state management for the Agent profile picker modal.
3
3
  *
4
4
  * Lists profiles from ProfileManager.list(), tracks selected index,
5
5
  * and handles load actions.
@@ -24,20 +24,39 @@ const BEHAVIOR_KEYS: ConfigKey[] = [
24
24
  'behavior.saveHistory', 'behavior.notifyOnComplete',
25
25
  ] as const;
26
26
 
27
+ function configProfileDeletionDisabledMessage(name: string): string {
28
+ return `Config-profile deletion is disabled in Agent for ${name}. Open Agent Workspace -> Profiles for isolated Agent profile homes.`;
29
+ }
30
+
31
+ function configProfileSavingDisabledMessage(name: string): string {
32
+ return `Config-profile saving is disabled in Agent for ${name}. Open Agent Workspace -> Profiles to create isolated Agent homes.`;
33
+ }
34
+
35
+ export function renderProfilePickerStatePackageText(): string {
36
+ return [
37
+ 'Profile name cannot be empty',
38
+ 'Loaded profile',
39
+ 'Saved profile',
40
+ 'Error',
41
+ configProfileDeletionDisabledMessage('<profile>'),
42
+ configProfileSavingDisabledMessage('<profile>'),
43
+ ].join('\n');
44
+ }
45
+
27
46
  /**
28
47
  * Apply a profile data category to the config manager.
29
48
  * Iterates only known/valid keys rather than open-ended Object.entries.
30
49
  */
31
50
  function applyProfileCategory(
32
51
  cm: ConfigManager,
33
- data: Record<string, unknown>,
52
+ data: object,
34
53
  keys: ConfigKey[],
35
54
  ): void {
36
55
  for (const key of keys) {
37
56
  const field = key.split('.')[1];
38
- if (field && Object.prototype.hasOwnProperty.call(data, field)) {
57
+ if (field && Object.hasOwn(data, field)) {
39
58
  try {
40
- cm.setDynamic(key, data[field]);
59
+ cm.setDynamic(key, Reflect.get(data, field));
41
60
  } catch (e) { logger.debug('applyProfileCategory: key set failed', { key, error: summarizeError(e) }); }
42
61
  }
43
62
  }
@@ -114,7 +133,7 @@ export class ProfilePickerModal {
114
133
 
115
134
  // Apply display settings using validated key list
116
135
  if (data.display) {
117
- applyProfileCategory(configManager, data.display as Record<string, unknown>, DISPLAY_KEYS);
136
+ applyProfileCategory(configManager, data.display, DISPLAY_KEYS);
118
137
  }
119
138
 
120
139
  // Apply provider settings (model + reasoningEffort only)
@@ -129,14 +148,14 @@ export class ProfilePickerModal {
129
148
 
130
149
  // Apply behavior settings using validated key list
131
150
  if (data.behavior) {
132
- applyProfileCategory(configManager, data.behavior as Record<string, unknown>, BEHAVIOR_KEYS);
151
+ applyProfileCategory(configManager, data.behavior, BEHAVIOR_KEYS);
133
152
  }
134
153
 
135
154
  configManager.save();
136
- this.statusMessage = `Loaded profile: ${profile.name}`;
155
+ this.statusMessage = `Loaded profile ${profile.name}`;
137
156
  return true;
138
157
  } catch (e) {
139
- this.statusMessage = `Error: ${summarizeError(e)}`;
158
+ this.statusMessage = `Error ${summarizeError(e)}`;
140
159
  return false;
141
160
  }
142
161
  }
@@ -145,7 +164,7 @@ export class ProfilePickerModal {
145
164
  const profile = this.getSelected();
146
165
  if (!profile) return false;
147
166
  this.deleteConfirmationTarget = null;
148
- this.statusMessage = `Deletion requires an explicit command: /profiles delete ${profile.name} --yes`;
167
+ this.statusMessage = configProfileDeletionDisabledMessage(profile.name);
149
168
  return false;
150
169
  }
151
170
 
@@ -158,7 +177,7 @@ export class ProfilePickerModal {
158
177
  return false;
159
178
  }
160
179
  void configManager;
161
- this.statusMessage = `Saving requires an explicit command: /profiles save ${name} --yes`;
180
+ this.statusMessage = configProfileSavingDisabledMessage(name);
162
181
  return false;
163
182
  }
164
183
 
@@ -182,11 +201,11 @@ export class ProfilePickerModal {
182
201
 
183
202
  // Reload list
184
203
  this.profiles = this.profileManager.list();
185
- this.statusMessage = `Saved profile: ${name}`;
204
+ this.statusMessage = `Saved profile ${name}`;
186
205
  this._clampScroll();
187
206
  return true;
188
207
  } catch (e) {
189
- this.statusMessage = `Error: ${summarizeError(e)}`;
208
+ this.statusMessage = `Error ${summarizeError(e)}`;
190
209
  return false;
191
210
  }
192
211
  }
@@ -8,6 +8,23 @@
8
8
  import type { SessionInfo, SessionManager } from '@pellux/goodvibes-sdk/platform/sessions';
9
9
  import type { ConversationManager } from '../core/conversation';
10
10
  import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
11
+ import { readConversationMessageSnapshots } from '../core/conversation-message-snapshot.ts';
12
+
13
+ function sessionLoadedMessage(name: string, messageCount: number): string {
14
+ return `Loaded session ${name} (${messageCount} messages)`;
15
+ }
16
+
17
+ function sessionDeletionCommandRequiredMessage(name: string): string {
18
+ return `Deletion requires an explicit command: /session delete ${name} --yes`;
19
+ }
20
+
21
+ export function renderSessionPickerStatePackageText(): string {
22
+ return [
23
+ 'Loaded session <session> (<count> messages)',
24
+ 'Error',
25
+ sessionDeletionCommandRequiredMessage('<session>'),
26
+ ].join('\n');
27
+ }
11
28
 
12
29
  // ---------------------------------------------------------------------------
13
30
  // SessionPickerModal
@@ -78,13 +95,13 @@ export class SessionPickerModal {
78
95
  try {
79
96
  const { meta, messages } = this.sessionManager.load(session.name);
80
97
  conversationManager.resetAll();
81
- conversationManager.fromJSON({ messages: messages as never[] });
98
+ conversationManager.fromJSON({ messages: readConversationMessageSnapshots(messages) });
82
99
  if (meta.title) conversationManager.title = meta.title;
83
100
  conversationManager.rebuildHistory();
84
- this.statusMessage = `Loaded: ${session.name} (${messages.length} messages)`;
101
+ this.statusMessage = sessionLoadedMessage(session.name, messages.length);
85
102
  return true;
86
103
  } catch (e) {
87
- this.statusMessage = `Error: ${summarizeError(e)}`;
104
+ this.statusMessage = `Error ${summarizeError(e)}`;
88
105
  return false;
89
106
  }
90
107
  }
@@ -93,7 +110,7 @@ export class SessionPickerModal {
93
110
  const session = this.getSelected();
94
111
  if (!session) return false;
95
112
  this.deleteConfirmationTarget = null;
96
- this.statusMessage = `Deletion requires an explicit command: /session delete ${session.name} --yes`;
113
+ this.statusMessage = sessionDeletionCommandRequiredMessage(session.name);
97
114
  return false;
98
115
  }
99
116
 
@@ -1,4 +1,4 @@
1
- export const AGENT_EXTERNAL_DAEMON_SETTING_LOCK_REASON = 'GoodVibes Agent uses connected GoodVibes services. Change service lifecycle and bind posture from the owning host; Agent settings are read-only for those controls.';
1
+ export const AGENT_EXTERNAL_HOST_SETTING_LOCK_REASON = 'GoodVibes Agent uses a connected GoodVibes host. Change host lifecycle and bind posture from the owning host; Agent settings are read-only for those controls.';
2
2
 
3
3
  const AGENT_HIDDEN_SETTING_PREFIXES = [
4
4
  ['cloud', 'flare.'].join(''),
@@ -21,21 +21,21 @@ const AGENT_HIDDEN_SETTING_KEYS = new Set<string>([
21
21
  'ui.wrfcMessages',
22
22
  ]);
23
23
 
24
- const EXTERNAL_DAEMON_SETTING_PREFIXES = [
24
+ const EXTERNAL_HOST_SETTING_PREFIXES = [
25
25
  'service.',
26
26
  'controlPlane.',
27
27
  'httpListener.',
28
28
  'web.',
29
29
  ] as const;
30
30
 
31
- const EXTERNAL_DAEMON_SETTING_KEYS = new Set<string>([
31
+ const EXTERNAL_HOST_SETTING_KEYS = new Set<string>([
32
32
  'danger.daemon',
33
33
  'danger.httpListener',
34
34
  ]);
35
35
 
36
- export function isExternalDaemonOwnedSettingKey(key: string): boolean {
37
- return EXTERNAL_DAEMON_SETTING_KEYS.has(key)
38
- || EXTERNAL_DAEMON_SETTING_PREFIXES.some((prefix) => key.startsWith(prefix));
36
+ export function isExternalHostOwnedSettingKey(key: string): boolean {
37
+ return EXTERNAL_HOST_SETTING_KEYS.has(key)
38
+ || EXTERNAL_HOST_SETTING_PREFIXES.some((prefix) => key.startsWith(prefix));
39
39
  }
40
40
 
41
41
  export function isAgentHiddenSettingKey(key: string): boolean {
@@ -30,8 +30,5 @@ export function getNumericAdjustmentMeta(setting: ConfigSetting): {
30
30
  max?: number;
31
31
  precision: number;
32
32
  } {
33
- if (setting.key === 'wrfc.scoreThreshold') {
34
- return { step: 0.1, min: 0, max: 10, precision: 1 };
35
- }
36
33
  return { step: 1, precision: 0 };
37
34
  }
@@ -23,7 +23,7 @@ export function buildSubscriptionEntries(
23
23
  activeRoute: 'unconfigured',
24
24
  authFreshness: 'unconfigured',
25
25
  routeReason: 'Built-in subscription adapter is available, but no active subscription session is stored yet.',
26
- nextActions: [`Use /subscription login ${provider} start --yes to begin browser sign-in.`],
26
+ nextActions: [`Open Agent Workspace -> Setup -> Start subscription login for ${provider}.`],
27
27
  });
28
28
  }
29
29
 
@@ -38,7 +38,7 @@ export function buildSubscriptionEntries(
38
38
  activeRoute: providers.get(provider)?.activeRoute ?? 'unconfigured',
39
39
  authFreshness: providers.get(provider)?.authFreshness ?? 'unconfigured',
40
40
  routeReason: providers.get(provider)?.routeReason ?? 'OAuth metadata is configured for this provider.',
41
- nextActions: providers.get(provider)?.nextActions ?? [`Use /subscription login ${provider} start --yes to begin browser sign-in.`],
41
+ nextActions: providers.get(provider)?.nextActions ?? [`Open Agent Workspace -> Setup -> Start subscription login for ${provider}.`],
42
42
  });
43
43
  }
44
44
 
@@ -51,7 +51,7 @@ export function buildSubscriptionEntries(
51
51
  activeRoute: 'unconfigured',
52
52
  authFreshness: 'pending',
53
53
  routeReason: 'OAuth login is pending completion for this provider.',
54
- nextActions: [`Finish /subscription login ${pending.provider} finish <code> --yes to activate this session.`],
54
+ nextActions: [`Open Agent Workspace -> Setup -> Finish subscription login for ${pending.provider}.`],
55
55
  });
56
56
  }
57
57
 
@@ -27,27 +27,16 @@ export type SettingsCategory =
27
27
  | 'behavior'
28
28
  | 'storage'
29
29
  | 'permissions'
30
- | 'orchestration'
31
- | 'wrfc'
32
30
  | 'tools'
33
31
  | 'helper'
34
32
  | 'tts'
35
- | 'service'
36
- | 'controlPlane'
37
- | 'httpListener'
38
- | 'web'
39
- | 'network'
40
33
  | 'surfaces'
41
- | 'batch'
42
34
  | 'automation'
43
- | 'watchers'
44
- | 'runtime'
45
35
  | 'telemetry'
46
36
  | 'cache'
47
37
  | 'mcp'
48
38
  | 'flags'
49
- | 'release'
50
- | 'danger';
39
+ | 'release';
51
40
 
52
41
  export type SettingsFocusPane = 'categories' | 'settings';
53
42
 
@@ -57,7 +46,7 @@ export const SETTINGS_CATEGORY_GROUPS: ReadonlyArray<{
57
46
  }> = [
58
47
  { label: 'Agent Experience', categories: ['display', 'ui', 'behavior', 'permissions'] },
59
48
  { label: 'Models and Providers', categories: ['provider', 'subscriptions', 'helper', 'tools', 'tts'] },
60
- { label: 'Local Agent State', categories: ['storage', 'cache', 'telemetry'] },
49
+ { label: 'Agent-local state', categories: ['storage', 'cache', 'telemetry'] },
61
50
  { label: 'Channels and Tools', categories: ['surfaces', 'mcp', 'automation'] },
62
51
  { label: 'Advanced', categories: ['flags', 'release'] },
63
52
  ];
@@ -34,7 +34,7 @@ import {
34
34
  type SettingsModalOpenOptions,
35
35
  type SubscriptionEntry,
36
36
  } from './settings-modal-types.ts';
37
- import { AGENT_EXTERNAL_DAEMON_SETTING_LOCK_REASON, isAgentHiddenSettingKey, isExternalDaemonOwnedSettingKey } from './settings-modal-agent-policy.ts';
37
+ import { AGENT_EXTERNAL_HOST_SETTING_LOCK_REASON, isAgentHiddenSettingKey, isExternalHostOwnedSettingKey } from './settings-modal-agent-policy.ts';
38
38
 
39
39
  export {
40
40
  SETTINGS_CATEGORIES,
@@ -50,7 +50,7 @@ export {
50
50
  type SettingsModalOpenOptions,
51
51
  type SubscriptionEntry,
52
52
  } from './settings-modal-types.ts';
53
- export { AGENT_EXTERNAL_DAEMON_SETTING_LOCK_REASON, isExternalDaemonOwnedSettingKey } from './settings-modal-agent-policy.ts';
53
+ export { AGENT_EXTERNAL_HOST_SETTING_LOCK_REASON, isExternalHostOwnedSettingKey } from './settings-modal-agent-policy.ts';
54
54
  export { isAgentHiddenSettingKey } from './settings-modal-agent-policy.ts';
55
55
 
56
56
  // ---------------------------------------------------------------------------
@@ -99,12 +99,6 @@ export class SettingsModal {
99
99
  /** Provider subscription entries (populated when subscriptions tab is active). */
100
100
  public subscriptionEntries: SubscriptionEntry[] = [];
101
101
 
102
- /**
103
- * Set after a network-category save that touches controlPlane or httpListener
104
- * config keys. Renderer reads this to display a transient restart notice.
105
- * Cleared on next open() or close().
106
- */
107
- public lastSaveTriggeredRestart: 'control-plane' | 'http-listener' | 'web' | null = null;
108
102
  public lastSettingEffectMessage: string | null = null;
109
103
 
110
104
  private configManager: ConfigManager | null = null;
@@ -151,7 +145,6 @@ export class SettingsModal {
151
145
  this.pendingSettingsPickerAction = null;
152
146
  this.mcpAllowAllConfirmationTarget = null;
153
147
  this.subscriptionLogoutConfirmationTarget = null;
154
- this.lastSaveTriggeredRestart = null;
155
148
  this.lastSettingEffectMessage = null;
156
149
  this.active = true;
157
150
  }
@@ -165,7 +158,6 @@ export class SettingsModal {
165
158
  this.pendingSettingsPickerAction = null;
166
159
  this.mcpAllowAllConfirmationTarget = null;
167
160
  this.subscriptionLogoutConfirmationTarget = null;
168
- this.lastSaveTriggeredRestart = null;
169
161
  this.lastSettingEffectMessage = null;
170
162
  this.serviceRegistry = null;
171
163
  this.secretsManager = null;
@@ -352,7 +344,7 @@ export class SettingsModal {
352
344
 
353
345
  const entry = this.getSelected();
354
346
  if (!entry || !this.configManager) return;
355
- if (this._blockExternalDaemonOwnedSetting(entry)) return;
347
+ if (this._blockExternalHostOwnedSetting(entry)) return;
356
348
 
357
349
  const { setting } = entry;
358
350
 
@@ -417,7 +409,7 @@ export class SettingsModal {
417
409
 
418
410
  const entry = this.getSelected();
419
411
  if (!entry || !this.configManager) return;
420
- if (this._blockExternalDaemonOwnedSetting(entry)) return;
412
+ if (this._blockExternalHostOwnedSetting(entry)) return;
421
413
  const { setting } = entry;
422
414
 
423
415
  if (setting.type === 'boolean') {
@@ -452,8 +444,9 @@ export class SettingsModal {
452
444
  /**
453
445
  * Toggle the currently selected feature flag.
454
446
  *
455
- * Killed flags cannot be toggled. Non-runtimeToggleable flags toggle in config
456
- * only (require restart). runtimeToggleable flags toggle immediately.
447
+ * Killed flags cannot be toggled. Non-runtimeToggleable flags are saved as
448
+ * overrides for the next Agent launch or owning-host reload; runtimeToggleable
449
+ * flags toggle immediately.
457
450
  */
458
451
  toggleSelectedFlag(): void {
459
452
  const flagEntry = this.getSelectedFlag();
@@ -474,7 +467,7 @@ export class SettingsModal {
474
467
  const { flag } = flagEntry;
475
468
 
476
469
  if (!flag.runtimeToggleable) {
477
- // Persist to config only takes effect on restart
470
+ // Persist to config only; the flag owner applies it on the next run.
478
471
  this._persistFlagState(flag.id, newState, flag.defaultState as FlagState);
479
472
  flagEntry.state = newState;
480
473
  } else {
@@ -539,7 +532,7 @@ export class SettingsModal {
539
532
 
540
533
  const entry = this.getSelected();
541
534
  if (!entry || !this.configManager) return false;
542
- if (this._blockExternalDaemonOwnedSetting(entry)) {
535
+ if (this._blockExternalHostOwnedSetting(entry)) {
543
536
  this.editingMode = false;
544
537
  this.editBuffer = '';
545
538
  return false;
@@ -590,7 +583,7 @@ export class SettingsModal {
590
583
  if (this.editingMode || !this.configManager) return null;
591
584
  const entry = this.getSelected();
592
585
  if (!entry) return null;
593
- if (this._blockExternalDaemonOwnedSetting(entry)) return null;
586
+ if (this._blockExternalHostOwnedSetting(entry)) return null;
594
587
  const key = entry.setting.key as ConfigKey;
595
588
  this._setValue(key, entry.setting.default);
596
589
  if (isSecretConfigKey(key) && this.secretsManager) {
@@ -627,21 +620,18 @@ export class SettingsModal {
627
620
  const cat = rawCat as SettingsCategory;
628
621
  const currentValue = configManager.get(setting.key as ConfigKey);
629
622
  const resolved = getResolvedSettingLookup(configManager, setting.key as ConfigKey)?.entry;
630
- const daemonOwned = isExternalDaemonOwnedSettingKey(setting.key);
623
+ const hostOwned = isExternalHostOwnedSettingKey(setting.key);
631
624
  const entry: SettingEntry = {
632
625
  setting,
633
626
  currentValue,
634
627
  isDefault: currentValue === setting.default,
635
628
  effectiveSource: resolved?.effectiveSource,
636
- locked: daemonOwned || resolved?.locked,
629
+ locked: hostOwned || resolved?.locked,
637
630
  conflict: resolved?.conflict,
638
631
  sourceLabel: resolved?.sourceLabel,
639
- lockReason: daemonOwned ? AGENT_EXTERNAL_DAEMON_SETTING_LOCK_REASON : resolved?.lockReason,
632
+ lockReason: hostOwned ? AGENT_EXTERNAL_HOST_SETTING_LOCK_REASON : resolved?.lockReason,
640
633
  };
641
634
  if (this.groups.has(cat)) this.groups.get(cat)!.push(entry);
642
- if ((rawCat === 'controlPlane' || rawCat === 'httpListener' || rawCat === 'web') && this.groups.has('network')) {
643
- this.groups.get('network')!.push(entry);
644
- }
645
635
  }
646
636
 
647
637
  const uiEntries = this.groups.get('ui');
@@ -649,8 +639,7 @@ export class SettingsModal {
649
639
  const uiPriority: Record<string, number> = {
650
640
  'ui.systemMessages': 0,
651
641
  'ui.operationalMessages': 1,
652
- 'ui.wrfcMessages': 2,
653
- 'ui.voiceEnabled': 3,
642
+ 'ui.voiceEnabled': 2,
654
643
  };
655
644
  uiEntries.sort((a, b) => (uiPriority[a.setting.key] ?? 99) - (uiPriority[b.setting.key] ?? 99));
656
645
  }
@@ -712,25 +701,7 @@ export class SettingsModal {
712
701
  /** Returns [] for the flags category (flags use flagEntries instead). */
713
702
  private _currentItems(): SettingEntry[] {
714
703
  if (this.currentCategory === 'flags' || this.currentCategory === 'mcp' || this.currentCategory === 'subscriptions') return [];
715
- const items = this.groups.get(this.currentCategory) ?? [];
716
- if (this.currentCategory === 'network') {
717
- return items.filter(entry => {
718
- if (entry.setting.key === 'controlPlane.host') {
719
- const hostMode = this.configManager?.get('controlPlane.hostMode');
720
- return hostMode === 'custom';
721
- }
722
- if (entry.setting.key === 'httpListener.host') {
723
- const hostMode = this.configManager?.get('httpListener.hostMode');
724
- return hostMode === 'custom';
725
- }
726
- if (entry.setting.key === 'web.host') {
727
- const hostMode = this.configManager?.get('web.hostMode');
728
- return hostMode === 'custom';
729
- }
730
- return true;
731
- });
732
- }
733
- return items;
704
+ return this.groups.get(this.currentCategory) ?? [];
734
705
  }
735
706
 
736
707
  private _refreshAllEntries(): void {
@@ -745,30 +716,13 @@ export class SettingsModal {
745
716
 
746
717
  private _setValue(key: ConfigKey, value: unknown): void {
747
718
  if (!this.configManager) return;
748
- if (isExternalDaemonOwnedSettingKey(key)) {
749
- this.lastSettingEffectMessage = AGENT_EXTERNAL_DAEMON_SETTING_LOCK_REASON;
719
+ if (isExternalHostOwnedSettingKey(key)) {
720
+ this.lastSettingEffectMessage = AGENT_EXTERNAL_HOST_SETTING_LOCK_REASON;
750
721
  return;
751
722
  }
752
- // Diff previous value before writing — avoids false restart notices on no-op saves
753
723
  const previousValue = this.configManager.get(key);
754
- const isRestartKey = ['host', 'port', 'hostMode', 'enabled'].includes(key.split('.')[1] ?? '');
755
724
  try {
756
725
  this.configManager.setDynamic(key, value);
757
- const rawCat = key.split('.')[0] as string;
758
- if (rawCat === 'controlPlane') {
759
- if (isRestartKey && previousValue !== value) {
760
- this.lastSaveTriggeredRestart = 'control-plane';
761
- }
762
- } else if (rawCat === 'httpListener') {
763
- if (isRestartKey && previousValue !== value) {
764
- this.lastSaveTriggeredRestart = 'http-listener';
765
- }
766
- } else if (rawCat === 'web') {
767
- if (isRestartKey && previousValue !== value) {
768
- this.lastSaveTriggeredRestart = 'web';
769
- }
770
- }
771
-
772
726
  for (const entries of this.groups.values()) {
773
727
  const entry = entries.find((candidate) => candidate.setting.key === key);
774
728
  if (entry) {
@@ -787,9 +741,9 @@ export class SettingsModal {
787
741
  }
788
742
  }
789
743
 
790
- private _blockExternalDaemonOwnedSetting(entry: SettingEntry): boolean {
791
- if (!isExternalDaemonOwnedSettingKey(entry.setting.key)) return false;
792
- this.lastSettingEffectMessage = entry.lockReason ?? AGENT_EXTERNAL_DAEMON_SETTING_LOCK_REASON;
744
+ private _blockExternalHostOwnedSetting(entry: SettingEntry): boolean {
745
+ if (!isExternalHostOwnedSettingKey(entry.setting.key)) return false;
746
+ this.lastSettingEffectMessage = entry.lockReason ?? AGENT_EXTERNAL_HOST_SETTING_LOCK_REASON;
793
747
  return true;
794
748
  }
795
749
 
@@ -5,7 +5,6 @@ export type SubmissionIntentKind =
5
5
  | 'orchestration'
6
6
  | 'delegation'
7
7
  | 'plan'
8
- | 'panel-action'
9
8
  | 'shell'
10
9
  | 'memory-pin';
11
10
 
@@ -23,8 +23,8 @@ export function routeSubmissionIntent(input: SubmissionRouterInput): SubmissionI
23
23
 
24
24
  if (!trimmed) {
25
25
  return {
26
- kind: input.panelFocused ? 'panel-action' : 'empty',
27
- label: input.panelFocused ? 'panel action' : 'prompt',
26
+ kind: 'empty',
27
+ label: 'prompt',
28
28
  hasAttachments,
29
29
  };
30
30
  }
@@ -46,7 +46,7 @@ export function routeSubmissionIntent(input: SubmissionRouterInput): SubmissionI
46
46
  return { kind: 'delegation', label: 'TUI delegation', commandName, hasAttachments };
47
47
  }
48
48
  if (PANEL_COMMANDS.has(commandName)) {
49
- return { kind: 'panel-action', label: 'panel action', commandName, hasAttachments };
49
+ return { kind: 'slash-command', label: 'Agent workspace', commandName, hasAttachments };
50
50
  }
51
51
  if (ORCHESTRATION_COMMANDS.has(commandName)) {
52
52
  return { kind: 'orchestration', label: 'orchestration', commandName, hasAttachments };