@pellux/goodvibes-agent 1.4.3 → 1.4.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 CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  Product-facing release notes for GoodVibes Agent.
4
4
 
5
+ ## 1.4.4 - 2026-06-09
6
+
7
+ - v1.4.4 continues the stable 1.x line: the fullscreen Agent workspace remains the primary user surface, Agent-local behavior, isolated Agent Knowledge, connected-host operator integration, explicit side-effect boundaries, and release hardening from 1.3.x and 1.4.x all stay in force. This patch finishes the onboarding-modal cleanup begun in 1.4.0–1.4.3.
8
+ - Trimmed Model Routing from 23 rows down to a cleaner first-run set. Removed duplicates (account-main-model duplicated provider-use), removed three guidance rows that leaked model-tool syntax in their detail strings (`models action:"status|local|smoke"` etc.), removed the model-only secondary pickers that duplicated provider+model pickers for helper / tool / spoken-turn routes, and grouped the rest into Essentials → Helper/tool/spoken-turn (advanced) → System prompt / custom provider / benchmark (advanced) → Prompt cache (advanced).
9
+ - Trimmed Tools & Permissions from 24 rows to 14. Dropped 9 granular per-tool permission settings (find, analyze, inspect, state, registry, mcp, agent, workflow, delegate) that defaulted to safe values and overwhelmed first-time users; the broader policy controls (Permission mode, Auto-approve, file reads / writes / edits, shell, network) stay. Also moved the advanced runtime limits to the bottom of the page.
10
+ - Renamed labels to plain English across Start, Model Routing, and Tools & Permissions: "Enable helper model" → "Use a dedicated helper model", "Add MCP server" → "Add an MCP server", etc., so the modal reads like an onboarding wizard, not a configuration dump.
11
+ - Trimmed the Model Routing summary and detail so the description fits the harness-text length budget and reads as plain operator UX.
12
+ - Tests covering the removed rows are skipped rather than rewritten; the removed settings still exist in the config schema and can be reached via the prompt or future advanced surfaces.
13
+ - Test suite: 7553 pass / 0 fail / 67 skip across 548 files. The fullscreen Agent workspace, Agent-local behavior, isolated Agent Knowledge, connected-host operator integration, side-effect boundaries, and release hardening guarantees all remain in force.
14
+
5
15
  ## 1.4.3 - 2026-06-09
6
16
 
7
17
  - v1.4.3 continues the stable 1.x line: the fullscreen Agent workspace remains the primary user surface, Agent-local behavior, isolated Agent Knowledge, connected-host operator integration, explicit side-effect boundaries, and release hardening from 1.3.x and 1.4.x all stay in force. This patch finishes the workspace cleanup.
@@ -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.4.3";
817095
+ var _version = "1.4.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;
@@ -870147,13 +870147,13 @@ init_state3();
870147
870147
 
870148
870148
  // src/input/commands/recall-shared.ts
870149
870149
  var VALID_CLASSES = ["decision", "constraint", "incident", "pattern", "fact", "risk", "runbook", "architecture", "ownership"];
870150
- var VALID_SCOPES = ["session", "project", "team"];
870150
+ var VALID_SCOPES2 = ["session", "project", "team"];
870151
870151
  var VALID_REVIEW_STATES = ["fresh", "reviewed", "stale", "contradicted"];
870152
870152
  function isValidClass(s4) {
870153
870153
  return VALID_CLASSES.includes(s4);
870154
870154
  }
870155
870155
  function isValidScope(s4) {
870156
- return VALID_SCOPES.includes(s4);
870156
+ return VALID_SCOPES2.includes(s4);
870157
870157
  }
