@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.
- package/CHANGELOG.md +28 -13
- package/README.md +11 -8
- package/dist/package/main.js +1592 -921
- package/docs/README.md +6 -5
- package/docs/channels-remote-and-api.md +3 -3
- package/docs/connected-host.md +3 -3
- package/docs/getting-started.md +20 -12
- package/docs/knowledge-artifacts-and-multimodal.md +9 -4
- package/docs/project-planning.md +3 -3
- package/docs/providers-and-routing.md +2 -2
- package/docs/release-and-publishing.md +8 -8
- package/docs/tools-and-commands.md +34 -17
- package/docs/voice-and-live-tts.md +1 -1
- package/package.json +1 -1
- package/release/live-verification/live-verification.json +15 -15
- package/release/live-verification/live-verification.md +19 -21
- package/release/release-notes.md +6 -6
- package/release/release-readiness.json +64 -64
- package/src/agent/harness-control.ts +35 -9
- package/src/agent/reminder-schedule-format.ts +2 -5
- package/src/agent/reminder-schedule.ts +4 -11
- package/src/agent/routine-schedule-format.ts +3 -6
- package/src/agent/routine-schedule-promotion.ts +5 -14
- package/src/agent/routine-schedule-receipts.ts +4 -9
- package/src/cli/agent-knowledge-command.ts +6 -11
- package/src/cli/agent-knowledge-format.ts +4 -9
- package/src/cli/agent-knowledge-runtime.ts +7 -14
- package/src/cli/external-runtime.ts +3 -46
- package/src/cli/help.ts +2 -2
- package/src/cli/status.ts +6 -7
- package/src/input/agent-workspace-categories.ts +23 -23
- package/src/input/agent-workspace-channels.ts +3 -3
- package/src/input/agent-workspace-operations-command-editors.ts +1 -1
- package/src/input/command-registry.ts +1 -1
- package/src/input/commands/compat-runtime.ts +1 -1
- package/src/input/commands/planning-runtime.ts +1 -1
- package/src/input/commands/runtime-services.ts +1 -1
- package/src/input/mcp-workspace.ts +1 -1
- package/src/input/submission-router.ts +1 -1
- package/src/panels/builtin/shared.ts +1 -1
- package/src/panels/project-planning-panel.ts +4 -4
- package/src/panels/qr-panel.ts +2 -2
- package/src/renderer/conversation-overlays.ts +1 -0
- package/src/runtime/bootstrap-command-parts.ts +1 -1
- package/src/runtime/bootstrap-core.ts +3 -1
- package/src/runtime/bootstrap-hook-bridge.ts +1 -1
- package/src/runtime/bootstrap-shell.ts +1 -1
- package/src/runtime/bootstrap.ts +7 -4
- package/src/runtime/context.ts +2 -2
- package/src/runtime/index.ts +88 -5
- package/src/runtime/store/state.ts +1 -1
- package/src/tools/agent-channel-send-tool.ts +1 -1
- package/src/tools/agent-harness-channel-metadata.ts +36 -25
- package/src/tools/agent-harness-cli-metadata.ts +19 -1
- package/src/tools/agent-harness-command-catalog.ts +15 -4
- package/src/tools/agent-harness-connected-host-status.ts +7 -6
- package/src/tools/agent-harness-delegation-posture.ts +15 -4
- package/src/tools/agent-harness-keybinding-metadata.ts +67 -16
- package/src/tools/agent-harness-mcp-metadata.ts +11 -3
- package/src/tools/agent-harness-media-posture.ts +25 -14
- package/src/tools/agent-harness-metadata.ts +140 -37
- package/src/tools/agent-harness-mode-catalog.ts +258 -0
- package/src/tools/agent-harness-model-routing.ts +18 -3
- package/src/tools/agent-harness-model-tool-catalog.ts +85 -7
- package/src/tools/agent-harness-notification-metadata.ts +30 -19
- package/src/tools/agent-harness-operator-methods.ts +15 -10
- package/src/tools/agent-harness-pairing-posture.ts +17 -5
- package/src/tools/agent-harness-panel-metadata.ts +10 -4
- package/src/tools/agent-harness-provider-account-metadata.ts +46 -35
- package/src/tools/agent-harness-release-evidence.ts +31 -3
- package/src/tools/agent-harness-release-readiness.ts +30 -0
- package/src/tools/agent-harness-security-posture.ts +18 -4
- package/src/tools/agent-harness-service-posture.ts +9 -2
- package/src/tools/agent-harness-session-metadata.ts +24 -8
- package/src/tools/agent-harness-setup-posture.ts +32 -21
- package/src/tools/agent-harness-text.ts +6 -0
- package/src/tools/agent-harness-tool-schema.ts +1 -1
- package/src/tools/agent-harness-tool.ts +38 -36
- package/src/tools/agent-harness-ui-surface-metadata.ts +105 -101
- package/src/tools/agent-harness-workspace-actions.ts +64 -3
- package/src/tools/agent-knowledge-ingest-tool.ts +1 -1
- package/src/tools/agent-knowledge-tool.ts +1 -1
- package/src/tools/agent-media-generate-tool.ts +2 -2
- package/src/tools/agent-notify-tool.ts +1 -1
- package/src/tools/agent-reminder-schedule-tool.ts +1 -1
- package/src/tools/tool-definition-compaction.ts +76 -0
- 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: '
|
|
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: '
|
|
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' ? '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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'
|
|
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: '
|
|
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'
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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' ? '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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,
|
|
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'
|
|
334
|
-
|
|
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' : '
|
|
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' ? '
|
|
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: '
|
|
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'
|
|
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,
|
|
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
|
|
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
|
|
640
|
-
operatorMethods: 'operator_methods
|
|
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
|
-
|
|
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
|
}
|