@pellux/goodvibes-agent 1.0.33 → 1.0.34

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.
Files changed (57) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +71 -59
  3. package/dist/package/main.js +565 -420
  4. package/docs/README.md +25 -21
  5. package/docs/channels-remote-and-api.md +2 -2
  6. package/docs/connected-host.md +3 -3
  7. package/docs/getting-started.md +87 -86
  8. package/docs/providers-and-routing.md +3 -3
  9. package/docs/release-and-publishing.md +3 -3
  10. package/docs/tools-and-commands.md +149 -139
  11. package/docs/voice-and-live-tts.md +1 -1
  12. package/package.json +1 -1
  13. package/release/live-verification/live-verification.json +2 -2
  14. package/release/live-verification/live-verification.md +2 -2
  15. package/release/release-notes.md +6 -15
  16. package/release/release-readiness.json +4 -4
  17. package/src/agent/harness-control.ts +42 -3
  18. package/src/runtime/bootstrap.ts +10 -18
  19. package/src/tools/agent-analysis-registry-policy.ts +2 -9
  20. package/src/tools/agent-channel-send-tool.ts +1 -5
  21. package/src/tools/agent-context-policy.ts +1 -5
  22. package/src/tools/agent-find-policy.ts +1 -4
  23. package/src/tools/agent-harness-channel-metadata.ts +23 -23
  24. package/src/tools/agent-harness-cli-metadata.ts +4 -1
  25. package/src/tools/agent-harness-command-catalog.ts +10 -3
  26. package/src/tools/agent-harness-connected-host-status.ts +8 -2
  27. package/src/tools/agent-harness-delegation-posture.ts +5 -5
  28. package/src/tools/agent-harness-mcp-metadata.ts +30 -28
  29. package/src/tools/agent-harness-media-posture.ts +9 -9
  30. package/src/tools/agent-harness-metadata.ts +25 -7
  31. package/src/tools/agent-harness-model-routing.ts +14 -14
  32. package/src/tools/agent-harness-model-tool-catalog.ts +7 -2
  33. package/src/tools/agent-harness-notification-metadata.ts +17 -17
  34. package/src/tools/agent-harness-pairing-posture.ts +7 -7
  35. package/src/tools/agent-harness-panel-metadata.ts +26 -12
  36. package/src/tools/agent-harness-provider-account-metadata.ts +33 -31
  37. package/src/tools/agent-harness-security-posture.ts +9 -7
  38. package/src/tools/agent-harness-service-posture.ts +22 -16
  39. package/src/tools/agent-harness-session-metadata.ts +9 -7
  40. package/src/tools/agent-harness-setup-posture.ts +6 -6
  41. package/src/tools/agent-harness-tool-schema.ts +1 -0
  42. package/src/tools/agent-harness-tool.ts +79 -36
  43. package/src/tools/agent-harness-ui-surface-metadata.ts +19 -11
  44. package/src/tools/agent-harness-workspace-actions.ts +29 -1
  45. package/src/tools/agent-knowledge-ingest-tool.ts +1 -5
  46. package/src/tools/agent-knowledge-tool.ts +1 -5
  47. package/src/tools/agent-local-registry-tool.ts +1 -4
  48. package/src/tools/agent-media-generate-tool.ts +1 -5
  49. package/src/tools/agent-notify-tool.ts +1 -5
  50. package/src/tools/agent-operator-action-tool.ts +1 -5
  51. package/src/tools/agent-operator-briefing-tool.ts +1 -5
  52. package/src/tools/agent-read-policy.ts +1 -4
  53. package/src/tools/agent-reminder-schedule-tool.ts +1 -5
  54. package/src/tools/agent-tool-policy-guard.ts +7 -34
  55. package/src/tools/agent-web-search-policy.ts +1 -4
  56. package/src/tools/agent-work-plan-tool.ts +1 -5
  57. package/src/version.ts +1 -1
@@ -11,6 +11,7 @@ export interface AgentHarnessUiSurfaceArgs {
11
11
  readonly target?: unknown;
12
12
  readonly key?: unknown;
13
13
  readonly prefix?: unknown;
14
+ readonly includeParameters?: unknown;
14
15
  readonly limit?: unknown;
15
16
  readonly pane?: unknown;
16
17
  }
@@ -727,22 +728,28 @@ function resolveHarnessUiSurface(args: AgentHarnessUiSurfaceArgs): UiSurfaceReso
727
728
  return null;
728
729
  }
729
730
 
