@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 +10 -0
- package/dist/package/main.js +27 -45
- package/package.json +1 -1
- package/release/release-notes.md +7 -7
- package/src/input/agent-workspace-categories.ts +23 -33
- package/src/version.ts +1 -1
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.
|
package/dist/package/main.js
CHANGED
|
@@ -817092,7 +817092,7 @@ var createStyledCell = (char, overrides = {}) => ({
|
|
|
817092
817092
|
// src/version.ts
|
|
817093
817093
|
import { readFileSync } from "fs";
|
|
817094
817094
|
import { join } from "path";
|
|
817095
|
-
var _version = "1.4.
|
|
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
|
|
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
|
|
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 ${
|
|
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 ${
|
|
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 ${
|
|
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 ${
|
|
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 ${
|
|
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> <${
|
|
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
|
|
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
|
|
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 ${
|
|
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: "
|
|
905161
|
-
detail: "Use this after sign-in.
|
|
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
|
|
905211
|
-
detail: "
|
|
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
|
-
|
|
905222
|
-
|
|
905223
|
-
|
|
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
|
+
"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",
|
package/release/release-notes.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
- v1.4.
|
|
2
|
-
-
|
|
3
|
-
-
|
|
4
|
-
-
|
|
5
|
-
-
|
|
6
|
-
- Tests covering the removed
|
|
7
|
-
- Test suite:
|
|
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: '
|
|
57
|
-
detail: 'Use this after sign-in.
|
|
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
|
|
107
|
-
detail: '
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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.
|
|
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;
|