@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
@@ -58,19 +58,19 @@ export interface UiPlatformServices {
58
58
  readonly policyRuntimeState: RuntimeServices['policyRuntimeState'];
59
59
  readonly externalServices?: {
60
60
  inspect(): {
61
- readonly daemonRunning: boolean;
62
- readonly daemonPortInUse?: boolean;
61
+ readonly connectedHostRunning: boolean;
62
+ readonly connectedHostPortInUse?: boolean;
63
63
  readonly httpListenerRunning: boolean;
64
64
  readonly httpListenerPortInUse?: boolean;
65
- readonly daemonStatus?: HostServiceStatus;
65
+ readonly connectedHostStatus?: HostServiceStatus;
66
66
  readonly httpListenerStatus?: HostServiceStatus;
67
67
  };
68
68
  restart(): Promise<{
69
- readonly daemonRunning: boolean;
70
- readonly daemonPortInUse?: boolean;
69
+ readonly connectedHostRunning: boolean;
70
+ readonly connectedHostPortInUse?: boolean;
71
71
  readonly httpListenerRunning: boolean;
72
72
  readonly httpListenerPortInUse?: boolean;
73
- readonly daemonStatus?: HostServiceStatus;
73
+ readonly connectedHostStatus?: HostServiceStatus;
74
74
  readonly httpListenerStatus?: HostServiceStatus;
75
75
  }>;
76
76
  };
@@ -2,6 +2,7 @@ import type { ConversationManager } from '../core/conversation';
2
2
  import type { PermissionRequest } from '@pellux/goodvibes-sdk/platform/permissions';
3
3
  import type { SessionSnapshot } from '@/runtime/index.ts';
4
4
  import type { SystemMessageRouter } from '../core/system-message-router.ts';
5
+ import { readConversationMessageSnapshots } from '../core/conversation-message-snapshot.ts';
5
6
 
6
7
  export type PendingPermissionState = PermissionRequest & {
7
8
  resolve: (approved: boolean, remember?: boolean) => void;
@@ -71,7 +72,7 @@ export function handleBlockingShellInput(
71
72
  if (data === '\x12') {
72
73
  const recovery = loadRecoveryConversation();
73
74
  if (recovery) {
74
- conversation.fromJSON({ messages: recovery.messages as Parameters<typeof conversation.fromJSON>[0]['messages'] });
75
+ conversation.fromJSON({ messages: readConversationMessageSnapshots(recovery.messages) });
75
76
  systemMessageRouter.high('[Recovery] Session restored.');
76
77
  } else {
77
78
  systemMessageRouter.high('[Recovery] Failed to restore saved data.');
@@ -1,7 +1,7 @@
1
1
  import type { ConfigKey } from '@pellux/goodvibes-sdk/platform/config';
2
2
  import type { CliServiceRuntime } from '../cli/service-posture.ts';
3
3
 
4
- export const AGENT_EXTERNAL_DAEMON_SERVICE_MESSAGE = 'GoodVibes Agent uses connected GoodVibes services and does not install, start, stop, restart, or uninstall them. Manage service lifecycle outside Agent.';
4
+ export const AGENT_EXTERNAL_HOST_SERVICE_MESSAGE = 'GoodVibes Agent uses a connected GoodVibes host and does not install, start, stop, restart, or uninstall it. Manage host lifecycle outside Agent.';
5
5
 
6
6
  export interface ServiceSettingsSyncChange {
7
7
  readonly key: ConfigKey;
@@ -11,13 +11,13 @@ export interface ServiceSettingsSyncChange {
11
11
 
12
12
  export interface ServiceSettingsSyncResult {
13
13
  readonly handled: boolean;
14
- readonly action?: 'external-daemon-blocked' | 'unchanged';
14
+ readonly action?: 'connected-host-blocked' | 'unchanged';
15
15
  readonly message?: string;
16
16
  readonly error?: string;
17
17
  }
18
18
 
19
19
  export interface ServiceSettingsSyncOptions {
20
- readonly allowExternalDaemonMutation?: false;
20
+ readonly allowExternalHostMutation?: false;
21
21
  }
22
22
 
23
23
  export function syncServiceSettingToPlatform(
@@ -30,15 +30,15 @@ export function syncServiceSettingToPlatform(
30
30
  return {
31
31
  handled: true,
32
32
  action: 'unchanged',
33
- message: 'External daemon service setting unchanged',
33
+ message: 'Connected-host setting unchanged',
34
34
  };
35
35
  }
36
36
 
37
37
  runtime.configManager.setDynamic(change.key, change.previousValue);
38
38
  return {
39
39
  handled: true,
40
- action: 'external-daemon-blocked',
41
- message: AGENT_EXTERNAL_DAEMON_SERVICE_MESSAGE,
42
- error: 'daemon_lifecycle_external',
40
+ action: 'connected-host-blocked',
41
+ message: AGENT_EXTERNAL_HOST_SERVICE_MESSAGE,
42
+ error: 'connected_host_lifecycle_external',
43
43
  };
44
44
  }
@@ -13,6 +13,7 @@ import type { SecretsManager } from '@pellux/goodvibes-sdk/platform/config';
13
13
  import type { ServiceInspectionQuery } from '../runtime/ui-service-queries.ts';
14
14
  import type { ModelPickerTargetInfo } from '../input/model-picker.ts';
15
15
  import { syncServiceSettingToPlatform } from './service-settings-sync.ts';
16
+ import { agentWorkspaceCategoryForPanel } from '../input/agent-workspace-panel-route.ts';
16
17
 
17
18
  type WireShellUiOpenersOptions = {
18
19
  commandContext: CommandContext;
@@ -284,8 +285,8 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
284
285
  render();
285
286
  };
286
287
 
287
- commandContext.openAgentWorkspace = () => {
288
- input.openAgentWorkspace(commandContext);
288
+ commandContext.openAgentWorkspace = (categoryId?: string) => {
289
+ input.openAgentWorkspace(commandContext, categoryId);
289
290
  render();
290
291
  };
291
292
 
@@ -296,42 +297,18 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
296
297
  };
297
298
 
298
299
  commandContext.openPanelPicker = () => {
299
- if (!panelManager.isVisible()) {
300
- if (panelManager.getAllOpen().length === 0) {
301
- try {
302
- panelManager.open('panel-list');
303
- } catch {
304
- // non-fatal
305
- }
306
- }
307
- panelManager.show();
308
- input.panelFocused = true;
309
- conversation.setSplashSuppressed(true);
310
- conversation.rebuildHistory();
311
- } else if (!input.panelFocused) {
312
- if (panelManager.getAllOpen().length === 0) {
313
- try {
314
- panelManager.open('panel-list');
315
- } catch {
316
- // non-fatal
317
- }
318
- }
319
- panelManager.show();
320
- input.panelFocused = true;
321
- conversation.setSplashSuppressed(true);
322
- conversation.rebuildHistory();
323
- } else {
324
- panelManager.hide();
325
- input.panelFocused = false;
326
- conversation.setSplashSuppressed(false);
327
- conversation.rebuildHistory();
328
- }
300
+ panelManager.hide();
301
+ input.panelFocused = false;
302
+ conversation.setSplashSuppressed(false);
303
+ conversation.log('Panel picker is handled through Agent Workspace. Use /agent for current operator controls.', { fg: '214' });
304
+ input.openAgentWorkspace(commandContext, 'home');
305
+ conversation.rebuildHistory();
329
306
  render();
330
307
  };
331
308
 
332
309
  commandContext.focusPanels = () => {
333
- if (!panelManager.isVisible() || panelManager.getAllOpen().length === 0) return;
334
- input.panelFocused = true;
310
+ input.panelFocused = false;
311
+ input.openAgentWorkspace(commandContext, 'home');
335
312
  render();
336
313
  };
337
314
 
@@ -342,10 +319,12 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
342
319
  };
343
320
 
344
321
  commandContext.showPanel = (panelId, pane) => {
345
- panelManager.open(panelId, pane);
346
- panelManager.show();
347
- input.panelFocused = true;
348
- conversation.setSplashSuppressed(true);
322
+ void pane;
323
+ panelManager.hide();
324
+ input.panelFocused = false;
325
+ conversation.setSplashSuppressed(false);
326
+ conversation.log(`Panel route "${panelId}" is handled through Agent Workspace. Opening the matching operator area.`, { fg: '214' });
327
+ input.openAgentWorkspace(commandContext, agentWorkspaceCategoryForPanel(panelId));
349
328
  conversation.rebuildHistory();
350
329
  render();
351
330
  };
@@ -23,7 +23,6 @@ const READ_ONLY_ANALYZE_TOOL_MODES = [
23
23
  'surface',
24
24
  'breaking',
25
25
  'permissions',
26
- 'env_audit',
27
26
  'test_find',
28
27
  ] as const;
29
28
 
@@ -0,0 +1,133 @@
1
+ import type { ChannelDeliveryRouter } from '@pellux/goodvibes-sdk/platform/channels';
2
+ import type { Tool } from '@pellux/goodvibes-sdk/platform/types';
3
+ import type { ToolRegistry } from '@pellux/goodvibes-sdk/platform/tools';
4
+ import {
5
+ buildAgentChannelDeliveryPreview,
6
+ deliverAgentChannelMessage,
7
+ formatAgentChannelDeliveryPreview,
8
+ formatAgentChannelDeliveryResult,
9
+ } from '../agent/channel-delivery.ts';
10
+
11
+ export interface AgentChannelSendToolArgs {
12
+ readonly message?: unknown;
13
+ readonly title?: unknown;
14
+ readonly channel?: unknown;
15
+ readonly route?: unknown;
16
+ readonly webhook?: unknown;
17
+ readonly link?: unknown;
18
+ readonly confirm?: unknown;
19
+ readonly explicitUserRequest?: unknown;
20
+ }
21
+
22
+ function readString(value: unknown): string | undefined {
23
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
24
+ }
25
+
26
+ function readBoolean(value: unknown): boolean {
27
+ return value === true || value === 'true' || value === 'yes';
28
+ }
29
+
30
+ function failure(error: string): { readonly success: false; readonly error: string } {
31
+ return { success: false, error };
32
+ }
33
+
34
+ function output(text: string): { readonly success: true; readonly output: string } {
35
+ return { success: true, output: text };
36
+ }
37
+
38
+ export function createAgentChannelSendTool(
39
+ channelDeliveryRouter: Pick<ChannelDeliveryRouter, 'deliver' | 'listStrategies'>,
40
+ ): Tool {
41
+ return {
42
+ definition: {
43
+ name: 'agent_channel_send',
44
+ description: [
45
+ 'Send one explicitly confirmed message through a configured GoodVibes Agent delivery target from the main conversation.',
46
+ 'Use only when the user explicitly asks Agent to send, message, alert, or notify a channel target.',
47
+ 'Exactly one target must be supplied: channel, route, webhook, or link.',
48
+ 'This tool does not create channel routes, authorize accounts, manage connected-host hosting, use default knowledge, use non-Agent knowledge segments, create separate Agent jobs, run delegated review, or invoke arbitrary routes.',
49
+ 'Set confirm:true only for an explicit user request. Otherwise return the preview/confirmation error.',
50
+ ].join(' '),
51
+ parameters: {
52
+ type: 'object',
53
+ properties: {
54
+ message: {
55
+ type: 'string',
56
+ description: 'Plain-text message to deliver.',
57
+ },
58
+ title: {
59
+ type: 'string',
60
+ description: 'Optional delivery title.',
61
+ },
62
+ channel: {
63
+ type: 'string',
64
+ description: 'Optional channel target surface[:route[:label]], such as slack:ops:Ops or telephony:+15551234567. Use exactly one target field.',
65
+ },
66
+ route: {
67
+ type: 'string',
68
+ description: 'Optional route id or route:label. Use exactly one target field.',
69
+ },
70
+ webhook: {
71
+ type: 'string',
72
+ description: 'Optional http(s) webhook URL. Use exactly one target field.',
73
+ },
74
+ link: {
75
+ type: 'string',
76
+ description: 'Optional link delivery target. Use exactly one target field.',
77
+ },
78
+ confirm: {
79
+ type: 'boolean',
80
+ description: 'Required true only when the user explicitly asked for this exact channel delivery.',
81
+ },
82
+ explicitUserRequest: {
83
+ type: 'string',
84
+ description: 'Short quote or summary of the user request that authorized this delivery.',
85
+ },
86
+ },
87
+ required: ['message', 'confirm', 'explicitUserRequest'],
88
+ additionalProperties: false,
89
+ },
90
+ sideEffects: ['network'],
91
+ },
92
+ execute: async (rawArgs: Record<string, unknown>) => {
93
+ const args = rawArgs as AgentChannelSendToolArgs;
94
+ const explicitUserRequest = readString(args.explicitUserRequest);
95
+ if (!explicitUserRequest) {
96
+ return failure('explicitUserRequest is required so channel delivery stays tied to a direct user request.');
97
+ }
98
+ const input = {
99
+ message: readString(args.message) ?? '',
100
+ ...(readString(args.title) ? { title: readString(args.title) } : {}),
101
+ ...(readString(args.channel) ? { channel: readString(args.channel) } : {}),
102
+ ...(readString(args.route) ? { route: readString(args.route) } : {}),
103
+ ...(readString(args.webhook) ? { webhook: readString(args.webhook) } : {}),
104
+ ...(readString(args.link) ? { link: readString(args.link) } : {}),
105
+ };
106
+ let preview: ReturnType<typeof buildAgentChannelDeliveryPreview>;
107
+ try {
108
+ preview = buildAgentChannelDeliveryPreview(input);
109
+ } catch (error) {
110
+ return failure(error instanceof Error ? error.message : String(error));
111
+ }
112
+ if (!readBoolean(args.confirm)) {
113
+ return failure([
114
+ formatAgentChannelDeliveryPreview(preview, channelDeliveryRouter.listStrategies().length),
115
+ '',
116
+ 'Model tool confirmation required. Call this tool with confirm:true only when the user explicitly asked GoodVibes Agent to send this channel message.',
117
+ ].join('\n'));
118
+ }
119
+ try {
120
+ return output(formatAgentChannelDeliveryResult(await deliverAgentChannelMessage(channelDeliveryRouter, input)));
121
+ } catch (error) {
122
+ return failure(error instanceof Error ? error.message : String(error));
123
+ }
124
+ },
125
+ };
126
+ }
127
+
128
+ export function registerAgentChannelSendTool(
129
+ registry: ToolRegistry,
130
+ channelDeliveryRouter: Pick<ChannelDeliveryRouter, 'deliver' | 'listStrategies'>,
131
+ ): void {
132
+ registry.register(createAgentChannelSendTool(channelDeliveryRouter));
133
+ }
@@ -10,7 +10,7 @@ export function wrapBlockedContextToolForAgentPolicy(tool: Tool): void {
10
10
  tool.definition.description = [
11
11
  'Blocked in GoodVibes Agent main conversation: non-Agent runtime context.',
12
12
  'Use explicit Agent CLI/slash status, compat, setup, and Agent Knowledge commands for product-scoped context.',
13
- 'Default Knowledge/Wiki, non-Agent knowledge segments, and non-Agent runtime assumptions are not Agent fallbacks.',
13
+ 'Default knowledge, non-Agent knowledge segments, and non-Agent runtime assumptions are not Agent fallbacks.',
14
14
  ].join(' ');
15
15
  tool.definition.sideEffects = [];
16
16
  tool.definition.parameters = {