@pellux/goodvibes-agent 1.1.7 → 1.2.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 (255) hide show
  1. package/CHANGELOG.md +170 -0
  2. package/README.md +46 -30
  3. package/dist/package/{ast-grep-napi.linux-x64-gnu-mkk8xwww.node → ast-grep-napi.linux-x64-gnu-swtppvy9.node} +0 -0
  4. package/dist/package/{ast-grep-napi.linux-x64-musl-ryqtgdv6.node → ast-grep-napi.linux-x64-musl-ttfcdtap.node} +0 -0
  5. package/dist/package/main.js +132577 -91483
  6. package/docs/README.md +14 -7
  7. package/docs/channels-remote-and-api.md +8 -5
  8. package/docs/connected-host.md +14 -12
  9. package/docs/getting-started.md +56 -30
  10. package/docs/knowledge-artifacts-and-multimodal.md +7 -5
  11. package/docs/project-planning.md +2 -2
  12. package/docs/providers-and-routing.md +11 -3
  13. package/docs/tools-and-commands.md +114 -45
  14. package/docs/voice-and-live-tts.md +3 -1
  15. package/package.json +3 -2
  16. package/release/release-notes.md +130 -5
  17. package/release/release-readiness.json +120 -90
  18. package/src/agent/assistant-cockpit.ts +247 -0
  19. package/src/agent/autonomy-schedule-format.ts +96 -0
  20. package/src/agent/autonomy-schedule.ts +514 -0
  21. package/src/agent/channel-delivery-receipts.ts +292 -0
  22. package/src/agent/competitive-feature-inventory.ts +296 -0
  23. package/src/agent/document-registry-types.ts +106 -0
  24. package/src/agent/document-registry.ts +734 -0
  25. package/src/agent/harness-control.ts +2 -2
  26. package/src/agent/memory-prompt.ts +2 -2
  27. package/src/agent/operator-actions.ts +50 -6
  28. package/src/agent/persona-registry.ts +8 -0
  29. package/src/agent/project-context-files.ts +273 -0
  30. package/src/agent/prompt-context-receipts.ts +502 -0
  31. package/src/agent/reminder-schedule-format.ts +16 -2
  32. package/src/agent/research-run-registry.ts +582 -0
  33. package/src/agent/research-source-registry.ts +441 -0
  34. package/src/agent/routine-registry.ts +19 -3
  35. package/src/agent/routine-schedule-format.ts +27 -2
  36. package/src/agent/runtime-profile-starters.ts +7 -0
  37. package/src/agent/runtime-profile.ts +106 -4
  38. package/src/agent/schedule-edit-format.ts +129 -0
  39. package/src/agent/schedule-edit.ts +496 -0
  40. package/src/agent/schedule-next-routes.ts +42 -0
  41. package/src/agent/setup-wizard-checkpoint.ts +140 -0
  42. package/src/agent/setup-wizard.ts +447 -0
  43. package/src/agent/skill-registry-types.ts +102 -0
  44. package/src/agent/skill-registry.ts +81 -107
  45. package/src/agent/vibe-confirmation-routes.ts +62 -0
  46. package/src/agent/vibe-file.ts +285 -0
  47. package/src/cli/agent-knowledge-command.ts +45 -2
  48. package/src/cli/help.ts +3 -0
  49. package/src/cli/profiles-command.ts +25 -11
  50. package/src/config/agent-settings-policy.ts +1 -18
  51. package/src/input/agent-workspace-activation.ts +53 -0
  52. package/src/input/agent-workspace-artifact-browser-editor.ts +494 -0
  53. package/src/input/agent-workspace-artifact-metadata.ts +17 -0
  54. package/src/input/agent-workspace-basic-command-editors.ts +5 -1
  55. package/src/input/agent-workspace-categories.ts +153 -155
  56. package/src/input/agent-workspace-channel-triage.ts +481 -0
  57. package/src/input/agent-workspace-channels.ts +263 -0
  58. package/src/input/agent-workspace-command-editor.ts +152 -0
  59. package/src/input/agent-workspace-context-snapshot.ts +349 -0
  60. package/src/input/agent-workspace-delegation-editor-submission.ts +8 -0
  61. package/src/input/agent-workspace-document-editor.ts +502 -0
  62. package/src/input/agent-workspace-document-ops-editor.ts +523 -0
  63. package/src/input/agent-workspace-host-category.ts +1 -1
  64. package/src/input/agent-workspace-local-library-snapshot.ts +167 -0
  65. package/src/input/agent-workspace-model-compare-editor.ts +376 -0
  66. package/src/input/agent-workspace-model-compare-prompt-submission.ts +552 -0
  67. package/src/input/agent-workspace-model-compare-types.ts +82 -0
  68. package/src/input/agent-workspace-model-compare-utils.ts +35 -0
  69. package/src/input/agent-workspace-onboarding-categories.ts +141 -0
  70. package/src/input/agent-workspace-operations-command-editor-submission.ts +53 -0
  71. package/src/input/agent-workspace-operations-command-editors.ts +22 -0
  72. package/src/input/agent-workspace-research-report-editor.ts +212 -0
  73. package/src/input/agent-workspace-research-run-editor.ts +144 -0
  74. package/src/input/agent-workspace-research-source-editor.ts +167 -0
  75. package/src/input/agent-workspace-review-packet-snapshot.ts +593 -0
  76. package/src/input/agent-workspace-review-packet-utils.ts +265 -0
  77. package/src/input/agent-workspace-settings.ts +262 -30
  78. package/src/input/agent-workspace-setup-checkpoint-action.ts +127 -0
  79. package/src/input/agent-workspace-setup-snapshot.ts +198 -0
  80. package/src/input/agent-workspace-setup.ts +34 -1
  81. package/src/input/agent-workspace-snapshot.ts +162 -147
  82. package/src/input/agent-workspace-types.ts +287 -2
  83. package/src/input/agent-workspace.ts +18 -0
  84. package/src/input/command-registry.ts +9 -2
  85. package/src/input/commands/agent-runtime-profile-runtime.ts +28 -13
  86. package/src/input/commands/channels-runtime.ts +102 -114
  87. package/src/input/commands/delegation-runtime.ts +87 -24
  88. package/src/input/commands/knowledge-browser-flags.ts +12 -0
  89. package/src/input/commands/knowledge.ts +28 -14
  90. package/src/input/commands/operator-actions-runtime.ts +6 -3
  91. package/src/input/commands/schedule-runtime.ts +71 -14
  92. package/src/input/commands/session-content.ts +2 -2
  93. package/src/input/commands/shell-core.ts +2 -0
  94. package/src/input/commands/vibe-runtime.ts +140 -0
  95. package/src/input/commands.ts +2 -0
  96. package/src/input/connected-host-routes.ts +123 -0
  97. package/src/input/settings-modal-types.ts +14 -0
  98. package/src/main.ts +15 -15
  99. package/src/panels/qr-panel.ts +2 -2
  100. package/src/renderer/agent-workspace-context-lines.ts +686 -0
  101. package/src/renderer/agent-workspace.ts +30 -419
  102. package/src/renderer/settings-modal-helpers.ts +12 -0
  103. package/src/renderer/settings-modal.ts +12 -0
  104. package/src/runtime/bootstrap-command-context.ts +11 -1
  105. package/src/runtime/bootstrap-command-parts.ts +14 -3
  106. package/src/runtime/bootstrap-core.ts +39 -1
  107. package/src/runtime/bootstrap-shell.ts +6 -0
  108. package/src/runtime/bootstrap.ts +113 -30
  109. package/src/runtime/connected-host-auth.ts +3 -2
  110. package/src/runtime/execution-ledger.ts +231 -0
  111. package/src/runtime/services.ts +88 -10
  112. package/src/runtime/tool-permission-safety.ts +199 -5
  113. package/src/shell/session-continuity-hints.ts +39 -0
  114. package/src/tools/agent-artifacts-tool.ts +606 -0
  115. package/src/tools/agent-audit-tool.ts +155 -0
  116. package/src/tools/agent-autonomy-schedule-tool.ts +238 -0
  117. package/src/tools/agent-autonomy-tool.ts +140 -0
  118. package/src/tools/agent-channel-send-tool.ts +24 -2
  119. package/src/tools/agent-channels-tool.ts +140 -0
  120. package/src/tools/agent-computer-tool.ts +168 -0
  121. package/src/tools/agent-context-policy.ts +137 -7
  122. package/src/tools/agent-context-tool.ts +143 -0
  123. package/src/tools/agent-delegation-tool.ts +128 -0
  124. package/src/tools/agent-device-tool.ts +240 -0
  125. package/src/tools/agent-documents-tool.ts +684 -0
  126. package/src/tools/agent-execution-tool.ts +230 -0
  127. package/src/tools/agent-harness-agent-orchestration.ts +703 -0
  128. package/src/tools/agent-harness-autonomy-intake.ts +785 -0
  129. package/src/tools/agent-harness-autonomy-live-records.ts +588 -0
  130. package/src/tools/agent-harness-autonomy-queue-types.ts +88 -0
  131. package/src/tools/agent-harness-autonomy-queue.ts +560 -0
  132. package/src/tools/agent-harness-background-processes-types.ts +35 -0
  133. package/src/tools/agent-harness-background-processes.ts +794 -0
  134. package/src/tools/agent-harness-browser-cockpit-route.ts +219 -0
  135. package/src/tools/agent-harness-browser-control.ts +338 -0
  136. package/src/tools/agent-harness-channel-metadata.ts +168 -10
  137. package/src/tools/agent-harness-cli-command-policy.ts +110 -0
  138. package/src/tools/agent-harness-command-catalog.ts +4 -2
  139. package/src/tools/agent-harness-command-runner.ts +42 -0
  140. package/src/tools/agent-harness-connected-host-status.ts +7 -4
  141. package/src/tools/agent-harness-delegation-posture.ts +234 -19
  142. package/src/tools/agent-harness-document-ops-reviewer-readiness.ts +234 -0
  143. package/src/tools/agent-harness-document-ops-types.ts +72 -0
  144. package/src/tools/agent-harness-document-ops.ts +671 -0
  145. package/src/tools/agent-harness-execution-history.ts +489 -0
  146. package/src/tools/agent-harness-execution-posture.ts +382 -0
  147. package/src/tools/agent-harness-file-recovery.ts +135 -0
  148. package/src/tools/agent-harness-keybinding-metadata.ts +16 -12
  149. package/src/tools/agent-harness-learning-curator-common.ts +102 -0
  150. package/src/tools/agent-harness-learning-curator-consolidation.ts +295 -0
  151. package/src/tools/agent-harness-learning-curator-proposals.ts +606 -0
  152. package/src/tools/agent-harness-learning-curator-types.ts +151 -0
  153. package/src/tools/agent-harness-learning-curator.ts +417 -0
  154. package/src/tools/agent-harness-local-model-benchmarks.ts +199 -0
  155. package/src/tools/agent-harness-local-model-cookbook.ts +238 -0
  156. package/src/tools/agent-harness-local-model-endpoints.ts +673 -0
  157. package/src/tools/agent-harness-media-posture.ts +208 -2
  158. package/src/tools/agent-harness-memory-posture.ts +556 -0
  159. package/src/tools/agent-harness-metadata.ts +100 -168
  160. package/src/tools/agent-harness-mode-catalog.ts +84 -33
  161. package/src/tools/agent-harness-model-catalog.ts +162 -0
  162. package/src/tools/agent-harness-model-provider-health.ts +186 -0
  163. package/src/tools/agent-harness-model-readiness.ts +406 -0
  164. package/src/tools/agent-harness-model-routing-types.ts +266 -0
  165. package/src/tools/agent-harness-model-routing-utils.ts +30 -0
  166. package/src/tools/agent-harness-model-routing.ts +137 -190
  167. package/src/tools/agent-harness-operator-methods.ts +115 -133
  168. package/src/tools/agent-harness-pairing-posture.ts +431 -18
  169. package/src/tools/agent-harness-personal-ops-discovery.ts +533 -0
  170. package/src/tools/agent-harness-personal-ops-intake.ts +385 -0
  171. package/src/tools/agent-harness-personal-ops-lanes.ts +204 -0
  172. package/src/tools/agent-harness-personal-ops-records.ts +732 -0
  173. package/src/tools/agent-harness-personal-ops-runner.ts +637 -0
  174. package/src/tools/agent-harness-personal-ops-types.ts +222 -0
  175. package/src/tools/agent-harness-personal-ops.ts +606 -0
  176. package/src/tools/agent-harness-project-context.ts +144 -0
  177. package/src/tools/agent-harness-prompt-context.ts +589 -0
  178. package/src/tools/agent-harness-provider-account-metadata.ts +2 -2
  179. package/src/tools/agent-harness-release-evidence.ts +9 -7
  180. package/src/tools/agent-harness-release-readiness.ts +9 -7
  181. package/src/tools/agent-harness-research-briefing.ts +427 -0
  182. package/src/tools/agent-harness-research-queue.ts +250 -0
  183. package/src/tools/agent-harness-research-runs.ts +295 -0
  184. package/src/tools/agent-harness-research-workflow.ts +322 -0
  185. package/src/tools/agent-harness-security-posture.ts +2 -2
  186. package/src/tools/agent-harness-service-posture.ts +9 -9
  187. package/src/tools/agent-harness-session-metadata.ts +3 -3
  188. package/src/tools/agent-harness-setup-connected-host.ts +501 -0
  189. package/src/tools/agent-harness-setup-describe.ts +557 -0
  190. package/src/tools/agent-harness-setup-handoffs.ts +502 -0
  191. package/src/tools/agent-harness-setup-model-helpers.ts +101 -0
  192. package/src/tools/agent-harness-setup-plan.ts +253 -0
  193. package/src/tools/agent-harness-setup-posture-types.ts +218 -0
  194. package/src/tools/agent-harness-setup-posture-utils.ts +173 -0
  195. package/src/tools/agent-harness-setup-posture.ts +449 -221
  196. package/src/tools/agent-harness-setup-smoke.ts +508 -0
  197. package/src/tools/agent-harness-sudo-posture.ts +114 -0
  198. package/src/tools/agent-harness-tool-schema.ts +120 -7
  199. package/src/tools/agent-harness-tool-types.ts +78 -0
  200. package/src/tools/agent-harness-tool-utils.ts +43 -0
  201. package/src/tools/agent-harness-tool.ts +311 -370
  202. package/src/tools/agent-harness-ui-surface-metadata.ts +76 -69
  203. package/src/tools/agent-harness-ui-surface-types.ts +46 -0
  204. package/src/tools/agent-harness-vibe-health.ts +105 -0
  205. package/src/tools/agent-harness-workspace-action-runner.ts +149 -0
  206. package/src/tools/agent-harness-workspace-actions.ts +114 -8
  207. package/src/tools/agent-harness-workspace-editor-execution.ts +214 -0
  208. package/src/tools/agent-harness-workspace-editor-runner.ts +755 -0
  209. package/src/tools/agent-host-tool.ts +159 -0
  210. package/src/tools/agent-knowledge-ingest-tool.ts +34 -1
  211. package/src/tools/agent-learning-consolidation-core.ts +327 -0
  212. package/src/tools/agent-learning-consolidation-tool.ts +758 -0
  213. package/src/tools/agent-memory-tool.ts +214 -0
  214. package/src/tools/agent-model-compare-export.ts +315 -0
  215. package/src/tools/agent-model-compare-handoff.ts +592 -0
  216. package/src/tools/agent-model-compare-judgment.ts +633 -0
  217. package/src/tools/agent-model-compare-run.ts +722 -0
  218. package/src/tools/agent-model-compare-tool.ts +698 -0
  219. package/src/tools/agent-model-compare-types.ts +191 -0
  220. package/src/tools/agent-model-compare-utils.ts +93 -0
  221. package/src/tools/agent-models-tool.ts +208 -0
  222. package/src/tools/agent-operator-action-tool.ts +1 -1
  223. package/src/tools/agent-operator-method-tool.ts +643 -0
  224. package/src/tools/agent-personal-ops-tool.ts +197 -0
  225. package/src/tools/agent-policy-explanation.ts +415 -0
  226. package/src/tools/agent-research-report-tool.ts +608 -0
  227. package/src/tools/agent-research-runs-tool.ts +434 -0
  228. package/src/tools/agent-research-sources-tool.ts +443 -0
  229. package/src/tools/agent-research-tool.ts +687 -0
  230. package/src/tools/agent-review-packet-presets-core.ts +757 -0
  231. package/src/tools/agent-review-packet-presets-tool.ts +466 -0
  232. package/src/tools/agent-review-packet-share-tool.ts +305 -0
  233. package/src/tools/agent-route-planner-candidates-setup.ts +411 -0
  234. package/src/tools/agent-route-planner-candidates-surfaces.ts +432 -0
  235. package/src/tools/agent-route-planner-candidates-work.ts +251 -0
  236. package/src/tools/agent-route-planner-helpers.ts +667 -0
  237. package/src/tools/agent-route-planner.ts +185 -0
  238. package/src/tools/agent-route-tool.ts +105 -0
  239. package/src/tools/agent-schedule-edit-tool.ts +210 -0
  240. package/src/tools/agent-schedule-tool.ts +282 -0
  241. package/src/tools/agent-security-tool.ts +145 -0
  242. package/src/tools/agent-sessions-tool.ts +122 -0
  243. package/src/tools/agent-settings-import-tool.ts +104 -0
  244. package/src/tools/agent-settings-tool.ts +176 -0
  245. package/src/tools/agent-setup-tool.ts +226 -0
  246. package/src/tools/agent-support-tool.ts +122 -0
  247. package/src/tools/agent-terminal-process-tools.ts +167 -0
  248. package/src/tools/agent-tool-policy-guard-types.ts +77 -0
  249. package/src/tools/agent-tool-policy-guard.ts +106 -85
  250. package/src/tools/agent-vibe-tool.ts +297 -0
  251. package/src/tools/agent-work-plan-tool.ts +265 -6
  252. package/src/tools/agent-workspace-tool.ts +305 -0
  253. package/src/tools/artifact-archive.ts +169 -0
  254. package/src/tools/tool-definition-compaction.ts +36 -0
  255. package/src/version.ts +1 -1
