@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.
@@ -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.3";
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 safe or read-only command to the shell-owned command router.",
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: "Setup checklist", detail: "Jump to the first-run checklist for provider, knowledge, personas, skills, routines, memory, channels, and voice/media.", targetCategoryId: "setup", kind: "workspace", safety: "safe" },
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: "START",
890490
- label: "Setup",
890491
- summary: "Configuration, auth, provider, and onboarding workspaces.",
890492
- detail: "Use this to configure the assistant: provider/model, setup checklist, Agent Knowledge, local behavior, channels, and voice/media. Changes here stay Agent-owned.",
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: "config", label: "Open settings", detail: "Open the fullscreen Agent settings workspace.", command: "/config", kind: "command", safety: "safe" },
890495
- { id: "setup", label: "Setup workspace", detail: "Review Agent setup in this fullscreen workspace.", kind: "guidance", safety: "safe" },
890496
- { id: "setup-provider-model", label: "Provider and model", detail: "Choose the provider/model route for normal assistant chat.", command: "/model", kind: "command", safety: "safe" },
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-bundle-export", label: "Export subscription bundle", detail: "Open a confirmed form that exports a redacted provider subscription bundle for setup review.", editorKind: "subscription-bundle-export", kind: "editor", safety: "safe" },
890538
- { id: "subscription-bundle-inspect", label: "Inspect subscription bundle", detail: "Open a form that inspects a provider subscription bundle before setup review.", editorKind: "subscription-bundle-inspect", kind: "editor", safety: "read-only" },
890539
- { id: "auth", label: "Auth review", detail: "Review authentication posture without printing token values.", command: "/auth review", kind: "command", safety: "read-only" },
890540
- { id: "auth-show", label: "Inspect provider auth", detail: "Open a provider-id form for read-only provider auth inspection.", editorKind: "auth-show", kind: "editor", safety: "read-only" },
890541
- { id: "auth-repair", label: "Auth repair guidance", detail: "Open a provider-id form that shows auth repair guidance without storing tokens or starting login.", editorKind: "auth-repair", kind: "editor", safety: "read-only" },
890542
- { id: "auth-bundle-export", label: "Export auth bundle", detail: "Open a confirmed form that exports a redacted auth review bundle.", editorKind: "auth-bundle-export", kind: "editor", safety: "safe" },
890543
- { id: "auth-bundle-inspect", label: "Inspect auth bundle", detail: "Open a form that inspects an auth review bundle before setup review.", editorKind: "auth-bundle-inspect", kind: "editor", safety: "read-only" }
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: "Support bundle", detail: "Open support bundle export, inspect, and import actions for host-facing setup review.", targetCategoryId: "setup", kind: "workspace", safety: "safe" },
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(500, Math.trunc(parsed)));
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, 500);
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 (categoryId && !this.selectCategory(categoryId)) {
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
- return this.actionSearchActive ? searchAgentWorkspaceActions(this.categories, this.actionSearchQuery) : [];
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 readFileSync94 } from "fs";
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 = readFileSync94(resolvedPath3);
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: `${actionCommand(action2)}; ${action2.safety}`,
902383
- fg: action2.kind === "command" ? FULLSCREEN_PALETTE.info : safetyColor(action2)
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: "Setup Overview", fg: FULLSCREEN_PALETTE.title, bold: true },
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: "Safety: secrets hidden; sends require explicit action.", fg: FULLSCREEN_PALETTE.warn });
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(28, Math.max(16, Math.floor(width * 0.3)));
902696
- const safetyWidth = 10;
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("Safety", safetyWidth)} ${padDisplay("Command", commandWidth)}`,
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(action2.safety, safetyWidth)} ${padDisplay(actionCommand(action2), commandWidth)}`,
903189
+ text: `${marker} ${padDisplay(label, labelWidth)} ${padDisplay(actionCommand(action2), commandWidth)}`,
902723
903190
  selected: selected && workspace.focusPane === "actions",
902724
- fg: safetyColor(action2),
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 ${category.actions.length} action(s)`,
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 existsSync87 } from "fs";
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: existsSync87(userStorePath),
904275
+ userStorePresent: existsSync88(userStorePath),
903809
904276
  bootstrapCredentialPath,
903810
- bootstrapCredentialPresent: existsSync87(bootstrapCredentialPath),
904277
+ bootstrapCredentialPresent: existsSync88(bootstrapCredentialPath),
903811
904278
  operatorTokenPath: effectiveOperatorTokenPath,
903812
904279
  operatorTokenPresent: externalRuntime.operatorToken.present
903813
904280
  },