@pellux/goodvibes-agent 1.0.34 → 1.0.36

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 (87) hide show
  1. package/CHANGELOG.md +28 -13
  2. package/README.md +11 -8
  3. package/dist/package/main.js +1592 -921
  4. package/docs/README.md +6 -5
  5. package/docs/channels-remote-and-api.md +3 -3
  6. package/docs/connected-host.md +3 -3
  7. package/docs/getting-started.md +20 -12
  8. package/docs/knowledge-artifacts-and-multimodal.md +9 -4
  9. package/docs/project-planning.md +3 -3
  10. package/docs/providers-and-routing.md +2 -2
  11. package/docs/release-and-publishing.md +8 -8
  12. package/docs/tools-and-commands.md +34 -17
  13. package/docs/voice-and-live-tts.md +1 -1
  14. package/package.json +1 -1
  15. package/release/live-verification/live-verification.json +15 -15
  16. package/release/live-verification/live-verification.md +19 -21
  17. package/release/release-notes.md +6 -6
  18. package/release/release-readiness.json +64 -64
  19. package/src/agent/harness-control.ts +35 -9
  20. package/src/agent/reminder-schedule-format.ts +2 -5
  21. package/src/agent/reminder-schedule.ts +4 -11
  22. package/src/agent/routine-schedule-format.ts +3 -6
  23. package/src/agent/routine-schedule-promotion.ts +5 -14
  24. package/src/agent/routine-schedule-receipts.ts +4 -9
  25. package/src/cli/agent-knowledge-command.ts +6 -11
  26. package/src/cli/agent-knowledge-format.ts +4 -9
  27. package/src/cli/agent-knowledge-runtime.ts +7 -14
  28. package/src/cli/external-runtime.ts +3 -46
  29. package/src/cli/help.ts +2 -2
  30. package/src/cli/status.ts +6 -7
  31. package/src/input/agent-workspace-categories.ts +23 -23
  32. package/src/input/agent-workspace-channels.ts +3 -3
  33. package/src/input/agent-workspace-operations-command-editors.ts +1 -1
  34. package/src/input/command-registry.ts +1 -1
  35. package/src/input/commands/compat-runtime.ts +1 -1
  36. package/src/input/commands/planning-runtime.ts +1 -1
  37. package/src/input/commands/runtime-services.ts +1 -1
  38. package/src/input/mcp-workspace.ts +1 -1
  39. package/src/input/submission-router.ts +1 -1
  40. package/src/panels/builtin/shared.ts +1 -1
  41. package/src/panels/project-planning-panel.ts +4 -4
  42. package/src/panels/qr-panel.ts +2 -2
  43. package/src/renderer/conversation-overlays.ts +1 -0
  44. package/src/runtime/bootstrap-command-parts.ts +1 -1
  45. package/src/runtime/bootstrap-core.ts +3 -1
  46. package/src/runtime/bootstrap-hook-bridge.ts +1 -1
  47. package/src/runtime/bootstrap-shell.ts +1 -1
  48. package/src/runtime/bootstrap.ts +7 -4
  49. package/src/runtime/context.ts +2 -2
  50. package/src/runtime/index.ts +88 -5
  51. package/src/runtime/store/state.ts +1 -1
  52. package/src/tools/agent-channel-send-tool.ts +1 -1
  53. package/src/tools/agent-harness-channel-metadata.ts +36 -25
  54. package/src/tools/agent-harness-cli-metadata.ts +19 -1
  55. package/src/tools/agent-harness-command-catalog.ts +15 -4
  56. package/src/tools/agent-harness-connected-host-status.ts +7 -6
  57. package/src/tools/agent-harness-delegation-posture.ts +15 -4
  58. package/src/tools/agent-harness-keybinding-metadata.ts +67 -16
  59. package/src/tools/agent-harness-mcp-metadata.ts +11 -3
  60. package/src/tools/agent-harness-media-posture.ts +25 -14
  61. package/src/tools/agent-harness-metadata.ts +140 -37
  62. package/src/tools/agent-harness-mode-catalog.ts +258 -0
  63. package/src/tools/agent-harness-model-routing.ts +18 -3
  64. package/src/tools/agent-harness-model-tool-catalog.ts +85 -7
  65. package/src/tools/agent-harness-notification-metadata.ts +30 -19
  66. package/src/tools/agent-harness-operator-methods.ts +15 -10
  67. package/src/tools/agent-harness-pairing-posture.ts +17 -5
  68. package/src/tools/agent-harness-panel-metadata.ts +10 -4
  69. package/src/tools/agent-harness-provider-account-metadata.ts +46 -35
  70. package/src/tools/agent-harness-release-evidence.ts +31 -3
  71. package/src/tools/agent-harness-release-readiness.ts +30 -0
  72. package/src/tools/agent-harness-security-posture.ts +18 -4
  73. package/src/tools/agent-harness-service-posture.ts +9 -2
  74. package/src/tools/agent-harness-session-metadata.ts +24 -8
  75. package/src/tools/agent-harness-setup-posture.ts +32 -21
  76. package/src/tools/agent-harness-text.ts +6 -0
  77. package/src/tools/agent-harness-tool-schema.ts +1 -1
  78. package/src/tools/agent-harness-tool.ts +38 -36
  79. package/src/tools/agent-harness-ui-surface-metadata.ts +105 -101
  80. package/src/tools/agent-harness-workspace-actions.ts +64 -3
  81. package/src/tools/agent-knowledge-ingest-tool.ts +1 -1
  82. package/src/tools/agent-knowledge-tool.ts +1 -1
  83. package/src/tools/agent-media-generate-tool.ts +2 -2
  84. package/src/tools/agent-notify-tool.ts +1 -1
  85. package/src/tools/agent-reminder-schedule-tool.ts +1 -1
  86. package/src/tools/tool-definition-compaction.ts +76 -0
  87. package/src/version.ts +2 -8
