@pellux/goodvibes-agent 1.4.4 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +7 -7
  3. package/dist/package/main.js +7424 -12241
  4. package/docs/README.md +2 -2
  5. package/docs/channels-remote-and-api.md +1 -1
  6. package/docs/getting-started.md +2 -2
  7. package/docs/release-and-publishing.md +1 -1
  8. package/docs/tools-and-commands.md +5 -5
  9. package/package.json +4 -2
  10. package/release/performance-snapshot.json +2 -2
  11. package/release/release-notes.md +11 -7
  12. package/release/release-readiness.json +6 -6
  13. package/src/agent/behavior-discovery-summary.ts +4 -18
  14. package/src/agent/calendar-registry.ts +322 -0
  15. package/src/agent/competitive-feature-inventory.ts +268 -130
  16. package/src/agent/document-registry.ts +5 -1
  17. package/src/agent/email/email-service.ts +350 -0
  18. package/src/agent/email/imap-client.ts +596 -0
  19. package/src/agent/email/smtp-client.ts +453 -0
  20. package/src/agent/ics-calendar.ts +662 -0
  21. package/src/agent/ics-timezone.ts +172 -0
  22. package/src/agent/markdown-frontmatter.ts +31 -0
  23. package/src/agent/memory-safety.ts +1 -1
  24. package/src/agent/note-registry.ts +3 -9
  25. package/src/agent/persona-discovery.ts +3 -15
  26. package/src/agent/persona-registry.ts +1 -10
  27. package/src/agent/research-source-registry.ts +5 -1
  28. package/src/agent/routine-discovery.ts +3 -15
  29. package/src/agent/runtime-profile.ts +3 -0
  30. package/src/agent/skill-discovery.ts +3 -15
  31. package/src/agent/skill-draft-proposer.ts +203 -0
  32. package/src/agent/skill-draft-runner.ts +201 -0
  33. package/src/agent/skill-registry.ts +36 -1
  34. package/src/agent/skill-standard.ts +99 -0
  35. package/src/agent/vibe-file.ts +7 -22
  36. package/src/cli/completion.ts +1 -1
  37. package/src/cli/config-overrides.ts +10 -1
  38. package/src/cli/redaction.ts +17 -5
  39. package/src/config/provider-model.ts +2 -1
  40. package/src/config/secret-config.ts +13 -6
  41. package/src/core/activity-feed.ts +97 -0
  42. package/src/core/away-digest.ts +161 -0
  43. package/src/core/conversation-rendering.ts +7 -3
  44. package/src/core/conversation.ts +22 -15
  45. package/src/core/hardware-profile.ts +362 -0
  46. package/src/core/last-seen-store.ts +78 -0
  47. package/src/core/plain-language.ts +52 -0
  48. package/src/core/setup-incomplete-hint.ts +90 -0
  49. package/src/core/system-message-router.ts +38 -87
  50. package/src/input/agent-workspace-basic-command-editor-submission.ts +60 -220
  51. package/src/input/agent-workspace-basic-command-editors.ts +39 -141
  52. package/src/input/agent-workspace-categories.ts +40 -125
  53. package/src/input/agent-workspace-command-editor.ts +4 -0
  54. package/src/input/agent-workspace-host-category.ts +0 -5
  55. package/src/input/agent-workspace-local-editor-submission.ts +3 -1
  56. package/src/input/agent-workspace-navigation.ts +10 -3
  57. package/src/input/agent-workspace-onboarding-actions.ts +132 -0
  58. package/src/input/agent-workspace-onboarding-categories.ts +29 -26
  59. package/src/input/agent-workspace-onboarding-finish.ts +11 -4
  60. package/src/input/agent-workspace-onboarding-state.ts +111 -0
  61. package/src/input/agent-workspace-profile-editor-submission.ts +260 -0
  62. package/src/input/agent-workspace-profile-editors.ts +155 -0
  63. package/src/input/agent-workspace-subscription-editor.ts +7 -0
  64. package/src/input/agent-workspace-types.ts +5 -1
  65. package/src/input/agent-workspace.ts +65 -39
  66. package/src/input/command-registry.ts +18 -5
  67. package/src/input/commands/agent-runtime-profile-runtime.ts +2 -1
  68. package/src/input/commands/agent-skills-runtime.ts +60 -3
  69. package/src/input/commands/calendar-runtime.ts +209 -0
  70. package/src/input/commands/channels-runtime.ts +1 -0
  71. package/src/input/commands/command-error.ts +9 -0
  72. package/src/input/commands/compat-runtime.ts +1 -0
  73. package/src/input/commands/config.ts +1 -0
  74. package/src/input/commands/conversation-runtime.ts +1 -1
  75. package/src/input/commands/delegation-runtime.ts +5 -6
  76. package/src/input/commands/email-runtime.ts +387 -0
  77. package/src/input/commands/experience-runtime.ts +17 -4
  78. package/src/input/commands/guidance-runtime.ts +1 -1
  79. package/src/input/commands/health-runtime.ts +6 -1
  80. package/src/input/commands/knowledge-format.ts +73 -0
  81. package/src/input/commands/knowledge.ts +9 -74
  82. package/src/input/commands/local-provider-runtime.ts +2 -1
  83. package/src/input/commands/local-runtime.ts +10 -4
  84. package/src/input/commands/mcp-runtime.ts +7 -0
  85. package/src/input/commands/notify-runtime.ts +17 -1
  86. package/src/input/commands/onboarding-runtime.ts +1 -0
  87. package/src/input/commands/operator-actions-runtime.ts +1 -0
  88. package/src/input/commands/operator-runtime.ts +3 -0
  89. package/src/input/commands/personas-runtime.ts +1 -0
  90. package/src/input/commands/platform-access-runtime.ts +40 -17
  91. package/src/input/commands/product-runtime.ts +6 -1
  92. package/src/input/commands/provider-accounts-runtime.ts +3 -2
  93. package/src/input/commands/qrcode-runtime.ts +1 -0
  94. package/src/input/commands/routines-runtime.ts +1 -0
  95. package/src/input/commands/runtime-services.ts +0 -13
  96. package/src/input/commands/security-runtime.ts +1 -0
  97. package/src/input/commands/session-content.ts +1 -0
  98. package/src/input/commands/shell-core.ts +5 -2
  99. package/src/input/commands/subscription-runtime.ts +33 -9
  100. package/src/input/commands/support-bundle-runtime.ts +8 -1
  101. package/src/input/commands/tasks-runtime.ts +1 -0
  102. package/src/input/commands/tts-runtime.ts +1 -0
  103. package/src/input/commands/vibe-runtime.ts +1 -0
  104. package/src/input/commands.ts +4 -0
  105. package/src/input/feed-context-factory.ts +3 -12
  106. package/src/input/handler-command-route.ts +7 -60
  107. package/src/input/handler-feed-routes.ts +0 -194
  108. package/src/input/handler-feed.ts +2 -54
  109. package/src/input/handler-interactions.ts +0 -2
  110. package/src/input/handler-modal-stack.ts +0 -9
  111. package/src/input/handler-picker-routes.ts +24 -1
  112. package/src/input/handler-shortcuts.ts +11 -40
  113. package/src/input/handler-ui-state.ts +13 -0
  114. package/src/input/handler.ts +8 -35
  115. package/src/input/keybindings.ts +40 -17
  116. package/src/input/model-picker-local-fit.ts +130 -0
  117. package/src/input/submission-router.ts +0 -5
  118. package/src/main.ts +111 -89
  119. package/src/renderer/activity-sidebar.ts +186 -0
  120. package/src/renderer/agent-workspace-context-lines.ts +5 -48
  121. package/src/renderer/agent-workspace-style.ts +1 -1
  122. package/src/renderer/agent-workspace.ts +14 -2
  123. package/src/renderer/compositor.ts +37 -125
  124. package/src/renderer/conversation-overlays.ts +3 -3
  125. package/src/renderer/help-overlay.ts +7 -5
  126. package/src/renderer/model-workspace.ts +101 -86
  127. package/src/{panels → renderer}/polish.ts +3 -3
  128. package/src/renderer/shell-surface.ts +4 -5
  129. package/src/renderer/status-token.ts +31 -11
  130. package/src/renderer/tab-strip.ts +1 -1
  131. package/src/renderer/tool-call.ts +7 -8
  132. package/src/renderer/tool-labels.ts +92 -0
  133. package/src/renderer/ui-factory.ts +48 -96
  134. package/src/runtime/bootstrap-command-context.ts +0 -5
  135. package/src/runtime/bootstrap-command-parts.ts +6 -15
  136. package/src/runtime/bootstrap-core.ts +34 -13
  137. package/src/runtime/bootstrap-hook-bridge.ts +3 -1
  138. package/src/runtime/bootstrap-shell.ts +3 -50
  139. package/src/runtime/bootstrap.ts +3 -4
  140. package/src/runtime/context.ts +1 -1
  141. package/src/runtime/diagnostics/panels/index.ts +0 -1
  142. package/src/runtime/diagnostics/panels/policy.ts +1 -1
  143. package/src/runtime/execution-ledger.ts +16 -1
  144. package/src/runtime/index.ts +6 -1
  145. package/src/runtime/onboarding/index.ts +1 -0
  146. package/src/runtime/onboarding/onboarding-state.ts +200 -0
  147. package/src/{panels → runtime}/provider-account-snapshot.ts +5 -2
  148. package/src/runtime/services.ts +16 -4
  149. package/src/runtime/terminal-output-guard.ts +7 -0
  150. package/src/runtime/tool-permission-safety.ts +1 -1
  151. package/src/runtime/ui/model-picker/data-provider.ts +1 -1
  152. package/src/runtime/ui/model-picker/health-enrichment.ts +2 -2
  153. package/src/runtime/ui/model-picker/types.ts +2 -2
  154. package/src/runtime/ui/provider-health/data-provider.ts +3 -3
  155. package/src/runtime/ui/provider-health/types.ts +2 -2
  156. package/src/runtime/ui-services.ts +0 -2
  157. package/src/shell/agent-workspace-fullscreen.ts +0 -1
  158. package/src/shell/autonomy-surfacing.ts +272 -0
  159. package/src/shell/session-continuity-hints.ts +0 -6
  160. package/src/shell/startup-wiring.ts +221 -0
  161. package/src/shell/ui-openers.ts +18 -29
  162. package/src/tools/agent-context-policy.ts +1 -1
  163. package/src/tools/agent-harness-background-processes.ts +4 -4
  164. package/src/tools/agent-harness-browser-cockpit-route.ts +3 -3
  165. package/src/tools/agent-harness-command-runner.ts +6 -1
  166. package/src/tools/agent-harness-document-ops.ts +26 -53
  167. package/src/tools/agent-harness-execution-history.ts +1 -13
  168. package/src/tools/agent-harness-execution-posture.ts +0 -15
  169. package/src/tools/agent-harness-keybinding-metadata.ts +28 -29
  170. package/src/tools/agent-harness-local-model-cookbook.ts +24 -1
  171. package/src/tools/agent-harness-metadata.ts +16 -0
  172. package/src/tools/agent-harness-mode-catalog.ts +2 -9
  173. package/src/tools/agent-harness-provider-account-metadata.ts +2 -2
  174. package/src/tools/agent-harness-setup-posture-utils.ts +1 -1
  175. package/src/tools/agent-harness-tool-schema.ts +13 -14
  176. package/src/tools/agent-harness-tool.ts +27 -23
  177. package/src/tools/agent-harness-ui-surface-metadata.ts +10 -20
  178. package/src/tools/agent-harness-workspace-action-runner.ts +3 -4
  179. package/src/tools/agent-workspace-tool.ts +2 -33
  180. package/src/utils/terminal-width.ts +9 -3
  181. package/src/version.ts +1 -1
  182. package/src/input/agent-workspace-panel-route.ts +0 -44
  183. package/src/input/panel-integration-actions.ts +0 -26
  184. package/src/panels/approval-panel.ts +0 -149
  185. package/src/panels/automation-control-panel.ts +0 -212
  186. package/src/panels/base-panel.ts +0 -254
  187. package/src/panels/builtin/agent.ts +0 -58
  188. package/src/panels/builtin/knowledge.ts +0 -26
  189. package/src/panels/builtin/operations.ts +0 -121
  190. package/src/panels/builtin/session.ts +0 -138
  191. package/src/panels/builtin/shared.ts +0 -275
  192. package/src/panels/builtin/usage.ts +0 -21
  193. package/src/panels/builtin-panels.ts +0 -23
  194. package/src/panels/confirm-state.ts +0 -61
  195. package/src/panels/context-visualizer-panel.ts +0 -204
  196. package/src/panels/cost-tracker-panel.ts +0 -444
  197. package/src/panels/docs-panel.ts +0 -285
  198. package/src/panels/index.ts +0 -25
  199. package/src/panels/knowledge-panel.ts +0 -417
  200. package/src/panels/memory-panel.ts +0 -226
  201. package/src/panels/panel-list-panel.ts +0 -464
  202. package/src/panels/panel-manager.ts +0 -570
  203. package/src/panels/provider-accounts-panel.ts +0 -233
  204. package/src/panels/provider-health-domains.ts +0 -208
  205. package/src/panels/provider-health-panel.ts +0 -720
  206. package/src/panels/provider-health-tracker.ts +0 -115
  207. package/src/panels/provider-stats-panel.ts +0 -366
  208. package/src/panels/qr-panel.ts +0 -207
  209. package/src/panels/schedule-panel.ts +0 -321
  210. package/src/panels/scrollable-list-panel.ts +0 -491
  211. package/src/panels/search-focus.ts +0 -32
  212. package/src/panels/security-panel.ts +0 -295
  213. package/src/panels/session-browser-panel.ts +0 -395
  214. package/src/panels/session-maintenance.ts +0 -125
  215. package/src/panels/subscription-panel.ts +0 -263
  216. package/src/panels/system-messages-panel.ts +0 -230
  217. package/src/panels/tasks-panel.ts +0 -344
  218. package/src/panels/thinking-panel.ts +0 -304
  219. package/src/panels/token-budget-panel.ts +0 -475
  220. package/src/panels/tool-inspector-panel.ts +0 -436
  221. package/src/panels/types.ts +0 -54
  222. package/src/renderer/panel-composite.ts +0 -158
  223. package/src/renderer/panel-tab-bar.ts +0 -69
  224. package/src/renderer/panel-workspace-bar.ts +0 -42
  225. package/src/runtime/diagnostics/panels/panel-resources.ts +0 -118
  226. package/src/tools/agent-harness-panel-metadata.ts +0 -211
  227. /package/src/runtime/perf/{panel-health-monitor.ts → component-health.ts} +0 -0
