@pellux/goodvibes-agent 0.1.116 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/CHANGELOG.md +48 -661
  2. package/README.md +64 -57
  3. package/bin/goodvibes-agent.ts +16 -2
  4. package/dist/package/main.js +199180 -192185
  5. package/docs/README.md +15 -8
  6. package/docs/channels-remote-and-api.md +50 -0
  7. package/docs/connected-host.md +59 -0
  8. package/docs/getting-started.md +61 -50
  9. package/docs/knowledge-artifacts-and-multimodal.md +91 -0
  10. package/docs/project-planning.md +79 -0
  11. package/docs/providers-and-routing.md +46 -0
  12. package/docs/release-and-publishing.md +48 -11
  13. package/docs/tools-and-commands.md +123 -0
  14. package/docs/voice-and-live-tts.md +51 -0
  15. package/package.json +3 -6
  16. package/src/agent/behavior-discovery-summary.ts +1 -3
  17. package/src/agent/channel-delivery.ts +201 -0
  18. package/src/agent/media-generation.ts +159 -0
  19. package/src/agent/memory-prompt.ts +0 -1
  20. package/src/agent/note-registry.ts +329 -0
  21. package/src/agent/operator-actions.ts +343 -0
  22. package/src/agent/persona-discovery.ts +1 -3
  23. package/src/agent/persona-registry.ts +19 -16
  24. package/src/agent/record-labels.ts +107 -0
  25. package/src/agent/reminder-schedule-format.ts +33 -24
  26. package/src/agent/reminder-schedule.ts +27 -26
  27. package/src/agent/routine-registry.ts +54 -14
  28. package/src/agent/routine-schedule-args.ts +2 -1
  29. package/src/agent/routine-schedule-format.ts +77 -53
  30. package/src/agent/routine-schedule-promotion.ts +35 -33
  31. package/src/agent/routine-schedule-receipts.ts +29 -27
  32. package/src/agent/runtime-profile-starters.ts +5 -5
  33. package/src/agent/runtime-profile.ts +91 -12
  34. package/src/agent/skill-registry.ts +210 -32
  35. package/src/cli/agent-knowledge-args.ts +5 -1
  36. package/src/cli/agent-knowledge-command.ts +40 -34
  37. package/src/cli/agent-knowledge-format.ts +80 -67
  38. package/src/cli/agent-knowledge-methods.ts +1 -1
  39. package/src/cli/agent-knowledge-runtime.ts +32 -26
  40. package/src/cli/bundle-command.ts +14 -9
  41. package/src/cli/config-overrides.ts +37 -36
  42. package/src/cli/entrypoint.ts +16 -7
  43. package/src/cli/external-runtime.ts +10 -4
  44. package/src/cli/help.ts +54 -29
  45. package/src/cli/local-library-command.ts +203 -83
  46. package/src/cli/management-commands.ts +105 -68
  47. package/src/cli/management.ts +55 -74
  48. package/src/cli/memory-command.ts +66 -32
  49. package/src/cli/parser.ts +37 -3
  50. package/src/cli/profiles-command.ts +166 -31
  51. package/src/cli/provider-auth-routes.ts +2 -1
  52. package/src/cli/routines-command.ts +176 -40
  53. package/src/cli/service-posture.ts +16 -16
  54. package/src/cli/status.ts +56 -135
  55. package/src/core/conversation-message-snapshot.ts +131 -0
  56. package/src/input/agent-workspace-access-command-editor-submission.ts +149 -0
  57. package/src/input/agent-workspace-access-command-editors.ts +170 -0
  58. package/src/input/agent-workspace-activation.ts +35 -8
  59. package/src/input/agent-workspace-basic-command-editor-submission.ts +351 -94
  60. package/src/input/agent-workspace-basic-command-editors.ts +502 -9
  61. package/src/input/agent-workspace-categories.ts +423 -51
  62. package/src/input/agent-workspace-channel-command-editor-submission.ts +83 -0
  63. package/src/input/agent-workspace-channel-command-editors.ts +65 -0
  64. package/src/input/agent-workspace-channels.ts +35 -2
  65. package/src/input/agent-workspace-command-editor.ts +41 -3
  66. package/src/input/agent-workspace-config-reader.ts +16 -0
  67. package/src/input/agent-workspace-delegation-editor-submission.ts +55 -0
  68. package/src/input/agent-workspace-editors.ts +166 -1
  69. package/src/input/agent-workspace-knowledge-command-editor-submission.ts +132 -0
  70. package/src/input/agent-workspace-knowledge-command-editors.ts +110 -0
  71. package/src/input/agent-workspace-knowledge-query-editor.ts +1 -1
  72. package/src/input/agent-workspace-learned-behavior.ts +67 -0
  73. package/src/input/agent-workspace-library-command-editor-submission.ts +50 -0
  74. package/src/input/agent-workspace-library-command-editors.ts +35 -0
  75. package/src/input/agent-workspace-local-operations.ts +218 -0
  76. package/src/input/agent-workspace-local-selection.ts +75 -0
  77. package/src/input/agent-workspace-mcp-command-editor-submission.ts +95 -0
  78. package/src/input/agent-workspace-media-command-editor-submission.ts +62 -0
  79. package/src/input/agent-workspace-media-command-editors.ts +27 -0
  80. package/src/input/agent-workspace-memory-command-editor-submission.ts +232 -0
  81. package/src/input/agent-workspace-memory-command-editors.ts +180 -0
  82. package/src/input/agent-workspace-memory-editor.ts +2 -2
  83. package/src/input/agent-workspace-navigation.ts +81 -0
  84. package/src/input/agent-workspace-notify-editor-submission.ts +121 -0
  85. package/src/input/agent-workspace-operations-command-editor-submission.ts +208 -0
  86. package/src/input/agent-workspace-operations-command-editors.ts +196 -0
  87. package/src/input/agent-workspace-panel-route.ts +43 -0
  88. package/src/input/agent-workspace-provider-command-editor-submission.ts +155 -0
  89. package/src/input/agent-workspace-provider-command-editors.ts +93 -0
  90. package/src/input/agent-workspace-reminder-schedule-editor.ts +1 -1
  91. package/src/input/agent-workspace-requirements.ts +11 -0
  92. package/src/input/agent-workspace-routine-schedule-editor.ts +2 -2
  93. package/src/input/agent-workspace-search.ts +169 -0
  94. package/src/input/agent-workspace-secret-editor-submission.ts +153 -0
  95. package/src/input/agent-workspace-session-command-editor-submission.ts +199 -0
  96. package/src/input/agent-workspace-session-command-editors.ts +249 -0
  97. package/src/input/agent-workspace-setup.ts +37 -16
  98. package/src/input/agent-workspace-skill-bundle-command-editor-submission.ts +101 -0
  99. package/src/input/agent-workspace-skill-bundle-command-editors.ts +110 -0
  100. package/src/input/agent-workspace-snapshot.ts +162 -21
  101. package/src/input/agent-workspace-task-command-editor-submission.ts +61 -0
  102. package/src/input/agent-workspace-task-command-editors.ts +47 -0
  103. package/src/input/agent-workspace-token.ts +18 -2
  104. package/src/input/agent-workspace-types.ts +212 -4
  105. package/src/input/agent-workspace-voice-media.ts +4 -7
  106. package/src/input/agent-workspace-web-research-editor.ts +104 -0
  107. package/src/input/agent-workspace-workplan-editor-submission.ts +153 -0
  108. package/src/input/agent-workspace.ts +178 -240
  109. package/src/input/command-registry.ts +5 -2
  110. package/src/input/commands/agent-runtime-profile-runtime.ts +126 -37
  111. package/src/input/commands/agent-skills-runtime.ts +149 -72
  112. package/src/input/commands/agent-workspace-runtime.ts +23 -6
  113. package/src/input/commands/brief-runtime.ts +55 -25
  114. package/src/input/commands/channels-runtime.ts +147 -33
  115. package/src/input/commands/compat-runtime.ts +32 -0
  116. package/src/input/commands/delegation-runtime.ts +29 -23
  117. package/src/input/commands/experience-runtime.ts +6 -4
  118. package/src/input/commands/guidance-runtime.ts +4 -4
  119. package/src/input/commands/health-runtime.ts +149 -126
  120. package/src/input/commands/knowledge.ts +82 -60
  121. package/src/input/commands/local-provider-runtime.ts +43 -21
  122. package/src/input/commands/local-runtime.ts +138 -16
  123. package/src/input/commands/local-setup-review.ts +10 -20
  124. package/src/input/commands/mcp-runtime.ts +63 -46
  125. package/src/input/commands/notify-runtime.ts +38 -9
  126. package/src/input/commands/operator-actions-runtime.ts +138 -0
  127. package/src/input/commands/operator-runtime.ts +6 -76
  128. package/src/input/commands/personas-runtime.ts +46 -31
  129. package/src/input/commands/planning-runtime.ts +1 -1
  130. package/src/input/commands/platform-access-runtime.ts +35 -98
  131. package/src/input/commands/product-runtime.ts +2 -2
  132. package/src/input/commands/provider-accounts-runtime.ts +60 -39
  133. package/src/input/commands/qrcode-runtime.ts +50 -9
  134. package/src/input/commands/recall-bundle.ts +11 -11
  135. package/src/input/commands/recall-capture.ts +13 -11
  136. package/src/input/commands/recall-query.ts +29 -21
  137. package/src/input/commands/recall-review.ts +2 -1
  138. package/src/input/commands/routines-runtime.ts +99 -45
  139. package/src/input/commands/runtime-services.ts +1 -14
  140. package/src/input/commands/schedule-runtime.ts +33 -20
  141. package/src/input/commands/security-runtime.ts +6 -11
  142. package/src/input/commands/session-content.ts +80 -78
  143. package/src/input/commands/session-workflow.ts +134 -104
  144. package/src/input/commands/session.ts +3 -174
  145. package/src/input/commands/shell-core.ts +38 -17
  146. package/src/input/commands/subscription-runtime.ts +54 -185
  147. package/src/input/commands/support-bundle-runtime.ts +53 -0
  148. package/src/input/commands/tasks-runtime.ts +21 -21
  149. package/src/input/commands/work-plan-runtime.ts +33 -8
  150. package/src/input/commands.ts +6 -2
  151. package/src/input/feed-context-factory.ts +2 -2
  152. package/src/input/file-picker.ts +3 -2
  153. package/src/input/handler-command-route.ts +4 -7
  154. package/src/input/handler-content-actions.ts +89 -26
  155. package/src/input/handler-feed-routes.ts +19 -12
  156. package/src/input/handler-feed.ts +6 -5
  157. package/src/input/handler-interactions.ts +9 -36
  158. package/src/input/handler-modal-stack.ts +3 -3
  159. package/src/input/handler-onboarding.ts +52 -91
  160. package/src/input/handler-shortcuts.ts +16 -7
  161. package/src/input/handler.ts +50 -23
  162. package/src/input/input-history.ts +5 -6
  163. package/src/input/keybindings.ts +27 -16
  164. package/src/input/mcp-workspace.ts +90 -26
  165. package/src/input/onboarding/handler-onboarding-routes.ts +3 -1
  166. package/src/input/onboarding/onboarding-wizard-apply.ts +62 -0
  167. package/src/input/onboarding/onboarding-wizard-constants.ts +1 -0
  168. package/src/input/onboarding/onboarding-wizard-helpers.ts +1 -1
  169. package/src/input/onboarding/onboarding-wizard-operator-steps.ts +223 -55
  170. package/src/input/onboarding/onboarding-wizard-steps.ts +59 -35
  171. package/src/input/onboarding/onboarding-wizard-types.ts +4 -1
  172. package/src/input/onboarding/onboarding-wizard.ts +87 -2
  173. package/src/input/profile-picker-modal.ts +31 -12
  174. package/src/input/session-picker-modal.ts +21 -4
  175. package/src/input/settings-modal-agent-policy.ts +6 -6
  176. package/src/input/settings-modal-behavior.ts +0 -3
  177. package/src/input/settings-modal-subscriptions.ts +3 -3
  178. package/src/input/settings-modal-types.ts +2 -13
  179. package/src/input/settings-modal.ts +20 -66
  180. package/src/input/submission-intent.ts +0 -1
  181. package/src/input/submission-router.ts +3 -3
  182. package/src/main.ts +18 -10
  183. package/src/panels/approval-panel.ts +8 -8
  184. package/src/panels/automation-control-panel.ts +4 -4
  185. package/src/panels/base-panel.ts +1 -1
  186. package/src/panels/builtin/agent.ts +1 -1
  187. package/src/panels/builtin/operations.ts +3 -12
  188. package/src/panels/builtin/session.ts +32 -24
  189. package/src/panels/builtin/shared.ts +7 -7
  190. package/src/panels/cost-tracker-panel.ts +1 -1
  191. package/src/panels/docs-panel.ts +5 -3
  192. package/src/panels/index.ts +0 -1
  193. package/src/panels/knowledge-panel.ts +6 -5
  194. package/src/panels/memory-panel.ts +7 -6
  195. package/src/panels/panel-list-panel.ts +36 -80
  196. package/src/panels/project-planning-panel.ts +19 -12
  197. package/src/panels/provider-account-snapshot.ts +51 -25
  198. package/src/panels/provider-accounts-panel.ts +33 -18
  199. package/src/panels/provider-health-domains.ts +48 -7
  200. package/src/panels/provider-health-panel.ts +5 -4
  201. package/src/panels/qr-panel.ts +44 -20
  202. package/src/panels/schedule-panel.ts +9 -17
  203. package/src/panels/security-panel.ts +8 -8
  204. package/src/panels/session-browser-panel.ts +10 -10
  205. package/src/panels/subscription-panel.ts +6 -6
  206. package/src/panels/system-messages-panel.ts +3 -3
  207. package/src/panels/tasks-panel.ts +21 -14
  208. package/src/panels/tool-inspector-panel.ts +19 -12
  209. package/src/panels/work-plan-panel.ts +5 -5
  210. package/src/planning/project-planning-coordinator.ts +3 -3
  211. package/src/provider-auth-route-display.ts +9 -0
  212. package/src/renderer/agent-workspace-style.ts +34 -0
  213. package/src/renderer/agent-workspace.ts +254 -57
  214. package/src/renderer/autocomplete-overlay.ts +25 -6
  215. package/src/renderer/block-actions.ts +1 -3
  216. package/src/renderer/bookmark-modal.ts +19 -4
  217. package/src/renderer/buffer.ts +4 -2
  218. package/src/renderer/context-inspector.ts +50 -13
  219. package/src/renderer/diff.ts +1 -1
  220. package/src/renderer/file-picker-overlay.ts +19 -6
  221. package/src/renderer/help-overlay.ts +112 -34
  222. package/src/renderer/history-search-overlay.ts +19 -4
  223. package/src/renderer/live-tail-modal.ts +27 -5
  224. package/src/renderer/mcp-workspace.ts +176 -43
  225. package/src/renderer/model-picker-overlay.ts +58 -3
  226. package/src/renderer/model-workspace.ts +104 -22
  227. package/src/renderer/onboarding/onboarding-wizard.ts +20 -4
  228. package/src/renderer/process-modal.ts +27 -6
  229. package/src/renderer/profile-picker-modal.ts +21 -5
  230. package/src/renderer/search-overlay.ts +25 -5
  231. package/src/renderer/selection-modal-overlay.ts +46 -14
  232. package/src/renderer/session-picker-modal.ts +18 -1
  233. package/src/renderer/settings-modal-helpers.ts +2 -40
  234. package/src/renderer/settings-modal.ts +88 -55
  235. package/src/renderer/system-message.ts +1 -1
  236. package/src/renderer/tool-call.ts +20 -11
  237. package/src/runtime/agent-runtime-events.ts +129 -0
  238. package/src/runtime/bootstrap-command-context.ts +7 -1
  239. package/src/runtime/bootstrap-command-parts.ts +11 -8
  240. package/src/runtime/bootstrap-core.ts +23 -65
  241. package/src/runtime/bootstrap-hook-bridge.ts +7 -18
  242. package/src/runtime/bootstrap-shell.ts +46 -8
  243. package/src/runtime/bootstrap.ts +36 -46
  244. package/src/runtime/connected-host-auth.ts +47 -0
  245. package/src/runtime/diagnostics/panels/index.ts +2 -2
  246. package/src/runtime/diagnostics/panels/panel-resources.ts +1 -1
  247. package/src/runtime/diagnostics/panels/policy.ts +7 -7
  248. package/src/runtime/index.ts +2 -5
  249. package/src/runtime/onboarding/apply-file-helpers.ts +66 -0
  250. package/src/runtime/onboarding/apply.ts +288 -74
  251. package/src/runtime/onboarding/derivation.ts +10 -13
  252. package/src/runtime/onboarding/snapshot.ts +2 -17
  253. package/src/runtime/onboarding/types.ts +34 -20
  254. package/src/runtime/onboarding/verify.ts +105 -4
  255. package/src/runtime/operator-token-cleanup.ts +3 -3
  256. package/src/runtime/services.ts +95 -11
  257. package/src/runtime/store/selectors/index.ts +3 -3
  258. package/src/runtime/store/state.ts +1 -4
  259. package/src/runtime/surface-feature-flags.ts +41 -6
  260. package/src/runtime/ui-read-models.ts +3 -4
  261. package/src/runtime/ui-services.ts +6 -6
  262. package/src/shell/blocking-input.ts +2 -1
  263. package/src/shell/service-settings-sync.ts +7 -7
  264. package/src/shell/ui-openers.ts +17 -38
  265. package/src/tools/agent-analysis-registry-policy.ts +0 -1
  266. package/src/tools/agent-channel-send-tool.ts +133 -0
  267. package/src/tools/agent-context-policy.ts +1 -1
  268. package/src/tools/agent-knowledge-ingest-tool.ts +405 -0
  269. package/src/tools/agent-knowledge-tool.ts +170 -0
  270. package/src/tools/agent-local-registry-tool.ts +279 -73
  271. package/src/tools/agent-media-generate-tool.ts +133 -0
  272. package/src/tools/agent-notify-tool.ts +143 -0
  273. package/src/tools/agent-operator-action-tool.ts +137 -0
  274. package/src/tools/agent-operator-briefing-tool.ts +217 -0
  275. package/src/tools/agent-reminder-schedule-tool.ts +237 -0
  276. package/src/tools/agent-tool-policy-guard.ts +13 -15
  277. package/src/tools/agent-work-plan-tool.ts +256 -0
  278. package/src/version.ts +1 -1
  279. package/docs/connected-services.md +0 -51
  280. package/src/cli/package-verification.ts +0 -274
  281. package/src/input/commands/policy-dispatch.ts +0 -339
  282. package/src/input/commands/policy.ts +0 -17
  283. package/src/panels/panel-picker.ts +0 -105
  284. package/src/panels/policy-panel.ts +0 -308
  285. package/src/renderer/panel-picker-overlay.ts +0 -202
