@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.
@@ -1,6 +1,6 @@
1
1
  # Getting Started
2
2
 
3
- GoodVibes Agent `0.1.3` is the current installable public alpha of the personal operator assistant built on the GoodVibes TUI foundation.
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
 
@@ -1,6 +1,6 @@
1
1
  # Release And Publishing
2
2
 
3
- GoodVibes Agent `0.1.3` is the current installable public alpha release.
3
+ GoodVibes Agent `0.1.4` is the current installable public alpha release.
4
4
 
5
5
  ## Package Identity
6
6
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pellux/goodvibes-agent",
3
- "version": "0.1.3",
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
- route: string,
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: route, route, data };
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, 'knowledge.status', async (connection) => (
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, 'knowledge.ask', async (connection) => (
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, 'knowledge.search', async (connection) => (
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, 'knowledge.ingest.url', async (connection) => (
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, 'knowledge.status', async (routeConnection) => (
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, 'sessions.messages.create', async (connection) => {
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.knowledgeService,
245
+ knowledgeService: services.agentKnowledgeService,
246
246
  archetypeLoader: services.archetypeLoader,
247
247
  configManager,
248
248
  providerRegistry: services.providerRegistry,
@@ -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(knowledgeStore, {
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, knowledgeService);
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.3';
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;