@pellux/goodvibes-agent 1.1.2 → 1.1.4

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.
@@ -1,4 +1,5 @@
1
1
  import type { AgentWorkspaceCategory } from './agent-workspace-types.ts';
2
+ import { settingAction } from './agent-workspace-category-actions.ts';
2
3
 
3
4
  export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
4
5
  {
@@ -11,7 +12,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
11
12
  { id: 'chat', label: 'Continue assistant chat', detail: 'Return to the main composer and type a normal message. Agent work stays serial in the main conversation.', kind: 'guidance', safety: 'safe' },
12
13
  { id: 'brief', label: 'Operator briefing', detail: 'Show a concise Agent status and next-actions briefing without mutating the connected host.', command: '/brief', kind: 'command', safety: 'read-only' },
13
14
  { id: 'model', label: 'Choose model', detail: 'Open the model/provider workspace for the Agent chat route.', command: '/model', kind: 'command', safety: 'safe' },
14
- { id: 'setup-home', label: 'Setup checklist', detail: 'Jump to the first-run checklist for provider, knowledge, personas, skills, routines, memory, channels, and voice/media.', targetCategoryId: 'setup', kind: 'workspace', safety: 'safe' },
15
+ { id: 'setup-home', label: 'Onboarding', detail: 'Jump to first-run configuration for account, model, tools, channels, voice, local context, and finish.', targetCategoryId: 'setup', kind: 'workspace', safety: 'safe' },
15
16
  { id: 'channels-home', label: 'Channels', detail: 'Jump to companion pairing and channel readiness without changing connected-host routing.', targetCategoryId: 'channels', kind: 'workspace', safety: 'read-only' },
16
17
  { id: 'mode-show', label: 'Interaction mode', detail: 'Review Agent interaction noise level and per-domain verbosity.', command: '/mode show', kind: 'command', safety: 'read-only' },
17
18
  { id: 'mode-preset', label: 'Set interaction mode', detail: 'Open a confirmed form for quiet, balanced, or operator interaction mode.', editorKind: 'mode-preset', kind: 'editor', safety: 'safe' },
@@ -35,61 +36,225 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
35
36
  },