@@ -1,6 +1,7 @@
1
1
  import type { ToolRegistry } from '@pellux/goodvibes-sdk/platform/tools';
2
2
  import type { CommandContext } from '../input/command-registry.ts';
3
3
  import { resolveAgentConnectedHostConnection } from '../agent/routine-schedule-promotion.ts';
4
+ import { previewHarnessText } from './agent-harness-text.ts';
4
5
 
5
6
  export interface CommandExecutionPolicy {
6
7
  readonly effect: 'read-only' | 'local-state' | 'connected-host-state' | 'external-network' | 'ui-navigation' | 'session-lifecycle' | 'delegated-work' | 'mixed' | 'unknown';
@@ -13,6 +14,10 @@ export type ConnectedHostCapabilityResolution =
13
14
  | { readonly status: 'found'; readonly detail: Record<string, unknown> }
14
15
  | { readonly status: 'ambiguous'; readonly input: string; readonly candidates: readonly Record<string, unknown>[] };
15
16
 
17
+ function agentHarnessModes(...modes: readonly string[]): string {
18
+ return `agent_harness ${modes.map((mode) => `mode:"${mode}"`).join(', ')}`;
19
+ }
20
+
16
21
  export function describeCommandPolicy(commandName: string): CommandExecutionPolicy {
17
22
  const root = commandName.replace(/^\//, '').trim().toLowerCase();
18
23
  const confirmation = 'agent_harness mode:"run_command" requires confirm:true and explicitUserRequest for every slash command invocation.';
@@ -20,7 +25,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
20
25
  return {
21
26
  effect: 'ui-navigation',
22
27
  confirmation,
23
- preferredModelTool: 'agent_harness workspace/workspace_categories/workspace_actions/workspace_action/run_workspace_action',
28
+ preferredModelTool: agentHarnessModes('workspace', 'workspace_categories', 'workspace_actions', 'workspace_action', 'run_workspace_action'),
24
29
  boundary: 'Agent workspace navigation is visible shell routing. Use workspace action modes for concrete model-readable operation.',
25
30
  };
26
31
  }
@@ -28,7 +33,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
28
33
  return {
29
34
  effect: 'ui-navigation',
30
35
  confirmation,
31
- preferredModelTool: 'agent_harness workspace_actions/workspace_action/open_ui_surface',
36
+ preferredModelTool: agentHarnessModes('workspace_actions', 'workspace_action', 'open_ui_surface'),
32
37
  boundary: 'Setup opens the visible Agent onboarding or setup workspace. Model-side changes should use setting modes or workspace actions.',
33
38
  };
34
39
  }
@@ -36,7 +41,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
36
41
  return {
37
42
  effect: 'ui-navigation',
38
43
  confirmation,
39
- preferredModelTool: root === 'shortcuts' ? 'agent_harness shortcuts/keybindings/keybinding' : 'agent_harness commands/command',
44
+ preferredModelTool: root === 'shortcuts' ? agentHarnessModes('shortcuts', 'keybindings', 'keybinding') : agentHarnessModes('commands', 'command'),
40
45
  boundary: 'Discovery commands open visible help surfaces. The model should inspect the matching harness catalog directly before invoking commands.',
41
46
  };
42
47
  }
