@pellux/goodvibes-agent 1.0.33 → 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.
Files changed (63) hide show
  1. package/CHANGELOG.md +35 -4
  2. package/README.md +73 -59
  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 +49347 -50698
  6. package/docs/README.md +25 -21
  7. package/docs/channels-remote-and-api.md +2 -2
  8. package/docs/connected-host.md +3 -3
  9. package/docs/getting-started.md +89 -85
  10. package/docs/providers-and-routing.md +3 -3
  11. package/docs/release-and-publishing.md +3 -3
  12. package/docs/tools-and-commands.md +152 -138
  13. package/docs/voice-and-live-tts.md +1 -1
  14. package/package.json +1 -1
  15. package/release/live-verification/live-verification.json +13 -13
  16. package/release/live-verification/live-verification.md +17 -17
  17. package/release/release-notes.md +6 -15
  18. package/release/release-readiness.json +35 -35
  19. package/src/agent/harness-control.ts +42 -3
  20. package/src/runtime/bootstrap-core.ts +2 -0
  21. package/src/runtime/bootstrap.ts +12 -18
  22. package/src/tools/agent-analysis-registry-policy.ts +2 -9
  23. package/src/tools/agent-channel-send-tool.ts +1 -5
  24. package/src/tools/agent-context-policy.ts +1 -5
  25. package/src/tools/agent-find-policy.ts +1 -4
  26. package/src/tools/agent-harness-channel-metadata.ts +23 -23
  27. package/src/tools/agent-harness-cli-metadata.ts +4 -1
  28. package/src/tools/agent-harness-command-catalog.ts +10 -3
  29. package/src/tools/agent-harness-connected-host-status.ts +8 -2
  30. package/src/tools/agent-harness-delegation-posture.ts +5 -5
  31. package/src/tools/agent-harness-mcp-metadata.ts +30 -28
  32. package/src/tools/agent-harness-media-posture.ts +10 -10
  33. package/src/tools/agent-harness-metadata.ts +65 -35
  34. package/src/tools/agent-harness-mode-catalog.ts +205 -0
  35. package/src/tools/agent-harness-model-routing.ts +14 -14
  36. package/src/tools/agent-harness-model-tool-catalog.ts +7 -2
  37. package/src/tools/agent-harness-notification-metadata.ts +17 -17
  38. package/src/tools/agent-harness-operator-methods.ts +2 -2
  39. package/src/tools/agent-harness-pairing-posture.ts +7 -7
  40. package/src/tools/agent-harness-panel-metadata.ts +26 -12
  41. package/src/tools/agent-harness-provider-account-metadata.ts +33 -31
  42. package/src/tools/agent-harness-security-posture.ts +9 -7
  43. package/src/tools/agent-harness-service-posture.ts +22 -16
  44. package/src/tools/agent-harness-session-metadata.ts +9 -7
  45. package/src/tools/agent-harness-setup-posture.ts +7 -7
  46. package/src/tools/agent-harness-tool-schema.ts +2 -1
  47. package/src/tools/agent-harness-tool.ts +91 -38
  48. package/src/tools/agent-harness-ui-surface-metadata.ts +40 -28
  49. package/src/tools/agent-harness-workspace-actions.ts +29 -1
  50. package/src/tools/agent-knowledge-ingest-tool.ts +1 -5
  51. package/src/tools/agent-knowledge-tool.ts +1 -5
  52. package/src/tools/agent-local-registry-tool.ts +1 -4
  53. package/src/tools/agent-media-generate-tool.ts +1 -5
  54. package/src/tools/agent-notify-tool.ts +1 -5
  55. package/src/tools/agent-operator-action-tool.ts +1 -5
  56. package/src/tools/agent-operator-briefing-tool.ts +1 -5
  57. package/src/tools/agent-read-policy.ts +1 -4
  58. package/src/tools/agent-reminder-schedule-tool.ts +1 -5
  59. package/src/tools/agent-tool-policy-guard.ts +7 -34
  60. package/src/tools/agent-web-search-policy.ts +1 -4
  61. package/src/tools/agent-work-plan-tool.ts +1 -5
  62. package/src/tools/tool-definition-compaction.ts +49 -0
  63. package/src/version.ts +1 -1
@@ -28,14 +28,13 @@ import { describeHarnessSession, sessionCatalogStatus, sessionSummary } from './
28
28
  import { describeHarnessServiceEndpoint, servicePostureCatalogStatus, servicePostureSummary } from './agent-harness-service-posture.ts';
29
29
  import { describeHarnessSetupItem, setupPostureCatalogStatus, setupPostureSummary } from './agent-harness-setup-posture.ts';
30
30
  import { AGENT_HARNESS_MODES, AGENT_HARNESS_PARAMETER_PROPERTIES } from './agent-harness-tool-schema.ts';
31
+ import { describeHarnessMode, HARNESS_MODE_DESCRIPTORS, listHarnessModes, type AgentHarnessMode } from './agent-harness-mode-catalog.ts';
31
32
  import { describeHarnessUiSurface, listHarnessUiSurfaces, openHarnessUiSurface, totalHarnessUiSurfaces } from './agent-harness-ui-surface-metadata.ts';