36
37
  {
37
38
  id: 'setup',
38
- group: 'START',
39
- label: 'Setup',
40
- summary: 'Configuration, auth, provider, and onboarding workspaces.',
41
- detail: 'Use this to configure the assistant: provider/model, setup checklist, Agent Knowledge, local behavior, channels, and voice/media. Changes here stay Agent-owned.',
39
+ group: 'ONBOARDING',
40
+ label: 'Start',
41
+ summary: 'Import existing GoodVibes preferences, choose a main model, and sign in.',
42
+ detail: 'Use this first. Every row either imports existing settings, edits a setting inline, or opens a concrete sign-in/provider form.',
42
43
  actions: [
43
- { id: 'config', label: 'Open settings', detail: 'Open the fullscreen Agent settings workspace.', command: '/config', kind: 'command', safety: 'safe' },
44
- { id: 'setup', label: 'Setup workspace', detail: 'Review Agent setup in this fullscreen workspace.', kind: 'guidance', safety: 'safe' },
45
- { id: 'setup-provider-model', label: 'Provider and model', detail: 'Choose the provider/model route for normal assistant chat.', command: '/model', kind: 'command', safety: 'safe' },
46
- { id: 'setup-model-pinned', label: 'Pinned models', detail: 'Inspect model favorites from the Agent TUI before changing model selection.', command: '/pin', kind: 'command', safety: 'read-only' },
47
- { id: 'setup-model-refresh', label: 'Refresh model catalog', detail: 'Refresh model catalog, benchmark, and token-limit metadata from the Agent TUI.', command: '/refresh-models', kind: 'command', safety: 'safe' },
48
- { id: 'setup-model-pin', label: 'Pin model', detail: 'Open a form that pins one model registry key for quick reuse.', editorKind: 'model-pin', kind: 'editor', safety: 'safe' },
49
- { id: 'setup-model-unpin', label: 'Unpin model', detail: 'Open a form that removes one pinned model registry key.', editorKind: 'model-unpin', kind: 'editor', safety: 'safe' },
50
- { id: 'setup-model-unpin-command', label: 'Unpin model command', detail: 'Use the direct unpin command when you already know the model registry key.', command: '/unpin', kind: 'command', safety: 'safe' },
51
- { id: 'setup-effort', label: 'Reasoning effort', detail: 'Open a form that sets reasoning effort for normal Agent chat turns when supported by the selected model.', editorKind: 'effort-level', kind: 'editor', safety: 'safe' },
52
- { id: 'setup-effort-command', label: 'Reasoning effort command', detail: 'Show or set reasoning effort with the registry command when you already know the level.', command: '/effort', kind: 'command', safety: 'safe' },
53
- { id: 'setup-mode-show', label: 'Interaction mode', detail: 'Review current Agent interaction mode and domain verbosity.', command: '/mode show', kind: 'command', safety: 'read-only' },
54
- { id: 'setup-mode-preset', label: 'Set interaction mode', detail: 'Open a confirmed form for quiet, balanced, or operator interaction mode.', editorKind: 'mode-preset', kind: 'editor', safety: 'safe' },
55
- { id: 'setup-mode-domain', label: 'Set domain verbosity', detail: 'Open a confirmed form for one interaction-domain verbosity override.', editorKind: 'mode-domain', kind: 'editor', safety: 'safe' },
56
- { id: 'setup-compat', label: 'Compatibility', detail: 'Inspect connected-host compatibility and isolated Agent Knowledge route readiness.', command: '/compat', kind: 'command', safety: 'read-only' },
57
- { id: 'setup-agent-knowledge', label: 'Agent Knowledge', detail: 'Open isolated Agent Knowledge status, ask/search, ingest, source review, and reindex actions.', targetCategoryId: 'knowledge', kind: 'workspace', safety: 'safe' },
58
- { id: 'setup-runtime-profiles', label: 'Agent profiles', detail: 'Open starter templates, isolated Agent homes, profile defaults, and profile import/export actions.', targetCategoryId: 'profiles', kind: 'workspace', safety: 'safe' },
59
- { id: 'setup-profile-from-discovered', label: 'Profile from discovered behavior', detail: 'Create an isolated Agent profile directly from reviewed local persona, skill, and routine files.', editorKind: 'profile-from-discovered', kind: 'editor', safety: 'safe' },
60
- { id: 'support-bundle-export', label: 'Export support bundle', detail: 'Open a confirmed form that exports a redacted Agent support bundle from the TUI workspace.', editorKind: 'support-bundle-export', kind: 'editor', safety: 'safe' },
61
- { id: 'support-bundle-inspect', label: 'Inspect support bundle', detail: 'Open a form that inspects a redacted Agent support bundle before import or sharing.', editorKind: 'support-bundle-inspect', kind: 'editor', safety: 'read-only' },
62
- { id: 'support-bundle-import', label: 'Import support bundle', detail: 'Open a confirmed form that imports reviewed, non-redacted config values from an Agent support bundle.', editorKind: 'support-bundle-import', kind: 'editor', safety: 'safe' },
63
- { id: 'support-bundle-command', label: 'Support bundle command', detail: 'Use the support-bundle command for export, inspect, or import from inside the Agent TUI.', command: '/bundle', kind: 'command', safety: 'safe' },
64
- { id: 'setup-personas', label: 'Personas', detail: 'Create or select the active Agent-local persona.', targetCategoryId: 'personas', kind: 'workspace', safety: 'safe' },
65
- { id: 'setup-skills', label: 'Skills', detail: 'Create, review, and enable reusable Agent-local skills.', targetCategoryId: 'skills', kind: 'workspace', safety: 'safe' },
66
- { id: 'setup-routines', label: 'Routines', detail: 'Create, review, and enable Agent-local routines before any explicit schedule promotion.', targetCategoryId: 'routines', kind: 'workspace', safety: 'safe' },
67
- { id: 'setup-memory', label: 'Local memory', detail: 'Open Agent-local memory creation, review, search, export/import, and maintenance actions. Secrets stay rejected or redacted.', targetCategoryId: 'memory', kind: 'workspace', safety: 'safe' },
68
- { id: 'setup-notes', label: 'Scratchpad notes', detail: 'Open Agent-local notes for source triage and temporary context. Notes are not memory or Agent Knowledge.', targetCategoryId: 'notes', kind: 'workspace', safety: 'safe' },
69
- { id: 'setup-channels', label: 'Channels', detail: 'Open companion pairing, channel readiness, delivery target, and notification setup.', targetCategoryId: 'channels', kind: 'workspace', safety: 'safe' },
70
- { id: 'setup-tools', label: 'Tools and MCP', detail: 'Open MCP setup, trust review, and tool inventory.', targetCategoryId: 'tools', kind: 'workspace', safety: 'safe' },
71
- { id: 'setup-voice-media', label: 'Voice and media', detail: 'Open voice, TTS, image input, media provider, and browser-tool setup actions.', targetCategoryId: 'voice-media', kind: 'workspace', safety: 'safe' },
72
- { id: 'provider', label: 'Provider status', detail: 'Review provider/model posture.', command: '/provider', kind: 'command', safety: 'read-only' },
73
- { id: 'provider-use', label: 'Use provider', detail: 'Open a provider-id form that switches the Agent chat provider from the workspace.', editorKind: 'provider-use', kind: 'editor', safety: 'safe' },
74
- { id: 'provider-inspect', label: 'Inspect provider', detail: 'Open a provider-id form for read-only provider auth/setup inspection.', editorKind: 'provider-inspect', kind: 'editor', safety: 'read-only' },
75
- { id: 'provider-routes', label: 'Inspect provider routes', detail: 'Open a provider-id form for read-only route and fallback inspection.', editorKind: 'provider-routes', kind: 'editor', safety: 'read-only' },
76
- { id: 'provider-account-repair', label: 'Provider account repair', detail: 'Open a provider-id form for read-only account repair guidance.', editorKind: 'provider-account-repair', kind: 'editor', safety: 'read-only' },
77
- { id: 'provider-add', label: 'Add custom provider', detail: 'Open a confirmed form that adds one OpenAI-compatible custom provider for Agent model routing.', editorKind: 'provider-add', kind: 'editor', safety: 'safe' },
78
- { id: 'provider-remove', label: 'Remove custom provider', detail: 'Open a confirmed form that removes one Agent custom provider config.', editorKind: 'provider-remove', kind: 'editor', safety: 'safe' },
79
- { id: 'provider-accounts', label: 'Provider accounts', detail: 'Review provider account routes, subscription windows, and billing-path safety without starting login or repair flows.', command: '/accounts review', kind: 'command', safety: 'read-only' },
80
- { id: 'subscription-providers', label: 'Subscription providers', detail: 'Review provider subscription login routes without starting a login.', command: '/subscription providers', kind: 'command', safety: 'read-only' },
81
- { id: 'subscription-review', label: 'Subscription review', detail: 'Inspect active and pending provider subscription sessions without printing token values.', command: '/subscription review', kind: 'command', safety: 'read-only' },
82
- { id: 'subscription-inspect', label: 'Inspect subscription provider', detail: 'Open a provider-id form for read-only OAuth/subscription route inspection.', editorKind: 'subscription-inspect', kind: 'editor', safety: 'read-only' },
44
+ { id: 'import-goodvibes-tui-settings', label: 'Import GoodVibes settings', detail: 'Copy existing GoodVibes TUI display, provider, behavior, permission, TTS, channel, helper, tool, release, and automation values into Agent-owned settings.', kind: 'settings-import', safety: 'safe' },
45
+ settingAction({ id: 'setup-provider-model', label: 'Main model', detail: 'Set the provider-qualified model used for normal assistant turns.', key: 'provider.model' }),
46
+ settingAction({ id: 'setup-reasoning-effort', label: 'Reasoning effort', detail: 'Cycle the reasoning level used when the selected model supports it.', key: 'provider.reasoningEffort' }),
83
47
  { id: 'subscription-login-start', label: 'Start subscription login', detail: 'Open a confirmed form for one provider OAuth login start, with browser/manual completion controls.', editorKind: 'subscription-login-start', kind: 'editor', safety: 'safe' },
84
48
  { id: 'subscription-login-finish', label: 'Finish subscription login', detail: 'Open a confirmed form that stores one completed provider subscription session from a code or redirect URL.', editorKind: 'subscription-login-finish', kind: 'editor', safety: 'safe' },
85
49
  { id: 'subscription-logout', label: 'Logout subscription', detail: 'Open a confirmed form that removes one stored provider subscription session.', editorKind: 'subscription-logout', kind: 'editor', safety: 'safe' },
86
- { id: 'subscription-bundle-export', label: 'Export subscription bundle', detail: 'Open a confirmed form that exports a redacted provider subscription bundle for setup review.', editorKind: 'subscription-bundle-export', kind: 'editor', safety: 'safe' },
87
- { id: 'subscription-bundle-inspect', label: 'Inspect subscription bundle', detail: 'Open a form that inspects a provider subscription bundle before setup review.', editorKind: 'subscription-bundle-inspect', kind: 'editor', safety: 'read-only' },
88
- { id: 'auth', label: 'Auth review', detail: 'Review authentication posture without printing token values.', command: '/auth review', kind: 'command', safety: 'read-only' },
89
- { id: 'auth-show', label: 'Inspect provider auth', detail: 'Open a provider-id form for read-only provider auth inspection.', editorKind: 'auth-show', kind: 'editor', safety: 'read-only' },
90
- { id: 'auth-repair', label: 'Auth repair guidance', detail: 'Open a provider-id form that shows auth repair guidance without storing tokens or starting login.', editorKind: 'auth-repair', kind: 'editor', safety: 'read-only' },
91
- { id: 'auth-bundle-export', label: 'Export auth bundle', detail: 'Open a confirmed form that exports a redacted auth review bundle.', editorKind: 'auth-bundle-export', kind: 'editor', safety: 'safe' },
92
- { id: 'auth-bundle-inspect', label: 'Inspect auth bundle', detail: 'Open a form that inspects an auth review bundle before setup review.', editorKind: 'auth-bundle-inspect', kind: 'editor', safety: 'read-only' },
50
+ { id: 'subscription-inspect', label: 'Inspect subscription route', detail: 'Inspect one provider subscription OAuth route before starting or finishing login.', editorKind: 'subscription-inspect', kind: 'editor', safety: 'read-only' },
51
+ { id: 'subscription-bundle-export', label: 'Export subscription bundle', detail: 'Export a redacted provider subscription bundle for setup review.', editorKind: 'subscription-bundle-export', kind: 'editor', safety: 'safe' },
52
+ { id: 'subscription-bundle-inspect', label: 'Inspect subscription bundle', detail: 'Inspect a provider subscription bundle before setup review.', editorKind: 'subscription-bundle-inspect', kind: 'editor', safety: 'read-only' },
53
+ { id: 'provider-add', label: 'Add custom provider', detail: 'Add one OpenAI-compatible provider for Agent model routing.', editorKind: 'provider-add', kind: 'editor', safety: 'safe' },
54
+ { id: 'secret-set-provider', label: 'Store API secret', detail: 'Store a provider or channel credential through the Agent secret manager.', editorKind: 'secret-set', kind: 'editor', safety: 'safe' },
55
+ settingAction({ id: 'setup-secret-policy', label: 'Secret storage policy', detail: 'Choose whether secret persistence prefers or requires secure storage.', key: 'storage.secretPolicy' }),
56
+ settingAction({ id: 'setup-save-history', label: 'Save conversation history', detail: 'Toggle local conversation history persistence.', key: 'behavior.saveHistory' }),
57
+ ],
58
+ },
59
+ {
60
+ id: 'account-model',
61
+ group: 'ONBOARDING',
62
+ label: 'Account & Model',
63
+ summary: 'Model routing for chat, helpers, tools, embeddings, and spoken turns.',
64
+ detail: 'Use this after sign-in to make model routing explicit for each workload.',
65
+ actions: [
66
+ { id: 'provider-use', label: 'Switch provider', detail: 'Open a provider-id form that switches the Agent chat provider.', editorKind: 'provider-use', kind: 'editor', safety: 'safe' },
67
+ { id: 'provider-inspect', label: 'Inspect provider auth', detail: 'Inspect one provider auth/setup route without storing tokens or starting login.', editorKind: 'provider-inspect', kind: 'editor', safety: 'read-only' },
68
+ { id: 'provider-routes', label: 'Inspect provider routes', detail: 'Inspect provider route and fallback posture for one provider.', editorKind: 'provider-routes', kind: 'editor', safety: 'read-only' },
69
+ { id: 'provider-account-repair', label: 'Provider repair guidance', detail: 'Show provider account repair guidance without mutating credentials.', editorKind: 'provider-account-repair', kind: 'editor', safety: 'read-only' },
70
+ { id: 'provider-remove', label: 'Remove custom provider', detail: 'Remove one Agent custom provider config after confirmation.', editorKind: 'provider-remove', kind: 'editor', safety: 'safe' },
71
+ { id: 'model-refresh', label: 'Refresh model catalog', detail: 'Refresh model catalog, benchmark, and token-limit metadata.', command: '/refresh-models', kind: 'command', safety: 'safe' },
72
+ { id: 'model-pin', label: 'Pin model', detail: 'Pin one model registry key for quick reuse.', editorKind: 'model-pin', kind: 'editor', safety: 'safe' },
73
+ { id: 'model-unpin', label: 'Unpin model', detail: 'Remove one pinned model registry key.', editorKind: 'model-unpin', kind: 'editor', safety: 'safe' },
74
+ { id: 'auth-show', label: 'Show provider auth', detail: 'Inspect provider auth state without printing token values.', editorKind: 'auth-show', kind: 'editor', safety: 'read-only' },
75
+ { id: 'auth-repair', label: 'Auth repair guidance', detail: 'Show auth repair guidance without storing tokens or starting login.', editorKind: 'auth-repair', kind: 'editor', safety: 'read-only' },
76
+ { id: 'auth-bundle-export', label: 'Export auth bundle', detail: 'Export a redacted auth review bundle after confirmation.', editorKind: 'auth-bundle-export', kind: 'editor', safety: 'safe' },
77
+ { id: 'auth-bundle-inspect', label: 'Inspect auth bundle', detail: 'Inspect an auth review bundle before setup review.', editorKind: 'auth-bundle-inspect', kind: 'editor', safety: 'read-only' },
78
+ settingAction({ id: 'account-main-model', label: 'Main model', detail: 'Edit the provider-qualified model registry key for normal assistant turns.', key: 'provider.model' }),
79
+ settingAction({ id: 'account-reasoning', label: 'Reasoning effort', detail: 'Cycle instant, low, medium, or high reasoning effort.', key: 'provider.reasoningEffort' }),
80
+ settingAction({ id: 'account-embedding', label: 'Embedding provider', detail: 'Set the embedding provider used by local memory and retrieval.', key: 'provider.embeddingProvider' }),
81
+ settingAction({ id: 'account-system-prompt', label: 'System prompt file', detail: 'Set an optional local system prompt file path.', key: 'provider.systemPromptFile' }),
82
+ settingAction({ id: 'account-helper-enabled', label: 'Enable helper model', detail: 'Toggle dedicated helper routing for background utility work.', key: 'helper.enabled' }),
83
+ settingAction({ id: 'account-helper-provider', label: 'Helper provider', detail: 'Set the helper provider id.', key: 'helper.globalProvider', visibleWhenKey: 'helper.enabled', visibleWhenValue: true }),
84
+ settingAction({ id: 'account-helper-model', label: 'Helper model', detail: 'Set the helper model registry key.', key: 'helper.globalModel', visibleWhenKey: 'helper.enabled', visibleWhenValue: true }),
85
+ settingAction({ id: 'account-tool-llm-enabled', label: 'Enable tool LLM', detail: 'Toggle a dedicated tool LLM for internal operations.', key: 'tools.llmEnabled' }),
86
+ settingAction({ id: 'account-tool-provider', label: 'Tool LLM provider', detail: 'Set the provider for dedicated tool LLM calls.', key: 'tools.llmProvider', visibleWhenKey: 'tools.llmEnabled', visibleWhenValue: true }),
87
+ settingAction({ id: 'account-tool-model', label: 'Tool LLM model', detail: 'Set the model for dedicated tool LLM calls.', key: 'tools.llmModel', visibleWhenKey: 'tools.llmEnabled', visibleWhenValue: true }),
88
+ settingAction({ id: 'account-tts-llm-provider', label: 'Spoken-turn provider', detail: 'Set an optional provider override for spoken-response turns.', key: 'tts.llmProvider' }),
89
+ settingAction({ id: 'account-tts-llm-model', label: 'Spoken-turn model', detail: 'Set an optional model override for spoken-response turns.', key: 'tts.llmModel' }),
90
+ ],
91
+ },
92
+ {
93
+ id: 'assistant-behavior',
94
+ group: 'ONBOARDING',
95
+ label: 'Assistant Behavior',
96
+ summary: 'Interaction, context, notifications, and reasoning display.',
97
+ detail: 'Use this page to decide how much the assistant talks while it works and how it handles context pressure.',
98
+ actions: [
99
+ settingAction({ id: 'behavior-hitl-mode', label: 'Interaction mode', detail: 'Cycle quiet, balanced, or operator interaction mode.', key: 'behavior.hitlMode' }),
100
+ settingAction({ id: 'behavior-guidance-mode', label: 'Guidance mode', detail: 'Cycle off, minimal, or guided operational guidance.', key: 'behavior.guidanceMode' }),
101
+ settingAction({ id: 'behavior-auto-compact', label: 'Auto-compact threshold', detail: 'Set the context percentage that triggers automatic compaction.', key: 'behavior.autoCompactThreshold' }),
102
+ settingAction({ id: 'behavior-stale-context', label: 'Context warnings', detail: 'Toggle proactive warnings before compaction is required.', key: 'behavior.staleContextWarnings' }),
103
+ settingAction({ id: 'behavior-notify-complete', label: 'Notify on long turns', detail: 'Toggle terminal and desktop notification when a long turn completes.', key: 'behavior.notifyOnComplete' }),
104
+ settingAction({ id: 'behavior-return-context', label: 'Resume summary mode', detail: 'Cycle off, local, or assisted resume summaries.', key: 'behavior.returnContextMode' }),
105
+ settingAction({ id: 'behavior-show-thinking', label: 'Show thinking blocks', detail: 'Toggle visible reasoning/thinking content when the provider returns it.', key: 'display.showThinking' }),
106
+ settingAction({ id: 'behavior-show-reasoning-summary', label: 'Show reasoning summary', detail: 'Toggle visible reasoning summaries when supported.', key: 'display.showReasoningSummary' }),
107
+ ],
108
+ },
109
+ {
110
+ id: 'tools-permissions',
111
+ group: 'ONBOARDING',
112
+ label: 'Tools & Permissions',
113
+ summary: 'Tool approval policy, MCP trust entry points, and secret handling.',
114
+ detail: 'Use this page to set how Agent asks before file, shell, network, MCP, workflow, and delegation operations.',
115
+ actions: [
116
+ settingAction({ id: 'permissions-mode', label: 'Permission mode', detail: 'Cycle prompt, allow-all, or custom permission mode.', key: 'permissions.mode' }),
117
+ settingAction({ id: 'permissions-write', label: 'File writes', detail: 'Cycle allow, prompt, or deny for file write operations.', key: 'permissions.tools.write' }),
118
+ settingAction({ id: 'permissions-edit', label: 'File edits', detail: 'Cycle allow, prompt, or deny for edit and patch operations.', key: 'permissions.tools.edit' }),
119
+ settingAction({ id: 'permissions-exec', label: 'Shell commands', detail: 'Cycle allow, prompt, or deny for shell execution.', key: 'permissions.tools.exec' }),
120
+ settingAction({ id: 'permissions-fetch', label: 'Network fetches', detail: 'Cycle allow, prompt, or deny for outbound fetch requests.', key: 'permissions.tools.fetch' }),
121
+ settingAction({ id: 'permissions-mcp', label: 'MCP tools', detail: 'Cycle allow, prompt, or deny for external MCP tool calls.', key: 'permissions.tools.mcp' }),
122
+ settingAction({ id: 'permissions-agent', label: 'Agent delegation', detail: 'Cycle allow, prompt, or deny for subagent and delegation operations.', key: 'permissions.tools.agent' }),
123
+ settingAction({ id: 'permissions-workflow', label: 'Workflow automation', detail: 'Cycle allow, prompt, or deny for multi-step workflow automation.', key: 'permissions.tools.workflow' }),
124
+ { id: 'onboarding-mcp-server', label: 'Add MCP server', detail: 'Add or update one MCP server with command, args, role, trust, env refs, paths, and hosts.', editorKind: 'mcp-server', kind: 'editor', safety: 'safe' },
125
+ { id: 'onboarding-secret-link', label: 'Link secret reference', detail: 'Link one config key to a goodvibes secret reference.', editorKind: 'secret-link', kind: 'editor', safety: 'safe' },
126
+ { id: 'onboarding-secret-test', label: 'Test secret reference', detail: 'Check one stored secret reference without printing the value.', editorKind: 'secret-test', kind: 'editor', safety: 'safe' },
127
+ ],
128
+ },
129
+ {
130
+ id: 'onboarding-display',
131
+ group: 'ONBOARDING',
132
+ label: 'Interface',
133
+ summary: 'Display, streaming, operational messages, and release channel.',
134
+ detail: 'Use this page to make the terminal readable for normal daily work.',
135
+ actions: [
136
+ settingAction({ id: 'display-stream', label: 'Stream tokens', detail: 'Toggle streaming assistant tokens as they arrive.', key: 'display.stream' }),
137
+ settingAction({ id: 'display-theme', label: 'Theme', detail: 'Set the color theme name.', key: 'display.theme' }),
138
+ settingAction({ id: 'display-line-numbers', label: 'Line numbers', detail: 'Cycle all, code-only, or off for assistant output line numbers.', key: 'display.lineNumbers' }),
139
+ settingAction({ id: 'display-collapse-threshold', label: 'Collapse threshold', detail: 'Set the line count threshold for collapsed tool output.', key: 'display.collapseThreshold' }),
140
+ settingAction({ id: 'display-token-speed', label: 'Token speed counter', detail: 'Toggle tokens-per-second while generating.', key: 'display.showTokenSpeed' }),
141
+ settingAction({ id: 'display-tool-preview', label: 'Tool call preview', detail: 'Toggle partial tool-call preview while streaming.', key: 'display.showToolPreview' }),
142
+ settingAction({ id: 'display-operational-messages', label: 'Operational messages', detail: 'Cycle panel, conversation, or both for tool and runtime messages.', key: 'ui.operationalMessages' }),
143
+ settingAction({ id: 'display-system-messages', label: 'System messages', detail: 'Cycle panel, conversation, or both for system messages.', key: 'ui.systemMessages' }),
144
+ settingAction({ id: 'display-release-channel', label: 'Release channel', detail: 'Cycle stable or preview for update flows.', key: 'release.channel' }),
145
+ ],
146
+ },
147
+ {
148
+ id: 'onboarding-channels',
149
+ group: 'ONBOARDING',
150
+ label: 'Messaging',
151
+ summary: 'Messaging surfaces and settings for enabled channels.',
152
+ detail: 'Start by enabling the channels you want. Channel-specific fields appear below each enabled channel.',
153
+ actions: [
154
+ { id: 'onboarding-pair-companion', label: 'Pair companion app', detail: 'Open the QR pairing view for companion access.', command: '/pair', kind: 'command', safety: 'safe' },
155
+ settingAction({ id: 'channel-ntfy-enabled', label: 'Use ntfy', detail: 'Toggle ntfy notifications and chat routing.', key: 'surfaces.ntfy.enabled' }),
156
+ settingAction({ id: 'channel-ntfy-base-url', label: 'ntfy base URL', detail: 'Set the ntfy server URL.', key: 'surfaces.ntfy.baseUrl', visibleWhenKey: 'surfaces.ntfy.enabled', visibleWhenValue: true }),
157
+ settingAction({ id: 'channel-ntfy-chat-topic', label: 'ntfy chat topic', detail: 'Set the topic routed into active terminal chat.', key: 'surfaces.ntfy.chatTopic', visibleWhenKey: 'surfaces.ntfy.enabled', visibleWhenValue: true }),
158
+ settingAction({ id: 'channel-ntfy-agent-topic', label: 'ntfy agent topic', detail: 'Set the topic routed to Agent work.', key: 'surfaces.ntfy.agentTopic', visibleWhenKey: 'surfaces.ntfy.enabled', visibleWhenValue: true }),
159
+ settingAction({ id: 'channel-ntfy-token', label: 'ntfy token', detail: 'Store the ntfy access token or secret reference.', key: 'surfaces.ntfy.token', visibleWhenKey: 'surfaces.ntfy.enabled', visibleWhenValue: true }),
160
+ settingAction({ id: 'channel-ntfy-priority', label: 'ntfy priority', detail: 'Set default ntfy priority from 1 to 5.', key: 'surfaces.ntfy.defaultPriority', visibleWhenKey: 'surfaces.ntfy.enabled', visibleWhenValue: true }),
161
+ settingAction({ id: 'channel-slack-enabled', label: 'Use Slack', detail: 'Toggle Slack adapter configuration.', key: 'surfaces.slack.enabled' }),
162
+ settingAction({ id: 'channel-slack-bot-token', label: 'Slack bot token', detail: 'Store the Slack bot token or secret reference.', key: 'surfaces.slack.botToken', visibleWhenKey: 'surfaces.slack.enabled', visibleWhenValue: true }),
163
+ settingAction({ id: 'channel-slack-signing-secret', label: 'Slack signing secret', detail: 'Store the Slack signing secret or secret reference.', key: 'surfaces.slack.signingSecret', visibleWhenKey: 'surfaces.slack.enabled', visibleWhenValue: true }),
164
+ settingAction({ id: 'channel-slack-default-channel', label: 'Slack default channel', detail: 'Set the default Slack channel for notifications and replies.', key: 'surfaces.slack.defaultChannel', visibleWhenKey: 'surfaces.slack.enabled', visibleWhenValue: true }),
165
+ settingAction({ id: 'channel-slack-workspace', label: 'Slack workspace ID', detail: 'Set the Slack workspace id for route binding.', key: 'surfaces.slack.workspaceId', visibleWhenKey: 'surfaces.slack.enabled', visibleWhenValue: true }),
166
+ settingAction({ id: 'channel-discord-enabled', label: 'Use Discord', detail: 'Toggle Discord adapter configuration.', key: 'surfaces.discord.enabled' }),
167
+ settingAction({ id: 'channel-discord-bot-token', label: 'Discord bot token', detail: 'Store the Discord bot token or secret reference.', key: 'surfaces.discord.botToken', visibleWhenKey: 'surfaces.discord.enabled', visibleWhenValue: true }),
168
+ settingAction({ id: 'channel-discord-application', label: 'Discord application ID', detail: 'Set the Discord application id.', key: 'surfaces.discord.applicationId', visibleWhenKey: 'surfaces.discord.enabled', visibleWhenValue: true }),
169
+ settingAction({ id: 'channel-discord-public-key', label: 'Discord public key', detail: 'Set the Discord application public key.', key: 'surfaces.discord.publicKey', visibleWhenKey: 'surfaces.discord.enabled', visibleWhenValue: true }),
170
+ settingAction({ id: 'channel-discord-default-channel', label: 'Discord default channel', detail: 'Set the default Discord channel id.', key: 'surfaces.discord.defaultChannelId', visibleWhenKey: 'surfaces.discord.enabled', visibleWhenValue: true }),
171
+ settingAction({ id: 'channel-webhook-enabled', label: 'Use webhooks', detail: 'Toggle generic webhook delivery.', key: 'surfaces.webhook.enabled' }),
172
+ settingAction({ id: 'channel-webhook-target', label: 'Webhook target URL', detail: 'Set the default outbound webhook target URL.', key: 'surfaces.webhook.defaultTarget', visibleWhenKey: 'surfaces.webhook.enabled', visibleWhenValue: true }),
173
+ settingAction({ id: 'channel-webhook-secret', label: 'Webhook secret', detail: 'Store the shared webhook secret or secret reference.', key: 'surfaces.webhook.secret', visibleWhenKey: 'surfaces.webhook.enabled', visibleWhenValue: true }),
174
+ settingAction({ id: 'channel-telegram-enabled', label: 'Use Telegram', detail: 'Toggle Telegram bot delivery.', key: 'surfaces.telegram.enabled' }),
175
+ settingAction({ id: 'channel-telegram-bot-token', label: 'Telegram bot token', detail: 'Store the Telegram bot token or secret reference.', key: 'surfaces.telegram.botToken', visibleWhenKey: 'surfaces.telegram.enabled', visibleWhenValue: true }),
176
+ settingAction({ id: 'channel-telegram-chat', label: 'Telegram chat ID', detail: 'Set the default Telegram chat, group, or channel id.', key: 'surfaces.telegram.defaultChatId', visibleWhenKey: 'surfaces.telegram.enabled', visibleWhenValue: true }),
177
+ settingAction({ id: 'channel-telegram-mode', label: 'Telegram mode', detail: 'Cycle webhook or polling ingress mode.', key: 'surfaces.telegram.mode', visibleWhenKey: 'surfaces.telegram.enabled', visibleWhenValue: true }),
178
+ settingAction({ id: 'channel-googlechat-enabled', label: 'Use Google Chat', detail: 'Toggle Google Chat delivery.', key: 'surfaces.googleChat.enabled' }),
179
+ settingAction({ id: 'channel-googlechat-webhook', label: 'Google Chat webhook', detail: 'Set the Google Chat webhook or app callback URL.', key: 'surfaces.googleChat.webhookUrl', visibleWhenKey: 'surfaces.googleChat.enabled', visibleWhenValue: true }),
180
+ settingAction({ id: 'channel-homeassistant-enabled', label: 'Use home automation', detail: 'Toggle home automation conversation and event delivery.', key: 'surfaces.homeassistant.enabled' }),
181
+ settingAction({ id: 'channel-homeassistant-url', label: 'Home automation URL', detail: 'Set the home automation instance URL.', key: 'surfaces.homeassistant.instanceUrl', visibleWhenKey: 'surfaces.homeassistant.enabled', visibleWhenValue: true }),
182
+ settingAction({ id: 'channel-homeassistant-token', label: 'Home automation token', detail: 'Store the home automation access token or secret reference.', key: 'surfaces.homeassistant.accessToken', visibleWhenKey: 'surfaces.homeassistant.enabled', visibleWhenValue: true }),
183
+ settingAction({ id: 'channel-signal-enabled', label: 'Use Signal', detail: 'Toggle Signal bridge delivery.', key: 'surfaces.signal.enabled' }),
184
+ settingAction({ id: 'channel-signal-bridge', label: 'Signal bridge URL', detail: 'Set the Signal bridge base URL.', key: 'surfaces.signal.bridgeUrl', visibleWhenKey: 'surfaces.signal.enabled', visibleWhenValue: true }),
185
+ settingAction({ id: 'channel-signal-recipient', label: 'Signal recipient', detail: 'Set the default Signal recipient or group.', key: 'surfaces.signal.defaultRecipient', visibleWhenKey: 'surfaces.signal.enabled', visibleWhenValue: true }),
186
+ settingAction({ id: 'channel-whatsapp-enabled', label: 'Use WhatsApp', detail: 'Toggle WhatsApp delivery.', key: 'surfaces.whatsapp.enabled' }),
187
+ settingAction({ id: 'channel-whatsapp-provider', label: 'WhatsApp provider', detail: 'Cycle Meta Cloud API or bridge provider mode.', key: 'surfaces.whatsapp.provider', visibleWhenKey: 'surfaces.whatsapp.enabled', visibleWhenValue: true }),
188
+ settingAction({ id: 'channel-whatsapp-token', label: 'WhatsApp access token', detail: 'Store the WhatsApp provider access token or secret reference.', key: 'surfaces.whatsapp.accessToken', visibleWhenKey: 'surfaces.whatsapp.enabled', visibleWhenValue: true }),
189
+ settingAction({ id: 'channel-whatsapp-recipient', label: 'WhatsApp recipient', detail: 'Set the default WhatsApp recipient or chat id.', key: 'surfaces.whatsapp.defaultRecipient', visibleWhenKey: 'surfaces.whatsapp.enabled', visibleWhenValue: true }),
190
+ settingAction({ id: 'channel-imessage-enabled', label: 'Use iMessage', detail: 'Toggle iMessage bridge delivery.', key: 'surfaces.imessage.enabled' }),
191
+ settingAction({ id: 'channel-imessage-bridge', label: 'iMessage bridge URL', detail: 'Set the iMessage bridge base URL.', key: 'surfaces.imessage.bridgeUrl', visibleWhenKey: 'surfaces.imessage.enabled', visibleWhenValue: true }),
192
+ settingAction({ id: 'channel-imessage-chat', label: 'iMessage chat ID', detail: 'Set the default iMessage chat id.', key: 'surfaces.imessage.defaultChatId', visibleWhenKey: 'surfaces.imessage.enabled', visibleWhenValue: true }),
193
+ { id: 'onboarding-notify-webhook', label: 'Add notification webhook', detail: 'Add one webhook target for explicit reminder and routine delivery.', editorKind: 'notify-webhook', kind: 'editor', safety: 'safe' },
194
+ { id: 'onboarding-test-webhook', label: 'Test notification webhooks', detail: 'Send one confirmed test notification to configured webhook targets.', editorKind: 'notify-webhook-test', kind: 'editor', safety: 'safe' },
195
+ ],
196
+ },
197
+ {
198
+ id: 'onboarding-voice-media',
199
+ group: 'ONBOARDING',
200
+ label: 'Voice & Phone',
201
+ summary: 'Configure spoken replies, TTS routing, media prompts, and telephony.',
202
+ detail: 'Use this page for local voice, spoken-output defaults, image/media prompts, and SMS or phone-call delivery.',
203
+ actions: [
204
+ settingAction({ id: 'voice-enabled', label: 'Use voice controls', detail: 'Toggle the optional local voice control surface.', key: 'ui.voiceEnabled' }),
205
+ settingAction({ id: 'voice-tts-provider', label: 'TTS provider', detail: 'Set the default text-to-speech provider id.', key: 'tts.provider' }),
206
+ settingAction({ id: 'voice-tts-voice', label: 'TTS voice', detail: 'Set the default text-to-speech voice id.', key: 'tts.voice' }),
207
+ { id: 'voice-speak-prompt', label: 'Try spoken prompt', detail: 'Open a prompt form for a spoken assistant reply through configured TTS.', editorKind: 'tts-prompt', kind: 'editor', safety: 'safe' },
208
+ { id: 'media-attach-image', label: 'Attach image', detail: 'Attach a local image path and optional prompt to the next assistant turn.', editorKind: 'image-input', kind: 'editor', safety: 'safe' },
209
+ { id: 'onboarding-media-generate', label: 'Generate media', detail: 'Generate image or video artifacts through a configured media provider after confirmation.', editorKind: 'media-generate', kind: 'editor', safety: 'safe' },
210
+ settingAction({ id: 'telephony-enabled', label: 'Use telephony', detail: 'Toggle SMS, voice call, or telephony bridge delivery.', key: 'surfaces.telephony.enabled' }),
211
+ settingAction({ id: 'telephony-provider', label: 'Telephony provider', detail: 'Cycle direct provider or bridge mode.', key: 'surfaces.telephony.provider', visibleWhenKey: 'surfaces.telephony.enabled', visibleWhenValue: true }),
212
+ settingAction({ id: 'telephony-mode', label: 'Telephony mode', detail: 'Cycle SMS, voice call, or bridge delivery mode.', key: 'surfaces.telephony.mode', visibleWhenKey: 'surfaces.telephony.enabled', visibleWhenValue: true }),
213
+ settingAction({ id: 'telephony-account-sid', label: 'Twilio account SID', detail: 'Set the Twilio account SID for provider-direct delivery.', key: 'surfaces.telephony.accountSid', visibleWhenKey: 'surfaces.telephony.enabled', visibleWhenValue: true }),
214
+ settingAction({ id: 'telephony-auth-token', label: 'Twilio auth token', detail: 'Store the Twilio auth token or secret reference.', key: 'surfaces.telephony.authToken', visibleWhenKey: 'surfaces.telephony.enabled', visibleWhenValue: true }),
215
+ settingAction({ id: 'telephony-from', label: 'Sender phone number', detail: 'Set the default caller or sender phone number.', key: 'surfaces.telephony.fromNumber', visibleWhenKey: 'surfaces.telephony.enabled', visibleWhenValue: true }),
216
+ settingAction({ id: 'telephony-recipient', label: 'Recipient phone number', detail: 'Set the default telephony recipient number.', key: 'surfaces.telephony.defaultRecipient', visibleWhenKey: 'surfaces.telephony.enabled', visibleWhenValue: true }),
217
+ settingAction({ id: 'telephony-webhook-secret', label: 'Telephony webhook secret', detail: 'Store the shared telephony webhook secret or secret reference.', key: 'surfaces.telephony.webhookSecret', visibleWhenKey: 'surfaces.telephony.enabled', visibleWhenValue: true }),
218
+ settingAction({ id: 'telephony-voice-language', label: 'Voice language', detail: 'Set the BCP-47 language code for voice-call text-to-speech.', key: 'surfaces.telephony.voiceLanguage', visibleWhenKey: 'surfaces.telephony.enabled', visibleWhenValue: true }),
219
+ ],
220
+ },
221
+ {
222
+ id: 'onboarding-context',
223
+ group: 'ONBOARDING',
224
+ label: 'Context',
225
+ summary: 'Local persona, memory, skills, routines, notes, and Agent Knowledge.',
226
+ detail: 'Use this page to make the assistant useful with durable local context and source-backed knowledge.',
227
+ actions: [
228
+ { id: 'context-profile-from-discovered', label: 'Profile from discovered files', detail: 'Create an isolated Agent profile from reviewed local persona, skill, and routine files.', editorKind: 'profile-from-discovered', kind: 'editor', safety: 'safe' },
229
+ { id: 'context-persona-discovery', label: 'Import persona files', detail: 'Import discovered persona files into the Agent persona registry.', editorKind: 'persona-discovery-import', kind: 'editor', safety: 'safe' },
230
+ { id: 'context-skill-discovery', label: 'Import skill files', detail: 'Import discovered skill files into the Agent skill registry.', editorKind: 'skill-discovery-import', kind: 'editor', safety: 'safe' },
231
+ { id: 'context-routine-discovery', label: 'Import routine files', detail: 'Import discovered routine files into the Agent routine registry.', editorKind: 'routine-discovery-import', kind: 'editor', safety: 'safe' },
232
+ { id: 'context-create-persona', label: 'Create persona', detail: 'Create and optionally activate an Agent-local persona.', editorKind: 'persona', kind: 'editor', safety: 'safe' },
233
+ { id: 'context-create-memory', label: 'Create starter memory', detail: 'Create one durable local memory record.', editorKind: 'memory', kind: 'editor', safety: 'safe' },
234
+ { id: 'context-create-skill', label: 'Create skill', detail: 'Create one reusable Agent-local skill.', editorKind: 'skill', kind: 'editor', safety: 'safe' },
235
+ { id: 'context-create-routine', label: 'Create routine', detail: 'Create one reusable Agent-local routine.', editorKind: 'routine', kind: 'editor', safety: 'safe' },
236
+ { id: 'context-create-note', label: 'Create note', detail: 'Create one Agent-local scratchpad note.', editorKind: 'note', kind: 'editor', safety: 'safe' },
237
+ { id: 'context-knowledge-url', label: 'Ingest URL', detail: 'Ingest a reviewed URL into isolated Agent Knowledge after confirmation.', editorKind: 'knowledge-url', kind: 'editor', safety: 'safe' },
238
+ { id: 'context-knowledge-file', label: 'Ingest file', detail: 'Ingest a local file into isolated Agent Knowledge after confirmation.', editorKind: 'knowledge-file', kind: 'editor', safety: 'safe' },
239
+ { id: 'context-knowledge-bookmarks', label: 'Import bookmarks', detail: 'Import a browser bookmark export into isolated Agent Knowledge.', editorKind: 'knowledge-bookmarks', kind: 'editor', safety: 'safe' },
240
+ { id: 'context-knowledge-browser-history', label: 'Import browser history', detail: 'Import local browser history or bookmarks into isolated Agent Knowledge.', editorKind: 'knowledge-browser-history', kind: 'editor', safety: 'safe' },
241
+ ],
242
+ },
243
+ {
244
+ id: 'onboarding-verify',
245
+ group: 'ONBOARDING',
246
+ label: 'Verify',
247
+ summary: 'Review the configured runtime before finishing onboarding.',
248
+ detail: 'Use this page to inspect health, model/provider state, channels, MCP, and knowledge before applying the completion marker.',
249
+ actions: [
250
+ { id: 'verify-brief', label: 'Operator briefing', detail: 'Show a concise status and next-action briefing.', command: '/brief', kind: 'command', safety: 'read-only' },
251
+ { id: 'verify-health', label: 'Health review', detail: 'Review local runtime and connected-host status.', command: '/health review', kind: 'command', safety: 'read-only' },
252
+ { id: 'verify-compat', label: 'Compatibility', detail: 'Inspect connected-host compatibility and Agent Knowledge route readiness.', command: '/compat', kind: 'command', safety: 'read-only' },
253
+ { id: 'verify-provider', label: 'Provider status', detail: 'Inspect provider/model routing state.', command: '/provider', kind: 'command', safety: 'read-only' },
254
+ { id: 'verify-subscription', label: 'Subscription status', detail: 'Inspect active and pending provider subscription sessions.', command: '/subscription review', kind: 'command', safety: 'read-only' },
255
+ { id: 'verify-channels', label: 'Channel readiness', detail: 'Inspect channel readiness and enabled-channel attention items.', command: '/channels attention', kind: 'command', safety: 'read-only' },
256
+ { id: 'verify-mcp', label: 'MCP review', detail: 'Inspect MCP server connection, role, trust, and quarantine posture.', command: '/mcp review', kind: 'command', safety: 'read-only' },
257
+ { id: 'verify-knowledge', label: 'Knowledge status', detail: 'Inspect isolated Agent Knowledge readiness and counts.', command: '/knowledge status', kind: 'command', safety: 'read-only' },
93
258
  ],
94
259
  },
