@pellux/goodvibes-agent 1.1.3 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/dist/package/main.js +587 -120
- package/package.json +1 -1
- package/src/input/agent-workspace-activation.ts +11 -1
- package/src/input/agent-workspace-categories.ts +225 -69
- package/src/input/agent-workspace-category-actions.ts +25 -0
- package/src/input/agent-workspace-settings.ts +314 -0
- package/src/input/agent-workspace-types.ts +14 -1
- package/src/input/agent-workspace.ts +69 -34
- package/src/renderer/agent-workspace.ts +13 -12
- package/src/tools/agent-harness-ui-surface-metadata.ts +1 -1
- package/src/tools/agent-harness-workspace-actions.ts +2 -2
- package/src/version.ts +1 -1
package/dist/package/main.js
CHANGED
|
@@ -817092,7 +817092,7 @@ var createStyledCell = (char, overrides = {}) => ({
|
|
|
817092
817092
|
// src/version.ts
|
|
817093
817093
|
import { readFileSync } from "fs";
|
|
817094
817094
|
import { join } from "path";
|
|
817095
|
-
var _version = "1.1.
|
|
817095
|
+
var _version = "1.1.4";
|
|
817096
817096
|
try {
|
|
817097
817097
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, "..", "package.json"), "utf-8"));
|
|
817098
817098
|
_version = typeof pkg.version === "string" ? pkg.version : _version;
|
|
@@ -858616,6 +858616,14 @@ function registerWorkPlanRuntimeCommands(registry5) {
|
|
|
858616
858616
|
var AGENT_WORKSPACE_CATEGORY_IDS = [
|
|
858617
858617
|
"home",
|
|
858618
858618
|
"setup",
|
|
858619
|
+
"account-model",
|
|
858620
|
+
"assistant-behavior",
|
|
858621
|
+
"tools-permissions",
|
|
858622
|
+
"onboarding-display",
|
|
858623
|
+
"onboarding-channels",
|
|
858624
|
+
"onboarding-voice-media",
|
|
858625
|
+
"onboarding-context",
|
|
858626
|
+
"onboarding-verify",
|
|
858619
858627
|
"research",
|
|
858620
858628
|
"artifacts",
|
|
858621
858629
|
"conversation",
|
|
@@ -889824,7 +889832,7 @@ var UI_SURFACES = [
|
|
|
889824
889832
|
kind: "picker",
|
|
889825
889833
|
summary: "Reasoning-effort selector for models that expose effort levels.",
|
|
889826
889834
|
command: "/effort",
|
|
889827
|
-
preferredModelRoute: `Use ${agentHarnessModes2("settings", "get_setting", "set_setting")} for provider.reasoningEffort when a concrete level is known, or mode:"run_workspace_action" setup-effort with confirmation.`,
|
|
889835
|
+
preferredModelRoute: `Use ${agentHarnessModes2("settings", "get_setting", "set_setting")} for provider.reasoningEffort when a concrete level is known, or mode:"run_workspace_action" setup-reasoning-effort with confirmation.`,
|
|
889828
889836
|
available: (context) => typeof context.openReasoningEffortPicker === "function",
|
|
889829
889837
|
open: (context) => {
|
|
889830
889838
|
const surface = findSurfaceById("reasoning-effort-picker");
|
|
@@ -890296,6 +890304,14 @@ function activateAgentWorkspaceSelection(workspace, requestRender) {
|
|
|
890296
890304
|
const action2 = workspace.selectedAction;
|
|
890297
890305
|
if (!action2)
|
|
890298
890306
|
return;
|
|
890307
|
+
if (action2.kind === "setting") {
|
|
890308
|
+
workspace.applySettingAction(action2, requestRender);
|
|
890309
|
+
return;
|
|
890310
|
+
}
|
|
890311
|
+
if (action2.kind === "settings-import") {
|
|
890312
|
+
workspace.importTuiSettings(requestRender);
|
|
890313
|
+
return;
|
|
890314
|
+
}
|
|
890299
890315
|
if (action2.kind === "editor" && action2.editorKind) {
|
|
890300
890316
|
const editor = createAgentWorkspaceEditor(action2.editorKind, {
|
|
890301
890317
|
runtimeStarterTemplates: workspace.runtimeSnapshot?.runtimeStarterTemplates ?? [],
|
|
@@ -890385,7 +890401,7 @@ function activateAgentWorkspaceSelection(workspace, requestRender) {
|
|
|
890385
890401
|
workspace.lastActionResult = {
|
|
890386
890402
|
kind: "dispatched",
|
|
890387
890403
|
title: `Opening ${action2.label}`,
|
|
890388
|
-
detail: "The workspace handed this
|
|
890404
|
+
detail: "The workspace handed this command to the shell-owned command router.",
|
|
890389
890405
|
command: action2.command,
|
|
890390
890406
|
safety: action2.safety
|
|
890391
890407
|
};
|
|
@@ -890450,6 +890466,21 @@ function handleGuidanceOrWorkspaceAction(workspace, action2) {
|
|
|
890450
890466
|
};
|
|
890451
890467
|
}
|
|
890452
890468
|
|
|
890469
|
+
// src/input/agent-workspace-category-actions.ts
|
|
890470
|
+
function settingAction(options) {
|
|
890471
|
+
return {
|
|
890472
|
+
id: options.id,
|
|
890473
|
+
label: options.label,
|
|
890474
|
+
detail: options.detail,
|
|
890475
|
+
kind: "setting",
|
|
890476
|
+
safety: "safe",
|
|
890477
|
+
settingKey: options.key,
|
|
890478
|
+
...options.value !== undefined ? { settingValueHint: options.value } : {},
|
|
890479
|
+
...options.visibleWhenKey !== undefined ? { visibleWhenSettingKey: options.visibleWhenKey } : {},
|
|
890480
|
+
...options.visibleWhenValue !== undefined ? { visibleWhenSettingValue: options.visibleWhenValue } : {}
|
|
890481
|
+
};
|
|
890482
|
+
}
|
|
890483
|
+
|
|
890453
890484
|
// src/input/agent-workspace-categories.ts
|
|
890454
890485
|
var AGENT_WORKSPACE_CATEGORIES = [
|
|
890455
890486
|
{
|
|
@@ -890462,7 +890493,7 @@ var AGENT_WORKSPACE_CATEGORIES = [
|
|
|
890462
890493
|
{ id: "chat", label: "Continue assistant chat", detail: "Return to the main composer and type a normal message. Agent work stays serial in the main conversation.", kind: "guidance", safety: "safe" },
|
|
890463
890494
|
{ id: "brief", label: "Operator briefing", detail: "Show a concise Agent status and next-actions briefing without mutating the connected host.", command: "/brief", kind: "command", safety: "read-only" },
|
|
890464
890495
|
{ id: "model", label: "Choose model", detail: "Open the model/provider workspace for the Agent chat route.", command: "/model", kind: "command", safety: "safe" },
|
|
890465
|
-
{ id: "setup-home", label: "
|
|
890496
|
+
{ id: "setup-home", label: "Onboarding", detail: "Jump to first-run configuration for account, model, tools, channels, voice, local context, and finish.", targetCategoryId: "setup", kind: "workspace", safety: "safe" },
|
|
890466
890497
|
{ id: "channels-home", label: "Channels", detail: "Jump to companion pairing and channel readiness without changing connected-host routing.", targetCategoryId: "channels", kind: "workspace", safety: "read-only" },
|
|
890467
890498
|
{ id: "mode-show", label: "Interaction mode", detail: "Review Agent interaction noise level and per-domain verbosity.", command: "/mode show", kind: "command", safety: "read-only" },
|
|
890468
890499
|
{ id: "mode-preset", label: "Set interaction mode", detail: "Open a confirmed form for quiet, balanced, or operator interaction mode.", editorKind: "mode-preset", kind: "editor", safety: "safe" },
|
|
@@ -890486,61 +890517,225 @@ var AGENT_WORKSPACE_CATEGORIES = [
|
|
|
890486
890517
|
},
|
|
890487
890518
|
{
|
|
890488
890519
|
id: "setup",
|
|
890489
|
-
group: "
|
|
890490
|
-
label: "
|
|
890491
|
-
summary: "
|
|
890492
|
-
detail: "Use this
|
|
890520
|
+
group: "ONBOARDING",
|
|
890521
|
+
label: "Start",
|
|
890522
|
+
summary: "Import existing GoodVibes preferences, choose a main model, and sign in.",
|
|
890523
|
+
detail: "Use this first. Every row either imports existing settings, edits a setting inline, or opens a concrete sign-in/provider form.",
|
|
890493
890524
|
actions: [
|
|
890494
|
-
{ id: "
|
|
890495
|
-
{ id: "setup", label: "
|
|
890496
|
-
{ id: "setup-
|
|
890497
|
-
{ id: "setup-model-pinned", label: "Pinned models", detail: "Inspect model favorites from the Agent TUI before changing model selection.", command: "/pin", kind: "command", safety: "read-only" },
|
|
890498
|
-
{ id: "setup-model-refresh", label: "Refresh model catalog", detail: "Refresh model catalog, benchmark, and token-limit metadata from the Agent TUI.", command: "/refresh-models", kind: "command", safety: "safe" },
|
|
890499
|
-
{ id: "setup-model-pin", label: "Pin model", detail: "Open a form that pins one model registry key for quick reuse.", editorKind: "model-pin", kind: "editor", safety: "safe" },
|
|
890500
|
-
{ id: "setup-model-unpin", label: "Unpin model", detail: "Open a form that removes one pinned model registry key.", editorKind: "model-unpin", kind: "editor", safety: "safe" },
|
|
890501
|
-
{ id: "setup-model-unpin-command", label: "Unpin model command", detail: "Use the direct unpin command when you already know the model registry key.", command: "/unpin", kind: "command", safety: "safe" },
|
|
890502
|
-
{ id: "setup-effort", label: "Reasoning effort", detail: "Open a form that sets reasoning effort for normal Agent chat turns when supported by the selected model.", editorKind: "effort-level", kind: "editor", safety: "safe" },
|
|
890503
|
-
{ id: "setup-effort-command", label: "Reasoning effort command", detail: "Show or set reasoning effort with the registry command when you already know the level.", command: "/effort", kind: "command", safety: "safe" },
|
|
890504
|
-
{ id: "setup-mode-show", label: "Interaction mode", detail: "Review current Agent interaction mode and domain verbosity.", command: "/mode show", kind: "command", safety: "read-only" },
|
|
890505
|
-
{ id: "setup-mode-preset", label: "Set interaction mode", detail: "Open a confirmed form for quiet, balanced, or operator interaction mode.", editorKind: "mode-preset", kind: "editor", safety: "safe" },
|
|
890506
|
-
{ id: "setup-mode-domain", label: "Set domain verbosity", detail: "Open a confirmed form for one interaction-domain verbosity override.", editorKind: "mode-domain", kind: "editor", safety: "safe" },
|
|
890507
|
-
{ id: "setup-compat", label: "Compatibility", detail: "Inspect connected-host compatibility and isolated Agent Knowledge route readiness.", command: "/compat", kind: "command", safety: "read-only" },
|
|
890508
|
-
{ id: "setup-agent-knowledge", label: "Agent Knowledge", detail: "Open isolated Agent Knowledge status, ask/search, ingest, source review, and reindex actions.", targetCategoryId: "knowledge", kind: "workspace", safety: "safe" },
|
|
890509
|
-
{ id: "setup-runtime-profiles", label: "Agent profiles", detail: "Open starter templates, isolated Agent homes, profile defaults, and profile import/export actions.", targetCategoryId: "profiles", kind: "workspace", safety: "safe" },
|
|
890510
|
-
{ id: "setup-profile-from-discovered", label: "Profile from discovered behavior", detail: "Create an isolated Agent profile directly from reviewed local persona, skill, and routine files.", editorKind: "profile-from-discovered", kind: "editor", safety: "safe" },
|
|
890511
|
-
{ id: "support-bundle-export", label: "Export support bundle", detail: "Open a confirmed form that exports a redacted Agent support bundle from the TUI workspace.", editorKind: "support-bundle-export", kind: "editor", safety: "safe" },
|
|
890512
|
-
{ id: "support-bundle-inspect", label: "Inspect support bundle", detail: "Open a form that inspects a redacted Agent support bundle before import or sharing.", editorKind: "support-bundle-inspect", kind: "editor", safety: "read-only" },
|
|
890513
|
-
{ id: "support-bundle-import", label: "Import support bundle", detail: "Open a confirmed form that imports reviewed, non-redacted config values from an Agent support bundle.", editorKind: "support-bundle-import", kind: "editor", safety: "safe" },
|
|
890514
|
-
{ id: "support-bundle-command", label: "Support bundle command", detail: "Use the support-bundle command for export, inspect, or import from inside the Agent TUI.", command: "/bundle", kind: "command", safety: "safe" },
|
|
890515
|
-
{ id: "setup-personas", label: "Personas", detail: "Create or select the active Agent-local persona.", targetCategoryId: "personas", kind: "workspace", safety: "safe" },
|
|
890516
|
-
{ id: "setup-skills", label: "Skills", detail: "Create, review, and enable reusable Agent-local skills.", targetCategoryId: "skills", kind: "workspace", safety: "safe" },
|
|
890517
|
-
{ id: "setup-routines", label: "Routines", detail: "Create, review, and enable Agent-local routines before any explicit schedule promotion.", targetCategoryId: "routines", kind: "workspace", safety: "safe" },
|
|
890518
|
-
{ id: "setup-memory", label: "Local memory", detail: "Open Agent-local memory creation, review, search, export/import, and maintenance actions. Secrets stay rejected or redacted.", targetCategoryId: "memory", kind: "workspace", safety: "safe" },
|
|
890519
|
-
{ id: "setup-notes", label: "Scratchpad notes", detail: "Open Agent-local notes for source triage and temporary context. Notes are not memory or Agent Knowledge.", targetCategoryId: "notes", kind: "workspace", safety: "safe" },
|
|
890520
|
-
{ id: "setup-channels", label: "Channels", detail: "Open companion pairing, channel readiness, delivery target, and notification setup.", targetCategoryId: "channels", kind: "workspace", safety: "safe" },
|
|
890521
|
-
{ id: "setup-tools", label: "Tools and MCP", detail: "Open MCP setup, trust review, and tool inventory.", targetCategoryId: "tools", kind: "workspace", safety: "safe" },
|
|
890522
|
-
{ id: "setup-voice-media", label: "Voice and media", detail: "Open voice, TTS, image input, media provider, and browser-tool setup actions.", targetCategoryId: "voice-media", kind: "workspace", safety: "safe" },
|
|
890523
|
-
{ id: "provider", label: "Provider status", detail: "Review provider/model posture.", command: "/provider", kind: "command", safety: "read-only" },
|
|
890524
|
-
{ id: "provider-use", label: "Use provider", detail: "Open a provider-id form that switches the Agent chat provider from the workspace.", editorKind: "provider-use", kind: "editor", safety: "safe" },
|
|
890525
|
-
{ id: "provider-inspect", label: "Inspect provider", detail: "Open a provider-id form for read-only provider auth/setup inspection.", editorKind: "provider-inspect", kind: "editor", safety: "read-only" },
|
|
890526
|
-
{ id: "provider-routes", label: "Inspect provider routes", detail: "Open a provider-id form for read-only route and fallback inspection.", editorKind: "provider-routes", kind: "editor", safety: "read-only" },
|
|
890527
|
-
{ id: "provider-account-repair", label: "Provider account repair", detail: "Open a provider-id form for read-only account repair guidance.", editorKind: "provider-account-repair", kind: "editor", safety: "read-only" },
|
|
890528
|
-
{ id: "provider-add", label: "Add custom provider", detail: "Open a confirmed form that adds one OpenAI-compatible custom provider for Agent model routing.", editorKind: "provider-add", kind: "editor", safety: "safe" },
|
|
890529
|
-
{ id: "provider-remove", label: "Remove custom provider", detail: "Open a confirmed form that removes one Agent custom provider config.", editorKind: "provider-remove", kind: "editor", safety: "safe" },
|
|
890530
|
-
{ id: "provider-accounts", label: "Provider accounts", detail: "Review provider account routes, subscription windows, and billing-path safety without starting login or repair flows.", command: "/accounts review", kind: "command", safety: "read-only" },
|
|
890531
|
-
{ id: "subscription-providers", label: "Subscription providers", detail: "Review provider subscription login routes without starting a login.", command: "/subscription providers", kind: "command", safety: "read-only" },
|
|
890532
|
-
{ id: "subscription-review", label: "Subscription review", detail: "Inspect active and pending provider subscription sessions without printing token values.", command: "/subscription review", kind: "command", safety: "read-only" },
|
|
890533
|
-
{ id: "subscription-inspect", label: "Inspect subscription provider", detail: "Open a provider-id form for read-only OAuth/subscription route inspection.", editorKind: "subscription-inspect", kind: "editor", safety: "read-only" },
|
|
890525
|
+
{ id: "import-goodvibes-tui-settings", label: "Import GoodVibes settings", detail: "Copy existing GoodVibes TUI display, provider, behavior, permission, TTS, channel, helper, tool, release, and automation values into Agent-owned settings.", kind: "settings-import", safety: "safe" },
|
|
890526
|
+
settingAction({ id: "setup-provider-model", label: "Main model", detail: "Set the provider-qualified model used for normal assistant turns.", key: "provider.model" }),
|
|
890527
|
+
settingAction({ id: "setup-reasoning-effort", label: "Reasoning effort", detail: "Cycle the reasoning level used when the selected model supports it.", key: "provider.reasoningEffort" }),
|
|
890534
890528
|
{ id: "subscription-login-start", label: "Start subscription login", detail: "Open a confirmed form for one provider OAuth login start, with browser/manual completion controls.", editorKind: "subscription-login-start", kind: "editor", safety: "safe" },
|
|
890535
890529
|
{ id: "subscription-login-finish", label: "Finish subscription login", detail: "Open a confirmed form that stores one completed provider subscription session from a code or redirect URL.", editorKind: "subscription-login-finish", kind: "editor", safety: "safe" },
|
|
890536
890530
|
{ id: "subscription-logout", label: "Logout subscription", detail: "Open a confirmed form that removes one stored provider subscription session.", editorKind: "subscription-logout", kind: "editor", safety: "safe" },
|
|
890537
|
-
{ id: "subscription-
|
|
890538
|
-
{ id: "subscription-bundle-
|
|
890539
|
-
{ id: "
|
|
890540
|
-
{ id: "
|
|
890541
|
-
{ id: "
|
|
890542
|
-
{ id: "
|
|
890543
|
-
{ id: "
|
|
890531
|
+
{ id: "subscription-inspect", label: "Inspect subscription route", detail: "Inspect one provider subscription OAuth route before starting or finishing login.", editorKind: "subscription-inspect", kind: "editor", safety: "read-only" },
|
|
890532
|
+
{ id: "subscription-bundle-export", label: "Export subscription bundle", detail: "Export a redacted provider subscription bundle for setup review.", editorKind: "subscription-bundle-export", kind: "editor", safety: "safe" },
|
|
890533
|
+
{ id: "subscription-bundle-inspect", label: "Inspect subscription bundle", detail: "Inspect a provider subscription bundle before setup review.", editorKind: "subscription-bundle-inspect", kind: "editor", safety: "read-only" },
|
|
890534
|
+
{ id: "provider-add", label: "Add custom provider", detail: "Add one OpenAI-compatible provider for Agent model routing.", editorKind: "provider-add", kind: "editor", safety: "safe" },
|
|
890535
|
+
{ id: "secret-set-provider", label: "Store API secret", detail: "Store a provider or channel credential through the Agent secret manager.", editorKind: "secret-set", kind: "editor", safety: "safe" },
|
|
890536
|
+
settingAction({ id: "setup-secret-policy", label: "Secret storage policy", detail: "Choose whether secret persistence prefers or requires secure storage.", key: "storage.secretPolicy" }),
|
|
890537
|
+
settingAction({ id: "setup-save-history", label: "Save conversation history", detail: "Toggle local conversation history persistence.", key: "behavior.saveHistory" })
|
|
890538
|
+
]
|
|
890539
|
+
},
|
|
890540
|
+
{
|
|
890541
|
+
id: "account-model",
|
|
890542
|
+
group: "ONBOARDING",
|
|
890543
|
+
label: "Account & Model",
|
|
890544
|
+
summary: "Model routing for chat, helpers, tools, embeddings, and spoken turns.",
|
|
890545
|
+
detail: "Use this after sign-in to make model routing explicit for each workload.",
|
|
890546
|
+
actions: [
|
|
890547
|
+
{ id: "provider-use", label: "Switch provider", detail: "Open a provider-id form that switches the Agent chat provider.", editorKind: "provider-use", kind: "editor", safety: "safe" },
|
|
890548
|
+
{ id: "provider-inspect", label: "Inspect provider auth", detail: "Inspect one provider auth/setup route without storing tokens or starting login.", editorKind: "provider-inspect", kind: "editor", safety: "read-only" },
|
|
890549
|
+
{ id: "provider-routes", label: "Inspect provider routes", detail: "Inspect provider route and fallback posture for one provider.", editorKind: "provider-routes", kind: "editor", safety: "read-only" },
|
|
890550
|
+
{ id: "provider-account-repair", label: "Provider repair guidance", detail: "Show provider account repair guidance without mutating credentials.", editorKind: "provider-account-repair", kind: "editor", safety: "read-only" },
|
|
890551
|
+
{ id: "provider-remove", label: "Remove custom provider", detail: "Remove one Agent custom provider config after confirmation.", editorKind: "provider-remove", kind: "editor", safety: "safe" },
|
|
890552
|
+
{ id: "model-refresh", label: "Refresh model catalog", detail: "Refresh model catalog, benchmark, and token-limit metadata.", command: "/refresh-models", kind: "command", safety: "safe" },
|
|
890553
|
+
{ id: "model-pin", label: "Pin model", detail: "Pin one model registry key for quick reuse.", editorKind: "model-pin", kind: "editor", safety: "safe" },
|
|
890554
|
+
{ id: "model-unpin", label: "Unpin model", detail: "Remove one pinned model registry key.", editorKind: "model-unpin", kind: "editor", safety: "safe" },
|
|
890555
|
+
{ id: "auth-show", label: "Show provider auth", detail: "Inspect provider auth state without printing token values.", editorKind: "auth-show", kind: "editor", safety: "read-only" },
|
|
890556
|
+
{ id: "auth-repair", label: "Auth repair guidance", detail: "Show auth repair guidance without storing tokens or starting login.", editorKind: "auth-repair", kind: "editor", safety: "read-only" },
|
|
890557
|
+
{ id: "auth-bundle-export", label: "Export auth bundle", detail: "Export a redacted auth review bundle after confirmation.", editorKind: "auth-bundle-export", kind: "editor", safety: "safe" },
|
|
890558
|
+
{ id: "auth-bundle-inspect", label: "Inspect auth bundle", detail: "Inspect an auth review bundle before setup review.", editorKind: "auth-bundle-inspect", kind: "editor", safety: "read-only" },
|
|
890559
|
+
settingAction({ id: "account-main-model", label: "Main model", detail: "Edit the provider-qualified model registry key for normal assistant turns.", key: "provider.model" }),
|
|
890560
|
+
settingAction({ id: "account-reasoning", label: "Reasoning effort", detail: "Cycle instant, low, medium, or high reasoning effort.", key: "provider.reasoningEffort" }),
|
|
890561
|
+
settingAction({ id: "account-embedding", label: "Embedding provider", detail: "Set the embedding provider used by local memory and retrieval.", key: "provider.embeddingProvider" }),
|
|
890562
|
+
settingAction({ id: "account-system-prompt", label: "System prompt file", detail: "Set an optional local system prompt file path.", key: "provider.systemPromptFile" }),
|
|
890563
|
+
settingAction({ id: "account-helper-enabled", label: "Enable helper model", detail: "Toggle dedicated helper routing for background utility work.", key: "helper.enabled" }),
|
|
890564
|
+
settingAction({ id: "account-helper-provider", label: "Helper provider", detail: "Set the helper provider id.", key: "helper.globalProvider", visibleWhenKey: "helper.enabled", visibleWhenValue: true }),
|
|
890565
|
+
settingAction({ id: "account-helper-model", label: "Helper model", detail: "Set the helper model registry key.", key: "helper.globalModel", visibleWhenKey: "helper.enabled", visibleWhenValue: true }),
|
|
890566
|
+
settingAction({ id: "account-tool-llm-enabled", label: "Enable tool LLM", detail: "Toggle a dedicated tool LLM for internal operations.", key: "tools.llmEnabled" }),
|
|
890567
|
+
settingAction({ id: "account-tool-provider", label: "Tool LLM provider", detail: "Set the provider for dedicated tool LLM calls.", key: "tools.llmProvider", visibleWhenKey: "tools.llmEnabled", visibleWhenValue: true }),
|
|
890568
|
+
settingAction({ id: "account-tool-model", label: "Tool LLM model", detail: "Set the model for dedicated tool LLM calls.", key: "tools.llmModel", visibleWhenKey: "tools.llmEnabled", visibleWhenValue: true }),
|
|
890569
|
+
settingAction({ id: "account-tts-llm-provider", label: "Spoken-turn provider", detail: "Set an optional provider override for spoken-response turns.", key: "tts.llmProvider" }),
|
|
890570
|
+
settingAction({ id: "account-tts-llm-model", label: "Spoken-turn model", detail: "Set an optional model override for spoken-response turns.", key: "tts.llmModel" })
|
|
890571
|
+
]
|
|
890572
|
+
},
|
|
890573
|
+
{
|
|
890574
|
+
id: "assistant-behavior",
|
|
890575
|
+
group: "ONBOARDING",
|
|
890576
|
+
label: "Assistant Behavior",
|
|
890577
|
+
summary: "Interaction, context, notifications, and reasoning display.",
|
|
890578
|
+
detail: "Use this page to decide how much the assistant talks while it works and how it handles context pressure.",
|
|
890579
|
+
actions: [
|
|
890580
|
+
settingAction({ id: "behavior-hitl-mode", label: "Interaction mode", detail: "Cycle quiet, balanced, or operator interaction mode.", key: "behavior.hitlMode" }),
|
|
890581
|
+
settingAction({ id: "behavior-guidance-mode", label: "Guidance mode", detail: "Cycle off, minimal, or guided operational guidance.", key: "behavior.guidanceMode" }),
|
|
890582
|
+
settingAction({ id: "behavior-auto-compact", label: "Auto-compact threshold", detail: "Set the context percentage that triggers automatic compaction.", key: "behavior.autoCompactThreshold" }),
|
|
890583
|
+
settingAction({ id: "behavior-stale-context", label: "Context warnings", detail: "Toggle proactive warnings before compaction is required.", key: "behavior.staleContextWarnings" }),
|
|
890584
|
+
settingAction({ id: "behavior-notify-complete", label: "Notify on long turns", detail: "Toggle terminal and desktop notification when a long turn completes.", key: "behavior.notifyOnComplete" }),
|
|
890585
|
+
settingAction({ id: "behavior-return-context", label: "Resume summary mode", detail: "Cycle off, local, or assisted resume summaries.", key: "behavior.returnContextMode" }),
|
|
890586
|
+
settingAction({ id: "behavior-show-thinking", label: "Show thinking blocks", detail: "Toggle visible reasoning/thinking content when the provider returns it.", key: "display.showThinking" }),
|
|
890587
|
+
settingAction({ id: "behavior-show-reasoning-summary", label: "Show reasoning summary", detail: "Toggle visible reasoning summaries when supported.", key: "display.showReasoningSummary" })
|
|
890588
|
+
]
|
|
890589
|
+
},
|
|
890590
|
+
{
|
|
890591
|
+
id: "tools-permissions",
|
|
890592
|
+
group: "ONBOARDING",
|
|
890593
|
+
label: "Tools & Permissions",
|
|
890594
|
+
summary: "Tool approval policy, MCP trust entry points, and secret handling.",
|
|
890595
|
+
detail: "Use this page to set how Agent asks before file, shell, network, MCP, workflow, and delegation operations.",
|
|
890596
|
+
actions: [
|
|
890597
|
+
settingAction({ id: "permissions-mode", label: "Permission mode", detail: "Cycle prompt, allow-all, or custom permission mode.", key: "permissions.mode" }),
|
|
890598
|
+
settingAction({ id: "permissions-write", label: "File writes", detail: "Cycle allow, prompt, or deny for file write operations.", key: "permissions.tools.write" }),
|
|
890599
|
+
settingAction({ id: "permissions-edit", label: "File edits", detail: "Cycle allow, prompt, or deny for edit and patch operations.", key: "permissions.tools.edit" }),
|
|
890600
|
+
settingAction({ id: "permissions-exec", label: "Shell commands", detail: "Cycle allow, prompt, or deny for shell execution.", key: "permissions.tools.exec" }),
|
|
890601
|
+
settingAction({ id: "permissions-fetch", label: "Network fetches", detail: "Cycle allow, prompt, or deny for outbound fetch requests.", key: "permissions.tools.fetch" }),
|
|
890602
|
+
settingAction({ id: "permissions-mcp", label: "MCP tools", detail: "Cycle allow, prompt, or deny for external MCP tool calls.", key: "permissions.tools.mcp" }),
|
|
890603
|
+
settingAction({ id: "permissions-agent", label: "Agent delegation", detail: "Cycle allow, prompt, or deny for subagent and delegation operations.", key: "permissions.tools.agent" }),
|
|
890604
|
+
settingAction({ id: "permissions-workflow", label: "Workflow automation", detail: "Cycle allow, prompt, or deny for multi-step workflow automation.", key: "permissions.tools.workflow" }),
|
|
890605
|
+
{ id: "onboarding-mcp-server", label: "Add MCP server", detail: "Add or update one MCP server with command, args, role, trust, env refs, paths, and hosts.", editorKind: "mcp-server", kind: "editor", safety: "safe" },
|
|
890606
|
+
{ id: "onboarding-secret-link", label: "Link secret reference", detail: "Link one config key to a goodvibes secret reference.", editorKind: "secret-link", kind: "editor", safety: "safe" },
|
|
890607
|
+
{ id: "onboarding-secret-test", label: "Test secret reference", detail: "Check one stored secret reference without printing the value.", editorKind: "secret-test", kind: "editor", safety: "safe" }
|
|
890608
|
+
]
|
|
890609
|
+
},
|
|
890610
|
+
{
|
|
890611
|
+
id: "onboarding-display",
|
|
890612
|
+
group: "ONBOARDING",
|
|
890613
|
+
label: "Interface",
|
|
890614
|
+
summary: "Display, streaming, operational messages, and release channel.",
|
|
890615
|
+
detail: "Use this page to make the terminal readable for normal daily work.",
|
|
890616
|
+
actions: [
|
|
890617
|
+
settingAction({ id: "display-stream", label: "Stream tokens", detail: "Toggle streaming assistant tokens as they arrive.", key: "display.stream" }),
|
|
890618
|
+
settingAction({ id: "display-theme", label: "Theme", detail: "Set the color theme name.", key: "display.theme" }),
|
|
890619
|
+
settingAction({ id: "display-line-numbers", label: "Line numbers", detail: "Cycle all, code-only, or off for assistant output line numbers.", key: "display.lineNumbers" }),
|
|
890620
|
+
settingAction({ id: "display-collapse-threshold", label: "Collapse threshold", detail: "Set the line count threshold for collapsed tool output.", key: "display.collapseThreshold" }),
|
|
890621
|
+
settingAction({ id: "display-token-speed", label: "Token speed counter", detail: "Toggle tokens-per-second while generating.", key: "display.showTokenSpeed" }),
|
|
890622
|
+
settingAction({ id: "display-tool-preview", label: "Tool call preview", detail: "Toggle partial tool-call preview while streaming.", key: "display.showToolPreview" }),
|
|
890623
|
+
settingAction({ id: "display-operational-messages", label: "Operational messages", detail: "Cycle panel, conversation, or both for tool and runtime messages.", key: "ui.operationalMessages" }),
|
|
890624
|
+
settingAction({ id: "display-system-messages", label: "System messages", detail: "Cycle panel, conversation, or both for system messages.", key: "ui.systemMessages" }),
|
|
890625
|
+
settingAction({ id: "display-release-channel", label: "Release channel", detail: "Cycle stable or preview for update flows.", key: "release.channel" })
|
|
890626
|
+
]
|
|
890627
|
+
},
|
|
890628
|
+
{
|
|
890629
|
+
id: "onboarding-channels",
|
|
890630
|
+
group: "ONBOARDING",
|
|
890631
|
+
label: "Messaging",
|
|
890632
|
+
summary: "Messaging surfaces and settings for enabled channels.",
|
|
890633
|
+
detail: "Start by enabling the channels you want. Channel-specific fields appear below each enabled channel.",
|
|
890634
|
+
actions: [
|
|
890635
|
+
{ id: "onboarding-pair-companion", label: "Pair companion app", detail: "Open the QR pairing view for companion access.", command: "/pair", kind: "command", safety: "safe" },
|
|
890636
|
+
settingAction({ id: "channel-ntfy-enabled", label: "Use ntfy", detail: "Toggle ntfy notifications and chat routing.", key: "surfaces.ntfy.enabled" }),
|
|
890637
|
+
settingAction({ id: "channel-ntfy-base-url", label: "ntfy base URL", detail: "Set the ntfy server URL.", key: "surfaces.ntfy.baseUrl", visibleWhenKey: "surfaces.ntfy.enabled", visibleWhenValue: true }),
|
|
890638
|
+
settingAction({ id: "channel-ntfy-chat-topic", label: "ntfy chat topic", detail: "Set the topic routed into active terminal chat.", key: "surfaces.ntfy.chatTopic", visibleWhenKey: "surfaces.ntfy.enabled", visibleWhenValue: true }),
|
|
890639
|
+
settingAction({ id: "channel-ntfy-agent-topic", label: "ntfy agent topic", detail: "Set the topic routed to Agent work.", key: "surfaces.ntfy.agentTopic", visibleWhenKey: "surfaces.ntfy.enabled", visibleWhenValue: true }),
|
|
890640
|
+
settingAction({ id: "channel-ntfy-token", label: "ntfy token", detail: "Store the ntfy access token or secret reference.", key: "surfaces.ntfy.token", visibleWhenKey: "surfaces.ntfy.enabled", visibleWhenValue: true }),
|
|
890641
|
+
settingAction({ id: "channel-ntfy-priority", label: "ntfy priority", detail: "Set default ntfy priority from 1 to 5.", key: "surfaces.ntfy.defaultPriority", visibleWhenKey: "surfaces.ntfy.enabled", visibleWhenValue: true }),
|
|
890642
|
+
settingAction({ id: "channel-slack-enabled", label: "Use Slack", detail: "Toggle Slack adapter configuration.", key: "surfaces.slack.enabled" }),
|
|
890643
|
+
settingAction({ id: "channel-slack-bot-token", label: "Slack bot token", detail: "Store the Slack bot token or secret reference.", key: "surfaces.slack.botToken", visibleWhenKey: "surfaces.slack.enabled", visibleWhenValue: true }),
|
|
890644
|
+
settingAction({ id: "channel-slack-signing-secret", label: "Slack signing secret", detail: "Store the Slack signing secret or secret reference.", key: "surfaces.slack.signingSecret", visibleWhenKey: "surfaces.slack.enabled", visibleWhenValue: true }),
|
|
890645
|
+
settingAction({ id: "channel-slack-default-channel", label: "Slack default channel", detail: "Set the default Slack channel for notifications and replies.", key: "surfaces.slack.defaultChannel", visibleWhenKey: "surfaces.slack.enabled", visibleWhenValue: true }),
|
|
890646
|
+
settingAction({ id: "channel-slack-workspace", label: "Slack workspace ID", detail: "Set the Slack workspace id for route binding.", key: "surfaces.slack.workspaceId", visibleWhenKey: "surfaces.slack.enabled", visibleWhenValue: true }),
|
|
890647
|
+
settingAction({ id: "channel-discord-enabled", label: "Use Discord", detail: "Toggle Discord adapter configuration.", key: "surfaces.discord.enabled" }),
|
|
890648
|
+
settingAction({ id: "channel-discord-bot-token", label: "Discord bot token", detail: "Store the Discord bot token or secret reference.", key: "surfaces.discord.botToken", visibleWhenKey: "surfaces.discord.enabled", visibleWhenValue: true }),
|
|
890649
|
+
settingAction({ id: "channel-discord-application", label: "Discord application ID", detail: "Set the Discord application id.", key: "surfaces.discord.applicationId", visibleWhenKey: "surfaces.discord.enabled", visibleWhenValue: true }),
|
|
890650
|
+
settingAction({ id: "channel-discord-public-key", label: "Discord public key", detail: "Set the Discord application public key.", key: "surfaces.discord.publicKey", visibleWhenKey: "surfaces.discord.enabled", visibleWhenValue: true }),
|
|
890651
|
+
settingAction({ id: "channel-discord-default-channel", label: "Discord default channel", detail: "Set the default Discord channel id.", key: "surfaces.discord.defaultChannelId", visibleWhenKey: "surfaces.discord.enabled", visibleWhenValue: true }),
|
|
890652
|
+
settingAction({ id: "channel-webhook-enabled", label: "Use webhooks", detail: "Toggle generic webhook delivery.", key: "surfaces.webhook.enabled" }),
|
|
890653
|
+
settingAction({ id: "channel-webhook-target", label: "Webhook target URL", detail: "Set the default outbound webhook target URL.", key: "surfaces.webhook.defaultTarget", visibleWhenKey: "surfaces.webhook.enabled", visibleWhenValue: true }),
|
|
890654
|
+
settingAction({ id: "channel-webhook-secret", label: "Webhook secret", detail: "Store the shared webhook secret or secret reference.", key: "surfaces.webhook.secret", visibleWhenKey: "surfaces.webhook.enabled", visibleWhenValue: true }),
|
|
890655
|
+
settingAction({ id: "channel-telegram-enabled", label: "Use Telegram", detail: "Toggle Telegram bot delivery.", key: "surfaces.telegram.enabled" }),
|
|
890656
|
+
settingAction({ id: "channel-telegram-bot-token", label: "Telegram bot token", detail: "Store the Telegram bot token or secret reference.", key: "surfaces.telegram.botToken", visibleWhenKey: "surfaces.telegram.enabled", visibleWhenValue: true }),
|
|
890657
|
+
settingAction({ id: "channel-telegram-chat", label: "Telegram chat ID", detail: "Set the default Telegram chat, group, or channel id.", key: "surfaces.telegram.defaultChatId", visibleWhenKey: "surfaces.telegram.enabled", visibleWhenValue: true }),
|
|
890658
|
+
settingAction({ id: "channel-telegram-mode", label: "Telegram mode", detail: "Cycle webhook or polling ingress mode.", key: "surfaces.telegram.mode", visibleWhenKey: "surfaces.telegram.enabled", visibleWhenValue: true }),
|
|
890659
|
+
settingAction({ id: "channel-googlechat-enabled", label: "Use Google Chat", detail: "Toggle Google Chat delivery.", key: "surfaces.googleChat.enabled" }),
|
|
890660
|
+
settingAction({ id: "channel-googlechat-webhook", label: "Google Chat webhook", detail: "Set the Google Chat webhook or app callback URL.", key: "surfaces.googleChat.webhookUrl", visibleWhenKey: "surfaces.googleChat.enabled", visibleWhenValue: true }),
|
|
890661
|
+
settingAction({ id: "channel-homeassistant-enabled", label: "Use home automation", detail: "Toggle home automation conversation and event delivery.", key: "surfaces.homeassistant.enabled" }),
|
|
890662
|
+
settingAction({ id: "channel-homeassistant-url", label: "Home automation URL", detail: "Set the home automation instance URL.", key: "surfaces.homeassistant.instanceUrl", visibleWhenKey: "surfaces.homeassistant.enabled", visibleWhenValue: true }),
|
|
890663
|
+
settingAction({ id: "channel-homeassistant-token", label: "Home automation token", detail: "Store the home automation access token or secret reference.", key: "surfaces.homeassistant.accessToken", visibleWhenKey: "surfaces.homeassistant.enabled", visibleWhenValue: true }),
|
|
890664
|
+
settingAction({ id: "channel-signal-enabled", label: "Use Signal", detail: "Toggle Signal bridge delivery.", key: "surfaces.signal.enabled" }),
|
|
890665
|
+
settingAction({ id: "channel-signal-bridge", label: "Signal bridge URL", detail: "Set the Signal bridge base URL.", key: "surfaces.signal.bridgeUrl", visibleWhenKey: "surfaces.signal.enabled", visibleWhenValue: true }),
|
|
890666
|
+
settingAction({ id: "channel-signal-recipient", label: "Signal recipient", detail: "Set the default Signal recipient or group.", key: "surfaces.signal.defaultRecipient", visibleWhenKey: "surfaces.signal.enabled", visibleWhenValue: true }),
|
|
890667
|
+
settingAction({ id: "channel-whatsapp-enabled", label: "Use WhatsApp", detail: "Toggle WhatsApp delivery.", key: "surfaces.whatsapp.enabled" }),
|
|
890668
|
+
settingAction({ id: "channel-whatsapp-provider", label: "WhatsApp provider", detail: "Cycle Meta Cloud API or bridge provider mode.", key: "surfaces.whatsapp.provider", visibleWhenKey: "surfaces.whatsapp.enabled", visibleWhenValue: true }),
|
|
890669
|
+
settingAction({ id: "channel-whatsapp-token", label: "WhatsApp access token", detail: "Store the WhatsApp provider access token or secret reference.", key: "surfaces.whatsapp.accessToken", visibleWhenKey: "surfaces.whatsapp.enabled", visibleWhenValue: true }),
|
|
890670
|
+
settingAction({ id: "channel-whatsapp-recipient", label: "WhatsApp recipient", detail: "Set the default WhatsApp recipient or chat id.", key: "surfaces.whatsapp.defaultRecipient", visibleWhenKey: "surfaces.whatsapp.enabled", visibleWhenValue: true }),
|
|
890671
|
+
settingAction({ id: "channel-imessage-enabled", label: "Use iMessage", detail: "Toggle iMessage bridge delivery.", key: "surfaces.imessage.enabled" }),
|
|
890672
|
+
settingAction({ id: "channel-imessage-bridge", label: "iMessage bridge URL", detail: "Set the iMessage bridge base URL.", key: "surfaces.imessage.bridgeUrl", visibleWhenKey: "surfaces.imessage.enabled", visibleWhenValue: true }),
|
|
890673
|
+
settingAction({ id: "channel-imessage-chat", label: "iMessage chat ID", detail: "Set the default iMessage chat id.", key: "surfaces.imessage.defaultChatId", visibleWhenKey: "surfaces.imessage.enabled", visibleWhenValue: true }),
|
|
890674
|
+
{ id: "onboarding-notify-webhook", label: "Add notification webhook", detail: "Add one webhook target for explicit reminder and routine delivery.", editorKind: "notify-webhook", kind: "editor", safety: "safe" },
|
|
890675
|
+
{ id: "onboarding-test-webhook", label: "Test notification webhooks", detail: "Send one confirmed test notification to configured webhook targets.", editorKind: "notify-webhook-test", kind: "editor", safety: "safe" }
|
|
890676
|
+
]
|
|
890677
|
+
},
|
|
890678
|
+
{
|
|
890679
|
+
id: "onboarding-voice-media",
|
|
890680
|
+
group: "ONBOARDING",
|
|
890681
|
+
label: "Voice & Phone",
|
|
890682
|
+
summary: "Configure spoken replies, TTS routing, media prompts, and telephony.",
|
|
890683
|
+
detail: "Use this page for local voice, spoken-output defaults, image/media prompts, and SMS or phone-call delivery.",
|
|
890684
|
+
actions: [
|
|
890685
|
+
settingAction({ id: "voice-enabled", label: "Use voice controls", detail: "Toggle the optional local voice control surface.", key: "ui.voiceEnabled" }),
|
|
890686
|
+
settingAction({ id: "voice-tts-provider", label: "TTS provider", detail: "Set the default text-to-speech provider id.", key: "tts.provider" }),
|
|
890687
|
+
settingAction({ id: "voice-tts-voice", label: "TTS voice", detail: "Set the default text-to-speech voice id.", key: "tts.voice" }),
|
|
890688
|
+
{ id: "voice-speak-prompt", label: "Try spoken prompt", detail: "Open a prompt form for a spoken assistant reply through configured TTS.", editorKind: "tts-prompt", kind: "editor", safety: "safe" },
|
|
890689
|
+
{ id: "media-attach-image", label: "Attach image", detail: "Attach a local image path and optional prompt to the next assistant turn.", editorKind: "image-input", kind: "editor", safety: "safe" },
|
|
890690
|
+
{ id: "onboarding-media-generate", label: "Generate media", detail: "Generate image or video artifacts through a configured media provider after confirmation.", editorKind: "media-generate", kind: "editor", safety: "safe" },
|
|
890691
|
+
settingAction({ id: "telephony-enabled", label: "Use telephony", detail: "Toggle SMS, voice call, or telephony bridge delivery.", key: "surfaces.telephony.enabled" }),
|
|
890692
|
+
settingAction({ id: "telephony-provider", label: "Telephony provider", detail: "Cycle direct provider or bridge mode.", key: "surfaces.telephony.provider", visibleWhenKey: "surfaces.telephony.enabled", visibleWhenValue: true }),
|
|
890693
|
+
settingAction({ id: "telephony-mode", label: "Telephony mode", detail: "Cycle SMS, voice call, or bridge delivery mode.", key: "surfaces.telephony.mode", visibleWhenKey: "surfaces.telephony.enabled", visibleWhenValue: true }),
|
|
890694
|
+
settingAction({ id: "telephony-account-sid", label: "Twilio account SID", detail: "Set the Twilio account SID for provider-direct delivery.", key: "surfaces.telephony.accountSid", visibleWhenKey: "surfaces.telephony.enabled", visibleWhenValue: true }),
|
|
890695
|
+
settingAction({ id: "telephony-auth-token", label: "Twilio auth token", detail: "Store the Twilio auth token or secret reference.", key: "surfaces.telephony.authToken", visibleWhenKey: "surfaces.telephony.enabled", visibleWhenValue: true }),
|
|
890696
|
+
settingAction({ id: "telephony-from", label: "Sender phone number", detail: "Set the default caller or sender phone number.", key: "surfaces.telephony.fromNumber", visibleWhenKey: "surfaces.telephony.enabled", visibleWhenValue: true }),
|
|
890697
|
+
settingAction({ id: "telephony-recipient", label: "Recipient phone number", detail: "Set the default telephony recipient number.", key: "surfaces.telephony.defaultRecipient", visibleWhenKey: "surfaces.telephony.enabled", visibleWhenValue: true }),
|
|
890698
|
+
settingAction({ id: "telephony-webhook-secret", label: "Telephony webhook secret", detail: "Store the shared telephony webhook secret or secret reference.", key: "surfaces.telephony.webhookSecret", visibleWhenKey: "surfaces.telephony.enabled", visibleWhenValue: true }),
|
|
890699
|
+
settingAction({ id: "telephony-voice-language", label: "Voice language", detail: "Set the BCP-47 language code for voice-call text-to-speech.", key: "surfaces.telephony.voiceLanguage", visibleWhenKey: "surfaces.telephony.enabled", visibleWhenValue: true })
|
|
890700
|
+
]
|
|
890701
|
+
},
|
|
890702
|
+
{
|
|
890703
|
+
id: "onboarding-context",
|
|
890704
|
+
group: "ONBOARDING",
|
|
890705
|
+
label: "Context",
|
|
890706
|
+
summary: "Local persona, memory, skills, routines, notes, and Agent Knowledge.",
|
|
890707
|
+
detail: "Use this page to make the assistant useful with durable local context and source-backed knowledge.",
|
|
890708
|
+
actions: [
|
|
890709
|
+
{ id: "context-profile-from-discovered", label: "Profile from discovered files", detail: "Create an isolated Agent profile from reviewed local persona, skill, and routine files.", editorKind: "profile-from-discovered", kind: "editor", safety: "safe" },
|
|
890710
|
+
{ id: "context-persona-discovery", label: "Import persona files", detail: "Import discovered persona files into the Agent persona registry.", editorKind: "persona-discovery-import", kind: "editor", safety: "safe" },
|
|
890711
|
+
{ id: "context-skill-discovery", label: "Import skill files", detail: "Import discovered skill files into the Agent skill registry.", editorKind: "skill-discovery-import", kind: "editor", safety: "safe" },
|
|
890712
|
+
{ id: "context-routine-discovery", label: "Import routine files", detail: "Import discovered routine files into the Agent routine registry.", editorKind: "routine-discovery-import", kind: "editor", safety: "safe" },
|
|
890713
|
+
{ id: "context-create-persona", label: "Create persona", detail: "Create and optionally activate an Agent-local persona.", editorKind: "persona", kind: "editor", safety: "safe" },
|
|
890714
|
+
{ id: "context-create-memory", label: "Create starter memory", detail: "Create one durable local memory record.", editorKind: "memory", kind: "editor", safety: "safe" },
|
|
890715
|
+
{ id: "context-create-skill", label: "Create skill", detail: "Create one reusable Agent-local skill.", editorKind: "skill", kind: "editor", safety: "safe" },
|
|
890716
|
+
{ id: "context-create-routine", label: "Create routine", detail: "Create one reusable Agent-local routine.", editorKind: "routine", kind: "editor", safety: "safe" },
|
|
890717
|
+
{ id: "context-create-note", label: "Create note", detail: "Create one Agent-local scratchpad note.", editorKind: "note", kind: "editor", safety: "safe" },
|
|
890718
|
+
{ id: "context-knowledge-url", label: "Ingest URL", detail: "Ingest a reviewed URL into isolated Agent Knowledge after confirmation.", editorKind: "knowledge-url", kind: "editor", safety: "safe" },
|
|
890719
|
+
{ id: "context-knowledge-file", label: "Ingest file", detail: "Ingest a local file into isolated Agent Knowledge after confirmation.", editorKind: "knowledge-file", kind: "editor", safety: "safe" },
|
|
890720
|
+
{ id: "context-knowledge-bookmarks", label: "Import bookmarks", detail: "Import a browser bookmark export into isolated Agent Knowledge.", editorKind: "knowledge-bookmarks", kind: "editor", safety: "safe" },
|
|
890721
|
+
{ id: "context-knowledge-browser-history", label: "Import browser history", detail: "Import local browser history or bookmarks into isolated Agent Knowledge.", editorKind: "knowledge-browser-history", kind: "editor", safety: "safe" }
|
|
890722
|
+
]
|
|
890723
|
+
},
|
|
890724
|
+
{
|
|
890725
|
+
id: "onboarding-verify",
|
|
890726
|
+
group: "ONBOARDING",
|
|
890727
|
+
label: "Verify",
|
|
890728
|
+
summary: "Review the configured runtime before finishing onboarding.",
|
|
890729
|
+
detail: "Use this page to inspect health, model/provider state, channels, MCP, and knowledge before applying the completion marker.",
|
|
890730
|
+
actions: [
|
|
890731
|
+
{ id: "verify-brief", label: "Operator briefing", detail: "Show a concise status and next-action briefing.", command: "/brief", kind: "command", safety: "read-only" },
|
|
890732
|
+
{ id: "verify-health", label: "Health review", detail: "Review local runtime and connected-host status.", command: "/health review", kind: "command", safety: "read-only" },
|
|
890733
|
+
{ id: "verify-compat", label: "Compatibility", detail: "Inspect connected-host compatibility and Agent Knowledge route readiness.", command: "/compat", kind: "command", safety: "read-only" },
|
|
890734
|
+
{ id: "verify-provider", label: "Provider status", detail: "Inspect provider/model routing state.", command: "/provider", kind: "command", safety: "read-only" },
|
|
890735
|
+
{ id: "verify-subscription", label: "Subscription status", detail: "Inspect active and pending provider subscription sessions.", command: "/subscription review", kind: "command", safety: "read-only" },
|
|
890736
|
+
{ id: "verify-channels", label: "Channel readiness", detail: "Inspect channel readiness and enabled-channel attention items.", command: "/channels attention", kind: "command", safety: "read-only" },
|
|
890737
|
+
{ id: "verify-mcp", label: "MCP review", detail: "Inspect MCP server connection, role, trust, and quarantine posture.", command: "/mcp review", kind: "command", safety: "read-only" },
|
|
890738
|
+
{ id: "verify-knowledge", label: "Knowledge status", detail: "Inspect isolated Agent Knowledge readiness and counts.", command: "/knowledge status", kind: "command", safety: "read-only" }
|
|
890544
890739
|
]
|
|
890545
890740
|
},
|
|
890546
890741
|
{
|
|
@@ -891014,7 +891209,9 @@ var AGENT_WORKSPACE_CATEGORIES = [
|
|
|
891014
891209
|
{ id: "host-auth-review", label: "Provider auth review", detail: "Review provider auth posture without printing token values.", command: "/auth review", kind: "command", safety: "read-only" },
|
|
891015
891210
|
{ id: "host-security", label: "Security review", detail: "Inspect token posture, MCP attack paths, policy lint, plugin risk, and incident pressure.", command: "/security review", kind: "command", safety: "read-only" },
|
|
891016
891211
|
{ id: "host-trust", label: "Trust review", detail: "Review permission, secret, plugin, and MCP trust posture without exporting bundles or changing trust.", command: "/trust review", kind: "command", safety: "read-only" },
|
|
891017
|
-
{ id: "host-support-bundle", label: "
|
|
891212
|
+
{ id: "host-support-bundle-export", label: "Export support bundle", detail: "Export a redacted Agent support bundle from the Host page.", editorKind: "support-bundle-export", kind: "editor", safety: "safe" },
|
|
891213
|
+
{ id: "host-support-bundle-inspect", label: "Inspect support bundle", detail: "Inspect a support bundle before import or sharing.", editorKind: "support-bundle-inspect", kind: "editor", safety: "read-only" },
|
|
891214
|
+
{ id: "host-support-bundle-import", label: "Import support bundle", detail: "Import reviewed, non-redacted config values from a support bundle.", editorKind: "support-bundle-import", kind: "editor", safety: "safe" },
|
|
891018
891215
|
{ id: "host-telemetry", label: "Telemetry settings", detail: "Open telemetry payload policy settings for connected-host and Agent observability review.", command: "/config telemetry", kind: "command", safety: "safe" },
|
|
891019
891216
|
{ id: "host-config", label: "Control-plane settings", detail: "Open configuration controls for service, channels, tools, automation, provider, and storage posture.", command: "/config", kind: "command", safety: "safe" },
|
|
891020
891217
|
{ id: "host-safety", label: "Host mutation policy", detail: "Agent may inspect connected-host surfaces and run explicit confirmed actions, but does not silently create tasks, send channel messages, mutate auth, or start automation.", kind: "guidance", safety: "blocked" }
|
|
@@ -891066,9 +891263,7 @@ var AGENT_WORKSPACE_CATEGORIES = [
|
|
|
891066
891263
|
label: "Finish",
|
|
891067
891264
|
summary: "Acknowledge setup and close onboarding.",
|
|
891068
891265
|
detail: "Use this final step after reviewing setup. Apply & close writes the user onboarding completion marker so normal future launches start in the main conversation.",
|
|
891069
|
-
actions: [
|
|
891070
|
-
{ id: "onboarding-apply-close", label: "Apply & close", detail: "Acknowledge onboarding as finished, persist the user completion marker, and close the fullscreen Agent workspace.", kind: "onboarding-complete", safety: "safe" }
|
|
891071
|
-
]
|
|
891266
|
+
actions: [{ id: "onboarding-apply-close", label: "Apply & close", detail: "Acknowledge onboarding as finished, persist the user completion marker, and close the fullscreen Agent workspace.", kind: "onboarding-complete", safety: "safe" }]
|
|
891072
891267
|
}
|
|
891073
891268
|
];
|
|
891074
891269
|
|
|
@@ -891280,7 +891475,7 @@ function readLimit26(value, fallback) {
|
|
|
891280
891475
|
const parsed = typeof value === "string" && value.trim() ? Number(value) : value;
|
|
891281
891476
|
if (typeof parsed !== "number" || !Number.isFinite(parsed))
|
|
891282
891477
|
return fallback;
|
|
891283
|
-
return Math.max(1, Math.min(
|
|
891478
|
+
return Math.max(1, Math.min(1000, Math.trunc(parsed)));
|
|
891284
891479
|
}
|
|
891285
891480
|
function readFieldMap3(value) {
|
|
891286
891481
|
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
@@ -891444,7 +891639,7 @@ function describeWorkspaceActionSummary(category, action2) {
|
|
|
891444
891639
|
function listWorkspaceActions(context, args2) {
|
|
891445
891640
|
const query2 = readString72(args2.query);
|
|
891446
891641
|
const categoryId = readString72(args2.categoryId || args2.category);
|
|
891447
|
-
const limit3 = readLimit26(args2.limit,
|
|
891642
|
+
const limit3 = readLimit26(args2.limit, 1000);
|
|
891448
891643
|
const includeEditor = args2.includeParameters === true;
|
|
891449
891644
|
const editorContext = includeEditor ? buildWorkspaceEditorContext(context, args2) : null;
|
|
891450
891645
|
const source = query2 ? searchAgentWorkspaceActions(AGENT_WORKSPACE_CATEGORIES, query2).map((result2) => ({ category: result2.category, action: result2.action })) : allWorkspaceActions();
|
|
@@ -895594,6 +895789,254 @@ function buildAgentWorkspaceRequirements(readField) {
|
|
|
895594
895789
|
commands: splitList5(readField("requiresCommands"))
|
|
895595
895790
|
});
|
|
895596
895791
|
}
|
|
895792
|
+
|
|
895793
|
+
// src/input/agent-workspace-settings.ts
|
|
895794
|
+
import { existsSync as existsSync87, readFileSync as readFileSync94 } from "fs";
|
|
895795
|
+
var GOODVIBES_TUI_SURFACE_ROOT = "tui";
|
|
895796
|
+
var TUI_IMPORTABLE_SETTING_PREFIXES = [
|
|
895797
|
+
"display.",
|
|
895798
|
+
"provider.",
|
|
895799
|
+
"behavior.",
|
|
895800
|
+
"storage.",
|
|
895801
|
+
"permissions.",
|
|
895802
|
+
"ui.",
|
|
895803
|
+
"tts.",
|
|
895804
|
+
"surfaces.",
|
|
895805
|
+
"helper.",
|
|
895806
|
+
"tools.",
|
|
895807
|
+
"release.",
|
|
895808
|
+
"automation."
|
|
895809
|
+
];
|
|
895810
|
+
function isRecord45(value) {
|
|
895811
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
895812
|
+
}
|
|
895813
|
+
function readJsonRecord(path7) {
|
|
895814
|
+
if (!existsSync87(path7))
|
|
895815
|
+
return null;
|
|
895816
|
+
const parsed = JSON.parse(readFileSync94(path7, "utf-8"));
|
|
895817
|
+
return isRecord45(parsed) ? parsed : null;
|
|
895818
|
+
}
|
|
895819
|
+
function readNestedSettingValue(record2, key) {
|
|
895820
|
+
let cursor = record2;
|
|
895821
|
+
for (const part of key.split(".")) {
|
|
895822
|
+
if (!isRecord45(cursor) || !(part in cursor))
|
|
895823
|
+
return;
|
|
895824
|
+
cursor = cursor[part];
|
|
895825
|
+
}
|
|
895826
|
+
return cursor;
|
|
895827
|
+
}
|
|
895828
|
+
function canImportTuiSetting(key) {
|
|
895829
|
+
return !isExternalHostOwnedSettingKey(key) && TUI_IMPORTABLE_SETTING_PREFIXES.some((prefix) => key.startsWith(prefix));
|
|
895830
|
+
}
|
|
895831
|
+
function valuesMatch(left, right) {
|
|
895832
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
895833
|
+
}
|
|
895834
|
+
function agentWorkspaceSettingSchema(context, key) {
|
|
895835
|
+
return context?.platform?.configManager?.getSchema().find((setting) => setting.key === key) ?? null;
|
|
895836
|
+
}
|
|
895837
|
+
function isAgentWorkspaceActionVisible(context, action2) {
|
|
895838
|
+
const key = action2.visibleWhenSettingKey?.trim();
|
|
895839
|
+
if (!key)
|
|
895840
|
+
return true;
|
|
895841
|
+
const configManager = context?.platform?.configManager;
|
|
895842
|
+
if (!configManager)
|
|
895843
|
+
return false;
|
|
895844
|
+
return configManager.get(key) === action2.visibleWhenSettingValue;
|
|
895845
|
+
}
|
|
895846
|
+
function buildAgentWorkspaceSettingActionEffect(context, action2) {
|
|
895847
|
+
const settingKey = action2.settingKey?.trim();
|
|
895848
|
+
const configManager = context?.platform?.configManager;
|
|
895849
|
+
if (!settingKey || !configManager) {
|
|
895850
|
+
return {
|
|
895851
|
+
kind: "result",
|
|
895852
|
+
status: "Setting is unavailable in this runtime.",
|
|
895853
|
+
result: {
|
|
895854
|
+
kind: "error",
|
|
895855
|
+
title: "Setting unavailable",
|
|
895856
|
+
detail: action2.detail,
|
|
895857
|
+
safety: action2.safety
|
|
895858
|
+
}
|
|
895859
|
+
};
|
|
895860
|
+
}
|
|
895861
|
+
const setting = agentWorkspaceSettingSchema(context, settingKey);
|
|
895862
|
+
if (!setting) {
|
|
895863
|
+
return {
|
|
895864
|
+
kind: "result",
|
|
895865
|
+
status: `Unknown setting: ${settingKey}`,
|
|
895866
|
+
result: {
|
|
895867
|
+
kind: "error",
|
|
895868
|
+
title: "Unknown setting",
|
|
895869
|
+
detail: `No Agent setting exists for ${settingKey}.`,
|
|
895870
|
+
safety: action2.safety
|
|
895871
|
+
}
|
|
895872
|
+
};
|
|
895873
|
+
}
|
|
895874
|
+
if (action2.settingValueHint !== undefined) {
|
|
895875
|
+
return { kind: "apply", setting, value: action2.settingValueHint };
|
|
895876
|
+
}
|
|
895877
|
+
const currentValue = configManager.get(setting.key);
|
|
895878
|
+
if (setting.type === "boolean") {
|
|
895879
|
+
return { kind: "apply", setting, value: !Boolean(currentValue) };
|
|
895880
|
+
}
|
|
895881
|
+
if (setting.type === "enum" && setting.enumValues && setting.enumValues.length > 0) {
|
|
895882
|
+
const currentIndex = Math.max(0, setting.enumValues.indexOf(String(currentValue)));
|
|
895883
|
+
return { kind: "apply", setting, value: setting.enumValues[(currentIndex + 1) % setting.enumValues.length] };
|
|
895884
|
+
}
|
|
895885
|
+
return {
|
|
895886
|
+
kind: "editor",
|
|
895887
|
+
editor: createSettingEditor(setting, String(currentValue ?? ""), action2),
|
|
895888
|
+
status: `Editing ${setting.key}.`,
|
|
895889
|
+
result: {
|
|
895890
|
+
kind: "guidance",
|
|
895891
|
+
title: `Edit ${setting.key}`,
|
|
895892
|
+
detail: setting.description,
|
|
895893
|
+
safety: action2.safety
|
|
895894
|
+
}
|
|
895895
|
+
};
|
|
895896
|
+
}
|
|
895897
|
+
async function applyAgentWorkspaceSettingValue(context, setting, value) {
|
|
895898
|
+
const configManager = context?.platform?.configManager;
|
|
895899
|
+
if (!configManager) {
|
|
895900
|
+
return {
|
|
895901
|
+
status: "Setting is unavailable in this runtime.",
|
|
895902
|
+
result: {
|
|
895903
|
+
kind: "error",
|
|
895904
|
+
title: `${setting.key} update failed`,
|
|
895905
|
+
detail: "The Agent workspace has no config manager for this runtime.",
|
|
895906
|
+
safety: "safe"
|
|
895907
|
+
}
|
|
895908
|
+
};
|
|
895909
|
+
}
|
|
895910
|
+
try {
|
|
895911
|
+
const result2 = await setHarnessSetting(configManager, context?.platform?.secretsManager, setting.key, value);
|
|
895912
|
+
return {
|
|
895913
|
+
status: `${result2.key} set.`,
|
|
895914
|
+
result: {
|
|
895915
|
+
kind: "refreshed",
|
|
895916
|
+
title: `${result2.key} updated`,
|
|
895917
|
+
detail: `Current value: ${String(result2.current)}`,
|
|
895918
|
+
safety: "safe"
|
|
895919
|
+
}
|
|
895920
|
+
};
|
|
895921
|
+
} catch (error53) {
|
|
895922
|
+
const detail = error53 instanceof Error ? error53.message : String(error53);
|
|
895923
|
+
return {
|
|
895924
|
+
status: detail,
|
|
895925
|
+
result: {
|
|
895926
|
+
kind: "error",
|
|
895927
|
+
title: `${setting.key} update failed`,
|
|
895928
|
+
detail,
|
|
895929
|
+
safety: "safe"
|
|
895930
|
+
}
|
|
895931
|
+
};
|
|
895932
|
+
}
|
|
895933
|
+
}
|
|
895934
|
+
async function importAgentWorkspaceTuiSettings(context) {
|
|
895935
|
+
const shellPaths3 = context?.workspace?.shellPaths;
|
|
895936
|
+
const configManager = context?.platform?.configManager;
|
|
895937
|
+
if (!shellPaths3 || !configManager) {
|
|
895938
|
+
return {
|
|
895939
|
+
status: "GoodVibes TUI settings import is unavailable in this runtime.",
|
|
895940
|
+
runtimeSnapshot: null,
|
|
895941
|
+
result: {
|
|
895942
|
+
kind: "error",
|
|
895943
|
+
title: "Import unavailable",
|
|
895944
|
+
detail: "The workspace cannot locate shell paths or the Agent config manager.",
|
|
895945
|
+
safety: "safe"
|
|
895946
|
+
}
|
|
895947
|
+
};
|
|
895948
|
+
}
|
|
895949
|
+
const sources = [
|
|
895950
|
+
{ label: "user", path: shellPaths3.resolveUserPath(GOODVIBES_TUI_SURFACE_ROOT, "settings.json") },
|
|
895951
|
+
{ label: "project", path: shellPaths3.resolveProjectPath(GOODVIBES_TUI_SURFACE_ROOT, "settings.json") }
|
|
895952
|
+
];
|
|
895953
|
+
const values2 = new Map;
|
|
895954
|
+
const parseErrors = [];
|
|
895955
|
+
for (const source of sources) {
|
|
895956
|
+
try {
|
|
895957
|
+
const record2 = readJsonRecord(source.path);
|
|
895958
|
+
if (!record2)
|
|
895959
|
+
continue;
|
|
895960
|
+
for (const setting of configManager.getSchema()) {
|
|
895961
|
+
if (!canImportTuiSetting(setting.key))
|
|
895962
|
+
continue;
|
|
895963
|
+
const value = readNestedSettingValue(record2, setting.key);
|
|
895964
|
+
if (value !== undefined)
|
|
895965
|
+
values2.set(setting.key, { value, source: source.label });
|
|
895966
|
+
}
|
|
895967
|
+
} catch (error53) {
|
|
895968
|
+
parseErrors.push(`${source.label}: ${error53 instanceof Error ? error53.message : String(error53)}`);
|
|
895969
|
+
}
|
|
895970
|
+
}
|
|
895971
|
+
if (values2.size === 0) {
|
|
895972
|
+
const detail = parseErrors.length > 0 ? `No importable settings found. ${parseErrors.join("; ")}` : "No GoodVibes TUI settings file with importable Agent-owned settings was found.";
|
|
895973
|
+
return {
|
|
895974
|
+
status: "No GoodVibes TUI settings imported.",
|
|
895975
|
+
runtimeSnapshot: null,
|
|
895976
|
+
result: {
|
|
895977
|
+
kind: parseErrors.length > 0 ? "error" : "guidance",
|
|
895978
|
+
title: "Nothing imported",
|
|
895979
|
+
detail,
|
|
895980
|
+
safety: "safe"
|
|
895981
|
+
}
|
|
895982
|
+
};
|
|
895983
|
+
}
|
|
895984
|
+
const imported = [];
|
|
895985
|
+
const unchanged = [];
|
|
895986
|
+
const skipped = [];
|
|
895987
|
+
for (const [key, entry] of values2) {
|
|
895988
|
+
const setting = agentWorkspaceSettingSchema(context, key);
|
|
895989
|
+
if (!setting)
|
|
895990
|
+
continue;
|
|
895991
|
+
if (valuesMatch(configManager.get(setting.key), entry.value)) {
|
|
895992
|
+
unchanged.push(setting.key);
|
|
895993
|
+
continue;
|
|
895994
|
+
}
|
|
895995
|
+
try {
|
|
895996
|
+
await setHarnessSetting(configManager, context?.platform?.secretsManager, setting.key, entry.value);
|
|
895997
|
+
imported.push(`${setting.key} (${entry.source})`);
|
|
895998
|
+
} catch (error53) {
|
|
895999
|
+
skipped.push(`${setting.key}: ${error53 instanceof Error ? error53.message : String(error53)}`);
|
|
896000
|
+
}
|
|
896001
|
+
}
|
|
896002
|
+
return {
|
|
896003
|
+
status: imported.length > 0 ? `Imported ${imported.length} GoodVibes TUI setting(s).` : "No GoodVibes TUI settings changed.",
|
|
896004
|
+
runtimeSnapshot: context ? buildAgentWorkspaceRuntimeSnapshot(context) : null,
|
|
896005
|
+
result: {
|
|
896006
|
+
kind: skipped.length > 0 && imported.length === 0 ? "error" : imported.length > 0 ? "refreshed" : "guidance",
|
|
896007
|
+
title: imported.length > 0 ? "GoodVibes TUI settings imported" : "No settings changed",
|
|
896008
|
+
detail: [
|
|
896009
|
+
imported.length > 0 ? `Imported: ${imported.slice(0, 10).join(", ")}${imported.length > 10 ? `, +${imported.length - 10} more` : ""}.` : "",
|
|
896010
|
+
unchanged.length > 0 ? `${unchanged.length} setting(s) already matched.` : "",
|
|
896011
|
+
skipped.length > 0 ? `Skipped: ${skipped.slice(0, 5).join("; ")}${skipped.length > 5 ? `; +${skipped.length - 5} more` : ""}.` : "",
|
|
896012
|
+
parseErrors.length > 0 ? `Parse issues: ${parseErrors.join("; ")}.` : ""
|
|
896013
|
+
].filter((line2) => line2.length > 0).join(" "),
|
|
896014
|
+
safety: "safe"
|
|
896015
|
+
}
|
|
896016
|
+
};
|
|
896017
|
+
}
|
|
896018
|
+
function createSettingEditor(setting, currentValue, action2) {
|
|
896019
|
+
const valueHint = setting.type === "number" ? "Enter a number." : setting.type === "string" ? "Enter a value. Leave empty to clear it." : setting.enumValues ? `Allowed values: ${setting.enumValues.join(", ")}.` : action2.detail;
|
|
896020
|
+
return {
|
|
896021
|
+
kind: "setting-set",
|
|
896022
|
+
mode: "update",
|
|
896023
|
+
recordId: setting.key,
|
|
896024
|
+
title: `Set ${setting.key}`,
|
|
896025
|
+
selectedFieldIndex: 0,
|
|
896026
|
+
message: action2.detail,
|
|
896027
|
+
fields: [
|
|
896028
|
+
{
|
|
896029
|
+
id: "value",
|
|
896030
|
+
label: setting.key,
|
|
896031
|
+
value: currentValue,
|
|
896032
|
+
required: false,
|
|
896033
|
+
multiline: false,
|
|
896034
|
+
hint: action2.settingValueHint ?? valueHint,
|
|
896035
|
+
redact: /(?:secret|token|password|api[-_.]?key|signing)/i.test(setting.key)
|
|
896036
|
+
}
|
|
896037
|
+
]
|
|
896038
|
+
};
|
|
896039
|
+
}
|
|
895597
896040
|
// src/input/agent-workspace-token.ts
|
|
895598
896041
|
function handleAgentWorkspaceToken(workspace, token, handleEscape2, requestRender) {
|
|
895599
896042
|
if (!workspace.active)
|
|
@@ -895697,14 +896140,7 @@ class AgentWorkspace {
|
|
|
895697
896140
|
localEditor = null;
|
|
895698
896141
|
actionSearchActive = false;
|
|
895699
896142
|
actionSearchQuery = "";
|
|
895700
|
-
selectedLibraryItemIndexes = {
|
|
895701
|
-
memory: 0,
|
|
895702
|
-
note: 0,
|
|
895703
|
-
persona: 0,
|
|
895704
|
-
skill: 0,
|
|
895705
|
-
routine: 0,
|
|
895706
|
-
profile: 0
|
|
895707
|
-
};
|
|
896143
|
+
selectedLibraryItemIndexes = { memory: 0, note: 0, persona: 0, skill: 0, routine: 0, profile: 0 };
|
|
895708
896144
|
context = null;
|
|
895709
896145
|
dispatchCommand = null;
|
|
895710
896146
|
dispatchPrompt = null;
|
|
@@ -895720,7 +896156,10 @@ class AgentWorkspace {
|
|
|
895720
896156
|
this.localEditor = null;
|
|
895721
896157
|
this.actionSearchActive = false;
|
|
895722
896158
|
this.actionSearchQuery = "";
|
|
895723
|
-
if (
|
|
896159
|
+
if (!categoryId) {
|
|
896160
|
+
this.selectedCategoryIndex = 0;
|
|
896161
|
+
this.selectedActionIndex = 0;
|
|
896162
|
+
} else if (!this.selectCategory(categoryId)) {
|
|
895724
896163
|
const normalized3 = categoryId.trim();
|
|
895725
896164
|
this.status = `Unknown Agent workspace area: ${normalized3}`;
|
|
895726
896165
|
this.lastActionResult = {
|
|
@@ -895751,7 +896190,7 @@ class AgentWorkspace {
|
|
|
895751
896190
|
get actions() {
|
|
895752
896191
|
if (this.actionSearchActive)
|
|
895753
896192
|
return this.actionSearchResults.map((result2) => result2.action);
|
|
895754
|
-
return this.selectedCategory.actions;
|
|
896193
|
+
return this.selectedCategory.actions.filter((action2) => isAgentWorkspaceActionVisible(this.context, action2));
|
|
895755
896194
|
}
|
|
895756
896195
|
get selectedAction() {
|
|
895757
896196
|
return this.actions[this.selectedActionIndex] ?? null;
|
|
@@ -895762,7 +896201,13 @@ class AgentWorkspace {
|
|
|
895762
896201
|
return this.selectedCategory;
|
|
895763
896202
|
}
|
|
895764
896203
|
get actionSearchResults() {
|
|
895765
|
-
|
|
896204
|
+
if (!this.actionSearchActive)
|
|
896205
|
+
return [];
|
|
896206
|
+
const categories = this.categories.map((category) => ({
|
|
896207
|
+
...category,
|
|
896208
|
+
actions: category.actions.filter((action2) => isAgentWorkspaceActionVisible(this.context, action2))
|
|
896209
|
+
}));
|
|
896210
|
+
return searchAgentWorkspaceActions(categories, this.actionSearchQuery);
|
|
895766
896211
|
}
|
|
895767
896212
|
get selectedActionSearchResult() {
|
|
895768
896213
|
if (!this.actionSearchActive)
|
|
@@ -895819,11 +896264,7 @@ class AgentWorkspace {
|
|
|
895819
896264
|
}
|
|
895820
896265
|
this.runtimeSnapshot = buildAgentWorkspaceRuntimeSnapshot(this.context);
|
|
895821
896266
|
this.status = "Runtime context refreshed.";
|
|
895822
|
-
this.lastActionResult = {
|
|
895823
|
-
kind: "refreshed",
|
|
895824
|
-
title: "Runtime context refreshed",
|
|
895825
|
-
detail: "Provider, model, session, local memory, runtime endpoint, and Agent knowledge route posture were re-read from the live command context."
|
|
895826
|
-
};
|
|
896267
|
+
this.lastActionResult = { kind: "refreshed", title: "Runtime context refreshed", detail: "Provider, model, session, local memory, runtime endpoint, and Agent knowledge route posture were re-read from the live command context." };
|
|
895827
896268
|
}
|
|
895828
896269
|
cancelLocalEditor() {
|
|
895829
896270
|
if (!this.localEditor)
|
|
@@ -895951,34 +896392,37 @@ class AgentWorkspace {
|
|
|
895951
896392
|
return;
|
|
895952
896393
|
}
|
|
895953
896394
|
try {
|
|
895954
|
-
const marker = {
|
|
895955
|
-
scope: "user",
|
|
895956
|
-
source: "wizard",
|
|
895957
|
-
mode: "new",
|
|
895958
|
-
workspaceRoot: shellPaths3.workingDirectory
|
|
895959
|
-
};
|
|
896395
|
+
const marker = { scope: "user", source: "wizard", mode: "new", workspaceRoot: shellPaths3.workingDirectory };
|
|
895960
896396
|
writeOnboardingCheckMarker(shellPaths3, marker);
|
|
895961
896397
|
writeOnboardingCompletionMarker(shellPaths3, marker);
|
|
895962
896398
|
this.status = "Onboarding applied and closed.";
|
|
895963
|
-
this.lastActionResult = {
|
|
895964
|
-
kind: "refreshed",
|
|
895965
|
-
title: "Onboarding complete",
|
|
895966
|
-
detail: "Saved the user onboarding completion marker. Future normal launches start in the main conversation.",
|
|
895967
|
-
safety: "safe"
|
|
895968
|
-
};
|
|
896399
|
+
this.lastActionResult = { kind: "refreshed", title: "Onboarding complete", detail: "Saved the user onboarding completion marker. Future normal launches start in the main conversation.", safety: "safe" };
|
|
895969
896400
|
if (!this.context?.dismissAgentWorkspace?.())
|
|
895970
896401
|
this.close();
|
|
895971
896402
|
} catch (error53) {
|
|
895972
896403
|
const detail = error53 instanceof Error ? error53.message : String(error53);
|
|
895973
896404
|
this.status = "Onboarding completion failed.";
|
|
895974
|
-
this.lastActionResult = {
|
|
895975
|
-
kind: "error",
|
|
895976
|
-
title: "Onboarding completion failed",
|
|
895977
|
-
detail,
|
|
895978
|
-
safety: "safe"
|
|
895979
|
-
};
|
|
896405
|
+
this.lastActionResult = { kind: "error", title: "Onboarding completion failed", detail, safety: "safe" };
|
|
895980
896406
|
}
|
|
895981
896407
|
}
|
|
896408
|
+
applySettingAction(action2, requestRender) {
|
|
896409
|
+
const effect = buildAgentWorkspaceSettingActionEffect(this.context, action2);
|
|
896410
|
+
if (effect.kind === "result") {
|
|
896411
|
+
this.status = effect.status;
|
|
896412
|
+
this.lastActionResult = effect.result;
|
|
896413
|
+
return;
|
|
896414
|
+
}
|
|
896415
|
+
if (effect.kind === "editor") {
|
|
896416
|
+
this.localEditor = effect.editor;
|
|
896417
|
+
this.status = effect.status;
|
|
896418
|
+
this.lastActionResult = effect.result;
|
|
896419
|
+
return;
|
|
896420
|
+
}
|
|
896421
|
+
this.applySettingValue(effect.setting, effect.value, requestRender);
|
|
896422
|
+
}
|
|
896423
|
+
importTuiSettings(requestRender) {
|
|
896424
|
+
this.importTuiSettingsAsync(requestRender);
|
|
896425
|
+
}
|
|
895982
896426
|
selectedItemForOperation(operation) {
|
|
895983
896427
|
if (operation.startsWith("memory-"))
|
|
895984
896428
|
return this.selectedLocalLibraryItem("memory");
|
|
@@ -895990,6 +896434,22 @@ class AgentWorkspace {
|
|
|
895990
896434
|
return this.selectedLocalLibraryItem("skill");
|
|
895991
896435
|
return this.selectedLocalLibraryItem("routine");
|
|
895992
896436
|
}
|
|
896437
|
+
async applySettingValue(setting, value, requestRender) {
|
|
896438
|
+
const outcome = await applyAgentWorkspaceSettingValue(this.context, setting, value);
|
|
896439
|
+
this.runtimeSnapshot = this.context ? buildAgentWorkspaceRuntimeSnapshot(this.context) : this.runtimeSnapshot;
|
|
896440
|
+
this.clampSelection();
|
|
896441
|
+
this.status = outcome.status;
|
|
896442
|
+
this.lastActionResult = outcome.result;
|
|
896443
|
+
requestRender?.();
|
|
896444
|
+
}
|
|
896445
|
+
async importTuiSettingsAsync(requestRender) {
|
|
896446
|
+
const outcome = await importAgentWorkspaceTuiSettings(this.context);
|
|
896447
|
+
this.runtimeSnapshot = outcome.runtimeSnapshot ?? this.runtimeSnapshot;
|
|
896448
|
+
this.clampSelection();
|
|
896449
|
+
this.status = outcome.status;
|
|
896450
|
+
this.lastActionResult = outcome.result;
|
|
896451
|
+
requestRender?.();
|
|
896452
|
+
}
|
|
895993
896453
|
memoryApi() {
|
|
895994
896454
|
const memory = this.context?.clients?.agentKnowledgeApi?.memory;
|
|
895995
896455
|
if (!memory)
|
|
@@ -896060,6 +896520,19 @@ class AgentWorkspace {
|
|
|
896060
896520
|
requestRender?.();
|
|
896061
896521
|
return;
|
|
896062
896522
|
}
|
|
896523
|
+
if (editor.kind === "setting-set") {
|
|
896524
|
+
const setting = editor.recordId ? agentWorkspaceSettingSchema(this.context, editor.recordId) : null;
|
|
896525
|
+
if (!setting) {
|
|
896526
|
+
this.localEditor = { ...editor, message: "Unknown setting; cannot save." };
|
|
896527
|
+
this.status = "Unknown setting; cannot save.";
|
|
896528
|
+
requestRender?.();
|
|
896529
|
+
return;
|
|
896530
|
+
}
|
|
896531
|
+
const value = this.editorField("value");
|
|
896532
|
+
this.localEditor = null;
|
|
896533
|
+
this.applySettingValue(setting, value, requestRender);
|
|
896534
|
+
return;
|
|
896535
|
+
}
|
|
896063
896536
|
if (editor.kind === "memory") {
|
|
896064
896537
|
if (editor.mode === "delete") {
|
|
896065
896538
|
try {
|
|
@@ -897658,7 +898131,7 @@ function handleProfilePickerToken(state4, token) {
|
|
|
897658
898131
|
}
|
|
897659
898132
|
|
|
897660
898133
|
// src/input/handler-picker-routes.ts
|
|
897661
|
-
import { readFileSync as
|
|
898134
|
+
import { readFileSync as readFileSync95 } from "fs";
|
|
897662
898135
|
|
|
897663
898136
|
// src/renderer/model-picker-overlay.ts
|
|
897664
898137
|
var MODEL_PICKER_CHROME_LINES = 7;
|
|
@@ -897950,7 +898423,7 @@ function handleFilePickerToken(state4, token) {
|
|
|
897950
898423
|
throw new Error("working directory is unavailable");
|
|
897951
898424
|
}
|
|
897952
898425
|
const resolvedPath3 = resolveAndValidatePath(selected, projectRoot);
|
|
897953
|
-
const data =
|
|
898426
|
+
const data = readFileSync95(resolvedPath3);
|
|
897954
898427
|
const base644 = data.toString("base64");
|
|
897955
898428
|
const mediaType = state4.mediaTypeFromExt(ext);
|
|
897956
898429
|
const filename = selected.split("/").pop() ?? selected;
|
|
@@ -902284,15 +902757,6 @@ function handleBlockingShellInput(options) {
|
|
|
902284
902757
|
}
|
|
902285
902758
|
|
|
902286
902759
|
// src/renderer/agent-workspace-style.ts
|
|
902287
|
-
function safetyColor(action2) {
|
|
902288
|
-
if (action2.safety === "safe")
|
|
902289
|
-
return FULLSCREEN_PALETTE.good;
|
|
902290
|
-
if (action2.safety === "read-only")
|
|
902291
|
-
return FULLSCREEN_PALETTE.info;
|
|
902292
|
-
if (action2.safety === "delegates")
|
|
902293
|
-
return FULLSCREEN_PALETTE.warn;
|
|
902294
|
-
return FULLSCREEN_PALETTE.bad;
|
|
902295
|
-
}
|
|
902296
902760
|
function actionResultColor(result2) {
|
|
902297
902761
|
if (result2.kind === "blocked" || result2.kind === "error")
|
|
902298
902762
|
return FULLSCREEN_PALETTE.bad;
|
|
@@ -902352,6 +902816,10 @@ function actionCommand(action2) {
|
|
|
902352
902816
|
return action2.targetCategoryId ? `open ${action2.targetCategoryId}` : "(workspace)";
|
|
902353
902817
|
if (action2.kind === "editor")
|
|
902354
902818
|
return action2.editorKind ? `edit ${action2.editorKind}` : "(editor)";
|
|
902819
|
+
if (action2.kind === "setting")
|
|
902820
|
+
return action2.settingKey ? `set ${action2.settingKey}` : "set setting";
|
|
902821
|
+
if (action2.kind === "settings-import")
|
|
902822
|
+
return "import GoodVibes settings";
|
|
902355
902823
|
if (action2.kind === "local-selection")
|
|
902356
902824
|
return action2.selectionDelta && action2.selectionDelta < 0 ? "select previous" : "select next";
|
|
902357
902825
|
if (action2.kind === "local-operation")
|
|
@@ -902379,8 +902847,8 @@ function compactText3(text, maxWidth = 104) {
|
|
|
902379
902847
|
}
|
|
902380
902848
|
function actionMetaLine(action2) {
|
|
902381
902849
|
return {
|
|
902382
|
-
text:
|
|
902383
|
-
fg: action2.kind === "command" ? FULLSCREEN_PALETTE.info :
|
|
902850
|
+
text: `Does: ${actionCommand(action2)}`,
|
|
902851
|
+
fg: action2.safety === "blocked" ? FULLSCREEN_PALETTE.warn : action2.kind === "command" ? FULLSCREEN_PALETTE.info : FULLSCREEN_PALETTE.muted
|
|
902384
902852
|
};
|
|
902385
902853
|
}
|
|
902386
902854
|
function setupAttentionItems(snapshot2, limit3) {
|
|
@@ -902401,7 +902869,7 @@ function setupOverviewLines(snapshot2) {
|
|
|
902401
902869
|
const counts = setupCounts(snapshot2);
|
|
902402
902870
|
const nextItems = setupAttentionItems(snapshot2, 3);
|
|
902403
902871
|
const lines = [
|
|
902404
|
-
{ text: "
|
|
902872
|
+
{ text: "Onboarding", fg: FULLSCREEN_PALETTE.title, bold: true },
|
|
902405
902873
|
{ text: `${counts.ready}/${snapshot2.setupChecklist.length} ready; ${counts.recommended} recommended; ${counts.optional} optional; ${counts.blocked} blocked.`, fg: counts.blocked > 0 ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.info },
|
|
902406
902874
|
{ text: `Chat: ${snapshot2.provider} / ${snapshot2.modelDisplayName}.`, fg: FULLSCREEN_PALETTE.info },
|
|
902407
902875
|
{ text: `Local: ${snapshot2.localPersonaCount} personas, ${snapshot2.localSkillCount} skills, ${snapshot2.localRoutineCount} routines, ${snapshot2.localMemoryCount} memories.`, fg: FULLSCREEN_PALETTE.info }
|
|
@@ -902549,7 +903017,7 @@ function snapshotLines(workspace, category, snapshot2) {
|
|
|
902549
903017
|
const needsTarget = snapshot2.channels.filter((channel) => channel.setupState === "needs-target");
|
|
902550
903018
|
const needsConfig = snapshot2.channels.filter((channel) => channel.setupState === "needs-config");
|
|
902551
903019
|
const nextAttentionChannel = needsConfig[0] ?? needsTarget[0] ?? snapshot2.channels.find((channel) => !channel.enabled);
|
|
902552
|
-
base2.push({ text: `API: ${snapshot2.runtimeBaseUrl}`, fg: FULLSCREEN_PALETTE.info }, companionAccessLine(snapshot2), { text: `Channels: ${readyCount}/${snapshot2.channels.length} ready; ${enabledCount} enabled; ${configuredDefaults} target(s).`, fg: FULLSCREEN_PALETTE.info }, { text: `Next: ${nextAttentionChannel ? `${nextAttentionChannel.label} - ${compactText3(nextAttentionChannel.nextStep)}` : "All enabled channels ready."}`, fg: nextAttentionChannel ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.good }, { text: "
|
|
903020
|
+
base2.push({ text: `API: ${snapshot2.runtimeBaseUrl}`, fg: FULLSCREEN_PALETTE.info }, companionAccessLine(snapshot2), { text: `Channels: ${readyCount}/${snapshot2.channels.length} ready; ${enabledCount} enabled; ${configuredDefaults} target(s).`, fg: FULLSCREEN_PALETTE.info }, { text: `Next: ${nextAttentionChannel ? `${nextAttentionChannel.label} - ${compactText3(nextAttentionChannel.nextStep)}` : "All enabled channels ready."}`, fg: nextAttentionChannel ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.good }, { text: "Secrets hidden; sends require explicit action.", fg: FULLSCREEN_PALETTE.warn });
|
|
902553
903021
|
} else if (category.id === "knowledge") {
|
|
902554
903022
|
base2.push({ text: `Route: ${snapshot2.knowledgeRoute}; isolation ${snapshot2.knowledgeIsolation}.`, fg: FULLSCREEN_PALETTE.info }, { text: "Ask/search, ingest, review, reindex, and reports stay Agent-owned.", fg: FULLSCREEN_PALETTE.good }, { text: "Ingest requires explicit confirmation.", fg: FULLSCREEN_PALETTE.warn });
|
|
902555
903023
|
} else if (category.id === "research") {
|
|
@@ -902692,9 +903160,8 @@ function buildActionRows(workspace, width, height) {
|
|
|
902692
903160
|
if (workspace.localEditor)
|
|
902693
903161
|
return buildEditorRows(workspace.localEditor, width, height);
|
|
902694
903162
|
const rows = [];
|
|
902695
|
-
const labelWidth = Math.min(
|
|
902696
|
-
const
|
|
902697
|
-
const commandWidth = Math.max(10, width - labelWidth - safetyWidth - 9);
|
|
903163
|
+
const labelWidth = Math.min(34, Math.max(18, Math.floor(width * 0.38)));
|
|
903164
|
+
const commandWidth = Math.max(10, width - labelWidth - 6);
|
|
902698
903165
|
if (workspace.actionSearchActive) {
|
|
902699
903166
|
rows.push({
|
|
902700
903167
|
text: ` Search: ${workspace.actionSearchQuery || "(type to filter actions)"}`,
|
|
@@ -902703,7 +903170,7 @@ function buildActionRows(workspace, width, height) {
|
|
|
902703
903170
|
});
|
|
902704
903171
|
}
|
|
902705
903172
|
rows.push({
|
|
902706
|
-
text: ` ${padDisplay(workspace.actionSearchActive ? "Result" : "Action", labelWidth)} ${padDisplay("
|
|
903173
|
+
text: ` ${padDisplay(workspace.actionSearchActive ? "Result" : "Action", labelWidth)} ${padDisplay("Does", commandWidth)}`,
|
|
902707
903174
|
fg: FULLSCREEN_PALETTE.muted,
|
|
902708
903175
|
bold: true
|
|
902709
903176
|
});
|
|
@@ -902719,9 +903186,9 @@ function buildActionRows(workspace, width, height) {
|
|
|
902719
903186
|
const label = searchResult ? `${searchResult.category.label} / ${action2.label}` : action2.label;
|
|
902720
903187
|
const marker = selected ? GLYPHS.navigation.selected : " ";
|
|
902721
903188
|
rows.push({
|
|
902722
|
-
text: `${marker} ${padDisplay(label, labelWidth)} ${padDisplay(
|
|
903189
|
+
text: `${marker} ${padDisplay(label, labelWidth)} ${padDisplay(actionCommand(action2), commandWidth)}`,
|
|
902723
903190
|
selected: selected && workspace.focusPane === "actions",
|
|
902724
|
-
fg:
|
|
903191
|
+
fg: action2.safety === "blocked" ? FULLSCREEN_PALETTE.warn : selected ? FULLSCREEN_PALETTE.text : FULLSCREEN_PALETTE.info,
|
|
902725
903192
|
bold: selected
|
|
902726
903193
|
});
|
|
902727
903194
|
}
|
|
@@ -902770,7 +903237,7 @@ function renderAgentWorkspace(workspace, width, height) {
|
|
|
902770
903237
|
title: "GoodVibes Agent / Operator Workspace",
|
|
902771
903238
|
stateLabel: workspace.localEditor ? "Editor" : workspace.actionSearchActive ? "Search" : workspace.focusPane === "categories" ? "Categories" : "Actions",
|
|
902772
903239
|
leftHeader: "Operator Areas",
|
|
902773
|
-
mainHeader: workspace.actionSearchActive ? `Search actions \xB7 ${workspace.actions.length} result(s)` : `${category.label} \xB7 ${
|
|
903240
|
+
mainHeader: workspace.actionSearchActive ? `Search actions \xB7 ${workspace.actions.length} result(s)` : `${category.label} \xB7 ${workspace.actions.length} action(s)`,
|
|
902774
903241
|
leftRows: buildLeftRows2(workspace, metrics.bodyRows),
|
|
902775
903242
|
contextRows: buildContextRows(workspace, category, action2, metrics.contextWidth),
|
|
902776
903243
|
controlRows: buildActionRows(workspace, metrics.contextWidth, metrics.controlRows),
|
|
@@ -903197,7 +903664,7 @@ function wireShellUiOpeners(options) {
|
|
|
903197
903664
|
}
|
|
903198
903665
|
|
|
903199
903666
|
// src/cli/entrypoint.ts
|
|
903200
|
-
import { existsSync as
|
|
903667
|
+
import { existsSync as existsSync88 } from "fs";
|
|
903201
903668
|
import { join as join98 } from "path";
|
|
903202
903669
|
// src/cli/status.ts
|
|
903203
903670
|
function yesNo3(value) {
|
|
@@ -903805,9 +904272,9 @@ async function prepareShellCliRuntime(argv, roots, binary2 = "goodvibes-agent")
|
|
|
903805
904272
|
onboardingMarkers,
|
|
903806
904273
|
auth: {
|
|
903807
904274
|
userStorePath,
|
|
903808
|
-
userStorePresent:
|
|
904275
|
+
userStorePresent: existsSync88(userStorePath),
|
|
903809
904276
|
bootstrapCredentialPath,
|
|
903810
|
-
bootstrapCredentialPresent:
|
|
904277
|
+
bootstrapCredentialPresent: existsSync88(bootstrapCredentialPath),
|
|
903811
904278
|
operatorTokenPath: effectiveOperatorTokenPath,
|
|
903812
904279
|
operatorTokenPresent: externalRuntime.operatorToken.present
|
|
903813
904280
|
},
|