@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.
- package/CHANGELOG.md +48 -661
- package/README.md +64 -57
- package/bin/goodvibes-agent.ts +16 -2
- package/dist/package/main.js +199180 -192185
- package/docs/README.md +15 -8
- package/docs/channels-remote-and-api.md +50 -0
- package/docs/connected-host.md +59 -0
- package/docs/getting-started.md +61 -50
- package/docs/knowledge-artifacts-and-multimodal.md +91 -0
- package/docs/project-planning.md +79 -0
- package/docs/providers-and-routing.md +46 -0
- package/docs/release-and-publishing.md +48 -11
- package/docs/tools-and-commands.md +123 -0
- package/docs/voice-and-live-tts.md +51 -0
- package/package.json +3 -6
- package/src/agent/behavior-discovery-summary.ts +1 -3
- package/src/agent/channel-delivery.ts +201 -0
- package/src/agent/media-generation.ts +159 -0
- package/src/agent/memory-prompt.ts +0 -1
- package/src/agent/note-registry.ts +329 -0
- package/src/agent/operator-actions.ts +343 -0
- package/src/agent/persona-discovery.ts +1 -3
- package/src/agent/persona-registry.ts +19 -16
- package/src/agent/record-labels.ts +107 -0
- package/src/agent/reminder-schedule-format.ts +33 -24
- package/src/agent/reminder-schedule.ts +27 -26
- package/src/agent/routine-registry.ts +54 -14
- package/src/agent/routine-schedule-args.ts +2 -1
- package/src/agent/routine-schedule-format.ts +77 -53
- package/src/agent/routine-schedule-promotion.ts +35 -33
- package/src/agent/routine-schedule-receipts.ts +29 -27
- package/src/agent/runtime-profile-starters.ts +5 -5
- package/src/agent/runtime-profile.ts +91 -12
- package/src/agent/skill-registry.ts +210 -32
- package/src/cli/agent-knowledge-args.ts +5 -1
- package/src/cli/agent-knowledge-command.ts +40 -34
- package/src/cli/agent-knowledge-format.ts +80 -67
- package/src/cli/agent-knowledge-methods.ts +1 -1
- package/src/cli/agent-knowledge-runtime.ts +32 -26
- package/src/cli/bundle-command.ts +14 -9
- package/src/cli/config-overrides.ts +37 -36
- package/src/cli/entrypoint.ts +16 -7
- package/src/cli/external-runtime.ts +10 -4
- package/src/cli/help.ts +54 -29
- package/src/cli/local-library-command.ts +203 -83
- package/src/cli/management-commands.ts +105 -68
- package/src/cli/management.ts +55 -74
- package/src/cli/memory-command.ts +66 -32
- package/src/cli/parser.ts +37 -3
- package/src/cli/profiles-command.ts +166 -31
- package/src/cli/provider-auth-routes.ts +2 -1
- package/src/cli/routines-command.ts +176 -40
- package/src/cli/service-posture.ts +16 -16
- package/src/cli/status.ts +56 -135
- package/src/core/conversation-message-snapshot.ts +131 -0
- package/src/input/agent-workspace-access-command-editor-submission.ts +149 -0
- package/src/input/agent-workspace-access-command-editors.ts +170 -0
- package/src/input/agent-workspace-activation.ts +35 -8
- package/src/input/agent-workspace-basic-command-editor-submission.ts +351 -94
- package/src/input/agent-workspace-basic-command-editors.ts +502 -9
- package/src/input/agent-workspace-categories.ts +423 -51
- package/src/input/agent-workspace-channel-command-editor-submission.ts +83 -0
- package/src/input/agent-workspace-channel-command-editors.ts +65 -0
- package/src/input/agent-workspace-channels.ts +35 -2
- package/src/input/agent-workspace-command-editor.ts +41 -3
- package/src/input/agent-workspace-config-reader.ts +16 -0
- package/src/input/agent-workspace-delegation-editor-submission.ts +55 -0
- package/src/input/agent-workspace-editors.ts +166 -1
- package/src/input/agent-workspace-knowledge-command-editor-submission.ts +132 -0
- package/src/input/agent-workspace-knowledge-command-editors.ts +110 -0
- package/src/input/agent-workspace-knowledge-query-editor.ts +1 -1
- package/src/input/agent-workspace-learned-behavior.ts +67 -0
- package/src/input/agent-workspace-library-command-editor-submission.ts +50 -0
- package/src/input/agent-workspace-library-command-editors.ts +35 -0
- package/src/input/agent-workspace-local-operations.ts +218 -0
- package/src/input/agent-workspace-local-selection.ts +75 -0
- package/src/input/agent-workspace-mcp-command-editor-submission.ts +95 -0
- package/src/input/agent-workspace-media-command-editor-submission.ts +62 -0
- package/src/input/agent-workspace-media-command-editors.ts +27 -0
- package/src/input/agent-workspace-memory-command-editor-submission.ts +232 -0
- package/src/input/agent-workspace-memory-command-editors.ts +180 -0
- package/src/input/agent-workspace-memory-editor.ts +2 -2
- package/src/input/agent-workspace-navigation.ts +81 -0
- package/src/input/agent-workspace-notify-editor-submission.ts +121 -0
- package/src/input/agent-workspace-operations-command-editor-submission.ts +208 -0
- package/src/input/agent-workspace-operations-command-editors.ts +196 -0
- package/src/input/agent-workspace-panel-route.ts +43 -0
- package/src/input/agent-workspace-provider-command-editor-submission.ts +155 -0
- package/src/input/agent-workspace-provider-command-editors.ts +93 -0
- package/src/input/agent-workspace-reminder-schedule-editor.ts +1 -1
- package/src/input/agent-workspace-requirements.ts +11 -0
- package/src/input/agent-workspace-routine-schedule-editor.ts +2 -2
- package/src/input/agent-workspace-search.ts +169 -0
- package/src/input/agent-workspace-secret-editor-submission.ts +153 -0
- package/src/input/agent-workspace-session-command-editor-submission.ts +199 -0
- package/src/input/agent-workspace-session-command-editors.ts +249 -0
- package/src/input/agent-workspace-setup.ts +37 -16
- package/src/input/agent-workspace-skill-bundle-command-editor-submission.ts +101 -0
- package/src/input/agent-workspace-skill-bundle-command-editors.ts +110 -0
- package/src/input/agent-workspace-snapshot.ts +162 -21
- package/src/input/agent-workspace-task-command-editor-submission.ts +61 -0
- package/src/input/agent-workspace-task-command-editors.ts +47 -0
- package/src/input/agent-workspace-token.ts +18 -2
- package/src/input/agent-workspace-types.ts +212 -4
- package/src/input/agent-workspace-voice-media.ts +4 -7
- package/src/input/agent-workspace-web-research-editor.ts +104 -0
- package/src/input/agent-workspace-workplan-editor-submission.ts +153 -0
- package/src/input/agent-workspace.ts +178 -240
- package/src/input/command-registry.ts +5 -2
- package/src/input/commands/agent-runtime-profile-runtime.ts +126 -37
- package/src/input/commands/agent-skills-runtime.ts +149 -72
- package/src/input/commands/agent-workspace-runtime.ts +23 -6
- package/src/input/commands/brief-runtime.ts +55 -25
- package/src/input/commands/channels-runtime.ts +147 -33
- package/src/input/commands/compat-runtime.ts +32 -0
- package/src/input/commands/delegation-runtime.ts +29 -23
- package/src/input/commands/experience-runtime.ts +6 -4
- package/src/input/commands/guidance-runtime.ts +4 -4
- package/src/input/commands/health-runtime.ts +149 -126
- package/src/input/commands/knowledge.ts +82 -60
- package/src/input/commands/local-provider-runtime.ts +43 -21
- package/src/input/commands/local-runtime.ts +138 -16
- package/src/input/commands/local-setup-review.ts +10 -20
- package/src/input/commands/mcp-runtime.ts +63 -46
- package/src/input/commands/notify-runtime.ts +38 -9
- package/src/input/commands/operator-actions-runtime.ts +138 -0
- package/src/input/commands/operator-runtime.ts +6 -76
- package/src/input/commands/personas-runtime.ts +46 -31
- package/src/input/commands/planning-runtime.ts +1 -1
- package/src/input/commands/platform-access-runtime.ts +35 -98
- package/src/input/commands/product-runtime.ts +2 -2
- package/src/input/commands/provider-accounts-runtime.ts +60 -39
- package/src/input/commands/qrcode-runtime.ts +50 -9
- package/src/input/commands/recall-bundle.ts +11 -11
- package/src/input/commands/recall-capture.ts +13 -11
- package/src/input/commands/recall-query.ts +29 -21
- package/src/input/commands/recall-review.ts +2 -1
- package/src/input/commands/routines-runtime.ts +99 -45
- package/src/input/commands/runtime-services.ts +1 -14
- package/src/input/commands/schedule-runtime.ts +33 -20
- package/src/input/commands/security-runtime.ts +6 -11
- package/src/input/commands/session-content.ts +80 -78
- package/src/input/commands/session-workflow.ts +134 -104
- package/src/input/commands/session.ts +3 -174
- package/src/input/commands/shell-core.ts +38 -17
- package/src/input/commands/subscription-runtime.ts +54 -185
- package/src/input/commands/support-bundle-runtime.ts +53 -0
- package/src/input/commands/tasks-runtime.ts +21 -21
- package/src/input/commands/work-plan-runtime.ts +33 -8
- package/src/input/commands.ts +6 -2
- package/src/input/feed-context-factory.ts +2 -2
- package/src/input/file-picker.ts +3 -2
- package/src/input/handler-command-route.ts +4 -7
- package/src/input/handler-content-actions.ts +89 -26
- package/src/input/handler-feed-routes.ts +19 -12
- package/src/input/handler-feed.ts +6 -5
- package/src/input/handler-interactions.ts +9 -36
- package/src/input/handler-modal-stack.ts +3 -3
- package/src/input/handler-onboarding.ts +52 -91
- package/src/input/handler-shortcuts.ts +16 -7
- package/src/input/handler.ts +50 -23
- package/src/input/input-history.ts +5 -6
- package/src/input/keybindings.ts +27 -16
- package/src/input/mcp-workspace.ts +90 -26
- package/src/input/onboarding/handler-onboarding-routes.ts +3 -1
- package/src/input/onboarding/onboarding-wizard-apply.ts +62 -0
- package/src/input/onboarding/onboarding-wizard-constants.ts +1 -0
- package/src/input/onboarding/onboarding-wizard-helpers.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-operator-steps.ts +223 -55
- package/src/input/onboarding/onboarding-wizard-steps.ts +59 -35
- package/src/input/onboarding/onboarding-wizard-types.ts +4 -1
- package/src/input/onboarding/onboarding-wizard.ts +87 -2
- package/src/input/profile-picker-modal.ts +31 -12
- package/src/input/session-picker-modal.ts +21 -4
- package/src/input/settings-modal-agent-policy.ts +6 -6
- package/src/input/settings-modal-behavior.ts +0 -3
- package/src/input/settings-modal-subscriptions.ts +3 -3
- package/src/input/settings-modal-types.ts +2 -13
- package/src/input/settings-modal.ts +20 -66
- package/src/input/submission-intent.ts +0 -1
- package/src/input/submission-router.ts +3 -3
- package/src/main.ts +18 -10
- package/src/panels/approval-panel.ts +8 -8
- package/src/panels/automation-control-panel.ts +4 -4
- package/src/panels/base-panel.ts +1 -1
- package/src/panels/builtin/agent.ts +1 -1
- package/src/panels/builtin/operations.ts +3 -12
- package/src/panels/builtin/session.ts +32 -24
- package/src/panels/builtin/shared.ts +7 -7
- package/src/panels/cost-tracker-panel.ts +1 -1
- package/src/panels/docs-panel.ts +5 -3
- package/src/panels/index.ts +0 -1
- package/src/panels/knowledge-panel.ts +6 -5
- package/src/panels/memory-panel.ts +7 -6
- package/src/panels/panel-list-panel.ts +36 -80
- package/src/panels/project-planning-panel.ts +19 -12
- package/src/panels/provider-account-snapshot.ts +51 -25
- package/src/panels/provider-accounts-panel.ts +33 -18
- package/src/panels/provider-health-domains.ts +48 -7
- package/src/panels/provider-health-panel.ts +5 -4
- package/src/panels/qr-panel.ts +44 -20
- package/src/panels/schedule-panel.ts +9 -17
- package/src/panels/security-panel.ts +8 -8
- package/src/panels/session-browser-panel.ts +10 -10
- package/src/panels/subscription-panel.ts +6 -6
- package/src/panels/system-messages-panel.ts +3 -3
- package/src/panels/tasks-panel.ts +21 -14
- package/src/panels/tool-inspector-panel.ts +19 -12
- package/src/panels/work-plan-panel.ts +5 -5
- package/src/planning/project-planning-coordinator.ts +3 -3
- package/src/provider-auth-route-display.ts +9 -0
- package/src/renderer/agent-workspace-style.ts +34 -0
- package/src/renderer/agent-workspace.ts +254 -57
- package/src/renderer/autocomplete-overlay.ts +25 -6
- package/src/renderer/block-actions.ts +1 -3
- package/src/renderer/bookmark-modal.ts +19 -4
- package/src/renderer/buffer.ts +4 -2
- package/src/renderer/context-inspector.ts +50 -13
- package/src/renderer/diff.ts +1 -1
- package/src/renderer/file-picker-overlay.ts +19 -6
- package/src/renderer/help-overlay.ts +112 -34
- package/src/renderer/history-search-overlay.ts +19 -4
- package/src/renderer/live-tail-modal.ts +27 -5
- package/src/renderer/mcp-workspace.ts +176 -43
- package/src/renderer/model-picker-overlay.ts +58 -3
- package/src/renderer/model-workspace.ts +104 -22
- package/src/renderer/onboarding/onboarding-wizard.ts +20 -4
- package/src/renderer/process-modal.ts +27 -6
- package/src/renderer/profile-picker-modal.ts +21 -5
- package/src/renderer/search-overlay.ts +25 -5
- package/src/renderer/selection-modal-overlay.ts +46 -14
- package/src/renderer/session-picker-modal.ts +18 -1
- package/src/renderer/settings-modal-helpers.ts +2 -40
- package/src/renderer/settings-modal.ts +88 -55
- package/src/renderer/system-message.ts +1 -1
- package/src/renderer/tool-call.ts +20 -11
- package/src/runtime/agent-runtime-events.ts +129 -0
- package/src/runtime/bootstrap-command-context.ts +7 -1
- package/src/runtime/bootstrap-command-parts.ts +11 -8
- package/src/runtime/bootstrap-core.ts +23 -65
- package/src/runtime/bootstrap-hook-bridge.ts +7 -18
- package/src/runtime/bootstrap-shell.ts +46 -8
- package/src/runtime/bootstrap.ts +36 -46
- package/src/runtime/connected-host-auth.ts +47 -0
- package/src/runtime/diagnostics/panels/index.ts +2 -2
- package/src/runtime/diagnostics/panels/panel-resources.ts +1 -1
- package/src/runtime/diagnostics/panels/policy.ts +7 -7
- package/src/runtime/index.ts +2 -5
- package/src/runtime/onboarding/apply-file-helpers.ts +66 -0
- package/src/runtime/onboarding/apply.ts +288 -74
- package/src/runtime/onboarding/derivation.ts +10 -13
- package/src/runtime/onboarding/snapshot.ts +2 -17
- package/src/runtime/onboarding/types.ts +34 -20
- package/src/runtime/onboarding/verify.ts +105 -4
- package/src/runtime/operator-token-cleanup.ts +3 -3
- package/src/runtime/services.ts +95 -11
- package/src/runtime/store/selectors/index.ts +3 -3
- package/src/runtime/store/state.ts +1 -4
- package/src/runtime/surface-feature-flags.ts +41 -6
- package/src/runtime/ui-read-models.ts +3 -4
- package/src/runtime/ui-services.ts +6 -6
- package/src/shell/blocking-input.ts +2 -1
- package/src/shell/service-settings-sync.ts +7 -7
- package/src/shell/ui-openers.ts +17 -38
- package/src/tools/agent-analysis-registry-policy.ts +0 -1
- package/src/tools/agent-channel-send-tool.ts +133 -0
- package/src/tools/agent-context-policy.ts +1 -1
- package/src/tools/agent-knowledge-ingest-tool.ts +405 -0
- package/src/tools/agent-knowledge-tool.ts +170 -0
- package/src/tools/agent-local-registry-tool.ts +279 -73
- package/src/tools/agent-media-generate-tool.ts +133 -0
- package/src/tools/agent-notify-tool.ts +143 -0
- package/src/tools/agent-operator-action-tool.ts +137 -0
- package/src/tools/agent-operator-briefing-tool.ts +217 -0
- package/src/tools/agent-reminder-schedule-tool.ts +237 -0
- package/src/tools/agent-tool-policy-guard.ts +13 -15
- package/src/tools/agent-work-plan-tool.ts +256 -0
- package/src/version.ts +1 -1
- package/docs/connected-services.md +0 -51
- package/src/cli/package-verification.ts +0 -274
- package/src/input/commands/policy-dispatch.ts +0 -339
- package/src/input/commands/policy.ts +0 -17
- package/src/panels/panel-picker.ts +0 -105
- package/src/panels/policy-panel.ts +0 -308
- 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
|
|
62
|
-
readonly
|
|
61
|
+
readonly connectedHostRunning: boolean;
|
|
62
|
+
readonly connectedHostPortInUse?: boolean;
|
|
63
63
|
readonly httpListenerRunning: boolean;
|
|
64
64
|
readonly httpListenerPortInUse?: boolean;
|
|
65
|
-
readonly
|
|
65
|
+
readonly connectedHostStatus?: HostServiceStatus;
|
|
66
66
|
readonly httpListenerStatus?: HostServiceStatus;
|
|
67
67
|
};
|
|
68
68
|
restart(): Promise<{
|
|
69
|
-
readonly
|
|
70
|
-
readonly
|
|
69
|
+
readonly connectedHostRunning: boolean;
|
|
70
|
+
readonly connectedHostPortInUse?: boolean;
|
|
71
71
|
readonly httpListenerRunning: boolean;
|
|
72
72
|
readonly httpListenerPortInUse?: boolean;
|
|
73
|
-
readonly
|
|
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
|
|
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
|
|
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?: '
|
|
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
|
|
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: '
|
|
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: '
|
|
41
|
-
message:
|
|
42
|
-
error: '
|
|
40
|
+
action: 'connected-host-blocked',
|
|
41
|
+
message: AGENT_EXTERNAL_HOST_SERVICE_MESSAGE,
|
|
42
|
+
error: 'connected_host_lifecycle_external',
|
|
43
43
|
};
|
|
44
44
|
}
|
package/src/shell/ui-openers.ts
CHANGED
|
@@ -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
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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
|
-
|
|
334
|
-
input.
|
|
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
|
-
|
|
346
|
-
panelManager.
|
|
347
|
-
input.panelFocused =
|
|
348
|
-
conversation.setSplashSuppressed(
|
|
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
|
};
|
|
@@ -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
|
|
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 = {
|