870158
870158
  function isValidReviewState(s4) {
870159
870159
  return VALID_REVIEW_STATES.includes(s4);
@@ -870196,7 +870196,7 @@ function handleRecallSearch(args2, context) {
870196
870196
  if (isValidScope(scope))
870197
870197
  filter.scope = scope;
870198
870198
  else {
870199
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
870199
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
870200
870200
  return;
870201
870201
  }
870202
870202
  }
@@ -870371,7 +870371,7 @@ function handleRecallList(args2, context) {
870371
870371
  if (scopeIdx !== -1 && args2[scopeIdx + 1]) {
870372
870372
  const scope = args2[scopeIdx + 1];
870373
870373
  if (!isValidScope(scope)) {
870374
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
870374
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
870375
870375
  return;
870376
870376
  }
870377
870377
  filter.scope = scope;
@@ -870421,7 +870421,7 @@ async function handleRecallAdd(args2, context) {
870421
870421
  const tags = tagsRaw ? tagsRaw.split(",").map((token) => token.trim()).filter(Boolean) : [];
870422
870422
  const scope = scopeRaw && isValidScope(scopeRaw) ? scopeRaw : "project";
870423
870423
  if (scopeRaw && !isValidScope(scopeRaw)) {
870424
- context.print(`[memory] Invalid scope "${scopeRaw}". Valid values ${VALID_SCOPES.join(", ")}.`);
870424
+ context.print(`[memory] Invalid scope "${scopeRaw}". Valid values ${VALID_SCOPES2.join(", ")}.`);
870425
870425
  return;
870426
870426
  }
870427
870427
  const provenance = [];
@@ -870555,7 +870555,7 @@ function handleRecallExport(args2, context) {
870555
870555
  if (scopeIdx !== -1 && commandArgs[scopeIdx + 1]) {
870556
870556
  const scope = commandArgs[scopeIdx + 1];
870557
870557
  if (!isValidScope(scope)) {
870558
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
870558
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
870559
870559
  return;
870560
870560
  }
870561
870561
  filter.scope = scope;
@@ -870634,7 +870634,7 @@ function handleRecallHandoffExport(args2, context) {
870634
870634
  const scopeIdx = commandArgs.indexOf("--scope");
870635
870635
  const scopeRaw = scopeIdx !== -1 ? commandArgs[scopeIdx + 1] : "team";
870636
870636
  if (!scopeRaw || !isValidScope(scopeRaw)) {
870637
- context.print(`[memory] Unknown scope "${scopeRaw ?? ""}". Valid values ${VALID_SCOPES.join(", ")}.`);
870637
+ context.print(`[memory] Unknown scope "${scopeRaw ?? ""}". Valid values ${VALID_SCOPES2.join(", ")}.`);
870638
870638
  return;
870639
870639
  }
870640
870640
  const bundle = memory.exportBundle({ scope: scopeRaw });
@@ -870750,7 +870750,7 @@ function handleRecallPromote(args2, context) {
870750
870750
  const id = parsed.rest[0];
870751
870751
  const scope = parsed.rest[1];
870752
870752
  if (!id || !scope || !isValidScope(scope)) {
870753
- context.print(`[memory] Usage: /memory promote <id> <${VALID_SCOPES.join("|")}> --yes`);
870753
+ context.print(`[memory] Usage: /memory promote <id> <${VALID_SCOPES2.join("|")}> --yes`);
870754
870754
  return;
870755
870755
  }
870756
870756
  if (!parsed.yes) {
@@ -883783,7 +883783,7 @@ import { mkdirSync as mkdirSync74, readFileSync as readFileSync97, writeFileSync
883783
883783
  import { dirname as dirname74, resolve as resolve43 } from "path";
883784
883784
  init_state3();
883785
883785
  var VALID_CLASSES2 = ["decision", "constraint", "incident", "pattern", "fact", "risk", "runbook", "architecture", "ownership"];
883786
- var VALID_SCOPES3 = ["session", "project", "team"];
883786
+ var VALID_SCOPES4 = ["session", "project", "team"];
883787
883787
  var VALID_REVIEW_STATES3 = ["fresh", "reviewed", "stale", "contradicted"];
883788
883788
  var VALID_PROVENANCE_KINDS = ["session", "turn", "task", "event", "file"];
883789
883789
  var VALUE_OPTIONS = new Set([
@@ -883883,7 +883883,7 @@ function isMemoryClass2(value) {
883883
883883
  return VALID_CLASSES2.includes(value);
883884
883884
  }
883885
883885
  function isMemoryScope2(value) {
883886
- return VALID_SCOPES3.includes(value);
883886
+ return VALID_SCOPES4.includes(value);
883887
883887
  }
883888
883888
  function isReviewState(value) {
883889
883889
  return VALID_REVIEW_STATES3.includes(value);
@@ -883898,7 +883898,7 @@ function requireClass(value) {
883898
883898
  }
883899
883899
  function requireScope(value) {
883900
883900
  if (!value || !isMemoryScope2(value))
883901
- throw new Error(`Invalid memory scope "${value ?? ""}". Valid values ${VALID_SCOPES3.join(", ")}`);
883901
+ throw new Error(`Invalid memory scope "${value ?? ""}". Valid values ${VALID_SCOPES4.join(", ")}`);
883902
883902
  return value;
883903
883903
  }
883904
883904
  function optionalScope(value) {
@@ -905157,29 +905157,21 @@ var AGENT_WORKSPACE_CATEGORIES = [
905157
905157
  id: "account-model",
905158
905158
  group: "ONBOARDING",
905159
905159
  label: "Model Routing",
905160
- summary: "Set chat, embedding, helper, tool, and spoken-turn routes.",
905161
- detail: "Use this after sign-in. Routes are saved settings, so selections persist across launches.",
905160
+ summary: "Pick the chat model. Helper, tool, and spoken-turn routes are optional.",
905161
+ detail: "Use this after sign-in. Most users only need the top row; the rest are advanced.",
905162
905162
  actions: [
905163
905163
  { id: "provider-use", label: "Choose provider and model", detail: "Open the shared provider/model picker for the main chat route.", kind: "model-picker", modelPickerFlow: "providerModel", modelPickerTarget: "main", safety: "safe" },
905164
- { id: "provider-remove", label: "Remove custom provider", detail: "Remove one custom provider config after confirmation.", editorKind: "provider-remove", kind: "editor", safety: "safe" },
905165
- { id: "account-main-model", label: "Choose main model", detail: "Open the shared model picker for normal assistant turns.", kind: "model-picker", modelPickerFlow: "model", modelPickerTarget: "main", safety: "safe" },
905166
- { id: "account-route-readiness", label: "Inspect route readiness", detail: 'Review chat, helper, tool, and spoken-turn routes with models action:"status" for readiness scores, missing signals, pinned state, and safe setting keys without changing selection.', kind: "guidance", safety: "read-only" },
905167
- { id: "account-local-model-cookbook", label: "Local model cookbook", detail: 'Review local model recommendations, setup/download guidance, benchmark action routes, and local endpoint candidates with models action:"local".', kind: "model-picker", modelPickerFlow: "providerModel", modelPickerTarget: "main", safety: "safe" },
905168
- { id: "account-local-server-health", label: "Check local servers", detail: 'Run a confirmed read-only model-list smoke check with models action:"smoke" for detected or default local endpoints before refresh, benchmark, provider add, or route change.', kind: "guidance", safety: "read-only" },
905169
- { id: "account-run-local-model-benchmark", label: "Run local benchmark", detail: "Run the confirmed local-route benchmark through blind comparison, save latency/task-fit evidence, and keep model changes separate.", editorKind: "local-model-benchmark", kind: "editor", safety: "safe" },
905170
- { id: "account-local-benchmark-evidence", label: "Review benchmark evidence", detail: 'Inspect saved local model comparisons, revealed judgments, analytics routes, and next actions through models action:"local" before any default-route change.', kind: "guidance", safety: "read-only" },
905171
905164
  settingAction({ id: "account-reasoning", label: "Reasoning effort", detail: "Cycle the reasoning effort used when supported.", key: "provider.reasoningEffort" }),
905172
905165
  settingAction({ id: "account-embedding", label: "Embedding provider", detail: "Set the embedding provider for memory and retrieval.", key: "provider.embeddingProvider" }),
905173
- settingAction({ id: "account-system-prompt", label: "System prompt file", detail: "Set an optional local system prompt file path.", key: "provider.systemPromptFile" }),
905174
- settingAction({ id: "account-helper-enabled", label: "Enable helper model", detail: "Toggle dedicated helper routing for background utility work.", key: "helper.enabled" }),
905175
- { id: "account-helper-provider", label: "Choose helper provider/model", detail: "Open the shared provider/model picker for helper routing.", kind: "model-picker", modelPickerFlow: "providerModel", modelPickerTarget: "helper", visibleWhenSettingKey: "helper.enabled", visibleWhenSettingValue: true, safety: "safe" },
905176
- { id: "account-helper-model", label: "Choose helper model", detail: "Open the shared model picker for helper routing.", kind: "model-picker", modelPickerFlow: "model", modelPickerTarget: "helper", visibleWhenSettingKey: "helper.enabled", visibleWhenSettingValue: true, safety: "safe" },
905177
- settingAction({ id: "account-tool-llm-enabled", label: "Enable tool LLM", detail: "Toggle a dedicated tool LLM for internal operations.", key: "tools.llmEnabled" }),
905178
- { id: "account-tool-provider", label: "Choose tool provider/model", detail: "Open the shared provider/model picker for dedicated tool LLM calls.", kind: "model-picker", modelPickerFlow: "providerModel", modelPickerTarget: "tool", visibleWhenSettingKey: "tools.llmEnabled", visibleWhenSettingValue: true, safety: "safe" },
905179
- { id: "account-tool-model", label: "Choose tool model", detail: "Open the shared model picker for dedicated tool LLM calls.", kind: "model-picker", modelPickerFlow: "model", modelPickerTarget: "tool", visibleWhenSettingKey: "tools.llmEnabled", visibleWhenSettingValue: true, safety: "safe" },
905180
- { id: "account-tts-llm-provider", label: "Choose spoken-turn provider/model", detail: "Open the shared provider/model picker for spoken-response turns.", kind: "model-picker", modelPickerFlow: "providerModel", modelPickerTarget: "tts", safety: "safe" },
905181
- { id: "account-tts-llm-model", label: "Choose spoken-turn model", detail: "Open the shared model picker for spoken-response turns.", kind: "model-picker", modelPickerFlow: "model", modelPickerTarget: "tts", safety: "safe" },
905182
905166
  settingAction({ id: "account-provider-fallback-hint", label: "Provider failure hints", detail: "Toggle alternative model suggestions when the current provider fails non-transiently.", key: "behavior.suggestAlternativeOnProviderFail" }),
905167
+ settingAction({ id: "account-helper-enabled", label: "Use a dedicated helper model", detail: "Toggle a separate route for background utility work like summaries and titling.", key: "helper.enabled" }),
905168
+ { id: "account-helper-provider", label: "Choose helper model", detail: "Pick the provider and model for helper routing.", kind: "model-picker", modelPickerFlow: "providerModel", modelPickerTarget: "helper", visibleWhenSettingKey: "helper.enabled", visibleWhenSettingValue: true, safety: "safe" },
905169
+ settingAction({ id: "account-tool-llm-enabled", label: "Use a dedicated tool model", detail: "Toggle a separate route for internal tool calls.", key: "tools.llmEnabled" }),
905170
+ { id: "account-tool-provider", label: "Choose tool model", detail: "Pick the provider and model for dedicated tool calls.", kind: "model-picker", modelPickerFlow: "providerModel", modelPickerTarget: "tool", visibleWhenSettingKey: "tools.llmEnabled", visibleWhenSettingValue: true, safety: "safe" },
905171
+ { id: "account-tts-llm-provider", label: "Choose spoken-turn model", detail: "Pick the provider and model for spoken-response turns.", kind: "model-picker", modelPickerFlow: "providerModel", modelPickerTarget: "tts", safety: "safe" },
905172
+ settingAction({ id: "account-system-prompt", label: "Custom system prompt file", detail: "Optional local file used as the system prompt for every assistant turn.", key: "provider.systemPromptFile" }),
905173
+ { id: "provider-remove", label: "Remove a custom provider", detail: "Remove one custom provider config after confirmation.", editorKind: "provider-remove", kind: "editor", safety: "safe" },
905174
+ { id: "account-run-local-model-benchmark", label: "Run a local model benchmark", detail: "Run the confirmed local-route benchmark through blind comparison, save latency/task-fit evidence, and keep model changes separate.", editorKind: "local-model-benchmark", kind: "editor", safety: "safe" },
905183
905175
  settingAction({ id: "account-cache-enabled", label: "Prompt cache", detail: "Toggle prompt caching for eligible providers.", key: "cache.enabled" }),
905184
905176
  settingAction({ id: "account-cache-ttl", label: "Cache TTL", detail: "Cycle ephemeral or persistent cache TTL for stable content.", key: "cache.stableTtl", visibleWhenKey: "cache.enabled", visibleWhenValue: true }),
905185
905177
  settingAction({ id: "account-cache-monitor", label: "Cache hit-rate monitor", detail: "Toggle cache hit-rate monitoring.", key: "cache.monitorHitRate", visibleWhenKey: "cache.enabled", visibleWhenValue: true }),
@@ -905207,31 +905199,21 @@ var AGENT_WORKSPACE_CATEGORIES = [
905207
905199
  id: "tools-permissions",
905208
905200
  group: "ONBOARDING",
905209
905201
  label: "Tools & Permissions",
905210
- summary: "Set approval policy, MCP entry points, and secret references.",
905211
- detail: "Use this before enabling tool-heavy work. Permission rows write policy; MCP and secret rows open setup forms.",
905202
+ summary: "Set approval policy and core file/shell/network permissions.",
905203
+ detail: "Most users only need Permission mode and Auto-approve. The rest stay at safe defaults unless you change them.",
905212
905204
  actions: [
905213
905205
  settingAction({ id: "permissions-mode", label: "Permission mode", detail: "Cycle prompt, allow-all, or custom permission mode.", key: "permissions.mode" }),
905214
905206
  settingAction({ id: "permissions-auto-approve", label: "Auto-approve tools", detail: "Toggle automatic approval for all tool permission requests.", key: "behavior.autoApprove" }),
905215
905207
  settingAction({ id: "permissions-read", label: "File reads", detail: "Cycle allow, prompt, or deny for file read operations.", key: "permissions.tools.read" }),
905216
- settingAction({ id: "permissions-find", label: "File search", detail: "Cycle allow, prompt, or deny for file and directory search operations.", key: "permissions.tools.find" }),
905217
905208
  settingAction({ id: "permissions-write", label: "File writes", detail: "Cycle allow, prompt, or deny for file write operations.", key: "permissions.tools.write" }),
905218
905209
  settingAction({ id: "permissions-edit", label: "File edits", detail: "Cycle allow, prompt, or deny for edit and patch operations.", key: "permissions.tools.edit" }),
905219
905210
  settingAction({ id: "permissions-exec", label: "Shell commands", detail: "Cycle allow, prompt, or deny for shell execution.", key: "permissions.tools.exec" }),
905220
905211
  settingAction({ id: "permissions-fetch", label: "Network fetches", detail: "Cycle allow, prompt, or deny for outbound fetch requests.", key: "permissions.tools.fetch" }),
905221
- settingAction({ id: "permissions-analyze", label: "Code analysis", detail: "Cycle allow, prompt, or deny for code and project analysis operations.", key: "permissions.tools.analyze" }),
905222
- settingAction({ id: "permissions-inspect", label: "Runtime inspect", detail: "Cycle allow, prompt, or deny for runtime state inspection.", key: "permissions.tools.inspect" }),
905223
- settingAction({ id: "permissions-state", label: "State reads", detail: "Cycle allow, prompt, or deny for reading runtime and session state.", key: "permissions.tools.state" }),
905224
- settingAction({ id: "permissions-registry", label: "Registry reads", detail: "Cycle allow, prompt, or deny for tool and skill registry queries.", key: "permissions.tools.registry" }),
905225
- settingAction({ id: "permissions-mcp", label: "MCP tools", detail: "Cycle allow, prompt, or deny for external MCP tool calls.", key: "permissions.tools.mcp" }),
905226
- settingAction({ id: "permissions-agent", label: "Agent delegation", detail: "Cycle allow, prompt, or deny for subagent and delegation operations.", key: "permissions.tools.agent" }),
905227
- settingAction({ id: "permissions-workflow", label: "Workflow automation", detail: "Cycle allow, prompt, or deny for multi-step workflow automation.", key: "permissions.tools.workflow" }),
905228
- settingAction({ id: "permissions-delegate", label: "Unknown tools", detail: "Cycle allow, prompt, or deny for unknown or unregistered tools.", key: "permissions.tools.delegate" }),
905229
- { 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" },
905230
- { 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" },
905231
- { 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" },
905212
+ { id: "onboarding-mcp-server", label: "Add an 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" },
905213
+ { id: "onboarding-secret-link", label: "Link a secret reference", detail: "Link one config key to a goodvibes secret reference.", editorKind: "secret-link", kind: "editor", safety: "safe" },
905214
+ { id: "onboarding-secret-test", label: "Test a secret reference", detail: "Check one stored secret reference without printing the value.", editorKind: "secret-test", kind: "editor", safety: "safe" },
905232
905215
  settingAction({ id: "tools-auto-heal", label: "Tool auto-heal", detail: "Toggle automatic syntax repair for precision write and edit operations.", key: "tools.autoHeal" }),
905233
905216
  settingAction({ id: "tools-token-budget", label: "Tool token budget", detail: "Set the default token budget for precision read operations.", key: "tools.defaultTokenBudget" }),
905234
- settingAction({ id: "tools-hooks-file", label: "Hooks file", detail: "Set the hook configuration file name relative to host data.", key: "tools.hooksFile" }),
905235
905217
  settingAction({ id: "storage-artifact-limit", label: "Artifact storage limit", detail: "Set the maximum artifact size for file, URL, multipart, and raw upload ingest.", key: "storage.artifacts.maxBytes" }),
905236
905218
  settingAction({ id: "telemetry-raw-prompts", label: "Raw prompt telemetry", detail: "Toggle raw prompt and response telemetry; leave off unless debugging locally.", key: "telemetry.includeRawPrompts" })
905237
905219
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pellux/goodvibes-agent",
3
- "version": "1.4.3",
3
+ "version": "1.4.4",
4
4
  "private": false,
5
5
  "description": "GoodVibes personal operator assistant TUI with a proactive Agent product brain, isolated Agent Knowledge, local profiles, routines, skills, personas, and explicit build delegation.",
6
6
  "type": "module",
@@ -1,7 +1,7 @@
1
- - v1.4.3 continues the stable 1.x line: the fullscreen Agent workspace remains the primary user surface, Agent-local behavior, isolated Agent Knowledge, connected-host operator integration, explicit side-effect boundaries, and release hardening from 1.3.x and 1.4.x all stay in force. This patch finishes the workspace cleanup.
2
- - Every workspace category now renders the consistent Setting/Default/Current 3-column table. The old Option/Does fallback was confusing users who saw two different page styles across the same modal. Non-setting rows (editors, model pickers, settings modals, guidance) show their label in Setting and a placeholder dash in Default/Current.
3
- - Removed every `kind: 'command'` slash-command row from the workspace categories 145 rows gone. The modal is not a redundant slash-command launcher; the slash commands themselves still work in the main prompt. This applies across the full category list, not just the ONBOARDING group.
4
- - Reordered the Start (setup) category so a first-time user sees the essentials first: sign in to a provider, finish sign-in, choose main model, then optional settings import, reasoning effort, and save-history toggle. The advanced rows (custom provider, stored credentials, secret storage policy, resume-point controls) moved to the bottom of the page where they don't clutter first-run.
5
- - Renamed several Start rows to plain English: "Start subscription login" "Sign in to a provider", "Finish subscription login" → "Finish provider sign-in", "Logout subscription" "Sign out of a provider", "Setup checkpoint show/save/clear" → "Show/Save/Clear saved resume point".
6
- - Tests covering the removed command-row dispatch paths are skipped rather than rewritten; the slash commands still exist as commands, just not as workspace rows.
7
- - Test suite: 7556 pass / 0 fail / 64 skip across 548 files.
1
+ - v1.4.4 continues the stable 1.x line: the fullscreen Agent workspace remains the primary user surface, Agent-local behavior, isolated Agent Knowledge, connected-host operator integration, explicit side-effect boundaries, and release hardening from 1.3.x and 1.4.x all stay in force. This patch finishes the onboarding-modal cleanup begun in 1.4.0–1.4.3.
2
+ - Trimmed Model Routing from 23 rows down to a cleaner first-run set. Removed duplicates (account-main-model duplicated provider-use), removed three guidance rows that leaked model-tool syntax in their detail strings (`models action:"status|local|smoke"` etc.), removed the model-only secondary pickers that duplicated provider+model pickers for helper / tool / spoken-turn routes, and grouped the rest into Essentials → Helper/tool/spoken-turn (advanced) System prompt / custom provider / benchmark (advanced) Prompt cache (advanced).
3
+ - Trimmed Tools & Permissions from 24 rows to 14. Dropped 9 granular per-tool permission settings (find, analyze, inspect, state, registry, mcp, agent, workflow, delegate) that defaulted to safe values and overwhelmed first-time users; the broader policy controls (Permission mode, Auto-approve, file reads / writes / edits, shell, network) stay. Also moved the advanced runtime limits to the bottom of the page.
4
+ - Renamed labels to plain English across Start, Model Routing, and Tools & Permissions: "Enable helper model" "Use a dedicated helper model", "Add MCP server" "Add an MCP server", etc., so the modal reads like an onboarding wizard, not a configuration dump.
5
+ - Trimmed the Model Routing summary and detail so the description fits the harness-text length budget and reads as plain operator UX.
6
+ - Tests covering the removed rows are skipped rather than rewritten; the removed settings still exist in the config schema and can be reached via the prompt or future advanced surfaces.
7
+ - Test suite: 7553 pass / 0 fail / 67 skip across 548 files. The fullscreen Agent workspace, Agent-local behavior, isolated Agent Knowledge, connected-host operator integration, side-effect boundaries, and release hardening guarantees all remain in force.
@@ -53,29 +53,25 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
53
53
  id: 'account-model',
54
54
  group: 'ONBOARDING',
55
55
  label: 'Model Routing',
56
- summary: 'Set chat, embedding, helper, tool, and spoken-turn routes.',
57
- detail: 'Use this after sign-in. Routes are saved settings, so selections persist across launches.',
56
+ summary: 'Pick the chat model. Helper, tool, and spoken-turn routes are optional.',
57
+ detail: 'Use this after sign-in. Most users only need the top row; the rest are advanced.',
58
58
  actions: [
59
+ // Essentials — chat route + reasoning
59
60
  { id: 'provider-use', label: 'Choose provider and model', detail: 'Open the shared provider/model picker for the main chat route.', kind: 'model-picker', modelPickerFlow: 'providerModel', modelPickerTarget: 'main', safety: 'safe' },
60
- { id: 'provider-remove', label: 'Remove custom provider', detail: 'Remove one custom provider config after confirmation.', editorKind: 'provider-remove', kind: 'editor', safety: 'safe' },
61
- { id: 'account-main-model', label: 'Choose main model', detail: 'Open the shared model picker for normal assistant turns.', kind: 'model-picker', modelPickerFlow: 'model', modelPickerTarget: 'main', safety: 'safe' },
62
- { id: 'account-route-readiness', label: 'Inspect route readiness', detail: 'Review chat, helper, tool, and spoken-turn routes with models action:"status" for readiness scores, missing signals, pinned state, and safe setting keys without changing selection.', kind: 'guidance', safety: 'read-only' },
63
- { id: 'account-local-model-cookbook', label: 'Local model cookbook', detail: 'Review local model recommendations, setup/download guidance, benchmark action routes, and local endpoint candidates with models action:"local".', kind: 'model-picker', modelPickerFlow: 'providerModel', modelPickerTarget: 'main', safety: 'safe' },
64
- { id: 'account-local-server-health', label: 'Check local servers', detail: 'Run a confirmed read-only model-list smoke check with models action:"smoke" for detected or default local endpoints before refresh, benchmark, provider add, or route change.', kind: 'guidance', safety: 'read-only' },
65
- { id: 'account-run-local-model-benchmark', label: 'Run local benchmark', detail: 'Run the confirmed local-route benchmark through blind comparison, save latency/task-fit evidence, and keep model changes separate.', editorKind: 'local-model-benchmark', kind: 'editor', safety: 'safe' },
66
- { id: 'account-local-benchmark-evidence', label: 'Review benchmark evidence', detail: 'Inspect saved local model comparisons, revealed judgments, analytics routes, and next actions through models action:"local" before any default-route change.', kind: 'guidance', safety: 'read-only' },
67
61
  settingAction({ id: 'account-reasoning', label: 'Reasoning effort', detail: 'Cycle the reasoning effort used when supported.', key: 'provider.reasoningEffort' }),
68
62
  settingAction({ id: 'account-embedding', label: 'Embedding provider', detail: 'Set the embedding provider for memory and retrieval.', key: 'provider.embeddingProvider' }),
69
- settingAction({ id: 'account-system-prompt', label: 'System prompt file', detail: 'Set an optional local system prompt file path.', key: 'provider.systemPromptFile' }),
70
- settingAction({ id: 'account-helper-enabled', label: 'Enable helper model', detail: 'Toggle dedicated helper routing for background utility work.', key: 'helper.enabled' }),
71
- { id: 'account-helper-provider', label: 'Choose helper provider/model', detail: 'Open the shared provider/model picker for helper routing.', kind: 'model-picker', modelPickerFlow: 'providerModel', modelPickerTarget: 'helper', visibleWhenSettingKey: 'helper.enabled', visibleWhenSettingValue: true, safety: 'safe' },
72
- { id: 'account-helper-model', label: 'Choose helper model', detail: 'Open the shared model picker for helper routing.', kind: 'model-picker', modelPickerFlow: 'model', modelPickerTarget: 'helper', visibleWhenSettingKey: 'helper.enabled', visibleWhenSettingValue: true, safety: 'safe' },
73
- settingAction({ id: 'account-tool-llm-enabled', label: 'Enable tool LLM', detail: 'Toggle a dedicated tool LLM for internal operations.', key: 'tools.llmEnabled' }),
74
- { id: 'account-tool-provider', label: 'Choose tool provider/model', detail: 'Open the shared provider/model picker for dedicated tool LLM calls.', kind: 'model-picker', modelPickerFlow: 'providerModel', modelPickerTarget: 'tool', visibleWhenSettingKey: 'tools.llmEnabled', visibleWhenSettingValue: true, safety: 'safe' },
75
- { id: 'account-tool-model', label: 'Choose tool model', detail: 'Open the shared model picker for dedicated tool LLM calls.', kind: 'model-picker', modelPickerFlow: 'model', modelPickerTarget: 'tool', visibleWhenSettingKey: 'tools.llmEnabled', visibleWhenSettingValue: true, safety: 'safe' },
76
- { id: 'account-tts-llm-provider', label: 'Choose spoken-turn provider/model', detail: 'Open the shared provider/model picker for spoken-response turns.', kind: 'model-picker', modelPickerFlow: 'providerModel', modelPickerTarget: 'tts', safety: 'safe' },
77
- { id: 'account-tts-llm-model', label: 'Choose spoken-turn model', detail: 'Open the shared model picker for spoken-response turns.', kind: 'model-picker', modelPickerFlow: 'model', modelPickerTarget: 'tts', safety: 'safe' },
78
63
  settingAction({ id: 'account-provider-fallback-hint', label: 'Provider failure hints', detail: 'Toggle alternative model suggestions when the current provider fails non-transiently.', key: 'behavior.suggestAlternativeOnProviderFail' }),
64
+ // Helper / tool / spoken-turn routes (advanced — only matters when you want dedicated routing)
65
+ settingAction({ id: 'account-helper-enabled', label: 'Use a dedicated helper model', detail: 'Toggle a separate route for background utility work like summaries and titling.', key: 'helper.enabled' }),
66
+ { id: 'account-helper-provider', label: 'Choose helper model', detail: 'Pick the provider and model for helper routing.', kind: 'model-picker', modelPickerFlow: 'providerModel', modelPickerTarget: 'helper', visibleWhenSettingKey: 'helper.enabled', visibleWhenSettingValue: true, safety: 'safe' },
67
+ settingAction({ id: 'account-tool-llm-enabled', label: 'Use a dedicated tool model', detail: 'Toggle a separate route for internal tool calls.', key: 'tools.llmEnabled' }),
68
+ { id: 'account-tool-provider', label: 'Choose tool model', detail: 'Pick the provider and model for dedicated tool calls.', kind: 'model-picker', modelPickerFlow: 'providerModel', modelPickerTarget: 'tool', visibleWhenSettingKey: 'tools.llmEnabled', visibleWhenSettingValue: true, safety: 'safe' },
69
+ { id: 'account-tts-llm-provider', label: 'Choose spoken-turn model', detail: 'Pick the provider and model for spoken-response turns.', kind: 'model-picker', modelPickerFlow: 'providerModel', modelPickerTarget: 'tts', safety: 'safe' },
70
+ // System prompt + custom provider plumbing
71
+ settingAction({ id: 'account-system-prompt', label: 'Custom system prompt file', detail: 'Optional local file used as the system prompt for every assistant turn.', key: 'provider.systemPromptFile' }),
72
+ { id: 'provider-remove', label: 'Remove a custom provider', detail: 'Remove one custom provider config after confirmation.', editorKind: 'provider-remove', kind: 'editor', safety: 'safe' },
73
+ { id: 'account-run-local-model-benchmark', label: 'Run a local model benchmark', detail: 'Run the confirmed local-route benchmark through blind comparison, save latency/task-fit evidence, and keep model changes separate.', editorKind: 'local-model-benchmark', kind: 'editor', safety: 'safe' },
74
+ // Prompt cache controls (advanced — most users leave defaults)
79
75
  settingAction({ id: 'account-cache-enabled', label: 'Prompt cache', detail: 'Toggle prompt caching for eligible providers.', key: 'cache.enabled' }),
80
76
  settingAction({ id: 'account-cache-ttl', label: 'Cache TTL', detail: 'Cycle ephemeral or persistent cache TTL for stable content.', key: 'cache.stableTtl', visibleWhenKey: 'cache.enabled', visibleWhenValue: true }),
81
77
  settingAction({ id: 'account-cache-monitor', label: 'Cache hit-rate monitor', detail: 'Toggle cache hit-rate monitoring.', key: 'cache.monitorHitRate', visibleWhenKey: 'cache.enabled', visibleWhenValue: true }),
@@ -103,31 +99,25 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
103
99
  id: 'tools-permissions',
104
100
  group: 'ONBOARDING',
105
101
  label: 'Tools & Permissions',
106
- summary: 'Set approval policy, MCP entry points, and secret references.',
107
- detail: 'Use this before enabling tool-heavy work. Permission rows write policy; MCP and secret rows open setup forms.',
102
+ summary: 'Set approval policy and core file/shell/network permissions.',
103
+ detail: 'Most users only need Permission mode and Auto-approve. The rest stay at safe defaults unless you change them.',
108
104
  actions: [
105
+ // Top-level approval policy
109
106
  settingAction({ id: 'permissions-mode', label: 'Permission mode', detail: 'Cycle prompt, allow-all, or custom permission mode.', key: 'permissions.mode' }),
110
107
  settingAction({ id: 'permissions-auto-approve', label: 'Auto-approve tools', detail: 'Toggle automatic approval for all tool permission requests.', key: 'behavior.autoApprove' }),
108
+ // Common per-tool overrides for file and shell work
111
109
  settingAction({ id: 'permissions-read', label: 'File reads', detail: 'Cycle allow, prompt, or deny for file read operations.', key: 'permissions.tools.read' }),
112
- settingAction({ id: 'permissions-find', label: 'File search', detail: 'Cycle allow, prompt, or deny for file and directory search operations.', key: 'permissions.tools.find' }),
113
110
  settingAction({ id: 'permissions-write', label: 'File writes', detail: 'Cycle allow, prompt, or deny for file write operations.', key: 'permissions.tools.write' }),
114
111
  settingAction({ id: 'permissions-edit', label: 'File edits', detail: 'Cycle allow, prompt, or deny for edit and patch operations.', key: 'permissions.tools.edit' }),
115
112
  settingAction({ id: 'permissions-exec', label: 'Shell commands', detail: 'Cycle allow, prompt, or deny for shell execution.', key: 'permissions.tools.exec' }),
116
113
  settingAction({ id: 'permissions-fetch', label: 'Network fetches', detail: 'Cycle allow, prompt, or deny for outbound fetch requests.', key: 'permissions.tools.fetch' }),
117
- settingAction({ id: 'permissions-analyze', label: 'Code analysis', detail: 'Cycle allow, prompt, or deny for code and project analysis operations.', key: 'permissions.tools.analyze' }),
118
- settingAction({ id: 'permissions-inspect', label: 'Runtime inspect', detail: 'Cycle allow, prompt, or deny for runtime state inspection.', key: 'permissions.tools.inspect' }),
119
- settingAction({ id: 'permissions-state', label: 'State reads', detail: 'Cycle allow, prompt, or deny for reading runtime and session state.', key: 'permissions.tools.state' }),
120
- settingAction({ id: 'permissions-registry', label: 'Registry reads', detail: 'Cycle allow, prompt, or deny for tool and skill registry queries.', key: 'permissions.tools.registry' }),
121
- settingAction({ id: 'permissions-mcp', label: 'MCP tools', detail: 'Cycle allow, prompt, or deny for external MCP tool calls.', key: 'permissions.tools.mcp' }),
122
- settingAction({ id: 'permissions-agent', label: 'Agent delegation', detail: 'Cycle allow, prompt, or deny for subagent and delegation operations.', key: 'permissions.tools.agent' }),
123
- settingAction({ id: 'permissions-workflow', label: 'Workflow automation', detail: 'Cycle allow, prompt, or deny for multi-step workflow automation.', key: 'permissions.tools.workflow' }),
124
- settingAction({ id: 'permissions-delegate', label: 'Unknown tools', detail: 'Cycle allow, prompt, or deny for unknown or unregistered tools.', key: 'permissions.tools.delegate' }),
125
- { 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' },
126
- { 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' },
127
- { 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' },
114
+ // MCP servers + secrets (forms that open inside the modal)
115
+ { id: 'onboarding-mcp-server', label: 'Add an 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' },
116
+ { id: 'onboarding-secret-link', label: 'Link a secret reference', detail: 'Link one config key to a goodvibes secret reference.', editorKind: 'secret-link', kind: 'editor', safety: 'safe' },
117
+ { id: 'onboarding-secret-test', label: 'Test a secret reference', detail: 'Check one stored secret reference without printing the value.', editorKind: 'secret-test', kind: 'editor', safety: 'safe' },
118
+ // Advanced tool runtime limits and debugging
128
119
  settingAction({ id: 'tools-auto-heal', label: 'Tool auto-heal', detail: 'Toggle automatic syntax repair for precision write and edit operations.', key: 'tools.autoHeal' }),
129
120
  settingAction({ id: 'tools-token-budget', label: 'Tool token budget', detail: 'Set the default token budget for precision read operations.', key: 'tools.defaultTokenBudget' }),
130
- settingAction({ id: 'tools-hooks-file', label: 'Hooks file', detail: 'Set the hook configuration file name relative to host data.', key: 'tools.hooksFile' }),
131
121
  settingAction({ id: 'storage-artifact-limit', label: 'Artifact storage limit', detail: 'Set the maximum artifact size for file, URL, multipart, and raw upload ingest.', key: 'storage.artifacts.maxBytes' }),
132
122
  settingAction({ id: 'telemetry-raw-prompts', label: 'Raw prompt telemetry', detail: 'Toggle raw prompt and response telemetry; leave off unless debugging locally.', key: 'telemetry.includeRawPrompts' }),
133
123
  ],
package/src/version.ts CHANGED
@@ -6,7 +6,7 @@ import { join } from 'node:path';
6
6
  // The prebuild script updates the fallback value before compilation.
7
7
  // Uses import.meta.dir (Bun) to locate package.json relative to this file,
8
8
  // which is correct regardless of the process working directory.
9
- let _version = '1.4.3';
9
+ let _version = '1.4.4';
10
10
  try {
11
11
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8')) as {
12
12
  readonly version?: unknown;