@pellux/goodvibes-agent 0.1.19 → 0.1.20
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 +4 -0
- package/package.json +1 -1
- package/src/tools/wrfc-agent-guard.ts +24 -0
- package/src/version.ts +1 -1
package/CHANGELOG.md
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pellux/goodvibes-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.20",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Near-fork GoodVibes operator assistant with the GoodVibes TUI shell, renderer, input, fullscreen workspace, and daemon-connected Agent product brain.",
|
|
6
6
|
"type": "module",
|
|
@@ -153,6 +153,12 @@ const STATE_MUTATION_DENIAL = [
|
|
|
153
153
|
'Use Agent-owned memory, skills, personas, routines, and explicit CLI/slash commands for intentional local state changes.',
|
|
154
154
|
].join(' ');
|
|
155
155
|
|
|
156
|
+
const SETTINGS_MUTATION_DENIAL = [
|
|
157
|
+
'GoodVibes Agent does not mutate configuration through model tools in the main conversation.',
|
|
158
|
+
'Use explicit Agent CLI/slash settings commands for intentional config changes.',
|
|
159
|
+
'Secrets, tokens, passwords, daemon lifecycle settings, and service exposure settings require explicit user action outside the model tool surface.',
|
|
160
|
+
].join(' ');
|
|
161
|
+
|
|
156
162
|
const DURABLE_WORKFLOW_MUTATION_DENIAL = [
|
|
157
163
|
'GoodVibes Agent only inspects copied durable workflow tools from the main conversation.',
|
|
158
164
|
'Task, team, worklist, packet, and query creation or lifecycle mutation is disabled here.',
|
|
@@ -192,6 +198,8 @@ export function installAgentToolPolicyGuard(registry: ToolRegistry, options: Age
|
|
|
192
198
|
wrapFetchToolForAgentPolicy(tool);
|
|
193
199
|
} else if (tool.definition.name === 'state') {
|
|
194
200
|
wrapStateToolForAgentPolicy(tool);
|
|
201
|
+
} else if (tool.definition.name === 'goodvibes_settings') {
|
|
202
|
+
wrapBlockedSettingsToolForAgentPolicy(tool);
|
|
195
203
|
} else if (tool.definition.name === 'task') {
|
|
196
204
|
wrapModeRestrictedToolForAgentPolicy(tool, {
|
|
197
205
|
allowedModes: READ_ONLY_TASK_TOOL_MODES,
|
|
@@ -297,6 +305,21 @@ export function wrapStateToolForAgentPolicy(tool: Tool): void {
|
|
|
297
305
|
};
|
|
298
306
|
}
|
|
299
307
|
|
|
308
|
+
export function wrapBlockedSettingsToolForAgentPolicy(tool: Tool): void {
|
|
309
|
+
tool.definition.description = [
|
|
310
|
+
'Blocked in GoodVibes Agent main conversation: configuration mutation.',
|
|
311
|
+
'Use explicit Agent CLI/slash settings commands for intentional config changes.',
|
|
312
|
+
'Daemon lifecycle and service exposure remain externally managed by GoodVibes TUI/daemon.',
|
|
313
|
+
].join(' ');
|
|
314
|
+
tool.definition.sideEffects = [];
|
|
315
|
+
tool.definition.parameters = {
|
|
316
|
+
type: 'object',
|
|
317
|
+
properties: {},
|
|
318
|
+
additionalProperties: false,
|
|
319
|
+
};
|
|
320
|
+
tool.execute = async () => ({ success: false, error: SETTINGS_MUTATION_DENIAL });
|
|
321
|
+
}
|
|
322
|
+
|
|
300
323
|
export function validateExecToolInvocationForAgentPolicy(args: ExecToolArgs): string | null {
|
|
301
324
|
if (args.parallel === true) return BACKGROUND_EXEC_DENIAL;
|
|
302
325
|
if (Array.isArray(args.file_ops) && args.file_ops.length > 0) return BACKGROUND_EXEC_DENIAL;
|
|
@@ -452,6 +475,7 @@ export const AGENT_CHANNEL_ACTION_DENIAL_MESSAGE = CHANNEL_ACTION_DENIAL;
|
|
|
452
475
|
export const AGENT_MCP_SECURITY_MUTATION_DENIAL_MESSAGE = MCP_SECURITY_MUTATION_DENIAL;
|
|
453
476
|
export const AGENT_FETCH_NETWORK_MUTATION_DENIAL_MESSAGE = FETCH_NETWORK_MUTATION_DENIAL;
|
|
454
477
|
export const AGENT_STATE_MUTATION_DENIAL_MESSAGE = STATE_MUTATION_DENIAL;
|
|
478
|
+
export const AGENT_SETTINGS_MUTATION_DENIAL_MESSAGE = SETTINGS_MUTATION_DENIAL;
|
|
455
479
|
export const AGENT_DURABLE_WORKFLOW_MUTATION_DENIAL_MESSAGE = DURABLE_WORKFLOW_MUTATION_DENIAL;
|
|
456
480
|
|
|
457
481
|
function isRecord(value: unknown): value is Record<string, unknown> {
|
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 = '0.1.
|
|
9
|
+
let _version = '0.1.20';
|
|
10
10
|
let _sdkVersion = '0.33.35';
|
|
11
11
|
try {
|
|
12
12
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8')) as {
|