@@ -8,30 +8,30 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
8
8
  id: 'home',
9
9
  group: 'START',
10
10
  label: 'Home',
11
- summary: 'Main operator workspace for normal assistant work.',
12
- detail: 'Use this as the primary Agent workspace: start with the user task, then open only the lane that matches the work.',
11
+ summary: 'Everything the assistant can do, one lane per kind of work.',
12
+ detail: 'Pick the lane that matches what you want, or just close this and type. Every page here is also reachable later.',
13
13
  actions: [
14
- { 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' },
15
- { id: 'assistant-setup-lane', label: 'Get the assistant working', detail: 'Open setup posture for first-run blockers, GoodVibes settings import, account, model, tools, channels, voice, local context, and finish.', targetCategoryId: 'setup', kind: 'workspace', safety: 'safe' },
16
- { id: 'assistant-model-lane', label: 'Talk and choose models', detail: 'Open model routing for provider choice, local model cookbook, helper/tool routes, reasoning, cache, and provider failure hints; model inspection uses models action:"status|local|providers".', targetCategoryId: 'account-model', kind: 'workspace', safety: 'safe' },
17
- { id: 'assistant-browser-cockpit', label: 'Open browser cockpit', detail: 'Open the connected GoodVibes browser cockpit/PWA when the web route is configured, or inspect web setup posture when it is not.', kind: 'guidance', safety: 'safe' },
18
- { id: 'assistant-work-lane', label: 'Work in this project', detail: 'Open project work controls for plans, host tasks, approvals, local execution posture, and recovery before delegation.', targetCategoryId: 'work', kind: 'workspace', safety: 'safe' },
19
- { id: 'assistant-personal-ops-lane', label: 'Handle personal operations', detail: 'Open Personal Ops for inbox, agenda, notes, tasks, reminders, routines, and delivery readiness from one daily area.', targetCategoryId: 'personal-ops', kind: 'workspace', safety: 'safe' },
20
- { id: 'assistant-research-docs-lane', label: 'Research and write', detail: 'Open the writing surface for document drafts, source-backed reports, artifacts, exports, and blind model comparison.', targetCategoryId: 'documents', kind: 'workspace', safety: 'safe' },
21
- { id: 'assistant-background-lane', label: 'Supervise background work', detail: 'Open work supervision for plans, visible queues, approvals, automation, schedules, log tails, and cancel/recovery routes.', targetCategoryId: 'work', kind: 'workspace', safety: 'read-only' },
22
- { id: 'assistant-safety-lane', label: 'Stay safe and recover', detail: 'Open tool and MCP trust review; support bundles, execution history, and file recovery stay reachable from diagnostics.', targetCategoryId: 'tools', kind: 'workspace', safety: 'read-only' },
23
- { 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' },
24
- { id: 'learned-behavior-home', label: 'Capture learned behavior', detail: 'Save a reviewed lesson, workflow, or operating style as a local skill, routine, or persona.', editorKind: 'learned-behavior', kind: 'editor', safety: 'safe' },
14
+ { id: 'chat', label: 'Just start typing', detail: 'Close this workspace and ask for anything research, reminders, email, documents, or scheduling.', kind: 'guidance', safety: 'safe' },
15
+ { id: 'assistant-setup-lane', label: 'Finish setting up', detail: 'Sign in, pick a model, and connect the basics.', targetCategoryId: 'setup', kind: 'workspace', safety: 'safe' },
16
+ { id: 'assistant-personal-ops-lane', label: 'Inbox, calendar & reminders', detail: 'Daily personal operations in one place.', targetCategoryId: 'personal-ops', kind: 'workspace', safety: 'safe' },
17
+ { id: 'assistant-research-docs-lane', label: 'Research something', detail: 'Web research with visible runs, sources, and saved reports.', targetCategoryId: 'research', kind: 'workspace', safety: 'safe' },
18
+ { id: 'assistant-documents-lane', label: 'Documents & files', detail: 'Drafts, exports, saved files, and model comparisons.', targetCategoryId: 'documents', kind: 'workspace', safety: 'safe' },
19
+ { id: 'assistant-automation-lane', label: 'Schedules & automation', detail: 'Reminders, routines, and scheduled work.', targetCategoryId: 'automation', kind: 'workspace', safety: 'safe' },
20
+ { id: 'assistant-messaging-lane', label: 'Messaging & notifications', detail: 'Connect Slack, Discord, Telegram, and more; send messages and notifications.', targetCategoryId: 'onboarding-channels', kind: 'workspace', safety: 'safe' },
21
+ { id: 'assistant-memory-lane', label: 'Memory & personality', detail: 'What the assistant remembers and how it behaves.', targetCategoryId: 'memory', kind: 'workspace', safety: 'safe' },
22
+ { id: 'assistant-work-lane', label: 'Approvals & running work', detail: 'Pending approvals, background processes, and host tasks.', targetCategoryId: 'work', kind: 'workspace', safety: 'read-only' },
23
+ { id: 'mode-preset', label: 'Set interaction mode', detail: 'Choose quiet, balanced, or operator mode for how much the assistant checks in.', editorKind: 'mode-preset', kind: 'editor', safety: 'safe' },
25
24
  ],
26
25
  },
27
26
  {
28
27
  id: 'setup',
29
28
  group: 'ONBOARDING',
30
29
  label: 'Start',
31
- summary: 'Import preferences, sign in, and choose the main model.',
30
+ summary: 'Pick a model to start — use a local one or sign in to a provider.',
32
31
  detail: 'Start here on a fresh install. Every row either saves state, opens the shared model picker, or opens a confirmed in-modal form.',
33
32
  actions: [
34
- // Essentials first — a first-time user signs in, picks a model, optionally imports prior settings.
33
+ // Working-path choices first — local (no sign-in needed) then provider sign-in.
34
+ { id: 'use-local-model', label: 'Use a local model (no sign-in)', detail: 'Opens the model picker, which recommends models that fit this computer. No account or subscription needed.', kind: 'model-picker', modelPickerFlow: 'model', modelPickerTarget: 'main', safety: 'safe' },
35
35
  { id: 'subscription-login-start', label: 'Sign in to a provider', detail: 'Start one provider sign-in flow, save pending state, and return here.', editorKind: 'subscription-login-start', kind: 'editor', safety: 'safe' },
36
36
  { id: 'subscription-login-finish', label: 'Finish provider sign-in', detail: 'Exchange a code or redirect URL and save the provider subscription session.', editorKind: 'subscription-login-finish', kind: 'editor', safety: 'safe' },
37
37
  { 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' },
@@ -47,18 +47,21 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
47
47
  { id: 'setup-checkpoint-show', label: 'Show saved resume point', detail: 'Inspect the saved setup wizard resume point without writing setup state.', setupCheckpointOperation: 'show', kind: 'setup-checkpoint', safety: 'read-only' },
48
48
  { id: 'setup-checkpoint-mark-current', label: 'Save resume point', detail: 'Save the current setup wizard step as the Agent-owned resume point for the next launch.', setupCheckpointOperation: 'mark-current', kind: 'setup-checkpoint', safety: 'safe' },
49
49
  { id: 'setup-checkpoint-clear', label: 'Clear saved resume point', detail: 'Clear the saved setup wizard resume point after setup is complete or no longer useful.', setupCheckpointOperation: 'clear', kind: 'setup-checkpoint', safety: 'safe' },
50
+ { id: 'setup-skip-to-chat', label: 'Just start chatting (set up later)', detail: 'Close setup and go to the conversation. You can finish setup anytime with /agent.', kind: 'guidance', safety: 'safe' },
50
51
  ],
51
52
  },
52
53
  {
53
54
  id: 'account-model',
54
55
  group: 'ONBOARDING',
55
- label: 'Model Routing',
56
+ label: 'Models',
56
57
  summary: 'Pick the chat model. Helper, tool, and spoken-turn routes are optional.',
57
58
  detail: 'Use this after sign-in. Most users only need the top row; the rest are advanced.',
58
59
  actions: [
59
60
  // Essentials — chat route + reasoning
60
61
  { 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' },
61
62
  settingAction({ id: 'account-reasoning', label: 'Reasoning effort', detail: 'Cycle the reasoning effort used when supported.', key: 'provider.reasoningEffort' }),
63
+ // Advanced routes — most people can skip these
64
+ { id: 'account-advanced-separator', label: 'Advanced routes (optional) — most people can skip these', detail: 'Helper, tool, TTS, embedding, system-prompt, and cache routing are here when you need them. Chat works without any of these.', kind: 'guidance', safety: 'read-only' },
62
65
  settingAction({ id: 'account-embedding', label: 'Embedding provider', detail: 'Set the embedding provider for memory and retrieval.', key: 'provider.embeddingProvider' }),
63
66
  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' }),
64
67
  // Helper / tool / spoken-turn routes (advanced — only matters when you want dedicated routing)
@@ -160,8 +163,8 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
160
163
  { id: 'personal-ops-reminder', label: 'Create reminder', detail: 'Create one connected reminder schedule with real timing, optional delivery target, and explicit confirmation.', editorKind: 'reminder-schedule', kind: 'editor', safety: 'safe' },
161
164
  { id: 'personal-ops-routines', label: 'Routine library', detail: 'Open repeatable workflows and schedule-promotion readiness.', targetCategoryId: 'routines', kind: 'workspace', safety: 'safe' },
162
165
  { id: 'personal-ops-schedules', label: 'Schedules', detail: 'Inspect connected schedules and promotion receipts from the automation area.', targetCategoryId: 'automation', kind: 'workspace', safety: 'safe' },
163
- { id: 'personal-ops-channels', label: 'Delivery channels', detail: 'Open pairing and channel readiness before sending summaries, reminders, or follow-ups.', targetCategoryId: 'channels', kind: 'workspace', safety: 'safe' },
164
- { id: 'personal-ops-operator-methods', label: 'Exact daemon methods', detail: 'The model can inspect the live daemon contract with host action:"methods" query:"task" or personal_ops action:"lane" for one lane.', kind: 'guidance', safety: 'read-only' },
166
+ { id: 'personal-ops-channels', label: 'Delivery channels', detail: 'Open pairing and channel readiness before sending summaries, reminders, or follow-ups.', targetCategoryId: 'onboarding-channels', kind: 'workspace', safety: 'safe' },
167
+ { id: 'personal-ops-operator-methods', label: 'Assistant service methods', detail: 'The model can inspect the live assistant service contract with host action:"methods" query:"task" or personal_ops action:"lane" for one lane.', kind: 'guidance', safety: 'read-only' },
165
168
  ],
166
169
  },
167
170
  {
@@ -196,7 +199,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
196
199
  {
197
200
  id: 'documents',
198
201
  group: 'DAY-TO-DAY',
199
- label: 'Documents & Compare',
202
+ label: 'Documents & Files',
200
203
  summary: 'Draft docs, files, artifacts, and compare readiness.',
201
204
  detail: 'Use this workspace when the user is producing or evaluating a document. Versioned drafts, review comments, AI suggestion review, artifact insertion/export, upload, source, artifact browsing, media, and blind comparison routes stay visible here.',
202
205
  actions: [
@@ -229,7 +232,6 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
229
232
  { id: 'document-export-conversation', label: 'Export current conversation', detail: 'Open a confirmed form that exports the current Agent conversation to a workspace file.', editorKind: 'conversation-export', kind: 'editor', safety: 'safe' },
230
233
  { id: 'document-export-session', label: 'Export saved session', detail: 'Open a form that exports one saved Agent session transcript as markdown or text.', editorKind: 'session-export-saved', kind: 'editor', safety: 'read-only' },
231
234
  { id: 'document-show-source', label: 'Show source or node', detail: 'Open an in-workspace form that shows one Agent Knowledge source, node, or issue by id.', editorKind: 'knowledge-get', kind: 'editor', safety: 'read-only' },
232
- { id: 'document-artifacts', label: 'Artifact workspace', detail: 'Open the existing artifact workspace for attachments, source ingest, generated media, and artifact safety policy.', targetCategoryId: 'artifacts', kind: 'workspace', safety: 'safe' },
233
235
  { id: 'document-browse-artifacts', label: 'Browse artifacts', detail: 'Search saved uploads, exports, generated media, source artifacts, and comparison artifacts from one read-only browser.', editorKind: 'artifact-browser', kind: 'editor', safety: 'read-only' },
234
236
  { id: 'document-show-artifact', label: 'Show artifact', detail: 'Inspect one saved artifact by id with redacted metadata and bounded text preview when possible.', editorKind: 'artifact-show', kind: 'editor', safety: 'read-only' },
235
237
  { id: 'document-promote-artifact', label: 'Promote artifact to Knowledge', detail: 'Open a confirmed form that ingests one saved artifact into isolated Agent Knowledge.', editorKind: 'artifact-promote-knowledge', kind: 'editor', safety: 'safe' },
@@ -245,39 +247,6 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
245
247
  { id: 'document-export-compare', label: 'Export compare report', detail: 'Open a confirmed form that exports a saved comparison or judgment report, creates a reviewer handoff with related artifacts, or archives a saved handoff as one ZIP artifact.', editorKind: 'model-compare-export', kind: 'editor', safety: 'safe' },
246
248
  ],
247
249
  },
248
- {
249
- id: 'artifacts',
250
- group: 'DAY-TO-DAY',
251
- label: 'Artifacts',
252
- summary: 'Browse, attach, export, ingest, and generate artifacts.',
253
- detail: 'Use this workspace to handle concrete user-visible artifacts: browse saved artifacts, attach images, export conversations, ingest source files into Agent Knowledge, inspect source libraries, and generate media with explicit confirmation.',
254
- actions: [
255
- { id: 'artifact-flow', label: 'Artifact workflow', detail: 'Attach, export, ingest, or generate first, then use the artifact browser to inspect saved ids, redacted metadata, and bounded text previews.', kind: 'guidance', safety: 'safe' },
256
- { id: 'artifact-browse', label: 'Browse artifacts', detail: 'Search saved uploads, exports, generated media, source artifacts, and comparison artifacts from one read-only browser.', editorKind: 'artifact-browser', kind: 'editor', safety: 'read-only' },
257
- { id: 'artifact-show', label: 'Show artifact', detail: 'Inspect one saved artifact by id with redacted metadata and bounded text preview when possible.', editorKind: 'artifact-show', kind: 'editor', safety: 'read-only' },
258
- { id: 'artifact-export-file', label: 'Export saved artifact', detail: 'Open a confirmed form that copies one saved artifact to a workspace file without printing content.', editorKind: 'artifact-export-file', kind: 'editor', safety: 'safe' },
259
- { id: 'artifact-export-package', label: 'Export package', detail: 'Open a confirmed form that copies selected saved artifacts into a workspace package directory or ZIP archive with a redacted manifest.', editorKind: 'artifact-export-package', kind: 'editor', safety: 'safe' },
260
- { id: 'artifact-promote-knowledge', label: 'Promote to Knowledge', detail: 'Open a confirmed form that ingests one saved artifact into isolated Agent Knowledge.', editorKind: 'artifact-promote-knowledge', kind: 'editor', safety: 'safe' },
261
- { id: 'artifact-insert-document', label: 'Insert in document draft', detail: 'Open a confirmed form that inserts a saved artifact into an Agent-owned markdown draft as a new version.', editorKind: 'document-insert-artifact', kind: 'editor', safety: 'safe' },
262
- { id: 'artifact-attach-document', label: 'Attach to document draft', detail: 'Open a confirmed form that links a saved artifact to a document draft without rewriting the body.', editorKind: 'document-attach-artifact', kind: 'editor', safety: 'safe' },
263
- { id: 'artifact-attach-image', label: 'Attach image to prompt', detail: 'Open an in-workspace image attachment form for a local image path and optional prompt.', editorKind: 'image-input', kind: 'editor', safety: 'safe' },
264
- { id: 'artifact-export-conversation', label: 'Export current conversation', detail: 'Open a confirmed form that exports the current Agent conversation to a workspace file.', editorKind: 'conversation-export', kind: 'editor', safety: 'safe' },
265
- { id: 'artifact-session-export', label: 'Export saved session', detail: 'Open a form that exports one saved Agent session transcript as markdown or text.', editorKind: 'session-export-saved', kind: 'editor', safety: 'read-only' },
266
- { id: 'artifact-ingest-file', label: 'Ingest file into Agent Knowledge', detail: 'Open a confirmed form that imports one local file into the isolated Agent Knowledge segment.', editorKind: 'knowledge-file', kind: 'editor', safety: 'safe' },
267
- { id: 'artifact-ingest-url-list', label: 'Import URL list', detail: 'Open a confirmed form that imports a local URL list into Agent Knowledge.', editorKind: 'knowledge-urls', kind: 'editor', safety: 'safe' },
268
- { id: 'artifact-import-bookmarks', label: 'Import bookmarks', detail: 'Open a confirmed form that imports a browser bookmark export into Agent Knowledge.', editorKind: 'knowledge-bookmarks', kind: 'editor', safety: 'safe' },
269
- { id: 'artifact-browser-history', label: 'Import browser history', detail: 'Open a confirmed form that imports local browser history/bookmarks into Agent Knowledge.', editorKind: 'knowledge-browser-history', kind: 'editor', safety: 'safe' },
270
- { id: 'artifact-show-source', label: 'Show source or node', detail: 'Open an in-workspace form that shows one Agent Knowledge source, node, or issue by id.', editorKind: 'knowledge-get', kind: 'editor', safety: 'read-only' },
271
- { id: 'artifact-generate-media', label: 'Generate image or video', detail: 'Open a confirmed prompt form that generates image or video artifacts through configured media providers.', editorKind: 'media-generate', kind: 'editor', safety: 'safe' },
272
- { id: 'artifact-review-compare', label: 'Review blind compare', detail: 'Open a read-only saved comparison review, side-by-side evidence view, or reviewer handoff diff for model comparison artifacts.', editorKind: 'model-compare-review', kind: 'editor', safety: 'read-only' },
273
- { id: 'artifact-diff-handoffs', label: 'Diff reviewer handoffs', detail: 'Open a read-only split-pane form that compares two saved reviewer handoff artifacts with section jump focus.', editorKind: 'model-compare-handoff-diff', kind: 'editor', safety: 'read-only' },
274
- { id: 'artifact-judge-compare', label: 'Save compare judgment', detail: 'Open a confirmed form that saves a comparison winner and reasons as a local artifact without route mutation.', editorKind: 'model-compare-judge', kind: 'editor', safety: 'safe' },
275
- { id: 'artifact-compare-analytics', label: 'Compare analytics', detail: 'Summarize or synthesize saved comparison judgment artifacts by winner, model, blind slot, themes, task type, document id, benchmark tag, and recent reasons.', editorKind: 'model-compare-analytics', kind: 'editor', safety: 'read-only' },
276
- { id: 'artifact-apply-compare', label: 'Apply compare winner', detail: 'Open a confirmed form that applies a revealed judgment artifact to provider.model.', editorKind: 'model-compare-apply', kind: 'editor', safety: 'safe' },
277
- { id: 'artifact-export-compare', label: 'Export compare report', detail: 'Open a confirmed form that exports a saved comparison or judgment report, creates a reviewer handoff with related artifacts, or archives a saved handoff as one ZIP artifact.', editorKind: 'model-compare-export', kind: 'editor', safety: 'safe' },
278
- { id: 'artifact-policy', label: 'Artifact safety', detail: 'Artifact creation, ingest, and media generation are explicit actions. Agent never writes to default knowledge or prints inline base64; artifact previews are bounded and redacted.', kind: 'guidance', safety: 'read-only' },
279
- ],
280
- },
281
250
  {
282
251
  id: 'conversation',
283
252
  group: 'DAY-TO-DAY',
@@ -289,6 +258,9 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
289
258
  { id: 'conversation-context-refs', label: 'Context references', detail: 'Type @file, @folder, or @https://... in the composer to add bounded context to the main Agent turn. Use !@file only when you want raw file injection.', kind: 'guidance', safety: 'safe' },
290
259
  { id: 'conversation-save', label: 'Save current session', detail: 'Open a confirmed form that saves the current Agent session under a local name.', editorKind: 'session-save', kind: 'editor', safety: 'safe' },
291
260
  { id: 'conversation-load', label: 'Load saved session', detail: 'Open a confirmed form that loads one saved Agent session into the current conversation.', editorKind: 'session-load', kind: 'editor', safety: 'safe' },
261
+ { id: 'conversation-rename', label: 'Rename this conversation', detail: 'Open a form that renames the current Agent session.', editorKind: 'session-rename', kind: 'editor', safety: 'safe' },
262
+ { id: 'conversation-fork', label: 'Fork this conversation', detail: 'Open a form that branches the current conversation into a new saved session.', editorKind: 'session-fork', kind: 'editor', safety: 'safe' },
263
+ { id: 'conversation-resume', label: 'Resume a saved conversation', detail: 'Open a form that resumes one saved Agent session by id, prefix, or title.', editorKind: 'session-resume', kind: 'editor', safety: 'safe' },
292
264
  { id: 'conversation-session-info', label: 'Inspect saved session', detail: 'Open a read-only form that prints saved-session metadata.', editorKind: 'session-info', kind: 'editor', safety: 'read-only' },
293
265
  { id: 'conversation-session-search', label: 'Search saved sessions', detail: 'Open a form that searches saved Agent sessions.', editorKind: 'session-search', kind: 'editor', safety: 'read-only' },
294
266
  { id: 'conversation-session-export', label: 'Export saved session', detail: 'Open a form that prints one saved-session transcript as markdown or text.', editorKind: 'session-export-saved', kind: 'editor', safety: 'read-only' },
@@ -299,26 +271,6 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
299
271
  { id: 'conversation-tts', label: 'Speak a prompt', detail: 'Open an in-workspace prompt form for spoken assistant replies through configured live TTS.', editorKind: 'tts-prompt', kind: 'editor', safety: 'safe' },
300
272
  ],
301
273
  },
302
- {
303
- id: 'channels',
304
- group: 'CAPABILITIES',
305
- label: 'Channels',
306
- summary: 'Companion pairing, channel posture, and delivery safety.',
307
- detail: 'Agent uses connected channel accounts. Pairing, account inspection, and readiness checks are visible here; inbound delivery and public channel exposure stay policy-gated.',
308
- actions: [
309
- { id: 'channel-setup-path', label: 'Setup path', detail: 'Use this workspace as the channel setup guide: pair companion, inspect readiness, check accounts/policies/status, review one channel, then add delivery targets only through confirmed forms.', kind: 'guidance', safety: 'safe' },
310
- { id: 'channel-show', label: 'Show channel detail', detail: 'Open a channel-id form for read-only readiness details.', editorKind: 'channel-show', kind: 'editor', safety: 'read-only' },
311
- { id: 'channel-doctor', label: 'Run channel doctor', detail: 'Open a channel-id form for read-only route diagnostics.', editorKind: 'channel-doctor', kind: 'editor', safety: 'read-only' },
312
- { id: 'channel-setup', label: 'Setup guidance', detail: 'Open a channel-id form for read-only setup guidance.', editorKind: 'channel-setup', kind: 'editor', safety: 'read-only' },
313
- { id: 'notification-send', label: 'Send notification', detail: 'Open a confirmed form that sends one plain-text message to configured Agent notification webhook targets.', editorKind: 'notify-send', kind: 'editor', safety: 'safe' },
314
- { id: 'channel-send', label: 'Send channel message', detail: 'Open a confirmed form that sends one message through a configured delivery target.', editorKind: 'channel-send', kind: 'editor', safety: 'safe' },
315
- { id: 'notification-add-webhook', label: 'Add webhook target', detail: 'Open a confirmed form that adds one webhook notification target for explicit reminder and routine delivery.', editorKind: 'notify-webhook', kind: 'editor', safety: 'safe' },
316
- { id: 'notification-remove-webhook', label: 'Remove webhook target', detail: 'Open a confirmed form that removes one exact webhook notification target from Agent delivery.', editorKind: 'notify-webhook-remove', kind: 'editor', safety: 'safe' },
317
- { id: 'notification-clear-webhooks', label: 'Clear webhook targets', detail: 'Open a confirmed form before removing every configured webhook notification target.', editorKind: 'notify-webhook-clear', kind: 'editor', safety: 'safe' },
318
- { id: 'notification-test-webhooks', label: 'Test webhook targets', detail: 'Open a confirmed form that sends one notification test to configured webhook targets only after typed confirmation.', editorKind: 'notify-webhook-test', kind: 'editor', safety: 'safe' },
319
- { id: 'channel-safety', label: 'Delivery safety', detail: 'External messages, channel DMs, and public delivery targets require explicit user action and Agent policy. Agent will not silently send or expose channels from this workspace.', kind: 'guidance', safety: 'blocked' },
320
- ],
321
- },
322
274
  {
323
275
  id: 'tools',
324
276
  group: 'CAPABILITIES',
@@ -364,27 +316,6 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
364
316
  { id: 'knowledge-ask', label: 'Ask Agent knowledge', detail: 'Open an in-workspace question form for isolated Agent Knowledge. Normal chat still uses the main conversation.', editorKind: 'knowledge-ask', kind: 'editor', safety: 'read-only' },
365
317
  ],
366
318
  },
367
- {
368
- id: 'voice-media',
369
- group: 'CAPABILITIES',
370
- label: 'Voice & Media',
371
- summary: 'Voice, TTS, image input, browser tools, and media providers.',
372
- detail: 'Voice, media, browser tools, and image-capable flows are first-class Agent tools. Connected-host administration stays outside Agent and side effects stay explicit.',
373
- actions: [
374
- { id: 'voice-workflow-posture', label: 'Voice workflows', detail: 'Inspect push-to-talk, voice memo transcription, spoken responses, and wake-word readiness with device action:"voice".', kind: 'guidance', safety: 'read-only' },
375
- { id: 'device-capability-map', label: 'Device capability map', detail: 'Inspect pairing, mobile command routing, browser/PWA, notifications, browser/desktop control, and certified camera/location readiness with device action:"status" without claiming uncertified contracts.', kind: 'guidance', safety: 'read-only' },
376
- { id: 'browser-cockpit-readiness', label: 'Browser/PWA readiness', detail: 'Inspect the connected browser cockpit/PWA route, certified workspace category coverage, mobile controls, and first-run receipt evidence with computer action:"browser" before opening a browser.', kind: 'guidance', safety: 'read-only' },
377
- { id: 'voice-enable', label: 'Enable voice', detail: 'Open a confirmed form that enables local voice interaction.', editorKind: 'voice-enable', kind: 'editor', safety: 'safe' },
378
- { id: 'voice-disable', label: 'Disable voice', detail: 'Open a confirmed form that disables local voice interaction.', editorKind: 'voice-disable', kind: 'editor', safety: 'safe' },
379
- { id: 'voice-bundle-export', label: 'Export voice bundle', detail: 'Open a confirmed form that exports voice setup state for review.', editorKind: 'voice-bundle-export', kind: 'editor', safety: 'safe' },
380
- { id: 'voice-bundle-inspect', label: 'Inspect voice bundle', detail: 'Open a form that inspects voice setup state before review.', editorKind: 'voice-bundle-inspect', kind: 'editor', safety: 'read-only' },
381
- { id: 'tts-speak', label: 'Speak a prompt', detail: 'Open an in-workspace prompt form for spoken assistant replies through configured live TTS.', editorKind: 'tts-prompt', kind: 'editor', safety: 'safe' },
382
- { id: 'image-attach', label: 'Attach image input', detail: 'Open an in-workspace image form for attaching a real image path and optional prompt.', editorKind: 'image-input', kind: 'editor', safety: 'safe' },
383
- { id: 'media-generate', label: 'Generate media', detail: 'Open a confirmed prompt form that generates image or video artifacts through configured media providers.', editorKind: 'media-generate', kind: 'editor', safety: 'safe' },
384
- { id: 'browser-research', label: 'Research the web', detail: 'Submit a read-only web research request to the main Agent conversation.', editorKind: 'web-research', kind: 'editor', safety: 'read-only' },
385
- { id: 'browser-url', label: 'Inspect URL', detail: 'Submit one URL inspection request to the main Agent conversation without ingesting it.', editorKind: 'web-fetch', kind: 'editor', safety: 'read-only' },
386
- ],
387
- },
388
319
  {
389
320
  id: 'profiles',
390
321
  group: 'LOCAL BEHAVIOR',
@@ -408,11 +339,11 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
408
339
  {
409
340
  id: 'memory',
410
341
  group: 'LOCAL BEHAVIOR',
411
- label: 'Memory & Skills',
342
+ label: 'Memory',
412
343
  summary: 'Local assistant memory, notes, routines, skills, and reusable behavior.',
413
344
  detail: 'Memory, notes, routines, skills, and personas stay Agent-local until stable shared registry contracts exist. Secrets must not be stored as memory or notes.',
414
345
  actions: [
415
- { id: 'memory-posture', label: 'Memory posture', detail: 'Inspect Agent-local memory, prompt-active recall, vector health, embedding providers, and external-memory provider gaps with memory action:"status".', kind: 'guidance', safety: 'read-only' },
346
+ { id: 'memory-posture', label: 'Memory status', detail: 'Inspect Agent-local memory, prompt-active recall, vector health, embedding providers, and external-memory provider gaps with memory action:"status".', kind: 'guidance', safety: 'read-only' },
416
347
  { id: 'memory-search', label: 'Search memory', detail: 'Open an in-workspace Agent-local memory search form. This never queries default knowledge or other product routes.', editorKind: 'memory-search', kind: 'editor', safety: 'read-only' },
417
348
  { id: 'memory-get', label: 'Show memory by id', detail: 'Open an in-workspace form that prints one Agent-local memory record with provenance and links.', editorKind: 'memory-get', kind: 'editor', safety: 'read-only' },
418
349
  { id: 'memory-learning-curator', label: 'Learning curator', detail: 'Inspect ranked local memory, note, persona, skill, bundle, routine, duplicate-consolidation, completed-work, completed-research, and saved-session candidates with review, setup, stale, proposal, capture, diff, and rollback routes.', kind: 'guidance', safety: 'read-only' },
@@ -494,6 +425,8 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
494
425
  { id: 'skills-search', label: 'Search skills', detail: 'Open a search form for Agent-local skills.', editorKind: 'skill-search', kind: 'editor', safety: 'read-only' },
495
426
  { id: 'skills-show', label: 'Show skill', detail: 'Open a skill-id form for read-only local skill detail.', editorKind: 'skill-show', kind: 'editor', safety: 'read-only' },
496
427
  { id: 'skills-import-discovered', label: 'Import discovered skill', detail: 'Open an in-workspace form that imports one reviewed discovered skill file into the Agent-local skill registry after typed confirmation.', editorKind: 'skill-discovery-import', kind: 'editor', safety: 'safe' },
428
+ { id: 'skills-import-standard', label: 'Import a shared skill', detail: 'Import one SKILL.md file in the open skill format into the Agent-local skill library after review.', editorKind: 'skill-standard-import', kind: 'editor', safety: 'safe' },
429
+ { id: 'skills-export-standard', label: 'Export skill to share', detail: 'Export one Agent-local skill as a SKILL.md folder you can publish or hand to another assistant.', editorKind: 'skill-standard-export', kind: 'editor', safety: 'safe' },
497
430
  { id: 'skills-create-bundle', label: 'Create bundle', detail: 'Open an in-workspace form that creates a named skill bundle from existing local skill ids.', editorKind: 'skill-bundle', kind: 'editor', safety: 'safe' },
498
431
  { id: 'skills-search-bundle', label: 'Search bundles', detail: 'Open an in-workspace form that searches Agent-local skill bundles.', editorKind: 'skill-bundle-search', kind: 'editor', safety: 'read-only' },
499
432
  { id: 'skills-show-bundle', label: 'Show bundle', detail: 'Open an in-workspace form that shows one Agent-local skill bundle by id.', editorKind: 'skill-bundle-show', kind: 'editor', safety: 'read-only' },
@@ -542,26 +475,12 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
542
475
  id: 'work',
543
476
  group: 'OPERATIONS',
544
477
  label: 'Work & Approvals',
545
- summary: 'Visible task state and approval posture.',
478
+ summary: 'Approvals, background work, host tasks, and delegation.',
546
479
  detail: 'Use this workspace to inspect active operator state and approval posture.',
547
480
  actions: [
548
481
  { id: 'work-autonomy-queue', label: 'Autonomy queue', detail: 'Inspect visible host-task, approval, automation, schedule, routine, and delegation queue cards.', kind: 'guidance', safety: 'read-only' },
549
482
  { id: 'work-background-processes', label: 'Background processes', detail: 'Inspect tracked local background processes, bounded output tails, visible monitor routes, and lifecycle controls with execution action:"processes".', kind: 'guidance', safety: 'read-only' },
550
483
  { id: 'work-process-capabilities', label: 'Process capabilities', detail: 'Inspect process parity for start/list/poll/wait/log/kill/write, PTY, and sudo before choosing a local execution route.', kind: 'guidance', safety: 'read-only' },
551
- { id: 'conversation-export', label: 'Export conversation', detail: 'Open a confirmed form that exports the current Agent conversation to a workspace file.', editorKind: 'conversation-export', kind: 'editor', safety: 'safe' },
552
- { id: 'conversation-events', label: 'Transcript events', detail: 'Open an event-kind form for read-only transcript event inspection.', editorKind: 'conversation-events', kind: 'editor', safety: 'read-only' },
553
- { id: 'conversation-groups', label: 'Transcript groups', detail: 'Open an event-kind form for read-only transcript group inspection.', editorKind: 'conversation-groups', kind: 'editor', safety: 'read-only' },
554
- { id: 'conversation-find', label: 'Find transcript text', detail: 'Open a search form for the current Agent transcript.', editorKind: 'conversation-find', kind: 'editor', safety: 'read-only' },
555
- { id: 'session-save', label: 'Save session', detail: 'Open a confirmed form that saves the current Agent session under a local name.', editorKind: 'session-save', kind: 'editor', safety: 'safe' },
556
- { id: 'session-load', label: 'Load session', detail: 'Open a confirmed form that loads one saved Agent session into the current conversation.', editorKind: 'session-load', kind: 'editor', safety: 'safe' },
557
- { id: 'session-rename', label: 'Rename current session', detail: 'Open a form that renames the current Agent session.', editorKind: 'session-rename', kind: 'editor', safety: 'safe' },
558
- { id: 'session-fork', label: 'Fork current session', detail: 'Open a form that forks the current Agent session into a new local session.', editorKind: 'session-fork', kind: 'editor', safety: 'safe' },
559
- { id: 'session-resume', label: 'Resume saved session', detail: 'Open a form that resumes one saved Agent session by id, prefix, or title.', editorKind: 'session-resume', kind: 'editor', safety: 'safe' },
560
- { id: 'session-info', label: 'Inspect saved session', detail: 'Open a read-only form that prints saved-session metadata.', editorKind: 'session-info', kind: 'editor', safety: 'read-only' },
561
- { id: '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' },
562
- { id: 'session-export-saved', label: 'Export saved session', detail: 'Open a form that prints one saved-session transcript as markdown or text.', editorKind: 'session-export-saved', kind: 'editor', safety: 'read-only' },
563
- { id: 'session-search', label: 'Search saved sessions', detail: 'Open a form that searches saved Agent sessions.', editorKind: 'session-search', kind: 'editor', safety: 'read-only' },
564
- { id: 'session-delete', label: 'Delete saved session', detail: 'Open a confirmed form before deleting one saved Agent session.', editorKind: 'session-delete', kind: 'editor', safety: 'safe' },
565
484
  { id: 'tasks-filter', label: 'Filter host tasks', detail: 'Open a status/kind form for read-only connected-host task filtering.', editorKind: 'task-list-filter', kind: 'editor', safety: 'read-only' },
566
485
  { id: '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' },
567
486
  { id: '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' },
@@ -569,6 +488,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
569
488
  { id: 'approval-approve', label: 'Approve request', detail: 'Open a confirmed form for approving one pending connected-host approval request by id.', editorKind: 'approval-approve', kind: 'editor', safety: 'safe' },
570
489
  { id: 'approval-deny', label: 'Deny request', detail: 'Open a confirmed form for denying one pending connected-host approval request by id.', editorKind: 'approval-deny', kind: 'editor', safety: 'safe' },
571
490
  { 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' },
491
+ { id: 'delegate-task', label: 'Delegate a build task', detail: 'Hand one explicit build, fix, or review task to GoodVibes TUI with the full original ask, reason, and success criteria.', editorKind: 'delegate-task', kind: 'editor', safety: 'delegates' },
572
492
  ],
573
493
  },
574
494
  AGENT_WORKSPACE_HOST_CATEGORY,
@@ -576,10 +496,17 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
576
496
  id: 'automation',
577
497
  group: 'OPERATIONS',
578
498
  label: 'Automation',
579
- summary: 'Reminders, schedule observability, and explicit routine promotion.',
499
+ summary: 'Automation limits, reminders, schedules, and routine promotion.',
580
500
  detail: 'Agent does not create hidden local automation jobs. Confirmed reminders, reviewed routine promotion, and explicit run/pause/resume controls go through the connected host with confirmation.',
581
501
  actions: [
582
502
  { id: 'schedule-setup-path', label: 'Schedule setup path', detail: 'Create a reminder or promote a reviewed routine, pick a real cadence, optionally choose a delivery target, confirm, then reconcile receipts with connected schedules.', kind: 'guidance', safety: 'safe' },
503
+ settingAction({ id: 'automation-enabled', label: 'Use automation', detail: 'Toggle the automation subsystem for reminders and scheduled routines.', key: 'automation.enabled' }),
504
+ 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 }),
505
+ 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 }),
506
+ 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 }),
507
+ 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 }),
508
+ 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 }),
509
+ 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 }),
583
510
  { id: 'schedule-autonomy-queue', label: 'Autonomy queue', detail: 'Inspect visible reminder, routine promotion, connected schedule, automation run, and cancellation routes.', kind: 'guidance', safety: 'read-only' },