730
- function describeSurface(context: CommandContext, surface: UiSurfaceDefinition, lookup?: UiSurfaceLookup): Record<string, unknown> {
731
+ function describeSurface(
732
+ context: CommandContext,
733
+ surface: UiSurfaceDefinition,
734
+ options: { readonly includeParameters?: boolean; readonly lookup?: UiSurfaceLookup } = {},
735
+ ): Record<string, unknown> {
731
736
  return {
732
737
  id: surface.id,
733
738
  label: surface.label,
734
739
  kind: surface.kind,
735
740
  summary: surface.summary,
736
741
  command: surface.command,
737
- ...(lookup ? { lookup } : {}),
742
+ ...(options.lookup ? { lookup: options.lookup } : {}),
738
743
  preferredModelRoute: surface.preferredModelRoute,
739
- parameters: surface.parameters ?? [],
740
744
  available: surface.available(context),
741
- policy: {
742
- effect: 'visible-ui-navigation',
743
- confirmation: 'agent_harness mode:"open_ui_surface" requires confirm:true and explicitUserRequest.',
744
- boundary: 'UI surface routing opens the same visible Agent shell surface the user can open. Use first-class model tools, settings modes, workspace actions, or confirmed slash-command mirrors for actual operations.',
745
- },
745
+ ...(options.includeParameters ? {
746
+ parameters: surface.parameters ?? [],
747
+ policy: {
748
+ effect: 'visible-ui-navigation',
749
+ confirmation: 'agent_harness mode:"open_ui_surface" requires confirm:true and explicitUserRequest.',
750
+ boundary: 'UI surface routing opens the same visible Agent shell surface the user can open. Use first-class model tools, settings modes, workspace actions, or confirmed slash-command mirrors for actual operations.',
751
+ },
752
+ } : {}),
746
753
  };
747
754
  }
748
755
 
@@ -753,15 +760,16 @@ export function totalHarnessUiSurfaces(): number {
753
760
  export function listHarnessUiSurfaces(context: CommandContext, args: AgentHarnessUiSurfaceArgs): readonly Record<string, unknown>[] {
754
761
  const query = readString(args.query);
755
762
  const limit = readLimit(args.limit, 200);
763
+ const includeParameters = args.includeParameters === true;
756
764
  return UI_SURFACES
757
- .map((surface) => describeSurface(context, surface))
765
+ .map((surface) => describeSurface(context, surface, { includeParameters }))
758
766
  .filter((surface) => surfaceMatches(surface, query))
759
767
  .slice(0, limit);
760
768
  }
761
769
 
762
770
  export function describeHarnessUiSurface(context: CommandContext, args: AgentHarnessUiSurfaceArgs): Record<string, unknown> | null {
763
771
  const resolved = resolveHarnessUiSurface(args);
764
- if (resolved?.status === 'found') return describeSurface(context, resolved.surface, resolved.lookup);
772
+ if (resolved?.status === 'found') return describeSurface(context, resolved.surface, { includeParameters: true, lookup: resolved.lookup });
765
773
  if (resolved?.status === 'ambiguous') {
766
774
  return { status: 'ambiguous', input: resolved.input, candidates: resolved.candidates };
767
775
  }
@@ -783,6 +791,6 @@ export async function openHarnessUiSurface(context: CommandContext, args: AgentH
783
791
  const routed = await resolved.surface.open(context, args);
784
792
  return {
785
793
  ...routed,
786
- descriptor: describeSurface(context, resolved.surface, resolved.lookup),
794
+ descriptor: describeSurface(context, resolved.surface, { includeParameters: true, lookup: resolved.lookup }),
787
795
  };
788
796
  }
@@ -97,6 +97,11 @@ export function describeWorkspaceEditor(editor: AgentWorkspaceLocalEditor): Reco
97
97
  };
98
98
  }
99
99
 
100
+ function previewText(value: string, maxLength = 120): string {
101
+ const normalized = value.replace(/\s+/g, ' ').trim();
102
+ return normalized.length <= maxLength ? normalized : `${normalized.slice(0, maxLength - 1).trimEnd()}...`;
103
+ }
104
+
100
105
  function selectedRoutineFromArgs(
101
106
  snapshot: AgentWorkspaceRuntimeSnapshot,
102
107
  args: AgentHarnessWorkspaceActionArgs,
@@ -163,6 +168,27 @@ export function describeWorkspaceAction(
163
168
  };
164
169
  }
165
170
 
171
+ function describeWorkspaceActionSummary(
172
+ category: AgentWorkspaceCategory,
173
+ action: AgentWorkspaceAction,
174
+ ): Record<string, unknown> {
175
+ return {
176
+ id: action.id,
177
+ categoryId: category.id,
178
+ category: category.label,
179
+ group: category.group,
180
+ label: action.label,
181
+ summary: previewText(action.detail),
182
+ kind: action.kind,
183
+ safety: action.safety,
184
+ ...(action.command ? { command: action.command } : {}),
185
+ ...(action.targetCategoryId ? { targetCategoryId: action.targetCategoryId } : {}),
186
+ ...(action.editorKind ? { editorKind: action.editorKind } : {}),
187
+ ...(action.localKind ? { localKind: action.localKind } : {}),
188
+ ...(action.localOperation ? { localOperation: action.localOperation } : {}),
189
+ };
190
+ }
191
+
166
192
  export function listWorkspaceActions(
167
193
  context: CommandContext,
168
194
  args: AgentHarnessWorkspaceActionArgs,
@@ -178,7 +204,9 @@ export function listWorkspaceActions(
178
204
  return source
179
205
  .filter((entry) => !categoryId || entry.category.id === categoryId)
180
206
  .slice(0, limit)
181
- .map((entry) => describeWorkspaceAction(entry.category, entry.action, { includeEditor, editorContext }));
207
+ .map((entry) => includeEditor
208
+ ? describeWorkspaceAction(entry.category, entry.action, { includeEditor, editorContext })
209
+ : describeWorkspaceActionSummary(entry.category, entry.action));
182
210
  }
183
211
 
184
212
  function workspaceActionLookupFromArgs(args: AgentHarnessWorkspaceActionArgs): { readonly source: WorkspaceActionLookup['source']; readonly input: string } | null {
@@ -261,11 +261,7 @@ export function createAgentKnowledgeIngestTool(
261
261
  return {
262
262
  definition: {
263
263
  name: 'agent_knowledge_ingest',
264
- description: [
265
- 'Ingest one confirmed source into isolated Agent Knowledge.',
266
- 'Use only for explicit ingest/import requests.',
267
- 'Supports URL, file, bookmark, history, and connector sources.',
268
- ].join(' '),
264
+ description: 'Ingest one confirmed source into isolated Agent Knowledge.',
269
265
  parameters: {
270
266
  type: 'object',
271
267
  properties: {
@@ -123,11 +123,7 @@ export function createAgentKnowledgeTool(
123
123
  return {
124
124
  definition: {
125
125
  name: 'agent_knowledge',
126
- description: [
127
- 'Read isolated Agent Knowledge.',
128
- 'Use for status, ask/search, source/node/issue lists, item lookup, map summary, and connector inspection.',
129
- 'Read-only.',
130
- ].join(' '),
126
+ description: 'Read isolated Agent Knowledge.',
131
127
  parameters: {
132
128
  type: 'object',
133
129
  properties: {
@@ -735,10 +735,7 @@ export function createAgentLocalRegistryTool(shellPaths: ShellPathService, memor
735
735
  return {
736
736
  definition: {
737
737
  name: 'agent_local_registry',
738
- description: [
739
- 'Inspect or update Agent-local records: memory, notes, personas, skills, bundles, and routines.',
740
- 'Deletion requires confirm:true plus explicitUserRequest.',
741
- ].join(' '),
738
+ description: 'Inspect or update Agent-local records.',
742
739
  parameters: {
743
740
  type: 'object',
744
741
  properties: {
@@ -52,11 +52,7 @@ export function createAgentMediaGenerateTool(
52
52
  return {
53
53
  definition: {
54
54
  name: 'agent_media_generate',
55
- description: [
56
- 'Generate one confirmed image or video artifact.',
57
- 'Use only for explicit media generation requests.',
58
- 'Returns artifact ids, not inline base64.',
59
- ].join(' '),
55
+ description: 'Generate one confirmed image or video artifact.',
60
56
  parameters: {
61
57
  type: 'object',
62
58
  properties: {
@@ -78,11 +78,7 @@ export function createAgentNotifyTool(
78
78
  return {
79
79
  definition: {
80
80
  name: 'agent_notify',
81
- description: [
82
- 'Send one confirmed plain-text notification.',
83
- 'Use only for explicit notify/message/alert requests.',
84
- 'Uses existing targets only.',
85
- ].join(' '),
81
+ description: 'Send one confirmed plain-text notification.',
86
82
  parameters: {
87
83
  type: 'object',
88
84
  properties: {
@@ -35,11 +35,7 @@ export function createAgentOperatorActionTool(
35
35
  return {
36
36
  definition: {
37
37
  name: 'agent_operator_action',
38
- description: [
39
- 'Run one confirmed allowlisted operator action.',
40
- 'Use only for explicit approval, automation, or schedule requests.',
41
- 'No automation definition edits or host lifecycle.',
42
- ].join(' '),
38
+ description: 'Run one confirmed allowlisted operator action.',
43
39
  parameters: {
44
40
  type: 'object',
45
41
  properties: {
@@ -175,11 +175,7 @@ export function createAgentOperatorBriefingTool(
175
175
  return {
176
176
  definition: {
177
177
  name: 'agent_operator_briefing',
178
- description: [
179
- 'Read connected Agent operator state for a concise briefing.',
180
- 'Use for pending attention, approvals, automation, schedules, or status.',
181
- 'Read-only.',
182
- ].join(' '),
178
+ description: 'Read connected Agent operator state for a concise briefing.',
183
179
  parameters: {
184
180
  type: 'object',
185
181
  properties: {},
@@ -126,10 +126,7 @@ export function isBlockedReadPath(path: string): boolean {
126
126
  }
127
127
 
128
128
  function narrowReadToolDefinitionForAgentPolicy(tool: Tool): void {
129
- tool.definition.description = [
130
- 'Read ordinary project files for GoodVibes Agent with bounded, non-secret, main-conversation policy.',
131
- 'Hidden paths, secret-looking files, broad batches, unoptimized image extraction, and oversized image reads are disabled.',
132
- ].join(' ');
129
+ tool.definition.description = 'Read ordinary non-secret project files for GoodVibes Agent.';
133
130
  tool.definition.sideEffects = ['read_fs'];
134
131
  tool.definition.concurrency = 'serial';
135
132
 
@@ -120,11 +120,7 @@ export function createAgentReminderScheduleTool(
120
120
  return {
121
121
  definition: {
122
122
  name: 'agent_reminder_schedule',
123
- description: [
124
- 'Schedule one confirmed GoodVibes Agent reminder.',
125
- 'Use only for an explicit reminder request.',
126
- 'No host lifecycle, background job, or Knowledge write.',
127
- ].join(' '),
123
+ description: 'Schedule one confirmed GoodVibes Agent reminder.',
128
124
  parameters: {
129
125
  type: 'object',
130
126
  properties: {
@@ -309,11 +309,7 @@ export function normalizeAgentToolInvocationForAgentPolicy(args: AgentToolArgs):
309
309
  }
310
310
 
311
311
  export function wrapBlockedMainConversationToolForAgentPolicy(tool: Tool): void {
312
- tool.definition.description = [
313
- `Blocked in GoodVibes Agent main conversation: ${tool.definition.name}.`,
314
- 'Use explicit GoodVibes TUI build delegation for build/fix/review/code execution work.',
315
- 'Use Agent-owned local registries and isolated Agent Knowledge routes for Agent memory and knowledge work.',
316
- ].join(' ');
312
+ tool.definition.description = `Blocked in GoodVibes Agent: ${tool.definition.name}.`;
317
313
  tool.definition.sideEffects = [];
318
314
  tool.execute = async () => ({ success: false, error: LOCAL_CODING_TOOL_DENIAL });
319
315
  }
@@ -349,11 +345,7 @@ export function wrapStateToolForAgentPolicy(tool: Tool): void {
349
345
  }
350
346
 
351
347
  export function wrapBlockedSettingsToolForAgentPolicy(tool: Tool): void {
352
- tool.definition.description = [
353
- 'Blocked in GoodVibes Agent main conversation: configuration mutation.',
354
- 'Use explicit Agent CLI/slash settings commands for intentional config changes.',
355
- 'Connected-host lifecycle and service exposure remain externally managed outside GoodVibes Agent.',
356
- ].join(' ');
348
+ tool.definition.description = 'Blocked in GoodVibes Agent: configuration mutation.';
357
349
  tool.definition.sideEffects = [];
358
350
  tool.definition.parameters = {
359
351
  type: 'object',
@@ -603,11 +595,7 @@ function isPresent(value: unknown): boolean {
603
595
  }
604
596
 
605
597
  function narrowAgentToolDefinitionForAgentPolicy(tool: Tool): void {
606
- tool.definition.description = [
607
- 'Read-only local Agent inspection for GoodVibes Agent.',
608
- 'This product does not create separate Agent jobs or run local delegated review chains.',
609
- 'For build/fix/review work, delegate to GoodVibes TUI through the explicit build-delegation path instead.',
610
- ].join(' ');
598
+ tool.definition.description = 'Read-only local Agent inspection for GoodVibes Agent.';
611
599
  tool.definition.sideEffects = [];
612
600
 
613
601
  const properties = tool.definition.parameters.properties;
@@ -619,11 +607,7 @@ function narrowAgentToolDefinitionForAgentPolicy(tool: Tool): void {
619
607
  }
620
608
 
621
609
  function narrowExecToolDefinitionForAgentPolicy(tool: Tool): void {
622
- tool.definition.description = [
623
- 'Execute foreground shell commands serially for GoodVibes Agent main-conversation work.',
624
- 'Background processes, parallel batches, background process controls, and exec file_ops are disabled by Agent policy.',
625
- 'Delegate long-running build/fix/review execution to GoodVibes TUI instead.',
626
- ].join(' ');
610
+ tool.definition.description = 'Execute foreground shell commands serially for GoodVibes Agent.';
627
611
 
628
612
  const properties = tool.definition.parameters.properties;
629
613
  if (!isRecord(properties)) return;
@@ -648,11 +632,7 @@ function narrowExecToolDefinitionForAgentPolicy(tool: Tool): void {
648
632
  }
649
633
 
650
634
  function narrowFetchToolDefinitionForAgentPolicy(tool: Tool): void {
651
- tool.definition.description = [
652
- 'Fetch public URLs for GoodVibes Agent with serial, read-only HTTP requests.',
653
- 'Only GET, HEAD, and OPTIONS are available in the main conversation.',
654
- 'Credentialed requests, request bodies, trust overrides, raw unsanitized responses, and parallel batches are disabled by Agent policy.',
655
- ].join(' ');
635
+ tool.definition.description = 'Fetch public URLs with serial, read-only HTTP requests.';
656
636
 
657
637
  const properties = tool.definition.parameters.properties;
658
638
  if (!isRecord(properties)) return;
@@ -689,11 +669,7 @@ function narrowFetchToolDefinitionForAgentPolicy(tool: Tool): void {
689
669
  }
690
670
 
691
671
  function narrowStateToolDefinitionForAgentPolicy(tool: Tool): void {
692
- tool.definition.description = [
693
- 'Inspect runtime-owned state for GoodVibes Agent.',
694
- 'State mutation, runtime-owned memory writes, hook changes, output-mode changes, and analytics writes are disabled in the main conversation.',
695
- 'Use Agent-owned commands for intentional memory, skill, persona, and routine changes.',
696
- ].join(' ');
672
+ tool.definition.description = 'Inspect runtime-owned state for GoodVibes Agent.';
697
673
 
698
674
  const properties = tool.definition.parameters.properties;
699
675
  if (!isRecord(properties)) return;
@@ -723,10 +699,7 @@ function narrowStateToolDefinitionForAgentPolicy(tool: Tool): void {
723
699
  }
724
700
 
725
701
  function narrowInspectToolDefinitionForAgentPolicy(tool: Tool): void {
726
- tool.definition.description = [
727
- 'Inspect and analyze project structure for GoodVibes Agent.',
728
- 'Scaffold mode is dry-run-only in the main conversation; code creation must be delegated to GoodVibes TUI.',
729
- ].join(' ');
702
+ tool.definition.description = 'Inspect and analyze project structure for GoodVibes Agent.';
730
703
 
731
704
  const properties = tool.definition.parameters.properties;
732
705
  if (!isRecord(properties)) return;
@@ -73,10 +73,7 @@ export function normalizeWebSearchToolInvocationForAgentPolicy(args: WebSearchTo
73
73
  }
74
74
 
75
75
  function narrowWebSearchToolDefinitionForAgentPolicy(tool: Tool): void {
76
- tool.definition.description = [
77
- 'Run bounded, read-only web research for GoodVibes Agent.',
78
- 'Full-page/raw/summary extraction, safe-search off, and high-fanout searches are disabled in the main conversation.',
79
- ].join(' ');
76
+ tool.definition.description = 'Run bounded, read-only web research for GoodVibes Agent.';
80
77
  tool.definition.sideEffects = ['network'];
81
78
 
82
79
  const properties = tool.definition.parameters.properties;
@@ -165,11 +165,7 @@ export function createAgentWorkPlanTool(store: WorkPlanStore): Tool {
165
165
  return {
166
166
  definition: {
167
167
  name: 'agent_work_plan',
168
- description: [
169
- 'Inspect or update the visible Agent-local work plan.',
170
- 'Use for task/status tracking.',
171
- 'Destructive actions require confirm:true plus explicitUserRequest.',
172
- ].join(' '),
168
+ description: 'Inspect or update the visible Agent-local work plan.',
173
169
  parameters: {
174
170
  type: 'object',
175
171
  properties: {
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 = '1.0.33';
9
+ let _version = '1.0.34';
10
10
  let _sdkVersion = '0.33.36';
11
11
  try {
12
12
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8')) as {