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