@@ -0,0 +1,47 @@
1
+ import type { AgentWorkspaceEditorKind, AgentWorkspaceLocalEditor } from './agent-workspace-types.ts';
2
+
3
+ export type AgentWorkspaceTaskCommandEditorKind = Extract<
4
+ AgentWorkspaceEditorKind,
5
+ 'task-list-filter' | 'task-show' | 'task-output'
6
+ >;
7
+
8
+ export function isAgentWorkspaceTaskCommandEditorKind(kind: AgentWorkspaceEditorKind): kind is AgentWorkspaceTaskCommandEditorKind {
9
+ return kind === 'task-list-filter' || kind === 'task-show' || kind === 'task-output';
10
+ }
11
+
12
+ export function createAgentWorkspaceTaskCommandEditor(kind: AgentWorkspaceTaskCommandEditorKind): AgentWorkspaceLocalEditor {
13
+ if (kind === 'task-list-filter') {
14
+ return {
15
+ kind,
16
+ mode: 'create',
17
+ title: 'Filter Host Tasks',
18
+ selectedFieldIndex: 0,
19
+ message: 'List connected-host tasks filtered by status or kind. This is read-only and never creates, retries, or cancels tasks.',
20
+ fields: [
21
+ { id: 'filter', label: 'Status or kind', value: '', required: false, multiline: false, hint: 'Optional task status or kind. Blank lists recent tasks.' },
22
+ ],
23
+ };
24
+ }
25
+ if (kind === 'task-output') {
26
+ return {
27
+ kind,
28
+ mode: 'create',
29
+ title: 'Show Task Output',
30
+ selectedFieldIndex: 0,
31
+ message: 'Print one connected-host task output from the Agent workspace. This is read-only and does not retry, cancel, or mutate the task.',
32
+ fields: [
33
+ { id: 'taskId', label: 'Task id', value: '', required: true, multiline: false, hint: 'Connected-host task id from Host tasks.' },
34
+ ],
35
+ };
36
+ }
37
+ return {
38
+ kind,
39
+ mode: 'create',
40
+ title: 'Inspect Host Task',
41
+ selectedFieldIndex: 0,
42
+ message: 'Inspect one connected-host task from the Agent workspace. This is read-only and does not retry, cancel, or mutate the task.',
43
+ fields: [
44
+ { id: 'taskId', label: 'Task id', value: '', required: true, multiline: false, hint: 'Connected-host task id from Host tasks.' },
45
+ ],
46
+ };
47
+ }
@@ -25,11 +25,25 @@ export function handleAgentWorkspaceToken(
25
25
  }
