@pellux/goodvibes-agent 0.1.39 → 0.1.41
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 +8 -0
- package/README.md +13 -3
- package/docs/operator-capability-benchmark.md +21 -7
- package/package.json +1 -1
- package/src/agent/routine-schedule-promotion.ts +232 -3
- package/src/cli/capabilities-command.ts +39 -4
- package/src/cli/help.ts +7 -6
- package/src/cli/routines-command.ts +2 -2
- package/src/input/agent-workspace.ts +2 -2
- package/src/input/commands/capabilities-runtime.ts +23 -3
- package/src/input/commands/routines-runtime.ts +1 -1
- package/src/input/commands/schedule-runtime.ts +4 -4
- package/src/operator/capability-benchmark.ts +17 -5
- package/src/operator/daemon-capability-audit.ts +554 -0
- package/src/version.ts +1 -1
|
@@ -4,14 +4,34 @@ import {
|
|
|
4
4
|
renderOperatorCapabilityBenchmark,
|
|
5
5
|
OPERATOR_CAPABILITY_BENCHMARKS,
|
|
6
6
|
} from '../../operator/capability-benchmark.ts';
|
|
7
|
+
import {
|
|
8
|
+
fetchLiveDaemonCapabilityAudit,
|
|
9
|
+
filterDaemonCapabilityAuditAreas,
|
|
10
|
+
renderDaemonCapabilityAudit,
|
|
11
|
+
renderDaemonCapabilityFailure,
|
|
12
|
+
} from '../../operator/daemon-capability-audit.ts';
|
|
13
|
+
import { resolveAgentDaemonConnection } from '../../agent/routine-schedule-promotion.ts';
|
|
7
14
|
|
|
8
15
|
export function registerCapabilitiesRuntimeCommands(registry: CommandRegistry): void {
|
|
9
16
|
registry.register({
|
|
10
17
|
name: 'capabilities',
|
|
11
18
|
aliases: ['caps', 'benchmark'],
|
|
12
|
-
description: 'Show the OpenClaw/Hermes capability benchmark and
|
|
13
|
-
usage: '[openclaw|hermes|query]',
|
|
14
|
-
handler(args, ctx) {
|
|
19
|
+
description: 'Show the OpenClaw/Hermes capability benchmark, Agent readiness, and live daemon coverage',
|
|
20
|
+
usage: '[daemon|openclaw|hermes|query]',
|
|
21
|
+
async handler(args, ctx) {
|
|
22
|
+
if (args[0] === 'daemon') {
|
|
23
|
+
const homeDirectory = ctx.platform.configManager.getHomeDirectory() ?? process.cwd();
|
|
24
|
+
const connection = resolveAgentDaemonConnection(ctx.platform.configManager, homeDirectory);
|
|
25
|
+
const audit = await fetchLiveDaemonCapabilityAudit(connection);
|
|
26
|
+
if (!audit.ok) {
|
|
27
|
+
ctx.print(renderDaemonCapabilityFailure(audit));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const query = args.slice(1).join(' ').trim() || undefined;
|
|
31
|
+
const areas = filterDaemonCapabilityAuditAreas(audit.areas, query);
|
|
32
|
+
ctx.print(renderDaemonCapabilityAudit(audit, areas));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
15
35
|
const query = args.join(' ').trim() || undefined;
|
|
16
36
|
const capabilities = filterOperatorCapabilities(OPERATOR_CAPABILITY_BENCHMARKS, query);
|
|
17
37
|
ctx.print(renderOperatorCapabilityBenchmark(capabilities));
|
|
@@ -295,7 +295,7 @@ export function registerRoutinesRuntimeCommands(registry: CommandRegistry): void
|
|
|
295
295
|
name: 'routines',
|
|
296
296
|
aliases: ['routine'],
|
|
297
297
|
description: 'Manage local GoodVibes Agent routines',
|
|
298
|
-
usage: '[list|enabled|search <query>|show <id>|receipts|reconcile|receipt <id>|create --name <name> --description <summary> --steps <steps>|update <id> [--name ...] [--description ...] [--steps ...]|enable <id>|disable <id>|start <id>|review <id>|stale <id> <reason...>|promote <id> --cron <expr> --yes|delete <id> --yes]',
|
|
298
|
+
usage: '[list|enabled|search <query>|show <id>|receipts|reconcile|receipt <id>|create --name <name> --description <summary> --steps <steps>|update <id> [--name ...] [--description ...] [--steps ...]|enable <id>|disable <id>|start <id>|review <id>|stale <id> <reason...>|promote <id> --cron <expr> [--delivery-surface slack] --yes|delete <id> --yes]',
|
|
299
299
|
handler: runRoutinesRuntimeCommand,
|
|
300
300
|
});
|
|
301
301
|
}
|
|
@@ -60,7 +60,7 @@ async function promoteRoutineSchedule(args: readonly string[], ctx: CommandConte
|
|
|
60
60
|
const parsed = parseRoutineSchedulePromotionArgs(args);
|
|
61
61
|
if (parsed.errors.length > 0) {
|
|
62
62
|
ctx.print([
|
|
63
|
-
'Usage: /schedule promote-routine <routine-id> (--cron <expr>|--every <interval>|--at <iso-time>) [--timezone <tz>] [--name <schedule-name>] [--provider <id>] [--model <model>] [--disabled] --yes',
|
|
63
|
+
'Usage: /schedule promote-routine <routine-id> (--cron <expr>|--every <interval>|--at <iso-time>) [--timezone <tz>] [--name <schedule-name>] [--provider <id>] [--model <model>] [--delivery-surface <surface[:route[:label]]>|--delivery-route <route[:label]>|--delivery-webhook <url>|--delivery-link <url>] [--disabled] --yes',
|
|
64
64
|
...parsed.errors.map((error) => ` ${error}`),
|
|
65
65
|
].join('\n'));
|
|
66
66
|
return;
|
|
@@ -87,8 +87,8 @@ export function registerScheduleRuntimeCommands(registry: CommandRegistry): void
|
|
|
87
87
|
name: 'schedule',
|
|
88
88
|
aliases: ['sched'],
|
|
89
89
|
description: 'Inspect schedules and explicitly promote local Agent routines to daemon schedules',
|
|
90
|
-
usage: 'list | receipts | reconcile | receipt <id> | promote-routine <routine-id> --cron <expr> --yes',
|
|
91
|
-
argsHint: 'list | receipts | reconcile | receipt <id> | promote-routine <routine-id> --cron <expr> --yes',
|
|
90
|
+
usage: 'list | receipts | reconcile | receipt <id> | promote-routine <routine-id> --cron <expr> [--delivery-surface slack] --yes',
|
|
91
|
+
argsHint: 'list | receipts | reconcile | receipt <id> | promote-routine <routine-id> --cron <expr> [--delivery-surface slack] --yes',
|
|
92
92
|
async handler(args, ctx) {
|
|
93
93
|
const sub = args[0];
|
|
94
94
|
|
|
@@ -160,7 +160,7 @@ export function registerScheduleRuntimeCommands(registry: CommandRegistry): void
|
|
|
160
160
|
+ ' /schedule receipts\n'
|
|
161
161
|
+ ' /schedule reconcile\n'
|
|
162
162
|
+ ' /schedule receipt <receipt-id>\n'
|
|
163
|
-
+ ' /schedule promote-routine <routine-id> (--cron <expr>|--every <interval>|--at <iso-time>) --yes\n'
|
|
163
|
+
+ ' /schedule promote-routine <routine-id> (--cron <expr>|--every <interval>|--at <iso-time>) [--delivery-surface <surface>|--delivery-route <route>|--delivery-webhook <url>] --yes\n'
|
|
164
164
|
+ ' Local schedule mutations and runs remain blocked.'
|
|
165
165
|
);
|
|
166
166
|
},
|
|
@@ -14,6 +14,7 @@ export interface OperatorCapabilityBenchmark {
|
|
|
14
14
|
readonly posture: CapabilityPosture;
|
|
15
15
|
readonly competitors: readonly CompetitorProduct[];
|
|
16
16
|
readonly competitorBaseline: string;
|
|
17
|
+
readonly goodvibesDaemon?: string;
|
|
17
18
|
readonly goodvibesAgent: string;
|
|
18
19
|
readonly configure: readonly string[];
|
|
19
20
|
readonly use: readonly string[];
|
|
@@ -43,6 +44,7 @@ export const OPERATOR_CAPABILITY_BENCHMARK_SOURCES = [
|
|
|
43
44
|
'https://hermes-agent.nousresearch.com/docs/user-guide/features/voice-mode/',
|
|
44
45
|
'https://hermes-agent.nousresearch.com/docs/user-guide/features/api-server/',
|
|
45
46
|
'https://hermes-agent.nousresearch.com/docs/user-guide/profiles/',
|
|
47
|
+
'@pellux/goodvibes-sdk@0.33.35 public operator contract and /api/goodvibes-agent/knowledge routes',
|
|
46
48
|
] as const;
|
|
47
49
|
|
|
48
50
|
export const OPERATOR_CAPABILITY_BENCHMARKS: readonly OperatorCapabilityBenchmark[] = [
|
|
@@ -64,6 +66,7 @@ export const OPERATOR_CAPABILITY_BENCHMARKS: readonly OperatorCapabilityBenchmar
|
|
|
64
66
|
posture: 'external-daemon',
|
|
65
67
|
competitors: ['openclaw', 'hermes'],
|
|
66
68
|
competitorBaseline: 'Always-on gateway/service provides channel ingress, sessions, tools, events, and scheduled execution.',
|
|
69
|
+
goodvibesDaemon: 'Daemon exposes status/auth/control, sessions, companion chat, channels, remote peers, approvals, automation, schedules, artifacts, MCP, providers, voice, media, web search, and isolated Agent Knowledge routes.',
|
|
67
70
|
goodvibesAgent: 'Connects to the GoodVibes daemon owned by GoodVibes TUI/daemon tooling; Agent never starts, stops, or owns daemon lifecycle.',
|
|
68
71
|
configure: ['goodvibes-agent compat', 'goodvibes-agent service check', 'goodvibes-agent control-plane status'],
|
|
69
72
|
use: ['goodvibes-agent status', 'goodvibes-agent doctor'],
|
|
@@ -76,6 +79,7 @@ export const OPERATOR_CAPABILITY_BENCHMARKS: readonly OperatorCapabilityBenchmar
|
|
|
76
79
|
posture: 'configurable',
|
|
77
80
|
competitors: ['openclaw', 'hermes'],
|
|
78
81
|
competitorBaseline: 'Messaging gateway for WhatsApp, Telegram, Slack, Discord, Signal, iMessage, web chat, and related platforms.',
|
|
82
|
+
goodvibesDaemon: 'Public channel routes include channels.status, channels.capabilities.*, channels.accounts.*, channels.setup.*, channels.directory.*, channels.actions.*, channels.tools.*, channels.targets.resolve, pairing, and companion chat routes.',
|
|
79
83
|
goodvibesAgent: 'Uses GoodVibes daemon channel, companion, pairing, QR, communication, and session surfaces while keeping side effects behind explicit user action. The Agent workspace exposes channel setup, per-channel readiness, default-target posture, and risk labels as a first-class operator area.',
|
|
80
84
|
configure: ['goodvibes-agent pair', 'goodvibes-agent qrcode', 'goodvibes-agent surfaces check', '/agent → Channels'],
|
|
81
85
|
use: ['/agent → Channels', '/communication', '/pair'],
|
|
@@ -88,6 +92,7 @@ export const OPERATOR_CAPABILITY_BENCHMARKS: readonly OperatorCapabilityBenchmar
|
|
|
88
92
|
posture: 'ready',
|
|
89
93
|
competitors: ['openclaw', 'hermes'],
|
|
90
94
|
competitorBaseline: 'Persistent memory and knowledge/wiki layers with search, recall, provenance, and freshness checks.',
|
|
95
|
+
goodvibesDaemon: 'Agent-specific daemon routes cover /api/goodvibes-agent/knowledge/status, ask, search, ingest, source/node/issue/candidate/refinement/report/job/schedule, projection, GraphQL, and usage surfaces.',
|
|
91
96
|
goodvibesAgent: 'Uses only /api/goodvibes-agent/knowledge/*; never falls back to default Knowledge/Wiki, HomeGraph, or Home Assistant routes. The Agent workspace exposes isolated ask/search/status, URL/bookmark ingestion, review queue, and consolidation workflows.',
|
|
92
97
|
configure: ['goodvibes-agent compat', 'goodvibes-agent knowledge status', '/agent → Knowledge'],
|
|
93
98
|
use: ['goodvibes-agent ask <question>', 'goodvibes-agent search <query>', '/knowledge ask <question>', '/knowledge ingest-url <url> --yes', '/knowledge queue'],
|
|
@@ -112,11 +117,12 @@ export const OPERATOR_CAPABILITY_BENCHMARKS: readonly OperatorCapabilityBenchmar
|
|
|
112
117
|
posture: 'configurable',
|
|
113
118
|
competitors: ['openclaw', 'hermes'],
|
|
114
119
|
competitorBaseline: 'Cron/scheduler can create, pause, resume, run, remove, and deliver recurring tasks from natural language.',
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
+
goodvibesDaemon: 'Public daemon routes cover automation.integration.snapshot, automation.jobs.*, automation.runs.*, automation.heartbeat.*, scheduler.capacity, schedules.create/list/run/enable/disable/delete, and delivery policy fields.',
|
|
121
|
+
goodvibesAgent: 'Observes public automation/schedule routes, keeps local routines separate from daemon jobs, and promotes a local routine into an external daemon schedules.create record only through an exact user command with --yes and optional explicit delivery targets.',
|
|
122
|
+
configure: ['/schedule list', '/routines create ...', '/schedule promote-routine <id> --cron "0 8 * * *" --delivery-surface slack --yes', 'goodvibes-agent routines promote <id> --every 1d --delivery-webhook https://example.test/hook --yes'],
|
|
123
|
+
use: ['/schedule list', '/routines start <id>', '/schedule promote-routine <id> --cron <expr> [--delivery-surface slack] --yes', '/schedule receipts', '/schedule reconcile'],
|
|
124
|
+
exceedsBy: ['No recursive hidden scheduler creation from model tools', 'explicit confirmation for side effects', 'local routines separate from daemon jobs', 'explicit delivery target selection', 'redacted promotion receipts', 'scheduled prompts preserve isolated Agent Knowledge and forbid default wiki/HomeGraph fallback'],
|
|
125
|
+
next: ['Add deeper live run/delivery history for promoted routines and expose delivery attempt errors in the operator workspace.'],
|
|
120
126
|
},
|
|
121
127
|
{
|
|
122
128
|
id: 'tool-gateway-mcp',
|
|
@@ -124,6 +130,7 @@ export const OPERATOR_CAPABILITY_BENCHMARKS: readonly OperatorCapabilityBenchmar
|
|
|
124
130
|
posture: 'configurable',
|
|
125
131
|
competitors: ['openclaw', 'hermes'],
|
|
126
132
|
competitorBaseline: 'Broad toolsets, MCP integration, browser/web/media tools, and configurable platform-specific tool availability.',
|
|
133
|
+
goodvibesDaemon: 'Daemon public routes include mcp.servers/tools/config, artifacts.create/get/list/content, web_search.providers/query, providers/model surfaces, media.analyze/generate/transform, multimodal providers, and channel tool/action registries.',
|
|
127
134
|
goodvibesAgent: 'Uses GoodVibes SDK tool registry, MCP inspection, provider tools, web search, media, plugins, and policy-gated model-visible tools.',
|
|
128
135
|
configure: ['/mcp servers', '/plugin list', 'goodvibes-agent providers', 'goodvibes-agent models'],
|
|
129
136
|
use: ['/mcp tools', '/provider current', 'goodvibes-agent search <query>'],
|
|
@@ -136,6 +143,7 @@ export const OPERATOR_CAPABILITY_BENCHMARKS: readonly OperatorCapabilityBenchmar
|
|
|
136
143
|
posture: 'configurable',
|
|
137
144
|
competitors: ['openclaw', 'hermes'],
|
|
138
145
|
competitorBaseline: 'Voice/TTS, mobile nodes, live canvas, browser automation, image/video generation, and multimodal analysis.',
|
|
146
|
+
goodvibesDaemon: 'Daemon public routes include voice.status/providers/voices/tts/stt/realtime, media providers/analyze/generate/transform, multimodal providers, artifacts, remote.snapshot/peers/work, and channel media-capable surfaces.',
|
|
139
147
|
goodvibesAgent: 'Uses GoodVibes voice/media/browser/node primitives and exposes an Agent workspace for TTS setup, image input, browser/web posture, MCP browser tools, and node/remote inspection.',
|
|
140
148
|
configure: ['/agent → Voice, Media & Nodes', '/config tts', '/voice review', '/mcp servers'],
|
|
141
149
|
use: ['/tts <prompt>', '/image <path> <prompt>', '/remote list'],
|
|
@@ -148,6 +156,7 @@ export const OPERATOR_CAPABILITY_BENCHMARKS: readonly OperatorCapabilityBenchmar
|
|
|
148
156
|
posture: 'explicit-delegation',
|
|
149
157
|
competitors: ['openclaw', 'hermes'],
|
|
150
158
|
competitorBaseline: 'Terminal/file/code tools and subagents can execute software tasks directly.',
|
|
159
|
+
goodvibesDaemon: 'Daemon shared-session routes cover sessions.create/list/get/messages/followUp/steer/close/reopen and task/workflow visibility used by GoodVibes TUI-owned execution.',
|
|
151
160
|
goodvibesAgent: 'Main assistant stays serial. Explicit build/fix/review/code work is delegated to GoodVibes TUI/shared-session contracts; WRFC is opt-in only.',
|
|
152
161
|
configure: ['goodvibes-agent delegate --help', 'goodvibes-agent compat'],
|
|
153
162
|
use: ['goodvibes-agent delegate "fix the failing tests"', 'goodvibes-agent delegate --wrfc "implement and review the feature"'],
|
|
@@ -172,6 +181,7 @@ export const OPERATOR_CAPABILITY_BENCHMARKS: readonly OperatorCapabilityBenchmar
|
|
|
172
181
|
posture: 'ready',
|
|
173
182
|
competitors: ['openclaw', 'hermes'],
|
|
174
183
|
competitorBaseline: 'Command approval, DM pairing, sandboxing, allowlists, and safety defaults for exposed channels.',
|
|
184
|
+
goodvibesDaemon: 'Daemon public routes include approvals.list/claim/approve/deny/cancel, channel policies/allowlists, local auth/session controls, secrets, and route danger metadata in the operator contract.',
|
|
175
185
|
goodvibesAgent: 'Uses daemon approvals, local auth diagnostics, secret refs, explicit confirmation gates, and Agent model-tool policy guards.',
|
|
176
186
|
configure: ['goodvibes-agent auth status', 'goodvibes-agent secrets providers', '/approvals list'],
|
|
177
187
|
use: ['/policy status', '/approvals list', 'goodvibes-agent doctor'],
|
|
@@ -201,6 +211,7 @@ export function filterOperatorCapabilities(
|
|
|
201
211
|
if (capability.posture.includes(normalized)) return true;
|
|
202
212
|
if (capability.competitors.some((competitor) => competitor === normalized)) return true;
|
|
203
213
|
return capability.goodvibesAgent.toLowerCase().includes(normalized)
|
|
214
|
+
|| capability.goodvibesDaemon?.toLowerCase().includes(normalized) === true
|
|
204
215
|
|| capability.competitorBaseline.toLowerCase().includes(normalized);
|
|
205
216
|
});
|
|
206
217
|
}
|
|
@@ -218,6 +229,7 @@ export function renderOperatorCapabilityBenchmark(
|
|
|
218
229
|
lines.push(`${capability.title} [${capability.posture}]`);
|
|
219
230
|
lines.push(` competitors: ${capability.competitors.join(', ')}`);
|
|
220
231
|
lines.push(` baseline: ${capability.competitorBaseline}`);
|
|
232
|
+
if (capability.goodvibesDaemon) lines.push(` daemon: ${capability.goodvibesDaemon}`);
|
|
221
233
|
lines.push(` Agent: ${capability.goodvibesAgent}`);
|
|
222
234
|
lines.push(` configure: ${capability.configure.join(' | ')}`);
|
|
223
235
|
lines.push(` use: ${capability.use.join(' | ')}`);
|