@@ -44,7 +49,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
44
49
  return {
45
50
  effect: 'read-only',
46
51
  confirmation,
47
- preferredModelTool: 'agent_harness shortcuts/keybindings/keybinding/run_keybinding/set_keybinding/reset_keybinding',
52
+ preferredModelTool: agentHarnessModes('shortcuts', 'keybindings', 'keybinding', 'run_keybinding', 'set_keybinding', 'reset_keybinding'),
48
53
  boundary: 'Keybinding inspection is read-only. Keybinding execution or edits require explicit confirmation through agent_harness keybinding modes.',
49
54
  };
50
55
  }
@@ -52,7 +57,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
52
57
  return {
53
58
  effect: 'mixed',
54
59
  confirmation,
55
- preferredModelTool: 'agent_harness settings/get_setting/set_setting/reset_setting',
60
+ preferredModelTool: agentHarnessModes('settings', 'get_setting', 'set_setting', 'reset_setting'),
56
61
  boundary: 'Model-writable settings can be changed through agent_harness. Connected-host lifecycle/listener settings remain read-only.',
57
62
  };
58
63
  }
@@ -60,7 +65,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
60
65
  return {
61
66
  effect: 'mixed',
62
67
  confirmation,
63
- preferredModelTool: 'agent_harness settings/get_setting/set_setting/open_ui_surface',
68
+ preferredModelTool: agentHarnessModes('settings', 'get_setting', 'set_setting', 'open_ui_surface'),
64
69
  boundary: 'Model and reasoning-effort changes affect the current Agent chat route. Prefer settings modes for concrete values and UI surface routing for visible pickers.',
65
70
  };
66
71
  }
@@ -68,7 +73,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
68
73
  return {
69
74
  effect: 'mixed',
70
75
  confirmation,
71
- preferredModelTool: 'agent_harness settings/get_setting/set_setting/open_ui_surface',
76
+ preferredModelTool: agentHarnessModes('settings', 'get_setting', 'set_setting', 'open_ui_surface'),
72
77
  boundary: 'Provider selection and custom provider files belong to Agent provider configuration. Adding, removing, or switching providers requires explicit user intent.',
73
78
  };
74
79
  }
@@ -76,7 +81,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
76
81
  return {
77
82
  effect: 'external-network',
78
83
  confirmation,
79
- preferredModelTool: 'agent_harness settings/tools',
84
+ preferredModelTool: agentHarnessModes('settings', 'tools'),
80
85
  boundary: 'Model catalog refresh may call provider discovery routes and update local provider metadata. Do not run it without explicit user request.',
81
86
  };
82
87
  }
@@ -84,7 +89,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
84
89
  return {
85
90
  effect: 'local-state',
86
91
  confirmation,
87
- preferredModelTool: 'agent_harness run_command',
92
+ preferredModelTool: agentHarnessModes('run_command'),
88
93
  boundary: 'Pinned model changes mutate local Agent provider preferences only and require an explicit model id.',
89
94
  };
90
95
  }
@@ -92,7 +97,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
92
97
  return {
93
98
  effect: 'local-state',
94
99
  confirmation,
95
- preferredModelTool: 'agent_harness settings/get_setting/set_setting',
100
+ preferredModelTool: agentHarnessModes('settings', 'get_setting', 'set_setting'),
96
101
  boundary: 'Interaction-mode changes affect the current Agent operator notification posture and should be explicit.',
97
102
  };
98
103
  }
@@ -108,7 +113,9 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
108
113
  return {
109
114
  effect: 'read-only',
110
115
  confirmation,
111
- preferredModelTool: root === 'compat' ? 'agent_harness service_posture/service_endpoint/connected_host_status' : 'agent_harness service_posture/service_endpoint/connected_host_status/settings/tools/open_ui_surface',
116
+ preferredModelTool: root === 'compat'
117
+ ? agentHarnessModes('service_posture', 'service_endpoint', 'connected_host_status')
118
+ : agentHarnessModes('service_posture', 'service_endpoint', 'connected_host_status', 'settings', 'tools', 'open_ui_surface'),
112
119
  boundary: 'Diagnostics and review commands inspect Agent, provider, MCP, security, and connected-host readiness without taking lifecycle ownership.',
113
120
  };
114
121
  }
@@ -116,7 +123,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
116
123
  return {
117
124
  effect: 'mixed',
118
125
  confirmation,
119
- preferredModelTool: 'agent_harness run_command',
126
+ preferredModelTool: agentHarnessModes('run_command'),
120
127
  boundary: 'Review subcommands are read-only; bundle export/import or auth/trust bundle export writes local files and requires explicit confirmation.',
121
128
  };
122
129
  }