584
511
  { id: 'schedule-next-action', label: 'Next schedule action', detail: 'Use the detail pane to choose whether to create a reminder, prepare a routine, promote a routine, or reconcile existing receipts.', kind: 'guidance', safety: 'safe' },
585
512
  { id: 'schedule-reminder', label: 'Create reminder', detail: 'Open an in-workspace form that creates one connected reminder schedule with real timing, optional delivery target, and explicit confirmation.', editorKind: 'reminder-schedule', kind: 'editor', safety: 'safe' },
@@ -592,23 +519,11 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
592
519
  { id: 'schedule-run', label: 'Run schedule now', detail: 'Open a confirmed form that triggers one connected-host schedule by id.', editorKind: 'schedule-run', kind: 'editor', safety: 'safe' },
593
520
  { id: 'schedule-promote-routine', label: 'Promote routine', detail: 'Open an in-workspace form that creates one connected schedule from an Agent-local routine with real timing, optional delivery target, and explicit confirmation.', editorKind: 'routine-schedule', kind: 'editor', safety: 'safe' },
594
521
  { id: 'schedule-receipt', label: 'Show receipt', detail: 'Open a receipt-id form for read-only schedule receipt detail.', editorKind: 'schedule-receipt', kind: 'editor', safety: 'read-only' },
