@pellux/goodvibes-agent 0.1.116 → 1.0.0
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 +48 -661
- package/README.md +64 -57
- package/bin/goodvibes-agent.ts +16 -2
- package/dist/package/main.js +199180 -192185
- package/docs/README.md +15 -8
- package/docs/channels-remote-and-api.md +50 -0
- package/docs/connected-host.md +59 -0
- package/docs/getting-started.md +61 -50
- package/docs/knowledge-artifacts-and-multimodal.md +91 -0
- package/docs/project-planning.md +79 -0
- package/docs/providers-and-routing.md +46 -0
- package/docs/release-and-publishing.md +48 -11
- package/docs/tools-and-commands.md +123 -0
- package/docs/voice-and-live-tts.md +51 -0
- package/package.json +3 -6
- package/src/agent/behavior-discovery-summary.ts +1 -3
- package/src/agent/channel-delivery.ts +201 -0
- package/src/agent/media-generation.ts +159 -0
- package/src/agent/memory-prompt.ts +0 -1
- package/src/agent/note-registry.ts +329 -0
- package/src/agent/operator-actions.ts +343 -0
- package/src/agent/persona-discovery.ts +1 -3
- package/src/agent/persona-registry.ts +19 -16
- package/src/agent/record-labels.ts +107 -0
- package/src/agent/reminder-schedule-format.ts +33 -24
- package/src/agent/reminder-schedule.ts +27 -26
- package/src/agent/routine-registry.ts +54 -14
- package/src/agent/routine-schedule-args.ts +2 -1
- package/src/agent/routine-schedule-format.ts +77 -53
- package/src/agent/routine-schedule-promotion.ts +35 -33
- package/src/agent/routine-schedule-receipts.ts +29 -27
- package/src/agent/runtime-profile-starters.ts +5 -5
- package/src/agent/runtime-profile.ts +91 -12
- package/src/agent/skill-registry.ts +210 -32
- package/src/cli/agent-knowledge-args.ts +5 -1
- package/src/cli/agent-knowledge-command.ts +40 -34
- package/src/cli/agent-knowledge-format.ts +80 -67
- package/src/cli/agent-knowledge-methods.ts +1 -1
- package/src/cli/agent-knowledge-runtime.ts +32 -26
- package/src/cli/bundle-command.ts +14 -9
- package/src/cli/config-overrides.ts +37 -36
- package/src/cli/entrypoint.ts +16 -7
- package/src/cli/external-runtime.ts +10 -4
- package/src/cli/help.ts +54 -29
- package/src/cli/local-library-command.ts +203 -83
- package/src/cli/management-commands.ts +105 -68
- package/src/cli/management.ts +55 -74
- package/src/cli/memory-command.ts +66 -32
- package/src/cli/parser.ts +37 -3
- package/src/cli/profiles-command.ts +166 -31
- package/src/cli/provider-auth-routes.ts +2 -1
- package/src/cli/routines-command.ts +176 -40
- package/src/cli/service-posture.ts +16 -16
- package/src/cli/status.ts +56 -135
- package/src/core/conversation-message-snapshot.ts +131 -0
- package/src/input/agent-workspace-access-command-editor-submission.ts +149 -0
- package/src/input/agent-workspace-access-command-editors.ts +170 -0
- package/src/input/agent-workspace-activation.ts +35 -8
- package/src/input/agent-workspace-basic-command-editor-submission.ts +351 -94
- package/src/input/agent-workspace-basic-command-editors.ts +502 -9
- package/src/input/agent-workspace-categories.ts +423 -51
- package/src/input/agent-workspace-channel-command-editor-submission.ts +83 -0
- package/src/input/agent-workspace-channel-command-editors.ts +65 -0
- package/src/input/agent-workspace-channels.ts +35 -2
- package/src/input/agent-workspace-command-editor.ts +41 -3
- package/src/input/agent-workspace-config-reader.ts +16 -0
- package/src/input/agent-workspace-delegation-editor-submission.ts +55 -0
- package/src/input/agent-workspace-editors.ts +166 -1
- package/src/input/agent-workspace-knowledge-command-editor-submission.ts +132 -0
- package/src/input/agent-workspace-knowledge-command-editors.ts +110 -0
- package/src/input/agent-workspace-knowledge-query-editor.ts +1 -1
- package/src/input/agent-workspace-learned-behavior.ts +67 -0
- package/src/input/agent-workspace-library-command-editor-submission.ts +50 -0
- package/src/input/agent-workspace-library-command-editors.ts +35 -0
- package/src/input/agent-workspace-local-operations.ts +218 -0
- package/src/input/agent-workspace-local-selection.ts +75 -0
- package/src/input/agent-workspace-mcp-command-editor-submission.ts +95 -0
- package/src/input/agent-workspace-media-command-editor-submission.ts +62 -0
- package/src/input/agent-workspace-media-command-editors.ts +27 -0
- package/src/input/agent-workspace-memory-command-editor-submission.ts +232 -0
- package/src/input/agent-workspace-memory-command-editors.ts +180 -0
- package/src/input/agent-workspace-memory-editor.ts +2 -2
- package/src/input/agent-workspace-navigation.ts +81 -0
- package/src/input/agent-workspace-notify-editor-submission.ts +121 -0
- package/src/input/agent-workspace-operations-command-editor-submission.ts +208 -0
- package/src/input/agent-workspace-operations-command-editors.ts +196 -0
- package/src/input/agent-workspace-panel-route.ts +43 -0
- package/src/input/agent-workspace-provider-command-editor-submission.ts +155 -0
- package/src/input/agent-workspace-provider-command-editors.ts +93 -0
- package/src/input/agent-workspace-reminder-schedule-editor.ts +1 -1
- package/src/input/agent-workspace-requirements.ts +11 -0
- package/src/input/agent-workspace-routine-schedule-editor.ts +2 -2
- package/src/input/agent-workspace-search.ts +169 -0
- package/src/input/agent-workspace-secret-editor-submission.ts +153 -0
- package/src/input/agent-workspace-session-command-editor-submission.ts +199 -0
- package/src/input/agent-workspace-session-command-editors.ts +249 -0
- package/src/input/agent-workspace-setup.ts +37 -16
- package/src/input/agent-workspace-skill-bundle-command-editor-submission.ts +101 -0
- package/src/input/agent-workspace-skill-bundle-command-editors.ts +110 -0
- package/src/input/agent-workspace-snapshot.ts +162 -21
- package/src/input/agent-workspace-task-command-editor-submission.ts +61 -0
- package/src/input/agent-workspace-task-command-editors.ts +47 -0
- package/src/input/agent-workspace-token.ts +18 -2
- package/src/input/agent-workspace-types.ts +212 -4
- package/src/input/agent-workspace-voice-media.ts +4 -7
- package/src/input/agent-workspace-web-research-editor.ts +104 -0
- package/src/input/agent-workspace-workplan-editor-submission.ts +153 -0
- package/src/input/agent-workspace.ts +178 -240
- package/src/input/command-registry.ts +5 -2
- package/src/input/commands/agent-runtime-profile-runtime.ts +126 -37
- package/src/input/commands/agent-skills-runtime.ts +149 -72
- package/src/input/commands/agent-workspace-runtime.ts +23 -6
- package/src/input/commands/brief-runtime.ts +55 -25
- package/src/input/commands/channels-runtime.ts +147 -33
- package/src/input/commands/compat-runtime.ts +32 -0
- package/src/input/commands/delegation-runtime.ts +29 -23
- package/src/input/commands/experience-runtime.ts +6 -4
- package/src/input/commands/guidance-runtime.ts +4 -4
- package/src/input/commands/health-runtime.ts +149 -126
- package/src/input/commands/knowledge.ts +82 -60
- package/src/input/commands/local-provider-runtime.ts +43 -21
- package/src/input/commands/local-runtime.ts +138 -16
- package/src/input/commands/local-setup-review.ts +10 -20
- package/src/input/commands/mcp-runtime.ts +63 -46
- package/src/input/commands/notify-runtime.ts +38 -9
- package/src/input/commands/operator-actions-runtime.ts +138 -0
- package/src/input/commands/operator-runtime.ts +6 -76
- package/src/input/commands/personas-runtime.ts +46 -31
- package/src/input/commands/planning-runtime.ts +1 -1
- package/src/input/commands/platform-access-runtime.ts +35 -98
- package/src/input/commands/product-runtime.ts +2 -2
- package/src/input/commands/provider-accounts-runtime.ts +60 -39
- package/src/input/commands/qrcode-runtime.ts +50 -9
- package/src/input/commands/recall-bundle.ts +11 -11
- package/src/input/commands/recall-capture.ts +13 -11
- package/src/input/commands/recall-query.ts +29 -21
- package/src/input/commands/recall-review.ts +2 -1
- package/src/input/commands/routines-runtime.ts +99 -45
- package/src/input/commands/runtime-services.ts +1 -14
- package/src/input/commands/schedule-runtime.ts +33 -20
- package/src/input/commands/security-runtime.ts +6 -11
- package/src/input/commands/session-content.ts +80 -78
- package/src/input/commands/session-workflow.ts +134 -104
- package/src/input/commands/session.ts +3 -174
- package/src/input/commands/shell-core.ts +38 -17
- package/src/input/commands/subscription-runtime.ts +54 -185
- package/src/input/commands/support-bundle-runtime.ts +53 -0
- package/src/input/commands/tasks-runtime.ts +21 -21
- package/src/input/commands/work-plan-runtime.ts +33 -8
- package/src/input/commands.ts +6 -2
- package/src/input/feed-context-factory.ts +2 -2
- package/src/input/file-picker.ts +3 -2
- package/src/input/handler-command-route.ts +4 -7
- package/src/input/handler-content-actions.ts +89 -26
- package/src/input/handler-feed-routes.ts +19 -12
- package/src/input/handler-feed.ts +6 -5
- package/src/input/handler-interactions.ts +9 -36
- package/src/input/handler-modal-stack.ts +3 -3
- package/src/input/handler-onboarding.ts +52 -91
- package/src/input/handler-shortcuts.ts +16 -7
- package/src/input/handler.ts +50 -23
- package/src/input/input-history.ts +5 -6
- package/src/input/keybindings.ts +27 -16
- package/src/input/mcp-workspace.ts +90 -26
- package/src/input/onboarding/handler-onboarding-routes.ts +3 -1
- package/src/input/onboarding/onboarding-wizard-apply.ts +62 -0
- package/src/input/onboarding/onboarding-wizard-constants.ts +1 -0
- package/src/input/onboarding/onboarding-wizard-helpers.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-operator-steps.ts +223 -55
- package/src/input/onboarding/onboarding-wizard-steps.ts +59 -35
- package/src/input/onboarding/onboarding-wizard-types.ts +4 -1
- package/src/input/onboarding/onboarding-wizard.ts +87 -2
- package/src/input/profile-picker-modal.ts +31 -12
- package/src/input/session-picker-modal.ts +21 -4
- package/src/input/settings-modal-agent-policy.ts +6 -6
- package/src/input/settings-modal-behavior.ts +0 -3
- package/src/input/settings-modal-subscriptions.ts +3 -3
- package/src/input/settings-modal-types.ts +2 -13
- package/src/input/settings-modal.ts +20 -66
- package/src/input/submission-intent.ts +0 -1
- package/src/input/submission-router.ts +3 -3
- package/src/main.ts +18 -10
- package/src/panels/approval-panel.ts +8 -8
- package/src/panels/automation-control-panel.ts +4 -4
- package/src/panels/base-panel.ts +1 -1
- package/src/panels/builtin/agent.ts +1 -1
- package/src/panels/builtin/operations.ts +3 -12
- package/src/panels/builtin/session.ts +32 -24
- package/src/panels/builtin/shared.ts +7 -7
- package/src/panels/cost-tracker-panel.ts +1 -1
- package/src/panels/docs-panel.ts +5 -3
- package/src/panels/index.ts +0 -1
- package/src/panels/knowledge-panel.ts +6 -5
- package/src/panels/memory-panel.ts +7 -6
- package/src/panels/panel-list-panel.ts +36 -80
- package/src/panels/project-planning-panel.ts +19 -12
- package/src/panels/provider-account-snapshot.ts +51 -25
- package/src/panels/provider-accounts-panel.ts +33 -18
- package/src/panels/provider-health-domains.ts +48 -7
- package/src/panels/provider-health-panel.ts +5 -4
- package/src/panels/qr-panel.ts +44 -20
- package/src/panels/schedule-panel.ts +9 -17
- package/src/panels/security-panel.ts +8 -8
- package/src/panels/session-browser-panel.ts +10 -10
- package/src/panels/subscription-panel.ts +6 -6
- package/src/panels/system-messages-panel.ts +3 -3
- package/src/panels/tasks-panel.ts +21 -14
- package/src/panels/tool-inspector-panel.ts +19 -12
- package/src/panels/work-plan-panel.ts +5 -5
- package/src/planning/project-planning-coordinator.ts +3 -3
- package/src/provider-auth-route-display.ts +9 -0
- package/src/renderer/agent-workspace-style.ts +34 -0
- package/src/renderer/agent-workspace.ts +254 -57
- package/src/renderer/autocomplete-overlay.ts +25 -6
- package/src/renderer/block-actions.ts +1 -3
- package/src/renderer/bookmark-modal.ts +19 -4
- package/src/renderer/buffer.ts +4 -2
- package/src/renderer/context-inspector.ts +50 -13
- package/src/renderer/diff.ts +1 -1
- package/src/renderer/file-picker-overlay.ts +19 -6
- package/src/renderer/help-overlay.ts +112 -34
- package/src/renderer/history-search-overlay.ts +19 -4
- package/src/renderer/live-tail-modal.ts +27 -5
- package/src/renderer/mcp-workspace.ts +176 -43
- package/src/renderer/model-picker-overlay.ts +58 -3
- package/src/renderer/model-workspace.ts +104 -22
- package/src/renderer/onboarding/onboarding-wizard.ts +20 -4
- package/src/renderer/process-modal.ts +27 -6
- package/src/renderer/profile-picker-modal.ts +21 -5
- package/src/renderer/search-overlay.ts +25 -5
- package/src/renderer/selection-modal-overlay.ts +46 -14
- package/src/renderer/session-picker-modal.ts +18 -1
- package/src/renderer/settings-modal-helpers.ts +2 -40
- package/src/renderer/settings-modal.ts +88 -55
- package/src/renderer/system-message.ts +1 -1
- package/src/renderer/tool-call.ts +20 -11
- package/src/runtime/agent-runtime-events.ts +129 -0
- package/src/runtime/bootstrap-command-context.ts +7 -1
- package/src/runtime/bootstrap-command-parts.ts +11 -8
- package/src/runtime/bootstrap-core.ts +23 -65
- package/src/runtime/bootstrap-hook-bridge.ts +7 -18
- package/src/runtime/bootstrap-shell.ts +46 -8
- package/src/runtime/bootstrap.ts +36 -46
- package/src/runtime/connected-host-auth.ts +47 -0
- package/src/runtime/diagnostics/panels/index.ts +2 -2
- package/src/runtime/diagnostics/panels/panel-resources.ts +1 -1
- package/src/runtime/diagnostics/panels/policy.ts +7 -7
- package/src/runtime/index.ts +2 -5
- package/src/runtime/onboarding/apply-file-helpers.ts +66 -0
- package/src/runtime/onboarding/apply.ts +288 -74
- package/src/runtime/onboarding/derivation.ts +10 -13
- package/src/runtime/onboarding/snapshot.ts +2 -17
- package/src/runtime/onboarding/types.ts +34 -20
- package/src/runtime/onboarding/verify.ts +105 -4
- package/src/runtime/operator-token-cleanup.ts +3 -3
- package/src/runtime/services.ts +95 -11
- package/src/runtime/store/selectors/index.ts +3 -3
- package/src/runtime/store/state.ts +1 -4
- package/src/runtime/surface-feature-flags.ts +41 -6
- package/src/runtime/ui-read-models.ts +3 -4
- package/src/runtime/ui-services.ts +6 -6
- package/src/shell/blocking-input.ts +2 -1
- package/src/shell/service-settings-sync.ts +7 -7
- package/src/shell/ui-openers.ts +17 -38
- package/src/tools/agent-analysis-registry-policy.ts +0 -1
- package/src/tools/agent-channel-send-tool.ts +133 -0
- package/src/tools/agent-context-policy.ts +1 -1
- package/src/tools/agent-knowledge-ingest-tool.ts +405 -0
- package/src/tools/agent-knowledge-tool.ts +170 -0
- package/src/tools/agent-local-registry-tool.ts +279 -73
- package/src/tools/agent-media-generate-tool.ts +133 -0
- package/src/tools/agent-notify-tool.ts +143 -0
- package/src/tools/agent-operator-action-tool.ts +137 -0
- package/src/tools/agent-operator-briefing-tool.ts +217 -0
- package/src/tools/agent-reminder-schedule-tool.ts +237 -0
- package/src/tools/agent-tool-policy-guard.ts +13 -15
- package/src/tools/agent-work-plan-tool.ts +256 -0
- package/src/version.ts +1 -1
- package/docs/connected-services.md +0 -51
- package/src/cli/package-verification.ts +0 -274
- package/src/input/commands/policy-dispatch.ts +0 -339
- package/src/input/commands/policy.ts +0 -17
- package/src/panels/panel-picker.ts +0 -105
- package/src/panels/policy-panel.ts +0 -308
- package/src/renderer/panel-picker-overlay.ts +0 -202
|
@@ -17,6 +17,7 @@ export type OnboardingWizardStepId =
|
|
|
17
17
|
| 'agent-communication'
|
|
18
18
|
| 'agent-tools'
|
|
19
19
|
| 'agent-knowledge'
|
|
20
|
+
| 'agent-research'
|
|
20
21
|
| 'agent-local-state'
|
|
21
22
|
| 'agent-automation'
|
|
22
23
|
| 'agent-voice-media'
|
|
@@ -40,7 +41,8 @@ export type OnboardingWizardAction =
|
|
|
40
41
|
| 'apply'
|
|
41
42
|
| 'apply-and-continue'
|
|
42
43
|
| 'start-openai-subscription'
|
|
43
|
-
| 'finish-openai-subscription'
|
|
44
|
+
| 'finish-openai-subscription'
|
|
45
|
+
| `open-agent-workspace:${string}`;
|
|
44
46
|
|
|
45
47
|
export type OnboardingWizardApplyFeedbackSeverity = 'info' | 'warning' | 'error';
|
|
46
48
|
|
|
@@ -87,6 +89,7 @@ export interface OnboardingWizardTextFieldDefinition extends OnboardingWizardFie
|
|
|
87
89
|
readonly defaultValue: string;
|
|
88
90
|
readonly placeholder: string;
|
|
89
91
|
readonly required?: boolean;
|
|
92
|
+
readonly multiline?: boolean;
|
|
90
93
|
}
|
|
91
94
|
|
|
92
95
|
export interface OnboardingWizardMaskedFieldDefinition extends OnboardingWizardFieldBase {
|
|
@@ -295,6 +295,12 @@ export class OnboardingWizardController {
|
|
|
295
295
|
return this.editingFieldId !== null;
|
|
296
296
|
}
|
|
297
297
|
|
|
298
|
+
public isEditingMultilineTextField(): boolean {
|
|
299
|
+
if (this.editingFieldId === null) return false;
|
|
300
|
+
const field = this.getFieldById(this.editingFieldId);
|
|
301
|
+
return field?.kind === 'text' && field.multiline === true;
|
|
302
|
+
}
|
|
303
|
+
|
|
298
304
|
public getFieldWindow(visibleFields: number): OnboardingWizardFieldWindow {
|
|
299
305
|
const fields = this.currentStep.fields;
|
|
300
306
|
const total = fields.length;
|
|
@@ -408,7 +414,7 @@ export class OnboardingWizardController {
|
|
|
408
414
|
const field = this.getSelectedField();
|
|
409
415
|
if (!field || (field.kind !== 'text' && field.kind !== 'masked')) return false;
|
|
410
416
|
this.beginEdit(field.id);
|
|
411
|
-
this.editBuffer = initialText;
|
|
417
|
+
this.editBuffer = this.prepareTextInput(initialText);
|
|
412
418
|
return true;
|
|
413
419
|
}
|
|
414
420
|
|
|
@@ -432,7 +438,13 @@ export class OnboardingWizardController {
|
|
|
432
438
|
|
|
433
439
|
public editChar(char: string): void {
|
|
434
440
|
if (this.editingFieldId === null || char.length === 0) return;
|
|
435
|
-
this.editBuffer += char;
|
|
441
|
+
this.editBuffer += this.prepareTextInput(char);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
public editNewline(): boolean {
|
|
445
|
+
if (!this.isEditingMultilineTextField()) return false;
|
|
446
|
+
this.editBuffer += '\n';
|
|
447
|
+
return true;
|
|
436
448
|
}
|
|
437
449
|
|
|
438
450
|
public editBackspace(): void {
|
|
@@ -455,6 +467,11 @@ export class OnboardingWizardController {
|
|
|
455
467
|
return true;
|
|
456
468
|
}
|
|
457
469
|
|
|
470
|
+
private prepareTextInput(text: string): string {
|
|
471
|
+
if (this.isEditingMultilineTextField()) return text.replace(/\r\n?/g, '\n');
|
|
472
|
+
return text.replace(/[\r\n]+/g, ' ');
|
|
473
|
+
}
|
|
474
|
+
|
|
458
475
|
public setFieldValue(fieldId: string, value: boolean | string): void {
|
|
459
476
|
const field = this.getFieldById(fieldId);
|
|
460
477
|
if (!field) return;
|
|
@@ -604,3 +621,71 @@ export class OnboardingWizardController {
|
|
|
604
621
|
public isFieldDirtyByDefinition(field: OnboardingWizardFieldDefinition): boolean { return isFieldDirtyByDefinitionForController(this, field); }
|
|
605
622
|
public isFieldSatisfied(field: OnboardingWizardFieldDefinition): boolean { return isFieldSatisfiedForController(this, field); }
|
|
606
623
|
}
|
|
624
|
+
|
|
625
|
+
function pushOnboardingPackageText(lines: string[], ...values: readonly (string | undefined)[]): void {
|
|
626
|
+
for (const value of values) {
|
|
627
|
+
const normalized = normalizeText(value);
|
|
628
|
+
if (normalized.length > 0) lines.push(normalized);
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
function appendOnboardingFieldPackageText(
|
|
633
|
+
lines: string[],
|
|
634
|
+
wizard: OnboardingWizardController,
|
|
635
|
+
field: OnboardingWizardFieldDefinition,
|
|
636
|
+
): void {
|
|
637
|
+
pushOnboardingPackageText(lines, field.kind, field.id, field.label, field.hint, wizard.getFieldValueLabel(field));
|
|
638
|
+
|
|
639
|
+
if (field.kind === 'text' || field.kind === 'masked') {
|
|
640
|
+
pushOnboardingPackageText(lines, field.placeholder, field.defaultValue);
|
|
641
|
+
return;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
if (field.kind === 'radio') {
|
|
645
|
+
for (const option of field.options) {
|
|
646
|
+
pushOnboardingPackageText(lines, option.id, option.label, option.hint);
|
|
647
|
+
}
|
|
648
|
+
return;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
if (field.kind === 'action') {
|
|
652
|
+
pushOnboardingPackageText(lines, field.action, field.defaultValue);
|
|
653
|
+
return;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
if (field.kind === 'acknowledgement') {
|
|
657
|
+
pushOnboardingPackageText(lines, field.reason);
|
|
658
|
+
return;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
if (field.kind === 'modelPicker') {
|
|
662
|
+
pushOnboardingPackageText(
|
|
663
|
+
lines,
|
|
664
|
+
field.target,
|
|
665
|
+
field.defaultSelection.providerId,
|
|
666
|
+
field.defaultSelection.modelId,
|
|
667
|
+
);
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
export function renderOnboardingWizardPackageText(): string {
|
|
672
|
+
const wizard = new OnboardingWizardController();
|
|
673
|
+
const lines: string[] = ['GoodVibes Agent onboarding wizard'];
|
|
674
|
+
|
|
675
|
+
for (const step of wizard.steps) {
|
|
676
|
+
pushOnboardingPackageText(
|
|
677
|
+
lines,
|
|
678
|
+
step.id,
|
|
679
|
+
step.shortLabel,
|
|
680
|
+
step.title,
|
|
681
|
+
step.description,
|
|
682
|
+
step.summaryTitle,
|
|
683
|
+
...step.summaryLines,
|
|
684
|
+
);
|
|
685
|
+
for (const field of step.fields) {
|
|
686
|
+
appendOnboardingFieldPackageText(lines, wizard, field);
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
return lines.join('\n');
|
|
691
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ProfilePickerModal — state management for the
|
|
2
|
+
* ProfilePickerModal — state management for the Agent profile picker modal.
|
|
3
3
|
*
|
|
4
4
|
* Lists profiles from ProfileManager.list(), tracks selected index,
|
|
5
5
|
* and handles load actions.
|
|
@@ -24,20 +24,39 @@ const BEHAVIOR_KEYS: ConfigKey[] = [
|
|
|
24
24
|
'behavior.saveHistory', 'behavior.notifyOnComplete',
|
|
25
25
|
] as const;
|
|
26
26
|
|
|
27
|
+
function configProfileDeletionDisabledMessage(name: string): string {
|
|
28
|
+
return `Config-profile deletion is disabled in Agent for ${name}. Open Agent Workspace -> Profiles for isolated Agent profile homes.`;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function configProfileSavingDisabledMessage(name: string): string {
|
|
32
|
+
return `Config-profile saving is disabled in Agent for ${name}. Open Agent Workspace -> Profiles to create isolated Agent homes.`;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function renderProfilePickerStatePackageText(): string {
|
|
36
|
+
return [
|
|
37
|
+
'Profile name cannot be empty',
|
|
38
|
+
'Loaded profile',
|
|
39
|
+
'Saved profile',
|
|
40
|
+
'Error',
|
|
41
|
+
configProfileDeletionDisabledMessage('<profile>'),
|
|
42
|
+
configProfileSavingDisabledMessage('<profile>'),
|
|
43
|
+
].join('\n');
|
|
44
|
+
}
|
|
45
|
+
|
|
27
46
|
/**
|
|
28
47
|
* Apply a profile data category to the config manager.
|
|
29
48
|
* Iterates only known/valid keys rather than open-ended Object.entries.
|
|
30
49
|
*/
|
|
31
50
|
function applyProfileCategory(
|
|
32
51
|
cm: ConfigManager,
|
|
33
|
-
data:
|
|
52
|
+
data: object,
|
|
34
53
|
keys: ConfigKey[],
|
|
35
54
|
): void {
|
|
36
55
|
for (const key of keys) {
|
|
37
56
|
const field = key.split('.')[1];
|
|
38
|
-
if (field && Object.
|
|
57
|
+
if (field && Object.hasOwn(data, field)) {
|
|
39
58
|
try {
|
|
40
|
-
cm.setDynamic(key, data
|
|
59
|
+
cm.setDynamic(key, Reflect.get(data, field));
|
|
41
60
|
} catch (e) { logger.debug('applyProfileCategory: key set failed', { key, error: summarizeError(e) }); }
|
|
42
61
|
}
|
|
43
62
|
}
|
|
@@ -114,7 +133,7 @@ export class ProfilePickerModal {
|
|
|
114
133
|
|
|
115
134
|
// Apply display settings using validated key list
|
|
116
135
|
if (data.display) {
|
|
117
|
-
applyProfileCategory(configManager, data.display
|
|
136
|
+
applyProfileCategory(configManager, data.display, DISPLAY_KEYS);
|
|
118
137
|
}
|
|
119
138
|
|
|
120
139
|
// Apply provider settings (model + reasoningEffort only)
|
|
@@ -129,14 +148,14 @@ export class ProfilePickerModal {
|
|
|
129
148
|
|
|
130
149
|
// Apply behavior settings using validated key list
|
|
131
150
|
if (data.behavior) {
|
|
132
|
-
applyProfileCategory(configManager, data.behavior
|
|
151
|
+
applyProfileCategory(configManager, data.behavior, BEHAVIOR_KEYS);
|
|
133
152
|
}
|
|
134
153
|
|
|
135
154
|
configManager.save();
|
|
136
|
-
this.statusMessage = `Loaded profile
|
|
155
|
+
this.statusMessage = `Loaded profile ${profile.name}`;
|
|
137
156
|
return true;
|
|
138
157
|
} catch (e) {
|
|
139
|
-
this.statusMessage = `Error
|
|
158
|
+
this.statusMessage = `Error ${summarizeError(e)}`;
|
|
140
159
|
return false;
|
|
141
160
|
}
|
|
142
161
|
}
|
|
@@ -145,7 +164,7 @@ export class ProfilePickerModal {
|
|
|
145
164
|
const profile = this.getSelected();
|
|
146
165
|
if (!profile) return false;
|
|
147
166
|
this.deleteConfirmationTarget = null;
|
|
148
|
-
this.statusMessage =
|
|
167
|
+
this.statusMessage = configProfileDeletionDisabledMessage(profile.name);
|
|
149
168
|
return false;
|
|
150
169
|
}
|
|
151
170
|
|
|
@@ -158,7 +177,7 @@ export class ProfilePickerModal {
|
|
|
158
177
|
return false;
|
|
159
178
|
}
|
|
160
179
|
void configManager;
|
|
161
|
-
this.statusMessage =
|
|
180
|
+
this.statusMessage = configProfileSavingDisabledMessage(name);
|
|
162
181
|
return false;
|
|
163
182
|
}
|
|
164
183
|
|
|
@@ -182,11 +201,11 @@ export class ProfilePickerModal {
|
|
|
182
201
|
|
|
183
202
|
// Reload list
|
|
184
203
|
this.profiles = this.profileManager.list();
|
|
185
|
-
this.statusMessage = `Saved profile
|
|
204
|
+
this.statusMessage = `Saved profile ${name}`;
|
|
186
205
|
this._clampScroll();
|
|
187
206
|
return true;
|
|
188
207
|
} catch (e) {
|
|
189
|
-
this.statusMessage = `Error
|
|
208
|
+
this.statusMessage = `Error ${summarizeError(e)}`;
|
|
190
209
|
return false;
|
|
191
210
|
}
|
|
192
211
|
}
|
|
@@ -8,6 +8,23 @@
|
|
|
8
8
|
import type { SessionInfo, SessionManager } from '@pellux/goodvibes-sdk/platform/sessions';
|
|
9
9
|
import type { ConversationManager } from '../core/conversation';
|
|
10
10
|
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
|
|
11
|
+
import { readConversationMessageSnapshots } from '../core/conversation-message-snapshot.ts';
|
|
12
|
+
|
|
13
|
+
function sessionLoadedMessage(name: string, messageCount: number): string {
|
|
14
|
+
return `Loaded session ${name} (${messageCount} messages)`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function sessionDeletionCommandRequiredMessage(name: string): string {
|
|
18
|
+
return `Deletion requires an explicit command: /session delete ${name} --yes`;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function renderSessionPickerStatePackageText(): string {
|
|
22
|
+
return [
|
|
23
|
+
'Loaded session <session> (<count> messages)',
|
|
24
|
+
'Error',
|
|
25
|
+
sessionDeletionCommandRequiredMessage('<session>'),
|
|
26
|
+
].join('\n');
|
|
27
|
+
}
|
|
11
28
|
|
|
12
29
|
// ---------------------------------------------------------------------------
|
|
13
30
|
// SessionPickerModal
|
|
@@ -78,13 +95,13 @@ export class SessionPickerModal {
|
|
|
78
95
|
try {
|
|
79
96
|
const { meta, messages } = this.sessionManager.load(session.name);
|
|
80
97
|
conversationManager.resetAll();
|
|
81
|
-
conversationManager.fromJSON({ messages: messages
|
|
98
|
+
conversationManager.fromJSON({ messages: readConversationMessageSnapshots(messages) });
|
|
82
99
|
if (meta.title) conversationManager.title = meta.title;
|
|
83
100
|
conversationManager.rebuildHistory();
|
|
84
|
-
this.statusMessage =
|
|
101
|
+
this.statusMessage = sessionLoadedMessage(session.name, messages.length);
|
|
85
102
|
return true;
|
|
86
103
|
} catch (e) {
|
|
87
|
-
this.statusMessage = `Error
|
|
104
|
+
this.statusMessage = `Error ${summarizeError(e)}`;
|
|
88
105
|
return false;
|
|
89
106
|
}
|
|
90
107
|
}
|
|
@@ -93,7 +110,7 @@ export class SessionPickerModal {
|
|
|
93
110
|
const session = this.getSelected();
|
|
94
111
|
if (!session) return false;
|
|
95
112
|
this.deleteConfirmationTarget = null;
|
|
96
|
-
this.statusMessage =
|
|
113
|
+
this.statusMessage = sessionDeletionCommandRequiredMessage(session.name);
|
|
97
114
|
return false;
|
|
98
115
|
}
|
|
99
116
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const
|
|
1
|
+
export const AGENT_EXTERNAL_HOST_SETTING_LOCK_REASON = 'GoodVibes Agent uses a connected GoodVibes host. Change host lifecycle and bind posture from the owning host; Agent settings are read-only for those controls.';
|
|
2
2
|
|
|
3
3
|
const AGENT_HIDDEN_SETTING_PREFIXES = [
|
|
4
4
|
['cloud', 'flare.'].join(''),
|
|
@@ -21,21 +21,21 @@ const AGENT_HIDDEN_SETTING_KEYS = new Set<string>([
|
|
|
21
21
|
'ui.wrfcMessages',
|
|
22
22
|
]);
|
|
23
23
|
|
|
24
|
-
const
|
|
24
|
+
const EXTERNAL_HOST_SETTING_PREFIXES = [
|
|
25
25
|
'service.',
|
|
26
26
|
'controlPlane.',
|
|
27
27
|
'httpListener.',
|
|
28
28
|
'web.',
|
|
29
29
|
] as const;
|
|
30
30
|
|
|
31
|
-
const
|
|
31
|
+
const EXTERNAL_HOST_SETTING_KEYS = new Set<string>([
|
|
32
32
|
'danger.daemon',
|
|
33
33
|
'danger.httpListener',
|
|
34
34
|
]);
|
|
35
35
|
|
|
36
|
-
export function
|
|
37
|
-
return
|
|
38
|
-
||
|
|
36
|
+
export function isExternalHostOwnedSettingKey(key: string): boolean {
|
|
37
|
+
return EXTERNAL_HOST_SETTING_KEYS.has(key)
|
|
38
|
+
|| EXTERNAL_HOST_SETTING_PREFIXES.some((prefix) => key.startsWith(prefix));
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
export function isAgentHiddenSettingKey(key: string): boolean {
|
|
@@ -30,8 +30,5 @@ export function getNumericAdjustmentMeta(setting: ConfigSetting): {
|
|
|
30
30
|
max?: number;
|
|
31
31
|
precision: number;
|
|
32
32
|
} {
|
|
33
|
-
if (setting.key === 'wrfc.scoreThreshold') {
|
|
34
|
-
return { step: 0.1, min: 0, max: 10, precision: 1 };
|
|
35
|
-
}
|
|
36
33
|
return { step: 1, precision: 0 };
|
|
37
34
|
}
|
|
@@ -23,7 +23,7 @@ export function buildSubscriptionEntries(
|
|
|
23
23
|
activeRoute: 'unconfigured',
|
|
24
24
|
authFreshness: 'unconfigured',
|
|
25
25
|
routeReason: 'Built-in subscription adapter is available, but no active subscription session is stored yet.',
|
|
26
|
-
nextActions: [`
|
|
26
|
+
nextActions: [`Open Agent Workspace -> Setup -> Start subscription login for ${provider}.`],
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
29
|
|
|
@@ -38,7 +38,7 @@ export function buildSubscriptionEntries(
|
|
|
38
38
|
activeRoute: providers.get(provider)?.activeRoute ?? 'unconfigured',
|
|
39
39
|
authFreshness: providers.get(provider)?.authFreshness ?? 'unconfigured',
|
|
40
40
|
routeReason: providers.get(provider)?.routeReason ?? 'OAuth metadata is configured for this provider.',
|
|
41
|
-
nextActions: providers.get(provider)?.nextActions ?? [`
|
|
41
|
+
nextActions: providers.get(provider)?.nextActions ?? [`Open Agent Workspace -> Setup -> Start subscription login for ${provider}.`],
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
44
|
|
|
@@ -51,7 +51,7 @@ export function buildSubscriptionEntries(
|
|
|
51
51
|
activeRoute: 'unconfigured',
|
|
52
52
|
authFreshness: 'pending',
|
|
53
53
|
routeReason: 'OAuth login is pending completion for this provider.',
|
|
54
|
-
nextActions: [`Finish
|
|
54
|
+
nextActions: [`Open Agent Workspace -> Setup -> Finish subscription login for ${pending.provider}.`],
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
57
|
|
|
@@ -27,27 +27,16 @@ export type SettingsCategory =
|
|
|
27
27
|
| 'behavior'
|
|
28
28
|
| 'storage'
|
|
29
29
|
| 'permissions'
|
|
30
|
-
| 'orchestration'
|
|
31
|
-
| 'wrfc'
|
|
32
30
|
| 'tools'
|
|
33
31
|
| 'helper'
|
|
34
32
|
| 'tts'
|
|
35
|
-
| 'service'
|
|
36
|
-
| 'controlPlane'
|
|
37
|
-
| 'httpListener'
|
|
38
|
-
| 'web'
|
|
39
|
-
| 'network'
|
|
40
33
|
| 'surfaces'
|
|
41
|
-
| 'batch'
|
|
42
34
|
| 'automation'
|
|
43
|
-
| 'watchers'
|
|
44
|
-
| 'runtime'
|
|
45
35
|
| 'telemetry'
|
|
46
36
|
| 'cache'
|
|
47
37
|
| 'mcp'
|
|
48
38
|
| 'flags'
|
|
49
|
-
| 'release'
|
|
50
|
-
| 'danger';
|
|
39
|
+
| 'release';
|
|
51
40
|
|
|
52
41
|
export type SettingsFocusPane = 'categories' | 'settings';
|
|
53
42
|
|
|
@@ -57,7 +46,7 @@ export const SETTINGS_CATEGORY_GROUPS: ReadonlyArray<{
|
|
|
57
46
|
}> = [
|
|
58
47
|
{ label: 'Agent Experience', categories: ['display', 'ui', 'behavior', 'permissions'] },
|
|
59
48
|
{ label: 'Models and Providers', categories: ['provider', 'subscriptions', 'helper', 'tools', 'tts'] },
|
|
60
|
-
{ label: '
|
|
49
|
+
{ label: 'Agent-local state', categories: ['storage', 'cache', 'telemetry'] },
|
|
61
50
|
{ label: 'Channels and Tools', categories: ['surfaces', 'mcp', 'automation'] },
|
|
62
51
|
{ label: 'Advanced', categories: ['flags', 'release'] },
|
|
63
52
|
];
|
|
@@ -34,7 +34,7 @@ import {
|
|
|
34
34
|
type SettingsModalOpenOptions,
|
|
35
35
|
type SubscriptionEntry,
|
|
36
36
|
} from './settings-modal-types.ts';
|
|
37
|
-
import {
|
|
37
|
+
import { AGENT_EXTERNAL_HOST_SETTING_LOCK_REASON, isAgentHiddenSettingKey, isExternalHostOwnedSettingKey } from './settings-modal-agent-policy.ts';
|
|
38
38
|
|
|
39
39
|
export {
|
|
40
40
|
SETTINGS_CATEGORIES,
|
|
@@ -50,7 +50,7 @@ export {
|
|
|
50
50
|
type SettingsModalOpenOptions,
|
|
51
51
|
type SubscriptionEntry,
|
|
52
52
|
} from './settings-modal-types.ts';
|
|
53
|
-
export {
|
|
53
|
+
export { AGENT_EXTERNAL_HOST_SETTING_LOCK_REASON, isExternalHostOwnedSettingKey } from './settings-modal-agent-policy.ts';
|
|
54
54
|
export { isAgentHiddenSettingKey } from './settings-modal-agent-policy.ts';
|
|
55
55
|
|
|
56
56
|
// ---------------------------------------------------------------------------
|
|
@@ -99,12 +99,6 @@ export class SettingsModal {
|
|
|
99
99
|
/** Provider subscription entries (populated when subscriptions tab is active). */
|
|
100
100
|
public subscriptionEntries: SubscriptionEntry[] = [];
|
|
101
101
|
|
|
102
|
-
/**
|
|
103
|
-
* Set after a network-category save that touches controlPlane or httpListener
|
|
104
|
-
* config keys. Renderer reads this to display a transient restart notice.
|
|
105
|
-
* Cleared on next open() or close().
|
|
106
|
-
*/
|
|
107
|
-
public lastSaveTriggeredRestart: 'control-plane' | 'http-listener' | 'web' | null = null;
|
|
108
102
|
public lastSettingEffectMessage: string | null = null;
|
|
109
103
|
|
|
110
104
|
private configManager: ConfigManager | null = null;
|
|
@@ -151,7 +145,6 @@ export class SettingsModal {
|
|
|
151
145
|
this.pendingSettingsPickerAction = null;
|
|
152
146
|
this.mcpAllowAllConfirmationTarget = null;
|
|
153
147
|
this.subscriptionLogoutConfirmationTarget = null;
|
|
154
|
-
this.lastSaveTriggeredRestart = null;
|
|
155
148
|
this.lastSettingEffectMessage = null;
|
|
156
149
|
this.active = true;
|
|
157
150
|
}
|
|
@@ -165,7 +158,6 @@ export class SettingsModal {
|
|
|
165
158
|
this.pendingSettingsPickerAction = null;
|
|
166
159
|
this.mcpAllowAllConfirmationTarget = null;
|
|
167
160
|
this.subscriptionLogoutConfirmationTarget = null;
|
|
168
|
-
this.lastSaveTriggeredRestart = null;
|
|
169
161
|
this.lastSettingEffectMessage = null;
|
|
170
162
|
this.serviceRegistry = null;
|
|
171
163
|
this.secretsManager = null;
|
|
@@ -352,7 +344,7 @@ export class SettingsModal {
|
|
|
352
344
|
|
|
353
345
|
const entry = this.getSelected();
|
|
354
346
|
if (!entry || !this.configManager) return;
|
|
355
|
-
if (this.
|
|
347
|
+
if (this._blockExternalHostOwnedSetting(entry)) return;
|
|
356
348
|
|
|
357
349
|
const { setting } = entry;
|
|
358
350
|
|
|
@@ -417,7 +409,7 @@ export class SettingsModal {
|
|
|
417
409
|
|
|
418
410
|
const entry = this.getSelected();
|
|
419
411
|
if (!entry || !this.configManager) return;
|
|
420
|
-
if (this.
|
|
412
|
+
if (this._blockExternalHostOwnedSetting(entry)) return;
|
|
421
413
|
const { setting } = entry;
|
|
422
414
|
|
|
423
415
|
if (setting.type === 'boolean') {
|
|
@@ -452,8 +444,9 @@ export class SettingsModal {
|
|
|
452
444
|
/**
|
|
453
445
|
* Toggle the currently selected feature flag.
|
|
454
446
|
*
|
|
455
|
-
* Killed flags cannot be toggled. Non-runtimeToggleable flags
|
|
456
|
-
*
|
|
447
|
+
* Killed flags cannot be toggled. Non-runtimeToggleable flags are saved as
|
|
448
|
+
* overrides for the next Agent launch or owning-host reload; runtimeToggleable
|
|
449
|
+
* flags toggle immediately.
|
|
457
450
|
*/
|
|
458
451
|
toggleSelectedFlag(): void {
|
|
459
452
|
const flagEntry = this.getSelectedFlag();
|
|
@@ -474,7 +467,7 @@ export class SettingsModal {
|
|
|
474
467
|
const { flag } = flagEntry;
|
|
475
468
|
|
|
476
469
|
if (!flag.runtimeToggleable) {
|
|
477
|
-
// Persist to config only
|
|
470
|
+
// Persist to config only; the flag owner applies it on the next run.
|
|
478
471
|
this._persistFlagState(flag.id, newState, flag.defaultState as FlagState);
|
|
479
472
|
flagEntry.state = newState;
|
|
480
473
|
} else {
|
|
@@ -539,7 +532,7 @@ export class SettingsModal {
|
|
|
539
532
|
|
|
540
533
|
const entry = this.getSelected();
|
|
541
534
|
if (!entry || !this.configManager) return false;
|
|
542
|
-
if (this.
|
|
535
|
+
if (this._blockExternalHostOwnedSetting(entry)) {
|
|
543
536
|
this.editingMode = false;
|
|
544
537
|
this.editBuffer = '';
|
|
545
538
|
return false;
|
|
@@ -590,7 +583,7 @@ export class SettingsModal {
|
|
|
590
583
|
if (this.editingMode || !this.configManager) return null;
|
|
591
584
|
const entry = this.getSelected();
|
|
592
585
|
if (!entry) return null;
|
|
593
|
-
if (this.
|
|
586
|
+
if (this._blockExternalHostOwnedSetting(entry)) return null;
|
|
594
587
|
const key = entry.setting.key as ConfigKey;
|
|
595
588
|
this._setValue(key, entry.setting.default);
|
|
596
589
|
if (isSecretConfigKey(key) && this.secretsManager) {
|
|
@@ -627,21 +620,18 @@ export class SettingsModal {
|
|
|
627
620
|
const cat = rawCat as SettingsCategory;
|
|
628
621
|
const currentValue = configManager.get(setting.key as ConfigKey);
|
|
629
622
|
const resolved = getResolvedSettingLookup(configManager, setting.key as ConfigKey)?.entry;
|
|
630
|
-
const
|
|
623
|
+
const hostOwned = isExternalHostOwnedSettingKey(setting.key);
|
|
631
624
|
const entry: SettingEntry = {
|
|
632
625
|
setting,
|
|
633
626
|
currentValue,
|
|
634
627
|
isDefault: currentValue === setting.default,
|
|
635
628
|
effectiveSource: resolved?.effectiveSource,
|
|
636
|
-
locked:
|
|
629
|
+
locked: hostOwned || resolved?.locked,
|
|
637
630
|
conflict: resolved?.conflict,
|
|
638
631
|
sourceLabel: resolved?.sourceLabel,
|
|
639
|
-
lockReason:
|
|
632
|
+
lockReason: hostOwned ? AGENT_EXTERNAL_HOST_SETTING_LOCK_REASON : resolved?.lockReason,
|
|
640
633
|
};
|
|
641
634
|
if (this.groups.has(cat)) this.groups.get(cat)!.push(entry);
|
|
642
|
-
if ((rawCat === 'controlPlane' || rawCat === 'httpListener' || rawCat === 'web') && this.groups.has('network')) {
|
|
643
|
-
this.groups.get('network')!.push(entry);
|
|
644
|
-
}
|
|
645
635
|
}
|
|
646
636
|
|
|
647
637
|
const uiEntries = this.groups.get('ui');
|
|
@@ -649,8 +639,7 @@ export class SettingsModal {
|
|
|
649
639
|
const uiPriority: Record<string, number> = {
|
|
650
640
|
'ui.systemMessages': 0,
|
|
651
641
|
'ui.operationalMessages': 1,
|
|
652
|
-
'ui.
|
|
653
|
-
'ui.voiceEnabled': 3,
|
|
642
|
+
'ui.voiceEnabled': 2,
|
|
654
643
|
};
|
|
655
644
|
uiEntries.sort((a, b) => (uiPriority[a.setting.key] ?? 99) - (uiPriority[b.setting.key] ?? 99));
|
|
656
645
|
}
|
|
@@ -712,25 +701,7 @@ export class SettingsModal {
|
|
|
712
701
|
/** Returns [] for the flags category (flags use flagEntries instead). */
|
|
713
702
|
private _currentItems(): SettingEntry[] {
|
|
714
703
|
if (this.currentCategory === 'flags' || this.currentCategory === 'mcp' || this.currentCategory === 'subscriptions') return [];
|
|
715
|
-
|
|
716
|
-
if (this.currentCategory === 'network') {
|
|
717
|
-
return items.filter(entry => {
|
|
718
|
-
if (entry.setting.key === 'controlPlane.host') {
|
|
719
|
-
const hostMode = this.configManager?.get('controlPlane.hostMode');
|
|
720
|
-
return hostMode === 'custom';
|
|
721
|
-
}
|
|
722
|
-
if (entry.setting.key === 'httpListener.host') {
|
|
723
|
-
const hostMode = this.configManager?.get('httpListener.hostMode');
|
|
724
|
-
return hostMode === 'custom';
|
|
725
|
-
}
|
|
726
|
-
if (entry.setting.key === 'web.host') {
|
|
727
|
-
const hostMode = this.configManager?.get('web.hostMode');
|
|
728
|
-
return hostMode === 'custom';
|
|
729
|
-
}
|
|
730
|
-
return true;
|
|
731
|
-
});
|
|
732
|
-
}
|
|
733
|
-
return items;
|
|
704
|
+
return this.groups.get(this.currentCategory) ?? [];
|
|
734
705
|
}
|
|
735
706
|
|
|
736
707
|
private _refreshAllEntries(): void {
|
|
@@ -745,30 +716,13 @@ export class SettingsModal {
|
|
|
745
716
|
|
|
746
717
|
private _setValue(key: ConfigKey, value: unknown): void {
|
|
747
718
|
if (!this.configManager) return;
|
|
748
|
-
if (
|
|
749
|
-
this.lastSettingEffectMessage =
|
|
719
|
+
if (isExternalHostOwnedSettingKey(key)) {
|
|
720
|
+
this.lastSettingEffectMessage = AGENT_EXTERNAL_HOST_SETTING_LOCK_REASON;
|
|
750
721
|
return;
|
|
751
722
|
}
|
|
752
|
-
// Diff previous value before writing — avoids false restart notices on no-op saves
|
|
753
723
|
const previousValue = this.configManager.get(key);
|
|
754
|
-
const isRestartKey = ['host', 'port', 'hostMode', 'enabled'].includes(key.split('.')[1] ?? '');
|
|
755
724
|
try {
|
|
756
725
|
this.configManager.setDynamic(key, value);
|
|
757
|
-
const rawCat = key.split('.')[0] as string;
|
|
758
|
-
if (rawCat === 'controlPlane') {
|
|
759
|
-
if (isRestartKey && previousValue !== value) {
|
|
760
|
-
this.lastSaveTriggeredRestart = 'control-plane';
|
|
761
|
-
}
|
|
762
|
-
} else if (rawCat === 'httpListener') {
|
|
763
|
-
if (isRestartKey && previousValue !== value) {
|
|
764
|
-
this.lastSaveTriggeredRestart = 'http-listener';
|
|
765
|
-
}
|
|
766
|
-
} else if (rawCat === 'web') {
|
|
767
|
-
if (isRestartKey && previousValue !== value) {
|
|
768
|
-
this.lastSaveTriggeredRestart = 'web';
|
|
769
|
-
}
|
|
770
|
-
}
|
|
771
|
-
|
|
772
726
|
for (const entries of this.groups.values()) {
|
|
773
727
|
const entry = entries.find((candidate) => candidate.setting.key === key);
|
|
774
728
|
if (entry) {
|
|
@@ -787,9 +741,9 @@ export class SettingsModal {
|
|
|
787
741
|
}
|
|
788
742
|
}
|
|
789
743
|
|
|
790
|
-
private
|
|
791
|
-
if (!
|
|
792
|
-
this.lastSettingEffectMessage = entry.lockReason ??
|
|
744
|
+
private _blockExternalHostOwnedSetting(entry: SettingEntry): boolean {
|
|
745
|
+
if (!isExternalHostOwnedSettingKey(entry.setting.key)) return false;
|
|
746
|
+
this.lastSettingEffectMessage = entry.lockReason ?? AGENT_EXTERNAL_HOST_SETTING_LOCK_REASON;
|
|
793
747
|
return true;
|
|
794
748
|
}
|
|
795
749
|
|
|
@@ -23,8 +23,8 @@ export function routeSubmissionIntent(input: SubmissionRouterInput): SubmissionI
|
|
|
23
23
|
|
|
24
24
|
if (!trimmed) {
|
|
25
25
|
return {
|
|
26
|
-
kind:
|
|
27
|
-
label:
|
|
26
|
+
kind: 'empty',
|
|
27
|
+
label: 'prompt',
|
|
28
28
|
hasAttachments,
|
|
29
29
|
};
|
|
30
30
|
}
|
|
@@ -46,7 +46,7 @@ export function routeSubmissionIntent(input: SubmissionRouterInput): SubmissionI
|
|
|
46
46
|
return { kind: 'delegation', label: 'TUI delegation', commandName, hasAttachments };
|
|
47
47
|
}
|
|
48
48
|
if (PANEL_COMMANDS.has(commandName)) {
|
|
49
|
-
return { kind: '
|
|
49
|
+
return { kind: 'slash-command', label: 'Agent workspace', commandName, hasAttachments };
|
|
50
50
|
}
|
|
51
51
|
if (ORCHESTRATION_COMMANDS.has(commandName)) {
|
|
52
52
|
return { kind: 'orchestration', label: 'orchestration', commandName, hasAttachments };
|