@@ -124,7 +131,9 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
124
131
  return {
125
132
  effect: 'mixed',
126
133
  confirmation,
127
- preferredModelTool: root === 'secrets' || root === 'secret' ? 'agent_harness settings/get_setting/set_setting/reset_setting' : 'agent_harness workspace_actions/settings/open_ui_surface',
134
+ preferredModelTool: root === 'secrets' || root === 'secret'
135
+ ? agentHarnessModes('settings', 'get_setting', 'set_setting', 'reset_setting')
136
+ : agentHarnessModes('workspace_actions', 'settings', 'open_ui_surface'),
128
137
  boundary: 'Harness-owned configuration, secret, voice, subscription, and MCP commands can expose credentials or external account state. Mutations require explicit user intent and should prefer secret refs over raw values.',
129
138
  };
130
139
  }
@@ -150,7 +159,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
150
159
  return {
151
160
  effect: 'ui-navigation',
152
161
  confirmation,
153
- preferredModelTool: 'agent_harness workspace_actions/workspace_action/run_workspace_action or agent_local_registry',
162
+ preferredModelTool: `${agentHarnessModes('workspace_actions', 'workspace_action', 'run_workspace_action')} or agent_local_registry`,
154
163
  boundary: 'Notes workspace routing is visible navigation; note record mutations should use Agent-local registry or workspace action modes.',
155
164
  };
156
165
  }
@@ -198,7 +207,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
198
207
  return {
199
208
  effect: 'external-network',
200
209
  confirmation,
201
- preferredModelTool: 'agent_harness open_ui_surface',
210
+ preferredModelTool: agentHarnessModes('open_ui_surface'),
202
211
  boundary: 'Image attachment reads a local image and submits a model turn with image content. Use only for explicit user-supplied files.',
203
212
  };
204
213
  }
@@ -206,7 +215,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
206
215
  return {
207
216
  effect: 'external-network',
208
217
  confirmation,
209
- preferredModelTool: 'agent_harness settings/open_ui_surface',
218
+ preferredModelTool: agentHarnessModes('settings', 'open_ui_surface'),
210
219
  boundary: 'Live TTS submits a normal prompt and may call model and speech providers; stopping playback is local runtime control.',
211
220
  };
212
221
  }
@@ -222,7 +231,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
222
231
  return {
223
232
  effect: 'delegated-work',
224
233
  confirmation,
225
- preferredModelTool: 'agent_harness workspace_actions/workspace_action/run_workspace_action',
234
+ preferredModelTool: agentHarnessModes('workspace_actions', 'workspace_action', 'run_workspace_action'),
226
235
  boundary: 'Delegation is explicit user-directed work only; no hidden background review or separate Agent job should be created implicitly.',
227
236
  };
228
237
  }
@@ -245,7 +254,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
245
254
  return {
246
255
  effect: 'session-lifecycle',
247
256
  confirmation,
248
- preferredModelTool: 'agent_harness commands/command/run_command',
257
+ preferredModelTool: agentHarnessModes('commands', 'command', 'run_command'),
249
258
  boundary: 'Session and conversation commands operate on the visible harness session lifecycle.',
250
259
  };
251
260
  }
@@ -253,7 +262,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
253
262
  return {
254
263
  effect: 'local-state',
255
264
  confirmation,
256
- preferredModelTool: 'agent_harness workspace_actions/workspace_action/run_workspace_action or agent_harness run_command',
265
+ preferredModelTool: `${agentHarnessModes('workspace_actions', 'workspace_action', 'run_workspace_action')} or ${agentHarnessModes('run_command')}`,
257
266
  boundary: 'Conversation export writes a local workspace file and requires an explicit output intent.',
258
267
  };
259
268
  }
@@ -261,7 +270,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
261
270
  return {
262
271
  effect: 'ui-navigation',
263
272
  confirmation,
264
- preferredModelTool: root === 'bookmarks' ? 'agent_harness open_ui_surface' : 'agent_harness run_command',
273
+ preferredModelTool: root === 'bookmarks' ? `${agentHarnessModes('open_ui_surface')} or ${agentHarnessModes('run_command')}` : agentHarnessModes('run_command'),
265
274
  boundary: 'Conversation display navigation mutates only the visible transcript view or scroll position.',
266
275
  };
267
276
  }
@@ -269,7 +278,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
269
278
  return {
270
279
  effect: 'local-state',
271
280
  confirmation,
272
- preferredModelTool: 'agent_harness run_keybinding',
281
+ preferredModelTool: agentHarnessModes('run_keybinding'),
273
282
  boundary: 'Paste reads the local clipboard and mutates the visible prompt or image attachment state.',
274
283
  };
275
284
  }