595
- { id: 'schedule-delivery-targets', label: 'Delivery targets', detail: 'Open Channels to pair companion surfaces, inspect route readiness, and add explicit notification targets before reminder delivery.', targetCategoryId: 'channels', kind: 'workspace', safety: 'safe' },
522
+ { id: 'schedule-delivery-targets', label: 'Delivery targets', detail: 'Open Channels to pair companion surfaces, inspect route readiness, and add explicit notification targets before reminder delivery.', targetCategoryId: 'onboarding-channels', kind: 'workspace', safety: 'safe' },
596
523
  { id: 'schedule-policy', label: 'Local scheduler blocked', detail: 'Local schedule creation remains blocked. Connected edit, run, enable, disable, and delete actions use explicit confirmed forms only.', kind: 'guidance', safety: 'blocked' },
597
524
  { id: 'health-repair', label: 'Health repair guidance', detail: 'Open a domain form for read-only health repair guidance.', editorKind: 'health-repair', kind: 'editor', safety: 'read-only' },
598
525
  ],
599
526
  },
600
- {
601
- id: 'delegate',
602
- group: 'OPERATIONS',
603
- label: 'Build Delegation',
604
- summary: 'Explicit handoff to GoodVibes TUI for code work.',
605
- detail: 'Agent does not become the coding TUI. Build, implement, fix, patch, and review work can be handed to GoodVibes TUI with the full original ask, reason, success criteria, and delegated review only when explicitly requested.',
606
- actions: [
607
- { id: 'delegate-guidance', label: 'Delegation rule', detail: 'For build/fix/review work, delegate only when isolation, remote execution, parallelism, separate worktrees, a TUI workflow, or explicit review improves the user outcome.', kind: 'guidance', safety: 'delegates' },
608
- { id: 'delegate-task', label: 'Delegate build task', detail: 'Open a confirmed form that sends one explicit build/fix/review task and handoff brief to GoodVibes TUI/shared-session routes.', editorKind: 'delegate-task', kind: 'editor', safety: 'delegates' },
609
- { id: 'review-command', label: 'Review delegation command', detail: 'Use the confirmed delegation form only when the user explicitly asks for code review/build execution. Include the actual task text, preserve the full original ask, and request delegated review only when asked.', kind: 'guidance', safety: 'delegates' },
610
- ],
611
- },
612
527
  {
613
528
  id: 'finish',
614
529
  group: 'FINISH',
@@ -31,6 +31,7 @@ type AgentWorkspaceCommandEditorKind = AgentWorkspaceBasicCommandEditorKind | Ex
31
31
  | 'knowledge-search'
32
32
  | 'knowledge-ask'
33
33
  | 'model-compare'
34
+ | 'local-model-benchmark'
34
35
  | 'document-browse'
35
36
  | 'document-show'
36
37
  | 'document-create'
@@ -80,6 +81,8 @@ type AgentWorkspaceCommandEditorKind = AgentWorkspaceBasicCommandEditorKind | Ex
80
81
  | 'persona-discovery-import'
81
82
  | 'routine-discovery-import'
82
83
  | 'skill-discovery-import'
84
+ | 'skill-standard-import'
85
+ | 'skill-standard-export'
83
86
  | 'profile-template-export'
84
87
  | 'profile-template-import'
85
88
  | 'profile-template-from-discovered'
@@ -135,6 +138,7 @@ export function isAgentWorkspaceCommandEditorKind(kind: AgentWorkspaceEditorKind
135
138
  || kind === 'artifact-export-package'
136
139
  || kind === 'artifact-promote-knowledge'
137
140
  || kind === 'model-compare'
141
+ || kind === 'local-model-benchmark'
138
142
  || kind === 'document-browse'
139
143
  || kind === 'document-show'
140
144
  || kind === 'document-create'
@@ -11,11 +11,6 @@ export const AGENT_WORKSPACE_HOST_CATEGORY: AgentWorkspaceCategory = {
11
11
  { 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' },
12
12
  { 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' },
13
13
  { 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' },
14
- { id: 'host-channels', label: 'Open Channels', detail: 'Jump to the channel setup and delivery workspace.', targetCategoryId: 'channels', kind: 'workspace', safety: 'safe' },
15
- { id: 'host-automation', label: 'Open Automation', detail: 'Jump to connected schedules, reminders, receipts, and explicit run controls.', targetCategoryId: 'automation', kind: 'workspace', safety: 'safe' },
16
- { id: 'host-knowledge-open', label: 'Open Knowledge', detail: 'Jump to Agent Knowledge source, graph, review, and ingest controls.', targetCategoryId: 'knowledge', kind: 'workspace', safety: 'safe' },
17
- { 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' },
18
- { 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' },
19
14
  { id: 'host-provider-detail', label: 'Provider detail', detail: 'Open a provider-id form for account and provider configuration review.', editorKind: 'provider-inspect', kind: 'editor', safety: 'read-only' },
20
15
  { id: 'host-provider-routes', label: 'Provider routes', detail: 'Open a provider-id form for account, subscription, and route inspection.', editorKind: 'provider-routes', kind: 'editor', safety: 'read-only' },
21
16
  { id: 'host-provider-repair', label: 'Provider repair guidance', detail: 'Open a provider-id form for read-only provider repair guidance.', editorKind: 'provider-account-repair', kind: 'editor', safety: 'read-only' },
@@ -53,8 +53,10 @@ export function submitAgentWorkspaceLocalRegistryEditor(
53
53
  submitPersonaEditor(shellPaths, editor, field, callbacks.finishLocalEditor);
54
54
  } else if (editor.kind === 'skill') {
55
55
  submitSkillEditor(shellPaths, editor, field, callbacks.finishLocalEditor);
56
- } else {
56
+ } else if (editor.kind === 'routine') {
57
57
  submitRoutineEditor(shellPaths, editor, field, callbacks.finishLocalEditor);
58
+ } else {
59
+ throw new Error(`This form isn't wired to a save action yet (kind: ${editor.kind}).`);
58
60
  }
59
61
  }
60
62
 
@@ -15,9 +15,12 @@ const AGENT_WORKSPACE_CATEGORY_ALIASES = {
15
15
  host: 'host',
16
16
  mcp: 'tools',
17
17
  tool: 'tools',
18
- channel: 'channels',
19
- voice: 'voice-media',
20
- media: 'voice-media',
18
+ channel: 'onboarding-channels',
19
+ channels: 'onboarding-channels',
20
+ messaging: 'onboarding-channels',
21
+ voice: 'onboarding-voice-media',
22
+ media: 'onboarding-voice-media',
23
+ 'voice-media': 'onboarding-voice-media',
21
24
  profile: 'profiles',
22
25
  persona: 'personas',
23
26
  skill: 'skills',
@@ -31,6 +34,10 @@ const AGENT_WORKSPACE_CATEGORY_ALIASES = {
31
34
  note: 'notes',
32
35
  scratchpad: 'notes',
33
36
  kb: 'knowledge',
37
+ artifacts: 'documents',
38
+ artifact: 'documents',
39
+ delegate: 'work',
40
+ delegation: 'work',
34
41
  } as const satisfies Readonly<Record<string, AgentWorkspaceCategoryId>>;
35
42
 
36
43
  type AgentWorkspaceCategoryAlias = keyof typeof AGENT_WORKSPACE_CATEGORY_ALIASES;
@@ -0,0 +1,132 @@
1
+ import type { AgentWorkspaceActionResult } from './agent-workspace-types.ts';
2
+ import type { OnboardingShellPaths } from '../runtime/onboarding/types.ts';
3
+ import type { AgentWorkspaceRuntimeSnapshot } from './agent-workspace-types.ts';
4
+ import { writeOnboardingCheckMarker, writeOnboardingCompletionMarker } from '../runtime/onboarding/index.ts';
5
+ import { computeOnboardingStateFromSnapshot, deriveOnboardingEntry } from './agent-workspace-onboarding-state.ts';
6
+ import type { OnboardingState } from '../runtime/onboarding/onboarding-state.ts';
7
+
8
+ export interface CompleteOnboardingParams {
9
+ readonly awaitingRecapDismiss: boolean;
10
+ readonly runtimeSnapshot: AgentWorkspaceRuntimeSnapshot | null;
11
+ readonly shellPaths: OnboardingShellPaths | undefined;
12
+ readonly dismissAgentWorkspace: (() => boolean) | undefined;
13
+ readonly close: () => void;
14
+ }
15
+
16
+ export interface CompleteOnboardingResult {
17
+ /** True when the dismiss path was taken — caller should close immediately. */
18
+ readonly dismissed: boolean;
19
+ /** New value for _awaitingRecapDismiss (only meaningful when dismissed=false). */
20
+ readonly awaitingRecapDismiss: boolean;
21
+ readonly status: string;
22
+ readonly lastActionResult: AgentWorkspaceActionResult;
23
+ }
24
+
25
+ /**
26
+ * Pure logic for the completeOnboarding() class method.
27
+ * Handles both the initial "write markers + show recap" path and the
28
+ * deferred "dismiss recap" path.
29
+ */
30
+ export function completeOnboardingAction(params: CompleteOnboardingParams): CompleteOnboardingResult {
31
+ const { awaitingRecapDismiss, runtimeSnapshot, shellPaths, dismissAgentWorkspace, close } = params;
32
+
33
+ // Second activation: dismiss the recap and close the workspace.
34
+ if (awaitingRecapDismiss) {
35
+ if (!dismissAgentWorkspace?.()) close();
36
+ return {
37
+ dismissed: true,
38
+ awaitingRecapDismiss: false,
39
+ status: '',
40
+ lastActionResult: { kind: 'guidance', title: '', detail: '', safety: 'safe' },
41
+ };
42
+ }
43
+
44
+ // Shell paths are required to write the completion markers.
45
+ if (!shellPaths) {
46
+ return {
47
+ dismissed: false,
48
+ awaitingRecapDismiss: false,
49
+ status: 'Cannot complete onboarding without Agent shell paths.',
50
+ lastActionResult: {
51
+ kind: 'error',
52
+ title: 'Onboarding completion unavailable',
53
+ detail: 'The Agent workspace cannot locate the user onboarding completion marker path for this runtime.',
54
+ safety: 'safe',
55
+ },
56
+ };
57
+ }
58
+
59
+ try {
60
+ const marker = { scope: 'user', source: 'wizard', mode: 'new', workspaceRoot: shellPaths.workingDirectory } as const;
61
+ writeOnboardingCheckMarker(shellPaths, marker);
62
+ writeOnboardingCompletionMarker(shellPaths, marker);
63
+ const obs = computeOnboardingStateFromSnapshot(runtimeSnapshot, shellPaths);
64
+ const headline = obs?.recap.headline ?? 'Onboarding complete';
65
+ const lines: readonly string[] = obs?.recap.lines ?? [];
66
+ return {
67
+ dismissed: false,
68
+ awaitingRecapDismiss: true,
69
+ status: headline,
70
+ lastActionResult: {
71
+ kind: 'recap',
72
+ title: headline,
73
+ detail: lines.join('\n') || 'Saved the user onboarding completion marker.',
74
+ lines,
75
+ safety: 'safe',
76
+ },
77
+ };
78
+ } catch (error) {
79
+ const detail = error instanceof Error ? error.message : String(error);
80
+ return {
81
+ dismissed: false,
82
+ awaitingRecapDismiss: false,
83
+ status: 'Onboarding completion failed.',
84
+ lastActionResult: { kind: 'error', title: 'Onboarding completion failed', detail, safety: 'safe' },
85
+ };
86
+ }
87
+ }
88
+
89
+ export interface OnSubscriptionLoginSuccessParams {
90
+ readonly onlyGroup: string | null;
91
+ readonly runtimeSnapshot: AgentWorkspaceRuntimeSnapshot | null;
92
+ readonly shellPaths: OnboardingShellPaths | undefined;
93
+ }
94
+
95
+ export interface OnSubscriptionLoginSuccessResult {
96
+ /** Updated onboarding state, or null when not in ONBOARDING mode. */
97
+ readonly onboardingState: OnboardingState | null;
98
+ /**
99
+ * Category ID to navigate to (undefined = no change).
100
+ * The caller must resolve this against its own this.categories AFTER
101
+ * updating _onboardingState and the reveal set, so the index is never stale.
102
+ */
103
+ readonly targetCategoryId: string | undefined;
104
+ readonly status: string;
105
+ }
106
+
107
+ /**
108
+ * Pure logic for the onSubscriptionLoginSuccess() class method.
109
+ * Re-derives onboarding state and returns the target category ID.
110
+ * The caller is responsible for resolving the ID to an index against
111
+ * its FRESHLY-UPDATED categories list (after assigning _onboardingState
112
+ * and updating the reveal set) to avoid a stale-index window.
113
+ */
114
+ export function onSubscriptionLoginSuccessAction(params: OnSubscriptionLoginSuccessParams): OnSubscriptionLoginSuccessResult {
115
+ const { onlyGroup, runtimeSnapshot, shellPaths } = params;
116
+
117
+ if (onlyGroup !== 'ONBOARDING') {
118
+ return { onboardingState: null, targetCategoryId: undefined, status: '' };
119
+ }
120
+
121
+ const obs = computeOnboardingStateFromSnapshot(runtimeSnapshot, shellPaths);
122
+ if (!obs) {
123
+ return { onboardingState: null, targetCategoryId: undefined, status: '' };
124
+ }
125
+
126
+ const entry = deriveOnboardingEntry(obs);
127
+ const status = obs.readyToChat
128
+ ? 'Signed in. You are ready to chat — Apply & close when ready.'
129
+ : `Signed in. ${entry.status}`;
130
+
131
+ return { onboardingState: obs, targetCategoryId: entry.categoryId, status };
132
+ }