@pellux/goodvibes-agent 1.1.3 → 1.1.5

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,6 @@
1
1
  import type { AgentWorkspaceCategory } from './agent-workspace-types.ts';
2
+ import { settingAction } from './agent-workspace-category-actions.ts';
3
+ import { AGENT_WORKSPACE_HOST_CATEGORY } from './agent-workspace-host-category.ts';
2
4
 
3
5
  export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
4
6
  {
@@ -11,7 +13,8 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
11
13
  { 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
14
  { 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
15
  { 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' },
16
+ { id: 'model-refresh', label: 'Refresh model catalog', detail: 'Refresh locally cached provider model lists without changing the selected route.', command: '/refresh-models', kind: 'command', safety: 'safe' },
17
+ { 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
18
  { 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
19
  { 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
20
  { 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 +38,249 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
35
38
  },
36
39
  {
37
40
  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.',
41
+ group: 'ONBOARDING',
42
+ label: 'Start',
43
+ summary: 'Import preferences, sign in, and choose the main model.',
44
+ detail: 'Start here on a fresh install. Every row either saves state, opens the shared model picker, or opens a confirmed in-modal form.',
45
+ actions: [
46
+ { id: 'import-goodvibes-tui-settings', label: 'Import GoodVibes settings', detail: 'Copy existing display, provider, behavior, permission, TTS, channel, helper, tool, release, and automation values into Agent-owned settings.', kind: 'settings-import', safety: 'safe' },
47
+ { id: 'subscription-login-start', label: 'Start subscription login', detail: 'Start one provider sign-in flow, save pending state, and return here.', editorKind: 'subscription-login-start', kind: 'editor', safety: 'safe' },
48
+ { id: 'subscription-login-finish', label: 'Finish subscription login', detail: 'Exchange a code or redirect URL and save the provider subscription session.', editorKind: 'subscription-login-finish', kind: 'editor', safety: 'safe' },
49
+ { id: 'setup-provider-model', label: 'Choose main model', detail: 'Open the shared provider/model picker for normal assistant turns.', kind: 'model-picker', modelPickerFlow: 'providerModel', modelPickerTarget: 'main', safety: 'safe' },
50
+ settingAction({ id: 'setup-reasoning-effort', label: 'Reasoning effort', detail: 'Cycle reasoning level when the selected model supports it.', key: 'provider.reasoningEffort' }),
51
+ { id: 'subscription-logout', label: 'Logout subscription', detail: 'Remove one stored or pending provider subscription session after confirmation.', editorKind: 'subscription-logout', kind: 'editor', safety: 'safe' },
52
+ { id: 'provider-add', label: 'Add custom provider', detail: 'Add one OpenAI-compatible provider for Agent model routing.', editorKind: 'provider-add', kind: 'editor', safety: 'safe' },
53
+ { id: 'secret-set-provider', label: 'Store secret', detail: 'Store a provider or channel credential through the Agent secret manager.', editorKind: 'secret-set', kind: 'editor', safety: 'safe' },
54
+ settingAction({ id: 'setup-secret-policy', label: 'Secret storage', detail: 'Choose how strongly Agent prefers secure secret storage.', key: 'storage.secretPolicy' }),
55
+ settingAction({ id: 'setup-save-history', label: 'Save history', detail: 'Toggle local conversation history persistence.', key: 'behavior.saveHistory' }),
56
+ ],
57
+ },
58
+ {
59
+ id: 'account-model',
60
+ group: 'ONBOARDING',
61
+ label: 'Model Routing',
62
+ summary: 'Set chat, embedding, helper, tool, and spoken-turn routes.',
63
+ detail: 'Use this after sign-in. Routes are saved settings, so selections persist across launches.',
64
+ actions: [
65
+ { id: 'provider-use', label: 'Choose provider and model', detail: 'Open the shared provider/model picker for the main chat route.', kind: 'model-picker', modelPickerFlow: 'providerModel', modelPickerTarget: 'main', safety: 'safe' },
66
+ { id: 'provider-remove', label: 'Remove custom provider', detail: 'Remove one custom provider config after confirmation.', editorKind: 'provider-remove', kind: 'editor', safety: 'safe' },
67
+ { id: 'account-main-model', label: 'Choose main model', detail: 'Open the shared model picker for normal assistant turns.', kind: 'model-picker', modelPickerFlow: 'model', modelPickerTarget: 'main', safety: 'safe' },
68
+ settingAction({ id: 'account-reasoning', label: 'Reasoning effort', detail: 'Cycle the reasoning effort used when supported.', key: 'provider.reasoningEffort' }),
69
+ settingAction({ id: 'account-embedding', label: 'Embedding provider', detail: 'Set the embedding provider for memory and retrieval.', key: 'provider.embeddingProvider' }),
70
+ settingAction({ id: 'account-system-prompt', label: 'System prompt file', detail: 'Set an optional local system prompt file path.', key: 'provider.systemPromptFile' }),
71
+ settingAction({ id: 'account-helper-enabled', label: 'Enable helper model', detail: 'Toggle dedicated helper routing for background utility work.', key: 'helper.enabled' }),
72
+ { id: 'account-helper-provider', label: 'Choose helper provider/model', detail: 'Open the shared provider/model picker for helper routing.', kind: 'model-picker', modelPickerFlow: 'providerModel', modelPickerTarget: 'helper', visibleWhenSettingKey: 'helper.enabled', visibleWhenSettingValue: true, safety: 'safe' },
73
+ { id: 'account-helper-model', label: 'Choose helper model', detail: 'Open the shared model picker for helper routing.', kind: 'model-picker', modelPickerFlow: 'model', modelPickerTarget: 'helper', visibleWhenSettingKey: 'helper.enabled', visibleWhenSettingValue: true, safety: 'safe' },
74
+ settingAction({ id: 'account-tool-llm-enabled', label: 'Enable tool LLM', detail: 'Toggle a dedicated tool LLM for internal operations.', key: 'tools.llmEnabled' }),
75
+ { id: 'account-tool-provider', label: 'Choose tool provider/model', detail: 'Open the shared provider/model picker for dedicated tool LLM calls.', kind: 'model-picker', modelPickerFlow: 'providerModel', modelPickerTarget: 'tool', visibleWhenSettingKey: 'tools.llmEnabled', visibleWhenSettingValue: true, safety: 'safe' },
76
+ { id: 'account-tool-model', label: 'Choose tool model', detail: 'Open the shared model picker for dedicated tool LLM calls.', kind: 'model-picker', modelPickerFlow: 'model', modelPickerTarget: 'tool', visibleWhenSettingKey: 'tools.llmEnabled', visibleWhenSettingValue: true, safety: 'safe' },
77
+ { id: 'account-tts-llm-provider', label: 'Choose spoken-turn provider/model', detail: 'Open the shared provider/model picker for spoken-response turns.', kind: 'model-picker', modelPickerFlow: 'providerModel', modelPickerTarget: 'tts', safety: 'safe' },
78
+ { id: 'account-tts-llm-model', label: 'Choose spoken-turn model', detail: 'Open the shared model picker for spoken-response turns.', kind: 'model-picker', modelPickerFlow: 'model', modelPickerTarget: 'tts', safety: 'safe' },
79
+ settingAction({ id: 'account-provider-fallback-hint', label: 'Provider failure hints', detail: 'Toggle alternative model suggestions when the current provider fails non-transiently.', key: 'behavior.suggestAlternativeOnProviderFail' }),
80
+ settingAction({ id: 'account-cache-enabled', label: 'Prompt cache', detail: 'Toggle prompt caching for eligible providers.', key: 'cache.enabled' }),
81
+ settingAction({ id: 'account-cache-ttl', label: 'Cache TTL', detail: 'Cycle ephemeral or persistent cache TTL for stable content.', key: 'cache.stableTtl', visibleWhenKey: 'cache.enabled', visibleWhenValue: true }),
82
+ settingAction({ id: 'account-cache-monitor', label: 'Cache hit-rate monitor', detail: 'Toggle cache hit-rate monitoring.', key: 'cache.monitorHitRate', visibleWhenKey: 'cache.enabled', visibleWhenValue: true }),
83
+ settingAction({ id: 'account-cache-threshold', label: 'Cache warning threshold', detail: 'Set the cache hit-rate warning threshold.', key: 'cache.hitRateWarningThreshold', visibleWhenKey: 'cache.monitorHitRate', visibleWhenValue: true }),
84
+ ],
85
+ },
86
+ {
87
+ id: 'assistant-behavior',
88
+ group: 'ONBOARDING',
89
+ label: 'Behavior',
90
+ summary: 'Set interaction style, context pressure behavior, and visible reasoning.',
91
+ detail: 'Use this to choose how chat feels during normal work and long-running tasks.',
92
+ actions: [
93
+ settingAction({ id: 'behavior-hitl-mode', label: 'Interaction mode', detail: 'Cycle quiet, balanced, or operator interaction mode.', key: 'behavior.hitlMode' }),
94
+ settingAction({ id: 'behavior-guidance-mode', label: 'Guidance mode', detail: 'Cycle off, minimal, or guided operational guidance.', key: 'behavior.guidanceMode' }),
95
+ settingAction({ id: 'behavior-auto-compact', label: 'Auto-compact threshold', detail: 'Set the context percentage that triggers automatic compaction.', key: 'behavior.autoCompactThreshold' }),
96
+ settingAction({ id: 'behavior-stale-context', label: 'Context warnings', detail: 'Toggle proactive warnings before compaction is required.', key: 'behavior.staleContextWarnings' }),
97
+ settingAction({ id: 'behavior-notify-complete', label: 'Notify on long turns', detail: 'Toggle terminal and desktop notification when a long turn completes.', key: 'behavior.notifyOnComplete' }),
98
+ settingAction({ id: 'behavior-return-context', label: 'Resume summary mode', detail: 'Cycle off, local, or assisted resume summaries.', key: 'behavior.returnContextMode' }),
99
+ settingAction({ id: 'behavior-show-thinking', label: 'Show thinking blocks', detail: 'Toggle visible reasoning/thinking content when the provider returns it.', key: 'display.showThinking' }),
100
+ settingAction({ id: 'behavior-show-reasoning-summary', label: 'Show reasoning summary', detail: 'Toggle visible reasoning summaries when supported.', key: 'display.showReasoningSummary' }),
101
+ ],
102
+ },
103
+ {
104
+ id: 'tools-permissions',
105
+ group: 'ONBOARDING',
106
+ label: 'Tools & Permissions',
107
+ summary: 'Set approval policy, MCP entry points, and secret references.',
108
+ detail: 'Use this before enabling tool-heavy work. Permission rows write policy; MCP and secret rows open setup forms.',
109
+ actions: [
110
+ settingAction({ id: 'permissions-mode', label: 'Permission mode', detail: 'Cycle prompt, allow-all, or custom permission mode.', key: 'permissions.mode' }),
111
+ settingAction({ id: 'permissions-auto-approve', label: 'Auto-approve tools', detail: 'Toggle automatic approval for all tool permission requests.', key: 'behavior.autoApprove' }),
112
+ settingAction({ id: 'permissions-read', label: 'File reads', detail: 'Cycle allow, prompt, or deny for file read operations.', key: 'permissions.tools.read' }),
113
+ settingAction({ id: 'permissions-find', label: 'File search', detail: 'Cycle allow, prompt, or deny for file and directory search operations.', key: 'permissions.tools.find' }),
114
+ settingAction({ id: 'permissions-write', label: 'File writes', detail: 'Cycle allow, prompt, or deny for file write operations.', key: 'permissions.tools.write' }),
115
+ settingAction({ id: 'permissions-edit', label: 'File edits', detail: 'Cycle allow, prompt, or deny for edit and patch operations.', key: 'permissions.tools.edit' }),
116
+ settingAction({ id: 'permissions-exec', label: 'Shell commands', detail: 'Cycle allow, prompt, or deny for shell execution.', key: 'permissions.tools.exec' }),
117
+ settingAction({ id: 'permissions-fetch', label: 'Network fetches', detail: 'Cycle allow, prompt, or deny for outbound fetch requests.', key: 'permissions.tools.fetch' }),
118
+ settingAction({ id: 'permissions-analyze', label: 'Code analysis', detail: 'Cycle allow, prompt, or deny for code and project analysis operations.', key: 'permissions.tools.analyze' }),
119
+ settingAction({ id: 'permissions-inspect', label: 'Runtime inspect', detail: 'Cycle allow, prompt, or deny for runtime state inspection.', key: 'permissions.tools.inspect' }),
120
+ settingAction({ id: 'permissions-state', label: 'State reads', detail: 'Cycle allow, prompt, or deny for reading runtime and session state.', key: 'permissions.tools.state' }),
121
+ settingAction({ id: 'permissions-registry', label: 'Registry reads', detail: 'Cycle allow, prompt, or deny for tool and skill registry queries.', key: 'permissions.tools.registry' }),
122
+ settingAction({ id: 'permissions-mcp', label: 'MCP tools', detail: 'Cycle allow, prompt, or deny for external MCP tool calls.', key: 'permissions.tools.mcp' }),
123
+ settingAction({ id: 'permissions-agent', label: 'Agent delegation', detail: 'Cycle allow, prompt, or deny for subagent and delegation operations.', key: 'permissions.tools.agent' }),
124
+ settingAction({ id: 'permissions-workflow', label: 'Workflow automation', detail: 'Cycle allow, prompt, or deny for multi-step workflow automation.', key: 'permissions.tools.workflow' }),
125
+ settingAction({ id: 'permissions-delegate', label: 'Unknown tools', detail: 'Cycle allow, prompt, or deny for unknown or unregistered tools.', key: 'permissions.tools.delegate' }),
126
+ { 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' },
127
+ { 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' },
128
+ { 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' },
129
+ settingAction({ id: 'tools-auto-heal', label: 'Tool auto-heal', detail: 'Toggle automatic syntax repair for precision write and edit operations.', key: 'tools.autoHeal' }),
130
+ settingAction({ id: 'tools-token-budget', label: 'Tool token budget', detail: 'Set the default token budget for precision read operations.', key: 'tools.defaultTokenBudget' }),
131
+ settingAction({ id: 'tools-hooks-file', label: 'Hooks file', detail: 'Set the hook configuration file name relative to host data.', key: 'tools.hooksFile' }),
132
+ settingAction({ id: 'storage-artifact-limit', label: 'Artifact storage limit', detail: 'Set the maximum artifact size for file, URL, multipart, and raw upload ingest.', key: 'storage.artifacts.maxBytes' }),
133
+ settingAction({ id: 'telemetry-raw-prompts', label: 'Raw prompt telemetry', detail: 'Toggle raw prompt and response telemetry; leave off unless debugging locally.', key: 'telemetry.includeRawPrompts' }),
134
+ ],
135
+ },
136
+ {
137
+ id: 'onboarding-display',
138
+ group: 'ONBOARDING',
139
+ label: 'Interface',
140
+ summary: 'Display, streaming, message placement, and release channel.',
141
+ detail: 'Use this page to make the terminal readable for daily operation.',
142
+ actions: [
143
+ settingAction({ id: 'display-stream', label: 'Stream tokens', detail: 'Toggle streaming assistant tokens as they arrive.', key: 'display.stream' }),
144
+ settingAction({ id: 'display-theme', label: 'Theme', detail: 'Set the color theme name.', key: 'display.theme' }),
145
+ settingAction({ id: 'display-line-numbers', label: 'Line numbers', detail: 'Cycle all, code-only, or off for assistant output line numbers.', key: 'display.lineNumbers' }),
146
+ settingAction({ id: 'display-collapse-threshold', label: 'Collapse threshold', detail: 'Set the line count threshold for collapsed tool output.', key: 'display.collapseThreshold' }),
147
+ settingAction({ id: 'display-token-speed', label: 'Token speed counter', detail: 'Toggle tokens-per-second while generating.', key: 'display.showTokenSpeed' }),
148
+ settingAction({ id: 'display-tool-preview', label: 'Tool call preview', detail: 'Toggle partial tool-call preview while streaming.', key: 'display.showToolPreview' }),
149
+ settingAction({ id: 'display-operational-messages', label: 'Operational messages', detail: 'Cycle panel, conversation, or both for tool and runtime messages.', key: 'ui.operationalMessages' }),
150
+ settingAction({ id: 'display-system-messages', label: 'System messages', detail: 'Cycle panel, conversation, or both for system messages.', key: 'ui.systemMessages' }),
151
+ settingAction({ id: 'display-release-channel', label: 'Release channel', detail: 'Cycle stable or preview for update flows.', key: 'release.channel' }),
152
+ ],
153
+ },
154
+ {
155
+ id: 'onboarding-channels',
156
+ group: 'ONBOARDING',
157
+ label: 'Messaging',
158
+ summary: 'Choose remote channels, then fill only the fields for enabled channels.',
159
+ detail: 'Enable the channels you actually want. Channel credentials and default targets are saved as Agent settings or secret refs.',
160
+ actions: [
161
+ settingAction({ id: 'channel-ntfy-enabled', label: 'Use ntfy', detail: 'Toggle ntfy notifications and chat routing.', key: 'surfaces.ntfy.enabled' }),
162
+ 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 }),
163
+ 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 }),
164
+ 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 }),
165
+ settingAction({ id: 'channel-ntfy-default-topic', label: 'ntfy default topic', detail: 'Set the default outbound notification topic.', key: 'surfaces.ntfy.topic', visibleWhenKey: 'surfaces.ntfy.enabled', visibleWhenValue: true }),
166
+ settingAction({ id: 'channel-ntfy-remote-topic', label: 'ntfy remote topic', detail: 'Set the daemon-owned remote chat topic.', key: 'surfaces.ntfy.remoteTopic', visibleWhenKey: 'surfaces.ntfy.enabled', visibleWhenValue: true }),
167
+ 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 }),
168
+ 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 }),
169
+ settingAction({ id: 'channel-slack-enabled', label: 'Use Slack', detail: 'Toggle Slack adapter configuration.', key: 'surfaces.slack.enabled' }),
170
+ 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 }),
171
+ settingAction({ id: 'channel-slack-app-token', label: 'Slack app token', detail: 'Store the Slack app token or secret reference.', key: 'surfaces.slack.appToken', visibleWhenKey: 'surfaces.slack.enabled', visibleWhenValue: true }),
172
+ 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 }),
173
+ 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 }),
174
+ 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 }),
175
+ settingAction({ id: 'channel-discord-enabled', label: 'Use Discord', detail: 'Toggle Discord adapter configuration.', key: 'surfaces.discord.enabled' }),
176
+ 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 }),
177
+ 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 }),
178
+ 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 }),
179
+ settingAction({ id: 'channel-discord-guild', label: 'Discord guild ID', detail: 'Set the default Discord guild id.', key: 'surfaces.discord.guildId', visibleWhenKey: 'surfaces.discord.enabled', visibleWhenValue: true }),
180
+ 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 }),
181
+ settingAction({ id: 'channel-webhook-enabled', label: 'Use webhooks', detail: 'Toggle generic webhook delivery.', key: 'surfaces.webhook.enabled' }),
182
+ 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 }),
183
+ 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 }),
184
+ settingAction({ id: 'channel-webhook-timeout', label: 'Webhook timeout', detail: 'Set outbound webhook timeout in milliseconds.', key: 'surfaces.webhook.timeoutMs', visibleWhenKey: 'surfaces.webhook.enabled', visibleWhenValue: true }),
185
+ settingAction({ id: 'channel-telegram-enabled', label: 'Use Telegram', detail: 'Toggle Telegram bot delivery.', key: 'surfaces.telegram.enabled' }),
186
+ 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 }),
187
+ settingAction({ id: 'channel-telegram-bot-username', label: 'Telegram bot username', detail: 'Set the Telegram bot username.', key: 'surfaces.telegram.botUsername', visibleWhenKey: 'surfaces.telegram.enabled', visibleWhenValue: true }),
188
+ 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 }),
189
+ 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 }),
190
+ settingAction({ id: 'channel-telegram-webhook-secret', label: 'Telegram webhook secret', detail: 'Store the Telegram webhook secret or secret reference.', key: 'surfaces.telegram.webhookSecret', visibleWhenKey: 'surfaces.telegram.enabled', visibleWhenValue: true }),
191
+ settingAction({ id: 'channel-googlechat-enabled', label: 'Use Google Chat', detail: 'Toggle Google Chat delivery.', key: 'surfaces.googleChat.enabled' }),
192
+ 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 }),
193
+ settingAction({ id: 'channel-googlechat-space', label: 'Google Chat space', detail: 'Set the default Google Chat space id.', key: 'surfaces.googleChat.spaceId', visibleWhenKey: 'surfaces.googleChat.enabled', visibleWhenValue: true }),
194
+ settingAction({ id: 'channel-googlechat-app-id', label: 'Google Chat app ID', detail: 'Set the Google Chat app id.', key: 'surfaces.googleChat.appId', visibleWhenKey: 'surfaces.googleChat.enabled', visibleWhenValue: true }),
195
+ settingAction({ id: 'channel-googlechat-verification', label: 'Google Chat verification', detail: 'Store the Google Chat verification token or secret reference.', key: 'surfaces.googleChat.verificationToken', visibleWhenKey: 'surfaces.googleChat.enabled', visibleWhenValue: true }),
196
+ settingAction({ id: 'channel-homeassistant-enabled', label: 'Use home automation', detail: 'Toggle home automation conversation and event delivery.', key: 'surfaces.homeassistant.enabled' }),
197
+ 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 }),
198
+ 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 }),
199
+ settingAction({ id: 'channel-homeassistant-webhook-secret', label: 'Home automation webhook secret', detail: 'Store the shared secret used to verify inbound callbacks.', key: 'surfaces.homeassistant.webhookSecret', visibleWhenKey: 'surfaces.homeassistant.enabled', visibleWhenValue: true }),
200
+ settingAction({ id: 'channel-homeassistant-conversation', label: 'Home automation conversation', detail: 'Set the default conversation id.', key: 'surfaces.homeassistant.defaultConversationId', visibleWhenKey: 'surfaces.homeassistant.enabled', visibleWhenValue: true }),
201
+ settingAction({ id: 'channel-homeassistant-device-id', label: 'Home automation device ID', detail: 'Set the stable device id exposed to the home automation surface.', key: 'surfaces.homeassistant.deviceId', visibleWhenKey: 'surfaces.homeassistant.enabled', visibleWhenValue: true }),
202
+ settingAction({ id: 'channel-homeassistant-device-name', label: 'Home automation device name', detail: 'Set the device display name exposed to the home automation surface.', key: 'surfaces.homeassistant.deviceName', visibleWhenKey: 'surfaces.homeassistant.enabled', visibleWhenValue: true }),
203
+ settingAction({ id: 'channel-homeassistant-event-type', label: 'Home automation event type', detail: 'Set the event type used for daemon-to-home automation delivery.', key: 'surfaces.homeassistant.eventType', visibleWhenKey: 'surfaces.homeassistant.enabled', visibleWhenValue: true }),
204
+ settingAction({ id: 'channel-homeassistant-session-ttl', label: 'Home automation session TTL', detail: 'Set the idle TTL for remote home automation conversation sessions.', key: 'surfaces.homeassistant.remoteSessionTtlMs', visibleWhenKey: 'surfaces.homeassistant.enabled', visibleWhenValue: true }),
205
+ settingAction({ id: 'channel-signal-enabled', label: 'Use Signal', detail: 'Toggle Signal bridge delivery.', key: 'surfaces.signal.enabled' }),
206
+ 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 }),
207
+ settingAction({ id: 'channel-signal-account', label: 'Signal account', detail: 'Set the Signal account id or phone number.', key: 'surfaces.signal.account', visibleWhenKey: 'surfaces.signal.enabled', visibleWhenValue: true }),
208
+ settingAction({ id: 'channel-signal-token', label: 'Signal token', detail: 'Store the Signal bridge token or secret reference.', key: 'surfaces.signal.token', visibleWhenKey: 'surfaces.signal.enabled', visibleWhenValue: true }),
209
+ 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 }),
210
+ settingAction({ id: 'channel-whatsapp-enabled', label: 'Use WhatsApp', detail: 'Toggle WhatsApp delivery.', key: 'surfaces.whatsapp.enabled' }),
211
+ 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 }),
212
+ 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 }),
213
+ settingAction({ id: 'channel-whatsapp-phone-id', label: 'WhatsApp phone number ID', detail: 'Set the WhatsApp phone number id.', key: 'surfaces.whatsapp.phoneNumberId', visibleWhenKey: 'surfaces.whatsapp.enabled', visibleWhenValue: true }),
214
+ settingAction({ id: 'channel-whatsapp-business-id', label: 'WhatsApp business ID', detail: 'Set the WhatsApp business account id.', key: 'surfaces.whatsapp.businessAccountId', visibleWhenKey: 'surfaces.whatsapp.enabled', visibleWhenValue: true }),
215
+ settingAction({ id: 'channel-whatsapp-verify', label: 'WhatsApp verify token', detail: 'Store the WhatsApp verify token or secret reference.', key: 'surfaces.whatsapp.verifyToken', visibleWhenKey: 'surfaces.whatsapp.enabled', visibleWhenValue: true }),
216
+ settingAction({ id: 'channel-whatsapp-signing', label: 'WhatsApp signing secret', detail: 'Store the WhatsApp signing secret or secret reference.', key: 'surfaces.whatsapp.signingSecret', visibleWhenKey: 'surfaces.whatsapp.enabled', visibleWhenValue: true }),
217
+ 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 }),
218
+ settingAction({ id: 'channel-imessage-enabled', label: 'Use iMessage', detail: 'Toggle iMessage bridge delivery.', key: 'surfaces.imessage.enabled' }),
219
+ 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 }),
220
+ settingAction({ id: 'channel-imessage-account', label: 'iMessage account', detail: 'Set the iMessage account id.', key: 'surfaces.imessage.account', visibleWhenKey: 'surfaces.imessage.enabled', visibleWhenValue: true }),
221
+ settingAction({ id: 'channel-imessage-token', label: 'iMessage token', detail: 'Store the iMessage bridge token or secret reference.', key: 'surfaces.imessage.token', visibleWhenKey: 'surfaces.imessage.enabled', visibleWhenValue: true }),
222
+ 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 }),
223
+ ],
224
+ },
225
+ {
226
+ id: 'onboarding-voice-media',
227
+ group: 'ONBOARDING',
228
+ label: 'Voice & Phone',
229
+ summary: 'Configure voice controls, spoken output, and SMS or phone-call delivery.',
230
+ detail: 'Use this page for saved voice/TTS settings and telephony credentials. Generating media is available later from Voice & Media.',
231
+ actions: [
232
+ settingAction({ id: 'voice-enabled', label: 'Use voice controls', detail: 'Toggle the optional local voice control surface.', key: 'ui.voiceEnabled' }),
233
+ settingAction({ id: 'voice-tts-provider', label: 'TTS provider', detail: 'Set the default text-to-speech provider id.', key: 'tts.provider' }),
234
+ settingAction({ id: 'voice-tts-voice', label: 'TTS voice', detail: 'Set the default text-to-speech voice id.', key: 'tts.voice' }),
235
+ settingAction({ id: 'telephony-enabled', label: 'Use telephony', detail: 'Toggle SMS, voice call, or telephony bridge delivery.', key: 'surfaces.telephony.enabled' }),
236
+ settingAction({ id: 'telephony-provider', label: 'Telephony provider', detail: 'Cycle direct provider or bridge mode.', key: 'surfaces.telephony.provider', visibleWhenKey: 'surfaces.telephony.enabled', visibleWhenValue: true }),
237
+ 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 }),
238
+ settingAction({ id: 'telephony-bridge-url', label: 'Telephony bridge URL', detail: 'Set the telephony bridge base URL.', key: 'surfaces.telephony.bridgeUrl', visibleWhenKey: 'surfaces.telephony.enabled', visibleWhenValue: true }),
239
+ settingAction({ id: 'telephony-token', label: 'Telephony bridge token', detail: 'Store the telephony bridge token or secret reference.', key: 'surfaces.telephony.token', visibleWhenKey: 'surfaces.telephony.enabled', visibleWhenValue: true }),
240
+ 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 }),
241
+ 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 }),
242
+ 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 }),
243
+ 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 }),
244
+ 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 }),
245
+ 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 }),
246
+ ],
247
+ },
248
+ {
249
+ id: 'onboarding-context',
250
+ group: 'ONBOARDING',
251
+ label: 'Local Context',
252
+ summary: 'Create/import memory, personas, skills, routines, notes, and Knowledge.',
253
+ detail: 'Use this page to seed the assistant with durable local context. These forms create Agent-owned records or ingest reviewed sources.',
254
+ actions: [
255
+ { 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' },
256
+ { 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' },
257
+ { 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' },
258
+ { 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' },
259
+ { id: 'context-create-persona', label: 'Create persona', detail: 'Create and optionally activate an Agent-local persona.', editorKind: 'persona', kind: 'editor', safety: 'safe' },
260
+ { id: 'context-create-memory', label: 'Create starter memory', detail: 'Create one durable local memory record.', editorKind: 'memory', kind: 'editor', safety: 'safe' },
261
+ { id: 'context-create-skill', label: 'Create skill', detail: 'Create one reusable Agent-local skill.', editorKind: 'skill', kind: 'editor', safety: 'safe' },
262
+ { id: 'context-create-routine', label: 'Create routine', detail: 'Create one reusable Agent-local routine.', editorKind: 'routine', kind: 'editor', safety: 'safe' },
263
+ { id: 'context-create-note', label: 'Create note', detail: 'Create one Agent-local scratchpad note.', editorKind: 'note', kind: 'editor', safety: 'safe' },
264
+ { 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' },
265
+ { 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' },
266
+ { id: 'context-knowledge-bookmarks', label: 'Import bookmarks', detail: 'Import a browser bookmark export into isolated Agent Knowledge.', editorKind: 'knowledge-bookmarks', kind: 'editor', safety: 'safe' },
267
+ { 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' },
268
+ ],
269
+ },
270
+ {
271
+ id: 'onboarding-automation',
272
+ group: 'ONBOARDING',
273
+ label: 'Automation Setup',
274
+ summary: 'Set scheduled work limits for reminders and routines.',
275
+ detail: 'Use this page to enable automation and set bounded run limits. Creating actual reminders and routines remains a separate confirmed action.',
42
276
  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' },
83
- { 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
- { 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
- { 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' },
277
+ settingAction({ id: 'automation-enabled', label: 'Use automation', detail: 'Toggle the automation subsystem for reminders and scheduled routines.', key: 'automation.enabled' }),
278
+ settingAction({ id: 'automation-max-concurrent', label: 'Concurrent runs', detail: 'Set the maximum automation runs that can execute concurrently.', key: 'automation.maxConcurrentRuns', visibleWhenKey: 'automation.enabled', visibleWhenValue: true }),
279
+ settingAction({ id: 'automation-history-limit', label: 'Run history limit', detail: 'Set the number of run history entries retained per automation job.', key: 'automation.runHistoryLimit', visibleWhenKey: 'automation.enabled', visibleWhenValue: true }),
280
+ settingAction({ id: 'automation-default-timeout', label: 'Default timeout', detail: 'Set the default automation run timeout in milliseconds.', key: 'automation.defaultTimeoutMs', visibleWhenKey: 'automation.enabled', visibleWhenValue: true }),
281
+ settingAction({ id: 'automation-catch-up', label: 'Catch-up window', detail: 'Set how long startup should catch up missed automation runs.', key: 'automation.catchUpWindowMinutes', visibleWhenKey: 'automation.enabled', visibleWhenValue: true }),
282
+ settingAction({ id: 'automation-failure-cooldown', label: 'Failure cooldown', detail: 'Set the cooldown after a failed automation run.', key: 'automation.failureCooldownMs', visibleWhenKey: 'automation.enabled', visibleWhenValue: true }),
283
+ settingAction({ id: 'automation-delete-after-run', label: 'Delete one-shot jobs', detail: 'Toggle deleting one-shot automation jobs after their first successful run.', key: 'automation.deleteAfterRun', visibleWhenKey: 'automation.enabled', visibleWhenValue: true }),
93
284
  ],
94
285
  },
95
286
  {
@@ -525,50 +716,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
525
716
  { id: 'approval-cancel', label: 'Cancel request', detail: 'Open a confirmed form for cancelling one pending connected-host approval request by id.', editorKind: 'approval-cancel', kind: 'editor', safety: 'safe' },
526
717
  ],
527
718
  },
528
- {
529
- id: 'host',
530
- group: 'OPERATIONS',
531
- label: 'Connected Host',
532
- summary: 'Connected-host health, tasks, sessions, channels, and automation.',
533
- detail: 'Use this workspace to inspect the GoodVibes host surfaces that Agent can see: system health, remote routes, host tasks, sessions, channels, schedules, knowledge, media, MCP, provider auth, support bundles, and telemetry/config posture.',
534
- actions: [
535
- { id: 'host-overview', label: 'Host overview', detail: 'Review connected-host, provider, settings, continuity, and Agent health without starting or mutating host work.', command: '/health review', kind: 'command', safety: 'read-only' },
536
- { id: 'host-services', label: 'Host services', detail: 'Inspect connected-host service readiness, credentials, and integration issues without changing them.', command: '/health host', kind: 'command', safety: 'read-only' },
537
- { id: 'host-setup', label: 'Setup review', detail: 'Inspect setup issues that affect connected-host and Agent runtime readiness.', command: '/health setup', kind: 'command', safety: 'read-only' },
538
- { id: 'host-remote', label: 'Remote routes', detail: 'Inspect remote build-host route health and recovery signals without starting build work.', command: '/health remote', kind: 'command', safety: 'read-only' },
539
- { id: 'host-maintenance', label: 'Session maintenance', detail: 'Review continuity, compaction, and current-session maintenance posture.', command: '/health maintenance', kind: 'command', safety: 'read-only' },
540
- { id: 'host-continuity', label: 'Continuity', detail: 'Inspect last-session pointer, recovery-file posture, and return-context state.', command: '/health continuity', kind: 'command', safety: 'read-only' },
541
- { id: 'host-tasks', label: 'Host tasks', detail: 'Inspect connected-host task state without creating, retrying, or mutating tasks.', command: '/tasks list', kind: 'command', safety: 'read-only' },
542
- { id: 'host-task-filter', label: 'Filter host tasks', detail: 'Open a status/type form for read-only connected-host task filtering.', editorKind: 'task-list-filter', kind: 'editor', safety: 'read-only' },
543
- { id: 'host-task-show', label: 'Inspect host task', detail: 'Open a task-id form for read-only connected-host task metadata.', editorKind: 'task-show', kind: 'editor', safety: 'read-only' },
544
- { id: 'host-task-output', label: 'Show task output', detail: 'Open a task-id form for read-only connected-host task output.', editorKind: 'task-output', kind: 'editor', safety: 'read-only' },
545
- { id: 'host-sessions', label: 'Host session routes', detail: 'Browse saved Agent sessions and return-context posture exposed through the runtime session surface.', command: '/session list', kind: 'command', safety: 'read-only' },
546
- { id: 'host-session-graph', label: 'Session graph', detail: 'Open a read-only form for cross-session graph inspection; graph mutation remains blocked in Agent.', editorKind: 'session-graph', kind: 'editor', safety: 'read-only' },
547
- { id: 'host-channels-status', label: 'Channel status', detail: 'Inspect connected channel runtime status from the host without mutating delivery state.', command: '/channels status', kind: 'command', safety: 'read-only' },
548
- { id: 'host-channel-accounts', label: 'Channel accounts', detail: 'Inspect connected channel accounts without printing secret values or sending messages.', command: '/channels accounts', kind: 'command', safety: 'read-only' },
549
- { id: 'host-channel-policies', label: 'Channel policies', detail: 'Inspect channel delivery policy posture without changing routing.', command: '/channels policies', kind: 'command', safety: 'read-only' },
550
- { id: 'host-channels', label: 'Open Channels', detail: 'Jump to the channel setup and delivery workspace.', targetCategoryId: 'channels', kind: 'workspace', safety: 'safe' },
551
- { id: 'host-automation', label: 'Open Automation', detail: 'Jump to connected schedules, reminders, receipts, and explicit run controls.', targetCategoryId: 'automation', kind: 'workspace', safety: 'safe' },
552
- { id: 'host-schedules', label: 'Schedule status', detail: 'Inspect schedules and run history without running or mutating them.', command: '/schedule list', kind: 'command', safety: 'read-only' },
553
- { id: 'host-schedule-reconcile', label: 'Reconcile schedules', detail: 'Compare local promotion receipts with live connected schedules.', command: '/schedule reconcile', kind: 'command', safety: 'read-only' },
554
- { id: 'host-knowledge', label: 'Knowledge route', detail: 'Inspect isolated Agent Knowledge route readiness and source counts.', command: '/knowledge status', kind: 'command', safety: 'read-only' },
555
- { id: 'host-knowledge-open', label: 'Open Knowledge', detail: 'Jump to Agent Knowledge source, graph, review, and ingest controls.', targetCategoryId: 'knowledge', kind: 'workspace', safety: 'safe' },
556
- { id: 'host-media', label: 'Media providers', detail: 'Inspect configured media providers before generating media with confirmation.', command: '/media providers', kind: 'command', safety: 'read-only' },
557
- { id: 'host-media-open', label: 'Open Voice and Media', detail: 'Jump to voice, TTS, image input, media provider, and browser-tool setup actions.', targetCategoryId: 'voice-media', kind: 'workspace', safety: 'safe' },
558
- { id: 'host-mcp-health', label: 'MCP health', detail: 'Inspect MCP lifecycle issues without changing trust posture or approving tool-definition review.', command: '/health mcp', kind: 'command', safety: 'read-only' },
559
- { id: 'host-mcp-review', label: 'MCP review', detail: 'Inspect MCP server connection, trust, role, and review posture.', command: '/mcp review', kind: 'command', safety: 'read-only' },
560
- { id: 'host-tools-open', label: 'Open Tools and MCP', detail: 'Jump to MCP server setup, tool inventory, secrets, and security review.', targetCategoryId: 'tools', kind: 'workspace', safety: 'safe' },
561
- { id: 'host-provider-accounts', label: 'Provider accounts', detail: 'Review provider account routes, subscription windows, and billing-path safety.', command: '/accounts review', kind: 'command', safety: 'read-only' },
562
- { id: 'host-auth-owner', label: 'Connected-host auth owner', detail: 'Show that connected-host auth administration belongs to the owning GoodVibes host, not Agent.', command: '/auth local', kind: 'command', safety: 'read-only' },
563
- { 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
- { 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
- { 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' },
567
- { 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
- { 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
- { 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' },
570
- ],
571
- },
719
+ AGENT_WORKSPACE_HOST_CATEGORY,
572
720
  {
573
721
  id: 'automation',
574
722
  group: 'OPERATIONS',
@@ -615,29 +763,29 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
615
763
  label: 'Finish',
616
764
  summary: 'Acknowledge setup and close onboarding.',
617
765
  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
- ],
766
+ 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
767
  },
622
768
  ];
623
769
 
624
770
  export function renderAgentWorkspacePackageText(): string {
625
771
  const lines: string[] = [];
626
772
  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
- );
773
+ lines.push(category.id, category.group, category.label, category.summary, category.detail);
634
774
  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}`);
775
+ lines.push(action.id, action.label, action.detail, action.kind);
776
+ const extras = [
777
+ action.command,
778
+ action.targetCategoryId ? `target:${action.targetCategoryId}` : '',
779
+ action.editorKind ? `editor:${action.editorKind}` : '',
780
+ action.settingKey ? `setting:${action.settingKey}` : '',
781
+ action.modelPickerTarget ? `model-picker-target:${action.modelPickerTarget}` : '',
782
+ action.modelPickerFlow ? `model-picker-flow:${action.modelPickerFlow}` : '',
783
+ action.settingsTarget ? `settings-target:${action.settingsTarget}` : '',
784
+ action.kind === 'settings-import' ? 'import:goodvibes-tui-settings' : '',
785
+ action.localKind ? `local:${action.localKind}` : '',
786
+ action.localOperation ? `operation:${action.localOperation}` : '',
787
+ ];
788
+ for (const extra of extras) if (extra) lines.push(extra);
641
789
  }
642
790
  }
643
791
  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
+ }