@pellux/goodvibes-agent 0.1.104 → 0.1.106
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 +16 -0
- package/README.md +9 -2
- package/docs/getting-started.md +9 -2
- package/docs/release-and-publishing.md +5 -3
- package/package.json +1 -1
- package/src/cli/help.ts +11 -11
- package/src/cli/management-commands.ts +1 -1
- package/src/cli/package-verification.ts +5 -5
- package/src/cli/service-posture.ts +11 -10
- package/src/cli/status.ts +29 -25
- package/src/input/agent-workspace-categories.ts +5 -5
- package/src/input/commands/guidance-runtime.ts +2 -2
- package/src/input/commands/health-runtime.ts +1 -1
- package/src/input/commands/onboarding-runtime.ts +4 -3
- package/src/input/commands/platform-access-runtime.ts +31 -79
- package/src/input/commands/session-content.ts +24 -41
- package/src/input/commands.ts +15 -0
- package/src/input/handler-content-actions.ts +1 -1
- package/src/input/keybindings.ts +2 -2
- package/src/input/onboarding/onboarding-wizard-operator-steps.ts +295 -0
- package/src/input/onboarding/onboarding-wizard-steps.ts +63 -309
- package/src/main.ts +1 -1
- package/src/panels/builtin/usage.ts +21 -0
- package/src/panels/builtin-panels.ts +2 -2
- package/src/panels/panel-list-panel.ts +1 -2
- package/src/panels/panel-picker.ts +1 -2
- package/src/panels/types.ts +1 -1
- package/src/renderer/help-overlay.ts +4 -4
- package/src/renderer/settings-modal.ts +1 -1
- package/src/runtime/bootstrap.ts +2 -2
- package/src/tools/agent-context-policy.ts +4 -4
- package/src/tools/agent-tool-policy-guard.ts +9 -9
- package/src/version.ts +1 -1
- package/src/panels/builtin/development.ts +0 -31
|
@@ -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.
|
|
349
|
-
label: '
|
|
350
|
-
hint:
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
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
|
-
? '
|
|
370
|
-
: 'Optional: enter an OpenAI API key now.
|
|
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
|
|
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
|
-
`
|
|
420
|
-
`
|
|
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
|
|
292
|
+
systemMessageRouter.high('[Memory] Usage: !# <text to pin as conversation-pinned memory>');
|
|
293
293
|
render();
|
|
294
294
|
processedText = '';
|
|
295
295
|
} else {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { PanelManager } from '../panel-manager.ts';
|
|
2
|
+
import { CostTrackerPanel } from '../cost-tracker-panel.ts';
|
|
3
|
+
import type { ResolvedBuiltinPanelDeps } from './shared.ts';
|
|
4
|
+
import { requireUiServices } from './shared.ts';
|
|
5
|
+
|
|
6
|
+
export function registerUsagePanels(manager: PanelManager, deps: ResolvedBuiltinPanelDeps): void {
|
|
7
|
+
if (!deps.getOrchestratorUsage) return;
|
|
8
|
+
|
|
9
|
+
const { getOrchestratorUsage, budgetThreshold } = deps;
|
|
10
|
+
manager.registerType({
|
|
11
|
+
id: 'cost',
|
|
12
|
+
name: 'Cost',
|
|
13
|
+
icon: '$',
|
|
14
|
+
category: 'monitoring',
|
|
15
|
+
description: 'Estimated assistant usage costs for this session and explicit delegated work, with budget alerts',
|
|
16
|
+
factory: () => {
|
|
17
|
+
const ui = requireUiServices(deps);
|
|
18
|
+
return new CostTrackerPanel(ui.events.turns, ui.events.agents, getOrchestratorUsage, { budgetThreshold });
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { PanelManager } from './panel-manager.ts';
|
|
2
2
|
import { resolveBuiltinPanelDeps, type BuiltinPanelDeps } from './builtin/shared.ts';
|
|
3
|
-
import {
|
|
3
|
+
import { registerUsagePanels } from './builtin/usage.ts';
|
|
4
4
|
import { registerOperationsPanels } from './builtin/operations.ts';
|
|
5
5
|
import { registerAgentPanels } from './builtin/agent.ts';
|
|
6
6
|
import { registerSessionPanels } from './builtin/session.ts';
|
|
@@ -13,7 +13,7 @@ import { registerKnowledgePanels } from './builtin/knowledge.ts';
|
|
|
13
13
|
*/
|
|
14
14
|
export function registerBuiltinPanels(manager: PanelManager, deps: BuiltinPanelDeps): void {
|
|
15
15
|
const resolved = resolveBuiltinPanelDeps(deps);
|
|
16
|
-
|
|
16
|
+
registerUsagePanels(manager, resolved);
|
|
17
17
|
registerOperationsPanels(manager, resolved);
|
|
18
18
|
registerAgentPanels(manager, resolved);
|
|
19
19
|
registerSessionPanels(manager, resolved);
|
|
@@ -65,9 +65,8 @@ const C = {
|
|
|
65
65
|
intro: '#94a3b8',
|
|
66
66
|
} as const;
|
|
67
67
|
|
|
68
|
-
const CATEGORY_ORDER: PanelCategory[] = ['
|
|
68
|
+
const CATEGORY_ORDER: PanelCategory[] = ['agent', 'monitoring', 'session', 'ai'];
|
|
69
69
|
const CATEGORY_LABELS: Record<PanelCategory, string> = {
|
|
70
|
-
development: 'Development',
|
|
71
70
|
agent: 'Agent',
|
|
72
71
|
monitoring: 'Monitoring',
|
|
73
72
|
session: 'Session',
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import type { PanelRegistration, PanelCategory } from './types.ts';
|
|
2
2
|
|
|
3
3
|
/** Display order for panel categories. */
|
|
4
|
-
const CATEGORY_ORDER: PanelCategory[] = ['
|
|
4
|
+
const CATEGORY_ORDER: PanelCategory[] = ['agent', 'monitoring', 'session', 'ai'];
|
|
5
5
|
|
|
6
6
|
/** Human-readable labels for each category. */
|
|
7
7
|
const CATEGORY_LABELS: Record<PanelCategory, string> = {
|
|
8
|
-
development: 'Development',
|
|
9
8
|
agent: 'Agent',
|
|
10
9
|
monitoring: 'Monitoring',
|
|
11
10
|
session: 'Session',
|
package/src/panels/types.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Line } from '../types/grid.ts';
|
|
2
2
|
import type { ComponentResourceContract, ComponentHealthState } from '../runtime/perf/panel-contracts.ts';
|
|
3
3
|
|
|
4
|
-
export type PanelCategory = '
|
|
4
|
+
export type PanelCategory = 'agent' | 'monitoring' | 'session' | 'ai';
|
|
5
5
|
|
|
6
6
|
export interface Panel {
|
|
7
7
|
id: string;
|
|
@@ -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
|
-
['
|
|
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
|
-
'
|
|
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'), '
|
|
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
|
|
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
|
|
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.',
|
package/src/runtime/bootstrap.ts
CHANGED
|
@@ -553,8 +553,8 @@ export async function bootstrapRuntime(
|
|
|
553
553
|
};
|
|
554
554
|
|
|
555
555
|
// ── Phase 12b: Operator intervention wiring (feature-gated) ──────────────
|
|
556
|
-
// Keep
|
|
557
|
-
// expose the
|
|
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
|
|
5
|
-
'The
|
|
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:
|
|
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
|
|
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 = {
|