@pellux/goodvibes-agent 0.1.3 → 0.1.4
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
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to GoodVibes Agent will be recorded here.
|
|
4
4
|
|
|
5
|
+
## 0.1.4 - 2026-05-31
|
|
6
|
+
|
|
7
|
+
- Hardened Agent Knowledge route isolation for CLI JSON output and diagnostics: Agent status, ask, search, and ingest-url now report explicit `agentKnowledge.*` identities and `/api/goodvibes-agent/knowledge/*` routes.
|
|
8
|
+
- Pointed runtime orchestrator and multimodal writeback dependencies at Agent Knowledge so assistant-authored knowledge cannot land in default Knowledge/Wiki.
|
|
9
|
+
- Moved project planning and work-plan artifacts onto the Agent Knowledge store so Agent task state does not use the regular wiki segment.
|
|
10
|
+
|
|
5
11
|
## 0.1.3 - 2026-05-31
|
|
6
12
|
|
|
7
13
|
- Added local Agent personas with `/personas`: create/list/search/show/use/review/stale/delete, secret-looking value rejection, active persona prompt injection, and operator workspace status.
|
package/docs/getting-started.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Getting Started
|
|
2
2
|
|
|
3
|
-
GoodVibes Agent `0.1.
|
|
3
|
+
GoodVibes Agent `0.1.4` is the current installable public alpha of the personal operator assistant built on the GoodVibes TUI foundation.
|
|
4
4
|
|
|
5
5
|
## Requirements
|
|
6
6
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pellux/goodvibes-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
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",
|
|
@@ -32,6 +32,42 @@ interface AgentKnowledgeSuccess<TData> {
|
|
|
32
32
|
|
|
33
33
|
type AgentKnowledgeResult<TData> = AgentKnowledgeSuccess<TData> | AgentKnowledgeFailure;
|
|
34
34
|
|
|
35
|
+
interface DaemonCallMethod {
|
|
36
|
+
readonly kind: string;
|
|
37
|
+
readonly route: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const AGENT_KNOWLEDGE_METHODS = {
|
|
41
|
+
status: {
|
|
42
|
+
kind: 'agentKnowledge.status',
|
|
43
|
+
route: '/api/goodvibes-agent/knowledge/status',
|
|
44
|
+
},
|
|
45
|
+
ask: {
|
|
46
|
+
kind: 'agentKnowledge.ask',
|
|
47
|
+
route: '/api/goodvibes-agent/knowledge/ask',
|
|
48
|
+
},
|
|
49
|
+
search: {
|
|
50
|
+
kind: 'agentKnowledge.search',
|
|
51
|
+
route: '/api/goodvibes-agent/knowledge/search',
|
|
52
|
+
},
|
|
53
|
+
ingestUrl: {
|
|
54
|
+
kind: 'agentKnowledge.ingest.url',
|
|
55
|
+
route: '/api/goodvibes-agent/knowledge/ingest/url',
|
|
56
|
+
},
|
|
57
|
+
} as const;
|
|
58
|
+
|
|
59
|
+
const DELEGATION_METHOD = {
|
|
60
|
+
kind: 'sessions.messages.create',
|
|
61
|
+
route: 'sessions.messages.create',
|
|
62
|
+
} as const;
|
|
63
|
+
|
|
64
|
+
interface DelegationResult {
|
|
65
|
+
readonly sessionId: string;
|
|
66
|
+
readonly message: unknown;
|
|
67
|
+
readonly task: string;
|
|
68
|
+
readonly wrfcRequested: boolean;
|
|
69
|
+
}
|
|
70
|
+
|
|
35
71
|
function isRecord(value: unknown): value is JsonRecord {
|
|
36
72
|
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
37
73
|
}
|
|
@@ -323,7 +359,7 @@ function formatFailure(failure: AgentKnowledgeFailure, json: boolean): string {
|
|
|
323
359
|
|
|
324
360
|
async function runKnowledgeCall<TData>(
|
|
325
361
|
runtime: CliCommandRuntime,
|
|
326
|
-
|
|
362
|
+
method: DaemonCallMethod,
|
|
327
363
|
call: (connection: AgentDaemonConnection) => Promise<TData>,
|
|
328
364
|
): Promise<AgentKnowledgeResult<TData>> {
|
|
329
365
|
const connection = resolveDaemonConnection(runtime);
|
|
@@ -333,14 +369,14 @@ async function runKnowledgeCall<TData>(
|
|
|
333
369
|
kind: 'auth_required',
|
|
334
370
|
error: `No daemon operator token found at ${connection.tokenPath}`,
|
|
335
371
|
baseUrl: connection.baseUrl,
|
|
336
|
-
route,
|
|
372
|
+
route: method.route,
|
|
337
373
|
};
|
|
338
374
|
}
|
|
339
375
|
try {
|
|
340
376
|
const data = await call(connection);
|
|
341
|
-
return { ok: true, kind:
|
|
377
|
+
return { ok: true, kind: method.kind, route: method.route, data };
|
|
342
378
|
} catch (error) {
|
|
343
|
-
return classifyKnowledgeError(error, connection, route);
|
|
379
|
+
return classifyKnowledgeError(error, connection, method.route);
|
|
344
380
|
}
|
|
345
381
|
}
|
|
346
382
|
|
|
@@ -350,7 +386,7 @@ export async function handleAgentKnowledgeCommand(runtime: CliCommandRuntime): P
|
|
|
350
386
|
const json = runtime.cli.flags.outputFormat === 'json';
|
|
351
387
|
|
|
352
388
|
if (normalized === 'status') {
|
|
353
|
-
const result = await runKnowledgeCall(runtime,
|
|
389
|
+
const result = await runKnowledgeCall(runtime, AGENT_KNOWLEDGE_METHODS.status, async (connection) => (
|
|
354
390
|
await createAgentSdk(connection).knowledge.status()
|
|
355
391
|
));
|
|
356
392
|
if (!result.ok) return { output: formatFailure(result, json), exitCode: 1 };
|
|
@@ -366,7 +402,7 @@ export async function handleAgentKnowledgeCommand(runtime: CliCommandRuntime): P
|
|
|
366
402
|
const mode = readOptionValue(rest, '--mode');
|
|
367
403
|
const selectedMode = mode === 'concise' || mode === 'standard' || mode === 'detailed' ? mode : 'standard';
|
|
368
404
|
const limit = readPositiveInt(rest, '--limit', 8);
|
|
369
|
-
const result = await runKnowledgeCall(runtime,
|
|
405
|
+
const result = await runKnowledgeCall(runtime, AGENT_KNOWLEDGE_METHODS.ask, async (connection) => (
|
|
370
406
|
await createAgentSdk(connection).knowledge.ask({
|
|
371
407
|
query,
|
|
372
408
|
limit,
|
|
@@ -387,7 +423,7 @@ export async function handleAgentKnowledgeCommand(runtime: CliCommandRuntime): P
|
|
|
387
423
|
const query = commandValues(rest).join(' ').trim();
|
|
388
424
|
if (!query) return { output: 'Usage: goodvibes-agent knowledge search <query> [--limit <n>]', exitCode: 2 };
|
|
389
425
|
const limit = readPositiveInt(rest, '--limit', 10);
|
|
390
|
-
const result = await runKnowledgeCall(runtime,
|
|
426
|
+
const result = await runKnowledgeCall(runtime, AGENT_KNOWLEDGE_METHODS.search, async (connection) => (
|
|
391
427
|
await createAgentSdk(connection).knowledge.search({ query, limit })
|
|
392
428
|
));
|
|
393
429
|
if (!result.ok) return { output: formatFailure(result, json), exitCode: 1 };
|
|
@@ -403,7 +439,7 @@ export async function handleAgentKnowledgeCommand(runtime: CliCommandRuntime): P
|
|
|
403
439
|
if (!url) return { output: 'Usage: goodvibes-agent knowledge ingest-url <url> [--title <title>] [--tags a,b]', exitCode: 2 };
|
|
404
440
|
const title = readOptionValue(rest, '--title');
|
|
405
441
|
const tags = readStringList(rest, '--tags');
|
|
406
|
-
const result = await runKnowledgeCall(runtime,
|
|
442
|
+
const result = await runKnowledgeCall(runtime, AGENT_KNOWLEDGE_METHODS.ingestUrl, async (connection) => (
|
|
407
443
|
await createAgentSdk(connection).operator.invoke('knowledge.ingest.url', {
|
|
408
444
|
url,
|
|
409
445
|
title,
|
|
@@ -432,7 +468,7 @@ export async function handleCompatCommand(runtime: CliCommandRuntime): Promise<C
|
|
|
432
468
|
const daemonRecord = isRecord(daemon.body) ? daemon.body : {};
|
|
433
469
|
const daemonVersion = readString(daemonRecord, 'version') ?? 'unknown';
|
|
434
470
|
const versionCompatible = daemon.ok && daemonVersion === metadata.sdkVersion;
|
|
435
|
-
const knowledgeRoute = await runKnowledgeCall(runtime,
|
|
471
|
+
const knowledgeRoute = await runKnowledgeCall(runtime, AGENT_KNOWLEDGE_METHODS.status, async (routeConnection) => (
|
|
436
472
|
await createAgentSdk(routeConnection).knowledge.status()
|
|
437
473
|
));
|
|
438
474
|
const knowledgeRouteReady = knowledgeRoute.ok;
|
|
@@ -482,7 +518,7 @@ export async function handleDelegateCommand(runtime: CliCommandRuntime): Promise
|
|
|
482
518
|
exitCode: 2,
|
|
483
519
|
};
|
|
484
520
|
}
|
|
485
|
-
const result = await runKnowledgeCall(runtime,
|
|
521
|
+
const result = await runKnowledgeCall<DelegationResult>(runtime, DELEGATION_METHOD, async (connection) => {
|
|
486
522
|
const sdk = createAgentSdk(connection);
|
|
487
523
|
const created = await sdk.operator.invoke('sessions.create', {
|
|
488
524
|
title: `Agent delegation: ${task.slice(0, 72)}`,
|
|
@@ -242,7 +242,7 @@ export async function initializeBootstrapCore(
|
|
|
242
242
|
webSearchService: services.webSearchService,
|
|
243
243
|
channelRegistry: services.channelPlugins,
|
|
244
244
|
remoteRunnerRegistry: services.remoteRunnerRegistry,
|
|
245
|
-
knowledgeService: services.
|
|
245
|
+
knowledgeService: services.agentKnowledgeService,
|
|
246
246
|
archetypeLoader: services.archetypeLoader,
|
|
247
247
|
configManager,
|
|
248
248
|
providerRegistry: services.providerRegistry,
|
package/src/runtime/services.ts
CHANGED
|
@@ -440,7 +440,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
440
440
|
semanticService: homeGraphSemanticService,
|
|
441
441
|
});
|
|
442
442
|
const projectPlanningProjectId = projectPlanningProjectIdFromPath(workingDirectory);
|
|
443
|
-
const projectPlanningService = new ProjectPlanningService(
|
|
443
|
+
const projectPlanningService = new ProjectPlanningService(agentKnowledgeStore, {
|
|
444
444
|
defaultProjectId: projectPlanningProjectId,
|
|
445
445
|
});
|
|
446
446
|
const workPlanStore = new WorkPlanStore({
|
|
@@ -473,7 +473,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
473
473
|
}));
|
|
474
474
|
const mediaProviders = new MediaProviderRegistry();
|
|
475
475
|
ensureBuiltinMediaProviders(mediaProviders, artifactStore, providerRegistry);
|
|
476
|
-
const multimodalService = new MultimodalService(artifactStore, mediaProviders, voiceService,
|
|
476
|
+
const multimodalService = new MultimodalService(artifactStore, mediaProviders, voiceService, agentKnowledgeService);
|
|
477
477
|
const pluginManager = new PluginManager({
|
|
478
478
|
pathOptions: {
|
|
479
479
|
cwd: shellPaths.workingDirectory,
|
|
@@ -560,7 +560,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
560
560
|
webSearchService,
|
|
561
561
|
channelRegistry: channelPlugins,
|
|
562
562
|
remoteRunnerRegistry,
|
|
563
|
-
knowledgeService,
|
|
563
|
+
knowledgeService: agentKnowledgeService,
|
|
564
564
|
memoryRegistry,
|
|
565
565
|
archetypeLoader,
|
|
566
566
|
configManager,
|
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.4';
|
|
10
10
|
try {
|
|
11
11
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8'));
|
|
12
12
|
_version = pkg.version ?? _version;
|