95
260
  {
@@ -563,7 +728,9 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
563
728
  { id: 'host-auth-review', label: 'Provider auth review', detail: 'Review provider auth posture without printing token values.', command: '/auth review', kind: 'command', safety: 'read-only' },
564
729
  { id: 'host-security', label: 'Security review', detail: 'Inspect token posture, MCP attack paths, policy lint, plugin risk, and incident pressure.', command: '/security review', kind: 'command', safety: 'read-only' },
565
730
  { id: 'host-trust', label: 'Trust review', detail: 'Review permission, secret, plugin, and MCP trust posture without exporting bundles or changing trust.', command: '/trust review', kind: 'command', safety: 'read-only' },
566
- { id: 'host-support-bundle', label: 'Support bundle', detail: 'Open support bundle export, inspect, and import actions for host-facing setup review.', targetCategoryId: 'setup', kind: 'workspace', safety: 'safe' },
731
+ { id: 'host-support-bundle-export', label: 'Export support bundle', detail: 'Export a redacted Agent support bundle from the Host page.', editorKind: 'support-bundle-export', kind: 'editor', safety: 'safe' },
732
+ { id: 'host-support-bundle-inspect', label: 'Inspect support bundle', detail: 'Inspect a support bundle before import or sharing.', editorKind: 'support-bundle-inspect', kind: 'editor', safety: 'read-only' },
733
+ { id: 'host-support-bundle-import', label: 'Import support bundle', detail: 'Import reviewed, non-redacted config values from a support bundle.', editorKind: 'support-bundle-import', kind: 'editor', safety: 'safe' },
567
734
  { id: 'host-telemetry', label: 'Telemetry settings', detail: 'Open telemetry payload policy settings for connected-host and Agent observability review.', command: '/config telemetry', kind: 'command', safety: 'safe' },
568
735
  { id: 'host-config', label: 'Control-plane settings', detail: 'Open configuration controls for service, channels, tools, automation, provider, and storage posture.', command: '/config', kind: 'command', safety: 'safe' },
569
736
  { id: 'host-safety', label: 'Host mutation policy', detail: 'Agent may inspect connected-host surfaces and run explicit confirmed actions, but does not silently create tasks, send channel messages, mutate auth, or start automation.', kind: 'guidance', safety: 'blocked' },
@@ -615,29 +782,18 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
615
782
  label: 'Finish',
616
783
  summary: 'Acknowledge setup and close onboarding.',
617
784
  detail: 'Use this final step after reviewing setup. Apply & close writes the user onboarding completion marker so normal future launches start in the main conversation.',
618
- actions: [
619
- { id: 'onboarding-apply-close', label: 'Apply & close', detail: 'Acknowledge onboarding as finished, persist the user completion marker, and close the fullscreen Agent workspace.', kind: 'onboarding-complete', safety: 'safe' },
620
- ],
785
+ actions: [{ id: 'onboarding-apply-close', label: 'Apply & close', detail: 'Acknowledge onboarding as finished, persist the user completion marker, and close the fullscreen Agent workspace.', kind: 'onboarding-complete', safety: 'safe' }],
621
786
  },