32
33
  import { AGENT_WORKSPACE_CATEGORIES, allWorkspaceActions, buildWorkspaceEditorContext, createWorkspaceEditor, describeWorkspaceAction, describeWorkspaceCategory, describeWorkspaceEditor, listWorkspaceActions, resolveWorkspaceActionDetail } from './agent-harness-workspace-actions.ts';
33
34
  import { describeWorkspaceEditorModelExecution } from './agent-harness-workspace-editor-execution.ts';
34
35
  import { connectedHostSummary, describeConnectedHostCapability, settingsPolicySummary } from './agent-harness-metadata.ts';
35
36
  import { formatHarnessError, listHarnessSettings, resetHarnessSetting, resolveHarnessSetting, setHarnessSetting } from '../agent/harness-control.ts';
36
37
 
37
- type AgentHarnessMode = typeof AGENT_HARNESS_MODES[number];
38
-
39
38
  interface AgentHarnessToolArgs {
40
39
  readonly mode?: unknown;
41
40
  readonly query?: unknown;
@@ -127,6 +126,70 @@ function output(value: unknown): { readonly success: true; readonly output: stri
127
126
 
128
127
  function error(message: string): { readonly success: false; readonly error: string } { return { success: false, error: message }; }
129
128
 
129
+ function compactHarnessModeGuide(): Record<string, unknown> {
130
+ return {
131
+ discover: [
132
+ 'modes',
133
+ 'cli_commands', 'panels', 'ui_surfaces', 'shortcuts', 'keybindings',
134
+ 'commands', 'channels', 'notifications', 'provider_accounts', 'mcp_servers',
135
+ 'setup_posture', 'model_routing', 'pairing_posture', 'delegation_posture',
136
+ 'security_posture', 'support_bundles', 'media_posture', 'sessions',
137
+ 'settings', 'workspace', 'workspace_categories', 'workspace_actions',
138
+ 'tools', 'release_evidence', 'release_readiness', 'operator_methods',
139
+ 'service_posture', 'connected_host', 'daemon',
140
+ ],
141
+ inspect: [
142
+ 'mode',
143
+ 'cli_command', 'panel', 'ui_surface', 'keybinding', 'command', 'channel',
144
+ 'notification_target', 'provider_account', 'mcp_server', 'setup_item',
145
+ 'model_route', 'pairing_route', 'delegation_route', 'security_finding',
146
+ 'support_bundle', 'media_provider', 'session', 'get_setting',
147
+ 'workspace_action', 'tool', 'release_evidence_artifact',
148
+ 'release_readiness_item', 'operator_method', 'service_endpoint',
149
+ 'connected_host_capability', 'connected_host_status', 'daemon_status',
150
+ ],
151
+ effects: [
152
+ 'open_panel', 'open_ui_surface', 'run_keybinding', 'set_keybinding',
153
+ 'reset_keybinding', 'run_command', 'set_setting', 'reset_setting',
154
+ 'run_workspace_action',
155
+ ],
156
+ pattern: 'Use query|target for search, exact ids for inspect modes, and confirm:true plus explicitUserRequest for effects.',
157
+ };
158
+ }
159
+
160
+ function detailedHarnessModelAccessGuide(): Record<string, string> {
161
+ return {
162
+ cliCommands: 'List mode:"cli_commands"; inspect mode:"cli_command" with cliCommand|commandName|query. Discovery only.',
163
+ panels: 'List mode:"panels"; inspect mode:"panel"; navigate mode:"open_panel" with confirm:true and explicitUserRequest.',
164
+ uiSurfaces: 'List mode:"ui_surfaces"; inspect mode:"ui_surface"; navigate mode:"open_ui_surface" with confirmation.',
165
+ shortcuts: 'List mode:"shortcuts"; inspect mode:"keybinding"; run mode:"run_keybinding"; edit with set_keybinding/reset_keybinding and confirmation.',
166
+ slashCommands: 'List mode:"commands"; inspect mode:"command"; execute mode:"run_command" with confirmation.',
167
+ channels: 'List mode:"channels"; inspect mode:"channel"; deliver with agent_channel_send and confirmation.',
168
+ notifications: 'List mode:"notifications"; inspect mode:"notification_target"; deliver with agent_notify and confirmation.',
169
+ providerAccounts: 'List mode:"provider_accounts"; inspect mode:"provider_account"; auth changes stay confirmed workspace/command flows.',
170
+ mcpServers: 'List mode:"mcp_servers"; inspect mode:"mcp_server"; trust/server changes stay confirmed workspace/command flows.',
171
+ setupPosture: 'List mode:"setup_posture"; inspect mode:"setup_item"; setup mutations stay confirmed visible flows.',
172
+ modelRouting: 'List mode:"model_routing"; inspect mode:"model_route"; selection and provider edits stay confirmed visible flows.',
173
+ pairingPosture: 'List mode:"pairing_posture"; inspect mode:"pairing_route"; raw token/QR and pairing effects stay visible user flows.',
174
+ delegationPosture: 'List mode:"delegation_posture"; inspect mode:"delegation_route"; delegated submission stays confirmed visible flow.',
175
+ securityPosture: 'List mode:"security_posture"; inspect mode:"security_finding"; mutate only through confirmed security routes.',
176
+ supportBundles: 'List mode:"support_bundles"; inspect mode:"support_bundle"; export/import stays confirmation-gated.',
177
+ mediaPosture: 'List mode:"media_posture"; inspect mode:"media_provider"; generate with agent_media_generate and confirmation.',
178
+ sessions: 'List mode:"sessions"; inspect mode:"session"; save/resume/export/delete stays visible confirmed flow.',
179
+ workspace: 'List mode:"workspace" or mode:"workspace_categories"; actions via mode:"workspace_actions", mode:"workspace_action", and mode:"run_workspace_action"; includeParameters:true inlines editor schemas.',
180
+ settings: 'List mode:"settings" with category|prefix|query|includeHidden:true; mode:"get_setting", mode:"set_setting", and mode:"reset_setting" use key|target|query; writes require confirmation.',
181
+ tools: 'List mode:"tools" with query|limit|includeParameters:true; inspect mode:"tool" with toolName|target|query.',
182
+ modeCatalog: 'Search mode:"modes" with query|target; inspect one contract with mode:"mode" target:"...".',
183
+ releaseEvidence: 'List mode:"release_evidence"; inspect mode:"release_evidence_artifact"; includeParameters:true inlines artifact detail.',
184
+ releaseReadiness: 'List mode:"release_readiness"; inspect mode:"release_readiness_item"; includeParameters:true inlines item detail.',
185
+ operatorMethods: 'List mode:"operator_methods"; inspect mode:"operator_method"; execute only through the returned first-class tool.',
186
+ servicePosture: 'List mode:"service_posture"; inspect mode:"service_endpoint"; includeParameters:true adds probes and redacted log tail.',
187
+ connectedHost: 'Map mode:"connected_host"; inspect mode:"connected_host_capability"; no lifecycle control.',
188
+ connectedHostStatus: 'Live read-only mode:"connected_host_status" for host reachability, SDK compatibility, token posture, and Knowledge readiness.',
189
+ daemon: 'Daemon aliases route to mode:"connected_host" and mode:"connected_host_status"; lifecycle control is not exposed.',
190
+ };
191
+ }
192
+
130
193
  function requireConfirmedAction(args: AgentHarnessToolArgs, action: string): string | null {
131
194
  const explicitUserRequest = readString(args.explicitUserRequest);
132
195
  if (!explicitUserRequest) return `${action} requires explicitUserRequest with the user's exact request or a short faithful summary.`;
@@ -348,11 +411,7 @@ export function createAgentHarnessTool(deps: AgentHarnessToolDeps): Tool {
348
411
  return {
349
412
  definition: {
350
413
  name: 'agent_harness',
351
- description: [
352
- 'Inspect or operate the GoodVibes Agent harness.',
353
- 'Use summary for mode help.',
354
- 'Effects require confirm:true plus explicitUserRequest; no host lifecycle or raw secrets.',
355
- ].join(' '),
414
+ description: 'Inspect or operate GoodVibes Agent harness surfaces.',
356
415
  parameters: {
357
416
  type: 'object',
358
417
  properties: AGENT_HARNESS_PARAMETER_PROPERTIES,
@@ -368,6 +427,7 @@ export function createAgentHarnessTool(deps: AgentHarnessToolDeps): Tool {
368
427
  try {
369
428
  if (args.mode === 'summary') {
370
429
  return output({
430
+ harnessModes: HARNESS_MODE_DESCRIPTORS.length,
371
431
  cliCommands: totalHarnessCliCommands(),
372
432
  blockedCliCommandTokens: blockedHarnessCliCommandTokens(),
373
433
  panels: totalHarnessPanels(deps.commandContext),
@@ -407,38 +467,21 @@ export function createAgentHarnessTool(deps: AgentHarnessToolDeps): Tool {
407
467
  releaseReadiness: releaseReadinessInventoryStatus(),
408
468
  operatorMethods: operatorMethodCatalogStatus(),
409
469
  servicePosture: servicePostureCatalogStatus(),
410
- modelAccess: {
411
- cliCommands: 'List mode:"cli_commands"; inspect mode:"cli_command" with cliCommand|commandName|query. Discovery only.',
412
- panels: 'List mode:"panels"; inspect mode:"panel"; navigate mode:"open_panel" with confirm:true and explicitUserRequest.',
413
- uiSurfaces: 'List mode:"ui_surfaces"; inspect mode:"ui_surface"; navigate mode:"open_ui_surface" with confirmation.',
414
- shortcuts: 'List mode:"shortcuts"; inspect mode:"keybinding"; run mode:"run_keybinding"; edit with set_keybinding/reset_keybinding and confirmation.',
415
- slashCommands: 'List mode:"commands"; inspect mode:"command"; execute mode:"run_command" with confirmation.',
416
- channels: 'List mode:"channels"; inspect mode:"channel"; deliver with agent_channel_send and confirmation.',
417
- notifications: 'List mode:"notifications"; inspect mode:"notification_target"; deliver with agent_notify and confirmation.',
418
- providerAccounts: 'List mode:"provider_accounts"; inspect mode:"provider_account"; auth changes stay confirmed workspace/command flows.',
419
- mcpServers: 'List mode:"mcp_servers"; inspect mode:"mcp_server"; trust/server changes stay confirmed workspace/command flows.',
420
- setupPosture: 'List mode:"setup_posture"; inspect mode:"setup_item"; setup mutations stay confirmed visible flows.',
421
- modelRouting: 'List mode:"model_routing"; inspect mode:"model_route"; selection and provider edits stay confirmed visible flows.',
422
- pairingPosture: 'List mode:"pairing_posture"; inspect mode:"pairing_route"; raw token/QR and pairing effects stay visible user flows.',
423
- delegationPosture: 'List mode:"delegation_posture"; inspect mode:"delegation_route"; delegated submission stays confirmed visible flow.',
424
- securityPosture: 'List mode:"security_posture"; inspect mode:"security_finding"; mutate only through confirmed security routes.',
425
- supportBundles: 'List mode:"support_bundles"; inspect mode:"support_bundle"; export/import stays confirmation-gated.',
426
- mediaPosture: 'List mode:"media_posture"; inspect mode:"media_provider"; generate with agent_media_generate and confirmation.',
427
- sessions: 'List mode:"sessions"; inspect mode:"session"; save/resume/export/delete stays visible confirmed flow.',
428
- workspace: 'List mode:"workspace" or mode:"workspace_categories"; actions via workspace_actions/workspace_action/run_workspace_action; includeParameters:true inlines editor schemas.',
429
- settings: 'List mode:"settings" with category|prefix|query|includeHidden:true; get_setting/set_setting/reset_setting use key|target|query and confirmation for writes.',
430
- tools: 'List mode:"tools" with query|limit|includeParameters:true; inspect mode:"tool" with toolName|target|query.',
431
- releaseEvidence: 'List mode:"release_evidence"; inspect mode:"release_evidence_artifact"; includeParameters:true inlines artifact detail.',
432
- releaseReadiness: 'List mode:"release_readiness"; inspect mode:"release_readiness_item"; includeParameters:true inlines item detail.',
433
- operatorMethods: 'List mode:"operator_methods"; inspect mode:"operator_method"; execute only through the returned first-class tool.',
434
- servicePosture: 'List mode:"service_posture"; inspect mode:"service_endpoint"; includeParameters:true adds probes and redacted log tail.',
435
- connectedHost: 'Map mode:"connected_host"; inspect mode:"connected_host_capability"; no lifecycle control.',
436
- connectedHostStatus: 'Live read-only mode:"connected_host_status" for host reachability, SDK compatibility, token posture, and Knowledge readiness.',
437
- },
470
+ modeGuide: compactHarnessModeGuide(),
471
+ ...(args.includeParameters === true ? { modelAccess: detailedHarnessModelAccessGuide() } : {}),
438
472
  settingsPolicy: settingsPolicySummary(),
439
- connectedHost: connectedHostSummary(deps.commandContext, deps.toolRegistry),
473
+ connectedHost: connectedHostSummary(deps.commandContext, deps.toolRegistry, {
474
+ includeParameters: args.includeParameters === true,
475
+ }),
440
476
  });
441
477
  }
478
+ if (args.mode === 'modes') return output(listHarnessModes(args));
479
+ if (args.mode === 'mode') {
480
+ const mode = describeHarnessMode(args);
481
+ if (mode.status === 'ambiguous') return error(`Ambiguous harness mode ${String(mode.input)}. Candidates: ${JSON.stringify(mode.candidates)}`);
482
+ if (mode.status === 'missing_lookup') return error(String(mode.usage));
483
+ return output(mode.mode);
484
+ }
442
485
  if (args.mode === 'cli_commands') {
443
486
  const commands = listHarnessCliCommands(args);
444
487
  return output({
@@ -603,6 +646,8 @@ export function createAgentHarnessTool(deps: AgentHarnessToolDeps): Tool {
603
646
  query: readString(args.query) || undefined,
604
647
  includeHidden: args.includeHidden === true,
605
648
  limit: readLimit(args.limit, 100),
649
+ }, {
650
+ includeParameters: args.includeParameters === true,
606
651
  });
607
652
  return output({ settings, returned: settings.length, policy: settingsPolicySummary() });
608
653
  }
@@ -714,7 +759,11 @@ export function createAgentHarnessTool(deps: AgentHarnessToolDeps): Tool {
714
759
  if (resolved.status === 'ambiguous') return error(`Ambiguous service endpoint ${resolved.input}. Candidates: ${JSON.stringify(resolved.candidates)}`);
715
760
  return error(resolved.usage);
716
761
  }
717
- if (args.mode === 'connected_host') return output(connectedHostSummary(deps.commandContext, deps.toolRegistry));
762
+ if (args.mode === 'connected_host' || args.mode === 'daemon') {
763
+ return output(connectedHostSummary(deps.commandContext, deps.toolRegistry, {
764
+ includeParameters: args.includeParameters === true,
765
+ }));
766
+ }
718
767
  if (args.mode === 'connected_host_capability') {
719
768
  const query = readString(args.capabilityId || args.target || args.query);
720
769
  const resolved = describeConnectedHostCapability(deps.toolRegistry, query);
@@ -722,7 +771,11 @@ export function createAgentHarnessTool(deps: AgentHarnessToolDeps): Tool {
722
771
  if (resolved?.status === 'ambiguous') return error(`Ambiguous connected-host capability ${resolved.input}. Candidates: ${JSON.stringify(resolved.candidates)}`);
723
772
  return error(`Unknown connected-host capability ${query || '<missing>'}. Use mode:"connected_host" to inspect allowed and blocked capability ids.`);
724
773
  }
725
- if (args.mode === 'connected_host_status') return output(await connectedHostStatusSummary(deps.commandContext, deps.toolRegistry));
774
+ if (args.mode === 'connected_host_status' || args.mode === 'daemon_status') {
775
+ return output(await connectedHostStatusSummary(deps.commandContext, deps.toolRegistry, {
776
+ includeParameters: args.includeParameters === true,
777
+ }));
778
+ }
726
779
  return error(`Unhandled agent_harness mode: ${args.mode}`);
727
780
  } catch (err) {
728
781
  return error(formatHarnessError(err));
@@ -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;
@@ -11,6 +15,7 @@ export interface AgentHarnessUiSurfaceArgs {
11
15
  readonly target?: unknown;
12
16
  readonly key?: unknown;
13
17
  readonly prefix?: unknown;
18
+ readonly includeParameters?: unknown;
14
19
  readonly limit?: unknown;
15
20
  readonly pane?: unknown;
16
21
  }
@@ -162,7 +167,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
162
167
  kind: 'workspace',
163
168
  summary: 'Fullscreen operator workspace with setup, knowledge, local state, channels, automation, and delegation routes.',
164
169
  command: '/agent',
165
- 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.`,
166
171
  parameters: ['categoryId'],
167
172
  available: (context) => typeof context.openAgentWorkspace === 'function',
168
173
  open: (context, args) => {
@@ -179,7 +184,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
179
184
  kind: 'picker',
180
185
  summary: 'Keyboard-accessible operator panel route that now opens the Agent Workspace home surface.',
181
186
  command: 'Ctrl+P',
182
- 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.`,
183
188
  available: (context) => typeof context.openPanelPicker === 'function' || typeof context.openAgentWorkspace === 'function',
184
189
  open: (context) => {
185
190
  const surface = findSurfaceById('panel-picker')!;
@@ -196,7 +201,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
196
201
  kind: 'workspace',
197
202
  summary: 'Security review operator surface for token posture, MCP attack paths, policy posture, and plugin risk.',
198
203
  command: '/security',
199
- 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.`,
200
205
  parameters: ['pane'],
201
206
  available: (context) => (
202
207
  typeof context.openAgentWorkspace === 'function'
@@ -218,7 +223,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
218
223
  kind: 'workspace',
219
224
  summary: 'Agent Knowledge operator surface for isolated status, source/node/issue libraries, item lookup, map review, connectors, ask/search, and ingest forms.',
220
225
  command: '/knowledge',
221
- 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.`,
222
227
  parameters: ['pane'],
223
228
  available: (context) => (
224
229
  typeof context.openAgentWorkspace === 'function'
@@ -240,7 +245,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
240
245
  kind: 'workspace',
241
246
  summary: 'Provider subscription operator surface for subscription review, provider inspection, login, logout, and bundle flows.',
242
247
  command: '/subscription',
243
- 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.`,
244
249
  parameters: ['pane'],
245
250
  available: (context) => (
246
251
  typeof context.openAgentWorkspace === 'function'
@@ -262,7 +267,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
262
267
  kind: 'modal',
263
268
  summary: 'Fullscreen settings workspace for Agent-owned configuration, subscriptions, secrets, MCP, tools, and surface settings.',
264
269
  command: '/settings',
265
- 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.`,
266
271
  parameters: ['target', 'key', 'prefix'],
267
272
  available: (context) => typeof context.openSettingsModal === 'function',
268
273
  open: (context, args) => {
@@ -279,7 +284,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
279
284
  kind: 'workspace',
280
285
  summary: 'MCP server setup, trust posture, and tool inventory workspace.',
281
286
  command: '/mcp',
282
- preferredModelRoute: 'Use workspace_actions, tools, and settings modes for model operation.',
287
+ preferredModelRoute: `Use ${agentHarnessModes('workspace_actions', 'tools', 'settings')} for model operation.`,
283
288
  available: (context) => typeof context.openMcpWorkspace === 'function',
284
289
  open: (context) => {
285
290
  const surface = findSurfaceById('mcp-workspace')!;
@@ -294,7 +299,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
294
299
  kind: 'picker',
295
300
  summary: 'Interactive model picker for main, helper, tool, and TTS model routes.',
296
301
  command: '/model',
297
- 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.`,
298
303
  parameters: ['target'],
299
304
  available: (context) => typeof context.openModelPicker === 'function' || typeof context.openModelPickerWithTarget === 'function',
300
305
  open: (context, args) => {
@@ -315,7 +320,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
315
320
  kind: 'picker',
316
321
  summary: 'Interactive provider picker for model route setup.',
317
322
  command: '/provider',
318
- 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.`,
319
324
  parameters: ['target'],
320
325
  available: (context) => typeof context.openProviderPicker === 'function' || typeof context.openProviderModelPickerWithTarget === 'function',
321
326
  open: (context, args) => {
@@ -336,7 +341,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
336
341
  kind: 'picker',
337
342
  summary: 'Interactive reasoning-effort selector for the current main chat model when that model exposes effort levels.',
338
343
  command: '/effort',
339
- 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.`,
340
345
  available: (context) => typeof context.openReasoningEffortPicker === 'function',
341
346
  open: (context) => {
342
347
  const surface = findSurfaceById('reasoning-effort-picker')!;
@@ -364,7 +369,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
364
369
  kind: 'picker',
365
370
  summary: 'Interactive streaming TTS provider picker opened from the Agent settings flow.',
366
371
  command: '/config tts.provider',
367
- 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.`,
368
373
  available: (context) => typeof context.openSelection === 'function' && Boolean(context.platform.voiceProviderRegistry),
369
374
  open: (context) => {
370
375
  const surface = findSurfaceById('tts-provider-picker')!;
@@ -379,7 +384,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
379
384
  kind: 'picker',
380
385
  summary: 'Interactive TTS voice picker opened from the Agent settings flow for the selected or supplied provider.',
381
386
  command: '/config tts.voice',
382
- 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.`,
383
388
  parameters: ['target'],
384
389
  available: (context) => typeof context.openSelection === 'function' && Boolean(context.platform.voiceService),
385
390
  open: async (context, args) => {
@@ -539,7 +544,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
539
544
  kind: 'overlay',
540
545
  summary: 'Slash-command autocomplete route opened by the same shell path as typing / in an empty prompt.',
541
546
  command: '/',
542
- 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.`,
543
548
  parameters: ['query', 'prefix', 'key'],
544
549
  available: (context) => typeof context.openSlashCommandMode === 'function',
545
550
  open: (context, args) => {
@@ -564,7 +569,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
564
569
  kind: 'picker',
565
570
  summary: 'Registry-driven searchable slash-command browser opened by /commands and /help.',
566
571
  command: '/commands',
567
- 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.`,
568
573
  available: (context) => typeof context.executeCommand === 'function',
569
574
  open: async (context) => {
570
575
  const surface = findSurfaceById('command-browser')!;
@@ -627,7 +632,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
627
632
  kind: 'overlay',
628
633
  summary: 'Registry-driven command and shortcut help overlay.',
629
634
  command: '/help',
630
- preferredModelRoute: 'Use commands/command and shortcuts modes for model-readable discovery.',
635
+ preferredModelRoute: `Use ${agentHarnessModes('commands', 'command', 'shortcuts')} for model-readable discovery.`,
631
636
  available: (context) => typeof context.openHelpOverlay === 'function',
632
637
  open: (context) => {
633
638
  const surface = findSurfaceById('help-overlay')!;
@@ -642,7 +647,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
642
647
  kind: 'overlay',
643
648
  summary: 'Keyboard shortcut reference overlay.',
644
649
  command: '/shortcuts',
645
- 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.`,
646
651
  available: (context) => typeof context.openShortcutsOverlay === 'function',
647
652
  open: (context) => {
648
653
  const surface = findSurfaceById('shortcuts-overlay')!;
@@ -657,7 +662,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
657
662
  kind: 'modal',
658
663
  summary: 'First-run and setup review wizard for Agent readiness.',
659
664
  command: '/setup',
660
- preferredModelRoute: 'Use workspace setup actions and settings modes for concrete model operation.',
665
+ preferredModelRoute: `Use ${agentHarnessModes('workspace_actions', 'settings')} for concrete setup operation.`,
661
666
  parameters: ['target=new|edit|reopen'],
662
667
  available: (context) => typeof context.openOnboardingWizard === 'function',
663
668
  open: (context, args) => {
@@ -727,22 +732,28 @@ function resolveHarnessUiSurface(args: AgentHarnessUiSurfaceArgs): UiSurfaceReso
727
732
  return null;
728
733
  }
729
734
 
730
- function describeSurface(context: CommandContext, surface: UiSurfaceDefinition, lookup?: UiSurfaceLookup): Record<string, unknown> {
735
+ function describeSurface(
736
+ context: CommandContext,
737
+ surface: UiSurfaceDefinition,
738
+ options: { readonly includeParameters?: boolean; readonly lookup?: UiSurfaceLookup } = {},
739
+ ): Record<string, unknown> {
731
740
  return {
732
741
  id: surface.id,
733
742
  label: surface.label,
734
743
  kind: surface.kind,
735
744
  summary: surface.summary,
736
745
  command: surface.command,
737
- ...(lookup ? { lookup } : {}),
746
+ ...(options.lookup ? { lookup: options.lookup } : {}),
738
747
  preferredModelRoute: surface.preferredModelRoute,
739
- parameters: surface.parameters ?? [],
740
748
  available: surface.available(context),
741
- policy: {
742
- effect: 'visible-ui-navigation',
743
- confirmation: 'agent_harness mode:"open_ui_surface" requires confirm:true and explicitUserRequest.',
744
- boundary: 'UI surface routing opens the same visible Agent shell surface the user can open. Use first-class model tools, settings modes, workspace actions, or confirmed slash-command mirrors for actual operations.',
745
- },
749
+ ...(options.includeParameters ? {
750
+ parameters: surface.parameters ?? [],
751
+ policy: {
752
+ effect: 'visible-ui-navigation',
753
+ confirmation: 'agent_harness mode:"open_ui_surface" requires confirm:true and explicitUserRequest.',
754
+ boundary: 'UI surface routing opens the same visible Agent shell surface the user can open. Use first-class model tools, settings modes, workspace actions, or confirmed slash-command mirrors for actual operations.',
755
+ },
756
+ } : {}),
746
757
  };
747
758
  }
748
759
 
@@ -753,15 +764,16 @@ export function totalHarnessUiSurfaces(): number {
753
764
  export function listHarnessUiSurfaces(context: CommandContext, args: AgentHarnessUiSurfaceArgs): readonly Record<string, unknown>[] {
754
765
  const query = readString(args.query);
755
766
  const limit = readLimit(args.limit, 200);
767
+ const includeParameters = args.includeParameters === true;
756
768
  return UI_SURFACES
757
- .map((surface) => describeSurface(context, surface))
769
+ .map((surface) => describeSurface(context, surface, { includeParameters }))
758
770
  .filter((surface) => surfaceMatches(surface, query))
759
771
  .slice(0, limit);
760
772
  }
761
773
 
762
774
  export function describeHarnessUiSurface(context: CommandContext, args: AgentHarnessUiSurfaceArgs): Record<string, unknown> | null {
763
775
  const resolved = resolveHarnessUiSurface(args);
764
- if (resolved?.status === 'found') return describeSurface(context, resolved.surface, resolved.lookup);
776
+ if (resolved?.status === 'found') return describeSurface(context, resolved.surface, { includeParameters: true, lookup: resolved.lookup });
765
777
  if (resolved?.status === 'ambiguous') {
766
778
  return { status: 'ambiguous', input: resolved.input, candidates: resolved.candidates };
767
779
  }
@@ -783,6 +795,6 @@ export async function openHarnessUiSurface(context: CommandContext, args: AgentH
783
795
  const routed = await resolved.surface.open(context, args);
784
796
  return {
785
797
  ...routed,
786
- descriptor: describeSurface(context, resolved.surface, resolved.lookup),
798
+ descriptor: describeSurface(context, resolved.surface, { includeParameters: true, lookup: resolved.lookup }),
787
799
  };
788
800
  }
@@ -97,6 +97,11 @@ export function describeWorkspaceEditor(editor: AgentWorkspaceLocalEditor): Reco
97
97
  };
98
98
  }
99
99
 
100
+ function previewText(value: string, maxLength = 120): string {
101
+ const normalized = value.replace(/\s+/g, ' ').trim();
102
+ return normalized.length <= maxLength ? normalized : `${normalized.slice(0, maxLength - 1).trimEnd()}...`;
103
+ }
104
+
100
105
  function selectedRoutineFromArgs(
101
106
  snapshot: AgentWorkspaceRuntimeSnapshot,
102
107
  args: AgentHarnessWorkspaceActionArgs,
@@ -163,6 +168,27 @@ export function describeWorkspaceAction(
163
168
  };
164
169
  }
165
170
 
171
+ function describeWorkspaceActionSummary(
172
+ category: AgentWorkspaceCategory,
173
+ action: AgentWorkspaceAction,
174
+ ): Record<string, unknown> {
175
+ return {
176
+ id: action.id,
177
+ categoryId: category.id,
178
+ category: category.label,
179
+ group: category.group,
180
+ label: action.label,
181
+ summary: previewText(action.detail),
182
+ kind: action.kind,
183
+ safety: action.safety,
184
+ ...(action.command ? { command: action.command } : {}),
185
+ ...(action.targetCategoryId ? { targetCategoryId: action.targetCategoryId } : {}),
186
+ ...(action.editorKind ? { editorKind: action.editorKind } : {}),
187
+ ...(action.localKind ? { localKind: action.localKind } : {}),
188
+ ...(action.localOperation ? { localOperation: action.localOperation } : {}),
189
+ };
190
+ }
191
+
166
192
  export function listWorkspaceActions(
167
193
  context: CommandContext,
168
194
  args: AgentHarnessWorkspaceActionArgs,
@@ -178,7 +204,9 @@ export function listWorkspaceActions(
178
204
  return source
179
205
  .filter((entry) => !categoryId || entry.category.id === categoryId)
180
206
  .slice(0, limit)
181
- .map((entry) => describeWorkspaceAction(entry.category, entry.action, { includeEditor, editorContext }));
207
+ .map((entry) => includeEditor
208
+ ? describeWorkspaceAction(entry.category, entry.action, { includeEditor, editorContext })
209
+ : describeWorkspaceActionSummary(entry.category, entry.action));
182
210
  }
183
211
 
184
212
  function workspaceActionLookupFromArgs(args: AgentHarnessWorkspaceActionArgs): { readonly source: WorkspaceActionLookup['source']; readonly input: string } | null {
@@ -261,11 +261,7 @@ export function createAgentKnowledgeIngestTool(
261
261
  return {
262
262
  definition: {
263
263
  name: 'agent_knowledge_ingest',
264
- description: [
265
- 'Ingest one confirmed source into isolated Agent Knowledge.',
266
- 'Use only for explicit ingest/import requests.',
267
- 'Supports URL, file, bookmark, history, and connector sources.',
268
- ].join(' '),
264
+ description: 'Ingest one confirmed source into isolated Agent Knowledge.',
269
265
  parameters: {
270
266
  type: 'object',
271
267
  properties: {
@@ -123,11 +123,7 @@ export function createAgentKnowledgeTool(
123
123
  return {
124
124
  definition: {
125
125
  name: 'agent_knowledge',
126
- description: [
127
- 'Read isolated Agent Knowledge.',
128
- 'Use for status, ask/search, source/node/issue lists, item lookup, map summary, and connector inspection.',
129
- 'Read-only.',
130
- ].join(' '),
126
+ description: 'Read isolated Agent Knowledge.',
131
127
  parameters: {
132
128
  type: 'object',
133
129
  properties: {
@@ -735,10 +735,7 @@ export function createAgentLocalRegistryTool(shellPaths: ShellPathService, memor
735
735
  return {
736
736
  definition: {
737
737
  name: 'agent_local_registry',
738
- description: [
739
- 'Inspect or update Agent-local records: memory, notes, personas, skills, bundles, and routines.',
740
- 'Deletion requires confirm:true plus explicitUserRequest.',
741
- ].join(' '),
738
+ description: 'Inspect or update Agent-local records.',
742
739
  parameters: {
743
740
  type: 'object',
744
741
  properties: {
@@ -52,11 +52,7 @@ export function createAgentMediaGenerateTool(
52
52
  return {
53
53
  definition: {
54
54
  name: 'agent_media_generate',
55
- description: [
56
- 'Generate one confirmed image or video artifact.',
57
- 'Use only for explicit media generation requests.',
58
- 'Returns artifact ids, not inline base64.',
59
- ].join(' '),
55
+ description: 'Generate one confirmed image or video artifact.',
60
56
  parameters: {
61
57
  type: 'object',
62
58
  properties: {
@@ -78,11 +78,7 @@ export function createAgentNotifyTool(
78
78
  return {
79
79
  definition: {
80
80
  name: 'agent_notify',
81
- description: [
82
- 'Send one confirmed plain-text notification.',
83
- 'Use only for explicit notify/message/alert requests.',
84
- 'Uses existing targets only.',
85
- ].join(' '),
81
+ description: 'Send one confirmed plain-text notification.',
86
82
  parameters: {
87
83
  type: 'object',
88
84
  properties: {
@@ -35,11 +35,7 @@ export function createAgentOperatorActionTool(
35
35
  return {
36
36
  definition: {
37
37
  name: 'agent_operator_action',
38
- description: [
39
- 'Run one confirmed allowlisted operator action.',
40
- 'Use only for explicit approval, automation, or schedule requests.',
41
- 'No automation definition edits or host lifecycle.',
42
- ].join(' '),
38
+ description: 'Run one confirmed allowlisted operator action.',
43
39
  parameters: {
44
40
  type: 'object',
45
41
  properties: {
@@ -175,11 +175,7 @@ export function createAgentOperatorBriefingTool(
175
175
  return {
176
176
  definition: {
177
177
  name: 'agent_operator_briefing',
178
- description: [
179
- 'Read connected Agent operator state for a concise briefing.',
180
- 'Use for pending attention, approvals, automation, schedules, or status.',
181
- 'Read-only.',
182
- ].join(' '),
178
+ description: 'Read connected Agent operator state for a concise briefing.',
183
179
  parameters: {
184
180
  type: 'object',
185
181
  properties: {},
@@ -126,10 +126,7 @@ export function isBlockedReadPath(path: string): boolean {
126
126
  }
127
127
 
128
128
  function narrowReadToolDefinitionForAgentPolicy(tool: Tool): void {
129
- tool.definition.description = [
130
- 'Read ordinary project files for GoodVibes Agent with bounded, non-secret, main-conversation policy.',
131
- 'Hidden paths, secret-looking files, broad batches, unoptimized image extraction, and oversized image reads are disabled.',
132
- ].join(' ');
129
+ tool.definition.description = 'Read ordinary non-secret project files for GoodVibes Agent.';
133
130
  tool.definition.sideEffects = ['read_fs'];
134
131
  tool.definition.concurrency = 'serial';
135
132
 
@@ -120,11 +120,7 @@ export function createAgentReminderScheduleTool(
120
120
  return {
121
121
  definition: {
122
122
  name: 'agent_reminder_schedule',
123
- description: [
124
- 'Schedule one confirmed GoodVibes Agent reminder.',
125
- 'Use only for an explicit reminder request.',
126
- 'No host lifecycle, background job, or Knowledge write.',
127
- ].join(' '),
123
+ description: 'Schedule one confirmed GoodVibes Agent reminder.',
128
124
  parameters: {
129
125
  type: 'object',
130
126
  properties: {