@pellux/goodvibes-agent 0.1.105 → 0.1.107

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.
@@ -1,9 +1,10 @@
1
1
  import { REASONING_OPTIONS, HITL_MODE_OPTIONS, GUIDANCE_MODE_OPTIONS, PERMISSION_MODE_OPTIONS, SECRET_POLICY_OPTIONS } from './onboarding-wizard-constants.ts';
2
2
  import { modelSelectionLabel, normalizeText } from './onboarding-wizard-helpers.ts';
3
+ import { buildAgentKnowledgeStep, buildAutomationStep, buildCommunicationStep, buildDelegationPolicyStep, buildLocalStateStep, buildToolsStep, buildVoiceMediaStep } from './onboarding-wizard-operator-steps.ts';
3
4
  import { listAgentRuntimeProfileTemplates } from '../../agent/runtime-profile.ts';
4
5
  import type { OnboardingWizardController } from './onboarding-wizard.ts';
5
6
  import type { OnboardingWizardActionFieldDefinition, OnboardingWizardFieldDefinition, OnboardingWizardModelPickerFieldDefinition, OnboardingWizardRadioFieldDefinition, OnboardingWizardRadioOption, OnboardingWizardStepDefinition } from './onboarding-wizard-types.ts';
6
- import type { OnboardingStep1CapabilityId, OnboardingStep1CapabilityItem } from '../../runtime/onboarding/index.ts';
7
+ import type { OnboardingProviderAccountRecord, OnboardingStep1CapabilityId, OnboardingStep1CapabilityItem } from '../../runtime/onboarding/index.ts';
7
8
 