@@ -0,0 +1,305 @@
1
+ import type { Tool } from '@pellux/goodvibes-sdk/platform/types';
2
+ import type { ToolRegistry } from '@pellux/goodvibes-sdk/platform/tools';
3
+ import type { CommandContext, CommandRegistry } from '../input/command-registry.ts';
4
+ import { createAgentHarnessTool } from './agent-harness-tool.ts';
5
+
6
+ type AgentWorkspaceToolAction =
7
+ | 'status'
8
+ | 'actions'
9
+ | 'action'
10
+ | 'run'
11
+ | 'surfaces'
12
+ | 'surface'
13
+ | 'open'
14
+ | 'panels'
15
+ | 'panel'
16
+ | 'open_panel'
17
+ | 'shortcuts'
18
+ | 'keybindings'
19
+ | 'keybinding'
20
+ | 'run_keybinding'
21
+ | 'set_keybinding'
22
+ | 'reset_keybinding'
23
+ | 'commands'
24
+ | 'command'
25
+ | 'run_command'
26
+ | 'cli_commands'
27
+ | 'cli_command';
28
+
29
+ interface AgentWorkspaceToolArgs {
30
+ readonly action?: unknown;
31
+ readonly mode?: unknown;
32
+ readonly id?: unknown;
33
+ readonly actionId?: unknown;
34
+ readonly workspaceActionId?: unknown;
35
+ readonly surfaceId?: unknown;
36
+ readonly panelId?: unknown;
37
+ readonly command?: unknown;
38
+ readonly commandName?: unknown;
39
+ readonly args?: unknown;
40
+ readonly target?: unknown;
41
+ readonly query?: unknown;
42
+ readonly category?: unknown;
43
+ readonly categoryId?: unknown;
44
+ readonly recordId?: unknown;
45
+ readonly fields?: unknown;
46
+ readonly combo?: unknown;
47
+ readonly combos?: unknown;
48
+ readonly key?: unknown;
49
+ readonly value?: unknown;
50
+ readonly pane?: unknown;
51
+ readonly includeParameters?: unknown;
52
+ readonly limit?: unknown;
53
+ readonly confirm?: unknown;
54
+ readonly explicitUserRequest?: unknown;
55
+ }
56
+
57
+ interface AgentWorkspaceToolDeps {
58
+ readonly commandRegistry: CommandRegistry;
59
+ readonly commandContext: CommandContext;
60
+ readonly toolRegistry: ToolRegistry;
61
+ readonly harnessTool?: Tool;
62
+ }
63
+
64
+ function error(message: string): { readonly success: false; readonly error: string } {
65
+ return { success: false, error: message };
66
+ }
67
+
68
+ function readString(value: unknown): string {
69
+ return typeof value === 'string' ? value.trim() : '';
70
+ }
71
+
72
+ function normalizeWorkspaceAction(value: unknown): AgentWorkspaceToolAction | null {
73
+ const action = readString(value).toLowerCase().replace(/-/g, '_');
74
+ if (!action) return null;
75
+ if (action === 'status' || action === 'summary' || action === 'home' || action === 'workspace' || action === 'categories' || action === 'workspace_categories') return 'status';
76
+ if (action === 'actions' || action === 'list_actions' || action === 'workspace_actions' || action === 'tasks') return 'actions';
77
+ if (action === 'action' || action === 'show' || action === 'inspect' || action === 'workspace_action') return 'action';
78
+ if (action === 'run' || action === 'submit' || action === 'run_action' || action === 'run_workspace_action') return 'run';
79
+ if (action === 'surfaces' || action === 'ui_surfaces' || action === 'screens' || action === 'views') return 'surfaces';
80
+ if (action === 'surface' || action === 'ui_surface' || action === 'screen' || action === 'view') return 'surface';
81
+ if (action === 'open' || action === 'navigate' || action === 'open_surface' || action === 'open_ui_surface') return 'open';
82
+ if (action === 'panels' || action === 'panes') return 'panels';
83
+ if (action === 'panel' || action === 'pane') return 'panel';
84
+ if (action === 'open_panel' || action === 'open_pane') return 'open_panel';
85
+ if (action === 'shortcuts' || action === 'shortcut_help' || action === 'help') return 'shortcuts';
86
+ if (action === 'keybindings' || action === 'bindings' || action === 'keys') return 'keybindings';
87
+ if (action === 'keybinding' || action === 'binding' || action === 'key') return 'keybinding';
88
+ if (action === 'run_keybinding' || action === 'trigger_keybinding' || action === 'trigger_shortcut') return 'run_keybinding';
89
+ if (action === 'set_keybinding' || action === 'bind' || action === 'set_binding') return 'set_keybinding';
90
+ if (action === 'reset_keybinding' || action === 'unbind' || action === 'reset_binding') return 'reset_keybinding';
91
+ if (action === 'commands' || action === 'slash_commands' || action === 'command_catalog') return 'commands';
92
+ if (action === 'command' || action === 'slash_command' || action === 'inspect_command') return 'command';
93
+ if (action === 'run_command' || action === 'execute_command' || action === 'execute') return 'run_command';
94
+ if (action === 'cli_commands' || action === 'cli_catalog') return 'cli_commands';
95
+ if (action === 'cli_command' || action === 'inspect_cli_command') return 'cli_command';
96
+ return null;
97
+ }
98
+
99
+ function readAction(args: AgentWorkspaceToolArgs): AgentWorkspaceToolAction {
100
+ const explicit = normalizeWorkspaceAction(args.action) ?? normalizeWorkspaceAction(args.mode);
101
+ if (explicit) return explicit;
102
+ if (readString(args.surfaceId)) return 'surface';
103
+ if (readString(args.panelId)) return 'panel';
104
+ if (readString(args.actionId) || readString(args.workspaceActionId)) return 'action';
105
+ if (readString(args.command) || readString(args.commandName)) return 'command';
106
+ if (readString(args.key)) return 'keybinding';
107
+ if (readString(args.categoryId) || readString(args.category) || readString(args.query) || readString(args.target)) return 'actions';
108
+ return 'status';
109
+ }
110
+
111
+ function compactArgs(entries: Record<string, unknown>): Record<string, unknown> {
112
+ return Object.fromEntries(Object.entries(entries).filter(([, value]) => value !== undefined && value !== ''));
113
+ }
114
+
115
+ function lookupId(args: AgentWorkspaceToolArgs): string {
116
+ return readString(args.actionId) || readString(args.workspaceActionId) || readString(args.id);
117
+ }
118
+
119
+ function surfaceLookup(args: AgentWorkspaceToolArgs): string {
120
+ return readString(args.surfaceId) || readString(args.id);
121
+ }
122
+
123
+ function panelLookup(args: AgentWorkspaceToolArgs): string {
124
+ return readString(args.panelId) || readString(args.id);
125
+ }
126
+
127
+ function confirmedArgs(args: AgentWorkspaceToolArgs): Record<string, unknown> {
128
+ return compactArgs({
129
+ confirm: args.confirm,
130
+ explicitUserRequest: args.explicitUserRequest,
131
+ });
132
+ }
133
+
134
+ function workspaceDiscoveryArgs(args: AgentWorkspaceToolArgs): Record<string, unknown> {
135
+ return compactArgs({
136
+ category: args.category,
137
+ categoryId: args.categoryId,
138
+ target: args.target,
139
+ query: args.query,
140
+ limit: args.limit,
141
+ includeParameters: args.includeParameters,
142
+ });
143
+ }
144
+
145
+ function workspaceActionArgs(mode: 'workspace_action' | 'run_workspace_action', args: AgentWorkspaceToolArgs): Record<string, unknown> {
146
+ const actionId = lookupId(args);
147
+ return compactArgs({
148
+ mode,
149
+ actionId,
150
+ command: args.command,
151
+ recordId: args.recordId,
152
+ fields: args.fields,
153
+ target: actionId || args.command ? undefined : args.target,
154
+ query: actionId || args.command ? undefined : args.query,
155
+ category: args.category,
156
+ categoryId: args.categoryId,
157
+ includeParameters: args.includeParameters,
158
+ ...(mode === 'run_workspace_action' ? confirmedArgs(args) : {}),
159
+ });
160
+ }
161
+
162
+ function surfaceArgs(mode: 'ui_surface' | 'open_ui_surface', args: AgentWorkspaceToolArgs): Record<string, unknown> {
163
+ const surfaceId = surfaceLookup(args);
164
+ return compactArgs({
165
+ mode,
166
+ surfaceId,
167
+ category: args.category,
168
+ categoryId: args.categoryId,
169
+ target: surfaceId ? args.target : (args.target ?? args.query),
170
+ query: surfaceId ? undefined : args.query,
171
+ includeParameters: mode === 'ui_surface' ? args.includeParameters : undefined,
172
+ ...(mode === 'open_ui_surface' ? confirmedArgs(args) : {}),
173
+ });
174
+ }
175
+
176
+ function panelArgs(mode: 'panel' | 'open_panel', args: AgentWorkspaceToolArgs): Record<string, unknown> {
177
+ const panelId = panelLookup(args);
178
+ return compactArgs({
179
+ mode,
180
+ panelId,
181
+ target: panelId ? undefined : args.target,
182
+ query: panelId ? undefined : args.query,
183
+ pane: args.pane,
184
+ includeParameters: mode === 'panel' ? args.includeParameters : undefined,
185
+ ...(mode === 'open_panel' ? confirmedArgs(args) : {}),
186
+ });
187
+ }
188
+
189
+ function keybindingArgs(mode: 'keybinding' | 'run_keybinding' | 'set_keybinding' | 'reset_keybinding', args: AgentWorkspaceToolArgs): Record<string, unknown> {
190
+ const actionId = lookupId(args);
191
+ return compactArgs({
192
+ mode,
193
+ actionId,
194
+ target: actionId ? undefined : args.target,
195
+ query: actionId ? undefined : args.query,
196
+ key: args.key,
197
+ combo: args.combo,
198
+ combos: args.combos,
199
+ fields: args.fields,
200
+ value: args.value,
201
+ includeParameters: mode === 'keybinding' ? args.includeParameters : undefined,
202
+ ...(mode === 'run_keybinding' || mode === 'set_keybinding' || mode === 'reset_keybinding' ? confirmedArgs(args) : {}),
203
+ });
204
+ }
205
+
206
+ function commandArgs(mode: 'command' | 'run_command' | 'cli_command', args: AgentWorkspaceToolArgs): Record<string, unknown> {
207
+ return compactArgs({
208
+ mode,
209
+ command: args.command,
210
+ commandName: args.commandName,
211
+ args: args.args,
212
+ target: args.command || args.commandName ? undefined : args.target,
213
+ query: args.command || args.commandName ? undefined : args.query,
214
+ includeParameters: mode === 'run_command' ? undefined : args.includeParameters,
215
+ ...(mode === 'run_command' ? confirmedArgs(args) : {}),
216
+ });
217
+ }
218
+
219
+ export function createAgentWorkspaceTool(deps: AgentWorkspaceToolDeps): Tool {
220
+ const harnessTool = deps.harnessTool ?? createAgentHarnessTool({
221
+ commandRegistry: deps.commandRegistry,
222
+ commandContext: deps.commandContext,
223
+ toolRegistry: deps.toolRegistry,
224
+ });
225
+
226
+ return {
227
+ definition: {
228
+ name: 'workspace',
229
+ description: 'Inspect/open workspace actions, UI, commands, and keys.',
230
+ parameters: {
231
+ type: 'object',
232
+ properties: {
233
+ action: {
234
+ type: 'string',
235
+ enum: ['status', 'actions', 'action', 'run', 'surfaces', 'surface', 'open', 'panels', 'panel', 'open_panel', 'shortcuts', 'keybindings', 'keybinding', 'run_keybinding', 'set_keybinding', 'reset_keybinding', 'commands', 'command', 'run_command', 'cli_commands', 'cli_command'],
236
+ description: 'Inspect catalogs, open UI, or run approved workspace actions.',
237
+ },
238
+ mode: { type: 'string', description: 'Alias for action.' },
239
+ id: { type: 'string', description: 'Generic action, surface, panel, or keybinding id.' },
240
+ actionId: { type: 'string', description: 'Workspace action or keybinding action id.' },
241
+ workspaceActionId: { type: 'string', description: 'Workspace action id alias.' },
242
+ surfaceId: { type: 'string', description: 'UI surface id.' },
243
+ panelId: { type: 'string', description: 'Panel id.' },
244
+ command: { type: 'string', description: 'Slash or CLI command string.' },
245
+ commandName: { type: 'string', description: 'Slash or CLI command name.' },
246
+ args: { type: 'array', items: { type: 'string' }, description: 'Command arguments when commandName is used.' },
247
+ target: { type: 'string', description: 'Lookup target, UI target, or search text.' },
248
+ query: { type: 'string', description: 'Catalog search text.' },
249
+ category: { type: 'string', description: 'Workspace category filter.' },
250
+ categoryId: { type: 'string', description: 'Workspace category id.' },
251
+ recordId: { type: 'string', description: 'Selected local record id for workspace editors.' },
252
+ fields: { type: 'object', additionalProperties: { type: 'string' }, description: 'Workspace editor field values.' },
253
+ combo: { type: 'object', description: 'Single keybinding combo.' },
254
+ combos: { type: 'array', items: { type: 'object' }, description: 'Multiple keybinding combos.' },
255
+ key: { type: 'string', description: 'Keybinding lookup key.' },
256
+ value: { anyOf: [{ type: 'string' }, { type: 'number' }, { type: 'boolean' }], description: 'Keybinding value such as Ctrl+G.' },
257
+ pane: { type: 'string', enum: ['top', 'bottom'], description: 'Preferred pane for panel open.' },
258
+ includeParameters: { type: 'boolean', description: 'Include detailed schemas or route metadata.' },
259
+ limit: { type: 'number', description: 'Maximum rows returned for catalog actions.' },
260
+ confirm: { type: 'boolean', description: 'Required true for UI opens and side-effecting actions.' },
261
+ explicitUserRequest: { type: 'string', description: 'User request authorizing confirmed workspace effects.' },
262
+ },
263
+ additionalProperties: false,
264
+ },
265
+ sideEffects: ['state'],
266
+ concurrency: 'serial',
267
+ },
268
+ execute: async (rawArgs: unknown) => {
269
+ const args = (rawArgs && typeof rawArgs === 'object' && !Array.isArray(rawArgs) ? rawArgs : {}) as AgentWorkspaceToolArgs;
270
+ const action = readAction(args);
271
+
272
+ if (action === 'status') return harnessTool.execute(compactArgs({ mode: 'workspace', target: args.target, query: args.query, includeParameters: args.includeParameters }));
273
+ if (action === 'actions') return harnessTool.execute({ mode: 'workspace_actions', ...workspaceDiscoveryArgs(args) });
274
+ if (action === 'action') return harnessTool.execute(workspaceActionArgs('workspace_action', args));
275
+ if (action === 'run') return harnessTool.execute(workspaceActionArgs('run_workspace_action', args));
276
+ if (action === 'surfaces') return harnessTool.execute(compactArgs({ mode: 'ui_surfaces', target: args.target, query: args.query, limit: args.limit, includeParameters: args.includeParameters }));
277
+ if (action === 'surface') return harnessTool.execute(surfaceArgs('ui_surface', args));
278
+ if (action === 'open') return harnessTool.execute(surfaceArgs('open_ui_surface', args));
279
+ if (action === 'panels') return harnessTool.execute(compactArgs({ mode: 'panels', target: args.target, query: args.query, limit: args.limit, includeParameters: args.includeParameters }));
280
+ if (action === 'panel') return harnessTool.execute(panelArgs('panel', args));
281
+ if (action === 'open_panel') return harnessTool.execute(panelArgs('open_panel', args));
282
+ if (action === 'shortcuts') return harnessTool.execute(compactArgs({ mode: 'shortcuts', target: args.target, query: args.query, limit: args.limit, includeParameters: args.includeParameters }));
283
+ if (action === 'keybindings') return harnessTool.execute(compactArgs({ mode: 'keybindings', target: args.target, query: args.query, limit: args.limit, includeParameters: args.includeParameters }));
284
+ if (action === 'keybinding') return harnessTool.execute(keybindingArgs('keybinding', args));
285
+ if (action === 'run_keybinding') return harnessTool.execute(keybindingArgs('run_keybinding', args));
286
+ if (action === 'set_keybinding') return harnessTool.execute(keybindingArgs('set_keybinding', args));
287
+ if (action === 'reset_keybinding') return harnessTool.execute(keybindingArgs('reset_keybinding', args));
288
+ if (action === 'commands') return harnessTool.execute(compactArgs({ mode: 'commands', target: args.target, query: args.query, limit: args.limit, includeParameters: args.includeParameters }));
289
+ if (action === 'command') return harnessTool.execute(commandArgs('command', args));
290
+ if (action === 'run_command') return harnessTool.execute(commandArgs('run_command', args));
291
+ if (action === 'cli_commands') return harnessTool.execute(compactArgs({ mode: 'cli_commands', target: args.target, query: args.query, limit: args.limit, includeParameters: args.includeParameters }));
292
+ if (action === 'cli_command') return harnessTool.execute(commandArgs('cli_command', args));
293
+
294
+ return error('Unknown workspace action. Use action:"status" or action:"actions" to inspect the workspace.');
295
+ },
296
+ };
297
+ }
298
+
299
+ export function registerAgentWorkspaceTool(
300
+ registry: ToolRegistry,
301
+ commandRegistry: CommandRegistry,
302
+ commandContext: CommandContext,
303
+ ): void {
304
+ if (!registry.has('workspace')) registry.register(createAgentWorkspaceTool({ commandRegistry, commandContext, toolRegistry: registry }));
305
+ }
@@ -0,0 +1,169 @@
1
+ import { deflateRawSync } from 'node:zlib';
2
+ import type { ArtifactDescriptor } from '@pellux/goodvibes-sdk/platform/artifacts';
3
+
4
+ export interface ArtifactPackageEntry {
5
+ readonly path: string;
6
+ readonly buffer: Buffer;
7
+ }
8
+
9
+ const SENSITIVE_METADATA_KEY = /token|secret|password|authorization|credential|api[-_]?key/i;
10
+
11
+ export function sanitizeArtifactMetadata(value: unknown): unknown {
12
+ if (Array.isArray(value)) return value.map(sanitizeArtifactMetadata);
13
+ if (!value || typeof value !== 'object') return value;
14
+ return Object.fromEntries(Object.entries(value).map(([key, entry]) => [
15
+ key,
16
+ SENSITIVE_METADATA_KEY.test(key) ? '<redacted>' : sanitizeArtifactMetadata(entry),
17
+ ]));
18
+ }
19
+
20
+ export function sanitizeArtifactSourceUri(value: string | undefined): string | undefined {
21
+ if (!value) return undefined;
22
+ try {
23
+ const url = new URL(value);
24
+ for (const key of [...url.searchParams.keys()]) {
25
+ if (SENSITIVE_METADATA_KEY.test(key)) url.searchParams.set(key, '<redacted>');
26
+ }
27
+ return url.toString();
28
+ } catch {
29
+ return value.replace(/([?&\s](?:token|secret|password|authorization|credential|api[-_]?key)=)[^\s&]+/gi, '$1<redacted>');
30
+ }
31
+ }
32
+
33
+ export function safeArtifactExportFilename(artifact: ArtifactDescriptor): string {
34
+ const filename = (artifact.filename || artifact.id).trim() || artifact.id;
35
+ return filename.replace(/[\\/]+/g, '-').replace(/^\.+$/, artifact.id);
36
+ }
37
+
38
+ function safePackagePathSegment(value: string, fallback: string): string {
39
+ const sanitized = value
40
+ .replace(/[\\/]+/g, '-')
41
+ .replace(/[<>:"|?*\x00-\x1F]+/g, '-')
42
+ .replace(/\s+/g, ' ')
43
+ .trim()
44
+ .replace(/^\.+$/, '');
45
+ const normalized = sanitized || fallback;
46
+ return normalized.length > 128 ? normalized.slice(0, 128).trimEnd() : normalized;
47
+ }
48
+
49
+ export function packageArtifactFilename(
50
+ artifact: ArtifactDescriptor,
51
+ index: number,
52
+ used: Set<string>,
53
+ ): string {
54
+ const ordinal = String(index + 1).padStart(2, '0');
55
+ const id = safePackagePathSegment(artifact.id, `artifact-${ordinal}`);
56
+ const filename = safePackagePathSegment(safeArtifactExportFilename(artifact), id);
57
+ const base = `${ordinal}-${id}-${filename}`;
58
+ let candidate = base;
59
+ let suffix = 2;
60
+ while (used.has(candidate.toLowerCase())) {
61
+ candidate = `${base}-${suffix}`;
62
+ suffix += 1;
63
+ }
64
+ used.add(candidate.toLowerCase());
65
+ return candidate;
66
+ }
67
+
68
+ function createCrc32Table(): Uint32Array {
69
+ const table = new Uint32Array(256);
70
+ for (let index = 0; index < table.length; index += 1) {
71
+ let value = index;
72
+ for (let bit = 0; bit < 8; bit += 1) {
73
+ value = (value & 1) !== 0 ? 0xedb88320 ^ (value >>> 1) : value >>> 1;
74
+ }
75
+ table[index] = value >>> 0;
76
+ }
77
+ return table;
78
+ }
79
+
80
+ const CRC32_TABLE = createCrc32Table();
81
+
82
+ function crc32(buffer: Buffer): number {
83
+ let crc = 0xffffffff;
84
+ for (const byte of buffer) {
85
+ crc = CRC32_TABLE[(crc ^ byte) & 0xff]! ^ (crc >>> 8);
86
+ }
87
+ return (crc ^ 0xffffffff) >>> 0;
88
+ }
89
+
90
+ function dosTimestamp(date = new Date()): { readonly time: number; readonly date: number } {
91
+ const year = Math.max(1980, Math.min(2107, date.getFullYear()));
92
+ return {
93
+ time: (date.getHours() << 11) | (date.getMinutes() << 5) | Math.floor(date.getSeconds() / 2),
94
+ date: ((year - 1980) << 9) | ((date.getMonth() + 1) << 5) | date.getDate(),
95
+ };
96
+ }
97
+
98
+ export function createZipArchive(entries: readonly ArtifactPackageEntry[]): Buffer {
99
+ if (entries.length > 0xffff) throw new Error('Artifact archive has too many files for ZIP output.');
100
+ const localParts: Buffer[] = [];
101
+ const centralParts: Buffer[] = [];
102
+ const timestamp = dosTimestamp();
103
+ let offset = 0;
104
+
105
+ for (const entry of entries) {
106
+ const safePath = entry.path.replace(/\\/g, '/');
107
+ const name = Buffer.from(safePath, 'utf-8');
108
+ const compressed = deflateRawSync(entry.buffer);
109
+ if (name.byteLength > 0xffff) throw new Error(`Artifact archive entry path is too long: ${safePath}`);
110
+ if (entry.buffer.byteLength > 0xffffffff || compressed.byteLength > 0xffffffff) {
111
+ throw new Error(`Artifact archive entry is too large for ZIP output: ${safePath}`);
112
+ }
113
+ const checksum = crc32(entry.buffer);
114
+ const method = 8;
115
+
116
+ const localHeader = Buffer.alloc(30);
117
+ localHeader.writeUInt32LE(0x04034b50, 0);
118
+ localHeader.writeUInt16LE(20, 4);
119
+ localHeader.writeUInt16LE(0, 6);
120
+ localHeader.writeUInt16LE(method, 8);
121
+ localHeader.writeUInt16LE(timestamp.time, 10);
122
+ localHeader.writeUInt16LE(timestamp.date, 12);
123
+ localHeader.writeUInt32LE(checksum, 14);
124
+ localHeader.writeUInt32LE(compressed.byteLength, 18);
125
+ localHeader.writeUInt32LE(entry.buffer.byteLength, 22);
126
+ localHeader.writeUInt16LE(name.byteLength, 26);
127
+ localHeader.writeUInt16LE(0, 28);
128
+ localParts.push(localHeader, name, compressed);
129
+
130
+ const centralHeader = Buffer.alloc(46);
131
+ centralHeader.writeUInt32LE(0x02014b50, 0);
132
+ centralHeader.writeUInt16LE(20, 4);
133
+ centralHeader.writeUInt16LE(20, 6);
134
+ centralHeader.writeUInt16LE(0, 8);
135
+ centralHeader.writeUInt16LE(method, 10);
136
+ centralHeader.writeUInt16LE(timestamp.time, 12);
137
+ centralHeader.writeUInt16LE(timestamp.date, 14);
138
+ centralHeader.writeUInt32LE(checksum, 16);
139
+ centralHeader.writeUInt32LE(compressed.byteLength, 20);
140
+ centralHeader.writeUInt32LE(entry.buffer.byteLength, 24);
141
+ centralHeader.writeUInt16LE(name.byteLength, 28);
142
+ centralHeader.writeUInt16LE(0, 30);
143
+ centralHeader.writeUInt16LE(0, 32);
144
+ centralHeader.writeUInt16LE(0, 34);
145
+ centralHeader.writeUInt16LE(0, 36);
146
+ centralHeader.writeUInt32LE(0, 38);
147
+ centralHeader.writeUInt32LE(offset, 42);
148
+ centralParts.push(centralHeader, name);
149
+
150
+ offset += localHeader.byteLength + name.byteLength + compressed.byteLength;
151
+ if (offset > 0xffffffff) throw new Error('Artifact archive is too large for ZIP output.');
152
+ }
153
+
154
+ const centralOffset = offset;
155
+ const centralDirectory = Buffer.concat(centralParts);
156
+ if (centralDirectory.byteLength > 0xffffffff) throw new Error('Artifact archive central directory is too large for ZIP output.');
157
+
158
+ const endOfCentralDirectory = Buffer.alloc(22);
159
+ endOfCentralDirectory.writeUInt32LE(0x06054b50, 0);
160
+ endOfCentralDirectory.writeUInt16LE(0, 4);
161
+ endOfCentralDirectory.writeUInt16LE(0, 6);
162
+ endOfCentralDirectory.writeUInt16LE(entries.length, 8);
163
+ endOfCentralDirectory.writeUInt16LE(entries.length, 10);
164
+ endOfCentralDirectory.writeUInt32LE(centralDirectory.byteLength, 12);
165
+ endOfCentralDirectory.writeUInt32LE(centralOffset, 16);
166
+ endOfCentralDirectory.writeUInt16LE(0, 20);
167
+
168
+ return Buffer.concat([...localParts, centralDirectory, endOfCentralDirectory]);
169
+ }
@@ -5,41 +5,77 @@ const DEFAULT_TOOL_DESCRIPTION_LIMIT = 56;
5
5
 
6
6
  const TOOL_DESCRIPTION_OVERRIDES: Readonly<Record<string, string>> = {
7
7
  agent: 'Inspect explicit subagent tasks.',
8
+ audit: 'Inspect release readiness and evidence.',
8
9
  analyze: 'Analyze code impact, symbols, and project risk.',
10
+ autonomy: 'Route ongoing work and inspect visible autonomy.',
9
11
  channel: 'Inspect or operate configured channel surfaces.',
12
+ channels: 'Inspect channel readiness, setup, triage, and receipts.',
13
+ computer: 'Inspect/open browser, desktop, and computer routes.',
14
+ context: 'Inspect project instructions and prompt context.',
15
+ delegation: 'Inspect build delegation routes and policy.',
10
16
  control: 'Inspect commands, panels, and runtime posture.',
17
+ device: 'Inspect/open device, voice, and browser routes.',
18
+ execution: 'Inspect local work routes, history, and recovery.',
11
19
  edit: 'Edit files with exact, fuzzy, or regex replacements.',
12
20
  exec: 'Run shell commands with timeout and retry.',
13
21
  fetch: 'Fetch HTTP URLs with auth and sanitization.',
14
22
  find: 'Search files, content, symbols, and project structure.',
15
23
  goodvibes_context: 'Inspect current GoodVibes runtime and host harness.',
16
24
  goodvibes_settings: 'Inspect/update GoodVibes settings on explicit request.',
25
+ host: 'Inspect GoodVibes host status, services, and methods.',
26
+ import_goodvibes_settings: 'Preview/apply shared GoodVibes settings import.',
17
27
  inspect: 'Inspect project structure, APIs, routes, and deps.',
18
28
  mcp: 'Inspect MCP servers, tools, schemas, and trust state.',
29
+ memory: 'Inspect memory posture, providers, curator, records.',
30
+ models: 'Inspect model routes, providers, cookbook, and checks.',
19
31
  packet: 'Manage implementation and execution packets.',
32
+ personal_ops: 'Brief, route, inspect, and read Personal Ops.',
20
33
  query: 'Track operator queries, answers, and closure.',
21
34
  read: 'Read files, outlines, symbols, and ranges.',
35
+ research: 'Plan, track, source, and save research.',
22
36
  registry: 'Discover local skills, agents, tools, and templates.',
23
37
  remote: 'Manage remote runner pools and artifacts.',
24
38
  repl: 'Evaluate bounded JS, TS, Python, SQL, or GraphQL.',
39
+ route: 'Choose the best visible route for a user task.',
40
+ schedule: 'List, create, edit, run, pause, resume schedules.',
41
+ security: 'Read security posture, findings, and policy decisions.',
42
+ sessions: 'Search and inspect saved sessions/bookmarks.',
43
+ settings: 'List, inspect, change, reset, or import settings.',
44
+ setup: 'Inspect and complete first-run Agent setup.',
45
+ support: 'Inspect support bundle routes and redacted bundles.',
25
46
  state: 'Read/update session state and diagnostics.',
26
47
  task: 'Manage cross-session tasks and handoffs.',
27
48
  team: 'Manage team definitions, roles, and lanes.',
49
+ terminal: 'Start visible tracked background shell commands.',
50
+ vibe: 'Inspect/create/import VIBE.md personality.',
51
+ workspace: 'Inspect/open workspace actions, UI, commands, keys.',
28
52
  web_search: 'Search the web through the configured provider.',
29
53
  workflow: 'Inspect/control configured workflow automation.',
30
54
  worklist: 'Manage durable worklists and checklist items.',
31
55
  write: 'Write files with batch, mkdir, backup, and validation.',
56
+ process: 'List, poll, log, wait, stop tracked processes.',
32
57
  agent_harness: 'Harness catalog: modes, settings, commands, UI, tools.',
58
+ agent_artifacts: 'Browse, preview, export, package, and archive artifacts.',
59
+ agent_documents: 'Create drafts, comments, suggestions, artifact attach/insert, and exports.',
33
60
  agent_knowledge: 'Read isolated Agent Knowledge.',
34
61
  agent_knowledge_ingest: 'Ingest confirmed source into Agent Knowledge.',
62
+ agent_learning_consolidation: 'Apply confirmed local duplicate learning phases.',
35
63
  agent_local_registry: 'Inspect/update Agent memory, notes, skills, routines.',
36
64
  agent_work_plan: 'Inspect/update the visible Agent-local work plan.',
37
65
  agent_operator_briefing: 'Read connected Agent operator state.',
38
66
  agent_operator_action: 'Run one confirmed allowlisted operator action.',
67
+ agent_autonomy_schedule: 'Schedule one confirmed autonomous Agent task.',
68
+ agent_schedule_edit: 'Edit one confirmed connected schedule.',
69
+ agent_research_runs: 'Track visible local research run checkpoints.',
70
+ agent_research_sources: 'Manage local research source review queue.',
71
+ agent_research_report: 'Save one confirmed sourced research report artifact.',
39
72
  agent_reminder_schedule: 'Schedule one confirmed Agent reminder.',
40
73
  agent_channel_send: 'Send confirmed message to configured Agent target.',
41
74
  agent_notify: 'Send one confirmed plain-text notification.',
42
75
  agent_media_generate: 'Generate one confirmed image or video artifact.',
76
+ agent_review_packet_presets: 'Save/list/refresh Document Ops packet presets.',
77
+ agent_review_packet_share: 'Share confirmed review packet archive reference.',
78
+ agent_model_compare: 'Blind compare prompts/artifacts, review, route receipts, handoff, diff.',
43
79
  };
44
80
 
45
81
  function compactText(value: string, limit: number): string {
package/src/version.ts CHANGED
@@ -6,7 +6,7 @@ import { join } from 'node:path';
6
6
  // The prebuild script updates the fallback value before compilation.
7
7
  // Uses import.meta.dir (Bun) to locate package.json relative to this file,
8
8
  // which is correct regardless of the process working directory.
9
- let _version = '1.1.7';
9
+ let _version = '1.2.0';
10
10
  try {
11
11
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8')) as {
12
12
  readonly version?: unknown;