@pellux/goodvibes-agent 1.0.34 → 1.0.35

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.
@@ -3,6 +3,10 @@ import { openTtsProviderPicker, openTtsVoicePicker } from '../input/tts-settings
3
3
 
4
4
  type UiSurfaceKind = 'overlay' | 'modal' | 'workspace' | 'picker';
5
5
 
6
+ function agentHarnessModes(...modes: readonly string[]): string {
7
+ return `agent_harness ${modes.map((mode) => `mode:"${mode}"`).join(', ')}`;
8
+ }
9
+
6
10
  export interface AgentHarnessUiSurfaceArgs {
7
11
  readonly query?: unknown;
8
12
  readonly surfaceId?: unknown;
@@ -163,7 +167,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
163
167
  kind: 'workspace',
164
168
  summary: 'Fullscreen operator workspace with setup, knowledge, local state, channels, automation, and delegation routes.',
165
169
  command: '/agent',
166
- preferredModelRoute: 'Use workspace_actions/workspace_action/run_workspace_action for model operation; use open_ui_surface only to visibly navigate.',
170
+ preferredModelRoute: `Use ${agentHarnessModes('workspace_actions', 'workspace_action', 'run_workspace_action')} for model operation; use mode:"open_ui_surface" only to visibly navigate.`,
167
171
  parameters: ['categoryId'],
168
172
  available: (context) => typeof context.openAgentWorkspace === 'function',
169
173
  open: (context, args) => {
@@ -180,7 +184,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
180
184
  kind: 'picker',
181
185
  summary: 'Keyboard-accessible operator panel route that now opens the Agent Workspace home surface.',
182
186
  command: 'Ctrl+P',
183
- preferredModelRoute: 'Use panels/panel/open_panel for panel catalog and routing, or workspace_actions for concrete model operation.',
187
+ preferredModelRoute: `Use ${agentHarnessModes('panels', 'panel', 'open_panel')} for panel catalog and routing, or mode:"workspace_actions" for concrete model operation.`,
184
188
  available: (context) => typeof context.openPanelPicker === 'function' || typeof context.openAgentWorkspace === 'function',
185
189
  open: (context) => {
186
190
  const surface = findSurfaceById('panel-picker')!;
@@ -197,7 +201,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
197
201
  kind: 'workspace',
198
202
  summary: 'Security review operator surface for token posture, MCP attack paths, policy posture, and plugin risk.',
199
203
  command: '/security',
200
- preferredModelRoute: 'Use workspace_actions for security review actions or run_command /security review for compact read-only output.',
204
+ preferredModelRoute: `Use mode:"workspace_actions" for security review actions or ${agentHarnessModes('run_command')} for confirmed /security review output.`,
201
205
  parameters: ['pane'],
202
206
  available: (context) => (
203
207
  typeof context.openAgentWorkspace === 'function'
@@ -219,7 +223,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
219
223
  kind: 'workspace',
220
224
  summary: 'Agent Knowledge operator surface for isolated status, source/node/issue libraries, item lookup, map review, connectors, ask/search, and ingest forms.',
221
225
  command: '/knowledge',
222
- preferredModelRoute: 'Use agent_knowledge, agent_knowledge_ingest, workspace_actions, or run_command /knowledge for concrete model operation.',
226
+ preferredModelRoute: `Use agent_knowledge, agent_knowledge_ingest, mode:"workspace_actions", or ${agentHarnessModes('run_command')} for confirmed /knowledge operation.`,
223
227
  parameters: ['pane'],
224
228
  available: (context) => (
225
229
  typeof context.openAgentWorkspace === 'function'
@@ -241,7 +245,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
241
245
  kind: 'workspace',
242
246
  summary: 'Provider subscription operator surface for subscription review, provider inspection, login, logout, and bundle flows.',
243
247
  command: '/subscription',
244
- preferredModelRoute: 'Use workspace_actions or confirmed run_command /subscription mirrors for concrete subscription operation.',
248
+ preferredModelRoute: `Use mode:"workspace_actions" or ${agentHarnessModes('run_command')} for confirmed /subscription mirrors.`,
245
249
  parameters: ['pane'],
246
250
  available: (context) => (
247
251
  typeof context.openAgentWorkspace === 'function'
@@ -263,7 +267,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
263
267
  kind: 'modal',
264
268
  summary: 'Fullscreen settings workspace for Agent-owned configuration, subscriptions, secrets, MCP, tools, and surface settings.',
265
269
  command: '/settings',
266
- preferredModelRoute: 'Use settings/get_setting/set_setting/reset_setting for model operation; use open_ui_surface only to visibly navigate.',
270
+ preferredModelRoute: `Use ${agentHarnessModes('settings', 'get_setting', 'set_setting', 'reset_setting')} for model operation; use mode:"open_ui_surface" only to visibly navigate.`,
267
271
  parameters: ['target', 'key', 'prefix'],
268
272
  available: (context) => typeof context.openSettingsModal === 'function',
269
273
  open: (context, args) => {
@@ -280,7 +284,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
280
284
  kind: 'workspace',
281
285
  summary: 'MCP server setup, trust posture, and tool inventory workspace.',
282
286
  command: '/mcp',
283
- preferredModelRoute: 'Use workspace_actions, tools, and settings modes for model operation.',
287
+ preferredModelRoute: `Use ${agentHarnessModes('workspace_actions', 'tools', 'settings')} for model operation.`,
284
288
  available: (context) => typeof context.openMcpWorkspace === 'function',
285
289
  open: (context) => {
286
290
  const surface = findSurfaceById('mcp-workspace')!;
@@ -295,7 +299,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
295
299
  kind: 'picker',
296
300
  summary: 'Interactive model picker for main, helper, tool, and TTS model routes.',
297
301
  command: '/model',
298
- preferredModelRoute: 'Use settings mode for direct provider.model changes, or run_command /model with confirmation when a concrete model id is known.',
302
+ preferredModelRoute: `Use ${agentHarnessModes('settings', 'get_setting', 'set_setting')} for direct provider.model changes, or mode:"run_command" with confirmation when a concrete model id is known.`,
299
303
  parameters: ['target'],
300
304
  available: (context) => typeof context.openModelPicker === 'function' || typeof context.openModelPickerWithTarget === 'function',
301
305
  open: (context, args) => {
@@ -316,7 +320,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
316
320
  kind: 'picker',
317
321
  summary: 'Interactive provider picker for model route setup.',
318
322
  command: '/provider',
319
- preferredModelRoute: 'Use settings mode for direct provider routing changes, or run confirmed slash-command mirrors for concrete provider changes.',
323
+ preferredModelRoute: `Use ${agentHarnessModes('settings', 'get_setting', 'set_setting')} for direct provider routing changes, or confirmed mode:"run_command" mirrors for concrete provider changes.`,
320
324
  parameters: ['target'],
321
325
  available: (context) => typeof context.openProviderPicker === 'function' || typeof context.openProviderModelPickerWithTarget === 'function',
322
326
  open: (context, args) => {
@@ -337,7 +341,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
337
341
  kind: 'picker',
338
342
  summary: 'Interactive reasoning-effort selector for the current main chat model when that model exposes effort levels.',
339
343
  command: '/effort',
340
- preferredModelRoute: 'Use settings/get_setting/set_setting for provider.reasoningEffort when a concrete level is known, or run_workspace_action setup-effort with confirmation.',
344
+ preferredModelRoute: `Use ${agentHarnessModes('settings', 'get_setting', 'set_setting')} for provider.reasoningEffort when a concrete level is known, or mode:"run_workspace_action" setup-effort with confirmation.`,
341
345
  available: (context) => typeof context.openReasoningEffortPicker === 'function',
342
346
  open: (context) => {
343
347
  const surface = findSurfaceById('reasoning-effort-picker')!;
@@ -365,7 +369,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
365
369
  kind: 'picker',
366
370
  summary: 'Interactive streaming TTS provider picker opened from the Agent settings flow.',
367
371
  command: '/config tts.provider',
368
- preferredModelRoute: 'Use settings/get_setting/set_setting for tts.provider when a concrete provider id is known; use open_ui_surface only to visibly navigate.',
372
+ preferredModelRoute: `Use ${agentHarnessModes('settings', 'get_setting', 'set_setting')} for tts.provider when a concrete provider id is known; use mode:"open_ui_surface" only to visibly navigate.`,
369
373
  available: (context) => typeof context.openSelection === 'function' && Boolean(context.platform.voiceProviderRegistry),
370
374
  open: (context) => {
371
375
  const surface = findSurfaceById('tts-provider-picker')!;
@@ -380,7 +384,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
380
384
  kind: 'picker',
381
385
  summary: 'Interactive TTS voice picker opened from the Agent settings flow for the selected or supplied provider.',
382
386
  command: '/config tts.voice',
383
- preferredModelRoute: 'Use settings/get_setting/set_setting/reset_setting for tts.voice when a concrete voice id is known; use open_ui_surface only to visibly navigate.',
387
+ preferredModelRoute: `Use ${agentHarnessModes('settings', 'get_setting', 'set_setting', 'reset_setting')} for tts.voice when a concrete voice id is known; use mode:"open_ui_surface" only to visibly navigate.`,
384
388
  parameters: ['target'],
385
389
  available: (context) => typeof context.openSelection === 'function' && Boolean(context.platform.voiceService),
386
390
  open: async (context, args) => {
@@ -540,7 +544,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
540
544
  kind: 'overlay',
541
545
  summary: 'Slash-command autocomplete route opened by the same shell path as typing / in an empty prompt.',
542
546
  command: '/',
543
- preferredModelRoute: 'Use commands/command for model-readable command discovery and run_command for confirmed command execution.',
547
+ preferredModelRoute: `Use ${agentHarnessModes('commands', 'command')} for model-readable command discovery and mode:"run_command" for confirmed command execution.`,
544
548
  parameters: ['query', 'prefix', 'key'],
545
549
  available: (context) => typeof context.openSlashCommandMode === 'function',
546
550
  open: (context, args) => {
@@ -565,7 +569,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
565
569
  kind: 'picker',
566
570
  summary: 'Registry-driven searchable slash-command browser opened by /commands and /help.',
567
571
  command: '/commands',
568
- preferredModelRoute: 'Use commands/command for model-readable slash-command discovery and run_command for confirmed command execution.',
572
+ preferredModelRoute: `Use ${agentHarnessModes('commands', 'command')} for model-readable slash-command discovery and mode:"run_command" for confirmed command execution.`,
569
573
  available: (context) => typeof context.executeCommand === 'function',
570
574
  open: async (context) => {
571
575
  const surface = findSurfaceById('command-browser')!;
@@ -628,7 +632,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
628
632
  kind: 'overlay',
629
633
  summary: 'Registry-driven command and shortcut help overlay.',
630
634
  command: '/help',
631
- preferredModelRoute: 'Use commands/command and shortcuts modes for model-readable discovery.',
635
+ preferredModelRoute: `Use ${agentHarnessModes('commands', 'command', 'shortcuts')} for model-readable discovery.`,
632
636
  available: (context) => typeof context.openHelpOverlay === 'function',
633
637
  open: (context) => {
634
638
  const surface = findSurfaceById('help-overlay')!;
@@ -643,7 +647,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
643
647
  kind: 'overlay',
644
648
  summary: 'Keyboard shortcut reference overlay.',
645
649
  command: '/shortcuts',
646
- preferredModelRoute: 'Use shortcuts/keybindings modes for model-readable discovery, run_keybinding for supported shell-safe actions, and confirmed keybinding edits for binding changes.',
650
+ preferredModelRoute: `Use ${agentHarnessModes('shortcuts', 'keybindings')} for model-readable discovery, mode:"run_keybinding" for supported shell-safe actions, and confirmed keybinding edits for binding changes.`,
647
651
  available: (context) => typeof context.openShortcutsOverlay === 'function',
648
652
  open: (context) => {
649
653
  const surface = findSurfaceById('shortcuts-overlay')!;
@@ -658,7 +662,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
658
662
  kind: 'modal',
659
663
  summary: 'First-run and setup review wizard for Agent readiness.',
660
664
  command: '/setup',
661
- preferredModelRoute: 'Use workspace setup actions and settings modes for concrete model operation.',
665
+ preferredModelRoute: `Use ${agentHarnessModes('workspace_actions', 'settings')} for concrete setup operation.`,
662
666
  parameters: ['target=new|edit|reopen'],
663
667
  available: (context) => typeof context.openOnboardingWizard === 'function',
664
668
  open: (context, args) => {
@@ -0,0 +1,49 @@
1
+ import type { ToolRegistry } from '@pellux/goodvibes-sdk/platform/tools';
2
+ import type { ToolDefinition } from '@pellux/goodvibes-sdk/platform/types';
3
+
4
+ const DEFAULT_TOOL_DESCRIPTION_LIMIT = 120;
5
+
6
+ const TOOL_DESCRIPTION_OVERRIDES: Readonly<Record<string, string>> = {
7
+ agent_harness: 'Harness catalog/control. Start with mode:"modes"; inspect settings, commands, UI, status, tools, and confirmed effects.',
8
+ agent_knowledge: 'Read isolated Agent Knowledge.',
9
+ agent_knowledge_ingest: 'Ingest one confirmed source into isolated Agent Knowledge.',
10
+ agent_local_registry: 'Inspect or update Agent-local memory, notes, personas, skills, bundles, and routines.',
11
+ agent_work_plan: 'Inspect or update the visible Agent-local work plan.',
12
+ agent_operator_briefing: 'Read connected Agent operator state.',
13
+ agent_operator_action: 'Run one confirmed allowlisted operator action.',
14
+ agent_reminder_schedule: 'Schedule one confirmed Agent reminder.',
15
+ agent_channel_send: 'Send one confirmed message through one configured Agent target.',
16
+ agent_notify: 'Send one confirmed plain-text notification.',
17
+ agent_media_generate: 'Generate one confirmed image or video artifact.',
18
+ };
19
+
20
+ function compactText(value: string, limit: number): string {
21
+ const normalized = value.replace(/\s+/g, ' ').trim();
22
+ if (normalized.length <= limit) return normalized;
23
+ if (limit <= 3) return normalized.slice(0, limit);
24
+ return `${normalized.slice(0, limit - 3).trimEnd()}...`;
25
+ }
26
+
27
+ function stripSchemaDescriptions(value: unknown): unknown {
28
+ if (Array.isArray(value)) return value.map(stripSchemaDescriptions);
29
+ if (!value || typeof value !== 'object') return value;
30
+
31
+ const result: Record<string, unknown> = {};
32
+ for (const [key, entry] of Object.entries(value)) {
33
+ if (key === 'description') continue;
34
+ result[key] = stripSchemaDescriptions(entry);
35
+ }
36
+ return result;
37
+ }
38
+
39
+ function compactToolDefinition(definition: ToolDefinition): void {
40
+ definition.description = TOOL_DESCRIPTION_OVERRIDES[definition.name]
41
+ ?? compactText(definition.description, DEFAULT_TOOL_DESCRIPTION_LIMIT);
42
+ definition.parameters = stripSchemaDescriptions(definition.parameters) as Record<string, unknown>;
43
+ }
44
+
45
+ export function compactRegisteredToolDefinitions(toolRegistry: ToolRegistry): void {
46
+ for (const definition of toolRegistry.getToolDefinitions()) {
47
+ compactToolDefinition(definition);
48
+ }
49
+ }
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.0.34';
9
+ let _version = '1.0.35';
10
10
  let _sdkVersion = '0.33.36';
11
11
  try {
12
12
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8')) as {