@@ -277,7 +286,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
277
286
  return {
278
287
  effect: 'mixed',
279
288
  confirmation,
280
- preferredModelTool: 'agent_harness workspace_actions/workspace_action/run_workspace_action',
289
+ preferredModelTool: agentHarnessModes('workspace_actions', 'workspace_action', 'run_workspace_action'),
281
290
  boundary: 'Agent profile commands manage isolated Agent runtime profiles and starter templates. Mutations require explicit confirmation.',
282
291
  };
283
292
  }
@@ -285,7 +294,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
285
294
  return {
286
295
  effect: 'read-only',
287
296
  confirmation,
288
- preferredModelTool: 'agent_harness run_command',
297
+ preferredModelTool: agentHarnessModes('run_command'),
289
298
  boundary: 'Pairing details are displayed for explicit operator use; the Agent does not manage connected-host listener lifecycle.',
290
299
  };
291
300
  }
@@ -323,15 +332,17 @@ export function describeCliCommandPolicy(commandName: string): CommandExecutionP
323
332
  return {
324
333
  effect: 'unknown',
325
334
  confirmation,
326
- boundary: 'Blocked package CLI token. Agent can launch its own TUI and use public connected-host routes, but it does not manage connected-host lifecycle, listeners, servers, bridges, remotes, web surfaces, or webhook listeners.',
335
+ boundary: 'Blocked package CLI token. Agent can launch its own TUI and use public connected-host routes, but it does not manage connected-host lifecycle, listeners, servers, route relays, remotes, web surfaces, or webhook listeners.',
327
336
  };
328
337
  }
329
338
  if (root === 'tui' || root === 'onboarding' || root === 'help' || root === 'version' || root === 'completion') {
330
339
  return {
331
340
  effect: root === 'tui' || root === 'onboarding' ? 'ui-navigation' : 'read-only',
332
341
  confirmation,
333
- preferredModelTool: root === 'onboarding' || root === 'tui' ? 'agent_harness workspace/workspace_actions/workspace_action/run_workspace_action' : 'agent_harness cli_commands/cli_command',
334
- boundary: 'Top-level CLI launch, setup, help, version, and completion commands are package entrypoint surfaces; use in-process workspace and slash-command bridges from the model when operating inside the TUI.',
342
+ preferredModelTool: root === 'onboarding' || root === 'tui'
343
+ ? agentHarnessModes('workspace', 'workspace_actions', 'workspace_action', 'run_workspace_action')
344
+ : agentHarnessModes('cli_commands', 'cli_command'),
345
+ boundary: 'Top-level CLI launch, setup, help, version, and completion commands are package entrypoint surfaces; use in-process workspace and slash-command routes from the model when operating inside the TUI.',
335
346
  };
336
347
  }
337
348
  if (root === 'run') {
@@ -346,7 +357,7 @@ export function describeCliCommandPolicy(commandName: string): CommandExecutionP
346
357
  return {
347
358
  effect: 'read-only',
348
359
  confirmation,
349
- preferredModelTool: root === 'tasks' ? 'agent_operator_briefing' : 'agent_harness service_posture/service_endpoint/connected_host_status/connected_host/settings/tools',
360
+ preferredModelTool: root === 'tasks' ? 'agent_operator_briefing' : agentHarnessModes('service_posture', 'service_endpoint', 'connected_host_status', 'connected_host', 'settings', 'tools'),
350
361
  boundary: 'Diagnostics and posture commands are readable from Agent-owned settings, provider, model, and connected-host capability surfaces without taking connected-host lifecycle ownership.',
351
362
  };
352
363
  }
@@ -354,7 +365,7 @@ export function describeCliCommandPolicy(commandName: string): CommandExecutionP
354
365
  return {
355
366
  effect: 'local-state',
356
367
  confirmation,
357
- preferredModelTool: root === 'profiles' ? 'agent_harness workspace_actions/workspace_action/run_workspace_action' : 'agent_local_registry',
368
+ preferredModelTool: root === 'profiles' ? agentHarnessModes('workspace_actions', 'workspace_action', 'run_workspace_action') : 'agent_local_registry',
358
369
  boundary: 'Local library/profile/session/bundle CLI commands operate on Agent-local data. Mutations require explicit user intent and should use first-class Agent-local tools where available.',
359
370
  };
360
371
  }
@@ -370,7 +381,7 @@ export function describeCliCommandPolicy(commandName: string): CommandExecutionP
370
381
  return {
371
382
  effect: 'delegated-work',
372
383
  confirmation,
373
- preferredModelTool: 'agent_harness workspace_actions/workspace_action/run_workspace_action',
384
+ preferredModelTool: agentHarnessModes('workspace_actions', 'workspace_action', 'run_workspace_action'),
374
385
  boundary: 'Delegation is explicit user-directed work only; no hidden background review or separate Agent job should be created implicitly.',
375
386
  };