622
787
  ];
623
788
 
624
789
  export function renderAgentWorkspacePackageText(): string {
625
790
  const lines: string[] = [];
626
791
  for (const category of AGENT_WORKSPACE_CATEGORIES) {
627
- lines.push(
628
- category.id,
629
- category.group,
630
- category.label,
631
- category.summary,
632
- category.detail,
633
- );
792
+ lines.push(category.id, category.group, category.label, category.summary, category.detail);
634
793
  for (const action of category.actions) {
635
- lines.push(action.id, action.label, action.detail, action.kind, action.safety);
636
- if (action.command) lines.push(action.command);
637
- if (action.targetCategoryId) lines.push(`target:${action.targetCategoryId}`);
638
- if (action.editorKind) lines.push(`editor:${action.editorKind}`);
639
- if (action.localKind) lines.push(`local:${action.localKind}`);
640
- if (action.localOperation) lines.push(`operation:${action.localOperation}`);
794
+ lines.push(action.id, action.label, action.detail, action.kind);
795
+ const extras = [action.command, action.targetCategoryId ? `target:${action.targetCategoryId}` : '', action.editorKind ? `editor:${action.editorKind}` : '', action.settingKey ? `setting:${action.settingKey}` : '', action.kind === 'settings-import' ? 'import:goodvibes-tui-settings' : '', action.localKind ? `local:${action.localKind}` : '', action.localOperation ? `operation:${action.localOperation}` : ''];
796
+ for (const extra of extras) if (extra) lines.push(extra);
641
797
  }
642
798
  }
643
799
  return lines.join('\n');
@@ -0,0 +1,25 @@
1
+ import type { AgentWorkspaceCategory } from './agent-workspace-types.ts';
2
+
3
+ type AgentWorkspaceAction = AgentWorkspaceCategory['actions'][number];
4
+
5
+ export function settingAction(options: {
6
+ readonly id: string;
7
+ readonly label: string;
8
+ readonly detail: string;
9
+ readonly key: string;
10
+ readonly value?: string;
11
+ readonly visibleWhenKey?: string;
12
+ readonly visibleWhenValue?: string | boolean | number;
13
+ }): AgentWorkspaceAction {
14
+ return {
15
+ id: options.id,
16
+ label: options.label,
17
+ detail: options.detail,
18
+ kind: 'setting',
19
+ safety: 'safe',
20
+ settingKey: options.key,
21
+ ...(options.value !== undefined ? { settingValueHint: options.value } : {}),
22
+ ...(options.visibleWhenKey !== undefined ? { visibleWhenSettingKey: options.visibleWhenKey } : {}),
23
+ ...(options.visibleWhenValue !== undefined ? { visibleWhenSettingValue: options.visibleWhenValue } : {}),
24
+ };
25
+ }