8
9
  function buildStarterTemplateOptions(): readonly OnboardingWizardRadioOption[] {
9
10
  return [
@@ -82,6 +83,27 @@ function profileSetupLabel(controller: OnboardingWizardController): string {
82
83
  return templateId === 'none' ? `Create ${profileName}` : `Create ${profileName} from ${templateId}`;
83
84
  }
84
85
 
86
+ function formatBoundedList(values: readonly string[], empty: string): string {
87
+ const unique = [...new Set(values.map((value) => value.trim()).filter((value) => value.length > 0))]
88
+ .sort((left, right) => left.localeCompare(right));
89
+ if (unique.length === 0) return empty;
90
+ if (unique.length <= 4) return unique.join(', ');
91
+ return `${unique.slice(0, 4).join(', ')} +${unique.length - 4} more`;
92
+ }
93
+
94
+ function providerAccountLabel(provider: OnboardingProviderAccountRecord): string {
95
+ const route = provider.activeRoute && provider.activeRoute !== 'unconfigured'
96
+ ? provider.activeRoute
97
+ : provider.oauthReady
98
+ ? 'oauth-ready'
99
+ : provider.pendingLogin
100
+ ? 'pending-login'
101
+ : provider.configured
102
+ ? 'configured'
103
+ : 'unconfigured';
104
+ return `${provider.providerId}:${route}`;
105
+ }
106
+
85
107
  function buildReviewReadinessFields(controller: OnboardingWizardController): readonly OnboardingWizardFieldDefinition[] {
86
108
  const localBehavior = findRuntimeCapability(controller, 'local-behavior');
87
109
  const channels = findRuntimeCapability(controller, 'communication-channels');
@@ -151,96 +173,6 @@ function buildReviewReadinessFields(controller: OnboardingWizardController): rea
151
173
  ];
152
174
  }
153
175
 
154
- export function buildCommunicationStep(): OnboardingWizardStepDefinition {
155
- return {
156
- id: 'agent-communication',
157
- title: 'Channels and notifications',
158
- shortLabel: 'Channels',
159
- description: 'Prepare the Agent for companion pairing, messaging-channel awareness, notification delivery, and safe outbound communication while leaving runtime hosting external.',
160
- summaryTitle: 'Communication posture',
161
- summaryLines: [
162
- 'Companion chat: paired through the GoodVibes runtime',
163
- 'Channel accounts: inspect readiness before using them',
164
- 'Outbound messages: explicit user action only',
165
- ],
166
- fields: [
167
- {
168
- kind: 'status',
169
- id: 'agent-communication.companion',
170
- label: 'Companion pairing',
171
- hint: 'Use /pair from the Agent workspace to pair companion clients through the already-running GoodVibes runtime.',
172
- defaultValue: 'External runtime route',
173
- },
174
- {
175
- kind: 'status',
176
- id: 'agent-communication.channels',
177
- label: 'Messaging channels',
178
- hint: 'Use the Channels workspace to inspect account readiness, delivery posture, and recent communication without changing runtime hosting.',
179
- defaultValue: 'Inspectable',
180
- },
181
- {
182
- kind: 'status',
183
- id: 'agent-communication.notifications',
184
- label: 'Notification delivery',
185
- hint: 'Routine, approval, and work-plan notifications require an explicit delivery target and command; Agent never silently sends external messages.',
186
- defaultValue: 'Explicit only',
187
- },
188
- {
189
- kind: 'status',
190
- id: 'agent-communication.inbound-policy',
191
- label: 'Inbound command policy',
192
- hint: 'Incoming channel commands stay constrained by runtime policy, allowlists, and account posture.',
193
- defaultValue: 'Policy gated',
194
- },
195
- ],
196
- };
197
- }
198
-
199
- export function buildToolsStep(): OnboardingWizardStepDefinition {
200
- return {
201
- id: 'agent-tools',
202
- title: 'Tools and MCP',
203
- shortLabel: 'Tools',
204
- description: 'Review tool access for the Agent operator: MCP servers, browser/media helpers, safe read-only inspection, and explicit approval before side effects.',
205
- summaryTitle: 'Tool posture',
206
- summaryLines: [
207
- 'MCP and tools: inspect before use',
208
- 'Read/search/summarize: safe by default',
209
- 'Writes, installs, external sends, and account changes: require explicit user action',
210
- ],
211
- fields: [
212
- {
213
- kind: 'status',
214
- id: 'agent-tools.mcp',
215
- label: 'MCP servers and tools',
216
- hint: 'Use /mcp servers and the Agent workspace Tools area to inspect connected servers, roles, and tool readiness.',
217
- defaultValue: 'Inspectable',
218
- },
219
- {
220
- kind: 'status',
221
- id: 'agent-tools.browser-media',
222
- label: 'Browser and media helpers',
223
- hint: 'Browser, image, audio, and file helpers are task-scoped tools. Agent uses them only when the current task needs them and policy allows it.',
224
- defaultValue: 'Task scoped',
225
- },
226
- {
227
- kind: 'status',
228
- id: 'agent-tools.approval-boundary',
229
- label: 'Power action boundary',
230
- hint: 'Workspace writes, package installs, external sends, and account changes require an explicit command or confirmation.',
231
- defaultValue: 'Approval required',
232
- },
233
- {
234
- kind: 'status',
235
- id: 'agent-tools.no-hidden-work',
236
- label: 'Hidden work policy',
237
- hint: 'Tool use stays visible in the main Agent conversation or explicit command workspace; no hidden background work is started from onboarding.',
238
- defaultValue: 'Visible',
239
- },
240
- ],
241
- };
242
- }
243
-
244
176
  export function buildLoadingStep(controller: OnboardingWizardController): OnboardingWizardStepDefinition {
245
177
  const failed = controller.hydrationError !== null;
246
178
  return {
@@ -342,17 +274,42 @@ export function buildProviderAccessStep(controller: OnboardingWizardController):
342
274
  const openAiPending = pendingSubscriptions.some((subscription) => subscription.provider === 'openai');
343
275
  const providerSecretCount = controller.runtimeSnapshot?.secrets.records.filter((record) => record.key.endsWith('_API_KEY') || record.key.endsWith('_TOKEN')).length ?? 0;
344
276
  const openAiApiKeyConfigured = controller.runtimeSnapshot?.secrets.records.some((record) => record.key === 'OPENAI_API_KEY') ?? false;
277
+ const routing = controller.runtimeSnapshot?.providerRouting;
278
+ const accountProviders = controller.runtimeSnapshot?.providerAccounts?.providers ?? [];
279
+ const configuredAccounts = accountProviders.filter((provider) =>
280
+ provider.configured || provider.active || provider.oauthReady || provider.pendingLogin || provider.activeRoute !== 'unconfigured',
281
+ );
282
+ const providerRouteLabel = routing
283
+ ? `${routing.primaryProviderId}/${routing.primaryModelId}`
284
+ : 'Not loaded';
285
+ const activeSubscriptionProviders = activeSubscriptions.map((subscription) => subscription.provider);
286
+ const pendingSubscriptionProviders = pendingSubscriptions.map((subscription) => subscription.provider);
345
287
  const fields: OnboardingWizardFieldDefinition[] = [
346
288
  {
347
289
  kind: 'status',
348
- id: 'providers.openai-subscription',
349
- label: 'OpenAI subscription status',
350
- hint: openAiActive
351
- ? 'An OpenAI subscription session is already available.'
352
- : openAiPending
353
- ? 'An OpenAI subscription login is pending.'
354
- : 'No OpenAI subscription session was found in the current Agent state.',
355
- defaultValue: openAiActive ? 'Active' : openAiPending ? 'Pending' : 'Not detected',
290
+ id: 'providers.default-route',
291
+ label: 'Current conversation route',
292
+ hint: 'Normal Agent turns use this provider/model until you change the default model route.',
293
+ defaultValue: providerRouteLabel,
294
+ },
295
+ {
296
+ kind: 'status',
297
+ id: 'providers.account-routes',
298
+ label: 'Provider account routes',
299
+ hint: configuredAccounts.length > 0
300
+ ? formatBoundedList(configuredAccounts.map(providerAccountLabel), 'No provider account routes detected.')
301
+ : 'No provider account routes were detected in the current Agent state.',
302
+ defaultValue: configuredAccounts.length > 0 ? `${configuredAccounts.length} route(s)` : 'None detected',
303
+ },
304
+ {
305
+ kind: 'status',
306
+ id: 'providers.subscription-sessions',
307
+ label: 'Subscription sessions',
308
+ hint: [
309
+ `active: ${formatBoundedList(activeSubscriptionProviders, 'none')}`,
310
+ `pending: ${formatBoundedList(pendingSubscriptionProviders, 'none')}`,
311
+ ].join(' '),
312
+ defaultValue: `${activeSubscriptions.length} active / ${pendingSubscriptions.length} pending`,
356
313
  },
357
314
  {
358
315
  kind: 'status',
@@ -364,10 +321,10 @@ export function buildProviderAccessStep(controller: OnboardingWizardController):
364
321
  {
365
322
  kind: 'masked',
366
323
  id: 'providers.openai-api-key',
367
- label: 'OpenAI API key',
324
+ label: 'OpenAI API key quick start',
368
325
  hint: openAiApiKeyConfigured
369
- ? 'An OpenAI API key is already stored. Leave blank to keep it; enter a new key to replace it through the secret manager.'
370
- : 'Optional: enter an OpenAI API key now. The value is stored through the secret manager, not in config.',
326
+ ? 'Optional quick start: an OpenAI API key is already stored. Leave blank to keep it; enter a new key to replace it through the secret manager.'
327
+ : 'Optional quick start: enter an OpenAI API key now. Other providers can be configured from /secrets, /provider, and the model picker.',
371
328
  placeholder: openAiApiKeyConfigured ? 'already configured' : 'sk-...',
372
329
  defaultValue: '',
373
330
  },
@@ -413,11 +370,12 @@ export function buildProviderAccessStep(controller: OnboardingWizardController):
413
370
  id: 'provider-access',
414
371
  title: 'AI provider access',
415
372
  shortLabel: 'Providers',
416
- description: 'Review provider access for the Agent conversation. Credentials stay masked and are stored through the secret manager.',
373
+ description: 'Review provider and model access for the Agent conversation. Credentials stay masked and provider-specific setup remains configurable.',
417
374
  summaryTitle: 'Provider access summary',
418
375
  summaryLines: [
419
- `OpenAI subscription: ${openAiActive ? 'active' : openAiPending ? 'pending' : 'not detected'}`,
420
- `OpenAI API key: ${openAiApiKeyConfigured ? 'configured' : 'not detected'}`,
376
+ `Default route: ${providerRouteLabel}`,
377
+ `Provider account routes: ${configuredAccounts.length}`,
378
+ `Subscription sessions: ${activeSubscriptions.length} active / ${pendingSubscriptions.length} pending`,
421
379
  `Provider credential references: ${providerSecretCount}`,
422
380
  ],
423
381
  fields,
@@ -461,210 +419,6 @@ export function buildDefaultModelStep(controller: OnboardingWizardController): O
461
419
  };
462
420
  }
463
421
 
464
- export function buildAgentKnowledgeStep(): OnboardingWizardStepDefinition {
465
- return {
466
- id: 'agent-knowledge',
467
- title: 'Agent Knowledge',
468
- shortLabel: 'Knowledge',
469
- description: 'Agent Knowledge is isolated to the GoodVibes Agent product segment. It never falls back to default Knowledge/Wiki or any non-Agent product segment.',
470
- summaryTitle: 'Knowledge isolation',
471
- summaryLines: [
472
- 'Route segment: /api/goodvibes-agent/knowledge/*',
473
- 'Default wiki fallback: disabled',
474
- 'Non-Agent route fallback: disabled',
475
- ],
476
- fields: [
477
- {
478
- kind: 'status',
479
- id: 'agent-knowledge.route',
480
- label: 'Isolated Agent Knowledge route',
481
- hint: 'Ask, search, status, and ingest use /api/goodvibes-agent/knowledge/* only.',
482
- defaultValue: 'Isolated',
483
- },
484
- {
485
- kind: 'status',
486
- id: 'agent-knowledge.no-default-wiki',
487
- label: 'Default Knowledge/Wiki fallback',
488
- hint: 'Agent setup and Agent ask/search must not query the default wiki when Agent Knowledge has no answer.',
489
- defaultValue: 'Blocked',
490
- },
491
- {
492
- kind: 'status',
493
- id: 'agent-knowledge.no-non-agent-routes',
494
- label: 'Non-Agent route fallback',
495
- hint: 'Other product routes are not part of Agent Knowledge.',
496
- defaultValue: 'Blocked',
497
- },
498
- ],
499
- };
500
- }
501
-
502
- export function buildLocalStateStep(): OnboardingWizardStepDefinition {
503
- return {
504
- id: 'agent-local-state',
505
- title: 'Local memory and behavior',
506
- shortLabel: 'Memory',
507
- description: 'Review the Agent-local behavior model. Memory, personas, skills, routines, and Agent profiles stay local until a stable shared registry exists.',
508
- summaryTitle: 'Local Agent state',
509
- summaryLines: [
510
- 'Memory/personas/skills/routines: local Agent registries',
511
- 'Secrets: rejected or stored by secret reference',
512
- 'Profiles: isolated Agent homes',
513
- ],
514
- fields: [
515
- {
516
- kind: 'status',
517
- id: 'agent-local-state.memory',
518
- label: 'Local memory',
519
- hint: 'Use /memory to create, review, stale, search, and delete Agent-local memory records.',
520
- defaultValue: 'Local registry',
521
- },
522
- {
523
- kind: 'status',
524
- id: 'agent-local-state.personas',
525
- label: 'Personas',
526
- hint: 'Use /personas to create and activate serial operating modes for the main conversation.',
527
- defaultValue: 'Local registry',
528
- },
529
- {
530
- kind: 'status',
531
- id: 'agent-local-state.skills',
532
- label: 'Skills',
533
- hint: 'Use /agent-skills and /skills local to manage reusable Agent procedures.',
534
- defaultValue: 'Local registry',
535
- },
536
- {
537
- kind: 'status',
538
- id: 'agent-local-state.routines',
539
- label: 'Routines',
540
- hint: 'Use /routines for reusable local procedures. Starting a routine prints steps in the main conversation and does not spawn hidden work.',
541
- defaultValue: 'Local registry',
542
- },
543
- ],
544
- };
545
- }
546
-
547
- export function buildAutomationStep(): OnboardingWizardStepDefinition {
548
- return {
549
- id: 'agent-automation',
550
- title: 'Routines and automation',
551
- shortLabel: 'Routines',
552
- description: 'Set the Agent automation posture: local routines run in the main conversation, while external schedules remain explicit.',
553
- summaryTitle: 'Routine and schedule posture',
554
- summaryLines: [
555
- 'Local routines: reusable main-conversation workflows',
556
- 'External schedules: explicit promotion only',
557
- 'Runs/cancels/retries: command-confirmed side effects',
558
- ],
559
- fields: [
560
- {
561
- kind: 'status',
562
- id: 'agent-automation.local-routines',
563
- label: 'Local routine library',
564
- hint: 'Use /routines or the Agent workspace to create, review, enable, and start local routines without spawning hidden jobs.',
565
- defaultValue: 'Local registry',
566
- },
567
- {
568
- kind: 'status',
569
- id: 'agent-automation.schedule-observability',
570
- label: 'Schedule observability',
571
- hint: 'Use /schedule list, /schedule reconcile, and automation views to inspect externally owned jobs and runs.',
572
- defaultValue: 'Read first',
573
- },
574
- {
575
- kind: 'status',
576
- id: 'agent-automation.schedule-promotion',
577
- label: 'Routine-to-schedule promotion',
578
- hint: 'Creating external schedules from routines requires a reviewed routine, a real timing expression, optional delivery target, and explicit confirmation.',
579
- defaultValue: 'Explicit command',
580
- },
581
- {
582
- kind: 'status',
583
- id: 'agent-automation.mutations',
584
- label: 'Automation mutations',
585
- hint: 'Run, pause, resume, cancel, retry, approve, and deny actions are never inferred from chat; they require exact commands and confirmation.',
586
- defaultValue: 'Confirmed only',
587
- },
588
- ],
589
- };
590
- }
591
-
592
- export function buildVoiceMediaStep(): OnboardingWizardStepDefinition {
593
- return {
594
- id: 'agent-voice-media',
595
- title: 'Voice and media',
596
- shortLabel: 'Voice',
597
- description: 'Prepare voice, speech, image input, and media understanding as Agent operator tools rather than runtime lifecycle features.',
598
- summaryTitle: 'Voice and media posture',
599
- summaryLines: [
600
- 'Voice and speech: optional operator tools',
601
- 'Image/audio inputs: explicit attachment workflows',
602
- 'Media generation and playback: provider-backed and policy-gated',
603
- ],
604
- fields: [
605
- {
606
- kind: 'status',
607
- id: 'agent-voice-media.voice',
608
- label: 'Voice interaction',
609
- hint: 'Use the voice/media workspace and TTS settings to configure spoken responses for the Agent conversation.',
610
- defaultValue: 'Optional',
611
- },
612
- {
613
- kind: 'status',
614
- id: 'agent-voice-media.attachments',
615
- label: 'Image and audio input',
616
- hint: 'Attach files explicitly to a prompt or command. Agent does not ingest media into Knowledge without an Agent Knowledge ingest action.',
617
- defaultValue: 'Explicit input',
618
- },
619
- {
620
- kind: 'status',
621
- id: 'agent-voice-media.output',
622
- label: 'Generated media and playback',
623
- hint: 'Media output uses configured providers and visible command/turn flow; external publication still requires explicit approval.',
624
- defaultValue: 'Policy gated',
625
- },
626
- ],
627
- };
628
- }
629
-
630
- export function buildDelegationPolicyStep(): OnboardingWizardStepDefinition {
631
- return {
632
- id: 'agent-delegation',
633
- title: 'Build delegation',
634
- shortLabel: 'Delegate',
635
- description: 'GoodVibes Agent is not the coding TUI. Explicit build, fix, review, or implementation work is delegated to GoodVibes TUI; ordinary assistant work stays serial in this conversation.',
636
- summaryTitle: 'Delegation policy',
637
- summaryLines: [
638
- 'Normal chat: main Agent conversation',
639
- 'Build/fix/review: explicit GoodVibes TUI delegation',
640
- 'WRFC: only when explicitly requested for build/fix/review',
641
- ],
642
- fields: [
643
- {
644
- kind: 'status',
645
- id: 'agent-delegation.normal-chat',
646
- label: 'Normal assistant work',
647
- hint: 'Planning, research, summaries, local memory updates, and safe read-only checks stay in the main Agent conversation.',
648
- defaultValue: 'Serial',
649
- },
650
- {
651
- kind: 'status',
652
- id: 'agent-delegation.build-work',
653
- label: 'Build/fix/review work',
654
- hint: 'Use /delegate with the full original task. GoodVibes TUI owns coding execution and WRFC chains.',
655
- defaultValue: 'Explicit delegation',
656
- },
657
- {
658
- kind: 'status',
659
- id: 'agent-delegation.wrfc',
660
- label: 'WRFC policy',
661
- hint: 'Agent never uses WRFC by default; request it only for explicit build, fix, review, or implementation work.',
662
- defaultValue: 'Explicit only',
663
- },
664
- ],
665
- };
666
- }
667
-
668
422
  export function buildExperienceStep(controller: OnboardingWizardController): OnboardingWizardStepDefinition {
669
423
  return {
670
424
  id: 'experience',
package/src/main.ts CHANGED
@@ -289,7 +289,7 @@ async function main() {
289
289
  if (processedText.startsWith('!#')) {
290
290
  const memoryText = processedText.slice(2).trim();
291
291
  if (!memoryText) {
292
- systemMessageRouter.high('[Memory] Usage: !# <text to pin as session memory>');
292
+ systemMessageRouter.high('[Memory] Usage: !# <text to pin as conversation-pinned memory>');
293
293
  render();
294
294
  processedText = '';
295
295
  } else {
@@ -70,7 +70,7 @@ export function renderHelpOverlay(
70
70
  // Commands not registered in the live registry are omitted at render time.
71
71
  const FEATURED_COMMANDS: Array<[name: string, argHint: string, desc: string]> = [
72
72
  ['agent', '', 'Open the Agent operator workspace'],
73
- ['onboarding', '', 'Open Agent setup with current settings preloaded'],
73
+ ['setup', '', 'Open Agent setup with current settings preloaded'],
74
74
  ['knowledge', 'status', 'Inspect isolated Agent Knowledge readiness'],
75
75
  ['memory', '', 'Manage local Agent memory records'],
76
76
  ['personas', '', 'Manage serial Agent operating personas'],
@@ -119,7 +119,7 @@ export function renderHelpOverlay(
119
119
  commandRows.push('', ' Available Slash Commands', ' ' + '\u2500'.repeat(40));
120
120
  const preferred = [
121
121
  'agent',
122
- 'onboarding',
122
+ 'setup',
123
123
  'knowledge',
124
124
  'memory',
125
125
  'personas',
@@ -238,7 +238,7 @@ export function renderShortcutsOverlay(
238
238
  row(kb('clear-prompt'), 'Clear prompt'),
239
239
  row(kb('delete-word'), 'Delete word backward'),
240
240
  row(kb('kill-line'), 'Kill to end of line'),
241
- row(kb('apply-diff-line-start'), 'Diff apply blocked / line start'),
241
+ row(kb('apply-diff-line-start'), 'Delegate diff changes / line start'),
242
242
  row(kb('next-error-line-end'), 'Next error / line end'),
243
243
  '',
244
244
  ' Actions',
@@ -246,7 +246,7 @@ export function renderShortcutsOverlay(
246
246
  row('Tab', 'Collapse/expand block'),
247
247
  row(kb('bookmark'), 'Bookmark block'),
248
248
  row(kb('block-copy'), 'Copy block to clipboard'),
249
- row(kb('block-save'), 'Block save blocked; use /share --yes'),
249
+ row(kb('block-save'), 'Block file save disabled; copy or export'),
250
250
  row(kb('copy-selection'), 'Copy selection'),
251
251
  row('F2', 'Process monitor'),
252
252
  row('?', 'Help overlay'),
@@ -31,7 +31,7 @@ const CATEGORY_INFO: Record<SettingsCategory, string> = {
31
31
  storage: 'Local storage posture, including secret storage policy and maximum artifact size for Agent Knowledge, artifacts, and document ingestion.',
32
32
  permissions: 'Permission mode and tool-class policy. These settings decide whether the shell prompts before read/write/exec/network/agent actions.',
33
33
  orchestration: 'Agent orchestration limits and recursion controls.',
34
- wrfc: 'WRFC is external to normal Agent operation. Review these copied compatibility values only for explicit GoodVibes TUI build delegation.',
34
+ wrfc: 'WRFC is external to normal Agent operation. Review these runtime compatibility values only for explicit GoodVibes TUI build delegation.',
35
35
  helper: 'Helper model defaults used by helper subsystems when they do not use the main chat route.',
36
36
  tts: 'Text-to-speech provider, voice, and optional spoken-turn LLM overrides.',
37
37
  service: 'External runtime installation posture. Agent shows these compatibility keys for inspection only and does not install, start, stop, restart, or autostart anything.',
@@ -553,8 +553,8 @@ export async function bootstrapRuntime(
553
553
  };
554
554
 
555
555
  // ── Phase 12b: Operator intervention wiring (feature-gated) ──────────────
556
- // Keep the copied control-plane state internal. GoodVibes Agent does not
557
- // expose the copied local ops-control panel; operator control is surfaced
556
+ // Keep runtime-owned control-plane state internal. GoodVibes Agent does not
557
+ // expose the local ops-control panel; operator control is surfaced
558
558
  // through Agent-owned status, approvals, automation, and delegation flows.
559
559
  ctx.commandContext.ops.acpManager = acpManager;
560
560
 
@@ -1,16 +1,16 @@
1
1
  import type { Tool } from '@pellux/goodvibes-sdk/platform/types';
2
2
 
3
3
  const CONTEXT_TOOL_DENIAL = [
4
- 'GoodVibes Agent does not expose copied GoodVibes runtime context through model tools in the main conversation.',
5
- 'The copied context tool can describe TUI/default runtime assumptions that are not the Agent product boundary.',
4
+ 'GoodVibes Agent does not expose non-Agent runtime context through model tools in the main conversation.',
5
+ 'The runtime context tool can describe assumptions that are outside the Agent product boundary.',
6
6
  'Use explicit Agent CLI/slash commands such as status, compat, setup, and isolated Agent Knowledge instead.',
7
7
  ].join(' ');
8
8
 
9
9
  export function wrapBlockedContextToolForAgentPolicy(tool: Tool): void {
10
10
  tool.definition.description = [
11
- 'Blocked in GoodVibes Agent main conversation: copied runtime context.',
11
+ 'Blocked in GoodVibes Agent main conversation: non-Agent runtime context.',
12
12
  'Use explicit Agent CLI/slash status, compat, setup, and Agent Knowledge commands for product-scoped context.',
13
- 'Default Knowledge/Wiki, non-Agent knowledge segments, and copied TUI runtime assumptions are not Agent fallbacks.',
13
+ 'Default Knowledge/Wiki, non-Agent knowledge segments, and non-Agent runtime assumptions are not Agent fallbacks.',
14
14
  ].join(' ');
15
15
  tool.definition.sideEffects = [];
16
16
  tool.definition.parameters = {
@@ -166,8 +166,8 @@ const FETCH_NETWORK_MUTATION_DENIAL = [
166
166
  ].join(' ');
167
167
 
168
168
  const STATE_MUTATION_DENIAL = [
169
- 'GoodVibes Agent only inspects copied runtime state from the main conversation.',
170
- 'Arbitrary state set/clear, copied memory writes, hook mutation, output-mode mutation, and analytics writes are disabled here.',
169
+ 'GoodVibes Agent only inspects runtime-owned state from the main conversation.',
170
+ 'Arbitrary state set/clear, runtime-owned memory writes, hook mutation, output-mode mutation, and analytics writes are disabled here.',
171
171
  'Use Agent-owned memory, skills, personas, routines, and explicit CLI/slash commands for intentional local state changes.',
172
172
  ].join(' ');
173
173
 
@@ -184,13 +184,13 @@ const INSPECT_WRITE_DENIAL = [
184
184
  ].join(' ');
185
185
 
186
186
  const DURABLE_WORKFLOW_MUTATION_DENIAL = [
187
- 'GoodVibes Agent only inspects copied durable workflow tools from the main conversation.',
187
+ 'GoodVibes Agent only inspects runtime-owned durable workflow tools from the main conversation.',
188
188
  'Task, team, worklist, packet, and query creation or lifecycle mutation is disabled here.',
189
189
  'Use explicit Agent CLI/slash commands or GoodVibes TUI delegation for intentional workflow changes.',
190
190
  ].join(' ');
191
191
 
192
192
  const CONTROL_MUTATION_DENIAL = [
193
- 'GoodVibes Agent only inspects copied product-control surfaces from the main conversation.',
193
+ 'GoodVibes Agent only inspects runtime-owned product-control surfaces from the main conversation.',
194
194
  'Product-control mutation, daemon lifecycle, and service posture changes are disabled here.',
195
195
  'Use explicit Agent CLI/slash commands for Agent-owned changes, and keep daemon lifecycle external.',
196
196
  ].join(' ');
@@ -290,7 +290,7 @@ export function installAgentToolPolicyGuard(registry: ToolRegistry, options: Age
290
290
  wrapModeRestrictedToolForAgentPolicy(tool, {
291
291
  allowedModes: READ_ONLY_QUERY_TOOL_MODES,
292
292
  modeSet: READ_ONLY_QUERY_TOOL_MODE_SET,
293
- description: 'Read-only operator query inspection for GoodVibes Agent. Asking, answering, and closing copied workflow queries are disabled in the main conversation.',
293
+ description: 'Read-only operator query inspection for GoodVibes Agent. Asking, answering, and closing runtime-owned workflow queries are disabled in the main conversation.',
294
294
  denial: DURABLE_WORKFLOW_MUTATION_DENIAL,
295
295
  removedProperties: ['prompt', 'askedBy', 'target', 'answer', 'resolution'],
296
296
  });
@@ -701,8 +701,8 @@ function narrowFetchToolDefinitionForAgentPolicy(tool: Tool): void {
701
701
 
702
702
  function narrowStateToolDefinitionForAgentPolicy(tool: Tool): void {
703
703
  tool.definition.description = [
704
- 'Inspect copied runtime state for GoodVibes Agent.',
705
- 'State mutation, copied memory writes, hook changes, output-mode changes, and analytics writes are disabled in the main conversation.',
704
+ 'Inspect runtime-owned state for GoodVibes Agent.',
705
+ 'State mutation, runtime-owned memory writes, hook changes, output-mode changes, and analytics writes are disabled in the main conversation.',
706
706
  'Use Agent-owned commands for intentional memory, skill, persona, and routine changes.',
707
707
  ].join(' ');
708
708
 
@@ -711,7 +711,7 @@ function narrowStateToolDefinitionForAgentPolicy(tool: Tool): void {
711
711
  const modeProperty = properties.mode;
712
712
  if (isRecord(modeProperty)) {
713
713
  modeProperty.enum = [...READ_ONLY_STATE_TOOL_MODES];
714
- modeProperty.description = 'Read-only copied runtime state mode. set and clear are disabled in GoodVibes Agent.';
714
+ modeProperty.description = 'Read-only runtime-owned state mode. set and clear are disabled in GoodVibes Agent.';
715
715
  }
716
716
 
717
717
  delete properties.values;
@@ -727,7 +727,7 @@ function narrowStateToolDefinitionForAgentPolicy(tool: Tool): void {
727
727
  delete properties.analyticsTokens;
728
728
  delete properties.analyticsFormat;
729
729
 
730
- narrowStringEnumProperty(properties, 'memoryAction', READ_ONLY_STATE_MEMORY_ACTIONS, 'Read-only copied memory actions allowed by GoodVibes Agent.');
730
+ narrowStringEnumProperty(properties, 'memoryAction', READ_ONLY_STATE_MEMORY_ACTIONS, 'Read-only runtime-owned memory actions allowed by GoodVibes Agent.');
731
731
  narrowStringEnumProperty(properties, 'hookAction', READ_ONLY_STATE_HOOK_ACTIONS, 'Read-only hook action allowed by GoodVibes Agent.');
732
732
  narrowStringEnumProperty(properties, 'modeAction', READ_ONLY_STATE_MODE_ACTIONS, 'Read-only mode actions allowed by GoodVibes Agent.');
733
733
  narrowStringEnumProperty(properties, 'analyticsAction', READ_ONLY_STATE_ANALYTICS_ACTIONS, 'Read-only analytics actions allowed by GoodVibes Agent.');
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.105';
9
+ let _version = '0.1.107';
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 {