376
387
  }
@@ -378,7 +389,9 @@ export function describeCliCommandPolicy(commandName: string): CommandExecutionP
378
389
  return {
379
390
  effect: root === 'pair' ? 'external-network' : 'mixed',
380
391
  confirmation,
381
- preferredModelTool: root === 'pair' ? 'agent_harness workspace_actions/workspace_action/run_workspace_action' : 'agent_harness settings/get_setting/set_setting/reset_setting or workspace_actions',
392
+ preferredModelTool: root === 'pair'
393
+ ? agentHarnessModes('workspace_actions', 'workspace_action', 'run_workspace_action')
394
+ : `${agentHarnessModes('settings', 'get_setting', 'set_setting', 'reset_setting')} or ${agentHarnessModes('workspace_actions')}`,
382
395
  boundary: 'Provider subscription, secret, and pairing flows can expose credentials or external account state. Use only explicit user-directed flows and prefer secret refs over raw values.',
383
396
  };
384
397
  }
@@ -393,9 +406,30 @@ function toolIsAvailable(toolRegistry: ToolRegistry, toolName: string): boolean
393
406
  return toolRegistry.getToolDefinitions().some((tool) => tool.name === toolName);
394
407
  }
395
408
 
409
+ function connectedHostCapabilityModelRoute(capability: Record<string, unknown>): string {
410
+ const modelTools = Array.isArray(capability.modelTools)
411
+ ? capability.modelTools.filter((tool): tool is string => typeof tool === 'string')
412
+ : [];
413
+ if (modelTools.length > 0) return previewHarnessText(modelTools.join(' or '));
414
+ return 'agent_harness mode:"connected_host_capability"';
415
+ }
416
+
417
+ function blockedConnectedHostModelRoute(): string {
418
+ return 'agent_harness mode:"service_posture" or mode:"connected_host_status"';
419
+ }
420
+
396
421
  export function connectedHostCapabilityMap(toolRegistry: ToolRegistry): readonly Record<string, unknown>[] {
397
422
  const withAvailability = (capability: Record<string, unknown> & { readonly modelTools: readonly string[] }): Record<string, unknown> => ({
398
423
  ...capability,
424
+ modelRoute: connectedHostCapabilityModelRoute(capability),
425
+ harnessRoute: 'agent_harness mode:"connected_host_capability"',
426
+ modelAccess: {
427
+ inspectCapability: 'agent_harness mode:"connected_host_capability"',
428
+ liveStatus: 'agent_harness mode:"connected_host_status"',
429
+ endpointPosture: 'agent_harness mode:"service_posture"',
430
+ routeFamilies: 'agent_harness mode:"connected_host" includeParameters:true',
431
+ operate: connectedHostCapabilityModelRoute(capability),
432
+ },
399
433
  available: capability.modelTools.every((toolName) => toolIsAvailable(toolRegistry, toolName)),
400
434
  });
401
435
  return [
@@ -498,6 +532,7 @@ export function connectedHostRouteFamilies(): readonly Record<string, unknown>[]
498
532
  id: 'agent-knowledge',
499
533
  prefixes: ['/api/goodvibes-agent/knowledge/*'],
500
534
  modelTools: ['agent_knowledge', 'agent_knowledge_ingest'],
535
+ modelRoute: 'agent_knowledge or agent_knowledge_ingest',
501
536
  boundary: 'Agent-owned knowledge segment only; no fallback to default or non-Agent knowledge.',
502
537
  },
503
538
  {
@@ -510,24 +545,28 @@ export function connectedHostRouteFamilies(): readonly Record<string, unknown>[]
510
545
  '/api/runtime/scheduler',
511
546
  ],
512
547
  modelTools: ['agent_operator_briefing'],
548
+ modelRoute: 'agent_operator_briefing',
513
549
  boundary: 'Read-only public operator briefing routes.',
514
550
  },
515
551
  {
516
552
  id: 'operator-actions',
517
553
  routes: ['public operator action methods for approvals, automation jobs, automation runs, and schedules'],
518
554
  modelTools: ['agent_operator_action'],
555
+ modelRoute: 'agent_operator_action',
519
556
  boundary: 'Allowlisted confirmed mutations only; no arbitrary route invocation.',
520
557
  },
521
558
  {
522
559
  id: 'delivery',
523
560
  routes: ['configured channel, notification, and delivery targets'],
524
561
  modelTools: ['agent_channel_send', 'agent_notify'],
562
+ modelRoute: 'agent_channel_send or agent_notify',
525
563
  boundary: 'Explicit user-approved delivery only; no route/account creation.',
526
564
  },
