@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
@@ -39,6 +39,7 @@ import { registerAgentOperatorActionTool } from '../tools/agent-operator-action-
39
39
  import { registerAgentOperatorBriefingTool } from '../tools/agent-operator-briefing-tool.ts';
40
40
  import { registerAgentReminderScheduleTool } from '../tools/agent-reminder-schedule-tool.ts';
41
41
  import { registerAgentWorkPlanTool } from '../tools/agent-work-plan-tool.ts';
42
+ import { compactRegisteredToolDefinitions } from '../tools/tool-definition-compaction.ts';
42
43
  import { GOODVIBES_AGENT_SURFACE_ROOT } from '../config/surface.ts';
43
44
  import { registerAgentRuntimeEvents } from './agent-runtime-events.ts';
44
45
 
@@ -249,6 +250,7 @@ export async function initializeBootstrapCore(
249
250
  installAgentToolPolicyGuard(toolRegistry, {
250
251
  getLastUserMessage: () => conversation.getLastUserMessage(),
251
252
  });
253
+ compactRegisteredToolDefinitions(toolRegistry);
252
254
  services.agentOrchestrator.setDependencies({
253
255
  surfaceRoot: GOODVIBES_AGENT_SURFACE_ROOT,
254
256
  fileCache,
@@ -43,27 +43,20 @@ import { buildEnabledSkillsPrompt } from '../agent/skill-registry.ts';
43
43
  import { buildEnabledRoutinesPrompt } from '../agent/routine-registry.ts';
44
44
  import { buildReviewedMemoryPrompt } from '../agent/memory-prompt.ts';
45
45
  import { registerAgentHarnessTool } from '../tools/agent-harness-tool.ts';
46
+ import { compactRegisteredToolDefinitions } from '../tools/tool-definition-compaction.ts';
46
47
 
47
48
  const GOODVIBES_AGENT_OPERATOR_POLICY = [
48
49
  '## GoodVibes Agent Operator Policy',
49
- '- Default to serial, proactive assistant work in the main conversation. Answer, inspect, summarize, remember useful non-secret facts, configure Agent-local state, use read-only connected-host/operator routes, and take safe non-destructive actions without creating separate Agent jobs or GoodVibes TUI delegations.',
50
- '- GoodVibes Agent connects to a GoodVibes host owned outside this package. Do not start, stop, restart, install, expose, or mutate connected-host network/listener posture from Agent.',
51
- '- Use the `agent_operator_briefing` tool for read-only main-conversation summaries of connected work plan, approvals, automation, schedules, and scheduler capacity. This tool must not call mutation routes, connected-host lifecycle routes, default knowledge, non-Agent knowledge spaces, separate Agent job creation, or GoodVibes TUI delegation.',
52
- '- When the user explicitly asks Agent to approve, deny, or cancel a specific approval, run/pause/resume a specific automation job, cancel/retry a specific automation run, or run a specific schedule, use the `agent_operator_action` tool with confirm:true and the original user request. It can call only its allowlisted public operator routes and must not create, edit, delete, or discover automation definitions.',
53
- '- Use the `agent_work_plan` tool to keep the visible Agent-local work plan current while working in the main conversation. Create, inspect, and update local work items proactively when useful. Removing items or clearing completed items requires an explicit user request and confirm:true.',
54
- '- Use the `agent_harness` tool to inspect and operate the harness surface itself: Agent workspace action catalog, slash command catalog, model tool catalog, release evidence bundle, release readiness inventory, connected-host posture, and Agent settings. Use it to change Agent settings, invoke workspace action mirrors, or invoke slash-command mirrors only when the user explicitly asks; preserve confirm:true and explicitUserRequest for mutations, keep secret-backed settings in the secret manager, and keep connected-host lifecycle/posture externally owned.',
55
- '- Use the `agent_knowledge` tool for Agent Knowledge status, ask, search, source/node/issue lists, item lookup, map summary, connector list/detail, and connector doctor from the main conversation. It must use only /api/goodvibes-agent/knowledge/* and must fail closed instead of falling back to default knowledge or non-Agent knowledge spaces.',
56
- '- When the user explicitly asks Agent to add, import, remember, or ingest a URL, URL-list file, local file, bookmarks file, browser history, or connector input into Agent Knowledge, use the `agent_knowledge_ingest` tool with confirm:true and the original user request. It must write only to /api/goodvibes-agent/knowledge/* ingest routes and never to default knowledge or non-Agent knowledge spaces.',
57
- '- Use the `agent_local_registry` tool when a scratchpad note, durable memory, reusable persona, skill, skill bundle, or routine would improve later work. Keep those records Agent-local, non-secret, source/provenance tagged, and reviewable. Notes are for temporary/source-triage context; promote them explicitly into memory, skills, personas, routines, or Agent Knowledge only when that is the correct durable home. Review memory with a confidence score when it should shape later turns. Starting a routine means applying its steps in this same serial conversation, not creating a background job.',
58
- '- When the user explicitly asks Agent to generate an image, video, or other media artifact, use the `agent_media_generate` tool with confirm:true and the original user request. Generated media is stored as artifacts; do not print base64, call default knowledge, use non-Agent knowledge spaces, send channels, create separate Agent jobs, or request GoodVibes TUI delegation for media generation.',
59
- '- When the user explicitly asks Agent to send an alert, message, or notification to configured notification targets, use the `agent_notify` tool with confirm:true and the original user request. Do not infer external notifications from vague suggestions, and never create channel routes or account authorizations from the main conversation.',
60
- '- When the user explicitly asks Agent to send one message to a specific configured channel, route, webhook, or link target, use the `agent_channel_send` tool with confirm:true and the original user request. It can deliver one message through configured delivery strategies, but must not create routes, authorize accounts, manage connected-host hosting, use default knowledge, use non-Agent knowledge spaces, create separate Agent jobs, or request GoodVibes TUI delegation.',
61
- '- When the user explicitly asks for a reminder or asks Agent to schedule a reminder, use the `agent_reminder_schedule` tool with confirm:true and the original user request. That creates one connected schedules.create reminder on the external GoodVibes host. Do not infer reminders from vague suggestions or routine startup, and never create local scheduler jobs.',
62
- '- GoodVibes TUI delegation is never the default Agent reasoning path. Do not delegate planning, research, operations, knowledge, memory, configuration, approvals, automation observability, or ordinary assistant work.',
63
- '- GoodVibes Agent is not the coding TUI. Do not use the `agent` tool to create coding-role Agent jobs or batch job roots from Agent.',
64
- '- When the user explicitly asks to build, implement, fix, patch, or review code, preserve the full original user ask and delegate one build request to GoodVibes TUI through the public shared-session/build-delegation contract. Include clear executionIntent and request delegated review only for explicit build/fix/review work or when the user explicitly asks for delegated Agent review.',
65
- '- Do not narrow explicit build/fix/review requests into design-only, read-only, or no-write work unless the user explicitly requested that limitation. TUI owns file edits, git/worktree work, execution isolation UX, and delegated review coordination.',
66
- '- If a stable public delegation route is unavailable, say that the task needs GoodVibes TUI delegation and report the missing route instead of pretending to implement it locally or creating sibling Agent jobs.',
50
+ '- Work serially in the main conversation by default: answer, inspect, summarize, remember useful non-secret facts, configure Agent-local state, and use safe read-only connected-host/operator routes.',
51
+ '- Connected-host lifecycle is external. Do not start, stop, restart, install, expose, or mutate host listeners/network posture from Agent.',
52
+ '- Read tools: `agent_operator_briefing` for connected work/approvals/automation/schedules, `agent_knowledge` for isolated Agent Knowledge, `agent_harness` for harness catalogs/settings/status.',
53
+ '- State tools: `agent_work_plan` for visible local work items; `agent_local_registry` for Agent-local notes, memory, personas, skills, bundles, and routines. Keep records non-secret, sourced, and reviewable.',
54
+ '- Confirmed tools: use `agent_operator_action`, `agent_knowledge_ingest`, `agent_media_generate`, `agent_notify`, `agent_channel_send`, and `agent_reminder_schedule` only for explicit user requests with confirm:true and explicitUserRequest.',
55
+ '- Agent Knowledge must use only `/api/goodvibes-agent/knowledge/*` and fail closed. Do not use default knowledge or non-Agent knowledge spaces.',
56
+ '- External delivery, media generation, reminders, settings writes, slash-command mirrors, workspace action mirrors, and destructive local changes require explicit user intent and the owning tool/command confirmation.',
57
+ '- Routines run in this serial conversation unless explicitly promoted to a connected schedule. Do not create hidden Agent jobs or local scheduler jobs.',
58
+ '- Do not delegate planning, research, operations, knowledge, memory, configuration, approvals, observability, or ordinary assistant work.',
59
+ '- For explicit build, implement, fix, patch, or review requests, preserve the full original ask and use the public shared-session/build-delegation route. If that route is unavailable, report the missing route instead of pretending to perform the work locally.',
67
60
  ].join('\n');
68
61
 
69
62
  function joinPromptParts(...parts: Array<string | null | undefined>): string {
@@ -288,6 +281,7 @@ export async function bootstrapRuntime(
288
281
  const commandContext = shell.commandContext;
289
282
  const inputHistory = shell.inputHistory;
290
283
  registerAgentHarnessTool(toolRegistry, commandRegistry, commandContext);
284
+ compactRegisteredToolDefinitions(toolRegistry);
291
285
  const pluginCommandRegistry = {
292
286
  register(command: {
293
287
  readonly name: string;
@@ -82,11 +82,7 @@ export function validateRegistryToolInvocationForAgentPolicy(args: RegistryToolA
82
82
  }
83
83
 
84
84
  function narrowAnalyzeToolDefinitionForAgentPolicy(tool: Tool): void {
85
- tool.definition.description = [
86
- 'Run local, static project analysis for GoodVibes Agent.',
87
- 'npm registry upgrade checks and hidden secondary LLM diff analysis are disabled in the main conversation.',
88
- 'Delegate package-upgrade and review workflows to GoodVibes TUI when they become build/fix/review work.',
89
- ].join(' ');
85
+ tool.definition.description = 'Run local, static project analysis for GoodVibes Agent.';
90
86
  tool.definition.sideEffects = ['read_fs'];
91
87
 
92
88
  const properties = tool.definition.parameters.properties;
@@ -101,10 +97,7 @@ function narrowAnalyzeToolDefinitionForAgentPolicy(tool: Tool): void {
101
97
  }
102
98
 
103
99
  function narrowRegistryToolDefinitionForAgentPolicy(tool: Tool): void {
104
- tool.definition.description = [
105
- 'Discover and preview GoodVibes Agent skills, agents, and tools.',
106
- 'Full content materialization and arbitrary .goodvibes file reads are disabled in the main conversation.',
107
- ].join(' ');
100
+ tool.definition.description = 'Discover and preview GoodVibes Agent registry entries.';
108
101
  tool.definition.sideEffects = ['read_fs'];
109
102
 
110
103
  const properties = tool.definition.parameters.properties;
@@ -41,11 +41,7 @@ export function createAgentChannelSendTool(
41
41
  return {
42
42
  definition: {
43
43
  name: 'agent_channel_send',
44
- description: [
45
- 'Send one confirmed message through a configured Agent target.',
46
- 'Use only for explicit send/message/alert requests.',
47
- 'Provide exactly one target.',
48
- ].join(' '),
44
+ description: 'Send one confirmed message through one configured Agent target.',
49
45
  parameters: {
50
46
  type: 'object',
51
47
  properties: {
@@ -7,11 +7,7 @@ const CONTEXT_TOOL_DENIAL = [
7
7
  ].join(' ');
8
8
 
9
9
  export function wrapBlockedContextToolForAgentPolicy(tool: Tool): void {
10
- tool.definition.description = [
11
- 'Blocked in GoodVibes Agent main conversation: non-Agent runtime context.',
12
- 'Use explicit Agent CLI/slash status, compat, setup, and Agent Knowledge commands for product-scoped context.',
13
- 'Default knowledge, non-Agent knowledge segments, and non-Agent runtime assumptions are not Agent fallbacks.',
14
- ].join(' ');
10
+ tool.definition.description = 'Blocked in GoodVibes Agent: non-Agent runtime context.';
15
11
  tool.definition.sideEffects = [];
16
12
  tool.definition.parameters = {
17
13
  type: 'object',
@@ -82,10 +82,7 @@ export function normalizeFindToolInvocationForAgentPolicy(args: FindToolArgs): F
82
82
  }
83
83
 
84
84
  function narrowFindToolDefinitionForAgentPolicy(tool: Tool): void {
85
- tool.definition.description = [
86
- 'Search the project for GoodVibes Agent using serial, gitignore-respecting read-only queries.',
87
- 'Hidden-file scans, symlink traversal, gitignore bypass, broad previews, full symbol dumps, and parallel search are disabled in the main conversation.',
88
- ].join(' ');
85
+ tool.definition.description = 'Search project files with serial, gitignore-respecting read-only queries.';
89
86
  tool.definition.sideEffects = ['read_fs'];
90
87
  tool.definition.concurrency = 'serial';
91
88
 
@@ -83,31 +83,31 @@ function describeChannel(
83
83
  defaultTargetKeys: channel.defaultTargetKeys,
84
84
  configuredDefaultTargetKeys: channel.configuredDefaultTargetKeys,
85
85
  ...(options.lookup ? { lookup: options.lookup } : {}),
86
- policy: {
87
- effect: 'read-only',
88
- values: 'Config key names and target key names are shown; secret values and stored target values are never returned.',
89
- delivery: 'Use agent_channel_send only for one explicit, confirmed delivery target requested by the user.',
90
- setup: 'Use connected-host setup/account/policy routes only as read-only diagnostics unless another confirmed first-class tool owns the mutation.',
91
- },
92
- modelAccess: {
93
- sendTool: 'agent_channel_send',
94
- notificationTool: 'agent_notify',
95
- reminderTool: 'agent_reminder_schedule',
96
- slashCommandDetail: `/channels show ${channel.id}`,
97
- readOnlyConnectedRoutes: [
98
- '/channels accounts',
99
- '/channels policies',
100
- '/channels status',
101
- `/channels doctor ${channel.id}`,
102
- `/channels setup ${channel.id}`,
103
- ],
104
- settingsFilter: `agent_harness mode:"settings" prefix:"surfaces.${channel.id}" includeHidden:true`,
105
- connectedHostBoundary: 'agent_harness mode:"connected_host_capability" query:"delivery"',
106
- ...(options.includeParameters ? {
86
+ ...(options.includeParameters ? {
87
+ policy: {
88
+ effect: 'read-only',
89
+ values: 'Config key names and target key names are shown; secret values and stored target values are never returned.',
90
+ delivery: 'Use agent_channel_send only for one explicit, confirmed delivery target requested by the user.',
91
+ setup: 'Use connected-host setup/account/policy routes only as read-only diagnostics unless another confirmed first-class tool owns the mutation.',
92
+ },
93
+ modelAccess: {
94
+ sendTool: 'agent_channel_send',
95
+ notificationTool: 'agent_notify',
96
+ reminderTool: 'agent_reminder_schedule',
97
+ slashCommandDetail: `/channels show ${channel.id}`,
98
+ readOnlyConnectedRoutes: [
99
+ '/channels accounts',
100
+ '/channels policies',
101
+ '/channels status',
102
+ `/channels doctor ${channel.id}`,
103
+ `/channels setup ${channel.id}`,
104
+ ],
105
+ settingsFilter: `agent_harness mode:"settings" prefix:"surfaces.${channel.id}" includeHidden:true`,
106
+ connectedHostBoundary: 'agent_harness mode:"connected_host_capability" query:"delivery"',
107
107
  deliveryTargetShape: 'surface[:route[:label]]',
108
108
  exampleTarget: `${channel.id}:route:Label`,
109
- } : {}),
110
- },
109
+ },
110
+ } : {}),
111
111
  };
112
112
  }
113
113
 
@@ -14,6 +14,7 @@ export interface AgentHarnessCliArgs {
14
14
  readonly cliCommand?: unknown;
15
15
  readonly commandName?: unknown;
16
16
  readonly target?: unknown;
17
+ readonly includeParameters?: unknown;
17
18
  readonly limit?: unknown;
18
19
  }
19
20
 
@@ -106,12 +107,14 @@ export function blockedHarnessCliCommandTokens(): readonly string[] {
106
107
  export function listHarnessCliCommands(args: AgentHarnessCliArgs): readonly Record<string, unknown>[] {
107
108
  const query = readString(args.query);
108
109
  const limit = readLimit(args.limit, 200);
110
+ const includeParameters = args.includeParameters === true;
109
111
  return listGoodVibesCliCommands()
110
112
  .filter((command) => command !== 'unknown')
111
113
  .map((command) => describeCliCommand(command))
112
114
  .filter((command) => cliCommandMatches(command, query))
113
115
  .sort((a, b) => String(a.name).localeCompare(String(b.name)))
114
- .slice(0, limit);
116
+ .slice(0, limit)
117
+ .map((command) => includeParameters ? command : cliCommandCandidate(command));
115
118
  }
116
119
 
117
120
  function cliInputFromArgs(args: AgentHarnessCliArgs): { readonly source: CliCommandLookup['source']; readonly input: string } | null {
@@ -8,6 +8,7 @@ export interface AgentHarnessCommandCatalogArgs {
8
8
  readonly commandName?: unknown;
9
9
  readonly args?: unknown;
10
10
  readonly target?: unknown;
11
+ readonly includeParameters?: unknown;
11
12
  readonly limit?: unknown;
12
13
  }
13
14
 
@@ -38,6 +39,11 @@ function readStringArray(value: unknown): readonly string[] {
38
39
  return value.map((entry) => typeof entry === 'string' ? entry : String(entry));
39
40
  }
40
41
 
42
+ function previewText(value: string, maxLength = 120): string {
43
+ const normalized = value.replace(/\s+/g, ' ').trim();
44
+ return normalized.length <= maxLength ? normalized : `${normalized.slice(0, maxLength - 1).trimEnd()}...`;
45
+ }
46
+
41
47
  function commandMatches(command: SlashCommand, query: string): boolean {
42
48
  if (!query) return true;
43
49
  const haystack = [
@@ -76,8 +82,8 @@ function describeCommandCandidate(command: SlashCommand): Record<string, unknown
76
82
  name: command.name,
77
83
  slash: `/${command.name}`,
78
84
  aliases: command.aliases ?? [],
79
- description: command.description,
80
- usage: command.usage ?? '',
85
+ summary: previewText(command.description),
86
+ ...(command.argsHint ? { argsHint: command.argsHint } : {}),
81
87
  };
82
88
  }
83
89
 
@@ -165,11 +171,12 @@ export function resolveHarnessCommandDetail(commandRegistry: CommandRegistry, ar
165
171
  export function listHarnessCommands(commandRegistry: CommandRegistry, args: AgentHarnessCommandCatalogArgs): readonly Record<string, unknown>[] {
166
172
  const query = readString(args.query);
167
173
  const limit = readLimit(args.limit, 200);
174
+ const includeParameters = args.includeParameters === true;
168
175
  return commandRegistry.list()
169
176
  .filter((command) => commandMatches(command, query))
170
177
  .sort((a, b) => a.name.localeCompare(b.name))
171
178
  .slice(0, limit)
172
- .map((command) => describeCommand(command));
179
+ .map((command) => includeParameters ? describeCommand(command) : describeCommandCandidate(command));
173
180
  }
174
181
 
175
182
  export function describeHarnessCommand(commandRegistry: CommandRegistry, args: AgentHarnessCommandCatalogArgs): Record<string, unknown> | null {
@@ -73,6 +73,7 @@ function connectedHostFindings(
73
73
  export async function connectedHostStatusSummary(
74
74
  context: CommandContext,
75
75
  toolRegistry: ToolRegistry,
76
+ options: { readonly includeParameters?: boolean } = {},
76
77
  ): Promise<Record<string, unknown>> {
77
78
  const homeDirectory = resolveHomeDirectory(context);
78
79
  const workingDirectory = resolveWorkingDirectory(context);
@@ -134,13 +135,18 @@ export async function connectedHostStatusSummary(
134
135
  },
135
136
  ],
136
137
  findings: connectedHostFindings(runtime, tokenUsable),
137
- modelAccess: {
138
+ capabilitySummary: {
139
+ routeFamilies: connectedHostRouteFamilies().length,
140
+ availableCapabilities: connectedHostCapabilityMap(toolRegistry).filter((capability) => capability.available === true).length,
141
+ blockedCapabilities: blockedConnectedHostCapabilities().length,
142
+ },
143
+ ...(options.includeParameters ? { modelAccess: {
138
144
  diagnostics: 'Use mode:"connected_host_status" for live read-only host readiness, mode:"service_posture" for endpoint posture, mode:"service_endpoint" for one endpoint, and mode:"connected_host" for capability and boundary inventory.',
139
145
  cliMirrors: ['goodvibes-agent status --json', 'goodvibes-agent doctor', 'goodvibes-agent compat'],
140
146
  tuiMirrors: ['Agent Workspace -> Home -> Host compatibility', 'Agent Workspace -> Home -> Doctor diagnostics', 'Agent Workspace -> Home -> Review health'],
141
147
  },
142
148
  routeFamilies: connectedHostRouteFamilies(),
143
149
  capabilities: connectedHostCapabilityMap(toolRegistry),
144
- blockedCapabilities: blockedConnectedHostCapabilities(),
150
+ blockedCapabilities: blockedConnectedHostCapabilities() } : {}),
145
151
  };
146
152
  }
@@ -136,12 +136,12 @@ function describeRoute(
136
136
  operatorClientAttached: Boolean(context.clients?.operator),
137
137
  },
138
138
  ...(options.lookup ? { lookup: options.lookup } : {}),
139
- policy: {
140
- effect: route.effect,
141
- values: 'Delegation posture returns policy, route, confirmation, and runtime availability metadata only; it does not submit delegated work.',
142
- mutation: 'Delegated work submission stays a visible confirmed workspace or slash-command flow and must preserve the full original user ask.',
143
- },
144
139
  ...(options.includeParameters ? {
140
+ policy: {
141
+ effect: route.effect,
142
+ values: 'Delegation posture returns policy, route, confirmation, and runtime availability metadata only; it does not submit delegated work.',
143
+ mutation: 'Delegated work submission stays a visible confirmed workspace or slash-command flow and must preserve the full original user ask.',
144
+ },
145
145
  modelAccess: {
146
146
  inspectDelegation: 'agent_harness mode:"delegation_posture"',
147
147
  inspectRoute: 'agent_harness mode:"delegation_route"',
@@ -116,34 +116,36 @@ function describeServer(
116
116
  })),
117
117
  toolCount: tools.length,
118
118
  } : { toolCount: tools.length }),
119
- policy: {
120
- effect: 'read-only',
121
- values: 'Server posture returns trust, role, connection, quarantine, and tool metadata; env values and secret config values are never returned.',
122
- mutation: 'MCP add/remove/reload/trust/role/quarantine operations stay explicit confirmation-gated workspace or slash-command flows.',
123
- allowAll: 'allow-all trust decisions remain routed through Settings -> MCP, not direct command escalation.',
124
- },
125
- modelAccess: {
126
- reviewCommand: '/mcp review',
127
- serversCommand: '/mcp servers',
128
- toolsCommand: `/mcp tools ${server.name}`,
129
- repairCommand: `/mcp repair ${server.name}`,
130
- authReviewCommand: '/mcp auth-review',
131
- configCommand: '/mcp config',
132
- workspaceActionIds: [
133
- 'mcp-review',
134
- 'mcp-tools-server',
135
- 'mcp-repair',
136
- 'mcp-config',
137
- 'mcp-add-server',
138
- 'mcp-settings',
139
- ],
140
- confirmationGatedCommands: [
141
- `/mcp trust ${server.name} <constrained|ask-on-risk|blocked> --yes`,
142
- `/mcp role ${server.name} <role> --yes`,
143
- `/mcp quarantine ${server.name} approve <operatorId> --yes`,
144
- `/mcp remove ${server.name} --yes`,
145
- ],
146
- },
119
+ ...(options.includeParameters ? {
120
+ policy: {
121
+ effect: 'read-only',
122
+ values: 'Server posture returns trust, role, connection, quarantine, and tool metadata; env values and secret config values are never returned.',
123
+ mutation: 'MCP add/remove/reload/trust/role/quarantine operations stay explicit confirmation-gated workspace or slash-command flows.',
124
+ allowAll: 'allow-all trust decisions remain routed through Settings -> MCP, not direct command escalation.',
125
+ },
126
+ modelAccess: {
127
+ reviewCommand: '/mcp review',
128
+ serversCommand: '/mcp servers',
129
+ toolsCommand: `/mcp tools ${server.name}`,
130
+ repairCommand: `/mcp repair ${server.name}`,
131
+ authReviewCommand: '/mcp auth-review',
132
+ configCommand: '/mcp config',
133
+ workspaceActionIds: [
134
+ 'mcp-review',
135
+ 'mcp-tools-server',
136
+ 'mcp-repair',
137
+ 'mcp-config',
138
+ 'mcp-add-server',
139
+ 'mcp-settings',
140
+ ],
141
+ confirmationGatedCommands: [
142
+ `/mcp trust ${server.name} <constrained|ask-on-risk|blocked> --yes`,
143
+ `/mcp role ${server.name} <role> --yes`,
144
+ `/mcp quarantine ${server.name} approve <operatorId> --yes`,
145
+ `/mcp remove ${server.name} --yes`,
146
+ ],
147
+ },
148
+ } : {}),
147
149
  };
148
150
  }
149
151
 
@@ -116,14 +116,14 @@ function describeProvider(
116
116
  inspectPosture: 'agent_harness mode:"media_posture"',
117
117
  inspectProvider: 'agent_harness mode:"media_provider"',
118
118
  generateMedia: 'agent_media_generate with confirm:true and explicitUserRequest',
119
- ttsSettings: 'agent_harness settings/get_setting/set_setting for tts.provider, tts.voice, tts.llmProvider, and tts.llmModel',
119
+ ttsSettings: 'agent_harness mode:"settings", mode:"get_setting", mode:"set_setting" for tts.provider, tts.voice, tts.llmProvider, and tts.llmModel',
120
+ },
121
+ policy: {
122
+ effect: 'read-only',
123
+ values: 'Provider posture returns capability, setup, selected, health, and safe environment key names only; secret values and media payloads are never returned.',
124
+ mutation: 'Media generation, voice enable/disable, TTS setting changes, and bundle export stay explicit confirmation-gated tool, setting, workspace, or slash-command flows.',
120
125
  },
121
126
  } : {}),
122
- policy: {
123
- effect: 'read-only',
124
- values: 'Provider posture returns capability, setup, selected, health, and safe environment key names only; secret values and media payloads are never returned.',
125
- mutation: 'Media generation, voice enable/disable, TTS setting changes, and bundle export stay explicit confirmation-gated tool, setting, workspace, or slash-command flows.',
126
- },
127
127
  };
128
128
  }
129
129
 
@@ -215,14 +215,14 @@ export async function mediaPostureSummary(context: CommandContext, args: AgentHa
215
215
  returned: filtered.length,
216
216
  total: providers.length,
217
217
  policy: 'Read-only voice/media posture. Media generation, voice enable/disable, TTS setting changes, and bundle export stay confirmation-gated through first-class tools, settings modes, workspace actions, or slash-command mirrors.',
218
- modelAccess: {
218
+ ...(args.includeParameters === true ? { modelAccess: {
219
219
  mediaGenerateTool: 'agent_media_generate',
220
220
  providerCatalogMode: 'media_posture',
221
221
  singleProviderMode: 'media_provider',
222
- ttsProviderPicker: 'open_ui_surface surfaceId:"tts-provider-picker"',
223
- ttsVoicePicker: 'open_ui_surface surfaceId:"tts-voice-picker"',
222
+ ttsProviderPicker: 'agent_harness mode:"open_ui_surface" surfaceId:"tts-provider-picker" confirm:true explicitUserRequest:"..."',
223
+ ttsVoicePicker: 'agent_harness mode:"open_ui_surface" surfaceId:"tts-voice-picker" confirm:true explicitUserRequest:"..."',
224
224
  commands: ['/media providers', '/voice review', '/tts <prompt>', '/image <path>'],
225
- },
225
+ } } : {}),
226
226
  };
227
227
  }
228
228