@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
|
@@ -4,6 +4,8 @@ import { AGENT_WORKSPACE_CATEGORIES } from '../input/agent-workspace-categories.
|
|
|
4
4
|
import { searchAgentWorkspaceActions } from '../input/agent-workspace-search.ts';
|
|
5
5
|
import { buildAgentWorkspaceRuntimeSnapshot } from '../input/agent-workspace-snapshot.ts';
|
|
6
6
|
import type { AgentWorkspaceAction, AgentWorkspaceCategory, AgentWorkspaceEditorKind, AgentWorkspaceLocalEditor, AgentWorkspaceLocalLibraryItem, AgentWorkspaceRuntimeSnapshot } from '../input/agent-workspace-types.ts';
|
|
7
|
+
import { parseSlashCommand } from '../input/slash-command-parser.ts';
|
|
8
|
+
import { describeCommandPolicy } from './agent-harness-metadata.ts';
|
|
7
9
|
import { describeLocalWorkspaceModelExecution } from './agent-harness-local-operations.ts';
|
|
8
10
|
import { describeWorkspaceEditorModelExecution } from './agent-harness-workspace-editor-execution.ts';
|
|
9
11
|
|
|
@@ -97,9 +99,66 @@ export function describeWorkspaceEditor(editor: AgentWorkspaceLocalEditor): Reco
|
|
|
97
99
|
};
|
|
98
100
|
}
|
|
99
101
|
|
|
100
|
-
function previewText(value: string, maxLength =
|
|
102
|
+
function previewText(value: string, maxLength = 56): string {
|
|
101
103
|
const normalized = value.replace(/\s+/g, ' ').trim();
|
|
102
|
-
return normalized.length <= maxLength ? normalized : `${normalized.slice(0, maxLength -
|
|
104
|
+
return normalized.length <= maxLength ? normalized : `${normalized.slice(0, maxLength - 3).trimEnd()}...`;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function commandRouteHint(command: string): string {
|
|
108
|
+
const parsed = parseSlashCommand(command);
|
|
109
|
+
const commandName = parsed.name || command.replace(/^\//, '').trim().split(/\s+/)[0] || command;
|
|
110
|
+
return describeCommandPolicy(commandName).preferredModelTool ?? 'agent_harness mode:"run_command"';
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function editorRouteHint(editorKind: AgentWorkspaceEditorKind): string {
|
|
114
|
+
if (
|
|
115
|
+
editorKind === 'memory'
|
|
116
|
+
|| editorKind === 'note'
|
|
117
|
+
|| editorKind === 'persona'
|
|
118
|
+
|| editorKind === 'skill'
|
|
119
|
+
|| editorKind === 'routine'
|
|
120
|
+
) return 'agent_local_registry';
|
|
121
|
+
if (
|
|
122
|
+
editorKind === 'knowledge-url'
|
|
123
|
+
|| editorKind === 'knowledge-urls'
|
|
124
|
+
|| editorKind === 'knowledge-file'
|
|
125
|
+
|| editorKind === 'knowledge-bookmarks'
|
|
126
|
+
|| editorKind === 'knowledge-browser-history'
|
|
127
|
+
|| editorKind === 'knowledge-connector-ingest'
|
|
128
|
+
) return 'agent_knowledge_ingest';
|
|
129
|
+
if (
|
|
130
|
+
editorKind === 'knowledge-reindex'
|
|
131
|
+
|| editorKind === 'knowledge-review-issue'
|
|
132
|
+
|| editorKind === 'knowledge-consolidate'
|
|
133
|
+
) return 'agent_harness mode:"run_workspace_action"';
|
|
134
|
+
if (editorKind.startsWith('knowledge-')) return 'agent_knowledge';
|
|
135
|
+
if (editorKind === 'web-research' || editorKind === 'web-fetch') return 'main conversation prompt';
|
|
136
|
+
if (editorKind === 'media-generate') return 'agent_media_generate';
|
|
137
|
+
if (editorKind === 'channel-send') return 'agent_channel_send';
|
|
138
|
+
if (editorKind === 'notify-send' || editorKind === 'notify-webhook-test') return 'agent_notify';
|
|
139
|
+
if (editorKind === 'reminder-schedule') return 'agent_reminder_schedule';
|
|
140
|
+
if (
|
|
141
|
+
editorKind.startsWith('approval-')
|
|
142
|
+
|| editorKind.startsWith('automation-')
|
|
143
|
+
|| editorKind === 'schedule-run'
|
|
144
|
+
) return 'agent_operator_action';
|
|
145
|
+
if (editorKind.startsWith('workplan-') || editorKind.startsWith('plan-') || editorKind.startsWith('task-')) return 'agent_work_plan';
|
|
146
|
+
return 'agent_harness mode:"run_workspace_action"';
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function localActionRouteHint(action: AgentWorkspaceAction): string {
|
|
150
|
+
const modelExecution = describeLocalWorkspaceModelExecution(action);
|
|
151
|
+
const tool = modelExecution && typeof modelExecution.tool === 'string' ? modelExecution.tool : '';
|
|
152
|
+
return tool || 'agent_local_registry';
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function workspaceActionRouteHint(action: AgentWorkspaceAction): string {
|
|
156
|
+
if (action.command) return commandRouteHint(action.command);
|
|
157
|
+
if (action.editorKind) return editorRouteHint(action.editorKind);
|
|
158
|
+
if (action.kind === 'local-selection' || action.kind === 'local-operation') return localActionRouteHint(action);
|
|
159
|
+
if (action.targetCategoryId || action.kind === 'workspace') return 'agent_harness mode:"open_ui_surface"';
|
|
160
|
+
if (action.kind === 'guidance') return action.safety === 'blocked' ? 'main conversation policy' : 'main conversation';
|
|
161
|
+
return 'agent_harness mode:"workspace_action"';
|
|
103
162
|
}
|
|
104
163
|
|
|
105
164
|
function selectedRoutineFromArgs(
|
|
@@ -152,6 +211,7 @@ export function describeWorkspaceAction(
|
|
|
152
211
|
detail: action.detail,
|
|
153
212
|
kind: action.kind,
|
|
154
213
|
safety: action.safety,
|
|
214
|
+
modelRoute: previewText(workspaceActionRouteHint(action)),
|
|
155
215
|
...(action.command ? { command: action.command } : {}),
|
|
156
216
|
...(action.targetCategoryId ? { targetCategoryId: action.targetCategoryId } : {}),
|
|
157
217
|
...(action.editorKind ? { editorKind: action.editorKind } : {}),
|
|
@@ -181,6 +241,7 @@ function describeWorkspaceActionSummary(
|
|
|
181
241
|
summary: previewText(action.detail),
|
|
182
242
|
kind: action.kind,
|
|
183
243
|
safety: action.safety,
|
|
244
|
+
modelRoute: previewText(workspaceActionRouteHint(action)),
|
|
184
245
|
...(action.command ? { command: action.command } : {}),
|
|
185
246
|
...(action.targetCategoryId ? { targetCategoryId: action.targetCategoryId } : {}),
|
|
186
247
|
...(action.editorKind ? { editorKind: action.editorKind } : {}),
|
|
@@ -195,7 +256,7 @@ export function listWorkspaceActions(
|
|
|
195
256
|
): readonly Record<string, unknown>[] {
|
|
196
257
|
const query = readString(args.query);
|
|
197
258
|
const categoryId = readString(args.categoryId || args.category);
|
|
198
|
-
const limit = readLimit(args.limit,
|
|
259
|
+
const limit = readLimit(args.limit, 500);
|
|
199
260
|
const includeEditor = args.includeParameters === true;
|
|
200
261
|
const editorContext = includeEditor ? buildWorkspaceEditorContext(context, args) : null;
|
|
201
262
|
const source = query
|
|
@@ -326,7 +326,7 @@ export function createAgentKnowledgeIngestTool(
|
|
|
326
326
|
},
|
|
327
327
|
allowPrivateHosts: {
|
|
328
328
|
type: 'boolean',
|
|
329
|
-
description: 'Allow private-host source URLs
|
|
329
|
+
description: 'Allow supported private-host source URLs.',
|
|
330
330
|
},
|
|
331
331
|
confirm: {
|
|
332
332
|
type: 'boolean',
|
|
@@ -142,7 +142,7 @@ export function createAgentKnowledgeTool(
|
|
|
142
142
|
},
|
|
143
143
|
connectorId: {
|
|
144
144
|
type: 'string',
|
|
145
|
-
description: 'Connector id for
|
|
145
|
+
description: 'Connector id for connector or connector_doctor.',
|
|
146
146
|
},
|
|
147
147
|
limit: {
|
|
148
148
|
type: 'number',
|
|
@@ -74,11 +74,11 @@ export function createAgentMediaGenerateTool(
|
|
|
74
74
|
},
|
|
75
75
|
confirm: {
|
|
76
76
|
type: 'boolean',
|
|
77
|
-
description: 'Required true only when
|
|
77
|
+
description: 'Required true only when user requested this media.',
|
|
78
78
|
},
|
|
79
79
|
explicitUserRequest: {
|
|
80
80
|
type: 'string',
|
|
81
|
-
description: '
|
|
81
|
+
description: 'User request authorizing this media generation.',
|
|
82
82
|
},
|
|
83
83
|
},
|
|
84
84
|
required: ['prompt', 'confirm', 'explicitUserRequest'],
|
|
@@ -88,7 +88,7 @@ export function createAgentNotifyTool(
|
|
|
88
88
|
},
|
|
89
89
|
confirm: {
|
|
90
90
|
type: 'boolean',
|
|
91
|
-
description: 'Required true only when
|
|
91
|
+
description: 'Required true only when user requested notification.',
|
|
92
92
|
},
|
|
93
93
|
explicitUserRequest: {
|
|
94
94
|
type: 'string',
|
|
@@ -175,7 +175,7 @@ export function createAgentReminderScheduleTool(
|
|
|
175
175
|
},
|
|
176
176
|
confirm: {
|
|
177
177
|
type: 'boolean',
|
|
178
|
-
description: 'Required true only when
|
|
178
|
+
description: 'Required true only when user requested reminder.',
|
|
179
179
|
},
|
|
180
180
|
explicitUserRequest: {
|
|
181
181
|
type: 'string',
|
|
@@ -0,0 +1,76 @@
|
|
|
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 = 56;
|
|
5
|
+
|
|
6
|
+
const TOOL_DESCRIPTION_OVERRIDES: Readonly<Record<string, string>> = {
|
|
7
|
+
agent: 'Inspect explicit subagent tasks.',
|
|
8
|
+
analyze: 'Analyze code impact, symbols, and project risk.',
|
|
9
|
+
channel: 'Inspect or operate configured channel surfaces.',
|
|
10
|
+
control: 'Inspect commands, panels, and runtime posture.',
|
|
11
|
+
edit: 'Edit files with exact, fuzzy, or regex replacements.',
|
|
12
|
+
exec: 'Run shell commands with timeout and retry.',
|
|
13
|
+
fetch: 'Fetch HTTP URLs with auth and sanitization.',
|
|
14
|
+
find: 'Search files, content, symbols, and project structure.',
|
|
15
|
+
goodvibes_context: 'Inspect current GoodVibes runtime and host harness.',
|
|
16
|
+
goodvibes_settings: 'Inspect/update GoodVibes settings on explicit request.',
|
|
17
|
+
inspect: 'Inspect project structure, APIs, routes, and deps.',
|
|
18
|
+
mcp: 'Inspect MCP servers, tools, schemas, and trust state.',
|
|
19
|
+
packet: 'Manage implementation and execution packets.',
|
|
20
|
+
query: 'Track operator queries, answers, and closure.',
|
|
21
|
+
read: 'Read files, outlines, symbols, and ranges.',
|
|
22
|
+
registry: 'Discover local skills, agents, tools, and templates.',
|
|
23
|
+
remote: 'Manage remote runner pools and artifacts.',
|
|
24
|
+
repl: 'Evaluate bounded JS, TS, Python, SQL, or GraphQL.',
|
|
25
|
+
state: 'Read/update session state and diagnostics.',
|
|
26
|
+
task: 'Manage cross-session tasks and handoffs.',
|
|
27
|
+
team: 'Manage team definitions, roles, and lanes.',
|
|
28
|
+
web_search: 'Search the web through the configured provider.',
|
|
29
|
+
workflow: 'Inspect/control configured workflow automation.',
|
|
30
|
+
worklist: 'Manage durable worklists and checklist items.',
|
|
31
|
+
write: 'Write files with batch, mkdir, backup, and validation.',
|
|
32
|
+
agent_harness: 'Harness catalog: modes, settings, commands, UI, tools.',
|
|
33
|
+
agent_knowledge: 'Read isolated Agent Knowledge.',
|
|
34
|
+
agent_knowledge_ingest: 'Ingest confirmed source into Agent Knowledge.',
|
|
35
|
+
agent_local_registry: 'Inspect/update Agent memory, notes, skills, routines.',
|
|
36
|
+
agent_work_plan: 'Inspect/update the visible Agent-local work plan.',
|
|
37
|
+
agent_operator_briefing: 'Read connected Agent operator state.',
|
|
38
|
+
agent_operator_action: 'Run one confirmed allowlisted operator action.',
|
|
39
|
+
agent_reminder_schedule: 'Schedule one confirmed Agent reminder.',
|
|
40
|
+
agent_channel_send: 'Send confirmed message to configured Agent target.',
|
|
41
|
+
agent_notify: 'Send one confirmed plain-text notification.',
|
|
42
|
+
agent_media_generate: 'Generate one confirmed image or video artifact.',
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
function compactText(value: string, limit: number): string {
|
|
46
|
+
const normalized = value.replace(/\s+/g, ' ').trim();
|
|
47
|
+
if (normalized.length <= limit) return normalized;
|
|
48
|
+
if (limit <= 3) return normalized.slice(0, limit);
|
|
49
|
+
return `${normalized.slice(0, limit - 3).trimEnd()}...`;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function stripSchemaDescriptions(value: unknown): unknown {
|
|
53
|
+
if (Array.isArray(value)) return value.map(stripSchemaDescriptions);
|
|
54
|
+
if (!value || typeof value !== 'object') return value;
|
|
55
|
+
|
|
56
|
+
const result: Record<string, unknown> = {};
|
|
57
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
58
|
+
if (key === 'description') continue;
|
|
59
|
+
result[key] = stripSchemaDescriptions(entry);
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function compactToolDefinition(definition: ToolDefinition): void {
|
|
65
|
+
definition.description = compactText(
|
|
66
|
+
TOOL_DESCRIPTION_OVERRIDES[definition.name] ?? definition.description,
|
|
67
|
+
DEFAULT_TOOL_DESCRIPTION_LIMIT,
|
|
68
|
+
);
|
|
69
|
+
definition.parameters = stripSchemaDescriptions(definition.parameters) as Record<string, unknown>;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function compactRegisteredToolDefinitions(toolRegistry: ToolRegistry): void {
|
|
73
|
+
for (const definition of toolRegistry.getToolDefinitions()) {
|
|
74
|
+
compactToolDefinition(definition);
|
|
75
|
+
}
|
|
76
|
+
}
|
package/src/version.ts
CHANGED
|
@@ -6,20 +6,14 @@ 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.
|
|
10
|
-
let _sdkVersion = '0.33.36';
|
|
9
|
+
let _version = '1.0.36';
|
|
11
10
|
try {
|
|
12
11
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8')) as {
|
|
13
12
|
readonly version?: unknown;
|
|
14
|
-
readonly dependencies?: Record<string, unknown>;
|
|
15
|
-
readonly devDependencies?: Record<string, unknown>;
|
|
16
13
|
};
|
|
17
14
|
_version = typeof pkg.version === 'string' ? pkg.version : _version;
|
|
18
|
-
const packageSdkVersion = pkg.dependencies?.['@pellux/goodvibes-sdk'] ?? pkg.devDependencies?.['@pellux/goodvibes-sdk'];
|
|
19
|
-
_sdkVersion = typeof packageSdkVersion === 'string' ? packageSdkVersion : _sdkVersion;
|
|
20
15
|
} catch {
|
|
21
|
-
// Compiled binary or missing package.json
|
|
16
|
+
// Compiled binary or missing package.json - use fallback.
|
|
22
17
|
}
|
|
23
18
|
|
|
24
19
|
export const VERSION = _version;
|
|
25
|
-
export const SDK_VERSION = _sdkVersion;
|