26
26
 
27
27
  if (token.type === 'key') {
28
+ if (workspace.actionSearchActive) {
29
+ if (token.logicalName === 'escape') workspace.clearActionSearch();
30
+ else if (token.logicalName === 'enter') workspace.activateSelected(requestRender);
31
+ else if (token.logicalName === 'up') workspace.moveUp();
32
+ else if (token.logicalName === 'down') workspace.moveDown();
33
+ else if (token.logicalName === 'home') workspace.jumpHome();
34
+ else if (token.logicalName === 'end') workspace.jumpEnd();
35
+ else if (token.logicalName === 'backspace' || token.logicalName === 'delete') workspace.actionSearchBackspace();
36
+ else if (token.logicalName === 'space') workspace.appendActionSearchText(' ');
37
+ requestRender();
38
+ return true;
39
+ }
28
40
  if (token.logicalName === 'escape') {
29
41
  handleEscape();
30
42
  return true;
31
43
  }
32
- if (token.logicalName === 'enter' || token.logicalName === 'space') workspace.activateSelected(requestRender);
44
+ if (token.ctrl === true && token.logicalName === ']') workspace.cycleCategory('next');
45
+ else if (token.ctrl === true && token.logicalName === '[') workspace.cycleCategory('prev');
46
+ else if (token.logicalName === 'enter' || token.logicalName === 'space') workspace.activateSelected(requestRender);
33
47
  else if (token.logicalName === 'left') workspace.focusCategories();
34
48
  else if (token.logicalName === 'right') workspace.focusActions();
35
49
  else if (token.logicalName === 'up') workspace.moveUp();
@@ -38,7 +52,9 @@ export function handleAgentWorkspaceToken(
38
52
  else if (token.logicalName === 'home') workspace.jumpHome();
39
53
  else if (token.logicalName === 'end') workspace.jumpEnd();
40
54
  } else if (token.type === 'text') {
41
- if (token.value === 'h') workspace.focusCategories();
55
+ if (workspace.actionSearchActive) workspace.appendActionSearchText(token.value);
56
+ else if (token.value === '/') workspace.beginActionSearch();
57
+ else if (token.value === 'h') workspace.focusCategories();
42
58
  else if (token.value === 'l') workspace.focusActions();
43
59
  else if (token.value === 'j') workspace.moveDown();
44
60
  else if (token.value === 'k') workspace.moveUp();
@@ -7,33 +7,184 @@ export const AGENT_WORKSPACE_MODAL_NAME = 'agentWorkspace';
7
7
 
8
8
  export type AgentWorkspaceFocusPane = 'categories' | 'actions';
9
9
 
10
+ export const AGENT_WORKSPACE_CATEGORY_IDS = [
11
+ 'home',
12
+ 'setup',
13
+ 'research',
14
+ 'artifacts',
15
+ 'conversation',
16
+ 'channels',
17
+ 'tools',
18
+ 'knowledge',
19
+ 'voice-media',
20
+ 'profiles',
21
+ 'memory',
22
+ 'notes',
23
+ 'personas',
24
+ 'skills',
25
+ 'routines',
26
+ 'work',
27
+ 'host',
28
+ 'automation',
29
+ 'delegate',
30
+ ] as const;
31
+
32
+ export type AgentWorkspaceCategoryId = (typeof AGENT_WORKSPACE_CATEGORY_IDS)[number];
33
+
10
34
  export type AgentWorkspaceActionKind = 'command' | 'guidance' | 'workspace' | 'editor' | 'local-selection' | 'local-operation';
11
35
 
12
- export type AgentWorkspaceLocalEditorKind = 'memory' | 'persona' | 'skill' | 'routine' | 'profile';
36
+ export type AgentWorkspaceLocalEditorKind = 'memory' | 'note' | 'persona' | 'skill' | 'routine' | 'profile';
13
37
 
14
38
  export type AgentWorkspaceEditorKind =
15
39
  | AgentWorkspaceLocalEditorKind
40
+ | 'web-research'
41
+ | 'web-fetch'
16
42
  | 'knowledge-url'
43
+ | 'knowledge-urls'
17
44
  | 'knowledge-file'
18
45
  | 'knowledge-bookmarks'
19
46
  | 'knowledge-browser-history'
20
47
  | 'knowledge-connector-ingest'
48
+ | 'knowledge-connector-show'
49
+ | 'knowledge-connector-doctor'
50
+ | 'knowledge-reindex'
21
51
  | 'knowledge-search'
22
52
  | 'knowledge-ask'
53
+ | 'knowledge-get'
54
+ | 'knowledge-map'
55
+ | 'knowledge-review-issue'
56
+ | 'knowledge-consolidate'
57
+ | 'knowledge-packet'
58
+ | 'knowledge-explain'
59
+ | 'memory-search'
60
+ | 'memory-get'
61
+ | 'memory-explain'
62
+ | 'memory-promote'
63
+ | 'memory-link'
64
+ | 'memory-export'
65
+ | 'memory-import'
66
+ | 'memory-handoff-export'
67
+ | 'memory-handoff-inspect'
68
+ | 'memory-handoff-import'
69
+ | 'memory-vector-rebuild'
70
+ | 'persona-search'
71
+ | 'persona-show'
72
+ | 'skill-search'
73
+ | 'skill-show'
74
+ | 'routine-search'
75
+ | 'routine-show'
76
+ | 'plan-seed'
23
77
  | 'mcp-server'
78
+ | 'mcp-tools-server'
79
+ | 'mcp-repair'
24
80
  | 'notify-webhook'
25
81
  | 'notify-webhook-remove'
82
+ | 'notify-webhook-clear'
26
83
  | 'notify-webhook-test'
84
+ | 'notify-send'
85
+ | 'secret-set'
86
+ | 'secret-link'
87
+ | 'secret-test'
88
+ | 'secret-delete'
27
89
  | 'tts-prompt'
28
90
  | 'image-input'
91
+ | 'media-generate'
29
92
  | 'skill-bundle'
93
+ | 'skill-bundle-search'
94
+ | 'skill-bundle-show'
95
+ | 'skill-bundle-update'
96
+ | 'skill-bundle-enable'
97
+ | 'skill-bundle-disable'
98
+ | 'skill-bundle-review'
99
+ | 'skill-bundle-stale'
100
+ | 'skill-bundle-delete'
30
101
  | 'persona-discovery-import'
31
102
  | 'routine-discovery-import'
32
103
  | 'skill-discovery-import'
104
+ | 'learned-behavior'
33
105
  | 'profile-template-export'
34
106
  | 'profile-template-import'
107
+ | 'profile-template-show'
35
108
  | 'profile-template-from-discovered'
36
109
  | 'profile-from-discovered'
110
+ | 'profile-show'
111
+ | 'profile-default'
112
+ | 'profile-default-clear'
113
+ | 'profile-delete'
114
+ | 'provider-add'
115
+ | 'provider-remove'
116
+ | 'provider-use'
117
+ | 'provider-inspect'
118
+ | 'provider-routes'
119
+ | 'provider-account-repair'
120
+ | 'auth-show'
121
+ | 'auth-repair'
122
+ | 'auth-bundle-export'
123
+ | 'auth-bundle-inspect'
124
+ | 'trust-bundle-export'
125
+ | 'trust-bundle-inspect'
126
+ | 'support-bundle-export'
127
+ | 'support-bundle-inspect'
128
+ | 'support-bundle-import'
129
+ | 'subscription-inspect'
130
+ | 'subscription-login-start'
131
+ | 'subscription-login-finish'
132
+ | 'subscription-logout'
133
+ | 'subscription-bundle-export'
134
+ | 'subscription-bundle-inspect'
135
+ | 'voice-enable'
136
+ | 'voice-disable'
137
+ | 'voice-bundle-export'
138
+ | 'voice-bundle-inspect'
139
+ | 'conversation-export'
140
+ | 'conversation-events'
141
+ | 'conversation-groups'
142
+ | 'conversation-find'
143
+ | 'effort-level'
144
+ | 'channel-show'
145
+ | 'channel-doctor'
146
+ | 'channel-setup'
147
+ | 'channel-send'
148
+ | 'session-save'
149
+ | 'session-load'
150
+ | 'session-rename'
151
+ | 'session-resume'
152
+ | 'session-info'
153
+ | 'session-export-saved'
154
+ | 'session-search'
155
+ | 'session-delete'
156
+ | 'session-fork'
157
+ | 'session-graph'
158
+ | 'task-list-filter'
159
+ | 'task-show'
160
+ | 'task-output'
161
+ | 'plan-show'
162
+ | 'plan-approve'
163
+ | 'plan-override'
164
+ | 'plan-clear'
165
+ | 'health-repair'
166
+ | 'approval-review'
167
+ | 'approval-approve'
168
+ | 'approval-deny'
169
+ | 'approval-cancel'
170
+ | 'automation-job-run'
171
+ | 'automation-job-pause'
172
+ | 'automation-job-resume'
173
+ | 'automation-run-cancel'
174
+ | 'automation-run-retry'
175
+ | 'schedule-run'
176
+ | 'routine-receipt'
177
+ | 'schedule-receipt'
178
+ | 'mode-preset'
179
+ | 'mode-domain'
180
+ | 'model-pin'
181
+ | 'model-unpin'
182
+ | 'delegate-task'
183
+ | 'workplan-add'
184
+ | 'workplan-show'
185
+ | 'workplan-status'
186
+ | 'workplan-delete'
187
+ | 'workplan-clear-completed'
37
188
  | 'routine-schedule'
38
189
  | 'reminder-schedule';
39
190
 
@@ -42,6 +193,15 @@ export type AgentWorkspaceLocalOperation =
42
193
  | 'memory-review'
43
194
  | 'memory-stale'
44
195
  | 'memory-delete'
196
+ | 'note-edit'
197
+ | 'note-review'
198
+ | 'note-stale'
199
+ | 'note-delete'
200
+ | 'note-promote-memory'
201
+ | 'note-promote-persona'
202
+ | 'note-promote-skill'
203
+ | 'note-promote-routine'
204
+ | 'note-promote-knowledge-url'
45
205
  | 'persona-edit'
46
206
  | 'persona-use'
47
207
  | 'persona-review'
@@ -66,6 +226,7 @@ export interface AgentWorkspaceEditorField {
66
226
  readonly required: boolean;
67
227
  readonly multiline: boolean;
68
228
  readonly hint: string;
229
+ readonly redact?: boolean;
69
230
  }
70
231
 
71
232
  export interface AgentWorkspaceLocalEditor {
@@ -83,7 +244,7 @@ export interface AgentWorkspaceAction {
83
244
  readonly label: string;
84
245
  readonly detail: string;
85
246
  readonly command?: string;
86
- readonly targetCategoryId?: string;
247
+ readonly targetCategoryId?: AgentWorkspaceCategoryId;
87
248
  readonly editorKind?: AgentWorkspaceEditorKind;
88
249
  readonly localKind?: AgentWorkspaceLocalEditorKind;
89
250
  readonly selectionDelta?: number;
@@ -93,7 +254,7 @@ export interface AgentWorkspaceAction {
93
254
  }
94
255
 
95
256
  export interface AgentWorkspaceCategory {
96
- readonly id: string;
257
+ readonly id: AgentWorkspaceCategoryId;
97
258
  readonly group: string;
98
259
  readonly label: string;
99
260
  readonly summary: string;
@@ -101,7 +262,15 @@ export interface AgentWorkspaceCategory {
101
262
  readonly actions: readonly AgentWorkspaceAction[];
102
263
  }
103
264
 
265
+ export interface AgentWorkspaceActionSearchResult {
266
+ readonly category: AgentWorkspaceCategory;
267
+ readonly categoryIndex: number;
268
+ readonly action: AgentWorkspaceAction;
269
+ readonly actionIndex: number;
270
+ }
271
+
104
272
  export type AgentWorkspaceCommandDispatcher = (command: string) => void;
273
+ export type AgentWorkspacePromptDispatcher = (prompt: string) => void;
105
274
 
106
275
  export type AgentWorkspaceActionResultKind = 'guidance' | 'blocked' | 'dispatched' | 'refreshed' | 'error';
107
276
 
@@ -126,6 +295,9 @@ export interface AgentWorkspaceLocalLibraryItem {
126
295
  readonly confidence?: number;
127
296
  readonly active?: boolean;
128
297
  readonly enabled?: boolean;
298
+ readonly requirementCount?: number;
299
+ readonly missingRequirementCount?: number;
300
+ readonly missingRequirements?: readonly string[];
129
301
  readonly startCount?: number;
130
302
  }
131
303
 
@@ -147,6 +319,31 @@ export interface AgentWorkspaceRuntimeStarterTemplateItem {
147
319
  readonly source: string;
148
320
  }
149
321
 
322
+ export interface AgentWorkspaceRoutineScheduleReceiptSummary {
323
+ readonly id: string;
324
+ readonly status: string;
325
+ readonly routineId: string;
326
+ readonly routineName: string;
327
+ readonly scheduleName: string;
328
+ readonly scheduleKind: string;
329
+ readonly scheduleValue: string;
330
+ readonly createdAt: string;
331
+ }
332
+
333
+ export interface AgentWorkspaceCompanionAccessSummary {
334
+ readonly surface: 'goodvibes-agent';
335
+ readonly hostUrl: string;
336
+ readonly tokenPath: string;
337
+ readonly tokenPresent: boolean;
338
+ readonly tokenReadable: boolean;
339
+ readonly tokenFingerprint: string | null;
340
+ readonly tokenError: string | null;
341
+ readonly pairingReady: boolean;
342
+ readonly qrCommand: '/pair';
343
+ readonly manualTokenCommand: '/pair --show-token --yes';
344
+ readonly nextStep: string;
345
+ }
346
+
150
347
  export interface AgentWorkspaceRuntimeSnapshot {
151
348
  readonly provider: string;
152
349
  readonly model: string;
@@ -161,9 +358,16 @@ export interface AgentWorkspaceRuntimeSnapshot {
161
358
  readonly localMemoryReviewQueueCount: number;
162
359
  readonly localMemoryPromptActiveCount: number;
163
360
  readonly localMemories: readonly AgentWorkspaceLocalLibraryItem[];
361
+ readonly localNoteCount: number;
362
+ readonly localNoteReviewQueueCount: number;
363
+ readonly localNotes: readonly AgentWorkspaceLocalLibraryItem[];
164
364
  readonly localRoutineCount: number;
165
365
  readonly enabledRoutineCount: number;
166
366
  readonly localRoutines: readonly AgentWorkspaceLocalLibraryItem[];
367
+ readonly routineScheduleReceiptCount: number;
368
+ readonly successfulRoutineScheduleReceiptCount: number;
369
+ readonly failedRoutineScheduleReceiptCount: number;
370
+ readonly latestRoutineScheduleReceipt: AgentWorkspaceRoutineScheduleReceiptSummary | null;
167
371
  readonly localSkillCount: number;
168
372
  readonly enabledSkillCount: number;
169
373
  readonly localSkillBundleCount: number;
@@ -178,7 +382,8 @@ export interface AgentWorkspaceRuntimeSnapshot {
178
382
  readonly knowledgeRoute: '/api/goodvibes-agent/knowledge';
179
383
  readonly knowledgeIsolation: 'agent-only';
180
384
  readonly executionPolicy: 'serial-proactive';
181
- readonly wrfcPolicy: 'explicit-build-delegation-only';
385
+ readonly delegatedReviewPolicy: 'explicit-build-delegation-only';
386
+ readonly companionAccess: AgentWorkspaceCompanionAccessSummary;
182
387
  readonly channels: readonly AgentWorkspaceChannelStatus[];
183
388
  readonly voiceProviderCount: number;
184
389
  readonly voiceStreamingProviderCount: number;
@@ -199,6 +404,9 @@ export interface AgentWorkspaceRuntimeSnapshot {
199
404
  readonly browserToolExposureEnabled: boolean;
200
405
  readonly browserToolPublicBaseUrl: string;
201
406
  readonly activeRuntimeProfile: string;
407
+ readonly selectedRuntimeProfile: string | null;
408
+ readonly selectedRuntimeProfileExists: boolean;
409
+ readonly selectedRuntimeProfileSelectedAt: string | null;
202
410
  readonly runtimeProfileCount: number;
203
411
  readonly runtimeProfiles: readonly AgentWorkspaceRuntimeProfileItem[];
204
412
  readonly runtimeProfileRoot: string;
@@ -1,4 +1,5 @@
1
1
  import type { CommandContext } from './command-registry.ts';
2
+ import { getAgentWorkspaceConfigReader } from './agent-workspace-config-reader.ts';
2
3
 
3
4
  export type AgentWorkspaceVoiceMediaDomain = 'voice' | 'media';
4
5
  export type AgentWorkspaceVoiceMediaSetupState = 'ready' | 'registered' | 'needs-secret' | 'not-registered';
@@ -36,10 +37,6 @@ export interface AgentWorkspaceVoiceMediaReadiness {
36
37
  readonly nextSteps: readonly string[];
37
38
  }
38
39
 
39
- type AgentWorkspaceConfigReader = {
40
- get(key: string): unknown;
41
- };
42
-
43
40
  type ProviderSecretSpec = {
44
41
  readonly id: string;
45
42
  readonly secretKeyOptions: readonly string[];
@@ -66,7 +63,7 @@ const MEDIA_SECRET_SPECS: readonly ProviderSecretSpec[] = [
66
63
 
67
64
  function readConfigString(context: CommandContext, key: string, fallback: string): string {
68
65
  try {
69
- const configManager = context.platform?.configManager as unknown as AgentWorkspaceConfigReader | undefined;
66
+ const configManager = getAgentWorkspaceConfigReader(context);
70
67
  const value = configManager?.get(key);
71
68
  return typeof value === 'string' && value.trim().length > 0 ? value.trim() : fallback;
72
69
  } catch {
@@ -76,7 +73,7 @@ function readConfigString(context: CommandContext, key: string, fallback: string
76
73
 
77
74
  function readConfigBoolean(context: CommandContext, key: string, fallback: boolean): boolean {
78
75
  try {
79
- const configManager = context.platform?.configManager as unknown as AgentWorkspaceConfigReader | undefined;
76
+ const configManager = getAgentWorkspaceConfigReader(context);
80
77
  const value = configManager?.get(key);
81
78
  if (typeof value === 'boolean') return value;
82
79
  if (typeof value === 'string') {
@@ -150,7 +147,7 @@ function missingSelectedProviderStatus(selectedProviderId: string): AgentWorkspa
150
147
  secretKeyOptions: [],
151
148
  configuredSecretKeys: [],
152
149
  missingSecretKeyOptions: [],
153
- nextStep: `Selected TTS provider ${selectedProviderId} is not registered in connected GoodVibes services.`,
150
+ nextStep: `Selected TTS provider ${selectedProviderId} is not registered by the connected GoodVibes host.`,
154
151
  };
155
152
  }
156
153
 
@@ -0,0 +1,104 @@
1
+ import type { AgentWorkspaceActionResult, AgentWorkspaceLocalEditor } from './agent-workspace-types.ts';
2
+
3
+ type AgentWorkspaceFieldReader = (fieldId: string) => string;
4
+ export type AgentWorkspaceWebResearchMode = 'research' | 'fetch';
5
+
6
+ export type AgentWorkspaceWebResearchSubmission =
7
+ | {
8
+ readonly kind: 'editor';
9
+ readonly editor: AgentWorkspaceLocalEditor;
10
+ readonly status: string;
11
+ readonly actionResult?: AgentWorkspaceActionResult;
12
+ }
13
+ | {
14
+ readonly kind: 'prompt';
15
+ readonly prompt: string;
16
+ readonly status: string;
17
+ readonly actionResult: AgentWorkspaceActionResult;
18
+ };
19
+
20
+ export function createAgentWorkspaceWebResearchEditor(mode: AgentWorkspaceWebResearchMode): AgentWorkspaceLocalEditor {
21
+ if (mode === 'fetch') {
22
+ return {
23
+ kind: 'web-fetch',
24
+ mode: 'create',
25
+ title: 'Fetch or Inspect URL',
26
+ selectedFieldIndex: 0,
27
+ message: 'Submit a normal Agent conversation turn that inspects one URL with connected read-only web tools. This does not ingest the URL into Agent Knowledge unless you explicitly ask for that.',
28
+ fields: [
29
+ { id: 'url', label: 'URL', value: '', required: true, multiline: false, hint: 'https://example.com/page' },
30
+ { id: 'goal', label: 'Question or goal', value: '', required: false, multiline: true, hint: 'What should Agent extract, compare, summarize, or verify? Ctrl-J inserts a new line.' },
31
+ ],
32
+ };
33
+ }
34
+ return {
35
+ kind: 'web-research',
36
+ mode: 'create',
37
+ title: 'Web Research Request',
38
+ selectedFieldIndex: 0,
39
+ message: 'Submit a normal Agent conversation turn that searches or reads the web through connected read-only tools. Agent should answer in the main conversation and remember only durable facts that belong in Agent memory.',
40
+ fields: [
41
+ { id: 'query', label: 'Research request', value: '', required: true, multiline: true, hint: 'Ask for the outcome you want, not just keywords. Ctrl-J inserts a new line.' },
42
+ { id: 'scope', label: 'Source or freshness hints', value: '', required: false, multiline: false, hint: 'Optional filters such as official docs only, last 30 days, primary sources, or compare products.' },
43
+ ],
44
+ };
45
+ }
46
+
47
+ export function buildAgentWorkspaceWebResearchSubmission(
48
+ editor: AgentWorkspaceLocalEditor,
49
+ readField: AgentWorkspaceFieldReader,
50
+ promptDispatchAvailable: boolean,
51
+ ): AgentWorkspaceWebResearchSubmission {
52
+ if (!promptDispatchAvailable) {
53
+ return {
54
+ kind: 'editor',
55
+ editor: { ...editor, message: 'Main-conversation submission is unavailable; cannot send this request from the workspace.' },
56
+ status: 'Main-conversation submission unavailable.',
57
+ actionResult: {
58
+ kind: 'error',
59
+ title: 'Conversation submission unavailable',
60
+ detail: 'The Agent workspace cannot hand this request back to the main conversation route.',
61
+ },
62
+ };
63
+ }
64
+
65
+ if (editor.kind === 'web-fetch') {
66
+ const url = readField('url');
67
+ const goal = readField('goal');
68
+ const prompt = [
69
+ `Use connected read-only web tools to inspect this URL: ${url}`,
70
+ goal.length > 0 ? `Goal: ${goal}` : 'Goal: summarize the useful facts, source title, and any caveats.',
71
+ 'Do not ingest this into Agent Knowledge unless I explicitly ask you to.',
72
+ ].join('\n');
73
+ return {
74
+ kind: 'prompt',
75
+ prompt,
76
+ status: 'Submitting URL inspection to the main conversation.',
77
+ actionResult: {
78
+ kind: 'dispatched',
79
+ title: 'Submitting URL inspection',
80
+ detail: 'The workspace closed and handed a read-only URL inspection request to the normal Agent conversation.',
81
+ safety: 'read-only',
82
+ },
83
+ };
84
+ }
85
+
86
+ const query = readField('query');
87
+ const scope = readField('scope');
88
+ const prompt = [
89
+ `Use connected read-only web tools to research this request: ${query}`,
90
+ scope.length > 0 ? `Source and freshness guidance: ${scope}` : 'Prefer current, primary, or official sources when they are available.',
91
+ 'Answer in the main conversation. Do not ingest sources into Agent Knowledge unless I explicitly ask you to.',
92
+ ].join('\n');
93
+ return {
94
+ kind: 'prompt',
95
+ prompt,
96
+ status: 'Submitting web research to the main conversation.',
97
+ actionResult: {
98
+ kind: 'dispatched',
99
+ title: 'Submitting web research',
100
+ detail: 'The workspace closed and handed a read-only web research request to the normal Agent conversation.',
101
+ safety: 'read-only',
102
+ },
103
+ };
104
+ }