527
565
  {
528
566
  id: 'connected-schedules',
529
567
  routes: ['public schedule creation/run routes'],
530
568
  modelTools: ['agent_reminder_schedule', 'agent_operator_action'],
569
+ modelRoute: 'agent_reminder_schedule or agent_operator_action',
531
570
  boundary: 'Connected schedules only; no hidden local scheduler or separate Agent job.',
532
571
  },
533
572
  ];
@@ -570,6 +609,9 @@ function describeConnectedHostCapabilityCandidates(
570
609
  capabilityId: typeof entry.capability.id === 'string' ? entry.capability.id : '',
571
610
  purpose: typeof entry.capability.purpose === 'string' ? entry.capability.purpose : undefined,
572
611
  reason: typeof entry.capability.reason === 'string' ? entry.capability.reason : undefined,
612
+ modelRoute: entry.status === 'allowed'
613
+ ? connectedHostCapabilityModelRoute(entry.capability)
614
+ : blockedConnectedHostModelRoute(),
573
615
  }));
574
616
  }
575
617
 
@@ -578,18 +620,36 @@ function connectedHostCapabilityDetail(entry: { readonly status: 'allowed' | 'bl
578
620
  return {
579
621
  status: 'allowed',
580
622
  capability: entry.capability,
623
+ modelRoute: connectedHostCapabilityModelRoute(entry.capability),
624
+ harnessRoute: 'agent_harness mode:"connected_host_capability"',
581
625
  relatedRouteFamilies: relatedConnectedHostRouteFamilies(entry.capability),
626
+ modelAccess: {
627
+ inspectCapability: 'agent_harness mode:"connected_host_capability"',
628
+ connectedHostInventory: 'agent_harness mode:"connected_host" includeParameters:true',
629
+ liveStatus: 'agent_harness mode:"connected_host_status"',
630
+ endpointPosture: 'agent_harness mode:"service_posture"',
631
+ operate: connectedHostCapabilityModelRoute(entry.capability),
632
+ },
582
633
  operatorMethodMode: 'Use agent_harness mode:"operator_methods" for the public operator and Agent Knowledge method catalog. Use mode:"operator_method" for one method.',
583
634
  servicePostureMode: 'Use agent_harness mode:"service_posture" for endpoint binding, network-facing posture, issue, and redacted-log diagnostics. Use mode:"service_endpoint" for one endpoint.',
584
- statusMode: 'Use agent_harness mode:"connected_host_status" for live read-only reachability, SDK compatibility, token posture, and Agent Knowledge route readiness.',
585
- boundary: 'Use only the listed first-class model tools, slash-command families, and workspace categories. Mutations still require explicit confirmation through those tools or command bridges.',
635
+ statusMode: 'Use agent_harness mode:"connected_host_status" for live read-only reachability, token posture, and Agent Knowledge route readiness.',
636
+ boundary: 'Use only the listed first-class model tools, slash-command families, and workspace categories. Mutations still require explicit confirmation through those tools or command routes.',
586
637
  };
587
638
  }
588
639
  return {
589
640
  status: 'blocked',
590
641
  capability: entry.capability,
642
+ modelRoute: blockedConnectedHostModelRoute(),
643
+ harnessRoute: 'agent_harness mode:"connected_host_capability"',
591
644
  allowed: false,
592
645
  available: false,
646
+ modelAccess: {
647
+ inspectCapability: 'agent_harness mode:"connected_host_capability"',
648
+ connectedHostInventory: 'agent_harness mode:"connected_host" includeParameters:true',
649
+ liveStatus: 'agent_harness mode:"connected_host_status"',
650
+ endpointPosture: 'agent_harness mode:"service_posture"',
651
+ operate: 'not exposed',
652
+ },
593
653
  boundary: 'This connected-host surface is intentionally not exposed to the model as an Agent operation.',
594
654
  servicePostureMode: 'Use agent_harness mode:"service_posture" or mode:"service_endpoint" only for read-only endpoint diagnostics.',
595
655
  statusMode: 'Use agent_harness mode:"connected_host_status" only for read-only readiness diagnostics.',
@@ -636,10 +696,21 @@ export function connectedHostSummary(
636
696
  ownership: 'external-connected-host',
637
697
  lifecycle: 'GoodVibes Agent can use public connected-host operator routes, but does not start, stop, restart, install, expose, or mutate the host listener.',
638
698
  modes: {
639
- servicePosture: 'service_posture/service_endpoint',
640
- operatorMethods: 'operator_methods/operator_method',
641
- liveStatus: 'connected_host_status',
642
- capabilityDetail: 'connected_host_capability',
699
+ servicePosture: agentHarnessModes('service_posture', 'service_endpoint'),
700
+ operatorMethods: agentHarnessModes('operator_methods', 'operator_method'),
701
+ liveStatus: agentHarnessModes('connected_host_status'),
702
+ capabilityDetail: agentHarnessModes('connected_host_capability'),
703
+ daemonAliases: agentHarnessModes('daemon', 'daemon_status'),
704
+ },
705
+ modelRoute: 'agent_harness mode:"connected_host" or mode:"connected_host_capability"',
706
+ modelAccess: {
707
+ inventory: 'agent_harness mode:"connected_host" includeParameters:true',
708
+ liveStatus: 'agent_harness mode:"connected_host_status"',
709
+ capabilityDetail: 'agent_harness mode:"connected_host_capability" capabilityId:"..."',
710
+ servicePosture: 'agent_harness mode:"service_posture"',
711
+ daemonAliases: 'agent_harness mode:"daemon" or mode:"daemon_status"',
712
+ daemonStatusAlias: 'agent_harness mode:"daemon_status"',
713
+ lifecycleBlocked: 'start, stop, restart, install, upgrade, expose-listener, and listener mutation are not exposed through Agent.',
643
714
  },
644
715
  counts: {
645
716
  routeFamilies: routeFamilies.length,
@@ -660,22 +731,54 @@ export function blockedConnectedHostCapabilities(): readonly Record<string, unkn
660
731
  {
661
732
  id: 'connected-host-lifecycle',
662
733
  blocked: ['start', 'stop', 'restart', 'install', 'upgrade', 'expose-listener', 'mutate-listener'],
734
+ modelRoute: blockedConnectedHostModelRoute(),
735
+ harnessRoute: 'agent_harness mode:"connected_host_capability"',
736
+ modelAccess: {
737
+ inspectCapability: 'agent_harness mode:"connected_host_capability"',
738
+ liveStatus: 'agent_harness mode:"connected_host_status"',
739
+ endpointPosture: 'agent_harness mode:"service_posture"',
740
+ operate: 'not exposed',
741
+ },
663
742
  reason: 'The connected host and listener are externally owned by GoodVibes; Agent can use public operator routes but not manage hosting.',
664
743
  },
665
744
  {
666
745
  id: 'non-agent-knowledge',
667
746
  blocked: ['default-knowledge', 'non-agent-knowledge-segments', 'fallback-knowledge'],
747
+ modelRoute: blockedConnectedHostModelRoute(),
748
+ harnessRoute: 'agent_harness mode:"connected_host_capability"',
749
+ modelAccess: {
750
+ inspectCapability: 'agent_harness mode:"connected_host_capability"',
751
+ allowedAgentKnowledge: 'agent_knowledge or agent_knowledge_ingest',
752
+ liveStatus: 'agent_harness mode:"connected_host_status"',
753
+ operate: 'not exposed',
754
+ },
668
755
  reason: 'Agent model tools must stay inside the isolated Agent Knowledge route family.',
669
756
  },
670
757
  {
671
758
  id: 'hidden-background-work',
672
759
  blocked: ['separate-agent-jobs', 'implicit-delegated-review', 'local-schedulers'],
760
+ modelRoute: blockedConnectedHostModelRoute(),
761
+ harnessRoute: 'agent_harness mode:"connected_host_capability"',
762
+ modelAccess: {
763
+ inspectCapability: 'agent_harness mode:"connected_host_capability"',
764
+ allowedDelegation: 'agent_harness mode:"delegation_posture"',
765
+ liveStatus: 'agent_harness mode:"connected_host_status"',
766
+ operate: 'not exposed',
767
+ },
673
768
  reason: 'All model work is serial and visible unless the user explicitly requests delegation through an exposed surface.',
674
769
  },
675
770
  {
676
771
  id: 'arbitrary-connected-host-mutations',
677
772
  blocked: ['route-discovery-mutation', 'account-creation', 'automation-definition-creation'],
678
- reason: 'Only the documented allowlisted model tools and slash-command bridges are exposed.',
773
+ modelRoute: blockedConnectedHostModelRoute(),
774
+ harnessRoute: 'agent_harness mode:"connected_host_capability"',
775
+ modelAccess: {
776
+ inspectCapability: 'agent_harness mode:"connected_host_capability"',
777
+ allowedActions: 'agent_operator_action for documented allowlisted mutations only',
778
+ liveStatus: 'agent_harness mode:"connected_host_status"',
779
+ operate: 'not exposed',
780
+ },
781
+ reason: 'Only the documented allowlisted model tools and slash-command routes are exposed.',
679
782
  },
680
783
  ];
681
784
  }