@pellux/goodvibes-agent 1.0.34 → 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 +13 -4
- package/README.md +5 -3
- 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 +48488 -49984
- package/docs/README.md +2 -2
- package/docs/getting-started.md +11 -8
- package/docs/release-and-publishing.md +1 -1
- package/docs/tools-and-commands.md +5 -1
- 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 +2 -2
- package/release/release-readiness.json +33 -33
- package/src/runtime/bootstrap-core.ts +2 -0
- package/src/runtime/bootstrap.ts +2 -0
- package/src/tools/agent-harness-media-posture.ts +1 -1
- package/src/tools/agent-harness-metadata.ts +44 -32
- package/src/tools/agent-harness-mode-catalog.ts +205 -0
- package/src/tools/agent-harness-operator-methods.ts +2 -2
- package/src/tools/agent-harness-service-posture.ts +1 -1
- package/src/tools/agent-harness-setup-posture.ts +1 -1
- package/src/tools/agent-harness-tool-schema.ts +1 -1
- package/src/tools/agent-harness-tool.ts +14 -4
- package/src/tools/agent-harness-ui-surface-metadata.ts +21 -17
- package/src/tools/tool-definition-compaction.ts +49 -0
- package/src/version.ts +1 -1
|
@@ -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;
|
|
@@ -163,7 +167,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
|
|
|
163
167
|
kind: 'workspace',
|
|
164
168
|
summary: 'Fullscreen operator workspace with setup, knowledge, local state, channels, automation, and delegation routes.',
|
|
165
169
|
command: '/agent',
|
|
166
|
-
preferredModelRoute:
|
|
170
|
+
preferredModelRoute: `Use ${agentHarnessModes('workspace_actions', 'workspace_action', 'run_workspace_action')} for model operation; use mode:"open_ui_surface" only to visibly navigate.`,
|
|
167
171
|
parameters: ['categoryId'],
|
|
168
172
|
available: (context) => typeof context.openAgentWorkspace === 'function',
|
|
169
173
|
open: (context, args) => {
|
|
@@ -180,7 +184,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
|
|
|
180
184
|
kind: 'picker',
|
|
181
185
|
summary: 'Keyboard-accessible operator panel route that now opens the Agent Workspace home surface.',
|
|
182
186
|
command: 'Ctrl+P',
|
|
183
|
-
preferredModelRoute:
|
|
187
|
+
preferredModelRoute: `Use ${agentHarnessModes('panels', 'panel', 'open_panel')} for panel catalog and routing, or mode:"workspace_actions" for concrete model operation.`,
|
|
184
188
|
available: (context) => typeof context.openPanelPicker === 'function' || typeof context.openAgentWorkspace === 'function',
|
|
185
189
|
open: (context) => {
|
|
186
190
|
const surface = findSurfaceById('panel-picker')!;
|
|
@@ -197,7 +201,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
|
|
|
197
201
|
kind: 'workspace',
|
|
198
202
|
summary: 'Security review operator surface for token posture, MCP attack paths, policy posture, and plugin risk.',
|
|
199
203
|
command: '/security',
|
|
200
|
-
preferredModelRoute:
|
|
204
|
+
preferredModelRoute: `Use mode:"workspace_actions" for security review actions or ${agentHarnessModes('run_command')} for confirmed /security review output.`,
|
|
201
205
|
parameters: ['pane'],
|
|
202
206
|
available: (context) => (
|
|
203
207
|
typeof context.openAgentWorkspace === 'function'
|
|
@@ -219,7 +223,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
|
|
|
219
223
|
kind: 'workspace',
|
|
220
224
|
summary: 'Agent Knowledge operator surface for isolated status, source/node/issue libraries, item lookup, map review, connectors, ask/search, and ingest forms.',
|
|
221
225
|
command: '/knowledge',
|
|
222
|
-
preferredModelRoute:
|
|
226
|
+
preferredModelRoute: `Use agent_knowledge, agent_knowledge_ingest, mode:"workspace_actions", or ${agentHarnessModes('run_command')} for confirmed /knowledge operation.`,
|
|
223
227
|
parameters: ['pane'],
|
|
224
228
|
available: (context) => (
|
|
225
229
|
typeof context.openAgentWorkspace === 'function'
|
|
@@ -241,7 +245,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
|
|
|
241
245
|
kind: 'workspace',
|
|
242
246
|
summary: 'Provider subscription operator surface for subscription review, provider inspection, login, logout, and bundle flows.',
|
|
243
247
|
command: '/subscription',
|
|
244
|
-
preferredModelRoute:
|
|
248
|
+
preferredModelRoute: `Use mode:"workspace_actions" or ${agentHarnessModes('run_command')} for confirmed /subscription mirrors.`,
|
|
245
249
|
parameters: ['pane'],
|
|
246
250
|
available: (context) => (
|
|
247
251
|
typeof context.openAgentWorkspace === 'function'
|
|
@@ -263,7 +267,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
|
|
|
263
267
|
kind: 'modal',
|
|
264
268
|
summary: 'Fullscreen settings workspace for Agent-owned configuration, subscriptions, secrets, MCP, tools, and surface settings.',
|
|
265
269
|
command: '/settings',
|
|
266
|
-
preferredModelRoute:
|
|
270
|
+
preferredModelRoute: `Use ${agentHarnessModes('settings', 'get_setting', 'set_setting', 'reset_setting')} for model operation; use mode:"open_ui_surface" only to visibly navigate.`,
|
|
267
271
|
parameters: ['target', 'key', 'prefix'],
|
|
268
272
|
available: (context) => typeof context.openSettingsModal === 'function',
|
|
269
273
|
open: (context, args) => {
|
|
@@ -280,7 +284,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
|
|
|
280
284
|
kind: 'workspace',
|
|
281
285
|
summary: 'MCP server setup, trust posture, and tool inventory workspace.',
|
|
282
286
|
command: '/mcp',
|
|
283
|
-
preferredModelRoute:
|
|
287
|
+
preferredModelRoute: `Use ${agentHarnessModes('workspace_actions', 'tools', 'settings')} for model operation.`,
|
|
284
288
|
available: (context) => typeof context.openMcpWorkspace === 'function',
|
|
285
289
|
open: (context) => {
|
|
286
290
|
const surface = findSurfaceById('mcp-workspace')!;
|
|
@@ -295,7 +299,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
|
|
|
295
299
|
kind: 'picker',
|
|
296
300
|
summary: 'Interactive model picker for main, helper, tool, and TTS model routes.',
|
|
297
301
|
command: '/model',
|
|
298
|
-
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.`,
|
|
299
303
|
parameters: ['target'],
|
|
300
304
|
available: (context) => typeof context.openModelPicker === 'function' || typeof context.openModelPickerWithTarget === 'function',
|
|
301
305
|
open: (context, args) => {
|
|
@@ -316,7 +320,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
|
|
|
316
320
|
kind: 'picker',
|
|
317
321
|
summary: 'Interactive provider picker for model route setup.',
|
|
318
322
|
command: '/provider',
|
|
319
|
-
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.`,
|
|
320
324
|
parameters: ['target'],
|
|
321
325
|
available: (context) => typeof context.openProviderPicker === 'function' || typeof context.openProviderModelPickerWithTarget === 'function',
|
|
322
326
|
open: (context, args) => {
|
|
@@ -337,7 +341,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
|
|
|
337
341
|
kind: 'picker',
|
|
338
342
|
summary: 'Interactive reasoning-effort selector for the current main chat model when that model exposes effort levels.',
|
|
339
343
|
command: '/effort',
|
|
340
|
-
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.`,
|
|
341
345
|
available: (context) => typeof context.openReasoningEffortPicker === 'function',
|
|
342
346
|
open: (context) => {
|
|
343
347
|
const surface = findSurfaceById('reasoning-effort-picker')!;
|
|
@@ -365,7 +369,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
|
|
|
365
369
|
kind: 'picker',
|
|
366
370
|
summary: 'Interactive streaming TTS provider picker opened from the Agent settings flow.',
|
|
367
371
|
command: '/config tts.provider',
|
|
368
|
-
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.`,
|
|
369
373
|
available: (context) => typeof context.openSelection === 'function' && Boolean(context.platform.voiceProviderRegistry),
|
|
370
374
|
open: (context) => {
|
|
371
375
|
const surface = findSurfaceById('tts-provider-picker')!;
|
|
@@ -380,7 +384,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
|
|
|
380
384
|
kind: 'picker',
|
|
381
385
|
summary: 'Interactive TTS voice picker opened from the Agent settings flow for the selected or supplied provider.',
|
|
382
386
|
command: '/config tts.voice',
|
|
383
|
-
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.`,
|
|
384
388
|
parameters: ['target'],
|
|
385
389
|
available: (context) => typeof context.openSelection === 'function' && Boolean(context.platform.voiceService),
|
|
386
390
|
open: async (context, args) => {
|
|
@@ -540,7 +544,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
|
|
|
540
544
|
kind: 'overlay',
|
|
541
545
|
summary: 'Slash-command autocomplete route opened by the same shell path as typing / in an empty prompt.',
|
|
542
546
|
command: '/',
|
|
543
|
-
preferredModelRoute:
|
|
547
|
+
preferredModelRoute: `Use ${agentHarnessModes('commands', 'command')} for model-readable command discovery and mode:"run_command" for confirmed command execution.`,
|
|
544
548
|
parameters: ['query', 'prefix', 'key'],
|
|
545
549
|
available: (context) => typeof context.openSlashCommandMode === 'function',
|
|
546
550
|
open: (context, args) => {
|
|
@@ -565,7 +569,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
|
|
|
565
569
|
kind: 'picker',
|
|
566
570
|
summary: 'Registry-driven searchable slash-command browser opened by /commands and /help.',
|
|
567
571
|
command: '/commands',
|
|
568
|
-
preferredModelRoute:
|
|
572
|
+
preferredModelRoute: `Use ${agentHarnessModes('commands', 'command')} for model-readable slash-command discovery and mode:"run_command" for confirmed command execution.`,
|
|
569
573
|
available: (context) => typeof context.executeCommand === 'function',
|
|
570
574
|
open: async (context) => {
|
|
571
575
|
const surface = findSurfaceById('command-browser')!;
|
|
@@ -628,7 +632,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
|
|
|
628
632
|
kind: 'overlay',
|
|
629
633
|
summary: 'Registry-driven command and shortcut help overlay.',
|
|
630
634
|
command: '/help',
|
|
631
|
-
preferredModelRoute:
|
|
635
|
+
preferredModelRoute: `Use ${agentHarnessModes('commands', 'command', 'shortcuts')} for model-readable discovery.`,
|
|
632
636
|
available: (context) => typeof context.openHelpOverlay === 'function',
|
|
633
637
|
open: (context) => {
|
|
634
638
|
const surface = findSurfaceById('help-overlay')!;
|
|
@@ -643,7 +647,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
|
|
|
643
647
|
kind: 'overlay',
|
|
644
648
|
summary: 'Keyboard shortcut reference overlay.',
|
|
645
649
|
command: '/shortcuts',
|
|
646
|
-
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.`,
|
|
647
651
|
available: (context) => typeof context.openShortcutsOverlay === 'function',
|
|
648
652
|
open: (context) => {
|
|
649
653
|
const surface = findSurfaceById('shortcuts-overlay')!;
|
|
@@ -658,7 +662,7 @@ const UI_SURFACES: readonly UiSurfaceDefinition[] = [
|
|
|
658
662
|
kind: 'modal',
|
|
659
663
|
summary: 'First-run and setup review wizard for Agent readiness.',
|
|
660
664
|
command: '/setup',
|
|
661
|
-
preferredModelRoute:
|
|
665
|
+
preferredModelRoute: `Use ${agentHarnessModes('workspace_actions', 'settings')} for concrete setup operation.`,
|
|
662
666
|
parameters: ['target=new|edit|reopen'],
|
|
663
667
|
available: (context) => typeof context.openOnboardingWizard === 'function',
|
|
664
668
|
open: (context, args) => {
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ToolRegistry } from '@pellux/goodvibes-sdk/platform/tools';
|
|
2
|
+
import type { ToolDefinition } from '@pellux/goodvibes-sdk/platform/types';
|
|
3
|
+
|
|
4
|
+
const DEFAULT_TOOL_DESCRIPTION_LIMIT = 120;
|
|
5
|
+
|
|
6
|
+
const TOOL_DESCRIPTION_OVERRIDES: Readonly<Record<string, string>> = {
|
|
7
|
+
agent_harness: 'Harness catalog/control. Start with mode:"modes"; inspect settings, commands, UI, status, tools, and confirmed effects.',
|
|
8
|
+
agent_knowledge: 'Read isolated Agent Knowledge.',
|
|
9
|
+
agent_knowledge_ingest: 'Ingest one confirmed source into isolated Agent Knowledge.',
|
|
10
|
+
agent_local_registry: 'Inspect or update Agent-local memory, notes, personas, skills, bundles, and routines.',
|
|
11
|
+
agent_work_plan: 'Inspect or update the visible Agent-local work plan.',
|
|
12
|
+
agent_operator_briefing: 'Read connected Agent operator state.',
|
|
13
|
+
agent_operator_action: 'Run one confirmed allowlisted operator action.',
|
|
14
|
+
agent_reminder_schedule: 'Schedule one confirmed Agent reminder.',
|
|
15
|
+
agent_channel_send: 'Send one confirmed message through one configured Agent target.',
|
|
16
|
+
agent_notify: 'Send one confirmed plain-text notification.',
|
|
17
|
+
agent_media_generate: 'Generate one confirmed image or video artifact.',
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
function compactText(value: string, limit: number): string {
|
|
21
|
+
const normalized = value.replace(/\s+/g, ' ').trim();
|
|
22
|
+
if (normalized.length <= limit) return normalized;
|
|
23
|
+
if (limit <= 3) return normalized.slice(0, limit);
|
|
24
|
+
return `${normalized.slice(0, limit - 3).trimEnd()}...`;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function stripSchemaDescriptions(value: unknown): unknown {
|
|
28
|
+
if (Array.isArray(value)) return value.map(stripSchemaDescriptions);
|
|
29
|
+
if (!value || typeof value !== 'object') return value;
|
|
30
|
+
|
|
31
|
+
const result: Record<string, unknown> = {};
|
|
32
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
33
|
+
if (key === 'description') continue;
|
|
34
|
+
result[key] = stripSchemaDescriptions(entry);
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function compactToolDefinition(definition: ToolDefinition): void {
|
|
40
|
+
definition.description = TOOL_DESCRIPTION_OVERRIDES[definition.name]
|
|
41
|
+
?? compactText(definition.description, DEFAULT_TOOL_DESCRIPTION_LIMIT);
|
|
42
|
+
definition.parameters = stripSchemaDescriptions(definition.parameters) as Record<string, unknown>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function compactRegisteredToolDefinitions(toolRegistry: ToolRegistry): void {
|
|
46
|
+
for (const definition of toolRegistry.getToolDefinitions()) {
|
|
47
|
+
compactToolDefinition(definition);
|
|
48
|
+
}
|
|
49
|
+
}
|
package/src/version.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { join } from 'node:path';
|
|
|
6
6
|
// The prebuild script updates the fallback value before compilation.
|
|
7
7
|
// Uses import.meta.dir (Bun) to locate package.json relative to this file,
|
|
8
8
|
// which is correct regardless of the process working directory.
|
|
9
|
-
let _version = '1.0.
|
|
9
|
+
let _version = '1.0.35';
|
|
10
10
|
let _sdkVersion = '0.33.36';
|
|
11
11
|
try {
|
|
12
12
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8')) as {
|