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